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

📄 iprcal.cpp

📁 这是本人两年前兼职为某个公司做的石油钻进设计软件
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#include "stdafx.h" 
#include	"CVenus.h"
#include "math.h"
#include "fstream.h"
#include <strstrea.h>
#include <iostream.h>
 
#include "IPRCal.h"
#include "Flash.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define  PI   3.1415926

extern	int	g_iProgress ;	// 计算进度
extern	bool	bFinishThread;
extern	char  cGraphColor[][16];
extern	int   iGraphColorNum;


//===========================地层水计算物性参数================================
//========================计算天然气在水中的溶解度=============================
//fPress——压力(兆帕)
//fTemp——温度(开氏度)
//fS——矿化度(氯化钠的质量百分数)
//返回值——天然气在水中的溶解度(方/方)
float Rsw_Mineralized( float fPress, float fTemp, float fS )
{
   double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
   double fA    = 2.12 + 0.00345*fSeta - 3.59*pow(10,-5)*fSeta*fSeta;
   double fB    = 0.0107 - 5.26*pow(10,-5)*fSeta + 1.48*pow(10,-7)*fSeta*fSeta;
   double fC    = -8.75*pow(10,-7) + 3.9*pow(10,-9)*fSeta - 1.02*pow(10,-11)*fSeta*fSeta;
   double fSC   = 1 - fS*(0.0753-0.000173*fSeta);
   double fRswPure = ( fA + fB*(145.03*fPress) + fC*pow(145.03*fPress,2) ) / 5.615;

   return float(fRswPure * fSC);
}
//=============================计算水的体积系数================================
//fPress——压力(兆帕)
//fTemp——温度(开氏度)
//fS——矿化度(氯化钠的质量百分数)
//返回值——水的体积系数
float Bw_Mineralized( float fPress, float fTemp, float fS )
{
   double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
   //脱气水
   double fa11  = 0.9947,            fa12 = 5.8*pow(10,-6),      fa13 = 1.02*pow(10,-6);
   double fa21  = -4.228*pow(10,-6), fa22 = 1.8376*pow(10,-8),   fa23 = -6.77*pow(10,-11);
   double fa31  = 1.3*pow(10,-10),   fa32 = -1.3855*pow(10,-12), fa33 = 4.285*pow(10,-15);
   //天然气饱和水
   fa11  = 0.9911,            fa12 = 6.35*pow(10,-5),   fa13 = 8.5*pow(10,-7);
   fa21  = -1.093*pow(10,-6), fa22 = -3.497*pow(10,-9), fa23 = 4.57*pow(10,-12);
   fa31  = -5.0*pow(10,-11),  fa32 = 6.429*pow(10,-13), fa33 = -1.43*pow(10,-15);

   double fA1   = fa11 + fa12*fSeta + fa13*fSeta*fSeta;
   double fA2   = fa21 + fa22*fSeta + fa23*fSeta*fSeta;
   double fA3   = fa31 + fa32*fSeta + fa33*fSeta*fSeta;
   double fBwPure = fA1 + fA2*145.03*fPress + fA3*pow(145.03*fPress,2);
   double fb1 = 5.1*pow(10,-8),   fb2 = 5.47*pow(10,-6), fb3 = -1.95*pow(10,-10);
   double fb4 = -3.23*pow(10,-8), fb5 = 8.5*pow(10,-13);
   double fSC = 1.0 + fS * ( fb1*145.03*fPress +(fb2+fb3*145.03*fPress)*(fSeta-60) + (fb4+fb5*145.03*fPress)*pow(fSeta-60,2) );

   return float(fBwPure*fSC);
}
//===============================计算水的等温压缩系============================
//fPress——压力(兆帕)
//fTemp——温度(开氏度)
//fS——矿化度(氯化钠的质量百分数)
//fRsw——天然气在水中的溶解度(方/方)
//返回值——水的等温压缩系数
float Cw_Saturated( float fPress, float fTemp, float fS, float fRsw )
{
   double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
   double fA    = 3.8546 - 0.019434*fPress;
   double fB    = -0.01052 + 6.9179*pow(10,-5)*fPress;
   double fC    = 3.9267*pow(10,-5) - 1.2763*pow(10,-7)*fPress;
   //脱气水等温压缩系数
   double fCwf  = 145.03*pow(10,-6) * (fA+fB*fSeta+fC*fSeta*fSeta);
   //饱和水等温压缩系数
   double fCwg = fCwf * (1+0.05*fRsw);
   //矿化度的影响
   double fSC   = 1 + pow(fS,0.7) * ( -0.052 + 2.7*pow(10,-4)*fSeta - 1.14*pow(10,-6)*fSeta*fSeta + 1.121*pow(10,-9)*fSeta*fSeta*fSeta );

   return float(fCwg*fSC);
}
//=================================计算地层水的粘度============================
//fTemp——温度(开氏度)
//返回值——地层水的粘度(mPa.s)
float Uw_Mineralized( float fTemp )
{
   double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
   return (float)exp(1.003-0.01479*fSeta+1.982*pow(10,-5)*fSeta*fSeta);
}



