6#ifndef DUNE_ALBERTA_GRIDFACTORY_HH 
    7#define DUNE_ALBERTA_GRIDFACTORY_HH 
   20#include <dune/geometry/referenceelements.hh> 
   48  template< 
int dim, 
int dimworld >
 
   59    typedef typename Grid::ctype 
ctype;
 
   72    typedef std::shared_ptr< const DuneProjection > DuneProjectionPtr;
 
   78      typedef typename Grid::template Codim< codim >::Entity 
Entity;
 
   84    static const int numVertices
 
   85      = Alberta::NumSubEntities< dimension, dimension >::value;
 
   87    typedef Alberta::MacroElement< dimension > MacroElement;
 
   88    typedef Alberta::ElementInfo< dimension > ElementInfo;
 
   89    typedef Alberta::MacroData< dimension > MacroData;
 
   90    typedef Alberta::NumberingMap< dimension, Alberta::Dune2AlbertaNumbering > NumberingMap;
 
   91    typedef Alberta::DuneBoundaryProjection< dimension > Projection;
 
   93    typedef std::array< unsigned int, dimension > FaceId;
 
   94    typedef std::map< FaceId, size_t > BoundaryMap;
 
   96    class ProjectionFactory;
 
  100    static const bool supportsBoundaryIds = 
true;
 
  102    static const bool supportPeriodicity = MacroData::supportPeriodicity;
 
  119      macroData_.insertVertex( pos );
 
  128                                 const std::vector< unsigned int > &vertices )
 
  131        DUNE_THROW( AlbertaError, 
"Inserting element of wrong dimension: " << type.
dim() );
 
  133        DUNE_THROW( AlbertaError, 
"Alberta supports only simplices." );
 
  135      if( vertices.size() != (
size_t)numVertices )
 
  136        DUNE_THROW( AlbertaError, 
"Wrong number of vertices passed: " << vertices.size() << 
"." );
 
  138      int array[ numVertices ];
 
  139      for( 
int i = 0; i < numVertices; ++i )
 
  140        array[ i ] = vertices[ numberingMap_.alberta2dune( 
dimension, 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() );
 
  179        DUNE_THROW( AlbertaError, 
"Alberta supports only simplices." );
 
  182      if( vertices.size() != faceId.size() )
 
  183        DUNE_THROW( AlbertaError, 
"Wrong number of face vertices passed: " << vertices.size() << 
"." );
 
  184      for( 
size_t i = 0; i < faceId.size(); ++i )
 
  185        faceId[ i ] = vertices[ 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() ) );
 
  192      boundaryProjections_.push_back( DuneProjectionPtr( projection ) );
 
  206      if( globalProjection_ )
 
  208      globalProjection_ = DuneProjectionPtr( projection );
 
  229                            const std::shared_ptr< BoundarySegment > &boundarySegment )
 
  233      if( !boundarySegment )
 
  235      if( (
int)vertices.size() != refSimplex.size( 
dimension-1 ) )
 
  236        DUNE_THROW( 
GridError, 
"Wrong number of face vertices passed: " << vertices.size() << 
"." );
 
  238      std::vector< WorldVector > coords( refSimplex.size( 
dimension-1 ) );
 
  241        Alberta::GlobalVector &x = macroData_.vertex( vertices[ i ] );
 
  242        for( 
int j = 0; j < dimensionworld; ++j )
 
  243          coords[ i ][ j ] = x[ j ];
 
  244        if( ((*boundarySegment)( refSimplex.position( i, 
dimension-1 ) ) - coords[ i ]).two_norm() > 1e-6 )
 
  250      insertBoundaryProjection( 
gt, vertices, prj );
 
  266    void insertFaceTransformation ( 
const WorldMatrix &matrix, 
const WorldVector &shift );
 
  278      macroData_.markLongestEdge();
 
  295      macroData_.finalize();
 
  296      if( macroData_.elementCount() == 0 )
 
  299        macroData_.setOrientation( Alberta::Real( 1 ) );
 
  300      assert( macroData_.checkNeighbors() );
 
  301      macroData_.checkCycles();
 
  302      ProjectionFactory projectionFactory( *
this );
 
  303      return std::make_unique<Grid>( macroData_, projectionFactory );
 
  321    bool write ( 
const std::string &filename )
 
  323      macroData_.finalize();
 
  325        macroData_.setOrientation( Alberta::Real( 1 ) );
 
  326      assert( macroData_.checkNeighbors() );
 
  327      return macroData_.write( filename, 
false );
 
  339      const int elIndex = 
