Ejemplo n.º 1
0
        /// <summary>
        /// Функция моделирования работы обводненной скважины с погружным насосом, возвращает дебит газа (тыс.м3/сут)
        /// </summary>
        /// <param name="eps">Точность с которой будет расчитываться забойное давление (безразмерная)</param>
        /// <param name="dynamicH">Динамический уровень пластовой жидкости, отсчитывается от входа в насос (м)</param>
        /// <param name="bottomHolePressure">Забойное давление (МПа)</param>
        /// <param name="waterRate">Расход жидкости (м3/сут)</param>
        /// <param name="nglRate">Дебит газового конденсата (т/сут)</param>
        /// <returns>Дебит газа в стандартных условиях (тыс.куб.м/сут)</returns>
        public double ModelingPump(double eps, double dynamicH, out double bottomHolePressure, out double waterRate, out double nglRate)
        {
            //Скважина делится на 3 части:
            //topPartWell - часть затрубного пространства, выше динамического уровня
            //bottomPartWell - часть затрубного пространства, ниже динамического уровня
            //innerPartWell - НКТ
            double topPartLength       = Tubing.Length - dynamicH;
            double dynamicHTemperature = BottomholeTemperature + (WellheadTemperature - BottomholeTemperature) * (dynamicH / Tubing.Length);


            AnnularTubing = new Tubing(Tubing);
            AnnularTubing.TubingDiameter = Tubing.CalcEquivalentAnnularDiameter();

            //Для затрубного пространства свободного от жидкости создаем эквивалент сухой скважины
            DryWell topPartWell = new DryWell(this);

            topPartWell.Tubing             = AnnularTubing;
            topPartWell.BottomholePressure = dynamicHTemperature;


            double Ph;             //давление в точке динамического уровня
            double gasQ = topPartWell.Modeling(eps, out Ph, out nglRate);

            bottomHolePressure = Ph + WaterFluid.CalcColumnPressure(dynamicH);
            //Давление для притока воды берется как давление на середине динамического уровня
            double waterPress = Ph + WaterFluid.CalcColumnPressure(dynamicH / 2);

            waterRate = Layer.CalcWaterRate(bottomHolePressure);

            return(gasQ);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Функция высчитывания забойного давления остановленной скважины по затрубному давлению (МПа)
        /// </summary>
        public double CalcStaticBottomholePressureByAnnularTubing(double annularWellheadPressure)
        {
            AnnularTubing = new Tubing(Tubing);
            AnnularTubing.TubingDiameter = Tubing.CalcEquivalentAnnularDiameter();

            DryWell well = new DryWell(this);

            well.Tubing           = AnnularTubing;
            well.WellheadPressure = annularWellheadPressure;

            GasFlow gasFlow = new GasFlow(GasFluid, 0, annularWellheadPressure, WellheadTemperature);
            double  Pb      = well.Tubing.CalcStaticBottomholePressure(gasFlow, BottomholeTemperature);

            return(Pb);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Функция высчитывания затрубного давления на устье остановленной скважины по забойному давлению (МПа)
        /// </summary>
        public double CalcStaticAnnularTubingByBottomholePressure(double bottomholePressure)
        {
            AnnularTubing = new Tubing(Tubing);
            AnnularTubing.TubingDiameter = Tubing.CalcEquivalentAnnularDiameter();

            DryWell well = new DryWell(this);

            well.Tubing             = AnnularTubing;
            well.WellheadPressure   = 0;
            well.BottomholePressure = bottomholePressure;

            GasFlow gasFlow = new GasFlow(GasFluid, 0, bottomholePressure, BottomholeTemperature, true);

            double annularWellheadPressure = well.Tubing.CalcStaticWellheadPressure(gasFlow, WellheadTemperature);

            return(annularWellheadPressure);
        }