TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Navier_Stokes_std.h
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#ifndef Navier_Stokes_std_included
17#define Navier_Stokes_std_included
18
19#include <Traitement_particulier_NS_base.h>
20#include <Assembleur_base.h>
21#include <Operateur_Grad.h>
22#include <Operateur_Conv.h>
23#include <Operateur_Diff.h>
24#include <Operateur_Div.h>
25#include <TRUST_Deriv.h>
26#include <TRUST_Ref.h>
27
28class Fluide_base;
29
30/*! @brief classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
31 *
32 * pour un fluide sans modelisation de la turbulence.
33 * On suppose l'hypothese de fluide incompressible: div U = 0
34 * On considere la masse volumique constante (egale a rho_0) sauf dans le
35 * terme des forces de gravite (hypotheses de Boussinesq).
36 * Sous ces hypotheses, on utilise la forme suivante des equations de
37 * Navier_Stokes:
38 * DU/dt = div(terme visqueux) - gradP/rho_0 + Bt(T-T0)g + autres sources/rho_0
39 * div U = 0
40 * avec DU/dt : derivee particulaire de la vitesse
41 * rho_0 : masse volumique de reference
42 * T0 : temperature de reference
43 * Bt : coefficient de dilatabilite du fluide
44 * g : vecteur gravite
45 * Rq : l'implementation de la classe permet bien sur de negliger
46 * certains termes de l'equation (le terme visqueux, le terme
47 * convectif, tel ou tel terme source).
48 * L'inconnue est le champ de vitesse.
49 *
50 * Pour le traitement des cas un peu particulier : ajout de Traitement_particulier
51 * exemple : THI, canal (CA)
52 *
53 * @sa Equation_base Pb_Hydraulique Pb_Thermohydraulique
54 */
56{
57 Declare_instanciable_sans_constructeur(Navier_Stokes_std);
58
59public :
60
62 void set_param(Param& titi) const override;
63 int lire_motcle_non_standard(const Motcle&, Entree&) override;
64 void associer_pb_base(const Probleme_base&) override;
65 inline void associer_fluide(const Fluide_base& un_fluide ) { le_fluide = un_fluide; }
66 const Milieu_base& milieu() const override;
67 Milieu_base& milieu() override;
68 const Fluide_base& fluide() const;
70 void associer_milieu_base(const Milieu_base& ) override;
71 int nombre_d_operateurs() const override;
72 int nombre_d_operateurs_tot() const override;
73 const Operateur& operateur(int) const override;
74 Operateur& operateur(int) override;
75 const Operateur& operateur_fonctionnel(int) const override;
76 Operateur& operateur_fonctionnel(int) override;
82 const Operateur_Diff& operateur_diff() const;
83 const Champ_Inc_base& inconnue() const override;
84 Champ_Inc_base& inconnue() override;
86 void discretiser() override;
87 virtual void discretiser_vitesse();
88 virtual void discretiser_grad_p();
89 void completer() override;
90 Entree& lire_cond_init(Entree&) override;
91 bool initTimeStep(double dt) override;
92 void mettre_a_jour(double temps) override;
93 void abortTimeStep() override;
94 void resetTime(double time) override;
95 int impr(Sortie& os) const override;
96
97 void dimensionner_matrice_sans_mem(Matrice_Morse& matrice) override;
98
99 /*
100 interface {dimensionner,assembler}_blocs
101 specificites : prend en compte le gradient de pression (en dernier)
102 */
103 int has_interface_blocs() const override;
104 void dimensionner_blocs(matrices_t matrices, const tabs_t& semi_impl = {}) const override;
105 void assembler_blocs(matrices_t matrices, DoubleTab& secmem, const tabs_t& semi_impl = {}) const override;
106
107 std::vector<YAML_data> data_a_sauvegarder() const override;
108 int sauvegarder(Sortie&) const override;
109 int reprendre(Entree&) override;
110
111 DoubleTab& derivee_en_temps_inco(DoubleTab& ) override;
112 DoubleTab& corriger_derivee_expl(DoubleTab& ) override;
113 DoubleTab& corriger_derivee_impl(DoubleTab& ) override;
114
115 int preparer_calcul() override;
116
118 inline OWN_PTR(Assembleur_base)& assembleur_pression() { return assembleur_pression_; }
119
120 inline bool has_grad_P() const { return bool(gradient_P); }
121 inline Champ_Inc_base& grad_P() { return gradient_P.valeur(); }
122 inline const Champ_Inc_base& grad_P() const { return gradient_P.valeur(); }
123 inline Champ_Inc_base& pression() { return la_pression.valeur(); }
124 inline const Champ_Inc_base& pression() const { return la_pression.valeur(); }
125 inline Champ_Inc_base& pression_pa() { return la_pression_en_pa.valeur(); }
126 inline const Champ_Inc_base& pression_pa() const { return la_pression_en_pa.valeur(); }
127 inline Champ_Inc_base& div() { return divergence_U.valeur(); }
128 inline const Champ_Inc_base& div() const { return divergence_U.valeur(); }
129
130 virtual const Champ_Don_base& diffusivite_pour_transport() const;
131 virtual const Champ_base& diffusivite_pour_pas_de_temps() const;
132 virtual const Champ_base& vitesse_pour_transport() const;
133
134 //Methodes de l interface des champs postraitables
135 /////////////////////////////////////////////////////
136 void creer_champ(const Motcle& motlu) override;
137 const Champ_base& get_champ(const Motcle& nom) const override;
138 bool has_champ(const Motcle& nom, OBS_PTR(Champ_base) &ref_champ) const override;
139 bool has_champ(const Motcle& nom) const override;
140 void get_noms_champs_postraitables(Noms& nom,Option opt=NONE) const override;
141 /////////////////////////////////////////////////////
142
143 const Motcle& domaine_application() const override;
144
145 virtual inline const Champ_Inc_base& vitesse() const { return la_vitesse.valeur(); }
146 virtual inline Champ_Inc_base& vitesse() { return la_vitesse.valeur(); }
147
148 virtual void projeter();
149 virtual int projection_a_faire();
150 virtual void sauver() const;
151 virtual void calculer_la_pression_en_pa();
152 virtual void calculer_pression_hydrostatique(Champ_base& pression_hydro) const;
153 int verif_Cl() const override;
154
155 virtual const Champ_Inc_base& rho_la_vitesse() const;
157
158 virtual void updateFluidForce(DoubleTab&);
159 // Retrieve true if implicit coupling with another code
160 // required to perform filtering of pressure Champ_P1_isoP1Bull during sub-iterations of the implicit loop
161 virtual bool getCouplingInfoForFiltering() const ;
162 inline DoubleTab getPressureTimeN() {return P_n; } // Pressure at start of time step (used for FSI implicit coupling in sub-iterations)
163 void setPressureTimeN();
164 void update_y_plus(const DoubleTab& tab) ;
166
167protected:
168 virtual void discretiser_assembleur_pression();
169 virtual void modify_initial_variable() { /* Do nothing */ }
170 virtual void modify_initial_gradP( DoubleTrav& ) { /* Do nothing */ }
171
173
177
183 OWN_PTR(Assembleur_base) assembleur_pression_;
185
188 mutable double cumulative_;
189
190 OWN_PTR(Traitement_particulier_NS_base) le_traitement_particulier;
191
192 void uzawa(const DoubleTab&, const Matrice_Base&, SolveurSys&, DoubleTab&, DoubleTab&);
196 // pour genepi il est important d avoir divu =0 car accumulation d'erreur
197 // meme si c'est pas faisable avec tous les schemas
199
200private :
201 // Pression au debut du pas de temps, utile pour abortTimeStep, notamment en Piso
202 // WEC : a terme, mettre 2 cases en temps pour le champ la_pression
203 DoubleTab P_n;
204 // Pour ne pas calculer un gradient de plus si pas de postraitement du gradient de pression
205 mutable int postraitement_gradient_P_;
206 double LocalFlowRateRelativeError() const; // Estimation of a flow rate relative error
207};
208
209#endif /* Navier_Stokes_std_included */
classe Champ_Don_base classe de base des Champs donnes (non calcules)
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
Classe Champ_Inc_base.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
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....
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
Definition Fluide_base.h:38
Classe Matrice_Base Classe de base de la hierarchie des matrices.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
Classe Matrice Classe generique de la hierarchie des matrices.
Definition Matrice.h:34
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
Definition Milieu_base.h:50
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
virtual const Champ_base & diffusivite_pour_pas_de_temps() const
OWN_PTR(Traitement_particulier_NS_base) le_traitement_particulier
Operateur_Diff terme_diffusif
void dimensionner_matrice_sans_mem(Matrice_Morse &matrice) override
const Champ_Inc_base & pression() const
virtual const Champ_Inc_base & rho_la_vitesse() const
virtual void updateFluidForce(DoubleTab &)
const Milieu_base & milieu() const override
Renvoie le milieu physique de l'equation (le Fluide_base upcaste en Milieu_base).
const Champ_Inc_base & div() const
const Motcle & domaine_application() const override
Renvoie le nom du domaine d'application: "Hydraulique".
OWN_PTR(Assembleur_base) assembleur_pression_
virtual void modify_initial_variable()
void resetTime(double time) override
Reset current time of the equation. Used from ICoCo. See documentation of Problem_base::resetTime().
Operateur_Grad gradient
int reprendre(Entree &) override
Effectue une reprise a partir d'un flot d'entree.
Operateur_Conv terme_convectif
const Champ_Inc_base & grad_P() const
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
void creer_champ(const Motcle &motlu) override
virtual const Champ_base & vitesse_pour_transport() 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.
Entree & lire_cond_init(Entree &) override
Lecture des conditions initiales dans un flot d'entree.
DoubleTab & corriger_derivee_impl(DoubleTab &) override
Resolution de la pression, inconnue implicitee de Navier Stokes.
const Fluide_base & fluide() const
Renvoie le fluide incompressible (milieu physique de l'equation) associe a l'equation.
virtual Champ_Inc_base & vitesse()
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps de l'equation.
virtual const Champ_Inc_base & vitesse() const
virtual void projeter()
Calcule la solution U des equations: | M(U-V)/dt + BtP = 0.
Operateur_Div & operateur_divergence()
Renvoie l'operateur de calcul de la divergence associe a l'equation.
void completer() override
Complete l'equation base, associe la pression a l'equation,.
int sauvegarder(Sortie &) const override
Appelle Equation_base::sauvegarder(Sortie&) et sauvegarde la pression sur un flot de sortie.
const Champ_base & get_champ(const Motcle &nom) const override
Champ_Inc_base & pression_pa()
bool initTimeStep(double dt) override
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
void abortTimeStep() override
Reinitialiser ce qui doit l'etre.
int impr(Sortie &os) const override
Effectue quelques impressions sur un flot de sortie: - maximum de div U.
virtual void calculer_pression_hydrostatique(Champ_base &pression_hydro) const
std::vector< YAML_data > data_a_sauvegarder() const override
for PDI IO: retrieve name, type and dimensions of the fields to save/restore
Champ_Inc_base & div()
void associer_pb_base(const Probleme_base &) override
S'associe au probleme: apelle Equation_base::associer_pb_base(const Probleme_base&).
virtual void sauver() const
Operateur_Conv & get_terme_convectif()
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
Operateur_Grad & operateur_gradient()
Renvoie l'operateur de calcul du gradient associe a l'equation.
Champ_Inc_base & grad_P()
virtual void discretiser_grad_p()
bool postraiter_gradient_pression_sans_masse_
Operateur_Div divergence
void update_y_plus(const DoubleTab &tab)
virtual void discretiser_assembleur_pression()
Typage de l'assembleur pression.
virtual void modify_initial_gradP(DoubleTrav &)
DoubleTab & corriger_derivee_expl(DoubleTab &) override
Add a specific term for Navier Stokes (-gradP(n)) if necessary.
int has_interface_blocs() const override
void set_param(Param &titi) const override
void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={}) const override
int verif_Cl() const override
Verifie la compatibilite des conditions limites avec l'equation.
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...
virtual int projection_a_faire()
virtual void discretiser_vitesse()
void discretiser() override
Dicretise l'equation.
void uzawa(const DoubleTab &, const Matrice_Base &, SolveurSys &, DoubleTab &, DoubleTab &)
virtual bool getCouplingInfoForFiltering() const
virtual const Champ_Don_base & diffusivite_pour_transport() const
OWN_PTR(Assembleur_base) &assembleur_pression()
int preparer_calcul() override
cf Equation_base::preparer_calcul() Assemblage du solveur pression et
Operateur_Diff & operateur_diff()
const Operateur & operateur_fonctionnel(int) const override
void reassembler_pression_si_necessaire()
const Operateur & operateur(int) const override
Renvoie le i-eme operateur de l'equation: - le terme_diffusif si i = 0.
int nombre_d_operateurs_tot() const override
void associer_milieu_base(const Milieu_base &) override
Associe un mileu physique a l'equation en construisant dynamiquement (cast) un objet de type Fluide_b...
Matrice & matrice_pression()
void assembler_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={}) const override
SolveurSys & solveur_pression()
Renvoie le solveur en pression (version const).
OBS_PTR(Fluide_base) le_fluide
const Champ_Inc_base & pression_pa() const
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
virtual void calculer_la_pression_en_pa()
Calcul de "la_pression_en_pa" en fonction de "la_pression".
int nombre_d_operateurs() const override
Renvoie le nombre d'operateurs de l'equation: Pour Navier Stokes Standard c'est 2.
DoubleTab getPressureTimeN()
Champ_Inc_base & pression()
void associer_fluide(const Fluide_base &un_fluide)
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
friend class Entree
Definition Objet_U.h:76
friend class Sortie
Definition Objet_U.h:75
classe Operateur_Conv Classe generique de la hierarchie des operateurs representant un terme
classe Operateur_Diff Classe generique de la hierarchie des operateurs representant un terme
classe Operateur_Div Classe generique de la hierarchie des operateurs calculant la divergence
Classe Operateur_Grad Classe generique de la hierarchie des operateurs calculant le gradient.
classe Operateur Classe generique de la hierarchie des operateurs.
Definition Operateur.h:39
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
class SolveurSys Un SolveurSys represente n'importe qu'elle classe
Definition SolveurSys.h:32
Classe de base des flux de sortie.
Definition Sortie.h:52
classe Traitement_particulier_NS_base Derive de Support_Champ_Masse_Volumique: utilisation de rho