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])
173double calculer_coef_som(
int type_elem,
int dimension,
int& nb_face_diri,
int* indice_diri)
178 double coeff_som = 1. / (dimension * (dimension + 1));
219 else if (dimension == 3)
307 double coeff_som = 1. / (dimension * (dimension + 1 - nb_face_diri));
315 const Domaine& domaine = domaine_VEF.
domaine();
317 int nb_elem_tot = domaine.nb_elem_tot();
321 if (!som_initialized_)
323 som_initialized_ =
true;
324 const IntTab& som_elem = domaine.les_elems();
325 som_.resize(nb_elem_tot, nfe);
327 nb_degres_liberte_ = -1;
328 for (
int elem = 0; elem < nb_elem_tot; elem++)
329 for (
int indice = 0; indice < nfe; indice++)
331 int som = nps + domaine.get_renum_som_perio(som_elem(elem, indice));
332 nb_degres_liberte_(som - nps)++;
333 som_(elem, indice) = som;
335 corrige_sommets_sans_degre_liberte_ = (mp_min_vect(nb_degres_liberte_) == 0);
342 CDoubleTabView face_normales = domaine_VEF.
face_normales().view_ro();
343 CDoubleTabView vit = tab_vit.
view_ro();
345 CIntArrView type_elem_Cl = zcl.
type_elem_Cl().view_ro();
346 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
347 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
348 CIntTabView som_v = som_.view_ro();
349 DoubleArrView div =
static_cast<DoubleVect&
>(tab_div).view_rw();
350 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
351 range_1D(0, nb_elem_tot),
352 KOKKOS_LAMBDA (
const int elem)
355 for (
int comp = 0; comp < dim; comp++)
358 for (
int indice = 0; indice < nfe; indice++)
360 int face = elem_faces(elem, indice);
361 s += vit(face, comp);
366 double coeff_som = 1. / (dim * (dim + 1));
367 if (modif_traitement_diri)
370 int nb_face_diri = 0;
371 int rang_elem = (int)rang_elem_non_std(elem);
372 int type_elem = rang_elem < 0 ? 0 : (int)type_elem_Cl(rang_elem);
373 coeff_som = calculer_coef_som(type_elem, dim, nb_face_diri, indice_diri);
375 for (
int fdiri = 0; fdiri < nb_face_diri; fdiri++)
377 int indice = indice_diri[fdiri];
378 int face = elem_faces(elem,indice);
379 for (
int comp = 0; comp < dim; comp++)
380 sigma[comp] -= vit(face,comp);
384 for (
int indice = 0; indice < nfe; indice++)
386 int face = elem_faces(elem,indice);
388 for (
int comp = 0; comp < dim; comp++)
389 psc += sigma[comp] * face_normales(face,comp);
391 int som = som_v(elem,indice);
392 int signe = (elem != face_voisins(face,0) ? -1 : 1);
393 Kokkos::atomic_add(&div(som), signe * coeff_som * psc);
396 end_gpu_timer(__KERNEL_NAME__);
400 int nb_bords = les_cl.size();
403 IntArrView nb_degres_liberte = nb_degres_liberte_.view_rw();
404 DoubleTabView flux_b = tab_flux_b.
view_wo();
406 for (
int n_bord = 0; n_bord < nb_bords; n_bord++)
410 CIntArrView num_face = le_bord.
num_face().view_ro();
411 int nb_faces_bord = le_bord.
nb_faces();
420 CIntTabView face_sommets = domaine_VEF.
face_sommets().view_ro();
421 CIntArrView renum_som_perio = domaine.get_renum_som_perio().view_ro();
424 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
425 range_1D(0, nb_faces_bord_tot), KOKKOS_LAMBDA(
428 int face = num_face(ind_face);
430 for (
int comp = 0; comp < nb_comp; comp++)
431 flux += vit(face, comp) * face_normales(face, comp);
432 if (ind_face < nb_faces_bord)
433 flux_b(face, 0) = flux;
434 flux *= 1. / nb_comp;
435 for (
int indice = 0; indice < (nfe - 1); indice++)
437 int som = renum_som_perio(face_sommets(face, indice));
438 Kokkos::atomic_add(&div(nps + som), flux);
440 Kokkos::atomic_add(&nb_degres_liberte(som), 1);
443 end_gpu_timer(__KERNEL_NAME__);
448 CIntArrView face_associee = la_cl_perio.
face_associee().view_ro();
450 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
451 range_1D(0, nb_faces_bord_tot), KOKKOS_LAMBDA(
454 int face = num_face(ind_face);
455 int face_perio = num_face(face_associee(ind_face));
457 double flux_perio = 0.;
458 for (
int comp = 0; comp < nb_comp; comp++)
460 flux += vit(face, comp) * face_normales(face, comp);
461 flux_perio += vit(face_perio, comp) * face_normales(face_perio, comp);
463 if (ind_face < (nb_faces_bord / 2))
465 flux_b(face, 0) = -flux;
466 flux_b(face_perio, 0) = flux_perio;
469 end_gpu_timer(__KERNEL_NAME__);
479 const Domaine& domaine = domaine_VEF.
domaine();
480 const DoubleTab& face_normales = domaine_VEF.
face_normales();
481 const IntTab& som_elem = domaine.les_elems();
482 const IntTab& elem_faces = domaine_VEF.
elem_faces();
483 const IntTab& face_voisins = domaine_VEF.
face_voisins();
487 int nb_elem_tot = domaine.nb_elem_tot();
492 for (elem = 0; elem < nb_elem_tot; elem++)
494 for (
int isom = 0; isom < 3; isom++)
496 int somi = som_elem(elem, isom);
497 int facei = elem_faces(elem, isom);
499 if (face_voisins(facei, 0) != elem)
501 for (
int jsom = isom + 1; jsom < 4; jsom++)
503 int somj = som_elem(elem, jsom);
504 int facej = elem_faces(elem, jsom);
506 if (face_voisins(facej, 0) != elem)
508 int arete = renum_arete_perio[chercher_arete(elem, somi, somj, elem_aretes, aretes_som)];
512 for (
int ksom = 0; ksom < 4; ksom++)
514 if ((ksom == isom) || (ksom == jsom))
519 for (comp = 0; comp < 3; comp++)
520 psc += (signei * face_normales(facei, comp) + signej * face_normales(facej, comp)) * vit(elem_faces(elem, ksom), comp);
521 div(npa + arete) -= 1. / 15. * psc;
527 while ((niinij == jsom) || (niinij == isom))
530 assert(niinij != isom);
531 assert(niinij != jsom);
532 assert(niinij != ksom);
533 int facek = elem_faces(elem, niinij);
535 if (face_voisins(facek, 0) != elem)
538 for (comp = 0; comp < 3; comp++)
539 psc += signek * face_normales(facek, comp) * vit(elem_faces(elem, ksom), comp);
540 div(npa + arete) -= 2. / 15. * psc;
557 assert_espace_virtuel_vect(tab_velocity_tab);
559 assert_invalide_items_non_calcules(tab_div, 0.);
563 int nb_comp = tab_velocity_tab.
dimension(1);
564 for (
int n_bord = 0; n_bord < domaine_VEF.
nb_front_Cl(); n_bord++)
571 int nb_faces_bord = le_bord.
nb_faces();
572 CIntArrView face_associee = la_cl_perio.
face_associee().view_ro();
573 CIntArrView num_face = le_bord.
num_face().view_ro();
574 CDoubleTabView velocity_tab = tab_velocity_tab.
view_ro();
575 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(0, nb_faces_bord), KOKKOS_LAMBDA(
const int ind_face)
577 int ind_face_associee = face_associee(ind_face);
578 int face = num_face(ind_face);
579 int face_ass = num_face(ind_face_associee);
581 for (
int comp = 0; comp < nb_comp; comp++)
582 if (!est_egal(velocity_tab(face, comp), velocity_tab(face_ass, comp), 1.e-4))
585 Cerr <<
"vit1(" << face <<
"," << comp <<
")=" << velocity_tab(face, comp) << finl;
586 Cerr <<
"vit2(" << face_ass <<
"," << comp <<
")=" << velocity_tab(face_ass, comp) << finl;
587 Cerr <<
"Delta=" << velocity_tab(face, comp) - velocity_tab(face_ass, comp) << finl;
588 Cerr <<
"Periodic boundary condition is not correct in Op_Div_VEFP1B_Elem::ajouter" << finl;
589 Cerr <<
"Contact TRUST support." << finl;
594 end_gpu_timer(__KERNEL_NAME__);
599 DoubleTab phi_vitesse_face_;
600 const DoubleTab& vit = modif_par_porosite_si_flag(tab_velocity_tab, phi_vitesse_face_, 1, porosite_face);
608 ::verifier(*
this, init, domaine_VEF, vit, tab_div);
621 for (
const auto &itr : les_cl)
631 CIntArrView num_face = la_front_dis.
num_face().view_ro();
632 CIntTabView faces_sommets = domaine_VEF.
face_sommets().view_ro();
633 DoubleArrView div =
static_cast<DoubleVect&
>(tab_div).view_wo();
634 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
635 range_1D(0, nb_faces), KOKKOS_LAMBDA(
638 int face = num_face(ind_face);
639 for (
int som = 0; som < nsf; som++)
641 int som1 = faces_sommets(face, som);
642 div(nps + som1) = 0.;
645 end_gpu_timer(__KERNEL_NAME__);
649 if (domaine_VEF.
get_alphaS() && corrige_sommets_sans_degre_liberte_)
661for(
int isom=0; isom<3; isom++)
663 int somi = som_elem(elem,isom);
664 int facei = elem_faces(elem,isom);
666 if (face_voisins(facei,0) != elem)
668 for(
int jsom=isom+1; jsom<4; jsom++)
670 int somj = som_elem(elem,jsom);
671 int facej = elem_faces(elem,jsom);
673 if (face_voisins(facej,0) != elem)
675 int arete = chercher_arete(elem, somi, somj,
676 elem_aretes, aretes_som);
677 for(comp=0; comp<dimension; comp++)
678 gradK(comp) = (signei*face_normales(facei,comp)+
679 signej*face_normales(facej,comp));
681 for(comp=0; comp<dimension; comp++)
683 -signei*face_normales(facei,comp)*vit(facei,comp)
684 -signej*face_normales(facej,comp)*vit(facej,comp)
685 +.5*gradK(comp)*sigma[comp]);
695 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
697 CDoubleArrView vol = domaine_VEF.
volumes().view_ro();
698 DoubleArrView div =
static_cast<DoubleVect&
>(tab_div).view_rw();
699 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_elem, KOKKOS_LAMBDA(
const int i) { div(i) /= vol(i); });
700 end_gpu_timer(__KERNEL_NAME__);
716 DoubleArrView div =
static_cast<DoubleVect&
>(tab_div).view_rw();
717 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), size_tot, KOKKOS_LAMBDA(
const int i) { div(n + i) /= vol(i); });
718 end_gpu_timer(__KERNEL_NAME__);
725 ToDo_Kokkos(
"critical");
726 for (
int i = 0; i < size_tot; i++)
727 tab_div(n + i) /= vol(i);
736 const Domaine& domaine = domaine_VEF.
domaine();
737 const IntTab& elem_faces = domaine_VEF.
elem_faces();
738 const IntTab& face_voisins = domaine_VEF.
face_voisins();
739 const int nse = domaine.nb_som_elem();
743 int afficher_message = 0;
744 int nb_som = domaine.nb_som();
746 int ecrire_decoupage_som = 0;
747 int decoupage_som = 0;
754 decoup_som <<
"1" << finl;
757 for (
int k = 0; k < nb_som; k++)
759 int sommet = domaine.get_renum_som_perio(k);
760 if (nb_degres_liberte_(sommet) != 0)
762 if (!afficher_message)
764 afficher_message = 1;
765 Cerr << finl <<
"Problem with the mesh used for the VEF P1Bulle discretization." << finl;
766 journal <<
"List of nodes with no degrees of freedom :" << finl;
768 const double x = domaine.coord(sommet, 0);
769 const double y = domaine.coord(sommet, 1);
772 journal <<
"Error node " << sommet <<
" ( " << x <<
" " << y <<
" " << z <<
" )\n";
775 journal <<
"Elements ";
776 const int nb_elem_tot = domaine.nb_elem_tot();
777 const int nb_elem = domaine.nb_elem();
778 const IntTab& som_elem = domaine.les_elems();
779 for (
int elem = 0; elem < nb_elem_tot; elem++)
780 for (
int som = 0; som < nse; som++)
781 if (som_elem(elem, som) == sommet)
783 journal << elem << ((elem >= nb_elem) ?
"v " :
" ");
786 int face_opp = elem_faces(elem, som);
791 int elem1 = face_voisins(face_opp, 0);
792 int elem2 = face_voisins(face_opp, 1);
800 for (
int som1 = 0; som1 < nse; som1++)
803 for (
int som2 = 0; som2 < nse; som2++)
804 if (som_elem(elem, som2) == som_elem(elem_opp, som1))
807 somm(1) = som_elem(elem_opp, som1);
810 somm(i) = som_elem(elem_opp, som1);
816 ecrire_decoupage_som = 1;
818 decoup_som << somm(j) <<
" ";
819 decoup_som << elem <<
" " << elem_opp << finl;
826 journal <<
"\nFaces ";
827 const int nb_faces = domaine_VEF.
nb_faces();
828 const int nb_som_face = domaine_VEF.
face_sommets().dimension(1);
829 for (
int face = 0; face < nb_faces_tot; face++)
831 for (
int som = 0; som < nb_som_face; som++)
836 if (face >= nb_faces)
838 const int cl = find_cl_face(domaine, face);
842 const Nom& nom_bord = domaine.frontiere(cl).
le_nom();
843 journal <<
"(boundary=" << nom_bord <<
")";
852 if (ecrire_decoupage_som)
856 fic << decoup_som.
get_str() << finl;
860 if (afficher_message)
863 Cerr <<
"Look at the .log file of processor " <<
Process::me() <<
" to know which nodes" << finl;
864 Cerr <<
"do not have enough degrees of freedom. You can also visualize" << finl;
865 Cerr <<
"your mesh to identify which elements have a problem and" << finl;
866 Cerr <<
"remesh your domain close to these nodes so that these have" << finl;
867 Cerr <<
"at least a degree of freedom." << finl;
868 Cerr <<
"The VEF P1Bulle discretization is not compatible with this type" << finl;
869 Cerr <<
"of mesh and boundary conditions used (Dirichlet, Symmetry ,...)" << finl << finl;
870 Cerr <<
"Other possibility, in your data file:" << finl;
872 Cerr <<
"If you have used \"Trianguler\", substituted by \"Trianguler_H\"." << finl << finl;
874 Cerr <<
"If you have used \"Tetraedriser\", substituted by \"Tetraedriser_homogene\" or \"Tetraedriser_par_prisme\"." << finl << finl;
875 Cerr <<
"Or insert the line:" << finl;
876 Cerr <<
"VerifierCoin " << domaine.le_nom() <<
" { [Read_file " << nom_fichier <<
".decoupage_som] }" << finl;
877 Cerr <<
"after the mesh is finished to be read and built." << finl;
879 Cerr <<
"and BEFORE the keyword \"Decouper\" during the partition of the mesh." << finl;
881 Cerr <<
"and BEFORE the keyword \"Discretiser\"." << finl;
882 Cerr <<
"A few cells will be divided into 3 (2D) or 4 (3D)." << finl;
890 const int impr_bord = (le_dom_vef->domaine().bords_a_imprimer().est_vide() ? 0 : 1);
896 DoubleVect bilan(nb_compo);
898 int nb_cl = le_dom_vef->nb_front_Cl();
900 DoubleTrav tab_flux_bords(3, nb_cl, nb_compo);
901 for (
int num_cl = 0; num_cl < nb_cl; num_cl++)
903 const Cond_lim& la_cl = la_zcl_vef->les_conditions_limites(num_cl);
906 int nfin = ndeb + frontiere_dis.
nb_faces();
907 int perio = (sub_type(
Periodique,la_cl.valeur()) ? 1 : 0);
908 for (
int face = ndeb; face < nfin; face++)
909 for (
int k = 0; k < nb_compo; k++)
911 tab_flux_bords(0, num_cl, k) +=
flux_bords_(face, k);
914 if (face < (ndeb + frontiere_dis.
nb_faces() / 2))
915 tab_flux_bords(1, num_cl, k) +=
flux_bords_(face, k);
917 tab_flux_bords(2, num_cl, k) +=
flux_bords_(face, k);
929 for (
int num_cl = 0; num_cl < nb_cl; num_cl++)
931 const Cond_lim& la_cl = la_zcl_vef->les_conditions_limites(num_cl);
932 int perio = (sub_type(
Periodique,la_cl.valeur()) ? 1 : 0);
933 for (
int k = 0; k < nb_compo; k++)
937 Flux_div.add_col(tab_flux_bords(1, num_cl, k));
938 Flux_div.add_col(tab_flux_bords(2, num_cl, k));
941 Flux_div.add_col(tab_flux_bords(0, num_cl, k));
942 bilan(k) += tab_flux_bords(0, num_cl, k);
946 for (
int k = 0; k < nb_compo; k++)
951 const LIST(
Nom) &Liste_bords_a_imprimer = le_dom_vef->domaine().bords_a_imprimer();
952 if (!Liste_bords_a_imprimer.est_vide())
956 for (
int num_cl = 0; num_cl < nb_cl; num_cl++)
958 const Frontiere_dis_base& la_fr = la_zcl_vef->les_conditions_limites(num_cl)->frontiere_dis();
959 const Cond_lim& la_cl = la_zcl_vef->les_conditions_limites(num_cl);
962 int nfin = ndeb + frontiere_dis.
nb_faces();
963 if (le_dom_vef->domaine().bords_a_imprimer().contient(la_fr.
le_nom()))
965 Flux_face <<
"# Flux par face sur " << la_fr.
le_nom() <<
" au temps " << temps <<
" : " << finl;
966 for (
int face = ndeb; face < nfin; face++)
969 Flux_face <<
"# Face a x= " << le_dom_vef->xv(face, 0) <<
" y= " << le_dom_vef->xv(face, 1) <<
" flux=";
971 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=";
972 for (
int k = 0; k < nb_compo; k++)
class Cond_lim Generic class used to represent any class
class Conds_lim This class represents a vector of boundary conditions.
static void verifier(const char *const msg, double)
Dirichlet_entree_fluide This class represents a boundary condition imposing a quantity.
Classe Dirichlet_homogene This class is the base class of the hierarchy of homogeneous Dirichlet-type...
Dirichlet This class is the base class of the hierarchy of Dirichlet-type boundary conditions.
int_t nb_elem_tot() const
const IntTab_t & aretes_som() const
returns the connectivity array edges/vertices.
const Frontiere_t & frontiere(int i) const
int nb_faces_elem(int=0) const
Returns the number of faces of type i of the geometric elements that make up the domain.
int_t elem_aretes(int_t i, int j) const
returns the number of the j-th edge of the i-th element.
int_t nb_som_tot() const
Returns the total number of vertices of the domain i.e. the number of real and virtual vertices on th...
int type_elem_Cl(int i) const
class Domaine_Cl_dis_base Domaine_Cl_dis_base objects represent discretized boundary conditions
const Cond_lim & les_conditions_limites(int) const
Returns the i-th boundary condition.
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
Returns the total number of faces.
int nb_faces_tot() const
Returns the total number of 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
Returns the index of the i-th vertex of face num_face.
int elem_faces(int i, int j) const
Returns the index of the i-th face of element num_elem; the face numbering convention is.
int face_voisins(int num_face, int i) const
Returns the neighbouring element of num_face in direction i.
int nb_faces_bord() const
Returns the number of faces on which boundary conditions are applied:
class Domaine_dis_base This class is the base of the hierarchy of discretized domains.
const Domaine & domaine() const
Sortie & syncfile() override
Triggers writing to disk of the data accumulated on the different processors since the last call to s...
Class defining operators and methods for all reading operation in an input flow (file,...
virtual const Milieu_base & milieu() const =0
Probleme_base & probleme()
Returns the problem associated with the 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
Returns the number of faces of the boundary.
class Frontiere_dis_base Class representing a discretized boundary.
const Nom & le_nom() const override
Returns the name of the geometric boundary.
DoubleVect & porosite_face()
const Equation_base & equation() const
Returns the reference to the equation pointed to by MorEqn::mon_equation.
Classe Neumann_val_ext This class is the base class of the hierarchy of.
Classe Neumann This class is the base class of the hierarchy of Neumann-type boundary conditions.
class Nom: a character string for naming TRUST objects.
const Nom & le_nom() const override
Returns *this.
const Nom & que_suis_je() const
Returns the string identifying the class.
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
static const Nom & nom_du_cas()
Returns a constant reference to the case name. This method is static.
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
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 This class is the base of the hierarchy of operators representing.
void ouvrir_fichier_partage(EcrFicPartage &, const Nom &, const int flag=1) const
Opening/creation of a shared file for printing an operator. To override in derived classes.
void ouvrir_fichier(SFichier &os, const Nom &, const int flag=1) const
Opening/creation of a file for printing an operator. To override in derived classes.
class Periodique This class represents a periodic boundary condition.
int face_associee(int i) const
const Schema_Temps_base & schema_temps() const
Returns the time scheme associated with the problem.
static KOKKOS_INLINE_FUNCTION void Kokkos_exit(const char *)
Exit routine for TRUST within a Kokkos region.
static void mp_sum_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
static bool is_parallel()
static Sortie & Journal(int message_level=0)
Returns a static Sortie object used as an event journal.
static int me()
Returns the rank of the local processor in the current communication group. See Comm_Group::rank() an...
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
static int je_suis_maitre()
Returns 1 if on the master processor of the current group (i.e. me() == 0), 0 otherwise.
static bool is_sequential()
This class, derived from Sortie, accumulates what is sent to it into a character string.
const char * get_str() const
returns a copy of the string stored by the SChaine
SFichier is to the C++ ofstream class what Sortie is to the C++ ostream class.
double temps_courant() const
Returns the current time.
Base class for output streams.
Symetrie On symmetry faces, the following properties hold:
_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