diff --git a/src/TurbulenceModels/turbulenceModels/RAS/RASModel/RASModel.H b/src/TurbulenceModels/turbulenceModels/RAS/RASModel/RASModel.H index 6c74c26d90e807e87e4428e8f121629daac3e4eb..ed2a887cf16992b37d506b595fe622f0c94e60dc 100644 --- a/src/TurbulenceModels/turbulenceModels/RAS/RASModel/RASModel.H +++ b/src/TurbulenceModels/turbulenceModels/RAS/RASModel/RASModel.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2013-2017 OpenFOAM Foundation - Copyright (C) 2021 OpenCFD Ltd. + Copyright (C) 2021-2022 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -45,6 +45,8 @@ SourceFiles namespace Foam { +TemplateName(RASModelBase); + /*---------------------------------------------------------------------------*\ Class RASModel Declaration \*---------------------------------------------------------------------------*/ @@ -52,6 +54,7 @@ namespace Foam template<class BasicTurbulenceModel> class RASModel : + public RASModelBaseName, public BasicTurbulenceModel { diff --git a/src/functionObjects/field/Make/files b/src/functionObjects/field/Make/files index da6a53072743d9649c055a4dc832eb83cc478159..f94c5218315c5e296a8d749551507ef1ba5214bf 100644 --- a/src/functionObjects/field/Make/files +++ b/src/functionObjects/field/Make/files @@ -143,6 +143,13 @@ DMD/DMDModels/DMDModel/DMDModel.C DMD/DMDModels/DMDModel/DMDModelNew.C DMD/DMDModels/derived/STDMD/STDMD.C +resolutionIndex/resolutionIndex.C +resolutionIndex/resolutionIndexModels/resolutionIndexModel/resolutionIndexModel.C +resolutionIndex/resolutionIndexModels/resolutionIndexModel/resolutionIndexModelNew.C +resolutionIndex/resolutionIndexModels/PopeIndex/PopeIndex.C +resolutionIndex/resolutionIndexModels/CelikNuIndex/CelikNuIndex.C +resolutionIndex/resolutionIndexModels/CelikEtaIndex/CelikEtaIndex.C + age/age.C comfort/comfort.C diff --git a/src/functionObjects/field/resolutionIndex/resolutionIndex.C b/src/functionObjects/field/resolutionIndex/resolutionIndex.C new file mode 100644 index 0000000000000000000000000000000000000000..6950e475375d2390f8dd3a143c6831243cc12de3 --- /dev/null +++ b/src/functionObjects/field/resolutionIndex/resolutionIndex.C @@ -0,0 +1,123 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2022 OpenCFD Ltd. +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "resolutionIndex.H" +#include "resolutionIndexModel.H" +#include "turbulenceModel.H" +#include "RASModel.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace functionObjects +{ + defineTypeNameAndDebug(resolutionIndex, 0); + addToRunTimeSelectionTable(functionObject, resolutionIndex, dictionary); +} +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::functionObjects::resolutionIndex::resolutionIndex +( + const word& name, + const Time& runTime, + const dictionary& dict +) +: + fvMeshFunctionObject(name, runTime, dict), + resolutionIndexModelPtr_() +{ + read(dict); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::functionObjects::resolutionIndex::~resolutionIndex() +{} // resolutionIndexModel was forward declared + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::functionObjects::resolutionIndex::read(const dictionary& dict) +{ + if (mesh_.foundObject<RASModelBaseName>(turbulenceModel::propertiesName)) + { + FatalIOErrorInFunction(dict) + << type() << " " << name() + << " is not available for RANS-based turbulence models." + << exit(FatalIOError); + + return false; + } + + if (!fvMeshFunctionObject::read(dict)) + { + return false; + } + + Info<< type() << " " << name() << ":" << endl; + + resolutionIndexModelPtr_.reset + ( + resolutionIndexModel::New(name(), mesh_, dict) + ); + + return true; +} + + +bool Foam::functionObjects::resolutionIndex::execute() +{ + if (!resolutionIndexModelPtr_->execute()) + { + return false; + } + + return true; +} + + +bool Foam::functionObjects::resolutionIndex::write() +{ + Info<< type() << " " << name() << " write:" << endl; + + if (!resolutionIndexModelPtr_->write()) + { + return false; + } + Info<< endl; + + return true; +} + + +// ************************************************************************* // diff --git a/src/functionObjects/field/resolutionIndex/resolutionIndex.H b/src/functionObjects/field/resolutionIndex/resolutionIndex.H new file mode 100644 index 0000000000000000000000000000000000000000..7f4fefbc6a87eb3a5408b52374c9bdba54feebb0 --- /dev/null +++ b/src/functionObjects/field/resolutionIndex/resolutionIndex.H @@ -0,0 +1,191 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2022 OpenCFD Ltd. +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::functionObjects::resolutionIndex + +Group + grpFieldFunctionObjects + +Description + Computes a single-mesh resolution index according to the specified model, + which is used as a LES/DES quality/post-verification metric that does + not require any experimental or DNS data. + + Operands: + \table + Operand | Type | Location + input | vol\<Type\>Field(s) | \<time\>/\<inpField\> + output file | - | - + output field | volScalarField | \<time\>/\<outField\> + \endtable + + References: + \verbatim + Governing equation (tag:P): + Pope, S. B. (2000). + Turbulent flows. + Cambridge, UK: Cambridge Univ. Press + DOI:10.1017/CBO9780511840531 + + Governing equations (tag:CKJ): + Celik, I., Klein, M., & Janicka, J. (2009). + Assessment measures for engineering LES applications. + Journal of fluids engineering, 131(3). + DOI:10.1115/1.3059703 + \endverbatim + +Usage + Minimal example by using \c system/controlDict.functions: + \verbatim + resolutionIndex1 + { + // Mandatory entries + type resolutionIndex; + libs (fieldFunctionObjects); + model <word>; + + // Conditional entries + + // Option-1: when model == PopeIndex + + // Option-2: when model == CelikNuIndex + + // Option-3: when model == CelikEtaIndex + + // Inherited entries + ... + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Deflt + type | Type name: resolutionIndex | word | yes | - + libs | Library name: fieldFunctionObjects | word | yes | - + model | Name of the resolutionIndex model | word | yes | - + \endtable + + Options for the \c model entry: + \verbatim + PopeIndex | Resolution method proposed by Pope (2000) + CelikNuIndex | Resolution method proposed by Celik et al. (2009) + CelikEtaIndex | Resolution method proposed by Celik et al. (2009) + \endverbatim + + The inherited entries are elaborated in: + - \link functionObject.H \endlink + +Note + - The \c resolutionIndex throws runtime error + when the turbulence model is RANS based. + - Resolution-estimator models strictly assume that + the flow is in a fully turbulent regime. + +SourceFiles + resolutionIndex.C + +\*---------------------------------------------------------------------------*/ + +#ifndef Foam_functionObjects_resolutionIndex_H +#define Foam_functionObjects_resolutionIndex_H + +#include "fvMeshFunctionObject.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// Forward Declarations +class resolutionIndexModel; + +namespace functionObjects +{ + +/*---------------------------------------------------------------------------*\ + Class resolutionIndex Declaration +\*---------------------------------------------------------------------------*/ + +class resolutionIndex +: + public fvMeshFunctionObject +{ + // Private Data + + //- Resolution index model + autoPtr<resolutionIndexModel> resolutionIndexModelPtr_; + + +public: + + //- Runtime type information + TypeName("resolutionIndex"); + + + // Constructors + + //- Construct from Time and dictionary + resolutionIndex + ( + const word& name, + const Time& runTime, + const dictionary& dict + ); + + //- No copy construct + resolutionIndex(const resolutionIndex&) = delete; + + //- No copy assignment + void operator=(const resolutionIndex&) = delete; + + + // Destructor + virtual ~resolutionIndex(); + + + // Member Functions + + //- Read the resolutionIndex data + virtual bool read(const dictionary& dict); + + //- Calculate the result field + virtual bool execute(); + + //- Write the result field + virtual bool write(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace functionObjects +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/functionObjects/field/resolutionIndex/resolutionIndexModels/CelikEtaIndex/CelikEtaIndex.C b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/CelikEtaIndex/CelikEtaIndex.C new file mode 100644 index 0000000000000000000000000000000000000000..5d4c27f9d804b32f89fa746d8adc12ffdde66467 --- /dev/null +++ b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/CelikEtaIndex/CelikEtaIndex.C @@ -0,0 +1,185 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2022 OpenCFD Ltd. +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "CelikEtaIndex.H" +#include "resolutionIndexModel.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace resolutionIndexModels +{ + defineTypeNameAndDebug(CelikEtaIndex, 0); + addToRunTimeSelectionTable(resolutionIndexModel, CelikEtaIndex, dictionary); +} +} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +Foam::tmp<Foam::volScalarField> +Foam::resolutionIndexModels::CelikEtaIndex::eta() const +{ + const auto& nu = getOrReadField<volScalarField>(nuName_); + tmp<volScalarField> tepsilon = epsilon(); + + const dimensionedScalar epsilonMin(tepsilon.cref().dimensions(), SMALL); + + // (CKJ:Eq. 23) + return pow025(pow3(nu)/max(epsilonMin, tepsilon)); +} + + +Foam::tmp<Foam::volScalarField> +Foam::resolutionIndexModels::CelikEtaIndex::epsilon() const +{ + const auto& kSgs = getOrReadField<volScalarField>(kName_); + const auto& Delta = getOrReadField<volScalarField>(deltaName_); + tmp<volScalarField> tnuEff = nuEff(); + + // (Derived based on CKJ:Eq. 25-26, p.031102-5) + return tnuEff*kSgs/(Ck_*sqr(Delta)); +} + + +Foam::tmp<Foam::volScalarField> +Foam::resolutionIndexModels::CelikEtaIndex::nuEff() const +{ + const auto& nu = getOrReadField<volScalarField>(nuName_); + const auto& nuSgs = getOrReadField<volScalarField>(nutName_); + tmp<volScalarField> tnuNum = nuNum(); + + // (CKJ:p. 031102-3) + return tnuNum + nuSgs + nu; +} + + +Foam::tmp<Foam::volScalarField> +Foam::resolutionIndexModels::CelikEtaIndex::nuNum() const +{ + const auto& Delta = getOrReadField<volScalarField>(deltaName_); + + tmp<volScalarField> tkNum = kNum(); + + // (CKJ:Eq. 35) + return sign(tkNum.cref())*Cnu_*Delta*sqrt(mag(tkNum.cref())); +} + + +Foam::tmp<Foam::volScalarField> +Foam::resolutionIndexModels::CelikEtaIndex::kNum() const +{ + const auto& kSgs = getOrReadField<volScalarField>(kName_); + const auto& Delta = getOrReadField<volScalarField>(deltaName_); + + tmp<volScalarField> th = cbrt(V()); + + // (CKJ:Eq. 28) + return Cn_*sqr(th/Delta)*kSgs; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::resolutionIndexModels::CelikEtaIndex::CelikEtaIndex +( + const word& name, + const fvMesh& mesh, + const dictionary& dict +) +: + resolutionIndexModel(name, mesh, dict), + alphaEta_(), + m_(), + Cnu_(), + Cn_(), + Ck_(), + kName_(), + deltaName_(), + nuName_(), + nutName_() +{ + read(dict); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::resolutionIndexModels::CelikEtaIndex::read(const dictionary& dict) +{ + if (!resolutionIndexModel::read(dict)) + { + return false; + } + + // (Default values from CKJ:p. 031102-3, 031102-5) + alphaEta_ = dict.getOrDefault<scalar>("alphaEta", 0.05); + m_ = dict.getOrDefault<scalar>("m", 0.5); + Cnu_ = dict.getOrDefault<scalar>("Cnu", 0.1); + Cn_ = dict.getOrDefault<scalar>("Cn", 1.0); + Ck_ = dict.getOrDefault<scalar>("Ck", 0.0376); + kName_ = dict.getOrDefault<word>("k", "k"); + deltaName_ = dict.getOrDefault<word>("delta", "delta"); + nuName_ = dict.getOrDefault<word>("nu", "nu"); + nutName_ = dict.getOrDefault<word>("nut", "nut"); + + return true; +} + + +bool Foam::resolutionIndexModels::CelikEtaIndex::execute() +{ + // Calculate Kolmogorov and mesh length scales + tmp<volScalarField> teta = eta(); + tmp<volScalarField> th = cbrt(V()); + + // Calculate index field + auto& index = getOrReadField<volScalarField>(resultName()); + + // (CKJ:Eq. 9) + index = 1.0/(1.0 + alphaEta_*pow(th/teta, m_)); + index.correctBoundaryConditions(); + + return true; +} + + +bool Foam::resolutionIndexModels::CelikEtaIndex::write() +{ + const auto& index = getOrReadField<volScalarField>(resultName()); + + Info<< tab << "writing field:" << index.name() << endl; + + index.write(); + + return true; +} + + +// ************************************************************************* // diff --git a/src/functionObjects/field/resolutionIndex/resolutionIndexModels/CelikEtaIndex/CelikEtaIndex.H b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/CelikEtaIndex/CelikEtaIndex.H new file mode 100644 index 0000000000000000000000000000000000000000..a21c304213b996ff36aa3e4c4bc14b87432159bb --- /dev/null +++ b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/CelikEtaIndex/CelikEtaIndex.H @@ -0,0 +1,257 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2022 OpenCFD Ltd. +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::resolutionIndexModels::CelikEtaIndex + +Description + Computes a single-mesh resolution index according to Celik et al.'s index + using Kolmogorov length scale, which is used as a LES/DES quality/post + verification metric that does not require any experimental or DNS data. + + \f[ + \Gamma_{Celik,\eta}(\mathbf{x}, t) = + \frac{1}{1 + \alpha_\eta \left(\frac{h}{\eta_{eff}}\right)^m} + \f] + + with + + \f[ + \eta_{eff} = \left(\frac{\nu^3}{\epsilon}\right)^{1/4} + \f] + + \f[ + \epsilon = \nu_{eff} \frac{k_{sgs}}{C_k \Delta^2} + \f] + + \f[ + \nu_{eff} = \nu_{num} + \nu_{sgs} + \nu + \f] + + \f[ + \nu_{num} = {sgn}(k_{num}) C_\nu \Delta \sqrt{k_{num}} + \f] + + \f[ + k_{num} = C_n \left(\frac{h}{\Delta}\right)^2 k_{sgs} + \f] + + where + \vartable + \Gamma_{Celik,\eta}(\mathbf{x}, t) | Celik et al.'s index [-] + \alpha_\eta | Empirical constant [-] + h | Characteristic length scale with \f$h = V^{1/3} \f$ [m] + V | Cell volume [m^3] + \eta_{eff} | Kolmogorov length scale [m] + m | Empirical exponent [-] + \nu | Kinematic viscosity of fluid [m^2/s] + \epsilon | Kinetic energy dissipation rate [m^2/s^3] + \nu_{eff} | Effective eddy viscosity [m^2/s] + \nu_{num} | Numerical eddy viscosity [m^2/s] + \nu_{sgs} | Subgrid-scale eddy viscosity [m^2/s] + k_{num} | Numerical turbulent kinetic energy [m^2/s^2] + C_\nu | Empirical constant [-] + \Delta | Filter length scale [m] + k_{sgs} | Subgrid-scale turbulent kinetic energy [m^2/s^2] + C_n | Empirical constant [-] + C_k | Empirical constant [-] + \endvartable + + References: + \verbatim + Governing equations (tag:CCY): + Celik, I. B., Cehreli Z. N., Yavuz I. (2005). + Index of resolution quality for large eddy simulations. + Journal of Fluids Engineering. 127:949–958. + DOI:10.1115/1.1990201 + + Governing equations (tag:CKJ): + Celik, I., Klein, M., & Janicka, J. (2009). + Assessment measures for engineering LES applications. + Journal of fluids engineering, 131(3). + DOI:10.1115/1.3059703 + \endverbatim + +Usage + Minimal example by using \c system/controlDict.functions: + \verbatim + resolutionIndex1 + { + // Inherited entries + ... + model CelikEtaIndex; + + // Optional entries + alphaEta <scalar>; + m <scalar>; + Cnu <scalar>; + Cn <scalar>; + Ck <scalar>; + k <word>; + delta <word>; + nu <word>; + nut <word>; + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Deflt + model | Model name: CelikEtaIndex | word | yes | - + alphaEta | Empirical constant | scalar | no | 0.05 + m | Empirical exponent | scalar | no | 0.5 + Cnu | Empirical constant | scalar | no | 0.1 + Cn | Empirical constant | scalar | no | 1.0 + Ck | Empirical constant | scalar | no | 0.0376 + k | Name of subgrid-scale turbulent kinetic energy field <!-- + --> | word | no | k + delta | Name of filter field | word | no | delta + nu | Name of kinematic viscosity field | word | no | nu + nut | Name of subgrid-scale eddy viscosity field | word | no | nut + \endtable + +SourceFiles + CelikEtaIndex.C + +\*---------------------------------------------------------------------------*/ + +#ifndef Foam_resolutionIndexModels_CelikEtaIndex_H +#define Foam_resolutionIndexModels_CelikEtaIndex_H + +#include "resolutionIndexModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace resolutionIndexModels +{ + +/*---------------------------------------------------------------------------*\ + Class CelikEtaIndex Declaration +\*---------------------------------------------------------------------------*/ + +class CelikEtaIndex +: + public resolutionIndexModel +{ + // Private Data + + //- Empirical constant + scalar alphaEta_; + + //- Empirical exponent + scalar m_; + + //- Empirical constant + scalar Cnu_; + + //- Empirical constant + scalar Cn_; + + //- Empirical constant + scalar Ck_; + + //- Name of subgrid-scale turbulent kinetic energy field + word kName_; + + //- Name of filter field + word deltaName_; + + //- Name of kinematic viscosity field + word nuName_; + + //- Name of subgrid-scale eddy viscosity field + word nutName_; + + + // Private Member Functions + + //- Return Kolmogorov length scale field + tmp<volScalarField> eta() const; + + //- Return kinetic energy dissipation rate field + tmp<volScalarField> epsilon() const; + + //- Return effective eddy viscosity field + tmp<volScalarField> nuEff() const; + + //- Return numerical eddy viscosity field + tmp<volScalarField> nuNum() const; + + //- Return numerical turbulent kinetic energy field + tmp<volScalarField> kNum() const; + + +public: + + //- Runtime type information + TypeName("CelikEtaIndex"); + + + // Constructors + + //- Construct from components + CelikEtaIndex + ( + const word& name, + const fvMesh& mesh, + const dictionary& dict + ); + + //- No copy construct + CelikEtaIndex(const CelikEtaIndex&) = delete; + + //- No copy assignment + void operator=(const CelikEtaIndex&) = delete; + + + // Destructor + virtual ~CelikEtaIndex() = default; + + + // Member Functions + + //- Read top-level dictionary + virtual bool read(const dictionary& dict); + + //- Calculate the result field + virtual bool execute(); + + //- Write the result field + virtual bool write(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace resolutionIndexModels +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/functionObjects/field/resolutionIndex/resolutionIndexModels/CelikNuIndex/CelikNuIndex.C b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/CelikNuIndex/CelikNuIndex.C new file mode 100644 index 0000000000000000000000000000000000000000..6417f2b404361d159ea2f796b7e2265e3c578d62 --- /dev/null +++ b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/CelikNuIndex/CelikNuIndex.C @@ -0,0 +1,148 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2022 OpenCFD Ltd. +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "CelikNuIndex.H" +#include "resolutionIndexModel.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace resolutionIndexModels +{ + defineTypeNameAndDebug(CelikNuIndex, 0); + addToRunTimeSelectionTable(resolutionIndexModel, CelikNuIndex, dictionary); +} +} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +Foam::tmp<Foam::volScalarField> +Foam::resolutionIndexModels::CelikNuIndex::nuNum() const +{ + const auto& Delta = getOrReadField<volScalarField>(deltaName_); + + tmp<volScalarField> tkNum = kNum(); + + // (CKJ:Eq. 35) + return sign(tkNum.cref())*Cnu_*Delta*sqrt(tkNum.cref()); +} + + +Foam::tmp<Foam::volScalarField> +Foam::resolutionIndexModels::CelikNuIndex::kNum() const +{ + const auto& kSgs = getOrReadField<volScalarField>(kName_); + const auto& Delta = getOrReadField<volScalarField>(deltaName_); + + tmp<volScalarField> th = cbrt(V()); + + // (CKJ:Eq. 28) + return Cn_*sqr(th/Delta)*kSgs; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::resolutionIndexModels::CelikNuIndex::CelikNuIndex +( + const word& name, + const fvMesh& mesh, + const dictionary& dict +) +: + resolutionIndexModel(name, mesh, dict), + alphaNu_(), + n_(), + Cnu_(), + Cn_(), + kName_(), + deltaName_(), + nuName_(), + nutName_() +{ + read(dict); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::resolutionIndexModels::CelikNuIndex::read(const dictionary& dict) +{ + if (!resolutionIndexModel::read(dict)) + { + return false; + } + + // (Default values from CKJ:p. 031102-3, 031102-5) + alphaNu_ = dict.getOrDefault<scalar>("alphaNu", 0.05); + n_ = dict.getOrDefault<scalar>("n", 0.53); + Cnu_ = dict.getOrDefault<scalar>("Cnu", 0.1); + Cn_ = dict.getOrDefault<scalar>("Cn", 1.0); + kName_ = dict.getOrDefault<word>("k", "k"); + deltaName_ = dict.getOrDefault<word>("delta", "delta"); + nuName_ = dict.getOrDefault<word>("nu", "nu"); + nutName_ = dict.getOrDefault<word>("nut", "nut"); + + return true; +} + + +bool Foam::resolutionIndexModels::CelikNuIndex::execute() +{ + // Calculate effective eddy viscosity field + const auto& nu = getOrReadField<volScalarField>(nuName_); + const auto& nuSgs = getOrReadField<volScalarField>(nutName_); + tmp<volScalarField> tnuNum = nuNum(); + tmp<volScalarField> tnuEff = tnuNum + nuSgs + nu; + + // Calculate index field + auto& index = getOrReadField<volScalarField>(resultName()); + + // (CKJ:Eq. 10) + index = 1.0/(1.0 + alphaNu_*pow(tnuEff/nu, n_)); + index.correctBoundaryConditions(); + + return true; +} + + +bool Foam::resolutionIndexModels::CelikNuIndex::write() +{ + const auto& index = getOrReadField<volScalarField>(resultName()); + + Info<< tab << "writing field:" << index.name() << endl; + + index.write(); + + return true; +} + + +// ************************************************************************* // diff --git a/src/functionObjects/field/resolutionIndex/resolutionIndexModels/CelikNuIndex/CelikNuIndex.H b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/CelikNuIndex/CelikNuIndex.H new file mode 100644 index 0000000000000000000000000000000000000000..412a174bc21b9b32fa59e5b328f3ce92e6b9b2d4 --- /dev/null +++ b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/CelikNuIndex/CelikNuIndex.H @@ -0,0 +1,246 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2022 OpenCFD Ltd. +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::resolutionIndexModels::CelikNuIndex + +Description + Computes a single-mesh resolution index according to Celik et al.'s index + using effective viscosity, which is used as a LES/DES quality/post + verification metric that does not require any experimental or DNS data. + + \f[ + \Gamma_{Celik,\nu}(\mathbf{x}, t) = + \frac{1}{1 + \alpha_\nu \left(\frac{\nu_{eff}}{\nu}\right)^n} + \f] + + with + + \f[ + \nu_{eff} = \nu_{num} + \nu_{sgs} + \nu + \f] + + \f[ + \nu_{num} = {sgn}(k_{num}) C_\nu \Delta \sqrt{k_{num}} + \f] + + \f[ + k_{num} = C_n \left(\frac{h}{\Delta}\right)^2 k_{sgs} + \f] + + where + \vartable + \Gamma_{Celik,\nu}(\mathbf{x}, t) | Celik et al.'s index [-] + \alpha_\nu | Empirical constant [-] + \nu_{eff} | Effective eddy viscosity [m^2/s] + \nu_{num} | Numerical eddy viscosity [m^2/s] + \nu_{sgs} | Subgrid-scale eddy viscosity [m^2/s] + \nu | Kinematic viscosity of fluid [m^2/s] + n | Empirical exponent [-] + k_{num} | Numerical turbulent kinetic energy [m^2/s^2] + C_\nu | Empirical constant [-] + \Delta | Filter length scale [m] + C_n | Empirical constant [-] + h | Characteristic length scale with \f$h = V^{1/3} \f$ [m] + V | Cell volume [m^3] + k_{sgs} | Subgrid-scale turbulent kinetic energy [m^2/s^2] + \endvartable + + Criterion for acceptable-quality resolution: + + \f[ + \Gamma_{Celik,\nu}(\mathbf{x}) \geq 0.8 + \f] + + Required fields: + \verbatim + k | Subgrid scale turbulent kinetic energy [m^2/s^2] + delta | Filter length [m] + nu | Kinematic viscosity [m^2/s] + nut | Subgrid-scale eddy viscosity [m^2/s] + \endverbatim + + References: + \verbatim + Governing equations (tag:CCY): + Celik, I. B., Cehreli Z. N., Yavuz I. (2005). + Index of resolution quality for large eddy simulations. + Journal of Fluids Engineering. 127:949–958. + DOI:10.1115/1.1990201 + + Governing equations (tag:CKJ): + Celik, I., Klein, M., & Janicka, J. (2009). + Assessment measures for engineering LES applications. + Journal of fluids engineering, 131(3). + DOI:10.1115/1.3059703 + \endverbatim + +Usage + Minimal example by using \c system/controlDict.functions: + \verbatim + resolutionIndex1 + { + // Inherited entries + ... + model CelikNuIndex; + + // Optional entries + alphaNu <scalar>; + n <scalar>; + Cnu <scalar>; + Cn <scalar>; + k <word>; + delta <word>; + nu <word>; + nut <word>; + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Deflt + model | Model name: CelikNuIndex | word | yes | - + alphaNu | Empirical constant | scalar | no | 0.05 + n | Empirical exponent | scalar | no | 0.53 + Cnu | Empirical constant | scalar | no | 0.1 + Cn | Empirical constant | scalar | no | 1.0 + k | Name of subgrid-scale turbulent kinetic energy field <!-- + --> | word | no | k + delta | Name of filter field | word | no | delta + nu | Name of kinematic viscosity field | word | no | nu + nut | Name of subgrid-scale eddy viscosity field | word | no | nut + \endtable + +SourceFiles + CelikNuIndex.C + +\*---------------------------------------------------------------------------*/ + +#ifndef Foam_resolutionIndexModels_CelikNuIndex_H +#define Foam_resolutionIndexModels_CelikNuIndex_H + +#include "resolutionIndexModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace resolutionIndexModels +{ + +/*---------------------------------------------------------------------------*\ + Class CelikNuIndex Declaration +\*---------------------------------------------------------------------------*/ + +class CelikNuIndex +: + public resolutionIndexModel +{ + // Private Data + + //- Empirical constant + scalar alphaNu_; + + //- Empirical exponent + scalar n_; + + //- Empirical constant + scalar Cnu_; + + //- Empirical constant + scalar Cn_; + + //- Name of subgrid-scale turbulent kinetic energy field + word kName_; + + //- Name of filter field + word deltaName_; + + //- Name of kinematic viscosity field + word nuName_; + + //- Name of subgrid-scale eddy viscosity field + word nutName_; + + + // Private Member Functions + + //- Return numerical eddy viscosity field + tmp<volScalarField> nuNum() const; + + //- Return numerical turbulent kinetic energy field + tmp<volScalarField> kNum() const; + + +public: + + //- Runtime type information + TypeName("CelikNuIndex"); + + + // Constructors + + //- Construct from components + CelikNuIndex + ( + const word& name, + const fvMesh& mesh, + const dictionary& dict + ); + + //- No copy construct + CelikNuIndex(const CelikNuIndex&) = delete; + + //- No copy assignment + void operator=(const CelikNuIndex&) = delete; + + + // Destructor + virtual ~CelikNuIndex() = default; + + + // Member Functions + + //- Read top-level dictionary + virtual bool read(const dictionary& dict); + + //- Calculate the result field + virtual bool execute(); + + //- Write the result field + virtual bool write(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace resolutionIndexModels +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/functionObjects/field/resolutionIndex/resolutionIndexModels/PopeIndex/PopeIndex.C b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/PopeIndex/PopeIndex.C new file mode 100644 index 0000000000000000000000000000000000000000..d5ab7c8fb753563cba0c51ba9f6f5528fe779201 --- /dev/null +++ b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/PopeIndex/PopeIndex.C @@ -0,0 +1,146 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2022 OpenCFD Ltd. +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "PopeIndex.H" +#include "resolutionIndexModel.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace resolutionIndexModels +{ + defineTypeNameAndDebug(PopeIndex, 0); + addToRunTimeSelectionTable(resolutionIndexModel, PopeIndex, dictionary); +} +} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +Foam::tmp<Foam::volScalarField> +Foam::resolutionIndexModels::PopeIndex::kNum() const +{ + const auto& kSgs = getOrReadField<volScalarField>(kName_); + const auto& Delta = getOrReadField<volScalarField>(deltaName_); + + tmp<volScalarField> th = cbrt(V()); + + // (CKJ:Eq. 28) + return Cn_*sqr(th/Delta)*kSgs; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::resolutionIndexModels::PopeIndex::PopeIndex +( + const word& name, + const fvMesh& mesh, + const dictionary& dict +) +: + resolutionIndexModel(name, mesh, dict), + includeKnum_(), + Cn_(), + UName_(), + UMeanName_(), + kName_(), + deltaName_() +{ + read(dict); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::resolutionIndexModels::PopeIndex::read(const dictionary& dict) +{ + if (!resolutionIndexModel::read(dict)) + { + return false; + } + + includeKnum_ = dict.getOrDefault<bool>("includeKnum", true); + if (includeKnum_) + { + Cn_ = dict.getOrDefault<scalar>("Cnu", 1.0); + } + UName_ = dict.getOrDefault<word>("U", "U"); + UMeanName_ = dict.getOrDefault<word>("UMean", "UMean"); + kName_ = dict.getOrDefault<word>("k", "k"); + deltaName_ = dict.getOrDefault<word>("delta", "delta"); + + return true; +} + + +bool Foam::resolutionIndexModels::PopeIndex::execute() +{ + // Calculate resolved k field + const auto& U = getOrReadField<volVectorField>(UName_); + const auto& UMean = getOrReadField<volVectorField>(UMeanName_); + const volScalarField kRes(0.5*magSqr(U - UMean)); + + // Calculate subgrid-scale k field + const auto& kSgs = getOrReadField<volScalarField>(kName_); + + // Calculate total k field + tmp<volScalarField> tkTot = kRes + kSgs; + if (includeKnum_) + { + tkTot.ref() += mag(kNum()); + } + + + // Calculate index field + auto& index = getOrReadField<volScalarField>(resultName()); + + const dimensionedScalar kMin(kSgs.dimensions(), SMALL); + + // (P:p. 560;CKJ:Eq. 11) + index = kRes/max(kMin, tkTot); + index.correctBoundaryConditions(); + + return true; +} + + +bool Foam::resolutionIndexModels::PopeIndex::write() +{ + const auto& index = getOrReadField<volScalarField>(resultName()); + + Info<< tab << "writing field:" << index.name() << endl; + + index.write(); + + return true; +} + + +// ************************************************************************* // diff --git a/src/functionObjects/field/resolutionIndex/resolutionIndexModels/PopeIndex/PopeIndex.H b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/PopeIndex/PopeIndex.H new file mode 100644 index 0000000000000000000000000000000000000000..0f358dcdc2b08e423be2fe3a183f8c18b22ad68a --- /dev/null +++ b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/PopeIndex/PopeIndex.H @@ -0,0 +1,237 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2022 OpenCFD Ltd. +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::resolutionIndexModels::PopeIndex + +Description + Computes a single-mesh resolution index according to Pope's index, + which is used as a LES/DES quality/post-verification metric that does + not require any experimental or DNS data. + + \f[ + \Gamma_{Pope}(\mathbf{x}, t) = \frac{k_{res}}{k_{tot}} + \f] + + with + + \f[ + k_{tot} = k_{res} + k_{sgs} + |k_{num}| + \f] + + where + \vartable + \Gamma_{Pope}(\mathbf{x}, t) | Pope's index [-] + k_{tot} | Total turbulent kinetic energy [m^2/s^2] + k_{res} | Resolved turbulent kinetic energy [m^2/s^2] + k_{sgs} | Subgrid-scale turbulent kinetic energy [m^2/s^2] + k_{num} | Numerical turbulent kinetic energy [m^2/s^2] + \endvartable + + Inclusion of \f$k_{num}\f$ is optional, and set as \c true by default: + + \f[ + k_{num} = C_n \left(\frac{h}{\Delta}\right)^2 k_{sgs} + \f] + + where + \vartable + C_n | Empirical constant [-] + h | Characteristic length scale with \f$h = V^{1/3} \f$ [m] + V | Cell volume [m^3] + \Delta | Filter length scale [m] + \endvartable + + Typical criterion for acceptable-quality resolution: + + \f[ + \Gamma_{Pope}(\mathbf{x}) \geq 0.8 + \f] + + Required fields: + \verbatim + U | Velocity [m/s] + UMean | Mean velocity [m/s] + k | Subgrid-scale turbulent kinetic energy [m^2/s^2] + delta | Filter length [m] + \endverbatim + + References: + \verbatim + Governing equation (tag:P): + Pope, S. B. (2000). + Turbulent flows. + Cambridge, UK: Cambridge Univ. Press + DOI:10.1017/CBO9780511840531 + + Governing equations for the denominator kNum term (tag:CKJ): + Celik, I., Klein, M., & Janicka, J. (2009). + Assessment measures for engineering LES applications. + Journal of fluids engineering, 131(3). + DOI:10.1115/1.3059703 + \endverbatim + +Usage + Minimal example by using \c system/controlDict.functions: + \verbatim + resolutionIndex1 + { + // Inherited entries + ... + model PopeIndex; + + // Optional entries + U <word>; + UMean <word>; + k <word>; + delta <word>; + includeKnum <bool>; + + // Conditional entries + // when includeKnum = true + Cn <scalar>; + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Deflt + model | Model name: PopeIndex | word | yes | - + U | Name of velocity field | word | no | U + UMean | Name of mean velocity field | word | no | UMean + k | Name of subgrid-scale turbulent kinetic energy field <!-- + --> | word | no | k + delta | Name of filter field | word | no | delta + includeKnum | Flag to include numerical k field | bool | no | true + Cn | Empirical constant | choice | no | 1.0 + \endtable + +Note + - Some studies measured \f$\Gamma_{Pope} > 1\f$ with \f$k_{res}\f$ comparisons + between a LES and a corresponding filtered DNS. Nonphysical results may + occur. + +SourceFiles + PopeIndex.C + +\*---------------------------------------------------------------------------*/ + +#ifndef Foam_resolutionIndexModels_PopeIndex_H +#define Foam_resolutionIndexModels_PopeIndex_H + +#include "resolutionIndexModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace resolutionIndexModels +{ + +/*---------------------------------------------------------------------------*\ + Class PopeIndex Declaration +\*---------------------------------------------------------------------------*/ + +class PopeIndex +: + public resolutionIndexModel +{ + // Private Data + + //- Flag to include numerical turbulent kinetic energy field + bool includeKnum_; + + //- Empirical constant in numerical turbulent kinetic energy estimation + scalar Cn_; + + //- Name of velocity field + word UName_; + + //- Name of mean velocity field + word UMeanName_; + + //- Name of subgrid-scale turbulent kinetic energy field + word kName_; + + //- Name of filter field + word deltaName_; + + + // Private Member Functions + + //- Return numerical turbulent kinetic energy field + tmp<volScalarField> kNum() const; + + +public: + + //- Runtime type information + TypeName("PopeIndex"); + + + // Constructors + + //- Construct from components + PopeIndex + ( + const word& name, + const fvMesh& mesh, + const dictionary& dict + ); + + //- No copy construct + PopeIndex(const PopeIndex&) = delete; + + //- No copy assignment + void operator=(const PopeIndex&) = delete; + + + // Destructor + virtual ~PopeIndex() = default; + + + // Member Functions + + //- Read top-level dictionary + virtual bool read(const dictionary& dict); + + //- Calculate the result field + virtual bool execute(); + + //- Write the result field + virtual bool write(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace resolutionIndexModels +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/functionObjects/field/resolutionIndex/resolutionIndexModels/resolutionIndexModel/resolutionIndexModel.C b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/resolutionIndexModel/resolutionIndexModel.C new file mode 100644 index 0000000000000000000000000000000000000000..0255a9b58c0873b9fba73582237c796d4ca7c9a8 --- /dev/null +++ b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/resolutionIndexModel/resolutionIndexModel.C @@ -0,0 +1,117 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2022 OpenCFD Ltd. +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "resolutionIndexModel.H" +#include "fvMesh.H" +#include "ListOps.H" +#include "turbulenceFields.H" +#include "turbulenceModel.H" +#include "zeroGradientFvPatchFields.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(resolutionIndexModel, 0); + defineRunTimeSelectionTable(resolutionIndexModel, dictionary); +} + + +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // + +Foam::tmp<Foam::volScalarField> Foam::resolutionIndexModel::V() const +{ + auto tV = tmp<volScalarField>::New + ( + IOobject + ( + "V", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + mesh_, + dimVolume, + zeroGradientFvPatchScalarField::typeName + ); + + tV.ref().primitiveFieldRef() = mesh_.V(); + tV.ref().correctBoundaryConditions(); + + return tV; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::resolutionIndexModel::resolutionIndexModel +( + const word& name, + const fvMesh& mesh, + const dictionary& dict +) +: + mesh_(mesh), + resultName_(word::null) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::resolutionIndexModel::read(const dictionary& dict) +{ + resultName_ = dict.getOrDefault("result", type()); + + auto* indexPtr = mesh_.getObjectPtr<volScalarField>(resultName_); + + if (!indexPtr) + { + indexPtr = new volScalarField + ( + IOobject + ( + resultName_, + mesh_.time().timeName(), + mesh_, + IOobject::READ_IF_PRESENT, + IOobject::NO_WRITE + ), + mesh_, + dimensionedScalar(dimless, Zero), + zeroGradientFvPatchScalarField::typeName + ); + + mesh_.objectRegistry::store(indexPtr); + } + + return true; +} + + +// ************************************************************************* // diff --git a/src/functionObjects/field/resolutionIndex/resolutionIndexModels/resolutionIndexModel/resolutionIndexModel.H b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/resolutionIndexModel/resolutionIndexModel.H new file mode 100644 index 0000000000000000000000000000000000000000..5d73ca86f9b9e87ecbe80600ff306918c42d3f0c --- /dev/null +++ b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/resolutionIndexModel/resolutionIndexModel.H @@ -0,0 +1,183 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2022 OpenCFD Ltd. +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Namespace + Foam::resolutionIndexModels + +Description + A namespace for various \c resolutionIndex model implementations. + +Class + Foam::resolutionIndexModel + +Description + A base class for \c resolutionIndex models. + +SourceFiles + resolutionIndexModel.C + resolutionIndexModelNew.C + +\*---------------------------------------------------------------------------*/ + +#ifndef Foam_resolutionIndexModel_H +#define Foam_resolutionIndexModel_H + +#include "volFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// Forward Declarations +class fvMesh; + +/*---------------------------------------------------------------------------*\ + Class resolutionIndexModel Declaration +\*---------------------------------------------------------------------------*/ + +class resolutionIndexModel +{ + // Private Data + + //- Const reference to the mesh + const fvMesh& mesh_; + + //- Name of result field + word resultName_; + + +protected: + + // Protected Member Functions + + //- Return requested field from the object registry + //- or read+register the field to the object registry + template<class GeoFieldType> + GeoFieldType& getOrReadField(const word& fieldName) const; + + //- Return cell volume field + tmp<volScalarField> V() const; + + +public: + + //- Runtime type information + TypeName("resolutionIndexModel"); + + + // Declare runtime constructor selection table + + declareRunTimeSelectionTable + ( + autoPtr, + resolutionIndexModel, + dictionary, + ( + const word& name, + const fvMesh& mesh, + const dictionary& dict + ), + (name, mesh, dict) + ); + + + // Selectors + + //- Return a reference to the selected resolutionIndex model + static autoPtr<resolutionIndexModel> New + ( + const word& name, + const fvMesh& mesh, + const dictionary& dict + ); + + + // Constructors + + //- Construct from components + resolutionIndexModel + ( + const word& name, + const fvMesh& mesh, + const dictionary& dict + ); + + //- No copy construct + resolutionIndexModel(const resolutionIndexModel&) = delete; + + //- No copy assignment + void operator=(const resolutionIndexModel&) = delete; + + + //- Destructor + virtual ~resolutionIndexModel() = default; + + + // Member Functions + + // Access + + //- Return const reference to the mesh + const fvMesh& mesh() const noexcept + { + return mesh_; + } + + //- Return const reference to the result name + const word& resultName() const noexcept + { + return resultName_; + } + + + // I-O + + //- Read top-level dictionary + virtual bool read(const dictionary& dict); + + //- Calculate the result field + virtual bool execute() = 0; + + //- Write the result field + virtual bool write() = 0; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository + #include "resolutionIndexModelTemplates.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/functionObjects/field/resolutionIndex/resolutionIndexModels/resolutionIndexModel/resolutionIndexModelNew.C b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/resolutionIndexModel/resolutionIndexModelNew.C new file mode 100644 index 0000000000000000000000000000000000000000..5b42b986e8c74f3c852b96ec32ba9bd6e343b741 --- /dev/null +++ b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/resolutionIndexModel/resolutionIndexModelNew.C @@ -0,0 +1,61 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2022 OpenCFD Ltd. +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "resolutionIndexModel.H" +#include "fvMesh.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +Foam::autoPtr<Foam::resolutionIndexModel> Foam::resolutionIndexModel::New +( + const word& name, + const fvMesh& mesh, + const dictionary& dict +) +{ + const word modelType(dict.get<word>("model")); + + Info<< " Selecting model: " << modelType << nl << endl; + + auto* ctorPtr = dictionaryConstructorTable(modelType); + + if (!ctorPtr) + { + FatalIOErrorInLookup + ( + dict, + "resolutionIndexModel", + modelType, + *dictionaryConstructorTablePtr_ + ) << exit(FatalIOError); + } + + return autoPtr<resolutionIndexModel>(ctorPtr(name, mesh, dict)); +} + + +// ************************************************************************* // diff --git a/src/functionObjects/field/resolutionIndex/resolutionIndexModels/resolutionIndexModel/resolutionIndexModelTemplates.C b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/resolutionIndexModel/resolutionIndexModelTemplates.C new file mode 100644 index 0000000000000000000000000000000000000000..61e494e74a5a3d92de0836d7a72bf73ef83285ef --- /dev/null +++ b/src/functionObjects/field/resolutionIndex/resolutionIndexModels/resolutionIndexModel/resolutionIndexModelTemplates.C @@ -0,0 +1,62 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2022 OpenCFD Ltd. +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "resolutionIndexModel.H" +#include "volFields.H" + +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // + +template<class GeoFieldType> +GeoFieldType& Foam::resolutionIndexModel::getOrReadField +( + const word& fieldName +) const +{ + auto* ptr = mesh_.getObjectPtr<GeoFieldType>(fieldName); + + if (!ptr) + { + ptr = new GeoFieldType + ( + IOobject + ( + fieldName, + mesh_.time().timeName(), + mesh_, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh_ + ); + mesh_.objectRegistry::store(ptr); + } + + return *ptr; +} + + +// ************************************************************************* //