44 template <MODELE_TYPE M_TYPE> std::enable_if_t<(M_TYPE == MODELE_TYPE::K_EPS || M_TYPE == MODELE_TYPE::K_EPS_REALISABLE || M_TYPE == MODELE_TYPE::K_OMEGA),
void>
47 template <MODELE_TYPE M_TYPE> std::enable_if_t<M_TYPE == MODELE_TYPE::K_EPS_2_COUCHES, void>
50 template <MODELE_TYPE M_TYPE> std::enable_if_t<M_TYPE == MODELE_TYPE::K_EPS_BAS_REYNOLDS, void>
53 template <MODELE_TYPE M_TYPE> std::enable_if_t<(M_TYPE == MODELE_TYPE::K_EPS_BICEPHALE || M_TYPE == MODELE_TYPE::K_EPS_REALISABLE_BICEPHALE),
void>
57template <
typename MODELE>
61 visc.
nommer(
"diffusivite_turbulente");
69template<
typename MODELE>
template<MODELE_TYPE M_TYPE>
70std::enable_if_t<(M_TYPE == MODELE_TYPE::K_EPS || M_TYPE == MODELE_TYPE::K_EPS_REALISABLE || M_TYPE == MODELE_TYPE::K_OMEGA),
void>
73 constexpr bool IS_K_OMEGA = (M_TYPE == MODELE_TYPE::K_OMEGA);
74 auto *z_class =
static_cast<MODELE*
>(
this);
78 if (z_class->equation().probleme().is_dilatable())
79 diviser_par_rho_si_dilatable(ch_K_Eps_ou_Omega.
valeurs(), mil);
83 z_class->loi_paroi().calculer_hyd(ch_K_Eps_ou_Omega);
85 z_class->calculer_viscosite_turbulente(ch_K_Eps_ou_Omega.
temps());
86 z_class->limiter_viscosite_turbulente();
89 if (z_class->equation().probleme().is_dilatable())
91 multiplier_par_rho_si_dilatable(ch_K_Eps_ou_Omega.
valeurs(), mil);
92 if constexpr (!IS_K_OMEGA)
93 correction_nut_et_cisaillement_paroi_si_qc(*z_class);
96 z_class->viscosite_turbulente().valeurs().echange_espace_virtuel();
103template<
typename MODELE>
template<MODELE_TYPE M_TYPE>
104std::enable_if_t<(M_TYPE == MODELE_TYPE::K_EPS_BICEPHALE || M_TYPE == MODELE_TYPE::K_EPS_REALISABLE_BICEPHALE),
void>
107 constexpr bool IS_K_EPS_REALISABLE_BICEPHALE = (M_TYPE == MODELE_TYPE::K_EPS_REALISABLE_BICEPHALE);
109 auto *z_class =
static_cast<MODELE*
>(
this);
113 if (z_class->equation().probleme().is_dilatable())
115 diviser_par_rho_si_dilatable(ch_K.
valeurs(), mil);
116 diviser_par_rho_si_dilatable(ch_Eps.
valeurs(), mil);
119 if constexpr (!IS_K_EPS_REALISABLE_BICEPHALE)
122 z_class->loi_paroi().calculer_hyd_BiK(ch_K.
valeurs(), ch_Eps.
valeurs());
123 z_class->controler();
124 z_class->calculer_viscosite_turbulente(ch_K.
temps());
125 z_class->limiter_viscosite_turbulente();
128 if (z_class->equation().probleme().is_dilatable())
130 multiplier_par_rho_si_dilatable(ch_K.
valeurs(), mil);
131 multiplier_par_rho_si_dilatable(ch_Eps.
valeurs(), mil);
132 correction_nut_et_cisaillement_paroi_si_qc(*z_class);
135 z_class->viscosite_turbulente().valeurs().echange_espace_virtuel();
137 if constexpr (!IS_K_EPS_REALISABLE_BICEPHALE)
141template<
typename MODELE>
template<MODELE_TYPE M_TYPE>
142std::enable_if_t<M_TYPE == MODELE_TYPE::K_EPS_2_COUCHES, void>
145 auto *z_class =
static_cast<MODELE*
>(
this);
148 z_class->controler();
151 if (z_class->equation().probleme().is_dilatable())
152 diviser_par_rho_si_dilatable(ch_K_Eps_ou_Omega.
valeurs(), mil);
154 z_class->calculer_viscosite_turbulente(ch_K_Eps_ou_Omega.
temps());
155 z_class->loi_paroi().calculer_hyd(ch_K_Eps_ou_Omega);
156 z_class->limiter_viscosite_turbulente();
159 if (z_class->equation().probleme().is_dilatable())
161 multiplier_par_rho_si_dilatable(ch_K_Eps_ou_Omega.
valeurs(), mil);
162 correction_nut_et_cisaillement_paroi_si_qc(*z_class);
165 z_class->viscosite_turbulente().valeurs().echange_espace_virtuel();
168template<
typename MODELE>
template<MODELE_TYPE M_TYPE>
169std::enable_if_t<M_TYPE == MODELE_TYPE::K_EPS_BAS_REYNOLDS, void>
172 auto *z_class =
static_cast<MODELE*
>(
this);
173 z_class->controler();
174 z_class->calculer_viscosite_turbulente(ch_K_Eps_ou_Omega.
temps());
175 z_class->limiter_viscosite_turbulente();
176 z_class->viscosite_turbulente().valeurs().echange_espace_virtuel();
179template <
typename MODELE>
template <MODELE_TYPE M_TYPE>
183 constexpr bool IS_K_OMEGA = (M_TYPE == MODELE_TYPE::K_OMEGA);
184 constexpr bool IS_2_COUCHES = (M_TYPE == MODELE_TYPE::K_EPS_2_COUCHES);
185 constexpr bool IS_BAS_REYNOLDS = (M_TYPE == MODELE_TYPE::K_EPS_BAS_REYNOLDS);
186 constexpr bool IS_K_EPS_BICEPHALE = (M_TYPE == MODELE_TYPE::K_EPS_BICEPHALE);
187 constexpr bool IS_K_EPS_REALISABLE_BICEPHALE = (M_TYPE == MODELE_TYPE::K_EPS_REALISABLE_BICEPHALE);
189 assert (!IS_K_EPS_BICEPHALE || (IS_K_EPS_BICEPHALE && le_champ_Eps !=
nullptr));
191 if constexpr (IS_2_COUCHES || IS_BAS_REYNOLDS || IS_K_EPS_REALISABLE_BICEPHALE)
return;
195 const DoubleTab& tab_K_Eps_ou_Omega = le_champ_K_Eps_ou_Omega.
valeurs();
196 double k_min = DMAXFLOAT, eps_ou_omega_min = DMAXFLOAT, nut_min = DMAXFLOAT;
197 double k_max = 0, eps_ou_omega_max = 0, nut_max = 0;
198 int loc_k_min = -1, loc_eps_ou_omega_min = -1, loc_nut_min = -1;
199 int loc_k_max = -1, loc_eps_ou_omega_max = -1, loc_nut_max = -1;
200 int size = tab_K_Eps_ou_Omega.
dimension(0);
206 Cerr <<
"Unsupported field in Modele_turbulence_hyd_RANS_Gen::imprimer_evolution()" << finl;
212 if constexpr (IS_K_EPS_BICEPHALE)
216 Cerr <<
"Unsupported field in Modele_turbulence_hyd_RANS_Gen::imprimer_evolution()" << finl;
219 assert (size == (*le_champ_Eps).equation().domaine_dis().domaine().nb_elem());
226 double eps_ou_omega_min, eps_ou_omega_max;
227 double nut_min, nut_max;
228 int loc_k_min, loc_k_max;
229 int loc_eps_ou_omega_min, loc_eps_ou_omega_max;
230 int loc_nut_min, loc_nut_max;
232 KOKKOS_INLINE_FUNCTION
233 MinMaxResult() : k_min(DMAXFLOAT), k_max(-DMAXFLOAT), eps_ou_omega_min(DMAXFLOAT), eps_ou_omega_max(-DMAXFLOAT),
234 nut_min(DMAXFLOAT), nut_max(-DMAXFLOAT), loc_k_min(-1), loc_k_max(-1),
235 loc_eps_ou_omega_min(-1), loc_eps_ou_omega_max(-1), loc_nut_min(-1), loc_nut_max(-1) {}
237 KOKKOS_INLINE_FUNCTION
238 MinMaxResult(
const MinMaxResult& rhs) : k_min(rhs.k_min), k_max(rhs.k_max),
239 eps_ou_omega_min(rhs.eps_ou_omega_min), eps_ou_omega_max(rhs.eps_ou_omega_max),
240 nut_min(rhs.nut_min), nut_max(rhs.nut_max),
241 loc_k_min(rhs.loc_k_min), loc_k_max(rhs.loc_k_max),
242 loc_eps_ou_omega_min(rhs.loc_eps_ou_omega_min), loc_eps_ou_omega_max(rhs.loc_eps_ou_omega_max),
243 loc_nut_min(rhs.loc_nut_min), loc_nut_max(rhs.loc_nut_max) {}
245 KOKKOS_INLINE_FUNCTION
246 MinMaxResult& operator=(
const MinMaxResult&) =
default;
248 KOKKOS_INLINE_FUNCTION
249 void operator += (
const MinMaxResult& rhs)
251 if (rhs.k_min < k_min) { k_min = rhs.k_min; loc_k_min = rhs.loc_k_min; }
252 if (rhs.k_max > k_max) { k_max = rhs.k_max; loc_k_max = rhs.loc_k_max; }
253 if (rhs.eps_ou_omega_min < eps_ou_omega_min) { eps_ou_omega_min = rhs.eps_ou_omega_min; loc_eps_ou_omega_min = rhs.loc_eps_ou_omega_min; }
254 if (rhs.eps_ou_omega_max > eps_ou_omega_max) { eps_ou_omega_max = rhs.eps_ou_omega_max; loc_eps_ou_omega_max = rhs.loc_eps_ou_omega_max; }
255 if (rhs.nut_min < nut_min) { nut_min = rhs.nut_min; loc_nut_min = rhs.loc_nut_min; }
256 if (rhs.nut_max > nut_max) { nut_max = rhs.nut_max; loc_nut_max = rhs.loc_nut_max; }
261 CDoubleTabView K_Eps_ou_Omega = tab_K_Eps_ou_Omega.
view_ro();
263 if constexpr (IS_K_EPS_BICEPHALE) Eps =
static_cast<const ArrOfDouble&
>((*le_champ_Eps).valeurs()).view_ro();
264 Kokkos::parallel_reduce(start_gpu_timer(__KERNEL_NAME__), size,
265 KOKKOS_LAMBDA(
const int n, MinMaxResult& local_result)
267 const double k = IS_K_EPS_BICEPHALE ? K_Eps_ou_Omega(n, 0) : K_Eps_ou_Omega(n, 0);
268 const double epsOuomega = IS_K_EPS_BICEPHALE ? Eps(n) : K_Eps_ou_Omega(n, 1);
271 const double num = IS_K_OMEGA ? k : LeCmu * k * k;
274 nut = num / epsOuomega;
277 if (local_result.loc_k_min == -1 || k < local_result.k_min)
279 local_result.k_min = k;
280 local_result.loc_k_min = n;
282 if (local_result.loc_k_max == -1 || k > local_result.k_max)
284 local_result.k_max = k;
285 local_result.loc_k_max = n;
289 if (local_result.loc_eps_ou_omega_min == -1 || epsOuomega < local_result.eps_ou_omega_min)
291 local_result.eps_ou_omega_min = epsOuomega;
292 local_result.loc_eps_ou_omega_min = n;
294 if (local_result.loc_eps_ou_omega_max == -1 || epsOuomega > local_result.eps_ou_omega_max)
296 local_result.eps_ou_omega_max = epsOuomega;
297 local_result.loc_eps_ou_omega_max = n;
301 if (local_result.loc_nut_min == -1 || nut < local_result.nut_min)
303 local_result.nut_min = nut;
304 local_result.loc_nut_min = n;
306 if (local_result.loc_nut_max == -1 || nut > local_result.nut_max)
308 local_result.nut_max = nut;
309 local_result.loc_nut_max = n;
312 end_gpu_timer(__KERNEL_NAME__);
315 k_min = result.k_min;
316 k_max = result.k_max;
317 eps_ou_omega_min = result.eps_ou_omega_min;
318 eps_ou_omega_max = result.eps_ou_omega_max;
319 nut_min = result.nut_min;
320 nut_max = result.nut_max;
321 loc_k_min = result.loc_k_min;
322 loc_k_max = result.loc_k_max;
323 loc_eps_ou_omega_min = result.loc_eps_ou_omega_min;
324 loc_eps_ou_omega_max = result.loc_eps_ou_omega_max;
325 loc_nut_min = result.loc_nut_min;
326 loc_nut_max = result.loc_nut_max;
338 Cout << finl <<
"K_Eps/Omega evolution (" << (avant ?
"before" :
"after") <<
" law of the wall applies) at time " << le_champ_K_Eps_ou_Omega.
temps() <<
":" << finl;
339 Cout <<
"std::min(k)=" << k_min;
342 Cout <<
"std::min(eps/omega)=" << eps_ou_omega_min;
345 Cout <<
"std::min(nut)=" << nut_min;
348 Cout <<
"std::max(k)=" << k_max;
351 Cout <<
"std::max(eps/omega)=" << eps_ou_omega_max;
354 Cout <<
"std::max(nut)=" << nut_max;