def test_admittance_matrix_powell(self): filename = 'data/Sample-Powell-3.1.xlsx' builder = power_system_builder.ExcelPowerSystemBuilder(filename) system = builder.build_system() actual = system.admittance_matrix() expected = numpy.array( [[ 10.958904 - 25.997397j, -3.424658 + 7.534247j, -3.424658 + 7.534247j, 0j, -4.109589 + 10.958904j ], [ -3.424658 + 7.534247j, 11.672080 - 26.060948j, -4.123711 + 9.278351j, 0j, -4.123711 + 9.278351j ], [ -3.424658 + 7.534247j, -4.123711 + 9.278351j, 10.475198 - 23.119061j, -2.926829 + 6.341463j, 0j ], [ 0j, 0j, -2.926829 + 6.341463j, 7.050541 - 15.594814j, -4.123711 + 9.278351j ], [ -4.109589 + 10.958904j, -4.123711 + 9.278351j, 0j, -4.123711 + 9.278351j, 12.357012 - 29.485605j ]]) numpy.testing.assert_almost_equal(expected, actual, 6)
def build_solver(filename, max_active_power_error=0.001, max_reactive_power_error=0.001): builder = power_system_builder.ExcelPowerSystemBuilder(filename) return power_flow_solver.PowerFlowSolver( builder.build_system(), max_active_power_error=max_active_power_error, max_reactive_power_error=max_reactive_power_error)
def test_admittance_matrix(self): filename = 'data/Data.xlsx' builder = power_system_builder.ExcelPowerSystemBuilder(filename) system = builder.build_system() actual = system.admittance_matrix() expected = [[ 6.03 - 19.45j, -5 + 15.26j, 0, 0, -1.03 + 4.23j, 0, 0, 0, 0, 0, 0, 0 ], [ -5 + 15.26j, 9.52 - 30.27j, -1.14 + 4.78j, -1.69 + 5.12j, -1.7 + 5.19j, 0, 0, 0, 0, 0, 0, 0 ], [ 0, -1.14 + 4.78j, 2.54 - 5.11j, -1.4 + 0.36j, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, -1.69 + 5.12j, -1.4 + 0.36j, 9.93 - 28.83j, -6.84 + 21.58j, 0, 1.8j, 0, 0, 0, 0, 0 ], [ -1.03 + 4.23j, -1.7 + 5.19j, 0, -6.84 + 21.58j, 9.57 - 34.93j, 3.97j, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 3.97j, 6.58 - 17.34j, 0, 0, -1.96 + 4.09j, -1.53 + 3.18j, -3.10 + 6.10j, 0 ], [ 0, 0, 0, 1.8j, 0, 0, 5.33 - 15.19j, -3.9 + 10.37j, 0, 0, 0, -1.42 + 3.03j ], [ 0, 0, 0, 0, 0, 0, -3.9 + 10.37j, 5.78 - 14.77j, -1.88 + 4.4j, 0, 0, 0 ], [ 0, 0, 0, 0, 0, -1.96 + 4.09j, 0, -1.88 + 4.4j, 3.84 - 8.5j, 0, 0, 0 ], [ 0, 0, 0, 0, 0, -1.53 + 3.18j, 0, 0, 0, 4.01 - 5.43j, -2.49 + 2.25j, 0 ], [ 0, 0, 0, 0, 0, -3.1 + 6.1j, 0, 0, 0, -2.49 + 2.25j, 6.72 - 10.67j, -1.14 + 2.31j ], [ 0, 0, 0, 0, 0, 0, -1.42 + 3.03j, 0, 0, 0, -1.14 + 2.31j, 2.56 - 5.34j ]] numpy.testing.assert_almost_equal(actual, expected, 2)
def test_dlg_fault_currents(self): filename = 'data/data.xlsx' builder = power_system_builder.ExcelPowerSystemBuilder(filename, 'BusData', 'LineData', 0) ps = builder.build_system() fault = power_system_fault.FaultBuilder.build(ps, 'dlg', 5, 0.1) np.testing.assert_almost_equal(np.abs(fault.fault_current()), 4.36025, 2) np.testing.assert_equal(np.abs(fault.phase_current_a()), 0) np.testing.assert_almost_equal(np.abs(fault.phase_current_b()), 22.266, 1) np.testing.assert_almost_equal(np.abs(fault.phase_current_c()), 18.351, 1)
def test_dlg_fault_currents_hw04p4(self): filename = 'data/sample-hw04p4.xlsx' builder = power_system_builder.ExcelPowerSystemBuilder(filename, 'BusData', 'LineData', 0.01j) ps = builder.build_system() fault = power_system_fault.FaultBuilder.build(ps, 'dlg', 3, 0) np.testing.assert_almost_equal(np.abs(fault.fault_current()), 1.772, 3) np.testing.assert_equal(np.abs(fault.phase_current_a()), 0) np.testing.assert_almost_equal(np.abs(fault.phase_current_b()), 4.021, 3) np.testing.assert_almost_equal(np.abs(fault.phase_current_c()), 4.021, 3)
def test_ll_fault_currents(self): filename = 'data/data.xlsx' builder = power_system_builder.ExcelPowerSystemBuilder(filename, 'BusData', 'LineData', 0) ps = builder.build_system() fault = power_system_fault.FaultBuilder.build(ps, 'll', 4, 0) np.testing.assert_almost_equal(np.abs(fault.fault_current()), 20.53350, 2) np.testing.assert_equal(np.abs(fault.phase_current_a()), 0) np.testing.assert_almost_equal(np.abs(fault.phase_current_b()), 20.533, 3) np.testing.assert_almost_equal(np.abs(fault.phase_current_c()), 20.533, 3)
def test_slg_fault_currents(self): filename = 'data/data.xlsx' builder = power_system_builder.ExcelPowerSystemBuilder(filename, 'BusData', 'LineData', 0) ps = builder.build_system() fault = power_system_fault.FaultBuilder.build(ps, 'slg', 2, 0.1) np.testing.assert_almost_equal(np.abs(fault.fault_current()), 10.42942, 5) np.testing.assert_almost_equal(np.abs(fault.phase_current_a()), 10.429, 3) np.testing.assert_equal(np.abs(fault.phase_current_b()), 0) np.testing.assert_equal(np.abs(fault.phase_current_c()), 0)
def test_3p_fault_currents(self): # Compare the three phase fault currents to results from PowerWorld. filename = 'data/data.xlsx' builder = power_system_builder.ExcelPowerSystemBuilder(filename, 'BusData', 'LineData', 0) ps = builder.build_system() fault = power_system_fault.FaultBuilder.build(ps, '3p', 1, 0) np.testing.assert_almost_equal(np.abs(fault.fault_current()), 72.95155, 4) np.testing.assert_almost_equal(np.abs(fault.phase_current_a()), 72.952, 3) np.testing.assert_almost_equal(np.abs(fault.phase_current_b()), 72.950, 2) np.testing.assert_almost_equal(np.abs(fault.phase_current_c()), 72.950, 2)
def main(): args = parse_arguments() generator_neutral_impedance = 1j * args.generator_neutral_reactance builder = power_system_builder.ExcelPowerSystemBuilder( args.input_workbook, args.bus_data_worksheet, args.line_data_worksheet, generator_neutral_impedance) system = builder.build_system() fault_analyzer = fault_analyzer_builder.FaultAnalyzerBuilder.build( system, args.fault_type, args.fault_bus, args.fault_impedance) print(fault_analyzer.phase_a_current())
def test_admittance_matrix_2_hw04p4(self): filename = 'data/sample-hw04p4.xlsx' builder = power_system_builder.ExcelPowerSystemBuilder(filename, 'BusData', 'LineData', 0) ps = builder.build_system() actual = ps.admittance_matrix_2() expected = [[-21.11j, 3.33j, 3.33j, 3.33j], [3.33j, -17.78j, 3.33j, 0], [3.33j, 3.33j, -6.67j, 0], [3.33j, 0, 0, -3.33j]] np.testing.assert_array_almost_equal(actual, expected, 2)
def main(): args = parse_arguments() generator_neutral_impedance = 1j * args.generator_neutral_reactance builder = power_system_builder.ExcelPowerSystemBuilder( args.input_workbook, args.bus_data_worksheet, args.line_data_worksheet, generator_neutral_impedance) system = builder.build_system() fault = power_system_fault.PowerSystemFaultBuilder.build( system, args.fault_type, args.fault_bus_number, args.fault_impedance) print( power_system_fault_reporter.report(system, fault, args.results_bus_number))
def test_admittance_matrix_2(self): filename = 'data/data.xlsx' builder = power_system_builder.ExcelPowerSystemBuilder(filename, 'BusData', 'LineData', 0) ps = builder.build_system() actual = ps.admittance_matrix_1() expected = [[-80j, 20j, 0, 10j, 0, 0], [20j, -80j, 0, 0, 10j, 0], [0, 0, -67.14j, 7.14j, 0, 10j], [10j, 0, 7.14j, 0.96 - 37.53j, 20j, 0], [0, 10j, 0, 20j, 0.48 - 50.29j, 20j], [0, 0, 10j, 0, 20j, 1.07 - 30.39j]] np.testing.assert_array_almost_equal(actual, expected, 2)
def test_admittance_matrix_0(self): filename = 'data/data.xlsx' builder = power_system_builder.ExcelPowerSystemBuilder(filename, 'BusData', 'LineData', 0) ps = builder.build_system() actual = ps.admittance_matrix_0() expected = [[-10j, 6.67j, 0, 3.33j, 0, 0], [6.67j, -210j, 0, 0, 3.33j, 0], [0, 0, -205.71j, 2.38j, 0, 3.33j], [3.33j, 0, 2.38j, 0.96 - 12.76j, 6.67j, 0], [0, 3.33j, 0, 6.67j, 0.48 - 16.96j, 6.67j], [0, 0, 3.33j, 0, 6.67j, 1.07 - 10.39j]] np.testing.assert_array_almost_equal(actual, expected, 2)
def test_buses(self): filename = 'data/Sample-Powell-3.1.xlsx' builder = power_system_builder.ExcelPowerSystemBuilder(filename) actual = builder.build_buses() expected = [ power_system.Bus(1, 0, 0, 0, 1), power_system.Bus(2, 0.4, 0.2, 0, 1), power_system.Bus(3, 0.25, 0.15, 0, 1), power_system.Bus(4, 0.4, 0.2, 0, 1), power_system.Bus(5, 0.5, 0.2, 0, 1) ] self.assertListEqual(expected, actual)
def test_lines(self): filename = 'data/Sample-Powell-3.1.xlsx' builder = power_system_builder.ExcelPowerSystemBuilder(filename) actual = builder.build_lines() expected = [ power_system.Line(1, 2, 0.05 + 0.11j, 0.01j, None), power_system.Line(1, 3, 0.05 + 0.11j, 0.01j, None), power_system.Line(1, 5, 0.03 + 0.08j, 0.01j, None), power_system.Line(2, 3, 0.04 + 0.09j, 0.01j, None), power_system.Line(2, 5, 0.04 + 0.09j, 0.01j, None), power_system.Line(3, 4, 0.06 + 0.13j, 0.015j, None), power_system.Line(4, 5, 0.04 + 0.09j, 0.01j, None) ] self.assertListEqual(expected, actual)
def test_3p_fault_voltages_hw04p4(self): filename = 'data/sample-hw04p4.xlsx' builder = power_system_builder.ExcelPowerSystemBuilder(filename, 'BusData', 'LineData', 0.01j) ps = builder.build_system() fault = power_system_fault.FaultBuilder.build(ps, '3p', 3, 0) e_0 = fault.bus_voltages_0() e_1 = fault.bus_voltages_1() e_2 = fault.bus_voltages_2() a = np.exp(1j * np.deg2rad(120)) v_0 = np.add(e_0, np.add(e_1, e_2)) v_1 = e_0 + np.dot(a ** 2, e_1) + np.dot(a, e_2) v_2 = e_0 + np.dot(a, e_1) + np.dot(a ** 2, e_2) np.testing.assert_array_almost_equal(np.abs(v_0), [0.66667, 0.66666, 0, 0.66667], 1) np.testing.assert_array_almost_equal(np.abs(v_1), [0.66667, 0.66666, 0, 0.66667], 1) np.testing.assert_array_almost_equal(np.abs(v_2), [0.66667, 0.66666, 0, 0.66667], 1)
def main(): """Reads an input file containing system data and initiates power flow computations.""" args = parse_arguments() # Build the power system from an input file. start_voltage = args.start_voltage_magnitude * numpy.exp( 1j * numpy.deg2rad(args.start_voltage_angle)) builder = power_system_builder.ExcelPowerSystemBuilder( args.input_workbook, args.bus_data_worksheet, args.line_data_worksheet, start_voltage, args.power_base) system = builder.build_system() # Initialize the power flow. solver = power_flow_solver.PowerFlowSolver( system, args.swing_bus_number, args.max_active_power_error / args.power_base, args.max_reactive_power_error / args.power_base) # Iterate towards a solution. iteration = 1 print( power_system_reporter.largest_power_mismatch_report( iteration, solver.estimates, args.power_base)) while not solver.has_converged(): solver.step() print( power_system_reporter.largest_power_mismatch_report( iteration, solver.estimates, args.power_base)) iteration += 1 # Produce system reports. print( power_system_reporter.bus_voltage_report(system, args.min_operating_voltage, args.max_operating_voltage)) print( power_system_reporter.power_generation_report( solver.estimates, args.power_base, args.max_active_power_error, args.max_reactive_power_error)) print(power_system_reporter.line_power_report(system, args.power_base))
def test_admittance_matrix_nptel(self): filename = 'data/Sample-nptel.xlsx' builder = power_system_builder.ExcelPowerSystemBuilder(filename) system = builder.build_system() actual = system.admittance_matrix() expected = numpy.array( [[2.6923 - 13.4115j, -1.9231 + 9.6154j, 0, 0, -0.7692 + 3.8462j], [ -1.9231 + 9.6154j, 3.6538 - 18.1942j, -0.9615 + 4.8077j, 0, -0.7692 + 3.8462j ], [ 0, -0.9615 + 4.8077j, 2.2115 - 11.0027j, -0.7692 + 3.8462j, -0.4808 + 2.4038j ], [0, 0, -0.7692 + 3.8462j, 1.1538 - 5.6742j, -0.3846 + 1.9231j], [ -0.7692 + 3.8462j, -0.7692 + 3.8462j, -0.4808 + 2.4038j, -0.3846 + 1.9231j, 2.4038 - 11.8942j ]]) numpy.testing.assert_almost_equal(actual, expected, 4)