12#ifndef DUMUX_NAVIERSTOKES_MOMENTUM_CVFE_FLUXVARIABLES_HH
13#define DUMUX_NAVIERSTOKES_MOMENTUM_CVFE_FLUXVARIABLES_HH
15#include <dune/common/fmatrix.hh>
34template<
class Problem,
35 class FVElementGeometry,
36 class ElementVolumeVariables,
37 class ElementFluxVariablesCache>
40 using Element =
typename FVElementGeometry::Element;
41 using SubControlVolumeFace =
typename FVElementGeometry::SubControlVolumeFace;
50 const SubControlVolumeFace& scvf
63 {
return fvGeometry_.element(); }
65 const SubControlVolumeFace&
scvFace()
const
69 {
return fvGeometry_; }
72 {
return elemVolVars_; }
75 {
return elemFluxVarsCache_; }
78 const Problem& problem_;
79 const FVElementGeometry& fvGeometry_;
80 const ElementVolumeVariables& elemVolVars_;
81 const ElementFluxVariablesCache& elemFluxVarsCache_;
82 const SubControlVolumeFace& scvf_;
94template<
class Problem,
95 class FVElementGeometry,
96 class ElementVolumeVariables,
100 using Element =
typename FVElementGeometry::Element;
101 using SubControlVolumeFace =
typename FVElementGeometry::SubControlVolumeFace;
102 using GlobalPosition =
typename Element::Geometry::GlobalCoordinate;
104 static constexpr int dim = FVElementGeometry::GridGeometry::GridView::dimension;
105 static constexpr int dimWorld = FVElementGeometry::GridGeometry::GridView::dimensionworld;
107 using Tensor = Dune::FieldMatrix<typename GlobalPosition::value_type, dim, dimWorld>;
125 calculateVelocity_();
126 calculateGradVelocity();
133 {
return fvGeometry_.element(); }
136 {
return fvGeometry_; }
139 {
return elemVolVars_; }
142 {
return velocity_; }
145 {
return gradVelocity_; }
148 void calculateVelocity_()
150 const auto& shapeValues = ipData_.shapeValues();
151 for (
const auto& localDof :
localDofs(fvGeometry_))
152 velocity_.axpy(shapeValues[localDof.index()][0], elemVolVars_[localDof.index()].velocity());
155 void calculateGradVelocity()
157 for (
const auto& localDof :
localDofs(fvGeometry_))
159 const auto& volVars = elemVolVars_[localDof.index()];
160 for (
int dir = 0; dir < dim; ++dir)
161 gradVelocity_[dir].axpy(volVars.velocity(dir), ipData_.gradN(localDof.index()));
165 const Problem& problem_;
166 const FVElementGeometry& fvGeometry_;
167 const ElementVolumeVariables& elemVolVars_;
168 const IpData& ipData_;
169 GlobalPosition velocity_;
170 Tensor gradVelocity_;
177template<
class Gr
idGeometry,
class NumEqVector>
180 using GridView =
typename GridGeometry::GridView;
181 using Element =
typename GridView::template Codim<0>::Entity;
182 using Scalar =
typename NumEqVector::value_type;
186 static constexpr int dim = GridView::dimension;
187 static constexpr int dimWorld = GridView::dimensionworld;
189 using Tensor = Dune::FieldMatrix<Scalar, dim, dimWorld>;
190 static_assert(NumEqVector::dimension == dimWorld,
"Wrong dimension of velocity vector");
196 template<
class Context>
199 if (!context.problem().enableInertiaTerms())
202 const auto& fvGeometry = context.fvGeometry();
203 const auto& elemVolVars = context.elemVolVars();
204 const auto& scvf = context.scvFace();
205 const auto& fluxVarCache = context.elemFluxVarsCache()[scvf];
206 const auto& shapeValues = fluxVarCache.shapeValues();
210 for (
const auto& localDof :
localDofs(fvGeometry))
211 v.axpy(shapeValues[localDof.index()][0], elemVolVars[localDof.index()].velocity());
214 const Scalar
density = context.problem().density(context.element(), context.fvGeometry(), fluxVarCache.ipData());
216 const auto vn = v*scvf.unitOuterNormal();
217 const auto& insideVolVars = elemVolVars[fvGeometry.scv(scvf.insideScvIdx())];
218 const auto& outsideVolVars = elemVolVars[fvGeometry.scv(scvf.outsideScvIdx())];
219 const auto upwindVelocity = vn > 0 ? insideVolVars.velocity() : outsideVolVars.velocity();
220 const auto downwindVelocity = vn > 0 ? outsideVolVars.velocity() : insideVolVars.velocity();
221 static const auto upwindWeight = getParamFromGroup<Scalar>(context.problem().paramGroup(),
"Flux.UpwindWeight");
222 const auto advectiveTermIntegrand =
density*vn * (upwindWeight * upwindVelocity + (1.0-upwindWeight)*downwindVelocity);
224 return advectiveTermIntegrand * Extrusion::area(fvGeometry, scvf) * insideVolVars.extrusionFactor();
230 template<
class Context>
233 const auto& element = context.element();
234 const auto& fvGeometry = context.fvGeometry();
235 const auto& elemVolVars = context.elemVolVars();
236 const auto& scvf = context.scvFace();
237 const auto& fluxVarCache = context.elemFluxVarsCache()[scvf];
241 for (
const auto& localDof :
localDofs(fvGeometry))
243 const auto& volVars = elemVolVars[localDof];
244 for (
int dir = 0; dir < dim; ++dir)
245 gradV[dir].axpy(volVars.velocity(dir), fluxVarCache.gradN(localDof.index()));
249 const auto mu = context.problem().effectiveViscosity(element, fvGeometry, fluxVarCache.ipData());
251 static const bool enableUnsymmetrizedVelocityGradient
252 = getParamFromGroup<bool>(context.problem().paramGroup(),
"FreeFlow.EnableUnsymmetrizedVelocityGradient",
false);
255 NumEqVector diffusiveFlux = enableUnsymmetrizedVelocityGradient ?
256 mv(gradV, scvf.unitOuterNormal())
259 diffusiveFlux *= -mu;
261 static const bool enableDilatationTerm = getParamFromGroup<bool>(context.problem().paramGroup(),
"FreeFlow.EnableDilatationTerm",
false);
262 if (enableDilatationTerm)
263 diffusiveFlux += 2.0/3.0 * mu *
trace(gradV) * scvf.unitOuterNormal();
265 diffusiveFlux *= Extrusion::area(fvGeometry, scvf) * elemVolVars[fvGeometry.scv(scvf.insideScvIdx())].extrusionFactor();
266 return diffusiveFlux;
269 template<
class Context>
272 const auto& element = context.element();
273 const auto& fvGeometry = context.fvGeometry();
274 const auto& elemVolVars = context.elemVolVars();
275 const auto& scvf = context.scvFace();
276 const auto& fluxVarCache = context.elemFluxVarsCache()[scvf];
279 const auto pressure = context.problem().pressure(element, fvGeometry, fluxVarCache.ipData());
285 const auto referencePressure = context.problem().referencePressure();
288 pn *= (
pressure-referencePressure)*Extrusion::area(fvGeometry, scvf)*elemVolVars[fvGeometry.scv(scvf.insideScvIdx())].extrusionFactor();
298template<
class Gr
idGeometry,
class NumEqVector>
301 using GridView =
typename GridGeometry::GridView;
302 using Element =
typename GridView::template Codim<0>::Entity;
303 using Scalar =
typename NumEqVector::value_type;
307 static constexpr int dim = GridView::dimension;
308 static constexpr int dimWorld = GridView::dimensionworld;
310 using Tensor = Dune::FieldMatrix<Scalar, dim, dimWorld>;
311 static_assert(NumEqVector::dimension == dimWorld,
"Wrong dimension of velocity vector");
317 template<
class Problem,
class FVElementGeometry,
class ElementVariables,
318 class ElementFluxVariablesCache,
class SubControlVolumeFace,
class VelocityVector>
320 const FVElementGeometry& fvGeometry,
321 const ElementVariables& elemVars,
322 const ElementFluxVariablesCache& elemFluxVarsCache,
323 const SubControlVolumeFace& scvf,
324 const VelocityVector& integratedVelocity)
const
326 if (!problem.enableInertiaTerms())
330 const Scalar
density = problem.density(fvGeometry.element(), fvGeometry, ipData(fvGeometry, scvf));
332 const auto vn_integral = integratedVelocity*scvf.unitOuterNormal();
333 const auto& insideVolVars = elemVars[fvGeometry.scv(scvf.insideScvIdx())];
334 const auto& outsideVolVars = elemVars[fvGeometry.scv(scvf.outsideScvIdx())];
335 const auto upwindVelocity = vn_integral > 0 ? insideVolVars.velocity() : outsideVolVars.velocity();
336 const auto downwindVelocity = vn_integral > 0 ? outsideVolVars.velocity() : insideVolVars.velocity();
337 static const auto upwindWeight = getParamFromGroup<Scalar>(problem.paramGroup(),
"Flux.UpwindWeight");
338 const auto advectiveFlux =
density*vn_integral * (upwindWeight * upwindVelocity + (1.0-upwindWeight)*downwindVelocity);
340 return advectiveFlux;
346 template<
class Context,
class IpData>
349 const auto& element = context.element();
350 const auto& fvGeometry = context.fvGeometry();
353 const auto mu = context.problem().effectiveViscosity(element, fvGeometry, ipData);
355 static const bool enableUnsymmetrizedVelocityGradient
356 = getParamFromGroup<bool>(context.problem().paramGroup(),
"FreeFlow.EnableUnsymmetrizedVelocityGradient",
false);
359 const auto& gradV = context.gradVelocity();
360 NumEqVector diffusiveFluxIntegrand = enableUnsymmetrizedVelocityGradient ?
361 mv(gradV, ipData.unitOuterNormal())
364 diffusiveFluxIntegrand *= -mu;
366 static const bool enableDilatationTerm = getParamFromGroup<bool>(context.problem().paramGroup(),
"FreeFlow.EnableDilatationTerm",
false);
367 if (enableDilatationTerm)
368 diffusiveFluxIntegrand += 2.0/3.0 * mu *
trace(gradV) * ipData.unitOuterNormal();
370 return diffusiveFluxIntegrand;
373 template<
class Context,
class IpData>
376 const auto& element = context.element();
377 const auto& fvGeometry = context.fvGeometry();
380 const auto pressure = context.problem().pressure(element, fvGeometry, ipData);
385 const auto referencePressure = context.problem().referencePressure();
The flux variables class for the Navier-Stokes model using control-volume finite element schemes.
Definition: flux.hh:179
NumEqVector advectiveMomentumFlux(const Context &context) const
Returns the advective momentum flux.
Definition: flux.hh:197
NumEqVector diffusiveMomentumFlux(const Context &context) const
Returns the diffusive momentum flux due to viscous forces.
Definition: flux.hh:231
NumEqVector pressureContribution(const Context &context) const
Definition: flux.hh:270
Context for computing fluxes.
Definition: flux.hh:39
const Element & element() const
Definition: flux.hh:62
const FVElementGeometry & fvGeometry() const
Definition: flux.hh:68
NavierStokesMomentumFluxContext(const Problem &problem, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const ElementFluxVariablesCache &elemFluxVarsCache, const SubControlVolumeFace &scvf)
Initialize the flux variables storing some temporary pointers.
Definition: flux.hh:45
const SubControlVolumeFace & scvFace() const
Definition: flux.hh:65
const ElementVolumeVariables & elemVolVars() const
Definition: flux.hh:71
const ElementFluxVariablesCache & elemFluxVarsCache() const
Definition: flux.hh:74
const Problem & problem() const
Definition: flux.hh:59
The flux function class for the Navier-Stokes model using control-volume finite element schemes.
Definition: flux.hh:300
NumEqVector pressureFluxIntegrand(const Context &context, const IpData &ipData) const
Definition: flux.hh:374
NumEqVector diffusiveMomentumFluxIntegrand(const Context &context, const IpData &ipData) const
Returns the diffusive momentum flux due to viscous forces.
Definition: flux.hh:347
NumEqVector advectiveMomentumFluxIntegral(const Problem &problem, const FVElementGeometry &fvGeometry, const ElementVariables &elemVars, const ElementFluxVariablesCache &elemFluxVarsCache, const SubControlVolumeFace &scvf, const VelocityVector &integratedVelocity) const
Returns the advective momentum flux contribution for a given integrated velocity at the face.
Definition: flux.hh:319
Context for interpolating data on interpolation points.
Definition: flux.hh:99
const FVElementGeometry & fvGeometry() const
Definition: flux.hh:135
const Element & element() const
Definition: flux.hh:132
const Problem & problem() const
Definition: flux.hh:129
const GlobalPosition & velocity() const
Definition: flux.hh:141
const Tensor & gradVelocity() const
Definition: flux.hh:144
NavierStokesMomentumFluxFunctionContext(const Problem &problem, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const IpData &ipData)
Initialize the flux variables storing some temporary pointers.
Definition: flux.hh:112
const ElementVolumeVariables & elemVolVars() const
Definition: flux.hh:138
Some exceptions thrown in DuMux
Helper classes to compute the integration elements.
Dune::DenseVector< V >::derived_type mv(const Dune::DenseMatrix< MAT > &M, const Dune::DenseVector< V > &v)
Returns the result of the projection of a vector v with a Matrix M.
Definition: math.hh:829
Dune::DenseMatrix< MatrixType >::field_type trace(const Dune::DenseMatrix< MatrixType > &M)
Trace of a dense matrix.
Definition: math.hh:800
Dune::FieldMatrix< Scalar, n, m > getTransposed(const Dune::FieldMatrix< Scalar, m, n > &M)
Transpose a FieldMatrix.
Definition: math.hh:712
typename NumEqVectorTraits< PrimaryVariables >::type NumEqVector
A vector with the same size as numbers of equations This is the default implementation and has to be ...
Definition: numeqvector.hh:34
Define some often used mathematical functions.
std::string pressure(int phaseIdx) noexcept
I/O name of pressure for multiphase systems.
Definition: name.hh:22
std::string density(int phaseIdx) noexcept
I/O name of density for multiphase systems.
Definition: name.hh:53
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition: extrusion.hh:166
auto localDofs(const FVElementGeometry &fvGeometry)
range over local dofs
Definition: localdof.hh:50
The infrastructure to retrieve run-time parameters from Dune::ParameterTrees.