95 const Nom& nom_inco =
equation().inconnue().le_nom();
99 const Domaine_DG& domaine = le_dom_dg_.valeur();
101 const BasisFunction& bfunc = domaine.get_basisFunction(nordre);
102 const int nb_basis_func = bfunc.
nb_bfunc();
106 int nb_elem_tot = le_dom_dg_->nb_elem_tot();
107 int size_inc = indices_glob_elem(nb_elem_tot);
109 const Stencil& stencil_sorted = domaine.get_stencil_sorted();
110 const int nb_stencil_max = stencil_sorted.
dimension(1);
112 la_matrice.dimensionner(size_inc, size_inc, 0);
114 auto& tab1 = la_matrice.get_set_tab1();
115 auto& tab2 = la_matrice.get_set_tab2();
116 auto& coeff = la_matrice.get_set_coeff();
122 for (
int nelem = 0; nelem < nb_elem_tot; nelem++)
124 int nb_indices_line = 0;
125 for (
int k = 0 ; k < nb_stencil_max; k++)
127 if (stencil_sorted(nelem, k) < 0)
129 nb_indices_line += nb_basis_func;
131 for (
int k = 0; k < nb_basis_func * dim; k++)
132 tab1(indices_glob_elem(nelem) + k + 1) = nb_indices_line + tab1(indices_glob_elem(nelem) + k);
135 la_matrice.dimensionner(size_inc, tab1(size_inc) - 1);
137 for (
int nelem = 0; nelem < nb_elem_tot; nelem++)
139 auto row = tab1[indices_glob_elem(nelem)]-1 ;
140 auto nb_indices_line = tab1[indices_glob_elem(nelem)+1] - tab1[indices_glob_elem(nelem)];
142 for (
int d = 0; d < dim; d++)
144 for (
int i = 0; i < nb_basis_func; i++)
146 for (
int k = 0; k < nb_stencil_max; k++)
148 if (stencil_sorted(nelem, k) < 0)
150 col = indices_glob_elem(stencil_sorted(nelem, k)) + 1;
151 for (
int j = 0 ; j < nb_basis_func; j++)
152 tab2[row + indice + j + k*nb_basis_func] = col + j + d*nb_basis_func;
154 indice += nb_indices_line;
158 la_matrice.is_sorted_stencil();
159 assert(la_matrice.is_sorted_stencil());
241 const DoubleTab& inco = semi_impl.count(nom_inco_str) ? semi_impl.at(nom_inco_str) :
equation().
inconnue().
valeurs();
242 Matrice_Morse *mat = matrices.count(nom_inco_str) ? matrices.at(nom_inco_str) :
nullptr;
246 const Domaine_DG& domaine = le_dom_dg_.valeur();
254 const BasisFunction& bfunc = le_dom_dg_->get_basisFunction(order);
255 const int nb_bfunc = bfunc.
nb_bfunc();
266 DoubleTab diffusion(nb_pts_integ_max);
268 for (
int e = 0; e < le_dom_dg_->nb_elem(); e++)
271 int ind_elem = indices_glob_elem(e);
272 for (
int i = 0; i < nb_bfunc; i++)
273 for (
int j = 0; j < nb_bfunc; j++)
280 diffusion(k) +=
nu(e, ori) * grad_fbase_elem(i, k, d) * grad_fbase_elem(j, k, d);
284 for (
int d_base = 0; d_base < dim; d_base++)
287 (*mat)(ind_elem + i + d_base * nb_bfunc, ind_elem + j + d_base * nb_bfunc) += coeff;
288 secmem(e, i + d_base * nb_bfunc) -= coeff * inco(e, j + d_base * nb_bfunc);
294 int premiere_face_int = domaine.premiere_face_int();
295 const DoubleTab& face_normales = domaine.face_normales();
299 DoubleTab product(nb_pts_int_fac);
300 DoubleTab scalar_product(nb_pts_int_fac);
302 DoubleTab fbase0(nb_bfunc, nb_pts_int_fac);
303 DoubleTab fbase1(nb_bfunc, nb_pts_int_fac);
308 for (
int f = premiere_face_int; f < domaine.nb_faces(); f++)
311 elem0 = face_voisins(f, 0);
312 elem1 = face_voisins(f, 1);
314 int ind_elem0 = indices_glob_elem(elem0);
315 int ind_elem1 = indices_glob_elem(elem1);
317 double sur_f = domaine.face_surfaces(f);
319 double h_T = sqrt(std::min(domaine.carre_pas_maille(elem0), domaine.carre_pas_maille(elem1)));
320 double invh_T = 1. / h_T;
322 double nu_0 = 0., nu_1 = 0.;
327 nu_0 +=
nu(elem0, d) * face_normales(f, d) * face_normales(f, d);
328 nu_1 +=
nu(elem1, d) * face_normales(f, d) * face_normales(f, d);
330 nu_0 /= sur_f * sur_f;
331 nu_1 /= sur_f * sur_f;
338 double gamma = 2 * nu_0 * nu_1 / (nu_0 + nu_1);
343 for (
int i_elem = 0; i_elem < 2; i_elem++)
345 int elem = face_voisins(f, i_elem);
346 int ind_elem = indices_glob_elem(elem);
350 for (
int i = 0; i < nb_bfunc; i++)
351 for (
int j = 0; j < nb_bfunc; j++)
353 for (
int k = 0; k < nb_pts_int_fac; k++)
354 product(k) = fbase0(i, k) * fbase0(j, k);
357 for (
int d_base = 0; d_base < dim; d_base++)
360 (*mat)(ind_elem + i + d_base * nb_bfunc, ind_elem + j + d_base * nb_bfunc) += coeff;
361 secmem(elem, i + d_base * nb_bfunc) -= coeff * inco(elem, j + d_base * nb_bfunc);
370 for (
int i = 0; i < nb_bfunc; i++)
371 for (
int j = 0; j < nb_bfunc; j++)
373 for (
int k = 0; k < nb_pts_int_fac; k++)
374 product(k) = fbase0(i, k) * fbase1(j, k);
377 coeff = gamma * eta_F(f) * invh_T * integral;
378 for (
int d_base = 0; d_base < dim; d_base++)
382 (*mat)(ind_elem0 + i + d_base * nb_bfunc, ind_elem1 + j + d_base * nb_bfunc) -= coeff;
383 (*mat)(ind_elem1 + j + d_base * nb_bfunc, ind_elem0 + i + d_base * nb_bfunc) -= coeff;
385 secmem(elem0, i + d_base * nb_bfunc) += coeff * inco(elem1, j + d_base * nb_bfunc);
386 secmem(elem1, j + d_base * nb_bfunc) += coeff * inco(elem0, i + d_base * nb_bfunc);
396 for (
int i = 0; i < nb_bfunc; i++)
399 for (
int k = 0; k < nb_pts_int_fac; k++)
403 scalar_product(k) +=
nu(elem0, ori) * face_normales(f, d) / sur_f * grad_fbase0(i, k, d);
406 for (
int j = 0; j < nb_bfunc; j++)
408 for (
int k = 0; k < nb_pts_int_fac; k++)
409 product(k) = scalar_product(k) * fbase0(j, k);
411 for (
int d_base = 0; d_base < dim; d_base++)
415 (*mat)(ind_elem0 + i + d_base * nb_bfunc, ind_elem0 + j + d_base * nb_bfunc) -= 0.5 * integral;
416 (*mat)(ind_elem0 + j + d_base * nb_bfunc, ind_elem0 + i + d_base * nb_bfunc) -= 0.5 * integral;
418 secmem(elem0, i + d_base * nb_bfunc) += 0.5 * integral * inco(elem0, j + d_base * nb_bfunc);
419 secmem(elem0, j + d_base * nb_bfunc) += 0.5 * integral * inco(elem0, i + d_base * nb_bfunc);
423 for (
int j = 0; j < nb_bfunc; j++)
425 for (
int k = 0; k < nb_pts_int_fac; k++)
426 product(k) = scalar_product(k) * fbase1(j, k);
428 for (
int d_base = 0; d_base < dim; d_base++)
432 (*mat)(ind_elem0 + i + d_base * nb_bfunc, ind_elem1 + j + d_base * nb_bfunc) += 0.5 * integral;
433 (*mat)(ind_elem1 + j + d_base * nb_bfunc, ind_elem0 + i + d_base * nb_bfunc) += 0.5 * integral;
435 secmem(elem0, i + d_base * nb_bfunc) -= 0.5 * integral * inco(elem1, j + d_base * nb_bfunc);
436 secmem(elem1, j + d_base * nb_bfunc) -= 0.5 * integral * inco(elem0, i + d_base * nb_bfunc);
441 for (
int k = 0; k < nb_pts_int_fac; k++)
445 scalar_product(k) +=
nu(elem1, ori) * face_normales(f, d) / sur_f * grad_fbase1(i, k, d);
448 for (
int j = 0; j < nb_bfunc; j++)
450 for (
int k = 0; k < nb_pts_int_fac; k++)
451 product(k) = scalar_product(k) * fbase1(j, k);
453 for (
int d_base = 0; d_base < dim; d_base++)
457 (*mat)(ind_elem1 + i + d_base * nb_bfunc, ind_elem1 + j + d_base * nb_bfunc) += 0.5 * integral;
458 (*mat)(ind_elem1 + j + d_base * nb_bfunc, ind_elem1 + i + d_base * nb_bfunc) += 0.5 * integral;
460 secmem(elem1, i + d_base * nb_bfunc) -= 0.5 * integral * inco(elem1, j + d_base * nb_bfunc);
461 secmem(elem1, j + d_base * nb_bfunc) -= 0.5 * integral * inco(elem1, i + d_base * nb_bfunc);
465 for (
int j = 0; j < nb_bfunc; j++)
467 for (
int k = 0; k < nb_pts_int_fac; k++)
468 product(k) = scalar_product(k) * fbase0(j, k);
470 for (
int d_base = 0; d_base < dim; d_base++)
474 (*mat)(ind_elem1 + i + d_base * nb_bfunc, ind_elem0 + j + d_base * nb_bfunc) -= 0.5 * integral;
475 (*mat)(ind_elem0 + j + d_base * nb_bfunc, ind_elem1 + i + d_base * nb_bfunc) -= 0.5 * integral;
477 secmem(elem1, i + d_base * nb_bfunc) += 0.5 * integral * inco(elem0, j + d_base * nb_bfunc);
478 secmem(elem0, j + d_base * nb_bfunc) += 0.5 * integral * inco(elem1, i + d_base * nb_bfunc);
486 for (
int f = 0; f < premiere_face_int; f++)
489 if (ch.
fcl()(f, 0) > 5)
491 int elem = face_voisins(f, 0);
492 int ind_elem = indices_glob_elem(elem);
497 double h_T = sqrt(domaine.carre_pas_maille(elem));
498 double invh_T = 1. / h_T;
499 double sur_f = domaine.face_surfaces(f);
504 nu_F +=
nu(elem, d) * face_normales(f, d) * face_normales(f, d);
505 nu_F /= sur_f * sur_f;
510 for (
int i = 0; i < nb_bfunc; i++)
513 for (
int k = 0; k < nb_pts_int_fac; k++)
517 scalar_product(k) +=
nu(elem, ori) * face_normales(f, d) / sur_f * grad_fbase0(i, k, d);
520 for (
int j = 0; j < nb_bfunc; j++)
522 for (
int k = 0; k < nb_pts_int_fac; k++)
523 product(k) = fbase0(i, k) * fbase0(j, k);
526 for (
int d_base = 0; d_base < dim; d_base++)
529 (*mat)(ind_elem + i + d_base * nb_bfunc, ind_elem + j + d_base * nb_bfunc) += coeff;
530 secmem(elem, i + d_base * nb_bfunc) -= coeff * inco(elem, j + d_base * nb_bfunc);
532 for (
int k = 0; k < nb_pts_int_fac; k++)
533 product(k) = scalar_product(k) * fbase0(j, k);
536 for (
int d_base = 0; d_base < dim; d_base++)
540 (*mat)(ind_elem + i + d_base * nb_bfunc, ind_elem + j + d_base * nb_bfunc) -= integral;
541 (*mat)(ind_elem + j + d_base * nb_bfunc, ind_elem + i + d_base * nb_bfunc) -= integral;
543 secmem(elem, i + d_base * nb_bfunc) += integral * inco(elem, j + d_base * nb_bfunc);
544 secmem(elem, j + d_base * nb_bfunc) += integral * inco(elem, i + d_base * nb_bfunc);
599 const Domaine_DG& domaine = le_dom_dg_.valeur();
603 const IntTab& face_voisins = domaine.face_voisins();
604 const DoubleTab& face_normales = domaine.face_normales();
610 const BasisFunction& bfunc = le_dom_dg_->get_basisFunction(order);
611 const int nb_bfunc = bfunc.
nb_bfunc();
613 assert(dim*nb_bfunc ==
equation().inconnue().valeurs().line_size());
618 int nb_pts_int_fac = integ_points_facets.
dimension(1);
620 DoubleTab fbase(nb_bfunc, nb_pts_int_fac);
622 DoubleTab scalar_product_dim(dim, nb_pts_int_fac);
623 DoubleTab scalar_product(nb_pts_int_fac);
627 for (
int n_bord = 0; n_bord < nb_bords; n_bord++)
629 const Cond_lim& la_cl = la_zcl_dg_->les_conditions_limites(n_bord);
633 double xk = 0., yk = 0., zk = 0.;
639 Cerr <<
"You have to use a Champ_front_fonc_txyz and not " << la_cl.valeur().champ_front().que_suis_je() << finl;
643 bool avec_valeur_aux_points =
false;
650 if (sub_type(
Neumann, la_cl.valeur()))
652 if (avec_valeur_aux_points)
659 for (
int ind_faceb = num1f; ind_faceb < num2f; ind_faceb++)
661 ind_face = le_bord.
num_face(ind_faceb);
662 int elem = face_voisins(ind_face, 0);
666 for (
int i = 0; i < nb_bfunc; i++)
668 scalar_product_dim = 0.;
669 for (
int k = 0; k < nb_pts_int_fac; k++)
673 xk = integ_points_facets(ind_face, k, 0);
674 yk = integ_points_facets(ind_face, k, 1);
676 zk = integ_points_facets(ind_face, k, 2);
677 for (
int d_base = 0; d_base < dim; d_base++)
680 scalar_product_dim(d_base, k) = fbase(i, k) * flux_impose_k;
683 for (
int d_base = 0; d_base < dim; d_base++)
685 scalar_product.ref_array(scalar_product_dim, d_base*nb_pts_int_fac, nb_pts_int_fac);
696 for (
int ind_faceb = num1f; ind_faceb < num2f; ind_faceb++)
698 ind_face = le_bord.
num_face(ind_faceb);
699 int elem = face_voisins(ind_face, 0);
703 for (
int i = 0; i < nb_bfunc; i++)
705 scalar_product_dim = 0.;
706 for (
int k = 0; k < nb_pts_int_fac; k++)
708 for (
int d_base = 0; d_base < dim; d_base++)
710 double flux_impose_k = neumann.
flux_impose(ind_faceb, d_base);
711 scalar_product_dim(d_base, k) = fbase(i, k) * flux_impose_k;
714 for (
int d_base = 0; d_base < dim; d_base++)
716 scalar_product.ref_array(scalar_product_dim, d_base*nb_pts_int_fac, nb_pts_int_fac);
727 else if (sub_type(
Dirichlet, la_cl.valeur()))
730 if (avec_valeur_aux_points)
737 for (
int ind_faceb = num1f; ind_faceb < num2f; ind_faceb++)
740 ind_face = le_bord.
num_face(ind_faceb);
742 int elem = face_voisins(ind_face, 0);
747 sur_f = domaine.face_surfaces(ind_face);
749 double h_T = sqrt(domaine.carre_pas_maille(elem));
750 double invh_T = 1. / h_T;
755 nu_F +=
nu(elem, d) * face_normales(ind_face, d) * face_normales(ind_face, d);
756 nu_F /= sur_f * sur_f;
761 for (
int i = 0; i < nb_bfunc; i++)
763 double u_bord_k = 0.;
764 scalar_product_dim = 0.;
765 for (
int k = 0; k < nb_pts_int_fac; k++)
768 xk = integ_points_facets(ind_face, k, 0);
769 yk = integ_points_facets(ind_face, k, 1);
771 zk = integ_points_facets(ind_face, k, 2);
773 for (
int d_base = 0; d_base < dim; d_base++)
779 scalar_product_dim(d_base, k) -=
nu(elem, ori) * face_normales(ind_face, d) / sur_f * grad_fbase(i, k, d) * u_bord_k;
781 scalar_product_dim(d_base, k) += nu_F * eta_F(ind_face) * invh_T * u_bord_k * fbase(i, k);
784 for (
int d_base = 0; d_base < dim; d_base++)
786 scalar_product.ref_array(scalar_product_dim, d_base*nb_pts_int_fac, nb_pts_int_fac);
797 for (
int ind_faceb = num1f; ind_faceb < num2f; ind_faceb++)
800 ind_face = le_bord.
num_face(ind_faceb);
802 int elem = face_voisins(ind_face, 0);
807 sur_f = domaine.face_surfaces(ind_face);
809 double h_T = sqrt(domaine.carre_pas_maille(elem));
810 double invh_T = 1. / h_T;
815 nu_F +=
nu(elem, d) * face_normales(ind_face, d) * face_normales(ind_face, d);
816 nu_F /= sur_f * sur_f;
821 for (
int i = 0; i < nb_bfunc; i++)
823 scalar_product_dim = 0.;
824 for (
int d_base = 0; d_base < dim; d_base++)
827 for (
int k = 0; k < nb_pts_int_fac; k++)
832 scalar_product_dim(d_base, k) -=
nu(elem, ori) * face_normales(ind_face, d) / sur_f * grad_fbase(i, k, d) * u_bord;
834 scalar_product_dim(d_base, k) += nu_F * eta_F(ind_face) * invh_T * u_bord * fbase(i, k);
836 scalar_product.ref_array(scalar_product_dim, d_base*nb_pts_int_fac, nb_pts_int_fac);