7#include "alu3dinclude.hh" 
   10#include "datahandle.hh" 
   19  template< ALU3dGr
idElementType elType, 
class Comm >
 
   22                const MPICommunicatorType mpiComm,
 
   33      , localIdSet_( *this )
 
   34      , levelIndexVec_(MAXL,0) , leafIndexSet_(0)
 
   35      , referenceElement_( elType == tetra
 
   39#ifdef USE_SMP_PARALLEL
 
   40      , factoryVec_( GridObjectFactoryType :: maxThreads(), GridObjectFactoryType( *this ) )
 
   44      , lockPostAdapt_( false )
 
   48      , communications_( new Communications( mpiComm ) )
 
   49      , refinementType_( refinementType )
 
   51    assert( elType == tetra || elType == hexa );
 
   53    geomTypes_.resize( dimension+1 );
 
   55    for( 
int codim = 0; codim <= dimension; ++codim )
 
   60        tmpType.
makeCube( dimension - codim );
 
   62      geomTypes_[ codim ].push_back( tmpType );
 
   68    mygrid_ = createALUGrid( macroTriangFilename );
 
   71    dverb << 
"************************************************" << std::endl;
 
   73    dverb << 
"************************************************" << std::endl;
 
   81  template< ALU3dGr
idElementType elType, 
class Comm >
 
   87    return myGrid().indexManager(codim).getMaxIndex();
 
   91  template< ALU3dGr
idElementType elType, 
class Comm >
 
   95    return myGrid().indexManager(codim).getMaxIndex();
 
   99  template< ALU3dGr
idElementType elType, 
class Comm >
 
  106  template< ALU3dGr
idElementType elType, 
class Comm >
 
  107  inline typename ALU3dGrid< elType, Comm >::GitterImplType &
 
  116  template< ALU3dGr
idElementType elType, 
class Comm >
 
  117  template< 
int cd, PartitionIteratorType pitype >
 
  118  inline typename ALU3dGrid< elType, Comm >::Traits::template Codim< cd >::template Partition< pitype >::LevelIterator
 
  121    assert( level >= 0 );
 
  123    if( level > maxlevel_ )
 
  124      return this->
template lend<cd,pitype> (level);
 
  130  template< ALU3dGr
idElementType elType, 
class Comm >
 
  131  template< 
int cd, PartitionIteratorType pitype >
 
  135    assert( level >= 0 );
 
  141  template< ALU3dGr
idElementType elType, 
class Comm >
 
  146    return this->
template lbegin<cd,All_Partition>( level );
 
  150  template< ALU3dGr
idElementType elType, 
class Comm >
 
  155    assert( level >= 0 );
 
  156    return this->
template lend<cd,All_Partition>( level );
 
  165  template< ALU3dGr
idElementType elType, 
class Comm >
 
  166  template< 
int cd, PartitionIteratorType pitype >
 
  170    assert( level >= 0 );
 
  175  template< ALU3dGr
idElementType elType, 
class Comm >
 
  176  template< 
int cd, PartitionIteratorType pitype >
 
  177  inline typename ALU3dGrid< elType, Comm >::Traits::template Codim< cd >::template Partition< pitype >::LeafIterator
 
  178  ALU3dGrid< elType, Comm >::leafbegin ( 
int level )
 const 
  180    return createLeafIteratorBegin<cd, pitype> (level) ;
 
  184  template< ALU3dGr
idElementType elType, 
class Comm >
 
  186  inline typename ALU3dGrid< elType, Comm >::Traits::template Codim< cd >::LeafIterator
 
  187  ALU3dGrid< elType, Comm >::leafbegin ( 
int level )
 const 
  189    return createLeafIteratorBegin<cd, All_Partition> (level) ;
 
  193  template< ALU3dGr
idElementType elType, 
class Comm >
 
  194  template< 
int cd, PartitionIteratorType pitype >
 
  195  inline typename ALU3dGrid< elType, Comm >::Traits::template Codim< cd >::template Partition< pitype >::LeafIterator
 
  196  ALU3dGrid< elType, Comm >::leafbegin ()
 const 
  198    return createLeafIteratorBegin< cd, pitype > (maxlevel_) ;
 
  202  template< ALU3dGr
idElementType elType, 
class Comm >
 
  204  inline typename ALU3dGrid< elType, Comm >::Traits::template Codim< cd >::LeafIterator
 
  205  ALU3dGrid< elType, Comm >::leafbegin ()
 const 
  207    return createLeafIteratorBegin< cd, All_Partition> (maxlevel_) ;
 
  211  template< ALU3dGr
idElementType elType, 
class Comm >
 
  212  inline typename ALU3dGrid< elType, Comm >::LeafIteratorType
 
  213  ALU3dGrid< elType, Comm >::leafbegin ( 
int level )
 const 
  215    return createLeafIteratorBegin<0, All_Partition> (level) ;
 
  219  template< ALU3dGr
idElementType elType, 
class Comm >
 
  220  inline typename ALU3dGrid< elType, Comm >::LeafIteratorType
 
  221  ALU3dGrid< elType, Comm >::leafbegin ()
 const 
  223    return createLeafIteratorBegin<0, All_Partition> (maxlevel_) ;
 
  232  template< ALU3dGr
idElementType elType, 
class Comm >
 
  233  template< 
int cd, PartitionIteratorType pitype >
 
  234  inline typename ALU3dGrid< elType, Comm >::Traits::template Codim< cd >::template Partition< pitype >::LeafIterator
 
  235  ALU3dGrid< elType, Comm >::createLeafIteratorEnd ( 
int level )
 const 
  237    assert( level >= 0 );
 
  238    return ALU3dGridLeafIterator<cd, pitype, const MyType> ( factory() , level);
 
  242  template< ALU3dGr
idElementType elType, 
class Comm >
 
  243  template< 
int cd, PartitionIteratorType pitype >
 
  244  inline typename ALU3dGrid< elType, Comm >::Traits::template Codim< cd >::template Partition< pitype >::LeafIterator
 
  245  ALU3dGrid< elType, Comm >::leafend ( 
int level )
 const 
  247    return createLeafIteratorEnd < cd, pitype> (level);
 
  251  template< ALU3dGr
idElementType elType, 
class Comm >
 
  253  inline typename ALU3dGrid< elType, Comm >::Traits::template Codim< cd >::LeafIterator
 
  254  ALU3dGrid< elType, Comm >::leafend ( 
int level )
 const 
  256    return createLeafIteratorEnd < cd, All_Partition> (level);
 
  260  template< ALU3dGr
idElementType elType, 
class Comm >
 
  261  template< 
int cd, PartitionIteratorType pitype >
 
  262  inline typename ALU3dGrid< elType, Comm >::Traits::template Codim< cd >::template Partition< pitype >::LeafIterator
 
  263  ALU3dGrid< elType, Comm >::leafend ()
 const 
  265    return createLeafIteratorEnd < cd, pitype> (maxlevel_);
 
  269  template< ALU3dGr
idElementType elType, 
class Comm >
 
  271  inline typename ALU3dGrid< elType, Comm >::Traits::template Codim< cd >::LeafIterator
 
  272  ALU3dGrid< elType, Comm >::leafend ()
 const 
  274    return createLeafIteratorEnd < cd, All_Partition> (maxlevel_);
 
  278  template< ALU3dGr
idElementType elType, 
class Comm >
 
  279  inline typename ALU3dGrid< elType, Comm >::LeafIteratorType
 
  280  ALU3dGrid< elType, Comm >::leafend ( 
int level )
 const 
  282    return createLeafIteratorEnd <0, All_Partition> (level);
 
  286  template< ALU3dGr
idElementType elType, 
class Comm >
 
  287  inline typename ALU3dGrid< elType, Comm >::LeafIteratorType
 
  288  ALU3dGrid< elType, Comm >::leafend ()
 const 
  290    return createLeafIteratorEnd <0,All_Partition> (maxlevel_);
 
  297  template< ALU3dGr
idElementType elType, 
class Comm >
 
  301    bool marked = (this->getRealImplementation( entity )).mark(ref);
 
  304      if(ref > 0) ++refineMarked_;
 
  305      if(ref < 0) ++coarsenMarked_;
 
  312  template< ALU3dGr
idElementType elType, 
class Comm >
 
  316    return this->getRealImplementation( entity ).getMark();
 
  321  template< ALU3dGr
idElementType elType, 
class Comm >
 
  322  template< 
class Gr
idImp, 
class DataHandle >
 
  327    assert( (refCount + maxLevel()) < MAXL );
 
  329    for( 
int count = refCount; count > 0; --count )
 
  331      const LeafIteratorType end = leafend();
 
  332      for( LeafIteratorType it = leafbegin(); it != end; ++it )
 
  341  template< ALU3dGr
idElementType elType, 
class Comm >
 
  342  template< 
class Gr
idImp, 
class DataHandle >
 
  349    typedef typename EntityObject::ImplementationType EntityImp;
 
  350    EntityObject father( EntityImp( factory(), this->maxLevel() ) );
 
  351    EntityObject son   ( EntityImp( factory(), this->maxLevel() ) );
 
  354    bool mightCoarse = preAdapt();
 
  356    bool refined = false ;
 
  361      ALU3DSPACE AdaptRestrictProlongGlSet< MyType, AdaptDataHandle, GlobalIdSetImp >
 
  363         father,this->getRealImplementation(father),
 
  364         son,   this->getRealImplementation(son),
 
  368      refined = myGrid().duneAdapt(rp); 
 
  372      ALU3DSPACE AdaptRestrictProlongImpl< MyType, AdaptDataHandle >
 
  374         father,this->getRealImplementation(father),
 
  375         son,   this->getRealImplementation(son),
 
  378      refined = myGrid().duneAdapt(rp); 
 
  381    if(refined || mightCoarse)
 
  398  template< ALU3dGr
idElementType elType, 
class Comm >
 
  399  struct ALU3dGridCommHelper;
 
  401  template< ALU3dGr
idElementType elType >
 
  402  struct ALU3dGridCommHelper< elType, No_Comm >
 
  406    static bool loadBalance ( 
Grid &grid ) { 
return false; }
 
  408    template< 
class DataHandle >
 
  409    static bool loadBalance ( Grid &grid, DataHandle &data ) { 
return false; }
 
  411    template< 
class DataHandle, 
class DataType >
 
  412    static void communicate ( 
const Grid &grid,
 
  413                              const CommDataHandleIF< DataHandle, DataType > &data,
 
  419    template< 
class DataHandle, 
class DataType >
 
  420    static void communicate ( 
const Grid &grid,
 
  421                              const CommDataHandleIF< DataHandle, DataType > &data,
 
  427#if ALU3DGRID_PARALLEL 
  428  template< ALU3dGr
idElementType elType >
 
  429  struct ALU3dGridCommHelper< elType, MPI_Comm >
 
  431    typedef ALU3dGrid< elType, MPI_Comm > Grid;
 
  432    typedef ALU3DSPACE GatherScatter GatherScatterType;
 
  434    static bool loadBalance ( Grid &grid )
 
  436      if( grid.comm().size() <= 1 )
 
  439      const bool changed = grid.myGrid().duneLoadBalance();
 
  443        grid.myGrid().duneExchangeDynamicState();
 
  451        if( grid.globalIdSet_ )
 
  452          grid.globalIdSet_->updateIdSet();
 
  462    template< 
class DataHandle >
 
  463    static bool loadBalance ( Grid &grid, DataHandle &data )
 
  465      if( grid.comm().size() <= 1 )
 
  468      typedef typename Grid :: EntityObject EntityObject;
 
  469      typedef typename EntityObject::ImplementationType EntityImp;
 
  470      EntityObject en     ( EntityImp( grid.factory(), grid.maxLevel()) );
 
  471      EntityObject father ( EntityImp( grid.factory(), grid.maxLevel()) );
 
  472      EntityObject son    ( EntityImp( grid.factory(), grid.maxLevel()) );
 
  474      typedef ALU3DSPACE LoadBalanceElementCount< Grid, DataHandle > LDBElCountType;
 
  478      LDBElCountType elCount( grid,
 
  479                              father, Grid::getRealImplementation( father ),
 
  480                              son, Grid::getRealImplementation( son ),
 
  483      ALU3DSPACE GatherScatterLoadBalance< Grid, DataHandle, LDBElCountType >
 
  484      gs( grid, en, Grid::getRealImplementation( en ), data, elCount );
 
  487      const bool changed = grid.myGrid().duneLoadBalance( gs, elCount );
 
  492        grid.myGrid().duneExchangeDynamicState();
 
  500        if( grid.globalIdSet_ )
 
  501          grid.globalIdSet_->updateIdSet();
 
  512    template< 
class DataHandle, 
class DataType >
 
  513    static void communicate ( 
const Grid &grid,
 
  514                              CommDataHandleIF< DataHandle, DataType > &data,
 
  519      typedef CommDataHandleIF< DataHandle, DataType > DataHandleType;
 
  520      typedef MakeableInterfaceObject< typename Grid::Traits::template Codim< 3 >::Entity > VertexObject;
 
  521      typedef typename VertexObject::ImplementationType VertexImp;
 
  522      typedef MakeableInterfaceObject< typename Grid::Traits::template Codim< 2 >::Entity > EdgeObject;
 
  523      typedef typename EdgeObject::ImplementationType EdgeImp;
 
  524      typedef MakeableInterfaceObject< typename Grid::Traits::template Codim< 1 >::Entity > FaceObject;
 
  525      typedef typename FaceObject::ImplementationType FaceImp;
 
  526      typedef MakeableInterfaceObject< typename Grid::Traits::template Codim< 0 >::Entity> ElementObject;
 
  527      typedef typename ElementObject::ImplementationType ElementImp;
 
  529      if( grid.comm().size() > 1 )
 
  533        const typename Grid::LevelIndexSetImp *levelISet;
 
  534        if( !grid.levelIndexVec_[ level ] )
 
  535          levelISet = 
new typename Grid::LevelIndexSetImp(
 
  537            grid.template lbegin<0>( level ),
 
  538            grid.template lend<0>( level ), level );
 
  540          levelISet = grid.levelIndexVec_[ level ];
 
  542        VertexObject vx( VertexImp( grid.factory(), level ) );
 
  543        ALU3DSPACE GatherScatterLevelData< Grid, DataHandleType, 3 >
 
  544        vertexData( grid, vx, Grid::getRealImplementation( vx ), data, *levelISet, level );
 
  546        EdgeObject edge( EdgeImp( grid.factory(), level ) );
 
  547        ALU3DSPACE GatherScatterLevelData< Grid, DataHandleType, 2 >
 
  548        edgeData( grid, edge, Grid::getRealImplementation( edge ), data, *levelISet, level );
 
  550        FaceObject face( FaceImp( grid.factory(), level ) );
 
  551        ALU3DSPACE GatherScatterLevelData< Grid, DataHandleType, 1 >
 
  552        faceData( grid, face, Grid::getRealImplementation( face ), data, *levelISet, level );
 
  554        ElementObject element( ElementImp( grid.factory(), level ) );
 
  555        ALU3DSPACE GatherScatterLevelData< Grid, DataHandleType, 0 >
 
  556        elementData( grid, element, Grid::getRealImplementation( element ), data, *levelISet, level );
 
  558        doCommunication( grid, vertexData, edgeData, faceData, elementData, iftype, dir );
 
  560        if( !grid.levelIndexVec_[ level ] )
 
  565    template< 
class DataHandle, 
class DataType >
 
  566    static void communicate ( 
const Grid &grid,
 
  567                              CommDataHandleIF< DataHandle, DataType > &data,
 
  571      typedef CommDataHandleIF< DataHandle, DataType > DataHandleType;
 
  572      typedef MakeableInterfaceObject< typename Grid::Traits::template Codim< 3 >::Entity > VertexObject;
 
  573      typedef typename VertexObject::ImplementationType VertexImp;
 
  574      typedef MakeableInterfaceObject< typename Grid::Traits::template Codim< 2 >::Entity > EdgeObject;
 
  575      typedef typename EdgeObject::ImplementationType EdgeImp;
 
  576      typedef MakeableInterfaceObject< typename Grid::Traits::template Codim< 1 >::Entity > FaceObject;
 
  577      typedef typename FaceObject::ImplementationType FaceImp;
 
  578      typedef MakeableInterfaceObject< typename Grid::Traits::template Codim< 0 >::Entity> ElementObject;
 
  579      typedef typename ElementObject::ImplementationType ElementImp;
 
  581      if( grid.comm().size() > 1 )
 
  583        VertexObject vx( VertexImp( grid.factory(), grid.maxLevel() ) );
 
  584        ALU3DSPACE GatherScatterLeafData< Grid, DataHandleType, 3 >
 
  585        vertexData( grid, vx, Grid::getRealImplementation( vx ), data );
 
  587        EdgeObject edge( EdgeImp( grid.factory(), grid.maxLevel() ) );
 
  588        ALU3DSPACE GatherScatterLeafData< Grid, DataHandleType, 2 >
 
  589        edgeData( grid, edge, Grid::getRealImplementation( edge ), data );
 
  591        FaceObject face( FaceImp( grid.factory(), grid.maxLevel()) );
 
  592        ALU3DSPACE GatherScatterLeafData< Grid, DataHandleType, 1 >
 
  593        faceData( grid, face, Grid::getRealImplementation( face ), data );
 
  595        ElementObject element( ElementImp( grid.factory(), grid.maxLevel() ) );
 
  596        ALU3DSPACE GatherScatterLeafData< Grid, DataHandleType, 0 >
 
  597        elementData( grid, element, Grid::getRealImplementation( element ), data );
 
  599        doCommunication( grid, vertexData, edgeData, faceData, elementData, iftype, dir );
 
  604    doCommunication ( 
const Grid &grid,
 
  605                      GatherScatterType &vertexData, GatherScatterType &edgeData,
 
  606                      GatherScatterType &faceData, GatherScatterType &elementData,
 
  612        dverb << 
"ALUGrid contains no overlap, therefore no communication for" << std::endl;
 
  613        dverb << 
"Overlap_OverlapFront_Interface or Overlap_All_Interface interfaces!" << std::endl;
 
  617        grid.myGrid().borderBorderCommunication(vertexData,edgeData,faceData,elementData);
 
  622          grid.myGrid().interiorGhostCommunication(vertexData,edgeData,faceData,elementData);
 
  625          grid.myGrid().ghostInteriorCommunication(vertexData,edgeData,faceData,elementData);
 
  629        grid.myGrid().allAllCommunication(vertexData,edgeData,faceData,elementData);
 
  631        DUNE_THROW( GridError, 
"Wrong set of parameters in ALUGridCommHelper::doCommunication" );
 
  638  template< ALU3dGr
idElementType elType, 
class Comm >
 
  641    return ALU3dGridCommHelper< elType, Comm >::loadBalance( *
this );
 
  646  template< ALU3dGr
idElementType elType, 
class Comm >
 
  647  template< 
class DataHandle >
 
  650    return ALU3dGridCommHelper< elType, Comm >::loadBalance( *
this, data );
 
  655  template< ALU3dGr
idElementType elType, 
class Comm >
 
  656  template <
class DataHandleImp,
class DataType>
 
  661    ALU3dGridCommHelper< elType, Comm >::communicate( *
this, data, iftype, dir, level );
 
  666  template< ALU3dGr
idElementType elType, 
class Comm >
 
  667  template <
class DataHandleImp, 
class DataType>
 
  669  communicate (CommDataHandleIF<DataHandleImp,DataType> & data,
 
  672    ALU3dGridCommHelper< elType, Comm >::communicate( *
this, data, iftype, dir );
 
  677  template< ALU3dGr
idElementType elType, 
class Comm >
 
  681      return "ALUCubeGrid";
 
  683      return "ALUSimplexGrid";
 
Leaf iterator.
Definition: iterator.hh:585
 
Definition: iterator.hh:504
 
[ provides Dune::Grid ]
Definition: grid.hh:406
 
bool mark(int refCount, const typename Traits::template Codim< 0 >::Entity &e)
Marks an entity to be refined/coarsened in a subsequent adapt.
Definition: grid_inline.hh:299
 
bool adapt()
Refine all positive marked leaf entities, coarsen all negative marked entities if possible.
 
void communicate(CommDataHandleIF< DataHandleImp, DataTypeImp > &data, InterfaceType iftype, CommunicationDirection dir, int level) const
Communicate information on distributed entities on a given level Template parameter is a model of Dun...
 
Traits::DuneBoundaryProjectionVector DuneBoundaryProjectionVector
boundary projection type
Definition: grid.hh:496
 
void checkMacroGridFile(const std::string filename)
check whether macro grid format is of our type
 
void globalRefine(int refCount)
uses the interface, mark on entity and refineLocal
 
bool loadBalance()
Calculates load of each process and repartition the grid if neccessary. For parameters of the load ba...
Definition: grid_inline.hh:639
 
int global_size(int cd) const
number of grid entities on all levels for given codim
Definition: grid_inline.hh:82
 
int getMark(const typename Traits::template Codim< 0 >::Entity &e) const
returns adaptation mark for given entity
Definition: grid_inline.hh:314
 
void calcExtras()
reset size and global size, update Level- and LeafIndexSet, if they exist
 
static std::string name()
for grid identification
Definition: grid_inline.hh:678
 
ALU3dGrid(const std::string ¯oTriangFilename, const MPICommunicatorType mpiComm, const DuneBoundaryProjectionType *bndPrj, const DuneBoundaryProjectionVector *bndVec, const ALUGridRefinementType refinementType) DUNE_DEPRECATED_MSG("ALUGrid is deprecated
Definition: grid_inline.hh:21
 
const CollectiveCommunication & comm() const
return const reference to a collective communication object. The return type is a model of Dune::Coll...
Definition: grid.hh:785
 
void postAdapt()
clear all entity new markers
 
Traits::template Codim< cd >::template Partition< pitype >::LevelIterator lend(int level) const
one past the end on this level
Definition: grid_inline.hh:133
 
Traits::template Codim< cd >::template Partition< pitype >::LevelIterator lbegin(int level) const
Iterator to first entity of given codim on level.
Definition: grid_inline.hh:119
 
void checkMacroGrid()
check whether macro grid has the right element type
 
int maxLevel() const
Return maximum level defined in this grid. Levels are numbered maxLevel with 0 the coarsest level.
Definition: grid_inline.hh:100
 
ALUGrid boundary projection implementation DuneBndProjection has to fulfil the DuneBoundaryProjection...
Definition: bndprojection.hh:15
 
Interface class for the Grid's adapt method where the parameter is a AdaptDataHandleInterface.
Definition: adaptcallback.hh:31
 
int rank() const
Return rank, is between 0 and size()-1.
Definition: collectivecommunication.hh:82
 
CommDataHandleIF describes the features of a data handle for communication in parallel runs using the...
Definition: datahandleif.hh:73
 
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:25
 
void makeSimplex(unsigned int dim)
Make a simplex of given dimension.
Definition: type.hh:193
 
void makeCube(unsigned int dim)
Make a hypercube of given dimension.
Definition: type.hh:200
 
Grid abstract base class.
Definition: grid.hh:388
 
#define DUNE_THROW(E, m)
Definition: exceptions.hh:243
 
DVerbType dverb(std::cout)
Singleton of verbose debug stream.
Definition: stdstreams.hh:114
 
Dune namespace.
Definition: alignment.hh:10
 
ALUGridRefinementType
available refinement types for ALUGrid
Definition: declaration.hh:20
 
Standard Dune debug streams.
 
Static tag representing a codimension.
Definition: dimension.hh:22
 
Interface class for vertex projection at the boundary.
Definition: boundaryprojection.hh:24
 
Class providing access to the singletons of the reference elements.
Definition: referenceelements.hh:479