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 <<
"La masse volumique n'est pas aux faces dans 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 <<
"Assemblage de la matrice de pression" << (domaine_vef.
get_alphaE() ?
" P0" :
"")
229 << (domaine_vef.
get_alphaS() ?
" P1" :
"") << (domaine_vef.
get_alphaA() ?
" Pa" :
"") <<
" en cours..." << 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 du conditionnement de la matrice: " << 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 Aretes, la pression sur l'arete " << i <<
" (qui est superflue) n'est pas nulle." << finl;
420 else if ( (renum_arete_perio[i]!=i) && b(npa+i)!=0.)
422 Cerr <<
"Pb div Aretes Perio, la pression sur l'arete " << i <<
" (qui est periodique) n'est pas nulle." << 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, la pression sur le sommet %ld (qui est periodique) n'est pas nulle.\n",(
long)i);
443 printf(
"En terme clair, le second membre n'est pas nul sur un sommet periodique.\n");
444 if (b_v(nps+i)!=b_v(nps+k))
446 printf(
"En outre, le second membre n'a pas la meme valeur sur les 2 sommets periodiques.\n");
447 printf(
"b(nps+i)=%f <> b(nps+k)=%f\n",b_v(nps+i),b_v(nps+k));
449 Kokkos::abort(
"Il y'a probabilite que le modele utilise soit mal implemente pour\nune condition de periodicite. Contacter le support TRUST.");
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 pression arete superflue, 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 pression arete superflue periodique, 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 ne fonctionne pas encore avec votre discretisation" << 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 <<
"L'element " << elem <<
" a " << Faces_de_Dirichlet(elem) <<
" faces de Dirichlet separees par une ";
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 <<
"arete " << (ok_arete(arete)==0?
"superflue":
"") << finl;
787 post(elem)+=(ok_arete(arete)==0);
798 Cerr <<
"Assembleur_P_VEFPreP1B::projete_L2 ne fonctionne qu'en P0+P1+Pa" << 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 <<
"La condition limite pression imposee non nulle n'est pas encore" << finl;
862 Cerr <<
"supportee en VEF avec support arete 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 <<
"Changement de base pour la matrice: 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
Assemblage de la matrice div( porosite/rho * grad P ) Le type du champ "rho" a fournir depend de la d...
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
Modifier eventuellement la matrice pour la rendre definie si elle ne l'est pas Valeurs par defaut:
void verifier_dirichlet()
void projete_L2(DoubleTab &)
void completer(const Equation_base &) override
virtual int modifier_matrice(Matrice &)
Modifier eventuellement la matrice pour la rendre definie si elle ne l'est pas Valeurs par defaut:
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
Renvoie la valeur du drapeau resoudre_en_u_ (0 ou 1) Renvoie -1 si le drapeau n'a pas ete initialise.
int set_resoudre_en_u(int flag)
Definit la valeur du drapeau resoudre_en_u__.
int set_resoudre_increment_pression(int flag)
Definit la valeur du drapeau resoudre_increment_pression_.
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
classe Champ_front_base Classe de base pour la hierarchie des champs aux frontieres.
virtual const DoubleTab & derivee_en_temps() const
virtual bool instationnaire() const
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.
Champ_front_base & champ_front()
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_t nb_elem_tot() const
const IntTab_t & aretes_som() const
renvoie le tableau de connectivite aretes/sommets.
virtual void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
creation d'un tableau parallele de valeurs aux elements.
int_t get_renum_som_perio(int_t i) const
int_t nb_aretes() const
Renvoie le nombre d'aretes reelles.
const DoubleTab_t & coord_sommets() const
int_t elem_aretes(int_t i, int j) const
renvoie le numero de la jeme arete du ieme element.
int_t nb_som() const
Renvoie le nombre de sommets du domaine.
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
int nb_cond_lim() const
Renvoie le nombre de 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
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
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.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
classe Entree_fluide_vitesse_imposee Cas particulier de la classe Dirichlet_entree_fluide
Class defining operators and methods for all reading operation in an input flow (file,...
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
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
Classe Matrice_Morse_Sym 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
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
Classe Matrice Classe generique de la hierarchie des matrices.
DoubleVect & porosite_face()
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
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()
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.
Class Robin_VEF for Robin boundary conditions.
int associer(const Assembleur_P_VEFPreP1B &, const SolveurSys &)
class SolveurSys Un SolveurSys represente n'importe qu'elle classe
Classe de base des flux de sortie.
_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")