TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Source_Transport_K_Omega_VEF_Face.cpp
1/****************************************************************************
2* Copyright (c) 2015 - 2016, 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 <Discretisation_tools.h>
17#include <Operateur_Grad.h>
18#include <TRUSTTabs_forward.h>
19#include <Source_Transport_K_Omega_VEF_Face.h>
20#include <Modele_turbulence_hyd_K_Omega.h>
21#include <Transport_K_Omega.h>
22#include <Navier_Stokes_std.h>
23#include <Pb_Hydraulique_Turbulent.h>
24#include <Milieu_base.h>
25#include <VEF_discretisation.h>
26#include <Domaine_VEF.h>
27#include <Domaine_Cl_VEF.h>
28#include <K_Omega_Eps_constants.h>
29#include <Fluide_base.h>
30#include <Dirichlet_paroi_defilante.h>
31#include <Dirichlet_paroi_fixe.h>
32#include <Schema_Euler_Implicite.h>
33
34
35Implemente_instanciable_sans_constructeur(Source_Transport_K_Omega_VEF_Face,
36 "Source_Transport_K_Omega_VEF_P1NC",
38
40{
41 return s << que_suis_je();
42}
43
45{
47 que_suis_je());
50 return (is);
51}
52
54 Option opt) const
55{
57 Noms noms_compris = champs_compris_.liste_noms_compris();
58 noms_compris.add("grad_k_grad_omega");
59
60 if (opt == DESCRIPTION)
61 Cerr << que_suis_je() << " : " << noms_compris << finl;
62 else
63 nom.add(noms_compris);
64}
65
67{
68 assert(mon_equation);
70 dis.discretiser_champ("champ_elem", equation().domaine_dis(), "grad_k_grad_omega", "",
71 1, equation().schema_temps().temps_courant(), grad_k_omega_);
72 champs_compris_.ajoute_champ(grad_k_omega_);
73
74 dis.discretiser_champ("champ_elem", equation().domaine_dis(), "grad_k", "",
75 Objet_U::dimension, equation().schema_temps().temps_courant(), grad_k_elem_);
76 champs_compris_.ajoute_champ(grad_k_elem_);
77
78 dis.discretiser_champ("champ_elem", equation().domaine_dis(), "grad_omega", "",
79 Objet_U::dimension, equation().schema_temps().temps_courant(), grad_omega_elem_);
80 champs_compris_.ajoute_champ(grad_omega_elem_);
81
82 dis.discretiser_champ("champ_face", equation().domaine_dis(), "production_k", "",
83 1, equation().schema_temps().temps_courant(), production_k_face_);
84 champs_compris_.ajoute_champ(production_k_face_);
85}
86
88{
90
91 if (nom == "production_omega" && !production_omega_face_)
92 {
93 dis.discretiser_champ("champ_face", equation().domaine_dis(), "production_omega", "",
94 1, equation().schema_temps().temps_courant(), production_omega_face_);
95 champs_compris_.ajoute_champ(production_omega_face_);
96 }
97 else if (nom == "dissipation_k" && !dissipation_k_face_)
98 {
99 dis.discretiser_champ("champ_face", equation().domaine_dis(), "dissipation_k", "",
100 1, equation().schema_temps().temps_courant(), dissipation_k_face_);
101 champs_compris_.ajoute_champ(dissipation_k_face_);
102 }
103
104 else if (nom == "dissipation_omega" && !dissipation_omega_face_)
105 {
106 dis.discretiser_champ("champ_face", equation().domaine_dis(), "dissipation_omega", "",
107 1, equation().schema_temps().temps_courant(), dissipation_omega_face_);
108 champs_compris_.ajoute_champ(dissipation_omega_face_);
109 }
110 else if (nom == "cross_diffusion_k_omega" && !cross_diffusion_k_omega_face_)
111 {
112 dis.discretiser_champ("champ_face", equation().domaine_dis(), "cross_diffusion_k_omega", "",
113 1, equation().schema_temps().temps_courant(), cross_diffusion_k_omega_face_);
114 champs_compris_.ajoute_champ(cross_diffusion_k_omega_face_);
115 }
116 else
118}
119
121{
123 eqn_K_Omega = ref_cast(Transport_K_Omega, equation());
124 turbulence_model = ref_cast(Modele_turbulence_hyd_K_Omega, eqn_K_Omega->modele_turbulence());
125}
126
128{
129 return eqn_K_Omega->modele_turbulence().viscosite_turbulente().valeurs();
130}
131
133{
134 return turbulence_model->loi_paroi().Cisaillement_paroi();
135}
136
138{
139 return eqn_K_Omega->inconnue().valeurs();
140}
141
143{
144 return turbulence_model->loi_paroi().que_suis_je();
145}
146
147void Source_Transport_K_Omega_VEF_Face::compute_blending_F1(DoubleTab& tab_gradKgradOmega) const
148{
149 const Navier_Stokes_std& eq_ns = ref_cast(Navier_Stokes_std, eqn_K_Omega->modele_turbulence().equation());
150 const double visc_cst = eq_ns.fluide().viscosite_cinematique().valeurs()(0,0);
151 Transport_K_Omega& eq_transport = ref_cast_non_const(Transport_K_Omega, eqn_K_Omega.valeur());
152 if (!(sub_type(Schema_Implicite_base,eq_transport.schema_temps())))
153 eq_transport.raise_control_k_omega_flag();
154 eq_transport.controler_K_Omega(); // This is required for explicit schemas due to the way the wheel is rotated.
155
156 DoubleTab& tab_F1 = ref_cast_non_const(DoubleTab, turbulence_model->get_tabF1());
157 DoubleTab& tab_F2 = ref_cast_non_const(DoubleTab, turbulence_model->get_tabF2());
158 DoubleTrav tab_visc_face(le_dom_VEF->nb_faces_tot()); // dimension_tot(0)
159 const double& cst_min_cd_komega = turbulence_model->get_expert_mode().get_cst_cd_komega();
160 const bool is_dilatable = eq_ns.fluide().is_dilatable();
161
162 if (is_dilatable)
163 Discretisation_tools::cells_to_faces(le_dom_VEF.valeur(), eq_ns.fluide().viscosite_cinematique().valeurs(), tab_visc_face);
164
165 CDoubleArrView visc_face;
166 if (is_dilatable) visc_face = static_cast<ArrOfDouble&>(tab_visc_face).view_ro();
167 CDoubleTabView K_Omega = eqn_K_Omega->inconnue().valeurs().view_ro();
168 CDoubleArrView distmin = static_cast<const ArrOfDouble&>(le_dom_VEF->y_faces()).view_ro();
169 CDoubleArrView gradKgradOmega = static_cast<const ArrOfDouble&>(tab_gradKgradOmega).view_ro();
170 DoubleArrView F1 = static_cast<ArrOfDouble&>(tab_F1).view_wo();
171 DoubleArrView F2 = static_cast<ArrOfDouble&>(tab_F2).view_wo();
172 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), le_dom_VEF->nb_faces(), KOKKOS_LAMBDA(const int face)
173 {
174 double const dmin = Kokkos::fmax(distmin(face), 1e-12);
175 double const enerK = K_Omega(face, 0);
176 double const omega = K_Omega(face, 1);
177 double const kinematic_viscosity = is_dilatable ? visc_face(face) : visc_cst;
178 double const tmp1 = Kokkos::sqrt(enerK)/(BETA_K*omega*dmin); // no safety value becase omega is already cropped. If omega<OMEGA_MIN, then the calcul should fail. It's not a bug, it's a feature
179 double const tmp2 = 500.0*kinematic_viscosity/(omega*dmin*dmin);
180 double const maxval = Kokkos::fmax(2.*SIGMA_OMEGA2*gradKgradOmega(face)/(omega), cst_min_cd_komega);
181 double const tmp3 = 4.0*SIGMA_OMEGA2*enerK/(maxval*dmin*dmin);
182
183 double const arg1 = Kokkos::fmin(Kokkos::fmax(tmp1, tmp2), tmp3); // Common name of the variable
184 F1(face) = Kokkos::tanh(arg1*arg1*arg1*arg1);
185
186 double const arg2 = Kokkos::fmax(2.*tmp1, tmp2);
187 F2(face) = Kokkos::tanh(arg2*arg2);
188 });
189 end_gpu_timer(__KERNEL_NAME__);
190
191 // Apply the boundary conditions for F1 and F2
192 for (int i = 0; i < le_dom_Cl_VEF->nb_cond_lim(); i++)
193 {
194 const Cond_lim_base& boundary_condition = le_dom_Cl_VEF->les_conditions_limites(i).valeur();
195 const Front_VF& the_edge = ref_cast(Front_VF, boundary_condition.frontiere_dis());
196
197 if (sub_type(Dirichlet_paroi_fixe, boundary_condition) ||
198 sub_type(Dirichlet_paroi_defilante, boundary_condition))
199 {
200 int start = the_edge.num_premiere_face();
201 int end = start + the_edge.nb_faces();
202 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
203 Kokkos::RangePolicy<>(start, end),KOKKOS_LAMBDA(const int num_face)
204 {
205 F1(num_face) = 1.0;
206 F2(num_face) = 1.0;
207 });
208 end_gpu_timer(__KERNEL_NAME__);
209 }
210 }
211
212 tab_F1.echange_espace_virtuel();
213 tab_F2.echange_espace_virtuel();
214}
215
216double Source_Transport_K_Omega_VEF_Face::blender(double const val1, double const val2,
217 int const face) const
218{
219 const DoubleTab& F1 = turbulence_model->get_tabF1();
220 return F1(face)*val1 + (1 - F1(face))*val2;
221}
222
223
224void Source_Transport_K_Omega_VEF_Face::compute_cross_diffusion(DoubleTab& tab_gradKgradOmega) const
225{
226 // Same structure than Source_WC_Chaleur_VEF.cpp in TRUST
227
228 // = First, store K and Omega in two separated Tab for the gradient computation, not ideal
229 const DoubleTab& tab_K_Omega = eqn_K_Omega->inconnue().valeurs();
230 const int size = tab_K_Omega.dimension_tot(0);
231 DoubleTrav tab_enerK(size); // field on faces
232 DoubleTrav tab_omega(size); // field on faces
233 CDoubleTabView K_Omega = tab_K_Omega.view_ro();
234 DoubleArrView enerK = static_cast<ArrOfDouble&>(tab_enerK).view_wo();
235 DoubleArrView omega = static_cast<ArrOfDouble&>(tab_omega).view_wo();
236 DoubleArrView gradKgradOmega = static_cast<ArrOfDouble&>(tab_gradKgradOmega).view_rw();
237 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), le_dom_VEF->nb_faces_tot(), KOKKOS_LAMBDA(const int num_face)
238 {
239 enerK(num_face) = K_Omega(num_face, 0);
240 omega(num_face) = K_Omega(num_face, 1);
241 gradKgradOmega(num_face) = 0;
242 });
243 end_gpu_timer(__KERNEL_NAME__);
244
245 // = Definition of the gradients
246 // Get number of componants, for gradient resize
247 // We use the velocity field to resize the gradient as the velocity is on faces
248 const Navier_Stokes_std& eqHyd = ref_cast(Navier_Stokes_std, mon_equation->probleme().equation(0));
249 const DoubleTab& velocity_field_face = eqHyd.vitesse().valeurs(); // Velocity on faces
250 const int nbr_velocity_components = velocity_field_face.dimension(1); // dimension_tot ?
251
252 DoubleTab& tab_gradK_elem = ref_cast_non_const(DoubleTab, grad_k_elem_->valeurs());
253 DoubleTab& tab_gradOmega_elem = ref_cast_non_const(DoubleTab, grad_omega_elem_->valeurs());
254
255 // Compute the two gradients
256 const Operateur_Grad& Op_Grad_komega = eqn_K_Omega->gradient_operator_komega();
257 Op_Grad_komega.calculer(tab_enerK, tab_gradK_elem);
258 Op_Grad_komega.calculer(tab_omega, tab_gradOmega_elem);
259
260 const bool has_post_cross_diffusion_k_omega = has_champ("cross_diffusion_k_omega") ;
261
262 CDoubleTabView gradK_elem = tab_gradK_elem.view_ro();
263 CDoubleTabView gradOmega_elem = tab_gradOmega_elem.view_ro();
264
265 if (has_post_cross_diffusion_k_omega)
266 {
267 DoubleArrView chmp_post = static_cast<ArrOfDouble&>(ref_cast_non_const(DoubleTab, grad_k_omega_->valeurs())).view_rw();
268 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), le_dom_VEF->nb_elem_tot(), KOKKOS_LAMBDA(const int num_elem)
269 {
270 for (int ncompo = 0; ncompo < nbr_velocity_components; ++ncompo)
271 chmp_post(num_elem) += gradK_elem(num_elem, ncompo) * gradOmega_elem(num_elem, ncompo);
272 });
273 end_gpu_timer(__KERNEL_NAME__);
274 }
275 // Interpolate from elem to face
276 const Domaine_dis_base& domaine_dis = mon_equation->inconnue().domaine_dis_base();
277 const Domaine_VF& domaine = ref_cast(Domaine_VF, domaine_dis);
278
279 DoubleTrav tab_gradK_face(velocity_field_face.dimension_tot(0), nbr_velocity_components);
280 Discretisation_tools::cells_to_faces(domaine, tab_gradK_elem, tab_gradK_face);
281
282 DoubleTrav tab_gradOmega_face(velocity_field_face.dimension_tot(0), nbr_velocity_components);
283 Discretisation_tools::cells_to_faces(domaine, tab_gradOmega_elem, tab_gradOmega_face);
284
285 // Dot Product gradKgradOmega
286 CDoubleTabView gradK_face = tab_gradK_face.view_ro();
287 CDoubleTabView gradOmega_face = tab_gradOmega_face.view_ro();
288 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), le_dom_VEF->nb_faces_tot(), KOKKOS_LAMBDA(const int num_face)
289 {
290 for (int ncompo = 0; ncompo < nbr_velocity_components; ++ncompo)
291 gradKgradOmega(num_face) +=
292 gradK_face(num_face, ncompo) * gradOmega_face(num_face, ncompo);
293 });
294 end_gpu_timer(__KERNEL_NAME__);
295}
296
297void Source_Transport_K_Omega_VEF_Face::fill_resu_k_omega(const DoubleVect& tab_volumes_entrelaces,
298 const DoubleTrav& tab_ProdK,
299 const DoubleTab& tab_gradKgradOmega,
300 DoubleTab& tab_resu) const
301{
302 const double LeK_MIN = eqn_K_Omega->modele_turbulence().get_K_MIN();
303 const double& gamma1 = turbulence_model->get_expert_mode().get_gamma1();
304 const double& gamma2 = turbulence_model->get_expert_mode().get_gamma2();
305 const bool is_SST_or_BSL = turbulence_model->is_SST_or_BSL();
306 const bool is_SST = turbulence_model->is_SST();
307 const bool has_post_production_omega = has_champ("production_omega") ;
308 const bool has_post_dissipation_k = has_champ("dissipation_k") ;
309 const bool has_post_dissipation_omega = has_champ("dissipation_omega") ;
310 const bool has_post_cross_diffusion_k_omega = has_champ("cross_diffusion_k_omega") ;
311
312 CDoubleTabView K_Omega = eqn_K_Omega->inconnue().valeurs().view_ro();
313 CDoubleArrView volumes_entrelaces = tab_volumes_entrelaces.view_ro();
314 CDoubleArrView ProdK = static_cast<const ArrOfDouble&>(tab_ProdK).view_ro();
315 CDoubleArrView gradKgradOmega = static_cast<const ArrOfDouble&>(tab_gradKgradOmega).view_ro();
316 CDoubleArrView F1 = static_cast<const ArrOfDouble&>(turbulence_model->get_tabF1()).view_ro();
317 CDoubleArrView F2 = static_cast<const ArrOfDouble&>(turbulence_model->get_tabF2()).view_ro();
318 DoubleArrView production_omega_face, dissipation_k_face, dissipation_omega_face, cross_diffusion_k_omega_face;
319
320 if (has_post_production_omega)
321 production_omega_face = static_cast<ArrOfDouble&>(ref_cast_non_const(DoubleTab,production_omega_face_->valeurs())).view_wo();
322
323 if (has_post_dissipation_k)
324 dissipation_k_face = static_cast<ArrOfDouble&>(ref_cast_non_const(DoubleTab,dissipation_k_face_->valeurs())).view_wo();
325
326 if (has_post_dissipation_omega)
327 dissipation_omega_face = static_cast<ArrOfDouble&>(ref_cast_non_const(DoubleTab,dissipation_omega_face_->valeurs())).view_wo();
328
329 if (has_post_cross_diffusion_k_omega)
330 cross_diffusion_k_omega_face = static_cast<ArrOfDouble&>(ref_cast_non_const(DoubleTab,cross_diffusion_k_omega_face_->valeurs())).view_wo();
331
332 DoubleTabView resu = tab_resu.view_rw();
333 CDoubleArrView enstrophy_or_strain_invariant = static_cast<const ArrOfDouble&>(turbulence_model->get_expert_mode().get_menter_version()==Menter_version::ORIGINAL_1994 ?
334 turbulence_model->get_enstrophy() : turbulence_model->get_strain_invariant()).view_ro();
335 const double CST_A1 = turbulence_model->get_CST_A1();
336 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), le_dom_VEF->nb_faces(), KOKKOS_LAMBDA(const int face)
337 {
338 const double tke = K_Omega(face, 0);
339 const double omega = K_Omega(face, 1);
340 const double production_k = ProdK(face);
341 const double dissipation_k = BETA_K*tke*omega;
342 resu(face, 0) += (production_k - dissipation_k)*volumes_entrelaces(face);
343
344 if (tke >= LeK_MIN)
345 {
346 const double cALPHA = is_SST_or_BSL
347 ? F1(face)*gamma1 + (1 - F1(face))*gamma2
348 : ALPHA_OMEGA;
349 const double cBETA = is_SST_or_BSL
350 ? F1(face)*BETA1 + (1 - F1(face))*BETA2
351 : BETA_OMEGA;
352 double cSIGMA;
353 if (is_SST_or_BSL)
354 cSIGMA = 2.*(1. - F1(face))*SIGMA_OMEGA2;
355 else
356 cSIGMA = (gradKgradOmega(face) > 0) ? 0.125 : 0.;
357
358 double contrib {0};
359 const double nut = is_SST ? tke * CST_A1 /Kokkos::max(CST_A1*omega, enstrophy_or_strain_invariant[face]*F2[face]) : tke/omega;
360 const double production_omega = cALPHA * ProdK(face) / nut; // production EB: with SST, one cannot use k/omega. See the last paragraph of the appendix of Menter, 1994.
361 const double dissipation_omega = cBETA * omega * omega; // dissipation
362 const double cross_diffusion_k_omega = cSIGMA / omega * gradKgradOmega(face);
363
364 contrib += production_omega; // production
365 contrib -= dissipation_omega; // dissipation
366 contrib += cross_diffusion_k_omega; // cross diffusion
367 contrib *= volumes_entrelaces(face);
368 resu(face, 1) += contrib;
369
370 if (has_post_dissipation_k)
371 dissipation_k_face(face) = dissipation_k;
372
373 if (has_post_production_omega)
374 production_omega_face(face) = production_omega;
375
376 if (has_post_dissipation_omega)
377 dissipation_omega_face(face) = dissipation_omega;
378
379 if (has_post_cross_diffusion_k_omega)
380 cross_diffusion_k_omega_face(face) = cross_diffusion_k_omega;
381 }
382 });
383 end_gpu_timer(__KERNEL_NAME__);
384}
385
390
392 Matrice_Morse& tab_matrice) const
393{
394 const double LeK_MIN = eqn_K_Omega->modele_turbulence().get_K_MIN();
395 const DoubleTab& tab_K_Omega = equation().inconnue().valeurs();
396
397 DoubleTrav production_k_face {le_dom_VEF->nb_faces()};
398
399 const Domaine_Cl_VEF& domaine_Cl_VEF = ref_cast(Domaine_Cl_VEF,
400 eq_hydraulique->domaine_Cl_dis());
401 const DoubleTab& visco_turb = get_visc_turb(); // voir les classes filles
402 const DoubleTab& velocity = eq_hydraulique->inconnue().valeurs();
403 const DoubleTab& TKE = get_K_pour_production(); // voir les classes filles
404 const bool& deactivate_production_limiter = turbulence_model->get_expert_mode().get_deactivate_production_limiter();
405 // EB: if we do not compute it again, there are discrepancies with the reference test
406 calculer_terme_production_K(le_dom_VEF.valeur(), domaine_Cl_VEF, production_k_face,
407 TKE, velocity, visco_turb,
410 deactivate_production_limiter);
411
412 DoubleTrav tab_gradKgradOmega(le_dom_VEF->nb_faces_tot());
413 compute_cross_diffusion(tab_gradKgradOmega);
414 if (turbulence_model->is_SST_or_BSL())
415 compute_blending_F1(tab_gradKgradOmega);
416 const double& gamma1 = turbulence_model->get_expert_mode().get_gamma1();
417 const double& gamma2 = turbulence_model->get_expert_mode().get_gamma2();
418 const bool is_SST_or_BSL = turbulence_model->is_SST_or_BSL();
419
420 CDoubleTabView K_Omega = tab_K_Omega.view_ro();
421 CDoubleArrView porosite_face = eqn_K_Omega->milieu().porosite_face().view_ro();
422 CDoubleArrView volumes_entrelaces = le_dom_VEF->volumes_entrelaces().view_ro();
423 CDoubleArrView production_k = static_cast<const ArrOfDouble&>(production_k_face).view_ro();
424 CDoubleArrView gradKgradOmega = static_cast<const ArrOfDouble&>(tab_gradKgradOmega).view_ro();
425 CDoubleArrView F1 = is_SST_or_BSL
426 ? static_cast<const ArrOfDouble&>(turbulence_model->get_tabF1()).view_ro()
427 : CDoubleArrView();
428 Matrice_Morse_View matrice;
429 matrice.set(tab_matrice);
430 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), tab_K_Omega.dimension(0), KOKKOS_LAMBDA(const int face)
431 {
432 if (K_Omega(face, 0) >= LeK_MIN)
433 {
434 const double tke = K_Omega(face, 0);
435 const double omega = K_Omega(face, 1);
436
437 const double volporo = porosite_face(face) * volumes_entrelaces(face);
438
439 const double coef_k = BETA_K*omega*volporo;
440 matrice.add(face*2, face*2, coef_k);
441
442 const double cALPHA = is_SST_or_BSL
443 ? F1(face)*gamma1 + (1 - F1(face))*gamma2
444 : ALPHA_OMEGA;
445
446 const double cBETA = is_SST_or_BSL
447 ? F1(face)*BETA1 + (1 - F1(face))*BETA2
448 : BETA_OMEGA;
449
450 const double cSIGMA = is_SST_or_BSL
451 ? 2.*(1. - F1(face))*SIGMA_OMEGA2
452 : (gradKgradOmega(face) > 0)*0.125;
453
454 const double coef_omega = (-cALPHA*production_k(face)/tke
455 + 2.*cBETA*omega
456 + cSIGMA/(omega*omega + 1.e-20)*gradKgradOmega(face) ) * volporo;
457 matrice.add(face*2 + 1, face*2 + 1, coef_omega);
458 }
459 });
460 end_gpu_timer(__KERNEL_NAME__);
461}
DoubleTab & calculer_terme_production_K(const Domaine_VEF &, const Domaine_Cl_VEF &, DoubleTab &, const DoubleTab &, const DoubleTab &, const DoubleTab &, const int &interpol_visco, const double &limiteur, const bool &deactivate_production_limiter=false, const double &cst_production_limiter=0.) const
Compute the production term for the turbulent kinetic energy.
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
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
static void cells_to_faces(const Champ_base &He, Champ_base &Hf)
class Domaine_VF
Definition Domaine_VF.h:44
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
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
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
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.
virtual bool is_dilatable() const
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.
virtual const Champ_Inc_base & vitesse() const
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
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
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.
virtual const Equation_base & equation(int) const =0
class Schema_Implicite_base Classe de base pour tous les schemas en temps implicite
Classe de base des flux de sortie.
Definition Sortie.h:52
class Source_Transport_K_Eps_VEF_Face Cette classe represente le terme source qui figure dans l'equat...
void associer_pb(const Probleme_base &pb) override
void compute_cross_diffusion(DoubleTab &gradKgradOmega) const override
DoubleTab & ajouter(DoubleTab &) const override
void contribuer_a_avec(const DoubleTab &, Matrice_Morse &) const override
contribution a la matrice implicite des termes sources par defaut pas de contribution
void compute_blending_F1(DoubleTab &gradKgradOmega) const override
double blender(double const val1, double const val2, int const face) const
void fill_resu_k_omega(const DoubleVect &, const DoubleTrav &, const DoubleTab &, DoubleTab &) const override
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
virtual const DoubleTab & get_visc_turb() const
virtual const DoubleTab & get_cisaillement_paroi() const
virtual const DoubleTab & get_K_pour_production() const
virtual void associer_pb(const Probleme_base &)=0
Champs_compris champs_compris_
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
_SIZE_ dimension_tot(int) const override
Definition TRUSTTab.tpp:160
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
Definition TRUSTTab.h:261
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_rw()
Definition TRUSTTab.h:291
_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 &)