diff --git a/dune/fem-dg/examples/advdiff/algorithmcreator.hh b/dune/fem-dg/examples/advdiff/algorithmcreator.hh index 709cd27b5396d89e9a53440093efd00c16090389..313ec4c060ea6804d88bce344e8d5c18f465a733 100644 --- a/dune/fem-dg/examples/advdiff/algorithmcreator.hh +++ b/dune/fem-dg/examples/advdiff/algorithmcreator.hh @@ -60,10 +60,8 @@ namespace Fem AdvectionLimiter::Enum::unlimited, Matrix::Enum::matrixfree, AdvectionFlux::Enum::upwind, - PrimalDiffusionFlux::Enum::cdg2 > AC; - // Local DG approach - // LocalDiffusionFlux::Enum::general, - // Formulation::Enum::local > AC; + DiffusionFlux::Enum::primal > AC; + // DiffusionFlux::Enum::local > AC; typedef typename AC::GridType GridType; typedef typename AC::GridParts HostGridPartType; diff --git a/dune/fem-dg/examples/advdiff/test/parameter_cmake b/dune/fem-dg/examples/advdiff/test/parameter_cmake index 07e1ac6f94eb32ba614356ea77cf751a3dbc0aff..fa3aad7a957c8299b9cb9f67d36101cb08b603fa 100644 --- a/dune/fem-dg/examples/advdiff/test/parameter_cmake +++ b/dune/fem-dg/examples/advdiff/test/parameter_cmake @@ -45,6 +45,6 @@ fem.io.macroGridFile_3d: ../../grids/unitcube3.dgf # SOLVER #------- dgdiffusionflux.upwind: -1 -0.001 -dgdiffusionflux.method: LDG +#dgdiffusionflux.method: LDG femdg.stepper.maxtimestep: 0.5 paramfile: ../../parameter/paramSolver diff --git a/dune/fem-dg/examples/incompnavierstokes/algorithmcreator.hh b/dune/fem-dg/examples/incompnavierstokes/algorithmcreator.hh index 9d824444446d11897eea36c6136559a5cfb0d640..a39819e93c40194aca98067b7a28b4e32f359780 100644 --- a/dune/fem-dg/examples/incompnavierstokes/algorithmcreator.hh +++ b/dune/fem-dg/examples/incompnavierstokes/algorithmcreator.hh @@ -72,7 +72,7 @@ namespace Fem AdvectionLimiter::Enum::unlimited, Matrix::Enum::assembled, AdvectionFlux::Enum::none, - PrimalDiffusionFlux::Enum::general > AC; + DiffusionFlux::Enum::primal > AC; struct SubPoissonAlgorithmCreator @@ -239,7 +239,7 @@ namespace Fem AdvectionLimiter::Enum::unlimited, Matrix::Enum::matrixfree, AdvectionFlux::Enum::llf, - PrimalDiffusionFlux::Enum::general > AC; + DiffusionFlux::Enum::primal > AC; typedef typename AC::GridType GridType; typedef typename AC::GridParts HostGridPartType; diff --git a/dune/fem-dg/examples/navierstokes/algorithmcreator.hh b/dune/fem-dg/examples/navierstokes/algorithmcreator.hh index 813744030256ceae624b568c875f551a8f7de3e6..a986b8a259514966d7d50ff91930eb7c242b6626 100644 --- a/dune/fem-dg/examples/navierstokes/algorithmcreator.hh +++ b/dune/fem-dg/examples/navierstokes/algorithmcreator.hh @@ -63,10 +63,7 @@ namespace Fem AdvectionLimiter::Enum::unlimited, Matrix::Enum::matrixfree, AdvectionFlux::Enum::llf, - PrimalDiffusionFlux::Enum::general> AC; - // Local DG approach - // LocalDiffusionFlux::Enum::ldg, - // Formulation::Enum::local > AC; + DiffusionFlux::Enum::primal > AC; typedef typename AC::GridType GridType; typedef typename AC::GridParts HostGridPartType; diff --git a/dune/fem-dg/examples/poisson/algorithmcreator.hh b/dune/fem-dg/examples/poisson/algorithmcreator.hh index 3701ac4876da8fbd858782e61943f672c8eec1b4..067c119ad5dcdb541e4f1d5b9d904ec0c6edc8c7 100644 --- a/dune/fem-dg/examples/poisson/algorithmcreator.hh +++ b/dune/fem-dg/examples/poisson/algorithmcreator.hh @@ -58,7 +58,7 @@ namespace Fem AdvectionLimiter::Enum::unlimited, Matrix::Enum::assembled, AdvectionFlux::Enum::upwind, - PrimalDiffusionFlux::Enum::general > AC; + DiffusionFlux::Enum::primal > AC; typedef typename AC::GridType GridType; typedef typename AC::GridParts HostGridPartType; diff --git a/dune/fem-dg/examples/stokes/algorithmcreator.hh b/dune/fem-dg/examples/stokes/algorithmcreator.hh index 8ab68af81f7a805db02b6378af6748f6ae659dc4..604f9a0508f80649ee895381ecb4b8ffc70bb0e2 100644 --- a/dune/fem-dg/examples/stokes/algorithmcreator.hh +++ b/dune/fem-dg/examples/stokes/algorithmcreator.hh @@ -60,7 +60,7 @@ namespace Fem static const AdvectionLimiter::Enum advLimiterEnum = AdvectionLimiter::Enum::unlimited; static const Matrix::Enum matrixEnum = Matrix::Enum::assembled; static const AdvectionFlux::Enum advFluxEnum = AdvectionFlux::Enum::none; - static const PrimalDiffusionFlux::Enum diffFluxEnum = PrimalDiffusionFlux::Enum::general; + static const PrimalDiffusionFlux::Enum diffFluxEnum = DiffusionFlux::Enum::primal; // for Taylorhood (P2,P1) equal one static const int pressureOrderReduction = 1; diff --git a/dune/fem-dg/misc/algorithmcreatorselector.hh b/dune/fem-dg/misc/algorithmcreatorselector.hh index 4101304086b79d46d901dbd934c15503c4df0d73..5090fa566ba38fd7d999b4ab74b27aea648d6521 100644 --- a/dune/fem-dg/misc/algorithmcreatorselector.hh +++ b/dune/fem-dg/misc/algorithmcreatorselector.hh @@ -204,21 +204,6 @@ namespace Fem }; } - /** - * \brief Namespace containing an Enum class to describe the formulation - */ - namespace Formulation - { - /** - * \ingroup FemDGParameter - */ - enum class Enum - { - primal, - local - }; - } - /////////////////////////////////////////////////////////////////////////// // GridPartSelector /////////////////////////////////////////////////////////////////////////// @@ -573,21 +558,21 @@ namespace Fem }; template< class ModelImp, class DiscreteFunctionSpaceImp, - PrimalDiffusionFlux::Enum diffFluxId, LocalDiffusionFlux::Enum localDiffFluxId, Formulation::Enum form > + DiffusionFlux::Enum diffFluxId, Formulation::Enum form > struct DiffusionFluxSelector; - template< class ModelImp, class DiscreteFunctionSpaceImp, PrimalDiffusionFlux::Enum diffFluxId, LocalDiffusionFlux::Enum localDiffFluxId > - struct DiffusionFluxSelector< ModelImp, DiscreteFunctionSpaceImp, diffFluxId, localDiffFluxId, Formulation::Enum::primal > + template< class ModelImp, class DiscreteFunctionSpaceImp, DiffusionFlux::Enum diffFluxId > + struct DiffusionFluxSelector< ModelImp, DiscreteFunctionSpaceImp, diffFluxId, Formulation::Enum::local > { - typedef DGPrimalDiffusionFlux< DiscreteFunctionSpaceImp, ModelImp, diffFluxId > type; + typedef DGLocalDiffusionFlux< DiscreteFunctionSpaceImp, ModelImp, diffFluxId > type; }; - template< class ModelImp, class DiscreteFunctionSpaceImp, PrimalDiffusionFlux::Enum diffFluxId, LocalDiffusionFlux::Enum localDiffFluxId > - struct DiffusionFluxSelector< ModelImp, DiscreteFunctionSpaceImp, diffFluxId, localDiffFluxId, Formulation::Enum::local > + template< class ModelImp, class DiscreteFunctionSpaceImp, DiffusionFlux::Enum diffFluxId > + struct DiffusionFluxSelector< ModelImp, DiscreteFunctionSpaceImp, diffFluxId, Formulation::Enum::primal > { - typedef DGLocalDiffusionFlux< DiscreteFunctionSpaceImp, ModelImp, localDiffFluxId > type; + typedef DGPrimalDiffusionFlux< DiscreteFunctionSpaceImp, ModelImp, diffFluxId > type; }; -} -} +} // end namespace Fem +} // end namespace Dune #endif diff --git a/dune/fem-dg/misc/configurator.hh b/dune/fem-dg/misc/configurator.hh index de3ec9b9b52c6310a71a48380ab9e191d4e939e5..1b56df74a1f0566aa0e3947639710e7e3b9e664e 100644 --- a/dune/fem-dg/misc/configurator.hh +++ b/dune/fem-dg/misc/configurator.hh @@ -26,7 +26,7 @@ namespace Fem * \tparam AdvectionLimiter::Enum enum defining the limiting of the advection operator * \tparam Matrix::Enum enum describing whether to assemble or not * \tparam AdvectionFlux::Enum enum describing the chosen numerical advection flux, - \tparam PrimalDiffusionFlux::Enum enum describing the chosen primal numerical diffusion flux + \tparam DiffusionFlux::Enum enum describing the chosen primal numerical diffusion flux */ template< class GridImp, Galerkin::Enum dgId, @@ -36,9 +36,7 @@ namespace Fem AdvectionLimiter::Enum advLimitId, Matrix::Enum matrixId, AdvectionFlux::Enum advFluxId, - PrimalDiffusionFlux::Enum diffFluxId, - LocalDiffusionFlux::Enum localDiffFluxId = LocalDiffusionFlux::Enum::general, - Formulation::Enum formId = Formulation::Enum::primal > + DiffusionFlux::Enum diffFluxId> class AlgorithmConfigurator { template< class AnalyticalTraitsImp, class NewModelImp > @@ -52,6 +50,9 @@ namespace Fem public: typedef GridImp GridType; + // select formulation depending on chosen diffusion flux + static const Formulation::Enum formId = FormulationSelector< diffFluxId > :: formId ; + using GridParts = typename GridPartSelector< GridType, dgId, adap >::type; template< int dimRange > @@ -66,21 +67,20 @@ namespace Fem template< class ModelImp, AdvectionFlux::Enum id = advFluxId > using AdvectionFluxes = DGAdvectionFlux< ModelImp, id >; - template< class ModelImp, class DFSpace, PrimalDiffusionFlux::Enum id = diffFluxId, LocalDiffusionFlux::Enum did = localDiffFluxId > - using DiffusionFluxes = typename DiffusionFluxSelector< ModelImp, DFSpace, id, did, formId >::type; + template< class ModelImp, class DFSpace, DiffusionFlux::Enum id = diffFluxId > + using DiffusionFluxes = typename DiffusionFluxSelector< ModelImp, DFSpace, id, formId >::type; template< class DomainDFSpace, class RangeDFSpace, int polOrd, class AnalyticalTraitsImp, AdvectionFlux::Enum advId = advFluxId, - PrimalDiffusionFlux::Enum diffId = diffFluxId, - LocalDiffusionFlux::Enum localDiffId = localDiffFluxId > + DiffusionFlux::Enum diffId = diffFluxId > using DefaultAssembTraits = DefaultAssemblerTraits< polOrd, AnalyticalTraitsImp, typename SolverSelector< solverId, false, DomainDFSpace, RangeDFSpace >::LinearOperatorType, AdvectionFluxes< typename AnalyticalTraitsImp::ModelType, advId >, - DiffusionFluxes< typename AnalyticalTraitsImp::ModelType, DomainDFSpace, diffId, localDiffId >, + DiffusionFluxes< typename AnalyticalTraitsImp::ModelType, DomainDFSpace, diffId >, DiscreteFunctions< DomainDFSpace >, DiscreteFunctions< RangeDFSpace > >; template< class DomainDFSpace, @@ -89,13 +89,12 @@ namespace Fem class ExtraParameterTupleImp = std::tuple<>, class AdaptationIndicatorFunctionSpaceImp = typename DomainDFSpace::FunctionSpaceType, AdvectionFlux::Enum advId = advFluxId, - PrimalDiffusionFlux::Enum diffId = diffFluxId, - LocalDiffusionFlux::Enum localDiffId = localDiffFluxId > + DiffusionFlux::Enum diffId = diffFluxId> using DefaultOpTraits = DefaultOperatorTraits< polOrd, AnalyticalTraitsImp, DiscreteFunctions< DomainDFSpace >, AdvectionFluxes< typename AnalyticalTraitsImp::ModelType, advId >, - DiffusionFluxes< typename AnalyticalTraitsImp::ModelType, DomainDFSpace, diffId, localDiffId >, + DiffusionFluxes< typename AnalyticalTraitsImp::ModelType, DomainDFSpace, diffId >, ExtraParameterTupleImp, AdaptationIndicatorFunctionSpaceImp >; diff --git a/dune/fem-dg/operator/fluxes/diffusion/dgprimalfluxes.hh b/dune/fem-dg/operator/fluxes/diffusion/dgprimalfluxes.hh index f2e57c8821a8410bfb2951dbd6d966e56a54265e..bf99f312f48badb70ce567b53dc002435dc5272d 100644 --- a/dune/fem-dg/operator/fluxes/diffusion/dgprimalfluxes.hh +++ b/dune/fem-dg/operator/fluxes/diffusion/dgprimalfluxes.hh @@ -169,7 +169,7 @@ namespace Fem const EnumType staticMethod ) : BaseType( model, true, parameters ), gridPart_( gridPart ), - method_( staticMethod == EnumType::general ? parameters.getMethod() : staticMethod ), + method_( staticMethod == EnumType::primal ? parameters.getMethod() : staticMethod ), penalty_( parameter().penalty() ), nipgFactor_( (method_ == EnumType::nipg) || (method_ == EnumType::bo) @@ -1205,7 +1205,7 @@ namespace Fem ExtendedDGPrimalDiffusionFlux( GridPartType& gridPart, const Model& model, const ParameterType& parameters = ParameterType() ) - : BaseType( gridPart, model, parameters, BaseType::EnumType::general ) + : BaseType( gridPart, model, parameters, BaseType::EnumType::primal ) { } //! copy constructor (needed for thread parallel programs) diff --git a/dune/fem-dg/operator/fluxes/diffusion/fluxes.hh b/dune/fem-dg/operator/fluxes/diffusion/fluxes.hh index 5f348f518194b5af51e5c6ed9e0e34b0e1db6fed..fd3fd4f5e644ee8396678fbd78b73d618202865d 100644 --- a/dune/fem-dg/operator/fluxes/diffusion/fluxes.hh +++ b/dune/fem-dg/operator/fluxes/diffusion/fluxes.hh @@ -15,7 +15,7 @@ namespace Fem * via an enum given in DiffusionFlux::Enum. * * \warning NIPG and BO are not implemented since these methods are not so - * interesting, use PrimalDiffusionFlux::Enum::general for this + * interesting, use PrimalDiffusionFlux::Enum::primal for this */ template <class DiscreteFunctionSpaceImp, class Model, @@ -30,7 +30,7 @@ namespace Fem */ template <class DiscreteFunctionSpaceImp, class Model> - class DGPrimalDiffusionFlux< DiscreteFunctionSpaceImp, Model, PrimalDiffusionFlux::Enum::general > + class DGPrimalDiffusionFlux< DiscreteFunctionSpaceImp, Model, PrimalDiffusionFlux::Enum::primal > : public DGPrimalDiffusionFluxImpl< DiscreteFunctionSpaceImp, Model, DGPrimalDiffusionFluxParameters > { typedef DGPrimalDiffusionFluxImpl< DiscreteFunctionSpaceImp, Model, DGPrimalDiffusionFluxParameters > @@ -47,7 +47,7 @@ namespace Fem DGPrimalDiffusionFlux( GridPartType& gridPart, const Model& model, const ParameterType& parameters = ParameterType() ) - : BaseType( gridPart, model, parameters, PrimalDiffusionFlux::Enum::general ) + : BaseType( gridPart, model, parameters, PrimalDiffusionFlux::Enum::primal ) { } }; @@ -264,8 +264,8 @@ namespace Fem * \brief constructor reading parameters */ DGLocalDiffusionFlux( GridPartType& gridPart, - const Model& model, - const ParameterType& parameters = ParameterType() ) + const Model& model, + const ParameterType& parameters = ParameterType() ) : BaseType( gridPart, model, parameters, LocalDiffusionFlux::Enum::ldg ) { } @@ -273,7 +273,7 @@ namespace Fem template <class DiscreteFunctionSpaceImp, class Model> - class DGLocalDiffusionFlux< DiscreteFunctionSpaceImp, Model, LocalDiffusionFlux::Enum::general > + class DGLocalDiffusionFlux< DiscreteFunctionSpaceImp, Model, LocalDiffusionFlux::Enum::local > : public LDGDiffusionFluxImpl< DiscreteFunctionSpaceImp, Model, DGLocalDiffusionFluxParameters > { typedef LDGDiffusionFluxImpl< DiscreteFunctionSpaceImp, Model, DGLocalDiffusionFluxParameters > @@ -290,7 +290,7 @@ namespace Fem DGLocalDiffusionFlux( GridPartType& gridPart, const Model& model, const ParameterType& parameters = ParameterType() ) - : BaseType( gridPart, model, parameters, LocalDiffusionFlux::Enum::general ) + : BaseType( gridPart, model, parameters, LocalDiffusionFlux::Enum::local ) { } }; diff --git a/dune/fem-dg/operator/fluxes/diffusion/ldgflux.hh b/dune/fem-dg/operator/fluxes/diffusion/ldgflux.hh index a6b0a2ca515f41ee941b1a2b9e982fc1b398dd91..7ce14f62d5f9f276e8a944a3987e7b8cb20cbd22 100644 --- a/dune/fem-dg/operator/fluxes/diffusion/ldgflux.hh +++ b/dune/fem-dg/operator/fluxes/diffusion/ldgflux.hh @@ -75,7 +75,7 @@ namespace Fem const ParameterType& param, const EnumType staticMethod ) : BaseType( gridPart, mod, param ), - method_( staticMethod == EnumType::general ? param.getMethod() : staticMethod ), + method_( staticMethod == EnumType::local ? param.getMethod() : staticMethod ), penalty_( parameter().penalty() ), // Set CFL number for penalty term (compare diffusion in first pass) penaltyTerm_( std::abs( penalty_ ) > 0 ) diff --git a/dune/fem-dg/operator/fluxes/diffusion/parameters.hh b/dune/fem-dg/operator/fluxes/diffusion/parameters.hh index b2b53abd47a798607f6fa45d49275886e2754e7e..95f3835b57f9970713d915ba8e376c7057ac262f 100644 --- a/dune/fem-dg/operator/fluxes/diffusion/parameters.hh +++ b/dune/fem-dg/operator/fluxes/diffusion/parameters.hh @@ -9,34 +9,64 @@ namespace Fem { /** - * \brief Namespace containing all parameters to select a primal diffusion flux. + * \brief Namespace containing an Enum class to describe the formulation + * \note Selection of operators reflecting the formulation see FormulationSelector */ - namespace PrimalDiffusionFlux + namespace Formulation { /** - * \brief Enum of all known primal diffusion flux implementations. + * \ingroup FemDGParameter + */ + enum class Enum + { + primal, + local + }; + } + + /** + * \brief Namespace containing all parameters to select a DG method available in primal formulation + */ + namespace DiffusionFlux + { + /** + * \brief Enum of all available diffusion flux implementations (priaml and local formulation). * * \ingroup FemDGParameter */ enum class Enum { - //! CDG 2 (Compact Discontinuous Galerkin 2) flux. + //! BR2 (Bassi-Rebay 2) flux (local formulation). + br1, + //! LDG (Local Discontinuous Galerkin) flux (local formulation). + ldg, + //! CDG 2 (Compact Discontinuous Galerkin 2) flux (primal formulation). cdg2, - //! CDG (Compact Discontinuous Galerkin) flux. + //! CDG (Compact Discontinuous Galerkin) flux (primal formulation). cdg, - //! BR2 (Bassi-Rebay 2) flux. + //! BR2 (Bassi-Rebay 2) flux (primal formulation). br2, - //! IP (Interior Penalty) flux. + //! IP (Interior Penalty) flux (primal formulation). ip, - //! NIPG (Non-symmetric Interior Penalty) flux. + //! NIPG (Non-symmetric Interior Penalty) flux (primal formulation). nipg, - //! BO (Baumann-Oden) flux. + //! BO (Baumann-Oden) flux (primal formulation). bo, - //! general flux: Parameter selection is done via parameter file! - general, + //! general flux primal formulation: Parameter selection is done via parameter file! + primal, + //! general flux local formulation: Parameter selection is done via parameter file! + local, //! no diffusion (advection only) flux. none }; + } + + /** + * \brief Namespace containing all parameters to select a DG method available in primal formulation + */ + namespace PrimalDiffusionFlux + { + using namespace DiffusionFlux; //! Contains all known enums for primal diffusion fluxes which can be chosen via parameter file. const Enum _enums[] = { Enum::cdg2, Enum::cdg, Enum::br2, Enum::ip, Enum::nipg, Enum::bo }; @@ -49,20 +79,7 @@ namespace Fem namespace LocalDiffusionFlux { - /** - * \brief Enum of all known local DG diffusion flux implementations. - * - * \ingroup FemDGParameter - */ - enum class Enum - { - //! Bassi-Rebay flux. - br1, - //! Local DG flux. - ldg, - //! general flux: Parameter selection is done via parameter file! - general - }; + using namespace DiffusionFlux; //! Contains all known enums for dual diffusion fluxes which can be chosen via parameter file. const Enum _enums[] = { Enum::br1, Enum::ldg }; @@ -267,6 +284,32 @@ namespace Fem }; + //! formulation selector, either primal or local depending on the flux implementation + template <DiffusionFlux::Enum flux> + struct FormulationSelector + { + static const Formulation::Enum formId = Formulation::Enum::primal; + }; + + template <> + struct FormulationSelector< DiffusionFlux::Enum::local > + { + static const Formulation::Enum formId = Formulation::Enum::local; + }; + + template <> + struct FormulationSelector< DiffusionFlux::Enum::ldg > + { + static const Formulation::Enum formId = Formulation::Enum::local; + }; + + template <> + struct FormulationSelector< DiffusionFlux::Enum::br1 > + { + static const Formulation::Enum formId = Formulation::Enum::local; + }; + + } // end namespace } // end namespace #endif