version 3.11-dev
Loading...
Searching...
No Matches
common/problem.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3//
4// SPDX-FileCopyrightText: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
12#ifndef DUMUX_COMMON_DEFAULT_PROBLEM_HH
13#define DUMUX_COMMON_DEFAULT_PROBLEM_HH
14
15#include <memory>
16
19#include <dumux/common/boundarytypes_.hh>
21
25
26namespace Dumux::Experimental {
27
37template<class TypeTag>
39{
40 using Implementation = GetPropType<TypeTag, Properties::Problem>;
41
42 using GridDiscretization = GetPropType<TypeTag, Properties::GridGeometry>;
43 using ElementDiscretization = typename GridDiscretization::LocalView;
44 using GridView = typename GridDiscretization::GridView;
45 using Element = typename GridView::template Codim<0>::Entity;
46 using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
47
51 using BoundaryTypes = Dumux::Experimental::BoundaryTypes<PrimaryVariables::size()>;
52
53public:
55 struct Traits
56 {
57 using Scalar = Problem::Scalar;
58 using PrimaryVariables = Problem::PrimaryVariables;
59 using NumEqVector = Problem::NumEqVector;
60 };
61
67 Problem(std::shared_ptr<const GridDiscretization> gridDiscretization, const std::string& paramGroup = "")
68 : gridDiscretization_(gridDiscretization)
69 , paramGroup_(paramGroup)
70 {
71 // set a default name for the problem
72 problemName_ = getParamFromGroup<std::string>(paramGroup, "Problem.Name", "sim");
73 }
74
82 const std::string& name() const
83 {
84 return problemName_;
85 }
86
92 void setName(const std::string& newName)
93 {
94 problemName_ = newName;
95 }
96
100 // \{
101
109 BoundaryTypes boundaryTypes(const ElementDiscretization& elemDisc,
110 const typename ElementDiscretization::BoundaryFace& boundaryFace) const
111 {
112 // forward it to the method which only takes the global coordinate
113 return asImp_().boundaryTypesAtPos(boundaryFace.center());
114 }
115
122 BoundaryTypes boundaryTypesAtPos(const GlobalPosition &globalPos) const
123 {
126 return BoundaryTypes{};
127 }
128
138 template<class ResidualVector, class ElementVariables, class BoundaryTypes>
139 void addFEBoundaryFluxIntegral(ResidualVector& residual,
140 const ElementDiscretization& elemDisc,
141 const ElementVariables& elemVars,
142 const typename ElementDiscretization::BoundaryFace& boundaryFace,
143 const BoundaryTypes& bcTypes) const
144 {
147 Dumux::Experimental::addFEBoundaryFluxIntegral(residual, asImp_(), elemDisc, elemVars, boundaryFace, bcTypes);
148 }
149
159 template<class ResidualVector, class ElementVariables, class BoundaryTypes>
160 void addFVBoundaryFluxIntegral(ResidualVector& residual,
161 const ElementDiscretization& elemDisc,
162 const ElementVariables& elemVars,
163 const typename ElementDiscretization::SubControlVolumeFace& scvf,
164 const BoundaryTypes& bcTypes) const
165 {
167 Dumux::Experimental::addFVBoundaryFluxIntegral(residual, asImp_(), elemDisc, elemVars, scvf, bcTypes);
168 }
169
170
185 template<class ElementVariables, class FaceIpData>
186 NumEqVector boundaryFlux(const ElementDiscretization& elemDisc,
187 const ElementVariables& elemVars,
188 const FaceIpData& faceIpData) const
189 {
190 // forward it to the interface with only the global position
191 return asImp_().boundaryFluxAtPos(faceIpData.global());
192 }
193
202 NumEqVector boundaryFluxAtPos(const GlobalPosition& globalPos) const
203 {
206 return NumEqVector(0.0);
207 }
208
224 template<class ElementVariables, class IpData>
225 NumEqVector source(const ElementDiscretization& elemDisc,
226 const ElementVariables& elemVars,
227 const IpData& ipData) const
228 {
229 return asImp_().sourceAtPos(ipData.global());
230 }
231
242 NumEqVector sourceAtPos(const GlobalPosition &globalPos) const
243 {
246 return NumEqVector(0.0);
247 }
248
253 template<class MatrixBlock, class Variables, class IpData>
254 void addSourceDerivatives(MatrixBlock& block,
255 const Element& element,
256 const ElementDiscretization& elemDisc,
257 const Variables& volVars,
258 const IpData& ipData) const {}
259
292 { return {}; }
293
295 [[deprecated("Use gridDiscretization() instead")]]
296 const GridDiscretization& gridGeometry() const
297 { return *gridDiscretization_; }
298
300 const GridDiscretization& gridDiscretization() const
301 { return *gridDiscretization_; }
302
304 const std::string& paramGroup() const
305 { return paramGroup_; }
306
307protected:
309 Implementation &asImp_()
310 { return *static_cast<Implementation *>(this); }
311
313 const Implementation &asImp_() const
314 { return *static_cast<const Implementation *>(this); }
315
316private:
318 std::shared_ptr<const GridDiscretization> gridDiscretization_;
319
321 std::string paramGroup_;
322
324 std::string problemName_;
325};
326
327} // end namespace Dumux::Experimental
328
329#endif
Free functions for adding boundary flux integral contributions to a residual vector.
void addFEBoundaryFluxIntegral(ResidualVector &residual, const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const typename ElementDiscretization::BoundaryFace &boundaryFace, const BoundaryTypes &bcTypes) const
Evaluates finite-element boundary flux integral contributions for a given boundary face.
Definition common/problem.hh:139
const std::string & paramGroup() const
The parameter group in which to retrieve runtime parameters.
Definition common/problem.hh:304
void addSourceDerivatives(MatrixBlock &block, const Element &element, const ElementDiscretization &elemDisc, const Variables &volVars, const IpData &ipData) const
Add source term derivative to the Jacobian.
Definition common/problem.hh:254
Implementation & asImp_()
Returns the implementation of the problem (i.e. static polymorphism).
Definition common/problem.hh:309
void addFVBoundaryFluxIntegral(ResidualVector &residual, const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const typename ElementDiscretization::SubControlVolumeFace &scvf, const BoundaryTypes &bcTypes) const
Evaluates finite-volume boundary flux integral contributions for a given scvf.
Definition common/problem.hh:160
const GridDiscretization & gridDiscretization() const
The grid discretization.
Definition common/problem.hh:300
const std::string & name() const
The problem name.
Definition common/problem.hh:82
EmptyPointSources pointSources() const
Return the point sources for this problem.
Definition common/problem.hh:291
NumEqVector boundaryFluxAtPos(const GlobalPosition &globalPos) const
Evaluate the boundary flux at a given position.
Definition common/problem.hh:202
BoundaryTypes boundaryTypes(const ElementDiscretization &elemDisc, const typename ElementDiscretization::BoundaryFace &boundaryFace) const
Specifies which kind of boundary condition should be used for which equation on a given boundary face...
Definition common/problem.hh:109
const Implementation & asImp_() const
Returns the implementation of the problem (i.e. static polymorphism).
Definition common/problem.hh:313
const GridDiscretization & gridGeometry() const
The grid discretization.
Definition common/problem.hh:296
NumEqVector source(const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const IpData &ipData) const
Evaluate the source term at a given interpolation point.
Definition common/problem.hh:225
void setName(const std::string &newName)
Set the problem name.
Definition common/problem.hh:92
NumEqVector boundaryFlux(const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const FaceIpData &faceIpData) const
Evaluate the boundary conditions for a neumann boundary segment.
Definition common/problem.hh:186
NumEqVector sourceAtPos(const GlobalPosition &globalPos) const
Evaluate the source term for all phases at a given position.
Definition common/problem.hh:242
Problem(std::shared_ptr< const GridDiscretization > gridDiscretization, const std::string &paramGroup="")
Constructor.
Definition common/problem.hh:67
BoundaryTypes boundaryTypesAtPos(const GlobalPosition &globalPos) const
Specifies which kind of boundary condition should be used for which equation on a given boundary segm...
Definition common/problem.hh:122
Class that represents the variables of a model. We assume that models are formulated on the basis of ...
Definition experimental/common/variables.hh:41
Defines all properties used in Dumux.
Concept for pure finite-element discretizations (no FV structure).
Definition concepts.hh:50
Concept for finite-volume discretizations.
Definition concepts.hh:26
Concept for hybrid finite-element/finite-volume discretizations.
Definition concepts.hh:39
Concepts for discretization types.
void addFVBoundaryFluxIntegral(ResidualVector &residual, const Problem &problem, const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const typename ElementDiscretization::SubControlVolumeFace &scvf, const BoundaryTypes &bcTypes)
Adds boundary flux contributions to the residual for a single FV sub-control volume face.
Definition boundaryfluxintegral.hh:35
void addFEBoundaryFluxIntegral(ResidualVector &residual, const Problem &problem, const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const typename ElementDiscretization::BoundaryFace &boundaryFace, const BoundaryTypes &bcTypes)
Adds boundary flux contributions to the residual related to FE discretization.
Definition boundaryfluxintegral.hh:68
typename NumEqVectorTraits< PrimaryVariables >::type NumEqVector
A vector with the same size as numbers of equations This is the default implementation and has to be ...
Definition numeqvector.hh:34
T getParamFromGroup(Args &&... args)
A free function to get a parameter from the parameter tree singleton with a model group.
Definition parameters.hh:149
typename GetProp< TypeTag, Property >::type GetPropType
get the type alias defined in the property
Definition propertysystem.hh:296
Definition assembly/assembler.hh:44
A helper to deduce a vector with the same size as numbers of equations.
The infrastructure to retrieve run-time parameters from Dune::ParameterTrees.
Point source types and helpers for handling point sources.
Empty point sources.
Definition pointsources.hh:41
export traits of this problem
Definition common/problem.hh:56
Problem::NumEqVector NumEqVector
Definition common/problem.hh:59
Problem::PrimaryVariables PrimaryVariables
Definition common/problem.hh:58
Problem::Scalar Scalar
Definition common/problem.hh:57