16#include <Op_VEF_Face.h>
17#include <Matrice_Morse.h>
18#include <Equation_base.h>
20#include <Probleme_base.h>
22#include <Champ_Uniforme.h>
23#include <Schema_Temps_base.h>
24#include <Milieu_base.h>
25#include <Operateur_base.h>
26#include <Operateur_Diff_base.h>
27#include <Op_Conv_VEF_base.h>
28#include <EcrFicPartage.h>
31#include <Matrice_Morse_Diag.h>
33#include <Dirichlet_homogene.h>
34#include <Periodique.h>
55 la_matrice.
dimensionner(nfin * nb_comp, nfin * nb_comp, 0);
62 const IntTab& elem_faces = le_dom.
elem_faces();
69 IntTrav rang_voisin(nfin * nb_comp);
70 rang_voisin = nb_comp;
73 ToDo_Kokkos(
"Port with kokkos ? It will be called once...");
74 for (
int num_face = 0; num_face < nfin; num_face++)
76 int elem1 = face_voisins(num_face, 0);
77 int elem2 = face_voisins(num_face, 1);
79 for (
int i = 0; i < nb_faces_elem; i++)
81 if ((j = elem_faces(elem1, i)) != num_face)
83 for (
int k = 0; k < nb_comp; k++)
85 rang_voisin(num_face * nb_comp + k) += nb_comp;
89 if ((j = elem_faces(elem2, i)) != num_face)
91 for (
int k = 0; k < nb_comp; k++)
93 rang_voisin(num_face * nb_comp + k) += nb_comp;
103 for (
int num_face = 0; num_face < nfin; num_face++)
105 for (
int k = 0; k < nb_comp; k++)
107 tab1(num_face * nb_comp + 1 + k) = rang_voisin(num_face * nb_comp + k) + tab1(num_face * nb_comp + k);
110 la_matrice.
dimensionner(nfin * nb_comp, tab1(nfin * nb_comp) - 1);
112 for (
int num_face = 0; num_face < nfin; num_face++)
114 for (
int k = 0; k < nb_comp; k++)
116 for (
int kk = 0; kk < nb_comp; kk++)
118 int modulo = (k + kk) % nb_comp;
119 tab2[tab1[num_face * nb_comp + k] - 1 + kk] = num_face * nb_comp + 1 + modulo;
121 rang_voisin[num_face * nb_comp + k] = (int)(tab1[num_face * nb_comp + k] + nb_comp - 1);
126 for (
int num_face = 0; num_face < nfin; num_face++)
128 int elem1 = face_voisins(num_face, 0);
129 int elem2 = face_voisins(num_face, 1);
131 for (
int i = 0; i < nb_faces_elem; i++)
133 if ((j = elem_faces(elem1, i)) != num_face)
135 for (
int k = 0; k < nb_comp; k++)
137 for (
int kk = 0; kk < nb_comp; kk++)
139 int modulo = (k + kk) % nb_comp;
140 tab2[rang_voisin[num_face * nb_comp + k] + kk] = j * nb_comp + 1 + modulo;
142 rang_voisin[num_face * nb_comp + k] += nb_comp;
147 if ((j = elem_faces(elem2, i)) != num_face)
149 for (
int k = 0; k < nb_comp; k++)
151 for (
int kk = 0; kk < nb_comp; kk++)
153 int modulo = (k + kk) % nb_comp;
154 tab2[rang_voisin[num_face * nb_comp + k] + kk] = j * nb_comp + 1 + modulo;
156 rang_voisin[num_face * nb_comp + k] += nb_comp;
176 const int nb_comp = champ_inconnue.
line_size();
177 ArrOfDouble normale(nb_comp);
178 for (
const auto &itr : les_cl)
185 bool has_val_imp = sub_type(
Dirichlet, la_cl);
186 CDoubleTabView val_imp;
187 if (has_val_imp) val_imp = ref_cast(
Dirichlet, la_cl).tab_val_imp().view_ro();
188 auto tab1 = la_matrice.
get_tab1().view_ro();
189 CIntArrView num_face = la_front_dis.
num_face().view_ro();
191 DoubleTabView secmem = tab_secmem.
view_wo();
192 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nfaces, KOKKOS_LAMBDA(
const int ind_face)
194 int face = num_face(ind_face);
195 for (
int comp = 0; comp < nb_comp; comp++)
197 auto idiag = tab1[face * nb_comp + comp] - 1;
200 auto nbvois = tab1[face * nb_comp + 1 + comp] - tab1[face * nb_comp + comp];
201 for (
auto k = 1; k < nbvois; k++)
202 coeff[idiag + k] = 0;
204 int j = nb_comp == 1 ? 0 : comp;
205 secmem(face, j) = has_val_imp ? val_imp(ind_face, j) : 0.;
208 end_gpu_timer(__KERNEL_NAME__);
212 const auto& tab1 = la_matrice.
get_tab1();
213 const auto& tab2 = la_matrice.
get_tab2();
216 ToDo_Kokkos(
"critical");
217 for (
int ind_face = 0; ind_face < nfaces; ind_face++)
219 int face = la_front_dis.
num_face(ind_face);
223 for (
int comp = 0; comp < nb_comp; comp++)
225 normale[comp] = face_normales(face, comp);
226 if (std::fabs(normale[comp]) > std::fabs(max_coef))
228 max_coef = normale[comp];
231 n2 += normale[comp] * normale[comp];
234 max_coef = normale[ind_max];
237 auto nb_coeff_ligne = tab1[face * nb_comp + 1] - tab1[face * nb_comp];
238 for (
auto k = 0; k < nb_coeff_ligne; k++)
240 for (
int comp = 0; comp < nb_comp; comp++)
242 int j = tab2[tab1[face * nb_comp + comp] - 1 + k] - 1;
245 const double coef_ij = la_matrice(face * nb_comp + comp, j);
246 int face2 = j / nb_comp;
247 int comp2 = j - face2 * nb_comp;
248 tab_secmem(face, comp) -= coef_ij * champ_inconnue(face2, comp2);
253 for (
int comp = 0; comp < nb_comp; comp++)
254 somme_b += tab_secmem(face, comp) * normale[comp];
257 for (
int comp = 0; comp < nb_comp; comp++)
258 tab_secmem(face, comp) -= somme_b * normale[comp];
262 for (
int comp = 0; comp < nb_comp; comp++)
264 int j0 = face * nb_comp + comp;
265 ref += la_matrice(j0, j0);
269 for (
int comp = 0; comp < nb_comp; comp++)
271 int j0 = face * nb_comp + comp;
272 double rap = ref / la_matrice(j0, j0);
273 for (
auto k = 0; k < nb_coeff_ligne; k++)
275 int j = tab2[tab1[j0] - 1 + k] - 1;
276 la_matrice(j0, j) *= rap;
278 assert(est_egal(la_matrice(j0, j0), ref));
282 for (
auto k = 1; k < nb_coeff_ligne; k++)
284 for (
int comp = 0; comp < nb_comp; comp++)
286 int j = tab2[tab1[face * nb_comp + comp] - 1 + k] - 1;
287 assert(j != (face * nb_comp + comp));
288 if ((j >= (face * nb_comp)) && (j < (face * nb_comp + nb_comp)))
289 la_matrice(face * nb_comp + comp, j) = 0;
295 for (
auto k = 0; k < nb_coeff_ligne; k++)
298 int j = tab2[tab1[face * nb_comp] - 1 + k] - 1;
302 for (
int comp = 0; comp < nb_comp; comp++)
303 dsomme += la_matrice(face * nb_comp + comp, j) * normale[comp];
307 for (
int comp = 0; comp < nb_comp; comp++)
309 if ((j < (face * nb_comp)) || (j >= (face * nb_comp + nb_comp)))
310 la_matrice(face * nb_comp + comp, j) -= (dsomme) * normale[comp];
313 for (
auto k = 0; k < nb_coeff_ligne; k++)
315 for (
int comp = 0; comp < nb_comp; comp++)
317 int j = tab2[tab1[face * nb_comp + comp] - 1 + k] - 1;
318 int face2 = j / nb_comp;
319 int comp2 = j - face2 * nb_comp;
320 const double coef_ij = la_matrice(face * nb_comp + comp, j);
321 tab_secmem(face, comp) += coef_ij * champ_inconnue(face2, comp2);
327 for (
int comp = 0; comp < nb_comp; comp++)
328 somme_c += tab_secmem(face, comp) * normale[comp];
330 for (
int comp = 0; comp < nb_comp; comp++)
331 tab_secmem(face, comp) -= somme_c * normale[comp];
340 controle_modifier_flux_ = 1;
342 if (flux_bords_.
nb_dim() != 2)
357 CDoubleArrView rho_face =
static_cast<const DoubleVect&
>(rho.
valeurs()).view_ro();
358 CDoubleArrView Cp_face =
static_cast<const DoubleVect&
>(Cp.
valeurs()).view_ro();
359 DoubleArrView flux_bords =
static_cast<DoubleVect&
>(flux_bords_).view_rw();
360 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_faces_bords, KOKKOS_LAMBDA(
365 flux_bords(face) *= (is_rho_u ? 1 : rho_face(rho_uniforme?0:face)) * Cp_face(cp_uniforme?0:face);
367 end_gpu_timer(__KERNEL_NAME__);
377 double coef = rho.
valeurs()(0, 0);
379 DoubleTabView flux_bords = flux_bords_.
view_rw();
381 Kokkos::parallel_for(
382 start_gpu_timer(__KERNEL_NAME__),
383 range_2D({0,0}, {nb_faces_bord,nb_compo}),
384 KOKKOS_LAMBDA (
int face,
int k)
386 flux_bords(face, k) *= coef;
388 end_gpu_timer(__KERNEL_NAME__);
399 const DoubleTab& flux_bords_ = op.
flux_bords();
400 if (flux_bords_.
nb_dim() != 2)
402 Cout <<
"L'impression des flux n'est pas codee pour l'operateur " << op.
que_suis_je() << finl;
405 if (controle_modifier_flux_ == 0)
406 if (max_abs_array(flux_bords_) != 0)
408 Cerr << op.
que_suis_je() <<
" appelle Op_VEF_Face::impr sans avoir appeler Op_VEF_Face::modifier_flux, on arrete tout " << finl;
419 const int impr_sum = (le_dom_vef.
domaine().bords_a_imprimer_sum().est_vide() ? 0 : 1);
420 const int impr_bord = (le_dom_vef.
domaine().bords_a_imprimer().est_vide() ? 0 : 1);
428 DoubleVect bilan(nb_compo);
431 DoubleTrav flux_bords(4, nb_cl, nb_compo);
439 for (
int num_cl = 0; num_cl < nb_cl; num_cl++)
444 int nfin = ndeb + frontiere_dis.
nb_faces();
445 int perio = (sub_type(
Periodique,la_cl.valeur()) ? 1 : 0);
446 for (
int face = ndeb; face < nfin; face++)
448 for (
int k = 0; k < nb_compo; k++)
450 flux_bords(0, num_cl, k) += flux_bords_(face, k);
453 if (face < (ndeb + frontiere_dis.
nb_faces() / 2))
454 flux_bords(1, num_cl, k) += flux_bords_(face, k);
456 flux_bords(2, num_cl, k) += flux_bords_(face, k);
463 flux_bords(3, num_cl, 0) += flux_bords_(face, 1) * xgr(face, 0) - flux_bords_(face, 0) * xgr(face, 1);
466 flux_bords(3, num_cl, 0) += flux_bords_(face, 2) * xgr(face, 1) - flux_bords_(face, 1) * xgr(face, 2);
467 flux_bords(3, num_cl, 1) += flux_bords_(face, 0) * xgr(face, 2) - flux_bords_(face, 2) * xgr(face, 0);
468 flux_bords(3, num_cl, 2) += flux_bords_(face, 1) * xgr(face, 0) - flux_bords_(face, 0) * xgr(face, 1);
492 for (
int num_cl = 0; num_cl < nb_cl; num_cl++)
496 int perio = (sub_type(
Periodique,la_cl.valeur()) ? 1 : 0);
497 for (
int k = 0; k < nb_compo; k++)
501 Flux.add_col(flux_bords(1, num_cl, k));
502 Flux.add_col(flux_bords(2, num_cl, k));
505 Flux.add_col(flux_bords(0, num_cl, k));
507 Flux_moment.add_col(flux_bords(3, num_cl, k));
508 if (le_dom_vef.
domaine().bords_a_imprimer_sum().contient(la_fr.
le_nom()))
509 Flux_sum.add_col(flux_bords(0, num_cl, k));
512 bilan(k) += flux_bords(0, num_cl, k);
517 for (
int k = 0; k < nb_compo; k++)
518 Flux.add_col(bilan(k));
526 const LIST(
Nom) &Liste_bords_a_imprimer = le_dom_vef.
domaine().bords_a_imprimer();
527 if (!Liste_bords_a_imprimer.est_vide())
532 for (
int num_cl = 0; num_cl < nb_cl; num_cl++)
538 int nfin = ndeb + frontiere_dis.
nb_faces();
540 if (Liste_bords_a_imprimer.contient(la_fr.
le_nom()))
542 Flux_face <<
"# Flux par face sur " << la_fr.
le_nom() <<
" au temps ";
544 Flux_face <<
" : " << finl;
545 const DoubleTab& xv = le_dom_vef.
xv();
546 for (
int face = ndeb; face < nfin; face++)
549 Flux_face <<
"# Face a x= " << xv(face, 0) <<
" y= " << xv(face, 1);
551 Flux_face <<
"# Face a x= " << xv(face, 0) <<
" y= " << xv(face, 1) <<
" z= " << xv(face, 2);
552 for (
int k = 0; k < nb_compo; k++)
553 Flux_face <<
" surface_face(m2)= " << le_dom_vef.
face_surfaces(face) <<
" flux_par_surface(W/m2)= " << flux_bords_(face, k) / le_dom_vef.
face_surfaces(face) <<
" flux(W)= "
554 << flux_bords_(face, k);
573 int nb_faces_elem = domaine_VEF.
elem_faces().dimension(1);
574 for (
int n_bord = 0; n_bord < nb_bords; n_bord++)
584 int num2 = num1 + le_bord.
nb_faces() / 2;
585 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
586 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
587 CIntArrView face_associee = la_cl_perio.
face_associee().view_ro();
588 Matrice_Morse_View matrice;
589 matrice.set(matrice_morse);
590 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(num1, num2),
591 KOKKOS_LAMBDA(
const int num_face)
593 for (
int dir = 0; dir < 2; dir++)
595 int elem1 = face_voisins(num_face, dir);
596 int fac_asso = face_associee(num_face - num1) + num1;
597 for (
int i = 0; i < nb_faces_elem; i++)
599 int j = elem_faces(elem1, i);
600 for (
int nc = 0; nc < nb_comp; nc++)
602 int n0 = num_face * nb_comp + nc;
603 int n0perio = fac_asso * nb_comp + nc;
604 if (((j == num_face) || (j == fac_asso)))
608 assert(matrice(n0, n0perio) == 0);
609 assert(matrice(n0perio, n0) == 0);
610 assert(matrice(n0, n0) == matrice(n0perio, n0perio));
611 double coeff = (matrice(n0, n0)) / 2.;
612 matrice.store(n0, n0, coeff);
613 matrice.store(n0perio, n0perio, coeff);
618 for (
int nc2 = 0; nc2 < nb_comp; nc2++)
620 int j20 = j * nb_comp + nc2;
621 assert(matrice(n0, j20) == matrice(n0perio, j20));
622 double coeff = (matrice(n0, j20) / 2.);
623 matrice.store(n0, j20, coeff);
624 matrice.store(n0perio, j20, coeff);
631 end_gpu_timer(__KERNEL_NAME__);
643 int nb_faces_elem = domaine_VEF.
elem_faces().dimension(1);
644 for (
int n_bord = 0; n_bord < nb_bords; n_bord++)
654 int num2 = num1 + le_bord.
nb_faces() / 2;
655 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
656 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
657 CIntArrView face_associee = la_cl_perio.
face_associee().view_ro();
658 Matrice_Morse_View matrice;
659 matrice.set(matrice_morse);
660 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(num1, num2),
661 KOKKOS_LAMBDA(
const int num_face)
663 for (
int dir = 0; dir < 2; dir++)
665 int elem1 = face_voisins(num_face, dir);
666 int fac_asso = face_associee(num_face - num1) + num1;
667 for (
int i = 0; i < nb_faces_elem; i++)
669 int j = elem_faces(elem1, i);
671 for (
int nc = 0; nc < nb_comp; nc++)
673 int n0 = num_face * nb_comp + nc;
675 int n0perio = fac_asso * nb_comp + nc;
676 if (((j == num_face) || (j == fac_asso)))
680 for (
int nc2 = 0; nc2 < nb_comp; nc2++)
682 int j0 = num_face * nb_comp + nc2;
683 int j0perio = fac_asso * nb_comp + nc2;
684 matrice.atomic_add(n0, j0, matrice(n0, j0perio));
685 matrice.store(n0, j0perio, 0);
686 matrice.atomic_add(n0perio, j0perio, matrice(n0perio, j0));
687 matrice.store(n0perio, j0, 0);
688 double coeff = (matrice(n0, j0) +
689 matrice(n0perio, j0perio));
690 matrice.store(n0, j0, coeff);
693 matrice.store(n0perio, j0, coeff);
694 matrice.store(n0perio, j0perio, 0);
697 matrice.store(n0perio, j0perio, coeff);
703 for (
int nc2 = 0; nc2 < nb_comp; nc2++)
705 int j20 = j * nb_comp + nc2;
706 double coeff = (matrice(n0, j20) + matrice(n0perio, j20));
707 matrice.store(n0, j20, coeff);
708 matrice.store(n0perio, j20, coeff);
715 end_gpu_timer(__KERNEL_NAME__);
730 modif_matrice_pour_periodique_avant_contribuer(matrice, eqn);
744 modif_matrice_pour_periodique_apres_contribuer(matrice, eqn);
755 const auto& tab1 = matrice.
get_tab1();
756 const auto& tab2 = matrice.
get_tab2();
758 for (
int n_bord = 0; n_bord < nb_bords; n_bord++)
771 int num2 = num1 + le_bord.
nb_faces() / 2;
772 for (
int num_face = num1; num_face < num2; num_face++)
773 for (
int nc = 0; nc < nb_comp; nc++)
775 fac_asso = la_cl_perio.
face_associee(num_face - num1) + num1;
776 int n0 = num_face * nb_comp + nc;
777 int n0perio = fac_asso * nb_comp + nc;
779 for (
auto j = tab1[n0] - 1; j < tab1[n0 + 1] - 1; j++)
782 if ((c != n0) && (c != n0perio))
784 double test = matrice(n0, c) - matrice(n0perio, c);
787 Cerr <<
"Pb matrice non periodique face" << num_face <<
" composante " << nc <<
" colonne " << c << finl;
788 Cerr <<
" diff " << test <<
" coef1 " << matrice(n0, c) <<
" coef2 " << matrice(n0perio, c) << finl;
793 if ((matrice(n0, n0perio) != 0) || (matrice(n0perio, n0) != 0))
795 Cerr <<
"Pb matrice non periodique face" << num_face <<
" composante " << nc << finl;
796 Cerr <<
" coef non nul" << matrice(n0, n0perio) <<
" " << matrice(n0perio, n0) << finl;
799 if (matrice(n0, n0) != matrice(n0perio, n0perio))
801 double test = matrice(n0, n0perio) - matrice(n0perio, n0);
802 Cerr <<
"Pb matrice non periodique face" << num_face <<
" composante " << nc << finl;
803 Cerr <<
" diff " << test <<
" coef different " << matrice(n0, n0) <<
" " << matrice(n0perio, n0perio) << finl;
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
classe Cond_lim Classe generique servant a representer n'importe quelle classe
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
Classe Dirichlet_homogene Cette classe est la classe de base de la hierarchie des conditions aux limi...
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
virtual const DoubleVect & face_surfaces() const
int nb_faces_tot() const
renvoie le nombre total de faces.
virtual double face_normales(int face, int comp) const
double xv(int num_face, int k) const
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
DoubleTab calculer_xgr() const
calcul le tableau xgr pour le calcul des moments des forces aux bords :
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
int nb_faces_bord() const
renvoie le nombre de faces sur lesquelles sont appliquees les conditions limites :
int moments_a_imprimer() const
const Domaine & domaine() const
Sortie & syncfile() override
Provoque l'ecriture sur disque des donnees accumulees sur les differents processeurs depuis le dernie...
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual const Milieu_base & milieu() const =0
virtual const Champ_Inc_base & inconnue() const =0
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Nom & le_nom() const override
Renvoie le nom du champ.
virtual Nature_du_champ nature_du_champ() const
int num_premiere_face() const
int num_face(const int) const
classe Frontiere_dis_base Classe representant une frontiere discretisee.
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
Classe Matrice_Morse_Diag Represente une matrice M (creuse) symetrique stockee au format Morse.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const auto & get_tab2() const
void dimensionner(int n, _SIZE_ nnz)
Size the matrix with n lines and n columns and nnz zero-values coefficients.
const auto & get_tab1() const
int nb_colonnes() const override
Return local number of columns (=size on the current proc).
virtual const Champ_Don_base & capacite_calorifique() const
Renvoie la capacite calorifique du milieu.
virtual const Champ_base & masse_volumique() const
Renvoie la masse volumique du milieu.
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
class Nom Une chaine de caractere pour nommer les objets de TRUST
virtual int debute_par(const char *const n) const
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
void modifier_matrice_pour_periodique_apres_contribuer(Matrice_Morse &matrice, const Equation_base &) const
Somme les 2 lignes des faces periodiques associees permet de calculer dans le code sans se poser de q...
void dimensionner(const Domaine_VEF &, const Domaine_Cl_VEF &, Matrice_Morse &) const
Dimensionnement de la matrice qui devra recevoir les coefficients provenant de la convection,...
int impr(Sortie &, const Operateur_base &) const
Impression des flux d'un operateur VEF aux faces (ie: diffusion, convection).
void modifier_matrice_pour_periodique_avant_contribuer(Matrice_Morse &matrice, const Equation_base &) const
divise les coefficients sur les ligne des faces periodiques par 2 en prevision de l'application modif...
void modifier_flux(const Operateur_base &) const
void modifier_pour_Cl(const Domaine_VEF &, const Domaine_Cl_VEF &, Matrice_Morse &, DoubleTab &) const
Modification des coef de la matrice et du second membre pour les conditions de Dirichlet.
classe Operateur_Diff_base Cette classe est la base de la hierarchie des operateurs representant
classe Operateur_base Classe est la base de la hierarchie des objets representant un
void ouvrir_fichier_partage(EcrFicPartage &, const Nom &, const int flag=1) const
Ouverture/creation d'un fichier d'impression d'un operateur A surcharger dans les classes derivees.
void ouvrir_fichier(SFichier &os, const Nom &, const int flag=1) const
Ouverture/creation d'un fichier d'impression d'un operateur A surcharger dans les classes derivees.
classe Periodique Cette classe represente une condition aux limites periodique.
int face_associee(int i) const
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
virtual const Milieu_base & milieu() const
Renvoie le milieu physique associe au probleme.
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
static void mp_sum_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
double temps_courant() const
Renvoie le temps courant.
void imprimer_temps_courant(SFichier &) const
Classe de base des flux de sortie.
classe Symetrie Sur les faces de symetrie on a les proprietes suivantes:
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_wo()
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_rw()
_SIZE_ dimension(int d) const