TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Traitement_particulier_NS_THI_VEF_new.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 <Traitement_particulier_NS_THI_VEF_new.h>
17#include <Navier_Stokes_std.h>
18#include <Champ_P1NC.h>
19#include <Domaine.h>
20#include <Schema_Temps_base.h>
21#include <SFichier.h>
22
23extern "C" void cftfax(int ,int* ,double* );
24extern "C" void rfftmlt(double*, double*, double*, int*, int, int, int, int, int);
25
26Implemente_instanciable(Traitement_particulier_NS_THI_VEF_new,"Traitement_particulier_NS_THI_new_VEF",Traitement_particulier_NS_THI_new);
27
28
29/*! @brief
30 *
31 * @param (Sortie& is) un flot de sortie
32 * @return (Sortie&) le flot de sortie modifie
33 */
35{
36 return is;
37}
38
39
40/*! @brief
41 *
42 * @param (Entree& is) un flot d'entree
43 * @return (Entree&) le flot d'entree modifie
44 */
46{
47 return is;
48}
49
51{
52 const Domaine_dis_base& zdis = mon_equation->domaine_dis();
53 const Domaine& domaine = zdis.domaine();
54 calcul_nb_som_dir(domaine);
55 int nsize, nsizes2, nl;
56
57 nl = nb_som_dir; // anciennement nb_som_dir
58 nsize = 3*nl;
59 nsizes2=nsize/2;
60
61 if( nsize%2 != 0 )
62 {
63 Cerr << " Trait_part_NS_THI_VEF_new : nsize n'est pas un nombre paire !! " << nsize << finl;
65 }
66
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);
73
74 vit_u = 0.;
75 vit_v = 0.;
76 vit_w = 0.;
77 vit_u_s= 0.;
78 vit_v_s = 0.;
79 vit_w_s = 0.;
80
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);
85
86 DoubleVect Ek(nsizes2+1);
87 DoubleVect Dk(nsizes2+1);
88 //double Ec1,Ec2,Ec3,D1,D2,D3;
89 double Ec1,D1;
90
91 determine_new_tab_fft_VEF();
92
93 // spectre 3D, a l'instant initial
94 ch_vit_pour_fft_VEF_s(vit_u_s,vit_v_s,vit_w_s);
95
96 // spectre avec des points a x=cst, a l'instant initial
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;
100
101
102 //// spectre avec des points a y=cst, a l'instant initial
103 // ch_vit_pour_fft_VEF_1(vit_u,vit_v,vit_w);
104 // calculer_spectre_new(vit_u, vit_v, vit_w, nsize, nl, 2000., Ek, Ec2, Dk, D2);
105 // Cerr << " Ec_y = " << Ec2 << finl;
106
107
108 //// spectre avec des points a z=cst, a l'instant initial
109 // ch_vit_pour_fft_VEF_2(vit_u,vit_v,vit_w);
110 // calculer_spectre_new(vit_u, vit_v, vit_w, nsize, nl, 3000., Ek, Ec3, Dk, D3);
111 // Cerr << " Ec_z = " << Ec3 << finl;
112
113
114 SFichier fic2 ("Sorties_THI_2",ios::app);
115 double temps_crt = mon_equation->inconnue().temps();
116 // fic2 << temps_crt << (Ec1+Ec2+Ec3)/3. << (D1+D2+D3)/3. << finl;
117 // Cerr << " Ec_tot = " << (Ec1+Ec2+Ec3)/3. << finl;
118 fic2 << temps_crt << Ec1 << D1 << finl;
119 Cerr << " Ec_tot = " << Ec1 << finl;
120
121}
122
123
125{
126 const Domaine_dis_base& zdis = mon_equation->domaine_dis();
127 const Domaine& domaine = zdis.domaine();
128 calcul_nb_som_dir(domaine);
129 int nsize, nsizes2, nl;
130
131 nl = nb_som_dir; // anciennement nb_som_dir
132 nsize = 3*nl;
133 nsizes2=nsize/2;
134
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);
141
142 vit_u = 0.;
143 vit_v = 0.;
144 vit_w = 0.;
145 vit_u_s= 0.;
146 vit_v_s = 0.;
147 vit_w_s = 0.;
148
149
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;
153 Ec=0.;
154 Ec1=0.;
155 Ec2=0.;
156 Df=0.;
157 Df1=0.;
158 Df2=0.;
159
160 double temps_crt = mon_equation->inconnue().temps();
161 double dt_post_inst = 0.5;
162
163
164 static double temps_dern_post_inst = -100.;
165 if (std::fabs(temps_crt-temps_dern_post_inst)>=dt_post_inst)
166 {
167
168
169 // ******** sauvegarde champ pour calcul de spectre 3D ***********
170
171 ch_vit_pour_fft_VEF_s(vit_u_s,vit_v_s,vit_w_s);
172
173
174 // ******** Hypothese turbulence homogene isotrope ***********
175 // ****(on ne calcule le spectre que suivant 1 direction) ****
176
177
178 // ****(De plus : Ec_x ne doit prendre en compte que u et non les 3 composantes de vitesses) ****
179
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);
182
183 double eps=100.;
184
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);
187
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);
190
191
192 temps_dern_post_inst =temps_crt ;
193 }
194
195
196
197 const Domaine_dis_base& zdisbase=mon_equation->inconnue().domaine_dis_base();
198 const Domaine_VEF& domaine_VEF=ref_cast(Domaine_VEF, zdisbase);
199 DoubleTab& vitesse = mon_equation->inconnue().valeurs();
200 const int nb_faces = domaine_VEF.nb_faces();
201 double Ectot=0.0;
202 double Ec_ub=0.0;
203 double Ec_up=0.0;
204 double Ec_ubp=0.0;
205 DoubleTab ub(vitesse);
206 const Champ_P1NC& chp=ref_cast(Champ_P1NC, mon_equation->inconnue());
207 chp.filtrer_L2(ub);
208
209
210 int num_face;
211 for (num_face=0; num_face <nb_faces; num_face++)
212 {
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);
225 }
226 Ectot/=(2*nb_faces);
227 Ec_ub/=(2*nb_faces);
228 Ec_up/=(2*nb_faces);
229 Ec_ubp/=(2*nb_faces);
230
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;
234
235 SFichier fic2("dt_evol",ios::app);
236 double dt = mon_equation->schema_temps().pas_de_temps();
237 fic2 << temps_crt << dt << finl;
238
239 SFichier fic3 ("Sorties_THI_3",ios::app);
240 fic3 << temps_crt << Ectot << Ec_ub << Ec_up << Ec_ubp << finl;
241
242}
243
244
246{
247 const Domaine_dis_base& zdisbase=mon_equation->inconnue().domaine_dis_base();
248 const Domaine_VEF& domaine_VEF=ref_cast(Domaine_VEF, zdisbase);
249 DoubleTab& vitesse = mon_equation->inconnue().valeurs();
250 const int nb_faces = domaine_VEF.nb_faces();
251 double Ectot=0.0;
252
253
254 // petite verification qui coute pas cher !!!
255
256 int cpt=0;
257 int num_face;
258 for (num_face=0; num_face <nb_faces; num_face++)
259 {
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);
263 cpt++;
264 }
265 Ectot/=(2*nb_faces);
266 Cerr << "cpt=" << cpt << finl;
267 Cerr << "Ec par traitement direct du champ =" << Ectot << finl;
268
269 /*
270 // if (fac_init!=0)
271 {
272 Ectot=0.0;
273
274 const Domaine_dis_base& zdis = mon_equation->domaine_dis();
275 const Domaine& domaine = zdis.domaine();
276 int nb_som = domaine.nb_som();
277 double nb=pow(nb_som*1.,1./3.);
278 int nsize, nsizes2, nl;
279
280 nl = (int)(nb); // anciennement nb_som_dir
281 nsize = 3*nl;
282 nsizes2=nsize/2;
283
284 DoubleTab vit_u(nl,nl,nsize);
285 DoubleTab vit_v(nl,nl,nsize);
286 DoubleTab vit_w(nl,nl,nsize);
287 vit_u = 0.; vit_v = 0.; vit_w = 0.;
288
289 DoubleVect Ek(nsizes2+1);
290 DoubleVect Dk(nsizes2+1);
291 double Ec,Ec1,Ec2,Df,Df1,Df2;
292
293 double temps_crt = mon_equation->inconnue().temps();
294
295 ch_vit_pour_fft_VEF(vit_u,vit_v,vit_w);
296 calculer_spectre_new(vit_u, vit_v, vit_w, nsize, nl, 1000.+temps_crt, Ek, Ec, Dk, Df);
297
298 // ****(Ec unidirectionnel et suivant UNE composante de vitesse) ****
299
300 // ch_vit_pour_fft_VEF_1(vit_u,vit_v,vit_w);
301 // calculer_spectre_new(vit_u, vit_v, vit_w, nsize, nl, 2000.+temps_crt, Ek, Ec1, Dk, Df1);
302
303 // ch_vit_pour_fft_VEF_2(vit_u,vit_v,vit_w);
304 // calculer_spectre_new(vit_u, vit_v, vit_w, nsize, nl, 3000.+temps_crt, Ek, Ec2, Dk, Df2);
305
306 // Ectot=(Ec+Ec1+Ec2)/3.;
307 Ectot=Ec;
308
309 }
310 */
311 double nEc=pow(Ectot/Ec_init,0.5);
312
313 Cerr << " Ec_calcule : " << Ectot << " Ec_init : " << Ec_init << finl;
314 Cerr << "Renormalisation!!" << finl;
315 vitesse/=nEc;
316 return;
317}
318
319void Traitement_particulier_NS_THI_VEF_new::ch_vit_pour_fft_VEF(DoubleTab& vit_u, DoubleTab& vit_v, DoubleTab& vit_w) const
320{
321 int nsize, nl;
322
323 nl = nb_som_dir; // anciennement nb_som_dir
324 nsize = 3*nl;
325 // nsizes2=nsize/2;
326
327 const DoubleTab& vitesse = mon_equation->inconnue().valeurs();
328 int num_face;
329 int i,j,k;
330
331 DoubleTab ubar(vitesse);
332 const Champ_P1NC& chp=ref_cast(Champ_P1NC, mon_equation->inconnue());
333 chp.filtrer_L2(ubar);
334
335 for (i=0; i<nl; i++)
336 for (j=0; j<nl; j++)
337 for (k=0; k<nsize; k++)
338 {
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);
343 }
344}
345
346void Traitement_particulier_NS_THI_VEF_new::ch_vit_pour_fft_VEF_1(DoubleTab& vit_u, DoubleTab& vit_v, DoubleTab& vit_w) const
347{
348 int nsize, nl;
349
350 nl = nb_som_dir; // anciennement nb_som_dir
351 nsize = 3*nl;
352 // nsizes2=nsize/2;
353
354 const DoubleTab& vitesse = mon_equation->inconnue().valeurs();
355 int num_face;
356 int i,j,k;
357
358 DoubleTab ubar(vitesse);
359 const Champ_P1NC& chp=ref_cast(Champ_P1NC, mon_equation->inconnue());
360 chp.filtrer_L2(ubar);
361
362 for (i=0; i<nl; i++)
363 for (j=0; j<nl; j++)
364 for (k=0; k<nsize; k++)
365 {
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);
370 }
371}
372
373void Traitement_particulier_NS_THI_VEF_new::ch_vit_pour_fft_VEF_2(DoubleTab& vit_u, DoubleTab& vit_v, DoubleTab& vit_w) const
374{
375 int nsize, nl;
376
377 nl = nb_som_dir; // anciennement nb_som_dir
378 nsize = 3*nl;
379 // nsizes2=nsize/2;
380
381 const DoubleTab& vitesse = mon_equation->inconnue().valeurs();
382 int num_face;
383 int i,j,k;
384
385 for (i=0; i<nl; i++)
386 for (j=0; j<nl; j++)
387 for (k=0; k<nsize; k++)
388 {
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);
393 }
394}
395
396
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
398{
399 const Domaine_dis_base& zdis = mon_equation->domaine_dis();
400 const Domaine& domaine = zdis.domaine();
401 int nb_som = domaine.nb_som();
402 int nl;
403
404 nl = nb_som_dir; // anciennement nb_som_dir
405
406 const DoubleTab& vitesse = mon_equation->inconnue().valeurs();
407 double temps_crt = mon_equation->inconnue().temps();
408 int num_som;
409 int i,j,k;
410
411 //int nb_faces=vitesse.dimension(0);
412 Champ_P1NC& chp=ref_cast_non_const(Champ_P1NC, mon_equation->inconnue());
413 //DoubleTab vit_fac(chp.valeurs());
414 const int nb_comp = vitesse.line_size();
415 DoubleTab vit_som(nb_som, nb_comp);
416 vit_som=valeur_P1_L2(chp, chp.domaine());
417
418 for (i=0; i<nl; i++)
419 for (j=0; j<nl; j++)
420 for (k=0; k<nl; k++)
421 {
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);
426 }
427
428 ////////////////
429 // Rajoute pour ecriture du champ des vitesses dans un fichier
430 // pour nouveau calcul de spectre (postraitement separe).
431 // Ecriture du champ pour un spectre calcule sur la grille a z=cte.
432 ////////////////
433
434 Nom fichier_vit= "chp_vit_VEF_";
435 Nom tps = Nom(temps_crt);
436 fichier_vit += tps;
437 SFichier fic79 (fichier_vit);
438 fic79 << nl <<finl;
439 fic79 << nl <<finl;
440 fic79 << nl <<finl;
441
442 for (i=0; i<nl; i++)
443 for (j=0; j<nl; j++)
444 for (k=0; k<nl; k++)
445 fic79 << vit_u_s(i,j,k) <<finl;
446
447 for (i=0; i<nl; i++)
448 for (j=0; j<nl; j++)
449 for (k=0; k<nl; k++)
450 fic79 << vit_v_s(i,j,k) <<finl;
451
452 for (i=0; i<nl; i++)
453 for (j=0; j<nl; j++)
454 for (k=0; k<nl; k++)
455 fic79 << vit_w_s(i,j,k) <<finl;
456
457
458 Cerr << " OK " << finl;
459}
460
461void Traitement_particulier_NS_THI_VEF_new::determine_new_tab_fft_VEF()
462{
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();
470 calcul_nb_som_dir(domaine);
471 int nsize, nl, ntot;
472
473 nl = nb_som_dir; // anciennement nb_som_dir
474 nsize = 3*nl;
475 // nsizes2=nsize/2;
476 ntot= nl*nl*(nsize+1);
477
478 int nb_faces = domaine_VEF.nb_faces();
479 int num_face,num_som;
480 int ix,iy,iz,ii,jj,kk;
481 //int i,j,k;
482
483 double longueur,d,d3,eps;
484 double xx,yy,zz;
485
486 int compteurx=0;
487 int compteury=0;
488 int compteurz=0;
489
490 // ***************
491
492 longueur = 6.283185307;
493
494 // ***************
495
496 d=longueur/(nl);
497 eps=d/10.;
498 d3=longueur/(nsize);
499 //eps3=d3/10.;
500
501 for(num_face=0; num_face<nb_faces; num_face++)
502 {
503 xx=xv(num_face,0);
504 yy=xv(num_face,1);
505 zz=xv(num_face,2);
506
507 ix=(int)((xx+eps)/d3);
508 iy=(int)((yy+eps)/d3);
509 iz=(int)((zz+eps)/d3);
510
511 if( iz%3==1 && iy%3==1)
512 {
513 compteurx+=1;
514 ii=ix;
515 jj=(int)(iy/3);
516 kk=(int)(iz/3);
517
518 tab_calc_fft(jj,kk,ii)=num_face;
519 }
520
521 if( iz%3==1 && ix%3==2) // le nombre 2 dans le second test n'est pas une erreur :)
522 {
523 compteury+=1;
524 ii=(int)(ix/3);
525 jj=iy;
526 kk=(int)(iz/3);
527
528 tab_calc_fft_1(ii,kk,jj)=num_face;
529 }
530
531 if( ix%3==1 && iy%3==1)
532 {
533 compteurz+=1;
534 ii=(int)(ix/3);
535 jj=(int)(iy/3);
536 kk=iz;
537
538 tab_calc_fft_2(ii,jj,kk)=num_face;
539 }
540 }
541
542 for(num_som=0; num_som<nb_som; num_som++)
543 {
544 xx=coord(num_som,0);
545 yy=coord(num_som,1);
546 zz=coord(num_som,2);
547
548 ii=(int)((xx+eps)/d);
549 jj=(int)((yy+eps)/d);
550 kk=(int)((zz+eps)/d);
551
552 tab_calc_fft_s(ii,jj,kk)=num_som;
553 }
554
555
556 // Verification geometrie
557
558 if( compteurx!=ntot || compteury!=ntot || compteurz!=ntot )
559 {
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;
564 }
565
566 // Nom fic_vit_ = "chp_vit";
567 // SFichier fic79 (fic_vit_);
568
569 // fic79 << 3*(nbpts-1) << finl;
570 // fic79 << (nbpts-1)*(nbpts-1) << finl;
571
572 // for (i=0;i<nbpts-1;i++)
573 // for (j=0;j<nbpts-1;j++)
574 // for (k=0;k<3*(nbpts-1);k++)
575 // fic79 << vit(tab_ind_num(i,j,k),0) << vit(tab_ind_num(i,j,k),1) <<vit(tab_ind_num(i,j,k),2) <<finl;
576
577}
578
579
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)
583{
584
585 DoubleVect trig(2*(nsize));
586 IntVect ifax(19);
587 int lot=1;
588 DoubleVect x(nsize+2),y(nsize+2),z(nsize+2);
589 DoubleVect work(2*nsize*lot);
590 int inc=1;
591 int jump=inc*(nsize+2);
592 int isign=-1;
593 int i,j,k;
594 int nsizes2=nsize/2;
595 Ek=0.;
596 Ec=0.;
597 Dk=0.;
598 Df=0;
599
600 // Initialisation des FFT
601
602 cftfax(nsize,ifax.addr(),trig.addr());
603
604 // Calcul des FFT pour chacune des lignes stockees
605
606
607 for (i=0; i<nl; i++)
608 {
609 for (j=0; j<nl; j++)
610 {
611 for (k=0; k<nsize; k++)
612 {
613 x(k)=vit_u(i,j,k);
614 y(k)=vit_v(i,j,k);
615 z(k)=vit_w(i,j,k);
616 }
617 x(nsize)=x(0);
618 y(nsize)=y(0);
619 z(nsize)=z(0);
620 x(nsize+1)=x(1);
621 y(nsize+1)=y(1);
622 z(nsize+1)=z(1);
623
624
625 rfftmlt(x.addr(),work.addr(),trig.addr(),ifax.addr(),inc,jump,nsize,lot,isign);
626 // rfftmlt(y.addr(),work.addr(),trig.addr(),ifax.addr(),inc,jump,nsize,lot,isign);
627 // rfftmlt(z.addr(),work.addr(),trig.addr(),ifax.addr(),inc,jump,nsize,lot,isign);
628
629
630 for (k=0; k<nsizes2+1; k++)
631 {
632 Ek(k)+=x(2*k)*x(2*k)+x(2*k+1)*x(2*k+1);
633 // y(2*k)*y(2*k)+y(2*k+1)*y(2*k+1);
634 // z(2*k)*z(2*k)+z(2*k+1)*z(2*k+1);
635 }
636 }
637 }
638
639 // Renormalisation de l'Energie et ecriture
640
641 Ek/=(nl*nl);
642 Ek(0)/=2.; // renormalisation specifique pour le mode 0
643
644 Nom fichier = "spectre_";
645 Nom tps = Nom(temps);
646 Cerr << "tps=" << tps << finl;
647 fichier += tps;
648 SFichier fic7 (fichier);
649
650 for (k=0; k<nsizes2; k++)
651 {
652 Dk(k)=k*k*Ek(k);
653 fic7 << k << " " << Ek(k) << " " << Dk(k) << finl ;
654 Ec+=Ek(k);
655 Df+=Dk(k);
656 }
657}
658
659
const Domaine & domaine() const
void filtrer_L2(DoubleTab &x) const
Definition Champ_P1NC.h:127
class Domaine_VEF
Definition Domaine_VEF.h:54
int nb_faces() const
renvoie le nombre global de faces.
Definition Domaine_VF.h:471
double xv(int num_face, int k) const
Definition Domaine_VF.h:76
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,...
Definition Entree.h:42
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 void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
Definition SFichier.h:27
Classe de base des flux de sortie.
Definition Sortie.h:52
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
int line_size() const
Definition TRUSTVect.tpp:67
classe Traitement_particulier_NS_THI_VEF_new Cette classe permet de faire les traitements particulier...
classe Traitement_particulier_THI_new Cette classe permet de faire les traitements particuliers