16#include <Flux_parietal_Kommajosyula.h>
17#include <Hibiki_Ishii_nucleation_site_density.h>
18#include <Flux_parietal_adaptatif.h>
19#include <Loi_paroi_adaptative.h>
20#include <Pb_Multiphase.h>
22#include <Domaine_VF.h>
24#include <Milieu_composite.h>
25#include <Saturation_base.h>
37 const Pb_Multiphase& pbm = ref_cast(Pb_Multiphase, pb_.valeur());
39 Cout <<
que_suis_je() <<
" : single-phase wall heat flux is " << correlation_monophasique_->
que_suis_je() << finl;
44 param.lire_avec_accolades(is);
46 if (!sub_type(Milieu_composite, pb_->milieu()))
47 Process::exit(
"Flux_parietal_Kommajosyula::readOn: the medium must be composite!");
50 Process::exit(
"Flux_parietal_Kommajosyula::readOn: the first phase must be liquid!");
52 const Milieu_composite& milc = ref_cast(Milieu_composite, pb_->milieu());
54 for (
int k = 1; k < pbm.
nb_phases() ; k++)
59 Process::exit(
"Flux_parietal_Kommajosyula::readOn: there can only be one evaporating phase for the carrying liquid for now! Please feel free to update the code if you need.");
66 correlation_monophasique_->completer();
72 if (out.
qpk) (*out.
qpk) = 0.;
78 if (out.
qpi) (*out.
qpi) = 0.;
93 for (
int k = 0; k < in.
N; k++)
97 const int ind_sat = k < n_l
98 ? (k * (in.
N - 1) - (k - 1) * k / 2) + (n_l - k - 1)
99 : (n_l * (in.
N - 1) - (n_l - 1) * n_l / 2) + (k - n_l - 1);
101 const double Delta_T_sup = in.
Tp - in.
Tsat[ind_sat];
105 const double Delta_T_sub = std::max(in.
Tsat[ind_sat] - in.
T[n_l], 1.e-8);
111 const double u_tau = corr_loi_paroi.
get_utau(in.
f);
112 u_bulk = 20. * u_tau;
115 Cerr <<
"Flux_parietal_Kommajosyula::qp isn't adapted to a single-phase " << correlation_monophasique_->que_suis_je() <<
" heat flux for now !\n",
Process::exit();
118 const double h_fc = (*out.
dTp_qpk)(n_l);
121 const NucleationParams nuc = compute_nucleation_params(in, n_l, k, ind_sat, Delta_T_sup, Delta_T_sub, u_bulk);
124 const double t_star = in.
lambda[n_l] * in.
rho[n_l] * in.
Cp[n_l] / (h_fc * h_fc * M_PI);
127 const SlidingAreaParams sa = compute_sliding_area(nuc, h_fc, t_star);
129 DoubleTrav qpk_loc, da_qpk_loc, dp_qpk_loc, dv_qpk_loc, dTf_qpk_loc, dTp_qpk_loc;
131 if (out.
qpk) qpk_loc = *out.
qpk;
139 if (out.
qpk) (*out.
qpk) *= (1 - sa.S_sl);
145 (*out.
dTf_qpk) *= (1 - sa.S_sl);
146 (*out.
dTf_qpk)(n_l,n_l) += -sa.dTl_S_sl * qpk_loc(n_l);
147 (*out.
dTf_qpk)(n_l, k ) += -sa.dTk_S_sl * qpk_loc( k );
151 (*out.
dTp_qpk) *= (1 - sa.S_sl);
152 (*out.
dTp_qpk)(n_l) += -sa.dTp_S_sl * qpk_loc(n_l);
156 if (out.
qpk) (*out.
qpk)(n_l) += sa.S_sl * 2. * h_fc * (in.
Tp - in.
T[n_l]);
157 if (out.
dTf_qpk) (*out.
dTf_qpk)(n_l, n_l) += -sa.S_sl * 2. * h_fc + sa.dTl_S_sl * 2. * h_fc * (in.
Tp - in.
T[n_l]);
158 if (out.
dTf_qpk) (*out.
dTf_qpk)(n_l, k) += sa.dTk_S_sl * 2. * h_fc * (in.
Tp - in.
T[n_l]);
159 if (out.
dTp_qpk) (*out.
dTp_qpk)( k ) += sa.S_sl * 2. * h_fc + sa.dTp_S_sl * 2. * h_fc * (in.
Tp - in.
T[n_l]);
162 if (out.
qpi) (*out.
qpi)(n_l, k) = 1./6. * M_PI * in.
rho[k] * in.
Lvap[ind_sat] * std::pow(nuc.D_lo, 3.) * nuc.f_dep * sa.N_active;
163 if (out.
dTp_qpi) (*out.
dTp_qpi)(n_l, k) = 1./6. * M_PI * in.
rho[k] * in.
Lvap[ind_sat] * (3. * nuc.dTp_D_lo * std::pow(nuc.D_lo, 2.) * nuc.f_dep * sa.N_active
164 + std::pow(nuc.D_lo, 3.) * nuc.dTp_f_dep * sa.N_active
165 + std::pow(nuc.D_lo, 3.) * nuc.f_dep * sa.dTp_N_active);
166 if (out.
dTf_qpi) (*out.
dTf_qpi)(n_l, k, n_l) = 1./6. * M_PI * in.
rho[k] * in.
Lvap[ind_sat] * (3. * nuc.dTl_D_lo * std::pow(nuc.D_lo, 2.) * nuc.f_dep * sa.N_active
167 + std::pow(nuc.D_lo, 3.) * nuc.dTl_f_dep * sa.N_active
168 + std::pow(nuc.D_lo, 3.) * nuc.f_dep * sa.dTl_N_active);
169 if (out.
dTf_qpi) (*out.
dTf_qpi)(n_l, k, k) = 1./6. * M_PI * in.
rho[k] * in.
Lvap[ind_sat] * (std::pow(nuc.D_lo, 3.) * nuc.f_dep * sa.dTk_N_active);
177Flux_parietal_Kommajosyula::NucleationParams
178Flux_parietal_Kommajosyula::compute_nucleation_params(
const input_t& in,
int n_l,
int k,
int ind_sat,
179 double Delta_T_sup,
double Delta_T_sub,
double u_bulk)
const
181 NucleationParams nuc {};
183 const double dTp_Delta_T_sup = 1.;
184 const double dTl_Delta_T_sub = -1.;
185 const double Ja_sup = in.rho[n_l] * in.Cp[n_l] * Delta_T_sup / (in.rho[k] * in.Lvap[ind_sat]);
186 const double Ja_sub = in.rho[n_l] * in.Cp[n_l] * Delta_T_sub / (in.rho[k] * in.Lvap[ind_sat]);
187 const double dTp_Ja_sup = in.rho[n_l] * in.Cp[n_l] / (in.rho[k] * in.Lvap[ind_sat]);
188 const double dTl_Ja_sub = -in.rho[n_l] * in.Cp[n_l] / (in.rho[k] * in.Lvap[ind_sat]);
191 nuc.N_sites = Hibiki_Ishii_site_density(in.rho[k], in.rho[n_l], in.Tp, in.p, in.Lvap[ind_sat], in.Tsat[ind_sat], in.Sigma[ind_sat],
theta_,
molar_mass_);
192 nuc.dTp_N_sites = dT_ref_Hibiki_Ishii_site_density(in.rho[k], in.rho[n_l], in.Tp, in.p, in.Lvap[ind_sat], in.Tsat[ind_sat], in.Sigma[ind_sat],
theta_,
molar_mass_);
193 nuc.dTl_N_sites = 0.;
194 nuc.dTk_N_sites = 0.;
197 const double rho_ratio_pow = std::pow((in.rho[n_l] - in.rho[k]) / in.rho[k], 0.27);
198 const double u_bulk_pow = std::pow(u_bulk, -0.26);
200 18.9e-6 * rho_ratio_pow * std::pow(Ja_sup, 0.75) * std::pow(1 + Ja_sub, -0.3) * u_bulk_pow;
201 nuc.dTp_D_d = 18.9e-6 * rho_ratio_pow * 0.75 * dTp_Ja_sup * std::pow(Ja_sup, -0.25) *
202 std::pow(1 + Ja_sub, -0.3) * u_bulk_pow;
203 nuc.dTl_D_d = 18.9e-6 * rho_ratio_pow * std::pow(Ja_sup, 0.75) * -0.3 * dTl_Ja_sub *
204 std::pow(1 + Ja_sub, -1.3) * u_bulk_pow;
207 nuc.D_lo = 1.2 * nuc.D_d;
208 nuc.dTp_D_lo = 1.2 * nuc.dTp_D_d;
209 nuc.dTl_D_lo = 1.2 * nuc.dTl_D_d;
212 const double chi = 1.55 - 0.05 * Delta_T_sub / Delta_T_sup;
213 const double dTp_chi = 0.05 * Delta_T_sub * dTp_Delta_T_sup / std::pow(Delta_T_sup, 2);
214 const double dTl_chi = -0.05 * dTl_Delta_T_sub / Delta_T_sup;
215 const double thermal_diff = in.lambda[n_l] / (in.rho[n_l] * in.Cp[n_l]);
216 const double growth_factor = 2. * std::sqrt(3. / M_PI) * thermal_diff;
218 const double K = chi * growth_factor * Ja_sup;
219 const double dTp_K = dTp_chi * growth_factor * Ja_sup + chi * growth_factor * dTp_Ja_sup;
220 const double dTl_K = dTl_chi * growth_factor * Ja_sup;
223 nuc.t_g = nuc.D_d * nuc.D_d / (16. * K * K);
224 nuc.dTp_t_g = 2 * nuc.dTp_D_d * nuc.D_d / (16. * K * K)
225 + nuc.D_d * nuc.D_d * -2. * dTp_K / (16. * K * K * K);
226 nuc.dTl_t_g = 2 * nuc.dTl_D_d * nuc.D_d / (16. * K * K)
227 + nuc.D_d * nuc.D_d * -2. * dTl_K / (16. * K * K * K);
230 const double t_w = 0.0061 * std::pow(Ja_sub, 0.63) / Delta_T_sup;
231 const double dTp_t_w = 0.0061 * std::pow(Ja_sub, 0.63) * -dTp_Delta_T_sup / std::pow(Delta_T_sup, 2);
232 const double dTl_t_w = 0.0061 * .63 * dTl_Ja_sub * std::pow(Ja_sub, -.37) / Delta_T_sup;
235 nuc.f_dep = 1 / (nuc.t_g + t_w);
236 nuc.dTp_f_dep = -(nuc.dTp_t_g + dTp_t_w) / std::pow(nuc.t_g + t_w, 2);
237 nuc.dTl_f_dep = -(nuc.dTl_t_g + dTl_t_w) / std::pow(nuc.t_g + t_w, 2);
242Flux_parietal_Kommajosyula::SlidingAreaParams
243Flux_parietal_Kommajosyula::compute_sliding_area(
const NucleationParams& nuc,
double h_fc,
double t_star)
const
245 SlidingAreaParams sa {};
248 const double N_0 = nuc.f_dep * nuc.t_g * M_PI * nuc.D_d * nuc.D_d / 4.;
249 const double dTp_N_0 = nuc.dTp_f_dep * nuc.t_g * M_PI * nuc.D_d * nuc.D_d / 4.
250 + nuc.f_dep * nuc.dTp_t_g * M_PI * nuc.D_d * nuc.D_d / 4.
251 + nuc.f_dep * nuc.t_g * M_PI * 2. * nuc.dTp_D_d * nuc.D_d / 4.;
252 const double dTl_N_0 = nuc.dTl_f_dep * nuc.t_g * M_PI * nuc.D_d * nuc.D_d / 4.
253 + nuc.f_dep * nuc.dTl_t_g * M_PI * nuc.D_d * nuc.D_d / 4.
254 + nuc.f_dep * nuc.t_g * M_PI * 2. * nuc.dTl_D_d * nuc.D_d / 4.;
259 sa.N_active = W_val / N_0;
260 sa.dTp_N_active = (dTp_N_0 * nuc.N_sites + N_0 * nuc.dTp_N_sites) * dLoc_Lambert / N_0
261 + W_val * -dTp_N_0 / std::pow(N_0, 2);
262 sa.dTl_N_active = (dTl_N_0 * nuc.N_sites + N_0 * nuc.dTl_N_sites) * dLoc_Lambert / N_0
263 + W_val * -dTl_N_0 / std::pow(N_0, 2);
264 sa.dTk_N_active = N_0 * nuc.dTk_N_sites * dLoc_Lambert / N_0;
267 Cerr <<
"nsite " << nuc.N_sites <<
"N0 " << N_0 <<
"\n";
270 const double A_sl = std::pow(sa.N_active, -.5) * (nuc.D_d + nuc.D_lo) / 2.;
271 const double dTp_A_sl =
272 -.5 * sa.dTp_N_active * std::pow(sa.N_active, -1.5) * (nuc.D_d + nuc.D_lo) / 2. +
273 std::pow(sa.N_active, -.5) * (nuc.dTp_D_d + nuc.dTp_D_lo) / 2.;
274 const double dTl_A_sl =
275 -.5 * sa.dTl_N_active * std::pow(sa.N_active, -1.5) * (nuc.D_d + nuc.D_lo) / 2. +
276 std::pow(sa.N_active, -.5) * (nuc.dTl_D_d + nuc.dTl_D_lo) / 2.;
277 const double dTk_A_sl =
278 -.5 * sa.dTk_N_active * std::pow(sa.N_active, -1.5) * (nuc.D_d + nuc.D_lo) / 2.;
281 const double product = A_sl * sa.N_active * nuc.f_dep * t_star;
282 const bool saturated = (1. < product);
283 sa.S_sl = std::min(1., product);
284 sa.dTp_S_sl = saturated ? 0. :
285 dTp_A_sl * sa.N_active * nuc.f_dep * t_star
286 + A_sl * sa.dTp_N_active * nuc.f_dep * t_star
287 + A_sl * sa.N_active * nuc.dTp_f_dep * t_star;
288 sa.dTl_S_sl = saturated ? 0. :
289 dTl_A_sl * sa.N_active * nuc.f_dep * t_star
290 + A_sl * sa.dTl_N_active * nuc.f_dep * t_star
291 + A_sl * sa.N_active * nuc.dTl_f_dep * t_star;
292 sa.dTk_S_sl = saturated ? 0. :
293 dTk_A_sl * sa.N_active * nuc.f_dep * t_star
294 + A_sl * sa.dTk_N_active * nuc.f_dep * t_star;
304 return std::log(x) - std::log(std::log(x));
306 return 0.2689*x + 0.2690;
314 return 1./x - 1./(x*std::log(x));
static void typer_lire_correlation(OWN_PTR(Correlation_base)&, const Probleme_base &, const Nom &, Entree &)
Class defining operators and methods for all reading operation in an input flow (file,...
Wall heat flux correlation for subcooled boiling using the Kommajosyula model.
double theta_
Contact angle on the surface [degrees].
void qp(const input_t &input, output_t &output) const override
void completer() override
double Lambert_W_function(double x) const
double dx_Lambert_W_function(double x) const
double molar_mass_
Molar mass [kg/mol].
classe Flux_parietal_adaptatif classe qui implemente une correlation de flux parietal monophasique
classe Flux_parietal_base correlations de flux parietal de la forme
classe Loi_paroi_adaptative correlation pour une loi de paroi adaptative qui calcule u_tau et du y_pl...
double get_utau(int f) const
Classe Milieu_composite Cette classe represente un fluide reel ainsi que.
bool has_saturation(int k, int l) const
virtual int debute_par(const char *const n) const
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
classe Pb_Multiphase Cette classe represente un probleme de thermohydraulique multiphase de type "3*N...
const Nom & nom_phase(int i) const
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.