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