pandapower 3.0.0.dev2__tar.gz → 3.1.1__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.1}/AUTHORS +9 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/LICENSE +7 -7
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/PKG-INFO +5 -32
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/_version.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/auxiliary.py +25 -22
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/build_branch.py +19 -6
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/build_bus.py +5 -2
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/build_gen.py +55 -9
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/contingency/contingency.py +4 -6
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/__init__.py +13 -11
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/basic_controller.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/DERController/DERBasics.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/DERController/PQVAreas.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/DERController/QModels.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/DERController/der_control.py +23 -22
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/DERController/der_control_plot.py +5 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/characteristic_control.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/const_control.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/pq_control.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/trafo/ContinuousTapControl.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/trafo/DiscreteTapControl.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/trafo/TapDependentImpedance.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/trafo/VmSetTapControl.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/trafo_control.py +22 -11
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/run_control.py +4 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/util/auxiliary.py +98 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/util/characteristic.py +3 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/util/diagnostic.py +75 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/convert_format.py +3 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/build_pp_net.py +15 -9
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/convert_measurements.py +6 -7
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/connectivitynodes/connectivityNodesCim16.py +37 -22
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/externalnetworks/externalNetworkInjectionsCim16.py +11 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/generators/energySourcesCim16.py +5 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/generators/synchronousMachinesCim16.py +55 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/lines/acLineSegmentsCim16.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/shunts/linearShuntCompensatorCim16.py +2 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/shunts/staticVarCompensatorCim16.py +2 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/transformers/powerTransformersCim16.py +12 -13
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/from_cim.py +6 -6
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim_classes.py +48 -34
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim_tools.py +3 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/pp_classes.py +7 -6
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/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.1/pandapower/converter/cim/serialized_schemas/CIM16_4.2.9_schema.json +2313 -5994
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/jao/from_jao.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/matpower/from_mpc.py +8 -8
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/matpower/to_mpc.py +5 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/powerfactory/export_pfd_to_pp.py +3 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/powerfactory/main_pf.py +8 -8
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/powerfactory/pp_import_functions.py +535 -355
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/powerfactory/validate.py +12 -9
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/pypower/to_ppc.py +7 -6
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/ucte/from_ucte.py +10 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/ucte/ucte_converter.py +12 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/ucte/ucte_parser.py +14 -2
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/create.py +201 -99
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/diagnostic.py +13 -13
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/diagnostic_reports.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/estimation/algorithm/optimization.py +4 -2
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/estimation/ppc_conversion.py +5 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/estimation/util.py +10 -9
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/file_io.py +44 -34
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/grid_equivalents/auxiliary.py +107 -100
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/grid_equivalents/get_equivalent.py +51 -49
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/grid_equivalents/rei_generation.py +114 -107
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/grid_equivalents/toolbox.py +28 -25
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/grid_equivalents/ward_generation.py +76 -79
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/groups.py +25 -25
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/io_utils.py +9 -8
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/IEEE_European_LV_Off_Peak_1.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/IEEE_European_LV_Off_Peak_1440.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/IEEE_European_LV_On_Peak_566.json +165 -16
- pandapower-3.1.1/pandapower/networks/cigre_networks.py +468 -0
- pandapower-3.1.1/pandapower/networks/create_examples.py +408 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/dickert_lv_networks.py +60 -57
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/ieee_europen_lv_asymmetric.py +11 -11
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/kerber_extreme_networks.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/kerber_networks.py +24 -22
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/lv_schutterwald.json +140 -10
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/lv_schutterwald.py +18 -17
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/mv_oberrhein.json +152 -14
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/mv_oberrhein.py +22 -20
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/mv_oberrhein_substations.json +152 -14
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/GBnetwork.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/GBreducednetwork.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case118.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case11_iwamoto.json +166 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case1354pegase.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case14.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case145.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case1888rte.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case24_ieee_rts.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case2848rte.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case2869pegase.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case30.json +165 -15
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case300.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case3120sp.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case33bw.json +165 -15
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case39.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case4gs.json +165 -15
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case5.json +165 -15
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case57.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case5_demo_gridcal.json +166 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case6470rte.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case6495rte.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case6515rte.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case6ww.json +165 -15
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case89pegase.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case9.json +165 -15
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case9241pegase.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case_ieee30.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/case_illinois200.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_case_jsons/iceland.json +165 -16
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/power_system_test_cases.py +86 -114
- pandapower-3.1.1/pandapower/networks/simple_pandapower_test_networks.py +190 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/synthetic_voltage_control_lv_networks.py +59 -58
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/opf/make_objective.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/optimal_powerflow.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pd2ppc.py +49 -46
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pd2ppc_zero.py +5 -6
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pf/__init__.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pf/create_jacobian.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pf/create_jacobian_facts.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pf/create_jacobian_numba.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pf/create_jacobian_tdpf.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pf/dSbus_dV_numba.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pf/iwamoto_multiplier.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pf/makeYbus_facts.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pf/makeYbus_numba.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pf/no_numba.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pf/pfsoln_numba.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pf/ppci_variables.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pf/run_bfswpf.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pf/run_dc_pf.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pf/run_newton_raphson_pf.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pf/runpf_pypower.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pf/runpp_3ph.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/plotting/collections.py +71 -56
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/plotting/generic_geodata.py +6 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/plotting/geo.py +22 -14
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/plotting/plotly/mapbox_plot.py +2 -2
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/plotting/plotly/traces.py +16 -7
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/plotting/powerflow_results.py +8 -7
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/plotting/simple_plot.py +4 -2
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/powerflow.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/protection/basic_protection_device.py +2 -2
- pandapower-3.1.1/pandapower/protection/example_grids.py +129 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/protection/protection_devices/ocrelay.py +3 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/protection/run_protection.py +0 -2
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/protection/utility_functions.py +61 -56
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/bustypes.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/dSbus_dV.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/dcpf.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/idx_brch.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/idx_brch_sc.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/idx_brch_tdpf.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/idx_bus.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/idx_bus_sc.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/idx_ssc.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/idx_svc.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/idx_tcsc.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/makeBdc.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/makeLODF.py +3 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/makePTDF.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/makeYbus.py +2 -2
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/newtonpf.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/opf.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/opf_execute.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/opf_hessfcn.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/opf_setup.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/pfsoln.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/pips.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/pipsopf_solver.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/results.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/results_branch.py +3 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/results_bus.py +19 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/results_gen.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/run.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/runpm.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/shortcircuit/calc_sc.py +20 -20
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/shortcircuit/toolbox.py +9 -9
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/sql_io.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/std_types.py +6 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/timeseries/output_writer.py +7 -4
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/timeseries/run_time_series.py +11 -7
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/timeseries/ts_runpp.py +29 -23
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/toolbox/data_modification.py +18 -15
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/toolbox/element_selection.py +37 -34
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/toolbox/grid_modification.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/toolbox/power_factor.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/toolbox/result_info.py +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/topology/create_graph.py +6 -5
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/topology/graph_searches.py +22 -31
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower.egg-info/PKG-INFO +5 -32
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower.egg-info/SOURCES.txt +1 -3
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower.egg-info/requires.txt +1 -1
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pyproject.toml +5 -14
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/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/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.1}/README.rst +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/contingency/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/DERController/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/shunt_control.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/station_control.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/trafo/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/util/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/connectivitynodes/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/coordinates/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/coordinates/coordinatesFromDLCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/coordinates/geoCoordinatesFromGLCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/externalnetworks/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/generators/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/generators/asynchronousMachinesCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/impedance/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/impedance/equivalentBranchesCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/impedance/seriesCompensatorsCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/lines/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/lines/dcLineSegmentsCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/loads/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/loads/conformLoadsCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/loads/energyConcumersCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/loads/nonConformLoadsCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/loads/stationSuppliesCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/shunts/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/shunts/nonLinearShuntCompensatorCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/switches/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/switches/switchesCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/transformers/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/transformers/tapController.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/wards/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/cim2pp/converter_classes/wards/equivalentInjectionsCim16.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/interfaces.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/other_classes.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/cim/serialized_schemas/CIM100_4.0.10_schema.json +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/jao/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/matpower/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/pandamodels/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/pandamodels/from_pm.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/pandamodels/to_pm.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/powerfactory/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/powerfactory/echo_off.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/powerfactory/gui.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/powerfactory/logger_setup.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/powerfactory/pf_export_functions.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/powerfactory/run_import.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/pypower/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/pypower/from_ppc.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/converter/ucte/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/estimation/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/estimation/algorithm/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/estimation/algorithm/base.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/estimation/algorithm/estimator.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/estimation/algorithm/lp.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/estimation/algorithm/matrix_base.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/estimation/idx_brch.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/estimation/idx_bus.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/estimation/results.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/estimation/state_estimation.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/grid_equivalents/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/networks/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/opf/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/opf/pm_storage.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/opf/run_pandamodels.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/opf/validate_opf_input.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/plotting/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/plotting/colormaps.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/plotting/patch_makers.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/plotting/plotly/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/plotting/plotly/get_colors.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/plotting/plotly/pf_res_plotly.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/plotting/plotly/simple_plotly.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/plotting/plotly/vlevel_plotly.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/plotting/plotting_toolbox.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/plotting/to_html.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/protection/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/protection/protection_devices/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/protection/protection_devices/fuse.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/_compat.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/add_userfcn.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/d2AIbr_dV2.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/d2ASbr_dV2.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/d2Ibr_dV2.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/d2Sbr_dV2.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/d2Sbus_dV2.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/dAbr_dV.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/dIbr_dV.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/dSbr_dV.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/dcopf_solver.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/fdpf.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/gausspf.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/hasPQcap.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/idx_area.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/idx_brch_dc.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/idx_bus_dc.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/idx_cost.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/idx_gen.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/idx_vsc.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/isload.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/makeAang.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/makeApq.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/makeAvl.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/makeAy.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/makeB.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/makeSbus.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/opf_args.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/opf_consfcn.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/opf_costfcn.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/opf_model.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/pipsver.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/polycost.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/ppoption.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/ppver.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/pqcost.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/printpf.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/qps_pips.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/qps_pypower.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/run_userfcn.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/totcost.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/update_mupq.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/pypower/util.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/shortcircuit/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/shortcircuit/currents.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/shortcircuit/impedance.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/shortcircuit/kappa.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/shortcircuit/ppc_conversion.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/shortcircuit/results.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/timeseries/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/timeseries/data_source.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/timeseries/data_sources/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/timeseries/data_sources/frame_data.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/timeseries/read_batch_results.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/toolbox/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/toolbox/comparison.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/topology/__init__.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/topology/graph_tool_interface.py +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower.egg-info/dependency_links.txt +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower.egg-info/top_level.txt +0 -0
- {pandapower-3.0.0.dev2 → pandapower-3.1.1}/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.1
|
|
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,33 +27,33 @@
|
|
|
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
|
|
@@ -64,6 +64,7 @@ except ImportError:
|
|
|
64
64
|
try:
|
|
65
65
|
from geopandas import GeoSeries
|
|
66
66
|
from shapely import from_geojson
|
|
67
|
+
|
|
67
68
|
geopandas_available = True
|
|
68
69
|
except ImportError:
|
|
69
70
|
geopandas_available = False
|
|
@@ -87,10 +88,9 @@ def log_to_level(msg, passed_logger, level):
|
|
|
87
88
|
|
|
88
89
|
|
|
89
90
|
def version_check(package_name, level="UserWarning", ignore_not_installed=False):
|
|
90
|
-
|
|
91
91
|
minimum_version = {'plotly': "3.1.1",
|
|
92
92
|
'numba': "0.25",
|
|
93
|
-
|
|
93
|
+
}
|
|
94
94
|
if ignore_not_installed and package_name not in minimum_version.keys():
|
|
95
95
|
return
|
|
96
96
|
|
|
@@ -110,6 +110,7 @@ def version_check(package_name, level="UserWarning", ignore_not_installed=False)
|
|
|
110
110
|
|
|
111
111
|
try:
|
|
112
112
|
from numba import jit
|
|
113
|
+
|
|
113
114
|
try:
|
|
114
115
|
version_check("numba")
|
|
115
116
|
NUMBA_INSTALLED = True
|
|
@@ -119,6 +120,7 @@ try:
|
|
|
119
120
|
NUMBA_INSTALLED = False
|
|
120
121
|
except ImportError:
|
|
121
122
|
from .pf.no_numba import jit
|
|
123
|
+
|
|
122
124
|
NUMBA_INSTALLED = False
|
|
123
125
|
|
|
124
126
|
|
|
@@ -318,7 +320,7 @@ class pandapowerNet(ADict):
|
|
|
318
320
|
for key in self:
|
|
319
321
|
if isinstance(self[key], list):
|
|
320
322
|
self[key] = pd.DataFrame(np.zeros(0, dtype=self[key]), index=pd.Index([],
|
|
321
|
-
|
|
323
|
+
dtype=np.int64))
|
|
322
324
|
|
|
323
325
|
@deprecated("Use copy.deepcopy(net) instead of net.deepcopy()")
|
|
324
326
|
def deepcopy(self):
|
|
@@ -349,7 +351,7 @@ class pandapowerNet(ADict):
|
|
|
349
351
|
if len(res):
|
|
350
352
|
res = [" and the following results tables:"] + res
|
|
351
353
|
lines = ["This pandapower network includes the following parameter tables:"] + \
|
|
352
|
-
|
|
354
|
+
par + res + res_cost
|
|
353
355
|
return "\n".join(lines)
|
|
354
356
|
|
|
355
357
|
|
|
@@ -359,6 +361,7 @@ class GeoAccessor:
|
|
|
359
361
|
pandas Series accessor for the geo column. It facilitates the use of geojson strings.
|
|
360
362
|
NaN entrys are dropped using the accessor!
|
|
361
363
|
"""
|
|
364
|
+
|
|
362
365
|
def __init__(self, pandas_obj):
|
|
363
366
|
self._validate(pandas_obj)
|
|
364
367
|
self._obj = pandas_obj
|
|
@@ -426,6 +429,7 @@ class GeoAccessor:
|
|
|
426
429
|
if callable(geoms_item):
|
|
427
430
|
def wrapper(*args, **kwargs):
|
|
428
431
|
return geoms_item(*args, **kwargs)
|
|
432
|
+
|
|
429
433
|
return wrapper
|
|
430
434
|
else:
|
|
431
435
|
return geoms_item
|
|
@@ -436,7 +440,6 @@ def plural_s(number):
|
|
|
436
440
|
return "" if number == 1 else "s"
|
|
437
441
|
|
|
438
442
|
|
|
439
|
-
|
|
440
443
|
def ets_to_element_types(ets=None):
|
|
441
444
|
ser = pd.Series(["bus", "line", "trafo", "trafo3w", "impedance"],
|
|
442
445
|
index=["b", "l", "t", "t3", "i"])
|
|
@@ -772,7 +775,7 @@ def _write_to_object_attribute(net, element, index, variable, values):
|
|
|
772
775
|
def _set_isolated_nodes_out_of_service(ppc, bus_not_reachable, dc=False):
|
|
773
776
|
isolated_nodes = np.where(bus_not_reachable)[0]
|
|
774
777
|
if len(isolated_nodes) > 0:
|
|
775
|
-
logger.debug("There are isolated buses in the network! (%i nodes in the PPC)"%len(isolated_nodes))
|
|
778
|
+
logger.debug("There are isolated buses in the network! (%i nodes in the PPC)" % len(isolated_nodes))
|
|
776
779
|
# set buses in ppc out of service
|
|
777
780
|
if dc:
|
|
778
781
|
ppc['bus_dc'][isolated_nodes, DC_BUS_TYPE] = DC_NONE
|
|
@@ -1059,7 +1062,8 @@ def _select_is_elements_numba(net, isolated_nodes=None, isolated_nodes_dc=None,
|
|
|
1059
1062
|
net._ppc["bus"][vsc_aux_isolated, BUS_TYPE] = NONE
|
|
1060
1063
|
# if there are no in service VSC that define the DC slack node, we must change the DC slack to type P
|
|
1061
1064
|
bus_dc_slack = net._ppc["bus_dc"][:, DC_BUS_TYPE] == DC_REF
|
|
1062
|
-
bus_dc_with_vsc = np.r_[
|
|
1065
|
+
bus_dc_with_vsc = np.r_[
|
|
1066
|
+
net._ppc["vsc"][is_elements["vsc"], VSC_BUS_DC], net._ppc["vsc"][is_elements["vsc"], VSC_INTERNAL_BUS_DC]]
|
|
1063
1067
|
bus_dc_to_change = bus_dc_slack & (~np.isin(net._ppc["bus_dc"][:, DC_BUS_I], bus_dc_with_vsc))
|
|
1064
1068
|
net._ppc["bus_dc"][bus_dc_to_change, DC_BUS_TYPE] = DC_P
|
|
1065
1069
|
|
|
@@ -1245,11 +1249,12 @@ def _set_isolated_buses_out_of_service(net, ppc):
|
|
|
1245
1249
|
# first check if buses are connected to branches
|
|
1246
1250
|
# I don't know why this dance with [X, :][:, [Y, Z]] (instead of [X, [Y, Z]]) is necessary:
|
|
1247
1251
|
disco = np.setxor1d(ppc["bus"][:, BUS_I].astype(np.int64),
|
|
1248
|
-
ppc["branch"][ppc["branch"][:, BR_STATUS] == 1, :][:, [F_BUS,T_BUS]].real.astype(
|
|
1252
|
+
ppc["branch"][ppc["branch"][:, BR_STATUS] == 1, :][:, [F_BUS, T_BUS]].real.astype(
|
|
1253
|
+
np.int64).flatten())
|
|
1249
1254
|
|
|
1250
1255
|
# but also check if they may be the only connection to an ext_grid
|
|
1251
1256
|
net._isolated_buses = np.setdiff1d(disco, ppc['bus'][ppc['bus'][:, BUS_TYPE] == REF,
|
|
1252
|
-
|
|
1257
|
+
BUS_I].real.astype(np.int64))
|
|
1253
1258
|
ppc["bus"][net._isolated_buses, BUS_TYPE] = NONE
|
|
1254
1259
|
|
|
1255
1260
|
# check DC buses - not connected to DC lines and not connected to VSC DC side
|
|
@@ -1260,7 +1265,7 @@ def _set_isolated_buses_out_of_service(net, ppc):
|
|
|
1260
1265
|
|
|
1261
1266
|
# but also check if they may be the only connection to an ext_grid
|
|
1262
1267
|
net._isolated_buses_dc = np.setdiff1d(disco_dc, ppc['bus_dc'][ppc['bus_dc'][:, DC_BUS_TYPE] == REF,
|
|
1263
|
-
|
|
1268
|
+
DC_BUS_I].real.astype(np.int64))
|
|
1264
1269
|
ppc["bus_dc"][net._isolated_buses_dc, DC_BUS_TYPE] = DC_NONE
|
|
1265
1270
|
|
|
1266
1271
|
|
|
@@ -1283,9 +1288,8 @@ def _check_if_numba_is_installed(level="warning"):
|
|
|
1283
1288
|
return NUMBA_INSTALLED
|
|
1284
1289
|
|
|
1285
1290
|
|
|
1286
|
-
|
|
1287
1291
|
def _check_lightsim2grid_compatibility(net, lightsim2grid, voltage_depend_loads, algorithm, distributed_slack, tdpf):
|
|
1288
|
-
"""
|
|
1292
|
+
r"""
|
|
1289
1293
|
Implement some checks to decide whether the package lightsim2grid can be used. These checks are
|
|
1290
1294
|
documentated in :code:`doc\powerflow\ac.rst` The package implements a backend for power flow
|
|
1291
1295
|
calculation in C++ and provides a speed-up. If lightsim2grid
|
|
@@ -1839,7 +1843,6 @@ def _init_rundcopp_options(net, check_connectivity, switch_rx_ratio, delta, traf
|
|
|
1839
1843
|
|
|
1840
1844
|
def _init_runse_options(net, v_start, delta_start, calculate_voltage_angles,
|
|
1841
1845
|
**kwargs):
|
|
1842
|
-
|
|
1843
1846
|
check_connectivity = kwargs.get("check_connectivity", True)
|
|
1844
1847
|
trafo_model = kwargs.get("trafo_model", "t")
|
|
1845
1848
|
trafo3w_losses = kwargs.get("trafo3w_losses", "hv")
|
|
@@ -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()
|
|
@@ -694,6 +694,9 @@ def _calc_shunts_and_add_on_ppc(net, ppc):
|
|
|
694
694
|
s = net["shunt"]
|
|
695
695
|
if len(s) > 0:
|
|
696
696
|
vl = _is_elements["shunt"]
|
|
697
|
+
# fill missing vn_kv values in shunt table with rated voltage of connected bus
|
|
698
|
+
idx_s_vnkv_isnan = s.loc[np.isnan(s.vn_kv)].index
|
|
699
|
+
s.loc[idx_s_vnkv_isnan, "vn_kv"] = net.bus.loc[s.bus[idx_s_vnkv_isnan].values, "vn_kv"].values
|
|
697
700
|
v_ratio = (ppc["bus"][bus_lookup[s["bus"].values], BASE_KV] / s["vn_kv"].values) ** 2 * base_multiplier
|
|
698
701
|
|
|
699
702
|
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
|
|
@@ -28,7 +29,7 @@ logger = logging.getLogger(__name__)
|
|
|
28
29
|
def _build_gen_ppc(net, ppc):
|
|
29
30
|
'''
|
|
30
31
|
Takes the empty ppc network and fills it with the gen values. The gen
|
|
31
|
-
datatype will be
|
|
32
|
+
datatype will be floated afterwards.
|
|
32
33
|
|
|
33
34
|
**INPUT**:
|
|
34
35
|
**net** -The pandapower format network
|
|
@@ -188,7 +189,7 @@ def _enforce_controllable_vm_pu_p_mw(net, ppc, gen_is, f, t):
|
|
|
188
189
|
controllable = net["gen"]["controllable"].values[gen_is]
|
|
189
190
|
not_controllable = ~controllable.astype(bool)
|
|
190
191
|
|
|
191
|
-
# if there are some non
|
|
192
|
+
# if there are some non-controllable gens -> set vm_pu and p_mw fixed
|
|
192
193
|
if np.any(not_controllable):
|
|
193
194
|
bus = net["gen"]["bus"].values[not_controllable]
|
|
194
195
|
vm_pu = net["gen"]["vm_pu"].values[not_controllable]
|
|
@@ -286,6 +287,11 @@ def add_q_constraints(net, element, is_element, ppc, f, t, delta, inverted=False
|
|
|
286
287
|
else:
|
|
287
288
|
ppc["gen"][f:t, QMAX] = tab["max_q_mvar"].values[is_element] + delta
|
|
288
289
|
|
|
290
|
+
# Add qmin and qmax limit from q_capability_curve_characteristic
|
|
291
|
+
if "q_capability_curve_characteristic" in net.keys() and net._options["enforce_q_lims"]:
|
|
292
|
+
_calculate_qmin_qmax_from_q_capability_curve_characteristics(net, element, is_element, ppc, f, t, delta,
|
|
293
|
+
inverted)
|
|
294
|
+
|
|
289
295
|
|
|
290
296
|
def add_p_constraints(net, element, is_element, ppc, f, t, delta, inverted=False):
|
|
291
297
|
tab = net[element]
|
|
@@ -400,7 +406,8 @@ def _gen_xward_mask(net, ppc):
|
|
|
400
406
|
|
|
401
407
|
|
|
402
408
|
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
|
|
409
|
+
# 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
|
|
410
|
+
# the auxiliary PV bus
|
|
404
411
|
ft = net["_pd2ppc_lookups"].get('branch', dict()).get("xward", [])
|
|
405
412
|
if len(ft) > 0:
|
|
406
413
|
f, t = ft
|
|
@@ -414,14 +421,14 @@ def _get_xward_pq_buses(net, ppc):
|
|
|
414
421
|
|
|
415
422
|
|
|
416
423
|
def _normalise_slack_weights(ppc, gen_mask, xward_mask, xward_pq_buses):
|
|
417
|
-
"""Unitise the slack contribution factors
|
|
424
|
+
"""Unitise the slack contribution factors on each island to sum to 1."""
|
|
418
425
|
subnets = _subnetworks(ppc)
|
|
419
426
|
gen_buses = ppc['gen'][gen_mask, GEN_BUS].astype(np.int64)
|
|
420
427
|
|
|
421
428
|
# it is possible that xward and gen are at the same bus (but not reasonable)
|
|
422
429
|
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.")
|
|
430
|
+
raise NotImplementedError("Found some of the xward PQ buses with slack weight > 0 that coincide with PV or "
|
|
431
|
+
"SL buses. This configuration is not supported.")
|
|
425
432
|
|
|
426
433
|
gen_buses = np.r_[gen_buses, xward_pq_buses]
|
|
427
434
|
slack_weights_gen = np.r_[ppc['gen'][gen_mask, SL_FAC], ppc['gen'][xward_mask, SL_FAC]].astype(np.float64)
|
|
@@ -447,11 +454,50 @@ def _normalise_slack_weights(ppc, gen_mask, xward_mask, xward_pq_buses):
|
|
|
447
454
|
else:
|
|
448
455
|
# ppc['gen'][subnet_gen_mask, SL_FAC] /= sum_slack_weights
|
|
449
456
|
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],
|
|
457
|
+
buses, slack_weights_bus, _ = _sum_by_group(gen_buses[subnet_gen_mask], slack_weights_gen[subnet_gen_mask],
|
|
451
458
|
slack_weights_gen[subnet_gen_mask])
|
|
452
459
|
ppc['bus'][buses, SL_FAC_BUS] = slack_weights_bus
|
|
453
460
|
|
|
454
461
|
# raise NotImplementedError if there are several separate zones for distributed slack:
|
|
455
462
|
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,
|
|
463
|
+
raise NotImplementedError("Distributed slack calculation is not implemented for several separate zones at once,"
|
|
457
464
|
"please calculate the zones separately.")
|
|
465
|
+
|
|
466
|
+
|
|
467
|
+
def _calculate_qmin_qmax_from_q_capability_curve_characteristics(net, element, is_element, ppc, f, t, delta, inverted):
|
|
468
|
+
if element not in ["gen", "sgen"]:
|
|
469
|
+
logger.warning(f"The given element type is not valid for q_min and q_max reactive power capability calculation "
|
|
470
|
+
f"of the {element}. Please give gen or sgen as an argument of the function")
|
|
471
|
+
return
|
|
472
|
+
|
|
473
|
+
if len(net[element]) == 0:
|
|
474
|
+
logger.warning(f"No. of {element} elements is zero.")
|
|
475
|
+
return
|
|
476
|
+
|
|
477
|
+
# Filter rows with True 'reactive_capability_curve'
|
|
478
|
+
element_data = net[element].loc[net[element]['reactive_capability_curve'].fillna(False)]
|
|
479
|
+
|
|
480
|
+
if len(element_data) > 0:
|
|
481
|
+
# Extract the relevant data
|
|
482
|
+
q_table_ids = element_data['id_q_capability_curve_characteristic']
|
|
483
|
+
p_mw_values = element_data['p_mw']
|
|
484
|
+
|
|
485
|
+
# Retrieve the q_max and q_min characteristic functions as vectorized callables
|
|
486
|
+
q_max_funcs = net.q_capability_curve_characteristic.loc[q_table_ids, 'q_max_characteristic']
|
|
487
|
+
q_min_funcs = net.q_capability_curve_characteristic.loc[q_table_ids, 'q_min_characteristic']
|
|
488
|
+
|
|
489
|
+
# Vectorized function application using NumPy
|
|
490
|
+
calc_q_max = np.vectorize(lambda func, p: func(p))(q_max_funcs, p_mw_values)
|
|
491
|
+
calc_q_min = np.vectorize(lambda func, p: func(p))(q_min_funcs, p_mw_values)
|
|
492
|
+
|
|
493
|
+
if np.any(pd.isna(calc_q_min)) or np.any(pd.isna(calc_q_max)):
|
|
494
|
+
logger.warning(f"The reactive_capability_curve of {element} is True, but the relevant "
|
|
495
|
+
f"characteristic value is None. So default Q limit value has been used in the load flow.")
|
|
496
|
+
|
|
497
|
+
curve_q = net[element][["min_q_mvar", "max_q_mvar"]]
|
|
498
|
+
curve_q.loc[element_data.index] = np.column_stack((calc_q_min, calc_q_max))
|
|
499
|
+
sign = (1 - 2 * inverted)
|
|
500
|
+
ppc["gen"][f:t, [QMIN, QMAX]] = sign * curve_q.values[is_element] - (sign * delta)
|
|
501
|
+
else:
|
|
502
|
+
logger.warning(f"One of {element}(s) id characteristic or curve style of {element} is incorrect "
|
|
503
|
+
f"or not available even if the q_capability_curve_table is available.")
|
|
@@ -9,16 +9,12 @@ import pandas as pd
|
|
|
9
9
|
import warnings
|
|
10
10
|
from packaging.version import Version
|
|
11
11
|
|
|
12
|
-
import pandapower as pp
|
|
13
|
-
|
|
14
12
|
try:
|
|
15
13
|
import pandaplan.core.pplog as logging
|
|
16
14
|
except ImportError:
|
|
17
15
|
import logging
|
|
18
16
|
|
|
19
17
|
logger = logging.getLogger(__name__)
|
|
20
|
-
|
|
21
|
-
|
|
22
18
|
try:
|
|
23
19
|
import lightsim2grid
|
|
24
20
|
v = Version(lightsim2grid.__version__)
|
|
@@ -41,9 +37,11 @@ try:
|
|
|
41
37
|
except ImportError:
|
|
42
38
|
KLU_solver_available = False
|
|
43
39
|
|
|
40
|
+
from pandapower.run import runpp
|
|
41
|
+
|
|
44
42
|
|
|
45
43
|
def run_contingency(net, nminus1_cases, pf_options=None, pf_options_nminus1=None, write_to_net=True,
|
|
46
|
-
contingency_evaluation_function=
|
|
44
|
+
contingency_evaluation_function=runpp, **kwargs):
|
|
47
45
|
"""
|
|
48
46
|
Obtain either loading (N-0) or max. loading (N-0 and all N-1 cases), and min/max bus voltage magnitude.
|
|
49
47
|
The variable "temperature_degree_celsius" can be used in addition to "loading_percent" to obtain max. temperature.
|
|
@@ -141,7 +139,7 @@ def run_contingency(net, nminus1_cases, pf_options=None, pf_options_nminus1=None
|
|
|
141
139
|
return contingency_results
|
|
142
140
|
|
|
143
141
|
|
|
144
|
-
def run_contingency_ls2g(net, nminus1_cases, contingency_evaluation_function=
|
|
142
|
+
def run_contingency_ls2g(net, nminus1_cases, contingency_evaluation_function=runpp, **kwargs):
|
|
145
143
|
"""
|
|
146
144
|
Execute contingency analysis using the lightsim2grid library. This works much faster than using
|
|
147
145
|
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
|
|
@@ -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
|
import copy
|
{pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/DERController/DERBasics.py
RENAMED
|
@@ -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
|
import numpy as np
|
{pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/DERController/PQVAreas.py
RENAMED
|
@@ -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
|
import numpy as np
|
{pandapower-3.0.0.dev2 → pandapower-3.1.1}/pandapower/control/controller/DERController/QModels.py
RENAMED
|
@@ -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
|
import numpy as np
|