diff --git a/dumux/freeflow/higherorderapproximation.hh b/dumux/freeflow/higherorderapproximation.hh index b6f35e5d1bb25f0b3e73cbeff5b2ebdbbe6dd41e..601bf115d219eec1d22c79af9b71e02e387feee5 100644 --- a/dumux/freeflow/higherorderapproximation.hh +++ b/dumux/freeflow/higherorderapproximation.hh @@ -242,12 +242,55 @@ public: } /** - * \brief Tvd Scheme: Total Variation Diminuishing - */ + * \brief Tvd Scheme: Total Variation Diminishing + * + */ Scalar tvd(const Scalar downstreamVelocity, const Scalar upstreamVelocity, const Scalar upUpstreamVelocity, - const Scalar density) const + const Scalar upstreamToDownstreamDistance, + const Scalar upUpstreamToUpstreamDistance, + const Scalar downstreamStaggeredCellSize, + const bool selfIsUpstream, + const Scalar density, + const TvdApproach tvdApproach) const + { + Scalar momentum = 0.0; + switch(tvdApproach) + { + case TvdApproach::uniform : + { + momentum += tvdUniform(downstreamVelocity, upstreamVelocity, upUpstreamVelocity, density); + break; + } + case TvdApproach::li : + { + momentum += tvdLi(downstreamVelocity, upstreamVelocity, upUpstreamVelocity, upstreamToDownstreamDistance, upUpstreamToUpstreamDistance, selfIsUpstream, density); + break; + } + case TvdApproach::hou : + { + momentum += tvdHou(downstreamVelocity, upstreamVelocity, upUpstreamVelocity, upstreamToDownstreamDistance, upUpstreamToUpstreamDistance, downstreamStaggeredCellSize, density); + break; + } + default: + { + DUNE_THROW(ParameterException, "\nThis Tvd Approach is not implemented.\n"); + break; + } + } + return momentum; + } + + /** + * \brief Tvd Scheme: Total Variation Diminishing + * + * This function assumes the cell size distribution to be uniform. + */ + Scalar tvdUniform(const Scalar downstreamVelocity, + const Scalar upstreamVelocity, + const Scalar upUpstreamVelocity, + const Scalar density) const { using std::isfinite; const Scalar ratio = (upstreamVelocity - upUpstreamVelocity) / (downstreamVelocity - upstreamVelocity); @@ -265,17 +308,17 @@ public: /** * \brief Tvd Scheme: Total Variation Diminishing * - * This functions manages the non uniformities of the grid according to [Li, Liao 2007]. + * This function manages the non uniformities of the grid according to [Li, Liao 2007]. * It tries to reconstruct the value for the velocity at the upstream-upstream point * if the grid was uniform. */ - Scalar tvd(const Scalar downstreamVelocity, - const Scalar upstreamVelocity, - const Scalar upUpstreamVelocity, - const Scalar upstreamToDownstreamDistance, - const Scalar upUpstreamToUpstreamDistance, - const bool selfIsUpstream, - const Scalar density) const + Scalar tvdLi(const Scalar downstreamVelocity, + const Scalar upstreamVelocity, + const Scalar upUpstreamVelocity, + const Scalar upstreamToDownstreamDistance, + const Scalar upUpstreamToUpstreamDistance, + const bool selfIsUpstream, + const Scalar density) const { using std::isfinite; // I need the information of selfIsUpstream to get the correct sign because upUpstreamToUpstreamDistance is always positive @@ -299,16 +342,16 @@ public: /** * \brief Tvd Scheme: Total Variation Diminishing * - * This functions manages the non uniformities of the grid according to [Hou, Simons, Hinkelmann 2007]. + * This function manages the non uniformities of the grid according to [Hou, Simons, Hinkelmann 2007]. * It should behave better then the Li's version in very stretched grids. */ - Scalar tvd(const Scalar downstreamVelocity, - const Scalar upstreamVelocity, - const Scalar upUpstreamVelocity, - const Scalar upstreamToDownstreamDistance, - const Scalar upUpstreamToUpstreamDistance, - const Scalar downstreamStaggeredCellSize, - const Scalar density) const + Scalar tvdHou(const Scalar downstreamVelocity, + const Scalar upstreamVelocity, + const Scalar upUpstreamVelocity, + const Scalar upstreamToDownstreamDistance, + const Scalar upUpstreamToUpstreamDistance, + const Scalar downstreamStaggeredCellSize, + const Scalar density) const { using std::isfinite; const Scalar ratio = (upstreamVelocity - upUpstreamVelocity) / (downstreamVelocity - upstreamVelocity) diff --git a/dumux/freeflow/navierstokes/staggered/fluxvariables.hh b/dumux/freeflow/navierstokes/staggered/fluxvariables.hh index 67fe4c4103e3a1e8026efb0ad3d3384b1d6761d7..448b046e25576b86f8a3b98daaebee8636e2b385 100644 --- a/dumux/freeflow/navierstokes/staggered/fluxvariables.hh +++ b/dumux/freeflow/navierstokes/staggered/fluxvariables.hh @@ -235,32 +235,7 @@ public: { if (canFrontalSecondOrder_(scvf, selfIsUpstream, velocities, distances, elemFaceVars[scvf])) { - switch (highOrder.tvdApproach()) - { - case TvdApproach::uniform : - { - momentum = highOrder.tvd(velocities[0], velocities[1], velocities[2], insideVolVars.density()); - break; - } - case TvdApproach::li : - { - momentum = highOrder.tvd(velocities[0], velocities[1], velocities[2], distances[0], distances[1], selfIsUpstream, insideVolVars.density()); - break; - } - case TvdApproach::hou : - { - momentum = highOrder.tvd(velocities[0], velocities[1], velocities[2], distances[0], distances[1], distances[2], insideVolVars.density()); - break; - } - default: - { - DUNE_THROW(ParameterException, "\nTvd approach " << static_cast<int>(highOrder.tvdApproach()) << " is not implemented.\n" << - static_cast<int>(TvdApproach::uniform) << ": Uniform Tvd\n" << - static_cast<int>(TvdApproach::li) << ": Li's approach\n" << - static_cast<int>(TvdApproach::hou) << ": Hou's approach"); - break; - } - } + momentum = highOrder.tvd(velocities[0], velocities[1], velocities[2], distances[0], distances[1], distances[2], selfIsUpstream, insideVolVars.density(), highOrder.tvdApproach()); } else momentum = highOrder.upwind(velocities[0], velocities[1], insideVolVars.density(), upwindWeight); @@ -464,32 +439,7 @@ private: { if (canLateralSecondOrder_(scvf, fvGeometry, selfIsUpstream, localSubFaceIdx, velocities, distances, problem, element, faceVars, lateralFaceHasDirichletPressure, lateralFaceHasBJS)) { - switch (highOrder.tvdApproach()) - { - case TvdApproach::uniform : - { - momentum = highOrder.tvd(velocities[0], velocities[1], velocities[2], selfIsUpstream ? insideVolVars.density() : outsideVolVars.density()); - break; - } - case TvdApproach::li : - { - momentum = highOrder.tvd(velocities[0], velocities[1], velocities[2], distances[0], distances[1], selfIsUpstream, selfIsUpstream ? insideVolVars.density() : outsideVolVars.density()); - break; - } - case TvdApproach::hou : - { - momentum = highOrder.tvd(velocities[0], velocities[1], velocities[2], distances[0], distances[1], distances[2], selfIsUpstream ? insideVolVars.density() : outsideVolVars.density()); - break; - } - default: - { - DUNE_THROW(ParameterException, "\nTvd approach " << static_cast<int>(highOrder.tvdApproach()) << " is not implemented.\n" << - static_cast<int>(TvdApproach::uniform) << ": Uniform Tvd\n" << - static_cast<int>(TvdApproach::li) << ": Li's approach\n" << - static_cast<int>(TvdApproach::hou) << ": Hou's approach"); - break; - } - } + momentum = highOrder.tvd(velocities[0], velocities[1], velocities[2], distances[0], distances[1], distances[2], selfIsUpstream, selfIsUpstream ? insideVolVars.density() : outsideVolVars.density(), highOrder.tvdApproach()); } else momentum = highOrder.upwind(velocities[0], velocities[1], selfIsUpstream ? insideVolVars.density() : outsideVolVars.density(), upwindWeight);