TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Modele_turbulence_hyd_base.cpp
1/****************************************************************************
2* Copyright (c) 2026, 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_base.h>
17#include <EcritureLectureSpecial.h>
18#include <Operateur_Diff_base.h>
19#include <Operateur_Conv_base.h>
20#include <Discretisation_base.h>
21#include <Schema_Temps_base.h>
22#include <communications.h>
23#include <LecFicDiffuse.h>
24#include <EcrFicPartage.h>
25#include <Postraitement.h>
26#include <Equation_base.h>
27#include <Probleme_base.h>
28#include <TRUST_2_PDI.h>
29#include <Operateur.h>
30#include <Domaine.h>
31#include <Param.h>
32#include <Debog.h>
33
34Implemente_base(Modele_turbulence_hyd_base, "Modele_turbulence_hyd_base", Objet_U);
35// XD modele_turbulence_hyd_deriv objet_lecture modele_turbulence_hyd_deriv INHERITS_BRACE Basic class for turbulence
36// XD_CONT model for Navier-Stokes equations.
37
38Sortie& Modele_turbulence_hyd_base::printOn(Sortie& s) const { return s << que_suis_je() << " " << le_nom(); }
39
40/*! @brief Lit les specifications d'un modele de turbulence a partir d'un flot d'entree.
41 *
42 * Format:
43 * Modele_turbulence type_modele
44 * {
45 * [Turbulence_paroi la_loi_de_paroi]
46 * bloc de lecture specifique du type de turbulence
47 * }
48 *
49 * @param (Entree& is) un flot d'entree
50 * @return (Entree&) le flot d'entree modifie
51 * @throws accolade ouvrante attendue
52 * @throws loi de paroi incompatible avec le probleme
53 */
55{
56 Cerr << "Reading of data for a " << que_suis_je() << " hydraulic turbulence model" << finl;
57 Param param(que_suis_je());
58 set_param(param);
59 param.lire_avec_accolades_depuis(is);
60 // Verifications
61 // Cas ou Correction_visco_turb_pour_controle_pas_de_temps_parametre est lu sans Correction_visco_turb_pour_controle_pas_de_temps
62 if (dt_diff_sur_dt_conv_ != -1)
63 calcul_borne_locale_visco_turb_ = true;
64 // Cas ou Correction_visco_turb_pour_controle_pas_de_temps sans Correction_visco_turb_pour_controle_pas_de_temps_parametre
65 else if (calcul_borne_locale_visco_turb_)
66 dt_diff_sur_dt_conv_ = 1;
67 // Cas ou Correction_visco_turb_pour_controle_pas_de_temps_parametre est incorrectement fixe
68 if (dt_diff_sur_dt_conv_ <= 0 && calcul_borne_locale_visco_turb_)
69 {
70 Cerr << "Parameter value Correction_visco_turb_pour_controle_pas_de_temps_parametre must be strictly positive." << finl;
71 exit();
72 }
73 return is;
74}
75
77{
78 param.ajouter_non_std("turbulence_paroi", (this), Param::REQUIRED); // XD attr turbulence_paroi turbulence_paroi_base turbulence_paroi OPT Keyword to set the wall law.
79 param.ajouter_non_std("dt_impr_ustar", (this)); // XD attr dt_impr_ustar floattant dt_impr_ustar OPT This keyword is used to print the values (U +, d+, u$\star$) obtained with the wall laws into a file named datafile_ProblemName_Ustar.face and periode refers to the printing period, this value is expressed in seconds.
80 param.ajouter_non_std("dt_impr_ustar_mean_only", (this)); // XD attr dt_impr_ustar_mean_only dt_impr_ustar_mean_only dt_impr_ustar_mean_only OPT This keyword is used to print the mean values of u* ( obtained with the wall laws) on each boundary, into a file named datafile_ProblemName_Ustar_mean_only.out. periode refers to the printing period, this value is expressed in seconds. If you don\'t use the optional keyword boundaries, all the boundaries will be considered. If you use it, you must specify nb_boundaries which is the number of boundaries on which you want to calculate the mean values of u*, then you have to specify their names.
81 param.ajouter("nut_max", &XNUTM_); // XD attr nut_max floattant nut_max OPT Upper
82 // XD_CONT limitation of turbulent viscosity (default value 1.e8).
83 param.ajouter_flag("Correction_visco_turb_pour_controle_pas_de_temps", &calcul_borne_locale_visco_turb_); // XD attr correction_visco_turb_pour_controle_pas_de_temps rien correction_visco_turb_pour_controle_pas_de_temps OPT Keyword to set a limitation to low time steps due to high values of turbulent viscosity. The limit for turbulent viscosity is calculated so that diffusive time-step is equal or higher than convective time-step. For a stationary flow, the correction for turbulent viscosity should apply only during the first time steps and not when permanent state is reached. To check that, we could post process the corr_visco_turb field which is the correction of turbulent viscosity: it should be 1. on the whole domain.
84 param.ajouter("Correction_visco_turb_pour_controle_pas_de_temps_parametre", &dt_diff_sur_dt_conv_); // XD attr correction_visco_turb_pour_controle_pas_de_temps_parametre floattant correction_visco_turb_pour_controle_pas_de_temps_parametre OPT Keyword to set a limitation to low time steps due to high values of turbulent viscosity. The limit for turbulent viscosity is the ratio between diffusive time-step and convective time-step is higher or equal to the given value [0-1]
85 //param.ajouter_condition("not(is_read_dt_impr_ustar_mean_only_and_is_read_dt_impr_ustar)","only one of dt_impr_ustar_mean_only and dt_impr_ustar can be used");
86}
87
89{
90 Motcle motlu;
91 int retval = 1;
92 if (mot == "turbulence_paroi")
93 {
95 is >> loipar_.valeur();
96 }
97 else if (mot == "dt_impr_ustar")
98 {
99 if (loipar_->que_suis_je().contient("negligeable"))
100 Process::exit("Please remove dt_impr_ustar option if the wall law is of Negligeable type.");
101 is >> dt_impr_ustar_;
102 }
103 else if (mot == "dt_impr_ustar_mean_only")
104 {
105 if (loipar_->que_suis_je().contient("negligeable"))
106 Process::exit("Please remove dt_impr_ustar option if the wall law is of Negligeable type.");
107 // XD dt_impr_ustar_mean_only objet_lecture nul BRACE not_set
108 // XD attr dt_impr floattant dt_impr REQ not_set
109 // XD attr boundaries listchaine boundaries OPT not_set
110 Nom accolade_ouverte = "{";
111 Nom accolade_fermee = "}";
112 nom_fichier_ = Objet_U::nom_du_cas() + "_" + equation().probleme().le_nom() + "_ustar_mean_only";
113 Domaine& dom = equation().probleme().domaine();
114 LIST(Nom) nlistbord_dom; //!< liste stockant tous les noms de frontiere du domaine
115 int nbfr = dom.nb_front_Cl();
116 for (int b = 0; b < nbfr; b++)
117 {
118 Frontiere& org = dom.frontiere(b);
119 nlistbord_dom.add(org.le_nom());
120 }
121 is >> motlu;
122 if (motlu != accolade_ouverte)
123 {
124 Cerr << motlu << " is not a keyword understood by " << que_suis_je() << " in lire_motcle_non_standard" << finl;
125 Cerr << "A specification of kind : dt_impr_ustar_mean_only { dt_impr periode [boundaries nb_boundaries boundary_name1 boundary_name2 ... ] } was expected." << finl;
126 exit();
127 }
128 is >> motlu;
129 if (motlu != "dt_impr")
130 {
131 Cerr << "We expected dt_impr..." << finl;
132 exit();
133 }
135
136 is >> motlu; // boundaries ou accolade_fermee ou pasbon
137 if (motlu != accolade_fermee)
138 {
139 if (motlu == "boundaries")
140 {
141 boundaries_ = 1;
142 int nb_bords = 0;
143 Nom nom_bord_lu;
144
145 // read boundaries number
146 is >> nb_bords;
147 if (nb_bords != 0)
148 {
149 // read boundaries
150 for (int i = 0; i < nb_bords; i++)
151 {
152 is >> nom_bord_lu;
153 boundaries_list_.add(Nom(nom_bord_lu));
154 // verif nom bords
155 if (!nlistbord_dom.contient(boundaries_list_[i]))
156 {
157 Cerr << "Problem in the dt_impr_ustar_mean_only instruction:" << finl;
158 Cerr << "The boundary named '" << boundaries_list_[i] << "' is not a boundary of the domain " << dom.le_nom() << "." << finl;
159 exit();
160 }
161 }
162 }
163 // lecture accolade fermee
164 is >> motlu;
165 if (motlu != accolade_fermee)
166 {
167 Cerr << "Problem in the dt_impr_ustar_mean_only instruction:" << finl;
168 Cerr << "TRUST wants to read a '" << accolade_fermee << "' but find '" << motlu << "'!!" << finl;
169 exit();
170 }
171 }
172 else
173 {
174 Cerr << motlu << " is not a keyword understood by " << que_suis_je() << " in lire_motcle_non_standard" << finl;
175 Cerr << "A specification of kind : dt_impr_ustar_mean_only { dt_impr periode [boundaries nb_boundaries boundary_name1 boundary_name2 ... ] } was expected." << finl;
176 exit();
177 }
178 }
179 } // fin dt_impr_ustar_mean_only
180 else
181 retval = -1;
182
183 return retval;
184}
185
186/*! @brief Associe l'equation passe en parametre au modele de turbulence.
187 *
188 * @param (Equation_base& eqn) l'equation a laquelle l'objet s'associe
189 */
191{
192 mon_equation_ = eqn;
193}
194
195/*! @brief Lit le fichier dom_Wall_length.
196 *
197 * xyz pour remplir le champs wall_length en vue d'un post-traitement de distance_paroi
198 *
199 */
201{
202 // PQ : 25/02/04 recuperation de la distance a la paroi dans Wall_length.xyz
203 DoubleTab& wall_length = wall_length_->valeurs();
204 wall_length = -1.;
205
206 LecFicDiffuse fic;
207 Nom nom_fic = equation().probleme().domaine().le_nom() + "_Wall_length.xyz";
208 fic.set_bin(1);
209 if (!fic.ouvrir(nom_fic))
210 {
211 Cerr << " File " << nom_fic << " doesn't exist. To generate it, please, refer to html.doc (Distance_paroi) " << finl;
212 exit();
213 }
214
215 Noms nom_paroi;
216
217 fic >> nom_paroi;
218
220
221}
222
223/*! @brief Discretise le modele de turbulence.
224 *
225 */
227{
228 Cerr << "Turbulence hydraulic model discretization" << finl;
229 discretiser_visc_turb(mon_equation_->schema_temps(), mon_equation_->domaine_dis(), la_viscosite_turbulente_);
230 champs_compris_.ajoute_champ(la_viscosite_turbulente_);
231
232 discretiser_corr_visc_turb(mon_equation_->schema_temps(), mon_equation_->domaine_dis(), corr_visco_turb_);
233 champs_compris_.ajoute_champ(corr_visco_turb_);
234 const Discretisation_base& dis = ref_cast(Discretisation_base, mon_equation_->discretisation());
235 dis.discretiser_champ("champ_elem", mon_equation_->domaine_dis(), "distance_paroi", "m", 1, mon_equation_->schema_temps().temps_courant(), wall_length_);
236 champs_compris_.ajoute_champ(wall_length_);
237}
238
240{
241 int is_dilat = equation().probleme().is_dilatable();
242 if (!is_dilat)
243 Cerr << "Turbulent viscosity field discretization" << finl;
244 else
245 Cerr << "Turbulent dynamic viscosity field discretization" << finl;
246 Nom nom = (is_dilat == 1) ? "viscosite_dynamique_turbulente" : "viscosite_turbulente";
247 Nom unite = (is_dilat == 1) ? "kg/(m.s)" : "m2/s";
248 const Discretisation_base& dis = mon_equation_->discretisation();
249 dis.discretiser_champ("champ_elem", z, nom, unite, 1, sch.temps_courant(), ch);
250}
251
253{
254 Cerr << "Turbulent viscosity correction field discretization" << finl;
255 const Discretisation_base& dis = mon_equation_->discretisation();
256 dis.discretiser_champ("champ_elem", z, "corr_visco_turb", "adimensionnel", 1, sch.temps_courant(), ch);
257}
258
260{
261 Cerr << "Kinetic turbulent energy field discretisation" << finl;
262 const Discretisation_base& dis = mon_equation_->discretisation();
263 dis.discretiser_champ("champ_elem", z, "K", "m2/s2", 1, sch.temps_courant(), ch);
264}
265
266/*! @brief Prepare le calcul.
267 *
268 * Initialise la loi de paroi.
269 * Remplit le champ wall_length en cas de post traitemetn de la distance_paroi
270 *
271 * @return (int) code de retour de Turbulence_paroi::init_lois_paroi()
272 */
274{
275 int res = 1;
276 if (loipar_)
277 res = loipar_->init_lois_paroi();
278
279 bool contient_distance_paroi = false;
280
281 for (auto &itr : equation().probleme().postraitements())
282 if (!contient_distance_paroi)
283 if (sub_type(Postraitement, itr.valeur()))
284 {
285 Postraitement& post = ref_cast(Postraitement, itr.valeur());
286 for (int i = 0; i < post.noms_champs_a_post().size(); i++)
287 {
288 // The new global wall distance computation does not use the old method.
289 const Nom& chmp = post.noms_champs_a_post()[i];
290 if (!chmp.contient("DISTANCE_PAROI_GLOBALE") && chmp.contient("DISTANCE_PAROI"))
291 {
293 contient_distance_paroi = true;
294 break;
295 }
296 }
297 }
298 if (nom_fichier_!="")
299 loipar_->imprimer_premiere_ligne_ustar(boundaries_, boundaries_list_, nom_fichier_);
300 return res;
301}
302
304{
305 return true;
306}
307
309{
310 if (loipar_)
311 {
312 loipar_->creer_champ(motlu);
313 }
314}
315
316bool Modele_turbulence_hyd_base::has_champ(const Motcle& nom, OBS_PTR(Champ_base)& ref_champ) const
317{
318 if (champs_compris_.has_champ(nom, ref_champ))
319 return true;
320
321 if (loipar_)
322 if (loipar_->has_champ(nom, ref_champ))
323 return true;
324
325 return false; /* rien trouve */
326}
327
329{
330 if (champs_compris_.has_champ(nom))
331 return true;
332
333 if (loipar_)
334 if (loipar_->has_champ(nom))
335 return true;
336
337 return false; /* rien trouve */
338}
339
341{
342 OBS_PTR(Champ_base) ref_champ;
343
344 if (champs_compris_.has_champ(nom, ref_champ))
345 return ref_champ;
346
347 if (loipar_)
348 if (loipar_->has_champ(nom, ref_champ))
349 return ref_champ;
350
351 throw std::runtime_error(std::string("Field ") + nom.getString() + std::string(" not found !"));
352}
353
355{
356 if (opt == DESCRIPTION)
357 Cerr << que_suis_je() << " : " << champs_compris_.liste_noms_compris() << finl;
358 else
359 nom.add(champs_compris_.liste_noms_compris());
360
361 if (loipar_)
362 loipar_->get_noms_champs_postraitables(nom, opt);
363}
364
365/*! @brief Effectue l'impression si cela est necessaire.
366 *
367 * @return renvoie toujours 1
368 */
370{
371 const Schema_Temps_base& sch = mon_equation_->schema_temps();
372 double temps_courant = sch.temps_courant();
373 double dt = sch.pas_de_temps();
374 if (loipar_ && limpr_ustar(temps_courant, sch.temps_precedent(), dt, dt_impr_ustar_))
375 loipar_->imprimer_ustar(os);
376 if (loipar_ && limpr_ustar(temps_courant, sch.temps_precedent(), dt, dt_impr_ustar_mean_only_))
377 loipar_->imprimer_ustar_mean_only(os, boundaries_, boundaries_list_, nom_fichier_);
378}
379
380int Modele_turbulence_hyd_base::limpr_ustar(double temps_courant, double temps_prec, double dt, double dt_ustar) const
381{
382 const Schema_Temps_base& sch = mon_equation_->schema_temps();
383 if (sch.nb_pas_dt() == 0)
384 return 0;
385 if (dt_ustar <= dt
386 || ((sch.temps_cpu_max_atteint() || (!get_disable_stop() && sch.stop_lu()) || sch.temps_final_atteint() || sch.nb_pas_dt_max_atteint() || sch.nb_pas_dt() == 1 || sch.stationnaire_atteint())
387 && !est_egal(dt_ustar, 1.e20)))
388 return 1;
389 else
390 {
391 // Voir Schema_Temps_base::limpr pour information sur epsilon et modf
392 double i, j, epsilon = 1.e-8;
393 modf(temps_courant / dt_ustar + epsilon, &i);
394 modf(temps_prec / dt_ustar + epsilon, &j);
395 return (i > j);
396 }
397}
398
399
400/*! @brief for PDI IO: retrieve name, type and dimensions of the fields to save/restore
401 *
402 */
404{
405 std::vector<YAML_data> data;
406 if (loipar_)
407 {
408 data = loipar_->data_a_sauvegarder();
409 }
410 return data;
411}
412
413/*! @brief Sauvegarde le modele de turbulence sur un flot de sortie.
414 *
415 * Sauvegarde le type de l'objet.
416 *
417 * @param (Sortie& os) un flot de sortie
418 * @return (int) renvoie toujours 1
419 */
421{
422 a_faire(os);
423 if (loipar_)
424 {
425 loipar_->sauvegarder(os);
426 }
427 else if(!TRUST_2_PDI::is_PDI_checkpoint()) // OC: pour le bas Re, on ecrit negligeable => pas de pb a faire ceci ?
428 {
429 const Discretisation_base& discr = mon_equation_->discretisation();
430 Nom nom_discr = discr.que_suis_je();
431 Nom type = "negligeable_";
432 type += nom_discr.substr_old(1, 3);
433 os << type << finl;
434 }
435 // Verification que l'appel a bien ete fait a Modele_turbulence_hyd_base::limiter_viscosite_turbulente()
436 assert(mp_sum(borne_visco_turb_.size()) != 0);
437 return 0;
438}
439/*! @brief Reprend la loi de paroi
440 *
441 * @param (Entree&) un flot d'entree
442 * @return (int) renvoie toujours 0
443 */
445{
446 if (loipar_)
447 loipar_->reprendre(is);
448 return 0;
449}
450
451/*! @brief Effectue l'ecriture d'une identite si cela est necessaire.
452 *
453 */
455{
456 int afaire, special;
458
459 if (afaire)
460 {
461 Nom mon_ident(que_suis_je());
462 mon_ident += equation().probleme().domaine().le_nom();
463 double temps = equation().inconnue().temps();
464 mon_ident += Nom(temps, "%e");
465 os << mon_ident << finl;
466 os << que_suis_je() << finl;
467 os.flush();
468 }
469}
470
472{
473 // On initial
474 int size = viscosite_turbulente().valeurs().size();
475 if (borne_visco_turb_.size() == 0)
476 borne_visco_turb_ = la_viscosite_turbulente_->valeurs();
477 borne_visco_turb_ = XNUTM_;
478 if (calcul_borne_locale_visco_turb_ && (equation().schema_temps().nb_pas_dt() != 0 || equation().probleme().reprise_effectuee()))
479 {
480 // On recalcule les bornes de la viscosite turbulente apres le premier pas de temps
481 const Operateur_Diff_base& op_diff = ref_cast(Operateur_Diff_base, equation().operateur(0).l_op_base());
482 const Operateur_Conv_base& op_conv = ref_cast(Operateur_Conv_base, equation().operateur(1).l_op_base());
483 op_diff.calculer_borne_locale(borne_visco_turb_, op_conv.dt_stab_conv(), dt_diff_sur_dt_conv_);
484 }
485 // On borne la viscosite turbulente
486 int nb_elem = equation().domaine_dis().domaine().nb_elem();
487 assert(nb_elem == size);
488 int compt = 0;
489 Debog::verifier("Modele_turbulence_hyd_base::limiter_viscosite_turbulente la_viscosite_turbulente before", la_viscosite_turbulente_->valeurs());
490
491 CDoubleArrView borne_visco_turb = borne_visco_turb_.view_ro();
492 DoubleArrView corr_visco_turb = static_cast<DoubleVect&>(corr_visco_turb_->valeurs()).view_wo();
493 DoubleArrView visco_turb = static_cast<DoubleVect&>(la_viscosite_turbulente_->valeurs()).view_rw();
494 // Remplissage des tableaux de travail:
495 Kokkos::parallel_reduce(start_gpu_timer(__KERNEL_NAME__),
496 Kokkos::RangePolicy<>(0, nb_elem), KOKKOS_LAMBDA(
497 const int elem, int& compt_)
498 {
499 if (visco_turb(elem) > borne_visco_turb(elem))
500 {
501 compt_++;
502 corr_visco_turb(elem) = borne_visco_turb(elem) / visco_turb(elem);
503 visco_turb(elem) = borne_visco_turb(elem);
504 }
505 else
506 corr_visco_turb(elem) = 1.;
507 }, Kokkos::Sum<int>(compt));
508 end_gpu_timer(__KERNEL_NAME__);
509 corr_visco_turb_->changer_temps(mon_equation_->inconnue().temps());
510 la_viscosite_turbulente_->valeurs().echange_espace_virtuel();
511 Debog::verifier("Modele_turbulence_hyd_base::limiter_viscosite_turbulente la_viscosite_turbulente after", la_viscosite_turbulente_->valeurs());
512
513 // On imprime
514 int imprimer_compt = 0;
515 if (mon_equation_->schema_temps().temps_impr() <= mon_equation_->schema_temps().pas_de_temps())
516 imprimer_compt = 1;
517 else
518 {
519 if (mon_equation_->schema_temps().nb_pas_dt() == 0)
520 imprimer_compt = 0;
521 else
522 {
523 // Voir Schema_Temps_base::limpr pour information sur epsilon et modf
524 double i, j, epsilon = 1.e-8;
525 modf(mon_equation_->schema_temps().temps_courant() / mon_equation_->schema_temps().temps_impr() + epsilon, &i);
526 modf((mon_equation_->schema_temps().temps_courant() - mon_equation_->schema_temps().pas_de_temps()) / mon_equation_->schema_temps().temps_impr() + epsilon, &j);
527 if (i > j)
528 imprimer_compt = 1;
529 }
530 }
531 if (imprimer_compt)
532 {
533 // PL: optimization to avoid 2 mp_sum instead 1:
534 ArrOfTID tmp(2);
535 tmp[0] = compt;
536 tmp[1] = size;
538 /* compt=mp_sum(compt);
539 size=mp_sum(size); */
540 double pourcent = 100.0 * (double(tmp[0]) / double(tmp[1]));
541 if (je_suis_maitre() && pourcent > 0)
542 Cout << "\nTurbulent viscosity has been limited on " << pourcent << " % of cells mesh." << finl;
543 }
544}
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
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
double temps() const
Renvoie le temps du champ.
bool has_champ(const Motcle &nom, OBS_PTR(FIELD_TYPE)&ref_champ) const
static void verifier(const char *const msg, double)
Definition Debog.cpp:21
classe Discretisation_base Cette classe represente un schema de discretisation en espace,...
void discretiser_champ(const Motcle &directive, const Domaine_dis_base &z, const Nom &nom, const Nom &unite, int nb_comp, int nb_pas_dt, double temps, OWN_PTR(Champ_Inc_base)&champ, const Nom &sous_type=NOM_VIDE) const
int nb_front_Cl() const
Definition Domaine.h:236
const Frontiere_t & frontiere(int i) const
Definition Domaine.h:539
int_t nb_elem() const
Definition Domaine.h:131
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
static int is_ecriture_special(int &special, int &a_faire)
indique si le format special a ete demande en lecture active par sauvegarde xyz .
static void lecture_special(Champ_base &ch, Entree &fich)
simple appel a EcritureLectureSpecial::lecture_special (const Domaine_VF& zvf,Entree& fich,...
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 Champ_Inc_base & inconnue() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Frontiere.h:49
void add(const Frontiere_32_64 &)
Ajoute les sommets (et faces) de la frontiere passee en parametre a l'objet (Frontiere_32_64).
Cette classe implemente les operateurs et les methodes virtuelles de la classe EFichier de la facon s...
int ouvrir(const char *name, IOS_OPEN_MODE mode=ios::in) override
Ouverture du fichier.
void set_bin(bool bin) override
appelle get_entree_master().
Classe Modele_turbulence_hyd_base Cette classe sert de base a la hierarchie des classes.
OBS_PTR(Equation_base) mon_equation_
int limpr_ustar(double, double, double, double) const
LIST(Nom) boundaries_list_
virtual std::vector< YAML_data > data_a_sauvegarder() const
for PDI IO: retrieve name, type and dimensions of the fields to save/restore
void associer_eqn(const Equation_base &)
Associe l'equation passe en parametre au modele de turbulence.
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.
OWN_PTR(Champ_Fonc_base) la_viscosite_turbulente_
virtual int preparer_calcul()
Prepare le calcul.
void discretiser_visc_turb(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Fonc_base)&) const
virtual void set_param(Param &param) const override
void discretiser_K(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Fonc_base)&) const
int reprendre(Entree &) override
Reprend la loi de paroi.
void discretiser_corr_visc_turb(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Fonc_base)&) const
int sauvegarder(Sortie &) const override
Sauvegarde le modele de turbulence sur un flot de sortie.
const Champ_Fonc_base & viscosite_turbulente() const
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
void creer_champ(const Motcle &motlu) override
void lire_distance_paroi()
Lit le fichier dom_Wall_length.
Equation_base & equation()
Renvoie l'equation associee au modele de turbulence.
virtual void discretiser()
Discretise le modele de turbulence.
void a_faire(Sortie &) const
Effectue l'ecriture d'une identite si cela est necessaire.
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
virtual void imprimer(Sortie &) const
Effectue l'impression si cela est necessaire.
const Champ_base & get_champ(const Motcle &nom) const override
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
Nom substr_old(const int, const int) const
Retourne un nom selon la commande usuelle substr ATTENTION : deb = 1 => premier caractere de la chain...
Definition Nom.cpp:473
bool contient(const Nom &nom) const
Definition Nom.h:86
const std::string & getString() const
Definition Nom.h:92
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
friend class Entree
Definition Objet_U.h:76
friend class Sortie
Definition Objet_U.h:75
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
static const Nom & nom_du_cas()
Renvoie une reference constante vers le nom du cas.
Definition Objet_U.cpp:146
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
classe Operateur_Conv_base Cette classe est la base de la hierarchie des operateurs representant
double dt_stab_conv() const
classe Operateur_Diff_base Cette classe est la base de la hierarchie des operateurs representant
virtual void calculer_borne_locale(DoubleVect &, double, double) const
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void ajouter_flag(const char *keyword, const bool *value)
Register a boolean flag whose mere presence switches it to true.
Definition Param.cpp:474
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Definition Param.cpp:364
@ 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
classe Postraitement La classe est dotee -d une liste de champs generiques champs_post_complet_ qui c...
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Probleme_U.h:109
bool is_dilatable() const
const Domaine & domaine() const
Renvoie le domaine associe au probleme.
static void mp_sum_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
Definition Process.cpp:193
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
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Definition Process.cpp:86
class Schema_Temps_base
double temps_courant() const
Renvoie le temps courant.
int nb_pas_dt_max_atteint() const
Renvoie 1 si (le nombre de pas de temps >= nombre de pas de temps maximum).
int temps_final_atteint() const
Renvoie 1 si le temps final est atteint (ou depasse).
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
int nb_pas_dt() const
Renvoie le nombre de pas de temps effectues.
int stop_lu() const
Renvoie 1 si le fichier (d'extension) .
int stationnaire_atteint() const
int temps_cpu_max_atteint() const
double temps_precedent() const
Renvoie le temps courant.
Classe de base des flux de sortie.
Definition Sortie.h:52
virtual Sortie & flush()
Definition Sortie.cpp:138
_SIZE_ size() const
Definition TRUSTVect.tpp:45
static int is_PDI_checkpoint()
static void typer_lire_turbulence_paroi(OWN_PTR(Turbulence_paroi_base)&, const Modele_turbulence_hyd_base &, Entree &)
Lit les caracteristques de la loi de parois a partir d'un flot d'entree.