From cf87b460034dd941c1a16a7fa3f3b626a7a0f1b6 Mon Sep 17 00:00:00 2001 From: Joseph McKinsey Date: Wed, 20 Mar 2024 12:16:48 -0600 Subject: [PATCH 1/4] Fix incidence for 3-winding transformers --- LocalFeeder/FeederSimulator.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/LocalFeeder/FeederSimulator.py b/LocalFeeder/FeederSimulator.py index 0e26077..db13800 100644 --- a/LocalFeeder/FeederSimulator.py +++ b/LocalFeeder/FeederSimulator.py @@ -1,4 +1,5 @@ """Core class to abstract OpenDSS into Feeder class.""" + import json import logging import math @@ -590,9 +591,9 @@ def _get_voltages(self): name_voltage_dict = get_voltages(self._circuit) res_feeder_voltages = np.zeros((len(self._AllNodeNames)), dtype=np.complex_) for voltage_name in name_voltage_dict.keys(): - res_feeder_voltages[ - self._name_index_dict[voltage_name] - ] = name_voltage_dict[voltage_name] + res_feeder_voltages[self._name_index_dict[voltage_name]] = ( + name_voltage_dict[voltage_name] + ) return xr.DataArray( res_feeder_voltages, {"ids": list(name_voltage_dict.keys())} @@ -826,14 +827,22 @@ def get_incidences(self) -> IncidenceList: equipment_types = [] for line in dss.Lines.AllNames(): dss.Circuit.SetActiveElement("Line." + line) - from_bus, to_bus = dss.CktElement.BusNames() + names = dss.CktElement.BusNames() + if len(names) != 2: + logging.info(f"Line {line} does not have two terminals") + continue + from_bus, to_bus = names from_list.append(from_bus.upper()) to_list.append(to_bus.upper()) equipment_ids.append(line) equipment_types.append("Line") for transformer in dss.Transformers.AllNames(): dss.Circuit.SetActiveElement("Transformer." + transformer) - from_bus, to_bus = dss.CktElement.BusNames() + names = dss.CktElement.BusNames() + if len(names) != 2: + logging.info(f"Transformer {transformer} does not have two terminals") + continue + from_bus, to_bus = names from_list.append(from_bus.upper()) to_list.append(to_bus.upper()) equipment_ids.append(transformer) From bd8e34479db5c20f18e7a5ef9783c3b3d69d8b81 Mon Sep 17 00:00:00 2001 From: Joseph McKinsey Date: Mon, 25 Mar 2024 17:34:32 -0600 Subject: [PATCH 2/4] Add incidence matrix fix for 3-winding transformer --- LocalFeeder/FeederSimulator.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/LocalFeeder/FeederSimulator.py b/LocalFeeder/FeederSimulator.py index db13800..c4b3a97 100644 --- a/LocalFeeder/FeederSimulator.py +++ b/LocalFeeder/FeederSimulator.py @@ -829,9 +829,11 @@ def get_incidences(self) -> IncidenceList: dss.Circuit.SetActiveElement("Line." + line) names = dss.CktElement.BusNames() if len(names) != 2: - logging.info(f"Line {line} does not have two terminals") - continue - from_bus, to_bus = names + bus_names = map(lambda x: x.split(".")[0], names) + # dicts are insert-ordered in >=3.7 + from_bus, to_bus = dict.fromkeys(bus_names) + else: + from_bus, to_bus = names from_list.append(from_bus.upper()) to_list.append(to_bus.upper()) equipment_ids.append(line) @@ -840,8 +842,8 @@ def get_incidences(self) -> IncidenceList: dss.Circuit.SetActiveElement("Transformer." + transformer) names = dss.CktElement.BusNames() if len(names) != 2: - logging.info(f"Transformer {transformer} does not have two terminals") - continue + bus_names = map(lambda x: x.split(".")[0], names) + from_bus, to_bus = dict.fromkeys(bus_names) from_bus, to_bus = names from_list.append(from_bus.upper()) to_list.append(to_bus.upper()) From ab5a1bb30bf066b532b3eb7daf19816ec11819d7 Mon Sep 17 00:00:00 2001 From: Joseph McKinsey Date: Mon, 25 Mar 2024 17:37:55 -0600 Subject: [PATCH 3/4] Add warning when there is really a 3-winding transformer --- LocalFeeder/FeederSimulator.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/LocalFeeder/FeederSimulator.py b/LocalFeeder/FeederSimulator.py index c4b3a97..4977447 100644 --- a/LocalFeeder/FeederSimulator.py +++ b/LocalFeeder/FeederSimulator.py @@ -831,9 +831,13 @@ def get_incidences(self) -> IncidenceList: if len(names) != 2: bus_names = map(lambda x: x.split(".")[0], names) # dicts are insert-ordered in >=3.7 - from_bus, to_bus = dict.fromkeys(bus_names) - else: - from_bus, to_bus = names + names = list(dict.fromkeys(bus_names)) + if len(names) != 2: + logging.info( + f"Line {line} has {len(names)} terminals, skipping in incidence matrix" + ) + continue + from_bus, to_bus = names from_list.append(from_bus.upper()) to_list.append(to_bus.upper()) equipment_ids.append(line) @@ -842,8 +846,16 @@ def get_incidences(self) -> IncidenceList: dss.Circuit.SetActiveElement("Transformer." + transformer) names = dss.CktElement.BusNames() if len(names) != 2: + logging.info( + f"Transformer {transformer} has 3-terms, skipping in incidence matrix" + ) bus_names = map(lambda x: x.split(".")[0], names) - from_bus, to_bus = dict.fromkeys(bus_names) + names = list(dict.fromkeys(bus_names)) + if len(names) != 2: + logging.info( + f"Transformer {transformer} has {len(names)} terminals, skipping in incidence matrix" + ) + continue from_bus, to_bus = names from_list.append(from_bus.upper()) to_list.append(to_bus.upper()) From d18ac8ff7df89a3ef585b5535ac6ec09a7a841d1 Mon Sep 17 00:00:00 2001 From: Joseph McKinsey Date: Tue, 26 Mar 2024 09:35:43 -0600 Subject: [PATCH 4/4] Remove unneeded logging --- LocalFeeder/FeederSimulator.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/LocalFeeder/FeederSimulator.py b/LocalFeeder/FeederSimulator.py index 4977447..591d0d6 100644 --- a/LocalFeeder/FeederSimulator.py +++ b/LocalFeeder/FeederSimulator.py @@ -846,9 +846,6 @@ def get_incidences(self) -> IncidenceList: dss.Circuit.SetActiveElement("Transformer." + transformer) names = dss.CktElement.BusNames() if len(names) != 2: - logging.info( - f"Transformer {transformer} has 3-terms, skipping in incidence matrix" - ) bus_names = map(lambda x: x.split(".")[0], names) names = list(dict.fromkeys(bus_names)) if len(names) != 2: