mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
reactingTwoPhaseEulerFoam: Added thermal wall-functions with support for wall-boiling
Code and tutorial case provided by Juho Peltola
This commit is contained in:
@ -35,7 +35,9 @@ kineticTheoryModels/frictionalStressModel/Schaeffer/SchaefferFrictionalStress.C
|
||||
kineticTheoryModels/derivedFvPatchFields/JohnsonJacksonParticleTheta/JohnsonJacksonParticleThetaFvPatchScalarField.C
|
||||
kineticTheoryModels/derivedFvPatchFields/JohnsonJacksonParticleSlip/JohnsonJacksonParticleSlipFvPatchVectorField.C
|
||||
|
||||
derivedFvPatchFields/alphatPhaseChangeJayatillekeWallFunction/alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField.C
|
||||
derivedFvPatchFields/alphatFixedDmdtWallBoilingWallFunction/alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField.C
|
||||
derivedFvPatchFields/alphatWallBoilingWallFunction/alphatWallBoilingWallFunctionFvPatchScalarField.C
|
||||
derivedFvPatchFields/copiedFixedValue/copiedFixedValueFvPatchScalarField.C
|
||||
derivedFvPatchFields/fixedMultiPhaseHeatFlux/fixedMultiPhaseHeatFluxFvPatchScalarField.C
|
||||
|
||||
|
||||
@ -27,14 +27,6 @@ License
|
||||
#include "fvPatchFieldMapper.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
|
||||
#include "twoPhaseSystem.H"
|
||||
#include "ThermalPhaseChangePhaseSystem.H"
|
||||
#include "MomentumTransferPhaseSystem.H"
|
||||
#include "compressibleTurbulenceModel.H"
|
||||
#include "ThermalDiffusivity.H"
|
||||
#include "PhaseCompressibleTurbulenceModel.H"
|
||||
#include "wallFvPatch.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
@ -42,82 +34,6 @@ namespace Foam
|
||||
namespace compressible
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
scalar alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField::maxExp_
|
||||
= 50.0;
|
||||
scalar alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField::tolerance_
|
||||
= 0.01;
|
||||
label alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField::maxIters_
|
||||
= 10;
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
void alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField::checkType()
|
||||
{
|
||||
if (!isA<wallFvPatch>(patch()))
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Patch type for patch " << patch().name() << " must be wall\n"
|
||||
<< "Current patch type is " << patch().type() << nl
|
||||
<< exit(FatalError);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
tmp<scalarField>
|
||||
alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField::Psmooth
|
||||
(
|
||||
const scalarField& Prat
|
||||
) const
|
||||
{
|
||||
return 9.24*(pow(Prat, 0.75) - 1.0)*(1.0 + 0.28*exp(-0.007*Prat));
|
||||
}
|
||||
|
||||
|
||||
tmp<scalarField>
|
||||
alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField::yPlusTherm
|
||||
(
|
||||
const scalarField& P,
|
||||
const scalarField& Prat
|
||||
) const
|
||||
{
|
||||
|
||||
tmp<scalarField> typsf(new scalarField(this->size()));
|
||||
scalarField& ypsf = typsf();
|
||||
|
||||
forAll(ypsf, faceI)
|
||||
{
|
||||
scalar ypt = 11.0;
|
||||
|
||||
for (int i=0; i<maxIters_; i++)
|
||||
{
|
||||
scalar f = ypt - (log(E_*ypt)/kappa_ + P[faceI])/Prat[faceI];
|
||||
scalar df = 1.0 - 1.0/(ypt*kappa_*Prat[faceI]);
|
||||
scalar yptNew = ypt - f/df;
|
||||
|
||||
if (yptNew < VSMALL)
|
||||
{
|
||||
ypsf[faceI] = 0;
|
||||
}
|
||||
else if (mag(yptNew - ypt) < tolerance_)
|
||||
{
|
||||
ypsf[faceI] = yptNew;
|
||||
}
|
||||
else
|
||||
{
|
||||
ypt = yptNew;
|
||||
}
|
||||
}
|
||||
|
||||
ypsf[faceI] = ypt;
|
||||
}
|
||||
|
||||
return typsf;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField::
|
||||
@ -127,13 +43,10 @@ alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField
|
||||
const DimensionedField<scalar, volMesh>& iF
|
||||
)
|
||||
:
|
||||
alphatPhaseChangeWallFunctionFvPatchScalarField(p, iF),
|
||||
Prt_(0.85),
|
||||
Cmu_(0.09),
|
||||
kappa_(0.41),
|
||||
E_(9.8),
|
||||
dmdtRelax_(1.0),
|
||||
fixedDmdt_(0.0)
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField(p, iF),
|
||||
relax_(1.0),
|
||||
fixedDmdt_(0.0),
|
||||
L_(0.0)
|
||||
{
|
||||
checkType();
|
||||
}
|
||||
@ -147,13 +60,10 @@ alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
alphatPhaseChangeWallFunctionFvPatchScalarField(p, iF, dict),
|
||||
Prt_(dict.lookupOrDefault<scalar>("Prt", 0.85)),
|
||||
Cmu_(dict.lookupOrDefault<scalar>("Cmu", 0.09)),
|
||||
kappa_(dict.lookupOrDefault<scalar>("kappa", 0.41)),
|
||||
E_(dict.lookupOrDefault<scalar>("E", 9.8)),
|
||||
dmdtRelax_(dict.lookupOrDefault<scalar>("dmdtRelax", 1.0)),
|
||||
fixedDmdt_(dict.lookupOrDefault<scalar>("fixedDmdt", 0.0))
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField(p, iF, dict),
|
||||
relax_(dict.lookupOrDefault<scalar>("relax", 1.0)),
|
||||
fixedDmdt_(dict.lookupOrDefault<scalar>("fixedDmdt", 0.0)),
|
||||
L_(dict.lookupOrDefault<scalar>("L", 0.0))
|
||||
{}
|
||||
|
||||
|
||||
@ -166,13 +76,15 @@ alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField
|
||||
const fvPatchFieldMapper& mapper
|
||||
)
|
||||
:
|
||||
alphatPhaseChangeWallFunctionFvPatchScalarField(psf, p, iF, mapper),
|
||||
Prt_(psf.Prt_),
|
||||
Cmu_(psf.Cmu_),
|
||||
kappa_(psf.kappa_),
|
||||
E_(psf.E_),
|
||||
dmdtRelax_(psf.dmdtRelax_),
|
||||
fixedDmdt_(psf.fixedDmdt_)
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
(
|
||||
psf,
|
||||
p,
|
||||
iF,
|
||||
mapper
|
||||
),
|
||||
fixedDmdt_(psf.fixedDmdt_),
|
||||
L_(psf.L_)
|
||||
{}
|
||||
|
||||
|
||||
@ -182,16 +94,12 @@ alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField
|
||||
const alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField& psf
|
||||
)
|
||||
:
|
||||
alphatPhaseChangeWallFunctionFvPatchScalarField(psf),
|
||||
Prt_(psf.Prt_),
|
||||
Cmu_(psf.Cmu_),
|
||||
kappa_(psf.kappa_),
|
||||
E_(psf.E_),
|
||||
dmdtRelax_(psf.dmdtRelax_),
|
||||
fixedDmdt_(psf.fixedDmdt_)
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField(psf),
|
||||
relax_(psf.relax_),
|
||||
fixedDmdt_(psf.fixedDmdt_),
|
||||
L_(psf.L_)
|
||||
{}
|
||||
|
||||
|
||||
alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField::
|
||||
alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField
|
||||
(
|
||||
@ -199,13 +107,10 @@ alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField
|
||||
const DimensionedField<scalar, volMesh>& iF
|
||||
)
|
||||
:
|
||||
alphatPhaseChangeWallFunctionFvPatchScalarField(psf, iF),
|
||||
Prt_(psf.Prt_),
|
||||
Cmu_(psf.Cmu_),
|
||||
kappa_(psf.kappa_),
|
||||
E_(psf.E_),
|
||||
dmdtRelax_(psf.dmdtRelax_),
|
||||
fixedDmdt_(psf.fixedDmdt_)
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField(psf, iF),
|
||||
relax_(psf.relax_),
|
||||
fixedDmdt_(psf.fixedDmdt_),
|
||||
L_(psf.L_)
|
||||
{}
|
||||
|
||||
|
||||
@ -218,117 +123,10 @@ void alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField::updateCoeffs()
|
||||
return;
|
||||
}
|
||||
|
||||
// Lookup the fluid model
|
||||
const ThermalPhaseChangePhaseSystem
|
||||
<
|
||||
MomentumTransferPhaseSystem<twoPhaseSystem>
|
||||
>& fluid =
|
||||
refCast
|
||||
<
|
||||
const ThermalPhaseChangePhaseSystem
|
||||
<
|
||||
MomentumTransferPhaseSystem<twoPhaseSystem>
|
||||
>
|
||||
>
|
||||
(
|
||||
db().lookupObject<phaseSystem>("phaseProperties")
|
||||
);
|
||||
dmdt_ = (1 - relax_)*dmdt_ + relax_*fixedDmdt_;
|
||||
mDotL_ = dmdt_*L_;
|
||||
|
||||
const phaseModel& liquid
|
||||
(
|
||||
fluid.phase1().name() == dimensionedInternalField().group()
|
||||
? fluid.phase1()
|
||||
: fluid.phase2()
|
||||
);
|
||||
|
||||
const label patchi = patch().index();
|
||||
|
||||
// Retrieve turbulence properties from model
|
||||
const phaseCompressibleTurbulenceModel& turbModel = liquid.turbulence();
|
||||
|
||||
const scalar Cmu25 = pow025(Cmu_);
|
||||
|
||||
const scalarField& y = turbModel.y()[patchi];
|
||||
|
||||
const tmp<scalarField> tmuw = turbModel.mu(patchi);
|
||||
const scalarField& muw = tmuw();
|
||||
|
||||
const tmp<scalarField> talphaw = liquid.thermo().alpha(patchi);
|
||||
const scalarField& alphaw = talphaw();
|
||||
|
||||
scalarField& alphatw = *this;
|
||||
|
||||
const tmp<volScalarField> tk = turbModel.k();
|
||||
const volScalarField& k = tk();
|
||||
const fvPatchScalarField& kw = k.boundaryField()[patchi];
|
||||
|
||||
const fvPatchVectorField& Uw = turbModel.U().boundaryField()[patchi];
|
||||
const scalarField magUp(mag(Uw.patchInternalField() - Uw));
|
||||
const scalarField magGradUw(mag(Uw.snGrad()));
|
||||
|
||||
const fvPatchScalarField& rhow = turbModel.rho().boundaryField()[patchi];
|
||||
const fvPatchScalarField& hew =
|
||||
liquid.thermo().he().boundaryField()[patchi];
|
||||
|
||||
const fvPatchScalarField& Tw =
|
||||
liquid.thermo().T().boundaryField()[patchi];
|
||||
|
||||
scalarField Tp(Tw.patchInternalField());
|
||||
|
||||
// Heat flux [W/m2] - lagging alphatw
|
||||
const scalarField qDot
|
||||
(
|
||||
(alphatw + alphaw)*hew.snGrad()
|
||||
);
|
||||
|
||||
scalarField uTau(Cmu25*sqrt(kw));
|
||||
|
||||
scalarField yPlus(uTau*y/(muw/rhow));
|
||||
|
||||
scalarField Pr(muw/alphaw);
|
||||
|
||||
// Molecular-to-turbulent Prandtl number ratio
|
||||
scalarField Prat(Pr/Prt_);
|
||||
|
||||
// Thermal sublayer thickness
|
||||
scalarField P(this->Psmooth(Prat));
|
||||
|
||||
scalarField yPlusTherm(this->yPlusTherm(P, Prat));
|
||||
|
||||
scalarField alphatConv(this->size(), 0.0);
|
||||
|
||||
// Populate boundary values
|
||||
forAll(alphatw, faceI)
|
||||
{
|
||||
// Evaluate new effective thermal diffusivity
|
||||
scalar alphaEff = 0.0;
|
||||
if (yPlus[faceI] < yPlusTherm[faceI])
|
||||
{
|
||||
scalar A = qDot[faceI]*rhow[faceI]*uTau[faceI]*y[faceI];
|
||||
scalar B = qDot[faceI]*Pr[faceI]*yPlus[faceI];
|
||||
scalar C = Pr[faceI]*0.5*rhow[faceI]*uTau[faceI]*sqr(magUp[faceI]);
|
||||
alphaEff = A/(B + C + VSMALL);
|
||||
}
|
||||
else
|
||||
{
|
||||
scalar A = qDot[faceI]*rhow[faceI]*uTau[faceI]*y[faceI];
|
||||
scalar B =
|
||||
qDot[faceI]*Prt_*(1.0/kappa_*log(E_*yPlus[faceI]) + P[faceI]);
|
||||
scalar magUc =
|
||||
uTau[faceI]/kappa_*log(E_*yPlusTherm[faceI]) - mag(Uw[faceI]);
|
||||
scalar C =
|
||||
0.5*rhow[faceI]*uTau[faceI]
|
||||
*(Prt_*sqr(magUp[faceI]) + (Pr[faceI] - Prt_)*sqr(magUc));
|
||||
alphaEff = A/(B + C + VSMALL);
|
||||
}
|
||||
|
||||
// Update convective heat transfer turbulent thermal diffusivity
|
||||
alphatConv[faceI] = max(0.0, alphaEff - alphaw[faceI]);
|
||||
}
|
||||
|
||||
dmdt_ = (1 - dmdtRelax_)*dmdt_ + dmdtRelax_*fixedDmdt_;
|
||||
|
||||
operator==(alphatConv);
|
||||
operator==(calcAlphat(*this));
|
||||
|
||||
fixedValueFvPatchScalarField::updateCoeffs();
|
||||
}
|
||||
@ -340,12 +138,9 @@ void alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField::write
|
||||
) const
|
||||
{
|
||||
fvPatchField<scalar>::write(os);
|
||||
os.writeKeyword("Prt") << Prt_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("Cmu") << Cmu_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("kappa") << kappa_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("E") << E_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("dmdtRelax") << dmdtRelax_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("relax") << relax_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("fixedDmdt") << fixedDmdt_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("L") << L_ << token::END_STATEMENT << nl;
|
||||
dmdt_.writeEntry("dmdt", os);
|
||||
writeEntry("value", os);
|
||||
}
|
||||
|
||||
@ -22,17 +22,19 @@ License
|
||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Class
|
||||
Foam::compressible::alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField
|
||||
Foam::compressible::
|
||||
alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField
|
||||
|
||||
Group
|
||||
grpCmpWallFunctions
|
||||
|
||||
Description
|
||||
A simple alphatPhaseChangeWallFunctionFvPatchScalarField with a fixed
|
||||
volumetric phase-change mass flux.
|
||||
A simple alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField with
|
||||
a fixed volumetric phase-change mass flux.
|
||||
|
||||
SeeAlso
|
||||
Foam::compressible::alphatPhaseChangeWallFunctionFvPatchScalarField
|
||||
Foam::compressible::
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
|
||||
SourceFiles
|
||||
alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField.C
|
||||
@ -42,7 +44,7 @@ SourceFiles
|
||||
#ifndef compressibleAlphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField_H
|
||||
#define compressibleAlphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField_H
|
||||
|
||||
#include "alphatPhaseChangeWallFunctionFvPatchScalarField.H"
|
||||
#include "alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -57,50 +59,18 @@ namespace compressible
|
||||
|
||||
class alphatFixedDmdtWallBoilingWallFunctionFvPatchScalarField
|
||||
:
|
||||
public alphatPhaseChangeWallFunctionFvPatchScalarField
|
||||
public alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
{
|
||||
// Private data
|
||||
|
||||
//- Turbulent Prandtl number
|
||||
scalar Prt_;
|
||||
//- dmdt relaxationFactor
|
||||
scalar relax_;
|
||||
|
||||
//- Cmu coefficient
|
||||
scalar Cmu_;
|
||||
|
||||
//- Von Karman constant
|
||||
scalar kappa_;
|
||||
|
||||
//- E coefficient
|
||||
scalar E_;
|
||||
|
||||
//- dmdt relaxation factor
|
||||
scalar dmdtRelax_;
|
||||
|
||||
//- Reference dmdt
|
||||
//- Volumetric phase-change mass flux in near wall cells
|
||||
scalar fixedDmdt_;
|
||||
|
||||
|
||||
// Solution parameters
|
||||
|
||||
static scalar maxExp_;
|
||||
static scalar tolerance_;
|
||||
static label maxIters_;
|
||||
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Check the type of the patch
|
||||
void checkType();
|
||||
|
||||
//- 'P' function
|
||||
tmp<scalarField> Psmooth(const scalarField& Prat) const;
|
||||
|
||||
//- Calculate y+ at the edge of the thermal laminar sublayer
|
||||
tmp<scalarField> yPlusTherm
|
||||
(
|
||||
const scalarField& P,
|
||||
const scalarField& Prat
|
||||
) const;
|
||||
//- Latent heat
|
||||
scalar L_;
|
||||
|
||||
|
||||
public:
|
||||
@ -181,13 +151,6 @@ public:
|
||||
|
||||
// Member functions
|
||||
|
||||
//- Return the rate of phase-change
|
||||
virtual const scalarField& dmdt() const
|
||||
{
|
||||
return dmdt_;
|
||||
}
|
||||
|
||||
|
||||
// Evaluation functions
|
||||
|
||||
//- Update the coefficients associated with the patch field
|
||||
|
||||
@ -0,0 +1,360 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2015 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 "alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField.H"
|
||||
#include "fvPatchFieldMapper.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
|
||||
#include "twoPhaseSystem.H"
|
||||
#include "ThermalPhaseChangePhaseSystem.H"
|
||||
#include "MomentumTransferPhaseSystem.H"
|
||||
#include "compressibleTurbulenceModel.H"
|
||||
#include "ThermalDiffusivity.H"
|
||||
#include "PhaseCompressibleTurbulenceModel.H"
|
||||
#include "wallFvPatch.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
namespace compressible
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
scalar alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField::maxExp_
|
||||
= 50.0;
|
||||
scalar alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField::tolerance_
|
||||
= 0.01;
|
||||
label alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField::maxIters_
|
||||
= 10;
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
void alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField::checkType()
|
||||
{
|
||||
if (!isA<wallFvPatch>(patch()))
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Patch type for patch " << patch().name() << " must be wall\n"
|
||||
<< "Current patch type is " << patch().type() << nl
|
||||
<< exit(FatalError);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
tmp<scalarField>
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField::Psmooth
|
||||
(
|
||||
const scalarField& Prat
|
||||
) const
|
||||
{
|
||||
return 9.24*(pow(Prat, 0.75) - 1.0)*(1.0 + 0.28*exp(-0.007*Prat));
|
||||
}
|
||||
|
||||
|
||||
tmp<scalarField>
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField::yPlusTherm
|
||||
(
|
||||
const scalarField& P,
|
||||
const scalarField& Prat
|
||||
) const
|
||||
{
|
||||
tmp<scalarField> typsf(new scalarField(this->size()));
|
||||
scalarField& ypsf = typsf();
|
||||
|
||||
forAll(ypsf, faceI)
|
||||
{
|
||||
scalar ypt = 11.0;
|
||||
|
||||
for (int i=0; i<maxIters_; i++)
|
||||
{
|
||||
scalar f = ypt - (log(E_*ypt)/kappa_ + P[faceI])/Prat[faceI];
|
||||
scalar df = 1 - 1.0/(ypt*kappa_*Prat[faceI]);
|
||||
scalar yptNew = ypt - f/df;
|
||||
|
||||
if (yptNew < VSMALL)
|
||||
{
|
||||
ypsf[faceI] = 0;
|
||||
}
|
||||
else if (mag(yptNew - ypt) < tolerance_)
|
||||
{
|
||||
ypsf[faceI] = yptNew;
|
||||
}
|
||||
else
|
||||
{
|
||||
ypt = yptNew;
|
||||
}
|
||||
}
|
||||
|
||||
ypsf[faceI] = ypt;
|
||||
}
|
||||
|
||||
return typsf;
|
||||
}
|
||||
|
||||
tmp<scalarField>
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField::calcAlphat
|
||||
(
|
||||
const scalarField& prevAlphat
|
||||
) const
|
||||
{
|
||||
// Lookup the fluid model
|
||||
const ThermalPhaseChangePhaseSystem
|
||||
<
|
||||
MomentumTransferPhaseSystem<twoPhaseSystem>
|
||||
>& fluid =
|
||||
refCast
|
||||
<
|
||||
const ThermalPhaseChangePhaseSystem
|
||||
<
|
||||
MomentumTransferPhaseSystem<twoPhaseSystem>
|
||||
>
|
||||
>
|
||||
(
|
||||
db().lookupObject<phaseSystem>("phaseProperties")
|
||||
);
|
||||
|
||||
const phaseModel& liquid
|
||||
(
|
||||
fluid.phase1().name() == dimensionedInternalField().group()
|
||||
? fluid.phase1()
|
||||
: fluid.phase2()
|
||||
);
|
||||
|
||||
const label patchi = patch().index();
|
||||
|
||||
// Retrieve turbulence properties from model
|
||||
const phaseCompressibleTurbulenceModel& turbModel = liquid.turbulence();
|
||||
|
||||
const scalar Cmu25 = pow025(Cmu_);
|
||||
|
||||
const scalarField& y = turbModel.y()[patchi];
|
||||
|
||||
const tmp<scalarField> tmuw = turbModel.mu(patchi);
|
||||
const scalarField& muw = tmuw();
|
||||
|
||||
const tmp<scalarField> talphaw = liquid.thermo().alpha(patchi);
|
||||
const scalarField& alphaw = talphaw();
|
||||
|
||||
const tmp<volScalarField> tk = turbModel.k();
|
||||
const volScalarField& k = tk();
|
||||
const fvPatchScalarField& kw = k.boundaryField()[patchi];
|
||||
|
||||
const fvPatchVectorField& Uw = turbModel.U().boundaryField()[patchi];
|
||||
const scalarField magUp(mag(Uw.patchInternalField() - Uw));
|
||||
const scalarField magGradUw(mag(Uw.snGrad()));
|
||||
|
||||
const fvPatchScalarField& rhow = turbModel.rho().boundaryField()[patchi];
|
||||
const fvPatchScalarField& hew =
|
||||
liquid.thermo().he().boundaryField()[patchi];
|
||||
|
||||
const fvPatchScalarField& Tw =
|
||||
liquid.thermo().T().boundaryField()[patchi];
|
||||
|
||||
scalarField Tp(Tw.patchInternalField());
|
||||
|
||||
// Heat flux [W/m2] - lagging alphatw
|
||||
const scalarField qDot
|
||||
(
|
||||
(prevAlphat + alphaw)*hew.snGrad()
|
||||
);
|
||||
|
||||
scalarField uTau(Cmu25*sqrt(kw));
|
||||
|
||||
scalarField yPlus(uTau*y/(muw/rhow));
|
||||
|
||||
scalarField Pr(muw/alphaw);
|
||||
|
||||
// Molecular-to-turbulent Prandtl number ratio
|
||||
scalarField Prat(Pr/Prt_);
|
||||
|
||||
// Thermal sublayer thickness
|
||||
scalarField P(this->Psmooth(Prat));
|
||||
|
||||
scalarField yPlusTherm(this->yPlusTherm(P, Prat));
|
||||
|
||||
tmp<scalarField> talphatConv(new scalarField(this->size()));
|
||||
scalarField& alphatConv = talphatConv();
|
||||
|
||||
// Populate boundary values
|
||||
forAll(alphatConv, faceI)
|
||||
{
|
||||
// Evaluate new effective thermal diffusivity
|
||||
scalar alphaEff = 0.0;
|
||||
if (yPlus[faceI] < yPlusTherm[faceI])
|
||||
{
|
||||
scalar A = qDot[faceI]*rhow[faceI]*uTau[faceI]*y[faceI];
|
||||
scalar B = qDot[faceI]*Pr[faceI]*yPlus[faceI];
|
||||
scalar C = Pr[faceI]*0.5*rhow[faceI]*uTau[faceI]*sqr(magUp[faceI]);
|
||||
alphaEff = A/(B + C + VSMALL);
|
||||
}
|
||||
else
|
||||
{
|
||||
scalar A = qDot[faceI]*rhow[faceI]*uTau[faceI]*y[faceI];
|
||||
scalar B =
|
||||
qDot[faceI]*Prt_*(1.0/kappa_*log(E_*yPlus[faceI]) + P[faceI]);
|
||||
scalar magUc =
|
||||
uTau[faceI]/kappa_*log(E_*yPlusTherm[faceI]) - mag(Uw[faceI]);
|
||||
scalar C =
|
||||
0.5*rhow[faceI]*uTau[faceI]
|
||||
*(Prt_*sqr(magUp[faceI]) + (Pr[faceI] - Prt_)*sqr(magUc));
|
||||
alphaEff = A/(B + C + VSMALL);
|
||||
}
|
||||
|
||||
// Update convective heat transfer turbulent thermal diffusivity
|
||||
alphatConv[faceI] = max(0.0, alphaEff - alphaw[faceI]);
|
||||
}
|
||||
|
||||
return talphatConv;
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField::
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<scalar, volMesh>& iF
|
||||
)
|
||||
:
|
||||
alphatPhaseChangeWallFunctionFvPatchScalarField(p, iF),
|
||||
Prt_(0.85),
|
||||
Cmu_(0.09),
|
||||
kappa_(0.41),
|
||||
E_(9.8)
|
||||
{
|
||||
checkType();
|
||||
}
|
||||
|
||||
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField::
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<scalar, volMesh>& iF,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
alphatPhaseChangeWallFunctionFvPatchScalarField(p, iF, dict),
|
||||
Prt_(dict.lookupOrDefault<scalar>("Prt", 0.85)),
|
||||
Cmu_(dict.lookupOrDefault<scalar>("Cmu", 0.09)),
|
||||
kappa_(dict.lookupOrDefault<scalar>("kappa", 0.41)),
|
||||
E_(dict.lookupOrDefault<scalar>("E", 9.8))
|
||||
{}
|
||||
|
||||
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField::
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
(
|
||||
const alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField& ptf,
|
||||
const fvPatch& p,
|
||||
const DimensionedField<scalar, volMesh>& iF,
|
||||
const fvPatchFieldMapper& mapper
|
||||
)
|
||||
:
|
||||
alphatPhaseChangeWallFunctionFvPatchScalarField(ptf, p, iF, mapper),
|
||||
Prt_(ptf.Prt_),
|
||||
Cmu_(ptf.Cmu_),
|
||||
kappa_(ptf.kappa_),
|
||||
E_(ptf.E_)
|
||||
{}
|
||||
|
||||
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField::
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
(
|
||||
const alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField& awfpsf
|
||||
)
|
||||
:
|
||||
alphatPhaseChangeWallFunctionFvPatchScalarField(awfpsf),
|
||||
Prt_(awfpsf.Prt_),
|
||||
Cmu_(awfpsf.Cmu_),
|
||||
kappa_(awfpsf.kappa_),
|
||||
E_(awfpsf.E_)
|
||||
{}
|
||||
|
||||
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField::
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
(
|
||||
const alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField& awfpsf,
|
||||
const DimensionedField<scalar, volMesh>& iF
|
||||
)
|
||||
:
|
||||
alphatPhaseChangeWallFunctionFvPatchScalarField(awfpsf, iF),
|
||||
Prt_(awfpsf.Prt_),
|
||||
Cmu_(awfpsf.Cmu_),
|
||||
kappa_(awfpsf.kappa_),
|
||||
E_(awfpsf.E_)
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
void alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField::updateCoeffs()
|
||||
{
|
||||
if (updated())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
operator==(calcAlphat(*this));
|
||||
|
||||
fixedValueFvPatchScalarField::updateCoeffs();
|
||||
}
|
||||
|
||||
|
||||
void alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField::write
|
||||
(
|
||||
Ostream& os
|
||||
) const
|
||||
{
|
||||
fvPatchField<scalar>::write(os);
|
||||
os.writeKeyword("Prt") << Prt_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("Cmu") << Cmu_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("kappa") << kappa_ << token::END_STATEMENT << nl;
|
||||
os.writeKeyword("E") << E_ << token::END_STATEMENT << nl;
|
||||
dmdt_.writeEntry("dmdt", os);
|
||||
writeEntry("value", os);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
makePatchTypeField
|
||||
(
|
||||
fvPatchScalarField,
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
);
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace compressible
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,232 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2015 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/>.
|
||||
|
||||
Class
|
||||
Foam::compressible::
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
|
||||
Group
|
||||
grpCmpWallFunctions
|
||||
|
||||
Description
|
||||
This boundary condition provides a thermal wall function for turbulent
|
||||
thermal diffusivity (usually\c alphat) based on the Jayatilleke model for
|
||||
the Eulerian multiphase solvers.
|
||||
|
||||
\heading Patch usage
|
||||
|
||||
\table
|
||||
Property | Description | Required | Default value
|
||||
Prt | Turbulent Prandtl number | no | 0.85
|
||||
Cmu | Model coefficient | no | 0.09
|
||||
kappa | von Karman constant | no | 0.41
|
||||
E | Model coefficient | no | 9.8
|
||||
\endtable
|
||||
|
||||
Example of the boundary condition specification:
|
||||
\verbatim
|
||||
myPatch
|
||||
{
|
||||
type alphatPhaseChangeJayatillekeWallFunction;
|
||||
Prt 0.85;
|
||||
kappa 0.41;
|
||||
E 9.8;
|
||||
value uniform 0; // optional value entry
|
||||
}
|
||||
\endverbatim
|
||||
|
||||
SeeAlso
|
||||
Foam::compressible::alphatPhaseChangeWallFunctionFvPatchScalarField
|
||||
|
||||
SourceFiles
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef compressiblealphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField_H
|
||||
#define compressiblealphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField_H
|
||||
|
||||
#include "alphatPhaseChangeWallFunctionFvPatchScalarField.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
namespace compressible
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
:
|
||||
public alphatPhaseChangeWallFunctionFvPatchScalarField
|
||||
{
|
||||
|
||||
protected:
|
||||
|
||||
// Protected data
|
||||
|
||||
//- Turbulent Prandtl number
|
||||
scalar Prt_;
|
||||
|
||||
//- Cmu coefficient
|
||||
scalar Cmu_;
|
||||
|
||||
//- Von Karman constant
|
||||
scalar kappa_;
|
||||
|
||||
//- E coefficient
|
||||
scalar E_;
|
||||
|
||||
// Solution parameters
|
||||
|
||||
static scalar maxExp_;
|
||||
static scalar tolerance_;
|
||||
static label maxIters_;
|
||||
|
||||
|
||||
// Protected Member Functions
|
||||
|
||||
//- Check the type of the patch
|
||||
void checkType();
|
||||
|
||||
//- 'P' function
|
||||
tmp<scalarField> Psmooth(const scalarField& Prat) const;
|
||||
|
||||
//- Calculate y+ at the edge of the thermal laminar sublayer
|
||||
tmp<scalarField> yPlusTherm
|
||||
(
|
||||
const scalarField& P,
|
||||
const scalarField& Prat
|
||||
) const;
|
||||
|
||||
//- Update turbulent thermal diffusivity
|
||||
tmp<scalarField> calcAlphat
|
||||
(
|
||||
const scalarField& prevAlphat
|
||||
) const;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("compressible::alphatPhaseChangeJayatillekeWallFunction");
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from patch and internal field
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
(
|
||||
const fvPatch&,
|
||||
const DimensionedField<scalar, volMesh>&
|
||||
);
|
||||
|
||||
//- Construct from patch, internal field and dictionary
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
(
|
||||
const fvPatch&,
|
||||
const DimensionedField<scalar, volMesh>&,
|
||||
const dictionary&
|
||||
);
|
||||
|
||||
//- Construct by mapping given
|
||||
// alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
// onto a new patch
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
(
|
||||
const alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField&,
|
||||
const fvPatch&,
|
||||
const DimensionedField<scalar, volMesh>&,
|
||||
const fvPatchFieldMapper&
|
||||
);
|
||||
|
||||
//- Construct as copy
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
(
|
||||
const alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField&
|
||||
);
|
||||
|
||||
//- Construct and return a clone
|
||||
virtual tmp<fvPatchScalarField> clone() const
|
||||
{
|
||||
return tmp<fvPatchScalarField>
|
||||
(
|
||||
new alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
(
|
||||
*this
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
//- Construct as copy setting internal field reference
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
(
|
||||
const alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField&,
|
||||
const DimensionedField<scalar, volMesh>&
|
||||
);
|
||||
|
||||
//- Construct and return a clone setting internal field reference
|
||||
virtual tmp<fvPatchScalarField> clone
|
||||
(
|
||||
const DimensionedField<scalar, volMesh>& iF
|
||||
) const
|
||||
{
|
||||
return tmp<fvPatchScalarField>
|
||||
(
|
||||
new alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
(
|
||||
*this,
|
||||
iF
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// Member functions
|
||||
|
||||
// Evaluation functions
|
||||
|
||||
//- Update the coefficients associated with the patch field
|
||||
virtual void updateCoeffs();
|
||||
|
||||
|
||||
// I-O
|
||||
|
||||
//- Write
|
||||
virtual void write(Ostream&) const;
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace compressible
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,385 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2015 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 "alphatWallBoilingWallFunctionFvPatchScalarField.H"
|
||||
#include "fvPatchFieldMapper.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
|
||||
#include "twoPhaseSystem.H"
|
||||
#include "phaseSystem.H"
|
||||
#include "ThermalPhaseChangePhaseSystem.H"
|
||||
#include "MomentumTransferPhaseSystem.H"
|
||||
#include "compressibleTurbulenceModel.H"
|
||||
#include "ThermalDiffusivity.H"
|
||||
#include "PhaseCompressibleTurbulenceModel.H"
|
||||
#include "saturationModel.H"
|
||||
#include "wallFvPatch.H"
|
||||
#include "uniformDimensionedFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
namespace compressible
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
alphatWallBoilingWallFunctionFvPatchScalarField::
|
||||
alphatWallBoilingWallFunctionFvPatchScalarField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<scalar, volMesh>& iF
|
||||
)
|
||||
:
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField(p, iF),
|
||||
relax_(0.5),
|
||||
AbyV_(p.size(), 0.0),
|
||||
alphatConv_(p.size(), 0.0)
|
||||
{
|
||||
AbyV_ = this->patch().magSf();
|
||||
forAll(AbyV_,facei)
|
||||
{
|
||||
label faceCelli = this->patch().faceCells()[facei];
|
||||
AbyV_[facei] /= iF.mesh().V()[faceCelli];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
alphatWallBoilingWallFunctionFvPatchScalarField::
|
||||
alphatWallBoilingWallFunctionFvPatchScalarField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<scalar, volMesh>& iF,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField(p, iF, dict),
|
||||
relax_(dict.lookupOrDefault<scalar>("relax", 0.5)),
|
||||
AbyV_(p.size(), 0.0),
|
||||
alphatConv_(p.size(), 0.0)
|
||||
{
|
||||
if (dict.found("alphatConv"))
|
||||
{
|
||||
alphatConv_ = scalarField("alphatConv", dict, p.size());
|
||||
}
|
||||
|
||||
AbyV_ = this->patch().magSf();
|
||||
forAll(AbyV_,facei)
|
||||
{
|
||||
label faceCelli = this->patch().faceCells()[facei];
|
||||
AbyV_[facei] /= iF.mesh().V()[faceCelli];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
alphatWallBoilingWallFunctionFvPatchScalarField::
|
||||
alphatWallBoilingWallFunctionFvPatchScalarField
|
||||
(
|
||||
const alphatWallBoilingWallFunctionFvPatchScalarField& psf,
|
||||
const fvPatch& p,
|
||||
const DimensionedField<scalar, volMesh>& iF,
|
||||
const fvPatchFieldMapper& mapper
|
||||
)
|
||||
:
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
(
|
||||
psf,
|
||||
p,
|
||||
iF,
|
||||
mapper
|
||||
),
|
||||
relax_(psf.relax_),
|
||||
AbyV_(psf.AbyV_),
|
||||
alphatConv_(psf.alphatConv_, mapper)
|
||||
{}
|
||||
|
||||
|
||||
alphatWallBoilingWallFunctionFvPatchScalarField::
|
||||
alphatWallBoilingWallFunctionFvPatchScalarField
|
||||
(
|
||||
const alphatWallBoilingWallFunctionFvPatchScalarField& psf
|
||||
)
|
||||
:
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField(psf),
|
||||
relax_(psf.relax_),
|
||||
AbyV_(psf.AbyV_),
|
||||
alphatConv_(psf.alphatConv_)
|
||||
{}
|
||||
|
||||
|
||||
alphatWallBoilingWallFunctionFvPatchScalarField::
|
||||
alphatWallBoilingWallFunctionFvPatchScalarField
|
||||
(
|
||||
const alphatWallBoilingWallFunctionFvPatchScalarField& psf,
|
||||
const DimensionedField<scalar, volMesh>& iF
|
||||
)
|
||||
:
|
||||
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField(psf, iF),
|
||||
relax_(psf.relax_),
|
||||
AbyV_(psf.AbyV_),
|
||||
alphatConv_(psf.alphatConv_)
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
void alphatWallBoilingWallFunctionFvPatchScalarField::updateCoeffs()
|
||||
{
|
||||
if (updated())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Lookup the fluid model
|
||||
const ThermalPhaseChangePhaseSystem<MomentumTransferPhaseSystem
|
||||
<
|
||||
twoPhaseSystem>
|
||||
>&
|
||||
fluid
|
||||
= refCast
|
||||
<
|
||||
const ThermalPhaseChangePhaseSystem
|
||||
<
|
||||
MomentumTransferPhaseSystem<twoPhaseSystem>
|
||||
>
|
||||
>
|
||||
(
|
||||
db().lookupObject<phaseSystem>("phaseProperties")
|
||||
);
|
||||
|
||||
const phaseModel& liquid
|
||||
(
|
||||
fluid.phase1().name() == dimensionedInternalField().group()
|
||||
? fluid.phase1()
|
||||
: fluid.phase2()
|
||||
);
|
||||
|
||||
const phaseModel& vapor(fluid.otherPhase(liquid));
|
||||
|
||||
const label patchi = patch().index();
|
||||
|
||||
// Retrieve turbulence properties from model
|
||||
const phaseCompressibleTurbulenceModel& turbModel = liquid.turbulence();
|
||||
|
||||
const tmp<scalarField> tnutw = turbModel.nut(patchi);
|
||||
|
||||
const scalar Cmu25(pow025(Cmu_));
|
||||
|
||||
const scalarField& y = turbModel.y()[patchi];
|
||||
|
||||
const tmp<scalarField> tmuw = turbModel.mu(patchi);
|
||||
const scalarField& muw = tmuw();
|
||||
|
||||
const tmp<scalarField> talphaw = liquid.thermo().alpha(patchi);
|
||||
const scalarField& alphaw = talphaw();
|
||||
|
||||
const tmp<volScalarField> tk = turbModel.k();
|
||||
const volScalarField& k = tk();
|
||||
const fvPatchScalarField& kw = k.boundaryField()[patchi];
|
||||
|
||||
const fvPatchVectorField& Uw = turbModel.U().boundaryField()[patchi];
|
||||
const scalarField magUp(mag(Uw.patchInternalField() - Uw));
|
||||
const scalarField magGradUw(mag(Uw.snGrad()));
|
||||
|
||||
const fvPatchScalarField& rhow = turbModel.rho().boundaryField()[patchi];
|
||||
const fvPatchScalarField& hew =
|
||||
liquid.thermo().he().boundaryField()[patchi];
|
||||
|
||||
const fvPatchScalarField& Tw =
|
||||
liquid.thermo().T().boundaryField()[patchi];
|
||||
const scalarField Tc(Tw.patchInternalField());
|
||||
|
||||
scalarField uTau(Cmu25*sqrt(kw));
|
||||
|
||||
scalarField yPlus(uTau*y/(muw/rhow));
|
||||
|
||||
scalarField Pr(muw/alphaw);
|
||||
|
||||
// Molecular-to-turbulent Prandtl number ratio
|
||||
scalarField Prat(Pr/Prt_);
|
||||
|
||||
// Thermal sublayer thickness
|
||||
scalarField P(this->Psmooth(Prat));
|
||||
|
||||
scalarField yPlusTherm(this->yPlusTherm(P, Prat));
|
||||
|
||||
const scalarField rhoc(rhow.patchInternalField());
|
||||
|
||||
tmp<volScalarField> trhoVapor = vapor.thermo().rho();
|
||||
const volScalarField& rhoVapor = trhoVapor();
|
||||
const fvPatchScalarField& rhoVaporw =
|
||||
rhoVapor.boundaryField()[patchi];
|
||||
const scalarField rhoVaporp(rhoVaporw.patchInternalField());
|
||||
|
||||
tmp<volScalarField> tCp = liquid.thermo().Cp();
|
||||
const volScalarField& Cp = tCp();
|
||||
const fvPatchScalarField& Cpw = Cp.boundaryField()[patchi];
|
||||
|
||||
// Saturation temperature
|
||||
const tmp<volScalarField> tTsat =
|
||||
fluid.saturation().Tsat(liquid.thermo().p());
|
||||
const volScalarField& Tsat = tTsat();
|
||||
const fvPatchScalarField& Tsatw(Tsat.boundaryField()[patchi]);
|
||||
const scalarField Tsatc(Tsatw.patchInternalField());
|
||||
|
||||
// Gravitational acceleration
|
||||
const uniformDimensionedVectorField& g =
|
||||
db().lookupObject<uniformDimensionedVectorField>("g");
|
||||
|
||||
const fvPatchScalarField& pw =
|
||||
liquid.thermo().p().boundaryField()[patchi];
|
||||
|
||||
const scalarField L
|
||||
(
|
||||
vapor.thermo().he(pw,Tsatc,patchi)-hew.patchInternalField()
|
||||
);
|
||||
|
||||
// Liquid temperature at y+=250 is estimated from logarithmic
|
||||
// thermal wall function (Koncar, Krepper & Egorov, 2005)
|
||||
scalarField Tplus_y250(Prt_*(Foam::log(E_*250)/kappa_ + P));
|
||||
scalarField Tplus(Prt_*(Foam::log(E_*yPlus)/kappa_ + P));
|
||||
scalarField Tl(Tw - (Tplus_y250/Tplus)*(Tw - Tc));
|
||||
Tl = max(Tc - 40, min(Tc, Tl));
|
||||
|
||||
// Nucleation site density:
|
||||
// Reformulation of Lemmert & Chawla (Egorov & Menter, 2004)
|
||||
const scalarField N
|
||||
(
|
||||
0.8*9.922e5*Foam::pow(max(0.0, (Tw - Tsatw)/10), 1.805)
|
||||
);
|
||||
|
||||
// Bubble departure diameter:
|
||||
// Tolubinski and Kostanchuk (1970)
|
||||
const scalarField Tsub(max(0.0, Tsatw - Tl));
|
||||
const scalarField Ddep
|
||||
(
|
||||
max(1e-6, min(0.0006*Foam::exp(-Tsub/45), 0.0014))
|
||||
);
|
||||
|
||||
// Bubble departure frequency:
|
||||
// Cole (1960)
|
||||
const scalarField F
|
||||
(
|
||||
sqrt(4*mag(g).value()*(max(0.1, rhoc - rhoVaporp))/(3*Ddep*rhow))
|
||||
);
|
||||
|
||||
// Area fractions:
|
||||
|
||||
// Del Valle & Kenning (1985)
|
||||
const scalarField Ja(rhoc*Cpw*Tsub/(rhoVaporp*L));
|
||||
const scalarField Al(4.8*Foam::exp(-Ja/80));
|
||||
|
||||
// Liquid phase fraction at the wall
|
||||
const scalarField liquidw(liquid.boundaryField()[patchi]);
|
||||
|
||||
// Damp boiling at high void fractions.
|
||||
const scalarField W(min(1.,liquidw/0.2));
|
||||
|
||||
const scalarField A2(W*min(M_PI*sqr(Ddep)*N*Al/4, 1.0));
|
||||
const scalarField A1(max(1e-4, 1 - A2));
|
||||
const scalarField A2E(W*min(M_PI*sqr(Ddep)*N*Al/4, 5.0));
|
||||
|
||||
// Wall evaporation heat flux [kg/s3 = J/m2s]
|
||||
const scalarField Qe((1.0/6.0)*A2E*Ddep*rhoVaporw*F*L);
|
||||
|
||||
// Volumetric mass source in the near wall cell due to the wall boiling
|
||||
dmdt_ = (1 - relax_)*dmdt_ + relax_*Qe*AbyV_/L;
|
||||
|
||||
// Volumetric source in the near wall cell due to the wall boiling
|
||||
mDotL_ = dmdt_*L;
|
||||
|
||||
// Quenching heat transfer coefficient
|
||||
const scalarField hQ
|
||||
(
|
||||
2*(alphaw*Cpw)*F*sqrt((0.8/F)/(M_PI*alphaw/rhow))
|
||||
);
|
||||
|
||||
// Quenching heat flux
|
||||
const scalarField Qq(A2*hQ*max(0.0, Tw - Tl));
|
||||
|
||||
// Convective heat flux
|
||||
alphatConv_ = calcAlphat(alphatConv_);
|
||||
//const scalarField Qc(A1*(alphatConv_ + alphaw)*hew.snGrad());
|
||||
|
||||
// Effective thermal diffusivity that corresponds to the calculated
|
||||
// convective, quenching and evaporative heat fluxes
|
||||
|
||||
operator==
|
||||
(
|
||||
A1*alphatConv_ + (Qq + Qe)/max(liquidw*hew.snGrad(), 1e-16)
|
||||
);
|
||||
|
||||
if(debug)
|
||||
{
|
||||
Info<< " L: " << gMin(L) << " - " << gMax(L) << endl;
|
||||
Info<< " Tl: " << gMin(Tl) << " - " << gMax(Tl) << endl;
|
||||
Info<< " N: " << gMin(N) << " - " << gMax(N) << endl;
|
||||
Info<< " Ddep: " << gMin(Ddep) << " - " << gMax(Ddep) << endl;
|
||||
Info<< " F: " << gMin(F) << " - " << gMax(F) << endl;
|
||||
Info<< " Al: " << gMin(Al) << " - " << gMax(Al) << endl;
|
||||
Info<< " A1: " << gMin(A1) << " - " << gMax(A1) << endl;
|
||||
Info<< " A2: " << gMin(A2) << " - " << gMax(A2) << endl;
|
||||
Info<< " A2E: " << gMin(A2E) << " - " << gMax(A2E) << endl;
|
||||
Info<< " dmdtW: " << gMin(dmdt_) << " - " << gMax(dmdt_) << endl;
|
||||
const scalarField Qc(A1*(alphatConv_ + alphaw)*hew.snGrad());
|
||||
Info<< " Qc: " << gMin(Qc) << " - " << gMax(Qc) << endl;
|
||||
Info<< " Qq: " << gMin(Qq) << " - " << gMax(Qq) << endl;
|
||||
Info<< " Qe: " << gMin(Qe) << " - " << gMax(Qe) << endl;
|
||||
const scalarField QEff(liquidw*(*this + alphaw)*hew.snGrad());
|
||||
Info<< " QEff: " << gMin(QEff) << " - " << gMax(QEff) << endl;
|
||||
Info<< " alphat: " << gMin(*this) << " - " << gMax(*this) << endl;
|
||||
Info<< " alphatConv: " << gMin(alphatConv_)
|
||||
<< " - " << gMax(alphatConv_) << endl;
|
||||
}
|
||||
|
||||
fixedValueFvPatchScalarField::updateCoeffs();
|
||||
}
|
||||
|
||||
|
||||
void alphatWallBoilingWallFunctionFvPatchScalarField::write(Ostream& os) const
|
||||
{
|
||||
fvPatchField<scalar>::write(os);
|
||||
os.writeKeyword("relax") << relax_ << token::END_STATEMENT << nl;
|
||||
dmdt_.writeEntry("dmdt", os);
|
||||
alphatConv_.writeEntry("alphatConv", os);
|
||||
writeEntry("value", os);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
makePatchTypeField
|
||||
(
|
||||
fvPatchScalarField,
|
||||
alphatWallBoilingWallFunctionFvPatchScalarField
|
||||
);
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace compressible
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,187 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2015 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/>.
|
||||
|
||||
Class
|
||||
Foam::compressible::alphatWallBoilingWallFunctionFvPatchScalarField
|
||||
|
||||
Group
|
||||
grpCmpWallFunctions
|
||||
|
||||
Description
|
||||
A thermal wall function for simulation of subcooled nucleate wall boiling.
|
||||
|
||||
Implements a version of the well-known RPI wall boiling model
|
||||
(Kurul & Podowski, 1991). The model implementation is similar to the model
|
||||
described by Peltola & Pättikangas (2012).
|
||||
|
||||
References:
|
||||
\verbatim
|
||||
"On the modeling of multidimensional effects in boiling channels"
|
||||
Kurul, N., Podowski, M.Z.,
|
||||
ANS Proceedings, National Heat Transfer Conference,
|
||||
Minneapolis, Minnesota, USA, July 28-31, 1991,
|
||||
ISBN: 0-89448-162-1, pp. 30-40
|
||||
\endverbatim
|
||||
|
||||
\verbatim
|
||||
"Development and validation of a boiling model for OpenFOAM
|
||||
multiphase solver"
|
||||
Peltola, J., Pättikangas, T.J.H.,
|
||||
CFD4NRS-4 Conference Proceedings, paper 59,
|
||||
Daejeon, Korea, September 10-12 2012
|
||||
\endverbatim
|
||||
|
||||
SeeAlso
|
||||
Foam::fixedValueFvPatchField
|
||||
|
||||
SourceFiles
|
||||
alphatWallBoilingWallFunctionFvPatchScalarField.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef compressiblealphatWallBoilingWallFunctionFvPatchScalarField_H
|
||||
#define compressiblealphatWallBoilingWallFunctionFvPatchScalarField_H
|
||||
|
||||
#include "alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
namespace compressible
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class alphatWallBoilingWallFunctionFvPatchScalarField Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class alphatWallBoilingWallFunctionFvPatchScalarField
|
||||
:
|
||||
public alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
|
||||
{
|
||||
// Private data
|
||||
|
||||
//- dmdt relaxationFactor
|
||||
scalar relax_;
|
||||
|
||||
//- Patch face area by cell volume
|
||||
scalarField AbyV_;
|
||||
|
||||
//- Convective turbulent thermal diffusivity
|
||||
scalarField alphatConv_;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("compressible::alphatWallBoilingWallFunction");
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from patch and internal field
|
||||
alphatWallBoilingWallFunctionFvPatchScalarField
|
||||
(
|
||||
const fvPatch&,
|
||||
const DimensionedField<scalar, volMesh>&
|
||||
);
|
||||
|
||||
//- Construct from patch, internal field and dictionary
|
||||
alphatWallBoilingWallFunctionFvPatchScalarField
|
||||
(
|
||||
const fvPatch&,
|
||||
const DimensionedField<scalar, volMesh>&,
|
||||
const dictionary&
|
||||
);
|
||||
|
||||
//- Construct by mapping given
|
||||
// alphatWallBoilingWallFunctionFvPatchScalarField
|
||||
// onto a new patch
|
||||
alphatWallBoilingWallFunctionFvPatchScalarField
|
||||
(
|
||||
const alphatWallBoilingWallFunctionFvPatchScalarField&,
|
||||
const fvPatch&,
|
||||
const DimensionedField<scalar, volMesh>&,
|
||||
const fvPatchFieldMapper&
|
||||
);
|
||||
|
||||
//- Construct as copy
|
||||
alphatWallBoilingWallFunctionFvPatchScalarField
|
||||
(
|
||||
const alphatWallBoilingWallFunctionFvPatchScalarField&
|
||||
);
|
||||
|
||||
//- Construct and return a clone
|
||||
virtual tmp<fvPatchScalarField> clone() const
|
||||
{
|
||||
return tmp<fvPatchScalarField>
|
||||
(
|
||||
new alphatWallBoilingWallFunctionFvPatchScalarField(*this)
|
||||
);
|
||||
}
|
||||
|
||||
//- Construct as copy setting internal field reference
|
||||
alphatWallBoilingWallFunctionFvPatchScalarField
|
||||
(
|
||||
const alphatWallBoilingWallFunctionFvPatchScalarField&,
|
||||
const DimensionedField<scalar, volMesh>&
|
||||
);
|
||||
|
||||
//- Construct and return a clone setting internal field reference
|
||||
virtual tmp<fvPatchScalarField> clone
|
||||
(
|
||||
const DimensionedField<scalar, volMesh>& iF
|
||||
) const
|
||||
{
|
||||
return tmp<fvPatchScalarField>
|
||||
(
|
||||
new alphatWallBoilingWallFunctionFvPatchScalarField(*this, iF)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// Member functions
|
||||
|
||||
// Evaluation functions
|
||||
|
||||
//- Update the coefficients associated with the patch field
|
||||
virtual void updateCoeffs();
|
||||
|
||||
|
||||
// I-O
|
||||
|
||||
//- Write
|
||||
virtual void write(Ostream&) const;
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace compressible
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
Reference in New Issue
Block a user