3#ifndef DUNE_DGFPARSERYASP_HH
4#define DUNE_DGFPARSERYASP_HH
16 template<
class Gr
idImp,
class IntersectionImp >
55 dwarn <<
"GridParameterBlock: found keyword `overlap' but no value, defaulting to `" <<
_overlap <<
"' !\n";
65 dwarn <<
"YaspGridParameterBlock: Parameter 'overlap' not specified, "
84 template <
typename ctype,
int dim>
99 generate( input, comm );
108 generate( input, comm );
113 delete boundaryDomainBlock_;
121 template <
class Intersection>
127 template <
class Intersection>
130 if( boundaryDomainBlock_->isactive() )
133 getCorners( intersection.
geometry(), corners );
134 const dgf::DomainData *data = boundaryDomainBlock_->contains( corners );
144 template<
int codim >
153 return boundaryDomainBlock_->hasParameter();
156 template<
class GG,
class II >
163 getCorners( intersection.
geometry(), corners );
164 const dgf::DomainData *data = boundaryDomainBlock_->contains( corners );
166 return data->parameter();
174 template<
class Entity >
183 template<
class Geometry >
187 for(
int i = 0; i < geometry.
corners(); ++i )
191 corners[ i ][ j ] = corner[ j ];
196 dgf::BoundaryDomBlock *boundaryDomainBlock_;
201 template<
typename ctype,
int dim >
202 inline void DGFGridFactory< YaspGrid< dim , EquidistantCoordinates<ctype, dim> > >
203 ::generate (
std::istream &gridin, MPICommunicatorType comm )
206 dgf::IntervalBlock intervalBlock( gridin );
208 if( !intervalBlock.isactive() )
209 DUNE_THROW( DGFException,
"YaspGrid can only be created from an interval block." );
211 if( intervalBlock.numIntervals() != 1 )
212 DUNE_THROW( DGFException,
"YaspGrid can only handle 1 interval block." );
214 if( intervalBlock.dimw() !=
dim )
217 "Cannot read an interval of dimension " << intervalBlock.dimw()
218 <<
" into a YaspGrid< " <<
dim <<
" >." );
221 const dgf::IntervalBlock::Interval &interval = intervalBlock.get( 0 );
223 FieldVector<ctype, dim> lang;
225 for(
int i = 0; i <
dim; ++i )
228 if(
abs( interval.p[ 0 ][ i ] ) > 1e-10 )
231 "YaspGrid cannot handle grids with non-zero left lower corner." );
234 lang[ i ] = interval.p[ 1 ][ i ] - interval.p[ 0 ][ i ];
235 anz[ i ] = interval.n[ i ];
238 typedef dgf::PeriodicFaceTransformationBlock::AffineTransformation Transformation;
239 dgf::PeriodicFaceTransformationBlock trafoBlock( gridin,
dim );
241 const int numTrafos = trafoBlock.numTransformations();
242 for(
int k = 0; k < numTrafos; ++k )
244 const Transformation &trafo = trafoBlock.transformation( k );
246 bool identity =
true;
247 for(
int i = 0; i <
dim; ++i )
248 for(
int j = 0; j <
dim; ++j )
249 identity &= (
abs( (i == j ? 1.0 : 0.0) - trafo.matrix( i, j ) ) < 1e-10);
251 DUNE_THROW( DGFException,
"YaspGrid can only handle shifts as periodic face transformations." );
255 for(
int i = 0; i <
dim; ++i )
257 if(
abs( trafo.shift[ i ] ) < 1e-10 )
262 if( (numDirs != 1) || (
abs(
abs( trafo.shift[ dir ] ) - lang[ dir ] ) >= 1e-10) )
265 <<
"' does not map boundaries on boundaries." <<
std::endl;
272 dgf::YaspGridParameterBlock grdParam( gridin );
274 grid_ =
new YaspGrid< dim , EquidistantCoordinates<ctype, dim> >( lang, anz, per, grdParam.overlap(), comm );
276 boundaryDomainBlock_ =
new dgf::BoundaryDomBlock( gridin, dimension );
279 template <
typename ctype,
int dim>
288 template <
typename ctype,
int dim>
303 generate( input, comm );
310 generate( input, comm );
315 delete boundaryDomainBlock_;
323 template <
class Intersection>
329 template <
class Intersection>
332 if( boundaryDomainBlock_->isactive() )
335 getCorners( intersection.
geometry(), corners );
336 const dgf::DomainData *data = boundaryDomainBlock_->contains( corners );
346 template<
int codim >
355 return boundaryDomainBlock_->hasParameter();
358 template<
class GG,
class II >
365 getCorners( intersection.
geometry(), corners );
366 const dgf::DomainData *data = boundaryDomainBlock_->contains( corners );
368 return data->parameter();
376 template<
class Entity >
385 template<
class Geometry >
389 for(
int i = 0; i < geometry.
corners(); ++i )
393 corners[ i ][ j ] = corner[ j ];
398 dgf::BoundaryDomBlock *boundaryDomainBlock_;
403 template<
typename ctype,
int dim >
404 inline void DGFGridFactory< YaspGrid<dim, EquidistantOffsetCoordinates<ctype, dim> > >
405 ::generate (
std::istream &gridin, MPICommunicatorType comm )
408 dgf::IntervalBlock intervalBlock( gridin );
410 if( !intervalBlock.isactive() )
411 DUNE_THROW( DGFException,
"YaspGrid can only be created from an interval block." );
413 if( intervalBlock.numIntervals() != 1 )
414 DUNE_THROW( DGFException,
"YaspGrid can only handle 1 interval block." );
416 if( intervalBlock.dimw() !=
dim )
419 "Cannot read an interval of dimension "
420 << intervalBlock.dimw()
421 <<
" into a YaspGrid< " <<
dim <<
" >." );
424 const dgf::IntervalBlock::Interval &interval = intervalBlock.get( 0 );
426 FieldVector<ctype, dim> lower;
427 FieldVector<ctype, dim> upper;
429 for(
int i = 0; i <
dim; ++i )
431 lower[ i ] = interval.p[ 0 ][ i ];
432 upper[ i ] = interval.p[ 1 ][ i ];
433 anz[ i ] = interval.n[ i ];
436 typedef dgf::PeriodicFaceTransformationBlock::AffineTransformation Transformation;
437 dgf::PeriodicFaceTransformationBlock trafoBlock( gridin,
dim );
439 const int numTrafos = trafoBlock.numTransformations();
440 for(
int k = 0; k < numTrafos; ++k )
442 const Transformation &trafo = trafoBlock.transformation( k );
444 bool identity =
true;
445 for(
int i = 0; i <
dim; ++i )
446 for(
int j = 0; j <
dim; ++j )
447 identity &= (
abs( (i == j ? 1.0 : 0.0) - trafo.matrix( i, j ) ) < 1e-10);
449 DUNE_THROW( DGFException,
"YaspGrid can only handle shifts as periodic face transformations." );
453 for(
int currentDir = 0; currentDir <
dim; ++currentDir )
455 if(
abs( trafo.shift[ currentDir ] ) > 1e-10 )
462 || (
abs(
abs( trafo.shift[ dir ] ) -
abs( upper[ dir ] - lower[ dir ] ) ) >= 1e-10) )
465 <<
"' does not map boundaries on boundaries." <<
std::endl;
469 periodic[ dir ] =
true;
474 dgf::YaspGridParameterBlock grdParam( gridin );
476 grid_ =
new YaspGrid< dim, EquidistantOffsetCoordinates<ctype, dim> >
477 ( lower, upper, anz, periodic, grdParam.overlap(), comm );
479 boundaryDomainBlock_ =
new dgf::BoundaryDomBlock( gridin, dimension );
482 template <
typename ctype,
int dim>
void abs(const DofVectorPointer< int > &dofVector)
Definition dofvector.hh:326
Include standard header files.
static MPICommunicator getCommunicator()
Definition dgfgridfactory.hh:36
MPIHelper::MPICommunicator MPICommunicatorType
Definition dgfgridfactory.hh:39
G Grid
Definition dgfgridfactory.hh:37
static const int dimension
Definition dgfgridfactory.hh:38
bool haveBoundaryParameters() const
Definition dgfgridfactory.hh:149
Intersection of a mesh entity of codimension 0 ("element") with a "neighboring" element or with the d...
Definition common/intersection.hh:162
Geometry geometry() const
geometrical information about the intersection in global coordinates.
Definition common/intersection.hh:321
int indexInInside() const
Local index of codim 1 entity in the inside() entity where intersection is contained in.
Definition common/intersection.hh:344
Wrapper class for entities.
Definition common/entity.hh:64
Wrapper class for geometries.
Definition common/geometry.hh:67
GlobalCoordinate corner(int i) const
Obtain a corner of the geometry.
Definition common/geometry.hh:156
int corners() const
Return the number of corners of the reference element.
Definition common/geometry.hh:142
@ dimension
The dimension of the grid.
Definition common/grid.hh:386
bool findtoken(std ::string token)
Definition basic.cc:121
bool getnextentry(ENTRY &entry)
Definition basic.hh:61
Definition boundarydom.hh:21
Definition boundarydom.hh:193
Common Grid parameters.
Definition gridparameter.hh:33
exception class for IO errors in the DGF parser
Definition dgfexception.hh:14
Some simple static information for a given GridType.
Definition io/file/dgfparser/dgfparser.hh:54
Grid parameters for YaspGrid.
Definition dgfyasp.hh:38
int _overlap
Definition dgfyasp.hh:40
YaspGridParameterBlock(std::istream &in)
constructor taking istream
Definition dgfyasp.hh:44
int overlap() const
get dimension of world found in block
Definition dgfyasp.hh:72
DGFGridFactory(std::istream &input, MPICommunicatorType comm=MPIHelper::getCommunicator())
Definition dgfyasp.hh:96
DGFGridFactory(const std::string &filename, MPICommunicatorType comm=MPIHelper::getCommunicator())
Definition dgfyasp.hh:102
bool wasInserted(const Intersection &intersection) const
Definition dgfyasp.hh:122
int numParameters() const
Definition dgfyasp.hh:145
std::vector< double > & parameter(const Entity &)
Definition dgfyasp.hh:175
MPIHelper::MPICommunicator MPICommunicatorType
Definition dgfyasp.hh:89
const DGFBoundaryParameter::type & boundaryParameter(const Intersection< GG, II > &intersection) const
Definition dgfyasp.hh:158
~DGFGridFactory()
Definition dgfyasp.hh:111
bool haveBoundaryParameters() const
Definition dgfyasp.hh:151
Grid * grid() const
Definition dgfyasp.hh:116
YaspGrid< dim, EquidistantCoordinates< ctype, dim > > Grid
Definition dgfyasp.hh:87
int boundaryId(const Intersection &intersection) const
Definition dgfyasp.hh:128
static int refineStepsForHalf()
Definition dgfyasp.hh:281
static double refineWeight()
Definition dgfyasp.hh:282
const DGFBoundaryParameter::type & boundaryParameter(const Intersection< GG, II > &intersection) const
Definition dgfyasp.hh:360
DGFGridFactory(const std::string &filename, MPICommunicatorType comm=MPIHelper::getCommunicator())
Definition dgfyasp.hh:306
Grid * grid() const
Definition dgfyasp.hh:318
int boundaryId(const Intersection &intersection) const
Definition dgfyasp.hh:330
YaspGrid< dim, EquidistantOffsetCoordinates< ctype, dim > > Grid
Definition dgfyasp.hh:291
bool wasInserted(const Intersection &intersection) const
Definition dgfyasp.hh:324
std::vector< double > & parameter(const Entity &entity)
Definition dgfyasp.hh:377
bool haveBoundaryParameters() const
Definition dgfyasp.hh:353
MPIHelper::MPICommunicator MPICommunicatorType
Definition dgfyasp.hh:293
DGFGridFactory(std::istream &input, MPICommunicatorType comm=MPIHelper::getCommunicator())
Definition dgfyasp.hh:300
~DGFGridFactory()
Definition dgfyasp.hh:313
int numParameters() const
Definition dgfyasp.hh:347
static double refineWeight()
Definition dgfyasp.hh:485
static int refineStepsForHalf()
Definition dgfyasp.hh:484
static const type & defaultValue()
default constructor
Definition parser.hh:26
[ provides Dune::Grid ]
Definition yaspgrid.hh:160
Container for equidistant coordinates in a YaspGrid.
Definition coordinates.hh:27
Container for equidistant coordinates in a YaspGrid with non-trivial origin.
Definition coordinates.hh:129