16#include <Transport_K_ou_Eps_base.h>
17#include <Discret_Thyd.h>
18#include <Probleme_base.h>
19#include <Schema_Temps_base.h>
20#include <Domaine_VF.h>
23#include <communications.h>
24#include <Champ_Inc_P0_base.h>
25#include <Transport_2eq_base.h>
64 Cerr <<
"K,Eps transport equation ("<<
que_suis_je() <<
") discretization" << finl;
65 Cerr <<
"K_or_Eps field discretization" << finl;
71 Cerr <<
"K field discretization" << finl;
76 Cerr <<
"Epsilon field discretization" << finl;
85 le_champ_->nommer(
"K");
87 le_champ_->nommer(
"Eps");
98 Cerr<<
" Transport_K_ou_Eps_base::discretiser "<<finl;
113 DoubleTab& K_ou_Eps = le_champ_->valeurs();
118 size = le_champ_->equation().domaine_dis().domaine().nb_elem();
121 Cerr <<
"Unsupported K_ou_Eps field in Transport_K_ou_Eps_base::controler_variable()" << finl;
147 const IntTab& elem_faces = domaine_vf.
elem_faces();
154 Debog::verifier(
"Transport_K_ou_Eps_base::controler_variable before",K_ou_Eps);
155 for (
int n=0; n<size; n++)
157 double& var = K_ou_Eps(n);
160 neg[0] += ( var<0 ? 1 : 0);
163 position+=(
Nom)domaine_vf.
xv(n,0);
165 position+=(
Nom)domaine_vf.
xv(n,1);
169 position+=(
Nom)domaine_vf.
xv(n,2);
174 int nb_faces_elem = elem_faces.
line_size();
178 for (
int i=0; i<2; i++)
180 int elem = face_voisins(n,i);
182 for (
int j=0; j<nb_faces_elem; j++)
185 double& var_face = K_ou_Eps(elem_faces(elem,j));
186 if (var_face > Le_MIN)
198 position+=(
Nom)domaine_vf.
xp(n,0);
200 position+=(
Nom)domaine_vf.
xp(n,1);
204 position+=(
Nom)domaine_vf.
xp(n,2);
209 if (nvar!=0) var /= nvar;
214 Cerr << (control ?
"***Warning***: " :
"***Error***: ");
215 Cerr <<
"k or eps forced to " << var <<
" on node " << n <<
" : " << position << finl;
227 position+=(
Nom)domaine_vf.
xv(n,0);
229 position+=(
Nom)domaine_vf.
xv(n,1);
233 position+=(
Nom)domaine_vf.
xv(n,2);
240 position+=(
Nom)domaine_vf.
xp(n,0);
242 position+=(
Nom)domaine_vf.
xp(n,1);
246 position+=(
Nom)domaine_vf.
xp(n,2);
254 Cerr << (control ?
"***Warning***: " :
"***Error***: ");
256 Cerr <<
"eps forced to " << var <<
" on node " << n <<
" : " << position << finl;
269 const double time = le_champ_->temps();
270 Cerr <<
"Values forced for k or eps because:" << finl;
272 Cerr <<
"Negative values found for k or eps on " << neg[0] <<
"/" << size_tot <<
" nodes at time " << time
275 double ratio_var = 100. * neg[0] / size_tot;
276 if ( ( ratio_var > 0.01 ) && !lquiet)
278 Cerr <<
"It is possible your initial and/or boundary conditions on k or eps are wrong." << finl;
279 Cerr <<
"Check the initial and boundary values for k and eps by using:" << finl;
280 Cerr <<
"k~" << (
dimension == 2 ?
"" :
"3/2*") <<
"(t*U)^2 (t turbulence rate, U mean velocity) ";
282 <<
"and eps~Cmu^0.75 k^1.5/l with l turbulent length scale and Cmu a k-eps model parameter whose value is typically given as 0.09."
284 Cerr <<
"See explanations here: http://www.esi-cfd.com/esi-users/turb_parameters/" << finl;
286 <<
"Remark : by giving the velocity field (u) and the hydraulic diameter (d), by using boundary_field_uniform_keps_from_ud and field_uniform_keps_from_ud, "
289 <<
"respectively for boudnaries and initial conditions, TRUST will determine automatically values for k and eps."
294 <<
"Please, don't forget (sorry for this TRUST syntax weakness) that when using Quasi-Compressible module"
297 <<
"the unknowns for which you define initial and boundary conditions are rho*k and rho*eps."
302 if (!control && !lquiet)
306 Cerr <<
"The problem is postprocessed in order to find the nodes where K or Eps values go below 0."
316 const double time = le_champ_->temps();
317 Cerr <<
"Values forced for eps because:" << finl;
318 Cerr <<
"Maximum values found for eps on " << neg[1] <<
"/" << size_tot <<
" nodes at time " << time
323 Debog::verifier(
"Transport_K_ou_Eps_base::controler_variable after",K_ou_Eps);
366 if (((ch.
temps() != le_champ_->temps()) || (ch.
temps() == temps_init)))
377 throw std::runtime_error(std::string(
"Field ") + nom.
getString() + std::string(
" not found !"));
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
void mettre_a_jour(double temps) override
Mise a jour en temps du champ.
: class Champ_Inc_P0_base
classe Champ_base Cette classe est la base de la hierarchie des champs.
double temps() const
Renvoie le temps du champ.
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
double xv(int num_face, int k) 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
double xp(int num_elem, int k) const
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.
int calculate_time_derivative() const
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
int limpr() const
Demande au schema en temps si il faut effectuer une impression.
void creer_champ(const Motcle &motlu) override
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_EPS_MAX() const
double get_EPS_MIN() const
Une chaine de caractere (Nom) en majuscules.
class Nom Une chaine de caractere pour nommer les objets de TRUST
const std::string & getString() const
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 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.
int postraiter(int force=1) override
Si force=1, effectue le postraitement sans tenir compte des frequences de postraitement.
static void mp_sum_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
double temps_init() const
Renvoie le temps initial.
Classe de base des flux de sortie.
_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.
OBS_PTR(Milieu_base) le_fluide
Classe de base pour l'equation de transport des modeles k_Epsilon dans une approche ou K et Epsilon s...
void discretiser() override
Discretise l'equation.
void valider_iteration() override
on remet eps et K positifs
const Champ_base & get_champ(const Motcle &nom) const override
void set_param(Param ¶m) const override
virtual int controler_variable()
Controle le champ inconnue K-epsilon en forcant a zero les valeurs du champ.
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override