📄 dxlyltd.cpp
字号:
// dxlyltd.cpp : implementation file
//
#include "stdafx.h"
#include "Cvenus.h"
#include "dxlyltd.h"
#include "math.h"
#include "yqsxz.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// dxlyltd
extern double ptidu[1000],dtidu[1000];
dxlyltd::dxlyltd()
{
}
dxlyltd::~dxlyltd()
{
}
/////////////////////////////////////////////////////////////////////////////
// dxlyltd message handlers
double dxlyltd::HagedornBrown(double P0,double T0,double TG,double RG,double RW,double RO,double GG,double GW,double OG,double L,double DOL,double DIL,double RR,double H2S,double CO2,double N2,double NaCl,int NP,int CD,int FD)
{
//定义变量
double Pqd,Tqd,Ttd,Qcq,Qcs,Qcy,Gqmd,Gsmd,Gymd,Lygsd,Dhgwj,Dhgnj,RRygczd;
double YN2,YCO2,YH2S,YNaCl,result;
double DLTD,Djszj,Ajsgmj,QLT,RPL,RPW,RPO,PP,PPP,PD,P,T,RSO;
double RSW,PR,PC,TR,TC,Z,VSL,BO,VSG,VM1,VM2,VM,RL,DL,DG,WT;
double UL,UO,UW,STL,STO,STW,NL,CNL,NLV,NGV,A,B,ND,X,Y,X1,Y1,HL;
double dm,DM1,NRE,UG,QW,QO,QL,QG,QT,BW,FL,FF,Pcom,Pb;
int Ngdds,Djsfx,Dldfx,i,J,ddcs;
Pqd=0;Tqd=0;Ttd=0;Qcq=0;Qcs=0;Qcy=0;Gqmd=0;Gsmd=0;Gymd=0;Lygsd=0;Dhgwj=0;Dhgnj=0;RRygczd=0;
YN2=0;YCO2=0;YH2S=0;YNaCl=0;result=0;
DLTD=0;Djszj=0;Ajsgmj=0;QLT=0;RPL=0;RPW=0;RPO=0;PP=0;PPP=0;PD=0;P=0;T=0;RSO=0;
RSW=0;PR=0;PC=0;TR=0;TC=0;Z=0;VSL=0;BO=0;VSG=0;VM1=0;VM2=0;VM=0;RL=0;DL=0;DG=0;WT=0;
UL=0;UO=0;UW=0;STL=0;STO=0;STW=0;NL=0;CNL=0;NLV=0;NGV=0;A=0;B=0;ND=0;X=0;Y=0;X1=0;Y1=0;HL=0;
dm=0;DM1=0;NRE=0;UG=0;QW=0;QO=0;QL=0;QG=0;QT=0;BW=0;FL=0;FF=0;Pcom=0;Pb=0;
Ngdds=0;Djsfx=0;Dldfx=0;i=0;J=0;ddcs=0;
RSW = RSO = 0;
yqsxz csjs;
Pqd=P0;//Pqd为压力起点
ptidu[0]=P0;
Tqd=T0-273.15;//Tqd为温度起点
Ttd=TG;//Ttd为温度梯度
Qcq=RG;//Qcq为产气量
Qcs=RW;//Qcs为产水量
Qcy=RO;//Qcy为产油量
Gqmd=GG;//Gqmd为气密度
Gsmd=GW;//Gsmd为水密度
Gymd=OG;//Gymd为油密度
Lygsd=L;//Lygsd为油管深度
dtidu[0]=L;
Dhgwj=DOL;//Dhgwj为环管外直径
Dhgnj=DIL;//Dhgnj为环管内直径
RRygczd=RR;//RRygczd油管相对粗糙度
YN2=N2;//氮气含量
YCO2=CO2;//二氧化碳含量
YH2S=H2S;//硫化氢含量
YNaCl=NaCl;//NaCl含量
Ngdds=NP;//流动管分段数
Djsfx=CD;//计算方向从上往下为1,从下往上为-1
Dldfx=FD;//流动方向从上往下为-1,从下往上为1
if(Ngdds<=0)
{
result=fmod(Lygsd,50);
if(result==0)
Ngdds=int(Lygsd/50);
else
Ngdds=int(Lygsd/50+1-result);
}
else
{
for(i=1;i<=1000;i++)
{
ptidu[i]=0;
dtidu[i]=0;
}
}
DLTD=Lygsd/Ngdds;
Djszj=Dhgwj-Dhgnj;
Ajsgmj=3.14159/4*(pow(Dhgwj,2)-pow(Dhgnj,2));
if(RRygczd <= 0)
RRygczd=0.0008;
//计算天然气的临界参数
csjs.trqnjcs(Gqmd, YH2S, YCO2,1);
PC=csjs.Pc;
TC=csjs.Tc;
//计算天然气的临界参数结束
if((Qcs+Qcy)<= 0.5)
{
Qcs=0.25;
Qcy=0.25;
}
if(DLTD>0)
{
QLT=Qcy+Qcs;
RPL=Qcq/(QLT+0.000001);
RPW=0;
if(Qcs>0)
RPW=Qcq/Qcs;
RPO=0;
if(Qcy>0)
RPO=Qcq/Qcy;
for(J=1;J<=Ngdds;J++)
{
PP=0;
PPP=PD=0;
for(ddcs=1;ddcs<=30;ddcs++)
{
PD=PP;
P=Pqd+PD*0.5*Djsfx;
T=Tqd+Ttd*DLTD*0.5*Djsfx;
for(i=1;i<=3;i++)
{
if(i==1)
{
P=Pqd;
T=Tqd;
}
if(i==2)
{
P=Pqd+PD;
T=Tqd+Ttd*DLTD*Djsfx;
}
if(i==3)
{
P=Pqd+PD*0.5;
T=Tqd+Ttd*DLTD*Djsfx*0.5;
}
if((RSO+RSW)<=RPL&&Qcq>0)
{
PR=P/PC;
TR=(T+273.15)/TC;
Z=csjs.trqpcxs(PR,TR);//计算天然气偏差系数
UG=csjs.trqnd( PR, TR, YCO2, YH2S, YN2, Gqmd, T);//计算天然气的粘度
}
if(Qcy>0)
{
//计算油的泡点压力和溶解气油比
csjs.ypdylhrjqyb(Gymd, RPO, Gqmd, T, P);
Pb=csjs.Pb;
RSO=csjs.RSO;
//计算油的泡点压力和溶解气油比结束
UO=csjs.ynd( RSO, P, Pb, T, Gymd);//计算油的粘度
BO=csjs.ytjxs(RSO, Gqmd, Gymd, T, P, Pb);//计算油的体积系数
STO=csjs.ybmzl(Gymd, P, T);//计算油的表面张力
}
if(Qcs>0)
{
RSW=csjs.rjqsb(RPW, P, T, YNaCl);//计算溶解气水比
UW=csjs.sdnd(P, T, YNaCl);//计算水的粘度
STW=csjs.sbmzl(P, T);//计算水的表面张力
BW=csjs.sdtjxs(P, T, YNaCl, RSW);//水的体积系数
}
if(Z<=0)
Z=1;
if((Qcq-RSO*Qcy-RSW*Qcs)< 0)
RSO=(Qcq-RSW*Qcs)/Qcy;
VSL=(BO*Qcy+BW*Qcs)/(86400*Ajsgmj);
VSG=0.0000000039897*(Qcq-RSO*Qcy-RSW*Qcs)*(T+273.15)*Z/P/Ajsgmj;
if(i==1)
VM1=pow((VSL+VSG),2);
if(i==2)
VM2=pow((VSL+VSG),2);
if(i==3)
VM=VSL+VSG;
}
if(BO==0)
BO=1;
if(BW==0)
BW=1;
if(Z==0)
Z=1;
RL=Qcy+Qcs;
DL=(1000*(Gymd*Qcy/BO+Gsmd*Qcs/BW)+1.205*Gqmd*(RSO*Qcy/BO+RSW*Qcs/BW))/RL;
DG=3495.7*Gqmd*P/(273+T)/Z;
WT=(0.011574*(Qcy*Gymd+Qcs*Gsmd)+0.000013947*Gqmd*Qcq);
UL=(UO*Qcy+UW*Qcs)/RL;
STL=(STO*Qcy+STW*Qcs)/RL;
NL=log(0.31465*UL*pow((DL*pow(STL,3)),(-0.25)))/log(10);
CNL=pow(10,(-1.96188-0.45617*NL-1.05117*pow(NL,2)-0.44411*pow(NL,3)-0.05711*pow(NL,4)));
if(CNL<0.002)
CNL=0.002;
if(CNL>0.01)
CNL=0.01;
NLV=3.178*VSL*pow((DL/STL),0.25);
NGV=3.178*VSG*pow((DL/STL),0.25);
A=1.071-0.7277*pow(VM,2)/Djszj;
if(A<0.13)
A=0.13;
B=VSG/VM;
if(B>=A)
{
ND=98.346*Djszj*pow((DL/STL),0.25);
X=log(NLV*pow((P/0.101),0.1)*CNL/pow(NGV,0.575)/ND)/log(10);
if(X<-3.77)
Y=2.16691+0.66633*X+0.05204*pow(X,2);
else if(X>-2.7)
Y=-0.0556-1.00559*X-0.23875*pow(X,2);
else
Y=2.54814+0.67285*X+0.02921*pow(X,2);
if(Y>1)
Y=1;
if(Y<0.05)
Y=0.05;
X1=X;
X=NGV*pow(NLV,0.38)/pow(ND,2.14)*100;
if(X<4)
Y1=1.36271-0.65995*X+0.35083*pow(X,2)-0.04263*pow(X,3);
else
Y1=1.09974+0.16173*X-0.00911*X*X;
if(Y1<1)
Y1=1;
if(Y1>1.8)
Y1=1.8;
if(Y1<1)
Y1=1;
if(Y<0)
Y=0.01;
HL=Y*Y1;
dm=DL*HL+DG*(1-HL);
DM1=WT/(VSG+VSL)/Ajsgmj;
if(dm<DM1)
dm=DM1;
NRE=1276.7*WT/Djszj/pow(UL,HL)/pow(UG,(1-HL));
FF=csjs.mczlxs(NRE, RRygczd);//计算摩阻系数
}
else
{
QW=Qcs*BW/86400;
QO=Qcy*BO/86400;
QL=QW+QO;
QG=0.0000000039897*(Qcq-RSO*Qcy-RSW*Qcs)*Z/P*(T+273.15);
QT=QL+QG;
Y=(1+QT/0.8/Ajsgmj-pow((pow((1+QT/0.8/Ajsgmj),2)-4*QG/0.8/Ajsgmj),0.5))/2;
if(QG==0)
Y=0;
dm=(1-Y)*DL+Y*DG;
DM1=WT/(VSG+VSL)/Ajsgmj;
if(dm<DM1)
dm=DM1;
NRE=1000*DL*Djszj*QL/Ajsgmj/(1-Y)/UL;
FF=csjs.mczlxs(NRE, RRygczd);//计算摩阻系数
}
FL=FF*pow(DM1,2)*pow(VM,2)/Djszj/2/dm+dm*(VM1-VM2)/2/DLTD;
PP=(9.8*dm+Dldfx*FL)*DLTD/1000000;
if(fabs(PP-PD)<0.0001)
break;
}
if((PP<0||PP>DLTD/100)&&PPP>0&&ddcs>30 )
PP=PPP;
if((PD<0||PD>DLTD/100)&&PPP>0&&ddcs>30)
PD=PPP;
if(PP<PD)
PD=PP;
PD=(PD+PP)/2;
Pqd=Pqd+PD*Djsfx;
Tqd=Tqd+Ttd*DLTD*Djsfx;
if(Pqd <= 0)
Pqd=0;
ptidu[J] = int(Pqd*1000+0.5)/1000.0;
dtidu[J]=int((dtidu[J-1]+Djsfx*DLTD)*1000+0.5)/1000.0;
if(Pqd==0)
break;
}
}
Pcom=Pqd;
return(Pcom);
}
double dxlyltd::MukherjeeBrill(double P0,double T0,double TG,double RG,double RW,double RO,double GG,double GW,double OG,double L,double DOL,double DIL,double RR,double H2S,double CO2,double N2,double NaCl,int NP,int CD,int FD)
{
//定义变量
double Pqdyl,Tqdwd,Twdtd,Qcql,Qcsl,Qcyl,Gqmd,Gsmd,Gymd,Lygsd,Dhgwj;
double Dhgnj,RRygxdczd,YN2,YCO2,YH2S,YNaCl,Djsgj,QLT,RPL,RPW,RPO,PPP;
double PD,ddcs,P,T,RSO,RSW,PR,PC,TR,TC,Z,QW,BW,QO,QL,QT,VSO,VSW,VSG;
double VSL,VST,WL,WG,WT,VT,UL,UO,UW,STL,STO,STW,DL,DG,WGG,WGL,WGT,lmd;
double UM,UG,NLV,NGV,XXL,NFR,L1,L2,result;
double DLTD,Ajsgmj,PP,BO,QG,C1,C2,C3,C4,C5,C6,HL,angle,NL,dm,NRE,HR;
double FR,F,Pb;
int Ngfds,Djsfx,Dldfx,i,J;
Pqdyl=0;Tqdwd=0;Twdtd=0;Qcql=0;Qcsl=0;Qcyl=0;Gqmd=0;Gsmd=0;Gymd=0;Lygsd=0;Dhgwj=0;
Dhgnj=0;RRygxdczd=0;YN2=0;YCO2=0;YH2S=0;YNaCl=0;Djsgj=0;QLT=0;RPL=0;RPW=0;RPO=0;PPP=0;
PD=0;ddcs=0;P=0;T=0;RSO=0;RSW=0;PR=0;PC=0;TR=0;TC=0;Z=0;QW=0;BW=0;QO=0;QL=0;QT=0;VSO=0;VSW=0;VSG=0;
VSL=0;VST=0;WL=0;WG=0;WT=0;VT=0;UL=0;UO=0;UW=0;STL=0;STO=0;STW=0;DL=0;DG=0;WGG=0;WGL=0;WGT=0;lmd=0;
UM=0;UG=0;NLV=0;NGV=0;XXL=0;NFR=0;L1=0;L2=0;result=0;
DLTD=0;Ajsgmj=0;PP=0;BO=0;QG=0;C1=0;C2=0;C3=0;C4=0;C5=0;C6=0;HL=0;angle=0;NL=0;dm=0;NRE=0;HR=0;
FR=0;F=0;Pb=0;
Ngfds=0;Djsfx=0;Dldfx=0;i=0;J=0;
RSW = RSO = 0;
PD = 0; // ADD BY LZJ
yqsxz csjs;
angle = 3.14159 / 2;
NL=0;
Pqdyl = P0;//Pqdyl为起点压力
ptidu[0]=P0;
Tqdwd = T0 - 273.15;//Tqdwd为起点温度
Twdtd = TG;//Twdtd为温度梯度
Qcql = RG;//Qcql为产气量
Qcsl = RW;//Qcsl为产水量
Qcyl = RO;//Qcyl为产油量
Gqmd = GG;//Gqmd为气密度
Gsmd = GW;//Gsmd为水密度
Gymd = OG;//Gymd为油密度
Lygsd = L;//Lygsd为油管深度
dtidu[0]=L;
Dhgwj = DOL;//Dhgwj为环管外径
Dhgnj = DIL;//Dhgnj环管内径
RRygxdczd = RR;//RRygxdczd油管相对粗糙度
YN2 = N2;//氮气含量
YCO2 = CO2;//二氧化碳含量
YH2S = H2S;//硫化氢含量
YNaCl = NaCl;//氯化钠含量
Ngfds = NP;//流动管分段数
Djsfx = CD;//从上往下为1,从下往上为-1。
Dldfx = FD;//从上往下为-1,从下往上为1。
if(Ngfds<=0)
{
result=fmod(Lygsd,50);
if(result==0)
{
Ngfds =int(Lygsd/50);
}
else
{
Ngfds =int(Lygsd/50 + 1);
}
}
else
{
for(i=1;i<=1000;i++)
{
ptidu[i]=0;
dtidu[i]=0;
}
}
DLTD = Lygsd / Ngfds;
Djsgj = Dhgwj - Dhgnj;
Ajsgmj = 3.14159 / 4 * (pow(Dhgwj,2) - pow(Dhgnj,2));
if(RRygxdczd<=0)
RRygxdczd = 0.0008;
//计算天然气的临界参数
csjs.trqnjcs(Gqmd, YH2S, YCO2,1);
PC=csjs.Pc;
TC=csjs.Tc;
//计算天然气的临界参数结束
if(Qcsl+Qcyl<=0.5)
{
Qcsl=0.25;
Qcyl = 0.25;
}
if(DLTD>0)
{
QLT = Qcyl + Qcsl;
if(QLT>0)
RPL = Qcql / QLT;
RPW = 0;
if(Qcsl>0)
RPW = Qcql / Qcsl;
RPO = 0;
if(Qcyl>0)
RPO = Qcql/Qcyl;
for(J=1;J<=Ngfds;J++)
{
PP = 0;
PPP = PD ;
for(ddcs=1;ddcs<=30;ddcs++)
{
PD = PP;
P = Pqdyl + 0.5 * PD * Djsfx;
T = Tqdwd + 0.5 * Twdtd * DLTD * Djsfx;
if(QLT>0)
{
if((RSO + RSW)<=RPL&&Qcql>0)
{
PR = P / PC;
TR = (T + 273.15) / TC;
Z=csjs.trqpcxs(PR, TR);//计算天然气偏差系数
UG=csjs.trqnd( PR, TR, YCO2, YH2S, YN2, Gqmd, T);//计算天然气的粘度
}
if(Qcyl>0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -