29#ifndef DUMUX_RICHARDS_ANALYTICALPROBLEM_HH
30#define DUMUX_RICHARDS_ANALYTICALPROBLEM_HH
33#include <dune/geometry/quadraturerules.hh>
34#include <dune/grid/yaspgrid.hh>
56template <
class TypeTag>
57class RichardsAnalyticalProblem;
71template<
class TypeTag>
72struct Grid<TypeTag, TTag::RichardsAnalytical> {
using type = Dune::YaspGrid<2>; };
75template<
class TypeTag>
79template<
class TypeTag>
103template <
class TypeTag>
117 pwIdx = Indices::pressureIdx,
118 bothPhases = Indices::bothPhases,
121 static const int dimWorld = GridView::dimensionworld;
122 static const int dim = GridView::dimension;
123 using Element =
typename GridView::template Codim<0>::Entity;
124 using GlobalPosition =
typename Element::Geometry::GlobalCoordinate;
125 using Geometry =
typename GridView::template Codim<0>::Entity::Geometry;
132 name_ = getParam<std::string>(
"Problem.Name");
158 {
return 273.15 + 10; }
182 NumEqVector values(0.0);
183 const Scalar time = time_;
184 const Scalar pwTop = 98942.8;
185 const Scalar pwBottom = 95641.1;
192 values = (pow(tanh(globalPos[1]*5.0+time*(1.0/1.0E1)-1.5E1),2.0)*(1.0/1.0E1)
193 -1.0/1.0E1)*(pwBottom*(1.0/2.0)-pwTop*(1.0/2.0))*4.0E-8-((pow(tanh(globalPos[1]
194 *5.0+time*(1.0/1.0E1)-1.5E1),2.0)*5.0-5.0)*(pwBottom*(1.0/2.0)-pwTop*(1.0/2.0))-1.0E3)
195 *(pow(tanh(globalPos[1]*5.0+time*(1.0/1.0E1)-1.5E1),2.0)*5.0-5.0)*(pwBottom
196 *(1.0/2.0)-pwTop*(1.0/2.0))*5.0E-16+tanh(globalPos[1]*5.0+time*(1.0/1.0E1)-1.5E1)
197 *(pow(tanh(globalPos[1]*5.0+time*(1.0/1.0E1)-1.5E1),2.0)*5.0-5.0)*(pwBottom
198 *(1.0/2.0)-pwTop*(1.0/2.0))*(pwBottom*5.0E-16-(tanh(globalPos[1]*5.0+time*(1.0/1.0E1)
199 -1.5E1)+1.0)*(pwBottom*(1.0/2.0)-pwTop*(1.0/2.0))*5.0E-16+4.99995E-6)*1.0E1;
218 BoundaryTypes bcTypes;
219 if (onLowerBoundary_(globalPos) ||
220 onUpperBoundary_(globalPos))
222 bcTypes.setAllDirichlet();
225 bcTypes.setAllNeumann();
238 PrimaryVariables values(0.0);
239 values.setState(bothPhases);
240 const Scalar time = time_;
241 const Scalar pwTop = 98942.8;
242 const Scalar pwBottom = 95641.1;
245 + 0.5 * (tanh( (5.0 * globalPos[1]) - 15.0 + time/10.0) + 1.0) * (pwTop - pwBottom);
261 NumEqVector values(0.0);
280 PrimaryVariables values(0.0);
281 values.setState(bothPhases);
299 const GlobalPosition &globalPos)
const
302 const Scalar pwTop = 98942.8;
303 const Scalar pwBottom = 95641.1;
306 + 0.5 * (tanh( (5.0 * globalPos[1]) - 15.0 + time/10.0) + 1.0) * (pwTop - pwBottom);
323 const unsigned int qOrder = 4;
324 Scalar l2error = 0.0;
325 Scalar l2analytic = 0.0;
326 const Scalar time = time_;
328 for (
const auto& element :elements(this->
gridGeometry().gridView()))
330 int eIdx = this->
gridGeometry().elementMapper().index(element);
332 Scalar numericalSolution = curSol[eIdx];
335 Geometry geometry = element.geometry();
336 Dune::GeometryType gt = geometry.type();
337 Dune::QuadratureRule<Scalar, dim> rule =
338 Dune::QuadratureRules<Scalar, dim>::rule(gt, qOrder);
340 for (
auto qIt = rule.begin(); qIt != rule.end(); ++qIt)
343 Dune::FieldVector<Scalar, dim> globalPos = geometry.global(qIt->position());
344 PrimaryVariables values(0.0);
347 l2error += (numericalSolution - values[0]) * (numericalSolution - values[0]) *
348 qIt->weight() * geometry.integrationElement(qIt->position());
349 l2analytic += values[0] * values[0] *
350 qIt->weight() * geometry.integrationElement(qIt->position());
354 return sqrt(l2error/l2analytic);
367 std::cout.precision(8);
368 std::cout <<
"L2 error for "
369 << std::setw(6) << this->
gridGeometry().gridView().size(0)
379 bool onLowerBoundary_(
const GlobalPosition &globalPos)
const
381 return globalPos[1] < this->
gridGeometry().bBoxMin()[1] + eps_;
385 bool onUpperBoundary_(
const GlobalPosition &globalPos)
const
387 return globalPos[1] > this->
gridGeometry().bBoxMax()[1] - eps_;
390 static constexpr Scalar eps_ = 3e-6;
Defines a type tag and some properties for models using the box scheme.
Properties for all models using cell-centered finite volume scheme with TPFA.
A much simpler (and thus potentially less buggy) version of pure water.
A liquid phase consisting of a single component.
make the local view function available whenever we use the grid geometry
Definition: adapt.hh:29
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition: propertysystem.hh:149
Base class for all finite-volume problems.
Definition: common/fvproblem.hh:50
const GridGeometry & gridGeometry() const
The finite volume grid geometry.
Definition: common/fvproblem.hh:588
The DUNE grid type.
Definition: common/properties.hh:57
Property to specify the type of a problem which has to be solved.
Definition: common/properties.hh:69
The type of the spatial parameters object.
Definition: common/properties.hh:221
Base class for all fully implicit porous media problems.
Definition: dumux/porousmediumflow/problem.hh:39
A one-dimensional infiltration problem with a smooth, given solution.
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:105
Scalar calculateL2Error(const SolutionVector &curSol)
Calculate the L2 error between the solution given by dirichletAtPos and the numerical approximation.
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:321
Scalar temperature() const
Returns the temperature [K] within a finite volume.
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:157
void setTime(Scalar time)
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:149
PrimaryVariables dirichletAtPos(const GlobalPosition &globalPos) const
Evaluates the boundary conditions for a Dirichlet boundary segment.
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:236
RichardsAnalyticalProblem(std::shared_ptr< const GridGeometry > gridGeometry)
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:128
NumEqVector neumannAtPos(const GlobalPosition &globalPos) const
Evaluates the boundary conditions for a Neumann boundary segment.
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:259
PrimaryVariables initialAtPos(const GlobalPosition &globalPos) const
Evaluates the initial values for a control volume.
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:278
void analyticalSolution(PrimaryVariables &values, const Scalar time, const GlobalPosition &globalPos) const
Evaluates the analytical solution.
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:297
Scalar nonWettingReferencePressure() const
Returns the reference pressure [Pa] of the non-wetting fluid phase within a finite volume.
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:166
NumEqVector sourceAtPos(const GlobalPosition &globalPos) const
Evaluates the source values for a control volume.
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:180
void writeOutput(const SolutionVector &curSol)
Writes the relevant secondary variables of the current solution into an VTK output file.
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:361
BoundaryTypes boundaryTypesAtPos(const GlobalPosition &globalPos) const
Specifies which kind of boundary condition should be used for which equation on a given boundary segm...
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:216
const std::string name() const
The problem name.
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:146
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:65
std::tuple< Richards > InheritsFrom
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:65
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:66
std::tuple< RichardsAnalytical, BoxModel > InheritsFrom
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:66
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:67
std::tuple< RichardsAnalytical, CCTpfaModel > InheritsFrom
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:67
Dune::YaspGrid< 2 > type
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:72
GetPropType< TypeTag, Properties::Scalar > Scalar
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:83
GetPropType< TypeTag, Properties::GridGeometry > GridGeometry
Definition: test/porousmediumflow/richards/implicit/analytical/problem.hh:82
The spatial parameters for the RichardsAnalyticalProblem.
Definition: porousmediumflow/richards/implicit/analytical/spatialparams.hh:48
This model implements a variant of the Richards' equation for quasi-twophase flow.
Base class for all porous media problems.
Definition of the spatial parameters for the MaxwellStefan problem.