6#ifndef DUNE_ALBERTA_GRIDFACTORY_HH
7#define DUNE_ALBERTA_GRIDFACTORY_HH
20#include <dune/geometry/referenceelements.hh>
48 template<
int dim,
int dimworld >
69 typedef FieldMatrix< ctype, dimensionworld, dimensionworld >
WorldMatrix;
84 static const int numVertices
93 typedef std::array< unsigned int, dimension > FaceId;
94 typedef std::map< FaceId, size_t > BoundaryMap;
119 macroData_.insertVertex( pos );
128 const std::vector< unsigned int > &
vertices )
131 DUNE_THROW(
AlbertaError,
"Inserting element of wrong dimension: " << type.dim() );
132 if( !type.isSimplex() )
133 DUNE_THROW(
AlbertaError,
"Alberta supports only simplices." );
135 if(
vertices.size() != (
size_t)numVertices )
138 int array[ numVertices ];
139 for(
int i = 0; i < numVertices; ++i )
141 macroData_.insertElement( array );
156 if( (
id <= 0) || (
id > 127) )
157 DUNE_THROW(
AlbertaError,
"Invalid boundary id: " <<
id <<
"." );
158 macroData_.boundaryId( element, numberingMap_.dune2alberta( 1, face ) ) = id;
173 const std::vector< unsigned int > &
vertices,
177 DUNE_THROW(
AlbertaError,
"Inserting boundary face of wrong dimension: " << type.dim() );
178 if( !type.isSimplex() )
179 DUNE_THROW(
AlbertaError,
"Alberta supports only simplices." );
182 if(
vertices.size() != faceId.size() )
184 for(
size_t i = 0; i < faceId.size(); ++i )
186 std::sort( faceId.begin(), faceId.end() );
188 typedef std::pair< typename BoundaryMap::iterator, bool > InsertResult;
189 const InsertResult result = boundaryMap_.insert( std::make_pair( faceId, boundaryProjections_.size() ) );
191 DUNE_THROW(
GridError,
"Only one boundary projection can be attached to a face." );
206 if( globalProjection_ )
207 DUNE_THROW(
GridError,
"Only one global boundary projection can be attached to a grid." );
229 const std::shared_ptr< BoundarySegment > &boundarySegment )
231 auto refSimplex = ReferenceElements< ctype, dimension-1 >::simplex();
233 if( !boundarySegment )
234 DUNE_THROW(
GridError,
"Trying to insert null as a boundary segment." );
236 DUNE_THROW(
GridError,
"Wrong number of face vertices passed: " <<
vertices.size() <<
"." );
238 std::vector< WorldVector > coords( refSimplex.size(
dimension-1 ) );
243 coords[ i ][ j ] = x[ j ];
244 if( ((*boundarySegment)( refSimplex.position( i,
dimension-1 ) ) - coords[ i ]).two_norm() > 1e-6 )
245 DUNE_THROW(
GridError,
"Boundary segment does not interpolate the corners." );
248 const GeometryType gt = refSimplex.type( 0, 0 );
249 const DuneProjection *prj =
new BoundarySegmentWrapper( gt, coords, boundarySegment );
266 void insertFaceTransformation (
const WorldMatrix &matrix,
const WorldVector &shift );
278 macroData_.markLongestEdge();
295 macroData_.finalize();
296 if( macroData_.elementCount() == 0 )
297 DUNE_THROW(
GridError,
"Cannot create empty AlbertaGrid." );
300 assert( macroData_.checkNeighbors() );
301 macroData_.checkCycles();
303 return std::make_unique<Grid>( macroData_, projectionFactory );
321 bool write (
const std::string &filename )
323 macroData_.finalize();
326 assert( macroData_.checkNeighbors() );
327 return macroData_.write( filename,
false );
339 const int elIndex =
insertionIndex( entity.impl().elementInfo() );
341 return elementId[ entity.impl().subEntity() ];
347 const Grid &grid = intersection.impl().grid();
348 const ElementInfo &elementInfo = intersection.impl().elementInfo();
349 const int face = grid.
generic2alberta( 1, intersection.indexInInside() );
356 return (
insertionIndex( intersection ) < std::numeric_limits< unsigned int >::max());
360 unsigned int insertionIndex (
const ElementInfo &elementInfo )
const;
361 unsigned int insertionIndex (
const ElementInfo &elementInfo,
const int face )
const;
363 FaceId faceId (
const ElementInfo &elementInfo,
const int face )
const;
365 MacroData macroData_;
366 NumberingMap numberingMap_;
367 DuneProjectionPtr globalProjection_;
368 BoundaryMap boundaryMap_;
369 std::vector< DuneProjectionPtr > boundaryProjections_;
373 template<
int dim,
int dimworld >
376 macroData_.release();
380 template<
int dim,
int dimworld >
386 for(
int i = 0; i < dimworld; ++i )
387 for(
int j = 0; j < dimworld; ++j )
390 const ctype epsilon = (8*dimworld)*std::numeric_limits< ctype >::epsilon();
392 if( std::abs( matrix[ i ] * matrix[ j ] - delta ) > epsilon )
395 "Matrix of face transformation is not orthogonal." );
401 for(
int i = 0; i < dimworld; ++i )
402 for(
int j = 0; j < dimworld; ++j )
403 M[ i ][ j ] = matrix[ i ][ j ];
407 for(
int i = 0; i < dimworld; ++i )
411 macroData_.insertWallTrafo( M, t );
415 template<
int dim,
int dimworld >
418 ::insertionIndex (
const ElementInfo &elementInfo )
const
420 const MacroElement ¯oElement = elementInfo.macroElement();
421 const unsigned int index = macroElement.index;
424 const typename MacroData::ElementId &elementId = macroData_.element( index );
425 for(
int i = 0; i <= dimension; ++i )
429 for(
int j = 0; j < dimensionworld; ++j )
431 if( x[ j ] != y[ j ] )
432 DUNE_THROW(
GridError,
"Vertex in macro element does not coincide with same vertex in macro data structure." );
441 template<
int dim,
int dimworld >
444 ::insertionIndex (
const ElementInfo &elementInfo,
const int face )
const
446 typedef typename BoundaryMap::const_iterator
Iterator;
447 const Iterator it = boundaryMap_.find( faceId( elementInfo, face ) );
448 if( it != boundaryMap_.end() )
451 return std::numeric_limits< unsigned int >::max();
455 template<
int dim,
int dimworld >
458 ::faceId (
const ElementInfo &elementInfo,
const int face )
const
460 const unsigned int index = insertionIndex( elementInfo );
461 const typename MacroData::ElementId &elementId = macroData_.element( index );
464 for(
size_t i = 0; i < faceId.size(); ++i )
467 faceId[ i ] = elementId[ k ];
469 std::sort( faceId.begin(), faceId.end() );
478 template<
int dim,
int dimworld >
502 const unsigned int index =
gridFactory().insertionIndex( elementInfo, face );
503 if( index < std::numeric_limits< unsigned int >::max() )
504 return bool(
gridFactory().boundaryProjections_[ index ] );
516 const unsigned int index =
gridFactory().insertionIndex( elementInfo, face );
517 if( index < std::numeric_limits< unsigned int >::max() )
provides the AlbertaGrid class
IteratorRange<... > vertices(const GV &gv)
Iterates over all vertices (entities with dimension 0) of a GridView.
Include standard header files.
Definition agrid.hh:60
ALBERTA REAL_DD GlobalMatrix
Definition misc.hh:51
ALBERTA REAL Real
Definition misc.hh:48
ALBERTA REAL_D GlobalVector
Definition misc.hh:50
[ provides Dune::Grid ]
Definition agrid.hh:109
int generic2alberta(int codim, int i) const
Definition agrid.hh:487
static const int dimension
Definition agrid.hh:145
static const int dimensionworld
Definition agrid.hh:146
GridFamily::ctype ctype
Definition agrid.hh:143
DuneBoundaryProjection< dimensionworld > DuneProjection
Definition albertagrid/gridfactory.hh:71
static const int dimensionworld
dimension of the world
Definition albertagrid/gridfactory.hh:64
FieldVector< ctype, dimensionworld > WorldVector
type of vector for world coordinates
Definition albertagrid/gridfactory.hh:67
std::unique_ptr< Grid > createGrid()
finalize grid creation and hand over the grid
Definition albertagrid/gridfactory.hh:293
virtual unsigned int insertionIndex(const typename Codim< 0 >::Entity &entity) const
Definition albertagrid/gridfactory.hh:331
virtual bool wasInserted(const typename Grid::LeafIntersection &intersection) const
Definition albertagrid/gridfactory.hh:354
std::shared_ptr< const DuneProjection > DuneProjectionPtr
Definition albertagrid/gridfactory.hh:72
virtual ~GridFactory()
Definition albertagrid/gridfactory.hh:374
static const bool supportPeriodicity
is the factory able to create periodic meshes?
Definition albertagrid/gridfactory.hh:102
AlbertaGrid< dim, dimworld > Grid
type of grid this factory is for
Definition albertagrid/gridfactory.hh:56
static const bool supportsBoundaryIds
are boundary ids supported by this factory?
Definition albertagrid/gridfactory.hh:100
virtual void insertBoundaryProjection(const GeometryType &type, const std::vector< unsigned int > &vertices, const DuneProjection *projection)
insert a boundary projection into the macro grid
Definition albertagrid/gridfactory.hh:172
FieldMatrix< ctype, dimensionworld, dimensionworld > WorldMatrix
type of matrix from world coordinates to world coordinates
Definition albertagrid/gridfactory.hh:69
virtual void insertElement(const GeometryType &type, const std::vector< unsigned int > &vertices)
insert an element into the macro grid
Definition albertagrid/gridfactory.hh:127
void insertFaceTransformation(const WorldMatrix &matrix, const WorldVector &shift)
add a face transformation (for periodic identification)
Definition albertagrid/gridfactory.hh:383
Dune::BoundarySegment< dimension, dimensionworld > BoundarySegment
Definition albertagrid/gridfactory.hh:73
void markLongestEdge()
mark the longest edge as refinemet edge
Definition albertagrid/gridfactory.hh:276
Grid::ctype ctype
type of (scalar) coordinates
Definition albertagrid/gridfactory.hh:59
virtual void insertVertex(const WorldVector &pos)
insert a vertex into the macro grid
Definition albertagrid/gridfactory.hh:117
virtual void insertBoundary(int element, int face, int id)
mark a face as boundary (and assign a boundary id)
Definition albertagrid/gridfactory.hh:154
GridFactory()
Definition albertagrid/gridfactory.hh:105
static void destroyGrid(Grid *grid)
destroy a grid previously obtain from this factory
Definition albertagrid/gridfactory.hh:310
virtual unsigned int insertionIndex(const typename Codim< dimension >::Entity &entity) const
Definition albertagrid/gridfactory.hh:337
bool write(const std::string &filename)
write out the macro triangulation in native grid file format
Definition albertagrid/gridfactory.hh:321
virtual void insertBoundarySegment(const std::vector< unsigned int > &vertices, const std::shared_ptr< BoundarySegment > &boundarySegment)
insert a shaped boundary segment into the macro grid
Definition albertagrid/gridfactory.hh:228
virtual void insertBoundaryProjection(const DuneProjection *projection)
insert a global (boundary) projection into the macro grid
Definition albertagrid/gridfactory.hh:204
virtual unsigned int insertionIndex(const typename Grid::LeafIntersection &intersection) const
Definition albertagrid/gridfactory.hh:345
static const int dimension
dimension of the grid
Definition albertagrid/gridfactory.hh:62
virtual void insertBoundarySegment(const std::vector< unsigned int > &vertices)
insert a boundary segment into the macro grid
Definition albertagrid/gridfactory.hh:217
Definition albertagrid/gridfactory.hh:77
Grid::template Codim< codim >::Entity Entity
Definition albertagrid/gridfactory.hh:78
Definition albertagrid/gridfactory.hh:481
bool hasProjection(const ElementInfo &) const
Definition albertagrid/gridfactory.hh:509
Base::ElementInfo ElementInfo
Definition albertagrid/gridfactory.hh:489
Base::Projection Projection
Definition albertagrid/gridfactory.hh:488
const GridFactory & gridFactory() const
Definition albertagrid/gridfactory.hh:534
ProjectionFactory(const GridFactory &gridFactory)
Definition albertagrid/gridfactory.hh:493
Projection projection(const ElementInfo &elementInfo, const int face) const
Definition albertagrid/gridfactory.hh:514
Projection::Projection DuneProjection
Definition albertagrid/gridfactory.hh:491
Projection projection(const ElementInfo &) const
Definition albertagrid/gridfactory.hh:528
bool hasProjection(const ElementInfo &elementInfo, const int face) const
Definition albertagrid/gridfactory.hh:497
int ElementId[numVertices]
Definition macrodata.hh:48
static const int supportPeriodicity
Definition macrodata.hh:50
Definition albertagrid/projection.hh:135
Base::ElementInfo ElementInfo
Definition albertagrid/projection.hh:141
Base::Projection Projection
Definition albertagrid/projection.hh:140
Dune::DuneBoundaryProjection< dimWorld > Projection
Definition albertagrid/projection.hh:45
Base class for exceptions in Dune grid modules.
Definition exceptions.hh:20
AlbertaGridFamily< dim, Alberta::dimWorld >::Traits::LeafIntersection LeafIntersection
Definition common/grid.hh:456
virtual unsigned int insertionIndex(const typename Codim< 0 >::Entity &entity) const
obtain an element's insertion index
Definition common/gridfactory.hh:181
GridFactoryInterface()
Definition common/gridfactory.hh:90
Provide a generic factory class for unstructured grids.
Definition common/gridfactory.hh:275
Provide a generic factory class for unstructured grids.