📄 dongzhiopti.cpp
字号:
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;
}
//确定各站管径,流量
if(Terminated)
{
return;
}
CurrentHead=Head->Next;
while(CurrentHead!=0&&!Terminated)
{
TempHead=CurrentHead->Sub;
CurrentHead->HanShuiLv=0;
CurrentHead->YouLiuLiang=0;
CurrentHead->QiYouBi=0;
//增压点计算
while(TempHead!=0)
{
Well=TempHead->Well;
TempHead->HanShuiLv=0;
TempHead->YouLiuLiang=0;
TempHead->QiYouBi=0;
//计算气液流量和含水率
while(Well!=0)
{
TempHead->HanShuiLv+=Well->YouLiuLiang/(1-Well->HanShuiLv);
TempHead->YouLiuLiang+=Well->YouLiuLiang;
TempHead->QiYouBi+=Well->YouLiuLiang*Well->QiYouBi;
Well=Well->Next;
}
//计算该转油站下增压点的总流量
CurrentHead->HanShuiLv+=TempHead->HanShuiLv;
CurrentHead->YouLiuLiang+=TempHead->YouLiuLiang;
CurrentHead->QiYouBi+=TempHead->QiYouBi;
//计算含水率,
TempHead->HanShuiLv=(TempHead->HanShuiLv-TempHead->YouLiuLiang)/TempHead->HanShuiLv;
//计算气油比
TempHead->QiYouBi/=TempHead->YouLiuLiang;
//计算管径,壁厚
QiMiDu=WuXing.GetQiMiDu(JingKouWenDu,YouSheJiYaLi);
if(QiMiDu==0)
{
Application->MessageBox("天然气密度计算错误!计算中止!", "错误", MB_OK);
Terminate();
return;
}
YouMiDu=WuXing.GetYouMiDu(JingKouWenDu);
Q0=G/YouMiDu;
ql=Q0/(1-TempHead->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*(TempHead->QiYouBi*G/Q0-Rs)*0.101*JingKouWenDu*Z/(YouSheJiYaLi*20);
Qg=ql*(TempHead->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();
TempHead->GuanJing=GuanJing;
TempHead->BiHou=BiHou;
TempHead->GuanDanWeiZhiLiang=DanWeiZhiLiang;
TempHead=TempHead->Sub;
}
if(Terminated)
{
return;
}
Well=CurrentHead->Well;
//计算该站点的总流量
while(Well!=0)
{
CurrentHead->HanShuiLv+=Well->YouLiuLiang/(1-Well->HanShuiLv);
CurrentHead->YouLiuLiang+=Well->YouLiuLiang;
CurrentHead->QiYouBi+=Well->YouLiuLiang*Well->QiYouBi;
Well=Well->Next;
}
CurrentHead->HanShuiLv=(CurrentHead->HanShuiLv-CurrentHead->YouLiuLiang)/CurrentHead->HanShuiLv;
//计算气油比
CurrentHead->QiYouBi/=CurrentHead->YouLiuLiang;
//计算该站点管径,壁厚
QiMiDu=WuXing.GetQiMiDu(JingKouWenDu,YouSheJiYaLi);
if(QiMiDu==0)
{
Application->MessageBox("天然气密度计算错误!计算中止!", "错误", MB_OK);
Terminate();
return;
}
YouMiDu=WuXing.GetYouMiDu(JingKouWenDu);
G=CurrentHead->YouLiuLiang;
Q0=G/YouMiDu;
ql=Q0/(1-CurrentHead->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*(CurrentHead->QiYouBi*G/Q0-Rs)*0.101*JingKouWenDu*Z/(YouSheJiYaLi*20);
Qg=ql*(CurrentHead->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();
CurrentHead->GuanDanWeiZhiLiang=DanWeiZhiLiang;
CurrentHead->GuanJing=GuanJing;
CurrentHead->BiHou=BiHou;
CurrentHead=CurrentHead->Next;
}
//计算联合站管径,壁厚,流量
Head->HanShuiLv=0;
Head->YouLiuLiang=0;
Head->QiYouBi=0;
CurrentHead=Head->Next;
while(CurrentHead!=0)
{
Head->HanShuiLv+=CurrentHead->YouLiuLiang/(1-CurrentHead->HanShuiLv);
Head->YouLiuLiang+=CurrentHead->YouLiuLiang;
Head->QiYouBi+=CurrentHead->QiYouBi*CurrentHead->YouLiuLiang;
CurrentHead=CurrentHead->Next;
}
Head->HanShuiLv=(Head->HanShuiLv-Head->YouLiuLiang)/(Head->HanShuiLv);
//计算气油比
Head->QiYouBi/=Head->YouLiuLiang;
//计算联合站管径,壁厚
QiMiDu=WuXing.GetQiMiDu(JingKouWenDu,YouSheJiYaLi);
if(QiMiDu==0)
{
Application->MessageBox("天然气密度计算错误!计算中止!", "错误", MB_OK);
Terminate();
return;
}
YouMiDu=WuXing.GetYouMiDu(JingKouWenDu);
G=Head->YouLiuLiang;
Q0=G/YouMiDu;
ql=Q0/(1-Head->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*(Head->QiYouBi*G/Q0-Rs)*0.101*JingKouWenDu*Z/(YouSheJiYaLi*20);
Qg=ql*(Head->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();
Head->GuanDanWeiZhiLiang=DanWeiZhiLiang;
Head->GuanJing=GuanJing;
Head->BiHou=BiHou;
//计算染色体中基因个数
GenNum=0;
CurrentHead=Head->Next;
while(CurrentHead!=0)
{
GenNum++;
TempHead=CurrentHead->Sub;
while(TempHead!=0)
{
GenNum++;
TempHead=TempHead->Sub;
}
CurrentHead=CurrentHead->Next;
}
GenNum++;
//初始化种群
if(Terminated)
{
return;
}
//申请内存空间
population=new GenUnit[popsize];
StationFlag=new int[GenNum];
BestUnit=new GenUnit;
NewPop=new GenUnit[popsize*3];
Uper=new double[GenNum*2];
Lower=new double[GenNum*2];
BestUnit->Gens=new double[GenNum*2];
// BestUnit->Limit=new double[GenNum*2];
for(i=0;i<popsize;i++)
{
population[i].Gens=new double[GenNum*2];
// population[i].Limit=new double[GenNum*2];
}
for(i=0;i<popsize*3;i++)
{
NewPop[i].Gens=new double[GenNum*2];
// NewPop[i].Limit=new double[GenNum*2];
}
//记录染色体中的基因特性(站点/油井)
//0-油井,1-增压点,2-转油站,3-联合站
CurrentHead=Head->Next;
i=0;
Head->No="西二联";
int Zeng=1,Zhuan=1;
while(CurrentHead!=0)
{
if(CurrentHead->No=="")
{
CurrentHead->No=CurrentHead->No.sprintf("转%d",Zhuan);
Zhuan++;
}
TempHead=CurrentHead->Sub;
Zeng=1;
while(TempHead!=0)
{
if(TempHead->No=="")
{
TempHead->No=TempHead->No.sprintf("增%d-%d",Zhuan,Zeng);
Zeng++;
}
StationFlag[i]=1;
TempHead=TempHead->Sub;
i++;
}
StationFlag[i]=2;
CurrentHead=CurrentHead->Next;
i++;
}
StationFlag[i]=3;
//生成染色体基因
double XX,YY;
double x_max,x_min,y_max,y_min;
int n;
for(i=0;i<popsize;i++)
{
if(Terminated)
{
return;
}
CurrentHead=Head->Next;
//确定各中间站和增压点的初始坐标
n=0;
while(CurrentHead!=0)
{
if(Terminated)
{
return;
}
TempHead=CurrentHead->Sub;
while(TempHead!=0)
{
//统计该增压点下的油井个数和坐标范围
Num=0;
Well=TempHead->Well;
x_max=Well->X;
x_min=Well->X;
y_max=Well->Y;
y_min=Well->Y;
while(Well!=0)
{
Num++;
if(Well->X<x_min)
x_min=Well->X;
if(Well->X>x_max)
x_max=Well->X;
if(Well->Y<y_min)
y_min=Well->Y;
if(Well->Y>y_max)
y_max=Well->Y;
Well=Well->Next;
}
//确定该增压点初始坐标
XX=0;
YY=0;
if(Num>3)
{
for(j=0;j<3;j++)
{
k=rand()%Num;
Well=TempHead->Well;
for(m=0;m<k;m++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -