Пример #1
0
        /// <summary>
        /// Вычисление давления в самом низу сегмента (можно сказать "забой" сегмента) НКТ по барометрической формуле.
        /// Гриценко стр. 117, 113, 140 (для обводненной скважины).
        /// </summary>
        /// <param name="gasFlow">Газовый поток сегмента трубы</param>
        /// <param name="liquidFlow">Жидкостной поток сегмента трубы</param>
        /// <param name="btmTemperature">Температура внизу сегмента (К)</param>
        /// <returns>Давление на забое НКТ (МПа)</returns>
        public double CalcBottomPressure(GasFlow gasFlow, LiquidFlow liquidFlow, double btmTemperature)
        {
            double mixtureQ = Tubing.CalcMixtureRate(gasFlow, liquidFlow);
            double Ptop     = gasFlow.TopPressure;

            gasFlow.BottomParametersDefinition(Ptop, btmTemperature);

            double orientirS0   = CalcS0Coeff(gasFlow, liquidFlow);
            double orientirTeta = CalcTetaCoeff(gasFlow, liquidFlow, orientirS0);
            double orientirP    = Math.Sqrt(Ptop * Ptop * Math.Exp(2 * orientirS0) + orientirTeta * mixtureQ * mixtureQ);

            gasFlow.BottomParametersDefinition(orientirP, btmTemperature);

            double Pbtm = 0;

            for (int i = 0; i < 3; i++)
            {
                double s0   = CalcS0Coeff(gasFlow, liquidFlow);
                double Teta = CalcTetaCoeff(gasFlow, liquidFlow, s0);
                Pbtm = Math.Sqrt(Ptop * Ptop * Math.Exp(2 * s0) + Teta * mixtureQ * mixtureQ);
                gasFlow.BottomParametersDefinition(Pbtm, btmTemperature);
            }

            return(gasFlow.BottomPressure);
        }
Пример #2
0
        /// <summary>
        /// Вычисление расхода смеси (тыс.м3/сут)
        /// при стандартных условиях T=293K P=0,101325МПа
        /// </summary>
        /// <param name="gasFlow">Газовый поток</param>
        /// <param name="liquidFlow">Жидкостной поток</param>
        /// <returns></returns>
        public static double CalcMixtureRate(GasFlow gasFlow, LiquidFlow liquidFlow)
        {
            double gasQ = gasFlow.RateAtStandardConditions;
            //Расход жидкости (тыс.куб.м/сут)
            double liquidQ = liquidFlow.Rate * 0.001;

            return(gasQ + liquidQ);
        }
Пример #3
0
        /// <summary>
        /// Вычисление истинного газосодержания потока
        /// Гриценка стр. 140
        /// </summary>
        /// <param name="flow">Газовый поток</param>
        /// <param name="liquidRate">Расход жидкости (м3/сут)</param>
        /// <returns></returns>
        public static double CalcTrueFlowGasContent(GasFlow flow, double liquidRate)
        {
            double Qgop = flow.CalcRateAtOperatingConditions();
            //Расход жидкости (тыс.куб.м/сут)
            double Ql  = liquidRate * 0.001;
            double phi = Qgop / (Ql + Qgop);

            return(phi);
        }
Пример #4
0
        /// <summary>
        /// Вычисление параметра, связанного с истинным газосодержанием потока
        /// Гриценко стр. 140
        /// </summary>
        /// <param name="gasFlow">Газовый поток</param>
        /// <param name="liquidRate">Расход жидкости (м3/сут)</param>
        /// <param name="liquidDensity">Плотность жидкости (кг/м3)</param>
        /// <returns>Значение параметра</returns>
        public static double CalcGasContentParameter(GasFlow gasFlow, double liquidRate, double liquidDensity)
        {
            double RHOgop = gasFlow.CalcDensityAtOperatingConditions();
            double RHOl   = liquidDensity;
            double phi    = CalcTrueFlowGasContent(gasFlow, liquidRate);
            double gasContentParameter = phi + (1 - phi) * RHOl / RHOgop;

            return(gasContentParameter);
        }
