40 const IntTab& e_f = domaine.elem_faces(), &f_e = domaine.face_voisins(), &fcl = ch.
fcl();
41 const int ne_tot = domaine.nb_elem_tot();
43 Matrice_Morse *matv = matrices.count(
"vitesse") ? matrices[
"vitesse"] :
nullptr,
44 *matp = matrices.count(
"pression") ? matrices[
"pression"] :
nullptr,
47 Stencil sten_v(0, 2), sten_p(0, 2);
52 for (
int f = 0; f < domaine.nb_faces(); f++)
55 sten_v.append_line(ne_tot + f, f);
57 for (
int i = 0; i < 2; i++)
59 const int e = f_e(f, i);
62 if (e < domaine.nb_elem())
63 sten_v.append_line(e, f);
70 for (
int e = 0; e < domaine.nb_elem_tot(); e++)
72 domaine.W2(
nullptr, e, w2);
91 for (
int e = 0; e < domaine.nb_elem(); e++)
98 tableau_trier_retirer_doublons(sten_v);
110 tableau_trier_retirer_doublons(sten_p);
113 if (matp->nb_colonnes())
124 const Conds_lim& cls = le_dcl_PolyMAC_CDO->les_conditions_limites();
126 const IntTab& e_f = domaine.elem_faces(), &f_e = domaine.face_voisins(), &fcl = ch.
fcl();
129 Matrice_Morse *matv = matrices.count(
"vitesse") ? matrices[
"vitesse"] :
nullptr, *matp = matrices.count(
"pression") ? matrices[
"pression"] :
nullptr;
135 tab_flux_bords.
resize(domaine.nb_faces_bord(), 1);
137 for (
int f = 0; f < domaine.nb_faces(); f++)
139 for (
int i = 0; i < 2; i++)
141 const int e = f_e(f, i);
144 if (e < domaine.nb_elem())
146 secmem(e) -= (i ? 1 : -1) * fs(f) * pf(f) * vit(f);
147 if (fcl(f, 0) < 2 && matv)
148 (*matv)(e, f) += (i ? 1 : -1) * fs(f) * pf(f);
152 if (f < domaine.premiere_face_int())
153 tab_flux_bords(f) = fs(f) * pf(f) * vit(f);
156 if (has_f && fcl(f, 0) > 1)
159 for (
int d = 0; d < D; d++)
160 secmem(ne_tot + f) += nf(f, d) * pf(f) * ref_cast(
Dirichlet, cls[fcl(f, 1)].valeur()).val_imp(fcl(f, 2), d);
161 secmem(ne_tot + f) -= fs(f) * pf(f) * vit(f);
163 (*matv)(ne_tot + f, f) += fs(f) * pf(f);
165 else if (has_f && matp && fcl(f, 0) == 1)
167 secmem(ne_tot + f) += ref_cast(
Neumann, cls[fcl(f, 1)].valeur()).flux_impose(fcl(f, 2), 0) - press(ne_tot + f);
168 (*matp)(ne_tot + f, ne_tot + f) += 1;
173 if (!has_f || matrices.size() == 0)
return;
174 for (
int e = 0; e < domaine.nb_elem_tot(); e++)
176 domaine.W2(
nullptr, e, w2);
177 for (
int i = 0; i < w2.
dimension(0); i++)
179 const int f = e_f(e, i);
181 if (f < domaine.nb_faces() && !fcl(f, 0))
185 for (
int j = 0; j < w2.
dimension(1); j++)
188 const int fb = e_f(e, j);
190 secmem(ne_tot + f) -= pf(f) * w2(i, j, 0) * (press(ne_tot + fb) - press(e));
193 (*matp)(ne_tot + f, ne_tot + fb) += pf(f) * w2(i, j, 0), coeff_e += pf(f) * w2(i, j, 0);
197 (*matp)(ne_tot + f, e) -= coeff_e;