00001 #include "flashhenrylaw.h"
00002 #include "hdf5orthowriter.h"
00003
00013 FlashHenryLaw::FlashHenryLaw(OrthoMesh &mesh,double Kh,double vn,double R,double T,double mc,double mw,double vc,double vw)
00014 :FlashCompositional(2,2),
00015 m_invKh(1.0/Kh),
00016 m_c(-vn/(R*T)),
00017 m_vc(vc),
00018 m_vw(vw),
00019 m_co2MV(mc),
00020 m_H2OMV(mw),
00021 m_mesh(mesh)
00022 {
00023 m_components_molar_mass.reinit(2);
00024 m_components_molar_mass(WATER)=18.01528e-3;
00025 m_components_molar_mass(CO2)=44.01e-3;
00026
00027
00028
00029
00030 }
00031
00032
00033
00034 void FlashHenryLaw::getPhasesViscosities(double P,const FlashData &data,VecDouble &visc)
00035 {
00036 assert(visc.size() == 2);
00037 visc(0)=m_vw;
00038 visc(1)=m_vc;
00039 }
00040
00041 const VecDouble& FlashHenryLaw::getComponentsMolarMass() const
00042 {
00043 return m_components_molar_mass;
00044 }
00045
00046
00047 void FlashHenryLaw::getPhasesVolume(double P, const FlashData &data, VecDouble &phasesVol)
00048 {
00049 assert(data.getNPhases() == 2);
00050 assert(data.getNComponents() ==2);
00051 assert(phasesVol.size() ==2);
00052
00053 phasesVol(1)=(data.getMoles(AQUEOUS,CO2) + data.getMoles(CO2_RICH,CO2))*m_co2MV;
00054 phasesVol(0)=data.getMoles(AQUEOUS,WATER)*m_H2OMV;
00055
00056
00057
00058 }
00059
00060 void FlashHenryLaw::flash(double P, const VecDouble &compTotalMoles, FlashData &data)
00061 {
00062
00063 double XD = P*m_invKh*exp(m_c*P);
00064
00065
00066 double mdCO2=XD*compTotalMoles(WATER)/(1-XD);
00067
00068
00069 double totalCO2=compTotalMoles(CO2);
00070
00071 if (totalCO2>mdCO2)
00072 {
00073
00074 data.setMoles(AQUEOUS,WATER,compTotalMoles(WATER));
00075 data.setMoles(CO2_RICH,WATER,0);
00076
00077
00078 data.setMoles(AQUEOUS,CO2,mdCO2);
00079
00080 data.setMoles(CO2_RICH,CO2,totalCO2-mdCO2);
00081
00082 }
00083 else
00084 {
00085
00086 data.setMoles(AQUEOUS,WATER,compTotalMoles(WATER));
00087 data.setMoles(CO2_RICH,WATER,0);
00088
00089
00090 data.setMoles(AQUEOUS,CO2,totalCO2);
00091
00092 data.setMoles(CO2_RICH,CO2,0);
00093 }
00094 }
00095
00096
00097 FlashHenryLaw::~FlashHenryLaw()
00098 {
00099
00100 }
00101
00102
00103 void FlashHenryLaw::printOutput()
00104 {
00105 HDF5OrthoWriter &hdf5 = HDF5OrthoWriter::getHDF5OrthoWriter();
00106 unsigned nCells = m_mesh.numCells();
00107 VecDouble vc(nCells);
00108 VecDouble vcSatC(nCells);
00109 FlashData data(numPhases(),numComponents(),NULL);
00110 VecDouble vv(m_mesh.numVertices());
00111 VecDouble phasesVol(2);
00112 for (unsigned i=0;i<nCells;i++)
00113 {
00114 FlashCompositional::flash(i,data);
00115 getPhasesVolume(getDynamicModule().getPressureAtCells()(i),data,phasesVol);
00116 vcSatC(i)=phasesVol(CO2_RICH)/(phasesVol(AQUEOUS)+phasesVol(CO2_RICH));
00117 }
00118 m_mesh.projectCentralValuesAtVertices(vcSatC,vv);
00119 hdf5.writeScalarField(vv,"SatC");
00120
00121 }