TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Modele_turbulence_hyd_K_Omega.cpp
1/****************************************************************************
2* Copyright (c) 2023, 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 <Modifier_pour_fluide_dilatable.h>
17#include <Modele_turbulence_hyd_K_Omega.h>
18#include <Modele_turbulence_scal_base.h>
19#include <Navier_Stokes_Turbulent.h>
20#include <Schema_Temps_base.h>
21#include <Champ_Inc_P0_base.h>
22#include <communications.h>
23#include <Champ_Uniforme.h>
24#include <TRUSTTab_parts.h>
25#include <Probleme_base.h>
26#include <Perf_counters.h>
27#include <Fluide_base.h>
28#include <TRUSTTrav.h>
29#include <Param.h>
30#include <Debog.h>
31#include <Domaine_VDF.h>
32#include <Domaine_VEF.h>
33#include <VDF_discretisation.h>
34#include <VEF_discretisation.h>
35#include <Expert_mode_K_Omega.h>
36
37Implemente_instanciable(Modele_turbulence_hyd_K_Omega, "Modele_turbulence_hyd_K_Omega", Modele_turbulence_hyd_RANS_K_Omega_base);
38// XD k_omega mod_turb_hyd_rans k_omega INHERITS_BRACE Turbulence model (k-omega).
39
41{
42 return s << que_suis_je() << " " << le_nom();
43}
44
46{
48 is_SST_ = false;
49 is_BSL_ = false;
50 Navier_Stokes_Turbulent& ns_equation = ref_cast(Navier_Stokes_Turbulent, equation());
51 if (model_variant_ == "SST")
52 {
53 Cout << "SST model: initialize wall distances." << "\n";
54 ns_equation.creer_champ("distance_paroi_globale");
55 is_SST_ = true;
56 is_BSL_ = true;
57 }
58 else if (model_variant_ == "BSL")
59 {
60 Cout << "BSL model: initialize wall distances." << "\n";
61 ns_equation.creer_champ("distance_paroi_globale");
62 is_BSL_ = true;
63 }
64 else if (model_variant_ != "STD" && model_variant_ != "")
65 {
66 Cerr << "Error in Modele_turbulence_hyd_K_Omega::readOn()" << finl;
67 Cerr << "Unknown model_variant_ : " << model_variant_ << finl;
68 Cerr << "Valid options are: STD (default), SST (Shear Stress Tensor) or BSL (Baseline)." << finl;
70 }
71 return s;
72}
73
75{
77 param.ajouter("PRANDTL_K|Sigma_K", &Sigma_K_); // XD_ADD_P double
78 // XD_CONT Prandtl_K|Sigma_K (default value 1./2.). See https://turbmodels.larc.nasa.gov/wilcox.html
79 param.ajouter("PRANDTL_Omega|Sigma_Omega", &Sigma_Omega_); // XD_ADD_P double
80 // XD_CONT Prandtl_Omega|Sigma_Omega (default value 1./2.).
81 param.ajouter("model_variant", &model_variant_, Param::OPTIONAL); // XD_ADD_P chaine
82 // XD_CONT Model variant for k-omega (default value STD)
83 param.ajouter("Sigma_K1", &Sigma_K1_); // XD_ADD_P double
84 // XD_CONT Sigma_K1 for SST model (default value 0.85). See https://turbmodels.larc.nasa.gov/sst.html
85 param.ajouter("Sigma_K2", &Sigma_K2_); // XD_ADD_P double
86 // XD_CONT Sigma_K2 for SST model (default value 1.).
87 param.ajouter("Sigma_Omega1", &Sigma_OMEGA1_); // XD_ADD_P double
88 // XD_CONT Sigma_Omega1 for SST model (default value 1./2.).
89 param.ajouter("Sigma_Omega2", &Sigma_OMEGA2_); // XD_ADD_P double
90 // XD_CONT Prandt_Omega2 for SST model (default value 0.856).
91 param.ajouter("expert_mode", &expert_mode_); // XD_ADD_P bloc_lecture
92 // XD_CONT not_set
93}
94
95
100
101/*! @brief Calcule la viscosite turbulente au temps demande.
102 *
103 * @param (double temps) le temps auquel il faut calculer la viscosite
104 * @return (Champ_Fonc_base&) la viscosite turbulente au temps demande
105 * @throws erreur de taille de visco_turb_K_omega
106 */
108{
109 const Champ_base& chK_Omega = get_eq_transport().inconnue();
110 const Nom type = chK_Omega.que_suis_je();
111 const DoubleTab& tab_K_Omega = chK_Omega.valeurs();
112 DoubleTab& visco_turb = la_viscosite_turbulente_->valeurs();
113
114 // K_Omega(i, 0) = K on node i
115 // K_Omega(i, 1) = Omega on node i
116
117 int komega_size_real = tab_K_Omega.dimension(0);
118 if (komega_size_real < 0)
119 {
120 // Check field K_Omega type
121 if (!sub_type(Champ_Inc_P0_base, chK_Omega))
122 {
123 Cerr << "Unsupported K_Omega field in "
124 "Modele_turbulence_hyd_K_Omega::calculer_viscosite_turbulente"
125 << finl;
127 }
128 komega_size_real = get_eq_transport().domaine_dis().domaine().nb_elem();
129 }
130
131 // cAlan, le 20/01/2023 : sortir cette partie et en faire une fonction à
132 // part ? dans le cas d'une domaine nulle on doit effectuer le
133 // dimensionnement
134 Debog::verifier("Modele_turbulence_hyd_K_Omega::calculer_viscosite_turbulente la_viscosite_turbulente before",
135 la_viscosite_turbulente_->valeurs());
136 Debog::verifier("Modele_turbulence_hyd_K_Omega::calculer_viscosite_turbulente tab_K_Omega",
137 tab_K_Omega);
138 double non_prepare = (visco_turb.size() == komega_size_real) ? 0 : 1;
139 non_prepare = mp_max(non_prepare);
140
141 if (non_prepare == 1)
142 {
143 if (!visco_turb_au_format_K_Omega_)
144 {
145 // Create field visco_turb_au_format_K_Omega_
146 visco_turb_au_format_K_Omega_.typer(type);
147 complete_viscosity_field(komega_size_real, get_eq_transport().domaine_dis(),visco_turb_au_format_K_Omega_);
148 }
149 DoubleTab& visco_turb_K_Omega = visco_turb_au_format_K_Omega_->valeurs();
150 if (visco_turb_K_Omega.size() != komega_size_real)
151 {
152 Cerr << "visco_turb_K_Omega size is " << visco_turb_K_Omega.size()
153 << " instead of " << komega_size_real << finl;
155 }
156
157 // A la fin de cette boucle, le tableau visco_turb_K_Omega contient les valeurs de la viscosite turbulente
158 // au centre des faces du maillage.
159 fill_turbulent_viscosity_tab(tab_K_Omega, visco_turb_K_Omega);
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_Omega_.valeur());
164 Debog::verifier("Modele_turbulence_hyd_K_Omega::calculer_viscosite_turbulente visco_turb_au_format_K_Omega", visco_turb_au_format_K_Omega_.valeur());
165 }
166 else
167 fill_turbulent_viscosity_tab(tab_K_Omega, visco_turb);
168
169 la_viscosite_turbulente_->changer_temps(temps);
170 Debog::verifier("Modele_turbulence_hyd_K_Omega::calculer_viscosite_turbulente la_viscosite_turbulente after",
171 visco_turb);
172 return la_viscosite_turbulente_;
173}
174
175/*! @brief Fill the turbulent viscosity table depending on the model.
176 *
177 * If omega is lower that the threshold OMEGA_MIN_, turbulent viscosity is null.
178 * If the model variant is SST, a special inverse time scale is computed in place of omega.
179 *
180 * @param[in] (tab_K_Omega_dim0) the dimension(0) of the K_Omega table, i.e. the number of face or elements.
181 * @param[in] (tab_K_Omega&) the table containing the turbulent kinetic and the inverse time scale omega
182 * @param[in] (turbulent_viscosity&) the turbulent viscosity table
183 */
185 DoubleTab& tab_turbulent_viscosity)
186{
187 const double OMEGA_MIN = OMEGA_MIN_;
188 bool is_sst = is_SST();
189
190 CDoubleTabView K_Omega = tab_K_Omega.view_ro();
191 DoubleArrView turbulent_viscosity = static_cast<ArrOfDouble&>(tab_turbulent_viscosity).view_wo();
192
193 if (is_sst)
194 {
195
196 CDoubleArrView val = static_cast<const ArrOfDouble&>(get_expert_mode().get_menter_version()==Menter_version::ORIGINAL_1994 ?
197 enstrophy_->valeurs() : strain_invariant_ ->valeurs()).view_ro();
198 CDoubleArrView F2 = static_cast<const ArrOfDouble&>(tabF2_->valeurs()).view_ro();
199
200 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), tab_K_Omega.dimension(0), KOKKOS_LAMBDA(const int i)
201 {
202 const double k = K_Omega(i, 0);
203 const double omega = K_Omega(i, 1);
204 turbulent_viscosity[i] = omega <= OMEGA_MIN ? 0 : k * CST_A1 / Kokkos::max(CST_A1*omega, val[i]*F2[i]);
205 });
206 end_gpu_timer(__KERNEL_NAME__);
207 }
208 else
209 {
210
211 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), tab_K_Omega.dimension(0), KOKKOS_LAMBDA(const int i)
212 {
213 const double k = K_Omega(i, 0);
214 const double omega = K_Omega(i, 1);
215 turbulent_viscosity[i] = omega <= OMEGA_MIN ? 0 : k/omega;
216 });
217 end_gpu_timer(__KERNEL_NAME__);
218 }
219
220}
221
222
224 Option opt) const
225{
227 Noms noms_compris = champs_compris_.liste_noms_compris();
228 noms_compris.add("tab_F1");
229 noms_compris.add("tab_F2");
230 noms_compris.add("enstrophy");
231 noms_compris.add("strain_invariant");
232
233 if (opt == DESCRIPTION)
234 Cerr << " Modele_turbulence_hyd_K_Omega : " << noms_compris << finl;
235 else
236 nom.add(noms_compris);
237}
238
240{
242 const Discretisation_base& dis = ref_cast(Discretisation_base, mon_equation_->discretisation());
243 Motcle loc="";
244 if (sub_type(Domaine_VDF,get_eq_transport().domaine_dis()))
245 {
246 //const VDF_discretisation& disc = ref_cast(VDF_discretisation, equation().discretisation());
247 loc="champ_elem";
248 }
249 else if (sub_type(Domaine_VEF,get_eq_transport().domaine_dis()))
250 {
251 loc="champ_face";
252 }
253 else
254 {
255 Cerr << "Modele_turbulence_hyd_K_Omega::creer_champ: "
256 << "The domain must be VDF or VEF." << finl;
258 }
259
260 Noms noms(1), unites(1);
261 if (!tabF1_)
262 {
263 Nom name="tab_F1";
264 dis.discretiser_champ(loc, equation().domaine_dis(), name, "", 1, mon_equation_->schema_temps().temps_courant(), tabF1_);
265 champs_compris_.ajoute_champ(tabF1_);
266 }
267 if (!tabF2_)
268 {
269 Nom name="tab_F2";
270 dis.discretiser_champ(loc, equation().domaine_dis(), name, "", 1, mon_equation_->schema_temps().temps_courant(), tabF2_);
271 champs_compris_.ajoute_champ(tabF2_);
272 }
273 if (!enstrophy_)
274 {
275 Nom name="enstrophy";
276 dis.discretiser_champ(loc, equation().domaine_dis(), name, "", 1, mon_equation_->schema_temps().temps_courant(), enstrophy_);
277 champs_compris_.ajoute_champ(enstrophy_);
278 }
279 if (!strain_invariant_)
280 {
281 Nom name="strain_invariant";
282 dis.discretiser_champ(loc, equation().domaine_dis(), name, "", 1, mon_equation_->schema_temps().temps_courant(), strain_invariant_);
283 champs_compris_.ajoute_champ(strain_invariant_);
284 }
285}
286
287
288/*! @brief Prepare the computation of the k-omega model.
289 *
290 * Initialise tables if model variant is SST and compute the viscosity limit.
291 *
292 */
294{
298 Debog::verifier("Modele_turbulence_hyd_K_Omega::preparer_calcul la_viscosite_turbulente", la_viscosite_turbulente_->valeurs());
299 return 1;
300}
301
306
307/*! @brief Performs a time update of the turbulence model.
308 *
309 * Update the transport equation of k and omega, computes the wall function and the turbulence
310 * viscosity.
311 *
312 * @param[in] (double temps) new time
313 */
315{
318 if (!get_set_eq_transport().equation_non_resolue())
319 {
320 statistics().end_count(STD_COUNTERS::update_variables);
321 get_set_eq_transport().controler_K_Omega(); // for Euler_Explicit scheme
323 get_set_eq_transport().controler_K_Omega(); // for RUNGE_Kutta schemes
324 statistics().begin_count(STD_COUNTERS::update_variables, statistics().get_last_opened_counter_level()+1);
325 }
327
328 statistics().begin_count(STD_COUNTERS::turbulent_viscosity, statistics().get_last_opened_counter_level()+1);
329 Debog::verifier("Modele_turbulence_hyd_K_Omega::mettre_a_jour la_viscosite_turbulente before", la_viscosite_turbulente_->valeurs());
331 Debog::verifier("Modele_turbulence_hyd_K_Omega::mettre_a_jour la_viscosite_turbulente after", la_viscosite_turbulente_->valeurs());
332 statistics().end_count(STD_COUNTERS::turbulent_viscosity);
333}
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_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
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
virtual void mettre_a_jour(double temps)
Effectue une mise a jour en temps de toutes les conditions aux limites.
class Domaine_VDF
Definition Domaine_VDF.h:64
class Domaine_VEF
Definition Domaine_VEF.h:54
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
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.
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.
const Menter_version & get_menter_version() const
Classe Modele_turbulence_hyd_K_Omega Cette classe represente le modele de turbulence (k,...
virtual Champ_Inc_base & get_set_eq_K_Omega()
Renvoie le champ inconnue du modele de turbulence i.
void fill_turbulent_viscosity_tab(const DoubleTab &K_Omega, DoubleTab &turbulent_viscosity)
Fill the turbulent viscosity table depending on the model.
void set_param(Param &param) const override
void mettre_a_jour(double) override
Performs a time update of the turbulence model.
int preparer_calcul() override
Prepare the computation of the k-omega model.
Transport_K_Omega_base & get_set_eq_transport() override
const Transport_K_Omega_base & get_eq_transport() const override
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
void discretiser() override
Discretise le modele de turbulence.
virtual Champ_Fonc_base & calculer_viscosite_turbulente(double)
Calcule la viscosite turbulente au temps demande.
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_Omega_base Classe de base des modeles de type RANS_komega.
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
virtual int preparer_calcul()
Prepare le calcul.
Equation_base & equation()
Renvoie l'equation associee au modele de turbulence.
virtual void discretiser()
Discretise le modele de turbulence.
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
void creer_champ(const Motcle &motlu) override
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
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
@ OPTIONAL
Definition Param.h:115
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
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 Champ_Inc_base & inconnue() const override
Renvoie le champ inconnue de l'equation.
void mettre_a_jour(double temps) override
La valeur de l'inconnue sur le pas de temps a ete calculee.
int controler_K_Omega()
Controle le champ inconnue K-Omega en forcant a zero les valeurs du champ.