version 3.11-dev
common/fvspatialparams.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//
13#ifndef DUMUX_COMMON_FV_SPATIAL_PARAMS_HH
14#define DUMUX_COMMON_FV_SPATIAL_PARAMS_HH
15
16#include <memory>
17
18#include <dune/common/fvector.hh>
19#include <dune/common/exceptions.hh>
20
22
23namespace Dumux {
24
30template<class GridGeometry,
31 class Scalar,
32 class Implementation>
34{
35 using GridView = typename GridGeometry::GridView;
36 using Element = typename GridView::template Codim<0>::Entity;
37 using FVElementGeometry = typename GridGeometry::LocalView;
38 using SubControlVolume = typename GridGeometry::SubControlVolume;
39
40 static constexpr int dimWorld = GridView::dimensionworld;
41
42 using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
43 using GravityVector = Dune::FieldVector<Scalar, dimWorld>;
44
45public:
46 FVSpatialParams(std::shared_ptr<const GridGeometry> gridGeometry)
47 : gridGeometry_(gridGeometry)
48 , gravity_(0.0)
49 {
50 if (getParam<bool>("Problem.EnableGravity"))
51 gravity_[dimWorld-1] = -9.81;
52 }
53
63 template<class IpData, class ElementSolution>
64 Scalar extrusionFactor(const FVElementGeometry& fvGeometry,
65 const IpData& ipData,
66 const ElementSolution& elemSol) const
67 {
68 // forward to generic interface
69 return asImp_().extrusionFactorAtPos(ipData.global());
70 }
71
81 template<class ElementSolution>
82 Scalar extrusionFactor(const Element& element,
83 const SubControlVolume& scv,
84 const ElementSolution& elemSol) const
85 {
86 // forward to generic interface
87 return asImp_().extrusionFactorAtPos(scv.center());
88 }
89
93 Scalar extrusionFactorAtPos(const GlobalPosition& globalPos) const
94 {
95 // As a default, i.e. if the user's spatial parameters do not overload
96 // any extrusion factor method, return 1.0
97 return 1.0;
98 }
99
103 template<class IpData, class ElementSolution>
104 Scalar temperature(const FVElementGeometry& fvGeometry,
105 const IpData& ipData,
106 const ElementSolution& elemSol) const
107 {
108 // forward to generic interface
109 return asImp_().temperatureAtPos(ipData.global());
110 }
111
115 template<class ElementSolution>
116 Scalar temperature(const Element& element,
117 const SubControlVolume& scv,
118 const ElementSolution& elemSol) const
119 {
120 // forward to generic interface
121 return asImp_().temperatureAtPos(scv.center());
122 }
123
128 Scalar temperatureAtPos(const GlobalPosition& globalPos) const
129 {
130 static const Scalar defaultTemperature = [] ()
131 {
132 Scalar defaultTemp = 293.15; // 20°C
133 if (!hasParam("SpatialParams.Temperature"))
134 {
135 std::cout << " -- Using the default temperature of " << defaultTemp << " in the entire domain. "
136 << "Overload temperatureAtPos() in your spatial params class to define a custom temperature field."
137 << "Or provide the preferred domain temperature via the SpatialParams.Temperature parameter."
138 << std::endl;
139 }
140 const Scalar temperature = getParam<Scalar>("SpatialParams.Temperature", defaultTemp);
141 return temperature;
142 } ();
143
144 return defaultTemperature;
145 }
146
157 const GravityVector& gravity(const GlobalPosition& pos) const
158 { return gravity_; }
159
161 const GridGeometry& gridGeometry() const
162 { return *gridGeometry_; }
163
164protected:
166 Implementation &asImp_()
167 { return *static_cast<Implementation *>(this); }
168
170 const Implementation &asImp_() const
171 { return *static_cast<const Implementation *>(this); }
172
173private:
174 std::shared_ptr<const GridGeometry> gridGeometry_;
175 GravityVector gravity_;
176};
177
178} // namespace Dumux
179
180#endif
The base class for spatial parameters used with finite-volume schemes.
Definition: common/fvspatialparams.hh:34
Scalar temperatureAtPos(const GlobalPosition &globalPos) const
Return the temperature in the domain at the given position.
Definition: common/fvspatialparams.hh:128
Scalar extrusionFactor(const FVElementGeometry &fvGeometry, const IpData &ipData, const ElementSolution &elemSol) const
Return how much the domain is extruded at an integration point.
Definition: common/fvspatialparams.hh:64
Implementation & asImp_()
Returns the implementation of the spatial parameters (static polymorphism)
Definition: common/fvspatialparams.hh:166
Scalar temperature(const Element &element, const SubControlVolume &scv, const ElementSolution &elemSol) const
Return the temperature in the given sub-control volume.
Definition: common/fvspatialparams.hh:116
Scalar extrusionFactorAtPos(const GlobalPosition &globalPos) const
Return how much the domain is extruded at a given position.
Definition: common/fvspatialparams.hh:93
const Implementation & asImp_() const
Returns the implementation of the spatial parameters (static polymorphism)
Definition: common/fvspatialparams.hh:170
FVSpatialParams(std::shared_ptr< const GridGeometry > gridGeometry)
Definition: common/fvspatialparams.hh:46
Scalar temperature(const FVElementGeometry &fvGeometry, const IpData &ipData, const ElementSolution &elemSol) const
Return the temperature at an integration point.
Definition: common/fvspatialparams.hh:104
const GridGeometry & gridGeometry() const
The finite volume grid geometry.
Definition: common/fvspatialparams.hh:161
const GravityVector & gravity(const GlobalPosition &pos) const
Returns the acceleration due to gravity .
Definition: common/fvspatialparams.hh:157
Scalar extrusionFactor(const Element &element, const SubControlVolume &scv, const ElementSolution &elemSol) const
Return how much the domain is extruded at a given sub-control volume.
Definition: common/fvspatialparams.hh:82
bool hasParam(const std::string &param)
Check whether a key exists in the parameter tree.
Definition: parameters.hh:157
Definition: adapt.hh:17
The infrastructure to retrieve run-time parameters from Dune::ParameterTrees.