insertionIndex( entity.impl().elementInfo() );
 
  340      const typename MacroData::ElementId &elementId = macroData_.element( elIndex );
 
  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() );
 
  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 >
 
  374  GridFactory< AlbertaGrid< dim, dimworld > >::~GridFactory ()
 
  376    macroData_.release();
 
  380  template< 
int dim, 
int dimworld >
 
  382  GridFactory< AlbertaGrid< dim, 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." );
 
  400    Alberta::GlobalMatrix M;
 
  401    for( 
int i = 0; i < dimworld; ++i )
 
  402      for( 
int j = 0; j < dimworld; ++j )
 
  403        M[ i ][ j ] = matrix[ i ][ j ];
 
  406    Alberta::GlobalVector t;
 
  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 )
 
  427      const Alberta::GlobalVector &x = macroData_.vertex( elementId[ i ] );
 
  428      const Alberta::GlobalVector &y = macroElement.coordinate( 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 >
 
  443  GridFactory< AlbertaGrid< dim, 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() )
 
  455  template< 
int dim, 
int dimworld >
 
  456  inline typename GridFactory< AlbertaGrid< dim, dimworld > >::FaceId
 
  457  GridFactory< AlbertaGrid< dim, 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 )
 
  466      const int k = Alberta::MapVertices< dimension, 1 >::apply( face, i );
 
  467      faceId[ i ] = elementId[ k ];
 
  469    std::sort( faceId.begin(), faceId.end() );
 
  478  template< 
int dim, 
int dimworld >
 
  479  class GridFactory< AlbertaGrid< dim, dimworld > >::ProjectionFactory
 
  480    : 
public Alberta::ProjectionFactory< Alberta::DuneBoundaryProjection< dim >, ProjectionFactory >
 
  482    typedef ProjectionFactory This;
 
  483    typedef Alberta::ProjectionFactory< Alberta::DuneBoundaryProjection< dim >, ProjectionFactory > Base;
 
  488    typedef typename Base::Projection Projection;
 
  489    typedef typename Base::ElementInfo ElementInfo;
 
  491    typedef typename Projection::Projection DuneProjection;
 
  493    ProjectionFactory( 
const GridFactory &gridFactory )
 
  494      : gridFactory_( gridFactory )
 
  497    bool hasProjection ( 
const ElementInfo &elementInfo, 
const int face )
 const 
  499      if( gridFactory().globalProjection_ )
 
  502      const unsigned int index = gridFactory().insertionIndex( elementInfo, face );
 
  504        return bool( gridFactory().boundaryProjections_[ index ] );
 
  509    bool hasProjection ( 
const ElementInfo &  )
 const 
  511      return bool( gridFactory().globalProjection_ );
 
  514    Projection projection ( 
const ElementInfo &elementInfo, 
const int face )
 const 
  516      const unsigned int index = gridFactory().insertionIndex( elementInfo, face );
 
  519        const DuneProjectionPtr &projection = gridFactory().boundaryProjections_[ index ];
 
  521          return Projection( projection );
 
  524      assert( gridFactory().globalProjection_ );
 
  525      return Projection( gridFactory().globalProjection_ );
 
  528    Projection projection ( 
const ElementInfo &  )
 const 
  530      assert( gridFactory().globalProjection_ );
 
  531      return Projection( gridFactory().globalProjection_ );
 
provides the AlbertaGrid class
 
[ provides Dune::Grid ]
Definition: agrid.hh:109
 
Definition: boundaryprojection.hh:132
 
Wrapper class for entities.
Definition: entity.hh:66
 
A dense n x m matrix.
Definition: fmatrix.hh:117
 
vector space out of a tensor product of fields.
Definition: fvector.hh:97
 
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:114
 
constexpr unsigned int dim() const
Return dimension of the type.
Definition: type.hh:360
 
constexpr bool isSimplex() const
Return true if entity is a simplex of any dimension.
Definition: type.hh:319
 
Base class for exceptions in Dune grid modules.
Definition: exceptions.hh:20
 
Provide a generic factory class for unstructured grids.
Definition: gridfactory.hh:70
 
