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
Overrides Champ_base::valeurs() Returns the array of values.
class Champ_Fonc_base Base class of fields that are functions of a calculated quantity
virtual DoubleTab & valeurs()=0
class Champ_base This class is the base of the fields hierarchy.
int nb_faces_elem(int=0) const
Returns the number of faces of type i of the geometric elements that make up the domain.
class Domaine_Cl_dis_base Domaine_Cl_dis_base objects represent discretized boundary conditions
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
Returns the index of the i-th face of element num_elem; the face numbering convention is.
class Domaine_dis_base This class is the base of the hierarchy of discretized domains.
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
Base class for the turbulence model hierarchy for Navier-Stokes equations.
const Champ_Fonc_base & viscosite_turbulente() const
Base class for scalar turbulence models coupled to a Navier-Stokes convection-diffusion equation.
const Champ_Fonc_base & conductivite_turbulente() const
const Equation_base & equation() const
Returns the reference to the equation pointed to by MorEqn::mon_equation.
A character string (Nom) in uppercase.
Navier_Stokes_std This class carries the terms of the momentum equation.
class Nom: a character string for naming TRUST objects.
const Nom & que_suis_je() const
Returns the string identifying the class.
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
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
Associates the operator with the domaine_dis, the domaine_Cl_dis, and the unknown of its equation.
const Champ_base & diffusivite() const override
void calculer_borne_locale(DoubleVect &, double, double) const override
double calculer_dt_stab() const override
Computes 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
Returns the field corresponding to the true diffusivity of the medium used for the time step computat...
virtual void completer()
Associates the operator with the domaine_dis, the domaine_Cl_dis, and the unknown of its equation.
static double mp_min(double)
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
Base class for output streams.
virtual const Champ_base & get_champ_masse_volumique() const
Returns the density field.
virtual int has_champ_masse_volumique() const
Returns 1 if the density field has been associated, 0 otherwise.
_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