From 003477c765bb12e2c79c550d3d129b184ec6b02d Mon Sep 17 00:00:00 2001 From: Simon Praetorius Date: Tue, 26 Mar 2019 16:05:56 +0100 Subject: [PATCH 1/6] initial commit of rewritten adaption interface to allow to attach bases to the grid-transfer --- src/amdis/AdaptionInterface.hpp | 65 +++++++++++++++++++++ src/amdis/CMakeLists.txt | 1 + src/amdis/GridTransfer.hpp | 94 ++++++++++++++++++------------- src/amdis/GridTransferManager.hpp | 69 +++++++++++++++-------- src/amdis/ProblemStat.hpp | 4 +- src/amdis/ProblemStat.inc.hpp | 12 ++-- src/amdis/common/ConceptsBase.hpp | 4 +- test/DOFVectorTest.cpp | 3 +- test/DataTransferTest.hpp | 2 +- 9 files changed, 179 insertions(+), 75 deletions(-) create mode 100644 src/amdis/AdaptionInterface.hpp diff --git a/src/amdis/AdaptionInterface.hpp b/src/amdis/AdaptionInterface.hpp new file mode 100644 index 00000000..d5bf819d --- /dev/null +++ b/src/amdis/AdaptionInterface.hpp @@ -0,0 +1,65 @@ +#pragma once + +#include + +#include +#include + +namespace AMDiS +{ + /** + * \addtogroup Adaption + * @{ + **/ + + namespace Concepts + { + namespace Definition + { + struct InterpolateData + { + template + auto requires_(Data const& data) -> decltype( + const_cast(data).preAdapt(true), + const_cast(data).postAdapt(true) + ); + }; + + struct UpdateData + { + template + auto requires_(Basis const& basis) -> decltype( + const_cast(basis).update(basis.gridView()) + ); + }; + + } // end namespace Definition + + template + constexpr bool InterpolateData = models; + + template + constexpr bool UpdateData = models; + + } // end namespace Concepts + + + /// \brief Interface for transfer between grid changes to be registered in a \ref GridTransferManager + class AdaptionInterface + { + public: + virtual ~AdaptionInterface() = default; + + /// Prepare the grid and the data for the adaption + virtual bool preAdapt() = 0; + + /// Do the grid adaption + virtual bool adapt() = 0; + + // Perform data adaption to the new grid + virtual void postAdapt() = 0; + }; + + /// @} + +} // end namespace AMDiS diff --git a/src/amdis/CMakeLists.txt b/src/amdis/CMakeLists.txt index d13f7292..dbbade5d 100644 --- a/src/amdis/CMakeLists.txt +++ b/src/amdis/CMakeLists.txt @@ -17,6 +17,7 @@ install(FILES AdaptBase.hpp AdaptInfo.hpp AdaptInstationary.hpp + AdaptionInterface.hpp AdaptStationary.hpp AMDiS.hpp Assembler.hpp diff --git a/src/amdis/GridTransfer.hpp b/src/amdis/GridTransfer.hpp index c9166572..77bdb2ad 100644 --- a/src/amdis/GridTransfer.hpp +++ b/src/amdis/GridTransfer.hpp @@ -2,6 +2,7 @@ #include +#include #include #include @@ -12,35 +13,24 @@ namespace AMDiS * @{ **/ - /// \brief Interface for transfer between grid changes to be registered in a \ref GridTransferManager - class GridTransferInterface - { - public: - virtual ~GridTransferInterface() = default; - - /// Attach a data container to the grid transfer, that gets interpolated during grid change - virtual void attach(DOFVectorInterface*) = 0; - - /// Remove a data constainer from the grid transfer. Throws a warning if container not found. - virtual void detach(DOFVectorInterface*) = 0; - - /// Prepare the grid and the data for the adaption - virtual bool preAdapt() = 0; - - /// Do the grid adaption - virtual bool adapt() = 0; - - // Perform data adaption to the new grid - virtual void postAdapt() = 0; - }; - - - /// \brief Implementation of \ref GridTransferInterface for concrete Grid type. + /// \brief Implementation of \ref AdaptionInterface for concrete Grid type. template class GridTransfer - : public GridTransferInterface + : public AdaptionInterface { using Self = GridTransfer; + using Key = std::uintptr_t; + + struct InterpolateCallback + { + std::function preAdapt; + std::function postAdapt; + }; + + struct UpdateCallback + { + std::function update; + }; public: /// Bind a (mutable) grid to this GridTransfer. Must be called before any xxxAdapt() method. @@ -63,20 +53,37 @@ namespace AMDiS return grid_ != nullptr; } - /// Implements \ref GridTransferInterface::attach - void attach(DOFVectorInterface* vec) override + template )> + void attach(Data& data) + { + interpolateCallbacks_.emplace(Key(&data), InterpolateCallback{ + [&data](bool mightCoarsen) -> void { data.preAdapt(mightCoarsen); }, + [&data](bool refined) -> void { data.postAdapt(refined); }}); + } + + template )> + void attach(Data& data) { - data_.push_back(vec); + updateCallbacks_.emplace(Key(&data), UpdateCallback{ + [&data]() -> void { data.update(data.gridView()); }}); } - /// Implements \ref GridTransferInterface::detach - void detach(DOFVectorInterface* vec) override + template )> + void detach(Data& data) { - auto it = std::find(data_.begin(), data_.end(), vec); - if (it != data_.end()) - data_.erase(it); - else - warning("DOFVector to detach not found"); + if (interpolateCallbacks_.erase(Key(&data)) == 0) + warning("Data to detach not found"); + } + + template )> + void detach(Data& data) + { + if (updateCallbacks_.erase(Key(&data)) == 0) + warning("Data to detach not found"); } /// Implements \ref GridTransferInterface::preAdapt @@ -85,8 +92,9 @@ namespace AMDiS { assert(bound()); mightCoarsen_ = grid_->preAdapt(); - for (auto* vec : this->data_) - vec->preAdapt(mightCoarsen_); + msg("interpolateCallbacks.size = {}", interpolateCallbacks_.size()); + for (auto&& data : interpolateCallbacks_) + data.second.preAdapt(mightCoarsen_); return mightCoarsen_; } @@ -105,10 +113,15 @@ namespace AMDiS { assert(bound()); if (mightCoarsen_ || refined_) { - for (auto* vec : this->data_) - vec->postAdapt(refined_); + for (auto&& data : interpolateCallbacks_) + data.second.postAdapt(refined_); } grid_->postAdapt(); + + msg("updateCallbacks.size = {}", updateCallbacks_.size()); + for (auto&& data : updateCallbacks_) + data.second.update(); + changeIndex_++; } @@ -123,7 +136,8 @@ namespace AMDiS Grid* grid_ = nullptr; /// A list of data containers handled during grid adaption - std::list data_; + std::map interpolateCallbacks_; + std::map updateCallbacks_; /// Flag set during \ref preAdapt(), indicating whether any element might be coarsened in \ref adapt() bool mightCoarsen_ = false; diff --git a/src/amdis/GridTransferManager.hpp b/src/amdis/GridTransferManager.hpp index 5721bf3b..5c95796e 100644 --- a/src/amdis/GridTransferManager.hpp +++ b/src/amdis/GridTransferManager.hpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -17,12 +18,9 @@ namespace AMDiS /// Static administration class for automatic handling of DOFVectors during grid adaption class GridTransferManager { - template - friend class DOFVectorBase; - using Self = GridTransferManager; using Key = std::uintptr_t; - using Data = std::unique_ptr; + using Data = std::unique_ptr; private: // Constructors. Since this is a static class you cannot call any constructor. @@ -41,15 +39,13 @@ 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 - static bool adapt(Grid& grid, Bases&... bases) + template + static bool adapt(Grid& grid) { - auto gridTransfer = GridTransferManager::gridTransfer(grid); - bool adapted = gridTransfer.preAdapt(); - adapted |= gridTransfer.adapt(); - // call basis.update(basis.gridView()) on all bases - (void)std::initializer_list({0, (bases.update(bases.gridView()),0)...}); - gridTransfer.postAdapt(); + auto& transfer = gridTransfer(grid); + bool adapted = transfer.preAdapt(); + adapted |= transfer.adapt(); + transfer.postAdapt(); return adapted; } @@ -57,32 +53,59 @@ namespace AMDiS template static GridTransfer& gridTransfer(Grid& grid) { - GridTransfer* gridTransfer - = dynamic_cast*>(Self::gridTransferInterface(grid)); - gridTransfer->bind(grid); - return *gridTransfer; + auto& transfer = get(grid); + transfer.bind(grid); + return transfer; } - private: - // DOFVector registration methods. They are called automaticly by the DOFVectors. - template + public: + template )> static void attach(Vec& vec) { auto const& grid = vec.basis().gridView().grid(); - Self::gridTransferInterface(grid)->attach(&vec); + get(grid).attach(vec); + } + + template )> + static void attach(GlobalBasis& basis) + { + auto const& grid = basis.gridView().grid(); + get(grid).attach(basis); } - template + + template )> static void detach(Vec& vec) { auto const& grid = vec.basis().gridView().grid(); - Self::gridTransferInterface(grid)->detach(&vec); + get(grid).detach(vec); + } + + template )> + static void detach(GlobalBasis& basis) + { + auto const& grid = basis.gridView().grid(); + get(grid).detach(basis); + } + + private: + + template + static GridTransfer& get(Grid const& grid) + { + GridTransfer* gridTransfer + = dynamic_cast*>(Self::gridTransferInterface(grid)); + return *gridTransfer; } // Returns the GridTransferInterface class, // used for attaching and detaching DOFVectors to a GridTransfer template - static GridTransferInterface* gridTransferInterface(Grid const &grid) + static AdaptionInterface* gridTransferInterface(Grid const &grid) { Key key = Key(&grid); GridTransferCache cache; diff --git a/src/amdis/ProblemStat.hpp b/src/amdis/ProblemStat.hpp index b4578993..97046397 100644 --- a/src/amdis/ProblemStat.hpp +++ b/src/amdis/ProblemStat.hpp @@ -387,7 +387,7 @@ namespace AMDiS void adoptGlobalBasis(std::shared_ptr const& globalBasis) { globalBasis_ = globalBasis; - initGlobalBasis(*globalBasis_); + initGlobalBasis(); } void adoptGrid(std::shared_ptr const& grid) @@ -408,7 +408,7 @@ namespace AMDiS void createGlobalBasisImpl(std::true_type); void createGlobalBasisImpl(std::false_type); - void initGlobalBasis(GlobalBasis const& globalBasis); + void initGlobalBasis(); public: // implementation of iteration interface methods diff --git a/src/amdis/ProblemStat.inc.hpp b/src/amdis/ProblemStat.inc.hpp index 26f18a5a..7c24c4c7 100644 --- a/src/amdis/ProblemStat.inc.hpp +++ b/src/amdis/ProblemStat.inc.hpp @@ -143,7 +143,7 @@ template void ProblemStat::createGlobalBasis() { createGlobalBasisImpl(Dune::Std::is_detected{}); - initGlobalBasis(*globalBasis_); + initGlobalBasis(); } @@ -164,10 +164,11 @@ void ProblemStat::createGlobalBasisImpl(std::false_type) template -void ProblemStat::initGlobalBasis(GlobalBasis const& globalBasis) +void ProblemStat::initGlobalBasis() { dirichletBCs_.init(*globalBasis_, *globalBasis_); periodicBCs_.init(*globalBasis_, *globalBasis_); + GridTransferManager::attach(*globalBasis_); } @@ -367,7 +368,7 @@ globalCoarsen(int n) for (const auto& element : elements(grid_->leafGridView())) grid_->mark(-1, element); - adapted |= GridTransferManager::adapt(*grid_, *globalBasis_); + adapted |= GridTransferManager::adapt(*grid_); } msg("globalCoarsen needed {} seconds", t.elapsed()); @@ -389,7 +390,6 @@ globalRefine(int refCount) /*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()); }, /*else*/ [&](auto id) { for (int i = 0; i < refCount; ++i) { @@ -397,7 +397,7 @@ globalRefine(int refCount) for (const auto& element : elements(grid_->leafGridView())) grid_->mark(1, element); - adapted |= GridTransferManager::adapt(*id(grid_), *id(globalBasis_)); + adapted |= GridTransferManager::adapt(*id(grid_)); } }); @@ -412,7 +412,7 @@ adaptGrid(AdaptInfo& adaptInfo) { Dune::Timer t; - bool adapted = GridTransferManager::adapt(*grid_, *globalBasis_); + bool adapted = GridTransferManager::adapt(*grid_); msg("adaptGrid needed {} seconds", t.elapsed()); return adapted ? MESH_ADAPTED : Flag(0); diff --git a/src/amdis/common/ConceptsBase.hpp b/src/amdis/common/ConceptsBase.hpp index 86a2befd..aa861501 100644 --- a/src/amdis/common/ConceptsBase.hpp +++ b/src/amdis/common/ConceptsBase.hpp @@ -8,8 +8,8 @@ #define REQUIRES_(...) #define CONCEPT constexpr #else - #define REQUIRES(...) std::enable_if_t<__VA_ARGS__ , int>* = nullptr - #define REQUIRES_(...) std::enable_if_t<__VA_ARGS__ , int>* + #define REQUIRES(...) std::enable_if_t<__VA_ARGS__ , int> = 0 + #define REQUIRES_(...) std::enable_if_t<__VA_ARGS__ , int> #define CONCEPT constexpr #endif diff --git a/test/DOFVectorTest.cpp b/test/DOFVectorTest.cpp index 61721ef0..424b9cf6 100644 --- a/test/DOFVectorTest.cpp +++ b/test/DOFVectorTest.cpp @@ -48,6 +48,7 @@ int main(int argc, char** argv) auto basis = makeBasis(gridView, composite(power<2>(lagrange<2>(), flatInterleaved()), lagrange<1>(), flatLexicographic())); using Basis = decltype(basis); + GridTransferManager::attach(basis); { DOFVector vec1(basis); @@ -74,7 +75,7 @@ int main(int argc, char** argv) test_dofvector(basis, vec1); for (auto const& e : elements(gridView)) grid.mark(1, e); - GridTransferManager::adapt(grid, basis); + GridTransferManager::adapt(grid); AMDIS_TEST_EQ(vec1.size(), basis.dimension()); } diff --git a/test/DataTransferTest.hpp b/test/DataTransferTest.hpp index 11f0e301..7c238bbc 100644 --- a/test/DataTransferTest.hpp +++ b/test/DataTransferTest.hpp @@ -82,7 +82,7 @@ double calcError(Problem const& prob, Fcts const& funcs) { auto& globalBasis = *prob.globalBasis(); auto localView = globalBasis.localView(); - auto sol = prob.solution().coefficients(); + auto const& sol = prob.solution().coefficients(); std::vector ref; ref.resize(globalBasis.size()); double error = 0; -- GitLab From 2f4cbfea8a1f14b0bb2d7f8fcb14040a6a25526d Mon Sep 17 00:00:00 2001 From: Simon Praetorius Date: Tue, 26 Mar 2019 17:40:29 +0100 Subject: [PATCH 2/6] Update bases before postAdapt of data --- src/amdis/GridTransfer.hpp | 9 +++----- src/amdis/GridTransferManager.hpp | 36 +++++++++++++++---------------- 2 files changed, 21 insertions(+), 24 deletions(-) diff --git a/src/amdis/GridTransfer.hpp b/src/amdis/GridTransfer.hpp index 77bdb2ad..cf5781c3 100644 --- a/src/amdis/GridTransfer.hpp +++ b/src/amdis/GridTransfer.hpp @@ -92,7 +92,6 @@ namespace AMDiS { assert(bound()); mightCoarsen_ = grid_->preAdapt(); - msg("interpolateCallbacks.size = {}", interpolateCallbacks_.size()); for (auto&& data : interpolateCallbacks_) data.second.preAdapt(mightCoarsen_); return mightCoarsen_; @@ -113,15 +112,13 @@ namespace AMDiS { assert(bound()); if (mightCoarsen_ || refined_) { + for (auto&& data : updateCallbacks_) + data.second.update(); for (auto&& data : interpolateCallbacks_) data.second.postAdapt(refined_); } - grid_->postAdapt(); - - msg("updateCallbacks.size = {}", updateCallbacks_.size()); - for (auto&& data : updateCallbacks_) - data.second.update(); + grid_->postAdapt(); changeIndex_++; } diff --git a/src/amdis/GridTransferManager.hpp b/src/amdis/GridTransferManager.hpp index 5c95796e..de2c2909 100644 --- a/src/amdis/GridTransferManager.hpp +++ b/src/amdis/GridTransferManager.hpp @@ -20,7 +20,7 @@ namespace AMDiS { using Self = GridTransferManager; using Key = std::uintptr_t; - using Data = std::unique_ptr; + using Data = std::shared_ptr; private: // Constructors. Since this is a static class you cannot call any constructor. @@ -42,19 +42,19 @@ namespace AMDiS template static bool adapt(Grid& grid) { - auto& transfer = gridTransfer(grid); - bool adapted = transfer.preAdapt(); - adapted |= transfer.adapt(); - transfer.postAdapt(); + auto transfer = gridTransfer(grid); + bool adapted = transfer->preAdapt(); + adapted |= transfer->adapt(); + transfer->postAdapt(); return adapted; } /// Returns the GridTransfer corresponding to a Grid, to be used during the adaptation cycle template - static GridTransfer& gridTransfer(Grid& grid) + static std::shared_ptr> gridTransfer(Grid& grid) { - auto& transfer = get(grid); - transfer.bind(grid); + auto transfer = get(grid); + transfer->bind(grid); return transfer; } @@ -64,7 +64,7 @@ namespace AMDiS static void attach(Vec& vec) { auto const& grid = vec.basis().gridView().grid(); - get(grid).attach(vec); + get(grid)->attach(vec); } template attach(basis); } @@ -81,7 +81,7 @@ namespace AMDiS static void detach(Vec& vec) { auto const& grid = vec.basis().gridView().grid(); - get(grid).detach(vec); + get(grid)->detach(vec); } template detach(basis); } private: template - static GridTransfer& get(Grid const& grid) + static std::shared_ptr> get(Grid const& grid) { - GridTransfer* gridTransfer - = dynamic_cast*>(Self::gridTransferInterface(grid)); - return *gridTransfer; + std::shared_ptr> gridTransfer + = std::dynamic_pointer_cast>(Self::gridTransferInterface(grid)); + return gridTransfer; } // Returns the GridTransferInterface class, // used for attaching and detaching DOFVectors to a GridTransfer template - static AdaptionInterface* gridTransferInterface(Grid const &grid) + static std::shared_ptr gridTransferInterface(Grid const &grid) { Key key = Key(&grid); GridTransferCache cache; @@ -113,7 +113,7 @@ namespace AMDiS { return std::make_unique>(); }); - return gridTransferInterfaceUniquePtr.get(); + return gridTransferInterfaceUniquePtr; } private: -- GitLab From 7b4f026ed51f1a56458164e2cab1eef3febfca27 Mon Sep 17 00:00:00 2001 From: Simon Praetorius Date: Wed, 27 Mar 2019 14:50:53 +0100 Subject: [PATCH 3/6] Wrapper for GlobalBasis with automatic adaption added --- src/amdis/AdaptionInterface.hpp | 2 +- src/amdis/AdaptiveGlobalBasis.hpp | 107 ++++++++++++++++++++++++++++++ src/amdis/CMakeLists.txt | 1 + src/amdis/GridTransfer.hpp | 3 +- src/amdis/ProblemStat.hpp | 7 +- src/amdis/ProblemStat.inc.hpp | 5 +- test/DOFVectorTest.cpp | 3 +- test/DataTransferTest.hpp | 20 +++--- 8 files changed, 129 insertions(+), 19 deletions(-) create mode 100644 src/amdis/AdaptiveGlobalBasis.hpp diff --git a/src/amdis/AdaptionInterface.hpp b/src/amdis/AdaptionInterface.hpp index d5bf819d..e860c071 100644 --- a/src/amdis/AdaptionInterface.hpp +++ b/src/amdis/AdaptionInterface.hpp @@ -29,7 +29,7 @@ namespace AMDiS { template auto requires_(Basis const& basis) -> decltype( - const_cast(basis).update(basis.gridView()) + const_cast(basis).update() ); }; diff --git a/src/amdis/AdaptiveGlobalBasis.hpp b/src/amdis/AdaptiveGlobalBasis.hpp new file mode 100644 index 00000000..5e78aca8 --- /dev/null +++ b/src/amdis/AdaptiveGlobalBasis.hpp @@ -0,0 +1,107 @@ +#pragma once + +#include + +#include + +#include + +namespace AMDiS +{ + /** + * \addtogroup Adaption + * @{ + **/ + + template + class AdaptiveGlobalBasis + { + using GlobalBasis = GB; + + public: + AdaptiveGlobalBasis() = default; + + AdaptiveGlobalBasis(std::shared_ptr basis) + : basis_(basis) // use a custom deleter + { + GridTransferManager::attach(*this); + } + + AdaptiveGlobalBasis(GB& basis) + : AdaptiveGlobalBasis(Dune::stackobject_to_shared_ptr(basis)) + {} + + AdaptiveGlobalBasis(AdaptiveGlobalBasis const&) = delete; + AdaptiveGlobalBasis(AdaptiveGlobalBasis&&) = delete; + + ~AdaptiveGlobalBasis() + { + if (basis_) + GridTransferManager::detach(*this); + } + + AdaptiveGlobalBasis& operator=(std::shared_ptr basis) + { + basis_ = basis; + GridTransferManager::attach(*this); + return *this; + } + + public: + void update() + { + assert(basis_); + basis_->update(basis_->gridView()); + } + + typename GB::GridView const& gridView() const + { + return basis_->gridView(); + } + + public: // smart-pointer interface + + GlobalBasis& operator*() + { + return *basis_; + } + + GlobalBasis const& operator*() const + { + return *basis_; + } + + GlobalBasis* operator->() + { + return basis_.get(); + } + + GlobalBasis const* operator->() const + { + return basis_.get(); + } + + operator bool() const + { + return bool(basis_); + } + + public: + + std::shared_ptr get() + { + return basis_; + } + + std::shared_ptr get() const + { + return basis_; + } + + private: + std::shared_ptr basis_; + }; + + /// @} + +} // end namespace AMDiS diff --git a/src/amdis/CMakeLists.txt b/src/amdis/CMakeLists.txt index dbbade5d..c21899d2 100644 --- a/src/amdis/CMakeLists.txt +++ b/src/amdis/CMakeLists.txt @@ -18,6 +18,7 @@ install(FILES AdaptInfo.hpp AdaptInstationary.hpp AdaptionInterface.hpp + AdaptiveGlobalBasis.hpp AdaptStationary.hpp AMDiS.hpp Assembler.hpp diff --git a/src/amdis/GridTransfer.hpp b/src/amdis/GridTransfer.hpp index cf5781c3..ac5a90fd 100644 --- a/src/amdis/GridTransfer.hpp +++ b/src/amdis/GridTransfer.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -67,7 +68,7 @@ namespace AMDiS void attach(Data& data) { updateCallbacks_.emplace(Key(&data), UpdateCallback{ - [&data]() -> void { data.update(data.gridView()); }}); + [&data]() -> void { data.update(); }}); } template #include +#include #include #include #include @@ -293,8 +294,8 @@ namespace AMDiS std::shared_ptr const> boundaryManager() const { return boundaryManager_; } /// Return the \ref globalBasis_ - std::shared_ptr globalBasis() { return globalBasis_; } - std::shared_ptr globalBasis() const { return globalBasis_; } + std::shared_ptr globalBasis() { return globalBasis_.get(); } + std::shared_ptr globalBasis() const { return globalBasis_.get(); } /// Return a reference to the linear solver, \ref linearSolver std::shared_ptr solver() { return linearSolver_; } @@ -448,7 +449,7 @@ namespace AMDiS std::shared_ptr> boundaryManager_; /// FE spaces of this problem. - std::shared_ptr globalBasis_; + AdaptiveGlobalBasis globalBasis_; /// A FileWriter object std::list> filewriter_; diff --git a/src/amdis/ProblemStat.inc.hpp b/src/amdis/ProblemStat.inc.hpp index 7c24c4c7..193deb77 100644 --- a/src/amdis/ProblemStat.inc.hpp +++ b/src/amdis/ProblemStat.inc.hpp @@ -50,7 +50,7 @@ void ProblemStat::initialize( if (globalRefinements > 0) { grid_->globalRefine(globalRefinements); if (globalBasis_) - globalBasis_->update(gridView()); + globalBasis_.update(); } } @@ -66,7 +66,7 @@ void ProblemStat::initialize( if (adoptProblem && (adoptFlag.isSet(INIT_FE_SPACE) || adoptFlag.isSet(INIT_SYSTEM))) { - adoptGlobalBasis(adoptProblem->globalBasis_); + adoptGlobalBasis(adoptProblem->globalBasis_.get()); } } @@ -168,7 +168,6 @@ void ProblemStat::initGlobalBasis() { dirichletBCs_.init(*globalBasis_, *globalBasis_); periodicBCs_.init(*globalBasis_, *globalBasis_); - GridTransferManager::attach(*globalBasis_); } diff --git a/test/DOFVectorTest.cpp b/test/DOFVectorTest.cpp index 424b9cf6..ea2ea270 100644 --- a/test/DOFVectorTest.cpp +++ b/test/DOFVectorTest.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -48,7 +49,6 @@ int main(int argc, char** argv) auto basis = makeBasis(gridView, composite(power<2>(lagrange<2>(), flatInterleaved()), lagrange<1>(), flatLexicographic())); using Basis = decltype(basis); - GridTransferManager::attach(basis); { DOFVector vec1(basis); @@ -71,6 +71,7 @@ int main(int argc, char** argv) // test GridTransferManager registration { + AdaptiveGlobalBasis adaptiveBasis(basis); DOFVector vec1(basis); test_dofvector(basis, vec1); for (auto const& e : elements(gridView)) diff --git a/test/DataTransferTest.hpp b/test/DataTransferTest.hpp index 7c238bbc..953281dd 100644 --- a/test/DataTransferTest.hpp +++ b/test/DataTransferTest.hpp @@ -60,29 +60,29 @@ auto makeProblem(typename BasisCreator::GlobalBasis::GridView::Grid& grid, Fcts using Problem = ProblemStat; // make problem - Problem prob("test", grid); - prob.initialize(INIT_ALL); + auto prob = std::make_unique("test", grid); + prob->initialize(INIT_ALL); - auto& globalBasis = *prob.globalBasis(); + auto& globalBasis = *prob->globalBasis(); auto localView = globalBasis.localView(); // interpolate given function to initial grid int k = 0; for_each_leaf_node(localView.tree(), [&](auto const& node, auto tp) { - interpolate(globalBasis, tp, prob.solution(tp).coefficients(), funcs[k]); + interpolate(globalBasis, tp, prob->solution(tp).coefficients(), funcs[k]); k++; }); - return prob; + return std::move(prob); } template double calcError(Problem const& prob, Fcts const& funcs) { - auto& globalBasis = *prob.globalBasis(); + auto& globalBasis = *prob->globalBasis(); auto localView = globalBasis.localView(); - auto const& sol = prob.solution().coefficients(); + auto const& sol = prob->solution().coefficients(); std::vector ref; ref.resize(globalBasis.size()); double error = 0; @@ -122,7 +122,7 @@ bool unchanged_test(Fcts const& funcs, bool simplex = true) auto e = *gridPtr->leafGridView().template begin<0>(); gridPtr->mark(-1, e); AdaptInfo adaptInfo("adapt"); - prob.adaptGrid(adaptInfo); + prob->adaptGrid(adaptInfo); auto error = calcError(prob, funcs); return error < AMDIS_TEST_TOL; @@ -137,7 +137,7 @@ bool coarsen_test(Fcts const& funcs, bool simplex = true) auto gridPtr = makeGrid(simplex, (d > 2 ? 2 : 4)); auto prob = makeProblem>(*gridPtr, funcs); - prob.globalCoarsen(1); + prob->globalCoarsen(1); auto error = calcError(prob, funcs); return error < AMDIS_TEST_TOL; @@ -152,7 +152,7 @@ bool refine_test(Fcts const& funcs, bool simplex = true) auto gridPtr = makeGrid(simplex, (d > 2 ? 1 : 3)); auto prob = makeProblem>(*gridPtr, funcs); - prob.globalRefine(1); + prob->globalRefine(1); auto error = calcError(prob, funcs); return error < AMDIS_TEST_TOL; -- GitLab From 4ccc87508480adb0ebc6e6e9ca3c15c86637e85c Mon Sep 17 00:00:00 2001 From: Simon Praetorius Date: Wed, 27 Mar 2019 17:16:53 +0100 Subject: [PATCH 4/6] register global basis in GridTransfer via DOFVector --- src/amdis/AdaptionInterface.hpp | 2 +- src/amdis/AdaptiveGlobalBasis.hpp | 107 -------------------- src/amdis/GridTransfer.hpp | 28 ++++- src/amdis/GridTransferManager.hpp | 31 ++---- src/amdis/ProblemStat.hpp | 7 +- src/amdis/ProblemStat.inc.hpp | 4 +- src/amdis/linearalgebra/DOFVectorBase.hpp | 29 ++++-- src/amdis/linearalgebra/eigen/DOFVector.hpp | 4 +- src/amdis/linearalgebra/istl/DOFVector.hpp | 4 +- src/amdis/linearalgebra/mtl/DOFVector.hpp | 4 +- test/DOFVectorTest.cpp | 2 - 11 files changed, 62 insertions(+), 160 deletions(-) delete mode 100644 src/amdis/AdaptiveGlobalBasis.hpp diff --git a/src/amdis/AdaptionInterface.hpp b/src/amdis/AdaptionInterface.hpp index e860c071..d5bf819d 100644 --- a/src/amdis/AdaptionInterface.hpp +++ b/src/amdis/AdaptionInterface.hpp @@ -29,7 +29,7 @@ namespace AMDiS { template auto requires_(Basis const& basis) -> decltype( - const_cast(basis).update() + const_cast(basis).update(basis.gridView()) ); }; diff --git a/src/amdis/AdaptiveGlobalBasis.hpp b/src/amdis/AdaptiveGlobalBasis.hpp deleted file mode 100644 index 5e78aca8..00000000 --- a/src/amdis/AdaptiveGlobalBasis.hpp +++ /dev/null @@ -1,107 +0,0 @@ -#pragma once - -#include - -#include - -#include - -namespace AMDiS -{ - /** - * \addtogroup Adaption - * @{ - **/ - - template - class AdaptiveGlobalBasis - { - using GlobalBasis = GB; - - public: - AdaptiveGlobalBasis() = default; - - AdaptiveGlobalBasis(std::shared_ptr basis) - : basis_(basis) // use a custom deleter - { - GridTransferManager::attach(*this); - } - - AdaptiveGlobalBasis(GB& basis) - : AdaptiveGlobalBasis(Dune::stackobject_to_shared_ptr(basis)) - {} - - AdaptiveGlobalBasis(AdaptiveGlobalBasis const&) = delete; - AdaptiveGlobalBasis(AdaptiveGlobalBasis&&) = delete; - - ~AdaptiveGlobalBasis() - { - if (basis_) - GridTransferManager::detach(*this); - } - - AdaptiveGlobalBasis& operator=(std::shared_ptr basis) - { - basis_ = basis; - GridTransferManager::attach(*this); - return *this; - } - - public: - void update() - { - assert(basis_); - basis_->update(basis_->gridView()); - } - - typename GB::GridView const& gridView() const - { - return basis_->gridView(); - } - - public: // smart-pointer interface - - GlobalBasis& operator*() - { - return *basis_; - } - - GlobalBasis const& operator*() const - { - return *basis_; - } - - GlobalBasis* operator->() - { - return basis_.get(); - } - - GlobalBasis const* operator->() const - { - return basis_.get(); - } - - operator bool() const - { - return bool(basis_); - } - - public: - - std::shared_ptr get() - { - return basis_; - } - - std::shared_ptr get() const - { - return basis_; - } - - private: - std::shared_ptr basis_; - }; - - /// @} - -} // end namespace AMDiS diff --git a/src/amdis/GridTransfer.hpp b/src/amdis/GridTransfer.hpp index ac5a90fd..1104910b 100644 --- a/src/amdis/GridTransfer.hpp +++ b/src/amdis/GridTransfer.hpp @@ -26,11 +26,13 @@ namespace AMDiS { std::function preAdapt; std::function postAdapt; + int count = 0; }; struct UpdateCallback { std::function update; + int count = 0; }; public: @@ -58,33 +60,49 @@ namespace AMDiS REQUIRES(Concepts::InterpolateData)> void attach(Data& data) { - interpolateCallbacks_.emplace(Key(&data), InterpolateCallback{ + auto it = interpolateCallbacks_.emplace(Key(&data), InterpolateCallback{ [&data](bool mightCoarsen) -> void { data.preAdapt(mightCoarsen); }, [&data](bool refined) -> void { data.postAdapt(refined); }}); + + if (it.second) + it.first->second.count++; } template )> void attach(Data& data) { - updateCallbacks_.emplace(Key(&data), UpdateCallback{ - [&data]() -> void { data.update(); }}); + auto it = updateCallbacks_.emplace(Key(&data), UpdateCallback{ + [&data]() -> void { data.update(data.gridView()); }}); + + if (it.second) + it.first->second.count++; } template )> void detach(Data& data) { - if (interpolateCallbacks_.erase(Key(&data)) == 0) + auto it = interpolateCallbacks_.find(Key(&data)); + if (it == interpolateCallbacks_.end()) warning("Data to detach not found"); + else if (it->second.count > 1) + it->second.count--; + else + interpolateCallbacks_.erase(it); } template )> void detach(Data& data) { - if (updateCallbacks_.erase(Key(&data)) == 0) + auto it = updateCallbacks_.find(Key(&data)); + if (it == updateCallbacks_.end()) warning("Data to detach not found"); + else if (it->second.count > 1) + it->second.count--; + else + updateCallbacks_.erase(it); } /// Implements \ref GridTransferInterface::preAdapt diff --git a/src/amdis/GridTransferManager.hpp b/src/amdis/GridTransferManager.hpp index de2c2909..cc7a8e83 100644 --- a/src/amdis/GridTransferManager.hpp +++ b/src/amdis/GridTransferManager.hpp @@ -59,38 +59,19 @@ namespace AMDiS } public: - template )> - static void attach(Vec& vec) - { - auto const& grid = vec.basis().gridView().grid(); - get(grid)->attach(vec); - } - template )> - static void attach(GlobalBasis& basis) + template + static void attach(Grid const& grid, Data& data) { - auto const& grid = basis.gridView().grid(); - get(grid)->attach(basis); + get(grid)->attach(data); } - - template )> - static void detach(Vec& vec) + template + static void detach(Grid const& grid, Data& data) { - auto const& grid = vec.basis().gridView().grid(); - get(grid)->detach(vec); + get(grid)->detach(data); } - template )> - static void detach(GlobalBasis& basis) - { - auto const& grid = basis.gridView().grid(); - get(grid)->detach(basis); - } private: diff --git a/src/amdis/ProblemStat.hpp b/src/amdis/ProblemStat.hpp index 8f2a1470..97046397 100644 --- a/src/amdis/ProblemStat.hpp +++ b/src/amdis/ProblemStat.hpp @@ -13,7 +13,6 @@ #include #include -#include #include #include #include @@ -294,8 +293,8 @@ namespace AMDiS std::shared_ptr const> boundaryManager() const { return boundaryManager_; } /// Return the \ref globalBasis_ - std::shared_ptr globalBasis() { return globalBasis_.get(); } - std::shared_ptr globalBasis() const { return globalBasis_.get(); } + std::shared_ptr globalBasis() { return globalBasis_; } + std::shared_ptr globalBasis() const { return globalBasis_; } /// Return a reference to the linear solver, \ref linearSolver std::shared_ptr solver() { return linearSolver_; } @@ -449,7 +448,7 @@ namespace AMDiS std::shared_ptr> boundaryManager_; /// FE spaces of this problem. - AdaptiveGlobalBasis globalBasis_; + std::shared_ptr globalBasis_; /// A FileWriter object std::list> filewriter_; diff --git a/src/amdis/ProblemStat.inc.hpp b/src/amdis/ProblemStat.inc.hpp index 193deb77..47c857fd 100644 --- a/src/amdis/ProblemStat.inc.hpp +++ b/src/amdis/ProblemStat.inc.hpp @@ -50,7 +50,7 @@ void ProblemStat::initialize( if (globalRefinements > 0) { grid_->globalRefine(globalRefinements); if (globalBasis_) - globalBasis_.update(); + globalBasis_->update(globalBasis_->gridView()); } } @@ -66,7 +66,7 @@ void ProblemStat::initialize( if (adoptProblem && (adoptFlag.isSet(INIT_FE_SPACE) || adoptFlag.isSet(INIT_SYSTEM))) { - adoptGlobalBasis(adoptProblem->globalBasis_.get()); + adoptGlobalBasis(adoptProblem->globalBasis_); } } diff --git a/src/amdis/linearalgebra/DOFVectorBase.hpp b/src/amdis/linearalgebra/DOFVectorBase.hpp index 91e1c57d..37feaab6 100644 --- a/src/amdis/linearalgebra/DOFVectorBase.hpp +++ b/src/amdis/linearalgebra/DOFVectorBase.hpp @@ -57,12 +57,12 @@ namespace AMDiS public: /// Constructor. Constructs new BaseVector. - DOFVectorBase(GlobalBasis const& basis, DataTransferOperation op = DataTransferOperation::INTERPOLATE) + DOFVectorBase(GlobalBasis& basis, DataTransferOperation op = DataTransferOperation::INTERPOLATE) : basis_(&basis) , dataTransfer_(DataTransferFactory::create(op, basis)) { compress(); - GridTransferManager::attach(*this); + attachToGridTransfer(); operators_.init(basis); } @@ -74,7 +74,7 @@ namespace AMDiS , operators_(that.operators_) , dataTransfer_(that.dataTransfer_) { - GridTransferManager::attach(*this); + attachToGridTransfer(); } /// Move constructor @@ -85,24 +85,24 @@ namespace AMDiS , operators_(std::move(that.operators_)) , dataTransfer_(std::move(that.dataTransfer_)) { - GridTransferManager::attach(*this); + attachToGridTransfer(); } /// Destructor ~DOFVectorBase() override { - GridTransferManager::detach(*this); + detachFromGridTransfer(); } /// Copy assignment operator Self& operator=(Self const& that) { - GridTransferManager::detach(*this); + detachFromGridTransfer(); basis_ = that.basis_; backend_.resize(that.size()); backend_ = that.backend_; dataTransfer_ = that.dataTransfer_; - GridTransferManager::attach(*this); + attachToGridTransfer(); return *this; } @@ -225,9 +225,22 @@ namespace AMDiS dataTransfer_->postAdapt(*this, refined); } + private: + void attachToGridTransfer() + { + GridTransferManager::attach(basis_->gridView().grid(), *this); + GridTransferManager::attach(basis_->gridView().grid(), *basis_); + } + + void detachFromGridTransfer() + { + GridTransferManager::detach(basis_->gridView().grid(), *basis_); + GridTransferManager::detach(basis_->gridView().grid(), *this); + } + private: /// The finite element space / basis associated with the data vector - GlobalBasis const* basis_; + GlobalBasis* basis_; /// Data backend Backend backend_; diff --git a/src/amdis/linearalgebra/eigen/DOFVector.hpp b/src/amdis/linearalgebra/eigen/DOFVector.hpp index a2f71979..d961943f 100644 --- a/src/amdis/linearalgebra/eigen/DOFVector.hpp +++ b/src/amdis/linearalgebra/eigen/DOFVector.hpp @@ -91,7 +91,7 @@ namespace AMDiS using Super = DOFVectorBase>; public: - DOFVector(BasisType const& basis, DataTransferOperation op = DataTransferOperation::INTERPOLATE) + DOFVector(BasisType& basis, DataTransferOperation op = DataTransferOperation::INTERPOLATE) : Super(basis, op) {} @@ -102,7 +102,7 @@ namespace AMDiS /// Constructor a dofvector from given basis and name template DOFVector - makeDOFVector(Basis const& basis, DataTransferOperation op = DataTransferOperation::INTERPOLATE) + makeDOFVector(Basis& basis, DataTransferOperation op = DataTransferOperation::INTERPOLATE) { return {basis, op}; } diff --git a/src/amdis/linearalgebra/istl/DOFVector.hpp b/src/amdis/linearalgebra/istl/DOFVector.hpp index 5d54f7ed..b6a85803 100644 --- a/src/amdis/linearalgebra/istl/DOFVector.hpp +++ b/src/amdis/linearalgebra/istl/DOFVector.hpp @@ -100,7 +100,7 @@ namespace AMDiS using Super = DOFVectorBase>; public: - DOFVector(BasisType const& basis, DataTransferOperation op = DataTransferOperation::INTERPOLATE) + DOFVector(BasisType& basis, DataTransferOperation op = DataTransferOperation::INTERPOLATE) : Super(basis, op) {} @@ -111,7 +111,7 @@ namespace AMDiS /// Constructor a dofvector from given basis and name template DOFVector - makeDOFVector(Basis const& basis, DataTransferOperation op = DataTransferOperation::INTERPOLATE) + makeDOFVector(Basis& basis, DataTransferOperation op = DataTransferOperation::INTERPOLATE) { return {basis, op}; } diff --git a/src/amdis/linearalgebra/mtl/DOFVector.hpp b/src/amdis/linearalgebra/mtl/DOFVector.hpp index 35be3d71..f7c1a9e5 100644 --- a/src/amdis/linearalgebra/mtl/DOFVector.hpp +++ b/src/amdis/linearalgebra/mtl/DOFVector.hpp @@ -91,7 +91,7 @@ namespace AMDiS using Super = DOFVectorBase>; public: - DOFVector(BasisType const& basis, DataTransferOperation op = DataTransferOperation::INTERPOLATE) + DOFVector(BasisType& basis, DataTransferOperation op = DataTransferOperation::INTERPOLATE) : Super(basis, op) {} @@ -102,7 +102,7 @@ namespace AMDiS /// Constructor a dofvector from given basis and name template DOFVector - makeDOFVector(Basis const& basis, DataTransferOperation op = DataTransferOperation::INTERPOLATE) + makeDOFVector(Basis& basis, DataTransferOperation op = DataTransferOperation::INTERPOLATE) { return {basis, op}; } diff --git a/test/DOFVectorTest.cpp b/test/DOFVectorTest.cpp index ea2ea270..1d69bc4b 100644 --- a/test/DOFVectorTest.cpp +++ b/test/DOFVectorTest.cpp @@ -7,7 +7,6 @@ #include #include -#include #include #include @@ -71,7 +70,6 @@ int main(int argc, char** argv) // test GridTransferManager registration { - AdaptiveGlobalBasis adaptiveBasis(basis); DOFVector vec1(basis); test_dofvector(basis, vec1); for (auto const& e : elements(gridView)) -- GitLab From acbae6de62cbddd2c7764edd3d9fbd9ca4082658 Mon Sep 17 00:00:00 2001 From: Simon Praetorius Date: Thu, 28 Mar 2019 09:49:10 +0100 Subject: [PATCH 5/6] GridTransfer cleaned up for new atach and detach mechanisms --- src/amdis/AdaptionInterface.hpp | 11 +++++-- src/amdis/GridTransfer.hpp | 55 ++++++++++++++++++++----------- src/amdis/GridTransferManager.hpp | 24 +++++--------- 3 files changed, 54 insertions(+), 36 deletions(-) diff --git a/src/amdis/AdaptionInterface.hpp b/src/amdis/AdaptionInterface.hpp index d5bf819d..bae6bb07 100644 --- a/src/amdis/AdaptionInterface.hpp +++ b/src/amdis/AdaptionInterface.hpp @@ -8,7 +8,7 @@ namespace AMDiS { /** - * \addtogroup Adaption + * \addtogroup Concepts * @{ **/ @@ -43,8 +43,15 @@ namespace AMDiS } // end namespace Concepts + /// @} + + + /** + * \addtogroup Adaption + * @{ + **/ - /// \brief Interface for transfer between grid changes to be registered in a \ref GridTransferManager + /// \brief Interface for transfer between grid changes class AdaptionInterface { public: diff --git a/src/amdis/GridTransfer.hpp b/src/amdis/GridTransfer.hpp index 1104910b..3c61106e 100644 --- a/src/amdis/GridTransfer.hpp +++ b/src/amdis/GridTransfer.hpp @@ -5,7 +5,6 @@ #include #include -#include namespace AMDiS { @@ -56,6 +55,14 @@ namespace AMDiS return grid_ != nullptr; } + /// Register data to GridTransfer. + /** + * This inserts a callback that is called in \ref preAdapt() and another that is + * called in \ref postAdapt() step. + * + * *Requirement:* + * - Data must be a model of \ref Concepts::InterpolateData + **/ template )> void attach(Data& data) @@ -64,10 +71,17 @@ namespace AMDiS [&data](bool mightCoarsen) -> void { data.preAdapt(mightCoarsen); }, [&data](bool refined) -> void { data.postAdapt(refined); }}); - if (it.second) - it.first->second.count++; + it.first->second.count++; } + /// Register data to GridTransfer. + /** + * This inserts a callback that is called after the \ref adapt() step. + * The callback calls `data.update(data.gridView())`. + * + * *Requirement:* + * - Data must be a model of \ref Concepts::UpdateData + **/ template )> void attach(Data& data) @@ -75,34 +89,23 @@ namespace AMDiS auto it = updateCallbacks_.emplace(Key(&data), UpdateCallback{ [&data]() -> void { data.update(data.gridView()); }}); - if (it.second) - it.first->second.count++; + it.first->second.count++; } + /// Unregister data from GridTransfer. Data is identified by its address. template )> void detach(Data& data) { - auto it = interpolateCallbacks_.find(Key(&data)); - if (it == interpolateCallbacks_.end()) - warning("Data to detach not found"); - else if (it->second.count > 1) - it->second.count--; - else - interpolateCallbacks_.erase(it); + eraseCallback(interpolateCallbacks_, Key(&data)); } + /// Unregister data from GridTransfer. Data is identified by its address. template )> void detach(Data& data) { - auto it = updateCallbacks_.find(Key(&data)); - if (it == updateCallbacks_.end()) - warning("Data to detach not found"); - else if (it->second.count > 1) - it->second.count--; - else - updateCallbacks_.erase(it); + eraseCallback(updateCallbacks_, Key(&data)); } /// Implements \ref GridTransferInterface::preAdapt @@ -147,6 +150,20 @@ namespace AMDiS return changeIndex_; } + private: + // remove entry from map if count <= 1, otherwise reduce count by 1 + template + void eraseCallback(Map& map, Key key) + { + auto it = map.find(key); + if (it == map.end()) + warning("Data to detach not found"); + else if (it->second.count > 1) + it->second.count--; + else + map.erase(it); + } + private: /// A grid this GridTransfer is bound to in \ref bind() Grid* grid_ = nullptr; diff --git a/src/amdis/GridTransferManager.hpp b/src/amdis/GridTransferManager.hpp index cc7a8e83..23f6a389 100644 --- a/src/amdis/GridTransferManager.hpp +++ b/src/amdis/GridTransferManager.hpp @@ -49,7 +49,7 @@ namespace AMDiS return adapted; } - /// Returns the GridTransfer corresponding to a Grid, to be used during the adaptation cycle + /// Returns the GridTransfer bound to a Grid, to be used during the adaptation cycle template static std::shared_ptr> gridTransfer(Grid& grid) { @@ -59,7 +59,6 @@ namespace AMDiS } public: - template static void attach(Grid const& grid, Data& data) { @@ -74,27 +73,22 @@ namespace AMDiS private: - + /// \brief Returns the GridTransfer class, used for attaching and detaching Data + /** + * NOTE: The returned GridTransfer is not yet bound to a grid, since a + * mutable reference `Grid&` is needed for the binding. + **/ template static std::shared_ptr> get(Grid const& grid) - { - std::shared_ptr> gridTransfer - = std::dynamic_pointer_cast>(Self::gridTransferInterface(grid)); - return gridTransfer; - } - - // Returns the GridTransferInterface class, - // used for attaching and detaching DOFVectors to a GridTransfer - template - static std::shared_ptr gridTransferInterface(Grid const &grid) { Key key = Key(&grid); GridTransferCache cache; - auto& gridTransferInterfaceUniquePtr = cache.get(key, [&](Key const&) + auto& gridTransferInterface = cache.get(key, [&](Key const&) { return std::make_unique>(); }); - return gridTransferInterfaceUniquePtr; + + return std::dynamic_pointer_cast>(gridTransferInterface); } private: -- GitLab From ac9b70cc016bec2722df9e75d88a32cc1bdf0396 Mon Sep 17 00:00:00 2001 From: Simon Praetorius Date: Fri, 29 Mar 2019 15:23:51 +0100 Subject: [PATCH 6/6] cleanup AdaptionInterface --- src/amdis/AdaptionInterface.hpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/amdis/AdaptionInterface.hpp b/src/amdis/AdaptionInterface.hpp index bae6bb07..66a0baf6 100644 --- a/src/amdis/AdaptionInterface.hpp +++ b/src/amdis/AdaptionInterface.hpp @@ -1,8 +1,5 @@ #pragma once -#include - -#include #include namespace AMDiS -- GitLab