00001 #ifndef  _MY_FlashCO2Brine_
00002 #define _MY_FlashCO2Brine_
00003 #include "flashcompositional.h"
00004 #include "orthomesh.h"
00005 #include "flash.h"
00006 
00007 #define  LIQ_WATER_MOLAR_VOLUME 18.1 //cm^3/mol
00008 #define  DISSOLVED_SALT_MOLAR_VOLUME 18 //cm^3/mol
00009 #define  SOLID_SALT_MOLAR_VOLUME 26.994457275 //cm^3/mol
00010 
00011 
00028 class FlashCO2Brine : public FlashCompositional
00029 {
00030   
00031  protected:
00032   VecDouble m_components_molar_mass; 
00033   double m_T; 
00034   double m_volCell; 
00035   OrthoMesh &m_mesh;
00036   static bool bFirstTime;
00037   double m_A,m_B;
00038   double m_v1,m_v2;
00039  public:
00040   enum Phases {AQUEOUS, CO2_RICH, SOLID};
00041   enum Components {WATER,CO2,SALT};
00042   typedef double Gradient[3][3];
00043   FlashCO2Brine(OrthoMesh &mesh,double referenceT,double v1=5.7870370370370369e-9,double v2=6.944445e-10);
00044   virtual ~FlashCO2Brine(){}
00045   virtual void flash(double P, const VecDouble &compTotalMoles, FlashData &data);
00046 
00047   virtual const VecDouble& getComponentsMolarMass() const; 
00048   virtual  double getFluidCompressibility(double P, FlashData &data); 
00049   virtual void getPhasesVolume(double P, const FlashData &data,VecDouble &phasesVol); 
00050   virtual void getPhasesViscosities(double P,const FlashData &data,VecDouble &visc);
00051 
00052   virtual void getTotalVolumeDerivatives(double P,FlashData &data,VecDouble &dv_dm); 
00053 
00054 
00055   
00056 
00057 
00058   
00059   double getPureCO2MolarVolume(double P, double T);
00060   double getCO2MolarVolume(double P, double T);
00061   double getTotalMolarVolume(Flash::BrineCO2Data &data,double P,double T);
00062   double getAqueousMolarVolume(Flash::BrineCO2Data &data,double P,double T);
00063   double getCO2MolarVolume(Flash::BrineCO2Data &data,double P,double T);
00064   double getDissolvedCO2ApparentVolume(double P);
00065   void flash(VecDouble &m_Aq,VecDouble &m_g,const VecDouble &m_T,double P,double T);
00066 
00067   
00068   void getSaturationDerivatives();
00069   void printFlashPropertiesTable(double P0,double P1,unsigned nP, double T,double zSalt);
00070   void printCO2RichMolarVolume(double P0,double P1,unsigned nP, double T); 
00071 
00072   
00073   void getGradient(Matrix &gradMaq,Matrix &gradMg,const VecDouble &m_T,double P,double T,  double h); 
00074   void getVolGradient(VecDouble &GradVaq,VecDouble &GradVc,double P,double T,double zSalt,double zH2O,double zCO2,double h);
00075 
00076   
00077   void getMolesAqueousPhase(VecDouble &M_aq,const Flash::BrineCO2Data &data,double nT);
00078   void getMolesCO2RichPhase(VecDouble &M_g,const Flash::BrineCO2Data &data,double nT); 
00079 
00080   
00081   virtual void printOutput();
00082 
00083 };
00084 
00085 
00086 #endif