From fdc53a8672c7ca5c78e23bb11ce12a2aae7c755b Mon Sep 17 00:00:00 2001 From: Robert Kloefkorn <robertk@posteo.net> Date: Sat, 11 Oct 2014 13:50:55 +0200 Subject: [PATCH] make basic version compile. --- dune/fem-dg/stepper/ellipt.hh | 134 +++++++++++++++++----------------- 1 file changed, 69 insertions(+), 65 deletions(-) diff --git a/dune/fem-dg/stepper/ellipt.hh b/dune/fem-dg/stepper/ellipt.hh index b3dfcebf..99e617de 100644 --- a/dune/fem-dg/stepper/ellipt.hh +++ b/dune/fem-dg/stepper/ellipt.hh @@ -23,7 +23,8 @@ static double minRatioOfSums = 1e+100; // dune-fem includes #include <dune/fem/misc/l2norm.hh> #include <dune/fem/misc/h1norm.hh> -#include <dune/fem/misc/dgnorm.hh> +#include <dune/fem/misc/femeoc.hh> +#include <dune/fem-dg/misc/dgnorm.hh> #include <dune/fem/operator/projection/l2projection.hh> #include <dune/fem/function/common/localfunctionadapter.hh> @@ -47,7 +48,7 @@ static double minRatioOfSums = 1e+100; // include local header files #include "base.hh" -// #include "../base/baseevolution.hh" +#include "baseevolution.hh" using namespace Dune; @@ -62,10 +63,10 @@ struct ElliptTraits enum { polynomialOrder = polOrd }; // type of Grid - typedef GridImp GridType; + typedef GridImp GridType; // Choose a suitable GridView - typedef Dune::Fem::AdaptiveLeafGridPart< GridType > GridPartType; + typedef Dune::Fem::AdaptiveLeafGridPart< GridType > GridPartType; // problem dependent types typedef typename ProblemTraits :: template Traits< GridPartType > :: InitialDataType InitialDataType; @@ -74,7 +75,10 @@ struct ElliptTraits static const Dune :: DGDiffusionFluxIdentifier DiffusionFluxId = ProblemTraits :: template Traits< GridPartType > :: PrimalDiffusionFluxId ; - typedef typename PassTraits<ModelType,dimRange,polynomialOrder>::DestinationType DiscreteFunctionType; + typedef PassTraits<ModelType,dimRange,polynomialOrder> PassTraitsType; + typedef typename PassTraitsType::DestinationType DiscreteFunctionType; + typedef typename PassTraitsType::LinearOperatorType LinearOperatorType; + typedef typename PassTraitsType::LinearInverseOperatorType LinearInverseOperatorType; typedef DGPrimalMatrixAssembly<DiscreteFunctionType,ModelType,FluxType > DgType; @@ -97,40 +101,35 @@ public: typedef ElliptTraits< GridImp, ProblemTraits, polynomialOrder> Traits ; // type of Grid - typedef typename Traits :: GridType GridType; + typedef typename Traits :: GridType GridType; // Choose a suitable GridView - typedef typename Traits :: GridPartType GridPartType; + typedef typename Traits :: GridPartType GridPartType; // initial data type - typedef typename Traits :: InitialDataType InitialDataType; + typedef typename Traits :: InitialDataType InitialDataType; // An analytical version of our model - typedef typename Traits :: ModelType ModelType; + typedef typename Traits :: ModelType ModelType; // The flux for the discretization of advection terms - typedef typename Traits :: FluxType FluxType; + typedef typename Traits :: FluxType FluxType; // The DG space operator - typedef typename Traits :: DgType DgType; + typedef typename Traits :: DgType DgType; // The discrete function for the unknown solution is defined in the DgOperator - typedef typename Traits :: DiscreteFunctionType DiscreteFunctionType; + typedef typename Traits :: DiscreteFunctionType DiscreteFunctionType; // ... as well as the Space type - typedef typename Traits :: DiscreteSpaceType DiscreteSpaceType; - -#if WANT_ISTL -#warning USING ISTL - typedef Dune::Fem::ISTLLinearOperator< DiscreteFunctionType, DiscreteFunctionType > LinearOperatorType; - typedef Dune::Fem::ISTLCGOp< DiscreteFunctionType, LinearOperatorType > InverseOperatorType; -#elif WANT_PETSC - typedef Dune::Fem::PetscLinearOperator< DiscreteFunctionType, DiscreteFunctionType > LinearOperatorType; - typedef Dune::Fem::PetscInverseOperator< DiscreteFunctionType, LinearOperatorType > InverseOperatorType ; -#else -#error -#endif - + typedef typename Traits :: DiscreteSpaceType DiscreteSpaceType; + + // type of linear operator (i.e. matrix implementation) + typedef typename Traits :: LinearOperatorType LinearOperatorType; + + // type of inverse operator (i.e. linear solver implementation) + typedef typename Traits :: LinearInverseOperatorType LinearInverseOperatorType; + enum { dimension = GridType :: dimension }; #if STOKES typedef typename DiscreteSpaceType :: @@ -278,10 +277,11 @@ public: }; typedef Dune::Fem::LocalFunctionAdapter< SigmaLocal<DiscreteFunctionType, DgType> > SigmaEstimateFunction; - typedef Estimator1< DiscreteFunctionType, SigmaDiscreteFunctionType, DgType > EstimatorType; + //typedef Estimator1< DiscreteFunctionType, SigmaDiscreteFunctionType, DgType > EstimatorType; - typedef Dune::Fem::LocalFunctionAdapter< EstimatorType > EstimateDataType; - typedef tuple< const DiscreteFunctionType*, const SigmaEstimateFunction*, const EstimateDataType* > IOTupleType; + //typedef Dune::Fem::LocalFunctionAdapter< EstimatorType > EstimateDataType; + //typedef tuple< const DiscreteFunctionType*, const SigmaEstimateFunction*, const EstimateDataType* > IOTupleType; + typedef tuple< const DiscreteFunctionType*, const SigmaEstimateFunction* > IOTupleType; typedef Dune::Fem::DataWriter<GridType,IOTupleType> DataWriterType; template <class SigmaLocalType> @@ -354,6 +354,10 @@ public: int val_; }; typedef PersistentContainer<GridType,PolOrderStructure> PolOrderContainer; + + // type of statistics monitor + typedef SolverMonitor SolverMonitorType ; + public: EllipticAlgorithm(GridType& grid) : grid_( grid ), @@ -363,9 +367,7 @@ public: convectionFlux_( *model_ ), dgOperator_(gridPart_, *model_), invDgOperator_(0), -#if WANT_ISTL || WANT_PETSC linDgOperator_(0), -#endif space_( const_cast<DiscreteSpaceType &> (dgOperator_.space()) ), solution_("solution", space_ ), rhs_("rhs", space_ ), @@ -373,9 +375,9 @@ public: sigmaDiscreteFunction_( "sigma", sigmaSpace_ ), sigmaLocalEstimate_( solution_, dgOperator_ ), sigmaEstimateFunction_( "function 4 estimate", sigmaLocalEstimate_, gridPart_, space_.order() ), - estimator_( solution_, sigmaDiscreteFunction_, dgOperator_, grid ), - estimateData_( "estimator", estimator_, gridPart_, space_.order() ), - ioTuple_( &solution_, &sigmaEstimateFunction_, &estimateData_ ), + //estimator_( solution_, sigmaDiscreteFunction_, dgOperator_, grid ), + //estimateData_( "estimator", estimator_, gridPart_, space_.order() ), + ioTuple_( &solution_, &sigmaEstimateFunction_), //, &estimateData_ ), polOrderContainer_(grid_ , 0), eocId_( -1 ), step_( 0 ), @@ -408,20 +410,29 @@ public: // we start with max order typedef typename PolOrderContainer :: Iterator Iterator ; const Iterator end = polOrderContainer_.end(); - const int minimalOrder = estimator_.minimalOrder() ; + const int minimalOrder = solution_.space().order(); // estimator_.minimalOrder() ; for( Iterator it = polOrderContainer_.begin(); it != end; ++it ) { (*it).value() = minimalOrder ; } const std::string eocDescription[] = { "$L^2$-error", "DG-error", "sigma-norm" }; - eocId_ = FemEoc::addEntry( eocDescription, 3); + eocId_ = Dune::Fem::FemEoc::addEntry( eocDescription, 3); } /*@LST1E@*/ - ~EllipticAlgorithm() + + virtual ~EllipticAlgorithm() { delete model_; } + GridType& grid () { return grid_; } + + IOTupleType dataTuple() + { + // tuple with additionalVariables + return IOTupleType( &solution_, 0 ); + } + //! return reference to discrete space DiscreteSpaceType & space() { return space_; } /*@LST0E@*/ @@ -453,11 +464,9 @@ public: } //! default time loop implementation, overload for changes - void operator()(double& averagedt, - double& mindt, double& maxdt, size_t& counter, - int& total_newton_iterations, int& total_ils_iterations, - int& max_newton_iterations, int& max_ils_iterations) + SolverMonitorType solve( const int loop ) { + SolverMonitorType monitor; numbers_.resize( 0 ); // calculate grid width @@ -513,7 +522,6 @@ public: space_.adapt( polOrderVec ); #endif -#if WANT_ISTL || WANT_PETSC if (!invDgOperator_) { linDgOperator_ = new LinearOperatorType("dg operator", space_, space_ ); @@ -548,27 +556,22 @@ public: // if max iterations is negative set it to twice the spaces size if( maxIterFactor < 0 ) maxIterFactor = 2; -#if WANT_ISTL // linDgOperator_->print(std::cout); - invDgOperator_ = new InverseOperatorType(*linDgOperator_, reduction, absLimit ); + invDgOperator_ = new LinearInverseOperatorType(*linDgOperator_, reduction, absLimit ); (*invDgOperator_)(rhs_,solution_); - counter = invDgOperator_->iterations(); -#endif -#if WANT_PETSC + monitor.ils_iterations = invDgOperator_->iterations(); + /* invDgOperator_ = new InverseOperatorType(*linDgOperator_, reduction, absLimit, maxIterFactor * space_.size() ); (*invDgOperator_)(rhs_,solution_); - counter = invDgOperator_->iterations(); -#endif + monitor.ils_iterations = invDgOperator_->iterations(); + */ } -#elif HAVE_SOLVER_BENCH -#error -#endif // calculate new sigma Dune::Fem:: DGL2ProjectionImpl :: project( sigmaEstimateFunction_, sigmaDiscreteFunction_ ); //Dune::Fem::DGL2ProjectionImpl :: project( problem(), solution_ ); - return ; + return monitor; } @@ -597,14 +600,14 @@ public: runFile_ << std::endl; Dune::Fem::DGNorm< GridPartType > dgnorm( gridPart_ ); - const double dgerror = dgnorm.distance( ugrid, solution_ ); + const double dgerror = 0; //dgnorm.distance( ugrid, solution_ ); Dune::Fem::H1Norm< GridPartType > sigmanorm( gridPart_ ); typedef SigmaLocalFunction<SigmaLocal<DiscreteFunctionType, DgType> > SigmaLocalFunctionType; SigmaLocalFunctionType sigmaLocalFunction( solution_, sigmaDiscreteFunction_, sigmaLocalEstimate_ ); Dune::Fem::LocalFunctionAdapter<SigmaLocalFunctionType> sigma( "sigma function", sigmaLocalFunction, gridPart_, space_.order() ); - const double sigmaerror = sigmanorm.distance( ugrid, sigma ); + const double sigmaerror = 0;//sigmanorm.distance( ugrid, sigma ); // store values std::vector<double> errors; @@ -613,7 +616,7 @@ public: errors.push_back( sigmaerror ); // submit error to the FEM EOC calculator - Dune::FemEoc :: setErrors(eocId_, errors); + Dune::Fem::FemEoc :: setErrors(eocId_, errors); delete invDgOperator_; invDgOperator_ = 0; @@ -628,21 +631,22 @@ public: // resize container polOrderContainer_.resize(); - const double error = estimator_.estimate( problem() ); + const double error = 0.0;//estimator_.estimate( problem() ); std::cout << "ESTIMATE: " << error << std::endl; typedef typename DiscreteSpaceType::IteratorType IteratorType; const IteratorType end = space_.end(); for( IteratorType it = space_.begin(); it != end; ++it ) { const typename IteratorType::Entity &entity = *it; - polOrderContainer_[entity].value() = - estimator_.newOrder( 0.98*tolerance, entity ); + //polOrderContainer_[entity].value() = + // estimator_.newOrder( 0.98*tolerance, entity ); } - return (error < std::abs(tolerance) ? false : estimator_.mark( 0.98 * tolerance)); + return false ; + //return (error < std::abs(tolerance) ? false : estimator_.mark( 0.98 * tolerance)); } void closure() { - estimator_.closure(); + //estimator_.closure(); } const InitialDataType& problem() const { assert( problem_ ); return *problem_; } @@ -664,10 +668,10 @@ public: ModelType* model_; FluxType convectionFlux_; DgType dgOperator_; - InverseOperatorType *invDgOperator_; -#if WANT_ISTL || WANT_PETSC + + LinearInverseOperatorType *invDgOperator_; LinearOperatorType *linDgOperator_; -#endif + DiscreteSpaceType &space_; // the discrete function space // the solution DiscreteFunctionType solution_, rhs_; @@ -677,8 +681,8 @@ public: SigmaLocal<DiscreteFunctionType, DgType> sigmaLocalEstimate_; SigmaEstimateFunction sigmaEstimateFunction_; - EstimatorType estimator_; - EstimateDataType estimateData_; + //EstimatorType estimator_; + //EstimateDataType estimateData_; IOTupleType ioTuple_; PolOrderContainer polOrderContainer_; -- GitLab