TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Loi_Etat_GR_base.cpp
1/****************************************************************************
2* Copyright (c) 2024, 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 <Fluide_Quasi_Compressible.h>
17#include <Loi_Etat_GR_base.h>
18#include <Champ_Uniforme.h>
19#include <Motcle.h>
20
21Implemente_base_sans_constructeur(Loi_Etat_GR_base,"Loi_Etat_Gaz_Reel_base",Loi_Etat_base);
22// XD loi_etat_gaz_reel_base loi_etat_base loi_etat_gaz_reel_base INHERITS_BRACE Basic class for real gases state laws
23// XD_CONT used with a dilatable fluid.
24
26
28{
29 os <<que_suis_je()<< finl;
30 return os;
31}
32
34{
35 return is;
36}
37
38/*! @brief Renvoie le type de fluide associe.
39 *
40 * @param (Sortie& os) le flot de sortie pour l'impression
41 * @return (Sortie&) le flot de sortie modifie
42 */
44{
45 return "Gaz_Reel";
46}
47
48/*! @brief Initialise la loi d'etat : calcul Pth
49 *
50 */
52{
53 le_fluide->inco_chaleur().nommer("enthalpie");
54
55 const DoubleTab& tab_H = le_fluide->inco_chaleur().valeurs();
56 const DoubleTab& tab_rho = le_fluide->masse_volumique().valeurs();
57 int i, n = tab_H.dimension(0);
58 DoubleTab& tab_T = temperature_->valeurs();
59 tab_TempC.resize(n);
60 double Pth = le_fluide->pression_th();
61 for (i=0 ; i<n ; i++)
62 {
63 tab_rho_n(i) = tab_rho(i,0);
64 tab_TempC(i) = calculer_temperature(Pth,tab_H(i,0));
65 tab_T(i) = tab_TempC(i);
66 }
67 tab_Cp.ref(le_fluide->capacite_calorifique().valeurs());
69}
70
71/*! @brief Initialise l'enthalpie
72 *
73 */
75{
76 /*
77 * XXX XXX XXX
78 * l'inconnue inco_chaleur est d'abord remplie avec la temperature initiale.
79 * il faut la transfomer en enthalpie ;
80 * les donnes sont la masse volumique et la temperature
81 * on doit donc calculer l'enthalpie et la pression
82 */
83
84 DoubleTab& tab_TH = le_fluide->inco_chaleur().valeurs();
85 double Pth = le_fluide->pression_th();
86 DoubleTab& tab_rho = le_fluide->masse_volumique().valeurs();
87 tab_rho_n=tab_rho;
88 tab_rho_np1=tab_rho;
89 int som,n = tab_TH.dimension(0);
90 if (le_fluide->inco_chaleur().le_nom() == "enthalpie")
91 {
92 for (som=0 ; som<n ; som++)
93 tab_rho_np1(som) = tab_rho(som,0) = tab_rho_n(som) = calculer_masse_volumique(Pth,tab_TH(som,0));
94 }
95 else
96 {
97 for (som=0 ; som<n ; som++)
98 {
99 tab_TH(som,0) = calculer_H(Pth,tab_TH(som,0));
100 tab_rho_np1(som) = tab_rho(som,0) = tab_rho_n(som) = calculer_masse_volumique(Pth,tab_TH(som,0));
101 }
102 }
103 Cerr<<"FIN Loi_Etat_GR_base::initialiser_H Pth = "<<Pth<<" H = "<<tab_TH(0,0)<<finl;
104}
105
106/*! @brief Remplit le tableau de la temperature : T=temp+273.
107 *
108 * 15
109 *
110 */
112{
113 const DoubleTab& tab_H = le_fluide->inco_chaleur().valeurs();
114 int i, n = tab_TempC.dimension(0);
115 DoubleTab& tab_T = temperature_->valeurs();
116 double Pth = le_fluide->pression_th();
117 for (i=0 ; i<n ; i++)
118 {
119 tab_TempC(i) = calculer_temperature(Pth,tab_H(i,0));
120 tab_T(i,0) = tab_TempC(i);
121 }
122}
123
124/*! @brief Calcule le Cp en fonction des grandeurs physiques P, T, rho Cp = dh/dT = de/dT - 1/rho^2*drho/dT
125 *
126 * @param (double Tmp) temperature
127 */
128double Loi_Etat_GR_base::Cp_calc(double P, double h) const
129{
130 double res;
131 if (R==-1) res = 1./(DT_DH(P,h));
132 else res = Cp_;
133
134 return res;
135}
136
137/*! @brief Calcule le Cp avec le polynome PolyCp_
138 *
139 */
141{
142 double Pth = le_fluide->pression_th();
143 const DoubleTab& tab_h = le_fluide->inco_chaleur().valeurs();
144 for (int i=0; i<tab_Cp.size(); i++) tab_Cp(i) = Cp_calc(Pth,tab_h(i,0));
145}
146
147/*! @brief Calcule la conductivite /Cp : equivlent a k*dT/dh pour utiliser l'enthalpie dans l'operatur de diffusion
148 *
149 */
151{
152 const Champ_Don_base& mu = le_fluide->viscosite_dynamique();
153 const DoubleTab& tab_mu = mu.valeurs();
154 Champ_Don_base& lambda = le_fluide->conductivite();
155 DoubleTab& tab_lambda = lambda.valeurs();
156
157 int i, n=tab_lambda.size();
158 if (!sub_type(Champ_Uniforme,lambda))
159 {
160 if (sub_type(Champ_Uniforme,mu))
161 {
162 for (i=0 ; i<n ; i++) tab_lambda(i,0) = tab_mu(0,0) * tab_Cp(i) / Pr_;
163 }
164 else
165 {
166 for (i=0 ; i<n ; i++) tab_lambda(i,0) = tab_mu(i,0) * tab_Cp(i) / Pr_;
167 }
168 }
169}
170
171double Loi_Etat_GR_base::De_DP(double P, double T) const
172{
173 double res = 0;
174 Cerr<<"Loi_Etat_GR_base::De_DP non accede normalement"<<finl;
175 abort();
176 return res;
177}
178double Loi_Etat_GR_base::De_DT(double P, double T) const
179{
180 double res = 0;
181 Cerr<<"Loi_Etat_GR_base::De_DP non accede normalement"<<finl;
182 abort();
183 return res;
184}
185
186/*! @brief Calcule la pression avec la temperature et la masse volumique
187 *
188 */
189double Loi_Etat_GR_base::inverser_Pth(double H, double rho)
190{
191 double P = le_fluide->pression_th();
192 double acc = (calculer_masse_volumique(P,H) - rho) / Drho_DP(P,H);
193 int i=0;
194 while (std::fabs(acc)>1e-8 && i<1000)
195 {
196 P = P-acc;
197 acc = (calculer_masse_volumique(P,H) - rho) / Drho_DP(P,H);
198 i++;
199 }
200 if (std::fabs(acc)>1e-8)
201 {
202 Cerr<<"Probleme dans l'inversion de la pression : nb_iter="<<i<<finl;
203 Cerr<<" Pth="<<P<<" H="<<H<<" rho="<<rho<<finl;
204 abort();
205 }
206 return P;
207}
208
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_Uniforme Represente un champ constant dans l'espace et dans le temps.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Loi_Etat_GR_base Cette classe represente la loi d'etat base pour les gaz reels.
void calculer_Cp() override
Calcule le Cp avec le polynome PolyCp_.
void initialiser_inco_ch() override
Initialise l'enthalpie.
double De_DT(double, double) const override
virtual double calculer_temperature(double, double)=0
double De_DP(double, double) const override
void calculer_lambda() override
Calcule la conductivite /Cp : equivlent a k*dT/dh pour utiliser l'enthalpie dans l'operatur de diffus...
void calculer_masse_volumique() override
Recalcule la masse volumique.
double calculer_H(double, double) const override=0
Cas gaz parfait : ne fait rien Cas gaz Reel : doit recalculer l'enthalpie a partir de la pression et ...
double inverser_Pth(double, double) override
Calcule la pression avec la temperature et la masse volumique.
double Cp_calc(double, double) const
Calcule le Cp en fonction des grandeurs physiques P, T, rho Cp = dh/dT = de/dT - 1/rho^2*drho/dT.
void remplir_T() override
Remplit le tableau de la temperature : T=temp+273.
const Nom type_fluide() const override
Renvoie le type de fluide associe.
void initialiser() override
Initialise la loi d'etat : calcul Pth.
virtual double DT_DH(double, double) const =0
double Drho_DP(double, double) const override=0
classe Loi_Etat_base Cette classe est la base de la hierarchie des lois d'etat.
DoubleTab tab_rho_np1
DoubleTab tab_rho_n
virtual void calculer_masse_volumique()
Recalcule la masse volumique.
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
virtual void nommer(const Nom &)
Donne un nom a l'Objet_U Methode virtuelle a surcharger.
Definition Objet_U.cpp:329
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 abort()
Routine de sortie de Trio-U sur une erreur abort().
Definition Process.cpp:570
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
_SIZE_ size() const
Definition TRUSTVect.tpp:45