/// <summary> 获取单位制 </summary> public UnitType GetUnitType(string dataFile) { // 不读取INCLUDE部分数据 SimONData data = new SimONData(dataFile, null, l => false); // Todo :释放表格缓存文件 data.Key.SetAllMmfDispose(); // 读到METRIC英制单位 METRIC metric = data.Key.Find <METRIC>(); if (metric != null) { return(UnitType.METRIC); } // 单位类型 FIELD field = data.Key.Find <FIELD>(); if (field != null) { return(UnitType.FIELD); } data.Dispose(); return(UnitType.METRIC); }
/// <summary> 创建初始重启模型 </summary> public MainFileRestartSimON InitRestartInfoModel(SimONData mainData) { SOLVECTRL start = mainData.Key.Find <SOLVECTRL>(); if (start == null) { return(null); } MainFileRestartSimON restart = new MainFileRestartSimON(); restart.Parent = null; restart.RestartTime = start.Date; restart.FileName = Path.GetFileNameWithoutExtension(mainData.FileName); restart.FilePath = Path.GetDirectoryName(mainData.FilePath); restart.Index = 0; restart.ResultFilePath = restart.FilePath + "\\" + Path.GetFileNameWithoutExtension(restart.FileName) + "_rst1.bin"; restart.MainFilePath = restart.FilePath + "\\" + restart.FileName + KeyConfiger.SimONExtend; // 把主文件的SCH和SOLU部分传进来 restart.Solution = mainData.Key.Find <SOLUTION>(); restart.Schedule = mainData.Key.Find <SCHEDULE>(); restart.Well = mainData.Key.Find <WELL>(); restart.SchPath = restart.FilePath + "\\" + restart.FileName + "_SCH.DAT"; restart.InitPath = restart.FilePath + "\\" + restart.FileName + "_iNIT.DAT"; return(restart); }
/// <summary> 更换案例路径 P1= D:\WorkArea\3106 P2 = D:\WorkArea\数值模拟</summary> public void ChangePath(SimONData _simONData, string newFullPath, string tempOld) { string caseName = Path.GetFileNameWithoutExtension(newFullPath); string tempPath = Path.Combine(newFullPath, caseName);// E:\\aaaa\\aaaa _simONData.FilePath = tempOld + KeyConfiger.SimONExtend; string oldFile = Path.Combine(newFullPath, Path.GetFileName(_simONData.FilePath)); // E:\\aaaa\\数值模拟.dat string newStr = Path.Combine(newFullPath, caseName + Path.GetExtension(oldFile)); // E:\\aaaa\\aaaa.dat // Todo :更改文件路径 E:\\数值模拟\\数值模拟_prd.dat To:E:\\aaaa\\aaaa_prd.dat Func <string, string> replace = old => old.Replace(tempOld, tempPath); string oldCaseName = Path.GetFileNameWithoutExtension(_simONData.FilePath);// 数值模拟 // Todo :重新保存一份主文件 不加载INCLUDE 只处理主文件 SimONData tempSimon = FileFactoryService.Instance.ThreadLoadFunc <SimONData>(() => new SimONData(newStr, null, k => false)); var allInc = tempSimon.Key.FindAll <INCLUDE>(); foreach (var item in allInc) { // Todo :不保存 防止覆盖原INCLUDE文件 item.IsCreateFile = false; item.FileName = item.FileName.Replace(oldCaseName, caseName); item.FilePath = replace(item.FilePath); } tempSimon.Save(); // Todo :修改所有INCLUDE文件名 List <INCLUDE> includes = _simONData.Key.FindAll <INCLUDE>(); foreach (var item in includes) { string includePath = Path.Combine(newFullPath, item.FileName); File.Move(includePath, replace(item.FilePath)); item.FileName = item.FileName.Replace(oldCaseName, caseName); item.FilePath = replace(item.FilePath); } _simONData.FilePath = newStr; string hist = tempPath + KeyConfiger.HistroyFileName; string oldhist = Path.Combine(newFullPath, oldCaseName) + KeyConfiger.HistroyFileName; File.Move(oldhist, hist); }
/// <summary> 利用数模文件异步创建指定大小栈的内存模型 </summary> public SimONData ThreadLoadSimONResize(string fileFullPath, int stactSize = 4194304) { SimONData eclData = null; Thread thread = new Thread(() => eclData = new SimONData(fileFullPath), stactSize);// 4mb栈 thread.Start(); while (true) { if (thread.ThreadState == ThreadState.Stopped) { break; } } return(eclData); }
public static void ReName(this SimONData ecl, string oldFullPath, string newFullPath) { string oldCaseName = Path.GetFileName(oldFullPath); string caseName = Path.GetFileName(newFullPath); string oldPath = Path.GetDirectoryName(oldFullPath); string newPath = Path.GetDirectoryName(newFullPath); // Todo :更改主文件名称 if (File.Exists(oldFullPath)) { string newStr = newFullPath;// E:\\aaaa\\aaaa.dat File.Move(oldFullPath, newFullPath); // Todo :重新保存一份主文件 不加载INCLUDE 只处理主文件 SimONData tempSimon = FileFactoryService.Instance.ThreadLoadFunc <SimONData>(() => new SimONData(newStr, null, k => false)); var allInc = tempSimon.Key.FindAll <INCLUDE>(); foreach (var item in allInc) { // Todo :不保存 防止覆盖原INCLUDE文件 item.IsCreateFile = false; item.FileName = item.FileName.Replace(oldCaseName, caseName); //item.FilePath = item.FilePath.Replace(oldPath, newPath); } tempSimon.Save(); // Todo :修改所有INCLUDE文件名 List <INCLUDE> includes = ecl.Key.FindAll <INCLUDE>(); foreach (var item in includes) { string includePath = Path.Combine(oldPath, item.FileName); string includePathNew = Path.Combine(newPath, item.FileName); File.Move(includePath, includePathNew); } ecl.FilePath = newStr; } }
/// <summary> 利用数模文件异步创建指定大小栈的内存模型 </summary> public INCLUDE ThreadLoadFromFile(INCLUDE include, string pfilePath, SimKeyType keyType = SimKeyType.Eclipse, int stactSize = 4194304) { include.FileName = Path.GetFileName(pfilePath); include.FilePath = pfilePath; if (include.BaseFile == null) { if (keyType == SimKeyType.Eclipse) { EclipseData ecl = new EclipseData(); include.BaseFile = ecl; } else if (keyType == SimKeyType.SimON) { SimONData simon = new SimONData(); include.BaseFile = simon; } } Thread thread = new Thread(() => include.ReadFromStream(), stactSize);// 4mb栈 thread.Start(); while (true) { if (thread.ThreadState == ThreadState.Stopped) { break; } } return(include); }
void SearchFile() { OpenFileDialog dlg = new OpenFileDialog(); if (dlg.ShowDialog() == DialogResult.OK) { this.FilePath = dlg.FileName; } if (!File.Exists(this._filePath)) { return; } //var ut = EclipseDataService.GetUnitType(this.FilePath); //MessageBox.Show(ut.ToString()); //return; //// 加载进度窗体 //RunLogWindow runLogWindow = new RunLogWindow(this); //runLogWindow.Show(); //EclipseData ecl = FileFactoryService.Instance.ThreadLoadResize(this._filePath); //this.EclipseData = SimDataConvertService.Instance.ConvertToSimON(ecl); SimONData sim = FileFactoryService.Instance.ThreadLoadSimONResize(this._filePath); //SimONData sim = FileFactoryService.Instance.ThreadLoadFunc<SimONData>(() => new SimONData(this._filePath, null, l => l.GetParentKey() is SCHEDULE)); //this.EclipseData = new EclipseData(); //RunLog = EclipseData.RunLog; //this.EclipseData.Load(this._filePath); //END end= this.EclipseData.Key.Find<END>(); // if(end!=null) // { // end.ClearAllAfter(); // } List <BaseKey> bb = sim.Key.FindAll <BaseKey>(); var ssr = bb.FindAll(l => l.ParentKey == null); BkSource = sim.Key.FindAll <BaseKey>(); if (BkSource.Count > 0) { IteamSel = BkSource.FirstOrDefault(); } Total = BkSource.Count.ToString(); List <BaseKey> unKonwKeys = BkSource.FindAll(l => !l.IsUnKnowKey); UnKownTotalType = unKonwKeys.GroupBy(l => l.Name.Split(' ')[0]).Count().ToString(); List <BaseKey> KonwKeys = BkSource.FindAll(l => l.IsUnKnowKey); KownTotalType = KonwKeys.GroupBy(l => l.Name.Split(' ')[0]).Count().ToString(); UnKownTotal = unKonwKeys.Count.ToString(); KownTotal = (int.Parse(Total) - int.Parse(UnKownTotal)).ToString(); }
/// <summary> 将Eclipse数模文件转换成SimON数模文件 </summary> public SimONData ConvertToSimON(EclipseData ecl) { // Todo :Eclipse里面的修改参数没有解析成SimON中修改参数 ecl.RunModify(); RUNSPEC runspec = ecl.Key.Find <RUNSPEC>(); GRID grid = ecl.Key.Find <GRID>(); SOLUTION solution = ecl.Key.Find <SOLUTION>(); SUMMARY summary = ecl.Key.Find <SUMMARY>(); SCHEDULE schedule = ecl.Key.Find <SCHEDULE>(); REGIONS regions = ecl.Key.Find <REGIONS>(); PROPS props = ecl.Key.Find <PROPS>(); SimONData simon = new SimONData(); simon.FileName = ecl.FileName; simon.FilePath = ecl.FilePath; simon.MmfDirPath = ecl.MmfDirPath; simon.InitConstruct(); simon.X = ecl.X; simon.Y = ecl.Y; simon.Z = ecl.Z; // 模型定义 #region - 起始时间 - SOLVECTRL tuning = new SOLVECTRL("TUNING"); tuning.Date = ecl.Key.Find <START>().StartTime; simon.Key.Add(tuning); #endregion #region - 维数定义 - RSVSIZE rsvsize = new RSVSIZE("RSVSIZE"); DIMENS dimens = ecl.Key.Find <DIMENS>(); rsvsize.X = dimens.X; rsvsize.Y = dimens.Y; rsvsize.Z = dimens.Z; simon.Key.Add(rsvsize); #endregion #region - 单位类型 - UnitType unitType = UnitType.METRIC; // 读到METRIC公制单位 METRIC metric = ecl.Key.Find <METRIC>(); if (metric != null) { simon.Key.Add(metric); unitType = UnitType.METRIC; } // 单位类型 FIELD field = ecl.Key.Find <FIELD>(); if (field != null) { simon.Key.Add(field); unitType = UnitType.FIELD; } #endregion #region - 流体类型 - MODELTYPE modeltype = new MODELTYPE("MODELTYPE"); // 流体类型 OIL oil = runspec.Find <OIL>(); WATER water = runspec.Find <WATER>(); GAS gas = runspec.Find <GAS>(); DISGAS disgas = runspec.Find <DISGAS>(); VAPOIL vapoil = runspec.Find <VAPOIL>(); // 黑油 if (oil != null && water != null && gas != null && disgas != null && vapoil == null) { modeltype.MetricType = MetricType.BLACKOIL; } // 油水 else if (oil != null && water != null && gas == null && disgas == null && vapoil == null) { modeltype.MetricType = MetricType.OILWATER; } // 气水 else if (oil == null && water != null && gas != null && disgas == null && vapoil == null) { modeltype.MetricType = MetricType.GASWATER; } // 挥发油 else if (oil != null && water != null && gas != null && disgas != null && vapoil != null) { modeltype.MetricType = MetricType.HFOIL; } else { modeltype.MetricType = MetricType.BLACKOIL; } simon.Key.Add(modeltype); #endregion #region - 分区维数 - EQUILREG equilreg = new EQUILREG("EQUILREG"); FIPREG fipreg = new FIPREG("FIPREG"); ROCKREG rockreg = new ROCKREG("ROCKREG"); SATREG satreg = new SATREG("SATREG"); PVTREG pvtreg = new PVTREG("PVTREG"); simon.Key.Add(equilreg); simon.Key.Add(fipreg); simon.Key.Add(rockreg); simon.Key.Add(satreg); simon.Key.Add(pvtreg); TABDIMS tabdims = runspec.Find <TABDIMS>(); if (tabdims != null) { fipreg.X = tabdims.Fipfqzds4.ToString(); rockreg.X = tabdims.Yslxgs12.ToString(); satreg.X = tabdims.Bhdbs0.ToString(); pvtreg.X = tabdims.Pvtbs1.ToString(); //fipreg.X = "1"; //rockreg.X = "1"; //satreg.X = "1"; //pvtreg.X = "1"; } EQLDIMS eqldims = runspec.Find <EQLDIMS>(); if (eqldims != null) { //equilreg.X = "1"; equilreg.X = eqldims.Phfqs0.ToString(); } OVERBURD overburd = props.Find <OVERBURD>(); if (overburd != null) { //rockreg.X = overburd.Regions.Count.ToString(); } EQUILMAP equilmap = new EQUILMAP("EQUILMAP"); FIPMAP fipmap = new FIPMAP("FIPMAP"); ROCKMAP rockmap = new ROCKMAP("ROCKMAP"); SATMAP satmap = new SATMAP("SATMAP"); PVTMAP pvtmap = new PVTMAP("PVTMAP"); if (regions != null) { EQLNUM eqlnum = regions.Find <EQLNUM>(); if (eqlnum != null) { equilmap = eqlnum.ToTableKey <EQUILMAP>(); solution.Add(equilmap); eqlnum.Delete(); eqlnum.Dispose(); } // Todo :非平衡初始化压力需要转换 var pressure = solution.Find <PRESSURE>(); if (pressure != null) { POIL poil = pressure.ToTableKey <POIL>(); solution.Add(poil); pressure.Delete(); pressure.Dispose(); } if (regions != null) { FIPNUM fipnum = regions.Find <FIPNUM>(); if (fipnum != null) { fipmap = fipnum.ToTableKey <FIPMAP>(); grid.Add(fipmap); fipnum.Delete(); fipnum.Dispose(); } ROCKNUM rocknum = regions.Find <ROCKNUM>(); if (rocknum != null) { rockmap = rocknum.TransToTableKeyByName("ROCKMAP", true) as ROCKMAP; grid.Add(rockmap); rocknum.Delete(); rocknum.Dispose(); } SATNUM satnum = regions.Find <SATNUM>(); if (satnum != null) { satmap = satnum.ToTableKey <SATMAP>(); grid.Add(satmap); satnum.Delete(); satnum.Dispose(); } PVTNUM pvtnum = regions.Find <PVTNUM>(); if (pvtnum != null) { pvtmap = pvtnum.ToTableKey <PVTMAP>(); grid.Add(pvtmap); pvtnum.Delete(); pvtnum.Dispose(); } } } #endregion #region - 地质模型 - simon.Key.Add(grid); #endregion #region - 断层 - //var eclFaults = grid.FindAll<OPT.Product.SimalorManager.RegisterKeys.Eclipse.FAULTS>(); //foreach (var v in eclFaults) //{ //grid.AddRange(this.ConvertToSimON(v)); //v.Delete(); //} #endregion #region - 水体 - //AQUFETP AQUFETP= // Todo :Fetkovich水体数据转换 var ct = solution.Find <OPT.Product.SimalorManager.RegisterKeys.Eclipse.AQUCT>(); if (ct != null) { var newFetp = this.ConvertToSimON(ct); solution.Add(newFetp); ct.Delete(); } // Todo :Fetkovich水体数据转换 var fetp = solution.Find <OPT.Product.SimalorManager.RegisterKeys.Eclipse.AQUFETP>(); if (fetp != null) { var newFetp = this.ConvertToSimON(fetp); solution.Add(newFetp); fetp.Delete(); } // Todo :水体连接数据转换 var aquancon = solution.Find <OPT.Product.SimalorManager.RegisterKeys.Eclipse.AQUANCON>(); if (aquancon != null) { var newFetp = this.ConvertToSimON(aquancon); solution.Add(newFetp); aquancon.Delete(); } #endregion #region - 流体模型 岩石模型- GRAVITY gravity = ecl.Key.Find <GRAVITY>(); if (gravity != null) { // Todo :SimON只解析绝对密度 DENSITY density = this.ConvertTo(gravity, unitType); gravity.ParentKey.Add(density); gravity.Delete(); } List <IRegionInterface> regSoltionKeys = solution.FindAll <IRegionInterface>(); regSoltionKeys.ForEach(l => l.TransToSimONRegion()); simon.Key.Add(solution); // List <IRegionInterface> regPropsKeys = props.FindAll <IRegionInterface>(); regPropsKeys.ForEach(l => l.TransToSimONRegion()); //// Todo :SGWFN 需要特殊转换为 SWGF //SGWFN sgwfn = props.Find<SGWFN>(); //if (sgwfn != null) //{ // //props.AddRange(sgwfn.ConvertTo()); // simon.Key.AddRange<SWGF>(sgwfn.ConvertTo()); //} simon.Key.Add(props); #endregion #region - 初始化模型 - List <EQUIL> equil = solution.FindAll <EQUIL>(); foreach (var item in equil) { EQUILPAR equilpar = new EQUILPAR("EQUILPAR"); EQUIL.Item it = item.GetSingleRegion().GetSingleItem(); equilpar.Szstzdhs0 = it.cksd0; equilpar.Szstljs1 = it.ckyl1; equilpar.Ctstyxhs2 = it.ysjmsd2; equilpar.Ctstyxzdhs3 = it.ysjmcmgyl3.ToDefalt("0"); //equilpar.Jxstzds4 = it.yqjmsd4; equilpar.E100wgzds5 = it.yqjmsd4; equilpar.E300jxstzds6 = it.yqjmcmgyl5; item.ParentKey.Add(equilpar); item.Delete(); } #endregion #region - 生产模型 - WELL well = new WELL("WELL"); // Todo :添加完井数据 (注意要放到生产模型前面) simon.Key.Add(well); // 生产模型 simon.Key.Add(this.ConvertToSimON(schedule, well, ecl.Key.Find <START>().StartTime, simon.HistoryData)); #endregion // Todo :转换修正关键字 List <ModifyKey> modifys = ecl.Key.FindAll <ModifyKey>(); grid.AddRange(modifys); return(simon); }
/// <summary> 用重启信息生成新重启数据(只包含主文件,初始化文件和生产文件) </summary> public SimONData ChangeRestartModel(string mainFilePath, RestartInfoModelSimON model) { // 不读取INCLUDE部分数据 只读取SCHEDLE中INCLUDE SimONData data = FileFactoryService.Instance.ThreadLoadFunc <SimONData>(() => new SimONData(mainFilePath, null, l => l.GetParentKey() is SCHEDULE)); // HTodo :传递输出参数 需要测试 OUTSCHED rptsched = data.Key.Find <OUTSCHED>(); RPTSUM rptsum = data.Key.Find <RPTSUM>(); var incs = data.Key.FindAll <INCLUDE>(); // 设置所有INCLUDE都不生成文件 incs.ForEach(l => l.IsCreateFile = false); // 保存主文件 SOLUTION sl = data.Key.Find <SOLUTION>(); SCHEDULE sc = data.Key.Find <SCHEDULE>(); WELLCTRL well = data.Key.Find <WELLCTRL>(); // 更改起始时间 SOLVECTRL tuning = data.Key.Find <SOLVECTRL>(); // Todo :主文件没有在solotion中找 if (tuning == null) { tuning = sl.Find <SOLVECTRL>(); } tuning.Date = model.RestartTime; model.Solution.Add(tuning); // 替换数据 sl.ExChangeData(model.Solution); sc.ExChangeData(model.Schedule); well.ExChangeData(model.Well); // // 设置保存部分数据 List <INCLUDE> slIncludes = sl.FindAll <INCLUDE>(); slIncludes.ForEach(l => l.IsCreateFile = true); List <INCLUDE> scIncludes = sc.FindAll <INCLUDE>(); scIncludes.ForEach(l => l.IsCreateFile = true); List <INCLUDE> wellIncludes = well.FindAll <INCLUDE>(); wellIncludes.ForEach(l => l.IsCreateFile = true); // 保存主文件(目前没用) //model.MainData = data; if (rptsched != null) { data.Key.Add(rptsched); } if (rptsum != null) { data.Key.Add(rptsum); } //// Todo :插入标识到第二个关键字 //HeBianGu.Product.SimalorManager.RegisterKeys.SimON.STEPRST restart = new HeBianGu.Product.SimalorManager.RegisterKeys.SimON.STEPRST("STEPRST"); //data.Key.InsertKey(1, restart); return(data); }