5 #ifndef DUNE_GRIDGLUE_ADAPTER_GRIDGLUECOMMUNICATE_HH
6 #define DUNE_GRIDGLUE_ADAPTER_GRIDGLUECOMMUNICATE_HH
13 #include <type_traits>
15 #include <dune/common/bartonnackmanifcheck.hh>
16 #include <dune/common/parallel/communicator.hh>
17 #include <dune/grid/common/datahandleif.hh>
18 #include <dune/grid/common/gridenums.hh>
25 struct GlobalId :
public std::pair<RankPair, unsigned int>
31 this->first.first = 0;
32 this->first.second = 0;
39 this->first.first = i;
40 this->first.second = i;
49 this->first.first = std::min(i,j);
50 this->first.second = std::max(i,j);
58 <<
id.first.first <<
"," <<
id.first.second <<
","
75 template <
class DataHandleImp,
class DataTypeImp>
91 template<
class RISType>
92 size_t size (RISType& i)
const
94 CHECK_INTERFACE_IMPLEMENTATION((asImp().
size(i)));
95 return asImp().size(i);
103 template<
class MessageBufferImp,
class EntityType,
class RISType>
104 void gather (MessageBufferImp& buff,
const EntityType& e,
const RISType & i)
const
106 MessageBufferIF<MessageBufferImp> buffIF(buff);
107 CHECK_AND_CALL_INTERFACE_IMPLEMENTATION((asImp().
gather(buffIF,e,i)));
117 template<
class MessageBufferImp,
class EntityType,
class RISType>
118 void scatter (MessageBufferImp& buff,
const EntityType& e,
const RISType & i,
size_t n)
120 MessageBufferIF<MessageBufferImp> buffIF(buff);
121 CHECK_AND_CALL_INTERFACE_IMPLEMENTATION((asImp().
scatter(buffIF,e,i,n)));
126 DataHandleImp& asImp () {
127 return static_cast<DataHandleImp &
> (*this);
130 const DataHandleImp& asImp ()
const
132 return static_cast<const DataHandleImp &
>(*this);
140 template<
typename DT>
157 static_assert(std::is_same<DT,Y>::value,
"DataType mismatch");
165 static_assert(std::is_same<DT,Y>::value,
"DataType mismatch");
196 template<
class CommInfo>
200 typedef typename CommInfo::GridGlue::Intersection
Intersection;
207 if (dir == Dune::ForwardCommunication)
223 return commInfo.
buffer[j];
226 template<
class CommInfo>
230 typedef typename CommInfo::GridGlue::Intersection
Intersection;
246 if (dir == Dune::ForwardCommunication)
270 template <
typename GG,
class DataHandleImp,
class DataTypeImp>
286 mutable ::Dune::GridGlue::StreamingMessageBuffer<DataType>
mbuffer;
288 Dune::CommunicationDirection
dir;
298 template<
typename GG,
class DataHandleImp,
class DataTypeImp>
304 typedef ::Dune::GridGlue::CommInfo<GG, DataHandleImp, DataTypeImp>
Type;
323 typedef typename Type::GridGlue::Intersection Intersection;
324 Intersection ris(commInfo.
gridglue->getIntersection(i));
327 return commInfo.
data->size(ris);
Definition: gridglue.hh:37
std::ostream & operator<<(std::ostream &os, const GlobalId &id)
Definition: gridgluecommunicate.hh:55
CommunicationOperator< Dune::BackwardCommunication > BackwardOperator
Definition: gridgluecommunicate.hh:264
CommunicationOperator< Dune::ForwardCommunication > ForwardOperator
Definition: gridgluecommunicate.hh:263
std::pair< int, int > RankPair
Definition: gridgluecommunicate.hh:24
The intersection of two entities of the two patches of a GridGlue.
Definition: intersection.hh:261
Intersection< P0, P1, O, I > flip() const
Return a copy of the intersection with inside and outside switched.
Definition: intersection.hh:483
bool self() const
For parallel computations: Return true if inside() entity exists locally.
Definition: intersection.hh:393
InsideEntity inside(unsigned int parentId=0) const
Return element on the inside of this intersection.
Definition: intersection.hh:319
size_t neighbor(unsigned int g=0) const
Return number of embeddings into local grid0 (grid1) entities.
Definition: intersection.hh:399
OutsideEntity outside(unsigned int parentId=0) const
Return element on the outside of this intersection.
Definition: intersection.hh:328
Definition: gridgluecommunicate.hh:26
GlobalId(int i)
Definition: gridgluecommunicate.hh:38
GlobalId()
Definition: gridgluecommunicate.hh:30
GlobalId(int i, int j, unsigned int n)
Definition: gridgluecommunicate.hh:48
describes the features of a data handle for communication in parallel runs using the GridGlue::commun...
Definition: gridgluecommunicate.hh:77
size_t size(RISType &i) const
Definition: gridgluecommunicate.hh:92
void scatter(MessageBufferImp &buff, const EntityType &e, const RISType &i, size_t n)
Definition: gridgluecommunicate.hh:118
void gather(MessageBufferImp &buff, const EntityType &e, const RISType &i) const
pack data from user to message buffer
Definition: gridgluecommunicate.hh:104
DataTypeImp DataType
data type of data to communicate
Definition: gridgluecommunicate.hh:80
CommDataHandle()
Definition: gridgluecommunicate.hh:84
Definition: gridgluecommunicate.hh:141
size_t j
Definition: gridgluecommunicate.hh:183
StreamingMessageBuffer(DT *p)
Definition: gridgluecommunicate.hh:146
DT * a
Definition: gridgluecommunicate.hh:181
size_t counter() const
Definition: gridgluecommunicate.hh:169
void write(const Y &data)
Definition: gridgluecommunicate.hh:155
void read(Y &data) const
Definition: gridgluecommunicate.hh:163
DT value_type
Definition: gridgluecommunicate.hh:143
size_t i
Definition: gridgluecommunicate.hh:182
void clear()
Definition: gridgluecommunicate.hh:171
forward gather scatter to user defined CommInfo class
Definition: gridgluecommunicate.hh:194
static void scatter(CommInfo &commInfo, const typename CommInfo::DataType &v, std::size_t i, std::size_t j=0)
Definition: gridgluecommunicate.hh:227
static const CommInfo::DataType & gather(const CommInfo &commInfo, size_t i, size_t j=0)
Definition: gridgluecommunicate.hh:197
collects all GridGlue data requried for communication
Definition: gridgluecommunicate.hh:272
Dune::CommunicationDirection dir
Definition: gridgluecommunicate.hh:288
DataTypeImp value_type
Definition: gridgluecommunicate.hh:273
DataTypeImp DataType
Definition: gridgluecommunicate.hh:275
::Dune::GridGlue::CommDataHandle< DataHandleImp, DataTypeImp > * data
Definition: gridgluecommunicate.hh:282
GG GridGlue
Definition: gridgluecommunicate.hh:274
size_t currentsize
Definition: gridgluecommunicate.hh:287
CommInfo()
Definition: gridgluecommunicate.hh:277
mutable ::Dune::GridGlue::StreamingMessageBuffer< DataType > mbuffer
Definition: gridgluecommunicate.hh:286
const GridGlue * gridglue
Definition: gridgluecommunicate.hh:281
std::vector< DataType > buffer
Definition: gridgluecommunicate.hh:285
static size_t getSize(const Type &commInfo, size_t i)
Get the number of objects at an intersection.
Definition: gridgluecommunicate.hh:320
DataTypeImp IndexedType
The datatype that should be communicated.
Definition: gridgluecommunicate.hh:309
::Dune::GridGlue::CommInfo< GG, DataHandleImp, DataTypeImp > Type
The type of the GridGlueCommInfo.
Definition: gridgluecommunicate.hh:304
VariableSize IndexedTypeFlag
Each intersection can communicate a different number of objects.
Definition: gridgluecommunicate.hh:315