TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Source_Transport_K_Omega_VDF_Elem.cpp
1/****************************************************************************
2* Copyright (c) 2023, 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 <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>
22#include <TRUSTTrav.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>
30
31Implemente_instanciable_sans_constructeur(Source_Transport_K_Omega_VDF_Elem,
32 "Source_Transport_K_Omega_VDF_P0_VDF",
34
36
38{
42 return is;
43}
44
46 Option opt) const
47{
49 Noms noms_compris = champs_compris_.liste_noms_compris();
50 noms_compris.add("grad_k_grad_omega");
51
52 if (opt == DESCRIPTION)
53 Cerr << que_suis_je() << " : " << noms_compris << finl;
54 else
55 nom.add(noms_compris);
56}
58{
59 assert(mon_equation);
61
62 dis.discretiser_champ("champ_elem", equation().domaine_dis(), "grad_k_grad_omega", "", 1, equation().schema_temps().temps_courant(), grad_k_omega_elem_);
63 champs_compris_.ajoute_champ(grad_k_omega_elem_);
64
65 dis.discretiser_champ("gradient_pression", equation().domaine_dis(), "grad_k", "", Objet_U::dimension, equation().schema_temps().temps_courant(), grad_k_face_);
66 champs_compris_.ajoute_champ(grad_k_face_);
67
68 dis.discretiser_champ("gradient_pression", equation().domaine_dis(), "grad_omega", "", Objet_U::dimension, equation().schema_temps().temps_courant(), grad_omega_face_);
69 champs_compris_.ajoute_champ(grad_omega_face_);
70
71
72 dis.discretiser_champ("champ_elem", equation().domaine_dis(), "grad_k_elem", "", Objet_U::dimension, equation().schema_temps().temps_courant(), grad_k_elem_);
73 champs_compris_.ajoute_champ(grad_k_elem_);
74
75 dis.discretiser_champ("champ_elem", equation().domaine_dis(), "grad_omega_elem", "", Objet_U::dimension, equation().schema_temps().temps_courant(), grad_omega_elem_);
76 champs_compris_.ajoute_champ(grad_omega_elem_);
77
78 dis.discretiser_champ("champ_elem", equation().domaine_dis(), "production_k", "", 1, equation().schema_temps().temps_courant(), production_k_elem_);
79 champs_compris_.ajoute_champ(production_k_elem_);
80}
81
83{
85
86 if ("production_omega" && !production_omega_elem_)
87 {
88 dis.discretiser_champ("champ_elem", equation().domaine_dis(), "production_omega", "", 1, equation().schema_temps().temps_courant(), production_omega_elem_);
89 champs_compris_.ajoute_champ(production_omega_elem_);
90 }
91 else if ("dissipation_k" && !dissipation_k_elem_)
92 {
93 dis.discretiser_champ("champ_elem", equation().domaine_dis(), "dissipation_k", "", 1, equation().schema_temps().temps_courant(), dissipation_k_elem_);
94 champs_compris_.ajoute_champ(dissipation_k_elem_);
95 }
96 else if ("dissipation_omega" && !dissipation_omega_elem_)
97 {
98 dis.discretiser_champ("champ_elem", equation().domaine_dis(), "dissipation_omega", "", 1, equation().schema_temps().temps_courant(), dissipation_omega_elem_);
99 champs_compris_.ajoute_champ(dissipation_omega_elem_);
100 }
101 else if ("cross_diffusion_k_omega" && !cross_diffusion_k_omega_elem_)
102 {
103 dis.discretiser_champ("champ_elem", equation().domaine_dis(), "cross_diffusion_k_omega", "", 1, equation().schema_temps().temps_courant(), cross_diffusion_k_omega_elem_);
104 champs_compris_.ajoute_champ(cross_diffusion_k_omega_elem_);
105 }
106 else
108}
109
110
112{
114 eqn_K_Omega = ref_cast(Transport_K_Omega, equation());
115 turbulence_model = ref_cast(Modele_turbulence_hyd_K_Omega, eqn_K_Omega->modele_turbulence());
116}
117
119{
120 return eqn_K_Omega->modele_turbulence().viscosite_turbulente().valeurs();
121}
122
123void Source_Transport_K_Omega_VDF_Elem::calculer_terme_production(const Champ_Face_VDF& vitesse, const DoubleTab& visco_turb, const DoubleTab& vit, DoubleVect& P, const bool& deactivate_production_limiter, const double& cst_production_limiter=0.) const
124{
125 const DoubleTab& K_Omega = eqn_K_Omega->inconnue().valeurs();
126 if (axi) calculer_terme_production_K_Axi(le_dom_VDF.valeur(), vitesse, P, K_Omega, visco_turb);
127 else calculer_terme_production_K_for_komega(le_dom_VDF.valeur(), le_dom_Cl_VDF.valeur(), P, K_Omega, vit, vitesse, visco_turb, deactivate_production_limiter, cst_production_limiter);
128}
129
130void Source_Transport_K_Omega_VDF_Elem::fill_resu(const DoubleVect& production_k, DoubleTab& resu) const
131{
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;
140
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") ;
145
146 if (has_post_production_omega)
147 production_omega_elem = ref_cast_non_const(DoubleTab, production_omega_elem_->valeurs());
148
149 if (has_post_dissipation_k)
150 dissipation_k_elem = ref_cast_non_const(DoubleTab, dissipation_k_elem_->valeurs());
151
152 if (has_post_dissipation_omega)
153 dissipation_omega_elem = ref_cast_non_const(DoubleTab, dissipation_omega_elem_->valeurs());
154
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());
157
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)
165 {
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;
171
172 if (tke >= LeK_MIN)
173 {
174 const double cALPHA = is_SST_or_BSL
175 ? blender(gamma1, gamma2, elem)
176 : ALPHA_OMEGA;
177 const double cBETA = is_SST_or_BSL
178 ? blender(BETA1, BETA2, elem)
179 : BETA_OMEGA;
180
181 double cSIGMA;
182 if (is_SST_or_BSL)
183 cSIGMA = 2*(1 - F1(elem))*SIGMA_OMEGA2;
184 else
185 cSIGMA = (gradKgradOmega_elem(elem) > 0) ? 0.125 : 0.;
186
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; // production EB: with SST, one cannot use k/omega. See the last paragraph of the appendix of Menter, 1994.
191 const double dissipation_omega = cBETA * omega * omega; // dissipation
192 const double cross_diffusion_k_omega = cSIGMA / omega * gradKgradOmega_elem(elem);
193
194 contrib += production_omega; //production
195 contrib -= dissipation_omega; // dissipation
196 contrib += cross_diffusion_k_omega; // cross diffusion
197 contrib *= volporo;
198 resu(elem, 1) += contrib;
199
200 if (has_post_dissipation_k)
201 dissipation_k_elem(elem) = dissipation_k;
202
203 if (has_post_production_omega)
204 production_omega_elem(elem) = production_omega;
205
206 if (has_post_dissipation_omega)
207 dissipation_omega_elem(elem) = dissipation_omega;
208
209 if (has_post_cross_diffusion_k_omega)
210 cross_diffusion_k_omega_elem(elem) = cross_diffusion_k_omega;
211 }
212 }
213}
214
215void Source_Transport_K_Omega_VDF_Elem::ajouter_blocs(matrices_t matrices, DoubleTab& secmem, const tabs_t& semi_impl) const
216{
218
219 const std::string& nom_inco = equation().inconnue().le_nom().getString();
220 Matrice_Morse* mat = matrices.count(nom_inco) ? matrices.at(nom_inco) : nullptr;
221 if(!mat) return;
222
223 const DoubleTab& K_Omega = equation().inconnue().valeurs();
224 const DoubleVect& porosite = le_dom_Cl_VDF->equation().milieu().porosite_elem(), &volumes = le_dom_VDF->volumes();
225 const int size = K_Omega.dimension(0);
226 // on implicite le -eps et le -eps^2/k
227 // cAlan : impliciter omega ?
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)
233 {
234 // -eps*vol donne +vol dans la bonne case
235 if (K_Omega(c, 0) > DMINFLOAT)
236 {
237 const double tke = K_Omega(c, 0);
238 const double omega = K_Omega(c, 1);
239
240 // cAlan : a adapter
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()
244 ? blender(gamma1, gamma2, c)
245 : ALPHA_OMEGA;
246
247 const double cBETA = turbulence_model->is_SST_or_BSL()
248 ? blender(BETA1, BETA2, c)
249 : BETA_OMEGA;
250
251 double cSIGMA;
252 if (turbulence_model->is_SST_or_BSL())
253 cSIGMA = 2*(1 - turbulence_model->get_tabF1()(c))*SIGMA_OMEGA2;
254 else
255 cSIGMA = (gradKgradOmega_elem(c) > 0) ? 0.125 : 0.;
256
257 const double coef_omega = (-cALPHA*production_TKE(c)/tke
258 + 2.*cBETA*omega
259 + cSIGMA/(omega*omega)*gradKgradOmega_elem(c) ) * porosite(c)*volumes(c);
260 (*mat)(c*2 + 1, c*2 + 1) += coef_omega;
261 }
262 }
263}
264
266{
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();
271 DoubleTab enerK; // field on elem
272 DoubleTab omega; // field on elem
273
274 enerK.resize(nb_elem_tot,1);
275 omega.resize(nb_elem_tot,1);
276 for (int elem = 0; elem < nb_elem_tot; ++elem)
277 {
278 enerK(elem,0) = K_Omega(elem, 0);
279 omega(elem,0) = K_Omega(elem, 1);
280 gradKgradOmega_elem(elem) = 0;
281 }
282
283 // Compute the two gradients
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);
289
290 // Interpolate from faces to elem
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());
294
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);
297
298 // Dot Product gradKgradOmega
299 // EB : no need to update virtual cells
300 for (int elem = 0; elem < nb_elem; ++elem)
301 for (int dim=0; dim<dimension; ++dim)
302 gradKgradOmega_elem(elem) += tab_gradK_elem(elem,dim) * tab_gradOmega_elem(elem,dim);
303}
304
306{
307 Transport_K_Omega& eq_transport = ref_cast_non_const(Transport_K_Omega, eqn_K_Omega.valeur());
308 eq_transport.controler_K_Omega(); // REQUIRED for Runge_Kutta schemes
309 const DoubleTab& K_Omega = eqn_K_Omega->inconnue().valeurs();
310 const DoubleTab& distmin = le_dom_VDF->y_elem(); // Minimum distance to the edge
311 DoubleTab& gradKgradOmega_elem = ref_cast_non_const(DoubleTab, grad_k_omega_elem_->valeurs());
312 const Navier_Stokes_std& eq_ns = ref_cast(Navier_Stokes_std, eqn_K_Omega->modele_turbulence().equation());
313 const double kinematic_viscosity = eq_ns.fluide().viscosite_cinematique().valeurs()(0,0);
314
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();
318
319 for (int elem = 0; elem < le_dom_VDF->nb_elem(); ++elem)
320 {
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);
328
329 double const arg1 = std::min(std::max(tmp1, tmp2), tmp3); // Common name of the variable
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);
333 }
334
335 // Apply the boundary conditions for F1 and F2
336 for (int i = 0; i < le_dom_Cl_VDF->nb_cond_lim(); i++)
337 {
338 const Cond_lim_base& boundary_condition = le_dom_Cl_VDF->les_conditions_limites(i).valeur();
339 const Front_VF& the_edge = ref_cast(Front_VF, boundary_condition.frontiere_dis());
340
341 if (sub_type(Dirichlet_paroi_fixe, boundary_condition) ||
342 sub_type(Dirichlet_paroi_defilante, boundary_condition))
343 {
344 int start = the_edge.num_premiere_face();
345 int end = start + the_edge.nb_faces();
346 for (int num_elem=start; num_elem<end; num_elem++)
347 {
348 tabF1(num_elem) = 1.0;
349 tabF1(num_elem) = 1.0;
350 }
351 }
352 }
355}
356
357double Source_Transport_K_Omega_VDF_Elem::blender(double const val1, double const val2,
358 int const elem) const
359{
360 const DoubleTab& F1 = turbulence_model->get_tabF1();
361 return F1(elem)*val1 + (1 - F1(elem))*val2;
362}
363
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,...
Definition Entree.h:42
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
Definition Fluide_base.h:58
class Front_VF
Definition Front_VF.h:36
int nb_faces() const
Definition Front_VF.h:53
int num_premiere_face() const
Definition Front_VF.h:63
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.
Definition MorEqn.h:62
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
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
Definition Nom.h:92
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
static int dimension
Definition Objet_U.h:99
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
static int axi
Definition Objet_U.h:101
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
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.
Definition Sortie.h:52
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
double blender(double const val1, double const val2, int const elem) const
void fill_resu(const DoubleVect &, DoubleTab &) 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
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)
Definition TRUSTTab.tpp:469
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
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 &)