TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Ch_front_Vortex.cpp
1/****************************************************************************
2* Copyright (c) 2026, 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 <Ch_front_Vortex.h>
17#include <Domaine.h>
18#include <LecFicDiffuse.h>
19#include <Interprete.h>
20#include <Domaine_VF.h>
21#include <time.h>
22#include <EcrFicCollecte.h>
23
24Implemente_instanciable_sans_destructeur(Ch_front_Vortex,"Champ_front_Vortex",Champ_front_var_instationnaire);
25
26
31
32/*! @brief Imprime le champ sur flot de sortie.
33 *
34 * Imprime la taille du champ et la valeur (constante) sur
35 * la frontiere.
36 *
37 * @param (Sortie& os) un flot de sortie
38 * @return (Sortie&) le flot de sortie modifie
39 */
41{
42 const DoubleTab& tab=valeurs();
43 os << tab.size() << " ";
44 for(int i=0; i<tab.size(); i++)
45 os << tab(0,i);
46 return os;
47}
48
49/*! @brief Lit le champ a partir d'un flot d'entree.
50 *
51 * Format:
52 * Champ_front_Vortex nb_compo vrel_1 ... [vrel_i]
53 *
54 * @param (Entree& is) un flot d'entree
55 * @return (Entree& is) le flot d'entree modifie
56 */
58{
59 if(dimension!=3)
60 {
61 Cerr << " Vortex Boundary condition requests 3D problem " << finl;
62 exit();
63 }
64
66
67 Nom nom;
68 is >> nom >> geom >> nu >> utau;
69
70 mon_domaine = ref_cast(Domaine, Interprete::objet(nom));
71
72 return is;
73}
74
75/*! @brief Renvoie l'objet upcaste en Champ_front_base&
76 *
77 * @param (Champ_front_base& ch)
78 * @return (Champ_front_base&) (*this) upcaste en Champ_front_base&
79 */
84
85
87{
88 if (first_rand == 1)
89 {
90 srand((int)time (nullptr));
91 first_rand = 0;
92 }
93 return (rand ());
94}
95
97{
98 Nom fichier = "vortex.sauv";
99 if(la_frontiere_dis)
100 {
101 Cerr << "Saving vortices in " << fichier << finl;
102 EcrFicCollecte fic(fichier);
103 fic.setf(ios::scientific);
104
105 int nbvortex = xvort.size();
106
107 fic << temps << finl;
108 fic << nbvortex << finl;
109
110 for (int i=0; i<nbvortex; i++)
111 {
112 fic << xvort(i) << " " << yvort(i) << " " << zvort(i) << " " << tvort(i) << " " ;
113 fic << svort(i) << " " << fvort[i] << " " << gamma(i) << " " << sigma(i) << finl;
114 }
115 fic.close();
116 }
117}
118
120{
121 Cerr << " Ch_front_Vortex::reprendre_vortex" << finl;
122
123 Nom fichier = "vortex.sauv";
124 if (nproc()>1) fichier=fichier.nom_me(me());
125 if(la_frontiere_dis)
126 {
127 Cerr << "Resumption of vortices in " << fichier << finl;
128 EFichier fic(fichier);
129 fic.setf(ios::scientific);
130
131 if(fic.fail())
132 {
133 Cerr << "Unable to open file " << fichier << finl;
134 exit();
135 }
136
137 double tps;
138 int nbvortex;
139
140 fic >> tps;
141 fic >> nbvortex;
142
143 if(!(std::fabs(temps-tps)/(std::fabs(tps)+1.e-24)<1.e-6))
144 {
145 Cerr << " time : " << tps << " in " << fichier << " does not match the time of resumed " << temps << finl;
146 exit();
147 }
148
149 Cerr << " resumed " << nbvortex << " vortex at time " << temps << finl;
150
151 for (int i=0; i<nbvortex; i++)
152 {
153 fic >> xvort(i) >> yvort(i) >> zvort(i) >> tvort(i);
154 fic >> svort(i) >> fvort[i] >> gamma(i) >> sigma(i);
155 }
156
157 Cerr << " resumed made " << finl;
158 }
159}
160
161
162int Ch_front_Vortex::initialiser(double un_temps, const Champ_Inc_base& inco)
163{
165 return 0;
166
167 Domaine& domaine=mon_domaine.valeur();
168 const Frontiere_dis_base& fr_dis=frontiere_dis();
169 const Frontiere& frontiere=fr_dis.frontiere();
170 const int nb_faces=frontiere.nb_faces();
171 const int ndeb=frontiere.num_premiere_face();
172 const int nfin=ndeb+nb_faces;
173 const Faces& faces=frontiere.faces();
174 int nbsf=faces.nb_som_faces();
175 const Domaine_VF& zvf = ref_cast(Domaine_VF, domaine_dis());
176 const DoubleTab& xv=zvf.xv();
177
178 double x,y,z;
179 double dx,dy,dz;
180 double norme;
181
182 double C_mu = 0.09;
183
184
185 u.resize(nb_faces);
186 v.resize(nb_faces);
187 w.resize(nb_faces);
188 u_moy.resize(nb_faces);
189 dudy.resize(nb_faces);
190 k.resize(nb_faces);
191 eps.resize(nb_faces);
192 Wk.resize(nb_faces);
193
194 for(int face=ndeb; face<nfin; face++)
195 {
196 Wk(face) = 2.*drand48()-1.;
197 }
198
199
200 /////////////////////////////////////////////////////////
201 // caracteristiques geometriques associees a la frontiere
202 /////////////////////////////////////////////////////////
203
204 if(geom=="circle")
205 {
206
207 double x_xmin=1.e6;
208 double x_xmax=-1.e6;
209 double y_xmin=1.e6;
210 double y_xmax=-1.e6;
211 double z_xmin=1.e6;
212 double z_xmax=-1.e6;
213 double x_ymin=1.e6;
214 double x_ymax=-1.e6;
215 double y_ymin=1.e6;
216 double y_ymax=-1.e6;
217 double z_ymin=1.e6;
218 double z_ymax=-1.e6;
219
220
221 for(int face=ndeb; face<nfin; face++)
222 {
223 for(int kk=0; kk<nbsf; kk++)
224 {
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);
228
229 if(y<y_ymin)
230 {
231 y_ymin=y;
232 x_ymin=x;
233 z_ymin=z;
234 }
235 if(y>y_ymax)
236 {
237 y_ymax=y;
238 x_ymax=x;
239 z_ymax=z;
240 }
241
242 if(x<x_xmin)
243 {
244 x_xmin=x;
245 y_xmin=y;
246 z_xmin=z;
247 }
248 if(x>x_xmax)
249 {
250 x_xmax=x;
251 y_xmax=y;
252 z_xmax=z;
253 }
254 }
255 }
256
257 if(!est_egal(y_ymin,y_ymax))
258 {
259 dx=x_ymax-x_ymin;
260 dy=y_ymax-y_ymin;
261 dz=z_ymax-z_ymin;
262
263 Ox=0.5*(x_ymax+x_ymin);
264 Oy=0.5*(y_ymax+y_ymin);
265 Oz=0.5*(z_ymax+z_ymin);
266 }
267 else
268 {
269 dx=x_xmax-x_xmin;
270 dy=y_xmax-y_xmin;
271 dz=z_xmax-z_xmin;
272
273 Ox=0.5*(x_xmax+x_xmin);
274 Oy=0.5*(y_xmax+y_xmin);
275 Oz=0.5*(z_xmax+z_xmin);
276 }
277
278 R=0.5*sqrt(dx*dx+dy*dy+dz*dz);
279
280 surf = M_PI*R*R;
281
282 Cerr << " Coordinates associated with the boundary : " << Ox << " " << Oy << " " << Oz << finl;
283 Cerr << " Radius computed : " << R << finl;
284
285 }
286 else if(geom=="channel")
287 {
288 //
289 // le canal est suppose etre oriente suivant x,
290 // periodique suivant z (et x)
291 // la frontiere d'entree centree sur l'origine
292 // de hauteur et largeur: 2
293 // soit (x,y,z) : [0;0]x[-1;+1]x[-1;+1]
294
295 R=1.;
296
297 Ox=0.;
298 Oy=0.;
299 Oz=0.;
300
301 surf = 4.;
302 }
303
304 ///////////////////////////////////////////////////////////////
305 // repere local (t1;t2) associe a la frontiere (supposee plane)
306 ///////////////////////////////////////////////////////////////
307 if (nb_faces==0)
308 {
309 nb_vortex=0;
310 }
311 else
312 {
313 nx=-zvf.face_normales(ndeb,0); // normales orientees vers l'interieur du domaine
314 ny=-zvf.face_normales(ndeb,1);
315 nz=-zvf.face_normales(ndeb,2);
316
317 norme = sqrt( nx*nx + ny*ny + nz*nz );
318
319 nx/=norme;
320 ny/=norme;
321 nz/=norme;
322
323 t1x = -ny;
324 t1y = nx;
325 t1z = 0.;
326
327 if( (est_egal(nx,0.)) && (est_egal(ny,0.)) )
328 {
329 t1x = 0.;
330 t1y = nz;
331 t1z = -ny;
332 }
333
334 norme = sqrt( t1x*t1x + t1y*t1y + t1z*t1z );
335
336 t1x/=norme;
337 t1y/=norme;
338 t1z/=norme;
339
340 t2x = ny*t1z - nz*t1y;
341 t2y = nz*t1x - nx*t1z;
342 t2z = nx*t1y - ny*t1x;
343 /*
344 Cerr << " t1x " << t1x << finl;
345 Cerr << " t1y " << t1y << finl;
346 Cerr << " t1z " << t1z << finl;
347 Cerr << " t2x " << t2x << finl;
348 Cerr << " t2y " << t2y << finl;
349 Cerr << " t2z " << t2z << finl;
350 */
351 ///////////////////////////////////////////////////////////////////
352 // initialisation des champ de : vitesse - k - epsilon (analytique)
353 ///////////////////////////////////////////////////////////////////
354
355 double d,dplus,Reytau;
356 double kappa = 0.41;
357 double beta = 5.1;
358 double tmp=15*15*15*15;
359 for(int face=ndeb; face<nfin; face++)
360 {
361 x=xv(face,0);
362 y=xv(face,1);
363 z=xv(face,2);
364
365 dx=x-Ox;
366 dy=y-Oy;
367 dz=z-Oz;
368
369 if(geom=="circle")
370 {
371 d = R - sqrt(dx*dx+dy*dy+dz*dz) ; // distance a la paroi
372 }
373 else
374 {
375 d = R - std::fabs(y) ; // distance a la paroi
376 }
377
378 if(d<=0.)
379 {
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;
382 exit();
383 }
384
385 dplus = d*utau/nu;
386 Reytau = R*utau/nu;
387
388 if(dplus<11.)
389 {
390 u_moy(face) = utau*dplus ;
391 }
392 else
393 {
394 u_moy(face) = utau*((1./kappa)*log(dplus)+beta) ;
395 }
396
397 if(dplus<11.)
398 {
399 dudy(face) = utau*utau/nu ; // -> gradient dudy discontinu a dplus = 11
400 }
401 else
402 {
403 dudy(face) = utau/(kappa*d) ; // -> genere une discontinuite sur u' en cette position
404 }
405
406 k(face) = utau*utau * ( 0.07*dplus*dplus*exp(-dplus/8)+4.5*(1.-exp(-dplus/20.))/(1.+4.*dplus/Reytau) ) ;
407 eps(face) = (utau*utau*utau*utau/nu) * (1./(0.41 *(pow(dplus*dplus*dplus*dplus+tmp,0.25)))) ;
408 }
409
410 u = u_moy;
411
412 //////////////////////////////////
413 // evaluation du nombre de vortex
414 /////////////////////////////////
415
416 double sigma_moy = 0.;
417
418 for(int face=ndeb; face<nfin; face++)
419 {
420 double sx=zvf.face_normales(face,0);
421 double sy=zvf.face_normales(face,1);
422 double sz=zvf.face_normales(face,2);
423
424 sigma_moy += sqrt(sx*sx+sy*sy+sz*sz) * pow(k(face),1.5) / eps(face);
425
426 }
427 sigma_moy *= pow(C_mu,0.75);
428 sigma_moy /= surf;
429 // On ne peut pas utiliser modf (voir Schema_Temps_base::limpr) car
430 // nb_vortex sert a dimensionner des tableaux !
431 nb_vortex = (int) ( surf / (M_PI * sigma_moy *sigma_moy) );
432 }
433 Cerr << "nb_vortex " <<nb_vortex << finl;
434
435 //nb_vortex=1;
436 //nb_vortex=nb_faces;
437
438 xvort.resize(nb_vortex);
439 yvort.resize(nb_vortex);
440 zvort.resize(nb_vortex);
441 tvort.resize(nb_vortex);
442 svort.resize(nb_vortex);
443 fvort.resize_array(nb_vortex);
444 gamma.resize(nb_vortex);
445 sigma.resize(nb_vortex);
446
447 //////////////////////////////////////////////////////
448 // Calcul du temps de duree de vie minimum des vortex
449 //////////////////////////////////////////////////////
450
451 double dt_vortex,dt_min=1.e6;
452
453 for (int i=0; i<nb_faces; i++) // estimation du dt_min requis
454 {
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;
457 }
458
459 Cerr << " DT_MIN VORTEX " << dt_min << finl;
460
461 /////////////////////////////////////////////////
462 // initialisation des vortex par tirage aleatoire
463 /////////////////////////////////////////////////
464
465 /*
466 for (int i=0;i<nb_vortex;i++) // random different a chaque nouveau tirage
467 {
468 int face = my_rand() % nb_faces;
469 double rand1 = (my_rand() % 100)/100.;
470 double rand2 = (my_rand() % 100)/100.;
471 xvort(i)=xv(face,0);
472 yvort(i)=xv(face,1);
473 zvort(i)=xv(face,2);
474 tvort(i)=rand1*5.*C_mu*pow(k(face),3./2.)/(eps(face)*u_moy(face));
475 if (rand2<0.5) svort(i)=-1.;
476 else svort(i)=1.;
477
478 Cerr << " Vortex " << i << finl;
479 Cerr << " Face " << face << " " << xvort(i) << " " <<yvort(i) << " " <<zvort(i) << finl;
480 Cerr <<" " << tvort(i) << " " <<svort(i) << finl;
481 Cerr << " " << finl;
482
483 }
484 */
485
486 for (int i=0; i<nb_vortex; i++) // random identique a chaque nouveau tirage
487 {
488 int face = (int)(nb_faces*drand48());
489 xvort(i)=xv(face,0);
490 yvort(i)=xv(face,1);
491 zvort(i)=xv(face,2);
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.;
494 else svort(i)=1.;
495 /*
496 Cerr << " Vortex " << i << finl;
497 Cerr << " Face " << face << " " << xvort(i) << " " <<yvort(i) << " " <<zvort(i) << finl;
498 Cerr <<" " << tvort(i) << " " <<svort(i) << finl;
499 Cerr << " " << finl;
500 */
501 }
502
503 mettre_a_jour(un_temps);
504
505 return 1;
506}
507
508void Ch_front_Vortex::deplacement_vortex(double dx,double dy,double dz,double asigma,double agamma,
509 double& vv,double& ww)
510{
511 double norme2 = dx*dx + dy*dy + dz*dz ;
512
513 if(norme2<(4.*asigma) && norme2>1.e-8)
514 {
515 double e1 = exp(-norme2/(2.*asigma*asigma));
516 double f = (1.-e1) * agamma * e1 / (2.* M_PI * norme2 );
517
518 double dt1 = dx*t1x + dy*t1y + dz*t1z ;
519 double dt2 = dx*t2x + dy*t2y + dz*t2z ;
520
521 vv += dt2*f;
522 ww -= dt1*f;
523 }
524}
525
527{
528 const Frontiere_dis_base& fr_dis=frontiere_dis();
529 const Frontiere& frontiere=fr_dis.frontiere();
530 const int nb_faces=frontiere.nb_faces();
531 const int ndeb=frontiere.num_premiere_face();
532 const int nfin=ndeb+nb_faces;
533 DoubleTab& les_val=valeurs();
534
535 const Domaine_VF& zvf = ref_cast(Domaine_VF, domaine_dis());
536 const DoubleTab& xv=zvf.xv();
537
538 double alpha=0;
539 double dist,dist2;
540 double x,yter,z;
541 double xp,yp,zp;
542 double xvort_mir,yvort_mir,zvort_mir;
543 double xvort_per,yvort_per,zvort_per;
544 double dx,dy,dz;
545
546 double C_mu = 0.09;
547
548 if(init)
549 {
550 init=0;
551 temps=tps;
552
553 if(temps!=0.) // il s'agit d'une reprise
555 }
556
557 //////////////////////////////////////////////////
558 // caracteristiques des vortex (position-vorticite)
559 //////////////////////////////////////////////////
560 if (nb_vortex!=0)
561 alpha = 4.*sqrt(M_PI*surf/(3.*nb_vortex*(2.*log(3.)-3.*log(2.))));
562
563 for (int i=0; i<nb_vortex; i++)
564 {
565 x=xvort(i);
566 yter=yvort(i);
567 z=zvort(i);
568
569 dist=1.e6;
570 int face=-1;
571
572 for(int j=ndeb; j<nfin; j++)
573 {
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);
575
576 if(dist2<dist)
577 {
578 dist=dist2;
579 face=j;
580 }
581 }
582 gamma(i) = alpha * sqrt(k(face)) * svort(i);
583 sigma(i) = pow(C_mu,0.75) * pow(k(face),1.5) / eps(face);
584 fvort[i] = face ;
585 }
586
587 ///////////////////////////////////////////////////////////////////////////////////
588 // calcul de la vitesse induite par les vortex en chacune des faces de la frontiere
589 ///////////////////////////////////////////////////////////////////////////////////
590
591 for(int face=ndeb; face<nfin; face++)
592 {
593 x=xv(face,0);
594 yter=xv(face,1);
595 z=xv(face,2);
596
597 x -= Ox ; // ATTENTION : Pour des raisons pratiques,
598 yter -= Oy ; // les coordonnees des points sont exprimees
599 z -= Oz ; // en fonction de l'origine Ox,Oy,Oz de la frontiere
600
601 v(face) = 0.; // vitesse induite par les vortex a la face suivant t1
602 w(face) = 0.; // vitesse induite par les vortex a la face suivant t2
603
604 for (int i=0; i<nb_vortex; i++)
605 {
606 dx = (xvort(i)-Ox) - x;
607 dy = (yvort(i)-Oy) - yter;
608 dz = (zvort(i)-Oz) - z;
609
610 deplacement_vortex(dx,dy,dz,sigma(i),gamma(i),v(face),w(face));
611
612
613 ////////////////////////////////////
614 // traitement des conditions limites
615 ////////////////////////////////////
616
617 //***************************************
618 // Parois : traitement des vortex miroirs
619 //***************************************
620
621 if(geom=="circle")
622 {
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)) ;
626 }
627 else //channel
628 {
629 xp = x;
630 yp = R;
631 if(yter<0) yp = -R;
632 zp = z;
633 }
634
635 xvort_mir = 2. * xp - (xvort(i)-Ox);
636 yvort_mir = 2. * yp - (yvort(i)-Oy);
637 zvort_mir = 2. * zp - (zvort(i)-Oz);
638
639 dx = xvort_mir - x;
640 dy = yvort_mir - yter;
641 dz = zvort_mir - z;
642
643 deplacement_vortex(dx,dy,dz,sigma(i),gamma(i),v(face),w(face));
644
645
646 //***************************************
647 // Periodicite : canal plan uniquement
648 //***************************************
649
650 if(geom=="channel")
651 {
652
653 xvort_per = (xvort(i)-Ox);
654 yvort_per = (yvort(i)-Oy);
655 if( (zvort(i)-Oz) >0.) zvort_per = -2.*R + (zvort(i)-Oz) ;
656 else zvort_per = 2.*R + (zvort(i)-Oz);
657
658 dx = xvort_per - x;
659 dy = yvort_per - yter;
660 dz = zvort_per - z;
661
662 deplacement_vortex(dx,dy,dz,sigma(i),gamma(i),v(face),w(face));
663
664 }
665
666 }//boucle sur vortex
667
668
669 ////////////////////////////////////////////////////////////////////////////
670 // calcul de la fluctuation de vitesse logitudinale par equation de Langevin
671 ////////////////////////////////////////////////////////////////////////////
672
673
674 // double up = u(face) - u_moy(face);
675 double up= u(face);
676 if(tps==0.) up=0.;
677 double vp;
678
679 if(geom=="channel") vp = w(face);
680 else //(geom=="circle")
681 {
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) ;
686 }
687
688 ///// processus de Wiener : tirage aleatoire "gaussien" verifiant <dW>=0 et <dW^2>=1 /////////
689 /////
690 ///// http://www.taygeta.com/random/gaussian.html
691
692 double x1,x2,ybis,Wkp1,dW;
693
694 do
695 {
696 x1 = 2. * drand48() - 1. ;
697 x2 = 2. * drand48() - 1. ;
698 ybis = x1 * x1 + x2 * x2;
699 }
700 while ( ybis >= 1. );
701
702 Wkp1 = x1 * sqrt( (-1.0 * log( ybis ) ) / ybis ); // On travaille sur dW -> pour assurer <dW^2>=1, on doit modifier le coef
703 dW = Wkp1 - Wk(face) ; // par rapport a la formulation proposee dans 'taygeta'
704 Wk(face) = Wkp1 ;
705
706 /*
707 double Wkp1,dW;
708
709 Wkp1 = 2.*drand48()-1.;
710 dW = (Wkp1 - Wk(face))*sqrt(3./2.) ;
711 Wk(face) = Wkp1 ;
712
713
714 double W,Wp1,dW;
715 W = 2.*drand48()-1.;
716 Wp1 = 2.*drand48()-1.;
717 dW = (Wp1 - W)*sqrt(3./2.) ;
718 */
719
720
721 //////////////////////////////////
722
723 double C0,C1,C2;
724
725 C0=14./15.;
726 C1=1.8;
727 C2=0.6;
728
729 double T=k(face)/eps(face);
730
731 double dt = tps - temps;
732
733 if(dt!=0.) // codage conforme a these Sergent + papier eDF (au coef 2/3 pres vis-a-vis de C2)
734 {
735 up += dt*( -(C1/(2.*T))*up + (C2-1.)*dudy(face)*vp + sqrt(C0*eps(face))*dW/dt );
736
737 // up += dt*( -(C1/(2.*T))*up + ((2./3.)*C2-1.)*dudy(face)*vp + sqrt(C0*eps(face))*dW/dt );
738 }
739 /*
740 if(dt!=0.) // codage conforme a ce qui est code dans Saturne
741 {
742 up += dt*(-(1.-(2./3.)*C2)*dudy(face)*vp) + 2.*sqrt((2./3.)*(C1-1.)*eps(face)*dt)*dW;
743 up /= (1.+5.*C1*dt/T);
744 }
745 */
746
747 // u(face) = u_moy(face) + up;
748 u(face) = up;
749
750
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 ;
754
755 /*
756 les_val(face,0) = gamma(face) ;
757 les_val(face,1) = sigma(face) ;
758 les_val(face,2) = fvort(face) ;
759
760 les_val(face,0) = k(face) ;
761 les_val(face,1) = eps(face) ;
762 les_val(face,2) = u_moy(face) ;
763
764 */
765 }//boucle sur face
766
767
768 //////////////////////////
769 // deplacement des vortex
770 //////////////////////////
771
772
773 double dt = tps - temps;
774 temps=tps;
775
776
777 for (int i=0; i<nb_vortex; i++)
778 {
779 int face = fvort[i];
780
781 x = xvort(i) + dt * ( v(face)*t1x + w(face)*t2x ); // Les deplacements des vortex ne s'operent
782 yter = yvort(i) + dt * ( v(face)*t1y + w(face)*t2y ); // que dans le plan d'entree. D'ou les composantes
783 z = zvort(i) + dt * ( v(face)*t1z + w(face)*t2z ); // u.n proscrites
784
785 x -= Ox ; // ATTENTION : Pour des raisons pratiques,
786 yter -= Oy ; // les coordonnees des points sont exprimees
787 z -= Oz ; // en fonction de l'origine Ox,Oy,Oz de la frontiere
788
789
790 if( (geom=="circle") && ((x*x+yter*yter+z*z)>=(R*R)) ) //paroi
791 {
792 // paroi : On ne fait rien - on laisse le vortex a sa position
793 }
794 else if( (geom=="channel") && (std::fabs(yter)>R) ) //paroi
795 {
796 // paroi : On ne fait rien - on laisse le vortex a sa position
797 }
798 else if( (geom=="channel") && (z>R) ) //periodicite
799 {
800 xvort(i) = x + Ox;
801 yvort(i) = yter + Oy;
802 zvort(i) = -2.*R + z + Oz;
803 }
804 else if( (geom=="channel") && (z<-R) ) //periodicite
805 {
806 xvort(i) = x + Ox;
807 yvort(i) = yter + Oy;
808 zvort(i) = 2.*R - z + Oz;
809 }
810 else
811 {
812 xvort(i) = x + Ox;
813 yvort(i) = yter + Oy;
814 zvort(i) = z + Oz;
815 }
816 }
817
818 ///////////////////////////////////////////////////////
819 // fin de vie des vortex - generation de nouveau vortex
820 ///////////////////////////////////////////////////////
821
822 for (int i=0; i<nb_vortex; i++)
823 {
824 tvort(i) -= dt ;
825
826 if(tvort(i)<=0.)// fin de vie du vortex
827 {
828 /*
829 int face = my_rand() % nb_faces; // random different a chaque nouveau tirage
830 // double rand1 = (my_rand() % 100)/100.;
831 double rand2 = (my_rand() % 100)/100.;
832 xvort(i)=xv(face,0);
833 yvort(i)=xv(face,1);
834 zvort(i)=xv(face,2);
835 tvort(i)=5.*C_mu*pow(k(face),3./2.)/(eps(face)*u_moy(face));
836 if (rand2<0.5) svort(i)=-1.;
837 else svort(i)=1.;
838 */
839 int face = (int)(nb_faces*drand48()); // random identique a chaque execution
840 xvort(i)=xv(face,0);
841 yvort(i)=xv(face,1);
842 zvort(i)=xv(face,2);
843 tvort(i)=5.*C_mu*pow(k(face),3./2.)/(eps(face)*u_moy(face));
844 if (drand48()<0.5) svort(i)=-1.;
845 else svort(i)=1.;
846
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;
850 Cerr << " " << finl;
851 }
852 }
853}
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 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&.
Classe Champ_Inc_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.
class Domaine_VF
Definition Domaine_VF.h:44
virtual double face_normales(int face, int comp) const
Definition Domaine_VF.h:47
double xv(int num_face, int k) const
Definition Domaine_VF.h:76
Fichier en lecture Cette classe est a la classe C++ ifstream ce que la classe Entree est a la.
Definition EFichier.h:29
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,...
Definition Entree.h:42
int_t sommet(int_t, int) const
Renvoie le numero du j-ieme sommet de la i-ieme face.
Definition Faces.h:130
int nb_som_faces() const
Renvoie le nombre de sommet par face.
Definition Faces.h:149
virtual void fixer_nb_comp(int i)
Fixe le nombre de composantes du champ.
int_t num_premiere_face() const
Definition Frontiere.h:67
int_t nb_faces() const
Renvoie le nombre de faces de la frontiere.
Definition Frontiere.h:59
const Faces_t & faces() const
Definition Frontiere.h:54
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
Definition Nom.h:31
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.
Definition Nom.cpp:387
static int dimension
Definition Objet_U.h:99
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
Definition Process.cpp:104
static int me()
renvoie mon rang dans le groupe de communication courant.
Definition Process.cpp:125
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
void setf(IOS_FORMAT code) override
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ size() const
Definition TRUSTVect.tpp:45