TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Modele_turbulence_scal_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_scal_base.h>
17#include <Modele_turbulence_hyd_base.h>
18#include <EcritureLectureSpecial.h>
19#include <Convection_Diffusion_std.h>
20#include <Discretisation_base.h>
21#include <Probleme_base.h>
22#include <Domaine.h>
23#include <Param.h>
24
25Implemente_base(Modele_turbulence_scal_base, "Modele_turbulence_scal_base", Objet_U);
26// XD turbulence_paroi_scalaire_base objet_u turbulence_paroi_scalaire_base INHERITS_BRACE Basic class for wall laws for
27// XD_CONT energy equation.
28
29// XD modele_turbulence_scal_base objet_u modele_turbulence_scal_base INHERITS_BRACE Basic class for turbulence model
30// XD_CONT for energy equation.
31
33{
34 return s << que_suis_je() << " " << le_nom();
35}
36
38{
39 Cerr << "Reading of data for a " << que_suis_je() << " scalar turbulence model" << finl;
40 Param param(que_suis_je());
41 Motcle mot = "turbulence_paroi";
42 set_param(param);
43 param.lire_avec_accolades_depuis(is);
44 const Probleme_base& le_pb = mon_equation_->probleme();
45 // lp loi de paroi du modele de turbulence de l'hydraulique
46 const RefObjU& modele_turbulence = le_pb.equation(0).get_modele(TURBULENCE);
47 const Modele_turbulence_hyd_base& mod_turb_hydr = ref_cast(Modele_turbulence_hyd_base, modele_turbulence.valeur());
48 if (!loipar_ && mod_turb_hydr.has_loi_paroi_hyd())
49 {
50 Cerr << finl;
51 Cerr << "Mot cle " << mot << "non trouve !" << finl;
52 Cerr << "On doit lire une loi de paroi dans le modele de turbulence pour un scalaire." << finl;
53 Cerr << finl;
54 exit();
55 }
56 return is;
57}
58
60{
61 param.ajouter("dt_impr_nusselt", &dt_impr_nusselt_); // XD_ADD_P floattant
62 // XD_CONT Keyword to print local values of Nusselt number and temperature near a wall during a turbulent calculation.
63 // XD_CONT The values will be printed in the _Nusselt.face file each dt_impr_nusselt time period. The local Nusselt
64 // XD_CONT expression is as follows : Nu = ((lambda+lambda_t)/lambda)*d_wall/d_eq where d_wall is the distance from
65 // XD_CONT the first mesh to the wall and d_eq is given by the wall law. This option also gives the value of d_eq and
66 // XD_CONT h = (lambda+lambda_t)/d_eq and the fluid temperature of the first mesh near the wall. NL2 For the Neumann
67 // XD_CONT boundary conditions (flux_impose), the <<equivalent>> wall temperature given by the wall law is also
68 // XD_CONT printed (Tparoi equiv.) preceded for VEF calculation by the edge temperature <<T face de bord>>.
69 param.ajouter_non_std("dt_impr_nusselt_mean_only", (this)); // XD attr dt_impr_nusselt_mean_only dt_impr_nusselt_mean_only dt_impr_nusselt_mean_only OPT This keyword is used to print the mean values of Nusselt ( obtained with the wall laws) on each boundary, into a file named datafile_ProblemName_nusselt_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, then you have to specify their names.
70 param.ajouter_non_std("turbulence_paroi", this); // XD_ADD_P turbulence_paroi_scalaire_base
71 // XD_CONT Keyword to set the wall law.
72}
74{
75 Motcle motlu;
76 int retval = 1;
77 if (mot == "turbulence_paroi")
78 {
80 is >> loipar_.valeur();
81 }
82 else if (mot == "dt_impr_nusselt_mean_only")
83 {
84 if (loipar_->que_suis_je().contient("negligeable"))
85 Process::exit("Please remove dt_impr_nusselt option if the wall law is of Negligeable type.");
86 // XD dt_impr_nusselt_mean_only objet_lecture nul BRACE not_set
87 // XD attr dt_impr floattant dt_impr REQ not_set
88 // XD attr boundaries listchaine boundaries OPT not_set
89 Nom accolade_ouverte = "{";
90 Nom accolade_fermee = "}";
91 nom_fichier_ = Objet_U::nom_du_cas() + "_" + equation().probleme().le_nom() + "_nusselt_mean_only";
92 Domaine& dom = equation().probleme().domaine();
93 LIST(Nom) nlistbord_dom; //!< liste stockant tous les noms de frontiere du domaine
94 int nbfr = dom.nb_front_Cl();
95 for (int b = 0; b < nbfr; b++)
96 {
97 Frontiere& org = dom.frontiere(b);
98 nlistbord_dom.add(org.le_nom());
99 }
100 is >> motlu;
101 if (motlu != accolade_ouverte)
102 {
103 Cerr << motlu << " is not a keyword understood by " << que_suis_je() << " in lire_motcle_non_standard" << finl;
104 Cerr << "A specification of kind : dt_impr_nusselt_mean_only { dt_impr periode [boundaries nb_boundaries boundary_name1 boundary_name2 ... ] } was expected." << finl;
105 exit();
106 }
107 is >> motlu;
108 if (motlu != "dt_impr")
109 {
110 Cerr << "We expected dt_impr..." << finl;
111 exit();
112 }
114
115 is >> motlu; // boundaries ou accolade_fermee ou pasbon
116 if (motlu != accolade_fermee)
117 {
118 if (motlu == "boundaries")
119 {
120 boundaries_ = 1;
121 int nb_bords = 0;
122 Nom nom_bord_lu;
123
124 // read boundaries number
125 is >> nb_bords;
126 if (nb_bords != 0)
127 {
128 // read boundaries
129 for (int i = 0; i < nb_bords; i++)
130 {
131 is >> nom_bord_lu;
132 boundaries_list_.add(Nom(nom_bord_lu));
133 // verif nom bords
134 if (!nlistbord_dom.contient(boundaries_list_[i]))
135 {
136 Cerr << "Problem in the dt_impr_nusselt_mean_only instruction:" << finl;
137 Cerr << "The boundary named '" << boundaries_list_[i] << "' is not a boundary of the domain " << dom.le_nom() << "." << finl;
138 exit();
139 }
140 }
141 }
142 // lecture accolade fermee
143 is >> motlu;
144 if (motlu != accolade_fermee)
145 {
146 Cerr << "Problem in the dt_impr_nusselt_mean_only instruction:" << finl;
147 Cerr << "TRUST wants to read a '" << accolade_fermee << "' but find '" << motlu << "'!!" << finl;
148 exit();
149 }
150 }
151 else
152 {
153 Cerr << motlu << " is not a keyword understood by " << que_suis_je() << " in lire_motcle_non_standard" << finl;
154 Cerr << "A specification of kind : dt_impr_nusselt_mean_only { dt_impr periode [boundaries nb_boundaries boundary_name1 boundary_name2 ... ] } was expected." << finl;
155 exit();
156 }
157 }
158 } // fin dt_impr_nusselt_mean_only
159 else
160 retval = -1;
161 return retval;
162}
163
164/*! @brief Associe l'equation passe en parametre au modele de turbulence.
165 *
166 * L'equation est caste en Convection_Diffusion_std.
167 *
168 * @param (Equation_base& eqn) l'equation a laquelle l'objet s'associe
169 */
171{
172 mon_equation_ = ref_cast(Convection_Diffusion_std, eqn);
173}
174
175/*! @brief NE FAIT RIEN
176 *
177 * @param (Domaine_dis_base&) un domaine discretise
178 * @param (Domaine_Cl_dis_base&) un domaine de conditions aux limites discretisees
179 */
184
185/*! @brief Discretise le modele de turbulence.
186 *
187 */
189{
190 Cerr << "Turbulence scalar model discretization" << finl;
191 const Schema_Temps_base& sch = mon_equation_->schema_temps();
192 const Discretisation_base& dis = mon_equation_->discretisation();
193 const Domaine_dis_base& z = mon_equation_->domaine_dis();
194 dis.discretiser_champ("champ_elem", z, "diffusivite_turbulente", "m2/s", 1, sch.temps_courant(), diffusivite_turbulente_);
195 dis.discretiser_champ("champ_elem", z, "conductivite_turbulente", "W/m/K", 1, sch.temps_courant(), conductivite_turbulente_);
197}
198
199/*! @brief Complete le modele de turbulence: met a jour des references de l'objet.
200 *
201 */
205
206/*! @brief A surcharger dans les classes derivees qui possedent une ou des equations Appeler preparer_pas_de_temps sur ces equations.
207 *
208 */
210{
211 return true;
212}
213
214/*! @brief NE FAIT RIEN
215 *
216 * @return (int) renvoie toujours 1
217 */
219{
220 if (loipar_)
221 loipar_->init_lois_paroi();
222 mettre_a_jour(0.);
223 if (nom_fichier_!="")
224 loipar_->imprimer_premiere_ligne_nusselt(boundaries_, boundaries_list_, nom_fichier_);
225 return 1;
226}
227
228/*! @brief for PDI IO: retrieve name, type and dimensions of the fields to save/restore
229 *
230 */
232{
233 std::vector<YAML_data> data;
234 if (loipar_)
235 data = loipar_->data_a_sauvegarder();
236 return data;
237}
238
239/*! @brief NE FAIT RIEN
240 *
241 * @param (Sortie&) un flot de sortie
242 * @return (int) renvoie toujours 1
243 */
245{
246 if (loipar_)
247 return loipar_->sauvegarder(os);
248 else
249 return 0;
250}
251
252/*! @brief Effectue l'ecriture d'une identite si cela est necessaire.
253 *
254 */
256{
257 int afaire, special;
259
260 if (afaire)
261 {
262 Nom mon_ident(que_suis_je());
263 mon_ident += equation().probleme().domaine().le_nom();
264 double temps = equation().inconnue().temps();
265 mon_ident += Nom(temps, "%e");
266 os << mon_ident << finl;
267 os << que_suis_je() << finl;
268 os.flush();
269 }
270}
271
272/*! @brief NE FAIT RIEN
273 *
274 * @param (Entree&) un flot d'entree
275 * @return (int) renvoie toujours 1
276 */
278{
279
280 if (loipar_)
281 loipar_->reprendre(is);
282 return 1;
283}
284
286{
287 if (loipar_)
288 loipar_->creer_champ(motlu);
289}
290
291bool Modele_turbulence_scal_base::has_champ(const Motcle& nom, OBS_PTR(Champ_base)& ref_champ) const
292{
293 if (champs_compris_.has_champ(nom, ref_champ))
294 return true;
295
296 if (loipar_)
297 if (loipar_->has_champ(nom, ref_champ))
298 return true;
299
300 return false; /* rien trouve */
301}
302
304{
305 if (champs_compris_.has_champ(nom))
306 return true;
307
308 if (loipar_)
309 if (loipar_->has_champ(nom))
310 return true;
311
312 return false; /* rien trouve */
313}
314
316{
317 OBS_PTR(Champ_base) ref_champ;
318
319 if (champs_compris_.has_champ(nom, ref_champ))
320 return ref_champ;
321
322 if (loipar_)
323 if (loipar_->has_champ(nom, ref_champ))
324 return ref_champ;
325
326 throw std::runtime_error(std::string("Field ") + nom.getString() + std::string(" not found !"));
327}
328
330{
331 if (opt == DESCRIPTION)
332 Cerr << que_suis_je() << " : " << champs_compris_.liste_noms_compris() << finl;
333 else
334 nom.add(champs_compris_.liste_noms_compris());
335
336 if (loipar_)
337 loipar_->get_noms_champs_postraitables(nom, opt);
338}
339
340/*! @brief Indique s'il faut imprimer ou non le Nusselt local
341 *
342 * @param (double temps_courant, double dt) un flot d'entree
343 * @return (int) renvoie 1 si on imprime, 0 sinon
344 */
345int Modele_turbulence_scal_base::limpr_nusselt(double temps_courant, double temps_prec, double dt, double dt_nusselt) const
346{
347 const Schema_Temps_base& sch = mon_equation_->schema_temps();
348 if (sch.nb_pas_dt() == 0)
349 return 0;
350 if (dt_nusselt <= dt
351 || ((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())
352 && dt_nusselt != DMAXFLOAT))
353 return 1;
354 else
355 {
356 // Voir Schema_Temps_base::limpr pour information sur epsilon et modf
357 double i, j, epsilon = 1.e-8;
358 modf(temps_courant / dt_nusselt + epsilon, &i);
359 modf(temps_prec / dt_nusselt + epsilon, &j);
360 return (i > j);
361 }
362}
363
364/*! @brief Effectue l'impression si cela est necessaire.
365 *
366 * @return renvoie toujours 1
367 */
369{
370 const Schema_Temps_base& sch = mon_equation_->schema_temps();
371 double temps_courant = sch.temps_courant();
372 double dt = sch.pas_de_temps();
373 if (limpr_nusselt(temps_courant, sch.temps_precedent(), dt, dt_impr_nusselt_))
374 loipar_->imprimer_nusselt(os);
375 if (limpr_nusselt(temps_courant, sch.temps_precedent(), dt, dt_impr_nusselt_mean_only_))
376 loipar_->imprimer_nusselt_mean_only(os, boundaries_, boundaries_list_, nom_fichier_);
377}
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
classe Convection_Diffusion_std Cette classe est la base des equations modelisant le transport
const Champ_Inc_base & inconnue() const override=0
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
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
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.
static int is_ecriture_special(int &special, int &a_faire)
indique si le format special a ete demande en lecture active par sauvegarde xyz .
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
Probleme_base & probleme()
Renvoie le probleme 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).
Classe Modele_turbulence_scal_base Cette classe represente un modele de turbulence pour une equation ...
OBS_PTR(Convection_Diffusion_std) mon_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.
virtual void mettre_a_jour(double)=0
virtual void completer()
Complete le modele de turbulence: met a jour des references de l'objet.
Convection_Diffusion_std & equation()
const Champ_base & get_champ(const Motcle &nom) const override
void associer_eqn(const Equation_base &)
Associe l'equation passe en parametre au modele de turbulence.
virtual bool initTimeStep(double dt)
A surcharger dans les classes derivees qui possedent une ou des equations Appeler preparer_pas_de_tem...
virtual void imprimer(Sortie &) const
Effectue l'impression si cela est necessaire.
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
int reprendre(Entree &) override
NE FAIT RIEN.
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
virtual void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &)
NE FAIT RIEN.
void creer_champ(const Motcle &motlu) override
int sauvegarder(Sortie &) const override
NE FAIT RIEN.
LIST(Nom) boundaries_list_
int limpr_nusselt(double, double, double, double) const
Indique s'il faut imprimer ou non le Nusselt local.
virtual void set_param(Param &) const override
virtual std::vector< YAML_data > data_a_sauvegarder() const
for PDI IO: retrieve name, type and dimensions of the fields to save/restore
virtual int preparer_calcul()
NE FAIT RIEN.
virtual void discretiser()
Discretise le modele de turbulence.
void a_faire(Sortie &) const
Effectue l'ecriture d'une identite si cela est necessaire.
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
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
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
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
const Domaine & domaine() const
Renvoie le domaine associe au probleme.
virtual const Equation_base & equation(int) const =0
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
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
const Objet_U & valeur() const
Definition TRUST_Ref.h:134
static void typer_lire_turbulence_paroi_scal(OWN_PTR(Turbulence_paroi_scal_base)&, const Modele_turbulence_scal_base &, Entree &)
Lit les caracteristques de la loi de parois a partir d'un flot d'entree.