dune-fem  2.4.1-rc
loadbalancer.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_LOADBALANCER_HH
2 #define DUNE_FEM_LOADBALANCER_HH
3 
4 #include <cassert>
5 #include <iostream>
6 #include <set>
7 #include <vector>
8 
9 #include <dune/common/timer.hh>
10 #include <dune/common/tuples.hh>
11 
14 #include <dune/fem/io/parameter.hh>
18 
19 namespace Dune
20 {
21 
22  namespace Fem
23  {
24 
37  {
38  protected:
41 
42  public:
44  virtual ~LoadBalancerInterface () {}
45 
49  virtual bool loadBalance () = 0;
50 
54  virtual int balanceCounter () const = 0;
55 
57  virtual double loadBalanceTime () const
58  {
59  return 0.0;
60  }
61  };
62 
68  template <class GridType>
70  : virtual public LoadBalancerInterface ,
72  {
73  // type of this
75  // dof manager
77 
78  // type of data inlining during load balance
80 
81  // type of data extraction during load balance
83 
84  // type of local data collector interface
86  // type of local data collector interface
88 
89  typedef std::pair< LocalDataInlinerInterfaceType*, LocalDataXtractorInterfaceType* > LocalDataCollectorPairType;
90  typedef std::pair< DataInlinerType* , DataXtractorType* > DataCollectorPairType;
91  protected:
100  template< class RestrictProlongOperator >
101  LoadBalancer ( GridType &grid, RestrictProlongOperator &rpOp, int balanceCounter, const ParameterReader &parameter = Parameter::container() )
102  : grid_( grid ),
103  dm_ ( DofManagerType::instance( grid_ ) ),
104  balanceStep_( getBalanceStep( balanceCounter, parameter ) ),
105  balanceCounter_( balanceCounter ),
106  localList_(),
107  collList_(),
108  balanceTime_( 0.0 )
109  {
110  rpOp.addToLoadBalancer( *this );
111  if( Parameter::verbose() )
112  std::cout << "Created LoadBalancer: balanceStep = " << balanceStep_ << std::endl;
113  }
114 
115  template< class RestrictProlongOperator >
116  LoadBalancer ( GridType &grid, RestrictProlongOperator &rpOp, const ParameterReader &parameter = Parameter::container() )
117  : grid_( grid ),
118  dm_ ( DofManagerType::instance( grid_ ) ),
119  balanceStep_( getBalanceStep( 0, parameter ) ),
120  balanceCounter_( 0 ),
121  localList_(),
122  collList_(),
123  balanceTime_( 0.0 )
124  {
125  rpOp.addToLoadBalancer( *this );
126  if( Parameter::verbose() )
127  std::cout << "Created LoadBalancer: balanceStep = " << balanceStep_ << std::endl;
128  }
129 
138  explicit LoadBalancer ( GridType &grid, int balanceCounter, const ParameterReader &parameter = Parameter::container() )
139  : grid_( grid ),
140  dm_ ( DofManagerType::instance( grid_ ) ),
141  balanceStep_( getBalanceStep( balanceCounter, parameter) ),
142  balanceCounter_( balanceCounter ),
143  localList_(),
144  collList_(),
145  balanceTime_( 0.0 )
146  {
147  if( Parameter::verbose() )
148  std::cout << "Created LoadBalancer: balanceStep = " << balanceStep_ << std::endl;
149  }
150 
151  explicit LoadBalancer ( GridType &grid, const ParameterReader &parameter = Parameter::container() )
152  : grid_( grid ),
153  dm_ ( DofManagerType::instance( grid_ ) ),
154  balanceStep_( getBalanceStep( 0, parameter) ),
155  balanceCounter_( 0 ),
156  localList_(),
157  collList_(),
158  balanceTime_( 0.0 )
159  {
160  if( Parameter::verbose() )
161  std::cout << "Created LoadBalancer: balanceStep = " << balanceStep_ << std::endl;
162  }
163 
164  int getBalanceStep( int balanceCounter, const ParameterReader &parameter = Parameter::container() ) const
165  {
166  int step = balanceCounter;
167  if( parameter.exists("BalanceStep") )
168  {
169  std::cout << "Warning: deprecated parameter 'BalanceStep', please use 'fem.loadbalancing.step' instead!" << std::endl;
170  step = parameter.getValue< int >( "BalanceStep", balanceCounter );
171  }
172  else
173  step = parameter.getValue< int >( "fem.loadbalancing.step", balanceCounter );
174  return step;
175  }
176 
177  public:
179  virtual ~LoadBalancer ()
180  {
181  // clear objects from dof managers list
182  dm_.clearDataInliners();
183  dm_.clearDataXtractors();
184 
185  // remove data collectors
186  for(size_t i=0; i<collList_.size(); ++i)
187  {
188  delete collList_[ i ].first ;
189  delete collList_[ i ].second ;
190  }
191 
192  // remove local data handler
193  for(size_t i=0; i<localList_.size(); ++i)
194  {
195  delete localList_[ i ].first ;
196  delete localList_[ i ].second ;
197  }
198  }
199 
201  int balanceCounter () const { return balanceCounter_; }
202 
204  bool loadBalance ()
205  {
206  // make sure this is only called in single thread mode
208 
209  // get stopwatch
210  Dune::Timer timer ;
211 
212  bool changed = false;
213 
214  // if balance counter has readed balanceStep do load balance
215  const bool callBalance = ( (balanceCounter_ >= balanceStep_) && (balanceStep_ > 0) );
216 
217 #ifndef NDEBUG
218  // make sure load balance is called on every process
219  int willCall = (callBalance) ? 1 : 0;
220  const int iCall = willCall;
221 
222  // send info from rank 0 to all other
223  grid_.comm().broadcast(&willCall, 1 , 0);
224 
225  assert( willCall == iCall );
226 #endif
227 
228  // if balance counter has reached balanceStep do load balance
229  if( callBalance )
230  {
231  try {
232  // call grids load balance, only implemented in ALUGrid right now
233  changed = grid_.loadBalance( dm_ );
234  }
235  catch (...)
236  {
237  std::cout << "P[" << grid_.comm().rank() << "] : Cought an exepction during load balance" << std::endl;
238  abort();
239  }
240  // reset balance counter
241  balanceCounter_ = 0;
242  }
243 
244  // increase balanceCounter if balancing is enabled
245  if( balanceStep_ > 0 ) ++balanceCounter_;
246 
247  // get time
248  balanceTime_ = timer.elapsed();
249 
250  return changed;
251  }
252 
254  virtual double loadBalanceTime() const
255  {
256  return balanceTime_;
257  }
258 
260  void backup() const
261  {
262  std::tuple<const int& > value( balanceCounter_ );
263  PersistenceManager::backupValue("loadbalancer",value);
264  }
265 
267  void restore()
268  {
269  std::tuple< int& > value( balanceCounter_ );
270  PersistenceManager::restoreValue("loadbalancer",value);
271  }
272 
274  template <class DiscreteFunctionType>
275  void addToLoadBalancer(DiscreteFunctionType& df)
276  {
277  addDiscreteFunction(df);
278  }
279 
281  template <class DiscreteFunctionType>
282  void addDiscreteFunction( DiscreteFunctionType& df )
283  {
284  addDiscreteFunction( df, df.defaultLoadBalanceContainsCheck() );
285  }
286 
288  template <class DiscreteFunctionType, class ContainsCheck >
289  void addDiscreteFunction(DiscreteFunctionType& df, const ContainsCheck& containsCheck )
290  {
291  static_assert( (Conversion< DiscreteFunctionType, IsDiscreteFunction >::exists),
292  "Only valid for discrete functions" );
293 
294  const IsDiscreteFunction * fct = &df;
295 
296  // if discrete functions is not in list already
297  if( listOfFcts_.find(fct) == listOfFcts_.end() )
298  {
299  // insert into set
300  listOfFcts_.insert( fct );
301 
303  // data inliners
305  LocalDataCollectorPairType localPair;
306  DataCollectorPairType collPair;
307  {
309  LocalInlinerType * di = new LocalInlinerType(df, containsCheck );
310  localPair.first = di ;
311 
312  typedef DataCollector<GridType, LocalInlinerType > DataCollectorImp;
313  DataCollectorImp* gdi = new DataCollectorImp( grid_, dm_ , *di, di->readWriteInfo() );
314  collPair.first = gdi ;
315 
316  dm_.addDataInliner( *gdi );
317  }
318 
320  // data xtractors
322  {
324  LocalXtractorType * dx = new LocalXtractorType(df, containsCheck );
325  localPair.second = dx ;
326 
327  typedef DataCollector<GridType,LocalXtractorType> DataCollectorImp;
328  DataCollectorImp* gdx = new DataCollectorImp( grid_, dm_ , *dx, dx->readWriteInfo() );
329  collPair.second = gdx ;
330 
331  dm_.addDataXtractor( *gdx );
332  }
333 
334  // for later removal
335  localList_.push_back( localPair );
336  collList_.push_back( collPair );
337 
338  // enable this discrete function for dof compression
339  df.enableDofCompression();
340  }
341  }
342 
343  protected:
345  GridType & grid_;
346 
348  DofManagerType & dm_;
349 
350  // call loadBalance ervery balanceStep_ step
351  const int balanceStep_ ;
352  // count actual balance call
354 
355  // list of created local data collectors
356  std::vector< LocalDataCollectorPairType > localList_;
357  std::vector< DataCollectorPairType > collList_;
358 
359  // list of already added discrete functions
360  std::set< const IsDiscreteFunction * > listOfFcts_;
361 
362  // time for last load balance call
363  double balanceTime_;
364  };
365 
368  } // namespace Fem
369 
370 } // namespace Dune
371 #endif // #ifndef DUNE_FEM_LOADBALANCER_HH
virtual ~LoadBalancerInterface()
destructor
Definition: loadbalancer.hh:44
LoadBalancer(GridType &grid, RestrictProlongOperator &rpOp, int balanceCounter, const ParameterReader &parameter=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 &parameter=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 &parameter=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 &parameter=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 &parameter=Parameter::container())
Definition: loadbalancer.hh:151