12#ifndef DUMUX_DISCRETIZATION_FE_GRID_LOCAL_VARIABLES_HH
13#define DUMUX_DISCRETIZATION_FE_GRID_LOCAL_VARIABLES_HH
16#include <unordered_map>
24#include <dumux/common/concepts/localdofs_.hh>
34template<
class P,
class V,
class IPD>
41 template<
class Gr
idVariablesCache,
bool cachingEnabled>
49template<
class Traits,
bool enableCaching>
78 template<
class Gr
idDiscretization,
class SolutionVector>
79 void init(
const GridDiscretization& gridDiscretization,
const SolutionVector& sol)
81 variables_.resize(gridDiscretization.gridView().size(0));
82 ipDataCache_ = std::make_shared<InterpolationPointDataCache>();
83 ipDataCache_->resize(gridDiscretization.gridView().size(0));
87 const auto element = gridDiscretization.element(eIdx);
88 const auto elemDisc =
localView(gridDiscretization).bindElement(element);
93 variables_[eIdx].resize(Dumux::Detail::LocalDofs::numLocalDofs(elemDisc));
94 for (
const auto& localDof :
localDofs(elemDisc))
95 variables_[eIdx][localDof.index()].update(elemSol,
problem, elemDisc, ipData(elemDisc, localDof));
97 ipDataCache_->update(
problem, element, elemDisc, variables_[eIdx]);
101 template<
class Gr
idDiscretization,
class SolutionVector>
102 void update(
const GridDiscretization& gridDiscretization,
const SolutionVector& sol)
104 if constexpr (InterpolationPointData::isSolDependent)
106 auto newIpDataCache = std::make_shared<InterpolationPointDataCache>();
107 newIpDataCache->resize(gridDiscretization.gridView().size(0));
111 const auto element = gridDiscretization.element(eIdx);
112 const auto elemDisc =
localView(gridDiscretization).bindElement(element);
117 for (
const auto& localDof :
localDofs(elemDisc))
118 variables_[eIdx][localDof.index()].update(elemSol,
problem, elemDisc, ipData(elemDisc, localDof));
120 newIpDataCache->update(
problem, element, elemDisc, variables_[eIdx]);
123 ipDataCache_ = std::move(newIpDataCache);
129 const auto element = gridDiscretization.element(eIdx);
130 const auto elemDisc =
localView(gridDiscretization).bindElement(element);
135 for (
const auto& localDof :
localDofs(elemDisc))
136 variables_[eIdx][localDof.index()].update(elemSol,
problem, elemDisc, ipData(elemDisc, localDof));
141 template<
class LocalDof>
143 {
return variables_[localDof.elementIndex()][localDof.index()]; }
145 template<
class LocalDof>
147 {
return variables_[localDof.elementIndex()][localDof.index()]; }
150 {
return variables_[eIdx][localIdx]; }
153 {
return variables_[eIdx][localIdx]; }
156 {
return ipDataCache_->elementCache(eIdx, qpIdx); }
159 {
return ipDataCache_->elementCache(eIdx, qpIdx); }
162 {
return ipDataCache_->boundaryFaceCache(eIdx, bfIdx, qpIdx); }
165 {
return ipDataCache_->boundaryFaceCache(eIdx, bfIdx, qpIdx); }
168 {
return *problemPtr_; }
171 class InterpolationPointDataCache
179 template<
class Problem,
class ElementDiscretization,
class ElementVariables>
181 const typename ElementDiscretization::Element& element,
182 const ElementDiscretization& elemDisc,
183 const ElementVariables& elemVars)
187 for (
const auto& qpData : elemQuadRule)
188 elementCache[qpData.ipData().qpIndex()].update(
problem, element, elemDisc, elemVars, qpData.ipData());
191 for (
const auto& boundaryFace : boundaryFaces(elemDisc))
195 bfCache.resize(std::ranges::size(quadRule));
196 for (
const auto& qpData : quadRule)
197 bfCache[qpData.ipData().qpIndex()].update(
problem,
206 InterpolationPointDataCache()
209 void resize(
const std::size_t numElements)
210 { elementCaches_.resize(numElements); }
212 template<
class Problem,
class ElementDiscretization,
class ElementVariables>
213 void update(
const Problem& problem,
214 const typename ElementDiscretization::Element& element,
215 const ElementDiscretization& elemDisc,
216 const ElementVariables& elemVars)
218 const auto eIdx = elemDisc.gridDiscretization().elementMapper().index(element);
219 elementCaches_[eIdx].update(problem, element, elemDisc, elemVars);
223 const InterpolationPointData& elementCache(std::size_t eIdx, std::size_t qpIdx)
const
224 {
return elementCaches_[eIdx].elementCache[qpIdx]; }
227 InterpolationPointData& elementCache(std::size_t eIdx, std::size_t qpIdx)
228 {
return elementCaches_[eIdx].elementCache[qpIdx]; }
231 const InterpolationPointData& boundaryFaceCache(std::size_t eIdx,
int bfIdx, std::size_t qpIdx)
const
232 {
return elementCaches_[eIdx].boundaryFaceCache.at(bfIdx)[qpIdx]; }
235 InterpolationPointData& boundaryFaceCache(std::size_t eIdx,
int bfIdx, std::size_t qpIdx)
236 {
return elementCaches_[eIdx].boundaryFaceCache[bfIdx][qpIdx]; }
238 const ElementCache& cache(std::size_t eIdx)
const
239 {
return elementCaches_[eIdx]; }
241 ElementCache& cache(std::size_t eIdx)
242 {
return elementCaches_[eIdx]; }
244 std::vector<ElementCache> elementCaches_;
248 const auto&
cache(std::size_t eIdx)
const
249 {
return ipDataCache_->cache(eIdx); }
252 {
return ipDataCache_->cache(eIdx); }
256 std::vector<std::vector<Variables>> variables_;
257 std::shared_ptr<InterpolationPointDataCache> ipDataCache_;
261template<
class Traits>
287 template<
class Gr
idDiscretization,
class SolutionVector>
288 void update(
const GridDiscretization& gridDiscretization,
const SolutionVector& sol) {}
291 {
return *problemPtr_;}
The (stencil) element variables class for finite element schemes.
Definition fem/elementvariables.hh:40
FEGridVariablesCache(const Problem &problem)
Definition fem/gridvariablescache.hh:285
void update(const GridDiscretization &gridDiscretization, const SolutionVector &sol)
Definition fem/gridvariablescache.hh:288
typename Traits::Variables Variables
export the variables type
Definition fem/gridvariablescache.hh:271
static constexpr bool cachingEnabled
make it possible to query if caching is enabled
Definition fem/gridvariablescache.hh:274
typename Traits::Problem Problem
export the problem type
Definition fem/gridvariablescache.hh:268
typename LocalView::MutableView MutableLocalView
export the type of the mutable local view
Definition fem/gridvariablescache.hh:280
typename Traits::InterpolationPointData InterpolationPointData
export interpolation point data type
Definition fem/gridvariablescache.hh:283
typename Traits::template LocalView< ThisType, cachingEnabled > LocalView
export the type of the local view
Definition fem/gridvariablescache.hh:277
const Problem & problem() const
Definition fem/gridvariablescache.hh:290
const Variables & variables(const std::size_t eIdx, const std::size_t localIdx) const
Definition fem/gridvariablescache.hh:149
static constexpr bool cachingEnabled
make it possible to query if caching is enabled
Definition fem/gridvariablescache.hh:68
const auto & cache(std::size_t eIdx) const
Definition fem/gridvariablescache.hh:248
const Variables & variables(const LocalDof &localDof) const
Definition fem/gridvariablescache.hh:142
const InterpolationPointData & elementCache(std::size_t eIdx, std::size_t qpIdx) const
Definition fem/gridvariablescache.hh:155
auto & cache(std::size_t eIdx)
Definition fem/gridvariablescache.hh:251
typename Traits::Variables Variables
export the variables type
Definition fem/gridvariablescache.hh:62
typename Traits::InterpolationPointData InterpolationPointData
export interpolation point data type
Definition fem/gridvariablescache.hh:65
InterpolationPointData & elementCache(std::size_t eIdx, std::size_t qpIdx)
Definition fem/gridvariablescache.hh:158
void init(const GridDiscretization &gridDiscretization, const SolutionVector &sol)
Definition fem/gridvariablescache.hh:79
Variables & variables(const LocalDof &localDof)
Definition fem/gridvariablescache.hh:146
void update(const GridDiscretization &gridDiscretization, const SolutionVector &sol)
Definition fem/gridvariablescache.hh:102
typename Traits::template LocalView< ThisType, cachingEnabled > LocalView
export the type of the local view
Definition fem/gridvariablescache.hh:71
Variables & variables(const std::size_t eIdx, const std::size_t localIdx)
Definition fem/gridvariablescache.hh:152
const InterpolationPointData & boundaryFaceCache(std::size_t eIdx, int bfIdx, std::size_t qpIdx) const
Definition fem/gridvariablescache.hh:161
typename LocalView::MutableView MutableLocalView
export the type of the mutable local view
Definition fem/gridvariablescache.hh:74
typename Traits::Problem Problem
export the problem type
Definition fem/gridvariablescache.hh:59
FEGridVariablesCache(const Problem &problem)
Definition fem/gridvariablescache.hh:76
const Problem & problem() const
Definition fem/gridvariablescache.hh:167
InterpolationPointData & boundaryFaceCache(std::size_t eIdx, int bfIdx, std::size_t qpIdx)
Definition fem/gridvariablescache.hh:164
Base class for the grid local variables.
Definition fem/gridvariablescache.hh:50
Base class for all standard finite volume or finite element problems.
Definition common/problem.hh:39
The local element solution class for control-volume finite element methods.
The element variables class.
GridCache::LocalView localView(const GridCache &gridCache)
Free function to get the local view of a grid cache object.
Definition localview.hh:26
auto elementSolution(const Element &element, const SolutionVector &sol, const GridGeometry &gg) -> std::enable_if_t< GridGeometry::discMethod==DiscretizationMethods::cctpfa||GridGeometry::discMethod==DiscretizationMethods::ccmpfa, CCElementSolution< typename GridGeometry::LocalView, std::decay_t< decltype(std::declval< SolutionVector >()[0])> > >
Make an element solution for cell-centered schemes.
Definition cellcentered/elementsolution.hh:101
void parallelFor(const std::size_t count, const FunctorType &functor)
A parallel for loop (multithreading).
Definition parallel_for.hh:160
Free function to get the local view of a grid cache object.
auto quadratureRule(const FVElementGeometry &fvGeometry, const typename FVElementGeometry::SubControlVolume &scv, QuadratureRules::MidpointQuadrature)
Midpoint quadrature for scv.
Definition quadraturerules.hh:159
Definition assembly/assembler.hh:44
auto localDofs(const FVElementGeometry &fvGeometry)
range over local dofs
Definition localdof.hh:50
Parallel for loop (multithreading).
Quadrature rules over sub-control volumes and sub-control volume faces.
Definition fem/gridvariablescache.hh:36
V Variables
Definition fem/gridvariablescache.hh:38
IPD InterpolationPointData
Definition fem/gridvariablescache.hh:39
FEElementVariables< GridVariablesCache, cachingEnabled > LocalView
Definition fem/gridvariablescache.hh:42
P Problem
Definition fem/gridvariablescache.hh:37
Definition fem/gridvariablescache.hh:175
void update(const Problem &problem, const typename ElementDiscretization::Element &element, const ElementDiscretization &elemDisc, const ElementVariables &elemVars)
Definition fem/gridvariablescache.hh:180
std::unordered_map< int, std::vector< InterpolationPointData > > boundaryFaceCache
Definition fem/gridvariablescache.hh:177
std::vector< InterpolationPointData > elementCache
Definition fem/gridvariablescache.hh:176