16#include <Dirichlet_entree_fluide_leaves.h>
17#include <Check_espace_virtuel.h>
18#include <Op_Div_VEFP1B_Elem.h>
19#include <Dirichlet_homogene.h>
20#include <Schema_Temps_base.h>
21#include <Porosites_champ.h>
22#include <Neumann_val_ext.h>
23#include <Domaine_Cl_VEF.h>
24#include <communications.h>
25#include <EcrFicPartage.h>
26#include <Probleme_base.h>
27#include <VerifierCoin.h>
28#include <Domaine_VEF.h>
29#include <Periodique.h>
44static int chercher_arete(
int elem,
int somi,
int somj,
const IntTab& elem_aretes,
const IntTab& aretes_som)
52 for (
int i_arete = 0; i_arete < 6; i_arete++)
54 int arete = elem_aretes(elem, i_arete);
55 int som1 = aretes_som(arete, 0);
58 int som2 = aretes_som(arete, 1);
74 Cerr <<
"div(1,..,1) = " << r << finl;
76 const DoubleTab& xv = domaine_VEF.
xv();
79 for (
int i = 0; i < v.dimension(0); i++)
84 Cerr <<
"div(x,0) = " << r << finl;
99 const Domaine& domaine = domaine_VEF.
domaine();
100 const DoubleTab& face_normales = domaine_VEF.
face_normales();
101 const IntTab& elem_faces = domaine_VEF.
elem_faces();
102 const IntTab& face_voisins = domaine_VEF.
face_voisins();
103 int nfe = domaine.nb_faces_elem();
104 int nb_elem = domaine.nb_elem();
107 CIntTabView elem_faces_v = elem_faces.
view_ro();
108 DoubleTabView div_v = div.
view_rw();
109 if (getenv(
"TRUST_USE_RANDOM_ACCESS")!=
nullptr)
112 RandomAccessView<int, 2> face_voisins_v = face_voisins.
view_ro();
113 RandomAccessView<double, 2> face_normales_v = face_normales.
view_ro();
114 RandomAccessView<double, 2> vit_v = vit.
view_ro();
115 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_elem, KOKKOS_LAMBDA(
119 for (
int indice = 0; indice < nfe; indice++)
121 int face = elem_faces_v(elem, indice);
122 int signe = elem == face_voisins_v(face, 0) ? 1 : -1;
123 for (
int comp = 0; comp < dim; comp++)
124 pscf += signe * vit_v(face, comp) * face_normales_v(face, comp);
126 div_v(elem, 0) += pscf;
131 CIntTabView face_voisins_v = face_voisins.
view_ro();
132 CDoubleTabView face_normales_v = face_normales.
view_ro();
133 CDoubleTabView vit_v = vit.
view_ro();
134 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_elem, KOKKOS_LAMBDA(
138 for (
int indice = 0; indice < nfe; indice++)
140 int face = elem_faces_v(elem, indice);
141 int signe = elem == face_voisins_v(face, 0) ? 1 : -1;
142 for (
int comp = 0; comp < dim; comp++)
143 pscf += signe * vit_v(face, comp) * face_normales_v(face, comp);
145 div_v(elem, 0) += pscf;
148 end_gpu_timer(__KERNEL_NAME__);
149 assert_invalide_items_non_calcules(div);
153int find_cl_face(
const Domaine& domaine,
const int face)
156 const int nb_cl = domaine.nb_front_Cl();
157 for (i = 0; i < nb_cl; i++)
159 const Frontiere& fr = domaine.frontiere(i);
161 if (face >= debut && face < debut + fr.
nb_faces())
164 const int nb_faces_virt = faces_virt.
size_array();
165 for (
int j = 0; j < nb_faces_virt; j++)
166 if (face == faces_virt[j])
174double calculer_coef_som(
int type_elem,
int dimension,
int& nb_face_diri,
int* indice_diri)
179 double coeff_som = 1. / (dimension * (dimension + 1));
220 else if (dimension == 3)
308 double coeff_som = 1. / (dimension * (dimension + 1 - nb_face_diri));
316 const Domaine& domaine = domaine_VEF.
domaine();
318 int nb_elem_tot = domaine.nb_elem_tot();
322 if (!som_initialized_)
324 som_initialized_ =
true;
325 const IntTab& som_elem = domaine.les_elems();
326 som_.resize(nb_elem_tot, nfe);
328 nb_degres_liberte_ = -1;
329 for (
int elem = 0; elem < nb_elem_tot; elem++)
330 for (
int indice = 0; indice < nfe; indice++)
332 int som = nps + domaine.get_renum_som_perio(som_elem(elem, indice));
333 nb_degres_liberte_(som - nps)++;
334 som_(elem, indice) = som;
336 corrige_sommets_sans_degre_liberte_ = (mp_min_vect(nb_degres_liberte_) == 0);
343 CDoubleTabView face_normales = domaine_VEF.
face_normales().view_ro();
344 CDoubleTabView vit = tab_vit.
view_ro();
346 CIntArrView type_elem_Cl = zcl.
type_elem_Cl().view_ro();
347 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
348 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
349 CIntTabView som_v = som_.view_ro();
350 DoubleArrView div =
static_cast<DoubleVect&
>(tab_div).view_rw();
351 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
352 range_1D(0, nb_elem_tot),
353 KOKKOS_LAMBDA (
const int elem)
356 for (
int comp = 0; comp < dim; comp++)
359 for (
int indice = 0; indice < nfe; indice++)
361 int face = elem_faces(elem, indice);
362 s += vit(face, comp);
367 double coeff_som = 1. / (dim * (dim + 1));
368 if (modif_traitement_diri)
371 int nb_face_diri = 0;
372 int rang_elem = (int)rang_elem_non_std(elem);
373 int type_elem = rang_elem < 0 ? 0 : (int)type_elem_Cl(rang_elem);
374 coeff_som = calculer_coef_som(type_elem, dim, nb_face_diri, indice_diri);
376 for (
int fdiri = 0; fdiri < nb_face_diri; fdiri++)
378 int indice = indice_diri[fdiri];
379 int face = elem_faces(elem,indice);
380 for (
int comp = 0; comp < dim; comp++)
381 sigma[comp] -= vit(face,comp);
385 for (
int indice = 0; indice < nfe; indice++)
387 int face = elem_faces(elem,indice);
389 for (
int comp = 0; comp < dim; comp++)
390 psc += sigma[comp] * face_normales(face,comp);
392 int som = som_v(elem,indice);
393 int signe = (elem != face_voisins(face,0) ? -1 : 1);
394 Kokkos::atomic_add(&div(som), signe * coeff_som * psc);
397 end_gpu_timer(__KERNEL_NAME__);
401 int nb_bords = les_cl.size();
404 IntArrView nb_degres_liberte = nb_degres_liberte_.view_rw();
405 DoubleTabView flux_b = tab_flux_b.
view_wo();
407 for (
int n_bord = 0; n_bord < nb_bords; n_bord++)
411 CIntArrView num_face = le_bord.
num_face().view_ro();
412 int nb_faces_bord = le_bord.
nb_faces();
421 CIntTabView face_sommets = domaine_VEF.
face_sommets().view_ro();
422 CIntArrView renum_som_perio = domaine.get_renum_som_perio().view_ro();
425 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
426 range_1D(0, nb_faces_bord_tot), KOKKOS_LAMBDA(
429 int face = num_face(ind_face);
431 for (
int comp = 0; comp < nb_comp; comp++)
432 flux += vit(face, comp) * face_normales(face, comp);
433 if (ind_face < nb_faces_bord)
434 flux_b(face, 0) = flux;
435 flux *= 1. / nb_comp;
436 for (
int indice = 0; indice < (nfe - 1); indice++)
438 int som = renum_som_perio(face_sommets(face, indice));
439 Kokkos::atomic_add(&div(nps + som), flux);
441 Kokkos::atomic_add(&nb_degres_liberte(som), 1);
444 end_gpu_timer(__KERNEL_NAME__);
449 CIntArrView face_associee = la_cl_perio.
face_associee().view_ro();
451 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
452 range_1D(0, nb_faces_bord_tot), KOKKOS_LAMBDA(
455 int face = num_face(ind_face);
456 int face_perio = num_face(face_associee(ind_face));
458 double flux_perio = 0.;
459 for (
int comp = 0; comp < nb_comp; comp++)
461 flux += vit(face, comp) * face_normales(face, comp);
462 flux_perio += vit(face_perio, comp) * face_normales(face_perio, comp);
464 if (ind_face < (nb_faces_bord / 2))
466 flux_b(face, 0) = -flux;
467 flux_b(face_perio, 0) = flux_perio;
470 end_gpu_timer(__KERNEL_NAME__);
480 const Domaine& domaine = domaine_VEF.
domaine();
481 const DoubleTab& face_normales = domaine_VEF.
face_normales();
482 const IntTab& som_elem = domaine.les_elems();
483 const IntTab& elem_faces = domaine_VEF.
elem_faces();
484 const IntTab& face_voisins = domaine_VEF.
face_voisins();
488 int nb_elem_tot = domaine.nb_elem_tot();
493 for (elem = 0; elem < nb_elem_tot; elem++)
495 for (
int isom = 0; isom < 3; isom++)
497 int somi = som_elem(elem, isom);
498 int facei = elem_faces(elem, isom);
500 if (face_voisins(facei, 0) != elem)
502 for (
int jsom = isom + 1; jsom < 4; jsom++)
504 int somj = som_elem(elem, jsom);
505 int facej = elem_faces(elem, jsom);
507 if (face_voisins(facej, 0) != elem)
509 int arete = renum_arete_perio[chercher_arete(elem, somi, somj, elem_aretes, aretes_som)];
513 for (
int ksom = 0; ksom < 4; ksom++)
515 if ((ksom == isom) || (ksom == jsom))
520 for (comp = 0; comp < 3; comp++)
521 psc += (signei * face_normales(facei, comp) + signej * face_normales(facej, comp)) * vit(elem_faces(elem, ksom), comp);
522 div(npa + arete) -= 1. / 15. * psc;
528 while ((niinij == jsom) || (niinij == isom))
531 assert(niinij != isom);
532 assert(niinij != jsom);
533 assert(niinij != ksom);
534 int facek = elem_faces(elem, niinij);
536 if (face_voisins(facek, 0) != elem)
539 for (comp = 0; comp < 3; comp++)
540 psc += signek * face_normales(facek, comp) * vit(elem_faces(elem, ksom), comp);
541 div(npa + arete) -= 2. / 15. * psc;
558 assert_espace_virtuel_vect(tab_velocity_tab);
560 assert_invalide_items_non_calcules(tab_div, 0.);
564 int nb_comp = tab_velocity_tab.
dimension(1);
565 for (
int n_bord = 0; n_bord < domaine_VEF.
nb_front_Cl(); n_bord++)
572 int nb_faces_bord = le_bord.
nb_faces();
573 CIntArrView face_associee = la_cl_perio.
face_associee().view_ro();
574 CIntArrView num_face = le_bord.
num_face().view_ro();
575 CDoubleTabView velocity_tab = tab_velocity_tab.
view_ro();
576 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(0, nb_faces_bord), KOKKOS_LAMBDA(
const int ind_face)
578 int ind_face_associee = face_associee(ind_face);
579 int face = num_face(ind_face);
580 int face_ass = num_face(ind_face_associee);
582 for (
int comp = 0; comp < nb_comp; comp++)
583 if (!est_egal(velocity_tab(face, comp), velocity_tab(face_ass, comp), 1.e-4))
586 Cerr <<
"vit1(" << face <<
"," << comp <<
")=" << velocity_tab(face, comp) << finl;
587 Cerr <<
"vit2(" << face_ass <<
"," << comp <<
")=" << velocity_tab(face_ass, comp) << finl;
588 Cerr <<
"Delta=" << velocity_tab(face, comp) - velocity_tab(face_ass, comp) << finl;
589 Cerr <<
"Periodic boundary condition is not correct in Op_Div_VEFP1B_Elem::ajouter" << finl;
590 Cerr <<
"Contact TRUST support." << finl;
595 end_gpu_timer(__KERNEL_NAME__);
600 DoubleTab phi_vitesse_face_;
601 const DoubleTab& vit = modif_par_porosite_si_flag(tab_velocity_tab, phi_vitesse_face_, 1, porosite_face);
609 ::verifier(*
this, init, domaine_VEF, vit, tab_div);
622 for (
const auto &itr : les_cl)
632 CIntArrView num_face = la_front_dis.
num_face().view_ro();
633 CIntTabView faces_sommets = domaine_VEF.
face_sommets().view_ro();
634 DoubleArrView div =
static_cast<DoubleVect&
>(tab_div).view_wo();
635 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
636 range_1D(0, nb_faces), KOKKOS_LAMBDA(
639 int face = num_face(ind_face);
640 for (
int som = 0; som < nsf; som++)
642 int som1 = faces_sommets(face, som);
643 div(nps + som1) = 0.;
646 end_gpu_timer(__KERNEL_NAME__);
650 if (domaine_VEF.
get_alphaS() && corrige_sommets_sans_degre_liberte_)
662for(
int isom=0; isom<3; isom++)
664 int somi = som_elem(elem,isom);
665 int facei = elem_faces(elem,isom);
667 if (face_voisins(facei,0) != elem)
669 for(
int jsom=isom+1; jsom<4; jsom++)
671 int somj = som_elem(elem,jsom);
672 int facej = elem_faces(elem,jsom);
674 if (face_voisins(facej,0) != elem)
676 int arete = chercher_arete(elem, somi, somj,
677 elem_aretes, aretes_som);
678 for(comp=0; comp<dimension; comp++)
679 gradK(comp) = (signei*face_normales(facei,comp)+
680 signej*face_normales(facej,comp));
682 for(comp=0; comp<dimension; comp++)
684 -signei*face_normales(facei,comp)*vit(facei,comp)
685 -signej*face_normales(facej,comp)*vit(facej,comp)
686 +.5*gradK(comp)*sigma[comp]);
696 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
698 CDoubleArrView vol = domaine_VEF.
volumes().view_ro();
699 DoubleArrView div =
static_cast<DoubleVect&
>(tab_div).view_rw();
700 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_elem, KOKKOS_LAMBDA(
const int i) { div(i) /= vol(i); });
701 end_gpu_timer(__KERNEL_NAME__);
717 DoubleArrView div =
static_cast<DoubleVect&
>(tab_div).view_rw();
718 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), size_tot, KOKKOS_LAMBDA(
const int i) { div(n + i) /= vol(i); });
719 end_gpu_timer(__KERNEL_NAME__);
726 ToDo_Kokkos(
"critical");
727 for (
int i = 0; i < size_tot; i++)
728 tab_div(n + i) /= vol(i);
737 const Domaine& domaine = domaine_VEF.
domaine();
738 const IntTab& elem_faces = domaine_VEF.
elem_faces();
739 const IntTab& face_voisins = domaine_VEF.
face_voisins();
740 const int nse = domaine.nb_som_elem();
744 int afficher_message = 0;
745 int nb_som = domaine.nb_som();
747 int ecrire_decoupage_som = 0;
748 int decoupage_som = 0;
755 decoup_som <<
"1" << finl;
758 for (
int k = 0; k < nb_som; k++)
760 int sommet = domaine.get_renum_som_perio(k);
761 if (nb_degres_liberte_(sommet) != 0)
763 if (!afficher_message)
765 afficher_message = 1;
766 Cerr << finl <<
"Problem with the mesh used for the VEF P1Bulle discretization." << finl;
767 journal <<
"List of nodes with no degrees of freedom :" << finl;
769 const double x = domaine.coord(sommet, 0);
770 const double y = domaine.coord(sommet, 1);
773 journal <<
"Error node " << sommet <<
" ( " << x <<
" " << y <<
" " << z <<
" )\n";
776 journal <<
"Elements ";
777 const int nb_elem_tot = domaine.nb_elem_tot();
778 const int nb_elem = domaine.nb_elem();
779 const IntTab& som_elem = domaine.les_elems();
780 for (
int elem = 0; elem < nb_elem_tot; elem++)
781 for (
int som = 0; som < nse; som++)
782 if (som_elem(elem, som) == sommet)
784 journal << elem << ((elem >= nb_elem) ?
"v " :
" ");
787 int face_opp = elem_faces(elem, som);
792 int elem1 = face_voisins(face_opp, 0);
793 int elem2 = face_voisins(face_opp, 1);
801 for (
int som1 = 0; som1 < nse; som1++)
804 for (
int som2 = 0; som2 < nse; som2++)
805 if (som_elem(elem, som2) == som_elem(elem_opp, som1))
808 somm(1) = som_elem(elem_opp, som1);
811 somm(i) = som_elem(elem_opp, som1);
817 ecrire_decoupage_som = 1;
819 decoup_som << somm(j) <<
" ";
820 decoup_som << elem <<
" " << elem_opp << finl;
827 journal <<
"\nFaces ";
828 const int nb_faces = domaine_VEF.
nb_faces();
829 const int nb_som_face = domaine_VEF.
face_sommets().dimension(1);
830 for (
int face = 0; face < nb_faces_tot; face++)
832 for (
int som = 0; som < nb_som_face; som++)
837 if (face >= nb_faces)
839 const int cl = find_cl_face(domaine, face);
843 const Nom& nom_bord = domaine.frontiere(cl).
le_nom();
844 journal <<
"(boundary=" << nom_bord <<
")";
853 if (ecrire_decoupage_som)
857 fic << decoup_som.
get_str() << finl;
861 if (afficher_message)
864 Cerr <<
"Look at the .log file of processor " <<
Process::me() <<
" to know which nodes" << finl;
865 Cerr <<
"do not have enough degrees of freedom. You can also visualize" << finl;
866 Cerr <<
"your mesh to identify which elements have a problem and" << finl;
867 Cerr <<
"remesh your domain close to these nodes so that these have" << finl;
868 Cerr <<
"at least a degree of freedom." << finl;
869 Cerr <<
"The VEF P1Bulle discretization is not compatible with this type" << finl;
870 Cerr <<
"of mesh and boundary conditions used (Dirichlet, Symmetry ,...)" << finl << finl;
871 Cerr <<
"Other possibility, in your data file:" << finl;
873 Cerr <<
"If you have used \"Trianguler\", substituted by \"Trianguler_H\"." << finl << finl;
875 Cerr <<
"If you have used \"Tetraedriser\", substituted by \"Tetraedriser_homogene\" or \"Tetraedriser_par_prisme\"." << finl << finl;
876 Cerr <<
"Or insert the line:" << finl;
877 Cerr <<
"VerifierCoin " << domaine.le_nom() <<
" { [Read_file " << nom_fichier <<
".decoupage_som] }" << finl;
878 Cerr <<
"after the mesh is finished to be read and built." << finl;
880 Cerr <<
"and BEFORE the keyword \"Decouper\" during the partition of the mesh." << finl;
882 Cerr <<
"and BEFORE the keyword \"Discretiser\"." << finl;
883 Cerr <<
"A few cells will be divided into 3 (2D) or 4 (3D)." << finl;
891 const int impr_bord = (le_dom_vef->domaine().bords_a_imprimer().est_vide() ? 0 : 1);
897 DoubleVect bilan(nb_compo);
899 int nb_cl = le_dom_vef->nb_front_Cl();
901 DoubleTrav tab_flux_bords(3, nb_cl, nb_compo);
902 for (
int num_cl = 0; num_cl < nb_cl; num_cl++)
904 const Cond_lim& la_cl = la_zcl_vef->les_conditions_limites(num_cl);
907 int nfin = ndeb + frontiere_dis.
nb_faces();
908 int perio = (sub_type(
Periodique,la_cl.valeur()) ? 1 : 0);
909 for (
int face = ndeb; face < nfin; face++)
910 for (
int k = 0; k < nb_compo; k++)
912 tab_flux_bords(0, num_cl, k) +=
flux_bords_(face, k);
915 if (face < (ndeb + frontiere_dis.
nb_faces() / 2))
916 tab_flux_bords(1, num_cl, k) +=
flux_bords_(face, k);
918 tab_flux_bords(2, num_cl, k) +=
flux_bords_(face, k);
930 for (
int num_cl = 0; num_cl < nb_cl; num_cl++)
932 const Cond_lim& la_cl = la_zcl_vef->les_conditions_limites(num_cl);
933 int perio = (sub_type(
Periodique,la_cl.valeur()) ? 1 : 0);
934 for (
int k = 0; k < nb_compo; k++)
938 Flux_div.add_col(tab_flux_bords(1, num_cl, k));
939 Flux_div.add_col(tab_flux_bords(2, num_cl, k));
942 Flux_div.add_col(tab_flux_bords(0, num_cl, k));
943 bilan(k) += tab_flux_bords(0, num_cl, k);
947 for (
int k = 0; k < nb_compo; k++)
952 const LIST(
Nom) &Liste_bords_a_imprimer = le_dom_vef->domaine().bords_a_imprimer();
953 if (!Liste_bords_a_imprimer.est_vide())
957 for (
int num_cl = 0; num_cl < nb_cl; num_cl++)
959 const Frontiere_dis_base& la_fr = la_zcl_vef->les_conditions_limites(num_cl)->frontiere_dis();
960 const Cond_lim& la_cl = la_zcl_vef->les_conditions_limites(num_cl);
963 int nfin = ndeb + frontiere_dis.
nb_faces();
964 if (le_dom_vef->domaine().bords_a_imprimer().contient(la_fr.
le_nom()))
966 Flux_face <<
"# Flux par face sur " << la_fr.
le_nom() <<
" au temps " << temps <<
" : " << finl;
967 for (
int face = ndeb; face < nfin; face++)
970 Flux_face <<
"# Face a x= " << le_dom_vef->xv(face, 0) <<
" y= " << le_dom_vef->xv(face, 1) <<
" flux=";
972 Flux_face <<
"# Face a x= " << le_dom_vef->xv(face, 0) <<
" y= " << le_dom_vef->xv(face, 1) <<
" z= " << le_dom_vef->xv(face, 2) <<
" flux=";
973 for (
int k = 0; k < nb_compo; k++)
classe Cond_lim Classe generique servant a representer n'importe quelle classe
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
static void verifier(const char *const msg, double)
classe Dirichlet_entree_fluide Cette classe represente une condition aux limite imposant une grandeur
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_t nb_elem_tot() const
const IntTab_t & aretes_som() const
renvoie le tableau de connectivite aretes/sommets.
const Frontiere_t & frontiere(int i) const
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
int_t elem_aretes(int_t i, int j) const
renvoie le numero de la jeme arete du ieme element.
int_t nb_som_tot() const
Renvoie le nombre total de sommets du domaine i.e. le nombre de sommets reels et virtuels sur le proc...
int type_elem_Cl(int i) const
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.
int numero_premiere_arete() const
const IntVect & get_ok_arete() const
IntVect & rang_elem_non_std()
int numero_premier_sommet() const
const DoubleVect & get_volumes_aretes() const
int get_modif_div_face_dirichlet() const
int get_cl_pression_sommet_faible() const
const ArrOfInt & get_renum_arete_perio() const
const DoubleVect & volume_aux_sommets() const
int nb_faces() const
renvoie le nombre global de faces.
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
double volumes(int i) const
int face_sommets(int i, int j) const
renvoie le numero du ieme sommet de la face num_face.
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
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 :
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Sortie & syncfile() override
Provoque l'ecriture sur disque des donnees accumulees sur les differents processeurs depuis le dernie...
Class defining operators and methods for all reading operation in an input flow (file,...
virtual const Milieu_base & milieu() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
int num_premiere_face() const
int num_face(const int) const
const ArrOfInt_t & get_faces_virt() const
int_t num_premiere_face() const
int_t nb_faces() const
Renvoie le nombre de faces de la frontiere.
classe Frontiere_dis_base Classe representant une frontiere discretisee.
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
DoubleVect & porosite_face()
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Classe Neumann_val_ext Cette classe est la classe de base de la hierarchie des conditions.
Classe Neumann Cette classe est la classe de base de la hierarchie des conditions aux limites de type...
class Nom Une chaine de caractere pour nommer les objets de TRUST
const Nom & le_nom() const override
Renvoie *this;.
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
static const Nom & nom_du_cas()
Renvoie une reference constante vers le nom du cas.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
void volumique(DoubleTab &) const override
int impr(Sortie &os) const override
DOES NOTHING - to override in derived classes.
DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const override
public_for_cuda void volumique_P0(DoubleTab &) const
void degres_liberte() const
DoubleTab & ajouter_aretes(const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter_elem(const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter_som(const DoubleTab &, DoubleTab &, DoubleTab &) const
void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &) override
Classe Operateur_Div_base Cette classe est la base de la hierarchie des operateurs representant.
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
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
static KOKKOS_INLINE_FUNCTION void Kokkos_exit(const char *)
Routine de sortie de TRUST dans une region Kokkos.
static void mp_sum_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
static bool is_parallel()
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
static int me()
renvoie mon rang dans le groupe de communication courant.
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),...
static bool is_sequential()
Cette classe derivee de Sortie empile ce qu'on lui envoie dans une chaine de caracteres.
const char * get_str() const
returns a copy of the string stored by the SChaine
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
double temps_courant() const
Renvoie le temps courant.
Classe de base des flux de sortie.
classe Symetrie Sur les faces de symetrie on a les proprietes suivantes:
_SIZE_ size_array() const
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_wo()
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_rw()
_SIZE_ dimension(int d) const
_SIZE_ size_totale() const