diff --git a/dune/functions/functionspacebases/lagrangedgbasis.hh b/dune/functions/functionspacebases/lagrangedgbasis.hh index 81689c7186292e3aa042794ba57d18c4fffd45ac..e0816f19cc67d2c0cf35a07269a8e26d6da146e9 100644 --- a/dune/functions/functionspacebases/lagrangedgbasis.hh +++ b/dune/functions/functionspacebases/lagrangedgbasis.hh @@ -291,6 +291,46 @@ protected: + +namespace BasisBuilder { + +namespace Imp { + +template<std::size_t k> +class LagrangeDGPreBasisFactory +{ +public: + static const std::size_t requiredMultiIndexSize = 1; + + template<class MultiIndex, class GridView> + auto makePreBasis(const GridView& gridView) const + { + return LagrangeDGPreBasis<GridView, k, MultiIndex>(gridView); + } + +}; + +} // end namespace BasisBuilder::Imp + + + +/** + * \brief Create a pre-basis factory that can create a LagrangeDG pre-basis + * + * \ingroup FunctionSpaceBasesImplementations + * + * \tparam k The polynomial order of the ansatz functions + */ +template<std::size_t k> +auto lagrangeDG() +{ + return Imp::LagrangeDGPreBasisFactory<k>(); +} + +} // end namespace BasisBuilder + + + // ***************************************************************************** // This is the actual global basis implementation based on the reusable parts. // ***************************************************************************** diff --git a/dune/functions/functionspacebases/pq1nodalbasis.hh b/dune/functions/functionspacebases/pq1nodalbasis.hh index 3949ad726293fdc0211a21d6dbccc35831c3da21..b05f0de7ec37ee6fc753eeaea0df65f175ed84d4 100644 --- a/dune/functions/functionspacebases/pq1nodalbasis.hh +++ b/dune/functions/functionspacebases/pq1nodalbasis.hh @@ -285,6 +285,43 @@ protected: +namespace BasisBuilder { + +namespace Imp { + +class PQ1PreBasisFactory +{ +public: + static const std::size_t requiredMultiIndexSize = 1; + + template<class MultiIndex, class GridView> + auto makePreBasis(const GridView& gridView) const + { + return PQ1PreBasis<GridView, MultiIndex>(gridView); + } + +}; + +} // end namespace BasisBuilder::Imp + + + +/** + * \brief Create a pre-basis factory that can create a PQ_1 pre-basis + * + * \ingroup FunctionSpaceBasesImplementations + * + * \tparam k The polynomial order of ansatz functions + */ +auto pq1Nodal() +{ + return Imp::PQ1PreBasisFactory(); +} + +} // end namespace BasisBuilder + + + /** \brief Nodal basis of a scalar first-order Lagrangian finite element space * * \ingroup FunctionSpaceBasesImplementations diff --git a/dune/functions/functionspacebases/test/CMakeLists.txt b/dune/functions/functionspacebases/test/CMakeLists.txt index 4f3490af911607c638fd0555cb44c58b26ccf8d7..5da78ff4e5d4269bd8d56df30adfc4b0f2669a64 100644 --- a/dune/functions/functionspacebases/test/CMakeLists.txt +++ b/dune/functions/functionspacebases/test/CMakeLists.txt @@ -7,6 +7,10 @@ dune_add_test(SOURCES brezzidouglasmarinibasistest.cc) dune_add_test(SOURCES gridviewfunctionspacebasistest.cc) +dune_add_test(SOURCES lagrangedgbasistest.cc) + +dune_add_test(SOURCES pq1nodalbasistest.cc) + dune_add_test(SOURCES taylorhoodbasistest.cc) dune_add_test(SOURCES rannacherturekbasistest.cc) diff --git a/dune/functions/functionspacebases/test/lagrangedgbasistest.cc b/dune/functions/functionspacebases/test/lagrangedgbasistest.cc new file mode 100644 index 0000000000000000000000000000000000000000..0ad61be724a65f32bb52404c317a94c87d2b575b --- /dev/null +++ b/dune/functions/functionspacebases/test/lagrangedgbasistest.cc @@ -0,0 +1,56 @@ +// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- +// vi: set et ts=4 sw=2 sts=2: +#include <config.h> + +#include <iostream> + +#include <dune/common/exceptions.hh> +#include <dune/common/parallel/mpihelper.hh> + +#include <dune/grid/yaspgrid.hh> + +#include <dune/functions/functionspacebases/lagrangedgbasis.hh> + +#include <dune/functions/functionspacebases/test/basistest.hh> + +using namespace Dune; +using namespace Dune::Functions; + +int main (int argc, char* argv[]) +{ + Dune::MPIHelper::instance(argc, argv); + + Dune::TestSuite test; + + + + // Generate grid for testing + const int dim = 2; + typedef YaspGrid<dim> GridType; + FieldVector<double,dim> l(1); + std::array<int,dim> elements = {{10, 10}}; + GridType grid(l,elements); + + + + // check LagrangeDGBasis created 'manually' + { + typedef GridType::LeafGridView GridView; + const GridView& gridView = grid.leafGridView(); + LagrangeDGBasis<GridView,2> basis(gridView); + test.subTest(checkBasis(basis)); + } + + + + // check LagrangeDGBasis created using basis builder mechanism + { + using namespace Functions::BasisBuilder; + auto basis = makeBasis(grid.leafGridView(), lagrangeDG<2>()); + test.subTest(checkBasis(basis)); + } + + + + return test.exit(); +} diff --git a/dune/functions/functionspacebases/test/pq1nodalbasistest.cc b/dune/functions/functionspacebases/test/pq1nodalbasistest.cc new file mode 100644 index 0000000000000000000000000000000000000000..fa1e6d832e718775eb2821bd5e2d5e7f847aacd1 --- /dev/null +++ b/dune/functions/functionspacebases/test/pq1nodalbasistest.cc @@ -0,0 +1,56 @@ +// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- +// vi: set et ts=4 sw=2 sts=2: +#include <config.h> + +#include <iostream> + +#include <dune/common/exceptions.hh> +#include <dune/common/parallel/mpihelper.hh> + +#include <dune/grid/yaspgrid.hh> + +#include <dune/functions/functionspacebases/pq1nodalbasis.hh> + +#include <dune/functions/functionspacebases/test/basistest.hh> + +using namespace Dune; +using namespace Dune::Functions; + +int main (int argc, char* argv[]) +{ + Dune::MPIHelper::instance(argc, argv); + + Dune::TestSuite test; + + + + // Generate grid for testing + const int dim = 2; + typedef YaspGrid<dim> GridType; + FieldVector<double,dim> l(1); + std::array<int,dim> elements = {{10, 10}}; + GridType grid(l,elements); + + + + // check PQ1NodalBasis created 'manually' + { + typedef GridType::LeafGridView GridView; + const GridView& gridView = grid.leafGridView(); + PQ1NodalBasis<GridView> basis(gridView); + test.subTest(checkBasis(basis)); + } + + + + // check PQ1NodalBasis created using basis builder mechanism + { + using namespace Functions::BasisBuilder; + auto basis = makeBasis(grid.leafGridView(), pq1Nodal()); + test.subTest(checkBasis(basis)); + } + + + + return test.exit(); +}