From 98535e35f013171626208acd4c377ed1711e04f2 Mon Sep 17 00:00:00 2001 From: Nitish Bharambe Date: Wed, 21 Aug 2024 13:38:06 +0200 Subject: [PATCH 1/2] clip i0 Signed-off-by: Nitish Bharambe --- src/power_grid_model_io/converters/pandapower_converter.py | 7 ++++++- tests/unit/converters/test_pandapower_converter_input.py | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/power_grid_model_io/converters/pandapower_converter.py b/src/power_grid_model_io/converters/pandapower_converter.py index 145afb93..d1afe3d6 100644 --- a/src/power_grid_model_io/converters/pandapower_converter.py +++ b/src/power_grid_model_io/converters/pandapower_converter.py @@ -747,8 +747,13 @@ def _create_pgm_input_transformers(self): # pylint: disable=too-many-statements pgm_transformers["sn"] = sn_mva * parallel * 1e6 pgm_transformers["uk"] = vk_percent * 1e-2 pgm_transformers["pk"] = vkr_percent * sn_mva * parallel * (1e6 * 1e-2) - pgm_transformers["i0"] = i_no_load * 1e-2 pgm_transformers["p0"] = pfe * parallel * 1e3 + pgm_transformers["i0"] = i_no_load * 1e-2 + if any(np.less(pgm_transformers["i0"], pgm_transformers["p0"] / pgm_transformers["sn"])): + logger.warning("Minimum value of i0 is clipped to p0/sn") + pgm_transformers["i0"] = np.clip( + pgm_transformers["i0"], a_min=pgm_transformers["p0"] / pgm_transformers["sn"], a_max=None + ) pgm_transformers["clock"] = clocks pgm_transformers["winding_from"] = winding_types["winding_from"] pgm_transformers["winding_to"] = winding_types["winding_to"] diff --git a/tests/unit/converters/test_pandapower_converter_input.py b/tests/unit/converters/test_pandapower_converter_input.py index 877b4295..00a8864c 100644 --- a/tests/unit/converters/test_pandapower_converter_input.py +++ b/tests/unit/converters/test_pandapower_converter_input.py @@ -822,6 +822,7 @@ def test_create_pgm_input_shunts(mock_init_array: MagicMock, two_pp_objs, conver @patch("power_grid_model_io.converters.pandapower_converter.initialize_array") @patch("power_grid_model_io.converters.pandapower_converter.np.round", new=lambda x: x) +@patch("power_grid_model_io.converters.pandapower_converter.np.less", new=lambda x, _, **kwargs: x) @patch("power_grid_model_io.converters.pandapower_converter.np.divide", new=lambda x, _, **kwargs: x) @patch("power_grid_model_io.converters.pandapower_converter.np.bitwise_and", new=lambda x, _: x) @patch("power_grid_model_io.converters.pandapower_converter.np.logical_and", new=lambda x, _: x) From 8be684733e19a74ca4e4c69aa7a8755f3034ff02 Mon Sep 17 00:00:00 2001 From: Nitish Bharambe Date: Wed, 21 Aug 2024 14:21:25 +0200 Subject: [PATCH 2/2] address comments Signed-off-by: Nitish Bharambe --- .../converters/pandapower_converter.py | 15 ++++++++------ .../test_pandapower_converter_input.py | 20 ++++++++++++++++--- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/power_grid_model_io/converters/pandapower_converter.py b/src/power_grid_model_io/converters/pandapower_converter.py index d1afe3d6..c272ec30 100644 --- a/src/power_grid_model_io/converters/pandapower_converter.py +++ b/src/power_grid_model_io/converters/pandapower_converter.py @@ -749,11 +749,10 @@ def _create_pgm_input_transformers(self): # pylint: disable=too-many-statements pgm_transformers["pk"] = vkr_percent * sn_mva * parallel * (1e6 * 1e-2) pgm_transformers["p0"] = pfe * parallel * 1e3 pgm_transformers["i0"] = i_no_load * 1e-2 - if any(np.less(pgm_transformers["i0"], pgm_transformers["p0"] / pgm_transformers["sn"])): - logger.warning("Minimum value of i0 is clipped to p0/sn") - pgm_transformers["i0"] = np.clip( - pgm_transformers["i0"], a_min=pgm_transformers["p0"] / pgm_transformers["sn"], a_max=None - ) + i0_min_threshold = pgm_transformers["p0"] / pgm_transformers["sn"] + if any(np.less(pgm_transformers["i0"], i0_min_threshold)): + logger.warning("Minimum value of i0_percent is clipped to p0/sn") + pgm_transformers["i0"] = np.clip(pgm_transformers["i0"], a_min=i0_min_threshold, a_max=None) pgm_transformers["clock"] = clocks pgm_transformers["winding_from"] = winding_types["winding_from"] pgm_transformers["winding_to"] = winding_types["winding_to"] @@ -880,8 +879,12 @@ def _create_pgm_input_three_winding_transformers(self): pgm_3wtransformers["pk_13"] = vkr_lv_percent * np.minimum(sn_hv_mva, sn_lv_mva) * (1e-2 * 1e6) pgm_3wtransformers["pk_23"] = vkr_mv_percent * np.minimum(sn_mv_mva, sn_lv_mva) * (1e-2 * 1e6) - pgm_3wtransformers["i0"] = self._get_pp_attr("trafo3w", "i0_percent", expected_type="f8") * 1e-2 pgm_3wtransformers["p0"] = self._get_pp_attr("trafo3w", "pfe_kw", expected_type="f8") * 1e3 + pgm_3wtransformers["i0"] = self._get_pp_attr("trafo3w", "i0_percent", expected_type="f8") * 1e-2 + i0_min_threshold = pgm_3wtransformers["p0"] / pgm_3wtransformers["sn_1"] + if any(np.less(pgm_3wtransformers["i0"], i0_min_threshold)): + logger.warning("Minimum value of i0_percent is clipped to p0/sn_1") + pgm_3wtransformers["i0"] = np.clip(pgm_3wtransformers["i0"], a_min=i0_min_threshold, a_max=None) pgm_3wtransformers["clock_12"] = clocks_12 pgm_3wtransformers["clock_13"] = clocks_13 pgm_3wtransformers["winding_1"] = winding_types["winding_1"] diff --git a/tests/unit/converters/test_pandapower_converter_input.py b/tests/unit/converters/test_pandapower_converter_input.py index 00a8864c..b25a04f4 100644 --- a/tests/unit/converters/test_pandapower_converter_input.py +++ b/tests/unit/converters/test_pandapower_converter_input.py @@ -1032,7 +1032,14 @@ def test_create_pgm_input_sym_gens(mock_init_array: MagicMock, two_pp_objs, conv @pytest.mark.parametrize( "kwargs", - [{"vk0_percent": 2}, {"vkr0_percent": 1}, {"mag0_percent": 5}, {"mag0_rx": 0.2}, {"si0_hv_partial": 0.3}], + [ + {"pfe_kw": 2}, + {"vk0_percent": 2}, + {"vkr0_percent": 1}, + {"mag0_percent": 5}, + {"mag0_rx": 0.2}, + {"si0_hv_partial": 0.3}, + ], ) @patch( "power_grid_model_io.converters.pandapower_converter.PandaPowerConverter.get_switch_states", @@ -1050,11 +1057,14 @@ def test_create_pgm_input_sym_gens(mock_init_array: MagicMock, two_pp_objs, conv "power_grid_model_io.converters.pandapower_converter.PandaPowerConverter._get_pgm_ids", new=MagicMock(return_value=pd.Series([0])), ) -def test_create_pgm_input_transformers__zero_sequence(kwargs) -> None: +def test_create_pgm_input_transformers__warnings(kwargs) -> None: # Arrange pp_net: pp.pandapowerNet = pp.create_empty_network() pp.create_bus(net=pp_net, vn_kv=0.0) args = [0, 0, 0, 0, 0, 0, 0, 0, 0] + if "pfe_kw" in kwargs: + args[-2] = kwargs["pfe_kw"] + kwargs = {} pp.create_transformer_from_parameters(pp_net, *args, **kwargs) converter = PandaPowerConverter() @@ -1388,6 +1398,7 @@ def test_create_pgm_input_transformers3w__default() -> None: @pytest.mark.parametrize( "kwargs", [ + {"pfe_kw": 2}, {"vk0_hv_percent": 1}, {"vkr0_hv_percent": 2}, {"vk0_mv_percent": 3}, @@ -1412,11 +1423,14 @@ def test_create_pgm_input_transformers3w__default() -> None: "power_grid_model_io.converters.pandapower_converter.PandaPowerConverter._get_pgm_ids", new=MagicMock(return_value=pd.Series([0])), ) -def test_create_pgm_input_transformers3w__zero_sequence(kwargs) -> None: +def test_create_pgm_input_transformers3w__warnings(kwargs) -> None: # Arrange pp_net: pp.pandapowerNet = pp.create_empty_network() pp.create_bus(net=pp_net, vn_kv=0.0) args = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + if "pfe_kw" in kwargs: + args[-2] = kwargs["pfe_kw"] + kwargs = {} pp.create_transformer3w_from_parameters(pp_net, *args, **kwargs) converter = PandaPowerConverter()