diff --git a/src/amdis/GridTransferManager.hpp b/src/amdis/GridTransferManager.hpp index 55c95550a92f282866dbcaee4c6050fda1277ff3..554d9e778f18dddbf4dc56ab25a99e1d9011a5a6 100644 --- a/src/amdis/GridTransferManager.hpp +++ b/src/amdis/GridTransferManager.hpp @@ -36,12 +36,14 @@ namespace AMDiS * Takes a grid as argument. Marking of the grid needs to be performed prior to calling this. * Returns true if the grid changed during adaptation. **/ - template <class Grid> - static bool adapt(Grid& grid) + template <class Grid, class ...Bases> + static bool adapt(Grid& grid, Bases&... bases) { auto gridTransfer = GridTransferManager::gridTransfer(grid); bool adapted = gridTransfer.preAdapt(); adapted |= gridTransfer.adapt(); + // call basis.update(basis.gridView()) on all bases + (void)std::initializer_list<int>({0, (bases.update(bases.gridView()),0)...}); gridTransfer.postAdapt(); return adapted; } diff --git a/src/amdis/ProblemStat.inc.hpp b/src/amdis/ProblemStat.inc.hpp index b53c41027721628c81c9c3125beccdf472be69ff..50058ccfaf357d662aee26391e6c204ee6643809 100644 --- a/src/amdis/ProblemStat.inc.hpp +++ b/src/amdis/ProblemStat.inc.hpp @@ -365,8 +365,7 @@ globalCoarsen(int n) for (const auto& element : elements(grid_->leafGridView())) grid_->mark(-1, element); - adapted |= GridTransferManager::adapt(*grid_); - globalBasis_->update(gridView()); + adapted |= GridTransferManager::adapt(*grid_, *globalBasis_); } msg("globalCoarsen needed {} seconds", t.elapsed()); @@ -386,6 +385,7 @@ globalRefine(int refCount) bool adapted = false; Dune::Hybrid::ifElse(Dune::Std::is_detected<HasGlobalRefineADHI, Grid>{}, /*then*/ [&](auto id) { + // TODO(FM): Add a way to pass a GridTransfer as ADH with *globalBasis_ argument id(grid_)->globalRefine(refCount, GridTransferManager::gridTransfer(*grid_)); globalBasis_->update(this->gridView()); }, @@ -395,8 +395,7 @@ globalRefine(int refCount) for (const auto& element : elements(grid_->leafGridView())) grid_->mark(1, element); - adapted |= GridTransferManager::adapt(*id(grid_)); - globalBasis_->update(this->gridView()); + adapted |= GridTransferManager::adapt(*id(grid_), *id(globalBasis_)); } }); @@ -411,8 +410,7 @@ adaptGrid(AdaptInfo& adaptInfo) { Dune::Timer t; - bool adapted = GridTransferManager::adapt(*grid_); - globalBasis_->update(gridView()); + bool adapted = GridTransferManager::adapt(*grid_, *globalBasis_); msg("adaptGrid needed {} seconds", t.elapsed()); return adapted ? MESH_ADAPTED : Flag(0); diff --git a/test/DOFVectorTest.cpp b/test/DOFVectorTest.cpp index 288981fcb3b66658c686a8893bd532e8710b4050..2f883436d854db6ecce3ba64af3706064542b831 100644 --- a/test/DOFVectorTest.cpp +++ b/test/DOFVectorTest.cpp @@ -74,7 +74,7 @@ int main(int argc, char** argv) test_dofvector(basis, vec1); for (auto const& e : elements(gridView)) grid.mark(1, e); - GridTransferManager::adapt(grid); + GridTransferManager::adapt(grid, basis); AMDIS_TEST_EQ(vec1.size(), basis.dimension()); }