12#ifndef DUMUX_DISCRETIZATION_CVFE_ELEMENT_FLUXVARSCACHE_HH 
   13#define DUMUX_DISCRETIZATION_CVFE_ELEMENT_FLUXVARSCACHE_HH 
   29template<
class GFVC, 
bool cachingEnabled>
 
   42    using GridFluxVariablesCache = GFVC;
 
   45    using FluxVariablesCache = 
typename GFVC::FluxVariablesCache;
 
   48    : gridFluxVarsCachePtr_(&global) {}
 
   52    template<
class FVElementGeometry, 
class ElementVolumeVariables>
 
   53    void bind(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
 
   54              const FVElementGeometry& fvGeometry,
 
   55              const ElementVolumeVariables& elemVolVars) &
 
   56    { bindElement(element, fvGeometry, elemVolVars); }
 
   63    template<
class FVElementGeometry, 
class ElementVolumeVariables>
 
   64    CVFEElementFluxVariablesCache bind(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
 
   65                                       const FVElementGeometry& fvGeometry,
 
   66                                       const ElementVolumeVariables& elemVolVars) &&
 
   68        this->bind(element, fvGeometry, elemVolVars);
 
   69        return std::move(*
this);
 
   72    template<
class FVElementGeometry, 
class ElementVolumeVariables>
 
   73    void bindElement(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
 
   74                     const FVElementGeometry& fvGeometry,
 
   75                     const ElementVolumeVariables& elemVolVars) &
 
   76    { eIdx_ = fvGeometry.gridGeometry().elementMapper().index(element); }
 
   83    template<
class FVElementGeometry, 
class ElementVolumeVariables>
 
   84    CVFEElementFluxVariablesCache bindElement(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
 
   85                                              const FVElementGeometry& fvGeometry,
 
   86                                              const ElementVolumeVariables& elemVolVars) &&
 
   88        this->bindElement(element, fvGeometry, elemVolVars);
 
   89        return std::move(*
this);
 
   92    template<
class FVElementGeometry, 
class ElementVolumeVariables>
 
   93    void bindScvf(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
 
   94                  const FVElementGeometry& fvGeometry,
 
   95                  const ElementVolumeVariables& elemVolVars,
 
   96                  const typename FVElementGeometry::SubControlVolumeFace& scvf) &
 
   97    { bindElement(element, fvGeometry, elemVolVars); }
 
  104    template<
class FVElementGeometry, 
class ElementVolumeVariables>
 
  105    CVFEElementFluxVariablesCache bindScvf(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
 
  106                                           const FVElementGeometry& fvGeometry,
 
  107                                           const ElementVolumeVariables& elemVolVars,
 
  108                                           const typename FVElementGeometry::SubControlVolumeFace& scvf) &&
 
  110        this->bindScvf(element, fvGeometry, elemVolVars, scvf);
 
  111        return std::move(*
this);
 
  115    template<
class FVElementGeometry, 
class ElementVolumeVariables>
 
  116    void update(
const typename FVElementGeometry::Element& element,
 
  117                const FVElementGeometry& fvGeometry,
 
  118                const ElementVolumeVariables& elemVolVars) {}
 
  121    template<
class SubControlVolumeFace>
 
  122    const FluxVariablesCache& operator [](
const SubControlVolumeFace& scvf)
 const 
  123    { 
return gridFluxVarsCache().cache(eIdx_, scvf.index()); }
 
  126    const GridFluxVariablesCache& gridFluxVarsCache()
 const 
  127    {  
return *gridFluxVarsCachePtr_; }
 
  130    const GridFluxVariablesCache* gridFluxVarsCachePtr_;
 
  149    : gridFluxVarsCachePtr_(&global) {}
 
 
  153    template<
class FVElementGeometry, 
class ElementVolumeVariables>
 
  154    void bind(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
 
  155              const FVElementGeometry& fvGeometry,
 
  156              const ElementVolumeVariables& elemVolVars) &
 
 
  166    template<
class FVElementGeometry, 
class ElementVolumeVariables>
 
  168                                       const FVElementGeometry& fvGeometry,
 
  169                                       const ElementVolumeVariables& elemVolVars) &&
 
  171        this->
bind(element, fvGeometry, elemVolVars);
 
  172        return std::move(*
this);
 
 
  175    template<
class FVElementGeometry, 
class ElementVolumeVariables>
 
  176    void bindElement(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
 
  177                     const FVElementGeometry& fvGeometry,
 
  178                     const ElementVolumeVariables& elemVolVars) &
 
  181        fluxVarsCache_.resize(fvGeometry.numScvf());
 
  182        for (
auto&& scvf : scvfs(fvGeometry))
 
  183            (*this)[scvf].update(
gridFluxVarsCache().problem(), element, fvGeometry, elemVolVars, scvf);
 
 
  191    template<
