Salome HOME
Added a function to save all fields in signe phase flows
[tools/solverlab.git] / CoreFlows / Models / inc / Fluide.h
1 #ifndef FLUIDE_H
2 #define FLUIDE_H
3
4 #include <string>
5 #include "math.h"
6 #include "CdmathException.hxx"
7
8 /*! \class Fluide Fluide.hxx "Fluide.hxx"
9  *  \brief Fluid thermodynamics properties
10  *  \details Provides pressure, density, temperature, internal energy, enthalpy, viscosity and conductivity 
11  */
12
13 using namespace std;
14
15 class Fluide{
16  protected:
17   double _mu, _lambda,_Cv, _Cp,_Tref,_gamma,  _p0, _q,_dragCoeff;
18  public:
19   Fluide(){_mu=0; _lambda=0;_Cv=0;_Cp=0;_Tref=0;_dragCoeff=0;_gamma=0;  _p0=0; _q=0;}
20   virtual ~Fluide(){};
21
22   //Stiffened gas equation of state
23   double getPressure(double  rhoe,const double  rho) {
24         return (_gamma - 1) * (rhoe - rho*_q) - _gamma*_p0;
25   };
26   double getPressureFromEnthalpy(double  h,const double  rho) {
27         return (_gamma - 1)/_gamma * rho * (h - _q) - _p0;
28   };
29   /*For the newton scheme in the IsothermalTwoFluid model */
30   double getPressureDerivativeRhoE()  { return _gamma - 1; }
31   double getDensityFromEnthalpy(double p, double h)
32   {
33         return _gamma*(p+_p0)/((_gamma-1)*(h-_q));
34   }
35   double vitesseSonEnthalpie(double h) {  return sqrt((_gamma-1)*h);  };
36   double vitesseSonTemperature(const double T, const double rho)
37   {
38         double h= getEnthalpy(T,rho);
39         return vitesseSonEnthalpie(h);
40   }
41
42   double getViscosity(double T) {return _mu;};
43   double getConductivity(double T) {return _lambda;};
44   double getDragCoeffs(double T) { return _dragCoeff;};
45   void setViscosity(double mu) { _mu=mu;};
46   void setConductivity(double lambda) { _lambda= lambda;};
47   void setDragCoeffs(double dragCoeff) {_dragCoeff=dragCoeff;};
48   //return constants gamma, cp, cv, p0, q
49   double constante(string name)
50   {
51         if(name== "gamma")
52                 return _gamma;
53         else if (name == "cv"||name == "Cv")
54                 return _Cv;
55         else if (name == "cp"||name == "Cp")
56                 return _Cp;
57         else if(name=="p0")
58                 return _p0;
59         else if(name=="q")
60                 return _q;
61         else
62                 throw CdmathException("Unknown constant: "+name);
63   }
64   virtual double getDensity(double p, double T)=0;
65   virtual double getTemperatureFromPressure(const double  p, const double rho)=0;
66   virtual double getTemperatureFromEnthalpy(const double  h, const double rho)=0;
67   virtual double getInternalEnergy(double T, double rho)=0;
68   virtual double getEnthalpy(double T, double rho)=0;
69
70 };
71
72 // A standard stiffened gas class
73
74 /*! \class StiffenedGas Fluide.hxx "Fluide.hxx"
75  *  \brief Class implementing a standard stiffened gas law between pressure, density and internal energy
76  *  \details  
77  */
78 class StiffenedGas:public Fluide{
79  private:
80   double  _e_ref;//Stiffened gas law : P=(gamma - 1) * rho e(T) - _gamma*_p0
81  public:
82   StiffenedGas():Fluide(){_e_ref=0;};
83   //Perfect gas EOS
84   StiffenedGas( double gamma, double cv, double T_ref, double e_ref);
85   //Stiffened gas law fitting reference pressure, density and sound speed
86   StiffenedGas(double rho_ref, double p_ref, double T_ref, double e_ref, double soundSpeed_ref, double heatCap_ref);
87
88   double getInternalEnergy(double T, double rho=0);
89   double getEnthalpy(double T, double rho);
90   double getTemperatureFromPressure(double  p, double rho);
91   double getTemperatureFromEnthalpy(const double  h, const double rho);
92   double getDensity(double p, double T);
93
94   // Functions used to compute the Roe matrix for the five equation model (Kieu)
95   /* get differential of the density rho = rho(P,e)
96    * wrt the pressure (const e) wrt the internal energy (const P) */
97   double getJumpDensPress(const double e_l, const double e_r);
98   double getJumpDensInternalEnergy(const double p_l,const double p_r,const double e_l,const double e_r);
99   double getJumpInternalEnergyTemperature();
100   double getDiffDensPress(const double e);
101   double getDiffDensInternalEnergy(const double p,const double e);
102   double getDiffInternalEnergyTemperature();
103   /* get differential of the density rho = rho(P,h)
104      * wrt the pressure (const h) wrt the enthalpy (const P) */
105   double getDiffDensEnthalpyPressconstant(const double p, const double h);
106   double getDiffDensPressEnthalpyconstant(const double h);
107 };
108
109 // S. Dellacherie stiffened gas class
110
111 /*! \class StiffenedGasDellacherie Fluide.hxx "Fluide.hxx"
112  *  \brief Class implementing a particular stiffened gas law including saturation properties
113  *  \details
114  */
115 class StiffenedGasDellacherie:public Fluide{
116  private:
117   double _h_ref;//Stiffened gas law according to S. Dellacherie : P=(gamma - 1) * rho (e(T)-q) - _gamma*_p0
118  public:
119   StiffenedGasDellacherie():Fluide(){_h_ref=0;};
120   /* Loi des gaz raidis avec coefficients imposés suivant S. Dellacherie*/
121   StiffenedGasDellacherie( double gamma, double p0, double q, double cv);
122
123   double getInternalEnergy(double T, double rho);
124   double getEnthalpy(double T, double rho=0);
125   double getTemperatureFromPressure(double  p, double rho);
126   double getTemperatureFromEnthalpy(const double  h, const double rho=0);
127   double getDensity(double p, double T);
128
129  };
130 #endif