47 const DoubleTab& xp = domaine.xp(), &xv = domaine.xv(), &vit = la_vitesse->
valeurs(), &pvit = la_vitesse->passe(),
48 &nu = le_fluide->viscosite_cinematique().valeurs(), &vfd = domaine.volumes_entrelaces_dir(),
49 &mu = le_fluide->viscosite_dynamique().valeurs(), &rho = le_fluide->masse_volumique().passe(),
52 const DoubleVect& pe = le_fluide->porosite_elem(), &pf = le_fluide->porosite_face(), &fs = domaine.face_surfaces(), &ve = domaine.volumes();
56 const Sous_Domaine *pssz =
sous_domaine ? &le_sous_domaine.valeur() :
nullptr;
57 const IntTab& e_f = domaine.elem_faces(), &f_e = domaine.face_voisins(), &fcl = ch.
fcl();
60 int i, j, k, f, d, D =
dimension, cN = nu.dimension(0) == 1, cM = mu.dimension(0) == 1, cR = rho.dimension(0) == 1,
61 C_dh = sub_type(
Champ_Uniforme, diam_hydr.valeur()), m, n, N = vit.line_size(),
65 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;
67 for (n = 0; n < N; n++)
68 mult(n, 0) = 1, mult(n, 1) = 0;
73 const int ne_tot = domaine.nb_elem_tot(), nb_max_sat = N * (N-1) /2;
74 Sigma_tab.
resize(ne_tot, nb_max_sat);
75 for (k = 0; k < N; k++)
76 for (
int l = k + 1; l < N; l++)
80 const int ind_trav = (k*(N-1)-(k-1)*(k)/2) + (l-k-1);
85 for (
int ii = 0; ii < ne_tot; ii++)
86 Sigma_tab(ii, ind_trav) = sig(ii);
91 for (i = 0; i < (pssz ? pssz->
nb_elem_tot() : domaine.nb_elem_tot()); i++)
93 int e = pssz ? (*pssz)[i] : i;
94 for (d = 0; d < D; d++)
100 for (d = 0; d < D; d++)
101 for (n = 0; n < N; n++)
102 v(n, d) = pvit(nf_tot + D * e + d, n);
104 for (v = 0, j = 0; j < e_f.
dimension(1) && (f = e_f(e, j)) >= 0; j++)
105 for (n = 0; n < N; n++)
106 for (d = 0; d < D; d++)
107 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);
110 for (n = 0, Gm = 0; n < N; Gm += G(n), n++)
111 nv(n) = std::max(v_min, sqrt(domaine.dot(&v(n, 0), &v(n, 0)))), G(n) = (alp ? (*alp)(e, n) : 1) * rho(!cR * e, n) * nv(n);
112 for (arm = 0, n = 0; n < N; n++)
113 for (arm += (alp ? (*alp)(e, n) : 1) * rho(!cR * e, n), d = 0; d < D; d++)
114 vm(d) += (alp ? (*alp)(e, n) : 1) * rho(!cR * e, n) * v(n, d);
115 for (d = 0; d < D; d++)
117 nvm = std::max(v_min, sqrt(domaine.dot(&vm(0), &vm(0))));
120 for (n = 0; n < N; n++)
122 double Re = dh_e * std::max(G(n), 1e-10) / mu(!cM * e, n), Re_m = dh_e * Gm / mu(!cM * e, n);
123 for (d = 0; d < D; d++)
126 coeffs_perte_charge(v_ph, pos, t, nv(n), dh_e, nu(!cN * e, n), Re, C_iso, C_dir, v_dir, dir);
127 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);
129 coeffs_perte_charge(vm, pos, t, nvm, dh_e, nu(!cN * e, n), Re_m, C_iso, C_dir, v_dir, dir);
130 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);
131 Fk(n) = Cf(n) * G(n) * G(n) / rho(!cR * e, n) / 2.0 / dh_e;
133 Fm = Cf_t(0) * Gm * Gm / rho(!cR * e, 0) / 2.0 / dh_e;
136 if (fmult) 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);
139 for (j = 0; j < e_f.
dimension(1) && (f = e_f(e, j)) >= 0; j++)
140 if (f < domaine.nb_faces() && (!poly_v2 || fcl(f, 0) < 2))
141 for (n = 0; n < N; n++)
143 double fac = pf(f) * vfd(f, e != f_e(f, 0)) * 0.5 / dh_e, fac_n = fac * mult(n, 0) * Cf(n) * nv(n), fac_m = fac * mult(n, 1) * Cf_t(n) * Gm / rho(!cR * e, n);
144 for (m = 0; m < N; m++)
145 secmem(f, n) -= ((m == n) * fac_n + fac_m) * (alp ? (*alp)(e, m) : 1) * (pbm ? rho(!cR * e, m) : 1) * vit(f, m);
147 for (m = 0; m < N; m++)
148 (*mat)(N * f + n, N * f + m) += ((m == n) * fac_n + fac_m) * (alp ? (*alp)(e, m) : 1) * (pbm ? rho(!cR * e, m) : 1);
152 for (d = 0, k = nf_tot + D * e; d < D; d++, k++)
153 for (n = 0; n < N; n++)
155 double fac = pe(e) * ve(e) * 0.5 / dh_e, fac_n = fac * mult(n, 0) * Cf(n) * nv(n), fac_m = fac * mult(n, 1) * Cf_t(n) * Gm / rho(!cR * e, n);
156 for (m = 0; m < N; m++)
157 secmem(k, n) -= ((m == n) * fac_n + fac_m) * (alp ? (*alp)(e, m) : 1) * (pbm ? rho(!cR * e, m) : 1) * vit(k, m);
159 for (m = 0; m < N; m++)
160 (*mat)(N * k + n, N * k + m) += ((m == n) * fac_n + fac_m) * (alp ? (*alp)(e, m) : 1) * (pbm ? rho(!cR * e, m) : 1);