61 const DoubleTab& vit = vitesse_->valeurs(),
63 const IntTab& e_f = domaine.elem_faces(), &f_e = domaine.face_voisins();
67 for (
int e = 0; e < domaine.nb_elem(); e++)
70 const double vol = pe(e) * ve(e);
74 for (
int i = 0; i < e_f.
dimension(1); i++)
79 for (
int n = 0; n < N; n++)
82 double flux_f = pf(f) * fs(f) * std::max((e == f_e(f, 1) ? 1 : -1) * vit(f, n), 0.);
88 for (
int n = 0; n < N; n++)
89 if ((!alp || (*alp)(e, n) > 1e-3) && std::abs(flux(n)) > 1e-12)
90 dt = std::min(dt, vol / flux(n));
100 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces(), &fcl = ch.
fcl(), &equiv = domaine.equiv();
101 const DoubleTab& nf = domaine.face_normales(), &inco = ch.
valeurs(), &xp = domaine.xp(), &xv = domaine.xv();
102 const DoubleVect& fs = domaine.face_surfaces(), &ve = domaine.volumes();
106 if (!matrices.count(nom_inco) || semi_impl.count(nom_inco))
115 Stencil stencil(0, 2);
118 for (
int f = 0; f < domaine.nb_faces_tot(); f++)
121 if (f_e(f, 0) >= 0 && (f_e(f, 1) >= 0 || fcl(f, 0) == 3))
124 for (
int i = 0; i < 2 ; i++)
126 const int e = f_e(f, i);
129 for (
int j = 0; j < 2 ; j++)
131 const int eb = f_e(f, j);
133 if (eb < 0)
continue;
135 for (
int k = 0; k < e_f.dimension(1); k++)
137 const int fb = e_f(e, k);
140 if (fb < domaine.nb_faces())
142 int fc = equiv(f, i, k);
146 for (
int n = 0; n < N; n++)
147 for (
int m = (corr ? 0 : n); m < (corr ? N : n + 1); m++)
151 else if (f_e(f, 1) >= 0)
153 for (
int l = 0; l < e_f.dimension(1); l++)
156 if (fc < 0)
continue;
158 const double critere = fs(fc) * domaine.dot(&xv(fc, 0), &nf(fb, 0), &xp(eb, 0));
159 if (std::abs(critere) > 1e-6 * ve(eb) * fs(fb))
160 for (
int n = 0; n < N; n++)
161 for (
int m = (corr ? 0 : n); m < (corr ? N : n + 1); m++)
173 tableau_trier_retirer_doublons(stencil);
191 const Conds_lim& cls = la_zcl_poly_->les_conditions_limites();
192 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces(), &fcl = ch.
fcl(), &equiv = domaine.equiv();
193 const DoubleTab& vit = ch.
passe(), &nf = domaine.face_normales(), &vfd = domaine.volumes_entrelaces_dir(), &xp = domaine.xp(), &xv = domaine.xv();
194 const DoubleVect& fs = domaine.face_surfaces(), &pe =
porosite_e, &pf =
porosite_f, &ve = domaine.volumes();
200 const DoubleTab& inco = semi_impl.count(nom_inco) ? semi_impl.at(nom_inco) : ch.
valeurs(),
205 Matrice_Morse *mat = matrices.count(nom_inco) && !semi_impl.count(nom_inco) ? matrices.at(nom_inco) :
nullptr;
209 DoubleTrav dfac(2, N, N), masse(N, N);
212 for (
int f = 0; f < domaine.nb_faces_tot(); f++)
214 if (f_e(f, 0) >= 0 && (f_e(f, 1) >= 0 || fcl(f, 0) == 1 || fcl(f, 0) == 3))
218 for (
int i = 0; i < 2; i++)
222 int e = f_e(f, (f_e(f, i) >= 0) ? i : 0);
223 for (
int n = 0; n < N; n++)
224 masse(n, n) = a_r ? (*a_r)(e, n) : 1.;
227 corr->
ajouter(&(*alp)(e, 0), &rho(e, 0), masse);
232 for (
int n = 0; n < N; n++)
233 for (
int m = 0; m < N; m++)
235 const double signe = (vit(f, m) * (i ? -1 : 1) >= 0) ? 1. : (vit(f, m) ? -1. : 0.);
236 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;
241 for (
int i = 0; i < 2 ; i++)
243 const int e = f_e(f, i);
246 for (
int k = 0; k < e_f.dimension(1) ; k++)
248 const int fb = e_f(e, k);
249 if (fb < 0)
continue;
251 if (fb < domaine.nb_faces())
253 int fc = equiv(f, i, k);
255 if (fc >= 0 || f_e(f, 1) < 0)
257 for (
int j = 0; j < 2; j++)
260 int fd = (j == i) ? fb : fc;
263 double mult = (fd < 0 || domaine.dot(&nf(fb, 0), &nf(fd, 0)) > 0) ? 1 : -1;
264 mult *= (fd >= 0) ? pf(fd) / pe(eb) : 1;
266 for (
int n = 0; n < N; n++)
267 for (
int m = 0; m < N; m++)
271 double fac = (i ? -1 : 1) * vfd(fb, e != f_e(fb, 0)) * dfac(j, n, m) / ve(e);
275 secmem(fb, n) -= fac * mult * inco(fd, m);
279 for (
int d = 0; d < D; d++)
280 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);
283 secmem(fb, n) += fac * inco(fb, m);
289 (*mat)(N * fb + n, N * fd + m) += fac * mult;
292 (*mat)(N * fb + n, N * fb + m) -= fac;
301 for (
int j = 0; j < 2; j++)
303 const int eb = f_e(f, j);
304 for (
int l = 0; l < e_f.dimension(1) ; l++)
307 if (fc < 0)
continue;
309 double critere = fs(fc) * domaine.dot(&xv(fc, 0), &nf(fb, 0), &xp(eb, 0));
310 if (std::abs(critere) > 1e-6 * ve(eb) * fs(fb))
312 for (
int n = 0; n < N; n++)
313 for (
int m = 0; m < N; m++)
316 double fac = (i ? -1 : 1) * vfd(fb, e != f_e(fb, 0)) * dfac(j, n, m) * ((eb == f_e(fc, 0)) ? 1 : -1) * critere / (ve(e) * ve(eb) * fs(fb));
317 secmem(fb, n) -= fac * inco(fc, m);
319 (*mat)(N * fb + n, N * fc + m) += fac;
326 for (
int l = 0; l < e_f.dimension(1) ; l++)
329 if (fc < 0)
continue;
331 double critere = fs(fc) * domaine.dot(&xv(fc, 0), &nf(fb, 0), &xp(e, 0));
332 if (std::abs(critere) > 1e-6 * ve(e) * fs(fb))
334 for (
int n = 0; n < N; n++)
335 for (
int m = 0; m < N; m++)
339 double fac = (i ? -1 : 1) * vfd(fb, e != f_e(fb, 0)) * dfac(j, n, m) * ((e == f_e(fc, 0)) ? 1 : -1) * critere / (ve(e) * ve(e) * fs(fb));
340 secmem(fb, n) += fac * inco(fc, m);
342 (*mat)(N * fb + n, N * fc + m) -= fac;
virtual const DoubleVect & face_surfaces() const