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); } }
private void Calcular(object sender, EventArgs e) { double Qiny = propiedades.Qiny; double CalVapor = propiedades.CalVapor; double Tiny = propiedades.Tiny; double Test = propiedades.Test; double TProd = propiedades.TProd; double tempVapor = propiedades.tempVapor; double densAgua = propiedades.densAgua; double permRoca = propiedades.permRoca; double densOil = propiedades.densOil; double rPozo = propiedades.rPozo; double espesor = propiedades.espesor; double difTermForm = propiedades.difTermForm; double condTermForm = propiedades.condTermForm; double tempYac = propiedades.tempYac; double tvisc1 = propiedades.tvisc1; double tvisc2 = propiedades.tvisc2; double visc1 = propiedades.visc1; double visc2 = propiedades.visc2; double por = propiedades.por; double Swc = propiedades.Swc; double Sorv = propiedades.Sorv; double Sorw = propiedades.Sorw; double Qmin = propiedades.Qmin; double STLMax = propiedades.STLMax; double area = propiedades.area; double zonas = propiedades.zonas; double Kst = propiedades.Kst; double Hlast = 0; //Inicialización de Hlast //Cálculo de la presión de vapor double Pvap = Math.Pow(tempVapor / 115.95, 4.4543); //Presión de vapor //Cálculo de la densidad del vapor double densVap = Math.Pow(Pvap, 0.9588) / 363.9; //Densidad del vapor //Cálculo de la viscosidad del vapor double visVapor = 0.001 * (0.2 * tempVapor + 82); //Viscosidad del vapor //Cálculo de la viscosidad del crudo a la temperatura de inyección double vistempIny = calcVis(tempVapor, tvisc1, tvisc2, visc1, visc2); //Cálculo del espesor de la zona double Ard = Math.Pow(((350 * 144 * Qiny * visVapor) / (6.328 * Math.PI * (densOil - densVap) * Math.Pow((espesor / zonas), 2) * densVap * Kst)), 0.5); //Factor adimensional de flujo radial double hst = 0.5 * (espesor / zonas) * Ard; //Espesor de la zona de vapor //Cálculo del Radio double pct = 32.5 + ((4.6 * (Math.Pow(por, 0.32)) - 2) * (10 * Swc - 1.5)); //Capacidad calorifica isobarica volumetrica double hwTs = 68 * Math.Pow((tempVapor / 100), 1.24); //Entalpia en superficie double hwTr = 68 * Math.Pow((tempYac / 100), 1.24); //Entalpia en yacimiento double Lvdh = 94 * Math.Pow((705 - tempVapor), 0.38); //Calor latente de vaporización double cw = (hwTs - hwTr) / (tempVapor - tempYac); //Capacidad calorifica del agua double Qi = cw * (tempVapor - tempYac) + (Lvdh * CalVapor); //Tasa de inyección de calor double vsi = ((Qiny * Tiny * densAgua * Qi) - (Hlast)) / (pct * (tempVapor - tempYac)); //Volumen de Vapor Inicial double Rh = Math.Sqrt(vsi / (Math.PI * hst)); //Radio de la zona calentada //Determinacion de una temperatura promedio double Tavg = (tempVapor + tempYac) / 2; ConsolaTB.Text = "\nIniciando cálculos para el modelo de Gontijo & Azis\n"; ConsolaTB.AppendText("\nTemperatura promedio supuesta = " + Tavg); //Determinación de HlastEn double Hlasten = vsi * pct * (Tavg - tempYac); //Cantidad de calor que permanece en el yacimiento //Determinacion de Qmax double hiny = 350 * Qi * Qiny * Tiny; //Caudal total inyectado double qmax = hiny + Hlasten - (Math.PI * Math.Pow(Rh, 2) * condTermForm * (tempVapor - tempYac) * Math.Pow((Test) / (Math.PI * difTermForm), 0.5)); //Representa la cantidad de calor maximo que se le ha dado al yac double densacTy = (densOil - 0.0214 * (tempYac - 60)); //Densidad del aceite a temp de yacimiento double denswaTy = (densAgua - 11 * Math.Log((705 - 60) / (705 - tempYac))); //Densidad del aceite a temp de yacimiento double Mo = (3.065 + 0.00355 * tempYac) * Math.Sqrt(densacTy); //Capacidad calorifica volumetrica del aceite double Mw = (cw * denswaTy); //Capacidad calorifica volumetrica del agua //Caudal de Aceite double rx = Math.Sqrt(Math.Pow(Rh, 2) + espesor); //Radio a traves de la zona de aceite caliente double deltaSo = Sorw - Sorv; //Delta de saturacion de aceite double deltaH = espesor - hst; //Delta de espesor entre altura de vapor y espesor de formación double sent = espesor / rx; //Seno del angulo double deltaphi = deltaH * 32.14 * sent + ((Pvap - 50) / densacTy); //Diferencia de Potencial double Qo = 1.87 * rx * Math.Sqrt((permRoca * por * sent * difTermForm * deltaphi) / (Mo * vistempIny * (Math.Log(rx / rPozo) - 0.5))); double Qw = 1.87 * rx * Math.Sqrt((permRoca * por * deltaSo * difTermForm * deltaphi) / (Mw * 1 * (Math.Log(rx / rPozo) - 0.5))); ConsolaTB.AppendText("\nCaudal de Aceite = " + Qo.ToString("0.000") + " BBL/dia"); ConsolaTB.AppendText("\nCaudal de Agua = " + Qw.ToString("0.000") + " BBL/dia"); //Caudal de calor removido double Qp = 5.615 * (Qw * Mw + Qo * Mo) * (Tavg - tempYac);//Caudal de calor removido por la formacion por la producción de los fluidos //Cálculo de la temperatura promedio double fhd = 0; //Funcion adimensional de la perdida de calor radial double fvd = 0; //Funcion de perdida de calor vertical double fpd = 0; //Energia removida por fluidos produc double tdh = 0; double tdv = 0; for (int i = 0; i <= (Test + Tiny); i++) { tdh = difTermForm * (i - Tiny) / Math.Pow(Rh, 2); fhd = 1 / (1 + 5 * tdh); tdv = 4 * difTermForm * (i - Tiny) / Math.Pow((espesor / zonas), 2); fvd = 1 / Math.Pow(1 + 5 * tdv, 0.5); fpd = (1 / (2 * qmax)) * Qp; } Tavg = tempYac + (tempVapor - tempYac) * (fhd * fvd * (1 - fpd) - fpd); ConsolaTB.AppendText("\nTemperatura promedio final calculada = " + Tavg); }
private void button1_Click(object sender, EventArgs e) { double Qiny = propiedades.Qiny; double CalVapor = propiedades.CalVapor; double Tiny = propiedades.Tiny; double Test = propiedades.Test; double TProd = propiedades.TProd; double tempVapor = propiedades.tempVapor; double hr = propiedades.hr; double Lv = propiedades.Lv; double densAgua = propiedades.densAgua; double calEspAgua = propiedades.calEspAgua; double permRoca = propiedades.permRoca; double densOil = propiedades.densOil; double calEspOil = propiedades.calEspOil; double rDrenaje = propiedades.rDrenaje; double rPozo = propiedades.rPozo; double pwf = propiedades.pwf; double ple = propiedades.ple; double WOR = propiedades.WOR; double espesor = propiedades.espesor; double difTermForm = propiedades.difTermForm; double condTermForm = propiedades.condTermForm; double tempYac = propiedades.tempYac; double numCiclos = propiedades.numCiclos; double capCalRoca = propiedades.capCalRoca; double tvisc1 = propiedades.tvisc1; double tvisc2 = propiedades.tvisc2; double visc1 = propiedades.visc1; double visc2 = propiedades.visc2; //Determinación de la tasa de inyección de calor double Qi = (350.0 / 24.0) * Qiny * ((tempVapor - hr) + (CalVapor * Lv)); //Determinación tiempo adimensional double td = (4 * condTermForm * capCalRoca * (capCalRoca * 24)) / (Math.Pow(capCalRoca, 2) * Math.Pow(espesor, 2)); //Determinacion de la Función de Marx y Langenheim double Fm = (td) / (1 + 0.85 * Math.Pow(td, (0.5))); //Determinación de As a tiempo t double As = (Qi * Tiny * espesor * Fm) / (4 * condTermForm * capCalRoca * (tempVapor - hr)); //Rh Radio de la zona calentada double Rh = Math.Pow(As / Math.PI, 0.5); //Controles de la Iteración double TavgPrev = 0; double TavgActual = 0; double iterCount = 0; double Qo = 0; //Fin de Controles de la iteración while (true) { iterCount++; double Tavg; if (TavgActual == 0) { //Temperatura Promedio Tavg = (tempVapor + tempYac) / 2; } else { //Temperatura Promedio Tavg = TavgActual; } //Viscosidad a Tavg double visAvg = calcVis(Tavg, tvisc1, tvisc2, visc1, visc2); //Viscosidad a TR double visTR = calcVis(tempYac, tvisc1, tvisc2, visc1, visc2); //Tasa en Frío double QoC = (2 * Math.PI * 1.127 * espesor * permRoca * (ple - pwf) / (visTR * Math.Log(rDrenaje / rPozo))); //Tasa en Caliente double QoH = (2 * Math.PI * espesor * permRoca * (ple - pwf)) / (visTR * Math.Log((rDrenaje) / (Rh)) + visAvg * Math.Log((Rh) / (rPozo))); // Espesor Aumentado double Hra = (espesor * td) / (Fm); //X y Y double X = Math.Log10((condTermForm * (Test * 24)) / (capCalRoca * Math.Pow(Rh, 2))); double Y = Math.Log10((4 * condTermForm * (Test * 24)) / (capCalRoca * Math.Pow(Hra, 2))); //Vr y Vz double Vr = 0.180304 - 0.41269 * (X)+0.18217 * Math.Pow(X, 2) + 0.149516 * Math.Pow(X, 3) + 0.024183 * Math.Pow(X, 4); double Vz = 0.474884 - 0.56832 * (Y)-0.239719 * Math.Pow(Y, 2) - 0.035737 * Math.Pow(Y, 3); // Hog double Hog = (5.615 * densOil * calEspOil) * (Tavg - tempYac); //Ps double Ps = Math.Pow((Tavg / 115.1), (1 / 0.225)); //Rs double Rs = 0; if (Ps > pwf) { Rs = 1; } //Hw a Tavg double HwTavg = 1 * (Tavg - 32); //Hra a Tyac double HwTyac = 1 * (tempYac - 32); //Lv a Tavg double LvTavg = 1318 * Math.Pow(Ps, -0.08774); //Hws double Hws = (5.615 * densAgua * (Rs * (HwTavg - HwTyac) + Rs * LvTavg)); //Hf double Hf = (QoH) * (Hog + Hws); //Delta energia double delta = (Hf * 10) / (Math.PI * Math.Pow(Rh, 2) * (Hra) * capCalRoca * (tempVapor - hr) * 2); //Tavg 2 double Tavg2 = tempYac + (tempVapor - hr) * (Vr * Vz * (1 - delta) - delta); TavgActual = Tavg2; TavgPrev = Tavg; double Ea = (Math.Abs(TavgActual - TavgPrev) / TavgPrev); if (Ea < 0.00000000000005 || iterCount > 100) { Qo = QoH; break; } else { ConsolaTB.AppendText("Iteracion " + iterCount + "\n"); ConsolaTB.AppendText("Tavg Anterior " + TavgPrev + "\n"); ConsolaTB.AppendText("Tavg Calculada " + TavgActual + "\n"); ConsolaTB.AppendText("Err. Rel " + Ea + "\n\n"); } } ConsolaTB.AppendText("==========================\n"); ConsolaTB.AppendText("Caudal de Crudo: " + Qo + " BBL/day"); }