12#ifndef DUMUX_DISCRETIZATION_UPWINDSCHEME_HH
13#define DUMUX_DISCRETIZATION_UPWINDSCHEME_HH
21template<
class Gr
idGeometry,
class DiscretizationMethod>
29template<
class Gr
idGeometry>
35template<
class Variables,
class UpwindTermFunction,
class Scalar>
37 const Variables& outsideVars,
38 const UpwindTermFunction& upwindTerm,
39 Scalar flux,
int phaseIdx, Scalar upwindWeight)
43 return (upwindWeight*upwindTerm(outsideVars)
44 + (1.0 - upwindWeight)*upwindTerm(insideVars));
46 return (upwindWeight*upwindTerm(insideVars)
47 + (1.0 - upwindWeight)*upwindTerm(outsideVars));
51template<
class ElemVolVars,
class SubControlVolumeFace,
class UpwindTermFunction,
class Scalar>
53 const SubControlVolumeFace& scvf,
54 const UpwindTermFunction& upwindTerm,
55 Scalar flux,
int phaseIdx)
57 static const Scalar upwindWeight =
getParamFromGroup<Scalar>(elemVolVars.gridVolVars().problem().paramGroup(),
"Flux.UpwindWeight");
60 upwindTerm, flux, phaseIdx, upwindWeight);
66template<
class Gr
idGeometry,
class DM>
71 template<
class FluxVariables,
class UpwindTermFunction,
class Scalar>
72 static Scalar
apply(
const FluxVariables& fluxVars,
73 const UpwindTermFunction& upwindTerm,
74 Scalar flux,
int phaseIdx)
76 return apply(fluxVars.elemVolVars(), fluxVars.scvFace(), upwindTerm, flux, phaseIdx);
80 template<
class ElemVolVars,
class SubControlVolumeFace,
class UpwindTermFunction,
class Scalar>
81 static Scalar
apply(
const ElemVolVars& elemVolVars,
82 const SubControlVolumeFace& scvf,
83 const UpwindTermFunction& upwindTerm,
84 Scalar flux,
int phaseIdx)
86 return flux*
multiplier(elemVolVars, scvf, upwindTerm, flux, phaseIdx);
90 template<
class ElemVolVars,
class SubControlVolumeFace,
class UpwindTermFunction,
class Scalar>
92 const SubControlVolumeFace& scvf,
93 const UpwindTermFunction& upwindTerm,
94 Scalar flux,
int phaseIdx)
101template<
class Gr
idGeometry>
104 using GridView =
typename GridGeometry::GridView;
105 static constexpr int dim = GridView::dimension;
106 static constexpr int dimWorld = GridView::dimensionworld;
110 template<
class ElemVolVars,
class SubControlVolumeFace,
class UpwindTermFunction,
class Scalar>
112 const SubControlVolumeFace& scvf,
113 const UpwindTermFunction& upwindTerm,
114 Scalar flux,
int phaseIdx)
116 static_assert(dim == dimWorld,
"Multiplier cannot be computed on surface grids using cell-centered scheme!");
121 template<
class ElemVolVars,
class SubControlVolumeFace,
class UpwindTermFunction,
class Scalar>
122 static Scalar
apply(
const ElemVolVars& elemVolVars,
123 const SubControlVolumeFace& scvf,
124 const UpwindTermFunction& upwindTerm,
125 Scalar flux,
int phaseIdx)
127 static_assert(dim == dimWorld,
"This upwind scheme cannot be used on surface grids using cell-centered schemes!");
128 return flux*
multiplier(elemVolVars, scvf, upwindTerm, flux, phaseIdx);
132 template<
class FluxVariables,
class UpwindTermFunction,
class Scalar>
133 static Scalar
apply(
const FluxVariables& fluxVars,
134 const UpwindTermFunction& upwindTerm,
135 Scalar flux,
int phaseIdx)
137 const auto& scvf = fluxVars.scvFace();
138 const auto& elemVolVars = fluxVars.elemVolVars();
141 if constexpr (dim == dimWorld)
142 return apply(elemVolVars, scvf, upwindTerm, flux, phaseIdx);
145 if (scvf.numOutsideScvs() == 1)
150 const auto& insideVolVars = elemVolVars[scvf.insideScvIdx()];
152 Scalar branchingPointUpwindTerm = 0.0;
153 Scalar sumUpwindFluxes = 0.0;
158 return upwindTerm(insideVolVars)*flux;
160 sumUpwindFluxes += flux;
162 for (
unsigned int i = 0; i < scvf.numOutsideScvs(); ++i)
165 const auto& fvGeometry = fluxVars.fvGeometry();
166 const auto outsideScvIdx = scvf.outsideScvIdx(i);
167 const auto outsideElement = fvGeometry.gridGeometry().element(outsideScvIdx);
168 const auto& flippedScvf = fvGeometry.flipScvf(scvf.index(), i);
170 using AdvectionType =
typename FluxVariables::AdvectionType;
171 const auto outsideFlux = AdvectionType::flux(fluxVars.problem(),
177 fluxVars.elemFluxVarsCache());
179 if (!signbit(outsideFlux))
180 branchingPointUpwindTerm += upwindTerm(elemVolVars[outsideScvIdx])*outsideFlux;
182 sumUpwindFluxes += outsideFlux;
186 if (sumUpwindFluxes != 0.0)
187 branchingPointUpwindTerm /= -sumUpwindFluxes;
189 branchingPointUpwindTerm = 0.0;
195 return flux*branchingPointUpwindTerm;
197 return flux*upwindTerm(insideVolVars);
202template<
class Gr
idGeometry>
static Scalar apply(const FluxVariables &fluxVars, const UpwindTermFunction &upwindTerm, Scalar flux, int phaseIdx)
Definition flux/upwindscheme.hh:133
static Scalar apply(const ElemVolVars &elemVolVars, const SubControlVolumeFace &scvf, const UpwindTermFunction &upwindTerm, Scalar flux, int phaseIdx)
applies a simple upwind scheme to the precalculated advective flux across the given scvf
Definition flux/upwindscheme.hh:122
static Scalar multiplier(const ElemVolVars &elemVolVars, const SubControlVolumeFace &scvf, const UpwindTermFunction &upwindTerm, Scalar flux, int phaseIdx)
returns the upwind factor which is multiplied to the advective flux across the given scvf
Definition flux/upwindscheme.hh:111
static Scalar multiplier(const ElemVolVars &elemVolVars, const SubControlVolumeFace &scvf, const UpwindTermFunction &upwindTerm, Scalar flux, int phaseIdx)
returns the upwind factor which is multiplied to the advective flux across the given scvf
Definition flux/upwindscheme.hh:91
static Scalar apply(const ElemVolVars &elemVolVars, const SubControlVolumeFace &scvf, const UpwindTermFunction &upwindTerm, Scalar flux, int phaseIdx)
applies a simple upwind scheme to the precalculated advective flux across the given scvf
Definition flux/upwindscheme.hh:81
static Scalar apply(const FluxVariables &fluxVars, const UpwindTermFunction &upwindTerm, Scalar flux, int phaseIdx)
applies a simple upwind scheme to the precalculated advective flux
Definition flux/upwindscheme.hh:72
Forward declaration of the upwind scheme implementation.
Definition flux/upwindscheme.hh:22
UpwindSchemeImpl< GridGeometry, typename GridGeometry::DiscretizationMethod > UpwindScheme
The upwind scheme used for the advective fluxes. This depends on the chosen discretization method.
Definition flux/upwindscheme.hh:30
T getParamFromGroup(Args &&... args)
A free function to get a parameter from the parameter tree singleton with a model group.
Definition parameters.hh:165
The available discretization methods in Dumux.
Definition cellcentered/mpfa/elementvolumevariables.hh:24
Definition interpolate.hh:27
Definition cvfelocalresidual.hh:25
Scalar upwindSchemeMultiplier(const Variables &insideVars, const Variables &outsideVars, const UpwindTermFunction &upwindTerm, Scalar flux, int phaseIdx, Scalar upwindWeight)
returns the upwind factor which is multiplied to the advective flux between the two given variables
Definition flux/upwindscheme.hh:36
The infrastructure to retrieve run-time parameters from Dune::ParameterTrees.