TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Fourier_trans.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 <Fourier_trans.h>
17#include <IJK_Field_vector.h>
18#include <Domaine_IJK.h>
19#include <TRUSTTab.h>
20#include <communications.h>
21#include <Param.h>
22#include <IJK_Navier_Stokes_tools.h> // pour initialiser les IJK_double
23#include <IJK_Lata_writer.h>
24#include <SFichier.h>
25#include <EFichier.h>
26#include <LecFicDistribue_sansnum.h>
27Implemente_instanciable_sans_constructeur(Fourier_trans,"Fourier_trans",Objet_U);
28
29Fourier_trans::Fourier_trans()
30{
32}
33
34// ici on va # define tous les valeur intermediaire a calculer !!!
35#define U_FOURIER 0
36#define V_FOURIER 1
37#define W_FOURIER 2
38
39#define TRIADIQUE_INPLANE_I_FOURIER 3
40#define TRIADIQUE_INPLANE_J_FOURIER 4
41#define TRIADIQUE_INPLANE_K_FOURIER 5
42
43#define TRIADIQUE_INTERPLANE_I_FOURIER 6
44#define TRIADIQUE_INTERPLANE_J_FOURIER 7
45#define TRIADIQUE_INTERPLANE_K_FOURIER 8
46
47#define DEFORMATION_TURBULENTE_I_FOURIER 9
48#define DEFORMATION_TURBULENTE_J_FOURIER 10
49#define DEFORMATION_TURBULENTE_K_FOURIER 11
50
51#define P_FOURIER 12
52#define PSURRHO_FOURIER 13
53#define DIFFUSION_PRESSION_RHOFLUC_ADERIVE_FOURIER 14
54
55#define DIFFUSION_PRESSION_DERIVRHO_I_FOURIER 15
56#define DIFFUSION_PRESSION_DERIVRHO_J_FOURIER 16
57#define DIFFUSION_PRESSION_DERIVRHO_K_FOURIER 17
58
59#define DISSIPATION_COMPRESSIBLE_UN_II_FOURIER 18
60#define DISSIPATION_COMPRESSIBLE_UN_IJ_FOURIER 19
61#define DISSIPATION_COMPRESSIBLE_UN_IK_FOURIER 20
62#define DISSIPATION_COMPRESSIBLE_UN_JI_FOURIER 21
63#define DISSIPATION_COMPRESSIBLE_UN_JJ_FOURIER 22
64#define DISSIPATION_COMPRESSIBLE_UN_JK_FOURIER 23
65#define DISSIPATION_COMPRESSIBLE_UN_KI_FOURIER 24
66#define DISSIPATION_COMPRESSIBLE_UN_KJ_FOURIER 25
67#define DISSIPATION_COMPRESSIBLE_UN_KK_FOURIER 26
68
69#define DISSIPATION_COMPRESSIBLE_DEUX_II_FOURIER 27
70#define DISSIPATION_COMPRESSIBLE_DEUX_IJ_FOURIER 28
71#define DISSIPATION_COMPRESSIBLE_DEUX_IK_FOURIER 29
72#define DISSIPATION_COMPRESSIBLE_DEUX_JI_FOURIER 30
73#define DISSIPATION_COMPRESSIBLE_DEUX_JJ_FOURIER 31
74#define DISSIPATION_COMPRESSIBLE_DEUX_JK_FOURIER 32
75#define DISSIPATION_COMPRESSIBLE_DEUX_KI_FOURIER 33
76#define DISSIPATION_COMPRESSIBLE_DEUX_KJ_FOURIER 34
77#define DISSIPATION_COMPRESSIBLE_DEUX_KK_FOURIER 35
78
79#define DISSIPATION_COMPRESSIBLE_TROIS_I_FOURIER 36
80#define DISSIPATION_COMPRESSIBLE_TROIS_J_FOURIER 37
81#define DISSIPATION_COMPRESSIBLE_TROIS_K_FOURIER 38
82
83#define DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_UN_I_FOURIER 39
84#define DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_UN_J_FOURIER 40
85#define DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_UN_K_FOURIER 41
86
87#define DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_DEUX_I_FOURIER 42
88#define DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_DEUX_J_FOURIER 43
89#define DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_DEUX_K_FOURIER 44
90
91#define DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_TROIS_FOURIER 45
92
93#define DIFFUSION_VISQUEUSE_DERIVRHO_UN_I_FOURIER 46
94#define DIFFUSION_VISQUEUSE_DERIVRHO_UN_J_FOURIER 47
95#define DIFFUSION_VISQUEUSE_DERIVRHO_UN_K_FOURIER 48
96
97#define DIFFUSION_VISQUEUSE_DERIVRHO_DEUX_I_FOURIER 49
98#define DIFFUSION_VISQUEUSE_DERIVRHO_DEUX_J_FOURIER 50
99#define DIFFUSION_VISQUEUSE_DERIVRHO_DEUX_K_FOURIER 51
100
101#define DIFFUSION_VISQUEUSE_DERIVRHO_TROIS_I_FOURIER 52
102#define DIFFUSION_VISQUEUSE_DERIVRHO_TROIS_J_FOURIER 53
103#define DIFFUSION_VISQUEUSE_DERIVRHO_TROIS_K_FOURIER 54
104
105#define TERME_NON_CLASSE_I_FOURIER 55
106#define TERME_NON_CLASSE_J_FOURIER 56
107#define TERME_NON_CLASSE_K_FOURIER 57
108
109#define DUIDXJ_II_FOURIER 58
110#define DUIDXJ_IJ_FOURIER 59
111#define DUIDXJ_IK_FOURIER 60
112#define DUIDXJ_JI_FOURIER 61
113#define DUIDXJ_JJ_FOURIER 62
114#define DUIDXJ_JK_FOURIER 63
115#define DUIDXJ_KI_FOURIER 64
116#define DUIDXJ_KJ_FOURIER 65
117#define DUIDXJ_KK_FOURIER 66
118
119#define DIVU_FOURIER 67
120
121#define DUIDXJ_II_NONCENTRE_FOURIER 68
122#define DUIDXJ_IJ_NONCENTRE_FOURIER 69
123#define DUIDXJ_IK_NONCENTRE_FOURIER 70
124#define DUIDXJ_JI_NONCENTRE_FOURIER 71
125#define DUIDXJ_JJ_NONCENTRE_FOURIER 72
126#define DUIDXJ_JK_NONCENTRE_FOURIER 73
127#define DUIDXJ_KI_NONCENTRE_FOURIER 74
128#define DUIDXJ_KJ_NONCENTRE_FOURIER 75
129#define DUIDXJ_KK_NONCENTRE_FOURIER 76
130
131#define UIUJ_II_FOURIER 77
132#define UIUJ_IJ_FOURIER 78
133#define UIUJ_IK_FOURIER 79
134//#define UIUJ_JI_FOURIER
135#define UIUJ_JJ_FOURIER 80
136#define UIUJ_JK_FOURIER 81
137//#define UIUJ_KI_FOURIER
138//#define UIUJ_KJ_FOURIER
139#define UIUJ_KK_FOURIER 82
140
141#define UJDUIDXJ_I_FOURIER 83
142#define UJDUIDXJ_J_FOURIER 84
143#define UJDUIDXJ_K_FOURIER 85
144
145#define NVAL_INTER 86
146
147// ICI ON DEFINIT LES TERMES DE SORTIE !!!
148#define RES_UU 0
149#define RES_VV 1
150#define RES_WW 2
151#define RES_PROD_TURB 3
152#define RES_TRIADIQUE_INPLANE 4
153#define RES_TRIADIQUE_INTERPLANE 5
154#define RES_DEFORMATION_TURBULENTE 6
155#define RES_CORRELATION_PRESSION_DIVERGENCE 7
156#define RES_P_WFLUC 8
157#define RES_DIFFUSION_PRESSION_RHOFLUC_ADERIVE 9
158#define RES_DIFFUSION_PRESSION_DERIVRHO 10
159#define RES_DISSIPATION_INCOMPRESSIBLE_UN_AFOISNU_INPLANE 11
160#define RES_DISSIPATION_INCOMPRESSIBLE_UN_AFOISNU_INTERPLANE 12
161#define RES_DISSIPATION_INCOMPRESSIBLE_DEUX_AFOISNU 13
162#define RES_DISSIPATION_COMPRESSIBLE_UN 14
163#define RES_DISSIPATION_COMPRESSIBLE_DEUX 15
164#define RES_DISSIPATION_COMPRESSIBLE_TROIS 16
165#define RES_DIFFUSION_VISQUEUSE_INCOMPRESSIBLE_DEUX 17
166#define RES_DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_UN 18
167#define RES_DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_DEUX 19
168#define RES_DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_TROIS 20
169#define RES_DIFFUSION_VISQUEUSE_DERIVRHO_UN 21
170#define RES_DIFFUSION_VISQUEUSE_DERIVRHO_DEUX 22
171#define RES_DIFFUSION_VISQUEUSE_DERIVRHO_TROIS 23
172#define RES_TERME_NON_CLASSE 24
173#define RES_CONVECTIONTURBULENTE 25
174#define RES_TERMEPUREMENTSPECTRAL 26
175
176#define N_RES 27
177
178// Pour generer cette liste, envoyer la liste des #define dans
179// sed 's/#define /"/g;s/_MOY.*/",/g' >resultat
180// et copier ci-dessous:
181static const char *noms_moyennes[] =
182{
183 "RES_UU",
184 "RES_VV",
185 "RES_WW",
186 "RES_PROD_TURB",
187 "RES_TRIADIQUE_INPLANE",
188 "RES_TRIADIQUE_INTERPLANE",
189 "RES_DEFORMATION_TURBULENTE",
190 "RES_CORRELATION_PRESSION_DIVERGENCE",
191 "RES_P_WFLUC",
192 "RES_DIFFUSION_PRESSION_RHOFLUC_ADERIVE",
193 "RES_DIFFUSION_PRESSION_DERIVRHO",
194 "RES_DISSIPATION_INCOMPRESSIBLE_UN_AFOISNU_INPLANE",
195 "RES_DISSIPATION_INCOMPRESSIBLE_UN_AFOISNU_INTERPLANE",
196 "RES_DISSIPATION_INCOMPRESSIBLE_DEUX_AFOISNU",
197 "RES_DISSIPATION_COMPRESSIBLE_UN",
198 "RES_DISSIPATION_COMPRESSIBLE_DEUX",
199 "RES_DISSIPATION_COMPRESSIBLE_TROIS",
200 "RES_DIFFUSION_VISQUEUSE_INCOMPRESSIBLE_DEUX",
201 "RES_DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_UN",
202 "RES_DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_DEUX",
203 "RES_DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_TROIS",
204 "RES_DIFFUSION_VISQUEUSE_DERIVRHO_UN",
205 "RES_DIFFUSION_VISQUEUSE_DERIVRHO_DEUX",
206 "RES_DIFFUSION_VISQUEUSE_DERIVRHO_TROIS",
207 "RES_TERME_NON_CLASSE",
208 "RES_CONVECTIONTURBULENTE",
209 "RES_TERMEPUREMENTSPECTRAL"
210};
211
212/*
213static inline double calculer_lambda_air(double temperature)
214{
215 const double fac_a = -5.05628e-18 ;
216 const double fac_b = 2.469e-14 ;
217 const double fac_c = -4.98344e-11 ;
218 const double fac_d = 7.06714e-08 ;
219 const double fac_e = 1.0894e-06 ;
220 const double facteur = 1.93198026315789000e-3 / 1.461e-6;
221
222 double val = temperature;
223 double calc = val * fac_a + fac_b;
224 calc = val * calc + fac_c;
225 calc = val * calc + fac_d;
226 calc = val * calc + fac_e;
227 return calc * facteur;
228} */
229
230/*
231static inline double calculer_mu_air(double temperature)
232{
233 const double fac_a = -5.05628e-18 ;
234 const double fac_b = 2.469e-14 ;
235 const double fac_c = -4.98344e-11 ;
236 const double fac_d = 7.06714e-08 ;
237 const double fac_e = 1.0894e-06 ;
238
239 double val = temperature;
240 double calc = val * fac_a + fac_b;
241 calc = val * calc + fac_c;
242 calc = val * calc + fac_d;
243 calc = val * calc + fac_e;
244 return calc;
245} */
246
247// calcule la derivee premiere en maillage anisotrope !!
248static inline double derivee_aniso( double alpha /* rapport des distances a la maille sup et inf */
249 , double un_sur_alpha /* inverse de alpha */
250 , double un_sur_dp_plus_dm /* inverse de la somme des distances aux elems inf et sup */
251 , double val_moins /* valeur dans la maille inf */
252 , double val_centre /* valeur dans la maille */
253 , double val_plus /* valeur dans la maille sup */ )
254{
255 double derivee = (val_plus - val_centre)*un_sur_alpha ; // contribution sup pondere
256 derivee += (val_centre - val_moins )*alpha ; // contribution moins pondere
257 derivee *= un_sur_dp_plus_dm ; // division
258 return derivee;
259}
260
261// static inline double derivee_2_aniso( double un_sur_delta_moins /* inverse da la distance a la maille inf */
262// , double un_sur_delta_plus /* inverse da la distance a la maille sup */
263// , double un_sur_dp_plus_dm /* inverse de la somme des distances aux elems inf et sup */
264// , double val_moins /* valeur dans la maille inf */
265// , double val_centre/* valeur dans la maille */
266// , double val_plus /* valeur dans la maille sup */)
267//{
268// double derivee_2 = (val_plus - val_centre)*un_sur_delta_plus ; // contribution sup pondere
269// derivee_2 -= (val_centre - val_moins )*un_sur_delta_moins ; // contribution moins pondere
270// derivee_2 *= 2. * un_sur_dp_plus_dm ; // division (le 2. disparait naturellement lorsque dp = dm => 2* 1/ (dp + dm ) = 2*1/ 2d = 1/d
271// return derivee_2;
272//}
273
274static void triABulle(ArrOfDouble& tab)
275{
276 int longueur = tab.size_array();
277
278 bool permutation;
279
280 do
281 {
282 permutation = false;
283 for(int i=0; i<(longueur-1); i++)
284 {
285 if(tab[i]>tab[i+1])
286 {
287 double x = tab[i+1];
288 double y = tab[i];
289 tab[i] =x ;
290 tab[i+1]=y;
291 permutation = true;
292 }
293 }
294 longueur--;
295 }
296 while(permutation);
297}
298
299static int retirer_doublons(ArrOfDouble& tab)
300{
301 int doublons = 0;
302 const int taille = tab.size_array();
303
304 /* ne marche que pour des tableaux trie */
305 for (int i =0 ; i < (taille-1) ; i++)
306 {
307 const double x = tab[i];
308 for ( int j = i+1 ; j < taille ; j++)
309 {
310 const double y = tab[j];
311 if ( std::fabs(y-x) <= (y*1.e-3 ))
312 {
313 tab[j] = tab[taille-1]+i; // on va set a une valeur tres grande
314 doublons++;
315 i++;
316 }
317 else
318 {
319 break; // si on a trouver toute ls differences on s'arrette
320 }
321 }
322 }
323 return doublons;
324
325}
326
327static void remplir_ref_ki(ArrOfDouble& tab_k_tri ,DoubleTab& tab_k,IntTab& ref_k)
328{
329 const int Nvect = tab_k_tri.size_array();
330 const int Ni = ref_k.dimension(0);
331 const int Nj = ref_k.dimension(1);
332 for (int i = 0 ; i < Ni; i++ )
333 for (int j = 0 ; j < Nj ; j++)
334 {
335 double x = tab_k(i,j) ; // on cherche cette valeur
336 bool trouver = false;
337 for (int ou = 0; ou < Nvect ; ou++)
338 {
339 double y = tab_k_tri[ou];
340 double compa = x > y ? x : y;
341 if ( std::fabs(y-x) <= (compa*1.e-3) )
342 {
343 ref_k(i,j) = ou;
344 trouver = true;
345 break; // on a trouver donc on sort
346 }
347 }
348
349 if ( !trouver )
350 {
351 Cerr << " Impossible de remplir correctement le tableau des references aux vecteurs, verifier la precision " << finl;
353 }
354 }
355}
356
357/* on met le signal au centre du domaine pour pouvoir en faire une TF !!! */
358static void recentrer_spectres(IJK_Field_double& field,IJK_Field_double& tmp )
359{
360 /* on prefere passer un tableau pour ne pas faire d'allocation (tres tres long) */
361 int kmax= tmp.nk();
362 int jmax= tmp.nj();
363 int imax= tmp.ni();
364 for(int k =0 ; k < kmax ; k++)
365 for(int j = 0 ; j < jmax ; j++)
366 for(int i =0 ; i < imax ; i++)
367 tmp(i,j,k)=field(i,j,k);
368 // pour l'instant on test, si ca marche on mettra ca directement dans la TF !!!!
369 for(int k =0 ; k < kmax ; k++)
370 for(int j = 0 ; j < jmax ; j++)
371 for(int i =0 ; i < imax ; i++)
372 {
373 int i_cor = (i+imax/2)%imax;
374 int j_cor = (j+jmax/2)%jmax;
375 // if( i>=(imax/2)) { i_cor -= imax ; i_cor = abs(i_cor); }
376 // if( j>=(jmax/2)) { j_cor -= jmax ; j_cor = abs(j_cor); }
377 field(i_cor,j_cor,k)= tmp(i,j,k);
378 }
379}
380// Attention, cette methode est appelee apres readOn(),
381// il ne faut pas casser les donnees lues
382void Fourier_trans::initialize(const Domaine_IJK& split_origine,const Domaine_IJK& split,VECT(ArrOfDouble) vmoy, ArrOfDouble rhomoy, ArrOfDouble numoy, double T_KMAX , double T_KMIN, int avec_reprise)
383{
384
385 // static Stat_Counter_Id cnt_TFprepa = statistiques().new_counter(1, "TF_prepa");
386 /* d'abord on initialise la redistribution */
387
388 post_splitting_ = split ;
389 Cerr << "Initialisation du post-traitement spectral" << finl;
394
395 /* on recupere des infos sur le maillage */
396 const int Nk_tot = post_splitting_.get_nb_elem_tot(DIRECTION_K);
397
398 dx_=post_splitting_.get_constant_delta(0); //modif AT 20/06/2013
399 dy_=post_splitting_.get_constant_delta(1); //modif AT 20/06/2013
400 tab_dz_=post_splitting_.get_delta(2); //modif AT 20/06/2013
401 elem_coord_.resize_array(Nk_tot);
402
403 const ArrOfDouble& coord_z = post_splitting_.get_node_coordinates(DIRECTION_K);
404 for (int i = 0; i < Nk_tot; i++)
405 elem_coord_[i] = (coord_z[i] + coord_z[i+1]) * 0.5;
406
407 /* DD 16/10/2015: on recopie le tableau des masses volumiques moyennes */
408 /* il a deja ete adimensionne par statistiques_dns_jk_ */
409 rho_moy_.resize_array(Nk_tot);
410 rho_moy_ = rhomoy;
411 /* DD 16/10/2015: on recopie le tableau des viscosites cinematiques moyennes */
412 /* il a deja ete adimensionne par statistiques_dns_jk_ */
413 nu_moy_.resize_array(Nk_tot);
414 nu_moy_ = numoy;
415
416 /* on recopie le tableau des vitesses moyennes */
417 /* il a deja ete adimensionne par statistiques_dns_jk_ */
418 vit_moy_.dimensionner(3);
419 for (int i = 0; i < 3; i++)
420 vit_moy_[i].resize_array(Nk_tot);
421
422 vit_moy_[0] = vmoy[0];
423 vit_moy_[1] = vmoy[1];
424 vit_moy_[2] = vmoy[2];
425
426 // recuperation des temperatures des CLs
427 TCL_kmax_ = T_KMAX;
428 TCL_kmin_ = T_KMIN;
429
430 /* on dimensionne les tableaux de resultats */
431
432 const int N = N_RES ;
433 for (int i = 0 ; i < N ; i++)
435
436 const int imax = post_splitting_.get_nb_elem_local(DIRECTION_I);
437 const int jmax = post_splitting_.get_nb_elem_local(DIRECTION_J);
438 const int kmax = post_splitting_.get_nb_elem_local(DIRECTION_K);
439 // statistiques().begin_count(cnt_TFprepa);
440 // allou les tableaux des entrees/sortie de la FFT
441 in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) *(imax*jmax));
442 out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) *(imax*jmax));
443
444 plan = fftw_plan_dft_2d(jmax,imax, in, out,FFTW_FORWARD, FFTW_MEASURE );
445 inverseplan = fftw_plan_dft_2d(jmax,imax, in, out,FFTW_BACKWARD, FFTW_MEASURE );
446
447 const int Nval_inter = NVAL_INTER ; // chiffre au hasard pour le moment !!
448 /*
449 Div_U.allocate(post_splitting_, Domaine_IJK::ELEM, 1);
450 Div_U.data()=0;
451
452
453 DUiDx.allocate(post_splitting_, Domaine_IJK::ELEM, 1);
454 DUiDx.data()=0;
455
456
457 DUjDy.allocate(post_splitting_, Domaine_IJK::ELEM, 1);
458 DUjDy.data()=0;
459
460
461 DUkDz.allocate(post_splitting_, Domaine_IJK::ELEM, 1);
462 DUkDz.data()=0;
463 */
464 allocate_velocity(vitesse, post_splitting_, 1);
468 for ( int type = 0 ; type < Nval_inter ; type ++ )
469 {
470 Avant_TF[type].allocate(post_splitting_, Domaine_IJK::ELEM, 1);
471 Reel_TF[type].allocate(post_splitting_, Domaine_IJK::ELEM, 1);
472 Imag_TF[type].allocate(post_splitting_, Domaine_IJK::ELEM, 1);
473 }
474
475 /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
476 * ici on calcule les dimensions des tableaux liee a l'integrale
477 * on commence par calculer la longueur des vecteurs d'ondes
478 * Puis on tri les vecteurs
479 * Puis on retire les doublons
480 * Puis on retri le tableau (pour mettre les doublons a la fin
481 * Enfin on recopie le tableau */
482
483
484 if (avec_reprise)
485 {
486 reprise();
487 }
488 else
489 {
490 DoubleTab Taille_ki(imax,jmax);
491 ArrOfDouble tem_k_tri(imax*jmax);
492
493 const double coeff_x = 1. / ( dx_ * (double)(imax) * dx_ * (double)(imax) );
494 const double coeff_y = 1. / ( dy_ * (double)(jmax) * dy_ * (double)(jmax) );
495
496 for(int j = 0 ; j < jmax ; j++)
497 for(int i =0 ; i < imax ; i++)
498 {
499 const int Indice = i + imax *j;
500 int i_cor = i;
501 int j_cor = j;
502 if( i>=(imax/2))
503 {
504 i_cor -= imax ;
505 }
506 if( j>=(jmax/2))
507 {
508 j_cor -= jmax ;
509 }
510 double x = sqrt( double(i_cor*i_cor)*coeff_x + double(j_cor*j_cor)*coeff_y );
511 Taille_ki(i,j) = x;
512 tem_k_tri[Indice] = x;
513 }
514 // on copie le tableau pour apres
515
516 // on tri le tableau et on supprime les doublons !
517 triABulle(tem_k_tri);
518 int doublons = retirer_doublons(tem_k_tri); // on set a un tres grand nombre les doublons;
519 triABulle(tem_k_tri);
520 const int taille = tem_k_tri.size_array()-doublons;
521 tri_ki.resize_array(taille); // on dimensionne le tableau
522
523 Cerr << " On part de " << imax*jmax << " vecteurs " << finl;
524 Cerr << " On a retire " << doublons << " doublons " << "il reste " << taille << " vecteurs " << finl;
525
526 for( int i = 0 ; i < tri_ki.size_array() ; i++)
527 tri_ki[i]=tem_k_tri[i];
528
529 // ici on definie un tableau qui indique comment les donnees vont etre utilisees pour l'integrale !!!
530 ref_ki.resize(imax, jmax);
531 ref_ki= -1;
532 remplir_ref_ki(tri_ki,Taille_ki,ref_ki);
533
534 TFx_.dimensionner(N);
535 TFy_.dimensionner(N);
536 TFi_.dimensionner(N);
537
538 for ( int n = 0 ; n < N ; n++ )
539 {
540 TFx_[n].resize_array(imax/2*kmax);
541 TFy_[n].resize_array(jmax/2*kmax);
542 TFi_[n].resize_array(taille*kmax);
543 }
544 } // test pour reprise !!
545 // statistiques().end_count(cnt_TFprepa);
546}
547
548
549void Fourier_trans::update(const IJK_Field_vector3_double& vitesse_ori,
550 const IJK_Field_double& pression_ori,
551 const IJK_Field_double& masse_vol_ori,
552 const IJK_Field_double& champ_mu_ori)
553{
554 /* on dimensionne les tableaux d'origine */
555
556 // tableau globaux qui vont contenir les nombres avant et apres TF
557 // attention pas d'echange espace virtuel possible, dans le cas general ca crash !!!!!
558 // ATTENTION ici on declare les tableaux pour stocker les variables temporaires necessaires aux calculs !!
559
560 // static Stat_Counter_Id cnt_redistribution = statistiques().new_counter(2, "TF Redistribution");
561 // statistiques().begin_count(cnt_redistribution);
562 /* on recoit les tableaux dans le spliting de resolution */
563 /* -------------- conversion -------------------*/
564 /* ----------ET mise a jour des ghost ----------*/
565 for (int i = 0; i < 3; i++)
566 {
567 redistribute_to_post_splitting_faces_[i].redistribute(vitesse_ori[i], vitesse[i]);
568 vitesse[i].echange_espace_virtuel(vitesse[i].ghost()); // Ghost
569 }
570 redistribute_to_post_splitting_elem_.redistribute(masse_vol_ori,masse_vol);
571 redistribute_to_post_splitting_elem_.redistribute(pression_ori,pression);
572 redistribute_to_post_splitting_elem_.redistribute(champ_mu_ori,champ_mu);
573 // Ghost
574 masse_vol.echange_espace_virtuel(masse_vol.ghost());
575 pression.echange_espace_virtuel(pression.ghost());
576 champ_mu.echange_espace_virtuel(champ_mu.ghost());
577
578 // statistiques().end_count(cnt_redistribution);
579
580
581 // static Stat_Counter_Id cnt_tableaux = statistiques().new_counter(2, "TF tableau");
582 // statistiques().begin_count(cnt_tableaux);
583
584 const int Nval = NVAL_INTER ; // chiffre au hasard pour le moment !!
585
586 // copie des champs moyen existant
587 const ArrOfDouble& vit_moy_i = vit_moy_[0];
588 const ArrOfDouble& vit_moy_j = vit_moy_[1];
589 const ArrOfDouble& vit_moy_k = vit_moy_[2]; // Ici c'est bien la vitesse aux faces !!!
590 const ArrOfDouble& rho_moy = rho_moy_; // DD 16/10/2015
591 const ArrOfDouble& nu_moy = nu_moy_; // DD 16/10/2015
592
593 // Nombre total de mailles en K
594 const int nktot = post_splitting_.get_nb_items_global(Domaine_IJK::ELEM, DIRECTION_K);
595 // Nombre local de mailles en K
596 const int imax = pression.ni();
597 const int jmax = pression.nj();
598 const int kmax = pression.nk();
599 const int offsetk = post_splitting_.get_offset_local(DIRECTION_K);
600
601 const double unsurdx=1./dx_;
602 const double unsurdy=1./dy_;
603
604 // Copie des champs utiles des vitesses
605 const IJK_Field_double& vitesse_i = vitesse[0];
606 const IJK_Field_double& vitesse_j = vitesse[1];
607 const IJK_Field_double& vitesse_k = vitesse[2];
608
609 // statistiques().end_count(cnt_tableaux);
610
611 // on calcule les proprietes du fluides sur la Cl :
612 /*
613 double mu_kmin = calculer_mu_air(TCL_kmin_);
614 double mu_kmax = calculer_mu_air(TCL_kmax_);
615
616 double lambda_kmin = calculer_lambda_air(TCL_kmin);
617 double lambda_kmax = calculer_lambda_air(TCL_kmax);
618 */
619
620 // static Stat_Counter_Id cnt_calcul_termes = statistiques().new_counter(2, "TF_calcul_termes");
621 // statistiques().begin_count(cnt_calcul_termes);
622
623 /* ******** BOUCLE PRINCIPALE ********* */
624 /* ATTENTION VOLONTAIREMENT ON NE CALCULE PAS LES BORD */
625
626 for (int k = 0; k < kmax; k++)
627 {
628 // Calcul des moyennes spatiales sur le plan ij
629 const int kg=k+offsetk; // position en k sur la grille globale
630 const int paroi_basse = kg == 0 ? 1 : 0 ;
631 const int paroi_haute = ( kg == (nktot-1) ) ? 1 : 0;
632 const int plan_de_paroi = paroi_haute + paroi_basse ;
633
634 if ( !plan_de_paroi )
635 {
636 const double unsurdz=1./tab_dz_[kg]; // taille de la maille dans la direction z
637 double delta_m = ( tab_dz_[kg] + tab_dz_[kg-1] ) * 0.5 ; // distance entre les centre de gravite avec gestion de la paroi !!!
638 double delta_p = ( tab_dz_[kg] + tab_dz_[kg+1] ) * 0.5 ; // distance entre les centre de gravite
639
640
641 double alpha = delta_p/delta_m ; // rapport des distance
642 double unsalpha = delta_m/delta_p ; //
643 double unsdpdm = 1. / ( delta_p + delta_m );
644 double unsdp = 1./ delta_p;
645 double unsdm = 1./ delta_m;
646 // On y stocke la somme de toutes les valeurs sur le plan ij, on divisera apres
647 /* for (int j = 0; j < jmax; j++)
648 for (int i = 0; i < imax; i++) */
649 for (int j = 0; j < jmax; j++)
650 for (int i = 0; i < imax; i++)
651 {
652
653 // calcul des fluctuations de vitesses aux faces.
654 const double uf_i = vitesse_i( i , j , k ) - vit_moy_i[kg];
655 const double uf_ip1 = vitesse_i(i+1, j , k ) - vit_moy_i[kg];
656
657 const double vf_j = vitesse_j( i , j , k ) - vit_moy_j[kg];
658 const double vf_jp1 = vitesse_j( i ,j+1, k ) - vit_moy_j[kg];
659
660 const double wf_k = vitesse_k( i , j , k ) - vit_moy_k[kg];
661 const double wf_kp1 = vitesse_k( i , j ,k+1) - vit_moy_k[kg+1];
662
663 // Fluctuations de vitesses aux elems
664 const double ue = 0.5*(uf_ip1+uf_i);
665 const double ve = 0.5*(vf_jp1+vf_j);
666 const double we = 0.5*(wf_kp1+wf_k);
667
668 // vitesses aux elems
669 const double uetot = 0.5*(vitesse_i(i+1,j,k) + vitesse_i(i,j,k));
670 const double vetot = 0.5*(vitesse_j(i,j+1,k) + vitesse_j(i,j,k));
671 const double wetot = 0.5*(vitesse_k(i,j,k+1) + vitesse_k(i,j,k));
672
673 // calcul des grandeurs composites a partir de ces vitesse !!!
674 const double duidx=(uf_ip1-uf_i)*unsurdx;
675 const double dujdy=(vf_jp1-vf_j)*unsurdy;
676 const double dukdz=(wf_kp1-wf_k)*unsurdz;
677 const double divu= duidx+dujdy+dukdz;
678
679 // calcul des grandeurs scalaire !!
680 const double unsurrho=1./masse_vol(i,j,k);
681 const double rho = masse_vol(i,j,k);
682 const double mu = champ_mu(i,j,k);
683 const double nu = mu * unsurrho;
684 const double p = pression(i,j,k);
685 const double unsurrho_moy = 1./ rho_moy[kg];
686 const double rho_fluc = (rho - rho_moy[kg]);
687 const double nu_fluc = (nu - nu_moy[kg]);
688
689 const double drhodx = ( masse_vol(i+1,j,k) - masse_vol(i-1,j,k) ) * 0.5 * unsurdx;
690 const double drhody = ( masse_vol(i,j+1,k) - masse_vol(i,j-1,k) ) * 0.5 * unsurdx;
691 const double drhodz = derivee_aniso(alpha, unsalpha, unsdpdm, masse_vol(i,j,k-1), rho, masse_vol(i,j,k+1));
692
693 // derivation direction z
694 double Uf_mk_0 = kg == 0 ? 0. : vitesse_i(i,j,k-1) - vit_moy_i[kg-1];
695 double Uf_pk_0 = kg == (nktot-1) ? 0. : vitesse_i(i,j,k+1) - vit_moy_i[kg+1];
696 double duidz_0 = derivee_aniso(alpha, unsalpha, unsdpdm, Uf_mk_0, uf_i, Uf_pk_0);
697
698 double Uf_mk_1 = kg == 0 ? 0. : vitesse_i(i+1,j,k-1) - vit_moy_i[kg-1];
699 double Uf_pk_1 = kg == (nktot-1) ? 0. : vitesse_i(i+1,j,k+1) - vit_moy_i[kg+1];
700 double duidz_1 = derivee_aniso(alpha, unsalpha, unsdpdm, Uf_mk_1, uf_i, Uf_pk_1);
701
702 double Uf_mk_0_tot = kg == 0 ? 0. : vitesse_i(i,j,k-1);
703 double Uf_pk_0_tot = kg == (nktot-1) ? 0. : vitesse_i(i,j,k+1);
704 double duidz_0_tot = derivee_aniso(alpha, unsalpha, unsdpdm, Uf_mk_0_tot, vitesse_i(i,j,k), Uf_pk_0_tot);
705
706 double Uf_mk_1_tot = kg == 0 ? 0. : vitesse_i(i+1,j,k-1);
707 double Uf_pk_1_tot = kg == (nktot-1) ? 0. : vitesse_i(i+1,j,k+1);
708 double duidz_1_tot = derivee_aniso(alpha, unsalpha, unsdpdm, Uf_mk_1_tot, vitesse_i(i+1,j,k), Uf_pk_1_tot);
709
710 double Vf_mk= kg == 0 ? 0. : vitesse_j(i,j,k-1)-vit_moy_j[kg-1];
711 double Vf_pk= kg == (nktot-1) ? 0. : vitesse_j(i,j,k+1)-vit_moy_j[kg+1];
712 double dujdz_0 = derivee_aniso(alpha, unsalpha, unsdpdm, Vf_mk, vf_j, Vf_pk);
713
714 double Vf_mk_1= kg == 0 ? 0. : vitesse_j(i,j+1,k-1)-vit_moy_j[kg-1]; // on gere la paroi
715 double Vf_pk_1= kg == (nktot-1) ? 0. : vitesse_j(i,j+1,k+1)-vit_moy_j[kg+1]; // on gere la paroi
716 double dujdz_1 = derivee_aniso(alpha , unsalpha ,unsdpdm ,Vf_mk_1, vf_jp1 , Vf_pk_1);
717
718 // Transfert Triadique
719 // on commence par calculer les produits colineaires dans l'axe.
720 double duiidx = (uf_ip1*uf_ip1 - uf_i*uf_i) * unsurdx;
721 double dujjdy = (vf_jp1*vf_jp1 - vf_j*vf_j) * unsurdy;
722 double dukkdz = (wf_kp1*wf_kp1 - wf_k*wf_k) * unsurdz;
723
724 // puis les produit mixtes on decompose la somme pour faire apparaitre la composante de div de u !!!!
725 // pour u_i
726 // on va calculer la valeur de duidxj sur les deux face qui portent uj puis faire la moyenne !!!
727 double vjduidy = vf_j * 0.5 * unsurdy * ( ( uf_ip1 - vitesse_i(i+1,j-1, k ) + vit_moy_i[ kg ] )
728 + ( uf_i - vitesse_i( i ,j-1, k ) + vit_moy_i[ kg ] ) );
729 double vj_p1duidy = vf_jp1 * 0.5 * unsurdy * ( ( -uf_ip1 + vitesse_i(i+1,j+1, k ) - vit_moy_i[ kg ] )
730 + ( -uf_i + vitesse_i( i ,j+1, k ) - vit_moy_i[ kg ] ) );
731
732 double wkduidz = wf_k * 0.5 * unsdm * ( ( uf_ip1 - vitesse_i(i+1, j ,k-1) + vit_moy_i[kg-1] )
733 + ( uf_i - vitesse_i( i , j ,k-1) + vit_moy_i[kg-1] ) );
734 double wk_p1duidz = wf_kp1 * 0.5 * unsdp * ( ( -uf_ip1 + vitesse_i(i+1, j ,k+1) - vit_moy_i[kg+1] )
735 + ( -uf_i + vitesse_i( i , j ,k+1) - vit_moy_i[kg+1] ) );
736
737 double duijdy = ue * dujdy + 0.5 * ( vjduidy + vj_p1duidy );
738 double duikdz = ue * dukdz + 0.5 * ( wkduidz + wk_p1duidz );
739
740 // pout u_j
741 double uidujdx = uf_i * 0.5 * unsurdx * ( ( vf_jp1 - vitesse_j(i-1,j+1, k ) + vit_moy_j[ kg ] )
742 + ( vf_j - vitesse_j(i-1, j , k ) + vit_moy_j[ kg ] ) );
743 double ui_p1dujdx = uf_ip1 * 0.5 * unsurdx * ( ( -vf_jp1 + vitesse_j(i+1,j+1, k ) - vit_moy_j[ kg ] )
744 + ( -vf_j + vitesse_j(i+1, j , k ) - vit_moy_j[ kg ] ) );
745
746 double wkdujdz = wf_k * 0.5 * unsdm * ( ( vf_jp1 - vitesse_j( i ,j+1,k-1) + vit_moy_j[kg-1] )
747 + ( vf_j - vitesse_j( i , j ,k-1) + vit_moy_j[kg-1] ) );
748 double wk_p1dujdz = wf_kp1 * 0.5 * unsdp * ( ( -vf_jp1 + vitesse_j( i ,j+1,k+1) - vit_moy_j[kg+1] )
749 + ( -vf_j + vitesse_j( i , j ,k+1) - vit_moy_j[kg+1] ) );
750
751 double dujidx = ve * duidx + 0.5 * ( uidujdx + ui_p1dujdx );
752 double dujkdz = ve * dukdz + 0.5 * ( wkdujdz + wk_p1dujdz );
753
754 // pour u_k
755 double uidukdx = uf_i * 0.5 * unsurdx * ( ( wf_kp1 - vitesse_k(i-1, j ,k+1) + vit_moy_k[kg+1] )
756 + ( wf_k - vitesse_k(i-1, j , k ) + vit_moy_k[ kg ] ) );
757 double ui_p1dukdx = uf_ip1 * 0.5 * unsurdx * ( ( -wf_kp1 + vitesse_k(i+1, j ,k+1) - vit_moy_k[kg+1] )
758 + ( -wf_k + vitesse_k(i+1, j , k ) - vit_moy_k[ kg ] ) );
759
760 double vjdukdy = vf_j * 0.5 * unsurdy * ( ( wf_kp1 - vitesse_k( i ,j-1,k+1) + vit_moy_k[kg+1] )
761 + ( wf_k - vitesse_k( i ,j-1, k ) + vit_moy_k[ kg ] ) );
762 double vj_p1dukdy = vf_jp1 * 0.5 * unsurdy * ( ( -wf_kp1 + vitesse_k( i ,j+1,k+1) - vit_moy_k[kg+1] )
763 + ( -wf_k + vitesse_k( i ,j+1, k ) - vit_moy_k[ kg ] ) );
764
765 double dukidx = we * duidx + 0.5 * ( uidukdx + ui_p1dukdx );
766 double dukjdy = we * dujdy + 0.5 * ( vjdukdy + vj_p1dukdy );
767
768 // ---
769 double Uf_mj = vitesse_i(i,j-1,k)-vit_moy_i[kg];
770 double duidy_0 = (uf_i - Uf_mj ) * unsurdy;
771
772 double Vf_im = vitesse_j(i-1,j,k)-vit_moy_j[kg];
773 double dujdx_0 = (vf_j - Vf_im ) * unsurdx;
774
775 double Wf_mi = vitesse_k(i-1,j,k)-vit_moy_k[kg];
776 double dukdx_0 = (wf_k - Wf_mi ) * unsurdx;
777
778 double Wf_mipk = vitesse_k(i-1,j,k+1)-vit_moy_k[kg+1];
779 double dukdx_1 = (wf_kp1 - Wf_mipk ) * unsurdx;
780
781 double Wf_mj = vitesse_k(i,j-1,k)-vit_moy_k[kg];
782 double dukdy_0 = (wf_k - Wf_mj ) * unsurdy;
783
784 double Wf_mj_pk = vitesse_k(i,j-1,k+1)-vit_moy_k[kg+1];
785 double dukdy_1 = (wf_kp1 - Wf_mj_pk ) * unsurdy;
786
787 // ---
788
789 double nu_arrette_ij = 0.25*( ( champ_mu(i,j,k) /masse_vol(i,j,k))
790 + ( champ_mu(i-1,j,k) /masse_vol(i-1,j,k))
791 + ( champ_mu(i,j-1,k) /masse_vol(i,j-1,k))
792 + ( champ_mu(i-1,j-1,k)/masse_vol(i-1,j-1,k)) );
793
794 double nu_face_i = 0.5 *( ( champ_mu(i,j,k) /masse_vol(i,j,k))
795 + ( champ_mu(i-1,j,k)/masse_vol(i-1,j,k)) );
796
797 double nu_face_j = 0.5 *( ( champ_mu(i,j,k) /masse_vol(i,j,k))
798 + ( champ_mu(i,j-1,k)/masse_vol(i,j-1,k)) );
799
800 // ------------------------------------------------------------
801 // ============================================================
802 const double duidz = 0.5*(duidz_0 + duidz_1);
803 const double dujdz = 0.5*(dujdz_0 + dujdz_1);
804 const double duidz_tot = 0.5*(duidz_0_tot + duidz_1_tot);
805 const double dukdz_tot = (vitesse_k(i,j,k+1) - vitesse_k(i,j,k)) * unsurdz;
806 const double divtotu = duidx + dujdy + dukdz_tot;
807
808 const double Ve_mi = 0.5 * ( (vitesse_j(i-1,j,k) - vit_moy_j[kg]) + (vitesse_j(i-1,j+1,k) - vit_moy_j[kg]) );
809 const double Ve_pi = 0.5 * ( (vitesse_j(i+1,j,k) - vit_moy_j[kg]) + (vitesse_j(i+1,j+1,k) - vit_moy_j[kg]) );
810 const double dujdx = (Ve_pi - Ve_mi) * 0.5 * unsurdx;
811
812 const double We_mi = 0.5 * ( (vitesse_k(i-1,j,k) - vit_moy_k[kg]) + (vitesse_k(i-1,j,k+1) - vit_moy_k[kg+1]) );
813 const double We_pi = 0.5 * ( (vitesse_k(i+1,j,k) - vit_moy_k[kg]) + (vitesse_k(i+1,j,k+1) - vit_moy_k[kg+1]) );
814 const double dukdx = (We_pi - We_mi) * 0.5 * unsurdx;
815
816 const double Ue_mj = 0.5*( (vitesse_i(i,j-1,k) - vit_moy_i[kg]) + (vitesse_i(i+1,j-1,k) - vit_moy_i[kg]) );
817 const double Ue_pj = 0.5*( (vitesse_i(i,j+1,k) - vit_moy_i[kg]) + (vitesse_i(i+1,j+1,k) - vit_moy_i[kg]) );
818 const double duidy = (Ue_pj - Ue_mj) * 0.5 * unsurdy;
819
820 const double We_mj = 0.5*( (vitesse_k(i,j-1,k) - vit_moy_k[kg]) + (vitesse_k(i,j-1,k+1) - vit_moy_k[kg+1]) );
821 const double We_pj = 0.5*( (vitesse_k(i,j+1,k) - vit_moy_k[kg]) + (vitesse_k(i,j+1,k+1) - vit_moy_k[kg+1]) );
822 const double dukdy = (We_pj - We_mj ) * 0.5 * unsurdy;
823
824 // ------------------------------------------------------------
825 // PRODUCTION
826 // ------------------------------------------------------------
827 // production incompressible
828 // <\w{ux}*\ \w{uy}> [d<Ux>/dy]
829
830 // production thermique
831 // <\w{uy}*\ \w{uy}> [d<Uy>/dy]
832
833 // ------------------------------------------------------------
834 // ADVECTION
835 // ------------------------------------------------------------
836 // [<Uy>] [d<Ec>/dy] ; Ec=w{ui}* w{ui} /2
837
838 // ------------------------------------------------------------
839 // TRANSFERT TRIADIQUE
840 // ------------------------------------------------------------
841 // transfert triadique dans le plan
842 // <w{ui}* w{d(ui uj)/dx_j}>, j=x,z
843 const double duijdxj_i = duiidx + duijdy;
844 const double duijdxj_j = dujidx + dujjdy;
845 const double duijdxj_k = dukidx + dukjdy;
846
847 // transfert triadique interplan
848 // <w{ui}* w{d(ui uj)/dxj}>, j=y
849 // const double duikdz_i = duikdz;
850 // const double duikdz_j = dujkdz;
851 // const double duikdz_k = dukkdz;
852
853 // ------------------------------------------------------------
854 // DEFORMATION TURBULENTE
855 // ------------------------------------------------------------
856 // <w{ui}* w{ui dujdx_j}>
857 double uidujdxj_i = ue * divu;
858 double uidujdxj_j = ve * divu;
859 double uidujdxj_k = we * divu;
860
861 // ------------------------------------------------------------
862 // CORRELATION PRESSION-DILATATION
863 // ------------------------------------------------------------
864 // <\w{duidx_i}*\ w{P/rho}>
865 const double p_unsrho = p * unsurrho;
866
867 // ------------------------------------------------------------
868 // DIFFUSION PAR LA PRESSION
869 // ------------------------------------------------------------
870 // diffusion par la pression incompressible
871 // [1/<rho>] <[d/dy](\w{uy}*\ \w{P}\‍)>
872
873 // diffusion par la pression compressible, en d<rho>/dy
874 // [<w{uy}* w{P}>/<rho>2] [<d<rho>/dy]
875 // meme terme que pour "diffusion par la pression incompressible"
876
877 // diffusion par la pression compressible, en rho' et rho
878 // <[d/dy]((w{uy}* w{P rho')/(<rho> rho)})>
879 const double rhofluc_unsrho_unsrhomoy_P = p * rho_fluc * unsurrho_moy * unsurrho;
880
881 // diffusion par la pression compressible, en drho
882 // <w{ui}* w{P/rho2 drho/dxi}>
883 const double unsrho_unsrho_P_drhodxi_i = p * unsurrho * unsurrho * drhodx;
884 const double unsrho_unsrho_P_drhodxi_j = p * unsurrho * unsurrho * drhody;
885 const double unsrho_unsrho_P_drhodxi_k = p * unsurrho * unsurrho * drhodz;
886
887 // ------------------------------------------------------------
888 // DISSIPATION
889 // ------------------------------------------------------------
890 // dissipation incompressible, premiere partie
891 // [<nu>] <\w{dui/dx_j}*\ \w{dui/dx_j}> = 2 [<nu>] [k2 <Ec>] ; Ec=w{ui}* w{ui} /2
892
893 // dissipation incompressible, seconde partie
894 // [<nu>] <\w{dui/dx_j}*\ \w{duj/dx_i}>
895
896 // dissipation compressible, premiere partie
897 // <\w{dui/dx_j}*\ w{nu' dUi/dx_j}>
898 const double somme_nufluc_dUidxj_ii = nu_fluc * duidx;
899 const double somme_nufluc_dUidxj_ij = (nu_arrette_ij - nu_moy[kg]) * duidy_0;
900 const double somme_nufluc_dUidxj_ik = (nu_face_i - nu_moy[kg]) * duidz_0_tot;
901 const double somme_nufluc_dUidxj_ji = (nu_arrette_ij - nu_moy[kg]) * dujdx_0;
902 const double somme_nufluc_dUidxj_jj = nu_fluc * dujdy;
903 const double somme_nufluc_dUidxj_jk = (nu_face_j - nu_moy[kg]) * dujdz_0;
904 const double somme_nufluc_dUidxj_ki = (nu_face_i - nu_moy[kg]) * ((dukdx_0 + dukdx_1)*0.5);
905 const double somme_nufluc_dUidxj_kj = (nu_face_j - nu_moy[kg]) * ((dukdy_0 + dukdy_1)*0.5);
906 const double somme_nufluc_dUidxj_kk = nu_fluc * dukdz_tot;
907
908 // dissipation compressible, seconde partie
909 // <\w{dui/dx_j}*\ w{nu' dUj/dx_i}>
910 // meme terme que pour "dissipation compressible, premiere partie"
911 const double somme_nufluc_dUjdxi_ii = nu_fluc * duidx;
912 const double somme_nufluc_dUjdxi_ij = nu_fluc * dujdx;
913 const double somme_nufluc_dUjdxi_ik = nu_fluc * dukdx;
914 const double somme_nufluc_dUjdxi_ji = nu_fluc * duidy;
915 const double somme_nufluc_dUjdxi_jj = nu_fluc * dujdy;
916 const double somme_nufluc_dUjdxi_jk = nu_fluc * dukdy;
917 const double somme_nufluc_dUjdxi_ki = nu_fluc * duidz_tot;
918 const double somme_nufluc_dUjdxi_kj = nu_fluc * dujdz;
919 const double somme_nufluc_dUjdxi_kk = nu_fluc * dukdz_tot;
920
921 // dissipation compressible, troisieme partie
922 // <\w{dui/dx_i}*\ w{2/3 nu' dUj/dx_j}>
923 const double deuxtiers_nu_divU = (2./3.) * nu * divtotu;
924
925 // ------------------------------------------------------------
926 // DIFFUSION VISQUEUSE
927 // ------------------------------------------------------------
928 // diffusion visqueuse incompressible, premiere partie
929 // [<nu>] [d2<Ec>/dy2] ; Ec=w{ui}* w{ui} /2
930
931 // diffusion visqueuse incompressible, seconde partie
932 // [<nu>] <[d/dy](\w{ui}*\ w{duy/dx_i})>
933 // const double dukdx_i = dukdx;
934 // const double dukdx_j = dukdy;
935 // const double dukdx_k = dukdz;
936
937 // diffusion visqueuse compressible, en d<nu>/dy, premiere partie
938 // [d<nu>dy] [d<Ec>/dy] ; Ec=w{ui}* w{ui} /2
939
940 // diffusion visqueuse compressible, en d<nu>/dy, seconde partie
941 // [d<nu>dy] [d(w{ui}* w{duy/dx_i})/dy]
942 // meme terme que pour "diffusion visqueuse incompressible, seconde partie"
943
944 // diffusion visqueuse compressible, en nu' et nu, premiere partie
945 // <[d/dy](\w{ui}*\ w{nu' dUidy})>
946 const double somme_nufluc_dUidxk_i = nu_fluc * duidz_tot;
947 const double somme_nufluc_dUidxk_j = nu_fluc * dujdz;
948 const double somme_nufluc_dUidxk_k = nu_fluc * dukdz_tot;
949
950 // diffusion visqueuse compressible, en nu' et nu, seconde partie
951 // <[d/dy](\w{ui}*\ w{nu' dUydx_i})>
952 const double somme_nufluc_dUkdxi_i = nu_fluc * dukdx;
953 const double somme_nufluc_dUkdxi_j = nu_fluc * dukdy;
954 const double somme_nufluc_dUkdxi_k = nu_fluc * dukdz_tot;
955
956 // diffusion visqueuse compressible, en nu' et nu, troisieme partie
957 // <2/3 [d/dy](\w{uy}*\ w{nu dUydy})>
958 const double somme_deuxtiers_nu_divU = (2./3.) * nu * divtotu;
959
960 // diffusion visqueuse compressible, en drho, premiere partie
961 // <\w{ui}*\ w{nu/rho dUi/dx_j drho/dx_j}>
962 const double somme_nusrho_dUidxj_drhodxj_i = nu * unsurrho * (drhodx*duidx + drhody*duidy + drhodz*duidz_tot);
963 const double somme_nusrho_dUidxj_drhodxj_j = nu * unsurrho * (drhodx*dujdx + drhody*dujdy + drhodz*dujdz);
964 const double somme_nusrho_dUidxj_drhodxj_k = nu * unsurrho * (drhodx*dukdx + drhody*dukdy + drhodz*dukdz_tot);
965
966 // diffusion visqueuse compressible, en drho, seconde partie
967 // <\w{ui}*\ w{nu/rho dUj/dx_i drho/dx_j}>
968 const double somme_nusrho_dUjdxi_drhodxj_i = nu * unsurrho * (drhodx*duidx + drhody*dujdx + drhodz*dukdx);
969 const double somme_nusrho_dUjdxi_drhodxj_j = nu * unsurrho * (drhodx*duidy + drhody*dujdy + drhodz*dukdy);
970 const double somme_nusrho_dUjdxi_drhodxj_k = nu * unsurrho * (drhodx*duidz_tot + drhody*dujdz + drhodz*dukdz_tot);
971
972 // diffusion visqueuse compressible, en drho, troisieme partie
973 // <\w{ui}*\ w{2/3 nu/rho dUj/dx_j drho/dx_i}>
974 const double somme_deuxtiers_nusrho_divU_drhodxi_i = (2./3.) * nu * unsurrho * drhodx * divtotu;
975 const double somme_deuxtiers_nusrho_divU_drhodxi_j = (2./3.) * nu * unsurrho * drhody * divtotu;
976 const double somme_deuxtiers_nusrho_divU_drhodxi_k = (2./3.) * nu * unsurrho * drhodz * divtotu;
977
978 // ------------------------------------------------------------
979 // TERME NON CLASSE
980 // ------------------------------------------------------------
981 // <\w{ui}*\ w{1/rho Uj ui drho/dx_j}>
982 const double somme_unsrho_ui_Uj_drhodxj_i = unsurrho * ue * (uetot*drhodx + vetot*drhody + wetot*drhodz);
983 const double somme_unsrho_ui_Uj_drhodxj_j = unsurrho * ve * (uetot*drhodx + vetot*drhody + wetot*drhodz);
984 const double somme_unsrho_ui_Uj_drhodxj_k = unsurrho * we * (uetot*drhodx + vetot*drhody + wetot*drhodz);
985
986 // ------------------------------------------------------------
987 // ============================================================
988
989#define REMPLIR(quoi,avec) Avant_TF[quoi](i,j,k) = avec
990
991 REMPLIR(U_FOURIER, ue);
992 REMPLIR(V_FOURIER, ve);
993 REMPLIR(W_FOURIER, wf_k);
994
995 REMPLIR(TRIADIQUE_INPLANE_I_FOURIER, - duijdxj_i);
996 REMPLIR(TRIADIQUE_INPLANE_J_FOURIER, - duijdxj_j);
997 REMPLIR(TRIADIQUE_INPLANE_K_FOURIER, - duijdxj_k);
998
999 REMPLIR(TRIADIQUE_INTERPLANE_I_FOURIER, - duikdz);
1000 REMPLIR(TRIADIQUE_INTERPLANE_J_FOURIER, - dujkdz);
1001 REMPLIR(TRIADIQUE_INTERPLANE_K_FOURIER, - dukkdz);
1002
1003 REMPLIR(DEFORMATION_TURBULENTE_I_FOURIER, uidujdxj_i);
1004 REMPLIR(DEFORMATION_TURBULENTE_J_FOURIER, uidujdxj_j);
1005 REMPLIR(DEFORMATION_TURBULENTE_K_FOURIER, uidujdxj_k);
1006
1007 REMPLIR(P_FOURIER, p);
1008 REMPLIR(PSURRHO_FOURIER, p_unsrho);
1009 REMPLIR(DIFFUSION_PRESSION_RHOFLUC_ADERIVE_FOURIER, rhofluc_unsrho_unsrhomoy_P);
1010
1011 REMPLIR(DIFFUSION_PRESSION_DERIVRHO_I_FOURIER, - unsrho_unsrho_P_drhodxi_i);
1012 REMPLIR(DIFFUSION_PRESSION_DERIVRHO_J_FOURIER, - unsrho_unsrho_P_drhodxi_j);
1013 REMPLIR(DIFFUSION_PRESSION_DERIVRHO_K_FOURIER, - unsrho_unsrho_P_drhodxi_k);
1014
1015 REMPLIR(DISSIPATION_COMPRESSIBLE_UN_II_FOURIER, - somme_nufluc_dUidxj_ii);
1016 REMPLIR(DISSIPATION_COMPRESSIBLE_UN_IJ_FOURIER, - somme_nufluc_dUidxj_ij);
1017 REMPLIR(DISSIPATION_COMPRESSIBLE_UN_IK_FOURIER, - somme_nufluc_dUidxj_ik);
1018 REMPLIR(DISSIPATION_COMPRESSIBLE_UN_JI_FOURIER, - somme_nufluc_dUidxj_ji);
1019 REMPLIR(DISSIPATION_COMPRESSIBLE_UN_JJ_FOURIER, - somme_nufluc_dUidxj_jj);
1020 REMPLIR(DISSIPATION_COMPRESSIBLE_UN_JK_FOURIER, - somme_nufluc_dUidxj_jk);
1021 REMPLIR(DISSIPATION_COMPRESSIBLE_UN_KI_FOURIER, - somme_nufluc_dUidxj_ki);
1022 REMPLIR(DISSIPATION_COMPRESSIBLE_UN_KJ_FOURIER, - somme_nufluc_dUidxj_kj);
1023 REMPLIR(DISSIPATION_COMPRESSIBLE_UN_KK_FOURIER, - somme_nufluc_dUidxj_kk);
1024
1025 REMPLIR(DISSIPATION_COMPRESSIBLE_DEUX_II_FOURIER, - somme_nufluc_dUjdxi_ii);
1026 REMPLIR(DISSIPATION_COMPRESSIBLE_DEUX_IJ_FOURIER, - somme_nufluc_dUjdxi_ij);
1027 REMPLIR(DISSIPATION_COMPRESSIBLE_DEUX_IK_FOURIER, - somme_nufluc_dUjdxi_ik);
1028 REMPLIR(DISSIPATION_COMPRESSIBLE_DEUX_JI_FOURIER, - somme_nufluc_dUjdxi_ji);
1029 REMPLIR(DISSIPATION_COMPRESSIBLE_DEUX_JJ_FOURIER, - somme_nufluc_dUjdxi_jj);
1030 REMPLIR(DISSIPATION_COMPRESSIBLE_DEUX_JK_FOURIER, - somme_nufluc_dUjdxi_jk);
1031 REMPLIR(DISSIPATION_COMPRESSIBLE_DEUX_KI_FOURIER, - somme_nufluc_dUjdxi_ki);
1032 REMPLIR(DISSIPATION_COMPRESSIBLE_DEUX_KJ_FOURIER, - somme_nufluc_dUjdxi_kj);
1033 REMPLIR(DISSIPATION_COMPRESSIBLE_DEUX_KK_FOURIER, - somme_nufluc_dUjdxi_kk);
1034
1035 REMPLIR(DISSIPATION_COMPRESSIBLE_TROIS_I_FOURIER, deuxtiers_nu_divU);
1036 REMPLIR(DISSIPATION_COMPRESSIBLE_TROIS_J_FOURIER, deuxtiers_nu_divU);
1037 REMPLIR(DISSIPATION_COMPRESSIBLE_TROIS_K_FOURIER, deuxtiers_nu_divU);
1038
1039 REMPLIR(DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_UN_I_FOURIER, somme_nufluc_dUidxk_i);
1040 REMPLIR(DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_UN_J_FOURIER, somme_nufluc_dUidxk_j);
1041 REMPLIR(DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_UN_K_FOURIER, somme_nufluc_dUidxk_k);
1042
1043 REMPLIR(DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_DEUX_I_FOURIER, somme_nufluc_dUkdxi_i);
1044 REMPLIR(DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_DEUX_J_FOURIER, somme_nufluc_dUkdxi_j);
1045 REMPLIR(DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_DEUX_K_FOURIER, somme_nufluc_dUkdxi_k);
1046
1047 REMPLIR(DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_TROIS_FOURIER, - somme_deuxtiers_nu_divU);
1048
1049 REMPLIR(DIFFUSION_VISQUEUSE_DERIVRHO_UN_I_FOURIER, somme_nusrho_dUidxj_drhodxj_i);
1050 REMPLIR(DIFFUSION_VISQUEUSE_DERIVRHO_UN_J_FOURIER, somme_nusrho_dUidxj_drhodxj_j);
1051 REMPLIR(DIFFUSION_VISQUEUSE_DERIVRHO_UN_K_FOURIER, somme_nusrho_dUidxj_drhodxj_k);
1052
1053 REMPLIR(DIFFUSION_VISQUEUSE_DERIVRHO_DEUX_I_FOURIER, somme_nusrho_dUjdxi_drhodxj_i);
1054 REMPLIR(DIFFUSION_VISQUEUSE_DERIVRHO_DEUX_J_FOURIER, somme_nusrho_dUjdxi_drhodxj_j);
1055 REMPLIR(DIFFUSION_VISQUEUSE_DERIVRHO_DEUX_K_FOURIER, somme_nusrho_dUjdxi_drhodxj_k);
1056
1057 REMPLIR(DIFFUSION_VISQUEUSE_DERIVRHO_TROIS_I_FOURIER, - somme_deuxtiers_nusrho_divU_drhodxi_i);
1058 REMPLIR(DIFFUSION_VISQUEUSE_DERIVRHO_TROIS_J_FOURIER, - somme_deuxtiers_nusrho_divU_drhodxi_j);
1059 REMPLIR(DIFFUSION_VISQUEUSE_DERIVRHO_TROIS_K_FOURIER, - somme_deuxtiers_nusrho_divU_drhodxi_k);
1060
1061 REMPLIR(TERME_NON_CLASSE_I_FOURIER, somme_unsrho_ui_Uj_drhodxj_i);
1062 REMPLIR(TERME_NON_CLASSE_J_FOURIER, somme_unsrho_ui_Uj_drhodxj_j);
1063 REMPLIR(TERME_NON_CLASSE_K_FOURIER, somme_unsrho_ui_Uj_drhodxj_k);
1064
1065 REMPLIR(DUIDXJ_II_FOURIER, duidx);
1066 REMPLIR(DUIDXJ_IJ_FOURIER, duidy);
1067 REMPLIR(DUIDXJ_IK_FOURIER, duidz);
1068 REMPLIR(DUIDXJ_JI_FOURIER, dujdx);
1069 REMPLIR(DUIDXJ_JJ_FOURIER, dujdy);
1070 REMPLIR(DUIDXJ_JK_FOURIER, dujdz);
1071 REMPLIR(DUIDXJ_KI_FOURIER, dukdx);
1072 REMPLIR(DUIDXJ_KJ_FOURIER, dukdy);
1073 REMPLIR(DUIDXJ_KK_FOURIER, dukdz);
1074
1075 REMPLIR(DIVU_FOURIER, divu);
1076
1077 // pour la dissipation incompressible_un ou compressible_un
1078 // on a pas besoin et l'on ne veut pas de derivees centrees
1079 REMPLIR(DUIDXJ_II_NONCENTRE_FOURIER, duidx);
1080 REMPLIR(DUIDXJ_IJ_NONCENTRE_FOURIER, duidy_0);
1081 REMPLIR(DUIDXJ_IK_NONCENTRE_FOURIER, duidz_0);
1082 REMPLIR(DUIDXJ_JI_NONCENTRE_FOURIER, dujdx_0);
1083 REMPLIR(DUIDXJ_JJ_NONCENTRE_FOURIER, dujdy);
1084 REMPLIR(DUIDXJ_JK_NONCENTRE_FOURIER, dujdz_0);
1085 REMPLIR(DUIDXJ_KI_NONCENTRE_FOURIER, (dukdx_0 + dukdx_1) * 0.5);
1086 REMPLIR(DUIDXJ_KJ_NONCENTRE_FOURIER, (dukdy_0 + dukdy_1) * 0.5);
1087 REMPLIR(DUIDXJ_KK_NONCENTRE_FOURIER, dukdz);
1088
1089
1090 /* -----------------------------------------------------------
1091 * ajout de nouveaux terms suite a l'ecriture de part1 et
1092 * l'identifications de decompositions plus pertinentes.
1093 * [+] turbulent convection, purely spectral term.
1094 * [-] triadic transfer.
1095 */
1096
1097 REMPLIR(UIUJ_II_FOURIER, ue * ue);
1098 REMPLIR(UIUJ_IJ_FOURIER, ue * ve);
1099 REMPLIR(UIUJ_IK_FOURIER, ue * we);
1100 //REMPLIR(UIUJ_JI_FOURIER, ve * ue);
1101 REMPLIR(UIUJ_JJ_FOURIER, ve * ve);
1102 REMPLIR(UIUJ_JK_FOURIER, ve * we);
1103 //REMPLIR(UIUJ_KI_FOURIER, we * ue);
1104 //REMPLIR(UIUJ_KJ_FOURIER, we * ve);
1105 REMPLIR(UIUJ_KK_FOURIER, we * we);
1106
1107 REMPLIR(UJDUIDXJ_I_FOURIER, ue * duidx + 0.5 * ( vjduidy + vj_p1duidy ) + 0.5 * ( wkduidz + wk_p1duidz ));
1108 REMPLIR(UJDUIDXJ_J_FOURIER, 0.5 * ( uidujdx + ui_p1dujdx ) + ve * dujdy + 0.5 * ( wkdujdz + wk_p1dujdz ));
1109 REMPLIR(UJDUIDXJ_K_FOURIER, 0.5 * ( uidukdx + ui_p1dukdx ) + 0.5 * ( vjdukdy + vj_p1dukdy ) + we * dukdz);
1110
1111#undef REMPLIR
1112 }
1113 }
1114 else // si on est a la paroi on set a zero !!
1115 {
1116 for (int j = 0; j < jmax; j++)
1117 for (int i = 0; i < imax; i++)
1118 for (int val = 0 ; val < Nval ; val++ )
1119 {
1120 Avant_TF[val](i,j,k) =0;
1121 Reel_TF[val](i,j,k) =0;
1122 Imag_TF[val](i,j,k) =0 ;
1123 }
1124 }
1125 }
1126
1127 // pour eviter de faire des echanges espaces virtuel (que je pense plus couteux que le calcul de quelques TF de plus, on va remplir les bord
1128 int KMAX = kmax;
1129 if ((kmax+offsetk)!=nktot)
1130 KMAX++;
1131 int KMIN = 0;
1132 if (offsetk!=0)// si je ne suis pas a la paroi je remplit le ghost
1133 KMIN--;
1134
1135
1136 {
1137 int k = KMAX-1;
1138 int kg = k + offsetk;
1139 for (int j = 0; j < jmax; j++)
1140 for (int i = 0; i < imax; i++)
1141 {
1142 double uf_i = vitesse_i(i,j,k) - vit_moy_i[kg];
1143 double vf_j = vitesse_j(i,j,k) - vit_moy_j[kg];
1144 double wf_k = vitesse_k(i,j,k) - vit_moy_k[kg];
1145 const double uf_ip1 = vitesse_i(i+1, j , k ) - vit_moy_i[kg];
1146 const double vf_jp1 = vitesse_j( i ,j+1, k ) - vit_moy_j[kg];
1147 const double ue = 0.5*(uf_ip1+uf_i);
1148 const double ve = 0.5*(vf_jp1+vf_j);
1149 double p = pression(i,j,k);
1150#define REMPLIR(quoi,avec) Avant_TF[quoi](i,j,k) = avec
1151 // vitesse
1152 REMPLIR(U_FOURIER,ue);
1153 REMPLIR(V_FOURIER,ve);
1154 REMPLIR(W_FOURIER,wf_k);
1155 REMPLIR(P_FOURIER,p);
1156#undef REMPLIR
1157 }
1158
1159 k = KMIN;
1160 kg = k + offsetk;
1161 for (int j = 0; j < jmax; j++)
1162 for (int i = 0; i < imax; i++)
1163 {
1164 double uf_i = vitesse_i(i,j,k) - vit_moy_i[kg];
1165 double vf_j = vitesse_j(i,j,k) - vit_moy_j[kg];
1166 double wf_k = vitesse_k(i,j,k) - vit_moy_k[kg];
1167 const double uf_ip1 = vitesse_i(i+1, j , k ) - vit_moy_i[kg];
1168 const double vf_jp1 = vitesse_j( i ,j+1, k ) - vit_moy_j[kg];
1169 const double ue = 0.5*(uf_ip1+uf_i);
1170 const double ve = 0.5*(vf_jp1+vf_j);
1171 double p = pression(i,j,k);
1172#define REMPLIR(quoi,avec) Avant_TF[quoi](i,j,k) = avec
1173 // vitesse
1174 REMPLIR(U_FOURIER,ue);
1175 REMPLIR(V_FOURIER,ve);
1176 REMPLIR(W_FOURIER,wf_k);
1177 REMPLIR(P_FOURIER,p);
1178#undef REMPLIR
1179 }
1180 }
1181 // statistiques().end_count(cnt_calcul_termes);
1182
1183 // static Stat_Counter_Id cnt_TFpure = statistiques().new_counter(2, "TF_PURE");
1184 // statistiques().begin_count(cnt_TFpure);
1185 // Ici on a calculer les valeur maintenant il faut les envoyer aux autres processeur !!!
1186 // calcule la TF 2D de chaque grandeur et la stocke
1187 /* EXPLICATION : le retour de la TF est un plan 2D de Ni,Nj points.
1188 * Ainsi, il se stock naturellement dans un tableau ijk !!!
1189 * pour se balader le long des k1 on se deplace sur les i pour les k2 on se deplacera sur j */
1190 for ( int type = 0 ; type < Nval ; type ++ )
1191 Traitement_spectral(Avant_TF[type],Reel_TF[type],Imag_TF[type],1);
1192
1193
1194 {
1195 /* ghost et bord des vitesses et de la pression */
1196 Traitement_spectral_klayer_direct(Avant_TF[U_FOURIER],Reel_TF[U_FOURIER],Imag_TF[U_FOURIER],KMIN);
1197 Traitement_spectral_klayer_direct(Avant_TF[U_FOURIER],Reel_TF[U_FOURIER],Imag_TF[U_FOURIER],KMAX-1);
1198
1199 Traitement_spectral_klayer_direct(Avant_TF[V_FOURIER],Reel_TF[V_FOURIER],Imag_TF[V_FOURIER],KMIN);
1200 Traitement_spectral_klayer_direct(Avant_TF[V_FOURIER],Reel_TF[V_FOURIER],Imag_TF[V_FOURIER],KMAX-1);
1201
1202 Traitement_spectral_klayer_direct(Avant_TF[W_FOURIER],Reel_TF[W_FOURIER],Imag_TF[W_FOURIER],KMIN);
1203 Traitement_spectral_klayer_direct(Avant_TF[W_FOURIER],Reel_TF[W_FOURIER],Imag_TF[W_FOURIER],KMAX-1);
1204
1205 Traitement_spectral_klayer_direct(Avant_TF[P_FOURIER],Reel_TF[P_FOURIER],Imag_TF[P_FOURIER],KMIN);
1206 Traitement_spectral_klayer_direct(Avant_TF[P_FOURIER],Reel_TF[P_FOURIER],Imag_TF[P_FOURIER],KMAX-1);
1207 }
1208 // static Stat_Counter_Id TF_Combinaisons = statistiques().new_counter(2, "TF Combinaisons");
1209 // statistiques().begin_count(TF_Combinaisons);
1210 /* Combinaisons des termes spectraux */
1211 /* Pour le moment, je ne fait pas de fonction car c'est trop compliquer a implemnter a cause du FixedVector
1212 Combiner_spectres(Reel_TF,Imag_TF); */
1213 // statistiques().end_count(cnt_TFpure);
1214
1215 for (int k = 0; k < kmax; k++)
1216 {
1217 const int kg=k+offsetk; // position en k sur la grille globale
1218 const int paroi_basse = kg == 0 ? 1 : 0 ;
1219 const int paroi_haute = ( kg == (nktot-1) ) ? 1 : 0;
1220 const int plan_de_paroi = paroi_haute + paroi_basse ;
1221 /*
1222 * const double unsurdz = 1./tab_dz_[kg];
1223 * // AUTRE FACON DE CALCULER Lx
1224 * // const Domaine_IJK & geom = post_splitting_;
1225 * // const int Nx_tot = geom.get_nb_elem_tot(0) + 1;
1226 * // const int Ny_tot = geom.get_nb_elem_tot(1) + 1;
1227 * // const double Lx = geom.get_node_coordinates(0)[Nx_tot - 1] - geom.get_origin(0);
1228 * // const double Ly = geom.get_node_coordinates(1)[Ny_tot - 1] - geom.get_origin(1);
1229 * const double Lx = dx_*imax;
1230 * const double Ly = dy_*jmax;
1231 */
1232 if ( !plan_de_paroi )
1233 {
1234 /*
1235 * double delta_m = ( tab_dz_[kg] + tab_dz_[kg-1] ) * 0.5 ; // distance entre les centre de gravite avec gestion de la paroi !!!
1236 * double delta_p = ( tab_dz_[kg] + tab_dz_[kg+1] ) * 0.5 ; // distance entre les centre de gravite
1237 * double alpha = delta_p/delta_m;
1238 * double unsalpha = delta_m/delta_p;
1239 * double unsdpdm = 1. / ( delta_p + delta_m );
1240 */
1241 for (int j = 0; j < jmax; j++)
1242 for (int i = 0; i < imax; i++)
1243 {
1244 /*
1245 * const int i_cor = (i < imax/2) ? i : abs(i - imax);
1246 * const int j_cor = (j < jmax/2) ? j : abs(j - jmax);
1247 * double veconde_kx = ((double)(i_cor)/Lx)*2*3.14159265358979323846;
1248 * double veconde_ky = ((double)(j_cor)/Ly)*2*3.14159265358979323846;
1249 * //double veconde_k = sqrt(veconde_kx*veconde_kx + veconde_ky*veconde_ky);
1250 */
1251
1252 double uu = Reel_TF[U_FOURIER](i,j,k)*Reel_TF[U_FOURIER](i,j,k) + Imag_TF[U_FOURIER](i,j,k)*Imag_TF[U_FOURIER](i,j,k);
1253 double vv = Reel_TF[V_FOURIER](i,j,k)*Reel_TF[V_FOURIER](i,j,k) + Imag_TF[V_FOURIER](i,j,k)*Imag_TF[V_FOURIER](i,j,k);
1254 double ww = Reel_TF[W_FOURIER](i,j,k)*Reel_TF[W_FOURIER](i,j,k) + Imag_TF[W_FOURIER](i,j,k)*Imag_TF[W_FOURIER](i,j,k);
1255 ww += Reel_TF[W_FOURIER](i,j,k+1)*Reel_TF[W_FOURIER](i,j,k+1) + Imag_TF[W_FOURIER](i,j,k+1)*Imag_TF[W_FOURIER](i,j,k+1);
1256 ww *= 0.5;
1257 resultat_[RES_UU](i,j,k) = uu ;
1258 resultat_[RES_VV](i,j,k) = vv ; // fait aussi la prod_thermique !!!
1259 resultat_[RES_WW](i,j,k) = ww ;
1260 const double RUE = Reel_TF[U_FOURIER](i,j,k);
1261 const double IUE = Imag_TF[U_FOURIER](i,j,k);
1262 const double RVE = Reel_TF[V_FOURIER](i,j,k);
1263 const double IVE = Imag_TF[V_FOURIER](i,j,k);
1264 // la TF est au face alors on revient au elems
1265 const double RWE = 0.5 * (Reel_TF[W_FOURIER](i,j,k) + Reel_TF[W_FOURIER](i,j,k+1));
1266 const double IWE = 0.5 * (Imag_TF[W_FOURIER](i,j,k) + Imag_TF[W_FOURIER](i,j,k+1));
1267
1268 // derivee de chaque composante de u dans la direction aniso
1269 /*
1270 * const double deriv_U_re = derivee_aniso(alpha, unsalpha, unsdpdm, Reel_TF[U_FOURIER](i,j,k-1), Reel_TF[U_FOURIER](i,j,k), Reel_TF[U_FOURIER](i,j,k+1));
1271 * const double deriv_U_im = derivee_aniso(alpha, unsalpha, unsdpdm, Imag_TF[U_FOURIER](i,j,k-1), Imag_TF[U_FOURIER](i,j,k), Imag_TF[U_FOURIER](i,j,k+1));
1272 * const double deriv_V_re = derivee_aniso(alpha, unsalpha, unsdpdm, Reel_TF[V_FOURIER](i,j,k-1), Reel_TF[V_FOURIER](i,j,k), Reel_TF[V_FOURIER](i,j,k+1));
1273 *
1274 * const double deriv_V_im = derivee_aniso(alpha, unsalpha, unsdpdm, Imag_TF[V_FOURIER](i,j,k-1), Imag_TF[V_FOURIER](i,j,k), Imag_TF[V_FOURIER](i,j,k+1));
1275 * const double deriv_W_re = (Reel_TF[W_FOURIER](i,j,k+1) - Reel_TF[W_FOURIER](i,j,k)) * unsurdz;
1276 *
1277 * const double deriv_W_im = (Imag_TF[W_FOURIER](i,j,k+1) - Imag_TF[W_FOURIER](i,j,k)) * unsurdz;
1278 */
1279
1280
1281 double prod = RUE*RWE
1282 + IUE*IWE;
1283 resultat_[RES_PROD_TURB](i,j,k) = prod;
1284
1285 double Tin_i = RUE*Reel_TF[TRIADIQUE_INPLANE_I_FOURIER](i,j,k)
1286 + IUE*Imag_TF[TRIADIQUE_INPLANE_I_FOURIER](i,j,k);
1287 double Tin_j = RVE*Reel_TF[TRIADIQUE_INPLANE_J_FOURIER](i,j,k)
1288 + IVE*Imag_TF[TRIADIQUE_INPLANE_J_FOURIER](i,j,k);
1289 double Tin_k = RWE*Reel_TF[TRIADIQUE_INPLANE_K_FOURIER](i,j,k)
1290 + IWE*Imag_TF[TRIADIQUE_INPLANE_K_FOURIER](i,j,k);
1291 resultat_[RES_TRIADIQUE_INPLANE](i,j,k) = Tin_i + Tin_j + Tin_k;
1292
1293 double Tit_i = RUE*Reel_TF[TRIADIQUE_INTERPLANE_I_FOURIER](i,j,k)
1294 + IUE*Imag_TF[TRIADIQUE_INTERPLANE_I_FOURIER](i,j,k);
1295 double Tit_j = RVE*Reel_TF[TRIADIQUE_INTERPLANE_J_FOURIER](i,j,k)
1296 + IVE*Imag_TF[TRIADIQUE_INTERPLANE_J_FOURIER](i,j,k);
1297 double Tit_k = RWE*Reel_TF[TRIADIQUE_INTERPLANE_K_FOURIER](i,j,k)
1298 + IWE*Imag_TF[TRIADIQUE_INTERPLANE_K_FOURIER](i,j,k);
1299 resultat_[RES_TRIADIQUE_INTERPLANE](i,j,k) = Tit_i + Tit_j + Tit_k;
1300
1301 double Tdef_i = RUE*Reel_TF[DEFORMATION_TURBULENTE_I_FOURIER](i,j,k)
1302 + IUE*Imag_TF[DEFORMATION_TURBULENTE_I_FOURIER](i,j,k);
1303 double Tdef_j = RVE*Reel_TF[DEFORMATION_TURBULENTE_J_FOURIER](i,j,k)
1304 + IVE*Imag_TF[DEFORMATION_TURBULENTE_J_FOURIER](i,j,k);
1305 double Tdef_k = RWE*Reel_TF[DEFORMATION_TURBULENTE_K_FOURIER](i,j,k)
1306 + IWE*Imag_TF[DEFORMATION_TURBULENTE_K_FOURIER](i,j,k);
1307 resultat_[RES_DEFORMATION_TURBULENTE](i,j,k) = Tdef_i + Tdef_j + Tdef_k;
1308
1309 double Pdiv = Reel_TF[DIVU_FOURIER](i,j,k)*Reel_TF[PSURRHO_FOURIER](i,j,k)
1310 + Imag_TF[DIVU_FOURIER](i,j,k)*Imag_TF[PSURRHO_FOURIER](i,j,k);
1311 resultat_[RES_CORRELATION_PRESSION_DIVERGENCE](i,j,k) = Pdiv;
1312
1313 /*
1314 * double Pdiv_ver2 = ( - veconde_kx*IUE - veconde_ky*IVE + deriv_W_re)*Reel_TF[PSURRHO_FOURIER](i,j,k)
1315 * + (veconde_kx*RUE + veconde_ky*RVE + deriv_W_im)*Imag_TF[PSURRHO_FOURIER](i,j,k);
1316 * resultat_[RES_CORRELATION_PRESSION_DIVERGENCE_VER2](i,j,k) = Pdiv_ver2;
1317 */
1318
1319 double wp = RWE*Reel_TF[P_FOURIER](i,j,k) + IWE*Imag_TF[P_FOURIER](i,j,k);
1320 resultat_[RES_P_WFLUC](i,j,k) = wp;
1321
1322 double Pflu = RWE*Reel_TF[DIFFUSION_PRESSION_RHOFLUC_ADERIVE_FOURIER](i,j,k)
1323 + IWE*Imag_TF[DIFFUSION_PRESSION_RHOFLUC_ADERIVE_FOURIER](i,j,k);
1324 resultat_[RES_DIFFUSION_PRESSION_RHOFLUC_ADERIVE](i,j,k) = Pflu;
1325
1326 double Pdrho_i = RUE*Reel_TF[DIFFUSION_PRESSION_DERIVRHO_I_FOURIER](i,j,k)
1327 + IUE*Imag_TF[DIFFUSION_PRESSION_DERIVRHO_I_FOURIER](i,j,k);
1328 double Pdrho_j = RVE*Reel_TF[DIFFUSION_PRESSION_DERIVRHO_J_FOURIER](i,j,k)
1329 + IVE*Imag_TF[DIFFUSION_PRESSION_DERIVRHO_J_FOURIER](i,j,k);
1330 double Pdrho_k = RWE*Reel_TF[DIFFUSION_PRESSION_DERIVRHO_K_FOURIER](i,j,k)
1331 + IWE*Imag_TF[DIFFUSION_PRESSION_DERIVRHO_K_FOURIER](i,j,k);
1332 resultat_[RES_DIFFUSION_PRESSION_DERIVRHO](i,j,k) = Pdrho_i + Pdrho_j + Pdrho_k;
1333
1334 double Dincun_ii = Reel_TF[DUIDXJ_II_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DUIDXJ_II_NONCENTRE_FOURIER](i,j,k)
1335 + Imag_TF[DUIDXJ_II_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DUIDXJ_II_NONCENTRE_FOURIER](i,j,k);
1336 double Dincun_ij = Reel_TF[DUIDXJ_IJ_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DUIDXJ_IJ_NONCENTRE_FOURIER](i,j,k)
1337 + Imag_TF[DUIDXJ_IJ_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DUIDXJ_IJ_NONCENTRE_FOURIER](i,j,k);
1338 double Dincun_ik = Reel_TF[DUIDXJ_IK_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DUIDXJ_IK_NONCENTRE_FOURIER](i,j,k)
1339 + Imag_TF[DUIDXJ_IK_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DUIDXJ_IK_NONCENTRE_FOURIER](i,j,k);
1340 double Dincun_ji = Reel_TF[DUIDXJ_JI_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DUIDXJ_JI_NONCENTRE_FOURIER](i,j,k)
1341 + Imag_TF[DUIDXJ_JI_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DUIDXJ_JI_NONCENTRE_FOURIER](i,j,k);
1342 double Dincun_jj = Reel_TF[DUIDXJ_JJ_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DUIDXJ_JJ_NONCENTRE_FOURIER](i,j,k)
1343 + Imag_TF[DUIDXJ_JJ_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DUIDXJ_JJ_NONCENTRE_FOURIER](i,j,k);
1344 double Dincun_jk = Reel_TF[DUIDXJ_JK_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DUIDXJ_JK_NONCENTRE_FOURIER](i,j,k)
1345 + Imag_TF[DUIDXJ_JK_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DUIDXJ_JK_NONCENTRE_FOURIER](i,j,k);
1346 double Dincun_ki = Reel_TF[DUIDXJ_KI_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DUIDXJ_KI_NONCENTRE_FOURIER](i,j,k)
1347 + Imag_TF[DUIDXJ_KI_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DUIDXJ_KI_NONCENTRE_FOURIER](i,j,k);
1348 double Dincun_kj = Reel_TF[DUIDXJ_KJ_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DUIDXJ_KJ_NONCENTRE_FOURIER](i,j,k)
1349 + Imag_TF[DUIDXJ_KJ_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DUIDXJ_KJ_NONCENTRE_FOURIER](i,j,k);
1350 double Dincun_kk = Reel_TF[DUIDXJ_KK_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DUIDXJ_KK_NONCENTRE_FOURIER](i,j,k)
1351 + Imag_TF[DUIDXJ_KK_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DUIDXJ_KK_NONCENTRE_FOURIER](i,j,k);
1352 resultat_[RES_DISSIPATION_INCOMPRESSIBLE_UN_AFOISNU_INPLANE](i,j,k) = Dincun_ii + Dincun_ij + Dincun_ji + Dincun_jj + Dincun_ki + Dincun_kj;
1353 resultat_[RES_DISSIPATION_INCOMPRESSIBLE_UN_AFOISNU_INTERPLANE](i,j,k) = Dincun_ik + Dincun_jk + Dincun_kk;
1354
1355 /*
1356 * double Dincun_ver2_ii = veconde_kx*veconde_kx*(uu);
1357 * double Dincun_ver2_ij = veconde_ky*veconde_ky*(uu);
1358 * double Dincun_ver2_ik = deriv_U_re*deriv_U_re + deriv_U_im*deriv_U_im;
1359 * double Dincun_ver2_ji = veconde_kx*veconde_kx*(vv);
1360 * double Dincun_ver2_jj = veconde_ky*veconde_ky*(vv);
1361 * double Dincun_ver2_jk = deriv_V_re*deriv_V_re + deriv_V_im*deriv_V_im;
1362 * double Dincun_ver2_ki = veconde_kx*veconde_kx*(ww);
1363 * double Dincun_ver2_kj = veconde_ky*veconde_ky*(ww);
1364 * double Dincun_ver2_kk = deriv_W_re*deriv_W_re + deriv_W_im*deriv_W_im;
1365 * resultat_[RES_DISSIPATION_INCOMPRESSIBLE_UN_AFOISNU_INPLANE_VER2](i,j,k) = Dincun_ver2_ii + Dincun_ver2_ij + Dincun_ver2_ji + Dincun_ver2_jj + Dincun_ver2_ki + Dincun_ver2_kj;
1366 * resultat_[RES_DISSIPATION_INCOMPRESSIBLE_UN_AFOISNU_INTERPLANE_VER2](i,j,k) = Dincun_ver2_ik + Dincun_ver2_jk + Dincun_ver2_kk;
1367 */
1368
1369 double Dincdeux_ii = Reel_TF[DUIDXJ_II_FOURIER](i,j,k)*Reel_TF[DUIDXJ_II_FOURIER](i,j,k)
1370 + Imag_TF[DUIDXJ_II_FOURIER](i,j,k)*Imag_TF[DUIDXJ_II_FOURIER](i,j,k);
1371 double Dincdeux_ij = Reel_TF[DUIDXJ_IJ_FOURIER](i,j,k)*Reel_TF[DUIDXJ_JI_FOURIER](i,j,k)
1372 + Imag_TF[DUIDXJ_IJ_FOURIER](i,j,k)*Imag_TF[DUIDXJ_JI_FOURIER](i,j,k);
1373 double Dincdeux_ik = Reel_TF[DUIDXJ_IK_FOURIER](i,j,k)*Reel_TF[DUIDXJ_KI_FOURIER](i,j,k)
1374 + Imag_TF[DUIDXJ_IK_FOURIER](i,j,k)*Imag_TF[DUIDXJ_KI_FOURIER](i,j,k);
1375 double Dincdeux_jj = Reel_TF[DUIDXJ_JJ_FOURIER](i,j,k)*Reel_TF[DUIDXJ_JJ_FOURIER](i,j,k)
1376 + Imag_TF[DUIDXJ_JJ_FOURIER](i,j,k)*Imag_TF[DUIDXJ_JJ_FOURIER](i,j,k);
1377 double Dincdeux_jk = Reel_TF[DUIDXJ_JK_FOURIER](i,j,k)*Reel_TF[DUIDXJ_KJ_FOURIER](i,j,k)
1378 + Imag_TF[DUIDXJ_JK_FOURIER](i,j,k)*Imag_TF[DUIDXJ_KJ_FOURIER](i,j,k);
1379 double Dincdeux_kk = Reel_TF[DUIDXJ_KK_FOURIER](i,j,k)*Reel_TF[DUIDXJ_KK_FOURIER](i,j,k)
1380 + Imag_TF[DUIDXJ_KK_FOURIER](i,j,k)*Imag_TF[DUIDXJ_KK_FOURIER](i,j,k);
1381 resultat_[RES_DISSIPATION_INCOMPRESSIBLE_DEUX_AFOISNU](i,j,k) = Dincdeux_ii + 2*Dincdeux_ij + 2*Dincdeux_ik + Dincdeux_jj + 2*Dincdeux_jk + Dincdeux_kk;
1382
1383 /*
1384 * double Dincdeux_ver2_ii = veconde_kx*veconde_kx*(uu);
1385 * double Dincdeux_ver2_ij = veconde_kx*veconde_ky*(uu);
1386 * double Dincdeux_ver2_ik = veconde_kx*(deriv_U_im*RWE
1387 * - deriv_U_re*IWE);
1388 * double Dincdeux_ver2_jj = veconde_ky*veconde_ky*(vv);
1389 * double Dincdeux_ver2_jk = veconde_ky*(deriv_V_im*RWE
1390 * - deriv_V_re*IWE);
1391 * double Dincdeux_ver2_kk = deriv_W_re*deriv_W_re + deriv_W_im*deriv_W_im;
1392 * resultat_[RES_DISSIPATION_INCOMPRESSIBLE_DEUX_AFOISNU_VER2](i,j,k) = Dincdeux_ver2_ii + 2*Dincdeux_ver2_ij + 2*Dincdeux_ver2_ik + Dincdeux_ver2_jj + 2*Dincdeux_ver2_jk + Dincdeux_ver2_kk;
1393 */
1394
1395 double Dcom_un_ii = Reel_TF[DUIDXJ_II_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_II_FOURIER](i,j,k)
1396 + Imag_TF[DUIDXJ_II_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_II_FOURIER](i,j,k);
1397 double Dcom_un_ij = Reel_TF[DUIDXJ_IJ_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_IJ_FOURIER](i,j,k)
1398 + Imag_TF[DUIDXJ_IJ_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_IJ_FOURIER](i,j,k);
1399 double Dcom_un_ik = Reel_TF[DUIDXJ_IK_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_IK_FOURIER](i,j,k)
1400 + Imag_TF[DUIDXJ_IK_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_IK_FOURIER](i,j,k);
1401 double Dcom_un_ji = Reel_TF[DUIDXJ_JI_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_JI_FOURIER](i,j,k)
1402 + Imag_TF[DUIDXJ_JI_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_JI_FOURIER](i,j,k);
1403 double Dcom_un_jj = Reel_TF[DUIDXJ_JJ_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_JJ_FOURIER](i,j,k)
1404 + Imag_TF[DUIDXJ_JJ_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_JJ_FOURIER](i,j,k);
1405 double Dcom_un_jk = Reel_TF[DUIDXJ_JK_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_JK_FOURIER](i,j,k)
1406 + Imag_TF[DUIDXJ_JK_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_JK_FOURIER](i,j,k);
1407 double Dcom_un_ki = Reel_TF[DUIDXJ_KI_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_KI_FOURIER](i,j,k)
1408 + Imag_TF[DUIDXJ_KI_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_KI_FOURIER](i,j,k);
1409 double Dcom_un_kj = Reel_TF[DUIDXJ_KJ_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_KJ_FOURIER](i,j,k)
1410 + Imag_TF[DUIDXJ_KJ_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_KJ_FOURIER](i,j,k);
1411 double Dcom_un_kk = Reel_TF[DUIDXJ_KK_NONCENTRE_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_KK_FOURIER](i,j,k)
1412 + Imag_TF[DUIDXJ_KK_NONCENTRE_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_KK_FOURIER](i,j,k);
1413 resultat_[RES_DISSIPATION_COMPRESSIBLE_UN](i,j,k) = Dcom_un_ii + Dcom_un_ij + Dcom_un_ik + Dcom_un_ji + Dcom_un_jj + Dcom_un_jk + Dcom_un_ki + Dcom_un_kj + Dcom_un_kk;
1414
1415 /*
1416 * double Dcom_un_ver2_ii = veconde_kx*(RUE*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_II_FOURIER](i,j,k)
1417 * - IUE*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_II_FOURIER](i,j,k));
1418 * double Dcom_un_ver2_ij = veconde_ky*(RUE*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_IJ_FOURIER](i,j,k)
1419 * - IUE*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_IJ_FOURIER](i,j,k));
1420 * double Dcom_un_ver2_ik = deriv_U_re*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_IK_FOURIER](i,j,k)
1421 * + deriv_U_im*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_IK_FOURIER](i,j,k);
1422 * double Dcom_un_ver2_ji = veconde_kx*(RVE*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_JI_FOURIER](i,j,k)
1423 * - IVE*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_JI_FOURIER](i,j,k));
1424 * double Dcom_un_ver2_jj = veconde_ky*(RVE*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_JJ_FOURIER](i,j,k)
1425 * - IVE*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_JJ_FOURIER](i,j,k));
1426 * double Dcom_un_ver2_jk = deriv_V_re*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_JK_FOURIER](i,j,k)
1427 * + deriv_V_im*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_JK_FOURIER](i,j,k);
1428 * double Dcom_un_ver2_ki = veconde_kx*(RWE*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_KI_FOURIER](i,j,k)
1429 * - IWE*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_KI_FOURIER](i,j,k));
1430 * double Dcom_un_ver2_kj = veconde_ky*(RWE*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_KJ_FOURIER](i,j,k)
1431 * - IWE*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_KJ_FOURIER](i,j,k));
1432 * double Dcom_un_ver2_kk = deriv_W_re*Reel_TF[DISSIPATION_COMPRESSIBLE_UN_KK_FOURIER](i,j,k)
1433 * + deriv_W_im*Imag_TF[DISSIPATION_COMPRESSIBLE_UN_KK_FOURIER](i,j,k);
1434 * resultat_[RES_DISSIPATION_COMPRESSIBLE_UN_VER2](i,j,k) = Dcom_un_ver2_ii + Dcom_un_ver2_ij + Dcom_un_ver2_ik + Dcom_un_ver2_ji + Dcom_un_ver2_jj + Dcom_un_ver2_jk + Dcom_un_ver2_ki + Dcom_un_ver2_kj + Dcom_un_ver2_kk;
1435 */
1436
1437 double Dcom_deux_ii = Reel_TF[DUIDXJ_II_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_II_FOURIER](i,j,k)
1438 + Imag_TF[DUIDXJ_II_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_II_FOURIER](i,j,k);
1439 double Dcom_deux_ij = Reel_TF[DUIDXJ_IJ_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_IJ_FOURIER](i,j,k)
1440 + Imag_TF[DUIDXJ_IJ_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_IJ_FOURIER](i,j,k);
1441 double Dcom_deux_ik = Reel_TF[DUIDXJ_IK_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_IK_FOURIER](i,j,k)
1442 + Imag_TF[DUIDXJ_IK_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_IK_FOURIER](i,j,k);
1443 double Dcom_deux_ji = Reel_TF[DUIDXJ_JI_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_JI_FOURIER](i,j,k)
1444 + Imag_TF[DUIDXJ_JI_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_JI_FOURIER](i,j,k);
1445 double Dcom_deux_jj = Reel_TF[DUIDXJ_JJ_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_JJ_FOURIER](i,j,k)
1446 + Imag_TF[DUIDXJ_JJ_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_JJ_FOURIER](i,j,k);
1447 double Dcom_deux_jk = Reel_TF[DUIDXJ_JK_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_JK_FOURIER](i,j,k)
1448 + Imag_TF[DUIDXJ_JK_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_JK_FOURIER](i,j,k);
1449 double Dcom_deux_ki = Reel_TF[DUIDXJ_KI_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_KI_FOURIER](i,j,k)
1450 + Imag_TF[DUIDXJ_KI_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_KI_FOURIER](i,j,k);
1451 double Dcom_deux_kj = Reel_TF[DUIDXJ_KJ_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_KJ_FOURIER](i,j,k)
1452 + Imag_TF[DUIDXJ_KJ_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_KJ_FOURIER](i,j,k);
1453 double Dcom_deux_kk = Reel_TF[DUIDXJ_KK_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_KK_FOURIER](i,j,k)
1454 + Imag_TF[DUIDXJ_KK_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_KK_FOURIER](i,j,k);
1455 resultat_[RES_DISSIPATION_COMPRESSIBLE_DEUX](i,j,k) = Dcom_deux_ii + Dcom_deux_ij + Dcom_deux_ik + Dcom_deux_ji + Dcom_deux_jj + Dcom_deux_jk + Dcom_deux_ki + Dcom_deux_kj + Dcom_deux_kk;
1456
1457 /*
1458 * double Dcom_deux_ver2_ii = veconde_kx*(RUE*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_II_FOURIER](i,j,k)
1459 * - IUE*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_II_FOURIER](i,j,k));
1460 * double Dcom_deux_ver2_ij = veconde_ky*(RUE*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_IJ_FOURIER](i,j,k)
1461 * - IUE*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_IJ_FOURIER](i,j,k));
1462 * double Dcom_deux_ver2_ik = deriv_U_re*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_IK_FOURIER](i,j,k)
1463 * + deriv_U_im*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_IK_FOURIER](i,j,k);
1464 * double Dcom_deux_ver2_ji = veconde_kx*(RVE*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_JI_FOURIER](i,j,k)
1465 * - IVE*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_JI_FOURIER](i,j,k));
1466 * double Dcom_deux_ver2_jj = veconde_ky*(RVE*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_JJ_FOURIER](i,j,k)
1467 * - IVE*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_JJ_FOURIER](i,j,k));
1468 * double Dcom_deux_ver2_jk = deriv_V_re*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_JK_FOURIER](i,j,k)
1469 * + deriv_V_im*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_JK_FOURIER](i,j,k);
1470 * double Dcom_deux_ver2_ki = veconde_kx*(RWE*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_KI_FOURIER](i,j,k)
1471 * - IWE*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_KI_FOURIER](i,j,k));
1472 * double Dcom_deux_ver2_kj = veconde_ky*(RWE*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_KJ_FOURIER](i,j,k)
1473 * - IWE*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_KJ_FOURIER](i,j,k));
1474 * double Dcom_deux_ver2_kk = deriv_W_re*Reel_TF[DISSIPATION_COMPRESSIBLE_DEUX_KK_FOURIER](i,j,k)
1475 * + deriv_W_im*Imag_TF[DISSIPATION_COMPRESSIBLE_DEUX_KK_FOURIER](i,j,k);
1476 * resultat_[RES_DISSIPATION_COMPRESSIBLE_DEUX_VER2](i,j,k) = Dcom_deux_ver2_ii + Dcom_deux_ver2_ij + Dcom_deux_ver2_ik + Dcom_deux_ver2_ji + Dcom_deux_ver2_jj + Dcom_deux_ver2_jk + Dcom_deux_ver2_ki + Dcom_deux_ver2_kj + Dcom_deux_ver2_kk;
1477 */
1478
1479 double Dcom_trois = Reel_TF[DIVU_FOURIER](i,j,k)*Reel_TF[DISSIPATION_COMPRESSIBLE_TROIS_I_FOURIER](i,j,k)
1480 + Imag_TF[DIVU_FOURIER](i,j,k)*Imag_TF[DISSIPATION_COMPRESSIBLE_TROIS_I_FOURIER](i,j,k);
1481 resultat_[RES_DISSIPATION_COMPRESSIBLE_TROIS](i,j,k) = Dcom_trois;
1482
1483 /*
1484 * double Dcom_trois_ver2 = ( - veconde_kx*IUE - veconde_ky*IVE + deriv_W_re)*Reel_TF[DISSIPATION_COMPRESSIBLE_TROIS_I_FOURIER](i,j,k)
1485 * + (veconde_kx*RUE + veconde_ky*RVE + deriv_W_im)*Imag_TF[DISSIPATION_COMPRESSIBLE_TROIS_I_FOURIER](i,j,k);
1486 * resultat_[RES_DISSIPATION_COMPRESSIBLE_TROIS_VER2](i,j,k) = Dcom_trois_ver2;
1487 */
1488
1489 double Vincdeux_i = RUE*Reel_TF[DUIDXJ_KI_FOURIER](i,j,k)
1490 + IUE*Imag_TF[DUIDXJ_KI_FOURIER](i,j,k);
1491 double Vincdeux_j = RVE*Reel_TF[DUIDXJ_KJ_FOURIER](i,j,k)
1492 + IVE*Imag_TF[DUIDXJ_KJ_FOURIER](i,j,k);
1493 double Vincdeux_k = RWE*Reel_TF[DUIDXJ_KK_FOURIER](i,j,k)
1494 + IWE*Imag_TF[DUIDXJ_KK_FOURIER](i,j,k);
1495 resultat_[RES_DIFFUSION_VISQUEUSE_INCOMPRESSIBLE_DEUX](i,j,k) = Vincdeux_i + Vincdeux_j + Vincdeux_k;
1496
1497 double Vflu_un_i = RUE*Reel_TF[DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_UN_I_FOURIER](i,j,k)
1498 + IUE*Imag_TF[DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_UN_I_FOURIER](i,j,k);
1499 double Vflu_un_j = RVE*Reel_TF[DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_UN_J_FOURIER](i,j,k)
1500 + IVE*Imag_TF[DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_UN_J_FOURIER](i,j,k);
1501 double Vflu_un_k = RWE*Reel_TF[DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_UN_K_FOURIER](i,j,k)
1502 + IWE*Imag_TF[DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_UN_K_FOURIER](i,j,k);
1503 resultat_[RES_DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_UN](i,j,k) = Vflu_un_i + Vflu_un_j + Vflu_un_k;
1504
1505 double Vflu_deux_i = RUE*Reel_TF[DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_DEUX_I_FOURIER](i,j,k)
1506 + IUE*Imag_TF[DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_DEUX_I_FOURIER](i,j,k);
1507 double Vflu_deux_j = RVE*Reel_TF[DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_DEUX_J_FOURIER](i,j,k)
1508 + IVE*Imag_TF[DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_DEUX_J_FOURIER](i,j,k);
1509 double Vflu_deux_k = RWE*Reel_TF[DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_DEUX_K_FOURIER](i,j,k)
1510 + IWE*Imag_TF[DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_DEUX_K_FOURIER](i,j,k);
1511 resultat_[RES_DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_DEUX](i,j,k) = Vflu_deux_i + Vflu_deux_j + Vflu_deux_k;
1512
1513 double Vflu_trois = RWE*Reel_TF[DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_TROIS_FOURIER](i,j,k)
1514 + IWE*Imag_TF[DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_TROIS_FOURIER](i,j,k);
1515 resultat_[RES_DIFFUSION_VISQUEUSE_NUFLUC_ADERIVE_TROIS](i,j,k) = Vflu_trois;
1516
1517 double Vdrho_un_i = RUE*Reel_TF[DIFFUSION_VISQUEUSE_DERIVRHO_UN_I_FOURIER](i,j,k)
1518 + IUE*Imag_TF[DIFFUSION_VISQUEUSE_DERIVRHO_UN_I_FOURIER](i,j,k);
1519 double Vdrho_un_j = RVE*Reel_TF[DIFFUSION_VISQUEUSE_DERIVRHO_UN_J_FOURIER](i,j,k)
1520 + IVE*Imag_TF[DIFFUSION_VISQUEUSE_DERIVRHO_UN_J_FOURIER](i,j,k);
1521 double Vdrho_un_k = RWE*Reel_TF[DIFFUSION_VISQUEUSE_DERIVRHO_UN_K_FOURIER](i,j,k)
1522 + IWE*Imag_TF[DIFFUSION_VISQUEUSE_DERIVRHO_UN_K_FOURIER](i,j,k);
1523 resultat_[RES_DIFFUSION_VISQUEUSE_DERIVRHO_UN](i,j,k) = Vdrho_un_i + Vdrho_un_j + Vdrho_un_k;
1524
1525 double Vdrho_deux_i = RUE*Reel_TF[DIFFUSION_VISQUEUSE_DERIVRHO_DEUX_I_FOURIER](i,j,k)
1526 + IUE*Imag_TF[DIFFUSION_VISQUEUSE_DERIVRHO_DEUX_I_FOURIER](i,j,k);
1527 double Vdrho_deux_j = RVE*Reel_TF[DIFFUSION_VISQUEUSE_DERIVRHO_DEUX_J_FOURIER](i,j,k)
1528 + IVE*Imag_TF[DIFFUSION_VISQUEUSE_DERIVRHO_DEUX_J_FOURIER](i,j,k);
1529 double Vdrho_deux_k = RWE*Reel_TF[DIFFUSION_VISQUEUSE_DERIVRHO_DEUX_K_FOURIER](i,j,k)
1530 + IWE*Imag_TF[DIFFUSION_VISQUEUSE_DERIVRHO_DEUX_K_FOURIER](i,j,k);
1531 resultat_[RES_DIFFUSION_VISQUEUSE_DERIVRHO_DEUX](i,j,k) = Vdrho_deux_i + Vdrho_deux_j + Vdrho_deux_k;
1532
1533 double Vdrho_trois_i = RUE*Reel_TF[DIFFUSION_VISQUEUSE_DERIVRHO_TROIS_I_FOURIER](i,j,k)
1534 + IUE*Imag_TF[DIFFUSION_VISQUEUSE_DERIVRHO_TROIS_I_FOURIER](i,j,k);
1535 double Vdrho_trois_j = RVE*Reel_TF[DIFFUSION_VISQUEUSE_DERIVRHO_TROIS_J_FOURIER](i,j,k)
1536 + IVE*Imag_TF[DIFFUSION_VISQUEUSE_DERIVRHO_TROIS_J_FOURIER](i,j,k);
1537 double Vdrho_trois_k = RWE*Reel_TF[DIFFUSION_VISQUEUSE_DERIVRHO_TROIS_K_FOURIER](i,j,k)
1538 + IWE*Imag_TF[DIFFUSION_VISQUEUSE_DERIVRHO_TROIS_K_FOURIER](i,j,k);
1539 resultat_[RES_DIFFUSION_VISQUEUSE_DERIVRHO_TROIS](i,j,k) = Vdrho_trois_i + Vdrho_trois_j + Vdrho_trois_k;
1540
1541 double TNC_i = RUE*Reel_TF[TERME_NON_CLASSE_I_FOURIER](i,j,k)
1542 + IUE*Imag_TF[TERME_NON_CLASSE_I_FOURIER](i,j,k);
1543 double TNC_j = RVE*Reel_TF[TERME_NON_CLASSE_J_FOURIER](i,j,k)
1544 + IVE*Imag_TF[TERME_NON_CLASSE_J_FOURIER](i,j,k);
1545 double TNC_k = RWE*Reel_TF[TERME_NON_CLASSE_K_FOURIER](i,j,k)
1546 + IWE*Imag_TF[TERME_NON_CLASSE_K_FOURIER](i,j,k);
1547 resultat_[RES_TERME_NON_CLASSE](i,j,k) = TNC_i + TNC_j + TNC_k;
1548
1549 double CT_i = RUE*Reel_TF[UIUJ_IK_FOURIER](i,j,k)
1550 + IUE*Imag_TF[UIUJ_IK_FOURIER](i,j,k);
1551 double CT_j = RVE*Reel_TF[UIUJ_JK_FOURIER](i,j,k)
1552 + IVE*Imag_TF[UIUJ_JK_FOURIER](i,j,k);
1553 double CT_k = RWE*Reel_TF[UIUJ_KK_FOURIER](i,j,k)
1554 + IWE*Imag_TF[UIUJ_KK_FOURIER](i,j,k);
1555 resultat_[RES_CONVECTIONTURBULENTE](i,j,k) = - 0.5 * (CT_i + CT_j + CT_k);
1556
1557 double TPS_un_ii = Reel_TF[DUIDXJ_II_FOURIER](i,j,k)*Reel_TF[UIUJ_II_FOURIER](i,j,k)
1558 + Imag_TF[DUIDXJ_II_FOURIER](i,j,k)*Imag_TF[UIUJ_II_FOURIER](i,j,k);
1559 double TPS_un_ij = Reel_TF[DUIDXJ_IJ_FOURIER](i,j,k)*Reel_TF[UIUJ_IJ_FOURIER](i,j,k)
1560 + Imag_TF[DUIDXJ_IJ_FOURIER](i,j,k)*Imag_TF[UIUJ_IJ_FOURIER](i,j,k);
1561 double TPS_un_ik = Reel_TF[DUIDXJ_IK_FOURIER](i,j,k)*Reel_TF[UIUJ_IK_FOURIER](i,j,k)
1562 + Imag_TF[DUIDXJ_IK_FOURIER](i,j,k)*Imag_TF[UIUJ_IK_FOURIER](i,j,k);
1563 double TPS_un_ji = Reel_TF[DUIDXJ_JI_FOURIER](i,j,k)*Reel_TF[UIUJ_IJ_FOURIER](i,j,k)
1564 + Imag_TF[DUIDXJ_JI_FOURIER](i,j,k)*Imag_TF[UIUJ_IJ_FOURIER](i,j,k);
1565 double TPS_un_jj = Reel_TF[DUIDXJ_JJ_FOURIER](i,j,k)*Reel_TF[UIUJ_JJ_FOURIER](i,j,k)
1566 + Imag_TF[DUIDXJ_JJ_FOURIER](i,j,k)*Imag_TF[UIUJ_JJ_FOURIER](i,j,k);
1567 double TPS_un_jk = Reel_TF[DUIDXJ_JK_FOURIER](i,j,k)*Reel_TF[UIUJ_JK_FOURIER](i,j,k)
1568 + Imag_TF[DUIDXJ_JK_FOURIER](i,j,k)*Imag_TF[UIUJ_JK_FOURIER](i,j,k);
1569 double TPS_un_ki = Reel_TF[DUIDXJ_KI_FOURIER](i,j,k)*Reel_TF[UIUJ_IK_FOURIER](i,j,k)
1570 + Imag_TF[DUIDXJ_KI_FOURIER](i,j,k)*Imag_TF[UIUJ_IK_FOURIER](i,j,k);
1571 double TPS_un_kj = Reel_TF[DUIDXJ_KJ_FOURIER](i,j,k)*Reel_TF[UIUJ_JK_FOURIER](i,j,k)
1572 + Imag_TF[DUIDXJ_KJ_FOURIER](i,j,k)*Imag_TF[UIUJ_JK_FOURIER](i,j,k);
1573 double TPS_un_kk = Reel_TF[DUIDXJ_KK_FOURIER](i,j,k)*Reel_TF[UIUJ_KK_FOURIER](i,j,k)
1574 + Imag_TF[DUIDXJ_KK_FOURIER](i,j,k)*Imag_TF[UIUJ_KK_FOURIER](i,j,k);
1575 double TPS_deux_i = RUE*Reel_TF[UJDUIDXJ_I_FOURIER](i,j,k)
1576 + IUE*Imag_TF[UJDUIDXJ_I_FOURIER](i,j,k);
1577 double TPS_deux_j = RVE*Reel_TF[UJDUIDXJ_J_FOURIER](i,j,k)
1578 + IVE*Imag_TF[UJDUIDXJ_J_FOURIER](i,j,k);
1579 double TPS_deux_k = RWE*Reel_TF[UJDUIDXJ_K_FOURIER](i,j,k)
1580 + IWE*Imag_TF[UJDUIDXJ_K_FOURIER](i,j,k);
1581 double TPS_un = 0.5 * (TPS_un_ii + TPS_un_ij + TPS_un_ik + TPS_un_ji + TPS_un_jj + TPS_un_jk + TPS_un_ki + TPS_un_kj + TPS_un_kk);
1582 double TPS_deux = - 0.5 * (TPS_deux_i + TPS_deux_j + TPS_deux_k);
1583 resultat_[RES_TERMEPUREMENTSPECTRAL](i,j,k) = TPS_un + TPS_deux;
1584 }
1585 }
1586 }
1587 const int N = N_RES;
1588 const double normalisation = (2./ (imax*jmax))*(2./ (imax*jmax));
1589 for ( int val = 0 ; val < N ; val ++ )
1590 for (int k = 0; k < kmax; k++)
1591 for (int j = 0; j < jmax; j++)
1592 for (int i = 0; i < imax; i++)
1593 resultat_[val](i,j,k) *= normalisation ;
1594 // statistiques().end_count(TF_Combinaisons);
1595
1596#define DEBUG 0
1597 if ( DEBUG )
1598 {
1599 // static Stat_Counter_Id TF_lata = statistiques().new_counter(2, "TF lata");
1600 // statistiques().begin_count(TF_lata);
1601 Cerr << " Attention mode debug dans le post-traitement spectral dump de " << N_RES+Nval*2+1 << " lata par dt " << finl;
1602 /* ici au besoin pour peut mettre un dump de lata pour avoir l'info complete en cas de debug !!!! */
1603 Nom lata_name("DEBUG_spectre.lata");
1604 dumplata_header(lata_name, resultat_[0] /* on passe un champ pour ecrire la geometrie */);
1605 dumplata_newtime(lata_name,N_echantillons_); // c'est moche ca
1606
1607 for ( int val = 0 ; val < N ; val ++ )
1608 {
1609 recentrer_spectres(resultat_[val],Avant_TF[0]);
1610 dumplata_scalar(lata_name,Nom(val), resultat_[val], 0);
1611 }
1612 for (int val = 0 ; val < Nval ; val ++)
1613 {
1614 Nom NOMREEL = "PARTIE_REELLE_";
1615 NOMREEL+= Nom(val);
1616 Nom NOMIMAG = "PARTIE_IMAGINAIRE_";
1617 NOMIMAG+= Nom(val);
1618 recentrer_spectres(Reel_TF[val],Avant_TF[0]);
1619 recentrer_spectres(Imag_TF[val],Avant_TF[0]);
1620 dumplata_scalar(lata_name,NOMREEL, Reel_TF[val], 0);
1621 dumplata_scalar(lata_name,NOMIMAG, Imag_TF[val], 0);
1622 }
1623 dumplata_vector(lata_name,"REVIT", vitesse[0],vitesse[1],vitesse[2], 0);
1624 // statistiques().end_count(TF_lata);
1625 }
1626 /* toto */
1627
1628 /* On a calculer les termes, on va maintenant stocker + post-traiter les TFx et TFz
1629 * Pour ceci on utilise deux tableaux 2D contenant toute l'information pour un dump direct;
1630 */
1631
1632 // static Stat_Counter_Id TF_tfx_tfy = statistiques().new_counter(2, "TF partie TFx, TFy");
1633 // statistiques().begin_count(TF_tfx_tfy);
1634 for ( int val = 0 ; val < N ; val ++ )
1635 for (int k = 0; k < kmax; k++)
1636 {
1637 for (int i = 0; i < imax/2; i++)
1638 {
1639 // Bon on fait un cas de test ;;
1640 const int Indice = i + imax/2*(k) ;
1641 const double x = resultat_[val](i,0,k);
1642 TFx_[val][Indice]+= x;
1643 }
1644 for (int j = 0; j < jmax/2; j++)
1645 {
1646 // Bon on fait un cas de test ;;
1647 const int Indice = j + jmax/2*(k);
1648 const double y = resultat_[val](0,j,k);
1649 TFy_[val][Indice]+= y;
1650 }
1651 }
1652 // statistiques().end_count(TF_tfx_tfy);
1653
1654 // static Stat_Counter_Id TF_integrale = statistiques().new_counter(2, "TF partie integrale");
1655 // statistiques().begin_count(TF_integrale);
1656
1657 const int taille = tri_ki.size_array(); // donne la taille du tableaux
1658 for ( int val = 0 ; val < N ; val ++ )
1659 for (int k = 0 ; k < kmax ; k++)
1660 {
1661 const int decalage = taille*(k);
1662 for (int j = 0 ; j < jmax ; j++)
1663 for (int i = 0 ; i < imax ; i++)
1664 {
1665 const int Indice = ref_ki(i,j) + decalage;
1666 const double x = resultat_[val](i,j,k);
1667 TFi_[val][Indice]+= x/2.;
1668 }
1669 }
1670 // statistiques().end_count(TF_integrale);
1671
1672 // a ne pas oublier
1673 N_echantillons_++ ;
1674}
1675
1676
1677/* converti un tableau dans l'espace spectral */
1678void Fourier_trans::Traitement_spectral(const IJK_Field_double& entree, IJK_Field_double& reel, IJK_Field_double& imag, int sens)
1679{
1680 const int Nk = post_splitting_.get_nb_elem_local(DIRECTION_K);
1681 if ( sens == 1 )
1682 {
1683 for (int k = 0 ; k < Nk ; k++)
1684 Traitement_spectral_klayer_direct(entree,reel,imag,k);
1685 }
1686 else if (sens == -1 )
1687 {
1688 for (int k = 0 ; k < Nk ; k++)
1689 Traitement_spectral_klayer_inverse(reel,imag,k); //* attention ici les donnees font etre ecrasee
1690 }
1691 else
1692 {
1693 Cerr << "parametre incompatible dans Traitement_spectral " << finl;
1694 Process::exit();
1695 }
1696}
1697
1698void Fourier_trans::Traitement_spectral_klayer_direct(const IJK_Field_double& entree, IJK_Field_double& reel, IJK_Field_double& imag, int k)
1699{
1700 const int Ni = post_splitting_.get_nb_elem_local(DIRECTION_I);
1701 const int Nj = post_splitting_.get_nb_elem_local(DIRECTION_J);
1702
1703 for (int j=0 ; j < Nj ; j++)
1704 for (int i=0; i < Ni ; i++)
1705 {
1706 const double x = entree(i,j,k);
1707 in[i+j*Ni][0]= x;
1708 in[i+j*Ni][1] = 0;
1709 out[i+j*Ni][0]= 0;
1710 out[i+j*Ni][1]= 0;
1711 }
1712
1713 fftw_execute(plan); // Calcule la TF
1714 /* EXPLICATION : le retour de la TF est un plan 2D de Ni,Nj points ainsi, il se stock naturellement dans un tableau ijk !!!
1715 * pour se balader le long des k1 on se deplace sur les i pour les k2 on se deplacera sur j */
1716
1717 for (int j=0 ; j < Nj ; j++)
1718 for (int i=0; i < Ni ; i++)
1719 {
1720 const double x = out[i+j*Ni][0]; // on fait ceci pour aider le compilateur
1721 const double y = out[i+j*Ni][1];
1722 reel(i,j,k)= x;
1723 imag(i,j,k)= y;
1724 }
1725}
1726
1727void Fourier_trans::Traitement_spectral_klayer_inverse(IJK_Field_double& reel, IJK_Field_double& imag, int k)
1728{
1729 const int Ni = post_splitting_.get_nb_elem_local(DIRECTION_I);
1730 const int Nj = post_splitting_.get_nb_elem_local(DIRECTION_J);
1731
1732 for (int j=0 ; j < Nj ; j++)
1733 for (int i=0; i < Ni ; i++)
1734 {
1735 const double x = reel(i,j,k);
1736 const double y = imag(i,j,k);
1737 in[i+j*Ni][0] = x;
1738 in[i+j*Ni][1] = y;
1739 out[i+j*Ni][0]= 0;
1740 out[i+j*Ni][1]= 0;
1741 }
1742
1743 fftw_execute(inverseplan); // Calcule la TF
1744 /* EXPLICATION : le retour de la TF est un plan 2D de Ni,Nj points ainsi, il se stock naturellement dans un tableau ijk !!!
1745 * pour se balader le long des k1 on se deplace sur les i pour les k2 on se deplacera sur j */
1746
1747 for (int j=0 ; j < Nj ; j++)
1748 for (int i=0; i < Ni ; i++)
1749 {
1750 const double x = out[i+j*Ni][0]; // on fait ceci pour aider le compilateur
1751 const double y = out[i+j*Ni][1];
1752 reel(i,j,k)= x;
1753 imag(i,j,k)= y;
1754 }
1755}
1756
1758{
1759 Nom Nom_TFi = base + "_TFi_";
1760 Nom_TFi += Nom(me());
1761 Nom_TFi += ".txt" ;
1762
1763 SFichier fi(Nom_TFi);
1764 // F.A modification de la precision pour allez chercher les 4 ordres
1765 fi.setf(ios::scientific);
1766 fi.precision(15);
1767 postraiter_TFi(fi,0);
1768
1769 Nom Nom_TFx = base + "_TFx_";
1770 Nom_TFx += Nom(me());
1771 Nom_TFx += ".txt" ; ;
1772
1773 SFichier fx(Nom_TFx);
1774 // F.A modification de la precision pour allez chercher les 4 ordres
1775 fx.setf(ios::scientific);
1776 fx.precision(15);
1777 postraiter_TFx(fx,0);
1778
1779 Nom Nom_TFy = base + "_TFy_";
1780 Nom_TFy += Nom(me());
1781 Nom_TFy += ".txt" ;
1782
1783 SFichier fy(Nom_TFy);
1784 // F.A modification de la precision pour allez chercher les 4 ordres
1785 fy.setf(ios::scientific);
1786 fy.precision(15);
1787 postraiter_TFy(fy,0);
1788
1789 Nom Entete = base + "_Entete.txt";
1790 if (je_suis_maitre())
1791 {
1792 SFichier fe(Entete);
1793 Ecrire_entete(fe,0);
1794 }
1795}
1796
1797void Fourier_trans::Ecrire_entete(Sortie& os, int flag_valeur_instantanee) const
1798{
1799 const int N = N_RES;
1800 if (flag_valeur_instantanee == 0)
1801 {
1802 os << "# N_echantillons " << N_echantillons_ << finl;
1803 os << "# Impression des moyennes temporelles" << finl;
1804 }
1805 else if (flag_valeur_instantanee == 1)
1806 {
1807 os << "# Impression des moyennes spatiales instantanee" << finl;
1808 }
1809 else
1810 {
1811 Cerr << "Erreur dans Fourier_trans::postraiter: flag inconnu" << finl;
1812 Process::exit();
1813 }
1814 os << "# colonne 1 : coordonnee z" << finl;
1815 os << "# colonne 2 : vecteur d'onde k" << finl;
1816 for (int i = 0; i < N; i++)
1817 {
1818 os << "# colonne " << i+3 << " : " << noms_moyennes[i] << finl;
1819 }
1820}
1821
1822// If flag_valeur_instantanee==1 : write the last computed instantaneous value,
1823// if flag_valeur_instantanee==0 : write the time averaged value
1824void Fourier_trans::postraiter_TFi(Sortie& os, int flag_valeur_instantanee) const
1825{
1826 const int N = N_RES;
1827 // tous les processeurs ecrivent en meme temps mais chaun son fichier !!!
1828
1829 const int kmax = post_splitting_.get_nb_elem_local(DIRECTION_K);
1830 const int offsetk = post_splitting_.get_offset_local(DIRECTION_K);
1831 const int Taille = tri_ki.size_array();
1832
1833 for (int z = 0; z < kmax; z++)
1834 {
1835 for (int k =0; k < Taille ; k++ )
1836 {
1837 char s[100];
1838 snprintf(s, 100, "%16.16e ", elem_coord_[z+offsetk]);
1839 os << s;
1840 snprintf(s, 100, "%16.16e ", tri_ki[k]);
1841 os << s;
1842 for (int val = 0; val < N; val++)
1843 {
1844 double x;
1845 const int Indice = k +z* Taille;
1846 if (flag_valeur_instantanee == 0)
1847 x = TFi_[val][Indice] / N_echantillons_;
1848 else
1849 x = TFi_[val][Indice];
1850 snprintf(s, 100, "%16.16e ", x);
1851 os << s;
1852 }
1853 os << finl;
1854 }
1855 os << " " << finl;
1856 }
1857}
1858
1859void Fourier_trans::postraiter_TFx(Sortie& os, int flag_valeur_instantanee) const
1860{
1861 const int N = N_RES;
1862 // tous les processeurs ecrivent en meme temps mais chaun son fichier !!!
1863
1864 const int kmax = post_splitting_.get_nb_elem_local(DIRECTION_K);
1865 const int imax = post_splitting_.get_nb_elem_local(DIRECTION_I);
1866 const int offsetk = post_splitting_.get_offset_local(DIRECTION_K);
1867 const int Nx_tot = post_splitting_.get_nb_elem_tot(0) + 1;
1868 const double Lx = post_splitting_.get_node_coordinates(0)[Nx_tot - 1] - post_splitting_.get_origin(0);
1869 const double fac = 1./Lx;
1870 for (int z = 0; z < kmax; z++)
1871 {
1872 for (int k =0; k < imax/2 ; k++ )
1873 {
1874 char s[100];
1875 snprintf(s, 100, "%16.16e ", elem_coord_[z+offsetk]);
1876 os << s;
1877 snprintf(s, 100, "%16.16e ", k*fac);
1878 os << s;
1879 for (int val = 0; val < N; val++)
1880 {
1881 double x;
1882 const int Indice = k +z*imax/2;
1883 if (flag_valeur_instantanee == 0)
1884 x = TFx_[val][Indice] / N_echantillons_;
1885 else
1886 x = TFx_[val][Indice];
1887 snprintf(s, 100, "%16.16e ", x);
1888 os << s;
1889 }
1890 os << finl;
1891 }
1892 os << " " << finl;
1893 }
1894}
1895
1896void Fourier_trans::postraiter_TFy(Sortie& os, int flag_valeur_instantanee) const
1897{
1898 const int N = N_RES;
1899 // tous les processeurs ecrivent en meme temps mais chaun son fichier !!!
1900
1901 const int kmax = post_splitting_.get_nb_elem_local(DIRECTION_K);
1902 const int jmax = post_splitting_.get_nb_elem_local(DIRECTION_J);
1903 const int offsetk = post_splitting_.get_offset_local(DIRECTION_K);
1904 const int Ny_tot = post_splitting_.get_nb_elem_tot(1) + 1;
1905 const double Ly = post_splitting_.get_node_coordinates(1)[Ny_tot - 1] - post_splitting_.get_origin(1);
1906 const double fac = 1./Ly;
1907
1908 for (int z = 0; z < kmax; z++)
1909 {
1910 for (int k =0; k < jmax/2 ; k++ )
1911 {
1912 char s[100];
1913 snprintf(s, 100, "%16.16e ", elem_coord_[z+offsetk]);
1914 os << s;
1915 snprintf(s, 100, "%16.16e ", k*fac);
1916 os << s;
1917 for (int val = 0; val < N; val++)
1918 {
1919 double x;
1920 const int Indice = k +z*jmax/2;
1921 if (flag_valeur_instantanee == 0)
1922 x = TFy_[val][Indice] / N_echantillons_;
1923 else
1924 x = TFy_[val][Indice];
1925 snprintf(s, 100, "%16.16e ", x);
1926 os << s;
1927 }
1928 os << finl;
1929 }
1930 os << " " << finl;
1931 }
1932}
1933
1935{
1936 Cerr << "Sauvegarde parrallele des stats spectrales " << finl;
1937 Nom nom_sauv = "Sauvegarde_spectrale_";
1938 // on va indiquer la position dans le mapping, on ne sais jamais des fois que cela bouge !!!!
1939 int pos = post_splitting_.get_local_slice_index(2);
1940 nom_sauv += Nom(pos) + ".sauv";
1941 SFichier fichier(nom_sauv);
1942 fichier.precision(17);
1943 fichier.setf(std::ios_base::scientific);
1944
1945 const int N = N_RES;
1946 fichier << "{\n";
1947 fichier << " N_ECHANTILLONS " << N_echantillons_ << "\n";
1948 fichier << " VECT_K " << tri_ki << "\n";
1949 fichier << " REF_KI " << ref_ki << "\n";
1950
1951 for (int i = 0; i < N; i++)
1952 {
1953 char nom_champ[100];
1954 snprintf(nom_champ, 100, "TFI_%d",i );
1955 fichier << nom_champ << " " << TFi_[i] << finl;
1956 snprintf(nom_champ, 100, "TFX_%d",i );
1957 fichier << nom_champ << " " << TFx_[i] << finl;
1958 snprintf(nom_champ, 100, "TFY_%d",i );
1959 fichier << nom_champ << " " << TFy_[i] << finl;
1960 }
1961
1962 fichier << "}" << finl;
1963 Cout << "Ecriture des donnees fourier pour reprise: N_echantillons=" << N_echantillons_ << finl;
1964}
1965
1967{
1968 // on a deja lu tous le fichier de reprise de base on va lire les specifiques pour ici !!!
1969 Nom nom_sauv = "Sauvegarde_spectrale_";
1970 // on va indiquer la position dans le mapping, on ne sais jamais des fois que cela bouge !!!!
1971 int pos = post_splitting_.get_local_slice_index(2);
1972 nom_sauv += Nom(pos) + ".sauv";
1973 Cerr << " Reprise des stats spectrales dans "<< nom_sauv << finl;
1974
1975 Entree* fichier = new LecFicDistribue_sansnum(nom_sauv);
1976 //LecFicDiffuse_JDD fichier(nom_sauv);
1977 const int N = N_RES;
1978 TFi_.dimensionner(N);
1979 TFx_.dimensionner(N);
1980 TFy_.dimensionner(N);
1981 N_echantillons_ = 0;
1982
1983 Param param("Post_Fourier");
1984 param.ajouter("N_ECHANTILLONS", &N_echantillons_);
1985 param.ajouter("VECT_K", &tri_ki);
1986 param.ajouter("REF_KI", &ref_ki);
1987 for (int i = 0; i < N; i++)
1988 {
1989 char nom_champ[100];
1990 snprintf(nom_champ, 100, "TFI_%d",i );
1991 param.ajouter(nom_champ, &TFi_[i]);
1992 snprintf(nom_champ, 100, "TFX_%d",i );
1993 param.ajouter(nom_champ, &TFx_[i]);
1994 snprintf(nom_champ, 100, "TFY_%d",i );
1995 param.ajouter(nom_champ, &TFy_[i]);
1996 }
1997
1998 param.lire_avec_accolades(*fichier);
1999
2000 Cout << "Reprise des donnees statistiques: N_echantillons=" << N_echantillons_ << finl;
2001 Cout << "Reprise des donnees statistiques: N vecteur =" << tri_ki.size_array() << finl;
2002}
2003// Impression des donnees pour reprise
2005{
2006 return os;
2007}
2008
2009// Reprise des donnees stat dans un fichier reprise
2010// Attention, cette methode peut etre appelee avant initialize() !
2012{
2013 return is;
2014}
This class encapsulates all the information related to the eulerian mesh for TrioIJK.
Definition Domaine_IJK.h:47
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
FixedVector< Redistribute_Field, 3 > redistribute_to_post_splitting_faces_
void initialize(const Domaine_IJK &, const Domaine_IJK &, VECT(ArrOfDouble), ArrOfDouble rhomoy, ArrOfDouble numoy, const double T_KMAX, const double T_KMIN, int avec_reprise)
fftw_complex * out
fftw_plan inverseplan
FixedVector< IJK_Field_double, 86 > Reel_TF
ArrOfDouble nu_moy_
FixedVector< IJK_Field_double, 86 > Imag_TF
fftw_complex * in
VECT(ArrOfDouble) vit_moy_
void Traitement_spectral_klayer_direct(const IJK_Field_double &entree, IJK_Field_double &reel, IJK_Field_double &imag, int k)
Redistribute_Field redistribute_to_post_splitting_elem_
ArrOfDouble tab_dz_
FixedVector< IJK_Field_double, 27 > resultat_
void Traitement_spectral_klayer_inverse(IJK_Field_double &reel, IJK_Field_double &imag, int k)
IJK_Field_vector3_double vitesse
ArrOfDouble rho_moy_
void Traitement_spectral(const IJK_Field_double &entree, IJK_Field_double &reel, IJK_Field_double &imag, int sens)
void sauvegarde() const
void update(const IJK_Field_vector3_double &vitesse, const IJK_Field_double &pression, const IJK_Field_double &masse_vol, const IJK_Field_double &champ_mu)
void postraiter_TFy(Sortie &, int flag_valeur_instantanee=0) const
ArrOfDouble tri_ki
fftw_plan plan
ArrOfDouble elem_coord_
IJK_Field_double masse_vol
IJK_Field_double pression
IJK_Field_double champ_mu
FixedVector< IJK_Field_double, 86 > Avant_TF
void postraiter_TFi(Sortie &, int flag_valeur_instantanee=0) const
Domaine_IJK post_splitting_
void Ecrire_entete(Sortie &os, int flag_valeur_instantanee=0) const
void postraiter_TFx(Sortie &, int flag_valeur_instantanee=0) const
void postraiter(Nom &) const
Cette classe implemente les operateurs et les methodes virtuelles de la classe EFichier de la facon s...
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
friend class Entree
Definition Objet_U.h:76
friend class Sortie
Definition Objet_U.h:75
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
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Definition Param.cpp:364
int lire_avec_accolades(Entree &is)
Alias of lire_avec_accolades_depuis.
Definition Param.h:577
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
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Definition Process.cpp:86
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
void precision(int pre) override
void setf(IOS_FORMAT code) override
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ size_array() const
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133