TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Modele_turbulence_scal_LES_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
17#include <Modele_turbulence_scal_LES_dyn_VDF.h>
18#include <Convection_Diffusion_std.h>
19#include <Op_Dift_VDF_base.h>
20#include <Operateur.h>
21#include <Probleme_base.h>
22#include <Milieu_base.h>
23
24#include <Champ_Uniforme.h>
25#include <Modele_turbulence_hyd_LES_SMAGO_DYN_VDF.h>
26#include <Pb_Thermohydraulique_Turbulent_QC.h>
27#include <Fluide_Dilatable_base.h>
28#include <Param.h>
29#include <Debog.h>
30#include <Modifier_pour_fluide_dilatable.h>
31
32Implemente_instanciable(Modele_turbulence_scal_LES_dyn_VDF, "Modele_turbulence_scal_sous_maille_dyn_VDF", Modele_turbulence_scal_base);
33
35{
36 return s << que_suis_je() << " " << le_nom();
37}
38
40{
41 dynamique_y2 = 0;
43}
44
46{
47 param.ajouter("DYNAMIQUE_Y2", &dynamique_y2);
48 param.ajouter_non_std("STABILISE", this);
50}
51
53{
54 le_dom_VDF = ref_cast(Domaine_VDF, domaine_dis);
55 le_dom_Cl_VDF = ref_cast(Domaine_Cl_VDF, domaine_Cl_dis);
56}
57
59{
60 Motcle motlutmp;
61
62 //dynamique_y2=0;
63
64 Motcles les_motcles(1);
65 {
66 les_motcles[0] = "STABILISE";
67 }
68 Motcles les_motcles_stabilise(4);
69 {
70 les_motcles_stabilise[0] = "6_points";
71 les_motcles_stabilise[1] = "plans_paralleles";
72 les_motcles_stabilise[2] = "moy_euler";
73 les_motcles_stabilise[3] = "moy_lagrange";
74 }
75
76 int rang2;
77 int rang = les_motcles.search(motlu);
78 switch(rang)
79 {
80
81 case 0:
82 {
83 is >> motlutmp;
84 rang2 = les_motcles_stabilise.search(motlutmp);
85 switch(rang2)
86 {
87 case 0:
88 {
89 methode_stabilise = "6_POINTS";
90 break;
91 }
92 case 1:
93 {
94 methode_stabilise = "PLANS_PARALLELES";
95 is >> motlutmp;
96 if (motlutmp == "Nb_points")
97 {
98 is >> N_c_;
100 }
101 else
102 {
103 Cerr << "le mot clef stablise plans_paralleles doit necessairement etre suivi de Nb_points !!!\n" << finl;
104 assert(0);
106 }
107 break;
108 }
109 case 2:
110 {
111 methode_stabilise = "MOY_EULER";
112 break;
113 }
114 case 3:
115 {
116 methode_stabilise = "MOY_LAGRANGE";
118 break;
119 }
120 default:
121 {
122 Cerr << "Erreur a la lecture des donnees dans : " << que_suis_je() << finl;
123 Cerr << motlutmp << " n'est pas compris; Les mots compris sont : " << finl;
124 Cerr << les_motcles_stabilise;
125 assert(0);
127 }
128 }
129 break;
130 }
131 default:
132 {
134
135 }
136 }
137
138 return 1;
139}
140
141////////////////////////////////////////////////////////////////////////
143{
145
146 const Milieu_base& le_milieu = equation().probleme().milieu();
147 const DoubleTab& tab_Cp = le_milieu.capacite_calorifique().valeurs();
148 const bool Ccp = sub_type(Champ_Uniforme, le_milieu.capacite_calorifique());
149 const DoubleTab& tab_rho = le_milieu.masse_volumique().valeurs();
150 const Probleme_base& mon_pb = mon_equation_->probleme();
151 DoubleTab& lambda_t = conductivite_turbulente_->valeurs();
152 lambda_t = diffusivite_turbulente_->valeurs();
153 if (sub_type(Pb_Thermohydraulique_Turbulent_QC, mon_pb))
154 {
155 for (int i = 0; i < lambda_t.size(); i++)
156 lambda_t(i) *= tab_Cp(Ccp ? 0 : i);
157 if (equation().probleme().is_dilatable())
158 multiplier_par_rho_si_dilatable(lambda_t, le_milieu);
159 }
160 else
161 lambda_t *= tab_rho(0, 0) * tab_Cp(0, 0);
162 lambda_t.echange_espace_virtuel();
163}
164
165//////////////////////////////////////////////////////////////////////
167{
168 Equation_base& eq_NS_turb = equation().probleme().equation(0);
169
170 DoubleTab& alpha_t = diffusivite_turbulente_->valeurs();
171
172 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_diffusivite_turbulente la_diffusivite_turbulente before", alpha_t);
173
174 const DoubleTab& teta = equation().inconnue().valeurs();
175
176 // scalar fields
177 if (model_coeff.size()==0)
178 le_dom_VDF->domaine().creer_tableau_elements(model_coeff);
179
180 DoubleTab l(model_coeff);
181 DoubleTab filt_teta(model_coeff);
182 DoubleTab S_grid_scale_norme(model_coeff);
183 DoubleTab S_test_scale_norme(model_coeff);
184
185
186
187 // allocate vector fields
188 if (cell_cent_vel.size()==0)
189 {
190 cell_cent_vel.resize(0, dimension);
191 le_dom_VDF->domaine().creer_tableau_elements(cell_cent_vel);
192 }
193
194
195 DoubleTab filt_vel(cell_cent_vel);
196 DoubleTab Lj(cell_cent_vel);
197 DoubleTab Mj(cell_cent_vel);
198 DoubleTab grad_teta(cell_cent_vel);
199 DoubleTab filt_grad_teta(cell_cent_vel);
200
201 // allocate tensor fields
202 DoubleTab Sij_grid_scale(0, dimension, dimension);
203 le_dom_VDF->domaine().creer_tableau_elements(Sij_grid_scale);
204
205 DoubleTab Sij_test_scale(Sij_grid_scale);
206
207
208
210
211
213
214
216
217
218 calculer_filter_coeff(teta, filt_teta);
219
220
221 calculer_Lj(teta, filt_teta, cell_cent_vel, filt_vel, Lj);
222
223
224 Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Sij(Sij_grid_scale, le_dom_VDF.valeur(), le_dom_Cl_VDF.valeur(), eq_NS_turb.inconnue());
225
226
227 Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_Sij_vel_filt(filt_vel, Sij_test_scale, le_dom_VDF.valeur());
228
229 Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_S_norme(Sij_grid_scale, S_grid_scale_norme, le_dom_VDF->domaine().nb_elem_tot());
230
231 Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_S_norme(Sij_test_scale, S_test_scale_norme, le_dom_VDF->domaine().nb_elem_tot());
232
233 calculer_grad_teta(teta, grad_teta);
234
235 Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_filter_field(grad_teta, filt_grad_teta, le_dom_VDF.valeur());
236
237 calculer_Mj(S_grid_scale_norme, S_test_scale_norme, grad_teta, filt_grad_teta, l, Mj);
238
240
241 for (int element_number = 0; element_number < le_dom_VDF->domaine().nb_elem(); element_number++)
242 alpha_t(element_number) = model_coeff(element_number) * l(element_number) * l(element_number) * S_grid_scale_norme(element_number);
243
244 alpha_t.echange_espace_virtuel();
245
246
247 // this is only to get current time
248 const RefObjU& modele_turbulence_hydr = eq_NS_turb.get_modele(TURBULENCE);
249 const Modele_turbulence_hyd_base& mod_turb_hydr = ref_cast(Modele_turbulence_hyd_base, modele_turbulence_hydr.valeur());
250 const Champ_Fonc_base& champ = mod_turb_hydr.viscosite_turbulente();
251 double temps = champ.temps();
252 diffusivite_turbulente_->changer_temps(temps);
253
254 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_diffusivite_turbulente la_diffusivite_turbulente after", diffusivite_turbulente_->valeurs());
256}
257
258//////////////////////////////////////////////////////////////////////
259void Modele_turbulence_scal_LES_dyn_VDF::calculer_filter_coeff(const DoubleTab& coeff, DoubleTab& filt_coeff)
260{
261 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_filter_coeff INPUT coeff",coeff);
262 const Domaine_VDF& domaine_VDF = le_dom_VDF.valeur();
263 const IntTab& face_voisins = domaine_VDF.face_voisins();
264 int nb_elem = domaine_VDF.domaine().nb_elem();
265 const IntTab& elem_faces = domaine_VDF.elem_faces();
266 int element_number;
267 int num0, num1, num2, num3, num4, num5;
268 int f0, f1, f2, f3, f4, f5;
269
270 DoubleTab temp1(filt_coeff);
271 DoubleTab temp2(filt_coeff);
272
273 if (dimension == 2)
274 {
275 for (element_number = 0; element_number < nb_elem; element_number++)
276 {
277 f0 = elem_faces(element_number, 0);
278 num0 = face_voisins(f0, 0);
279 f2 = elem_faces(element_number, 2);
280 num2 = face_voisins(f2, 1);
281 if ((num0 == -1) || (num2 == -1))
282 temp1(element_number) = coeff(element_number);
283 else
284 {
285 temp1(element_number) = 0.25 * (coeff(num0) + 2.0 * coeff(element_number) + coeff(num2));
286 }
287 }
289 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_filter_coeff temp1 2D",temp1);
290 for (element_number = 0; element_number < nb_elem; element_number++)
291 {
292 f1 = elem_faces(element_number, 1);
293 num1 = face_voisins(f1, 0);
294 f3 = elem_faces(element_number, 3);
295 num3 = face_voisins(f3, 1);
296 if ((num1 == -1) || (num3 == -1))
297 filt_coeff(element_number) = temp1(element_number);
298 else
299 {
300 filt_coeff(element_number) = 0.25 * (temp1(num1) + 2.0 * temp1(element_number) + temp1(num3));
301 }
302 }
303 filt_coeff.echange_espace_virtuel();
304 }
305 else
306 {
307 for (element_number = 0; element_number < nb_elem; element_number++)
308 {
309 f0 = elem_faces(element_number, 0);
310 num0 = face_voisins(f0, 0);
311 f3 = elem_faces(element_number, 3);
312 num3 = face_voisins(f3, 1);
313 if ((num0 == -1) || (num3 == -1))
314 temp1(element_number) = coeff(element_number);
315 else
316 {
317 temp1(element_number) = 0.25 * (coeff(num0) + 2.0 * coeff(element_number) + coeff(num3));
318 }
319 }
321 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_filter_coeff temp1 3D",temp1);
322 for (element_number = 0; element_number < nb_elem; element_number++)
323 {
324 f1 = elem_faces(element_number, 1);
325 num1 = face_voisins(f1, 0);
326 f4 = elem_faces(element_number, 4);
327 num4 = face_voisins(f4, 1);
328 if ((num1 == -1) || (num4 == -1))
329 temp2(element_number) = temp1(element_number);
330 else
331 {
332 temp2(element_number) = 0.25 * (temp1(num1) + 2.0 * temp1(element_number) + temp1(num4));
333 }
334 }
336 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_filter_coeff temp2 3D",temp2);
337 for (element_number = 0; element_number < nb_elem; element_number++)
338 {
339 f2 = elem_faces(element_number, 2);
340 num2 = face_voisins(f2, 0);
341 f5 = elem_faces(element_number, 5);
342 num5 = face_voisins(f5, 1);
343 if ((num2 == -1) || (num5 == -1))
344 filt_coeff(element_number) = temp2(element_number);
345 else
346 {
347 filt_coeff(element_number) = 0.25 * (temp2(num2) + 2.0 * temp2(element_number) + temp2(num5));
348 }
349 }
350 filt_coeff.echange_espace_virtuel();
351 }
352 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_filter_coeff OUTPUT filt_coeff",filt_coeff);
353}
354
355//////////////////////////////////////////////////////////////////////
356void Modele_turbulence_scal_LES_dyn_VDF::calculer_Lj(const DoubleTab& teta, const DoubleTab& filt_teta, const DoubleTab& vel, const DoubleTab& filt_vel, DoubleTab& Lj)
357{
358 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_Lj INPUT teta",teta);
359 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_Lj INPUT filt_teta",filt_teta);
360 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_Lj INPUT vel",vel);
361 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_Lj INPUT filt_vel",filt_vel);
362 const Domaine_VDF& domaine_VDF = le_dom_VDF.valeur();
363 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot();
364 int element_number;
365
366 DoubleTab temp(nb_elem_tot, dimension);
367 DoubleTab filt_u_teta(Lj);
368
369 for (element_number = 0; element_number < nb_elem_tot; element_number++)
370 {
371 for (int j = 0; j < dimension; j++)
372 temp(element_number, j) = vel(element_number, j) * teta(element_number);
373 }
374
375 Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_filter_field(temp, filt_u_teta, le_dom_VDF.valeur());
376
377 for (element_number = 0; element_number < nb_elem_tot; element_number++)
378 {
379 for (int j = 0; j < dimension; j++)
380 Lj(element_number, j) = filt_u_teta(element_number, j) - filt_vel(element_number, j) * filt_teta(element_number);
381 }
382 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_Lj OUTPUT Lj",Lj);
383}
384
385//////////////////////////////////////////////////////////////////////
386void Modele_turbulence_scal_LES_dyn_VDF::calculer_grad_teta(const DoubleVect& teta, DoubleTab& grad_teta)
387{
388 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_grad_teta INPUT teta",teta);
389 const int nb_elem = le_dom_VDF->domaine().nb_elem();
390 const int nb_faces_tot = le_dom_VDF->nb_faces();
391 const int nb_faces_bord = le_dom_VDF->domaine().nb_faces_bord();
392
393 const Op_Dift_VDF_base& operateur_diff = ref_cast(Op_Dift_VDF_base, (mon_equation_->operateur(0)).l_op_base());
394 const DoubleVect& flux_bords = operateur_diff.flux_bords();
395 // Si flux_bords n'est pas encore rempli (1er pas de temps)
396 // alors on le calcule en appelant la methode ajouter de l'operateur
397 // de diffusion
398 if (flux_bords.size_array() == 0)
399 {
400 DoubleTab resu(le_dom_VDF->nb_faces_tot(), 1);
401 operateur_diff.ajouter(static_cast<const DoubleTab&>(teta), resu);
402 }
403 const DoubleVect& faces_surfaces = le_dom_VDF->face_surfaces();
404 DoubleTab grad_teta_face(nb_faces_tot);
405 int element_number;
406
407 int face, n0, n1, ori;
408 const IntTab& face_voisins = le_dom_VDF->face_voisins();
409 const IntVect& orientation = le_dom_VDF->orientation();
410 const DoubleTab& xp = le_dom_VDF->xp();
411
412 const Milieu_base& le_milieu = equation().probleme().milieu();
413 const Champ_Don_base& lambda = le_milieu.conductivite();
414
415 //Calcul du gradient aux faces
416
417 // Boucle sur les faces de bord
418 for (face = 0; face < nb_faces_bord; face++)
419 grad_teta_face(face) = flux_bords(face) / faces_surfaces(face);
420
421 if ((sub_type(Champ_Uniforme, lambda)))
422 {
423 double coef = lambda.valeurs()(0, 0);
424 for (face = 0; face < nb_faces_bord; face++)
425 grad_teta_face(face) /= coef;
426 }
427 else
428 {
429 int num_elem;
430 for (face = 0; face < nb_faces_bord; face++)
431 {
432 num_elem = face_voisins(face, 0);
433 if (num_elem != -1)
434 grad_teta_face(face) /= (lambda.valeurs()(num_elem));
435 else
436 {
437 num_elem = face_voisins(face, 1);
438 grad_teta_face(face) /= (lambda.valeurs()(num_elem));
439 }
440 }
441 }
442
443 // Boucle sur les faces internes
444 for (face = le_dom_VDF->premiere_face_int(); face < nb_faces_tot; face++)
445 {
446 n0 = face_voisins(face, 0);
447 n1 = face_voisins(face, 1);
448 ori = orientation(face);
449 grad_teta_face(face) = (teta(n1) - teta(n0)) / (xp(n1, ori) - xp(n0, ori));
450 }
451 //Calcul du gradient aux elements
452 const IntTab& elem_faces = le_dom_VDF->elem_faces();
453 int num0, num1, num2, num3, num4, num5;
454 for (element_number = 0; element_number < nb_elem; element_number++)
455 {
456 num0 = elem_faces(element_number, 0);
457 num1 = elem_faces(element_number, 1);
458 num2 = elem_faces(element_number, 2);
459 num3 = elem_faces(element_number, 3);
460
461 if (dimension == 2)
462 {
463 grad_teta(element_number, 0) = (grad_teta_face[num0] + grad_teta_face[num2]) / 2;
464 grad_teta(element_number, 1) = (grad_teta_face[num1] + grad_teta_face[num3]) / 2;
465 }
466 else
467 {
468 num4 = elem_faces(element_number, 4);
469 num5 = elem_faces(element_number, 5);
470 grad_teta(element_number, 0) = (grad_teta_face[num0] + grad_teta_face[num3]) / 2;
471 grad_teta(element_number, 1) = (grad_teta_face[num1] + grad_teta_face[num4]) / 2;
472 grad_teta(element_number, 2) = (grad_teta_face[num2] + grad_teta_face[num5]) / 2;
473 }
474 }
475 grad_teta.echange_espace_virtuel();
476 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_grad_teta OUTPUT grad_teta",grad_teta);
477}
478
479//////////////////////////////////////////////////////////////////////
480void Modele_turbulence_scal_LES_dyn_VDF::calculer_Mj(const DoubleTab& S_grid_scale_norme, const DoubleTab& S_test_scale_norme, const DoubleTab& grad_teta, const DoubleTab& filt_grad_teta, const DoubleTab& l, DoubleTab& Mj)
481{
482
483 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_Mj INPUT S_grid_scale_norme", S_grid_scale_norme);
484 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_Mj INPUT S_test_scale_norme", S_test_scale_norme);
485 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_Mj INPUT grad_teta", grad_teta);
486 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_Mj INPUT filt_grad_teta", filt_grad_teta);
487 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_Mj INPUT l", l);
488 const Domaine_VDF& domaine_VDF = le_dom_VDF.valeur();
489 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot();
490
491 constexpr double alpha_squared = 6.0;
492
493 DoubleTab temp(nb_elem_tot, dimension);
494 DoubleTab S_norme_filt_grad_teta(grad_teta);
495
496 for (int element_number = 0; element_number < nb_elem_tot; element_number++)
497 for (int j = 0; j < dimension; j++)
498 {
499 temp(element_number, j) = S_grid_scale_norme(element_number) * grad_teta(element_number, j);
500 }
501
502 Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::calculer_filter_field(temp, S_norme_filt_grad_teta, le_dom_VDF.valeur());
503 for (int element_number = 0; element_number < nb_elem_tot; element_number++)
504 {
505 for (int j = 0; j < dimension; j++)
506 {
507 const double factor=S_norme_filt_grad_teta(element_number, j) - alpha_squared * S_test_scale_norme(element_number) * filt_grad_teta(element_number, j);
508 Mj(element_number, j) = l[element_number] * l[element_number] * factor;
509 }
510 }
511
512
513 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_Mj OUTPUT Mj", Mj);
514}
515
516//////////////////////////////////////////////////////////////////////
517// Evaluate the dynamic model coeficient C
518void Modele_turbulence_scal_LES_dyn_VDF::calculer_model_coefficient(const DoubleTab& Lj, const DoubleTab& Mj)
519{
520 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_model_coefficient INPUT Lj", Lj);
521 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_model_coefficient INPUT Mj", Mj);
522
523 // int nb_elem_tot = le_dom_VDF->domaine().nb_elem_tot();
524 int nb_elem = le_dom_VDF->domaine().nb_elem();
525 DoubleTab haut, bas;
526 le_dom_VDF->domaine().creer_tableau_elements(haut);
527 le_dom_VDF->domaine().creer_tableau_elements(bas);
528
529 if (dynamique_y2 == 0)
530 {
531 for (int elem = 0; elem < nb_elem; elem++)
532 {
533 haut(elem) = 0.;
534 bas(elem) = 0.;
535 for (int j = 0; j < dimension; j++)
536 {
537 haut(elem) += Lj(elem, j) * Mj(elem, j);
538 bas(elem) += Mj(elem, j) * Mj(elem, j);
539 }
540 }
541 }
542 else
543 {
544 for (int elem = 0; elem < nb_elem; elem++)
545 {
546 haut(elem) = Lj(elem, 1);
547 bas(elem) = Mj(elem, 1);
548 }
549 }
552 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_model_coefficient haut", haut);
553 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_model_coefficient bas", bas);
554
555 stabilise_moyenne(haut, bas);
556
557 int i = 0;
558 int j = 0;
559 for (int elem = 0; elem < nb_elem; elem++)
560 {
561 if (model_coeff(elem) < 0.0)
562 {
563 model_coeff(elem) = 0.0;
564 i++;
565 }
566 else if (model_coeff(elem) > 0.5)
567 {
568 model_coeff(elem) = 0.5;
569 j++;
570 }
571 }
572 if (i != 0)
573 {
574 Journal() <<"Modele_turbulence_scal_LES_dyn_VDF::calculer_model_coefficient: "
575 << i<<"/"<< nb_elem
576 << " elements ont un coefficient inferieur a 0.0 (modele dynamique)" << finl;
577 }
578 if (j != 0)
579 {
580 Journal() <<"Modele_turbulence_scal_LES_dyn_VDF::calculer_model_coefficient: "
581 << j <<"/"<< nb_elem
582 << " elements ont un coefficient superieur a 0.5 (modele dynamique)" << finl;
583 }
584
585 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::calculer_model_coefficient OUTPUT model_coeff", model_coeff);
586}
587
588//////////////////////////////////////////////////////////////////////
589
590void Modele_turbulence_scal_LES_dyn_VDF::stabilise_moyenne(const DoubleTab& haut, const DoubleTab& bas)
591{
592 if (methode_stabilise == "plans_paralleles")
594 else if (methode_stabilise == "6_points")
596 else if (methode_stabilise == "moy_euler")
597 stabilise_moyenne_euler(haut, bas);
598 else if (methode_stabilise == "moy_lagrange")
600 else
601 {
602 Cerr << "probleme dans la definition de la methode de stabilisation" << finl;
604 }
605}
606
607//////////////////////////////////////////////////////////////////////
608
609void Modele_turbulence_scal_LES_dyn_VDF::stabilise_moyenne_6_points(const DoubleTab& haut, const DoubleTab& bas)
610{
611 const Domaine_VDF& domaine_VDF = le_dom_VDF.valeur();
612 const IntTab& face_voisins = domaine_VDF.face_voisins();
613 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot();
614 const IntTab& elem_faces = domaine_VDF.elem_faces();
615 int element_number;
616 int num0, num1, num2, num3, num4, num5;
617 int f0, f1, f2, f3, f4, f5;
618
619 DoubleTab temp1(nb_elem_tot);
620 DoubleTab temp2(nb_elem_tot);
621 DoubleTab model_coeff_tmp(nb_elem_tot);
622
623 // Evaluate the dynamic model coeficient C
624 for (element_number = 0; element_number < nb_elem_tot; element_number++)
625 {
626 if (std::fabs(bas(element_number)) < 1.e-12)
627 model_coeff[element_number] = 0.;
628 else
629 model_coeff[element_number] = haut[element_number] / bas[element_number];
630 }
631
632 // Stabilisation du modele par moyennage sur 6 noeuds
633
634 if (dimension == 2)
635 {
636 for (element_number = 0; element_number < nb_elem_tot; element_number++)
637 {
638 f0 = elem_faces(element_number, 0);
639 num0 = face_voisins(f0, 0);
640 f2 = elem_faces(element_number, 2);
641 num2 = face_voisins(f2, 1);
642 if ((num0 == -1) || (num2 == -1))
643 {
644 temp1(element_number) = 3.0 * model_coeff(element_number);
645 }
646 else
647 {
648 temp1(element_number) = model_coeff(num0) + model_coeff(element_number) + model_coeff(num2);
649 }
650 }
651
652 for (element_number = 0; element_number < nb_elem_tot; element_number++)
653 {
654 f1 = elem_faces(element_number, 1);
655 num1 = face_voisins(f1, 0);
656 f3 = elem_faces(element_number, 3);
657 num3 = face_voisins(f3, 1);
658 if ((num1 == -1) || (num3 == -1))
659 {
660 model_coeff(element_number) = temp1(element_number) / 3.0;
661 }
662 else
663 {
664 model_coeff(element_number) = (temp1(num1) + temp1(element_number) + temp1(num3)) / 9.0;
665 }
666 }
667 }
668 else
669 {
670 for (element_number = 0; element_number < nb_elem_tot; element_number++)
671 {
672 f0 = elem_faces(element_number, 0);
673 num0 = face_voisins(f0, 0);
674 f3 = elem_faces(element_number, 3);
675 num3 = face_voisins(f3, 1);
676 if ((num0 == -1) || (num3 == -1))
677 {
678 temp1(element_number) = 3.0 * model_coeff(element_number);
679 }
680 else
681 {
682 temp1(element_number) = model_coeff(num0) + model_coeff(element_number) + model_coeff(num3);
683 }
684 }
685
686 for (element_number = 0; element_number < nb_elem_tot; element_number++)
687 {
688 f1 = elem_faces(element_number, 1);
689 num1 = face_voisins(f1, 0);
690 f4 = elem_faces(element_number, 4);
691 num4 = face_voisins(f4, 1);
692 if ((num1 == -1) || (num4 == -1))
693 temp2(element_number) = 3.0 * temp1(element_number);
694 else
695 {
696 temp2(element_number) = temp1(num1) + temp1(element_number) + temp1(num4);
697 }
698 }
699
700 for (element_number = 0; element_number < nb_elem_tot; element_number++)
701 {
702 f2 = elem_faces(element_number, 2);
703 num2 = face_voisins(f2, 0);
704 f5 = elem_faces(element_number, 5);
705 num5 = face_voisins(f5, 1);
706 if ((num2 == -1) || (num5 == -1))
707 model_coeff(element_number) = temp2(element_number) / 9.0;
708 else
709 {
710 model_coeff(element_number) = (temp2(num2) + temp2(element_number) + temp2(num5)) / 27.0;
711 }
712 }
713 }
714}
715
716//////////////////////////////////////////////////////////////////////
717void Modele_turbulence_scal_LES_dyn_VDF::stabilise_moyenne_plans_paralleles(const DoubleTab& haut, const DoubleTab& bas)
718{
719 const Domaine_VDF& domaine_VDF = le_dom_VDF.valeur();
720 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot();
721 int nb_elem = domaine_VDF.domaine().nb_elem();
722 DoubleVect coeff_m_tmp(N_c_);
723
724 // Evaluate the dynamic model coeficient C
725 for (int element_number = 0; element_number < nb_elem_tot; element_number++)
726 {
727 if (std::fabs(bas(element_number)) < 1.e-12)
728 model_coeff[element_number] = 0.;
729 else
730 model_coeff[element_number] = haut[element_number] / bas[element_number];
731 }
732
733 for (int j = 0; j < N_c_; j++)
734 coeff_m_tmp(j) = 0.0;
735
736 for (int element_number = 0; element_number < nb_elem; element_number++)
737 coeff_m_tmp(corresp_c_(element_number)) += model_coeff(element_number);
738
739 for (int j = 0; j < N_c_; j++)
740 {
741 coeff_m_tmp(j) = Process::mp_sum(coeff_m_tmp(j));
743 }
744
745 for (int element_number = 0; element_number < nb_elem; element_number++)
746 model_coeff(element_number) = coeff_m_tmp(corresp_c_(element_number));
747 model_coeff.echange_espace_virtuel();
748}
749
750//////////////////////////////////////////////////////////////////////
751
752void Modele_turbulence_scal_LES_dyn_VDF::stabilise_moyenne_euler(const DoubleTab& haut, const DoubleTab& bas)
753{
754 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::stabilise_moyenne_euler INPUT haut", haut);
755 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::stabilise_moyenne_euler INPUT bas", bas);
756
757 const Domaine_VDF& domaine_VDF = le_dom_VDF.valeur();
758 int nb_elem = domaine_VDF.domaine().nb_elem();
759 static DoubleTab haut_moy(haut);
760 static DoubleTab bas_moy(bas);
761
762 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::stabilise_moyenne_euler INPUT (STATIC) haut_moy", haut_moy);
763 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::stabilise_moyenne_euler INPUT (STATIC) bas_moy", bas_moy);
764
765
766
767
768 static int init = 1;
769 if (init == 1)
770 {
771 init = 0;
772 haut_moy = haut;
773 bas_moy = bas;
774 model_coeff = 0.16 * 0.16;
775 }
776 else
777 {
778
779 DoubleVect l;
780 domaine_VDF.domaine().creer_tableau_elements(l);
782
783
784 int nb_0 = 0;
785 const double dt = mon_equation_->schema_temps().pas_de_temps();
786 for (int element_number = 0; element_number < nb_elem; element_number++)
787 {
788
789 double eps = 1.0; // default value
790
791 const double a = haut_moy(element_number) * bas_moy(element_number);
792 if (a > 0.)
793 {
794 const double T = 1.5 * l(element_number) * std::pow(a, - 0.125);
795 const double dt_T = dt/T;
796 eps = dt_T / (1 + dt_T);
797 }
798
799 double hmoy_new = eps * haut(element_number) + (1.0 - eps) * haut_moy(element_number);
800 if (hmoy_new < 0.0)
801 {
802 hmoy_new = 0.0;
803 nb_0++;
804 }
805 double bmoy_new = eps * bas(element_number) + (1.0 - eps) * bas_moy(element_number);
806
807
808 double model_c = 0.16 * 0.16; // default value
809 if (bmoy_new != 0.)
810 {
811 model_c = hmoy_new / bmoy_new;
812 }
813
814
815 model_coeff(element_number) = model_c;
816 haut_moy(element_number) = hmoy_new;
817 bas_moy(element_number) = bmoy_new;
818 }
819
820 if (nb_0 != 0)
821 Journal() << "Dans calcul viscosite on a " << nb_0 << " elements avec un coefficient negatif" << finl;
822
823
824 haut_moy.echange_espace_virtuel();
825 bas_moy.echange_espace_virtuel();
826 model_coeff.echange_espace_virtuel();
827
828 }
829
830 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::stabilise_moyenne_euler OUTPUT (STATIC) haut_moy", haut_moy);
831 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::stabilise_moyenne_euler OUTPUT (STATIC) bas_moy", bas_moy);
832 Debog::verifier("Modele_turbulence_scal_LES_dyn_VDF::stabilise_moyenne_euler OUTPUT model_coeff", model_coeff);
833}
834
835//////////////////////////////////////////////////////////////////////
836
837void Modele_turbulence_scal_LES_dyn_VDF::stabilise_moyenne_lagrange(const DoubleTab& haut, const DoubleTab& bas)
838{
839 int nb_0 = 0;
840 static int init = 1;
841 const Domaine_VDF& domaine_VDF = le_dom_VDF.valeur();
842 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot();
843 static DoubleTab haut_moy(nb_elem_tot);
844 static DoubleTab bas_moy(nb_elem_tot);
845 double dt = mon_equation_->schema_temps().pas_de_temps();
846 int element_number;
847 DoubleTab haut_moy_tmp(nb_elem_tot), bas_moy_tmp(nb_elem_tot);
848 double haut_moy_int, bas_moy_int;
849 DoubleVect dist(8);
850 IntVect num(8);
851 double eps, T;
852
853 DoubleVect l(nb_elem_tot);
854
855 if (init == 1)
856 {
857 init = 0;
858 haut_moy = bas;
859 bas_moy = bas;
860 model_coeff = 0.16 * 0.16;
861 }
862 else
863 {
865
866 for (element_number = 0; element_number < nb_elem_tot; element_number++)
867 {
868 calcul_voisins(element_number, num, dist);
869 Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::interpole(num, dist, haut_moy, haut_moy_int);
870 Modele_turbulence_hyd_LES_SMAGO_DYN_VDF::interpole(num, dist, bas_moy, bas_moy_int);
871
872 double a;
873 a = haut_moy(element_number) * bas_moy(element_number);
874
875 if (a >= 0.)
876 {
877 T = 1.5 * l(element_number) * pow(a, -0.125);
878 eps = dt / T / (1 + dt / T);
879 }
880 else
881 eps = 1.;
882
883 haut_moy_tmp(element_number) = eps * haut(element_number) + (1 - eps) * haut_moy_int;
884 if (haut_moy_tmp(element_number) < 0.0)
885 {
886 haut_moy_tmp(element_number) = 0.0;
887 nb_0++;
888 }
889 bas_moy_tmp(element_number) = eps * bas(element_number) + (1 - eps) * bas_moy_int;
890 if (bas_moy_tmp(element_number) != 0.)
891 model_coeff(element_number) = haut_moy_tmp(element_number) / bas_moy_tmp(element_number);
892 else
893 model_coeff(element_number) = 0.16 * 0.16;
894 }
895 haut_moy = haut_moy_tmp;
896 bas_moy = bas_moy_tmp;
897 }
898 if (nb_0 != 0)
899 Cerr << "Dans calcul viscosite on a " << nb_0 << " elements avec un coefficient negatif" << finl;
900
901}
902
903//////////////////////////////////////////////////////////////////////
904
905void Modele_turbulence_scal_LES_dyn_VDF::calcul_voisins(const int element_number, IntVect& num, DoubleVect& dist)
906{
907 const Probleme_base& mon_pb = equation().probleme();
908 const Equation_base& eqn_hydr = mon_pb.equation(0);
909 double dt = eqn_hydr.schema_temps().pas_de_temps();
910 int i, j;
911 IntTab indice(3);
912
913 if (elem_elem_(element_number, 1, 1, 1) == -1)
914 {
915 for (j = 0; j < 8; j++)
916 {
917 num[j] = element_number;
918 dist[j] = 1.0;
919 }
920 }
921 else
922 {
923 for (i = 0; i < 3; i++)
924 {
925 if (cell_cent_vel(element_number, i) > 0)
926 indice(i) = 2;
927 else
928 indice(i) = 0;
929 }
930 num[0] = elem_elem_(element_number, 1, 1, 1);
931 num[1] = elem_elem_(element_number, 1, 1, indice(2));
932 num[2] = elem_elem_(element_number, 1, indice(1), 1);
933 num[3] = elem_elem_(element_number, 1, indice(1), indice(2));
934 num[4] = elem_elem_(element_number, indice(0), 1, 1);
935 num[5] = elem_elem_(element_number, indice(0), 1, indice(2));
936 num[6] = elem_elem_(element_number, indice(0), indice(1), 1);
937 num[7] = elem_elem_(element_number, indice(0), indice(1), indice(2));
938
939 const Domaine_VDF& domaine_VDF = le_dom_VDF.valeur();
940 const DoubleTab& xp = domaine_VDF.xp();
941 DoubleTab x(3);
942 for (i = 0; i < 3; i++)
943 x(i) = xp(element_number, i) - cell_cent_vel(element_number, i) * dt;
944 dist = 0.0;
945 for (j = 0; j < 8; j++)
946 {
947 for (i = 0; i < 3; i++)
948 dist(j) += (xp(num[j], i) - x(i)) * (xp(num[j], i) - x(i));
949 dist(j) = sqrt(dist(j));
950 }
951
952 // verification que l'on ne se trouve pas sur un element
953 double d;
954 d = (xp(num[0], 0) - xp(num[4], 0)) * (xp(num[0], 0) - xp(num[4], 0));
955 d += (xp(num[0], 1) - xp(num[2], 1)) * (xp(num[0], 1) - xp(num[2], 1));
956 d += (xp(num[0], 2) - xp(num[1], 2)) * (xp(num[0], 2) - xp(num[1], 2));
957 int flag = 0;
958 for (j = 0; j < 8; j++)
959 if (dist(j) * dist(j) < d / 10000)
960 flag = 1;
961 if (flag == 1)
962 for (j = 0; j < 8; j++)
963 {
964 num[j] = element_number;
965 dist[j] = 1.0;
966 }
967 }
968}
969
971{
972 const Domaine_VDF& domaine_VDF = le_dom_VDF.valeur();
973 const IntTab& face_voisins = domaine_VDF.face_voisins();
974 const IntTab& elem_faces = domaine_VDF.elem_faces();
975 int nb_elem_tot = domaine_VDF.domaine().nb_elem_tot();
976 int element_number, f, elem;
977
978 //elem_elem(element_number,i,j,k) i-x, j-y k-z et 0-avant 1-meme_position, 2-apres
979
980 elem_elem_.resize(nb_elem_tot, 3, 3, 3);
981
982 for (element_number = 0; element_number < nb_elem_tot; element_number++)
983 {
984 elem_elem_(element_number, 1, 1, 1) = element_number; // xyz
985 f = elem_faces(element_number, 0);
986 elem_elem_(element_number, 0, 1, 1) = face_voisins(f, 0); // x-
987 elem = elem_elem_(element_number, 0, 1, 1);
988 if (elem != -1)
989 {
990 f = elem_faces(elem, 1);
991 elem_elem_(element_number, 0, 0, 1) = face_voisins(f, 0); // x- y-
992 f = elem_faces(elem, 2);
993 elem_elem_(element_number, 0, 1, 0) = face_voisins(f, 0); // x- z-
994 f = elem_faces(elem, 4);
995 elem_elem_(element_number, 0, 2, 1) = face_voisins(f, 1); // x- y+
996 f = elem_faces(elem, 5);
997 elem_elem_(element_number, 0, 1, 2) = face_voisins(f, 1); // x- z+
998 }
999 f = elem_faces(element_number, 3);
1000 elem_elem_(element_number, 2, 1, 1) = face_voisins(f, 1); // x+
1001 elem = elem_elem_(element_number, 2, 1, 1);
1002 if (elem != -1)
1003 {
1004 f = elem_faces(elem, 1);
1005 elem_elem_(element_number, 2, 0, 1) = face_voisins(f, 0); // x+ y-
1006 f = elem_faces(elem, 2);
1007 elem_elem_(element_number, 2, 1, 0) = face_voisins(f, 0); // x+ z-
1008 f = elem_faces(elem, 4);
1009 elem_elem_(element_number, 2, 2, 1) = face_voisins(f, 1); // x+ y+
1010 f = elem_faces(elem, 5);
1011 elem_elem_(element_number, 2, 1, 2) = face_voisins(f, 1); // x+ z+
1012 }
1013 f = elem_faces(element_number, 1);
1014 elem_elem_(element_number, 1, 0, 1) = face_voisins(f, 1); // y-
1015 elem = elem_elem_(element_number, 1, 0, 1);
1016 if (elem != -1)
1017 {
1018 f = elem_faces(elem, 2);
1019 elem_elem_(element_number, 1, 0, 0) = face_voisins(f, 0); // y- z-
1020 f = elem_faces(elem, 5);
1021 elem_elem_(element_number, 1, 0, 2) = face_voisins(f, 1); // y- z+
1022 }
1023 f = elem_faces(element_number, 4);
1024 elem_elem_(element_number, 1, 2, 1) = face_voisins(f, 1); // y+
1025 elem = elem_elem_(element_number, 1, 2, 1);
1026 if (elem != -1)
1027 {
1028 f = elem_faces(elem, 2);
1029 elem_elem_(element_number, 1, 2, 0) = face_voisins(f, 0); // y+ z-
1030 f = elem_faces(elem, 5);
1031
1032 elem_elem_(element_number, 1, 2, 2) = face_voisins(f, 1); // y+ z+
1033 }
1034 f = elem_faces(element_number, 2);
1035 elem_elem_(element_number, 1, 1, 0) = face_voisins(f, 0); // z-
1036 f = elem_faces(element_number, 5);
1037 elem_elem_(element_number, 1, 1, 2) = face_voisins(f, 1); // z+
1038 elem = elem_elem_(element_number, 1, 2, 2);
1039 if (elem != -1)
1040 {
1041 f = elem_faces(elem, 0);
1042 elem_elem_(element_number, 0, 2, 2) = face_voisins(f, 0); // x- y+ z+
1043 f = elem_faces(elem, 3);
1044 elem_elem_(element_number, 2, 2, 2) = face_voisins(f, 1); // x+ y+ z+
1045 }
1046 elem = elem_elem_(element_number, 1, 2, 0);
1047 if (elem != -1)
1048 {
1049 f = elem_faces(elem, 0);
1050 elem_elem_(element_number, 0, 2, 0) = face_voisins(f, 0); // x- y+ z-
1051 f = elem_faces(elem, 3);
1052 elem_elem_(element_number, 2, 2, 0) = face_voisins(f, 1); // x+ y+ z-
1053 }
1054 elem = elem_elem_(element_number, 1, 0, 2);
1055 if (elem != -1)
1056 {
1057 f = elem_faces(elem, 0);
1058 elem_elem_(element_number, 0, 0, 2) = face_voisins(f, 0); // x- y- z+
1059 f = elem_faces(elem, 3);
1060 elem_elem_(element_number, 2, 0, 2) = face_voisins(f, 1); // x+ y- z+
1061 }
1062 elem = elem_elem_(element_number, 1, 0, 0);
1063 if (elem != -1)
1064 {
1065 f = elem_faces(elem, 0);
1066 elem_elem_(element_number, 0, 0, 0) = face_voisins(f, 0); // x- y- z-
1067 f = elem_faces(elem, 3);
1068 elem_elem_(element_number, 2, 0, 0) = face_voisins(f, 1); // x+ y- z-
1069 }
1070
1071 elem_elem_(element_number, 1, 1, 1) = 0;
1072 for (int i = 0; i < 3; i++)
1073 for (int j = 0; j < 3; j++)
1074 for (int k = 0; k < 3; k++)
1075 if (elem_elem_(element_number, i, j, k) == -1)
1076 elem_elem_(element_number, 1, 1, 1) = -1;
1077 }
1078
1079}
1080
1081//////////////////////////////////////////////////////////////////////
1082
1083void Modele_turbulence_scal_LES_dyn_VDF::calcul_tableaux_correspondance(int& N_c, IntVect& compt_c, IntVect& corresp_c)
1084{
1085 // Initialisation de : Yuv + compt_c + corresp_c
1086 const Domaine_dis_base& zdisbase = mon_equation_->inconnue().domaine_dis_base();
1087 const Domaine_VDF& domaine_VDF = ref_cast(Domaine_VDF, zdisbase);
1088 const DoubleTab& xp = domaine_VDF.xp();
1089 int nb_elems = domaine_VDF.domaine().nb_elem();
1090 DoubleTab Y_c;
1091 int num_elem, j, indic_c, trouve;
1092 double y;
1093 j = 0;
1094 indic_c = 0;
1095
1096 // dimensionnement aux valeurs rentrees dans le jeu de donnees
1097 Y_c.resize(N_c);
1098 compt_c.resize(N_c);
1099 corresp_c.resize(nb_elems);
1100
1101 // initialisation
1102 Y_c = -100.;
1103 compt_c = 0;
1104 corresp_c = -1;
1105
1106 // Tolerance relative pour la comparaison des coordonnees y.
1107 // Evite les faux plans fantomes dus aux arrondis flottants en parallele
1108 // sur maillages non uniformes (deadlock MPI dans stabilise_moyenne_plans_paralleles).
1109 const double tol_rel = 1.e-8;
1110
1111 for (num_elem = 0; num_elem < nb_elems; num_elem++)
1112 {
1113 y = xp(num_elem, 1);
1114 trouve = 0;
1115 for (j = 0; j < indic_c + 1; j++)
1116 {
1117 if (j == N_c)
1118 {
1119 Cerr << "nb_points=" << N_c << " est trop petit pour le nombre de plans paralleles." << finl;
1120 Cerr << "Augmenter cette valeur." << finl;
1121 Process::exit();
1122 }
1123 // FIX: comparaison avec tolerance relative au lieu de l'egalite exacte
1124 // sur doubles, qui causait des plans fantomes en parallele sur maillages
1125 // non uniformes, entrainant un deadlock MPI dans mp_sum.
1126 const double ref = std::fabs(y) + std::fabs(Y_c[j]) + 1.e-30;
1127 if (std::fabs(y - Y_c[j]) < tol_rel * ref)
1128 {
1129 corresp_c[num_elem] = j;
1130 compt_c[j]++;
1131 j = indic_c + 1;
1132 trouve = 1;
1133 break;
1134 }
1135 }
1136 if (trouve == 0)
1137 {
1138 corresp_c[num_elem] = indic_c;
1139 Y_c[indic_c] = y;
1140 compt_c[indic_c]++;
1141 indic_c++;
1142 }
1143 }
1144 N_c = indic_c; // nombre de y pour les elements locaux
1145
1146 // FIX: synchronisation de N_c entre tous les processus MPI.
1147 // Sans cela, N_c peut differer d'un processus a l'autre (plans fantomes),
1148 // ce qui provoque un deadlock dans la boucle mp_sum de
1149 // stabilise_moyenne_plans_paralleles ou le collectif n'est pas appele
1150 // le meme nombre de fois par tous les processus.
1151 N_c = Process::mp_max(N_c);
1152
1153 compt_c.resize(N_c);
1154}
1155
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
classe Champ_Uniforme Represente un champ constant dans l'espace et dans le temps.
double temps() const
Renvoie le temps du champ.
const Champ_Inc_base & inconnue() const override=0
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
class Domaine_VDF
Definition Domaine_VDF.h:64
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.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual const RefObjU & get_modele(Type_modele type) const
virtual const Champ_Inc_base & inconnue() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
Definition Milieu_base.h:50
virtual const Champ_Don_base & capacite_calorifique() const
Renvoie la capacite calorifique du milieu.
virtual const Champ_Don_base & conductivite() const
Renvoie la conductivite du milieu.
virtual const Champ_base & masse_volumique() const
Renvoie la masse volumique du milieu.
static void calculer_length_scale(DoubleVect &, const Domaine_VDF &)
static void calculer_cell_cent_vel(DoubleTab &, const Domaine_VDF &, Champ_Inc_base &)
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)
static void interpole(const IntVect &, const DoubleVect &, const DoubleVect &, double &)
static void calculer_filter_field(const DoubleTab &, DoubleTab &, const Domaine_VDF &)
Classe Modele_turbulence_hyd_base Cette classe sert de base a la hierarchie des classes.
const Champ_Fonc_base & viscosite_turbulente() const
void calculer_model_coefficient(const DoubleTab &, const DoubleTab &)
void stabilise_moyenne_lagrange(const DoubleTab &, const DoubleTab &)
void stabilise_moyenne(const DoubleTab &, const DoubleTab &)
void calculer_Mj(const DoubleTab &, const DoubleTab &, const DoubleTab &, const DoubleTab &, const DoubleTab &, DoubleTab &)
void stabilise_moyenne_6_points(const DoubleTab &, const DoubleTab &)
void stabilise_moyenne_plans_paralleles(const DoubleTab &, const DoubleTab &)
void calcul_voisins(const int, IntVect &, DoubleVect &)
void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &) override
NE FAIT RIEN.
void calculer_Lj(const DoubleTab &, const DoubleTab &, const DoubleTab &, const DoubleTab &, DoubleTab &)
void stabilise_moyenne_euler(const DoubleTab &, const DoubleTab &)
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_filter_coeff(const DoubleTab &, DoubleTab &)
void calculer_grad_teta(const DoubleVect &, DoubleTab &)
void calcul_tableaux_correspondance(int &, IntVect &, IntVect &)
Classe Modele_turbulence_scal_base Cette classe represente un modele de turbulence pour une equation ...
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.
Convection_Diffusion_std & equation()
virtual void set_param(Param &) const override
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
friend class Entree
Definition Objet_U.h:76
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
virtual DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const
DoubleTab & flux_bords()
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Definition Param.cpp:364
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
classe Pb_Thermohydraulique_Turbulent Cette classe represente un probleme de thermohydraulique en flu...
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
virtual const Milieu_base & milieu() const
Renvoie le milieu physique associe au probleme.
virtual const Equation_base & equation(int) const =0
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
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ size_array() const
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ size() const
Definition TRUSTVect.tpp:45
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")
const Objet_U & valeur() const
Definition TRUST_Ref.h:134