45 const DoubleTab& xp = domaine.xp(),&xv = domaine.xv(),
47 &pvit = la_vitesse->passe(),
48 &nu = le_fluide->viscosite_cinematique().valeurs(),
49 &vfd = domaine.volumes_entrelaces_dir(),
50 &mu = le_fluide->viscosite_dynamique().valeurs(),
51 &rho = le_fluide->masse_volumique().passe(),
54 const DoubleVect& pe = le_fluide->porosite_elem(),& pf = le_fluide->porosite_face(),
55 &fs = domaine.face_surfaces(), &ve = domaine.volumes();
60 const Sous_Domaine *pssz =
sous_domaine ? &le_sous_domaine.valeur() :
nullptr;
62 const IntTab& e_f = domaine.elem_faces(), &f_e = domaine.face_voisins(), &fcl = ch.
fcl();
66 const int D =
dimension, cN = nu.dimension(0) == 1, cM = mu.dimension(0) == 1,
67 cR = rho.dimension(0) == 1, C_dh = sub_type(
Champ_Uniforme, diam_hydr.valeur()),
71 DoubleTrav pos(D), v(N, D), vm(D), v_ph(D), dir(D), nv(N), Cf(N), Cf_t(N), Fk(N), G(N), mult(N, 2), Sigma_tab;
73 for (
int n = 0; n < N; n++)
74 mult(n, 0) = 1, mult(n, 1) = 0;
80 const int ne_tot = domaine.nb_elem_tot(), nb_max_sat = N * (N-1) /2;
81 Sigma_tab.
resize(ne_tot, nb_max_sat);
82 for (
int k = 0; k < N; k++)
83 for (
int l = k + 1; l < N; l++)
87 const int ind_trav = (k*(N-1)-(k-1)*(k)/2) + (l-k-1);
92 for (
int ii = 0; ii < ne_tot; ii++)
93 Sigma_tab(ii, ind_trav) = sig(ii);
98 for (
int i = 0; i < (pssz ? pssz->
nb_elem_tot() : domaine.nb_elem_tot()); i++)
100 int e = pssz ? (*pssz)[i] : i;
101 for (
int d = 0; d < D; d++)
108 for (
int j = 0; j < e_f.
dimension(1); j++)
110 const int f = e_f(e, j);
111 for (
int d = 0; d < D; d++)
112 for (
int n = 0; n < N; n++)
113 v(n, d) += fs(f) * pf(f) / (ve(e) * pe(e)) * (xv(f, d) - xp(e, d)) * (e == f_e(f, 0) ? 1 : -1) * pvit(f, n);
119 for (
int n = 0; n < N; Gm += G(n), n++)
121 nv(n) = std::max(v_min, sqrt(domaine.dot(&v(n, 0), &v(n, 0))));
122 G(n) = (alp ? (*alp)(e, n) : 1) * rho(!cR * e, n) * nv(n);
126 for (
int n = 0; n < N; n++)
128 arm += (alp ? (*alp)(e, n) : 1) * rho(!cR * e, n);
130 for (
int d = 0; d < D; d++)
131 vm(d) += (alp ? (*alp)(e, n) : 1) * rho(!cR * e, n) * v(n, d);
134 for (
int d = 0; d < D; d++)
137 double nvm = std::max(v_min, sqrt(domaine.dot(&vm(0), &vm(0))));
138 double C_iso, C_dir, v_dir;
141 for (
int n = 0; n < N; n++)
143 double Re = dh_e * std::max(G(n), 1e-10) / mu(!cM * e, n),
144 Re_m = dh_e * Gm / mu(!cM * e, n);
146 for (
int d = 0; d < D; d++)
150 coeffs_perte_charge(v_ph, pos, t, nv(n), dh_e, nu(!cN * e, n), Re, C_iso, C_dir, v_dir, dir);
152 Cf(n) = (C_iso + (C_dir - C_iso) * (nv(n) > 1e-8 ? std::pow(domaine.dot(&v(n, 0), &dir(0)), 2) / (nv(n) * nv(n)) : 0)) * 2 * dh_e / std::max(nv(n), 1e-10);
155 coeffs_perte_charge(vm, pos, t, nvm, dh_e, nu(!cN * e, n), Re_m, C_iso, C_dir, v_dir, dir);
157 Cf_t(n) = (C_iso + (C_dir - C_iso) * (nvm > 1e-8 ? std::pow(domaine.dot(&vm(0), &dir(0)), 2) / (nvm * nvm) : 0)) * 2 * dh_e / std::max(nvm, 1e-10);
159 Fk(n) = Cf(n) * G(n) * G(n) / rho(!cR * e, n) / 2.0 / dh_e;
161 double Fm = Cf_t(0) * Gm * Gm / rho(!cR * e, 0) / 2.0 / dh_e;
165 fmult->
coefficient(&(*alp)(e, 0), &rho(!cR * e, 0), &nv(0), &Cf_t(0), &mu(!cM * e, 0), dh_e, Sigma_tab(e,0), &Fk(0), Fm, mult);
168 for (
int j = 0; j < e_f.
dimension(1); j++)
170 const int f = e_f(e, j);
172 if (f < domaine.nb_faces() && (fcl(f, 0) < 2))
173 for (
int n = 0; n < N; n++)
176 if (e1 < 0) e1 = f_e(f, 1);
178 double fac = pf(f) * vfd(f, e != e1) * 0.5 / dh_e;
179 double fac_n = fac * mult(n, 0) * Cf(n) * nv(n);
180 double fac_m = fac * mult(n, 1) * Cf_t(n) * Gm / rho(!cR * e, n);
182 for (
int m = 0; m < N; m++)
183 secmem(f, n) -= ((m == n) * fac_n + fac_m) * (alp ? (*alp)(e, m) : 1) * (pbm ? rho(!cR * e, m) : 1) * vit(f, m);
186 for (
int m = 0; m < N; m++)
187 (*mat)(N * f + n, N * f + m) += ((m == n) * fac_n + fac_m) * (alp ? (*alp)(e, m) : 1) * (pbm ? rho(!cR * e, m) : 1);