From b69ceb54a789e360df921aca5309c0fe35d126f7 Mon Sep 17 00:00:00 2001 From: sergio Date: Tue, 7 Sep 2021 16:51:06 -0700 Subject: [PATCH] ENH: Adding shear stress to the film from the wall function TUT: inclinedPlaneFilm/pitzDailyWithSprinklers: add shearStress model --- .../liquidFilm/liquidFilmBase.C | 9 +- .../liquidFilm/liquidFilmBase.H | 5 +- .../filmTurbulenceModel/filmTurbulenceModel.C | 186 +++++++++++++++++- .../filmTurbulenceModel/filmTurbulenceModel.H | 36 +++- .../filmTurbulenceModel/laminar/laminar.C | 48 ++--- .../filmTurbulenceModel/laminar/laminar.H | 24 +-- .../pimpleFoam/laminar/inclinedPlaneFilm/0/U | 1 + .../pitzDailyWithSprinklers/0/U | 1 + 8 files changed, 265 insertions(+), 45 deletions(-) diff --git a/src/regionFaModels/liquidFilm/liquidFilmBase.C b/src/regionFaModels/liquidFilm/liquidFilmBase.C index 5ae3955485..d5a49af125 100644 --- a/src/regionFaModels/liquidFilm/liquidFilmBase.C +++ b/src/regionFaModels/liquidFilm/liquidFilmBase.C @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2020 OpenCFD Ltd. + Copyright (C) 2020-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -551,6 +551,13 @@ scalar liquidFilmBase::pRef() return pRef_; } + +word liquidFilmBase::UName() const +{ + return UName_; +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace areaSurfaceFilmModels diff --git a/src/regionFaModels/liquidFilm/liquidFilmBase.H b/src/regionFaModels/liquidFilm/liquidFilmBase.H index 8bbce9f9b5..b51d8d6f45 100644 --- a/src/regionFaModels/liquidFilm/liquidFilmBase.H +++ b/src/regionFaModels/liquidFilm/liquidFilmBase.H @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2020 OpenCFD Ltd. + Copyright (C) 2020-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -261,6 +261,9 @@ public: //- Access to pRef scalar pRef(); + //- Name of the U field + word UName() const; + // Transfer fields - to the primary region (lagragian injection) diff --git a/src/regionFaModels/liquidFilm/subModels/kinematic/filmTurbulenceModel/filmTurbulenceModel/filmTurbulenceModel.C b/src/regionFaModels/liquidFilm/subModels/kinematic/filmTurbulenceModel/filmTurbulenceModel/filmTurbulenceModel.C index 31b157bd08..44a0789878 100644 --- a/src/regionFaModels/liquidFilm/subModels/kinematic/filmTurbulenceModel/filmTurbulenceModel/filmTurbulenceModel.C +++ b/src/regionFaModels/liquidFilm/subModels/kinematic/filmTurbulenceModel/filmTurbulenceModel/filmTurbulenceModel.C @@ -27,6 +27,8 @@ License #include "filmTurbulenceModel.H" #include "gravityMeshObject.H" +#include "turbulentTransportModel.H" +#include "turbulentFluidThermoModel.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -55,6 +57,17 @@ filmTurbulenceModel::frictionMethodTypeNames_ }; +const Enum +< + filmTurbulenceModel::shearMethodType +> +filmTurbulenceModel::shearMethodTypeNames_ +{ + { shearMethodType::msimple, "simple" }, + { shearMethodType::mwallFunction, "wallFunction" } +}; + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // filmTurbulenceModel::filmTurbulenceModel @@ -66,8 +79,16 @@ filmTurbulenceModel::filmTurbulenceModel : film_(film), dict_(dict.subDict(modelType + "Coeffs")), - method_(frictionMethodTypeNames_.get("friction", dict_)) -{} + method_(frictionMethodTypeNames_.get("friction", dict_)), + shearMethod_(shearMethodTypeNames_.get("shearStress", dict_)), + rhoName_(dict_.getOrDefault("rho", "rho")), + rhoRef_(VGREAT) +{ + if (rhoName_ == "rhoInf") + { + rhoRef_ = dict_.get("rhoInf"); + } +} // * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // @@ -168,6 +189,167 @@ tmp filmTurbulenceModel::Cw() const } +tmp filmTurbulenceModel::primaryRegionFriction +( + areaVectorField& U +) const +{ + tmp tshearStress + ( + new faVectorMatrix(U, sqr(U.dimensions())*sqr(dimLength)) + ); + + switch (shearMethod_) + { + case msimple: + { + tmp Up = film_.Up(); + + const dimensionedScalar Cf + ( + "Cf", + dimVelocity, + dict_.get("Cf") + ); + + tshearStress.ref() += - fam::Sp(Cf, U) + Cf*Up(); + + break; + } + case mwallFunction: + { + tmp tdevRhoReff = devRhoReff(); + + const volSymmTensorField::Boundary& devRhoReffb + = tdevRhoReff().boundaryField(); + + const label patchi = film_.patchID(); + + const surfaceVectorField::Boundary& Sfb = + film_.primaryMesh().Sf().boundaryField(); + + vectorField fT(Sfb[patchi] & devRhoReffb[patchi]); + + const vectorField& nHat = + film_.regionMesh().faceAreaNormals().internalField(); + + // Substract normal component + fT -= nHat*(fT & nHat); + + auto taForce = tmp::New + ( + IOobject + ( + "taForce", + film_.primaryMesh().time().timeName(), + film_.primaryMesh() + ), + film_.regionMesh(), + dimensionedVector(sqr(dimVelocity), Zero) + ); + vectorField& aForce = taForce.ref().primitiveFieldRef(); + + // Map ft to surface + const vectorField afT(film_.vsm().mapToSurface(fT)); + + const DimensionedField& magSf = + film_.regionMesh().S(); + + aForce = afT/(film_.rho().primitiveField()*magSf); + + tshearStress.ref() += taForce(); + + if (film_.regionMesh().time().writeTime()) + { + taForce().write(); + } + + break; + } + } + + return tshearStress; +} + + +tmp filmTurbulenceModel::devRhoReff() const +{ + typedef compressible::turbulenceModel cmpTurbModel; + typedef incompressible::turbulenceModel icoTurbModel; + + const fvMesh& m = film_.primaryMesh(); + + const auto& U = m.lookupObject(film_.UName()); + + if (m.foundObject(cmpTurbModel::propertiesName)) + { + const auto& turb = + m.lookupObject(cmpTurbModel::propertiesName); + + return turb.devRhoReff(); + } + else if (m.foundObject(icoTurbModel::propertiesName)) + { + const auto& turb = + m.lookupObject(icoTurbModel::propertiesName); + + return rho()*turb.devReff(); + } + else if (m.foundObject(fluidThermo::dictName)) + { + const auto& thermo = + m.lookupObject(fluidThermo::dictName); + + return -thermo.mu()*dev(twoSymm(fvc::grad(U))); + } + else if (m.foundObject("transportProperties")) + { + const auto& laminarT = + m.lookupObject("transportProperties"); + + return -rho()*laminarT.nu()*dev(twoSymm(fvc::grad(U))); + } + else if (m.foundObject("transportProperties")) + { + const auto& transportProperties = + m.lookupObject("transportProperties"); + + const dimensionedScalar nu("nu", dimViscosity, transportProperties); + + return -rho()*nu*dev(twoSymm(fvc::grad(U))); + } + else + { + FatalErrorInFunction + << "No valid model for viscous stress calculation" + << exit(FatalError); + + return volSymmTensorField::null(); + } +} + + +tmp filmTurbulenceModel::rho() const +{ + const fvMesh& m = film_.primaryMesh(); + if (rhoName_ == "rhoInf") + { + return tmp::New + ( + IOobject + ( + "rho", + m.time().timeName(), + m + ), + m, + dimensionedScalar(dimDensity, rhoRef_) + ); + } + + return m.lookupObject(rhoName_); +} + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace areaSurfaceFilmModels diff --git a/src/regionFaModels/liquidFilm/subModels/kinematic/filmTurbulenceModel/filmTurbulenceModel/filmTurbulenceModel.H b/src/regionFaModels/liquidFilm/subModels/kinematic/filmTurbulenceModel/filmTurbulenceModel/filmTurbulenceModel.H index 5e1a9284e7..69ce7cea26 100644 --- a/src/regionFaModels/liquidFilm/subModels/kinematic/filmTurbulenceModel/filmTurbulenceModel/filmTurbulenceModel.H +++ b/src/regionFaModels/liquidFilm/subModels/kinematic/filmTurbulenceModel/filmTurbulenceModel/filmTurbulenceModel.H @@ -82,6 +82,13 @@ public: mManningStrickler }; + //- Options for the shear stress models + enum shearMethodType + { + msimple, + mwallFunction + }; + protected: @@ -93,12 +100,24 @@ protected: //- Names for friction models static const Enum frictionMethodTypeNames_; + //- Names for shear stress models + static const Enum shearMethodTypeNames_; + //- Model dictionary const dictionary dict_; //- Method used const frictionMethodType method_; + //- Shear method used + const shearMethodType shearMethod_; + + //- Name of density field (optional) + word rhoName_; + + //- Reference density needed for incompressible calculations + scalar rhoRef_; + public: @@ -154,7 +173,19 @@ public: const liquidFilmBase& film() const; - // Evaluation + // Turbulence + + //- Return the effective viscous stress (laminar + turbulent) + tmp devRhoReff() const; + + //- Return primary region friction + tmp primaryRegionFriction + ( + areaVectorField& U + ) const; + + //- Return rho if specified otherwise rhoRef + tmp rho() const; //- Return the wall film surface friction virtual tmp Cw() const; @@ -162,6 +193,9 @@ public: //- Return the film turbulence viscosity virtual tmp mut() const = 0; + + // Evaluation + //- Correct/update the model virtual void correct() = 0; diff --git a/src/regionFaModels/liquidFilm/subModels/kinematic/filmTurbulenceModel/laminar/laminar.C b/src/regionFaModels/liquidFilm/subModels/kinematic/filmTurbulenceModel/laminar/laminar.C index 7630e25466..7859246570 100644 --- a/src/regionFaModels/liquidFilm/subModels/kinematic/filmTurbulenceModel/laminar/laminar.C +++ b/src/regionFaModels/liquidFilm/subModels/kinematic/filmTurbulenceModel/laminar/laminar.C @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2020 OpenCFD Ltd. + Copyright (C) 2020-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -51,14 +51,7 @@ laminar::laminar const dictionary& dict ) : - filmTurbulenceModel(type(), film, dict), - Cf_(dict_.get("Cf")) -{} - - -// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // - -laminar::~laminar() + filmTurbulenceModel(type(), film, dict) {} @@ -66,20 +59,19 @@ laminar::~laminar() tmp laminar::mut() const { - auto tmut = - tmp::New + auto tmut = tmp::New + ( + IOobject ( - IOobject - ( - "mut", - film().primaryMesh().time().timeName(), - film().primaryMesh(), - IOobject::NO_READ, - IOobject::NO_WRITE - ), - film().regionMesh(), - dimensionedScalar(dimMass/dimLength/dimTime) - ); + "mut", + film().primaryMesh().time().timeName(), + film().primaryMesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + film().regionMesh(), + dimensionedScalar(dimMass/dimLength/dimTime) + ); return tmut; } @@ -90,19 +82,19 @@ void laminar::correct() tmp laminar::Su(areaVectorField& U) const +{ + return primaryRegionFriction(U) + wallFriction(U); +} + + +tmp laminar::wallFriction(areaVectorField& U) const { // local references to film fields tmp Uw = film_.Uw(); - tmp Up = film_.Up(); - - // employ simple coeff-based model - const dimensionedScalar Cf("Cf", dimVelocity, Cf_); - tmp wf = Cw(); return ( - - fam::Sp(Cf, U) + Cf*Up() // surface contribution - fam::Sp(wf(), U) + wf()*Uw() // wall contribution ); } diff --git a/src/regionFaModels/liquidFilm/subModels/kinematic/filmTurbulenceModel/laminar/laminar.H b/src/regionFaModels/liquidFilm/subModels/kinematic/filmTurbulenceModel/laminar/laminar.H index b0e6b70541..64488aa23a 100644 --- a/src/regionFaModels/liquidFilm/subModels/kinematic/filmTurbulenceModel/laminar/laminar.H +++ b/src/regionFaModels/liquidFilm/subModels/kinematic/filmTurbulenceModel/laminar/laminar.H @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2020 OpenCFD Ltd. + Copyright (C) 2020-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -57,12 +57,6 @@ class laminar : public filmTurbulenceModel { - // Private Data - - //- Surface roughness coefficient - scalar Cf_; - - // Private Member Functions //- No copy construct @@ -85,21 +79,27 @@ public: //- Destructor - virtual ~laminar(); + virtual ~laminar() = default; // Member Functions - // Evolution + // Turbulence + + //- Wall friction + tmp wallFriction(areaVectorField& U) const; //- Return the film turbulence viscosity virtual tmp mut() const; - //- Correct/update the model - virtual void correct(); - //- Return the source for the film momentum equation virtual tmp Su(areaVectorField& U) const; + + + // Evaluation + + //- Correct/update the model + virtual void correct(); }; diff --git a/tutorials/incompressible/pimpleFoam/laminar/inclinedPlaneFilm/0/U b/tutorials/incompressible/pimpleFoam/laminar/inclinedPlaneFilm/0/U index a40b782ffe..b4f2534dd5 100644 --- a/tutorials/incompressible/pimpleFoam/laminar/inclinedPlaneFilm/0/U +++ b/tutorials/incompressible/pimpleFoam/laminar/inclinedPlaneFilm/0/U @@ -51,6 +51,7 @@ boundaryField laminarCoeffs { + shearStress simple; friction ManningStrickler; n 0.1; // Manning number Cf 0.9; // Gas friction diff --git a/tutorials/lagrangian/kinematicParcelFoam/pitzDailyWithSprinklers/0/U b/tutorials/lagrangian/kinematicParcelFoam/pitzDailyWithSprinklers/0/U index fc2264f16c..e250ac7e05 100644 --- a/tutorials/lagrangian/kinematicParcelFoam/pitzDailyWithSprinklers/0/U +++ b/tutorials/lagrangian/kinematicParcelFoam/pitzDailyWithSprinklers/0/U @@ -57,6 +57,7 @@ boundaryField laminarCoeffs { + shearStress simple; friction ManningStrickler; // Wall friction model n 0.005; // Manning number Cf 0; // Gas friction