DUNE-FEM (unstable)

loadbalancer.hh
1 #ifndef DUNE_FEM_LOADBALANCER_HH
2 #define DUNE_FEM_LOADBALANCER_HH
3 
4 #include <cassert>
5 #include <iostream>
6 #include <set>
7 #include <type_traits>
8 #include <vector>
9 
10 #include <dune/common/timer.hh>
11 
12 #include <dune/fem/function/common/discretefunction.hh>
13 #include <dune/fem/io/parameter.hh>
14 #include <dune/fem/misc/mpimanager.hh>
15 #include <dune/fem/space/common/datacollector.hh>
16 #include <dune/fem/space/common/dofmanager.hh>
17 #include <dune/fem/space/common/commoperations.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 
52  virtual double loadBalanceTime () const
53  {
54  return 0.0;
55  }
56  };
57 
63  template <class GridType>
65  : virtual public LoadBalancerInterface
66  {
67  // type of this
69  // dof manager
71 
72  // type of data inlining during load balance
73  typedef typename DofManagerType :: DataInlinerType DataInlinerType;
74 
75  // type of data extraction during load balance
76  typedef typename DofManagerType :: DataXtractorType DataXtractorType;
77 
78  // type of local data collector interface
79  typedef typename DataInlinerType :: LocalInterfaceType LocalDataInlinerInterfaceType;
80  // type of local data collector interface
81  typedef typename DataXtractorType :: LocalInterfaceType LocalDataXtractorInterfaceType;
82 
83  typedef std::pair< LocalDataInlinerInterfaceType*, LocalDataXtractorInterfaceType* > LocalDataCollectorPairType;
84  typedef std::pair< DataInlinerType* , DataXtractorType* > DataCollectorPairType;
85  protected:
87  template< class RestrictProlongOperator >
88  LoadBalancer ( GridType &grid, RestrictProlongOperator &rpOp )
89  : grid_( grid ),
90  dm_ ( DofManagerType::instance( grid_ ) ),
91  localList_(),
92  collList_(),
93  commList_(rpOp),
94  balanceTime_( 0.0 )
95  {
96  rpOp.addToLoadBalancer( *this );
97  }
98 
99  explicit LoadBalancer ( GridType &grid )
100  : grid_( grid ),
101  dm_ ( DofManagerType::instance( grid_ ) ),
102  localList_(),
103  collList_(),
104  commList_(),
105  balanceTime_( 0.0 )
106  {}
107 
108  public:
110  virtual ~LoadBalancer ()
111  {
112  // clear objects from dof managers list
115 
116  // remove data collectors
117  for(size_t i=0; i<collList_.size(); ++i)
118  {
119  delete collList_[ i ].first ;
120  delete collList_[ i ].second ;
121  }
122 
123  // remove local data handler
124  for(size_t i=0; i<localList_.size(); ++i)
125  {
126  delete localList_[ i ].first ;
127  delete localList_[ i ].second ;
128  }
129  }
130 
131  void communicate () const
132  {
133  // if overlap or ghost elements are available
134  // these need to be synchronized here
135  const auto gv = grid_.leafGridView();
136  if( (gv.overlapSize( 0 ) > 0) || (gv.ghostSize( 0 ) > 0) )
137  {
138  // exchange all modified data
139  // this also rebuilds the dependecy cache of the
140  // cached communication manager if used
141  commList_.exchange();
142  }
143 #ifndef NDEBUG
144  // make sure every process is on the same page
145  gv.comm().barrier();
146 #endif // #ifndef NDEBUG
147  }
148 
150  bool loadBalance ()
151  {
152  bool changed = false;
153 
154  // if only one core don't do anything
155  if( grid_.comm().size() <= 1 )
156  return changed;
157 
158  // make sure this is only called in single thread mode
159  if( ! Fem :: MPIManager :: singleThreadMode() )
160  {
161  assert( Fem :: MPIManager :: singleThreadMode() );
162  DUNE_THROW(InvalidStateException,"LoadBalancer::loadBalance: only call in single thread mode!");
163  }
164 
165  // get stopwatch
166  Dune::Timer timer ;
167 
168 
169  try {
170  // call grids load balance, only implemented in ALUGrid right now
171  changed = grid_.loadBalance( dm_ );
172  }
173  catch (const Exception& e)
174  {
175  std::cout << "P[" << grid_.comm().rank() << "] : Caught " << e.what() << " during LoadBalancer::loadBalance()." << std::endl;
176  std::abort();
177  }
178  catch (...)
179  {
180  std::cout << "P[" << grid_.comm().rank() << "] : Caught a generic exception during LoadBalancer::loadBalance()." << std::endl;
181  std::abort();
182  }
183 
184  // get time
185  balanceTime_ = timer.elapsed();
186 
187  // restore data consistency
188  communicate();
189 
190  return changed;
191  }
192 
194  virtual double loadBalanceTime() const
195  {
196  return balanceTime_;
197  }
198 
200  template <class DiscreteFunctionType>
202  {
204  }
205 
207  template <class DiscreteFunctionType>
209  {
210  addDiscreteFunction( df, df.defaultLoadBalanceContainsCheck() );
211  }
212 
214  template <class DiscreteFunctionType, class ContainsCheck >
215  void addDiscreteFunction(DiscreteFunctionType& df, const ContainsCheck& containsCheck )
216  {
217  static_assert( std::is_convertible< DiscreteFunctionType, IsDiscreteFunction >::value,
218  "Only valid for discrete functions" );
219 
221  //
222  // Note: DiscreteFunctionType here can also be
223  // FemPy::DiscreteFunctionList for
224  // python adaptation and load balance
225  //
227 
228  const IsDiscreteFunction * fct = &df;
229 
230  // if discrete functions is not in list already
231  if( listOfFcts_.find(fct) == listOfFcts_.end() )
232  {
233  // insert into set
234  listOfFcts_.insert( fct );
235 
237  // data inliners
239  LocalDataCollectorPairType localPair;
240  DataCollectorPairType collPair;
241  {
243  LocalInlinerType * di = new LocalInlinerType(df, containsCheck );
244  localPair.first = di ;
245 
246  typedef DataCollector<GridType, LocalInlinerType > DataCollectorImp;
247  DataCollectorImp* gdi = new DataCollectorImp( grid_, dm_ , *di, di->readWriteInfo() );
248  collPair.first = gdi ;
249 
250  dm_.addDataInliner( *gdi );
251  }
252 
254  // data xtractors
256  {
258  LocalXtractorType * dx = new LocalXtractorType(df, containsCheck );
259  localPair.second = dx ;
260 
261  typedef DataCollector<GridType,LocalXtractorType> DataCollectorImp;
262  DataCollectorImp* gdx = new DataCollectorImp( grid_, dm_ , *dx, dx->readWriteInfo() );
263  collPair.second = gdx ;
264 
265  dm_.addDataXtractor( *gdx );
266  }
267 
268  // for later removal
269  localList_.push_back( localPair );
270  collList_.push_back( collPair );
271 
272  // enable this discrete function for dof compression
274  }
275  }
276 
277  protected:
279  GridType & grid_;
280 
283 
284  // list of created local data collectors
285  std::vector< LocalDataCollectorPairType > localList_;
286  std::vector< DataCollectorPairType > collList_;
287 
288  // list of already added discrete functions
289  std::set< const IsDiscreteFunction * > listOfFcts_;
290 
291  mutable CommunicationManagerList commList_;
292 
293  // time for last load balance call
294  double balanceTime_;
295  };
296 
299  } // namespace Fem
300 
301 } // namespace Dune
302 #endif // #ifndef DUNE_FEM_LOADBALANCER_HH
Base class for Dune-Exceptions.
Definition: exceptions.hh:96
Proxy class to DependencyCache which is singleton per space.
Definition: communicationmanager.hh:309
The DataCollector is an example for a grid walk done while load balancing moves entities from one pro...
Definition: datacollector.hh:435
Definition: dofmanager.hh:786
base class for determing whether a class is a discrete function or not
Definition: discretefunction.hh:53
Interface class for load balancing.
Definition: loadbalancer.hh:37
virtual double loadBalanceTime() const
time that last load balance cycle took
Definition: loadbalancer.hh:52
LoadBalancerInterface()
default constructor
Definition: loadbalancer.hh:40
virtual bool loadBalance()=0
call load balance, returns true if grid was changed
virtual ~LoadBalancerInterface()
destructor
Definition: loadbalancer.hh:44
This class manages the adaptation process. If the method adapt is called, then the grid is adapted an...
Definition: loadbalancer.hh:66
virtual double loadBalanceTime() const
time that last load balance cycle took
Definition: loadbalancer.hh:194
bool loadBalance()
do load balance
Definition: loadbalancer.hh:150
void addToLoadBalancer(DiscreteFunctionType &df)
add discrete function to data inliner/xtractor list
Definition: loadbalancer.hh:201
LoadBalancer(GridType &grid, RestrictProlongOperator &rpOp)
constructor of LoadBalancer
Definition: loadbalancer.hh:88
virtual ~LoadBalancer()
destructor
Definition: loadbalancer.hh:110
GridType & grid_
corresponding grid
Definition: loadbalancer.hh:279
void addDiscreteFunction(DiscreteFunctionType &df, const ContainsCheck &containsCheck)
add discrete function to data inliner/xtractor list
Definition: loadbalancer.hh:215
void addDiscreteFunction(DiscreteFunctionType &df)
add discrete function to data inliner/xtractor list
Definition: loadbalancer.hh:208
DofManagerType & dm_
DofManager corresponding to grid.
Definition: loadbalancer.hh:282
Inline DiscreteFunction data during load balancing.
Definition: datacollector.hh:683
Inline DiscreteFunction data during load balancing.
Definition: datacollector.hh:775
forward declaration
Definition: discretefunction.hh:51
void enableDofCompression()
Enable this discrete function for dof compression, i.e. during grid changes a dof compression is done...
Definition: discretefunction.hh:131
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:281
A simple stop watch.
Definition: timer.hh:43
double elapsed() const noexcept
Get elapsed user-time from last reset until now/last stop in seconds.
Definition: timer.hh:77
void exchange() const
Definition: communicationmanager.hh:396
void addDataXtractor(DataCollType &d)
add data handler for data xtracting to dof manager
Definition: dofmanager.hh:1115
void clearDataXtractors()
clear data xtractor list
Definition: dofmanager.hh:1121
void clearDataInliners()
clear data inliner list
Definition: dofmanager.hh:1108
void addDataInliner(DataCollType &d)
add data handler for data inlining to dof manager
Definition: dofmanager.hh:1102
const char * what() const noexcept override
output internal message buffer
Definition: exceptions.cc:37
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
Dune namespace.
Definition: alignedallocator.hh:13
A simple timing class.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 9, 22:29, 2024)