def test_kwargs_with_user_options(): net = example_simple() pp.runpp(net) assert net._options["trafo3w_losses"] == "hv" pp.set_user_pf_options(net, trafo3w_losses="lv") pp.runpp(net) assert net._options["trafo3w_losses"] == "lv"
def test_zip_loads_with_voltage_angles(): net = pp.create_empty_network() b1 = pp.create_bus(net, vn_kv=1.) b2 = pp.create_bus(net, vn_kv=1.) pp.create_ext_grid(net, b1) pp.create_line_from_parameters(net, b1, b2, length_km=1, r_ohm_per_km=0.3, x_ohm_per_km=0.3, c_nf_per_km=10, max_i_ka=1) pp.create_load(net, b2, p_kw=2., const_z_percent=0, const_i_percent=100) pp.set_user_pf_options(net, calculate_voltage_angles=True, init='dc') pp.runpp(net) res_load = net.res_load.copy() net.ext_grid.va_degree = 100 pp.runpp(net) assert np.allclose(net.res_load.values, res_load.values)
def test_set_user_pf_options(): net = example_simple() pp.runpp(net) old_options = net._options.copy() test_options = {key: i for i, key in enumerate(old_options.keys())} pp.set_user_pf_options(net, hello='bye', **test_options) test_options.update({'hello': 'bye'}) assert net.user_pf_options == test_options # remove what is in user_pf_options and add hello=world pp.set_user_pf_options(net, overwrite=True, hello='world') assert net.user_pf_options == {'hello': 'world'} # check if 'hello' is added to net._options, but other options are untouched pp.runpp(net) assert 'hello' in net._options.keys() and net._options['hello'] == 'world' net._options.pop('hello') assert net._options == old_options # check if user_pf_options can be deleted and net._options is as it was before pp.set_user_pf_options(net, overwrite=True, hello='world') pp.set_user_pf_options(net, overwrite=True) assert net.user_pf_options == {} pp.runpp(net) assert 'hello' not in net._options.keys() # see if user arguments overrule user_pf_options, but other user_pf_options still have the priority pp.set_user_pf_options(net, tolerance_kva=1e-3, max_iteration=20) pp.runpp(net, tolerance_kva=1e-2) assert net.user_pf_options['tolerance_kva'] == 1e-3 assert net._options['tolerance_kva'] == 1e-2 assert net._options['max_iteration'] == 20
def test_results_for_line_temperature(): net = pp.create_empty_network() pp.create_bus(net, 0.4) pp.create_buses(net, 2, 0.4) pp.create_ext_grid(net, 0) pp.create_load(net, 1, 5e-3, 10e-3) pp.create_load(net, 2, 5e-3, 10e-3) pp.create_line_from_parameters(net, 0, 1, 0.5, 0.642, 0.083, 210, 1, alpha=0.00403) pp.create_line_from_parameters(net, 1, 2, 0.5, 0.642, 0.083, 210, 1, alpha=0.00403) vm_res_20 = [1, 0.9727288676, 0.95937328755] va_res_20 = [0, 2.2103403814, 3.3622612327] vm_res_80 = [1, 0.96677572771, 0.95062498477] va_res_80 = [0, 2.7993156134, 4.2714451629] pp.runpp(net) assert np.allclose(net.res_bus.vm_pu, vm_res_20, rtol=0, atol=1e-6) assert np.allclose(net.res_bus.va_degree, va_res_20, rtol=0, atol=1e-6) net.line["temperature_degree_celsius"] = 80 pp.set_user_pf_options(net, consider_line_temperature=True) pp.runpp(net) assert np.allclose(net.res_bus.vm_pu, vm_res_80, rtol=0, atol=1e-6) assert np.allclose(net.res_bus.va_degree, va_res_80, rtol=0, atol=1e-6)
def test_discrete_tap_control_lv(): # --- load system and run power flow net = nw.simple_four_bus_system() pp.set_user_pf_options(net, init='dc', calculate_voltage_angles=True) # --- initial tap data net.trafo.tap_side = 'lv' net.trafo.tap_neutral = 0 net.trafo.tap_min = -2 net.trafo.tap_max = 2 net.trafo.tap_step_percent = 1.25 net.trafo.tap_pos = 0 # --- run loadflow pp.runpp(net) DiscreteTapControl(net, tid=0, side='lv', vm_lower_pu=0.95, vm_upper_pu=0.99) logger.info("case1: low voltage") logger.info("before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) logger.info( "after DiscreteTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) assert net.trafo.tap_pos.at[0] == -1 # increase voltage from 1.0 pu to 1.03 pu net.ext_grid.vm_pu = 1.03 # switch back tap position net.trafo.tap_pos.at[0] = 0 pp.runpp(net) logger.info("case2: high voltage") logger.info("before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) logger.info( "after DiscreteTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) assert net.trafo.tap_pos.at[0] == -2 # reduce voltage from 1.03 pu to 0.949 pu net.ext_grid.vm_pu = 0.949 # switch back tap position net.trafo.tap_pos.at[0] = 0 pp.runpp(net) logger.info("case2: high voltage") logger.info("before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) logger.info( "after DiscreteTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) assert net.trafo.tap_pos.at[0] == 1
def test_overwrite_default_args_with_user_options(): net = example_simple() pp.runpp(net) assert net._options["check_connectivity"] is True pp.set_user_pf_options(net, check_connectivity=False) pp.runpp(net) assert net._options["check_connectivity"] is False pp.runpp(net, check_connectivity=True) assert net._options["check_connectivity"] is True
def test_excel(net_in, tempdir): filename = os.path.join(tempdir, "testfile.xlsx") pp.to_excel(net_in, filename) net_out = pp.from_excel(filename) assert_net_equal(net_in, net_out) pp.set_user_pf_options(net_in, tolerance_kva=1e3) pp.to_excel(net_in, filename) net_out = pp.from_excel(filename) assert_net_equal(net_in, net_out) assert net_out.user_pf_options == net_in.user_pf_options
def test_from_mpc(): case24 = pn.case24_ieee_rts() pp.set_user_pf_options(case24) this_folder = os.path.join(pp.pp_dir, "test", "converter") mat_case_path = os.path.join(this_folder, 'case24_ieee_rts.mat') case24_from_mpc = from_mpc(mat_case_path, f_hz=60, casename_mpc_file='mpc') pp.runpp(case24) pp.runpp(case24_from_mpc) assert case24_from_mpc.converged assert pp.nets_equal(case24, case24_from_mpc, check_only_results=True)
def test_excel(net_in, tmp_path): filename = os.path.abspath(str(tmp_path)) + "testfile.xlsx" pp.to_excel(net_in, filename) net_out = pp.from_excel(filename) assert_net_equal(net_in, net_out) # test in user_pf_options are equal pp.set_user_pf_options(net_in, tolerance_mva=1e3) pp.to_excel(net_in, filename) net_out = pp.from_excel(filename) assert_net_equal(net_in, net_out) assert net_out.user_pf_options == net_in.user_pf_options
def test_from_mpc(): case24 = pn.case24_ieee_rts() pp.set_user_pf_options(case24) this_file_path = os.path.dirname(os.path.realpath(__file__)) mat_case_path = os.path.join(this_file_path, 'case24_ieee_rts.mat') case24_from_mpc = from_mpc(mat_case_path, f_hz=60, casename_mpc_file='mpc') pp.runpp(case24) pp.runpp(case24_from_mpc) assert case24_from_mpc.converged assert pp.nets_equal(case24, case24_from_mpc, check_only_results=True)
def test_net_hl(): # Reference power in the s generator psg1 = 163 psg2 = 85 net = pp.create_empty_network() pp.set_user_pf_options(net, init_vm_pu="flat", init_va_degree="dc", calculate_voltage_angles=True) b0 = pp.create_bus(net, p_mw=0, q_mw=0, vn_kv=110) b1 = pp.create_bus(net, p_mw=163, q_mw=0, vn_kv=110) b2 = pp.create_bus(net, p_mw=85, q_mw=0, vn_kv=110) b3 = pp.create_bus(net, vn_kv=110) b4 = pp.create_bus(net, p_mw=90, q_mw=30, vn_kv=110) b5 = pp.create_bus(net, vn_kv=110) b6 = pp.create_bus(net, p_mw=100, q_mw=35, vn_kv=110) b7 = pp.create_bus(net, vn_kv=110) b8 = pp.create_bus(net, p_mw=125, q_mw=50, vn_kv=110) pp.create_line(net, b0, b3, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b1, b7, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b3, b8, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b7, b8, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b3, b4, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b7, b8, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b5, b6, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b5, b4, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b2, b5, 10, "149-AL1/24-ST1A 110.0") pp.create_load(net, b4, p_mw=100 + np.random.normal(0, 0.1), q_mvar=40 + np.random.normal(0, 0.06), name='load1') pp.create_load(net, b6, p_mw=132 + np.random.normal(0, 0.05), q_mvar=60 + np.random.normal(0, 0.1), name='load2') pp.create_load(net, b8, p_mw=125 + np.random.normal(0, 0.05), q_mvar=45 + np.random.normal(0, 0.1), name='load3') pp.create_gen(net, b0, p_mw=0, name='gen1', slack=True) pp.create_sgen(net, b1, p_mw=163, q_mvar=0, name='sgen1') pp.create_sgen(net, b2, p_mw=85, q_mvar=0, name='sgen2') return net
def test_from_ppc(): ppc = get_testgrids('case2_2', 'ppc_testgrids.p') net_by_ppc = from_ppc(ppc) net_by_code = pp.from_json(os.path.join(os.path.split(pp.__file__)[0], 'test', 'converter', 'case2_2_by_code.json')) pp.set_user_pf_options(net_by_code) # for assertion of nets_equal pp.runpp(net_by_ppc, trafo_model="pi") pp.runpp(net_by_code, trafo_model="pi") assert type(net_by_ppc) == type(net_by_code) assert net_by_ppc.converged assert len(net_by_ppc.bus) == len(net_by_code.bus) assert len(net_by_ppc.trafo) == len(net_by_code.trafo) assert len(net_by_ppc.ext_grid) == len(net_by_code.ext_grid) assert pp.nets_equal(net_by_ppc, net_by_code, check_only_results=True, tol=1.e-9)
def test_line_temperature(): net = four_loads_with_branches_out() r_init = net.line.r_ohm_per_km.values.copy() # r_ohm_per_km is not in line results by default pp.runpp(net) v_init = net.res_bus.vm_pu.values.copy() va_init = net.res_bus.va_degree.values.copy() assert "r_ohm_per_km" not in net.res_line.columns # no temperature adjustment performed if not explicitly set in options/arguments to runpp net.line["temperature_degree_celsius"] = 20 pp.runpp(net) assert "r_ohm_per_km" not in net.res_line.columns assert np.allclose(net.res_bus.vm_pu, v_init, rtol=0, atol=1e-16) assert np.allclose(net.res_bus.va_degree, va_init, rtol=0, atol=1e-16) # argument in runpp is considered pp.runpp(net, consider_line_temperature=True) assert "r_ohm_per_km" in net.res_line.columns assert np.allclose(net.res_line.r_ohm_per_km, r_init, rtol=0, atol=1e-16) assert np.allclose(net.res_bus.vm_pu, v_init, rtol=0, atol=1e-16) assert np.allclose(net.res_bus.va_degree, va_init, rtol=0, atol=1e-16) # check results of r adjustment, check that user_pf_options works, alpha is 4e-3 by default t = np.arange(0, 80, 10) net.line.temperature_degree_celsius = t pp.set_user_pf_options(net, consider_line_temperature=True) pp.runpp(net) alpha = 4e-3 r_temp = r_init * (1 + alpha * (t - 20)) assert np.allclose(net.res_line.r_ohm_per_km, r_temp, rtol=0, atol=1e-16) assert not np.allclose(net.res_bus.vm_pu, v_init, rtol=0, atol=1e-4) assert not np.allclose(net.res_bus.va_degree, va_init, rtol=0, atol=1e-2) # check reults with user-defined alpha alpha = np.arange(3e-3, 5e-3, 2.5e-4) net.line['alpha'] = alpha pp.runpp(net) r_temp = r_init * (1 + alpha * (t - 20)) assert np.allclose(net.res_line.r_ohm_per_km, r_temp, rtol=0, atol=1e-16) assert not np.allclose(net.res_bus.vm_pu, v_init, rtol=0, atol=1e-4) assert not np.allclose(net.res_bus.va_degree, va_init, rtol=0, atol=1e-2) # not anymore in net if not considered pp.set_user_pf_options(net, overwrite=True) pp.runpp(net) assert np.allclose(net.res_bus.vm_pu, v_init, rtol=0, atol=1e-16) assert np.allclose(net.res_bus.va_degree, va_init, rtol=0, atol=1e-16) assert "r_ohm_per_km" not in net.res_line.columns
def create_net(state='NS'): net = pp.create_empty_network() pp.set_user_pf_options(net, init_vm_pu="flat", init_va_degree="dc", calculate_voltage_angles=True) b0 = pp.create_bus(net, 110) b1 = pp.create_bus(net, 110) b2 = pp.create_bus(net, 110) b3 = pp.create_bus(net, 110) b4 = pp.create_bus(net, 110) b5 = pp.create_bus(net, 110) b6 = pp.create_bus(net, 110) b7 = pp.create_bus(net, 110) b8 = pp.create_bus(net, 110) pp.create_ext_grid(net, b0) pp.create_line(net, b0, b3, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b3, b4, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b3, b8, 10, "149-AL1/24-ST1A 110.0") if state in ['NS', 'HL', 'LL', 'GD']: pp.create_line(net, b4, b5, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b5, b2, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b8, b7, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b5, b6, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b1, b7, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b7, b6, 10, "149-AL1/24-ST1A 110.0") if state == 'HL': pp.create_load(net, b4, p_mw=90 * 1.1, q_mvar=30 * 1.1, name='load1') pp.create_load(net, b6, p_mw=100 * 1.1, q_mvar=35 * 1.1, name='load2') pp.create_load(net, b8, p_mw=125 * 1.1, q_mvar=50 * 1.1, name='load3') if state == 'LL': pp.create_load(net, b4, p_mw=90 * 0.9, q_mvar=30 * 0.9, name='load1') pp.create_load(net, b6, p_mw=100 * 0.9, q_mvar=35 * 0.9, name='load2') pp.create_load(net, b8, p_mw=125 * 0.9, q_mvar=50 * 0.9, name='load3') else: pp.create_load(net, b4, p_mw=90, q_mvar=30, name='load1') pp.create_load(net, b6, p_mw=100, q_mvar=35, name='load2') pp.create_load(net, b8, p_mw=125, q_mvar=50, name='load3') pp.create_gen(net, b0, p_mw=0, vm_pu=1.0, name='gen1', slack=True) pp.create_sgen(net, b1, p_mw=163, q_mvar=0, name='sgen1') if state in ['NS', 'HL', 'LL', 'LD']: pp.create_sgen(net, b2, p_mw=85, q_mvar=0, name='sgen2') return net
def simple_test_net(): net = pp.create_empty_network() pp.set_user_pf_options(net, init='dc', calculate_voltage_angles=True) b0 = pp.create_bus(net, 110) b1 = pp.create_bus(net, 110) b2 = pp.create_bus(net, 20) b3 = pp.create_bus(net, 20) b4 = pp.create_bus(net, 6) pp.create_ext_grid(net, b0) pp.create_line(net, b0, b1, 10, "149-AL1/24-ST1A 110.0") pp.create_transformer(net, b1, b2, "25 MVA 110/20 kV", name='tr1') pp.create_transformer3w_from_parameters(net, b1, b3, b4, 110, 20, 6, 1e2, 1e2, 1e1, 3, 2, 2, 1, 1, 1, 100, 1, 60, 30, 'hv', tap_step_percent=1.5, tap_step_degree=0, tap_pos=0, tap_neutral=0, tap_max=10, tap_min=-10, name='tr2') pp.create_load(net, b2, 1.5e1, 1, name='trafo1') pp.create_load(net, b3, 3e1, 1.5, name='trafo2_mv') pp.create_load(net, b4, 2, -0.15, name='trafo2_lv') return net
def test_from_ppc(): ppc = get_testgrids('case2_2', 'ppc_testgrids.p') net_by_ppc = from_ppc(ppc) net_by_code = get_testgrids('case2_2_by_code', 'ppc_testgrids.p') pp.set_user_pf_options(net_by_code) # for assertion of nets_equal pp.runpp(net_by_ppc, trafo_model="pi") pp.runpp(net_by_code, trafo_model="pi") assert type(net_by_ppc) == type(net_by_code) assert net_by_ppc.converged assert len(net_by_ppc.bus) == len(net_by_code.bus) assert len(net_by_ppc.trafo) == len(net_by_code.trafo) assert len(net_by_ppc.ext_grid) == len(net_by_code.ext_grid) assert pp.nets_equal(net_by_ppc, net_by_code, check_only_results=True, tol=1.e-9)
def test_result_index_unsorted(): net = pp.create_empty_network() pp.set_user_pf_options(net, tolerance_mva=1e-9) b1 = pp.create_bus(net, vn_kv=0.4, index=4) b2 = pp.create_bus(net, vn_kv=0.4, index=2) b3 = pp.create_bus(net, vn_kv=0.4, index=3) pp.create_gen(net, b1, p_mw=0.01, vm_pu=0.4) pp.create_load(net, b2, p_mw=0.01) pp.create_ext_grid(net, b3) pp.create_line(net, from_bus=b1, to_bus=b2, length_km=0.5, std_type="NAYY 4x120 SE") pp.create_line(net, from_bus=b1, to_bus=b3, length_km=0.5, std_type="NAYY 4x120 SE") net_recycle = copy.deepcopy(net) pp.runpp(net_recycle) pp.runpp(net_recycle, recycle=dict(trafo=True, bus_pq=True, gen=True)) pp.runpp(net) assert nets_equal(net, net_recycle, atol=1e-12)
def test_continuous_tap_control_vectorized_hv(): # --- load system and run power flow net = pp.create_empty_network() pp.create_buses(net, 6, 110) pp.create_buses(net, 5, 20) pp.create_ext_grid(net, 0) pp.create_lines(net, np.zeros(5), np.arange(1, 6), 10, "243-AL1/39-ST1A 110.0") for hv, lv in zip(np.arange(1, 6), np.arange(6, 11)): pp.create_transformer(net, hv, lv, "63 MVA 110/20 kV") pp.create_load(net, lv, 25 * (lv - 8), 25 * (lv - 8) * 0.4) pp.set_user_pf_options(net, init='dc', calculate_voltage_angles=True) # --- run loadflow pp.runpp(net) net_ref = net.deepcopy() # create with individual controllers for comparison tol = 1e-4 for tid in net.trafo.index.values: ContinuousTapControl(net_ref, tid=tid, side='hv', vm_set_pu=1.02, tol=tol) # run control reference pp.runpp(net_ref, run_control=True) # now create the vectorized version ContinuousTapControl(net, tid=net.trafo.index.values, side='hv', vm_set_pu=1.02, tol=tol) pp.runpp(net, run_control=True) assert np.allclose(net_ref.trafo.tap_pos, net.trafo.tap_pos, atol=1e-2, rtol=0)
def test_net_no_load(): # Reference power in the s generator psg1 = 163 psg2 = 85 net = pp.create_empty_network() pp.set_user_pf_options(net, init_vm_pu="flat", init_va_degree="dc", calculate_voltage_angles=True) b0 = pp.create_bus(net, p_mw=0, q_mw=0, vn_kv=110, name="bus0") b1 = pp.create_bus(net, p_mw=163, q_mw=0, vn_kv=110, name="bus1") b2 = pp.create_bus(net, p_mw=85, q_mw=0, vn_kv=110, name="bus2") b3 = pp.create_bus(net, vn_kv=110, name="bus3") b4 = pp.create_bus(net, p_mw=90, q_mw=30, vn_kv=110, name="bus4") b5 = pp.create_bus(net, vn_kv=110, name="bus5") b6 = pp.create_bus(net, p_mw=100, q_mw=35, vn_kv=110, name="bus6") b7 = pp.create_bus(net, vn_kv=110, name="bus7") b8 = pp.create_bus(net, p_mw=125, q_mw=50, vn_kv=110, name="bus8") pp.create_line(net, b0, b3, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b1, b7, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b3, b8, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b7, b8, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b3, b4, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b7, b8, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b5, b6, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b5, b4, 10, "149-AL1/24-ST1A 110.0") pp.create_line(net, b2, b5, 10, "149-AL1/24-ST1A 110.0") pp.create_load(net, b4, p_mw=90, q_mvar=30, name='load1') #pp.create_load(net, b6, p_mw=125, q_mvar=50, name='load2') pp.create_load(net, b8, p_mw=100, q_mvar=35, name='load3') pp.create_gen(net, b0, p_mw=0, name='gen1', slack=True) pp.create_sgen(net, b1, p_mw=psg1, q_mvar=0, name='sgen1') pp.create_sgen(net, b2, p_mw=psg2, q_mvar=0, name='sgen2') return net
def test_discrete_tap_control_hv_from_tap_step_percent(): # --- load system and run power flow net = nw.simple_four_bus_system() pp.set_user_pf_options(net, init='dc', calculate_voltage_angles=True) # --- initial tap data net.trafo.tap_side = 'hv' net.trafo.tap_neutral = 0 net.trafo.tap_min = -2 net.trafo.tap_max = 2 net.trafo.tap_step_percent = 1.25 net.trafo.tap_pos = 0 # --- run loadflow pp.runpp(net) DiscreteTapControl.from_tap_step_percent(net, tid=0, side='lv', vm_set_pu=0.98) logger.info("case1: low voltage") logger.info("before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) logger.info( "after DiscreteTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) assert net.trafo.tap_pos.at[0] == 1 # check if it changes the lower and upper limits net.controller.object.at[0].vm_set_pu = 1 pp.runpp(net, run_control=True) assert abs(net.controller.object.at[0].vm_upper_pu - 1.00725) < 1e-6 assert abs(net.controller.object.at[0].vm_lower_pu - 0.99275) < 1e-6 net.controller.object.at[0].vm_set_pu = 0.98 pp.runpp(net, run_control=True) assert abs(net.controller.object.at[0].vm_upper_pu - 0.98725) < 1e-6 assert abs(net.controller.object.at[0].vm_lower_pu - 0.97275) < 1e-6 # increase voltage from 1.0 pu to 1.03 pu net.ext_grid.vm_pu = 1.03 # switch back tap position net.trafo.tap_pos.at[0] = 0 pp.runpp(net) logger.info("case2: high voltage") logger.info("before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) logger.info( "after DiscreteTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) assert net.trafo.tap_pos.at[0] == 2 # reduce voltage from 1.03 pu to 0.969 pu net.ext_grid.vm_pu = 0.969 # switch back tap position net.trafo.tap_pos.at[0] = 0 pp.runpp(net) logger.info("case2: high voltage") logger.info("before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) logger.info( "after DiscreteTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) assert net.trafo.tap_pos.at[0] == -1
def test_continuous_tap_control_lv(): # --- load system and run power flow net = nw.simple_four_bus_system() pp.set_user_pf_options(net, init='dc', calculate_voltage_angles=True) # --- initial tap data net.trafo.tap_side = 'lv' net.trafo.tap_neutral = 0 net.trafo.tap_min = -2 net.trafo.tap_max = 2 net.trafo.tap_step_percent = 1.25 net.trafo.tap_pos = 0 # --- run loadflow pp.runpp(net) # todo: rewrite to not compare to hardcoded values tid = 0 ContinuousTapControl(net, tid=tid, vm_set_pu=0.99, side='lv') # DiscreteTapControl(net, tid=0, side='lv', vm_lower_pu=0.95, vm_upper_pu=0.99) logger.info("case1: low voltage") logger.info( "before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_trafo.vm_lv_pu.at[tid], net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) pp.runpp(net) logger.info( "after ContinuousTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_trafo.vm_lv_pu.values, net.trafo.tap_pos.values)) assert np.isclose(net.res_trafo.vm_lv_pu.at[tid], 0.99, atol=1e-3) assert np.isclose(net.trafo.tap_pos.values, -.528643) # increase voltage from 1.0 pu to 1.03 pu net.ext_grid.vm_pu = 1.03 # switch back tap position net.trafo.tap_pos.at[0] = 0 pp.runpp(net) logger.info("case2: high voltage") logger.info( "before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_trafo.vm_lv_pu.at[tid], net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) pp.runpp(net) logger.info( "after ContinuousTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_trafo.vm_lv_pu.at[tid], net.trafo.tap_pos.values)) assert np.isclose(net.trafo.tap_pos.values, -2) # increase voltage from 1.0 pu to 1.03 pu net.ext_grid.vm_pu = 0.98 # switch back tap position net.trafo.tap_pos.at[0] = 0 pp.runpp(net) logger.info("case2: high voltage") logger.info( "before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_trafo.vm_lv_pu.at[tid], net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) pp.runpp(net) logger.info( "after ContinuousTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_trafo.vm_lv_pu.at[tid], net.trafo.tap_pos.values)) assert np.isclose(net.res_trafo.vm_lv_pu.at[tid], 0.99, atol=1e-3) assert np.isclose(net.trafo.tap_pos.values, 1.077656)