dune-fem  2.4.1-rc
gridsolution.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_GRIDSOLUTION_HH
2 #define DUNE_FEM_GRIDSOLUTION_HH
3 
4 #include <dune/common/exceptions.hh>
5 #include <dune/grid/utility/hierarchicsearch.hh>
8 
9 #if HAVE_DUNE_SPGRID
10 #include <dune/grid/spgrid.hh>
11 #endif
12 
13 namespace Dune
14 {
15 
16  namespace Fem
17  {
18 
19  // GridSolution
20  //-------------
21 
28  template <class GridImp, class DiscreteFunctionImp >
30  {
31  public:
32  typedef GridImp GridType;
33  typedef DiscreteFunctionImp DiscreteFunctionType;
34  typedef typename DiscreteFunctionType :: DiscreteFunctionSpaceType DiscreteFunctionSpaceType;
35  typedef typename DiscreteFunctionSpaceType :: RangeType RangeType ;
36  typedef typename DiscreteFunctionSpaceType :: DomainType DomainType ;
37  typedef typename DiscreteFunctionSpaceType :: GridPartType GridPartType ;
38  typedef typename GridPartType :: IndexSetType IndexSetType;
40 
41  typedef typename GridType :: template Codim<0> :: EntityPointer EntityPointerType;
42  typedef typename GridType :: template Codim<0> :: Entity EntityType;
43 
44  typedef HierarchicSearch< GridType, IndexSetType > HierarchicSearchType;
45 
46  typedef tuple< DiscreteFunctionType* > IOTupleType;
47 
48  protected:
49  GridType* grid_;
50  GridPtr< GridType > gridPtr_;
51  GridPartType gridPart_;
52  DiscreteFunctionSpaceType space_;
53  DiscreteFunctionType discreteFunction_;
54  IOTupleType data_;
55  HierarchicSearchType hierarchicSearch_;
56 
57  public:
58  GridType& grid() { assert( grid_ ); return *grid_ ; }
59  const GridType& grid() const { assert( grid_ ); return *grid_ ; }
60 
62  explicit GridSolution(const std::string checkPointFile,
63  const int rank = -1 ) :
64  grid_( CheckPointerType :: restoreGrid( checkPointFile, rank ) ),
65  gridPtr_(),
66  gridPart_( grid() ),
67  space_( gridPart_ ),
68  discreteFunction_("grid-sol", space_),
69  data_( &discreteFunction_ ),
70  hierarchicSearch_( grid(), gridPart_.indexSet() )
71  {
72  // store grid pointer
73  gridPtr_ = grid_;
74  // restore data from checkpoint
75  CheckPointerType :: restoreData( grid(), data_, checkPointFile, rank );
76  }
77 
85  void evaluate(const DomainType& x, const double time, RangeType& result) const
86  {
87  evaluate(x, result );
88  }
89 
96  void evaluate(const DomainType& x, RangeType& result) const
97  {
98  // search entity
99  EntityPointerType ep = hierarchicSearch_.findEntity( x );
100  const EntityType& entity = *ep ;
101 
102  typedef typename EntityType :: Geometry Geometry;
103  const Geometry& geo = entity.geometry();
104 
105  const DomainType local = geo.local( x );
106 #ifndef NDEBUG
107  {
108  // check that corners are within the reference element of the given type
109  const Dune::ReferenceElement< typename GridType::ctype, GridType::dimensionworld > &refElement
110  = Dune::ReferenceElements< typename GridType::ctype, GridType::dimensionworld >::general( entity.type() );
111 
112  assert( refElement.checkInside( local ) );
113  }
114 #endif
115 
116  // evaluate discrete function
117  discreteFunction_.localFunction( entity ).evaluate( local, result );
118  }
119 
121  static void writeDiscreteFunction(const GridType& grid,
122  const DiscreteFunctionType& discreteFunction,
123  const double time,
124  const int writeStep )
125  {
126  typedef tuple< const DiscreteFunctionType* > OutputTuple;
127  OutputTuple data( &discreteFunction );
128  // false means don't backup persistent objects
129  CheckPointerType :: writeSingleCheckPoint( grid, data, time, false, writeStep );
130  }
131 
132  const DiscreteFunctionType& discreteFunction() const { return discreteFunction_ ; }
133  };
134 
136  //
137  //
138  //
140 
146  template <class GridImp, class DiscreteFunctionImp >
148  {
149  public:
150  typedef GridImp GridType;
151  typedef DiscreteFunctionImp DiscreteFunctionType;
152 
153  typedef typename DiscreteFunctionType :: DiscreteFunctionSpaceType DiscreteFunctionSpaceType;
154  typedef typename DiscreteFunctionSpaceType :: FunctionSpaceType FunctionSpaceType;
155  typedef typename DiscreteFunctionSpaceType :: GridPartType GridPartType;
156  typedef typename FunctionSpaceType :: DomainType DomainType;
157  typedef typename FunctionSpaceType :: DomainFieldType DomainFieldType;
158  typedef typename FunctionSpaceType :: RangeType RangeType;
159  typedef typename FunctionSpaceType :: RangeFieldType RangeFieldType;
160 
162 
163  protected:
164  template <class DomainType, class Grid>
165  struct CheckDomain
166  {
167  static bool isInside(const DomainType& x, const Grid& grid )
168  {
169  abort();
170  typedef typename Grid :: LevelGridView MacroView ;
171  typedef typename MacroView :: template Codim< 0 > :: Iterator Iterator ;
172  typedef typename Iterator :: Entity Entity;
173  const MacroView& macroView = grid.levelGridView( 0 );
174  const Iterator end = macroView.template end< 0 > ();
175  for( Iterator it = macroView.template begin< 0 > (); it != end; ++it )
176  {
177  const Entity& entity = * it ;
178  // check that corners are within the reference element of the given type
179  const Dune::ReferenceElement< typename Grid::ctype, Grid::dimensionworld > &refElement
180  = Dune::ReferenceElements< typename Grid::ctype, Grid::dimensionworld >::general( entity.type() );
181 
182  typedef typename Entity :: Geometry Geometry;
183  const Geometry& geo = entity.geometry();
184 
185  if( refElement.checkInside( geo.local( geo.center() ) ) )
186  return true ;
187  }
188  return false ;
189  }
190  };
191 
192 #if HAVE_DUNE_SPGRID
193  template <class DomainType, class ct, int dim, template< int > class Strategy , class Comm>
194  struct CheckDomain< DomainType, SPGrid< ct, dim, Strategy, Comm > >
195  {
196  typedef SPGrid< ct, dim, Strategy, Comm > Grid;
197  static bool isInside(const DomainType& x, const Grid& grid )
198  {
199  return grid.domain().contains( x );
200  }
201  };
202 #endif
203 
204  const int numProcs_;
205  std::vector< GridSolutionType* > solutions_;
206 
207  int numProcs(const std::string& checkPointFile) const
208  {
209  int numProc = MPIManager :: size();
210  readParameter(checkPointFile, "NumberProcessors", numProc, Parameter::verbose () );
211  return numProc;
212  }
213  public:
215  explicit GridSolutionVector(const std::string checkPointFile) :
216  numProcs_( numProcs( checkPointFile ) ),
217  solutions_( numProcs_, (GridSolutionType *) 0 )
218  {
219  for(int p=0; p<numProcs_; ++p)
220  {
221  if( Parameter::verbose () )
222  std::cout << "GridSolutionVector: Reading Grid " << p << " from checkpoint" << std::endl;
223  solutions_[ p ] = new GridSolutionType( checkPointFile, p );
224  }
225  }
226 
228  {
229  for(int p=0; p<numProcs_; ++p)
230  {
231  delete solutions_[ p ];
232  solutions_[ p ] = 0;
233  }
234  }
235 
243  void evaluate(const DomainType& x, const double time, RangeType& result) const
244  {
245  evaluate(x, result );
246  }
247 
254  void evaluate(const DomainType& x, RangeType& result) const
255  {
256  for(int p=0; p<numProcs_; ++p)
257  {
258  assert( solutions_[ p ] );
259  const GridSolutionType& gridSolution = *(solutions_[ p ]);
260  if( isInDomain( x, gridSolution.grid() ) )
261  {
262  //std::cout << "Found grid " << p << " for x = " << x << std::endl;
263  gridSolution.evaluate( x, result );
264  return ;
265  }
266  }
267 
268  std::cerr << "GridSolutionVector::evaluate: no grid found for point " << x << std::endl;
269  assert( false );
270  abort();
271  }
272 
273  bool isInDomain( const DomainType& x, const GridType& grid ) const
274  {
276  }
277 
279  static void writeDiscreteFunction(const GridType& grid,
280  const DiscreteFunctionType& discreteFunction,
281  const double time,
282  const int writeStep = 0 )
283  {
284  GridSolutionType :: writeDiscreteFunction( grid, discreteFunction, time, writeStep );
285  }
286 
287  const DiscreteFunctionType& discreteFunction( const int rank ) const
288  {
289  assert( rank < numProcs_ );
290  return solutions_[ rank ]->discreteFunction();
291  }
292  };
293 
294  } // namespace Fem
295 
296 } // namespace Dune
297 
298 #endif // #ifndef DUNE_FEM_GRIDSOLUTION_HH
DiscreteFunctionSpaceType space_
Definition: gridsolution.hh:52
static void writeDiscreteFunction(const GridType &grid, const DiscreteFunctionType &discreteFunction, const double time, const int writeStep)
writes a discrete function
Definition: gridsolution.hh:121
DiscreteFunctionSpaceType::RangeType RangeType
Definition: gridsolution.hh:35
GridPartType gridPart_
Definition: gridsolution.hh:51
DiscreteFunctionType discreteFunction_
Definition: gridsolution.hh:53
HierarchicSearchType hierarchicSearch_
Definition: gridsolution.hh:55
const GridType & grid() const
Definition: gridsolution.hh:59
FunctionSpaceType::RangeType RangeType
Definition: gridsolution.hh:158
HierarchicSearch< GridType, IndexSetType > HierarchicSearchType
Definition: gridsolution.hh:44
Implementation of the IOInterface. This class manages checkpointing.
Definition: datawriter.hh:239
FunctionSpaceType::DomainType DomainType
Definition: gridsolution.hh:156
Definition: gridsolution.hh:165
std::vector< GridSolutionType * > solutions_
Definition: gridsolution.hh:205
static int size()
Definition: mpimanager.hh:121
IOTupleType data_
Definition: gridsolution.hh:54
DiscreteFunctionType::DiscreteFunctionSpaceType DiscreteFunctionSpaceType
Definition: gridsolution.hh:153
void evaluate(const DomainType &x, RangeType &result) const
evaluates in a given space point
Definition: gridsolution.hh:254
static void writeSingleCheckPoint(const GridType &grid, OutputTuple &data, const double time, const bool storePersistenceManager, const int writeStep=0)
Definition: datawriter.hh:679
GridSolutionVector(const std::string checkPointFile)
Constructor.
Definition: gridsolution.hh:215
static bool readParameter(std::istream &file, const std::string keyword, T &data, bool verbose=true, bool warn=true)
Definition: asciiparser.hh:18
void evaluate(const DomainType &x, const double time, RangeType &result) const
evaluates in a given space-time point
Definition: gridsolution.hh:85
DiscreteFunctionImp DiscreteFunctionType
Definition: gridsolution.hh:151
DiscreteFunctionSpaceType::FunctionSpaceType FunctionSpaceType
Definition: gridsolution.hh:154
GridImp GridType
Definition: gridsolution.hh:32
bool isInDomain(const DomainType &x, const GridType &grid) const
Definition: gridsolution.hh:273
void evaluate(const DomainType &x, const double time, RangeType &result) const
evaluates in a given space-time point
Definition: gridsolution.hh:243
GridPartType::IndexSetType IndexSetType
Definition: gridsolution.hh:38
GridSolution< GridType, DiscreteFunctionType > GridSolutionType
Definition: gridsolution.hh:161
Definition: gridsolution.hh:147
GridType::template Codim< 0 >::Entity EntityType
Definition: gridsolution.hh:42
GridType & grid()
Definition: gridsolution.hh:58
Definition: coordinate.hh:4
tuple< DiscreteFunctionType * > IOTupleType
Definition: gridsolution.hh:46
FunctionSpaceType::DomainFieldType DomainFieldType
Definition: gridsolution.hh:157
GridType::template Codim< 0 >::EntityPointer EntityPointerType
Definition: gridsolution.hh:41
DiscreteFunctionSpaceType::GridPartType GridPartType
Definition: gridsolution.hh:37
static void writeDiscreteFunction(const GridType &grid, const DiscreteFunctionType &discreteFunction, const double time, const int writeStep=0)
writes a discrete function
Definition: gridsolution.hh:279
const DiscreteFunctionType & discreteFunction(const int rank) const
Definition: gridsolution.hh:287
void restoreData()
Definition: datawriter.hh:659
void evaluate(const DomainType &x, RangeType &result) const
evaluates in a given space point
Definition: gridsolution.hh:96
creates a function with evaluate method from a check point
Definition: gridsolution.hh:29
DiscreteFunctionSpaceType::GridPartType GridPartType
Definition: gridsolution.hh:155
static bool verbose()
obtain the cached value for fem.verbose
Definition: io/parameter.hh:444
GridType * grid_
Definition: gridsolution.hh:49
const int numProcs_
Definition: gridsolution.hh:204
static bool isInside(const DomainType &x, const Grid &grid)
Definition: gridsolution.hh:167
int numProcs(const std::string &checkPointFile) const
Definition: gridsolution.hh:207
DiscreteFunctionSpaceType::DomainType DomainType
Definition: gridsolution.hh:36
const DiscreteFunctionType & discreteFunction() const
Definition: gridsolution.hh:132
FunctionSpaceType::RangeFieldType RangeFieldType
Definition: gridsolution.hh:159
CheckPointer< GridType > CheckPointerType
Definition: gridsolution.hh:39
GridImp GridType
Definition: gridsolution.hh:150
DiscreteFunctionType::DiscreteFunctionSpaceType DiscreteFunctionSpaceType
Definition: gridsolution.hh:34
DiscreteFunctionImp DiscreteFunctionType
Definition: gridsolution.hh:33
GridPtr< GridType > gridPtr_
Definition: gridsolution.hh:50
GridSolution(const std::string checkPointFile, const int rank=-1)
Constructor.
Definition: gridsolution.hh:62
~GridSolutionVector()
Definition: gridsolution.hh:227