private void button1_Click(object sender, EventArgs e) { var watch = System.Diagnostics.Stopwatch.StartNew(); ConsolaTB.Text = "\nIniciando cálculos para el modelo de Marx & Langhenheim\n"; progressBar1.Value = 0; double capCalForm; double Sw = 1 - propiedades.SatOil; if (!propiedades.Calculo) { capCalForm = propiedades.capCalRoca; ConsolaTB.AppendText("\nCapacidad Calorífica de la Formación = " + capCalForm.ToString("F5") + " BTU/ft3-°F"); } else { double densidadCrudo = propiedades.SGOil * 62.4; double calEspCrudo = 0.388 + (0.00045 * propiedades.tempYac) / Math.Pow(propiedades.SGOil, 0.5); ConsolaTB.AppendText("\nLa capacidad calorífica será calculada\n"); ConsolaTB.AppendText("\nCalor específico del crudo = " + calEspCrudo.ToString("F5")); capCalForm = (1 - propiedades.por) * propiedades.densRoca * propiedades.calEspRoca + propiedades.por * (densidadCrudo * calEspCrudo * propiedades.SatOil + propiedades.densAgua * propiedades.calEspAgua * (Sw)); ConsolaTB.AppendText("\nCap Calorífica Formación = " + capCalForm.ToString("F5") + " BTU/ft3-°F"); } progressBar1.Value = 10; double Qi = (350.0 / 24.0) * propiedades.Qiny * ((propiedades.hw - propiedades.hr) + propiedades.CalVapor * propiedades.Lv); //Tasa de inyección de calor ConsolaTB.AppendText("\nTasa de Inyección de Calor = " + Qi.ToString("F3") + " BTU/día\n"); DataTable caudales = OfficeHandler.createTable("Tiempo", "Caudal"); progressBar1.Value = 15; ConsolaTB.AppendText("\nCalculando tasas de flujo: "); for (int i = 1; i < propiedades.Tiny; i++) { int t = i * 24; double X = ((2 * propiedades.condTermForm) / (capCalForm * propiedades.espesor * Math.Pow(propiedades.difTermForm, 0.5))) * Math.Pow(t, 0.5); double error = MN.AdvancedMath.Erfc(X); double q0 = 4.274 * (Qi * propiedades.por * (propiedades.SatOil - propiedades.sor) * error) / (capCalForm * (propiedades.tempVapor - propiedades.tempYac)); ConsolaTB.AppendText("\nT=" + t + " horas \t Q=" + q0.ToString("F3") + " BBL/dia"); caudales.Rows.Add(t, q0); } progressBar1.Value = 80; double Acumulado = 0; foreach (DataRow row in caudales.Rows) { Acumulado = Acumulado + Double.Parse(row["Caudal"].ToString()); } watch.Stop(); double elapsedMs = watch.ElapsedMilliseconds; ConsolaTB.AppendText("\n\nCálculos finalizados. \nTiempo total = " + propiedades.Tiny.ToString("F2") + " días\nAcumulado= " + Acumulado.ToString("F3") + " Barriles \nTiempo de calculo=" + elapsedMs / 1000 + " segundos"); progressBar1.Value = 100; if (MessageBox.Show("Cálculos finalizados, ¿ Desea exportar a excel los resultados ?", "Cálculos finalizados", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes) { OfficeHandler.exportExcel(caudales); } }
private void button1_Click(object sender, EventArgs e) { var watch = System.Diagnostics.Stopwatch.StartNew(); ConsolaTB.Text = "\nIniciando cálculos para el modelo de Mandl & Volek\n"; progressBar1.Value = 0; double Qiny, hw, hr, CalVapor, Lv, por, densRoca, SGOil, calEspRoca, SatOil, Sw, densAgua, calEspAgua, espesor, difTermForm, condTermForm, tempVapor, tempYac, sor, Tiny; Qiny = propiedades.Qiny; hw = propiedades.hw; hr = propiedades.hr; CalVapor = propiedades.CalVapor; Lv = propiedades.Lv; por = propiedades.por; densRoca = propiedades.densRoca; SGOil = propiedades.SGOil; calEspRoca = propiedades.calEspRoca; SatOil = propiedades.SatOil; densAgua = propiedades.densAgua; calEspAgua = propiedades.calEspAgua; espesor = propiedades.espesor; difTermForm = propiedades.difTermForm; condTermForm = propiedades.condTermForm; tempVapor = propiedades.tempVapor; tempYac = propiedades.tempYac; sor = propiedades.sor; Tiny = propiedades.Tiny; Sw = 1 - SatOil; bool Calculo = propiedades.Calculo; double capCalForm; if (!Calculo) { capCalForm = propiedades.capCalRoca; ConsolaTB.AppendText("\nCapacidad Calorífica de la Formación = " + capCalForm.ToString("F5") + " BTU/ft3-°F"); } else { double densidadCrudo = SGOil * 62.4; double calEspCrudo = 0.388 + (0.00045 * tempYac) / Math.Pow(propiedades.SGOil, 0.5); ConsolaTB.AppendText("\nLa capacidad calorífica será calculada\n"); ConsolaTB.AppendText("\nCalor específico del crudo = " + calEspCrudo.ToString("F5")); capCalForm = (1 - por) * densRoca * calEspRoca + por * (densidadCrudo * calEspCrudo * SatOil + densAgua * calEspAgua * (Sw)); ConsolaTB.AppendText("\nCap Calorífica Formación = " + capCalForm.ToString("F5") + " BTU/ft3-°F"); } beta = Math.Pow(1 + (Lv * CalVapor / (calEspAgua * (tempVapor - tempYac))), -1); ConsolaTB.AppendText("\nParámetro Mandi & Volek= " + beta.ToString("F3")); MN.Interval inter = MN.Interval.FromEndpoints(0, 1); double xi = MN.Analysis.FunctionMath.FindZero(errorComp, inter); string erp = (100 * (MN.Functions.AdvancedMath.Erfc(xi) - beta) / MN.Functions.AdvancedMath.Erfc(xi)).ToString("F5"); ConsolaTB.AppendText("\n% Error Xiterado vs Parámetro Mandi & Volek = " + erp); double tc = Math.Pow((xi * capCalForm * espesor * Math.Pow(difTermForm, 0.5)) / (2 * condTermForm), 2); ConsolaTB.AppendText("\nTiempo critico = " + tc.ToString("F3") + " horas"); double Qi = (350.0 / 24.0) * Qiny * ((hw - hr) + CalVapor * Lv); //Tasa de inyección de calor ConsolaTB.AppendText("\nTasa de Inyección de Calor = " + Qi.ToString("F3") + " BTU/día\n"); progressBar1.Value = 20; /* Comienzo de la corrida de calculos */ DataTable caudales = OfficeHandler.createTable("Tiempo", "Caudal"); double tiempo = 0; /*Calculo con Marx y Langhenheim */ ConsolaTB.AppendText("\nCalculando tasas de flujo en región menor a Tc con Marx & Langhenheim:\n\n"); while (tiempo < tc && tiempo < (Tiny * 24)) { tiempo = tiempo + 24; double X = ((2 * propiedades.condTermForm) / (capCalForm * propiedades.espesor * Math.Pow(propiedades.difTermForm, 0.5))) * Math.Pow(tiempo, 0.5); double error = MN.Functions.AdvancedMath.Erfc(X); double q0 = 4.274 * (Qi * propiedades.por * (propiedades.SatOil - propiedades.sor) * error) / (capCalForm * (propiedades.tempVapor - propiedades.tempYac)); ConsolaTB.AppendText("\nT=" + tiempo + " horas \t Q=" + q0.ToString("F3") + " BBL/dia"); caudales.Rows.Add(tiempo, q0); } progressBar1.Value = 70; if (tiempo <= Tiny * 24) { ConsolaTB.AppendText("\n\nCalculando tasas de flujo en región mayor a Tc con Mandl & Volek: "); } while (tiempo <= Tiny * 24) { tiempo = tiempo + 24; double X = ((2 * propiedades.condTermForm) / (capCalForm * propiedades.espesor * Math.Pow(propiedades.difTermForm, 0.5))) * Math.Pow(tiempo, 0.5); double error = MN.Functions.AdvancedMath.Erfc(X); double t1 = 4.274 * (Qi * propiedades.por * (propiedades.SatOil - propiedades.sor)) / (capCalForm * (propiedades.tempVapor - propiedades.tempYac)); double xdiff = Math.Pow(X, 2) - Math.Pow(MN.Functions.AdvancedMath.Erfc(xi), 2); double t2 = (1 - ((xdiff - 2) * Math.Pow(xdiff, 0.5) / (3 * Math.Pow(Math.PI, 0.5))) - ((xdiff - 3) / (6 * Math.Pow(Math.PI * xdiff, 0.5)))) * error; double t3 = ((1 / (3 * Math.PI)) * (xdiff - 2 + (Math.Pow(MN.Functions.AdvancedMath.Erfc(xi), 2) / 2 * Math.Pow(X, 2))) * Math.Pow(xdiff / X, 0.5)) - (beta / (2 * Math.Pow(Math.PI * xdiff, 0.5))); double q0 = t1 * (t2 + t3); ConsolaTB.AppendText("\nT=" + tiempo + " horas \t Q=" + q0.ToString("F3") + " BBL/dia"); caudales.Rows.Add(tiempo, q0); } progressBar1.Value = 95; double Acumulado = 0; foreach (DataRow row in caudales.Rows) { Acumulado = Acumulado + Double.Parse(row["Caudal"].ToString()); } watch.Stop(); double elapsedMs = watch.ElapsedMilliseconds; ConsolaTB.AppendText("\n\nCálculos finalizados. \nTiempo total = " + propiedades.Tiny.ToString("F2") + " días\nAcumulado= " + Acumulado.ToString("F3") + " Barriles \nTiempo de calculo=" + elapsedMs / 1000 + " segundos"); progressBar1.Value = 100; if (MessageBox.Show("Cálculos finalizados, ¿ Desea exportar a excel los resultados ?", "Cálculos finalizados", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes) { OfficeHandler.exportExcel(caudales); } }