diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000000000000000000000000000000000..936f4cdad0e693f7a6c10a8f5ec9febc706b8ad2 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "ppf"] + path = ppf + url = git@git-ce.rwth-aachen.de:sreejith12333/ppf.git diff --git a/examples/quickstart/run_nv_state_estimator.py b/examples/quickstart/run_nv_state_estimator.py index 4b6b11d8a04a072af0118ab68d031af20891099e..f949b97f7cfb93b810afa476e72a98f0ebbcb7ea 100644 --- a/examples/quickstart/run_nv_state_estimator.py +++ b/examples/quickstart/run_nv_state_estimator.py @@ -22,9 +22,9 @@ p = str(this_file_folder)+"/examples/sample_data/areti" xml_path = Path(p) -xml_files = [os.path.join(xml_path, "1.xml"), - os.path.join(xml_path, "2.xml"), - os.path.join(xml_path, "3.xml") +xml_files = [os.path.join(xml_path, "3.xml"), + os.path.join(xml_path, "2.xml"), + os.path.join(xml_path, "1.xml") ] # Read cim files and create new network.System object @@ -38,11 +38,11 @@ results_pf, num_iter_cim = nv_powerflow.solve(system) # --- State Estimation --- """ Write here the percent uncertainties of the measurements""" -V_unc = 30 -I_unc = 20 +V_unc = 0 +I_unc = 0 Sinj_unc = 0 S_unc = 0 -Pmu_mag_unc = 70 +Pmu_mag_unc = 0 Pmu_phase_unc = 0 # Create measurements data structures @@ -62,9 +62,7 @@ state_estimation_results = nv_state_estimator.DsseCall(system, measurements_set) # Print node voltages print("state_estimation_results.voltages: ") for node in state_estimation_results.nodes: - print('{}={}'.format(node.topology_node.uuid, node.voltage)) + print('{}={}'.format(node.topology_node.uuid, node.voltage_pu)) - print(dir(node)) - -for node in state_estimation_results.nodes: - print('{}={}'.format(node.topology_node.type, node.voltage)) \ No newline at end of file + +system.generate_sld(output_file='sld.png') \ No newline at end of file diff --git a/examples/run_nv_powerflow.log b/examples/run_nv_powerflow.log new file mode 100644 index 0000000000000000000000000000000000000000..ef5659e85430b61e92f2d39e310bb5a9adbe869b --- /dev/null +++ b/examples/run_nv_powerflow.log @@ -0,0 +1,83 @@ +INFO:cimpy.cimimport:START of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/areti/1.xml" +INFO:cimpy.cimimport:START of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/areti/2.xml" +INFO:cimpy.cimimport:START of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/areti/3.xml" +INFO:cimpy.cimimport:END of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/areti/1.xml" +INFO:cimpy.cimimport:END of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/areti/2.xml" +INFO:cimpy.cimimport:END of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/areti/3.xml" +WARNING:cimpy.cimimport:Package information not found for class type : 1222 times +WARNING:cimpy.cimimport:Package information not found for class Terminal, attribute ConductingEquipment : 436 times +WARNING:cimpy.cimimport:'Terminal' has not attribute 'ConnectivityNode' : 436 times +WARNING:cimpy.cimimport:Package information not found for class Terminal, attribute name : 436 times +WARNING:cimpy.cimimport:Package information not found for class Terminal, attribute connected : 436 times +WARNING:cimpy.cimimport:Package information not found for class Terminal, attribute sequenceNumber : 436 times +WARNING:cimpy.cimimport:Referenced Terminal [PhaseCode.ABC] object missing. : 436 times +WARNING:cimpy.cimimport:'ConnectivityNode' has not attribute 'name' : 163 times +WARNING:cimpy.cimimport:'ConnectivityNode' has not attribute 'ConnectivityNodeContainer' : 163 times +WARNING:cimpy.cimimport:Package information not found for class Disconnector, attribute name : 112 times +WARNING:cimpy.cimimport:Package information not found for class Disconnector, attribute BaseVoltage : 112 times +WARNING:cimpy.cimimport:Package information not found for class Disconnector, attribute EquipmentContainer : 112 times +WARNING:cimpy.cimimport:Package information not found for class Disconnector, attribute normalOpen : 112 times +WARNING:cimpy.cimimport:Package information not found for class EnergyConsumer, attribute name : 52 times +WARNING:cimpy.cimimport:Package information not found for class EnergyConsumer, attribute EquipmentContainer : 52 times +WARNING:cimpy.cimimport:Package information not found for class EnergyConsumer, attribute aggregate : 52 times +WARNING:cimpy.cimimport:'EnergyConsumer' has not attribute 'pfixed' : 52 times +WARNING:cimpy.cimimport:'EnergyConsumer' has not attribute 'qfixed' : 52 times +WARNING:cimpy.cimimport:Package information not found for class Terminal, attribute TopologicalNode : 224 times +WARNING:cimpy.cimimport:Package information not found for class SvVoltage, attribute v : 57 times +WARNING:cimpy.cimimport:Package information not found for class SvVoltage, attribute angle : 57 times +WARNING:cimpy.cimimport:Package information not found for class SvVoltage, attribute TopologicalNode : 57 times +WARNING:cimpy.cimimport:Package information not found for class Substation, attribute name : 57 times +WARNING:cimpy.cimimport:Package information not found for class Substation, attribute Region : 57 times +WARNING:cimpy.cimimport:Package information not found for class TopologicalNode, attribute name : 57 times +WARNING:cimpy.cimimport:Package information not found for class TopologicalNode, attribute ConnectivityNodeContainer : 57 times +WARNING:cimpy.cimimport:Package information not found for class TopologicalNode, attribute TopologicalIsland : 57 times +WARNING:cimpy.cimimport:Package information not found for class TopologicalNode, attribute BaseVoltage : 57 times +WARNING:cimpy.cimimport:Package information not found for class SvPowerFlow, attribute p : 52 times +WARNING:cimpy.cimimport:Package information not found for class SvPowerFlow, attribute q : 52 times +WARNING:cimpy.cimimport:Package information not found for class SvPowerFlow, attribute Terminal : 52 times +WARNING:cimpy.cimimport:Package information not found for class VoltageLevel, attribute BaseVoltage : 58 times +WARNING:cimpy.cimimport:Package information not found for class VoltageLevel, attribute name : 58 times +WARNING:cimpy.cimimport:Package information not found for class VoltageLevel, attribute Substation : 58 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute name : 54 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute x : 54 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute r : 54 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute gch : 54 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute bch : 54 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute length : 54 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute BaseVoltage : 54 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute aggregate : 54 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute EquipmentContainer : 54 times +WARNING:cimpy.cimimport:Package information not found for class BusbarSection, attribute name : 55 times +WARNING:cimpy.cimimport:Package information not found for class BusbarSection, attribute EquipmentContainer : 55 times +WARNING:cimpy.cimimport:Package information not found for class BusbarSection, attribute BaseVoltage : 55 times +WARNING:cimpy.cimimport:Package information not found for class Line, attribute name : 54 times +WARNING:cimpy.cimimport:Package information not found for class Line, attribute Region : 54 times +WARNING:cimpy.cimimport:Package information not found for class SubGeographicalRegion, attribute name : 3 times +WARNING:cimpy.cimimport:Package information not found for class SubGeographicalRegion, attribute Region : 3 times +WARNING:cimpy.cimimport:Package information not found for class TopologicalIsland, attribute name : 3 times +WARNING:cimpy.cimimport:Package information not found for class ExternalNetworkInjection, attribute aggregate : 3 times +WARNING:cimpy.cimimport:Package information not found for class ExternalNetworkInjection, attribute name : 3 times +WARNING:cimpy.cimimport:Package information not found for class ExternalNetworkInjection, attribute EquipmentContainer : 3 times +WARNING:cimpy.cimimport:Package information not found for class BaseVoltage, attribute nominalVoltage : 3 times +WARNING:cimpy.cimimport:Package information not found for class BaseVoltage, attribute name : 3 times +WARNING:cimpy.cimimport:Package information not found for class GeographicalRegion, attribute name : 3 times +INFO:cimpy.cimimport:CIM object Terminal created : 436 times +INFO:cimpy.cimimport:CIM object ConnectivityNode created : 163 times +INFO:cimpy.cimimport:CIM object Disconnector created : 112 times +INFO:cimpy.cimimport:CIM object EnergyConsumer created : 52 times +INFO:cimpy.cimimport:CIM object SvVoltage created : 57 times +INFO:cimpy.cimimport:CIM object Substation created : 57 times +INFO:cimpy.cimimport:CIM object TopologicalNode created : 57 times +INFO:cimpy.cimimport:CIM object SvPowerFlow created : 52 times +INFO:cimpy.cimimport:CIM object VoltageLevel created : 58 times +INFO:cimpy.cimimport:CIM object ACLineSegment created : 54 times +INFO:cimpy.cimimport:CIM object BusbarSection created : 55 times +INFO:cimpy.cimimport:CIM object Line created : 54 times +INFO:cimpy.cimimport:CIM object SubGeographicalRegion created : 3 times +INFO:cimpy.cimimport:CIM object TopologicalIsland created : 3 times +INFO:cimpy.cimimport:CIM object ExternalNetworkInjection created : 3 times +INFO:cimpy.cimimport:CIM object BaseVoltage created : 3 times +INFO:cimpy.cimimport:CIM object GeographicalRegion created : 3 times +INFO:cimpy.cimimport:Created totally 1207 CIM objects in 0.08458471298217773s + + diff --git a/examples/run_nv_state_estimator.log b/examples/run_nv_state_estimator.log index 16331176978970844b95ea8675a2acace71b4e31..d5eec23cc8afecb3b3179b314d3860a0162388d6 100644 --- a/examples/run_nv_state_estimator.log +++ b/examples/run_nv_state_estimator.log @@ -1,41 +1,83 @@ -INFO:cimpy.cimimport:START of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/CIGRE-MV-NoTap-WithBreaker/20191126T1535Z_YYY_EQ_.xml" -INFO:cimpy.cimimport:START of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/CIGRE-MV-NoTap-WithBreaker/20191126T1535Z_XX_YYY_SV_.xml" -INFO:cimpy.cimimport:START of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/CIGRE-MV-NoTap-WithBreaker/20191126T1535Z_XX_YYY_TP_.xml" -INFO:cimpy.cimimport:END of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/CIGRE-MV-NoTap-WithBreaker/20191126T1535Z_YYY_EQ_.xml" -INFO:cimpy.cimimport:END of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/CIGRE-MV-NoTap-WithBreaker/20191126T1535Z_XX_YYY_SV_.xml" -INFO:cimpy.cimimport:END of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/CIGRE-MV-NoTap-WithBreaker/20191126T1535Z_XX_YYY_TP_.xml" -WARNING:cimpy.cimimport:Module LoadArea not implemented : 1 times -WARNING:cimpy.cimimport:Module SubLoadArea not implemented : 1 times -WARNING:cimpy.cimimport:'Terminal' has not attribute 'ConnectivityNode' : 51 times -WARNING:cimpy.cimimport:'ConnectivityNode' has not attribute 'ConnectivityNodeContainer' : 16 times -WARNING:cimpy.cimimport:'ConnectivityNode' has not attribute 'name' : 16 times -WARNING:cimpy.cimimport:Missing LoadArea object with uuid: _8c7f05c8-84a2-0f6a-eb5c-becc766dfb09 : 1 times -WARNING:cimpy.cimimport:'ConformLoadGroup' has not attribute 'SubLoadArea' : 1 times -WARNING:cimpy.cimimport:Missing SubLoadArea object with uuid: _f09a72ae-1f45-f5ee-4cb2-bf413e191602 : 1 times -INFO:cimpy.cimimport:CIM object ConformLoad created : 18 times -INFO:cimpy.cimimport:CIM object ACLineSegment created : 13 times -INFO:cimpy.cimimport:CIM object CurrentLimit created : 30 times -INFO:cimpy.cimimport:CIM object OperationalLimitSet created : 30 times -INFO:cimpy.cimimport:CIM object GeographicalRegion created : 1 times -INFO:cimpy.cimimport:CIM object SubGeographicalRegion created : 17 times -INFO:cimpy.cimimport:CIM object Substation created : 17 times -INFO:cimpy.cimimport:CIM object PowerTransformer created : 2 times -INFO:cimpy.cimimport:CIM object Terminal created : 51 times -INFO:cimpy.cimimport:CIM object VoltageLevel created : 16 times -INFO:cimpy.cimimport:CIM object ConnectivityNode created : 16 times -INFO:cimpy.cimimport:CIM object PowerTransformerEnd created : 4 times -INFO:cimpy.cimimport:CIM object VoltageLimit created : 16 times -INFO:cimpy.cimimport:CIM object LoadResponseCharacteristic created : 1 times -INFO:cimpy.cimimport:CIM object BaseVoltage created : 2 times -INFO:cimpy.cimimport:CIM object RegulatingControl created : 1 times -INFO:cimpy.cimimport:CIM object Breaker created : 1 times -INFO:cimpy.cimimport:CIM object OperationalLimitType created : 3 times -INFO:cimpy.cimimport:CIM object ExternalNetworkInjection created : 1 times -INFO:cimpy.cimimport:CIM object ConformLoadGroup created : 1 times -INFO:cimpy.cimimport:CIM object SvPowerFlow created : 19 times -INFO:cimpy.cimimport:CIM object SvVoltage created : 16 times -INFO:cimpy.cimimport:CIM object TopologicalIsland created : 1 times -INFO:cimpy.cimimport:CIM object TopologicalNode created : 16 times -INFO:cimpy.cimimport:Created totally 293 CIM objects in 0.027395963668823242s +INFO:cimpy.cimimport:START of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/areti/3.xml" +INFO:cimpy.cimimport:START of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/areti/2.xml" +INFO:cimpy.cimimport:START of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/areti/1.xml" +INFO:cimpy.cimimport:END of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/areti/3.xml" +INFO:cimpy.cimimport:END of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/areti/2.xml" +INFO:cimpy.cimimport:END of parsing file "/home/ubuntu/pyvolt-docker/examples/sample_data/areti/1.xml" +WARNING:cimpy.cimimport:Package information not found for class type : 1222 times +WARNING:cimpy.cimimport:Package information not found for class Terminal, attribute ConductingEquipment : 436 times +WARNING:cimpy.cimimport:'Terminal' has not attribute 'ConnectivityNode' : 436 times +WARNING:cimpy.cimimport:Package information not found for class Terminal, attribute name : 436 times +WARNING:cimpy.cimimport:Package information not found for class Terminal, attribute connected : 436 times +WARNING:cimpy.cimimport:Package information not found for class Terminal, attribute sequenceNumber : 436 times +WARNING:cimpy.cimimport:Referenced Terminal [PhaseCode.ABC] object missing. : 436 times +WARNING:cimpy.cimimport:'ConnectivityNode' has not attribute 'name' : 163 times +WARNING:cimpy.cimimport:'ConnectivityNode' has not attribute 'ConnectivityNodeContainer' : 163 times +WARNING:cimpy.cimimport:Package information not found for class SvPowerFlow, attribute p : 52 times +WARNING:cimpy.cimimport:Package information not found for class SvPowerFlow, attribute q : 52 times +WARNING:cimpy.cimimport:Package information not found for class SvPowerFlow, attribute Terminal : 52 times +WARNING:cimpy.cimimport:Package information not found for class Terminal, attribute TopologicalNode : 224 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute name : 54 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute x : 54 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute r : 54 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute gch : 54 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute bch : 54 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute length : 54 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute BaseVoltage : 54 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute aggregate : 54 times +WARNING:cimpy.cimimport:Package information not found for class ACLineSegment, attribute EquipmentContainer : 54 times +WARNING:cimpy.cimimport:Package information not found for class Substation, attribute name : 57 times +WARNING:cimpy.cimimport:Package information not found for class Substation, attribute Region : 57 times +WARNING:cimpy.cimimport:Package information not found for class Disconnector, attribute name : 112 times +WARNING:cimpy.cimimport:Package information not found for class Disconnector, attribute BaseVoltage : 112 times +WARNING:cimpy.cimimport:Package information not found for class Disconnector, attribute EquipmentContainer : 112 times +WARNING:cimpy.cimimport:Package information not found for class Disconnector, attribute normalOpen : 112 times +WARNING:cimpy.cimimport:Package information not found for class VoltageLevel, attribute BaseVoltage : 58 times +WARNING:cimpy.cimimport:Package information not found for class VoltageLevel, attribute name : 58 times +WARNING:cimpy.cimimport:Package information not found for class VoltageLevel, attribute Substation : 58 times +WARNING:cimpy.cimimport:Package information not found for class SvVoltage, attribute v : 57 times +WARNING:cimpy.cimimport:Package information not found for class SvVoltage, attribute angle : 57 times +WARNING:cimpy.cimimport:Package information not found for class SvVoltage, attribute TopologicalNode : 57 times +WARNING:cimpy.cimimport:Package information not found for class EnergyConsumer, attribute name : 52 times +WARNING:cimpy.cimimport:Package information not found for class EnergyConsumer, attribute EquipmentContainer : 52 times +WARNING:cimpy.cimimport:Package information not found for class EnergyConsumer, attribute aggregate : 52 times +WARNING:cimpy.cimimport:'EnergyConsumer' has not attribute 'pfixed' : 52 times +WARNING:cimpy.cimimport:'EnergyConsumer' has not attribute 'qfixed' : 52 times +WARNING:cimpy.cimimport:Package information not found for class BusbarSection, attribute name : 55 times +WARNING:cimpy.cimimport:Package information not found for class BusbarSection, attribute EquipmentContainer : 55 times +WARNING:cimpy.cimimport:Package information not found for class BusbarSection, attribute BaseVoltage : 55 times +WARNING:cimpy.cimimport:Package information not found for class Line, attribute name : 54 times +WARNING:cimpy.cimimport:Package information not found for class Line, attribute Region : 54 times +WARNING:cimpy.cimimport:Package information not found for class TopologicalNode, attribute name : 57 times +WARNING:cimpy.cimimport:Package information not found for class TopologicalNode, attribute ConnectivityNodeContainer : 57 times +WARNING:cimpy.cimimport:Package information not found for class TopologicalNode, attribute TopologicalIsland : 57 times +WARNING:cimpy.cimimport:Package information not found for class TopologicalNode, attribute BaseVoltage : 57 times +WARNING:cimpy.cimimport:Package information not found for class TopologicalIsland, attribute name : 3 times +WARNING:cimpy.cimimport:Package information not found for class SubGeographicalRegion, attribute name : 3 times +WARNING:cimpy.cimimport:Package information not found for class SubGeographicalRegion, attribute Region : 3 times +WARNING:cimpy.cimimport:Package information not found for class BaseVoltage, attribute nominalVoltage : 3 times +WARNING:cimpy.cimimport:Package information not found for class BaseVoltage, attribute name : 3 times +WARNING:cimpy.cimimport:Package information not found for class ExternalNetworkInjection, attribute aggregate : 3 times +WARNING:cimpy.cimimport:Package information not found for class ExternalNetworkInjection, attribute name : 3 times +WARNING:cimpy.cimimport:Package information not found for class ExternalNetworkInjection, attribute EquipmentContainer : 3 times +WARNING:cimpy.cimimport:Package information not found for class GeographicalRegion, attribute name : 3 times +INFO:cimpy.cimimport:CIM object Terminal created : 436 times +INFO:cimpy.cimimport:CIM object ConnectivityNode created : 163 times +INFO:cimpy.cimimport:CIM object SvPowerFlow created : 52 times +INFO:cimpy.cimimport:CIM object ACLineSegment created : 54 times +INFO:cimpy.cimimport:CIM object Substation created : 57 times +INFO:cimpy.cimimport:CIM object Disconnector created : 112 times +INFO:cimpy.cimimport:CIM object VoltageLevel created : 58 times +INFO:cimpy.cimimport:CIM object SvVoltage created : 57 times +INFO:cimpy.cimimport:CIM object EnergyConsumer created : 52 times +INFO:cimpy.cimimport:CIM object BusbarSection created : 55 times +INFO:cimpy.cimimport:CIM object Line created : 54 times +INFO:cimpy.cimimport:CIM object TopologicalNode created : 57 times +INFO:cimpy.cimimport:CIM object TopologicalIsland created : 3 times +INFO:cimpy.cimimport:CIM object SubGeographicalRegion created : 3 times +INFO:cimpy.cimimport:CIM object BaseVoltage created : 3 times +INFO:cimpy.cimimport:CIM object ExternalNetworkInjection created : 3 times +INFO:cimpy.cimimport:CIM object GeographicalRegion created : 3 times +INFO:cimpy.cimimport:Created totally 1207 CIM objects in 0.08271288871765137s diff --git a/examples/sld.png b/examples/sld.png new file mode 100644 index 0000000000000000000000000000000000000000..5f90d224810e0c4a8e66a51eea8c9e6c0d80ceb1 Binary files /dev/null and b/examples/sld.png differ diff --git a/ppf b/ppf new file mode 160000 index 0000000000000000000000000000000000000000..1227d9a98992e6c7e368369c0f7177af330f7403 --- /dev/null +++ b/ppf @@ -0,0 +1 @@ +Subproject commit 1227d9a98992e6c7e368369c0f7177af330f7403 diff --git a/pyvolt/__pycache__/network.cpython-310.pyc b/pyvolt/__pycache__/network.cpython-310.pyc index 2b4166cb9136bef3b568c6f189800fcbecdc88d9..7bf56eb1d784f7e8cd67752187a55603aa49a092 100644 Binary files a/pyvolt/__pycache__/network.cpython-310.pyc and b/pyvolt/__pycache__/network.cpython-310.pyc differ diff --git a/pyvolt/network.py b/pyvolt/network.py index 0e18d281d45bf9dd43a682bdc607590e9cf000cb..76b2a3db616a7ab6c51b634ed8521a43a8c5db4e 100644 --- a/pyvolt/network.py +++ b/pyvolt/network.py @@ -3,6 +3,8 @@ import numpy as np from enum import Enum import os import hdf5storage +import matplotlib.pyplot as plt +from pypowsybl.network import Network class BusType(Enum): @@ -440,4 +442,82 @@ class System(): ) - self.Ymatrix_calc() \ No newline at end of file + self.Ymatrix_calc() + + + + def generate_sld(self, output_file=None): + """ + Generate and display a Single Line Diagram (SLD) of the network using pypowsybl. + + This function: + - Builds a pypowsybl network instance from self.nodes and self.branches. + - Adds buses (ignoring nodes that are "ideally connected") and transmission lines. + - Invokes pypowsybl's SLD generator to produce a matplotlib figure for the SLD. + + :param output_file: Optional file path to save the diagram (e.g., 'sld.png'). + """ + + # Create a new pypowsybl network instance. + # The parameters ("MyNetwork", "1.0", "DC") are placeholders; adjust as required. + try: + from pypowsybl.sld import SldGenerator + except ImportError: + SldGenerator = None + net = Network("MyNetwork", "1.0", "DC") + + # Dictionary for mapping node indices to pypowsybl bus objects + bus_map = {} + + # Add buses for nodes (skip ideally connected nodes) + for node in self.nodes: + if node.ideal_connected_with: + continue + + # Map your node type to a string value compatible with pypowsybl. + if node.type == BusType.SLACK: + bus_type = 'SLACK' + elif node.type == BusType.PV: + bus_type = 'PV' + else: + bus_type = 'PQ' + + # Create a bus in the pypowsybl network. + # NOTE: Replace 'create_bus' with the actual pypowsybl bus creation method if different. + # Here, it is assumed that create_bus takes the node index, name, voltage (magnitude) and type. + bus = net.create_bus(node.index, node.name, abs(node.voltage_pu), bus_type) + bus_map[node.index] = bus + + # Add branches as transmission lines between the buses + for branch in self.branches: + start_idx = branch.start_node.index + end_idx = branch.end_node.index + + # Only add the branch if both buses exist. + if start_idx not in bus_map or end_idx not in bus_map: + continue + + # Add a transmission line between buses. + # NOTE: Replace 'add_line' with the corresponding pypowsybl API call as needed. + # It is assumed that the method accepts the two bus objects, the impedance value (absolute), + # and a name for the line. + net.add_line(bus_map[start_idx], bus_map[end_idx], abs(branch.z_pu), "Line") + + # Verify that the SLD generation module is available. + if SldGenerator is None: + raise ImportError("pypowsybl SLD module not found. Ensure that you have installed the version of " + "pypowsybl that includes SLD support.") + + # Generate the single line diagram. + # The SldGenerator.generate() method is assumed to return a matplotlib figure. + sld_generator = SldGenerator() + fig = sld_generator.generate(net) + + # Save or display the SLD. + if output_file: + fig.savefig(output_file, dpi=300, bbox_inches='tight') + print(f"SLD saved to {output_file}") + else: + fig.show() + + plt.close(fig) \ No newline at end of file