24#ifndef SUPER_COMMUNICATION_TAG_COORDINATOR_HH
25#define SUPER_COMMUNICATION_TAG_COORDINATOR_HH
34#ifdef PARALLEL_MODE_MPI
44 _iC(util::min(iC,jC)),
45 _jC(util::max(iC,jC)) { }
56 || (_iC == rhs._iC && _jC < rhs._jC);
63 _loadBalancer(loadBalancer) { }
70 for (
int iC = 0; iC < _loadBalancer.size(); ++iC) {
71 neighborhood[iC]->forNeighbors([&](
int jC) {
72 if (!_loadBalancer.isLocal(jC)) {
73 _tags[_loadBalancer.rank(jC)][{_loadBalancer.glob(iC),jC}] = -1;
78 for (
auto& [rank, tags] : _tags) {
80 for (
auto tag=tags.begin(); tag != tags.end(); ++tag, ++i) {
89 if (_loadBalancer.isLocal(iC) && _loadBalancer.isLocal(jC)) {
90 return iGroup*_loadBalancer.size()*_loadBalancer.size()
91 + _loadBalancer.loc(iC)*_loadBalancer.size() + _loadBalancer.loc(jC);
93 int kC = _loadBalancer.isLocal(iC) ? jC : iC;
94 auto& tags = _tags[_loadBalancer.rank(kC)];
95 return iGroup*tags.size() + tags[{iC,jC}];
Configurable overlap communication neighborhood of a block.
Base class for all LoadBalancer.
bool operator==(const ChannelId &rhs) const
bool operator<(const ChannelId &rhs) const
ChannelId(int iC, int jC)
Communication-free negotation of unique tags for inter-cuboid communication.
void coordinate(std::vector< std::unique_ptr< BlockCommunicationNeighborhood< T, D > > > &neighborhood)
Generate unique tags for given block neighborhood system.
SuperCommunicationTagCoordinator(LoadBalancer< T > &loadBalancer)
int get(int iC, int jC, int iGroup=0)
Returns unique tag for communication between cuboids iC and jC.
Top level namespace for all of OpenLB.