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, "
66 <<
"defaulting to '" << _overlap <<
"'." << std::endl;
92 typedef FieldVector< double, dimension > Point;
97 MPICommunicatorType comm = MPIHelper::getCommunicator() )
99 generate( input, comm );
103 MPICommunicatorType comm = MPIHelper::getCommunicator() )
105 std::ifstream input( filename.c_str() );
106 generate( input, comm );
111 delete boundaryDomainBlock_;
119 template <
class Intersection>
125 template <
class Intersection>
128 if( boundaryDomainBlock_->isactive() )
130 std::vector< Point > corners;
131 getCorners( intersection.
geometry(), corners );
132 const dgf::DomainData *data = boundaryDomainBlock_->contains( corners );
142 template<
int codim >
151 return boundaryDomainBlock_->hasParameter();
154 template<
class GG,
class II >
160 std::vector< Point > corners;
161 getCorners( intersection.
geometry(), corners );
162 const dgf::DomainData *data = boundaryDomainBlock_->contains( corners );
172 template<
class Entity >
179 void generate( std::istream &gridin, MPICommunicatorType comm );
181 template<
class Geometry >
182 static void getCorners (
const Geometry &geometry, std::vector< Point > &corners )
184 corners.resize( geometry.
corners() );
185 for(
int i = 0; i < geometry.
corners(); ++i )
189 corners[ i ][ j ] = corner[ j ];
194 dgf::BoundaryDomBlock *boundaryDomainBlock_;
195 std::vector<double> emptyParam;
200 inline void DGFGridFactory< YaspGrid< dim > >
201 ::generate ( std::istream &gridin, MPICommunicatorType comm )
203 dgf::IntervalBlock intervalBlock( gridin );
205 if( !intervalBlock.isactive() )
206 DUNE_THROW( DGFException,
"YaspGrid can only be created from an interval block." );
208 if( intervalBlock.numIntervals() != 1 )
209 DUNE_THROW( DGFException,
"YaspGrid can only handle 1 interval block." );
211 if( intervalBlock.dimw() != dim )
213 DUNE_THROW( DGFException,
214 "Cannot read an interval of dimension " << intervalBlock.dimw()
215 <<
" into a YaspGrid< " << dim <<
" >." );
218 const dgf::IntervalBlock::Interval &interval = intervalBlock.get( 0 );
220 FieldVector<double,dim> lang;
221 std::array<int,dim> anz;
222 for(
int i = 0; i < dim; ++i )
225 if(
std::abs( interval.p[ 0 ][ i ] ) > 1e-10 )
227 DUNE_THROW( DGFException,
228 "YaspGrid cannot handle grids with non-zero left lower corner." );
231 lang[ i ] = interval.p[ 1 ][ i ] - interval.p[ 0 ][ i ];
232 anz[ i ] = interval.n[ i ];
236 dgf::PeriodicFaceTransformationBlock trafoBlock( gridin, dim );
237 std::bitset< dim > per;
238 const int numTrafos = trafoBlock.numTransformations();
239 for(
int k = 0; k < numTrafos; ++k )
241 const Transformation &trafo = trafoBlock.transformation( k );
243 bool identity =
true;
244 for(
int i = 0; i < dim; ++i )
245 for(
int j = 0; j < dim; ++j )
246 identity &= (
std::abs( (i == j ? 1.0 : 0.0) - trafo.matrix( i, j ) ) < 1e-10);
248 DUNE_THROW( DGFException,
"YaspGrid can only handle shifts as periodic face transformations." );
252 for(
int i = 0; i < dim; ++i )
254 if(
std::abs( trafo.shift[ i ] ) < 1e-10 )
259 if( (numDirs != 1) || (
std::abs(
std::abs( trafo.shift[ dir ] ) - lang[ dir ] ) >= 1e-10) )
261 std::cerr <<
"Tranformation '" << trafo
262 <<
"' does not map boundaries on boundaries." << std::endl;
269 dgf::YaspGridParameterBlock grdParam( gridin );
271 grid_ =
new YaspGrid< dim >( lang, anz, per, grdParam.overlap(), comm );
273 boundaryDomainBlock_ =
new dgf::BoundaryDomBlock( gridin, dimension );
293 typedef FieldVector< double, dimension > Point;
298 MPICommunicatorType comm = MPIHelper::getCommunicator() )
300 generate( input, comm );
304 MPICommunicatorType comm = MPIHelper::getCommunicator() )
306 std::ifstream input( filename.c_str() );
307 generate( input, comm );
312 delete boundaryDomainBlock_;
320 template <
class Intersection>
326 template <
class Intersection>
329 if( boundaryDomainBlock_->isactive() )
331 std::vector< Point > corners;
332 getCorners( intersection.
geometry(), corners );
333 const dgf::DomainData *data = boundaryDomainBlock_->contains( corners );
343 template<
int codim >
352 return boundaryDomainBlock_->hasParameter();
355 template<
class GG,
class II >
361 std::vector< Point > corners;
362 getCorners( intersection.
geometry(), corners );
363 const dgf::DomainData *data = boundaryDomainBlock_->contains( corners );
373 template<
class Entity >
380 void generate( std::istream &gridin, MPICommunicatorType comm );
382 template<
class Geometry >
383 static void getCorners (
const Geometry &geometry, std::vector< Point > &corners )
385 corners.resize( geometry.
corners() );
386 for(
int i = 0; i < geometry.
corners(); ++i )
390 corners[ i ][ j ] = corner[ j ];
395 dgf::BoundaryDomBlock *boundaryDomainBlock_;
396 std::vector<double> emptyParam;
401 inline void DGFGridFactory< YaspGrid<dim, EquidistantOffsetCoordinates<double, dim> > >
402 ::generate ( std::istream &gridin, MPICommunicatorType comm )
404 dgf::IntervalBlock intervalBlock( gridin );
406 if( !intervalBlock.isactive() )
407 DUNE_THROW( DGFException,
"YaspGrid can only be created from an interval block." );
409 if( intervalBlock.numIntervals() != 1 )
410 DUNE_THROW( DGFException,
"YaspGrid can only handle 1 interval block." );
412 if( intervalBlock.dimw() != dim )
414 DUNE_THROW( DGFException,
415 "Cannot read an interval of dimension "
416 << intervalBlock.dimw()
417 <<
" into a YaspGrid< " << dim <<
" >." );
420 const dgf::IntervalBlock::Interval &interval = intervalBlock.get( 0 );
422 FieldVector<double,dim> lower;
423 FieldVector<double,dim> upper;
424 std::array<int,dim> anz;
425 for(
int i = 0; i < dim; ++i )
427 lower[ i ] = interval.p[ 0 ][ i ];
428 upper[ i ] = interval.p[ 1 ][ i ];
429 anz[ i ] = interval.n[ i ];
433 dgf::PeriodicFaceTransformationBlock trafoBlock( gridin, dim );
434 std::bitset< dim > periodic;
435 const int numTrafos = trafoBlock.numTransformations();
436 for(
int k = 0; k < numTrafos; ++k )
438 const Transformation &trafo = trafoBlock.transformation( k );
440 bool identity =
true;
441 for(
int i = 0; i < dim; ++i )
442 for(
int j = 0; j < dim; ++j )
443 identity &= (
std::abs( (i == j ? 1.0 : 0.0) - trafo.matrix( i, j ) ) < 1e-10);
445 DUNE_THROW( DGFException,
"YaspGrid can only handle shifts as periodic face transformations." );
449 for(
int currentDir = 0; currentDir < dim; ++currentDir )
451 if(
std::abs( trafo.shift[ currentDir ] ) > 1e-10 )
460 std::cerr <<
"Tranformation '" << trafo
461 <<
"' does not map boundaries on boundaries." << std::endl;
465 periodic[ dir ] =
true;
470 dgf::YaspGridParameterBlock grdParam( gridin );
472 grid_ =
new YaspGrid< dim, EquidistantOffsetCoordinates<double, dim> >
473 ( lower, upper, anz, periodic, grdParam.overlap(), comm );
475 boundaryDomainBlock_ =
new dgf::BoundaryDomBlock( gridin, dimension );
485 #endif // #ifndef DUNE_DGFPARSERYASP_HH
Intersection of a mesh entities of codimension 0 ("elements") with a "neighboring" element or with th...
Definition: albertagrid/dgfparser.hh:26
bool haveBoundaryParameters() const
Definition: dgfgridfactory.hh:156
YaspGrid< dim, EquidistantOffsetCoordinates< double, dim > > Grid
Definition: dgfyasp.hh:288
bool wasInserted(const Intersection &intersection) const
Definition: dgfyasp.hh:120
~DGFGridFactory()
Definition: dgfyasp.hh:310
[ provides Dune::Grid ]
Definition: yaspgrid.hh:56
static double refineWeight()
Definition: dgfyasp.hh:481
bool haveBoundaryParameters() const
Definition: dgfyasp.hh:350
std::vector< double > & parameter(const Entity &entity)
Definition: dgfyasp.hh:173
static int refineStepsForHalf()
Definition: dgfyasp.hh:278
Geometry geometry() const
geometrical information about the intersection in global coordinates.
Definition: common/intersection.hh:373
int _overlap
Definition: dgfyasp.hh:40
MPIHelper::MPICommunicator MPICommunicatorType
Definition: dgfyasp.hh:290
void abs(const DofVectorPointer< int > &dofVector)
Definition: dofvector.hh:326
Common Grid parametersFor each grid implementation there is a set of parameters that can be passed vi...
Definition: gridparameter.hh:31
Wrapper class for entities.
Definition: common/entity.hh:61
DGFGridFactory(std::istream &input, MPICommunicatorType comm=MPIHelper::getCommunicator())
Definition: dgfyasp.hh:297
Grid * grid() const
Definition: dgfyasp.hh:114
YaspGrid< dim > Grid
Definition: dgfyasp.hh:87
DGFGridFactory(const std::string &filename, MPICommunicatorType comm=MPIHelper::getCommunicator())
Definition: dgfyasp.hh:102
int boundaryId(const Intersection &intersection) const
Definition: dgfyasp.hh:327
static double refineWeight()
Definition: dgfyasp.hh:279
DGFGridFactory(const std::string &filename, MPICommunicatorType comm=MPIHelper::getCommunicator())
Definition: dgfyasp.hh:303
ALBERTA AFF_TRAFO AffineTransformation
Definition: misc.hh:49
int corners() const
Return the number of corners of the reference element.
Definition: common/geometry.hh:142
Wrapper class for geometries.
Definition: common/geometry.hh:65
int numParameters() const
Definition: dgfyasp.hh:344
Grid parameters for YaspGridThe YaspGridParameter class is in charge of passing parameters specific t...
Definition: dgfyasp.hh:36
MPIHelper::MPICommunicator MPICommunicatorType
Definition: dgfyasp.hh:89
bool wasInserted(const Intersection &intersection) const
Definition: dgfyasp.hh:321
int boundaryId(const Intersection &intersection) const
Definition: dgfyasp.hh:126
GlobalCoordinate corner(int i) const
Obtain a corner of the geometry.
Definition: common/geometry.hh:156
static int refineStepsForHalf()
Definition: dgfyasp.hh:480
bool findtoken(std::string token)
Definition: basic.cc:121
static const int dimension
Definition: dgfgridfactory.hh:38
int indexInInside() const
Local index of codim 1 entity in the inside() entity where intersection is contained in...
Definition: common/intersection.hh:393
bool haveBoundaryParameters() const
Definition: dgfyasp.hh:149
const BoundaryParameter & parameter() const
Definition: boundarydom.hh:52
Some simple static information for a given GridType.
Definition: io/file/dgfparser/dgfparser.hh:54
int numParameters() const
Definition: dgfyasp.hh:143
Container for equidistant coordinates in a YaspGrid with non-trivial origin.
Definition: coordinates.hh:124
int overlap() const
get dimension of world found in block
Definition: dgfyasp.hh:72
std::string type
type of additional boundary parameters
Definition: parser.hh:23
DGFGridFactory(std::istream &input, MPICommunicatorType comm=MPIHelper::getCommunicator())
Definition: dgfyasp.hh:96
const DGFBoundaryParameter::type & boundaryParameter(const Intersection< GG, II > &intersection) const
Definition: dgfyasp.hh:156
const DGFBoundaryParameter::type & boundaryParameter(const Intersection< GG, II > &intersection) const
Definition: dgfyasp.hh:357
static const type & defaultValue()
default constructor
Definition: parser.hh:26
The dimension of the grid.
Definition: common/grid.hh:402
std::vector< double > & parameter(const Entity &entity)
Definition: dgfyasp.hh:374
YaspGridParameterBlock(std::istream &in)
constructor taking istream
Definition: dgfyasp.hh:44
bool getnextentry(ENTRY &entry)
Definition: basic.hh:61
FieldVector< ctype, cdim > GlobalCoordinate
type of the global coordinates
Definition: common/geometry.hh:104
Definition: boundarydom.hh:191
Include standard header files.
Definition: agrid.hh:59
exception class for IO errors in the DGF parser
Definition: dgfexception.hh:12
int id() const
Definition: boundarydom.hh:40
~DGFGridFactory()
Definition: dgfyasp.hh:109
Grid * grid() const
Definition: dgfyasp.hh:315
Definition: boundarydom.hh:20