📄 baimabeiopti.cpp
字号:
}
delete WellArray;
delete FArray;
delete FR;
delete Flag;
/*
//划分增压点井群
Well=CurrentTemp->Well;
CurrentTemp->Well=0;
while(Well!=0)
{
TempHead=(WellHead*) new WellHead;
TempHead->Sub=0;
TempHead->Next=0;
BaseWell=Well;
Well=Well->Next;
BaseWell->Next=0;
CurrentTemp->Well=BaseWell;
PreWell=0;
CurrentWell=Well;
TempWell=BaseWell;
WellNum=0;
while(CurrentWell!=0)
{
//判断是否在本井群范围内
if(sqrt((BaseWell->X-CurrentWell->X)*(BaseWell->X-CurrentWell->X)+
(BaseWell->Y-CurrentWell->Y)*(BaseWell->Y-CurrentWell->Y))
<0.8*ZuiDaLiuDongJuLi)
{
//是否是第一口井
if(PreWell==0)
{
//将该井插入本井群链表,修改井群链表头
Well=Well->Next;
CurrentWell->Next=TempWell->Next;
TempWell->Next=CurrentWell;
TempWell=CurrentWell;
CurrentWell=Well;
WellNum++;
}
else
{
//从原井群众删除该节点,并将其插入当前井群链表中
PreWell->Next=CurrentWell->Next;
CurrentWell->Next=TempWell->Next;
TempWell->Next=CurrentWell;
TempWell=CurrentWell;
CurrentWell=PreWell->Next;
WellNum++;
}
}
else
{
//当前指针后移
PreWell=CurrentWell;
CurrentWell=CurrentWell->Next;
}
}
if(WellNum<3)
{
CurrentWell=CurrentTemp->Well;
while(CurrentWell->Next!=0)
{
CurrentWell=CurrentWell->Next;
}
CurrentWell->Next=BaseWell;
TempHead->Well=0;
delete TempHead;
}
else
{
CurrentTemp->Sub=TempHead;
CurrentTemp=TempHead;
}
}
//确定转油站位置
CurrentTemp=CurrentHead->Sub;
MaxPos=0;
MaxNum=0;
Num=0;
i=0;
//寻找油井数最多的部分设立转油站
while(CurrentTemp!=0)
{
Well=CurrentTemp->Well;
Num=0;
while(Well!=0)
{
Well=Well->Next;
Num++;
}
if(MaxNum<Num)
{
MaxNum=Num;
MaxPos=i;
}
i++;
CurrentTemp=CurrentTemp->Sub;
}
CurrentTemp=CurrentHead;
for(i=0;i<MaxPos;i++)
{
CurrentTemp=CurrentTemp->Sub;
}
//将该部分的油井接到第一个节点上,设立转油站
TempHead=CurrentTemp->Sub;
CurrentHead->Well=TempHead->Well;
TempHead->Well=0;
CurrentTemp->Sub=TempHead->Sub;
delete TempHead;
*/
}
if(Terminated)
{
return;
}
CurrentHead=CurrentHead->Next;
}
//联合站2
CurrentHead=Head->Sub;
if(CurrentHead!=0)
{
CurrentHead=CurrentHead->Next;
}
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[Ma
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -