16#include <Ch_front_Vortex.h>
18#include <LecFicDiffuse.h>
19#include <Interprete.h>
20#include <Domaine_VF.h>
22#include <EcrFicCollecte.h>
43 os << tab.
size() <<
" ";
44 for(
int i=0; i<tab.
size(); i++)
61 Cerr <<
" Vortex Boundary condition requests 3D problem " << finl;
90 srand((
int)time (
nullptr));
98 Nom fichier =
"vortex.sauv";
101 Cerr <<
"Saving vortices in " << fichier << finl;
103 fic.
setf(ios::scientific);
105 int nbvortex =
xvort.size();
107 fic <<
temps << finl;
108 fic << nbvortex << finl;
110 for (
int i=0; i<nbvortex; i++)
121 Cerr <<
" Ch_front_Vortex::reprendre_vortex" << finl;
123 Nom fichier =
"vortex.sauv";
127 Cerr <<
"Resumption of vortices in " << fichier << finl;
129 fic.
setf(ios::scientific);
133 Cerr <<
"Unable to open file " << fichier << finl;
143 if(!(std::fabs(
temps-tps)/(std::fabs(tps)+1.e-24)<1.e-6))
145 Cerr <<
" time : " << tps <<
" in " << fichier <<
" does not match the time of resumed " <<
temps << finl;
149 Cerr <<
" resumed " << nbvortex <<
" vortex at time " <<
temps << finl;
151 for (
int i=0; i<nbvortex; i++)
157 Cerr <<
" resumed made " << finl;
167 Domaine& domaine=mon_domaine.valeur();
169 const Frontiere& frontiere=fr_dis.
frontiere();
170 const int nb_faces=frontiere.
nb_faces();
172 const int nfin=ndeb+nb_faces;
173 const Faces& faces=frontiere.
faces();
176 const DoubleTab& xv=zvf.
xv();
188 u_moy.resize(nb_faces);
189 dudy.resize(nb_faces);
191 eps.resize(nb_faces);
194 for(
int face=ndeb; face<nfin; face++)
196 Wk(face) = 2.*drand48()-1.;
221 for(
int face=ndeb; face<nfin; face++)
223 for(
int kk=0; kk<nbsf; kk++)
225 x=domaine.coord(faces.
sommet(face,kk),0);
226 y=domaine.coord(faces.
sommet(face,kk),1);
227 z=domaine.coord(faces.
sommet(face,kk),2);
257 if(!est_egal(y_ymin,y_ymax))
263 Ox=0.5*(x_ymax+x_ymin);
264 Oy=0.5*(y_ymax+y_ymin);
265 Oz=0.5*(z_ymax+z_ymin);
273 Ox=0.5*(x_xmax+x_xmin);
274 Oy=0.5*(y_xmax+y_xmin);
275 Oz=0.5*(z_xmax+z_xmin);
278 R=0.5*sqrt(dx*dx+dy*dy+dz*dz);
282 Cerr <<
" Coordinates associated with the boundary : " <<
Ox <<
" " <<
Oy <<
" " <<
Oz << finl;
283 Cerr <<
" Radius computed : " <<
R << finl;
286 else if(
geom==
"channel")
327 if( (est_egal(
nx,0.)) && (est_egal(
ny,0.)) )
355 double d,dplus,Reytau;
358 double tmp=15*15*15*15;
359 for(
int face=ndeb; face<nfin; face++)
371 d =
R - sqrt(dx*dx+dy*dy+dz*dz) ;
375 d =
R - std::fabs(y) ;
380 Cerr <<
" the computation of a zero or negative distance is prejudicial for the rest of the calculation" << finl;
381 Cerr <<
" Problem certainly related to the calculation of the size of domain or origin related to the bondary" << finl;
394 u_moy(face) =
utau*((1./kappa)*log(dplus)+beta) ;
406 k(face) =
utau*
utau * ( 0.07*dplus*dplus*exp(-dplus/8)+4.5*(1.-exp(-dplus/20.))/(1.+4.*dplus/Reytau) ) ;
416 double sigma_moy = 0.;
418 for(
int face=ndeb; face<nfin; face++)
424 sigma_moy += sqrt(sx*sx+sy*sy+sz*sz) * pow(
k(face),1.5) /
eps(face);
427 sigma_moy *= pow(C_mu,0.75);
433 Cerr <<
"nb_vortex " <<
nb_vortex << finl;
451 double dt_vortex,dt_min=1.e6;
453 for (
int i=0; i<nb_faces; i++)
455 dt_vortex=5.*C_mu*pow(
k(i),3./2.)/(
eps(i)*
u_moy(i));
456 if(dt_vortex<dt_min) dt_min=dt_vortex;
459 Cerr <<
" DT_MIN VORTEX " << dt_min << finl;
488 int face = (int)(nb_faces*drand48());
492 tvort(i)=drand48()*5.*C_mu*pow(
k(face),3./2.)/(
eps(face)*
u_moy(face));
493 if (drand48()<0.5)
svort(i)=-1.;
509 double& vv,
double& ww)
511 double norme2 = dx*dx + dy*dy + dz*dz ;
513 if(norme2<(4.*asigma) && norme2>1.e-8)
515 double e1 = exp(-norme2/(2.*asigma*asigma));
516 double f = (1.-e1) * agamma * e1 / (2.* M_PI * norme2 );
529 const Frontiere& frontiere=fr_dis.
frontiere();
530 const int nb_faces=frontiere.
nb_faces();
532 const int nfin=ndeb+nb_faces;
536 const DoubleTab& xv=zvf.
xv();
542 double xvort_mir,yvort_mir,zvort_mir;
543 double xvort_per,yvort_per,zvort_per;
561 alpha = 4.*sqrt(M_PI*
surf/(3.*
nb_vortex*(2.*log(3.)-3.*log(2.))));
572 for(
int j=ndeb; j<nfin; j++)
574 dist2=(xv(j,0)-x)*(xv(j,0)-x)+(xv(j,1)-yter)*(xv(j,1)-yter)+(xv(j,2)-z)*(xv(j,2)-z);
583 sigma(i) = pow(C_mu,0.75) * pow(
k(face),1.5) /
eps(face);
591 for(
int face=ndeb; face<nfin; face++)
623 xp = x *
R / (sqrt(x*x+yter*yter+z*z)) ;
624 yp = yter *
R / (sqrt(x*x+yter*yter+z*z)) ;
625 zp = z *
R / (sqrt(x*x+yter*yter+z*z)) ;
635 xvort_mir = 2. * xp - (
xvort(i)-
Ox);
636 yvort_mir = 2. * yp - (
yvort(i)-
Oy);
637 zvort_mir = 2. * zp - (
zvort(i)-
Oz);
640 dy = yvort_mir - yter;
656 else zvort_per = 2.*
R + (
zvort(i)-
Oz);
659 dy = yvort_per - yter;
679 if(
geom==
"channel") vp =
w(face);
682 double norme = sqrt(x*x+yter*yter+z*z);
683 double costheta = ( x*
t1x + yter*
t1y + z*
t1z ) / norme;
684 double sintheta = ( x*
t2x + yter*
t2y + z*
t2z ) / norme;
685 vp = costheta*
v(face) + sintheta*
w(face) ;
692 double x1,x2,ybis,Wkp1,dW;
696 x1 = 2. * drand48() - 1. ;
697 x2 = 2. * drand48() - 1. ;
698 ybis = x1 * x1 + x2 * x2;
700 while ( ybis >= 1. );
702 Wkp1 = x1 * sqrt( (-1.0 * log( ybis ) ) / ybis );
703 dW = Wkp1 -
Wk(face) ;
729 double T=
k(face)/
eps(face);
731 double dt = tps -
temps;
735 up += dt*( -(C1/(2.*T))*up + (C2-1.)*
dudy(face)*vp + sqrt(C0*
eps(face))*dW/dt );
751 les_val(face,0) =
u(face)*
nx +
v(face)*
t1x +
w(face)*
t2x ;
752 les_val(face,1) =
u(face)*
ny +
v(face)*
t1y +
w(face)*
t2y ;
753 les_val(face,2) =
u(face)*
nz +
v(face)*
t1z +
w(face)*
t2z ;
773 double dt = tps -
temps;
790 if( (
geom==
"circle") && ((x*x+yter*yter+z*z)>=(
R*
R)) )
794 else if( (
geom==
"channel") && (std::fabs(yter)>
R) )
798 else if( (
geom==
"channel") && (z>
R) )
804 else if( (
geom==
"channel") && (z<-
R) )
839 int face = (int)(nb_faces*drand48());
844 if (drand48()<0.5)
svort(i)=-1.;
847 Cerr <<
" Time " <<
temps <<
" Vortex " << i << finl;
848 Cerr <<
" Face " << face <<
" " <<
xvort(i) <<
" " <<
yvort(i) <<
" " <<
zvort(i) << finl;
849 Cerr <<
" " <<
tvort(i) <<
" " <<
svort(i) << finl;
classe Ch_fr_Vortex Classe derivee de Champ_front_var qui represente les
~Ch_front_Vortex() override
void deplacement_vortex(double, double, double, double, double, double &, double &)
int initialiser(double temps, const Champ_Inc_base &inco) override
Initialisation en debut de calcul.
void sauvegarder_vortex()
void mettre_a_jour(double) override
NE FAIT RIEN, a surcharger.
Champ_front_base & affecter_(const Champ_front_base &ch) override
Renvoie l'objet upcaste en Champ_front_base&.
virtual const Frontiere_dis_base & frontiere_dis() const
Renvoie la frontiere discretisee associee au champ.
virtual const Domaine_dis_base & domaine_dis() const
virtual DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ.
classe Champ_front_var_instationnaire Classe derivee de Champ_front_var qui represente les champs aux
int initialiser(double temps, const Champ_Inc_base &inco) override
Initialise le temps courant et Gpoint.
virtual double face_normales(int face, int comp) const
double xv(int num_face, int k) const
Fichier en lecture Cette classe est a la classe C++ ifstream ce que la classe Entree est a la.
Ecriture dans un fichier Cette classe implemente les operateurs et les methodes virtuelles de la clas...
void setf(IOS_FORMAT code)
Class defining operators and methods for all reading operation in an input flow (file,...
int_t sommet(int_t, int) const
Renvoie le numero du j-ieme sommet de la i-ieme face.
int nb_som_faces() const
Renvoie le nombre de sommet par face.
virtual void fixer_nb_comp(int i)
Fixe le nombre de composantes du champ.
int_t num_premiere_face() const
int_t nb_faces() const
Renvoie le nombre de faces de la frontiere.
const Faces_t & faces() const
classe Frontiere_dis_base Classe representant une frontiere discretisee.
const Frontiere & frontiere() const
Renvoie la frontiere geometrique associee.
static Objet_U & objet(const Nom &)
Voir Interprete_bloc::objet_global() BM: la classe Interprete n'est pas le meilleur endroit pour cett...
class Nom Une chaine de caractere pour nommer les objets de TRUST
Nom nom_me(int, const char *prefix=0, int without_padding=0) const
Insere _prefix000n (n=me() ou nproc()) dans un nom de fichier (par ex:toto.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static int me()
renvoie mon rang dans le groupe de communication courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
void setf(IOS_FORMAT code) override
Classe de base des flux de sortie.