| | |
| | | private List<COModelTable> _models; |
| | | private Dictionary<string, string> _filters; |
| | | private COModelTable _model; |
| | | private ReportModel _reportModel; |
| | | |
| | | public FrmMain() |
| | | { |
| | |
| | | }); |
| | | } |
| | | } |
| | | |
| | | private void btnAnalysis_Click(object sender, EventArgs e) |
| | | { |
| | | var curModels = GetFilterResult(); |
| | |
| | | return; |
| | | } |
| | | |
| | | if (!decimal.TryParse(nudOilDensity.Value.ToString(), out decimal oilDensity) || nudOilDensity.Value <= 0) |
| | | { |
| | | MessageBox.Show("Please select a oil density"); |
| | | return; |
| | | } |
| | | |
| | | if (curModels.Count == 1) |
| | | _model = curModels[0]; |
| | | _model = curModels.FirstOrDefault(m => m.GravelFillPercent == nudGravelFIllPercent.Value.ToString()); |
| | | |
| | | _model = curModels.FirstOrDefault(m => m.GravelFillPercent == nudGravelFIllPercent.Value.ToString() && m.OilDensity == oilDensity); |
| | | |
| | | if (_model == null) |
| | | _model = curModels.First(); |
| | | |
| | | nudOilDensity.Value = _model.OilDensity.Value; |
| | | nudGravelFIllPercent.Value = Convert.ToDecimal(_model.GravelFillPercent); |
| | | |
| | | if (cmbTargetLoggingIntervalUnit.Text == "ft") |
| | | targetLoggingInterval = UnitConvert.Ft2M(targetLoggingInterval); |
| | |
| | | Plot(result); |
| | | |
| | | double totalTime = Math.Round((targetLoggingInterval / calcSpeed / 60), 2); |
| | | txtAnalysisResult.Text = $"A total of {result.ErrorRatios.Count} passes are recommended to maintain a {Math.Round(result.ErrorRatios.Min(r => r.ErrorRatioValue) * 100, 2)}% error rate. With the tool operating at {speed} {cmbSpeedUnit.Text}, the estimated total job duration is {totalTime.ToString()} hours."; |
| | | var errorRate = Math.Round(result.ErrorRatios.Min(r => r.ErrorRatioValue) * 100, 2); |
| | | txtAnalysisResult.Text = $"A total of {result.ErrorRatios.Count} passes are recommended to maintain a {errorRate}% error rate. With the tool operating at {speed} {cmbSpeedUnit.Text}, the estimated total job duration is {totalTime.ToString()} hours."; |
| | | _reportModel = CreateReportModel(totalTime.ToString(), result.ErrorRatios.Count.ToString(), Math.Round(UnitConvert.MMin2FtHr(calcSpeed), 2).ToString(), errorRate.ToString()); |
| | | } |
| | | else |
| | | { |
| | |
| | | Plot(result); |
| | | |
| | | double totalTime = Math.Round((targetLoggingInterval / speed / 60), 2); |
| | | txtAnalysisResult.Text = $"A total of {result.ErrorRatios.Count} passes are recommended to maintain a {Math.Round(result.ErrorRatios.Min(r => r.ErrorRatioValue) * 100, 2)}% error rate. With the tool operating at {Math.Round(UnitConvert.MMin2FtHr(speed), 2)} ft/hr, the estimated total job duration is {totalTime.ToString()} hours."; |
| | | var errorRate = Math.Round(result.ErrorRatios.Min(r => r.ErrorRatioValue) * 100, 2); |
| | | var speedFr = Math.Round(UnitConvert.MMin2FtHr(speed), 2); |
| | | |
| | | txtAnalysisResult.Text = $"A total of {result.ErrorRatios.Count} passes are recommended to maintain a {errorRate}% error rate. With the tool operating at {speedFr} ft/hr, the estimated total job duration is {totalTime.ToString()} hours."; |
| | | |
| | | _reportModel = CreateReportModel(totalTime.ToString(), result.ErrorRatios.Count.ToString(), speedFr.ToString(), errorRate.ToString()); |
| | | } |
| | | |
| | | |
| | | } |
| | | private void btnReport_Click(object sender, EventArgs e) |
| | | { |
| | | new Report(_reportModel).ShowDialog(); |
| | | } |
| | | #endregion |
| | | |
| | |
| | | cmb.Text = currentItems[0]; |
| | | |
| | | } |
| | | |
| | | holdCmbInit(); |
| | | LinkageModelProperty(); |
| | | } |
| | | private void LinkageModelProperty() |
| | | private void holdCmbInit() |
| | | { |
| | | cmbCasingHoldUp.Items.Clear(); |
| | | _filters.Remove("CasingFluid"); |
| | |
| | | _filters.Remove("TubeFluid"); |
| | | cmbLithology.Items.Clear(); |
| | | _filters.Remove("Lithology"); |
| | | |
| | | var curModels = GetFilterResult(); |
| | | if (curModels.Count == 0) |
| | | return; |
| | | |
| | | var gravelFills = curModels.Select(x => x.GravelFillPercent).Distinct().ToArray(); |
| | | if (gravelFills.Length == 1) |
| | | nudGravelFIllPercent.Value = Convert.ToDecimal(gravelFills[0]); |
| | | |
| | | var cementBonds = curModels.Select(x => x.CementBond).Distinct().ToArray(); |
| | | if (cementBonds.Length == 1) |
| | | nudCementBond.Value = Convert.ToDecimal(cementBonds[0]); |
| | | |
| | | var bhSalinities = curModels.Select(x => x.BHSalinity).Distinct().ToArray(); |
| | | if (bhSalinities.Length == 1) |
| | | nudBHSalinity.Value = Convert.ToDecimal(bhSalinities[0]); |
| | | |
| | | var oilDensities = curModels.Select(x => x.OilDensity).Distinct().ToArray(); |
| | | if (oilDensities.Length == 1) |
| | | nudOilDensity.Value = Convert.ToDecimal(oilDensities[0]); |
| | | |
| | | var reservoirSalinities = curModels.Select(x => x.ReservoirSalinity).Distinct().ToArray(); |
| | | if (reservoirSalinities.Length == 1) |
| | | nudReservoirSalinity.Value = Convert.ToDecimal(reservoirSalinities[0]); |
| | | |
| | | var vshs = curModels.Select(x => x.VSH).Distinct().ToArray(); |
| | | if (vshs.Length == 1) |
| | | nudVSH.Value = Convert.ToDecimal(vshs[0]); |
| | | |
| | | |
| | | var casingFulids = curModels.Select(x => x.CasingFluid == "0" ? "water" : x.CasingFluid == "100" ? "oil" : x.CasingFluid == "200" ? "gas" : "none").Distinct().ToArray(); |
| | | |
| | |
| | | nudTubeHoldUp.Enabled = true; |
| | | cmbTubeHoldUp.Items.AddRange(tubeFluids); |
| | | } |
| | | } |
| | | private void LinkageModelProperty() |
| | | { |
| | | var curLithology = cmbLithology.Text; |
| | | cmbLithology.Items.Clear(); |
| | | _filters.Remove("Lithology"); |
| | | |
| | | var curModels = GetFilterResult(); |
| | | if (curModels.Count == 0) |
| | | return; |
| | | |
| | | var gravelFills = curModels.Select(x => x.GravelFillPercent).Distinct().ToArray(); |
| | | if (gravelFills.Length == 1) |
| | | nudGravelFIllPercent.Value = Convert.ToDecimal(gravelFills[0]); |
| | | |
| | | var cementBonds = curModels.Select(x => x.CementBond).Distinct().ToArray(); |
| | | if (cementBonds.Length == 1) |
| | | nudCementBond.Value = Convert.ToDecimal(cementBonds[0]); |
| | | |
| | | var bhSalinities = curModels.Select(x => x.BHSalinity).Distinct().ToArray(); |
| | | if (bhSalinities.Length == 1) |
| | | nudBHSalinity.Value = Convert.ToDecimal(bhSalinities[0]); |
| | | |
| | | var oilDensities = curModels.Select(x => x.OilDensity).Distinct().ToArray(); |
| | | if (oilDensities.Length == 1) |
| | | nudOilDensity.Value = Convert.ToDecimal(oilDensities[0]); |
| | | |
| | | var reservoirSalinities = curModels.Select(x => x.ReservoirSalinity).Distinct().ToArray(); |
| | | if (reservoirSalinities.Length == 1) |
| | | nudReservoirSalinity.Value = Convert.ToDecimal(reservoirSalinities[0]); |
| | | |
| | | var vshs = curModels.Select(x => x.VSH).Distinct().ToArray(); |
| | | if (vshs.Length == 1) |
| | | nudVSH.Value = Convert.ToDecimal(vshs[0]); |
| | | |
| | | var lithology = curModels.Select(x => x.Lithology).Distinct().ToArray(); |
| | | var curLithology = cmbLithology.Text; |
| | | cmbLithology.Items.AddRange(lithology); |
| | | cmbLithology.Text = curLithology; |
| | | if (cmbLithology.Items.Contains(curLithology)) |
| | | cmbLithology.Text = curLithology; |
| | | |
| | | if (lithology.Length == 1) |
| | | cmbLithology.SelectedIndex = 0; |
| | |
| | | } |
| | | |
| | | } |
| | | LinkageModelProperty(); |
| | | //foreach (var cmb in allCmb) |
| | | //{ |
| | | // if (cmb.Name != control.Name) |
| | |
| | | |
| | | // } |
| | | //} |
| | | |
| | | var lithology = curModels.Select(x => x.Lithology).Distinct().ToArray(); |
| | | cmbLithology.Items.Clear(); |
| | | cmbLithology.Items.AddRange(lithology); |
| | | |
| | | if (_filters.ContainsKey("Lithology") && lithology.Contains(_filters["Lithology"])) |
| | | cmbLithology.Text = _filters["Lithology"]; |
| | | else |
| | | _filters.Remove("Lithology"); |
| | | } |
| | | private void cmbLithology_SelectedIndexChanged(object sender, EventArgs e) |
| | | { |
| | |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | private List<COModelTable> GetFilterResult() |
| | | { |
| | | var type = typeof(COModelTable); |
| | |
| | | |
| | | return result; |
| | | } |
| | | |
| | | private void Plot(ErrorRatioResult errorResult) |
| | | { |
| | | pnlCOPic.Controls.Clear(); |
| | |
| | | plotView.Dock = DockStyle.Fill; |
| | | pnlErrorRatioPic.Controls.Add(plotView); |
| | | } |
| | | |
| | | private ReportModel CreateReportModel(string duration, string pass, string speed, string soPrecision) |
| | | { |
| | | return new ReportModel |
| | | { |
| | | BHSalinity = nudBHSalinity.Value.ToString(), |
| | | BIT = cmbBit.Text, |
| | | CasingFluid = cmbCasingHoldUp.Text, |
| | | CasingHoldUp = nudCasingHoldUp.Value.ToString(), |
| | | CasingID = cmbCasingID.Text, |
| | | CasingOD = cmbCasingOD.Text, |
| | | CementBond = nudCementBond.Text, |
| | | DepthAveraging = nudDepth.Value.ToString(), |
| | | Duration = duration, |
| | | GasSalinity = nudGasDensity.Value.ToString(), |
| | | GravelFillPercent = nudGravelFIllPercent.Value.ToString(), |
| | | Lithology = cmbLithology.Text, |
| | | OilSalinity = nudOilDensity.Value.ToString(), |
| | | Pass = pass, |
| | | Porosity = nudPorosity.Value.ToString(), |
| | | ReserviorSalinity = nudReservoirSalinity.Value.ToString(), |
| | | ScreenFluid = cmbScreenHoldUp.Text, |
| | | ScreenHoldUp = nudScreenHoldUp.Value.ToString(), |
| | | ScreenID = cmbScreenID.Text, |
| | | ScreenOD = cmbScreenOD.Text, |
| | | SoPrecisionRequired = soPrecision, |
| | | Speed = speed, |
| | | TargetLoggingInterval = nudTargetLoggingInterval.Value.ToString(), |
| | | TubeFluid = cmbTubeHoldUp.Text, |
| | | TubeHoldUp = nudTubeHoldUp.Value.ToString(), |
| | | TubeID = cmbTubeID.Text, |
| | | TubeOD = cmbTubeOD.Text, |
| | | VSH = nudVSH.Value.ToString(), |
| | | WaterSaturation = nudSw.Value.ToString() |
| | | }; |
| | | } |
| | | |
| | | |
| | | } |
| | | } |