Skip to content

Commit 4710bf3

Browse files
authored
Merge pull request #132 from alliander-opensource/feature/asym-conversion
Pandapower asymmetrical input and output conversion
2 parents d8dd031 + 7aecd08 commit 4710bf3

File tree

8 files changed

+1532
-82
lines changed

8 files changed

+1532
-82
lines changed

src/power_grid_model_io/converters/pandapower_converter.py

Lines changed: 615 additions & 49 deletions
Large diffs are not rendered by default.
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
{
2+
"node":
3+
[
4+
{"id": 0, "energized": 1, "u_pu": [1.000000000042805, 1.000000000042805, 1.0000000000409561], "u": [63508.52961357733, 63508.52961357733, 63508.529613459905], "u_angle": [-2.297462191765614e-10, -2.0943951026229417, 2.094395102852041], "id_reference": {"table": "bus", "index": 101}},
5+
{"id": 1, "energized": 1, "u_pu": [0.9994132656313264, 0.9994132656313274, 1.0028441672876542], "u": [11540.230358878587, 11540.230358878598, 11579.846998775467], "u_angle": [-0.002501623712801432, -2.096896726105997, 2.098735152107258], "id_reference": {"table": "bus", "index": 102}},
6+
{"id": 2, "energized": 1, "u_pu": [0.9987870960752929, 0.9987870960752938, 1.0044185118118363], "u": [11532.999975643901, 11532.999975643912, 11598.02596347214], "u_angle": [-0.0029669869206139484, -2.09736208931381, 2.099116406819713], "id_reference": {"table": "bus", "index": 103}},
7+
{"id": 3, "energized": 1, "u_pu": [1.000000000042805, 1.000000000042805, 1.0000000000409561], "u": [63508.52961357733, 63508.52961357733, 63508.529613459905], "u_angle": [-2.297462191765614e-10, -2.0943951026229417, 2.094395102852041], "id_reference": {"table": "bus", "index": 106}}
8+
],
9+
"line":
10+
[
11+
{"id": 4, "energized": 1, "loading": 1.2653300322380716, "p_from": [-729999.9999998733, -730000.000000165, 1570000.0000001346], "q_from": [189999.99999999956, 190000.00000034677, 189999.9999996292], "i_from": [65.40543555178559, 65.40543555181758, 136.35553422751582], "s_from": [754320.8866257217, 754320.8866260914, 1581455.0262338421], "p_to": [730552.3008243673, 730552.3008246894, -1567616.527443881], "q_to": [-216633.74695133892, -216633.74695158977, -216173.52394784882], "i_to": [66.02947091323357, 66.02947091326645, 136.65564348171173], "s_to": [761995.3048135885, 761995.3048139686, 1582451.4430374296], "id_reference": {"table": "line", "index": 101}, "pgm_input": {"from_node": 2, "to_node": 1, "i_n": 108.0}}
12+
],
13+
"source":
14+
[
15+
{"id": 5, "energized": 1, "p": [765820.730621319, 765820.4766903995, -1529485.2196447744], "q": [-142683.64286082785, -142684.1067247107, -136520.40313344038], "i": [12.266058929171775, 12.266056336254893, 24.17889348713215], "s": [778999.36674519, 778999.2020728515, 1535565.9730482248], "pf": [0.9830826099654819, 0.9830824918082272, -0.9960400572100595], "id_reference": {"table": "ext_grid", "index": 0}, "pgm_input": {"node": 0}}
16+
],
17+
"sym_load":
18+
[
19+
{"id": 6, "energized": 1, "p": [833333.3333333333, 833333.3333333333, 833333.3333333333], "q": [79999.99999999999, 79999.99999999999, 79999.99999999999], "i": [72.58861772969922, 72.58861772969915, 72.18163928458914], "s": [837164.5265086454, 837164.5265086454, 837164.5265086454], "pf": [0.9954236078405162, 0.9954236078405162, 0.9954236078405162], "id_reference": {"table": "load", "name": "const_power", "index": 101}, "pgm_input": {"node": 2}},
20+
{"id": 7, "energized": 1, "p": [0.0, 0.0, 0.0], "q": [0.0, 0.0, 0.0], "i": [0.0, 0.0, 0.0], "s": [0.0, 0.0, 0.0], "pf": [0.0, 0.0, 0.0], "id_reference": {"table": "load", "name": "const_impedance", "index": 101}, "pgm_input": {"node": 2}},
21+
{"id": 8, "energized": 1, "p": [0.0, 0.0, 0.0], "q": [0.0, 0.0, 0.0], "i": [0.0, 0.0, 0.0], "s": [0.0, 0.0, 0.0], "pf": [0.0, 0.0, 0.0], "id_reference": {"table": "load", "name": "const_current", "index": 101}, "pgm_input": {"node": 2}}
22+
],
23+
"transformer":
24+
[
25+
{"id": 9, "energized": 1, "loading": 0.03883052565830863, "p_from": [765820.724989093, 765820.7249890427, -1529485.491438911], "q_from": [-142683.60010968833, -142683.60010993064, -136520.3668874493], "i_from": [12.266058718690484, 12.266058718690402, 24.17889769909201], "s_from": [778999.3533778327, 778999.3533778277, 1535566.2405436018], "p_to": [-730552.3008242727, -730552.300824217, 1567616.5274441042], "q_to": [216633.7469512629, 216633.74695157827, 216173.52394822074], "i_to": [66.02947091322386, 66.02947091322693, 136.6556434817352], "s_to": [761995.3048134763, 761995.3048135125, 1582451.4430377013], "id_reference": {"table": "trafo", "index": 0}, "pgm_input": {"from_node": 0, "to_node": 1}, "pp_input": {"df": 1.0}}
26+
],
27+
"sym_gen":
28+
[
29+
{"id": 10, "energized": 1, "p": [403333.3333333333, 403333.3333333333, 403333.3333333333], "q": [269999.99999999994, 269999.99999999994, 269999.99999999994], "i": [42.084761397537456, 42.08476139753742, 41.84880717644763], "s": [485363.5521727787, 485363.5521727787, 485363.5521727787], "pf": [0.8309922150680065, 0.8309922150680065, 0.8309922150680065], "id_reference": {"table": "sgen", "index": 31}, "pgm_input": {"node": 2}}
30+
],
31+
"link":
32+
[
33+
{"id": 11, "energized": 1, "loading": 0.0, "p_from": [0.0, -0.0, 0.0], "q_from": [-0.0, 0.0, 0.0], "i_from": [0.0, 0.0, 0.0], "s_from": [0.0, 0.0, 0.0], "p_to": [0.0, -0.0, 0.0], "q_to": [-0.0, 0.0, 0.0], "i_to": [0.0, 0.0, 0.0], "s_to": [0.0, 0.0, 0.0], "id_reference": {"table": "switch", "name": "b2b_switches", "index": 3021}, "pgm_input": {"from_node": 0, "to_node": 3}}
34+
],
35+
"asym_load":
36+
[
37+
{"id": 12, "energized": 1, "p": [399999.99999999994, 500000.0, 1000000.0], "q": [10000.0, 10000.0, 10000.0], "i": [34.69392016993495, 43.36252415313805, 86.22588032650638], "s": [400124.98047485104, 500099.9900019995, 1000049.9987500625], "pf": [0.9996876464081228, 0.999800059980007, 0.9999500037496875], "id_reference": {"table": "asymmetric_load", "index": 33}, "pgm_input": {"node": 2}}
38+
],
39+
"asym_gen":
40+
[
41+
{"id": 13, "energized": 1, "p": [99999.99999999999, 199999.99999999997, 3000000.0], "q": [10000.0, 10000.0, 10000.0], "i": [8.71401685801165, 17.363205095630597, 258.6661450895947], "s": [100498.7562112089, 200249.84394500783, 3000016.6666203705], "pf": [0.9950371902099889, 0.9987523388778446, 0.9999944444907404], "id_reference": {"table": "asymmetric_sgen", "index": 32}, "pgm_input": {"node": 2}}
42+
]
43+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
SPDX-FileCopyrightText: 2022 Contributors to the Power Grid Model project <dynamic.grid.calculation@alliander.com>
2+
3+
SPDX-License-Identifier: MPL-2.0

tests/data/pandapower/pgm_output_data.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
],
1111
"line":
1212
[
13-
{"id": 6, "energized": 1, "loading": 0.5930290459172566, "p_from": -1763554.1135053905, "q_from": -1245081.6865976173, "i_from": 64.0471369590637, "s_from": 2158784.7316401307, "p_to": 1765096.6771171533, "q_to": 1169229.7700732222, "i_to": 62.767063741949805, "s_to": 2117230.39246925, "id_reference": {"table": "line", "index": 101}, "pgm_input": {"from_node": 2, "to_node": 1}}
13+
{"id": 6, "energized": 1, "loading": 0.5930290459172566, "p_from": -1763554.1135053905, "q_from": -1245081.6865976173, "i_from": 64.0471369590637, "s_from": 2158784.7316401307, "p_to": 1765096.6771171533, "q_to": 1169229.7700732222, "i_to": 62.767063741949805, "s_to": 2117230.39246925, "id_reference": {"table": "line", "index": 101}, "pgm_input": {"from_node": 2, "to_node": 1, "i_n": 108.0}}
1414
],
1515
"source":
1616
[

tests/data/pandapower/pp_validation.py

Lines changed: 93 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ def pp_net() -> pp.pandapowerNet:
2323
pp.create_bus(net, index=104, vn_kv=30.1)
2424
pp.create_bus(net, index=105, vn_kv=60)
2525
pp.create_bus(net, index=106, vn_kv=110)
26-
pp.create_ext_grid(net, index=1, in_service=True, bus=101, vm_pu=1, s_sc_max_mva=1e10, rx_max=0, va_degree=0)
26+
pp.create_ext_grid(
27+
net, index=1, in_service=True, bus=101, vm_pu=1, s_sc_max_mva=1e10, rx_max=0, va_degree=0, r0x0_max=0
28+
)
2729
pp.create_transformer_from_parameters(
2830
net,
2931
index=101,
@@ -100,3 +102,93 @@ def pp_net() -> pp.pandapowerNet:
100102
)
101103

102104
return net
105+
106+
107+
@lru_cache
108+
def pp_net_3ph() -> pp.pandapowerNet:
109+
"""
110+
Creates a pandapower net used for validating 3 phase calculations
111+
112+
(ext #1) shunt - [104], sym_gen - [105], motor, ward, asym_load, asym_gen
113+
| |
114+
[101] ---OO- [102] ---------- [103]
115+
| |
116+
-/- (load #31)
117+
|
118+
[106]
119+
120+
Returns:
121+
122+
"""
123+
124+
net = pp.create_empty_network(f_hz=50)
125+
pp.create_bus(net, index=101, vn_kv=110)
126+
pp.create_bus(net, index=102, vn_kv=20)
127+
pp.create_bus(net, index=103, vn_kv=20)
128+
pp.create_bus(net, index=106, vn_kv=110)
129+
pp.create_ext_grid(
130+
net, index=0, in_service=True, bus=101, vm_pu=1, s_sc_max_mva=1e10, rx_max=0, va_degree=0, r0x0_max=0, x0x_max=1
131+
)
132+
pp.create_transformer_from_parameters(
133+
net,
134+
index=0,
135+
hv_bus=101,
136+
lv_bus=102,
137+
i0_percent=0.3,
138+
pfe_kw=51.6,
139+
vkr_percent=4.0,
140+
sn_mva=40,
141+
vn_lv_kv=20.0,
142+
vn_hv_kv=110.0,
143+
vk_percent=8.9,
144+
vector_group="YNyn",
145+
shift_degree=0,
146+
tap_side="hv",
147+
tap_pos=1,
148+
tap_min=-1,
149+
tap_max=3,
150+
tap_step_percent=2,
151+
tap_neutral=1,
152+
parallel=2,
153+
vk0_percent=8.9,
154+
vkr0_percent=4.0,
155+
mag0_percent=374531.83520599245,
156+
mag0_rx=0.47628073,
157+
si0_hv_partial=0.9,
158+
in_service=True,
159+
)
160+
pp.create_line_from_parameters(
161+
net,
162+
index=101,
163+
from_bus=103,
164+
to_bus=102,
165+
length_km=1.23,
166+
parallel=2,
167+
df=0.2,
168+
r_ohm_per_km=0.208,
169+
x_ohm_per_km=0.08,
170+
c_nf_per_km=261.0,
171+
r0_ohm_per_km=0.208,
172+
x0_ohm_per_km=0.08,
173+
c0_nf_per_km=261.0,
174+
max_i_ka=0.27,
175+
)
176+
pp.create_load(net, index=101, bus=103, p_mw=2.5, q_mvar=0.24, const_i_percent=0.0, const_z_percent=0)
177+
pp.create_switch(net, index=101, et="l", bus=103, element=101, closed=True)
178+
pp.create_switch(net, index=3021, et="b", bus=101, element=106, closed=True)
179+
pp.create_switch(net, index=321, et="t", bus=101, element=0, closed=True)
180+
pp.create_sgen(net, index=31, bus=103, p_mw=1.21, q_mvar=0.81)
181+
pp.create_asymmetric_sgen(
182+
net, index=32, bus=103, p_a_mw=0.1, p_b_mw=0.2, p_c_mw=3, q_a_mvar=0.01, q_b_mvar=0.01, q_c_mvar=0.01
183+
)
184+
pp.create_asymmetric_load(
185+
net, index=33, bus=103, p_a_mw=0.4, p_b_mw=0.5, p_c_mw=1, q_a_mvar=0.01, q_b_mvar=0.01, q_c_mvar=0.01
186+
)
187+
# TODO Shunt motor ward are not validated.
188+
# pp.create_shunt(net, index=1201, in_service=True, bus=103, p_mw=1, q_mvar=1, step=1)
189+
# pp.create_ward(net, index=34, bus=103, ps_mw=0.1, qs_mvar=0.1, pz_mw=0.1, qz_mvar=0.1)
190+
# pp.create_motor(
191+
# net, bus=103, index=12, pn_mech_mw=0.1, cos_phi=0.9, loading_percent=80, efficiency_percent=90, scaling=0.8
192+
# )
193+
194+
return net

0 commit comments

Comments
 (0)