16#include <Transport_K_Omega_base.h>
17#include <Schema_Temps_base.h>
18#include <Champ_Inc_P0_base.h>
19#include <communications.h>
20#include <Probleme_base.h>
21#include <Discret_Thyd.h>
22#include <Domaine_VF.h>
23#include <Domaine_VEF.h>
52 param.
ajouter_flag(
"exit_on_negative_k_omega", &exit_on_negative_k_omega_);
53 param.
ajouter_flag(
"exit_on_big_omega", &exit_on_big_omega_);
54 param.
ajouter_flag(
"disable_report_on_corrected_values", &disable_report_on_corrected_values_);
67 Cerr <<
" Transport_K_Omega_base::discretiser " << finl;
72 Cerr <<
"K-Omega transport equation (" <<
que_suis_je() <<
") discretization" << finl;
73 Cerr <<
"K_Omega field discretization" << finl;
85 le_champ_K_Omega->nommer(
"K_Omega");
101 if (flag_control_k_omega_required_)
103 DoubleTab& K_Omega = le_champ_K_Omega->valeurs();
108 Process::exit(
"Unsupported K_Omega field in Transport_K_Omega_base::controler_K_Omega()");
109 size = le_champ_K_Omega->equation().domaine_dis().domaine().nb_elem();
113 if (not(disable_report_on_corrected_values_))
125 Debog::verifier(
"Transport_K_Omega_base::controler_K_Omega K_Omega before", K_Omega);
130 DoubleTabView tab_K_Omega = K_Omega.
view_rw();
131 DoubleTrav tab_K_Omega_original(K_Omega);
132 tab_K_Omega_original = K_Omega;
133 CDoubleTabView K_Omega_orig = tab_K_Omega_original.
view_ro();
135 const int nb_faces_elem = domaine_vf.
elem_faces().line_size();
136 CIntTabView face_voisins = domaine_vf.
face_voisins().view_ro();
137 CIntTabView elem_faces = domaine_vf.
elem_faces().view_ro();
138 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), size, KOKKOS_LAMBDA(
const int n)
140 double& enerK = tab_K_Omega(n, 0);
141 double& omega = tab_K_Omega(n, 1);
154 for (
int i = 0; i < 2; i++)
156 int elem = face_voisins(n, i);
158 for (
int j = 0; j < nb_faces_elem; j++)
160 int face_j = elem_faces(elem, j);
163 double k_face = K_Omega_orig(face_j, 0);
169 double o_face = K_Omega_orig(face_j, 1);
170 if (o_face > OMEGA_MIN)
195 if (omega > OMEGA_MAX)
200 if (omega < OMEGA_MIN)
209 end_gpu_timer(__KERNEL_NAME__);
210 Debog::verifier(
"Transport_K_Omega_base::controler_K_Omega K_Omega middle", K_Omega);
212 Debog::verifier(
"Transport_K_Omega_base::controler_K_Omega K_Omega after", K_Omega);
222 DoubleTab& K_Omega = le_champ_K_Omega->valeurs();
227 Process::exit(
"Unsupported K_Omega field in Transport_K_Omega_base::controler_K_Omega()");
228 size = le_champ_K_Omega->equation().domaine_dis().domaine().nb_elem();
236 int count_negative_k = 0;
237 int count_omega_under_threshold = 0;
238 int count_omega_too_big = 0;
246 int count_negative_k;
247 int count_omega_under_threshold;
248 int count_omega_too_big;
250 KOKKOS_INLINE_FUNCTION CountValues() : count_negative_k(0), count_omega_under_threshold(0), count_omega_too_big(0) {}
251 KOKKOS_INLINE_FUNCTION CountValues(
const CountValues& rhs) : count_negative_k(rhs.count_negative_k), count_omega_under_threshold(rhs.count_omega_under_threshold), count_omega_too_big(rhs.count_omega_too_big) {}
252 KOKKOS_INLINE_FUNCTION CountValues&
operator=(
const CountValues&) =
default;
253 KOKKOS_INLINE_FUNCTION
void operator+=(
const CountValues& rhs)
255 count_negative_k += rhs.count_negative_k;
256 count_omega_under_threshold += rhs.count_omega_under_threshold;
257 count_omega_too_big += rhs.count_omega_too_big;
261 DoubleTabView tab_K_Omega = K_Omega.
view_rw();
263 Kokkos::parallel_reduce(start_gpu_timer(__KERNEL_NAME__), size,
264 KOKKOS_LAMBDA(
const int n, CountValues& local_count)
266 double& enerK = tab_K_Omega(n, 0);
267 double& omega = tab_K_Omega(n, 1);
269 if (omega > OMEGA_MAX)
271 local_count.count_omega_too_big++;
273 if (omega < OMEGA_MIN)
275 local_count.count_omega_under_threshold++;
279 if (enerK < 0) local_count.count_negative_k++;
282 end_gpu_timer(__KERNEL_NAME__);
284 count_negative_k = result.count_negative_k;
285 count_omega_under_threshold = result.count_omega_under_threshold;
286 count_omega_too_big = result.count_omega_too_big;
291 if (count_negative_k || count_omega_under_threshold)
293 const double time = le_champ_K_Omega->temps();
294 Journal() <<
"Values forced for k and omega because:" << finl;
295 if (count_negative_k)
297 Journal() <<
"Negative values found for k on "
298 << count_negative_k <<
"/" << size <<
" nodes at time "
301 if (count_omega_under_threshold)
303 Journal() <<
"Negative values found for omega on "
304 << count_omega_under_threshold <<
"/" << size <<
" nodes at time "
309 const double ratio_k = 100. * count_negative_k / size;
310 const double ratio_omega = 100. * count_omega_under_threshold / size;
311 if ((ratio_k > 0.01 || ratio_omega > 0.01) && !lquiet)
313 Journal() <<
"WARNING: Found high ratio of invalid values for k and/or omega (more that 0.01%) on process" <<
Process::me() << finl;
314 Journal() <<
"Check journal log file for more information. These messages can be disabled with the flag 'quiet' in modele_turbulence." << finl;
316 Journal() <<
"It is possible your initial and/or boundary conditions on k and/or omega are wrong." << finl;
319 if (exit_on_negative_k_omega_)
321 Cerr <<
"The problem is postprocessed in order to find the nodes where K or Omega values go below 0." << finl;
326 if (count_omega_too_big)
328 const double time = le_champ_K_Omega->temps();
329 Journal() <<
"Values forced for omega because:" << finl;
330 Journal() <<
"Maximum values found for omega on " << count_omega_too_big <<
"/" << size <<
" nodes at time " << time << finl;
332 if (exit_on_big_omega_)
334 Cerr <<
"The problem is postprocessed in order to find the nodes where Omega values too high." << finl;
: class Champ_Inc_P0_base
static void verifier(const char *const msg, double)
classe Discret_Thyd Cette classe est la classe de base representant une discretisation
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 elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Class defining operators and methods for all reading operation in an input flow (file,...
void set_calculate_time_derivative(int i)
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
virtual void mettre_a_jour(double temps)
La valeur de l'inconnue sur le pas de temps a ete calculee.
int calculate_time_derivative() const
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
int limpr() const
Demande au schema en temps si il faut effectuer une impression.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
virtual void discretiser()
Discretise l'equation.
Champs_compris champs_compris_
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
double get_OMEGA_MAX() const
double get_OMEGA_MIN() const
Un tableau de chaine de caracteres (VECT(Nom)).
const Objet_U & operator=(const Objet_U &)
Operateur= : ne fait rien (on conserve le numero et l'identifiant).
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 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_flag(const char *keyword, const bool *value)
Register a boolean flag whose mere presence switches it to true.
int postraiter(int force=1) override
Si force=1, effectue le postraitement sans tenir compte des frequences de postraitement.
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
static int me()
renvoie mon rang dans le groupe de communication courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_rw()
_SIZE_ dimension(int d) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
Classe Transport_2eq_base Classe de base pour les equations.
void set_param(Param &) const override
const Modele_turbulence_hyd_2_eq_base & modele_turbulence() const
Renvoie le modele de turbulence associe a l'equation.
bool disable_VEF_mean_value_corrections_
Classe Transport_K_Omega_base Classe de base pour les equations.
void valider_iteration() override
on remet omega et K positifs
void discretiser() override
Discretise l'equation.
virtual void set_param(Param &) const override
void report_on_corrected_values()
void raise_control_k_omega_flag() const
void lower_control_k_omega_flag() const
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.