Esempio n. 1
0
 def test_BlackOil_model(self):
     pressure_bar = 100
     temp_c = 80
     fluid_flow = BlackOil_model.Fluid()
     fluid_flow.calc(pressure_bar, temp_c)
     sum = 0
     for i in fluid_flow.__dict__.items():
         if type(i[-1]) != type((BlackOil_model.BlackOil_option())):
             sum += i[-1]
     self.assertAlmostEqual(sum, 13144.511219057467,
                            delta=0.0001)
Esempio n. 2
0
 def test_BlackOil_model(self):
     pressure_bar = 100
     temp_c = 80
     fluid_model = BlackOil_model.Fluid()
     fluid_model.calc(pressure_bar, temp_c)
     sum = 0
     for i in fluid_model.__dict__.items():
         if type(i[-1]) != type((BlackOil_model.BlackOil_option())):
             sum += i[-1]
     self.assertAlmostEqual(sum, 13330.58601414152,
                            delta=0.0001)
Esempio n. 3
0
 def test_BlackOil_model_vba_preset(self):
     pressure_bar = 20
     temp_c = 80
     blackoil_option_vba = BlackOil_model.BlackOil_option()
     blackoil_option_vba.set_vba_preset()
     fluid_model = BlackOil_model.Fluid(option=blackoil_option_vba)
     fluid_model.calc(pressure_bar, temp_c)
     sum = 0
     for i in fluid_model.__dict__.items():
         if type(i[-1]) != type((BlackOil_model.BlackOil_option())):
             sum += i[-1]
     self.assertAlmostEqual(sum, 12781.243876576445,
                            delta=0.0001)
Esempio n. 4
0
 def test_BlackOil_option(self):
     option = BlackOil_model.BlackOil_option()
     sum = 0
     for i in option.__dict__.items():
         sum += i[-1]
     self.assertAlmostEqual(sum, 0,
                            delta=0.0001)
Esempio n. 5
0
 def test_calc_all_from_up_to_down_vba_fluid_simple_line_for_t(self):
     bo_option = BlackOil_model.BlackOil_option()
     bo_option.set_vba_preset()
     self_flow_well_object = self_flow_well_module.self_flow_well(
         fluid=1, temp_corr=1)
     self_flow_well_object.pipe.fluid_flow.fl.option = bo_option
     self_flow_well_object.calc_all_from_up_to_down()
     p_bottomhole_bar = self_flow_well_object.p_bottomhole_bar
     t_bottomhole_c = self_flow_well_object.t_bottomhole_c
     sum_p_t = p_bottomhole_bar + t_bottomhole_c
     self.assertAlmostEquals(sum_p_t, 180.81140510126218, delta=0.00000001)
Esempio n. 6
0
 def test_calc_all_from_down_to_up_vba_fluid_simple_line_for_t(self):
     bo_option = BlackOil_model.BlackOil_option()
     bo_option.set_vba_preset()
     self_flow_well_object = self_flow_well_module.self_flow_well(
         fluid=1, temp_corr=1)
     self_flow_well_object.pipe.fluid_flow.fl.option = bo_option
     self_flow_well_object.calc_all_from_down_to_up()
     t_wellhead_c = self_flow_well_object.t_wellhead_c
     p_wellhead_bar = self_flow_well_object.p_wellhead_bar
     sum_p_t = t_wellhead_c + p_wellhead_bar
     self.assertAlmostEquals(sum_p_t, 127.54691770355993, delta=0.00000001)
Esempio n. 7
0
import pandas as pd
import uniflocpy.uWell.Self_flow_well as self_flow_well
import uniflocpy.uPVT.BlackOil_model as bom


blackoil_option = bom.BlackOil_option()
blackoil_option.set_vba_preset()

def calc_well_with_one_parameter(data):

    object_class, all_parameters_dict, defined_range, parameter_name_to_iterate, parameter_name_to_extract,\
        parameter_name_to_fill, parameter_value_to_fill = data
    result_i = []
    result_parameter = []
    for i in defined_range:
        this_dict = all_parameters_dict
        this_dict[parameter_name_to_iterate] = i
        this_object = object_class(**this_dict)
        this_object.pipe.fluid_flow.fl.option = blackoil_option
        this_object.pipe.fluid_flow.calc_with_temp_cor = 0
        this_object.calc_all_from_up_to_down()
        result_i.append(i)
        result_parameter.append(this_object.__dict__[parameter_name_to_extract])
    one_df = pd.DataFrame({f"{parameter_name_to_extract} при {parameter_name_to_fill} = {parameter_value_to_fill}":
                               result_parameter}, index=result_i)
    one_df.index.name = parameter_name_to_iterate
    return one_df
Esempio n. 8
0
    "gamma_gas": gamma_gas,
    "gamma_wat": gamma_water,
    "rsb_m3m3": rsb_m3m3,
    "t_res_c": t_res_c
}

keywords_vba = {
    "t_C": t_c,
    "gamma_gas": gamma_gas,
    "gamma_oil": gamma_oil,
    "gamma_wat": gamma_water,
    "rsb_m3m3": rsb_m3m3,
    "tres_C": t_res_c
}  #проверено, улетают свойства газа (из-за z), st oil-gas, mu_wate

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()
    "d_tube_inner_m": 0.0503,
    "qliq_on_surface_m3day": 240,
    "fw_on_surface_perc": 25
}
real_measurements = pd.DataFrame({
    'p_survey_mpa': [
        0.975, 8.495, 9.44, 10.365, 10.902, 11.272, 12.085, 12.907, 13.785,
        14.67, 15.55
    ],
    'h_mes_survey_m':
    [0, 957, 1057, 1157, 1211, 1257, 1357, 1457, 1557, 1657, 1757]
})

well_data["t_wellhead_c"] = well_data["t_bottomhole_c"]

blackoil_option = BlackOil_model.BlackOil_option()

blackoil_option.set_vba_preset()

simple_well = self_flow_well.self_flow_well(fluid=1,
                                            reservoir=0,
                                            pipe=0,
                                            temp_corr=1,
                                            **fluid_data,
                                            **well_data,
                                            **calc_options)

simple_well.pipe.fluid_flow.fl.option = blackoil_option
simple_well.pipe.fluid_flow.calc_with_temp_cor = 0

simple_well.pipe.hydr_cor.epsilon_friction_m = 0.0001
Esempio n. 10
0
    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