Example #1
0
        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);
            }
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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);
        }
Example #4
0
        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");
        }