📄 yqsxz.cpp
字号:
// yqsxz.cpp : implementation file
//
#include "stdafx.h"
#include "Cvenus.h"
#include "yqsxz.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// yqsxz
yqsxz::yqsxz()
{
}
yqsxz::~yqsxz()
{
}
/////////////////////////////////////////////////////////////////////////////
// yqsxz message handlers
//气体偏差因子
double yqsxz::trqpcyz(double p,double T,double g)
{
//p---计算点压力,MPa;
//T---计算点温度,K;
//g---气体相对密度;
int zn0;
double A1,A2,A3,a4,a5,a6,a7,a8;
double Za,ze1,pr,tr,Y,ya,u,v,w;
double r,fa,fb,pz,tz,Z;
A1=0.31506237;
A2=-1.0467099;
A3=-0.57832729;
a4=0.53530771;
a5=-0.61232032;
a6=-0.10488813;
a7=0.68157009999;
a8=0.68446549;
Za=1;
ze1=0.00001;
zn0=0;
pz=702.3-50*g;
tz=167+316.67*g-459.67;
tz=(tz-32)/1.8+273.15;
pr=p/pz;
tr=T/tz;
begin:
Y=0.27*pr/(Za*tr);
ya=Y*Y;
u=(A1*tr+A2+A3/(tr*tr))*Y;
v=(a4*tr+a5)*ya;
w=a5*a6*ya*ya*Y;
r=(a7/(tr*tr))*ya*exp(-a8*ya);
fa=-0.27*pr+(tr+u+v+w)*Y+r*(1+a8*ya)*Y;
fb=tr+2*u+3*v+6*w+r*(3+a8*ya*(3-2*a8*ya));
Z=Y-fa/fb;
Z=0.27*pr/(tr*Z);
if(fabs(Za-Z)<=ze1)
{
}
else
{
zn0=zn0+1;
if(zn0>10)
{
ze1=ze1*10;
zn0=0;
}
Za=Z;
goto begin;
}
return Z;
}
//天然气偏差系数
double yqsxz::trqpcxs(double pr,double TR)
{
//Z ___ 天然气偏差系数,无因次
//Pr ___ 对比压力,无因次
//Tr ___ 对比温度,无因次
//计算天然气对比密度
double a,B,C,D,e,F,G,DR,y,DY,Z;
int i;
if(pr==0)
pr=0.00001;
if(TR==0)
TR=0.00001;
a=0.06423;
B=0.5353*TR-0.6123;
C=0.3151*TR-1.0467-0.5783/pow(TR,2);
D=TR;
e=0.6816/pow(TR,2);
F=0.6845;
G=0.27*pr;
DR=0.27*pr/TR; //对比密度初值
for(i=0;i<=50;i++)
{
//y=a*pow(DR,6)+B*pow(DR,3)+C*pow(DR,2)+D*DR+e*pow(DR,3)*(1+F*pow(DR,2))*exp(-F*pow(DR,2))-G;
y=0;
y =y+ a*pow(DR,6);
y =y+ B*pow(DR,3);
y =y+ C*pow(DR,2);
y =y+ D*DR;
y =y+ e*pow(DR,3)*(1+F*pow(DR,2))* exp(-F*pow(DR,2))-G;
DY=6*a*pow(DR,5)+3*B*pow(DR,2)+2*C*DR+D+e*pow(DR,2)*(3+F*pow(DR,2)*(3-2*F*pow(DR,2)))*exp(-F*pow(DR,2));
DR=DR-y/DY;
if(fabs(y/DY)<0.0001)
break;
}
//计算天然气偏差系数
Z=0.27*pr/DR/TR;
return(Z);
}
//天然气的临界参数
void yqsxz::trqnjcs(double Gg,double H2S,double CO2,int GT)
{
//Pc ___ 天然气的临界压力,MPa
//Tc ___ 天然气的临界温度,.K
//Gg ___ 天然气的相对密度,无因次
//H2S ___ 天然气中H2S含量,小数
//CO2 ___ 天然气中CO2含量,小数
//GT ___ 天然气的类型:1--干气,2--凝析气
double C;
if(GT==1) //干气
{
Pc=4.66768+(0.10342-0.25855*Gg)*Gg;
Tc=93.33333+(180.55556-6.94444*Gg)*Gg;
}
else //凝析气
{
Pc=4.86762-(0.35645+0.076531*Gg)*Gg;
Tc=103.88889+(183.33333-39.72222*Gg)*Gg;
}
//天然气中杂质的影响
if(H2S+CO2>0)
C=66.66667*(pow((CO2+H2S),0.9)-pow((CO2+H2S),1.6))+15*(pow(H2S,0.5)-pow(H2S,4));
else
C=0;
Pc=(Pc*(Tc-C)/(Tc+H2S*(1-H2S)*C));
Tc=(Tc-C);
}
//计算天然气的粘度
double yqsxz::trqnd(double pr,double TR,double CO2,double H2S,double N2,double Gg,double T)
{
//UG ___ 天然气的粘度,mPa.s
//Pr ___ 对比压力,无因次
//Tr ___ 对比温度,无因次
//CO2___ 天然气中CO2含量,小数
//H2S___ 天然气中H2S含量,小数
//N2 ___ 天然气中N2含量,小数
//GG ___ 天然气相对密度,无因次
//T ___ 实际温度,℃
double U0,CCO2,CH2S,CN2,C1,C2,C3,C4,UG;
U0=(0.00001709-0.000002062*Gg)*(1.8*T+32)+0.008188-0.00615*log(Gg)/log(10);
CCO2=(0.00908*log(Gg)/log(10)+0.00624)*CO2;
CH2S=(0.00894*log(Gg)/log(10)+0.00373)*H2S;
CN2=(0.00848*log(Gg)/log(10)+0.00959)*N2;
C1=-2.4621182+2.97054714*pr-0.286264054*pow(pr,2)+0.00805420522*pow(pr,3);
C2=2.80860949-3.49803305*pr+0.36037302*pow(pr,2)-0.0104432413*pow(pr,3);
C3=-0.793385684+1.39643306*pr-0.149144925*pow(pr,2)+0.00441015512*pow(pr,3);
C4=0.0839387178-0.186408848*pr+0.0203367881*pow(pr,2)-0.000609579263*pow(pr,3);
UG=exp(C1+C2*TR+C3*pow(TR,2)+C4*pow(TR,3))/TR*(U0+CH2S+CCO2+CN2);
return(UG);
}
//计算溶解气水比
double yqsxz::rjqsb(double RPW,double P,double T,double NaCl)
{
//Rsw ___ 溶解气水比,m^3/标m^3
//'Rpw ___ 生产气水比,m^3/标m^3
//'P ___ 实际压力,MPa
//'T ___ 实际温度,℃
//'NaCl ___ 水中NaCl的含量,ppm
double RSW,a,B,C,CNaCl;
a=(2.12+0.00345*(1.8*T+32)-0.0000359*pow((1.8*T+32),2))/5.615;
B=(0.0107-0.0000526*(1.8*T+32)+0.000000148*pow((1.8*T+32),2))*145.04/5.615;
C=(-0.000000875+0.0000000039*(1.8*T+32)-0.0000000000102*pow((1.8*T+32),2))*pow(145.04,2)/5.615;
CNaCl=1-(0.0000069764-0.00000003114*T)*NaCl;
RSW=(a+B*P+C*pow(P,2))*CNaCl;
if(RSW>RPW)
RSW=RPW;
return(RSW);
}
//计算水的粘度
double yqsxz::sdnd(double P,double T,double NaCl)
{
//Uw ___ 水的粘度,mPa.s
//P ___ 实际压力,MPa
//T ___ 实际温度,℃
//NaCl ___ 水中NaCl的含量,ppm
double CNaCl,UW;
CNaCl=1-0.0000187*pow(NaCl,0.5)+2.18E-14*pow(NaCl,2.5)+(pow((1.8*T+32),0.5)-0.0135*(1.8*T+32))*(0.000000276*NaCl-0.000000000344*pow(NaCl,1.5));
UW=(1+0.00000007363*pow(P,2)*((1.8*T+32)-40))*(0.02414*pow(10,(247.8/(T+133))))*CNaCl;
return(UW);
}
//计算水的表面张力
double yqsxz::sbmzl(double P,double T)
{
//STW ___ 水的表面张力,mN/m
//P ___ 实际压力,MPa
//T ___ 实际温度,℃
double STW;
STW=52.5-0.87*P+(1.204-0.00874*T)*(76*exp(-0.03625*P)-52.5+0.87*P);
return(STW);
}
//水的体积系数
double yqsxz::sdtjxs(double P,double T,double NaCl,double RSW)
{
//Bw ___ 水的体积系数,无因次
//T ___ 实际温度,℃
//P ___ 实际压力,MPa
//NaCl ___ 水中NaCl的含量,ppm
//Rsw ___ 溶解气水比,m^3/标m^3
double BW,TF,Y1,Y2,Y3,CNaCl;
TF=1.8*T+32;
if(RSW<=0)
{
Y1=0.9947+0.0000058*(1.8*T+32)+0.00000102*pow((1.8*T+32),2);
Y2=(-0.000004228+0.000000018376*(1.8*T+32)-0.0000000000677*pow((1.8*T+32),2))*145.04;
Y3=(0.00000000013-1.3855E-12*(1.8*T+32)+4.285E-15*pow((1.8*T+32),2))*pow(145.04,2);
}
else
{
Y1=0.9911+0.0000635*(1.8*T+32)+0.00000085*pow((1.8*T+32),2);
Y2=(-0.000001093-0.000000003497*(1.8*T+32)+0.00000000000457*pow((1.8*T+32),2))*145.04;
Y3=(-0.00000000005+6.429E-13*(1.8*T+32)-1.43E-15*pow((1.8*T+32),2))*pow(145.04,2);
}
CNaCl=1+(7.397041E-10*P+(5.470001E-10-2.82828E-12*P)*(1.8*T-32)+(-3.230001E-12+1.23284E-15*P)*pow((1.8*T-28),2))*NaCl;
BW=CNaCl*(Y1+Y2*P+Y3*pow(P,2));
if(BW>1.2)
BW=1.2;
return(BW);
}
//计算摩擦阻力系数
double yqsxz::mczlxs(double RE,double RR)
{
//ff ___ 摩擦阻力系数,无因次
//Re ___ 雷诺数,无因次
//RR ___ 相对粗糙度,无因次
int i;
double ff,FF0;
if(RE<=2000)
ff=64/RE;
else
{
ff=0.005;
for(i=1;i<=100;i++)
{
FF0=ff;
ff=pow((2*(log(1/RR/(1+9.34*RR/RE/pow(ff,0.5))))/log(10)+1.14),(-2));
if(fabs(FF0-ff)<0.0001)
break;
}
}
if(ff>0.1)
ff=0.1;
if(ff<0.01)
ff=0.01;
return(ff);
}
//油的粘度
double yqsxz::ynd(double RSO,double P,double Pb,double T,double OG)
{
//Uo ___ 油的粘度,mPa.s
//Rso ___ 溶解气油比,m^3/标m^3
//P ___ 实际压力,MPa
//Pb ___ 泡点压力,MPa
//T ___ 实际温度,℃
//OG ___ 油的相对密度,无因次
double UO,A,R,B;
R=RSO*5.615;
UO=pow(10,(pow(10,(3.0324-0.02023*OG))*pow((1.8*T+32),(-1.163))))-1;
A=10.715*pow((R+100),(-0.515));
B=5.44*pow((R*5.615+150),(-0.338));
UO=A*pow(UO,B);
if(P>Pb)
UO=UO*pow((P/Pb),(956.44*pow(P,1.187)*exp(-0.0130246*P-11.513)));
return(UO);
}
//计算油的体积系数
double yqsxz::ytjxs(double RSO,double Gg,double OG,double T,double P,double Pb)
{
//Bo ___ 油的体积系数,无因次
//Rso ___ 溶解气油比,m^3/标m^3
//GG ___ 气体相对密度
//OG ___ 油的相对密度
//T ___ 实际温度,℃
//P ___ 实际压力,MPa
//Pb ___ 泡点压力,MPa
double a,B,C,BO,x = 0,BOFrick,BOStanding;
//油中饱和天然气时的体积系数
//Standing 方法
if(P<=0)
P=0.1;
if(Pb<=0)
Pb=P;
if(OG==0)
{
a=0.00001751;
B=0.0004677;
C=-0.00000001811;
}
else
{
if((141.5/OG-131.5)<=30)
{
a=0.00001751;
B=0.0004677;
C=-0.00000001811;
}
else
{
a=0.000011;
B=0.000467;
C=0.000000001377;
}
}
if(OG!=0)
{
BOStanding=1+a*((1.8*T+32)-60)*(141.5/OG-131.5)/Gg+(B+C*((1.8*T+32)-60)*(141.5/OG-131.5)/Gg)*RSO*5.615;
//Frick 方法
BOFrick=0.972+0.000147*pow((RSO*5.615*pow((Gg/OG),0.5)+1.25*(1.8*T+32)),1.175);
}
else
{
BOStanding=0;
BOFrick=0;
}
//平均值
BO=(BOFrick+BOStanding)/2;
//油中未饱和天然气时的体积系数
if(P>=Pb)
{
if(OG!=0)
x=-1433+5*RSO*5.615+17.2*(1.8*T+32)-1180*Gg+12.61*(141.5/OG-131.5);
BO=BO*exp((Pb-P)*x*0.00001/P);
}
return(BO);
}
//计算油的泡点压力和溶解气油比
void yqsxz::ypdylhrjqyb(double GG,double RPO,double OG,double T,double P)
{
//Pb ___ 泡点压力,MPa
//Rso ___ 溶解气油比,m^3/标m^3
//Rpo ___ 生产气油比,m^3/标m^3
//GG ___ 气体相对密度
//OG ___ 油的相对密度
//T ___ 实际温度,℃
//P ___ 实际压力,MPa
double Y0,y,rso1,Y,TGH;
if(P<=0)
P=0.1;
if(Pb<=0)
Pb=0.1;//此处没有意义
//计算泡点压力
if(OG>0.825)
Y0=1950-1415/OG;
else if(OG<0.758)
Y0=42.28/(1.03/OG-1);
else
Y0=1773.5-1309.5/OG;
y=RPO/67.55/(RPO/67.55+350*OG/Y0);
if(y>=0.6 && GG!=0)
{
Pb=(0.05695*pow(y,3.52)+0.01344)/GG*(T*1.8+492);
}
else if(y<0.6 && GG!=0)
{
Pb=(0.0046815*pow(10,(1.21*y))-0.0041713)/GG*(1.8*T+492);
}
if(Pb<=0.1)
Pb=0.1;
//计算溶解气油比 ___ 方法1
TGH=P*GG/(T+273.15);
if(TGH>=0.0397)
{
Y=pow(((P*GG/(T+273.15)-0.02419)/0.10251),0.2841);
}
else
{
Y=0.4343*log((P*GG/(T+273.15)+0.0075083)/0.0084267);
}
if(Y<=0)
rso1=2.2*GG*pow(P,1.2048)*pow(10,(2.1308/OG-0.0019735*T-2.0155));
else if(Y>=1)
rso1=RPO;
else
rso1=67.55*350*OG/Y0*Y/(1-Y);
RSO=rso1;
if(RSO>RPO)
RSO=RPO;
}
//计算油的表面张力//有错误
double yqsxz::ybmzl(double OG,double P,double T)
{
// STO ___ 油的表面张力,mN/m
// OG ___ 油的相对密度,无因次
// P ___ 实际压力,MPa
// T ___ 实际温度,℃
double STO;
if(OG!=0)
{
STO=(75.8-0.0846*T-37.78/OG)*exp(-0.1015*P);
}
else
{
STO=0;
}
return(STO);
}
//计算天然气等温压缩系数
double yqsxz::trqdwysxs(double Z,double pr,double TR,double Pc)
{
//Cg ___ 天然气等温压缩系数,1/MPa
//Z ___ 天然气偏差系数,无因次
//Pr ___ 对比压力,无因次
//Tr ___ 对比温度,无因次
//Pc ___ 天然气临界压力,MPa
int i;
double a,B,C,D,e,F,G,DR,y,DY,DZDR,Cg;
a=0.06423;
B=0.5353*TR-0.6123;
C=0.3151*TR-1.0467-0.5783/pow(TR,2);
D=TR;
e=0.6816/pow(TR,2);
F=0.6845;
G=0.27*pr;
DR=0.27*pr/TR;
for(i=0;i<=100;i++)
{
y=a*pow(DR,6)+B*pow(DR,3)+C*pow(DR,2)+D*DR+e*pow(DR,3)*(1+F*pow(DR,2))*exp(-F*pow(DR,2))-G;
DY=6*a*pow(DR,5)+3*B*pow(DR,2)+2*C*DR+D+e*pow(DR,2)*(3+F*pow(DR,2)*(3-2*F*pow(DR,2)))*exp(-F*pow(DR,2));
DR=DR-y/DY;
if(fabs(y/DY)<0.0001)
break;
}
Z=0.27*pr/DR/TR;
DZDR=5*a*pow(DR,5)+2*B*pow(DR,2)+C*DR;
DZDR=DZDR+2*e*pow(DR,2)*(1+F*pow(DR,2)-pow(F,2)*pow(DR,4))*exp(-F*pow(DR,2));
Cg=1/pr/(1+DZDR/Z/TR)/Pc;
return(Cg);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -