TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Navier_Stokes_IBM_Turbulent.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 <Navier_Stokes_IBM_Turbulent.h>
17#include <Modele_turbulence_hyd_base.h>
18#include <Op_Diff_Turbulent_base.h>
19#include <Fluide_Incompressible.h>
20#include <Discretisation_base.h>
21#include <Schema_Temps_base.h>
22#include <Champ_Uniforme.h>
23#include <Probleme_base.h>
24#include <Discret_Thyd.h>
25#include <TRUST_2_PDI.h>
26#include <Domaine.h>
27#include <Avanc.h>
28#include <Param.h>
29
30Implemente_instanciable(Navier_Stokes_IBM_Turbulent, "Navier_Stokes_IBM_Turbulent", Navier_Stokes_IBM);
31// XD navier_stokes_ibm_turbulent navier_stokes_standard navier_stokes_ibm_turbulent INHERITS_BRACE IBM Navier-Stokes
32// XD_CONT equations as well as the associated turbulence model equations.
33// XD attr modele_turbulence modele_turbulence_hyd_deriv modele_turbulence OPT Turbulence model for Navier-Stokes
34// XD_CONT equations.
35
37
39
41{
43 param.ajouter_non_std("modele_turbulence", (this), Param::REQUIRED);
44}
45
47{
48 if (mot == "diffusion")
49 {
50 Cerr << "Reading and typing of the diffusion operator : ";
51 terme_diffusif.associer_diffusivite(diffusivite_pour_transport());
53 terme_diffusif.associer_diffusivite_pour_pas_de_temps(diffusivite_pour_pas_de_temps());
54 return 1;
55 }
56 else if (mot == "modele_turbulence")
57 return typer_lire_mod_turb_hyd(is);
58 else
60}
61
62int Navier_Stokes_IBM_Turbulent::typer_lire_mod_turb_hyd(Entree& s)
63{
64 Cerr << "Reading and typing of the turbulence model : ";
65
66 Motcle typ;
67 s >> typ;
68 Motcle nom1("Modele_turbulence_hyd_");
69 nom1 += typ;
70 Nom discr = discretisation().que_suis_je();
71
72 if (typ.debute_par("SOUS_MAILLE") || discr == "VDF_Hyper" || typ.debute_par("LONGUEUR_MELANGE") || (typ == "K_Epsilon_V2"))
73 {
74 if (dimension == 2 && discr != "VDF_Hyper")
75 {
76 Cerr << "Vous traitez un cas turbulent en dimension 2 avec un modele sous maille" << finl;
77 Cerr << "Attention a l'interpretation des resultats !!" << finl;
78 }
79
80 nom1 += "_";
81 // les operateurs de diffusion sont communs aux discretisations VEF et VEFP1B
82 if (discr == "VEFPreP1B") discr = "VEF";
83 nom1 += discr;
84 }
85 if (nom1 == "MODELE_TURBULENCE_HYD_SOUS_MAILLE_LM_VEF")
86 {
87 Cerr << "Le mot cle Sous_maille_LM s'appelle desormais Longueur_Melange pour etre coherent en VDF et VEF." << finl;
88 Cerr << "Changer votre jeu de donnees." << finl;
90 }
91
92 Cerr << nom1 << finl;
93
94 le_modele_turbulence.typer(nom1);
95 le_modele_turbulence->associer_eqn(*this);
96 le_modele_turbulence->associer(domaine_dis(), domaine_Cl_dis());
97 s >> le_modele_turbulence.valeur(); // on lit !
98
99 le_modele_turbulence->discretiser();
100 RefObjU le_modele;
101 le_modele = le_modele_turbulence.valeur();
102 liste_modeles_.add_if_not(le_modele);
103
104 return 1;
105}
106
111
116
117// Lecture et typage de l'operateur diffusion turbulente.
118// Attention : il faut avoir fait "terme_diffusif.associer_diffusivite" avant d'enter ici.
120{
121 Motcle accouverte = "{", accfermee = "}";
122 Nom type = "Op_Dift_";
123
124 Nom discr = discretisation().que_suis_je();
125 // les operateurs de diffusion sont communs aux discretisations VEF et VEFP1B
126 if (discr == "VEFPreP1B") discr = "VEF";
127
128 type += discr;
129
130 Nom nb_inc;
131 if (terme_diffusif.diffusivite().nb_comp() == 1)
132 nb_inc = "_";
133 else
134 nb_inc = "_Multi_inco_";
135 type += nb_inc;
136
137 Nom type_inco = inconnue().que_suis_je();
138 if (type_inco == "Champ_Q1_EF") type += "Q1";
139 else type += (type_inco.suffix("Champ_"));
140
141 if (axi) type += "_Axi";
142
143 Motcle motbidon;
144 is >> motbidon;
145 if (motbidon != accouverte)
146 {
147 Cerr << "A { was expected while reading the turbulent diffusive term" << finl;
149 }
150 is >> motbidon;
151 if (motbidon == "negligeable")
152 {
153 type = "Op_Dift_negligeable";
154 terme_diffusif.typer(type);
155 terme_diffusif.l_op_base().associer_eqn(*this);
156 terme_diffusif->associer_diffusivite(terme_diffusif.diffusivite());
157 is >> motbidon;
158 //on lit la fin de diffusion { }
159 if (motbidon != accfermee)
160 Cerr << " On ne peut plus entrer d option apres negligeable " << finl;
161 }
162 else if (motbidon == "tenseur_Reynolds_externe")
163 {
164 terme_diffusif.typer(type);
165 terme_diffusif.l_op_base().associer_eqn(*this);
166 Cerr << terme_diffusif->que_suis_je() << finl;
167 terme_diffusif->associer_diffusivite(terme_diffusif.diffusivite());
168 is >> motbidon;
169 //on lit la fin de diffusion { }
170 if (motbidon != accfermee)
171 Cerr << " On ne peut plus entrer d option apres tenseur_Reynolds_externe " << finl;
172 }
173 else if (motbidon == "standard")
174 {
175 type += "_standard";
176 terme_diffusif.typer(type);
177 terme_diffusif.l_op_base().associer_eqn(*this);
178 terme_diffusif->associer_diffusivite(terme_diffusif.diffusivite());
179 is >> terme_diffusif.valeur();
180 }
181 else if (motbidon == accfermee)
182 {
183 terme_diffusif.typer(type);
184 terme_diffusif.l_op_base().associer_eqn(*this);
185 Cerr << terme_diffusif->que_suis_je() << finl;
186 terme_diffusif->associer_diffusivite(terme_diffusif.diffusivite());
187 }
188 else if (motbidon == "stab")
189 {
190 type += "_stab";
191 terme_diffusif.typer(type);
192 terme_diffusif.l_op_base().associer_eqn(*this);
193 terme_diffusif->associer_diffusivite(terme_diffusif.diffusivite());
194 is >> terme_diffusif.valeur();
195 }
196 else if (motbidon == "option")
197 {
198 type += "option";
199 if (discr == "EF")
200 type = "Op_Dift_EF_Q1_option";
201 terme_diffusif.typer(type);
202 Cerr << terme_diffusif->que_suis_je() << finl;
203 terme_diffusif.l_op_base().associer_eqn(*this);
204 terme_diffusif->associer_diffusivite(terme_diffusif.diffusivite());
205 is >> terme_diffusif.valeur();
206 is >> motbidon;
207 //on lit la fin de diffusion { }
208 if (motbidon != accfermee)
209 Cerr << " On ne peut plus entrer d option apres option " << finl;
210 }
211 else
212 {
213 type += motbidon;
214 is >> motbidon;
215 if (motbidon != accfermee)
216 Cerr << " No option are now readable for the turbulent diffusive term" << finl;
217
218 if (discr == "VEF")
219 type += "_P1NC";
220 terme_diffusif.typer(type);
221 terme_diffusif.l_op_base().associer_eqn(*this);
222 Cerr << terme_diffusif->que_suis_je() << finl;
223 terme_diffusif->associer_diffusivite(terme_diffusif.diffusivite());
224 }
225 return is;
226}
227
228/*! @brief Prepare le calcul.
229 *
230 * Simple appe a Modele_turbulence_hyd_base->preparer_caclul() sur
231 * le membre reprresentant la turbulence.
232 *
233 * @return (int) renvoie toujours 1
234 */
236{
237
238 Turbulence_paroi_base& loipar = le_modele_turbulence->loi_paroi();
239 if (le_modele_turbulence->has_loi_paroi_hyd())
240 loipar.init_lois_paroi();
241
243 le_modele_turbulence->preparer_calcul();
244 return 1;
245}
246
248{
250 ok = ok && le_modele_turbulence->initTimeStep(dt);
251 return ok;
252}
253
254/*! @brief for PDI IO: retrieve name, type and dimensions of the fields to save/restore
255 *
256 */
258{
259 std::vector<YAML_data> data = Navier_Stokes_IBM::data_a_sauvegarder();
260 std::vector<YAML_data> mod_turb = le_modele_turbulence->data_a_sauvegarder();
261 data.insert(data.end(), mod_turb.begin(), mod_turb.end());
262 return data;
263}
264
265/*! @brief Sauvegarde l'equation (et son modele de turbulence) sur un flot de sortie.
266 *
267 * @param (Sortie& os) un flot de sortie
268 * @return (int) renvoie toujours 1
269 */
271{
272 int bytes = 0;
274 assert(bytes % 4 == 0);
275 bytes += le_modele_turbulence->sauvegarder(os);
276 assert(bytes % 4 == 0);
277 return bytes;
278}
279
280/*! @brief Reprise de l'equation et de son modele de turbulence a partir d'un flot d'entree.
281 *
282 * @param (Entree& is) un flot d'entree
283 * @return (int) renvoie toujours 1
284 * @throws fin de fichier rencontre pendant la reprise
285 */
287{
290 {
291 double temps = schema_temps().temps_courant();
292 Nom ident_modele(le_modele_turbulence->que_suis_je());
293 ident_modele += probleme().domaine().le_nom();
294 ident_modele += Nom(temps, probleme().reprise_format_temps());
295
296 if (probleme().discretisation().is_poly_family())
297 {
298 Nom field_tag_syno = create_polymacfamily_syno(ident_modele);
299 avancer_fichier_with_syno(is,ident_modele,field_tag_syno);
300 }
301 // end of the backward compatibility
302 else
303 avancer_fichier(is,ident_modele);
304 }
305 le_modele_turbulence->reprendre(is);
306
307 return 1;
308}
309
310/*! @brief Appels successifs a: Navier_Stokes_IBM::completer()
311 *
312 * Mod_Turb_Hyd::completer() [sur le membre concerne]
313 *
314 */
316{
318 le_modele_turbulence->completer();
319 le_modele_turbulence->loi_paroi().completer();
320}
321
322/*! @brief Effecttue une mise a jour en temps de l'equation.
323 *
324 * @param (double temps) le temps de mise a jour
325 */
327{
329 le_modele_turbulence->mettre_a_jour(temps);
330}
331
332bool Navier_Stokes_IBM_Turbulent::has_champ(const Motcle& nom, OBS_PTR(Champ_base)& ref_champ) const
333{
334 if (Navier_Stokes_IBM::has_champ(nom, ref_champ))
335 return true;
336
337 if (le_modele_turbulence)
338 if (le_modele_turbulence->has_champ(nom, ref_champ))
339 return true;
340
341 return false; /* rien trouve */
342}
343
345{
347 return true;
348
349 if (le_modele_turbulence)
350 if (le_modele_turbulence->has_champ(nom))
351 return true;
352
353 return false; /* rien trouve */
354}
355
357{
358 OBS_PTR(Champ_base) ref_champ;
359
360 if (Navier_Stokes_IBM::has_champ(nom, ref_champ))
361 return ref_champ;
362
363 if (le_modele_turbulence)
364 if (le_modele_turbulence->has_champ(nom, ref_champ))
365 return ref_champ;
366
367 throw std::runtime_error(std::string("Field ") + nom.getString() + std::string(" not found !"));
368}
369
371{
373 if (le_modele_turbulence)
374 le_modele_turbulence->get_noms_champs_postraitables(nom, opt);
375}
376
378{
380 le_modele_turbulence->imprimer(os);
381}
382
383const RefObjU& Navier_Stokes_IBM_Turbulent::get_modele(Type_modele type) const
384{
385 for (const auto &itr : liste_modeles_)
386 {
387 const RefObjU& mod = itr;
388 if (mod)
389 if ((sub_type(Modele_turbulence_hyd_base, mod.valeur())) && (type == TURBULENCE))
390 return mod;
391 }
392 return Equation_base::get_modele(type);
393}
394
396{
398
399 if (le_modele_turbulence) le_modele_turbulence->creer_champ(motlu);
400}
401
406
classe Champ_Don_base classe de base des Champs donnes (non calcules)
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
virtual void creer_champ(const Motcle &motlu)=0
virtual void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const =0
virtual bool has_champ(const Motcle &nom, OBS_PTR(Champ_base)&ref_champ) const =0
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
OBS_PTR(Equation_base) eq_IBM_
int reprendre(Entree &) override
On reprend l'inconnue a partir d'un flot d'entree.
virtual const RefObjU & get_modele(Type_modele type) const
virtual std::vector< YAML_data > data_a_sauvegarder() const
for PDI IO: retrieve name, type and dimensions of the data to save/restore. This has to be overrode f...
virtual void imprimer(Sortie &os) const
Imprime les operateurs de l'equation si le schema en temps indique que c'est necessaire.
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
Nom create_polymacfamily_syno(const Nom &field_tag) const
Create a synonym of a field name in order to ensure backward compatibility with old names of the Poly...
virtual void mettre_a_jour(double temps)
La valeur de l'inconnue sur le pas de temps a ete calculee.
virtual void completer()
Complete la construction (initialisation) des objets associes a l'equation.
virtual void imprime_residu(SFichier &)
int sauvegarder(Sortie &) const override
On sauvegarde l'inconnue, puis les sources sur un flot de sortie.
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Probleme_base & probleme()
Renvoie le probleme associe a l'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.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
virtual Nom expression_residu()
const Champ_Don_base & viscosite_cinematique() const
Definition Fluide_base.h:58
Classe Modele_turbulence_hyd_base Cette classe sert de base a la hierarchie des classes.
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
int debute_par(const char *const n) const override
Definition Motcle.cpp:309
classe Navier_Stokes_IBM_Turbulent Cette classe represente l'equation de la dynamique pour un fluide
const RefObjU & get_modele(Type_modele type) const override
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
const Champ_base & diffusivite_pour_pas_de_temps() const override
int sauvegarder(Sortie &) const override
Sauvegarde l'equation (et son modele de turbulence) sur un flot de sortie.
void mettre_a_jour(double) override
Effecttue une mise a jour en temps de l'equation.
void completer() override
Appels successifs a: Navier_Stokes_IBM::completer().
std::vector< YAML_data > data_a_sauvegarder() const override
for PDI IO: retrieve name, type and dimensions of the fields to save/restore
const Champ_base & get_champ(const Motcle &nom) const override
void creer_champ(const Motcle &motlu) override
void set_param(Param &titi) const override
int preparer_calcul() override
Prepare le calcul.
void imprimer(Sortie &) const override
Imprime les operateurs de l'equation si le schema en temps indique que c'est necessaire.
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
bool initTimeStep(double dt) override
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
const Champ_Don_base & diffusivite_pour_transport() const override
int reprendre(Entree &) override
Reprise de l'equation et de son modele de turbulence a partir d'un flot d'entree.
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.
bool initTimeStep(double dt) override
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
void set_param(Param &titi) const override
int preparer_calcul() override
Tout ce qui ne depend pas des autres problemes eventuels.
Operateur_Diff terme_diffusif
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
const Fluide_base & fluide() const
Renvoie le fluide incompressible (milieu physique de l'equation) associe a l'equation.
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
Nom & suffix(const char *const)
Extraction de suffixe : Nom x("azerty");.
Definition Nom.cpp:271
const std::string & getString() const
Definition Nom.h:92
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
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
static int axi
Definition Objet_U.h:101
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
@ REQUIRED
Definition Param.h:115
void ajouter_non_std(const char *keyword, const Objet_U *value, Param::Nature nat=Param::OPTIONAL)
Register a keyword handled by Objet_U::lire_motcle_non_standard.
Definition Param.cpp:489
const Domaine & domaine() const
Renvoie le domaine associe au probleme.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
Definition SFichier.h:27
double temps_courant() const
Renvoie le temps courant.
Classe de base des flux de sortie.
Definition Sortie.h:52
static int is_PDI_restart()
const Objet_U & valeur() const
Definition TRUST_Ref.h:134
Classe Turbulence_paroi_base Classe de base pour la hierarchie des classes representant les modeles.
virtual int init_lois_paroi()=0