TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
calcul_spectres.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 <calcul_spectres.h>
17#include <SFichier.h>
18
19// On trouve dans ce fichier differentes procedures necessaires pour le calcul des spectres
20
21
22void ecrit_spectre(DoubleVect& E,int n, double temps,int a)
23{
24 Nom fichier = "spectre_";
25 // Nom aa = Nom(a);
26 // fichier += aa; // 0 = EX, 1 = EY , 2 = EZ , 3 = E
27 // fichier += "_";
28 Nom tps = Nom(temps);
29
30 fichier += tps;
31 SFichier fic7 (fichier);
32
33 for (int j=0; j<n; j++)
34 if (E(j)>1.e-30)
35 {
36 fic7 << j+1 << " " << E(j) << finl;
37 }
38 return;
39}
40
41void ecrit_spectre_operateur(DoubleVect& E,int n, double temps, int nb_op,int a, double dt)
42{
43 Nom fichier = "spectre_";
44 Nom op;
45 if (nb_op==0)
46 op="diff";
47 else
48 op="conv";
49 fichier += op;
50
51 fichier += "_";
52 Nom tps = Nom(temps);
53 // Cerr << "tps=" << tps << finl;
54 fichier += tps;
55 SFichier fic7 (fichier);
56
57 // Cerr << "dt=" << dt << finl;
58
59 for (int j=0; j<n; j++)
60 if (E(j)>1.e-30)
61 {
62 fic7 << j+1 << " " << E(j)/dt << finl;
63 }
64 return;
65}
66
67
68/*! \brief Permet de calculer le spectre d energie a partir d un champ de vitesse
69 * exprime au sommet, sans correction pour la periodicite
70 *
71 * named xxx_2 because there used to be a function calc_sp_nouveau, which was inside a #if 0 block.
72 * Remove during a cleanup of the code. Look at git history for informations
73 */
74void calc_sp_nouveau_2(DoubleTab& vit_som ,int n, double temps,double& Ec,double& Df)
75{
76 /* */
77 DoubleVect E(n);
78 DoubleTab fft_u(n,n,n+2),fft_v(n,n,n+2),fft_w(n,n,n+2);
79 DoubleVect EX(n),EY(n),EZ(n);
80 DoubleTab u(n+1,n+1,n+1),v(n+1,n+1,n+1),w(n+1,n+1,n+1);
81 DoubleTab uu(n+1,n+1,n+1),vv(n+1,n+1,n+1),ww(n+1,n+1,n+1);
82 DoubleVect nE(n);
83 DoubleVect fx(n),fy(n),fz(n);
84 IntTab wl(6*n+14),wm(4*n+14),wn(4*n+14),iwork(2*n);
85
86 F77NAME(CALCUL0SPECTRE0AP0CHP0PER)(vit_som.addr(),E.addr(),&n,fft_u.addr(),fft_v.addr(),fft_w.addr(),u.addr(),v.addr(),w.addr(),uu.addr(),vv.addr(),ww.addr(),nE.addr(),EX.addr(),EY.addr(),EZ.addr(),fx.addr(),fy.addr(),fz.addr(),wl.addr(),wm.addr(),wn.addr(),iwork.addr());
87
88 ecrit_spectre(E,n,temps,3);
89 calc_Ec(E,n/2,Ec);
90 // Calcul de D filtree!!
91 int i;
92 DoubleVect D(n);
93 for (i=0; i<n/2-1; i++)
94 D(i) = (i+1)*(i+1)*E(i);
95 calc_Ec(D,n/2,Df);
96 return;
97}
98
99void calc_sp_nouveau_2_operateur(DoubleTab& vit_som ,int n, double temps,int nb_op, double dt, DoubleVect& E)
100{
101 /* Permet de calculer le spectre d energie a partir d un champ de vitesse
102 exprime au sommet, sans correction pour la periodicite */
103 DoubleTab fft_u(n,n,n+2),fft_v(n,n,n+2),fft_w(n,n,n+2);
104 DoubleVect EX(n),EY(n),EZ(n);
105 DoubleTab u(n+1,n+1,n+1),v(n+1,n+1,n+1),w(n+1,n+1,n+1);
106 DoubleTab uu(n+1,n+1,n+1),vv(n+1,n+1,n+1),ww(n+1,n+1,n+1);
107 DoubleVect nE(n);
108 DoubleVect fx(n),fy(n),fz(n);
109 IntTab wl(6*n+14),wm(4*n+14),wn(4*n+14),iwork(2*n);
110
111
112 F77NAME(CALCUL0SPECTRE0AP0CHP0PER)(vit_som.addr(),E.addr(),&n,fft_u.addr(),fft_v.addr(),fft_w.addr(),u.addr(),v.addr(),w.addr(),uu.addr(),vv.addr(),ww.addr(),nE.addr(),EX.addr(),EY.addr(),EZ.addr(),fx.addr(),fy.addr(),fz.addr(),wl.addr(),wm.addr(),wn.addr(),iwork.addr());
113 // ecrit_spectre_operateur(E,n,temps,nb_op,3,dt);
114
115 return;
116}
117
118void calc_sp_operateur(DoubleTab& vit_u, DoubleTab& vit_v, DoubleTab& vit_w, int n, double temps,int nb_op, double dt, DoubleVect& E)
119{
120 // Permet de calculer le spectre d energie a partir d un champ de vitesse
121 // exprime au sommet, sans correction pour la periodicite
122 /* Cerr << "COUCOU dans calc_sp_nouveau_3_vit" << flush; */
123 /* Cerr << "N = " << n << flush; */
124 // DoubleVect E(3*n*n);
125 DoubleTab fft_u(n,n,n+2),fft_v(n,n,n+2),fft_w(n,n,n+2);
126 DoubleVect EX(n),EY(n),EZ(n);
127 DoubleTab u(n+1,n+1,n+1),v(n+1,n+1,n+1),w(n+1,n+1,n+1);
128 DoubleTab uu(n+1,n+1,n+1),vv(n+1,n+1,n+1),ww(n+1,n+1,n+1);
129 DoubleVect nE(n);
130 DoubleVect fx(n),fy(n),fz(n);
131 IntTab wl(6*n+14),wm(4*n+14),wn(4*n+14),iwork(2*n);
132
133 F77NAME(CALCUL0SPECTRE0AVEC030VIT)(vit_u.addr(),vit_v.addr(),vit_w.addr(),E.addr(),&n,fft_u.addr(),fft_v.addr(),fft_w.addr(),u.addr(),v.addr(),w.addr(),uu.addr(),vv.addr(),ww.addr(),nE.addr(),EX.addr(),EY.addr(),EZ.addr(),fx.addr(),fy.addr(),fz.addr(),wl.addr(),wm.addr(),wn.addr(),iwork.addr());
134 // ecrit_spectre_operateur(E,n,temps,nb_op,3,dt);
135
136 return;
137}
138
139void calc_Ec(DoubleVect& E,int kc,double& Integ)
140{
141 int i;
142 Integ = 0.;
143 for (i=0; i<kc-1; i++)
144 Integ += (E(i+1)+E(i))/2.0;
145 return;
146}
147
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
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
_TYPE_ * addr()