📄 iprcal.cpp
字号:
fx1 = fx2;
ft1 = ft2;
}
return (float)fSum;
/*
int n=1, k;
double fh, ft1, ft2, fs1, fs2, fep, feps=1, fp, fx, fPx, fMPx;
fh = fb-fa;
fPx = InsertValue_Linear( iMpNum, pfMP_M, pfMP_P, fMpwf );
ft1 = CalNonDarcyFun_TwoPseudoPressure(fa, (float)fPx, fK, iGCPvtNum, pfP, pflg, pfUg,
pfKroDivKrgPvt, iSatNum, pfSg, pfKrg, pfKroDivKrgSat);
fPx = InsertValue_Linear( iMpNum, pfMP_M, pfMP_P, fMpe );
ft1+= CalNonDarcyFun_TwoPseudoPressure(fb, (float)fPx, fK, iGCPvtNum, pfP, pflg, pfUg,
pfKroDivKrgPvt, iSatNum, pfSg, pfKrg, pfKroDivKrgSat);
ft1 = fh*ft1/2;
fs1 = ft1;
fep = feps+1;
while(fep>feps);
{
fp = 0;
for(k=0; k<n; k++)
{
fx = fa+(k+0.5)*fh;
fMPx = CalTMpbyRadius((float)fx, fa, fb, fMpe, fMpwf);
fPx= InsertValue_Linear( iMpNum, pfMP_M, pfMP_P, (float)fMPx );
fp = fp+CalNonDarcyFun_TwoPseudoPressure((float)fx, (float)fPx, fK, iGCPvtNum, pfP, pflg, pfUg,
pfKroDivKrgPvt, iSatNum, pfSg, pfKrg, pfKroDivKrgSat);
}
ft2 = (ft1+fh*fp)/2;
fs2 = (4*ft2-ft1)/3;
fep = fabs(fs2-fs1);
ft1 = ft2;
fs1 = fs2;
n = n+n;
fh = fh/2;
}
return (float)fs2;
*/
}
//根据地层参数计算两相拟压力方法二项式系数B
//fGamag——气体比重
//fh——其层厚度(m)
//fK——气层渗透率(mD)
//fa——井半径(m)
//fb——气层供给半径(m)
//fMpwf——井底处两相拟压力(MPa.kg/m^3/mPa.s)
//fMpe——外边界处两相拟压力(MPa.kg/m^3/mPa.s)
//iMpNum——两相拟压力数据点数
//pfMP_M——两相拟压力中的拟压力
//pfMP_P——两相拟压力中的压力
//iGCPvtNum——PVT数据点数
//pfP——计算PVT数据的压力(MPa)
//pflg——计算的气相质量分数
//pfUg——计算粘度(mPa.s)
//pfKroDivKrgPvt——根据PVT参数计算的Kro除Krg
//iSatNum——相对渗透率曲线数据点数
//pfSg——相对渗透率曲线中饱和度值
//pfKrg——相对渗透率曲线气相相对渗透率值
//pfKroDivKrgSat——根据相对渗透率曲线计算的Kro除Krg
float CalCoeff_B_TwoPseudoPressure(float fGamag, float fh, float fK,
float fa, float fb, float fMpwf, float fMpe,
int iMpNum, float* pfMP_M, float* pfMP_P,
int iGCPvtNum, float* pfP, float* pflg, float* pfUg, float* pfKroDivKrgPvt,
int iSatNum, float* pfSg, float* pfKrg, float* pfKroDivKrgSat)
{
double fCoeff_B = 3.393226*pow(10,-10)*pow(1.205*fGamag,2)/fh/fh;
double fIntegrate = SimpsonIntegrate(fK, fa, fb, fMpwf, fMpe,
iMpNum, pfMP_M, pfMP_P,
iGCPvtNum, pfP, pflg, pfUg, pfKroDivKrgPvt,
iSatNum, pfSg, pfKrg, pfKroDivKrgSat);
return float(fCoeff_B*fIntegrate);
}
//====================二项式拟压力方法计算压力与产量的关系=====================
//fResPressure——地层压力(MPa)
//fA——二项式产能方程系数(MPa^2/mPa.s . d/万方)
//fB——二项式产能方程系数(MPa^2/mPa.s . d^2/万方^2)
//pfPwf——井底流压(MPa)
//pfRate——流量(万方)
//iNum——计算的压力、流量数据点数
//pfPMp_Pressure——压力拟压力序列中的压力值
//pfPMp_Mp——压力拟压力序列中的拟压力值
//pfPMp_Num——压力拟压力序列数据点数
int IPRCurve_AB_TwoPseudoPressure(float fResPressure, float fA, float* pfPwf, float* pfRate, int iNum,
float fGamag, float fh, float fK, float frw, float fRe,
int iMpNum, float* pfMP_M, float* pfMP_P,
int iGCPvtNum, float* pfP, float* pflg, float* pfUg, float* pfKroDivKrgPvt,
int iSatNum, float* pfSg, float* pfKrg, float* pfKroDivKrgSat)
{
//if(fResPressure<0.2) return ERROR_RESPRESSURE;
//if(fA<1e-10) return ERROR_A;
int k;
float fMpwf, fMpe = InsertValue_Linear( iMpNum, pfMP_P, pfMP_M, fResPressure );
float fB;
for(int i=0; i<iNum; i++)
{
k = iNum-i-1;
pfPwf[k] = float(fResPressure/(iNum-1)*i);
fMpwf = InsertValue_Linear( iMpNum, pfMP_P, pfMP_M, pfPwf[k] );
//AfxMessageBox("TwoPseudoPressure_fB");
fB = CalCoeff_B_TwoPseudoPressure( fGamag, fh,fK,frw,fRe,fMpwf, fMpe,
iMpNum, pfMP_M, pfMP_P,
iMpNum, pfMP_P, pflg, pfUg, pfKroDivKrgPvt,
iSatNum, pfSg, pfKrg, pfKroDivKrgSat);
pfRate[k] = float((-fA+sqrt(fA*fA+4*fB*(fMpe-fMpwf)))/(2*fB));
}
for(i=1; i<iNum; i++)
{
if(pfRate[i] < pfRate[i-1])
break;
}
i = iNum-3;
float fValue = pfPwf[i-1]/(iNum-i);
for(k=i; k<iNum; k++)
{
pfPwf[k] = fValue*(iNum-k-1);
pfRate[k] = pfRate[k-1]+(pfRate[k-2]-pfRate[k-1])*(pfPwf[k]-pfPwf[k-1])/(pfPwf[k-2]-pfPwf[k-1]);
}
return ERROR_NON;
}
//=========================凝析油折算成当量的凝析气============================
//fGamao——凝析油比重
//fQo——方/天
//返回值——方/天
float OilEqualGas(float fGamao, float fQo)
{
double fMo = 44.29*fGamao/(1.03-fGamao);
double fQo_g = 24056*fGamao*fQo/fMo;
return (float)fQo_g;
}
//井筒压力计算
//============================静气柱=====平均温度平均Z因子=====================
//单相油管、环空、斜井井底压力计算
//fPseudoTc——拟临界温度(开氏度)
//fPseudoPc——拟临界压力(MPa)
//fTwb——井底温度(开氏度)
//fTwh——井口温度(开氏度)
//fGamag——气体比重
//fh——井筒长度(m)
//fPress——井口压力(MPa)
//iNum——井筒划分的段数
//iZgMethod——Z因子计算方法
//返回值——计算的井底压力
float WBPressure_Average_T_Zg( float fPseudoTc, float fPseudoPc, float fTwb, float fTwh,
float fGamag, float fh, float fPress,
int iNum, int iZgMethod )
{
int i, iIteNum=0, iMax=5000;
float fTgrad;
double fhn, fPwn, fPtn;
double fAverTemp, fAverPres, fBackPres;
double fS;
float fZg;
fhn = fh / iNum;
fTgrad = ( fTwb - fTwh ) / fh;
fPtn = fPress;
for( i=1; i<=iNum; i++ )
{
fPwn = fPtn * ( 1 + fhn / 1219.2 );
fAverTemp = fTwh + ( i-0.5 ) * fhn * fTgrad;
fAverPres = ( fPwn + fPtn ) / 2.0;
iIteNum = 0;
do
{
fBackPres = fAverPres;
fZg = Zg_Calculate( fPseudoTc, fPseudoPc, (float)fAverTemp, (float)fAverPres, iZgMethod );
fS = 0.03415*fGamag*fhn/(fAverTemp*fZg);
fPwn = fPtn*exp(fS);
fAverPres = 2.0*(fPwn + fPtn*fPtn/(fPwn+fPtn))/3.0;
iIteNum++;
}while( fabs(fAverPres-fBackPres) > 1e-3 && iIteNum < iMax );
fPtn = fPwn;
}
return (float)fPwn;
}
//pfWHPress——井口压力(MPa)
//pfWBPress——计算的井底压力(MPa)
//iPNum——计算的数据点数
int WBPressure_Average_T_Zg( float* pfWHPress, float* pfWBPress, int iPNum, float fPseudoTc,
float fPseudoPc, float fTwb, float fTwh, float fGamag,
float fh, int iNum, int iZgMethod )
{
float fWBPress;
for(int i=0; i<iPNum; i++)
{
fWBPress = pfWBPress[i];
pfWBPress[i] = WBPressure_Average_T_Zg( fPseudoTc, fPseudoPc, fTwb, fTwh, fGamag,
fh, pfWHPress[i], iNum, iZgMethod );
if(pfWBPress[i] > fWBPress)
break;
}
return i;
}
//单相油管、环空、斜井井口压力计算
//fPseudoTc——拟临界温度(开氏度)
//fPseudoPc——拟临界压力(MPa)
//fTwb——井底温度(开氏度)
//fTwh——井口温度(开氏度)
//fGamag——气体比重
//fh——井深长度(m)
//fPress——井底压力(MPa)
//iNum——井筒划分的段数
//iZgMethod——Z因子计算方法
//返回值——计算的井口压力
float WHPressure_Average_T_Zg( float fPseudoTc, float fPseudoPc, float fTwb, float fTwh,
float fGamag, float fh, float fPress,
int iNum, int iZgMethod )
{
int i;
float fTgrad;
double fhn, fPwn, fPtn;
double fAverTemp, fAverPres, fBackPres;
double fS;
float fZg;
fhn = fh / iNum;
fTgrad = ( fTwb - fTwh ) / fh;
fPwn = fPress;
for( i=1; i<=iNum; i++ )
{
fPtn = fPwn * fabs( 1 - fhn / 1219.2 );
fAverTemp = fTwb - ( i-0.5 ) * fhn * fTgrad;
fAverPres = ( fPwn + fPtn ) / 2.0;
do
{
fBackPres = fAverPres;
fZg = Zg_Calculate( fPseudoTc, fPseudoPc, (float)fAverTemp, (float)fAverPres, iZgMethod );
fS = 0.03415 * fGamag * fhn / ( fAverTemp * fZg );
fPtn = fPwn * exp( -fS );
fAverPres = 2.0*(fPwn + fPtn*fPtn/(fPwn+fPtn))/3.0;
}while( fabs(fAverPres-fBackPres) > 1e-3 );
fPwn = fPtn;
}
return (float)fPtn;
}
//pfWHPress——井口压力(MPa)
//pfWBPress——计算的井底压力(MPa)
//iPNum——计算的数据点数
int WHPressure_Average_T_Zg( float* pfWHPress, float* pfWBPress, int iPNum, float fPseudoTc,
float fPseudoPc, float fTwb, float fTwh, float fGamag,
float fh, int iNum, int iZgMethod )
{
for(int i=0; i<iPNum; i++)
pfWHPress[i] = WHPressure_Average_T_Zg( fPseudoTc, fPseudoPc, fTwb, fTwh, fGamag,
fh, pfWBPress[i], iNum, iZgMethod );
return 0;
}
//============================动气柱=====平均温度平均Z因子=====================
//单相油管、环空、斜井井底压力计算
//fPseudoTc——拟临界温度(开氏度)
//fPseudoPc——拟临界压力(MPa)
//fTwb——井底温度(开氏度)
//fTwh——井口温度(开氏度)
//fGamag——气体比重
//fh——井筒深度(m)
//fL——井筒长度(m)
//fRoughness——油管粗糙度
//fd1——内管内径(m)
//fd2——外管外径(m)
//fRate——产量(m^3/d)
//fPress——井口压力(MPa)
//fN2——氮气摩尔分数
//fCO2——二氧化碳摩尔分数
//fH2S——硫化氢摩尔分数
//iNum——井筒划分的段数
//iZgMethod——Z因子计算方法
//iUgMethod——粘度计算方法
//返回值——计算的井底压力
float WBPressure_Average_T_Zg( float fPseudoTc, float fPseudoPc, float fTwb, float fTwh,
float fGamag, float fh, float fL, float fRoughness,
float fd1, float fd2, float fRate, float fPress,
float fN2, float fCO2, float fH2S,
int iNum, int iZgMethod, int iUgMethod )
{
int i, iIteNum=0, iMax=5000;
double fd, fTgrad;
double fhn, fhm, fPwn, fPtn;
double fAverTemp, fAverPres, fBackPres;
double fRedU, fRe;
double fQdd5h, fQ;
double fS, fFricCoeff;
float fZg, fUg;
fhn = fh / iNum;
fTgrad = ( fTwb - fTwh ) / fh;
fPtn = fPress;
fd = pow( fd2-fd1, 3 )*pow( fd2+fd1, 2 );
fRedU = 0.01776*fRate*fGamag/(fd1+fd2);
fQdd5h = 1.324*pow(10,-18)*fRate*fRate/fd * fL/fh;
for( i=1; i<=iNum; i++ )
{
fhm = (i-0.5)*fhn;
fPwn = fPtn*(1+fhn/1219.2);
fAverTemp = fTwh + fTgrad*fhm;
fAverPres = 2.0*(fPwn + fPtn*fPtn/(fPwn+fPtn))/3.0;
iIteNum=0;
do
{
fBackPres = fAverPres;
fZg = Zg_Calculate( fPseudoTc, fPseudoPc, (float)fAverTemp, (float)fAverPres, iZgMethod );
fS = 0.03415*fGamag*fhn/(fAverTemp*fZg);
fUg = Ug_Calculate( fPseudoTc, fPseudoPc, (float)fAverTemp, (float)fAverPres,
fZg, fGamag, fN2, fCO2, fH2S, iUgMethod );
fRe = fRedU/fUg;
fFricCoeff = 2.0*log10( fRoughness/(fd2-fd1) + 21.25/pow(fRe,0.9) );
fFricCoeff = 1.0/pow( 1.14-fFricCoeff, 2 );
fQ = fQdd5h*fFricCoeff*pow(fAverTemp*fZg,2)*(exp(2*fS)-1);
fPwn = pow( fPtn*fPtn*exp(2*fS)+fQ, 0.5 );
fAverPres = 2.0*(fPwn + fPtn*fPtn/(fPwn+fPtn))/3.0;
iIteNum++;
}while( fabs(fAverPres-fBackPres) > 1e-3 && iIteNum < iMax );
fPtn = fPwn;
}
return (float)fPwn;
}
//pfWHPress——井口压力(MPa)
//pfWBPress——计算的井底压力(MPa)
//iPNum——计算的数据点数
int WBPressure_Average_T_Zg( float* pfWHPress, float* pfWBPress, float* pfRate, int iPNum,
float fPseudoTc, float fPseudoPc, float fTwb, float fTwh,
float fGamag, float fh, float fL, float fRoughness,
float fd1, float fd2, float fN2, float fCO2,
float fH2S, int iNum, int iZgMethod, int iUgMethod )
{
float fWBPress;
for(int i=0; i<iPNum; i++)
{
fWBPress = pfWBPress[i];
pfWBPress[i] = WBPressure_Average_T_Zg( fPseudoTc, fPseudoPc, fTwb, fTwh,
fGamag, fh, fL, fRoughness,
fd1, fd2, pfRate[i], pfWHPress[i],
fN2, fCO2, fH2S,
iNum, iZgMethod, iUgMethod );
if(pfWBPress[i] > fWBPress)
break;
}
return i;
}
//单相油管、环空
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -