16#include <Paroi_std_hyd_VEF.h>
17#include <Champ_Q1NC.h>
18#include <Champ_P1NC.h>
19#include <Fluide_base.h>
20#include <Champ_Uniforme.h>
21#include <Dirichlet_paroi_fixe.h>
22#include <Dirichlet_paroi_defilante.h>
23#include <Periodique.h>
24#include <Static_Int_Lists.h>
27#include <EcrFicPartage.h>
28#include <Modele_turbulence_hyd_Longueur_Melange_base.h>
29#include <Neumann_sortie_libre.h>
30#include <Modele_turbulence_hyd_combinaison.h>
32#include <Paroi_rugueuse.h>
34#include <Paroi_decalee_Robin.h>
35#include <Schema_Temps_base.h>
36#include <communications.h>
84 param.dictionnaire(
"toutes_les_faces_accrochees", 1);
85 param.dictionnaire(
"que_les_faces_des_elts_dirichlet", 4);
86 param.dictionnaire(
"que_les_faces_des_elts_dirichlet_et_test_distance", 5);
91 param.lire_avec_accolades_depuis(s);
94 mot_test =
"u_star_impose";
96 if (param.get_list_mots_lus().rang(Motcle(mot_test))!=-1)
114bool compute_u_plus(
const int ind_face,
115 const double u_plus_d_plus,
118 double& r,
int& iter,
double& u_plus)
124 if(u_plus_d_plus < 1.)
126 u_plus = sqrt(u_plus_d_plus);
129 u_plus = u_plus_d_plus/100.;
130 const double seuil = 0.001;
131 const int itmax = 25;
132 const double A = (1/Kappa)*log(erugu/Kappa) ;
137 while((iter++ < itmax) && (r > seuil))
139 const double d_plus = u_plus_d_plus/u_plus;
140 const double u_plus2 = (1./Kappa)*log(1. + Kappa*d_plus)
141 + A*(1. - exp(-d_plus/11.) - exp(-d_plus/3.)*d_plus/11.);
142 u_plus = 0.5*(u_plus + u_plus2);
143 r = std::fabs(u_plus - u_plus2)/u_plus;
145 return (iter < itmax);
147#pragma clang optimize off
149double calculer_u_plus_kokkos(
const int ind_face,
const double u_plus_d_plus,
const double erugu,
const double Kappa, DoubleArrView seuil_LP, IntArrView iterations_LP)
153 if (!compute_u_plus(ind_face, u_plus_d_plus, erugu, Kappa, r, iter, u_plus))
156 Kokkos::printf(
"u+d+= %f \n", u_plus_d_plus);
157 Kokkos::abort(
"The iterative process of u* did not converge!");
159 Process::exit(
"The iterative process of u* did not converge!");
162 seuil_LP(ind_face) = r;
163 iterations_LP(ind_face) = iter;
166#pragma clang optimize on
169int compute_k_eps(
double& k,
double& eps ,
170 const double yp,
const double u_star,
171 const double d_visco,
const double dist,
const double Cmu,
const double Kappa)
175 const double u_star_carre = u_star * u_star;
176 k = 0.07*yp*yp*(exp(-yp/9.));
177 k += 1./sqrt(Cmu)*(1. - exp(-yp/20.))*(1. - exp(-yp/20.));
180 eps = 1./(Kappa*pow(yp*yp*yp*yp+50625, 0.25));
181 eps *= u_star_carre*u_star_carre/d_visco;
187 const double u_plus_d_plus,
190 double r {0.0}, u_plus {0.0};
192 if (!compute_u_plus(ind_face, u_plus_d_plus, erugu,
Kappa_, r, iter, u_plus))
193 erreur_non_convergence();
203 uplus_.resize(le_dom_dis_->nb_faces_tot());
209 seuil_LP_.resize(le_dom_dis_->nb_faces_tot());
221 Cmu_ = mon_modele_turb_hyd->get_Cmu();
231void remplir_face_keps_imposee_gen(
int& flag_face_keps_imposee_,
232 IntVect& face_keps_imposee_,
233 int& methode_calcul_face_keps_impose_,
238 if (flag_face_keps_imposee_==0)
240 flag_face_keps_imposee_=1;
241 Cerr<<
"construction de fac_keps_imposee_ par la methode generale"<<finl;
247 face_keps_imposee_=-2;
252 ArrOfInt face_bords_diri(nb_faces_tot);
253 for (
int n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
258 (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE"))
264 for (
int ind_face=ndeb; ind_face<nfin; ind_face++)
266 face_bords_diri[compt++]= le_bord.
num_face(ind_face);
270 face_bords_diri.resize_array(compt);
274 ArrOfInt is_sommet_sur_bord(domaine_VEF.
nb_som_tot());
276 int nb_som_face=face_sommets.
line_size();
277 for (
int fac=0; fac<compt; fac++)
279 int face=face_bords_diri[fac];
280 for (
int som=0; som<nb_som_face; som++)
282 int sommet=face_sommets(face,som);
283 is_sommet_sur_bord[sommet]++;
293 Static_Int_Lists som_face_bord;
295 is_sommet_sur_bord=0;
296 for (
int fac=0; fac<compt; fac++)
298 int face=face_bords_diri[fac];
299 for (
int som=0; som<nb_som_face; som++)
301 int sommet=face_sommets(face,som);
302 int n=(is_sommet_sur_bord[sommet])++;
311 ArrOfInt traite_face(nb_faces_tot);
312 if (methode_calcul_face_keps_impose_==5)
316 const IntTab& face_voisins = domaine_VEF.
face_voisins();
319 for (
int n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
324 (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE"))
327 const IntTab& elem_faces = domaine_VEF.
elem_faces();
331 for (
int ind_face=ndeb; ind_face<nfin; ind_face++)
333 int num_face = le_bord.
num_face(ind_face);
334 int elem = face_voisins(num_face,0);
335 for (
int i=0; i<nb_faces_elem; i++)
336 traite_face[elem_faces(elem,i)]=1;
344 assert(methode_calcul_face_keps_impose_==1);
346 const DoubleTab& xv=domaine_VEF.
xv();
347 for (
int ind_face=0; ind_face<nb_faces_tot; ind_face++)
348 if (traite_face[ind_face])
352 for (
int som=0; som<nb_som_face; som++)
354 int sommet=face_sommets(ind_face,som);
355 if (is_sommet_sur_bord[sommet])
358 int test_size=test.size();
376 int f_pos=som_face_bord(test[0],i);
378 for (
int lis=1; lis<test_size; lis++)
384 int f2=som_face_bord(som,k);
385 if (f2==f_pos) ok2=1;
389 if (ok==1) possible.
add(f_pos);
398 if ((possible.
size()==0))
401 for (
int k=0; k<test_size; k++)
404 int f_pos=som_face_bord(test[k],i);
410 assert(possible.
size());
411 int combien_de_face_possible=possible.
size();
423 if (combien_de_face_possible==1)
424 face_keps_imposee_[ind_face]=possible[0];
431 int size_initiale = possible.
size();
432 while (pos<size_initiale)
434 int new_pos = pos-elem_suppr;
435 int f_new_pos=possible[new_pos];
437 double dist2=distance_face(ind_face,f_new_pos,domaine_VEF);
440 dist+=(xv(f_new_pos,dir)-xv(ind_face,dir))*(xv(f_new_pos,dir)-xv(ind_face,dir));
444 possible.
suppr(f_new_pos);
450 if (possible.
size()!=0)
456 DoubleTab coord_possible;
457 DoubleVect coord_ref;
458 int size_liste = possible.
size();
459 coord_possible.
resize(size_liste,dimension,RESIZE_OPTIONS::NOCOPY_NOINIT);
460 coord_ref.
resize(dimension,RESIZE_OPTIONS::NOCOPY_NOINIT);
461 coord_ref(0) = xv(ind_face,0);
462 coord_ref(1) = xv(ind_face,1);
464 coord_ref(2) = xv(ind_face,2);;
466 for (
int i_face=0; i_face<size_liste; i_face++)
468 int f_pos = possible[i_face];
469 for (
int dir=0; dir<dimension; dir++)
470 coord_possible(i_face,dir) = xv(f_pos,dir);
480 face_keps_imposee_[ind_face] = ind;
486 for (
int n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
494 (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE"))
496 for (
int ind_face=ndeb; ind_face<nfin; ind_face++)
498 int num_face=le_bord.
num_face(ind_face);
499 face_keps_imposee_[num_face]=-1;
508 for (
int ind_face=ndeb; ind_face<nfin; ind_face++)
510 int num_face=le_bord.
num_face(ind_face);
511 face_keps_imposee_[num_face]=-2;
515 Cerr<<
"fin construction de fac_keps_imposee_ par la methode generale"<<finl;
519void remplir_face_keps_imposee(
int& flag_face_keps_imposee_,
520 int methode_calcul_face_keps_impose_,
521 IntVect& face_keps_imposee_,
527 if (flag_face_keps_imposee_ == 1)
530 if (methode_calcul_face_keps_impose_ == -1)
533 methode_calcul_face_keps_impose_ = 1;
537 methode_calcul_face_keps_impose_ = 5 ;
542 Cout <<
"Calcul des faces ou keps est impose par la methode : ";
543 if (methode_calcul_face_keps_impose_==1)
544 Cout<<
"toutes_les_faces_accrochees"<<finl;
545 else if (methode_calcul_face_keps_impose_==4)
546 Cout<<
"que_les_faces_des_elts_dirichlet"<<finl;
547 else if (methode_calcul_face_keps_impose_==5)
548 Cout<<
"que_les_faces_des_elts_dirichlet_et_test_distance"<<finl;
551 Cout <<
" Cas non prevu "<<finl;
556 if (flag_face_keps_imposee_ == 0)
559 face_keps_imposee_ = -2;
561 if ((methode_calcul_face_keps_impose_==1) || (methode_calcul_face_keps_impose_==5))
562 remplir_face_keps_imposee_gen(flag_face_keps_imposee_,
564 methode_calcul_face_keps_impose_,
571 flag_face_keps_imposee_ = 1;
572 const IntTab& face_voisins = domaine_VEF.
face_voisins();
574 for (
int n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
579 (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE"))
582 const IntTab& elem_faces = domaine_VEF.
elem_faces();
586 for (
int ind_face=ndeb; ind_face<nfin; ind_face++)
588 int num_face = le_bord.
num_face(ind_face);
589 int elem=face_voisins(num_face,0);
590 const Domaine& domaine = domaine_VEF.
domaine();
594 for (nf2=0; nf2<nfac; nf2++)
596 num[nf2] = elem_faces(elem,nf2);
598 for (nf2=0; nf2<nfac-1; nf2++)
600 num[nf2] = elem_faces(elem,nf2);
601 if (num[nf2] == num_face)
603 num[nf2] = num[nfac-1];
604 num[nfac-1] = num_face;
608 for (
int nf=0; nf<nfac; nf++)
611 num0=elem_faces(elem,nf);
614 face_keps_imposee_[num0]=-1;
620 face_keps_imposee_[num0]=num_face;
623 if (face_voisins(num0,0)!=elem)
624 elem_voisin=face_voisins(num0,0);
626 elem_voisin=face_voisins(num0,1);
630 if ((methode_calcul_face_keps_impose_==0)||(methode_calcul_face_keps_impose_==3))
635 int num1=elem_faces(elem_voisin,0);
636 int num2=elem_faces(elem_voisin,1);
637 if (num1==num0) num1=elem_faces(elem_voisin,2);
638 else if (num2==num0) num2=elem_faces(elem_voisin,2);
639 if (rang_elem_non_std(elem_voisin)==-1)
642 double dist1=distance_face(num_face,num1,domaine_VEF);
643 double dist2=distance_face(num_face,num2,domaine_VEF);
659 int elem0 = face_voisins(numb,0);
660 int elem1 = face_voisins(numb,1);
662 if ((elem0 == elem_voisin) && (elem1>=0))
663 test_rang = rang_elem_non_std(elem1);
664 else if ((elem1 == elem_voisin) && (elem0>=0))
665 test_rang = rang_elem_non_std(elem0);
670 face_keps_imposee_[numb]=num_face;
675 int num1=elem_faces(elem_voisin,0);
676 int num2=elem_faces(elem_voisin,1);
677 int num3=elem_faces(elem_voisin,2);
678 if (num1==num0) num1=elem_faces(elem_voisin,3);
679 else if (num2==num0) num2=elem_faces(elem_voisin,3);
680 else if (num3==num0) num3=elem_faces(elem_voisin,3);
683 if ((methode_calcul_face_keps_impose_==3)||(num1>=ndebint && num2>=ndebint && num3>=ndebint))
686 double dist1=distance_face(num_face,num1,domaine_VEF);
687 double dist2=distance_face(num_face,num2,domaine_VEF);
688 double dist3=distance_face(num_face,num3,domaine_VEF);
710 face_keps_imposee_[num1] = num_face;
714 face_keps_imposee_[num2] = num_face;
719 else if (methode_calcul_face_keps_impose_ == 2)
720 for (
int dir = 0; dir < nfac; dir++)
722 assert(methode_calcul_face_keps_impose_ == 2);
723 const int num3 = elem_faces(elem_voisin, dir);
724 if ((num3 > 0) && (num3 != num0))
726 int face_asso = face_keps_imposee_[num3];
728 face_keps_imposee_[num3] = num_face;
734 face_keps_imposee_[num3] = num_face;
742 assert(methode_calcul_face_keps_impose_ == 4);
753 for (
int n_bord = 0; n_bord < domaine_VEF.
nb_front_Cl(); n_bord++)
761 || (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE"))
763 for (
int ind_face = ndeb; ind_face < nfin; ind_face++)
765 const int num_face = le_bord.
num_face(ind_face);
766 face_keps_imposee_[num_face] = -1;
771 || sub_type(
Symetrie, la_cl.valeur()))
777 for (
int ind_face = ndeb; ind_face < nfin; ind_face++)
779 const int num_face = le_bord.
num_face(ind_face);
780 face_keps_imposee_[num_face] = -2;
796 const IntTab& face_voisins = domaine_VEF.
face_voisins();
797 const Equation_base& eqn_hydr = mon_modele_turb_hyd->equation();
801 const DoubleTab& tab_visco = ch_visco_cin.
valeurs();
802 const Domaine& domaine = domaine_VEF.
domaine();
809 visco = std::max(tab_visco(0,0),DMINFLOAT);
817 Cerr <<
"In Paroi_std_hyd_VEF::calculer_hyd_BiK : visco = " << tab_visco.
local_min_vect() <<
" <= 0 ? " << finl;
823 double dist=-1,d_visco=-1;
824 double u_plus_d_plus,u_plus,d_plus,u_star;
837 for (
int n_bord=0; n_bord<nb_bords; n_bord++)
846 (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE") )
850 if(la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE")
852 is_defilante = (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE");
861 const IntTab& elem_faces = domaine_VEF.
elem_faces();
866 for (
int ind_face=ndeb; ind_face<nfin; ind_face++)
868 int num_face=le_bord.
num_face(ind_face);
869 int elem=face_voisins(num_face,0);
871 is_defilante_face[num_face]=is_defilante;
872 stock_erugu[num_face]=erugu;
875 for (
int nf2=0; nf2<nfac; nf2++)
876 num[nf2] = elem_faces(elem,nf2);
879 for (
int nf2=0; nf2<nfac-1; nf2++)
881 num[nf2] = elem_faces(elem,nf2);
882 if (num[nf2] == num_face)
884 num[nf2] = num[nfac-1];
885 num[nfac-1] = num_face;
891 for (
int nf=0; nf<nfac; nf++)
893 if (num[nf]==num_face)
903 for (
int k=0; k<nfac; k++)
908 tab_k(num[nf]) += tab_k(num[k]);
909 tab_eps(num[nf])+= tab_eps(num[k]);
915 tab_eps(num[nf])/=nk;
923 norm_v=norm_vit_lp_k(vitesse,num[nf],num_face,domaine_VEF,val,is_defilante);
925 dist=distance_face(num_face,num[nf],domaine_VEF);
927 dist=distance_face_elem(num_face,elem,domaine_VEF);
932 d_visco = tab_visco(elem,0);
934 u_plus_d_plus = norm_v*dist/d_visco;
941 u_star = norm_v/u_plus ;
942 d_plus = u_plus_d_plus/u_plus ;
973 u_starbis=sqrt(sqrt(u_starbis));
976 if (u_starbis != 0)
uplus_(num_face)=norm_v/u_starbis;
986 const double erugu =
Erugu;
996 for (
int ind_face=ndeb; ind_face<nfin; ind_face++)
998 const int num_face=le_bord.
num_face(ind_face);
999 const int elem=face_voisins(num_face,0);
1001 double psc=0, norm=0;
1006 psc += vitesse(num_face,comp)*normales(num_face,comp);
1007 norm += normales(num_face,comp)*normales(num_face,comp);
1010 if (std::fabs(norm)>=DMINFLOAT) psc/=norm;
1014 val[comp]=vitesse(num_face,comp)-psc*normales(num_face,comp);
1015 norm_v += val[comp]*val[comp];
1018 norm_v = sqrt(norm_v);
1027 d_visco = tab_visco(elem,0);
1029 u_plus_d_plus = norm_v*dist/d_visco;
1037 u_star = norm_v/u_plus ;
1038 d_plus = u_plus_d_plus/u_plus ;
1061 u_starbis=sqrt(sqrt(u_starbis));
1065 if (u_starbis != 0)
uplus_(num_face)=norm_v/u_starbis;
1082 DoubleVect toto(nb_faces_tot);
1083 const ArrOfInt& renum=Debog::renum_faces();
1084 for (
int i=0; i<nb_faces_tot; i++)
1087 if (i>1000) Cerr<<
me()<<
" face_virt "<<i<<finl;
1096 remplir_face_keps_imposee_gen( tutu, test, domaine_VEF,le_dom_Cl_dis_,!is_champ_Q1NC);
1098 if (max(test)>0|| min(test)<0)
1100 const DoubleTab& xv=domaine_VEF.
xv();
1101 Cerr<<
"TEST "<<finl;
1102 int compteur=0,compteur2=0;
1103 for (
int i=0; i<test.size_array(); i++)
1109 Cerr<<
me()<<
" face "<<i<<
" : " <<
face_keps_imposee_(i)<<
" "<<test(i)<<
" pos "<<xv(i,0)<<
" "<<xv(i,1);
1119 Cerr<<
" pos test "<<xv(test(i),0)<<
" "<<xv(test(i),1);
1120 if (
dimension==3) Cerr<<
" "<<xv(test(i),2);
1124 if (test(i)>-1) compteur++;
1127 Cerr<<
"compteurs "<<compteur2<<
" "<<compteur<<finl;
1135 for (
int face=0; face<nb_faces_tot; face++)
1141 int elem=face_voisins(num_face,0);
1149 distb=distance_face(num_face,face,domaine_VEF);
1154 distb=distance_face_elem(num_face,elem,domaine_VEF);
1157 norm_v=norm_vit_lp_k(vitesse,face,num_face,domaine_VEF,val,is_defilante_face[num_face]);
1161 d_visco = tab_visco(elem,0);
1163 u_plus_d_plus = norm_v*distb/d_visco;
1168 u_star = norm_v/u_plus ;
1169 d_plus = u_plus_d_plus/u_plus ;
1193 const Equation_base& eqn_hydr = mon_modele_turb_hyd->equation();
1197 const DoubleTab& tab_visco = ch_visco_cin.
valeurs();
1198 const Domaine& domaine = domaine_VEF.
domaine();
1204 visco0 = std::max(tab_visco(0, 0), DMINFLOAT);
1211 Cerr <<
"In Paroi_std_hyd_VEF::calculer_hyd : visco = " << tab_visco.
local_min_vect() <<
" <= 0 ? " << finl;
1220 le_dom_Cl_dis_, !is_champ_Q1NC);
1222 const int nfac = domaine.nb_faces_elem();
1226 DoubleTrav tab_erugu(nb_faces_tot);
1227 IntTrav tab_is_defilante_face(nb_faces_tot);
1228 IntTrav tab_compteur(nb_faces_tot);
1229 IntArrView compteur =
static_cast<ArrOfInt&
>(tab_compteur).view_wo();
1230 DoubleTrav tab_sum(nb_faces_tot, 2);
1231 DoubleTabView sum = tab_sum.
view_rw();
1232 const double Kappa =
Kappa_;
1233 const double Cmu =
Cmu_;
1237 for (
int n_bord = 0; n_bord < nb_bords; n_bord++)
1243 || la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE";
1246 if (dirichlet || robin)
1248 int is_defilante = sub_type(
Dirichlet_paroi_defilante, la_cl.valeur()) || (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE");
1260 const double delta = robin ? ref_cast(
Paroi_decalee_Robin, la_cl.valeur()).get_delta() : -1;
1264 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
1266 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
1267 CIntArrView le_bord_num_face = le_bord.
num_face().view_ro();
1268 CDoubleTabView face_normale = domaine_VEF.
face_normales().view_ro();
1269 CDoubleTabView xv = domaine_VEF.
xv().view_ro();
1270 CDoubleTabView xp = domaine_VEF.
xp().view_ro();
1271 CDoubleTabView vitesse = tab_vitesse.
view_ro();
1272 CDoubleTabView visco = tab_visco.
view_ro();
1274 DoubleArrView seuil_LP =
seuil_LP_.view_wo();
1278 DoubleArrView uplus =
uplus_.view_wo();
1279 DoubleArrView stock_erugu =
static_cast<ArrOfDouble&
>(tab_erugu).view_wo();
1280 IntArrView is_defilante_face =
static_cast<ArrOfInt&
>(tab_is_defilante_face).view_wo();
1281 DoubleTabView keps = tab_2eq.
view_rw();
1284 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), size, KOKKOS_LAMBDA(
const int ind_face)
1286 const int num_face = le_bord_num_face(ind_face);
1287 const int elem = face_voisins(num_face, 0);
1288 double d_visco = l_unif ? visco0 : visco(elem, 0);
1289 double u_star = -1, d_plus = -1;
1291 double norm_v = 0, dist = -1;
1295 is_defilante_face[num_face] = is_defilante;
1296 stock_erugu[num_face] = erugu;
1299 for (
int nf = 0; nf < nfac; nf++)
1302 int face = elem_faces(elem, nf);
1306 norm_v = norm_vit_lp_k(dim, vitesse, face, num_face, face_normale, val, is_defilante);
1309 dist = distance_face(dim, num_face, face, xv, face_normale);
1311 dist = distance(dim, num_face, elem, xp, xv, face_normale);
1313 double u_plus_d_plus = norm_v * dist / d_visco;
1314 double u_plus = calculer_u_plus_kokkos(nf, u_plus_d_plus, erugu, Kappa, seuil_LP,
1316 if (is_u_star_impose)
1318 u_star = u_star_impose;
1323 u_star = u_plus == 0 ? 0 : norm_v / u_plus;
1324 d_plus = u_plus == 0 ? 0 : u_plus_d_plus / u_plus;
1328 for (
int dir = 0; dir < dim; dir++)
1334 d_plus, u_star, d_visco, dist, Cmu, Kappa);
1335 Kokkos::atomic_add(&sum(face, 0), k);
1336 Kokkos::atomic_add(&sum(face, 1), eps);
1337 Kokkos::atomic_add(&compteur(face), 1);
1342 for (
int dir = 0; dir < dim; dir++)
1349 for (
int comp = 0; comp < dim; comp++)
1351 psc += vitesse(num_face, comp) * face_normale(num_face, comp);
1352 norm += face_normale(num_face, comp) * face_normale(num_face, comp);
1355 if (std::fabs(norm) >= DMINFLOAT)
1358 for (
int comp = 0; comp < dim; comp++)
1360 val[comp] = vitesse(num_face, comp) - psc * face_normale(num_face, comp);
1361 norm_v += val[comp] * val[comp];
1363 norm_v = sqrt(norm_v);
1364 if (std::fabs(norm_v) >= DMINFLOAT)
1365 for (
int comp = 0; comp < dim; comp++)
1366 val[comp] /= norm_v;
1370 double u_plus_d_plus = norm_v * dist / d_visco;
1371 double u_plus = calculer_u_plus_kokkos(ind_face, u_plus_d_plus, erugu, Kappa, seuil_LP,
1374 if (is_u_star_impose)
1376 u_star = u_star_impose;
1381 u_star = u_plus == 0 ? 0 : norm_v / u_plus;
1382 d_plus = u_plus == 0 ? 0 : u_plus_d_plus / u_plus;
1385 for (
int dir = 0; dir < dim; dir++)
1389 double u_starbis = 0;
1390 for (
int dir = 0; dir < dim; dir++)
1392 u_starbis = sqrt(sqrt(u_starbis));
1395 tab_d_plus(num_face) = u_starbis * dist / d_visco;
1397 uplus(num_face) = norm_v / u_starbis;
1403 d_plus, u_star, d_visco, dist, Cmu, Kappa);
1406 end_gpu_timer(__KERNEL_NAME__);
1412 DoubleTabView keps = tab_2eq.
view_rw();
1413 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(0, compteur.size()), KOKKOS_LAMBDA(
const int face)
1415 if (compteur(face)>0)
1417 keps(face, 0) = sum(face,0) / compteur(face);
1418 keps(face, 1) = sum(face,1) / compteur(face);
1421 end_gpu_timer(__KERNEL_NAME__);
1424 for (
int n_bord = 0; n_bord < nb_bords; n_bord++)
1430 || la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE";
1435 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
1437 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
1438 CIntArrView le_bord_num_face = le_bord.
num_face().view_ro();
1439 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(0, size), KOKKOS_LAMBDA(
1442 const int num_face = le_bord_num_face(ind_face);
1443 const int elem = face_voisins(num_face, 0);
1447 for (
int k = 0; k < nfac; k++)
1449 int face = elem_faces(elem, k);
1452 ke += keps(face, 0);
1453 eps += keps(face, 1);
1462 keps(num_face, 0) = ke;
1463 keps(num_face, 1) = eps;
1465 end_gpu_timer(__KERNEL_NAME__);
1474 DoubleVect toto(nb_faces_tot);
1475 const ArrOfInt& renum=Debog::renum_faces();
1476 for (
int i=0; i<nb_faces_tot; i++)
1479 if (i>1000) Cerr<<
me()<<
" face_virt "<<i<<finl;
1488 remplir_face_keps_imposee_gen( tutu, test, domaine_VEF,le_dom_Cl_dis_,!is_champ_Q1NC);
1490 if (std::max(test)>0|| std::min(test)<0)
1492 const DoubleTab& xv=domaine_VEF.
xv();
1493 Cerr<<
"TEST "<<finl;
1494 int compteur=0,compteur2=0;
1495 for (
int i=0; i<test.size_array(); i++)
1501 Cerr<<
me()<<
" face "<<i<<
" : " <<
face_keps_imposee_(i)<<
" "<<test(i)<<
" pos "<<xv(i,0)<<
" "<<xv(i,1);
1511 Cerr<<
" pos test "<<xv(test(i),0)<<
" "<<xv(test(i),1);
1512 if (
dimension==3) Cerr<<
" "<<xv(test(i),2);
1516 if (test(i)>-1) compteur++;
1519 Cerr<<
"compteurs "<<compteur2<<
" "<<compteur<<finl;
1527 CDoubleTabView face_normale = domaine_VEF.
face_normales().view_ro();
1528 DoubleArrView seuil_LP =
seuil_LP_.view_wo();
1530 CDoubleTabView xv = domaine_VEF.
xv().view_ro();
1531 CDoubleTabView xp = domaine_VEF.
xp().view_ro();
1532 CDoubleTabView vitesse = tab_vitesse.
view_ro();
1533 CDoubleTabView visco = tab_visco.
view_ro();
1534 CDoubleArrView stock_erugu =
static_cast<const ArrOfDouble&
>(tab_erugu).view_ro();
1535 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
1536 CIntArrView is_defilante_face =
static_cast<const ArrOfInt&
>(tab_is_defilante_face).view_ro();
1537 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(0, nb_faces_tot), KOKKOS_LAMBDA(
const int face)
1543 const int elem = face_voisins(num_face, 0);
1546 dist = distance_face(dim, num_face, face, xv, face_normale);
1548 dist = distance(dim, num_face, elem, xp, xv, face_normale);
1550 double norm_v = norm_vit_lp_k(dim, vitesse, face, num_face, face_normale, val, is_defilante_face[num_face]);
1552 double d_visco = l_unif ? visco0 : visco(elem, 0);
1554 double u_plus_d_plus = norm_v*dist/d_visco;
1555 double u_plus = calculer_u_plus_kokkos(face, u_plus_d_plus, stock_erugu[num_face], Kappa, seuil_LP, iterations_LP);
1557 double u_star = u_plus == 0 ? 0 : norm_v/u_plus ;
1558 double d_plus = u_plus == 0 ? 0 : u_plus_d_plus/u_plus ;
1562 d_plus, u_star, d_visco, dist, Cmu, Kappa);
1565 end_gpu_timer(__KERNEL_NAME__);
1576 const double d_plus,
const double u_star,
1577 const double d_visco,
const double dist,
const double Cmu,
const double Kappa)
1579 if (turbulence_model_type == 1)
1580 calculer_k_eps(tke, var2, d_plus, u_star, d_visco, dist, Cmu, Kappa);
1581 else if (turbulence_model_type == 2)
1582 compute_k_omega(tke, var2, d_plus, u_star, d_visco, dist, Cmu, Kappa);
1584 Process::Kokkos_exit(
"The turbulence model is neither k-epsilon nor k-omega. Implementation required?");
1589double norm_vit_lp(
int dim,
const double* v,
int fac, CDoubleTabView face_normale,
double* val)
1593 for(
int i = 0; i < dim; i++)
1595 r[i] = face_normale(fac, i);
1596 norme += r[i] * r[i];
1598 norme = sqrt(norme);
1599 for(
int i = 0; i < dim; i++)
1604 for (
int i=0; i<dim; i++)
1606 sum_carre += carre(v[i]);
1609 double norm_vit = sqrt(std::fabs(sum_carre-carre(psc)));
1612 for(
int i = 0; i < dim; i++)
1613 val[i] = (v[i] - psc*r[i])/(norm_vit + DMINFLOAT);
1618double norm_vit_lp(
const ArrOfDouble& vit,
int face,
const Domaine_VEF& domaine, ArrOfDouble& val)
1622 const DoubleTab& face_normale = domaine.face_normales();
1626 for(
int i = 0; i < dim; i++)
1627 r[i] = face_normale(face, i);
1629 r /= norme_array(r);
1630 const double psc = dotproduct_array(r, vit);
1632 double norm_vit {0};
1634 norm_vit = vitesse_tangentielle(vit[0],vit[1],vit[2],r[0],r[1],r[2]);
1636 norm_vit = vitesse_tangentielle(vit[0],vit[1],r[0],r[1]);
1638 for(
int i = 0; i < dim; i++)
1639 val[i] = (vit[i] - psc*r[i])/(norm_vit + DMINFLOAT);
1648 const Equation_base& eqn_hydr = mon_modele_turb_hyd->equation();
1651 const DoubleTab& tab_visco = ch_visco_cin.
valeurs();
1652 const Domaine& domaine = domaine_VEF.
domaine();
1659 visco0 = std::max(tab_visco(0,0),DMINFLOAT);
1667 Cerr <<
"In Paroi_std_hyd_VEF::calculer_hyd : visco = " << tab_visco.
local_min_vect() <<
" <= 0 ? " << finl;
1675 double dist_corr=1.;
1676 double coef_vit=nfac;
1689 for (
int n_bord=0; n_bord<nb_bords; n_bord++)
1696 if (dirichlet || robin)
1707 const double delta = robin ? ref_cast(
Paroi_decalee_Robin,la_cl.valeur()).get_delta() : 0;
1712 CIntArrView le_bord_num_face = le_bord.
num_face().view_ro();
1713 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
1714 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
1716 CDoubleTabView face_normales = domaine_VEF.
face_normales().view_ro();
1717 CDoubleTabView xp = domaine_VEF.
xp().view_ro();
1718 CDoubleTabView xv = domaine_VEF.
xv().view_ro();
1719 CDoubleTabView visco = tab_visco.
view_ro();
1721 DoubleArrView seuil_LP =
seuil_LP_.view_wo();
1723 DoubleArrView uplus =
uplus_.view_wo();
1726 DoubleArrView nu_t =
static_cast<ArrOfDouble&
>(tab_nu_t).view_wo();
1727 DoubleArrView k =
static_cast<ArrOfDouble&
>(tab_k).view_wo();
1729 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(ndeb, nfin), KOKKOS_LAMBDA (
const int ind_face)
1733 int num_face = le_bord_num_face(ind_face);
1734 int elem = face_voisins(num_face,0);
1736 double dist=0, norm_v=0;
1740 for (
int j = 0; j < dim; j++)
1742 for (
int i = 0; i < nfac; i++)
1744 int face = elem_faces(elem, i);
1745 for (
int j = 0; j < dim; j++)
1746 vit[j] += (vitesse(face, j) -
1747 vitesse(num_face, j));
1749 for (
int j = 0; j < dim; j++)
1752 dist = distance(dim, num_face, elem, xp, xv, face_normales);
1755 norm_v = norm_vit_lp(dim, vit, num_face, face_normales, val);
1760 double psc=0, norm=0;
1761 for(
int comp=0; comp<dim; comp++)
1763 psc += vitesse(num_face,comp)*face_normales(num_face,comp);
1764 norm += face_normales(num_face,comp)*face_normales(num_face,comp);
1767 if (std::fabs(norm)>=DMINFLOAT) psc/=norm;
1769 for(
int comp=0; comp<dim; comp++)
1771 val[comp]=vitesse(num_face,comp)-psc*face_normales(num_face,comp);
1772 norm_v += val[comp]*val[comp];
1774 norm_v = sqrt(norm_v);
1775 for (
int j = 0; j < dim; j++)
1780 double d_visco = l_unif ? visco0 : visco(elem,0);
1782 double u_plus_d_plus = norm_v*dist/d_visco;
1784 double u_plus = calculer_u_plus_kokkos(ind_face,u_plus_d_plus,erugu,Kappa,seuil_LP,iterations_LP);
1786 double u_star, d_plus;
1787 if (is_u_star_impose)
1789 u_star = u_star_impose;
1794 u_star = u_plus ? norm_v/u_plus : 0.;
1795 d_plus = u_plus ? u_plus_d_plus/u_plus : 0.;
1798 compute_k_eps(k(elem),eps,d_plus,u_star,d_visco,dist, Cmu, Kappa);
1801 for (
int j=0; j<dim; j++)
1805 if((!LM) && (!COMB)) nu_t(elem) = Cmu*k(elem)*k(elem)/(eps+DMINFLOAT);
1807 uplus(num_face) = u_plus;
1813 if (COMB && nombre_sources==0)
1814 nu_t(elem) *= dist_corr;
1817 end_gpu_timer(__KERNEL_NAME__);
1838 k = 0.07*yp*yp*exp(-yp/9.);
1839 k += 1./sqrt(Cmu)*(1. - exp(-yp/20.))*(1. - exp(-yp/20.));
1858 const double u_star,
const double d_visco,
const double Kappa)
1860 double const u_star_squared = u_star*u_star;
1863 eps = 1./(Kappa*pow(yp*yp*yp*yp + 50625, 0.25));
1864 eps *= u_star_squared*u_star_squared/d_visco;
1869 const double u_star,
const double d_visco,
1870 const double dist,
const double Kappa)
1881 const double w_log = u_star/(std::sqrt(
BETA_K)*Kappa*dist);
1882 const double w_1 = w_vis + w_log ;
1883 const double w_2 = std::pow(std::pow(w_vis, 1.2) + std::pow(w_log, 1.2), 1./1.2);
1884 const double blending = std::tanh(yp/10*yp/10*yp/10*yp/10);
1886 omega = blending*w_1 + (1 - blending)*w_2;
1892 const double yp,
const double u_star,
1893 const double d_visco,
const double dist,
const double Cmu,
const double Kappa)
1895 return compute_k_eps(k, eps, yp, u_star, d_visco, dist, Cmu, Kappa);
1900 double yp,
double u_star,
1901 double d_visco,
double dist,
double Cmu,
double Kappa)
1910 double yp,
double u_star,
1911 double d_visco,
double dist,
double Cmu,
double Kappa)
1922 double upmoy,dpmoy,utaumoy;
1923 double seuil_moy,iter_moy;
1937 for (
int n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
1943 (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE"))
1949 Ustar <<
"Bord " << le_bord.
le_nom() << finl;
1952 Ustar <<
"-------------------------------------------------------------------------------------------";
1953 Ustar <<
"--------------------------------------------------------------------------------------------" << finl;
1954 Ustar <<
"\tFace a\t\t\t\t|\t\t\t\t\t\t\t\t\t| TAU=Nu.Grad(Ut) [m2/s2]" << finl;
1955 Ustar <<
"----------------------------------------|--------------------------------------------------";
1956 Ustar <<
"---------------------|----------------------------------------------------------------------" << finl;
1957 Ustar <<
"X\t\t| Y\t\t\t| u+\t\t\t| d+\t\t\t| u*\t\t\t| ||TAU||_2\t\t| |TAUx|\t\t| |TAUy|" << finl;
1958 Ustar <<
"----------------|-----------------------|-----------------------|-----------------------|--";
1959 Ustar <<
"---------------------|-----------------------|-----------------------|----------------------" << finl;
1963 Ustar <<
"-----------------------------------------------------------------------------------------------------------------";
1964 Ustar <<
"-----------------------------------------------------------------------------------------------------------------" << finl;
1965 Ustar <<
"\tFace a\t\t\t\t\t\t\t|\t\t\t\t\t\t\t\t\t| TAU=Nu.Grad(Ut) [m2/s2]" << finl;
1966 Ustar <<
"----------------------------------------------------------------|------------------------------------------------";
1967 Ustar <<
"-----------------------|-----------------------------------------------------------------------------------------" << finl;
1968 Ustar <<
"X\t\t| Y\t\t\t| Z\t\t\t| u+\t\t\t| d+\t\t\t| u*\t\t\t| ||TAU||_2\t\t| |TAUx|\t\t| |TAUy|\t\t| |TAUz|" << finl;
1969 Ustar <<
"----------------|-----------------------|-----------------------|-----------------------|-----------------------|";
1970 Ustar <<
"-----------------------|-----------------------|-----------------------|-----------------------|-----------------" << finl;
1975 for (
int num_face=ndeb; num_face<nfin; num_face++)
1977 double x=domaine_VEF.
xv(num_face,0);
1978 double y=domaine_VEF.
xv(num_face,1);
1981 Ustar << x <<
"\t| " << y;
1984 double z=domaine_VEF.
xv(num_face,2);
1985 Ustar << x <<
"\t| " << y <<
"\t| " << z;
1988 norme_L2=sqrt(norme_L2);
1998 upmoy +=
uplus_(num_face);
2017 ArrOfDouble array(6);
2030 compt=(int)array[5];
2036 Ustar <<
"-------------------------------------------------------------" << finl;
2037 Ustar <<
"Calcul des valeurs moyennes (en supposant maillage regulier):" << finl;
2038 Ustar <<
"<u+>= " << upmoy/compt <<
" <d+>= " << dpmoy/compt <<
" <u*>= " << utaumoy/compt <<
" seuil_LP= " << seuil_moy/compt <<
" iterations_LP= " << iter_moy/compt << finl;
2040 Ustar << finl << finl;
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Cond_lim Classe generique servant a representer n'importe quelle classe
static void verifier_indices_items(const char *const msg, const MD_Vector &, const IntVect &)
teste le contenu du vecteur v en supposant qu'il contient des indices d'items associes au descripteur...
static void verifier(const char *const msg, double)
classe Dirichlet_paroi_defilante Impose la vitesse de paroi dnas une equation de type Navier_Stokes.
classe Dirichlet_paroi_fixe Represente une paroi immobile dans une equation de type Navier_Stokes.
static int identifie_item_unique(IntList &item_possible, DoubleTab &coord_possible, const DoubleVect &coord_ref)
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
IntVect & rang_elem_non_std()
int nb_faces_tot() const
renvoie le nombre total de faces.
void creer_tableau_faces(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
virtual double face_normales(int face, int comp) const
double xv(int num_face, int k) 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
double xp(int num_elem, int k) const
int premiere_face_int() const
une face est interne ssi elle separe deux elements.
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
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,...
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual const Milieu_base & milieu() const =0
virtual const Champ_Inc_base & inconnue() const =0
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
const Champ_Don_base & viscosite_cinematique() const
int num_premiere_face() const
int num_face(const int) const
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
cette classe permet de specifier des options a la loi de paroi standard.
Classe Modele_turbulence_hyd_Longueur_Melange_base Classe representant le modele de turbulence Longue...
Classe Modele_turbulence_hyd_combinaison Classe representant un modele de turbulence exprime a partir...
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
virtual void set_param(Param &) const
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.
virtual const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Helper class to factorize the readOn method of Objet_U classes.
CLASS: Paroi_hyd_base_VEF Classe de base des lois de paroi hydraulique en VEF.
IntVect face_keps_imposee_
const ArrOfInt & face_keps_imposee() const
int flag_face_keps_imposee_
void init_lois_paroi_hydraulique_()
void set_param(Param ¶m) const
int calculer_hyd_BiK(DoubleTab &, DoubleTab &) override
KOKKOS_FUNCTION void compute_omega(double &omega, const double yp, const double u_star, const double d_visco, const double dist, const double Kappa)
static constexpr double BETA_K
KOKKOS_FUNCTION void compute_epsilon(double &epsilon, const double yp, const double u_star, const double d_visco, const double Kappa)
void set_param(Param ¶m) const override
int init_lois_paroi() override
static constexpr double BETA_OMEGA
KOKKOS_FUNCTION void compute_k_omega(double &k, double &omega, const double yplus, const double u_star, const double d_visco, const double dist, const double Cmu, const double Kappa)
KOKKOS_FUNCTION void compute_k_for_komega(double &k, const double yp, const double u_star, const double Cmu)
int methode_calcul_face_keps_impose_
KOKKOS_FUNCTION int calculer_k_eps(double &, double &, double, double, double, double, const double, const double)
void check_turbulence_model()
Returns an integer value depending on the turbulence model.
virtual int init_lois_paroi_hydraulique()
KOKKOS_FUNCTION void compute_k_epsilon(double &k, double &epsilon, const double yplus, const double u_star, const double d_visco, const double dist, const double Cmu, const double kappa)
int calculer_hyd(DoubleTab &) override
double calculer_u_plus(const int, const double, const double erugu)
void imprimer_ustar(Sortie &) const override
KOKKOS_FUNCTION void compute_turbulent_quantities(int, double &, double &, double d_plus, double u_star, double d_visco, double dist, const double Cmu, const double Kappa)
KOKKOS_FUNCTION void compute_k(double &k, const double yp, const double u_star, const double Cmu)
int turbulence_model_type_
classe Periodique Cette classe represente une condition aux limites periodique.
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 void barrier()
Synchronise tous les processeurs du groupe courant (attend que tous les processeurs soient arrives a ...
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),...
Classe de base des flux de sortie.
void set_value(int_t i_liste, int_t i_element, int_t valeur)
affecte la "valeur" au j-ieme element de la i-ieme liste avec 0 <= i < get_nb_lists() et 0 <= j < get...
int_t get_list_size(int_t i_liste) const
renvoie le nombre d'elements de la liste i
void set_list_sizes(const ArrOfInt_t &sizes)
detruit les listes existantes et en cree de nouvelles.
classe Symetrie Sur les faces de symetrie on a les proprietes suivantes:
TRUSTList & add(_TYPE_)
insertion en queue
TRUSTList & add_if_not(_TYPE_)
Ajout d'un element a la liste ssi il n'existe pas deja.
void suppr(_TYPE_)
Supprime un element contenu dans la liste.
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()
_TYPE_ local_min_vect(Mp_vect_options opt=VECT_REAL_ITEMS) const
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
virtual const MD_Vector & get_md_vector() const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
const DoubleTab & Cisaillement_paroi() const
const DoubleVect & tab_d_plus() const
const DoubleVect & tab_u_star() const
void ouvrir_fichier_partage(EcrFicPartage &, const Nom &) const
Ouverture/creation d'un fichier d'impression de Face, uplus_, dplus_, tab_u_star, Cisaillement_paroi_...
DoubleTab Cisaillement_paroi_