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 if( space_.gridPart().comm().size() <= 1 )
120 Dune::Timer exchangeT;
123 discreteFunction.dofVector().communicateNow( operation );
125 return exchangeT.elapsed();
129 template <
class DiscreteFunction,
class Operation >
130 double receive( DiscreteFunction& discreteFunction,
const Operation& operation )
133 if( space_.gridPart().comm().size() <= 1 )
137 typedef typename DiscreteFunction
138 :: template CommDataHandle< Operation > :: Type
142 Dune::Timer exchangeT;
145 DataHandleType dataHandle = discreteFunction.dataHandle( operation );
146 space_.gridPart().communicate( dataHandle, interface_ , dir_ );
149 return exchangeT.elapsed();
153 template <
class DiscreteFunction >
154 double receive( DiscreteFunction& discreteFunction )
157 typedef typename DiscreteFunction :: DiscreteFunctionSpaceType
158 :: template CommDataHandle< DiscreteFunction > :: OperationType DefaultOperationType;
159 DefaultOperationType operation;
160 return receive( discreteFunction, operation );
168 const CommunicationDirection
dir_;
178 const InterfaceType interface,
179 const CommunicationDirection dir)
224 template<
class DiscreteFunction >
225 inline void exchange ( DiscreteFunction &discreteFunction )
const
228 typedef typename DiscreteFunction :: DiscreteFunctionSpaceType ::
229 template CommDataHandle< DiscreteFunction > :: OperationType DefaultOperationType;
231 DefaultOperationType operation;
232 exchange( discreteFunction, operation );
243 template<
class DiscreteFunction,
class Operation >
244 inline void exchange ( DiscreteFunction &discreteFunction,
245 const Operation &operation )
const
248 if(
space_.gridPart().comm().size() <= 1 )
254 nbc.
send( discreteFunction );
262#ifndef USE_CACHED_COMM_MANAGER
265 template <
class SpaceImp>
274 const InterfaceType interface,
275 const CommunicationDirection dir)
292 class DiscreteFunctionCommunicatorInterface
303 template <
class DiscreteFunctionImp,
class Operation>
304 class DiscreteFunctionCommunicator
305 :
public DiscreteFunctionCommunicatorInterface
307 typedef DiscreteFunctionImp DiscreteFunctionType;
308 typedef typename DiscreteFunctionType :: DiscreteFunctionSpaceType DiscreteFunctionSpaceType;
312 DiscreteFunctionType& df_;
313 CommunicationManagerType comm_;
314 const Operation& operation_;
319 : df_(df), comm_(df_.space()), operation_( op )
326 comm_.exchange( df_, operation_ );
332 typedef DiscreteFunctionCommunicatorInterface CommObjIFType;
333 typedef std::list < std::unique_ptr< DiscreteFunctionCommunicatorInterface > > CommObjListType;
334 CommObjListType objList_;
341 template <
class CombinedObjectType>
344 cObj.addToList(*
this);
348 template <
class DiscreteFunctionImp,
class Operation>
349 void addToList(DiscreteFunctionImp &df,
const Operation& operation )
351 typedef DiscreteFunctionCommunicator<DiscreteFunctionImp, Operation> CommObjType;
352 CommObjType* obj =
new CommObjType( df, operation );
353 objList_.push_back( std::unique_ptr< DiscreteFunctionCommunicatorInterface> (obj) );
357 template <
class DiscreteFunctionImp>
364 template<
class DiscreteFunction >
367 const auto handles = [ &df ] (
const std::unique_ptr< DiscreteFunctionCommunicatorInterface > &commObj ) {
return commObj->handles( df ); };
368 CommObjListType::reverse_iterator pos = std::find_if( objList_.rbegin(), objList_.rend(), handles );
369 if( pos != objList_.rend() )
370 objList_.erase( --pos.base() );
372 DUNE_THROW( RangeError,
"Trying to remove discrete function that was never added" );
379 typedef CommObjListType :: const_iterator iterator;
381 iterator end = objList_.end();
382 for(iterator it = objList_.begin(); it != end; ++it)
const SpaceType & space_
Definition: communicationmanager.hh:165
double buildTime() const
return time needed for last build
Definition: communicationmanager.hh:203
DefaultCommunicationManager(const DefaultCommunicationManager &)=delete
InterfaceType communicationInterface() const
return communication interface
Definition: communicationmanager.hh:189
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:130
virtual bool handles(IsDiscreteFunction &df) const =0
DiscreteFunctionCommunicatorInterface()=default
void exchange() const
Definition: communicationmanager.hh:324
Space SpaceType
Definition: communicationmanager.hh:79
double exchangeTime_
Definition: communicationmanager.hh:170
DefaultCommunicationManager(const SpaceType &space, const InterfaceType interface, const CommunicationDirection dir)
constructor taking space and communication interface/direction
Definition: communicationmanager.hh:177
CommunicationManager(const SpaceImp &space)
constructor taking space
Definition: communicationmanager.hh:279
NonBlockingCommunication(const SpaceType &space, InterfaceType interface, CommunicationDirection dir)
Definition: communicationmanager.hh:94
const InterfaceType interface_
Definition: communicationmanager.hh:167
void exchange() const
Definition: communicationmanager.hh:377
void exchange(DiscreteFunction &discreteFunction) const
exchange data for a discrete function using the copy operation
Definition: communicationmanager.hh:225
CommunicationDirection communicationDirection() const
return communication direction
Definition: communicationmanager.hh:194
NonBlockingCommunication NonBlockingCommunicationType
Definition: communicationmanager.hh:173
CommunicationManagerList(CombinedObjectType &cObj)
constructor
Definition: communicationmanager.hh:342
NonBlockingCommunicationType nonBlockingCommunication() const
return object for non-blocking communication
Definition: communicationmanager.hh:215
bool handles(IsDiscreteFunction &df) const
Definition: communicationmanager.hh:329
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:244
DiscreteFunctionCommunicator(DiscreteFunctionType &df, const Operation &op)
constructor taking disctete function
Definition: communicationmanager.hh:318
double exchangeTime() const
return time needed for last exchange of data
Definition: communicationmanager.hh:209
double receive(DiscreteFunction &discreteFunction)
receive method with default operation
Definition: communicationmanager.hh:154
const CommunicationDirection dir_
Definition: communicationmanager.hh:168
CommunicationManager(const SpaceImp &space, const InterfaceType interface, const CommunicationDirection dir)
constructor taking space and communication interface/direction
Definition: communicationmanager.hh:273
void addToList(DiscreteFunctionImp &df, const Operation &operation)
add discrete function to communication list
Definition: communicationmanager.hh:349
void removeFromList(DiscreteFunction &df)
Definition: communicationmanager.hh:365
virtual void exchange() const =0
CommunicationManagerList()=default
void addToList(DiscreteFunctionImp &df)
add discrete function to communication list
Definition: communicationmanager.hh:358
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:53
Definition: cachedcommmanager.hh:47
just copy data
Definition: commoperations.hh:127
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:268
Proxy class to DependencyCache which is singleton per space.
Definition: communicationmanager.hh:290