예제 #1
0
        public static void generateDynamicData()
        {
            //读入工程的全部井全部历史的生产动态数据
            List <ItemInputWellProduct> listInputItemProduct = cIOinputWellProduct.readProjectFile2Struct();
            //读入工程的注入数据
            List <ItemInputWellInject> listInputItemInject = cIOInputWellInject.readProjectFile2Struct();
            //读入小层数据表数据
            List <ItemDicLayerDataStatic> listItemLayerDataStatic = cIODicLayerDataStatic.readDicLayerData2struct();

            //数据太多,按时间建立文件拆分是最好的解决办法,即避免了井分割 又避免了层分割。
            foreach (string sYM in cProjectData.ltStrProjectYM)
            {
                //创建文件
                string       filePath = Path.Combine(cProjectManager.dirPathUsedProjectData, sYM + cProjectManager.fileExtensionDynamic);
                StreamWriter swNew    = new StreamWriter(filePath, false, Encoding.UTF8);
                //写文件头
                List <string> ltStrHeadColoum = new List <string>();  //小层数据表头
                ltStrHeadColoum.Add("年月");
                ltStrHeadColoum.Add("井号");
                ltStrHeadColoum.Add("小层名");
                ltStrHeadColoum.Add("井型");
                ltStrHeadColoum.Add("射孔厚度(m)");
                ltStrHeadColoum.Add("生产天数(天)");
                ltStrHeadColoum.Add("月产油(吨)");
                ltStrHeadColoum.Add("月产水(吨)"); //顶底深TVD相减得到
                ltStrHeadColoum.Add("月产气(万方)");
                ltStrHeadColoum.Add("累产油(万吨)");
                ltStrHeadColoum.Add("累产油(万方)");
                ltStrHeadColoum.Add("累产气(万方)");
                ltStrHeadColoum.Add("月注水(方)");
                ltStrHeadColoum.Add("累注水(万方)");
                ltStrHeadColoum.Add("套压Mpa");
                ltStrHeadColoum.Add("油压Mpa");
                ltStrHeadColoum.Add("流压Mpa");
                ltStrHeadColoum.Add("静压Mpa");
                ltStrHeadColoum.Add("泵压Mpa");
                ltStrHeadColoum.Add("砂厚");
                ltStrHeadColoum.Add("有效厚度");
                ltStrHeadColoum.Add("加权孔隙度(%)");
                ltStrHeadColoum.Add("加权渗透率(md)");
                ltStrHeadColoum.Add("劈分系数");
                swNew.WriteLine(string.Join("\t", ltStrHeadColoum.ToArray()));

                foreach (string sJH in cProjectData.ltStrProjectJH)
                {
                    ItemInputWellProduct      currentWellProduct        = listInputItemProduct.Find(p => p.sYM == sYM && p.sJH == sJH);
                    ItemInputWellInject       currentWellInject         = listInputItemInject.Find(p => p.sYM == sYM && p.sJH == sJH);
                    List <ItemDicPerforation> currentWellPerforateItems = cIOinputWellPerforation.readPerforateFile(sJH);

                    //先记录未劈分的Alllayer原始数据
                    ItemDicLayerDataDynamic dicDynamicLayeritemOfALLLayer = new ItemDicLayerDataDynamic();
                    dicDynamicLayeritemOfALLLayer.sYM  = sYM;
                    dicDynamicLayeritemOfALLLayer.sXCM = "AllLayer";
                    dicDynamicLayeritemOfALLLayer.sJH  = sJH;
                    //从射孔中得到射孔厚度
                    dicDynamicLayeritemOfALLLayer.fSKHD = currentWellPerforateItems.FindAll(p => int.Parse(p.YMstart) <= int.Parse(sYM) && int.Parse(sYM) <= int.Parse(p.YMend)).Select(p => p.fSKHD).Sum();

                    //静态数据表中得到砂厚、孔渗饱等基础数据
                    dicDynamicLayeritemOfALLLayer.fSH   = listItemLayerDataStatic.FindAll(p => p.sJH == sJH).Select(p => p.fSH).Sum();
                    dicDynamicLayeritemOfALLLayer.fYXHD = listItemLayerDataStatic.FindAll(p => p.sJH == sJH).Select(p => p.fYXHD).Sum();
                    dicDynamicLayeritemOfALLLayer.fKXD  = listItemLayerDataStatic.FindAll(p => p.sJH == sJH).Select(p => p.fKXD).Average();
                    dicDynamicLayeritemOfALLLayer.fSTL  = listItemLayerDataStatic.FindAll(p => p.sJH == sJH).Select(p => p.fSTL).Average();

                    //劈分系数 整体给1
                    dicDynamicLayeritemOfALLLayer.fKHpercent = 1;
                    if (currentWellInject.sYM != null)
                    {
                        dicDynamicLayeritemOfALLLayer.iWellType = (int)TypeWell.Injectwater;
                        dicDynamicLayeritemOfALLLayer.fSCTS     = currentWellInject.fZSTS;
                        dicDynamicLayeritemOfALLLayer.fYCQ      = 0;
                        dicDynamicLayeritemOfALLLayer.fYCS      = 0;
                        dicDynamicLayeritemOfALLLayer.fYCY      = 0;
                        dicDynamicLayeritemOfALLLayer.fLCY      = 0;
                        dicDynamicLayeritemOfALLLayer.fLCS      = 0;
                        dicDynamicLayeritemOfALLLayer.fLCQ      = 0;
                        dicDynamicLayeritemOfALLLayer.fYZS      = currentWellInject.fYZSL;
                        dicDynamicLayeritemOfALLLayer.fLZS      = currentWellInject.fLZSL;
                        dicDynamicLayeritemOfALLLayer.fTY       = currentWellInject.fTY;
                        dicDynamicLayeritemOfALLLayer.fLY       = currentWellInject.fLY;
                        dicDynamicLayeritemOfALLLayer.fYY       = currentWellInject.fYY;
                        dicDynamicLayeritemOfALLLayer.fJY       = currentWellInject.fJY;
                        dicDynamicLayeritemOfALLLayer.fPY       = currentWellInject.fJY;
                    }
                    else if (currentWellProduct.sYM != null)
                    {
                        dicDynamicLayeritemOfALLLayer.iWellType = (int)TypeWell.Oil;
                        dicDynamicLayeritemOfALLLayer.fSCTS     = currentWellProduct.fSCTS;
                        dicDynamicLayeritemOfALLLayer.fYCQ      = currentWellProduct.fYC_gas;
                        dicDynamicLayeritemOfALLLayer.fYCS      = currentWellProduct.fYC_water;
                        dicDynamicLayeritemOfALLLayer.fYCY      = currentWellProduct.fYC_oil;
                        dicDynamicLayeritemOfALLLayer.fLCY      = currentWellProduct.fSum_oil;
                        dicDynamicLayeritemOfALLLayer.fLCS      = currentWellProduct.fSum_water;
                        dicDynamicLayeritemOfALLLayer.fLCQ      = currentWellProduct.fSum_gas;
                        dicDynamicLayeritemOfALLLayer.fYZS      = 0;
                        dicDynamicLayeritemOfALLLayer.fLZS      = 0;
                        dicDynamicLayeritemOfALLLayer.fTY       = currentWellProduct.fTY;
                        dicDynamicLayeritemOfALLLayer.fLY       = currentWellProduct.fLY;
                        dicDynamicLayeritemOfALLLayer.fYY       = currentWellProduct.fYY;
                        dicDynamicLayeritemOfALLLayer.fJY       = currentWellProduct.fJY;
                        dicDynamicLayeritemOfALLLayer.fPY       = 0;
                    }
                    else
                    {
                        dicDynamicLayeritemOfALLLayer.iWellType = 0;     //未找到井,可能停产了或者未生产
                        dicDynamicLayeritemOfALLLayer.fSCTS     = 0;
                        dicDynamicLayeritemOfALLLayer.fYCQ      = 0;
                        dicDynamicLayeritemOfALLLayer.fYCS      = 0;
                        dicDynamicLayeritemOfALLLayer.fYCY      = 0;
                        dicDynamicLayeritemOfALLLayer.fLCY      = 0;
                        dicDynamicLayeritemOfALLLayer.fLCS      = 0;
                        dicDynamicLayeritemOfALLLayer.fLCQ      = 0;
                        dicDynamicLayeritemOfALLLayer.fYZS      = 0;
                        dicDynamicLayeritemOfALLLayer.fLZS      = 0;
                        dicDynamicLayeritemOfALLLayer.fTY       = 0;
                        dicDynamicLayeritemOfALLLayer.fLY       = 0;
                        dicDynamicLayeritemOfALLLayer.fYY       = 0;
                        dicDynamicLayeritemOfALLLayer.fJY       = 0;
                        dicDynamicLayeritemOfALLLayer.fPY       = 0;
                    }
                    swNew.WriteLine(ItemDicLayerDataDynamic.item2string(dicDynamicLayeritemOfALLLayer));

                    //将所有小层的动态字典数据item 初始化
                    List <ItemDicLayerDataDynamic> listDynamicData = new List <ItemDicLayerDataDynamic>();
                    foreach (string xcm in cProjectData.ltStrProjectXCM)
                    {
                        ItemDicLayerDataDynamic item = new ItemDicLayerDataDynamic();
                        item.sYM   = sYM;
                        item.sXCM  = xcm;
                        item.sJH   = sJH;
                        item.fSCTS = dicDynamicLayeritemOfALLLayer.fSCTS;
                        item.fSKHD = currentWellPerforateItems.Find(p => p.sXCM == xcm &&
                                                                    int.Parse(p.YMstart) <= int.Parse(sYM) && int.Parse(sYM) <= int.Parse(p.YMend)).fSKHD;
                        item.fSH        = listItemLayerDataStatic.Find(p => p.sJH == sJH && p.sXCM == xcm).fSH;
                        item.fYXHD      = listItemLayerDataStatic.Find(p => p.sJH == sJH && p.sXCM == xcm).fYXHD;
                        item.fKXD       = listItemLayerDataStatic.Find(p => p.sJH == sJH && p.sXCM == xcm).fKXD;
                        item.fSTL       = listItemLayerDataStatic.Find(p => p.sJH == sJH && p.sXCM == xcm).fSTL;
                        item.fKHpercent = item.fSKHD * item.fSTL;
                        item.iWellType  = dicDynamicLayeritemOfALLLayer.iWellType;
                        item.fYCQ       = 0;
                        item.fYCS       = 0;
                        item.fYCY       = 0;
                        item.fLCY       = 0;
                        item.fLCS       = 0;
                        item.fLCQ       = 0;
                        item.fYZS       = 0;
                        item.fLZS       = 0;
                        item.fTY        = 0;
                        item.fLY        = 0;
                        item.fYY        = 0;
                        item.fJY        = 0;
                        item.fPY        = 0;
                        listDynamicData.Add(item);
                    }//end of xcm

                    //根据劈分系数和井型 劈分数据
                    float sumKHpercent = listDynamicData.Select(p => p.fKHpercent).Sum();
                    if (sumKHpercent > 0)
                    {
                        foreach (ItemDicLayerDataDynamic _item in listDynamicData)
                        {
                            _item.fKHpercent = _item.fKHpercent / sumKHpercent;
                            if (_item.iWellType == (int)TypeWell.Oil)
                            {
                                _item.fYCQ = dicDynamicLayeritemOfALLLayer.fYCQ * _item.fKHpercent;
                                _item.fYCS = dicDynamicLayeritemOfALLLayer.fYCS * _item.fKHpercent;
                                _item.fYCY = dicDynamicLayeritemOfALLLayer.fYCY * _item.fKHpercent;
                                _item.fLCY = dicDynamicLayeritemOfALLLayer.fLCY * _item.fKHpercent;
                                _item.fLCS = dicDynamicLayeritemOfALLLayer.fLCS * _item.fKHpercent;
                                _item.fLCQ = dicDynamicLayeritemOfALLLayer.fLCY * _item.fKHpercent;
                            }
                            if (_item.iWellType == (int)TypeWell.Injectwater)
                            {
                                _item.fYZS = dicDynamicLayeritemOfALLLayer.fYZS * _item.fKHpercent;
                                _item.fLZS = dicDynamicLayeritemOfALLLayer.fLZS * _item.fKHpercent;
                            }
                        }
                    }//end if
                    //写每个小层的数据
                    foreach (ItemDicLayerDataDynamic _item in listDynamicData)
                    {
                        swNew.WriteLine(ItemDicLayerDataDynamic.item2string(_item));
                    }
                } //end of jh
                swNew.Close();
            }     //end of ym
        }