24#ifndef DUMUX_RANS_PROBLEM_HH
25#define DUMUX_RANS_PROBLEM_HH
29#include <dune/common/fmatrix.hh>
43template<
class TypeTag, TurbulenceModel turbulenceModel>
47template<
class TypeTag>
58template<
class TypeTag>
67 using FVElementGeometry =
typename GridGeometry::LocalView;
68 using GridView =
typename GridGeometry::GridView;
69 using Element =
typename GridView::template Codim<0>::Entity;
70 using SubControlVolume =
typename FVElementGeometry::SubControlVolume;
71 using SubControlVolumeFace =
typename FVElementGeometry::SubControlVolumeFace;
74 using PrimaryVariables =
typename VolumeVariables::PrimaryVariables;
79 using GlobalPosition =
typename SubControlVolumeFace::GlobalPosition;
81 static constexpr auto dim = GridView::dimension;
82 static constexpr int numCorners = SubControlVolumeFace::numCornersPerFace;
83 using DimVector = GlobalPosition;
84 using DimMatrix = Dune::FieldMatrix<Scalar, dim, dim>;
86 struct WallElementInformation
89 unsigned int wallElementIdx;
91 unsigned int wallFaceNormalAxis;
93 GlobalPosition wallFaceCenter;
94 std::array<GlobalPosition, numCorners> wallFaceCorners;
104 RANSProblemBase(std::shared_ptr<const GridGeometry> gridGeometry,
const std::string& paramGroup =
"")
109 std::cout <<
"The parameter \"Rans.IsFlatWallBounded\" is not specified. \n"
110 <<
" -- Based on the grid and the boundary conditions specified by the user,"
111 <<
" this parameter is set to be "<< std::boolalpha <<
isFlatWallBounded() <<
"\n";
115 wallDistance_.resize(this->gridGeometry().elementMapper().size(), std::numeric_limits<Scalar>::max());
116 neighborIdx_.resize(this->gridGeometry().elementMapper().size());
117 velocity_.resize(this->gridGeometry().elementMapper().size(), DimVector(0.0));
118 velocityGradients_.resize(this->gridGeometry().elementMapper().size(), DimMatrix(0.0));
119 stressTensorScalarProduct_.resize(this->gridGeometry().elementMapper().size(), 0.0);
120 vorticityTensorScalarProduct_.resize(this->gridGeometry().elementMapper().size(), 0.0);
121 flowDirectionAxis_.resize(this->gridGeometry().elementMapper().size(), fixedFlowDirectionAxis_);
122 storedViscosity_.resize(this->gridGeometry().elementMapper().size(), 0.0);
123 storedDensity_.resize(this->gridGeometry().elementMapper().size(), 0.0);
131 std::cout <<
"Update static wall properties. ";
135 findWallDistances_();
136 findNeighborIndices_();
146 std::cout <<
"Update dynamic wall properties." << std::endl;
148 DUNE_THROW(Dune::InvalidStateException,
149 "You have to call updateStaticWallProperties() once before you call updateDynamicWallProperties().");
151 calculateCCVelocities_(curSol);
152 calculateCCVelocityGradients_();
153 calculateMaxMinVelocities_();
154 calculateStressTensor_();
155 calculateVorticityTensor_();
156 storeViscosities_(curSol);
167 const SubControlVolumeFace& scvf,
168 const int& eqIdx)
const
174 template<
class ElementVolumeVariables,
class ElementFaceVariables>
176 const FVElementGeometry& fvGeometry,
177 const ElementVolumeVariables& elemVolVars,
178 const ElementFaceVariables& elemFaceVars,
179 const SubControlVolumeFace& scvf,
180 const SubControlVolumeFace& lateralBoundaryFace)
const
181 {
return FacePrimaryVariables(0.0); }
186 template<
class ElementVolumeVariables,
class ElementFaceVariables>
188 const FVElementGeometry& fvGeometry,
189 const ElementVolumeVariables& elemVolVars,
190 const ElementFaceVariables& elemFaceVars,
191 const SubControlVolumeFace& scvf)
const
192 {
return CellCenterPrimaryVariables(0.0); }
199 [[deprecated(
"The isOnWall and IsOnWallAtPos functions will be removed after release 3.5. "
200 "Please use the Rans specific boundarytypes, and mark wall boundaries with the setWall() function.")]]
201 bool isOnWall(
const SubControlVolumeFace& scvf)
const
203 return asImp_().isOnWallAtPos(scvf.center());
208 static const bool hasAlignedWalls = hasAlignedWalls_();
209 return hasAlignedWalls;
231 = getParamFromGroup<Scalar>(this->paramGroup(),
"RANS.TurbulentPrandtlNumber", 1.0);
242 = getParamFromGroup<Scalar>(this->paramGroup(),
"RANS.TurbulentSchmidtNumber", 1.0);
249 DUNE_THROW(Dune::NotImplemented,
"\n Due to grid/geometric concerns, models requiring a wallNormalAxis "
250 <<
"can only be used for flat wall bounded flows. "
251 <<
"\n If your geometry is a flat channel, "
252 <<
"please set the runtime parameter RANS.IsFlatWallBounded to true. \n");
253 return wallNormalAxis_[elementIdx];
259 DUNE_THROW(Dune::NotImplemented,
"\n Due to grid/geometric concerns, models requiring a flowDirectionAxis "
260 <<
"can only be used for flat wall bounded flows. "
261 <<
"\n If your geometry is a flat channel, "
262 <<
"please set the runtime parameter RANS.IsFlatWallBounded to true. \n");
263 return flowDirectionAxis_[elementIdx];
269 DUNE_THROW(Dune::NotImplemented,
"\n Due to grid/geometric concerns, models requiring a wallElementIndex "
270 <<
"can only be used for flat wall bounded flows. "
271 <<
"\n If your geometry is a flat channel, "
272 <<
"please set the runtime parameter RANS.IsFlatWallBounded to true. \n");
273 return wallElementIdx_[elementIdx];
278 {
return wallDistance_[elementIdx]; }
282 const auto& element = this->gridGeometry().element(elementIdx);
283 return element.geometry().center();
286 unsigned int neighborIndex(
const int elementIdx,
const int axisIdx,
const int sideIdx)
const
287 {
return neighborIdx_[elementIdx][axisIdx][sideIdx];}
290 {
return velocity_[elementIdx]; }
292 Scalar
ccVelocity(
const int elementIdx,
const int axisIdx)
const
293 {
return velocity_[elementIdx][axisIdx]; }
296 {
return velocityMaximum_[elementIdx]; }
299 {
return velocityMinimum_[elementIdx]; }
302 {
return velocityGradients_[elementIdx]; }
305 {
return velocityGradients_[elementIdx][i][j]; }
308 {
return stressTensorScalarProduct_[elementIdx]; }
311 {
return vorticityTensorScalarProduct_[elementIdx]; }
314 {
return storedViscosity_[elementIdx]; }
317 {
return storedDensity_[elementIdx]; }
326 bool hasAlignedWalls_()
const
330 static const bool isFlatWallBounded = getParamFromGroup<bool>(this->paramGroup(),
"RANS.IsFlatWallBounded");
334 std::vector<int> wallFaceAxis;
335 wallFaceAxis.reserve(this->gridGeometry().numBoundaryScvf());
337 const auto gridView = this->gridGeometry().gridView();
338 auto fvGeometry =
localView(this->gridGeometry());
339 for (
const auto& element : elements(gridView))
341 fvGeometry.bindElement(element);
342 for (
const auto& scvf : scvfs(fvGeometry))
345 if constexpr (Deprecated::hasIsOnWall<Implementation, GlobalPosition>())
348 if (!scvf.boundary() && asImp_().isOnWall(scvf))
349 wallFaceAxis.push_back(scvf.directionIndex());
354 if (!scvf.boundary() && asImp_().boundaryTypes(element, scvf).hasWall())
355 wallFaceAxis.push_back(scvf.directionIndex());
361 return std::all_of(wallFaceAxis.begin(), wallFaceAxis.end(), [firstDir=wallFaceAxis[0]](
auto dir){ return (dir == firstDir);} ) ;
364 void checkForWalls_()
366 for (
const auto& element : elements(this->gridGeometry().gridView()))
368 auto fvGeometry =
localView(this->gridGeometry());
369 fvGeometry.bindElement(element);
370 for (
auto&& scvf : scvfs(fvGeometry))
371 if constexpr (!Deprecated::hasIsOnWall<Implementation, GlobalPosition>())
372 if (asImp_().boundaryTypes(element, scvf).hasWall())
377 if constexpr (!Deprecated::hasIsOnWall<Implementation, GlobalPosition>())
378 DUNE_THROW(Dune::InvalidStateException,
"No walls are are specified with the setWall() function");
386 void findWallDistances_()
389 if constexpr (Deprecated::hasIsOnWall<Implementation, GlobalPosition>())
392 [
this] (
const FVElementGeometry& fvGeometry,
const SubControlVolumeFace& scvf)
393 {
return asImp_().isOnWall(scvf); });
394 wallDistance_ = wallInformation.wallDistance();
395 storeWallElementAndDirectionIndex_(wallInformation.wallData());
400 [
this] (
const FVElementGeometry& fvGeometry,
const SubControlVolumeFace& scvf)
401 {
return asImp_().boundaryTypes(fvGeometry.element(), scvf).hasWall(); });
402 wallDistance_ = wallInformation.wallDistance();
403 storeWallElementAndDirectionIndex_(wallInformation.wallData());
407 template <
class WallData>
408 void storeWallElementAndDirectionIndex_(
const WallData& wallData)
412 DUNE_THROW(Dune::NotImplemented,
"The wall direction Index can only be calculated for quadrilateral structured grids");
417 wallNormalAxis_.resize(wallData.size());
418 wallElementIdx_.resize(wallData.size());
420 for (
const auto& element : elements(this->gridGeometry().gridView()))
422 unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
423 wallElementIdx_[elementIdx] = wallData[elementIdx].eIdx;
424 if ( ! (
hasParam(
"RANS.WallNormalAxis")) )
426 GlobalPosition wallOuterNormal = wallData[elementIdx].scvfOuterNormal;
427 if constexpr (dim == 2)
428 wallNormalAxis_[elementIdx] = (wallOuterNormal[0] == 1) ? 0 : 1;
430 wallNormalAxis_[elementIdx] = (wallOuterNormal[0] == 1) ? 0 : ((wallOuterNormal[1] == 1) ? 1 : 2);
433 wallNormalAxis_[elementIdx] = fixedWallNormalAxis_;
441 void findNeighborIndices_()
444 for (
const auto& element : elements(this->gridGeometry().gridView()))
446 unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
447 for (
unsigned int axisIdx = 0; axisIdx < dim; ++axisIdx)
449 neighborIdx_[elementIdx][axisIdx][0] = elementIdx;
450 neighborIdx_[elementIdx][axisIdx][1] = elementIdx;
453 for (
const auto& intersection : intersections(this->gridGeometry().gridView(), element))
455 if (intersection.boundary())
458 unsigned int neighborIdx = this->gridGeometry().elementMapper().index(intersection.outside());
459 for (
unsigned int axisIdx = 0; axisIdx < dim; ++axisIdx)
464 neighborIdx_[elementIdx][axisIdx][0] = neighborIdx;
467 neighborIdx_[elementIdx][axisIdx][1] = neighborIdx;
474 void calculateCCVelocities_(
const SolutionVector& curSol)
476 auto fvGeometry =
localView(this->gridGeometry());
478 for (
const auto& element : elements(this->gridGeometry().gridView()))
480 fvGeometry.bindElement(element);
481 unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
484 DimVector velocityTemp(0.0);
485 for (
auto&& scvf : scvfs(fvGeometry))
487 const int dofIdxFace = scvf.dofIndex();
488 const auto numericalSolutionFace = curSol[GridGeometry::faceIdx()][dofIdxFace][Indices::velocity(scvf.directionIndex())];
489 velocityTemp[scvf.directionIndex()] += numericalSolutionFace;
491 for (
unsigned int axisIdx = 0; axisIdx < dim; ++axisIdx)
492 velocity_[elementIdx][axisIdx] = velocityTemp[axisIdx] * 0.5;
497 void calculateCCVelocityGradients_()
502 auto fvGeometry =
localView(this->gridGeometry());
503 for (
const auto& element : elements(this->gridGeometry().gridView()))
505 const unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
507 for (
unsigned int j = 0; j < dim; ++j)
509 for (
unsigned int i = 0; i < dim; ++i)
511 const unsigned int neighborIndex0 =
neighborIndex(elementIdx, j, 0);
512 const unsigned int neighborIndex1 =
neighborIndex(elementIdx, j, 1);
514 velocityGradients_[elementIdx][i][j]
519 velocityGradients_[elementIdx][i][j] = 0.0;
523 fvGeometry.bindElement(element);
524 for (
auto&& scvf : scvfs(fvGeometry))
527 unsigned int axisIdx = scvf.directionIndex();
530 for (
unsigned int velIdx = 0; velIdx < dim; ++velIdx)
532 if (!asImp_().boundaryTypes(element, scvf).isDirichlet(Indices::velocity(velIdx)))
535 Scalar dirichletVelocity = asImp_().dirichlet(element, scvf)[Indices::velocity(velIdx)];
537 unsigned int neighborIdx =
neighborIndex(elementIdx, axisIdx, 0);
538 if (scvf.center()[axisIdx] <
cellCenter(elementIdx)[axisIdx])
541 velocityGradients_[elementIdx][velIdx][axisIdx]
542 = (
ccVelocity(neighborIdx, velIdx) - dirichletVelocity)
543 / (
cellCenter(neighborIdx)[axisIdx] - scvf.center()[axisIdx]);
548 std::vector<int> bjsNumFaces(dim, 0);
549 std::vector<unsigned int> bjsNeighbor(dim, 0);
550 DimVector bjsVelocityAverage(0.0);
551 DimVector normalNormCoordinate(0.0);
552 unsigned int velCompIdx = Indices::velocity(scvf.directionIndex());
553 const int numSubFaces = scvf.pairData().size();
554 for(
int localSubFaceIdx = 0; localSubFaceIdx < numSubFaces; ++localSubFaceIdx)
556 const auto& lateralFace = fvGeometry.scvf(scvf.insideScvIdx(), scvf.pairData()[localSubFaceIdx].localLateralFaceIdx);
559 unsigned int lateralAxisIdx = lateralFace.directionIndex();
560 if (lateralFace.boundary() && (asImp_().boundaryTypes(element, lateralFace).isBeaversJoseph(Indices::velocity(velCompIdx))))
562 unsigned int neighborIdx =
neighborIndex(elementIdx, lateralAxisIdx, 0);
563 if (lateralFace.center()[lateralAxisIdx] <
cellCenter(elementIdx)[lateralAxisIdx])
566 const SubControlVolume& scv = fvGeometry.scv(scvf.insideScvIdx());
567 bjsVelocityAverage[lateralAxisIdx] += ParentType::beaversJosephVelocity(element, scv, scvf, lateralFace,
ccVelocity(elementIdx, velCompIdx), 0.0);
568 if (bjsNumFaces[lateralAxisIdx] > 0 && neighborIdx != bjsNeighbor[lateralAxisIdx])
569 DUNE_THROW(Dune::InvalidStateException,
"Two different neighborIdx should not occur");
570 bjsNeighbor[lateralAxisIdx] = neighborIdx;
571 normalNormCoordinate[lateralAxisIdx] = lateralFace.center()[lateralAxisIdx];
572 bjsNumFaces[lateralAxisIdx]++;
575 for (
unsigned axisIdx = 0; axisIdx < dim; ++axisIdx)
577 if (bjsNumFaces[axisIdx] == 0)
580 unsigned int neighborIdx = bjsNeighbor[axisIdx];
581 bjsVelocityAverage[axisIdx] /= bjsNumFaces[axisIdx];
583 velocityGradients_[elementIdx][velCompIdx][axisIdx]
584 = (
ccVelocity(neighborIdx, velCompIdx) - bjsVelocityAverage[axisIdx])
585 / (
cellCenter(neighborIdx)[axisIdx] - normalNormCoordinate[axisIdx]);
592 void calculateMaxMinVelocities_()
601 velocityMaximum_.assign(this->gridGeometry().elementMapper().size(), DimVector(1e-16));
602 velocityMinimum_.assign(this->gridGeometry().elementMapper().size(), DimVector(std::numeric_limits<Scalar>::max()));
605 for (
const auto& element : elements(this->gridGeometry().gridView()))
607 const unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
608 Scalar maxVelocity = 0.0;
611 for (
unsigned int axisIdx = 0; axisIdx < dim; ++axisIdx)
613 if (abs(
ccVelocity(elementIdx, axisIdx)) > abs(velocityMaximum_[wallElementIdx][axisIdx]))
614 velocityMaximum_[wallElementIdx][axisIdx] =
ccVelocity(elementIdx, axisIdx);
616 if (abs(
ccVelocity(elementIdx, axisIdx)) < abs(velocityMinimum_[wallElementIdx][axisIdx]))
617 velocityMinimum_[wallElementIdx][axisIdx] =
ccVelocity(elementIdx, axisIdx);
620 if ((
hasParam(
"RANS.FlowDirectionAxis") != 1) && (maxVelocity) < abs(
ccVelocity(elementIdx, axisIdx)))
622 maxVelocity = abs(
ccVelocity(elementIdx, axisIdx));
623 flowDirectionAxis_[elementIdx] = axisIdx;
633 DimVector maxVelocity(0.0);
634 DimVector minVelocity(std::numeric_limits<Scalar>::max());
636 for (
const auto& element : elements(this->gridGeometry().gridView()))
638 const unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
640 for (
unsigned int axisIdx = 0; axisIdx < dim; ++axisIdx)
642 if (abs(
ccVelocity(elementIdx, axisIdx)) > abs(maxVelocity[axisIdx]))
643 maxVelocity[axisIdx] =
ccVelocity(elementIdx, axisIdx);
645 if (abs(
ccVelocity(elementIdx, axisIdx)) < abs(minVelocity[axisIdx]))
646 minVelocity[axisIdx] =
ccVelocity(elementIdx, axisIdx);
649 velocityMaximum_.assign(this->gridGeometry().elementMapper().size(), maxVelocity);
650 velocityMinimum_.assign(this->gridGeometry().elementMapper().size(), minVelocity);
654 void calculateStressTensor_()
656 for (
const auto& element : elements(this->gridGeometry().gridView()))
658 unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
659 Dune::FieldMatrix<Scalar, GridView::dimension, GridView::dimension> stressTensor(0.0);
660 for (
unsigned int j = 0; j < dim; ++j)
662 for (
unsigned int i = 0; i < dim; ++i)
668 stressTensorScalarProduct_[elementIdx] = 0.0;
669 for (
unsigned int j = 0; j < dim; ++j)
671 for (
unsigned int i = 0; i < dim; ++i)
673 stressTensorScalarProduct_[elementIdx] += stressTensor[j][i] * stressTensor[j][i];
679 void calculateVorticityTensor_()
681 for (
const auto& element : elements(this->gridGeometry().gridView()))
683 unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
684 Dune::FieldMatrix<Scalar, GridView::dimension, GridView::dimension> vorticityTensor(0.0);
685 for (
unsigned int j = 0; j < dim; ++j)
687 for (
unsigned int i = 0; i < dim; ++i)
693 vorticityTensorScalarProduct_[elementIdx] = 0.0;
694 for (
unsigned int j = 0; j < dim; ++j)
696 for (
unsigned int i = 0; i < dim; ++i)
698 vorticityTensorScalarProduct_[elementIdx] += vorticityTensor[j][i] * vorticityTensor[j][i];
704 void storeViscosities_(
const SolutionVector& curSol)
707 auto fvGeometry =
localView(this->gridGeometry());
708 for (
const auto& element : elements(this->gridGeometry().gridView()))
710 unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
711 fvGeometry.bindElement(element);
712 for (
auto&& scv : scvs(fvGeometry))
714 const int dofIdx = scv.dofIndex();
716 const auto& cellCenterPriVars = curSol[GridGeometry::cellCenterIdx()][dofIdx];
717 PrimaryVariables priVars = makePriVarsFromCellCenterPriVars<PrimaryVariables>(cellCenterPriVars);
718 auto elemSol = elementSolution<typename GridGeometry::LocalView>(std::move(priVars));
720 VolumeVariables volVars;
721 volVars.update(elemSol, asImp_(), element, scv);
722 storedDensity_[elementIdx] = volVars.density();
723 storedViscosity_[elementIdx] = volVars.viscosity();
728 const int fixedFlowDirectionAxis_ = getParam<int>(
"RANS.FlowDirectionAxis", 0);
729 const int fixedWallNormalAxis_ = getParam<int>(
"RANS.WallNormalAxis", 1);
731 std::vector<unsigned int> wallNormalAxis_;
732 std::vector<unsigned int> flowDirectionAxis_;
733 std::vector<Scalar> wallDistance_;
734 std::vector<unsigned int> wallElementIdx_;
735 std::vector<std::array<std::array<unsigned int, 2>, dim>> neighborIdx_;
737 std::vector<DimVector> velocity_;
738 std::vector<DimVector> velocityMaximum_;
739 std::vector<DimVector> velocityMinimum_;
740 std::vector<DimMatrix> velocityGradients_;
742 std::vector<Scalar> stressTensorScalarProduct_;
743 std::vector<Scalar> vorticityTensorScalarProduct_;
745 std::vector<Scalar> storedDensity_;
746 std::vector<Scalar> storedViscosity_;
749 Implementation &asImp_()
750 {
return *
static_cast<Implementation *
>(
this); }
753 const Implementation &asImp_()
const
754 {
return *
static_cast<const Implementation *
>(
this); }
Base class for all staggered fv problems.
Free function to get the local view of a grid cache object.
The available discretization methods in Dumux.
GridCache::LocalView localView(const GridCache &gridCache)
Free function to get the local view of a grid cache object.
Definition: localview.hh:38
bool hasParamInGroup(const std::string ¶mGroup, const std::string ¶m)
Check whether a key exists in the parameter tree with a model group prefix.
Definition: parameters.hh:177
bool hasParam(const std::string ¶m)
Check whether a key exists in the parameter tree.
Definition: parameters.hh:169
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property
Definition: propertysystem.hh:150
constexpr Staggered staggered
Definition: method.hh:140
static constexpr auto atElementCenters
Definition: walldistance.hh:113
Definition: freeflow/navierstokes/problem.hh:55
forward declare
Definition: freeflow/rans/problem.hh:44
Reynolds-Averaged Navier-Stokes problem base class.
Definition: freeflow/rans/problem.hh:60
unsigned int wallElementIndex(const int elementIdx) const
Definition: freeflow/rans/problem.hh:266
int flowDirectionAxis(const int elementIdx) const
Definition: freeflow/rans/problem.hh:256
void updateDynamicWallProperties(const SolutionVector &curSol)
Update the dynamic (solution dependent) turbulence parameters.
Definition: freeflow/rans/problem.hh:144
DimMatrix velocityGradientTensor(const int elementIdx) const
Definition: freeflow/rans/problem.hh:301
Scalar vorticityTensorScalarProduct(const int elementIdx) const
Definition: freeflow/rans/problem.hh:310
Scalar ccVelocity(const int elementIdx, const int axisIdx) const
Definition: freeflow/rans/problem.hh:292
void updateStaticWallProperties()
Update the static (solution independent) relations to the walls and neighbors.
Definition: freeflow/rans/problem.hh:129
GlobalPosition cellCenter(const int elementIdx) const
Definition: freeflow/rans/problem.hh:280
FacePrimaryVariables wallFunction(const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const ElementFaceVariables &elemFaceVars, const SubControlVolumeFace &scvf, const SubControlVolumeFace &lateralBoundaryFace) const
Returns an additional wall function momentum flux.
Definition: freeflow/rans/problem.hh:175
Scalar velocityGradient(const int elementIdx, const int i, const int j) const
Definition: freeflow/rans/problem.hh:304
DimVector velocityMaximum(const int elementIdx) const
Definition: freeflow/rans/problem.hh:295
const Scalar betaOmega() const
Returns the constant.
Definition: freeflow/rans/problem.hh:219
DimVector ccVelocityVector(const int elementIdx) const
Definition: freeflow/rans/problem.hh:289
Scalar kinematicViscosity(const int elementIdx) const
Definition: freeflow/rans/problem.hh:319
Scalar turbulentSchmidtNumber() const
Return the turbulent Schmidt number which is used to convert the eddy viscosity to an eddy diffusivi...
Definition: freeflow/rans/problem.hh:239
CellCenterPrimaryVariables wallFunction(const Element &element, const FVElementGeometry &fvGeometry, const ElementVolumeVariables &elemVolVars, const ElementFaceVariables &elemFaceVars, const SubControlVolumeFace &scvf) const
Returns an additional wall function flux for cell-centered quantities.
Definition: freeflow/rans/problem.hh:187
DimVector velocityMinimum(const int elementIdx) const
Definition: freeflow/rans/problem.hh:298
Scalar wallDistance(const int elementIdx) const
Definition: freeflow/rans/problem.hh:277
Scalar storedDensity(const int elementIdx) const
Definition: freeflow/rans/problem.hh:316
Scalar turbulentPrandtlNumber() const
Return the turbulent Prandtl number which is used to convert the eddy viscosity to an eddy thermal c...
Definition: freeflow/rans/problem.hh:228
int wallNormalAxis(const int elementIdx) const
Definition: freeflow/rans/problem.hh:246
unsigned int neighborIndex(const int elementIdx, const int axisIdx, const int sideIdx) const
Definition: freeflow/rans/problem.hh:286
RANSProblemBase(std::shared_ptr< const GridGeometry > gridGeometry, const std::string ¶mGroup="")
The constructor.
Definition: freeflow/rans/problem.hh:104
bool isFlatWallBounded() const
Definition: freeflow/rans/problem.hh:206
Scalar stressTensorScalarProduct(const int elementIdx) const
Definition: freeflow/rans/problem.hh:307
bool calledUpdateStaticWallProperties
Definition: freeflow/rans/problem.hh:322
bool useWallFunction(const Element &element, const SubControlVolumeFace &scvf, const int &eqIdx) const
Returns whether a wall function should be used at a given face.
Definition: freeflow/rans/problem.hh:166
const Scalar karmanConstant() const
Returns the Karman constant.
Definition: freeflow/rans/problem.hh:215
Scalar storedViscosity(const int elementIdx) const
Definition: freeflow/rans/problem.hh:313
bool isOnWall(const SubControlVolumeFace &scvf) const
Returns whether a given sub control volume face is on a wall.
Definition: freeflow/rans/problem.hh:201
Declares all properties used in Dumux.
Adaption of the fully implicit scheme to the tracer transport model.
The local element solution class for staggered methods.