Пример #5
0
        /// <summary>
        /// Вычисление коэффициента s для сухой скважины
        /// Гриценко стр. 117
        /// </summary>
        /// <param name="flow">Поток</param>
        /// <returns>Значение коэффициента s</returns>
        private double CalcSCoeff(GasFlow flow)
        {
            double rho = flow.RelativeDensity;
            double L   = Depth;
            double Z   = flow.SupercompressibilityFactor;
            double T   = flow.AvgTemperature;
            double s   = (0.0683 * rho * L / (Z * T)) / 2;

            return(s);
        }
Пример #6
0
        /// <summary>
        /// Вычисление коэффициента s0 для обводнённой скважины
        /// Гриценко стр. 140
        /// </summary>
        /// <param name="gasFlow">Поток</param>
        /// <returns>Значение коэффициента s0</returns>
        private double CalcS0Coeff(GasFlow gasFlow, LiquidFlow liquidFlow)
        {
            double rho = gasFlow.RelativeDensity;
            double L   = Depth;
            double Z   = gasFlow.SupercompressibilityFactor;
            double T   = gasFlow.AvgTemperature;
            double gasContentParametr = Tubing.CalcGasContentParameter(gasFlow, liquidFlow.Rate, liquidFlow.Density);
            double s0 = 0.03415 * gasContentParametr * rho * L / (Z * T);

            return(s0);
        }
Пример #7
0
        /// <summary>
        /// Вычисление коэффициента гидравлического сопротивления трубы (безразмерная)
        /// Гриценко стр. 118
        /// </summary>
        /// <param name="flow">Поток, проходящий по трубе</param>
        /// <returns>Значение коэффициента гидравлического сопротивления трубы (безразмерная)</returns>
        public double CalcHydraulicResistance(GasFlow flow)
        {
            double Re  = CalcReynoldsNumber(flow);
            double eps = RelativeRoughness;

            double m            = 2.0;  // для труб газовой промышленности
            double denominator  = m * m * Math.Log10(Math.Pow(6.81 / Re, 1.8 / m) + Math.Pow(7.41 / eps, 2 / m));
            double HydraulicRes = 1.0 / denominator;

            return(HydraulicRes);
        }
Пример #8
0
        /// <summary>
        /// Вычисление коэффициента Рейнольдса (безразмерная)
        /// Гриценко стр. 120
        /// </summary>
        /// <param name="flow">Поток, проходящий по трубе</param>
        /// <returns>Значение коэффициента Рейнольдса (безразмерная)</returns>
        private double CalcReynoldsNumber(GasFlow flow)
        {
            double K   = 1777;
            double Q   = flow.RateAtStandardConditions;
            double Rho = flow.RelativeDensity;
            //Динамическая вязкость (мПа*с)
            double Nu = flow.DynamicViscosity;
            //Внутренний диаметр (м*10^-2)
            double D  = Diameter * 100;
            double Re = K * Q * Rho / (D * Nu);

            return(Re);
        }
Пример #9
0
        /// <summary>
        /// Вычисление Тета коэффициента (сухая скважина)
        /// Гриценко стр. 117
        /// </summary>
        /// <param name="flow">Поток протекающий по трубе</param>
        /// <param name="pipe">Труба</param>
        /// <returns>Значение Тета коэффициента</returns>
        public double CalcTetaCoeff(GasFlow flow, double sCoeff = 0)
        {
            double Z = flow.SupercompressibilityFactor;
            double T = flow.AvgTemperature;
            double D = Diameter;
            double s = sCoeff;

            if (sCoeff == 0)
            {
                s = CalcSCoeff(flow);
            }
            double lambda = CalcHydraulicResistance(flow);
            double Teta   = 0.01413 * Math.Pow(10, -10) * Z * Z * T * T * (Math.Exp(2 * s) - 1) * lambda
                            / Math.Pow(D, 5);

            return(Teta);
        }
