TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Paroi_std_hyd_VDF.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
17#include <Dirichlet_paroi_defilante.h>
18#include <Dirichlet_paroi_fixe.h>
19#include <Paroi_std_hyd_VDF.h>
20#include <TRUSTTabs_forward.h>
21#include <Paroi_std_hyd_VDF.h>
22#include <Schema_Temps_base.h>
23#include <Modele_turbulence_hyd_base.h>
24#include <Champ_Uniforme.h>
25#include <Domaine_Cl_VDF.h>
26#include <communications.h>
27#include <EcrFicPartage.h>
28#include <Equation_base.h>
29#include <Fluide_base.h>
30#include <TRUSTTrav.h>
31#include <SFichier.h>
32#include <Param.h>
33
34Implemente_instanciable(Paroi_std_hyd_VDF, "loi_standard_hydr_VDF", Paroi_hyd_base_VDF);
35Implemente_instanciable(Loi_expert_hydr_VDF, "Loi_expert_hydr_VDF", Paroi_std_hyd_VDF);
36
38{
39 return s << que_suis_je() << " " << le_nom();
40}
41
43{
44 return s << que_suis_je() << " " << le_nom();
45}
46
48{
50 return s ;
51}
52
54{
55 Param param(que_suis_je());
57
58 param.lire_avec_accolades_depuis(s);
59
60 return s ;
61}
62
64{
67 param.ajouter("coeff_omega_wall",&coeff_omega_wall_);
68}
69
70/////////////////////////////////////////////////////////////////////
71//
72// Implementation des fonctions de la classe Paroi_std_hyd_VDF
73//
74/////////////////////////////////////////////////////////////////////
75
76
78{
79 uplus_.resize(le_dom_dis_->nb_faces_bord());
80 init_lois_paroi_(); // dans Paroi_hyd_base_VDF
83}
84
85// Remplissage de la table
87{
88 Cmu_ = mon_modele_turb_hyd->get_Cmu();
89 init_lois_paroi_hydraulique_(); // dans Paroi_log_QDM
90 return 1;
91}
92
93// On annule les valeurs des grandeurs turbulentes qui
94// correspondent aux mailles de paroi
96{
97 int nb_dim = tab.nb_dim();
98 const int nb_comp = tab.line_size();
99 const IntTab& face_voisins = le_dom_dis_->face_voisins();
100 // const IntVect& orientation = le_dom_dis_->orientation();
101 // Boucle sur les bords
102
103 int ndeb, nfin, elem;
104
105 for (int n_bord = 0; n_bord < le_dom_dis_->nb_front_Cl(); n_bord++)
106 {
107 // pour chaque condition limite on regarde son type
108 // On applique les lois de paroi uniquement
109 // aux voisinages des parois
110
111 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
112
113 if ((sub_type(Dirichlet_paroi_fixe, la_cl.valeur()))
114 || (sub_type(Dirichlet_paroi_defilante, la_cl.valeur())))
115 {
116 const Front_VF& le_bord = ref_cast(Front_VF, la_cl->frontiere_dis());
117 ndeb = le_bord.num_premiere_face();
118 nfin = ndeb + le_bord.nb_faces();
119
120 if (nb_dim > 2) // cAlan : à déplacer ? nb_dim est indépendant de la boucle.
121 {
122 Cerr << "Erreur TRUST dans Paroi_std_hyd_VDF::preparer_calculer_hyd" << finl;
123 Cerr << "Le DoubleTab tab ne peut pas avoir plus de 2 entrees" << finl;
125 }
126 else
127 {
128 for (int num_face = ndeb; num_face < nfin; num_face++)
129 if ((elem = face_voisins(num_face, 0)) != -1)
130 for (int k = 0; k < nb_comp; k++)
131 tab(elem, k) = 0;
132 else
133 {
134 elem = face_voisins(num_face, 1);
135 for (int k = 0; k < nb_comp; k++)
136 tab(elem, k) = 0;
137 }
138 }
139 }
140 }
141 return 1;
142}
143
144int Paroi_std_hyd_VDF::calculer_hyd(DoubleTab& tab_2eq)
145{
146 DoubleTab bidon(0);
147 // bidon ne servira pas
148 if (turbulence_model_type_ == 0)
149 return calculer_hyd(tab_2eq, 1, bidon);
150 else
151 return compute_law_komega(tab_2eq);
152}
153
154int Paroi_std_hyd_VDF::calculer_hyd(DoubleTab& tab_nu_t, DoubleTab& tab_k)
155{
156 return calculer_hyd(tab_nu_t, 0, tab_k);
157}
158
159int Paroi_std_hyd_VDF::calculer_hyd(DoubleTab& tab1, int isKeps, DoubleTab& tab2)
160{
161 // si isKeps = 1 tab1=tab_keps
162 // tab2 bidon
163 // si isKeps = 0 tab1=tab_nu_t
164 // tab2=tab_k
165 // Cerr<<" Paroi_std_hyd_VDF::calculer_hyd"<<finl;
166 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_dis_.valeur());
167 const IntVect& orientation = domaine_VDF.orientation();
168 const IntTab& face_voisins = domaine_VDF.face_voisins();
169 const Equation_base& eqn_hydr = mon_modele_turb_hyd->equation();
170 const Fluide_base& le_fluide = ref_cast(Fluide_base, eqn_hydr.milieu());
171 const Champ_Don_base& ch_visco_cin = le_fluide.viscosite_cinematique();
172 const DoubleVect& vit = eqn_hydr.inconnue().valeurs();
173 const DoubleTab& tab_visco = ch_visco_cin.valeurs();
174 double visco = -1;
175 int l_unif {0};
176 if (sub_type(Champ_Uniforme, ch_visco_cin))
177 {
178 visco = std::max(tab_visco(0, 0), DMINFLOAT);
179 l_unif = 1;
180 }
181
182 // preparer_calcul_hyd(tab);
183 if ((!l_unif) && (tab_visco.local_min_vect()<DMINFLOAT))
184 // on ne doit pas changer tab_visco ici !
185 {
186 Cerr << "In Paroi_std_hyd_VDF::calculer_hyd : visco = " << tab_visco.local_min_vect() << " <= 0 ? " << finl;
187 throw;
188 }
189 int ndeb, nfin, elem, ori;
190 double norm_v, dist, u_plus_d_plus, d_visco;
191 //double val,val1,val2;
192
193 //****************************************************************
194 // Modifs du 19/10 pour etre coherent avec la diffusion turbulente
195 double signe;
196 //****************************************************************
197
198 // Boucle sur les bords
199
200 for (int n_bord = 0; n_bord < domaine_VDF.nb_front_Cl(); n_bord++)
201 {
202
203 // pour chaque condition limite on regarde son type
204 // On applique les lois de paroi uniquement
205 // aux voisinages des parois
206
207 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
208 const Front_VF& le_bord = ref_cast(Front_VF, la_cl->frontiere_dis());
209 ndeb = le_bord.num_premiere_face();
210 nfin = ndeb + le_bord.nb_faces();
211
212 if (sub_type(Dirichlet_paroi_fixe, la_cl.valeur()) || sub_type(Dirichlet_paroi_defilante, la_cl.valeur() ))
213 {
214 int isdiri = 0;
215 DoubleTab vitesse_imposee_face_bord(le_bord.nb_faces(), dimension);
216 if (sub_type(Dirichlet_paroi_defilante, la_cl.valeur()))
217 {
218 isdiri = 1;
219 const Dirichlet_paroi_defilante& cl_diri = ref_cast(Dirichlet_paroi_defilante, la_cl.valeur());
220 for (int face = ndeb; face < nfin; face++)
221 for (int k = 0; k < dimension; k++)
222 vitesse_imposee_face_bord(face-ndeb, k) = cl_diri.val_imp(face-ndeb, k);
223 }
224 ArrOfDouble vit_paroi(dimension);
225 ArrOfDouble val(dimension-1);
226
227 for (int num_face = ndeb; num_face < nfin; num_face++)
228 {
229 if (isdiri)
230 {
231 int rang = num_face-ndeb;
232 for (int k = 0; k < dimension; k++)
233 vit_paroi[k] = vitesse_imposee_face_bord(rang, k);
234 }
235 ori = orientation(num_face);
236 if ((elem = face_voisins(num_face, 0)) != -1)
237 {
238 //norm_v=norm_2D_vit(vit,elem,ori,domaine_VDF,val);
239 norm_v = norm_vit(vit, elem, ori, domaine_VDF, vit_paroi, val);
240 signe = -1.;
241 }
242 else
243 {
244 elem = face_voisins(num_face, 1);
245 //norm_v=norm_2D_vit(vit,elem,ori,domaine_VDF,val);
246 norm_v = norm_vit(vit, elem, ori, domaine_VDF, vit_paroi, val);
247 signe = 1.;
248 }
249
250 if (axi)
251 dist = domaine_VDF.dist_norm_bord_axi(num_face);
252 else
253 dist = domaine_VDF.dist_norm_bord(num_face);
254
255 if (l_unif)
256 d_visco = visco;
257 else
258 d_visco = tab_visco(elem, 0);
259
260 u_plus_d_plus = norm_v*dist/d_visco;
261
262 // Calcul de u* et des grandeurs turbulentes:
263 if (isKeps)
264 {
265 //tab1=tab_k_eps
266
267 // calculer_local(u_plus_d_plus,d_visco,tab_k_eps,norm_v,dist,elem,num_face);
268 calculer_local(u_plus_d_plus, d_visco, tab1, norm_v, dist, elem, num_face);
269 }
270 else
271 {
272 // tab1=tab_nu_t
273 // tab2=tab_k
274 //calculer_local(u_plus_d_plus,d_visco,tab_nu_t,tab_k,norm_v,dist,elem,num_face);
275 calculer_local(u_plus_d_plus, d_visco, tab1, tab2, norm_v, dist, elem, num_face);
276 }
277
278 // Calcul de la contrainte tangentielle
279 double vit_frot = tab_u_star(num_face)*tab_u_star(num_face);
280 if (ori == 0)
281 {
282 Cisaillement_paroi_(num_face, 1) = vit_frot*val[0]*signe;
283 if (dimension == 3)
284 Cisaillement_paroi_(num_face, 2) = vit_frot*val[1]*signe;
285 Cisaillement_paroi_(num_face, 0) = 0.;
286 }
287 else if (ori == 1)
288 {
289 Cisaillement_paroi_(num_face, 0) = vit_frot*val[0]*signe;
290 if (dimension == 3)
291 Cisaillement_paroi_(num_face, 2) = vit_frot*val[1]*signe;
292 Cisaillement_paroi_(num_face, 1) = 0.;
293 }
294 else
295 {
296 Cisaillement_paroi_(num_face, 0) = vit_frot*val[0]*signe;
297 Cisaillement_paroi_(num_face, 1) = vit_frot*val[1]*signe;
298 Cisaillement_paroi_(num_face, 2) = 0.;
299 }
300
301 // Calcul de u+ d+
303 num_face, dist, d_visco, norm_v) ;
304 }
305 }
306 }
307 Cisaillement_paroi_.echange_espace_virtuel();
309 if (!isKeps) tab2.echange_espace_virtuel();
310 //////////////////////////////////////////////////////
311
312
313 /////////////////////////////////////////
314 //YB:24/11/04
315 ////////////////////////
316 //Postraitement angles
317 ////////////////////////
318 /* if (dimension==3)
319 {
320 const double& tps = eqn_hydr.schema_temps().temps_courant();
321 const IntTab& elem_faces = domaine_VDF.elem_faces();
322 SFichier fic_angle("angles.dat",ios::app); // impression des faces parietales et leur coordonnees
323 double angle_u;
324 double angle_cis;
325 double cos_angle_u;
326 double cos_angle_cis;
327 double sin_angle_u;
328 double sin_angle_cis;
329 double vit0, vit1;
330 int elem_ndeb = 0;
331 ndeb = 0;
332 //La face ndeb correspond ici a la premiere face parietale du bas
333 const DoubleTab& xp = domaine_VDF.xp();
334
335 for (int n_bord=0; n_bord<domaine_VDF.nb_front_Cl(); n_bord++)
336 {
337 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
338
339 if (sub_type(Dirichlet_paroi_fixe,la_cl.valeur()) )
340 {
341 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
342
343 ndeb = le_bord.num_premiere_face();
344 ement_paroi_(num_face, 0) = vit_frot*va
345 if ((elem_ndeb = face_voisins(ndeb,0)) == -1)
346 {
347 elem_ndeb = face_voisins(ndeb,1);
348 }
349
350 int ori_ndeb=orientation(ndeb);
351
352 if(xp(elem_ndeb,1)<1.) //Channel height=2
353 {
354 // 1er couple de faces perpendiculaires a la paroi
355 int face1 = elem_faces(elem_ndeb ,(ori_ndeb+1));
356 int face2 = elem_faces(elem_ndeb ,(ori_ndeb+4)%6);
357 vit0 = 0.5*(vit(face1)+vit(face2));
358
359 // 2e couple de faces perpendiculaires a la paroi
360 int face3 = elem_faces(elem_ndeb ,(ori_ndeb+2));
361 int face4 = elem_faces(elem_ndeb ,(ori_ndeb+5)%6);
362 vit1 = 0.5*(vit(face3)+vit(face4));
363
364 cos_angle_u = vit1/(sqrt(vit0*vit0+vit1*vit1));
365
366 sin_angle_u = vit0/(sqrt(vit0*vit0+vit1*vit1));
367
368 cos_angle_cis = Cisaillement_paroi_(ndeb,0)
369 /sqrt(Cisaillement_paroi_(ndeb,0)*Cisaillement_paroi_(ndeb,0)
370 +Cisaillement_paroi_(ndeb,2)*Cisaillement_paroi_(ndeb,2));
371
372 sin_angle_cis = Cisaillement_paroi_(ndeb,2)
373 /sqrt(Cisaillement_paroi_(ndeb,0)*Cisaillement_paroi_(ndeb,0)
374 +Cisaillement_paroi_(ndeb,2)*Cisaillement_paroi_(ndeb,2));
375
376 if(sin_angle_u > 0)
377 angle_u = -acos(cos_angle_u);
378 else
379 angle_u = acos(cos_angle_u);
380
381 if(sin_angle_cis > 0)
382 angle_cis = -acos(cos_angle_cis);
383 else
384 angle_cis = acos(cos_angle_cis);
385
386 fic_angle << tps << " " << angle_u << " " << angle_cis << finl;
387 }
388 }
389 }
390 }
391
392 ////////////////////////////////////////////////////////////////////////
393 */
394 return 1;
395}
396
397// For K_Omega model
399{
400 uplus_.resize(le_dom_dis_->nb_faces_bord());
402 Cmu_ = mon_modele_turb_hyd->get_Cmu();
406 return 1;
407}
408
410{
411 // Yplus computation as in OpenFOAM
412 double yplus = 11;
413
414 for (int iter = 0; iter < 10; ++iter)
415 yplus = log(std::max(Erugu*yplus, 1.))/Kappa_;
416
417 ypluslam = yplus;
418}
419
420int Paroi_std_hyd_VDF::compute_law_komega(DoubleTab& field_komega)
421{
422 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_dis_.valeur());
423 const IntVect& orientation = domaine_VDF.orientation();
424 const IntTab& face_voisins = domaine_VDF.face_voisins();
425 const Equation_base& eqn_hydr = mon_modele_turb_hyd->equation();
426 const Fluide_base& le_fluide = ref_cast(Fluide_base, eqn_hydr.milieu());
427 const Champ_Don_base& ch_visco_cin = le_fluide.viscosite_cinematique();
428 const DoubleVect& vit = eqn_hydr.inconnue().valeurs();
429 const DoubleTab& tab_visco = ch_visco_cin.valeurs();
430 double visco = -1;
431
432 // cAlan : devrait pouvoir être fait une seule fois au prépare ?
433 // cAlan : si pas uniforme, on met à jour, sinon inutile de refaire ça.
434 int l_unif {0};
435 if (sub_type(Champ_Uniforme, ch_visco_cin))
436 {
437 visco = std::max(tab_visco(0, 0), DMINFLOAT);
438 l_unif = 1;
439 }
440
441 // preparer_calcul_hyd(tab);
442 if ((!l_unif) && (tab_visco.local_min_vect()<DMINFLOAT))
443 // on ne doit pas changer tab_visco ici !
444 {
445 Cerr << "In Paroi_std_hyd_VDF::compute_law_komega : visco = " << tab_visco.local_min_vect() << " <= 0 ? " << finl;
446 throw;
447 }
448 int ndeb, nfin, elem, ori;
449 //double norm_v, dist, u_plus_d_plus {0}, d_visco;
450 double norm_v, dist, d_visco;
451 //u_plus_d_plus += 1;
452 //double val,val1,val2;
453
454 //****************************************************************
455 // Modifs du 19/10 pour etre coherent avec la diffusion turbulente
456 double signe;
457 //****************************************************************
458
459 // Boucle sur les bords
460 for (int n_bord = 0; n_bord < domaine_VDF.nb_front_Cl(); n_bord++)
461 {
462
463 // pour chaque condition limite on regarde son type
464 // On applique les lois de paroi uniquement
465 // aux voisinages des parois
466
467 // cAlan : remplaçable par un tableau rempli en début de calcul ?
468 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
469 const Front_VF& le_bord = ref_cast(Front_VF, la_cl->frontiere_dis());
470 ndeb = le_bord.num_premiere_face();
471 nfin = ndeb + le_bord.nb_faces();
472
473 if (sub_type(Dirichlet_paroi_fixe, la_cl.valeur()) || sub_type(Dirichlet_paroi_defilante, la_cl.valeur() ))
474 {
475 int isdiri = 0;
476 DoubleTab vitesse_imposee_face_bord(le_bord.nb_faces(), dimension);
477
478 // Text for paroi_defilante
479 if (sub_type(Dirichlet_paroi_defilante, la_cl.valeur()))
480 {
481 isdiri = 1;
483 la_cl.valeur());
484 for (int face = ndeb; face < nfin; face++)
485 for (int k = 0; k < dimension; k++)
486 vitesse_imposee_face_bord(face - ndeb, k) = cl_diri.val_imp(face - ndeb, k);
487 }
488
489 ArrOfDouble vit_paroi (dimension);
490 ArrOfDouble val (dimension - 1);
491 for (int num_face = ndeb; num_face < nfin; num_face++)
492 {
493 if (isdiri) // for cl paroi_defilante uniquement
494 for (int k = 0; k < dimension; k++)
495 vit_paroi[k] = vitesse_imposee_face_bord(num_face - ndeb, k);
496
497 ori = orientation(num_face);
498 if ((elem = face_voisins(num_face, 0)) != -1)
499 {
500 //norm_v=norm_2D_vit(vit,elem,ori,domaine_VDF,val);
501 norm_v = norm_vit(vit, elem, ori, domaine_VDF, vit_paroi, val);
502 signe = -1.;
503 }
504 else
505 {
506 elem = face_voisins(num_face, 1);
507 //norm_v=norm_2D_vit(vit,elem,ori,domaine_VDF,val);
508 norm_v = norm_vit(vit, elem, ori, domaine_VDF, vit_paroi, val);
509 signe = 1.;
510 }
511
512 // Axisymmetric treatment
513 if (axi)
514 dist = domaine_VDF.dist_norm_bord_axi(num_face);
515 else
516 dist = domaine_VDF.dist_norm_bord(num_face);
517
518 // Get viscosity
519 if (l_unif)
520 d_visco = visco;
521 else
522 d_visco = tab_visco(elem, 0);
523
524 const double u_plus_d_plus = norm_v*dist/d_visco;
525
526 compute_layer_selection(u_plus_d_plus, d_visco, field_komega,norm_v, dist, elem, num_face);
527
528 // Calcul de la contrainte tangentielle
529 double vit_frot = tab_u_star(num_face)*tab_u_star(num_face);
530 if (ori == 0)
531 {
532 Cisaillement_paroi_(num_face, 1) = vit_frot*val[0]*signe;
533 if (dimension == 3)
534 Cisaillement_paroi_(num_face, 2) = vit_frot*val[1]*signe;
535 Cisaillement_paroi_(num_face, 0) = 0.;
536 }
537 else if (ori == 1)
538 {
539 Cisaillement_paroi_(num_face, 0) = vit_frot*val[0]*signe;
540 if (dimension == 3)
541 Cisaillement_paroi_(num_face, 2) = vit_frot*val[1]*signe;
542 Cisaillement_paroi_(num_face, 1) = 0.;
543 }
544 else
545 {
546 Cisaillement_paroi_(num_face, 0) = vit_frot*val[0]*signe;
547 Cisaillement_paroi_(num_face, 1) = vit_frot*val[1]*signe;
548 Cisaillement_paroi_(num_face, 2) = 0.;
549 }
550
551 // Calcul de u+ d+
553 num_face, dist, d_visco, norm_v) ;
554 }
555 }
556 }
557 Cisaillement_paroi_.echange_espace_virtuel();
558 field_komega.echange_espace_virtuel();
559
560 return 1;
561}
562
563int Paroi_std_hyd_VDF::compute_layer_selection(double u_plus_d_plus, double d_visco,
564 DoubleTab& field_komega, double norm_vit,
565 double dist, int elem, int num_face)
566{
567 double valmin = table_hyd.val(5); // y+=5, the upper bound of the viscous layer
568 double valmax = table_hyd.val(30); // y+=30, the lower bound of the inertial sub-layer
569
570 if (u_plus_d_plus <= valmin)
571 {
572 // Viscours sub-layer
573 calculer_u_star_sous_couche_visq(norm_vit, d_visco, dist, num_face);
574 compute_viscous_layer(field_komega, dist, d_visco, elem);
575 }
576 else if ((u_plus_d_plus > valmin) && (u_plus_d_plus < valmax))
577 {
578 // Buffer layer
579 double d_plus;
580 calculer_u_star_sous_couche_tampon(d_plus, u_plus_d_plus, d_visco, dist, num_face);
581 compute_buffer_layer(field_komega, dist, d_visco, elem, num_face);
582 }
583 else // if (u_plus_d_plus >= valmax)
584 {
585 // Inertial sub-layer
586 calculer_u_star_sous_couche_log(norm_vit, d_visco, dist, num_face);
587 compute_log_layer(field_komega, dist, elem, num_face);
588 }
589 return 1;
590}
591
592int Paroi_std_hyd_VDF::compute_viscous_layer(DoubleTab& field_komega, double dist_y,
593 double viscosity, int elem)
594{
595 field_komega(elem, 0) = 0;
596 field_komega(elem, 1) = 6.*coeff_omega_wall_*viscosity/(BETA1*dist_y*dist_y);
597 return 1;
598}
599
600int Paroi_std_hyd_VDF::compute_buffer_layer(DoubleTab& field_komega, double dist_y,
601 double viscosity, int elem, int face)
602{
603 const double u_star = tab_u_star_(face);
604 //const double u_star_carre = u_star*u_star;
605
606 // TANH mean, as a first test. Other blendings could be
607 // implemented. See OpenFOAM here
608 // (https://www.openfoam.com/documentation/guides/latest/api/omegaWallFunctionFvPatchScalarField_8C_source.html)
609 // for examples
610 const double yPlus = u_star*dist_y/viscosity;
611
612 double lm_plus = calcul_lm_plus(yPlus);
613 double deriv = Fdypar_direct(lm_plus);
614 double x = lm_plus*u_star*deriv;
615
616 field_komega(elem, 0) = x*x/sCmu;//;u_star_carre/sCmu;
617 const double phiTanh = tanh(0.1*0.1*0.1*0.1*yPlus*yPlus*yPlus*yPlus);
618 const double omega_vis = 6.*coeff_omega_wall_*viscosity/(BETA1*dist_y*dist_y);
619 const double omega_log = u_star/(std::sqrt(BETA_K)*Kappa_*dist_y);
620 const double b1 = omega_vis + omega_log;
621 const double b2 = pow(pow(omega_vis, 1.2) + pow(omega_log,1.2), 1.0/1.2);
622
623 field_komega(elem, 1) = phiTanh*b1 + (1 - phiTanh)*b2;
624
625 return 1;
626}
627
628int Paroi_std_hyd_VDF::compute_log_layer(DoubleTab& field_komega, double dist_y, int elem, int face)
629{
630 const double u_star = tab_u_star(face);
631 const double u_star_carre = u_star*u_star;
632
633 field_komega(elem, 0) = u_star_carre/sqrt(Cmu_);
634 field_komega(elem, 1) = u_star/(std::sqrt(BETA_K)*Kappa_*dist_y);
635
636 return 1;
637}
638
639// Calcul de u+ d+
640void Paroi_std_hyd_VDF::calculer_uplus_dplus(DoubleVect& uplus, DoubleVect& dplus,
641 DoubleVect& tab_ustar, int num_face,
642 double dist, double d_visco, double norm_v)
643{
644 double ustar = tab_ustar(num_face);
645 dplus(num_face) = ustar*dist/d_visco;
646 if (ustar != 0)
647 uplus(num_face) = norm_v/ustar;
648}
649
650// Version k_eps
651int Paroi_std_hyd_VDF::calculer_local(double u_plus_d_plus, double d_visco,
652 DoubleTab& k_eps, double norm_vit,
653 double dist, int elem, int num_face)
654{
655 double valmin = table_hyd.val(5); // y+=5, the upper bound of the viscous layer
656 double valmax = table_hyd.val(30); // y+=30, the lower bound of the inertial sub-layer
657
658 if (u_plus_d_plus <= valmin)
659 {
660 // Viscours sub-layer
661 calculer_u_star_sous_couche_visq(norm_vit, d_visco, dist, num_face);
662 calculer_sous_couche_visq(k_eps, dist, elem, d_visco, num_face);
663 }
664
665 else if ((u_plus_d_plus > valmin) && (u_plus_d_plus < valmax))
666 {
667 // Buffer layer
668 double d_plus;
669 calculer_u_star_sous_couche_tampon(d_plus, u_plus_d_plus, d_visco, dist, num_face);
670 calculer_sous_couche_tampon(k_eps, d_visco, d_plus, elem, num_face);
671 }
672
673 else // if (u_plus_d_plus >= valmax)
674 {
675 // Inertial sub-layer
676 calculer_u_star_sous_couche_log(norm_vit, d_visco, dist, num_face);
677 calculer_sous_couche_log(k_eps, dist, elem, num_face);
678 }
679 return 1;
680}
681
682// Version nu_t et tab_k
683int Paroi_std_hyd_VDF::calculer_local(double u_plus_d_plus,double d_visco,
684 DoubleTab& tab_nu_t, DoubleTab& tab_k, double norm_vit,
685 double dist, int elem, int num_face)
686{
687 double valmin = table_hyd.val(5); // y+=5, the upper bound of the viscous layer
688 double valmax = table_hyd.val(30); // y+=30, the lower bound of the inertial sub-layer
689
690 if (u_plus_d_plus <= valmin)
691 {
692 // Viscous sub-layer
693 calculer_u_star_sous_couche_visq(norm_vit, d_visco, dist, num_face);
694 calculer_sous_couche_visq(tab_nu_t, tab_k, elem);
695 }
696
697 else if ((u_plus_d_plus > valmin) && (u_plus_d_plus < valmax))
698 {
699 // Buffer layer
700 double d_plus;
701 calculer_u_star_sous_couche_tampon(d_plus, u_plus_d_plus, d_visco, dist, num_face);
702 calculer_sous_couche_tampon(tab_nu_t, tab_k, d_visco, d_plus, elem, num_face);
703 }
704
705 else if (u_plus_d_plus >= valmax)
706 {
707 // Inertial sub-layer
708 calculer_u_star_sous_couche_log(norm_vit, d_visco, dist, num_face);
709 calculer_sous_couche_log(tab_nu_t, tab_k, dist, elem, num_face);
710 }
711 return 1;
712}
713
714// Return u_star directly
715double Paroi_std_hyd_VDF::calculer_local(double u_plus_d_plus, double d_visco, double norm_vit,
716 double dist, int& type_cou, double& d_plus)
717{
718 double valmin = table_hyd.val(5); // y+=5, the upper bound of the viscous layer
719 double valmax = table_hyd.val(30); // y+=30, the lower bound of the inertial sub-layer
720 double u_star;
721
722 if (u_plus_d_plus <= valmin)
723 {
724 // Viscous layer
725 u_star = calculer_u_star_sous_couche_visq(norm_vit, d_visco, dist);
726 //Cerr << "Premier point dans le sous-couche visqueuse : y+=" << u_star*dist/d_visco << finl;
727 type_cou = 0;
728 }
729
730 else if ((u_plus_d_plus > valmin) && (u_plus_d_plus < valmax))
731 {
732 // Buffer layer
733 u_star = calculer_u_star_sous_couche_tampon(u_plus_d_plus, d_visco, dist, d_plus);
734 //Cerr << "Premier point dans le sous-couche tampon : y+=" << u_star*dist/d_visco << finl;
735 type_cou = 1;
736 }
737
738 else if (u_plus_d_plus >= valmax)
739 {
740 // Inertial sub-layer
741 u_star = calculer_u_star(norm_vit, d_visco, dist);
742 // Cerr << "Premier point dans le sous-couche log : y+=" << u_star*dist/d_visco << finl;
743 type_cou = 2;
744 }
745 else
746 {
747 // cAlan : pourquoi ce bloc ?!
748 //bizarre
749 u_star = 0;
750 assert(0);
752 }
753 return u_star;
754}
755
756// = Viscous layer
757// Avec stockage dans tableau tab_u_star_
758int Paroi_std_hyd_VDF::calculer_u_star_sous_couche_visq(double norm_vit, double d_visco,
759 double dist, int face)
760{
761 // Dans la sous couche visqueuse: u* = sqrt(u*nu/d)
762
763 tab_u_star_(face) = sqrt(norm_vit*d_visco/dist);
764 // Cerr<<" USTA "<<face<<" "<< tab_u_star_(face)<<finl;
765 return 1;
766}
767
768// Retourne la vitesse sans stockage dans le tableau tab_u_star_
769double Paroi_std_hyd_VDF::calculer_u_star_sous_couche_visq(double norm_vit, double d_visco,
770 double dist)
771{
772 // Dans la sous couche visqueuse: u* = sqrt(u*nu/d)
773 return sqrt(norm_vit*d_visco/dist);
774}
775
776// Version K_Eps
777int Paroi_std_hyd_VDF::calculer_sous_couche_visq(DoubleTab& K_eps, double dist,
778 int elem, double d_visco, int face)
779{
780 // Dans la sous couche visqueuse: k = eps = 0
781
782 // cAlan : attention k_eps k-eps k-epsilon !
783 K_eps(elem, 0) = 0.;
784 K_eps(elem, 1) = 0.;
785
786 return 1;
787
788 // cAlan : Tout ce bloc n'est pas appelé ?!
789 double u_star = tab_u_star(face);
790 double d_plus = dist*u_star/d_visco;
791 double u_star_carre = u_star*u_star;
792 double C = 0.08; // cAlan est-ce le Cmu ?!
793 double alpha = 0.06; // cAlan : pourquoi ce changement de valeur de alpha ?!
794 alpha = 0.06550;
795 // f1=f2=fmu=1
796 alpha = 0.3;
797 // f1=f2+1 fmu de LS
798 alpha = 0.05480;
799
800 K_eps(elem, 0) = u_star_carre*d_plus*d_plus*C;
801 //K_eps(elem,1) = u_star_carre*u_star_carre/d_visco*(d_plus*0.005);
802 K_eps(elem, 1) = u_star_carre*u_star_carre/d_visco*(d_plus*d_plus*C)*alpha;
803 //assert(0);
804 //exit();
805 return 1;
806}
807
808// Version nu_t et K
809int Paroi_std_hyd_VDF::calculer_sous_couche_visq(DoubleTab& nu_t, DoubleTab& k, int elem)
810{
811 // Dans la sous couche visqueuse: nu_t = k = 0
812 nu_t(elem) = 0.;
813 k(elem,0) = 0.;
814 return 1;
815}
816
817// = Buffer layer
818int Paroi_std_hyd_VDF::calculer_u_star_sous_couche_tampon(double& d_plus, double u_plus_d_plus,
819 double d_visco, double dist, int face)
820{
821 // Calcul de d_plus solution de table_hyd(inconnue) = u_plus_d_plus
822 // puis calcul de u* dans la sous-couche tampon : u* = nu*d+/dist
823 double d_plus_min = 5; // y+=5, the upper bound of the viscous layer
824 double d_plus_max = 30; // y+=30, the lower bound of the inertial sub-layer
825 double epsilon = 1.e-12;
826 double gauche = table_hyd.val(d_plus_min);
827 double droite = table_hyd.val(d_plus_max);
828
829 if (gauche == droite)
830 d_plus = d_plus_min;
831 else
832 {
833 while(1)
834 {
835 double deriv = (droite - gauche)/(d_plus_max - d_plus_min);
836 d_plus = d_plus_min + (u_plus_d_plus - gauche)/deriv;
837 double valeur = table_hyd.val(d_plus);
838 if (std::fabs(valeur - u_plus_d_plus) < epsilon)
839 {
840 double u_star = (d_visco*d_plus)/dist;
841 tab_u_star_(face) = u_star;
842 return 1;
843 }
844 if (valeur > u_plus_d_plus)
845 {
846 droite = valeur;
847 d_plus_max = d_plus;
848 }
849 else
850 {
851 gauche = valeur;
852 d_plus_min = d_plus;
853 }
854 }
855 }
856 return -1;
857}
858
859// Version avec passage de K_eps
860int Paroi_std_hyd_VDF::calculer_sous_couche_tampon(DoubleTab& K_eps, double d_visco,
861 double d_plus, int elem, int face)
862{
863 // Calcul des grandeurs turbulentes a partir de d_plus et de u_star
864 double u_star = tab_u_star(face);
865 double lm_plus = calcul_lm_plus(d_plus);
866 double deriv = Fdypar_direct(lm_plus);
867 double x = lm_plus*u_star*deriv;
868
869 // Dans la sous couche tampon :
870 //
871 // k = lm+ * u* * derivee(u+d+(d+))/sqrt(Cmu_)
872 //
873 // 2
874 // eps = k * u* * derivee(u+d+(d+))*sqrt(Cmu_)/nu
875 //
876
877 // K_eps(elem,0) = std::max( K_eps(elem,0) , x*x/sqrt(Cmu_) );
878
879 //K_eps(elem,1) = std::max( K_eps(elem,1) , (K_eps(elem,0)*u_star*u_star*deriv)*sqrt(Cmu_)/d_visco );
880
881
882 K_eps(elem,0) = x*x/sqrt(Cmu_) ;
883 K_eps(elem,1) = (K_eps(elem,0)*u_star*u_star*deriv)*sqrt(Cmu_)/d_visco;
884
885 return 1;
886}
887
888// Version avec passage de nu_t et tab_k
889int Paroi_std_hyd_VDF::calculer_sous_couche_tampon(DoubleTab& nu_t,DoubleTab& tab_k,
890 double d_visco,double d_plus,
891 int elem,int face)
892{
893 // Calcul des grandeurs turbulentes a partir de d_plus et de u_star
894
895 double u_star = tab_u_star(face);
896 double lm_plus = calcul_lm_plus(d_plus);
897 double deriv = Fdypar_direct(lm_plus);
898 double x = lm_plus*u_star*deriv;
899
900 // Dans la sous couche tampon :
901 //
902 // k = lm+ * u* * derivee(u+d+(d+))/sqrt(Cmu_)
903 //
904 // 2
905 // eps = k * u* * derivee(u+d+(d+))*sqrt(Cmu_)/nu
906 //
907 // nu_t = Cmu*k*k/eps
908 //
909
910 double k = x*x/sqrt(Cmu_);
911 double eps = (k*u_star*u_star*deriv)*sqrt(Cmu_)/d_visco;
912 tab_k(elem,0) = k;
913 nu_t(elem) = Cmu_*k*k/eps;
914 return 1;
915}
916
917double Paroi_std_hyd_VDF::calculer_u_star_sous_couche_tampon(double u_plus_d_plus, double d_visco,
918 double dist, double& d_plus)
919{
920 // Calcul de d_plus solution de table_hyd(inconnue) = u_plus_d_plus
921 // puis calcul de u* dans la sous-couche tampon : u* = nu*d+/dist
922 double d_plus_min = 5; // y+=5, the upper bound of the viscous layer
923 double d_plus_max = 30; // y+=30, the lower bound of the inertial sub-layer
924 double u_star = 0.;
925 double epsilon = 1.e-12;
926 double gauche = table_hyd.val(d_plus_min);
927 double droite = table_hyd.val(d_plus_max);
928 int atteint = 2;
929
930 if (gauche == droite)
931 d_plus = d_plus_min;
932 else
933 {
934 while(atteint != 1)
935 {
936 double deriv = (droite - gauche)/(d_plus_max - d_plus_min);
937 d_plus = d_plus_min + (u_plus_d_plus - gauche)/deriv;
938 double valeur = table_hyd.val(d_plus);
939 if(std::fabs(valeur - u_plus_d_plus) < epsilon)
940 {
941 u_star = (d_visco*d_plus)/dist;
942 atteint = 1;
943 }
944 if(valeur > u_plus_d_plus)
945 {
946 droite = valeur;
947 d_plus_max = d_plus;
948 }
949 else
950 {
951 gauche = valeur;
952 d_plus_min = d_plus;
953 }
954 }
955 }
956 return u_star;
957}
958
959// = Log layer
960int Paroi_std_hyd_VDF::calculer_u_star_sous_couche_log(double norm_vit, double d_visco,
961 double dist, int face)
962{
963 // Dans la sous couche inertielle u* est solution d'une equation
964 // differentielle resolue de maniere iterative
965
966 const double Xpini = 30.;
967 // const double Xpini = 200.;
968 const int itmax = 25;
969 const double seuil = 0.01;
970 const double c1 = Kappa_*norm_vit;
971 const double c2 = log(Erugu*dist/d_visco); // log = logarithme neperien
972
973 double u_star = Xpini*d_visco/dist;
974 int iter = 0;
975 double u_star1 = 1;
976 while ((iter++ < itmax) && (std::fabs(u_star1) > seuil))
977 {
978 u_star1 = (c1 - u_star*(log(u_star) + c2))/(c1 + u_star);
979 u_star = (1 + u_star1)*u_star;
980 }
981 if (std::fabs(u_star1) >= seuil) erreur_non_convergence();
982 tab_u_star_(face) = u_star;
983 return 1;
984}
985
986// Version avec tableau k_eps
987int Paroi_std_hyd_VDF::calculer_sous_couche_log(DoubleTab& K_eps, double dist,
988 int elem,int face)
989{
990 // K et Eps sont donnes par les formules suivantes:
991 //
992 // 2 3
993 // k = u*/sqrt(Cmu_) et eps = u* / Kd
994 //
995
996 double u_star = tab_u_star(face);
997 double u_star_carre = u_star*u_star;
998
999 K_eps(elem, 0) = u_star_carre/sqrt(Cmu_);
1000 K_eps(elem, 1) = u_star_carre*u_star/(Kappa_*dist);
1001
1002 return 1;
1003}
1004
1005// Version avec nu_t et tab_k
1006int Paroi_std_hyd_VDF::calculer_sous_couche_log(DoubleTab& nu_t, DoubleTab& tab_k,
1007 double dist, int elem, int face)
1008{
1009 // nu_t = Cmu*k*k/eps
1010 //
1011 // 2 3
1012 // En utilisant k = u*/sqrt(Cmu_) et eps = u* / Kd
1013 //
1014 // on calcule nu_t en fonction de u*
1015
1016 double u_star = tab_u_star(face);
1017
1018 tab_k(elem,0) = u_star*u_star/sqrt(Cmu_);
1019 nu_t(elem) = u_star*Kappa_*dist;
1020
1021 return 1;
1022}
1023// = End of boundary layer functions
1024
1026{
1027 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_dis_.valeur());
1028 int ndeb, nfin;
1029 DoubleVect moy(4);
1030 moy = 0.;
1031 double norme_L2 = 0.;
1032 EcrFicPartage Ustar;
1033 ouvrir_fichier_partage(Ustar, "Ustar");
1034
1035 for (int n_bord = 0; n_bord < domaine_VDF.nb_front_Cl(); n_bord++)
1036 {
1037 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
1038 if ((sub_type(Dirichlet_paroi_fixe, la_cl.valeur())) ||
1039 (sub_type(Dirichlet_paroi_defilante, la_cl.valeur())))
1040 {
1041 const Front_VF& le_bord = ref_cast(Front_VF, la_cl->frontiere_dis());
1042 if(je_suis_maitre())
1043 {
1044 Ustar << finl;
1045 Ustar << "Bord " << le_bord.le_nom() << finl;
1046 if (dimension == 2)
1047 {
1048 Ustar << "-------------------------------------------------------------------------------------------";
1049 Ustar << "--------------------------------------------------------------------------------------------" << finl;
1050 Ustar << "\tFace a\t\t\t\t|\t\t\t\t\t\t\t\t\t| TAU=Nu.Grad(Ut) [m2/s2]" << finl;
1051 Ustar << "----------------------------------------|--------------------------------------------------";
1052 Ustar << "---------------------|----------------------------------------------------------------------" << finl;
1053 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;
1054 Ustar << "----------------|-----------------------|-----------------------|-----------------------|--";
1055 Ustar << "---------------------|-----------------------|-----------------------|----------------------" << finl;
1056 }
1057 if (dimension == 3)
1058 {
1059 Ustar << "-----------------------------------------------------------------------------------------------------------------";
1060 Ustar << "-----------------------------------------------------------------------------------------------------------------" << finl;
1061 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;
1062 Ustar << "----------------------------------------------------------------|------------------------------------------------";
1063 Ustar << "-----------------------|-----------------------------------------------------------------------------------------" << finl;
1064 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;
1065 Ustar << "----------------|-----------------------|-----------------------|-----------------------|-----------------------|";
1066 Ustar << "-----------------------|-----------------------|-----------------------|-----------------------|-----------------" << finl;
1067 }
1068 }
1069 ndeb = le_bord.num_premiere_face();
1070 nfin = ndeb + le_bord.nb_faces();
1071 for (int num_face = ndeb; num_face < nfin; num_face++)
1072 {
1073 double x = domaine_VDF.xv(num_face,0);
1074 double y = domaine_VDF.xv(num_face,1);
1075 norme_L2 = Cisaillement_paroi_(num_face,0)*Cisaillement_paroi_(num_face,0)
1076 + Cisaillement_paroi_(num_face,1)*Cisaillement_paroi_(num_face,1);
1077
1078 if (dimension == 2)
1079 Ustar << x << "\t| " << y;
1080 if (dimension == 3)
1081 {
1082 double z = domaine_VDF.xv(num_face, 2);
1083 Ustar << x << "\t| " << y << "\t| " << z;
1084 norme_L2 += Cisaillement_paroi_(num_face, 2)*Cisaillement_paroi_(num_face, 2);
1085 }
1086 norme_L2 = sqrt(norme_L2);
1087
1088 Ustar << "\t| " << uplus_(num_face)
1089 << "\t| " << tab_d_plus(num_face)
1090 << "\t| " << tab_u_star(num_face)
1091 << "\t| " << norme_L2
1092 << "\t| " << Cisaillement_paroi_(num_face, 0)
1093 << "\t| " << Cisaillement_paroi_(num_face, 1);
1094 if (dimension == 3)
1095 Ustar << "\t| " << Cisaillement_paroi_(num_face,2);
1096 Ustar << finl;
1097
1098 // PQ : 03/03 : Calcul des valeurs moyennes (en supposant maillage regulier)
1099 moy(0) += uplus_(num_face);
1100 moy(1) += tab_d_plus(num_face);
1101 moy(2) += tab_u_star(num_face);
1102 moy(3) += 1;
1103 }
1104 Ustar.syncfile();
1105 }
1106 }
1108
1109 if (moy(3) && je_suis_maitre())
1110 {
1111 Ustar << finl;
1112 Ustar << "-------------------------------------------------------------" << finl;
1113 Ustar << "Calcul des valeurs moyennes (en supposant maillage regulier):" << finl;
1114 Ustar << "<u+>= " << moy(0)/moy(3)
1115 << " <d+>= " << moy(1)/moy(3)
1116 << " <u*>= " << moy(2)/moy(3)
1117 << finl;
1118 }
1119
1120 if(je_suis_maitre())
1121 Ustar << finl << finl;
1122 Ustar.syncfile();
1123}
1124
1125//
1126// Calcule les vitesses moyennes aux premieres mailles le long des parois
1127// (norme des vitesses)
1128// LIMITATION au cas du CANAL, avec parois en y=0 et y=2
1129//
1131 double& U_moy_2,
1132 double& dist_1,
1133 double& dist_2,
1134 double& visco_1,
1135 double& visco_2)
1136{
1137 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_dis_.valeur());
1138 const IntTab& face_voisins = domaine_VDF.face_voisins();
1139 const IntTab& elem_faces = domaine_VDF.elem_faces();
1140 const Equation_base& eqn_hydr = mon_modele_turb_hyd->equation();
1141 const DoubleTab& vitesse = eqn_hydr.inconnue().valeurs();
1142 const Fluide_base& le_fluide = ref_cast(Fluide_base,eqn_hydr.milieu());
1143 const Champ_Don_base& ch_visco_cin = le_fluide.viscosite_cinematique();
1144 const DoubleTab& tab_visco = ch_visco_cin.valeurs();
1145 const IntVect& orientation = domaine_VDF.orientation();
1146
1147// double u_m1 = 0.; // moyenne des vitesses selon x, a la paroi 1 (y=0)
1148// double u_m2 = 0.; // moyenne des vitesses selon x, a la paroi 2 (y=2)
1149// double w_m1 = 0.; // moyenne des vitesses selon z, a la paroi 1 (y=0)
1150// double w_m2 = 0.; // moyenne des vitesses selon z, a la paroi 2 (y=2)
1151// int nb_1 = 0;
1152// int nb_2 = 0;
1153
1154 DoubleTrav values(5, 2);
1155 values = 0.;
1156 values(0, 0) = visco_1;
1157 values(0, 1) = visco_2;
1158 values(1, 0) = dist_1;
1159 values(1, 1) = dist_2;
1160// u_m1 -> values(2,0) et u_m2 -> values(2,1)
1161// w_m1 -> values(3,0) et w_m2 -> values(3,1)
1162// nb_1 -> values(4,0) et nb_2 -> values(4,1)
1163
1164 int dir_par, dir1, dir2;
1165 int nb_front_Cl = domaine_VDF.nb_front_Cl();
1166 double visco = -1;
1167 int l_unif = 0;
1168
1169 if (sub_type(Champ_Uniforme,ch_visco_cin))
1170 {
1171 visco = std::max(tab_visco(0, 0), DMINFLOAT);
1172 l_unif = 1;
1173 }
1174 else
1175 {
1176 if (tab_visco.local_min_vect()<DMINFLOAT)
1177 // on ne doit pas changer tab_visco ici !
1178 {
1179 Cerr << "In Paroi_std_hyd_VDF::calculer_moyennes_parois : visco = " << tab_visco.local_min_vect() << " <= 0 ? " << finl;
1180 throw;
1181 }
1182 // tab_visco += DMINFLOATBETA_K;
1183 }
1184
1185 for (int n_bord = 0; n_bord < nb_front_Cl; n_bord++)
1186 {
1187 // pour chaque condition limite on regarde son type
1188 // On applique les lois de paroi uniquement
1189 // aux voisinages des parois
1190 // Dans un premier temps on ne traite que les paroi_fixe,
1191 // qui correspondent a une des 2 parois du canal
1192
1193 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
1194
1195 if (sub_type(Dirichlet_paroi_fixe, la_cl.valeur()) )
1196 {
1197 const Front_VF& le_bord = ref_cast(Front_VF, la_cl->frontiere_dis());
1198 int ndeb = le_bord.num_premiere_face();
1199 int nfin = ndeb + le_bord.nb_faces();
1200 int paroi;
1201 int num_elem;
1202
1203 if (nfin == ndeb)
1204 {
1205 // cas ou le bord est nul
1206 dir_par=-1;
1207 dir1 =-1;
1208 dir2=-1;
1209 }
1210 else
1211 {
1212 dir_par = orientation(ndeb);
1213 // Recherche des deux autres orientations (pas dir_par)
1214 switch(dir_par)
1215 {
1216 case 0:
1217 {
1218 dir1 = 1;
1219 dir2 = 2;
1220 break;
1221 }
1222 case 1:
1223 {
1224 dir1 = 0;
1225 dir2 = 2;
1226 break;
1227 }
1228 case 2:
1229 {
1230 dir1 = 0;
1231 dir2 = 1;
1232 break;
1233 }
1234 default:
1235 {
1236 dir1 = dir2=-1;
1237 Cerr << que_suis_je() <<" Aborting during detection of wall orientation."<< finl;
1238 Cerr<<"Please contact TRUST support."<<finl;
1239 Process::exit();
1240 }
1241 }
1242 }
1243
1244 for (int num_face = ndeb; num_face < nfin; num_face++)
1245 {
1246 // Recherche de l'element associe a cette face de la bordure
1247 // Distinction entre la paroi basse et la paroi haute (specifique au CANAL)
1248 num_elem = face_voisins(num_face, 0);
1249 paroi = 2;
1250 if (num_elem == -1)
1251 {
1252 num_elem = face_voisins(num_face, 1); // Alors on est a la paroi basse!!!
1253 paroi = 1;
1254 }
1255
1256 // Calcul des composantes de la vitesse moyenne
1257 if (paroi == 1)
1258 {
1259 values(2,0) += vitesse(elem_faces(num_elem, dir1));
1260 values(3,0) += vitesse(elem_faces(num_elem, dir2));
1261 values(1,0) += domaine_VDF.dim_elem(num_elem, dir_par);
1262 if (l_unif)
1263 values(0,0) += visco;
1264 else
1265 values(0,0) += tab_visco(num_elem);
1266 values(4,0)++;
1267 }
1268 else
1269 {
1270 values(2,1) += vitesse(elem_faces(num_elem, dir1));
1271 values(3,1) += vitesse(elem_faces(num_elem, dir2));
1272 values(1,1) += domaine_VDF.dim_elem(num_elem, dir_par);
1273 if (l_unif)
1274 values(0,1) += visco;
1275 else
1276 values(0,1) += tab_visco(num_elem);
1277 values(4,1)++;
1278 }
1279 }
1280 }
1281 }
1282
1283 values(1,0) *= 0.5;
1284 values(1,1) *= 0.5;
1285 // Somme les contributions de chaque processeur:
1286 mp_sum_for_each_item(values);
1287 U_moy_1 = sqrt( values(2, 0) * values(2, 0) + values(3, 0) * values(3, 0) ) / values(4, 0);
1288 U_moy_2 = sqrt( values(2, 1) * values(2, 1) + values(3, 1) * values(3, 1) ) / values(4, 1);
1289 dist_1 = values(1, 0)/values(4, 0);
1290 dist_2 = values(1, 1)/values(4, 1);
1291 visco_1 = values(0, 0)/values(4, 0);
1292 visco_2 = values(0, 1)/values(4, 1);
1293
1294}
1295
1296void Paroi_std_hyd_VDF::modifs_valeurs_turb(int num_elem, int type_cou,
1297 double u_star, double dist,
1298 double d_visco, double d_plus,
1299 DoubleTab& tab_nu_t, DoubleTab& tab_k)
1300{
1301
1302 if (type_cou == 0)
1303 {
1304 tab_nu_t(num_elem) = 0.;
1305 tab_k(num_elem) = 0.;
1306 }
1307 else if (type_cou == 1)
1308 {
1309 double lm_plus = calcul_lm_plus(d_plus);
1310 double deriv = Fdypar_direct(lm_plus);
1311 double x= lm_plus*u_star*deriv;
1312
1313 // Dans la sous couche tampon :
1314 //
1315 // k = lm+ * u* * derivee(u+d+(d+))/sqrt(Cmu_)
1316 //
1317 // 2
1318 // eps = k * u* * derivee(u+d+(d+))*sqrt(Cmu_)/nu
1319 //
1320 // nu_t = Cmu*k*k/eps
1321
1322 double k = x*x/sqrt(Cmu_);
1323 double eps = (k*u_star*u_star*deriv)*sqrt(Cmu_)/d_visco;
1324 tab_k(num_elem) = k;
1325 tab_nu_t(num_elem) = Cmu_*k*k/eps;
1326 }
1327 else if (type_cou == 2)
1328 {
1329 tab_k(num_elem) = u_star*u_star/sqrt(Cmu_);
1330 tab_nu_t(num_elem) = u_star*Kappa_*dist ;
1331 }
1332 else
1333 {
1334 Cerr << "Il y a un pbl : type_cou doit etre egal a 0, 1, ou 2!!" << finl;
1335 Cerr << "type_cou=" << type_cou << finl;
1336 Process::exit();
1337 }
1338}
1339
1340double Paroi_std_hyd_VDF::calculer_u_star(double& norm_vit, double& visco, double& dist)
1341{
1342 Cerr << "On ne doit pas passer dans Paroi_std_hyd_VDF::calculer_u_star..." << finl;
1343 Process::exit();
1344 return 1;
1345}
1346
1347
1348int Paroi_std_hyd_VDF::calculer_hyd_BiK(DoubleTab& tab_k, DoubleTab& tab_eps)
1349{
1350
1351// keps
1352 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_dis_.valeur());
1353 const IntVect& orientation = domaine_VDF.orientation();
1354 const IntTab& face_voisins = domaine_VDF.face_voisins();
1355 const Equation_base& eqn_hydr = mon_modele_turb_hyd->equation();
1356 const Fluide_base& le_fluide = ref_cast(Fluide_base, eqn_hydr.milieu());
1357 const Champ_Don_base& ch_visco_cin = le_fluide.viscosite_cinematique();
1358 const DoubleVect& vit = eqn_hydr.inconnue().valeurs();
1359 const DoubleTab& tab_visco = ch_visco_cin.valeurs();
1360 double visco = -1;
1361 int l_unif {0};
1362 if (sub_type(Champ_Uniforme, ch_visco_cin))
1363 {
1364 visco = std::max(tab_visco(0, 0), DMINFLOAT);
1365 l_unif = 1;
1366 }
1367
1368 // preparer_calcul_hyd(tab);
1369 if ((!l_unif) && (tab_visco.local_min_vect()<DMINFLOAT))
1370 // on ne doit pas changer tab_visco ici !
1371 {
1372 Cerr << "In Paroi_std_hyd_VDF::calculer_hyd_BiK : visco = " << tab_visco.local_min_vect() << " <= 0 ? " << finl;
1373 throw;
1374 }
1375
1376 int ndeb, nfin;
1377 int elem, ori;
1378 double norm_v;
1379 double dist;
1380 double u_plus_d_plus, d_visco;
1381 //double val,val1,val2;
1382
1383 //****************************************************************
1384 // Modifs du 19/10 pour etre coherent avec la diffusion turbulente
1385 double signe;
1386 //****************************************************************
1387
1388 // Boucle sur les bords
1389 for (int n_bord=0; n_bord<domaine_VDF.nb_front_Cl(); n_bord++)
1390 {
1391
1392 // pour chaque condition limite on regarde son type
1393 // On applique les lois de paroi uniquement
1394 // aux voisinages des parois
1395
1396 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
1397 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
1398 ndeb = le_bord.num_premiere_face();
1399 nfin = ndeb + le_bord.nb_faces();
1400
1401 if (sub_type(Dirichlet_paroi_fixe,la_cl.valeur()) || sub_type(Dirichlet_paroi_defilante,la_cl.valeur() ))
1402 {
1403 int isdiri=0;
1404 DoubleTab vitesse_imposee_face_bord(le_bord.nb_faces(),dimension);
1405 if (sub_type(Dirichlet_paroi_defilante,la_cl.valeur()) )
1406 {
1407 isdiri=1;
1408 const Dirichlet_paroi_defilante& cl_diri = ref_cast(Dirichlet_paroi_defilante,la_cl.valeur());
1409 for (int face=ndeb; face<nfin; face++)
1410 for (int k=0; k<dimension; k++)
1411 vitesse_imposee_face_bord(face-ndeb,k) = cl_diri.val_imp(face-ndeb,k);
1412 }
1413 ArrOfDouble vit_paroi(dimension);
1414 ArrOfDouble val(dimension-1);
1415
1416 for (int num_face=ndeb; num_face<nfin; num_face++)
1417 {
1418 if (isdiri)
1419 {
1420 int rang = num_face-ndeb;
1421 for (int k=0; k<dimension; k++)
1422 vit_paroi[k]=vitesse_imposee_face_bord(rang,k);
1423 }
1424 ori = orientation(num_face);
1425 if ( (elem =face_voisins(num_face,0)) != -1)
1426 {
1427 //norm_v=norm_2D_vit(vit,elem,ori,domaine_VDF,val);
1428 norm_v=norm_vit(vit,elem,ori,domaine_VDF,vit_paroi,val);
1429 signe = -1.;
1430 }
1431 else
1432 {
1433 elem = face_voisins(num_face,1);
1434 //norm_v=norm_2D_vit(vit,elem,ori,domaine_VDF,val);
1435 norm_v=norm_vit(vit,elem,ori,domaine_VDF,vit_paroi,val);
1436 signe = 1.;
1437 }
1438 if (axi)
1439 dist=domaine_VDF.dist_norm_bord_axi(num_face);
1440 else
1441 dist=domaine_VDF.dist_norm_bord(num_face);
1442 if (l_unif)
1443 d_visco = visco;
1444 else
1445 d_visco = tab_visco(elem,0);
1446
1447 u_plus_d_plus = norm_v*dist/d_visco;
1448
1449 // Calcul de u* et des grandeurs turbulentes:
1450
1451 double valmin = table_hyd.val(5);
1452 double valmax = table_hyd.val(30);
1453
1454 if (u_plus_d_plus <= valmin)
1455 {
1456 calculer_u_star_sous_couche_visq(norm_v,d_visco,dist,num_face);
1457
1458 // Dans la sous couche visqueuse: k = eps = 0
1459
1460 tab_k(elem) = 0.;
1461 tab_eps(elem,1) = 0.;
1462 }
1463
1464 else if ((u_plus_d_plus > valmin) && (u_plus_d_plus < valmax))
1465 {
1466 double d_plus;
1467 calculer_u_star_sous_couche_tampon(d_plus,u_plus_d_plus,d_visco,dist,num_face);
1468
1469 // Calcul des grandeurs turbulentes a partir de d_plus et de u_star
1470 double u_star = tab_u_star(num_face);
1471 double lm_plus = calcul_lm_plus(d_plus);
1472 double deriv = Fdypar_direct(lm_plus);
1473 double x= lm_plus*u_star*deriv;
1474
1475 // Dans la sous couche tampon :
1476 //
1477 // k = lm+ * u* * derivee(u+d+(d+))/sqrt(Cmu_)
1478 //
1479 // 2
1480 // eps = k * u* * derivee(u+d+(d+))*sqrt(Cmu_)/nu
1481 //
1482
1483
1484 tab_k(elem,0) = x*x/sqrt(Cmu_) ;
1485 tab_eps(elem,1) = (tab_k(elem)*u_star*u_star*deriv)*sqrt(Cmu_)/d_visco;
1486
1487 }
1488
1489 else // if (u_plus_d_plus >= valmax)
1490 {
1491 calculer_u_star_sous_couche_log(norm_v,d_visco,dist,num_face);
1492
1493 // K et Eps sont donnes par les formules suivantes:
1494 //
1495 // 2 3
1496 // k = u*/sqrt(Cmu_) et eps = u* / Kd
1497 //
1498
1499 double u_star= tab_u_star(num_face);
1500 double u_star_carre = u_star*u_star;
1501
1502 tab_k(elem) = u_star_carre/sqrt(Cmu_);
1503 tab_eps(elem) = u_star_carre*u_star/(Kappa_*dist);
1504 }
1505
1506 // Calcul de la contrainte tangentielle
1507
1508 double vit_frot = tab_u_star(num_face)*tab_u_star(num_face);
1509
1510 if (ori == 0)
1511 {
1512 Cisaillement_paroi_(num_face,1) = vit_frot*val[0]*signe;
1513 if (dimension==3)
1514 Cisaillement_paroi_(num_face,2) = vit_frot*val[1]*signe;
1515 Cisaillement_paroi_(num_face,0) = 0.;
1516 }
1517 else if (ori == 1)
1518 {
1519 Cisaillement_paroi_(num_face,0) = vit_frot*val[0]*signe;
1520 if (dimension==3)
1521 Cisaillement_paroi_(num_face,2) = vit_frot*val[1]*signe;
1522 Cisaillement_paroi_(num_face,1) = 0.;
1523 }
1524 else
1525 {
1526 Cisaillement_paroi_(num_face,0) = vit_frot*val[0]*signe;
1527 Cisaillement_paroi_(num_face,1) = vit_frot*val[1]*signe;
1528 Cisaillement_paroi_(num_face,2) = 0.;
1529 }
1530
1531 // Calcul de u+ d+
1532 calculer_uplus_dplus(uplus_, tab_d_plus_, tab_u_star_, num_face, dist, d_visco, norm_v) ;
1533 }
1534
1535
1536 }
1537 }
1538 Cisaillement_paroi_.echange_espace_virtuel();
1539 tab_k.echange_espace_virtuel();
1540 tab_eps.echange_espace_virtuel();
1541 return 1;
1542}
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
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.
virtual double val_imp(int i) const
Renvoie la valeur imposee sur la i-eme composante du champ a la frontiere au temps par defaut du cham...
Definition Dirichlet.cpp:35
class Domaine_VDF
Definition Domaine_VDF.h:64
double dist_norm_bord_axi(int num_face) const
double dim_elem(int, int) const
int orientation(int) const override
inline DoubleVect& Domaine_VDF::porosite_face() {
double dist_norm_bord(int num_face) const override
double xv(int num_face, int k) const
Definition Domaine_VF.h:76
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
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
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
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.
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
static int axi
Definition Objet_U.h:101
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
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Definition Param.cpp:364
void init_lois_paroi_hydraulique_()
void set_param(Param &param) const
double calcul_lm_plus(double d_plus)
CLASS: Paroi_std_hyd_VDF.
int calculer_u_star_sous_couche_visq(double, double, double, int)
int compute_buffer_layer(DoubleTab &, double, double, int, int)
int calculer_u_star_sous_couche_log(double, double, double, int)
virtual int initialize_wall_law_komega(DoubleTab &)
int calculer_local(double, double, DoubleTab &, double, double, int, int)
static constexpr double BETA_K
int init_lois_paroi() override
void calculer_moyennes_parois(double &, double &, double &, double &, double &, double &)
virtual double calculer_u_star(double &, double &, double &)
int calculer_sous_couche_tampon(DoubleTab &, double, double, int, int)
int compute_law_komega(DoubleTab &)
void imprimer_ustar(Sortie &) const override
int compute_viscous_layer(DoubleTab &field_komega, double dist_y, double viscosity, int elem)
virtual int preparer_calcul_hyd(DoubleTab &)
static constexpr double BETA1
void check_turbulence_model()
Returns an integer value depending on the turbulence model.
int calculer_sous_couche_visq(DoubleTab &, double, int, double, int)
int calculer_hyd_BiK(DoubleTab &, DoubleTab &) override
void modifs_valeurs_turb(int, int, double, double, double, double, DoubleTab &, DoubleTab &)
virtual int init_lois_paroi_hydraulique()
void calculer_uplus_dplus(DoubleVect &, DoubleVect &, DoubleVect &, int, double, double, double)
void set_param(Param &param) const override
int calculer_u_star_sous_couche_tampon(double &, double, double, double, int)
int compute_log_layer(DoubleTab &, double, int, int)
int calculer_sous_couche_log(DoubleTab &, double, int, int)
int compute_layer_selection(double, double, DoubleTab &, double, double, int, int)
int calculer_hyd(DoubleTab &) override
static void mp_sum_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
Definition Process.cpp:193
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
int nb_dim() const
Definition TRUSTTab.h:199
int line_size() const
Definition TRUSTVect.tpp:67
_TYPE_ local_min_vect(Mp_vect_options opt=VECT_REAL_ITEMS) const
Definition TRUSTVect.h:155
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
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_...