TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Pb_Multiphase.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 <Schema_Euler_Implicite.h>
17#include <Discretisation_base.h>
18#include <Loi_Fermeture_base.h>
19#include <Milieu_composite.h>
20#include <Interprete_bloc.h>
21#include <Pb_Multiphase.h>
22#include <Domaine.h>
23#include <EChaine.h>
24#include <Debog.h>
25#include <SETS.h>
26
27Implemente_instanciable(Pb_Multiphase, "Pb_Multiphase", Pb_Fluide_base);
28// XD Pb_Multiphase Pb_base Pb_Multiphase INHERITS_BRACE A problem that allows the resolution of N-phases with 3*N
29// XD_CONT equations
30// XD attr milieu_composite bloc_lecture milieu_composite OPT The composite medium associated with the problem.
31// XD attr Milieu_MUSIG bloc_lecture Milieu_MUSIG OPT The composite medium associated with the problem.
32// XD attr correlations bloc_lecture correlations OPT List of correlations used in specific source terms (i.e.
33// XD_CONT interfacial flux, interfacial friction, ...)
34// XD attr models bloc_lecture models OPT List of models used in specific source terms (i.e. interfacial flux,
35// XD_CONT interfacial friction, ...)
36// XD attr QDM_Multiphase QDM_Multiphase QDM_Multiphase REQ Momentum conservation equation for a multi-phase problem
37// XD_CONT where the unknown is the velocity
38// XD attr Masse_Multiphase Masse_Multiphase Masse_Multiphase REQ Mass consevation equation for a multi-phase problem
39// XD_CONT where the unknown is the alpha (void fraction)
40// XD attr Energie_Multiphase Energie_Multiphase Energie_Multiphase REQ Internal energy conservation equation for a
41// XD_CONT multi-phase problem where the unknown is the temperature
42// XD attr Echelle_temporelle_turbulente Echelle_temporelle_turbulente Echelle_temporelle_turbulente OPT Turbulent
43// XD_CONT Dissipation time scale equation for a turbulent mono/multi-phase problem (available in TrioCFD)
44// XD attr Energie_cinetique_turbulente Energie_cinetique_turbulente Energie_cinetique_turbulente OPT Turbulent kinetic
45// XD_CONT Energy conservation equation for a turbulent mono/multi-phase problem (available in TrioCFD)
46// XD attr Energie_cinetique_turbulente_WIT Energie_cinetique_turbulente_WIT Energie_cinetique_turbulente_WIT OPT Bubble
47// XD_CONT Induced Turbulent kinetic Energy equation for a turbulent multi-phase problem (available in TrioCFD)
48// XD attr Taux_dissipation_turbulent Taux_dissipation_turbulent Taux_dissipation_turbulent OPT Turbulent Dissipation
49// XD_CONT frequency equation for a turbulent mono/multi-phase problem (available in TrioCFD)
50// XD attr aire_interfaciale aire_interfaciale aire_interfaciale OPT Interfacial-area transport equation for a
51// XD_CONT multi-phase problem (available in TrioCFD)
52
53// XD Energie_cinetique_turbulente eqn_base Energie_cinetique_turbulente BRACE Turbulent kinetic Energy conservation
54// XD_CONT equation for a turbulent mono/multi-phase problem (available in TrioCFD)
55// XD aire_interfaciale eqn_base aire_interfaciale BRACE Interfacial-area transport equation for a multi-phase problem
56// XD_CONT (available in TrioCFD)
57// XD Echelle_temporelle_turbulente eqn_base Echelle_temporelle_turbulente INHERITS_BRACE Turbulent Dissipation time
58// XD_CONT scale equation for a turbulent mono/multi-phase problem (available in TrioCFD)
59// XD Energie_cinetique_turbulente_WIT eqn_base Energie_cinetique_turbulente_WIT INHERITS_BRACE Bubble Induced Turbulent
60// XD_CONT kinetic Energy equation for a turbulent multi-phase problem (available in TrioCFD)
61// XD Taux_dissipation_turbulent eqn_base Taux_dissipation_turbulent INHERITS_BRACE Turbulent Dissipation frequency
62// XD_CONT equation for a turbulent mono/multi-phase problem (available in TrioCFD)
63
65{
66 return Pb_Fluide_base::printOn(os);
67}
68
70{
71 if (discretisation().is_vef())
72 {
73 Cerr << "Error: Problem of type " << que_suis_je() << " is not available for VEF discretization" << finl;
74 Cerr << "It is only available for VDF, PolyMAC_HFV and PolyMAC_MPFA discretizations." << finl;
76 }
77 return Pb_Fluide_base::readOn(is);
78}
79
81{
82 // Verify that user choosed adapted time scheme/solver
83 if (!sub_type(Schema_Euler_Implicite, le_schema_en_temps_.valeur()))
84 {
85 Cerr << "Error: for Pb_Multiphase, you can only use Scheme_euler_implicit time scheme with sets/ice solver" << finl;
87 }
88 else if (sub_type(Schema_Euler_Implicite, le_schema_en_temps_.valeur()))
89 {
90 Schema_Euler_Implicite& schm_imp = ref_cast(Schema_Euler_Implicite, le_schema_en_temps_.valeur());
91 if (!sub_type(SETS, schm_imp.solveur().valeur()))
92 {
93 Cerr << "Error: for Pb_Multiphase, you can only use Scheme_euler_implicit time scheme with sets/ice solver" << finl;
95 }
96 }
97
98 bool already_read = true;
99
100 is >> mot;
101 if (mot == "correlations" || mot == "models")
102 lire_correlations(is), already_read = false;
103
104 typer_lire_correlation_hem(); // enforce an interfacial flux correlation with constant coefficient if HEM
105
106 Cerr << "Reading of the equations" << finl;
107 for (int i = 0; i < nombre_d_equations(); i++, already_read = false)
108 {
109 if (!already_read)
110 is >> mot;
111 is >> getset_equation_by_name(mot);
112 }
113
115 return is;
116}
117
119{
120 le_milieu_.resize(1); /* Un milieu .. mais composite !! */
121 is >> le_milieu_[0]; // On commence par la lecture du milieu
122 if (!sub_type(Milieu_composite, le_milieu_[0].valeur()))
123 {
124 Cerr << "Error: Fluid of type " << le_milieu_[0]->le_type() << " is not compatible with " << que_suis_je() << " problem which accepts only Milieu_composite medium" << finl;
125 Cerr << "Check your datafile!" << finl;
127 }
128 noms_phases_ = ref_cast(Milieu_composite,le_milieu_[0].valeur()).noms_phases();
129 alpha_inf_phases_.resize(noms_phases_.size());
130 alpha_inf_phases_ = 0.0;
131 associer_milieu_base(le_milieu_[0].valeur());
132
133 // On discretise les equations maintenant ! voir avec Elie si t'es pas d'accord
135 // remontee de l'inconnue vers le milieu
136 for (int i = 0; i < nombre_d_equations(); i++)
138 // On discretise le milieu composite
139 equation(0).milieu().discretiser((*this), la_discretisation_.valeur());
140}
141
142/*! @brief Renvoie le nombre d'equation, Renvoie 2 car il y a 2 equations a un probleme de
143 *
144 * thermo-hydraulique standard:
145 * l'equation de Navier Stokes
146 * l' equation de la thermique de type Convection_Diffusion_Temperature
147 *
148 * @return (int) le nombre d'equation
149 */
151{
152 return 3 + eq_opt_.size();
153}
154
155/*! @brief Renvoie l'equation d'hydraulique de type Navier_Stokes_std si i=0 Renvoie l'equation de la thermique de type
156 *
157 * Convection_Diffusion_Temperature si i=1
158 * (version const)
159 *
160 * @param (int i) l'index de l'equation a renvoyer
161 * @return (Equation_base&) l'equation correspondante a l'index
162 */
164{
165 if (i == 0)
166 return eq_qdm_;
167 else if (i == 1)
168 return eq_masse_;
169 else if (i == 2)
170 return eq_energie_;
171 else if (i < 3 + eq_opt_.size())
172 return eq_opt_[i - 3].valeur();
173 else
174 {
175 Cerr << "Pb_Multiphase::equation() : Wrong equation number" << i << "!" << finl;
177 }
178 return eq_qdm_; //pour renvoyer quelque chose
179}
180
181/*! @brief Renvoie l'equation d'hydraulique de type Navier_Stokes_std si i=0 Renvoie l'equation de la thermique de type
182 *
183 * Convection_Diffusion_Temperature si i=1
184 *
185 * @param (int i) l'index de l'equation a renvoyer
186 * @return (Equation_base&) l'equation correspondante a l'index
187 */
189{
190 if (i == 0)
191 return eq_qdm_;
192 else if (i == 1)
193 return eq_masse_;
194 else if (i == 2)
195 return eq_energie_;
196 else if (i < 3 + eq_opt_.size())
197 return eq_opt_[i - 3].valeur();
198 else
199 {
200 Cerr << "Pb_Multiphase::equation() : Wrong equation number" << i << "!" << finl;
202 }
203 return eq_qdm_; //pour renvoyer quelque chose
204}
205
206/*! @brief Associe le milieu au probleme Le milieu doit etre de type fluide incompressible
207 *
208 * @param (Milieu_base& mil) le milieu physique a associer au probleme
209 * @throws mauvais type de milieu physique
210 */
212{
213 /* controler le type de milieu ici */
217}
218
219/*! @brief Teste la compatibilite des equations de la thermique et de l'hydraulique.
220 *
221 * Le test se fait sur les conditions
222 * aux limites discretisees de chaque equation.
223 * Appel la fonction de librairie hors classe:
224 * tester_compatibilite_hydr_thermique(const Domaine_Cl_dis_base&,const Domaine_Cl_dis_base&)
225 *
226 * @return (int) code de retour propage
227 */
229{
230 const Domaine_Cl_dis_base& domaine_Cl_hydr = equation_qdm().domaine_Cl_dis();
231 const Domaine_Cl_dis_base& domaine_Cl_th = equation_energie().domaine_Cl_dis();
232 return tester_compatibilite_hydr_thermique(domaine_Cl_hydr, domaine_Cl_th);
233}
234
236{
238 const double temps = schema_temps().temps_courant();
239 mettre_a_jour(temps);
240}
241
243{
244 if (sub_type(ICE, ref_cast(Schema_Euler_Implicite, le_schema_en_temps_.valeur()).solveur().valeur()))
246 else if (ref_cast(SETS, ref_cast(Schema_Euler_Implicite, le_schema_en_temps_.valeur()).solveur().valeur()).facsec_diffusion_for_sets() < 0.)
248
249 // Case where we calculate the time step with higher facsec for diffusion
250
251 double dt = schema_temps().pas_temps_max();
252 for (int i = 0; i < nombre_d_equations(); i++)
253 {
254 double dt_op;
255
256 int nb_op = equation(i).nombre_d_operateurs();
257 for (int j = 0; j < nb_op; j++)
258 {
260
261 const Operateur_base& op = equation(i).operateur(j).l_op_base();
262
263 if (le_schema_en_temps_->limpr())
264 {
265 if (j == 0)
266 {
267 Cout << " " << finl;
268 Cout << "Printing of the next provisional time steps for the equation: " << equation(i).que_suis_je() << finl;
269 }
270 if (sub_type(Operateur_Conv_base, op))
271 Cout << " convective";
272 else if (sub_type(Operateur_Diff_base, op))
273 Cout << " diffusive";
274 else
275 Cout << " operator ";
276 Cout << " time step : " << dt_op << finl;
277 }
278 if (sub_type(Operateur_Diff_base, op))
279 dt_op *= ref_cast(SETS, ref_cast(Schema_Euler_Implicite, le_schema_en_temps_.valeur()).solveur().valeur()).facsec_diffusion_for_sets();
280 dt = std::min(dt, dt_op);
281 }
282 }
283 return dt;
284}
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual void associer_milieu_equation()
virtual void associer_milieu_base(const Milieu_base &)=0
virtual const Milieu_base & milieu() const =0
virtual int nombre_d_operateurs() const =0
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
virtual const Operateur & operateur(int) const =0
classe ICE (semi-implicte ICE, a la CATHARE 3D)
Definition SETS.h:141
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
Definition Milieu_base.h:50
virtual void discretiser(const Probleme_base &pb, const Discretisation_base &dis)
Classe Milieu_composite Cette classe represente un fluide reel ainsi que.
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.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 Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
classe Operateur_Conv_base Cette classe est la base de la hierarchie des operateurs representant
classe Operateur_Diff_base Cette classe est la base de la hierarchie des operateurs representant
classe Operateur_base Classe est la base de la hierarchie des objets representant un
virtual Operateur_base & l_op_base()=0
double calculer_pas_de_temps() const
Calcule le prochain pas de temps.
classe Pb_Fluide_base Cette classe a pour but de disposer d une classe amont pour
classe Pb_Multiphase Cette classe represente un probleme de thermohydraulique multiphase de type "3*N...
void preparer_calcul() override
Prepare le calcul: initialise les parametres du milieu et prepare le calcul de chacune des equations.
double calculer_pas_de_temps() const override
Calcul la valeur du prochain pas de temps du probleme.
QDM_Multiphase eq_qdm_
Masse_Multiphase eq_masse_
virtual Equation_base & equation_qdm()
DoubleVect alpha_inf_phases_
virtual void typer_lire_correlation_hem()
Energie_Multiphase eq_energie_
virtual Equation_base & equation_energie()
Entree & lire_equations(Entree &is, Motcle &dernier_mot) override
Lecture des equations du probleme.
int nombre_d_equations() const override
Renvoie le nombre d'equation, Renvoie 2 car il y a 2 equations a un probleme de.
const Equation_base & equation(int) const override
Renvoie l'equation d'hydraulique de type Navier_Stokes_std si i=0 Renvoie l'equation de la thermique ...
void typer_lire_milieu(Entree &is) override
int verifier() override
Teste la compatibilite des equations de la thermique et de l'hydraulique.
void associer_milieu_base(const Milieu_base &) override
Associe le milieu au probleme Le milieu doit etre de type fluide incompressible.
virtual Equation_base & equation_masse()
virtual void discretiser_equations()
virtual Entree & lire_correlations(Entree &is)
Entree & read_optional_equations(Entree &is, Motcle &mot)
virtual void preparer_calcul()
Prepare le calcul: initialise les parametres du milieu et prepare le calcul de chacune des equations.
const Discretisation_base & discretisation() const
Renvoie la discretisation associee au probleme.
virtual double calculer_pas_de_temps() const
Calcul la valeur du prochain pas de temps du probleme.
virtual void mettre_a_jour(double temps)
Effectue une mise a jour en temps du probleme.
std::vector< OWN_PTR(Milieu_base)> le_milieu_
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
virtual Equation_base & getset_equation_by_name(const Nom &)
(B. Math): Methode virtuelle ajoutee pour les problemes ayant plusieurs equations de meme type (Probl...
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
classe SETS (semi-implicite + etapes de stabilisation, a la TRACE)
Definition SETS.h:35
double temps_courant() const
Renvoie le temps courant.
double pas_temps_max() const
Renvoie le pas de temps maximum.
Classe de base des flux de sortie.
Definition Sortie.h:52