sys.path.append('../')

import uniflocpy.uWell.deviation_survey as dev_sev
import uniflocpy.uTools.data_workflow as utool
import uniflocpy.uTools.uconst as uconst
import uniflocpy.uWell.uPipe as Pipe
import uniflocpy.uWell.Self_flow_well as self_flow_well
import plotly.graph_objs as go
import numpy as np
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
from plotly import tools
import pandas as pd
init_notebook_mode(connected=True)
import scipy.interpolate as interpolate
import matplotlib.pyplot as plt
data = utool.Data()
from uniflocpy.uTools import plotly_workflow
import re
import uniflocpy.uPVT.BlackOil_model as BlackOil_model
import uniflocpy.uTemperature as uTemperature
import uniflocpy.uReservoir.IPR_simple_line as IPR_simple_line
import uniflocpy.uTools.plotly_workflow as plotly_workflow
import uniflocpy.uValidation.python_api as python_api
import uniflocpy.uValidation.by_UniflocVBA as bvba

calc_options = {
    "step_lenth_in_calc_along_wellbore_m": 25,
    "without_annulus_space": False,
    "solver_using": True
}
blackoil_option = BlackOil_model.BlackOil_option()
blackoil_option.b_wat_cor_number = 1
blackoil_option.mu_wat_cor_number = 1
blackoil_option.rho_wat_cor_number = 1
blackoil_option.z_cor_number = 1
blackoil_option.pseudocritical_temperature_cor_number = 1
blackoil_option.pseudocritical_pressure_cor_number = 1
blackoil_option.rho_gas_cor_number = 1
blackoil_option.b_gas_cor_number = 1
blackoil_option.mu_dead_oil_cor_number = 2
blackoil_option.sigma_oil_gas_cor_number = 2
blackoil_option.sigma_wat_gas_cor_number = 1

python_fluid = BlackOil_model.Fluid(**keywords_python, option=blackoil_option)

BlackOil_model_db = data_workflow.Data()
BlackOil_model_db.clear_data()
vba_result_df = None
for p_bar in range(2, 400, 5):
    python_fluid.calc(p_bar, t_c)
    p_atm = uc.bar2atm(p_bar)
    BlackOil_model_db.get_data(python_fluid, object_name='python_fluid')
    vba_result = uniflocvba.PVT_all_pvt(p_atm, **keywords_vba)
    this_vba_result_df = create_result_df_from_vba_output(
        vba_result, p_bar, t_c)
    try:
        vba_result_df = vba_result_df.append(this_vba_result_df)
    except:
        vba_result_df = this_vba_result_df.copy()

result_unifloc_python = BlackOil_model_db.get_data_as_df()
Exemple #3
0
    def __init__(self,
                 ESP_structure,
                 MultiPhaseFlow=PVT_fluids.FluidFlow(),
                 fluid=PVT_fluids.FluidStanding()):
        self.stage_number = ESP_structure.stage_number
        self.power_ESP_nom_kwt = ESP_structure.power_ESP_nom_kwt
        self.freq_hz = ESP_structure.freq_hz
        self.freq_nom_hz = ESP_structure.freq_nom_hz
        self.q_max_ESP_nom_m3day = ESP_structure.q_max_ESP_nom_m3day
        self.q_ESP_nom_m3day = ESP_structure.q_ESP_nom_m3day

        self.esp_calc_data = data_workflow.Data()
        self.fluid_flow_calc_data = data_workflow.Data()
        self.fluid_calc_data = data_workflow.Data()

        self.save_calculated_data = True

        self.polynom_esp_head_wt = None
        self.polynom_esp_efficiency_d = None
        self.polynom_esp_power_wt = None

        self.stage_height_m = 0.05
        self.ESP_lenth = None

        self.k_sep_total_d = 0.9

        self.fluid_flow = MultiPhaseFlow
        self.fluid = fluid

        self.option_correct_viscosity = False

        self.k_rate_degradation_d = 0
        self.k_pressure_degradation_d = 0
        self.stage_number_in_calc = 1

        self.p_intake_bar = None
        self.t_intake_bar = None
        self.power_fluid_stage_wt = None
        self.power_fluid_total_wt = None
        self.power_ESP_stage_wt = None
        self.power_ESP_total_wt = None
        self.dt_stage_c = None
        self.dt_total_c = None
        self.dp_stage_bar = None
        self.dp_total_bar = None
        self.p_bar = None
        self.t_c = None
        self.ESP_efficiency_total_d = None
        self.ESP_efficiency_stage_d = None

        self.gas_fraction_d = None
        self.q_mix_m3day = None
        self.q_mix_degr_m3day = None
        self.stage_head_m = None
        self.ESP_head_total_m = None
        self.mu_mix_cP = None
        self.rho_mix_kgm3 = None
        self.mu_mix_cSt = None
        self.q_max_ESP_m3day = None

        self.check = -1
