12#ifndef DUMUX_DISCRETIZATION_EVAL_SOLUTION_HH
13#define DUMUX_DISCRETIZATION_EVAL_SOLUTION_HH
20#include <dune/localfunctions/lagrange/pqkfactory.hh>
34template<
class ElementSolution>
38 auto firstState = elemSol[0].state();
39 for (std::size_t i = 1; i < elemSol.size(); ++i)
40 if (elemSol[i].state() != firstState)
47template<
class ElementSolution>
54template<
class Geometry,
class ElementSolution>
55auto minDistVertexSol(
const Geometry& geometry,
const typename Geometry::GlobalCoordinate& globalPos,
56 const ElementSolution& elemSol)
59 std::vector<typename Geometry::ctype> distances(geometry.corners());
60 for (
int i = 0; i < geometry.corners(); ++i)
61 distances[i] = (geometry.corner(i) - globalPos).two_norm2();
64 auto minDistanceIt = std::min_element(distances.begin(), distances.end());
65 return elemSol[std::distance(distances.begin(), minDistanceIt)];
69template<
class Element,
class Gr
idGeometry,
class ElementSolution>
71 const GridGeometry& gridGeometry,
72 const typename Element::Geometry::LocalCoordinate& localPos,
73 const ElementSolution& elemSol)
75 using DofHelper = GridGeometry::Cache::DofHelper;
76 const auto& localCoeffs = gridGeometry.feCache().get(element.type()).localCoefficients();
78 std::vector<typename Element::Geometry::ctype> distances(localCoeffs.size());
79 for (
int idx = 0; idx < localCoeffs.size(); ++idx)
81 const auto& localDofPos = DofHelper::localDofPosition(element.type(), localCoeffs.localKey(idx));
82 distances[idx] = (localPos - localDofPos).two_norm2();
86 auto minDistanceIt = std::min_element(distances.begin(), distances.end());
87 return elemSol[std::distance(distances.begin(), minDistanceIt)];
103template<
class Element,
class Gr
idGeometry,
class CVFEElemSol>
104typename CVFEElemSol::PrimaryVariables
106 const typename Element::Geometry& geometry,
107 const GridGeometry& gridGeometry,
108 const CVFEElemSol& elemSol,
109 const typename Element::Geometry::LocalCoordinate& localPos,
110 bool ignoreState =
false)
119 const auto& localBasis = gridGeometry.feCache().get(geometry.type()).localBasis();
122 using ShapeValue =
typename std::decay_t<
decltype(localBasis)>::Traits::RangeType;
123 std::vector<ShapeValue> shapeValues;
124 localBasis.evaluateFunction(localPos, shapeValues);
126 typename CVFEElemSol::PrimaryVariables result(0.0);
127 for (
int i = 0; i < shapeValues.size(); ++i)
129 auto value = elemSol[i];
130 value *= shapeValues[i][0];
135 if constexpr (HasState{})
137 result.setState(elemSol[0].state());
143 static bool warnedAboutUsingMinDist =
false;
144 if (!warnedAboutUsingMinDist)
146 std::cout <<
"Warning: Using nearest-neighbor interpolation in evalSolution"
147 <<
"\nbecause not all states are equal and ignoreState is false!"
149 warnedAboutUsingMinDist =
true;
171template<
class Element,
class FVElementGeometry,
class PrimaryVariables>
173 const typename Element::Geometry& geometry,
174 const typename FVElementGeometry::GridGeometry& gridGeometry,
176 const typename Element::Geometry::LocalCoordinate& localPos,
177 bool ignoreState =
false)
196template<
class Element,
class FVElementGeometry,
class PrimaryVariables>
198 const typename Element::Geometry& geometry,
199 const typename FVElementGeometry::GridGeometry& gridGeometry,
201 const typename Element::Geometry::GlobalCoordinate& globalPos,
202 bool ignoreState =
false)
204 const auto& localPos = geometry.local(globalPos);
222template<
class Element,
class FVElementGeometry,
class PrimaryVariables>
224 const typename Element::Geometry& geometry,
226 const typename Element::Geometry::GlobalCoordinate& globalPos,
227 bool ignoreState =
false)
229 static_assert(FVElementGeometry::GridGeometry::discMethod ==
DiscretizationMethods::box,
"Only implemented for the Box method");
237 using CoordScalar =
typename Element::Geometry::GlobalCoordinate::value_type;
238 static constexpr int dim = Element::Geometry::mydimension;
241 using FEFactory = Dune::PQkLocalFiniteElementFactory<CoordScalar, CoordScalar, dim, 1>;
242 using FiniteElement =
typename FEFactory::FiniteElementType;
243 std::unique_ptr<FiniteElement> fe(FEFactory::create(geometry.type()));
244 const auto& localBasis = fe->localBasis();
247 const auto localPos = geometry.local(globalPos);
248 using ShapeValue =
typename FiniteElement::Traits::LocalBasisType::Traits::RangeType;
249 std::vector< ShapeValue > shapeValues;
250 localBasis.evaluateFunction(localPos, shapeValues);
252 PrimaryVariables result(0.0);
253 for (
int i = 0; i < geometry.corners(); ++i)
255 auto value = elemSol[i];
256 value *= shapeValues[i][0];
261 if constexpr (HasState{})
263 result.setState(elemSol[0].state());
269 static bool warnedAboutUsingMinDist =
false;
270 if (!warnedAboutUsingMinDist)
272 std::cout <<
"Warning: Using nearest-neighbor interpolation in evalSolution"
273 <<
"\nbecause not all states are equal and ignoreState is false!"
275 warnedAboutUsingMinDist =
true;
294template<
class Element,
class FVElementGeometry,
class PrimaryVariables>
296 const typename Element::Geometry& geometry,
297 const typename FVElementGeometry::GridGeometry& gridGeometry,
299 const typename Element::Geometry::GlobalCoordinate& globalPos,
300 bool ignoreState =
false)
317template<
class Element,
class FVElementGeometry,
class PrimaryVariables>
319 const typename Element::Geometry& geometry,
320 const typename FVElementGeometry::GridGeometry& gridGeometry,
322 const typename Element::Geometry::LocalCoordinate& localPos,
323 bool ignoreState =
false)
342template<
class Element,
class FVElementGeometry,
class PrimaryVariables>
344 const typename Element::Geometry& geometry,
346 const typename Element::Geometry::GlobalCoordinate& globalPos,
347 bool ignoreState =
false)
The local element solution class for cell-centered methods.
The element solution vector.
Definition cellcentered/elementsolution.hh:28
The element solution vector.
Definition cvfe/elementsolution.hh:48
The local element solution class for control-volume finite element methods.
PrimaryVariables evalSolution(const Element &element, const typename Element::Geometry &geometry, const typename FVElementGeometry::GridGeometry &gridGeometry, const CVFEElementSolution< FVElementGeometry, PrimaryVariables > &elemSol, const typename Element::Geometry::GlobalCoordinate &globalPos, bool ignoreState=false)
Interpolates a given box element solution at a given global position. Uses the finite element cache o...
Definition evalsolution.hh:197
CVFEElemSol::PrimaryVariables evalCVFESolutionAtLocalPos(const Element &element, const typename Element::Geometry &geometry, const GridGeometry &gridGeometry, const CVFEElemSol &elemSol, const typename Element::Geometry::LocalCoordinate &localPos, bool ignoreState=false)
Interpolates a given control-volume finite element solution at a given global position....
Definition evalsolution.hh:105
PrimaryVariables evalSolutionAtLocalPos(const Element &element, const typename Element::Geometry &geometry, const typename FVElementGeometry::GridGeometry &gridGeometry, const CVFEElementSolution< FVElementGeometry, PrimaryVariables > &elemSol, const typename Element::Geometry::LocalCoordinate &localPos, bool ignoreState=false)
Interpolates a given cvfe element solution at a given local position. Uses the finite element cache o...
Definition evalsolution.hh:172
constexpr auto isValid(const Expression &t)
A function that creates a test functor to do class member introspection at compile time.
Definition isvalid.hh:81
A helper function for class member function introspection.
The available discretization methods in Dumux.
Definition cvfelocalresidual.hh:25
auto minDistVertexSol(const Geometry &geometry, const typename Geometry::GlobalCoordinate &globalPos, const ElementSolution &elemSol)
return the solution at the closest vertex dof
Definition evalsolution.hh:55
bool allStatesEqual(const ElementSolution &elemSol, std::true_type hasState)
returns true if all states in an element solution are the same
Definition evalsolution.hh:35
auto minDistDofSol(const Element &element, const GridGeometry &gridGeometry, const typename Element::Geometry::LocalCoordinate &localPos, const ElementSolution &elemSol)
return the solution at the closest dof
Definition evalsolution.hh:70
constexpr Box box
Definition method.hh:176
Type traits to be used with matrix types.
helper struct detecting if a PrimaryVariables object has a state() function
Definition state.hh:21