3#ifndef DUNE_POLYHEDRALGRID_GRIDFACTORY_HH 
    4#define DUNE_POLYHEDRALGRID_GRIDFACTORY_HH 
    9#include <dune/common/typetraits.hh> 
   10#include <dune/common/version.hh> 
   12#include <dune/grid/common/gridfactory.hh> 
   22  template< 
int dim, 
int dimworld, 
class coord_t >
 
   24    : 
public GridFactoryInterface< PolyhedralGrid< dim, dimworld, coord_t > >
 
   29    const static int dimension      = Grid::dimension;
 
   30    const static int dimensionworld = Grid::dimensionworld;
 
   34    typedef typename Grid::template Codim<0>::Entity 
Element;
 
   35    typedef typename Grid::template Codim<dimension>::Entity 
Vertex;
 
   51      nodes_.push_back( pos );
 
   64                               const std::vector<unsigned int>& items)
 
   69        std::vector< int > numbers( items.size() );
 
   70        std::copy( items.begin(), items.end(), numbers.begin() );
 
   72        if( type.dim() == dimension-1 )
 
   74          faces_.push_back( numbers );
 
   76        else if( type.dim() == dimension )
 
   80          cells_.push_back( numbers );
 
   84          DUNE_THROW(Dune::NotImplemented,
"insertElement not implemented for type " << type );
 
   96      DUNE_THROW(NotImplemented,
"yet");
 
  101      std::vector< CoordinateType >& nodes = nodes_;
 
  102      std::vector< std::vector< int > >& faces = faces_;
 
  103      std::vector< std::vector< int > >& cells = cells_;
 
  107        DUNE_THROW( GridError, 
"No cells found for PolyhedralGrid" );
 
  110      const auto sumSize = [] ( std::size_t s, 
const std::vector< int > &v ) { 
return s + v.size(); };
 
  111      const std::size_t numFaceNodes = std::accumulate( faces.begin(), faces.end(), std::size_t( 0 ), sumSize );
 
  112      const std::size_t 
numCellFaces = std::accumulate( cells.begin(), cells.end(), std::size_t( 0 ), sumSize );
 
  115        Grid::allocateGrid( cells.size(), faces.size(), numFaceNodes, 
numCellFaces, nodes.size() );
 
  120        std::map< std::vector< int >, std::vector< int > > faceMap;
 
  123        const int nFaces = faces.size();
 
  125        std::fill( ug->face_cells, ug->face_cells + 2*nFaces, -1 );
 
  128        std::vector< int > faceVertices;
 
  129        faceVertices.reserve( 30 );
 
  130        for( 
int face = 0; face < nFaces; ++face )
 
  133          faceVertices.clear();
 
  134          ug->face_nodepos[ face ] = facepos;
 
  135          const int nVertices = faces[ face ].size();
 
  136          for( 
int vx = 0; vx < nVertices; ++vx, ++facepos )
 
  139            ug->face_nodes[ facepos ] = faces[ face ][ vx ];
 
  140            faceVertices.push_back( faces[ face ][ vx ] );
 
  146          std::sort( faceVertices.begin(), faceVertices.end() );
 
  148          faceMap[ faceVertices ].push_back( face );
 
  149          assert( faceMap[ faceVertices ].size() == 1 );
 
  152        ug->face_nodepos[ nFaces ] = facepos ;
 
  157        const int nCells = cells.size();
 
  159        for( 
int cell = 0; cell < nCells; ++cell )
 
  162          ug->cell_facepos[ cell ] = cellpos;
 
  163          const int nFaces = cells[ cell ].size();
 
  164          for( 
int f = 0; f < nFaces; ++f, ++cellpos )
 
  166            const int face = cells[ cell ][ f ];
 
  168            ug->cell_faces[ cellpos ] = face;
 
  171            if( ug->face_cells[ 2*face ] == -1 )
 
  173              ug->face_cells[ 2*face ] = cell;
 
  178              ug->face_cells[ 2*face+1 ] = cell;
 
  183        ug->cell_facepos[ nCells ] = cellpos ;
 
  188        const int nNodes = nodes.size();
 
  190        for( 
int vx = 0 ; vx < nNodes; ++vx )
 
  192          for( 
int d=0; d<dim; ++d, ++nodepos )
 
  193            ug->node_coordinates[ nodepos ] = nodes[ vx ][ d ];
 
  206      if( ug->cell_facetag )
 
  208        std::free( ug->cell_facetag );
 
  209        ug->cell_facetag = nullptr ;
 
  210        for( 
int i=0; i<3; ++i ) ug->cartdims[ i ] = 0;
 
  214      Grid::computeGeometry( ug );
 
  218        for( 
int face = 0 ; face < ug->number_of_faces; ++face )
 
  220          const int a = ug->face_cells[ 2*face     ];
 
  221          const int b = ug->face_cells[ 2*face + 1 ];
 
  228          for( 
int d=0; d<dim; ++d )
 
  231            centerDiff[ d ] = ug->cell_centroids[ 
b*dim + d ] - ug->cell_centroids[ a*dim + d ];
 
  232            normal[ d ] = ug->face_normals[ face*dim + d ];
 
  236          if( centerDiff * normal > 0 )
 
  238            ug->face_cells[ 2*face     ] = 