class FVElementGeometry, 
class ElementVolumeVariables>
 
  193                                              const FVElementGeometry& fvGeometry,
 
  194                                              const ElementVolumeVariables& elemVolVars) &&
 
  196        this->
bindElement(element, fvGeometry, elemVolVars);
 
  197        return std::move(*
this);
 
 
  200    template<
class FVElementGeometry, 
class ElementVolumeVariables>
 
  201    void bindScvf(
const typename FVElementGeometry::GridGeometry::GridView::template Codim<0>::Entity& element,
 
  202                  const FVElementGeometry& fvGeometry,
 
  203                  const ElementVolumeVariables& elemVolVars,
 
  204                  const typename FVElementGeometry::SubControlVolumeFace& scvf) &
 
  206        fluxVarsCache_.resize(fvGeometry.numScvf());
 
  207        (*this)[scvf].update(
gridFluxVarsCache().problem(), element, fvGeometry, elemVolVars, scvf);
 
 
  215    template<
class FVElementGeometry, 
class ElementVolumeVariables>
 
  217                                           const FVElementGeometry& fvGeometry,
 
  218                                           const ElementVolumeVariables& elemVolVars,
 
  219                                           const typename FVElementGeometry::SubControlVolumeFace& scvf) &&
 
  221        this->
bindScvf(element, fvGeometry, elemVolVars, scvf);
 
  222        return std::move(*
this);
 
 
  229    template<
class FVElementGeometry, 
class ElementVolumeVariables>
 
  230    void update(
const typename FVElementGeometry::Element& element,
 
  231                const FVElementGeometry& fvGeometry,
 
  232                const ElementVolumeVariables& elemVolVars)
 
  234        if constexpr (FluxVariablesCache::isSolDependent)
 
  236            fluxVarsCache_.resize(fvGeometry.numScvf());
 
  237            for (
const auto& scvf : scvfs(fvGeometry))
 
  238                (*this)[scvf].update(
gridFluxVarsCache().problem(), element, fvGeometry, elemVolVars, scvf);
 
 
  243    template<
class SubControlVolumeFace>
 
  245    { 
return fluxVarsCache_[scvf.index()]; }
 
 
  248    template<
class SubControlVolumeFace>
 
  250    { 
return fluxVarsCache_[scvf.index()]; }
 
 
  254    {  
return *gridFluxVarsCachePtr_; }
 
 
  257    const GridFluxVariablesCache* gridFluxVarsCachePtr_;
 
  258    std::vector<FluxVariablesCache> fluxVarsCache_;
 
 
const GridFluxVariablesCache & gridFluxVarsCache() const
The global object we are a restriction of.
Definition discretization/cvfe/elementfluxvariablescache.hh:253
GFVC GridFluxVariablesCache
export the type of the grid flux variables cache
Definition discretization/cvfe/elementfluxvariablescache.hh:143
void bindScvf(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const typename FVElementGeometry::SubControlVolumeFace &scvf) &
Definition discretization/cvfe/elementfluxvariablescache.hh:201
CVFEElementFluxVariablesCache bindElement(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition discretization/cvfe/elementfluxvariablescache.hh:192
CVFEElementFluxVariablesCache bindScvf(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const typename FVElementGeometry::SubControlVolumeFace &scvf) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition discretization/cvfe/elementfluxvariablescache.hh:216
CVFEElementFluxVariablesCache bind(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition discretization/cvfe/elementfluxvariablescache.hh:167
CVFEElementFluxVariablesCache(const GridFluxVariablesCache &global)
Definition discretization/cvfe/elementfluxvariablescache.hh:148
void update(const typename FVElementGeometry::Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars)
Update the caches if the volume variables have changed and the cache is solution-dependent.
Definition discretization/cvfe/elementfluxvariablescache.hh:230
void bindElement(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &
Definition discretization/cvfe/elementfluxvariablescache.hh:176
void bind(const typename FVElementGeometry::GridGeometry::GridView::template Codim< 0 >::Entity &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars) &
Definition discretization/cvfe/elementfluxvariablescache.hh:154
typename GFVC::FluxVariablesCache FluxVariablesCache
export the type of the flux variables cache
Definition discretization/cvfe/elementfluxvariablescache.hh:146
The flux variables caches for an element.
Definition discretization/cvfe/elementfluxvariablescache.hh:31