3 #ifndef DUNE_ALBERTAGRID_IMP_HH
4 #define DUNE_ALBERTAGRID_IMP_HH
11 #if HAVE_ALBERTA || DOXYGEN
36 #include "albertaheader.hh"
38 #include <dune/grid/albertagrid/misc.hh>
39 #include <dune/grid/albertagrid/capabilities.hh>
40 #include <dune/grid/albertagrid/backuprestore.hh>
42 #include <dune/grid/albertagrid/coordcache.hh>
44 #include <dune/grid/albertagrid/level.hh>
45 #include <dune/grid/albertagrid/intersection.hh>
47 #include <dune/grid/albertagrid/datahandle.hh>
48 #include <dune/grid/albertagrid/entityseed.hh>
50 #include "indexsets.hh"
51 #include "geometry.hh"
54 #include "hierarchiciterator.hh"
55 #include "treeiterator.hh"
56 #include "leveliterator.hh"
57 #include "leafiterator.hh"
65 template<
class Gr
id >
66 struct DGFGridFactory;
136 template<
int dim,
int dimworld = Alberta::dimWorld >
139 < dim, dimworld, Alberta::Real, AlbertaGridFamily< dim, dimworld > >
143 < dim, dimworld, Alberta::Real, AlbertaGridFamily< dim, dimworld > >
148 template<
class >
friend class AlbertaLevelGridView;
149 template<
class >
friend class AlbertaLeafGridView;
152 friend struct DGFGridFactory<
This >;
156 friend class AlbertaGridIntersectionBase< const
This >;
157 friend class AlbertaGridLeafIntersection< const
This >;
160 #if (__GNUC__ < 4) && !(defined __ICC)
165 friend class AlbertaGridIndexSet< dim, dimworld >;
166 friend class AlbertaGridHierarchicIndexSet< dim, dimworld >;
168 template< class, class >
169 friend class Alberta::AdaptRestrictProlongHandler;
175 typedef typename GridFamily::ctype ctype;
177 static const int dimension = GridFamily::dimension;
178 static const int dimensionworld = GridFamily::dimensionworld;
181 typedef typename AlbertaGridFamily< dim, dimworld >::Traits Traits;
201 typedef typename Traits::template
Codim<0>::LeafIterator LeafIterator;
207 struct AdaptationState
209 enum Phase { ComputationPhase, PreAdaptationPhase, PostAdaptationPhase };
218 : phase_( ComputationPhase ),
223 void mark (
int count )
228 refineMarked_ += (2 << count);
231 void unmark (
int count )
236 refineMarked_ -= (2 << count);
239 bool coarsen ()
const
241 return (coarsenMarked_ > 0);
244 int refineMarked ()
const
246 return refineMarked_;
251 if( phase_ != ComputationPhase )
252 error(
"preAdapt may only be called in computation phase." );
253 phase_ = PreAdaptationPhase;
258 if( phase_ != PreAdaptationPhase )
259 error(
"adapt may only be called in preadapdation phase." );
260 phase_ = PostAdaptationPhase;
265 if( phase_ != PostAdaptationPhase )
266 error(
"postAdapt may only be called in postadaptation phase." );
267 phase_ = ComputationPhase;
274 void error (
const std::string &message )
280 template<
class DataHandler >
281 struct AdaptationCallback;
284 static const int MAXL = 64;
286 typedef Alberta::ElementInfo< dimension > ElementInfo;
287 typedef Alberta::MeshPointer< dimension > MeshPointer;
288 typedef Alberta::HierarchyDofNumbering< dimension > DofNumbering;
289 typedef AlbertaGridLevelProvider< dimension > LevelProvider;
293 This &operator= (
const This & );
304 AlbertaGrid (
const Alberta::MacroData< dimension > ¯oData,
308 template<
class Proj,
class Impl >
309 AlbertaGrid (
const Alberta::MacroData< dimension > ¯oData,
310 const Alberta::ProjectionFactoryInterface< Proj, Impl > &projectionFactory );
316 AlbertaGrid (
const std::string ¯oGridFileName );
326 template<
int cd, PartitionIteratorType pitype>
331 template<
int cd, PartitionIteratorType pitype>
333 lend (
int level)
const;
336 template<
int codim >
338 lbegin (
int level )
const;
341 template<
int codim >
343 lend (
int level )
const;
346 template<
int codim, PartitionIteratorType pitype >
352 template<
int codim, PartitionIteratorType pitype >
358 template<
int codim >
363 template<
int codim >
371 int size (
int level,
int codim)
const;
377 int size (
int codim)
const;
385 return numBoundarySegments_;
392 typedef typename View::GridViewImp ViewImp;
393 return View( ViewImp( *
this, level ) );
400 typedef typename View::GridViewImp ViewImp;
401 return View( ViewImp( *
this ) );
420 template<
class DataHandle >
427 template<
class DataHandle >
443 static std::string typeName ()
445 std::ostringstream s;
446 s <<
"AlbertaGrid< " << dim <<
", " << dimworld <<
" >";
451 template<
class EntitySeed >
452 typename Traits::template Codim< EntitySeed::codimension >::Entity
456 return EntityImpl( *
this, this->getRealImplementation(seed).elementInfo( meshPointer() ), this->getRealImplementation(seed).subEntity() );
463 bool writeGrid(
const std::string &filename, ctype time )
const;
466 bool readGrid(
const std::string &filename, ctype &time );
472 const typename Traits :: LevelIndexSet &
levelIndexSet (
int level)
const;
475 const typename Traits :: LeafIndexSet &
leafIndexSet ()
const;
490 ALBERTA MESH* getMesh ()
const
495 const MeshPointer &meshPointer ()
const
500 const DofNumbering &dofNumbering ()
const
502 return dofNumbering_;
505 const LevelProvider &levelProvider ()
const
507 return levelProvider_;
510 int dune2alberta (
int codim,
int i )
const
512 return numberingMap_.dune2alberta( codim, i );
515 int alberta2dune (
int codim,
int i )
const
517 return numberingMap_.alberta2dune( codim, i );
520 int generic2alberta (
int codim,
int i )
const
522 return genericNumberingMap_.dune2alberta( codim, i );
525 int alberta2generic (
int codim,
int i )
const
527 return genericNumberingMap_.alberta2dune( codim, i );
533 writeGridXdr ( const std::
string &filename, ctype time ) const;
538 readGridXdr ( const std::
string &filename, ctype &time );
541 using Base::getRealImplementation;
543 typedef std::vector<
int> ArrayType;
558 typedef MakeableInterfaceObject< typename Traits::template Codim< 0 >::Entity >
562 friend class AlbertaGridLeafIntersectionIterator< const This >;
564 template<
int codim >
566 getTwist ( const typename Traits::template Codim< codim >::Entity &
entity )
568 return getRealImplementation(
entity ).twist();
571 template<
int codim >
573 getTwist (
const typename Traits::template Codim< 0 >::Entity &
entity,
int subEntity )
575 return getRealImplementation(
entity ).template twist< codim >( subEntity );
579 getTwistInInside (
const typename Traits::LeafIntersection &intersection )
581 return getRealImplementation( intersection ).twistInInside();
585 getTwistInOutside (
const typename Traits::LeafIntersection &intersection )
587 return getRealImplementation( intersection ).twistInOutside();
590 const AlbertaGridLeafIntersection< const This > &
591 getRealIntersection (
const typename Traits::LeafIntersection &intersection )
const
593 return getRealImplementation( intersection );
598 const Alberta::GlobalVector &
599 getCoord (
const ElementInfo &elementInfo,
int vertex )
const;
612 size_t numBoundarySegments_;
615 Alberta::NumberingMap< dimension, Alberta::Dune2AlbertaNumbering > numberingMap_;
616 Alberta::NumberingMap< dimension, Alberta::Generic2AlbertaNumbering > genericNumberingMap_;
618 DofNumbering dofNumbering_;
620 LevelProvider levelProvider_;
630 mutable std::vector< typename GridFamily::LevelIndexSetImp * > levelIndexVec_;
634 mutable typename GridFamily::LeafIndexSetImp* leafIndexSet_;
636 SizeCache< This > sizeCache_;
638 typedef AlbertaMarkerVector< dim, dimworld > MarkerVector;
641 mutable MarkerVector leafMarkerVector_;
644 mutable std::vector< MarkerVector > levelMarkerVector_;
646 #if DUNE_ALBERTA_CACHE_COORDINATES
647 Alberta::CoordCache< dimension > coordCache_;
651 AdaptationState adaptationState_;
656 #include "albertagrid.cc"
662 #ifdef _ABS_NOT_DEFINED_
666 #ifdef _MIN_NOT_DEFINED_
670 #ifdef _MAX_NOT_DEFINED_
674 #ifdef obstack_chunk_alloc
675 #undef obstack_chunk_alloc
677 #ifdef obstack_chunk_free
678 #undef obstack_chunk_free
725 #ifdef DEBUG_TEST_EXIT
726 #undef DEBUG_TEST_EXIT
745 #ifdef PRINT_REAL_VEC
746 #undef PRINT_REAL_VEC
765 #ifdef FREE_WORKSPACE
766 #undef FREE_WORKSPACE
interfaces and wrappers needed for the callback adaptation provided by AlbertaGrid and dune-ALUGrid
provides the GridFamily for AlbertaGrid
Implementation of the IntersectionIterator for AlbertaGrid.
Interface class for the Grid's adapt method where the parameter is a AdaptDataHandleInterface.
Definition: adaptcallback.hh:31
EntityPointer implementation for AlbertaGrid.
Definition: entitypointer.hh:19
Definition: hierarchiciterator.hh:29
hierarchic index set of AlbertaGrid
Definition: indexsets.hh:537
[ provides Dune::Grid ]
Definition: agrid.hh:140
bool readGrid(const std::string &filename, ctype &time)
read Grid from file filename and store time of mesh in time
Definition: albertagrid.cc:599
Traits ::template Codim< codim >::template Partition< pitype >::LeafIterator leafbegin() const
return LeafIterator which points to first leaf entity
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.hh:973
int getMark(const typename Traits::template Codim< 0 >::Entity &e) const
returns adaptation mark for given entity, i.e. here the default implementation returns 0.
Definition: grid.hh:985
int maxLevel() const
Definition: albertagrid.cc:481
Traits::template Codim< cd >::template Partition< pitype >::LevelIterator lbegin(int level) const
Iterator to first entity of given codim on level.
Definition: albertagrid.cc:204
AlbertaGrid()
create an empty grid
Definition: albertagrid.cc:40
Traits::template Codim< cd >::template Partition< pitype >::LevelIterator lend(int level) const
one past the end on this level
Definition: albertagrid.cc:224
Traits::LeafGridView leafGridView() const
View for the leaf grid for All_Partition.
Definition: agrid.hh:397
bool adapt()
Refine all positive marked leaf entities, coarsen all negative marked entities if possible.
Definition: albertagrid.cc:413
bool readGridXdr(const std::string &filename, ctype &time)
reads ALBERTA mesh file
Definition: albertagrid.cc:581
const LocalIdSet & localIdSet() const
return local IdSet
Definition: agrid.hh:484
void postAdapt()
clean up some markers
Definition: albertagrid.cc:354
std::size_t numBoundarySegments() const
number of boundary segments within the macro grid
Definition: agrid.hh:383
const CollectiveCommunication & comm() const
return reference to collective communication, if MPI found this is specialisation for MPI
Definition: agrid.hh:438
AlbertaGridFamily< dim, dimworld > GridFamily
the grid family of AlbertaGrid
Definition: agrid.hh:173
const Traits ::LevelIndexSet & levelIndexSet(int level) const
return level index set for given level
Definition: albertagrid.cc:518
int size(int level, int codim) const
Number of grid entities per level and codim because lbegin and lend are none const,...
Definition: albertagrid.cc:488
Traits::HierarchicIndexSet HierarchicIndexSet
type of hierarchic index set
Definition: agrid.hh:189
const Traits ::LeafIndexSet & leafIndexSet() const
return leaf index set
Definition: albertagrid.cc:533
bool writeGrid(const std::string &filename, ctype time) const
write Grid to file in Xdr
Definition: albertagrid.cc:589
Traits::LevelGridView levelGridView(int level) const
View for a grid level for All_Partition.
Definition: agrid.hh:389
Traits ::template Codim< codim >::template Partition< pitype >::LeafIterator leafend() const
return LeafIterator which points behind last leaf entity
void globalRefine(int refCount)
uses the interface, mark on entity and refineLocal
Definition: albertagrid.cc:302
Traits::template Codim< EntitySeed::codimension >::Entity entity(const EntitySeed &seed) const
obtain Entity from EntitySeed.
Definition: agrid.hh:453
~AlbertaGrid()
desctructor
Definition: albertagrid.cc:194
const GlobalIdSet & globalIdSet() const
return global IdSet
Definition: agrid.hh:478
bool preAdapt()
returns true, if a least one element is marked for coarsening
Definition: albertagrid.cc:346
Traits::CollectiveCommunication CollectiveCommunication
type of collective communication
Definition: agrid.hh:197
marker assigning subentities to one element containing them
Definition: treeiterator.hh:30
Collective communication interface and sequential default implementation.
Definition: collectivecommunication.hh:79
Store a reference to an entity with a minimal memory footprint.
Definition: entityseed.hh:24
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:268
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.hh:973
int getMark(const typename Traits::template Codim< 0 >::Entity &e) const
returns adaptation mark for given entity, i.e. here the default implementation returns 0.
Definition: grid.hh:985
Provide a generic factory class for unstructured grids.
Definition: gridfactory.hh:263
Grid view abstract base class.
Definition: gridview.hh:60
Id Set Interface.
Definition: indexidset.hh:402
Index Set Interface base class.
Definition: indexidset.hh:76
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:279
Implements an utility class that provides collective communication methods for sequential programs.
Wrapper and interface class for a static iterator (EntityPointer)
Different resources needed by all grid implementations.
Provide a generic factory class for unstructured grids.
Definition of the DUNE_DEPRECATED macro for the case that config.h is not available.
Implements a matrix constructed from a given type representing a field and compile-time given number ...
Implements a vector constructed from a given type representing a field and a compile-time given size.
struct DUNE_DEPRECATED_MSG("Use <type_traits> instead!") ConstantVolatileTraits
Determines whether a type is const or volatile and provides the unqualified types.
Definition: typetraits.hh:57
#define DUNE_THROW(E, m)
Definition: exceptions.hh:216
Dune namespace.
Definition: alignment.hh:11
Provides size cache classes to implement the grids size method efficiently.
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
Contains #undefs for all preprocessor macros defined by alberta.