1 #ifndef DUNE_FEM_COMMUNICATION_MANAGER_HH 2 #define DUNE_FEM_COMMUNICATION_MANAGER_HH 10 #include <dune/common/timer.hh> 11 #include <dune/grid/common/datahandleif.hh> 12 #include <dune/grid/common/grid.hh> 19 #if defined ENABLE_ALUGRID 21 #include <dune/grid/alugrid/3d/alugrid.hh> 22 #elif HAVE_DUNE_ALUGRID 23 #include <dune/alugrid/3d/alugrid.hh> 27 #ifndef WANT_CACHED_COMM_MANAGER 28 #define WANT_CACHED_COMM_MANAGER 1 31 #if ALU3DGRID_PARALLEL && WANT_CACHED_COMM_MANAGER 32 #define USE_CACHED_COMM_MANAGER 36 #ifdef DUNE_DEVEL_MODE 37 #warning "HAVE_MPI == 0, therefore default CommunicationManager is used!" 39 #elif !ALU3DGRID_PARALLEL 40 #warning "No Parallel ALUGrid found, using default CommunicationManager!" 41 #elif ! WANT_CACHED_COMM_MANAGER 42 #warning "CachedCommunication Manager disabled by WANT_CACHED_COMM_MANAGER=0!" 47 #undef WANT_CACHED_COMM_MANAGER 49 #ifdef USE_CACHED_COMM_MANAGER 67 template<
class DiscreteFunctionSpace >
68 class PetscDiscreteFunction;
70 class IsDiscreteFunction;
83 template<
class Space >
97 const SpaceType& space_;
98 const InterfaceType interface_;
99 const CommunicationDirection dir_;
103 InterfaceType interface,
104 CommunicationDirection dir )
106 interface_( interface ),
111 template <
class DiscreteFunction >
112 void send(
const DiscreteFunction& discreteFunction )
119 template <
class DiscreteFunctionSpace,
class Operation >
121 const Operation* operation )
124 Dune::Timer exchangeT;
127 discreteFunction.communicate();
129 return exchangeT.elapsed();
133 template <
class DiscreteFunction,
class Operation >
134 double receive( DiscreteFunction& discreteFunction,
const Operation* operation )
137 typedef typename DiscreteFunction
138 :: template CommDataHandle< Operation > :: Type
142 if( space_.gridPart().comm().size() <= 1 )
146 Dune::Timer exchangeT;
149 DataHandleType dataHandle = discreteFunction.dataHandle( operation );
150 space_.gridPart().communicate( dataHandle, interface_ , dir_ );
153 return exchangeT.elapsed();
157 template <
class DiscreteFunction >
158 double receive( DiscreteFunction& discreteFunction )
161 typedef typename DiscreteFunction :: DiscreteFunctionSpaceType
162 :: template CommDataHandle< DiscreteFunction > :: OperationType DefaultOperationType;
163 return receive( discreteFunction, (DefaultOperationType *) 0 );
171 const CommunicationDirection
dir_;
180 (
const SpaceType &space,
181 const InterfaceType interface,
182 const CommunicationDirection dir)
184 interface_( interface ),
230 template<
class DiscreteFunction >
231 inline void exchange ( DiscreteFunction &discreteFunction )
const 234 typedef typename DiscreteFunction :: DiscreteFunctionSpaceType ::
235 template CommDataHandle< DiscreteFunction > :: OperationType DefaultOperationType;
237 exchange( discreteFunction, (DefaultOperationType *) 0 );
248 template<
class DiscreteFunction,
class Operation >
249 inline void exchange ( DiscreteFunction &discreteFunction,
250 const Operation *operation )
const 253 if( space_.gridPart().comm().size() <= 1 )
256 NonBlockingCommunicationType nbc( space_, interface_, dir_ );
259 nbc.send( discreteFunction );
261 exchangeTime_ = nbc.receive( discreteFunction, operation );
267 #ifndef USE_CACHED_COMM_MANAGER 270 template <
class SpaceImp>
279 const InterfaceType interface,
280 const CommunicationDirection dir)
281 : BaseType(space,interface,dir)
297 class DiscreteFunctionCommunicatorInterface
300 DiscreteFunctionCommunicatorInterface () {}
302 virtual ~DiscreteFunctionCommunicatorInterface () {}
308 template <
class DiscreteFunctionImp>
309 class DiscreteFunctionCommunicator
310 :
public DiscreteFunctionCommunicatorInterface
312 typedef DiscreteFunctionImp DiscreteFunctionType;
313 typedef typename DiscreteFunctionType :: DiscreteFunctionSpaceType DiscreteFunctionSpaceType;
317 DiscreteFunctionType& df_;
318 CommunicationManagerType comm_;
321 DiscreteFunctionCommunicator(DiscreteFunctionType& df)
322 : df_(df), comm_(df_.space())
335 typedef DiscreteFunctionCommunicatorInterface CommObjIFType;
336 typedef std::list < DiscreteFunctionCommunicatorInterface * > CommObjListType;
337 CommObjListType objList_;
342 template <
class CombinedObjectType>
345 cObj.addToList(*
this);
352 while( objList_.size() > 0 )
354 CommObjIFType * obj = objList_.back();
361 template <
class DiscreteFunctionImp>
364 typedef DiscreteFunctionCommunicator<DiscreteFunctionImp> CommObjType;
365 CommObjType* obj =
new CommObjType(df);
366 objList_.push_back(obj);
369 template<
class DiscreteFunction >
372 const auto handles = [ &df ] (
const CommObjIFType *commObj ) {
return commObj->handles( df ); };
373 CommObjListType::reverse_iterator pos = std::find_if( objList_.rbegin(), objList_.rend(), handles );
374 if( pos != objList_.rend() )
375 objList_.erase( pos.base() );
377 DUNE_THROW( RangeError,
"Trying to remove discrete function that was never added" );
384 typedef CommObjListType :: const_iterator iterator;
386 iterator end = objList_.end();
387 for(iterator it = objList_.begin(); it != end; ++it)
403 #endif // #ifndef DUNE_FEM_COMMUNICATION_MANAGER_HH void exchange() const
Definition: communicationmanager.hh:382
double receive(DiscreteFunction &discreteFunction)
receive method with default operation
Definition: communicationmanager.hh:158
DefaultCommunicationManager(const SpaceType &space, const InterfaceType interface, const CommunicationDirection dir)
constructor taking space and communication interface/direction
Definition: communicationmanager.hh:180
Proxy class to DependencyCache which is singleton per space.
Definition: communicationmanager.hh:294
double buildTime() const
return time needed for last build
Definition: communicationmanager.hh:209
const InterfaceType interface_
Definition: communicationmanager.hh:170
Definition: discretefunction.hh:50
CommunicationManagerList(CombinedObjectType &cObj)
constructor
Definition: communicationmanager.hh:343
CommunicationManager(const SpaceImp &space)
constructor taking space
Definition: communicationmanager.hh:284
void removeFromList(DiscreteFunction &df)
Definition: communicationmanager.hh:370
void exchange(DiscreteFunction &discreteFunction) const
exchange data for a discrete function using the copy operation
Definition: communicationmanager.hh:231
double exchangeTime() const
return time needed for last exchange of data
Definition: communicationmanager.hh:215
double receive(PetscDiscreteFunction< DiscreteFunctionSpace > &discreteFunction, const Operation *operation)
receive data for discrete function and given operation
Definition: communicationmanager.hh:120
Space SpaceType
Definition: communicationmanager.hh:87
use Default CommunicationManager as Communication Manager
Definition: communicationmanager.hh:271
CommunicationManager(const SpaceImp &space, const InterfaceType interface, const CommunicationDirection dir)
constructor taking space and communication interface/direction
Definition: communicationmanager.hh:278
Definition: coordinate.hh:4
~CommunicationManagerList()
remove object comm
Definition: communicationmanager.hh:349
const SpaceType & space_
Definition: communicationmanager.hh:168
double receive(DiscreteFunction &discreteFunction, const Operation *operation)
receive data for discrete function and given operation
Definition: communicationmanager.hh:134
const CommunicationDirection dir_
Definition: communicationmanager.hh:171
void addToList(DiscreteFunctionImp &df)
add discrete function to communication list
Definition: communicationmanager.hh:362
InterfaceType communicationInterface() const
return communication interface
Definition: communicationmanager.hh:195
Definition: communicationmanager.hh:95
NonBlockingCommunication(const SpaceType &space, InterfaceType interface, CommunicationDirection dir)
Definition: communicationmanager.hh:102
default communication manager using just the grids communicate method
Definition: communicationmanager.hh:84
CommunicationDirection communicationDirection() const
return communication direction
Definition: communicationmanager.hh:200
double exchangeTime_
Definition: communicationmanager.hh:173
NonBlockingCommunication NonBlockingCommunicationType
Definition: communicationmanager.hh:176
NonBlockingCommunicationType nonBlockingCommunication() const
return object for non-blocking communication
Definition: communicationmanager.hh:221
void send(const DiscreteFunction &discreteFunction)
send data for given discrete function
Definition: communicationmanager.hh:112
Definition: cachedcommmanager.hh:44
void exchange(DiscreteFunction &discreteFunction, const Operation *operation) const
exchange data for a discrete function using the given operation
Definition: communicationmanager.hh:249
DefaultCommunicationManager< Space > ThisType
Definition: communicationmanager.hh:90