62 if (!matrices.count(
"pression"))
return;
63 if (semi_impl.count(
"pression"))
68 const Domaine_DG& domaine = le_dom_DG.valeur();
73 const BasisFunction& bfunc_v = domaine.get_basisFunction(order_v);
74 const int nb_bfunc_v = bfunc_v.
nb_bfunc();
76 const BasisFunction& bfunc_p = domaine.get_basisFunction(order_p);
77 const int nb_bfunc_p = bfunc_p.
nb_bfunc();
83 int nb_elem_tot = domaine.nb_elem_tot();
85 int size_row = indices_glob_elem_v(nb_elem_tot);
86 int size_col = indices_glob_elem_p(nb_elem_tot);
88 mat2.dimensionner(size_row, size_col, 0);
90 auto& tab1 = mat2.get_set_tab1();
91 auto& tab2 = mat2.get_set_tab2();
92 auto& coeff = mat2.get_set_coeff();
95 const Stencil& stencil_sorted = domaine.get_stencil_sorted();
96 const int nb_stencil_max = stencil_sorted.
dimension(1);
102 for (
int nelem = 0; nelem < nb_elem_tot; nelem++)
105 for (
int k = 0; k < nb_stencil_max; k++)
107 if (stencil_sorted(nelem, k) < 0)
109 nb_indices_line += nb_bfunc_p;
111 for (
int k = 0; k < nb_bfunc_v * dim; k++)
112 tab1(indices_glob_elem_v(nelem) + k + 1) = nb_indices_line + tab1(indices_glob_elem_v(nelem) + k);
115 mat2.dimensionner(size_row, size_col, tab1(size_row) - 1);
117 for (
int nelem = 0; nelem < nb_elem_tot; nelem++)
119 row = tab1[indices_glob_elem_v(nelem)] - 1;
120 nb_indices_line = tab1[indices_glob_elem_v(nelem) + 1] - tab1[indices_glob_elem_v(nelem)];
123 for (
int i = 0; i < nb_bfunc_v*dim; i++)
125 for (
int k = 0; k < nb_stencil_max; k++)
127 if (stencil_sorted(nelem, k) < 0)
129 col = indices_glob_elem_p(stencil_sorted(nelem, k)) + 1;
130 for (
int j = 0 ; j < nb_bfunc_p; j++)
131 tab2[row + indice + j + k*nb_bfunc_p] = col + j;
133 indice += nb_indices_line;
136 mat2.is_sorted_stencil();
137 assert(mat2.is_sorted_stencil());
169 const DoubleTab& inco_p = semi_impl.count(
"pression") ? semi_impl.at(
"pression") : ref_cast(
Navier_Stokes_std,
equation()).pression().valeurs();
170 Matrice_Morse *mat = matrices.count(
"pression") ? matrices.at(
"pression") :
nullptr;
172 const Domaine_DG& domaine = le_dom_DG.valeur();
177 const BasisFunction& bfunc_v = domaine.get_basisFunction(order_v);
178 const int nb_bfunc_v = bfunc_v.
nb_bfunc();
180 const BasisFunction& bfunc_p = domaine.get_basisFunction(order_p);
181 const int nb_bfunc_p = bfunc_p.
nb_bfunc();
194 DoubleTab f_base_v(nb_bfunc_v, nb_pts_integ_max);
195 DoubleTab scalar_product_dim(nb_pts_integ_max);
198 for (
int elem = 0; elem < domaine.nb_elem(); elem++)
200 int ind_elem_v = indices_glob_elem_v(elem);
201 int ind_elem_p = indices_glob_elem_p(elem);
204 for (
int d = 0; d < dim; d++)
205 for (
int velocity_index = 0; velocity_index < nb_bfunc_v; velocity_index++)
206 for (
int pressure_index = 0; pressure_index < nb_bfunc_p; pressure_index++)
209 scalar_product_dim(k) = grad_fbase_elem(pressure_index, k, d) * f_base_v(velocity_index, k);
212 (*mat)(ind_elem_v + velocity_index + d * nb_bfunc_v, ind_elem_p + pressure_index) += coeff;
213 secmem(elem, velocity_index + d * nb_bfunc_v) -= coeff * inco_p(elem, pressure_index);
217 const DoubleTab& face_normales = domaine.face_normales();
218 const DoubleVect& face_surfaces = domaine.face_surfaces();
220 const IntTab& face_voisins = domaine.face_voisins();
222 double coeff00, coeff10, coeff01, coeff11;
224 DoubleTab eval_jump_on_facet00(nb_pts_int_fac);
225 DoubleTab eval_jump_on_facet01(nb_pts_int_fac);
226 DoubleTab eval_jump_on_facet10(nb_pts_int_fac);
227 DoubleTab eval_jump_on_facet11(nb_pts_int_fac);
229 DoubleTab f_base_v0(nb_bfunc_v, nb_pts_int_fac);
230 DoubleTab f_base_v1(nb_bfunc_v, nb_pts_int_fac);
231 DoubleTab f_base_p0(nb_bfunc_p, nb_pts_int_fac);
232 DoubleTab f_base_p1(nb_bfunc_p, nb_pts_int_fac);
234 int premiere_face_int = domaine.premiere_face_int();
237 for (
int face = premiere_face_int; face < domaine.nb_faces(); face++)
239 int elem0 = face_voisins(face,0);
240 int elem1 = face_voisins(face,1);
241 double sur_f = face_surfaces(face);
242 int ind_elem0_v = indices_glob_elem_v(elem0);
243 int ind_elem1_v = indices_glob_elem_v(elem1);
244 int ind_elem0_p = indices_glob_elem_p(elem0);
245 int ind_elem1_p = indices_glob_elem_p(elem1);
252 for (
int velocity_index = 0; velocity_index < nb_bfunc_v; velocity_index++)
254 for (
int pressure_index = 0; pressure_index < nb_bfunc_p; pressure_index++)
258 eval_jump_on_facet00(k) = -f_base_p0(pressure_index, k) * face_normales(face, d) * 0.5 * f_base_v0(velocity_index, k) / sur_f;
259 eval_jump_on_facet01(k) = +f_base_p1(pressure_index, k) * face_normales(face, d) * 0.5 * f_base_v0(velocity_index, k) / sur_f;
260 eval_jump_on_facet10(k) = -f_base_p0(pressure_index, k) * face_normales(face, d) * 0.5 * f_base_v1(velocity_index, k) / sur_f;
261 eval_jump_on_facet11(k) = +f_base_p1(pressure_index, k) * face_normales(face, d) * 0.5 * f_base_v1(velocity_index, k) / sur_f;
270 (*mat)(ind_elem0_v + velocity_index + d * nb_bfunc_v, ind_elem0_p + pressure_index) += coeff00;
271 (*mat)(ind_elem0_v + velocity_index + d * nb_bfunc_v, ind_elem1_p + pressure_index) += coeff01;
272 (*mat)(ind_elem1_v + velocity_index + d * nb_bfunc_v, ind_elem0_p + pressure_index) += coeff10;
273 (*mat)(ind_elem1_v + velocity_index + d * nb_bfunc_v, ind_elem1_p + pressure_index) += coeff11;
275 secmem(elem0, velocity_index + d * nb_bfunc_v) -= coeff00 * inco_p(elem0, pressure_index);
276 secmem(elem0, velocity_index + d * nb_bfunc_v) -= coeff01 * inco_p(elem1, pressure_index);
277 secmem(elem1, velocity_index + d * nb_bfunc_v) -= coeff10 * inco_p(elem0, pressure_index);
278 secmem(elem1, velocity_index + d * nb_bfunc_v) -= coeff11 * inco_p(elem1, pressure_index);
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.