version 3.11-dev
discretization/cvfe/fluxvariablescache.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_DISCRETIZATION_CVFE_FLUXVARIABLES_CACHE_HH
13#define DUMUX_DISCRETIZATION_CVFE_FLUXVARIABLES_CACHE_HH
14
15#include <type_traits>
16
17#include <dune/common/fvector.hh>
18#include <dumux/common/typetraits/localdofs_.hh>
19#include <dumux/common/concepts/ipdata_.hh>
23
24namespace Dumux {
25
32template< class Scalar, class GridGeometry >
34{
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;
39
40 using FVElementGeometry = typename GridGeometry::LocalView;
41 using SubControlVolumeFace = typename GridGeometry::SubControlVolumeFace;
42
43 static const int dim = GridView::dimension;
44 static const int dimWorld = GridView::dimensionworld;
45
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;
51
53
54public:
56
58 static bool constexpr isSolDependent = false;
59
61 template< class Problem, class ElementVolumeVariables >
62 void update(const Problem& problem,
63 const Element& element,
64 const FVElementGeometry& fvGeometry,
65 const ElementVolumeVariables& elemVolVars,
66 const SubControlVolumeFace& scvf)
67 {
68 if constexpr (std::is_same_v<ScvfQuadratureRule, QuadratureRules::MidpointQuadrature>)
69 this->update(problem, element, fvGeometry, elemVolVars, scvf.ipGlobal());
70 else
71 DUNE_THROW(Dune::NotImplemented, "CVFEFluxVariablesCache: update for scvf only implemented for MidpointQuadrature.");
72 }
73
75 template< class Problem, class ElementVolumeVariables >
76 void update(const Problem& problem,
77 const Element& element,
78 const FVElementGeometry& fvGeometry,
79 const ElementVolumeVariables& elemVolVars,
80 const GlobalPosition& globalPos)
81 {
82 const auto& geometry = elementGeometry_(fvGeometry);
83 ipGlobal_ = globalPos;
84 ipLocal_ = geometry.local(globalPos);
85 jacInvT_ = geometry.jacobianInverseTransposed(ipLocal_);
86 evaluateBasis_(fvGeometry);
87 }
88
90 template< class Problem, class ElementVolumeVariables, Concept::IpData IpData >
91 void update(const Problem& problem,
92 const Element& element,
93 const FVElementGeometry& fvGeometry,
94 const ElementVolumeVariables& elemVolVars,
95 const IpData& ipData)
96 {
97 const auto& geometry = elementGeometry_(fvGeometry);
98 ipGlobal_ = ipData.global();
99 ipLocal_ = ipData.local();
100 jacInvT_ = geometry.jacobianInverseTransposed(ipLocal_);
101 evaluateBasis_(fvGeometry);
102 }
103
105 const GlobalPosition& ipGlobal() const { return ipGlobal_; }
107 const LocalPosition& ipLocal() const { return ipLocal_; }
109 IpData ipData() const { return IpData(ipLocal(), ipGlobal()); }
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]; }
118
119private:
120 static decltype(auto) elementGeometry_(const FVElementGeometry& fvGeometry)
121 {
122 if constexpr (requires { fvGeometry.elementGeometry(); })
123 return fvGeometry.elementGeometry();
124 else
125 return fvGeometry.element().geometry();
126 }
127
129 void evaluateBasis_(const FVElementGeometry& fvGeometry)
130 {
131 const auto& localBasis = fvGeometry.feLocalBasis();
132
133 // evaluate shape functions and gradients at the interpolation point
134 localBasis.evaluateJacobian(ipLocal_, shapeJacobian_);
135 localBasis.evaluateFunction(ipLocal_, shapeValues_); // shape values for rho
136
137 // compute the gradN at for every scv/dof
138 gradN_.resize(Detail::LocalDofs::numLocalDofs(fvGeometry));
139 for (const auto& localDof: localDofs(fvGeometry))
140 jacInvT_.mv(shapeJacobian_[localDof.index()][0], gradN_[localDof.index()]);
141 }
142
143 std::vector<GlobalPosition> gradN_;
144 std::vector<ShapeJacobian> shapeJacobian_;
145 std::vector<ShapeValue> shapeValues_;
146 JacobianInverseTransposed jacInvT_;
147 GlobalPosition ipGlobal_;
148 LocalPosition ipLocal_;
149};
150
151} // end namespace Dumux
152
153#endif
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
Definition: adapt.hh:17
auto localDofs(const FVElementGeometry &fvGeometry)
range over local dofs
Definition: localdof.hh:50
Quadrature rules over sub-control volumes and sub-control volume faces.