/// <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); }
/// <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); }
/// <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); }