def test_solver1(): sys1 = grid() sys1.read('./examples/kersting/kersting_ex6p1.json') # Load data sys1.pf_solver = 1 sys1.pf() # solve power flow sys1.get_v() # post process voltages sys1.get_i() # post process currents expected_results = { 'v_ab': 12469.993267073232, 'v_an': 7199.5507766249302, 'v_bc': 12469.99825654443, 'v_bn': 7199.5575295511126, 'v_ca': 12469.991908615197, 'v_cn': 7199.55569880254723, #'deg_an': -3.3473807241894507e-05, 'deg_bn': -120.00002841365294,'deg_cn': 119.99996507934871, #'deg_ng': 0.0, 'p_a': -1799999.9999999979, 'p_b': -1800000.0000000126, 'p_c': -1799999.9999999909, 'q_a': -871779.78870811954, 'q_b': -871779.78870815237, 'q_c': -871779.7887081306 } for item in expected_results: den = expected_results[item] if abs(den)<0.001: den = 0.001 relative_error = (sys1.buses[1][item] - expected_results[item])/den assert abs(relative_error)<0.001
def test_Ygd11_3w_SC(): data = {"buses":[{"bus": "Bus_1", "pos_x": 10.0, "pos_y": 0.0, "units": "m", "U_kV":20.0}, {"bus": "Bus_2", "pos_x": 15.0, "pos_y": 0.0, "units": "m", "U_kV":0.4}], "transformers":[{"bus_j": "Bus_1", "bus_k": "Bus_2", "S_n_kVA": 1000.0, "U_j_kV":20.0, "U_k_kV":0.4, "R_cc_pu": 0.01, "X_cc_pu":0.04, "connection": "Dyg11_3w", "conductors_j": 3, "conductors_k": 3}], "grid_formers":[{"bus": "Bus_1","bus_nodes": [1, 2, 3],"kV": [11.547, 11.547, 11.547], "deg": [0, 120, 240.0]}], "grid_feeders":[{"bus": "Bus_2","bus_nodes": [1, 2, 3],"kW": [0,0,0],"kvar": [0,0,0],"kA": [0,0,0], "phi_deg":[0, 0, 0]}]} # pydgrid calculation sys1 = grid() sys1.read(data) # Load data sys1.pf_solver = 1 sys1.pf() # solve power flow sys1.get_v() # post process voltages # positive sequence calculation U_1_n = data["transformers"][0]["U_j_kV"]*1000 U_2_n = data["transformers"][0]["U_k_kV"]*1000 r_t = U_1_n/U_2_n V_2_manual = U_1_n/np.sqrt(3)/r_t*np.exp(1j*np.deg2rad(30)) V_2_pydgrid = sys1.buses[1]['v_an']*np.exp(1j*np.deg2rad(sys1.buses[1]['deg_an'])) print('V_2_manual',V_2_manual) print('V_2_pydgrid',V_2_pydgrid) error = V_2_manual - V_2_pydgrid assert abs(error)<0.001
def test_Dyn11_SC(): ''' Short circuit like test ''' data = { "buses":[{"bus": "Bus_1", "pos_x": 10.0, "pos_y": 0.0, "units": "m", "U_kV":0.4}, {"bus": "Bus_2", "pos_x": 15.0, "pos_y": 0.0, "units": "m", "U_kV":0.4}], "transformers":[{"bus_j": "Bus_1", "bus_k": "Bus_2", "S_n_kVA": 1000.0, "U_j_kV":20.0, "U_k_kV":0.4, "R_cc_pu": 0.01, "X_cc_pu":0.04, "connection": "Dyn11", "conductors_j": 3, "conductors_k": 4}], "grid_formers":[{"bus": "Bus_1","bus_nodes": [1, 2, 3],"kV": [11.547, 11.547, 11.547], "deg": [0, 120, 240.0]}], "grid_feeders":[{"bus": "Bus_2","bus_nodes": [1, 2, 3],"kW": [0,0,0], "kvar": [0,0,0],"kA": [0,0,0], "phi_deg":[0, 0, 0]}], "shunts":[{"bus": "Bus_2" , "R": 0.001, "X": 0.0, "bus_nodes": [4,0]}, {"bus": "Bus_2" , "R": 1.0e-8, "X": 0.0, "bus_nodes": [1,0]}, {"bus": "Bus_2" , "R": 1.0e-8, "X": 0.0, "bus_nodes": [2,0]}, {"bus": "Bus_2" , "R": 1.0e-8, "X": 0.0, "bus_nodes": [3,0]}]} U_1_n = data["transformers"][0]["U_j_kV"]*1000 U_2_n = data["transformers"][0]["U_k_kV"]*1000 R_cc_pu = data["transformers"][0]["R_cc_pu"] X_cc_pu = data["transformers"][0]["X_cc_pu"] Z_cc_pu = R_cc_pu + 1j*X_cc_pu V_cc = np.abs(Z_cc_pu)*U_1_n/np.sqrt(3) V_cc_kV = V_cc/1000 data["grid_formers"][0]["kV"] = [V_cc_kV, V_cc_kV, V_cc_kV] # pydgrid calculation sys1 = grid() sys1.read(data) # Load data sys1.pf_solver = 1 sys1.pf() # solve power flow sys1.get_v() # post process voltages sys1.get_i() p_a,p_b,p_c = sys1.buses[0]['p_a'],sys1.buses[0]['p_b'],sys1.buses[0]['p_c'] p_cc = p_a + p_b + p_c i_1a_m = sys1.transformers[0]['i_1a_m'] R_cc_pydgrid = p_cc/(3*i_1a_m**2) Z_cc_pydgrid = V_cc/i_1a_m X_cc_pydgrid = np.sqrt(Z_cc_pydgrid**2 - R_cc_pydgrid**2) Z_b = U_1_n**2/1000.0e3 R_cc_pu_pydgrid = R_cc_pydgrid/Z_b X_cc_pu_pydgrid = X_cc_pydgrid/Z_b Z_cc_pu_pydgrid = R_cc_pu_pydgrid + 1j*X_cc_pu_pydgrid print('Z_cc_pu',Z_cc_pu) print('Z_cc_pu_pydgrid',Z_cc_pu_pydgrid) error = Z_cc_pu - Z_cc_pu_pydgrid assert abs(error)<0.001
"V_dc": 800.0, "soc_max_kWh": 300.0, "soc_ini_kWh": 100.0, "source_mode": "grid_former", "L": 1.0e-3, "R": 1.0, "R_0": 0.1, "R_1": 0.2, "C_1": 100.0, "K_v": 1.0, "K_ang": 0.0 } } } grid_1 = grid() grid_1.read(data) # Load data simu_1 = simu(data, grid_1) grid_1.pf() # solve power flow t = 0.0 ini_eval(t, grid_1.params_pf, simu_1.params_simu, simu_1.params_bess_vsc) T, V_nodes, I_nodes, X = run_eval(10, grid_1.params_pf, simu_1.params_simu, simu_1.params_bess_vsc) grid_1.get_v() # post process voltages grid_1.get_i() # post process currents #v_2_a,v_2_b,v_2_c,t = phasor2time(sys1.v_abc('Bus_3')) #i_2_a,i_2_b,i_2_c,t = phasor2time(sys1.i_abc('Bus_3'))
def test_no_gnd(): ''' Transformer without grounding. Fault from a phase to ground. Under this condition it is supposed that there are no fault currents and overvoltage is espected. ''' data = { "transformers": [{ "bus_j": "B0", "bus_k": "B1", "S_n_kVA": 1500.0, "U_j_kV": 66.0, "U_k_kV": 20.0, "R_cc_pu": 0.01, "X_cc_pu": 0.04, "connection": "Ygd11_3w", "conductors_1": 3, "conductors_2": 3 }], "lines": [{ "bus_j": "B1", "bus_k": "B2", "code": "pry_al_120", "m": 200.0 }], "buses": [{ "bus": "B0", "pos_x": 0, "pos_y": 0, "units": "m", "U_kV": 66.0 }, { "bus": "B1", "pos_x": 10, "pos_y": 0, "units": "m", "U_kV": 20.0 }, { "bus": "B2", "pos_x": 200, "pos_y": 0, "units": "m", "U_kV": 20.0 }], "grid_formers": [{ "bus": "B0", "bus_nodes": [1, 2, 3], "deg": [0, -120, -240], "kV": [38.105, 38.105, 38.105] }], "grid_feeders": [{ "bus": "B2", "bus_nodes": [1, 2, 3], "kW": [0, 0, 0], "kvar": [0, 0, 0], "kA": [0, 0, 0], "phi_deg": [30, 30, 30] }], "line_codes": { "pry_al_50": { "R1": 0.8, "X1": 0.148, "R0": 0.8, "X0": 0.148 }, "pry_al_95": { "R1": 0.403, "X1": 0.129, "R0": 0.403, "X0": 0.129 }, "pry_al_120": { "R1": 0.321, "X1": 0.123, "R0": 0.321, "X0": 0.321 }, "pry_al_185": { "R1": 0.209, "X1": 0.113, "R0": 0.209, "X0": 0.209 }, "pry_al_300": { "R1": 0.128, "X1": 0.105, "R0": 0.128, "X0": 0.128 } }, "shunts": [ { "bus": "B1", "R": 1e12, "X": 0.0, "bus_nodes": [1, 0] }, { "bus": "B1", "R": 1e12, "X": 0.0, "bus_nodes": [2, 0] }, { "bus": "B1", "R": 1e12, "X": 0.0, "bus_nodes": [3, 0] }, { "bus": "B2", "R": 1e-12, "X": 0.0, "bus_nodes": [1, 0] } # applied fault ] } grid_1 = grid() grid_1.read(data) # Load data grid_1.pf_solver = 1 grid_1.pf() # solve power flow grid_1.get_v() # post process voltages grid_1.get_i() # post process currents assert grid_1.buses[1]['v_an'] < 0.001 assert grid_1.buses[1]['v_bn'] > 20e3 * 0.999 assert grid_1.buses[1]['v_cn'] > 20e3 * 0.999 assert grid_1.lines[0]['i_a_m'] < 0.001
def test_zigzag_gnd(): ''' Transformer without grounding. Grounding with zig-zag. Fault from a phase to ground. Under this condition it is supposed that there are fault current limited by grounding impedance. Overvoltages should be less than in the previous ungrounded case. ''' Z_b = (20.0e3)**2 / 1500.0e3 Z_cc = (0.01 + 1j * 0.04) * Z_b data = { "transformers": [{ "bus_j": "Bus_0", "bus_k": "Bus_1", "S_n_kVA": 15000.0, "U_1_kV": 66.0, "U_2_kV": 20.0, "R_cc_pu": 0.01, "X_cc_pu": 0.04, "connection": "Ygd11_3w", "conductors_1": 3, "conductors_2": 3 }], "lines": [{ "bus_j": "Bus_1", "bus_k": "Bus_2", "code": "pry_al_120", "m": 0.1 }], "buses": [{ "bus": "Bus_0", "pos_x": 0, "pos_y": 0, "units": "m", "U_kV": 66.0 }, { "bus": "Bus_1", "pos_x": 10, "pos_y": 0, "units": "m", "U_kV": 20.0 }, { "bus": "Bus_2", "pos_x": 200, "pos_y": 0, "units": "m", "U_kV": 20.0 }], "grid_formers": [{ "bus": "Bus_0", "bus_nodes": [1, 2, 3], "deg": [0, -120, -240], "kV": [38.105, 38.105, 38.105] }], "grid_feeders": [{ "bus": "Bus_2", "bus_nodes": [1, 2, 3], "kW": [0, 0, 0], "kvar": [0, 0, 0], "kA": [0, 0, 0], "phi_deg": [30, 30, 30] }], "line_codes": { "pry_al_50": { "R1": 0.8, "X1": 0.148, "R0": 0.8, "X0": 0.148 }, "pry_al_95": { "R1": 0.403, "X1": 0.129, "R0": 0.403, "X0": 0.129 }, "pry_al_120": { "R1": 0.321, "X1": 0.123, "R0": 0.321, "X0": 0.321 }, "pry_al_185": { "R1": 0.209, "X1": 0.113, "R0": 0.209, "X0": 0.209 }, "pry_al_300": { "R1": 0.128, "X1": 0.105, "R0": 0.128, "X0": 0.128 } }, "shunts": [ { "bus": "Bus_2", "R": 1e-12, "X": 0.0, "bus_nodes": [1, 0] }, #{"bus": "Bus_2" , "R": 1e-12, "X": 0.0, "bus_nodes": [2,0]}, #{"bus": "Bus_2" , "R": 1e-12, "X": 0.0, "bus_nodes": [3,0]}, ], "groundings": [{ "bus": "Bus_1", "R_gnd": Z_cc.real, "X_gnd": Z_cc.imag, "conductors": 3 }] } grid_1 = grid() grid_1.read(data) # Load data grid_1.pf_solver = 1 grid_1.pf() # solve power flow grid_1.get_v() # post process voltages grid_1.get_i() # post process currents I_cc = np.abs((20.0e3 / np.sqrt(3)) / (Z_cc)) assert grid_1.buses[1]['v_an'] < 10.0 assert grid_1.buses[1]['v_bn'] < 20e3 * 0.9 assert grid_1.buses[1]['v_cn'] < 20e3 * 0.9 assert grid_1.lines[0]['i_a_m'] > I_cc * 0.8
"pry_al_185": { "R1": 0.209, "X1": 0.113, "R0": 0.209, "X0": 0.209 }, "pry_al_300": { "R1": 0.128, "X1": 0.105, "R0": 0.128, "X0": 0.128 } }, } sys1 = grid() sys1.read(data) # Load data sys1.pf() # solve power flow sys1.get_v() # post process voltages sys1.get_i() # post process currents v_2_a, v_2_b, v_2_c = phasor2time(sys1.v_abc('Bus_3')) i_2_a, i_2_b, i_2_c = phasor2time(sys1.i_abc('Bus_3')) p, q, q_lipo = pq(sys1.v_abc('Bus_3'), sys1.i_abc('Bus_3')) if __name__ == "__main__": pass # test_Dyn11() # test_Dyg11_3w()
def test_trafos_OC(): trafos_list = [ ('Dyn11', 'gnd_k', -30), ('Dyn1', 'gnd_k', 30), ('Dyg11_3w', '3wires', -30), ('Ynd11', 'gnd_j', -30), #('Ygd11_3w','3wires',-30), #('Ygd5_3w','3wires',-60), ('Yy_3wires', '3wires', 0) ] U_j_n = 20.0 # kV U_k_n = 0.42 # kV S_n = 630.0 # kVA V_j_n = U_j_n / np.sqrt(3) for connection, gnd, phase in trafos_list: if gnd == 'gnd_k': data = { "buses": [{ "bus": "Bus_1", "pos_x": 10.0, "pos_y": 0.0, "units": "m", "U_kV": U_j_n }, { "bus": "Bus_2", "pos_x": 15.0, "pos_y": 0.0, "units": "m", "U_kV": U_k_n }], "transformers": [{ "bus_j": "Bus_1", "bus_k": "Bus_2", "S_n_kVA": S_n, "U_j_kV": U_j_n, "U_k_kV": U_k_n, "R_cc_pu": 0.01, "X_cc_pu": 0.04, "connection": connection, "conductors_j": 3, "conductors_k": 4 }], "grid_formers": [{ "bus": "Bus_1", "bus_nodes": [1, 2, 3], "kV": [V_j_n, V_j_n, V_j_n], "deg": [0, 120, 240.0] }], "shunts": [{ "bus": "Bus_2", "R": 0.00001, "X": 0.0, "bus_nodes": [4, 0] }] } if gnd == '3wires': data = { "buses": [{ "bus": "Bus_1", "pos_x": 10.0, "pos_y": 0.0, "units": "m", "U_kV": U_j_n }, { "bus": "Bus_2", "pos_x": 15.0, "pos_y": 0.0, "units": "m", "U_kV": U_k_n }], "transformers": [{ "bus_j": "Bus_1", "bus_k": "Bus_2", "S_n_kVA": S_n, "U_j_kV": U_j_n, "U_k_kV": U_k_n, "R_cc_pu": 0.01, "X_cc_pu": 0.04, "connection": connection, "conductors_j": 3, "conductors_k": 3 }], "grid_formers": [{ "bus": "Bus_1", "bus_nodes": [1, 2, 3], "kV": [V_j_n, V_j_n, V_j_n], "deg": [0, 120, 240.0] }], "shunts": [{ "bus": "Bus_2", "R": 100.0e6, "X": 0.0, "bus_nodes": [1, 0] }] } # pydgrid calculation sys1 = grid() sys1.read(data) # Load data sys1.pf() # solve power flow # positive sequence calculation r_t_theoretic = U_j_n / U_k_n r_t_model = data["buses"][0]["v_ab"] / data["buses"][1]["v_ab"] error_rt = r_t_theoretic - r_t_model assert abs(error_rt) < 0.001 phase_shift_theoretic = phase phase_shift_model = data["buses"][0]["deg_an"] - data["buses"][1][ "deg_an"] error_angle = phase_shift_theoretic - phase_shift_model assert abs(error_angle) < 0.001
def test_trafos_SC(): trafos_list = [ ('Dyn11', 'gnd_k', -30), ('Dyn1', 'gnd_k', 30), ('Dyg11_3w', '3wires', -30), ('Ynd11', 'gnd_j', -30), ('Ygd11_3w', '3wires', -30), #('Ygd5_3w','3wires',-60), ('Yy_3wires', '3wires', 0) ] U_j_n = 20.0 # kV U_k_n = 0.42 # kV S_n = 630.0 # kVA R_cc_pu = 0.01 X_cc_pu = 0.04 I_nom = S_n * 1000 / (np.sqrt(3) * U_j_n * 1000.0) Z_base = (1000 * U_j_n)**2 / (S_n * 1000) Z_cc = (R_cc_pu + 1j * X_cc_pu) * Z_base V_j_n = np.abs(I_nom * Z_cc) / 1000.0 for connection, gnd, phase in trafos_list: if gnd == 'gnd_j': data = { "buses": [{ "bus": "Bus_1", "pos_x": 10.0, "pos_y": 0.0, "units": "m", "U_kV": U_j_n }, { "bus": "Bus_2", "pos_x": 15.0, "pos_y": 0.0, "units": "m", "U_kV": U_k_n }], "transformers": [{ "bus_j": "Bus_1", "bus_k": "Bus_2", "S_n_kVA": S_n, "U_j_kV": U_j_n, "U_k_kV": U_k_n, "R_cc_pu": 0.01, "X_cc_pu": 0.04, "connection": connection, "conductors_j": 4, "conductors_k": 3 }], "grid_formers": [{ "bus": "Bus_1", "bus_nodes": [1, 2, 3], "kV": [V_j_n, V_j_n, V_j_n], "deg": [0, 120, 240.0] }], "shunts": [{ "bus": "Bus_1", "R": 0.00001, "X": 0.0, "bus_nodes": [4, 0] }, { "bus": "Bus_2", "R": 0.00001, "X": 0.0, "bus_nodes": [1, 2] }, { "bus": "Bus_2", "R": 0.00001, "X": 0.0, "bus_nodes": [2, 3] }] } if gnd == 'gnd_k': data = { "buses": [{ "bus": "Bus_1", "pos_x": 10.0, "pos_y": 0.0, "units": "m", "U_kV": U_j_n }, { "bus": "Bus_2", "pos_x": 15.0, "pos_y": 0.0, "units": "m", "U_kV": U_k_n }], "transformers": [{ "bus_j": "Bus_1", "bus_k": "Bus_2", "S_n_kVA": S_n, "U_j_kV": U_j_n, "U_k_kV": U_k_n, "R_cc_pu": 0.01, "X_cc_pu": 0.04, "connection": connection, "conductors_j": 3, "conductors_k": 4 }], "grid_formers": [{ "bus": "Bus_1", "bus_nodes": [1, 2, 3], "kV": [V_j_n, V_j_n, V_j_n], "deg": [0, 120, 240.0] }], "shunts": [{ "bus": "Bus_2", "R": 0.00001, "X": 0.0, "bus_nodes": [4, 0] }, { "bus": "Bus_2", "R": 0.00001, "X": 0.0, "bus_nodes": [1, 2] }, { "bus": "Bus_2", "R": 0.00001, "X": 0.0, "bus_nodes": [2, 3] }] } if gnd == '3wires': data = { "buses": [{ "bus": "Bus_1", "pos_x": 10.0, "pos_y": 0.0, "units": "m", "U_kV": U_j_n }, { "bus": "Bus_2", "pos_x": 15.0, "pos_y": 0.0, "units": "m", "U_kV": U_k_n }], "transformers": [{ "bus_j": "Bus_1", "bus_k": "Bus_2", "S_n_kVA": S_n, "U_j_kV": U_j_n, "U_k_kV": U_k_n, "R_cc_pu": 0.01, "X_cc_pu": 0.04, "connection": connection, "conductors_j": 3, "conductors_k": 3 }], "grid_formers": [{ "bus": "Bus_1", "bus_nodes": [1, 2, 3], "kV": [V_j_n, V_j_n, V_j_n], "deg": [0, 120, 240.0] }], "shunts": [{ "bus": "Bus_2", "R": 0.00001, "X": 0.0, "bus_nodes": [1, 2] }, { "bus": "Bus_2", "R": 0.00001, "X": 0.0, "bus_nodes": [2, 3] }] } # pydgrid calculation sys1 = grid() sys1.read(data) # Load data sys1.pf() # solve power flow # positive sequence calculation r_t_theoretic = U_j_n / U_k_n i_1a_m = sys1.transformers[0]['i_1a_m'] i_2a_m = sys1.transformers[0]['i_2a_m'] r_t_model = i_2a_m / i_1a_m error_rt = r_t_theoretic - r_t_model assert abs(error_rt) < 100.0 i_1a_m = sys1.transformers[0]['i_1a_m'] print('I_nom', I_nom) print(connection, 'i_1a_m', i_1a_m) error_icc = (I_nom - i_1a_m) / I_nom assert abs(error_icc) < 0.001 i_1b_m = sys1.transformers[0]['i_1b_m'] print('I_nom', I_nom) print(connection, 'i_1b_m', i_1b_m) error_icc = (I_nom - i_1b_m) / I_nom assert abs(error_icc) < 0.001 i_1c_m = sys1.transformers[0]['i_1c_m'] print('I_nom', I_nom) print(connection, 'i_1c_m', i_1c_m) error_icc = (I_nom - i_1c_m) / I_nom assert abs(error_icc) < 0.001
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Fri Sep 8 09:15:54 2017 @author: jmmauricio """ import pydgrid sys1 = pydgrid.grid()
def test_pr_mt_h(): ''' Test that positive sequence phasor calculations match pydgrid result''' data = { "lines": [{ "bus_j": "Bus_1", "bus_k": "Bus_2", "code": "RX", "m": 200 }], "buses": [{ "bus": "Bus_1", "pos_x": 10, "pos_y": 0, "units": "m", "U_kV": 0.4 }, { "bus": "Bus_2", "pos_x": 200, "pos_y": 0, "units": "m", "U_kV": 0.4 }], "grid_formers": [{ "bus": "Bus_1", "bus_nodes": [1, 2, 3], "kV": [11.547, 11.547, 11.547], "deg": [0, 120, 240.0] }], "grid_feeders": [{ "bus": "Bus_2", "bus_nodes": [1, 2, 3], "kW": [0, 0, 0], "kvar": [0, 0, 0], "kA": [-0.245, -0.245, -0.245], "phi_deg": [-36.8698976, -36.8698976, -36.8698976] }], "line_codes": { "RX": { "R1": 0.277, "X1": 0.11, "R0": 0.0, "X0": 0.01 } } } # pydgrid calculation sys1 = grid() sys1.read(data) # Load data sys1.pf_solver = 1 sys1.pf() # solve power flow sys1.get_v() # post process voltages sys1.get_i() # post process currents # I_12_pydgrid = sys1.lines[0]['i_a_m'] # # # positive sequence "manual" calculation V_1_m = sys1.buses[0]['v_an'] V_2_m = sys1.buses[1]['v_an'] DV = V_1_m - V_2_m DU_pydgrid = np.sqrt(3) * DV DU_catalog = 24.41 # comparison error = DU_pydgrid - DU_catalog assert abs(error) < 0.001
def test_line_sequence_z(): ''' Test that positive sequence phasor calculations match pydgrid result''' data = { "lines": [{ "bus_j": "Bus_1", "bus_k": "Bus_2", "code": "RX", "m": 1000 }], "buses": [{ "bus": "Bus_1", "pos_x": 10, "pos_y": 0, "units": "m", "U_kV": 0.4 }, { "bus": "Bus_2", "pos_x": 200, "pos_y": 0, "units": "m", "U_kV": 0.4 }], "grid_formers": [{ "bus": "Bus_1", "bus_nodes": [1, 2, 3], "kV": [11.547, 11.547, 11.547], "deg": [0, 120, 240.0] }], "loads": [{ "bus": "Bus_2", "kVA": 2000.0, "pf": 0.9, "type": "3P" }], "line_codes": { "RX": { "R1": 0.8, "X1": 0.6, "R0": 2.4, "X0": 1.8 } } } # pydgrid calculation sys1 = grid() sys1.read(data) # Load data sys1.pf_solver = 1 sys1.pf() # solve power flow sys1.get_v() # post process voltages sys1.get_i() # post process currents I_12_pydgrid = sys1.lines[0]['i_a_m'] # positive sequence "manual" calculation V_1_m = sys1.buses[0]['v_an'] V_2_m = sys1.buses[1]['v_an'] theta_1 = np.deg2rad(sys1.buses[0]['deg_an']) theta_2 = np.deg2rad(sys1.buses[1]['deg_an']) V_1 = V_1_m * np.exp(1j * theta_1) V_2 = V_2_m * np.exp(1j * theta_2) R_1 = data["line_codes"]["RX"]["R1"] X_1 = data["line_codes"]["RX"]["X1"] Z_1 = R_1 + 1j * X_1 I_12_manual = np.abs((V_1 - V_2) / Z_1) # comparison error = I_12_manual - I_12_pydgrid assert abs(error) < 0.001
def test_vsc_leon(): p_ref = 600.0e3 q_ref = 200.0e3 data = { "lines": [{ "bus_j": "Bus_1", "bus_k": "Bus_2", "code": "UG1w3", "m": 200 }, { "bus_j": "Bus_1", "bus_k": "Bus_3", "code": "UG1w3", "m": 200 }], "buses": [{ "bus": "Bus_1", "pos_x": 0.0, "pos_y": 0, "units": "m", "U_kV": 0.4 }, { "bus": "Bus_2", "pos_x": 110.0, "pos_y": 20, "units": "m", "U_kV": 0.4 }, { "bus": "Bus_3", "pos_x": 110.0, "pos_y": -20, "units": "m", "U_kV": 0.4 }], "grid_formers": [{ "bus": "Bus_1", "bus_nodes": [1, 2, 3], "deg": [18.43101738, -103.41207707, 144.94884128], "kV": [0.24982762, 0.21600212, 0.22831829] }], "grid_feeders": [{ "bus": "Bus_2", "bus_nodes": [1, 2, 3], "kW": [0, 0, 0], "kvar": [0, 0, 0], "kA": [0, 0, 0], "phi_deg": [30, 30, 30] }, { "bus": "Bus_3", "bus_nodes": [1, 2, 3], "type": "vsc", "control_type": "pq_leon", "kW": p_ref / 1000, "kvar": q_ref / 1000, "L": 400e-6, "R": 0.01, "V_dc": 800.0 }], "line_codes": { "pry_al_50": { "R1": 0.8, "X1": 0.148, "R0": 0.8, "X0": 0.148 }, "pry_al_95": { "R1": 0.403, "X1": 0.129, "R0": 0.403, "X0": 0.129 }, "pry_al_120": { "R1": 0.321, "X1": 0.123, "R0": 0.321, "X0": 0.321 }, "pry_al_185": { "R1": 0.209, "X1": 0.113, "R0": 0.209, "X0": 0.209 }, "pry_al_300": { "R1": 0.128, "X1": 0.105, "R0": 0.128, "X0": 0.128 } }, } sys1 = grid() sys1.read(data) # Load data sys1.pf() # solve power flow sys1.get_v() # post process voltages sys1.get_i() # post process currents v_2_a, v_2_b, v_2_c, t = phasor2time(sys1.v_abc('Bus_3')) i_2_a, i_2_b, i_2_c, t = phasor2time(sys1.i_abc('Bus_3')) p, q, q_lipo, t = pq(sys1.v_abc('Bus_3'), sys1.i_abc('Bus_3')) assert np.abs(p_ref - np.average(p)) < 1.0 assert np.abs(q_ref - np.average(q)) < 1.0 assert np.abs(p_ref - np.max(p)) < 1.0 assert np.abs(p_ref - np.min(p)) < 1.0
def test_wind_farm_ss(): p_gen = 2000.0 # kW q_gen = 0 # kvar p_statcom = 0.0 # kW q_statcom = 0.0 # kvar data = { "lines": [ { "bus_j": "W1mv", "bus_k": "W2mv", "code": "mv_al_300", "m": 500 }, { "bus_j": "W2mv", "bus_k": "W3mv", "code": "mv_al_300", "m": 500 }, { "bus_j": "W3mv", "bus_k": "POImv", "code": "mv_al_300", "m": 500 }, { "bus_j": "POI", "bus_k": "GRID", "code": "hv_line", "m": 50.0e3 }, ], "buses": [ { "bus": "W1lv", "pos_x": -1500.0, "pos_y": 200.0, "units": "m", "U_kV": 0.69 }, { "bus": "W2lv", "pos_x": -1000.0, "pos_y": 200.0, "units": "m", "U_kV": 0.69 }, { "bus": "W3lv", "pos_x": -500.0, "pos_y": 200.0, "units": "m", "U_kV": 0.69 }, { "bus": "W1mv", "pos_x": -1500.0, "pos_y": 180.0, "units": "m", "U_kV": 20.0 }, { "bus": "W2mv", "pos_x": -1000.0, "pos_y": 180.0, "units": "m", "U_kV": 20.0 }, { "bus": "W3mv", "pos_x": -500.0, "pos_y": 180.0, "units": "m", "U_kV": 20.0 }, { "bus": "POImv", "pos_x": 0.0, "pos_y": 0.0, "units": "m", "U_kV": 20.0 }, { "bus": "POI", "pos_x": 100.0, "pos_y": 0.0, "units": "m", "U_kV": 66.0 }, { "bus": "GRID", "pos_x": 500.0, "pos_y": 0.0, "units": "m", "U_kV": 66.0 }, ], "transformers": [ { "bus_j": "POImv", "bus_k": "POI", "S_n_kVA": 10000.0, "U_1_kV": 20.0, "U_2_kV": 66.0, "R_cc_pu": 0.01, "X_cc_pu": 0.08, "connection": "Dyg11_3w", "conductors_1": 3, "conductors_2": 3 }, { "bus_j": "W1mv", "bus_k": "W1lv", "S_n_kVA": 2500.0, "U_1_kV": 20, "U_2_kV": 0.69, "R_cc_pu": 0.01, "X_cc_pu": 0.06, "connection": "Dyg11_3w", "conductors_1": 3, "conductors_2": 3 }, { "bus_j": "W2mv", "bus_k": "W2lv", "S_n_kVA": 2500.0, "U_1_kV": 20, "U_2_kV": 0.69, "R_cc_pu": 0.01, "X_cc_pu": 0.06, "connection": "Dyg11_3w", "conductors_1": 3, "conductors_2": 3 }, { "bus_j": "W3mv", "bus_k": "W3lv", "S_n_kVA": 2500.0, "U_1_kV": 20, "U_2_kV": 0.69, "R_cc_pu": 0.01, "X_cc_pu": 0.06, "connection": "Dyg11_3w", "conductors_1": 3, "conductors_2": 3 }, ], "grid_formers": [{ "bus": "GRID", "bus_nodes": [1, 2, 3], "kV": [38.105, 38.105, 38.105], "deg": [30, 150, 270.0] }], "grid_feeders": [ { "bus": "W1lv", "bus_nodes": [1, 2, 3], "kW": p_gen, "kvar": q_gen }, { "bus": "W2lv", "bus_nodes": [1, 2, 3], "kW": p_gen, "kvar": q_gen }, { "bus": "W3lv", "bus_nodes": [1, 2, 3], "kW": p_gen, "kvar": q_gen }, { "bus": "POImv", "bus_nodes": [1, 2, 3], "kW": p_statcom, "kvar": q_statcom } # STATCOM ], "groundings": [{ "bus": "POImv", "R_gnd": 32.0, "X_gnd": 0.0, "conductors": 3 }], "line_codes": { "mv_al_150": { "R1": 0.262, "X1": 0.118, "C_1_muF": 0.250 }, "mv_al_185": { "R1": 0.209, "X1": 0.113, "C_1_muF": 0.281 }, "mv_al_240": { "R1": 0.161, "X1": 0.109, "C_1_muF": 0.301 }, "mv_al_300": { "R1": 0.128, "X1": 0.105, "C_1_muF": 0.340 }, "hv_line": { "R1": 0.219, "X1": 0.365, "R0": 0.219, "X0": 0.365 } } } grid_1 = grid() grid_1.read(data) # Load data grid_1.pf() # solve power flow mon = grid_1.monitor(bus_from='POI', bus_to='GRID') assert abs(mon.P - 5910895.785662318) < 1 # from case resolved in november 2018 assert abs(mon.Q - ( -490329.45241958584)) < 10 # from case resolved in november 2018
def test_ieee4bus_Dyn11(): feet2m = 0.3048 mile2m = 1609.34 mile2km = mile2m / 1000 inch2m = 0.0253999368683 # Results from IEEE V2_ag = 12350 * np.exp(1j * np.deg2rad(29.6)) V2_bg = 12314 * np.exp(1j * np.deg2rad(-90.4)) V2_cg = 12333 * np.exp(1j * np.deg2rad(149.8)) V3_ag = 2290 * np.exp(1j * np.deg2rad(-32.4)) V3_bg = 2261 * np.exp(1j * np.deg2rad(-153.8)) V3_cg = 2214 * np.exp(1j * np.deg2rad(85.2)) V4_ag = 2157 * np.exp(1j * np.deg2rad(-34.2)) V4_bg = 1936 * np.exp(1j * np.deg2rad(-157.0)) V4_cg = 1849 * np.exp(1j * np.deg2rad(73.4)) I12_a = 285.7 * np.exp(1j * np.deg2rad(-27.6)) I12_b = 402.7 * np.exp(1j * np.deg2rad(-149.6)) I12_c = 349.1 * np.exp(1j * np.deg2rad(74.4)) I34_a = 695.5 * np.exp(1j * np.deg2rad(-66.0)) I34_b = 1033 * np.exp(1j * np.deg2rad(177.1)) I34_c = 1352 * np.exp(1j * np.deg2rad(55.2)) s_a = V4_ag * np.conj(I34_a) s_b = V4_bg * np.conj(I34_b) s_c = V4_cg * np.conj(I34_c) feet2m = 0.3048 data = { "lines": [{ "bus_j": "1", "bus_k": "2", "code": "4wires3", "m": 2000.0 * feet2m }, { "bus_j": "3", "bus_k": "4", "code": "4wires", "m": 2500.0 * feet2m }], "buses": [ { "bus": "1", "pos_x": 0, "pos_y": 0, "units": "m", "U_kV": 12.47 }, { "bus": "2", "pos_x": 2000.0 * feet2m, "pos_y": 0, "units": "m", "U_kV": 12.47 }, { "bus": "3", "pos_x": 2400.0 * feet2m, "pos_y": 0, "units": "m", "U_kV": 4.16 }, { "bus": "4", "pos_x": 4500.0 * feet2m, "pos_y": 0, "units": "m", "U_kV": 4.16 }, ], "grid_formers": [{ "bus": "1", "bus_nodes": [1, 2, 3], "kV": [7.2, 7.2, 7.2], "deg": [0, -120.0, 120.0] }], "transformers": [ { "bus_j": "2", "bus_k": "3", "S_n_kVA": 6000.0, "U_j_kV": 12.47, "U_k_kV": 4.16, "R_cc_pu": 0.01, "X_cc_pu": 0.06, "connection": "Dyn11", "conductors_j": 3, "conductors_k": 4 }, ], "loads": [{ "bus": "4", "kW": [s_a.real / 1000, s_b.real / 1000, s_c.real / 1000], "kvar": [s_a.imag / 1000, s_b.imag / 1000, s_c.imag / 1000], "type": "3P+N" }], "shunts": [{ "bus": "3", "R": 1.0e-8, "X": 0.0, "bus_nodes": [4, 0] }, { "bus": "4", "R": 1.0e-8, "X": 0.0, "bus_nodes": [4, 0] }], "line_codes": { "4wires": { 'GMR': [ 0.0244 * feet2m, 0.0244 * feet2m, 0.0244 * feet2m, 0.00814 * feet2m ], # m 'diam_c': [1.05 / 100] * 4, # m 'R_cond': [ 0.306 / mile2m, 0.306 / mile2m, 0.306 / mile2m, 0.592 / mile2m ], # Ohm/m 'pos_x': [-4 * feet2m, -1.5 * feet2m, 3.0 * feet2m, 0.0 * feet2m], 'pos_y': [28 * feet2m, 28 * feet2m, 28 * feet2m, 24 * feet2m], 'freq': 60.0 }, "3wires": { "R": [[0.45753751, 0.15593636, 0.15347119], [0.15593636, 0.4666138, 0.15799251], [0.15347119, 0.15799251, 0.46145871]], "X": [[1.07802078, 0.50165398, 0.38491254], [0.50165398, 1.04815115, 0.42362819], [0.38491254, 0.42362819, 1.06504486]], "unit": "miles" }, "4wires3": { "R": [[0.4576, 0.1559, 0.1535], [0.1559, 0.4666, 0.1580], [0.1535, 0.1580, 0.4615]], "X": [[1.4133, 0.8515, 0.7266], [0.8515, 1.4133, 0.7802], [0.7266, 0.7802, 1.4133]], "unit": "miles" }, } } grid_1 = grid() grid_1.read(data) # Load data grid_1.pf() # solve power flow error_v4_a = (abs(V4_ag) - abs(grid_1.res['4'].v_ag)) / abs(V4_ag) * 100 error_v4_b = (abs(V4_bg) - abs(grid_1.res['4'].v_bg)) / abs(V4_bg) * 100 error_v4_c = (abs(V4_cg) - abs(grid_1.res['4'].v_cg)) / abs(V4_cg) * 100 assert abs(error_v4_a) < 0.05 # as stated by Dugan assert abs(error_v4_b) < 0.05 # as stated by Dugan assert abs(error_v4_c) < 0.05 # as stated by Dugan
def test_monitor1(): data = { "transformers":[ {"bus_j": "Bus_MV", "bus_k": "Bus_LV", "S_n_kVA": 150.0, "U_1_kV":20.0, "U_2_kV":0.4, "R_cc_pu": 0.01, "X_cc_pu":0.04, "connection": "Dyn11", "conductors_1": 3, "conductors_2": 4} ], "lines":[ {"bus_j": "Bus_LV", "bus_k": "Client_1", "code": "UG1", "m": 100.0}, {"bus_j": "Client_1", "bus_k": "Bus_LV", "code": "UG2", "m": 100.0}, {"bus_j": "Client_1", "bus_k": "C1_c1", "code": "UG1", "m": 20.0}, {"bus_j": "Client_1", "bus_k": "C1_c2", "code": "UG1", "m": 30.0}, {"bus_j": "Client_2", "bus_k": "Bus_LV", "code": "UG1", "m": 200.0}, {"bus_j": "Client_2", "bus_k": "C2_c1", "code": "UG1", "m": 10.0} ], "buses":[ {"bus": "Bus_MV", "pos_x": 0, "pos_y": 0, "units": "m", "U_kV":20.0}, {"bus": "Bus_LV", "pos_x":10, "pos_y": 0, "units": "m", "U_kV":0.4}, {"bus": "Client_1", "pos_x":100, "pos_y": 20, "units": "m", "U_kV":0.4}, {"bus": "C1_c1", "pos_x":120, "pos_y": 30, "units": "m", "U_kV":0.4}, {"bus": "C1_c2", "pos_x":130, "pos_y": 10, "units": "m", "U_kV":0.4}, {"bus": "Client_2", "pos_x":200, "pos_y": -30, "units": "m", "U_kV":0.4}, {"bus": "C2_c1", "pos_x":210, "pos_y": -30, "units": "m", "U_kV":0.4} ], "grid_formers":[ {"bus": "Bus_MV", "bus_nodes": [1, 2, 3], "deg": [0, -120, -240], "kV": [11.547, 11.547, 11.547]} ], "grid_feeders":[{"bus": "C1_c1","bus_nodes": [1, 2, 3, 4], "kW": [0, 0, 0], "kvar": [0,0,0], "kA": [0,0,0], "phi_deg":[0, 0, 0]} ], "loads":[ {"bus": "C1_c2" , "kVA": 20.0, "pf": 0.8,"type":"3P"}, # {"bus": "C1_c2" , "kVA": 20.0, "pf": 0.8,"type":"1P+N","bus_nodes": [1,4]}, {"bus": "C2_c1" , "kVA": 30.0, "pf": 0.8,"type":"3P"}, ], "shunts":[ {"bus": "Bus_LV" , "R": 0.0001, "X": 0.0, "bus_nodes": [4,0]}, {"bus": "Bus_LV" , "R": 0.0001, "X": 0.0, "bus_nodes": [4,0]} ] } sys1 = grid() sys1.read(data) # Load data sys1.pf_solver = 1 sys1.pf() # solve power flow sys1.get_v() # post process voltages sys1.get_i() # post process currents mon1 = sys1.monitor('Client_1','Bus_LV') mon2 = sys1.monitor('Client_2','Bus_LV') results = {'P1': (-0.8*20*1000, mon1.P),#'Q1': (-0.6*20*100, mon1.Q), #'P2': (-0.8*30*1000, mon2.P),'Q2': (-0.6*30*100, mon2.Q) } for item in results: expected, obtained = results[item] error = expected - obtained assert abs(error)<100.0