diff --git a/src/power_grid_model/validation/validation.py b/src/power_grid_model/validation/validation.py index aab61338ac..0536af0d90 100644 --- a/src/power_grid_model/validation/validation.py +++ b/src/power_grid_model/validation/validation.py @@ -328,6 +328,13 @@ def validate_required_values( "tap_max", "tap_size", ] + + # Regulators + required["regulator"] = required["base"] + ["regulated_object", "status"] + required["transformer_tap_regulator"] = required["regulator"] + if calculation_type is None or calculation_type == CalculationType.power_flow: + required["transformer_tap_regulator"] += ["control_side", "u_set", "u_band"] + # Appliances required["appliance"] = required["base"] + ["node", "status"] required["source"] = required["appliance"].copy() diff --git a/tests/unit/validation/test_input_validation.py b/tests/unit/validation/test_input_validation.py index f9adb2878a..c5b3e7bf23 100644 --- a/tests/unit/validation/test_input_validation.py +++ b/tests/unit/validation/test_input_validation.py @@ -156,6 +156,16 @@ def input_data() -> Dict[str, np.ndarray]: three_winding_transformer["pk_13_max"] = [-40, nan_type("three_winding_transformer", "pk_12_max"), 40, 50] three_winding_transformer["pk_23_max"] = [-120, nan_type("three_winding_transformer", "pk_12_max"), 40, 30] + transformer_tap_regulator = initialize_array("input", "transformer_tap_regulator", 4) + transformer_tap_regulator["id"] = [51, 52, 53, 1] + transformer_tap_regulator["status"] = [0, -1, 2, 5] + transformer_tap_regulator["regulated_object"] = [14, 15, 28, 2] + transformer_tap_regulator["control_side"] = [1, 2, 0, 60] + transformer_tap_regulator["u_set"] = [100, -100, 100, 100] + transformer_tap_regulator["u_band"] = [100, -4, 100, 0] + transformer_tap_regulator["line_drop_compensation_r"] = [0.0, -1.0, 1.0, 2.0] + transformer_tap_regulator["line_drop_compensation_x"] = [0.0, 4.0, 2.0, -4.0] + source = initialize_array("input", "source", 3) source["id"] = [16, 17, 1] source["node"] = [10, 1, 2] @@ -238,6 +248,7 @@ def input_data() -> Dict[str, np.ndarray]: "link": link, "transformer": transformer, "three_winding_transformer": three_winding_transformer, + "transformer_tap_regulator": transformer_tap_regulator, "source": source, "shunt": shunt, "sym_load": sym_load, @@ -273,6 +284,7 @@ def test_validate_input_data_sym_calculation(input_data): ("transformer", "id"), ("three_winding_transformer", "id"), ("fault", "id"), + ("transformer_tap_regulator", "id"), ], [ ("asym_gen", 1), @@ -301,6 +313,7 @@ def test_validate_input_data_sym_calculation(input_data): ("transformer", 1), ("three_winding_transformer", 1), ("fault", 1), + ("transformer_tap_regulator", 1), ], ) in validation_errors @@ -550,6 +563,31 @@ def test_validate_three_winding_transformer_ukpkminmax(input_data): assert NotGreaterOrEqualError("three_winding_transformer", "pk_23_max", [1], 0) in validation_errors +def test_validate_input_data_transformer_tap_regulator(input_data): + validation_errors = validate_input_data(input_data, calculation_type=CalculationType.power_flow) + assert NotBooleanError("transformer_tap_regulator", "status", [52, 1, 53]) in validation_errors + assert ( + InvalidIdError( + "transformer_tap_regulator", "regulated_object", [1], ["transformer", "three_winding_transformer"] + ) + in validation_errors + ) + assert ( + InvalidEnumValueError("transformer_tap_regulator", "control_side", [1], [BranchSide, Branch3Side]) + in validation_errors + ) + # TODO (nbharambe) Add control side error after it is included + # assert InvalidControlSideError("transformer_tap_regulator", "control_side", [52], BranchSide) in validation_errors + assert NotGreaterOrEqualError("transformer_tap_regulator", "u_set", [52], 0.0) in validation_errors + assert NotGreaterThanError("transformer_tap_regulator", "u_band", [52, 1], 0.0) in validation_errors + assert ( + NotGreaterOrEqualError("transformer_tap_regulator", "line_drop_compensation_r", [52], 0.0) in validation_errors + ) + assert ( + NotGreaterOrEqualError("transformer_tap_regulator", "line_drop_compensation_x", [1], 0.0) in validation_errors + ) + + def test_fault(input_data): validation_errors = validate_input_data(input_data, calculation_type=CalculationType.short_circuit) assert InvalidEnumValueError("fault", "fault_type", [50], FaultType) in validation_errors