00001 #include "henrylawobiblunt.h"
00002 #include "fluxforco2inj.h"
00003 #include "numericmethods.h"
00004 #include "arrayofvecdouble.h"
00005
00015 HenryLawObiBlunt::HenryLawObiBlunt(OrthoMesh &mesh,double Kh,double vn,double R,double T,double mc,double mv)
00016 :FlashBase(2,2),
00017 m_Kh(Kh),
00018 m_c(-vn/(R*T)),
00019 m_mc(mc),
00020 m_mw(mv)
00021 {
00022 }
00023
00024
00025
00026
00027 void HenryLawObiBlunt::execute()
00028 {
00029 TransportBase &trans=getTransportModule();
00030
00031 ArrayOfVecDouble &sol = trans.getSolutionAtCells();
00032 const VecDouble &vP = getDynamicModule().getPressureAtCells();
00033
00034 assert(sol.size() == vP.size());
00035
00036
00037
00038 for (unsigned i=0;i<vP.size();i++)
00039 {
00040 double Cd = sol(i,FluxForCO2Inj::_Sd);
00041 double Sc = sol(i,FluxForCO2Inj::_Sc);
00042 double P = vP(i);
00043
00044 double Xd = (P/m_Kh)*exp(m_c*P);
00045 if (Xd > 1.0)
00046 {
00047 printf("Houston we have a problem Xd == %g\n",Xd);
00048 throw new Exception("Finishing");
00049 }
00050 if (Sc >= 1.0)
00051 continue;
00052
00053
00054
00055 double NDco2 = m_mw*(1.0-Sc - Cd)*Xd/(1.0-Xd);
00056
00057
00058 double NTco2 = (Cd+Sc)*m_mc;
00059 double CdN,ScN;
00060
00061
00062 if (NTco2 >= NDco2)
00063 {
00064
00065
00066 ScN = Sc + Cd - NDco2/m_mc;
00067 CdN = NDco2/m_mc;
00068 }
00069 else
00070 {
00071 ScN = 0.0;
00072 CdN = (Cd +Sc);
00073 }
00074 sol(i,FluxForCO2Inj::_Sd)=CdN;
00075 sol(i,FluxForCO2Inj::_Sc)=ScN;
00076 }
00077 }
00078
00079 void HenryLawObiBlunt::updateDynamicModuleData()
00080 {
00081 }
00082
00083
00084
00085 HenryLawObiBlunt::~HenryLawObiBlunt()
00086 {
00087
00088 }