Skip to content
Snippets Groups Projects
Commit 65eb4061 authored by Praetorius, Simon's avatar Praetorius, Simon
Browse files

Merge branch 'feature/global_refine' into 'develop'

add function globalRefine and globalCoarsen to ProblemStat

See merge request spraetor/dune-amdis!77
parents 32e77c49 b661c013
No related branches found
No related tags found
No related merge requests found
......@@ -58,6 +58,18 @@ namespace AMDiS
return 0;
}
/// Implementation of \ref ProblemStatBase::globalCoarsen().
virtual Flag globalCoarsen(int n) override
{
return 0;
}
/// Implementation of \ref ProblemStatBase::globalRefine().
virtual Flag globalRefine(int n) override
{
return 0;
}
/// Implementation of \ref ProblemTimeInterface::closeTimestep().
virtual void closeTimestep(AdaptInfo&) override { /* do nothing */ }
......
......@@ -429,6 +429,11 @@ namespace AMDiS
/// Implementation of \ref ProblemStatBase::markElements.
virtual Flag markElements(AdaptInfo& adaptInfo) override;
/// Uniform global grid coarsening by up to n level
virtual Flag globalCoarsen(int n) override;
/// Uniform global refinement by n level
virtual Flag globalRefine(int n) override;
private:
/// Name of this problem.
......
......@@ -354,6 +354,57 @@ markElements(AdaptInfo& adaptInfo)
}
template <class Traits>
Flag ProblemStat<Traits>::
globalCoarsen(int n)
{
Dune::Timer t;
bool adapted = false;
for (int i = 0; i < n; ++i) {
// mark all entities for grid refinement
for (const auto& element : elements(grid_->leafGridView()))
grid_->mark(-1, element);
adapted |= GridTransferManager::adapt(*grid_);
globalBasis_->update(gridView());
}
msg("globalCoarsen needed {} seconds", t.elapsed());
return adapted ? MESH_ADAPTED : Flag(0);
}
// grid has globalRefine(int, AdaptDataHandleInterface&)
template <class G>
using HasGlobalRefineADHI = decltype(std::declval<G>().globalRefine(1,std::declval<GridTransfer<G>&>()));
template <class Traits>
Flag ProblemStat<Traits>::
globalRefine(int refCount)
{
Dune::Timer t;
bool adapted = false;
Dune::Hybrid::ifElse(Dune::Std::is_detected<HasGlobalRefineADHI, Grid>{},
/*then*/ [&](auto id) {
id(grid_)->globalRefine(refCount, GridTransferManager::gridTransfer(*grid_));
globalBasis_->update(this->gridView());
},
/*else*/ [&](auto id) {
for (int i = 0; i < refCount; ++i) {
// mark all entities for grid refinement
for (const auto& element : elements(grid_->leafGridView()))
grid_->mark(1, element);
adapted |= GridTransferManager::adapt(*id(grid_));
globalBasis_->update(this->gridView());
}
});
msg("globalRefine needed {} seconds", t.elapsed());
return adapted ? MESH_ADAPTED : Flag(0);
}
template <class Traits>
Flag ProblemStat<Traits>::
adaptGrid(AdaptInfo& adaptInfo)
......
......@@ -74,6 +74,14 @@ namespace AMDiS
/// Refinement/coarsening of the grid.
virtual Flag adaptGrid(AdaptInfo& adaptInfo) = 0;
/// Uniform global grid coarsening by up to n level.
/// Returns MESH_ADAPTED if grid was changed
virtual Flag globalCoarsen(int n) = 0;
/// Uniform global refinement by n level
/// Returns MESH_ADAPTED if grid was changed
virtual Flag globalRefine(int n) = 0;
/** \brief
* Solves the assembled system. The result is an approximative solution.
* The last two boolean arguments can be used to controll successive
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment