From b7e17abf9efa99bee79c944fed97b8894f216c00 Mon Sep 17 00:00:00 2001 From: mattijs <mattijs> Date: Fri, 11 Jun 2010 10:36:41 +0100 Subject: [PATCH] ENH: basicSolidThermo : first implementation of solid thermo --- .../basicSolidThermo/Make/files | 7 + .../basicSolidThermo/Make/options | 7 + .../basicSolidThermo/basicSolidThermo.C | 91 +++ .../basicSolidThermo/basicSolidThermo.H | 196 +++++ .../basicSolidThermo/basicSolidThermoI.H | 42 + .../basicSolidThermo/newBasicSolidThermo.C | 77 ++ .../nonCSinterpolateSolidThermo.C | 232 ++++++ .../nonCSinterpolateSolidThermo.H | 124 +++ .../constSolidThermo/constSolidThermo.C | 410 ++++++++++ .../constSolidThermo/constSolidThermo.H | 158 ++++ .../directionalSolidThermo.C | 765 ++++++++++++++++++ .../directionalSolidThermo.H | 183 +++++ .../interpolatedSolidThermo.C | 501 ++++++++++++ .../interpolatedSolidThermo.H | 161 ++++ .../temperatureCoupledBase.C | 179 ++++ .../temperatureCoupledBase.H | 137 ++++ 16 files changed, 3270 insertions(+) create mode 100644 src/thermophysicalModels/basicSolidThermo/Make/files create mode 100644 src/thermophysicalModels/basicSolidThermo/Make/options create mode 100644 src/thermophysicalModels/basicSolidThermo/basicSolidThermo/basicSolidThermo.C create mode 100644 src/thermophysicalModels/basicSolidThermo/basicSolidThermo/basicSolidThermo.H create mode 100644 src/thermophysicalModels/basicSolidThermo/basicSolidThermo/basicSolidThermoI.H create mode 100644 src/thermophysicalModels/basicSolidThermo/basicSolidThermo/newBasicSolidThermo.C create mode 100644 src/thermophysicalModels/basicSolidThermo/basicSolidThermo/nonCSinterpolateSolidThermo.C create mode 100644 src/thermophysicalModels/basicSolidThermo/basicSolidThermo/nonCSinterpolateSolidThermo.H create mode 100644 src/thermophysicalModels/basicSolidThermo/constSolidThermo/constSolidThermo.C create mode 100644 src/thermophysicalModels/basicSolidThermo/constSolidThermo/constSolidThermo.H create mode 100644 src/thermophysicalModels/basicSolidThermo/directionalSolidThermo/directionalSolidThermo.C create mode 100644 src/thermophysicalModels/basicSolidThermo/directionalSolidThermo/directionalSolidThermo.H create mode 100644 src/thermophysicalModels/basicSolidThermo/interpolatedSolidThermo/interpolatedSolidThermo.C create mode 100644 src/thermophysicalModels/basicSolidThermo/interpolatedSolidThermo/interpolatedSolidThermo.H create mode 100644 src/turbulenceModels/compressible/RAS/derivedFvPatchFields/temperatureCoupledBase/temperatureCoupledBase.C create mode 100644 src/turbulenceModels/compressible/RAS/derivedFvPatchFields/temperatureCoupledBase/temperatureCoupledBase.H diff --git a/src/thermophysicalModels/basicSolidThermo/Make/files b/src/thermophysicalModels/basicSolidThermo/Make/files new file mode 100644 index 00000000000..f7f64d01d21 --- /dev/null +++ b/src/thermophysicalModels/basicSolidThermo/Make/files @@ -0,0 +1,7 @@ +constSolidThermo/constSolidThermo.C +directionalSolidThermo/directionalSolidThermo.C +basicSolidThermo/basicSolidThermo.C +basicSolidThermo/newBasicSolidThermo.C +interpolatedSolidThermo/interpolatedSolidThermo.C + +LIB = $(FOAM_LIBBIN)/libbasicSolidThermo diff --git a/src/thermophysicalModels/basicSolidThermo/Make/options b/src/thermophysicalModels/basicSolidThermo/Make/options new file mode 100644 index 00000000000..f3070a731e4 --- /dev/null +++ b/src/thermophysicalModels/basicSolidThermo/Make/options @@ -0,0 +1,7 @@ +EXE_INC = \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/finiteVolume/lnInclude + +LIB_LIBS = \ + -lmeshTools \ + -lfiniteVolume diff --git a/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/basicSolidThermo.C b/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/basicSolidThermo.C new file mode 100644 index 00000000000..e0c65a91d7f --- /dev/null +++ b/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/basicSolidThermo.C @@ -0,0 +1,91 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ 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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + + +#include "basicSolidThermo.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(basicSolidThermo, 0); + defineRunTimeSelectionTable(basicSolidThermo, mesh); +} + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::basicSolidThermo::basicSolidThermo(const fvMesh& mesh) +: + IOdictionary + ( + IOobject + ( + "solidThermophysicalProperties", + mesh.time().constant(), + mesh, + IOobject::MUST_READ_IF_MODIFIED, + IOobject::NO_WRITE + ) + ), + mesh_(mesh), + T_ + ( + IOobject + ( + "T", + mesh.time().timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh + ) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::basicSolidThermo::~basicSolidThermo() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::basicSolidThermo::writeData(Ostream& os) const +{ + return true; +} + + +// * * * * * * * * * * * * * * IOStream operators * * * * * * * * * * * * * // + +Foam::Ostream& Foam::operator<<(Ostream& os, const basicSolidThermo& s) +{ + s.writeData(os); + return os; +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/basicSolidThermo.H b/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/basicSolidThermo.H new file mode 100644 index 00000000000..4b625825193 --- /dev/null +++ b/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/basicSolidThermo.H @@ -0,0 +1,196 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ 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 <http://www.gnu.org/licenses/>. + +Class + Foam::basicSolidThermo + +Description + The thermophysical properties of a basicSolidThermo + +SourceFiles + basicSolidThermo.C + newBasicSolidThermo.C + +\*---------------------------------------------------------------------------*/ + +#ifndef basicSolidThermo_H +#define basicSolidThermo_H + +#include "runTimeSelectionTables.H" +#include "volFields.H" +#include "fvMesh.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class basicSolidThermo Declaration +\*---------------------------------------------------------------------------*/ + +class basicSolidThermo +: + public IOdictionary +{ +protected: + + // Protected data + + const fvMesh& mesh_; + + //- Temperature [K] + volScalarField T_; + + +public: + + //- Runtime type information + TypeName("basicSolidThermo"); + + + // Declare run-time constructor selection tables + + declareRunTimeSelectionTable + ( + autoPtr, + basicSolidThermo, + mesh, + (const fvMesh& mesh), + (mesh) + ); + + + // Constructors + + //- Construct from mesh + basicSolidThermo(const fvMesh&); + + //- Return a pointer to a new basicSolidThermo created from + // the solidThermophysicalProperties dictionary + static autoPtr<basicSolidThermo> New(const fvMesh&); + + + // Destructor + + virtual ~basicSolidThermo(); + + + // Member Functions + + //- Update properties + virtual void correct() = 0; + + + // Physical constants which define the basicSolidThermo + + //- Temperature [K] + inline const volScalarField& T() const; + + //- Temperature [K] + inline volScalarField& T(); + + //- Density [kg/m3] + virtual tmp<volScalarField> rho() const = 0; + + //- Specific heat capacity [J/(kg.K)] + virtual tmp<volScalarField> cp() const = 0; + + //- Thermal conductivity [W/(m.K)] + virtual tmp<volScalarField> K() const = 0; + + //- Thermal conductivity [W/(m.K)] + virtual tmp<volSymmTensorField> directionalK() const = 0; + + //- Heat of formation [J/kg] + virtual tmp<volScalarField> Hf() const = 0; + + //- Emissivity [] + virtual tmp<volScalarField> emissivity() const = 0; + + + // Per patch calculation + + //- Density [kg/m3] + virtual tmp<scalarField> rho(const label patchI) const = 0; + + //- Specific heat capacity [J/(kg.K)] + virtual tmp<scalarField> cp(const label patchI) const = 0; + + //- Thermal conductivity [W/(m.K)] + virtual tmp<scalarField> K(const label patchI) const = 0; + + //- Thermal conductivity [W/(m.K)] + virtual tmp<symmTensorField> directionalK(const label) const =0; + + //- Heat of formation [J/kg] + virtual tmp<scalarField> Hf(const label patchI) const = 0; + + //- Emissivity [] + virtual tmp<scalarField> emissivity(const label) const = 0; + +// // Point wise properties +// +// //- Density [kg/m3] +// virtual scalar rho(const scalar T) const = 0; +// +// //- Specific heat capacity [J/(kg.K)] +// virtual scalar cp(const scalar T) const = 0; +// +// //- Thermal conductivity [W/(m.K)] +// virtual scalar K(const scalar T) const = 0; +// +// //- Heat of formation [J/kg] +// virtual scalar Hf(const scalar T) const = 0; +// +// //- Emissivity [] +// virtual scalar emissivity(const scalar T) const = 0; + + // I-O + + //- Write the basicSolidThermo properties + virtual bool writeData(Ostream& os) const = 0; + + //- Read solidThermophysicalProperties dictionary + virtual bool read() = 0; + + + // Ostream Operator + + friend Ostream& operator<<(Ostream& os, const basicSolidThermo& s); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "basicSolidThermoI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/basicSolidThermoI.H b/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/basicSolidThermoI.H new file mode 100644 index 00000000000..2b919b7e534 --- /dev/null +++ b/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/basicSolidThermoI.H @@ -0,0 +1,42 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ 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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "basicSolidThermo.H" + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +const Foam::volScalarField& Foam::basicSolidThermo::T() const +{ + return T_; +} + + +Foam::volScalarField& Foam::basicSolidThermo::T() +{ + return T_; +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/newBasicSolidThermo.C b/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/newBasicSolidThermo.C new file mode 100644 index 00000000000..34d3400a03b --- /dev/null +++ b/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/newBasicSolidThermo.C @@ -0,0 +1,77 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ 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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "basicSolidThermo.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +Foam::autoPtr<Foam::basicSolidThermo> Foam::basicSolidThermo::New +( + const fvMesh& mesh +) +{ + if (debug) + { + Info<< "basicSolidThermo::New(const fvMesh&): " + << "constructing basicSolidThermo" + << endl; + } + + const word thermoType + ( + IOdictionary + ( + IOobject + ( + "solidThermophysicalProperties", + mesh.time().constant(), + mesh, + IOobject::MUST_READ_IF_MODIFIED, + IOobject::NO_WRITE, + false + ) + ).lookup("thermoType") + ); + + meshConstructorTable::iterator cstrIter = + meshConstructorTablePtr_->find(thermoType); + + if (cstrIter == meshConstructorTablePtr_->end()) + { + FatalErrorIn + ( + "basicSolidThermo::New(const fvMesh&, const word&)" + ) << "Unknown solidThermo type " << thermoType + << endl << endl + << "Valid solidThermo types are :" << endl + << meshConstructorTablePtr_->toc() + << exit(FatalError); + } + + return autoPtr<basicSolidThermo>(cstrIter()(mesh)); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/nonCSinterpolateSolidThermo.C b/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/nonCSinterpolateSolidThermo.C new file mode 100644 index 00000000000..fb0301397cc --- /dev/null +++ b/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/nonCSinterpolateSolidThermo.C @@ -0,0 +1,232 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ 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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "interpolateSolidThermo.H" +#include "addToRunTimeSelectionTable.H" +#include "interpolateXY.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(interpolateSolidThermo, 0); + addToRunTimeSelectionTable + ( + basicSolidThermo, + interpolateSolidThermo, + dictionary + ); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::interpolateSolidThermo::interpolateSolidThermo +( + const fvMesh& mesh, + const dictionary& dict +) +: + basicSolidThermo(mesh, dict, typeName), + TValues_(dict_.lookup("TValues")), + rhoValues_(dict_.lookup("rhoValues")), + cpValues_(dict_.lookup("cpValues")), + KValues_(dict_.lookup("KValues")), + HfValues_(dict_.lookup("HfValues")), + emissivityValues_(dict_.lookup("emissivityValues")) +{ + if + ( + (TValues_.size() != rhoValues_.size()) + && (TValues_.size() != cpValues_.size()) + && (TValues_.size() != rhoValues_.size()) + && (TValues_.size() != KValues_.size()) + && (TValues_.size() != HfValues_.size()) + && (TValues_.size() != emissivityValues_.size()) + ) + { + FatalIOErrorIn + ( + "interpolateSolidThermo::interpolateSolidThermo\n" + "(\n" + " const fvMesh& mesh,\n" + " const dictionary& dict\n" + ")\n", + dict_ + ) << "Size of property tables should be equal to size of Temperature" + << " values " << TValues_.size() + << exit(FatalIOError); + } + + for (label i = 1; i < TValues_.size(); i++) + { + if (TValues_[i] <= TValues_[i-1]) + { + FatalIOErrorIn + ( + "interpolateSolidThermo::interpolateSolidThermo\n" + "(\n" + " const fvMesh& mesh,\n" + " const dictionary& dict\n" + ")\n", + dict_ + ) << "Temperature values are not in increasing order " + << TValues_ << exit(FatalIOError); + } + } + + correct(); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::interpolateSolidThermo::~interpolateSolidThermo() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::interpolateSolidThermo::correct() +{ + // rho + rho_.internalField() = interpolateXY + ( + T_.internalField(), + TValues_, + rhoValues_ + ); + + forAll(rho_.boundaryField(), patchI) + { + rho_.boundaryField()[patchI] == interpolateXY + ( + T_.boundaryField()[patchI], + TValues_, + rhoValues_ + ); + } + + + // cp + cp_.internalField() = interpolateXY + ( + T_.internalField(), + TValues_, + cpValues_ + ); + + forAll(cp_.boundaryField(), patchI) + { + cp_.boundaryField()[patchI] == interpolateXY + ( + T_.boundaryField()[patchI], + TValues_, + cpValues_ + ); + } + + + // K + K_.internalField() = interpolateXY + ( + T_.internalField(), + TValues_, + KValues_ + ); + + forAll(K_.boundaryField(), patchI) + { + K_.boundaryField()[patchI] == interpolateXY + ( + T_.boundaryField()[patchI], + TValues_, + KValues_ + ); + } + + + // Hf + Hf_.internalField() = interpolateXY + ( + T_.internalField(), + TValues_, + HfValues_ + ); + + forAll(Hf_.boundaryField(), patchI) + { + Hf_.boundaryField()[patchI] == interpolateXY + ( + T_.boundaryField()[patchI], + TValues_, + HfValues_ + ); + } + + + // emissivity + emissivity_.internalField() = interpolateXY + ( + T_.internalField(), + TValues_, + emissivityValues_ + ); + + forAll(emissivity_.boundaryField(), patchI) + { + emissivity_.boundaryField()[patchI] == interpolateXY + ( + T_.boundaryField()[patchI], + TValues_, + emissivityValues_ + ); + } +} + + +void Foam::interpolateSolidThermo::write(Ostream& os) const +{ + basicSolidThermo::write(os); + os.writeKeyword("TValues") << TValues_ << token::END_STATEMENT << nl; + os.writeKeyword("rhoValues") << rhoValues_ << token::END_STATEMENT << nl; + os.writeKeyword("cpValues") << cpValues_ << token::END_STATEMENT << nl; + os.writeKeyword("KValues") << KValues_ << token::END_STATEMENT << nl; + os.writeKeyword("HfValues") << HfValues_ << token::END_STATEMENT << nl; + os.writeKeyword("emissivityValues") << emissivityValues_ + << token::END_STATEMENT << nl; +} + + +// * * * * * * * * * * * * * * IOStream operators * * * * * * * * * * * * * // + +Foam::Ostream& Foam::operator<<(Ostream& os, const interpolateSolidThermo& s) +{ + s.write(os); + return os; +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/nonCSinterpolateSolidThermo.H b/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/nonCSinterpolateSolidThermo.H new file mode 100644 index 00000000000..1394f1fdaeb --- /dev/null +++ b/src/thermophysicalModels/basicSolidThermo/basicSolidThermo/nonCSinterpolateSolidThermo.H @@ -0,0 +1,124 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ 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 <http://www.gnu.org/licenses/>. + +Class + Foam::interpolateSolidThermo + +Description + The thermophysical properties of a interpolateSolidThermo + +SourceFiles + interpolateSolidThermo.C + +\*---------------------------------------------------------------------------*/ + +#ifndef interpolateSolidThermo_H +#define interpolateSolidThermo_H + +#include "basicSolidThermo.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class basicSolidThermo; + +Ostream& operator<< +( + Ostream&, + const basicSolidThermo& +); + + +/*---------------------------------------------------------------------------*\ + Class interpolateSolidThermo Declaration +\*---------------------------------------------------------------------------*/ + +class interpolateSolidThermo +: + public basicSolidThermo +{ + // Private data + + //- Temperature points for which there are values + const Field<scalar> TValues_; + + //- Density at given temperatures + const Field<scalar> rhoValues_; + + const Field<scalar> cpValues_; + + const Field<symmTensor> KValues_; + + const Field<scalar> HfValues_; + + const Field<scalar> emissivityValues_; + +public: + + //- Runtime type information + TypeName("interpolateSolidThermo"); + + + // Constructors + + //- Construct from mesh + interpolateSolidThermo(const fvMesh& mesh, const dictionary& dict); + + // Destructor + + virtual ~interpolateSolidThermo(); + + + // Member Functions + + //- Update properties + virtual void correct(); + + + // I-O + + //- Write the interpolateSolidThermo properties + virtual void write(Ostream& os) const; + + + // Ostream Operator + + friend Ostream& operator<< + ( + Ostream& os, + const interpolateSolidThermo& s + ); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/thermophysicalModels/basicSolidThermo/constSolidThermo/constSolidThermo.C b/src/thermophysicalModels/basicSolidThermo/constSolidThermo/constSolidThermo.C new file mode 100644 index 00000000000..0f9f65d2b0b --- /dev/null +++ b/src/thermophysicalModels/basicSolidThermo/constSolidThermo/constSolidThermo.C @@ -0,0 +1,410 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ 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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "constSolidThermo.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(constSolidThermo, 0); + addToRunTimeSelectionTable(basicSolidThermo, constSolidThermo, mesh); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::constSolidThermo::constSolidThermo(const fvMesh& mesh) +: + basicSolidThermo(mesh), + constRho_("zero", dimDensity, 0.0), + constCp_("zero", dimEnergy/(dimMass*dimTemperature), 0.0), + constK_("zero", dimEnergy/dimTime/(dimLength*dimTemperature), 0.0), + constHf_("zero", dimEnergy/dimMass, 0.0), + constEmissivity_("zero", dimless, 0.0) +{ + read(); + correct(); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::constSolidThermo::~constSolidThermo() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::constSolidThermo::correct() +{} + + +Foam::tmp<Foam::volScalarField> Foam::constSolidThermo::rho() const +{ + return tmp<volScalarField> + ( + new volScalarField + ( + IOobject + ( + "rho", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + constRho_ + ) + ); +} + + +Foam::tmp<Foam::volScalarField> Foam::constSolidThermo::cp() const +{ + return tmp<volScalarField> + ( + new volScalarField + ( + IOobject + ( + "cp", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + constCp_ + ) + ); +} + + +//Foam::tmp<Foam::volScalarField> Foam::constSolidThermo::K() const +//{ +// vector v(eigenValues(constK_.value())); +// +// if (mag(v.x() - v.z()) > SMALL) +// { +// FatalErrorIn("directionalSolidThermo::K() const") +// << "Supplied K " << constK_ +// << " are not isotropic. Eigenvalues are " +// << v << exit(FatalError); +// } +// +// return tmp<volScalarField> +// ( +// new volScalarField +// ( +// IOobject +// ( +// "K", +// mesh_.time().timeName(), +// mesh_, +// IOobject::NO_READ, +// IOobject::NO_WRITE +// ), +// mesh_, +// v.x() +// ) +// ); +//} + + +Foam::tmp<Foam::volScalarField> Foam::constSolidThermo::K() const +{ + return tmp<volScalarField> + ( + new volScalarField + ( + IOobject + ( + "K", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + constK_ + ) + ); +} + + +//Foam::tmp<Foam::volSymmTensorField> Foam::constSolidThermo::directionalK() +//const +//{ +// return tmp<volSymmTensorField> +// ( +// new volSymmTensorField +// ( +// IOobject +// ( +// "K", +// mesh_.time().timeName(), +// mesh_, +// IOobject::NO_READ, +// IOobject::NO_WRITE +// ), +// mesh_, +// constK_ +// ) +// ); +//} +Foam::tmp<Foam::volSymmTensorField> Foam::constSolidThermo::directionalK() const +{ + dimensionedSymmTensor t + ( + constK_.name(), + constK_.dimensions(), + symmTensor + ( + constK_.value(), + 0.0, + 0.0, + constK_.value(), + 0.0, + constK_.value() + ) + ); + return tmp<volSymmTensorField> + ( + new volSymmTensorField + ( + IOobject + ( + "K", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + t + ) + ); +} + + +Foam::tmp<Foam::volScalarField> Foam::constSolidThermo::Hf() const +{ + return tmp<volScalarField> + ( + new volScalarField + ( + IOobject + ( + "Hf", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + constHf_ + ) + ); +} + + +Foam::tmp<Foam::volScalarField> Foam::constSolidThermo::emissivity() const +{ + return tmp<volScalarField> + ( + new volScalarField + ( + IOobject + ( + "emissivity", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + constEmissivity_ + ) + ); +} + + +Foam::tmp<Foam::scalarField> Foam::constSolidThermo::rho +( + const label patchI +) const +{ + return tmp<scalarField> + ( + new scalarField + ( + T_.boundaryField()[patchI].size(), + constRho_.value() + ) + ); +} + + +Foam::tmp<Foam::scalarField> Foam::constSolidThermo::cp +( + const label patchI +) const +{ + return tmp<scalarField> + ( + new scalarField + ( + T_.boundaryField()[patchI].size(), + constCp_.value() + ) + ); +} + + +Foam::tmp<Foam::scalarField> Foam::constSolidThermo::K +( + const label patchI +) const +{ + return tmp<scalarField> + ( + new scalarField + ( + T_.boundaryField()[patchI].size(), + constK_.value() + ) + ); +} + + +Foam::tmp<Foam::symmTensorField> Foam::constSolidThermo::directionalK +( + const label patchI +) const +{ + symmTensor t + ( + constK_.value(), + 0.0, + 0.0, + constK_.value(), + 0.0, + constK_.value() + ); + return tmp<symmTensorField> + ( + new symmTensorField + ( + T_.boundaryField()[patchI].size(), + t + ) + ); +} + + +Foam::tmp<Foam::scalarField> Foam::constSolidThermo::Hf +( + const label patchI +) const +{ + return tmp<scalarField> + ( + new scalarField + ( + T_.boundaryField()[patchI].size(), + constHf_.value() + ) + ); +} + + +Foam::tmp<Foam::scalarField> Foam::constSolidThermo::emissivity +( + const label patchI +) const +{ + return tmp<scalarField> + ( + new scalarField + ( + T_.boundaryField()[patchI].size(), + constEmissivity_.value() + ) + ); +} + + +bool Foam::constSolidThermo::read() +{ + return read(subDict(typeName + "Coeffs")); +} + + +bool Foam::constSolidThermo::read(const dictionary& dict) +{ + constRho_ = dimensionedScalar(dict.lookup("rho")); + constCp_ = dimensionedScalar(dict.lookup("cp")); + constK_ = dimensionedScalar(dict.lookup("K")); + constHf_ = dimensionedScalar(dict.lookup("Hf")); + constEmissivity_ = dimensionedScalar(dict.lookup("emissivity")); + + Info<< "Constructed constSolidThermo with" << nl + << " rho : " << constRho_ << nl + << " cp : " << constCp_ << nl + << " K : " << constK_ << nl + << " Hf : " << constHf_ << nl + << " emissivity : " << constEmissivity_ << nl + << endl; + + return true; +} + + +bool Foam::constSolidThermo::writeData(Ostream& os) const +{ + bool ok = basicSolidThermo::writeData(os); + os.writeKeyword("rho") << constRho_ << token::END_STATEMENT << nl; + os.writeKeyword("cp") << constCp_ << token::END_STATEMENT << nl; + os.writeKeyword("K") << constK_ << token::END_STATEMENT << nl; + os.writeKeyword("Hf") << constHf_ << token::END_STATEMENT << nl; + os.writeKeyword("emissivity") << constEmissivity_ << token::END_STATEMENT + << nl; + return ok && os.good(); +} + + +// * * * * * * * * * * * * * * IOStream operators * * * * * * * * * * * * * // + +Foam::Ostream& Foam::operator<<(Ostream& os, const constSolidThermo& s) +{ + s.writeData(os); + return os; +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/basicSolidThermo/constSolidThermo/constSolidThermo.H b/src/thermophysicalModels/basicSolidThermo/constSolidThermo/constSolidThermo.H new file mode 100644 index 00000000000..41b92bd18d2 --- /dev/null +++ b/src/thermophysicalModels/basicSolidThermo/constSolidThermo/constSolidThermo.H @@ -0,0 +1,158 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ 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 <http://www.gnu.org/licenses/>. + +Class + Foam::constSolidThermo + +Description + The thermophysical properties of a constSolidThermo + +SourceFiles + constSolidThermo.C + +\*---------------------------------------------------------------------------*/ + +#ifndef constSolidThermo_H +#define constSolidThermo_H + +#include "basicSolidThermo.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class constSolidThermo Declaration +\*---------------------------------------------------------------------------*/ + +class constSolidThermo +: + public basicSolidThermo +{ + //- Density [kg/m3] + dimensionedScalar constRho_; + + //- Specific heat capacity [J/(kg.K)] + dimensionedScalar constCp_; + + //- Thermal conductivity [W/(m.K)] + //dimensionedSymmTensor constK_; + dimensionedScalar constK_; + + //- Heat of formation [J/kg] + dimensionedScalar constHf_; + + //- Emissivity + dimensionedScalar constEmissivity_; + +public: + + //- Runtime type information + TypeName("constSolidThermo"); + + + // Constructors + + //- Construct from mesh + constSolidThermo(const fvMesh& mesh); + + // Destructor + + virtual ~constSolidThermo(); + + + // Member Functions + + //- Update properties + virtual void correct(); + + //- Density [kg/m3] + virtual tmp<volScalarField> rho() const; + + //- Specific heat capacity [J/(kg.K)] + virtual tmp<volScalarField> cp() const; + + //- Thermal conductivity [W/(m.K)] + // Note: needs supplied K to be isotropic + virtual tmp<volScalarField> K() const; + + //- Thermal conductivity [W/(m.K)] + virtual tmp<volSymmTensorField> directionalK() const; + + //- Heat of formation [J/kg] + virtual tmp<volScalarField> Hf() const; + + //- Emissivity [] + virtual tmp<volScalarField> emissivity() const; + + + // Per patch calculation + + //- Density [kg/m3] + virtual tmp<scalarField> rho(const label patchI) const; + + //- Specific heat capacity [J/(kg.K)] + virtual tmp<scalarField> cp(const label patchI) const; + + //- Thermal conductivity [W/(m.K)] + virtual tmp<scalarField> K(const label patchI) const; + + //- Thermal conductivity [W/(m.K)] + virtual tmp<symmTensorField> directionalK(const label patchI) const; + + //- Heat of formation [J/kg] + virtual tmp<scalarField> Hf(const label patchI) const; + + //- Emissivity [] + virtual tmp<scalarField> emissivity(const label) const; + + + // I-O + + //- Write the constSolidThermo properties + virtual bool writeData(Ostream& os) const; + + //- Read solidThermophysicalProperties dictionary + virtual bool read(); + + //- Read solidThermophysicalProperties dictionary + bool read(const dictionary&); + + + + // Ostream Operator + + friend Ostream& operator<<(Ostream& os, const constSolidThermo& s); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/thermophysicalModels/basicSolidThermo/directionalSolidThermo/directionalSolidThermo.C b/src/thermophysicalModels/basicSolidThermo/directionalSolidThermo/directionalSolidThermo.C new file mode 100644 index 00000000000..e7caf0d8474 --- /dev/null +++ b/src/thermophysicalModels/basicSolidThermo/directionalSolidThermo/directionalSolidThermo.C @@ -0,0 +1,765 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ 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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "directionalSolidThermo.H" +#include "addToRunTimeSelectionTable.H" +#include "interpolateXY.H" +#include "transform.H" +#include "transformField.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(directionalSolidThermo, 0); + addToRunTimeSelectionTable + ( + basicSolidThermo, + directionalSolidThermo, + mesh + ); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::directionalSolidThermo::directionalSolidThermo(const fvMesh& mesh) +: + basicSolidThermo(mesh), + ccTransforms_ + ( + IOobject + ( + "ccTransforms", + mesh.time().timeName(), + mesh, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh, + dimLength + ) +{ + read(); + + // Determine transforms for cell centres + forAll(mesh.C(), cellI) + { + vector dir = mesh.C()[cellI] - coordSys_.origin(); + dir /= mag(dir); + + // Define local coordinate system with + // - e1 : axis from cc to centre + // - e3 : rotation axis + coordinateSystem cs + ( + "cc", + coordSys_.origin(), + coordSys_.e3(), //z',e3 + dir //x',e1 + ); + + ccTransforms_[cellI] = cs.R(); + } + + forAll(mesh.C().boundaryField(), patchI) + { + const fvPatchVectorField& patchC = mesh.C().boundaryField()[patchI]; + fvPatchTensorField& patchT = ccTransforms_.boundaryField()[patchI]; + + tensorField tc(patchT.size()); + forAll(tc, i) + { + vector dir = patchC[i] - coordSys_.origin(); + dir /= mag(dir); + + coordinateSystem cs + ( + "cc", + coordSys_.origin(), + coordSys_.e3(), //z',e3 + dir //x',e1 + ); + + tc[i] = cs.R(); + } + patchT = tc; + } + + if (debug) + { + Info<< "directionalSolidThermo : dumping converted Kxx, Kyy, Kzz" + << endl; + { + volVectorField Kxx + ( + IOobject + ( + "Kxx", + mesh.time().timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE, + false + ), + mesh, + dimless + ); + Kxx.internalField() = transform + ( + ccTransforms_.internalField(), + vectorField + ( + ccTransforms_.internalField().size(), + point(1, 0, 0) + ) + ); + forAll(Kxx.boundaryField(), patchI) + { + Kxx.boundaryField()[patchI] = transform + ( + ccTransforms_.boundaryField()[patchI], + vectorField + ( + ccTransforms_.boundaryField()[patchI].size(), + point(1, 0, 0) + ) + ); + } + Kxx.write(); + } + { + volVectorField Kyy + ( + IOobject + ( + "Kyy", + mesh.time().timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE, + false + ), + mesh, + dimless + ); + Kyy.internalField() = transform + ( + ccTransforms_.internalField(), + vectorField + ( + ccTransforms_.internalField().size(), + point(0, 1, 0) + ) + ); + forAll(Kyy.boundaryField(), patchI) + { + Kyy.boundaryField()[patchI] = transform + ( + ccTransforms_.boundaryField()[patchI], + vectorField + ( + ccTransforms_.boundaryField()[patchI].size(), + point(0, 1, 0) + ) + ); + } + Kyy.write(); + } + { + volVectorField Kzz + ( + IOobject + ( + "Kzz", + mesh.time().timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE, + false + ), + mesh, + dimless + ); + Kzz.internalField() = transform + ( + ccTransforms_.internalField(), + vectorField + ( + ccTransforms_.internalField().size(), + point(0, 0, 1) + ) + ); + forAll(Kzz.boundaryField(), patchI) + { + Kzz.boundaryField()[patchI] = transform + ( + ccTransforms_.boundaryField()[patchI], + vectorField + ( + ccTransforms_.boundaryField()[patchI].size(), + point(0, 0, 1) + ) + ); + } + Kzz.write(); + } + } + + + + correct(); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::directionalSolidThermo::~directionalSolidThermo() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::symmTensor Foam::directionalSolidThermo::transformPrincipal +( + const tensor& tt, + const vector& st +) const +{ + return symmTensor + ( + tt.xx()*st.x()*tt.xx() + + tt.xy()*st.y()*tt.xy() + + tt.xz()*st.z()*tt.xz(), + + tt.xx()*st.x()*tt.yx() + + tt.xy()*st.y()*tt.yy() + + tt.xz()*st.z()*tt.yz(), + + tt.xx()*st.x()*tt.zx() + + tt.xy()*st.y()*tt.zy() + + tt.xz()*st.z()*tt.zz(), + + tt.yx()*st.x()*tt.yx() + + tt.yy()*st.y()*tt.yy() + + tt.yz()*st.z()*tt.yz(), + + tt.yx()*st.x()*tt.zx() + + tt.yy()*st.y()*tt.zy() + + tt.yz()*st.z()*tt.zz(), + + tt.zx()*st.x()*tt.zx() + + tt.zy()*st.y()*tt.zy() + + tt.zz()*st.z()*tt.zz() + ); +} + + +void Foam::directionalSolidThermo::transformField +( + symmTensorField& fld, + const tensorField& tt, + const vectorField& st +) const +{ + fld.setSize(tt.size()); + forAll(fld, i) + { + fld[i] = transformPrincipal(tt[i], st[i]); + } +} + + +void Foam::directionalSolidThermo::correct() +{} + + +Foam::tmp<Foam::volScalarField> Foam::directionalSolidThermo::rho() const +{ + tmp<volScalarField> trho + ( + new volScalarField + ( + IOobject + ( + "rho", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimDensity + ) + ); + volScalarField& rho = trho(); + + rho.internalField() = interpolateXY + ( + T_.internalField(), + TValues_, + rhoValues_ + ); + + forAll(rho.boundaryField(), patchI) + { + rho.boundaryField()[patchI] == this->rho(patchI)(); + } + + return trho; +} + + +Foam::tmp<Foam::volScalarField> Foam::directionalSolidThermo::cp() const +{ + tmp<volScalarField> tcp + ( + new volScalarField + ( + IOobject + ( + "cp", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimEnergy/(dimMass*dimTemperature) + ) + ); + volScalarField& cp = tcp(); + + cp.internalField() = interpolateXY + ( + T_.internalField(), + TValues_, + cpValues_ + ); + + forAll(cp.boundaryField(), patchI) + { + cp.boundaryField()[patchI] == this->cp(patchI)(); + } + + return tcp; +} + + +Foam::tmp<Foam::volSymmTensorField> Foam::directionalSolidThermo::directionalK() +const +{ + tmp<volSymmTensorField> tK + ( + new volSymmTensorField + ( + IOobject + ( + "K", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimEnergy/dimTime/(dimLength*dimTemperature) + ) + ); + volSymmTensorField& K = tK(); + + // Get temperature interpolated properties (principal directions) + Field<vector> localK + ( + interpolateXY + ( + T_.internalField(), + TValues_, + KValues_ + ) + ); + + // Transform into global coordinate system + transformField(K.internalField(), ccTransforms_.internalField(), localK); + + forAll(K.boundaryField(), patchI) + { + K.boundaryField()[patchI] == this->directionalK(patchI)(); + } + + return tK; +} + + +Foam::tmp<Foam::volScalarField> Foam::directionalSolidThermo::K() const +{ + forAll(KValues_, i) + { + const vector& v = KValues_[i]; + if + ( + v.x() != v.y() + || v.x() != v.z() + || v.y() != v.z() + ) + { + FatalErrorIn("directionalSolidThermo::K() const") + << "Supplied K values " << KValues_ + << " are not isotropic." << exit(FatalError); + } + } + + // Get temperature interpolated properties (principal directions) + Field<vector> localK + ( + interpolateXY + ( + T_.internalField(), + TValues_, + KValues_ + ) + ); + + tmp<volScalarField> tK + ( + new volScalarField + ( + IOobject + ( + "K", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimEnergy/dimTime/(dimLength*dimTemperature) + ) + ); + volScalarField& K = tK(); + + K.internalField() = interpolateXY + ( + T_.internalField(), + TValues_, + KValues_.component(0)() + ); + + forAll(K.boundaryField(), patchI) + { + K.boundaryField()[patchI] == this->K(patchI)(); + } + + return tK; +} + + +Foam::tmp<Foam::volScalarField> Foam::directionalSolidThermo::Hf() const +{ + tmp<volScalarField> tHf + ( + new volScalarField + ( + IOobject + ( + "Hf", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimEnergy/dimMass + ) + ); + volScalarField& Hf = tHf(); + + Hf.internalField() = interpolateXY + ( + T_.internalField(), + TValues_, + HfValues_ + ); + + forAll(Hf.boundaryField(), patchI) + { + Hf.boundaryField()[patchI] == this->Hf(patchI)(); + } + + return tHf; +} + + +Foam::tmp<Foam::volScalarField> Foam::directionalSolidThermo::emissivity() const +{ + tmp<volScalarField> temissivity + ( + new volScalarField + ( + IOobject + ( + "emissivity", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimless + ) + ); + volScalarField& emissivity = temissivity(); + + emissivity.internalField() = interpolateXY + ( + T_.internalField(), + TValues_, + emissivityValues_ + ); + + forAll(emissivity.boundaryField(), patchI) + { + emissivity.boundaryField()[patchI] == this->emissivity(patchI)(); + } + + return temissivity; +} + + +Foam::tmp<Foam::scalarField> Foam::directionalSolidThermo::rho +( + const label patchI +) const +{ + return tmp<scalarField> + ( + new scalarField + ( + interpolateXY + ( + T_.boundaryField()[patchI], + TValues_, + rhoValues_ + ) + ) + ); +} + + +Foam::tmp<Foam::scalarField> Foam::directionalSolidThermo::cp +( + const label patchI +) const +{ + return tmp<scalarField> + ( + new scalarField + ( + interpolateXY + ( + T_.boundaryField()[patchI], + TValues_, + cpValues_ + ) + ) + ); +} + + +Foam::tmp<Foam::scalarField> Foam::directionalSolidThermo::K +( + const label patchI +) const +{ + forAll(KValues_, i) + { + const vector& v = KValues_[i]; + if + ( + v.x() != v.y() + || v.x() != v.z() + || v.y() != v.z() + ) + { + FatalErrorIn("directionalSolidThermo::K() const") + << "Supplied K values " << KValues_ + << " are not isotropic." << exit(FatalError); + } + } + + return tmp<scalarField> + ( + new scalarField + ( + interpolateXY + ( + T_.boundaryField()[patchI], + TValues_, + KValues_.component(0)() + ) + ) + ); +} + + +Foam::tmp<Foam::symmTensorField> Foam::directionalSolidThermo::directionalK +( + const label patchI +) const +{ + const fvPatchScalarField& patchT = T_.boundaryField()[patchI]; + + Field<vector> localK(interpolateXY(patchT, TValues_, KValues_)); + + tmp<symmTensorField> tglobalK(new symmTensorField(localK.size())); + transformField(tglobalK(), ccTransforms_.boundaryField()[patchI], localK); + + return tglobalK; +} + + +Foam::tmp<Foam::scalarField> Foam::directionalSolidThermo::Hf +( + const label patchI +) const +{ + return tmp<scalarField> + ( + new scalarField + ( + interpolateXY + ( + T_.boundaryField()[patchI], + TValues_, + HfValues_ + ) + ) + ); +} + + +Foam::tmp<Foam::scalarField> Foam::directionalSolidThermo::emissivity +( + const label patchI +) const +{ + return tmp<scalarField> + ( + new scalarField + ( + interpolateXY + ( + T_.boundaryField()[patchI], + TValues_, + emissivityValues_ + ) + ) + ); +} + + +bool Foam::directionalSolidThermo::read() +{ + return read(subDict(typeName + "Coeffs")); +} + + +bool Foam::directionalSolidThermo::read(const dictionary& dict) +{ + TValues_ = Field<scalar>(dict.lookup("TValues")); + rhoValues_ = Field<scalar>(dict.lookup("rhoValues")); + cpValues_ = Field<scalar>(dict.lookup("cpValues")); + KValues_ = Field<vector>(dict.lookup("KValues")); + HfValues_ = Field<scalar>(dict.lookup("HfValues")); + emissivityValues_ = Field<scalar>(dict.lookup("emissivityValues")); + coordSys_ = coordinateSystem(dict, mesh_); + + Info<< "Constructed directionalSolidThermo with samples" << nl + << " T : " << TValues_ << nl + << " rho : " << rhoValues_ << nl + << " cp : " << cpValues_ << nl + << " K : " << KValues_ << nl + << " in coordinates system" << nl + << " type : " << coordSys_.type() << nl + << " e3 : " << coordSys_.e3() << nl + << " e1 : " << coordSys_.e1() << nl + << " Hf : " << HfValues_ << nl + << " emissivity : " << emissivityValues_ << nl + << endl; + + + if + ( + (TValues_.size() != rhoValues_.size()) + && (TValues_.size() != cpValues_.size()) + && (TValues_.size() != rhoValues_.size()) + && (TValues_.size() != KValues_.size()) + && (TValues_.size() != HfValues_.size()) + && (TValues_.size() != emissivityValues_.size()) + ) + { + FatalIOErrorIn("directionalSolidThermo::read()", dict) + << "Size of property tables should be equal to size of Temperature" + << " values " << TValues_.size() + << exit(FatalIOError); + } + + for (label i = 1; i < TValues_.size(); i++) + { + if (TValues_[i] <= TValues_[i-1]) + { + FatalIOErrorIn("directionalSolidThermo::read()", dict) + << "Temperature values are not in increasing order " + << TValues_ << exit(FatalIOError); + } + } + return true; +} + + +bool Foam::directionalSolidThermo::writeData(Ostream& os) const +{ + bool ok = basicSolidThermo::writeData(os); + os.writeKeyword("TValues") << TValues_ << token::END_STATEMENT << nl; + os.writeKeyword("rhoValues") << rhoValues_ << token::END_STATEMENT << nl; + os.writeKeyword("cpValues") << cpValues_ << token::END_STATEMENT << nl; + os.writeKeyword("KValues") << KValues_ << token::END_STATEMENT << nl; + os.writeKeyword("HfValues") << HfValues_ << token::END_STATEMENT << nl; + os.writeKeyword("emissivityValues") << emissivityValues_ + << token::END_STATEMENT << nl; + + return ok && os.good(); +} + + +// * * * * * * * * * * * * * * IOStream operators * * * * * * * * * * * * * // + +Foam::Ostream& Foam::operator<<(Ostream& os, const directionalSolidThermo& s) +{ + s.writeData(os); + return os; +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/basicSolidThermo/directionalSolidThermo/directionalSolidThermo.H b/src/thermophysicalModels/basicSolidThermo/directionalSolidThermo/directionalSolidThermo.H new file mode 100644 index 00000000000..7cc9648744a --- /dev/null +++ b/src/thermophysicalModels/basicSolidThermo/directionalSolidThermo/directionalSolidThermo.H @@ -0,0 +1,183 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ 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 <http://www.gnu.org/licenses/>. + +Class + Foam::directionalSolidThermo + +Description + Directional conductivity + table interpolation. + +SourceFiles + directionalSolidThermo.C + +\*---------------------------------------------------------------------------*/ + +#ifndef directionalSolidThermo_H +#define directionalSolidThermo_H + +#include "basicSolidThermo.H" +#include "coordinateSystem.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class directionalSolidThermo Declaration +\*---------------------------------------------------------------------------*/ + +class directionalSolidThermo +: + public basicSolidThermo +{ + // Private data + + //- Temperature samples + Field<scalar> TValues_; + + //- Density at given temperatures + Field<scalar> rhoValues_; + + Field<scalar> cpValues_; + + Field<vector> KValues_; + + Field<scalar> HfValues_; + + Field<scalar> emissivityValues_; + + //- Coordinate system used for the directional properties + coordinateSystem coordSys_; + + //- Transformation for cell centres + volTensorField ccTransforms_; + + + // Private Member Functions + + //- Transform principal values of symmTensor + symmTensor transformPrincipal(const tensor& tt, const vector& st) const; + + //- Transform principal values of symmTensor + void transformField + ( + symmTensorField& fld, + const tensorField& tt, + const vectorField& st + ) const; + + +public: + + //- Runtime type information + TypeName("directionalSolidThermo"); + + + // Constructors + + //- Construct from mesh + directionalSolidThermo(const fvMesh& mesh); + + // Destructor + + virtual ~directionalSolidThermo(); + + + // Member Functions + + //- Update properties + virtual void correct(); + + //- Density [kg/m3] + virtual tmp<volScalarField> rho() const; + + //- Specific heat capacity [J/(kg.K)] + virtual tmp<volScalarField> cp() const; + + //- Thermal conductivity [W/(m.K)] + virtual tmp<volScalarField> K() const; + + //- Thermal conductivity [W/(m.K)] + virtual tmp<volSymmTensorField> directionalK() const; + + //- Heat of formation [J/kg] + virtual tmp<volScalarField> Hf() const; + + //- Emissivity [] + virtual tmp<volScalarField> emissivity() const; + + + // Per patch calculation + + //- Density [kg/m3] + virtual tmp<scalarField> rho(const label patchI) const; + + //- Specific heat capacity [J/(kg.K)] + virtual tmp<scalarField> cp(const label patchI) const; + + //- Thermal conductivity [W/(m.K)] + // Note: needs Kvalues to be isotropic + virtual tmp<scalarField> K(const label patchI) const; + + //- Thermal conductivity [W/(m.K)] + virtual tmp<symmTensorField> directionalK(const label patchI) const; + + //- Heat of formation [J/kg] + virtual tmp<scalarField> Hf(const label patchI) const; + + //- Emissivity [] + virtual tmp<scalarField> emissivity(const label) const; + + + // I-O + + //- Write the directionalSolidThermo properties + virtual bool writeData(Ostream& os) const; + + //- Read the directionalSolidThermo properties + virtual bool read(); + + //- Read the directionalSolidThermo properties + bool read(const dictionary& dict); + + + // Ostream Operator + + friend Ostream& operator<< + ( + Ostream& os, + const directionalSolidThermo& s + ); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/thermophysicalModels/basicSolidThermo/interpolatedSolidThermo/interpolatedSolidThermo.C b/src/thermophysicalModels/basicSolidThermo/interpolatedSolidThermo/interpolatedSolidThermo.C new file mode 100644 index 00000000000..c82f431a65f --- /dev/null +++ b/src/thermophysicalModels/basicSolidThermo/interpolatedSolidThermo/interpolatedSolidThermo.C @@ -0,0 +1,501 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ 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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "interpolatedSolidThermo.H" +#include "addToRunTimeSelectionTable.H" +#include "interpolateXY.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(interpolatedSolidThermo, 0); + addToRunTimeSelectionTable + ( + basicSolidThermo, + interpolatedSolidThermo, + mesh + ); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::interpolatedSolidThermo::interpolatedSolidThermo(const fvMesh& mesh) +: + basicSolidThermo(mesh) +{ + read(); + correct(); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::interpolatedSolidThermo::~interpolatedSolidThermo() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::interpolatedSolidThermo::correct() +{} + + +Foam::tmp<Foam::volScalarField> Foam::interpolatedSolidThermo::rho() const +{ + tmp<volScalarField> trho + ( + new volScalarField + ( + IOobject + ( + "rho", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimDensity + ) + ); + volScalarField& rho = trho(); + + rho.internalField() = interpolateXY + ( + T_.internalField(), + TValues_, + rhoValues_ + ); + + forAll(rho.boundaryField(), patchI) + { + rho.boundaryField()[patchI] == this->rho(patchI)(); + } + + return trho; +} + + +Foam::tmp<Foam::volScalarField> Foam::interpolatedSolidThermo::cp() const +{ + tmp<volScalarField> tcp + ( + new volScalarField + ( + IOobject + ( + "cp", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimEnergy/(dimMass*dimTemperature) + ) + ); + volScalarField& cp = tcp(); + + cp.internalField() = interpolateXY + ( + T_.internalField(), + TValues_, + cpValues_ + ); + + forAll(cp.boundaryField(), patchI) + { + cp.boundaryField()[patchI] == this->cp(patchI)(); + } + + return tcp; +} + + +Foam::tmp<Foam::volScalarField> Foam::interpolatedSolidThermo::K() const +{ + tmp<volScalarField> tK + ( + new volScalarField + ( + IOobject + ( + "K", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimEnergy/dimTime/(dimLength*dimTemperature) + ) + ); + volScalarField& K = tK(); + + K.internalField() = interpolateXY + ( + T_.internalField(), + TValues_, + KValues_ + ); + + forAll(K.boundaryField(), patchI) + { + K.boundaryField()[patchI] == this->K(patchI)(); + } + + return tK; +} + + +Foam::tmp<Foam::volSymmTensorField> +Foam::interpolatedSolidThermo::directionalK() +const +{ + tmp<volSymmTensorField> tK + ( + new volSymmTensorField + ( + IOobject + ( + "K", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimensionedSymmTensor + ( + "zero", + dimEnergy/dimTime/(dimLength*dimTemperature), + symmTensor::zero + ) + ) + ); + volSymmTensorField& K = tK(); + + Field<scalar> scalarK + ( + interpolateXY + ( + T_.internalField(), + TValues_, + KValues_ + ) + ); + + K.internalField().replace(symmTensor::XX, scalarK); + K.internalField().replace(symmTensor::YY, scalarK); + K.internalField().replace(symmTensor::ZZ, scalarK); + + forAll(K.boundaryField(), patchI) + { + K.boundaryField()[patchI] == this->directionalK(patchI)(); + } + + return tK; +} + + +Foam::tmp<Foam::volScalarField> Foam::interpolatedSolidThermo::Hf() const +{ + tmp<volScalarField> tHf + ( + new volScalarField + ( + IOobject + ( + "Hf", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimEnergy/dimMass + ) + ); + volScalarField& Hf = tHf(); + + Hf.internalField() = interpolateXY + ( + T_.internalField(), + TValues_, + HfValues_ + ); + + forAll(Hf.boundaryField(), patchI) + { + Hf.boundaryField()[patchI] == this->Hf(patchI)(); + } + + return tHf; +} + + +Foam::tmp<Foam::volScalarField> Foam::interpolatedSolidThermo::emissivity() const +{ + tmp<volScalarField> temissivity + ( + new volScalarField + ( + IOobject + ( + "emissivity", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimless + ) + ); + volScalarField& emissivity = temissivity(); + + emissivity.internalField() = interpolateXY + ( + T_.internalField(), + TValues_, + emissivityValues_ + ); + + forAll(emissivity.boundaryField(), patchI) + { + emissivity.boundaryField()[patchI] == this->emissivity(patchI)(); + } + + return temissivity; +} + + +Foam::tmp<Foam::scalarField> Foam::interpolatedSolidThermo::rho +( + const label patchI +) const +{ + return tmp<scalarField> + ( + new scalarField + ( + interpolateXY + ( + T_.boundaryField()[patchI], + TValues_, + rhoValues_ + ) + ) + ); +} + + +Foam::tmp<Foam::scalarField> Foam::interpolatedSolidThermo::cp +( + const label patchI +) const +{ + return tmp<scalarField> + ( + new scalarField + ( + interpolateXY + ( + T_.boundaryField()[patchI], + TValues_, + cpValues_ + ) + ) + ); +} + + +Foam::tmp<Foam::scalarField> Foam::interpolatedSolidThermo::K +( + const label patchI +) const +{ + return tmp<scalarField> + ( + new scalarField + ( + interpolateXY + ( + T_.boundaryField()[patchI], + TValues_, + KValues_ + ) + ) + ); +} + + +Foam::tmp<Foam::symmTensorField> Foam::interpolatedSolidThermo::directionalK +( + const label patchI +) const +{ + const fvPatchScalarField& patchT = T_.boundaryField()[patchI]; + + Field<scalar> scalarK(interpolateXY(patchT, TValues_, KValues_)); + + tmp<symmTensorField> tfld + ( + new symmTensorField + ( + scalarK.size(), + symmTensor::zero + ) + ); + symmTensorField& fld = tfld(); + + fld.replace(symmTensor::XX, scalarK); + fld.replace(symmTensor::YY, scalarK); + fld.replace(symmTensor::ZZ, scalarK); + + return tfld; +} + + +Foam::tmp<Foam::scalarField> Foam::interpolatedSolidThermo::Hf +( + const label patchI +) const +{ + return tmp<scalarField> + ( + new scalarField + ( + interpolateXY + ( + T_.boundaryField()[patchI], + TValues_, + HfValues_ + ) + ) + ); +} + + +Foam::tmp<Foam::scalarField> Foam::interpolatedSolidThermo::emissivity +( + const label patchI +) const +{ + return tmp<scalarField> + ( + new scalarField + ( + interpolateXY + ( + T_.boundaryField()[patchI], + TValues_, + emissivityValues_ + ) + ) + ); +} + + +bool Foam::interpolatedSolidThermo::read() +{ + return read(subDict(typeName + "Coeffs")); +} + + +bool Foam::interpolatedSolidThermo::read(const dictionary& dict) +{ + TValues_ = Field<scalar>(dict.lookup("TValues")); + rhoValues_ = Field<scalar>(dict.lookup("rhoValues")); + cpValues_ = Field<scalar>(dict.lookup("cpValues")); + KValues_ = Field<scalar>(dict.lookup("KValues")); + HfValues_ = Field<scalar>(dict.lookup("HfValues")); + emissivityValues_ = Field<scalar>(dict.lookup("emissivityValues")); + + Info<< "Constructed interpolatedSolidThermo with samples" << nl + << " T : " << TValues_ << nl + << " rho : " << rhoValues_ << nl + << " cp : " << cpValues_ << nl + << " K : " << KValues_ << nl + << " Hf : " << HfValues_ << nl + << " emissivity : " << emissivityValues_ << nl + << endl; + + if + ( + (TValues_.size() != rhoValues_.size()) + && (TValues_.size() != cpValues_.size()) + && (TValues_.size() != rhoValues_.size()) + && (TValues_.size() != KValues_.size()) + && (TValues_.size() != HfValues_.size()) + && (TValues_.size() != emissivityValues_.size()) + ) + { + FatalIOErrorIn("interpolatedSolidThermo::read()", dict) + << "Size of property tables should be equal to size of Temperature" + << " values " << TValues_.size() + << exit(FatalIOError); + } + + for (label i = 1; i < TValues_.size(); i++) + { + if (TValues_[i] <= TValues_[i-1]) + { + FatalIOErrorIn("interpolatedSolidThermo::read()", dict) + << "Temperature values are not in increasing order " + << TValues_ << exit(FatalIOError); + } + } + return true; +} + + +bool Foam::interpolatedSolidThermo::writeData(Ostream& os) const +{ + bool ok = basicSolidThermo::writeData(os); + os.writeKeyword("TValues") << TValues_ << token::END_STATEMENT << nl; + os.writeKeyword("rhoValues") << rhoValues_ << token::END_STATEMENT << nl; + os.writeKeyword("cpValues") << cpValues_ << token::END_STATEMENT << nl; + os.writeKeyword("KValues") << KValues_ << token::END_STATEMENT << nl; + os.writeKeyword("HfValues") << HfValues_ << token::END_STATEMENT << nl; + os.writeKeyword("emissivityValues") << emissivityValues_ + << token::END_STATEMENT << nl; + + return ok && os.good(); +} + + +// * * * * * * * * * * * * * * IOStream operators * * * * * * * * * * * * * // + +Foam::Ostream& Foam::operator<<(Ostream& os, const interpolatedSolidThermo& s) +{ + s.writeData(os); + return os; +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/basicSolidThermo/interpolatedSolidThermo/interpolatedSolidThermo.H b/src/thermophysicalModels/basicSolidThermo/interpolatedSolidThermo/interpolatedSolidThermo.H new file mode 100644 index 00000000000..571138e0231 --- /dev/null +++ b/src/thermophysicalModels/basicSolidThermo/interpolatedSolidThermo/interpolatedSolidThermo.H @@ -0,0 +1,161 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ 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 <http://www.gnu.org/licenses/>. + +Class + Foam::interpolatedSolidThermo + +Description + Table interpolated solid thermo. + +SourceFiles + interpolatedSolidThermo.C + +\*---------------------------------------------------------------------------*/ + +#ifndef interpolatedSolidThermo_H +#define interpolatedSolidThermo_H + +#include "basicSolidThermo.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class interpolatedSolidThermo Declaration +\*---------------------------------------------------------------------------*/ + +class interpolatedSolidThermo +: + public basicSolidThermo +{ + // Private data + + //- Temperature samples + Field<scalar> TValues_; + + //- Density at given temperatures + Field<scalar> rhoValues_; + + Field<scalar> cpValues_; + + Field<scalar> KValues_; + + Field<scalar> HfValues_; + + Field<scalar> emissivityValues_; + +public: + + //- Runtime type information + TypeName("interpolatedSolidThermo"); + + + // Constructors + + //- Construct from mesh + interpolatedSolidThermo(const fvMesh& mesh); + + // Destructor + + virtual ~interpolatedSolidThermo(); + + + // Member Functions + + //- Update properties + virtual void correct(); + + //- Density [kg/m3] + virtual tmp<volScalarField> rho() const; + + //- Specific heat capacity [J/(kg.K)] + virtual tmp<volScalarField> cp() const; + + //- Thermal conductivity [W/(m.K)] + virtual tmp<volScalarField> K() const; + + //- Thermal conductivity [W/(m.K)] + virtual tmp<volSymmTensorField> directionalK() const; + + //- Heat of formation [J/kg] + virtual tmp<volScalarField> Hf() const; + + //- Emissivity [] + virtual tmp<volScalarField> emissivity() const; + + + // Per patch calculation + + //- Density [kg/m3] + virtual tmp<scalarField> rho(const label patchI) const; + + //- Specific heat capacity [J/(kg.K)] + virtual tmp<scalarField> cp(const label patchI) const; + + //- Thermal conductivity [W/(m.K)] + // Note: needs Kvalues to be isotropic + virtual tmp<scalarField> K(const label patchI) const; + + //- Thermal conductivity [W/(m.K)] + virtual tmp<symmTensorField> directionalK(const label patchI) const; + + //- Heat of formation [J/kg] + virtual tmp<scalarField> Hf(const label patchI) const; + + //- Emissivity [] + virtual tmp<scalarField> emissivity(const label) const; + + + // I-O + + //- Write the interpolatedSolidThermo properties + virtual bool writeData(Ostream& os) const; + + //- Read the interpolatedSolidThermo properties + virtual bool read(); + + //- Read the interpolatedSolidThermo properties + bool read(const dictionary& dict); + + + // Ostream Operator + + friend Ostream& operator<< + ( + Ostream& os, + const interpolatedSolidThermo& s + ); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/temperatureCoupledBase/temperatureCoupledBase.C b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/temperatureCoupledBase/temperatureCoupledBase.C new file mode 100644 index 00000000000..1026ca123cb --- /dev/null +++ b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/temperatureCoupledBase/temperatureCoupledBase.C @@ -0,0 +1,179 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. + \\/ 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "temperatureCoupledBase.H" +#include "volFields.H" +#include "basicSolidThermo.H" +#include "RASModel.H" +#include "basicThermo.H" + +// * * * * * * * * * * * * * Static Member Data * * * * * * * * * * * * * * // + +template<> +const char* Foam::NamedEnum<Foam::temperatureCoupledBase::KMethodType, 4>:: +names[] = +{ + "basicThermo", + "solidThermo", + "directionalSolidThermo", + "lookup" +}; + + +const Foam::NamedEnum<Foam::temperatureCoupledBase::KMethodType, 4> + Foam::temperatureCoupledBase::KMethodTypeNames_; + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::temperatureCoupledBase::temperatureCoupledBase +( + const fvPatch& patch, + const word& calculationType, + const word& KName +) +: + patch_(patch), + method_(KMethodTypeNames_[calculationType]), + KName_(KName) +{} + + +Foam::temperatureCoupledBase::temperatureCoupledBase +( + const fvPatch& patch, + const dictionary& dict +) +: + patch_(patch), + method_(KMethodTypeNames_.read(dict.lookup("K"))), + KName_(dict.lookup("KName")) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::tmp<Foam::scalarField> Foam::temperatureCoupledBase::K +( + const scalarField& Tp +) const +{ + const fvMesh& mesh = patch_.boundaryMesh().mesh(); + + switch (method_) + { + case BASICTHERMO: + { + const compressible::RASModel& model = + mesh.lookupObject<compressible::RASModel>("RASProperties"); + + return + model.alphaEff(patch_.index()) + *model.thermo().Cp(Tp, patch_.index()); + } + break; + + case SOLIDTHERMO: + { + const basicSolidThermo& thermo = + mesh.lookupObject<basicSolidThermo> + ( + "solidThermophysicalProperties" + ); + return thermo.K(patch_.index()); + } + break; + + case DIRECTIONALSOLIDTHERMO: + { + vectorField n = patch_.nf(); + + const basicSolidThermo& thermo = + mesh.lookupObject<basicSolidThermo> + ( + "solidThermophysicalProperties" + ); + return n & thermo.directionalK(patch_.index()) & n; + } + break; + + case LOOKUP: + { + if (mesh.objectRegistry::foundObject<volScalarField>(KName_)) + { + return patch_.lookupPatchField<volScalarField, scalar>(KName_); + } + else if + ( + mesh.objectRegistry::foundObject<volSymmTensorField>(KName_) + ) + { + const symmTensorField& KWall = + patch_.lookupPatchField<volSymmTensorField, scalar>(KName_); + + vectorField n = patch_.nf(); + + return n & KWall & n; + } + else + { + FatalErrorIn("temperatureCoupledBase::K() const") + << "Did not find field " << KName_ + << " on mesh " << mesh.name() << " patch " << patch_.name() + << endl + << "Please set 'K' to one of " << KMethodTypeNames_.toc() + << " and 'KName' to the name of the volScalar" + << " or volSymmTensor field (if K=lookup)" + << exit(FatalError); + + return scalarField(0); + } + } + + default: + { + FatalErrorIn("temperatureCoupledBase::K() const") + << "Unimplemented method " << method_ << endl + << "Please set 'K' to one of " << KMethodTypeNames_.toc() + << " and 'KName' to the name of the volScalar" + << " or volSymmTensor field (if K=lookup)" + << exit(FatalError); + } + break; + } + return scalarField(0); +} + + +void Foam::temperatureCoupledBase::write(Ostream& os) const +{ + os.writeKeyword("K") << KMethodTypeNames_[method_] + << token::END_STATEMENT << nl; + os.writeKeyword("KName") << KName_ << token::END_STATEMENT << nl; +} + + +// ************************************************************************* // diff --git a/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/temperatureCoupledBase/temperatureCoupledBase.H b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/temperatureCoupledBase/temperatureCoupledBase.H new file mode 100644 index 00000000000..35b4de5e238 --- /dev/null +++ b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/temperatureCoupledBase/temperatureCoupledBase.H @@ -0,0 +1,137 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. + \\/ 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + temperatureCoupledBase + +Description + Common functions for use in temperature coupled boundaries. For now only + + K() : heat conduction at patch. Gets supplied how to lookup/calculate K: + + - 'lookup' : lookup volScalarField (or volSymmTensorField) with name + - 'basicThermo' : use basicThermo and compressible::RASmodel to calculate K + - 'solidThermo' : use basicSolidThermo K() + - 'directionalSolidThermo' directionalK() + +SourceFiles + temperatureCoupledBase.C + +\*---------------------------------------------------------------------------*/ + +#ifndef temperatureCoupledBase_H +#define temperatureCoupledBase_H + +#include "scalarField.H" +#include "NamedEnum.H" +#include "fvPatch.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class temperatureCoupledBase Declaration +\*---------------------------------------------------------------------------*/ + +class temperatureCoupledBase +{ +public: + //- Type of supplied K + enum KMethodType + { + BASICTHERMO, + SOLIDTHERMO, + DIRECTIONALSOLIDTHERMO, + LOOKUP + }; + +//private: + + // Private data + + static const NamedEnum<KMethodType, 4> KMethodTypeNames_; + + //- Underlying patch + const fvPatch& patch_; + + //- How to get K + const KMethodType method_; + + //- Name of thermal conductivity field (if looked up from database) + const word KName_; + + +public: + + // Constructors + + //- Construct from patch and K name + temperatureCoupledBase + ( + const fvPatch& patch, + const word& calculationMethod, + const word& KName + ); + + //- Construct from patch and dictionary + temperatureCoupledBase + ( + const fvPatch& patch, + const dictionary& dict + ); + + + // Member functions + + //- Method to obtain K + word KMethod() const + { + return KMethodTypeNames_[method_]; + } + + //- Name of thermal conductivity field + const word& KName() const + { + return KName_; + } + + //- Given patch temperature calculate corresponding K field + tmp<scalarField> K(const scalarField& Tp) const; + + //- Write + void write(Ostream&) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // -- GitLab