11 #ifndef vtk_m_filter_flow_internal_AdvectAlgorithmTerminator_h
12 #define vtk_m_filter_flow_internal_AdvectAlgorithmTerminator_h
52 class AdvectAlgorithmTerminator
55 #ifdef VTKM_ENABLE_MPI
56 AdvectAlgorithmTerminator(vtkmdiy::mpi::communicator& comm)
60 , MPIComm(vtkmdiy::mpi::mpi_cast(comm.handle()))
64 AdvectAlgorithmTerminator(vtkmdiy::mpi::communicator&
vtkmNotUsed(comm))
68 this->FirstCall =
true;
73 #ifdef VTKM_ENABLE_MPI
74 return this->State == AdvectAlgorithmTerminatorState::DONE;
76 return !this->HaveWork;
80 void Control(
bool haveLocalWork)
82 #ifdef VTKM_ENABLE_MPI
86 this->FirstCall =
false;
92 if (this->State == STATE_0 && !haveLocalWork)
96 MPI_Ibarrier(this->MPIComm, &this->StateReq);
98 this->State = STATE_1;
100 else if (this->State == STATE_1)
104 MPI_Test(&this->StateReq, &flag, &status);
107 this->LocalDirty = this->Dirty;
109 &this->LocalDirty, &this->AllDirty, 1, MPI_INT, MPI_LOR, this->MPIComm, &this->StateReq);
110 this->State = STATE_2;
113 else if (this->State == STATE_2)
117 MPI_Test(&this->StateReq, &flag, &status);
122 if (this->AllDirty == 0)
125 this->State = STATE_0;
129 this->HaveWork = haveLocalWork;
136 #ifdef VTKM_ENABLE_MPI
137 enum AdvectAlgorithmTerminatorState
147 std::atomic<int> Dirty;
149 std::atomic<int> LocalWork;
152 AdvectAlgorithmTerminatorState State = AdvectAlgorithmTerminatorState::STATE_0;
153 MPI_Request StateReq;
165 #endif //vtk_m_filter_flow_internal_AdvectAlgorithmTerminator_h