Source code for relsad.network.systems.Distribution

from relsad.network.components import Bus, DistributionController, Line
from relsad.utils import unique

from .PowerNetwork import PowerNetwork
from .PowerSystem import PowerSystem


[docs]class Distribution(PowerNetwork): """ Class defining a distribution network type ... Attributes ---------- name : str Name of the distribution network buses : list List containing the buses connected to the distribution network ev_parks : list List containing the EV parks in the distribution network batteries : list List containing the batteries in the distribution network productions : list List containing the generation units in the distribution network lines : list List containing the lines connected to the distribution network sensors : list List containing the sensors in the distribution network circuitbreaker : list List containing the circuit breakers in the distribution network disconnectors : list List containing the disconnectors in the distribution network intelligent_switches : list List containing the intelligent switches in the distribution network controller : DistributionController The controller for the distribution system comp_list : list List containing the components in the distribution network comp_dict : dict Dictionary containing the components in the distribution network parent_network : PowerNetwork The parent network of the distribution network power_system : PowerNetwork Connects the distribution network to a power system child_network_list : list List containing connected child networks to the distribution network failed_line : Bool Flag stating if the distribution network contains a failed line p_energy_shed : float Shedded active power load in the distribution network acc_p_energy_shed : float The accumulated shedded active power load in the distribution network q_energy_shed : float Shedded reactive power load in the distribution network acc_q_energy_shed : float The accumulated shedded reactive power load in the distribution network connected_line : Line Connects the distribution network to the transmission network, the line connecting the distribution network to the transmission network add_connected_line : Line Adds the connected line to the distribution network sections : Section The sections in the distribution system history : dict Dictionary containing the history variables of the network monte_carlo_history : dict Dictionary containing the history variables from the monte carlo simulation Methods ---------- add_connected_line(connected_line) Sets the line connecting the distribution system to overlying network add_bus(bus) Adding a bus including elements on the bus (battery, generation unit, EV park) to the distribution network add_buses(buses) Adding buses to the distribution network add_line(line) Adding a line including elements on the line (sensor, circuit breaker, disconnector) to the distribution network add_lines(lines) Adding lines to the distribution network get_lines() Returns the lines in the distribution network reset_slack_bus() Resets the slack bus attribute of the buses in the distribution network add_child_network(network) Adds child network to the distribution network get_monte_carlo_history(attribute) Returns the specified history variable from the Monte Carlo simulation get_history(attribute) Returns the specified history variable get_system_load() Returns the load in the distribution network at the current time in MW and MVar reset_energy_shed_variables() Resets the energy.shed variables """ ## Visual attributes color = "steelblue" ## Counter counter = 0 def __init__(self, parent_network: PowerNetwork, connected_line: Line): Distribution.counter += 1 self.name = "dist_network{:d}".format(Distribution.counter) # Components self.buses = list() self.ev_parks = list() self.batteries = list() self.productions = list() self.lines = list() self.sensors = list() self.circuitbreakers = list() self.disconnectors = list() self.intelligent_switches = list() self.controller = DistributionController( name=self.name + "_controller", power_network=self, ) self.comp_list = list() self.comp_dict = dict() # PowerNetwork connections self.parent_network = parent_network parent_network.add_child_network(self) if isinstance(parent_network, PowerSystem): self.power_system = parent_network else: self.power_system = parent_network.parent_network self.power_system.controller.add_distribution_controller( self.controller ) self.child_network_list = list() self.power_system.comp_dict[self.controller.name] = self.controller self.power_system.comp_list.append(self.controller) self.failed_line = False # Load shedding self.p_energy_shed = 0 self.acc_p_energy_shed = 0 self.q_energy_shed = 0 self.acc_q_energy_shed = 0 self.connected_line = None if connected_line is not None: self.add_connected_line(connected_line) # Sectioning self.sections = None ## History self.history: dict = {} self.monte_carlo_history: dict = {} def __str__(self): return self.name def __repr__(self): return f"Distribution(name={self.name})" def __eq__(self, other): if hasattr(other, "name"): return self.name == other.name else: return False def __hash__(self): return hash(self.name)
[docs] def add_connected_line(self, connected_line): """ Sets the line connecting the distribution system to overlying network Parameters ---------- connected_line : Line The line connecting the distribution system to overlaying network Returns ---------- None """ # Sets the connected line for the distribution system self.connected_line = connected_line # Add the components attached to the line # to the distribution system: # CircuitBreaker c_b = connected_line.circuitbreaker if self.connected_line.circuitbreaker is None: raise Exception( "{} connects the distribution network to the " "transmission network, it must contain a circuitbreaker".format( connected_line ) ) self.comp_dict[c_b.name] = c_b self.comp_list.append(c_b) # Line self.add_line(connected_line)
[docs] def add_bus(self, bus: Bus): """ Adding a bus including elements on the bus (battery, generation unit, EV park) to the distribution network Parameters ---------- bus : Bus A Bus element Returns ---------- None """ # Add bus to distribution network self.comp_dict[bus.name] = bus bus.handle.color = self.color bus.color = self.color bus.parent_network = self self.buses.append(bus) self.buses = unique(self.buses) # Add components attached to bus to distribution network: # EV-Park if bus.ev_park is not None: self.comp_dict[bus.ev_park.name] = bus.ev_park self.comp_list.append(bus.ev_park) self.ev_parks.append(bus.ev_park) self.ev_parks = unique(self.ev_parks) # Battery if bus.battery is not None: self.comp_dict[bus.battery.name] = bus.battery self.comp_list.append(bus.battery) self.batteries.append(bus.battery) self.batteries = unique(self.batteries) # Production if bus.prod is not None: self.comp_dict[bus.prod.name] = bus.prod self.comp_list.append(bus.prod) self.productions.append(bus.prod) self.productions = unique(self.productions) # Add bus to the power system self.power_system.add_bus(bus)
[docs] def add_buses(self, buses: list): """ Adding buses to the distribution network bus list Parameters ---------- buses : list A list of Bus elements in the distribution network Returns ---------- None """ for bus in buses: self.add_bus(bus)
[docs] def add_line(self, line: Line): """ Adding a line and the components connected to the line to the distribution network Parameters ---------- line : Line A Line element Returns ---------- None """ # Add line to distribution network line.handle.color = self.color line.color = self.color self.comp_dict[line.name] = line self.lines.append(line) self.lines = unique(self.lines) # Add components attached to line to distribution network: # Sensor if line.sensor: self.comp_dict[line.sensor.name] = line.sensor self.comp_list.append(line.sensor) self.sensors.append(line.sensor) self.sensors = unique(self.sensors) self.controller.sensors.append(line.sensor) self.controller.sensors = unique(self.controller.sensors) # Disconnector for discon in line.disconnectors: self.comp_dict[discon.name] = discon self.comp_list.append(discon) self.disconnectors.append(discon) self.disconnectors = unique(self.disconnectors) # Intelligent switch if discon.intelligent_switch: self.comp_dict[ discon.intelligent_switch.name ] = discon.intelligent_switch self.comp_list.append(discon.intelligent_switch) self.intelligent_switches.append(discon.intelligent_switch) self.intelligent_switches = unique(self.intelligent_switches) # Set distribution network as parent network line.add_parent_network(self) # Add line to power system self.power_system.add_line(line)
[docs] def add_lines(self, lines: list): """ Adding lines to distribution network line list Parameters ---------- lines : list A list of Line elements in the distribution network Returns ---------- None """ for line in lines: self.add_line(line)
[docs] def get_lines(self): """ Returns the lines in the distribution network Parameters ---------- None Returns ---------- lines : list List of Line elements """ return self.lines
[docs] def reset_slack_bus(self): """ Resets the slack bus attribute of the buses in the distribution network Parameters ---------- None Returns ---------- None """ for bus in self.buses: bus.is_slack = False
[docs] def add_child_network(self, network): """ Adds child network to the distribution network Parameters ---------- network : PowerNetwork The child network of the distribution network Returns ---------- None """ self.child_network_list.append(network) self.parent_network.add_child_network(network)
[docs] def get_monte_carlo_history(self, attribute): """ Returns the specified history variable from the Monte Carlo simulation Parameters ---------- attribute : str Distribution network attribute Returns ---------- monte_carlo_history[attribute] : dict Returns the history variables of an attribute from the Monte Carlo simulation """ return self.monte_carlo_history[attribute]
[docs] def get_history(self, attribute): """ Returns the specified history variable Parameters ---------- attribute : str Distribution network attribute Returns ---------- history[attribute] : dict Returns the history variables of an attribute """ return self.history[attribute]
[docs] def get_system_load(self): """ Returns the system load in the distribution network at the current time in MW and MVar Parameters ---------- None Returns ---------- pload : float The active power load in the distribution network qload : float The reactive power load in the distribution network """ pload, qload = 0, 0 for bus in self.buses: p, q = bus.get_load() pload += p qload += q return pload, qload
[docs] def reset_energy_shed_variables(self): """ Resets the energy.shed variables Parameters ---------- None Returns ---------- None """ self.p_energy_shed = 0 self.acc_p_energy_shed = 0 self.q_energy_shed = 0 self.acc_q_energy_shed = 0