Exemple #4
0
plot_func("Расчет насоса по ступеням - esp_calc_data", "Расчет насоса по ступеням - esp_calc_data.html")

parameter_numbers_fluid_flow_list =  list(range(6, 30))
data_trace_fluid_flow = create_traces_list_by_num(np.asarray(range(ESP_obj.stage_number)), ESP_obj.fluid_flow_calc_data, parameter_numbers_fluid_flow_list)
data = data_trace_fluid_flow
plot_func("Расчет насоса по ступеням - fluid_flow_calc_data", "Расчет насоса по ступеням - fluid_flow_calc_data.html")


parameter_numbers_fluid_list = list(range(0, 43))
data_trace_fluid = create_traces_list_by_num(np.asarray(range(ESP_obj.stage_number)), ESP_obj.fluid_calc_data, parameter_numbers_fluid_list)
data = data_trace_fluid
plot_func("Расчет насоса по ступеням - fluid_calc_data", "Расчет насоса по ступеням - fluid_calc_data.html")

"""

data_ESP_perfomance = data_workflow.Data()
data_fluid_perfomance = data_workflow.Data()
data_fluid_flow_perfomance = data_workflow.Data()

data_ESP_perfomance.clear_data()
data_fluid_perfomance.clear_data()
data_fluid_flow_perfomance.clear_data()

start = time.time()

for q_m3day in range(1, 240, 10):
    start_in_loop = time.time()

    ESP_obj.fluid.bobcal_m3m3 = 0
    ESP_obj.fluid.muobcal_cP = 0
    ESP_obj.fluid_flow.fl.bobcal_m3m3 = 0
Exemple #5
0
blackoil_option.z_cor_number = 1
blackoil_option.pseudocritical_temperature_cor_number = 1
blackoil_option.pseudocritical_pressure_cor_number = 1
blackoil_option.rho_gas_cor_number = 1
blackoil_option.b_gas_cor_number = 1 - 1
blackoil_option.mu_dead_oil_cor_number = 2
blackoil_option.sigma_oil_gas_cor_number = 2
blackoil_option.sigma_wat_gas_cor_number = 1

python_fluid = BlackOil_model.Fluid(**keywords_python, option=blackoil_option)

multiphase_flow = PVT_fluids.FluidFlow(python_fluid)
multiphase_flow.qliq_on_surface_m3day = q_liq_sm3day
multiphase_flow.fw_on_surface_perc = watercut_perc

python_flow_model_db = data_workflow.Data()
python_flow_model_db.clear_data()
vba_result_df = None
for p_bar in range(1, 400, 10):
    multiphase_flow.calc(p_bar, t_c)
    p_atm = uc.bar2atm(p_bar)
    python_flow_model_db.get_data(multiphase_flow,
                                  object_name='python_flow_model')
    vba_result = uniflocvba.MF_all_mf(p_atma=p_atm, **keywords_vba)
    this_vba_result_df = create_result_df_from_vba_output(
        vba_result, p_bar, t_c)
    try:
        vba_result_df = vba_result_df.append(this_vba_result_df)
    except:
        vba_result_df = this_vba_result_df.copy()
    def __init__(self,
                 fluid=0,
                 well_profile=0,
                 hydr_corr=0,
                 temp_corr=0,
                 pipe=0,
                 reservoir=-1,
                 gamma_oil=0.86,
                 gamma_gas=0.6,
                 gamma_wat=1.0,
                 rsb_m3m3=200.0,
                 h_conductor_mes_m=500,
                 h_conductor_vert_m=500,
                 h_intake_mes_m=1000,
                 h_intake_vert_m=1000,
                 h_bottomhole_mes_m=1500,
                 h_bottomhole_vert_m=1500,
                 d_casing_inner_m=0.120,
                 d_tube_inner_m=0.062,
                 qliq_on_surface_m3day=100,
                 fw_on_surface_perc=10,
                 p_bottomhole_bar=200,
                 t_bottomhole_c=92,
                 p_wellhead_bar=20,
                 t_wellhead_c=20,
                 t_earth_init_on_surface_c=3,
                 t_earth_init_in_reservoir_c=90,
                 geothermal_grad_cm=0.03,
                 p_reservoir_bar=None,
                 well_work_time_sec=60 * 24 * 60 * 60,
                 step_lenth_in_calc_along_wellbore_m=10,
                 without_annulus_space=False,
                 save_all=True,
                 solver_using=0,
                 activate_rus_mode=0,
                 multiplier_for_pi=1,
                 pb_bar=90):
        """
        При создании модели скважины необходимо задать ее конструкцию, PVT свойства флюидов и режим работы
        вместе с граничными условиями. Кроме параметров, которые предлагается задать при
        инициализации, можно изменить и другие, входящие в состав модели, путем обращения к необходимым
        модулям. На что стоит обрать внимание: некоторые параметры выставлены по умолчанию и изменение
        всех интересующих параметров необходимо выполнить до процесса расчета.

        :param h_conductor_mes_m: измеренная глубина конца кондуктора, м
        :param h_conductor_vert_m: вертикальная глубина конца кондуктора, м
        :param h_intake_mes_m: измеренная глубина конца колонны НКТ (спуска НКТ), м
        :param h_intake_vert_m: вертикальная глубина конца колонны НКТ (спуска НКТ), м
        :param h_bottomhole_mes_m: измеренная глубина забоя, м
        :param h_bottomhole_vert_m: вертикальная глубина забоя, м
        :param qliq_on_surface_m3day: дебит жидкости на поверхности, м3/сутки
        :param fw_on_surface_perc: обводненность продукции на поверхности, %
        :param d_casing_inner_m: внутренний диаметр обсадной колонны, м
        :param d_tube_inner_m: внутренни диаметр НКТ
        :param p_bottomhole_bar: давление на забое, бар
        :param t_bottomhole_c: температура на забое, С
        :param p_wellhead_bar: давление на устье, бар
        :param t_wellhead_c: температура на устье, С
        :param t_earth_init_on_surface_c: начальная температура земли на поверхности (нейтрального слоя), С
        :param t_earth_init_in_reservoir_c: начальная температура пласта, С
        :param geothermal_grad_cm: геотермический градиент, С/м
        :param well_work_time_sec: время работы скважины, сек
        :param step_lenth_in_calc_along_wellbore_m: длина шага вдоль ствола скважины в расчете, м
        """

        self.h_conductor_mes_m = h_conductor_mes_m
        self.h_conductor_vert_m = h_conductor_vert_m
        self.h_intake_mes_m = h_intake_mes_m
        self.h_intake_vert_m = h_intake_vert_m
        self.h_bottomhole_mes_m = h_bottomhole_mes_m
        self.h_bottomhole_vert_m = h_bottomhole_vert_m
        self.d_casing_inner_m = d_casing_inner_m
        self.d_tube_inner_m = d_tube_inner_m

        self.p_bottomhole_bar = p_bottomhole_bar
        self.t_bottomhole_c = t_bottomhole_c
        self.p_wellhead_bar = p_wellhead_bar
        self.t_wellhead_c = t_wellhead_c

        self.well_work_time_sec = well_work_time_sec

        self.step_lenth_in_calc_along_wellbore_m = step_lenth_in_calc_along_wellbore_m

        self.t_earth_init_on_surface_c = t_earth_init_on_surface_c
        self.t_earth_init_in_reservoir_c = t_earth_init_in_reservoir_c
        self.geothermal_grad_cm = geothermal_grad_cm
        self.p_reservoir_bar = p_reservoir_bar

        if well_profile == 0:
            self.well_profile = deviation_survey.simple_well_deviation_survey()
        elif well_profile == 1:
            self.well_profile = deviation_survey.well_deviation_survey()

        if pipe == 0:
            self.pipe = uPipe.Pipe()

        if hydr_corr == 0:
            self.pipe.hydr_cor = hydr_cor_Beggs_Brill.Beggs_Brill_cor()

        if temp_corr == 0:
            self.pipe.temp_cor = temp_cor_Hasan_Kabir.Hasan_Kabir_cor()
        elif temp_corr == 1:
            self.pipe.temp_cor = temp_cor_simple_line.SimpleLineCor()

        if fluid == 0:
            self.pipe.fluid_flow.fl = PVT_fluids.FluidStanding(
                gamma_oil=gamma_oil,
                gamma_gas=gamma_gas,
                gamma_wat=gamma_wat,
                rsb_m3m3=rsb_m3m3)
        elif fluid == 1:
            self.pipe.fluid_flow.fl = BlackOil_model.Fluid(
                gamma_oil=gamma_oil,
                gamma_gas=gamma_gas,
                gamma_wat=gamma_wat,
                rsb_m3m3=rsb_m3m3,
                t_res_c=t_bottomhole_c,
                pb_bar=pb_bar)
        if activate_rus_mode:
            self.pipe.fluid_flow.fl = BlackOil_model.Fluid(
                gamma_oil=gamma_oil,
                gamma_gas=gamma_gas,
                gamma_wat=gamma_wat,
                rsb_m3m3=rsb_m3m3,
                t_res_c=t_bottomhole_c,
                pb_bar=pb_bar,
                activate_rus_cor=1)

        self.data = data_workflow.Data()

        self.qliq_on_surface_m3day = qliq_on_surface_m3day
        self.fw_on_surface_perc = fw_on_surface_perc

        self.h_calculated_vert_m = None
        self.h_calculated_mes_m = None
        self.p_calculated_bar = None
        self.t_calculated_c = None
        self.t_calculated_earth_init = None
        self.t_grad_calculated_cm = None
        self.p_grad_calculated_barm = None

        self.without_annulus_space = without_annulus_space
        self.save_all = save_all

        if reservoir == -1:
            self.ipr = None
        elif reservoir == 0:
            self.ipr = IPR_simple_line.IPRSimpleLine()
            if self.p_reservoir_bar == None:
                self.p_reservoir_bar = 1000 * uc.g * self.h_bottomhole_vert_m / 100000
            self.ipr.pi_m3daybar = self.ipr.calc_pi_m3daybar(
                self.qliq_on_surface_m3day, self.p_bottomhole_bar,
                self.p_reservoir_bar)

        self.direction_up = None
        self.solver_using = solver_using

        self.multiplier_for_pi = multiplier_for_pi
        self.time_calculated_sec = None
        self.calculation_number_in_one_step = None
    def __init__(self,
                 h_conductor_mes_m=500,
                 h_conductor_vert_m=500,
                 h_intake_mes_m=1000,
                 h_intake_vert_m=1000,
                 h_bottomhole_mes_m=1500,
                 h_bottomhole_vert_m=1500,
                 qliq_on_surface_m3day=100,
                 fw_perc=10,
                 d_casing_inner_m=0.062,
                 d_tube_inner_m=0.120,
                 p_bottomhole_bar=200,
                 t_bottomhole_c=92,
                 p_wellhead_bar=20,
                 t_wellhead_c=20,
                 t_earth_init_on_surface_c=3,
                 t_earth_init_in_reservoir_c=90,
                 geothermal_grad_cm=0.03,
                 well_work_time_sec=60 * 24 * 60 * 60,
                 step_lenth_in_calc_along_wellbore_m=10):
        """
        При создании модели скважины необходимо задать ее конструкцию, PVT свойства флюидов и режим работы
        вместе с граничными условиями. Кроме параметров, которые предлагается задать при
        инициализации, можно изменить и другие, входящие в состав модели, путем обращения к необходимым
        модулям. На что стоит обрать внимание: некоторые параметры выставлены по умолчанию и изменение
        всех интересующих параметров необходимо выполнить до процесса расчета.

        :param h_conductor_mes_m: измеренная глубина конца кондуктора, м
        :param h_conductor_vert_m: вертикальная глубина конца кондуктора, м
        :param h_intake_mes_m: измеренная глубина конца колонны НКТ (спуска НКТ), м
        :param h_intake_vert_m: вертикальная глубина конца колонны НКТ (спуска НКТ), м
        :param h_bottomhole_mes_m: измеренная глубина забоя, м
        :param h_bottomhole_vert_m: вертикальная глубина забоя, м
        :param qliq_on_surface_m3day: дебит жидкости на поверхности, м3/сутки
        :param fw_perc: обводненность продукции на поверхности, %
        :param d_casing_inner_m: внутренний диаметр обсадной колонны, м
        :param d_tube_inner_m: внутренни диаметр НКТ
        :param p_bottomhole_bar: давление на забое, бар
        :param t_bottomhole_c: температура на забое, С
        :param p_wellhead_bar: давление на устье, бар
        :param t_wellhead_c: температура на устье, С
        :param t_earth_init_on_surface_c: начальная температура земли на поверхности (нейтрального слоя), С
        :param t_earth_init_in_reservoir_c: начальная температура пласта, С
        :param geothermal_grad_cm: геотермический градиент, С/м
        :param well_work_time_sec: время работы скважины, сек
        :param step_lenth_in_calc_along_wellbore_m: длина шага вдоль ствола скважины в расчете, м
        """

        self.h_conductor_mes_m = h_conductor_mes_m
        self.h_conductor_vert_m = h_conductor_vert_m

        self.h_intake_mes_m = h_intake_mes_m
        self.h_intake_vert_m = h_intake_vert_m

        self.h_bottomhole_mes_m = h_bottomhole_mes_m
        self.h_bottomhole_vert_m = h_bottomhole_vert_m

        self.d_casing_inner_m = d_casing_inner_m
        self.d_tube_inner_m = d_tube_inner_m

        self.p_bottomhole_bar = p_bottomhole_bar
        self.t_bottomhole_c = t_bottomhole_c

        self.p_wellhead_bar = p_wellhead_bar
        self.t_wellhead_c = t_wellhead_c

        self.well_work_time_sec = well_work_time_sec

        self.step_lenth_in_calc_along_wellbore_m = step_lenth_in_calc_along_wellbore_m

        self.t_earth_init_on_surface_c = t_earth_init_on_surface_c
        self.t_earth_init_in_reservoir_c = t_earth_init_in_reservoir_c
        self.geothermal_grad_cm = geothermal_grad_cm

        self.well_profile = well_profile.simple_well_deviation_survey()

        self.casing_pipe = pipe.Pipe()
        self.tube_pipe = pipe.Pipe()

        self.data = data_workflow.Data()

        self.qliq_on_surface_m3day = qliq_on_surface_m3day
        self.fw_perc = fw_perc

        self.h_calculated_vert_m = None
        self.h_calculated_mes_m = None
        self.p_calculated_bar = None
        self.t_calculated_c = None
        self.t_calculated_earth_init = None
        self.t_grad_calculated_cm = None
        self.p_grad_calculated_barm = None