//===========================地层原油计算物性参数==============================
//========================计算天然气在原油中的溶解度===========================
//fPress——压力(兆帕)
//fTemp——温度(开氏度)
//frg——天然气的比重
//fro——原油的比重
//返回值——天然气在原油中的溶解度(方/方)
float Rso_Standing( float fPress, float fTemp, float frg, float fro )
{
	double fSeta, fD, fA;

	fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
	fD    = 141.5 / fro -131.5;
	fA    = 0.0125 * fD - 0.00091 * fSeta;
	return float(frg * pow( ( 7.9688*fPress + 1.4 ) * pow( 10, fA ),1.2048 ) / 5.615);
}
//frgs——分离器气体的比重
float Rso_Vasquez_Beggs( float fPress, float fTemp, float frg, float fro, float frgs )
{
	double fSeta, fD;
	double fC1,   fC2, fC3;

	fSeta = 1.8 * ( fTemp - 273 ) + 32;
	fD    = 141.5 / fro -131.5;
	if( fro >= 0.8762 )
	{
		 fC1 = 0.0362;
		 fC2 = 1.0937;
		 fC3 = 25.7240;
	}
	else
	{
		 fC1 = 0.0178;
		 fC2 = 1.1870;
		 fC3 = 23.9310;
	}
	return float(frgs * fC1 * pow( 145.03 * fPress, fC2 ) * exp( fC3 * fD / ( 1.8 * fTemp ) ) / 5.615);
}
float Rso_Glaso( float fPress, float fTemp, float frg, float fro )
{
	double fSeta, fD,  fPxing;

	fSeta   = 1.8 * ( fTemp - 273 ) + 32;
	fD      = 141.5 / fro -131.5;
	fPxing  = pow( 10, 2.8869-sqrt(14.1811-3.3093*log10(145.03*fPress)));
	return float(frg * pow( pow(fD, 0.989)*fPxing/pow(fSeta, 0.172), 1.2255 ) / 5.615);
}
float Rso_Calculate( float fPress, float fTemp, float frg, float fro, float frgs, int iMethod )
{
	float fValue=0;
	switch(iMethod)
	{
	    case RSO_STANDING:
			fValue=Rso_Standing(fPress, fTemp, frg, fro);
			break;
		case RSO_VASQUEZ_BEGGS:
			fValue=Rso_Vasquez_Beggs(fPress, fTemp, frg, fro, frgs);
			break;
		case RSO_GLASO:
			fValue=Rso_Glaso(fPress, fTemp, frg, fro);
			break;
	}
	return fValue;
}


