TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Modele_turbulence_hyd_K_Eps.cpp
1/****************************************************************************
2* Copyright (c) 2019, 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_K_Eps.h>
18#include <Navier_Stokes_Turbulent.h>
19#include <Champ_Inc_P0_base.h>
20#include <Schema_Temps_base.h>
21#include <communications.h>
22#include <Champ_Uniforme.h>
23#include <Probleme_base.h>
24#include <Perf_counters.h>
25#include <Fluide_base.h>
26#include <TRUSTTrav.h>
27#include <Param.h>
28#include <Debog.h>
29
30Implemente_instanciable(Modele_turbulence_hyd_K_Eps, "Modele_turbulence_hyd_K_Epsilon", Modele_turbulence_hyd_RANS_K_Eps_base);
31// XD k_epsilon mod_turb_hyd_rans_keps k_epsilon INHERITS_BRACE Turbulence model (k-eps).
32
34{
35 return s << que_suis_je() << " " << le_nom();
36}
37
39{
41}
42
44{
46 param.ajouter_non_std("Modele_Fonc_Bas_Reynolds", (this)); // XD_ADD_P modele_fonction_bas_reynolds_base
47 // XD_CONT This keyword is used to set the bas Reynolds model used.
48 param.ajouter("CMU", &LeCmu_); // XD_ADD_P double
49 // XD_CONT Keyword to modify the Cmu constant of k-eps model : Nut=Cmu*k*k/eps Default value is 0.09
50 param.ajouter("PRANDTL_K|Sigma_K", &Sigma_K_); // XD_ADD_P double
51 // XD_CONT Keyword to change the Prk|Sigma_K value (default 1.0). See https://turbmodels.larc.nasa.gov/ke-chien.html
52 param.ajouter("PRANDTL_EPS|Sigma_Eps", &Sigma_Eps_); // XD_ADD_P double
53 // XD_CONT Keyword to change the Pre|Sigma_Eps value (default 1.3).
54}
55
57{
58 if (mot == "Modele_Fonc_Bas_Reynolds")
59 {
60 Cerr << "Lecture du modele bas reynolds associe " << finl;
62 Cerr << "mon_modele_fonc.que_suis_je() avant discretisation " << mon_modele_fonc_.que_suis_je() << finl;
63 mon_modele_fonc_->discretiser();
64 Cerr << "mon_modele_fonc.que_suis_je() " << mon_modele_fonc_->que_suis_je() << finl;
65 mon_modele_fonc_->lire_distance_paroi();
66 return 1;
67 }
68 else
70}
71
72/*! @brief Calcule la viscosite turbulente au temps demande.
73 *
74 * @param (double temps) le temps auquel il faut calculer la viscosite
75 * @return (Champ_Fonc_base&) la viscosite turbulente au temps demande
76 * @throws erreur de taille de visco_turb_K_eps
77 */
79{
80 const Champ_base& chK_Eps = get_eq_transport().inconnue();
81 Nom type = chK_Eps.que_suis_je();
82 const Domaine_Cl_dis_base& le_dom_Cl_dis = get_eq_transport().domaine_Cl_dis();
83 const DoubleTab& tab_K_Eps = chK_Eps.valeurs();
84 DoubleTab& visco_turb = la_viscosite_turbulente_->valeurs();
85
86 // K_Eps(i,0) = K au noeud i
87 // K_Eps(i,1) = Epsilon au noeud i
88 // int n = tab_K_Eps.dimension(0);
89 int n = tab_K_Eps.dimension(0);
90 if (n < 0)
91 {
92 if (sub_type(Champ_Inc_P0_base, chK_Eps))
94 else
95 {
96 Cerr << "Unsupported K_Eps field in Modele_turbulence_hyd_K_Eps::calculer_viscosite_turbulente" << finl;
97 Process::exit(-1);
98 }
99 }
100
101 DoubleTrav Fmu, D(tab_K_Eps.dimension(0)), Cmu(tab_K_Eps.dimension(0));
102 if (mon_modele_fonc_)
103 {
104 // pour avoir nu en incompressible et mu en QC
105 // et non comme on a divise K et eps par rho (si on est en QC)
106 // on veut toujours nu
107 const OWN_PTR(Champ_Don_base) ch_visco = ref_cast(Fluide_base,get_eq_transport().milieu()).viscosite_cinematique();
108 const Champ_Don_base& ch_visco_cin = ref_cast(Fluide_base,get_eq_transport().milieu()).viscosite_cinematique();
109
110 const DoubleTab& tab_visco = ch_visco_cin.valeurs();
111 Fmu.resize(tab_K_Eps.dimension(0));
112 const Domaine_dis_base& le_dom_dis = get_eq_transport().domaine_dis();
113
114 mon_modele_fonc_->Calcul_Fmu(Fmu, le_dom_dis, le_dom_Cl_dis, tab_K_Eps, ch_visco);
115 int is_Cmu_constant = mon_modele_fonc_->Calcul_is_Cmu_constant();
116 if (is_Cmu_constant == 0)
117 {
118 const DoubleTab& vitesse = mon_equation_->inconnue().valeurs();
119 mon_modele_fonc_->Calcul_Cmu(Cmu, le_dom_dis, le_dom_Cl_dis, vitesse, tab_K_Eps, EPS_MIN_);
120
121 /*Paroi*/
123 if (lp != "negligeable_VEF")
124 {
125 DoubleTab visco_tab(visco_turb.dimension_tot(0));
126 assert(sub_type(Champ_Uniforme,ch_visco_cin));
127 visco_tab = tab_visco(0, 0);
128 const int idt = mon_equation_->schema_temps().nb_pas_dt();
129 const DoubleTab& tab_paroi = loi_paroi().Cisaillement_paroi();
130 mon_modele_fonc_->Calcul_Cmu_Paroi(Cmu, le_dom_dis, le_dom_Cl_dis, visco_tab, visco_turb, tab_paroi, idt, vitesse, tab_K_Eps, EPS_MIN_);
131 }
132 }
133 }
134
135 // dans le cas d'un domaine nul on doit effectuer le dimensionnement
136 double non_prepare = 1;
137 Debog::verifier("Modele_turbulence_hyd_K_Eps::calculer_viscosite_turbulente la_viscosite_turbulente before", la_viscosite_turbulente_->valeurs());
138 Debog::verifier("Modele_turbulence_hyd_K_Eps::calculer_viscosite_turbulente tab_K_Eps", tab_K_Eps);
139 if (visco_turb.size() == n)
140 non_prepare = 0.;
141 non_prepare = mp_max(non_prepare);
142
143 if (non_prepare == 1)
144 {
145 if (!visco_turb_au_format_K_eps_)
146 {
147 // Create field visco_turb_au_format_K_eps_
148 visco_turb_au_format_K_eps_.typer(type);
149 complete_viscosity_field(n, get_eq_transport().domaine_dis(), visco_turb_au_format_K_eps_);
150 }
151 DoubleTab& visco_turb_K_eps = visco_turb_au_format_K_eps_->valeurs();
152 if (visco_turb_K_eps.size() != n)
153 {
154 Cerr << "visco_turb_K_eps size is " << visco_turb_K_eps.size() << " instead of " << n << finl;
156 }
157 // A la fin de cette boucle, le tableau visco_turb_K_eps contient les valeurs de la viscosite turbulente
158 // au centre des faces du maillage.
159 fill_turbulent_viscosity_tab(n, tab_K_Eps, Cmu, Fmu, D, visco_turb_K_eps);
160
161 // On connait donc la viscosite turbulente au centre des faces de chaque element
162 // On cherche maintenant a interpoler cette viscosite turbulente au centre des elements.
163 la_viscosite_turbulente_->affecter(visco_turb_au_format_K_eps_.valeur());
164 Debog::verifier("Modele_turbulence_hyd_K_Eps::calculer_viscosite_turbulente visco_turb_au_format_K_eps", visco_turb_au_format_K_eps_.valeur());
165 }
166 else
167 fill_turbulent_viscosity_tab(n, tab_K_Eps, Cmu, Fmu, D, visco_turb);
168
169 la_viscosite_turbulente_->changer_temps(temps);
170 Debog::verifier("Modele_turbulence_hyd_K_Eps::calculer_viscosite_turbulente la_viscosite_turbulente after", la_viscosite_turbulente_->valeurs());
171 return la_viscosite_turbulente_;
172}
173
174void Modele_turbulence_hyd_K_Eps::fill_turbulent_viscosity_tab(const int n, const DoubleTab& tab_K_Eps, const DoubleTab& tab_Cmu, const DoubleTab& tab_Fmu, const DoubleTab& tab_D, DoubleTab& tab_turbulent_viscosity)
175{
176 const double EPS_MIN = EPS_MIN_;
177 const double le_cmu = LeCmu_;
178 const bool has_low_re_model = bool(mon_modele_fonc_);
179 const int is_cmu_constant = has_low_re_model ? mon_modele_fonc_->Calcul_is_Cmu_constant() : 0;
180
181 CDoubleTabView K_Eps = tab_K_Eps.view_ro();
182 CDoubleArrView Cmu = static_cast<const ArrOfDouble&>(tab_Cmu).view_ro();
183 CDoubleArrView Fmu = static_cast<const ArrOfDouble&>(tab_Fmu).view_ro();
184 CDoubleArrView D = static_cast<const ArrOfDouble&>(tab_D).view_ro();
185 DoubleArrView turbulent_viscosity = static_cast<ArrOfDouble&>(tab_turbulent_viscosity).view_wo();
186 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), n, KOKKOS_LAMBDA(const int i)
187 {
188 double eps = K_Eps(i, 1);
189 double k = K_Eps(i, 0);
190 double value = eps <= EPS_MIN ? 0 : k * k / (eps + D(i));
191 turbulent_viscosity[i] = has_low_re_model ? (Fmu(i) * (is_cmu_constant ? le_cmu : Cmu(i)) * value) : le_cmu * value;
192 });
193 end_gpu_timer(__KERNEL_NAME__);
194}
195
197{
200 // GF pour initialiser la loi de paroi thermique en TBLE
201 if (equation().probleme().nombre_d_equations() > 1)
202 {
203 const RefObjU& modele_turbulence = equation().probleme().equation(1).get_modele(TURBULENCE);
204 if (sub_type(Modele_turbulence_scal_base, modele_turbulence.valeur()))
205 {
206 Turbulence_paroi_scal_base& loi_paroi_T = ref_cast_non_const(Modele_turbulence_scal_base,modele_turbulence.valeur()).loi_paroi();
207 loi_paroi_T.init_lois_paroi();
208 }
209 }
210
212 Debog::verifier("Modele_turbulence_hyd_K_Eps::preparer_calcul la_viscosite_turbulente", la_viscosite_turbulente_->valeurs());
213 return 1;
214}
215
220
221/*! @brief Effectue une mise a jour en temps du modele de turbulence.
222 *
223 * Met a jour l'equation de transport K-epsilon,
224 * calcule la loi de paroi et la viscosite turbulente
225 * au nouveau temps.
226 *
227 * @param (double temps) le temps de mise a jour
228 */
230{
233 if (!get_eq_transport().equation_non_resolue())
234 {
235 statistics().end_count(STD_COUNTERS::update_variables);
237 statistics().begin_count(STD_COUNTERS::update_variables, statistics().get_last_opened_counter_level()+1);
238 }
240
241 statistics().begin_count(STD_COUNTERS::turbulent_viscosity, statistics().get_last_opened_counter_level()+1);
242 Debog::verifier("Modele_turbulence_hyd_K_Eps::mettre_a_jour la_viscosite_turbulente before", la_viscosite_turbulente_->valeurs());
244 Debog::verifier("Modele_turbulence_hyd_K_Eps::mettre_a_jour la_viscosite_turbulente after", la_viscosite_turbulente_->valeurs());
245 statistics().end_count(STD_COUNTERS::turbulent_viscosity);
246}
247
248bool Modele_turbulence_hyd_K_Eps::has_champ(const Motcle& nom, OBS_PTR(Champ_base)& ref_champ) const
249{
251 return true;
252
253 if (mon_modele_fonc_)
254 if (mon_modele_fonc_->has_champ(nom, ref_champ))
255 return true;
256
257 return false; /* rien trouve */
258}
259
261{
263 return true;
264
265 if (mon_modele_fonc_)
266 if (mon_modele_fonc_->has_champ(nom))
267 return true;
268
269 return false; /* rien trouve */
270}
271
273{
274 OBS_PTR(Champ_base) ref_champ;
275
277 return ref_champ;
278
279 if (mon_modele_fonc_)
280 if (mon_modele_fonc_->has_champ(nom, ref_champ))
281 return ref_champ;
282
283 throw std::runtime_error(std::string("Field ") + nom.getString() + std::string(" not found !"));
284}
285
287{
289 if (mon_modele_fonc_)
290 mon_modele_fonc_->get_noms_champs_postraitables(nom, opt);
291
292}
294{
295 Nom lp = loipar_->que_suis_je();
296 if (lp == "negligeable_VEF" || lp == "negligeable_VDF")
297 if (!associe_modele_fonction())
298 {
299 Cerr << "The turbulence model of type " << que_suis_je() << finl;
300 Cerr << "must not be used with a wall law of type negligeable or with a modele_function." << finl;
301 Cerr << "Another wall law must be selected with this kind of turbulence model." << finl;
302 }
303}
304
305
307{
308 Transport_K_Eps& eq_transport = ref_cast(Transport_K_Eps, ptr_eq_transport_.valeur());
309 return eq_transport;
310}
311
313{
314 const Transport_K_Eps& eq_transport = ref_cast(Transport_K_Eps, ptr_eq_transport_.valeur());
315 return eq_transport;
316}
317
classe Champ_Don_base classe de base des Champs donnes (non calcules)
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
: class Champ_Inc_P0_base
virtual DoubleTab & valeurs()=0
classe Champ_Uniforme Represente un champ constant dans l'espace et dans le temps.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
static void verifier(const char *const msg, double)
Definition Debog.cpp:21
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
virtual void mettre_a_jour(double temps)
Effectue une mise a jour en temps de toutes les conditions aux limites.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
virtual const RefObjU & get_modele(Type_modele type) const
virtual void mettre_a_jour(double temps)
La valeur de l'inconnue sur le pas de temps a ete calculee.
virtual int preparer_calcul()
Tout ce qui ne depend pas des autres problemes eventuels.
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.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
virtual bool initTimeStep(double dt)
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
Definition Fluide_base.h:38
static void typer_lire_Modele_Fonc_Bas_Reynolds(OWN_PTR(Modele_Fonc_Bas_Reynolds_Base)&, const Equation_base &, Entree &is)
Classe Modele_turbulence_hyd_K_Eps Cette classe represente le modele de turbulence (k,...
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
void mettre_a_jour(double) override
Effectue une mise a jour en temps du modele de turbulence.
void fill_turbulent_viscosity_tab(const int, const DoubleTab &, const DoubleTab &, const DoubleTab &, const DoubleTab &, DoubleTab &)
OWN_PTR(Champ_Inc_base) visco_turb_au_format_K_eps_
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.
const Champ_base & get_champ(const Motcle &nom) const override
void set_param(Param &param) const override
virtual Champ_Fonc_base & calculer_viscosite_turbulente(double temps)
Calcule la viscosite turbulente au temps demande.
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
int preparer_calcul() override
Prepare le calcul.
const Transport_K_Eps & get_eq_transport() const override
Transport_K_Eps & get_set_eq_transport() override
DoubleTab & complete_viscosity_field(const int, const Domaine_dis_base &, Champ_Inc_base &)
std::enable_if_t<(M_TYPE==MODELE_TYPE::K_EPS||M_TYPE==MODELE_TYPE::K_EPS_REALISABLE||M_TYPE==MODELE_TYPE::K_OMEGA), void > calculate_limit_viscosity(Champ_Inc_base &, double)
Classe Modele_turbulence_hyd_RANS_K_Eps_base Classe de base des modeles de type RANS_keps.
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
OBS_PTR(Equation_base) mon_equation_
virtual int preparer_calcul()
Prepare le calcul.
const Turbulence_paroi_base & loi_paroi() const
Equation_base & equation()
Renvoie l'equation associee au modele de turbulence.
Classe Modele_turbulence_scal_base Cette classe represente un modele de turbulence pour une 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
const std::string & getString() const
Definition Nom.h:92
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
virtual int lire_motcle_non_standard(const Motcle &motlu, Entree &is)
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
Definition Objet_U.cpp:115
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 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
virtual const Equation_base & equation(int) const =0
static double mp_max(double)
Definition Process.cpp:376
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
class Schema_Temps_base
virtual int faire_un_pas_de_temps_eqn_base(Equation_base &)=0
Classe de base des flux de sortie.
Definition Sortie.h:52
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ dimension_tot(int) const override
Definition TRUSTTab.tpp:160
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
Definition TRUSTTab.h:261
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
_SIZE_ size() const
Definition TRUSTVect.tpp:45
const Objet_U & valeur() const
Definition TRUST_Ref.h:134
const Modele_turbulence_hyd_2_eq_base & modele_turbulence() const
Renvoie le modele de turbulence associe a l'equation.
const Champ_Inc_base & inconnue() const override
Renvoie le champ inconnue de l'equation.
int controler_K_Eps()
Controle le champ inconnue K-epsilon en forcant a zero les valeurs du champ.
classe Transport_K_Eps Cette classe represente l'equation de transport de l'energie cinetique
const DoubleTab & Cisaillement_paroi() const
Classe Turbulence_paroi_scal_base Classe de base pour la hierarchie des classes representant les mode...
virtual int init_lois_paroi()=0