1 //============================================================================
3 * \file TransportEquation.hxx
4 * \author Michael NDJINGA
7 * \brief Fluid enthalpy transport equation
9 //============================================================================
11 /*! \class TransportEquation TransportEquation.hxx "TransportEquation.hxx"
12 * \brief Scalar advection equation for a fluid enthalpy
13 * \details see \ref TransportEqPage for more details
15 #ifndef TransportEquation_HXX_
16 #define TransportEquation_HXX_
18 #include "ProblemCoreFlows.hxx"
24 /*! The fluid type can be LiquidPhase or water */
27 LiquidPhase,/**< Fluid considered is GasPhase */
28 GasPhase/**< Fluid considered is Gas */
31 //! enumeration pressureEstimate
32 /*! the pressure estimate needed to fit physical parameters */
33 enum pressureMagnitude
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) */
39 //! enumeration BoundaryType
40 /*! Boundary condition type */
41 enum BoundaryTypeTransport {InletTransport, OutletTransport, NeumannTransport, DirichletTransport, NoneBCTransport};//Actually Inlet=Dirichlet and Outlet=Neumann
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;
51 BoundaryTypeTransport bcType;
52 double T; //for inlet or Dirichlet
53 double h; //for inlet or Dirichlet
54 double flux; //for Neumann or outlet
57 class TransportEquation: public ProblemCoreFlows
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)
67 TransportEquation(phase fluid, pressureMagnitude pEstimate,vector<double> vitesseTransport, MPI_Comm comm = MPI_COMM_WORLD);
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);
77 virtual void validateTimeStep();
79 /* Boundary conditions */
80 /** \fn setIntletBoundaryCondition
81 * \brief adds a new boundary condition of type Inlet
83 * \param [in] string : the name of the boundary
84 * \param [in] double : the value of the temperature at the boundary
87 void setInletBoundaryCondition(string groupName,double enthalpy){
88 _limitField[groupName]=LimitFieldTransport(InletTransport,-1,enthalpy,-1);
91 /** \fn setNeumannBoundaryCondition
92 * \brief adds a new boundary condition of type Neumann
94 * \param [in] string the name of the boundary
97 void setNeumannBoundaryCondition(string groupName, double flux=0){
98 _limitField[groupName]=LimitFieldTransport(NeumannTransport,-1,flux,-1);
101 /** \fn setBoundaryFields
102 * \brief met à jour _limitField ( le type de condition limite )
107 void setBoundaryFields(map<string, LimitFieldTransport> boundaryFields){
108 _limitField = boundaryFields;
112 /*Physical parameters*/
113 void setLiqSatEnthalpy(double hsatl){
116 void setVapSatEnthalpy(double hsatv){
119 void setLiqSatDensity(double rhosatl){
122 void setVapSatDensity(double rhosatv){
125 void setTransportVelocity(Vector v){
129 /* set input fields to prepare the simulation */
130 vector<string> getInputFieldsNames();
131 void setInputField(const string& nameField, Field& inputField );//supply of a required input field
133 /** \fn setRodTemperatureField
134 * \brief Set the rod temperature field
139 void setRodTemperatureField(Field rodTemperature){
140 rodTemperature.getMesh().checkFastEquivalWith(_mesh);
141 _rodTemperatureField=rodTemperature;
142 _rodTemperatureFieldSet=true;
143 _isStationary=false;//Source term may be changed after previously reaching a stationary state
146 /** \fn setRodTemperature
147 * \brief Set a constant rod temperature field
152 void setRodTemperature(double rodTemp){
153 _rodTemperature=rodTemp;
154 _isStationary=false;//Source term may be changed after previously reaching a stationary state
157 /** \fn getRodTemperatureField
163 Field& getRodTemperatureField(){ // ?? je ne retrouve pas cet attribut dans le file.cxx
164 return _rodTemperatureField;
167 /* get output fields for postprocessing or coupling */
168 vector<string> getOutputFieldsNames() ;//liste tous les champs que peut fournir le code pour le postraitement
169 Field& getOutputField(const string& nameField );//Renvoie un champs pour le postraitement
171 Field& getFluidTemperatureField(){
175 Field& getEnthalpyField(){
179 Field& getVoidFractionField(){
183 Field& getDensityField(){
188 double computeTransportMatrix();
190 void updatePrimitives();
192 /* Postprocessing fields */
193 Field _TT, _Alpha, _Rho;//Fields of temperature, void fraction, density. Unknown field is enthalpy (_VV)
194 double _rhosatv, _rhosatl;
195 double _Tref, _href, _cpref;
197 double temperature(double h){
198 return _Tref+(h-_href)/_cpref;
200 double voidFraction(double h){
201 double titre=(h-_href)/(_hsatv-_hsatl);
206 else return titre*_rhosatl/(titre*_rhosatl+(1-titre)*_rhosatv);
208 double density(double alpha){
209 return alpha*_rhosatv+(1-alpha)*_rhosatl;
212 Vector _vitesseTransport, _normale;
213 bool _transportMatrixSet;
214 Vec _Hn, _deltaH, _Hk, _Hkm1, _b0;
215 Vec _Hn_seq; // Local sequential copy of the parallel vector _Hn, used for saving result files
216 double _dt_transport, _dt_src;
218 map<string, LimitFieldTransport> _limitField;
221 bool _rodTemperatureFieldSet;
222 Field _rodTemperatureField;
223 double _rodTemperature;
226 #endif /* TransportEquation_HXX_ */