11 "RefinementControlService"));
44 const int rank = status.MPI_SOURCE;
48 logDebug(
"receiveDanglingMessages()",
"got " << numberOfMessages <<
" event(s) from rank " << rank);
50 std::vector<peano4::grid::GridControlEvent> receiveBuffer;
51 receiveBuffer.resize(numberOfMessages);
62 for (
auto p : receiveBuffer) {
63 _remoteNewEvents.push_back(p);
64 _committedEvents.push_back(p);
68 "receiveDanglingMessages()",
70 << _remoteNewEvents.size() <<
" new remote events and " << _committedEvents.size()
71 <<
" committed events (valid for this traversal)"
79 std::ostringstream msg;
82 <<
"#new-local-events=" << _localNewEvents.size() <<
"#new-remote-events=" << _remoteNewEvents.size()
83 <<
",#committed-events=" << _committedEvents.size() <<
")";
89 _localNewEvents.insert(_localNewEvents.end(), control.
_newEvents.begin(), control.
_newEvents.end());
95 _committedEvents.clear();
98 RefinementControl::NewEvents::iterator p = _localNewEvents.begin();
99 while (p != _localNewEvents.end()) {
100 _committedEvents.push_back(p->first);
103 if (p->second <= 0) {
104 p = _localNewEvents.erase(p);
106 maxLifetime = std::max(maxLifetime, p->second);
111 if (not _committedEvents.empty()) {
115 << _committedEvents.size()
116 <<
" refinement/erase instructions (can be taken into account in next grid sweep). Keep "
117 << _localNewEvents.size() <<
" local event(s) to be re-delivered later (max lifetime " << maxLifetime
118 <<
") besides the " << _remoteNewEvents.size() <<
" remote events which will also be re-delivered next"
123 freeAllPendingSendRequests();
124 _copyOfCommittedEvents = _committedEvents;
125 triggerSendOfCopyOfCommittedEvents();
128 for (
auto p : _remoteNewEvents) {
129 _committedEvents.push_back(p);
131 _remoteNewEvents.clear();
138 while (not _sendRequests.empty()) {
139 std::vector<MPI_Request*>::iterator p = _sendRequests.begin();
140 while (p != _sendRequests.end()) {
142 p = _sendRequests.erase(p);
145 MPI_Test(*p, &flag, MPI_STATUS_IGNORE);
157 _sendRequests.clear();
160 "triggerSendOfCopyOfCommittedEvents()",
"share my " << _copyOfCommittedEvents.size() <<
" event(s) with others"
162 if (_copyOfCommittedEvents.size() > 0) {
166 _sendRequests[rank] =
new MPI_Request;
168 _copyOfCommittedEvents.data(),
169 _copyOfCommittedEvents.size(),
183 return _committedEvents;
#define logDebug(methodName, logMacroMessageStream)
#define logInfo(methodName, logMacroMessageStream)
Wrapper macro around tarch::tarch::logging::Log to improve logging.
virtual void receiveDanglingMessages() override
Receive refinement control messages as shared by other ranks.
void triggerSendOfCopyOfCommittedEvents()
void merge(const RefinementControl &control)
static tarch::multicore::RecursiveSemaphore _semaphore
static RefinementControlService & getInstance()
std::vector< peano4::grid::GridControlEvent > getGridControlEvents() const
virtual ~RefinementControlService()
RefinementControlService()
void freeAllPendingSendRequests()
Complete pending sends from previous mesh traversal.
static int _reductionTag
I need a tag of my own to exchange control info after each step.
void finishStep()
Should be called after each traversal per rank.
static tarch::logging::Log _log
virtual void shutdown() override
std::string toString() const
Manage refine/erase requests within ExaHyPE 2.
NewEvents _newEvents
Container to accumulate new events.
int getNumberOfRanks() const
static Rank & getInstance()
This operation returns the singleton instance.
int getRank() const
Return rank of this node.
static int reserveFreeTag(const std::string &fullQualifiedMessageName, int numberOfTags=1)
Return a Free Tag.
MPI_Comm getCommunicator() const
Create a lock around a boolean semaphore region.
virtual void receiveDanglingMessages() override
Answer to MPI Messages.
static ServiceRepository & getInstance()
void removeService(Service *const service)
This routine is thread-safe, i.e.
void addService(Service *const service, const std::string &name)
Add a new service.
std::vector< GridControlEvent > merge(std::vector< GridControlEvent > events, const double Tolerance=0.1)
Merge set of refinement/coarsening commands.
static MPI_Datatype getGlobalCommunciationDatatype()