//===============================计算饱和原油体积系数==========================
//frg——天然气的比重
//fro——原油的比重
//fRs——天然气在原油中的溶解度(方/方)
//fDo——油罐原油的密度(kg/m^3)
//返回值——饱和原油体积系数
float BoSat_Definite( float frg, float fro, float fRs, float fDo )
{
   return float( (1000*fro+1.205*fRs*frg)/fDo );
}
//fTemp——温度(开氏度)
float BoSat_Standing( float fTemp, float frg, float fro, float fRs )
{
   double fSeta = 1.8*(fTemp-273.15)+32;
   return float( 0.9759+0.00012*pow(5.615*fRs*sqrt(frg/fro)+1.25*fSeta, 1.2) );
}
//frgs——分离器气体的比重
float BoSat_Vasquez_Beggs( float fTemp, float frgs, float fro, float fRs )
{
   double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
   double fD    = 141.5 / fro -131.5;
   double fc1, fc2, fc3;

   if( fro > 0.8762 )
   {
       fc1 = 2.626*pow(10,-3);
       fc2 = 1.751*pow(10,-5);
       fc3 = -1.071*pow(10,-7);
   }
   else
   {
       fc1 = 2.622*pow(10,-3);
       fc2 = 1.100*pow(10,-5);
       fc3 = 7.507*pow(10,-9);
   }
   return float( 1.0 + fc1*fRs + (fSeta-60)*(fD/frgs)*(fc2+fc3*fRs) );
}
float BoSat_Glaso( float fTemp, float frg, float fro, float fRs )
{
   double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
   double fBobb = 5.615*fRs*pow(frg/fro,0.526) + 0.968*fSeta;
   double fA    = -6.58511 + 2.91329*log10(fBobb) - 0.27683*log10(fBobb)*log10(fBobb);

   return float( 1.0 + pow(10, fA) );
}
float BoSat_Marhoun( float fTemp, float frg, float fro, float fRs )
{
   double fa = 0.742390, fb = 0.323294, fc = -1.202040;
   double fF = pow(5.615*fRs, fa) * pow(frg, fb) * pow(fro, fc);

   return float( 0.497069 + 1.5533334*pow(10,-3)*fTemp + 1.82594*pow(10,-3)*fF + 3.18099*pow(10,-6)*fF*fF );
}
//fPress——压力(兆帕)
float BoSat_Ahmed( float fPress, float fTemp, float frg, float fro, float fRs )
{
   double fa1   = -4.5243973*pow(10,-4);
   double fa2   = +3.9063637*pow(10,-6);
   double fa3   = -5.5542509;
   double fa4   = -5.7603220*pow(10,-6);
   double fa5   = -3.9528992*pow(10,-9);
   double fa6   = 16.2894730;
   double fa7   = 3.87188870*pow(10,-4);
   double fa8   = 7.07036850*pow(10,-8);
   double fa9   = -1.4358395;
   double fa10  = -0.12869353;
   double fa11  = 0.023484894;
   double fa12  = 0.015966573;
   double fa13  = 0.021946351;
   double fD    = 141.5 / fro -131.5;
   double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
   double fF    = fa10 + pow(5.615*fRs,fa11)*pow(fD,fa12)/pow(frg,fa13);

   return float( fF + fa1*fSeta + fa2*fSeta*fSeta + fa3/fSeta
                    + fa4*145.03*fPress + fa5*pow(145.03*fPress,2) + fa6/(145.03*fPress)
                    + fa7*5.615*fRs + fa8*pow(5.615*fRs,2) +fa9/(5.615*fRs) );
}
float BoSat_Calculate( float fPress, float fTemp,   float frg,  float fro,
                       float fRs,    float fDoTank, float frgs, int iBosatMethod )
{
   switch( iBosatMethod )
   {
       case BOSAT_DEFINITE:
            return BoSat_Definite( frg, fro, fRs, fDoTank );
       case BOSAT_STANDING:
            return BoSat_Standing( fTemp, frg, fro, fRs );
       case BOSAT_VASQUEZ_BEGGS:
            return BoSat_Vasquez_Beggs( fTemp, frgs, fro, fRs );
       case BOSAT_GLASO:
            return BoSat_Glaso( fTemp, frg, fro, fRs );
       case BOSAT_MARHOUN:
            return BoSat_Marhoun( fTemp, frg, fro, fRs );
       case BOSAT_AHMED:
            return BoSat_Ahmed( fPress, fTemp, frg, fro, fRs );
   }
   return BoSat_Definite( frg, fro, fRs, fDoTank );
}


