pandapower 3.0.0.dev2__tar.gz → 3.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/AUTHORS +9 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/LICENSE +7 -7
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/PKG-INFO +5 -32
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/_version.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/auxiliary.py +27 -27
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/build_branch.py +19 -6
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/build_bus.py +13 -12
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/build_gen.py +56 -13
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/contingency/contingency.py +5 -10
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/__init__.py +13 -11
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/basic_controller.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/DERController/DERBasics.py +2 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/DERController/PQVAreas.py +2 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/DERController/QModels.py +2 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/DERController/der_control.py +24 -26
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/DERController/der_control_plot.py +5 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/characteristic_control.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/const_control.py +2 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/pq_control.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/shunt_control.py +1 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/trafo/ContinuousTapControl.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/trafo/DiscreteTapControl.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/trafo/TapDependentImpedance.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/trafo/VmSetTapControl.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/trafo_control.py +23 -15
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/run_control.py +4 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/util/auxiliary.py +98 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/util/characteristic.py +3 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/util/diagnostic.py +75 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/convert_format.py +4 -7
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/build_pp_net.py +15 -9
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/convert_measurements.py +6 -7
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/connectivitynodes/connectivityNodesCim16.py +37 -22
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/externalnetworks/externalNetworkInjectionsCim16.py +12 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/generators/energySourcesCim16.py +5 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/generators/synchronousMachinesCim16.py +55 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/lines/acLineSegmentsCim16.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/shunts/linearShuntCompensatorCim16.py +2 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/shunts/staticVarCompensatorCim16.py +2 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/transformers/powerTransformersCim16.py +12 -13
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/from_cim.py +6 -6
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim_classes.py +48 -34
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim_tools.py +3 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/pp_classes.py +7 -6
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/pp_tools.py +10 -9
- pandapower-3.0.0.dev2/pandapower/converter/cim/serialized_schemas/CIM16_4.0.8_schema.json → pandapower-3.1.2/pandapower/converter/cim/serialized_schemas/CIM16_4.2.9_schema.json +2313 -5994
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/jao/from_jao.py +2 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/matpower/from_mpc.py +9 -12
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/matpower/to_mpc.py +6 -9
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/pandamodels/to_pm.py +1 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/export_pfd_to_pp.py +4 -7
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/gui.py +1 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/logger_setup.py +1 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/main_pf.py +9 -12
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/pf_export_functions.py +1 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/pp_import_functions.py +537 -360
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/validate.py +13 -13
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/pypower/from_ppc.py +1 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/pypower/to_ppc.py +8 -10
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/ucte/from_ucte.py +10 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/ucte/ucte_converter.py +12 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/ucte/ucte_parser.py +14 -2
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/create.py +218 -117
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/diagnostic.py +14 -17
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/diagnostic_reports.py +2 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/algorithm/base.py +38 -36
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/algorithm/estimator.py +25 -6
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/algorithm/lp.py +29 -13
- pandapower-3.1.2/pandapower/estimation/algorithm/matrix_base.py +315 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/algorithm/optimization.py +4 -2
- pandapower-3.1.2/pandapower/estimation/ppc_conversion.py +756 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/results.py +20 -18
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/state_estimation.py +47 -56
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/util.py +12 -9
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/file_io.py +45 -38
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/grid_equivalents/auxiliary.py +108 -104
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/grid_equivalents/get_equivalent.py +52 -53
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/grid_equivalents/rei_generation.py +122 -111
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/grid_equivalents/toolbox.py +28 -25
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/grid_equivalents/ward_generation.py +77 -83
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/groups.py +26 -29
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/io_utils.py +10 -12
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/IEEE_European_LV_Off_Peak_1.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/IEEE_European_LV_Off_Peak_1440.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/IEEE_European_LV_On_Peak_566.json +165 -16
- pandapower-3.1.2/pandapower/networks/cigre_networks.py +465 -0
- pandapower-3.1.2/pandapower/networks/create_examples.py +408 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/dickert_lv_networks.py +60 -57
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/ieee_europen_lv_asymmetric.py +11 -11
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/kerber_extreme_networks.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/kerber_networks.py +24 -22
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/lv_schutterwald.json +140 -10
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/lv_schutterwald.py +18 -17
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/mv_oberrhein.json +152 -14
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/mv_oberrhein.py +22 -20
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/mv_oberrhein_substations.json +152 -14
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/GBnetwork.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/GBreducednetwork.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case118.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case11_iwamoto.json +166 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case1354pegase.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case14.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case145.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case1888rte.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case24_ieee_rts.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case2848rte.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case2869pegase.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case30.json +165 -15
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case300.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case3120sp.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case33bw.json +165 -15
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case39.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case4gs.json +165 -15
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case5.json +165 -15
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case57.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case5_demo_gridcal.json +166 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case6470rte.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case6495rte.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case6515rte.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case6ww.json +165 -15
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case89pegase.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case9.json +165 -15
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case9241pegase.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case_ieee30.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/case_illinois200.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_case_jsons/iceland.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/power_system_test_cases.py +86 -114
- pandapower-3.1.2/pandapower/networks/simple_pandapower_test_networks.py +190 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/synthetic_voltage_control_lv_networks.py +59 -58
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/opf/make_objective.py +2 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/opf/run_pandamodels.py +1 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/optimal_powerflow.py +2 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pd2ppc.py +49 -46
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pd2ppc_zero.py +5 -6
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/__init__.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/create_jacobian.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/create_jacobian_facts.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/create_jacobian_numba.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/create_jacobian_tdpf.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/dSbus_dV_numba.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/iwamoto_multiplier.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/makeYbus_facts.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/makeYbus_numba.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/no_numba.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/pfsoln_numba.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/ppci_variables.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/run_bfswpf.py +8 -10
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/run_dc_pf.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/run_newton_raphson_pf.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/runpf_pypower.py +2 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pf/runpp_3ph.py +2 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/collections.py +72 -60
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/generic_geodata.py +7 -9
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/geo.py +53 -24
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/patch_makers.py +1 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/plotly/mapbox_plot.py +4 -24
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/plotly/pf_res_plotly.py +3 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/plotly/simple_plotly.py +3 -46
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/plotly/traces.py +18 -12
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/plotly/vlevel_plotly.py +3 -6
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/plotting_toolbox.py +1 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/powerflow_results.py +8 -7
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/simple_plot.py +5 -6
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/powerflow.py +3 -6
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/protection/basic_protection_device.py +2 -2
- pandapower-3.1.2/pandapower/protection/example_grids.py +129 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/protection/protection_devices/ocrelay.py +3 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/protection/run_protection.py +0 -2
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/protection/utility_functions.py +61 -56
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/bustypes.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/dSbus_dV.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/dcpf.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_brch.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_brch_sc.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_brch_tdpf.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_bus.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_bus_sc.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_ssc.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_svc.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_tcsc.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeBdc.py +2 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeLODF.py +3 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makePTDF.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeYbus.py +2 -2
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/newtonpf.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/opf.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/opf_execute.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/opf_hessfcn.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/opf_setup.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/pfsoln.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/pips.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/pipsopf_solver.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/results.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/results_branch.py +3 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/results_bus.py +20 -7
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/results_gen.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/run.py +2 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/runpm.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/shortcircuit/calc_sc.py +17 -20
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/shortcircuit/currents.py +1 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/shortcircuit/ppc_conversion.py +1 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/shortcircuit/toolbox.py +10 -13
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/sql_io.py +2 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/std_types.py +7 -9
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/timeseries/output_writer.py +7 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/timeseries/run_time_series.py +11 -7
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/timeseries/ts_runpp.py +30 -27
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/toolbox/comparison.py +1 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/toolbox/data_modification.py +36 -24
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/toolbox/element_selection.py +38 -38
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/toolbox/grid_modification.py +10 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/toolbox/power_factor.py +2 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/toolbox/result_info.py +2 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/topology/create_graph.py +7 -9
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/topology/graph_searches.py +22 -31
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower.egg-info/PKG-INFO +5 -32
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower.egg-info/SOURCES.txt +1 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower.egg-info/requires.txt +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pyproject.toml +5 -14
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/setup.py +1 -1
- pandapower-3.0.0.dev2/CHANGELOG.rst +0 -782
- pandapower-3.0.0.dev2/CITATION.bib +0 -11
- pandapower-3.0.0.dev2/pandapower/estimation/algorithm/matrix_base.py +0 -233
- pandapower-3.0.0.dev2/pandapower/estimation/ppc_conversion.py +0 -607
- pandapower-3.0.0.dev2/pandapower/networks/cigre_networks.py +0 -524
- pandapower-3.0.0.dev2/pandapower/networks/create_examples.py +0 -406
- pandapower-3.0.0.dev2/pandapower/networks/simple_pandapower_test_networks.py +0 -194
- pandapower-3.0.0.dev2/pandapower/protection/example_grids.py +0 -134
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/README.rst +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/contingency/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/DERController/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/station_control.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/controller/trafo/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/control/util/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/connectivitynodes/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/coordinates/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/coordinates/coordinatesFromDLCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/coordinates/geoCoordinatesFromGLCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/externalnetworks/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/generators/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/generators/asynchronousMachinesCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/impedance/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/impedance/equivalentBranchesCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/impedance/seriesCompensatorsCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/lines/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/lines/dcLineSegmentsCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/loads/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/loads/conformLoadsCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/loads/energyConcumersCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/loads/nonConformLoadsCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/loads/stationSuppliesCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/shunts/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/shunts/nonLinearShuntCompensatorCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/switches/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/switches/switchesCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/transformers/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/transformers/tapController.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/wards/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/cim2pp/converter_classes/wards/equivalentInjectionsCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/interfaces.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/other_classes.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/cim/serialized_schemas/CIM100_4.0.10_schema.json +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/jao/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/matpower/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/pandamodels/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/pandamodels/from_pm.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/echo_off.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/powerfactory/run_import.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/pypower/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/converter/ucte/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/algorithm/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/idx_brch.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/estimation/idx_bus.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/grid_equivalents/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/networks/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/opf/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/opf/pm_storage.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/opf/validate_opf_input.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/colormaps.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/plotly/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/plotly/get_colors.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/plotting/to_html.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/protection/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/protection/protection_devices/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/protection/protection_devices/fuse.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/_compat.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/add_userfcn.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/d2AIbr_dV2.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/d2ASbr_dV2.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/d2Ibr_dV2.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/d2Sbr_dV2.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/d2Sbus_dV2.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/dAbr_dV.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/dIbr_dV.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/dSbr_dV.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/dcopf_solver.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/fdpf.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/gausspf.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/hasPQcap.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_area.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_brch_dc.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_bus_dc.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_cost.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_gen.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/idx_vsc.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/isload.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeAang.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeApq.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeAvl.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeAy.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeB.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/makeSbus.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/opf_args.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/opf_consfcn.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/opf_costfcn.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/opf_model.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/pipsver.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/polycost.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/ppoption.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/ppver.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/pqcost.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/printpf.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/qps_pips.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/qps_pypower.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/run_userfcn.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/totcost.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/update_mupq.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/pypower/util.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/shortcircuit/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/shortcircuit/impedance.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/shortcircuit/kappa.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/shortcircuit/results.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/timeseries/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/timeseries/data_source.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/timeseries/data_sources/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/timeseries/data_sources/frame_data.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/timeseries/read_batch_results.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/toolbox/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/topology/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower/topology/graph_tool_interface.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower.egg-info/dependency_links.txt +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/pandapower.egg-info/top_level.txt +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.2}/setup.cfg +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Copyright (c) 2016-
|
|
1
|
+
Copyright (c) 2016-2025 by University of Kassel and Fraunhofer Institute for Energy Economics
|
|
2
2
|
and Energy System Technology (IEE), Kassel. All rights reserved.
|
|
3
3
|
|
|
4
4
|
pandapower is maintained and developed by a community on `GitHub <https://github.com/e2nIEE/pandapower>`_. Lists of maintainers and contributors can be found here:
|
|
@@ -31,6 +31,12 @@ Previous list of Contributors:
|
|
|
31
31
|
- Zhenqi Wang
|
|
32
32
|
- Alexander Prostejovsky
|
|
33
33
|
- Maryam Majidi
|
|
34
|
-
- Martin Braun
|
|
35
|
-
- Johann-Christian Töbermann
|
|
34
|
+
- Martin Braun
|
|
35
|
+
- Johann-Christian Töbermann
|
|
36
36
|
- Stefan Gehler
|
|
37
|
+
- Mike Vogt
|
|
38
|
+
- Pawel Lytaev
|
|
39
|
+
- Dominik Hilbrich
|
|
40
|
+
- Mario Richter
|
|
41
|
+
- David Heck
|
|
42
|
+
- Hjalmar Körtge
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
Copyright (c) 2016-
|
|
1
|
+
Copyright (c) 2016-2025 by University of Kassel and Fraunhofer Institute for Energy Economics
|
|
2
2
|
and Energy System Technology (IEE) Kassel and individual contributors (see AUTHORS file for details).
|
|
3
3
|
All rights reserved.
|
|
4
4
|
|
|
5
|
-
Redistribution and use in source and binary forms, with or without modification, are permitted
|
|
5
|
+
Redistribution and use in source and binary forms, with or without modification, are permitted
|
|
6
6
|
provided that the following conditions are met:
|
|
7
7
|
|
|
8
8
|
1. Redistributions of source code must retain the above copyright notice, this list of conditions
|
|
@@ -12,14 +12,14 @@ and the following disclaimer.
|
|
|
12
12
|
conditions and the following disclaimer in the documentation and/or other materials provided
|
|
13
13
|
with the distribution.
|
|
14
14
|
|
|
15
|
-
3. Neither the name of the copyright holder nor the names of its contributors may be used to
|
|
15
|
+
3. Neither the name of the copyright holder nor the names of its contributors may be used to
|
|
16
16
|
endorse or promote products derived from this software without specific prior written permission.
|
|
17
17
|
|
|
18
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
|
|
19
|
-
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
20
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
18
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
|
|
19
|
+
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
20
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
21
21
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
22
|
-
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
22
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
23
23
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
24
24
|
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
|
|
25
25
|
WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@@ -1,35 +1,9 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: pandapower
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.1.2
|
|
4
4
|
Summary: An easy to use open source tool for power system modeling, analysis and optimization with a high degree of automation.
|
|
5
|
-
Author-email: Leon Thurner <leon.thurner@retoflow.de>, Alexander Scheidler <alexander.scheidler@iee.fraunhofer.de>
|
|
5
|
+
Author-email: Leon Thurner <leon.thurner@retoflow.de>, Alexander Scheidler <alexander.scheidler@iee.fraunhofer.de>, Mike Vogt <mike.vogt@iee.fraunhofer.de>
|
|
6
6
|
Maintainer-email: pandapower Developers <info@pandapower.org>
|
|
7
|
-
License: Copyright (c) 2016-2024 by University of Kassel and Fraunhofer Institute for Energy Economics
|
|
8
|
-
and Energy System Technology (IEE) Kassel and individual contributors (see AUTHORS file for details).
|
|
9
|
-
All rights reserved.
|
|
10
|
-
|
|
11
|
-
Redistribution and use in source and binary forms, with or without modification, are permitted
|
|
12
|
-
provided that the following conditions are met:
|
|
13
|
-
|
|
14
|
-
1. Redistributions of source code must retain the above copyright notice, this list of conditions
|
|
15
|
-
and the following disclaimer.
|
|
16
|
-
|
|
17
|
-
2. Redistributions in binary form must reproduce the above copyright notice, this list of
|
|
18
|
-
conditions and the following disclaimer in the documentation and/or other materials provided
|
|
19
|
-
with the distribution.
|
|
20
|
-
|
|
21
|
-
3. Neither the name of the copyright holder nor the names of its contributors may be used to
|
|
22
|
-
endorse or promote products derived from this software without specific prior written permission.
|
|
23
|
-
|
|
24
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
|
|
25
|
-
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
26
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
27
|
-
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
28
|
-
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
29
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
30
|
-
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
|
|
31
|
-
WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
32
|
-
|
|
33
7
|
Project-URL: Homepage, https://www.pandapower.org
|
|
34
8
|
Project-URL: Documentation, https://pandapower.readthedocs.io
|
|
35
9
|
Project-URL: Source, https://www.github.com/e2nIEE/pandapower
|
|
@@ -56,11 +30,9 @@ Requires-Python: >=3.9
|
|
|
56
30
|
Description-Content-Type: text/x-rst
|
|
57
31
|
License-File: LICENSE
|
|
58
32
|
License-File: AUTHORS
|
|
59
|
-
License-File: CHANGELOG.rst
|
|
60
|
-
License-File: CITATION.bib
|
|
61
33
|
Requires-Dist: pandas>=1.0
|
|
62
34
|
Requires-Dist: networkx>=2.5
|
|
63
|
-
Requires-Dist: scipy
|
|
35
|
+
Requires-Dist: scipy
|
|
64
36
|
Requires-Dist: numpy
|
|
65
37
|
Requires-Dist: packaging
|
|
66
38
|
Requires-Dist: tqdm
|
|
@@ -120,6 +92,7 @@ Requires-Dist: cryptography; extra == "all"
|
|
|
120
92
|
Requires-Dist: psycopg2; extra == "all"
|
|
121
93
|
Requires-Dist: matpowercaseframes; extra == "all"
|
|
122
94
|
Requires-Dist: power-grid-model-io; extra == "all"
|
|
95
|
+
Dynamic: license-file
|
|
123
96
|
|
|
124
97
|
|
|
125
98
|
.. image:: https://www.pandapower.org/images/pp.svg
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
|
|
3
|
-
# Copyright (c) 2016-
|
|
3
|
+
# Copyright (c) 2016-2025 by University of Kassel and Fraunhofer Institute for Energy Economics
|
|
4
4
|
# and Energy System Technology (IEE), Kassel. All rights reserved.
|
|
5
5
|
|
|
6
6
|
|
|
@@ -27,43 +27,41 @@
|
|
|
27
27
|
# (https://github.com/bcj/AttrDict/blob/master/LICENSE.txt)
|
|
28
28
|
|
|
29
29
|
import copy
|
|
30
|
-
|
|
30
|
+
import numbers
|
|
31
31
|
import warnings
|
|
32
|
-
from
|
|
32
|
+
from collections.abc import MutableMapping
|
|
33
33
|
from importlib.metadata import PackageNotFoundError
|
|
34
|
-
from
|
|
34
|
+
from importlib.metadata import version as version_str
|
|
35
35
|
|
|
36
|
-
from geojson import loads, GeoJSON
|
|
37
36
|
import numpy as np
|
|
38
37
|
import pandas as pd
|
|
39
38
|
from pandas.api.types import is_numeric_dtype, is_string_dtype, is_object_dtype
|
|
40
39
|
# from pandas.api.types import is_integer_dtype, is_float_dtype
|
|
41
40
|
import scipy as sp
|
|
42
|
-
import
|
|
41
|
+
from geojson import loads, GeoJSON
|
|
43
42
|
from packaging.version import Version
|
|
43
|
+
from typing_extensions import deprecated
|
|
44
44
|
|
|
45
45
|
from pandapower.pypower.idx_brch import F_BUS, T_BUS, BR_STATUS
|
|
46
46
|
from pandapower.pypower.idx_brch_dc import DC_BR_STATUS, DC_F_BUS, DC_T_BUS
|
|
47
47
|
from pandapower.pypower.idx_bus import BUS_I, BUS_TYPE, NONE, PD, QD, VM, VA, REF, PQ, VMIN, VMAX, PV
|
|
48
|
+
from pandapower.pypower.idx_bus_dc import DC_VMAX, DC_VMIN, DC_BUS_I, DC_BUS_TYPE, DC_NONE, DC_REF, DC_B2B, DC_P
|
|
48
49
|
from pandapower.pypower.idx_gen import PMIN, PMAX, QMIN, QMAX
|
|
49
50
|
from pandapower.pypower.idx_ssc import SSC_STATUS, SSC_BUS, SSC_INTERNAL_BUS
|
|
50
51
|
from pandapower.pypower.idx_tcsc import TCSC_STATUS, TCSC_F_BUS, TCSC_T_BUS
|
|
51
|
-
from pandapower.pypower.idx_vsc import VSC_STATUS, VSC_BUS, VSC_INTERNAL_BUS, VSC_BUS_DC,
|
|
52
|
-
VSC_INTERNAL_BUS_DC
|
|
53
|
-
from .pypower.idx_bus_dc import DC_VMAX, DC_VMIN, DC_BUS_I, DC_BUS_TYPE, DC_NONE, DC_REF, DC_B2B, DC_P
|
|
52
|
+
from pandapower.pypower.idx_vsc import VSC_STATUS, VSC_BUS, VSC_INTERNAL_BUS, VSC_BUS_DC, VSC_INTERNAL_BUS_DC
|
|
54
53
|
|
|
55
54
|
try:
|
|
56
55
|
from lightsim2grid.newtonpf import newtonpf_new as newtonpf_ls
|
|
56
|
+
|
|
57
57
|
lightsim2grid_available = True
|
|
58
58
|
except ImportError:
|
|
59
59
|
lightsim2grid_available = False
|
|
60
|
-
|
|
61
|
-
import pandaplan.core.pplog as logging
|
|
62
|
-
except ImportError:
|
|
63
|
-
import logging
|
|
60
|
+
import logging
|
|
64
61
|
try:
|
|
65
62
|
from geopandas import GeoSeries
|
|
66
63
|
from shapely import from_geojson
|
|
64
|
+
|
|
67
65
|
geopandas_available = True
|
|
68
66
|
except ImportError:
|
|
69
67
|
geopandas_available = False
|
|
@@ -87,10 +85,9 @@ def log_to_level(msg, passed_logger, level):
|
|
|
87
85
|
|
|
88
86
|
|
|
89
87
|
def version_check(package_name, level="UserWarning", ignore_not_installed=False):
|
|
90
|
-
|
|
91
88
|
minimum_version = {'plotly': "3.1.1",
|
|
92
89
|
'numba': "0.25",
|
|
93
|
-
|
|
90
|
+
}
|
|
94
91
|
if ignore_not_installed and package_name not in minimum_version.keys():
|
|
95
92
|
return
|
|
96
93
|
|
|
@@ -110,6 +107,7 @@ def version_check(package_name, level="UserWarning", ignore_not_installed=False)
|
|
|
110
107
|
|
|
111
108
|
try:
|
|
112
109
|
from numba import jit
|
|
110
|
+
|
|
113
111
|
try:
|
|
114
112
|
version_check("numba")
|
|
115
113
|
NUMBA_INSTALLED = True
|
|
@@ -119,6 +117,7 @@ try:
|
|
|
119
117
|
NUMBA_INSTALLED = False
|
|
120
118
|
except ImportError:
|
|
121
119
|
from .pf.no_numba import jit
|
|
120
|
+
|
|
122
121
|
NUMBA_INSTALLED = False
|
|
123
122
|
|
|
124
123
|
|
|
@@ -318,7 +317,7 @@ class pandapowerNet(ADict):
|
|
|
318
317
|
for key in self:
|
|
319
318
|
if isinstance(self[key], list):
|
|
320
319
|
self[key] = pd.DataFrame(np.zeros(0, dtype=self[key]), index=pd.Index([],
|
|
321
|
-
|
|
320
|
+
dtype=np.int64))
|
|
322
321
|
|
|
323
322
|
@deprecated("Use copy.deepcopy(net) instead of net.deepcopy()")
|
|
324
323
|
def deepcopy(self):
|
|
@@ -349,7 +348,7 @@ class pandapowerNet(ADict):
|
|
|
349
348
|
if len(res):
|
|
350
349
|
res = [" and the following results tables:"] + res
|
|
351
350
|
lines = ["This pandapower network includes the following parameter tables:"] + \
|
|
352
|
-
|
|
351
|
+
par + res + res_cost
|
|
353
352
|
return "\n".join(lines)
|
|
354
353
|
|
|
355
354
|
|
|
@@ -359,6 +358,7 @@ class GeoAccessor:
|
|
|
359
358
|
pandas Series accessor for the geo column. It facilitates the use of geojson strings.
|
|
360
359
|
NaN entrys are dropped using the accessor!
|
|
361
360
|
"""
|
|
361
|
+
|
|
362
362
|
def __init__(self, pandas_obj):
|
|
363
363
|
self._validate(pandas_obj)
|
|
364
364
|
self._obj = pandas_obj
|
|
@@ -426,6 +426,7 @@ class GeoAccessor:
|
|
|
426
426
|
if callable(geoms_item):
|
|
427
427
|
def wrapper(*args, **kwargs):
|
|
428
428
|
return geoms_item(*args, **kwargs)
|
|
429
|
+
|
|
429
430
|
return wrapper
|
|
430
431
|
else:
|
|
431
432
|
return geoms_item
|
|
@@ -436,7 +437,6 @@ def plural_s(number):
|
|
|
436
437
|
return "" if number == 1 else "s"
|
|
437
438
|
|
|
438
439
|
|
|
439
|
-
|
|
440
440
|
def ets_to_element_types(ets=None):
|
|
441
441
|
ser = pd.Series(["bus", "line", "trafo", "trafo3w", "impedance"],
|
|
442
442
|
index=["b", "l", "t", "t3", "i"])
|
|
@@ -772,7 +772,7 @@ def _write_to_object_attribute(net, element, index, variable, values):
|
|
|
772
772
|
def _set_isolated_nodes_out_of_service(ppc, bus_not_reachable, dc=False):
|
|
773
773
|
isolated_nodes = np.where(bus_not_reachable)[0]
|
|
774
774
|
if len(isolated_nodes) > 0:
|
|
775
|
-
logger.debug("There are isolated buses in the network! (%i nodes in the PPC)"%len(isolated_nodes))
|
|
775
|
+
logger.debug("There are isolated buses in the network! (%i nodes in the PPC)" % len(isolated_nodes))
|
|
776
776
|
# set buses in ppc out of service
|
|
777
777
|
if dc:
|
|
778
778
|
ppc['bus_dc'][isolated_nodes, DC_BUS_TYPE] = DC_NONE
|
|
@@ -1059,7 +1059,8 @@ def _select_is_elements_numba(net, isolated_nodes=None, isolated_nodes_dc=None,
|
|
|
1059
1059
|
net._ppc["bus"][vsc_aux_isolated, BUS_TYPE] = NONE
|
|
1060
1060
|
# if there are no in service VSC that define the DC slack node, we must change the DC slack to type P
|
|
1061
1061
|
bus_dc_slack = net._ppc["bus_dc"][:, DC_BUS_TYPE] == DC_REF
|
|
1062
|
-
bus_dc_with_vsc = np.r_[
|
|
1062
|
+
bus_dc_with_vsc = np.r_[
|
|
1063
|
+
net._ppc["vsc"][is_elements["vsc"], VSC_BUS_DC], net._ppc["vsc"][is_elements["vsc"], VSC_INTERNAL_BUS_DC]]
|
|
1063
1064
|
bus_dc_to_change = bus_dc_slack & (~np.isin(net._ppc["bus_dc"][:, DC_BUS_I], bus_dc_with_vsc))
|
|
1064
1065
|
net._ppc["bus_dc"][bus_dc_to_change, DC_BUS_TYPE] = DC_P
|
|
1065
1066
|
|
|
@@ -1245,11 +1246,12 @@ def _set_isolated_buses_out_of_service(net, ppc):
|
|
|
1245
1246
|
# first check if buses are connected to branches
|
|
1246
1247
|
# I don't know why this dance with [X, :][:, [Y, Z]] (instead of [X, [Y, Z]]) is necessary:
|
|
1247
1248
|
disco = np.setxor1d(ppc["bus"][:, BUS_I].astype(np.int64),
|
|
1248
|
-
ppc["branch"][ppc["branch"][:, BR_STATUS] == 1, :][:, [F_BUS,T_BUS]].real.astype(
|
|
1249
|
+
ppc["branch"][ppc["branch"][:, BR_STATUS] == 1, :][:, [F_BUS, T_BUS]].real.astype(
|
|
1250
|
+
np.int64).flatten())
|
|
1249
1251
|
|
|
1250
1252
|
# but also check if they may be the only connection to an ext_grid
|
|
1251
1253
|
net._isolated_buses = np.setdiff1d(disco, ppc['bus'][ppc['bus'][:, BUS_TYPE] == REF,
|
|
1252
|
-
|
|
1254
|
+
BUS_I].real.astype(np.int64))
|
|
1253
1255
|
ppc["bus"][net._isolated_buses, BUS_TYPE] = NONE
|
|
1254
1256
|
|
|
1255
1257
|
# check DC buses - not connected to DC lines and not connected to VSC DC side
|
|
@@ -1260,7 +1262,7 @@ def _set_isolated_buses_out_of_service(net, ppc):
|
|
|
1260
1262
|
|
|
1261
1263
|
# but also check if they may be the only connection to an ext_grid
|
|
1262
1264
|
net._isolated_buses_dc = np.setdiff1d(disco_dc, ppc['bus_dc'][ppc['bus_dc'][:, DC_BUS_TYPE] == REF,
|
|
1263
|
-
|
|
1265
|
+
DC_BUS_I].real.astype(np.int64))
|
|
1264
1266
|
ppc["bus_dc"][net._isolated_buses_dc, DC_BUS_TYPE] = DC_NONE
|
|
1265
1267
|
|
|
1266
1268
|
|
|
@@ -1283,9 +1285,8 @@ def _check_if_numba_is_installed(level="warning"):
|
|
|
1283
1285
|
return NUMBA_INSTALLED
|
|
1284
1286
|
|
|
1285
1287
|
|
|
1286
|
-
|
|
1287
1288
|
def _check_lightsim2grid_compatibility(net, lightsim2grid, voltage_depend_loads, algorithm, distributed_slack, tdpf):
|
|
1288
|
-
"""
|
|
1289
|
+
r"""
|
|
1289
1290
|
Implement some checks to decide whether the package lightsim2grid can be used. These checks are
|
|
1290
1291
|
documentated in :code:`doc\powerflow\ac.rst` The package implements a backend for power flow
|
|
1291
1292
|
calculation in C++ and provides a speed-up. If lightsim2grid
|
|
@@ -1839,7 +1840,6 @@ def _init_rundcopp_options(net, check_connectivity, switch_rx_ratio, delta, traf
|
|
|
1839
1840
|
|
|
1840
1841
|
def _init_runse_options(net, v_start, delta_start, calculate_voltage_angles,
|
|
1841
1842
|
**kwargs):
|
|
1842
|
-
|
|
1843
1843
|
check_connectivity = kwargs.get("check_connectivity", True)
|
|
1844
1844
|
trafo_model = kwargs.get("trafo_model", "t")
|
|
1845
1845
|
trafo3w_losses = kwargs.get("trafo3w_losses", "hv")
|
|
@@ -1852,7 +1852,7 @@ def _init_runse_options(net, v_start, delta_start, calculate_voltage_angles,
|
|
|
1852
1852
|
init_va_degree=delta_start, enforce_q_lims=False, recycle=None,
|
|
1853
1853
|
voltage_depend_loads=False, trafo3w_losses=trafo3w_losses)
|
|
1854
1854
|
_add_pf_options(net, tolerance_mva="1e-8", trafo_loading="power",
|
|
1855
|
-
numba=
|
|
1855
|
+
numba=True, ac=True, algorithm="nr", max_iteration="auto",
|
|
1856
1856
|
only_v_results=False)
|
|
1857
1857
|
|
|
1858
1858
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
|
|
3
|
-
# Copyright (c) 2016-
|
|
3
|
+
# Copyright (c) 2016-2025 by University of Kassel and Fraunhofer Institute for Energy Economics
|
|
4
4
|
# and Energy System Technology (IEE), Kassel. All rights reserved.
|
|
5
5
|
# Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
|
|
6
6
|
|
|
@@ -614,13 +614,14 @@ def _calc_tap_from_dataframe(net, trafo_df):
|
|
|
614
614
|
if f'tap{t}_dependency_table' in trafo_df:
|
|
615
615
|
tap_dependency_table = get_trafo_values(trafo_df, "tap_dependency_table")
|
|
616
616
|
tap_dependency_table = np.array(
|
|
617
|
-
[False if isinstance(x, float) and np.isnan(x) else x for x in
|
|
617
|
+
[False if isinstance(x, float) and np.isnan(x) or x is None else x for x in
|
|
618
|
+
tap_dependency_table])
|
|
618
619
|
else:
|
|
619
620
|
tap_table = np.array([False])
|
|
620
621
|
tap_dependency_table = np.array([False])
|
|
621
622
|
# tap_changer_type = pd.Series(tap_changer_type)
|
|
622
|
-
tap_table = np.logical_and(tap_dependency_table,
|
|
623
|
-
tap_no_table = np.logical_and(~tap_dependency_table,
|
|
623
|
+
tap_table = np.logical_and(tap_dependency_table, tap_changer_type is not None)
|
|
624
|
+
tap_no_table = np.logical_and(~tap_dependency_table, tap_changer_type is not None)
|
|
624
625
|
if any(tap_table):
|
|
625
626
|
id_characteristic_table = get_trafo_values(trafo_df, "id_characteristic_table")
|
|
626
627
|
if np.any(tap_dependency_table & pd.isna(id_characteristic_table)):
|
|
@@ -650,6 +651,17 @@ def _calc_tap_from_dataframe(net, trafo_df):
|
|
|
650
651
|
ratio = [voltage_mapping.get(id_val, 1) for id_val in cleaned_id_characteristic]
|
|
651
652
|
shift = [-shift_mapping.get(id_val, 1) for id_val in cleaned_id_characteristic]
|
|
652
653
|
|
|
654
|
+
if isinstance(trafo_df, dict):
|
|
655
|
+
# Invert ratio and shift if tap_at_star_point is true
|
|
656
|
+
relevant_tap_at_star_point = mask & trafo_df["tap_at_star_point"]
|
|
657
|
+
count_index = 0
|
|
658
|
+
for i in range(len(mask)):
|
|
659
|
+
if relevant_tap_at_star_point[i]:
|
|
660
|
+
ratio[count_index] = 1/ratio[count_index] # Invertieren des Wertes
|
|
661
|
+
shift[count_index] = -shift[count_index]
|
|
662
|
+
if mask[i]: # Increase index if mask[i] is True
|
|
663
|
+
count_index += 1
|
|
664
|
+
|
|
653
665
|
vn[mask] = vn[mask] * ratio
|
|
654
666
|
trafo_shift[mask] += shift
|
|
655
667
|
if any(tap_no_table):
|
|
@@ -1386,7 +1398,8 @@ def _trafo_df_from_trafo3w(net, sequence=1):
|
|
|
1386
1398
|
trafo2["vn_lv_kv"] = {side: t3["vn_%s_kv" % side].values for side in sides}
|
|
1387
1399
|
trafo2["shift_degree"] = {"hv": np.zeros(nr_trafos), "mv": t3.shift_mv_degree.values,
|
|
1388
1400
|
"lv": t3.shift_lv_degree.values}
|
|
1389
|
-
for param in ["tap_changer_type", "tap_dependency_table", "id_characteristic_table",
|
|
1401
|
+
for param in ["tap_changer_type", "tap_dependency_table", "id_characteristic_table",
|
|
1402
|
+
"tap_phase_shifter", "tap_at_star_point"]:
|
|
1390
1403
|
if param in t3:
|
|
1391
1404
|
trafo2[param] = {side: t3[param] for side in sides}
|
|
1392
1405
|
trafo2["parallel"] = {side: np.ones(nr_trafos) for side in sides}
|
|
@@ -1506,7 +1519,7 @@ def _calculate_3w_tap_changers(t3, t2, sides):
|
|
|
1506
1519
|
tap_arrays["tap_side"][side][tap_mask] = "hv" if side == "hv" else "lv"
|
|
1507
1520
|
|
|
1508
1521
|
# t3 trafos with tap changer at star points
|
|
1509
|
-
if any_at_star_point & np.any(mask_star_point := (tap_mask & at_star_point)):
|
|
1522
|
+
if any_at_star_point & np.any(mask_star_point := (tap_mask & at_star_point)):
|
|
1510
1523
|
t = (tap_arrays["tap_step_percent"][side][mask_star_point] *
|
|
1511
1524
|
np.exp(1j * np.deg2rad(tap_arrays["tap_step_degree"][side][mask_star_point])))
|
|
1512
1525
|
tap_pos = tap_arrays["tap_pos"][side][mask_star_point]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
import warnings
|
|
3
|
-
# Copyright (c) 2016-
|
|
3
|
+
# Copyright (c) 2016-2025 by University of Kassel and Fraunhofer Institute for Energy Economics
|
|
4
4
|
# and Energy System Technology (IEE), Kassel. All rights reserved.
|
|
5
5
|
|
|
6
6
|
|
|
@@ -216,7 +216,7 @@ def create_bus_lookup_numpy(net, bus_index, closed_bb_switch_mask):
|
|
|
216
216
|
if nr_pv_bus > 0:
|
|
217
217
|
# one pv bus. Get bus from pv_buses_in_set
|
|
218
218
|
ref_bus = pv_buses_in_set.pop()
|
|
219
|
-
else:
|
|
219
|
+
else:
|
|
220
220
|
if nr_active_bus > 0:
|
|
221
221
|
# no pv bus but another active bus. Get bus from active_buses_in_set
|
|
222
222
|
ref_bus = active_buses_in_set.pop()
|
|
@@ -224,11 +224,10 @@ def create_bus_lookup_numpy(net, bus_index, closed_bb_switch_mask):
|
|
|
224
224
|
# neither pv buses nor active buses. Use any bus in dj
|
|
225
225
|
ref_bus = dj.pop()
|
|
226
226
|
map_to = bus_lookup[ref_bus]
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
merged_bus[bus] = 1
|
|
227
|
+
dj = list(dj)
|
|
228
|
+
bus_lookup[dj] = map_to
|
|
229
|
+
merged_bus[dj] = 1
|
|
230
|
+
merged_bus[ref_bus] = 0
|
|
232
231
|
else:
|
|
233
232
|
# no PV buses in set
|
|
234
233
|
for dj in disjoint_sets:
|
|
@@ -241,11 +240,10 @@ def create_bus_lookup_numpy(net, bus_index, closed_bb_switch_mask):
|
|
|
241
240
|
# neither pv buses nor active busese. Use any bus in dj
|
|
242
241
|
ref_bus = dj.pop()
|
|
243
242
|
map_to = bus_lookup[ref_bus]
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
merged_bus[bus] = 1
|
|
243
|
+
dj = list(dj)
|
|
244
|
+
bus_lookup[dj] = map_to
|
|
245
|
+
merged_bus[dj] = 1
|
|
246
|
+
merged_bus[ref_bus] = 0
|
|
249
247
|
return bus_lookup, merged_bus
|
|
250
248
|
|
|
251
249
|
|
|
@@ -694,6 +692,9 @@ def _calc_shunts_and_add_on_ppc(net, ppc):
|
|
|
694
692
|
s = net["shunt"]
|
|
695
693
|
if len(s) > 0:
|
|
696
694
|
vl = _is_elements["shunt"]
|
|
695
|
+
# fill missing vn_kv values in shunt table with rated voltage of connected bus
|
|
696
|
+
idx_s_vnkv_isnan = s.loc[np.isnan(s.vn_kv)].index
|
|
697
|
+
s.loc[idx_s_vnkv_isnan, "vn_kv"] = net.bus.loc[s.bus[idx_s_vnkv_isnan].values, "vn_kv"].values
|
|
697
698
|
v_ratio = (ppc["bus"][bus_lookup[s["bus"].values], BASE_KV] / s["vn_kv"].values) ** 2 * base_multiplier
|
|
698
699
|
|
|
699
700
|
if "step_dependency_table" in s:
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
|
|
3
|
-
# Copyright (c) 2016-
|
|
3
|
+
# Copyright (c) 2016-2025 by University of Kassel and Fraunhofer Institute for Energy Economics
|
|
4
4
|
# and Energy System Technology (IEE), Kassel. All rights reserved.
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
import numpy as np
|
|
8
|
+
import pandas as pd
|
|
8
9
|
|
|
9
10
|
from pandapower.pf.ppci_variables import bustypes
|
|
10
11
|
from pandapower.pypower.bustypes import bustypes_dc
|
|
@@ -17,10 +18,7 @@ from pandapower.pypower.idx_ssc import SSC_BUS, SSC_SET_VM_PU, SSC_CONTROLLABLE
|
|
|
17
18
|
from pandapower.pypower.idx_vsc import VSC_MODE_AC, VSC_BUS, VSC_VALUE_AC, VSC_CONTROLLABLE, VSC_MODE_AC_V, \
|
|
18
19
|
VSC_MODE_AC_SL
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
import pandaplan.core.pplog as logging
|
|
22
|
-
except ImportError:
|
|
23
|
-
import logging
|
|
21
|
+
import logging
|
|
24
22
|
|
|
25
23
|
logger = logging.getLogger(__name__)
|
|
26
24
|
|
|
@@ -28,7 +26,7 @@ logger = logging.getLogger(__name__)
|
|
|
28
26
|
def _build_gen_ppc(net, ppc):
|
|
29
27
|
'''
|
|
30
28
|
Takes the empty ppc network and fills it with the gen values. The gen
|
|
31
|
-
datatype will be
|
|
29
|
+
datatype will be floated afterwards.
|
|
32
30
|
|
|
33
31
|
**INPUT**:
|
|
34
32
|
**net** -The pandapower format network
|
|
@@ -188,7 +186,7 @@ def _enforce_controllable_vm_pu_p_mw(net, ppc, gen_is, f, t):
|
|
|
188
186
|
controllable = net["gen"]["controllable"].values[gen_is]
|
|
189
187
|
not_controllable = ~controllable.astype(bool)
|
|
190
188
|
|
|
191
|
-
# if there are some non
|
|
189
|
+
# if there are some non-controllable gens -> set vm_pu and p_mw fixed
|
|
192
190
|
if np.any(not_controllable):
|
|
193
191
|
bus = net["gen"]["bus"].values[not_controllable]
|
|
194
192
|
vm_pu = net["gen"]["vm_pu"].values[not_controllable]
|
|
@@ -286,6 +284,11 @@ def add_q_constraints(net, element, is_element, ppc, f, t, delta, inverted=False
|
|
|
286
284
|
else:
|
|
287
285
|
ppc["gen"][f:t, QMAX] = tab["max_q_mvar"].values[is_element] + delta
|
|
288
286
|
|
|
287
|
+
# Add qmin and qmax limit from q_capability_curve_characteristic
|
|
288
|
+
if "q_capability_curve_characteristic" in net.keys() and net._options["enforce_q_lims"]:
|
|
289
|
+
_calculate_qmin_qmax_from_q_capability_curve_characteristics(net, element, is_element, ppc, f, t, delta,
|
|
290
|
+
inverted)
|
|
291
|
+
|
|
289
292
|
|
|
290
293
|
def add_p_constraints(net, element, is_element, ppc, f, t, delta, inverted=False):
|
|
291
294
|
tab = net[element]
|
|
@@ -400,7 +403,8 @@ def _gen_xward_mask(net, ppc):
|
|
|
400
403
|
|
|
401
404
|
|
|
402
405
|
def _get_xward_pq_buses(net, ppc):
|
|
403
|
-
# find the PQ and PV buses of the xwards; in build_branch.py the F_BUS is set to the PQ bus and T_BUS is set to
|
|
406
|
+
# find the PQ and PV buses of the xwards; in build_branch.py the F_BUS is set to the PQ bus and T_BUS is set to
|
|
407
|
+
# the auxiliary PV bus
|
|
404
408
|
ft = net["_pd2ppc_lookups"].get('branch', dict()).get("xward", [])
|
|
405
409
|
if len(ft) > 0:
|
|
406
410
|
f, t = ft
|
|
@@ -414,14 +418,14 @@ def _get_xward_pq_buses(net, ppc):
|
|
|
414
418
|
|
|
415
419
|
|
|
416
420
|
def _normalise_slack_weights(ppc, gen_mask, xward_mask, xward_pq_buses):
|
|
417
|
-
"""Unitise the slack contribution factors
|
|
421
|
+
"""Unitise the slack contribution factors on each island to sum to 1."""
|
|
418
422
|
subnets = _subnetworks(ppc)
|
|
419
423
|
gen_buses = ppc['gen'][gen_mask, GEN_BUS].astype(np.int64)
|
|
420
424
|
|
|
421
425
|
# it is possible that xward and gen are at the same bus (but not reasonable)
|
|
422
426
|
if len(np.intersect1d(gen_buses, xward_pq_buses)):
|
|
423
|
-
raise NotImplementedError("Found some of the xward PQ buses with slack weight > 0 that coincide with PV or
|
|
424
|
-
"This configuration is not supported.")
|
|
427
|
+
raise NotImplementedError("Found some of the xward PQ buses with slack weight > 0 that coincide with PV or "
|
|
428
|
+
"SL buses. This configuration is not supported.")
|
|
425
429
|
|
|
426
430
|
gen_buses = np.r_[gen_buses, xward_pq_buses]
|
|
427
431
|
slack_weights_gen = np.r_[ppc['gen'][gen_mask, SL_FAC], ppc['gen'][xward_mask, SL_FAC]].astype(np.float64)
|
|
@@ -447,11 +451,50 @@ def _normalise_slack_weights(ppc, gen_mask, xward_mask, xward_pq_buses):
|
|
|
447
451
|
else:
|
|
448
452
|
# ppc['gen'][subnet_gen_mask, SL_FAC] /= sum_slack_weights
|
|
449
453
|
slack_weights_gen /= sum_slack_weights
|
|
450
|
-
buses, slack_weights_bus, _ = _sum_by_group(gen_buses[subnet_gen_mask], slack_weights_gen[subnet_gen_mask],
|
|
454
|
+
buses, slack_weights_bus, _ = _sum_by_group(gen_buses[subnet_gen_mask], slack_weights_gen[subnet_gen_mask],
|
|
451
455
|
slack_weights_gen[subnet_gen_mask])
|
|
452
456
|
ppc['bus'][buses, SL_FAC_BUS] = slack_weights_bus
|
|
453
457
|
|
|
454
458
|
# raise NotImplementedError if there are several separate zones for distributed slack:
|
|
455
459
|
if not np.isclose(sum(ppc['bus'][:, SL_FAC_BUS]), 1):
|
|
456
|
-
raise NotImplementedError("Distributed slack calculation is not implemented for several separate zones at once,
|
|
460
|
+
raise NotImplementedError("Distributed slack calculation is not implemented for several separate zones at once,"
|
|
457
461
|
"please calculate the zones separately.")
|
|
462
|
+
|
|
463
|
+
|
|
464
|
+
def _calculate_qmin_qmax_from_q_capability_curve_characteristics(net, element, is_element, ppc, f, t, delta, inverted):
|
|
465
|
+
if element not in ["gen", "sgen"]:
|
|
466
|
+
logger.warning(f"The given element type is not valid for q_min and q_max reactive power capability calculation "
|
|
467
|
+
f"of the {element}. Please give gen or sgen as an argument of the function")
|
|
468
|
+
return
|
|
469
|
+
|
|
470
|
+
if len(net[element]) == 0:
|
|
471
|
+
logger.warning(f"No. of {element} elements is zero.")
|
|
472
|
+
return
|
|
473
|
+
|
|
474
|
+
# Filter rows with True 'reactive_capability_curve'
|
|
475
|
+
element_data = net[element].loc[net[element]['reactive_capability_curve'].fillna(False)]
|
|
476
|
+
|
|
477
|
+
if len(element_data) > 0:
|
|
478
|
+
# Extract the relevant data
|
|
479
|
+
q_table_ids = element_data['id_q_capability_curve_characteristic']
|
|
480
|
+
p_mw_values = element_data['p_mw']
|
|
481
|
+
|
|
482
|
+
# Retrieve the q_max and q_min characteristic functions as vectorized callables
|
|
483
|
+
q_max_funcs = net.q_capability_curve_characteristic.loc[q_table_ids, 'q_max_characteristic']
|
|
484
|
+
q_min_funcs = net.q_capability_curve_characteristic.loc[q_table_ids, 'q_min_characteristic']
|
|
485
|
+
|
|
486
|
+
# Vectorized function application using NumPy
|
|
487
|
+
calc_q_max = np.vectorize(lambda func, p: func(p))(q_max_funcs, p_mw_values)
|
|
488
|
+
calc_q_min = np.vectorize(lambda func, p: func(p))(q_min_funcs, p_mw_values)
|
|
489
|
+
|
|
490
|
+
if np.any(pd.isna(calc_q_min)) or np.any(pd.isna(calc_q_max)):
|
|
491
|
+
logger.warning(f"The reactive_capability_curve of {element} is True, but the relevant "
|
|
492
|
+
f"characteristic value is None. So default Q limit value has been used in the load flow.")
|
|
493
|
+
|
|
494
|
+
curve_q = net[element][["min_q_mvar", "max_q_mvar"]]
|
|
495
|
+
curve_q.loc[element_data.index] = np.column_stack((calc_q_min, calc_q_max))
|
|
496
|
+
sign = (1 - 2 * inverted)
|
|
497
|
+
ppc["gen"][f:t, [QMIN, QMAX]] = sign * curve_q.values[is_element] - (sign * delta)
|
|
498
|
+
else:
|
|
499
|
+
logger.warning(f"One of {element}(s) id characteristic or curve style of {element} is incorrect "
|
|
500
|
+
f"or not available even if the q_capability_curve_table is available.")
|
|
@@ -9,16 +9,9 @@ import pandas as pd
|
|
|
9
9
|
import warnings
|
|
10
10
|
from packaging.version import Version
|
|
11
11
|
|
|
12
|
-
import
|
|
13
|
-
|
|
14
|
-
try:
|
|
15
|
-
import pandaplan.core.pplog as logging
|
|
16
|
-
except ImportError:
|
|
17
|
-
import logging
|
|
12
|
+
import logging
|
|
18
13
|
|
|
19
14
|
logger = logging.getLogger(__name__)
|
|
20
|
-
|
|
21
|
-
|
|
22
15
|
try:
|
|
23
16
|
import lightsim2grid
|
|
24
17
|
v = Version(lightsim2grid.__version__)
|
|
@@ -41,9 +34,11 @@ try:
|
|
|
41
34
|
except ImportError:
|
|
42
35
|
KLU_solver_available = False
|
|
43
36
|
|
|
37
|
+
from pandapower.run import runpp
|
|
38
|
+
|
|
44
39
|
|
|
45
40
|
def run_contingency(net, nminus1_cases, pf_options=None, pf_options_nminus1=None, write_to_net=True,
|
|
46
|
-
contingency_evaluation_function=
|
|
41
|
+
contingency_evaluation_function=runpp, **kwargs):
|
|
47
42
|
"""
|
|
48
43
|
Obtain either loading (N-0) or max. loading (N-0 and all N-1 cases), and min/max bus voltage magnitude.
|
|
49
44
|
The variable "temperature_degree_celsius" can be used in addition to "loading_percent" to obtain max. temperature.
|
|
@@ -141,7 +136,7 @@ def run_contingency(net, nminus1_cases, pf_options=None, pf_options_nminus1=None
|
|
|
141
136
|
return contingency_results
|
|
142
137
|
|
|
143
138
|
|
|
144
|
-
def run_contingency_ls2g(net, nminus1_cases, contingency_evaluation_function=
|
|
139
|
+
def run_contingency_ls2g(net, nminus1_cases, contingency_evaluation_function=runpp, **kwargs):
|
|
145
140
|
"""
|
|
146
141
|
Execute contingency analysis using the lightsim2grid library. This works much faster than using
|
|
147
142
|
pandapower.
|
|
@@ -1,23 +1,25 @@
|
|
|
1
|
-
from pandapower.auxiliary import ControllerNotConverged
|
|
2
|
-
|
|
3
1
|
import pandapower.control.basic_controller
|
|
4
2
|
import pandapower.control.controller
|
|
5
|
-
|
|
3
|
+
from pandapower.control.controller.DERController.der_control import DERController
|
|
4
|
+
from pandapower.control.controller.characteristic_control import CharacteristicControl
|
|
6
5
|
# --- Controller ---
|
|
7
6
|
from pandapower.control.controller.const_control import ConstControl
|
|
8
7
|
from pandapower.control.controller.pq_control import PQController
|
|
9
|
-
from pandapower.control.controller.
|
|
8
|
+
from pandapower.control.controller.shunt_control import DiscreteShuntController
|
|
9
|
+
from pandapower.control.controller.station_control import BinarySearchControl, DroopControl
|
|
10
10
|
from pandapower.control.controller.trafo.ContinuousTapControl import ContinuousTapControl
|
|
11
11
|
from pandapower.control.controller.trafo.DiscreteTapControl import DiscreteTapControl
|
|
12
|
-
from pandapower.control.controller.trafo.VmSetTapControl import VmSetTapControl
|
|
13
12
|
from pandapower.control.controller.trafo.TapDependentImpedance import TapDependentImpedance
|
|
13
|
+
from pandapower.control.controller.trafo.VmSetTapControl import VmSetTapControl
|
|
14
14
|
from pandapower.control.controller.trafo_control import TrafoController
|
|
15
|
-
from pandapower.control.controller.station_control import BinarySearchControl, DroopControl
|
|
16
|
-
from pandapower.control.controller.DERController.der_control import DERController
|
|
17
|
-
from pandapower.control.controller.shunt_control import DiscreteShuntController
|
|
18
|
-
|
|
19
15
|
# --- Other ---
|
|
20
16
|
from pandapower.control.run_control import *
|
|
17
|
+
from pandapower.control.util.auxiliary import (
|
|
18
|
+
get_controller_index,
|
|
19
|
+
plot_characteristic,
|
|
20
|
+
_create_trafo_characteristics,
|
|
21
|
+
create_trafo_characteristic_object,
|
|
22
|
+
create_q_capability_curve_characteristics_object
|
|
23
|
+
)
|
|
21
24
|
from pandapower.control.util.characteristic import Characteristic, SplineCharacteristic
|
|
22
|
-
from pandapower.control.util.
|
|
23
|
-
create_trafo_characteristic_object)
|
|
25
|
+
from pandapower.control.util.diagnostic import control_diagnostic, trafo_characteristic_table_diagnostic
|