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>
85 param.dictionnaire(
"toutes_les_faces_accrochees", 1);
86 param.dictionnaire(
"que_les_faces_des_elts_dirichlet", 4);
87 param.dictionnaire(
"que_les_faces_des_elts_dirichlet_et_test_distance", 5);
92 param.lire_avec_accolades_depuis(s);
95 mot_test =
"u_star_impose";
97 if (param.get_list_mots_lus().rang(Motcle(mot_test))!=-1)
115bool compute_u_plus(
const int ind_face,
116 const double u_plus_d_plus,
119 double& r,
int& iter,
double& u_plus)
125 if(u_plus_d_plus < 1.)
127 u_plus = sqrt(u_plus_d_plus);
130 u_plus = u_plus_d_plus/100.;
131 const double seuil = 0.001;
132 const int itmax = 25;
133 const double A = (1/Kappa)*log(erugu/Kappa) ;
138 while((iter++ < itmax) && (r > seuil))
140 const double d_plus = u_plus_d_plus/u_plus;
141 const double u_plus2 = (1./Kappa)*log(1. + Kappa*d_plus)
142 + A*(1. - exp(-d_plus/11.) - exp(-d_plus/3.)*d_plus/11.);
143 u_plus = 0.5*(u_plus + u_plus2);
144 r = std::fabs(u_plus - u_plus2)/u_plus;
146 return (iter < itmax);
148#pragma clang optimize off
150double 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)
154 if (!compute_u_plus(ind_face, u_plus_d_plus, erugu, Kappa, r, iter, u_plus))
157 Kokkos::printf(
"u+d+= %f \n", u_plus_d_plus);
158 Kokkos::abort(
"The iterative process of u* did not converge!");
160 Process::exit(
"The iterative process of u* did not converge!");
163 seuil_LP(ind_face) = r;
164 iterations_LP(ind_face) = iter;
167#pragma clang optimize on
170int compute_k_eps(
double& k,
double& eps ,
171 const double yp,
const double u_star,
172 const double d_visco,
const double dist,
const double Cmu,
const double Kappa)
176 const double u_star_carre = u_star * u_star;
177 k = 0.07*yp*yp*(exp(-yp/9.));
178 k += 1./sqrt(Cmu)*(1. - exp(-yp/20.))*(1. - exp(-yp/20.));
181 eps = 1./(Kappa*pow(yp*yp*yp*yp+50625, 0.25));
182 eps *= u_star_carre*u_star_carre/d_visco;
188 const double u_plus_d_plus,
191 double r {0.0}, u_plus {0.0};
193 if (!compute_u_plus(ind_face, u_plus_d_plus, erugu,
Kappa_, r, iter, u_plus))
194 erreur_non_convergence();
204 uplus_.resize(le_dom_dis_->nb_faces_tot());
210 seuil_LP_.resize(le_dom_dis_->nb_faces_tot());
222 Cmu_ = mon_modele_turb_hyd->get_Cmu();
232void remplir_face_keps_imposee_gen(
int& flag_face_keps_imposee_,
233 IntVect& face_keps_imposee_,
234 int& methode_calcul_face_keps_impose_,
239 if (flag_face_keps_imposee_==0)
241 flag_face_keps_imposee_=1;
242 Cerr<<
"construction de fac_keps_imposee_ par la methode generale"<<finl;
248 face_keps_imposee_=-2;
253 ArrOfInt face_bords_diri(nb_faces_tot);
254 for (
int n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
259 (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE"))
265 for (
int ind_face=ndeb; ind_face<nfin; ind_face++)
267 face_bords_diri[compt++]= le_bord.
num_face(ind_face);
271 face_bords_diri.resize_array(compt);
275 ArrOfInt is_sommet_sur_bord(domaine_VEF.
nb_som_tot());
277 int nb_som_face=face_sommets.
line_size();
278 for (
int fac=0; fac<compt; fac++)
280 int face=face_bords_diri[fac];
281 for (
int som=0; som<nb_som_face; som++)
283 int sommet=face_sommets(face,som);
284 is_sommet_sur_bord[sommet]++;
294 Static_Int_Lists som_face_bord;
296 is_sommet_sur_bord=0;
297 for (
int fac=0; fac<compt; fac++)
299 int face=face_bords_diri[fac];
300 for (
int som=0; som<nb_som_face; som++)
302 int sommet=face_sommets(face,som);
303 int n=(is_sommet_sur_bord[sommet])++;
312 ArrOfInt traite_face(nb_faces_tot);
313 if (methode_calcul_face_keps_impose_==5)
317 const IntTab& face_voisins = domaine_VEF.
face_voisins();
320 for (
int n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
325 (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE"))
328 const IntTab& elem_faces = domaine_VEF.
elem_faces();
332 for (
int ind_face=ndeb; ind_face<nfin; ind_face++)
334 int num_face = le_bord.
num_face(ind_face);
335 int elem = face_voisins(num_face,0);
336 for (
int i=0; i<nb_faces_elem; i++)
337 traite_face[elem_faces(elem,i)]=1;
345 assert(methode_calcul_face_keps_impose_==1);
347 const DoubleTab& xv=domaine_VEF.
xv();
348 for (
int ind_face=0; ind_face<nb_faces_tot; ind_face++)
349 if (traite_face[ind_face])
353 for (
int som=0; som<nb_som_face; som++)
355 int sommet=face_sommets(ind_face,som);
356 if (is_sommet_sur_bord[sommet])
359 int test_size=test.size();
377 int f_pos=som_face_bord(test[0],i);
379 for (
int lis=1; lis<test_size; lis++)
385 int f2=som_face_bord(som,k);
386 if (f2==f_pos) ok2=1;
390 if (ok==1) possible.
add(f_pos);
399 if ((possible.
size()==0))
402 for (
int k=0; k<test_size; k++)
405 int f_pos=som_face_bord(test[k],i);
411 assert(possible.
size());
412 int combien_de_face_possible=possible.
size();
424 if (combien_de_face_possible==1)
425 face_keps_imposee_[ind_face]=possible[0];
432 int size_initiale = possible.
size();
433 while (pos<size_initiale)
435 int new_pos = pos-elem_suppr;
436 int f_new_pos=possible[new_pos];
438 double dist2=distance_face(ind_face,f_new_pos,domaine_VEF);
441 dist+=(xv(f_new_pos,dir)-xv(ind_face,dir))*(xv(f_new_pos,dir)-xv(ind_face,dir));
445 possible.
suppr(f_new_pos);
451 if (possible.
size()!=0)
457 DoubleTab coord_possible;
458 DoubleVect coord_ref;
459 int size_liste = possible.
size();
460 coord_possible.
resize(size_liste,dimension,RESIZE_OPTIONS::NOCOPY_NOINIT);
461 coord_ref.
resize(dimension,RESIZE_OPTIONS::NOCOPY_NOINIT);
462 coord_ref(0) = xv(ind_face,0);
463 coord_ref(1) = xv(ind_face,1);
465 coord_ref(2) = xv(ind_face,2);;
467 for (
int i_face=0; i_face<size_liste; i_face++)
469 int f_pos = possible[i_face];
470 for (
int dir=0; dir<dimension; dir++)
471 coord_possible(i_face,dir) = xv(f_pos,dir);
481 face_keps_imposee_[ind_face] = ind;
487 for (
int n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
495 (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE"))
497 for (
int ind_face=ndeb; ind_face<nfin; ind_face++)
499 int num_face=le_bord.
num_face(ind_face);
500 face_keps_imposee_[num_face]=-1;
509 for (
int ind_face=ndeb; ind_face<nfin; ind_face++)
511 int num_face=le_bord.
num_face(ind_face);
512 face_keps_imposee_[num_face]=-2;
516 Cerr<<
"fin construction de fac_keps_imposee_ par la methode generale"<<finl;
520void remplir_face_keps_imposee(
int& flag_face_keps_imposee_,
521 int methode_calcul_face_keps_impose_,
522 IntVect& face_keps_imposee_,
528 if (flag_face_keps_imposee_ == 1)
531 if (methode_calcul_face_keps_impose_ == -1)
534 methode_calcul_face_keps_impose_ = 1;
538 methode_calcul_face_keps_impose_ = 5 ;
543 Cout <<
"Calcul des faces ou keps est impose par la methode : ";
544 if (methode_calcul_face_keps_impose_==1)
545 Cout<<
"toutes_les_faces_accrochees"<<finl;
546 else if (methode_calcul_face_keps_impose_==4)
547 Cout<<
"que_les_faces_des_elts_dirichlet"<<finl;
548 else if (methode_calcul_face_keps_impose_==5)
549 Cout<<
"que_les_faces_des_elts_dirichlet_et_test_distance"<<finl;
552 Cout <<
" Cas non prevu "<<finl;
557 if (flag_face_keps_imposee_ == 0)
560 face_keps_imposee_ = -2;
562 if ((methode_calcul_face_keps_impose_==1) || (methode_calcul_face_keps_impose_==5))
563 remplir_face_keps_imposee_gen(flag_face_keps_imposee_,
565 methode_calcul_face_keps_impose_,
572 flag_face_keps_imposee_ = 1;
573 const IntTab& face_voisins = domaine_VEF.
face_voisins();
575 for (
int n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
580 (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE"))
583 const IntTab& elem_faces = domaine_VEF.
elem_faces();
587 for (
int ind_face=ndeb; ind_face<nfin; ind_face++)
589 int num_face = le_bord.
num_face(ind_face);
590 int elem=face_voisins(num_face,0);
591 const Domaine& domaine = domaine_VEF.
domaine();
595 for (nf2=0; nf2<nfac; nf2++)
597 num[nf2] = elem_faces(elem,nf2);
599 for (nf2=0; nf2<nfac-1; nf2++)
601 num[nf2] = elem_faces(elem,nf2);
602 if (num[nf2] == num_face)
604 num[nf2] = num[nfac-1];
605 num[nfac-1] = num_face;
609 for (
int nf=0; nf<nfac; nf++)
612 num0=elem_faces(elem,nf);
615 face_keps_imposee_[num0]=-1;
621 face_keps_imposee_[num0]=num_face;
624 if (face_voisins(num0,0)!=elem)
625 elem_voisin=face_voisins(num0,0);
627 elem_voisin=face_voisins(num0,1);
631 if ((methode_calcul_face_keps_impose_==0)||(methode_calcul_face_keps_impose_==3))
636 int num1=elem_faces(elem_voisin,0);
637 int num2=elem_faces(elem_voisin,1);
638 if (num1==num0) num1=elem_faces(elem_voisin,2);
639 else if (num2==num0) num2=elem_faces(elem_voisin,2);
640 if (rang_elem_non_std(elem_voisin)==-1)
643 double dist1=distance_face(num_face,num1,domaine_VEF);
644 double dist2=distance_face(num_face,num2,domaine_VEF);
660 int elem0 = face_voisins(numb,0);
661 int elem1 = face_voisins(numb,1);
663 if ((elem0 == elem_voisin) && (elem1>=0))
664 test_rang = rang_elem_non_std(elem1);
665 else if ((elem1 == elem_voisin) && (elem0>=0))
666 test_rang = rang_elem_non_std(elem0);
671 face_keps_imposee_[numb]=num_face;
676 int num1=elem_faces(elem_voisin,0);
677 int num2=elem_faces(elem_voisin,1);
678 int num3=elem_faces(elem_voisin,2);
679 if (num1==num0) num1=elem_faces(elem_voisin,3);
680 else if (num2==num0) num2=elem_faces(elem_voisin,3);
681 else if (num3==num0) num3=elem_faces(elem_voisin,3);
684 if ((methode_calcul_face_keps_impose_==3)||(num1>=ndebint && num2>=ndebint && num3>=ndebint))
687 double dist1=distance_face(num_face,num1,domaine_VEF);
688 double dist2=distance_face(num_face,num2,domaine_VEF);
689 double dist3=distance_face(num_face,num3,domaine_VEF);
711 face_keps_imposee_[num1] = num_face;
715 face_keps_imposee_[num2] = num_face;
720 else if (methode_calcul_face_keps_impose_ == 2)
721 for (
int dir = 0; dir < nfac; dir++)
723 assert(methode_calcul_face_keps_impose_ == 2);
724 const int num3 = elem_faces(elem_voisin, dir);
725 if ((num3 > 0) && (num3 != num0))
727 int face_asso = face_keps_imposee_[num3];
729 face_keps_imposee_[num3] = num_face;
735 face_keps_imposee_[num3] = num_face;
743 assert(methode_calcul_face_keps_impose_ == 4);
754 for (
int n_bord = 0; n_bord < domaine_VEF.
nb_front_Cl(); n_bord++)
762 || (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE"))
764 for (
int ind_face = ndeb; ind_face < nfin; ind_face++)
766 const int num_face = le_bord.
num_face(ind_face);
767 face_keps_imposee_[num_face] = -1;
772 || sub_type(
Symetrie, la_cl.valeur()))
778 for (
int ind_face = ndeb; ind_face < nfin; ind_face++)
780 const int num_face = le_bord.
num_face(ind_face);
781 face_keps_imposee_[num_face] = -2;
797 const IntTab& face_voisins = domaine_VEF.
face_voisins();
798 const Equation_base& eqn_hydr = mon_modele_turb_hyd->equation();
802 const DoubleTab& tab_visco = ch_visco_cin.
valeurs();
803 const Domaine& domaine = domaine_VEF.
domaine();
810 visco = std::max(tab_visco(0,0),DMINFLOAT);
818 Cerr <<
"In Paroi_std_hyd_VEF::calculer_hyd_BiK : visco = " << tab_visco.
local_min_vect() <<
" <= 0 ? " << finl;
824 double dist=-1,d_visco=-1;
825 double u_plus_d_plus,u_plus,d_plus,u_star;
838 for (
int n_bord=0; n_bord<nb_bords; n_bord++)
847 (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE") )
851 if(la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE")
853 is_defilante = (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE");
862 const IntTab& elem_faces = domaine_VEF.
elem_faces();
867 for (
int ind_face=ndeb; ind_face<nfin; ind_face++)
869 int num_face=le_bord.
num_face(ind_face);
870 int elem=face_voisins(num_face,0);
872 is_defilante_face[num_face]=is_defilante;
873 stock_erugu[num_face]=erugu;
876 for (
int nf2=0; nf2<nfac; nf2++)
877 num[nf2] = elem_faces(elem,nf2);
880 for (
int nf2=0; nf2<nfac-1; nf2++)
882 num[nf2] = elem_faces(elem,nf2);
883 if (num[nf2] == num_face)
885 num[nf2] = num[nfac-1];
886 num[nfac-1] = num_face;
892 for (
int nf=0; nf<nfac; nf++)
894 if (num[nf]==num_face)
904 for (
int k=0; k<nfac; k++)
909 tab_k(num[nf]) += tab_k(num[k]);
910 tab_eps(num[nf])+= tab_eps(num[k]);
916 tab_eps(num[nf])/=nk;
924 norm_v=norm_vit_lp_k(vitesse,num[nf],num_face,domaine_VEF,val,is_defilante);
926 dist=distance_face(num_face,num[nf],domaine_VEF);
928 dist=distance_face_elem(num_face,elem,domaine_VEF);
933 d_visco = tab_visco(elem,0);
935 u_plus_d_plus = norm_v*dist/d_visco;
942 u_star = norm_v/u_plus ;
943 d_plus = u_plus_d_plus/u_plus ;
974 u_starbis=sqrt(sqrt(u_starbis));
977 if (u_starbis != 0)
uplus_(num_face)=norm_v/u_starbis;
987 const double erugu =
Erugu;
997 for (
int ind_face=ndeb; ind_face<nfin; ind_face++)
999 const int num_face=le_bord.
num_face(ind_face);
1000 const int elem=face_voisins(num_face,0);
1002 double psc=0, norm=0;
1007 psc += vitesse(num_face,comp)*normales(num_face,comp);
1008 norm += normales(num_face,comp)*normales(num_face,comp);
1011 if (std::fabs(norm)>=DMINFLOAT) psc/=norm;
1015 val[comp]=vitesse(num_face,comp)-psc*normales(num_face,comp);
1016 norm_v += val[comp]*val[comp];
1019 norm_v = sqrt(norm_v);
1028 d_visco = tab_visco(elem,0);
1030 u_plus_d_plus = norm_v*dist/d_visco;
1038 u_star = norm_v/u_plus ;
1039 d_plus = u_plus_d_plus/u_plus ;
1062 u_starbis=sqrt(sqrt(u_starbis));
1066 if (u_starbis != 0)
uplus_(num_face)=norm_v/u_starbis;
1083 DoubleVect toto(nb_faces_tot);
1084 const ArrOfInt& renum=Debog::renum_faces();
1085 for (
int i=0; i<nb_faces_tot; i++)
1088 if (i>1000) Cerr<<
me()<<
" face_virt "<<i<<finl;
1097 remplir_face_keps_imposee_gen( tutu, test, domaine_VEF,le_dom_Cl_dis_,!is_champ_Q1NC);
1099 if (max(test)>0|| min(test)<0)
1101 const DoubleTab& xv=domaine_VEF.
xv();
1102 Cerr<<
"TEST "<<finl;
1103 int compteur=0,compteur2=0;
1104 for (
int i=0; i<test.size_array(); i++)
1110 Cerr<<
me()<<
" face "<<i<<
" : " <<
face_keps_imposee_(i)<<
" "<<test(i)<<
" pos "<<xv(i,0)<<
" "<<xv(i,1);
1120 Cerr<<
" pos test "<<xv(test(i),0)<<
" "<<xv(test(i),1);
1121 if (
dimension==3) Cerr<<
" "<<xv(test(i),2);
1125 if (test(i)>-1) compteur++;
1128 Cerr<<
"compteurs "<<compteur2<<
" "<<compteur<<finl;
1136 for (
int face=0; face<nb_faces_tot; face++)
1142 int elem=face_voisins(num_face,0);
1150 distb=distance_face(num_face,face,domaine_VEF);
1155 distb=distance_face_elem(num_face,elem,domaine_VEF);
1158 norm_v=norm_vit_lp_k(vitesse,face,num_face,domaine_VEF,val,is_defilante_face[num_face]);
1162 d_visco = tab_visco(elem,0);
1164 u_plus_d_plus = norm_v*distb/d_visco;
1169 u_star = norm_v/u_plus ;
1170 d_plus = u_plus_d_plus/u_plus ;
1194 const Equation_base& eqn_hydr = mon_modele_turb_hyd->equation();
1198 const DoubleTab& tab_visco = ch_visco_cin.
valeurs();
1199 const Domaine& domaine = domaine_VEF.
domaine();
1205 visco0 = std::max(tab_visco(0, 0), DMINFLOAT);
1212 Cerr <<
"In Paroi_std_hyd_VEF::calculer_hyd : visco = " << tab_visco.
local_min_vect() <<
" <= 0 ? " << finl;
1221 le_dom_Cl_dis_, !is_champ_Q1NC);
1223 const int nfac = domaine.nb_faces_elem();
1227 DoubleTrav tab_erugu(nb_faces_tot);
1228 IntTrav tab_is_defilante_face(nb_faces_tot);
1229 IntTrav tab_compteur(nb_faces_tot);
1230 IntArrView compteur =
static_cast<ArrOfInt&
>(tab_compteur).view_wo();
1231 DoubleTrav tab_sum(nb_faces_tot, 2);
1232 DoubleTabView sum = tab_sum.
view_rw();
1233 const double Kappa =
Kappa_;
1234 const double Cmu =
Cmu_;
1238 for (
int n_bord = 0; n_bord < nb_bords; n_bord++)
1244 || la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE";
1247 if (dirichlet || robin)
1249 int is_defilante = sub_type(
Dirichlet_paroi_defilante, la_cl.valeur()) || (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE");
1261 const double delta = robin ? ref_cast(
Paroi_decalee_Robin, la_cl.valeur()).get_delta() : -1;
1265 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
1267 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
1268 CIntArrView le_bord_num_face = le_bord.
num_face().view_ro();
1269 CDoubleTabView face_normale = domaine_VEF.
face_normales().view_ro();
1270 CDoubleTabView xv = domaine_VEF.
xv().view_ro();
1271 CDoubleTabView xp = domaine_VEF.
xp().view_ro();
1272 CDoubleTabView vitesse = tab_vitesse.
view_ro();
1273 CDoubleTabView visco = tab_visco.
view_ro();
1275 DoubleArrView seuil_LP =
seuil_LP_.view_wo();
1279 DoubleArrView uplus =
uplus_.view_wo();
1280 DoubleArrView stock_erugu =
static_cast<ArrOfDouble&
>(tab_erugu).view_wo();
1281 IntArrView is_defilante_face =
static_cast<ArrOfInt&
>(tab_is_defilante_face).view_wo();
1282 DoubleTabView keps = tab_2eq.
view_rw();
1285 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), size, KOKKOS_LAMBDA(
const int ind_face)
1287 const int num_face = le_bord_num_face(ind_face);
1288 const int elem = face_voisins(num_face, 0);
1289 double d_visco = l_unif ? visco0 : visco(elem, 0);
1290 double u_star = -1, d_plus = -1;
1292 double norm_v = 0, dist = -1;
1296 is_defilante_face[num_face] = is_defilante;
1297 stock_erugu[num_face] = erugu;
1300 for (
int nf = 0; nf < nfac; nf++)
1303 int face = elem_faces(elem, nf);
1307 norm_v = norm_vit_lp_k(dim, vitesse, face, num_face, face_normale, val, is_defilante);
1310 dist = distance_face(dim, num_face, face, xv, face_normale);
1312 dist = distance(dim, num_face, elem, xp, xv, face_normale);
1314 double u_plus_d_plus = norm_v * dist / d_visco;
1315 double u_plus = calculer_u_plus_kokkos(nf, u_plus_d_plus, erugu, Kappa, seuil_LP,
1317 if (is_u_star_impose)
1319 u_star = u_star_impose;
1324 u_star = u_plus == 0 ? 0 : norm_v / u_plus;
1325 d_plus = u_plus == 0 ? 0 : u_plus_d_plus / u_plus;
1329 for (
int dir = 0; dir < dim; dir++)
1335 d_plus, u_star, d_visco, dist, Cmu, Kappa);
1336 Kokkos::atomic_add(&sum(face, 0), k);
1337 Kokkos::atomic_add(&sum(face, 1), eps);
1338 Kokkos::atomic_add(&compteur(face), 1);
1343 for (
int dir = 0; dir < dim; dir++)
1350 for (
int comp = 0; comp < dim; comp++)
1352 psc += vitesse(num_face, comp) * face_normale(num_face, comp);
1353 norm += face_normale(num_face, comp) * face_normale(num_face, comp);
1356 if (std::fabs(norm) >= DMINFLOAT)
1359 for (
int comp = 0; comp < dim; comp++)
1361 val[comp] = vitesse(num_face, comp) - psc * face_normale(num_face, comp);
1362 norm_v += val[comp] * val[comp];
1364 norm_v = sqrt(norm_v);
1365 if (std::fabs(norm_v) >= DMINFLOAT)
1366 for (
int comp = 0; comp < dim; comp++)
1367 val[comp] /= norm_v;
1371 double u_plus_d_plus = norm_v * dist / d_visco;
1372 double u_plus = calculer_u_plus_kokkos(ind_face, u_plus_d_plus, erugu, Kappa, seuil_LP,
1375 if (is_u_star_impose)
1377 u_star = u_star_impose;
1382 u_star = u_plus == 0 ? 0 : norm_v / u_plus;
1383 d_plus = u_plus == 0 ? 0 : u_plus_d_plus / u_plus;
1386 for (
int dir = 0; dir < dim; dir++)
1390 double u_starbis = 0;
1391 for (
int dir = 0; dir < dim; dir++)
1393 u_starbis = sqrt(sqrt(u_starbis));
1396 tab_d_plus(num_face) = u_starbis * dist / d_visco;
1398 uplus(num_face) = norm_v / u_starbis;
1404 d_plus, u_star, d_visco, dist, Cmu, Kappa);
1407 end_gpu_timer(__KERNEL_NAME__);
1413 DoubleTabView keps = tab_2eq.
view_rw();
1414 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(0, compteur.size()), KOKKOS_LAMBDA(
const int face)
1416 if (compteur(face)>0)
1418 keps(face, 0) = sum(face,0) / compteur(face);
1419 keps(face, 1) = sum(face,1) / compteur(face);
1422 end_gpu_timer(__KERNEL_NAME__);
1425 for (
int n_bord = 0; n_bord < nb_bords; n_bord++)
1431 || la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE";
1436 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
1438 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
1439 CIntArrView le_bord_num_face = le_bord.
num_face().view_ro();
1440 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(0, size), KOKKOS_LAMBDA(
1443 const int num_face = le_bord_num_face(ind_face);
1444 const int elem = face_voisins(num_face, 0);
1448 for (
int k = 0; k < nfac; k++)
1450 int face = elem_faces(elem, k);
1453 ke += keps(face, 0);
1454 eps += keps(face, 1);
1463 keps(num_face, 0) = ke;
1464 keps(num_face, 1) = eps;
1466 end_gpu_timer(__KERNEL_NAME__);
1475 DoubleVect toto(nb_faces_tot);
1476 const ArrOfInt& renum=Debog::renum_faces();
1477 for (
int i=0; i<nb_faces_tot; i++)
1480 if (i>1000) Cerr<<
me()<<
" face_virt "<<i<<finl;
1489 remplir_face_keps_imposee_gen( tutu, test, domaine_VEF,le_dom_Cl_dis_,!is_champ_Q1NC);
1491 if (std::max(test)>0|| std::min(test)<0)
1493 const DoubleTab& xv=domaine_VEF.
xv();
1494 Cerr<<
"TEST "<<finl;
1495 int compteur=0,compteur2=0;
1496 for (
int i=0; i<test.size_array(); i++)
1502 Cerr<<
me()<<
" face "<<i<<
" : " <<
face_keps_imposee_(i)<<
" "<<test(i)<<
" pos "<<xv(i,0)<<
" "<<xv(i,1);
1512 Cerr<<
" pos test "<<xv(test(i),0)<<
" "<<xv(test(i),1);
1513 if (
dimension==3) Cerr<<
" "<<xv(test(i),2);
1517 if (test(i)>-1) compteur++;
1520 Cerr<<
"compteurs "<<compteur2<<
" "<<compteur<<finl;
1528 CDoubleTabView face_normale = domaine_VEF.
face_normales().view_ro();
1529 DoubleArrView seuil_LP =
seuil_LP_.view_wo();
1531 CDoubleTabView xv = domaine_VEF.
xv().view_ro();
1532 CDoubleTabView xp = domaine_VEF.
xp().view_ro();
1533 CDoubleTabView vitesse = tab_vitesse.
view_ro();
1534 CDoubleTabView visco = tab_visco.
view_ro();
1535 CDoubleArrView stock_erugu =
static_cast<const ArrOfDouble&
>(tab_erugu).view_ro();
1536 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
1537 CIntArrView is_defilante_face =
static_cast<const ArrOfInt&
>(tab_is_defilante_face).view_ro();
1538 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(0, nb_faces_tot), KOKKOS_LAMBDA(
const int face)
1544 const int elem = face_voisins(num_face, 0);
1547 dist = distance_face(dim, num_face, face, xv, face_normale);
1549 dist = distance(dim, num_face, elem, xp, xv, face_normale);
1551 double norm_v = norm_vit_lp_k(dim, vitesse, face, num_face, face_normale, val, is_defilante_face[num_face]);
1553 double d_visco = l_unif ? visco0 : visco(elem, 0);
1555 double u_plus_d_plus = norm_v*dist/d_visco;
1556 double u_plus = calculer_u_plus_kokkos(face, u_plus_d_plus, stock_erugu[num_face], Kappa, seuil_LP, iterations_LP);
1558 double u_star = u_plus == 0 ? 0 : norm_v/u_plus ;
1559 double d_plus = u_plus == 0 ? 0 : u_plus_d_plus/u_plus ;
1563 d_plus, u_star, d_visco, dist, Cmu, Kappa);
1566 end_gpu_timer(__KERNEL_NAME__);
1577 const double d_plus,
const double u_star,
1578 const double d_visco,
const double dist,
const double Cmu,
const double Kappa)
1580 if (turbulence_model_type == 1)
1581 calculer_k_eps(tke, var2, d_plus, u_star, d_visco, dist, Cmu, Kappa);
1582 else if (turbulence_model_type == 2)
1583 compute_k_omega(tke, var2, d_plus, u_star, d_visco, dist, Cmu, Kappa);
1585 Process::Kokkos_exit(
"The turbulence model is neither k-epsilon nor k-omega. Implementation required?");
1590double norm_vit_lp(
int dim,
const double* v,
int fac, CDoubleTabView face_normale,
double* val)
1594 for(
int i = 0; i < dim; i++)
1596 r[i] = face_normale(fac, i);
1597 norme += r[i] * r[i];
1599 norme = sqrt(norme);
1600 for(
int i = 0; i < dim; i++)
1605 for (
int i=0; i<dim; i++)
1607 sum_carre += carre(v[i]);
1610 double norm_vit = sqrt(std::fabs(sum_carre-carre(psc)));
1613 for(
int i = 0; i < dim; i++)
1614 val[i] = (v[i] - psc*r[i])/(norm_vit + DMINFLOAT);
1619double norm_vit_lp(
const ArrOfDouble& vit,
int face,
const Domaine_VEF& domaine, ArrOfDouble& val)
1623 const DoubleTab& face_normale = domaine.face_normales();
1627 for(
int i = 0; i < dim; i++)
1628 r[i] = face_normale(face, i);
1630 r /= norme_array(r);
1631 const double psc = dotproduct_array(r, vit);
1633 double norm_vit {0};
1635 norm_vit = vitesse_tangentielle(vit[0],vit[1],vit[2],r[0],r[1],r[2]);
1637 norm_vit = vitesse_tangentielle(vit[0],vit[1],r[0],r[1]);
1639 for(
int i = 0; i < dim; i++)
1640 val[i] = (vit[i] - psc*r[i])/(norm_vit + DMINFLOAT);
1649 const Equation_base& eqn_hydr = mon_modele_turb_hyd->equation();
1652 const DoubleTab& tab_visco = ch_visco_cin.
valeurs();
1653 const Domaine& domaine = domaine_VEF.
domaine();
1660 visco0 = std::max(tab_visco(0,0),DMINFLOAT);
1668 Cerr <<
"In Paroi_std_hyd_VEF::calculer_hyd : visco = " << tab_visco.
local_min_vect() <<
" <= 0 ? " << finl;
1676 double dist_corr=1.;
1677 double coef_vit=nfac;
1690 for (
int n_bord=0; n_bord<nb_bords; n_bord++)
1697 if (dirichlet || robin)
1708 const double delta = robin ? ref_cast(
Paroi_decalee_Robin,la_cl.valeur()).get_delta() : 0;
1713 CIntArrView le_bord_num_face = le_bord.
num_face().view_ro();
1714 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
1715 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
1717 CDoubleTabView face_normales = domaine_VEF.
face_normales().view_ro();
1718 CDoubleTabView xp = domaine_VEF.
xp().view_ro();
1719 CDoubleTabView xv = domaine_VEF.
xv().view_ro();
1720 CDoubleTabView visco = tab_visco.
view_ro();
1722 DoubleArrView seuil_LP =
seuil_LP_.view_wo();
1724 DoubleArrView uplus =
uplus_.view_wo();
1727 DoubleArrView nu_t =
static_cast<ArrOfDouble&
>(tab_nu_t).view_wo();
1728 DoubleArrView k =
static_cast<ArrOfDouble&
>(tab_k).view_wo();
1730 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(ndeb, nfin), KOKKOS_LAMBDA (
const int ind_face)
1734 int num_face = le_bord_num_face(ind_face);
1735 int elem = face_voisins(num_face,0);
1737 double dist=0, norm_v=0;
1741 for (
int j = 0; j < dim; j++)
1743 for (
int i = 0; i < nfac; i++)
1745 int face = elem_faces(elem, i);
1746 for (
int j = 0; j < dim; j++)
1747 vit[j] += (vitesse(face, j) -
1748 vitesse(num_face, j));
1750 for (
int j = 0; j < dim; j++)
1753 dist = distance(dim, num_face, elem, xp, xv, face_normales);
1756 norm_v = norm_vit_lp(dim, vit, num_face, face_normales, val);
1761 double psc=0, norm=0;
1762 for(
int comp=0; comp<dim; comp++)
1764 psc += vitesse(num_face,comp)*face_normales(num_face,comp);
1765 norm += face_normales(num_face,comp)*face_normales(num_face,comp);
1768 if (std::fabs(norm)>=DMINFLOAT) psc/=norm;
1770 for(
int comp=0; comp<dim; comp++)
1772 val[comp]=vitesse(num_face,comp)-psc*face_normales(num_face,comp);
1773 norm_v += val[comp]*val[comp];
1775 norm_v = sqrt(norm_v);
1776 for (
int j = 0; j < dim; j++)
1781 double d_visco = l_unif ? visco0 : visco(elem,0);
1783 double u_plus_d_plus = norm_v*dist/d_visco;
1785 double u_plus = calculer_u_plus_kokkos(ind_face,u_plus_d_plus,erugu,Kappa,seuil_LP,iterations_LP);
1787 double u_star, d_plus;
1788 if (is_u_star_impose)
1790 u_star = u_star_impose;
1795 u_star = u_plus ? norm_v/u_plus : 0.;
1796 d_plus = u_plus ? u_plus_d_plus/u_plus : 0.;
1799 compute_k_eps(k(elem),eps,d_plus,u_star,d_visco,dist, Cmu, Kappa);
1802 for (
int j=0; j<dim; j++)
1806 if((!LM) && (!COMB)) nu_t(elem) = Cmu*k(elem)*k(elem)/(eps+DMINFLOAT);
1808 uplus(num_face) = u_plus;
1814 if (COMB && nombre_sources==0)
1815 nu_t(elem) *= dist_corr;
1818 end_gpu_timer(__KERNEL_NAME__);
1839 k = 0.07*yp*yp*exp(-yp/9.);
1840 k += 1./sqrt(Cmu)*(1. - exp(-yp/20.))*(1. - exp(-yp/20.));
1859 const double u_star,
const double d_visco,
const double Kappa)
1861 double const u_star_squared = u_star*u_star;
1864 eps = 1./(Kappa*pow(yp*yp*yp*yp + 50625, 0.25));
1865 eps *= u_star_squared*u_star_squared/d_visco;
1870 const double u_star,
const double d_visco,
1871 const double dist,
const double Kappa)
1882 const double w_log = u_star/(std::sqrt(
BETA_K)*Kappa*dist);
1883 const double w_1 = w_vis + w_log ;
1884 const double w_2 = std::pow(std::pow(w_vis, 1.2) + std::pow(w_log, 1.2), 1./1.2);
1885 const double blending = std::tanh(yp/10*yp/10*yp/10*yp/10);
1887 omega = blending*w_1 + (1 - blending)*w_2;
1893 const double yp,
const double u_star,
1894 const double d_visco,
const double dist,
const double Cmu,
const double Kappa)
1896 return compute_k_eps(k, eps, yp, u_star, d_visco, dist, Cmu, Kappa);
1901 double yp,
double u_star,
1902 double d_visco,
double dist,
double Cmu,
double Kappa)
1911 double yp,
double u_star,
1912 double d_visco,
double dist,
double Cmu,
double Kappa)
1923 double upmoy,dpmoy,utaumoy;
1924 double seuil_moy,iter_moy;
1938 for (
int n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
1944 (la_cl->que_suis_je() ==
"Frontiere_ouverte_vitesse_imposee_ALE"))
1950 Ustar <<
"Bord " << le_bord.
le_nom() << finl;
1953 Ustar <<
"-------------------------------------------------------------------------------------------";
1954 Ustar <<
"--------------------------------------------------------------------------------------------" << finl;
1955 Ustar <<
"\tFace a\t\t\t\t|\t\t\t\t\t\t\t\t\t| TAU=Nu.Grad(Ut) [m2/s2]" << finl;
1956 Ustar <<
"----------------------------------------|--------------------------------------------------";
1957 Ustar <<
"---------------------|----------------------------------------------------------------------" << finl;
1958 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;
1959 Ustar <<
"----------------|-----------------------|-----------------------|-----------------------|--";
1960 Ustar <<
"---------------------|-----------------------|-----------------------|----------------------" << finl;
1964 Ustar <<
"-----------------------------------------------------------------------------------------------------------------";
1965 Ustar <<
"-----------------------------------------------------------------------------------------------------------------" << finl;
1966 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;
1967 Ustar <<
"----------------------------------------------------------------|------------------------------------------------";
1968 Ustar <<
"-----------------------|-----------------------------------------------------------------------------------------" << finl;
1969 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;
1970 Ustar <<
"----------------|-----------------------|-----------------------|-----------------------|-----------------------|";
1971 Ustar <<
"-----------------------|-----------------------|-----------------------|-----------------------|-----------------" << finl;
1976 for (
int num_face=ndeb; num_face<nfin; num_face++)
1978 double x=domaine_VEF.
xv(num_face,0);
1979 double y=domaine_VEF.
xv(num_face,1);
1982 Ustar << x <<
"\t| " << y;
1985 double z=domaine_VEF.
xv(num_face,2);
1986 Ustar << x <<
"\t| " << y <<
"\t| " << z;
1989 norme_L2=sqrt(norme_L2);
1999 upmoy +=
uplus_(num_face);
2018 ArrOfDouble array(6);
2031 compt=(int)array[5];
2037 Ustar <<
"-------------------------------------------------------------" << finl;
2038 Ustar <<
"Calcul des valeurs moyennes (en supposant maillage regulier):" << finl;
2039 Ustar <<
"<u+>= " << upmoy/compt <<
" <d+>= " << dpmoy/compt <<
" <u*>= " << utaumoy/compt <<
" seuil_LP= " << seuil_moy/compt <<
" iterations_LP= " << iter_moy/compt << finl;
2041 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_