//===============================计算未饱和原油体积系数========================
//fPress——压力(兆帕)
//fPb——原油饱和压力(兆帕)
//fCounsat——未饱和原油的等温压缩系数(1/MPa)
//fBosat——在Pb时原油的体积系数(方/方)
//返回值——未饱和原油体积系数(方/方)
float BoUnsat_Definite( float fPress, float fPb, float fCounsat, float fBosat )
{
   return float( fBosat*exp(-fCounsat*(fPress-fPb)) );
}
//fTemp——温度(开氏度)
//frgs——分离器气体的比重
//frg——天然气的比重
//fro——原油的比重
//fRs——天然气在原油中的溶解度(方/方)
float BoUnsat_Vasquez_Beggs( float fPress, float fPb, float fTemp, float frgs, float fro, float fRs, float fBosat )
{
   double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
   double fD    = 141.5 / fro -131.5;
   double fA    = pow(10,-5) * ( -1433 + 28.075*fRs +17.2*fSeta - 1180*frgs + 12.61*fD );

   return float( fBosat*exp(-fA*log(fPress/fPb)) );
}
float BoUnsat_Ahmed( float fPress, float fPb, float fRs, float fBosat )
{
   double fa = -0.026791878;
   double fB = -1.0/(665.5392437+2.117285066*fRs);

   return float( fBosat*exp(fB*(exp(fa*fPress)-exp(fa*fPb))) );
}
float BoUnsat_Calculate( float fPress, float fPb, float fTemp, float frg, float fro, float fRs, float fBosat, float fCoUnsat, int iBoUnsatMethod )
{
   switch( iBoUnsatMethod )
   {
       case BOUNSAT_DEFINITE:
            return BoUnsat_Definite( fPress, fPb, fCoUnsat, fBosat );
       case BOUNSAT_VASQUEZ_BEGGS:
            return BoUnsat_Vasquez_Beggs( fPress, fPb, fTemp, frg, fro, fRs, fBosat );
       case BOUNSAT_AHMED:
            return BoUnsat_Ahmed( fPress, fPb, fRs, fBosat );
   }
   return BoUnsat_Definite( fPress, fPb, fCoUnsat, fBosat );
}



//===============================计算饱和原油总体积系数========================
//fBo——在P、T条件下原油体积系数(方/方)
//fBg——在P、T条件下气体体积系数(方/方)
//fRsb——在Pb时天然气在原油中的溶解度(方/方)
//fRs——在P时天然气在原油中的溶解度(方/方)
//返回值——原油总体积系数(方/方)
float Bot_Definite( float fBo, float fBg, float fRsb, float fRs )
{
   return float( fBo+fBg*(fRsb-fRs) );
}
//fPress——压力(MPa)
//fTemp——温度(开氏度)
//frg——天然气的比重
//fro——原油的比重
float Bot_Glaso( float fPress, float fTemp, float frg, float fro, float fRs )
{
   double fSeta = 1.8 * ( fTemp - 273.15 ) + 32;
   double fc    = 2.9*pow(10,-0.00151605*fRs);
   double fBtx  = 5.615*fRs*sqrt(fSeta)/pow(frg,0.3)*pow(fro,fc)*pow(145.03*fPress,-1.1089);
   double fLogBt= 0.080135 + 0.47257*log10(fBtx) + 0.17351*pow(log10(fBtx),2);

   return float( pow(10,fLogBt) );
}
float Bot_Marhoun( float fPress, float fTemp, float frg, float fro, float fRs )
{
   double fa = 0.644516, fb = -1.07934, fc = 0.724874, fd = 2.00621, fe = -0.76191;
   double fF = pow(5.615*fRs,fa)*pow(frg,fb)*pow(fro,fc)*pow(1.8*fTemp,fd)*pow(145.03*fPress,fe);

   return float( 0.314693 + 0.106253*pow(10,-4)*fF + 0.18883*pow(10,-10)*fF*fF );
}
float Bot_Calculate( float fPress, float fTemp, float frg, float fro, float fRs, int iBotMethod )
{
   switch( iBotMethod )
   {
       case BOT_DEFINITE:
            //return Bot_Definite( fBo, fBg, fRsb, fRs );
       case BOT_GLASO:
            return Bot_Glaso( fPress, fTemp, frg, fro, fRs );
       case BOT_MARHOUN:
            return Bot_Marhoun( fPress, fTemp, frg, fro, fRs );
   }
   return Bot_Marhoun( fPress, fTemp, frg, fro, fRs );
}





//=================================计算脱气原油的粘度==========================
//在地层温度和1个兆帕下原油的粘度
//fTemp——温度(开氏度)
//fro——原油的比重
//返回值——脱气原油的粘度(mPa.s)
float UoDegas_Standing( float fTemp, float fro )
{
	double fD = 141.5 / fro -131.5;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -