From 714e13a970b27593008c66ef16711d84fcdccaa1 Mon Sep 17 00:00:00 2001 From: Henry Weller Date: Wed, 26 Oct 2022 16:29:45 +0100 Subject: [PATCH] constSolidThermo: New solidThermo supporting uniform and non-uniform constant property specification Description Uniform or non-uniform constant solid thermodynamic properties Each physical property can specified as either \c uniform in which case the value entry is read or \c file in which case the field file in read from the constant directory. Usage Example of uniform constant solid properties specification: \verbatim thermoType constSolidThermo; rho { type uniform; value 8940; } Cv { type uniform; value 385; } kappa { type uniform; value 380; } \endverbatim Example of non-uniform constant solid properties specification: \verbatim thermoType constSolidThermo; rho { type file; } Cv { type file; } kappa { type file; } \endverbatim where each of the field files are read from the constant directory. --- .../solidThermo/Make/files | 1 + .../constSolidThermo/constSolidThermo.C | 433 ++++++++++++++++++ .../constSolidThermo/constSolidThermo.H | 349 ++++++++++++++ .../constant/solid/physicalProperties | 45 +- 4 files changed, 798 insertions(+), 30 deletions(-) create mode 100644 src/thermophysicalModels/solidThermo/constSolidThermo/constSolidThermo.C create mode 100644 src/thermophysicalModels/solidThermo/constSolidThermo/constSolidThermo.H diff --git a/src/thermophysicalModels/solidThermo/Make/files b/src/thermophysicalModels/solidThermo/Make/files index ab79d43bd5..858b87cf29 100644 --- a/src/thermophysicalModels/solidThermo/Make/files +++ b/src/thermophysicalModels/solidThermo/Make/files @@ -1,4 +1,5 @@ solidThermo/solidThermo.C solidThermo/solidThermos.C +constSolidThermo/constSolidThermo.C LIB = $(FOAM_LIBBIN)/libsolidThermo diff --git a/src/thermophysicalModels/solidThermo/constSolidThermo/constSolidThermo.C b/src/thermophysicalModels/solidThermo/constSolidThermo/constSolidThermo.C new file mode 100644 index 0000000000..4c878fad7f --- /dev/null +++ b/src/thermophysicalModels/solidThermo/constSolidThermo/constSolidThermo.C @@ -0,0 +1,433 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2022 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +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 . + +\*---------------------------------------------------------------------------*/ + +#include "constSolidThermo.H" +#include "addToRunTimeSelectionTable.H" + +/* * * * * * * * * * * * * * * Private Static Data * * * * * * * * * * * * * */ + +namespace Foam +{ + defineTypeNameAndDebug(constSolidThermo, 0); + addToRunTimeSelectionTable(basicThermo, constSolidThermo, fvMesh); + addToRunTimeSelectionTable(solidThermo, constSolidThermo, fvMesh); +} + + +/* * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * */ + +Foam::volScalarField Foam::constSolidThermo::readProperty +( + const word& name, + const dimensionSet& dimensions +) const +{ + const dictionary& propDict(subDict(name)); + const word propType(propDict.lookup("type")); + + if (propType == "uniform") + { + return volScalarField + ( + IOobject + ( + phasePropertyName(name), + mesh().time().constant(), + mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh(), + dimensionedScalar(dimensions, propDict.lookup("value")) + ); + } + else if (propType == "file") + { + return volScalarField + ( + IOobject + ( + phasePropertyName(name), + mesh().time().constant(), + mesh(), + IOobject::MUST_READ, + IOobject::NO_WRITE + ), + mesh(), + dimensions + ); + } + else + { + FatalErrorInFunction + << "Valid type entries are 'uniform' or 'file' for " << name + << abort(FatalError); + + return volScalarField::null(); + } +} + + +void Foam::constSolidThermo::readProperty +( + const word& name, + volScalarField& prop +) const +{ + const dictionary& propDict(subDict(name)); + const word propType(propDict.lookup("type")); + + if (propType == "uniform") + { + prop == dimensionedScalar + ( + prop.name(), + prop.dimensions(), + propDict.lookup("value") + ); + } + else if (propType == "file") + { + const volScalarField propField + ( + IOobject + ( + prop.name(), + prop.mesh().time().constant(), + prop.mesh(), + IOobject::MUST_READ, + IOobject::NO_WRITE + ), + prop.mesh() + ); + prop == propField; + } + else + { + FatalErrorInFunction + << "Valid type entries are 'uniform' or 'file' for " << prop.name() + << abort(FatalError); + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::constSolidThermo::constSolidThermo +( + const fvMesh& mesh, + const word& phaseName +) +: + solidThermo::composite(mesh, phaseName), + Cv_(readProperty("Cv", dimEnergy/dimMass/dimTemperature)), + e_ + ( + IOobject + ( + phasePropertyName("e"), + mesh.time().timeName(), + mesh, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + Cv_*T_, + this->heBoundaryTypes(), + this->heBoundaryBaseTypes() + ) +{ + readProperty("rho", rho_); + readProperty("kappa", kappa_); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::constSolidThermo::~constSolidThermo() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::volScalarField& Foam::constSolidThermo::he() +{ + return e_; +} + + +const Foam::volScalarField& Foam::constSolidThermo::he() const +{ + return e_; +} + + +Foam::tmp Foam::constSolidThermo::he +( + const scalarField& T, + const labelList& cells +) const +{ + return scalarField(Cv_, cells)*T; +} + + +Foam::tmp Foam::constSolidThermo::he +( + const volScalarField& p, + const volScalarField& T +) const +{ + return Cv_*T; +} + + +Foam::tmp Foam::constSolidThermo::he +( + const scalarField& T, + const label patchi +) const +{ + return Cv_.boundaryField()[patchi]*T; +} + + +Foam::tmp Foam::constSolidThermo::hs() const +{ + NotImplemented; + return tmp(nullptr); +} + + +Foam::tmp Foam::constSolidThermo::hs +( + const volScalarField& p, + const volScalarField& T +) const +{ + NotImplemented; + return tmp(nullptr); +} + + +Foam::tmp Foam::constSolidThermo::hs +( + const scalarField& T, + const label patchi +) const +{ + NotImplemented; + return tmp(nullptr); +} + + +Foam::tmp Foam::constSolidThermo::hs +( + const scalarField& T, + const labelList& cells +) const +{ + NotImplemented; + return tmp(nullptr); +} + + +Foam::tmp Foam::constSolidThermo::ha() const +{ + NotImplemented; + return tmp(nullptr); +} + + +Foam::tmp Foam::constSolidThermo::ha +( + const volScalarField& p, + const volScalarField& T +) const +{ + NotImplemented; + return tmp(nullptr); +} + + +Foam::tmp Foam::constSolidThermo::ha +( + const scalarField& T, + const label patchi +) const +{ + NotImplemented; + return tmp(nullptr); +} + + +Foam::tmp Foam::constSolidThermo::ha +( + const scalarField& T, + const labelList& cells +) const +{ + NotImplemented; + return tmp(nullptr); +} + + +Foam::tmp Foam::constSolidThermo::hc() const +{ + NotImplemented; + return tmp(nullptr); +} + + +Foam::tmp Foam::constSolidThermo::THE +( + const volScalarField& h, + const volScalarField& p, + const volScalarField& T0 +) const +{ + NotImplemented; + return tmp(nullptr); +} + + +Foam::tmp Foam::constSolidThermo::THE +( + const scalarField& he, + const scalarField& T0, + const labelList& cells +) const +{ + NotImplemented; + return tmp(nullptr); +} + + +Foam::tmp Foam::constSolidThermo::THE +( + const scalarField& he, + const scalarField& T0, + const label patchi +) const +{ + NotImplemented; + return tmp(nullptr); +} + + +const Foam::volScalarField& Foam::constSolidThermo::Cp() const +{ + return Cv_; +} + + +const Foam::volScalarField& Foam::constSolidThermo::Cv() const +{ + return Cv_; +} + + +Foam::tmp Foam::constSolidThermo::Cp +( + const scalarField& T, + const label patchi +) const +{ + return Cv_.boundaryField()[patchi]; +} + + +Foam::tmp Foam::constSolidThermo::Cv +( + const scalarField& T, + const label patchi +) const +{ + return Cv_.boundaryField()[patchi]; +} + + +Foam::tmp Foam::constSolidThermo::Cpv() const +{ + return Cv_; +} + + +Foam::tmp Foam::constSolidThermo::Cpv +( + const scalarField& T, + const label patchi +) const +{ + return Cv_.boundaryField()[patchi]; +} + + +Foam::tmp Foam::constSolidThermo::alphahe() const +{ + NotImplemented; + return tmp(nullptr); +} + + +Foam::tmp Foam::constSolidThermo::alphahe +( + const label patchi +) const +{ + NotImplemented; + return tmp(nullptr); +} + + +Foam::tmp Foam::constSolidThermo::Kappa() const +{ + NotImplemented; + return tmp(nullptr); +} + + +Foam::tmp Foam::constSolidThermo::Kappa +( + const label patchi +) const +{ + NotImplemented; + return tmp(nullptr); +} + + +void Foam::constSolidThermo::correct() +{ + T_ = e_/Cv_; +} + + +bool Foam::constSolidThermo::read() +{ + return regIOobject::read(); +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/solidThermo/constSolidThermo/constSolidThermo.H b/src/thermophysicalModels/solidThermo/constSolidThermo/constSolidThermo.H new file mode 100644 index 0000000000..ba2901009c --- /dev/null +++ b/src/thermophysicalModels/solidThermo/constSolidThermo/constSolidThermo.H @@ -0,0 +1,349 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2022 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +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 . + +Class + Foam::constSolidThermo + +Description + Uniform or non-uniform constant solid thermodynamic properties + + Each physical property can specified as either \c uniform in which case the + value entry is read or \c file in which case the field file in read + from the constant directory. + +Usage + Example of uniform constant solid properties specification: + \verbatim + thermoType constSolidThermo; + + rho + { + type uniform; + value 8940; + } + + Cv + { + type uniform; + value 385; + } + + kappa + { + type uniform; + value 380; + } + \endverbatim + + Example of non-uniform constant solid properties specification: + \verbatim + thermoType constSolidThermo; + + rho + { + type file; + } + + Cv + { + type file; + } + + kappa + { + type file; + } + \endverbatim + where each of the field files are read from the constant directory. + +SourceFiles + constSolidThermo.C + +\*---------------------------------------------------------------------------*/ + +#ifndef constSolidThermo_H +#define constSolidThermo_H + +#include "solidThermo.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class constSolidThermo Declaration +\*---------------------------------------------------------------------------*/ + +class constSolidThermo +: + public solidThermo::composite +{ + // Private data + + //- Heat capacity at constant volume [J/kg/K] + volScalarField Cv_; + + //- Internal energy [J/kg] + volScalarField e_; + + +protected: + + // Protected Member Functions + + volScalarField readProperty + ( + const word& name, + const dimensionSet& dimensions + ) const; + + void readProperty(const word& name, volScalarField& prop) const; + + +public: + + //- Runtime type information + TypeName("constSolidThermo"); + + + // Constructors + + //- Construct from mesh and phase name + constSolidThermo + ( + const fvMesh&, + const word& phaseName = word::null + ); + + + //- Destructor + virtual ~constSolidThermo(); + + + // Member Functions + + //- Return the name of the thermo physics + virtual word thermoName() const + { + return type(); + } + + //- Return true if the equation of state is incompressible + // i.e. rho != f(p) + virtual bool incompressible() const + { + return true; + } + + //- Return true if the equation of state is isochoric + // i.e. rho = const + virtual bool isochoric() const + { + return true; + } + + + // Access to thermophysical state variables + + //- Enthalpy/Internal energy [J/kg] + // Non-const access allowed for transport equations + virtual volScalarField& he(); + + //- Enthalpy/Internal energy [J/kg] + virtual const volScalarField& he() const; + + //- Heat capacity at constant pressure [J/kg/K] + virtual const volScalarField& Cp() const; + + //- Heat capacity at constant volume [J/kg/K] + virtual const volScalarField& Cv() const; + + + // Fields derived from thermodynamic state variables + + //- Enthalpy/Internal energy + // for given pressure and temperature [J/kg] + virtual tmp he + ( + const volScalarField& p, + const volScalarField& T + ) const; + + //- Enthalpy/Internal energy for cell-set [J/kg] + virtual tmp he + ( + const scalarField& T, + const labelList& cells + ) const; + + //- Enthalpy/Internal energy for patch [J/kg] + virtual tmp he + ( + const scalarField& T, + const label patchi + ) const; + + //- Sensible enthalpy [J/kg] + virtual tmp hs() const; + + //- Sensible enthalpy + // for given pressure and temperature [J/kg] + virtual tmp hs + ( + const volScalarField& p, + const volScalarField& T + ) const; + + //- Sensible enthalpy for cell-set [J/kg] + virtual tmp hs + ( + const scalarField& T, + const labelList& cells + ) const; + + //- Sensible enthalpy for patch [J/kg] + virtual tmp hs + ( + const scalarField& T, + const label patchi + ) const; + + //- Absolute enthalpy [J/kg/K] + virtual tmp ha() const; + + //- Absolute enthalpy + // for given pressure and temperature [J/kg] + virtual tmp ha + ( + const volScalarField& p, + const volScalarField& T + ) const; + + //- Absolute enthalpy for patch [J/kg/K] + virtual tmp ha + ( + const scalarField& T, + const label patchi + ) const; + + //- Absolute enthalpy for cell-set [J/kg] + virtual tmp ha + ( + const scalarField& T, + const labelList& cells + ) const; + + //- Enthalpy of formation [J/kg] + virtual tmp hc() const; + + //- Temperature from enthalpy/internal energy + virtual tmp THE + ( + const volScalarField& h, + const volScalarField& p, + const volScalarField& T0 // starting temperature + ) const; + + //- Temperature from enthalpy/internal energy for cell-set + virtual tmp THE + ( + const scalarField& he, + const scalarField& T0, // starting temperature + const labelList& cells + ) const; + + //- Temperature from enthalpy/internal energy for patch + virtual tmp THE + ( + const scalarField& he, + const scalarField& T0, // starting temperature + const label patchi + ) const; + + //- Heat capacity at constant pressure for patch [J/kg/K] + virtual tmp Cp + ( + const scalarField& T, + const label patchi + ) const; + + //- Heat capacity at constant volume for patch [J/kg/K] + virtual tmp Cv + ( + const scalarField& T, + const label patchi + ) const; + + //- Heat capacity at constant pressure/volume [J/kg/K] + virtual tmp Cpv() const; + + //- Heat capacity at constant pressure/volume for patch [J/kg/K] + virtual tmp Cpv + ( + const scalarField& T, + const label patchi + ) const; + + + // Fields derived from transport state variables + + //- Thermal diffusivity for energy of mixture [kg/m/s] + virtual tmp alphahe() const; + + //- Thermal diffusivity for energy of mixture for patch [kg/m/s] + virtual tmp alphahe(const label patchi) const; + + //- Return true if thermal conductivity is isotropic + virtual bool isotropic() const + { + return true; + } + + //- Anisotropic thermal conductivity [W/m/K] + virtual tmp Kappa() const; + + //- Anisotropic thermal conductivity [W/m/K] + virtual tmp Kappa(const label patchi) const; + + + //- Update properties + virtual void correct(); + + + // I-O + + //- Read thermophysicalProperties dictionary + virtual bool read(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/tutorials/modules/CHT/coolingCylinder2D/constant/solid/physicalProperties b/tutorials/modules/CHT/coolingCylinder2D/constant/solid/physicalProperties index 5b632dd727..3703546636 100644 --- a/tutorials/modules/CHT/coolingCylinder2D/constant/solid/physicalProperties +++ b/tutorials/modules/CHT/coolingCylinder2D/constant/solid/physicalProperties @@ -13,40 +13,25 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -thermoType +thermoType constSolidThermo; + +rho { - type heSolidThermo; - mixture pureMixture; - transport constIsoSolid; - thermo eConst; - equationOfState rhoConst; - specie specie; - energy sensibleInternalEnergy; + type uniform; + value 8940; } -mixture +Cv { - specie - { - nMoles 1; - molWeight 63.5; // [g/mol] - } - - transport - { - kappa 380; // [W/m/K] - } - - thermodynamics - { - Hf 0; - Cv 385; // [J/kg/K] - } - - equationOfState - { - rho 8940; // [kg/m^3] - } + type uniform; + value 385; } +kappa +{ + type uniform; + value 380; +} + + // ************************************************************************* //