b;
 
  239            ug->face_cells[ 2*face + 1 ] = a;
 
  249    std::vector< std::vector< int > > 
faces_;
 
  250    std::vector< std::vector< int > > 
cells_;
 
virtual void insertElement(const GeometryType &type, const std::vector< unsigned int > &items)
Insert an element into the coarse grid.
Definition: gridfactory.hh:63
 
std::vector< std::vector< int > > faces_
Definition: gridfactory.hh:249
 
void insertBoundarySegment(const std::vector< unsigned int > &)
Definition: gridfactory.hh:94
 
virtual void insertVertex(const CoordinateType &pos)
Definition: gridfactory.hh:49
 
PolyhedralGrid< dim, dimworld, coord_t > Grid
Definition: gridfactory.hh:27
 
Grid::template Codim< 0 >::Entity Element
Definition: gridfactory.hh:34
 
std::unique_ptr< Grid > UniquePtrType
Definition: gridfactory.hh:40
 
GridFactory(const MPICommunicatorType &=MPIHelper::getCommunicator())
Default constructor.
Definition: gridfactory.hh:43
 
std::vector< CoordinateType > nodes_
Definition: gridfactory.hh:248
 
Grid::template Codim< dimension >::Entity Vertex
Definition: gridfactory.hh:35
 
MPIHelper::MPICommunicator MPICommunicatorType
Definition: gridfactory.hh:33
 
Dune::FieldVector< ctype, dimensionworld > CoordinateType
Definition: gridfactory.hh:37
 
UniquePtrType createGrid()
Definition: gridfactory.hh:99
 
CoordinateType Coordinate
Definition: gridfactory.hh:38
 
Grid::ctype ctype
Definition: gridfactory.hh:31
 
std::vector< std::vector< int > > cells_
Definition: gridfactory.hh:250
 
identical grid wrapper
Definition: grid.hh:159
 
Traits::ctype ctype
type of vector coordinates (e.g., double)
Definition: grid.hh:308
 
std::unique_ptr< UnstructuredGridType, UnstructuredGridDeleter > UnstructuredGridPtr
Definition: grid.hh:178
 
The namespace Dune is the main namespace for all Dune code.
Definition: common/CartesianIndexMapper.hpp:10
 
int numCellFaces(const Dune::CpGrid &grid)
Get the number of faces, where each face counts as many times as there are adjacent faces.
 
double b(const Dune::FieldVector< ct, dimworld > &, double)
Definition: transportproblem2.hh:25