Commit af1d36c3 authored by Praetorius, Simon's avatar Praetorius, Simon
Browse files

add constructor and deduction guide for DOFVector

parent 6b3c8bca
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <amdis/Observer.hpp> #include <amdis/Observer.hpp>
#include <amdis/common/Concepts.hpp> #include <amdis/common/Concepts.hpp>
#include <amdis/common/TypeTraits.hpp> #include <amdis/common/TypeTraits.hpp>
#include <amdis/functions/ParallelGlobalBasis.hpp>
#include <amdis/gridfunctions/DiscreteFunction.hpp> #include <amdis/gridfunctions/DiscreteFunction.hpp>
#include <amdis/typetree/TreePath.hpp> #include <amdis/typetree/TreePath.hpp>
...@@ -74,12 +75,11 @@ namespace AMDiS ...@@ -74,12 +75,11 @@ namespace AMDiS
: DOFVector(Dune::wrap_or_move(FWD(basis)), op) : DOFVector(Dune::wrap_or_move(FWD(basis)), op)
{} {}
/// (3) Constructor. Forwards to (1) by creating a new basis from a dune-functions basis. /// (3) Constructor. Forwards to (1) by creating a new basis from a dune-functions pre-basis factory.
template <class GB_, template <class GV, class PBF,
REQUIRES(not Concepts::Similar<GB_,GB>), REQUIRES(Concepts::PreBasisFactory<PBF, GV, MultiIndex_t<PBF>>)>
REQUIRES(Concepts::GlobalBasis<GB_>)> DOFVector(GV const& gridView, PBF const& preBasisFactory, DataTransferOperation op = DataTransferOperation::INTERPOLATE)
DOFVector(GB_&& basis, DataTransferOperation op = DataTransferOperation::INTERPOLATE) : DOFVector(std::make_shared<GB>(gridView, preBasisFactory), op)
: DOFVector(std::make_shared<GB>(std::move(basis)), op)
{} {}
std::shared_ptr<GlobalBasis const> const& basis() const { return basis_; } std::shared_ptr<GlobalBasis const> const& basis() const { return basis_; }
...@@ -224,6 +224,10 @@ namespace AMDiS ...@@ -224,6 +224,10 @@ namespace AMDiS
DOFVector(GB&& basis, DataTransferOperation op = DataTransferOperation::INTERPOLATE) DOFVector(GB&& basis, DataTransferOperation op = DataTransferOperation::INTERPOLATE)
-> DOFVector<ParallelGlobalBasis<typename Underlying_t<GB>::PreBasis>>; -> DOFVector<ParallelGlobalBasis<typename Underlying_t<GB>::PreBasis>>;
template <class GV, class PBF>
DOFVector(GV const& gridView, PBF const& pbf, DataTransferOperation op = DataTransferOperation::INTERPOLATE)
-> DOFVector<decltype(ParallelGlobalBasis{gridView,pbf})>;
/// \brief Create a DOFVector from a basis. /// \brief Create a DOFVector from a basis.
/** /**
......
...@@ -116,7 +116,7 @@ namespace AMDiS ...@@ -116,7 +116,7 @@ namespace AMDiS
/// on the fly. /// on the fly.
template <class Grid_, class PBF_, template <class Grid_, class PBF_,
class GV_ = typename Underlying_t<Grid_>::LeafGridView, class GV_ = typename Underlying_t<Grid_>::LeafGridView,
REQUIRES(Concepts::PreBasisFactory<PBF_,GV_>)> REQUIRES(Concepts::PreBasisFactory<PBF_, GV_, MultiIndex_t<PBF_>>)>
ProblemStat(std::string const& name, Grid_&& grid, PBF_ const& preBasisFactory) ProblemStat(std::string const& name, Grid_&& grid, PBF_ const& preBasisFactory)
: ProblemStat(name, FWD(grid)) : ProblemStat(name, FWD(grid))
{ {
...@@ -536,7 +536,7 @@ namespace AMDiS ...@@ -536,7 +536,7 @@ namespace AMDiS
template <class G, class PBF> template <class G, class PBF>
struct DeducedProblemTraits<G,PBF, struct DeducedProblemTraits<G,PBF,
std::enable_if_t<Concepts::PreBasisFactory<PBF,typename G::LeafGridView>>> std::enable_if_t<Concepts::PreBasisFactory<PBF, typename G::LeafGridView, MultiIndex_t<PBF>>>>
{ {
using Grid = AdaptiveGrid_t<G>; using Grid = AdaptiveGrid_t<G>;
using GridView = typename Grid::LeafGridView; using GridView = typename Grid::LeafGridView;
......
...@@ -192,11 +192,11 @@ namespace AMDiS ...@@ -192,11 +192,11 @@ namespace AMDiS
template <class GB, class GV = typename GB::GridView> template <class GB, class GV = typename GB::GridView>
using GlobalBasis_t = models_t<Dune::Functions::Concept::GlobalBasis<GV>(GB)>; using GlobalBasis_t = models_t<Dune::Functions::Concept::GlobalBasis<GV>(GB)>;
template <class PBF, class GV, class MultiIndex = std::array<std::size_t,1>> template <class PBF, class GV, class MI = std::array<std::size_t,1>>
constexpr bool PreBasisFactory = models<Definition::PreBasisFactory<MultiIndex>(PBF,GV)>; constexpr bool PreBasisFactory = models<Definition::PreBasisFactory<MI>(PBF,GV)>;
template <class PBF, class GV, class MultiIndex = std::array<std::size_t,1>> template <class PBF, class GV, class MI = std::array<std::size_t,1>>
using PreBasisFactory_t = models_t<Definition::PreBasisFactory<MultiIndex>(PBF,GV)>; using PreBasisFactory_t = models_t<Definition::PreBasisFactory<MI>(PBF,GV)>;
/** @} **/ /** @} **/
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
namespace AMDiS namespace AMDiS
{ {
template <class PreBasisFactory> template <class PreBasisFactory>
using MultiIndex = std::conditional_t< using MultiIndex_t = std::conditional_t<
(remove_cvref_t<PreBasisFactory>::requiredMultiIndexSize == 1), (remove_cvref_t<PreBasisFactory>::requiredMultiIndexSize == 1),
Dune::Functions::FlatMultiIndex<std::size_t>, Dune::Functions::FlatMultiIndex<std::size_t>,
Dune::ReservedVector<std::size_t, remove_cvref_t<PreBasisFactory>::requiredMultiIndexSize>>; Dune::ReservedVector<std::size_t, remove_cvref_t<PreBasisFactory>::requiredMultiIndexSize>>;
...@@ -101,9 +101,9 @@ namespace AMDiS ...@@ -101,9 +101,9 @@ namespace AMDiS
/// Construct this global basis with a preBasisFactory /// Construct this global basis with a preBasisFactory
template <class PBF> template <class PBF>
ParallelGlobalBasis(std::string const& name, GridView const& gridView, PBF&& preBasisFactory) ParallelGlobalBasis(std::string const& name, GridView const& gridView, PBF const& preBasisFactory)
: ParallelGlobalBasis(name, gridView.grid(), : ParallelGlobalBasis(name, gridView.grid(),
preBasisFactory.template makePreBasis<MultiIndex<PBF>>(gridView)) preBasisFactory.template makePreBasis<MultiIndex_t<PBF>>(gridView))
{} {}
/// Construct this global basis with empty name /// Construct this global basis with empty name
...@@ -181,11 +181,11 @@ namespace AMDiS ...@@ -181,11 +181,11 @@ namespace AMDiS
template <class GV, class PBF> template <class GV, class PBF>
ParallelGlobalBasis(std::string const& name, GV const& gridView, PBF&& preBasisFactory) ParallelGlobalBasis(std::string const& name, GV const& gridView, PBF&& preBasisFactory)
-> ParallelGlobalBasis<decltype( -> ParallelGlobalBasis<decltype(
preBasisFactory.template makePreBasis<MultiIndex<PBF>>(gridView))>; preBasisFactory.template makePreBasis<MultiIndex_t<PBF>>(gridView))>;
template <class GV, class PBF> template <class GV, class PBF>
ParallelGlobalBasis(GV const& gridView, PBF&& preBasisFactory) ParallelGlobalBasis(GV const& gridView, PBF&& preBasisFactory)
-> ParallelGlobalBasis<decltype( -> ParallelGlobalBasis<decltype(
preBasisFactory.template makePreBasis<MultiIndex<PBF>>(gridView))>; preBasisFactory.template makePreBasis<MultiIndex_t<PBF>>(gridView))>;
} // end namespace AMDiS } // end namespace AMDiS
...@@ -98,7 +98,7 @@ int main(int argc, char** argv) ...@@ -98,7 +98,7 @@ int main(int argc, char** argv)
DOFVector<Basis> vec1(basis); DOFVector<Basis> vec1(basis);
// Conversion from Dune::Functions::DefaultGlobalBasis // Conversion from Dune::Functions::DefaultGlobalBasis
auto vec2 = makeDOFVector(makeBasis(gridView, preBasis)); DOFVector vec2(gridView, preBasis);
for (auto const& e : elements(gridView)) for (auto const& e : elements(gridView))
grid.mark(1, e); grid.mark(1, e);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment