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>
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>
50 Navier_Stokes_Turbulent& ns_equation = ref_cast(Navier_Stokes_Turbulent,
equation());
53 Cout <<
"SST model: initialize wall distances." <<
"\n";
60 Cout <<
"BSL model: initialize wall distances." <<
"\n";
66 Cerr <<
"Error in Modele_turbulence_hyd_K_Omega::readOn()" << finl;
68 Cerr <<
"Valid options are: STD (default), SST (Shear Stress Tensor) or BSL (Baseline)." << finl;
111 const DoubleTab& tab_K_Omega = chK_Omega.
valeurs();
112 DoubleTab& visco_turb = la_viscosite_turbulente_->valeurs();
117 int komega_size_real = tab_K_Omega.
dimension(0);
118 if (komega_size_real < 0)
123 Cerr <<
"Unsupported K_Omega field in "
124 "Modele_turbulence_hyd_K_Omega::calculer_viscosite_turbulente"
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",
138 double non_prepare = (visco_turb.
size() == komega_size_real) ? 0 : 1;
139 non_prepare =
mp_max(non_prepare);
141 if (non_prepare == 1)
143 if (!visco_turb_au_format_K_Omega_)
146 visco_turb_au_format_K_Omega_.typer(type);
149 DoubleTab& visco_turb_K_Omega = visco_turb_au_format_K_Omega_->valeurs();
150 if (visco_turb_K_Omega.
size() != komega_size_real)
152 Cerr <<
"visco_turb_K_Omega size is " << visco_turb_K_Omega.
size()
153 <<
" instead of " << komega_size_real << finl;
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());
169 la_viscosite_turbulente_->changer_temps(temps);
170 Debog::verifier(
"Modele_turbulence_hyd_K_Omega::calculer_viscosite_turbulente la_viscosite_turbulente after",
172 return la_viscosite_turbulente_;
185 DoubleTab& tab_turbulent_viscosity)
190 CDoubleTabView K_Omega = tab_K_Omega.
view_ro();
191 DoubleArrView turbulent_viscosity =
static_cast<ArrOfDouble&
>(tab_turbulent_viscosity).view_wo();
197 enstrophy_->valeurs() : strain_invariant_ ->valeurs()).view_ro();
198 CDoubleArrView F2 =
static_cast<const ArrOfDouble&
>(tabF2_->valeurs()).view_ro();
200 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), tab_K_Omega.
dimension(0), KOKKOS_LAMBDA(
const int i)
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]);
206 end_gpu_timer(__KERNEL_NAME__);
211 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), tab_K_Omega.
dimension(0), KOKKOS_LAMBDA(
const int i)
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;
217 end_gpu_timer(__KERNEL_NAME__);
228 noms_compris.add(
"tab_F1");
229 noms_compris.add(
"tab_F2");
230 noms_compris.add(
"enstrophy");
231 noms_compris.add(
"strain_invariant");
233 if (opt == DESCRIPTION)
234 Cerr <<
" Modele_turbulence_hyd_K_Omega : " << noms_compris << finl;
236 nom.add(noms_compris);
255 Cerr <<
"Modele_turbulence_hyd_K_Omega::creer_champ: "
256 <<
"The domain must be VDF or VEF." << finl;
260 Noms noms(1), unites(1);
264 dis.
discretiser_champ(loc,
equation().domaine_dis(), name,
"", 1, mon_equation_->schema_temps().temps_courant(), tabF1_);
270 dis.
discretiser_champ(loc,
equation().domaine_dis(), name,
"", 1, mon_equation_->schema_temps().temps_courant(), tabF2_);
275 Nom name=
"enstrophy";
276 dis.
discretiser_champ(loc,
equation().domaine_dis(), name,
"", 1, mon_equation_->schema_temps().temps_courant(), enstrophy_);
279 if (!strain_invariant_)
281 Nom name=
"strain_invariant";
282 dis.
discretiser_champ(loc,
equation().domaine_dis(), name,
"", 1, mon_equation_->schema_temps().temps_courant(), strain_invariant_);
298 Debog::verifier(
"Modele_turbulence_hyd_K_Omega::preparer_calcul la_viscosite_turbulente", la_viscosite_turbulente_->valeurs());
320 statistics().end_count(STD_COUNTERS::update_variables);
324 statistics().begin_count(STD_COUNTERS::update_variables, statistics().get_last_opened_counter_level()+1);
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);
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.
static void verifier(const char *const msg, double)
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
virtual void mettre_a_jour(double temps)
Effectue une mise a jour en temps de toutes les conditions aux limites.
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
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,...
bool initTimeStep(double dt) override
void completer() override
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 ¶m) 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 completer() override
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
Expert_mode_K_Omega expert_mode_
static constexpr double CST_A1
const Expert_mode_K_Omega & get_expert_mode() const
void set_param(Param ¶m) const override
virtual int preparer_calcul()
Prepare le calcul.
Champs_compris champs_compris_
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.
void creer_champ(const Motcle &motlu) override
class Nom Une chaine de caractere pour nommer les objets de TRUST
Un tableau de chaine de caracteres (VECT(Nom)).
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Helper class to factorize the readOn method of Objet_U classes.
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
static double mp_max(double)
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
virtual int faire_un_pas_de_temps_eqn_base(Equation_base &)=0
Classe de base des flux de sortie.
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
_SIZE_ dimension(int d) const
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.