150 const DoubleVect& pe = milc.
porosite_elem(), &ve = domaine.volumes();
157 const DoubleTab& inco = ch.
valeurs(), &alpha = ch_alpha.
valeurs(), &press = ch_p.valeurs(), &temp = ch_temp.valeurs(), &temp_p = ch_temp.passe(),
158 &h = milc.
enthalpie().
valeurs(), *dP_h = der_h.count(
"pression") ? &der_h.at(
"pression") :
nullptr, *dT_h = der_h.count(
"temperature") ? &der_h.at(
"temperature") :
nullptr,
160 &p_ar = ch_a_r.passe(), &a_r = ch_a_r.valeurs(), &qi =
qpi(), &dTqi =
dT_qpi(), &daqi =
da_qpi(), &dpqi =
dp_qpi(),
164 Matrice_Morse *Mp = matrices.count(
"pression") ? matrices.at(
"pression") :
nullptr,
165 *Mt = matrices.count(
"temperature") ? matrices.at(
"temperature") :
nullptr,
166 *Ma = matrices.count(
"alpha") ? matrices.at(
"alpha") :
nullptr,
167 *Mai = matrices.count(
"interfacial_area") ? matrices.at(
"interfacial_area") :
nullptr;
170 const int cL = (lambda.dimension_tot(0) == 1), cM = (mu.dimension_tot(0) == 1), cR = (rho.dimension_tot(0) == 1), cCp = (Cp.dimension_tot(0) == 1);
188 DoubleTrav sec_m(alpha);
189 std::map<std::string, Matrice_Morse> mat_m_stockees;
191 for (
auto &&n_m : matrices)
192 if (n_m.first.find(
"/") == std::string::npos)
194 Matrice_Morse& dst = mat_m_stockees[n_m.first], &src = *n_m.second;
199 mat_m[n_m.first] = &dst;
204 for (i = 0; i < eq_m.
sources().size(); i++)
207 std::vector<std::array<Matrice_Morse *, 2>> vec_m;
208 for (
auto &&n_m : matrices)
209 if (n_m.first.find(
"/") == std::string::npos && mat_m[n_m.first]->get_tab1().size_array() > 1) vec_m.push_back({{ mat_m[n_m.first], n_m.second }});
213 DoubleTrav dT_G(N), da_G(N), nv(N, N);
216 DoubleTab& hi = out.
hi, &dT_hi = out.
dT_hi, &da_hi = out.
da_hi, &dP_hi = out.
dp_hi;
217 hi.
resize(N, N), dT_hi.resize(N, N, N), da_hi.resize(N, N, N), dP_hi.resize(N, N), in.
v.
resize(N, D);
220 const int nbelem = domaine.nb_elem(), nb_max_sat = N * (N-1) /2;
221 DoubleTrav Ts_tab(nbelem,nb_max_sat), dPTs_tab(nbelem,nb_max_sat), Hvs_tab(nbelem,nb_max_sat), Hls_tab(nbelem,nb_max_sat), dPHvs_tab(nbelem,nb_max_sat), dPHls_tab(nbelem,nb_max_sat), Lvap_tab(nbelem,nb_max_sat), dP_Lvap_tab(nbelem,nb_max_sat), Sigma_tab(nbelem,nb_max_sat);
224 DoubleTab pvit_elem(0, N * D);
225 domaine.domaine().creer_tableau_elements(pvit_elem);
230 for (k = 0; k < N; k++)
231 for (l = k + 1; l < N; l++)
235 const int ind_trav = (k*(N-1)-(k-1)*(k)/2) + (l-k-1);
239 assert(press.line_size() == 1);
245 for (
int ii = 0; ii < nbelem; ii++)
247 Ts_tab(ii, ind_trav) = tsat(ii);
248 Sigma_tab(ii, ind_trav) = sig(ii);
252 MSatSpanD sats_all = { };
253 sats_all.insert( { SAT::T_SAT_DP, dPTs_tab.get_span() });
254 sats_all.insert( { SAT::HV_SAT, Hvs_tab.get_span() });
255 sats_all.insert( { SAT::HL_SAT, Hls_tab.get_span() });
256 sats_all.insert( { SAT::HV_SAT_DP, dPHvs_tab.get_span() });
257 sats_all.insert( { SAT::HL_SAT_DP, dPHls_tab.get_span() });
258 sats_all.insert( { SAT::LV_SAT, Lvap_tab.get_span() });
259 sats_all.insert( { SAT::LV_SAT_DP, dP_Lvap_tab.get_span() });
261 ConstDoubleTab_parts ppart(press);
265 for (e = 0; e < domaine.nb_elem(); e++)
268 for (in.
v = 0, d = 0; d < D; d++)
269 for (n = 0; n < N; n++)
270 in.
v(n, d) = pvit_elem(e, N * d + n);
271 for (nv = 0, d = 0; d < D; d++)
272 for (n = 0; n < N; n++)
273 for (k = 0 ; k<N ; k++) nv(n, k) += std::pow(pvit_elem(e, N * d + n) - ((n!=k) ? pvit_elem(e, N * d + k) : 0) , 2);
274 for (n = 0; n < N; n++)
275 for (k = 0 ; k<N ; k++) nv(n, k) = std::max(sqrt(nv(n, k)), dv_min);
277 in.
dh = dh, in.
alpha = &alpha(e, 0), in.
T = &temp(e, 0), in.
T_passe = &temp_p(e, 0), in.
p = press(e, 0), in.
nv = &nv(0, 0), in.
h = &h(e, 0), in.
dT_h = dT_h ? &(*dT_h)(e, 0) :
nullptr, in.
dP_h = dP_h ? &(*dP_h)(e, 0) :
nullptr;
278 in.
lambda = &lambda(!cL * e, 0), in.
mu = &mu(!cM * e, 0), in.
rho = &rho(!cR * e, 0), in.
Cp = &Cp(!cCp * e, 0), in.
e = e, in.
Lvap = &Lvap_tab(e, 0), in.
dP_Lvap = &dP_Lvap_tab(e, 0), in.
sigma = &Sigma_tab(e,0), in.
Tsat = &Ts_tab(e,0), in.
dP_Tsat = &dPTs_tab(e,0);
279 in.
d_bulles = (d_bulles) ? &(*d_bulles)(e,0) :
nullptr, in.
k_turb = (k_turb) ? &(*k_turb)(e,0) :
nullptr, in.
nut = (is_turb_) ? &nut(e,0) :
nullptr;
280 correlation_fi.
coeffs(in, out);
282 for (k = 0; k < N; k++)
283 for (l = k + 1; l < N; l++)
287 const int i_sat = (k*(N-1)-(k-1)*(k)/2) + (l-k-1);
290 G = correlation_G->
calculer(k, l, dh, &alpha(e, 0), &temp(e, 0), press(e, 0), &nv(0), &lambda(!cL * e, 0), &mu(!cM * e, 0), &rho(!cM * e, 0), &Cp(!cCp * e, 0),
291 sat, dT_G, da_G, dP_G);
294 double Tk = temp(e, k), Tl = temp(e, l), Ts = Ts_tab(e,i_sat), dP_Ts = dPTs_tab(e,i_sat),
295 phi = hi(k, l) * (Tk - Ts) + hi(l, k) * (Tl - Ts) + qi(e, k, l) / vol, L = (phi < 0 ? h(e, l) : Hvs_tab(e,i_sat)) - (phi > 0 ? h(e, k) : Hls_tab(e,i_sat));
296 if ((is_therm = !correlation_G || std::fabs(G) > std::fabs(phi / L))) G = phi / L;
300 int n_lim = G > 0 ? k : l, sgn = G > 0 ? 1 : -1;
301 double Glim = sec_m(e, n_lim) / vol + p_ar(e, n_lim) / dt;
302 if (std::fabs(G) < Glim) n_lim = -1;
303 else G = (G > 0 ? 1 : -1) * Glim;
305 double hk = G > 0 ? h(e, k) : Hls_tab(e,i_sat), dTk_hk = G > 0 && dT_h ? (*dT_h)(e, k) : 0, dP_hk = G > 0 ? (dP_h ? (*dP_h)(e, k) : 0) : dPHls_tab(e,i_sat),
306 hl = G < 0 ? h(e, l) : Hvs_tab(e,i_sat), dTl_hl = G < 0 && dT_h ? (*dT_h)(e, l) : 0, dP_hl = G < 0 ? (dP_h ? (*dP_h)(e, l) : 0) : dPHvs_tab(e,i_sat);
307 if (n_lim < 0 && is_therm)
309 double dP_phi = dP_hi(k, l) * (Tk - Ts) + dP_hi(l, k) * (Tl - Ts) - (hi(k, l) + hi(l, k)) * dP_Ts + dpqi(e, k, l) / vol,
310 dTk_L = -dTk_hk, dTl_L = dTl_hl, dP_L = dP_hl - dP_hk;
311 dP_G = (dP_phi - G * dP_L) / L;
312 for (n = 0; n < N; n++) dT_G(n) = ((n == k) * (hi(k, l) - G * dTk_L) + (n == l) * (hi(l, k) - G * dTl_L) + dT_hi(k, l, n) * (Tk - Ts) + dT_hi(l, k, n) * (Tl - Ts) + dTqi(e, k, l, n)) / L;
313 for (n = 0; n < N; n++) da_G(n) = (da_hi(k, l, n) * (Tk - Ts) + da_hi(l, k, n) * (Tl - Ts) + daqi(e, k, l, n)) / L;
319 for (i = 0; i < 2; i++) secmem(e, i ? l : k) -= vol * (i ? -1 : 1) * G;
323 for (i = 0; i < 2; i++)
324 for (n = 0; n < N; n++)
325 (*Ma)(N * e + (i ? l : k), N * e + n) += vol * (i ? -1 : 1) * da_G(n);
327 for (i = 0; i < 2; i++)
328 for (n = 0; n < N; n++)
329 (*Mt)(N * e + (i ? l : k), N * e + n) += vol * (i ? -1 : 1) * dT_G(n);
331 for (i = 0; i < 2; i++)
332 (*Mp)(N * e + (i ? l : k), e) += vol * (i ? -1 : 1) * dP_G;
334 else for (
auto &s_d : vec_m)
335 for (
auto j = s_d[0]->get_tab1()(N * e + n_lim) - 1; j < s_d[0]->get_tab1()(N * e + n_lim + 1) - 1; j++)
336 for (col = s_d[0]->get_tab2()(j) - 1, x = -s_d[0]->get_coeff()(j), i = 0; i < 2; i++)
337 (*s_d[1])(N * e + (i ? l : k), col) += (i ? -1 : 1) * sgn * x;
342 int c = (a_r(e, k) > a_r(e, l)), n_c = c ? l : k, n_d = c ? k : l, s_c = c ? -1 : 1;
343 double Tc = c ? Tl : Tk, hc = c ? hl : hk, dT_hc = c ? dTl_hl : dTk_hk, dP_hc = c ? dP_hl : dP_hk;
344 for (i = 0; i < 2; i++) secmem(e, i ? l : k)-= vol * (i ? -1 : 1) * (s_c * hi(n_c, n_d) * (Tc - Ts) + G * hc) - (i != c) * qi(e, k, l);
347 for (i = 0; i < 2; i++)
348 for (n = 0; n < N; n++)
349 (*Ma)(N * e + (i ? l : k), N * e + n) += vol * (i ? -1 : 1) * (s_c * da_hi(n_c, n_d, n) * (Tc - Ts) + (n_lim < 0) * da_G(n) * hc) - (i != c) * daqi(e, k, l, n);
351 for (i = 0; i < 2; i++)
352 for (n = 0; n < N; n++)
353 (*Mt)(N * e + (i ? l : k), N * e + n) += vol * (i ? -1 : 1) * (s_c * (dT_hi(n_c, n_d, n) * (Tc - Ts) + (n == n_c) * hi(n_c, n_d)) + (n_lim < 0) * dT_G(n) * hc + G * (n == n_c) * dT_hc) - (i != c) * dTqi(e, k, l, n);
355 for (i = 0; i < 2; i++)
356 (*Mp)(N * e + (i ? l : k), e) += vol * (i ? -1 : 1) * (s_c * (dP_hi(n_c, n_d) * (Tc - Ts) - hi(n_c, n_d) * dP_Ts) + (n_lim < 0) * dP_G * hc + G * dP_hc) - (i != c) * dpqi(e, k, l);
358 for (
auto &s_d : vec_m)
359 for (
auto j = s_d[0]->get_tab1()(N * e + n_lim) - 1; j < s_d[0]->get_tab1()(N * e + n_lim + 1) - 1; j++)
360 for (col = s_d[0]->get_tab2()(j) - 1, x = -s_d[0]->get_coeff()(j), i = 0; i < 2; i++)
361 (*s_d[1])(N * e + (i ? l : k), col) += (i ? -1 : 1) * hc * sgn * x;
367 if (alpha(e, l) > alpha_min)
369 secmem(e, l) += vol * 2./3. * inco(e, l) / (alpha(e, l) * (pch_rho ? (*pch_rho).valeurs()(e, l) : rho(e, l))) * G ;
374 (*Ma)(N * e + l , N * e + l) -= vol * 2./3. * inco(e, l) / (-alpha(e, l)*alpha(e, l) * (pch_rho ? (*pch_rho).valeurs()(e, l) : rho(e, l))) * G;
375 for (n = 0; n < N; n++) (*Ma)(N * e + l , N * e + n) -=
376 vol * 2./3. * inco(e, l) / (alpha(e, l) * (pch_rho ? (*pch_rho).valeurs()(e, l) : rho(e, l))) * da_G(n);
380 if (pch_rho) (*Mt)(N * e + l , N * e + l) -=
381 vol * 2./3. * inco(e, l) / alpha(e, l)*-pch_rho->derivees().at(
"temperature")(e, l)/((*pch_rho).valeurs()(e, l)*(*pch_rho).valeurs()(e, l)) * G;
382 for (n = 0; n < N; n++) (*Mt)(N * e + l , N * e + n) -=
383 vol * 2./3. * inco(e, l) / (alpha(e, l) * (pch_rho ? (*pch_rho).valeurs()(e, l) : rho(e, l))) * dT_G(n);
387 if (pch_rho) (*Mp)(N * e + l , e) -=
388 vol * 2./3. * inco(e, l) / alpha(e, l)*-pch_rho->derivees().at(
"pression")(e, l)/((*pch_rho).valeurs()(e, l)*(*pch_rho).valeurs()(e, l)) * G;
389 for (n = 0; n < N; n++) (*Mp)(N * e + l , N * e + n) -=
390 vol * 2./3. * inco(e, l) / (alpha(e, l) * (pch_rho ? (*pch_rho).valeurs()(e, l) : rho(e, l))) * dP_G;
394 (*Mai)(N * e + l , N * e + l) -= vol * 2./3. / (alpha(e, l)* (pch_rho ? (*pch_rho).valeurs()(e, l) : rho(e, l))) * G;
397 else for (
auto &s_d : vec_m)
398 for (
auto j = s_d[0]->get_tab1()(N * e + n_lim) - 1; j < s_d[0]->get_tab1()(N * e + n_lim + 1) - 1; j++)
399 for (col = s_d[0]->get_tab2()(j) - 1, x = -s_d[0]->get_coeff()(j), i = 0; i < 2; i++)
400 (*s_d[1])(N * e + l , col) -= 2./3. * inco(e, l) / (alpha(e, l) * (pch_rho ? (*pch_rho).valeurs()(e, l) : rho(e, l))) * sgn * x;
407 double hm = 1. / (1. / hi(k, l) + 1. / hi(l, k)), Tk = temp(e, k), Tl = temp(e, l);
408 for (i = 0; i < 2; i++) secmem(e, i ? l : k) -= vol * (i ? -1 : 1) * hm * (Tk - Tl);
410 for (i = 0; i < 2; i++)
412 (*Mt)(N * e + (i ? l : k), N * e + k) += vol * (i ? -1 : 1) * hm;
413 (*Mt)(N * e + (i ? l : k), N * e + l) += vol * (i ? 1 : -1) * hm;