TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Turbulence_paroi_scal_base.cpp
1/****************************************************************************
2* Copyright (c) 2025, 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 <Turbulence_paroi_scal_base.h>
19#include <Convection_Diffusion_std.h>
20#include <Discretisation_base.h>
21#include <Schema_Temps_base.h>
22#include <Champ_Uniforme.h>
23#include <Probleme_base.h>
24#include <EcrFicPartage.h>
25#include <Domaine_VF.h>
26#include <SFichier.h>
27#include <Dirichlet_paroi_defilante.h>
28#include <Dirichlet_paroi_fixe.h>
29
30Implemente_base_sans_constructeur(Turbulence_paroi_scal_base, "Turbulence_paroi_scal_base", Objet_U);
31
33{
34 return s << que_suis_je() << " " << le_nom();
35}
36
38{
39 return is;
40}
41
45
46/*! @brief Lit les caracteristques de la loi de parois a partir d'un flot d'entree.
47 *
48 * Format: type_de_loi_de_paroi
49 * Les valeurs possibles du type de loi de paroi sont:
50 * - "loi_standard_hydr"
51 * - "negligeable"
52 * - "loi_VanDriest"
53 * - "loi_standard_hydr_scalaire"
54 *
55 */
57{
58 Cerr << "Lecture du type de loi de parois " << finl;
59 Motcle typ;
60 s >> typ;
61
62 const Equation_base& eqn = mod_turb_scal.equation().probleme().equation(0); // equation hydraulique
63 const RefObjU& modele_turbulence = eqn.get_modele(TURBULENCE);
64 const Modele_turbulence_hyd_base& mod_turb_hydr = ref_cast(Modele_turbulence_hyd_base, modele_turbulence.valeur());
65 const Turbulence_paroi_base& loi = mod_turb_hydr.loi_paroi();
66
67 if (typ != "negligeable_scalaire")
68 if ((loi.que_suis_je() == "negligeable_VDF") || (loi.que_suis_je() == "negligeable_VEF"))
69 {
70 Cerr << "La loi de paroi de type " << typ << " choisie pour le scalaire n'est pas compatible avec" << finl;
71 Cerr << "la loi de type " << loi.que_suis_je() << " choisie pour l'hydraulique" << finl;
72 Cerr << "Utiliser le type 'negligeable_scalaire' pour le scalaire ou utiliser une loi de paroi" << finl;
73 Cerr << "non negligeable pour l hydraulique" << finl;
74 exit();
75 }
76 typ += "_";
77
78 Nom discr = eqn.discretisation().que_suis_je();
79
80 // les operateurs de diffusion sont communs aux discretisations VEF et VEFP1B
81 if (discr == "VEFPreP1B")
82 discr = "VEF";
83 typ += discr;
84
85 if (typ == "loi_analytique_scalaire_VDF")
86 {
87 Cerr << "La loi de paroi scalaire de type loi_analytique_scalaire" << finl;
88 Cerr << "n est utilisable qu avec une discretisation de type VEF" << finl;
89 exit();
90 }
91
92 Cerr << "et typage : " << typ << finl;
93 turb_par.typer(typ);
94 turb_par->associer_modele(mod_turb_scal);
95 turb_par->associer(eqn.domaine_dis(), eqn.domaine_Cl_dis());
96}
97
99{
100 return champs_compris_.get_champ(nom);
101}
102
103bool Turbulence_paroi_scal_base::has_champ(const Motcle& nom, OBS_PTR(Champ_base)& ref_champ) const
104{
105 return champs_compris_.has_champ(nom, ref_champ);
106}
108{
109 return champs_compris_.has_champ(nom);
110}
111
113{
114 if (opt == DESCRIPTION)
115 Cerr << "Turbulence_paroi_scal_base : " << champs_compris_.liste_noms_compris() << finl;
116 else
117 nom.add(champs_compris_.liste_noms_compris());
118
119}
120/*! @brief Ouverture/creation d'un fichier d'impression de Face, d_eq, Nu local, h
121 *
122 */
124{
125 const Probleme_base& pb = mon_modele_turb_scal->equation().probleme();
126 const Schema_Temps_base& sch = pb.schema_temps();
127
128 Nom fichier = Objet_U::nom_du_cas() + "_" + pb.le_nom() + "_" + extension + ".face";
129
130 // On cree le fichier au premier pas de temps si il n'y a pas reprise
131 if (nb_impr_ == 0 && !pb.reprise_effectuee())
132 Nusselt.ouvrir(fichier);
133 else // Sinon on l'ouvre
134 Nusselt.ouvrir(fichier, ios::app);
135
136 if (je_suis_maitre())
137 {
138 EcrFicPartage& fic = Nusselt;
139 fic << "Temps : " << sch.temps_courant();
140 }
141 nb_impr_++;
142}
143
144/*! @brief Ouverture/creation d'un fichier d'impression de moyennes
145 *
146 */
147void Turbulence_paroi_scal_base::ouvrir_fichier_partage(EcrFicPartage& fichier, const Nom& nom_fichier, const Nom& extension) const
148{
149 const Probleme_base& pb = mon_modele_turb_scal->equation().probleme();
150 Nom nom_fic = nom_fichier + "." + extension;
151
152 // On cree le fichier nom_fichier au premier pas de temps si il n'y a pas reprise
153 if (nb_impr0_ == 0 && !pb.reprise_effectuee())
154 {
155 fichier.ouvrir(nom_fic);
156 }
157 // Sinon on l'ouvre
158 else
159 {
160 fichier.ouvrir(nom_fic, ios::app);
161 }
162 nb_impr0_++;
163}
164
165/*! @brief Give a boolean indicating if we need to use equivant distance by default we consider that we use the equivalent distance
166 *
167 * @return (boolean)
168 */
170{
171 return true;
172}
173
174/**
175 * @brief Writes header line for Nusselt number and heat transfer statistics file
176 *
177 * @param boundaries_ Flag to control boundary selection (0: all boundaries, 1: specified boundaries)
178 * @param boundaries_list List of boundary names to process
179 * @param nom_fichier_ Output filename
180 *
181 * @details Creates header line with column names for thermal statistics including:
182 * - Characteristic distance (m)
183 * - Local Nusselt number
184 * - Convective heat transfer coefficient (W/m²/K)
185 * - Near-wall fluid temperature (K)
186 * - Boundary face temperature (K)
187 * - Equivalent wall temperature (K)
188 *
189 * Format: "Time Mean(field1) Mean(field2) ... [boundary1(field1) boundary1(field2) ...]"
190 * Writes warning messages if specified boundaries are not valid wall types.
191 */
192void Turbulence_paroi_scal_base::imprimer_premiere_ligne_nusselt(int boundaries_, const LIST(Nom) &boundaries_list, const Nom& nom_fichier_) const
193{
194 EcrFicPartage fichier;
195 ouvrir_fichier_partage(fichier, nom_fichier_, "out");
196 Nom ligne="", err;
197 err = "";
198 Noms fields(nb_fields_);
199 fields[0] = "dist. carac. (m)";
200 fields[1] = "Nusselt (local)";
201 fields[2] = "h (Conv. W/m2/K)";
202 fields[3] = "Tf cote paroi (K)";
203 fields[4] = "T face de bord (K)";
204 fields[5] = "Tparoi equiv.(K)";
205 for (int i=0; i<nb_fields_; i++)
206 {
207 ligne+="# ";
208 ligne+="field";
209 ligne += (Nom)i;
210 ligne += " : ";
211 ligne += fields[i];
212 ligne += "\n";
213 }
214 ligne += "# Time ";
215 for (int i=0; i<nb_fields_; i++)
216 {
217 ligne += " \tMean(";
218 //ligne += fields[i];
219 ligne += "field";
220 ligne += (Nom)i;
221 ligne += ")";
222 }
223 for (int n_bord = 0; n_bord < le_dom_dis_->nb_front_Cl(); n_bord++)
224 {
225 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
226 const Nom& nom_bord = la_cl->frontiere_dis().le_nom();
227 if (je_suis_maitre() && (boundaries_list.contient(nom_bord) || boundaries_list.size() == 0))
228 {
229 if (sub_type(Dirichlet_paroi_fixe,la_cl.valeur()) || sub_type(Dirichlet_paroi_defilante, la_cl.valeur()))
230 {
231 for (int i=0; i<nb_fields_; i++)
232 {
233 ligne += " \t";
234 ligne += nom_bord;
235 ligne += "(";
236 //ligne += fields[i];
237 ligne += "field";
238 ligne += (Nom)i;
239 ligne += ")";
240 }
241 }
242 else if (boundaries_list.size() > 0)
243 {
244 err += "The boundary named '";
245 err += nom_bord;
246 err += "' is not of type Dirichlet_paroi_fixe or Dirichlet_paroi_defilante.\n";
247 err += "So TRUST will not write Nusselt mean values.\n\n";
248 }
249 }
250 }
251 if (je_suis_maitre())
252 {
253 fichier << err;
254 fichier << ligne;
255 fichier << finl;
256 }
257 fichier.syncfile();
258}
259
260/**
261 * @brief Prints mean Nusselt number and heat transfer statistics to a file for specified boundaries
262 *
263 * @param os Output stream for messages
264 * @param boundaries_ Flag to control boundary selection (0: all boundaries, 1: specified boundaries)
265 * @param boundaries_list List of boundary names to process when boundaries_=1
266 * @param nom_fichier_ Output filename
267 * @details Calculates and writes average values for multiple thermal parameters:
268 * - Characteristic distance
269 * - Nusselt number
270 * - Heat transfer coefficient
271 * - Near-wall temperatures
272 * - Wall temperatures
273 *
274 * Results are written for all boundaries combined and then for each boundary separately.
275 * Only processes fixed walls (Dirichlet_paroi_fixe) and moving walls (Dirichlet_paroi_defilante).
276 * Output format: time [mean_values] [boundary1_values] [boundary2_values] ...
277 */
278void Turbulence_paroi_scal_base::imprimer_nusselt_mean_only(Sortie& os, int boundaries_, const LIST(Nom) &boundaries_list, const Nom& nom_fichier_) const
279{
281 const Probleme_base& pb = mon_modele_turb_scal->equation().probleme();
282 const Schema_Temps_base& sch = pb.schema_temps();
283 int ndeb, nfin, size0, num_bord;
284 num_bord = 0;
285
286 if (boundaries_list.size() != 0)
287 {
288 size0 = boundaries_list.size();
289 }
290 else
291 {
292 size0 = le_dom_dis_->nb_front_Cl();
293 }
294 DoubleTrav moy_bords(size0 + 1, nb_fields_+1);
295 moy_bords = 0.;
296
297 EcrFicPartage fichier;
298 ouvrir_fichier_partage(fichier, nom_fichier_, "out");
299
300 for (int n_bord = 0; n_bord < le_dom_dis_->nb_front_Cl(); n_bord++)
301 {
302 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
303 if ((sub_type(Dirichlet_paroi_fixe, la_cl.valeur())) || (sub_type(Dirichlet_paroi_defilante, la_cl.valeur())))
304 {
305 const Front_VF& le_bord = ref_cast(Front_VF, la_cl->frontiere_dis());
306 ndeb = le_bord.num_premiere_face();
307 nfin = ndeb + le_bord.nb_faces();
308 if (boundaries_ == 0 || (boundaries_ == 1 && boundaries_list.contient(le_bord.le_nom())))
309 {
310 for (int num_face = ndeb; num_face < nfin; num_face++)
311 {
312 // surface-averaged values:
313 double aire = le_dom_dis_->face_surfaces(num_face);
314 for (int i=0; i<nb_fields_; i++)
315 {
316 moy_bords(0, i) += aire * tab_(num_face, i);
317 moy_bords(num_bord + 1, i) += aire * tab_(num_face, i);
318 }
319 moy_bords(0, nb_fields_) += aire;
320 moy_bords(num_bord + 1, nb_fields_) += aire;
321 }
322 num_bord += 1;
323 }
324 }
325 }
326 mp_sum_for_each_item(moy_bords);
327
328// affichages des lignes dans le fichier
329 if (je_suis_maitre())
330 {
331 fichier << sch.temps_courant();
332 if (moy_bords(0, nb_fields_) != 0)
333 for (int i=0; i<nb_fields_; i++)
334 fichier << " \t" << moy_bords(0, i) / moy_bords(0, nb_fields_);
335 }
336
337 num_bord = 0;
338 for (int n_bord = 0; n_bord < le_dom_dis_->nb_front_Cl(); n_bord++)
339 {
340 const Cond_lim& la_cl = le_dom_Cl_dis_->les_conditions_limites(n_bord);
341 if ((sub_type(Dirichlet_paroi_fixe, la_cl.valeur())) || (sub_type(Dirichlet_paroi_defilante, la_cl.valeur())))
342 {
343 const Front_VF& le_bord = ref_cast(Front_VF, la_cl->frontiere_dis());
344 if (boundaries_ == 0 || (boundaries_ == 1 && boundaries_list.contient(le_bord.le_nom())))
345 {
346 if (je_suis_maitre())
347 {
348 for (int i=0; i<nb_fields_; i++)
349 fichier << " \t" << moy_bords(num_bord + 1, i) / moy_bords(num_bord + 1, nb_fields_);
350 }
351 num_bord += 1;
352 }
353 }
354 }
355
356 if (je_suis_maitre())
357 fichier << finl;
358 fichier.syncfile();
359}
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
bool has_champ(const Motcle &nom, OBS_PTR(FIELD_TYPE)&ref_champ) const
classe Cond_lim Classe generique servant a representer n'importe quelle classe
Definition Cond_lim.h:31
classe Dirichlet_paroi_defilante Impose la vitesse de paroi dnas une equation de type Navier_Stokes.
classe Dirichlet_paroi_fixe Represente une paroi immobile dans une equation de type Navier_Stokes.
int ouvrir(const char *name, IOS_OPEN_MODE mode=ios::out) override
Ouvre le fichier avec les parametres mode et prot donnes Ces parametres sont les parametres de la met...
Sortie & syncfile() override
Provoque l'ecriture sur disque des donnees accumulees sur les differents processeurs depuis le dernie...
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
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
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.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
class Front_VF
Definition Front_VF.h:36
int nb_faces() const
Definition Front_VF.h:53
int num_premiere_face() const
Definition Front_VF.h:63
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
Classe Modele_turbulence_hyd_base Cette classe sert de base a la hierarchie des classes.
const Turbulence_paroi_base & loi_paroi() const
Classe Modele_turbulence_scal_base Cette classe represente un modele de turbulence pour une equation ...
Convection_Diffusion_std & equation()
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
bool contient(const Nom &nom) const
Definition Nom.h:86
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
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
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
bool & reprise_effectuee()
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
virtual const Equation_base & equation(int) const =0
static void mp_sum_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
Definition Process.cpp:193
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.
Classe de base des flux de sortie.
Definition Sortie.h:52
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.
Classe Turbulence_paroi_scal_base Classe de base pour la hierarchie des classes representant les mode...
virtual bool use_equivalent_distance() const
Give a boolean indicating if we need to use equivant distance by default we consider that we use the ...
void imprimer_premiere_ligne_nusselt(int, const LIST(Nom)&, const Nom &) const
Writes header line for Nusselt number and heat transfer statistics file.
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.
void creer_champ(const Motcle &motlu) override
const Champ_base & get_champ(const Motcle &nom) const override
void imprimer_nusselt_mean_only(Sortie &, int, const LIST(Nom)&, const Nom &) const
Prints mean Nusselt number and heat transfer statistics to a file for specified boundaries.
void associer_modele(const Modele_turbulence_scal_base &)
Associe un modele de turbulence a l'objet.
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
virtual void compute_nusselt() const =0
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 &)=0
void ouvrir_fichier_partage(EcrFicPartage &, const Nom &) const
Ouverture/creation d'un fichier d'impression de Face, d_eq, Nu local, h.