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

📄 baimabeiopti.cpp

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