⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yqsxz.cpp

📁 这是本人两年前兼职为某个公司做的石油钻进设计软件
💻 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 + -