Salome HOME
:Merge branch 'master' of https://codev-tuleap.cea.fr/plugins/git/spns/SolverLab
[tools/solverlab.git] / CoreFlows / Models / inc / TransportEquation.hxx
1 //============================================================================
2 /**
3  * \file TransportEquation.hxx
4  * \author Michael NDJINGA
5  * \version 1.0
6  * \date 24 March 2015
7  * \brief Fluid enthalpy transport equation
8  * */
9 //============================================================================
10
11 /*! \class TransportEquation TransportEquation.hxx "TransportEquation.hxx"
12  *  \brief Scalar advection equation for a fluid enthalpy
13  *  \details see \ref TransportEqPage for more details
14  */
15 #ifndef TransportEquation_HXX_
16 #define TransportEquation_HXX_
17
18 #include "ProblemCoreFlows.hxx"
19
20 using namespace std;
21
22
23 //! enumeration phase
24 /*! The fluid type can be LiquidPhase or water  */
25 enum phase
26 {
27         LiquidPhase,/**< Fluid considered is GasPhase */
28         GasPhase/**< Fluid considered is Gas */
29 };
30
31 //! enumeration pressureEstimate
32 /*! the pressure estimate needed to fit physical parameters  */
33 enum pressureMagnitude
34 {
35         around1bar300KTransport,/**< pressure is around 1 bar and temperature around 300K (for TransportEquation, SinglePhase and IsothermalTwoFluid) or 373 K (saturation for DriftModel and FiveEqsTwoFluid) */
36         around155bars600KTransport/**< pressure is around 155 bars  and temperature around 618 K (saturation) */
37 };
38
39 //! enumeration BoundaryType
40 /*! Boundary condition type  */
41 enum BoundaryTypeTransport      {InletTransport,  OutletTransport, NeumannTransport, DirichletTransport, NoneBCTransport};//Actually Inlet=Dirichlet and Outlet=Neumann
42
43 /** \struct LimitField
44  * \brief value of some fields on the boundary  */
45 struct LimitFieldTransport{
46         LimitFieldTransport(){bcType=NoneBCTransport; T=0; h=0; flux=0; }
47         LimitFieldTransport(BoundaryTypeTransport _bcType, double _T,   double _h,double _flux  ){
48                 bcType=_bcType; T=_T; h=_h; flux=_flux;
49         }
50
51         BoundaryTypeTransport bcType;
52         double T; //for inlet or Dirichlet
53         double h; //for inlet or Dirichlet
54         double flux; //for Neumann or outlet
55 };
56
57 class TransportEquation: public ProblemCoreFlows
58 {
59
60 public :
61         /** \fn TransportEquation
62                          * \brief Constructor for the enthalpy transport in a fluid
63                          * \param [in] phase : \ref Liquid or \ref Gas
64                          * \param [in] pressureMagnitude : \ref around1bar or \ref around155bars
65                          * \param [in] vector<double> : fluid velocity (assumed constant)
66                          *  */
67         TransportEquation(phase fluid, pressureMagnitude pEstimate,vector<double> vitesseTransport);
68
69         //Gestion du calcul
70         virtual void initialize();
71         virtual void terminate();//vide la mémoire et enregistre le résultat final
72         bool initTimeStep(double dt);
73         double computeTimeStep(bool & stop);//propose un pas de temps pour le calcul. Celà nécessite de discrétiser les opérateur (convection, diffusion, sources) et pour chacun d'employer la condition cfl. En cas de problème durant ce calcul (exemple t=tmax), renvoie stop=true
74         void abortTimeStep();//efface les inconnues calculées par solveTimeStep() et reinitialise dt à 0
75         bool iterateTimeStep(bool &ok);
76         virtual void save();
77         virtual void validateTimeStep();
78
79         /* Boundary conditions */
80         /** \fn setIntletBoundaryCondition
81                          * \brief adds a new boundary condition of type Inlet
82                          * \details
83                          * \param [in] string : the name of the boundary
84                          * \param [in] double : the value of the temperature at the boundary
85                          * \param [out] void
86                          *  */
87         void setInletBoundaryCondition(string groupName,double enthalpy){
88                 _limitField[groupName]=LimitFieldTransport(InletTransport,-1,enthalpy,-1);
89         };
90
91         /** \fn setNeumannBoundaryCondition
92          * \brief adds a new boundary condition of type Neumann
93          * \details
94          * \param [in] string the name of the boundary
95          * \param [out] void
96          *  */
97         void setNeumannBoundaryCondition(string groupName, double flux=0){
98                 _limitField[groupName]=LimitFieldTransport(NeumannTransport,-1,flux,-1);
99         };
100
101         /** \fn setBoundaryFields
102          * \brief met à jour  _limitField  ( le type de condition limite )
103          * \details
104          * \param [in] string
105          * \param [out] void
106          *  */
107         void setBoundaryFields(map<string, LimitFieldTransport> boundaryFields){
108                 _limitField = boundaryFields;
109         };
110
111
112         /*Physical parameters*/
113         void setLiqSatEnthalpy(double hsatl){
114                 _hsatl=hsatl;
115         };
116         void setVapSatEnthalpy(double hsatv){
117                 _hsatv=hsatv;
118         };
119         void setLiqSatDensity(double rhosatl){
120                 _rhosatl=rhosatl;
121         };
122         void setVapSatDensity(double rhosatv){
123                 _rhosatv=rhosatv;
124         };
125         void setTransportVelocity(Vector v){
126                 _vitesseTransport=v;
127         };
128
129         //get output fields for postprocessing or coupling
130         vector<string> getOutputFieldsNames() ;//liste tous les champs que peut fournir le code pour le postraitement
131         Field&         getOutputField(const string& nameField );//Renvoie un champs pour le postraitement
132
133         Field& getFluidTemperatureField(){
134                 return _TT;
135         }
136
137         Field& getEnthalpyField(){
138                 return _VV;
139         }
140
141 protected :
142         double computeTransportMatrix();
143         double computeRHS();
144         void updatePrimitives();
145         double temperature(double h){
146                 return _Tref+(h-_href)/_cpref;
147         };
148         double voidFraction(double h){
149                 double titre=(h-_href)/(_hsatv-_hsatl);
150                 if (titre<0)
151                         return 0;
152                 else if (titre>1)
153                         return 1;
154                 else return titre*_rhosatl/(titre*_rhosatl+(1-titre)*_rhosatv);
155         };
156         double density(double alpha){
157                 return alpha*_rhosatv+(1-alpha)*_rhosatl;
158         };
159
160         Field   _TT, _Alpha, _Rho;//Fields of temperature and coupled temperature
161         double _rhosatv, _rhosatl;
162         double _Tref, _href, _cpref;
163         Vector _vitesseTransport, _normale;
164         bool _transportMatrixSet;
165         Vec _Hn, _deltaH, _Hk, _Hkm1, _b0;
166         double _dt_transport, _dt_src;
167
168         map<string, LimitFieldTransport> _limitField;
169 };
170
171 #endif /* TransportEquation_HXX_ */