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)
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)
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)
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)
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)
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)
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
"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
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