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