📄 iprcal.cpp
字号:
#include "stdafx.h"
#include "CVenus.h"
#include "math.h"
#include "fstream.h"
#include <strstrea.h>
#include <iostream.h>
#include "IPRCal.h"
#include "Flash.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define PI 3.1415926
extern int g_iProgress ; // 计算进度
extern bool bFinishThread;
extern char cGraphColor[][16];
extern int iGraphColorNum;
//===========================地层水计算物性参数================================
//========================计算天然气在水中的溶解度=============================
//fPress——压力(兆帕)
//fTemp——温度(开氏度)
//fS——矿化度(氯化钠的质量百分数)
//返回值——天然气在水中的溶解度(方/方)
float Rsw_Mineralized( float fPress, float fTemp, float fS )
{
double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
double fA = 2.12 + 0.00345*fSeta - 3.59*pow(10,-5)*fSeta*fSeta;
double fB = 0.0107 - 5.26*pow(10,-5)*fSeta + 1.48*pow(10,-7)*fSeta*fSeta;
double fC = -8.75*pow(10,-7) + 3.9*pow(10,-9)*fSeta - 1.02*pow(10,-11)*fSeta*fSeta;
double fSC = 1 - fS*(0.0753-0.000173*fSeta);
double fRswPure = ( fA + fB*(145.03*fPress) + fC*pow(145.03*fPress,2) ) / 5.615;
return float(fRswPure * fSC);
}
//=============================计算水的体积系数================================
//fPress——压力(兆帕)
//fTemp——温度(开氏度)
//fS——矿化度(氯化钠的质量百分数)
//返回值——水的体积系数
float Bw_Mineralized( float fPress, float fTemp, float fS )
{
double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
//脱气水
double fa11 = 0.9947, fa12 = 5.8*pow(10,-6), fa13 = 1.02*pow(10,-6);
double fa21 = -4.228*pow(10,-6), fa22 = 1.8376*pow(10,-8), fa23 = -6.77*pow(10,-11);
double fa31 = 1.3*pow(10,-10), fa32 = -1.3855*pow(10,-12), fa33 = 4.285*pow(10,-15);
//天然气饱和水
fa11 = 0.9911, fa12 = 6.35*pow(10,-5), fa13 = 8.5*pow(10,-7);
fa21 = -1.093*pow(10,-6), fa22 = -3.497*pow(10,-9), fa23 = 4.57*pow(10,-12);
fa31 = -5.0*pow(10,-11), fa32 = 6.429*pow(10,-13), fa33 = -1.43*pow(10,-15);
double fA1 = fa11 + fa12*fSeta + fa13*fSeta*fSeta;
double fA2 = fa21 + fa22*fSeta + fa23*fSeta*fSeta;
double fA3 = fa31 + fa32*fSeta + fa33*fSeta*fSeta;
double fBwPure = fA1 + fA2*145.03*fPress + fA3*pow(145.03*fPress,2);
double fb1 = 5.1*pow(10,-8), fb2 = 5.47*pow(10,-6), fb3 = -1.95*pow(10,-10);
double fb4 = -3.23*pow(10,-8), fb5 = 8.5*pow(10,-13);
double fSC = 1.0 + fS * ( fb1*145.03*fPress +(fb2+fb3*145.03*fPress)*(fSeta-60) + (fb4+fb5*145.03*fPress)*pow(fSeta-60,2) );
return float(fBwPure*fSC);
}
//===============================计算水的等温压缩系============================
//fPress——压力(兆帕)
//fTemp——温度(开氏度)
//fS——矿化度(氯化钠的质量百分数)
//fRsw——天然气在水中的溶解度(方/方)
//返回值——水的等温压缩系数
float Cw_Saturated( float fPress, float fTemp, float fS, float fRsw )
{
double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
double fA = 3.8546 - 0.019434*fPress;
double fB = -0.01052 + 6.9179*pow(10,-5)*fPress;
double fC = 3.9267*pow(10,-5) - 1.2763*pow(10,-7)*fPress;
//脱气水等温压缩系数
double fCwf = 145.03*pow(10,-6) * (fA+fB*fSeta+fC*fSeta*fSeta);
//饱和水等温压缩系数
double fCwg = fCwf * (1+0.05*fRsw);
//矿化度的影响
double fSC = 1 + pow(fS,0.7) * ( -0.052 + 2.7*pow(10,-4)*fSeta - 1.14*pow(10,-6)*fSeta*fSeta + 1.121*pow(10,-9)*fSeta*fSeta*fSeta );
return float(fCwg*fSC);
}
//=================================计算地层水的粘度============================
//fTemp——温度(开氏度)
//返回值——地层水的粘度(mPa.s)
float Uw_Mineralized( float fTemp )
{
double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
return (float)exp(1.003-0.01479*fSeta+1.982*pow(10,-5)*fSeta*fSeta);
}
//===========================地层原油计算物性参数==============================
//========================计算天然气在原油中的溶解度===========================
//fPress——压力(兆帕)
//fTemp——温度(开氏度)
//frg——天然气的比重
//fro——原油的比重
//返回值——天然气在原油中的溶解度(方/方)
float Rso_Standing( float fPress, float fTemp, float frg, float fro )
{
double fSeta, fD, fA;
fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
fD = 141.5 / fro -131.5;
fA = 0.0125 * fD - 0.00091 * fSeta;
return float(frg * pow( ( 7.9688*fPress + 1.4 ) * pow( 10, fA ),1.2048 ) / 5.615);
}
//frgs——分离器气体的比重
float Rso_Vasquez_Beggs( float fPress, float fTemp, float frg, float fro, float frgs )
{
double fSeta, fD;
double fC1, fC2, fC3;
fSeta = 1.8 * ( fTemp - 273 ) + 32;
fD = 141.5 / fro -131.5;
if( fro >= 0.8762 )
{
fC1 = 0.0362;
fC2 = 1.0937;
fC3 = 25.7240;
}
else
{
fC1 = 0.0178;
fC2 = 1.1870;
fC3 = 23.9310;
}
return float(frgs * fC1 * pow( 145.03 * fPress, fC2 ) * exp( fC3 * fD / ( 1.8 * fTemp ) ) / 5.615);
}
float Rso_Glaso( float fPress, float fTemp, float frg, float fro )
{
double fSeta, fD, fPxing;
fSeta = 1.8 * ( fTemp - 273 ) + 32;
fD = 141.5 / fro -131.5;
fPxing = pow( 10, 2.8869-sqrt(14.1811-3.3093*log10(145.03*fPress)));
return float(frg * pow( pow(fD, 0.989)*fPxing/pow(fSeta, 0.172), 1.2255 ) / 5.615);
}
float Rso_Calculate( float fPress, float fTemp, float frg, float fro, float frgs, int iMethod )
{
float fValue=0;
switch(iMethod)
{
case RSO_STANDING:
fValue=Rso_Standing(fPress, fTemp, frg, fro);
break;
case RSO_VASQUEZ_BEGGS:
fValue=Rso_Vasquez_Beggs(fPress, fTemp, frg, fro, frgs);
break;
case RSO_GLASO:
fValue=Rso_Glaso(fPress, fTemp, frg, fro);
break;
}
return fValue;
}
//===============================计算饱和原油体积系数==========================
//frg——天然气的比重
//fro——原油的比重
//fRs——天然气在原油中的溶解度(方/方)
//fDo——油罐原油的密度(kg/m^3)
//返回值——饱和原油体积系数
float BoSat_Definite( float frg, float fro, float fRs, float fDo )
{
return float( (1000*fro+1.205*fRs*frg)/fDo );
}
//fTemp——温度(开氏度)
float BoSat_Standing( float fTemp, float frg, float fro, float fRs )
{
double fSeta = 1.8*(fTemp-273.15)+32;
return float( 0.9759+0.00012*pow(5.615*fRs*sqrt(frg/fro)+1.25*fSeta, 1.2) );
}
//frgs——分离器气体的比重
float BoSat_Vasquez_Beggs( float fTemp, float frgs, float fro, float fRs )
{
double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
double fD = 141.5 / fro -131.5;
double fc1, fc2, fc3;
if( fro > 0.8762 )
{
fc1 = 2.626*pow(10,-3);
fc2 = 1.751*pow(10,-5);
fc3 = -1.071*pow(10,-7);
}
else
{
fc1 = 2.622*pow(10,-3);
fc2 = 1.100*pow(10,-5);
fc3 = 7.507*pow(10,-9);
}
return float( 1.0 + fc1*fRs + (fSeta-60)*(fD/frgs)*(fc2+fc3*fRs) );
}
float BoSat_Glaso( float fTemp, float frg, float fro, float fRs )
{
double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
double fBobb = 5.615*fRs*pow(frg/fro,0.526) + 0.968*fSeta;
double fA = -6.58511 + 2.91329*log10(fBobb) - 0.27683*log10(fBobb)*log10(fBobb);
return float( 1.0 + pow(10, fA) );
}
float BoSat_Marhoun( float fTemp, float frg, float fro, float fRs )
{
double fa = 0.742390, fb = 0.323294, fc = -1.202040;
double fF = pow(5.615*fRs, fa) * pow(frg, fb) * pow(fro, fc);
return float( 0.497069 + 1.5533334*pow(10,-3)*fTemp + 1.82594*pow(10,-3)*fF + 3.18099*pow(10,-6)*fF*fF );
}
//fPress——压力(兆帕)
float BoSat_Ahmed( float fPress, float fTemp, float frg, float fro, float fRs )
{
double fa1 = -4.5243973*pow(10,-4);
double fa2 = +3.9063637*pow(10,-6);
double fa3 = -5.5542509;
double fa4 = -5.7603220*pow(10,-6);
double fa5 = -3.9528992*pow(10,-9);
double fa6 = 16.2894730;
double fa7 = 3.87188870*pow(10,-4);
double fa8 = 7.07036850*pow(10,-8);
double fa9 = -1.4358395;
double fa10 = -0.12869353;
double fa11 = 0.023484894;
double fa12 = 0.015966573;
double fa13 = 0.021946351;
double fD = 141.5 / fro -131.5;
double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
double fF = fa10 + pow(5.615*fRs,fa11)*pow(fD,fa12)/pow(frg,fa13);
return float( fF + fa1*fSeta + fa2*fSeta*fSeta + fa3/fSeta
+ fa4*145.03*fPress + fa5*pow(145.03*fPress,2) + fa6/(145.03*fPress)
+ fa7*5.615*fRs + fa8*pow(5.615*fRs,2) +fa9/(5.615*fRs) );
}
float BoSat_Calculate( float fPress, float fTemp, float frg, float fro,
float fRs, float fDoTank, float frgs, int iBosatMethod )
{
switch( iBosatMethod )
{
case BOSAT_DEFINITE:
return BoSat_Definite( frg, fro, fRs, fDoTank );
case BOSAT_STANDING:
return BoSat_Standing( fTemp, frg, fro, fRs );
case BOSAT_VASQUEZ_BEGGS:
return BoSat_Vasquez_Beggs( fTemp, frgs, fro, fRs );
case BOSAT_GLASO:
return BoSat_Glaso( fTemp, frg, fro, fRs );
case BOSAT_MARHOUN:
return BoSat_Marhoun( fTemp, frg, fro, fRs );
case BOSAT_AHMED:
return BoSat_Ahmed( fPress, fTemp, frg, fro, fRs );
}
return BoSat_Definite( frg, fro, fRs, fDoTank );
}
//===============================计算未饱和原油体积系数========================
//fPress——压力(兆帕)
//fPb——原油饱和压力(兆帕)
//fCounsat——未饱和原油的等温压缩系数(1/MPa)
//fBosat——在Pb时原油的体积系数(方/方)
//返回值——未饱和原油体积系数(方/方)
float BoUnsat_Definite( float fPress, float fPb, float fCounsat, float fBosat )
{
return float( fBosat*exp(-fCounsat*(fPress-fPb)) );
}
//fTemp——温度(开氏度)
//frgs——分离器气体的比重
//frg——天然气的比重
//fro——原油的比重
//fRs——天然气在原油中的溶解度(方/方)
float BoUnsat_Vasquez_Beggs( float fPress, float fPb, float fTemp, float frgs, float fro, float fRs, float fBosat )
{
double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
double fD = 141.5 / fro -131.5;
double fA = pow(10,-5) * ( -1433 + 28.075*fRs +17.2*fSeta - 1180*frgs + 12.61*fD );
return float( fBosat*exp(-fA*log(fPress/fPb)) );
}
float BoUnsat_Ahmed( float fPress, float fPb, float fRs, float fBosat )
{
double fa = -0.026791878;
double fB = -1.0/(665.5392437+2.117285066*fRs);
return float( fBosat*exp(fB*(exp(fa*fPress)-exp(fa*fPb))) );
}
float BoUnsat_Calculate( float fPress, float fPb, float fTemp, float frg, float fro, float fRs, float fBosat, float fCoUnsat, int iBoUnsatMethod )
{
switch( iBoUnsatMethod )
{
case BOUNSAT_DEFINITE:
return BoUnsat_Definite( fPress, fPb, fCoUnsat, fBosat );
case BOUNSAT_VASQUEZ_BEGGS:
return BoUnsat_Vasquez_Beggs( fPress, fPb, fTemp, frg, fro, fRs, fBosat );
case BOUNSAT_AHMED:
return BoUnsat_Ahmed( fPress, fPb, fRs, fBosat );
}
return BoUnsat_Definite( fPress, fPb, fCoUnsat, fBosat );
}
//===============================计算饱和原油总体积系数========================
//fBo——在P、T条件下原油体积系数(方/方)
//fBg——在P、T条件下气体体积系数(方/方)
//fRsb——在Pb时天然气在原油中的溶解度(方/方)
//fRs——在P时天然气在原油中的溶解度(方/方)
//返回值——原油总体积系数(方/方)
float Bot_Definite( float fBo, float fBg, float fRsb, float fRs )
{
return float( fBo+fBg*(fRsb-fRs) );
}
//fPress——压力(MPa)
//fTemp——温度(开氏度)
//frg——天然气的比重
//fro——原油的比重
float Bot_Glaso( float fPress, float fTemp, float frg, float fro, float fRs )
{
double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
double fc = 2.9*pow(10,-0.00151605*fRs);
double fBtx = 5.615*fRs*sqrt(fSeta)/pow(frg,0.3)*pow(fro,fc)*pow(145.03*fPress,-1.1089);
double fLogBt= 0.080135 + 0.47257*log10(fBtx) + 0.17351*pow(log10(fBtx),2);
return float( pow(10,fLogBt) );
}
float Bot_Marhoun( float fPress, float fTemp, float frg, float fro, float fRs )
{
double fa = 0.644516, fb = -1.07934, fc = 0.724874, fd = 2.00621, fe = -0.76191;
double fF = pow(5.615*fRs,fa)*pow(frg,fb)*pow(fro,fc)*pow(1.8*fTemp,fd)*pow(145.03*fPress,fe);
return float( 0.314693 + 0.106253*pow(10,-4)*fF + 0.18883*pow(10,-10)*fF*fF );
}
float Bot_Calculate( float fPress, float fTemp, float frg, float fro, float fRs, int iBotMethod )
{
switch( iBotMethod )
{
case BOT_DEFINITE:
//return Bot_Definite( fBo, fBg, fRsb, fRs );
case BOT_GLASO:
return Bot_Glaso( fPress, fTemp, frg, fro, fRs );
case BOT_MARHOUN:
return Bot_Marhoun( fPress, fTemp, frg, fro, fRs );
}
return Bot_Marhoun( fPress, fTemp, frg, fro, fRs );
}
//=================================计算脱气原油的粘度==========================
//在地层温度和1个兆帕下原油的粘度
//fTemp——温度(开氏度)
//fro——原油的比重
//返回值——脱气原油的粘度(mPa.s)
float UoDegas_Standing( float fTemp, float fro )
{
double fD = 141.5 / fro -131.5;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -