From 5bfdf3478b1da80db1a3f51f6edf6afe143bc2d0 Mon Sep 17 00:00:00 2001 From: mscharf Date: Fri, 6 Apr 2018 14:22:23 +0200 Subject: [PATCH 01/40] cleaned up make_objective.py (issue #27) --- pandapower/opf/make_objective.py | 71 +++++++++++++++++-------------- pandapower/test/opf/test_basic.py | 4 +- 2 files changed, 40 insertions(+), 35 deletions(-) diff --git a/pandapower/opf/make_objective.py b/pandapower/opf/make_objective.py index 3209ba021..f27d5a80f 100644 --- a/pandapower/opf/make_objective.py +++ b/pandapower/opf/make_objective.py @@ -8,6 +8,7 @@ # Energy System Technology (IWES), Kassel. All rights reserved. Use of this source code is governed # by a BSD-style license that can be found in the LICENSE file. +import pandas as pd from numpy import zeros, array, concatenate, power from pandapower.idx_cost import MODEL, NCOST, COST @@ -77,50 +78,51 @@ def _make_objective(ppci, net): ppci["gencost"] = zeros((len_gencost, 4 + n_coefficients), dtype=float) ppci["gencost"][:, MODEL:COST] = array([2, 0, 0, n_coefficients]) - for cost_type in ["p", "q"]: - - if cost_type == "q": - shift_idx = ng - sign_corr = -1 - else: - shift_idx = 0 - sign_corr = 1 - - for el in ["gen", "sgen", "ext_grid", "load", "storage", "dcline"]: - - if el == "gen": - idx = gen_idx - elif el == "sgen": - idx = sgen_idx - elif el == "ext_grid": - idx = eg_idx - elif el == "load": - idx = load_idx - elif el == "storage": - idx = stor_idx - elif el == "dcline": - idx = dcline_idx + if len(net.piecewise_linear_cost): + for cost_type in ["p", "q"]: + if (net.piecewise_linear_cost.type == cost_type).any(): + costs = net.piecewise_linear_cost[net.piecewise_linear_cost.type == cost_type].reset_index( + drop=True) - if len(net.piecewise_linear_cost): + if cost_type == "q": + shift_idx = ng + sign_corr = -1 + else: + shift_idx = 0 + sign_corr = 1 - if (net.piecewise_linear_cost.type == cost_type).any(): - costs = net.piecewise_linear_cost[ - net.piecewise_linear_cost.type == cost_type].reset_index(drop=True) + # for element types with costs defined + #for el in ["gen", "sgen", "ext_grid", "load", "storage", "dcline"]: + for el in pd.unique(costs.element_type): if not costs.element[costs.element_type == el].empty: + if el == "gen": + idx = gen_idx + elif el == "sgen": + idx = sgen_idx + elif el == "ext_grid": + idx = eg_idx + elif el == "load": + idx = load_idx + elif el == "storage": + idx = stor_idx + elif el == "dcline": + idx = dcline_idx + # cost data to write into gencost - el_is = net[el].loc[(net[el].in_service) & net[el].index.isin( + # TODO - Gitlab Issue #27 - only write cost data of controllable and in service elements + el_is = net[el].loc[net[el].in_service & net[el].index.isin( costs.loc[costs.element_type == el].element)].index p = costs.loc[(costs.element_type == el) & ( costs.element.isin(el_is))].p.reset_index(drop=True) f = costs.loc[(costs.element_type == el) & ( costs.element.isin(el_is))].f.reset_index(drop=True) + if len(p) > 0: p = concatenate(p) f = concatenate(f) # gencost indices - elements = idx[el_is] + shift_idx ppci["gencost"][elements, COST:COST+n_piece_lin_coefficients:2] = p @@ -140,8 +142,7 @@ def _make_objective(ppci, net): if len(net.polynomial_cost): for cost_type in ["p", "q"]: if (net.polynomial_cost.type == cost_type).any(): - costs = net.polynomial_cost[net.polynomial_cost.type == cost_type].reset_index( - drop=True) + costs = net.polynomial_cost[net.polynomial_cost.type == cost_type].reset_index(drop=True) if cost_type == "q": shift_idx = ng @@ -150,7 +151,9 @@ def _make_objective(ppci, net): shift_idx = 0 sign_corr = 1 - for el in ["gen", "sgen", "ext_grid", "load", "storage", "dcline"]: + # for element types with costs defined + #for el in ["gen", "sgen", "ext_grid", "load", "storage", "dcline"]: + for el in pd.unique(costs.element_type): if not costs.element[costs.element_type == el].empty: if el == "gen": @@ -166,7 +169,9 @@ def _make_objective(ppci, net): if el == "dcline": idx = dcline_idx - el_is = net[el].loc[(net[el].in_service) & net[el].index.isin( + # cost data to write into gencost + # TODO - Gitlab Issue #27 - only write cost data of controllable and in service elements + el_is = net[el].loc[net[el].in_service & net[el].index.isin( costs.loc[costs.element_type == el].element)].index c = costs.loc[(costs.element_type == el) & (costs.element.isin(el_is))].c.reset_index(drop=True) diff --git a/pandapower/test/opf/test_basic.py b/pandapower/test/opf/test_basic.py index d97b029e8..90c9d9eda 100644 --- a/pandapower/test/opf/test_basic.py +++ b/pandapower/test/opf/test_basic.py @@ -663,8 +663,8 @@ def test_storage_opf(): if __name__ == "__main__": - pytest.main(['-s', __file__]) - #test_storage_opf() + #pytest.main(['-s', __file__]) + test_storage_opf() #test_opf_varying_max_line_loading() # pytest.main(["test_basic.py", "-s"]) # test_simplest_dispatch() From 0d2702b29cb50815bec605fa6dbea8b5c3764eb4 Mon Sep 17 00:00:00 2001 From: mscharf Date: Thu, 12 Apr 2018 16:42:16 +0200 Subject: [PATCH 02/40] changed gencost writing behaviour and added tests (issue #27) --- pandapower/opf/make_objective.py | 22 ++++++++---- pandapower/test/opf/test_basic.py | 58 ++++++++++++++++++++++++++----- 2 files changed, 65 insertions(+), 15 deletions(-) diff --git a/pandapower/opf/make_objective.py b/pandapower/opf/make_objective.py index f27d5a80f..ee4f5b7a6 100644 --- a/pandapower/opf/make_objective.py +++ b/pandapower/opf/make_objective.py @@ -92,7 +92,6 @@ def _make_objective(ppci, net): sign_corr = 1 # for element types with costs defined - #for el in ["gen", "sgen", "ext_grid", "load", "storage", "dcline"]: for el in pd.unique(costs.element_type): if not costs.element[costs.element_type == el].empty: @@ -111,9 +110,14 @@ def _make_objective(ppci, net): idx = dcline_idx # cost data to write into gencost - # TODO - Gitlab Issue #27 - only write cost data of controllable and in service elements - el_is = net[el].loc[net[el].in_service & net[el].index.isin( + # (only write cost data of controllable and in service elements) + if el == "ext_grid" or el == "dcline": + el_is = net[el].loc[net[el].in_service & net[el].index.isin( costs.loc[costs.element_type == el].element)].index + else: + el_is = net[el].loc[net[el].controllable & net[el].in_service & net[el].index.isin( + costs.loc[costs.element_type == el].element)].index + p = costs.loc[(costs.element_type == el) & ( costs.element.isin(el_is))].p.reset_index(drop=True) f = costs.loc[(costs.element_type == el) & ( @@ -152,7 +156,6 @@ def _make_objective(ppci, net): sign_corr = 1 # for element types with costs defined - #for el in ["gen", "sgen", "ext_grid", "load", "storage", "dcline"]: for el in pd.unique(costs.element_type): if not costs.element[costs.element_type == el].empty: @@ -170,9 +173,14 @@ def _make_objective(ppci, net): idx = dcline_idx # cost data to write into gencost - # TODO - Gitlab Issue #27 - only write cost data of controllable and in service elements - el_is = net[el].loc[net[el].in_service & net[el].index.isin( - costs.loc[costs.element_type == el].element)].index + # (only write cost data of controllable and in service elements) + if el == "ext_grid" or el == "dcline": + el_is = net[el].loc[net[el].in_service & net[el].index.isin( + costs.loc[costs.element_type == el].element)].index + else: + el_is = net[el].loc[net[el].controllable & net[el].in_service & net[el].index.isin( + costs.loc[costs.element_type == el].element)].index + c = costs.loc[(costs.element_type == el) & (costs.element.isin(el_is))].c.reset_index(drop=True) diff --git a/pandapower/test/opf/test_basic.py b/pandapower/test/opf/test_basic.py index 90c9d9eda..547f918da 100644 --- a/pandapower/test/opf/test_basic.py +++ b/pandapower/test/opf/test_basic.py @@ -578,17 +578,11 @@ def test_storage_opf(): min_p_kw=-25, max_q_kvar=25, min_q_kvar=-25) pp.create_sgen(net, b1, p_kw=-25, controllable=True, max_p_kw=0, min_p_kw=-25, max_q_kvar=25, min_q_kvar=-25) - #pp.create_load(net, b1, p_kw=2.5, controllable=True, max_p_kw=2.5, min_p_kw=0, - # max_q_kvar=2.5, min_q_kvar=-2.5) pp.create_load(net, b1, p_kw=25, controllable=True, max_p_kw=25, min_p_kw=0, max_q_kvar=25, min_q_kvar=-25) - - + # costs pp.create_polynomial_cost(net, 0, "ext_grid", np.array([0, 3, 0])) - #pp.create_polynomial_cost(net, 0, "load", np.array([0, -1, 0])) - # TODO - Gitlab Issue #27 - OPF error wenn Kosten für non-controllable PQ-Element zugewiesen - # vgl. make_objective.py, Z.47ff. pp.create_polynomial_cost(net, 0, "sgen", np.array([0, 2, 0])) pp.create_polynomial_cost(net, 0, "storage", np.array([0, 1, 0])) pp.create_polynomial_cost(net, 1, "sgen", np.array([0, 1, 0])) @@ -662,9 +656,57 @@ def test_storage_opf(): assert np.isclose(res_cost_stor, res_cost_load) +def test_opf_no_controllables_vs_pf(): + """ Comparing the calculation results of PF and OPF in a simple network with non-controllable + elements """ + + # boundaries + vm_max = 1.3 + vm_min = 0.9 + max_line_loading_percent = 100 + + # create network + net = pp.create_empty_network() + + b1 = pp.create_bus(net, vn_kv=0.4, max_vm_pu=vm_max, min_vm_pu=vm_min) + b2 = pp.create_bus(net, vn_kv=0.4, max_vm_pu=vm_max, min_vm_pu=vm_min) + + pp.create_line(net, b1, b2, length_km=5, std_type="NAYY 4x50 SE", + max_loading_percent=max_line_loading_percent) + + # test elements static + pp.create_ext_grid(net, b2) + pp.create_load(net, b1, p_kw=7.5, controllable=False) + pp.create_sgen(net, b1, p_kw=-25, controllable=False, max_p_kw=-10, min_p_kw=-25, + max_q_kvar=25, min_q_kvar=-25) + + # testing cost assignment (for non-controllable elements - see Gitlab Issue #27) + pp.create_polynomial_cost(net, 0, "ext_grid", np.array([0, 3, 0])) + pp.create_polynomial_cost(net, 0, "load", np.array([0, -3, 0])) + pp.create_polynomial_cost(net, 0, "sgen", np.array([0, 2, 0])) + + # do calculations + pp.runopp(net, verbose=False) + assert net["OPF_converged"] + + res_opf_line_loading = net.res_line.loading_percent + res_opf_bus_voltages = net.res_bus.vm_pu + + pp.runpp(net, verbose=False) + assert net["converged"] + + res_pf_line_loading = net.res_line.loading_percent + res_pf_bus_voltages = net.res_bus.vm_pu + + # assert calculation behaviour + assert np.isclose(res_opf_line_loading, res_pf_line_loading).all() + assert np.isclose(res_opf_bus_voltages, res_pf_bus_voltages).all() + + if __name__ == "__main__": #pytest.main(['-s', __file__]) - test_storage_opf() + #test_storage_opf() + test_opf_no_controllables_vs_pf() #test_opf_varying_max_line_loading() # pytest.main(["test_basic.py", "-s"]) # test_simplest_dispatch() From 61a5ff9b64cf367d3323d005d134d9075fd86147 Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Sat, 14 Apr 2018 14:01:59 +0200 Subject: [PATCH 03/40] pandapower Paper has been accepted! --- README.rst | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/README.rst b/README.rst index eb56c8685..dfb917db1 100644 --- a/README.rst +++ b/README.rst @@ -79,16 +79,19 @@ There is a project to develop a GUI for pandapower: https://github.com/johaack/p Citing pandapower ================== -We are currently working on publishing a paper about pandapower, which is available as a `preprint on arxiv `_. -Until the paper has passed peer-review, please acknowledge the usage of pandapower in your paper as follows: :: - - @online{pandapower, - author = {{Thurner}, L. and {Scheidler}, A. and {Sch{\"a}fer}, F. and {Menke}, J.-H. and {Dollichon}, J. and {Meier}, F. and {Meinecke}, S. and {Braun}, M.}, - title = "{pandapower - an Open Source Python Tool for Convenient Modeling, Analysis and Optimization of Electric Power Systems}", - year = 2017, - url = {https://arxiv.org/abs/1709.06743}, - note = {preprint} - } +A paper describing pandapower has been accepted for publication in IEEE Transaction on Power Systems. A preprint of this paper is available on `arxiv `_ Please acknowledge the usage of pandapower by citing the Paper as follows: + +**L.** Thurner, A. Scheidler, Schäfer et al., “pandapower - an Open Source Python Tool for Convenient Modeling, Analysis and Optimization of Electric Power Systems,” IEEE Transaction on Power Systems (to be published), 2018. + +You can use the following BibTex entry: :: + + @article{pandapower, + author = {{Thurner}, L. and {Scheidler}, A. and {Sch{\"a}fer}, F. and {Menke}, J.-H. and {Dollichon}, J. and {Meier}, F. and {Meinecke}, S. and {Braun}, M.}, + title = "{pandapower - an Open Source Python Tool for Convenient Modeling, Analysis and Optimization of Electric Power Systems}", + year = 2018, + journal = {IEEE Transaction on Power Systems (to be published)}, + url = {https://arxiv.org/abs/1709.06743} + } Minimal Example =============== From 43e62585aca525ff6028751d26ace696bbfd0660 Mon Sep 17 00:00:00 2001 From: Florian Schaefer Date: Mon, 16 Apr 2018 13:29:20 +0200 Subject: [PATCH 04/40] added storage to changelog --- CHANGELOG.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index cc0c86917..903b354c0 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -10,6 +10,7 @@ Change Log - [ADDED] pp_elements() toolbox function - [ADDED] new parameter g_us_per_km to model dielectric losses in lines - [ADDED] single phase short-circuit calculation with negative sequence models +- [ADDED] generic storage model (sgen/load like element with negative / positive power allowed) [1.4.3] - 2018-02-06 ---------------------- From 50f9bee3418f1d7da025c4de878c62348fbca821 Mon Sep 17 00:00:00 2001 From: Florian Schaefer Date: Mon, 16 Apr 2018 13:30:31 +0200 Subject: [PATCH 05/40] correct my name in readme --- README.rst | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/README.rst b/README.rst index dfb917db1..e9c41d2dd 100644 --- a/README.rst +++ b/README.rst @@ -17,7 +17,7 @@ pandapower .. image:: https://codecov.io/github/lthurner/pandapower/coverage.svg?branch=master :target: https://codecov.io/github/lthurner/pandapower?branch=master - + .. image:: https://api.codacy.com/project/badge/Grade/5d749ed6772e47f6b84fb9afb83903d3 :target: https://www.codacy.com/app/lthurner/pandapower?utm_source=github.com&utm_medium=referral&utm_content=lthurner/pandapower&utm_campaign=Badge_Grade @@ -56,7 +56,7 @@ pandapower is an element based network calculation tool that supports the follow - DC lines - unsymmetric impedances - ward equivalents - + Network Analysis ------------------ @@ -81,7 +81,7 @@ Citing pandapower A paper describing pandapower has been accepted for publication in IEEE Transaction on Power Systems. A preprint of this paper is available on `arxiv `_ Please acknowledge the usage of pandapower by citing the Paper as follows: -**L.** Thurner, A. Scheidler, Schäfer et al., “pandapower - an Open Source Python Tool for Convenient Modeling, Analysis and Optimization of Electric Power Systems,” IEEE Transaction on Power Systems (to be published), 2018. +**L.** Thurner, A. Scheidler, Schäfer, F. et al., “pandapower - an Open Source Python Tool for Convenient Modeling, Analysis and Optimization of Electric Power Systems,” IEEE Transaction on Power Systems (to be published), 2018. You can use the following BibTex entry: :: @@ -103,17 +103,17 @@ We consider the following simple 3-bus example network as a minimal example: .. image:: http://pandapower.readthedocs.io/en/latest/_images/3bus-system.png :width: 20em - :align: center + :align: center Creating a Network ------------------------------ The above network can be created in pandapower as follows: :: - + import pandapower as pp #create empty net - net = pp.create_empty_network() - + net = pp.create_empty_network() + #create buses b1 = pp.create_bus(net, vn_kv=20., name="Bus 1") b2 = pp.create_bus(net, vn_kv=0.4, name="Bus 2") @@ -122,15 +122,15 @@ The above network can be created in pandapower as follows: :: #create bus elements pp.create_ext_grid(net, bus=b1, vm_pu=1.02, name="Grid Connection") pp.create_load(net, bus=b3, p_kw=100, q_kvar=50, name="Load") - + #create branch elements tid = pp.create_transformer(net, hv_bus=b1, lv_bus=b2, std_type="0.4 MVA 20/0.4 kV", name="Trafo") pp.create_line(net, from_bus=b2, to_bus=b3, length_km=0.1, name="Line", - std_type="NAYY 4x50 SE") - + std_type="NAYY 4x50 SE") + Note that you do not have to calculate any impedances or tap ratio for the equivalent circuit, this is handled internally by pandapower according to the pandapower `transformer model `_. -The `standard type library `_ allows comfortable creation of line and transformer elements. +The `standard type library `_ allows comfortable creation of line and transformer elements. The pandapower representation now looks like this: @@ -141,12 +141,12 @@ Running a Power Flow ------------------------------ A powerflow can be carried out with the `runpp function `_: :: - + pp.runpp(net) - + When a power flow is run, pandapower combines the information of all element tables into one pypower case file and uses pypower to run the power flow. The results are then processed and written back into pandapower: - + .. image:: http://pandapower.readthedocs.io/en/latest/_images/pandapower_powerflow.png :width: 40em @@ -154,7 +154,7 @@ For the 3-bus example network, the result tables look like this: .. image:: http://pandapower.readthedocs.io/en/latest/_images/pandapower_results.png :width: 30em - + All other pandapower elements and network analysis functionality (e.g. optimal power flow, state estimation or short-circuit calculation) is also fully integrated into the tabular pandapower datastructure. This minimal example is also available as a `jupyter notebook `_. From c98a7b9cd32dce8bf2036f8cc9433c2e75018967 Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Mon, 16 Apr 2018 13:37:52 +0200 Subject: [PATCH 06/40] pandapower paper citation --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index dfb917db1..cf9efb878 100644 --- a/README.rst +++ b/README.rst @@ -79,9 +79,9 @@ There is a project to develop a GUI for pandapower: https://github.com/johaack/p Citing pandapower ================== -A paper describing pandapower has been accepted for publication in IEEE Transaction on Power Systems. A preprint of this paper is available on `arxiv `_ Please acknowledge the usage of pandapower by citing the Paper as follows: +A paper describing pandapower has been accepted for publication in IEEE Transaction on Power Systems, a preprint of this paper is available on `arXiv `_ Please acknowledge the usage of pandapower by citing the Paper as follows: -**L.** Thurner, A. Scheidler, Schäfer et al., “pandapower - an Open Source Python Tool for Convenient Modeling, Analysis and Optimization of Electric Power Systems,” IEEE Transaction on Power Systems (to be published), 2018. +- **L. Thurner, A. Scheidler, F. Schäfer et al.**, “pandapower - an Open Source Python Tool for Convenient Modeling, Analysis and Optimization of Electric Power Systems,” IEEE Transaction on Power Systems (to be published), 2018. You can use the following BibTex entry: :: From 3db7e1459add9a9f9dd478db6cca3c4ba7abf1be Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Mon, 16 Apr 2018 16:25:35 +0200 Subject: [PATCH 07/40] slack impedance in Y0, Y2 --- pandapower/build_bus.py | 11 +++++++++-- pandapower/pd2ppc_zero.py | 20 ++++++++++++-------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/pandapower/build_bus.py b/pandapower/build_bus.py index bed13a2da..64e9d5504 100644 --- a/pandapower/build_bus.py +++ b/pandapower/build_bus.py @@ -419,15 +419,22 @@ def _add_gen_impedances_ppc(net, ppc): def _add_ext_grid_sc_impedance(net, ppc): from pandapower.shortcircuit.idx_bus import C_MAX, C_MIN + mode = net._options["mode"] bus_lookup = net["_pd2ppc_lookups"]["bus"] - case = net._options["case"] + if mode == "sc": + case = net._options["case"] + else: + case = "max" eg = net["ext_grid"][net._is_elements["ext_grid"]] if len(eg) == 0: return eg_buses = eg.bus.values eg_buses_ppc = bus_lookup[eg_buses] - c = ppc["bus"][eg_buses_ppc, C_MAX] if case == "max" else ppc["bus"][eg_buses_ppc, C_MIN] + if mode == "sc": + c = ppc["bus"][eg_buses_ppc, C_MAX] if case == "max" else ppc["bus"][eg_buses_ppc, C_MIN] + else: + c = 1. if not "s_sc_%s_mva" % case in eg: raise ValueError("short circuit apparent power s_sc_%s_mva needs to be specified for "% case + "external grid" ) diff --git a/pandapower/pd2ppc_zero.py b/pandapower/pd2ppc_zero.py index 9a344121f..3199fde7d 100644 --- a/pandapower/pd2ppc_zero.py +++ b/pandapower/pd2ppc_zero.py @@ -26,16 +26,12 @@ def _pd2ppc_zero(net): # select elements in service (time consuming, so we do it once) net["_is_elements"] = aux._select_is_elements_numba(net) - # get options - mode = net["_options"]["mode"] - ppc = _init_ppc(net) # init empty ppci ppci = copy.deepcopy(ppc) _build_bus_ppc(net, ppc) _build_gen_ppc(net, ppc) - if mode == "sc": - _add_ext_grid_sc_impedance_zero(net, ppc) + _add_ext_grid_sc_impedance_zero(net, ppc) _build_branch_ppc_zero(net, ppc) # adds auxilary buses for open switches at branches @@ -203,16 +199,24 @@ def _add_trafo_sc_impedance_zero(net, ppc, trafo_df=None): del net.trafo["_ppc_idx"] def _add_ext_grid_sc_impedance_zero(net, ppc): - from pandapower.shortcircuit.idx_bus import C_MAX, C_MIN + mode = net["_options"]["mode"] + + if mode == "sc": + from pandapower.shortcircuit.idx_bus import C_MAX, C_MIN + case = net._options["case"] + else: + case = "max" bus_lookup = net["_pd2ppc_lookups"]["bus"] - case = net._options["case"] eg = net["ext_grid"][net._is_elements["ext_grid"]] if len(eg) == 0: return eg_buses = eg.bus.values eg_buses_ppc = bus_lookup[eg_buses] - c = ppc["bus"][eg_buses_ppc, C_MAX] if case == "max" else ppc["bus"][eg_buses_ppc, C_MIN] + if mode == "sc": + c = ppc["bus"][eg_buses_ppc, C_MAX] if case == "max" else ppc["bus"][eg_buses_ppc, C_MIN] + else: + c = 1. if not "s_sc_%s_mva" % case in eg: raise ValueError("short circuit apparent power s_sc_%s_mva needs to be specified for "% case + "external grid" ) From 5e8506bd9f63f8906e19a24a6436d268437009ac Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Tue, 17 Apr 2018 10:23:35 +0200 Subject: [PATCH 08/40] 1ph sc tests non-consecutive indices --- pandapower/test/shortcircuit/test_1ph.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/pandapower/test/shortcircuit/test_1ph.py b/pandapower/test/shortcircuit/test_1ph.py index 0929fe9a1..75c1880ab 100644 --- a/pandapower/test/shortcircuit/test_1ph.py +++ b/pandapower/test/shortcircuit/test_1ph.py @@ -17,7 +17,7 @@ def check_results(net, vc, result): raise ValueError("Incorrect results for vector group %s"%vc, res_ika, result) def add_network(net, vector_group): - b1 = pp.create_bus(net, 110, zone=vector_group) + b1 = pp.create_bus(net, 110, zone=vector_group, index=pp.get_free_id(net.bus)) b2 = pp.create_bus(net, 20, zone=vector_group) b3 = pp.create_bus(net, 20, zone=vector_group) b4 = pp.create_bus(net, 20, zone=vector_group) @@ -29,8 +29,9 @@ def add_network(net, vector_group): pp.create_std_type(net, {"r_ohm_per_km": 0.122, "x_ohm_per_km": 0.112, "c_nf_per_km": 304, "max_i_ka": 0.421, "endtemp_degree": 70.0, "r0_ohm_per_km": 0.244, "x0_ohm_per_km": 0.336, "c0_nf_per_km": 2000}, "unsymmetric_line_type") - pp.create_line(net, b2, b3, length_km=10, std_type="unsymmetric_line_type") - pp.create_line(net, b3, b4, length_km=15, std_type="unsymmetric_line_type") + l1 = pp.create_line(net, b2, b3, length_km=10, std_type="unsymmetric_line_type", + index=pp.get_free_id(net.line)+1) + l2 = pp.create_line(net, b3, b4, length_km=15, std_type="unsymmetric_line_type") pp.create_line(net, b3, b4, length_km=15, std_type="unsymmetric_line_type", in_service=False) @@ -39,9 +40,11 @@ def add_network(net, vector_group): "mag0_rx": 0.4, "mag0_rx": 0.4, "si0_hv_partial": 0.9, "vector_group": vector_group}) pp.create_std_type(net, transformer_type, vector_group, "trafo") - pp.create_transformer(net, b1, b2, std_type=vector_group, parallel=2) + t1 = pp.create_transformer(net, b1, b2, std_type=vector_group, parallel=2, + index=pp.get_free_id(net.trafo)+1) pp.create_transformer(net, b1, b2, std_type=vector_group, in_service=False) pp.add_zero_impedance_parameters(net) + return l1, l2, t1 def test_1ph_shortcircuit(): results = { @@ -81,13 +84,17 @@ def test_iec60909_example_4(): def test_1ph_with_switches(): net = pp.create_empty_network() vc = "Yy" - add_network(net, vc) + l1, l2, _ = add_network(net, vc) sc.calc_sc(net, fault="1ph", case="max") - pp.create_line(net, 3, 1, length_km=15, std_type="unsymmetric_line_type", parallel=2.) + pp.create_line(net, net.line.to_bus.at[l2], net.line.from_bus.at[l1], length_km=15, + std_type="unsymmetric_line_type", parallel=2.) pp.add_zero_impedance_parameters(net) - pp.create_switch(net, bus=3, element=1, et="l", closed=False) + pp.create_switch(net, bus=net.line.to_bus.at[l2], element=l2, et="l", closed=False) sc.calc_sc(net, fault="1ph", case="max") check_results(net, vc, [0.52209347338, 2.0620266652, 2.3255761263, 2.3066467489]) if __name__ == "__main__": - pytest.main(["test_1ph.py"]) + test_1ph_with_switches() + test_iec60909_example_4() + test_1ph_shortcircuit() +# pytest.main(["test_1ph.py"]) From 0d5910ae58310a16ce3257945020d9b74e440a79 Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Tue, 17 Apr 2018 10:41:30 +0200 Subject: [PATCH 09/40] out of service bus in sc 1ph test --- pandapower/test/shortcircuit/test_1ph.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandapower/test/shortcircuit/test_1ph.py b/pandapower/test/shortcircuit/test_1ph.py index 75c1880ab..712e77062 100644 --- a/pandapower/test/shortcircuit/test_1ph.py +++ b/pandapower/test/shortcircuit/test_1ph.py @@ -12,13 +12,14 @@ import pytest def check_results(net, vc, result): - res_ika = net.res_bus_sc[net.bus.zone==vc].ikss_ka.values + res_ika = net.res_bus_sc[(net.bus.zone==vc) & (net.bus.in_service)].ikss_ka.values if not np.allclose(result, res_ika): raise ValueError("Incorrect results for vector group %s"%vc, res_ika, result) def add_network(net, vector_group): b1 = pp.create_bus(net, 110, zone=vector_group, index=pp.get_free_id(net.bus)) b2 = pp.create_bus(net, 20, zone=vector_group) + pp.create_bus(net, 20, in_service=False) b3 = pp.create_bus(net, 20, zone=vector_group) b4 = pp.create_bus(net, 20, zone=vector_group) From 8dbeda7d42387850061a0d7ab0a0f82510d8fcb9 Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Tue, 17 Apr 2018 14:25:25 +0200 Subject: [PATCH 10/40] isolated buses in zero sequence --- pandapower/auxiliary.py | 4 ++-- pandapower/pd2ppc_zero.py | 27 +++++++++++++----------- pandapower/test/shortcircuit/test_1ph.py | 1 + 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/pandapower/auxiliary.py b/pandapower/auxiliary.py index 592235969..3481c322a 100644 --- a/pandapower/auxiliary.py +++ b/pandapower/auxiliary.py @@ -514,8 +514,8 @@ def _set_isolated_buses_out_of_service(net, ppc): ppc["branch"][ppc["branch"][:, 10] == 1, :2].real.astype(int).flatten()) # but also check if they may be the only connection to an ext_grid - disco = np.setdiff1d(disco, ppc['bus'][ppc['bus'][:, 1] == 3, :1].real.astype(int)) - ppc["bus"][disco, 1] = 4. + net._isolated_buses = np.setdiff1d(disco, ppc['bus'][ppc['bus'][:, 1] == 3, :1].real.astype(int)) + ppc["bus"][net._isolated_buses, 1] = 4. def _write_lookup_to_net(net, element, element_lookup): diff --git a/pandapower/pd2ppc_zero.py b/pandapower/pd2ppc_zero.py index 3199fde7d..3c500a647 100644 --- a/pandapower/pd2ppc_zero.py +++ b/pandapower/pd2ppc_zero.py @@ -40,7 +40,8 @@ def _pd2ppc_zero(net): # add auxilary buses for out of service buses at in service lines. # Also sets lines out of service if they are connected to two out of service buses _branches_with_oos_buses(net, ppc) - + if hasattr(net, "_isolated_buses"): + ppc["bus"][net._isolated_buses, 1] = 4. # generates "internal" ppci format (for powerflow calc) from "external" ppc format and updates the bus lookup # Note: Also reorders buses and gens in ppc ppci = _ppc2ppci(ppc, ppci, net) @@ -246,20 +247,22 @@ def _add_ext_grid_sc_impedance_zero(net, ppc): def _add_line_sc_impedance_zero(net, ppc): - line = net["line"] branch_lookup = net["_pd2ppc_lookups"]["branch"] + if not "line" in branch_lookup: + return + line = net["line"] bus_lookup = net["_pd2ppc_lookups"]["bus"] length = line["length_km"].values parallel = line["parallel"].values + fb = bus_lookup[line["from_bus"].values] + tb = bus_lookup[line["to_bus"].values] baseR = np.square(ppc["bus"][fb, BASE_KV]) / net.sn_kva * 1e3 - - if "line" in branch_lookup: - f, t = branch_lookup["line"] - # line zero sequence impedance - ppc["branch"][f:t, F_BUS] = bus_lookup[line["from_bus"].values] - ppc["branch"][f:t, T_BUS] = bus_lookup[line["to_bus"].values] - ppc["branch"][f:t, BR_R] = line["r0_ohm_per_km"].values * length / baseR / parallel - ppc["branch"][f:t, BR_X] = line["x0_ohm_per_km"].values * length / baseR / parallel - ppc["branch"][f:t, BR_B] = (2 * net["f_hz"] * math.pi * line["c0_nf_per_km"].values * 1e-9 * baseR * length * parallel) - ppc["branch"][f:t, BR_STATUS] = line["in_service"].astype(int) \ No newline at end of file + f, t = branch_lookup["line"] + # line zero sequence impedance + ppc["branch"][f:t, F_BUS] = fb + ppc["branch"][f:t, T_BUS] = tb + ppc["branch"][f:t, BR_R] = line["r0_ohm_per_km"].values * length / baseR / parallel + ppc["branch"][f:t, BR_X] = line["x0_ohm_per_km"].values * length / baseR / parallel + ppc["branch"][f:t, BR_B] = (2 * net["f_hz"] * math.pi * line["c0_nf_per_km"].values * 1e-9 * baseR * length * parallel) + ppc["branch"][f:t, BR_STATUS] = line["in_service"].astype(int) \ No newline at end of file diff --git a/pandapower/test/shortcircuit/test_1ph.py b/pandapower/test/shortcircuit/test_1ph.py index 712e77062..589110bb0 100644 --- a/pandapower/test/shortcircuit/test_1ph.py +++ b/pandapower/test/shortcircuit/test_1ph.py @@ -22,6 +22,7 @@ def add_network(net, vector_group): pp.create_bus(net, 20, in_service=False) b3 = pp.create_bus(net, 20, zone=vector_group) b4 = pp.create_bus(net, 20, zone=vector_group) + pp.create_bus(net, 20) pp.create_ext_grid(net, b1, s_sc_max_mva=100, s_sc_min_mva=80, rx_min=0.20, rx_max=0.35) net.ext_grid["r0x0_max"] = 0.4 From 5e8a88d3bbbf51cffe48a42074cebb4708209817 Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Thu, 19 Apr 2018 11:37:19 +0200 Subject: [PATCH 11/40] storage docs --- doc/elements.rst | 1 + doc/elements/storage.rst | 69 ++++++++++++++++++++++++++++++++++++ doc/elements/storage_par.csv | 15 ++++++++ doc/elements/storage_res.csv | 3 ++ pandapower/create.py | 4 +-- 5 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 doc/elements/storage.rst create mode 100644 doc/elements/storage_par.csv create mode 100644 doc/elements/storage_res.csv diff --git a/doc/elements.rst b/doc/elements.rst index 96fd1b309..1c3ef6609 100644 --- a/doc/elements.rst +++ b/doc/elements.rst @@ -31,4 +31,5 @@ information about the definition and interpretation of the parameters in the fol elements/xward elements/dcline elements/measurement + elements/storage diff --git a/doc/elements/storage.rst b/doc/elements/storage.rst new file mode 100644 index 000000000..97196b298 --- /dev/null +++ b/doc/elements/storage.rst @@ -0,0 +1,69 @@ +================== +Storage +================== + +.. seealso:: + :ref:`Unit Systems and Conventions ` + +Create Function +===================== + +.. autofunction:: pandapower.create_storage + +Input Parameters +===================== + +*net.storage* + +.. tabularcolumns:: |p{0.10\linewidth}|p{0.10\linewidth}|p{0.25\linewidth}|p{0.40\linewidth}| +.. csv-table:: + :file: storage_par.csv + :delim: ; + :widths: 10, 10, 25, 40 + +.. |br| raw:: html + +
+ +\*necessary for executing a power flow calculation |br| \*\*optimal power flow parameter + + +Electric Model +================= + +Storages are modelled as PQ-buses in the power flow calculation: + +.. image:: pq.png + :width: 8em + :alt: alternate Text + :align: center + +The PQ-Values are calculated from the parameter table values as: + +.. math:: + :nowrap: + + \begin{align*} + P_{storage} &= p\_kw \cdot scaling \\ + Q_{storage} &= q\_kvar \cdot scaling \\ + \end{align*} + +.. note:: + + Since all power values are given in the consumer system, negative power models charging and positive activee power models discharging. + +.. note:: + + The apparent power value sn_kva, state of charge soc and storage capacity max_e_kwh are provided as additional information for usage in controller or other applications based on panadapower. It is not considered in the power flow! + +Result Parameters +========================== +*net.res_storage* + +.. tabularcolumns:: |p{0.10\linewidth}|p{0.10\linewidth}|p{0.50\linewidth}| +.. csv-table:: + :file: storage_res.csv + :delim: ; + :widths: 10, 10, 50 + +The power values in the net.res_storage table are equivalent to :math:`P_{storage}` and :math:`Q_{storage}`. \ No newline at end of file diff --git a/doc/elements/storage_par.csv b/doc/elements/storage_par.csv new file mode 100644 index 000000000..105bfe75f --- /dev/null +++ b/doc/elements/storage_par.csv @@ -0,0 +1,15 @@ +**Parameter**;**Datatype**;**Value Range**;**Explanation** +name;string;;name of the storage unit +bus*;integer;;index of connected bus +p_kw*;float;:math:`\leq` 0;Momentary real power of the storage (positive for charging, negative for discharging) +q_kvar*;float;;Reactive power of the storage [kVar] +sn_kva;float;:math:`>` 0;Nominal power ot the storage [kVA] +scaling*;float;:math:`\geq` 0;scaling factor for the active and reactive power +max_e_kwh ;float;;The maximum energy content of the storage (maximum charge level) +min_e_kwh ;float;;The minimum energy content of the storage (minimum charge level) +max_p_kw**;float;;Maximum active power +min_p_kw**;float;;Minimum active power +max_q_kvar**;float;;Maximum reactive power +min_q_kvar**;float;;Minimum reactive power +controllable**;bool;;States if sgen is controllable or not, sgen will not be used as a flexibilty if it is not controllable +in_service*;boolean;True / False;specifies if the generator is in service. diff --git a/doc/elements/storage_res.csv b/doc/elements/storage_res.csv new file mode 100644 index 000000000..5b39691c3 --- /dev/null +++ b/doc/elements/storage_res.csv @@ -0,0 +1,3 @@ +**Parameter**;**Datatype**;**Explanation** +p_kw;float;resulting active power after scaling [kW] +q_kvar;float;resulting reactive power after scaling [kVar] diff --git a/pandapower/create.py b/pandapower/create.py index a91799651..d7fdec84f 100644 --- a/pandapower/create.py +++ b/pandapower/create.py @@ -795,8 +795,8 @@ def create_sgen_from_cosphi(net, bus, sn_kva, cos_phi, mode, **kwargs): def create_storage(net, bus, p_kw, max_e_kwh, q_kvar=0, sn_kva=nan, soc=nan, min_e_kwh=0.0, name=None, index=None, scaling=1., type=None, in_service=True, max_p_kw=nan, min_p_kw=nan, max_q_kvar=nan, min_q_kvar=nan, controllable = nan): - """create_storage(net, bus, p_kw, max_e_kwh, q_kvar=0, sn_kva=nan, soc=nan, min_e_kwh=0.0, - name=None, index=None, scaling=1., type=None, in_service=True, max_p_kw=nan, + """create_storage(net, bus, p_kw, max_e_kwh, q_kvar=0, sn_kva=nan, soc=nan, min_e_kwh=0.0, \ + name=None, index=None, scaling=1., type=None, in_service=True, max_p_kw=nan, \ min_p_kw=nan, max_q_kvar=nan, min_q_kvar=nan, controllable = nan) Adds a storage to the network. From eacbefc9ce65bbaaafa33f4989e115b6d7931732 Mon Sep 17 00:00:00 2001 From: Florian Schaefer Date: Thu, 19 Apr 2018 13:47:01 +0200 Subject: [PATCH 12/40] changed :battery: soc to soc_percent --- pandapower/create.py | 16 ++++++++-------- pandapower/toolbox.py | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pandapower/create.py b/pandapower/create.py index d7fdec84f..b7e365ed9 100644 --- a/pandapower/create.py +++ b/pandapower/create.py @@ -61,7 +61,7 @@ def create_empty_network(name="", f_hz=50., sn_kva=1e3): ("p_kw", "f8"), ("q_kvar", "f8"), ("sn_kva", "f8"), - ("soc", "f8"), + ("soc_percent", "f8"), ("min_e_kwh", "f8"), ("max_e_kwh", "f8"), ("scaling", "f8"), @@ -267,7 +267,7 @@ def create_empty_network(name="", f_hz=50., sn_kva=1e3): ("q_kvar", "f8")], "_empty_res_storage": [("p_kw", "f8"), ("q_kvar", "f8"), - ("soc", "f8")], + ("soc_percent", "f8")], "_empty_res_gen": [("p_kw", "f8"), ("q_kvar", "f8"), ("va_degree", "f8"), @@ -792,10 +792,10 @@ def create_sgen_from_cosphi(net, bus, sn_kva, cos_phi, mode, **kwargs): return create_sgen(net, bus, sn_kva=sn_kva, p_kw=p_kw, q_kvar=q_kvar, **kwargs) -def create_storage(net, bus, p_kw, max_e_kwh, q_kvar=0, sn_kva=nan, soc=nan, min_e_kwh=0.0, +def create_storage(net, bus, p_kw, max_e_kwh, q_kvar=0, sn_kva=nan, soc_percent=nan, min_e_kwh=0.0, name=None, index=None, scaling=1., type=None, in_service=True, max_p_kw=nan, min_p_kw=nan, max_q_kvar=nan, min_q_kvar=nan, controllable = nan): - """create_storage(net, bus, p_kw, max_e_kwh, q_kvar=0, sn_kva=nan, soc=nan, min_e_kwh=0.0, \ + """create_storage(net, bus, p_kw, max_e_kwh, q_kvar=0, sn_kva=nan, soc_percent=nan, min_e_kwh=0.0, \ name=None, index=None, scaling=1., type=None, in_service=True, max_p_kw=nan, \ min_p_kw=nan, max_q_kvar=nan, min_q_kvar=nan, controllable = nan) Adds a storage to the network. @@ -828,7 +828,7 @@ def create_storage(net, bus, p_kw, max_e_kwh, q_kvar=0, sn_kva=nan, soc=nan, min **sn_kva** (float, default None) - Nominal power of the storage - **soc** (float, NaN) - The state of charge of the storage + **soc_percent** (float, NaN) - The state of charge of the storage **min_e_kwh** (float, 0) - The minimum energy content of the storage \ (minimum charge level) @@ -863,7 +863,7 @@ def create_storage(net, bus, p_kw, max_e_kwh, q_kvar=0, sn_kva=nan, soc=nan, min **index** (int) - The unique ID of the created storage EXAMPLE: - create_storage(net, 1, p_kw = -30, max_e_kwh = 60, soc = 1.0, min_e_kwh = 5) + create_storage(net, 1, p_kw = -30, max_e_kwh = 60, soc_percent = 1.0, min_e_kwh = 5) """ if bus not in net["bus"].index.values: @@ -879,9 +879,9 @@ def create_storage(net, bus, p_kw, max_e_kwh, q_kvar=0, sn_kva=nan, soc=nan, min dtypes = net.storage.dtypes net.storage.loc[index, ["name", "bus", "p_kw", "q_kvar", "sn_kva", "scaling", - "soc", "min_e_kwh", "max_e_kwh", "in_service", "type"]] = \ + "soc_percent", "min_e_kwh", "max_e_kwh", "in_service", "type"]] = \ [name, bus, p_kw, q_kvar, sn_kva, scaling, - soc, min_e_kwh, max_e_kwh, bool(in_service), type] + soc_percent, min_e_kwh, max_e_kwh, bool(in_service), type] # and preserve dtypes _preserve_dtypes(net.storage, dtypes) diff --git a/pandapower/toolbox.py b/pandapower/toolbox.py index bde8f5c33..cdadbeab6 100644 --- a/pandapower/toolbox.py +++ b/pandapower/toolbox.py @@ -499,7 +499,7 @@ def convert_format(net): if "_empty_res_storage" not in net: net["_empty_res_storage"] = pd.DataFrame(np.zeros(0, dtype=[("p_kw", "f8"), ("q_kvar", "f8"), - ("soc", "f8")])) + ("soc_percent", "f8")])) if len(net["_empty_res_line"]) < 10: net["_empty_res_line"] = pd.DataFrame(np.zeros(0, dtype=[("p_from_kw", "f8"), @@ -518,7 +518,7 @@ def convert_format(net): ("p_kw", "f8"), ("q_kvar", "f8"), ("sn_kva", "f8"), - ("soc", "f8"), + ("soc_percent", "f8"), ("min_e_kwh", "f8"), ("max_e_kwh", "f8"), ("scaling", "f8"), From 3d20fd3e0981c34bc2e26cd1a827ce2a6c23cfde Mon Sep 17 00:00:00 2001 From: Florian Schaefer Date: Thu, 19 Apr 2018 13:57:24 +0200 Subject: [PATCH 13/40] added :battery: image to doc --- doc/elements/storage.png | Bin 0 -> 13862 bytes doc/elements/storage.psd | Bin 0 -> 217897 bytes doc/elements/storage.rst | 16 ++++++++-------- 3 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 doc/elements/storage.png create mode 100644 doc/elements/storage.psd diff --git a/doc/elements/storage.png b/doc/elements/storage.png new file mode 100644 index 0000000000000000000000000000000000000000..8f9c21cf974997d2e60f000d9dfc252a2d181434 GIT binary patch literal 13862 zcmd^mXIN9)y6!}fqBKRN7X?97ic~R3RUp(wQHs)}1f+!CyGl_3B}fmTD2O!a%}}IC zZ&CxH6KO#R7&>>xbzDo&-D{t9_TKl`{lSyx8FPH&d%yOMZ_F`?_)Sxp<`~N{003y9 zDmQch;K&#NkSS1-gCoyQpEm=4sGL*`T>*f$k@!dQ;u0+@036e@RaE@#HygMc+|>r| z#06DUTie=O0f5&iQWvJDyKv?@0kff?79JF<2G==F$)%(4BEWbNQ9(~nYhR{*d~BFv_Ux;u2N~gy+jggXGwcRG5av4%N{3{y zxp-u8H$@#Kb)1T*ws;VAwgShA$p2)VoB(>tV#~9x``jeJR)DnhrE_%@ zH2{fM|8Yv7P9wQam@Vv(Zc!oeE=kZsk~+8NSJfzkP62X0Q3{!WoDxY8GJ#hYNGAi# z+AZ$Q0KW+UW_*G3{Xh_ME76w(xD$K!G)ek%fQ!K@{03kH0dl)r1a)%BRO(1U;2l zBwfiPbu;)5rGPVqzP=#Gg)S)LrBf2-N6eGt1V4HwGK&O@(M{qz03iMOY0z5yzE>A* zepi=7R2i+Qz+x@=;kkSFW)9}MbDZP=V9G6^_u#TnF-s7HJjmhT)p;D5jmhzJcfu3v zB09NJAbnv}AMZr;&CQq3Dn~}F?Wb2T1P`HYaPQd4ffZ zgO$m)CO>v;sJ~(Bj-h&ZZ)`qVd9VEV;U0Vcxkl){N`s51X0%T_N8LzziWhlvEzXX^_o>scz51 zRoQ*z^z%TFH8jQ<08DQ12W0ai|^%GH|m)#*O9Z;A04YdzGo)!P=TlM zqXNCcG0Pw}7c>6c5QPh&o$uK%nhAZDV;8H_wh2Wz(F%UNRY7~*iEhW7GPVA~hhQo) z`A?J#=4VI4N$x#1;EtkXOnkI;wqAwor>=hU8yt6b4}tjBdrg?;_H%Mq!t zyGm8hA)f$|kiF0k%2#58i?pwQrY=>id@ITFQ0dk29!s|?NzrH0lY3lBSgt>nc!}-F zv7sA{mQidGuKU77A=+p!EZE$jPg`Q+5gKySR zNsxIeaG7(+s~D&oXb!8q?;EbzD9Lj&LQ#aT^4Sq+;cLCVlYL5kjyl{6m$Q?_R9LtXt)rH9MHEu8m$@!| zdNhliZI~6EWt}~{e&-nSo}BaRE#2u0I&Jq=ndj)|#OBDY5=7*0WhCj0zkR89LOj|? zA@60GPJwpVTLv-rB&p5^XP|0t@?O2@XR%?lA=nmtajQBp{(?g@zDK{WeL?w4{1?&< zPimUb(+^t0VHcQ_nJAcG%$`gI3F?{5{ZE)%^n@j^EG1wQ=@Q|$3@(;k^gI2$?br*| z7rZZ6FAC{pzsr1wd3XF4{#LtQbhe4Ef4$nATvDf9Zb~HJm?!n@XyoH@3ejXRA6ZYAw zpIm>J{ZdL%R8>^JSO*_#ElV+z;JlUMrb&gpkQI*)c#Ju<%0JD|nklAUdBy6k-MhH> zID;IO9PJ$CC6q+|N)|E`b+g)VH<(twMV0R^pE4}E>nIYdJEA+Dbu8p;&hX4QG&?kB@RIYMMfleov%6v6UCFSUl|g?CS#L_k|)Z|jJ%94m%S~ku!0uN8f6;d%04(g zGLkZUV{psJxL7F=TEVbVEVqz_&~yE~q4(u) zJl_$_R~co#$+)D=$jnGfVni^8rX7-X<)6yiwHn~5rjI5R1Gx_^4}A`MfvlkOBrwv5 zVEN!XM|QV-{La=!$zDTSeJdJSk$;+ADSui%IwUV-u0HRq&8OvOd1ndOgs$gZwzQ9a z3-~hFLt#E|{-hy*n(tBABmGd>D5r1(mfkDz;-0-@imnqkc5cMoz$C-2Xh{_asES{d zc_(;ZdQ`GXtV*_7(AuzLzyN6gwO3=461novA2Q`n?_C_pYdf(5c*{7f_1RQqLrLa5;!vzlOT@y$My*7hpG-N9Ep^Dw1~gMjx9wee_c3ZSq{{ipOOa z9R{>=R`lcZ15ms^8g{`Z^=%>br6hJs$8Q~*d*r_~Hnd`_WguiYQEI*uie!~J9q~B- z6q+&qbl~uXF|Rq+FnC*S;#h1+c1~lZWw&*o^};+xAoUJy+`IVscv?rAk_Za%4+TEgvjc>*4xnA(UZXSjhC7aZ8`ShSbaZy6I&iY z-}yk;muam*-y*rCF~N_(KT_O4!&AN?>5zU^Y954@&VFycfG=Gy$C(WpkJY%RB+AIVbN_-`T)_d z)l!{Oos?gB*RB%hgDUm4CM>X~N_LHJpuE@491aeoN?jjE;eFtQCc@^#nehM@zWuKD z>Jd*qT;2z*52hP(EAk_X<6#4`cMiseSH}YH*LkMnd&iUsnnHX_FEFT+)W#kk|7X zT^@(qSYd-F)+UM*?Wa3K^=y;-z?u4(e06g0ecC1;Jb!HYaj0iUUI9?qjv zX3^~3%ea=?8OJ5h`V6y@tkax&ugr^#S@($2qJsTkv0Xn0^f*#d9%c(azN zN>R&9 z0py%We;*)|1OQ4$;QK((B-msVXA%c~%=|-?IP*Us`d!Jtru7$5BEG*5_^(BO_R2rB z_3w%P;?N&%`WHlhiNy~${bK9SfPc~Yi|Ef`{KHLuTNH^l5-g29Q9hSdah(fKQpH;ygsF-61uIt{c%U5mxj{u%g16XsM~|#GvlBaduc>j z(D+t0_tHV59Y-N6_W-tD)Cc$e)id;CJy16xp-O8>vGUR}bNlXs^QEa{kqaw2-B$jS zgp`~mG$)ytX1@Ea2~cOKQP8Bd!ewv@yVt3AQyvb>LsG-)X9f$lx0qNe?n+#fl6R3U zDc4uka1;+r_p!68Zm6`_&%w(aB_)$o#!NSpkZpC{FY=k8dn)mC^1h*=jsHR|%8ENr zvASifx5)(oV~o2yLP7beNtlsft@7&SZV?bdt5CzkBE zb$p-ev4T^9Kt@+CNK$*0=K9%P?>x+|b`x;7C}i7cHyN{G9$%VBDlZ`eq2%h?xxbW& zr_~%ERTsqab00%F?58*B#B7&ZTCB~QqrNpoN~Aqr;gKCS!qWm|lEq6p#<*D(f>v1^ zHSb2x;yWIEYq|byI%{UA(B@#9N0-C__k=X7z5ofCr0B|LqnZ&P4Z?hTVJ;cR>lA~) zH%+&osb~z_5>-rtGGS0DS*y{+(A4F~d9I2?b5On3JK`zHJN#(^Is%YhZJ=#Q4;DKWj9LN`-!M2ABd2PjV377zAW`r#Z1v zE~FvJhC}z2lXzrzramC~$1(W-O0ve! zd(Ko5SIR{0C}2d6^(t!(qH$$-#QOzjmC$| zKP=kX&-8qeQu{2W{Sw0=cbQ?xydNECTYuLadpt{UoFF#4nKAcZbjXvIz$@8szmTl6 z6#*uEdSqT&$yLMkHC_G8Ijr=iSH9T6jSk|Y(9pY2k`wjMm^%7+`5MI`mhFmj8^>)) z>S^S-MGI3bO_MLNR=zs{mR+JyipvWI>(R)x`Ch}FUE7-6#sO83RO&vpMQ|Rxof?1^ z#olde*ClY5OZAQtA9bo%C55rS3T@V`8Q-v$#7FbAcJl8f!e#p0*vqT?kAx&AZp=vc z?cGM;TlLq=(oxsho3Xx~t@1ED!hFQkxR! zyg{+r0H+w~q?C4u(({qe*83iryANk1Jm2omRpT)bqI*N8kP_8<3&szQ8QatZ_>RU~ zlu9}GZB~$g*ea9w3QD$r^SwWmuD};4E1-Ebbw?{KDedZl4>2@xV_pJ`Mgr&d`=&Fs zL1a=>UW>Bq@5(tG{lb0uww*cF$U*iJO`qG*)xTgqcvwF=|FG5Y(Ct$M=v8ap5@St~ zz_U{E`qVtdi{qwcTNF#DOkY|~FmkpW1 zNUi6`y;v;}CLB)Q)hRaL8|3 zIkOrxIj>TESE8#7RrU#SDH(h?6Igg{ib>AN)$K*o91J~XC<2X(QS%-#5a~BEey|&E z>j+H<;{)Vb*P?q3lK1bY-(h* zcG$W0vrf-Tg8C?%J+fid6@0Ht(clIi>Iz0c2{ zJEG|kA7g*H>LKH@t@|BMk4hAzr{{`d9nV7#KIIbG_p$Z`DW$Pw*F+9gV#dVi0WdkD zmg(BKylpK8Zb89*CbEJ<%^qGb=xQjr2r9HbX3uMdH%fdwbg_&COhb#J*w2y0anAt& z@#&Uof+OAzI)0V^`y*rDe8<6+7t{B7gsmZPzKC{vVr4b&8R;xRB};>+elJ1+|Ebt3 zWS~E4N)Yjj?=nW^6!|7FS19Z1UHf=+Pmbox9Rbw&lq(V^yG+o=*L2FC42QaTBbPt(LSv9;l-aD~X1I z&JkgT#k??dF8}sIDoQ(bED}r*;Oh@oS!cLRV_=+j_fa*1@}w)dP{v zz|gRoFL6>tI;g!}?isj*jGb-VIM|qLgg7{M;L32|6SH&)$=VTb2voCczOHhC2JC>C zlydBxwe~yVU=@35hub-khOh>`{G68+mlUuXYx<Y=uM#EzWem-DbsArB|cj}`w1!{9hrH>ue;2wr;J{DQBtW8!N3dBO`VMgd=1mM zVUqoNn+kzvjB)jDLX(3wQD_U>~bY<6en#8TXMyn1=|muBOIaB~qWrLCBv^4E0XpHTmuO+`>rR)L?OBjRKWKvqC#UGX zbmtOH!EF(NcGc0#e9lsGpzfZ*>=xHIBU2N|S&BP$hy%RCK9^nO&_n6Uq6L>Aq7J01 z`#wZt=!JcN2qUrWBMAv< zb1oxSm%b29NVx0}<-+IfVQwoD7Z(e1LjTtKbd)18nroGM@de_V1ISt5CA%)+aN^-a*duFjy|bC`H=HuzqtEq(x$|?4I|}W?U4H8; zFK&6hAf^ljXx6sJlQ-vEaqBTfPOiCpIwk^_j=z}`iQ(~f^zDy`0sS~>h6J0jZmZ() z2g^KK@ukjeD;TiZl^&lqLhr`qzcFbmGQIjea`B7n$qs|Afj#3nP<}~t7y-BbTxV49 z?1*S>oc-n0jVB-p0%7x?jf`yqvg)?=|GtO7G)NB|J5Dj2>g)ti8PseJ^UfwK@zHY0~dfERF0L^)Iu)%sFlWT%ox~ifh%>y=FRDJ zb8Ji_u#46pk7v+<@GH6_2a5IwHr<>|GVPp6!&+EClWuzs?PJtcD{r^C2(-R>ev~$b z8w66*Zj~XOOxxY!*2sGGY7`jmZLkk>EZ9Z`HdcRjkzyrhVgf0YB!Oe*!+L99>F3C% zd(Xhl*b)`2I^o~nv_EbTGjqLWJ`r^|uI@4vE^-V%)X^pVr2YI*vu7bYFNaFA*Yt-Jg}I%T1I(U(ui4)80`MFNt-)kZ|6E+Jl(Fj25IfL%8S)$d5=M- zP=&B66~)e~hDE#kH?Ah4eGirv_O&lNH4r7sJv5y ziY6a2Z7z_vfz!D%VLamocK@OoIWb$s`G)4{b|MH-0YdP|jS)Zortcag^40DekD(*n zN)aScx!^Hjmn$w|ENkS2Mn@u7g*gwb$oFA&ykwE@?R_jF*0-#Cb^p*abT}BGo&%Hi ztvD>6cDfaed}I?M!%ywM79CvWZe@&-E+f=;CL&0?ok~5D(9s6zZGG9^ zz|4%*tV)@1u5U^d9*UYAe!YK!)4p7dpHYoJ>OponqT1T_T0Y zV8vh@8+v*$8D8Mrt6OGLnAf+lKI(5- zXH7q&4ZT2$BX09hf+*eDuxE9K1FutgL|&_k>$h6U*m>b*{>2^&HNSDBop^ zVBQ#p83n{bzNqx1Z$21;aOB8CqAO{mZuoyaz)RXKRia{FYzM5SVHZPxw~fjXZGMyh zzNvG8`-G?rL88%$%Nz4Jh!m`c$ET*g%i{Bp><}yrZxWp$#7MFHx~rUtFtoaRFvFe8 zxm=3(3aInCJdQU>Vg0%(-s&7!UUqOtGq-bsP-E!r`aL)oUFZF0%)3sFmGM*Iw6)s4 zh*OD;Ki}9jaLt~J`tmJEbWwRUCHu(=z)u^GC=91r>+if&lD zbJI&JwOpciaKr@>#|Qo96`ds7nHVMlllk(Bd0xHVAvtvtx6Yk=iFu_++rg8goK>@K zH(x9voFa0-_qxgMnhd1SSExn2Bk2=CY0rk>*1$d|tZeMFBE7Sc5R zXFKfLPCB=uKPGLYapS$>`DA?fNxRj+_8+RapO$6h%$T{XF>WOnEbh+vnr7 z>UjeoLNQnueZ59Jj(1zh0}dH$BJ<*{=9G4nAV@T+NGJ4?hTD_iXR| zfhFV10E)dep5VdTZMhYFBpT);+s9({stP^1Mu1OLyES5jc)dCjzZaCQlcJiCrRVtc zL6l`rqqntcV3)JMUxjSF3A6bte`k1ZZ3-?bC1JMyyT?T8z$3)NWfc?kL(%${!q8>M z=vMe=>^02P5_1!tG=TTbPbNZs1PiuVN3@jzQuqII2#{_`EaiL!KY z++!u~GMuRcs9N6q)}49?^Ffi0@q+lvs2%O)1<>(LT^SPsk7^6cQ9ZqO75(+Jpy?Bx z6$(daZ}89g@z31@S@-t{Dp%N6^#)Mv@*}FDo*lS?!pU2>!@`H8J?kvo{Tc~3YL|8dxA6_%5hRHol~gv#bMJ|yRYFBAj0Hi> z*$_^(t^WKC{_3Nv9?e1=eFdy0GydLwtF;6_!N6JxP=)ImYzM_= zniM|h;D9D1uc^zzv5s>Ah1g2uV3-tUXx}8^tlmt%5j}x-XY^gJz_3nlc8^Pvn8Jmb zJu2}DtY7yECI~Fw;M>wRxsoin_uotpQQh7?pRmi4CaezvBnc?Kc=A1&f?afJA{g#s zX&8oej7Tn!Ys&Uj!{q+z+Zf8|fmzDtx9IeY8^+7hA|D&2+dTH^Q;R3MX12m>CxTbc z2bL4DerJ&{oh*){K4)jH>josWaL(m^tK_g-iG%o{l5IUogEKAq^$Oe*9(a7#fQutT zR}qjARH!{;oLwG#3o-XB-kF$l^Bv4Q6$>9Fn@dPX#*%YGx2q%|(fci1N~1`d4fQa{ zOLM*%-fqHukJXexJ3n${XW+~FtJe|pL(~E8tDgNHErknOr~eDjsWJ7OYAASs zP9HCV-**bL56Np08PhJR_AMw_ z8D3ufYGS`$T{vSF^Vw*1&sdr8P0mQ~of~#9>j}I|B=pL3LYmeoHDwX--!i1Yz&07BggWxZPO5 zRBvqhINH%U^a}_6mluXrqisT7#_Eu3Snnd5*JKXYCk`36jw@}b+)-T>-Kk9>Ut;St zWh>n7PiZy4s^hU!&UT*73r8VGagesYcH;)pdG(IO5Y_~%mg3z)9MW&&MyjO9-f21? z|7HJ{E>dENAC;^NgFL4gH(W{FkiF=64W)J2WrV*DEEVa#yKl&tn$x*2c4O=Lm{-zb zH+|Ap{d>P2Av!>N{xx(I6}*!s*4o==N73t%wK11DVSn&(FG8w+kH4a@Ve&#^J5D=( zhFxaf!gg)#?e=jz-#iFX?EPyprojUmW}MrG*Gv_fBS?y&o@PeJ?o7Og&}_HY^2C+A zPOEm44xI9<0v1gol$4`!u{}5%v0%=KL2QwBD*MivmXhLHnKkvDiEaDC!S3XRuP(Re zg*ws_L_5=nZ~v`R&V#pD;PK|)y#WfElpy;LEd*XVf#)0IS@C~)3k4o-{uBjIA>iAc zzk7l8*P=h)kr1yw0Pwqvvu1rSbf}LMFCT{QIi{B02rw0{N&*?$~ zE@cFs+m=$K5N5v2Pm*9S-YUf6H?bQ^3m#s72lm6rUy%M^>WBlxnLlFmKO+@B8pV7B zFbnGD*&d@eCE!uSH#&8c2UanM&t8AqPKuc&e3Kxe;NEhJ>84$Cr(?djb=9tdBuE~! zy0t`n^8Ie`2fn`#_^(C(`}I@krlexP_@TJoSLYUL5yEX>tD6wVgcZRpU`9d_&#q z_pcw?em$-TR^;Vug&&ZJntwq02N=y$WE>~~rh3KDAgD_Rz3@?tFd6W4GLYp6FEqQ9 zH@n6ngLf%bcj20%HbjJo z{PDw!tzg8!Jn*{X0)ZN2(Xpu*ohxg|CU^0a0{rj*`Pr*#+>{gKBf32 zW&cSvvL5*lE%X!H|1kaUV)#k)7i#%Ao8>q`g4cb;bOccPjfNzIHMIQsY+8~u36lcU zg|AggF?cd`YJY~uRGb>1UT_8T`yP#C|0EpT6u7tS6#qdj{8Z|H5=;Y=e=|KG95NwB zrXFJv8pQu~7g`fL>#s;s2h_&R!oZ5u`B9Pg=mDmP8uPw`)8O~J|5wrdE9ChPA^nwe ze%=cIl70T4ao$xgFdV`!Ws+wn__k>j133X*H>GY^?v+$O2@x^7M~H_Wl$)o&sTC*t=b`zDO5M_VwsS!lEtVsb@7YDk z>K^Xgj5&;*6&*o!?&kW)wjSDk^-qJYQytp0Lk?nt6w{vm8L9-UG!+;A)-15cD&>(C z_3OCk|6r25o~B_(8G7)lp0JPSDPWc%lVp zGWqv*mw#hp`cw4h)cvCo`Y8~<&-}SK|8UdKqJM1HnH^UY0YDdP8FQHMnkQRy3m=a< z-1mfHHav)PjCUc>RAK7v-OwOgVk4rSMxc?8nbi;dL-&vR{9^#rZFcCumQE*GLlU%r zhd~b>nSbJB1uwt>VOm+O^$8kMbqda=|4`?SrvDEu^wWoOKb!Ku=*fRD>mPOfW8jw@ z`X_Y%S8Ve4qxoazKTOnro(TU`^cM~TEzo_%vt6>yZsr4)I>4|3N9;jkCYaWC588T2 z)I*6IA^-^U%D8~X#UH)&k39J!^ZvdUx>HH#F|MkaBoiI{23glHj4H;`XAfJe|N%<)DV6=?f&ygc5&5_Ko!Go3+$<8p3K96&X7Za2$^$*JkzmQY)V6XX~S?H&4N59+rZw6fV%OM@$cPlg~ VmxeM0{E8KT-qgI2uV5DPe*ohtD$f7_ literal 0 HcmV?d00001 diff --git a/doc/elements/storage.psd b/doc/elements/storage.psd new file mode 100644 index 0000000000000000000000000000000000000000..0f7691d58281a33c9abd49fe686611b41e2668d6 GIT binary patch literal 217897 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 literal 0 HcmV?d00001 diff --git a/doc/elements/storage.rst b/doc/elements/storage.rst index 97196b298..3a6115060 100644 --- a/doc/elements/storage.rst +++ b/doc/elements/storage.rst @@ -16,7 +16,7 @@ Input Parameters *net.storage* .. tabularcolumns:: |p{0.10\linewidth}|p{0.10\linewidth}|p{0.25\linewidth}|p{0.40\linewidth}| -.. csv-table:: +.. csv-table:: :file: storage_par.csv :delim: ; :widths: 10, 10, 25, 40 @@ -24,25 +24,25 @@ Input Parameters .. |br| raw:: html
- + \*necessary for executing a power flow calculation |br| \*\*optimal power flow parameter - + Electric Model ================= Storages are modelled as PQ-buses in the power flow calculation: -.. image:: pq.png +.. image:: storage.png :width: 8em :alt: alternate Text :align: center - + The PQ-Values are calculated from the parameter table values as: .. math:: :nowrap: - + \begin{align*} P_{storage} &= p\_kw \cdot scaling \\ Q_{storage} &= q\_kvar \cdot scaling \\ @@ -53,7 +53,7 @@ The PQ-Values are calculated from the parameter table values as: Since all power values are given in the consumer system, negative power models charging and positive activee power models discharging. .. note:: - + The apparent power value sn_kva, state of charge soc and storage capacity max_e_kwh are provided as additional information for usage in controller or other applications based on panadapower. It is not considered in the power flow! Result Parameters @@ -61,7 +61,7 @@ Result Parameters *net.res_storage* .. tabularcolumns:: |p{0.10\linewidth}|p{0.10\linewidth}|p{0.50\linewidth}| -.. csv-table:: +.. csv-table:: :file: storage_res.csv :delim: ; :widths: 10, 10, 50 From 68b2f7276049ab9e6d57a0d1b44aeb1201a5b1cc Mon Sep 17 00:00:00 2001 From: Florian Schaefer Date: Thu, 19 Apr 2018 14:10:26 +0200 Subject: [PATCH 14/40] changed storage back to an arrow :battery: --- doc/elements/storage.png | Bin 13862 -> 13462 bytes doc/elements/storage.psd | Bin 217897 -> 222453 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/elements/storage.png b/doc/elements/storage.png index 8f9c21cf974997d2e60f000d9dfc252a2d181434..ec0af8fa98164cb89dd5365833f70e4fce8cce9f 100644 GIT binary patch delta 7908 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 Se-#4$T)SeZ_wkZ_4V?q%i!usmf}w+o;vh|W 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 G;Qs@23W93@ literal 217897 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 From abffa0a171c36a2cbbdb99dd183ec2a3dfd28ca5 Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Sun, 22 Apr 2018 13:36:52 +0200 Subject: [PATCH 15/40] pandapower citation --- README.rst | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/README.rst b/README.rst index cf9efb878..7ba2eaaaf 100644 --- a/README.rst +++ b/README.rst @@ -79,18 +79,20 @@ There is a project to develop a GUI for pandapower: https://github.com/johaack/p Citing pandapower ================== -A paper describing pandapower has been accepted for publication in IEEE Transaction on Power Systems, a preprint of this paper is available on `arXiv `_ Please acknowledge the usage of pandapower by citing the Paper as follows: +A paper describing pandapower has been accepted for publication in IEEE Transaction on Power Systems, a preprint of this paper is available on `arXiv `_. Please acknowledge the usage of pandapower by citing the Paper as follows: -- **L. Thurner, A. Scheidler, F. Schäfer et al.**, “pandapower - an Open Source Python Tool for Convenient Modeling, Analysis and Optimization of Electric Power Systems,” IEEE Transaction on Power Systems (to be published), 2018. +- **L. Thurner, A. Scheidler, F. Schäfer et al.**, `pandapower - an Open Source Python Tool for Convenient Modeling, Analysis and Optimization of Electric Power Systems `_, IEEE Transactions on Power Systems (to be published), `DOI:10.1109/TPWRS.2018.2829021 `_, 2018. You can use the following BibTex entry: :: - @article{pandapower, - author = {{Thurner}, L. and {Scheidler}, A. and {Sch{\"a}fer}, F. and {Menke}, J.-H. and {Dollichon}, J. and {Meier}, F. and {Meinecke}, S. and {Braun}, M.}, - title = "{pandapower - an Open Source Python Tool for Convenient Modeling, Analysis and Optimization of Electric Power Systems}", - year = 2018, - journal = {IEEE Transaction on Power Systems (to be published)}, - url = {https://arxiv.org/abs/1709.06743} + @ARTICLE{pandapower.2018, + author={L. Thurner and A. Scheidler and F. Schafer and J. H. Menke and J. Dollichon and F. Meier and S. Meinecke and M. Braun}, + journal={IEEE Transactions on Power Systems}, + title={pandapower - an Open Source Python Tool for Convenient Modeling, Analysis and Optimization of Electric Power Systems}, + year={2018}, + doi={10.1109/TPWRS.2018.2829021}, + url={https://arxiv.org/abs/1709.06743}, + ISSN={0885-8950} } Minimal Example From 90e6ee23faa603ea5dce1d75fc679ee59dcef06c Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Mon, 23 Apr 2018 09:38:30 +0200 Subject: [PATCH 16/40] pandapower citation --- README.rst | 2 +- doc/about/citing.rst | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/README.rst b/README.rst index 7ba2eaaaf..c13a07e97 100644 --- a/README.rst +++ b/README.rst @@ -81,7 +81,7 @@ Citing pandapower A paper describing pandapower has been accepted for publication in IEEE Transaction on Power Systems, a preprint of this paper is available on `arXiv `_. Please acknowledge the usage of pandapower by citing the Paper as follows: -- **L. Thurner, A. Scheidler, F. Schäfer et al.**, `pandapower - an Open Source Python Tool for Convenient Modeling, Analysis and Optimization of Electric Power Systems `_, IEEE Transactions on Power Systems (to be published), `DOI:10.1109/TPWRS.2018.2829021 `_, 2018. +- **L. Thurner, A. Scheidler, F. Schäfer et al**, `pandapower - an Open Source Python Tool for Convenient Modeling, Analysis and Optimization of Electric Power Systems `_, IEEE Transactions on Power Systems, `DOI:10.1109/TPWRS.2018.2829021 `_, 2018. You can use the following BibTex entry: :: diff --git a/doc/about/citing.rst b/doc/about/citing.rst index 8ccc106e5..d969234bc 100644 --- a/doc/about/citing.rst +++ b/doc/about/citing.rst @@ -1,13 +1,18 @@ Citing pandapower ================== -We are currently working on publishing a paper about pandapower, which is available as a `preprint on arxiv `_. -Until the paper has passed peer-review, please acknowledge the usage of pandapower in your paper as follows: :: - - @online{pandapower, - author = {{Thurner}, L. and {Scheidler}, A. and {Sch{\"a}fer}, F. and {Menke}, J.-H. and {Dollichon}, J. and {Meier}, F. and {Meinecke}, S. and {Braun}, M.}, - title = "{pandapower - an Open Source Python Tool for Convenient Modeling, Analysis and Optimization of Electric Power Systems}", - year = 2017, - url = {https://arxiv.org/abs/1709.06743}, - note = {preprint} - } +A paper describing pandapower has been accepted for publication in IEEE Transaction on Power Systems, a preprint of this paper is available on `arXiv `_. Please acknowledge the usage of pandapower by citing the Paper as follows: + +- **L. Thurner, A. Scheidler, F. Schäfer et al**, `pandapower - an Open Source Python Tool for Convenient Modeling, Analysis and Optimization of Electric Power Systems `_, IEEE Transactions on Power Systems, `DOI:10.1109/TPWRS.2018.2829021 `_, 2018. + +You can use the following BibTex entry: :: + + @ARTICLE{pandapower.2018, + author={L. Thurner and A. Scheidler and F. Schafer and J. H. Menke and J. Dollichon and F. Meier and S. Meinecke and M. Braun}, + journal={IEEE Transactions on Power Systems}, + title={pandapower - an Open Source Python Tool for Convenient Modeling, Analysis and Optimization of Electric Power Systems}, + year={2018}, + doi={10.1109/TPWRS.2018.2829021}, + url={https://arxiv.org/abs/1709.06743}, + ISSN={0885-8950} + } \ No newline at end of file From 9cf6cde744d802f32629fbb6c7fc542e224f4d90 Mon Sep 17 00:00:00 2001 From: Steffen Meinecke Date: Mon, 23 Apr 2018 09:41:42 +0200 Subject: [PATCH 17/40] update pandapower citation --- doc/about/citing.rst | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/doc/about/citing.rst b/doc/about/citing.rst index 8ccc106e5..3780a6f98 100644 --- a/doc/about/citing.rst +++ b/doc/about/citing.rst @@ -1,13 +1,15 @@ Citing pandapower ================== -We are currently working on publishing a paper about pandapower, which is available as a `preprint on arxiv `_. -Until the paper has passed peer-review, please acknowledge the usage of pandapower in your paper as follows: :: +A paper describing pandapower has been accepted for publication in IEEE Transaction on Power Systems, a preprint of this paper is available on arxiv `_. +Please acknowledge the usage of pandapower by citing the Paper as follows: :: - @online{pandapower, - author = {{Thurner}, L. and {Scheidler}, A. and {Sch{\"a}fer}, F. and {Menke}, J.-H. and {Dollichon}, J. and {Meier}, F. and {Meinecke}, S. and {Braun}, M.}, + @ARTICLE{pandapower.2018, + author = {L. Thurner and A. Scheidler and F. Schafer and J. H. Menke and J. Dollichon and F. Meier and S. Meinecke and M. Braun}, + journal={IEEE Transactions on Power Systems}, title = "{pandapower - an Open Source Python Tool for Convenient Modeling, Analysis and Optimization of Electric Power Systems}", - year = 2017, + year = {2018}, + doi={10.1109/TPWRS.2018.2829021}, url = {https://arxiv.org/abs/1709.06743}, - note = {preprint} + ISSN={0885-8950} } From 239587cee18d1a3d383ef36f841f0c3af3edc4f0 Mon Sep 17 00:00:00 2001 From: rbolgaryn Date: Mon, 23 Apr 2018 17:34:13 +0200 Subject: [PATCH 18/40] changelog and trafo parameters in the doc tables --- CHANGELOG.rst | 2 ++ doc/elements/trafo3w_par.csv | 5 +++++ doc/elements/trafo_par.csv | 4 +++- pandapower/create.py | 4 ++++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 903b354c0..97dbd802a 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -11,6 +11,8 @@ Change Log - [ADDED] new parameter g_us_per_km to model dielectric losses in lines - [ADDED] single phase short-circuit calculation with negative sequence models - [ADDED] generic storage model (sgen/load like element with negative / positive power allowed) +- [ADDED] modelling of the complex (voltage magnitude and angle) tap changer +- [ADDED] modelling of the tap changer of a 3-winding transformer at terminals [1.4.3] - 2018-02-06 ---------------------- diff --git a/doc/elements/trafo3w_par.csv b/doc/elements/trafo3w_par.csv index 4e19c8b5d..5d2aeff45 100644 --- a/doc/elements/trafo3w_par.csv +++ b/doc/elements/trafo3w_par.csv @@ -1,5 +1,6 @@ **Parameter**;**Datatype**;**Value Range**;**Explanation** name;string;;name of the transformer +std_type;string;;transformer standard type name hv_bus*;integer;;high voltage bus index of the transformer mv_bus;integer;;medium voltage bus index of the transformer lv_bus*;integer;;low voltage bus index of the transformer @@ -17,10 +18,14 @@ vscr_mv_percent*;float;:math:`\geq` 0;real part of short circuit voltage from m vscr_lv_percent*;float;:math:`\geq` 0;real part of short circuit voltage from high to low voltage [%] pfe_kw*;float;:math:`\geq` 0;iron losses [kW] i0_percent*;float;:math:`\geq` 0;open loop losses [%] +shift_mv_degree;float;;transformer phase shift angle at the MV side +shift_lv_degree;float;;transformer phase shift angle at the LV side tp_side;string;"""hv"", ""mv"", ""lv""";defines if tap changer is positioned on high- medium- or low voltage side tp_mid;integer;; tp_min;integer;;minimum tap position tp_max;integer;;maximum tap position tp_st_percent;float;:math:`>` 0;tap step size [%] +tp_st_degree;float;;tap step size for voltage angle +tp_at_star_point;bool;;whether the tap changer is modelled at terminal or at star point tp_pos;integer;;current position of tap changer in_service*;boolean;True/False;specifies if the transformer is in service. diff --git a/doc/elements/trafo_par.csv b/doc/elements/trafo_par.csv index 80241182c..87b1b34f3 100644 --- a/doc/elements/trafo_par.csv +++ b/doc/elements/trafo_par.csv @@ -7,7 +7,7 @@ sn_kva*;float;:math:`>` 0;rated apparent power of the transformer [kVA] vn_hv_kv*;float;:math:`>` 0;rated voltage at high voltage bus [kV] vn_lv_kv*;float;:math:`>` 0;rated voltage at low voltage bus [kV] vsc_percent*;float;:math:`>` 0;short circuit voltage [%] -vscr_percent*;float;:math:`\geq` 0;"real component of +vscr_percent*;float;:math:`\geq` 0;"real component of short circuit voltage [%]" pfe_kw*;float;:math:`\geq` 0;iron losses [kW] i0_percent*;float;:math:`\geq` 0;open loop losses in [%] @@ -19,6 +19,8 @@ tp_max;integer;;maximum tap position tp_st_percent;float;:math:`>` 0;tap step size for voltage magnitude [%] tp_st_degree;float;:math:`\geq` 0;tap step size for voltage angle tp_pos;integer;;current position of tap changer +tp_phase_shifter;bool;;defines whether the transformer is an ideal phase shifter +parallel;int;:math:`>` 0;number of parallel transformers max_loading_percent**;float;:math:`>` 0;Maximum loading of the transformer with respect to sn_kva and its corresponding current at 1.0 p.u. df;float;1 :math:`\geq` df :math:`>`0;derating factor: maximal current of transformer in relation to nominal current of transformer (from 0 to 1) in_service*;boolean;True / False;specifies if the transformer is in service. diff --git a/pandapower/create.py b/pandapower/create.py index d7fdec84f..73d5cd518 100644 --- a/pandapower/create.py +++ b/pandapower/create.py @@ -1564,6 +1564,8 @@ def create_transformer_from_parameters(net, hv_bus, lv_bus, sn_kva, vn_hv_kv, vn **tp_st_degree** (float) - tap step size for voltage angle in degree* + **tp_phase_shifter** (bool) - whether the transformer is an ideal phase shifter* + **index** (int, None) - Force a specified ID if it is available. If None, the index one \ higher than the highest already existing index is selected. @@ -1670,6 +1672,8 @@ def create_transformer3w(net, hv_bus, mv_bus, lv_bus, std_type, name=None, tp_po **max_loading_percent (float)** - maximum current loading (only needed for OPF) + **tap_at_star_point (bool)** - whether tap changer is modelled at star point or at the bus + OUTPUT: **index** (int) - The unique ID of the created transformer From ae44d259013fc0f9ed1111842edf012455e994eb Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Mon, 23 Apr 2018 17:36:11 +0200 Subject: [PATCH 19/40] introduced trafo3w_losses parameter in runpp to allow allocation of open loop losses #98 --- pandapower/auxiliary.py | 5 +++-- pandapower/build_branch.py | 15 +++++++++++---- pandapower/build_bus.py | 6 +++++- pandapower/run.py | 11 +++++++---- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/pandapower/auxiliary.py b/pandapower/auxiliary.py index 3481c322a..7a87c6fb5 100644 --- a/pandapower/auxiliary.py +++ b/pandapower/auxiliary.py @@ -368,7 +368,7 @@ def _select_is_elements_numba(net, isolated_nodes=None): def _add_ppc_options(net, calculate_voltage_angles, trafo_model, check_connectivity, mode, copy_constraints_to_ppc, r_switch, init, enforce_q_lims, recycle, delta=1e-10, - voltage_depend_loads=False): + voltage_depend_loads=False, trafo3w_losses="hv"): """ creates dictionary for pf, opf and short circuit calculations from input parameters. """ @@ -386,7 +386,8 @@ def _add_ppc_options(net, calculate_voltage_angles, trafo_model, check_connectiv "enforce_q_lims": enforce_q_lims, "recycle": recycle, "voltage_depend_loads": voltage_depend_loads, - "delta": delta + "delta": delta, + "trafo3w_losses": trafo3w_losses } _add_options(net, options) diff --git a/pandapower/build_branch.py b/pandapower/build_branch.py index 18eb7524c..5d1a872f4 100644 --- a/pandapower/build_branch.py +++ b/pandapower/build_branch.py @@ -428,6 +428,7 @@ def wye_delta(zbr_n, s): def _trafo_df_from_trafo3w(net): mode = net._options["mode"] + loss_location = net._options["trafo3w_losses"].lower() trafos2w = {} nr_trafos = len(net["trafo3w"]) tap_variables = ("tp_pos", "tp_mid", "tp_max", "tp_min", "tp_st_percent", "tp_st_degree") @@ -470,8 +471,10 @@ def _trafo_df_from_trafo3w(net): trafos2w[i] = {"hv_bus": ttab.hv_bus, "lv_bus": ttab.ad_bus, "sn_kva": ttab.sn_hv_kva, "vn_hv_kv": ttab.vn_hv_kv, "vn_lv_kv": ttab.vn_hv_kv, - "vscr_percent": vscr_2w[0], "vsc_percent": vsc_2w[0], "pfe_kw": ttab.pfe_kw, - "i0_percent": ttab.i0_percent, "tp_side": taps[0]["tp_side"], + "vscr_percent": vscr_2w[0], "vsc_percent": vsc_2w[0], + "pfe_kw": ttab.pfe_kw if loss_location == "hv" else 0, + "i0_percent": ttab.i0_percent if loss_location == "hv" else 0, + "tp_side": taps[0]["tp_side"], "tp_mid": taps[0]["tp_mid"], "tp_max": taps[0]["tp_max"], "tp_min": taps[0]["tp_min"], "tp_pos": taps[0]["tp_pos"], "tp_st_percent": taps[0]["tp_st_percent"], @@ -481,7 +484,9 @@ def _trafo_df_from_trafo3w(net): trafos2w[i + nr_trafos] = {"hv_bus": ttab.ad_bus, "lv_bus": ttab.mv_bus, "sn_kva": ttab.sn_mv_kva, "vn_hv_kv": ttab.vn_hv_kv, "vn_lv_kv": ttab.vn_mv_kv, "vscr_percent": vscr_2w[1], - "vsc_percent": vsc_2w[1], "pfe_kw": 0, "i0_percent": 0, + "vsc_percent": vsc_2w[1], + "pfe_kw": ttab.pfe_kw if loss_location == "mv" else 0, + "i0_percent": ttab.i0_percent if loss_location == "mv" else 0, "tp_side": taps[1]["tp_side"], "tp_mid": taps[1]["tp_mid"], "tp_max": taps[1]["tp_max"], "tp_min": taps[1]["tp_min"], "tp_pos": taps[1]["tp_pos"], @@ -495,7 +500,9 @@ def _trafo_df_from_trafo3w(net): "sn_kva": ttab.sn_lv_kva, "vn_hv_kv": ttab.vn_hv_kv, "vn_lv_kv": ttab.vn_lv_kv, "vscr_percent": vscr_2w[2], "vsc_percent": vsc_2w[2], - "pfe_kw": 0, "i0_percent": 0, "tp_side": taps[2]["tp_side"], + "pfe_kw": ttab.pfe_kw if loss_location == "lv" else 0, + "i0_percent": ttab.i0_percent if loss_location == "lv" else 0, + "tp_side": taps[2]["tp_side"], "tp_mid": taps[2]["tp_mid"], "tp_max": taps[2]["tp_max"], "tp_min": taps[2]["tp_min"], "tp_pos": taps[2]["tp_pos"], "tp_st_percent": taps[2]["tp_st_percent"], diff --git a/pandapower/build_bus.py b/pandapower/build_bus.py index 64e9d5504..e00564b04 100644 --- a/pandapower/build_bus.py +++ b/pandapower/build_bus.py @@ -395,7 +395,11 @@ def _calc_shunts_and_add_on_ppc(net, ppc): q = np.hstack([q, xw["qz_kvar"].values * vl]) p = np.hstack([p, xw["pz_kw"].values * vl]) b = np.hstack([b, xw["bus"].values]) - + + loss_location = net._options["trafo3w_losses"] + if loss_location == "star": + raise NotImplementedError("Losses at star point not yet implemented") + # if array is not empty if b.size: b = bus_lookup[b] diff --git a/pandapower/run.py b/pandapower/run.py index c5c2d9505..bd620a543 100644 --- a/pandapower/run.py +++ b/pandapower/run.py @@ -78,7 +78,8 @@ def _passed_runpp_parameters(local_parameters): 'tolerance_kva': 1e-05, 'trafo_loading': 'current', 'trafo_model': 't', - 'voltage_depend_loads': True + 'voltage_depend_loads': True, + "trafo3w_losses": "hv" } passed_parameters = { @@ -91,7 +92,7 @@ def _passed_runpp_parameters(local_parameters): def runpp(net, algorithm='nr', calculate_voltage_angles="auto", init="auto", max_iteration="auto", tolerance_kva=1e-5, trafo_model="t", trafo_loading="current", enforce_q_lims=False, numba=True, recycle=None, check_connectivity=True, r_switch=0.0, voltage_depend_loads=True, - delta_q=0, **kwargs): + delta_q=0, trafo3w_losses="hv", **kwargs): """ Runs PANDAPOWER AC Flow @@ -189,6 +190,8 @@ def runpp(net, algorithm='nr', calculate_voltage_angles="auto", init="auto", max **voltage_depend_loads** (bool, True) - consideration of voltage-dependent loads. If False, net.load.const_z_percent and net.load.const_i_percent are not considered, i.e. net.load.p_kw and net.load.q_kvar are considered as constant-power loads. **delta_q** - Reactive power tolerance for option "enforce_q_lims" in kvar - helps convergence in some cases. + + **trafo3w_losses** - defines where open loop losses of three-winding transformers are considered. Valid options are "hv", "mv", "lv" for HV/MV/LV side or "star" for the star point. ****kwargs** - options to use for PYPOWER.runpf """ @@ -233,13 +236,13 @@ def runpp(net, algorithm='nr', calculate_voltage_angles="auto", init="auto", max max_iteration = default_max_iteration[algorithm] # init options - # net.__internal_options = {} net._options = {} _add_ppc_options(net, calculate_voltage_angles=calculate_voltage_angles, trafo_model=trafo_model, check_connectivity=check_connectivity, mode=mode, copy_constraints_to_ppc=copy_constraints_to_ppc, r_switch=r_switch, init=init, enforce_q_lims=enforce_q_lims, - recycle=recycle, voltage_depend_loads=voltage_depend_loads, delta=delta_q) + recycle=recycle, voltage_depend_loads=voltage_depend_loads, delta=delta_q, + trafo3w_losses=trafo3w_losses) _add_pf_options(net, tolerance_kva=tolerance_kva, trafo_loading=trafo_loading, numba=numba, ac=ac, algorithm=algorithm, max_iteration=max_iteration) # net.__internal_options.update(overrule_options) From e791f812934a6cabfe6e10e015a9b1c85b021519 Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Tue, 24 Apr 2018 08:25:36 +0200 Subject: [PATCH 20/40] iee pic --- CHANGELOG.rst | 4 ++-- doc/about.rst | 2 +- doc/pics/iee.png | Bin 0 -> 21714 bytes doc/pics/iwes.png | Bin 44657 -> 0 bytes 4 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 doc/pics/iee.png delete mode 100644 doc/pics/iwes.png diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 97dbd802a..cd5ded7df 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -11,8 +11,8 @@ Change Log - [ADDED] new parameter g_us_per_km to model dielectric losses in lines - [ADDED] single phase short-circuit calculation with negative sequence models - [ADDED] generic storage model (sgen/load like element with negative / positive power allowed) -- [ADDED] modelling of the complex (voltage magnitude and angle) tap changer -- [ADDED] modelling of the tap changer of a 3-winding transformer at terminals +- [ADDED] modelling of the complex (voltage magnitude and angle) tap changer for cross control +- [ADDED] modelling of the tap changer of a 3-winding transformer at star point or terminals [1.4.3] - 2018-02-06 ---------------------- diff --git a/doc/about.rst b/doc/about.rst index ed32fcc32..e4afa9a72 100644 --- a/doc/about.rst +++ b/doc/about.rst @@ -8,7 +8,7 @@ aimed at automation of analysis and optimization in power systems. pandapower is a joint development of the research group Energy Management and Power System Operation, University of Kassel and the Department for Distribution System Operation at the Fraunhofer Institute for Energy Economics and Energy System Technology (IEE), Kassel. -.. image:: /pics/iwes.png +.. image:: /pics/iee.png :width: 18em :align: left diff --git a/doc/pics/iee.png b/doc/pics/iee.png new file mode 100644 index 0000000000000000000000000000000000000000..291c981982df6952213b199866a05949e3a0531a GIT binary patch literal 21714 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 CBcH Date: Mon, 23 Apr 2018 13:46:30 +0200 Subject: [PATCH 21/40] merge conflict resolved --- pandapower/create.py | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/pandapower/create.py b/pandapower/create.py index 75d86ee0e..1e596e244 100644 --- a/pandapower/create.py +++ b/pandapower/create.py @@ -2324,14 +2324,14 @@ def create_dcline(net, from_bus, to_bus, p_kw, loss_percent, loss_kw, vm_from_pu return index -def create_measurement(net, type, element_type, value, std_dev, bus, element=None, +def create_measurement(net, meas_type, element_type, value, std_dev, bus, element=None, check_existing=True, index=None, name=None): """ Creates a measurement, which is used by the estimation module. Possible types of measurements are: v, p, q, i INPUT: - **type** (string) - Type of measurement. "v", "p", "q", "i" are possible. + **meas_type** (string) - Type of measurement. "v", "p", "q", "i" are possible. **element_type** (string) - Clarifies which element is measured. "bus", "line", "transformer" are possible. @@ -2343,7 +2343,8 @@ def create_measurement(net, type, element_type, value, std_dev, bus, element=Non **bus** (int) - Index of bus. Determines the position of the measurement for line/transformer measurements (bus == from_bus: measurement at from_bus; - same for to_bus) + same for to_bus). The bus can also be "from" or "to" if the element_type is "line" + or "hv"/"lv" if "transformer". **element** (int, None) - Index of measured element, if element_type is "line" or "transformer". @@ -2366,9 +2367,24 @@ def create_measurement(net, type, element_type, value, std_dev, bus, element=Non if bus not in net["bus"].index.values: raise UserWarning("Bus %s does not exist" % bus) - if element is None and element_type in ["line", "transformer"]: + if element is None and element_type in ("line", "transformer"): raise UserWarning("The element type %s requires a value in 'element'" % element_type) + if meas_type not in ("v", "p", "q", "i"): + raise UserWarning("Invalid measurement type (%s)" % meas_type) + + if meas_type == "v": + element_type = "bus" + + if element_type not in ("bus", "line", "transformer"): + raise UserWarning("Invalid element type (%s)" % element_type) + + if bus in ("from", "to") and element_type == "line": + bus = net.line.from_bus.loc[element] if bus == "from" else net.line.to_bus.loc[element] + + if bus in ("hv", "lv") and element_type == "transformer": + bus = net.trafo.hv_bus.loc[element] if bus == "hv" else net.trafo.lv_bus.loc[element] + if element is not None and element_type == "line" and element not in net["line"].index.values: raise UserWarning("Line %s does not exist" % element) @@ -2382,21 +2398,21 @@ def create_measurement(net, type, element_type, value, std_dev, bus, element=Non if index in net["measurement"].index: raise UserWarning("A measurement with index %s already exists" % index) - if type == "i" and element_type == "bus": + if meas_type == "i" and element_type == "bus": raise UserWarning("Line current measurements cannot be placed at buses") - if type == "v" and element_type in ["line", "transformer"]: + if meas_type == "v" and element_type in ("line", "transformer"): raise UserWarning("Voltage measurements can only be placed at buses, not at %s" % element_type) if check_existing: if element is None: - existing = net.measurement[(net.measurement.type == type) & + existing = net.measurement[(net.measurement.type == meas_type) & (net.measurement.element_type == element_type) & (net.measurement.bus == bus) & (pd.isnull(net.measurement.element))].index else: - existing = net.measurement[(net.measurement.type == type) & + existing = net.measurement[(net.measurement.type == meas_type) & (net.measurement.element_type == element_type) & (net.measurement.bus == bus) & (net.measurement.element == element)].index @@ -2406,7 +2422,7 @@ def create_measurement(net, type, element_type, value, std_dev, bus, element=Non raise UserWarning("More than one measurement of this type exists") dtypes = net.measurement.dtypes - net.measurement.loc[index] = [name, type.lower(), element_type, value, std_dev, bus, element] + net.measurement.loc[index] = [name, meas_type.lower(), element_type, value, std_dev, bus, element] _preserve_dtypes(net.measurement, dtypes) return index From 5c98df9e4f018961fe3ba788f5dd913cc0bc59c0 Mon Sep 17 00:00:00 2001 From: Jan-Hendrik Menke Date: Tue, 24 Apr 2018 10:22:14 +0200 Subject: [PATCH 22/40] added bus-bus-switches for plotting (gitlab #76) --- pandapower/plotting/collections.py | 73 ++++++++++++++++++++++++++---- 1 file changed, 65 insertions(+), 8 deletions(-) diff --git a/pandapower/plotting/collections.py b/pandapower/plotting/collections.py index 7a9078531..7a69d142e 100644 --- a/pandapower/plotting/collections.py +++ b/pandapower/plotting/collections.py @@ -639,7 +639,7 @@ def create_ext_grid_collection(net, size=1., infofunc=None, orientation=0, picke def create_line_switch_collection(net, size=1, distance_to_bus=3, use_line_geodata=False, **kwargs): """ - Creates a matplotlib patch collection of pandapower switches. + Creates a matplotlib patch collection of pandapower line-bus switches. INPUT: **net** (pandapowerNet) - The pandapower network @@ -678,7 +678,7 @@ def create_line_switch_collection(net, size=1, distance_to_bus=3, use_line_geoda # switch bus and target coordinates pos_sb = net.bus_geodata.loc[sb, ["x", "y"]].values - pos_ta = np.zeros(2) + pos_tb = np.zeros(2) use_bus_geodata = False @@ -689,19 +689,19 @@ def create_line_switch_collection(net, size=1, distance_to_bus=3, use_line_geoda if len(line_coords) > 2: if abs(line_coords[0][0] - pos_sb[0]) < 0.01 and \ abs(line_coords[0][1] - pos_sb[1]) < 0.01: - pos_ta = np.array([line_coords[1][0], line_coords[1][1]]) + pos_tb = np.array([line_coords[1][0], line_coords[1][1]]) else: - pos_ta = np.array([line_coords[-2][0], line_coords[-2][1]]) + pos_tb = np.array([line_coords[-2][0], line_coords[-2][1]]) else: use_bus_geodata = True else: use_bus_geodata = True if not use_line_geodata or use_bus_geodata: - pos_ta = net.bus_geodata.loc[target_bus, ["x", "y"]] + pos_tb = net.bus_geodata.loc[target_bus, ["x", "y"]] # position of switch symbol - vec = pos_ta - pos_sb + vec = pos_tb - pos_sb mag = np.linalg.norm(vec) pos_sw = pos_sb + vec / mag * distance_to_bus @@ -713,8 +713,7 @@ def create_line_switch_collection(net, size=1, distance_to_bus=3, use_line_geoda col = color if net.switch.closed.loc[switch] else "white" # create switch patch (switch size is respected to center the switch on the line) - patch = Rectangle((pos_sw[0] - size / 2, pos_sw[1] - size / 2), size, size, facecolor=col, - edgecolor=color) + patch = Rectangle((pos_sw[0] - size / 2, pos_sw[1] - size / 2), size, size, facecolor=col, edgecolor=color) # apply rotation patch.set_transform(rotation) @@ -724,6 +723,64 @@ def create_line_switch_collection(net, size=1, distance_to_bus=3, use_line_geoda return switches +def create_bus_bus_switch_collection(net, size=1., helper_line_style=':', helper_line_size=1., helper_line_color="gray", **kwargs): + """ + Creates a matplotlib patch collection of pandapower bus-bus switches. Switches are plotted in the center between two buses with a "helper" + line (dashed and thin) being drawn between the buses as well. + + INPUT: + **net** (pandapowerNet) - The pandapower network + + OPTIONAL: + + **size** (float, 1.0) - Size of the switch patches + + **helper_line_style** (string, ':') - Line style of the "helper" line being plotted between two buses connected by a bus-bus switch + + **helper_line_size** (float, 1.0) - Line width of the "helper" line being plotted between two buses connected by a bus-bus switch + + **helper_line_color** (string, "gray") - Line color of the "helper" line being plotted between two buses connected by a bus-bus switch + + **kwargs - Key word arguments are passed to the patch function + + OUTPUT: + **switches**, **helper_lines** - tuple of patch collections + """ + lbs_switches = net.switch.index[net.switch.et == "b"] + color = kwargs.pop("color", "k") + switch_patches = [] + line_patches = [] + for switch in lbs_switches: + switch_bus = net.switch.bus.loc[switch] + target_bus = net.switch.element.loc[switch] + if switch_bus not in net.bus_geodata.index or target_bus not in net.bus_geodata.index: + logger.warning("Bus coordinates for switch %s not found, skipped switch!" % switch) + continue + # switch bus and target coordinates + pos_sb = net.bus_geodata.loc[switch_bus, ["x", "y"]].values + pos_tb = net.bus_geodata.loc[target_bus, ["x", "y"]].values + # position of switch symbol + vec = pos_tb - pos_sb + mag = np.linalg.norm(vec) + pos_sw = pos_sb + vec / mag * 0.5 if not np.array_equal(pos_sb, pos_tb) else pos_tb + # rotation of switch symbol + angle = np.arctan2(vec[1], vec[0]) + rotation = Affine2D().rotate_around(pos_sw[0], pos_sw[1], angle) + # color switch by state + col = color if net.switch.closed.loc[switch] else "white" + # create switch patch (switch size is respected to center the switch on the line) + patch = Rectangle((pos_sw[0] - size / 2, pos_sw[1] - size / 2), size, size, facecolor=col, edgecolor=color) + # apply rotation + patch.set_transform(rotation) + # add to collection lists + switch_patches.append(patch) + line_patches.append([pos_sb.tolist(), pos_tb.tolist()]) + # create collections and return + switches = PatchCollection(switch_patches, match_original=True, **kwargs) + helper_lines = LineCollection(line_patches, linestyles=helper_line_style, linewidths=helper_line_size, colors=helper_line_color) + return switches, helper_lines + + def add_collections_to_axes(ax, collections, plot_colorbars=True): for c in collections: if c: From d31d51bb7311a4a1f02e702d953451b3825fad28 Mon Sep 17 00:00:00 2001 From: Jan-Hendrik Menke Date: Tue, 24 Apr 2018 10:29:24 +0200 Subject: [PATCH 23/40] allclose instead of array_equal in create_bus_bus_switch_collection --- pandapower/plotting/collections.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandapower/plotting/collections.py b/pandapower/plotting/collections.py index 7a69d142e..819cd6fe9 100644 --- a/pandapower/plotting/collections.py +++ b/pandapower/plotting/collections.py @@ -762,7 +762,7 @@ def create_bus_bus_switch_collection(net, size=1., helper_line_style=':', helper # position of switch symbol vec = pos_tb - pos_sb mag = np.linalg.norm(vec) - pos_sw = pos_sb + vec / mag * 0.5 if not np.array_equal(pos_sb, pos_tb) else pos_tb + pos_sw = pos_sb + vec / mag * 0.5 if not np.allclose(pos_sb, pos_tb) else pos_tb # rotation of switch symbol angle = np.arctan2(vec[1], vec[0]) rotation = Affine2D().rotate_around(pos_sw[0], pos_sw[1], angle) From 1674cb799a2d6570188d177c1a8baa8dc0a1fdc9 Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Tue, 24 Apr 2018 12:09:12 +0200 Subject: [PATCH 24/40] pytest gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e4fea45f2..13ee14785 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ *.pyc *~ build/ +.pytest_cache/ dist/ .cache/ .idea From 77b7ec3104c979cc0536bdd4b83ba71ab2a45bf6 Mon Sep 17 00:00:00 2001 From: WinfriedL <37797648+WinfriedL@users.noreply.github.com> Date: Tue, 24 Apr 2018 14:41:27 +0200 Subject: [PATCH 25/40] Added losses at star point implementation --- pandapower/build_bus.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/pandapower/build_bus.py b/pandapower/build_bus.py index e00564b04..d081759cf 100644 --- a/pandapower/build_bus.py +++ b/pandapower/build_bus.py @@ -397,8 +397,27 @@ def _calc_shunts_and_add_on_ppc(net, ppc): b = np.hstack([b, xw["bus"].values]) loss_location = net._options["trafo3w_losses"] - if loss_location == "star": - raise NotImplementedError("Losses at star point not yet implemented") + trafo3w = net["trafo3w"] + if loss_location == "star" and len(trafo3w) > 0: + + pfe_kw = trafo3w["pfe_kw"].values + i0 = trafo3w["i0_percent"].values + sn_kv = trafo3w["sn_hv_kva"].values + + q_kvar= (sn_kv * i0 / 100.) ** 2 - pfe_kw **2 + q_kvar[q_kvar<0] = 0 + q_kvar= np.sqrt(q_kvar) + + vn_hv_trafo=trafo3w["vn_hv_kv"].values + + hv_buses = net.bus.loc[net.trafo3w.hv_bus.values] + vn_hv_bus=hv_buses.vn_kv.values + + v_ratio = ( vn_hv_bus / vn_hv_trafo) ** 2 + + q = np.hstack([q, q_kvar / np.float64(1000.) * v_ratio]) + p = np.hstack([p, pfe_kw / np.float64(1000.) * v_ratio]) + b = np.hstack([b, trafo3w["ad_bus"].values]) # if array is not empty if b.size: From d533062b4587de76d28d2265aa69d36f08ce3f2f Mon Sep 17 00:00:00 2001 From: WinfriedL <37797648+WinfriedL@users.noreply.github.com> Date: Tue, 24 Apr 2018 14:42:34 +0200 Subject: [PATCH 26/40] Added test results for losses at star point --- pandapower/test/loadflow/test_results.py | 41 ++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/pandapower/test/loadflow/test_results.py b/pandapower/test/loadflow/test_results.py index 4f29fd88e..29b04c919 100644 --- a/pandapower/test/loadflow/test_results.py +++ b/pandapower/test/loadflow/test_results.py @@ -374,6 +374,7 @@ def test_trafo3w(result_test_network, v_tol=1e-6, i_tol=1e-6, s_tol=2e-2, l_tol= phv = 300.43 pmv = -200.00 plv = -100.00 + assert abs((net.res_bus.vm_pu.at[b2] - uhv)) < v_tol assert abs((net.res_bus.vm_pu.at[b3] - umv)) < v_tol @@ -392,6 +393,46 @@ def test_trafo3w(result_test_network, v_tol=1e-6, i_tol=1e-6, s_tol=2e-2, l_tol= assert abs((net.res_trafo3w.i_hv_ka.at[t3] - ihv)) < i_tol assert abs((net.res_trafo3w.i_mv_ka.at[t3] - imv)) < i_tol assert abs((net.res_trafo3w.i_lv_ka.at[t3] - ilv)) < i_tol + + runpp_with_consistency_checks(net, trafo_model="pi",trafo3w_losses='star') + + #Test results Integral: + uhv = 1.01011711678 + umv = 0.95550024145 + ulv = 0.94062989256 + + load = 37.209 + qhv = 1.660 + qmv = 0 + qlv = 0 + + ihv = 0.00858591110 + imv = 0.20141290445 + ilv = 0.15344776975 + + phv = 300.43 + pmv = -200.00 + plv = -100.00 + + assert abs((net.res_bus.vm_pu.at[b2] - uhv)) < v_tol + assert abs((net.res_bus.vm_pu.at[b3] - umv)) < v_tol + assert abs((net.res_bus.vm_pu.at[b4] - ulv)) < v_tol + + assert abs((net.res_trafo3w.loading_percent.at[t3] - load)) < l_tol + + assert abs((net.res_trafo3w.p_hv_kw.at[t3] - phv)) < s_tol + assert abs((net.res_trafo3w.p_mv_kw.at[t3] - pmv)) < s_tol + assert abs((net.res_trafo3w.p_lv_kw.at[t3] - plv)) < s_tol + + assert abs((net.res_trafo3w.q_hv_kvar.at[t3] - qhv)) < s_tol + assert abs((net.res_trafo3w.q_mv_kvar.at[t3] - qmv)) < s_tol + assert abs((net.res_trafo3w.q_lv_kvar.at[t3] - qlv)) < s_tol + + assert abs((net.res_trafo3w.i_hv_ka.at[t3] - ihv)) < i_tol + assert abs((net.res_trafo3w.i_mv_ka.at[t3] - imv)) < i_tol + assert abs((net.res_trafo3w.i_lv_ka.at[t3] - ilv)) < i_tol + + def test_impedance(result_test_network, v_tol=1e-6, i_tol=1e-6, s_tol=5e-3, l_tol=1e-3): From 15068dddfac9f7a2cfd352eac77d125d04232560 Mon Sep 17 00:00:00 2001 From: WinfriedL <37797648+WinfriedL@users.noreply.github.com> Date: Tue, 24 Apr 2018 14:44:56 +0200 Subject: [PATCH 27/40] Added test results for losses at star point --- pandapower/test/loadflow/test_results.py | 41 ++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/pandapower/test/loadflow/test_results.py b/pandapower/test/loadflow/test_results.py index 4f29fd88e..29b04c919 100644 --- a/pandapower/test/loadflow/test_results.py +++ b/pandapower/test/loadflow/test_results.py @@ -374,6 +374,7 @@ def test_trafo3w(result_test_network, v_tol=1e-6, i_tol=1e-6, s_tol=2e-2, l_tol= phv = 300.43 pmv = -200.00 plv = -100.00 + assert abs((net.res_bus.vm_pu.at[b2] - uhv)) < v_tol assert abs((net.res_bus.vm_pu.at[b3] - umv)) < v_tol @@ -392,6 +393,46 @@ def test_trafo3w(result_test_network, v_tol=1e-6, i_tol=1e-6, s_tol=2e-2, l_tol= assert abs((net.res_trafo3w.i_hv_ka.at[t3] - ihv)) < i_tol assert abs((net.res_trafo3w.i_mv_ka.at[t3] - imv)) < i_tol assert abs((net.res_trafo3w.i_lv_ka.at[t3] - ilv)) < i_tol + + runpp_with_consistency_checks(net, trafo_model="pi",trafo3w_losses='star') + + #Test results Integral: + uhv = 1.01011711678 + umv = 0.95550024145 + ulv = 0.94062989256 + + load = 37.209 + qhv = 1.660 + qmv = 0 + qlv = 0 + + ihv = 0.00858591110 + imv = 0.20141290445 + ilv = 0.15344776975 + + phv = 300.43 + pmv = -200.00 + plv = -100.00 + + assert abs((net.res_bus.vm_pu.at[b2] - uhv)) < v_tol + assert abs((net.res_bus.vm_pu.at[b3] - umv)) < v_tol + assert abs((net.res_bus.vm_pu.at[b4] - ulv)) < v_tol + + assert abs((net.res_trafo3w.loading_percent.at[t3] - load)) < l_tol + + assert abs((net.res_trafo3w.p_hv_kw.at[t3] - phv)) < s_tol + assert abs((net.res_trafo3w.p_mv_kw.at[t3] - pmv)) < s_tol + assert abs((net.res_trafo3w.p_lv_kw.at[t3] - plv)) < s_tol + + assert abs((net.res_trafo3w.q_hv_kvar.at[t3] - qhv)) < s_tol + assert abs((net.res_trafo3w.q_mv_kvar.at[t3] - qmv)) < s_tol + assert abs((net.res_trafo3w.q_lv_kvar.at[t3] - qlv)) < s_tol + + assert abs((net.res_trafo3w.i_hv_ka.at[t3] - ihv)) < i_tol + assert abs((net.res_trafo3w.i_mv_ka.at[t3] - imv)) < i_tol + assert abs((net.res_trafo3w.i_lv_ka.at[t3] - ilv)) < i_tol + + def test_impedance(result_test_network, v_tol=1e-6, i_tol=1e-6, s_tol=5e-3, l_tol=1e-3): From 93286c611f928e97169e74a32e4e9722d7485ed5 Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Wed, 25 Apr 2018 09:55:29 +0200 Subject: [PATCH 28/40] trafo3w_losses parameter --- pandapower/build_branch.py | 53 +++++++++++++++++--------------------- pandapower/build_bus.py | 11 +++----- 2 files changed, 27 insertions(+), 37 deletions(-) diff --git a/pandapower/build_branch.py b/pandapower/build_branch.py index 5d1a872f4..477a8f272 100644 --- a/pandapower/build_branch.py +++ b/pandapower/build_branch.py @@ -481,36 +481,29 @@ def _trafo_df_from_trafo3w(net): "tp_st_degree": taps[0]["tp_st_degree"], "tp_phase_shifter": False, "parallel": 1, "df": 1, "in_service": ttab.in_service, "shift_degree": 0, "max_loading_percent": max_load} - trafos2w[i + nr_trafos] = {"hv_bus": ttab.ad_bus, "lv_bus": ttab.mv_bus, - "sn_kva": ttab.sn_mv_kva, "vn_hv_kv": ttab.vn_hv_kv, - "vn_lv_kv": ttab.vn_mv_kv, "vscr_percent": vscr_2w[1], - "vsc_percent": vsc_2w[1], - "pfe_kw": ttab.pfe_kw if loss_location == "mv" else 0, - "i0_percent": ttab.i0_percent if loss_location == "mv" else 0, - "tp_side": taps[1]["tp_side"], - "tp_mid": taps[1]["tp_mid"], "tp_max": taps[1]["tp_max"], - "tp_min": taps[1]["tp_min"], "tp_pos": taps[1]["tp_pos"], - "tp_st_percent": taps[1]["tp_st_percent"], - "tp_st_degree": taps[1]["tp_st_degree"], - "tp_phase_shifter": False, "parallel": 1, "df": 1, - "in_service": ttab.in_service, - "shift_degree": ttab.shift_mv_degree, - "max_loading_percent": max_load} - trafos2w[i + 2 * nr_trafos] = {"hv_bus": ttab.ad_bus, "lv_bus": ttab.lv_bus, - "sn_kva": ttab.sn_lv_kva, - "vn_hv_kv": ttab.vn_hv_kv, "vn_lv_kv": ttab.vn_lv_kv, - "vscr_percent": vscr_2w[2], "vsc_percent": vsc_2w[2], - "pfe_kw": ttab.pfe_kw if loss_location == "lv" else 0, - "i0_percent": ttab.i0_percent if loss_location == "lv" else 0, - "tp_side": taps[2]["tp_side"], - "tp_mid": taps[2]["tp_mid"], "tp_max": taps[2]["tp_max"], - "tp_min": taps[2]["tp_min"], "tp_pos": taps[2]["tp_pos"], - "tp_st_percent": taps[2]["tp_st_percent"], - "tp_st_degree": taps[2]["tp_st_degree"], - "tp_phase_shifter": False, - "parallel": 1, "df": 1, "in_service": ttab.in_service, - "shift_degree": ttab.shift_lv_degree, - "max_loading_percent": max_load} + trafos2w[i + nr_trafos] = { + "hv_bus": ttab.ad_bus, "lv_bus": ttab.mv_bus, "sn_kva": ttab.sn_mv_kva, + "vn_hv_kv": ttab.vn_hv_kv, "vn_lv_kv": ttab.vn_mv_kv, "vscr_percent": vscr_2w[1], + "vsc_percent": vsc_2w[1], "pfe_kw": ttab.pfe_kw if loss_location == "mv" else 0, + "i0_percent": ttab.i0_percent * ttab.sn_hv_kva / ttab.sn_mv_kva + if loss_location == "mv" else 0, + "tp_side": taps[1]["tp_side"], "tp_mid": taps[1]["tp_mid"], + "tp_max": taps[1]["tp_max"], "tp_min": taps[1]["tp_min"], + "tp_pos": taps[1]["tp_pos"], "tp_st_percent": taps[1]["tp_st_percent"], + "tp_st_degree": taps[1]["tp_st_degree"], "tp_phase_shifter": False, "parallel": 1, + "df": 1, "in_service": ttab.in_service, "shift_degree": ttab.shift_mv_degree, + "max_loading_percent": max_load} + trafos2w[i + 2 * nr_trafos] = { + "hv_bus": ttab.ad_bus, "lv_bus": ttab.lv_bus, "sn_kva": ttab.sn_lv_kva, + "vn_hv_kv": ttab.vn_hv_kv, "vn_lv_kv": ttab.vn_lv_kv, "vscr_percent": vscr_2w[2], + "vsc_percent": vsc_2w[2], "pfe_kw": ttab.pfe_kw if loss_location == "lv" else 0, + "i0_percent": ttab.i0_percent * ttab.sn_hv_kva / ttab.sn_lv_kva + if loss_location == "lv" else 0, "tp_side": taps[2]["tp_side"], + "tp_mid": taps[2]["tp_mid"], "tp_max": taps[2]["tp_max"], + "tp_min": taps[2]["tp_min"], "tp_pos": taps[2]["tp_pos"], + "tp_st_percent": taps[2]["tp_st_percent"],"tp_st_degree": taps[2]["tp_st_degree"], + "tp_phase_shifter": False, "parallel": 1, "df": 1, "in_service": ttab.in_service, + "shift_degree": ttab.shift_lv_degree, "max_loading_percent": max_load} i += 1 trafo_df = pd.DataFrame(trafos2w).T for var in list(tap_variables) + ["i0_percent", "sn_kva", "vsc_percent", "vscr_percent", diff --git a/pandapower/build_bus.py b/pandapower/build_bus.py index d081759cf..fe50c7422 100644 --- a/pandapower/build_bus.py +++ b/pandapower/build_bus.py @@ -396,7 +396,7 @@ def _calc_shunts_and_add_on_ppc(net, ppc): p = np.hstack([p, xw["pz_kw"].values * vl]) b = np.hstack([b, xw["bus"].values]) - loss_location = net._options["trafo3w_losses"] + loss_location = net._options["trafo3w_losses"].lower() trafo3w = net["trafo3w"] if loss_location == "star" and len(trafo3w) > 0: @@ -408,12 +408,9 @@ def _calc_shunts_and_add_on_ppc(net, ppc): q_kvar[q_kvar<0] = 0 q_kvar= np.sqrt(q_kvar) - vn_hv_trafo=trafo3w["vn_hv_kv"].values - - hv_buses = net.bus.loc[net.trafo3w.hv_bus.values] - vn_hv_bus=hv_buses.vn_kv.values - - v_ratio = ( vn_hv_bus / vn_hv_trafo) ** 2 + vn_hv_trafo = trafo3w["vn_hv_kv"].values + vn_hv_bus = ppc["bus"][bus_lookup[trafo3w.hv_bus.values], BASE_KV] + v_ratio = (vn_hv_bus / vn_hv_trafo) ** 2 q = np.hstack([q, q_kvar / np.float64(1000.) * v_ratio]) p = np.hstack([p, pfe_kw / np.float64(1000.) * v_ratio]) From d4e0f0bdd3a927e8d48260ff468f6b880b880081 Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Wed, 25 Apr 2018 10:39:13 +0200 Subject: [PATCH 29/40] pandpower 1.5.0 --- CHANGELOG.rst | 2 +- README.rst | 4 ++-- doc/conf.py | 4 ++-- pandapower/__init__.py | 2 +- pandapower/run.py | 15 ++++++++------- setup.py | 2 +- 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index cd5ded7df..c50ed2643 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,7 +1,7 @@ Change Log ============= -[develop] +[1.5.0] - 2018-04-25 ---------------------- - [FIXED] plotly hover function for edges (only if use_line_geodata == False) - [FIXED] from_ppc trafo parameter calculation now also considers baseMVA != 100 diff --git a/README.rst b/README.rst index c13a07e97..c5359ec83 100644 --- a/README.rst +++ b/README.rst @@ -2,8 +2,8 @@ pandapower ============= -.. image:: https://readthedocs.org/projects/pandapower/badge/?version=v1.4.3 - :target: http://pandapower.readthedocs.io/en/v1.4.3 +.. image:: https://readthedocs.org/projects/pandapower/badge/ + :target: http://pandapower.readthedocs.io/ :alt: Documentation Status .. image:: https://img.shields.io/pypi/v/pandapower.svg diff --git a/doc/conf.py b/doc/conf.py index 3c82198e6..999c9b5df 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -62,9 +62,9 @@ # built documents. # # The short X.Y version. -version = "1.4" +version = "1.5" # The full version, including alpha/beta/rc tags. -release = "1.4.3" +release = "1.5.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/pandapower/__init__.py b/pandapower/__init__.py index 0509c24ba..280ee8caa 100644 --- a/pandapower/__init__.py +++ b/pandapower/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.4.3" +__version__ = "1.5.0" from pandapower.auxiliary import * from pandapower.create import * diff --git a/pandapower/run.py b/pandapower/run.py index bd620a543..f8f9b0e89 100644 --- a/pandapower/run.py +++ b/pandapower/run.py @@ -253,7 +253,7 @@ def runpp(net, algorithm='nr', calculate_voltage_angles="auto", init="auto", max def rundcpp(net, trafo_model="t", trafo_loading="current", recycle=None, check_connectivity=True, - r_switch=0.0, **kwargs): + r_switch=0.0, trafo3w_losses="hv", **kwargs): """ Runs PANDAPOWER DC Flow @@ -311,7 +311,7 @@ def rundcpp(net, trafo_model="t", trafo_loading="current", recycle=None, check_c trafo_model=trafo_model, check_connectivity=check_connectivity, mode=mode, copy_constraints_to_ppc=copy_constraints_to_ppc, r_switch=r_switch, init=init, enforce_q_lims=enforce_q_lims, recycle=recycle, - voltage_depend_loads=False, delta=0) + voltage_depend_loads=False, delta=0, trafo3w_losses=trafo3w_losses) _add_pf_options(net, tolerance_kva=tolerance_kva, trafo_loading=trafo_loading, numba=numba, ac=ac, algorithm=algorithm, max_iteration=max_iteration) _check_bus_index_and_print_warning_if_high(net) @@ -320,7 +320,8 @@ def rundcpp(net, trafo_model="t", trafo_loading="current", recycle=None, check_c def runopp(net, verbose=False, calculate_voltage_angles=False, check_connectivity=False, - suppress_warnings=True, r_switch=0.0, delta=1e-10, init="flat", numba=True, **kwargs): + suppress_warnings=True, r_switch=0.0, delta=1e-10, init="flat", numba=True, + trafo3w_losses="hv", **kwargs): """ Runs the pandapower Optimal Power Flow. Flexibilities, constraints and cost parameters are defined in the pandapower element tables. @@ -388,15 +389,15 @@ def runopp(net, verbose=False, calculate_voltage_angles=False, check_connectivit trafo_model=trafo_model, check_connectivity=check_connectivity, mode=mode, copy_constraints_to_ppc=copy_constraints_to_ppc, r_switch=r_switch, init=init, enforce_q_lims=enforce_q_lims, recycle=recycle, - voltage_depend_loads=False, delta=delta) + voltage_depend_loads=False, delta=delta, trafo3w_losses=trafo3w_losses) _add_opf_options(net, trafo_loading=trafo_loading, ac=ac, numba=numba) _check_bus_index_and_print_warning_if_high(net) _check_gen_index_and_print_warning_if_high(net) _optimal_powerflow(net, verbose, suppress_warnings, **kwargs) -def rundcopp(net, verbose=False, check_connectivity=True, suppress_warnings=True, r_switch=0.0, delta=1e-10, - **kwargs): +def rundcopp(net, verbose=False, check_connectivity=True, suppress_warnings=True, r_switch=0.0, + delta=1e-10, trafo3w_losses="hv", **kwargs): """ Runs the pandapower Optimal Power Flow. Flexibilities, constraints and cost parameters are defined in the pandapower element tables. @@ -450,7 +451,7 @@ def rundcopp(net, verbose=False, check_connectivity=True, suppress_warnings=True trafo_model=trafo_model, check_connectivity=check_connectivity, mode=mode, copy_constraints_to_ppc=copy_constraints_to_ppc, r_switch=r_switch, init=init, enforce_q_lims=enforce_q_lims, recycle=recycle, - voltage_depend_loads=False, delta=delta) + voltage_depend_loads=False, delta=delta, trafo3w_losses=trafo3w_losses) _add_opf_options(net, trafo_loading=trafo_loading, ac=ac) _check_bus_index_and_print_warning_if_high(net) _check_gen_index_and_print_warning_if_high(net) diff --git a/setup.py b/setup.py index e67758ad6..94888a0ea 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ setup( name='pandapower', - version='1.4.3', + version='1.5.0', author='Leon Thurner, Alexander Scheidler', author_email='leon.thurner@uni-kassel.de, alexander.scheidler@iee.fraunhofer.de', description='Convenient Power System Modelling and Analysis based on PYPOWER and pandas', From 333a99b9fe7ed13e684be27894a445915ca272e9 Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Tue, 24 Apr 2018 12:09:12 +0200 Subject: [PATCH 30/40] pytest gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e4fea45f2..13ee14785 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ *.pyc *~ build/ +.pytest_cache/ dist/ .cache/ .idea From 03a16c3a87d0a75d2e27438edf520976e8cb5282 Mon Sep 17 00:00:00 2001 From: WinfriedL <37797648+WinfriedL@users.noreply.github.com> Date: Tue, 24 Apr 2018 14:41:27 +0200 Subject: [PATCH 31/40] Added losses at star point implementation --- pandapower/build_bus.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/pandapower/build_bus.py b/pandapower/build_bus.py index e00564b04..d081759cf 100644 --- a/pandapower/build_bus.py +++ b/pandapower/build_bus.py @@ -397,8 +397,27 @@ def _calc_shunts_and_add_on_ppc(net, ppc): b = np.hstack([b, xw["bus"].values]) loss_location = net._options["trafo3w_losses"] - if loss_location == "star": - raise NotImplementedError("Losses at star point not yet implemented") + trafo3w = net["trafo3w"] + if loss_location == "star" and len(trafo3w) > 0: + + pfe_kw = trafo3w["pfe_kw"].values + i0 = trafo3w["i0_percent"].values + sn_kv = trafo3w["sn_hv_kva"].values + + q_kvar= (sn_kv * i0 / 100.) ** 2 - pfe_kw **2 + q_kvar[q_kvar<0] = 0 + q_kvar= np.sqrt(q_kvar) + + vn_hv_trafo=trafo3w["vn_hv_kv"].values + + hv_buses = net.bus.loc[net.trafo3w.hv_bus.values] + vn_hv_bus=hv_buses.vn_kv.values + + v_ratio = ( vn_hv_bus / vn_hv_trafo) ** 2 + + q = np.hstack([q, q_kvar / np.float64(1000.) * v_ratio]) + p = np.hstack([p, pfe_kw / np.float64(1000.) * v_ratio]) + b = np.hstack([b, trafo3w["ad_bus"].values]) # if array is not empty if b.size: From e8a3ec7fb7204c94d6661cf088757575daa893ec Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Wed, 25 Apr 2018 09:55:29 +0200 Subject: [PATCH 32/40] trafo3w_losses parameter --- pandapower/build_branch.py | 53 +++++++++++++++++--------------------- pandapower/build_bus.py | 11 +++----- 2 files changed, 27 insertions(+), 37 deletions(-) diff --git a/pandapower/build_branch.py b/pandapower/build_branch.py index 5d1a872f4..477a8f272 100644 --- a/pandapower/build_branch.py +++ b/pandapower/build_branch.py @@ -481,36 +481,29 @@ def _trafo_df_from_trafo3w(net): "tp_st_degree": taps[0]["tp_st_degree"], "tp_phase_shifter": False, "parallel": 1, "df": 1, "in_service": ttab.in_service, "shift_degree": 0, "max_loading_percent": max_load} - trafos2w[i + nr_trafos] = {"hv_bus": ttab.ad_bus, "lv_bus": ttab.mv_bus, - "sn_kva": ttab.sn_mv_kva, "vn_hv_kv": ttab.vn_hv_kv, - "vn_lv_kv": ttab.vn_mv_kv, "vscr_percent": vscr_2w[1], - "vsc_percent": vsc_2w[1], - "pfe_kw": ttab.pfe_kw if loss_location == "mv" else 0, - "i0_percent": ttab.i0_percent if loss_location == "mv" else 0, - "tp_side": taps[1]["tp_side"], - "tp_mid": taps[1]["tp_mid"], "tp_max": taps[1]["tp_max"], - "tp_min": taps[1]["tp_min"], "tp_pos": taps[1]["tp_pos"], - "tp_st_percent": taps[1]["tp_st_percent"], - "tp_st_degree": taps[1]["tp_st_degree"], - "tp_phase_shifter": False, "parallel": 1, "df": 1, - "in_service": ttab.in_service, - "shift_degree": ttab.shift_mv_degree, - "max_loading_percent": max_load} - trafos2w[i + 2 * nr_trafos] = {"hv_bus": ttab.ad_bus, "lv_bus": ttab.lv_bus, - "sn_kva": ttab.sn_lv_kva, - "vn_hv_kv": ttab.vn_hv_kv, "vn_lv_kv": ttab.vn_lv_kv, - "vscr_percent": vscr_2w[2], "vsc_percent": vsc_2w[2], - "pfe_kw": ttab.pfe_kw if loss_location == "lv" else 0, - "i0_percent": ttab.i0_percent if loss_location == "lv" else 0, - "tp_side": taps[2]["tp_side"], - "tp_mid": taps[2]["tp_mid"], "tp_max": taps[2]["tp_max"], - "tp_min": taps[2]["tp_min"], "tp_pos": taps[2]["tp_pos"], - "tp_st_percent": taps[2]["tp_st_percent"], - "tp_st_degree": taps[2]["tp_st_degree"], - "tp_phase_shifter": False, - "parallel": 1, "df": 1, "in_service": ttab.in_service, - "shift_degree": ttab.shift_lv_degree, - "max_loading_percent": max_load} + trafos2w[i + nr_trafos] = { + "hv_bus": ttab.ad_bus, "lv_bus": ttab.mv_bus, "sn_kva": ttab.sn_mv_kva, + "vn_hv_kv": ttab.vn_hv_kv, "vn_lv_kv": ttab.vn_mv_kv, "vscr_percent": vscr_2w[1], + "vsc_percent": vsc_2w[1], "pfe_kw": ttab.pfe_kw if loss_location == "mv" else 0, + "i0_percent": ttab.i0_percent * ttab.sn_hv_kva / ttab.sn_mv_kva + if loss_location == "mv" else 0, + "tp_side": taps[1]["tp_side"], "tp_mid": taps[1]["tp_mid"], + "tp_max": taps[1]["tp_max"], "tp_min": taps[1]["tp_min"], + "tp_pos": taps[1]["tp_pos"], "tp_st_percent": taps[1]["tp_st_percent"], + "tp_st_degree": taps[1]["tp_st_degree"], "tp_phase_shifter": False, "parallel": 1, + "df": 1, "in_service": ttab.in_service, "shift_degree": ttab.shift_mv_degree, + "max_loading_percent": max_load} + trafos2w[i + 2 * nr_trafos] = { + "hv_bus": ttab.ad_bus, "lv_bus": ttab.lv_bus, "sn_kva": ttab.sn_lv_kva, + "vn_hv_kv": ttab.vn_hv_kv, "vn_lv_kv": ttab.vn_lv_kv, "vscr_percent": vscr_2w[2], + "vsc_percent": vsc_2w[2], "pfe_kw": ttab.pfe_kw if loss_location == "lv" else 0, + "i0_percent": ttab.i0_percent * ttab.sn_hv_kva / ttab.sn_lv_kva + if loss_location == "lv" else 0, "tp_side": taps[2]["tp_side"], + "tp_mid": taps[2]["tp_mid"], "tp_max": taps[2]["tp_max"], + "tp_min": taps[2]["tp_min"], "tp_pos": taps[2]["tp_pos"], + "tp_st_percent": taps[2]["tp_st_percent"],"tp_st_degree": taps[2]["tp_st_degree"], + "tp_phase_shifter": False, "parallel": 1, "df": 1, "in_service": ttab.in_service, + "shift_degree": ttab.shift_lv_degree, "max_loading_percent": max_load} i += 1 trafo_df = pd.DataFrame(trafos2w).T for var in list(tap_variables) + ["i0_percent", "sn_kva", "vsc_percent", "vscr_percent", diff --git a/pandapower/build_bus.py b/pandapower/build_bus.py index d081759cf..fe50c7422 100644 --- a/pandapower/build_bus.py +++ b/pandapower/build_bus.py @@ -396,7 +396,7 @@ def _calc_shunts_and_add_on_ppc(net, ppc): p = np.hstack([p, xw["pz_kw"].values * vl]) b = np.hstack([b, xw["bus"].values]) - loss_location = net._options["trafo3w_losses"] + loss_location = net._options["trafo3w_losses"].lower() trafo3w = net["trafo3w"] if loss_location == "star" and len(trafo3w) > 0: @@ -408,12 +408,9 @@ def _calc_shunts_and_add_on_ppc(net, ppc): q_kvar[q_kvar<0] = 0 q_kvar= np.sqrt(q_kvar) - vn_hv_trafo=trafo3w["vn_hv_kv"].values - - hv_buses = net.bus.loc[net.trafo3w.hv_bus.values] - vn_hv_bus=hv_buses.vn_kv.values - - v_ratio = ( vn_hv_bus / vn_hv_trafo) ** 2 + vn_hv_trafo = trafo3w["vn_hv_kv"].values + vn_hv_bus = ppc["bus"][bus_lookup[trafo3w.hv_bus.values], BASE_KV] + v_ratio = (vn_hv_bus / vn_hv_trafo) ** 2 q = np.hstack([q, q_kvar / np.float64(1000.) * v_ratio]) p = np.hstack([p, pfe_kw / np.float64(1000.) * v_ratio]) From 69b12a3464289fbe66448b3d6c3beadf55dee097 Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Wed, 25 Apr 2018 10:39:13 +0200 Subject: [PATCH 33/40] pandpower 1.5.0 --- CHANGELOG.rst | 2 +- README.rst | 4 ++-- doc/conf.py | 4 ++-- pandapower/__init__.py | 2 +- pandapower/run.py | 15 ++++++++------- setup.py | 2 +- 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index cd5ded7df..c50ed2643 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,7 +1,7 @@ Change Log ============= -[develop] +[1.5.0] - 2018-04-25 ---------------------- - [FIXED] plotly hover function for edges (only if use_line_geodata == False) - [FIXED] from_ppc trafo parameter calculation now also considers baseMVA != 100 diff --git a/README.rst b/README.rst index c13a07e97..c5359ec83 100644 --- a/README.rst +++ b/README.rst @@ -2,8 +2,8 @@ pandapower ============= -.. image:: https://readthedocs.org/projects/pandapower/badge/?version=v1.4.3 - :target: http://pandapower.readthedocs.io/en/v1.4.3 +.. image:: https://readthedocs.org/projects/pandapower/badge/ + :target: http://pandapower.readthedocs.io/ :alt: Documentation Status .. image:: https://img.shields.io/pypi/v/pandapower.svg diff --git a/doc/conf.py b/doc/conf.py index 3c82198e6..999c9b5df 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -62,9 +62,9 @@ # built documents. # # The short X.Y version. -version = "1.4" +version = "1.5" # The full version, including alpha/beta/rc tags. -release = "1.4.3" +release = "1.5.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/pandapower/__init__.py b/pandapower/__init__.py index 0509c24ba..280ee8caa 100644 --- a/pandapower/__init__.py +++ b/pandapower/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.4.3" +__version__ = "1.5.0" from pandapower.auxiliary import * from pandapower.create import * diff --git a/pandapower/run.py b/pandapower/run.py index bd620a543..f8f9b0e89 100644 --- a/pandapower/run.py +++ b/pandapower/run.py @@ -253,7 +253,7 @@ def runpp(net, algorithm='nr', calculate_voltage_angles="auto", init="auto", max def rundcpp(net, trafo_model="t", trafo_loading="current", recycle=None, check_connectivity=True, - r_switch=0.0, **kwargs): + r_switch=0.0, trafo3w_losses="hv", **kwargs): """ Runs PANDAPOWER DC Flow @@ -311,7 +311,7 @@ def rundcpp(net, trafo_model="t", trafo_loading="current", recycle=None, check_c trafo_model=trafo_model, check_connectivity=check_connectivity, mode=mode, copy_constraints_to_ppc=copy_constraints_to_ppc, r_switch=r_switch, init=init, enforce_q_lims=enforce_q_lims, recycle=recycle, - voltage_depend_loads=False, delta=0) + voltage_depend_loads=False, delta=0, trafo3w_losses=trafo3w_losses) _add_pf_options(net, tolerance_kva=tolerance_kva, trafo_loading=trafo_loading, numba=numba, ac=ac, algorithm=algorithm, max_iteration=max_iteration) _check_bus_index_and_print_warning_if_high(net) @@ -320,7 +320,8 @@ def rundcpp(net, trafo_model="t", trafo_loading="current", recycle=None, check_c def runopp(net, verbose=False, calculate_voltage_angles=False, check_connectivity=False, - suppress_warnings=True, r_switch=0.0, delta=1e-10, init="flat", numba=True, **kwargs): + suppress_warnings=True, r_switch=0.0, delta=1e-10, init="flat", numba=True, + trafo3w_losses="hv", **kwargs): """ Runs the pandapower Optimal Power Flow. Flexibilities, constraints and cost parameters are defined in the pandapower element tables. @@ -388,15 +389,15 @@ def runopp(net, verbose=False, calculate_voltage_angles=False, check_connectivit trafo_model=trafo_model, check_connectivity=check_connectivity, mode=mode, copy_constraints_to_ppc=copy_constraints_to_ppc, r_switch=r_switch, init=init, enforce_q_lims=enforce_q_lims, recycle=recycle, - voltage_depend_loads=False, delta=delta) + voltage_depend_loads=False, delta=delta, trafo3w_losses=trafo3w_losses) _add_opf_options(net, trafo_loading=trafo_loading, ac=ac, numba=numba) _check_bus_index_and_print_warning_if_high(net) _check_gen_index_and_print_warning_if_high(net) _optimal_powerflow(net, verbose, suppress_warnings, **kwargs) -def rundcopp(net, verbose=False, check_connectivity=True, suppress_warnings=True, r_switch=0.0, delta=1e-10, - **kwargs): +def rundcopp(net, verbose=False, check_connectivity=True, suppress_warnings=True, r_switch=0.0, + delta=1e-10, trafo3w_losses="hv", **kwargs): """ Runs the pandapower Optimal Power Flow. Flexibilities, constraints and cost parameters are defined in the pandapower element tables. @@ -450,7 +451,7 @@ def rundcopp(net, verbose=False, check_connectivity=True, suppress_warnings=True trafo_model=trafo_model, check_connectivity=check_connectivity, mode=mode, copy_constraints_to_ppc=copy_constraints_to_ppc, r_switch=r_switch, init=init, enforce_q_lims=enforce_q_lims, recycle=recycle, - voltage_depend_loads=False, delta=delta) + voltage_depend_loads=False, delta=delta, trafo3w_losses=trafo3w_losses) _add_opf_options(net, trafo_loading=trafo_loading, ac=ac) _check_bus_index_and_print_warning_if_high(net) _check_gen_index_and_print_warning_if_high(net) diff --git a/setup.py b/setup.py index e67758ad6..94888a0ea 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ setup( name='pandapower', - version='1.4.3', + version='1.5.0', author='Leon Thurner, Alexander Scheidler', author_email='leon.thurner@uni-kassel.de, alexander.scheidler@iee.fraunhofer.de', description='Convenient Power System Modelling and Analysis based on PYPOWER and pandas', From 9f093d930a99d5d61af5659c8505fb9009f525db Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Wed, 25 Apr 2018 11:25:32 +0200 Subject: [PATCH 34/40] pandapower 1.5.0 --- CHANGELOG.rst | 1 + MANIFEST.in | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index c50ed2643..376b1a670 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -13,6 +13,7 @@ Change Log - [ADDED] generic storage model (sgen/load like element with negative / positive power allowed) - [ADDED] modelling of the complex (voltage magnitude and angle) tap changer for cross control - [ADDED] modelling of the tap changer of a 3-winding transformer at star point or terminals +- [ADDED] losses of 3W transformers can be modeled at star point, HV, MV or LV side [1.4.3] - 2018-02-06 ---------------------- diff --git a/MANIFEST.in b/MANIFEST.in index 8cecf0bf3..a6806d3a5 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,5 @@ include LICENSE AUTHORS README.rst requirements.txt CHANGELOG.rst global-include *.p global-include *.mat +global-include *.json From bb45ec01ad6f0468d92c448c37c82024433c4b43 Mon Sep 17 00:00:00 2001 From: WinfriedL <37797648+WinfriedL@users.noreply.github.com> Date: Wed, 25 Apr 2018 13:10:43 +0200 Subject: [PATCH 35/40] Corrected wye_delta transformation for trafo3w --- pandapower/build_branch.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pandapower/build_branch.py b/pandapower/build_branch.py index 477a8f272..948af901b 100644 --- a/pandapower/build_branch.py +++ b/pandapower/build_branch.py @@ -443,8 +443,10 @@ def _trafo_df_from_trafo3w(net): kt = _transformer_correction_factor(vsc, vscr, sn, 1.1) vsc_2w_delta *= kt vscr_2w_delta *= kt - vsc_2w = wye_delta(vsc_2w_delta, sn) + vsci_2w_delta = np.sqrt( vsc_2w_delta ** 2 - vscr_2w_delta ** 2) vscr_2w = wye_delta(vscr_2w_delta, sn) + vsci_2w = wye_delta(vsci_2w_delta, sn) + vsc_2w = np.sign(vsci_2w) * np.sqrt(vsci_2w ** 2 + vscr_2w ** 2) taps = [dict((tv, np.nan) for tv in tap_variables) for _ in range(3)] for k in range(3): taps[k]["tp_side"] = None @@ -888,4 +890,4 @@ def _transformer_correction_factor(vsc, vscr, sn, cmax): def get_is_lines(net): _is_elements = net["_is_elements"] - _is_elements["line"] = net["line"][net["line"]["in_service"].values.astype(bool)] \ No newline at end of file + _is_elements["line"] = net["line"][net["line"]["in_service"].values.astype(bool)] From 0071da29eb40fd137a36d22e849891d5c243e31f Mon Sep 17 00:00:00 2001 From: WinfriedL <37797648+WinfriedL@users.noreply.github.com> Date: Wed, 25 Apr 2018 13:12:18 +0200 Subject: [PATCH 36/40] removed white spaces --- pandapower/build_branch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandapower/build_branch.py b/pandapower/build_branch.py index 948af901b..0f7851580 100644 --- a/pandapower/build_branch.py +++ b/pandapower/build_branch.py @@ -443,7 +443,7 @@ def _trafo_df_from_trafo3w(net): kt = _transformer_correction_factor(vsc, vscr, sn, 1.1) vsc_2w_delta *= kt vscr_2w_delta *= kt - vsci_2w_delta = np.sqrt( vsc_2w_delta ** 2 - vscr_2w_delta ** 2) + vsci_2w_delta = np.sqrt( vsc_2w_delta ** 2 - vscr_2w_delta ** 2) vscr_2w = wye_delta(vscr_2w_delta, sn) vsci_2w = wye_delta(vsci_2w_delta, sn) vsc_2w = np.sign(vsci_2w) * np.sqrt(vsci_2w ** 2 + vscr_2w ** 2) From 0c65fdad307c8e2e39d8e7b24f321973e675b91c Mon Sep 17 00:00:00 2001 From: Dheepak Krishnamurthy Date: Wed, 25 Apr 2018 08:44:42 -0600 Subject: [PATCH 37/40] Update getting_started/introduction.rst to fix documentation links --- doc/getting_started/introduction.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/getting_started/introduction.rst b/doc/getting_started/introduction.rst index 028fae050..2a8a4d6d5 100644 --- a/doc/getting_started/introduction.rst +++ b/doc/getting_started/introduction.rst @@ -42,11 +42,11 @@ We now create the branch elements. First, we create the transformer from the typ i0_percent=0.3375, pfe_kw=1.35, name="Trafo") -Note that you do not have to calculate any impedances or tap ratio for the equivalent circuit, this is handled internally by pandapower according to the pandapower `transformer model `_. -The transformer model and all other pandapower electric elements are `validated against commercial software `_. +Note that you do not have to calculate any impedances or tap ratio for the equivalent circuit, this is handled internally by pandapower according to the pandapower `transformer model <../elements/trafo.html#electric-model>`_. +The transformer model and all other pandapower electric elements are `validated against commercial software <../about/tests.html#model-and-loadflow-validation>`_. -The `standard type library `_ allows even easier creation of the transformer. -The parameters given above are the parameters of the transformer "0.4 MVA 20/0.4 kV" from the pandapower `basic standard types `_. The transformer can be created from the standard type library like this: :: +The `standard type library <../std_types.html>`_ allows even easier creation of the transformer. +The parameters given above are the parameters of the transformer "0.4 MVA 20/0.4 kV" from the pandapower `basic standard types <../std_types/basic.html>`_. The transformer can be created from the standard type library like this: :: tid = pp.create_transformer(net, hv_bus=b1, lv_bus=b2, std_type="0.4 MVA 20/0.4 kV", name="Trafo") From 8bf2f9d7d6e0320064db2786d4557a7fbb386282 Mon Sep 17 00:00:00 2001 From: Leon Thurner Date: Wed, 25 Apr 2018 17:02:13 +0200 Subject: [PATCH 38/40] more broken documentation links #103 --- doc/getting_started/introduction.rst | 6 +++--- doc/index.rst | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/getting_started/introduction.rst b/doc/getting_started/introduction.rst index 2a8a4d6d5..f2d426d2d 100644 --- a/doc/getting_started/introduction.rst +++ b/doc/getting_started/introduction.rst @@ -70,11 +70,11 @@ the pandapower representation now looks like this: :align: center This is the version where transformer and line have been created through the standard type libraries, which is why the line has a specified type (cs for cable system) and the transformer has a tap changer, both of -which are defined in the `type data `_. +which are defined in the `type data <../std_types/basic.html>`_. **Running a Power Flow** -A powerflow can be carried out with the `runpp function `_: :: +A powerflow can be carried out with the `runpp function <../powerflow/ac.html>`_: :: pp.runpp(net) @@ -95,5 +95,5 @@ For the 3-bus example network, the result tables look like this: You can download the python script that creates this 3-bus system :download:`here `. -For a more in depth introduction into pandapower modeling and analysis functionality, see the `pandapower tutorials `_ +For a more in depth introduction into pandapower modeling and analysis functionality, see the `pandapower tutorials <../getting_started/tutorials.html>`_ about network creation, standard type libraries, power flow, topological searches, plotting and more. \ No newline at end of file diff --git a/doc/index.rst b/doc/index.rst index af47b4c0b..791cd9db4 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -8,7 +8,7 @@ aimed at automation of analysis and optimization in power systems. pandapower is a joint development of the research group Energy Management and Power System Operation, University of Kassel and the Department for Distribution System Operation at the Fraunhofer Institute for Energy Economics and Energy System Technology (IEE), Kassel. -.. image:: /pics/iwes.png +.. image:: /pics/iee.png :width: 18em :align: left From 49252959f2fc7214f1152d5bbe3c72f4ba56daaa Mon Sep 17 00:00:00 2001 From: Jan-Hendrik Menke Date: Thu, 26 Apr 2018 15:01:28 +0200 Subject: [PATCH 39/40] simple plot includes bus-bus switches now --- pandapower/plotting/simple_plot.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pandapower/plotting/simple_plot.py b/pandapower/plotting/simple_plot.py index 83a13f080..7fd6ab107 100644 --- a/pandapower/plotting/simple_plot.py +++ b/pandapower/plotting/simple_plot.py @@ -8,7 +8,7 @@ from pandapower.plotting.collections import create_bus_collection, create_line_collection, \ create_trafo_collection, create_trafo3w_collection, \ - create_line_switch_collection, draw_collections + create_line_switch_collection, draw_collections, create_bus_bus_switch_collection from pandapower.plotting.generic_geodata import create_generic_coordinates try: @@ -20,7 +20,7 @@ def simple_plot(net, respect_switches=False, line_width=1.0, bus_size=1.0, ext_grid_size=1.0, - switch_size=1.0, switch_distance=1.0, plot_line_switches=False, + switch_size=2.0, switch_distance=1.0, plot_line_switches=False, scale_size=True, bus_color="b", line_color='grey', trafo_color='k', ext_grid_color='y', switch_color='k', library="igraph", show_plot=True): """ @@ -147,6 +147,11 @@ def simple_plot(net, respect_switches=False, line_width=1.0, bus_size=1.0, ext_g use_line_geodata=not use_bus_geodata, zorder=12, color=switch_color) collections.append(sc) + if len(net.switch): + bsc1, bsc2 = create_bus_bus_switch_collection(net, size=switch_size) + collections.append(bsc2) + collections.append(bsc1) + ax = draw_collections(collections) if show_plot: plt.show() From af5194dc85b6d95e2c7fc51259b85737774226ee Mon Sep 17 00:00:00 2001 From: Steffen Meinecke Date: Thu, 3 May 2018 15:09:40 +0200 Subject: [PATCH 40/40] update cigre mv grid data for storage element, use sn_kva and cosphi and shorten the code --- pandapower/networks/cigre_networks.py | 133 ++++++++---------- .../test/networks/test_cigre_networks.py | 3 +- 2 files changed, 63 insertions(+), 73 deletions(-) diff --git a/pandapower/networks/cigre_networks.py b/pandapower/networks/cigre_networks.py index e208bf3cc..b003b3537 100644 --- a/pandapower/networks/cigre_networks.py +++ b/pandapower/networks/cigre_networks.py @@ -5,6 +5,7 @@ from pandas import read_json +from numpy import nan import pandapower as pp try: import pplog as logging @@ -168,52 +169,40 @@ def create_cigre_network_mv(with_der=False): # Busses bus0 = pp.create_bus(net_cigre_mv, name='Bus 0', vn_kv=110, type='b', zone='CIGRE_MV') - bus1 = pp.create_bus(net_cigre_mv, name='Bus 1', vn_kv=20, type='b', zone='CIGRE_MV') - bus2 = pp.create_bus(net_cigre_mv, name='Bus 2', vn_kv=20, type='b', zone='CIGRE_MV') - bus3 = pp.create_bus(net_cigre_mv, name='Bus 3', vn_kv=20, type='b', zone='CIGRE_MV') - bus4 = pp.create_bus(net_cigre_mv, name='Bus 4', vn_kv=20, type='b', zone='CIGRE_MV') - bus5 = pp.create_bus(net_cigre_mv, name='Bus 5', vn_kv=20, type='b', zone='CIGRE_MV') - bus6 = pp.create_bus(net_cigre_mv, name='Bus 6', vn_kv=20, type='b', zone='CIGRE_MV') - bus7 = pp.create_bus(net_cigre_mv, name='Bus 7', vn_kv=20, type='b', zone='CIGRE_MV') - bus8 = pp.create_bus(net_cigre_mv, name='Bus 8', vn_kv=20, type='b', zone='CIGRE_MV') - bus9 = pp.create_bus(net_cigre_mv, name='Bus 9', vn_kv=20, type='b', zone='CIGRE_MV') - bus10 = pp.create_bus(net_cigre_mv, name='Bus 10', vn_kv=20, type='b', zone='CIGRE_MV') - bus11 = pp.create_bus(net_cigre_mv, name='Bus 11', vn_kv=20, type='b', zone='CIGRE_MV') - bus12 = pp.create_bus(net_cigre_mv, name='Bus 12', vn_kv=20, type='b', zone='CIGRE_MV') - bus13 = pp.create_bus(net_cigre_mv, name='Bus 13', vn_kv=20, type='b', zone='CIGRE_MV') - bus14 = pp.create_bus(net_cigre_mv, name='Bus 14', vn_kv=20, type='b', zone='CIGRE_MV') + buses = pp.create_buses(net_cigre_mv, 14, name=['Bus %i' % i for i in range(1, 15)], vn_kv=20, + type='b', zone='CIGRE_MV') # Lines - pp.create_line(net_cigre_mv, bus1, bus2, length_km=2.82, + pp.create_line(net_cigre_mv, buses[0], buses[1], length_km=2.82, std_type='CABLE_CIGRE_MV', name='Line 1-2') - pp.create_line(net_cigre_mv, bus2, bus3, length_km=4.42, + pp.create_line(net_cigre_mv, buses[1], buses[2], length_km=4.42, std_type='CABLE_CIGRE_MV', name='Line 2-3') - pp.create_line(net_cigre_mv, bus3, bus4, length_km=0.61, + pp.create_line(net_cigre_mv, buses[2], buses[3], length_km=0.61, std_type='CABLE_CIGRE_MV', name='Line 3-4') - pp.create_line(net_cigre_mv, bus4, bus5, length_km=0.56, + pp.create_line(net_cigre_mv, buses[3], buses[4], length_km=0.56, std_type='CABLE_CIGRE_MV', name='Line 4-5') - pp.create_line(net_cigre_mv, bus5, bus6, length_km=1.54, + pp.create_line(net_cigre_mv, buses[4], buses[5], length_km=1.54, std_type='CABLE_CIGRE_MV', name='Line 5-6') - pp.create_line(net_cigre_mv, bus7, bus8, length_km=1.67, + pp.create_line(net_cigre_mv, buses[6], buses[7], length_km=1.67, std_type='CABLE_CIGRE_MV', name='Line 7-8') - pp.create_line(net_cigre_mv, bus8, bus9, length_km=0.32, + pp.create_line(net_cigre_mv, buses[7], buses[8], length_km=0.32, std_type='CABLE_CIGRE_MV', name='Line 8-9') - pp.create_line(net_cigre_mv, bus9, bus10, length_km=0.77, + pp.create_line(net_cigre_mv, buses[8], buses[9], length_km=0.77, std_type='CABLE_CIGRE_MV', name='Line 9-10') - pp.create_line(net_cigre_mv, bus10, bus11, length_km=0.33, + pp.create_line(net_cigre_mv, buses[9], buses[10], length_km=0.33, std_type='CABLE_CIGRE_MV', name='Line 10-11') - pp.create_line(net_cigre_mv, bus3, bus8, length_km=1.3, + pp.create_line(net_cigre_mv, buses[2], buses[7], length_km=1.3, std_type='CABLE_CIGRE_MV', name='Line 3-8') - pp.create_line(net_cigre_mv, bus12, bus13, length_km=4.89, + pp.create_line(net_cigre_mv, buses[11], buses[12], length_km=4.89, std_type='OHL_CIGRE_MV', name='Line 12-13') - pp.create_line(net_cigre_mv, bus13, bus14, length_km=2.99, + pp.create_line(net_cigre_mv, buses[12], buses[13], length_km=2.99, std_type='OHL_CIGRE_MV', name='Line 13-14') - line6_7 = pp.create_line(net_cigre_mv, bus6, bus7, length_km=0.24, + line6_7 = pp.create_line(net_cigre_mv, buses[5], buses[6], length_km=0.24, std_type='CABLE_CIGRE_MV', name='Line 6-7') - line4_11 = pp.create_line(net_cigre_mv, bus11, bus4, length_km=0.49, + line4_11 = pp.create_line(net_cigre_mv, buses[10], buses[3], length_km=0.49, std_type='CABLE_CIGRE_MV', name='Line 11-4') - line8_14 = pp.create_line(net_cigre_mv, bus14, bus8, length_km=2., + line8_14 = pp.create_line(net_cigre_mv, buses[13], buses[7], length_km=2., std_type='OHL_CIGRE_MV', name='Line 14-8') # Ext-Grid @@ -221,76 +210,76 @@ def create_cigre_network_mv(with_der=False): s_sc_max_mva=5000, s_sc_min_mva=5000, rx_max=0.1, rx_min=0.1) # Trafos - trafo0 = pp.create_transformer_from_parameters(net_cigre_mv, bus0, bus1, sn_kva=25000, + trafo0 = pp.create_transformer_from_parameters(net_cigre_mv, bus0, buses[0], sn_kva=25000, vn_hv_kv=110, vn_lv_kv=20, vscr_percent=0.16, vsc_percent=12.00107, pfe_kw=0, i0_percent=0, shift_degree=30.0, name='Trafo 0-1') - trafo1 = pp.create_transformer_from_parameters(net_cigre_mv, bus0, bus12, sn_kva=25000, + trafo1 = pp.create_transformer_from_parameters(net_cigre_mv, bus0, buses[11], sn_kva=25000, vn_hv_kv=110, vn_lv_kv=20, vscr_percent=0.16, vsc_percent=12.00107, pfe_kw=0, i0_percent=0, shift_degree=30.0, name='Trafo 0-12') # Switches # S2 - pp.create_switch(net_cigre_mv, bus6, line6_7, et='l', closed=True, type='LBS') - pp.create_switch(net_cigre_mv, bus7, line6_7, et='l', closed=False, type='LBS', name='S2') + pp.create_switch(net_cigre_mv, buses[5], line6_7, et='l', closed=True, type='LBS') + pp.create_switch(net_cigre_mv, buses[6], line6_7, et='l', closed=False, type='LBS', name='S2') # S3 - pp.create_switch(net_cigre_mv, bus4, line4_11, et='l', closed=False, type='LBS', name='S3') - pp.create_switch(net_cigre_mv, bus11, line4_11, et='l', closed=True, type='LBS') + pp.create_switch(net_cigre_mv, buses[3], line4_11, et='l', closed=False, type='LBS', name='S3') + pp.create_switch(net_cigre_mv, buses[10], line4_11, et='l', closed=True, type='LBS') # S1 - pp.create_switch(net_cigre_mv, bus8, line8_14, et='l', closed=False, type='LBS', name='S1') - pp.create_switch(net_cigre_mv, bus14, line8_14, et='l', closed=True, type='LBS') + pp.create_switch(net_cigre_mv, buses[7], line8_14, et='l', closed=False, type='LBS', name='S1') + pp.create_switch(net_cigre_mv, buses[13], line8_14, et='l', closed=True, type='LBS') # trafos pp.create_switch(net_cigre_mv, bus0, trafo0, et='t', closed=True, type='CB') pp.create_switch(net_cigre_mv, bus0, trafo1, et='t', closed=True, type='CB') # Loads # Residential - pp.create_load(net_cigre_mv, bus1, p_kw=14994.0, q_kvar=3044.66156, name='Load R1') - pp.create_load(net_cigre_mv, bus3, p_kw=276.45, q_kvar=69.28490, name='Load R3') - pp.create_load(net_cigre_mv, bus4, p_kw=431.65, q_kvar=108.18169, name='Load R4') - pp.create_load(net_cigre_mv, bus5, p_kw=727.5, q_kvar=182.32869, name='Load R5') - pp.create_load(net_cigre_mv, bus6, p_kw=548.05, q_kvar=137.35428, name='Load R6') - pp.create_load(net_cigre_mv, bus8, p_kw=586.85, q_kvar=147.07847, name='Load R8') - pp.create_load(net_cigre_mv, bus10, p_kw=475.3, q_kvar=119.12141, name='Load R10') - pp.create_load(net_cigre_mv, bus11, p_kw=329.8, q_kvar=82.65567, name='Load R11') - pp.create_load(net_cigre_mv, bus12, p_kw=14994.0, q_kvar=3044.66156, name='Load R12') - pp.create_load(net_cigre_mv, bus14, p_kw=208.55, q_kvar=52.26756, name='Load R14') + pp.create_load_from_cosphi(net_cigre_mv, buses[0], 15300, 0.98, "ind", name='Load R1') + pp.create_load_from_cosphi(net_cigre_mv, buses[2], 285, 0.97, "ind", name='Load R3') + pp.create_load_from_cosphi(net_cigre_mv, buses[3], 445, 0.97, "ind", name='Load R4') + pp.create_load_from_cosphi(net_cigre_mv, buses[4], 750, 0.97, "ind", name='Load R5') + pp.create_load_from_cosphi(net_cigre_mv, buses[5], 565, 0.97, "ind", name='Load R6') + pp.create_load_from_cosphi(net_cigre_mv, buses[7], 605, 0.97, "ind", name='Load R8') + pp.create_load_from_cosphi(net_cigre_mv, buses[9], 490, 0.97, "ind", name='Load R10') + pp.create_load_from_cosphi(net_cigre_mv, buses[10], 340, 0.97, "ind", name='Load R11') + pp.create_load_from_cosphi(net_cigre_mv, buses[11], 15300, 0.98, "ind", name='Load R12') + pp.create_load_from_cosphi(net_cigre_mv, buses[13], 215, 0.97, "ind", name='Load R14') # Commercial / Industrial - pp.create_load(net_cigre_mv, bus1, p_kw=4845.0, q_kvar=1592.47449, name='Load CI1') - pp.create_load(net_cigre_mv, bus3, p_kw=225.25, q_kvar=139.59741, name='Load CI3') - pp.create_load(net_cigre_mv, bus7, p_kw=76.5, q_kvar=47.41044, name='Load CI7') - pp.create_load(net_cigre_mv, bus9, p_kw=573.75, q_kvar=355.57831, name='Load CI9') - pp.create_load(net_cigre_mv, bus10, p_kw=68.0, q_kvar=42.14262, name='Load CI10') - pp.create_load(net_cigre_mv, bus12, p_kw=5016.0, q_kvar=1648.67947, name='Load CI12') - pp.create_load(net_cigre_mv, bus13, p_kw=34.0, q_kvar=21.07131, name='Load CI13') - pp.create_load(net_cigre_mv, bus14, p_kw=331.5, q_kvar=205.44525, name='Load CI14') + pp.create_load_from_cosphi(net_cigre_mv, buses[0], 5100, 0.95, "ind", name='Load CI1') + pp.create_load_from_cosphi(net_cigre_mv, buses[2], 265, 0.85, "ind", name='Load CI3') + pp.create_load_from_cosphi(net_cigre_mv, buses[6], 90, 0.85, "ind", name='Load CI7') + pp.create_load_from_cosphi(net_cigre_mv, buses[8], 675, 0.85, "ind", name='Load CI9') + pp.create_load_from_cosphi(net_cigre_mv, buses[9], 80, 0.85, "ind", name='Load CI10') + pp.create_load_from_cosphi(net_cigre_mv, buses[11], 5280, 0.95, "ind", name='Load CI12') + pp.create_load_from_cosphi(net_cigre_mv, buses[12], 40, 0.85, "ind", name='Load CI13') + pp.create_load_from_cosphi(net_cigre_mv, buses[13], 390, 0.85, "ind", name='Load CI14') # Optional distributed energy recources if with_der in ["pv_wind", "all"]: - pp.create_sgen(net_cigre_mv, bus3, p_kw=-20, q_kvar=0, sn_kva=20, name='PV 3', type='PV') - pp.create_sgen(net_cigre_mv, bus4, p_kw=-20, q_kvar=0, sn_kva=20, name='PV 4', type='PV') - pp.create_sgen(net_cigre_mv, bus5, p_kw=-30, q_kvar=0, sn_kva=30, name='PV 5', type='PV') - pp.create_sgen(net_cigre_mv, bus6, p_kw=-30, q_kvar=0, sn_kva=30, name='PV 6', type='PV') - pp.create_sgen(net_cigre_mv, bus8, p_kw=-30, q_kvar=0, sn_kva=30, name='PV 8', type='PV') - pp.create_sgen(net_cigre_mv, bus9, p_kw=-30, q_kvar=0, sn_kva=30, name='PV 9', type='PV') - pp.create_sgen(net_cigre_mv, bus10, p_kw=-40, q_kvar=0, sn_kva=40, name='PV 10', type='PV') - pp.create_sgen(net_cigre_mv, bus11, p_kw=-10, q_kvar=0, sn_kva=10, name='PV 11', type='PV') - pp.create_sgen(net_cigre_mv, bus7, p_kw=-1500, q_kvar=0, sn_kva=1500, name='WKA 7', + pp.create_sgen(net_cigre_mv, buses[2], -20, q_kvar=0, sn_kva=20, name='PV 3', type='PV') + pp.create_sgen(net_cigre_mv, buses[3], -20, q_kvar=0, sn_kva=20, name='PV 4', type='PV') + pp.create_sgen(net_cigre_mv, buses[4], -30, q_kvar=0, sn_kva=30, name='PV 5', type='PV') + pp.create_sgen(net_cigre_mv, buses[5], -30, q_kvar=0, sn_kva=30, name='PV 6', type='PV') + pp.create_sgen(net_cigre_mv, buses[7], -30, q_kvar=0, sn_kva=30, name='PV 8', type='PV') + pp.create_sgen(net_cigre_mv, buses[8], -30, q_kvar=0, sn_kva=30, name='PV 9', type='PV') + pp.create_sgen(net_cigre_mv, buses[9], -40, q_kvar=0, sn_kva=40, name='PV 10', type='PV') + pp.create_sgen(net_cigre_mv, buses[10], -10, q_kvar=0, sn_kva=10, name='PV 11', type='PV') + pp.create_sgen(net_cigre_mv, buses[6], -1500, q_kvar=0, sn_kva=1500, name='WKA 7', type='WP') if with_der == "all": - pp.create_sgen(net_cigre_mv, bus=bus5, p_kw=-600, sn_kva=600, name='Battery 1', - type='Battery', max_p_kw=-600, min_p_kw=600) - pp.create_sgen(net_cigre_mv, bus=bus5, p_kw=-33, sn_kva=33, + pp.create_storage(net_cigre_mv, bus=buses[4], p_kw=-600, max_e_kwh=nan, sn_kva=200, + name='Battery 1', type='Battery', max_p_kw=-600, min_p_kw=600) + pp.create_sgen(net_cigre_mv, bus=buses[4], p_kw=-33, sn_kva=33, name='Residential fuel cell 1', type='Residential fuel cell') - pp.create_sgen(net_cigre_mv, bus=bus9, p_kw=-310, sn_kva=310, name='CHP diesel 1', + pp.create_sgen(net_cigre_mv, bus=buses[8], p_kw=-310, sn_kva=310, name='CHP diesel 1', type='CHP diesel') - pp.create_sgen(net_cigre_mv, bus=bus9, p_kw=-212, sn_kva=212, name='Fuel cell 1', + pp.create_sgen(net_cigre_mv, bus=buses[8], p_kw=-212, sn_kva=212, name='Fuel cell 1', type='Fuel cell') - pp.create_sgen(net_cigre_mv, bus=bus10, p_kw=0, sn_kva=200, name='Battery 2', - type='Battery', max_p_kw=-200, min_p_kw=200) - pp.create_sgen(net_cigre_mv, bus=bus10, p_kw=-14, sn_kva=14, + pp.create_storage(net_cigre_mv, bus=buses[9], p_kw=-200, max_e_kwh=nan, sn_kva=200, + name='Battery 2', type='Battery', max_p_kw=-200, min_p_kw=200) + pp.create_sgen(net_cigre_mv, bus=buses[9], p_kw=-14, sn_kva=14, name='Residential fuel cell 2', type='Residential fuel cell') # Bus geo data diff --git a/pandapower/test/networks/test_cigre_networks.py b/pandapower/test/networks/test_cigre_networks.py index 4198458fd..287b8fd68 100644 --- a/pandapower/test/networks/test_cigre_networks.py +++ b/pandapower/test/networks/test_cigre_networks.py @@ -74,7 +74,8 @@ def test_cigre_mv(): assert len(net.bus) == 15 assert len(net.line) == 15 assert len(net.gen) == 0 - assert len(net.sgen) == 15 + assert len(net.sgen) == 13 + assert len(net.storage) == 2 assert len(net.shunt) == 0 assert len(net.trafo) == 2 assert len(net.load) == 18