42 Foam::humidityTemperatureCoupledMixedFvPatchScalarField::massModeTypeNames_
44 { massTransferMode::mtConstantMass,
"constantMass" },
45 { massTransferMode::mtCondensation,
"condensation" },
46 { massTransferMode::mtEvaporation,
"evaporation" },
48 massTransferMode::mtCondensationAndEvaporation,
49 "condensationAndEvaporation"
56 Foam::scalar Foam::humidityTemperatureCoupledMixedFvPatchScalarField::Sh
74 Foam::humidityTemperatureCoupledMixedFvPatchScalarField::htcCondensation
80 if (Tsat > 295 && Tsat < 373)
82 return 51104 + 2044*Tsat;
92 Foam::humidityTemperatureCoupledMixedFvPatchScalarField::thicknessField
94 const word& fieldName,
133 mixedFvPatchScalarField(
p, iF),
142 mode_(mtConstantMass),
146 muName_(
"thermo:mu"),
152 liquidDict_(nullptr),
167 this->refValue() = 0.0;
168 this->refGrad() = 0.0;
169 this->valueFraction() = 1.0;
182 mixedFvPatchScalarField(psf,
p, iF, mapper),
187 rhoName_(psf.rhoName_),
188 muName_(psf.muName_),
189 TnbrName_(psf.TnbrName_),
190 qrNbrName_(psf.qrNbrName_),
191 qrName_(psf.qrName_),
192 specieName_(psf.specieName_),
193 liquid_(psf.liquid_.clone()),
194 liquidDict_(psf.liquidDict_),
195 mass_(psf.mass_, mapper),
197 myKDelta_(psf.myKDelta_, mapper),
198 dmHfg_(psf.dmHfg_, mapper),
199 mpCpTp_(psf.mpCpTp_, mapper),
203 cp_(psf.cp_, mapper),
204 thickness_(psf.thickness_, mapper),
205 rho_(psf.rho_, mapper),
206 thicknessLayers_(psf.thicknessLayers_),
207 kappaLayers_(psf.kappaLayers_)
219 mixedFvPatchScalarField(
p, iF),
221 mode_(mtCondensationAndEvaporation),
222 pName_(
dict.getOrDefault<
word>(
"p",
"p")),
223 UName_(
dict.getOrDefault<
word>(
"U",
"U")),
224 rhoName_(
dict.getOrDefault<
word>(
"rho",
"rho")),
225 muName_(
dict.getOrDefault<
word>(
"mu",
"thermo:mu")),
226 TnbrName_(
dict.getOrDefault<
word>(
"Tnbr",
"T")),
227 qrNbrName_(
dict.getOrDefault<
word>(
"qrNbr",
"none")),
228 qrName_(
dict.getOrDefault<
word>(
"qr",
"none")),
229 specieName_(
dict.getOrDefault<
word>(
"specie",
"none")),
246 if (!isA<mappedPatchBase>(this->
patch().
patch()))
249 <<
"\n patch type '" <<
p.type()
250 <<
"' not type '" << mappedPatchBase::typeName <<
"'"
251 <<
"\n for patch " <<
p.name()
252 <<
" of field " << internalField().name()
253 <<
" in file " << internalField().objectPath()
264 if (
dict.readIfPresent(
"thicknessLayers", thicknessLayers_))
266 dict.readEntry(
"kappaLayers", kappaLayers_);
285 dict.readEntry(
"carrierMolWeight", Mcomp_);
286 dict.readEntry(
"L", L_);
287 dict.readEntry(
"Tvap", Tvap_);
288 liquidDict_ =
dict.subDict(
"liquid");
292 if (
dict.found(
"thickness"))
303 thickness_[i]*liquid_->rho(pf, Tp[i])*magSf[i];
313 <<
"Did not find mode " << mode_
314 <<
" on patch " <<
patch().name()
316 <<
"Please set 'mode' to one of "
325 if (
dict.found(
"refValue"))
337 valueFraction() = 1.0;
346 const DimensionedField<scalar, volMesh>& iF
349 mixedFvPatchScalarField(psf, iF),
350 temperatureCoupledBase(
patch(), psf),
354 rhoName_(psf.rhoName_),
355 muName_(psf.muName_),
356 TnbrName_(psf.TnbrName_),
357 qrNbrName_(psf.qrNbrName_),
358 qrName_(psf.qrName_),
359 specieName_(psf.specieName_),
360 liquid_(psf.liquid_.clone()),
361 liquidDict_(psf.liquidDict_),
364 myKDelta_(psf.myKDelta_),
366 mpCpTp_(psf.mpCpTp_),
371 thickness_(psf.thickness_),
373 thicknessLayers_(psf.thicknessLayers_),
374 kappaLayers_(psf.kappaLayers_)
385 mixedFvPatchScalarField::autoMap(m);
391 myKDelta_.autoMap(m);
395 thickness_.autoMap(m);
407 mixedFvPatchScalarField::rmap(ptf, addr);
410 refCast<const humidityTemperatureCoupledMixedFvPatchScalarField>
418 mass_.rmap(tiptf.mass_, addr);
419 myKDelta_.rmap(tiptf.myKDelta_, addr);
420 dmHfg_.rmap(tiptf.dmHfg_, addr);
421 mpCpTp_.rmap(tiptf.mpCpTp_, addr);
422 cp_.rmap(tiptf.cp_, addr);
423 thickness_.rmap(tiptf.thickness_, addr);
424 rho_.rmap(tiptf.rho_, addr);
437 const mappedPatchBase& mpp =
438 refCast<const mappedPatchBase>(
patch().
patch());
442 const label nbrPatchI = mpp.samplePolyPatch().index();
443 const polyMesh&
mesh =
patch().boundaryMesh().mesh();
444 const polyMesh& nbrMesh = mpp.sampleMesh();
445 const fvPatch& nbrPatch =
446 refCast<const fvMesh>(nbrMesh).boundary()[nbrPatchI];
459 scalarField nbrIntFld(nbrField.patchInternalField());
460 mpp.distribute(nbrIntFld);
477 mpp.distribute(nbrK);
479 scalarField nrbDeltaCoeffs(nbrPatch.deltaCoeffs());
480 mpp.distribute(nrbDeltaCoeffs);
482 scalarField KDeltaNbr(nbrField.kappa(*
this)*nbrPatch.deltaCoeffs());
483 mpp.distribute(KDeltaNbr);
485 myKDelta_ =
K*
patch().deltaCoeffs();
487 if (thicknessLayers_.size() > 0)
489 myKDelta_ = 1.0/myKDelta_;
490 forAll(thicknessLayers_, iLayer)
492 myKDelta_ += thicknessLayers_[iLayer]/kappaLayers_[iLayer];
494 myKDelta_ = 1.0/myKDelta_;
507 if (mode_ != mtConstantMass)
516 fixedGradientFvPatchField<scalar>& Yp =
517 const_cast<fixedGradientFvPatchField<scalar>&
>
521 const fixedGradientFvPatchField<scalar>
548 const scalar Tf = Tp[faceI];
549 const scalar Tint = Tin[faceI];
551 const scalar pf = pp[faceI];
553 const scalar muf = mup[faceI];
554 const scalar
rhof = rhop[faceI];
555 const scalar nuf = muf/
rhof;
556 const scalar pSat = liquid_->pv(pf, Tint);
557 const scalar Mv = liquid_->W();
558 const scalar TSat = liquid_->pvInvert(pSat);
559 const scalar
Re =
mag(
Uf)*L_/nuf;
561 cp[faceI] = liquid_->Cp(pf, Tf);
562 hfg[faceI] = liquid_->hl(pf, Tf);
565 const scalar invMwmean =
566 Yi[faceI]/Mv + (1.0 - Yi[faceI])/Mcomp_;
567 const scalar Xv = Yi[faceI]/invMwmean/Mv;
568 RH[faceI] =
min(Xv*pf/pSat, 1.0);
573 if (RH[faceI] > RHmin)
577 scalar TintDeg = Tint - 273;
579 b*(
log(RH[faceI]) + (
c*TintDeg)/(
b + TintDeg))
580 /(
c -
log(RH[faceI]) - ((
c*TintDeg)/(
b + TintDeg)))
589 mode_ == mtCondensation
590 || mode_ == mtCondensationAndEvaporation
594 htc[faceI] = htcCondensation(TSat,
Re)*nbrK[faceI]/L_;
597 1.0/((1.0/myKDelta_[faceI]) + (1.0/htc[faceI]));
600 const scalar q = (Tint - Tf)*htcTotal*magSf[faceI];
603 dm[faceI] = q/hfg[faceI]/magSf[faceI];
605 mass_[faceI] += q/hfg[faceI]*dt;
608 const scalar Dab = liquid_->D(pf, Tf);
610 -
min(dm[faceI]/Dab/
rhof, Yi[faceI]*myDelta[faceI]);
615 && mass_[faceI] > 0.0
617 mode_ == mtEvaporation
618 || mode_ == mtCondensationAndEvaporation
622 const scalar Dab = liquid_->D(pf, Tf);
624 const scalar Sc = nuf/Dab;
625 const scalar Sh = this->Sh(
Re, Sc);
627 const scalar Ys = Mv*pSat/(Mv*pSat + Mcomp_*(pf - pSat));
630 const scalar hm = Dab*Sh/L_;
632 const scalar Yinf =
max(Yi[faceI], 0.0);
635 dm[faceI] = -
rhof*hm*
max((Ys - Yinf), 0.0)/(1.0 - Ys);
638 Yvp[faceI] = -dm[faceI]/Dab/
rhof;
641 mass_[faceI] += dm[faceI]*magSf[faceI]*dt;
643 htc[faceI] = htcCondensation(TSat,
Re)*nbrK[faceI]/L_;
645 else if (Tf > Tdew[faceI] && Tf < Tvap_ && mass_[faceI] > 0.0)
647 htc[faceI] = htcCondensation(TSat,
Re)*nbrK[faceI]/L_;
649 else if (mass_[faceI] == 0.0)
654 liquidRho[faceI] = liquid_->rho(pf, Tf);
657 mass_ =
max(mass_, scalar(0));
662 const word fieldName(specieName_ +
"Thickness");
668 refCast<const fvMesh>(
mesh)
669 ).boundaryFieldRef()[
patch().index()];
672 pDelta = mass_/liquidRho/magSf;
675 myKDelta_ = 1.0/((1.0/myKDelta_) + (1.0/htc));
677 mpCpTp_ = mass_*
cp/dt/magSf;
689 refCast<const fvMesh>(
mesh)
690 ).boundaryFieldRef()[
patch().index()];
697 refCast<const fvMesh>(
mesh)
698 ).boundaryFieldRef()[
patch().index()];
705 mpCpTp_ = thickness_*rho_*cp_/dt;
714 mpCpTpNbr = nbrField.mpCpTp();
715 mpp.distribute(mpCpTpNbr);
717 dmHfgNbr = nbrField.dmHfg();
718 mpp.distribute(dmHfgNbr);
723 if (qrName_ !=
"none")
729 if (qrNbrName_ !=
"none")
731 qrNbr = nbrPatch.lookupPatchField<
volScalarField, scalar>(qrNbrName_);
732 mpp.distribute(qrNbr);
744 refValue() = (KDeltaNbr*nbrIntFld + mpCpdt*TpOld + dmHfg)/
alpha;
746 mixedFvPatchScalarField::updateCoeffs();
750 scalar Qdm =
gSum(dm);
751 scalar QMass =
gSum(mass_);
752 scalar Qt =
gSum(myKDelta_*(Tp - Tin)*magSf);
753 scalar QtSolid =
gSum(KDeltaNbr*(Tp - nbrIntFld)*magSf);
756 <<
patch().name() <<
':'
757 << internalField().name() <<
" <- "
758 << nbrMesh.name() <<
':'
759 << nbrPatch.name() <<
':'
760 << internalField().name() <<
" :" <<
nl
761 <<
" Total mass flux [Kg/s] : " << Qdm <<
nl
762 <<
" Total mass on the wall [Kg] : " << QMass <<
nl
763 <<
" Total heat (>0 leaving the wall to the fluid) [W] : "
765 <<
" Total heat (>0 leaving the wall to the solid) [W] : "
767 <<
" wall temperature "
768 <<
" min:" <<
gMin(*
this)
769 <<
" max:" <<
gMax(*
this)
803 if (mode_ == mtConstantMass)
812 liquidDict_.write(
os);
815 if (thicknessLayers_.size())
817 thicknessLayers_.writeEntry(
"thicknessLayers",
os);
818 kappaLayers_.writeEntry(
"kappaLayers",
os);