TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Turbulent_viscosity.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#include <Turbulent_viscosity.h>
16#include <DNS.h>
17using std::max;
18
19static inline double calculer_somme_mimi(double m_i,
20 double m_j,
21 double m_k)
22{
23 return m_i * m_i
24 + m_j * m_j
25 + m_k * m_k;
26}
27
28static inline double calculer_somme_mijmij(double m_ii,
29 double m_ij,
30 double m_ik,
31 double m_ji,
32 double m_jj,
33 double m_jk,
34 double m_ki,
35 double m_kj,
36 double m_kk)
37{
38 return m_ii * m_ii
39 + m_ij * m_ij
40 + m_ik * m_ik
41 + m_ji * m_ji
42 + m_jj * m_jj
43 + m_jk * m_jk
44 + m_ki * m_ki
45 + m_kj * m_kj
46 + m_kk * m_kk;
47}
48
49static inline double calculer_somme_mijmji(double m_ii,
50 double m_ij,
51 double m_ik,
52 double m_ji,
53 double m_jj,
54 double m_jk,
55 double m_ki,
56 double m_kj,
57 double m_kk)
58{
59 return m_ii * m_ii
60 + m_ij * m_ji
61 + m_ik * m_ki
62 + m_ji * m_ij
63 + m_jj * m_jj
64 + m_jk * m_kj
65 + m_ki * m_ik
66 + m_kj * m_jk
67 + m_kk * m_kk;
68}
69
71 double dx,
72 double dy,
73 double dz,
74 double rho,
77{
78 return constant;
79}
80
82 double dx,
83 double dy,
84 double dz,
85 double rho,
88{
89 return constant/rho;
90}
91
92double Turbulent_viscosity_smagorinsky::operator()(double smagorinsky_constant,
93 double dx,
94 double dy,
95 double dz,
96 double rho,
99{
100 const double& g_ii = g[0][0];
101 const double& g_ij = g[0][1];
102 const double& g_ik = g[0][2];
103 const double& g_ji = g[1][0];
104 const double& g_jj = g[1][1];
105 const double& g_jk = g[1][2];
106 const double& g_ki = g[2][0];
107 const double& g_kj = g[2][1];
108 const double& g_kk = g[2][2];
109
110 // modele de smagorinsky
111 // ----------------
112 // tau_ij = -2 (c_s delta)^2 |S| S_ij
113 // |S| = sqrt(2sum_SijSij) = sqrt(sum_gijgij + sum_gijgji)
114 const double somme_gijgij = calculer_somme_mijmij(g_ii, g_ij, g_ik, g_ji, g_jj, g_jk, g_ki, g_kj, g_kk);
115 const double somme_gijgji = calculer_somme_mijmji(g_ii, g_ij, g_ik, g_ji, g_jj, g_jk, g_ki, g_kj, g_kk);
116 const double norme_s = sqrt(somme_gijgij + somme_gijgji);
117
118 const double filter_volume = dx * dy * dz;
119 const double filter_lenght = cbrt(filter_volume);
120
121 return smagorinsky_constant*smagorinsky_constant * filter_lenght*filter_lenght * norme_s;
122}
123
124double Turbulent_viscosity_vreman::operator()(double vreman_constant,
125 double dx,
126 double dy,
127 double dz,
128 double rho,
131{
132 const double& g_ii = g[0][0];
133 const double& g_ij = g[0][1];
134 const double& g_ik = g[0][2];
135 const double& g_ji = g[1][0];
136 const double& g_jj = g[1][1];
137 const double& g_jk = g[1][2];
138 const double& g_ki = g[2][0];
139 const double& g_kj = g[2][1];
140 const double& g_kk = g[2][2];
141
142 // modele de vreman
143 // ----------------
144 // tau_ij = -2 nu_sgs S_ij
145 // nu_sgs = C_v PI^g
146 // PI^g = sqrt(B_b^g/(a_kl a_kl))
147 // B_b^g = b_11^g b_22^g - b_12^g b_12^g + b_11^g b_33^g - b_13^g b_13^g + b_22^g b_33^g -b_23^g b_23^g
148 // b_ij^g = delta_m^2 a_mi a_mj
149 // a_ij = duj/dxi = gji
150 // New variables to use Vreman's notations
151 const double a_ii = g_ii;
152 const double a_ij = g_ji;
153 const double a_ik = g_ki;
154 const double a_ji = g_ij;
155 const double a_jj = g_jj;
156 const double a_jk = g_kj;
157 const double a_ki = g_ik;
158 const double a_kj = g_jk;
159 const double a_kk = g_kk;
160
161 const double b_ii = dx*dx*a_ii*a_ii + dy*dy*a_ji*a_ji + dz*dz*a_ki*a_ki;
162 const double b_ij = dx*dx*a_ii*a_ij + dy*dy*a_ji*a_jj + dz*dz*a_ki*a_kj;
163 const double b_ik = dx*dx*a_ii*a_ik + dy*dy*a_ji*a_jk + dz*dz*a_ki*a_kk;
164 const double b_jj = dx*dx*a_ij*a_ij + dy*dy*a_jj*a_jj + dz*dz*a_kj*a_kj;
165 const double b_jk = dx*dx*a_ij*a_ik + dy*dy*a_jj*a_jk + dz*dz*a_kj*a_kk;
166 const double b_kk = dx*dx*a_ik*a_ik + dy*dy*a_jk*a_jk + dz*dz*a_kk*a_kk;
167
168 const double b_b = b_ii*b_jj - b_ij*b_ij
169 + b_ii*b_kk - b_ik*b_ik
170 + b_jj*b_kk - b_jk*b_jk;
171
172 const double somme_aijaij = calculer_somme_mijmji(a_ii, a_ij, a_ik, a_ji, a_jj, a_jk, a_ki, a_kj, a_kk);
173
174 double vreman_pi;
175 if (somme_aijaij == 0.)
176 {
177 vreman_pi = 0;
178 }
179 else
180 {
181 if (b_b/(somme_aijaij) < 0)
182 {
183 vreman_pi = 0;
184 //Cerr << "Warning: In the vreman's model,"
185 // << " the value of b_b/(somme_aijaij)=" << b_b/(somme_aijaij) << " is negative, which should not be possible."
186 // << " If the value is very close to zero, this might also be a numerical error." << finl;
187 }
188 else
189 {
190 vreman_pi = (somme_aijaij == 0) ? 0. : sqrt(b_b/(somme_aijaij));
191 }
192 }
193 return vreman_constant * vreman_pi;
194}
195
196double Turbulent_viscosity_sigma::operator()(double sigma_constant,
197 double dx,
198 double dy,
199 double dz,
200 double rho,
203{
204 const double& g_ii = g[0][0];
205 const double& g_ij = g[0][1];
206 const double& g_ik = g[0][2];
207 const double& g_ji = g[1][0];
208 const double& g_jj = g[1][1];
209 const double& g_jk = g[1][2];
210 const double& g_ki = g[2][0];
211 const double& g_kj = g[2][1];
212 const double& g_kk = g[2][2];
213
214 // modele sigma
215 // ----------------
216 // tau_ij = -2 (c_sigma delta)^2 d_sigma S_ij
217 // d_sigma = sigma_3 (sigma_1 - sigma_2) (sigma_2 - sigma_3) / sigma_1^2
218 // sigma_[123] : the three singular value of the matrix g
219 // ordered such that sigma_1 >= sigma_2 >= sigma_3
220 // method b of: nicoud, baya toda, nicoud, cabrit, bose, lee (2013) sigma
221 // 1. G = g^t g ... gtg_ij = sum_m g_mi g_mj
222 // 2.1. I1 = tr(G) ... i1 = gtg_ii + gtg_jj + gtg_kk
223 // 2.2. I2 = 0.5 (tr(G)^2 - tr(G^2))
224 // ... gtg_carre_ij = sum_m gtg_im gtg_mj
225 // ... i2 = &c.
226 // 2.3. I3 = det(G) ... i3 = gtg_ii * gtg_jj * gtg_kk
227 // - gtg_ii * gtg_kj * gtg_jk
228 // - gtg_ji * gtg_ij * gtg_kk
229 // + gtg_ji * gtg_kj * gtg_ik
230 // + gtg_ki * gtg_ij * gtg_jk
231 // - gtg_ki * gtg_jj * gtg_ik
232 // 3.1. alpha_1 = i1*i1/9. - i2/3.
233 // 3.2. alpha_2 = i1*i1*i1/27. - i1*i2/6. + i3/2.
234 // 3.3. alpha_3 = 1/3. * arccos(alpha_2/alpha_1^(3./2.))
235 // 4.1. sigma_1 = sqrt(i1/3. + 2sqrt(alpha_1)cos(alpha_3))
236 // 4.2. sigma_2 = sqrt(i1/3. - 2sqrt(alpha_1)cos(pi/3 + alpha_3))
237 // 4.3. sigma_3 = sqrt(i1/3. - 2sqrt(alpha_1)cos(pi/3 - alpha_3))
238 const double gtg_ii = g_ii*g_ii + g_ji*g_ji + g_ki*g_ki;
239 const double gtg_ij = g_ii*g_ij + g_ji*g_jj + g_ki*g_kj;
240 const double gtg_ik = g_ii*g_ik + g_ji*g_jk + g_ki*g_kk;
241 const double gtg_ji = g_ij*g_ii + g_jj*g_ji + g_kj*g_ki;
242 const double gtg_jj = g_ij*g_ij + g_jj*g_jj + g_kj*g_kj;
243 const double gtg_jk = g_ij*g_ik + g_jj*g_jk + g_kj*g_kk;
244 const double gtg_ki = g_ik*g_ii + g_jk*g_ji + g_kk*g_ki;
245 const double gtg_kj = g_ik*g_ij + g_jk*g_jj + g_kk*g_kj;
246 const double gtg_kk = g_ik*g_ik + g_jk*g_jk + g_kk*g_kk;
247
248 const double gtg_carre_ii = gtg_ii*gtg_ii + gtg_ij*gtg_ji + gtg_ik*gtg_ki;
249 const double gtg_carre_jj = gtg_ji*gtg_ij + gtg_jj*gtg_jj + gtg_jk*gtg_kj;
250 const double gtg_carre_kk = gtg_ki*gtg_ik + gtg_kj*gtg_jk + gtg_kk*gtg_kk;
251
252 const double trace_gtg = gtg_ii + gtg_jj + gtg_kk;
253 const double trace_gtg_carre = gtg_carre_ii + gtg_carre_jj + gtg_carre_kk;
254 const double det_gtg = gtg_ii * gtg_jj * gtg_kk
255 - gtg_ii * gtg_kj * gtg_jk
256 - gtg_ji * gtg_ij * gtg_kk
257 + gtg_ji * gtg_kj * gtg_ik
258 + gtg_ki * gtg_ij * gtg_jk
259 - gtg_ki * gtg_jj * gtg_ik;
260
261 const double i1 = trace_gtg;
262 const double i2 = 0.5*(trace_gtg*trace_gtg - trace_gtg_carre);
263 const double i3 = det_gtg;
264
265 const double alpha_1 = i1*i1/9. - i2/3.;
266 const double alpha_2 = i1*i1*i1/27. - i1*i2/6. + i3/2;
267 double alpha_3;
268 if (alpha_2/(sqrt(alpha_1*alpha_1*alpha_1)) > 1)
269 {
270 alpha_3 = 0;
271 //Cerr << "Warning: In the sigma model,"
272 // << " the value of alpha_2/(sqrt(alpha_1*alpha_1*alpha_1))=" << alpha_2/(sqrt(alpha_1*alpha_1*alpha_1)) << " is greater than one, which should not be possible."
273 // << " If the value is very close to one, this might also be a numerical error." << finl;
274 }
275 else if (alpha_2/(sqrt(alpha_1*alpha_1*alpha_1)) < -1)
276 {
277 alpha_3 = M_PI;
278 //Cerr << "Warning: In the sigma model,"
279 // << " the value of alpha_2/(sqrt(alpha_1*alpha_1*alpha_1))=" << alpha_2/(sqrt(alpha_1*alpha_1*alpha_1)) << " is less than minus one, which should not be possible."
280 // << " If the value is very close to minus one, this might also be a numerical error." << finl;
281 }
282 else
283 {
284 alpha_3 = (1./3.)*acos(alpha_2/(sqrt(alpha_1*alpha_1*alpha_1)));
285 }
286
287 double sigma_1;
288 if (i1/3. + 2.*sqrt(alpha_1)*cos(alpha_3) < 0)
289 {
290 sigma_1 = 0;
291 //Cerr << "Warning: In the sigma model,"
292 // << " the value of i1/3. + 2.*sqrt(alpha_1)*cos(alpha_3)=" << i1/3. + 2.*sqrt(alpha_1)*cos(alpha_3) << " is negative, which should not be possible."
293 // << " If the value is very close to zero, this might also be a numerical error." << finl;
294 }
295 else
296 {
297 sigma_1 = sqrt(i1/3. + 2.*sqrt(alpha_1)*cos(alpha_3));
298 }
299
300 double sigma_2;
301 if (i1/3. - 2.*sqrt(alpha_1)*cos(M_PI/3. + alpha_3) < 0)
302 {
303 sigma_2 = 0;
304 //Cerr << "Warning: In the sigma model,"
305 // << " the value of i1/3. - 2.*sqrt(alpha_1)*cos(M_PI/3. + alpha_3)=" << i1/3. - 2.*sqrt(alpha_1)*cos(M_PI/3. + alpha_3) << " is negative, which should not be possible."
306 // << " If the value is very close to zero, this might also be a numerical error." << finl;
307 }
308 else
309 {
310 sigma_2 = sqrt(i1/3. - 2.*sqrt(alpha_1)*cos(M_PI/3. + alpha_3));
311 }
312
313 double sigma_3;
314 if (i1/3. - 2.*sqrt(alpha_1)*cos(M_PI/3. - alpha_3) < 0)
315 {
316 sigma_3 = 0;
317 //Cerr << "Warning: In the sigma model,"
318 // << " the value of i1/3. - 2.*sqrt(alpha_1)*cos(M_PI/3. - alpha_3)=" << i1/3. - 2.*sqrt(alpha_1)*cos(M_PI/3. - alpha_3) << " is negative, which should not be possible."
319 // << " If the value is very close to zero, this might also be a numerical error." << finl;
320 }
321 else
322 {
323 sigma_3 = sqrt(i1/3. - 2.*sqrt(alpha_1)*cos(M_PI/3. - alpha_3));
324 }
325
326 const double d_sigma = sigma_3*(sigma_1 - sigma_2)*(sigma_2 - sigma_3)/(sigma_1*sigma_1);
327
328 const double filter_volume = dx * dy * dz;
329 const double filter_lenght = cbrt(filter_volume);
330
331 return sigma_constant*sigma_constant * filter_lenght*filter_lenght * d_sigma;
332}
333
334double Turbulent_viscosity_wale::operator()(double wale_constant,
335 double dx,
336 double dy,
337 double dz,
338 double rho,
341{
342 const double& g_ii = g[0][0];
343 const double& g_ij = g[0][1];
344 const double& g_ik = g[0][2];
345 const double& g_ji = g[1][0];
346 const double& g_jj = g[1][1];
347 const double& g_jk = g[1][2];
348 const double& g_ki = g[2][0];
349 const double& g_kj = g[2][1];
350 const double& g_kk = g[2][2];
351
352 // modele wale
353 // ----------------
354 // tau_ij = -2 (c_wale delta)^2 f_wale S_ij
355 //
356 // (SSdij SSdij)^(3./2.)
357 // f_wale = -----------------------------------------
358 // (Sij Sij)^(5./2.) + (SSdij SSdij)^(5./4.)
359 //
360 // Sij = 0.5 * (gij + gji)
361 // SSdij = 0.5 * (gimgmj + gjmgmi) - delta_ij (1./3.) gkmgmk
362 // ^ ^
363 // gij_carre gji_carre
364 const double g_carre_ii = g_ii*g_ii + g_ij*g_ji + g_ik*g_ki;
365 const double g_carre_ij = g_ii*g_ij + g_ij*g_jj + g_ik*g_kj;
366 const double g_carre_ik = g_ii*g_ik + g_ij*g_jk + g_ik*g_kk;
367 const double g_carre_ji = g_ji*g_ii + g_jj*g_ji + g_jk*g_ki;
368 const double g_carre_jj = g_ji*g_ij + g_jj*g_jj + g_jk*g_kj;
369 const double g_carre_jk = g_ji*g_ik + g_jj*g_jk + g_jk*g_kk;
370 const double g_carre_ki = g_ki*g_ii + g_kj*g_ji + g_kk*g_ki;
371 const double g_carre_kj = g_ki*g_ij + g_kj*g_jj + g_kk*g_kj;
372 const double g_carre_kk = g_ki*g_ik + g_kj*g_jk + g_kk*g_kk;
373
374 const double trace_g_carre = g_carre_ii + g_carre_jj + g_carre_kk;
375
376 const double ssd_ii = 0.5 * (g_carre_ii + g_carre_ii) - (1./3.)*trace_g_carre;
377 const double ssd_ij = 0.5 * (g_carre_ij + g_carre_ji);
378 const double ssd_ik = 0.5 * (g_carre_ik + g_carre_ki);
379 const double ssd_ji = 0.5 * (g_carre_ji + g_carre_ij);
380 const double ssd_jj = 0.5 * (g_carre_jj + g_carre_jj) - (1./3.)*trace_g_carre;
381 const double ssd_jk = 0.5 * (g_carre_jk + g_carre_kj);
382 const double ssd_ki = 0.5 * (g_carre_ki + g_carre_ik);
383 const double ssd_kj = 0.5 * (g_carre_kj + g_carre_jk);
384 const double ssd_kk = 0.5 * (g_carre_kk + g_carre_kk) - (1./3.)*trace_g_carre;
385
386 const double somme_ssdijssdij = calculer_somme_mijmji(ssd_ii, ssd_ij, ssd_ik, ssd_ji, ssd_jj, ssd_jk, ssd_ki, ssd_kj, ssd_kk);
387
388 const double s_ii = 0.5 * (g_ii + g_ii);
389 const double s_ij = 0.5 * (g_ij + g_ji);
390 const double s_ik = 0.5 * (g_ik + g_ki);
391 const double s_ji = 0.5 * (g_ji + g_ij);
392 const double s_jj = 0.5 * (g_jj + g_jj);
393 const double s_jk = 0.5 * (g_jk + g_kj);
394 const double s_ki = 0.5 * (g_ki + g_ik);
395 const double s_kj = 0.5 * (g_kj + g_jk);
396 const double s_kk = 0.5 * (g_kk + g_kk);
397
398 const double somme_sijsij = calculer_somme_mijmji(s_ii, s_ij, s_ik, s_ji, s_jj, s_jk, s_ki, s_kj, s_kk);
399
400 const double f_wale = ((pow(somme_sijsij,5./2.)+pow(somme_ssdijssdij,5./4.))==0) ? 0. : pow(somme_ssdijssdij,3./2.)/(pow(somme_sijsij,5./2.)+pow(somme_ssdijssdij,5./4.));
401
402 const double filter_volume = dx * dy * dz;
403 const double filter_lenght = cbrt(filter_volume);
404
405 return wale_constant*wale_constant * filter_lenght*filter_lenght * f_wale;
406}
407
408double Turbulent_viscosity_amd::operator()(double amd_constant,
409 double dx,
410 double dy,
411 double dz,
412 double rho,
415{
416 const double& g_ii = g[0][0];
417 const double& g_ij = g[0][1];
418 const double& g_ik = g[0][2];
419 const double& g_ji = g[1][0];
420 const double& g_jj = g[1][1];
421 const double& g_jk = g[1][2];
422 const double& g_ki = g[2][0];
423 const double& g_kj = g[2][1];
424 const double& g_kk = g[2][2];
425
426 // modele amd
427 // ----------------
428 // tau_ij = -2 c_amd f_amd S_ij
429 // f_amd = max(-cijsij,0)/gklgkl
430 // c_ij = delta_m^2 g_im g_jm
431 const double s_ii = 0.5 * (g_ii + g_ii);
432 const double s_ij = 0.5 * (g_ij + g_ji);
433 const double s_ik = 0.5 * (g_ik + g_ki);
434 const double s_ji = 0.5 * (g_ji + g_ij);
435 const double s_jj = 0.5 * (g_jj + g_jj);
436 const double s_jk = 0.5 * (g_jk + g_kj);
437 const double s_ki = 0.5 * (g_ki + g_ik);
438 const double s_kj = 0.5 * (g_kj + g_jk);
439 const double s_kk = 0.5 * (g_kk + g_kk);
440
441 const double c_ii = dx*dx*g_ii*g_ii + dy*dy*g_ij*g_ij + dz*dz*g_ik*g_ik;
442 const double c_ij = dx*dx*g_ii*g_ji + dy*dy*g_ij*g_jj + dz*dz*g_ik*g_jk;
443 const double c_ik = dx*dx*g_ii*g_ki + dy*dy*g_ij*g_kj + dz*dz*g_ik*g_kk;
444 const double c_ji = dx*dx*g_ji*g_ii + dy*dy*g_jj*g_ij + dz*dz*g_jk*g_ik;
445 const double c_jj = dx*dx*g_ji*g_ji + dy*dy*g_jj*g_jj + dz*dz*g_jk*g_jk;
446 const double c_jk = dx*dx*g_ji*g_ki + dy*dy*g_jj*g_kj + dz*dz*g_jk*g_kk;
447 const double c_ki = dx*dx*g_ki*g_ii + dy*dy*g_kj*g_ij + dz*dz*g_kk*g_ik;
448 const double c_kj = dx*dx*g_ki*g_ji + dy*dy*g_kj*g_jj + dz*dz*g_kk*g_jk;
449 const double c_kk = dx*dx*g_ki*g_ki + dy*dy*g_kj*g_kj + dz*dz*g_kk*g_kk;
450
451 const double somme_gijgij = calculer_somme_mijmij(g_ii, g_ij, g_ik, g_ji, g_jj, g_jk, g_ki, g_kj, g_kk);
452 const double somme_cijsij = c_ii * s_ii
453 + c_ij * s_ij
454 + c_ik * s_ik
455 + c_ji * s_ji
456 + c_jj * s_jj
457 + c_jk * s_jk
458 + c_ki * s_ki
459 + c_kj * s_kj
460 + c_kk * s_kk;
461 const double f_amd = (somme_gijgij==0) ? 0. : max(0., -somme_cijsij)/somme_gijgij;
462
463 return amd_constant * f_amd;
464}
465
466double Turbulent_viscosity_amd_comp::operator()(double amd_comp_constant,
467 double dx,
468 double dy,
469 double dz,
470 double rho,
473{
474 const double& g_ii = g[0][0];
475 const double& g_ij = g[0][1];
476 const double& g_ik = g[0][2];
477 const double& g_ji = g[1][0];
478 const double& g_jj = g[1][1];
479 const double& g_jk = g[1][2];
480 const double& g_ki = g[2][0];
481 const double& g_kj = g[2][1];
482 const double& g_kk = g[2][2];
483
484 // modele amd_comp
485 // ----------------
486 // tau_ij = -2 c_amd f_amd_comp S_ij
487 // f_amd_comp = max(-cijsij,0)/sklskl
488 // c_ij = delta_m^2 g_im g_jm
489 const double s_ii = 0.5 * (g_ii + g_ii);
490 const double s_ij = 0.5 * (g_ij + g_ji);
491 const double s_ik = 0.5 * (g_ik + g_ki);
492 const double s_ji = 0.5 * (g_ji + g_ij);
493 const double s_jj = 0.5 * (g_jj + g_jj);
494 const double s_jk = 0.5 * (g_jk + g_kj);
495 const double s_ki = 0.5 * (g_ki + g_ik);
496 const double s_kj = 0.5 * (g_kj + g_jk);
497 const double s_kk = 0.5 * (g_kk + g_kk);
498
499 const double c_ii = dx*dx*g_ii*g_ii + dy*dy*g_ij*g_ij + dz*dz*g_ik*g_ik;
500 const double c_ij = dx*dx*g_ii*g_ji + dy*dy*g_ij*g_jj + dz*dz*g_ik*g_jk;
501 const double c_ik = dx*dx*g_ii*g_ki + dy*dy*g_ij*g_kj + dz*dz*g_ik*g_kk;
502 const double c_ji = dx*dx*g_ji*g_ii + dy*dy*g_jj*g_ij + dz*dz*g_jk*g_ik;
503 const double c_jj = dx*dx*g_ji*g_ji + dy*dy*g_jj*g_jj + dz*dz*g_jk*g_jk;
504 const double c_jk = dx*dx*g_ji*g_ki + dy*dy*g_jj*g_kj + dz*dz*g_jk*g_kk;
505 const double c_ki = dx*dx*g_ki*g_ii + dy*dy*g_kj*g_ij + dz*dz*g_kk*g_ik;
506 const double c_kj = dx*dx*g_ki*g_ji + dy*dy*g_kj*g_jj + dz*dz*g_kk*g_jk;
507 const double c_kk = dx*dx*g_ki*g_ki + dy*dy*g_kj*g_kj + dz*dz*g_kk*g_kk;
508
509 // const double somme_gijgij = calculer_somme_mijmij(g_ii, g_ij, g_ik, g_ji, g_jj, g_jk, g_ki, g_kj, g_kk);
510 const double somme_cijsij = (c_ii-0.333*(c_ii+c_jj+c_kk)) * s_ii
511 + c_ij * s_ij
512 + c_ik * s_ik
513 + c_ji * s_ji
514 + (c_jj-0.333*(c_ii+c_jj+c_kk)) * s_jj
515 + c_jk * s_jk
516 + c_ki * s_ki
517 + c_kj * s_kj
518 + (c_kk-0.333*(c_ii+c_jj+c_kk)) * s_kk;
519 const double somme_sijsij = (s_ii-0.333*(s_ii+s_jj+s_kk)) * s_ii
520 + s_ij * s_ij
521 + s_ik * s_ik
522 + s_ji * s_ji
523 + (s_jj-0.333*(s_ii+s_jj+s_kk)) * s_jj
524 + s_jk * s_jk
525 + s_ki * s_ki
526 + s_kj * s_kj
527 + (s_kk-0.333*(s_ii+s_jj+s_kk)) * s_kk;
528 const double f_amd_comp = (somme_sijsij==0) ? 0. : max(0., -somme_cijsij)/somme_sijsij;
529
530 return amd_comp_constant * f_amd_comp;
531}
532double Turbulent_viscosity_amdnoclip::operator()(double amdnoclip_constant,
533 double dx,
534 double dy,
535 double dz,
536 double rho,
539{
540 const double& g_ii = g[0][0];
541 const double& g_ij = g[0][1];
542 const double& g_ik = g[0][2];
543 const double& g_ji = g[1][0];
544 const double& g_jj = g[1][1];
545 const double& g_jk = g[1][2];
546 const double& g_ki = g[2][0];
547 const double& g_kj = g[2][1];
548 const double& g_kk = g[2][2];
549
550 // modele amdnoclip
551 // ----------------
552 // tau_ij = -2 c_amdnoclip f_amdnoclip S_ij
553 // f_amdnoclip = -cijsij/gklgkl
554 // c_ij = delta_m^2 g_im g_jm
555 const double s_ii = 0.5 * (g_ii + g_ii);
556 const double s_ij = 0.5 * (g_ij + g_ji);
557 const double s_ik = 0.5 * (g_ik + g_ki);
558 const double s_ji = 0.5 * (g_ji + g_ij);
559 const double s_jj = 0.5 * (g_jj + g_jj);
560 const double s_jk = 0.5 * (g_jk + g_kj);
561 const double s_ki = 0.5 * (g_ki + g_ik);
562 const double s_kj = 0.5 * (g_kj + g_jk);
563 const double s_kk = 0.5 * (g_kk + g_kk);
564
565 const double c_ii = dx*dx*g_ii*g_ii + dy*dy*g_ij*g_ij + dz*dz*g_ik*g_ik;
566 const double c_ij = dx*dx*g_ii*g_ji + dy*dy*g_ij*g_jj + dz*dz*g_ik*g_jk;
567 const double c_ik = dx*dx*g_ii*g_ki + dy*dy*g_ij*g_kj + dz*dz*g_ik*g_kk;
568 const double c_ji = dx*dx*g_ji*g_ii + dy*dy*g_jj*g_ij + dz*dz*g_jk*g_ik;
569 const double c_jj = dx*dx*g_ji*g_ji + dy*dy*g_jj*g_jj + dz*dz*g_jk*g_jk;
570 const double c_jk = dx*dx*g_ji*g_ki + dy*dy*g_jj*g_kj + dz*dz*g_jk*g_kk;
571 const double c_ki = dx*dx*g_ki*g_ii + dy*dy*g_kj*g_ij + dz*dz*g_kk*g_ik;
572 const double c_kj = dx*dx*g_ki*g_ji + dy*dy*g_kj*g_jj + dz*dz*g_kk*g_jk;
573 const double c_kk = dx*dx*g_ki*g_ki + dy*dy*g_kj*g_kj + dz*dz*g_kk*g_kk;
574
575 const double somme_gijgij = calculer_somme_mijmij(g_ii, g_ij, g_ik, g_ji, g_jj, g_jk, g_ki, g_kj, g_kk);
576 const double somme_cijsij = c_ii * s_ii
577 + c_ij * s_ij
578 + c_ik * s_ik
579 + c_ji * s_ji
580 + c_jj * s_jj
581 + c_jk * s_jk
582 + c_ki * s_ki
583 + c_kj * s_kj
584 + c_kk * s_kk;
585 const double f_amdnoclip = (somme_gijgij==0) ? 0. : -somme_cijsij/somme_gijgij;
586
587 return amdnoclip_constant * f_amdnoclip;
588}
589
590double Turbulent_viscosity_amdscalar::operator()(double amdscalar_constant,
591 double dx,
592 double dy,
593 double dz,
594 double rho,
597{
598 const double& g_ii = g[0][0];
599 const double& g_ij = g[0][1];
600 const double& g_ik = g[0][2];
601 const double& g_ji = g[1][0];
602 const double& g_jj = g[1][1];
603 const double& g_jk = g[1][2];
604 const double& g_ki = g[2][0];
605 const double& g_kj = g[2][1];
606 const double& g_kk = g[2][2];
607
608 const double& q_i = q[0];
609 const double& q_j = q[1];
610 const double& q_k = q[2];
611
612 // modele amdscalar
613 // ----------------
614 // tau_ij = -2 c_amdscalar f_amdscalar S_ij
615 // f_amdscalar = -ciqi/qkqk
616 // c_i = delta_m^2 g_im q_m
617 const double c_i = dx*dx*g_ii*q_i + dy*dy*g_ij*q_j + dz*dz*g_ik*q_k;
618 const double c_j = dx*dx*g_ji*q_i + dy*dy*g_jj*q_j + dz*dz*g_jk*q_k;
619 const double c_k = dx*dx*g_ki*q_i + dy*dy*g_kj*q_j + dz*dz*g_kk*q_k;
620
621 const double somme_qiqi = calculer_somme_mimi(q_i, q_j, q_k);
622 const double somme_ciqi = c_i * q_i
623 + c_j * q_j
624 + c_k * q_k;
625 const double f_amdscalar = (somme_qiqi==0) ? 0. : max(0., -somme_ciqi)/somme_qiqi;
626
627 return amdscalar_constant * f_amdscalar;
628}
629
630double Turbulent_viscosity_amdscalarnoclip::operator()(double amdscalarnoclip_constant,
631 double dx,
632 double dy,
633 double dz,
634 double rho,
637{
638 const double& g_ii = g[0][0];
639 const double& g_ij = g[0][1];
640 const double& g_ik = g[0][2];
641 const double& g_ji = g[1][0];
642 const double& g_jj = g[1][1];
643 const double& g_jk = g[1][2];
644 const double& g_ki = g[2][0];
645 const double& g_kj = g[2][1];
646 const double& g_kk = g[2][2];
647
648 const double& q_i = q[0];
649 const double& q_j = q[1];
650 const double& q_k = q[2];
651
652 // modele amdscalarnoclip
653 // ----------------
654 // tau_ij = -2 c_amdscalarnoclip f_amdscalarnoclip S_ij
655 // f_amdscalarnoclip = -ciqi/qkqk
656 // c_i = delta_m^2 g_im q_m
657 const double c_i = dx*dx*g_ii*q_i + dy*dy*g_ij*q_j + dz*dz*g_ik*q_k;
658 const double c_j = dx*dx*g_ji*q_i + dy*dy*g_jj*q_j + dz*dz*g_jk*q_k;
659 const double c_k = dx*dx*g_ki*q_i + dy*dy*g_kj*q_j + dz*dz*g_kk*q_k;
660
661 const double somme_qiqi = calculer_somme_mimi(q_i, q_j, q_k);
662 const double somme_ciqi = c_i * q_i
663 + c_j * q_j
664 + c_k * q_k;
665 const double f_amdscalarnoclip = (somme_qiqi==0) ? 0. : -somme_ciqi/somme_qiqi;
666
667 return amdscalarnoclip_constant * f_amdscalarnoclip;
668}
669
670double Turbulent_viscosity_rds::operator()(double rds_constant,
671 double dx,
672 double dy,
673 double dz,
674 double rho,
677{
678 const double& g_ii = g[0][0];
679 const double& g_ij = g[0][1];
680 const double& g_ik = g[0][2];
681 const double& g_ji = g[1][0];
682 const double& g_jj = g[1][1];
683 const double& g_jk = g[1][2];
684 const double& g_ki = g[2][0];
685 const double& g_kj = g[2][1];
686 const double& g_kk = g[2][2];
687
688 // modele rds (reversed dynamic structure)
689 // ----------------
690 // tau_ij = -1/12 c_rds (c_kk/|S|) S_ij
691 // |S| = sqrt(2sum_SijSij) = sqrt(sum_gijgij + sum_gijgji)
692 // c_ij = delta_m^2 g_im g_jm
693 const double somme_gijgij = calculer_somme_mijmij(g_ii, g_ij, g_ik, g_ji, g_jj, g_jk, g_ki, g_kj, g_kk);
694 const double somme_gijgji = calculer_somme_mijmji(g_ii, g_ij, g_ik, g_ji, g_jj, g_jk, g_ki, g_kj, g_kk);
695 const double norme_s = sqrt(somme_gijgij + somme_gijgji);
696
697 const double c_ii = dx*dx*g_ii*g_ii + dy*dy*g_ij*g_ij + dz*dz*g_ik*g_ik;
698 const double c_jj = dx*dx*g_ji*g_ji + dy*dy*g_jj*g_jj + dz*dz*g_jk*g_jk;
699 const double c_kk = dx*dx*g_ki*g_ki + dy*dy*g_kj*g_kj + dz*dz*g_kk*g_kk;
700
701 const double trace_c = c_ii + c_jj + c_kk;
702
703 const double f_rds = (norme_s==0) ? 0. : trace_c/norme_s;
704
705 return rds_constant * (1./12.) * f_rds;
706}
707
708double Turbulent_viscosity_vss::operator()(double vss_constant,
709 double dx,
710 double dy,
711 double dz,
712 double rho,
715{
716 const double& g_ii = g[0][0];
717 const double& g_ij = g[0][1];
718 const double& g_ik = g[0][2];
719 const double& g_ji = g[1][0];
720 const double& g_jj = g[1][1];
721 const double& g_jk = g[1][2];
722 const double& g_ki = g[2][0];
723 const double& g_kj = g[2][1];
724 const double& g_kk = g[2][2];
725
726 // modele vss (reversed dynamic structure)
727 // ----------------
728 // tau_ij = -2 (d_vss delta)^2 S_ij
729 // d_vss = c_r (Rij Rij)^(3./2.)/(Sij Sij)^{5./2.}
730 // R_ij = beta_i duj/dxj (pas de somme sur j)
731 // [beta_i] = (S_23, S_13, S_12)
732 // c_r = 1.3 (valeur recommandee)
733 const double s_ii = 0.5 * (g_ii + g_ii);
734 const double s_ij = 0.5 * (g_ij + g_ji);
735 const double s_ik = 0.5 * (g_ik + g_ki);
736 const double s_ji = 0.5 * (g_ji + g_ij);
737 const double s_jj = 0.5 * (g_jj + g_jj);
738 const double s_jk = 0.5 * (g_jk + g_kj);
739 const double s_ki = 0.5 * (g_ki + g_ik);
740 const double s_kj = 0.5 * (g_kj + g_jk);
741 const double s_kk = 0.5 * (g_kk + g_kk);
742
743 const double somme_sijsij = calculer_somme_mijmji(s_ii, s_ij, s_ik, s_ji, s_jj, s_jk, s_ki, s_kj, s_kk);
744
745 const double r_ii = s_jk * g_ii;
746 const double r_ij = s_jk * g_jj;
747 const double r_ik = s_jk * g_kk;
748 const double r_ji = s_ik * g_ii;
749 const double r_jj = s_ik * g_jj;
750 const double r_jk = s_ik * g_kk;
751 const double r_ki = s_ij * g_ii;
752 const double r_kj = s_ij * g_jj;
753 const double r_kk = s_ij * g_kk;
754
755 const double somme_rijrij = calculer_somme_mijmji(r_ii, r_ij, r_ik, r_ji, r_jj, r_jk, r_ki, r_kj, r_kk);
756
757 const double d_vss = (pow(somme_sijsij,5./2.)==0) ? 0. : (pow(somme_rijrij,3./2.))/(pow(somme_sijsij,5./2.));
758
759 const double filter_volume = dx * dy * dz;
760 const double filter_lenght = cbrt(filter_volume);
761
762 return vss_constant*vss_constant * filter_lenght*filter_lenght * d_vss;
763}
764
765double Turbulent_viscosity_kobayashi::operator()(double kobayashi_constant,
766 double dx,
767 double dy,
768 double dz,
769 double rho,
772{
773 const double& g_ii = g[0][0];
774 const double& g_ij = g[0][1];
775 const double& g_ik = g[0][2];
776 const double& g_ji = g[1][0];
777 const double& g_jj = g[1][1];
778 const double& g_jk = g[1][2];
779 const double& g_ki = g[2][0];
780 const double& g_kj = g[2][1];
781 const double& g_kk = g[2][2];
782
783 // modele de kobayashi
784 // ----------------
785 // tau_ij = -2 c_k (delta)^2 (1-F)|F|^(3./2.) |S| S_ij
786 // |S| = sqrt(2sum_SijSij) = sqrt(sum_gijgij + sum_gijgji)
787 // F = Q/E = - gijgji/gklgkl
788 // Q = 0.5(WijWij - SijSij)
789 // E = 0.5(WijWij + SijSij)
790 // Sij = 0.5(gij + gji)
791 // Wij = 0.5(gij - gji)
792 const double somme_gijgij = calculer_somme_mijmij(g_ii, g_ij, g_ik, g_ji, g_jj, g_jk, g_ki, g_kj, g_kk);
793 const double somme_gijgji = calculer_somme_mijmji(g_ii, g_ij, g_ik, g_ji, g_jj, g_jk, g_ki, g_kj, g_kk);
794 const double norme_s = sqrt(somme_gijgij + somme_gijgji);
795
796 const double fcs = - somme_gijgji/somme_gijgij;
797
798 const double f_koba = pow(fabs(fcs),3./2.) * (1 - fcs) * norme_s;
799
800 const double filter_volume = dx * dy * dz;
801 const double filter_lenght = cbrt(filter_volume);
802
803 return kobayashi_constant * filter_lenght*filter_lenght * f_koba;
804}
805
double operator()(double amd_comp_constant, double dx, double dy, double dz, double rho, FixedVector< FixedVector< double, 3 >, 3 > &g, FixedVector< double, 3 > &q) override
double operator()(double amd_constant, double dx, double dy, double dz, double rho, FixedVector< FixedVector< double, 3 >, 3 > &g, FixedVector< double, 3 > &q) override
double operator()(double amdnoclip_constant, double dx, double dy, double dz, double rho, FixedVector< FixedVector< double, 3 >, 3 > &g, FixedVector< double, 3 > &q) override
double operator()(double amdscalar_constant, double dx, double dy, double dz, double rho, FixedVector< FixedVector< double, 3 >, 3 > &g, FixedVector< double, 3 > &q) override
double operator()(double amdscalarnoclip_constant, double dx, double dy, double dz, double rho, FixedVector< FixedVector< double, 3 >, 3 > &g, FixedVector< double, 3 > &q) override
double operator()(double constant, double dx, double dy, double dz, double rho, FixedVector< FixedVector< double, 3 >, 3 > &g, FixedVector< double, 3 > &q) override
double operator()(double kobayashi_constant, double dx, double dy, double dz, double rho, FixedVector< FixedVector< double, 3 >, 3 > &g, FixedVector< double, 3 > &q) override
double operator()(double rds_constant, double dx, double dy, double dz, double rho, FixedVector< FixedVector< double, 3 >, 3 > &g, FixedVector< double, 3 > &q) override
double operator()(double sigma_constant, double dx, double dy, double dz, double rho, FixedVector< FixedVector< double, 3 >, 3 > &g, FixedVector< double, 3 > &q) override
double operator()(double smagorinsky_constant, double dx, double dy, double dz, double rho, FixedVector< FixedVector< double, 3 >, 3 > &g, FixedVector< double, 3 > &q) override
double operator()(double constant, double dx, double dy, double dz, double rho, FixedVector< FixedVector< double, 3 >, 3 > &g, FixedVector< double, 3 > &q) override
double operator()(double vreman_constant, double dx, double dy, double dz, double rho, FixedVector< FixedVector< double, 3 >, 3 > &g, FixedVector< double, 3 > &q) override
double operator()(double vss_constant, double dx, double dy, double dz, double rho, FixedVector< FixedVector< double, 3 >, 3 > &g, FixedVector< double, 3 > &q) override
double operator()(double wale_constant, double dx, double dy, double dz, double rho, FixedVector< FixedVector< double, 3 >, 3 > &g, FixedVector< double, 3 > &q) override