/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2015-2018 OpenFOAM Foundation
Copyright (C) 2018 OpenCFD Ltd
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see .
\*---------------------------------------------------------------------------*/
#include "alphatWallBoilingWallFunctionFvPatchScalarField.H"
#include "fvPatchFieldMapper.H"
#include "addToRunTimeSelectionTable.H"
#include "phaseSystem.H"
#include "compressibleTurbulenceModel.H"
#include "ThermalDiffusivity.H"
#include "PhaseCompressibleTurbulenceModel.H"
#include "saturationModel.H"
#include "wallFvPatch.H"
#include "uniformDimensionedFields.H"
#include "mathematicalConstants.H"
using namespace Foam::constant::mathematical;
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
const Foam::Enum
<
Foam::compressible::
alphatWallBoilingWallFunctionFvPatchScalarField::phaseType
>
Foam::compressible::
alphatWallBoilingWallFunctionFvPatchScalarField::phaseTypeNames_
{
{ phaseType::vaporPhase, "vapor" },
{ phaseType::liquidPhase, "liquid" },
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace compressible
{
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
alphatWallBoilingWallFunctionFvPatchScalarField::
alphatWallBoilingWallFunctionFvPatchScalarField
(
const fvPatch& p,
const DimensionedField& iF
)
:
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField(p, iF),
otherPhaseName_("vapor"),
phaseType_(liquidPhase),
relax_(),
AbyV_(p.size(), 0),
alphatConv_(p.size(), 0),
dDep_(p.size(), 1e-5),
qq_(p.size(), 0),
K_(4),
partitioningModel_(nullptr),
nucleationSiteModel_(nullptr),
departureDiamModel_(nullptr),
departureFreqModel_(nullptr),
filmBoilingModel_(nullptr),
LeidenfrostModel_(nullptr),
CHFModel_(nullptr),
CHFSoobModel_(nullptr),
MHFModel_(nullptr),
TDNBModel_(nullptr),
wp_(1)
{
AbyV_ = this->patch().magSf();
forAll(AbyV_, facei)
{
const label faceCelli = this->patch().faceCells()[facei];
AbyV_[facei] /= iF.mesh().V()[faceCelli];
}
}
alphatWallBoilingWallFunctionFvPatchScalarField::
alphatWallBoilingWallFunctionFvPatchScalarField
(
const fvPatch& p,
const DimensionedField& iF,
const dictionary& dict
)
:
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField(p, iF, dict),
otherPhaseName_(dict.lookup("otherPhase")),
phaseType_(phaseTypeNames_.read(dict.lookup("phaseType"))),
relax_(Function1::New("relax", dict)),
AbyV_(p.size(), 0),
alphatConv_(p.size(), 0),
dDep_(p.size(), 1e-5),
qq_(p.size(), 0),
K_(4),
partitioningModel_(nullptr),
nucleationSiteModel_(nullptr),
departureDiamModel_(nullptr),
departureFreqModel_(nullptr),
filmBoilingModel_(nullptr),
LeidenfrostModel_(nullptr),
CHFModel_(nullptr),
CHFSoobModel_(nullptr),
MHFModel_(nullptr),
TDNBModel_(nullptr),
wp_(1)
{
// Check that otherPhaseName != this phase
if (internalField().group() == otherPhaseName_)
{
FatalErrorInFunction
<< "otherPhase should be the name of the vapor phase that "
<< "corresponds to the liquid base of vice versa" << nl
<< "This phase: " << internalField().group() << nl
<< "otherPhase: " << otherPhaseName_
<< abort(FatalError);
}
switch (phaseType_)
{
case vaporPhase:
{
partitioningModel_ =
wallBoilingModels::partitioningModel::New
(
dict.subDict("partitioningModel")
);
dmdt_ = 0;
break;
}
case liquidPhase:
{
partitioningModel_ =
wallBoilingModels::partitioningModel::New
(
dict.subDict("partitioningModel")
);
nucleationSiteModel_ =
wallBoilingModels::nucleationSiteModel::New
(
dict.subDict("nucleationSiteModel")
);
departureDiamModel_ =
wallBoilingModels::departureDiameterModel::New
(
dict.subDict("departureDiamModel")
);
departureFreqModel_ =
wallBoilingModels::departureFrequencyModel::New
(
dict.subDict("departureFreqModel")
);
const dictionary* LeidenfrostDict =
dict.findDict("LeidenfrostModel");
if (LeidenfrostDict)
{
LeidenfrostModel_ =
wallBoilingModels::LeidenfrostModel::New(*LeidenfrostDict);
}
const dictionary* CHFDict = dict.findDict("CHFModel");
if (CHFDict)
{
CHFModel_ =
wallBoilingModels::CHFModel::New(*CHFDict);
}
const dictionary* HFSubCoolDict = dict.findDict("CHFSubCoolModel");
if (HFSubCoolDict)
{
CHFSoobModel_ =
wallBoilingModels::CHFSubCoolModel::New(*HFSubCoolDict);
}
const dictionary* MHFDict = dict.findDict("MHFModel");
if (MHFDict)
{
MHFModel_ =
wallBoilingModels::MHFModel::New(*MHFDict);
}
const dictionary* TDNBDict = dict.findDict("TDNBModel");
if (TDNBDict)
{
TDNBModel_ =
wallBoilingModels::TDNBModel::New(*TDNBDict);
}
const dictionary* filmDict = dict.findDict("filmBoilingModel");
if (filmDict)
{
filmBoilingModel_ =
wallBoilingModels::filmBoilingModel::New(*filmDict);
}
if (dict.found("dDep"))
{
dDep_ = scalarField("dDep", dict, p.size());
}
if (dict.found("K"))
{
dict.lookup("K") >> K_;
}
if (dict.found("wp"))
{
dict.lookup("wp") >> wp_;
}
if (dict.found("qQuenching"))
{
qq_ = scalarField("qQuenching", dict, p.size());
}
break;
}
}
if (dict.found("alphatConv"))
{
alphatConv_ = scalarField("alphatConv", dict, p.size());
}
AbyV_ = this->patch().magSf();
forAll(AbyV_, facei)
{
const label faceCelli = this->patch().faceCells()[facei];
AbyV_[facei] /= iF.mesh().V()[faceCelli];
}
}
alphatWallBoilingWallFunctionFvPatchScalarField::
alphatWallBoilingWallFunctionFvPatchScalarField
(
const alphatWallBoilingWallFunctionFvPatchScalarField& psf,
const fvPatch& p,
const DimensionedField& iF,
const fvPatchFieldMapper& mapper
)
:
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField
(
psf,
p,
iF,
mapper
),
otherPhaseName_(psf.otherPhaseName_),
phaseType_(psf.phaseType_),
relax_(psf.relax_.clone()),
AbyV_(psf.AbyV_),
alphatConv_(psf.alphatConv_, mapper),
dDep_(psf.dDep_, mapper),
qq_(psf.qq_, mapper),
K_(psf.K_),
partitioningModel_(psf.partitioningModel_),
nucleationSiteModel_(psf.nucleationSiteModel_),
departureDiamModel_(psf.departureDiamModel_),
filmBoilingModel_(psf.filmBoilingModel_),
LeidenfrostModel_(psf.LeidenfrostModel_),
CHFModel_(psf.CHFModel_),
CHFSoobModel_(psf.CHFSoobModel_),
MHFModel_(psf.MHFModel_),
TDNBModel_(psf.TDNBModel_),
wp_(psf.wp_)
{}
alphatWallBoilingWallFunctionFvPatchScalarField::
alphatWallBoilingWallFunctionFvPatchScalarField
(
const alphatWallBoilingWallFunctionFvPatchScalarField& psf
)
:
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField(psf),
otherPhaseName_(psf.otherPhaseName_),
phaseType_(psf.phaseType_),
relax_(psf.relax_.clone()),
AbyV_(psf.AbyV_),
alphatConv_(psf.alphatConv_),
dDep_(psf.dDep_),
qq_(psf.qq_),
K_(psf.K_),
partitioningModel_(psf.partitioningModel_),
nucleationSiteModel_(psf.nucleationSiteModel_),
departureDiamModel_(psf.departureDiamModel_),
filmBoilingModel_(psf.filmBoilingModel_),
LeidenfrostModel_(psf.LeidenfrostModel_),
CHFModel_(psf.CHFModel_),
CHFSoobModel_(psf.CHFSoobModel_),
MHFModel_(psf.MHFModel_),
TDNBModel_(psf.TDNBModel_),
wp_(psf.wp_)
{}
alphatWallBoilingWallFunctionFvPatchScalarField::
alphatWallBoilingWallFunctionFvPatchScalarField
(
const alphatWallBoilingWallFunctionFvPatchScalarField& psf,
const DimensionedField& iF
)
:
alphatPhaseChangeJayatillekeWallFunctionFvPatchScalarField(psf, iF),
otherPhaseName_(psf.otherPhaseName_),
phaseType_(psf.phaseType_),
relax_(psf.relax_.clone()),
AbyV_(psf.AbyV_),
alphatConv_(psf.alphatConv_),
dDep_(psf.dDep_),
qq_(psf.qq_),
K_(psf.K_),
partitioningModel_(psf.partitioningModel_),
nucleationSiteModel_(psf.nucleationSiteModel_),
departureDiamModel_(psf.departureDiamModel_),
filmBoilingModel_(psf.filmBoilingModel_),
LeidenfrostModel_(psf.LeidenfrostModel_),
CHFModel_(psf.CHFModel_),
CHFSoobModel_(psf.CHFSoobModel_),
MHFModel_(psf.MHFModel_),
TDNBModel_(psf.TDNBModel_),
wp_(psf.wp_)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool alphatWallBoilingWallFunctionFvPatchScalarField::
activePhasePair(const phasePairKey& phasePair) const
{
if (phasePair == phasePairKey(otherPhaseName_, internalField().group()))
{
return true;
}
else
{
return false;
}
}
const scalarField& alphatWallBoilingWallFunctionFvPatchScalarField::
dmdt(const phasePairKey& phasePair) const
{
if (activePhasePair(phasePair))
{
return dmdt_;
}
else
{
FatalErrorInFunction
<< " dmdt requested for invalid phasePair!"
<< abort(FatalError);
return dmdt_;
}
}
const scalarField& alphatWallBoilingWallFunctionFvPatchScalarField::
mDotL(const phasePairKey& phasePair) const
{
if (activePhasePair(phasePair))
{
return mDotL_;
}
else
{
FatalErrorInFunction
<< " mDotL requested for invalid phasePair!"
<< abort(FatalError);
return mDotL_;
}
}
void alphatWallBoilingWallFunctionFvPatchScalarField::updateCoeffs()
{
if (updated())
{
return;
}
// Check that partitioningModel has been constructed
if (!partitioningModel_.valid())
{
FatalErrorInFunction
<< "partitioningModel has not been constructed!"
<< abort(FatalError);
}
// Lookup the fluid model
const phaseSystem& fluid =
refCast
(
db().lookupObject("phaseProperties")
);
const saturationModel& satModel =
db().lookupObject("saturationModel");
const label patchi = patch().index();
const scalar t = this->db().time().timeOutputValue();
scalar relax = relax_->value(t);
switch (phaseType_)
{
case vaporPhase:
{
const phaseModel& vapor
(
fluid.phases()[internalField().group()]
);
const fvPatchScalarField& hewv =
vapor.thermo().he().boundaryField()[patchi];
// Vapor Liquid phase fraction at the wall
const scalarField vaporw(vapor.boundaryField()[patchi]);
// NOTE! Assumes 1-thisPhase for liquid fraction in
// multiphase simulations
const scalarField fLiquid
(
partitioningModel_->fLiquid(1-vaporw)
);
const tmp talphaw = vapor.thermo().alpha(patchi);
const scalarField& alphaw = talphaw();
const scalarField heSnGrad(max(hewv.snGrad(), scalar(1e-16)));
// Convective thermal diffusivity for single phase
const scalarField alphatv(calcAlphat(*this));
forAll (*this, i)
{
this->operator[](i) =
(
(1 - fLiquid[i])*(alphatv[i])
/max(vaporw[i], scalar(1e-8))
);
}
if (debug)
{
Info<< "alphat for vapour : " << nl << endl;
Info<< " alphatEffv: " << gMin(vaporw*(*this + alphaw))
<< " - " << gMax(vaporw*(*this + alphaw)) << endl;
const scalarField qEff(vaporw*(*this + alphaw)*hewv.snGrad());
scalar Qeff = gSum(qEff*patch().magSf());
Info<< " Effective heat transfer rate to vapor:" << Qeff
<< nl << endl;
}
break;
}
case liquidPhase:
{
// Check that nucleationSiteModel has been constructed
if (!nucleationSiteModel_.valid())
{
FatalErrorInFunction
<< "nucleationSiteModel has not been constructed!"
<< abort(FatalError);
}
// Check that departureDiameterModel has been constructed
if (!departureDiamModel_.valid())
{
FatalErrorInFunction
<< "departureDiameterModel has not been constructed!"
<< abort(FatalError);
}
// Check that nucleationSiteModel has been constructed
if (!departureFreqModel_.valid())
{
FatalErrorInFunction
<< "departureFrequencyModel has not been constructed!"
<< abort(FatalError);
}
const phaseModel& liquid
(
fluid.phases()[internalField().group()]
);
const phaseModel& vapor(fluid.phases()[otherPhaseName_]);
// Retrieve turbulence properties from models
const phaseCompressibleTurbulenceModel& turbModel =
db().lookupObject
(
IOobject::groupName
(
turbulenceModel::propertiesName,
liquid.name()
)
);
const phaseCompressibleTurbulenceModel& vaporTurbModel =
db().lookupObject
(
IOobject::groupName
(
turbulenceModel::propertiesName,
vapor.name()
)
);
const tmp tnutw = turbModel.nut(patchi);
const scalar Cmu25(pow025(Cmu_));
const scalarField& y = turbModel.y()[patchi];
const tmp tmuw = turbModel.mu(patchi);
const scalarField& muw = tmuw();
const tmp talphaw = liquid.thermo().alphahe(patchi);
const scalarField& alphaw = talphaw();
const tmp 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& Tw =
liquid.thermo().T().boundaryField()[patchi];
const scalarField Tc(Tw.patchInternalField());
const scalarField uTau(Cmu25*sqrt(kw));
const scalarField yPlus(uTau*y/(muw/rhow));
const scalarField Pr(muw/alphaw);
// Molecular-to-turbulent Prandtl number ratio
const scalarField Prat(Pr/Prt_);
// Thermal sublayer thickness
const scalarField P(this->Psmooth(Prat));
const scalarField yPlusTherm(this->yPlusTherm(P, Prat));
const fvPatchScalarField& rhoVaporw =
vaporTurbModel.rho().boundaryField()[patchi];
tmp tCp = liquid.thermo().Cp();
const volScalarField& Cp = tCp();
const fvPatchScalarField& Cpw = Cp.boundaryField()[patchi];
// Saturation temperature
const tmp tTsat =
satModel.Tsat(liquid.thermo().p());
const volScalarField& Tsat = tTsat();
const fvPatchScalarField& Tsatw(Tsat.boundaryField()[patchi]);
const scalarField Tsatc(Tsatw.patchInternalField());
const fvPatchScalarField& pw =
liquid.thermo().p().boundaryField()[patchi];
const fvPatchScalarField& hew =
liquid.thermo().he().boundaryField()[patchi];
const scalarField hw
(
liquid.thermo().he().member() == "e"
? hew.patchInternalField() + pw/rhow.patchInternalField()
: hew.patchInternalField()
);
const scalarField L
(
vapor.thermo().he().member() == "e"
? vapor.thermo().he(pw, Tsatc, patchi) + pw/rhoVaporw - hw
: vapor.thermo().he(pw, Tsatc, patchi) - hw
);
// Liquid phase fraction at the wall
const scalarField liquidw(liquid.boundaryField()[patchi]);
const scalarField fLiquid(partitioningModel_->fLiquid(liquidw));
// Liquid temperature at y+=250 is estimated from logarithmic
// thermal wall function (Koncar, Krepper & Egorov, 2005)
const scalarField Tplus_y250
(
Prt_*(log(E_*250)/kappa_ + P)
);
const scalarField Tplus(Prt_*(log(E_*yPlus)/kappa_ + P));
scalarField Tl(Tw - (Tplus_y250/Tplus)*(Tw - Tc));
Tl = max(Tc - 40, Tl);
// Film, transient boiling regimes
scalarField Qtb(this->size(), 0);
scalarField tDNB(this->size(), GREAT);
scalarField TLeiden(this->size(), GREAT);
scalarField htcFilmBoiling(this->size(), 0);
if
(
CHFModel_.valid()
&& CHFSoobModel_.valid()
&& TDNBModel_.valid()
&& MHFModel_.valid()
&& LeidenfrostModel_.valid()
&& filmBoilingModel_.valid()
)
{
const scalarField CHF
(
CHFModel_->CHF
(
liquid,
vapor,
patchi,
Tl,
Tsatw,
L
)
);
// Effect of sub-cooling to the CHF in saturated conditions
const scalarField CHFSubCool
(
CHFSoobModel_->CHFSubCool
(
liquid,
vapor,
patchi,
Tl,
Tsatw,
L
)
);
const scalarField CHFtotal(CHF*CHFSubCool);
tDNB =
TDNBModel_->TDNB
(
liquid,
vapor,
patchi,
Tl,
Tsatw,
L
);
const scalarField MHF
(
MHFModel_->MHF
(
liquid,
vapor,
patchi,
Tl,
Tsatw,
L
)
);
TLeiden =
LeidenfrostModel_->TLeid
(
liquid,
vapor,
patchi,
Tl,
Tsatw,
L
);
// htc for film boiling
htcFilmBoiling =
filmBoilingModel_->htcFilmBoil
(
liquid,
vapor,
patchi,
Tl,
Tsatw,
L
);
// htc for film transition boiling
// Indicator between CHF (phi = 0) and MHF (phi = 1)
const scalarField phi
(
min
(
max
(
wp_*(Tw - tDNB)/(TLeiden - tDNB),
scalar(0)
),
scalar(1)
)
);
Qtb = CHFtotal*(1 - phi) + phi*MHF;
if (debug & 2)
{
scalarField& phiFluid =
const_cast
(
patch().lookupPatchField
<
volScalarField,
scalar
>("phiTb")
);
phiFluid = phi;
scalarField& CHFFluid =
const_cast
(
patch().lookupPatchField
<
volScalarField,
scalar
>("CHFtotal")
);
CHFFluid = CHFtotal;
}
}
// Sub-cool boiling Nucleation
const scalarField N
(
nucleationSiteModel_->N
(
liquid,
vapor,
patchi,
Tl,
Tsatw,
L
)
);
// Bubble departure diameter:
dDep_ = departureDiamModel_->dDeparture
(
liquid,
vapor,
patchi,
Tl,
Tsatw,
L
);
// Bubble departure frequency:
const scalarField fDep
(
departureFreqModel_->fDeparture
(
liquid,
vapor,
patchi,
dDep_
)
);
// Convective thermal diffusivity for single phase
alphatConv_ = calcAlphat(alphatConv_);
// Convective heat transfer area for Sub-cool boiling
scalarField A1(this->size(), 0);
const scalarField hewSn(hew.snGrad());
scalarField alphaFilm(this->size(), 0);
// Use to identify regimes per face
labelField regimeTypes(A1.size(), -1);
forAll (*this, i)
{
if (Tw[i] > Tsatw[i])
{
// Sub-cool boiling
if (Tw[i] < tDNB[i])
{
// Sub-cool boiling
regimeTypes[i] = regimeType::subcool;
// Del Valle & Kenning (1985)
const scalar Ja =
rhow[i]*Cpw[i]*(Tsatw[i] - Tl[i])
/(rhoVaporw[i]*L[i]);
const scalar Al =
fLiquid[i]*4.8*exp(min(-Ja/80, log(VGREAT)));
const scalar A2
(
min(pi*sqr(dDep_[i])*N[i]*Al/4, scalar(1))
);
A1[i] = max(1 - A2, scalar(1e-4));
// Following Bowring(1962)
const scalar A2E
(
min
(
pi*sqr(dDep_[i])*N[i]*Al/4,
scalar(5)
)
);
// Volumetric mass source in the near wall cell due
// to the wall boiling
dmdt_[i] =
(
(1 - relax)*dmdt_[i]
+ relax*(1.0/6.0)*A2E*dDep_[i]*rhoVaporw[i]
* fDep[i]*AbyV_[i]
);
// Volumetric source in the near wall cell due to
// the wall boiling
mDotL_[i] = dmdt_[i]*L[i];
// Quenching heat transfer coefficient
const scalar hQ
(
2*(alphaw[i]*Cpw[i])*fDep[i]
*sqrt
(
(0.8/max(fDep[i], SMALL))/(pi*alphaw[i]/rhow[i])
)
);
// Quenching heat flux in Sub-cool boiling
qq_[i] =
(
(1 - relax)*qq_[i]
+ relax*A2*hQ*max(Tw[i] - Tl[i], scalar(0))
);
this->operator[](i) =
(
max
(
A1[i]*alphatConv_[i]
+ (
(qq_[i] + mDotL_[i]/AbyV_[i])
/ max(hewSn[i], scalar(1e-16))
)
/max(liquidw[i], scalar(1e-8)),
1e-8
)
);
}
else if (Tw[i] > tDNB[i] && Tw[i] < TLeiden[i])
{
// transient boiling
regimeTypes[i] = regimeType::transient;
// No convective heat tranfer
alphatConv_[i] = 0.0;
// transient boiling
dmdt_[i] =
fLiquid[i]
*(
relax*Qtb[i]*AbyV_[i]/L[i]
+ (1 - relax)*dmdt_[i]
);
mDotL_[i] = dmdt_[i]*L[i];
// No quenching flux
qq_[i] = 0.0;
this->operator[](i) =
max
(
(
mDotL_[i]/AbyV_[i]
/max(hewSn[i], scalar(1e-16))
)/max(liquidw[i], scalar(1e-8)),
1e-8
);
}
else if (Tw[i] > TLeiden[i])
{
regimeTypes[i] = regimeType::film; // film boiling
// No convective heat tranfer
alphatConv_[i] = 0.0;
// Film boiling
dmdt_[i] =
fLiquid[i]
*(
relax*htcFilmBoiling[i]
*max(Tw[i] - Tsatw[i], 0)
*AbyV_[i]/L[i]
+ (1 - relax)*dmdt_[i]
);
mDotL_[i] = dmdt_[i]*L[i];
// No quenching flux
qq_[i] = 0.0;
alphaFilm[i] =
(
mDotL_[i]/AbyV_[i]/max(hewSn[i], scalar(1e-16))
);
// alphat is added alphal and multiplied by phase
// alphaFilm in the coupled BC. We substract
// alpha and divide by phase to get a net alphaFilm
this->operator[](i) =
(
alphaFilm[i]/max(liquidw[i], scalar(1e-8))
- alphaw[i]
);
}
}
else
{
// Tw below Tsat. No boiling single phase convection
// Single phase
regimeTypes[i] = regimeType::nonBoiling;
qq_[i] = 0.0;
mDotL_[i] = 0.0;
dmdt_[i] = 0.0;
// Turbulente thermal diffusivity for single phase.
this->operator[](i) =
(
max
(
fLiquid[i]*(alphatConv_[i])
/max(liquidw[i], scalar(1e-8)),
1e-8
)
);
}
}
if (debug)
{
const scalarField qEff
(
liquidw*(*this + alphaw)*hew.snGrad()
);
Info<< "alphat for liquid: " << nl << endl;
Info<< " alphatl: " << gMin((*this)) << " - "
<< gMax((*this)) << endl;
Info<< " dmdt: " << gMin((dmdt_)) << " - "
<< gMax((dmdt_)) << endl;
Info<< " alphatlEff: " << gMin(liquidw*(*this + alphaw))
<< " - " << gMax(liquidw*(*this + alphaw)) << endl;
scalar Qeff = gSum(qEff*patch().magSf());
Info<< " Effective heat transfer rate to liquid: " << Qeff
<< endl << nl;
if (debug & 2)
{
/*
scalarField& faceRegimes =
const_cast
(
patch().lookupPatchField
<
volScalarField,
scalar
>("faceRegimes")
);
*/
scalar nSubCool(0);
scalar nTransient(0);
scalar nFilm(0);
scalar nNonBoiling(0);
scalarField nSubCools(this->size(), 0);
scalarField nTransients(this->size(), 0);
scalarField nFilms(this->size(), 0);
scalarField nNonBoilings(this->size(), 0);
forAll (*this, i)
{
//faceRegimes[i] = regimeTypes[i];
switch (regimeTypes[i])
{
case regimeType::subcool:
nSubCool++;
nSubCools[i] = 1;
break;
case regimeType::transient:
nTransient++;
nTransients[i] = 1;
break;
case regimeType::film:
nFilm++;
nFilms[i] = 1;
break;
case regimeType::nonBoiling:
nNonBoiling++;
nNonBoilings[i] = 1;
break;
}
}
Info<< "Faces regime : " << nl << endl;
Info<< " sub Cool faces : " << nSubCool << endl;
Info<< " transient faces : " << nTransient << endl;
Info<< " film faces : " << nFilm << endl;
Info<< " non-Boiling faces : " << nNonBoiling << endl;
Info<< " total faces : " << this->size() << endl << nl;
const scalarField qc
(
nNonBoilings*fLiquid*A1*(alphatConv_ + alphaw)
*hew.snGrad()
);
/*
scalarField& qcFluid =
const_cast
(
patch().lookupPatchField
<
volScalarField,
scalar
>("qc")
);
qcFluid = qc;
*/
scalar Qc = gSum(qc*patch().magSf());
Info<< " Convective heat transfer: " << Qc << endl;
const scalarField qFilm
(
relax*fLiquid*nFilms*htcFilmBoiling*(Tw - Tsatw)
);
/*
scalarField& qFilmFluid =
const_cast
(
patch().lookupPatchField
<
volScalarField,
scalar
>("qFilm")
);
qFilmFluid = qFilm;
*/
/*
scalarField& htcFilm =
const_cast
(
patch().lookupPatchField
<
volScalarField,
scalar
>("htcFilmBoiling")
);
htcFilm = htcFilmBoiling;
*/
scalar QFilm = gSum(qFilm*patch().magSf());
Info<< " Film boiling heat transfer: " << QFilm << endl;
Info<< " Htc Film Boiling coeff: "
<< gMin(nFilms*htcFilmBoiling)
<< " - "
<< gMax(nFilms*htcFilmBoiling) << endl;
/*
scalarField& qtbFluid =
const_cast
(
patch().lookupPatchField
<
volScalarField,
scalar
>("qtb")
);
qtbFluid = fLiquid*Qtb;
*/
scalar Qtbtot =
gSum(fLiquid*nTransients*Qtb*patch().magSf());
Info<< " Transient boiling heat transfer:" << Qtbtot
<< endl;
/*
scalarField& TdnbFluid =
const_cast
(
patch().lookupPatchField
<
volScalarField,
scalar
>("Tdnb")
);
TdnbFluid = tDNB;
*/
Info<< " TDNB: " << gMin(tDNB) << " - " << gMax(tDNB)
<< endl;
const scalarField qSubCool
(
fLiquid*nSubCools*
(
A1*alphatConv_*hew.snGrad()
+ qe() + qq()
)
);
/*
scalarField& qSubCoolFluid =
const_cast
(
patch().lookupPatchField
<
volScalarField,
scalar
>("qSubCool")
);
qSubCoolFluid = qSubCool;
*/
scalar QsubCool = gSum(qSubCool*patch().magSf());
Info<< " Sub Cool boiling heat transfer: " << QsubCool
<< endl;
Info<< " N: " << gMin(nSubCools*N) << " - "
<< gMax(nSubCools*N) << endl;
Info<< " dDep: " << gMin(nSubCools*dDep_) << " - "
<< gMax(nSubCools*dDep_) << endl;
Info<< " fDep: " << gMin(nSubCools*fDep) << " - "
<< gMax(nSubCools*fDep) << endl;
Info<< " A1: " << gMin(nSubCools*A1) << " - "
<< gMax(nSubCools*A1) << endl;
Info<< nl;
}
}
}
break;
default:
{
FatalErrorInFunction
<< "Unknown phase type. Valid types are: "
<< phaseTypeNames_ << nl << exit(FatalError);
}
}
fixedValueFvPatchScalarField::updateCoeffs();
}
void alphatWallBoilingWallFunctionFvPatchScalarField::write(Ostream& os) const
{
fvPatchField::write(os);
os.writeKeyword("phaseType") << phaseTypeNames_[phaseType_]
<< token::END_STATEMENT << nl;
relax_->writeData(os);
switch (phaseType_)
{
case vaporPhase:
{
os.writeKeyword("partitioningModel") << nl;
os << indent << token::BEGIN_BLOCK << incrIndent << nl;
partitioningModel_->write(os);
os << decrIndent << indent << token::END_BLOCK << nl;
if (filmBoilingModel_.valid())
{
os.writeKeyword("filmBoilingModel") << nl;
os << indent << token::BEGIN_BLOCK << incrIndent << nl;
filmBoilingModel_->write(os);
os << decrIndent << indent << token::END_BLOCK << nl;
}
if (LeidenfrostModel_.valid())
{
os.writeKeyword("LeidenfrostModel") << nl;
os << indent << token::BEGIN_BLOCK << incrIndent << nl;
LeidenfrostModel_->write(os);
os << decrIndent << indent << token::END_BLOCK << nl;
}
break;
}
case liquidPhase:
{
os.writeKeyword("partitioningModel") << nl;
os << indent << token::BEGIN_BLOCK << incrIndent << nl;
partitioningModel_->write(os);
os << decrIndent << indent << token::END_BLOCK << nl;
os.writeKeyword("nucleationSiteModel") << nl;
os << indent << token::BEGIN_BLOCK << incrIndent << nl;
nucleationSiteModel_->write(os);
os << decrIndent << indent << token::END_BLOCK << nl;
os.writeKeyword("departureDiamModel") << nl;
os << indent << token::BEGIN_BLOCK << incrIndent << nl;
departureDiamModel_->write(os);
os << decrIndent << indent << token::END_BLOCK << nl;
os.writeKeyword("departureFreqModel") << nl;
os << indent << token::BEGIN_BLOCK << incrIndent << nl;
departureFreqModel_->write(os);
os << decrIndent << indent << token::END_BLOCK << nl;
if (filmBoilingModel_.valid())
{
os.writeKeyword("filmBoilingModel") << nl;
os << indent << token::BEGIN_BLOCK << incrIndent << nl;
filmBoilingModel_->write(os);
os << decrIndent << indent << token::END_BLOCK << nl;
}
if (LeidenfrostModel_.valid())
{
os.writeKeyword("LeidenfrostModel") << nl;
os << indent << token::BEGIN_BLOCK << incrIndent << nl;
LeidenfrostModel_->write(os);
os << decrIndent << indent << token::END_BLOCK << nl;
}
if (CHFModel_.valid())
{
os.writeKeyword("CHFModel") << nl;
os << indent << token::BEGIN_BLOCK << incrIndent << nl;
CHFModel_->write(os);
os << decrIndent << indent << token::END_BLOCK << nl;
}
if (CHFSoobModel_.valid())
{
os.writeKeyword("CHFSubCoolModel") << nl;
os << indent << token::BEGIN_BLOCK << incrIndent << nl;
CHFSoobModel_->write(os);
os << decrIndent << indent << token::END_BLOCK << nl;
}
if (MHFModel_.valid())
{
os.writeKeyword("MHFModel") << nl;
os << indent << token::BEGIN_BLOCK << incrIndent << nl;
MHFModel_->write(os);
os << decrIndent << indent << token::END_BLOCK << nl;
}
if (TDNBModel_.valid())
{
os.writeKeyword("TDNBModel") << nl;
os << indent << token::BEGIN_BLOCK << incrIndent << nl;
TDNBModel_->write(os);
os << decrIndent << indent << token::END_BLOCK << nl;
}
os.writeKeyword("K") << K_ << token::END_STATEMENT << nl;
os.writeKeyword("wp") << wp_ << token::END_STATEMENT << nl;
break;
}
}
os.writeKeyword("otherPhase") << otherPhaseName_
<< token::END_STATEMENT << nl;
dmdt_.writeEntry("dmdt", os);
dDep_.writeEntry("dDep", os);
qq_.writeEntry("qQuenching", os);
alphatConv_.writeEntry("alphatConv", os);
writeEntry("value", os);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
makePatchTypeField
(
fvPatchScalarField,
alphatWallBoilingWallFunctionFvPatchScalarField
);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace compressible
} // End namespace Foam
// ************************************************************************* //