Source code for relsad.network.components.Disconnector

import matplotlib.lines as mlines
import numpy as np

from relsad.Time import Time, TimeUnit

from .Bus import Bus
from .Component import Component
from .Line import Line
from .Switch import Switch


[docs]class Disconnector(Component, Switch): """ Common base class for disconnectors ... Attributes ---------- name : string Name of the disconnector coordinate : list The coordinate of the disconnector initial_state : bool The initial state of the disconnector (open or colsed) is_open : bool Tells if the switch is open (True) or closed (False) failed : bool True if the disconnector is in a failed state, False if not fail_rate : float The failure rate of the disconnector [no. of fails per year] outage_time : Time The outage time of the diconnector line : Line The line the disconnecor is connected to base_bus : Bus Wich bus the disconnector is closes to (for setting coordinates) intelligent_switch : IntelligentSwitch Returns the intelligent switch connected to the disconnector if any history : dict Dictonary attribute that stores the historic variables Methods ---------- close() Closes the disconnector open() Opens the disconnector fail() Sets the disconnector to failed and opens the disconnector not_fail() Sets the doconnector to not failed and closes the disconnector initialize_history() Initializes the history variables update_history(prev_time, curr_time, save_flag) Updates the history variables get_history(attribute) Returns the history variables of an attribute add_random_instance(random_gen) Adds global random seed reset_status(save_falg) Resets and sets the status of the system parameters """ ## Visual attributes color = "black" edgecolor = "black" marker = "o" size = 2**2 handle = mlines.Line2D( [], [], marker=marker, markeredgewidth=2, markersize=size, linestyle="None", color=color, markeredgecolor=edgecolor, ) ## Random instance ps_random: np.random.Generator = None def __init__( self, name: str, line: Line, bus: Bus, is_open: bool = False, fail_rate: float = 0.014, outage_time: Time = Time(1, TimeUnit.HOUR), ): # Verify input if line is None: raise Exception("Disconnector must be connected to a Line") if line.parent_network is not None: raise Exception( "Disconnector must be created before the line is connected to a network" ) if bus is None: raise Exception("Disconnector must be connected to a Bus") if bus not in [line.fbus, line.tbus]: raise Exception( "Disconnector must be connected to a base bus connected " "to the line it is located on" ) if fail_rate < 0: raise Exception("The failure rate must be positive") self.name = name self.initial_state = is_open self.is_open = is_open self.failed = False self.fail_rate = fail_rate self.outage_time = outage_time self.line = line ## Set coordinate self.base_bus = bus dx = line.tbus.coordinate[0] - line.fbus.coordinate[0] dy = line.tbus.coordinate[1] - line.fbus.coordinate[1] if bus == line.tbus: dx *= -1 dy *= -1 line.disconnectors.append(self) self.coordinate = [ self.base_bus.coordinate[0] + dx / 4, self.base_bus.coordinate[1] + dy / 4, ] ## Communication self.intelligent_switch = None ## History self.history = {} self.initialize_history() def __str__(self): return self.name def __repr__(self): return f"Disconnector(name={self.name})" def __eq__(self, other): if hasattr(other, "name"): return self.name == other.name and isinstance(other, Disconnector) return False def __hash__(self): return hash(self.name)
[docs] def close(self): """ Closes the disconnector Parameters ---------- None Returns ---------- None """ self.is_open = False self.color = "black" if not self.line.connected: self.line.connect()
[docs] def open(self): """ Opens the disconnector Parameters ---------- None Returns ---------- None """ self.is_open = True self.color = "white" if self.line.connected: self.line.disconnect()
[docs] def fail(self): """ Sets the disconnector to failed and opens the disconnector Parameters ---------- None Returns ---------- None """ self.failed = True self.open()
[docs] def not_fail(self): """ Sets the disconnector to not failed and closes the disconnector Parameters ---------- None Returns ---------- None """ self.failed = False self.close()
def update_fail_status(self, dt: Time): """ Parameters ---------- dt : Time The current time step Returns ---------- None """
[docs] def initialize_history(self): """ Initializes the history variables Parameters ---------- None Returns ---------- None """ self.history["is_open"] = {}
[docs] def update_history( self, prev_time: Time, curr_time: Time, save_flag: bool ): """ Updates the history variables Parameters ---------- prev_time : Time The previous time curr_time : Time Current time save_flag : bool Indicates if saving is on or off Returns ---------- None """ if save_flag: time = curr_time.get_unit_quantity(curr_time.unit) self.history["is_open"][time] = self.is_open
[docs] def get_history(self, attribute: str): """ Returns the history variables of an attribute Parameters ---------- attribute : str System attribute Returns ---------- history[attribute] : dict Returns the history variables of an attribute """ return self.history[attribute]
[docs] def add_random_instance(self, random_gen): """ Adds global random seed Parameters ---------- random_gen : int Random number generator Returns ---------- None """ self.ps_random = random_gen
def print_status(self): """ Parameters ---------- Returns ---------- None """
[docs] def reset_status(self, save_flag: bool): """ Resets and sets the status of the class parameters Parameters ---------- save_flag : bool Indicates if saving is on or off Returns ---------- None """ self.not_fail() if save_flag: self.initialize_history()
if __name__ == "__main__": pass