Пример #10
0
        /// <summary>
        /// Вычисление Тета коэффициента (обводненнная скважина)
        /// Гриценко стр. 141
        /// </summary>
        /// <param name="gasFlow">Поток протекающий по трубе</param>
        /// <param name="pipe">Труба</param>
        /// <returns>Значение Тета коэффициента</returns>
        public double CalcTetaCoeff(GasFlow gasFlow, LiquidFlow liquidFlow, double s0Coeff = 0)
        {
            double Z  = gasFlow.SupercompressibilityFactor;
            double T  = gasFlow.AvgTemperature;
            double D  = Diameter;
            double s0 = s0Coeff;

            if (s0Coeff == 0)
            {
                s0 = CalcS0Coeff(gasFlow, liquidFlow);
            }
            double lambda             = CalcHydraulicResistance(gasFlow);
            double gasContentParametr = Tubing.CalcGasContentParameter(gasFlow, liquidFlow.Rate, liquidFlow.Density);
            double Teta = 0.01413 * Math.Pow(10, -10) * Z * Z * T * T * (Math.Exp(2 * s0) - 1) * lambda
                          / (gasContentParametr * Math.Pow(D, 5));

            return(Teta);
        }
Пример #11
0
        /// <summary>
        /// Вычисление давления в самом низу сегмента (можно сказать "забой" сегмента) НКТ
        /// остановленной скважины по барометрической формуле.
        /// Гриценко стр. 117 и 113 (для сухой скважины).
        /// </summary>
        /// <param name="gasFlow">Поток сегмента НКТ</param>
        /// <param name="bottomTemperature">Температура внизу сегмента (К)</param>
        /// <returns>Давление на забое НКТ (МПа)</returns>
        public void CalcStaticBottomPressure(GasFlow gasFlow, double bottomTemperature)
        {
            double Ptop = gasFlow.TopPressure;

            gasFlow.BottomParametersDefinition(Ptop, bottomTemperature);

            double orientirS = CalcSCoeff(gasFlow);
            double orientirP = Ptop * Math.Exp(orientirS);

            gasFlow.BottomParametersDefinition(orientirP, bottomTemperature);

            double Pbtm = 0;

            for (int i = 0; i < 3; i++)
            {
                double s = CalcSCoeff(gasFlow);
                Pbtm = Ptop * Math.Exp(s);
                gasFlow.BottomParametersDefinition(Pbtm, bottomTemperature);
            }
        }
Пример #12
0
        /// <summary>
        /// Вычисление давления в самом верху сегмента (можно сказать "устье" сегмента) НКТ
        /// остановленной скважины по барометрической формуле.
        /// Гриценко стр. 117 и 113 (для сухой скважины).
        /// </summary>
        /// <param name="gasFlow">Поток сегмента НКТ</param>
        /// <param name="topTemperature">Температура внизу сегмента (К)</param>
        /// <returns>Давление на забое НКТ (МПа)</returns>
        public void CalcStaticTopPressure(GasFlow gasFlow, double topTemperature)
        {
            double Q    = gasFlow.RateAtStandardConditions;
            double Pbtm = gasFlow.BottomPressure;

            gasFlow.TopParametersDefinition(Pbtm, topTemperature);

            double orientirS = CalcSCoeff(gasFlow);
            double orientirP = Pbtm / Math.Exp(orientirS);

            gasFlow.TopParametersDefinition(orientirP, topTemperature);

            double Ptop = 0;

            for (int i = 0; i < 3; i++)
            {
                double s = CalcSCoeff(gasFlow);
                Ptop = Pbtm / Math.Exp(s);
                gasFlow.TopParametersDefinition(Ptop, topTemperature);
            }
        }
