コード例 #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);
            }
        }
コード例 #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);
            }
        }