📄 baimabeiopti.cpp
字号:
}
/*
if(WellNum<2)
{
CurrentWell=CurrentHead->Well;
while(CurrentWell->Next!=0)
{
CurrentWell=CurrentWell->Next;
}
CurrentWell->Next=BaseWell;
BaseWell->Next=TempHead->Well;
TempHead->Well=0;
delete TempHead;
}
else
{
CurrentHead->Next=TempHead;
CurrentHead=TempHead;
}
*/
CurrentHead->Next=TempHead;
CurrentHead=TempHead;
}
if(Terminated)
{
return;
}
/*
//调整油井分组,将油井数小于3 的分组取消
CurrentHead=Head->Next;
TempHead=Head;
while(CurrentHead!=0)
{
WellNum=0;
Well=CurrentHead->Well;
while(Well!=0)
{
WellNum++;
Well=Well->Next;
}
if(WellNum<3)
{
if(TempHead==Head)
{
CurrentTemp=CurrentHead;
CurrentHead=CurrentHead->Next;
Well=CurrentTemp->Well;
while(Well->Next!=0)
{
Well=Well->Next;
}
Well->Next=CurrentHead->Well;
CurrentHead->Well=CurrentTemp->Well;
TempHead->Next=CurrentHead;
delete CurrentTemp;
}
else
{
CurrentTemp=CurrentHead;
CurrentHead=CurrentHead->Next;
Well=TempHead->Well;
while(Well->Next!=0)
{
Well=Well->Next;
}
Well->Next=CurrentTemp->Well;
TempHead->Next=CurrentHead;
delete CurrentTemp;
}
}
TempHead=CurrentHead;
if(CurrentHead!=0)
{
CurrentHead=CurrentHead->Next;
}
else
{
break;
}
}
*/
if(Terminated)
{
return;
}
//判断是否增设增压点
double G,Q0,ql,Ql,Qg,B,Tr,Pr,Trr,Prr,Z,Rs,TiJiHanQi,L,GaoCha,Fe,Gl,dH,T0,_T,Pz;
double HunHeMiDu,YeMiDu,ShuiMiDu,YouMiDu,QiMiDu,HL,Re,d,HunHeLiuSu,A,_P;
double HunHeNianDu,YeNianDu,QiNianDu,YouNianDu,QiZheSuanLiuSu,TiJiHanShui;
// double MoZuXiShu,S0,C,ZuiDaLiuDongJuLi,ShuiPingYaJiang,GaoChengYaJiang,JingKouYaLi;
double Zhan_x,Zhan_y,ZuiDaJuLi,ZhiLiangHanQi,Cpl,Cpg,Cp,ShuiLiPoJiang,a,b,Tz;
bool ZengYaDian;
int MaxNum,MaxPos,Num,i,j,k;
CurrentHead=Head->Next;
WellUnit **WellArray;
double *FArray,*FR;
double ShuiPing;
bool *Flag;
int m;
while(CurrentHead!=0&&!Terminated)
{
Well=CurrentHead->Well;
WellNum=0;
Zhan_x=0;
Zhan_y=0;
//计算井群中油井数目
while(Well!=0)
{
Zhan_x+=Well->X;
Zhan_y+=Well->Y;
WellNum++;
Well=Well->Next;
}
if(WellNum==0)
{
CurrentHead=CurrentHead->Next;
continue;
}
Zhan_x=Zhan_x/WellNum;
Zhan_y=Zhan_y/WellNum;
Well=CurrentHead->Well;
ZengYaDian=false;
while(Well!=0)
{
//计算流量
G=Well->LiuLiang*1000/(3600*24);
Well->YouLiuLiang=G;
/* switch (Well->Part)
{
case BaiMaBei:
B=B_BaiMaBei;
Rs=Rs_BaiMaBei;
break;
case BaiMaNan:
B=B_BaiMaNan;
Rs=Rs_BaiMaNan;
break;
default :
B=B_DongZhi;
Rs=Rs_DongZhi;
} */
QiMiDu=WuXing.GetQiMiDu(JingKouWenDu,YouSheJiYaLi);
if(QiMiDu==0)
{
Application->MessageBox("天然气密度计算错误!计算中止!", "错误", MB_OK);
Terminate();
return;
}
YouMiDu=WuXing.GetYouMiDu(JingKouWenDu);
// YouMiDu=WuXing.GetYouMiDu(JingKouWenDu,Well->Part);
Well->QiYouBi=Well->QiYouBi*1000/YouMiDu;
Q0=G/YouMiDu;
ql=Q0/(1-Well->HanShuiLv);
Rs=WuXing.GetRs(YouMiDu,YouSheJiYaLi,JingKouWenDu);
B=WuXing.GetB(Rs,YouMiDu,JingKouWenDu);
Ql=ql*B;
Trr=(JingKouWenDu+273.15)/264.87;
Prr=YouSheJiYaLi/(43.960*1e5);
Z=WuXing.GetZ(Prr,Trr);
if(Z==0)
{
Application->MessageBox("天然气压缩系数计算错误!计算中止!", "错误", MB_OK);
Terminate();
return;
}
// Qg=ql*(Well->QiYouBi*G/Q0-Rs)*0.101*JingKouWenDu*Z/(YouSheJiYaLi*20);
Qg=ql*(Well->QiYouBi-Rs)*101325*(JingKouWenDu+273.15)*Z/(YouSheJiYaLi*273.15);
//确定管径
GuanJing=sqrt(4*(Ql+Qg)/(M_PI*JingJiLiuSu));
BiHou=(YouSheJiYaLi*1e-6*GuanJing*1000)/(2*245*1*0.72)+1;
// BiaoZhunHuaGuanJing(&GuanJing,&BiHou,&DanWeiZhiLiang);
// GuanJing=GuanJing+2*BiHou;
GetPipePara();
// d=GuanJing-BiHou*2;
d=GuanJing/1000;
Well->GuanJing=GuanJing;
Well->BiHou=BiHou;
Well->GuanDanWeiZhiLiang=DanWeiZhiLiang;
L=Map.GetLength(Well->X,Well->Y,Zhan_x,Zhan_y,&GaoCha)*1000;
dH=Map.GetHeight(Zhan_x,Zhan_y)-Map.GetHeight(Well->X,Well->Y);
//入口温度
Tr=JingKouWenDu;
//假设出口温度
T0=Tr-2;
for(i=0;i<100&&L>0;i++)
{
//平均温度
_T=Tr/3+T0*2/3;
//出口压力
Pz=ZuiDiRuZhanYaLi;
//求入口压力
Pr=GetYaJiang(G,_T,Pz,Well->QiYouBi,Well->HanShuiLv,d,L,GaoCha);
if(Pr==0)
{
return;
}
//平均压力
_P=(Pz+Pr)/2;
QiMiDu=WuXing.GetQiMiDu(_T,_P);
if(QiMiDu==0)
{
Application->MessageBox("天然气密度计算错误!计算中止!", "错误", MB_OK);
Terminate();
return;
}
//气液流量
YouMiDu=WuXing.GetYouMiDu(_T);
Q0=G/YouMiDu;
ql=Q0/(1-Well->HanShuiLv);
Rs=WuXing.GetRs(YouMiDu,_P,_T);
B=WuXing.GetB(Rs,YouMiDu,_T);
Ql=ql*B;
Trr=(_T+273.15)/264.87;
Prr=(_P)/(43.960*1e5);
Z=WuXing.GetZ(Prr,Trr);
if(Z==0)
{
Application->MessageBox("天然气压缩系数计算错误!计算中止!", "错误", MB_OK);
Terminate();
return;
}
// Qg=ql*(Well->QiYouBi*G/Q0-Rs)*0.101*_T*Z/(_P*20);
Qg=ql*(Well->QiYouBi-Rs)*101325*(_T+273.15)*Z/(_P*273.15);
ShuiMiDu=WuXing.GetShuiMiDu(_T);
//液相密度
YeMiDu=ShuiMiDu*Well->HanShuiLv+YouMiDu*(1-Well->HanShuiLv);
ZhiLiangHanQi=Qg*QiMiDu/(Qg*QiMiDu+Ql*YeMiDu);
//计算乳状液比热容,粗略取原油比热容为2000 J/(kg.℃)
//粗略取天然气定压热容为0.65 J/(kg.℃)
Cpl=2000*(1-Well->HanShuiLv)+4180*Well->HanShuiLv;
Cpg=0.65;
Cp=ZhiLiangHanQi*Cpg+(1-ZhiLiangHanQi)*Cpl;
ShuiLiPoJiang=(Pr-Pz-dH)/(g*1000*L);
a=K*M_PI*d/(G*Cp);
b=g*ShuiLiPoJiang*G/(K*M_PI*d);
Tz=(TuRangWenDu+b)+(Tr-TuRangWenDu-b)*exp(0-a*L);
if(fabs(T0-Tz)<0.1)
{
break;
}
T0=Tz;
}
// JingKouYaLi=Pz;
if(Pz>JingKouHuiYa)
{
//如果需要增设增压点
ZengYaDian=true;
break;
}
Well=Well->Next;
}
if(ZengYaDian)
{
WellArray=new WellUnit*[WellNum];
FArray=new double[WellNum*WellNum];
FR=new double[WellNum*WellNum];
Flag=new bool[WellNum];
Well=CurrentHead->Well;
i=0;
for(i=0;i<WellNum;i++)
{
WellArray[i]=Well;
Well=Well->Next;
}
for(i=0;i<WellNum;i++)
{
for(j=0;j<WellNum;j++)
{
if(i==j)
{
FArray[i*WellNum+j]=1;
}
else
{
FArray[i*WellNum+j]=1-sqrt((WellArray[i]->X-WellArray[j]->X)*(WellArray[i]->X-WellArray[j]->X)+
(WellArray[i]->Y-WellArray[j]->Y)*(WellArray[i]->Y-WellArray[j]->Y))/JiShuBanJing;
}
}
}
TempInt=int(log10(WellNum)/log10(2))+1;
for(k=0;k<TempInt;k++)
{
for(i=0;i<WellNum;i++)
{
for(j=0;j<WellNum;j++)
{
FR[i*WellNum+j]=0;
for(m=0;m<WellNum;m++)
{
TempDouble=FArray[i*WellNum+m]<FArray[m*WellNum+j]?FArray[i*WellNum+m]:FArray[m*WellNum+j];
FR[i*WellNum+j]=FR[i*WellNum+j]>TempDouble?FR[i*WellNum+j]:TempDouble;
}
}
}
for(i=0;i<WellNum;i++)
for(j=0;j<WellNum;j++)
FArray[i*WellNum+j]=FR[i*WellNum+j];
}
TempInt=1;
ShuiPing=0.5;
do
{
if(TempInt==1)
{
ShuiPing*=1.2;
}
else if(TempInt>3)
{
ShuiPing*=0.8;
}
for(i=0;i<WellNum;i++)
{
Flag[i]=false;
}
TempInt=0;
for(i=0;i<WellNum;i++)
{
for(j=0;j<WellNum;j++)
{
if(FArray[i*WellNum+j]>=ShuiPing)
{
FR[i*WellNum+j]=1;
}
else
{
FR[i*WellNum+j]=0;
}
}
}
MaxNum=0;
MaxPos=0;
for(i=0;i<WellNum;i++)
{
if(Flag[i]==false)
{
TempInt++;
for(j=i;j<WellNum;j++)
{
Num=0;
if(FR[i*WellNum+j]==1)
{
Flag[j]=true;
Num++;
}
}
if(Num>MaxNum)
{
MaxNum=Num;
MaxPos=i;
}
}
}
}while(TempInt<2||TempInt>3);
//选取油井数目最多的部分作为转油站
for(i=0;i<WellNum;i++)
{
Flag[i]=false;
}
CurrentHead->Well=WellArray[MaxPos];
Well=CurrentHead->Well;
for(i=MaxPos+1;i<WellNum;i++)
{
if(FR[MaxPos*WellNum+i]==1)
{
Well->Next=WellArray[i];
Flag[i]=true;
Well=Well->Next;
}
}
Well->Next=0;
for(i=0;i<WellNum;i++)
{
if(Flag[i]==false&&i!=MaxPos)
{
TempHead=new WellHead;
TempHead->Well=WellArray[i];
TempHead->Sub=0;
TempHead->Next=0;
Well=TempHead->Well;
for(j=i;j<WellNum;j++)
{
if(FR[i*WellNum+j]==1)
{
Flag[j]=true;
Well->Next=WellArray[j];
Well=Well->Next;
}
}
Well->Next=0;
}
CurrentHead->Sub=TempHead;
CurrentHead=TempHead;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -