TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Paroi_loi_WW_hyd_VDF.cpp
1/****************************************************************************
2* Copyright (c) 2015 - 2016, 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_loi_WW_hyd_VDF.h>
17#include <Fluide_base.h>
18#include <Champ_Uniforme.h>
19#include <Domaine_Cl_VDF.h>
20#include <Dirichlet_paroi_fixe.h>
21#include <Dirichlet_paroi_defilante.h>
22#include <Equation_base.h>
23#include <Modele_turbulence_hyd_base.h>
24#include <Param.h>
25
26Implemente_instanciable_sans_constructeur(Paroi_loi_WW_hyd_VDF,"loi_WW_hydr_VDF",Paroi_std_hyd_VDF);
27
28// PrintOn
30{
31 return s << que_suis_je() << " " << le_nom();
32}
33
34// ReadOn
36{
37 Cerr<<"Reading of data for a "<<que_suis_je()<<" wall law"<<finl;
38 Param param(que_suis_je());
39 set_param(param);
40 param.lire_avec_accolades_depuis(is);
41 return is ;
42}
43
45{
47 param.ajouter_flag("impr",&impr);
48}
49
50/////////////////////////////////////////////////////////////////////
51//
52// Implementation des fonctions de la classe Paroi_loi_WW_hyd_VDF
53//
54/////////////////////////////////////////////////////////////////////
55
56// Remplissage de la table
58{
59 Cmu_ = mon_modele_turb_hyd->get_Cmu();
60 A= 8.3 ;
61 B= 1./7. ;
62 Y0= 11.81 ;
63 return 1;
64}
65
66// On annule les valeurs des grandeurs turbulentes qui
67// correspondent aux mailles de paroi
69{
70
71 return 1;
72}
73
74// calculer_hyd pour le k-epsilon
75int Paroi_loi_WW_hyd_VDF::calculer_hyd(DoubleTab& tab_k_eps)
76{
77 Cerr << " Paroi_loi_WW_hyd_VDF::calculer_hyd(DoubleTab& tab_k_eps) " << finl;
78 Cerr << "on ne doit pas entrer dans cette methode" << finl;
79 Cerr << " car elle est definie uniquement pour la LES " << finl ;
80 return 1 ;
81}
82
83int Paroi_loi_WW_hyd_VDF::calculer_hyd(DoubleTab& tab_nu_t,DoubleTab& tab_k)
84{
85 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_dis_.valeur());
86 const IntVect& orientation = domaine_VDF.orientation();
87 const IntTab& face_voisins = domaine_VDF.face_voisins();
88 const Equation_base& eqn_hydr = mon_modele_turb_hyd->equation();
89 const Fluide_base& le_fluide = ref_cast(Fluide_base, eqn_hydr.milieu());
90 const Champ_Don_base& ch_visco_cin = le_fluide.viscosite_cinematique();
91
92 // la vitesse resolue par l'equation hydr
93 const DoubleVect& vit = eqn_hydr.inconnue().valeurs();
94 const DoubleTab& tab_visco = ch_visco_cin.valeurs();
95 double visco=-1;
96
97 // l_unif est le parametre de controle
98 int l_unif;
99
100 // test si la viscosite est un champ uniforme
101 // l_unif=0 la viscosite n'est pas uniforme
102 // l_unif=1 la viscosite est uniforme
103 if (sub_type(Champ_Uniforme,ch_visco_cin))
104 {
105 visco = std::max(tab_visco(0,0),DMINFLOAT);
106 l_unif = 1;
107 }
108 else
109 l_unif = 0;
110
111
112 // *************************
113 // preparer_calcul_hyd(tab);
114 // *************************
115
116
117 // Cas ou la viscosite est nulle !!!!
118 if ((!l_unif) && (tab_visco.local_min_vect()<DMINFLOAT))
119 // on ne doit pas changer tab_visco ici !
120 {
121 Cerr << "In Paroi_loi_WW_hyd_VDF::calculer_hyd : visco = " << tab_visco.local_min_vect() << " <= 0 ? " << finl;
122 throw;
123 }
124 // tab_visco+=DMINFLOAT;
125
126 int ndeb,nfin;
127 int elem,ori;
128 double norm_v;
129 double dist;
130 double d_visco;
131
132 double val,val1,val2;
133 double signe;
134
135
136 // Boucle sur les bords
137 for (int n_bord=0; n_bord<domaine_VDF.nb_front_Cl(); n_bord++)
138 {
139
140 // pour chaque condition limite on regarde son type
141 // On applique les lois de paroi uniquement
142 // aux voisinages des parois
143 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
144
145 //**********************
146 // Condition Paroi_fixe
147 //**********************
148
149 if (sub_type(Dirichlet_paroi_fixe,la_cl.valeur()) )
150 {
151 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
152 ndeb = le_bord.num_premiere_face();
153 nfin = ndeb + le_bord.nb_faces();
154
155 // Cas dimension 2
156 if (dimension == 2 )
157 for (int num_face=ndeb; num_face<nfin; num_face++)
158 {
159
160 //ori vaut 0,1 ou 2 (0=> x=Cte, 1=> y=Cte ...)
161 ori = orientation(num_face);
162
163 // face_voisin contient les deux elements voisins d'une face
164 // 1er cas le bord est 'a droite' de la face de bord
165 // 2e cas le bord est 'a gauche'
166 if ( (elem =face_voisins(num_face,0)) != -1)
167 {
168 norm_v=norm_2D_vit(vit,elem,ori,domaine_VDF,val);
169 signe = -1.;
170 }
171 else
172 {
173 elem = face_voisins(num_face,1);
174 norm_v=norm_2D_vit(vit,elem,ori,domaine_VDF,val);
175 signe = 1.;
176 }
177
178 // dist correspondt a la distance entre le centre de la cellule et le bord
179 if (axi)
180 dist=domaine_VDF.dist_norm_bord_axi(num_face);
181 else
182 dist=domaine_VDF.dist_norm_bord(num_face);
183
184 // evaluation de la viscosite
185 if (l_unif)
186 d_visco = visco;
187 else
188 d_visco = tab_visco[elem];
189
190 // Calcul de u* et des grandeurs turbulentes
191 // a partir de norm_v
192 calculer_local(d_visco,tab_nu_t,tab_k,norm_v,dist,elem,num_face);
193 //Cerr << "ATTENTION!!! MODIFS FAITE POUR 3D ETENDUE A 2D MAIS NON VERIFIEE POUR 2D!!!!" << finl;
194
195 int num_elem = domaine_VDF.face_voisins(num_face,0);
196 if (num_elem == -1)
197 num_elem = domaine_VDF.face_voisins(num_face,1);
198
199
200 // Calcul de la contrainte tangentielle
201 Cisaillement_paroi_(num_face,1-ori) = signe*tab_u_star(num_face)*tab_u_star(num_face)*val;
202 Cisaillement_paroi_(num_face,ori) = 0.;
203 }
204
205 // Cas dimension 3
206 else if (dimension == 3)
207 for (int num_face=ndeb; num_face<nfin; num_face++)
208 {
209 //ori vaut 0,1 ou 2 (0=> x=Cte, 1=> y=Cte ...)
210 ori = orientation(num_face);
211
212 // face_voisin contient les deux elements voisins d'une face
213 if ( (elem = face_voisins(num_face,0)) != -1)
214 {
215 norm_v=norm_3D_vit(vit,elem,ori,domaine_VDF,val1,val2);
216 signe = -1.; // on est a la paroi sup
217 }
218 else
219 {
220 elem = face_voisins(num_face,1);
221 norm_v=norm_3D_vit(vit,elem,ori,domaine_VDF,val1,val2);
222 signe = 1.; // on est a la paroi inf
223 }
224
225 // dist correspondt a la distance entre le centre de la cellule et le bord
226 if (axi)
227 dist = domaine_VDF.dist_norm_bord_axi(num_face);
228 else
229 dist = domaine_VDF.dist_norm_bord(num_face);
230
231 // evaluation de la viscosite
232 if (l_unif)
233 d_visco = visco;
234 else
235 d_visco = tab_visco[elem];
236
237
238 // Calcul de u* et des grandeurs turbulentes:
239 // a partir de de norm_v
240 calculer_local(d_visco,tab_nu_t,tab_k,norm_v,dist,elem,num_face);
241
242 // Calcul des deux composantes de la contrainte tangentielle:
243 double vit_frot = tab_u_star(num_face)*tab_u_star(num_face);
244
245 if (ori == 0)
246 {
247 Cisaillement_paroi_(num_face,1) = signe*vit_frot*val1;
248 Cisaillement_paroi_(num_face,2) = signe*vit_frot*val2;
249 Cisaillement_paroi_(num_face,0) = 0.;
250 }
251 else if (ori == 1)
252 {
253 Cisaillement_paroi_(num_face,0) = signe*vit_frot*val1;
254 Cisaillement_paroi_(num_face,2) = signe*vit_frot*val2;
255 Cisaillement_paroi_(num_face,1) = 0.;
256 }
257 else
258 {
259 Cisaillement_paroi_(num_face,0) = signe*vit_frot*val1;
260 Cisaillement_paroi_(num_face,1) = signe*vit_frot*val2;
261 Cisaillement_paroi_(num_face,2) = 0.;
262 }
263 }
264 }
265
266
267 //***************************
268 // Condition Paroi_defilante
269 //***************************
270
271 else if (sub_type(Dirichlet_paroi_defilante,la_cl.valeur()) )
272 {
273
274 const Dirichlet_paroi_defilante& cl_diri = ref_cast(Dirichlet_paroi_defilante,la_cl.valeur());
275 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
276 ndeb = le_bord.num_premiere_face();
277 nfin = ndeb + le_bord.nb_faces();
278 DoubleTab vitesse_imposee_face_bord(le_bord.nb_faces(),dimension);
279 for (int face=ndeb; face<nfin; face++)
280 for (int k=0; k<dimension; k++)
281 vitesse_imposee_face_bord(face-ndeb,k) = cl_diri.val_imp(face-ndeb,k);
282
283 // Cas dimension 2
284 if (dimension == 2 )
285
286 // On calcule au centre des mailles de bord
287 // la vitesse parallele a l'axe de la face de bord
288 //
289 // On calcule la norme de cette vitesse
290
291 for (int num_face=ndeb; num_face<nfin; num_face++)
292 {
293 //ori vaut 0,1 ou 2 (0=> x=Cte, 1=> y=Cte ...)
294 ori = orientation(num_face);
295
296 int rang = num_face-ndeb;
297
298 // face_voisin contient les deux elements voisins d'une face
299 if ( (elem = face_voisins(num_face,0)) != -1)
300 {
301 norm_v=norm_2D_vit(vit,elem,ori,domaine_VDF,vitesse_imposee_face_bord(rang,0),
302 vitesse_imposee_face_bord(rang,1),val);
303 signe = -1.; // on est a la paroi sup
304 }
305 else
306 {
307 elem = face_voisins(num_face,1);
308 norm_v=norm_2D_vit(vit,elem,ori,domaine_VDF,vitesse_imposee_face_bord(rang,0),
309 vitesse_imposee_face_bord(rang,1),val);
310 signe = 1.; // on est a la paroi inf
311 }
312
313 // dist correspondt a la distance entre le centre de la cellule et le bord
314 if (axi)
315 dist = domaine_VDF.dist_norm_bord_axi(num_face);
316 else
317 dist = domaine_VDF.dist_norm_bord(num_face);
318
319 // evaluation de la viscosite
320 if (l_unif)
321 d_visco = visco;
322 else
323 d_visco = tab_visco[elem];
324
325
326 // Calcul de u* et des grandeurs turbulentes:
327 calculer_local(d_visco,tab_nu_t,tab_k,norm_v,dist,elem,num_face);
328
329 // Calcul de la contrainte tangentielle a la paroi:
330 Cisaillement_paroi_(num_face,1-ori) = signe*tab_u_star(num_face)*tab_u_star(num_face)*val;
331 Cisaillement_paroi_(num_face,ori) = 0.;
332 }
333
334 // Cas dimension 3
335 else if (dimension == 3)
336
337 // On calcule au centre des mailles de bord
338 // la vitesse dans le plan parallele a celui de la face de bord
339 // On calcule la norme de cette vitesse
340
341 for (int num_face=ndeb; num_face<nfin; num_face++)
342 {
343
344 //ori vaut 0,1 ou 2 (0=> x=Cte, 1=> y=Cte ...)
345 ori = orientation(num_face);
346
347 int rang = num_face-ndeb;
348
349 // face_voisin contient les deux elements voisins d'une face
350 if ( (elem = face_voisins(num_face,0)) != -1)
351 {
352 norm_v=norm_3D_vit(vit,elem,ori,domaine_VDF,vitesse_imposee_face_bord(rang,0),
353 vitesse_imposee_face_bord(rang,1),
354 vitesse_imposee_face_bord(rang,2),val1,val2);
355 signe = -1.; // on est a la paroi sup
356 }
357 else
358 {
359 elem = face_voisins(num_face,1);
360 norm_v=norm_3D_vit(vit,elem,ori,domaine_VDF,vitesse_imposee_face_bord(rang,0),
361 vitesse_imposee_face_bord(rang,1),
362 vitesse_imposee_face_bord(rang,2),val1,val2);
363 signe = 1.; // on est a la paroi inf
364 }
365
366 // dist correspondt a la distance entre le centre de la cellule et le bord
367 if (axi)
368 dist = domaine_VDF.dist_norm_bord_axi(num_face);
369 else
370 dist = domaine_VDF.dist_norm_bord(num_face);
371
372 // evaluation de la viscosite
373 if (l_unif)
374 d_visco = visco;
375 else
376 d_visco = tab_visco[elem];
377
378 // Calcul de u* et des grandeurs turbulentes:
379 // a partir de u+d+
380 calculer_local(d_visco,tab_nu_t,tab_k,norm_v,dist,elem,num_face);
381
382 // Calcul des deux composantes de la contrainte tangentielle:
383 double vit_frot = tab_u_star(num_face)*tab_u_star(num_face);
384
385 if (ori == 0)
386 {
387 Cisaillement_paroi_(num_face,1) = signe*vit_frot*val1;
388 Cisaillement_paroi_(num_face,2) = signe*vit_frot*val2;
389 Cisaillement_paroi_(num_face,0) = 0.;
390 }
391 else if (ori == 1)
392 {
393 Cisaillement_paroi_(num_face,0) = signe*vit_frot*val1;
394 Cisaillement_paroi_(num_face,2) = signe*vit_frot*val2;
395 Cisaillement_paroi_(num_face,1) = 0.;
396 }
397 else
398 {
399 Cisaillement_paroi_(num_face,0) = signe*vit_frot*val1;
400 Cisaillement_paroi_(num_face,1) = signe*vit_frot*val2;
401 Cisaillement_paroi_(num_face,2) = 0.;
402 }
403 }
404 }
405 }
406 Cisaillement_paroi_.echange_espace_virtuel();
407 tab_nu_t.echange_espace_virtuel();
409 return 1;
410}
411
413 DoubleTab& tab_nu_t,DoubleTab& tab_k,double norm_vit,
414 double dist,int elem,int num_face)
415{
416 // C est la hauteur de la premiere maille en int qui doit etre testee ->> 2.*dist
417 double up_lim = d_visco*Y0*Y0/(4.*dist);
418
419 if (norm_vit <= up_lim)
420 {
421 calculer_u_star_sous_couche_visq(norm_vit,d_visco,dist,num_face);
422 calculer_sous_couche_visq(tab_nu_t,tab_k,elem);
423 if (impr==1) Cerr << "Domaine lineaire" << finl;
424 }
425 else
426 {
427 calculer_u_star_couche_puissance(norm_vit,d_visco,dist,num_face);
428 calculer_couche_puissance(tab_nu_t,tab_k,dist,elem,num_face);
429 if (impr==1) Cerr << "Domaine en puissance" << finl;
430 }
431 return 1;
432}
433
435 double dist, int face)
436{
437 double part1, part2 ;
438 static double Apuiss = pow(A,(1+B)/(1-B));
439
440 part1= ( (B+1) * pow(d_visco,B) * norm_vit ) / (A *pow(2.*dist,B) );
441 part2= ( (1-B) * pow(d_visco,B+1) * Apuiss ) / (2 * pow(2.*dist,B+1) ) ;
442
443 tab_u_star_(face)= pow(part1+part2, 1/(B+1) );
444
445 return 1;
446}
447
448
449int Paroi_loi_WW_hyd_VDF::calculer_couche_puissance(DoubleTab& nu_t,DoubleTab& tab_k,
450 double dist,int elem,int face)
451{
452 // nu_t = Cmu*k*k/eps
453 //
454 // 2 3
455 // En utilisant k = u*/sqrt(Cmu_) et eps = u* / Kd
456 //
457 // on calcule nu_t en fonction de u*
458
459 double u_star = tab_u_star(face);
460
461 tab_k(elem) = u_star*u_star/sqrt(Cmu_);
462 nu_t(elem) = u_star*Kappa_*dist ;
463
464 return 1;
465}
466
467
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
int orientation(int) const override
inline DoubleVect& Domaine_VDF::porosite_face() {
double dist_norm_bord(int num_face) const override
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
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
static int dimension
Definition Objet_U.h:99
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_flag(const char *keyword, const bool *value)
Register a boolean flag whose mere presence switches it to true.
Definition Param.cpp:474
int preparer_calcul_hyd(DoubleTab &) override
int calculer_couche_puissance(DoubleTab &, DoubleTab &, double, int, int)
int init_lois_paroi_hydraulique() override
int calculer_u_star_couche_puissance(double, double, double, int)
int calculer_hyd(DoubleTab &) override
void set_param(Param &param) const override
int calculer_local(double, DoubleTab &, DoubleTab &, double, double, int, int)
CLASS: Paroi_std_hyd_VDF.
int calculer_u_star_sous_couche_visq(double, double, double, int)
int calculer_sous_couche_visq(DoubleTab &, double, int, double, int)
void set_param(Param &param) const override
Classe de base des flux de sortie.
Definition Sortie.h:52
_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_u_star() const