129 const IntTab& e_f = domaine.elem_faces(), &f_e = domaine.face_voisins(), &equiv = domaine.equiv();
130 int i, j, k, l, e, eb, f, fb, fd, fc;
134 Stencil stencil(0, 2);
136 for (f = 0; f < domaine.nb_faces_tot(); f++)
137 if (f_e(f, 0) >= 0 && (f_e(f, 1) >= 0 || ch.
fcl()(f, 0) == 1 || ch.
fcl()(f, 0) == 3))
139 for (i = 0; i < 2; i++)
140 if ((e = f_e(f, i)) >= 0)
142 for (k = 0; k < e_f.
dimension(1) && (fb = e_f(e, k)) >= 0; k++)
143 if (fb < domaine.nb_faces() && ch.
fcl()(fb, 0) < 2)
145 if ((fc = equiv(f, i, k)) >= 0 || f_e(f, 1) < 0)
146 for (j = 0; j < 2; j++)
148 fd = (j == i ? fb : fc);
151 else for (j = 0; j < 2; j++)
153 for (eb = f_e(f, j), l = 0; l < e_f.
dimension(1) && (fc = e_f(eb, l)) >= 0; l++)
161 tableau_trier_retirer_doublons(stencil);
164 int taille = domaine.nb_faces_tot() + (
dimension < 3 ? domaine.domaine().nb_som_tot() : domaine.domaine().nb_aretes_tot());
178 const Conds_lim& cls = la_zcl_poly_->les_conditions_limites();
180 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces(), &equiv = domaine.equiv();
181 const DoubleTab& xp = domaine.xp(), &xv = domaine.xv(), &vfd = domaine.volumes_entrelaces_dir(), &vit = vitesse_->valeurs();
182 const DoubleVect& fs = domaine.face_surfaces(), &ve = domaine.volumes(), &pf =
porosite_f, &pe =
porosite_e;
183 const DoubleTab& nf = domaine.face_normales();
185 int i, j, k, l, e, eb, f, fb, fc, fd, m, n, N = inco.
line_size(), d, D =
dimension, comp = !
incompressible_;
189 DoubleTrav dfac(2, N, N);
191 const int nb_faces_tot = domaine.nb_faces_tot();
192 const int nb_faces = domaine.nb_faces();
193 int nb_face_elem = e_f.dimension(1);
194 for (f = 0; f < nb_faces_tot; f++)
196 const int elem0 = f_e(f, 0);
197 const int elem1 = f_e(f, 1);
198 if (elem0 >= 0 && (elem1 >= 0 || ch.
fcl()(f, 0) == 1 || ch.
fcl()(f, 0) == 3))
201 const double inv_masse = 1.0 / (std::fabs(vit[f]) > 1e-10 ? inco(f) / vit[f] : 1.0);
202 for (i = 0, dfac = 0; i < 2; i++)
205 for (eb = f_e(f, i), n = 0; n < N; n++)
207 for (m = 0; m < N; m++)
208 dfac(ch.
fcl()(f, 0) == 1 ? 0 : i, n, m) += fs(f) * inco[f] * pe(eb >= 0 ? eb : elem0)
209 * (1. + (vit[f] * (i ? -1 : 1) >= 0 ? 1. : vit[f] ? -1.
214 for (n = 0; n < N; n++)
215 for (m = 0; m < N; m++)
216 sum_dfac[i] += dfac(i, n, m);
218 for (i = 0; i < 2; i++)
219 if ((e = f_e(f, i)) >= 0)
221 double inv_ve = 1.0 / ve(e);
222 for (k = 0; k < nb_face_elem && (fb = e_f(e, k)) >= 0; k++)
223 if (fb < nb_faces && ch.
fcl()(fb, 0) < 2)
225 if ((fc = equiv(f, i, k)) >= 0 || elem1 < 0)
226 for (j = 0; j < 2; j++)
228 eb = f_e(f, j), fd = (j == i ? fb : fc);
229 mult = (fd < 0 || domaine.dot(&nf(fb, 0), &nf(fd, 0)) > 0 ? 1 : -1) *
230 (fd >= 0 ? pf(fd) / pe(eb) : 1);
231 for (n = 0; n < N; n++)
232 for (m = 0; m < N; m++)
235 double fac = (e == elem0 ? 1 : -1) * vfd(fb, e != f_e(fb, 0)) *
236 dfac(j, n, m) * inv_ve;
238 secmem[fb] -= fac * mult * vit[fd];
243 for (d = 0; d < D; d++)
244 secmem[fb] -= fac * nf(fb, d) / fs(fb) *
246 ch.
fcl()(f, 2), N * d + m) * inv_masse;
248 if (comp) secmem[fb] += fac * vit[fb];
253 for (j = 0; j < 2; j++)
255 for (eb = f_e(f, j), l = 0; l < nb_face_elem && (fc = e_f(eb, l)) >= 0; l++)
258 (e == f_e(fb, 0) ? 1 : -1) * (e == elem0 ? 1 : -1) * fs(fc) * fs(fb) *
259 domaine.dot(&xv(fc, 0), &xv(fb, 0), &xp(eb, 0), &xp(e, 0)) *
260 (eb == f_e(fc, 0) ? 1 : -1);
261 double den = ve(eb) * ve(e);
262 if (std::fabs(num) > 1e-9 * den)
264 double num_den = num / den;
265 secmem[fb] -= sum_dfac[j] * num_den * vit[fc];
269 for (l = 0; l < nb_face_elem && (fc = e_f(e, l)) >= 0; l++)
271 double num = (e == f_e(fb, 0) ? 1 : -1) * (e == elem0 ? 1 : -1) * fs(fc) *
273 domaine.dot(&xv(fc, 0), &xv(fb, 0), &xp(e, 0), &xp(e, 0)) *
274 (e == f_e(fc, 0) ? 1 : -1);
275 double den = ve(e) * ve(e);
276 if (std::fabs(num) > 1e-9 * den)
278 double num_den = num / den;
279 secmem[fb] += sum_dfac[j] * num_den * vit[fc];
305 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces(), &equiv = domaine.equiv();
306 const DoubleTab& xp = domaine.xp(), &xv = domaine.xv(), &vfd = domaine.volumes_entrelaces_dir(), &vit = vitesse_->valeurs();
307 const DoubleVect& fs = domaine.face_surfaces(), &ve = domaine.volumes(), &pf =
porosite_f, &pe =
porosite_e;
308 const DoubleTab& nf = domaine.face_normales();
310 int i, j, k, l, e, eb, f, fb, fc, fd, m, n, N = inco.
line_size(), comp = !
incompressible_;
314 DoubleTrav dfac(2, N, N), masse(N, N);
315 for (f = 0; f < domaine.nb_faces_tot(); f++)
316 if (f_e(f, 0) >= 0 && (f_e(f, 1) >= 0 || ch.
fcl()(f, 0) == 1 || ch.
fcl()(f, 0) == 3))
318 for (i = 0, dfac = 0; i < 2; i++)
321 masse(0, 0) = std::fabs(vit[f]) > 1e-10 ? inco(f) / vit[f] : 1.0;
323 for (eb = f_e(f, i), n = 0; n < N; n++)
324 for (m = 0; m < N; m++)
325 dfac( ch.
fcl()(f, 0) == 1 ? 0 : i, n, m) += fs(f) * inco[f] * pe(eb >= 0 ? eb : f_e(f, 0))
326 * (1. + (vit[f] * (i ? -1 : 1) >= 0 ? 1. : vit[f] ? -1. : 0.) *
alpha_) / 2;
328 for (i = 0; i < 2; i++)
329 if ((e = f_e(f, i)) >= 0)
331 for (k = 0; k < e_f.dimension(1) && (fb = e_f(e, k)) >= 0; k++)
332 if (fb < domaine.nb_faces() && ch.
fcl()(fb, 0) < 2)
334 if ((fc = equiv(f, i, k)) >= 0 || f_e(f, 1) < 0)
335 for (j = 0; j < 2; j++)
337 eb = f_e(f, j), fd = (j == i ? fb : fc);
338 mult = (fd < 0 || domaine.dot(&nf(fb, 0), &nf(fd, 0)) > 0 ? 1 : -1) * (fd >= 0 ? pf(fd) / pe(eb) : 1);
339 for (n = 0; n < N; n++)
340 for (m = 0; m < N; m++)
343 double fac = (e == f_e(f, 0) ? 1 : -1) * vfd(fb, e != f_e(fb, 0)) * dfac(j, n, m) / ve(e);
344 if (fd >= 0) matrice(fb,fd) += fac * mult;
345 if (comp) matrice(fb,fb) -= fac;
348 else for (j = 0; j < 2; j++)
350 for (eb = f_e(f, j), l = 0; l < e_f.
dimension(1) && (fc = e_f(eb, l)) >= 0; l++)
352 double num = (e == f_e(fb, 0) ? 1 : -1) * (e == f_e(f, 0) ? 1 : -1) * fs(fc) * fs(fb) * domaine.dot(&xv(fc, 0), &xv(fb, 0), &xp(eb, 0), &xp(e, 0)) * (eb == f_e(fc, 0) ? 1 : -1);
353 double den = ve(eb) * ve(e);
354 if (std::fabs(num) > 1e-9 * den)
356 double num_den = num/den;
357 for (n = 0; n < N; n++)
358 for (m = 0; m < N; m++)
361 double fac = dfac(j, n, m) * num_den;
362 matrice(fb,fc) += fac;
367 for (l = 0; l < e_f.dimension(1) && (fc = e_f(e, l)) >= 0; l++)
369 double num = (e == f_e(fb, 0) ? 1 : -1) * (e == f_e(f, 0) ? 1 : -1) * fs(fc) * fs(fb) * domaine.dot(&xv(fc, 0), &xv(fb, 0), &xp(e, 0), &xp(e, 0)) * (e == f_e(fc, 0) ? 1 : -1);
370 double den = ve(e) * ve(e);
371 if (std::fabs(num) > 1e-9 * den)
373 double num_den = num/den;
374 for (n = 0; n < N; n++)
375 for (m = 0; m < N; m++)
378 double fac = dfac(j, n, m) * num_den;
379 matrice(fb,fc) -= fac;
virtual const DoubleVect & face_surfaces() const