16#include <Traitement_particulier_NS_THI_VEF_new.h>
17#include <Navier_Stokes_std.h>
18#include <Champ_P1NC.h>
20#include <Schema_Temps_base.h>
23extern "C" void cftfax(
int ,
int* ,
double* );
24extern "C" void rfftmlt(
double*,
double*,
double*,
int*,
int,
int,
int,
int,
int);
53 const Domaine& domaine = zdis.
domaine();
55 int nsize, nsizes2, nl;
63 Cerr <<
" Trait_part_NS_THI_VEF_new : nsize n'est pas un nombre paire !! " << nsize << finl;
67 DoubleTab vit_u(nl,nl,nsize);
68 DoubleTab vit_v(nl,nl,nsize);
69 DoubleTab vit_w(nl,nl,nsize);
70 DoubleTab vit_u_s(nl,nl,nl);
71 DoubleTab vit_v_s(nl,nl,nl);
72 DoubleTab vit_w_s(nl,nl,nl);
81 tab_calc_fft.
resize(nl,nl,nsize+1);
82 tab_calc_fft_1.resize(nl,nl,nsize+1);
83 tab_calc_fft_2.resize(nl,nl,nsize+1);
84 tab_calc_fft_s.resize(nl+1,nl+1,nl+1);
86 DoubleVect Ek(nsizes2+1);
87 DoubleVect Dk(nsizes2+1);
91 determine_new_tab_fft_VEF();
94 ch_vit_pour_fft_VEF_s(vit_u_s,vit_v_s,vit_w_s);
97 ch_vit_pour_fft_VEF(vit_u,vit_v,vit_w);
98 calculer_spectre_new(vit_u, vit_v, vit_w, nsize, nl, 1000., Ek, Ec1, Dk, D1);
99 Cerr <<
" Ec_x = " << Ec1 << finl;
114 SFichier fic2 (
"Sorties_THI_2",ios::app);
115 double temps_crt = mon_equation->inconnue().temps();
118 fic2 << temps_crt << Ec1 << D1 << finl;
119 Cerr <<
" Ec_tot = " << Ec1 << finl;
127 const Domaine& domaine = zdis.
domaine();
129 int nsize, nsizes2, nl;
135 DoubleTab vit_u(nl,nl,nsize);
136 DoubleTab vit_v(nl,nl,nsize);
137 DoubleTab vit_w(nl,nl,nsize);
138 DoubleTab vit_u_s(nl,nl,nl);
139 DoubleTab vit_v_s(nl,nl,nl);
140 DoubleTab vit_w_s(nl,nl,nl);
150 DoubleVect Ek(nsizes2+1),Ek1(nsizes2+1),Ek2(nsizes2+1);
151 DoubleVect Dk(nsizes2+1),Dk1(nsizes2+1),Dk2(nsizes2+1);
152 double Ec,Ec1,Ec2,Df,Df1,Df2;
160 double temps_crt = mon_equation->inconnue().temps();
161 double dt_post_inst = 0.5;
164 static double temps_dern_post_inst = -100.;
165 if (std::fabs(temps_crt-temps_dern_post_inst)>=dt_post_inst)
171 ch_vit_pour_fft_VEF_s(vit_u_s,vit_v_s,vit_w_s);
180 ch_vit_pour_fft_VEF(vit_u,vit_v,vit_w);
181 calculer_spectre_new(vit_u, vit_v, vit_w, nsize, nl, temps_crt, Ek, Ec, Dk, Df);
185 ch_vit_pour_fft_VEF_1(vit_u,vit_v,vit_w);
186 calculer_spectre_new(vit_u, vit_v, vit_w, nsize, nl, temps_crt+eps, Ek1, Ec1, Dk1, Df1);
188 ch_vit_pour_fft_VEF_2(vit_u,vit_v,vit_w);
189 calculer_spectre_new(vit_u, vit_v, vit_w, nsize, nl, temps_crt+eps+eps, Ek2, Ec2, Dk2, Df2);
192 temps_dern_post_inst =temps_crt ;
197 const Domaine_dis_base& zdisbase=mon_equation->inconnue().domaine_dis_base();
199 DoubleTab& vitesse = mon_equation->inconnue().valeurs();
200 const int nb_faces = domaine_VEF.
nb_faces();
205 DoubleTab ub(vitesse);
211 for (num_face=0; num_face <nb_faces; num_face++)
213 Ectot+=vitesse(num_face,0)*vitesse(num_face,0);
214 Ectot+=vitesse(num_face,1)*vitesse(num_face,1);
215 Ectot+=vitesse(num_face,2)*vitesse(num_face,2);
216 Ec_ub+=ub(num_face,0)*ub(num_face,0);
217 Ec_ub+=ub(num_face,1)*ub(num_face,1);
218 Ec_ub+=ub(num_face,2)*ub(num_face,2);
219 Ec_up+=(vitesse(num_face,0)-ub(num_face,0))*(vitesse(num_face,0)-ub(num_face,0));
220 Ec_up+=(vitesse(num_face,1)-ub(num_face,1))*(vitesse(num_face,1)-ub(num_face,1));
221 Ec_up+=(vitesse(num_face,2)-ub(num_face,2))*(vitesse(num_face,2)-ub(num_face,2));
222 Ec_ubp+=(vitesse(num_face,0)-ub(num_face,0))*ub(num_face,0);
223 Ec_ubp+=(vitesse(num_face,1)-ub(num_face,1))*ub(num_face,1);
224 Ec_ubp+=(vitesse(num_face,2)-ub(num_face,2))*ub(num_face,2);
229 Ec_ubp/=(2*nb_faces);
231 SFichier fic (
"Sorties_THI",ios::app);
232 fic << temps_crt << Ectot << Ec << Df << finl;
233 Cerr <<
"temps=" << temps_crt <<
" Ectot=" << Ectot <<
" Ec=" << Ec <<
" D=" << Df << finl;
236 double dt = mon_equation->schema_temps().pas_de_temps();
237 fic2 << temps_crt << dt << finl;
239 SFichier fic3 (
"Sorties_THI_3",ios::app);
240 fic3 << temps_crt << Ectot << Ec_ub << Ec_up << Ec_ubp << finl;
247 const Domaine_dis_base& zdisbase=mon_equation->inconnue().domaine_dis_base();
249 DoubleTab& vitesse = mon_equation->inconnue().valeurs();
250 const int nb_faces = domaine_VEF.
nb_faces();
258 for (num_face=0; num_face <nb_faces; num_face++)
260 Ectot+=vitesse(num_face,0)*vitesse(num_face,0);
261 Ectot+=vitesse(num_face,1)*vitesse(num_face,1);
262 Ectot+=vitesse(num_face,2)*vitesse(num_face,2);
266 Cerr <<
"cpt=" << cpt << finl;
267 Cerr <<
"Ec par traitement direct du champ =" << Ectot << finl;
311 double nEc=pow(Ectot/
Ec_init,0.5);
313 Cerr <<
" Ec_calcule : " << Ectot <<
" Ec_init : " <<
Ec_init << finl;
314 Cerr <<
"Renormalisation!!" << finl;
319void Traitement_particulier_NS_THI_VEF_new::ch_vit_pour_fft_VEF(DoubleTab& vit_u, DoubleTab& vit_v, DoubleTab& vit_w)
const
327 const DoubleTab& vitesse = mon_equation->inconnue().valeurs();
331 DoubleTab ubar(vitesse);
337 for (k=0; k<nsize; k++)
339 num_face = tab_calc_fft(i,j,k);
340 vit_u(i,j,k)=ubar(num_face,0);
341 vit_v(i,j,k)=ubar(num_face,1);
342 vit_w(i,j,k)=ubar(num_face,2);
346void Traitement_particulier_NS_THI_VEF_new::ch_vit_pour_fft_VEF_1(DoubleTab& vit_u, DoubleTab& vit_v, DoubleTab& vit_w)
const
354 const DoubleTab& vitesse = mon_equation->inconnue().valeurs();
358 DoubleTab ubar(vitesse);
359 const Champ_P1NC& chp=ref_cast(Champ_P1NC, mon_equation->inconnue());
364 for (k=0; k<nsize; k++)
366 num_face = tab_calc_fft(i,j,k);
367 vit_u(i,j,k)=vitesse(num_face,0)-ubar(num_face,0);
368 vit_v(i,j,k)=vitesse(num_face,1)-ubar(num_face,1);
369 vit_w(i,j,k)=vitesse(num_face,2)-ubar(num_face,2);
373void Traitement_particulier_NS_THI_VEF_new::ch_vit_pour_fft_VEF_2(DoubleTab& vit_u, DoubleTab& vit_v, DoubleTab& vit_w)
const
381 const DoubleTab& vitesse = mon_equation->inconnue().valeurs();
387 for (k=0; k<nsize; k++)
389 num_face = tab_calc_fft(i,j,k);
390 vit_u(i,j,k)=vitesse(num_face,0);
391 vit_v(i,j,k)=vitesse(num_face,1);
392 vit_w(i,j,k)=vitesse(num_face,2);
397void Traitement_particulier_NS_THI_VEF_new::ch_vit_pour_fft_VEF_s(DoubleTab& vit_u_s, DoubleTab& vit_v_s, DoubleTab& vit_w_s)
const
399 const Domaine_dis_base& zdis = mon_equation->domaine_dis();
400 const Domaine& domaine = zdis.
domaine();
401 int nb_som = domaine.nb_som();
406 const DoubleTab& vitesse = mon_equation->inconnue().valeurs();
407 double temps_crt = mon_equation->inconnue().temps();
412 Champ_P1NC& chp=ref_cast_non_const(Champ_P1NC, mon_equation->inconnue());
415 DoubleTab vit_som(nb_som, nb_comp);
416 vit_som=valeur_P1_L2(chp, chp.
domaine());
422 num_som = tab_calc_fft_s(i,j,k);
423 vit_u_s(i,j,k)=vit_som(num_som,0);
424 vit_v_s(i,j,k)=vit_som(num_som,1);
425 vit_w_s(i,j,k)=vit_som(num_som,2);
434 Nom fichier_vit=
"chp_vit_VEF_";
435 Nom tps = Nom(temps_crt);
437 SFichier fic79 (fichier_vit);
445 fic79 << vit_u_s(i,j,k) <<finl;
450 fic79 << vit_v_s(i,j,k) <<finl;
455 fic79 << vit_w_s(i,j,k) <<finl;
458 Cerr <<
" OK " << finl;
461void Traitement_particulier_NS_THI_VEF_new::determine_new_tab_fft_VEF()
463 const Domaine_dis_base& zdisbase=mon_equation->inconnue().domaine_dis_base();
464 const Domaine_VEF& domaine_VEF=ref_cast(Domaine_VEF, zdisbase);
465 const DoubleTab& xv = domaine_VEF.
xv();
466 const Domaine_dis_base& zdis = mon_equation->domaine_dis();
467 const Domaine& domaine = zdis.
domaine();
468 const DoubleTab& coord = domaine.coord_sommets();
469 int nb_som = domaine.nb_som();
476 ntot= nl*nl*(nsize+1);
478 int nb_faces = domaine_VEF.
nb_faces();
479 int num_face,num_som;
480 int ix,iy,iz,ii,jj,kk;
483 double longueur,d,d3,eps;
492 longueur = 6.283185307;
501 for(num_face=0; num_face<nb_faces; num_face++)
507 ix=(int)((xx+eps)/d3);
508 iy=(int)((yy+eps)/d3);
509 iz=(int)((zz+eps)/d3);
511 if( iz%3==1 && iy%3==1)
518 tab_calc_fft(jj,kk,ii)=num_face;
521 if( iz%3==1 && ix%3==2)
528 tab_calc_fft_1(ii,kk,jj)=num_face;
531 if( ix%3==1 && iy%3==1)
538 tab_calc_fft_2(ii,jj,kk)=num_face;
542 for(num_som=0; num_som<nb_som; num_som++)
548 ii=(int)((xx+eps)/d);
549 jj=(int)((yy+eps)/d);
550 kk=(int)((zz+eps)/d);
552 tab_calc_fft_s(ii,jj,kk)=num_som;
558 if( compteurx!=ntot || compteury!=ntot || compteurz!=ntot )
560 Cerr <<
" ATTENTION (Trait_part_NS_THI_VEF_new) : nombre de points trouves differe de " << ntot << finl;
561 Cerr <<
" assurez-vous que le nombre de points dans le fichier .data" << finl;
562 Cerr <<
"est bien le meme suivant les 3 directions d'espace et que la longueur du pave etudie correspond bien a : " << longueur << finl;
580void Traitement_particulier_NS_THI_VEF_new::calculer_spectre_new(DoubleTab& vit_u, DoubleTab& vit_v, DoubleTab& vit_w,
581 int nsize,
int nl,
double temps,
582 DoubleVect& Ek,
double& Ec, DoubleVect& Dk,
double& Df)
585 DoubleVect trig(2*(nsize));
588 DoubleVect x(nsize+2),y(nsize+2),z(nsize+2);
589 DoubleVect work(2*nsize*lot);
591 int jump=inc*(nsize+2);
602 cftfax(nsize,ifax.addr(),trig.addr());
611 for (k=0; k<nsize; k++)
625 rfftmlt(x.addr(),work.addr(),trig.addr(),ifax.addr(),inc,jump,nsize,lot,isign);
630 for (k=0; k<nsizes2+1; k++)
632 Ek(k)+=x(2*k)*x(2*k)+x(2*k+1)*x(2*k+1);
644 Nom fichier =
"spectre_";
645 Nom tps = Nom(temps);
646 Cerr <<
"tps=" << tps << finl;
648 SFichier fic7 (fichier);
650 for (k=0; k<nsizes2; k++)
653 fic7 << k <<
" " << Ek(k) <<
" " << Dk(k) << finl ;
const Domaine & domaine() const
void filtrer_L2(DoubleTab &x) const
int nb_faces() const
renvoie le nombre global de faces.
double xv(int num_face, int k) const
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
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 void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
Classe de base des flux de sortie.
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
classe Traitement_particulier_NS_THI_VEF_new Cette classe permet de faire les traitements particulier...
void calcul_spectre() override
void init_calc_spectre() override
void renorm_Ec() override
classe Traitement_particulier_THI_new Cette classe permet de faire les traitements particuliers
int & calcul_nb_som_dir(const Domaine &)