1#pragma GCC diagnostic ignored "-Wattributes"
2#ifndef DUNE_MMESH_MISC_COMMUNICATION_HH
3#define DUNE_MMESH_MISC_COMMUNICATION_HH
16template <
class Gr
id,
class MMeshType>
36 : partitionHelper_(partitionHelper), tag_(0) {}
38 template <
class PackIterator,
class UnpackIterator,
class DataHandleImp>
39 void operator()(
const PackIterator packBegin,
const PackIterator packEnd,
40 const UnpackIterator unpackBegin,
41 const UnpackIterator unpackEnd, DataHandleImp &dataHandle,
43 const bool packAll)
const {
49 recvBuffers(links.
size());
50 for (
int link = 0; link < links.
size(); ++link) {
51 sendBuffers[link].clear();
52 recvBuffers[link].
clear();
56 for (PackIterator it = packBegin; it != packEnd; ++it) {
57 const typename PackIterator::Entity &
entity = *it;
58 if (
entity.partitionType() == sendType &&
62 PackData<codim>::apply(links, partitionHelper_, dataHandle,
70 for (UnpackIterator it = unpackBegin; it != unpackEnd; ++it) {
71 const typename UnpackIterator::Entity &
entity = *it;
72 if (
entity.partitionType() == recvType &&
76 PackData<codim>::apply(links, partitionHelper_, dataHandle,
84 const auto &comm = partitionHelper_.
comm();
85 MPI_Request sendRequests[links.
size()];
86 for (
int link = 0; link < links.
size(); ++link) {
87 BufferType &buf = sendBuffers[link];
88 int dest = links[link];
89 MPI_Request &request = sendRequests[link];
90 MPI_Isend(buf._buf, buf._wb, MPI_BYTE, dest, tag_, comm, &request);
96 MPI_Request recvRequests[links.
size()];
97 while (count < links.
size()) {
98 for (
int link = 0; link < links.
size(); ++link) {
99 if (received[link])
continue;
101 int source = links[link];
105 MPI_Iprobe(source, tag_, comm, &available, &status);
109 MPI_Get_count(&status, MPI_BYTE, &bufferSize);
111 BufferType &buf = recvBuffers[link];
115 MPI_Request &request = recvRequests[link];
116 MPI_Irecv(buf._buf, bufferSize, MPI_BYTE, source, tag_, comm,
118 buf.seekp(bufferSize);
121 received[link] =
true;
126 MPI_Waitall(links.
size(), sendRequests, MPI_STATUSES_IGNORE);
127 MPI_Waitall(links.
size(), recvRequests, MPI_STATUSES_IGNORE);
130 for (UnpackIterator it = unpackBegin; it != unpackEnd; ++it) {
131 const typename UnpackIterator::Entity &
entity = *it;
132 if (
entity.partitionType() == recvType &&
136 UnpackData<codim>::apply(links, partitionHelper_, dataHandle,
144 for (PackIterator it = packBegin; it != packEnd; ++it) {
145 const typename PackIterator::Entity &
entity = *it;
146 if (
entity.partitionType() == sendType &&
150 UnpackData<codim>::apply(links, partitionHelper_, dataHandle,
158 if (tag_ < 0) tag_ = 0;
162 const PartitionHelperType &partitionHelper_;
169template <
class Gr
id,
class MMeshType>
171struct MMeshCommunication<Grid, MMeshType>::PackData {
172 typedef typename Grid::template Codim<0>::Entity
Element;
174 typedef typename Grid::template Codim<codim>::Entity
Entity;
176 template <
class DataHandleIF,
class BufferType>
177 static void apply(
const Links &links,
178 const PartitionHelperType &partitionHelper,
182 if (!dataHandle.contains(
dimension, codim))
return;
184 const auto &connectivity = partitionHelper.connectivity(element);
186 const int numSubEntities = element.subEntities(codim);
187 for (
int subEntity = 0; subEntity < numSubEntities; ++subEntity) {
189 const Entity &
entity = element.template subEntity<codim>(subEntity);
191 for (
int link = 0; link < links.size(); ++link) {
193 if (connectivity.count(links[link]) > 0 ||
194 links[link] == partitionHelper.rank(element)) {
198 buffer[link].write(
size);
201 dataHandle.gather(buffer[link],
entity);
211template <
class Gr
id,
class MMeshType>
213struct MMeshCommunication<Grid, MMeshType>::UnpackData {
214 using Element =
typename Grid::template Codim<0>::Entity;
216 template <
class DataHandleIF,
class BufferType>
217 static void apply(
const Links &links,
218 const PartitionHelperType &partitionHelper,
222 if (!dataHandle.contains(
dimension, codim))
return;
224 const auto &connectivity = partitionHelper.connectivity(element);
227 const int numSubEntities = element.subEntities(codim);
228 for (
int subEntity = 0; subEntity < numSubEntities; ++subEntity) {
230 const auto &
entity = element.template subEntity<codim>(subEntity);
232 for (
int link = 0; link < links.size(); ++link) {
234 if (links[link] == partitionHelper.rank(element) ||
235 connectivity.count(links[link]) > 0) {
238 buffer[link].read(
size);
241 dataHandle.scatter(buffer[link],
entity,
size);
constexpr void forEach(Range &&range, F &&f)
@ Element
Definition curvatureoperator.hh:22
const EntityType & entity() const
GridImp::template Codim< cd >::Entity Entity
Definition communication.hh:17
void operator()(const PackIterator packBegin, const PackIterator packEnd, const UnpackIterator unpackBegin, const UnpackIterator unpackEnd, DataHandleImp &dataHandle, const PartitionType sendType, const PartitionType recvType, const bool packAll) const
Definition communication.hh:39
MMeshCommunication(const PartitionHelperType &partitionHelper)
Definition communication.hh:35
static const int dimension
Definition communication.hh:33
Definition objectstream.hh:34
Definition partitionhelper.hh:13
auto & comm() const
Definition partitionhelper.hh:85
ConnectivityType connectivity(const Entity &e) const
Get connectivity (list of ranks)
Definition partitionhelper.hh:89
const LinksType & links() const
List of connected ranks.
Definition partitionhelper.hh:83