TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Modele_turbulence_scal_Prandtl.cpp
1/****************************************************************************
2* Copyright (c) 2026, 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 <Pb_Thermohydraulique_Turbulent_QC.h>
17#include <Modele_turbulence_scal_Prandtl.h>
18#include <Modifier_pour_fluide_dilatable.h>
19#include <Champ_Uniforme.h>
20#include <Domaine_VF.h>
21#include <Parser_U.h>
22#include <ParserView.h>
23#include <Motcle.h>
24#include <Param.h>
25
26Implemente_instanciable(Modele_turbulence_scal_Prandtl, "Modele_turbulence_scal_Prandtl", Modele_turbulence_scal_diffturb_base);
27// XD prandtl modele_turbulence_scal_base prandtl INHERITS_BRACE The Prandtl model. For the scalar equations, only the
28// XD_CONT model based on Reynolds analogy is available. If K_Epsilon was selected in the hydraulic equation, Prandtl
29// XD_CONT must be selected for the convection-diffusion temperature equation coupled to the hydraulic equation and
30// XD_CONT Schmidt for the concentration equations.
31
33
35{
37 // si on a lu une fonction, on initialise le Parser
38 if (definition_fonction_ != Nom())
39 {
40 fonction_.setNbVar(2);
41 fonction_.addVar("alpha");
42 fonction_.addVar("nu_t");
44 fonction_.parseString();
45 }
46
47 if (LePrdt_fct_ != Nom())
48 {
49 fonction1_.setNbVar(3);
50 fonction1_.addVar("x");
51 fonction1_.addVar("y");
52 fonction1_.addVar("z");
53 fonction1_.setString(LePrdt_fct_);
54 fonction1_.parseString();
55 }
56 else
57 Cerr << "La valeur par defaut du nombre de Prandtl turbulent est " << LePrdt_ << finl;
58
59 Cerr << "L'expression du nombre de Prandtl turbulent est " << LePrdt_fct_ << finl;
60 return is;
61}
62
64{
65 param.ajouter("Prdt", &LePrdt_fct_); // XD_ADD_P chaine
66 // XD_CONT Keyword to modify the constant (Prdt) of Prandtl model : Alphat=Nut/Prdt Default value is 0.9
67 param.ajouter("Prandt_turbulent_fonction_nu_t_alpha", &definition_fonction_); // XD_ADD_P chaine
68 // XD_CONT Optional keyword to specify turbulent diffusivity (by default, alpha_t=nu_t/Prt) with another formulae, for
69 // XD_CONT example: alpha_t=nu_t2/(0,7*alpha+0,85*nu_tt) with the string nu_t*nu_t/(0,7*alpha+0,85*nu_t) where alpha
70 // XD_CONT is the thermal diffusivity.
72}
73
74/*! @brief Calcule la diffusivite turbulente et la loi de paroi.
75 *
76 * @param (double)
77 */
79{
81 const Milieu_base& mil = equation().probleme().milieu();
83 loipar_->calculer_scal(diffusivite_turbulente_);
84
85 const Probleme_base& mon_pb = mon_equation_->probleme();
86 DoubleTab& lambda_t = conductivite_turbulente_->valeurs();
87 lambda_t = diffusivite_turbulente_->valeurs();
88 const bool uniforme = sub_type(Champ_Uniforme, mon_pb.milieu().capacite_calorifique());
89 const DoubleTab& tab_Cp = mon_pb.milieu().capacite_calorifique().valeurs();
90 const DoubleTab& tab_rho = mon_pb.milieu().masse_volumique().valeurs();
91 if (sub_type(Pb_Thermohydraulique_Turbulent_QC, mon_pb))
92 {
93 CDoubleArrView Cp = static_cast<const DoubleVect&>(tab_Cp).view_ro();
94 DoubleArrView lambda = static_cast<DoubleVect&>(lambda_t).view_rw();
95 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), lambda_t.size(),
96 KOKKOS_LAMBDA(
97 const int i)
98 {
99 lambda(i) *= Cp(uniforme ? 0 : i);
100 });
101 end_gpu_timer(__KERNEL_NAME__);
102 if (equation().probleme().is_dilatable())
103 multiplier_par_rho_si_dilatable(lambda_t, mil);
104 }
105 else
106 lambda_t *= mon_equation_->domaine_dis().nb_elem() > 0 ? tab_rho(0, 0) * tab_Cp(0, 0) : 1.0;
107 lambda_t.echange_espace_virtuel();
108 diffusivite_turbulente_->valeurs().echange_espace_virtuel();
109}
110
111/*! @brief Calcule la diffusivite turbulente.
112 *
113 * diffusivite_turbulente = viscosite_turbulente / Prdt_turbulent
114 *
115 * @return (Champ_Fonc_base&) la diffusivite turbulente nouvellement calculee
116 * @throws les champs diffusivite_turbulente et viscosite_turbulente
117 * doivent avoir le meme nombre de valeurs nodales
118 */
120{
121 DoubleTab& tab_alpha_t = diffusivite_turbulente_->valeurs();
122 const DoubleTab& tab_nu_t = la_viscosite_turbulente_->valeurs();
123 double temps = la_viscosite_turbulente_->temps();
124
125
126 int n = tab_alpha_t.size();
127 if (tab_nu_t.size() != n)
128 {
129 Cerr << "Les DoubleTab des champs diffusivite_turbulente et viscosite_turbulente" << finl;
130 Cerr << "doivent avoir le meme nombre de valeurs nodales" << finl;
131 exit();
132 }
133
134 if (definition_fonction_ != Nom())
135 {
136 // modif VB pour utiliser l'equation qui approche Yakhot : LePrdt = 0.7/Pe-t + 0.85
137 // Pe-t est un nombre de Peclet turbulent defini par Pr*(nut/nu)
138 // On a alors alpha_t = nut * nut / ( 0.7 alpha + 0.85 nut )
139
140 const Milieu_base& milieu = mon_equation_->milieu();
141 const Champ_Don_base& alpha = milieu.diffusivite();
142 if (!milieu.has_diffusivite())
143 {
144 // GF si cette condition est bloquante, on peut ameliorer en
145 // tentant de creer un parser sans la variable alpha, si ok on peut dire que alpha existe , est constant et vaut 1.
146 Cerr << "Erreur dans Modele_turbulence_scal_prandt, l'option Prandt_turbulent_fonction_nu_t_alpha n'est disponible que pour des milieux ayant defini la diffusivite" << finl;
147 exit();
148 }
149 double d_alpha = 0.;
150 const bool is_alpha_unif = sub_type(Champ_Uniforme, alpha);
151 if (is_alpha_unif)
152 d_alpha = alpha.valeurs()(0, 0);
153
154 ParserView parser(fonction_);
155 parser.parseString();
156 CDoubleArrView alpha_vals;
157 if (!is_alpha_unif) alpha_vals = static_cast<const ArrOfDouble&>(alpha.valeurs()).view_ro();
158 CDoubleArrView nu_t = static_cast<const DoubleVect&>(tab_nu_t).view_ro();
159 DoubleArrView alpha_t = static_cast<DoubleVect&>(tab_alpha_t).view_rw();
160 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(0, n), KOKKOS_LAMBDA(const int i)
161 {
162 double alpha_val = is_alpha_unif ? d_alpha : alpha_vals(i);
163 int threadId = parser.acquire();
164 parser.setVar(0, alpha_val, threadId);
165 parser.setVar(1, nu_t[i], threadId);
166 alpha_t[i] = parser.eval(threadId);
167 parser.release(threadId);
168 });
169 end_gpu_timer(__KERNEL_NAME__);
170 }
171 else
172 {
173 if (LePrdt_fct_ != Nom())
174 {
175 const int nb_dim = dimension;
176 ParserView parser(fonction1_);
177 parser.parseString();
178 CDoubleTabView xp = ref_cast(Domaine_VF,mon_equation_->domaine_dis()).xp().view_ro();
179 CDoubleArrView nu_t = static_cast<const DoubleVect&>(tab_nu_t).view_ro();
180 DoubleArrView alpha_t = static_cast<DoubleVect&>(tab_alpha_t).view_rw();
181 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(0, n), KOKKOS_LAMBDA(const int i)
182 {
183 double x = xp(i, 0);
184 double y = xp(i, 1);
185 double z = nb_dim == 3 ? xp(i, 2) : 0.;
186 int threadId = parser.acquire();
187 parser.setVar(0, x, threadId);
188 parser.setVar(1, y, threadId);
189 parser.setVar(2, z, threadId);
190 double NbPrandtlCell = parser.eval(threadId);
191 parser.release(threadId);
192 alpha_t[i] = nu_t[i] / NbPrandtlCell;
193 });
194 end_gpu_timer(__KERNEL_NAME__);
195 }
196 else
197 {
198 double inv_LePrdt = 1./LePrdt_;
199 // ToDo Kokkos: implement operator_mutiply(u,v,alpha);
200 // if u = v * alpha is a regular pattern in the code...
201 CDoubleArrView nu_t = static_cast<const DoubleVect&>(tab_nu_t).view_ro();
202 DoubleArrView alpha_t = static_cast<DoubleVect&>(tab_alpha_t).view_rw();
203 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
204 Kokkos::RangePolicy<>(0, n), KOKKOS_LAMBDA(
205 const int i)
206 {
207 alpha_t[i] = nu_t[i] * inv_LePrdt;
208 });
209 end_gpu_timer(__KERNEL_NAME__);
210 }
211 }
212
213 diffusivite_turbulente_->changer_temps(temps);
214
215 if (equation().probleme().is_dilatable())
216 diviser_par_rho_si_dilatable(diffusivite_turbulente_->valeurs(), equation().probleme().milieu());
217 return diffusivite_turbulente_.valeur();
218}
219
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
virtual DoubleTab & valeurs()=0
classe Champ_Uniforme Represente un champ constant dans l'espace et dans le temps.
class Domaine_VF
Definition Domaine_VF.h:44
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
Definition Milieu_base.h:50
virtual const Champ_Don_base & capacite_calorifique() const
Renvoie la capacite calorifique du milieu.
virtual const Champ_Don_base & diffusivite() const
Renvoie la diffusivite du milieu.
virtual const Champ_base & masse_volumique() const
Renvoie la masse volumique du milieu.
bool has_diffusivite() const
Definition Milieu_base.h:95
Classe Modele_turbulence_scal_Prandtl Cette classe represente le modele de calcul suivant.
virtual public_for_cuda Champ_Fonc_base & calculer_diffusivite_turbulente()
Calcule la diffusivite turbulente.
void mettre_a_jour(double) override
Calcule la diffusivite turbulente et la loi de paroi.
Convection_Diffusion_std & equation()
virtual void set_param(Param &) const override
int loi_paroi_non_nulle() const
Renvoie si oui ou non loi de paroi (version const).
Classe Mod_Turb_scal_diffuturb_base Cette classe represente la classe de base pour le modele de calcu...
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
static int dimension
Definition Objet_U.h:99
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
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
KOKKOS_INLINE_FUNCTION int acquire() const
Definition ParserView.h:77
KOKKOS_INLINE_FUNCTION void setVar(int i, double val, int threadId) const
Definition ParserView.h:64
void parseString() override
Definition ParserView.h:52
KOKKOS_INLINE_FUNCTION void release(int threadId) const
Definition ParserView.h:79
KOKKOS_INLINE_FUNCTION double eval(int threadId) const
Definition ParserView.h:69
classe Pb_Thermohydraulique_Turbulent Cette classe represente un probleme de thermohydraulique en flu...
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
virtual const Milieu_base & milieu() const
Renvoie le milieu physique associe au probleme.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ size() const
Definition TRUSTVect.tpp:45
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")