74 if (!matrices.count(
"vitesse"))
76 if (semi_impl.count(
"vitesse"))
79 Matrice_Morse *matv = matrices.count(
"vitesse") ? matrices[
"vitesse"] :
nullptr,
80 *matp = matrices.count(
"pression") ? matrices[
"pression"] :
nullptr,
83 const Domaine_DG& domaine = le_dom_DG.valeur();
88 const BasisFunction& bfunc_v = domaine.get_basisFunction(order_v);
89 const int nb_bfunc_v = bfunc_v.
nb_bfunc();
91 const BasisFunction& bfunc_p = domaine.get_basisFunction(order_p);
92 const int nb_bfunc_p = bfunc_p.
nb_bfunc();
98 int nb_elem_tot = domaine.nb_elem_tot();
100 int size_row = indices_glob_elem_p(nb_elem_tot);
101 int size_col = indices_glob_elem_v(nb_elem_tot);
103 const Stencil& stencil_sorted = domaine.get_stencil_sorted();
104 const int nb_stencil_max = stencil_sorted.
dimension(1);
107 int row, col, indice;
111 matv2.dimensionner(size_row, size_col, 0);
113 auto& tabv1 = matv2.get_set_tab1();
114 auto& tabv2 = matv2.get_set_tab2();
115 auto& coeff = matv2.get_set_coeff();
118 for (
int nelem = 0; nelem < nb_elem_tot; nelem++)
121 for (
int k = 0; k < nb_stencil_max; k++)
123 if (stencil_sorted(nelem, k) < 0)
125 nb_indices_line += nb_bfunc_v * dim;
127 for (
int k = 0; k < nb_bfunc_p; k++)
128 tabv1(indices_glob_elem_p(nelem) + k + 1) = nb_indices_line + tabv1(indices_glob_elem_p(nelem) + k);
131 matv2.dimensionner(size_row, size_col, tabv1(size_row) - 1);
133 for (
int nelem = 0; nelem < nb_elem_tot; nelem++)
135 row = tabv1[indices_glob_elem_p(nelem)] - 1;
136 nb_indices_line = tabv1[indices_glob_elem_p(nelem) + 1] - tabv1[indices_glob_elem_p(nelem)];
139 for (
int i = 0; i < nb_bfunc_p; i++)
141 for (
int k = 0; k < nb_stencil_max; k++)
143 if (stencil_sorted(nelem, k) < 0)
145 col = indices_glob_elem_v(stencil_sorted(nelem, k)) + 1;
146 for (
int j = 0; j < nb_bfunc_v * dim; j++)
147 tabv2[row + indice + j + k * nb_bfunc_v * dim] = col + j;
149 indice += nb_indices_line;
152 matv2.is_sorted_stencil();
153 assert(matv2.is_sorted_stencil());
154 matv->
nb_colonnes() ? *matv += matv2 : *matv = matv2;
156 if (matp && order_v == order_p)
158 const int size_p = indices_glob_elem_p(nb_elem_tot);
160 matp2.dimensionner(size_p, size_p, 0);
162 auto& tabp1 = matp2.get_set_tab1();
163 auto& tabp2 = matp2.get_set_tab2();
164 auto& coeffp = matp2.get_set_coeff();
172 for (
int nelem = 0; nelem < nb_elem_tot; nelem++)
175 for (
int k = 0; k < nb_stencil_max; k++)
177 if (stencil_sorted(nelem, k) < 0)
179 nb_indices_line += nb_bfunc_p;
182 for (
int i = 0; i < nb_bfunc_p; i++)
183 tabp1(indices_glob_elem_p(nelem) + i + 1) = nb_indices_line + tabp1(indices_glob_elem_p(nelem) + i);
186 matp2.dimensionner(size_p, size_p, tabp1(size_p) - 1);
188 for (
int nelem = 0; nelem < nb_elem_tot; nelem++)
190 nb_indices_line = tabp1(indices_glob_elem_p(nelem) + 1) - tabp1(indices_glob_elem_p(nelem));
192 for (
int i = 0; i < nb_bfunc_p; i++)
194 row = tabp1(indices_glob_elem_p(nelem) + i) - 1;
196 for (
int k = 0; k < nb_stencil_max; k++)
198 if (stencil_sorted(nelem, k) < 0)
201 col = indices_glob_elem_p(stencil_sorted(nelem, k)) + 1;
202 for (
int j = 0; j < nb_bfunc_p; j++)
203 tabp2[row + j + k * nb_bfunc_p] = col + j;
210 matp2.dimensionner(size_row, 1);
211 auto& tabp1 = matp2.get_set_tab1();
214 auto& tabp2 = matp2.get_set_tab2();
216 auto& coeffp = matp2.get_set_coeff();
219 matp2.is_sorted_stencil();
220 assert(matp2.is_sorted_stencil());
222 matp->nb_colonnes() ? *matp += matp2 : *matp = matp2;
261 Matrice_Morse *matv = matrices.count(
"vitesse") ? matrices[
"vitesse"] :
nullptr;
263 bool stabilisation = ((order_v == order_p) && matrices.count(
"pression"));
264 Matrice_Morse *matp = matrices.count(
"pression") ? (stabilisation ? matrices[
"pression"] :
nullptr) :
nullptr;
265 const DoubleTab& inco_p = semi_impl.count(
"pression") ? semi_impl.at(
"pression") : ref_cast(
Navier_Stokes_std,
equation()).pression().valeurs();
267 const Domaine_DG& domaine = le_dom_DG.valeur();
270 const BasisFunction& bfunc_v = domaine.get_basisFunction(order_v);
271 const int nb_bfunc_v = bfunc_v.
nb_bfunc();
273 const BasisFunction& bfunc_p = domaine.get_basisFunction(order_p);
274 const int nb_bfunc_p = bfunc_p.
nb_bfunc();
288 DoubleTab f_base_p(nb_bfunc_p, nb_pts_integ_max);
289 DoubleTab scalar_product_dim(nb_pts_integ_max);
292 for (
int elem = 0; elem < domaine.nb_elem(); elem++)
294 int ind_elem_v = indices_glob_elem_v(elem);
295 int ind_elem_p = indices_glob_elem_p(elem);
298 for (
int pressure_index = 0; pressure_index < nb_bfunc_p; pressure_index++)
299 for (
int d = 0; d < dim; d++)
300 for (
int velocity_index = 0; velocity_index < nb_bfunc_v; velocity_index++)
303 scalar_product_dim(k) = grad_fbase_elem(velocity_index, k, d) * f_base_p(pressure_index, k);
306 (*matv)(ind_elem_p + pressure_index, ind_elem_v + velocity_index + d * nb_bfunc_v) += coeff;
307 secmem(elem, pressure_index) -= coeff * vit(elem, velocity_index + d * nb_bfunc_v);
311 const DoubleTab& face_normales = domaine.face_normales();
312 const DoubleVect& face_surfaces = domaine.face_surfaces();
315 double coeff00, coeff10, coeff01, coeff11;
317 DoubleTab eval_jump_on_facet00(nb_pts_int_fac);
318 DoubleTab eval_jump_on_facet01(nb_pts_int_fac);
319 DoubleTab eval_jump_on_facet10(nb_pts_int_fac);
320 DoubleTab eval_jump_on_facet11(nb_pts_int_fac);
322 DoubleTab f_base_v0(nb_bfunc_v, nb_pts_int_fac);
323 DoubleTab f_base_v1(nb_bfunc_v, nb_pts_int_fac);
324 DoubleTab f_base_p0(nb_bfunc_p, nb_pts_int_fac);
325 DoubleTab f_base_p1(nb_bfunc_p, nb_pts_int_fac);
327 int premiere_face_int = domaine.premiere_face_int();
330 for (
int face = premiere_face_int; face < domaine.nb_faces(); face++)
332 int elem0 = face_voisins(face, 0);
333 int elem1 = face_voisins(face, 1);
334 double sur_f = face_surfaces(face);
335 int ind_elem0_v = indices_glob_elem_v(elem0);
336 int ind_elem1_v = indices_glob_elem_v(elem1);
337 int ind_elem0_p = indices_glob_elem_p(elem0);
338 int ind_elem1_p = indices_glob_elem_p(elem1);
343 for (
int pressure_index = 0; pressure_index < nb_bfunc_p; pressure_index++)
345 for (
int velocity_index = 0; velocity_index < nb_bfunc_v; velocity_index++)
351 eval_jump_on_facet00(k) = -f_base_v0(velocity_index, k) * face_normales(face, d) * 0.5 * f_base_p0(pressure_index, k) / sur_f;
352 eval_jump_on_facet01(k) = +f_base_v1(velocity_index, k) * face_normales(face, d) * 0.5 * f_base_p0(pressure_index, k) / sur_f;
353 eval_jump_on_facet10(k) = -f_base_v0(velocity_index, k) * face_normales(face, d) * 0.5 * f_base_p1(pressure_index, k) / sur_f;
354 eval_jump_on_facet11(k) = +f_base_v1(velocity_index, k) * face_normales(face, d) * 0.5 * f_base_p1(pressure_index, k) / sur_f;
363 (*matv)(ind_elem0_p + pressure_index, ind_elem0_v + velocity_index + d * nb_bfunc_v) += coeff00;
364 (*matv)(ind_elem0_p + pressure_index, ind_elem1_v + velocity_index + d * nb_bfunc_v) += coeff01;
365 (*matv)(ind_elem1_p + pressure_index, ind_elem0_v + velocity_index + d * nb_bfunc_v) += coeff10;
366 (*matv)(ind_elem1_p + pressure_index, ind_elem1_v + velocity_index + d * nb_bfunc_v) += coeff11;
368 secmem(elem0, pressure_index) -= coeff00 * vit(elem0, velocity_index + d * nb_bfunc_v);
369 secmem(elem0, pressure_index) -= coeff01 * vit(elem1, velocity_index + d * nb_bfunc_v);
370 secmem(elem1, pressure_index) -= coeff10 * vit(elem0, velocity_index + d * nb_bfunc_v);
371 secmem(elem1, pressure_index) -= coeff11 * vit(elem1, velocity_index + d * nb_bfunc_v);
378 for (
int face = 0; face < premiere_face_int; face++)
380 int elem = face_voisins(face, 0);
381 double sur_f = face_surfaces(face);
383 int ind_elem_v = indices_glob_elem_v(elem);
384 int ind_elem_p = indices_glob_elem_p(elem);
387 for (
int pressure_index = 0; pressure_index < nb_bfunc_p; pressure_index++)
389 for (
int velocity_index = 0; velocity_index < nb_bfunc_v; velocity_index++)
395 eval_jump_on_facet00(k) = -f_base_v0(velocity_index, k) * face_normales(face, d) * f_base_p0(pressure_index, k) / sur_f;
398 (*matv)(ind_elem_p + pressure_index, ind_elem_v + velocity_index + d * nb_bfunc_v) += coeff00;
399 secmem(elem, pressure_index) -= coeff00 * vit(elem, velocity_index + d * nb_bfunc_v);
510 op_diff_->update_nu();
512 int premiere_face_int = domaine.premiere_face_int();
514 const DoubleVect& face_surfaces = domaine.face_surfaces();
519 DoubleTab f_base_p0(nb_bfunc_p, nb_pts_int_fac);
520 DoubleTab f_base_p1(nb_bfunc_p, nb_pts_int_fac);
521 DoubleTab eval_jump_on_facet00(nb_pts_int_fac);
522 DoubleTab eval_jump_on_facet01(nb_pts_int_fac);
523 DoubleTab eval_jump_on_facet10(nb_pts_int_fac);
524 DoubleTab eval_jump_on_facet11(nb_pts_int_fac);
525 double coeff00, coeff01, coeff11;
528 for (
int face = premiere_face_int; face < domaine.nb_faces(); face++)
530 int elem0 = face_voisins(face, 0);
531 int elem1 = face_voisins(face, 1);
532 double sur_f = face_surfaces(face);
533 int ind_elem0_p = indices_glob_elem_p(elem0);
534 int ind_elem1_p = indices_glob_elem_p(elem1);
538 double nu0 = op_diff_->nu(elem0, 0);
539 double nu1 = op_diff_->nu(elem1, 0);
540 double nu_f = 2. * nu0 * nu1 / (nu0 + nu1);
542 for (
int pressure_index_l = 0; pressure_index_l < nb_bfunc_p; pressure_index_l++)
544 for (
int pressure_index_r = 0; pressure_index_r < nb_bfunc_p; pressure_index_r++)
548 eval_jump_on_facet00(k) = nu_f * f_base_p0(pressure_index_l, k) * f_base_p0(pressure_index_r, k) * sur_f;
550 (*matp)(ind_elem0_p + pressure_index_l, ind_elem0_p + pressure_index_r) += coeff00;
551 secmem(elem0, pressure_index_l) -= coeff00 * inco_p(elem0, pressure_index_r);
555 eval_jump_on_facet01(k) = -nu_f * f_base_p0(pressure_index_l, k) * f_base_p1(pressure_index_r, k) * sur_f;
557 (*matp)(ind_elem0_p + pressure_index_l, ind_elem1_p + pressure_index_r) += coeff01;
558 secmem(elem0, pressure_index_l) -= coeff01 * inco_p(elem1, pressure_index_r);
560 (*matp)(ind_elem1_p + pressure_index_r, ind_elem0_p + pressure_index_l) += coeff01;
561 secmem(elem1, pressure_index_r) -= coeff01 * inco_p(elem0, pressure_index_l);
565 eval_jump_on_facet11(k) = nu_f * f_base_p1(pressure_index_l, k) * f_base_p1(pressure_index_r, k) * sur_f;
567 (*matp)(ind_elem1_p + pressure_index_l, ind_elem1_p + pressure_index_r) += coeff11;
568 secmem(elem1, pressure_index_l) -= coeff11 * inco_p(elem1, pressure_index_r);