1 #ifndef DUNE_FEM_ADAPTMANAGER_HH 2 #define DUNE_FEM_ADAPTMANAGER_HH 8 #include <dune/common/timer.hh> 76 std::cerr <<
"WARNING: AdaptationManagerInterface::adapt: no adaptation manager assigned! \n";
85 return (am_) ? (am_->
adaptive()) :
false;
93 return (am_) ? (am_->
methodName()) :
"unknown method";
130 template <
class Gr
idType>
149 : adaptationMethod_(generic)
153 const std::string methodNames [] = {
"none",
"generic",
"callback" };
154 am = parameter.getEnum(
"fem.adaptation.method", methodNames, am);
158 void init(
int am,
const bool output)
162 if(am == 2) adaptationMethod_ = callback;
163 else if(am == 1) adaptationMethod_ =
generic;
164 else adaptationMethod_ = none;
169 adaptationMethod_ = none;
172 std::cerr <<
"WARNING: AdaptationMethod: adaptation disabled for structured grid! \n";
178 std::cout <<
"Created AdaptationMethod: adaptation method = " <<
methodName() << std::endl;
188 switch (adaptationMethod_) {
189 case generic:
return "generic";
190 case callback:
return "callback";
191 case none:
return "no adaptation";
192 default:
return "unknown method";
197 virtual bool adaptive ()
const {
return adaptationMethod_ != none; }
209 template <
class Gr
idType,
class RestProlOperatorImp >
217 template <
class AdaptManager,
class Gr
idImp,
bool isGoodGr
id>
218 struct CallAdaptationMethod
220 template <
class DofManagerImp,
class RPOpImp>
221 static void adapt(
const AdaptManager& am, GridImp & grid,
222 DofManagerImp& dm , RPOpImp& rpop,
223 AdaptationMethodType adaptMethod)
226 if( adaptMethod == BaseType :: generic )
228 am.template genericAdapt<All_Partition> ();
233 if( adaptMethod == BaseType :: callback )
239 RPType restrictProlongHandle ( dm , rpop );
242 restrictProlongHandle.initialize();
245 grid.adapt( restrictProlongHandle );
248 restrictProlongHandle.finalize();
254 template <
class AdaptManager,
class Gr
idImp>
255 struct CallAdaptationMethod<AdaptManager,GridImp,false>
257 template <
class DofManagerImp,
class RPOpImp>
258 static void adapt(
const AdaptManager& am, GridImp & grid,
259 DofManagerImp& dm , RPOpImp& rpop,
260 AdaptationMethodType adaptMethod)
263 if(adaptMethod != BaseType :: none )
268 am.template genericAdapt<All_Partition> ();
281 typedef typename GridType :: Traits :: LocalIdSet
LocalIdSet;
293 : BaseType( grid, parameter ),
295 dm_( DofManagerType::instance( grid_ ) ),
328 CallAdaptationMethod< ThisType, GridType, supportsCallback >
329 :: adapt(*
this,grid_,dm_,rpOp_,this->adaptationMethod_);
332 adaptTime_ = timer.elapsed();
356 return DofManagerType :: instance( grid );
365 template <PartitionIteratorType pitype>
366 void genericAdapt ()
const 370 bool restr = grid_.preAdapt();
373 typedef typename GridType::template Partition< All_Partition > :: LevelGridView MacroGridView ;
374 typedef typename MacroGridView :: template Codim<0>::
375 template Partition<pitype> :: Iterator MacroIterator;
378 wasChanged_ = false ;
383 MacroGridView macroView = grid_.levelGridView( 0 );
390 MacroIterator endit = macroView.template end<0,pitype> ();
391 for(MacroIterator it = macroView.template begin<0,pitype>();
394 hierarchicRestrict( *it , dm_.indexSetRestrictProlongNoResize() );
402 dm_.resizeForRestrict();
407 MacroIterator endit = macroView.template end<0,pitype> ();
408 for(MacroIterator it = macroView.template begin<0,pitype>();
411 hierarchicRestrict( *it , rpOp_ );
419 const bool refined = grid_.adapt();
423 if( refined || restr )
434 MacroGridView macroView = grid_.levelGridView( 0 );
437 MacroIterator endit = macroView.template end<0,pitype> ();
438 for(MacroIterator it = macroView.template begin<0,pitype>();
441 hierarchicProlong( *it , rpOp_ );
446 if( dm_.notifyGlobalChange( wasChanged_ ) )
459 template <
class EntityType,
class RestrictOperatorType >
460 bool hierarchicRestrict (
const EntityType& entity, RestrictOperatorType & restop )
const 462 if( ! entity.isLeaf() )
465 bool doRestrict =
true;
468 const bool isGhost = entity.partitionType() == GhostEntity ;
471 const int childLevel = entity.level() + 1;
472 typedef typename EntityType::HierarchicIterator HierarchicIterator;
476 const HierarchicIterator endit = entity.hend( childLevel );
477 for(HierarchicIterator it = entity.hbegin( childLevel ); it != endit; ++it)
479 doRestrict &= hierarchicRestrict( *it , restop );
495 bool initialize =
true;
496 const HierarchicIterator endit = entity.hend( childLevel );
497 for(HierarchicIterator it = entity.hbegin( childLevel ); it != endit; ++it)
500 restop.restrictLocal( entity, *it , initialize);
510 return entity.mightVanish();
513 template <
class EntityType,
class Pro
longOperatorType >
514 void hierarchicProlong (
const EntityType &entity, ProlongOperatorType & prolop )
const 516 typedef typename EntityType::HierarchicIterator HierarchicIterator;
522 bool initialize =
true;
525 const bool isGhost = entity.partitionType() == GhostEntity ;
527 const int maxLevel = grid_.maxLevel();
528 const HierarchicIterator endit = entity.hend( maxLevel );
529 for( HierarchicIterator it = entity.hbegin( maxLevel ); it != endit; ++it )
532 assert( !entity.isLeaf() );
534 const EntityType & son = *it;
546 prolop.prolongLocal( vati , son , initialize );
571 template <
class KeyType,
class ObjectType>
576 return new ObjectType(0);
589 template <
class Gr
idType,
class RestProlOperatorImp>
595 typedef const GridType* KeyType;
597 typedef size_t ObjectType;
608 double balanceTime_ ;
611 ObjectType& referenceCounter_;
627 : BaseType(grid,rpOp, parameter)
628 , Base2Type( grid, rpOp, balanceCounter, parameter )
630 , balanceTime_( 0.0 )
631 , referenceCounter_( ProviderType :: getObject( &grid ) )
633 if( ++referenceCounter_ > 1 )
634 DUNE_THROW(InvalidStateException,
"Only one instance of AdaptationManager allowed per grid instance");
638 : BaseType(grid,rpOp, parameter)
639 , Base2Type( grid, rpOp, parameter )
641 , balanceTime_( 0.0 )
642 , referenceCounter_( ProviderType :: getObject( &grid ) )
644 if( ++referenceCounter_ > 1 )
645 DUNE_THROW(InvalidStateException,
"Only one instance of AdaptationManager allowed per grid instance");
651 -- referenceCounter_;
652 ProviderType :: removeObject( referenceCounter_ );
659 return Base2Type :: loadBalance();
665 return Base2Type :: balanceCounter ();
678 BaseType :: adapt ();
695 this->balanceTime_ = timer.elapsed();
712 template <
class Gr
idType>
713 static void apply(GridType& grid,
const int step)
716 DofManagerType& dm = DofManagerType :: instance(grid);
717 grid.globalRefine(step);
735 template <
class Gr
idType>
739 DofManagerType& dm = DofManagerType :: instance(grid);
755 #endif // #ifndef DUNE_FEM_ADAPTMANAGER_HH void exchange() const
Definition: communicationmanager.hh:382
virtual int balanceCounter() const
return number of cycles since last application of load balance
Definition: common/adaptmanager.hh:113
AdaptationManagerInterface & operator=(const AdaptationManagerInterface &am)
Assignment operator, pointer to adaptation manager is stored.
Definition: common/adaptmanager.hh:99
GridType & grid_
corresponding grid
Definition: common/adaptmanager.hh:555
double adaptTime_
time that adaptation took
Definition: common/adaptmanager.hh:564
virtual double loadBalanceTime() const
time that last load balance cycle took
Definition: common/adaptmanager.hh:669
virtual void adapt()
on call of this method the internal adaptation operator is called.
Definition: common/adaptmanager.hh:70
AdaptationMethodType
type of adaptation method
Definition: common/adaptmanager.hh:135
Definition: misc/capabilities.hh:152
Proxy class to DependencyCache which is singleton per space.
Definition: communicationmanager.hh:294
virtual const char * methodName() const
returns name of adaptation method
Definition: common/adaptmanager.hh:91
Definition: misc/capabilities.hh:109
virtual double adaptationTime() const
time that last adaptation cycle took
Definition: common/adaptmanager.hh:348
A class with one static method apply to globally refine a grid. All index sets are adapted to the new...
Definition: common/adaptmanager.hh:705
virtual void adapt()
according to adaption method parameter the adaption procedure is done, 0 == no adaptation 1 == generi...
Definition: common/adaptmanager.hh:319
virtual bool loadBalance()
call load balance, returns true if grid was changed
Definition: common/adaptmanager.hh:107
DofManagerType & dm_
DofManager corresponding to grid.
Definition: common/adaptmanager.hh:558
Singleton list for key/object pairs.
Definition: singletonlist.hh:49
AdaptationManagerBase(GridType &grid, RestProlOperatorImp &rpOp, const ParameterReader ¶meter=Parameter::container())
constructor of AdaptationManagerBase The following optional parameter can be used 0 == none...
Definition: common/adaptmanager.hh:292
virtual ~AdaptationManagerInterface()
destructor
Definition: common/adaptmanager.hh:65
Definition: datacollector.hh:45
AdaptationManagerInterface class.
Definition: common/adaptmanager.hh:58
virtual const char * methodName() const
returns name of adaptation method
Definition: common/adaptmanager.hh:186
AdaptationManagerInterface()
default constructor
Definition: common/adaptmanager.hh:62
Dune::EntityPointer< Grid, Implementation >::Entity make_entity(const Dune::EntityPointer< Grid, Implementation > &entityPointer)
Definition: compatibility.hh:23
virtual ~AdaptationManagerBase()
destructor
Definition: common/adaptmanager.hh:302
Definition: objpointer.hh:37
virtual double adaptationTime() const
time that last adaptation cycle took
Definition: common/adaptmanager.hh:119
AdaptationManager(GridType &grid, RestProlOperatorImp &rpOp, const ParameterReader ¶meter=Parameter::container())
Definition: common/adaptmanager.hh:637
virtual bool loadBalance()
call load balance, returns true if grid was changed
Definition: common/adaptmanager.hh:656
virtual bool loadBalance()
default load balancing method which does nothing
Definition: common/adaptmanager.hh:336
RestProlOperatorImp & getRestProlOp()
Definition: common/adaptmanager.hh:307
static void apply(GridType &grid, const int step)
apply global refinement and also adjust index sets and managed dof storage. However, user data stored before is lost.
Definition: common/adaptmanager.hh:713
Definition: coordinate.hh:4
This class manages the adaptation process. If the method adapt is called, then the grid is adapted an...
Definition: common/adaptmanager.hh:210
AdaptationManager(GridType &grid, RestProlOperatorImp &rpOp, int balanceCounter, const ParameterReader ¶meter=Parameter::container())
constructor of AdaptationManager The following optional parameters from the Dune::Parameter class are...
Definition: common/adaptmanager.hh:626
AdaptationMethod is a simple adaptation method reader class.
Definition: common/adaptmanager.hh:131
Interface class for load balancing.
Definition: loadbalancer.hh:36
static ParameterContainer & container()
Definition: io/parameter.hh:190
virtual bool adaptive() const
returns true if adaptation manager as adaptation method different to NONE
Definition: common/adaptmanager.hh:83
GridType::Traits::LocalIdSet LocalIdSet
Definition: common/adaptmanager.hh:281
static void apply(GridType &grid)
apply local refinement and also adjust index sets and managed dof storage. However, user data stored before is lost.
Definition: common/adaptmanager.hh:736
virtual int balanceCounter() const
default load balancing counter is zero
Definition: common/adaptmanager.hh:342
interfaces and wrappers needed for the callback adaptation provided by AlbertaGrid and ALUGrid ...
A class with one static method apply for invoking the local adaptation procedure on a given grid inst...
Definition: common/adaptmanager.hh:729
RestProlOperatorImp & rpOp_
Restriction and Prolongation Operator.
Definition: common/adaptmanager.hh:561
static bool verbose()
obtain the cached value for fem.verbose
Definition: io/parameter.hh:444
static DofManagerType & getDofManager(const GridType &grid)
Definition: common/adaptmanager.hh:354
AdaptationMethod(const GridType &grid, const ParameterReader ¶meter=Parameter::container())
constructor of AdaptationMethod The following optional parameters are used 0 == none, 1 == generic, 2 == call back (only AlbertaGrid and ALUGrid)AdaptationMethod: 1 # default value
Definition: common/adaptmanager.hh:148
This class manages the adaptation process. If the method adapt is called, then the grid is adapted an...
Definition: loadbalancer.hh:69
bool wasChanged_
flag for restriction
Definition: common/adaptmanager.hh:567
AdaptationMethodType adaptationMethod_
method identifier
Definition: common/adaptmanager.hh:201
Definition: adaptcallbackhandle.hh:23
static ObjectType * createObject(const KeyType &key)
Definition: common/adaptmanager.hh:574
This class manages the adaptation process including a load balancing after the adaptation step...
Definition: common/adaptmanager.hh:590
static bool singleThreadMode()
returns true if program is operating on one thread currently
Definition: threadmanager.hh:217
virtual ~AdaptationMethod()
virtual destructor
Definition: common/adaptmanager.hh:183
virtual bool adaptive() const
returns true if adaptation manager as adaptation method different to NONE
Definition: common/adaptmanager.hh:197
virtual int balanceCounter() const
return number of cycles since last application of load balance
Definition: common/adaptmanager.hh:663
virtual void adapt()
on call of this method the internal adaptation operator is called.
Definition: common/adaptmanager.hh:675
~AdaptationManager()
destructor decreasing reference counter
Definition: common/adaptmanager.hh:649
factory class to create adaptation manager reference counter
Definition: common/adaptmanager.hh:572
static void deleteObject(ObjectType *obj)
Definition: common/adaptmanager.hh:578