TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Modele_turbulence_hyd_0_eq_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_0_eq_base.h>
17#include <Modifier_pour_fluide_dilatable.h>
18#include <Domaine_Cl_dis_base.h>
19#include <Discretisation_base.h>
20#include <Schema_Temps_base.h>
21#include <Equation_base.h>
22#include <Probleme_base.h>
23#include <Ecrire_MED.h>
24#include <Domaine.h>
25#include <Motcle.h>
26#include <Param.h>
27#include <Perf_counters.h>
28
29// XD Modele_turbulence_hyd_0_eq_base modele_turbulence_hyd_deriv Modele_turbulence_hyd_0_eq_base BRACE Turbulence model
30// XD_CONT constructed using several fields.
31
32Implemente_base(Modele_turbulence_hyd_0_eq_base, "Modele_turbulence_hyd_0_eq_base", Modele_turbulence_hyd_base);
33
35
37
39{
41 param.ajouter("fichier_ecriture_K_eps", &fichier_K_eps_sortie_);
42}
43
45{
47 discretiser_K(mon_equation_->schema_temps(), mon_equation_->domaine_dis(), energie_cinetique_turb_);
48 champs_compris_.ajoute_champ(energie_cinetique_turb_);
49}
50
52{
53 le_dom_VF_ = ref_cast(Domaine_VF, domaine_dis);
54 le_dom_Cl_ = ref_cast(Domaine_Cl_dis_base, domaine_Cl_dis);
55}
56
58 OBS_PTR(Champ_base) &ch_ref) const
59{
60 Motcles les_motcles(3);
61 {
62 les_motcles[0] = "viscosite_turbulente";
63 les_motcles[1] = "k";
64 les_motcles[2] = "distance_paroi";
65 }
66 int rang = les_motcles.search(mot);
67 switch(rang)
68 {
69 case 0:
70 {
71 ch_ref = la_viscosite_turbulente_.valeur();
72 return 1;
73 }
74 case 1:
75 {
76 Cerr << "The kinetic energy cannot be post-processed for the mixing length model." << finl;
77 //A coder
78 return 0;
79 }
80 case 2:
81 {
82 exit();
83 return 0;
84 }
85 default:
86 return 0;
87 }
88}
90{
91 return comprend_champ(mot);
92}
93
95{
96 Motcles les_motcles(3);
97 {
98 les_motcles[0] = "k";
99 les_motcles[1] = "viscosite_turbulente";
100 les_motcles[2] = "distance_paroi";
101 }
102
103 int rang = les_motcles.search(mot);
104
105 if (rang == 0)
106 {
107 Cerr << "The kinetic energy is not known for the mixing length model." << finl;
108 //A coder
109 return 0;
110 }
111 else if (rang == 1)
112 return 1;
113 else if (rang == 2)
114 {
115
116 exit();
117 return 0;
118 }
119 else
120 return 0;
121}
122
124{
125 // creation de K_eps_sortie et du fichier med si on a demande ecrire_K_eps
126 if (fichier_K_eps_sortie_ != Nom())
127 {
128 // 1) on cree le fichier med et on postraite le domaine
129 const Domaine& dom = mon_equation_->domaine_dis().domaine();
130 Ecrire_MED ecr_med(fichier_K_eps_sortie_.nom_me(me()), dom);
131 ecr_med.ecrire_domaine(false);
132 //2 on discretise le champ K_eps_pour_la_sortie
133 const Discretisation_base& dis = mon_equation_->discretisation();
134 Noms noms(2);
135 Noms unit(2);
136 noms[0] = "K";
137 noms[1] = "eps";
138 unit[0] = "m2/s2";
139 unit[1] = "m2/s3";
140 int nb_case_tempo = 1;
141 double temps = mon_equation_->schema_temps().temps_courant();
142 dis.discretiser_champ("CHAMP_ELEM", mon_equation_->domaine_dis(), scalaire, noms, unit, 2, nb_case_tempo, temps, K_eps_sortie_);
143 K_eps_sortie_->nommer("K_eps_from_nut");
144 K_eps_sortie_->fixer_unites(unit);
145 K_eps_sortie_->fixer_noms_compo(noms);
146 }
147}
148
150{
151 statistics().begin_count(STD_COUNTERS::turbulent_viscosity,statistics().get_last_opened_counter_level()+1);
154 loipar_->calculer_hyd(la_viscosite_turbulente_, energie_cinetique_turbulente());
156 if (mon_equation_->probleme().is_dilatable())
157 correction_nut_et_cisaillement_paroi_si_qc(*this);
158 energie_cinetique_turb_->valeurs().echange_espace_virtuel();
159 la_viscosite_turbulente_->valeurs().echange_espace_virtuel();
160 statistics().end_count(STD_COUNTERS::turbulent_viscosity);
161}
162
164{
165 const Schema_Temps_base& sch = mon_equation_->schema_temps();
166 double temps_courant = sch.temps_courant();
167 double dt = sch.pas_de_temps();
168 if (limpr_ustar(temps_courant, sch.temps_precedent(), dt, dt_impr_ustar_) || limpr_ustar(temps_courant, sch.temps_precedent(), dt, dt_impr_ustar_mean_only_))
169 if (K_eps_sortie_)
170 {
171 double temps = mon_equation_->schema_temps().temps_courant();
172 K_eps_sortie_->mettre_a_jour(temps);
173
174 // calcul de K_eps
175
176 DoubleTab& K_Eps = K_eps_sortie_->valeurs();
177 const DoubleTab& visco_turb = la_viscosite_turbulente_->valeurs();
178 const DoubleTab& wall_length = wall_length_->valeurs();
179 const int nb_elem = K_Eps.dimension(0);
180
181 const double Kappa = 0.415;
182 double Cmu = CMU;
183 // PQ : 27/06/07 : expressions de k et eps basees sur :
184 //
185 // nu_t = C_mu.K.L.k^(1/2) et nu_t = C_mu.k^2/eps
186
187 for (int elem = 0; elem < nb_elem; elem++)
188 {
189 K_Eps(elem, 0) = pow(visco_turb(elem) / (Cmu * Kappa * wall_length(elem)), 2);
190
191 if (visco_turb(elem) == 0.)
192 K_Eps(elem, 1) = 0.;
193 else
194 K_Eps(elem, 1) = Cmu * K_Eps(elem, 0) * K_Eps(elem, 0) / visco_turb(elem);
195 }
196
197 // PQ : recalibrage de k et eps d'apres resultats
198 // sur Canal plan a Re = 100 000 et Re = 1 000 000
199 for (int elem = 0; elem < nb_elem; elem++)
200 {
201 K_Eps(elem, 0) /= 47.;
202 K_Eps(elem, 1) /= 1000.;
203 //Cerr<<elem <<" "<< K_Eps(elem,0)<<" "<<K_Eps(elem,1)<<" ";
204 //Cerr<<visco_turb(elem)<<" "<<wall_length(elem)<<finl;
205 }
206
207 // enfin ecriture du champ aux elems (il y est deja)
208 const Domaine& dom = mon_equation_->domaine_dis().domaine();
209 Nom fic = fichier_K_eps_sortie_.nom_me(me());
210
211 const Nom& nom_post = K_eps_sortie_->le_nom();
212 const Nom& type_elem = dom.type_elem()->que_suis_je();
213 assert(K_eps_sortie_->valeurs().dimension(0) == dom.nb_elem());
214 Ecrire_MED ecr_med(fic, dom);
215 ecr_med.ecrire_champ("CHAMPMAILLE", nom_post, K_eps_sortie_->valeurs(), K_eps_sortie_->unites(), K_eps_sortie_->noms_compo(), type_elem, temps);
216 }
218}
219
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
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_t nb_elem() const
Definition Domaine.h:131
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
class Domaine_VF
Definition Domaine_VF.h:44
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
void ecrire_champ(const Nom &type, const Nom &nom_cha1, const DoubleTab &val, const Noms &unite, const Noms &noms_compo, const Nom &type_elem, double time)
void ecrire_domaine(bool append=true)
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
Classe Modele_turbulence_hyd_0_eq_base Classe de base des modeles a 0 equation.
void set_param(Param &param) const override
virtual Champ_Fonc_base & energie_cinetique_turbulente()
OBS_PTR(Domaine_VF) le_dom_VF_
virtual Champ_Fonc_base & calculer_viscosite_turbulente()=0
void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &) override
void discretiser() override
Discretise le modele de turbulence.
int a_pour_Champ_Fonc(const Motcle &mot, OBS_PTR(Champ_base) &ch_ref) const
virtual void calculer_energie_cinetique_turb()=0
void imprimer(Sortie &) const override
Effectue l'impression si cela est necessaire.
Classe Modele_turbulence_hyd_base Cette classe sert de base a la hierarchie des classes.
int limpr_ustar(double, double, double, double) 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
virtual void discretiser()
Discretise le modele de turbulence.
virtual void imprimer(Sortie &) const
Effectue l'impression si cela est necessaire.
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
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
const Nom & le_nom() const override
Renvoie *this;.
Definition Nom.cpp:563
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
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
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
static int me()
renvoie mon rang dans le groupe de communication courant.
Definition Process.cpp:125
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.
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
double temps_precedent() const
Renvoie le temps courant.
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133