Skip to content

Commit c328ae8

Browse files
committed
Pandapower_Converter: corrected total 3ph_line loading with max of loading of 3 phases to align with pandapower. corrected line input producing NaN with c_nf_per_km=0, tan value should be 0 in this case
Signed-off-by: furqan463 <[email protected]>
1 parent 2fae6d0 commit c328ae8

File tree

3 files changed

+23
-15
lines changed

3 files changed

+23
-15
lines changed

src/power_grid_model_io/converters/pandapower_converter.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -422,11 +422,11 @@ def _create_pgm_input_lines(self):
422422
pgm_lines["x1"] = self._get_pp_attr("line", "x_ohm_per_km", expected_type="f8") * multiplier
423423
pgm_lines["c1"] = c_nf_per_km * length_km * parallel * 1e-9
424424
# The formula for tan1 = R_1 / Xc_1 = (g * 1e-6) / (2 * pi * f * c * 1e-9) = g / (2 * pi * f * c * 1e-3)
425-
pgm_lines["tan1"] = (
426-
self._get_pp_attr("line", "g_us_per_km", expected_type="f8", default=0)
427-
/ c_nf_per_km
428-
/ (2 * np.pi * self.system_frequency * 1e-3)
429-
)
425+
pgm_lines["tan1"] = np.divide(
426+
self._get_pp_attr("line", "g_us_per_km", expected_type="f8", default=0),
427+
c_nf_per_km * (2 * np.pi * self.system_frequency * 1e-3),
428+
where=np.not_equal(c_nf_per_km, 0.0))
429+
pgm_lines["tan1"][np.equal(c_nf_per_km, 0.0)] = 0.0
430430
pgm_lines["i_n"] = (
431431
(self._get_pp_attr("line", "max_i_ka", expected_type="f8", default=np.nan) * 1e3)
432432
* self._get_pp_attr("line", "df", expected_type="f8", default=1)
@@ -435,11 +435,11 @@ def _create_pgm_input_lines(self):
435435
pgm_lines["r0"] = self._get_pp_attr("line", "r0_ohm_per_km", expected_type="f8", default=np.nan) * multiplier
436436
pgm_lines["x0"] = self._get_pp_attr("line", "x0_ohm_per_km", expected_type="f8", default=np.nan) * multiplier
437437
pgm_lines["c0"] = c0_nf_per_km * length_km * parallel * 1e-9
438-
pgm_lines["tan0"] = (
439-
self._get_pp_attr("line", "g0_us_per_km", expected_type="f8", default=0)
440-
/ c0_nf_per_km
441-
/ (2 * np.pi * self.system_frequency * 1e-3)
442-
)
438+
pgm_lines["tan0"] = np.divide(
439+
self._get_pp_attr("line", "g0_us_per_km", expected_type="f8", default=0),
440+
c0_nf_per_km * (2 * np.pi * self.system_frequency * 1e-3)
441+
,where=np.not_equal(c0_nf_per_km, 0.0))
442+
pgm_lines["tan0"][np.equal(c0_nf_per_km, 0.0)] = 0.0
443443
assert ComponentType.line not in self.pgm_input_data
444444
self.pgm_input_data[ComponentType.line] = pgm_lines
445445

@@ -1942,7 +1942,8 @@ def _pp_lines_output_3ph(self):
19421942
pp_output_lines_3ph["loading_c_percent"] = (
19431943
np.maximum(pp_output_lines_3ph["i_c_from_ka"], pp_output_lines_3ph["i_c_to_ka"]) / pgm_input_lines["i_n"]
19441944
) * 1e5
1945-
pp_output_lines_3ph["loading_percent"] = pgm_output_lines["loading"] * 1e2
1945+
pp_output_lines_3ph["loading_percent"] = np.maximum(np.maximum(pp_output_lines_3ph["loading_a_percent"], pp_output_lines_3ph["loading_b_percent"]),
1946+
pp_output_lines_3ph["loading_c_percent"])
19461947

19471948
assert "res_line_3ph" not in self.pp_output_data
19481949
self.pp_output_data["res_line_3ph"] = pp_output_lines_3ph

tests/data/pandapower/pp_validation.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,11 +208,11 @@ def pp_net_3ph_minimal_trafo():
208208
2,
209209
0.33,
210210
0.34,
211-
0.001,
211+
0.00,
212212
600,
213213
r0_ohm_per_km=0.66,
214214
x0_ohm_per_km=0.65,
215-
c0_nf_per_km=0.001,
215+
c0_nf_per_km=0.00,
216216
g_us_per_km=0,
217217
g0_us_per_km=0,
218218
)
@@ -235,5 +235,5 @@ def pp_net_3ph_minimal_trafo():
235235
mag0_rx=0,
236236
si0_hv_partial=0.9,
237237
)
238-
pp.create_asymmetric_load(net, 2, 0.2, 0.19, 0.195, 0.05, 0.045, 0.035, 0, type="wye")
238+
pp.create_asymmetric_load(net, 2, 0.2, 0.2, 0.2, 0.05, 0.05, 0.05, 0, type="wye")
239239
return net

tests/validation/converters/test_pandapower_converter_output.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,13 @@ def check_result(net):
153153
np.testing.assert_allclose(
154154
np.maximum(i_c_hv / i_max_hv, i_c_lv / i_max_lv) * 100, net.res_trafo_3ph.loading_c_percent
155155
)
156+
np.testing.assert_allclose(
157+
np.maximum(np.maximum(net.res_trafo_3ph.loading_a_percent, net.res_trafo_3ph.loading_b_percent),
158+
net.res_trafo_3ph.loading_c_percent), net.res_trafo_3ph.loading_percent)
159+
np.testing.assert_allclose(
160+
np.maximum(np.maximum(net.res_line_3ph.loading_a_percent, net.res_line_3ph.loading_b_percent),
161+
net.res_line_3ph.loading_c_percent), net.res_line_3ph.loading_percent)
162+
156163

157164
def compare_result(actual, expected, *, rtol):
158165
np.testing.assert_allclose(actual.trafo.vn_hv_kv, expected.trafo.vn_hv_kv, rtol=rtol)
@@ -192,7 +199,7 @@ def compare_result(actual, expected, *, rtol):
192199
pp.runpp_3ph(pp_net)
193200
check_result(pgm_net)
194201
check_result(pp_net)
195-
compare_result(pgm_net, pp_net, rtol=0.04)
202+
compare_result(pgm_net, pp_net, rtol=0.004)
196203

197204

198205
def test_output_data(output_data: Tuple[PandaPowerData, PandaPowerData]):

0 commit comments

Comments
 (0)