4#ifndef DUNE_ALBERTA_GRIDFACTORY_HH 
    5#define DUNE_ALBERTA_GRIDFACTORY_HH 
   18#include <dune/geometry/referenceelements.hh> 
   22#include <dune/grid/utility/grapedataioformattypes.hh> 
   48  template< 
int dim, 
int dimworld >
 
   59    typedef typename Grid::ctype 
ctype;
 
   72    typedef Dune::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 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 );
 
  219      typedef typename GenericGeometry::SimplexTopology< 
dimension-1 >::type Topology;
 
  220      insertBoundaryProjection( 
GeometryType( Topology() ), vertices, 0 );
 
  230                            const shared_ptr< BoundarySegment > &boundarySegment )
 
  235      if( !boundarySegment )
 
  237      if( (
int)vertices.size() != refSimplex.size( 
dimension-1 ) )
 
  238        DUNE_THROW( 
GridError, 
"Wrong number of face vertices passed: " << vertices.size() << 
"." );
 
  240      std::vector< WorldVector > coords( refSimplex.size( 
dimension-1 ) );
 
  243        Alberta::GlobalVector &x = macroData_.vertex( vertices[ i ] );
 
  244        for( 
int j = 0; j < dimensionworld; ++j )
 
  245          coords[ i ][ j ] = x[ j ];
 
  246        if( ((*boundarySegment)( refSimplex.position( i, 
dimension-1 ) ) - coords[ i ]).two_norm() > 1e-6 )
 
  252      insertBoundaryProjection( 
gt, vertices, prj );
 
  268    void insertFaceTransformation ( 
const WorldMatrix &matrix, 
const WorldVector &shift );
 
  280      macroData_.markLongestEdge();
 
  297      macroData_.finalize();
 
  298      if( macroData_.elementCount() == 0 )
 
  301        macroData_.setOrientation( Alberta::Real( 1 ) );
 
  302      assert( macroData_.checkNeighbors() );
 
  303      macroData_.checkCycles();
 
  304      ProjectionFactory projectionFactory( *
this );
 
  305      return new Grid( macroData_, projectionFactory );
 
  325    template< GrapeIOFileFormatType type >
 
  326    bool write ( 
const std::string &filename )
 
  328      static_assert( type != pgm, 
"AlbertaGridFactory: writing pgm format is not supported." );
 
  329      macroData_.finalize();
 
  331        macroData_.setOrientation( Alberta::Real( 1 ) );
 
  332      assert( macroData_.checkNeighbors() );
 
  333      return macroData_.write( filename, (type == 
xdr) );
 
  344    virtual bool write ( 
const std::string &filename )
 
  346      return write< ascii >( filename );
 
  352      return insertionIndex( Grid::getRealImplementation( entity ).elementInfo() );
 
  358      const int elIndex = 
insertionIndex( Grid::getRealImplementation( entity ).elementInfo() );
 
  359      const typename MacroData::ElementId &elementId = macroData_.element( elIndex );
 
  360      return elementId[ Grid::getRealImplementation( entity ).subEntity() ];
 
  366      const Grid &grid = Grid::getRealImplementation( intersection ).grid();
 
  367      const ElementInfo &elementInfo = Grid::getRealImplementation( intersection ).elementInfo();
 
  368      const int face = grid.generic2alberta( 1, intersection.indexInInside() );
 
  375      return (
insertionIndex( intersection ) < std::numeric_limits< unsigned int >::max());
 
  379    unsigned int insertionIndex ( 
const ElementInfo &elementInfo ) 
const;
 
  380    unsigned int insertionIndex ( 
const ElementInfo &elementInfo, 
const int face ) 
const;
 
  382    FaceId faceId ( 
const ElementInfo &elementInfo, 
const int face ) 
const;
 
  384    MacroData macroData_;
 
  385    NumberingMap numberingMap_;
 
  386    DuneProjectionPtr globalProjection_;
 
  387    BoundaryMap boundaryMap_;
 
  388    std::vector< DuneProjectionPtr > boundaryProjections_;
 
  392  template< 
int dim, 
int dimworld >
 
  393  GridFactory< AlbertaGrid< dim, dimworld > >::~GridFactory ()
 
  395    macroData_.release();
 
  399  template< 
