TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Paroi_std_hyd_VEF.cpp
1/****************************************************************************
2* Copyright (c) 2017, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
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>
25#include <Debog.h>
26#include <TRUSTList.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>
31#include <Param.h>
32#include <Paroi_rugueuse.h>
33#include <SFichier.h>
34#include <Paroi_decalee_Robin.h>
35#include <Schema_Temps_base.h>
36#include <communications.h>
37
38// methode_calcul_face_keps_impose_ value:
39// 0: std avant
40// 1: toutes les faces accrochees
41// 2: comme avant mais toutes les faces des elts accroches.
42// 3: comme avant sans test si bord...
43// 4: que les faces des elements Dirichlet accroches
44// 5: 4 avec test de distance pour //
45// -1: 1 en 2D, 5 en 3D
46
47Implemente_instanciable_sans_constructeur(Paroi_std_hyd_VEF,"loi_standard_hydr_VEF",Paroi_hyd_base_VEF);
48Implemente_instanciable(Loi_expert_hydr_VEF,"Loi_expert_hydr_VEF",Paroi_std_hyd_VEF);
49// XD loi_standard_hydr_VEF turbulence_paroi_base loi_standard_hydr_VEF BRACE Standard wall function for the VEF
50// XD_CONT discretisation.
51// XD Loi_expert_hydr_VEF turbulence_paroi_base Loi_expert_hydr_VEF BRACE Expert wall function for the VEF
52// XD_CONT discretisation.
53
55
57{
58 return s << que_suis_je() << " " << le_nom();
59}
60
62{
63 return s << que_suis_je() << " " << le_nom();
64}
65//// readOn
66//
67
69{
71}
72
74{
75
76 Param param(que_suis_je());
78
79 param.ajouter("u_star_impose",&u_star_impose_); // XD_ADD_P double
80 // XD_CONT Imposed U* value
81 param.ajouter("methode_calcul_face_keps_impose", &methode_calcul_face_keps_impose_); // XD_ADD_P int
82 // XD_CONT Method to select which faces will be used to compute k and epsilon
83
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);
87
88 param.ajouter("coeff_omega_wall",&coeff_omega_wall_); // XD_ADD_P int
89 // XD_CONT coeff for omega boundary condition
90
91 param.lire_avec_accolades_depuis(s);
92
93 Nom mot_test;
94 mot_test = "u_star_impose";
95
96 if (param.get_list_mots_lus().rang(Motcle(mot_test))!=-1)
98
99 return s ;
100}
101
107
108/////////////////////////////////////////////////////////////////////
109//
110// Implementation des fonctions de la classe Paroi_std_hyd_VEF
111//
112/////////////////////////////////////////////////////////////////////
113KOKKOS_FUNCTION
114bool compute_u_plus(const int ind_face,
115 const double u_plus_d_plus,
116 const double erugu,
117 const double Kappa,
118 double& r, int& iter, double& u_plus)
119{
120 iter = 0;
121 r = 1.;
122 // PQ : 05/04/07 : formulation continue de la loi de paroi
123 // construite d'apres la loi de Reichardt
124 if(u_plus_d_plus < 1.)
125 {
126 u_plus = sqrt(u_plus_d_plus); // pour eviter de faire tourner la procedure iterative
127 return true;
128 }
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) ; // (=7.44, contre 7.8 dans la loi d'origine)
133 // permettant d'avoir en l'infini la loi de
134 // Reichardt se calant sur : u+ = (1/Kappa).ln(Erugu.y+)
135
136 // Fixed point method for Reichardt equation
137 while((iter++ < itmax) && (r > seuil))
138 {
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;
144 }
145 return (iter < itmax);
146}
147#pragma clang optimize off
148KOKKOS_FUNCTION
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)
150{
151 double r, u_plus;
152 int iter;
153 if (!compute_u_plus(ind_face, u_plus_d_plus, erugu, Kappa, r, iter, u_plus))
154 {
155#ifdef KOKKOS
156 Kokkos::printf("u+d+= %f \n", u_plus_d_plus);
157 Kokkos::abort("The iterative process of u* did not converge!");
158#else
159 Process::exit("The iterative process of u* did not converge!");
160#endif
161 }
162 seuil_LP(ind_face) = r;
163 iterations_LP(ind_face) = iter;
164 return u_plus;
165}
166#pragma clang optimize on
167
168KOKKOS_FUNCTION
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)
172{
173 // PQ : 05/04/07 : formulation continue de k et epsilon
174 // assurant le bon comportement asymptotique
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.)); // k_plus
178 k *= u_star_carre;
179 // PL: 50625=15^4 on evite d'utiliser pow car lent
180 eps = 1./(Kappa*pow(yp*yp*yp*yp+50625, 0.25)); // eps_plus
181 eps *= u_star_carre*u_star_carre/d_visco;
182
183 return 1;
184}
185
186double Paroi_std_hyd_VEF::calculer_u_plus(const int ind_face,
187 const double u_plus_d_plus,
188 const double erugu)
189{
190 double r {0.0}, u_plus {0.0};
191 int iter {0};
192 if (!compute_u_plus(ind_face, u_plus_d_plus, erugu, Kappa_, r, iter, u_plus))
193 erreur_non_convergence();
194 seuil_LP_(ind_face) = r;
195 iterations_LP_(ind_face) = iter;
196 return u_plus;
197}
198
200{
201 tab_u_star_.resize(le_dom_dis_->nb_faces_tot());
202 tab_d_plus_.resize(le_dom_dis_->nb_faces_tot());
203 uplus_.resize(le_dom_dis_->nb_faces_tot());
204 if (!Cisaillement_paroi_.get_md_vector())
205 {
207 le_dom_dis_->creer_tableau_faces(Cisaillement_paroi_);
208 }
209 seuil_LP_.resize(le_dom_dis_->nb_faces_tot());
210 iterations_LP_.resize(le_dom_dis_->nb_faces_tot());
211
213
215}
216
217// Remplissage de la table
218
220{
221 Cmu_ = mon_modele_turb_hyd->get_Cmu();
223 return 1;
224}
225
226// face_keps_imposee_ constitue une connectivite entre face connectee a un bord et face de bord
227//-pour une face pas connectee a un bord portant une CL de Dirichlet ou n appartenant pas a ce type de bord : -2
228//-pour une face appartenant a un bord portant une CL de Dirichlet : -1
229//-pour une face connectee a un bord portant une CL de Dirichlet : numero_de_face de bord la plus proche
230
231void remplir_face_keps_imposee_gen(int& flag_face_keps_imposee_,
232 IntVect& face_keps_imposee_,
233 int& methode_calcul_face_keps_impose_,
234 const Domaine_VEF& domaine_VEF,
235 const Domaine_Cl_dis_base& le_dom_Cl_dis_,
236 int is_champ_P1NC)
237{
238 if (flag_face_keps_imposee_==0)
239 {
240 flag_face_keps_imposee_=1;
241 Cerr<<"construction de fac_keps_imposee_ par la methode generale"<<finl;
242 int nb_faces_tot=domaine_VEF.nb_faces_tot();
243
244 // Dimensionnement et initialisation de face_keps_imposee_
245 if (!face_keps_imposee_.get_md_vector())
246 domaine_VEF.creer_tableau_faces(face_keps_imposee_, RESIZE_OPTIONS::NOCOPY_NOINIT);
247 face_keps_imposee_=-2;
248
249 // Remplissage de face_bords_diri donnant les faces
250 // de bord avec une CL de Dirichlet
251 int compt=0;
252 ArrOfInt face_bords_diri(nb_faces_tot);
253 for (int n_bord=0; n_bord<domaine_VEF.nb_front_Cl(); n_bord++)
254 {
255 const Cond_lim& la_cl = le_dom_Cl_dis_.les_conditions_limites(n_bord);
256 if (sub_type(Dirichlet_paroi_fixe,la_cl.valeur()) ||
257 (sub_type(Dirichlet_paroi_defilante,la_cl.valeur()) ) ||
258 (la_cl->que_suis_je() == "Frontiere_ouverte_vitesse_imposee_ALE"))
259 {
260 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
261 int ndeb = 0;
262 int nfin = le_bord.nb_faces_tot();
263 // On traite les faces de bord reelles.
264 for (int ind_face=ndeb; ind_face<nfin; ind_face++)
265 {
266 face_bords_diri[compt++]= le_bord.num_face(ind_face);
267 }
268 }
269 }
270 face_bords_diri.resize_array(compt);
271
272 // Remplissage du tableau is_sommet_sur_bord qui contient
273 // les sommets appartenant a une face de bord avec une CL Dirichlet
274 ArrOfInt is_sommet_sur_bord(domaine_VEF.nb_som_tot());
275 const IntTab& face_sommets=domaine_VEF.face_sommets();
276 int nb_som_face=face_sommets.line_size();
277 for (int fac=0; fac<compt; fac++)
278 {
279 int face=face_bords_diri[fac];
280 for (int som=0; som<nb_som_face; som++)
281 {
282 int sommet=face_sommets(face,som);
283 is_sommet_sur_bord[sommet]++;
284 }
285 }
286
287 //On exploite is_sommet_sur_bord pour fixer la taille des List que va repertorier som_face_bord
288 //-som_face_bord contient nb_som_tot List
289 //-chaque List est dimensionnee par le nombre de faces de bord (portant une CL de Dirichlet)
290 // connectees au sommet considere
291 //-une List donnee pour un sommet repertorie le numero des faces qui lui sont connectees
292
293 Static_Int_Lists som_face_bord;
294 som_face_bord.set_list_sizes(is_sommet_sur_bord);
295 is_sommet_sur_bord=0;
296 for (int fac=0; fac<compt; fac++)
297 {
298 int face=face_bords_diri[fac];
299 for (int som=0; som<nb_som_face; som++)
300 {
301 int sommet=face_sommets(face,som);
302 int n=(is_sommet_sur_bord[sommet])++;
303 som_face_bord.set_value(sommet,n,face);
304 }
305 }
306
307 //-on parcourt toutes les faces du domaine pour identifier celles qui sont connectees a une face de bord
308 // portant une CL de Dirichlet
309 //-pour une face connectee on determine le nombre de sommets appartenant au(x) bord(s) (ils sont listes dans test)
310 //int nb_faces_testes=nb_faces_tot;
311 ArrOfInt traite_face(nb_faces_tot);
312 if (methode_calcul_face_keps_impose_==5)
313 {
314 traite_face=0;
315 // on marque que les faces sur les elements acrroches..
316 const IntTab& face_voisins = domaine_VEF.face_voisins();
317 int nb_faces_elem = domaine_VEF.domaine().nb_faces_elem();
318 // on parcourt les bords dirichlet, on cherche les voisins...
319 for (int n_bord=0; n_bord<domaine_VEF.nb_front_Cl(); n_bord++)
320 {
321 const Cond_lim& la_cl = le_dom_Cl_dis_.les_conditions_limites(n_bord);
322 if (sub_type(Dirichlet_paroi_fixe,la_cl.valeur()) ||
323 (sub_type(Dirichlet_paroi_defilante,la_cl.valeur()) ) ||
324 (la_cl->que_suis_je() == "Frontiere_ouverte_vitesse_imposee_ALE"))
325 {
326 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
327 const IntTab& elem_faces = domaine_VEF.elem_faces();
328 int ndeb = 0;
329 int nfin = le_bord.nb_faces_tot();
330 // On traite toutes les faces de bord
331 for (int ind_face=ndeb; ind_face<nfin; ind_face++)
332 {
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;
337 }
338 }
339 }
340 }
341 else
342 {
343 traite_face=1;
344 assert(methode_calcul_face_keps_impose_==1);
345 }
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])
349 {
350 // on regarde combien de sommets sont en commun avec le bord
351 IntList test;
352 for (int som=0; som<nb_som_face; som++)
353 {
354 int sommet=face_sommets(ind_face,som);
355 if (is_sommet_sur_bord[sommet])
356 test.add(sommet);
357 }
358 int test_size=test.size();
359 if (test_size==0) //||(test_size==nb_som_face))
360 {
361 ; // on a rien a faire pour ce type de face (touche pas le bord ou sont confondus avec une face de bord (et non cas tordu ou une face est constituee que de sommets de bord mais pas sur le meme bord...
362 }
363 else
364 {
365 // la face ind_face est connectee a un bord associe a une CL de Dirichlet
366 // on va determiner l'ensemble des faces de bord auxquelles elles est connectee
367 // -on selectionne une face de bord f_pos parmi celles de la liste des faces associees
368 // au premier sommet de la liste test
369 // -on recherche ensuite si cette face est connue dans chacune des listes de faces associees
370 // avec les autres sommets de la liste test. Si c est le cas, cette face est retenue comme possible
371 // pour etre connectee a ind_face
372
373 IntList possible;
374 for (int i=0; i<som_face_bord.get_list_size(test[0]); i++)
375 {
376 int f_pos=som_face_bord(test[0],i);
377 int ok=1;
378 for (int lis=1; lis<test_size; lis++)
379 {
380 int som=test[lis];
381 int ok2=0;
382 for (int k=0; k<som_face_bord.get_list_size(som); k++)
383 {
384 int f2=som_face_bord(som,k);
385 if (f2==f_pos) ok2=1;
386 }
387 if (ok2==0) ok=0;
388 }
389 if (ok==1) possible.add(f_pos);
390 }
391
392 //Dans le cas ou la face traitee appartient a deux bords differents portant une CL de type Dirichlet
393 //il se peut que tous les sommets connectes n aient pas une face de bord commune et par consequent
394 //possible est vide
395 //Dans cette situation, on construit la liste possible a partir de toutes les faces contenues
396 //dans les listes identifiees par som_face_bord pour les sommets contenus dans test
397
398 if ((possible.size()==0))
399 {
400 //Cerr<<"Attention choix par la distance pour la face "<<ind_face<<finl;
401 for (int k=0; k<test_size; k++)
402 for (int i=0; i<som_face_bord.get_list_size(test[k]); i++)
403 {
404 int f_pos=som_face_bord(test[k],i);
405
406 possible.add_if_not(f_pos);
407 }
408 }
409
410 assert(possible.size());
411 int combien_de_face_possible=possible.size();
412
413 //On remplit maintenant face_keps_imposee
414 // -soit il n y a qu une face possible et on retient celle-ci
415 // -soit il y en a plusieurs et on retient celle qui satisfait les deux criteres suivants :
416 // 1 : la distance normale entre ind_face et face_possible est au moins 10 % de la distance totale
417 // 2 : Si plusieurs faces possibles satisfont le critere 1 on retient celle est a la plus petite distance
418 // Dans le cas ou il reste plusieurs faces (qui sont donc a la meme distance de ind_face),
419 // on recherche celle qui est a une distance minimum d un face fictive obtenue en translatant ind_face.
420 // La translation est effectuee dans les trois directions jusqu a obtention d une face possible unique.
421 // Ce tri doit assurer le parallelisme quant au choix de la face a connecter a ind_face.
422
423 if (combien_de_face_possible==1)
424 face_keps_imposee_[ind_face]=possible[0];
425 else
426 {
427 //On supprime les faces possibles qui ne respecte pas le critere de distance normale
428 int ind=-1;
429 int elem_suppr=0;
430 int pos=0;
431 int size_initiale = possible.size();
432 while (pos<size_initiale)
433 {
434 int new_pos = pos-elem_suppr;
435 int f_new_pos=possible[new_pos];
436 double dist=0;
437 double dist2=distance_face(ind_face,f_new_pos,domaine_VEF);
438 for (int dir=0; dir<Objet_U::dimension; dir++)
439 {
440 dist+=(xv(f_new_pos,dir)-xv(ind_face,dir))*(xv(f_new_pos,dir)-xv(ind_face,dir));
441 }
442 if (dist2<=0.1*dist)
443 {
444 possible.suppr(f_new_pos);
445 elem_suppr++;
446 }
447 pos++;
448 }
449
450 if (possible.size()!=0)
451 {
452 //Parmi les faces possibles restantes on cherche celle qui est a une distance minimale
453 //ce choix etant fait en assurant le parallelisme
454
455 int dimension = Objet_U::dimension;
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);
463 if (dimension>2)
464 coord_ref(2) = xv(ind_face,2);;
465
466 for (int i_face=0; i_face<size_liste; i_face++)
467 {
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);
471 }
472 Domaine::identifie_item_unique(possible,coord_possible,coord_ref);
473 ind = possible[0];
474 }
475
476 // Si pas de face trouvee on considere que c est parce que le critere de normalite
477 // n est pas respecte. Dans ce cas la on ne connecte pas la face
478 if (ind==-1)
479 ind = -2;
480 face_keps_imposee_[ind_face] = ind;
481 }
482 }
483 }
484
485 // on reparcourt les bords pour remettre les bon flags
486 for (int n_bord=0; n_bord<domaine_VEF.nb_front_Cl(); n_bord++)
487 {
488 const Cond_lim& la_cl = le_dom_Cl_dis_.les_conditions_limites(n_bord);
489 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
490 int ndeb = 0;
491 int nfin = le_bord.nb_faces_tot();
492 if (sub_type(Dirichlet_paroi_fixe,la_cl.valeur()) ||
493 (sub_type(Dirichlet_paroi_defilante,la_cl.valeur()) ) ||
494 (la_cl->que_suis_je() == "Frontiere_ouverte_vitesse_imposee_ALE"))
495 {
496 for (int ind_face=ndeb; ind_face<nfin; ind_face++)
497 {
498 int num_face=le_bord.num_face(ind_face);
499 face_keps_imposee_[num_face]=-1;
500 }
501 }
502 else if (sub_type(Periodique,la_cl.valeur()) || sub_type(Neumann_sortie_libre,la_cl.valeur()) || sub_type(Symetrie,la_cl.valeur()))
503 {
504 //exit();
505 }
506 else
507 {
508 for (int ind_face=ndeb; ind_face<nfin; ind_face++)
509 {
510 int num_face=le_bord.num_face(ind_face);
511 face_keps_imposee_[num_face]=-2;
512 }
513 }
514 }
515 Cerr<<"fin construction de fac_keps_imposee_ par la methode generale"<<finl;
516 }
517}
518
519void remplir_face_keps_imposee(int& flag_face_keps_imposee_,
520 int methode_calcul_face_keps_impose_,
521 IntVect& face_keps_imposee_,
522 const Domaine_VEF& domaine_VEF,
523 const Domaine_Cl_dis_base& le_dom_Cl_dis_,
524 int is_champ_P1NC)
525{
526 // Deja calcule, on quitte
527 if (flag_face_keps_imposee_ == 1)
528 return;
529
530 if (methode_calcul_face_keps_impose_ == -1)
531 {
532 if (Objet_U::dimension == 2)
533 methode_calcul_face_keps_impose_ = 1;
534 else
535 {
536 assert(Objet_U::dimension == 3);
537 methode_calcul_face_keps_impose_ = 5 ;
538 // GF pour avoir comme dans la 156 decommenter la ligne suivante
539 // methode_calcul_face_keps_impose_=1 ;
540 }
541 }
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;
549 else
550 {
551 Cout <<" Cas non prevu "<<finl;
552 // GF Les cas 0 2 3 sont appeles a disparaitre du code....
554 }
555
556 if (flag_face_keps_imposee_ == 0)
557 {
558 domaine_VEF.creer_tableau_faces(face_keps_imposee_, RESIZE_OPTIONS::NOCOPY_NOINIT);
559 face_keps_imposee_ = -2;
560 }
561 if ((methode_calcul_face_keps_impose_==1) || (methode_calcul_face_keps_impose_==5))
562 remplir_face_keps_imposee_gen(flag_face_keps_imposee_,
563 face_keps_imposee_,
564 methode_calcul_face_keps_impose_,
565 domaine_VEF,
566 le_dom_Cl_dis_,
567 is_champ_P1NC);
568 else
569 {
570 // methode_calcul_face_keps_impose_=4
571 flag_face_keps_imposee_ = 1;
572 const IntTab& face_voisins = domaine_VEF.face_voisins();
573 // on parcourt les bords dirichlet, on cherche les voisins...
574 for (int n_bord=0; n_bord<domaine_VEF.nb_front_Cl(); n_bord++)
575 {
576 const Cond_lim& la_cl = le_dom_Cl_dis_.les_conditions_limites(n_bord);
577 if (sub_type(Dirichlet_paroi_fixe,la_cl.valeur()) ||
578 (sub_type(Dirichlet_paroi_defilante,la_cl.valeur()) ) ||
579 (la_cl->que_suis_je() == "Frontiere_ouverte_vitesse_imposee_ALE"))
580 {
581 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
582 const IntTab& elem_faces = domaine_VEF.elem_faces();
583 int ndeb = 0;
584 int nfin = le_bord.nb_faces_tot();
585 // On traite toutes les faces de bord
586 for (int ind_face=ndeb; ind_face<nfin; ind_face++)
587 {
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();
591 int nfac = domaine.nb_faces_elem();
592 int nf2;
593 ArrOfInt num(nfac);
594 for (nf2=0; nf2<nfac; nf2++)
595 {
596 num[nf2] = elem_faces(elem,nf2);
597 }
598 for (nf2=0; nf2<nfac-1; nf2++)
599 {
600 num[nf2] = elem_faces(elem,nf2);
601 if (num[nf2] == num_face)
602 {
603 num[nf2] = num[nfac-1];
604 num[nfac-1] = num_face;
605 }
606 }
607
608 for (int nf=0; nf<nfac; nf++)
609 {
610 int num0=num[nf];//
611 num0=elem_faces(elem,nf);
612
613 if (num0==num_face)
614 face_keps_imposee_[num0]=-1;
615 else
616 {
617 // Ce sont les faces directement connectes a num_face
618 // int face_asso=face_keps_imposee_[num2];
619 // if (face_asso<0)
620 face_keps_imposee_[num0]=num_face;
621 // on cherche les faces accroches
622 int elem_voisin;
623 if (face_voisins(num0,0)!=elem)
624 elem_voisin=face_voisins(num0,0);
625 else
626 elem_voisin=face_voisins(num0,1);
627
628 if (elem_voisin!=-1)
629 {
630 if ((methode_calcul_face_keps_impose_==0)||(methode_calcul_face_keps_impose_==3))
631 {
632 if (Objet_U::dimension==2)
633 {
634 const IntVect& rang_elem_non_std = domaine_VEF.rang_elem_non_std();
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)
640
641 {
642 double dist1=distance_face(num_face,num1,domaine_VEF);
643 double dist2=distance_face(num_face,num2,domaine_VEF);
644
645 // Prend seulement le sommet le plus pres de la paroi :
646 int numb;
647 if (dist1<dist2)
648 {
649 numb=num1;
650 // dist=dist1;
651 }
652 else
653 {
654 numb=num2;
655 //dist=dist2;
656 }
657 // On regarde si la face num0 appartient a un element
658 // qui est en contact avec un bord
659 int elem0 = face_voisins(numb,0);
660 int elem1 = face_voisins(numb,1);
661 int test_rang;
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);
666 else
667 test_rang = 1;
668
669 if (test_rang<0)
670 face_keps_imposee_[numb]=num_face;
671 }
672 }
673 else if (Objet_U::dimension==3)
674 {
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);
681 // if (rang_elem_non_std(elem_voisin)==-1)
682 int ndebint = domaine_VEF.premiere_face_int();
683 if ((methode_calcul_face_keps_impose_==3)||(num1>=ndebint && num2>=ndebint && num3>=ndebint))
684 {
685 // elem_voisin n'est pas un element de bord
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);
689 // Prend seulement les deux sommets les plus pres de la paroi :
690 if (dist2<dist1)
691 {
692 int n=num1;
693 double d=dist1;
694 num1=num2;
695 dist1=dist2;
696 num2=n;
697 dist2=d;
698 }
699 if (dist3<dist2)
700 {
701 int n=num2;
702 double d=dist2;
703 num2=num3;
704 dist2=dist3;
705 num3=n;
706 dist3=d;
707 }
708 if (dist1 > 0)
709 {
710 face_keps_imposee_[num1] = num_face;
711 }
712 if (dist2 > 0)
713 {
714 face_keps_imposee_[num2] = num_face;
715 }
716 }
717 }
718 }
719 else if (methode_calcul_face_keps_impose_ == 2)
720 for (int dir = 0; dir < nfac; dir++)
721 {
722 assert(methode_calcul_face_keps_impose_ == 2);
723 const int num3 = elem_faces(elem_voisin, dir);
724 if ((num3 > 0) && (num3 != num0))
725 {
726 int face_asso = face_keps_imposee_[num3];
727 if (face_asso < 0)
728 face_keps_imposee_[num3] = num_face;
729
730 else
731 {
732 // face deja associe
733 // quelle est la plus pres de face_asso et num_face ... non fait pour l'instant
734 face_keps_imposee_[num3] = num_face;
735 }
736 }
737
738 }
739 else
740 {
741 // on ne rajoute pas de faces
742 assert(methode_calcul_face_keps_impose_ == 4);
743 }
744
745 }
746 }
747 }
748 }
749 }
750 }
751
752 // on reparcourt les bords pour remettre les bon flags
753 for (int n_bord = 0; n_bord < domaine_VEF.nb_front_Cl(); n_bord++)
754 {
755 const Cond_lim& la_cl = le_dom_Cl_dis_.les_conditions_limites(n_bord);
756 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
757 const int ndeb = 0;
758 const int nfin = le_bord.nb_faces_tot();
759 if (sub_type(Dirichlet_paroi_fixe, la_cl.valeur())
760 || (sub_type(Dirichlet_paroi_defilante, la_cl.valeur()))
761 || (la_cl->que_suis_je() == "Frontiere_ouverte_vitesse_imposee_ALE"))
762 {
763 for (int ind_face = ndeb; ind_face < nfin; ind_face++)
764 {
765 const int num_face = le_bord.num_face(ind_face);
766 face_keps_imposee_[num_face] = -1;
767 }
768 }
769 else if (sub_type(Periodique, la_cl.valeur())
770 || sub_type(Neumann_sortie_libre, la_cl.valeur())
771 || sub_type(Symetrie, la_cl.valeur()))
772 {
773 //exit();
774 }
775 else
776 {
777 for (int ind_face = ndeb; ind_face < nfin; ind_face++)
778 {
779 const int num_face = le_bord.num_face(ind_face);
780 face_keps_imposee_[num_face] = -2;
781 }
782 }
783 }
784 }
785
786 Debog::verifier_indices_items("Paroi_std_hyd_VEF::remplir_face_keps_imposee face_keps_imposee",
787 domaine_VEF.face_sommets().get_md_vector(),
788 face_keps_imposee_);
789 // Il ne trouve pas les memes faces en sequentiel et parallele d'ou
790 // des legers ecarts en sequentiel et parallele
791}
792
793int Paroi_std_hyd_VEF::calculer_hyd_BiK(DoubleTab& tab_k,DoubleTab& tab_eps)
794{
795 const Domaine_VEF& domaine_VEF = ref_cast(Domaine_VEF, le_dom_dis_.valeur());
796 const IntTab& face_voisins = domaine_VEF.face_voisins();
797 const Equation_base& eqn_hydr = mon_modele_turb_hyd->equation();
798 const Fluide_base& le_fluide = ref_cast(Fluide_base, eqn_hydr.milieu());
799 const Champ_Don_base& ch_visco_cin = le_fluide.viscosite_cinematique();
800 const DoubleTab& vitesse = eqn_hydr.inconnue().valeurs();
801 const DoubleTab& tab_visco = ch_visco_cin.valeurs();
802 const Domaine& domaine = domaine_VEF.domaine();
803 int nfac = domaine.nb_faces_elem();
804
805 double visco=-1;
806 int l_unif;
807 if (sub_type(Champ_Uniforme,ch_visco_cin))
808 {
809 visco = std::max(tab_visco(0,0),DMINFLOAT);
810 l_unif = 1;
811 }
812 else
813 l_unif = 0;
814 if ((!l_unif) && (tab_visco.local_min_vect()<DMINFLOAT))
815 // on ne doit pas changer tab_visco ici !
816 {
817 Cerr << "In Paroi_std_hyd_VEF::calculer_hyd_BiK : visco = " << tab_visco.local_min_vect() << " <= 0 ? " << finl;
818 throw;
819 }
820 // tab_visco+=DMINFLOAT;
821
822 double norm_v=-1;
823 double dist=-1,d_visco=-1;
824 double u_plus_d_plus,u_plus,d_plus,u_star;
825 ArrOfDouble val(dimension);
827
828 int is_champ_Q1NC=sub_type(Champ_Q1NC,eqn_hydr.inconnue());
829 remplir_face_keps_imposee( flag_face_keps_imposee_, methode_calcul_face_keps_impose_, face_keps_imposee_, domaine_VEF, le_dom_Cl_dis_, !is_champ_Q1NC);
830
831 IntVect num(nfac);
832 ArrOfDouble stock_erugu(domaine_VEF.nb_faces_tot());
833 ArrOfInt is_defilante_face(domaine_VEF.nb_faces_tot());
834
835 // Loop on boundaries
836 int nb_bords=domaine_VEF.nb_front_Cl();
837 for (int n_bord=0; n_bord<nb_bords; n_bord++)
838 {
839 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
840
841 // Only Dirichlet conditions:
842 //if (sub_type(Dirichlet,la_cl.valeur()) ||
843 // (sub_type(Dirichlet,la_cl.valeur())) ||
844 if (sub_type(Dirichlet_paroi_fixe,la_cl.valeur()) ||
845 (sub_type(Dirichlet_paroi_defilante,la_cl.valeur())) ||
846 (la_cl->que_suis_je() == "Frontiere_ouverte_vitesse_imposee_ALE") )
847 {
848 int is_defilante=sub_type(Dirichlet_paroi_defilante,la_cl.valeur()) ;
849
850 if(la_cl->que_suis_je() == "Frontiere_ouverte_vitesse_imposee_ALE")
851 {
852 is_defilante = (la_cl->que_suis_je() == "Frontiere_ouverte_vitesse_imposee_ALE");
853 }
854
855 // Recuperation de la valeur Erugu
856 double erugu=Erugu;
857 if (sub_type(Paroi_rugueuse,la_cl.valeur()))
858 erugu=ref_cast(Paroi_rugueuse,la_cl.valeur()).get_erugu();
859
860 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
861 const IntTab& elem_faces = domaine_VEF.elem_faces();
862
863 // Loop on real faces
864 int ndeb = 0;
865 int nfin = le_bord.nb_faces_tot();
866 for (int ind_face=ndeb; ind_face<nfin; ind_face++)
867 {
868 int num_face=le_bord.num_face(ind_face);
869 int elem=face_voisins(num_face,0);
870
871 is_defilante_face[num_face]=is_defilante;
872 stock_erugu[num_face]=erugu;
873
874 // on determine les faces de l'element qui sont autres que le num_face traite
875 for (int nf2=0; nf2<nfac; nf2++)
876 num[nf2] = elem_faces(elem,nf2);
877
878 // Maintenant on place le num_face en fin de tableau
879 for (int nf2=0; nf2<nfac-1; nf2++)
880 {
881 num[nf2] = elem_faces(elem,nf2);
882 if (num[nf2] == num_face)
883 {
884 num[nf2] = num[nfac-1];
885 num[nfac-1] = num_face;
886 }
887 }
888
889 int nfc=0;
890 // Boucle sur les faces :
891 for (int nf=0; nf<nfac; nf++)
892 {
893 if (num[nf]==num_face)
894 {
895 // Strategie pour les tetras :
896 // On impose k et eps a la paroi :
897 // approximation: d(k)/d(n) = 0 a la paroi
898 // c'est faux mais ca marche
899 tab_k(num[nf]) =0.;
900 tab_eps(num[nf])=0.;
901 int nk=0;
902
903 for (int k=0; k<nfac; k++)
904 //if ( (num[k] >= ndebint) && (k != nf))
905 if ( (face_keps_imposee_[num[k]]>-1) && (k != nf))
906 {
907
908 tab_k(num[nf]) += tab_k(num[k]);
909 tab_eps(num[nf])+= tab_eps(num[k]);
910 nk++;
911 }
912 if (nk != 0 )
913 {
914 tab_k(num[nf]) /=nk;
915 tab_eps(num[nf])/=nk;
916 }
917 }
918
919 // On verifie si num[nf] n'est pas une face de bord :
920 else if ( (face_keps_imposee_[num[nf]]>-1))//if (num[nf]>=ndebint)
921 {
922 nfc++;
923 norm_v=norm_vit_lp_k(vitesse,num[nf],num_face,domaine_VEF,val,is_defilante);
924 if (!is_champ_Q1NC)
925 dist=distance_face(num_face,num[nf],domaine_VEF);
926 else
927 dist=distance_face_elem(num_face,elem,domaine_VEF);
928
929 if (l_unif)
930 d_visco = visco;
931 else
932 d_visco = tab_visco(elem,0);
933
934 u_plus_d_plus = norm_v*dist/d_visco;
935 u_plus = calculer_u_plus(nf,u_plus_d_plus,erugu);
936
938 {
939 if(u_plus)
940 {
941 u_star = norm_v/u_plus ;
942 d_plus = u_plus_d_plus/u_plus ;
943 }
944 else
945 {
946 u_star = 0.;
947 d_plus = 0.;
948 }
949 }
950 else
951 {
952 u_star = u_star_impose_ ;
953 d_plus = 0.;
954 }
955 calculer_k_eps(tab_k(num[nf]),tab_eps(num[nf]),d_plus,u_star,d_visco,dist,Cmu_,Kappa_);
956
957 // Calcul de la contrainte tangentielle
958 for (int dir=0; dir<dimension; dir++)
959 Cisaillement_paroi_(num_face,dir) += u_star*u_star*val[dir];
960 // Fin de la strategie du calcul generalise de la loi de paroi
961 }
962 }
963
964 // A voir si juste :
965 if (nfc != 0 )
966 for (int dir=0; dir<dimension; dir++)
967 Cisaillement_paroi_(num_face,dir)/=nfc;
968
969 double u_starbis=0;
970 for (int dir=0; dir<dimension; dir++)
971 u_starbis+=Cisaillement_paroi_(num_face,dir)*Cisaillement_paroi_(num_face,dir);
972
973 u_starbis=sqrt(sqrt(u_starbis));
974 tab_u_star_(num_face)=u_starbis;
975 tab_d_plus_(num_face)=u_starbis*dist/d_visco;
976 if (u_starbis != 0) uplus_(num_face)=norm_v/u_starbis;
977
978 } // End loop on real faces
979
980 } // End hlet conditions
981
982 // Robin condition:
983 else if (sub_type(Paroi_decalee_Robin,la_cl.valeur()))
984 {
985 // Recuperation de la valeur Erugu
986 const double erugu = Erugu;
987
988 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
989 const Paroi_decalee_Robin& Paroi = ref_cast(Paroi_decalee_Robin,la_cl.valeur());
990 const DoubleTab& normales = domaine_VEF.face_normales();
991 const double delta = Paroi.get_delta();
992
993 // Loop on real faces
994 const int ndeb = 0;
995 const int nfin = le_bord.nb_faces_tot();
996 for (int ind_face=ndeb; ind_face<nfin; ind_face++)
997 {
998 const int num_face=le_bord.num_face(ind_face);
999 const int elem=face_voisins(num_face,0);
1000
1001 double psc=0, norm=0;
1002 norm_v=0;
1003
1004 for(int comp=0; comp<dimension; comp++)
1005 {
1006 psc += vitesse(num_face,comp)*normales(num_face,comp);
1007 norm += normales(num_face,comp)*normales(num_face,comp);
1008 }
1009 // psc /= norm; // Fixed bug: Arithmetic exception
1010 if (std::fabs(norm)>=DMINFLOAT) psc/=norm;
1011
1012 for(int comp=0; comp<dimension; comp++)
1013 {
1014 val[comp]=vitesse(num_face,comp)-psc*normales(num_face,comp);
1015 norm_v += val[comp]*val[comp];
1016 }
1017
1018 norm_v = sqrt(norm_v);
1019 val /= norm_v;
1020 dist = delta;
1021
1022 // Common to Dirichlet
1023
1024 if (l_unif)
1025 d_visco = visco;
1026 else
1027 d_visco = tab_visco(elem,0);
1028
1029 u_plus_d_plus = norm_v*dist/d_visco;
1030
1031 u_plus = calculer_u_plus(ind_face,u_plus_d_plus,erugu);
1032
1033 if (!is_u_star_impose_)
1034 {
1035 if(u_plus)
1036 {
1037 u_star = norm_v/u_plus ;
1038 d_plus = u_plus_d_plus/u_plus ;
1039 }
1040 else
1041 {
1042 u_star = 0.;
1043 d_plus = 0.;
1044 }
1045 }
1046 else
1047 {
1048 u_star = u_star_impose_;
1049 d_plus = 0.;
1050 }
1051
1052 calculer_k_eps(tab_k(num_face),tab_eps(num_face),d_plus,u_star,d_visco,dist,Cmu_,Kappa_);
1053
1054 // Calcul de la contrainte tangentielle
1055 for (int j=0; j<dimension; j++)
1056 Cisaillement_paroi_(num_face,j) = u_star*u_star*val[j];
1057
1058 double u_starbis=0;
1059 for (int dir=0; dir<dimension; dir++)
1060 u_starbis+=Cisaillement_paroi_(num_face,dir)*Cisaillement_paroi_(num_face,dir);
1061 u_starbis=sqrt(sqrt(u_starbis));
1062
1063 tab_u_star_(num_face)=u_starbis;
1064 tab_d_plus_(num_face)=u_starbis*dist/d_visco;
1065 if (u_starbis != 0) uplus_(num_face)=norm_v/u_starbis;
1066
1067 // End common to Dirichlet
1068
1069 } // End loop on real faces
1070
1071 } // End Robin condition
1072
1073 } // End loop on boundaries
1074
1075
1076#ifdef CONTROL
1077 if ((flag_face_keps_imposee_)&&(!is_champ_Q1NC))
1078 {
1079 if (0)
1080 {
1081 int nb_faces_tot=domaine_VEF.nb_faces_tot();
1082 DoubleVect toto(nb_faces_tot);
1083 const ArrOfInt& renum=Debog::renum_faces();
1084 for (int i=0; i<nb_faces_tot; i++)
1085 if ((face_keps_imposee_(i)>-1)&&(Debog::mode_db==1))
1086 {
1087 if (i>1000) Cerr<<me()<<" face_virt "<<i<<finl;
1088 toto(i)=renum(face_keps_imposee_(i));
1089 }
1090 else toto(i)=face_keps_imposee_(i);
1091 barrier();
1092 Debog::verifier("face_keps ",toto);
1093 }
1094 int tutu=0;
1095 ArrOfInt test;
1096 remplir_face_keps_imposee_gen( tutu, test, domaine_VEF,le_dom_Cl_dis_,!is_champ_Q1NC);
1097 test-=face_keps_imposee_;
1098 if (max(test)>0|| min(test)<0)
1099 {
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++)
1104 {
1105 test(i)+=face_keps_imposee_(i);
1106 if (test(i)!=face_keps_imposee_(i))
1107 {
1108
1109 Cerr<<me()<<" face "<<i<<" : " <<face_keps_imposee_(i)<<" "<<test(i)<<" pos "<<xv(i,0)<<" "<<xv(i,1);
1110 if (dimension==3) Cerr<<" "<<xv(i,2);
1111
1112 if (face_keps_imposee_(i)!=-2)
1113 {
1114 Cerr<<" pos trouve "<<xv(face_keps_imposee_(i),0)<<" "<<xv(face_keps_imposee_(i),1);
1115 if (dimension==3) Cerr<<" "<<xv(face_keps_imposee_(i),2);
1116 }
1117 if (test(i)!=-2)
1118 {
1119 Cerr<<" pos test "<<xv(test(i),0)<<" "<<xv(test(i),1);
1120 if (dimension==3) Cerr<<" "<<xv(test(i),2);
1121 }
1122 Cerr<<finl;
1123 }
1124 if (test(i)>-1) compteur++;
1125 if (face_keps_imposee_(i)>-1) compteur2++;
1126 }
1127 Cerr<<"compteurs "<<compteur2<<" "<<compteur<<finl;
1128 Process::exit();
1129 }
1130 }
1131#endif
1132
1133 // on recalcule partout ou c'est impose
1134 int nb_faces_tot=domaine_VEF.nb_faces_tot();
1135 for (int face=0; face<nb_faces_tot; face++)
1136 {
1137 int num_face=face_keps_imposee_[face];
1138 if (num_face>-1)
1139 {
1140 // int elem_voisin;
1141 int elem=face_voisins(num_face,0);
1142 //if (face_voisins(face,0)!=elem) elem_voisin=face_voisins(face,0);
1143 //else elem_voisin=face_voisins(face,1);
1144 //int elem_voisin=face_voisins(num_face,0);
1145 // ce n'est pas le bon voisin!!!!
1146 double distb;
1147 if (!is_champ_Q1NC)
1148 {
1149 distb=distance_face(num_face,face,domaine_VEF);
1150 }
1151 else
1152 {
1153 assert(sub_type(Champ_Q1NC,eqn_hydr.inconnue())) ;
1154 distb=distance_face_elem(num_face,elem,domaine_VEF);
1155 }
1156
1157 norm_v=norm_vit_lp_k(vitesse,face,num_face,domaine_VEF,val,is_defilante_face[num_face]);
1158 if (l_unif)
1159 d_visco = visco;
1160 else
1161 d_visco = tab_visco(elem,0);
1162
1163 u_plus_d_plus = norm_v*distb/d_visco;
1164 u_plus = calculer_u_plus(face,u_plus_d_plus,stock_erugu[num_face]);
1165
1166 if(u_plus)
1167 {
1168 u_star = norm_v/u_plus ;
1169 d_plus = u_plus_d_plus/u_plus ;
1170 }
1171 else
1172 {
1173 u_star = 0. ;
1174 d_plus = 0. ;
1175 }
1176
1177 calculer_k_eps(tab_k(face),tab_eps(face),d_plus,u_star,d_visco,distb,Cmu_,Kappa_);
1178 }
1179 }
1180
1181 Cisaillement_paroi_.echange_espace_virtuel();
1182 tab_k.echange_espace_virtuel();
1183 tab_eps.echange_espace_virtuel();
1184 Debog::verifier("Paroi_std_hyd_VEF::calculer_hyd tab_k",tab_k);
1185 Debog::verifier("Paroi_std_hyd_VEF::calculer_hyd tab_eps",tab_eps);
1186 Debog::verifier("Paroi_std_hyd_VEF::calculer_hyd Cisaillement_paroi_",Cisaillement_paroi_);
1187 return 1;
1188} // fin de calcul_hyd_BiK (K-eps bicephale)
1189
1190int Paroi_std_hyd_VEF::calculer_hyd(DoubleTab& tab_2eq)
1191{
1192 const Domaine_VEF& domaine_VEF = ref_cast(Domaine_VEF, le_dom_dis_.valeur());
1193 const Equation_base& eqn_hydr = mon_modele_turb_hyd->equation();
1194 const Fluide_base& le_fluide = ref_cast(Fluide_base, eqn_hydr.milieu());
1195 const Champ_Don_base& ch_visco_cin = le_fluide.viscosite_cinematique();
1196 const DoubleTab& tab_vitesse = eqn_hydr.inconnue().valeurs();
1197 const DoubleTab& tab_visco = ch_visco_cin.valeurs();
1198 const Domaine& domaine = domaine_VEF.domaine();
1199
1200 double visco0 {-1};
1201 int l_unif {0};
1202 if (sub_type(Champ_Uniforme, ch_visco_cin))
1203 {
1204 visco0 = std::max(tab_visco(0, 0), DMINFLOAT);
1205 l_unif = 1;
1206 }
1207
1208 if ((!l_unif) && (tab_visco.local_min_vect() < DMINFLOAT))
1209 // on ne doit pas changer tab_visco ici !
1210 {
1211 Cerr << "In Paroi_std_hyd_VEF::calculer_hyd : visco = " << tab_visco.local_min_vect() << " <= 0 ? " << finl;
1212 throw;
1213 }
1214
1216
1217 int is_champ_Q1NC = sub_type(Champ_Q1NC, eqn_hydr.inconnue());
1219 face_keps_imposee_, domaine_VEF,
1220 le_dom_Cl_dis_, !is_champ_Q1NC);
1221
1222 const int nfac = domaine.nb_faces_elem();
1223 const int nb_faces_tot = domaine_VEF.nb_faces_tot();
1224 const int dim = Objet_U::dimension;
1225 const int turbulence_model_type = turbulence_model_type_;
1226 DoubleTrav tab_erugu(nb_faces_tot); // PL trop grand ?
1227 IntTrav tab_is_defilante_face(nb_faces_tot); // PL trop grand ?
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_;
1234
1235 // Loop on boundaries
1236 const int nb_bords = domaine_VEF.nb_front_Cl();
1237 for (int n_bord = 0; n_bord < nb_bords; n_bord++)
1238 {
1239 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
1240
1241 bool dirichlet = sub_type(Dirichlet_paroi_fixe,la_cl.valeur())
1242 || sub_type(Dirichlet_paroi_defilante,la_cl.valeur())
1243 || la_cl->que_suis_je() == "Frontiere_ouverte_vitesse_imposee_ALE";
1244 bool robin = sub_type(Paroi_decalee_Robin,la_cl.valeur());
1245 // Only Dirichlet conditions:
1246 if (dirichlet || robin)
1247 {
1248 int is_defilante = sub_type(Dirichlet_paroi_defilante, la_cl.valeur()) || (la_cl->que_suis_je() == "Frontiere_ouverte_vitesse_imposee_ALE");
1249
1250 // Recuperation de la valeur Erugu
1251 double erugu;
1252 if (robin)
1253 erugu = Erugu;
1254 else
1255 {
1256 erugu = sub_type(Paroi_rugueuse, la_cl.valeur())
1257 ? ref_cast(Paroi_rugueuse, la_cl.valeur()).get_erugu()
1258 : Erugu;
1259 }
1260 const double delta = robin ? ref_cast(Paroi_decalee_Robin, la_cl.valeur()).get_delta() : -1;
1261 const int is_u_star_impose = is_u_star_impose_;
1262 const double u_star_impose = u_star_impose_;
1263 const Front_VF& le_bord = ref_cast(Front_VF, la_cl->frontiere_dis());
1264 CIntTabView elem_faces = domaine_VEF.elem_faces().view_ro();
1265 CIntArrView face_keps_imposee = face_keps_imposee_.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();
1273 DoubleTabView Cisaillement_paroi = Cisaillement_paroi_.view_rw();
1274 DoubleArrView seuil_LP = seuil_LP_.view_wo();
1275 IntArrView iterations_LP = iterations_LP_.view_wo();
1276 DoubleArrView tab_u_star = tab_u_star_.view_wo();
1277 DoubleArrView tab_d_plus = tab_d_plus_.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();
1282 int size = le_bord.nb_faces_tot();
1283 // Loop on boundary faces (real+virtual):
1284 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), size, KOKKOS_LAMBDA(const int ind_face)
1285 {
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;
1290 double val[3] = {}; // PL ToDo set DMAXFLOAT car possible error in algorithm !
1291 double norm_v = 0, dist = -1; // PL etrange calcul de norm_v et dist plus loin
1292
1293 if (dirichlet)
1294 {
1295 is_defilante_face[num_face] = is_defilante;
1296 stock_erugu[num_face] = erugu;
1297 int nfc = 0;
1298 // Boucle sur les autres faces de l'element que la paroi pour lesquelles k_eps est impose:
1299 for (int nf = 0; nf < nfac; nf++)
1300 {
1301 // On verifie si num[nf] n'est pas une face de bord :
1302 int face = elem_faces(elem, nf);
1303 if (face != num_face && face_keps_imposee[face] > -1)//if (face>=ndebint)
1304 {
1305 nfc++;
1306 norm_v = norm_vit_lp_k(dim, vitesse, face, num_face, face_normale, val, is_defilante);
1307
1308 if (!is_champ_Q1NC)
1309 dist = distance_face(dim, num_face, face, xv, face_normale);
1310 else
1311 dist = distance(dim, num_face, elem, xp, xv, face_normale);
1312
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,
1315 iterations_LP);
1316 if (is_u_star_impose)
1317 {
1318 u_star = u_star_impose;
1319 d_plus = 0.;
1320 }
1321 else
1322 {
1323 u_star = u_plus == 0 ? 0 : norm_v / u_plus;
1324 d_plus = u_plus == 0 ? 0 : u_plus_d_plus / u_plus;
1325 }
1326
1327 // Calcul de la contrainte tangentielle
1328 for (int dir = 0; dir < dim; dir++)
1329 Cisaillement_paroi(num_face, dir) += u_star * u_star * val[dir];
1330
1331 // Evaluate the turbulent quantities
1332 double k, eps;
1333 compute_turbulent_quantities(turbulence_model_type, k, eps,
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);
1338 }
1339 }
1340 // A voir si juste : // cAlan !! WTF ce commentaire
1341 if (nfc != 0)
1342 for (int dir = 0; dir < dim; dir++)
1343 Cisaillement_paroi(num_face, dir) /= nfc;
1344 }
1345 if (robin)
1346 {
1347 double psc = 0;
1348 double norm = 0;
1349 for (int comp = 0; comp < dim; comp++)
1350 {
1351 psc += vitesse(num_face, comp) * face_normale(num_face, comp);
1352 norm += face_normale(num_face, comp) * face_normale(num_face, comp);
1353 }
1354 // psc /= norm; // Fixed bug: Arithmetic exception
1355 if (std::fabs(norm) >= DMINFLOAT)
1356 psc /= norm;
1357
1358 for (int comp = 0; comp < dim; comp++)
1359 {
1360 val[comp] = vitesse(num_face, comp) - psc * face_normale(num_face, comp);
1361 norm_v += val[comp] * val[comp];
1362 }
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;
1367
1368 dist = delta;
1369 // Common to Dirichlet
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,
1372 iterations_LP);
1373
1374 if (is_u_star_impose)
1375 {
1376 u_star = u_star_impose;
1377 d_plus = 0.;
1378 }
1379 else
1380 {
1381 u_star = u_plus == 0 ? 0 : norm_v / u_plus;
1382 d_plus = u_plus == 0 ? 0 : u_plus_d_plus / u_plus;
1383 }
1384 // Calcul de la contrainte tangentielle
1385 for (int dir = 0; dir < dim; dir++)
1386 Cisaillement_paroi(num_face, dir) = u_star * u_star * val[dir];
1387 }
1388
1389 double u_starbis = 0;
1390 for (int dir = 0; dir < dim; dir++)
1391 u_starbis += Cisaillement_paroi(num_face, dir) * Cisaillement_paroi(num_face, dir);
1392 u_starbis = sqrt(sqrt(u_starbis));
1393
1394 tab_u_star(num_face) = u_starbis;
1395 tab_d_plus(num_face) = u_starbis * dist / d_visco;
1396 if (u_starbis != 0)
1397 uplus(num_face) = norm_v / u_starbis;
1398
1399 if (robin)
1400 {
1401 // Evaluate the turbulent quantities
1402 compute_turbulent_quantities(turbulence_model_type, keps(num_face, 0), keps(num_face, 1),
1403 d_plus, u_star, d_visco, dist, Cmu, Kappa);
1404 }
1405 }); // End loop on real faces
1406 end_gpu_timer(__KERNEL_NAME__);
1407 } // End conditions
1408
1409 } // End loop on boundaries
1410
1411 // Compute KEps on internal faces given by face_keps_imposee
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)
1414 {
1415 if (compteur(face)>0)
1416 {
1417 keps(face, 0) = sum(face,0) / compteur(face);
1418 keps(face, 1) = sum(face,1) / compteur(face);
1419 }
1420 });
1421 end_gpu_timer(__KERNEL_NAME__);
1422
1423 // Compute KEps for Dirichlet faces
1424 for (int n_bord = 0; n_bord < nb_bords; n_bord++)
1425 {
1426 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
1427
1428 bool dirichlet = sub_type(Dirichlet_paroi_fixe, la_cl.valeur())
1429 || sub_type(Dirichlet_paroi_defilante, la_cl.valeur())
1430 || la_cl->que_suis_je() == "Frontiere_ouverte_vitesse_imposee_ALE";
1431 if (dirichlet)
1432 {
1433 const Front_VF& le_bord = ref_cast(Front_VF, la_cl->frontiere_dis());
1434 int size = le_bord.nb_faces_tot();
1435 CIntTabView elem_faces = domaine_VEF.elem_faces().view_ro();
1436 CIntArrView face_keps_imposee = face_keps_imposee_.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(
1440 const int ind_face)
1441 {
1442 const int num_face = le_bord_num_face(ind_face);
1443 const int elem = face_voisins(num_face, 0);
1444 double ke = 0.;
1445 double eps = 0.;
1446 int nk = 0;
1447 for (int k = 0; k < nfac; k++)
1448 {
1449 int face = elem_faces(elem, k);
1450 if (face != num_face && face_keps_imposee[face] > -1)
1451 {
1452 ke += keps(face, 0);
1453 eps += keps(face, 1);
1454 nk++;
1455 }
1456 }
1457 if (nk != 0)
1458 {
1459 ke /= nk;
1460 eps /= nk;
1461 }
1462 keps(num_face, 0) = ke;
1463 keps(num_face, 1) = eps;
1464 });
1465 end_gpu_timer(__KERNEL_NAME__);
1466 }
1467 }
1468#ifdef CONTROL
1469 if ((flag_face_keps_imposee_)&&(!is_champ_Q1NC))
1470 {
1471 if (0)
1472 {
1473 int nb_faces_tot=domaine_VEF.nb_faces_tot();
1474 DoubleVect toto(nb_faces_tot);
1475 const ArrOfInt& renum=Debog::renum_faces();
1476 for (int i=0; i<nb_faces_tot; i++)
1477 if ((face_keps_imposee_(i)>-1)&&(Debog::mode_db==1))
1478 {
1479 if (i>1000) Cerr<<me()<<" face_virt "<<i<<finl;
1480 toto(i)=renum(face_keps_imposee_(i));
1481 }
1482 else toto(i)=face_keps_imposee_(i);
1483 barrier();
1484 Debog::verifier("face_keps ",toto);
1485 }
1486 int tutu=0;
1487 ArrOfInt test;
1488 remplir_face_keps_imposee_gen( tutu, test, domaine_VEF,le_dom_Cl_dis_,!is_champ_Q1NC);
1489 test-=face_keps_imposee_;
1490 if (std::max(test)>0|| std::min(test)<0)
1491 {
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++)
1496 {
1497 test(i)+=face_keps_imposee_(i);
1498 if (test(i)!=face_keps_imposee_(i))
1499 {
1500
1501 Cerr<<me()<<" face "<<i<<" : " <<face_keps_imposee_(i)<<" "<<test(i)<<" pos "<<xv(i,0)<<" "<<xv(i,1);
1502 if (dimension==3) Cerr<<" "<<xv(i,2);
1503
1504 if (face_keps_imposee_(i)!=-2)
1505 {
1506 Cerr<<" pos trouve "<<xv(face_keps_imposee_(i),0)<<" "<<xv(face_keps_imposee_(i),1);
1507 if (dimension==3) Cerr<<" "<<xv(face_keps_imposee_(i),2);
1508 }
1509 if (test(i)!=-2)
1510 {
1511 Cerr<<" pos test "<<xv(test(i),0)<<" "<<xv(test(i),1);
1512 if (dimension==3) Cerr<<" "<<xv(test(i),2);
1513 }
1514 Cerr<<finl;
1515 }
1516 if (test(i)>-1) compteur++;
1517 if (face_keps_imposee_(i)>-1) compteur2++;
1518 }
1519 Cerr<<"compteurs "<<compteur2<<" "<<compteur<<finl;
1520 Process::exit();
1521 }
1522 }
1523#endif
1524
1525 // Recompute KEps (weird) on internal faces given by face_keps_imposee
1526 CIntArrView face_keps_imposee = face_keps_imposee_.view_ro();
1527 CDoubleTabView face_normale = domaine_VEF.face_normales().view_ro();
1528 DoubleArrView seuil_LP = seuil_LP_.view_wo();
1529 IntArrView iterations_LP = iterations_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)
1538 {
1539 const int num_face = face_keps_imposee[face];
1540 if (num_face > -1)
1541 {
1542 double val[3]= {};
1543 const int elem = face_voisins(num_face, 0);
1544 double dist;
1545 if (!is_champ_Q1NC)
1546 dist = distance_face(dim, num_face, face, xv, face_normale);
1547 else
1548 dist = distance(dim, num_face, elem, xp, xv, face_normale);
1549
1550 double norm_v = norm_vit_lp_k(dim, vitesse, face, num_face, face_normale, val, is_defilante_face[num_face]);
1551
1552 double d_visco = l_unif ? visco0 : visco(elem, 0);
1553
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);
1556
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 ;
1559
1560 // Evaluate the turbulent quantities
1561 compute_turbulent_quantities(turbulence_model_type, keps(face, 0), keps(face, 1),
1562 d_plus, u_star, d_visco, dist, Cmu, Kappa);
1563 }
1564 });
1565 end_gpu_timer(__KERNEL_NAME__);
1566
1567 Cisaillement_paroi_.echange_espace_virtuel();
1568 tab_2eq.echange_espace_virtuel();
1569 Debog::verifier("Paroi_std_hyd_VEF::calculer_hyd tab_2eq", tab_2eq);
1570 Debog::verifier("Paroi_std_hyd_VEF::calculer_hyd Cisaillement_paroi_", Cisaillement_paroi_);
1571 return 1;
1572} // fin de calcul_hyd (K-eps)
1573
1574KOKKOS_FUNCTION
1575void Paroi_std_hyd_VEF::compute_turbulent_quantities(int turbulence_model_type, double& tke, double& var2,
1576 const double d_plus, const double u_star,
1577 const double d_visco, const double dist, const double Cmu, const double Kappa)
1578{
1579 if (turbulence_model_type == 1) // K-Epsilon model
1580 calculer_k_eps(tke, var2, d_plus, u_star, d_visco, dist, Cmu, Kappa);
1581 else if (turbulence_model_type == 2) // K-Omega model
1582 compute_k_omega(tke, var2, d_plus, u_star, d_visco, dist, Cmu, Kappa);
1583 else
1584 Process::Kokkos_exit("The turbulence model is neither k-epsilon nor k-omega. Implementation required?");
1585 return;
1586}
1587
1588KOKKOS_FUNCTION // A reverser dans VEF/Domaine (?)
1589double norm_vit_lp(int dim, const double* v, int fac, CDoubleTabView face_normale, double* val)
1590{
1591 double r[3] {};
1592 double norme = 0;
1593 for(int i = 0; i < dim; i++)
1594 {
1595 r[i] = face_normale(fac, i);
1596 norme += r[i] * r[i];
1597 }
1598 norme = sqrt(norme);
1599 for(int i = 0; i < dim; i++)
1600 r[i] /= norme;
1601
1602 double sum_carre=0;
1603 double psc=0;
1604 for (int i=0; i<dim; i++)
1605 {
1606 sum_carre += carre(v[i]);
1607 psc += v[i] * r[i];
1608 }
1609 double norm_vit = sqrt(std::fabs(sum_carre-carre(psc)));
1610
1611 // val1,val2 val3 sont les vitesses tangentielles
1612 for(int i = 0; i < dim; i++)
1613 val[i] = (v[i] - psc*r[i])/(norm_vit + DMINFLOAT);
1614
1615 return norm_vit;
1616}
1617
1618double norm_vit_lp(const ArrOfDouble& vit, int face, const Domaine_VEF& domaine, ArrOfDouble& val)
1619{
1620 // A reverser dans VEF/Domaine (?)
1621
1622 const DoubleTab& face_normale = domaine.face_normales();
1623 const int dim = Objet_U::dimension;
1624 ArrOfDouble r(dim);
1625
1626 for(int i = 0; i < dim; i++)
1627 r[i] = face_normale(face, i);
1628
1629 r /= norme_array(r);
1630 const double psc = dotproduct_array(r, vit);
1631
1632 double norm_vit {0};
1633 if (dim == 3)
1634 norm_vit = vitesse_tangentielle(vit[0],vit[1],vit[2],r[0],r[1],r[2]);
1635 else
1636 norm_vit = vitesse_tangentielle(vit[0],vit[1],r[0],r[1]);
1637
1638 for(int i = 0; i < dim; i++)
1639 val[i] = (vit[i] - psc*r[i])/(norm_vit + DMINFLOAT);
1640
1641 return norm_vit;
1642}
1643
1644// cAlan: unused function?
1645int Paroi_std_hyd_VEF::calculer_hyd(DoubleTab& tab_nu_t,DoubleTab& tab_k)
1646{
1647 const Domaine_VEF& domaine_VEF = ref_cast(Domaine_VEF, le_dom_dis_.valeur());
1648 const Equation_base& eqn_hydr = mon_modele_turb_hyd->equation();
1649 const Fluide_base& le_fluide = ref_cast(Fluide_base, eqn_hydr.milieu());
1650 const Champ_Don_base& ch_visco_cin = le_fluide.viscosite_cinematique();
1651 const DoubleTab& tab_visco = ch_visco_cin.valeurs();
1652 const Domaine& domaine = domaine_VEF.domaine();
1653 int nfac = domaine.nb_faces_elem();
1654
1655 double visco0=-1;
1656 int l_unif;
1657 if (sub_type(Champ_Uniforme,ch_visco_cin))
1658 {
1659 visco0 = std::max(tab_visco(0,0),DMINFLOAT);
1660 l_unif = 1;
1661 }
1662 else
1663 l_unif = 0;
1664 if ((!l_unif) && (tab_visco.local_min_vect()<DMINFLOAT))
1665 // on ne doit pas changer tab_visco ici !
1666 {
1667 Cerr << "In Paroi_std_hyd_VEF::calculer_hyd : visco = " << tab_visco.local_min_vect() << " <= 0 ? " << finl;
1668 throw;
1669 }
1670 //tab_visco+=DMINFLOAT;
1671
1672
1674
1675 double dist_corr=1.;
1676 double coef_vit=nfac;
1677 if (sub_type(Champ_P1NC,eqn_hydr.inconnue()))
1678 {
1679 dist_corr=double(dimension+1)/double(dimension);
1680 coef_vit=nfac-1;
1681 }
1682
1683 bool LM = sub_type(Modele_turbulence_hyd_Longueur_Melange_base,mon_modele_turb_hyd.valeur()); // Longueur de Melange
1684 bool COMB = sub_type(Modele_turbulence_hyd_combinaison,mon_modele_turb_hyd.valeur()); //Modele Combinaison (fonction analytique et (ou) dependance a des champs sources)
1685 int nombre_sources = COMB ? ref_cast(Modele_turbulence_hyd_combinaison,mon_modele_turb_hyd.valeur()).nombre_sources() : -1;
1686
1687 // Loop on boundaries
1688 int nb_bords=domaine_VEF.nb_front_Cl();
1689 for (int n_bord=0; n_bord<nb_bords; n_bord++)
1690 {
1691 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
1692
1693 bool dirichlet = sub_type(Dirichlet_paroi_fixe,la_cl.valeur()) || sub_type(Dirichlet_paroi_defilante,la_cl.valeur()) || la_cl->que_suis_je() == "Frontiere_ouverte_vitesse_imposee_ALE";
1694 bool robin = sub_type(Paroi_decalee_Robin,la_cl.valeur());
1695 // Only Dirichlet or Robin conditions:
1696 if (dirichlet || robin)
1697 {
1698 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
1699 // Loop on real faces
1700 int ndeb = 0;
1701 int nfin = le_bord.nb_faces_tot();
1702 int dim = Objet_U::dimension;
1703 double Cmu = Cmu_;
1704 double Kappa = Kappa_;
1705 int is_u_star_impose = is_u_star_impose_;
1706 double u_star_impose = u_star_impose_;
1707 const double delta = robin ? ref_cast(Paroi_decalee_Robin,la_cl.valeur()).get_delta() : 0;
1708 double erugu=Erugu;
1709 if (sub_type(Paroi_rugueuse,la_cl.valeur()))
1710 erugu=ref_cast(Paroi_rugueuse,la_cl.valeur()).get_erugu();
1711 // Lecture
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();
1715 CDoubleTabView vitesse = eqn_hydr.inconnue().valeurs().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();
1720 // Ecriture
1721 DoubleArrView seuil_LP = seuil_LP_.view_wo();
1722 IntArrView iterations_LP = iterations_LP_.view_wo();
1723 DoubleArrView uplus = uplus_.view_wo();
1724 DoubleArrView tab_d_plus = tab_d_plus_.view_wo();
1725 DoubleArrView tab_u_star = tab_u_star_.view_wo();
1726 DoubleArrView nu_t = static_cast<ArrOfDouble&>(tab_nu_t).view_wo();
1727 DoubleArrView k = static_cast<ArrOfDouble&>(tab_k).view_wo();
1728 DoubleTabView Cisaillement_paroi = Cisaillement_paroi_.view_wo();
1729 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(ndeb, nfin), KOKKOS_LAMBDA (const int ind_face)
1730 {
1731 double val[3] {};
1732 double vit[3] {};
1733 int num_face = le_bord_num_face(ind_face);
1734 int elem = face_voisins(num_face,0);
1735
1736 double dist=0, norm_v=0;
1737 if (dirichlet)
1738 {
1739 // Dirichlet
1740 for (int j = 0; j < dim; j++)
1741 vit[j] = 0.;
1742 for (int i = 0; i < nfac; i++)
1743 {
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)); // permet de soustraire la vitesse de glissement eventuelle
1748 }
1749 for (int j = 0; j < dim; j++)
1750 vit[j] /= coef_vit;
1751
1752 dist = distance(dim, num_face, elem, xp, xv, face_normales);
1753 dist *= dist_corr; // pour passer du centre de gravite au milieu des faces en P1NC
1754
1755 norm_v = norm_vit_lp(dim, vit, num_face, face_normales, val);
1756 }
1757 else
1758 {
1759 // Robin
1760 double psc=0, norm=0;
1761 for(int comp=0; comp<dim; comp++)
1762 {
1763 psc += vitesse(num_face,comp)*face_normales(num_face,comp);
1764 norm += face_normales(num_face,comp)*face_normales(num_face,comp);
1765 }
1766 // psc /= norm; // Fixed bug: Arithmetic exception
1767 if (std::fabs(norm)>=DMINFLOAT) psc/=norm;
1768
1769 for(int comp=0; comp<dim; comp++)
1770 {
1771 val[comp]=vitesse(num_face,comp)-psc*face_normales(num_face,comp);
1772 norm_v += val[comp]*val[comp];
1773 }
1774 norm_v = sqrt(norm_v);
1775 for (int j = 0; j < dim; j++)
1776 val[j] /= norm_v;
1777 dist = delta;
1778 }
1779
1780 double d_visco = l_unif ? visco0 : visco(elem,0);
1781
1782 double u_plus_d_plus = norm_v*dist/d_visco;
1783
1784 double u_plus = calculer_u_plus_kokkos(ind_face,u_plus_d_plus,erugu,Kappa,seuil_LP,iterations_LP);
1785
1786 double u_star, d_plus;
1787 if (is_u_star_impose)
1788 {
1789 u_star = u_star_impose;
1790 d_plus = 0.;
1791 }
1792 else
1793 {
1794 u_star = u_plus ? norm_v/u_plus : 0.;
1795 d_plus = u_plus ? u_plus_d_plus/u_plus : 0.;
1796 }
1797 double eps;
1798 compute_k_eps(k(elem),eps,d_plus,u_star,d_visco,dist, Cmu, Kappa);
1799
1800 // Calcul de la contrainte tangentielle
1801 for (int j=0; j<dim; j++)
1802 Cisaillement_paroi(num_face,j) = u_star*u_star*val[j];
1803
1804 // Remplissage des tableaux (dans le cas de Longueur de melange on laisse la viscosite telle quelle)
1805 if((!LM) && (!COMB)) nu_t(elem) = Cmu*k(elem)*k(elem)/(eps+DMINFLOAT);
1806
1807 uplus(num_face) = u_plus;
1808 tab_d_plus(num_face) = d_plus;
1809 tab_u_star(num_face) = u_star;
1810
1811 // Modification de nu_t (et par consequent lambda_t) pour exploiter la valeur de nu_t (lambda_t) en y=deq_lam.
1812 // La valeur de dist_corr n est valable que dans le cas particuler ou nu_t est fonction lineaire de y
1813 if (COMB && nombre_sources==0)
1814 nu_t(elem) *= dist_corr;
1815
1816 }); // End loop on real faces
1817 end_gpu_timer(__KERNEL_NAME__);
1818
1819 } // End BC conditions
1820
1821 } // End loop on boundaries
1822
1823 Cisaillement_paroi_.echange_espace_virtuel();
1824 tab_nu_t.echange_espace_virtuel();
1825 tab_k.echange_espace_virtuel();
1826 Debog::verifier("Paroi_std_hyd_VEF::calculer_hyd k",tab_k);
1827 Debog::verifier("Paroi_std_hyd_VEF::calculer_hyd tab_nu_t",tab_nu_t);
1828 Debog::verifier("Paroi_std_hyd_VEF::calculer_hyd Cisaillement_paroi_",Cisaillement_paroi_);
1829 return 1;
1830} // fin du calcul_hyd (nu-t)
1831
1832KOKKOS_FUNCTION
1833void Paroi_std_hyd_VEF::compute_k(double& k, const double yp, const double u_star, double Cmu)
1834{
1835 // Original comment:
1836 // PQ : 05/04/07 : formulation continue de k et epsilon
1837 // assurant le bon comportement asymptotique
1838 k = 0.07*yp*yp*exp(-yp/9.);
1839 k += 1./sqrt(Cmu)*(1. - exp(-yp/20.))*(1. - exp(-yp/20.));
1840 k *= u_star*u_star; // = k+ * u_star^2
1841 ;
1842}
1843
1844KOKKOS_FUNCTION
1845void Paroi_std_hyd_VEF::compute_k_for_komega(double& k, const double yp, const double u_star, double Cmu)
1846{
1847 // EB: We need k=0 at the wall for the BSL/SST model.
1848 // the formulation computed in Paroi_std_hyd_VEF::compute_k lead to wrong results for the blending fonction computation (F1)
1849 if (yp <=5)
1850 k=0.;
1851 else
1852 compute_k(k,yp,u_star,Cmu);
1853}
1854
1855
1856KOKKOS_FUNCTION
1857void Paroi_std_hyd_VEF::compute_epsilon(double& eps, const double yp,
1858 const double u_star, const double d_visco, const double Kappa)
1859{
1860 double const u_star_squared = u_star*u_star;
1861
1862 // 50625 = 15^4
1863 eps = 1./(Kappa*pow(yp*yp*yp*yp + 50625, 0.25)); // eps_plus
1864 eps *= u_star_squared*u_star_squared/d_visco;
1865}
1866
1867KOKKOS_FUNCTION
1868void Paroi_std_hyd_VEF::compute_omega(double& omega, const double yp,
1869 const double u_star, const double d_visco,
1870 const double dist, const double Kappa)
1871{
1872 // cAlan:� mutualiser avec le calcul du k_omega de Multiphase
1873 // EB : modification to apply the exact solution in the viscous sublayer.
1874 const double w_vis = 6.*coeff_omega_wall_*d_visco/(BETA_OMEGA*dist*dist);
1875 if (yp<5)
1876 {
1877 omega=w_vis;
1878 }
1879 else
1880 {
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);
1885
1886 omega = blending*w_1 + (1 - blending)*w_2;
1887 }
1888}
1889
1890KOKKOS_FUNCTION
1891int Paroi_std_hyd_VEF::calculer_k_eps(double& k, double& eps ,
1892 const double yp, const double u_star,
1893 const double d_visco, const double dist, const double Cmu, const double Kappa)
1894{
1895 return compute_k_eps(k, eps, yp, u_star, d_visco, dist, Cmu, Kappa);
1896}
1897
1898KOKKOS_FUNCTION
1899void Paroi_std_hyd_VEF::compute_k_epsilon(double& k, double& epsilon,
1900 double yp, double u_star,
1901 double d_visco, double dist, double Cmu, double Kappa)
1902{
1903 compute_k(k, yp, u_star, Cmu);
1904 compute_epsilon(epsilon, yp, u_star, d_visco, Kappa);
1905 return;
1906}
1907
1908KOKKOS_FUNCTION
1909void Paroi_std_hyd_VEF::compute_k_omega(double& k, double& omega,
1910 double yp, double u_star,
1911 double d_visco, double dist, double Cmu, double Kappa)
1912{
1913 compute_k_for_komega(k, yp, u_star, Cmu);
1914 compute_omega(omega, yp, u_star, d_visco, dist, Kappa);
1915 return;
1916}
1917
1919{
1920 const Domaine_VEF& domaine_VEF = ref_cast(Domaine_VEF, le_dom_dis_.valeur());
1921 int ndeb,nfin;
1922 double upmoy,dpmoy,utaumoy;
1923 double seuil_moy,iter_moy;
1924 double norme_L2=0.;
1925
1926 upmoy=0.;
1927 dpmoy=0.;
1928 utaumoy=0.;
1929 seuil_moy=0.;
1930 iter_moy=0.;
1931
1932 int compt=0;
1933
1934 EcrFicPartage Ustar;
1935 ouvrir_fichier_partage(Ustar,"Ustar");
1936
1937 for (int n_bord=0; n_bord<domaine_VEF.nb_front_Cl(); n_bord++)
1938 {
1939 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
1940 if ( (sub_type(Dirichlet_paroi_fixe,la_cl.valeur())) ||
1941 (sub_type(Dirichlet_paroi_defilante,la_cl.valeur())) ||
1942 (sub_type(Paroi_decalee_Robin,la_cl.valeur()) ) ||
1943 (la_cl->que_suis_je() == "Frontiere_ouverte_vitesse_imposee_ALE"))
1944 {
1945 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
1946 if(je_suis_maitre())
1947 {
1948 Ustar << finl;
1949 Ustar << "Bord " << le_bord.le_nom() << finl;
1950 if (dimension == 2)
1951 {
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;
1960 }
1961 if (dimension == 3)
1962 {
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;
1971 }
1972 }
1973 ndeb = le_bord.num_premiere_face();
1974 nfin = ndeb + le_bord.nb_faces();
1975 for (int num_face=ndeb; num_face<nfin; num_face++)
1976 {
1977 double x=domaine_VEF.xv(num_face,0);
1978 double y=domaine_VEF.xv(num_face,1);
1979 norme_L2= Cisaillement_paroi_(num_face,0)*Cisaillement_paroi_(num_face,0) + Cisaillement_paroi_(num_face,1)*Cisaillement_paroi_(num_face,1);
1980 if (dimension == 2)
1981 Ustar << x << "\t| " << y;
1982 if (dimension == 3)
1983 {
1984 double z=domaine_VEF.xv(num_face,2);
1985 Ustar << x << "\t| " << y << "\t| " << z;
1986 norme_L2+= Cisaillement_paroi_(num_face,2)*Cisaillement_paroi_(num_face,2);
1987 }
1988 norme_L2=sqrt(norme_L2);
1989 Ustar << "\t| " << uplus_(num_face) << "\t| " << tab_d_plus(num_face) << "\t| " << tab_u_star(num_face);
1990 Ustar << "\t| " << norme_L2 << "\t| " << Cisaillement_paroi_(num_face,0) << "\t| " << Cisaillement_paroi_(num_face,1) ;
1991 if (dimension == 3)
1992 Ustar << "\t| " << Cisaillement_paroi_(num_face,2) << finl;
1993 else
1994 Ustar << finl;
1995
1996 // PQ : 03/03 : Calcul des valeurs moyennes (en supposant maillage regulier)
1997
1998 upmoy +=uplus_(num_face);
1999 dpmoy +=tab_d_plus(num_face);
2000 utaumoy +=tab_u_star(num_face);
2001 seuil_moy += seuil_LP_(num_face);
2002 iter_moy += iterations_LP_(num_face);
2003 compt +=1;
2004 }
2005 Ustar.syncfile();
2006 }
2007 }
2008 /* Reduce 6 mp_sum to 1 by using mp_sum_for_each_item:
2009 upmoy = mp_sum(upmoy);
2010 dpmoy = mp_sum(dpmoy);
2011 utaumoy = mp_sum(utaumoy);
2012 seuil_moy = mp_sum(seuil_moy);
2013 iter_moy = mp_sum(iter_moy);
2014 compt = mp_sum(compt);
2015 */
2016
2017 ArrOfDouble array(6);
2018 array[0]=upmoy;
2019 array[1]=dpmoy;
2020 array[2]=utaumoy;
2021 array[3]=seuil_moy;
2022 array[4]=iter_moy;
2023 array[5]=compt;
2024 mp_sum_for_each_item(array);
2025 upmoy=array[0];
2026 dpmoy=array[1];
2027 utaumoy=array[2];
2028 seuil_moy=array[3];
2029 iter_moy=array[4];
2030 compt=(int)array[5];
2031 if (je_suis_maitre())
2032 {
2033 if (compt)
2034 {
2035 Ustar << finl;
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;
2039 }
2040 Ustar << finl << finl;
2041 }
2042 Ustar.syncfile();
2043}
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 Champ_Uniforme Represente un champ constant dans l'espace et dans le temps.
classe Cond_lim Classe generique servant a representer n'importe quelle classe
Definition Cond_lim.h:31
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...
Definition Debog.cpp:58
static void verifier(const char *const msg, double)
Definition Debog.cpp:21
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.
Definition Domaine.h:484
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.
class Domaine_VEF
Definition Domaine_VEF.h:54
IntVect & rang_elem_non_std()
Definition Domaine_VEF.h:86
int nb_faces_tot() const
renvoie le nombre total de faces.
Definition Domaine_VF.h:481
void creer_tableau_faces(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
virtual double face_normales(int face, int comp) const
Definition Domaine_VF.h:47
double xv(int num_face, int k) const
Definition Domaine_VF.h:76
int face_sommets(int i, int j) const
renvoie le numero du ieme sommet de la face num_face.
Definition Domaine_VF.h:583
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
Definition Domaine_VF.h:543
double xp(int num_elem, int k) const
Definition Domaine_VF.h:77
int premiere_face_int() const
une face est interne ssi elle separe deux elements.
Definition Domaine_VF.h:463
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Definition Domaine_VF.h:418
int nb_front_Cl() const
const Domaine & domaine() const
int nb_som_tot() 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,...
Definition Entree.h:42
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
Definition Fluide_base.h:38
const Champ_Don_base & viscosite_cinematique() const
Definition Fluide_base.h:58
class Front_VF
Definition Front_VF.h:36
int nb_faces() const
Definition Front_VF.h:53
int num_premiere_face() const
Definition Front_VF.h:63
int nb_faces_tot() const
Definition Front_VF.h:58
int num_face(const int) const
Definition Front_VF.h:68
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
Definition Objet_U.h:135
static int dimension
Definition Objet_U.h:99
friend class Sortie
Definition Objet_U.h:75
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Objet_U.cpp:319
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
CLASS: Paroi_hyd_base_VEF Classe de base des lois de paroi hydraulique en VEF.
const ArrOfInt & face_keps_imposee() const
void init_lois_paroi_hydraulique_()
void set_param(Param &param) 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 &param) 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)
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)
classe Periodique Cette classe represente une condition aux limites periodique.
Definition Periodique.h:31
static KOKKOS_INLINE_FUNCTION void Kokkos_exit(const char *)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.h:173
static void mp_sum_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
Definition Process.cpp:193
static void barrier()
Synchronise tous les processeurs du groupe courant (attend que tous les processeurs soient arrives a ...
Definition Process.cpp:136
static int me()
renvoie mon rang dans le groupe de communication courant.
Definition Process.cpp:125
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Definition Process.cpp:86
Classe de base des flux de sortie.
Definition Sortie.h:52
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:
Definition Symetrie.h:37
TRUSTList & add(_TYPE_)
insertion en queue
Definition TRUSTList.tpp:85
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.
int size() const
Definition TRUSTList.h:68
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
Definition TRUSTTab.h:261
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_rw()
Definition TRUSTTab.h:291
int line_size() const
Definition TRUSTVect.tpp:67
_TYPE_ local_min_vect(Mp_vect_options opt=VECT_REAL_ITEMS) const
Definition TRUSTVect.h:155
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTVect.tpp:91
virtual const MD_Vector & get_md_vector() const
Definition TRUSTVect.h:123
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_...