TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Eq_ODVM.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 <Eq_ODVM.h>
17#include <Modele_turbulence_hyd_base.h>
18#include <EcrFicCollecte.h>
19
20#define KAPPA 0.415
21#define PR_T 0.9
22#define R 0.5
23
24Implemente_instanciable(Eq_ODVM,"Eq_ODVM",Objet_U);
25
26
28{
29 return os;
30}
31
32
34{
35 return is;
36}
37
38/*void Eq_ODVM::init_profile_CHT(double T0, double Flux, double alpha, double nu)
39 {
40 Flux = Flux/u_tau;
41 double Pr = nu/alpha;
42 double Beta = pow(3.85*pow(Pr,1./3.)-1.3,2.)+2.12*log(Pr);
43 Tm(0) = T0;
44 for(int i=1;i<N;i++)
45 {
46 double y_plus = Y(i)*u_tau/nu;
47 double Gamma = (0.01*pow(Pr*y_plus,4.))/(1.+5.*pow(Pr,3.)*y_plus);
48 double T_plus = Pr*y_plus*exp(-Gamma);
49 T_plus += (2.12*log(1.+y_plus) + Beta)*exp(-1./(Gamma+1e-20));
50 Tm(i) = T0 + T_plus*Flux;
51 }
52 }*/
53
54
55void Eq_ODVM::init_profile_CHT(double Ts, double Tf)
56{
57 for(int i=0; i<N; i++) Tm(i) = Ts + Y(i)*(Tf-Ts)/Y(N-1);
58}
59
60
61void Eq_ODVM::initialiser(int n,double G, double dist, double T0, double Tn, double t0, double K,
62 double f)
63{
64 N = n;
65 gamma = G;
66 //dy = dist/(N-1);
67 y0 = 0.;
68 //yn = dist;
69 facteur = f;
70 tn = t0;
71 Tmles_n = Tn;
72 Tples_n = 0.;
73 Tples2m_n = 0.;
74 Tw_m_n = T0;
75 Theta = K/(K+1.);
76 compt = 0;
77 u_tau = 0.;
78
79 Y.resize(N);
80 F.resize(N);
81 Tm.resize(N);
82 Tp.resize(N);
83 qb.resize(N);
84 qf.resize(N);
85 Q.resize(N);
86 alpha_tot.resize(N);
87 SEC_MEM.resize(N);
88
89 eps.resize(N);
90 prod.resize(N);
91 mol_diff.resize(N);
92 tur_diff.resize(N);
93
94 mailler_fin(dist, facteur);
95
96 for(int i=0; i<N; i++)
97 {
98 //Y(i) = i*dy;
99 Tm(i) = (Tn - T0)*Y(i)/dist + T0;
100 Tp(i) = 0.;
101 qb(i) = 0.;
102 qf(i) = 0.;
103 eps(i) = 0.;
104 prod(i) = 0.;
105 mol_diff(i) = 0.;
106 tur_diff(i) = 0.;
107 SEC_MEM(i) = 0.;
108 Q(i) = 1.;
109 }
110 dy_w = Y(1) - Y(0);
111
112}
113
114void Eq_ODVM::mailler_fin(double dist, double un_facteur)
115{
116
117 //********************************
118 // Mise en place du maillage fin *
119 //********************************
120
121 EcrFicCollecte fic_mesh("tble_mesh.dat",ios::app); // ouverture du fichier conv.dat
122 Y(0)=0.;
123
124 if(un_facteur==1.)
125 {
126 dy=dist/(N-1);
127 for(int i=1 ; i<N ; i++)
128 {
129 Y(i)=i*dy;
130 }
131 }
132 else
133 {
134 dy = dist/(1.-pow(un_facteur,N-1));
135 for (int i=1 ; i<N ; i++)
136 {
137 Y(i)=dy*(1-pow(un_facteur,i));
138 }
139 }
140
141 for(int i=0 ; i<N ; i++)
142 {
143 fic_mesh << i << " " << Y(i) << finl;
144 }
145 fic_mesh << finl;
146
147 //************************************
148 // Fin mise en place du maillage fin *
149 //************************************
150}
151
153{
154 dt=1000.;
155 for(int i=1; i<N-1; i++)
156 {
157 dy=0.5*(Y(i+1)-Y(i-1));
158 if((0.5*dy*dy/alpha_tot[i])<dt) dt = 0.5*dy*dy/alpha_tot[i];
159 }
160}
161
162
164{
165 double Ap, Am;
166
167 SEC_MEM[0] = 0;
168
169 for(int i=1; i<N-1; i++)
170 {
171 dy=0.5*(Y(i+1)-Y(i-1));
172 Ap = alpha*(qb[i+1]-qb[i])/(Y(i+1)-Y(i));
173 Am = alpha*(qb[i]-qb[i-1])/(Y(i)-Y(i-1));
174 mol_diff[i] = (Ap - Am)/(dy);
175
176 Ap = (qb[i+1]-qb[i])/(Y(i+1)-Y(i))*(alpha_tot[i+1]+alpha_tot[i]-2.*alpha)/2.;
177 Am = (qb[i]-qb[i-1])/(Y(i)-Y(i-1))*(alpha_tot[i]+alpha_tot[i-1]-2.*alpha)/2.;
178 tur_diff[i] = (Ap - Am)/(dy);
179
180 if(i==1)
181 {
182 qb[1]=qb[0];
183 mol_diff[1] = 0;
184 tur_diff[1] = 0;
185 }
186
187 prod[i] = (alpha_tot[i]-alpha)*(Tm[i+1]-Tm[i-1])*(Tm[i+1]-Tm[i-1])/4./dy/dy;
188
189 double f = (1+tanh(0.08*(30-Y[i]*u_tau/nu)))/2.;
190 eps[i] = (1-f)*sqrt(CMU) * qb[i]/R * u_tau*u_tau/(nu+(alpha_tot[i]-alpha)*PR_T);
191 eps[i] += f*2.*(qb[1]-qb[0])*alpha/(Y(1)-Y(0))/(Y(1)-Y(0));
192
193 SEC_MEM[i] = mol_diff[i]+tur_diff[i] + prod[i] - eps[i];
194 }
195
196}
197
198
200{
201 double Ap, Am;
202
203 SEC_MEM[0] = 0;
204
205 for(int i=1; i<N-1; i++)
206 {
207 dy=0.5*(Y(i+1)-Y(i-1));
208 // Pour Flux impose :
209 if(i==1) qf[0]=qf[1];
210
211 Ap = alpha*(qf[i+1]-qf[i])/(Y(i+1)-Y(i));
212 Am = alpha*(qf[i]-qf[i-1])/(Y(i)-Y(i-1));
213 mol_diff[i] = (Ap - Am)/(dy);
214
215 Ap = (qf[i+1]-qf[i])/(Y(i+1)-Y(i))*(alpha_tot[i+1]+alpha_tot[i]-2.*alpha)/2.;
216 Am = (qf[i]-qf[i-1])/(Y(i)-Y(i-1))*(alpha_tot[i]+alpha_tot[i-1]-2.*alpha)/2.;
217 tur_diff[i] = (Ap - Am)/(dy);
218
219 prod[i] = (alpha_tot[i]-alpha)*(Tm[i+1]-Tm[i-1])*(Tm[i+1]-Tm[i-1])/dy/dy;
220
221 double f = (1+tanh(0.08*(30-Y[i]*u_tau/nu)))/2.;
222 eps[i] = (1-f)*sqrt(CMU) * qf[i]/R * u_tau*u_tau/(nu+(alpha_tot[i]-alpha)*PR_T);
223 eps[i] += f*2.*(qf[1]-qf[0])*alpha/(Y(1)-Y(0))/(Y(1)-Y(0));
224
225 SEC_MEM[i] = mol_diff[i]+tur_diff[i] + prod[i] - eps[i];
226 }
227
228}
229
230
231void Eq_ODVM::aller_au_temps(double dtn1, double Tw_np1, double Tnp1, double diff, double visco_cin, int type_pb)
232{
233
234 compt++;
235
236 double Ap, Am;
237 alpha = diff;
238 nu = visco_cin;
239
240 // Calculating the filtered values of the LES at time (n+1)
241 Tmles_np1 = gamma*Tnp1 + (1.-gamma)*Tmles_n;
242 Tples_np1 = Tnp1 - Tmles_np1;
243 Tples2m_np1 = gamma*(Tnp1-Tmles_np1)*(Tnp1-Tmles_np1) + (1.-gamma)*Tples2m_n;
244 Tw_m_np1 = gamma*Tw_np1 + (1.-gamma)*Tw_m_n;
245
246 if(compt==1)
247 {
248 Tw_m_np1 = Tw_np1;
249 }
250
251
252
253 // Calculating the temperature variance ratio for forcing.
254 if(compt>=6)
255 for(int i=0; i<N; i++) Q(i) = sqrt(std::fabs(qb(i))/std::fabs(qb(N-1)+1.e-20));
256
257 // Calculating the turbulent diffusivity.
258 double D;
259 double A=19.;
260 for(int i=0; i<N; i++)
261 {
262 D = pow(1. - exp(-Y[i]*u_tau/nu/A),2.);
263 alpha_tot[i] = alpha + KAPPA*D*Y[i]*u_tau/PR_T;
264 }
265
266 //Cerr << "u_tau = " << u_tau << finl;
267
268 while(tn<dtn1) // Going from LES value at (n) to (n+1).
269 {
270 if(type_pb==1) Tm(0) = Tw_m_np1; // Setting lower BC for mean temp.
271 Tm(N-1) = Tmles_np1; // Setting upper BC for mean temp.
272 Tp(N-1) = Tples_np1; // Setting BC for temp. fluct.
273 qb(N-1) = Tples2m_np1; // Setting BC for variance eqn.
274 qf(N-1) = Tples2m_np1; // Setting BC for variance eqn.
275
277 if((dtn1-tn)<dt) dt = dtn1-tn;
278
279
280 // Time advancement for MEAN TEMPERATURE AND TEMPERATURE FLUCTUATIONS
281 // Isothermal case
282 int i;
283 if(type_pb==1)
284 {
285 for(i=0; i<N-1; i++)
286 {
287 if(i==0) SEC_MEM(i)=0;
288 else
289 {
290 dy=0.5*(Y(i+1)-Y(i-1));
291 Ap = ((Tm[i+1]-Tm[i])/(Y(i+1)-Y(i)))*(alpha_tot[i+1]+alpha_tot[i])/2.;
292 Am = ((Tm[i]-Tm[i-1])/(Y(i)-Y(i-1)))*(alpha_tot[i]+alpha_tot[i-1])/2.;
293 SEC_MEM[i] = (Ap-Am)/dy;
294 }
295 }
296 for(i=0; i<N-1; i++)
297 {
298 Tm[i] = Tm[i] + SEC_MEM[i]*dt + F[i]*dt;
299 Tp[i] = Q[i]*Tp[N-1];
300 }
301 }
302
303
304 //CHT case
305 else if(type_pb==2)
306 {
307 Ap = ((Tm[2]-Tm[1])/(Y(2)-Y(1)))*(alpha_tot[2]+alpha_tot[1])/2.;
308 Am = Tw_m_np1; // En fait ici Tw_m_np1 est egal au flux filtre que l'on passe par Paroi_ODVM.
309
310 SEC_MEM[1] = (Ap-Am)/(0.5*(Y(2)-Y(0)));
311 for(i=2; i<N-1; i++)
312 {
313 dy=0.5*(Y(i+1)-Y(i-1));
314 Ap = ((Tm[i+1]-Tm[i])/(Y(i+1)-Y(i)))*(alpha_tot[i+1]+alpha_tot[i])/2.;
315 Am = ((Tm[i]-Tm[i-1])/(Y(i)-Y(i-1)))*(alpha_tot[i]+alpha_tot[i-1])/2.;
316 SEC_MEM[i] = (Ap-Am)/dy;
317 }
318 for(i=1; i<N-1; i++)
319 {
320 Tm[i] = Tm[i] + SEC_MEM[i]*dt;
321 Tp[i] = Q[i]*Tp[N-1];
322 }
323 dy=Y(1)-Y(0);
324 Tm[0] = Tm[1] - Tw_m_np1*dy/alpha; // En fait ici Tw_m_np1 est egal au flux filtre que l'on passe par Paroi_ODVM.
325 Tp[0] = Q[0]*Tp[N-1];
326 }
327
328
329
330 // Time advancement of TRANSPORT EQUATION FOR TEMPERATURE VARIANCE FOR ISOFLUX CONDITION
331 if(type_pb==2)
332 {
334 for(i=1; i<N-1; i++)
335 {
336 qf(i) = qf(i) + SEC_MEM(i)*dt;
337 }
338 qf(0) = qf(1);
339 qb(0) = Theta*Theta*qf(0);
340 }
341
342
343 // Time advancement of TRANSPORT EQUATION FOR TEMPERATURE VARIANCE FOR the CHT case
345 for(i=1; i<N-1; i++)
346 {
347 qb(i) = qb(i) + SEC_MEM(i)*dt;
348 }
349
350 tn+=dt;
351 }
352 // End of time advancement from (n) to (n+1).
353
354
355 // Putting the values of (n+1) at (n) for next time iterations.
356 tn = dtn1;
357 Tmles_n = Tmles_np1;
358 Tples_n = Tples_np1;
359 Tples2m_n = Tples2m_np1;
360 Tw_m_n = Tw_m_np1;
361
362}
363
Ecriture dans un fichier Cette classe implemente les operateurs et les methodes virtuelles de la clas...
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
Classe Eq_ODVM Classe resolvant l'equation de temperature moyenne, l'equation de.
Definition Eq_ODVM.h:33
void calculer_secmem_qf()
Definition Eq_ODVM.cpp:199
void calculer_dt_stab()
Definition Eq_ODVM.cpp:152
void mailler_fin(double, double)
Definition Eq_ODVM.cpp:114
void initialiser(int N, double gamma, double dist, double T0, double Tn, double t0, double rat, double f)
Definition Eq_ODVM.cpp:61
void aller_au_temps(double tnp1, double Tw_np1, double Tnp1, double diff, double visco_cin, int type_pb)
Definition Eq_ODVM.cpp:231
void init_profile_CHT(double Ts, double Tf)
Definition Eq_ODVM.cpp:55
void calculer_secmem_qb()
Definition Eq_ODVM.cpp:163
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
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
Classe de base des flux de sortie.
Definition Sortie.h:52