int dim, 
int dimworld >
 
  401  GridFactory< AlbertaGrid< dim, dimworld > >
 
  405    for( 
int i = 0; i < dimworld; ++i )
 
  406      for( 
int j = 0; j < dimworld; ++j )
 
  409        const ctype epsilon = (8*dimworld)*std::numeric_limits< ctype >::epsilon();
 
  411        if( std::abs( matrix[ i ] * matrix[ j ] - delta ) > epsilon )
 
  414                      "Matrix of face transformation is not orthogonal." );
 
  419    Alberta::GlobalMatrix M;
 
  420    for( 
int i = 0; i < dimworld; ++i )
 
  421      for( 
int j = 0; j < dimworld; ++j )
 
  422        M[ i ][ j ] = matrix[ i ][ j ];
 
  425    Alberta::GlobalVector t;
 
  426    for( 
int i = 0; i < dimworld; ++i )
 
  430    macroData_.insertWallTrafo( M, t );
 
  434  template< 
int dim, 
int dimworld >
 
  437  ::insertionIndex ( 
const ElementInfo &elementInfo )
 const 
  439    const MacroElement ¯oElement = elementInfo.macroElement();
 
  440    const unsigned int index = macroElement.index;
 
  443    const typename MacroData::ElementId &elementId = macroData_.element( index );
 
  444    for( 
int i = 0; i <= dimension; ++i )
 
  446      const Alberta::GlobalVector &x = macroData_.vertex( elementId[ i ] );
 
  447      const Alberta::GlobalVector &y = macroElement.coordinate( i );
 
  448      for( 
int j = 0; j < dimensionworld; ++j )
 
  450        if( x[ j ] != y[ j ] )
 
  451          DUNE_THROW( 
GridError, 
"Vertex in macro element does not coincide with same vertex in macro data structure." );
 
  460  template< 
int dim, 
int dimworld >
 
  462  GridFactory< AlbertaGrid< dim, dimworld > >
 
  463  ::insertionIndex ( 
const ElementInfo &elementInfo, 
const int face )
 const 
  465    typedef typename BoundaryMap::const_iterator Iterator;
 
  466    const Iterator it = boundaryMap_.find( faceId( elementInfo, face ) );
 
  467    if( it != boundaryMap_.end() )
 
  470      return std::numeric_limits< unsigned int >::max();
 
  474  template< 
int dim, 
int dimworld >
 
  475  inline typename GridFactory< AlbertaGrid< dim, dimworld > >::FaceId
 
  476  GridFactory< AlbertaGrid< dim, dimworld > >
 
  477  ::faceId ( 
const ElementInfo &elementInfo, 
const int face )
 const 
  479    const unsigned int index = insertionIndex( elementInfo );
 
  480    const typename MacroData::ElementId &elementId = macroData_.element( index );
 
  483    for( 
size_t i = 0; i < faceId.size(); ++i )
 
  485      const int k = Alberta::MapVertices< dimension, 1 >::apply( face, i );
 
  486      faceId[ i ] = elementId[ k ];
 
  488    std::sort( faceId.begin(), faceId.end() );
 
  497  template< 
int dim, 
int dimworld >
 
  498  class GridFactory< AlbertaGrid< dim, dimworld > >::ProjectionFactory
 
  499    : 
public Alberta::ProjectionFactory< Alberta::DuneBoundaryProjection< dim >, ProjectionFactory >
 
  501    typedef ProjectionFactory This;
 
  502    typedef Alberta::ProjectionFactory< Alberta::DuneBoundaryProjection< dim >, ProjectionFactory > Base;
 
  507    typedef typename Base::Projection Projection;
 
  508    typedef typename Base::ElementInfo ElementInfo;
 
  510    typedef typename Projection::Projection DuneProjection;
 
  512    ProjectionFactory( 
const GridFactory &gridFactory )
 
  513      : gridFactory_( gridFactory )
 
  516    bool hasProjection ( 
const ElementInfo &elementInfo, 
const int face )
 const 
  518      if( gridFactory().globalProjection_ )
 
  521      const unsigned int index = gridFactory().insertionIndex( elementInfo, face );
 
  522      if( index < std::numeric_limits< unsigned int >::max() )
 
  523        return bool( gridFactory().boundaryProjections_[ index ] );
 
  528    bool hasProjection ( 
const ElementInfo &elementInfo )
 const 
  530      return bool( gridFactory().globalProjection_ );
 
  533    Projection projection ( 
const ElementInfo &elementInfo, 
const int face )
 const 
  535      const unsigned int index = gridFactory().insertionIndex( elementInfo, face );
 
  536      if( index < std::numeric_limits< unsigned int >::max() )
 
  538        const DuneProjectionPtr &projection = gridFactory().boundaryProjections_[ index ];
 
  540          return Projection( projection );
 
  543      assert( gridFactory().globalProjection_ );
 
  544      return Projection( gridFactory().globalProjection_ );
 
  547    Projection projection ( 
const ElementInfo &elementInfo )
 const 
  549      assert( gridFactory().globalProjection_ );
 
  550      return Projection( gridFactory().globalProjection_ );
 
