82 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces(), &fcl = ch.
fcl();
83 const DoubleTab& nf = domaine.face_normales(), &xp = domaine.xp(), &xv = domaine.xv();
84 const DoubleVect& fs = domaine.face_surfaces(), &ve = domaine.volumes();
86 M = (le_champ_inco ? le_champ_inco->valeurs() : ref_cast(
Navier_Stokes_std,
equation()).pression().valeurs()).line_size();
90 Stencil sten_p(0, 2), sten_v(0, 2);
94 *mat_v = !semi_impl.count(nom_inc) && matrices.count(nom_inc) ? matrices.at(nom_inc) :
nullptr,
97 std::map<int, std::set<int>> dpb_v, dgp_pb;
100 for (
int f = 0; f < domaine.nb_faces_tot(); f++)
103 const int e = f_e(f, 0);
105 for (
int n = 0; n < N; n++, m += (M > 1))
107 int i = nf_tot + D * e;
108 for (
int d = 0; d < D; d++, i++)
109 if (std::fabs(nf(f, d)) > 1e-6 * fs(f))
111 dpb_v[M * f + m].insert(N * i + n);
113 for (
auto j = mat_v->get_tab1()(N * i + n) - 1; j < mat_v->get_tab1()(N * i + n + 1) - 1; j++)
114 dpb_v[M * f + m].insert(mat_v->get_tab2()(j) - 1);
120 std::vector<std::set<int>> dfgpf(N);
121 for (
int f = 0; f < domaine.nb_faces_tot(); f++)
128 for (
int n = 0; n < N; n++, m += (M > 1))
130 if (f < domaine.nb_faces() && e < ne_tot)
131 sten_p.append_line(N * f + n, M * e + m);
133 if (e >= ne_tot && dpb_v.count(M * (e - ne_tot) + m))
134 dfgpf[n].insert(M * (e - ne_tot) + m);
139 if (fcl(f, 0) < 2 && f < domaine.nb_faces())
142 for (
int n = 0; n < N; n++, m += (M > 1))
143 for (
auto &c : dfgpf[n])
144 dgp_pb[N * f + n].insert(M * c + m);
148 for (
int i = 0; i < 2; i++)
150 const int e = f_e(f, i);
153 if (e < domaine.nb_elem())
154 for (
int d = 0; d < D; d++)
155 if (fs(f) * std::fabs(xv(f, d) - xp(e, d)) > 1e-6 * ve(e))
158 for (
int n = 0; n < N; n++, m += (M > 1))
159 for (
auto &c : dfgpf[n])
160 dgp_pb[N * (nf_tot + D * e + d) + n].insert(M * c + m);
164 for (
int n = 0; n < N; n++)
169 for (
int e = 0; e < domaine.nb_elem(); e++)
170 for (
int i = 0; i < e_f.dimension(1); i++)
172 const int f = e_f(e, i);
179 for (
int d = 0; d < D; d++)
180 if (std::fabs(fs(f) * (xv(f, d) - xp(e, d))) > 1e-6 * ve(e))
183 for (
int n = 0; n < N; n++, m += (M > 1))
184 sten_p.append_line(N * (nf_tot + D * e + d) + n, M * eb + m);
190 for (
auto &i_sc : dgp_pb)
191 for (
auto &c : i_sc.second)
192 for (
auto &k : dpb_v.at(c))
196 tableau_trier_retirer_doublons(sten_p);
197 tableau_trier_retirer_doublons(sten_v);
213 if (mat_v->nb_colonnes())
224 const Conds_lim& cls = ref_dcl->les_conditions_limites();
225 const IntTab& f_e = domaine.face_voisins(), &fcl = ch.
fcl();
226 const DoubleTab& nf = domaine.face_normales(), &xp = domaine.xp(), &xv = domaine.xv(), &vfd = domaine.volumes_entrelaces_dir(),
227 &press = semi_impl.count(
"pression") ? semi_impl.at(
"pression") : (le_champ_inco ? le_champ_inco->valeurs() : ref_cast(
Navier_Stokes_std,
equation()).pression().valeurs()),
232 const int ne_tot = domaine.nb_elem_tot(), nf_tot = domaine.nb_faces_tot(), D =
dimension, N = secmem.
line_size(), M = press.line_size();
237 Matrice_Morse *mat_p = !semi_impl.count(
"pression") && matrices.count(
"pression") ? matrices.at(
"pression") :
nullptr, *mat_v =
238 !semi_impl.count(nom_inc) && matrices.count(nom_inc) ? matrices.at(nom_inc) :
nullptr;
240 DoubleTrav gb(nf_tot, M), gf(N), a_v(N);
246 for (
int f = 0; f < domaine.nb_faces_tot(); f++)
247 if (fs(f) > 0 && fcl(f, 0) > 1)
249 const int e = f_e(f, 0);
251 for (
int n = 0; n < N; n++, m += (M > 1))
253 double fac = 1. / (fs(f) * ve(e));
254 std::map<int, double> *dv = mat_v ? &
dgb_v_[M * f + m] :
nullptr;
255 int i = nf_tot + D * e;
256 for (
int d = 0; d < D; d++, i++)
257 if (std::fabs(nf(f, d)) > 1e-6 * fs(f))
259 gb(f, m) += fac * nf(f, d) * secmem(i, n);
262 for (
auto j = mat_v->get_tab1()(N * i + n) - 1; j < mat_v->get_tab1()(N * i + n + 1) - 1; j++)
263 if (mat_v->get_coeff()(j))
264 (*dv)[mat_v->get_tab2()(j) - 1] -= fac * nf(f, d) * mat_v->get_coeff()(j);
269 for (
int f = 0; f < domaine.nb_faces(); f++)
281 for (
int f = 0; f < domaine.nb_faces_tot(); f++)
283 for (
int n = 0; n < N; n++)
288 for (
int i = 0; i < 2; i++)
290 const int e = f_e(f, i);
293 for (
int n = 0; n < N; n++)
294 a_v(n) += vfd(f, i) * (alp ? (*alp)(e, n) : 1);
302 const int fb = e - ne_tot;
305 for (
int n = 0; n < N; n++, m += (M > 1))
307 const double fac =
fgrad_c(i, m);
308 const double val = (e < ne_tot ? press(e, m) : fcl(fb, 0) == 1 ? ref_cast(
Neumann, cls[fcl(fb, 1)].valeur()).flux_impose(fcl(fb, 2), m) : gb(e - ne_tot, m));
312 if (mat_p && e < ne_tot)
313 dgf_pe_[n].push_back({e, fac});
315 if (mat_v && fb >= 0 &&
dgb_v_.count(M * fb + m))
316 dgf_gb_[n].push_back({M * fb + m, fac});
321 if (fcl(f, 0) < 2 && f < domaine.nb_faces())
324 for (
int n = 0; n < N; n++, m += (M > 1))
326 const double fac = a_v(n) * pf(f);
327 secmem(f, n) -= fac * gf(n);
330 (*mat_p)(N * f + n, M * i_c.first + m) += fac * i_c.second;
333 dgp_gb_[N * f + n][M * i_c.first + m] += fac * i_c.second;
338 for (
int i = 0; i < 2; i++)
340 const int e = f_e(f, i);
343 if (e < domaine.nb_elem())
344 for (
int d = 0; d < D; d++)
345 if (fs(f) * std::fabs(xv(f, d) - xp(e, d)) > 1e-6 * ve(e))
348 for (
int n = 0; n < N; n++, m += (M > 1))
350 const double fac = (i ? -1 : 1) * fs(f) * pe(e) * (xv(f, d) - xp(e, d)) * (alp ? (*alp)(e, n) : 1);
352 secmem(nf_tot + D * e + d, n) -= fac * gf(n);
355 (*mat_p)(N * (nf_tot + D * e + d) + n, M * i_c.first + m) += fac * i_c.second;
358 dgp_gb_[N * (nf_tot + D * e + d) + n][M * i_c.first + m] += fac * i_c.second;
367 for (
auto &j_c : i_jc.second)
368 if (
dgb_v_.count(j_c.first))
369 for (
auto &k_d :
dgb_v_.at(j_c.first))
370 (*mat_v)(i_jc.first, k_d.first) += j_c.second * k_d.second;