1#ifndef DUNE_FEM_COMMOPERATIONS_HH
2#define DUNE_FEM_COMMOPERATIONS_HH
8#include <dune/common/hybridutilities.hh>
9#include <dune/grid/common/datahandleif.hh>
24 template<
class... DataHandle >
27 template<
class DataHandle >
30 typedef typename DataHandle::DataType
Type;
33 template<
class DataHandle,
class... Tail >
36 typedef typename DataHandle::DataType
Type;
37 static_assert( std::is_same<
Type,
typename CombinedDataType< Tail... >::Type >::value,
"Only data handles for the same data type can be combined." );
48 template<
class... DataHandle >
50 :
public CommDataHandleIF< CombinedDataHandle< DataHandle... >, typename CombinedDataType< DataHandle... >::Type >
52 typedef std::tuple< DataHandle... > DataHandlerTupleType;
53 static constexpr std::size_t tupleSize = std::tuple_size< DataHandlerTupleType >::value;
70 [ & ](
auto i ){ value = ( value || std::get< i >( data_ ).contains( dim, codim ) ); } );
78 [ & ](
auto i ){ value = ( value && std::get< i >( data_ ).fixedSize( dim, codim ) ); } );
84 template<
class MessageBufferImp,
class EntityType>
85 void gather (MessageBufferImp& buff,
const EntityType& en)
const
87 Hybrid::forEach( std::make_index_sequence< tupleSize >{}, [ & ](
auto i ){ std::get< i >( data_ ).gather( buff, en ); } );
92 template<
class MessageBufferImp,
class EntityType>
93 void scatter (MessageBufferImp& buff,
const EntityType& en, std::size_t n)
95 Hybrid::forEach( std::make_index_sequence< tupleSize >{}, [ & ](
auto i ){ std::get< i >( data_ ).scatter( buff, en, n ); } );
100 template<
class EntityType>
101 std::size_t
size (
const EntityType& en)
const
103 std::size_t value( 0 );
104 Hybrid::forEach( std::make_index_sequence< tupleSize >{}, [ & ](
auto i ){ value += std::get< i >( data_ ).size( en ); } );
109 DataHandlerTupleType data_;
134 template <
class DataType>
135 inline void operator () (
const DataType & arg, DataType & dest)
const
151 template <
class DataType>
152 inline void operator () (
const DataType & arg, DataType & dest)
const
167 template <
class DataType>
168 inline void operator () (
const DataType & arg, DataType & dest)
const
183 template <
class DataType>
184 inline void operator () (
const DataType & arg, DataType & dest)
const
199 template <
class DataType>
200 inline void operator () (
const DataType & arg, DataType & dest)
const
214 template <
class DiscreteFunction>
219 typedef typename DiscreteFunctionType :: DiscreteFunctionSpaceType :: IteratorType :: Entity
Entity;
225 return entity.isLeaf();
static const char * name()
Definition: commoperations.hh:194
LoadBalanceLeafData(const DiscreteFunctionType &df)
Definition: commoperations.hh:221
CombinedDataHandle(const std::tuple< DataHandle... > &data)
Definition: commoperations.hh:62
DiscreteFunctionType::DiscreteFunctionSpaceType::IteratorType::Entity Entity
Definition: commoperations.hh:219
DiscreteFunction DiscreteFunctionType
Definition: commoperations.hh:218
static const dfCommunicationOperation value
Definition: commoperations.hh:177
void operator()(const DataType &arg, DataType &dest) const
Definition: commoperations.hh:200
void operator()(const DataType &arg, DataType &dest) const
Definition: commoperations.hh:152
dfCommunicationOperation
Definition: commoperations.hh:123
std::size_t size(const EntityType &en) const
loop over all internal data handlers and return sum of data size of given entity
Definition: commoperations.hh:101
void gather(MessageBufferImp &buff, const EntityType &en) const
loop over all internal data handlers and call gather for given entity
Definition: commoperations.hh:85
static const char * name()
Definition: commoperations.hh:129
void scatter(MessageBufferImp &buff, const EntityType &en, std::size_t n)
loop over all internal data handlers and call scatter for given entity
Definition: commoperations.hh:93
static const char * name()
Definition: commoperations.hh:162
void operator()(const DataType &arg, DataType &dest) const
Definition: commoperations.hh:168
bool fixedSize(int dim, int codim) const
Definition: commoperations.hh:74
static const dfCommunicationOperation value
Definition: commoperations.hh:193
static const char * name()
Definition: commoperations.hh:146
DataHandle::DataType Type
Definition: commoperations.hh:36
CombinedDataType< DataHandle... >::Type DataType
Definition: commoperations.hh:56
void operator()(const DataType &arg, DataType &dest) const
Definition: commoperations.hh:135
static const dfCommunicationOperation value
Definition: commoperations.hh:145
static const dfCommunicationOperation value
Definition: commoperations.hh:161
bool contains(int dim, int codim) const
Definition: commoperations.hh:66
void operator()(const DataType &arg, DataType &dest) const
Definition: commoperations.hh:184
CombinedDataHandle(const DataHandle &... handle)
Definition: commoperations.hh:58
static const char * name()
Definition: commoperations.hh:178
DataHandle::DataType Type
Definition: commoperations.hh:30
static const dfCommunicationOperation value
Definition: commoperations.hh:128
bool contains(const Entity &entity) const
return true if the data of this entity should be transfered during load balance
Definition: commoperations.hh:223
@ sub
Definition: commoperations.hh:123
@ copy
Definition: commoperations.hh:123
@ max
Definition: commoperations.hh:123
@ min
Definition: commoperations.hh:123
@ add
Definition: commoperations.hh:123
double max(const Dune::Fem::Double &v, const double p)
Definition: double.hh:965
double min(const Dune::Fem::Double &v, const double p)
Definition: double.hh:953
Definition: bindguard.hh:11
static void forEach(IndexRange< T, sz > range, F &&f)
Definition: hybrid.hh:129
Definition: commoperations.hh:25
combine multiple data handles into one
Definition: commoperations.hh:51
Mathematical operation apply during communication to data that is communicated enum of all avialable ...
Definition: commoperations.hh:122
just copy data
Definition: commoperations.hh:127
sum up data
Definition: commoperations.hh:144
substract data
Definition: commoperations.hh:160
keep minimum
Definition: commoperations.hh:176
keep maximum
Definition: commoperations.hh:192
check for sets of entities for the load balance procedure
Definition: commoperations.hh:216