59 const DoubleTab& nf = domaine.face_normales(), &vfd = domaine.volumes_entrelaces_dir(),
67 &vf = domaine.volumes_entrelaces(), &ve = domaine.volumes();
76 for (
int e = 0; e < domaine.nb_elem(); e++)
79 double vol = pe(e) * ve(e);
81 for (
int i = 0; i < e_f.
dimension(1); i++)
83 const int f = e_f(e, i);
87 for (
int n = 0; n < N; n++)
89 flux(n) += domaine.nu_dot(&
nu_, e, n, &nf(f, 0), &nf(f, 0)) / vf(f);
91 vol = std::min(vol, pf(f) * vf(f) / vfd(f, e != f_e(f, 0)) * vf(f));
95 for (
int n = 0; n < N; n++)
96 if ((!alp || (*alp)(e, n) > 0.25) && flux(n))
97 dt = std::min(dt, vol * (a_r ? (*a_r)(e, n) : 1) / flux(n));
114 if (!matrices.count(nom_inco) || semi_impl.count(nom_inco))
118 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces(), &fcl = ch.
fcl(), &equiv = domaine.equiv();
119 const DoubleTab& nf = domaine.face_normales();
120 const DoubleVect& fs = domaine.face_surfaces();
126 Stencil stencil(0, 2), tpfa(0, N);
128 domaine.creer_tableau_faces(tpfa);
133 Cerr <<
"Op_Diff_PolyMAC_MPFA_Face::dimensionner() : ";
135 for (
int f = 0; f < domaine.nb_faces(); f++)
137 for (
int i = 0; i < 2; i++)
139 const int e = f_e(f, i);
144 for (
int j = 0; j < e_f.dimension(1); j++)
146 const int fb = e_f(e, j);
147 if (fb < 0)
continue;
154 for (
int j = 0; j < e_f.dimension(1); j++)
156 const int fb = e_f(e, j);
157 if (fb < 0)
continue;
159 const int c = (e != f_e(fb, 0));
162 const int e_s =
phif_e(k);
164 if (e_s >= ne_tot)
continue;
166 const int fc = equiv(fb, c, i_f);
167 const int f_s = (e_s == e) ? f : fc;
169 if (fc >= 0 && fcl(f_s, 0) < 2)
170 for (
int n = 0; n < N; n++)
171 stencil.append_line(N * f + n, N * f_s + n);
174 for (
int d = 0; d < D; d++)
175 if (std::fabs(nf(f, d)) > 1e-6 * fs(f))
176 for (
int n = 0; n < N; n++)
177 stencil.append_line(N * f + n, N * (nf_tot + D * e_s + d) + n);
180 for (
int n = 0; n < N; n++)
181 stencil.append_line(N * f + n, N * f + n);
187 for (
int e = 0; e < ne_tot; e++)
188 for (
int i = 0; i < e_f.dimension(1); i++)
190 const int f = e_f(e, i);
195 const int e_s =
phif_e(j);
197 for (
int d = 0; d < D; d++)
198 for (
int n = 0; n < N; n++)
199 stencil.append_line(N * (nf_tot + D * e + d) + n, N * (nf_tot + D * e_s + d) + n);
205 for (
int f = 0; f < domaine.nb_faces(); f++)
208 const int e_s =
phif_e(i);
209 if (e_s < ne_tot && e_s != f_e(f, 0) && e_s != f_e(f, 1))
210 for (
int n = 0; n < N; n++)
215 tableau_trier_retirer_doublons(stencil);
217 const double face_t =
static_cast<double>(domaine.md_vector_faces()->nb_items_seq_tot()),
218 elem_t =
static_cast<double>(domaine.domaine().md_vector_elements()->nb_items_seq_tot());
219 const double width =
mp_sum_as_double(stencil.dimension(0)) / (N * (face_t + D * elem_t));
220 const double perc = mp_somme_vect_as_double(tpfa) * 100. / (N * face_t);
221 Cerr <<
"width " << width <<
" " << perc <<
"% TPFA " << finl;
246 Matrice_Morse *mat = matrices.count(nom_inco) && !semi_impl.count(nom_inco) ? matrices[nom_inco] :
nullptr;
248 const DoubleTab& inco = semi_impl.count(nom_inco) ? semi_impl.at(nom_inco) : le_champ_inco ? le_champ_inco->valeurs() :
equation().
inconnue().
valeurs();
252 const Conds_lim& cls = la_zcl_poly_->les_conditions_limites();
253 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces(), &fcl = ch.
fcl(), &equiv = domaine.equiv();
254 const DoubleVect& fs = domaine.face_surfaces(), &vf = domaine.volumes_entrelaces(), &ve = domaine.volumes(), &pf =
porosite_f, &pe =
porosite_e;
255 const DoubleTab& nf = domaine.face_normales(), &xp = domaine.xp(), &xv = domaine.xv(), &vfd = domaine.volumes_entrelaces_dir();
257 const int N = inco.
line_size(), D =
dimension, ne_tot = domaine.nb_elem_tot(), nf_tot = domaine.nb_faces_tot();
261 DoubleTrav coeff(N), fac(N);
263 for (
int f = 0; f < domaine.nb_faces(); f++)
267 for (
int i = 0; i < 2; i++ )
274 for (
int j = 0; i_f < 0 && j < e_f.dimension(1); j++)
276 const int fb = e_f(e, j);
277 if (fb < 0)
continue;
284 for (
int j = 0; j < e_f.dimension(1); j++)
287 if (fb < 0)
continue;
293 if (e_s < ne_tot && e_s != f_e(fb, 0) && e_s != f_e(fb, 1))
297 double df_sur_d = tpfa && fcl(fb, 0) && fs(fb) > 0.0 ?
298 std::max(std::fabs(domaine.dot(&xv(fb, 0), &nf(fb, 0), &xv(f, 0)) / domaine.dot(&xv(fb, 0), &nf(fb, 0), &xp(e, 0))), 1.0) : 1.0;
300 int c = (e != f_e(fb, 0));
301 for (
int n = 0; n < N; n++)
302 coeff[n] = vfd(f, i) / ve(e) * fs(fb) * (c ? 1 : -1) / df_sur_d;
306 for (
int n = 0; n < N; n++)
307 fac[n] = coeff[n] *
phif_c(k, n);
310 int fc = equiv(fb, c, i_f);
315 int f_s = e_s - ne_tot;
316 if (fcl(f_s, 0) == 3 && sub_type(
Dirichlet, cls[fcl(f_s, 1)].valeur()))
318 for (
int d = 0; d < D; d++)
319 for (
int n = 0; n < N; n++)
320 secmem(f, n) -= fac[n] * ref_cast(
Dirichlet, cls[fcl(f_s, 1)].valeur()).val_imp(fcl(f_s, 2), N * d + n) * nf(f, d) / fs(f);
323 else if (tpfa && fc >= 0)
326 int f_s = (e_s == e) ? f : fc;
327 int sgn = (domaine.dot(&nf(f_s, 0), &nf(f, 0)) > 0) ? 1 : -1;
328 for (
int n = 0; n < N; n++)
329 secmem(f, n) -= fac[n] * sgn * pf(f_s) / pe(e_s) * inco(f_s, n);
331 if (mat && fcl(f_s, 0) < 2)
332 for (
int n = 0; n < N; n++)
333 (*mat)(N * f + n, N * f_s + n) += fac[n] * sgn * pf(f_s) / pe(e_s);
338 double f_eps = (e_s != e) ? 0 : tpfa && fcl(fb, 0) ? 1 : std::min(eps, 1000 * std::pow(vf(f) / fs(f), 2));
340 for (
int d = 0; d < D; d++)
341 for (
int n = 0; n < N; n++)
342 secmem(f, n) -= fac[n] * (1 - f_eps) * inco(nf_tot + D * e_s + d, n) * nf(f, d) / fs(f);
345 for (
int d = 0; d < D; d++)
346 if (std::fabs(nf(f, d)) > 1e-6 * fs(f))
347 for (
int n = 0; n < N; n++)
348 (*mat)(N * f + n, N * (nf_tot + D * e_s + d) + n) += fac[n] * (1 - f_eps) * nf(f, d) / fs(f);
350 if (!f_eps)
continue;
352 for (
int n = 0; n < N; n++)
353 secmem(f, n) -= fac[n] * f_eps * inco(f, n);
356 for (
int n = 0; n < N; n++)
357 (*mat)(N * f + n, N * f + n) += fac[n] * f_eps;
365 for (
int e = 0; e < ne_tot; e++)
366 for (
int i = 0; i < e_f.dimension(1); i++)
368 const int f = e_f(e, i);
371 const int c = (e != f_e(f, 0));
375 for (
int n = 0; n < N; n++)
376 coeff(n) = fs(f) * (c ? 1 : -1) *
phif_c(j, n);
378 const int e_s =
phif_e(j);
379 const int f_s = e_s - ne_tot;
383 for (
int d = 0; d < D; d++)
384 for (
int n = 0; n < N; n++)
385 secmem(nf_tot + D * e + d, n) -= coeff(n) * inco(nf_tot + D * e_s + d, n);
388 for (
int d = 0; d < D; d++)
389 for (
int n = 0; n < N; n++)
390 (*mat)(N * (nf_tot + D * e + d) + n, N * (nf_tot + D * e_s + d) + n) += coeff(n);
392 else if (fcl(f_s, 0) == 3 && sub_type(
Dirichlet, cls[fcl(f_s, 1)].valeur()))
393 for (
int d = 0; d < D; d++)
394 for (
int n = 0; n < N; n++)
395 secmem(nf_tot + D * e + d, n) -= coeff(n) * ref_cast(
Dirichlet, cls[fcl(f_s, 1)].valeur()).val_imp(fcl(f_s, 2), N * d + n);