diff --git a/src/amdis/ProblemInstatBase.hpp b/src/amdis/ProblemInstatBase.hpp index 84b644e82e257a6fc57b17b3a6f9a150148ba589..37aa8cb9081254af702fc115c614e05e77deef1c 100644 --- a/src/amdis/ProblemInstatBase.hpp +++ b/src/amdis/ProblemInstatBase.hpp @@ -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 */ } diff --git a/src/amdis/ProblemStat.hpp b/src/amdis/ProblemStat.hpp index 7d028f8256e8c6ca1b20c7029b86fd9421e31bd9..b1fa1d754f0954ef125b53aaf62ec84afa422219 100644 --- a/src/amdis/ProblemStat.hpp +++ b/src/amdis/ProblemStat.hpp @@ -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. diff --git a/src/amdis/ProblemStat.inc.hpp b/src/amdis/ProblemStat.inc.hpp index f1ff89b05ec1e286bf1b8e07ecdc36af386c3547..b53c41027721628c81c9c3125beccdf472be69ff 100644 --- a/src/amdis/ProblemStat.inc.hpp +++ b/src/amdis/ProblemStat.inc.hpp @@ -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) diff --git a/src/amdis/ProblemStatBase.hpp b/src/amdis/ProblemStatBase.hpp index 7c44f1bf7b0b8627f9af91d15af780a5b2bcf70b..81f4a7cf827aefb800396906e0c1ec161321d39f 100644 --- a/src/amdis/ProblemStatBase.hpp +++ b/src/amdis/ProblemStatBase.hpp @@ -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