TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Modele_turbulence_hyd_LES_SMAGO_DYN_VDF.cpp
1/****************************************************************************
2* Copyright (c) 2024, 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 <Modele_turbulence_hyd_LES_SMAGO_DYN_VDF.h>
17#include <Champ_Fonc_P0_VDF.h>
18#include <Schema_Temps_base.h>
19#include <Champ_Face_VDF.h>
20#include <Domaine_Cl_VDF.h>
21#include <Perf_counters.h>
22#include <Equation_base.h>
23#include <Domaine_VDF.h>
24#include <TRUSTTrav.h>
25#include <TRUSTTrav.h>
26#include <SFichier.h>
27#include <Domaine.h>
28#include <Debog.h>
29#include <Param.h>
30
31Implemente_instanciable(Modele_turbulence_hyd_LES_SMAGO_DYN_VDF, "Modele_turbulence_hyd_sous_maille_SMAGO_DYN_VDF", Modele_turbulence_hyd_LES_Smago_VDF);
32
34
36
42
44{
45 Motcle motlutmp;
46 if (mot == "stabilise")
47 {
48 Motcles les_motcles(4);
49 {
50 les_motcles[0] = "6_points";
51 les_motcles[1] = "plans_paralleles";
52 les_motcles[2] = "moy_euler";
53 les_motcles[3] = "moy_lagrange";
54 }
55
56 is >> motlutmp;
57 int rang = les_motcles.search(motlutmp);
58 switch(rang)
59 {
60 case 0:
61 {
62 methode_stabilise_ = "6_POINTS";
63 break;
64 }
65 case 1:
66 {
67 methode_stabilise_ = "PLANS_PARALLELES";
68 is >> motlutmp;
69 if (motlutmp == "Nb_points")
70 {
71 is >> N_c_;
73 }
74 else
75 {
76 Cerr << "The keywords stablise plans_paralleles must be followed by the keyword Nb_points.\n" << finl;
77 assert(0);
79 }
80 break;
81 }
82 case 2:
83 {
84 methode_stabilise_ = "MOY_EULER";
85 break;
86 }
87 case 3:
88 {
89 methode_stabilise_ = "MOY_LAGRANGE";
91 break;
92 }
93 default:
94 {
95 Cerr << "Error while reading : " << que_suis_je() << finl;
96 Cerr << motlutmp << " is not understood. Available keywords are : " << finl;
97 Cerr << les_motcles;
98 assert(0);
100 }
101 }
102 return 1;
103 }
104 else
106}
107
109{
110 Modele_turbulence_hyd_LES_Smago_VDF::associer(domaine_dis, domaine_Cl_dis);
111
112 Cerr << "Discretisation de coeff_field" << finl;
113 Cerr << "coeff_field discretization" << finl;
114 coeff_field_.typer("Champ_Fonc_P0_VDF");
115 Champ_Fonc_P0_VDF& coeff = ref_cast(Champ_Fonc_P0_VDF, coeff_field_.valeur());
116 coeff.associer_domaine_dis_base(le_dom_VF_.valeur());
117 coeff.nommer("dynamic_coefficient");
118 coeff.fixer_nb_comp(1);
119 coeff.fixer_nb_valeurs_nodales(le_dom_VF_->nb_elem());
120 coeff.fixer_unite("adim");
121 coeff.changer_temps(0.);
122
123 champs_compris_.ajoute_champ(coeff_field_);
124}
125
132
134{
135 statistics().begin_count(STD_COUNTERS::turbulent_viscosity, statistics().get_last_opened_counter_level()+1);
136 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_VF_.valeur());
137 const Domaine_Cl_VDF& domaine_Cl_VDF = ref_cast(Domaine_Cl_VDF, le_dom_Cl_.valeur());
138
139 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot();
140 DoubleTab Sij_test_scale(0, dimension, dimension);
141 domaine_VDF.domaine().creer_tableau_elements(Sij_test_scale);
142 DoubleTrav Sij_grid_scale(Sij_test_scale);
143
144 DoubleTrav S_test_scale_norme;
145 domaine_VDF.domaine().creer_tableau_elements(S_test_scale_norme);
146 DoubleTrav S_grid_scale_norme;
147 domaine_VDF.domaine().creer_tableau_elements(S_grid_scale_norme);
148
149 if (cell_cent_vel_.size()==0)
150 {
151 cell_cent_vel_.resize(0, dimension);
153 }
154
155
156 DoubleTab filt_vel(0, dimension);
157 domaine_VDF.domaine().creer_tableau_elements(filt_vel);
158 DoubleTrav Lij(Sij_test_scale);
159 DoubleTrav Mij(Sij_test_scale);
160 DoubleTrav l(nb_elem_tot);
161
162 calculer_length_scale(l, domaine_VDF);
163 calculer_cell_cent_vel(cell_cent_vel_, domaine_VDF, mon_equation_->inconnue());
164 calculer_filter_field(cell_cent_vel_, filt_vel, domaine_VDF);
165
166 calculer_Lij(cell_cent_vel_, filt_vel, Lij);
167
168 calculer_Sij(Sij_grid_scale, domaine_VDF, domaine_Cl_VDF, mon_equation_->inconnue());
169 calculer_Sij_vel_filt(filt_vel, Sij_test_scale, domaine_VDF);
170
171 calculer_S_norme(Sij_grid_scale, S_grid_scale_norme, domaine_VDF.domaine().nb_elem_tot());
172 calculer_S_norme(Sij_test_scale, S_test_scale_norme, domaine_VDF.domaine().nb_elem_tot());
173
174 calculer_Mij(Sij_grid_scale, Sij_test_scale, l, Mij);
175
177
178 calculer_viscosite_turbulente(S_grid_scale_norme, l);
179 calculer_energie_cinetique_turb(S_grid_scale_norme, l);
180 loipar_->calculer_hyd(la_viscosite_turbulente_->valeurs(), energie_cinetique_turbulente().valeurs());
183 coeff_field_->changer_temps(temps);
184 la_viscosite_turbulente_->valeurs().echange_espace_virtuel();
185 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::mettre_a_jour la_viscosite_turbulente_ after", la_viscosite_turbulente_->valeurs());
186
187 statistics().end_count(STD_COUNTERS::turbulent_viscosity);
188}
189
191{
192 const DoubleTab& vitesse = inco.valeurs();
193
194 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_cell_cent_vel INPUT vitesse (inco.valeurs)", vitesse);
195
196 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot();
197 const IntTab& elem_faces = domaine_VDF.elem_faces();
198 int num0, num1, num2, num3, num4 = -1, num5 = -1;
199
200 // This is to calculate the cell centered velocity values
201 for (int element_number = 0; element_number < nb_elem_tot; element_number++)
202 {
203 num0 = elem_faces(element_number, 0);
204 num1 = elem_faces(element_number, 1);
205 num2 = elem_faces(element_number, 2);
206 num3 = elem_faces(element_number, 3);
207 if (dimension == 3)
208 {
209 num4 = elem_faces(element_number, 4);
210 num5 = elem_faces(element_number, 5);
211 }
212
213 if (dimension == 2)
214 {
215 cell_cent_vel(element_number, 0) = 0.5 * (vitesse[num0] + vitesse[num2]);
216 cell_cent_vel(element_number, 1) = 0.5 * (vitesse[num1] + vitesse[num3]);
217 }
218 else
219 {
220 cell_cent_vel(element_number, 0) = 0.5 * (vitesse[num0] + vitesse[num3]);
221 cell_cent_vel(element_number, 1) = 0.5 * (vitesse[num1] + vitesse[num4]);
222 cell_cent_vel(element_number, 2) = 0.5 * (vitesse[num2] + vitesse[num5]);
223 }
224 }
225
226 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_cell_cent_vel OUTPUT cell_cent_vel", cell_cent_vel);
227}
228
229void Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_filter_field(const DoubleTab& in_vel, DoubleTab& out_vel, const Domaine_VDF& domaine_VDF)
230{
231 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_filter_field INPUT in_vel", in_vel);
232 const IntTab& face_voisins = domaine_VDF.face_voisins();
233 int nb_elem = domaine_VDF.domaine().nb_elem();
234 const IntTab& elem_faces = domaine_VDF.elem_faces();
235 int element_number;
236 int num0, num1, num2, num3, num4, num5;
237 int f0, f1, f2, f3, f4, f5;
238 int i;
239
240 DoubleTrav temp1(out_vel);
241 DoubleTrav temp2(out_vel);
242
243 // This is to calculate the filtered velocity field
244
245 if (dimension == 2)
246 {
247 for (element_number = 0; element_number < nb_elem; element_number++)
248 {
249 f0 = elem_faces(element_number, 0);
250 num0 = face_voisins(f0, 0);
251 f2 = elem_faces(element_number, 2);
252 num2 = face_voisins(f2, 1);
253 if ((num0 == -1) || (num2 == -1))
254 for (i = 0; i < dimension; i++)
255 temp1(element_number, i) = in_vel(element_number, i);
256 else
257 {
258 for (i = 0; i < dimension; i++)
259 {
260 temp1(element_number, i) = 0.25 * (in_vel(num0, i) + 2.0 * in_vel(element_number, i) + in_vel(num2, i));
261 }
262 }
263 }
265 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_filter_field temp1 1", temp1);
266 for (element_number = 0; element_number < nb_elem; element_number++)
267 {
268 f1 = elem_faces(element_number, 1);
269 num1 = face_voisins(f1, 0);
270 f3 = elem_faces(element_number, 3);
271 num3 = face_voisins(f3, 1);
272 if ((num1 == -1) || (num3 == -1))
273 for (i = 0; i < dimension; i++)
274 out_vel(element_number, i) = temp1(element_number, i);
275 else
276 {
277 for (i = 0; i < dimension; i++)
278 {
279 out_vel(element_number, i) = 0.25 * (temp1(num1, i) + 2.0 * temp1(element_number, i) + temp1(num3, i));
280 }
281 }
282 }
283 out_vel.echange_espace_virtuel();
284 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_filter_field out_vel 1", out_vel);
285 }
286 else
287 {
288 for (element_number = 0; element_number < nb_elem; element_number++)
289 {
290 f0 = elem_faces(element_number, 0);
291 num0 = face_voisins(f0, 0);
292 f3 = elem_faces(element_number, 3);
293 num3 = face_voisins(f3, 1);
294 if ((num0 == -1) || (num3 == -1))
295 for (i = 0; i < dimension; i++)
296 temp1(element_number, i) = in_vel(element_number, i);
297 else
298 {
299 for (i = 0; i < dimension; i++)
300 {
301 temp1(element_number, i) = 0.25 * (in_vel(num0, i) + 2.0 * in_vel(element_number, i) + in_vel(num3, i));
302 }
303 }
304 }
306 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_filter_field temp1 2", temp1);
307 for (element_number = 0; element_number < nb_elem; element_number++)
308 {
309 f1 = elem_faces(element_number, 1);
310 num1 = face_voisins(f1, 0);
311 f4 = elem_faces(element_number, 4);
312 num4 = face_voisins(f4, 1);
313 if ((num1 == -1) || (num4 == -1))
314 for (i = 0; i < dimension; i++)
315 temp2(element_number, i) = temp1(element_number, i);
316 else
317 {
318 for (i = 0; i < dimension; i++)
319 {
320 temp2(element_number, i) = 0.25 * (temp1(num1, i) + 2.0 * temp1(element_number, i) + temp1(num4, i));
321 }
322 }
323 }
325 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_filter_field temp2 1", temp2);
326 for (element_number = 0; element_number < nb_elem; element_number++)
327 {
328 f2 = elem_faces(element_number, 2);
329 num2 = face_voisins(f2, 0);
330 f5 = elem_faces(element_number, 5);
331 num5 = face_voisins(f5, 1);
332 if ((num2 == -1) || (num5 == -1))
333 for (i = 0; i < dimension; i++)
334 out_vel(element_number, i) = temp2(element_number, i);
335 else
336 {
337 for (i = 0; i < dimension; i++)
338 {
339 out_vel(element_number, i) = 0.25 * (temp2(num2, i) + 2.0 * temp2(element_number, i) + temp2(num5, i));
340 }
341 }
342 }
343 out_vel.echange_espace_virtuel();
344 }
345
346
347 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_filter_field OUTPUT out_vel", out_vel);
348
349}
350
352{
353 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_VF_.valeur());
354 const IntTab& face_voisins = domaine_VDF.face_voisins();
355 int nb_elem = domaine_VDF.domaine().nb_elem();
356 const IntTab& elem_faces = domaine_VDF.elem_faces();
357 int element_number;
358 int num0, num1, num2, num3, num4, num5;
359 int f0, f1, f2, f3, f4, f5;
360 int i, j;
361
362 DoubleTrav temp1(in_vel);
363 DoubleTrav temp2(in_vel);
364
365 // This is to calculate the filtered tensor field
366
367 if (dimension == 2)
368 {
369 for (element_number = 0; element_number < nb_elem; element_number++)
370 {
371 f0 = elem_faces(element_number, 0);
372 num0 = face_voisins(f0, 0);
373 f2 = elem_faces(element_number, 2);
374 num2 = face_voisins(f2, 1);
375 if ((num0 == -1) || (num2 == -1))
376 for (i = 0; i < dimension; i++)
377 for (j = 0; j < dimension; j++)
378 temp1(element_number, i, j) = in_vel(element_number, i, j);
379 else
380 {
381 for (i = 0; i < dimension; i++)
382 for (j = 0; j < dimension; j++)
383 {
384 temp1(element_number, i, j) = 0.25 * (in_vel(num0, i, j) + 2.0 * in_vel(element_number, i, j) + in_vel(num2, i, j));
385 }
386 }
387 }
389 for (element_number = 0; element_number < nb_elem; element_number++)
390 {
391 f1 = elem_faces(element_number, 1);
392 num1 = face_voisins(f1, 0);
393 f3 = elem_faces(element_number, 3);
394 num3 = face_voisins(f3, 1);
395 if ((num1 == -1) || (num3 == -1))
396 for (i = 0; i < dimension; i++)
397 for (j = 0; j < dimension; j++)
398 in_vel(element_number, i, j) = temp1(element_number, i, j);
399 else
400 {
401 for (i = 0; i < dimension; i++)
402 for (j = 0; j < dimension; j++)
403 {
404 in_vel(element_number, i, j) = 0.25 * (temp1(num1, i, j) + 2.0 * temp1(element_number, i, j) + temp1(num3, i, j));
405 }
406 }
407 }
408 in_vel.echange_espace_virtuel();
409 }
410 else
411 {
412 for (element_number = 0; element_number < nb_elem; element_number++)
413 {
414 f0 = elem_faces(element_number, 0);
415 num0 = face_voisins(f0, 0);
416 f3 = elem_faces(element_number, 3);
417 num3 = face_voisins(f3, 1);
418 if ((num0 == -1) || (num3 == -1))
419 for (i = 0; i < dimension; i++)
420 for (j = 0; j < dimension; j++)
421 temp1(element_number, i, j) = in_vel(element_number, i, j);
422 else
423 {
424 for (i = 0; i < dimension; i++)
425 for (j = 0; j < dimension; j++)
426 {
427 temp1(element_number, i, j) = 0.25 * (in_vel(num0, i, j) + 2.0 * in_vel(element_number, i, j) + in_vel(num3, i, j));
428 }
429 }
430 }
432 for (element_number = 0; element_number < nb_elem; element_number++)
433 {
434 f1 = elem_faces(element_number, 1);
435 num1 = face_voisins(f1, 0);
436 f4 = elem_faces(element_number, 4);
437 num4 = face_voisins(f4, 1);
438 if ((num1 == -1) || (num4 == -1))
439 for (i = 0; i < dimension; i++)
440 for (j = 0; j < dimension; j++)
441 temp2(element_number, i, j) = temp1(element_number, i, j);
442 else
443 {
444 for (i = 0; i < dimension; i++)
445 for (j = 0; j < dimension; j++)
446 {
447 temp2(element_number, i, j) = 0.25 * (temp1(num1, i, j) + 2.0 * temp1(element_number, i, j) + temp1(num4, i, j));
448 }
449 }
450 }
452 for (element_number = 0; element_number < nb_elem; element_number++)
453 {
454 f2 = elem_faces(element_number, 2);
455 num2 = face_voisins(f2, 0);
456 f5 = elem_faces(element_number, 5);
457 num5 = face_voisins(f5, 1);
458 if ((num2 == -1) || (num5 == -1))
459 for (i = 0; i < dimension; i++)
460 for (j = 0; j < dimension; j++)
461 in_vel(element_number, i, j) = temp2(element_number, i, j);
462 else
463 {
464 for (i = 0; i < dimension; i++)
465 for (j = 0; j < dimension; j++)
466 {
467 in_vel(element_number, i, j) = 0.25 * (temp2(num2, i, j) + 2.0 * temp2(element_number, i, j) + temp2(num5, i, j));
468 }
469 }
470 }
471 in_vel.echange_espace_virtuel();
472 }
473}
474
475void Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Lij(const DoubleTab& cell_cent_vel, const DoubleTab& filt_vel, DoubleTab& Lij)
476{
477 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Lij INPUT cell_cent_vel", cell_cent_vel);
478 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Lij INPUT filt_vel", filt_vel);
479
480 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_VF_.valeur());
481 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot();
482 int element_number;
483
484 DoubleTab uij_filt(Lij);
485
486 // This is to calculate the Lij term for the C coefficient
487 for (element_number = 0; element_number < nb_elem_tot; element_number++)
488 {
489 for (int i = 0; i < dimension; i++)
490 for (int j = 0; j < dimension; j++)
491 uij_filt(element_number, i, j) = cell_cent_vel(element_number, i) * cell_cent_vel(element_number, j);
492 }
493 calculer_filter_tensor(uij_filt);
494
495 for (element_number = 0; element_number < nb_elem_tot; element_number++)
496 {
497 for (int i = 0; i < dimension; i++)
498 for (int j = 0; j < dimension; j++)
499 Lij(element_number, i, j) = uij_filt(element_number, i, j) - filt_vel(element_number, i) * filt_vel(element_number, j);
500 }
501
502
503 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Lij OUTPUT Lij", Lij);
504}
505
506void Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Mij(const DoubleTab& Sij_grid_scale, const DoubleTab& Sij_test_scale, const DoubleVect& l, DoubleTab& Mij)
507{
508 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Mij INPUT Sij_grid_scale", Sij_grid_scale);
509 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Mij INPUT Sij_test_scale", Sij_test_scale);
510 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Mij INPUT l", l);
511 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_VF_.valeur());
512 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot();
513
514 DoubleTrav Sij_grid_scale_norme(nb_elem_tot);
515 DoubleTrav Sij_test_scale_norme(nb_elem_tot);
516 DoubleTrav S_norme_Sij_filt(Mij);
517 const double alpha = sqrt(6.0);
518
519 // This is to calculate the Mij term for the C coefficient
520
521 calculer_S_norme(Sij_grid_scale, Sij_grid_scale_norme, domaine_VDF.domaine().nb_elem_tot());
522 calculer_S_norme(Sij_test_scale, Sij_test_scale_norme, domaine_VDF.domaine().nb_elem_tot());
523 for (int element_number = 0; element_number < nb_elem_tot; element_number++)
524 for (int i = 0; i < dimension; i++)
525 for (int j = 0; j < dimension; j++)
526 S_norme_Sij_filt(element_number, i, j) = Sij_grid_scale_norme(element_number) * Sij_grid_scale(element_number, i, j);
527
528 calculer_filter_tensor(S_norme_Sij_filt);
529
530 for (int element_number = 0; element_number < nb_elem_tot; element_number++)
531 for (int i = 0; i < dimension; i++)
532 for (int j = 0; j < dimension; j++)
533 Mij(element_number, i, j) = 2 * l[element_number] * l[element_number]
534 * (S_norme_Sij_filt(element_number, i, j) - alpha * alpha * Sij_test_scale_norme(element_number) * Sij_test_scale(element_number, i, j));
535 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Mij OUTPUT Mij", Mij);
536}
537
538void Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_model_coefficient(const DoubleTab& Lij, const DoubleTab& Mij)
539{
540 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_model_coefficient INPUT Lij", Lij);
541 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_model_coefficient INPUT Mij", Mij);
542 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_VF_.valeur());
543 DoubleVect& model_coeff = coeff_field_->valeurs();
544 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot();
545 int nb_elem = domaine_VDF.domaine().nb_elem();
546 DoubleTab haut, bas;
547 domaine_VDF.domaine().creer_tableau_elements(haut);
548 domaine_VDF.domaine().creer_tableau_elements(bas);
549 // Evaluate the dynamic model coeficient C
550 for (int elem = 0; elem < nb_elem; elem++)
551 {
552 haut(elem) = 0.;
553 bas(elem) = 0.;
554 for (int i = 0; i < dimension; i++)
555 for (int j = 0; j < dimension; j++)
556 {
557 haut(elem) += Lij(elem, i, j) * Mij(elem, i, j);
558 bas(elem) += Mij(elem, i, j) * Mij(elem, i, j);
559 }
560 }
563
564 stabilise_moyenne(haut, bas);
565
566 int i = 0;
567 int j = 0;
568 for (int elem = 0; elem < nb_elem; elem++)
569 {
570 if (model_coeff(elem) < 0.0)
571 {
572 model_coeff(elem) = 0.0;
573 i++;
574 }
575 else if (model_coeff(elem) > 0.5)
576 {
577 // model_coeff(elem) = 0.5; // if I remove this line, no more seq/par diffs
578 j++;
579 }
580 }
581 model_coeff.echange_espace_virtuel();
582
583 if (i != 0)
584 {
585 Journal() <<"Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_model_coefficient: "
586 << i<<"/"<< nb_elem_tot
587 << " elements ont un coefficient inferieur a 0.0 (modele dynamique)" << finl;
588 }
589 if (j != 0)
590 {
591 Journal() <<"Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_model_coefficient: "
592 << j <<"/"<< nb_elem_tot
593 << " elements ont un coefficient superieur a 0.5 (modele dynamique)" << finl;
594 }
595
596 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_model_coefficient OUTPUT model_coeff", model_coeff);
597}
598
600{
601 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot();
602 const IntTab& elem_faces = domaine_VDF.elem_faces();
603 const IntVect& orientation = domaine_VDF.orientation();
604 int elem;
605
606 // calcul de la longueur caracteristique de l'element
607
608 for (elem = 0; elem < nb_elem_tot; elem++)
609 {
610 double l_int;
611 if (dimension == 3)
612 {
613 l_int = domaine_VDF.dim_elem(elem, orientation(elem_faces(elem, 0)));
614 l_int *= domaine_VDF.dim_elem(elem, orientation(elem_faces(elem, 1)));
615 l_int *= domaine_VDF.dim_elem(elem, orientation(elem_faces(elem, 2)));
616 l(elem) = exp((log(l_int) / 3.));
617 }
618 else
619 {
620 l_int = domaine_VDF.dim_elem(elem, orientation(elem_faces(elem, 0)));
621 l_int *= domaine_VDF.dim_elem(elem, orientation(elem_faces(elem, 1)));
622 l[elem] = sqrt(l_int);
623 }
624 }
625 // sometimes it is passed as ditributed, sometimes not...
626 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_length_scale OUTPUT l", l);
627}
628
630{
631 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_viscosite_turbulente INPUT SMA_barre", SMA_barre);
632 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_viscosite_turbulente INPUT l", l);
633 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_VF_.valeur());
634 DoubleVect& model_coeff = coeff_field_->valeurs();
635 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_viscosite_turbulente INPUT model_coeff", model_coeff);
636 double temps = mon_equation_->inconnue().temps();
637 DoubleTab& visco_turb = la_viscosite_turbulente_->valeurs();
638 int nb_elem = domaine_VDF.domaine().nb_elem();
639
640 if (visco_turb.size() != domaine_VDF.domaine().nb_elem())
641 {
642 Cerr << "Size error for the array containing the values of the turbulent viscosity." << finl;
644 }
645
646 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_viscosite_turbulente visco_turb 0", visco_turb);
647
648 for (int elem = 0; elem < nb_elem; elem++)
649 visco_turb[elem] = model_coeff[elem] * l[elem] * l[elem] * sqrt(SMA_barre[elem]);
650
651
652 visco_turb.echange_espace_virtuel();
653 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_viscosite_turbulente OUTPUT visco_turb", visco_turb);
654
655 la_viscosite_turbulente_->changer_temps(temps);
656 return la_viscosite_turbulente_;
657}
658
660{
661 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_viscosite_turbulente() OUTPUT la_viscosite_turbulente_", la_viscosite_turbulente_->valeurs());
662 return la_viscosite_turbulente_;
663}
664
666{
667 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_energie_cinetique_turb IN SMA_barre", SMA_barre);
668 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_energie_cinetique_turb IN l", l);
669 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_VF_.valeur());
670 DoubleVect& model_coeff = coeff_field_->valeurs();
671 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_energie_cinetique_turb IN model_coeff", model_coeff);
672 double temps = mon_equation_->inconnue().temps();
673 DoubleVect& k = energie_cinetique_turb_->valeurs();
674 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot();
675 constexpr double co_mu = 1. / (0.094 * 0.094);
676
677 for (int elem = 0; elem < nb_elem_tot; elem++)
678 {
679 k[elem] = co_mu * model_coeff[elem] * model_coeff[elem] * l[elem] * l[elem] * SMA_barre[elem];
680 }
681
682 energie_cinetique_turb_->changer_temps(temps);
683 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_energie_cinetique_turb OUT energie_cinetique_turb_", k);
684 return energie_cinetique_turb_;
685}
686
691
693{
694 static const double Cmu = CMU;
695 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_VF_.valeur());
696 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot();
697 DoubleTab& visco_turb = la_viscosite_turbulente_->valeurs();
698 DoubleVect& energie_turb = energie_cinetique_turb_->valeurs();
699 double k, eps;
700
701 for (int elem = 0; elem < nb_elem_tot; elem++)
702 {
703 k = energie_turb[elem];
704 if (k <= 1.e-10)
705 energie_turb[elem] = 0.;
706 else
707 {
708 eps = Cmu * k * k / (visco_turb[elem] + DMINFLOAT);
709 if (eps < 1.e-15)
710 visco_turb[elem] = 0;
711 }
712 }
713}
714
715void Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_S_norme(const DoubleTab& Sij, DoubleVect& S_norme, int nb_elem_tot)
716{
717 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_S_norme INPUT Sij",Sij);
718 S_norme = 0.0;
719 for (int element_number = 0; element_number < nb_elem_tot; element_number++)
720 for (int i = 0; i < dimension; i++)
721 for (int j = 0; j < dimension; j++)
722 S_norme(element_number) += Sij(element_number, i, j) * Sij(element_number, i, j);
723
724 for (int element_number = 0; element_number < nb_elem_tot; element_number++)
725 S_norme(element_number) = sqrt(2 * S_norme(element_number));
726
727 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_S_norme OUTPUT S_norme",S_norme);
728}
729
730void Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Sij(DoubleTab& Sij, const Domaine_VDF& domaine_VDF, const Domaine_Cl_VDF& domaine_Cl_VDF, Champ_Inc_base& inco)
731{
732 Champ_Face_VDF& vit = ref_cast(Champ_Face_VDF, inco);
733 const DoubleTab& vitesse = inco.valeurs();
734 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Sij INPUT vitesse",vitesse);
735
736 const int nb_elem_tot = domaine_VDF.nb_elem_tot();
737 const int nb_elem = domaine_VDF.nb_elem();
738 assert(vitesse.line_size() == 1);
739 DoubleTab gij(nb_elem_tot, dimension, dimension, vitesse.line_size());
740
741 vit.calcul_duidxj(vitesse, gij, domaine_Cl_VDF);
742 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Sij MID gij",gij);
743
744 // Calcul de Sij
745 for (int elem = 0; elem < nb_elem; elem++)
746 for (int i = 0; i < dimension; i++)
747 for (int j = 0; j < dimension; j++)
748 Sij(elem, i, j) = 0.5 * (gij(elem, i, j, 0) + gij(elem, j, i, 0));
750
751 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Sij OUTPUT Sij",Sij);
752}
753
754void Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Sij_vel_filt(const DoubleTab& in_vel, DoubleTab& out_vel, const Domaine_VDF& domaine_VDF)
755{
756 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Sij_vel_filt INPUT in_vel",in_vel);
757 int nb_elem = domaine_VDF.domaine().nb_elem();
758 const IntTab& face_voisins = domaine_VDF.face_voisins();
759 const IntTab& elem_faces = domaine_VDF.elem_faces();
760
761 int element_number;
762 int num0, num1, num2, num3, num4, num5;
763 int f0, f1, f2, f3, f4, f5;
764
765 if (dimension == 2)
766 {
767 for (element_number = 0; element_number < nb_elem; element_number++)
768 {
769 f0 = elem_faces(element_number, 0);
770 num0 = face_voisins(f0, 0);
771 if (num0 == -1)
772 num0 = element_number;
773 f1 = elem_faces(element_number, 1);
774 num1 = face_voisins(f1, 0);
775 if (num1 == -1)
776 num1 = element_number;
777 f2 = elem_faces(element_number, 2);
778 num2 = face_voisins(f2, 1);
779 if (num2 == -1)
780 num2 = element_number;
781 f3 = elem_faces(element_number, 3);
782 num3 = face_voisins(f3, 1);
783 if (num3 == -1)
784 num3 = element_number;
785 out_vel(element_number, 0, 0) = 0.5 * ((in_vel(num2, 0) - in_vel(num0, 0)) / domaine_VDF.dim_elem(element_number, 0));
786 out_vel(element_number, 0, 1) = out_vel(element_number, 1, 0) = 0.25
787 * ((in_vel(num3, 0) - in_vel(num1, 0)) / domaine_VDF.dim_elem(element_number, 1) + (in_vel(num2, 1) - in_vel(num0, 1)) / domaine_VDF.dim_elem(element_number, 0));
788 out_vel(element_number, 1, 1) = 0.5 * ((in_vel(num3, 1) - in_vel(num1, 1)) / domaine_VDF.dim_elem(element_number, 1));
789 }
790 }
791 else
792 {
793 for (element_number = 0; element_number < nb_elem; element_number++)
794 {
795 f0 = elem_faces(element_number, 0);
796 num0 = face_voisins(f0, 0);
797 if (num0 == -1)
798 num0 = element_number;
799 f1 = elem_faces(element_number, 1);
800 num1 = face_voisins(f1, 0);
801 if (num1 == -1)
802 num1 = element_number;
803 f2 = elem_faces(element_number, 2);
804 num2 = face_voisins(f2, 0);
805 if (num2 == -1)
806 num2 = element_number;
807 f3 = elem_faces(element_number, 3);
808 num3 = face_voisins(f3, 1);
809 if (num3 == -1)
810 num3 = element_number;
811 f4 = elem_faces(element_number, 4);
812 num4 = face_voisins(f4, 1);
813 if (num4 == -1)
814 num4 = element_number;
815 f5 = elem_faces(element_number, 5);
816 num5 = face_voisins(f5, 1);
817 if (num5 == -1)
818 num5 = element_number;
819 out_vel(element_number, 0, 0) = 0.5 * ((in_vel(num3, 0) - in_vel(num0, 0)) / domaine_VDF.dim_elem(element_number, 0));
820 out_vel(element_number, 0, 1) = out_vel(element_number, 1, 0) = 0.25
821 * ((in_vel(num4, 0) - in_vel(num1, 0)) / domaine_VDF.dim_elem(element_number, 1) + (in_vel(num3, 1) - in_vel(num0, 1)) / domaine_VDF.dim_elem(element_number, 0));
822 out_vel(element_number, 0, 2) = out_vel(element_number, 2, 0) = 0.25
823 * ((in_vel(num5, 0) - in_vel(num2, 0)) / domaine_VDF.dim_elem(element_number, 2) + (in_vel(num3, 2) - in_vel(num0, 2)) / domaine_VDF.dim_elem(element_number, 0));
824 out_vel(element_number, 1, 1) = 0.5 * ((in_vel(num4, 1) - in_vel(num1, 1)) / domaine_VDF.dim_elem(element_number, 1));
825 out_vel(element_number, 1, 2) = out_vel(element_number, 2, 1) = 0.25
826 * ((in_vel(num5, 1) - in_vel(num2, 1)) / domaine_VDF.dim_elem(element_number, 2) + (in_vel(num4, 2) - in_vel(num1, 2)) / domaine_VDF.dim_elem(element_number, 1));
827 out_vel(element_number, 2, 2) = 0.5 * ((in_vel(num5, 2) - in_vel(num2, 2)) / domaine_VDF.dim_elem(element_number, 2));
828 }
829 }
830 out_vel.echange_espace_virtuel();
831 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Sij_vel_filt OUTPUT out_vel",out_vel);
832}
833
834//////////////////////////////////////////////////////////////////////
835void Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::stabilise_moyenne(const DoubleTab& haut, const DoubleTab& bas)
836{
837 if (methode_stabilise_ == "plans_paralleles")
839 else if (methode_stabilise_ == "6_points")
841 else if (methode_stabilise_ == "moy_euler" || methode_stabilise_ == "moy_lagrange")
843 else
844 {
845 Cerr << "Problem with the definition of the stabilisation method." << finl;
847 }
848}
849
850void Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::stabilise_moyenne_6_points(const DoubleTab& haut, const DoubleTab& bas)
851{
852 DoubleVect& model_coeff = coeff_field_->valeurs();
853 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_VF_.valeur());
854 const IntTab& face_voisins = domaine_VDF.face_voisins();
855 int nb_elem = domaine_VDF.domaine().nb_elem();
856 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot();
857 const IntTab& elem_faces = domaine_VDF.elem_faces();
858 int element_number;
859 int num0, num1, num2, num3, num4, num5;
860 int f0, f1, f2, f3, f4, f5;
861
862 DoubleTrav temp1(model_coeff);
863 DoubleTrav temp2(model_coeff);
864 // Evaluate the dynamic model coeficient C
865 for (element_number = 0; element_number < nb_elem_tot; element_number++)
866 {
867 if (std::fabs(bas(element_number)) < 1.e-12)
868 model_coeff[element_number] = 0.;
869 else
870 model_coeff[element_number] = haut[element_number] / bas[element_number];
871 }
872 // Stabilisation du modele par moyennage sur 6 noeuds
873 if (dimension == 2)
874 {
875 for (element_number = 0; element_number < nb_elem; element_number++)
876 {
877 f0 = elem_faces(element_number, 0);
878 num0 = face_voisins(f0, 0);
879 f2 = elem_faces(element_number, 2);
880 num2 = face_voisins(f2, 1);
881 if ((num0 == -1) || (num2 == -1))
882 temp1(element_number) = 3.0 * model_coeff(element_number);
883 else
884 {
885 temp1(element_number) = model_coeff(num0) + model_coeff(element_number) + model_coeff(num2);
886 }
887 }
889 for (element_number = 0; element_number < nb_elem; element_number++)
890 {
891 f1 = elem_faces(element_number, 1);
892 num1 = face_voisins(f1, 0);
893 f3 = elem_faces(element_number, 3);
894 num3 = face_voisins(f3, 1);
895 if ((num1 == -1) || (num3 == -1))
896 model_coeff(element_number) = temp1(element_number) / 3.0;
897 else
898 {
899 model_coeff(element_number) = (temp1(num1) + temp1(element_number) + temp1(num3)) / 9.0;
900 }
901 }
902 }
903 else
904 {
905 for (element_number = 0; element_number < nb_elem; element_number++)
906 {
907 f0 = elem_faces(element_number, 0);
908 num0 = face_voisins(f0, 0);
909 f3 = elem_faces(element_number, 3);
910 num3 = face_voisins(f3, 1);
911 if ((num0 == -1) || (num3 == -1))
912 temp1(element_number) = 3.0 * model_coeff(element_number);
913 else
914 {
915 temp1(element_number) = model_coeff(num0) + model_coeff(element_number) + model_coeff(num3);
916 }
917 }
919 for (element_number = 0; element_number < nb_elem; element_number++)
920 {
921 f1 = elem_faces(element_number, 1);
922 num1 = face_voisins(f1, 0);
923 f4 = elem_faces(element_number, 4);
924 num4 = face_voisins(f4, 1);
925 if ((num1 == -1) || (num4 == -1))
926 temp2(element_number) = 3.0 * temp1(element_number);
927 else
928 {
929 temp2(element_number) = temp1(num1) + temp1(element_number) + temp1(num4);
930 }
931 }
933 for (element_number = 0; element_number < nb_elem; element_number++)
934 {
935 f2 = elem_faces(element_number, 2);
936 num2 = face_voisins(f2, 0);
937 f5 = elem_faces(element_number, 5);
938 num5 = face_voisins(f5, 1);
939 if ((num2 == -1) || (num5 == -1))
940 model_coeff(element_number) = temp2(element_number) / 9.0;
941 else
942 {
943 model_coeff(element_number) = (temp2(num2) + temp2(element_number) + temp2(num5)) / 27.0;
944 }
945 }
946 }
947 model_coeff.echange_espace_virtuel();
948}
949
951{
952 DoubleVect& model_coeff = coeff_field_->valeurs();
953 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_VF_.valeur());
954 int nb_elem = domaine_VDF.domaine().nb_elem();
955 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot();
956 DoubleVect model_coeff_tmp(N_c_);
957
958 // Evaluate the dynamic model coeficient C
959 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::stabilise_moyenne_plans_paralleles model_coeff avant haut/bas", model_coeff);
960 for (int element_number = 0; element_number < nb_elem_tot; element_number++)
961 {
962 if (std::fabs(bas(element_number)) < 1.e-12)
963 model_coeff[element_number] = 0.;
964 else
965 model_coeff[element_number] = haut[element_number] / bas[element_number];
966 }
967 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::stabilise_moyenne_plans_paralleles model_coeff apres haut/bas", model_coeff);
968 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::stabilise_moyenne_plans_paralleles corresp_c apres haut/bas", corresp_c_);
969 for (int j = 0; j < N_c_; j++)
970 model_coeff_tmp(j) = 0.0;
971
972 for (int element_number = 0; element_number < nb_elem; element_number++)
973 model_coeff_tmp(corresp_c_(element_number)) += model_coeff(element_number);
974
975 for (int j = 0; j < N_c_; j++)
976 {
977 model_coeff_tmp(j) = Process::mp_sum(model_coeff_tmp(j));
978 model_coeff_tmp(j) /= Process::check_int_overflow(Process::mp_sum(compt_c_(j)));
979 }
980 for (int element_number = 0; element_number < nb_elem; element_number++)
981 model_coeff(element_number) = model_coeff_tmp(corresp_c_(element_number));
982 model_coeff.echange_espace_virtuel();
983}
984
986{
987 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::stabilise_moyenne_euler_lagrange INPUT haut", haut);
988 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::stabilise_moyenne_euler_lagrange INPUT bas", bas);
989 static int init = 1;
990 // Attention: on stocke ces deux tableaux d'un appel a l'autre:
991 static DoubleTrav haut_moy;
992 static DoubleTrav bas_moy;
993 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_VF_.valeur());
994 DoubleVect& model_coeff = coeff_field_->valeurs();
995
996
997
998 if (init == 1)
999 {
1000 init = 0;
1001 haut_moy = haut;
1002 bas_moy = bas;
1003 model_coeff = 0.16 * 0.16;
1004 }
1005 else
1006 {
1007 const bool lagrange = (methode_stabilise_ == "moy_lagrange");
1008
1009 int nb_0 = 0;
1010 DoubleVect l;
1011 domaine_VDF.domaine().creer_tableau_elements(l);
1012 calculer_length_scale(l, domaine_VDF);
1013
1014 const int nmax = haut.size_totale();
1015 const double dt = mon_equation_->schema_temps().pas_de_temps();
1016
1017 DoubleVect dist(8);
1018 IntVect num(8);
1019
1020 for (int elem = 0; elem < nmax; elem++)
1021 {
1022 const double hmoy = haut_moy(elem);
1023 const double bmoy = bas_moy(elem);
1024 double hmoy_int, bmoy_int;
1025 if (lagrange)
1026 {
1027 calcul_voisins(elem, num, dist);
1028 interpole(num, dist, haut_moy, hmoy_int);
1029 interpole(num, dist, bas_moy, bmoy_int);
1030 }
1031 else
1032 {
1033 hmoy_int = hmoy;
1034 bmoy_int = bmoy;
1035 }
1036 const double h = haut(elem);
1037 const double b = bas(elem);
1038 const double l_elem = l(elem);
1039 const double a = hmoy * bmoy;
1040 double eps = 1.0; // default value
1041 if (a > 0.)
1042 {
1043 const double T = 1.5 * l_elem * pow(a, -0.125);
1044 const double dt_T = dt / T;
1045 eps = dt_T / (1. + dt_T);
1046 }
1047
1048 double hmoy_new = eps * h + (1 - eps) * hmoy_int;
1049 if (hmoy_new < 0.)
1050 {
1051 hmoy_new = 0.0;
1052 nb_0++;
1053 }
1054 double bmoy_new = eps * b + (1 - eps) * bmoy_int;
1055 double model_c = 0.16 * 0.16; // default value
1056 if (bmoy_new != 0.)
1057 model_c = hmoy_new / bmoy_new;
1058
1059 model_coeff(elem) = model_c;
1060 haut_moy(elem) = hmoy_new;
1061 bas_moy(elem) = bmoy_new;
1062
1063 }
1064 if (nb_0 != 0)
1065 {
1066 Journal() << "Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::stabilise_moyenne_euler_lagrange" << finl;
1067 Journal() << nb_0 << " elements have a negative coefficient." << finl;
1068 }
1069 }
1070
1071 model_coeff.echange_espace_virtuel();
1072 Debog::verifier("Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::stabilise_moyenne_euler_lagrange OUTPUT model_coeff", model_coeff);
1073}
1074
1075void Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calcul_voisins(const int element_number, IntVect& num, DoubleVect& dist)
1076{
1077 double dt = mon_equation_->schema_temps().pas_de_temps();
1078 int i, j;
1079 IntTab indice(3);
1080
1081 if (elem_elem_(element_number, 1, 1, 1) == -1)
1082 {
1083 for (j = 0; j < 8; j++)
1084 {
1085 num[j] = element_number;
1086 dist[j] = 1.0;
1087 }
1088 }
1089 else
1090 {
1091 for (i = 0; i < 3; i++)
1092 {
1093 if (cell_cent_vel_(element_number, i) > 0)
1094 indice(i) = 2;
1095 else
1096 indice(i) = 0;
1097 }
1098 num[0] = elem_elem_(element_number, 1, 1, 1);
1099 num[1] = elem_elem_(element_number, 1, 1, indice(2));
1100 num[2] = elem_elem_(element_number, 1, indice(1), 1);
1101 num[3] = elem_elem_(element_number, 1, indice(1), indice(2));
1102 num[4] = elem_elem_(element_number, indice(0), 1, 1);
1103 num[5] = elem_elem_(element_number, indice(0), 1, indice(2));
1104 num[6] = elem_elem_(element_number, indice(0), indice(1), 1);
1105 num[7] = elem_elem_(element_number, indice(0), indice(1), indice(2));
1106
1107 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_VF_.valeur());
1108 const DoubleTab& xp = domaine_VDF.xp();
1109 DoubleTrav x(3);
1110 for (i = 0; i < 3; i++)
1111 x(i) = xp(element_number, i) - cell_cent_vel_(element_number, i) * dt;
1112 dist = 0.0;
1113 for (j = 0; j < 8; j++)
1114 {
1115 for (i = 0; i < 3; i++)
1116 {
1117 if (num[j] == -1)
1118 {
1119 Cerr << "Problem with the algorithm Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calcul_voisins" << finl;
1120 Process::exit();
1121 }
1122 dist(j) += (xp(num[j], i) - x(i)) * (xp(num[j], i) - x(i));
1123 }
1124 dist(j) = sqrt(dist(j));
1125 }
1126
1127 // verification que l'on ne se trouve pas sur un element
1128 double d;
1129 d = (xp(num[0], 0) - xp(num[4], 0)) * (xp(num[0], 0) - xp(num[4], 0));
1130 d += (xp(num[0], 1) - xp(num[2], 1)) * (xp(num[0], 1) - xp(num[2], 1));
1131 d += (xp(num[0], 2) - xp(num[1], 2)) * (xp(num[0], 2) - xp(num[1], 2));
1132 int flag = 0;
1133 for (j = 0; j < 8; j++)
1134 if (dist(j) * dist(j) < d / 10000)
1135 flag = 1;
1136 if (flag == 1)
1137 for (j = 0; j < 8; j++)
1138 {
1139 num[j] = element_number;
1140 dist[j] = 1.0;
1141 }
1142 }
1143}
1144
1145void Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::interpole(const IntVect& num, const DoubleVect& dist, const DoubleVect& val, double& val_int)
1146{
1147 double K = 0.0;
1148 val_int = 0.0;
1149 for (int i = 0; i < 8; i++)
1150 {
1151 K += 1 / dist(i);
1152 val_int += val(num(i)) / dist(i);
1153 }
1154 val_int /= K;
1155}
1156
1158{
1159 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_VF_.valeur());
1160 const IntTab& face_voisins = domaine_VDF.face_voisins();
1161 const IntTab& elem_faces = domaine_VDF.elem_faces();
1162 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot();
1163 int element_number, f, elem;
1164
1165 //elem_elem(element_number,i,j,k) i-x, j-y k-z et 0-avant 1-meme_position, 2-apres
1166
1167 elem_elem_.resize(nb_elem_tot, 3, 3, 3);
1168
1169 for (element_number = 0; element_number < nb_elem_tot; element_number++)
1170 {
1171 elem_elem_(element_number, 1, 1, 1) = element_number; // xyz
1172 f = elem_faces(element_number, 0);
1173 elem_elem_(element_number, 0, 1, 1) = face_voisins(f, 0); // x-
1174 elem = elem_elem_(element_number, 0, 1, 1);
1175 if (elem != -1)
1176 {
1177 f = elem_faces(elem, 1);
1178 elem_elem_(element_number, 0, 0, 1) = face_voisins(f, 0); // x- y-
1179 f = elem_faces(elem, 2);
1180 elem_elem_(element_number, 0, 1, 0) = face_voisins(f, 0); // x- z-
1181 f = elem_faces(elem, 4);
1182 elem_elem_(element_number, 0, 2, 1) = face_voisins(f, 1); // x- y+
1183 f = elem_faces(elem, 5);
1184 elem_elem_(element_number, 0, 1, 2) = face_voisins(f, 1); // x- z+
1185 }
1186 f = elem_faces(element_number, 3);
1187 elem_elem_(element_number, 2, 1, 1) = face_voisins(f, 1); // x+
1188 elem = elem_elem_(element_number, 2, 1, 1);
1189 if (elem != -1)
1190 {
1191 f = elem_faces(elem, 1);
1192 elem_elem_(element_number, 2, 0, 1) = face_voisins(f, 0); // x+ y-
1193 f = elem_faces(elem, 2);
1194 elem_elem_(element_number, 2, 1, 0) = face_voisins(f, 0); // x+ z-
1195 f = elem_faces(elem, 4);
1196 elem_elem_(element_number, 2, 2, 1) = face_voisins(f, 1); // x+ y+
1197 f = elem_faces(elem, 5);
1198 elem_elem_(element_number, 2, 1, 2) = face_voisins(f, 1); // x+ z+
1199 }
1200 f = elem_faces(element_number, 1);
1201 elem_elem_(element_number, 1, 0, 1) = face_voisins(f, 1); // y-
1202 elem = elem_elem_(element_number, 1, 0, 1);
1203 if (elem != -1)
1204 {
1205 f = elem_faces(elem, 2);
1206 elem_elem_(element_number, 1, 0, 0) = face_voisins(f, 0); // y- z-
1207 f = elem_faces(elem, 5);
1208 elem_elem_(element_number, 1, 0, 2) = face_voisins(f, 1); // y- z+
1209 }
1210 f = elem_faces(element_number, 4);
1211 elem_elem_(element_number, 1, 2, 1) = face_voisins(f, 1); // y+
1212 elem = elem_elem_(element_number, 1, 2, 1);
1213 if (elem != -1)
1214 {
1215 f = elem_faces(elem, 2);
1216 elem_elem_(element_number, 1, 2, 0) = face_voisins(f, 0); // y+ z-
1217 f = elem_faces(elem, 5);
1218
1219 elem_elem_(element_number, 1, 2, 2) = face_voisins(f, 1); // y+ z+
1220 }
1221 f = elem_faces(element_number, 2);
1222 elem_elem_(element_number, 1, 1, 0) = face_voisins(f, 0); // z-
1223 f = elem_faces(element_number, 5);
1224 elem_elem_(element_number, 1, 1, 2) = face_voisins(f, 1); // z+
1225 elem = elem_elem_(element_number, 1, 2, 2);
1226 if (elem != -1)
1227 {
1228 f = elem_faces(elem, 0);
1229 elem_elem_(element_number, 0, 2, 2) = face_voisins(f, 0); // x- y+ z+
1230 f = elem_faces(elem, 3);
1231 elem_elem_(element_number, 2, 2, 2) = face_voisins(f, 1); // x+ y+ z+
1232 }
1233 elem = elem_elem_(element_number, 1, 2, 0);
1234 if (elem != -1)
1235 {
1236 f = elem_faces(elem, 0);
1237 elem_elem_(element_number, 0, 2, 0) = face_voisins(f, 0); // x- y+ z-
1238 f = elem_faces(elem, 3);
1239 elem_elem_(element_number, 2, 2, 0) = face_voisins(f, 1); // x+ y+ z-
1240 }
1241 elem = elem_elem_(element_number, 1, 0, 2);
1242 if (elem != -1)
1243 {
1244 f = elem_faces(elem, 0);
1245 elem_elem_(element_number, 0, 0, 2) = face_voisins(f, 0); // x- y- z+
1246 f = elem_faces(elem, 3);
1247 elem_elem_(element_number, 2, 0, 2) = face_voisins(f, 1); // x+ y- z+
1248 }
1249 elem = elem_elem_(element_number, 1, 0, 0);
1250 if (elem != -1)
1251 {
1252 f = elem_faces(elem, 0);
1253 elem_elem_(element_number, 0, 0, 0) = face_voisins(f, 0); // x- y- z-
1254 f = elem_faces(elem, 3);
1255 elem_elem_(element_number, 2, 0, 0) = face_voisins(f, 1); // x+ y- z-
1256 }
1257
1258 elem_elem_(element_number, 1, 1, 1) = 0;
1259
1260 //Version initiale, boucles ?????
1261 /*
1262 for (int i=0; i<3; i++)
1263 for (int j=0; i<3; i++)
1264 for (int k=0; i<3; i++)
1265 if (elem_elem(element_number,i,j,k)==-1)
1266 elem_elem(element_number,1,1,1)=-1;
1267 */
1268 //A remplacer par ????
1269 for (int i = 0; i < 3; i++)
1270 for (int j = 0; j < 3; j++)
1271 for (int k = 0; k < 3; k++)
1272 if (elem_elem_(element_number, i, j, k) == -1)
1273 elem_elem_(element_number, 1, 1, 1) = -1;
1274
1275 }
1276
1277}
1278
1279void Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calcul_tableaux_correspondance(int& N_c, IntVect& compt_c, IntVect& corresp_c)
1280{
1281 // Initialisation de : Yuv + compt_c + corresp_c
1282 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, le_dom_VF_.valeur());
1283 const DoubleTab& xp = domaine_VDF.xp();
1284 int nb_elems = domaine_VDF.domaine().nb_elem();
1285 DoubleTrav Y_c;
1286 int num_elem, j, indic_c, trouve;
1287 double y;
1288 j = 0;
1289 indic_c = 0;
1290
1291 // dimensionnement aux valeurs rentrees dans le jeu de donnees
1292 Y_c.resize(N_c);
1293 compt_c.resize(N_c);
1294 domaine_VDF.domaine().creer_tableau_elements(corresp_c);
1295
1296 // initialisation
1297 Y_c = -100.;
1298 compt_c = 0;
1299 corresp_c = -1;
1300
1301 // Tolerance relative pour la comparaison des coordonnees y.
1302 // Evite les faux plans fantomes dus aux arrondis flottants en parallele
1303 // sur maillages non uniformes (deadlock MPI dans stabilise_moyenne_plans_paralleles).
1304 const double tol_rel = 1.e-8;
1305
1306 for (num_elem = 0; num_elem < nb_elems; num_elem++)
1307 {
1308 y = xp(num_elem, 1);
1309 trouve = 0;
1310
1311 for (j = 0; j < indic_c + 1; j++)
1312 {
1313 if (j == N_c)
1314 {
1315 Cerr << "nb_points=" << N_c << " is too low for the parallel planes number." << finl;
1316 Cerr << "Please increase this value." << finl;
1317 Process::exit();
1318 }
1319 // FIX: comparaison avec tolerance relative au lieu de l'egalite exacte
1320 // sur doubles, qui causait des plans fantomes en parallele sur maillages
1321 // non uniformes, entrainant un deadlock MPI dans mp_sum.
1322 const double ref = std::fabs(y) + std::fabs(Y_c[j]) + 1.e-30;
1323 if (std::fabs(y - Y_c[j]) < tol_rel * ref)
1324 {
1325 corresp_c[num_elem] = j;
1326 compt_c[j]++;
1327 j = indic_c + 1;
1328 trouve = 1;
1329 break;
1330 }
1331 }
1332 if (trouve == 0)
1333 {
1334 corresp_c[num_elem] = indic_c;
1335 Y_c[indic_c] = y;
1336 compt_c[indic_c]++;
1337 indic_c++;
1338 }
1339 }
1340 N_c = indic_c; // nombre de y pour les elements locaux
1341
1342 // FIX: synchronisation de N_c entre tous les processus MPI.
1343 // Sans cela, N_c peut differer d'un processus a l'autre (plans fantomes),
1344 // ce qui provoque un deadlock dans la boucle mp_sum de
1345 // stabilise_moyenne_plans_paralleles ou le collectif n'est pas appele
1346 // le meme nombre de fois par tous les processus.
1347 N_c = Process::mp_max(N_c);
1348
1349 compt_c.resize(N_c);
1350}
class Champ_Face_VDF Cette classe sert a representer un champ vectoriel dont on ne calcule
DoubleTab & calcul_duidxj(const DoubleTab &, DoubleTab &) const
Methode qui renvoie gij aux elements a partir de la vitesse aux elements (gij represente la derivee p...
classe Champ_Fonc_P0_VDF
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
Classe Champ_Inc_base.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
static void verifier(const char *const msg, double)
Definition Debog.cpp:21
int_t nb_elem_tot() const
Definition Domaine.h:132
virtual void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
creation d'un tableau parallele de valeurs aux elements.
Definition Domaine.cpp:851
int_t nb_elem() const
Definition Domaine.h:131
class Domaine_Cl_VDF
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
virtual const Champ_Inc_base & inconnue() const
class Domaine_VDF
Definition Domaine_VDF.h:64
double dim_elem(int, int) const
int orientation(int) const override
inline DoubleVect& Domaine_VDF::porosite_face() {
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
Definition Domaine_VF.h:543
double xp(int num_elem, int k) const
Definition Domaine_VF.h:77
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Definition Domaine_VF.h:418
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
int nb_elem_tot() const
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
virtual Champ_Fonc_base & energie_cinetique_turbulente()
void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &) override
void associer(const Domaine_dis_base &domaine_dis, const Domaine_Cl_dis_base &domaine_Cl_dis) override
static void calculer_length_scale(DoubleVect &, const Domaine_VDF &)
int lire_motcle_non_standard(const Motcle &, Entree &) override
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
void calculer_Mij(const DoubleTab &, const DoubleTab &, const DoubleVect &, DoubleTab &)
static void calculer_cell_cent_vel(DoubleTab &, const Domaine_VDF &, Champ_Inc_base &)
void stabilise_moyenne_plans_paralleles(const DoubleTab &, const DoubleTab &)
void stabilise_moyenne_6_points(const DoubleTab &, const DoubleTab &)
static void calculer_Sij(DoubleTab &, const Domaine_VDF &, const Domaine_Cl_VDF &, Champ_Inc_base &)
static void calculer_Sij_vel_filt(const DoubleTab &, DoubleTab &, const Domaine_VDF &)
static void calculer_S_norme(const DoubleTab &, DoubleVect &, int)
void stabilise_moyenne(const DoubleTab &, const DoubleTab &)
void stabilise_moyenne_euler_lagrange(const DoubleTab &, const DoubleTab &)
void calculer_model_coefficient(const DoubleTab &, const DoubleTab &)
static void interpole(const IntVect &, const DoubleVect &, const DoubleVect &, double &)
static void calculer_filter_field(const DoubleTab &, DoubleTab &, const Domaine_VDF &)
void calculer_Lij(const DoubleTab &, const DoubleTab &, DoubleTab &)
classe Modele_turbulence_hyd_LES_Smago_VDF Cette classe correspond a la mise en oeuvre du modele sous
int preparer_calcul() override
Prepare le calcul.
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
Un tableau d'objets de la classe Motcle.
Definition Motcle.h:63
int search(const Motcle &t) const
Definition Motcle.cpp:321
virtual int lire_motcle_non_standard(const Motcle &motlu, Entree &is)
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
Definition Objet_U.cpp:115
static int dimension
Definition Objet_U.h:99
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Objet_U.cpp:319
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
@ REQUIRED
Definition Param.h:115
void ajouter_non_std(const char *keyword, const Objet_U *value, Param::Nature nat=Param::OPTIONAL)
Register a keyword handled by Objet_U::lire_motcle_non_standard.
Definition Param.cpp:489
static int check_int_overflow(trustIdType)
Definition Process.cpp:428
static double mp_max(double)
Definition Process.cpp:376
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
Definition Process.cpp:588
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
Definition Process.cpp:146
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Classe de base des flux de sortie.
Definition Sortie.h:52
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ size() const
Definition TRUSTVect.tpp:45
_SIZE_ size_totale() const
Definition TRUSTVect.tpp:61
int line_size() const
Definition TRUSTVect.tpp:67
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTVect.tpp:91
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")