TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Navier_Stokes_Fluide_Dilatable_base.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 <Navier_Stokes_Fluide_Dilatable_base.h>
17#include <Fluide_Dilatable_base.h>
18#include <Loi_Etat_Multi_GP_WC.h>
19#include <Schema_Temps_base.h>
20#include <Probleme_base.h>
21#include <Discret_Thyd.h>
22
23Implemente_base(Navier_Stokes_Fluide_Dilatable_base,"Navier_Stokes_Fluide_Dilatable_base",Navier_Stokes_std);
24
26{
28}
29
31{
33 divergence.set_description((Nom)"Mass flow rate=Integral(rho*u*ndS) [kg.s-1]");
34 return is;
35}
36
42
44{
46 param.ajouter_non_std("mass_source",(this));
47}
48
50{
51 if (mot == "mass_source")
52 {
54 if (typ == "VEFPreP1B") typ = "VEF";
55
56 typ = Nom("Source_Masse_Fluide_Dilatable_") + typ;
57 Cerr << "Typage de la source de masse : " << typ << finl;
58 source_masse_.typer(typ);
59 Cerr << "Lecture de la source de masse ... " << finl;
60 is >> source_masse_.valeur();
61 source_masse_->associer_domaine_cl(domaine_Cl_dis());
62 }
63 else
65
66 return 1;
67}
68
69/*! @brief Appel Equation_base::preparer_calcul() Assemblage du solveur pression et
70 *
71 * initialisation de la pression.
72 *
73 * @return (int) renvoie toujours 1
74 */
79
80/*! @brief Complete l'equation base, associe la pression a l'equation,
81 *
82 * complete la divergence, le gradient et le solveur pression.
83 * Ajout de 2 termes sources: l'un representant la force centrifuge
84 * dans le cas axi-symetrique,l'autre intervenant dans la resolution
85 * en 2D axisymetrique
86 *
87 */
89{
90 Cerr << "Navier_Stokes_Fluide_Dilatable_base::completer" << finl;
91 if (has_source_masse())
92 {
93 // Never use QC
94 if (probleme().que_suis_je().finit_par("_QC"))
95 {
96 Cerr << "Error in Navier_Stokes_Fluide_Dilatable_base::completer() !! " << finl;
97 Cerr << "Switch to a WC problem if you want to use the mass source term ! This source term is not available for a QC problem !" << finl;
99 }
100
101 source_masse_->completer();
102
103 // Some verifications : in order to help the user to do what he wants, and in order to avoid any wrong use of the source term
104 // the line_size of the term source should be identical to the number of species
105 const int ncomp = source_masse_->nb_comp();
106
107 if (probleme().que_suis_je() == "Pb_Hydraulique_Melange_Binaire_WC" && ncomp != 2)
108 {
109 Cerr << "Error in Navier_Stokes_Fluide_Dilatable_base::completer() !! " << finl;
110 Cerr << "You can not define a mass source with " << ncomp << " components while using a problem of type " << probleme().que_suis_je() << finl;
111 Cerr << "Please define a mass source with 2 components !" << finl;
113 }
114
115 if (probleme().que_suis_je() == "Pb_Thermohydraulique_Especes_WC")
116 {
117 const Fluide_Dilatable_base& fd = ref_cast(Fluide_Dilatable_base, le_fluide.valeur());
118 assert(fd.loi_etat()->que_suis_je() == "Loi_Etat_Multi_Gaz_Parfait_WC");
119 const Loi_Etat_Multi_GP_WC& loi_etat = ref_cast(Loi_Etat_Multi_GP_WC, fd.loi_etat().valeur());
120 const int nb_esp = loi_etat.masse_molaire_especes().valeurs().line_size();
121 if (nb_esp != ncomp)
122 {
123 Cerr << "Error in Navier_Stokes_Fluide_Dilatable_base::completer() !! " << finl;
124 Cerr << "You should define " << nb_esp << " components for your mass source and not " << ncomp << " (because you have " << nb_esp << " species) !!!" << finl;
126 }
127 }
128 }
129
130 Cerr << "Navier_Stokes_std::completer" << finl;
132 Cerr << "Unknown field type : " << inconnue().que_suis_je() << finl;
133 Cerr << "Unknown field name : " << inconnue().le_nom() << finl;
134 Cerr << "Equation type : " << inconnue().equation().que_suis_je() << finl;
135}
136
138{
139 return le_fluide->viscosite_dynamique();
140}
141
143{
144 return le_fluide->viscosite_cinematique();
145}
146
148{
149 return la_vitesse;
150}
151
153{
154 if (nom == "rho_u")
155 {
156 ref_champ = rho_la_vitesse();
157 return true;
158 }
159
160 if (Navier_Stokes_std::has_champ(nom, ref_champ))
161 return true;
162
163 if (milieu().has_champ(nom, ref_champ))
164 return true;
165
166 return false; /* rien trouve */
167}
168
170{
171 if (nom == "rho_u")
172 return true;
173
175 return true;
176
177 if (milieu().has_champ(nom))
178 return true;
179
180 return false; /* rien trouve */
181}
182
184{
185 if (nom == "rho_u")
186 return rho_la_vitesse();
187
188 OBS_PTR(Champ_base) ref_champ;
189
190 if (Navier_Stokes_std::has_champ(nom, ref_champ))
191 return ref_champ;
192
193 if (milieu().has_champ(nom, ref_champ))
194 return ref_champ;
195
196 throw std::runtime_error(std::string("Field ") + nom.getString() + std::string(" not found !"));
197}
198
200{
201 DoubleTab& tab_vitesse = inconnue().valeurs();
202 Fluide_Dilatable_base& fluide_dil = ref_cast(Fluide_Dilatable_base, le_fluide.valeur());
203 const DoubleTab& tab_rho = fluide_dil.rho_discvit();
204 DoubleTab& rhovitesse = rho_la_vitesse_->valeurs(); // will be filled
205 rho_vitesse_impl(tab_rho, tab_vitesse, rhovitesse);
206
207 if (has_source_masse())
208 {
209 const Schema_Temps_base& sch = schema_temps();
210 // XXX : on a besoin de temps courant...
211 source_masse_->changer_temps_futur(sch.temps_courant(), 0);
212 // Pour chaque temps futur
213 for (int i = 1; i <= sch.nb_valeurs_futures(); i++)
214 {
215 double tps = sch.temps_futur(i);
216 source_masse_->changer_temps_futur(tps, i);
217 }
218
219 // Mise a jour du temps par defaut de la source de masse
220 source_masse_->set_temps_defaut(sch.temps_defaut());
221 }
222
224}
225
227{
229 const Discret_Thyd& dis=ref_cast(Discret_Thyd, discretisation());
230 dis.vitesse(schema_temps(), domaine_dis(), rho_la_vitesse_);
231 rho_la_vitesse_->nommer("rho_u");
232}
233
238
239void Navier_Stokes_Fluide_Dilatable_base::assembler( Matrice_Morse& mat_morse, const DoubleTab& present, DoubleTab& secmem)
240{
242}
243
244void Navier_Stokes_Fluide_Dilatable_base::assembler_avec_inertie( Matrice_Morse& mat_morse, const DoubleTab& present, DoubleTab& secmem)
245{
247}
248
249void Navier_Stokes_Fluide_Dilatable_base::assembler_blocs_avec_inertie(matrices_t matrices, DoubleTab& secmem, const tabs_t& semi_impl)
250{
252}
253
classe Champ_Don_base classe de base des Champs donnes (non calcules)
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.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
classe Discret_Thyd Cette classe est la classe de base representant une discretisation
void vitesse(const Schema_Temps_base &, Domaine_dis_base &, OWN_PTR(Champ_Inc_base)&, int nb_comp=1) 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 Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Nom & le_nom() const override
Renvoie le nom du champ.
classe Fluide_Dilatable_base Cette classe represente un d'un fluide dilatable,
const DoubleTab & rho_discvit() const
classe Loi_Etat_Multi_GP_WC Cette classe represente la loi d'etat pour un melange de gaz parfaits.
const Champ_Don_base & masse_molaire_especes() const
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
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
void assembler_avec_inertie_impl(const Navier_Stokes_std &eqn, Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &secmem)
DoubleTab & rho_vitesse_impl(const DoubleTab &tab_rho, const DoubleTab &vit, DoubleTab &rhovitesse) const
int impr_impl(const Navier_Stokes_std &eqn, Sortie &os) const
DoubleTab & derivee_en_temps_inco_impl(Navier_Stokes_std &, DoubleTab &res)
Calcule la derivee en temps de l'inconnue vitesse, i.
void assembler_blocs_avec_inertie(const Navier_Stokes_std &eqn, matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl)
void assembler_impl(Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &secmem)
classe Navier_Stokes_Fluide_Dilatable_base Cette classe basse porte les termes de l'equation de la dy...
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
void assembler_avec_inertie(Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &secmem) override
const Champ_Inc_base & rho_la_vitesse() const override
DoubleTab & derivee_en_temps_inco(DoubleTab &) override
Returns the time derivative of the unknown I of the equation: dI/dt = M-1*(sum(operators(I) + sources...
int lire_motcle_non_standard(const Motcle &mot, Entree &is) override
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
const Champ_base & diffusivite_pour_pas_de_temps() const override
void completer() override
Complete l'equation base, associe la pression a l'equation,.
const Champ_Don_base & diffusivite_pour_transport() const override
const Champ_base & vitesse_pour_transport() const override
void assembler(Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &secmem) override
int preparer_calcul() override
Appel Equation_base::preparer_calcul() Assemblage du solveur pression et.
const Champ_base & get_champ(const Motcle &nom) const override
int impr(Sortie &os) const override
Imprime les operateurs de l'equation sur un flot de sortie, de facon inconditionnelle.
void assembler_blocs_avec_inertie(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl) override
bool initTimeStep(double dt) override
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
const Milieu_base & milieu() const override
Renvoie le milieu physique de l'equation (le Fluide_base upcaste en Milieu_base).
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
int lire_motcle_non_standard(const Motcle &, Entree &) override
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
void completer() override
Complete l'equation base, associe la pression a l'equation,.
bool initTimeStep(double dt) override
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
int impr(Sortie &os) const override
Effectue quelques impressions sur un flot de sortie: - maximum de div U.
Operateur_Div divergence
void set_param(Param &titi) const override
void discretiser() override
Dicretise l'equation.
int preparer_calcul() override
cf Equation_base::preparer_calcul() Assemblage du solveur pression et
OBS_PTR(Fluide_base) le_fluide
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
const std::string & getString() const
Definition Nom.h:92
friend class Entree
Definition Objet_U.h:76
friend class Sortie
Definition Objet_U.h:75
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
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void ajouter_non_std(const char *keyword, const Objet_U *value, Param::Nature nat=Param::OPTIONAL)
Register a keyword handled by Objet_U::lire_motcle_non_standard.
Definition Param.cpp:489
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
class Schema_Temps_base
double temps_courant() const
Renvoie le temps courant.
virtual double temps_futur(int i) const =0
virtual int nb_valeurs_futures() const =0
virtual double temps_defaut() const =0
Classe de base des flux de sortie.
Definition Sortie.h:52
int line_size() const
Definition TRUSTVect.tpp:67