TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Navier_Stokes_Turbulent_QC.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 <Convection_Diffusion_Chaleur_Turbulent_QC.h>
17#include <Navier_Stokes_Turbulent_QC.h>
18#include <Fluide_Quasi_Compressible.h>
19#include <Assembleur_base.h>
20#include <Probleme_base.h>
21#include <Discret_Thyd.h>
22#include <Param.h>
23
24Implemente_instanciable(Navier_Stokes_Turbulent_QC, "Navier_Stokes_Turbulent_QC", Navier_Stokes_Turbulent);
25// XD navier_stokes_turbulent_qc navier_stokes_turbulent navier_stokes_turbulent_qc INHERITS_BRACE Navier-Stokes
26// XD_CONT equations under low Mach number as well as the associated turbulence model equations.
27
29
31{
32 assert(le_fluide);
33 if (!sub_type(Fluide_Quasi_Compressible, le_fluide.valeur()))
34 {
35 Cerr << "ERROR: the equation " << this->que_suis_je() << " can be associated only to a quasi-compressible fluid." << finl;
36 exit();
37 }
39 divergence.set_description((Nom) "Mass flow rate=Integral(rho*u*ndS) [kg.s-1]");
40 return is;
41}
42
47
48/*! @brief appel Navier_Stokes_Turbulent::mettre_a_jour et Convection_Diffusion_Chaleur_Turbulent_QC::mettre_a_jour_modele
49 *
50 */
52{
54 // Elie Saikali
55 // for Pb_Hydraulique_Melange_Binaire_Turbulent_QC we do all in mettre_a_jour(temps) !
56 if (probleme().que_suis_je() != "Pb_Hydraulique_Melange_Binaire_Turbulent_QC")
57 ref_cast(Convection_Diffusion_Chaleur_Turbulent_QC,probleme().equation(1)).mettre_a_jour_modele(temps);
58}
59
65
71
73{
75 const Discret_Thyd& dis = ref_cast(Discret_Thyd, discretisation());
76 dis.vitesse(schema_temps(), domaine_dis(), rho_la_vitesse_);
77 rho_la_vitesse_->nommer("rho_u");
78}
79
80/*! @brief Appels successifs a: Navier_Stokes_std::completer()
81 *
82 * Mod_Turb_Hyd::completer() [sur le membre concerne]
83 *
84 */
86{
87 if (le_fluide->a_gravite())
88 {
89 Cerr << "Gravity=" << le_fluide->gravite() << finl;
90 //l'equation de NS en quasi compressible peut contenir un terme source de gravite
91 if (le_fluide->has_beta_t()) //pour debogage A ENLEVER APRES
92 {
93 Cerr << "Beta_t !=0 -> Boussinesq is currently used :" << finl;
94 }
95 else
96 {
97 Cerr << "Creation of the buoyancy source term for the Navier_Stokes_Turbulent_QC equation :" << finl;
98 Source t;
99 Source& so = les_sources.add(t);
100 Nom type_so = "Source_QC_Gravite_";
101 Nom disc = discretisation().que_suis_je();
102 if (disc == "VEFPreP1B")
103 disc = "VEF";
104 type_so += disc;
105 so.typer_direct(type_so);
106 so->associer_eqn(*this);
107 Cerr << so->que_suis_je() << finl;
108 }
109 }
110
112}
113
114/*! @brief cf Equation_base::preparer_calcul() Assemblage du solveur pression et
115 *
116 * initialisation de la pression.
117 *
118 * @return (int) renvoie toujours 1
119 */
124
125bool Navier_Stokes_Turbulent_QC::has_champ(const Motcle& nom, OBS_PTR(Champ_base)& ref_champ) const
126{
127 if (nom == "rho_u")
128 {
129 ref_champ = rho_la_vitesse();
130 return true;
131 }
132
133 if (Navier_Stokes_Turbulent::has_champ(nom, ref_champ))
134 return true;
135
136 if (milieu().has_champ(nom, ref_champ))
137 return true;
138
139 return false; /* rien trouve */
140}
141
143{
144 if (nom == "rho_u")
145 return true;
146
148 return true;
149
150 if (milieu().has_champ(nom))
151 return true;
152
153 return false; /* rien trouve */
154}
155
157{
158 if (nom == "rho_u")
159 return rho_la_vitesse();
160
161 OBS_PTR(Champ_base) ref_champ;
162
163 if (Navier_Stokes_Turbulent::has_champ(nom, ref_champ))
164 return ref_champ;
165
166 if (milieu().has_champ(nom, ref_champ))
167 return ref_champ;
168
169 throw std::runtime_error(std::string("Field ") + nom.getString() + std::string(" not found !"));
170}
171
172/*! @brief Calcule la derivee en temps de l'inconnue vitesse, i.
173 *
174 * e. l'acceleration dU/dt et la renvoie.
175 * Appelle Equation_base::derivee_en_temps_inco(DoubleTab& )
176 * Calcule egalement la pression.
177 *
178 * @param (DoubleTab& vpoint) le tableau des valeurs de l'acceleration dU/dt
179 * @return (DoubleTab&) le tableau des valeurs de l'acceleration (derivee de la vitesse)
180 */
185
186void Navier_Stokes_Turbulent_QC::assembler(Matrice_Morse& mat_morse, const DoubleTab& present, DoubleTab& secmem)
187{
188 return Navier_Stokes_Fluide_Dilatable_Proto::assembler_impl(mat_morse, present, secmem);
189}
190void Navier_Stokes_Turbulent_QC::assembler_avec_inertie(Matrice_Morse& mat_morse, const DoubleTab& present, DoubleTab& secmem)
191{
192 return Navier_Stokes_Fluide_Dilatable_Proto::assembler_avec_inertie_impl(*this, mat_morse, present, secmem);
193}
194
196{
197
198 DoubleTab& tab_vitesse = inconnue().valeurs();
199
200 Fluide_Quasi_Compressible& fluide_QC = ref_cast(Fluide_Quasi_Compressible, le_fluide.valeur());
201
202 const DoubleTab& tab_rho = fluide_QC.rho_discvit();
203
204 DoubleTab& rhovitesse = rho_la_vitesse_->valeurs();
205 Navier_Stokes_Fluide_Dilatable_Proto::rho_vitesse_impl(tab_rho, tab_vitesse, rhovitesse);
206
208}
classe Champ_Don_base classe de base des Champs donnes (non calcules)
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 Convection_Diffusion_Chaleur_Turbulent_QC Cette classe represente le cas particulier de
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 int impr(Sortie &os) const
Imprime les operateurs de l'equation sur un flot de sortie, de facon inconditionnelle.
Sources les_sources
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
virtual void discretiser()
Discretise l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const DoubleTab & rho_discvit() const
classe Fluide_Quasi_Compressible Cette classe represente un d'un fluide quasi compressible
const Champ_Don_base & viscosite_dynamique() const
Definition Fluide_base.h:60
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
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_impl(Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &secmem)
classe Navier_Stokes_Turbulent Cette classe represente l'equation de la dynamique pour un fluide
const Champ_Don_base & diffusivite_pour_transport() const override
void discretiser() override
Dicretise l'equation.
int preparer_calcul() override
cf Equation_base::preparer_calcul() Assemblage du solveur pression et
bool initTimeStep(double dt) override
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
const Champ_Inc_base & rho_la_vitesse() const override
void assembler_avec_inertie(Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &secmem) override
DoubleTab & derivee_en_temps_inco(DoubleTab &) override
Calcule la derivee en temps de l'inconnue vitesse, i.
void mettre_a_jour(double) override
appel Navier_Stokes_Turbulent::mettre_a_jour et Convection_Diffusion_Chaleur_Turbulent_QC::mettre_a_j...
void assembler(Matrice_Morse &mat_morse, const DoubleTab &present, DoubleTab &secmem) override
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
int impr(Sortie &) const override
Effectue quelques impressions sur un flot de sortie: - maximum de div U.
void imprimer(Sortie &os) const override
Imprime les operateurs de l'equation si le schema en temps indique que c'est necessaire.
void completer() override
Appels successifs a: Navier_Stokes_std::completer().
const Champ_base & get_champ(const Motcle &nom) const override
classe Navier_Stokes_Turbulent Cette classe represente l'equation de la dynamique pour un fluide
void mettre_a_jour(double) override
Effecttue une mise a jour en temps de l'equation.
int preparer_calcul() override
Prepare le calcul.
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
bool initTimeStep(double dt) override
Allocation et initialisation de l'inconnue et des CLs jusqu'a present+dt.
void completer() override
Appels successifs a: Navier_Stokes_std::completer().
void imprimer(Sortie &) const override
Imprime les operateurs de l'equation si le schema en temps indique que c'est necessaire.
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).
const Fluide_base & fluide() const
Renvoie le fluide incompressible (milieu physique de l'equation) associe a l'equation.
Operateur_Div divergence
OBS_PTR(Fluide_base) le_fluide
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
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
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
classe Source Classe generique de la hierarchie des sources, un objet Source peut
Definition Source.h:33
void typer_direct(const Nom &)
Definition Source.cpp:41