3 #ifndef DUNE_GRIDGLUE_ADAPTER_GRIDGLUECOMMUNICATE_HH
4 #define DUNE_GRIDGLUE_ADAPTER_GRIDGLUECOMMUNICATE_HH
11 #include <dune/common/version.hh>
12 #include <dune/common/bartonnackmanifcheck.hh>
13 #include <dune/common/parallel/communicator.hh>
14 #include <dune/grid/common/datahandleif.hh>
15 #include <dune/grid/common/gridenums.hh>
22 struct GlobalId :
public std::pair<RankPair, unsigned int>
28 this->first.first = 0;
29 this->first.second = 0;
36 this->first.first = i;
37 this->first.second = i;
46 this->first.first = std::min(i,j);
47 this->first.second = std::max(i,j);
55 <<
id.first.first <<
"," <<
id.first.second <<
","
72 template <
class DataHandleImp,
class DataTypeImp>
88 template<
class RISType>
89 size_t size (RISType& i)
const
91 CHECK_INTERFACE_IMPLEMENTATION((asImp().
size(i)));
92 return asImp().size(i);
100 template<
class MessageBufferImp,
class EntityType,
class RISType>
101 void gather (MessageBufferImp& buff,
const EntityType& e,
const RISType & i)
const
103 MessageBufferIF<MessageBufferImp> buffIF(buff);
104 CHECK_AND_CALL_INTERFACE_IMPLEMENTATION((asImp().
gather(buffIF,e,i)));
114 template<
class MessageBufferImp,
class EntityType,
class RISType>
115 void scatter (MessageBufferImp& buff,
const EntityType& e,
const RISType & i,
size_t n)
117 MessageBufferIF<MessageBufferImp> buffIF(buff);
118 CHECK_AND_CALL_INTERFACE_IMPLEMENTATION((asImp().
scatter(buffIF,e,i,n)));
123 DataHandleImp& asImp () {
124 return static_cast<DataHandleImp &
> (*this);
127 const DataHandleImp& asImp ()
const
129 return static_cast<const DataHandleImp &
>(*this);
137 template<
typename DT>
154 static_assert(( is_same<DT,Y>::value ),
"DataType mismatch");
162 static_assert(( is_same<DT,Y>::value ),
"DataType mismatch");
193 template<
class CommInfo>
197 typedef typename CommInfo::GridGlue::Intersection
Intersection;
198 Intersection ris(commInfo.
gridglue->getIntersection(i));
204 if (dir == Dune::ForwardCommunication)
208 commInfo.
data->gather(commInfo.
mbuffer, ris.inside(), ris);
214 commInfo.
data->gather(commInfo.
mbuffer, ris.outside(), ris.flip());
219 assert(j < commInfo.
mbuffer.i);
220 return commInfo.
buffer[j];
223 template<
class CommInfo>
227 typedef typename CommInfo::GridGlue::Intersection
Intersection;
228 Intersection ris(commInfo.
gridglue->getIntersection(i));
243 if (dir == Dune::ForwardCommunication)
267 template <
typename GG,
class DataHandleImp,
class DataTypeImp>
283 mutable ::Dune::GridGlue::StreamingMessageBuffer<DataType>
mbuffer;
285 Dune::CommunicationDirection
dir;
295 template<
typename GG,
class DataHandleImp,
class DataTypeImp>
301 typedef ::Dune::GridGlue::CommInfo<GG, DataHandleImp, DataTypeImp>
Type;
317 static size_t getSize(
const Type& commInfo,
size_t i)
320 typedef typename Type::GridGlue::Intersection Intersection;
321 Intersection ris(commInfo.
gridglue->getIntersection(i));
324 return commInfo.
data->size(ris);
DataTypeImp DataType
Definition: gridgluecommunicate.hh:272
Dune::CommunicationDirection dir
Definition: gridgluecommunicate.hh:285
void scatter(MessageBufferImp &buff, const EntityType &e, const RISType &i, size_t n)
Definition: gridgluecommunicate.hh:115
size_t counter() const
Definition: gridgluecommunicate.hh:166
const GridGlue * gridglue
Definition: gridgluecommunicate.hh:278
CommInfo()
Definition: gridgluecommunicate.hh:274
void gather(MessageBufferImp &buff, const EntityType &e, const RISType &i) const
pack data from user to message buffer
Definition: gridgluecommunicate.hh:101
describes the features of a data handle for communication in parallel runs using the GridGlue::commun...
Definition: gridgluecommunicate.hh:73
DataTypeImp IndexedType
The datatype that should be communicated.
Definition: gridgluecommunicate.hh:306
size_t currentsize
Definition: gridgluecommunicate.hh:284
GlobalId()
Definition: gridgluecommunicate.hh:27
std::vector< DataType > buffer
Definition: gridgluecommunicate.hh:282
static void scatter(CommInfo &commInfo, const typename CommInfo::DataType &v, std::size_t i, std::size_t j=0)
Definition: gridgluecommunicate.hh:224
std::ostream & operator<<(std::ostream &os, const GlobalId &id)
Definition: gridgluecommunicate.hh:52
DataTypeImp DataType
data type of data to communicate
Definition: gridgluecommunicate.hh:77
DT * a
Definition: gridgluecommunicate.hh:178
size_t j
Definition: gridgluecommunicate.hh:180
Definition: gridglue.hh:34
::Dune::GridGlue::CommInfo< GG, DataHandleImp, DataTypeImp > Type
The type of the GridGlueCommInfo.
Definition: gridgluecommunicate.hh:301
CommDataHandle()
Definition: gridgluecommunicate.hh:81
Definition: gridgluecommunicate.hh:22
forward gather scatter to user defined CommInfo class
Definition: gridgluecommunicate.hh:190
DataTypeImp value_type
Definition: gridgluecommunicate.hh:270
DT value_type
Definition: gridgluecommunicate.hh:140
::Dune::GridGlue::CommDataHandle< DataHandleImp, DataTypeImp > * data
Definition: gridgluecommunicate.hh:279
size_t size(RISType &i) const
Definition: gridgluecommunicate.hh:89
Definition: gridgluecommunicate.hh:138
mutable::Dune::GridGlue::StreamingMessageBuffer< DataType > mbuffer
Definition: gridgluecommunicate.hh:283
CommunicationOperator< Dune::BackwardCommunication > BackwardOperator
Definition: gridgluecommunicate.hh:261
StreamingMessageBuffer(DT *p)
Definition: gridgluecommunicate.hh:143
void write(const Y &data)
Definition: gridgluecommunicate.hh:152
std::pair< int, int > RankPair
Definition: gridgluecommunicate.hh:21
GlobalId(int i)
Definition: gridgluecommunicate.hh:35
CommunicationOperator< Dune::ForwardCommunication > ForwardOperator
Definition: gridgluecommunicate.hh:260
The intersection of two entities of the two patches of a GridGlue.
Definition: gridglue.hh:51
GG GridGlue
Definition: gridgluecommunicate.hh:271
void read(Y &data) const
Definition: gridgluecommunicate.hh:160
GlobalId(int i, int j, unsigned int n)
Definition: gridgluecommunicate.hh:45
size_t i
Definition: gridgluecommunicate.hh:179
static const CommInfo::DataType & gather(const CommInfo &commInfo, size_t i, size_t j=0)
Definition: gridgluecommunicate.hh:194
VariableSize IndexedTypeFlag
Each intersection can communicate a different number of objects.
Definition: gridgluecommunicate.hh:312
static size_t getSize(const Type &commInfo, size_t i)
Get the number of objects at an intersection.
Definition: gridgluecommunicate.hh:317
void clear()
Definition: gridgluecommunicate.hh:168
collects all GridGlue data requried for communication
Definition: gridgluecommunicate.hh:268