Commit 118d9bce authored by Lukas Riedel's avatar Lukas Riedel

Merge branch '43-add-options-for-altering-dg-formulation-in-local-operator' into 'master'

Resolve "add options for altering DG formulation in local operator"

Closes #43 and #41

See merge request !33

(cherry picked from commit dac2a4e1)

d760a799 Add new options for symmetry/penalty in local operator
6cdbdb13 Added option to change upwinding in local operator
99db5435 Merge branch 'bugix/conductivity-in-dirichlet-bc' into feature/local-operator-schemes
57441a3a Consider upwinding schemes in Dirichlet BC
6432d739 softened vanGenuchten parameter limits
7d47d613 Fix an error in the DG skeleton flux term
9128001f Add CMake option to control DG method with the config file
fe7a21a4 Finalize DG scheme options in local operator
5eb13c57 Added docs for experimental DG keys
047b6016 Moved experimental DG parmeters to the end of the parameter list
e09f0b28 Merge branch 'feature/41-enable-vtk-vertex-plotting' into 'master'
5576913a Set default upwinding method to 'none'
ad0ef464 Apply CPP definition for experimental features only to main dorie exe
678a9a75 Add section on experimental features to Readme
parent 380e9be6
......@@ -11,6 +11,12 @@ if(CMAKE_BUILD_TYPE_UPPER MATCHES DEBUG)
# option to change DG scheme via config file
"Enable experimental DG settings through the config file"
if(NOT (dune-common_DIR OR dune-common_ROOT OR
"${CMAKE_PREFIX_PATH}" MATCHES ".*dune-common.*"))
......@@ -143,6 +143,15 @@ If you installed [Anaconda](
**Installing DUNE and DORiE via `make install` into your usual work environment is strongly discouraged!**
### Experimental Features
The local operator implementing Richards equation's discretization supports
multiple scheme settings. Setting these via the config file is disabled by
default. You can enable this feature by reconfiguring DORiE with the CMake flag
`-DEXPERIMENTAL_DG_FEATURES=On`, and rebuilding it.
The configuration settings in the section `[dg.experimental]` will then override
the default settings.
## Recommended Third-Party Software
......@@ -412,4 +412,41 @@ adding an empty line, make text **bold** or ``monospaced``.
<category name="dg.experimental">
<parameter name="method">
<definition> DG discretization method for skeleton terms.
**SIPG:** Symmetric Interior Penalty
**NIPG:** Non-Symmetric Interior Penalty
**OOB:** Oden, Babuska, Baumann: no penalty term
**IIP:** Incomplete Interior Penalty: no symmetry term
<values> SIPG, NIPG, OOB, IIP </values>
<suggestion> SIPG </suggestion>
<comment> Experimental settings are enabled by the appropriate CMake flag.
<parameter name="upwinding">
<definition> Upwinding method for skeleton terms.
**semiUpwind:** Apply upwinding to conductivity factor (only).
**fullUpwind:** Apply upwinding on numeric flux and conductivity.
<values> none, semiUpwind, fullUpwind </values>
<suggestion> none </suggestion>
<parameter name="weights">
<definition> Apply harmonic weighting to skeleton term contributions.
<values> true, false </values>
<suggestion> true </suggestion>
......@@ -3,4 +3,9 @@ add_subdirectory(solver)
dune_target_link_libraries(dorie dorie-impl ${DUNE_LIBS})
\ No newline at end of file
dune_target_link_libraries(dorie dorie-impl ${DUNE_LIBS})
# enable setting operator scheme from config file
target_compile_definitions("dorie" PUBLIC -DEXPERIMENTAL_DG_FEATURES)
\ No newline at end of file
......@@ -42,7 +42,7 @@ private:
/// Adaptivity GFS
using AGFS = typename AGFSHelper::Type;
/// Error estimator local operator
using ESTLOP = Dune::Dorie::FluxErrorEstimator<Traits,Param,Boundary>;
using ESTLOP = Dune::Dorie::Operator::FluxErrorEstimator<Traits,Param,Boundary>;
/// Empty constraints container
using NoTrafo = Dune::PDELab::EmptyTransformation;
/// Solution vector type
......@@ -31,7 +31,20 @@ Simulation<Traits>::Simulation (Dune::MPIHelper& _helper, std::shared_ptr<Grid>
finitial = std::make_unique<FlowInitial>(inifile,*param,gv);
// --- Local Operators ---
// read experimental settings from inifile
namespace OP = Dune::Dorie::Operator;
const auto settings = OP::read_experimental_operator_settings(inifile);
const auto method = std::get<OP::RichardsDGMethod::Type>(settings);
const auto upwinding = std::get<OP::RichardsDGUpwinding::Type>(settings);
const auto weights = std::get<OP::RichardsDGWeights::Type>(settings);
slop = std::make_unique<SLOP>(inifile, *param, gv, *fboundary, *fsource,
method, upwinding, weights);
slop = std::make_unique<SLOP>(inifile,*param,gv,*fboundary,*fsource);
tlop = std::make_unique<TLOP>(inifile,*param,gv);
controller = std::make_unique<CalculationController>(inifile,*fboundary,helper);
......@@ -128,6 +141,7 @@ bool Simulation<Traits>::compute_time_step ()
const RF t = controller->getTime();
const RF dt = controller->getDT();
bool exception = false;
// solve in parallel
......@@ -140,7 +154,7 @@ bool Simulation<Traits>::compute_time_step ()
// solve sequentially
else {
osm_seq->apply(t, dt, *uold, *unew);
*uold = *unew;
This diff is collapsed.
......@@ -12,6 +12,7 @@
namespace Dune {
namespace Dorie {
namespace Operator {
/// Local operator for residual-based error estimation.
......@@ -48,18 +49,23 @@ namespace Dune {
const Parameter& param;
const Boundary& boundary;
const RF penalty_factor;
const int intorderadd;
const int quadrature_factor;
RF penalty_factor;
RF time;
FluxErrorEstimator (const Dune::ParameterTree& config,
const Parameter& param_, const Boundary& boundary_,
RichardsDGMethod::Type method_ = RichardsDGMethod::SIPG,
int intorderadd_ = 2, int quadrature_factor_ = 2)
: param(param_), boundary(boundary_),
intorderadd(intorderadd_), quadrature_factor(quadrature_factor_),
intorderadd(intorderadd_), quadrature_factor(quadrature_factor_)
{ }
if (method_ == RichardsDGMethod::OOB)
penalty_factor = 0.0;
/// skeleton integral depending on test and ansatz functions
/** each face is only visited ONCE!
......@@ -330,7 +336,8 @@ namespace Dune {
} // namespace Operator
} // namespace Dorie
} // namespace Dune
\ No newline at end of file
......@@ -22,8 +22,8 @@ namespace Dune {
explicit MualemVanGenuchten(const ParameterTree& fieldConfig_, const Dune::MPIHelper& helper_,
Interpolator& interpolator_, H5File& h5file_, const int verbose_)
: PB(fieldConfig_, "vanGenuchten", parameterArray, helper_, interpolator_, h5file_, verbose_)
, thetaR("theta_r", 0.0, 1.0), thetaS("theta_s", 0.0, 1.0), alpha("alpha", -10.0, 0.0)
, n("n", 1.0, 100.0), tau("tau", -100.0, 0.0), k0("k0", 0.0, 1.0)
, thetaR("theta_r", 0.0, 1.0), thetaS("theta_s", 0.0, 1.0), alpha("alpha", -20.0, 0.0)
, n("n", 1.0, 100.0), tau("tau", -100.0, 1.0), k0("k0", 0.0, 1.0)
parameterArray.push_back(& thetaR);
parameterArray.push_back(& thetaS);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment