5#ifndef DUNE_ALBERTAGRID_CC
6#define DUNE_ALBERTAGRID_CC
28 template<
int dim,
int dimworld >
33 "Template Parameter dimworld does not match "
34 "ALBERTA's DIM_OF_WORLD setting.");
41 template<
int dim,
int dimworld >
45 numBoundarySegments_( 0 ),
46 hIndexSet_( dofNumbering_ ),
48 levelIndexVec_( (size_t)MAXL, 0 ),
51 leafMarkerVector_( dofNumbering_ ),
52 levelMarkerVector_( (size_t)MAXL,
MarkerVector( dofNumbering_ ) )
58 template<
int dim,
int dimworld >
59 template<
class Proj,
class Impl >
65 numBoundarySegments_( 0 ),
66 hIndexSet_( dofNumbering_ ),
68 levelIndexVec_( (size_t)MAXL, 0 ),
71 leafMarkerVector_( dofNumbering_ ),
72 levelMarkerVector_( (size_t)MAXL,
MarkerVector( dofNumbering_ ) )
76 numBoundarySegments_ = mesh_.
create( macroData, projectionFactory );
78 DUNE_THROW(
AlbertaError,
"Invalid macro data structure." );
87 template<
int dim,
int dimworld >
93 numBoundarySegments_( 0 ),
94 hIndexSet_( dofNumbering_ ),
96 levelIndexVec_( (size_t)MAXL, 0 ),
99 leafMarkerVector_( dofNumbering_ ),
100 levelMarkerVector_( (size_t)MAXL,
MarkerVector( dofNumbering_ ) )
104 if( projection != 0 )
107 numBoundarySegments_ = mesh_.
create( macroData, projectionFactory );
110 numBoundarySegments_ = mesh_.
create( macroData );
112 DUNE_THROW(
AlbertaError,
"Invalid macro data structure." );
121 template <
int dim,
int dimworld >
126 hIndexSet_( dofNumbering_ ),
127 idSet_( hIndexSet_ ),
128 levelIndexVec_( (size_t)MAXL, 0 ),
131 leafMarkerVector_( dofNumbering_ ),
132 levelMarkerVector_( (size_t)MAXL,
MarkerVector( dofNumbering_ ) )
136 numBoundarySegments_ = mesh_.
create( macroGridFileName );
140 "Grid file '" << macroGridFileName
141 <<
"' is not in ALBERTA macro triangulation format." );
149 std::cout <<
typeName() <<
" created from macro grid file '"
150 << macroGridFileName <<
"'." << std::endl;
154 template<
int dim,
int dimworld >
157 dofNumbering_.create( mesh_ );
159 levelProvider_.create( dofNumbering_ );
161#if DUNE_ALBERTA_CACHE_COORDINATES
162 coordCache_.create( dofNumbering_ );
167 template<
int dim,
int dimworld >
168 inline void AlbertaGrid< dim, dimworld >::removeMesh ()
170 for(
size_t i = 0; i < levelIndexVec_.size(); ++i )
172 if( levelIndexVec_[ i ] != 0 )
173 delete levelIndexVec_[ i ];
174 levelIndexVec_[ i ] = 0;
177 if( leafIndexSet_ != 0 )
178 delete leafIndexSet_;
182 hIndexSet_.release();
183 levelProvider_.release();
184#if DUNE_ALBERTA_CACHE_COORDINATES
185 coordCache_.release();
187 dofNumbering_.release();
195 template<
int dim,
int dimworld >
202 template<
int dim,
int dimworld >
203 template<
int codim, PartitionIteratorType pitype >
205 ::template Codim< codim >::template Partition<pitype>::LevelIterator
209 assert( level >= 0 );
211 if( level > maxlevel_ )
212 return lend< codim, pitype >( level );
213 MarkerVector &markerVector = levelMarkerVector_[ level ];
215 if( (codim > 0) && !markerVector.
up2Date() )
216 markerVector.template markSubEntities< 1 >( lbegin< 0 >( level ), lend< 0 >( level ) );
218 return LevelIteratorImp( *
this, &markerVector, level );
222 template<
int dim,
int dimworld >
223 template<
int codim, PartitionIteratorType pitype >
225 ::template Codim< codim >::template Partition< pitype >::LevelIterator
229 assert( level >= 0 );
231 return LevelIteratorImp( *
this, level );
235 template<
int dim,
int dimworld >
236 template<
int codim >
238 ::template Codim< codim >::LevelIterator
241 return lbegin< codim, All_Partition >( level );
245 template<
int dim,
int dimworld >
246 template<
int codim >
248 ::template Codim< codim >::LevelIterator
251 return lend< codim, All_Partition >( level );
255 template<
int dim,
int dimworld >
256 template<
int codim, PartitionIteratorType pitype >
258 ::template Codim< codim >::template Partition< pitype >::LeafIterator
264 const int firstMarkedCodim = 2;
265 if( (codim >= firstMarkedCodim) && !markerVector.
up2Date() )
266 markerVector.template markSubEntities< firstMarkedCodim >( leafbegin< 0 >(), leafend< 0 >() );
268 return LeafIteratorImp( *
this, &markerVector, maxlevel_ );
272 template<
int dim,
int dimworld >
273 template<
int codim, PartitionIteratorType pitype >
275 ::template Codim< codim >::template Partition< pitype >::LeafIterator
279 return LeafIteratorImp( *
this, maxlevel_ );
283 template<
int dim,
int dimworld >
284 template<
int codim >
286 ::template Codim< codim >::LeafIterator
289 return leafbegin< codim, All_Partition >();
293 template<
int dim,
int dimworld >
294 template<
int codim >
296 ::template Codim< codim >::LeafIterator
299 return leafend< codim, All_Partition >();
303 template<
int dim,
int dimworld >
309 assert( (refCount >= 0) && (refCount + maxlevel_ < MAXL) );
311 for(
int i = 0; i < refCount; ++i )
314 const LeafIterator endit = leafend< 0 >();
315 for( LeafIterator it = leafbegin< 0 >(); it != endit; ++it )
325 template<
int dim,
int dimworld >
326 template<
class DataHandle >
333 assert( (refCount >= 0) && (refCount + maxlevel_ < MAXL) );
335 for(
int i = 0; i < refCount; ++i )
338 const LeafIterator endit = leafend< 0 >();
339 for( LeafIterator it = leafbegin< 0 >(); it != endit; ++it )
347 template<
int dim,
int dimworld >
350 adaptationState_.preAdapt();
351 return adaptationState_.coarsen();
355 template <
int dim,
int dimworld >
359 if( leafIndexSet_ != 0 )
361 bool consistent =
true;
362 for(
int codim = 0; codim <= dimension; ++codim )
364 if(
int(leafIndexSet_->size( codim )) == mesh_.size( codim ) )
366 std::cerr <<
"Incorrect size of leaf index set for codimension "
367 << codim <<
"!" << std::endl;
368 std::cerr <<
"DUNE index set reports: " << leafIndexSet_->size( codim )
370 std::cerr <<
"ALBERTA mesh reports: " << mesh_.size( codim ) << std::endl;
378 levelProvider_.markAllOld();
379 adaptationState_.postAdapt();
383 template<
int dim,
int dimworld >
392 if( refCount < -e.level() )
396 adaptationState_.unmark( getMark( e ) );
399 adaptationState_.
mark( refCount );
400 e.impl().elementInfo().setMark( refCount );
406 template<
int dim,
int dimworld >
410 return e.impl().elementInfo().getMark();
414 template<
int dim,
int dimworld >
421 hIndexSet_.preAdapt();
422 const bool refined = mesh_.refine();
423 const bool coarsened = (adaptationState_.coarsen() ? mesh_.coarsen() :
false);
424 adaptationState_.adapt();
425 hIndexSet_.postAdapt();
427 if( refined || coarsened )
435 template<
int dim,
int dimworld >
436 template<
class DataHandle >
437 inline bool AlbertaGrid < dim, dimworld >
445 DataHandler dataHandler( *
this, handle );
448 typename Callback::DofVectorPointer callbackVector;
449 callbackVector.create( dofNumbering_.emptyDofSpace(),
"Adaptation Callback" );
450 callbackVector.template setupInterpolation< Callback >();
451 callbackVector.template setupRestriction< Callback >();
452 if( Callback::DofVectorPointer::supportsAdaptationData )
453 callbackVector.setAdaptationData( &dataHandler );
457 bool refined = adapt();
459 if( !Callback::DofVectorPointer::supportsAdaptationData )
461 callbackVector.release();
468 template<
int dim,
int dimworld >
473 assert( (vertex >= 0) && (vertex <= dim) );
474#if DUNE_ALBERTA_CACHE_COORDINATES
475 return coordCache_( elementInfo, vertex );
482 template <
int dim,
int dimworld >
489 template<
int dim,
int dimworld >
492 return ((level >= 0) && (level <= maxlevel_) ? sizeCache_.size( level, codim ) : 0);
496 template<
int dim,
int dimworld >
499 return ((level >= 0) && (level <= maxlevel_) ? sizeCache_.size( level, type ) : 0);
503 template<
int dim,
int dimworld >
506 assert( sizeCache_.size( codim ) == mesh_.size( codim ) );
507 return mesh_.size( codim );
511 template<
int dim,
int dimworld >
514 return sizeCache_.size( type );
518 template <
int dim,
int dimworld >
519 inline const typename AlbertaGrid < dim, dimworld > :: Traits :: LevelIndexSet &
520 AlbertaGrid < dim, dimworld > :: levelIndexSet (
int level)
const
523 assert( (level >= 0) && (level < (
int)levelIndexVec_.size()) );
525 if( levelIndexVec_[ level ] == 0 )
528 levelIndexVec_[ level ]->update( lbegin< 0 >( level ), lend< 0 >( level ) );
530 return *(levelIndexVec_[ level ]);
533 template <
int dim,
int dimworld >
534 inline const typename AlbertaGrid < dim, dimworld > :: Traits :: LeafIndexSet &
535 AlbertaGrid < dim, dimworld > :: leafIndexSet ()
const
537 if( leafIndexSet_ == 0 )
540 leafIndexSet_->update( leafbegin< 0 >(), leafend< 0 >() );
542 return *leafIndexSet_;
546 template <
int dim,
int dimworld >
547 inline void AlbertaGrid < dim, dimworld >::calcExtras ()
550 maxlevel_ = levelProvider_.maxLevel();
551 assert( (maxlevel_ >= 0) && (maxlevel_ < MAXL) );
554 for(
int l = 0; l < MAXL; ++l )
555 levelMarkerVector_[ l ].clear();
558 leafMarkerVector_.clear();
563 if( leafIndexSet_ != 0 )
564 leafIndexSet_->update( leafbegin< 0 >(), leafend< 0 >() );
565 for(
unsigned int level = 0; level < levelIndexVec_.size(); ++level )
567 if( levelIndexVec_[ level ] )
568 levelIndexVec_[ level ]->update( lbegin< 0 >( level ), lend< 0 >( level ) );
573 template<
int dim,
int dimworld >
574 inline bool AlbertaGrid< dim, dimworld >
575 ::writeGrid (
const std::string &filename,
ctype time )
const
577 if( filename.size() <= 0 )
578 DUNE_THROW(
AlbertaIOError,
"No filename given to writeGridXdr." );
579 return (mesh_.write( filename, time ) && hIndexSet_.write( filename ));
583 template<
int dim,
int dimworld >
589 if( filename.size() <= 0 )
592 numBoundarySegments_ = mesh_.read( filename, time );
594 DUNE_THROW(
AlbertaIOError,
"Could not read grid file: " << filename <<
"." );
597 hIndexSet_.read( filename );
609 template<
int dim,
int dimworld >
610 template<
class DataHandler >
620 DataHandler *dataHandler;
621 if( DofVectorPointer::supportsAdaptationData )
625 assert( dataHandler != 0 );
632 DataHandler &dataHandler = getDataHandler( dofVector );
633 for(
int i = 0; i < patch.
count(); ++i )
634 dataHandler.prolongLocal( patch, i );
640 DataHandler &dataHandler = getDataHandler( dofVector );
641 for(
int i = 0; i < patch.
count(); ++i )
642 dataHandler.restrictLocal( patch, i );
Include standard header files.
Definition agrid.hh:60
static void checkAlbertaDimensions()
Definition albertagrid.cc:29
static const int dimWorld
Definition misc.hh:46
static void * adaptationDataHandler_
Definition albertagrid.cc:24
ALBERTA REAL_D GlobalVector
Definition misc.hh:50
[ provides Dune::Grid ]
Definition albertagrid/structuredgridfactory.hh:34
static std::string typeName()
Definition agrid.hh:410
static const int dimension
Definition agrid.hh:145
int maxLevel() const
Definition albertagrid.cc:483
Traits::template Codim< cd >::template Partition< pitype >::LevelIterator lbegin(int level) const
Iterator to first entity of given codim on level.
Definition albertagrid.cc:206
AlbertaGrid()
create an empty grid
Definition albertagrid.cc:42
Traits::template Codim< cd >::template Partition< pitype >::LevelIterator lend(int level) const
one past the end on this level
Definition albertagrid.cc:226
GridFamily::ctype ctype
Definition agrid.hh:143
bool adapt()
Refine all positive marked leaf entities, coarsen all negative marked entities if possible.
Definition albertagrid.cc:415
void postAdapt()
clean up some markers
Definition albertagrid.cc:356
Traits::template Codim< codim >::template Partition< pitype >::LeafIterator leafbegin() const
return LeafIterator which points to first leaf entity
Definition albertagrid.cc:259
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:490
Traits::template Codim< codim >::template Partition< pitype >::LeafIterator leafend() const
return LeafIterator which points behind last leaf entity
Definition albertagrid.cc:276
void globalRefine(int refCount)
uses the interface, mark on entity and refineLocal
Definition albertagrid.cc:304
~AlbertaGrid()
destructor
Definition albertagrid.cc:196
bool preAdapt()
returns true, if a least one element is marked for coarsening
Definition albertagrid.cc:348
bool mark(int refCount, const typename Traits::template Codim< 0 >::Entity &e)
Marks an entity to be refined/coarsened in a subsequent adapt.
Definition albertagrid.cc:385
Definition albertagrid.cc:612
Alberta::Patch< dimension > Patch
Definition albertagrid.cc:616
static void interpolateVector(const DofVectorPointer &dofVector, const Patch &patch)
Definition albertagrid.cc:629
static void restrictVector(const DofVectorPointer &dofVector, const Patch &patch)
Definition albertagrid.cc:637
Alberta::DofVectorPointer< Alberta::GlobalVector > DofVectorPointer
Definition albertagrid.cc:615
static DataHandler & getDataHandler(const DofVectorPointer &dofVector)
Definition albertagrid.cc:618
Definition albertagrid/datahandle.hh:27
unsigned int create(const MacroData< dim > ¯oData)
Definition meshpointer.hh:299
Definition dofvector.hh:179
AdaptationData * getAdaptationData() const
Definition dofvector.hh:277
const GlobalVector & coordinate(int vertex) const
Definition elementinfo.hh:685
void create()
Definition indexsets.cc:133
Definition albertagrid/indexsets.hh:329
Definition leafiterator.hh:23
Definition leveliterator.hh:23
Definition albertagrid/gridfamily.hh:98
Definition macrodata.hh:30
Definition albertagrid/projection.hh:80
Definition albertagrid/projection.hh:163
Definition refinement.hh:40
int count() const
Definition refinement.hh:67
marker assigning subentities to one element containing them
Definition treeiterator.hh:35
bool up2Date() const
return true if marking is up to date
Definition treeiterator.hh:95
Interface class for the Grid's adapt method where the parameter is a AdaptDataHandleInterface.
Definition adaptcallback.hh:33
Interface class for vertex projection at the boundary.
Definition boundaryprojection.hh:33
A Traits struct that collects all associated types of one implementation.
Definition common/grid.hh:411