136 if (!matrices.count(nom_inco) || semi_impl.count(nom_inco))
139 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces(), &fcl = ch.
fcl(), &equiv = domaine.equiv();
140 const DoubleTab& nf = domaine.face_normales();
141 const DoubleVect& fs = domaine.face_surfaces();
149 Stencil stencil(0, 2);
152 for (
int f = 0; f < domaine.nb_faces_tot(); f++)
153 if (f_e(f, 0) >= 0 && (f_e(f, 1) >= 0 || fcl(f, 0) == 3))
156 for (
int i = 0; i < 2; i++)
158 const int e = f_e(f, i);
161 for (
int j = 0; j < 2; j++)
163 const int eb = f_e(f, j);
165 if (eb < 0)
continue;
167 for (
int k = 0; k < e_f.dimension(1); k++)
169 const int fb = e_f(e, k);
170 if (fb < 0)
continue;
172 if (fb < domaine.nb_faces() && fcl(fb, 0) < 2)
174 int fc = equiv(f, i, k);
178 for (
int n = 0; n < N; n++)
179 for (
int m = (corr ? 0 : n); m < (corr ? N : n + 1); m++)
182 else if (f_e(f, 1) >= 0)
185 for (
int d = 0; d < D; d++)
186 if (std::fabs(nf(fb, d)) > 1e-6 * fs(fb))
187 for (
int n = 0; n < N; n++)
188 for (
int m = (corr ? 0 : n); m < (corr ? N : n + 1); m++)
189 stencil.
append_line(N * fb + n, N * (nf_tot + D * eb + d) + m);
195 for (
int d = 0; d < D; d++)
196 for (
int n = 0; n < N; n++)
197 for (
int m = (corr ? 0 : n); m < (corr ? N : n + 1); m++)
198 stencil.
append_line(N * (nf_tot + D * e + d) + n, N * (nf_tot + D * eb + d) + m);
204 tableau_trier_retirer_doublons(stencil);
233 const Conds_lim& cls = la_zcl_poly_->les_conditions_limites();
234 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces(), &fcl = ch.
fcl(), &equiv = domaine.equiv();
235 const DoubleTab& vit = vitesse_->valeurs(), &nf = domaine.face_normales(), &vfd = domaine.volumes_entrelaces_dir();
236 const DoubleVect& fs = domaine.face_surfaces(), &pe =
porosite_e, &pf =
porosite_f, &ve = domaine.volumes();
240 const DoubleTab& inco = semi_impl.count(nom_inco) ? semi_impl.at(nom_inco) : ch.
valeurs();
241 Matrice_Morse *mat = matrices.count(nom_inco) && !semi_impl.count(nom_inco) ? matrices.at(nom_inco) :
nullptr;
245 DoubleTrav dfac(2, N, N), masse(N, N);
247 for (
int f = 0; f < domaine.nb_faces_tot(); f++)
249 if (f_e(f, 0) >= 0 && (f_e(f, 1) >= 0 || fcl(f, 0) == 1 || fcl(f, 0) == 3))
253 for (
int i = 0; i < 2; i++)
256 masse(0, 0) = std::fabs(vit[f]) > 1e-10 ? inco(f) / vit[f] : 1.0;
259 const int eb = f_e(f, i);
260 for (
int n = 0; n < N; n++)
261 for (
int m = 0; m < N; m++)
263 const double signe = (vit(f, m) * (i ? -1 : 1) >= 0) ? 1. : (vit(f, m) ? -1. : 0.);
264 dfac((fcl(f, 0) == 1) ? 0 : i, n, m) += fs(f) * inco[f] * pe(eb >= 0 ? eb : f_e(f, 0)) * (1. + signe *
alpha_) / 2;
269 for (
int i = 0; i < 2; i++)
271 const int e = f_e(f, i);
275 for (
int k = 0; k < e_f.dimension(1); k++)
277 const int fb = e_f(e, k);
278 if (fb < 0)
continue;
280 if (fb < domaine.nb_faces() && fcl(fb, 0) < 2)
283 int fc = equiv(f, i, k);
284 if (fc >= 0 || f_e(f, 1) < 0)
286 for (
int j = 0; j < 2; j++)
289 const int fd = (j == i) ? fb : fc;
291 double mult = (fd < 0 || domaine.dot(&nf(fb, 0), &nf(fd, 0)) > 0) ? 1 : -1;
292 mult *= (fd >= 0) ? pf(fd) / pe(eb) : 1;
294 for (
int n = 0; n < N; n++)
295 for (
int m = 0; m < N; m++)
298 const double fac = (i ? -1 : 1) * vfd(fb, e != f_e(fb, 0)) * dfac(j, n, m) / ve(e);
302 secmem(fb, n) -= fac * mult * vit[fd];
305 for (
int d = 0; d < D; d++)
306 secmem(fb, n) -= fac * nf(fb, d) / fs(fb) * ref_cast(
Dirichlet, cls[fcl(f, 1)].valeur()).val_imp(fcl(f, 2), N * d + m) / masse(0, 0);
309 secmem(fb, n) += fac * vit[fb];
314 if (fd >= 0 && fcl(fd, 0) < 2)
315 (*mat)(N * fb + n, N * fd + m) += fac * mult;
317 (*mat)(N * fb + n, N * fb + m) -= fac;
325 for (
int j = 0; j < 2; j++)
327 const int eb = f_e(f, j);
328 for (
int d = 0; d < D; d++)
329 if (std::fabs(nf(fb, d)) > 1e-6 * fs(fb))
330 for (
int n = 0; n < N; n++)
331 for (
int m = 0; m < N; m++)
334 const double fac = (i ? -1 : 1) * vfd(fb, e != f_e(fb, 0)) * dfac(j, n, m) / ve(e) * nf(fb, d) / fs(fb);
337 secmem(fb, n) -= fac * vit[nf_tot + D * eb + d];
339 secmem(fb, n) += fac * vit[nf_tot + D * e + d];
344 (*mat)(N * fb + n, N * (nf_tot + D * eb + d) + m) += fac;
346 (*mat)(N * fb + n, N * (nf_tot + D * e + d) + m) -= fac;
355 for (
int j = 0; j < 2; j++)
357 const int eb = f_e(f, j);
358 for (
int d = 0; d < D; d++)
359 for (
int n = 0; n < N; n++)
360 for (
int m = 0; m < N; m++)
363 const double fac = (i ? -1 : 1) * dfac(j, n, m);
366 secmem(nf_tot + D * e + d, n) -= fac * (eb >= 0 ? vit[nf_tot + D * eb + d] : ref_cast(
Dirichlet, cls[fcl(f, 1)].valeur()).val_imp(fcl(f, 2), N * d + m));
368 secmem(nf_tot + D * e + d, n) += fac * vit[nf_tot + D * e + d];
373 (*mat)(N * (nf_tot + D * e + d) + n, N * (nf_tot + D * eb + d) + m) += fac;
375 (*mat)(N * (nf_tot + D * e + d) + n, N * (nf_tot + D * e + d) + m) -= fac;
387 const Conds_lim& cls = la_zcl_poly_->les_conditions_limites();
388 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces(), &fcl = ch.
fcl(), &equiv = domaine.equiv();
389 const DoubleTab& vit = ch.
passe(), &nf = domaine.face_normales(), &vfd = domaine.volumes_entrelaces_dir();
390 const DoubleVect& fs = domaine.face_surfaces(), &pe =
porosite_e, &pf =
porosite_f, &ve = domaine.volumes();
396 const DoubleTab& inco = semi_impl.count(nom_inco) ? semi_impl.at(nom_inco) : ch.
valeurs(),
399 Matrice_Morse *mat = matrices.count(nom_inco) && !semi_impl.count(nom_inco) ? matrices.at(nom_inco) :
nullptr;
403 DoubleTrav dfac(2, N, N), masse(N, N);
405 for (
int f = 0; f < domaine.nb_faces_tot(); f++)
407 if (f_e(f, 0) >= 0 && (f_e(f, 1) >= 0 || fcl(f, 0) == 1 || fcl(f, 0) == 3))
411 for (
int i = 0; i < 2; i++)
413 const int e = f_e(f, (f_e(f, i) >= 0) ? i : 0);
417 for (
int n = 0; n < N; n++)
418 masse(n, n) = a_r ? (*a_r)(e, n) : 1;
421 corr->
ajouter(&(*alp)(e, 0), &rho(e, 0), masse);
424 const int eb = f_e(f, i);
425 for (
int n = 0; n < N; n++)
426 for (
int m = 0; m < N; m++)
428 const double signe = (vit(f, m) * (i ? -1 : 1) >= 0) ? 1. : (vit(f, m) ? -1. : 0.);
429 dfac((fcl(f, 0) == 1) ? 0 : i, n, m) += fs(f) * vit(f, m) * pe(eb >= 0 ? eb : f_e(f, 0)) * masse(n, m) * (1. + signe *
alpha_) / 2;
434 for (
int i = 0; i < 2 ; i++)
436 const int e = f_e(f, i);
440 for (
int k = 0; k < e_f.dimension(1); k++)
442 const int fb = e_f(e, k);
443 if (fb < 0)
continue;
445 if (fb < domaine.nb_faces() && fcl(fb, 0) < 2)
448 int fc = equiv(f, i, k);
449 if (fc >= 0 || f_e(f, 1) < 0)
451 for (
int j = 0; j < 2; j++)
454 const int fd = (j == i) ? fb : fc;
456 double mult = (fd < 0 || domaine.dot(&nf(fb, 0), &nf(fd, 0)) > 0) ? 1 : -1;
457 mult *= (fd >= 0) ? pf(fd) / pe(eb) : 1;
459 for (
int n = 0; n < N; n++)
460 for (
int m = 0; m < N; m++)
463 const double fac = (i ? -1 : 1) * vfd(fb, e != f_e(fb, 0)) * dfac(j, n, m) / ve(e);
467 secmem(fb, n) -= fac * mult * inco(fd, m);
470 for (
int d = 0; d < D; d++)
471 secmem(fb, n) -= fac * nf(fb, d) / fs(fb) * ref_cast(
Dirichlet, cls[fcl(f, 1)].valeur()).val_imp(fcl(f, 2), N * d + m);
474 secmem(fb, n) += fac * inco(fb, m);
479 if (fd >= 0 && fcl(fd, 0) < 2)
480 (*mat)(N * fb + n, N * fd + m) += fac * mult;
482 (*mat)(N * fb + n, N * fb + m) -= fac;
490 for (
int j = 0; j < 2; j++)
492 const int eb = f_e(f, j);
493 for (
int d = 0; d < D; d++)
494 if (std::fabs(nf(fb, d)) > 1e-6 * fs(fb))
495 for (
int n = 0; n < N; n++)
496 for (
int m = 0; m < N; m++)
499 const double fac = (i ? -1 : 1) * vfd(fb, e != f_e(fb, 0)) * dfac(j, n, m) / ve(e) * nf(fb, d) / fs(fb);
502 secmem(fb, n) -= fac * inco(nf_tot + D * eb + d, m);
504 secmem(fb, n) += fac * inco(nf_tot + D * e + d, m);
509 (*mat)(N * fb + n, N * (nf_tot + D * eb + d) + m) += fac;
511 (*mat)(N * fb + n, N * (nf_tot + D * e + d) + m) -= fac;
520 for (
int j = 0; j < 2; j++)
522 const int eb = f_e(f, j);
523 for (
int d = 0; d < D; d++)
524 for (
int n = 0; n < N; n++)
525 for (
int m = 0; m < N; m++)
528 const double fac = (i ? -1 : 1) * dfac(j, n, m);
531 secmem(nf_tot + D * e + d, n) -= fac * (eb >= 0 ? inco(nf_tot + D * eb + d, m) : ref_cast(
Dirichlet, cls[fcl(f, 1)].valeur()).val_imp(fcl(f, 2), N * d + m));
533 secmem(nf_tot + D * e + d, n) += fac * inco(nf_tot + D * e + d, m);
538 (*mat)(N * (nf_tot + D * e + d) + n, N * (nf_tot + D * eb + d) + m) += fac;
540 (*mat)(N * (nf_tot + D * e + d) + n, N * (nf_tot + D * e + d) + m) -= fac;