16#include <Modele_turbulence_scal_base.h>
17#include <Modele_turbulence_hyd_base.h>
18#include <Navier_Stokes_std.h>
19#include <Op_Dift_VEF_base.h>
20#include <Domaine_Cl_VEF.h>
31 le_modele_turbulence = mod;
38 if (le_modele_turbulence->utiliser_loi_paroi())
41 const DoubleTab& tab = le_modele_turbulence->loi_paroi().Cisaillement_paroi();
51 inconnue_ = ch_transporte;
74 Cerr <<
"Error in Op_Dift_VEF_base::completer() " << finl;
76 Cerr <<
"instead of being associated to an equation dedicated to a turbulent flow." << finl;
84 int nb_elem = le_dom_VEF.
nb_elem();
89 DoubleArrView borne_visco_turb = tab_borne_visco_turb.view_rw();
90 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_elem, KOKKOS_LAMBDA(
const int elem)
92 double h_inv = 1. / carre_pas_maille(elem);
94 double diffu_elem = (flag ? diffu(elem, 0) : diffu(0, 0));
95 double coef = 1. / (2 * (dt_conv + DMINFLOAT) * dim * h_inv * dt_diff_sur_dt_conv) - diffu_elem;
96 if (coef > 0 && coef < borne_visco_turb(elem))
97 borne_visco_turb(elem) = coef;
99 end_gpu_timer(__KERNEL_NAME__);
111 DoubleTrav tab_diffu_turb;
113 DoubleTrav tab_diffu;
118 double rhocp = mon_equation->domaine_dis().nb_elem() > 0 ? mon_equation->milieu().capacite_calorifique().valeurs()(0, 0) * mon_equation->milieu().masse_volumique().valeurs()(0, 0) : 1.0;
119 tab_diffu_turb /= rhocp;
126 double dt_stab = 1.e30;
127 CDoubleTabView diffu = tab_diffu.
view_ro();
128 CDoubleArrView diffu_turb =
static_cast<const DoubleVect&
>(tab_diffu_turb).view_ro();
134 CDoubleArrView rho_elem =
static_cast<const DoubleVect&
>(tab_rho_elem).view_ro();
135 Kokkos::parallel_reduce(start_gpu_timer(__KERNEL_NAME__),
136 Kokkos::RangePolicy<>(0, le_dom_nb_elem), KOKKOS_LAMBDA(
137 const int num_elem,
double& dtstab)
139 double alpha = diffu(num_elem, 0) + diffu_turb(num_elem);
140 alpha /= rho_elem(num_elem);
141 double coef = carre_pas_maille(num_elem) / (deux_dim * (alpha + DMINFLOAT));
142 if (coef < dtstab) dtstab = coef;
143 }, Kokkos::Min<double>(dt_stab));
148 const int nb_comp = tab_valeurs_diffusivite.
line_size(), cD = (tab_valeurs_diffusivite.
dimension(0) == 1);
149 CDoubleTabView valeurs_diffusivite = tab_valeurs_diffusivite.
view_ro();
150 Kokkos::parallel_reduce(start_gpu_timer(__KERNEL_NAME__),
151 Kokkos::RangePolicy<>(0, le_dom_nb_elem), KOKKOS_LAMBDA(
152 const int num_elem,
double& dtstab)
154 for (
int nc = 0; nc < nb_comp; nc++)
156 double alpha = diffu(num_elem, nc) + diffu_turb(num_elem);
157 const double valeurs_diffusivite_dt = valeurs_diffusivite(!cD * num_elem, nc);
158 alpha *= valeurs_diffusivite_dt / (diffu(num_elem, nc) + DMINFLOAT);
159 double coef = carre_pas_maille(num_elem) / (deux_dim * (alpha + DMINFLOAT));
160 if (coef < dtstab) dtstab = coef;
162 }, Kokkos::Min<double>(dt_stab));
164 end_gpu_timer(__KERNEL_NAME__);
174 DoubleTab& es_valeurs = espace_stockage.
valeurs();
181 const Domaine& le_dom = le_dom_VEF.
domaine();
183 double alpha = -123., coef = -123.;
184 ToDo_Kokkos(
"critical");
186 int le_dom_nb_elem = le_dom.
nb_elem();
191 for (
int num_elem = 0; num_elem < le_dom_nb_elem; num_elem++)
193 alpha =
nu_[num_elem] + diffu_turb[num_elem];
194 alpha /= rho_elem[num_elem];
196 es_valeurs(num_elem) = coef;
202 const DoubleTab& valeurs_diffusivite = champ_diffusivite.
valeurs();
203 const int cD = (valeurs_diffusivite.
dimension(0) == 1);
204 for (
int num_elem = 0; num_elem < le_dom_nb_elem; num_elem++)
206 const double valeurs_diffusivite_dt = valeurs_diffusivite(!cD * num_elem);
207 alpha =
nu_[num_elem] + diffu_turb[num_elem];
208 alpha *= valeurs_diffusivite_dt /
nu_[num_elem];
210 es_valeurs(num_elem) = coef;
226 const IntTab& elem_faces = domaine_VEF.
elem_faces();
227 const DoubleTab& face_normales = domaine_VEF.
face_normales();
232 double dt_stab = 1.e30, coef, diffu2_;
233 ToDo_Kokkos(
"critical");
235 for (
int num_elem = 0; num_elem < le_dom_nb_elem; num_elem++)
237 double surf_max = 1.e-30;
238 for (
int i = 0; i < nb_faces_elem; i++)
240 const int num_face = elem_faces(num_elem, i);
241 double surf = face_normales(num_face, 0) * face_normales(num_face, 0);
243 surf += face_normales(num_face, j) * face_normales(num_face, j);
244 surf_max = (surf > surf_max) ? surf : surf_max;
246 double vol = volumes(num_elem);
247 vol *= vol / surf_max;
248 diffu2_ = diffu + diffu_turb[num_elem];
249 coef = vol / (2. *
dimension * (diffu2_ + DMINFLOAT));
250 dt_stab = (coef < dt_stab) ? coef : dt_stab;
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
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
const DoubleVect & carre_pas_maille() const
virtual double face_normales(int face, int comp) const
double volumes(int i) 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
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,...
virtual const RefObjU & get_modele(Type_modele type) const
Classe Modele_turbulence_hyd_base Cette classe sert de base a la hierarchie des classes.
const Champ_Fonc_base & viscosite_turbulente() const
Classe Modele_turbulence_scal_base Cette classe represente un modele de turbulence pour une equation ...
const Champ_Fonc_base & conductivite_turbulente() const
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Une chaine de caractere (Nom) en majuscules.
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
class Nom Une chaine de caractere pour nommer les objets de TRUST
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.
const Champ_Fonc_base & diffusivite_turbulente() const
void associer_diffusivite_turbulente(const Champ_Fonc_base &)
void calculer_pour_post(Champ_base &espace_stockage, const Nom &option, int comp) const override
virtual void remplir_nu(DoubleTab &) const
const Domaine_VEF & domaine_vef() const
void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &) override
void mettre_a_jour(double temps) override
DOES NOTHING - to override in derived classes.
void completer() override
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
const Champ_base & diffusivite() const override
void calculer_borne_locale(DoubleVect &, double, double) const override
double calculer_dt_stab() const override
Calcul dt_stab.
double calculer_dt_stab_P1NCP1B() const
void associer_modele_turbulence(const Modele_turbulence_hyd_base &)
void calculer_pour_post(Champ_base &espace_stockage, const Nom &option, int comp) const override
virtual const Champ_base & diffusivite_pour_pas_de_temps() const
Renvoie le champ_don correspondant a la vraie diffusivite du milieu qui sert pour le calcul du pas de...
virtual void completer()
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
static double mp_min(double)
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
virtual const Champ_base & get_champ_masse_volumique() const
Renvoie le champ de masse volumique.
virtual int has_champ_masse_volumique() const
Renvoie 1 si la masse volumique a ete associee, 0 sinon.
_SIZE_ size_array() const
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
_SIZE_ dimension(int d) const
const Objet_U & valeur() const