12#ifndef DUMUX_DISCRETIZATION_CVFE_FLUXVARIABLES_CACHE_HH
13#define DUMUX_DISCRETIZATION_CVFE_FLUXVARIABLES_CACHE_HH
17#include <dune/common/fvector.hh>
18#include <dumux/common/typetraits/localdofs_.hh>
19#include <dumux/common/concepts/ipdata_.hh>
32template<
class Scalar,
class Gr
idGeometry >
35 using GridView =
typename GridGeometry::GridView;
36 using Element =
typename GridView::template Codim<0>::Entity;
37 using GlobalPosition =
typename Element::Geometry::GlobalCoordinate;
38 using LocalPosition =
typename Element::Geometry::LocalCoordinate;
40 using FVElementGeometry =
typename GridGeometry::LocalView;
41 using SubControlVolumeFace =
typename GridGeometry::SubControlVolumeFace;
43 static const int dim = GridView::dimension;
44 static const int dimWorld = GridView::dimensionworld;
46 using CoordScalar =
typename GridView::ctype;
47 using FeLocalBasis =
typename GridGeometry::FeCache::FiniteElementType::Traits::LocalBasisType;
48 using ShapeJacobian =
typename FeLocalBasis::Traits::JacobianType;
49 using ShapeValue =
typename Dune::FieldVector<Scalar, 1>;
50 using JacobianInverseTransposed =
typename Element::Geometry::JacobianInverseTransposed;
61 template<
class Problem,
class ElementVolumeVariables >
63 const Element& element,
64 const FVElementGeometry& fvGeometry,
65 const ElementVolumeVariables& elemVolVars,
66 const SubControlVolumeFace& scvf)
68 if constexpr (std::is_same_v<ScvfQuadratureRule, QuadratureRules::MidpointQuadrature>)
69 this->
update(problem, element, fvGeometry, elemVolVars, scvf.ipGlobal());
71 DUNE_THROW(Dune::NotImplemented,
"CVFEFluxVariablesCache: update for scvf only implemented for MidpointQuadrature.");
75 template<
class Problem,
class ElementVolumeVariables >
77 const Element& element,
78 const FVElementGeometry& fvGeometry,
79 const ElementVolumeVariables& elemVolVars,
80 const GlobalPosition& globalPos)
82 const auto& geometry = elementGeometry_(fvGeometry);
83 ipGlobal_ = globalPos;
84 ipLocal_ = geometry.local(globalPos);
85 jacInvT_ = geometry.jacobianInverseTransposed(ipLocal_);
86 evaluateBasis_(fvGeometry);
90 template<
class Problem,
class ElementVolumeVariables, Concept::IpData IpData >
92 const Element& element,
93 const FVElementGeometry& fvGeometry,
94 const ElementVolumeVariables& elemVolVars,
97 const auto& geometry = elementGeometry_(fvGeometry);
100 jacInvT_ = geometry.jacobianInverseTransposed(ipLocal_);
101 evaluateBasis_(fvGeometry);
105 const GlobalPosition&
ipGlobal()
const {
return ipGlobal_; }
107 const LocalPosition&
ipLocal()
const {
return ipLocal_; }
111 const std::vector<ShapeJacobian>&
shapeJacobian()
const {
return shapeJacobian_; }
113 const std::vector<ShapeValue>&
shapeValues()
const {
return shapeValues_; }
115 const JacobianInverseTransposed&
jacInvT()
const {
return jacInvT_; }
117 const GlobalPosition&
gradN(
unsigned int scvIdxInElement)
const {
return gradN_[scvIdxInElement]; }
120 static decltype(
auto) elementGeometry_(
const FVElementGeometry& fvGeometry)
122 if constexpr (
requires { fvGeometry.elementGeometry(); })
123 return fvGeometry.elementGeometry();
125 return fvGeometry.element().geometry();
129 void evaluateBasis_(
const FVElementGeometry& fvGeometry)
131 const auto& localBasis = fvGeometry.feLocalBasis();
134 localBasis.evaluateJacobian(ipLocal_, shapeJacobian_);
135 localBasis.evaluateFunction(ipLocal_, shapeValues_);
138 gradN_.resize(Detail::LocalDofs::numLocalDofs(fvGeometry));
139 for (
const auto& localDof:
localDofs(fvGeometry))
140 jacInvT_.mv(shapeJacobian_[localDof.index()][0], gradN_[localDof.index()]);
143 std::vector<GlobalPosition> gradN_;
144 std::vector<ShapeJacobian> shapeJacobian_;
145 std::vector<ShapeValue> shapeValues_;
146 JacobianInverseTransposed jacInvT_;
147 GlobalPosition ipGlobal_;
148 LocalPosition ipLocal_;
const LocalPosition & local() const
The local position of the quadrature point.
Definition: cvfe/interpolationpointdata.hh:40
const GlobalPosition & global() const
The global position of the quadrature point.
Definition: cvfe/interpolationpointdata.hh:36
Flux variables cache class for control-volume finite element schemes. For control-volume finite eleme...
Definition: discretization/cvfe/fluxvariablescache.hh:34
const JacobianInverseTransposed & jacInvT() const
returns inverse transposed jacobian at the interpolation point
Definition: discretization/cvfe/fluxvariablescache.hh:115
CVFE::Detail::ScvfQuadratureRuleType< FVElementGeometry > ScvfQuadratureRule
Definition: discretization/cvfe/fluxvariablescache.hh:55
const LocalPosition & ipLocal() const
returns the local position for which this cache has been updated
Definition: discretization/cvfe/fluxvariablescache.hh:107
void update(const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const IpData &ipData)
update the cache for interpolation point data
Definition: discretization/cvfe/fluxvariablescache.hh:91
void update(const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const SubControlVolumeFace &scvf)
update the cache for an scvf (only enabled for MidpointQuadrature)
Definition: discretization/cvfe/fluxvariablescache.hh:62
const std::vector< ShapeValue > & shapeValues() const
returns the shape function values at the interpolation point
Definition: discretization/cvfe/fluxvariablescache.hh:113
const GlobalPosition & gradN(unsigned int scvIdxInElement) const
returns the shape function gradients in global coordinates at the interpolation point
Definition: discretization/cvfe/fluxvariablescache.hh:117
const GlobalPosition & ipGlobal() const
returns the global position for which this cache has been updated
Definition: discretization/cvfe/fluxvariablescache.hh:105
IpData ipData() const
returns the ipData for which this cache has been updated
Definition: discretization/cvfe/fluxvariablescache.hh:109
static bool constexpr isSolDependent
whether the cache needs an update when the solution changes
Definition: discretization/cvfe/fluxvariablescache.hh:58
void update(const Problem &problem, const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const GlobalPosition &globalPos)
update the cache for a given global position
Definition: discretization/cvfe/fluxvariablescache.hh:76
const std::vector< ShapeJacobian > & shapeJacobian() const
returns the shape function gradients in local coordinates at the interpolation point
Definition: discretization/cvfe/fluxvariablescache.hh:111
Classes representing interpolation point data for control-volume finite element schemes.
Class representing dofs on elements for control-volume finite element schemes.
Dune::Std::detected_or_t< QuadratureRules::MidpointQuadrature, DefinesScvfQuadratureRuleType, FVElementGeometry > ScvfQuadratureRuleType
Get ScvfQuadratureRule type (default is MidpointQuadrature)
Definition: quadraturerules.hh:115
auto localDofs(const FVElementGeometry &fvGeometry)
range over local dofs
Definition: localdof.hh:50
Quadrature rules over sub-control volumes and sub-control volume faces.