16#include <Source_Transport_K_Omega_VDF_Elem.h>
17#include <Modele_turbulence_hyd_K_Omega.h>
18#include <Pb_Hydraulique_Turbulent.h>
19#include <Discretisation_tools.h>
20#include <Navier_Stokes_std.h>
21#include <Milieu_base.h>
23#include <VDF_discretisation.h>
24#include <Champ_Fonc_Face_VDF.h>
25#include <K_Omega_Eps_constants.h>
26#include <Fluide_base.h>
27#include <Expert_mode_K_Omega.h>
28#include <Dirichlet_paroi_defilante.h>
29#include <Dirichlet_paroi_fixe.h>
32 "Source_Transport_K_Omega_VDF_P0_VDF",
50 noms_compris.add(
"grad_k_grad_omega");
52 if (opt == DESCRIPTION)
53 Cerr <<
que_suis_je() <<
" : " << noms_compris << finl;
55 nom.add(noms_compris);
86 if (
"production_omega" && !production_omega_elem_)
91 else if (
"dissipation_k" && !dissipation_k_elem_)
96 else if (
"dissipation_omega" && !dissipation_omega_elem_)
101 else if (
"cross_diffusion_k_omega" && !cross_diffusion_k_omega_elem_)
103 dis.
discretiser_champ(
"champ_elem",
equation().domaine_dis(),
"cross_diffusion_k_omega",
"", 1,
equation().schema_temps().temps_courant(), cross_diffusion_k_omega_elem_);
120 return eqn_K_Omega->modele_turbulence().viscosite_turbulente().valeurs();
125 const DoubleTab& K_Omega = eqn_K_Omega->inconnue().valeurs();
132 const DoubleVect& volumes = le_dom_VDF->volumes();
133 const DoubleVect& porosite_vol = le_dom_Cl_VDF->equation().milieu().porosite_elem();
134 const DoubleTab& K_Omega = eqn_K_Omega->inconnue().valeurs();
135 const bool is_SST_or_BSL = turbulence_model->is_SST_or_BSL();
136 const bool is_SST = turbulence_model->is_SST();
137 const double LeK_MIN = eqn_K_Omega->modele_turbulence().get_K_MIN();
138 const DoubleTab& gradKgradOmega_elem = grad_k_omega_elem_->valeurs();
139 DoubleTab production_omega_elem, dissipation_k_elem, dissipation_omega_elem, cross_diffusion_k_omega_elem;
141 const bool has_post_production_omega =
has_champ(
"production_omega") ;
142 const bool has_post_dissipation_k =
has_champ(
"dissipation_k") ;
143 const bool has_post_dissipation_omega =
has_champ(
"dissipation_omega") ;
144 const bool has_post_cross_diffusion_k_omega =
has_champ(
"cross_diffusion_k_omega") ;
146 if (has_post_production_omega)
147 production_omega_elem = ref_cast_non_const(DoubleTab, production_omega_elem_->valeurs());
149 if (has_post_dissipation_k)
150 dissipation_k_elem = ref_cast_non_const(DoubleTab, dissipation_k_elem_->valeurs());
152 if (has_post_dissipation_omega)
153 dissipation_omega_elem = ref_cast_non_const(DoubleTab, dissipation_omega_elem_->valeurs());
155 if (has_post_cross_diffusion_k_omega)
156 cross_diffusion_k_omega_elem = ref_cast_non_const(DoubleTab, cross_diffusion_k_omega_elem_->valeurs());
158 const DoubleTab& enstrophy_or_strain_invariant =
static_cast<const DoubleTab&
>(turbulence_model->get_expert_mode().get_menter_version()==Menter_version::ORIGINAL_1994 ?
159 turbulence_model->get_enstrophy() : turbulence_model->get_strain_invariant());
160 const DoubleTab& F1 = turbulence_model->get_tabF1();
161 const DoubleTab& F2 = turbulence_model->get_tabF2();
162 const double& gamma1 = turbulence_model->get_expert_mode().get_gamma1();
163 const double& gamma2 = turbulence_model->get_expert_mode().get_gamma2();
164 for (
int elem = 0; elem < le_dom_VDF->nb_elem(); ++elem)
166 const double tke = K_Omega(elem, 0);
167 const double omega = K_Omega(elem, 1);
168 const double volporo = volumes(elem)*porosite_vol(elem);
169 const double dissipation_k = BETA_K*tke*omega;
170 resu(elem, 0) += (production_k(elem) - dissipation_k)*volporo;
174 const double cALPHA = is_SST_or_BSL
175 ?
blender(gamma1, gamma2, elem)
177 const double cBETA = is_SST_or_BSL
183 cSIGMA = 2*(1 - F1(elem))*SIGMA_OMEGA2;
185 cSIGMA = (gradKgradOmega_elem(elem) > 0) ? 0.125 : 0.;
187 double contrib { 0 };
188 const double& CST_A1 = turbulence_model->get_CST_A1();
189 const double nut = is_SST ? tke * CST_A1 /std::max(CST_A1*omega, enstrophy_or_strain_invariant[elem]*F2[elem]) : tke/omega;
190 const double production_omega = cALPHA * production_k(elem) / nut;
191 const double dissipation_omega = cBETA * omega * omega;
192 const double cross_diffusion_k_omega = cSIGMA / omega * gradKgradOmega_elem(elem);
194 contrib += production_omega;
195 contrib -= dissipation_omega;
196 contrib += cross_diffusion_k_omega;
198 resu(elem, 1) += contrib;
200 if (has_post_dissipation_k)
201 dissipation_k_elem(elem) = dissipation_k;
203 if (has_post_production_omega)
204 production_omega_elem(elem) = production_omega;
206 if (has_post_dissipation_omega)
207 dissipation_omega_elem(elem) = dissipation_omega;
209 if (has_post_cross_diffusion_k_omega)
210 cross_diffusion_k_omega_elem(elem) = cross_diffusion_k_omega;
220 Matrice_Morse* mat = matrices.count(nom_inco) ? matrices.at(nom_inco) :
nullptr;
224 const DoubleVect& porosite = le_dom_Cl_VDF->equation().milieu().porosite_elem(), &volumes = le_dom_VDF->volumes();
228 const DoubleTab& gradKgradOmega_elem = grad_k_omega_elem_->valeurs();
229 const DoubleVect& production_TKE = production_k_elem_->valeurs();
230 const double& gamma1 = turbulence_model->get_expert_mode().get_gamma1();
231 const double& gamma2 = turbulence_model->get_expert_mode().get_gamma2();
232 for (
int c = 0; c < size; ++c)
235 if (K_Omega(c, 0) > DMINFLOAT)
237 const double tke = K_Omega(c, 0);
238 const double omega = K_Omega(c, 1);
241 double coef_k = porosite(c)*volumes(c)*BETA_K*omega;
242 (*mat)(c*2, c*2) += coef_k;
243 const double cALPHA = turbulence_model->is_SST_or_BSL()
247 const double cBETA = turbulence_model->is_SST_or_BSL()
252 if (turbulence_model->is_SST_or_BSL())
253 cSIGMA = 2*(1 - turbulence_model->get_tabF1()(c))*SIGMA_OMEGA2;
255 cSIGMA = (gradKgradOmega_elem(c) > 0) ? 0.125 : 0.;
257 const double coef_omega = (-cALPHA*production_TKE(c)/tke
259 + cSIGMA/(omega*omega)*gradKgradOmega_elem(c) ) * porosite(c)*volumes(c);
260 (*mat)(c*2 + 1, c*2 + 1) += coef_omega;
267 const int nb_elem_tot = le_dom_VDF->nb_elem_tot();
268 const int nb_elem = le_dom_VDF->nb_elem();
269 DoubleTab& gradKgradOmega_elem = ref_cast_non_const(DoubleTab, grad_k_omega_elem_->valeurs());
270 const DoubleTab& K_Omega = eqn_K_Omega->inconnue().valeurs();
274 enerK.
resize(nb_elem_tot,1);
275 omega.
resize(nb_elem_tot,1);
276 for (
int elem = 0; elem < nb_elem_tot; ++elem)
278 enerK(elem,0) = K_Omega(elem, 0);
279 omega(elem,0) = K_Omega(elem, 1);
280 gradKgradOmega_elem(elem) = 0;
284 const Operateur_Grad& Op_Grad_komega = eqn_K_Omega->gradient_operator_komega();
285 DoubleTab& gradK_face = ref_cast_non_const(DoubleTab, grad_k_face_->valeurs());
286 DoubleTab& gradOmega_face = ref_cast_non_const(DoubleTab, grad_omega_face_->valeurs());
287 Op_Grad_komega.
calculer(enerK, gradK_face);
288 Op_Grad_komega.
calculer(omega, gradOmega_face);
291 const Domaine_dis_base& domaine_dis = mon_equation->inconnue().domaine_dis_base();
292 DoubleTab& tab_gradK_elem = ref_cast_non_const(DoubleTab, grad_k_elem_->valeurs());
293 DoubleTab& tab_gradOmega_elem = ref_cast_non_const(DoubleTab, grad_omega_elem_->valeurs());
295 grad_k_face_->valeur_aux_centres_de_gravite(domaine_dis.
domaine(), tab_gradK_elem);
296 grad_omega_face_->valeur_aux_centres_de_gravite(domaine_dis.
domaine(), tab_gradOmega_elem);
300 for (
int elem = 0; elem < nb_elem; ++elem)
302 gradKgradOmega_elem(elem) += tab_gradK_elem(elem,dim) * tab_gradOmega_elem(elem,dim);
309 const DoubleTab& K_Omega = eqn_K_Omega->inconnue().valeurs();
310 const DoubleTab& distmin = le_dom_VDF->y_elem();
311 DoubleTab& gradKgradOmega_elem = ref_cast_non_const(DoubleTab, grad_k_omega_elem_->valeurs());
315 DoubleTab& tabF1 = ref_cast_non_const(DoubleTab, turbulence_model->get_tabF1());
316 DoubleTab& tabF2 = ref_cast_non_const(DoubleTab, turbulence_model->get_tabF2());
317 const double& cst_min_cd_komega = turbulence_model->get_expert_mode().get_cst_cd_komega();
319 for (
int elem = 0; elem < le_dom_VDF->nb_elem(); ++elem)
321 double const dmin = std::max(distmin(elem), 1e-12);
322 double const enerK = K_Omega(elem, 0);
323 double const omega = K_Omega(elem, 1);
324 double const tmp1 = sqrt(enerK)/(BETA_K*omega*dmin);
325 double const tmp2 = 500.0*kinematic_viscosity/(omega*dmin*dmin);
326 double const maxval = std::max(2.*SIGMA_OMEGA2*gradKgradOmega_elem(elem)/omega,cst_min_cd_komega);
327 double const tmp3 = 4.0*SIGMA_OMEGA2*enerK/(maxval*dmin*dmin);
329 double const arg1 = std::min(std::max(tmp1, tmp2), tmp3);
330 tabF1(elem) = std::tanh(arg1*arg1*arg1*arg1);
331 double const arg2 = std::max(2.*tmp1, tmp2);
332 tabF2(elem) = std::tanh(arg2*arg2);
336 for (
int i = 0; i < le_dom_Cl_VDF->nb_cond_lim(); i++)
338 const Cond_lim_base& boundary_condition = le_dom_Cl_VDF->les_conditions_limites(i).valeur();
345 int end = start + the_edge.
nb_faces();
346 for (
int num_elem=start; num_elem<end; num_elem++)
348 tabF1(num_elem) = 1.0;
349 tabF1(num_elem) = 1.0;
358 int const elem)
const
360 const DoubleTab& F1 = turbulence_model->get_tabF1();
361 return F1(elem)*val1 + (1 - F1(elem))*val2;
DoubleVect & calculer_terme_production_K_for_komega(const Domaine_VDF &, const Domaine_Cl_VDF &, DoubleVect &, const DoubleTab &, const DoubleTab &, const Champ_Face_VDF &, const DoubleTab &, const bool deactivate_production_limiter, const double cst_production_limiter) const
DoubleVect & calculer_terme_production_K_Axi(const Domaine_VDF &, const Champ_Face_VDF &, DoubleVect &, const DoubleTab &, const DoubleTab &) const
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
class Champ_Face_VDF Cette classe sert a representer un champ vectoriel dont on ne calcule
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual void creer_champ(const Motcle &motlu)=0
virtual void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const =0
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
classe Dirichlet_paroi_defilante Impose la vitesse de paroi dnas une equation de type Navier_Stokes.
classe Dirichlet_paroi_fixe Represente une paroi immobile dans une equation de type Navier_Stokes.
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
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,...
const Discretisation_base & discretisation() const
Renvoie la discretisation associee a l'equation.
virtual const Champ_Inc_base & inconnue() const =0
const Nom & le_nom() const override
Renvoie le nom du champ.
const Champ_Don_base & viscosite_cinematique() const
int num_premiere_face() const
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
Classe Modele_turbulence_hyd_K_Omega Cette classe represente le modele de turbulence (k,...
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
const Fluide_base & fluide() const
Renvoie le fluide incompressible (milieu physique de l'equation) associe a l'equation.
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.
Classe Operateur_Grad Classe generique de la hierarchie des operateurs calculant le gradient.
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
Initialise le tableau passe en parametre avec la contribution de l'operateur.
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
Classe de base des flux de sortie.
void associer_pb(const Probleme_base &) override
DoubleTab & ajouter_komega(DoubleTab &) const
class Source_Transport_K_Omega_VDF_Elem Cette classe represente le terme source qui figure dans l'equ...
void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl) const override
void associer_pb(const Probleme_base &pb) override
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
const DoubleTab & get_visc_turb() const override
void discretiser() override
void compute_blending_F1() const override
double blender(double const val1, double const val2, int const elem) const
void fill_resu(const DoubleVect &, DoubleTab &) const override
void compute_cross_diffusion() const override
void calculer_terme_production(const Champ_Face_VDF &, const DoubleTab &, const DoubleTab &, DoubleVect &, const bool &deactivate_production_limiter, const double &cst_production_limiter) const override
void creer_champ(const Motcle &) override
Champs_compris champs_compris_
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
int controler_K_Omega()
Controle le champ inconnue K-Omega en forcant a zero les valeurs du champ.
classe Transport_K_Omega Cette classe represente l'equation de transport de l'energie cinetique
void verifier_pb_komega(const Probleme_base &, const Nom &)