dune-fem  2.8-git
gridsolution.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_GRIDSOLUTION_HH
2 #define DUNE_FEM_GRIDSOLUTION_HH
3 
4 #include <tuple>
5 
6 #include <dune/common/exceptions.hh>
7 #include <dune/grid/utility/hierarchicsearch.hh>
11 
12 #if HAVE_DUNE_SPGRID
13 #include <dune/grid/spgrid.hh>
14 #endif
15 
16 namespace Dune
17 {
18 
19  namespace Fem
20  {
21 
22  // GridSolution
23  //-------------
24 
31  template <class GridImp, class DiscreteFunctionImp >
33  {
34  public:
35  typedef GridImp GridType;
36  typedef DiscreteFunctionImp DiscreteFunctionType;
37  typedef typename DiscreteFunctionType :: DiscreteFunctionSpaceType DiscreteFunctionSpaceType;
38  typedef typename DiscreteFunctionSpaceType :: RangeType RangeType ;
39  typedef typename DiscreteFunctionSpaceType :: DomainType DomainType ;
40  typedef typename DiscreteFunctionSpaceType :: GridPartType GridPartType ;
41  typedef typename GridPartType :: IndexSetType IndexSetType;
43 
44  typedef typename GridType :: template Codim<0> :: Entity EntityType;
45 
46  typedef HierarchicSearch< GridType, IndexSetType > HierarchicSearchType;
47 
48  typedef std::tuple< DiscreteFunctionType* > IOTupleType;
49 
50  protected:
52  GridPtr< GridType > gridPtr_;
59 
60  public:
61  GridType& grid() { assert( grid_ ); return *grid_ ; }
62  const GridType& grid() const { assert( grid_ ); return *grid_ ; }
63 
65  explicit GridSolution(const std::string checkPointFile,
66  const int rank = -1 ) :
67  grid_( CheckPointerType :: restoreGrid( checkPointFile, rank ) ),
68  gridPtr_(),
69  gridPart_( grid() ),
70  space_( gridPart_ ),
71  discreteFunction_("grid-sol", space_),
74  hierarchicSearch_( grid(), gridPart_.indexSet() )
75  {
76  // store grid pointer
77  gridPtr_ = grid_;
78  DUNE_THROW(NotImplemented," GridSolution needs to be switched to DataWriter");
79  // restore data from checkpoint
80  CheckPointerType :: restoreData( grid(), data_, checkPointFile, rank );
81  }
82 
90  void evaluate(const DomainType& x, const double time, RangeType& result) const
91  {
92  evaluate(x, result );
93  }
94 
101  void evaluate(const DomainType& x, RangeType& result) const
102  {
103  // search entity
104  EntityType entity = hierarchicSearch_.findEntity( x );
105 
106  typedef typename EntityType :: Geometry Geometry;
107  const Geometry& geo = entity.geometry();
108 
109  const DomainType local = geo.local( x );
110 #ifndef NDEBUG
111  {
112  // check that corners are within the reference element of the given type
113  const auto &refElement = Dune::ReferenceElements< typename GridType::ctype, GridType::dimensionworld >::general( entity.type() );
114 
115  assert( refElement.checkInside( local ) );
116  }
117 #endif
118 
119  // evaluate discrete function
120  lf_.bind( entity );
121  lf_.evaluate( local, result );
122  lf_.unbind();
123  }
124 
126  static void writeDiscreteFunction(const GridType& grid,
128  const double time,
129  const int writeStep )
130  {
131  DUNE_THROW(NotImplemented," writeDiscreteFunction needs to be switched to DataWriter");
132  //typedef std::tuple< const DiscreteFunctionType* > OutputTuple;
133  //OutputTuple data( &discreteFunction );
134  // false means don't backup persistent objects
135  // CheckPointerType :: writeSingleCheckPoint( grid, data, time, false, writeStep );
136  }
137 
139  };
140 
142  //
143  //
144  //
146 
152  template <class GridImp, class DiscreteFunctionImp >
154  {
155  public:
156  typedef GridImp GridType;
157  typedef DiscreteFunctionImp DiscreteFunctionType;
158 
159  typedef typename DiscreteFunctionType :: DiscreteFunctionSpaceType DiscreteFunctionSpaceType;
160  typedef typename DiscreteFunctionSpaceType :: FunctionSpaceType FunctionSpaceType;
161  typedef typename DiscreteFunctionSpaceType :: GridPartType GridPartType;
162  typedef typename FunctionSpaceType :: DomainType DomainType;
163  typedef typename FunctionSpaceType :: DomainFieldType DomainFieldType;
164  typedef typename FunctionSpaceType :: RangeType RangeType;
165  typedef typename FunctionSpaceType :: RangeFieldType RangeFieldType;
166 
168 
169  protected:
170  template <class DomainType, class Grid>
171  struct CheckDomain
172  {
173  static bool isInside(const DomainType& x, const Grid& grid )
174  {
175  abort();
176  typedef typename Grid :: LevelGridView MacroView ;
177  typedef typename MacroView :: template Codim< 0 > :: Iterator Iterator ;
178  typedef typename Iterator :: Entity Entity;
179  const MacroView& macroView = grid.levelGridView( 0 );
180  const Iterator end = macroView.template end< 0 > ();
181  for( Iterator it = macroView.template begin< 0 > (); it != end; ++it )
182  {
183  const Entity& entity = * it ;
184  // check that corners are within the reference element of the given type
185  const auto &refElement = Dune::ReferenceElements< typename Grid::ctype, Grid::dimensionworld >::general( entity.type() );
186 
187  typedef typename Entity :: Geometry Geometry;
188  const Geometry& geo = entity.geometry();
189 
190  if( refElement.checkInside( geo.local( geo.center() ) ) )
191  return true ;
192  }
193  return false ;
194  }
195  };
196 
197 #if HAVE_DUNE_SPGRID
198  template <class DomainType, class ct, int dim, template< int > class Strategy , class Comm>
199  struct CheckDomain< DomainType, SPGrid< ct, dim, Strategy, Comm > >
200  {
201  typedef SPGrid< ct, dim, Strategy, Comm > Grid;
202  static bool isInside(const DomainType& x, const Grid& grid )
203  {
204  return grid.domain().contains( x );
205  }
206  };
207 #endif
208 
209  const int numProcs_;
210  std::vector< GridSolutionType* > solutions_;
211 
212  int numProcs(const std::string& checkPointFile) const
213  {
214  int numProc = MPIManager :: size();
215  readParameter(checkPointFile, "NumberProcessors", numProc, Parameter::verbose () );
216  return numProc;
217  }
218  public:
220  explicit GridSolutionVector(const std::string checkPointFile) :
221  numProcs_( numProcs( checkPointFile ) ),
223  {
224  for(int p=0; p<numProcs_; ++p)
225  {
226  if( Parameter::verbose () )
227  std::cout << "GridSolutionVector: Reading Grid " << p << " from checkpoint" << std::endl;
228  solutions_[ p ] = new GridSolutionType( checkPointFile, p );
229  }
230  }
231 
233  {
234  for(int p=0; p<numProcs_; ++p)
235  {
236  delete solutions_[ p ];
237  solutions_[ p ] = 0;
238  }
239  }
240 
248  void evaluate(const DomainType& x, const double time, RangeType& result) const
249  {
250  evaluate(x, result );
251  }
252 
259  void evaluate(const DomainType& x, RangeType& result) const
260  {
261  for(int p=0; p<numProcs_; ++p)
262  {
263  assert( solutions_[ p ] );
264  const GridSolutionType& gridSolution = *(solutions_[ p ]);
265  if( isInDomain( x, gridSolution.grid() ) )
266  {
267  //std::cout << "Found grid " << p << " for x = " << x << std::endl;
268  gridSolution.evaluate( x, result );
269  return ;
270  }
271  }
272 
273  std::cerr << "GridSolutionVector::evaluate: no grid found for point " << x << std::endl;
274  assert( false );
275  abort();
276  }
277 
278  bool isInDomain( const DomainType& x, const GridType& grid ) const
279  {
281  }
282 
284  static void writeDiscreteFunction(const GridType& grid,
286  const double time,
287  const int writeStep = 0 )
288  {
290  }
291 
292  const DiscreteFunctionType& discreteFunction( const int rank ) const
293  {
294  assert( rank < numProcs_ );
295  return solutions_[ rank ]->discreteFunction();
296  }
297  };
298 
299  } // namespace Fem
300 
301 } // namespace Dune
302 
303 #endif // #ifndef DUNE_FEM_GRIDSOLUTION_HH
Definition: bindguard.hh:11
static bool readParameter(std::istream &file, const std::string keyword, T &data, bool verbose=true, bool warn=true)
Definition: asciiparser.hh:18
typename Impl::ConstLocalFunction< GridFunction >::Type ConstLocalFunction
Definition: const.hh:517
Implementation of the IOInterface. This class manages checkpointing.
Definition: datawriter.hh:238
void restoreData()
Definition: datawriter.hh:636
static bool verbose()
obtain the cached value for fem.verbose
Definition: io/parameter.hh:445
creates a function with evaluate method from a check point
Definition: gridsolution.hh:33
ConstLocalFunction< DiscreteFunctionType > lf_
Definition: gridsolution.hh:56
void evaluate(const DomainType &x, RangeType &result) const
evaluates in a given space point
Definition: gridsolution.hh:101
GridPtr< GridType > gridPtr_
Definition: gridsolution.hh:52
GridType & grid()
Definition: gridsolution.hh:61
DiscreteFunctionSpaceType ::DomainType DomainType
Definition: gridsolution.hh:39
HierarchicSearch< GridType, IndexSetType > HierarchicSearchType
Definition: gridsolution.hh:46
DiscreteFunctionSpaceType ::RangeType RangeType
Definition: gridsolution.hh:38
GridType ::template Codim< 0 >::Entity EntityType
Definition: gridsolution.hh:44
CheckPointer< GridType > CheckPointerType
Definition: gridsolution.hh:42
IOTupleType data_
Definition: gridsolution.hh:57
DiscreteFunctionType ::DiscreteFunctionSpaceType DiscreteFunctionSpaceType
Definition: gridsolution.hh:37
const DiscreteFunctionType & discreteFunction() const
Definition: gridsolution.hh:138
DiscreteFunctionType discreteFunction_
Definition: gridsolution.hh:55
GridPartType ::IndexSetType IndexSetType
Definition: gridsolution.hh:41
const GridType & grid() const
Definition: gridsolution.hh:62
DiscreteFunctionSpaceType space_
Definition: gridsolution.hh:54
GridType * grid_
Definition: gridsolution.hh:51
void evaluate(const DomainType &x, const double time, RangeType &result) const
evaluates in a given space-time point
Definition: gridsolution.hh:90
HierarchicSearchType hierarchicSearch_
Definition: gridsolution.hh:58
GridPartType gridPart_
Definition: gridsolution.hh:53
GridSolution(const std::string checkPointFile, const int rank=-1)
Constructor.
Definition: gridsolution.hh:65
DiscreteFunctionSpaceType ::GridPartType GridPartType
Definition: gridsolution.hh:40
DiscreteFunctionImp DiscreteFunctionType
Definition: gridsolution.hh:36
static void writeDiscreteFunction(const GridType &grid, const DiscreteFunctionType &discreteFunction, const double time, const int writeStep)
writes a discrete function
Definition: gridsolution.hh:126
std::tuple< DiscreteFunctionType * > IOTupleType
Definition: gridsolution.hh:48
GridImp GridType
Definition: gridsolution.hh:35
Definition: gridsolution.hh:154
DiscreteFunctionType ::DiscreteFunctionSpaceType DiscreteFunctionSpaceType
Definition: gridsolution.hh:159
DiscreteFunctionSpaceType ::FunctionSpaceType FunctionSpaceType
Definition: gridsolution.hh:160
GridSolutionVector(const std::string checkPointFile)
Constructor.
Definition: gridsolution.hh:220
FunctionSpaceType ::DomainType DomainType
Definition: gridsolution.hh:162
DiscreteFunctionSpaceType ::GridPartType GridPartType
Definition: gridsolution.hh:161
bool isInDomain(const DomainType &x, const GridType &grid) const
Definition: gridsolution.hh:278
DiscreteFunctionImp DiscreteFunctionType
Definition: gridsolution.hh:157
std::vector< GridSolutionType * > solutions_
Definition: gridsolution.hh:210
~GridSolutionVector()
Definition: gridsolution.hh:232
void evaluate(const DomainType &x, RangeType &result) const
evaluates in a given space point
Definition: gridsolution.hh:259
FunctionSpaceType ::RangeFieldType RangeFieldType
Definition: gridsolution.hh:165
int numProcs(const std::string &checkPointFile) const
Definition: gridsolution.hh:212
void evaluate(const DomainType &x, const double time, RangeType &result) const
evaluates in a given space-time point
Definition: gridsolution.hh:248
GridSolution< GridType, DiscreteFunctionType > GridSolutionType
Definition: gridsolution.hh:167
static void writeDiscreteFunction(const GridType &grid, const DiscreteFunctionType &discreteFunction, const double time, const int writeStep=0)
writes a discrete function
Definition: gridsolution.hh:284
const DiscreteFunctionType & discreteFunction(const int rank) const
Definition: gridsolution.hh:292
FunctionSpaceType ::RangeType RangeType
Definition: gridsolution.hh:164
FunctionSpaceType ::DomainFieldType DomainFieldType
Definition: gridsolution.hh:163
const int numProcs_
Definition: gridsolution.hh:209
GridImp GridType
Definition: gridsolution.hh:156
Definition: gridsolution.hh:172
static bool isInside(const DomainType &x, const Grid &grid)
Definition: gridsolution.hh:173
static int size()
Definition: mpimanager.hh:160