virtual unsigned int insertionIndex(const typename Codim< 0 >::Entity &entity) const
obtain an element's insertion index
Definition: gridfactory.hh:181
 
static const int dimension
dimension of the grid
Definition: gridfactory.hh:74
 
virtual bool wasInserted(const typename GridType::LeafIntersection &intersection) const
determine whether an intersection was inserted
Definition: gridfactory.hh:247
 
specialization of the generic GridFactory for AlbertaGrid
Definition: gridfactory.hh:51
 
FieldVector< ctype, dimensionworld > WorldVector
type of vector for world coordinates
Definition: gridfactory.hh:67
 
std::unique_ptr< Grid > createGrid()
finalize grid creation and hand over the grid
Definition: gridfactory.hh:293
 
virtual unsigned int insertionIndex(const typename Codim< 0 >::Entity &entity) const
obtain an element's insertion index
Definition: gridfactory.hh:331
 
AlbertaGrid< dim, dimworld > Grid
type of grid this factory is for
Definition: gridfactory.hh:56
 
virtual void insertBoundaryProjection(const GeometryType &type, const std::vector< unsigned int > &vertices, const DuneProjection *projection)
insert a boundary projection into the macro grid
Definition: gridfactory.hh:172
 
FieldMatrix< ctype, dimensionworld, dimensionworld > WorldMatrix
type of matrix from world coordinates to world coordinates
Definition: gridfactory.hh:69
 
virtual void insertElement(const GeometryType &type, const std::vector< unsigned int > &vertices)
insert an element into the macro grid
Definition: gridfactory.hh:127
 
void markLongestEdge()
mark the longest edge as refinemet edge
Definition: gridfactory.hh:276
 
Grid::ctype ctype
type of (scalar) coordinates
Definition: gridfactory.hh:59
 
virtual void insertVertex(const WorldVector &pos)
insert a vertex into the macro grid
Definition: gridfactory.hh:117
 
virtual void insertBoundary(int element, int face, int id)
mark a face as boundary (and assign a boundary id)
Definition: gridfactory.hh:154
 
GridFactory()
Definition: gridfactory.hh:105
 
static void destroyGrid(Grid *grid)
destroy a grid previously obtain from this factory
Definition: gridfactory.hh:310
 
virtual unsigned int insertionIndex(const typename Codim< dimension >::Entity &entity) const
obtain a vertex' insertion index
Definition: gridfactory.hh:337
 
bool write(const std::string &filename)
write out the macro triangulation in native grid file format
Definition: 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: gridfactory.hh:228
 
virtual void insertBoundaryProjection(const DuneProjection *projection)
insert a global (boundary) projection into the macro grid
Definition: gridfactory.hh:204
 
virtual void insertBoundarySegment(const std::vector< unsigned int > &vertices)
insert a boundary segment into the macro grid
Definition: gridfactory.hh:217
 
Provide a generic factory class for unstructured grids.
Definition: gridfactory.hh:275
 
GridFactory()
Default constructor.
Definition: gridfactory.hh:291
 
Grid abstract base class.
Definition: grid.hh:375
 
static constexpr int dimension
The dimension of the grid.
Definition: grid.hh:387
 
GridFamily::Traits::LeafIntersection LeafIntersection
A type that is a model of Dune::Intersection, an intersections of two codimension 1 of two codimensio...
Definition: grid.hh:456
 
static constexpr int dimensionworld
The dimension of the world the grid lives in.
Definition: grid.hh:390
 
Provide a generic factory class for unstructured grids.
 
#define DUNE_THROW(E,...)
Definition: exceptions.hh:314
 
bool gt(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test if first greater than second
Definition: float_cmp.cc:158
 
constexpr GeometryType simplex(unsigned int dim)
Returns a GeometryType representing a simplex of dimension dim.
Definition: type.hh:453
 
constexpr auto max
Function object that returns the greater of the given values.
Definition: hybridutilities.hh:485
 
Dune namespace.
Definition: alignedallocator.hh:13
 
Base class for classes implementing geometries of boundary segments.
Definition: boundarysegment.hh:94
 
Static tag representing a codimension.
Definition: dimension.hh:24
 
Interface class for vertex projection at the boundary.
Definition: boundaryprojection.hh:32
 
static const ReferenceElement & simplex()
get simplex reference elements
Definition: referenceelements.hh:162