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

📄 iprcal.cpp

📁 这是本人两年前兼职为某个公司做的石油钻进设计软件
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    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 + -