Skip to content
Snippets Groups Projects
Commit 45039213 authored by Oliver Sander's avatar Oliver Sander Committed by sander@FU-BERLIN.DE
Browse files

add support for third-order Lagrange spaces

[[Imported from SVN: r8234]]
parent 021419ac
No related branches found
No related tags found
No related merge requests found
...@@ -12,8 +12,8 @@ ...@@ -12,8 +12,8 @@
#include <dune/solvers/iterationsteps/trustregiongsstep.hh> #include <dune/solvers/iterationsteps/trustregiongsstep.hh>
#include <dune/solvers/iterationsteps/mmgstep.hh> #include <dune/solvers/iterationsteps/mmgstep.hh>
#include <dune/solvers/transferoperators/truncatedcompressedmgtransfer.hh> #include <dune/solvers/transferoperators/truncatedcompressedmgtransfer.hh>
#ifdef HIGHER_ORDER #if defined THIRD_ORDER || defined SECOND_ORDER
#include <dune/solvers/transferoperators/p2top1mgtransfer.hh> #include <dune/gfe/pktop1mgtransfer.hh>
#endif #endif
#include <dune/solvers/transferoperators/mandelobsrestrictor.hh> #include <dune/solvers/transferoperators/mandelobsrestrictor.hh>
#include <dune/solvers/solvers/iterativesolver.hh> #include <dune/solvers/solvers/iterativesolver.hh>
...@@ -26,11 +26,7 @@ ...@@ -26,11 +26,7 @@
template <class GridType, class TargetSpace> template <class GridType, class TargetSpace>
void RiemannianTrustRegionSolver<GridType,TargetSpace>:: void RiemannianTrustRegionSolver<GridType,TargetSpace>::
setup(const GridType& grid, setup(const GridType& grid,
#ifdef HIGHER_ORDER const GeodesicFEAssembler<BasisType, TargetSpace>* assembler,
const GeodesicFEAssembler<P2NodalBasis<typename GridType::LeafGridView,double>, TargetSpace>* assembler,
#else
const GeodesicFEAssembler<P1NodalBasis<typename GridType::LeafGridView,double>, TargetSpace>* assembler,
#endif
const SolutionType& x, const SolutionType& x,
const Dune::BitSetVector<blocksize>& dirichletNodes, const Dune::BitSetVector<blocksize>& dirichletNodes,
double tolerance, double tolerance,
...@@ -98,11 +94,11 @@ setup(const GridType& grid, ...@@ -98,11 +94,11 @@ setup(const GridType& grid,
// ////////////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////////////
// Assemble a Laplace matrix to create a norm that's equivalent to the H1-norm // Assemble a Laplace matrix to create a norm that's equivalent to the H1-norm
// ////////////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////////////
typedef P1NodalBasis<typename GridType::LeafGridView,double> FEBasis; typedef P1NodalBasis<typename GridType::LeafGridView,double> P1Basis;
FEBasis basis(grid.leafView()); P1Basis p1Basis(grid.leafView());
OperatorAssembler<FEBasis,FEBasis> operatorAssembler(basis, basis); 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; typedef Dune::BCRSMatrix<Dune::FieldMatrix<double,1,1> > ScalarMatrixType;
ScalarMatrixType* A = new ScalarMatrixType; ScalarMatrixType* A = new ScalarMatrixType;
...@@ -138,11 +134,9 @@ setup(const GridType& grid, ...@@ -138,11 +134,9 @@ setup(const GridType& grid,
// ////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////
hasObstacle_.resize(numLevels); hasObstacle_.resize(numLevels);
#ifdef HIGHER_ORDER #if defined THIRD_ORDER || defined SECOND_ORDER
P2NodalBasis<typename GridType::LeafGridView,double> p2Basis(grid_->leafView()); BasisType basis(grid_->leafView());
P1NodalBasis<typename GridType::LeafGridView,double> p1Basis(grid_->leafView()); hasObstacle_.back().resize(basis.size(), true);
hasObstacle_.back().resize(p2Basis.size(), true);
for (int i=0; i<hasObstacle_.size()-1; i++) for (int i=0; i<hasObstacle_.size()-1; i++)
hasObstacle_[i].resize(grid_->size(i+1, gridDim),true); hasObstacle_[i].resize(grid_->size(i+1, gridDim),true);
...@@ -159,10 +153,12 @@ setup(const GridType& grid, ...@@ -159,10 +153,12 @@ setup(const GridType& grid,
mmgStep->mgTransfer_.resize(numLevels-1); mmgStep->mgTransfer_.resize(numLevels-1);
#ifdef HIGHER_ORDER #if defined THIRD_ORDER || defined SECOND_ORDER
if (numLevels>1) { if (numLevels>1) {
P2toP1MGTransfer<CorrectionType>* topTransferOp = new P2toP1MGTransfer<CorrectionType>; P1NodalBasis<typename GridType::LeafGridView,double> p1Basis(grid_->leafView());
topTransferOp->setup(p2Basis,p1Basis);
PKtoP1MGTransfer<CorrectionType>* topTransferOp = new PKtoP1MGTransfer<CorrectionType>;
topTransferOp->setup(basis,p1Basis);
mmgStep->mgTransfer_.back() = topTransferOp; mmgStep->mgTransfer_.back() = topTransferOp;
for (int i=0; i<mmgStep->mgTransfer_.size()-1; i++){ for (int i=0; i<mmgStep->mgTransfer_.size()-1; i++){
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#include <dune/solvers/solvers/loopsolver.hh> #include <dune/solvers/solvers/loopsolver.hh>
#include <dune/fufem/functionspacebases/p1nodalbasis.hh> #include <dune/fufem/functionspacebases/p1nodalbasis.hh>
#include <dune/fufem/functionspacebases/p2nodalbasis.hh>
#include <dune/fufem/functionspacebases/p3nodalbasis.hh>
#include "geodesicfeassembler.hh" #include "geodesicfeassembler.hh"
...@@ -35,6 +37,14 @@ class RiemannianTrustRegionSolver ...@@ -35,6 +37,14 @@ class RiemannianTrustRegionSolver
typedef Dune::BlockVector<Dune::FieldVector<field_type, blocksize> > CorrectionType; typedef Dune::BlockVector<Dune::FieldVector<field_type, blocksize> > CorrectionType;
typedef std::vector<TargetSpace> SolutionType; 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: public:
RiemannianTrustRegionSolver() RiemannianTrustRegionSolver()
...@@ -44,11 +54,7 @@ public: ...@@ -44,11 +54,7 @@ public:
/** \brief Set up the solver using a monotone multigrid method as the inner solver */ /** \brief Set up the solver using a monotone multigrid method as the inner solver */
void setup(const GridType& grid, void setup(const GridType& grid,
#ifdef HIGHER_ORDER const GeodesicFEAssembler<BasisType, TargetSpace>* assembler,
const GeodesicFEAssembler<P2NodalBasis<typename GridType::LeafGridView,double>, TargetSpace>* assembler,
#else
const GeodesicFEAssembler<P1NodalBasis<typename GridType::LeafGridView,double>, TargetSpace>* assembler,
#endif
const SolutionType& x, const SolutionType& x,
const Dune::BitSetVector<blocksize>& dirichletNodes, const Dune::BitSetVector<blocksize>& dirichletNodes,
double tolerance, double tolerance,
...@@ -103,11 +109,7 @@ protected: ...@@ -103,11 +109,7 @@ protected:
std::auto_ptr<MatrixType> hessianMatrix_; std::auto_ptr<MatrixType> hessianMatrix_;
/** \brief The assembler for the material law */ /** \brief The assembler for the material law */
#ifdef HIGHER_ORDER const GeodesicFEAssembler<BasisType, TargetSpace>* assembler_;
const GeodesicFEAssembler<P2NodalBasis<typename GridType::LeafGridView,double>, TargetSpace>* assembler_;
#else
const GeodesicFEAssembler<P1NodalBasis<typename GridType::LeafGridView,double>, TargetSpace>* assembler_;
#endif
/** \brief The solver for the quadratic inner problems */ /** \brief The solver for the quadratic inner problems */
std::shared_ptr<Solver> innerSolver_; std::shared_ptr<Solver> innerSolver_;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment