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

📄 baimabeiopti.cpp

📁 石油公司网管系统优化系统软件源码,很有价值的.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            }
            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 + -