1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
7 -------------------------------------------------------------------------------
9 This file is part of OpenFOAM.
11 OpenFOAM is free software: you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by
13 the Free Software Foundation, either version 3 of the License, or
14 (at your option) any later version.
16 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 You should have received a copy of the GNU General Public License
22 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
26 #include "standardPhaseChange.H"
27 #include "addToRunTimeSelectionTable.H"
28 #include "thermoSingleLayer.H"
30 #include "heatTransferModel.H"
32 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
36 namespace regionModels
38 namespace surfaceFilmModels
41 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
43 defineTypeNameAndDebug(standardPhaseChange, 0);
45 addToRunTimeSelectionTable
52 // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
54 scalar standardPhaseChange::Sh
62 return 0.664*sqrt(Re)*cbrt(Sc);
66 return 0.037*pow(Re, 0.8)*cbrt(Sc);
71 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
73 standardPhaseChange::standardPhaseChange
75 const surfaceFilmModel& owner,
76 const dictionary& dict
79 phaseChangeModel(typeName, owner, dict),
80 Tb_(readScalar(coeffs_.lookup("Tb"))),
81 deltaMin_(readScalar(coeffs_.lookup("deltaMin"))),
82 L_(readScalar(coeffs_.lookup("L"))),
83 TbFactor_(coeffs_.lookupOrDefault<scalar>("TbFactor", 1.1))
87 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
89 standardPhaseChange::~standardPhaseChange()
93 // * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
95 void standardPhaseChange::correctModel
98 scalarField& availableMass,
103 const thermoSingleLayer& film = refCast<const thermoSingleLayer>(owner_);
105 // set local thermo properties
106 const SLGThermo& thermo = film.thermo();
107 const label liqId = film.liquidId();
108 const liquidProperties& liq = thermo.liquids().properties()[liqId];
109 const label vapId = thermo.carrierId(thermo.liquids().components()[liqId]);
111 // retrieve fields from film model
112 const scalarField& delta = film.delta();
113 const scalarField& YInf = film.YPrimary()[vapId];
114 const scalarField& pInf = film.pPrimary();
115 const scalarField& T = film.T();
116 const scalarField& Tw = film.Tw();
117 const scalarField& rho = film.rho();
118 const scalarField& TInf = film.TPrimary();
119 const scalarField& rhoInf = film.rhoPrimary();
120 const scalarField& muInf = film.muPrimary();
121 const scalarField& magSf = film.magSf();
122 const scalarField hInf(film.htcs().h());
123 const scalarField hFilm(film.htcw().h());
124 const vectorField dU(film.UPrimary() - film.Us());
125 const scalarField limMass
127 max(scalar(0.0), availableMass - deltaMin_*rho*magSf)
132 if (delta[cellI] > deltaMin_)
134 // cell pressure [Pa]
135 const scalar pc = pInf[cellI];
137 // local temperature - impose lower limit of 200 K for stability
138 const scalar Tloc = min(TbFactor_*Tb_, max(200.0, T[cellI]));
140 // saturation pressure [Pa]
141 const scalar pSat = liq.pv(pc, Tloc);
143 // latent heat [J/kg]
144 const scalar hVap = liq.hl(pc, Tloc);
146 // calculate mass transfer
150 const scalar qDotInf = hInf[cellI]*(TInf[cellI] - T[cellI]);
151 const scalar qDotFilm = hFilm[cellI]*(T[cellI] - Tw[cellI]);
153 const scalar Cp = liq.Cp(pc, Tloc);
154 const scalar Tcorr = max(0.0, T[cellI] - Tb_);
155 const scalar qCorr = limMass[cellI]*Cp*(Tcorr);
157 dt*magSf[cellI]/hVap*(qDotInf + qDotFilm)
162 // Primary region density [kg/m3]
163 const scalar rhoInfc = rhoInf[cellI];
165 // Primary region viscosity [Pa.s]
166 const scalar muInfc = muInf[cellI];
169 const scalar Re = rhoInfc*mag(dU[cellI])*L_/muInfc;
171 // molecular weight of vapour [kg/kmol]
172 const scalar Wvap = thermo.carrier().W(vapId);
174 // molecular weight of liquid [kg/kmol]
175 const scalar Wliq = liq.W();
177 // vapour mass fraction at interface
178 const scalar Ys = Wliq*pSat/(Wliq*pSat + Wvap*(pc - pSat));
180 // vapour diffusivity [m2/s]
181 const scalar Dab = liq.D(pc, Tloc);
184 const scalar Sc = muInfc/(rhoInfc*(Dab + ROOTVSMALL));
187 const scalar Sh = this->Sh(Re, Sc);
189 // mass transfer coefficient [m/s]
190 const scalar hm = Sh*Dab/(L_ + ROOTVSMALL);
192 // add mass contribution to source
194 dt*magSf[cellI]*rhoInfc*hm*(Ys - YInf[cellI])/(1.0 - Ys);
197 dMass[cellI] = min(limMass[cellI], max(0.0, dMass[cellI]));
198 dEnergy[cellI] = dMass[cellI]*hVap;
204 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
206 } // End namespace surfaceFilmModels
207 } // End namespace regionModels
208 } // End namespace Foam
210 // ************************************************************************* //