1 #ifndef DUNE_FEM_COMMUNICATION_MANAGER_HH
2 #define DUNE_FEM_COMMUNICATION_MANAGER_HH
9 #include <dune/common/timer.hh>
10 #include <dune/grid/common/datahandleif.hh>
11 #include <dune/grid/common/grid.hh>
20 #include <dune/alugrid/3d/alugrid.hh>
24 #ifndef WANT_CACHED_COMM_MANAGER
25 #define WANT_CACHED_COMM_MANAGER 1
28 #if ALU3DGRID_PARALLEL && WANT_CACHED_COMM_MANAGER
29 #define USE_CACHED_COMM_MANAGER
33 #ifdef DUNE_DEVEL_MODE
34 #warning "HAVE_MPI == 0, therefore default CommunicationManager is used!"
36 #elif !ALU3DGRID_PARALLEL
37 #warning "No Parallel ALUGrid found, using default CommunicationManager!"
38 #elif ! WANT_CACHED_COMM_MANAGER
39 #warning "CachedCommunication Manager disabled by WANT_CACHED_COMM_MANAGER=0!"
44 #undef WANT_CACHED_COMM_MANAGER
46 #ifdef USE_CACHED_COMM_MANAGER
59 template<
class DiscreteFunctionSpace >
60 class PetscDiscreteFunction;
62 class IsDiscreteFunction;
75 template<
class Space >
90 const InterfaceType interface_;
91 const CommunicationDirection dir_;
95 InterfaceType interface,
96 CommunicationDirection dir )
98 interface_( interface ),
103 template <
class DiscreteFunction >
104 void send(
const DiscreteFunction& discreteFunction )
111 template <
class DiscreteFunctionSpace,
class Operation >
113 const Operation& operation )
116 Dune::Timer exchangeT;
119 discreteFunction.communicate();
121 return exchangeT.elapsed();
125 template <
class DiscreteFunction,
class Operation >
126 double receive( DiscreteFunction& discreteFunction,
const Operation& operation )
129 typedef typename DiscreteFunction
130 :: template CommDataHandle< Operation > :: Type
134 if( space_.gridPart().comm().size() <= 1 )
138 Dune::Timer exchangeT;
141 DataHandleType dataHandle = discreteFunction.dataHandle( operation );
142 space_.gridPart().communicate( dataHandle, interface_ , dir_ );
145 return exchangeT.elapsed();
149 template <
class DiscreteFunction >
150 double receive( DiscreteFunction& discreteFunction )
153 typedef typename DiscreteFunction :: DiscreteFunctionSpaceType
154 :: template CommDataHandle< DiscreteFunction > :: OperationType DefaultOperationType;
155 DefaultOperationType operation;
156 return receive( discreteFunction, operation );
164 const CommunicationDirection
dir_;
174 const InterfaceType interface,
175 const CommunicationDirection dir)
220 template<
class DiscreteFunction >
221 inline void exchange ( DiscreteFunction &discreteFunction )
const
224 typedef typename DiscreteFunction :: DiscreteFunctionSpaceType ::
225 template CommDataHandle< DiscreteFunction > :: OperationType DefaultOperationType;
227 DefaultOperationType operation;
228 exchange( discreteFunction, operation );
239 template<
class DiscreteFunction,
class Operation >
240 inline void exchange ( DiscreteFunction &discreteFunction,
241 const Operation &operation )
const
244 if(
space_.gridPart().comm().size() <= 1 )
250 nbc.send( discreteFunction );
258 #ifndef USE_CACHED_COMM_MANAGER
261 template <
class SpaceImp>
270 const InterfaceType interface,
271 const CommunicationDirection dir)
288 class DiscreteFunctionCommunicatorInterface
299 template <
class DiscreteFunctionImp,
class Operation>
300 class DiscreteFunctionCommunicator
301 :
public DiscreteFunctionCommunicatorInterface
303 typedef DiscreteFunctionImp DiscreteFunctionType;
304 typedef typename DiscreteFunctionType :: DiscreteFunctionSpaceType DiscreteFunctionSpaceType;
308 DiscreteFunctionType& df_;
309 CommunicationManagerType comm_;
310 const Operation& operation_;
315 : df_(df), comm_(df_.space()), operation_( op )
322 comm_.exchange( df_, operation_ );
328 typedef DiscreteFunctionCommunicatorInterface CommObjIFType;
329 typedef std::list < std::unique_ptr< DiscreteFunctionCommunicatorInterface > > CommObjListType;
330 CommObjListType objList_;
337 template <
class CombinedObjectType>
340 cObj.addToList(*
this);
344 template <
class DiscreteFunctionImp,
class Operation>
345 void addToList(DiscreteFunctionImp &df,
const Operation& operation )
347 typedef DiscreteFunctionCommunicator<DiscreteFunctionImp, Operation> CommObjType;
348 CommObjType* obj =
new CommObjType( df, operation );
349 objList_.push_back( std::unique_ptr< DiscreteFunctionCommunicatorInterface> (obj) );
353 template <
class DiscreteFunctionImp>
360 template<
class DiscreteFunction >
363 const auto handles = [ &df ] (
const std::unique_ptr< DiscreteFunctionCommunicatorInterface > &commObj ) {
return commObj->handles( df ); };
364 CommObjListType::reverse_iterator pos = std::find_if( objList_.rbegin(), objList_.rend(), handles );
365 if( pos != objList_.rend() )
366 objList_.erase( --pos.base() );
368 DUNE_THROW( RangeError,
"Trying to remove discrete function that was never added" );
375 typedef CommObjListType :: const_iterator iterator;
377 iterator end = objList_.end();
378 for(iterator it = objList_.begin(); it != end; ++it)
const SpaceType & space_
Definition: communicationmanager.hh:161
double buildTime() const
return time needed for last build
Definition: communicationmanager.hh:199
DefaultCommunicationManager(const DefaultCommunicationManager &)=delete
InterfaceType communicationInterface() const
return communication interface
Definition: communicationmanager.hh:185
DefaultCommunicationManager< Space > ThisType
Definition: communicationmanager.hh:82
double receive(DiscreteFunction &discreteFunction, const Operation &operation)
receive data for discrete function and given operation
Definition: communicationmanager.hh:126
virtual bool handles(IsDiscreteFunction &df) const =0
DiscreteFunctionCommunicatorInterface()=default
void exchange() const
Definition: communicationmanager.hh:320
Space SpaceType
Definition: communicationmanager.hh:79
double exchangeTime_
Definition: communicationmanager.hh:166
DefaultCommunicationManager(const SpaceType &space, const InterfaceType interface, const CommunicationDirection dir)
constructor taking space and communication interface/direction
Definition: communicationmanager.hh:173
CommunicationManager(const SpaceImp &space)
constructor taking space
Definition: communicationmanager.hh:275
NonBlockingCommunication(const SpaceType &space, InterfaceType interface, CommunicationDirection dir)
Definition: communicationmanager.hh:94
const InterfaceType interface_
Definition: communicationmanager.hh:163
void exchange() const
Definition: communicationmanager.hh:373
void exchange(DiscreteFunction &discreteFunction) const
exchange data for a discrete function using the copy operation
Definition: communicationmanager.hh:221
CommunicationDirection communicationDirection() const
return communication direction
Definition: communicationmanager.hh:190
NonBlockingCommunication NonBlockingCommunicationType
Definition: communicationmanager.hh:169
CommunicationManagerList(CombinedObjectType &cObj)
constructor
Definition: communicationmanager.hh:338
NonBlockingCommunicationType nonBlockingCommunication() const
return object for non-blocking communication
Definition: communicationmanager.hh:211
bool handles(IsDiscreteFunction &df) const
Definition: communicationmanager.hh:325
void send(const DiscreteFunction &discreteFunction)
send data for given discrete function
Definition: communicationmanager.hh:104
void exchange(DiscreteFunction &discreteFunction, const Operation &operation) const
exchange data for a discrete function using the given operation
Definition: communicationmanager.hh:240
DiscreteFunctionCommunicator(DiscreteFunctionType &df, const Operation &op)
constructor taking disctete function
Definition: communicationmanager.hh:314
double exchangeTime() const
return time needed for last exchange of data
Definition: communicationmanager.hh:205
double receive(DiscreteFunction &discreteFunction)
receive method with default operation
Definition: communicationmanager.hh:150
const CommunicationDirection dir_
Definition: communicationmanager.hh:164
CommunicationManager(const SpaceImp &space, const InterfaceType interface, const CommunicationDirection dir)
constructor taking space and communication interface/direction
Definition: communicationmanager.hh:269
void addToList(DiscreteFunctionImp &df, const Operation &operation)
add discrete function to communication list
Definition: communicationmanager.hh:345
void removeFromList(DiscreteFunction &df)
Definition: communicationmanager.hh:361
virtual void exchange() const =0
CommunicationManagerList()=default
void addToList(DiscreteFunctionImp &df)
add discrete function to communication list
Definition: communicationmanager.hh:354
virtual ~DiscreteFunctionCommunicatorInterface()=default
double receive(PetscDiscreteFunction< DiscreteFunctionSpace > &discreteFunction, const Operation &operation)
receive data for discrete function and given operation
Definition: communicationmanager.hh:112
Definition: bindguard.hh:11
base class for determing whether a class is a discrete function or not
Definition: common/discretefunction.hh:52
Definition: cachedcommmanager.hh:47
just copy data
Definition: commoperations.hh:128
default communication manager using just the grids communicate method
Definition: communicationmanager.hh:77
Definition: communicationmanager.hh:88
use Default CommunicationManager as Communication Manager
Definition: communicationmanager.hh:264
Proxy class to DependencyCache which is singleton per space.
Definition: communicationmanager.hh:286