📄 iprcal.cpp
字号:
double fa = pow(10,0.43+8.33/fD);
return float( (0.32+1.8*pow(10,7)/pow(fD,4.53))*pow(360/(1.8*fTemp-260),fa) );
}
float UoDegas_Beggs_Robinson( float fTemp, float fro )
{
double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
double fD = 141.5 / fro -131.5;
double fY = pow(10,3.0324-0.02023*fD);
double fX = fY*pow(fSeta,-1.163);
return float( pow(10,fX)-1 );
}
float UoDegas_Glaso( float fTemp, float fro )
{
double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
double fD = 141.5 / fro -131.5;
double fa = 10.313*log10(fSeta)-36.447;
return float( 3.141*pow(10,10)*pow(fSeta,-3.444)*pow(log10(fD),fa) );
}
float UoDegas_Calculate( float fTemp, float fro, int iUoDegasMethod )
{
switch( iUoDegasMethod )
{
case UODEGAS_STANDING:
return UoDegas_Standing( fTemp, fro );
case UODEGAS_BEGGS_ROBINSON:
return UoDegas_Beggs_Robinson( fTemp, fro );
case UODEGAS_GLASO:
return UoDegas_Glaso( fTemp, fro );
}
return UoDegas_Standing( fTemp, fro );
}
//=================================计算饱和原油的粘度==========================
//fUod——脱气原油的粘度(mPa.s)
//fRs——在P时天然气在原油中的溶解度(方/方)
//返回值——在泡点压力下原油的粘度(mPa.s)
float UoSat_Standing( float fUod, float fRs )
{
double fa = 5.615*fRs*(1.2353*pow(10,-6)*fRs-7.4*pow(10,-4));
double fc = 4.84*pow(10,-4)*fRs;
double fd = 6.18*pow(10,-3)*fRs;
double fe = 2.10*pow(10,-2)*fRs;
double fb = 0.68*pow(10,-fc) + 0.25*pow(10,-fd) + 0.062*pow(10,-fe);
return float( pow(10,fa)*pow(fUod,fb) );
}
float UoSat_Beggs_Robinson( float fUod, float fRs )
{
double fa = 10.715*pow(5.615*fRs+100,-0.515);
double fb = 5.44*pow(5.615*fRs+150,-0.338);
return float( fa*pow(fUod,fb) );
}
//fTemp——温度(开氏度)
//frg——气体的比重
//fro——原油的比重
float UoSat_Khan( float fTemp, float frg, float fro, float fRs )
{
double fSetar = 1.8*fTemp/460;
return float( 0.09*sqrt(frg)/(pow(5.615*fRs,1.0/3.0)*pow(fSetar,4.5)*pow(1-fro,3)) );
}
float UoSat_Calculate( float fTemp, float frg, float fro, float fRs, float fUod, int iUosatMethod )
{
switch( iUosatMethod )
{
case UOSAT_STANDING:
return UoSat_Standing( fUod, fRs );
case UOSAT_BEGGS_ROBINSON:
return UoSat_Beggs_Robinson( fUod, fRs );
case UOSAT_KHAN:
return UoSat_Khan( fTemp, frg, fro, fRs );
}
return UoSat_Standing( fUod, fRs );
}
//=================================计算未饱和原油的粘度========================
//fPress——压力(兆帕)
//fPb——原油饱和压力(兆帕)
//fUob——在泡点压力下原油的粘度(mPa.s)
//返回值——未饱和原油的粘度(mPa.s)
float UoUnsat_Standing( float fPress, float fPb, float fUob )
{
return float( fUob + 0.14503*(fPress-fPb)*(0.024*pow(fUob,1.6)+0.038*pow(fUob,0.56)) );
}
float UoUnsat_Vasquez_Beggs( float fPress, float fPb, float fUob )
{
double fa = -5.66*pow(10,-3)*fPress-5;
double fm = 956.4*pow(fPress,1.187)*pow(10,fa);
return float( fUob*pow(fPress/fPb, fm) );
}
float UoUnsat_Khan( float fPress, float fPb, float fUob )
{
return float( fUob*exp(0.014*(fPress-fPb)) );
}
//float UoUnsat_Khan( float fPress, float fPb, float fUob )
//{
// return fUob*pow(fPress/fPb,-0.14)*exp(-0.036*(fPress-fPb));
//}
float UoUnsat_Calculate( float fPress, float fPb, float fUob, int iUoUnsatMethod )
{
switch( iUoUnsatMethod )
{
case UOUNSAT_STANDING:
return UoUnsat_Standing( fPress, fPb, fUob );
case UOUNSAT_VASQUEZ_BEGGS:
return UoUnsat_Vasquez_Beggs( fPress, fPb, fUob );
case UOUNSAT_KHAN:
return UoUnsat_Khan( fPress, fPb, fUob );
}
return UoUnsat_Standing( fPress, fPb, fUob );
}
//==============================计算未饱和原油等温压缩系数=====================
//fPress——压力(兆帕)
//fTemp——温度(开氏度)
//frgs——分离器气体的比重
//fro——原油的比重
//fRs——在P时天然气在原油中的溶解度(方/方)
//返回值——未饱和原油的等温压缩系数(1/MPa)
float CoUnsat_Vasquez_Beggs( float fPress, float fTemp, float frgs, float fro, float fRs )
{
double fSeta, fD;
fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
fD = 141.5 / fro -131.5;
return float( (-1433+28.075*fRs+17.2*fSeta-1180*frgs+12.6*fD)*pow(10,-5)/fPress );
}
float CoUnsat_Ahmed( float fPress, float fRs )
{
return float( exp(-0.026791878*fPress)/(171.28237+0.5449*fRs) );
}
float CoUnsat_Calculate( float fPress, float fTemp, float frgs, float fro, float fRs, int iCoUnsatMethod )
{
switch( iCoUnsatMethod )
{
case COUNSAT_VASQUEZ_BEGGS:
return CoUnsat_Vasquez_Beggs( fPress, fTemp, frgs, fro, fRs );
case COUNSAT_AHMED:
return CoUnsat_Ahmed( fPress, fRs );
}
return CoUnsat_Ahmed( fPress, fRs );
}
//=============================计算气体物性参数================================
//====================入口压力用兆帕 温度用开氏度==========================
//================================临界参数计算=================================
void CalculateTcPc(float fCO2, float fH2S, float fN2, float fRg, float &fTc, float &fPc)
{
double fRghc=(fRg-0.967*fN2-1.52*fCO2-1.18*fH2S)/(1-fN2-fCO2-fH2S);
//Standing公式
/*switch(iGasType)
{
case GASTYPE_DRY:
case GASTYPE_COMPOSITION:
fTc=168+325*fRghc-12.5*fRghc*fRghc;
fPc=709.6-58.7*fRghc;
break;
case GASTYPE_WET:
case GASTYPE_CONDENSATE:*/
fTc=float(187+330*fRghc-71.5*fRghc*fRghc);
fPc=float(706-51.7*fRghc-11.1*fRghc*fRghc);
/*break;
default:
fTc=187+330*fRghc-71.5*fRghc*fRghc;
fPc=706-51.7*fRghc-11.1*fRghc*fRghc;
break;
}*/
fTc=float((1-fN2-fCO2-fH2S)*fTc+547.9*fCO2+672.7*fH2S+227.6*fN2);
fPc=float((1-fN2-fCO2-fH2S)*fPc+1071*fCO2+1306*fH2S+493*fN2);
//对H2S和CO2的校正
double fTcP=120*(pow(fCO2+fH2S,0.9)-pow(fCO2+fH2S,1.6))
+15*(pow(fH2S,0.5)-pow(fH2S,4));
fPc=float(fPc*(fTc-fTcP)/(fTc+fTcP*(fH2S-fH2S*fH2S)));
fTc=float(fTc-fTcP);
//对N2的校正
fPc=float(fPc-1.1583*fN2*1000/6.894757);
fTc=float(fTc-149.44*fN2*1.8);
fTc = float(fTc/1.8);
fPc = float(fPc*6.894757e-3);
}
void CalculateTcPc(float* pfZi, float &fTc, float &fPc, float &fGamag)
{
char pBuf[256];
float fMi, fPci, fTci;
ifstream inFile( "GCPVT.PVT" );
inFile.getline( pBuf, 128 );
for( int i=0; i<TOTALCOMNUM-1; i++ )
{
inFile.getline( pBuf, 128 );
inFile.getline( pBuf, 128 );
istrstream pvtData( pBuf );
pvtData>>fMi >>fTci >>fPci;
fTc = fTc + pfZi[i]*fTci;
fPc = fPc + pfZi[i]*fPci;
fGamag = fGamag + pfZi[i]*fMi;
}
fGamag = float(fGamag/28.9);
}
//============================气体偏差因子计算=================================
//fPseudoTc——拟临界温度(开氏度)
//fPseudoPc——拟临界压力(兆帕)
//fTemp——温度(开氏度)
//fPress——压力(兆帕)
//返回值——气体偏差因子
float Zg_Hall_Yarbough( float fPseudoTc, float fPseudoPc, float fTemp, float fPress )
{
double fTr = fTemp / fPseudoTc, fPr = fPress / fPseudoPc;
double R1, R2, R3, R_1;
double Item1, Item2, Item3, Item4;
double FR, DFR;
Item1 = -14.76/fTr + 9.76/fTr/fTr - 4.58/fTr/fTr/fTr;
Item2 = 90.7/fTr - 242.2/fTr/fTr + 42.4/fTr/fTr/fTr;
Item3 = 1.18 + 2.82/fTr;
Item4 = 0.06125*fPr*exp( -1.2*(1.0-1.0/fTr)*(1.0-1.0/fTr) ) / fTr;
R1 = Item4;
do
{
R2 = R1*R1 ;
R3 = R2*R1 ;
R_1 = 1.0-R1;
FR = (1.0+R1+R2-R3)/(R_1*R_1*R_1) + Item1*R1
+ Item2*pow(R1,Item3) - Item4/R1;
DFR = (4.0+4.0*R1-2.0*R2)/(R_1*R_1*R_1*R_1)
+ Item1 + Item3*Item2*pow(R1,Item3-1.0)
+ Item4/R1/R1;
R1 = R1-FR/DFR;
R1 = fabs(R1);
}while( fabs(FR/DFR) > .0001 );
return float(Item4/R1);
}
//Press<35MPa
float Zg_Dranchuk_Purvis_Robinson( float fPseudoTc, float fPseudoPc, float fTemp, float fPress )
{
double fTr = fTemp / fPseudoTc, fPr = fPress / fPseudoPc;
double FR, DFR;
double Item1,Item2,Item3,Item4,Item5,Item6;
double R1, tem1;
Item1 = 0.31506237 - 1.0467099/fTr - 0.57832729/fTr/fTr/fTr;
Item2 = 0.53530771 - 0.61232032/fTr;
Item3 = 0.61232032*0.10488813/fTr;
Item4 = 0.68157001/fTr/fTr/fTr;
Item5 = 0.68446549; //a8
Item6 = -0.27*fPr/fTr;
R1 = -Item6;
do
{
tem1 = Item5*R1*R1;
FR = 1.0 + Item6/R1 + Item1*R1 + Item2*R1*R1 + Item3*pow(R1,5);
FR = FR + Item4*R1*R1*(1.0+tem1)*exp(-tem1);
DFR = -Item6/R1/R1 + Item1 + 2.0*Item2*R1 + 5.0*Item3*pow(R1,4);
DFR = DFR + 2.0*Item4*R1*(1.0+tem1-tem1*tem1)*exp(-tem1);
R1 = R1-FR/DFR;
}while( fabs(FR/DFR)>0.00001 );
return float(0.27*fPr/R1/fTr);
}
float Zg_Calculate( float fPseudoTc, float fPseudoPc, float fTemp, float fPress, int iZgMethod )
{
switch( iZgMethod )
{
case ZG_HALL_YARBOUGH:
return Zg_Hall_Yarbough( fPseudoTc, fPseudoPc, fTemp, fPress );
case ZG_DRANCHUK_PURVIS_ROBINSON:
return Zg_Dranchuk_Purvis_Robinson( fPseudoTc, fPseudoPc, fTemp, fPress );
case ZG_DEFAULT:
//if( fPress > 35 )
// return Zg_Hall_Yarbough( fPseudoTc, fPseudoPc, fTemp, fPress );
return Zg_Dranchuk_Purvis_Robinson( fPseudoTc, fPseudoPc, fTemp, fPress );
}
return Zg_Hall_Yarbough( fPseudoTc, fPseudoPc, fTemp, fPress );
}
//=============================计算气体压缩系数计算============================
//fPseudoTc——拟临界温度(开氏度)
//fPseudoPc——拟临界压力(兆帕)
//fTemp——温度(开氏度)
//fPress——压力(兆帕)
//fZ——气体偏差因子
//返回值——气体压缩系数(1/MPa)
float Cg_Hall_Yarbough( float fPseudoTc, float fPseudoPc, float fTemp, float fPress, float fZ )
{
double fPr = fPress/fPseudoPc, fTr = fTemp/fPseudoTc;
double R1, ftmp, fSum;
double DyDp, DzDp;
ftmp = 0.06125*fPr*exp( -1.2*(1.0-1.0/fTr)*(1.0-1.0/fTr) ) / fTr;
R1 = ftmp/fZ;
fSum = ( 4 + 4*R1 - 2*R1*R1 ) / pow( (1-R1), 4 );
fSum = fSum - ( 14.76/fTr - 9.76/fTr/fTr + 4.58/fTr/fTr/fTr );
fSum = fSum + ( 90.7/fTr - 242.2/fTr/fTr + 42.4/fTr/fTr/fTr )
* ( 1.18 + 2.82/fTr )*pow( R1, ( 0.18+2.82/fTr ) );
fSum = fSum + ftmp/R1/R1;
DyDp = ftmp/fPress/R1/fSum;
DzDp = ftmp*( 1.0/R1 - fPress*DyDp/R1/R1 )/fPress;
return float(1.0/fPress - DzDp/fZ);
}
//Press<35Mpa
float Cg_Mattar_Brar_Aziz( float fPseudoTc, float fPseudoPc, float fTemp, float fPress, float fZ )
{
double fPr = fPress/fPseudoPc, fTr = fTemp/fPseudoTc;
double Item1,Item2,Item3,Item4,Item5;
double R1, DzDp;
R1 = 0.27*fPr/(fZ*fTr);
Item1 = 0.31506237 - 1.0467099/fTr - 0.57832729/fTr/fTr/fTr;
Item2 = 0.53530771 - 0.61232023/fTr;
Item3 = 0.61232023*0.10488813/fTr;
Item4 = 0.68157001/fTr/fTr/fTr;
Item5 = 0.68446549*R1*R1; //a8
DzDp = Item1 + 2.0*Item2*R1 + 5.0*Item3*pow(R1,4)
+ 2.0*Item4*R1*(1.0+Item5-Item5*Item5)*exp(-Item5);
return float(1.0/fPress - ( 0.27/(fZ*fZ*fTr*fPseudoPc) ) * DzDp/(1.0+R1*DzDp/fZ));
}
float Cg_Calculate( float fPseudoTc, float fPseudoPc, float fTemp, float fPress, float fZ, int iCgMethod )
{
switch( iCgMethod )
{
case CG_HALL_YARBOUGH:
return Cg_Hall_Yarbough( fPseudoTc, fPseudoPc, fTemp, fPress, fZ );
case CG_MATTAR_BRAR_AZIZ:
return Cg_Mattar_Brar_Aziz( fPseudoTc, fPseudoPc, fTemp, fPress, fZ );
case CG_DEFAULT:
//if( fPress > 35 )
// return Cg_Hall_Yarbough( fPseudoTc, fPseudoPc, fTemp, fPress, fZ );
return Cg_Mattar_Brar_Aziz( fPseudoTc, fPseudoPc, fTemp, fPress, fZ );
}
return Cg_Mattar_Brar_Aziz( fPseudoTc, fPseudoPc, fTemp, fPress, fZ );
}
//=============================计算气体体积系数计算============================
//fTemp——温度(开氏度)
//fPress——压力(兆帕)
//fZ——气体偏差因子
//返回值——气体体积系数
float Bg_Calculate( float fTemp, float fPress, float fZ )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -