16#include <Assembleur_P_VEFPreP1B.h>
17#include <Matrice_Bloc_Sym.h>
20#include <Dirichlet_homogene.h>
21#include <Dirichlet_entree_fluide_leaves.h>
22#include <Neumann_sortie_libre.h>
23#include <Milieu_base.h>
24#include <Navier_Stokes_std.h>
25#include <TRUSTLists.h>
26#include <Op_Grad_VEF_P1B_Face.h>
27#include <Op_Div_VEFP1B_Elem.h>
29#include <Champ_Fonc_P1NC.h>
30#include <SolveurPP1B.h>
31#include <Check_espace_virtuel.h>
32#include <Solv_Petsc.h>
34#include <Matrice_Petsc.h>
51static double estim_cond(
Matrice& A)
53 int i=A.valeur( ).nb_lignes();
55 DoubleVect p(A.valeur( ).nb_lignes());
56 for(
int j=0; j<i; j++)
58 double normep=sqrt(mp_prodscal(p,p));
60 DoubleVect r(A.valeur( ).nb_lignes());
61 double lmax=1.e-36, lmin=1.e24;
67 A.valeur( ).multvect(p,r);
68 double pscpr=mp_prodscal(p,r);
70 double pscrr=mp_prodscal(r,r);
71 double epsilon=-pscpr/pscrr;
73 double normepbis=sqrt(mp_prodscal(p,p));
83 if (A.valeur( ).nb_lignes()<30) A.valeur( ).imprimer_formatte(Cerr);
108 const DoubleTab& inverse_quantitee_entrelacee);
113 const DoubleTab& inverse_quantitee_entrelacee,
const ArrOfDouble& coef_som);
117 Matrice& matrice,
const DoubleTab& inverse_quantitee_entrelacee);
121 Matrice& matrice,
const DoubleTab& inverse_quantitee_entrelacee,
const ArrOfDouble& coef_som);
126 const DoubleTab& inverse_quantitee_entrelacee);
131 const DoubleTab& inverse_quantitee_entrelacee,
const ArrOfDouble& coef_som);
136 const DoubleTab& inverse_quantitee_entrelacee);
141 const DoubleTab& inverse_quantitee_entrelacee,
const ArrOfDouble& coef_som);
145 const DoubleTab& inverse_quantitee_entrelacee,
const ArrOfDouble& coef_som);
149 const DoubleTab& inverse_quantitee_entrelacee);
154 const DoubleTab& inverse_quantitee_entrelacee,
const ArrOfDouble& coef_som);
159 const DoubleTab& inverse_quantitee_entrelacee);
164 const DoubleTab& inverse_quantitee_entrelacee,
const ArrOfDouble& coef_som);
169 const DoubleTab& inverse_quantitee_entrelacee);
181 Cerr <<
"The mass density is not at faces in Assembleur_P_VEFPreP1B::assembler_rho_variable." << finl;
185 const DoubleVect& masse_volumique=rho.
valeurs();
186 DoubleVect quantitee_entrelacee(volumes_entrelaces);
188 for (
int i=0; i<size; i++)
189 quantitee_entrelacee(i)=(volumes_entrelaces(i)*masse_volumique(i));
197 int nombre_supports = matrice.
ordre();
198 for(
int i=0; i<nombre_supports; i++)
199 for(
int j=i; j<nombre_supports; j++)
221 if (solveur_pression->read_matrix())
223 la_matrice.typer(
"Matrice_Petsc");
228 Cerr <<
"Assembling pressure matrix" << (domaine_vef.
get_alphaE() ?
" P0" :
"")
229 << (domaine_vef.
get_alphaS() ?
" P1" :
"") << (domaine_vef.
get_alphaA() ?
" Pa" :
"") <<
" in progress..." << finl;
239 <<
" is not enough for assembling VEFPreP1B pressure matrix" << finl;
240 Cerr <<
"for parallel calculation. Partition your mesh with larg_joint option set to 2." << finl;
244 DoubleTab inverse_quantitee_entrelacee;
250 int nombre_supports = Pa + domaine_vef.
get_alphaA();
255 for (
int elem = 0; elem < coef_som.
size_totale(); elem++)
261 Matrice la_matrice_de_travail_;
262 la_matrice_de_travail_.typer(
"Matrice_Bloc_Sym");
266 la_matrice_bloc_sym_de_travail.
dimensionner(nombre_supports, nombre_supports);
268 assemblerP0P0(domaine_vef, domaine_Cl_VEF, la_matrice_bloc_sym_de_travail.
get_bloc(P0, P0),
269 inverse_quantitee_entrelacee);
272 assemblerP1P1(domaine_vef, domaine_Cl_VEF, la_matrice_bloc_sym_de_travail.
get_bloc(P1, P1),
273 inverse_quantitee_entrelacee, coef_som);
276 assemblerP0P1(domaine_vef, domaine_Cl_VEF, la_matrice_bloc_sym_de_travail.
get_bloc(P0, P1),
277 inverse_quantitee_entrelacee, coef_som);
280 assemblerPaPa(domaine_vef, domaine_Cl_VEF, la_matrice_bloc_sym_de_travail.
get_bloc(Pa, Pa),
281 inverse_quantitee_entrelacee);
284 assemblerP1Pa(domaine_vef, domaine_Cl_VEF, la_matrice_bloc_sym_de_travail.
get_bloc(P1, Pa),
285 inverse_quantitee_entrelacee, coef_som);
288 assemblerP0Pa(domaine_vef, domaine_Cl_VEF, la_matrice_bloc_sym_de_travail.
get_bloc(P0, Pa),
289 inverse_quantitee_entrelacee);
295 zero(la_matrice_bloc_sym_de_travail);
298 updateP0P0(domaine_vef, domaine_Cl_VEF, la_matrice_bloc_sym_de_travail.
get_bloc(P0, P0),
299 inverse_quantitee_entrelacee);
303 updateP1P1(domaine_vef, domaine_Cl_VEF, la_matrice_bloc_sym_de_travail.
get_bloc(P1, P1),
304 inverse_quantitee_entrelacee, coef_som);
306 modifieP1P1neumann(domaine_vef, domaine_Cl_VEF, la_matrice_bloc_sym_de_travail.
get_bloc(P1, P1),
307 inverse_quantitee_entrelacee, coef_som);
310 updateP0P1(domaine_vef, domaine_Cl_VEF, la_matrice_bloc_sym_de_travail.
get_bloc(P0, P1),
311 inverse_quantitee_entrelacee, coef_som);
314 updatePaPa(domaine_vef, domaine_Cl_VEF, la_matrice_bloc_sym_de_travail.
get_bloc(Pa, Pa),
315 inverse_quantitee_entrelacee);
318 updateP1Pa(domaine_vef, domaine_Cl_VEF, la_matrice_bloc_sym_de_travail.
get_bloc(P1, Pa),
319 inverse_quantitee_entrelacee, coef_som);
322 updateP0Pa(domaine_vef, domaine_Cl_VEF, la_matrice_bloc_sym_de_travail.
get_bloc(P0, Pa),
323 inverse_quantitee_entrelacee);
329 char *theValue = getenv(
"TRUST_VERIFIE_MATRICE_VEF");
330 if (theValue !=
nullptr) verifier(*
this, la_matrice_bloc_sym_de_travail, domaine_vef, inverse_quantitee_entrelacee);
344 if (ref_cast(
Navier_Stokes_std, mon_equation.valeur()).solveur_pression()->supporte_matrice_morse_sym() &&
358 la_matrice.typer(
"Matrice_Morse_Sym");
359 ref_cast(
Matrice_Bloc_Sym, la_matrice_de_travail_.valeur()).BlocSymToMatMorseSym(
369 la_matrice = la_matrice_de_travail_;
370 for (
int i = 0; i < nombre_supports; i++)
371 for (
int j = i; j < nombre_supports; j++)
382 if (
changement_base() && solveur_pression->que_suis_je() !=
"SolveurPP1B")
384 SolveurSys solveur_pression_lu = solveur_pression;
385 solveur_pression.typer(
"SolveurPP1B");
387 solveur_pression_PP1B.
associer(*
this, solveur_pression_lu);
393 char* theValue2 = getenv(
"TRUST_CONDITIONNEMENT_MATRICE");
394 if(theValue2 !=
nullptr)
395 Cout <<
"Estimation of the matrix condition number: " << estim_cond(la_matrice)<<finl;
413 ToDo_Kokkos(
"critical");
414 for(
int i=0; i<nb_aretes; i++)
415 if(!ok_arete[i] && b(npa+i)!=0.)
417 Cerr <<
"Pb div Edges, the pressure on edge " << i <<
" (which is superfluous) is not zero." << finl;
420 else if ( (renum_arete_perio[i]!=i) && b(npa+i)!=0.)
422 Cerr <<
"Pb div Periodic Edges, the pressure on edge " << i <<
" (which is periodic) is not zero." << finl;
431 const Domaine& dom=le_dom.
domaine();
435 CDoubleArrView b_v =
static_cast<const DoubleVect&
>(b).view_ro();
436 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), ns, KOKKOS_LAMBDA(
439 int k=renum_som_perio(i);
440 if((k!=i)&& b_v(nps+i)!=0.)
442 printf(
"Pb div Som, the pressure on vertex %ld (which is periodic) is not zero.\n",(
long)i);
443 printf(
"In plain terms, the right-hand side is not zero on a periodic vertex.\n");
444 if (b_v(nps+i)!=b_v(nps+k))
446 printf(
"Moreover, the right-hand side does not have the same value on the 2 periodic vertices.\n");
447 printf(
"b(nps+i)=%f <> b(nps+k)=%f\n",b_v(nps+i),b_v(nps+k));
449 Kokkos::abort(
"There is a probability that the model used is poorly implemented for\na periodicity condition. Contact TRUST support.");
452 end_gpu_timer(__KERNEL_NAME__);
467 DoubleTrav tab_Gpoint(
equation().inconnue().valeurs());
468 DoubleTabView Gpoint = tab_Gpoint.
view_wo();
472 for (
int cond_lim=0; cond_lim<nb_cond_lim; cond_lim++)
480 const int nfin = ndeb+front_VF.
nb_faces();
487 CDoubleArrView arr_gpoint =
static_cast<const DoubleVect&
>(champ_front.
derivee_en_temps()).view_ro();
490 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(ndeb, nfin),
491 KOKKOS_LAMBDA(
const int num_face)
493 for (
int dim=0; dim<dimension_; dim++)
494 Gpoint(num_face,dim) = porosite_face(num_face) * (ch_unif ? arr_gpoint(dim) : gpoint(num_face-ndeb,dim));
496 end_gpu_timer(__KERNEL_NAME__);
530 for (
int cond_lim=0; cond_lim<nb_cond_lim; cond_lim++)
542 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
543 CDoubleTabView face_normales = domaine_VEF.
face_normales().view_ro();
544 CDoubleTabView Gpoint = tab_Gpoint.
view_ro();
545 CIntArrView front_num_face = front_VF.
num_face().view_ro();
546 DoubleArrView b =
static_cast<DoubleVect&
>(tab_b).view_rw();
547 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_faces_bord_tot, KOKKOS_LAMBDA(
const int ind_face)
549 const int num_face = front_num_face(ind_face);
550 const int elem = face_voisins(num_face,0);
553 for (
int dim=0; dim<dimension_; dim++)
554 Kokkos::atomic_add(&b(elem), -Gpoint(num_face,dim)*face_normales(num_face,dim));
556 end_gpu_timer(__KERNEL_NAME__);
567 const Domaine& domaine = domaine_VEF.
domaine();
570 const int nb_elem_tot = (domaine_VEF.
get_alphaE()?domaine.nb_elem_tot():0);
571 const int nb_faces_elem = domaine.nb_faces_elem();
575 for (
int cond_lim=0; cond_lim<nb_cond_lim; cond_lim++)
588 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
589 CIntTabView face_sommets = domaine_VEF.
face_sommets().view_ro();
590 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
591 CIntTabView elem_sommets = domaine.les_elems().view_ro();
592 CDoubleTabView face_normales = domaine_VEF.
face_normales().view_ro();
593 CDoubleTabView Gpoint = tab_Gpoint.
view_ro();
594 CIntArrView renum_som_perio = domaine.get_renum_som_perio().view_ro();
595 CIntArrView front_num_face = front_VF.
num_face().view_ro();
596 DoubleArrView b =
static_cast<DoubleVect&
>(tab_b).view_rw();
597 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_faces_bord_tot, KOKKOS_LAMBDA(
const int ind_face)
600 const int num_face = front_num_face(ind_face);
601 const int elem = face_voisins(num_face,0);
605 for (
int i_sigma = 0; i_sigma < 3; ++i_sigma)
608 for (
int face_loc=0; face_loc<nb_faces_elem; face_loc++)
610 const int face = elem_faces(elem,face_loc);
612 for(
int comp=0; comp<dimension_; comp++)
613 sigma[comp] += Gpoint(face, comp);
617 for(
int face_loc=0; face_loc<nb_faces_elem; face_loc++)
619 const int som = nb_elem_tot + renum_som_perio(elem_sommets(elem,face_loc));
620 const int face = elem_faces(elem,face_loc);
624 if(elem != face_voisins(face,0)) signe=-1.;
626 for(
int comp=0; comp<dimension_; comp++)
627 psc += sigma[comp]*face_normales(face,comp);
629 Kokkos::atomic_add(&b(som), -signe*psc/coeff_dim);
633 for (
int comp=0; comp<dimension_; comp++)
634 flux += Gpoint(num_face,comp) * face_normales(num_face,comp) ;
637 for(
int som_loc=0; som_loc<nb_faces_elem-1; som_loc++)
639 const int som = nb_elem_tot + renum_som_perio(face_sommets(num_face,som_loc));
641 Kokkos::atomic_add(&b(som), -flux);
645 end_gpu_timer(__KERNEL_NAME__);
670 int nb_aretes=ok_arete.
size();
672 for(
int i=0; i<nb_aretes; i++)
674 if(!ok_arete(i) && tab_pression(npa+i)!=0.)
676 Cerr <<
"Pb: pressure on superfluous edge, P(" << npa+i <<
")=" << tab_pression(npa+i) << finl;
677 tab_pression(npa+i)=0;
680 else if ( (renum_arete_perio[i]!=i) && tab_pression(npa+i)!=0.)
682 Cerr <<
"Pb: pressure on superfluous periodic edge, P(" << npa+i <<
")=" << tab_pression(npa+i) << finl;
683 tab_pression(npa+i)=0;
692 const Domaine& dom=le_dom.
domaine();
696 DoubleArrView pression =
static_cast<DoubleVect&
>(tab_pression).view_rw();
697 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
698 Kokkos::RangePolicy<>(0, ns), KOKKOS_LAMBDA(
701 int k=renum_som_perio(i);
702 if (k!=i) pression(nps+i)=pression(nps+k);
704 end_gpu_timer(__KERNEL_NAME__);
711 char* theValue = getenv(
"TRUST_VERIFIE_DIRICHLET");
721 Cerr <<
"Assembleur_P_VEFPreP1B::verifier_dirichlet does not yet work with your discretization" << finl;
726 IntVect Faces_de_Dirichlet(
domaine_Vef().nb_elem_tot());
730 Faces_de_Dirichlet=0;
731 const Conds_lim& les_cl = le_dom_Cl_VEF->les_conditions_limites();
732 for(
int i=0; i<les_cl.size(); i++)
737 int num2 = num1 + le_bord.
nb_faces();
738 if ((sub_type(
Dirichlet, la_cl.valeur()))
741 for (
int face=num1; face<num2; face++)
746 Faces_de_Dirichlet(elem)++;
747 if (faces(elem,0)==-1) faces(elem,0)=face;
748 else faces(elem,1)=face;
752 if (elem!=-1) Faces_de_Dirichlet(elem)++;
756 DoubleVect& post=ref_cast(
Navier_Stokes_std,mon_equation.valeur()).div().valeurs();
758 for (
int elem=0; elem<Faces_de_Dirichlet.
size_array(); elem++)
761 if (Faces_de_Dirichlet(elem)>1)
763 Cerr <<
"Element " << elem <<
" has " << Faces_de_Dirichlet(elem) <<
" Dirichlet faces separated by a ";
767 for (
int k=0; k<6; k++)
771 int S0=aretes_som(arete,0);
772 int S1=aretes_som(arete,1);
776 for (
int l=0; l<2; l++)
778 int face=faces(elem,l);
779 for (
int s=0; s<3; s++)
781 if (face_sommets(face,s)==S0) ok++;
782 if (face_sommets(face,s)==S1) ok++;
785 if (ok==4) Cerr <<
"edge " << (ok_arete(arete)==0?
"superfluous":
"") << finl;
787 post(elem)+=(ok_arete(arete)==0);
798 Cerr <<
"Assembleur_P_VEFPreP1B::projete_L2 only works in P0+P1+Pa mode" << finl;
803 const Domaine& domaine = domaine_vef.
domaine();
805 int ns=domaine.nb_som_tot();
806 int nb_elem=domaine.nb_elem();
809 const DoubleVect& volumes=domaine_vef.
volumes();
812 int nsr=nb_elem_tot+ns;
813 int nse=domaine.nb_som_elem();
814 for(i=nb_elem_tot; i<nsr; i++)
817 for(i=nb_elem_tot; i<nsr; i++)
821 for(i=0; i<nb_elem; i++)
823 double p=pression(i);
826 p+=pression(nb_elem_tot+som_elem(i,j))*dalpha;
831 for(i=0; i<nb_elem; i++)
844 int matrice_modifiee=0;
846 const Conds_lim& les_cl = le_dom_Cl_VEF->les_conditions_limites();
849 for(
int i=0; i<les_cl.size(); i++)
858 for (
int n=0; n<nbval; n++)
861 Cerr <<
"Non-zero imposed pressure boundary condition is not yet" << finl;
862 Cerr <<
"supported in VEF with edge support Pa." << finl;
903 int sommet_referent=0;
904 double distance=DMAXFLOAT;
907 for(
int i=0; i<nb_som; i++)
911 tmp+=coord(i,j)*coord(i,j);
912 if (inf_strict(tmp,distance) && !est_egal(A11RR(i,i),0.))
919 A11RR(sommet_referent,sommet_referent)*=2;
937 int arete_referente=0;
938 double distance=DMAXFLOAT;
939 const DoubleTab& coord=domaine_VEF.
xa();
941 for(
int i=0; i<nb_aretes; i++)
945 tmp+=coord(i,j)*coord(i,j);
946 if (tmp<distance && A22RR(i,i)!=0)
953 A22RR(arete_referente,arete_referente)*=2;
966 return matrice_modifiee;
989 const IntTab& les_elems=domaine.les_elems();
990 const Domaine& dom=domaine;
1003 const auto* tab1=A00ij.
get_tab1().addr();
1004 const int* tab2=A00ij.
get_tab2().addr();
1005 const double* coeff=A00ij.
get_coeff().addr();
1008 for (
int i=0; i<nb_lignes; i++)
1011 for (
auto n=tab1[i]-1; n<tab1[i+1]-1; n++)
1013 int k2=colonne+tab2[n]-1;
1016 double prod = beta * beta * coeff[n];
1017 for (
int som1=0; som1<nb_som_elem; som1++)
1020 for (
int som2=0; som2<nb_som_elem; som2++)
1023 if (s2>=s1) range(prod,s1,nb_som,s2,nb_som,A11RR,A11RV,A11VR,A11VV);
1028 for (
int som1=0; som1<nb_som_elem; som1++)
1031 for (
int som2=0; som2<nb_som_elem; som2++)
1034 if (s2>=s1) range(prod,s1,nb_som,s2,nb_som,A11RR,A11RV,A11VR,A11VV);
1041 colonne+=nb_colonnes;
1055 const auto* tab1=A01ij.
get_tab1().addr();
1056 const int* tab2=A01ij.
get_tab2().addr();
1057 const double* coeff=A01ij.
get_coeff().addr();
1060 for (
int i=0; i<nb_lignes; i++)
1063 for (
auto n=tab1[i]-1; n<tab1[i+1]-1; n++)
1066 double prod = -beta * coeff[n];
1067 for (
int som=0; som<nb_som_elem; som++)
1070 if (s2>=s1) range(prod,s1,nb_som,s2,nb_som,A11RR,A11RV,A11VR,A11VV);
1071 if (s1>=s2) range(prod,s2,nb_som,s1,nb_som,A11RR,A11RV,A11VR,A11VV);
1075 colonne+=nb_colonnes;
1088 const IntTab& les_elems=domaine.les_elems();
1089 const Domaine& dom=domaine;
1102 const auto* tab1=A00ij.
get_tab1().addr();
1103 const int* tab2=A00ij.
get_tab2().addr();
1104 const double* coeff=A00ij.
get_coeff().addr();
1108 for (
int i=0; i<nb_lignes; i++)
1111 for (
auto n=tab1[i]-1; n<tab1[i+1]-1; n++)
1113 int k2=colonne+tab2[n]-1;
1116 double prod = -alpha * beta * coeff[n];
1117 for (
int som=0; som<nb_som_elem; som++)
1120 range(prod,k1,nb_elem,s,nb_som,A01RR,A01RV,A01VR,A01VV);
1124 range(prod,k2,nb_elem,s,nb_som,A01RR,A01RV,A01VR,A01VV);
1130 colonne+=nb_colonnes;
1139 Cerr <<
"Basis change for the matrix: P0+P1->P1Bulle" << finl;
1173 assert(check_espace_virtuel_vect(x));
1181 assert(check_espace_virtuel_vect(x));
1184template<vecteur _v_>
1191 double beta =
beta_;
1196 DoubleArrView v = tab_v.view_rw();
1197 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_elem_tot, KOKKOS_LAMBDA(
const int k)
1199 if (_v_==vecteur::pression) v(k) /= alpha;
1201 for (
int som=0; som<nb_som_elem; som++)
1203 int s = nb_elem_tot + renum_som_perio(les_elems(k, som));
1204 if (_v_==vecteur::pression) somme += v(s);
1205 if (_v_==vecteur::pression_inverse) somme += v(s);
1206 if (_v_==vecteur::second_membre) Kokkos::atomic_sub(&v(s), beta * v(k));
1208 if (_v_==vecteur::pression) v(k) += beta / alpha * somme;
1209 if (_v_==vecteur::pression_inverse) v(k) = alpha * v(k) - beta * somme;
1210 if (_v_==vecteur::second_membre) v(k) *= alpha;
1212 end_gpu_timer(__KERNEL_NAME__);
const Equation_base & equation() const
int modifier_solution(DoubleTab &) override
void changer_base_second_membre(DoubleVect &)
void changer_base_pression_inverse(DoubleVect &)
void changer_base_matrice(Matrice &)
int assembler_mat(Matrice &, const DoubleVect &, int incr_pression, int resoudre_en_u) override
void changer_base_pression(DoubleVect &)
int changement_base() const
int modifier_secmem_aretes(const DoubleTab &, DoubleTab &)
int modifier_secmem_elem(const DoubleTab &, DoubleTab &)
int modifier_secmem_som(const DoubleTab &, DoubleTab &)
int assembler_rho_variable(Matrice &, const Champ_Don_base &) override
Assembly of the matrix div(porosity/rho * grad P) The type of the "rho" field to be provided depends ...
void changer_base(DoubleVect &v)
const Domaine_VEF & domaine_Vef() const
int modifier_secmem(DoubleTab &) override
int assembler(Matrice &) override
int modifier_matrice(Matrice &) override
Optionally modify the matrix to make it definite if it is not. Default values:
void verifier_dirichlet()
void projete_L2(DoubleTab &)
void completer(const Equation_base &) override
virtual int modifier_matrice(Matrice &)
Optionally modifies the matrix to make it definite if it is not.
void calculer_inv_volume(DoubleTab &inv_volumes_entrelaces, const Domaine_Cl_VEF &domaine_Cl_VEF, const DoubleVect &volumes_entrelaces)
int modifier_solution(DoubleTab &) override
int assembler(Matrice &) override
void completer(const Equation_base &) override
int get_resoudre_en_u() const
Returns the value of the resoudre_en_u_ flag (0 or 1) Returns -1 if the flag has not been initialized...
int set_resoudre_en_u(int flag)
Sets the value of the resoudre_en_u__ flag.
int set_resoudre_increment_pression(int flag)
Sets the value of the resoudre_increment_pression_ flag.
class Champ_Don_base base class of Given Fields (not calculated)
DoubleTab & valeurs() override
Overrides Champ_base::valeurs() Returns the array of values.
class Champ_front_base Base class for the hierarchy of boundary fields.
virtual const DoubleTab & derivee_en_temps() const
virtual bool instationnaire() const
class Cond_lim_base Base class for the hierarchy of classes that represent the different boundary con...
virtual Frontiere_dis_base & frontiere_dis()
Returns the discretized boundary to which the boundary conditions apply.
Champ_front_base & champ_front()
class Cond_lim Generic class used to represent any class
class Conds_lim This class represents a vector of boundary conditions.
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.
virtual void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
Creates a parallel array of values at elements.
int_t get_renum_som_perio(int_t i) const
int_t nb_aretes() const
Returns the number of real edges.
const DoubleTab_t & coord_sommets() const
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() const
Returns the number of vertices of the domain.
class Domaine_Cl_dis_base Domaine_Cl_dis_base objects represent discretized boundary conditions
int nb_cond_lim() const
Returns the number of 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
int numero_premier_sommet() const
int get_cl_pression_sommet_faible() const
const ArrOfInt & get_renum_arete_perio() const
DoubleVect & volumes_entrelaces()
double xa(int num_arete, int k) const
virtual double face_normales(int face, int comp) 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.
class Domaine_dis_base This class is the base of the hierarchy of discretized domains.
const Domaine & domaine() const
Entree_fluide_vitesse_imposee Special case of the class Dirichlet_entree_fluide.
Class defining operators and methods for all reading operation in an input flow (file,...
class Equation_base The role of an equation is the calculation of one or more fields....
virtual const Milieu_base & milieu() const =0
int num_premiere_face() const
int num_face(const int) const
const Matrice & get_bloc(int i, int j) const override
void dimensionner(int N, int M) override
int nb_bloc_lignes() const
int ordre() const override
If square matrix, returns number of lines, otherwise 0.
int nb_bloc_colonnes(void) const
virtual const Matrice & get_bloc(int i, int j) const
Matrice_Morse_Sym class - Represents a sparse symmetric matrix M stored in Morse format.
Matrice_Morse class - Represents a (sparse) matrix M, not necessarily square,.
const auto & get_tab2() const
const auto & get_tab1() const
int nb_colonnes() const override
Return local number of columns (=size on the current proc).
const auto & get_coeff() const
int nb_lignes() const override
Return local number of lines (=size on the current proc).
void set_est_definie(int)
int get_est_definie() const
Matrice class - Generic class in the matrix hierarchy.
DoubleVect & porosite_face()
const Equation_base & equation() const
Returns the reference to the equation pointed to by MorEqn::mon_equation.
Navier_Stokes_std This class carries the terms of the momentum equation.
Neumann_sortie_libre This class represents an open boundary without imposed velocity.
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
static double calculer_coef_som(int elem, const Domaine_Cl_VEF &zcl, const Domaine_VEF &domaine_VEF)
static double mp_min(double)
static double mp_max(double)
static bool is_parallel()
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.
Class Robin_VEF for Robin boundary conditions.
int associer(const Assembleur_P_VEFPreP1B &, const SolveurSys &)
class SolveurSys A SolveurSys represents any class
Base class for output streams.
_SIZE_ size_array() const
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 >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
_SIZE_ dimension(int d) const
_SIZE_ size_totale() const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")