1 #ifndef DUNE_FEM_LOADBALANCER_HH 2 #define DUNE_FEM_LOADBALANCER_HH 9 #include <dune/common/timer.hh> 10 #include <dune/common/tuples.hh> 68 template <
class Gr
idType>
89 typedef std::pair< LocalDataInlinerInterfaceType*, LocalDataXtractorInterfaceType* > LocalDataCollectorPairType;
90 typedef std::pair< DataInlinerType* , DataXtractorType* > DataCollectorPairType;
100 template<
class RestrictPro
longOperator >
103 dm_ ( DofManagerType::instance( grid_ ) ),
104 balanceStep_( getBalanceStep( balanceCounter, parameter ) ),
105 balanceCounter_( balanceCounter ),
110 rpOp.addToLoadBalancer( *
this );
112 std::cout <<
"Created LoadBalancer: balanceStep = " << balanceStep_ << std::endl;
115 template<
class RestrictPro
longOperator >
118 dm_ ( DofManagerType::instance( grid_ ) ),
119 balanceStep_( getBalanceStep( 0, parameter ) ),
120 balanceCounter_( 0 ),
125 rpOp.addToLoadBalancer( *
this );
127 std::cout <<
"Created LoadBalancer: balanceStep = " << balanceStep_ << std::endl;
140 dm_ ( DofManagerType::instance( grid_ ) ),
141 balanceStep_( getBalanceStep( balanceCounter, parameter) ),
142 balanceCounter_( balanceCounter ),
148 std::cout <<
"Created LoadBalancer: balanceStep = " << balanceStep_ << std::endl;
153 dm_ ( DofManagerType::instance( grid_ ) ),
154 balanceStep_( getBalanceStep( 0, parameter) ),
155 balanceCounter_( 0 ),
161 std::cout <<
"Created LoadBalancer: balanceStep = " << balanceStep_ << std::endl;
167 if( parameter.exists(
"BalanceStep") )
169 std::cout <<
"Warning: deprecated parameter 'BalanceStep', please use 'fem.loadbalancing.step' instead!" << std::endl;
170 step = parameter.getValue<
int >(
"BalanceStep",
balanceCounter );
173 step = parameter.getValue<
int >(
"fem.loadbalancing.step",
balanceCounter );
182 dm_.clearDataInliners();
183 dm_.clearDataXtractors();
186 for(
size_t i=0; i<collList_.size(); ++i)
188 delete collList_[ i ].first ;
189 delete collList_[ i ].second ;
193 for(
size_t i=0; i<localList_.size(); ++i)
195 delete localList_[ i ].first ;
196 delete localList_[ i ].second ;
212 bool changed =
false;
215 const bool callBalance = ( (balanceCounter_ >= balanceStep_) && (balanceStep_ > 0) );
219 int willCall = (callBalance) ? 1 : 0;
220 const int iCall = willCall;
223 grid_.comm().broadcast(&willCall, 1 , 0);
225 assert( willCall == iCall );
233 changed = grid_.loadBalance( dm_ );
237 std::cout <<
"P[" << grid_.comm().rank() <<
"] : Cought an exepction during load balance" << std::endl;
245 if( balanceStep_ > 0 ) ++balanceCounter_;
248 balanceTime_ = timer.elapsed();
262 std::tuple<const int& > value( balanceCounter_ );
269 std::tuple< int& > value( balanceCounter_ );
274 template <
class DiscreteFunctionType>
277 addDiscreteFunction(df);
281 template <
class DiscreteFunctionType>
284 addDiscreteFunction( df, df.defaultLoadBalanceContainsCheck() );
288 template <
class DiscreteFunctionType,
class ContainsCheck >
291 static_assert( (Conversion< DiscreteFunctionType, IsDiscreteFunction >::exists),
292 "Only valid for discrete functions" );
297 if( listOfFcts_.find(fct) == listOfFcts_.end() )
300 listOfFcts_.insert( fct );
305 LocalDataCollectorPairType localPair;
306 DataCollectorPairType collPair;
309 LocalInlinerType * di =
new LocalInlinerType(df, containsCheck );
310 localPair.first = di ;
313 DataCollectorImp* gdi =
new DataCollectorImp( grid_, dm_ , *di, di->readWriteInfo() );
314 collPair.first = gdi ;
316 dm_.addDataInliner( *gdi );
324 LocalXtractorType * dx =
new LocalXtractorType(df, containsCheck );
325 localPair.second = dx ;
328 DataCollectorImp* gdx =
new DataCollectorImp( grid_, dm_ , *dx, dx->readWriteInfo() );
329 collPair.second = gdx ;
331 dm_.addDataXtractor( *gdx );
335 localList_.push_back( localPair );
336 collList_.push_back( collPair );
339 df.enableDofCompression();
371 #endif // #ifndef DUNE_FEM_LOADBALANCER_HH virtual ~LoadBalancerInterface()
destructor
Definition: loadbalancer.hh:44
LoadBalancer(GridType &grid, RestrictProlongOperator &rpOp, int balanceCounter, const ParameterReader ¶meter=Parameter::container())
constructor of LoadBalancer The following optional parameter is used from the Parameter class: Balanc...
Definition: loadbalancer.hh:101
const int balanceStep_
Definition: loadbalancer.hh:351
GridType & grid_
corresponding grid
Definition: loadbalancer.hh:345
int balanceCounter() const
returns actual balanceCounter for checkpointing
Definition: loadbalancer.hh:201
int getBalanceStep(int balanceCounter, const ParameterReader ¶meter=Parameter::container()) const
Definition: loadbalancer.hh:164
DofManagerType & dm_
DofManager corresponding to grid.
Definition: loadbalancer.hh:348
The DataCollector is an example for a grid walk done while load balancing moves entities from one pro...
Definition: datacollector.hh:433
bool loadBalance()
do load balance every balanceStep_ step
Definition: loadbalancer.hh:204
LoadBalancer(GridType &grid, RestrictProlongOperator &rpOp, const ParameterReader ¶meter=Parameter::container())
Definition: loadbalancer.hh:116
void restore()
retore internal data
Definition: loadbalancer.hh:267
Definition: discretefunction.hh:50
Definition: datacollector.hh:45
std::set< const IsDiscreteFunction * > listOfFcts_
Definition: loadbalancer.hh:360
void addDiscreteFunction(DiscreteFunctionType &df, const ContainsCheck &containsCheck)
add discrete function to data inliner/xtractor list
Definition: loadbalancer.hh:289
Inline DiscreteFunction data during load balancing.
Definition: datacollector.hh:677
std::vector< LocalDataCollectorPairType > localList_
Definition: loadbalancer.hh:356
virtual double loadBalanceTime() const
time that last load balance cycle took
Definition: loadbalancer.hh:254
LoadBalancerInterface()
default constructor
Definition: loadbalancer.hh:40
std::vector< DataCollectorPairType > collList_
Definition: loadbalancer.hh:357
virtual double loadBalanceTime() const
time that last load balance cycle took
Definition: loadbalancer.hh:57
virtual int balanceCounter() const =0
return number of cycles since last application of load balance
double balanceTime_
Definition: loadbalancer.hh:363
Definition: coordinate.hh:4
virtual bool loadBalance()=0
call load balance, returns true if grid was changed
Interface class for load balancing.
Definition: loadbalancer.hh:36
static ParameterContainer & container()
Definition: io/parameter.hh:190
LoadBalancer(GridType &grid, int balanceCounter, const ParameterReader ¶meter=Parameter::container())
constructor of LoadBalancer The following optional parameter is used from the Parameter class: Balanc...
Definition: loadbalancer.hh:138
static void restoreValue(const std::string &token, T &value)
Definition: persistencemanager.hh:385
base class for auto persistent objects
Definition: persistencemanager.hh:562
base class for persistent objects
Definition: persistencemanager.hh:96
static bool verbose()
obtain the cached value for fem.verbose
Definition: io/parameter.hh:444
void backup() const
backup internal data
Definition: loadbalancer.hh:260
void addDiscreteFunction(DiscreteFunctionType &df)
add discrete function to data inliner/xtractor list
Definition: loadbalancer.hh:282
virtual ~LoadBalancer()
destructor
Definition: loadbalancer.hh:179
Inline DiscreteFunction data during load balancing.
Definition: datacollector.hh:764
int balanceCounter_
Definition: loadbalancer.hh:353
void addToLoadBalancer(DiscreteFunctionType &df)
add discrete function to data inliner/xtractor list
Definition: loadbalancer.hh:275
Definition: datacollector.hh:82
This class manages the adaptation process. If the method adapt is called, then the grid is adapted an...
Definition: loadbalancer.hh:69
static bool singleThreadMode()
returns true if program is operating on one thread currently
Definition: threadmanager.hh:217
static void backupValue(const std::string &token, const T &value)
Definition: persistencemanager.hh:379
LoadBalancer(GridType &grid, const ParameterReader ¶meter=Parameter::container())
Definition: loadbalancer.hh:151