provides the AlbertaGrid class
 
Fallback implementation of the std::array class (a static array)
 
[ provides Dune::Grid ]
Definition: agrid.hh:140
 
Definition: boundaryprojection.hh:67
 
Wrapper class for entities.
Definition: entity.hh:62
 
A dense n x m matrix.
Definition: fmatrix.hh:67
 
vector space out of a tensor product of fields.
Definition: fvector.hh:94
 
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:25
 
unsigned int dim() const
Return dimension of the type.
Definition: type.hh:321
 
bool isSimplex() const
Return true if entity is a simplex of any dimension.
Definition: type.hh:306
 
Base class for exceptions in Dune grid modules.
Definition: exceptions.hh:18
 
Provide a generic factory class for unstructured grids.
Definition: gridfactory.hh:74
 
virtual unsigned int insertionIndex(const typename Codim< 0 >::Entity &entity) const
obtain an element's insertion index
Definition: gridfactory.hh:179
 
static const int dimension
dimension of the grid
Definition: gridfactory.hh:78
 
virtual bool wasInserted(const typename GridType::LeafIntersection &intersection) const
determine whether an intersection was inserted
Definition: gridfactory.hh:245
 
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
 
virtual unsigned int insertionIndex(const typename Codim< 0 >::Entity &entity) const
obtain an element's insertion index
Definition: gridfactory.hh:350
 
virtual void insertBoundarySegment(const std::vector< unsigned int > &vertices, const shared_ptr< BoundarySegment > &boundarySegment)
insert a shaped boundary segment into the macro grid
Definition: gridfactory.hh:229
 
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:278
 
bool write(const std::string &filename)
write out the macro triangulation in native grid file format
Definition: gridfactory.hh:326
 
virtual bool write(const std::string &filename)
write out the macro triangulation in native grid file format
Definition: gridfactory.hh:344
 
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:312
 
virtual unsigned int insertionIndex(const typename Codim< dimension >::Entity &entity) const
obtain a vertex' insertion index
Definition: gridfactory.hh:356
 
virtual void insertBoundaryProjection(const DuneProjection *projection)
insert a global (boundary) projection into the macro grid
Definition: gridfactory.hh:204
 
Grid * createGrid()
finalize grid creation and hand over the grid
Definition: gridfactory.hh:295
 
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:263
 
GridFactory()
Default constructor.
Definition: gridfactory.hh:274
 
Grid abstract base class.
Definition: grid.hh:388
 
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:486
 
@ dimensionworld
The dimension of the world the grid lives in.
Definition: grid.hh:408
 
@ dimension
The dimension of the grid.
Definition: grid.hh:402
 
This class provides access to geometric and topological properties of a reference element.
Definition: referenceelements.hh:55
 
Provide a generic factory class for unstructured grids.
 
#define DUNE_THROW(E, m)
Definition: exceptions.hh:243
 
bool gt(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test if first greater than second
Definition: float_cmp.cc:132
 
Dune namespace.
Definition: alignment.hh:10
 
@ xdr
Definition: grapedataioformattypes.hh:16
 
Base class for classes implementing geometries of boundary segments.
Definition: boundarysegment.hh:30
 
Static tag representing a codimension.
Definition: dimension.hh:22
 
Interface class for vertex projection at the boundary.
Definition: boundaryprojection.hh:24
 
static const ReferenceElement< ctype, dim > & simplex()
get simplex reference elements
Definition: referenceelements.hh:490