version 3.11-dev
Loading...
Searching...
No Matches
cvfe/hybrid/elementvariables.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_HYBRID_CVFE_ELEMENT_VARIABLES_HH
13#define DUMUX_DISCRETIZATION_HYBRID_CVFE_ELEMENT_VARIABLES_HH
14
15#include <array>
16#include <optional>
17#include <ranges>
18#include <type_traits>
19#include <utility>
20#include <vector>
21
22#include <dumux/common/concepts/ipdata_.hh>
23#include <dumux/common/concepts/localdofs_.hh>
27
31
33
41template<class GVC, bool cachingEnabled>
43
49template<class GVC>
50class HybridCVFEElementVariables<GVC, /*cachingEnabled*/true>
51{
52 class MutableVariablesView
53 {
54 public:
55 MutableVariablesView(GVC& gridCache)
56 : gridCache_(gridCache) {}
57
58 using Variables = typename GVC::Variables;
59
60 template<Dumux::Concept::LocalDof LocalDof>
61 Variables& operator [](const LocalDof& localDof) const
62 { return gridCache_.variables(localDof); }
63 private:
64 GVC& gridCache_;
65 };
66
67 class MutableVariablesViewWithIpCacheAccess
68 {
69 public:
70 MutableVariablesViewWithIpCacheAccess(GVC& gridCache)
71 : gridCache_(gridCache)
72 {}
73
74 using Variables = typename GVC::Variables;
75
76 template<Dumux::Concept::LocalDof LocalDof>
77 Variables& operator [](const LocalDof& localDof) const
78 { return gridCache_.variables(localDof); }
79
80 auto& cache(std::size_t eIdx) const
81 { return gridCache_.cache(eIdx); }
82
83 private:
84 GVC& gridCache_;
85 };
86
87public:
89 using GridVariablesCache = GVC;
90
92 using InterpolationPointData = typename GridVariablesCache::InterpolationPointData;
93
95 using MutableView = std::conditional_t<
96 InterpolationPointData::isSolDependent,
97 MutableVariablesViewWithIpCacheAccess,
98 MutableVariablesView
99 >;
100
102 using Variables = typename GridVariablesCache::Variables;
103
105 template<class ElementDiscretization>
106 using DeflectionPolicy = std::conditional_t<
107 InterpolationPointData::isSolDependent,
110 >;
111
115
116 const Variables& operator [](std::size_t localDofIdx) const
117 { return gridVariablesCache().variables(eIdx_, localDofIdx); }
118
119 template<Dumux::Concept::LocalDof LocalDof>
120 const Variables& operator [](const LocalDof& localDof) const
121 { return gridVariablesCache().variables(localDof); }
122
123 template<class IpData>
124 requires requires (const IpData& ipData) { ipData.localDofIndex(); }
125 const Variables& operator [](const IpData& ipData) const
126 { return gridVariablesCache().variables(eIdx_, ipData.localDofIndex()); }
127
128 template<Concept::ScvfQpIpData IpData>
130 const IpData& ipData)
131 { return elemVars.ipDataCache().scvfCache(ipData.scvfIndex(), ipData.qpIndex()); }
132
133 template<Concept::BoundaryFaceQpIpData IpData>
135 const IpData& ipData)
136 { return elemVars.ipDataCache().boundaryFaceCache(ipData.boundaryFaceIndex(), ipData.qpIndex()); }
137
138 template<Concept::QIpData IpData>
140 const IpData& ipData)
141 { return elemVars.ipDataCache().elementCache(ipData.qpIndex()); }
142
148 template<class ElementDiscretization, class SolutionVector>
149 HybridCVFEElementVariables bind(const typename ElementDiscretization::Element& element,
150 const ElementDiscretization& elemDisc,
151 const SolutionVector& sol) &&
152 {
153 this->bindElement(element, elemDisc, sol);
154 return std::move(*this);
155 }
156
157 // For compatibility reasons with the case of not storing the variables.
158 // function to be called before assembling an element, preparing the variables within the stencil
159 template<class ElementDiscretization, class SolutionVector>
160 void bind(const typename ElementDiscretization::Element& element,
161 const ElementDiscretization& elemDisc,
162 const SolutionVector& sol) &
163 {
164 bindElement(element, elemDisc, sol);
165 }
166
172 template<class ElementDiscretization, class SolutionVector>
173 HybridCVFEElementVariables bindElement(const typename ElementDiscretization::Element& element,
174 const ElementDiscretization& elemDisc,
175 const SolutionVector& sol) &&
176 {
177 this->bindElement(element, elemDisc, sol);
178 return std::move(*this);
179 }
180
181 // function to prepare the variables within the element
182 template<class ElementDiscretization, class SolutionVector>
183 void bindElement(const typename ElementDiscretization::Element& element,
184 const ElementDiscretization& elemDisc,
185 const SolutionVector& sol) &
186 {
187 const auto& gridDiscretization = elemDisc.gridDiscretization();
188 eIdx_ = gridDiscretization.elementMapper().index(element);
189 if constexpr (!GridVariablesCache::interpolationPointDataCachingEnabled)
190 ipDataCache_.bind(elemDisc);
191 }
192
195 { return *gridVariablesCachePtr_; }
196
202 { return { gridVars }; }
203
204private:
206
207 const ElementInterpolationPointDataCache& ipDataCache() const
208 {
209 if constexpr (GridVariablesCache::interpolationPointDataCachingEnabled)
210 return gridVariablesCache().cache(eIdx_);
211 else
212 return ipDataCache_.get(gridVariablesCache().problem(), gridVariablesCache().localDofVariables(eIdx_));
213 }
214
215 const GridVariablesCache* gridVariablesCachePtr_;
216 std::size_t eIdx_;
218};
219
224template<class GVC>
225class HybridCVFEElementVariables<GVC, /*cachingEnabled*/false>
226{
227 using ThisType = HybridCVFEElementVariables<GVC, /*cachingEnabled*/false>;
228 class MutableVariablesView
229 {
230 public:
231 MutableVariablesView(ThisType& view)
232 : view_(view) {}
233
234 using Variables = typename GVC::Variables;
235
236 template<Dumux::Concept::LocalDof LocalDof>
237 Variables& operator [](const LocalDof& localDof) const
238 { return view_[localDof]; }
239 private:
240 ThisType& view_;
241 };
242
243 class MutableVariablesViewWithIpCacheAccess
244 {
245 public:
246 MutableVariablesViewWithIpCacheAccess(ThisType& view)
247 : view_(view)
248 {}
249
250 using Variables = typename GVC::Variables;
251
252 template<Dumux::Concept::LocalDof LocalDof>
253 Variables& operator [](const LocalDof& localDof) const
254 { return view_[localDof]; }
255
256 auto& cache(std::size_t) const
257 { return view_.ipDataCache_.get(view_.gridVariablesCache().problem(), view_.variables_); }
258
259 private:
260 ThisType& view_;
261 };
262
263public:
266
268 using InterpolationPointData = typename GridVariablesCache::InterpolationPointData;
269
271 using MutableView = std::conditional_t<
272 InterpolationPointData::isSolDependent,
273 MutableVariablesViewWithIpCacheAccess,
274 MutableVariablesView
275 >;
276
278 using Variables = typename GridVariablesCache::Variables;
279
281 template<class ElementDiscretization>
282 using DeflectionPolicy = std::conditional_t<
283 InterpolationPointData::isSolDependent,
286 >;
287
290 : gridVariablesCachePtr_(&gridVarsCache)
291 {}
292
298 template<class ElementDiscretization, class SolutionVector>
299 HybridCVFEElementVariables bind(const typename ElementDiscretization::Element& element,
300 const ElementDiscretization& elemDisc,
301 const SolutionVector& sol) &&
302 {
303 this->bindElement(element, elemDisc, sol);
304 return std::move(*this);
305 }
306
307 // specialization for control-volume finite element, simply forwards to the bindElement method
308 template<class ElementDiscretization, class SolutionVector>
309 void bind(const typename ElementDiscretization::Element& element,
310 const ElementDiscretization& elemDisc,
311 const SolutionVector& sol) &
312 {
313 bindElement(element, elemDisc, sol);
314 }
315
321 template<class ElementDiscretization, class SolutionVector>
322 HybridCVFEElementVariables bindElement(const typename ElementDiscretization::Element& element,
323 const ElementDiscretization& elemDisc,
324 const SolutionVector& sol) &&
325 {
326 this->bindElement(element, elemDisc, sol);
327 return std::move(*this);
328 }
329
330 // specialization for control-volume finite element
331 template<class ElementDiscretization, class SolutionVector>
332 void bindElement(const typename ElementDiscretization::Element& element,
333 const ElementDiscretization& elemDisc,
334 const SolutionVector& sol) &
335 {
336 // get the solution at the dofs of the element
337 const auto& gridDiscretization = elemDisc.gridDiscretization();
338 auto elemSol = elementSolution(element, sol, gridDiscretization);
339
340 // resize variables to the required size
341 variables_.resize(Dumux::Detail::LocalDofs::numLocalDofs(elemDisc));
342
343 // update variables related to localDofs
344 for (const auto& localDof : localDofs(elemDisc))
345 variables_[localDof.index()].update(elemSol, gridVariablesCache().problem(), elemDisc, ipData(elemDisc, localDof));
346
347 if constexpr (GridVariablesCache::interpolationPointDataCachingEnabled)
348 eIdx_ = gridDiscretization.elementMapper().index(element);
349 else
350 {
351 ipDataCache_.bind(elemDisc);
352 if constexpr (InterpolationPointData::isSolDependent)
353 ipDataCache_.get(gridVariablesCache().problem(), variables_);
354 }
355 }
356
357 const Variables& operator [](std::size_t localIdx) const
358 { return variables_[localIdx]; }
359
360 Variables& operator [](std::size_t localIdx)
361 { return variables_[localIdx]; }
362
363 template<Dumux::Concept::LocalDof LocalDof>
364 const Variables& operator [](const LocalDof& localDof) const
365 { return variables_[localDof.index()]; }
366
367 template<Dumux::Concept::LocalDof LocalDof>
368 Variables& operator [](const LocalDof& localDof)
369 { return variables_[localDof.index()]; }
370
371 template<class IpData>
372 requires requires (const IpData& ipData) { ipData.localDofIndex(); }
373 const Variables& operator [](const IpData& ipData) const
374 { return variables_[ipData.localDofIndex()]; }
375
376 template<class IpData>
377 requires requires (const IpData& ipData) { ipData.localDofIndex(); }
378 Variables& operator [](const IpData& ipData)
379 { return variables_[ipData.localDofIndex()]; }
380
381 template<Concept::ScvfQpIpData IpData>
383 const IpData& ipData)
384 { return elemVars.ipDataCache().scvfCache(ipData.scvfIndex(), ipData.qpIndex()); }
385
386 template<Concept::BoundaryFaceQpIpData IpData>
388 const IpData& ipData)
389 { return elemVars.ipDataCache().boundaryFaceCache(ipData.boundaryFaceIndex(), ipData.qpIndex()); }
390
391 template<Concept::QIpData IpData>
393 const IpData& ipData)
394 { return elemVars.ipDataCache().elementCache(ipData.qpIndex()); }
395
398 { return *gridVariablesCachePtr_; }
399
405 { return { *this }; }
406
407private:
409
410 const ElementInterpolationPointDataCache& ipDataCache() const
411 {
412 if constexpr (GridVariablesCache::interpolationPointDataCachingEnabled)
413 return gridVariablesCache().cache(eIdx_);
414 else
415 return ipDataCache_.get(gridVariablesCache().problem(), variables_);
416 }
417
418 const GridVariablesCache* gridVariablesCachePtr_;
419 std::vector<Variables> variables_;
420 std::size_t eIdx_ = 0;
422};
423
424} // end namespace Dumux::Experimental::CVFE
425
426#endif
Interpolation point data at the quadrature points of the sub-control volume faces,...
Definition elementinterpolationpointdatacache.hh:128
An element cache that is updated on its first access after binding.
Definition lazyelementcache.hh:29
Definition variablesdeflectionpolicy.hh:29
Definition variablesdeflectionpolicy.hh:95
std::conditional_t< InterpolationPointData::isSolDependent, Dumux::Detail::CVFE::VariablesDeflectionPolicyWithIpCacheUpdate< MutableView, ElementDiscretization >, Dumux::Detail::CVFE::VariablesDeflectionPolicy< MutableView, ElementDiscretization > > DeflectionPolicy
export type of deflection policy
Definition cvfe/hybrid/elementvariables.hh:282
void bind(const typename ElementDiscretization::Element &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition cvfe/hybrid/elementvariables.hh:309
std::conditional_t< InterpolationPointData::isSolDependent, MutableVariablesViewWithIpCacheAccess, MutableVariablesView > MutableView
export type of the mutable version of the view
Definition cvfe/hybrid/elementvariables.hh:271
MutableView asMutableView(GridVariablesCache &)
return a local view on variables that is always mutable, regardless of the caching policy
Definition cvfe/hybrid/elementvariables.hh:404
HybridCVFEElementVariables(const GridVariablesCache &gridVarsCache)
Constructor.
Definition cvfe/hybrid/elementvariables.hh:289
friend const InterpolationPointData & cache(const HybridCVFEElementVariables &elemVars, const IpData &ipData)
Definition cvfe/hybrid/elementvariables.hh:382
GVC GridVariablesCache
export type of the grid variables cache
Definition cvfe/hybrid/elementvariables.hh:265
void bindElement(const typename ElementDiscretization::Element &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition cvfe/hybrid/elementvariables.hh:332
typename GridVariablesCache::InterpolationPointData InterpolationPointData
export interpolation point data
Definition cvfe/hybrid/elementvariables.hh:268
const GridVariablesCache & gridVariablesCache() const
The grid variables cache object we are a restriction of.
Definition cvfe/hybrid/elementvariables.hh:397
HybridCVFEElementVariables bindElement(const typename ElementDiscretization::Element &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition cvfe/hybrid/elementvariables.hh:322
HybridCVFEElementVariables bind(const typename ElementDiscretization::Element &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition cvfe/hybrid/elementvariables.hh:299
typename GridVariablesCache::Variables Variables
export type of the variables
Definition cvfe/hybrid/elementvariables.hh:278
const GridVariablesCache & gridVariablesCache() const
The grid variables cache object we are a restriction of.
Definition cvfe/hybrid/elementvariables.hh:194
void bindElement(const typename ElementDiscretization::Element &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition cvfe/hybrid/elementvariables.hh:183
std::conditional_t< InterpolationPointData::isSolDependent, Dumux::Detail::CVFE::VariablesDeflectionPolicyWithIpCacheUpdate< MutableView, ElementDiscretization >, Dumux::Detail::CVFE::VariablesDeflectionPolicy< MutableView, ElementDiscretization > > DeflectionPolicy
export type of deflection policy
Definition cvfe/hybrid/elementvariables.hh:106
MutableView asMutableView(GridVariablesCache &gridVars)
return a local view on variables that is always mutable, regardless of the caching policy
Definition cvfe/hybrid/elementvariables.hh:201
GVC GridVariablesCache
export type of the grid variables cache
Definition cvfe/hybrid/elementvariables.hh:89
std::conditional_t< InterpolationPointData::isSolDependent, MutableVariablesViewWithIpCacheAccess, MutableVariablesView > MutableView
export type of the mutable version of the view
Definition cvfe/hybrid/elementvariables.hh:95
typename GridVariablesCache::InterpolationPointData InterpolationPointData
export interpolation point data
Definition cvfe/hybrid/elementvariables.hh:92
void bind(const typename ElementDiscretization::Element &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &
Definition cvfe/hybrid/elementvariables.hh:160
friend const InterpolationPointData & cache(const HybridCVFEElementVariables &elemVars, const IpData &ipData)
Definition cvfe/hybrid/elementvariables.hh:129
HybridCVFEElementVariables bind(const typename ElementDiscretization::Element &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition cvfe/hybrid/elementvariables.hh:149
HybridCVFEElementVariables bindElement(const typename ElementDiscretization::Element &element, const ElementDiscretization &elemDisc, const SolutionVector &sol) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition cvfe/hybrid/elementvariables.hh:173
typename GridVariablesCache::Variables Variables
export type of the variables
Definition cvfe/hybrid/elementvariables.hh:102
HybridCVFEElementVariables(const GridVariablesCache &gridVariablesCache)
Constructor.
Definition cvfe/hybrid/elementvariables.hh:113
The (stencil) element variables class for hybrid control-volume finite element.
Definition cvfe/hybrid/elementvariables.hh:42
Type traits for problem classes.
Interpolation point data at the quadrature points of an element.
Element solution classes and factory functions.
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
decltype(auto) gridDiscretization(const T &t, Args &&... args)
The grid discretization.
Definition griddiscretization.hh:65
An element cache that is updated on its first access after binding.
Definition cvfe/hybrid/elementvariables.hh:32
auto localDofs(const FVElementGeometry &fvGeometry)
range over local dofs
Definition localdof.hh:50
Quadrature rules over sub-control volumes and sub-control volume faces.
Variables deflection policy.