the new fluidThermophysicalTransportModel and solidThermophysicalTransportModel are derived from thermophysicalTransportModel providing a consistent and unified interface for heat transport within and between regions. Coupled and external heat-transfer boundary conditions can now be written independent of the thermophysical properties or transport modelling of the regions providing greater flexibility, simpler code and reduces the maintenance overhead.
242 lines
6.4 KiB
C++
242 lines
6.4 KiB
C++
/*---------------------------------------------------------------------------*\
|
|
========= |
|
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
\\ / O peration | Website: https://openfoam.org
|
|
\\ / A nd | Copyright (C) 2013-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 <http://www.gnu.org/licenses/>.
|
|
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
#include "yPlus.H"
|
|
#include "momentumTransportModel.H"
|
|
#include "nutWallFunctionFvPatchScalarField.H"
|
|
#include "wallFvPatch.H"
|
|
#include "nearWallDist.H"
|
|
#include "addToRunTimeSelectionTable.H"
|
|
|
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
|
|
namespace Foam
|
|
{
|
|
namespace functionObjects
|
|
{
|
|
defineTypeNameAndDebug(yPlus, 0);
|
|
|
|
addToRunTimeSelectionTable
|
|
(
|
|
functionObject,
|
|
yPlus,
|
|
dictionary
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
|
|
|
void Foam::functionObjects::yPlus::writeFileHeader(const label i)
|
|
{
|
|
writeHeader(file(), "y+ ()");
|
|
|
|
writeCommented(file(), "Time");
|
|
writeTabbed(file(), "patch");
|
|
writeTabbed(file(), "min");
|
|
writeTabbed(file(), "max");
|
|
writeTabbed(file(), "average");
|
|
file() << endl;
|
|
}
|
|
|
|
|
|
Foam::tmp<Foam::volScalarField> Foam::functionObjects::yPlus::calcYPlus
|
|
(
|
|
const momentumTransportModel& turbModel
|
|
)
|
|
{
|
|
tmp<volScalarField> tyPlus
|
|
(
|
|
volScalarField::New
|
|
(
|
|
IOobject::groupName(type(), phaseName_),
|
|
mesh_,
|
|
dimensionedScalar(dimless, 0)
|
|
)
|
|
);
|
|
|
|
volScalarField::Boundary& yPlusBf = tyPlus.ref().boundaryFieldRef();
|
|
|
|
const volScalarField::Boundary& d = nearWallDist::New(mesh_).y();
|
|
|
|
const tmp<volScalarField> tnut = turbModel.nut();
|
|
const volScalarField::Boundary& nutBf = tnut().boundaryField();
|
|
|
|
const tmp<volScalarField> tnuEff = turbModel.nuEff();
|
|
const volScalarField::Boundary& nuEffBf = tnuEff().boundaryField();
|
|
|
|
const tmp<volScalarField> tnu = turbModel.nu();
|
|
const volScalarField::Boundary& nuBf = tnu().boundaryField();
|
|
|
|
const fvPatchList& patches = mesh_.boundary();
|
|
|
|
forAll(patches, patchi)
|
|
{
|
|
const fvPatch& patch = patches[patchi];
|
|
|
|
if (isA<nutWallFunctionFvPatchScalarField>(nutBf[patchi]))
|
|
{
|
|
const nutWallFunctionFvPatchScalarField& nutPf =
|
|
dynamic_cast<const nutWallFunctionFvPatchScalarField&>
|
|
(
|
|
nutBf[patchi]
|
|
);
|
|
|
|
yPlusBf[patchi] = nutPf.yPlus();
|
|
}
|
|
else if (isA<wallFvPatch>(patch))
|
|
{
|
|
yPlusBf[patchi] =
|
|
d[patchi]
|
|
*sqrt
|
|
(
|
|
nuEffBf[patchi]
|
|
*mag(turbModel.U().boundaryField()[patchi].snGrad())
|
|
)/nuBf[patchi];
|
|
}
|
|
}
|
|
|
|
return tyPlus;
|
|
}
|
|
|
|
|
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
|
|
Foam::functionObjects::yPlus::yPlus
|
|
(
|
|
const word& name,
|
|
const Time& runTime,
|
|
const dictionary& dict
|
|
)
|
|
:
|
|
fvMeshFunctionObject(name, runTime, dict),
|
|
logFiles(obr_, name),
|
|
writeLocalObjects(obr_, log),
|
|
phaseName_(dict.lookupOrDefault<word>("phase", word::null))
|
|
{
|
|
read(dict);
|
|
}
|
|
|
|
|
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
|
|
Foam::functionObjects::yPlus::~yPlus()
|
|
{}
|
|
|
|
|
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
|
|
|
bool Foam::functionObjects::yPlus::read(const dictionary& dict)
|
|
{
|
|
fvMeshFunctionObject::read(dict);
|
|
writeLocalObjects::read(dict);
|
|
|
|
resetName(IOobject::groupName(typeName, phaseName_));
|
|
resetLocalObjectName(IOobject::groupName(typeName, phaseName_));
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
bool Foam::functionObjects::yPlus::execute()
|
|
{
|
|
if (mesh_.foundObject<momentumTransportModel>
|
|
(
|
|
IOobject::groupName(momentumTransportModel::typeName, phaseName_))
|
|
)
|
|
{
|
|
const momentumTransportModel& model =
|
|
mesh_.lookupType<momentumTransportModel>(phaseName_);
|
|
|
|
word name(IOobject::groupName(type(), phaseName_));
|
|
|
|
return store(name, calcYPlus(model));
|
|
}
|
|
else
|
|
{
|
|
FatalErrorInFunction
|
|
<< "Unable to find turbulence model in the "
|
|
<< "database" << exit(FatalError);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
bool Foam::functionObjects::yPlus::write()
|
|
{
|
|
Log << type() << " " << name() << " write:" << nl;
|
|
|
|
writeLocalObjects::write();
|
|
|
|
logFiles::write();
|
|
|
|
const volScalarField& yPlus =
|
|
mesh_.lookupObject<volScalarField>
|
|
(
|
|
IOobject::groupName(type(), phaseName_)
|
|
);
|
|
|
|
const volScalarField::Boundary& yPlusBf = yPlus.boundaryField();
|
|
const fvPatchList& patches = mesh_.boundary();
|
|
|
|
forAll(patches, patchi)
|
|
{
|
|
const fvPatch& patch = patches[patchi];
|
|
|
|
if (isA<wallFvPatch>(patch))
|
|
{
|
|
const scalarField& yPlusp = yPlusBf[patchi];
|
|
|
|
const scalar minYplus = gMin(yPlusp);
|
|
const scalar maxYplus = gMax(yPlusp);
|
|
const scalar avgYplus = gAverage(yPlusp);
|
|
|
|
if (Pstream::master())
|
|
{
|
|
Log << " patch " << patch.name()
|
|
<< " y+ : min = " << minYplus << ", max = " << maxYplus
|
|
<< ", average = " << avgYplus << nl;
|
|
|
|
writeTime(file());
|
|
file()
|
|
<< tab << patch.name()
|
|
<< tab << minYplus
|
|
<< tab << maxYplus
|
|
<< tab << avgYplus
|
|
<< endl;
|
|
}
|
|
}
|
|
}
|
|
|
|
Log << endl;
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
// ************************************************************************* //
|