Пример #13
0
        /// <summary>
        /// Вычисление давления в самом низу сегмента (можно сказать "забой" сегмента) НКТ по барометрической формуле.
        /// Гриценко стр. 117 и 113 (для сухой скважины).
        /// </summary>
        /// <param name="gasFlow">Поток сегмента НКТ</param>
        /// <param name="btmTemperature">Температура внизу сегмента (К)</param>
        /// <returns>Давление на забое НКТ (МПа)</returns>
        public void CalcPipePressure(GasFlow gasFlow, double btmTemperature)
        {
            double Q    = gasFlow.RateAtStandardConditions;
            double Ptop = gasFlow.TopPressure;

            gasFlow.BottomParametersDefinition(Ptop, btmTemperature);

            double orientirS    = CalcSCoeff(gasFlow);
            double orientirTeta = CalcTetaCoeff(gasFlow, orientirS);
            double orientirP    = Math.Sqrt(Ptop * Ptop * Math.Exp(2 * orientirS) + orientirTeta * Q * Q);

            gasFlow.BottomParametersDefinition(orientirP, btmTemperature);

            double Pbtm = 0;

            for (int i = 0; i < 3; i++)
            {
                double s    = CalcSCoeff(gasFlow);
                double Teta = CalcTetaCoeff(gasFlow, s);
                Pbtm = Math.Sqrt(Ptop * Ptop * Math.Exp(2 * s) + Teta * Q * Q);
                gasFlow.BottomParametersDefinition(Pbtm, btmTemperature);
            }
        }
Пример #14
0
        /// <summary>
        /// Вычисление забойного давления НКТ по барометрической формуле (МПа)
        /// Гриценко стр. 117 и 113 (для сухой скважины)
        /// </summary>
        /// <param name="topFlow">Поток в самом верхнем сегменте НКТ</param>
        /// <param name="bottomholeTemperature">Температура на забое НКТ (K)</param>
        /// <returns>Давление на забое НКТ (МПа)</returns>
        public double CalcBottomholePressure(GasFlow topFlow, double bottomholeTemperature)
        {
            SegmentFlows.Clear();

            double length = Length / NumberOfSegments;
            double depth  = length;
            Pipe   pipe   = new Pipe(PipeDiameter, length, depth, PipeRoughness);

            double  dT      = (bottomholeTemperature - topFlow.TopTemperature) / NumberOfSegments;
            GasFlow gasFlow = topFlow;

            for (int i = 0; i < NumberOfSegments; i++)
            {
                double btmTemp = gasFlow.TopTemperature + dT;
                pipe.CalcPipePressure(gasFlow, btmTemp);

                SegmentFlows.Add(gasFlow);

                gasFlow = gasFlow.GenerateBottomFlow();
            }

            return(SegmentFlows.Last().BottomPressure);
        }
Пример #15
0
        /// <summary>
        /// Вычисление устьевого давления НКТ остановленной скважины по барометрической формуле (МПа)
        /// Гриценко стр. 117 и 113 (для сухой скважины)
        /// </summary>
        /// <param name="bottomFlow">Поток в самом нижнем сегменте НКТ</param>
        /// <param name="wellheadTemperature">Температура на забое НКТ (K)</param>
        /// <returns>Давление на забое НКТ (МПа)</returns>
        public double CalcStaticWellheadPressure(GasFlow bottomFlow, double wellheadTemperature)
        {
            SegmentFlows.Clear();

            double length = Length / NumberOfSegments;
            double depth  = length;
            Pipe   pipe   = new Pipe(PipeDiameter, length, depth, PipeRoughness);

            double  dT      = (wellheadTemperature - bottomFlow.BottomTemperature) / NumberOfSegments;
            GasFlow gasFlow = bottomFlow;

            for (int i = 0; i < NumberOfSegments; i++)
            {
                double topTemp = gasFlow.BottomTemperature + dT;
                pipe.CalcStaticTopPressure(gasFlow, topTemp);

                SegmentFlows.Add(gasFlow);

                gasFlow = gasFlow.GenerateTopFlow();
            }

            return(SegmentFlows.Last().TopPressure);
        }