TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Modele_turbulence_hyd_K_Eps_Bicephale.cpp
1/****************************************************************************
2* Copyright (c) 2019, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#include <Modele_turbulence_hyd_K_Eps_Bicephale.h>
17#include <Modifier_pour_fluide_dilatable.h>
18#include <Modele_turbulence_scal_base.h>
19#include <Schema_Temps_base.h>
20#include <Champ_Inc_P0_base.h>
21#include <Champ_Uniforme.h>
22#include <communications.h>
23#include <Perf_counters.h>
24#include <Probleme_base.h>
25#include <Fluide_base.h>
26#include <TRUSTTrav.h>
27#include <Param.h>
28#include <Debog.h>
29
30Implemente_instanciable(Modele_turbulence_hyd_K_Eps_Bicephale, "Modele_turbulence_hyd_K_Epsilon_Bicephale", Modele_turbulence_hyd_RANS_Bicephale_base);
31// XD K_Epsilon_Bicephale mod_turb_hyd_rans_bicephale K_Epsilon_Bicephale INHERITS_BRACE Turbulence model (k-eps) en
32// XD_CONT formalisation bicephale.
33
35
37
39{
41 param.ajouter_non_std("Modele_Fonc_Bas_Reynolds", (this)); // XD_ADD_P Modele_Fonc_Realisable_base
42 // XD_CONT This keyword is used to set the model used
43 param.ajouter("CMU", &LeCmu_); // XD_ADD_P floattant
44 // XD_CONT Keyword to modify the Cmu constant of k-eps model : Nut=Cmu*k*k/eps Default value is 0.09
45}
46
48{
49 if (mot == "Modele_Fonc_Bas_Reynolds")
50 {
51 Cerr << "Lecture du modele bas reynolds associe " << finl;
53 mon_modele_fonc_->associer_eqn_2(get_set_eq_transp_Eps());
54 Cerr << "mon_modele_fonc.que_suis_je() avant discretisation " << mon_modele_fonc_->que_suis_je() << finl;
55 mon_modele_fonc_->discretiser();
56 Cerr << "mon_modele_fonc.que_suis_je() " << mon_modele_fonc_->que_suis_je() << finl;
57 mon_modele_fonc_->lire_distance_paroi();
58 return 1;
59 }
60 else
62}
63
64/*! @brief Calcule la viscosite turbulente au temps demande.
65 *
66 * @param (double temps) le temps auquel il faut calculer la viscosite
67 * @return (Champ_Fonc_base&) la viscosite turbulente au temps demande
68 * @throws erreur de taille de visco_turb_K_eps
69 */
71{
72 const Champ_base& chK = get_eq_transp_K().inconnue(), &chEps = get_eq_transp_Eps().inconnue();
73 const Domaine_dis_base& le_dom_dis = get_eq_transp_K().domaine_dis();
74 const Domaine_Cl_dis_base& le_dom_Cl_dis = get_eq_transp_K().domaine_Cl_dis();
75
76 const Nom& type = chK.que_suis_je();
77 const DoubleTab& tab_K = chK.valeurs(), &tab_Eps = chEps.valeurs();
78
79 DoubleTab& visco_turb = la_viscosite_turbulente_->valeurs();
80
81 DoubleTrav Cmu(tab_K.dimension_tot(0));
82 Cmu = 0.;
83
84 int n = tab_K.dimension(0);
85 if (n < 0)
86 {
87 if (sub_type(Champ_Inc_P0_base, chK))
89 else
90 {
91 Cerr << "Unsupported K field in Modele_turbulence_hyd_K_Eps_Bicephale::calculer_viscosite_turbulente" << finl;
92 Process::exit(-1);
93 }
94 if (sub_type(Champ_Inc_P0_base, chEps))
96 else
97 {
98 Cerr << "Unsupported epsilon field in Modele_turbulence_hyd_K_Eps_Bicephale::calculer_viscosite_turbulente" << finl;
99 Process::exit(-1);
100 }
101 }
102
103 DoubleTrav Fmu, D(tab_K.dimension_tot(0));
104 D = 0;
105 if (mon_modele_fonc_)
106 {
107 // pour avoir nu en incompressible et mu en QC
108 // et non comme on a divise K et eps par rho (si on est en QC) on veut toujours nu
109 const OWN_PTR(Champ_Don_base) ch_visco = ref_cast(Fluide_base,get_eq_transp_K().milieu()).viscosite_cinematique();
110 const Champ_Don_base& ch_visco_cin = ref_cast(Fluide_base,get_eq_transp_K().milieu()).viscosite_cinematique();
111
112 const DoubleTab& tab_visco = ch_visco_cin.valeurs();
113
114 Fmu.resize(tab_K.dimension_tot(0));
115
116 mon_modele_fonc_->Calcul_Fmu_BiK(Fmu, le_dom_dis, le_dom_Cl_dis, tab_K, tab_Eps, ch_visco);
117
118 int is_Cmu_constant = mon_modele_fonc_->Calcul_is_Cmu_constant();
119 if (is_Cmu_constant == 0)
120 {
121 Cerr << " On utilise un Cmu non constant " << finl;
122 const DoubleTab& vitesse = mon_equation_->inconnue().valeurs();
123 mon_modele_fonc_->Calcul_Cmu_BiK(Cmu, le_dom_dis, le_dom_Cl_dis, vitesse, tab_K, tab_Eps, EPS_MIN_);
124
125 /*Paroi*/
127 if (lp != "negligeable_VEF")
128 {
129 DoubleTab visco_tab(visco_turb.dimension_tot(0));
130 assert(sub_type(Champ_Uniforme,ch_visco_cin));
131 visco_tab = tab_visco(0, 0);
132 const int idt = mon_equation_->schema_temps().nb_pas_dt();
133 const DoubleTab& tab_paroi = loi_paroi().Cisaillement_paroi();
134 mon_modele_fonc_->Calcul_Cmu_Paroi_BiK(Cmu, le_dom_dis, le_dom_Cl_dis, visco_tab, visco_turb, tab_paroi, idt, vitesse, tab_K, tab_Eps, EPS_MIN_);
135 }
136 }
137 else
138 Cerr << " On utilise un Cmu constant " << finl;
139 }
140
141 // dans le cas d'un domaine nul on doit effectuer le dimensionnement
142 double non_prepare = 1;
143 Debog::verifier("Modele_turbulence_hyd_K_Eps_Bicephale::calculer_viscosite_turbulente la_viscosite_turbulente before", la_viscosite_turbulente_->valeurs());
144 Debog::verifier("Modele_turbulence_hyd_K_Eps_Bicephale::calculer_viscosite_turbulente tab_K", tab_K);
145 Debog::verifier("Modele_turbulence_hyd_K_Eps_Bicephale::calculer_viscosite_turbulente tab_Eps", tab_Eps);
146 if (visco_turb.size() == n)
147 non_prepare = 0.;
148 non_prepare = mp_max(non_prepare);
149
150 if (non_prepare == 1)
151 {
152 OWN_PTR(Champ_Inc_base) visco_turb_au_format_K_eps;
153 visco_turb_au_format_K_eps.typer(type);
154 DoubleTab& visco_turb_K_eps = complete_viscosity_field(n, get_eq_transp_K().domaine_dis(), visco_turb_au_format_K_eps);
155
156 if (visco_turb_K_eps.size() != n)
157 {
158 Cerr << "visco_turb_K_eps size is " << visco_turb_K_eps.size() << " instead of " << n << finl;
160 }
161 // A la fin de cette boucle, le tableau visco_turb_K_eps contient les valeurs de la viscosite turbulente
162 // au centre des faces du maillage.
163 fill_turbulent_viscosity_tab(n, tab_K, tab_Eps, Cmu, Fmu, D, visco_turb_K_eps);
164
165 // On connait donc la viscosite turbulente au centre des faces de chaque element
166 // On cherche maintenant a interpoler cette viscosite turbulente au centre des elements.
167 la_viscosite_turbulente_->affecter(visco_turb_au_format_K_eps.valeur());
168 Debog::verifier("Modele_turbulence_hyd_K_Eps_Bicephale::calculer_viscosite_turbulente visco_turb_au_format_K_eps", visco_turb_au_format_K_eps.valeur());
169 }
170 else
171 fill_turbulent_viscosity_tab(n, tab_K, tab_Eps, Cmu, Fmu, D, visco_turb);
172
173 la_viscosite_turbulente_->changer_temps(temps);
174 Debog::verifier("Modele_turbulence_hyd_K_Eps_Bicephale::calculer_viscosite_turbulente la_viscosite_turbulente after", la_viscosite_turbulente_->valeurs());
175 return la_viscosite_turbulente_;
176}
177
178void Modele_turbulence_hyd_K_Eps_Bicephale::fill_turbulent_viscosity_tab(const int n, const DoubleTab& tab_K, const DoubleTab& tab_Eps, const DoubleTab& Cmu, const DoubleTab& Fmu, const DoubleTab& D, DoubleTab& turbulent_viscosity)
179{
180 for (int i = 0; i < n; i++)
181 {
182 if (tab_Eps(i) <= EPS_MIN_)
183 {
184 turbulent_viscosity[i] = 0.;
185 }
186 else
187 {
188 if (mon_modele_fonc_)
189 {
190 int is_Cmu_constant = mon_modele_fonc_->Calcul_is_Cmu_constant();
191 if (is_Cmu_constant)
192 turbulent_viscosity[i] = Fmu(i) * LeCmu_ * tab_K(i) * tab_K(i) / (tab_Eps(i) + D(i));
193 else
194 turbulent_viscosity[i] = Fmu(i) * Cmu(i) * tab_K(i) * tab_K(i) / (tab_Eps(i) + D(i));
195 }
196 else
197 turbulent_viscosity[i] = LeCmu_ * tab_K(i) * tab_K(i) / (tab_Eps(i) + D(i));
198 }
199 }
200}
201
203{
207 // GF pour initialiser la loi de paroi thermique en TBLE
208 if (equation().probleme().nombre_d_equations() > 1)
209 {
210 const RefObjU& modele_turbulence = equation().probleme().equation(1).get_modele(TURBULENCE);
211 if (sub_type(Modele_turbulence_scal_base, modele_turbulence.valeur()))
212 {
213 Turbulence_paroi_scal_base& loi_paroi_T = ref_cast_non_const(Modele_turbulence_scal_base,modele_turbulence.valeur()).loi_paroi();
214 loi_paroi_T.init_lois_paroi();
215 }
216 }
217
219 Debog::verifier("Modele_turbulence_hyd_K_Eps_Bicephale::preparer_calcul la_viscosite_turbulente", la_viscosite_turbulente_->valeurs());
220 return 1;
221}
222
227
228/*! @brief Effectue une mise a jour en temps du modele de turbulence.
229 *
230 * Met a jour les equations de transport de K et epsilon,
231 * calcule la viscosite turbulente
232 * au nouveau temps.
233 *
234 * @param (double temps) le temps de mise a jour
235 */
237{
241
242 if (!get_eq_transp_K().equation_non_resolue())
245
246 if (!get_eq_transp_Eps().equation_non_resolue())
247 sch2.faire_un_pas_de_temps_eqn_base(get_set_eq_transp_Eps());
249
250 statistics().begin_count(STD_COUNTERS::turbulent_viscosity, statistics().get_last_opened_counter_level()+1);
251 Debog::verifier("Modele_turbulence_hyd_K_Eps_Bicephale::mettre_a_jour la_viscosite_turbulente before", la_viscosite_turbulente_->valeurs());
253 Debog::verifier("Modele_turbulence_hyd_K_Eps_Bicephale::mettre_a_jour la_viscosite_turbulente after", la_viscosite_turbulente_->valeurs());
254 statistics().end_count(STD_COUNTERS::turbulent_viscosity);
255}
256
257bool Modele_turbulence_hyd_K_Eps_Bicephale::has_champ(const Motcle& nom, OBS_PTR(Champ_base)& ref_champ) const
258{
260 return true;
261
262 if (mon_modele_fonc_)
263 if (mon_modele_fonc_->has_champ(nom, ref_champ))
264 return true;
265
266 return false; /* rien trouve */
267}
268
270{
272 return true;
273
274 if (mon_modele_fonc_)
275 if (mon_modele_fonc_->has_champ(nom))
276 return true;
277
278 return false; /* rien trouve */
279}
280
282{
283 OBS_PTR(Champ_base) ref_champ;
284
286 return ref_champ;
287
288 if (mon_modele_fonc_)
289 if (mon_modele_fonc_->has_champ(nom, ref_champ))
290 return ref_champ;
291
292 throw std::runtime_error(std::string("Field ") + nom.getString() + std::string(" not found !"));
293}
294
296{
298 if (mon_modele_fonc_)
299 mon_modele_fonc_->get_noms_champs_postraitables(nom, opt);
300
301}
303{
304 Nom lp = loipar_->que_suis_je();
305 if (!(lp == "negligeable_VEF" || lp == "negligeable_VDF"))
306 {
307 Cerr << "The turbulence model of type " << que_suis_je() << finl;
308 Cerr << "must be used with a wall law of type negligeable for now." << finl;
309 }
310 if (!associe_modele_fonction())
311 {
312 Cerr << "The turbulence model of type " << que_suis_je() << finl;
313 Cerr << "must be used with a modele fonction for now." << finl;
314 }
315}
classe Champ_Don_base classe de base des Champs donnes (non calcules)
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
: class Champ_Inc_P0_base
Classe Champ_Inc_base.
virtual DoubleTab & valeurs()=0
classe Champ_Uniforme Represente un champ constant dans l'espace et dans le temps.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
static void verifier(const char *const msg, double)
Definition Debog.cpp:21
int_t nb_elem() const
Definition Domaine.h:131
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
virtual void mettre_a_jour(double temps)
Effectue une mise a jour en temps de toutes les conditions aux limites.
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,...
Definition Entree.h:42
virtual const RefObjU & get_modele(Type_modele type) const
virtual void mettre_a_jour(double temps)
La valeur de l'inconnue sur le pas de temps a ete calculee.
virtual int preparer_calcul()
Tout ce qui ne depend pas des autres problemes eventuels.
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
Definition Fluide_base.h:38
static void typer_lire_Modele_Fonc_Bas_Reynolds(OWN_PTR(Modele_Fonc_Bas_Reynolds_Base)&, const Equation_base &, Entree &is)
Classe Modele_turbulence_hyd_K_Eps_Bicephale Cette classe represente le modele de turbulence (k,...
virtual Champ_Fonc_base & calculer_viscosite_turbulente(double temps)
Calcule la viscosite turbulente au temps demande.
OWN_PTR(Modele_Fonc_Bas_Reynolds_Base) &associe_modele_fonction()
void mettre_a_jour(double) override
Effectue une mise a jour en temps du modele de turbulence.
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
int lire_motcle_non_standard(const Motcle &, Entree &) override
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
const Champ_base & get_champ(const Motcle &nom) const override
void fill_turbulent_viscosity_tab(const int, const DoubleTab &, const DoubleTab &, const DoubleTab &, const DoubleTab &, const DoubleTab &, DoubleTab &)
Classe Modele_turbulence_hyd_RANS_Bicephale_base Classe de base des modeles de type RANS en formulati...
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
Champ_Inc_base & get_set_K()
Renvoie le champ inconnue K du modele de turbulence Cette inconnue est portee.
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
Transport_K_ou_Eps_base & get_set_eq_transp_K()
Renvoie l equation d evolution de K du modele de turbulence.
int lire_motcle_non_standard(const Motcle &, Entree &) override
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
const Transport_K_ou_Eps_base & get_eq_transp_K() const
Renvoie l equation d evolution de K du modele de turbulence (version const).
Transport_K_ou_Eps_base & get_set_eq_transp_Eps()
Renvoie l equation d evolution de epsilon du modele de turbulence.
Champ_Inc_base & get_set_Eps()
Renvoie le champ inconnue epsilon du modele de turbulence Cette inconnue est portee.
OBS_PTR(Equation_base) ma_seconde_equation_
const Transport_K_ou_Eps_base & get_eq_transp_Eps() const
Renvoie l equation d evolution de epsilon du modele de turbulence (version const).
DoubleTab & complete_viscosity_field(const int, const Domaine_dis_base &, Champ_Inc_base &)
std::enable_if_t<(M_TYPE==MODELE_TYPE::K_EPS||M_TYPE==MODELE_TYPE::K_EPS_REALISABLE||M_TYPE==MODELE_TYPE::K_OMEGA), void > calculate_limit_viscosity(Champ_Inc_base &, double)
virtual int preparer_calcul()
Prepare le calcul.
const Turbulence_paroi_base & loi_paroi() const
Equation_base & equation()
Renvoie l'equation associee au modele de turbulence.
Classe Modele_turbulence_scal_base Cette classe represente un modele de turbulence pour une equation ...
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
const std::string & getString() const
Definition Nom.h:92
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Objet_U.cpp:319
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Definition Param.cpp:364
void ajouter_non_std(const char *keyword, const Objet_U *value, Param::Nature nat=Param::OPTIONAL)
Register a keyword handled by Objet_U::lire_motcle_non_standard.
Definition Param.cpp:489
virtual const Equation_base & equation(int) const =0
static double mp_max(double)
Definition Process.cpp:376
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
class Schema_Temps_base
virtual int faire_un_pas_de_temps_eqn_base(Equation_base &)=0
Classe de base des flux de sortie.
Definition Sortie.h:52
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ dimension_tot(int) const override
Definition TRUSTTab.tpp:160
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
_SIZE_ size() const
Definition TRUSTVect.tpp:45
const Objet_U & valeur() const
Definition TRUST_Ref.h:134
const Modele_turbulence_hyd_2_eq_base & modele_turbulence() const
Renvoie le modele de turbulence associe a l'equation.
const Champ_Inc_base & inconnue() const override
Renvoie le champ inconnue de l'equation.
const DoubleTab & Cisaillement_paroi() const
Classe Turbulence_paroi_scal_base Classe de base pour la hierarchie des classes representant les mode...
virtual int init_lois_paroi()=0