dune-fem 2.8.0
Loading...
Searching...
No Matches
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
16namespace 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() ),
71 discreteFunction_("grid-sol", space_),
74 hierarchicSearch_( grid(), gridPart_.indexSet() )
75 {
76 // store grid pointer
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
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>
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 {
289 GridSolutionType :: writeDiscreteFunction( grid, discreteFunction, time, writeStep );
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:604
Implementation of the IOInterface. This class manages checkpointing.
Definition: datawriter.hh:238
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
DiscreteFunctionSpaceType::DomainType DomainType
Definition: gridsolution.hh:39
GridPtr< GridType > gridPtr_
Definition: gridsolution.hh:52
const GridType & grid() const
Definition: gridsolution.hh:62
HierarchicSearch< GridType, IndexSetType > HierarchicSearchType
Definition: gridsolution.hh:46
GridType & grid()
Definition: gridsolution.hh:61
DiscreteFunctionSpaceType::GridPartType GridPartType
Definition: gridsolution.hh:40
CheckPointer< GridType > CheckPointerType
Definition: gridsolution.hh:42
DiscreteFunctionSpaceType::RangeType RangeType
Definition: gridsolution.hh:38
IOTupleType data_
Definition: gridsolution.hh:57
const DiscreteFunctionType & discreteFunction() const
Definition: gridsolution.hh:138
DiscreteFunctionType discreteFunction_
Definition: gridsolution.hh:55
DiscreteFunctionSpaceType space_
Definition: gridsolution.hh:54
GridType * grid_
Definition: gridsolution.hh:51
GridPartType::IndexSetType IndexSetType
Definition: gridsolution.hh:41
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
DiscreteFunctionType::DiscreteFunctionSpaceType DiscreteFunctionSpaceType
Definition: gridsolution.hh:37
GridType::template Codim< 0 >::Entity EntityType
Definition: gridsolution.hh:44
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::DomainFieldType DomainFieldType
Definition: gridsolution.hh:163
bool isInDomain(const DomainType &x, const GridType &grid) const
Definition: gridsolution.hh:278
DiscreteFunctionImp DiscreteFunctionType
Definition: gridsolution.hh:157
FunctionSpaceType::DomainType DomainType
Definition: gridsolution.hh:162
std::vector< GridSolutionType * > solutions_
Definition: gridsolution.hh:210
~GridSolutionVector()
Definition: gridsolution.hh:232
const DiscreteFunctionType & discreteFunction(const int rank) const
Definition: gridsolution.hh:292
FunctionSpaceType::RangeFieldType RangeFieldType
Definition: gridsolution.hh:165
void evaluate(const DomainType &x, RangeType &result) const
evaluates in a given space point
Definition: gridsolution.hh:259
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
FunctionSpaceType::RangeType RangeType
Definition: gridsolution.hh:164
DiscreteFunctionSpaceType::GridPartType GridPartType
Definition: gridsolution.hh:161
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