From 45039213d1a2d4702e97955bba6f86ceae3b7568 Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Sat, 19 Nov 2011 17:08:46 +0000 Subject: [PATCH] add support for third-order Lagrange spaces [[Imported from SVN: r8234]] --- dune/gfe/riemanniantrsolver.cc | 34 +++++++++++++++------------------- dune/gfe/riemanniantrsolver.hh | 22 ++++++++++++---------- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/dune/gfe/riemanniantrsolver.cc b/dune/gfe/riemanniantrsolver.cc index 85f32f7b..bce54849 100644 --- a/dune/gfe/riemanniantrsolver.cc +++ b/dune/gfe/riemanniantrsolver.cc @@ -12,8 +12,8 @@ #include <dune/solvers/iterationsteps/trustregiongsstep.hh> #include <dune/solvers/iterationsteps/mmgstep.hh> #include <dune/solvers/transferoperators/truncatedcompressedmgtransfer.hh> -#ifdef HIGHER_ORDER -#include <dune/solvers/transferoperators/p2top1mgtransfer.hh> +#if defined THIRD_ORDER || defined SECOND_ORDER +#include <dune/gfe/pktop1mgtransfer.hh> #endif #include <dune/solvers/transferoperators/mandelobsrestrictor.hh> #include <dune/solvers/solvers/iterativesolver.hh> @@ -26,11 +26,7 @@ template <class GridType, class TargetSpace> void RiemannianTrustRegionSolver<GridType,TargetSpace>:: setup(const GridType& grid, -#ifdef HIGHER_ORDER - const GeodesicFEAssembler<P2NodalBasis<typename GridType::LeafGridView,double>, TargetSpace>* assembler, -#else - const GeodesicFEAssembler<P1NodalBasis<typename GridType::LeafGridView,double>, TargetSpace>* assembler, -#endif + const GeodesicFEAssembler<BasisType, TargetSpace>* assembler, const SolutionType& x, const Dune::BitSetVector<blocksize>& dirichletNodes, double tolerance, @@ -98,11 +94,11 @@ setup(const GridType& grid, // ////////////////////////////////////////////////////////////////////////////////////// // Assemble a Laplace matrix to create a norm that's equivalent to the H1-norm // ////////////////////////////////////////////////////////////////////////////////////// - typedef P1NodalBasis<typename GridType::LeafGridView,double> FEBasis; - FEBasis basis(grid.leafView()); - OperatorAssembler<FEBasis,FEBasis> operatorAssembler(basis, basis); + typedef P1NodalBasis<typename GridType::LeafGridView,double> P1Basis; + P1Basis p1Basis(grid.leafView()); + OperatorAssembler<P1Basis,P1Basis> operatorAssembler(p1Basis, p1Basis); - LaplaceAssembler<GridType, typename FEBasis::LocalFiniteElement, typename FEBasis::LocalFiniteElement> laplaceStiffness; + LaplaceAssembler<GridType, typename P1Basis::LocalFiniteElement, typename P1Basis::LocalFiniteElement> laplaceStiffness; typedef Dune::BCRSMatrix<Dune::FieldMatrix<double,1,1> > ScalarMatrixType; ScalarMatrixType* A = new ScalarMatrixType; @@ -138,11 +134,9 @@ setup(const GridType& grid, // ////////////////////////////////////////////////////////// hasObstacle_.resize(numLevels); -#ifdef HIGHER_ORDER - P2NodalBasis<typename GridType::LeafGridView,double> p2Basis(grid_->leafView()); - P1NodalBasis<typename GridType::LeafGridView,double> p1Basis(grid_->leafView()); - - hasObstacle_.back().resize(p2Basis.size(), true); +#if defined THIRD_ORDER || defined SECOND_ORDER + BasisType basis(grid_->leafView()); + hasObstacle_.back().resize(basis.size(), true); for (int i=0; i<hasObstacle_.size()-1; i++) hasObstacle_[i].resize(grid_->size(i+1, gridDim),true); @@ -159,10 +153,12 @@ setup(const GridType& grid, mmgStep->mgTransfer_.resize(numLevels-1); -#ifdef HIGHER_ORDER +#if defined THIRD_ORDER || defined SECOND_ORDER if (numLevels>1) { - P2toP1MGTransfer<CorrectionType>* topTransferOp = new P2toP1MGTransfer<CorrectionType>; - topTransferOp->setup(p2Basis,p1Basis); + P1NodalBasis<typename GridType::LeafGridView,double> p1Basis(grid_->leafView()); + + PKtoP1MGTransfer<CorrectionType>* topTransferOp = new PKtoP1MGTransfer<CorrectionType>; + topTransferOp->setup(basis,p1Basis); mmgStep->mgTransfer_.back() = topTransferOp; for (int i=0; i<mmgStep->mgTransfer_.size()-1; i++){ diff --git a/dune/gfe/riemanniantrsolver.hh b/dune/gfe/riemanniantrsolver.hh index 2a1d4642..73ff2e90 100644 --- a/dune/gfe/riemanniantrsolver.hh +++ b/dune/gfe/riemanniantrsolver.hh @@ -14,6 +14,8 @@ #include <dune/solvers/solvers/loopsolver.hh> #include <dune/fufem/functionspacebases/p1nodalbasis.hh> +#include <dune/fufem/functionspacebases/p2nodalbasis.hh> +#include <dune/fufem/functionspacebases/p3nodalbasis.hh> #include "geodesicfeassembler.hh" @@ -35,6 +37,14 @@ class RiemannianTrustRegionSolver typedef Dune::BlockVector<Dune::FieldVector<field_type, blocksize> > CorrectionType; typedef std::vector<TargetSpace> SolutionType; +#ifdef THIRD_ORDER + typedef P3NodalBasis<typename GridType::LeafGridView,double> BasisType; +#elif defined SECOND_ORDER + typedef P2NodalBasis<typename GridType::LeafGridView,double> BasisType; +#else + typedef P1NodalBasis<typename GridType::LeafGridView,double> BasisType; +#endif + public: RiemannianTrustRegionSolver() @@ -44,11 +54,7 @@ public: /** \brief Set up the solver using a monotone multigrid method as the inner solver */ void setup(const GridType& grid, -#ifdef HIGHER_ORDER - const GeodesicFEAssembler<P2NodalBasis<typename GridType::LeafGridView,double>, TargetSpace>* assembler, -#else - const GeodesicFEAssembler<P1NodalBasis<typename GridType::LeafGridView,double>, TargetSpace>* assembler, -#endif + const GeodesicFEAssembler<BasisType, TargetSpace>* assembler, const SolutionType& x, const Dune::BitSetVector<blocksize>& dirichletNodes, double tolerance, @@ -103,11 +109,7 @@ protected: std::auto_ptr<MatrixType> hessianMatrix_; /** \brief The assembler for the material law */ -#ifdef HIGHER_ORDER - const GeodesicFEAssembler<P2NodalBasis<typename GridType::LeafGridView,double>, TargetSpace>* assembler_; -#else - const GeodesicFEAssembler<P1NodalBasis<typename GridType::LeafGridView,double>, TargetSpace>* assembler_; -#endif + const GeodesicFEAssembler<BasisType, TargetSpace>* assembler_; /** \brief The solver for the quadratic inner problems */ std::shared_ptr<Solver> innerSolver_; -- GitLab