16#include <Paroi_loi_WW_hyd_VEF.h>
17#include <Fluide_base.h>
18#include <Champ_Uniforme.h>
19#include <Dirichlet_paroi_fixe.h>
20#include <Dirichlet_paroi_defilante.h>
22#include <Modele_turbulence_hyd_base.h>
23#include <Equation_base.h>
37 Cerr<<
"Reading of data for a "<<
que_suis_je()<<
" wall law"<<finl;
40 param.lire_avec_accolades_depuis(is);
59 Cmu_ = mon_modele_turb_hyd->get_Cmu();
76 Cerr <<
" Paroi_loi_WW_hyd_VEF::calculer_hyd(DoubleTab& tab_k_eps) " << finl;
77 Cerr <<
"on ne doit pas entrer dans cette methode" << finl;
78 Cerr <<
" car elle est definie uniquement pour la LES " << finl ;
88 const Equation_base& eqn_hydr = mon_modele_turb_hyd->equation();
92 const DoubleTab& tab_visco = ch_visco_cin.
valeurs();
97 visco = std::max(tab_visco(0,0),DMINFLOAT);
107 Cerr <<
"In Paroi_loi_WW_hyd_VEF::calculer_hyd : visco = " << tab_visco.
local_min_vect() <<
" <= 0 ? " << finl;
114 double dist_G,dist_som;
116 double val,val1,val2,val3;
121 for (
int n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
128 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
133 const IntTab& elem_faces = domaine_VEF.
elem_faces();
138 for (
int num_face=ndeb; num_face<nfin; num_face++)
140 int elem = face_voisins(num_face,0);
141 num[0]=elem_faces(elem,0);
142 num[1]=elem_faces(elem,1);
144 if (num[0]==num_face) num[0]=elem_faces(elem,2);
145 else if (num[1]==num_face) num[1]=elem_faces(elem,2);
147 norm_v=norm_2D_vit(vit,num[0],num[1],num_face,domaine_VEF,val,val1,val2);
149 dist_G = distance_2D(num_face,elem,domaine_VEF,signe);
156 d_visco = tab_visco[elem];
158 calculer_local(d_visco,tab_nu_t,tab_k,norm_v,dist_G,dist_som,elem,num_face);
160 Cerr <<
"ATTENTION!!! MODIFS FAITE POUR 3D ETENDUE A 2D MAIS NON VERIFIEE POUR 2D!!!!" << finl;
202 for (
int num_face=ndeb; num_face<nfin; num_face++)
204 int elem = face_voisins(num_face,0);
205 num[0] = elem_faces(elem,0);
206 num[1] = elem_faces(elem,1);
207 num[2] = elem_faces(elem,2);
208 if (num[0]==num_face) num[0]=elem_faces(elem,3);
209 else if (num[1]==num_face) num[1]=elem_faces(elem,3);
210 else if (num[2]==num_face) num[2]=elem_faces(elem,3);
212 norm_v=norm_3D_vit(vit, num_face, num[0], num[1], num[2], domaine_VEF, val1, val2, val3);
214 dist_G = distance_3D(num_face,elem,domaine_VEF,signe);
221 d_visco = tab_visco[elem];
225 calculer_local(d_visco,tab_nu_t,tab_k,norm_v,dist_G,dist_som,elem,num_face);
278 Cerr <<
"pour l instant Werner et Wengle n'est pas code pour la condition de paroi defilante!!" << finl;
290 DoubleTab& tab_nu_t,DoubleTab& tab_k,
double norm_vit,
291 double dist_G,
double dist_som,
int elem,
int num_face)
294 double up_lim = d_visco*
Y0*
Y0/(2.*dist_som);
296 if (norm_vit <= up_lim)
303 if (
impr==1) Cerr <<
"Domaine lineaire" << finl;
309 if (
impr==1) Cerr <<
"Domaine en puissance" << finl;
316 double d_visco,
double dist,
328 double dist,
int face)
330 double part1, part2 ;
331 static double Apuiss = pow(
A,(1+
B)/(1-
B));
333 part1= ( (
B+1) * pow(d_visco,
B) * norm_vit ) / (
A *pow(2.*dist,
B) );
334 part2= ( (1-
B) * pow(d_visco,
B+1) * Apuiss ) / (2 * pow(2.*dist,
B+1) ) ;
343 double dist,
int elem,
int face)
354 tab_k(elem) = u_star*u_star/sqrt(
Cmu_);
355 nu_t(elem) = u_star*
Kappa_*dist ;
368double norm_2D_vit(
const DoubleTab& vit,
int num1,
int num2,
int fac,
const Domaine_VEF& domaine,
double& u,
double& val1,
double& val2)
370 const DoubleTab& face_normale = domaine.face_normales();
373 r[0]=face_normale(fac,0);
374 r[1]=face_normale(fac,1);
376 double v1=(vit(num1,0)+vit(num2,0))/3.;
377 double v2=(vit(num1,1)+vit(num2,1))/3.;
378 double v = sqrt( carre(v1) + carre(v2)
379 - carre(v1*r[0]+v2*r[1]) );
381 val1 = v1/(v+DMINFLOAT);
382 val2 = v2/(v+DMINFLOAT);
391double norm_2D_vit3(
const DoubleTab& vit,
int num1,
int num2,
int num3,
int fac,
const Domaine_VEF& domaine,
double& u,
double& val1,
double& val2)
393 const DoubleTab& face_normale = domaine.face_normales();
396 r[0]=face_normale(fac,0);
397 r[1]=face_normale(fac,1);
399 double v1=(vit(num1,0)+vit(num2,0)+vit(num3,0))/3.;
400 double v2=(vit(num1,1)+vit(num2,1)+vit(num3,1))/3.;
401 double v = sqrt( carre(v1) + carre(v2)
402 - carre(v1*r[0]+v2*r[1]) );
404 val1 = v1/(v+DMINFLOAT);
405 val2 = v2/(v+DMINFLOAT);
414double norm_3D_vit(
const DoubleTab& vit,
int fac,
int num1,
int num2,
int num3,
416 double& val1,
double& val2,
double& val3)
418 const DoubleTab& face_normale = domaine.face_normales();
421 r[0]=face_normale(fac,0);
422 r[1]=face_normale(fac,1);
423 r[2]=face_normale(fac,2);
425 double v1=(vit(num1,0)+vit(num2,0)+vit(num3,0))/4.;
426 double v2=(vit(num1,1)+vit(num2,1)+vit(num3,1))/4.;
427 double v3=(vit(num1,2)+vit(num2,2)+vit(num3,2))/4.;
428 double norm_vit = sqrt( carre(v1) + carre(v2) + carre(v3)
429 - carre(v1*r[0]+v2*r[1]+v3*r[2]) );
430 val1 = v1/(norm_vit+DMINFLOAT);
431 val2 = v2/(norm_vit+DMINFLOAT);
432 val3 = v3/(norm_vit+DMINFLOAT);
437double norm_3D_vit4(
const DoubleTab& vit,
int fac,
int num1,
int num2,
int num3,
int num4,
439 double& val1,
double& val2,
double& val3)
441 const DoubleTab& face_normale = domaine.face_normales();
444 r[0]=face_normale(fac,0);
445 r[1]=face_normale(fac,1);
446 r[2]=face_normale(fac,2);
448 double v1=(vit(num1,0)+vit(num2,0)+vit(num3,0)+vit(num4,0))/4.;
449 double v2=(vit(num1,1)+vit(num2,1)+vit(num3,1)+vit(num4,1))/4.;
450 double v3=(vit(num1,2)+vit(num2,2)+vit(num3,2)+vit(num4,2))/4.;
451 double norm_vit = sqrt( carre(v1) + carre(v2) + carre(v3)
452 - carre(v1*r[0]+v2*r[1]+v3*r[2]) );
453 val1 = v1/(norm_vit+DMINFLOAT);
454 val2 = v2/(norm_vit+DMINFLOAT);
455 val3 = v3/(norm_vit+DMINFLOAT);
460double distance_2D(
int fac,
int elem,
const Domaine_VEF& domaine,
double& signe)
462 const DoubleTab& xp = domaine.xp();
463 const DoubleTab& xv = domaine.xv();
464 const DoubleTab& face_normale = domaine.face_normales();
467 r[0]=face_normale(fac,0);
468 r[1]=face_normale(fac,1);
471 double x1=xp(elem,0);
472 double y1=xp(elem,1);
476 signe = x2*r[0]+y2*r[1];
477 signe /= std::fabs(signe);
479 return std::fabs(r[0]*(x1-x0)+r[1]*(y1-y0))/norme_array(r);
482double distance_3D(
int fac,
int elem,
const Domaine_VEF& domaine,
double& signe)
484 const DoubleTab& xp = domaine.xp();
485 const DoubleTab& xv = domaine.xv();
486 const DoubleTab& face_normale = domaine.face_normales();
489 r[0]=face_normale(fac,0);
490 r[1]=face_normale(fac,1);
491 r[2]=face_normale(fac,2);
495 double x1=xp(elem,0);
496 double y1=xp(elem,1);
497 double z1=xp(elem,2);
499 return std::fabs(r[0]*(x1-x0)+r[1]*(y1-y0)+r[2]*(z1-z0))/norme_array(r);
502double distance_2D_som(
int fac,
int elem,
const Domaine_VEF& domaine )
504 const Domaine& domaine_geom = domaine.domaine();
506 const IntTab& elem_faces = domaine.elem_faces();
508 const Domaine& domaineg = domaine.domaine();
510 const IntTab& som_elem=domaine_geom.
les_elems();
513 const DoubleTab& xv = domaine.xv();
514 const DoubleTab& face_normale = domaine.face_normales();
519 for (i=0; i<nfac; i++)
521 num0 = elem_faces(elem,i);
525 sommet = som_elem(elem,i);
528 r[0]=face_normale(fac,0);
529 r[1]=face_normale(fac,1);
532 double x1=coord(sommet,0);
533 double y1=coord(sommet,1);
535 return std::fabs(r[0]*(x1-x0)+r[1]*(y1-y0))/norme_array(r);
538double distance_3D_som(
int fac,
int elem,
const Domaine_VEF& domaine)
540 const Domaine& domaine_geom = domaine.domaine();
541 const IntTab& face_sommets = domaine.face_sommets();
542 const IntTab& elem_faces = domaine.elem_faces();
544 const Domaine& domaineg = domaine.domaine();
547 const DoubleTab& xv = domaine.xv();
548 const DoubleTab& face_normale = domaine.face_normales();
550 int i,j=0,num0,sommet=-1,k;
551 IntVect num(3),som0(3),som1(3);
553 for (i=0; i<nfac; i++)
555 num0 = elem_faces(elem,i);
564 som0[0] = face_sommets(num[0],0);
565 som0[1] = face_sommets(num[0],1);
566 som0[2] = face_sommets(num[0],2);
568 som1[0] = face_sommets(num[1],0);
569 som1[1] = face_sommets(num[1],1);
570 som1[2] = face_sommets(num[1],2);
576 if (face_sommets(num[1],i) == som0[j])
580 if (face_sommets(num[2],k) == som0[j])
595 r[0]=face_normale(fac,0);
596 r[1]=face_normale(fac,1);
597 r[2]=face_normale(fac,2);
601 double x1=coord(sommet,0);
602 double y1=coord(sommet,1);
603 double z1=coord(sommet,2);
605 return std::fabs(r[0]*(x1-x0)+r[1]*(y1-y0)+r[2]*(z1-z0))/norme_array(r);
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Cond_lim Classe generique servant a representer n'importe quelle classe
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.
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
const DoubleTab_t & coord_sommets() const
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
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Class defining operators and methods for all reading operation in an input flow (file,...
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual const Milieu_base & milieu() const =0
virtual const Champ_Inc_base & inconnue() const =0
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
const Champ_Don_base & viscosite_cinematique() const
int num_premiere_face() const
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Helper class to factorize the readOn method of Objet_U classes.
void ajouter_flag(const char *keyword, const bool *value)
Register a boolean flag whose mere presence switches it to true.
int calculer_u_star_sous_couche_visq(double, double, double, int)
int init_lois_paroi_hydraulique() override
int calculer_couche_puissance(DoubleTab &, DoubleTab &, double, int, int)
int calculer_hyd(DoubleTab &) override
int calculer_local(double, DoubleTab &, DoubleTab &, double, double, double, int, int)
void set_param(Param ¶m) const override
int preparer_calcul_hyd(DoubleTab &)
int calculer_u_star_couche_puissance(double, double, double, int)
void set_param(Param ¶m) const override
Classe de base des flux de sortie.
_TYPE_ local_min_vect(Mp_vect_options opt=VECT_REAL_ITEMS) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
const DoubleVect & tab_u_star() const
DoubleTab Cisaillement_paroi_