NREL-ditto 0.0.7__py3-none-any.whl

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.
Files changed (78) hide show
  1. ditto/__init__.py +1 -0
  2. ditto/enumerations.py +18 -0
  3. ditto/readers/__init__.py +0 -0
  4. ditto/readers/cim_iec_61968_13/__init__.py +31 -0
  5. ditto/readers/cim_iec_61968_13/cim_mapper.py +8 -0
  6. ditto/readers/cim_iec_61968_13/common.py +3 -0
  7. ditto/readers/cim_iec_61968_13/components/__init__.py +0 -0
  8. ditto/readers/cim_iec_61968_13/components/distribution_bus.py +61 -0
  9. ditto/readers/cim_iec_61968_13/components/distribution_capacitor.py +43 -0
  10. ditto/readers/cim_iec_61968_13/components/distribution_load.py +48 -0
  11. ditto/readers/cim_iec_61968_13/components/distribution_regulator.py +56 -0
  12. ditto/readers/cim_iec_61968_13/components/distribution_transformer.py +38 -0
  13. ditto/readers/cim_iec_61968_13/components/distribution_voltage_source.py +36 -0
  14. ditto/readers/cim_iec_61968_13/components/matrix_branch.py +42 -0
  15. ditto/readers/cim_iec_61968_13/components/matrix_impedance_switch.py +63 -0
  16. ditto/readers/cim_iec_61968_13/controllers/__init__.py +0 -0
  17. ditto/readers/cim_iec_61968_13/controllers/regulator_controller.py +77 -0
  18. ditto/readers/cim_iec_61968_13/equipment/__init__.py +0 -0
  19. ditto/readers/cim_iec_61968_13/equipment/capacitor_equipment.py +94 -0
  20. ditto/readers/cim_iec_61968_13/equipment/distribution_transformer_equipment.py +64 -0
  21. ditto/readers/cim_iec_61968_13/equipment/load_equipment.py +104 -0
  22. ditto/readers/cim_iec_61968_13/equipment/matrix_branch_equipment.py +56 -0
  23. ditto/readers/cim_iec_61968_13/equipment/voltage_source_equipment.py +62 -0
  24. ditto/readers/cim_iec_61968_13/equipment/winding_equipment.py +115 -0
  25. ditto/readers/cim_iec_61968_13/length_units.py +26 -0
  26. ditto/readers/cim_iec_61968_13/queries.py +674 -0
  27. ditto/readers/cim_iec_61968_13/reader.py +202 -0
  28. ditto/readers/opendss/__init__.py +0 -0
  29. ditto/readers/opendss/common.py +138 -0
  30. ditto/readers/opendss/components/__init__.py +0 -0
  31. ditto/readers/opendss/components/branches.py +405 -0
  32. ditto/readers/opendss/components/buses.py +60 -0
  33. ditto/readers/opendss/components/cables.py +83 -0
  34. ditto/readers/opendss/components/capacitors.py +109 -0
  35. ditto/readers/opendss/components/conductors.py +50 -0
  36. ditto/readers/opendss/components/fuses.py +0 -0
  37. ditto/readers/opendss/components/loads.py +127 -0
  38. ditto/readers/opendss/components/loadshapes.py +141 -0
  39. ditto/readers/opendss/components/pv_systems.py +136 -0
  40. ditto/readers/opendss/components/sources.py +128 -0
  41. ditto/readers/opendss/components/storage.py +0 -0
  42. ditto/readers/opendss/components/transformers.py +231 -0
  43. ditto/readers/opendss/controllers/__init__.py +0 -0
  44. ditto/readers/opendss/controllers/regulators.py +0 -0
  45. ditto/readers/opendss/graph_utils.py +201 -0
  46. ditto/readers/opendss/reader.py +124 -0
  47. ditto/readers/reader.py +28 -0
  48. ditto/writers/__init__.py +0 -0
  49. ditto/writers/abstract_writer.py +12 -0
  50. ditto/writers/opendss/__init__.py +34 -0
  51. ditto/writers/opendss/components/__init__.py +0 -0
  52. ditto/writers/opendss/components/distribution_branch.py +39 -0
  53. ditto/writers/opendss/components/distribution_bus.py +39 -0
  54. ditto/writers/opendss/components/distribution_capacitor.py +67 -0
  55. ditto/writers/opendss/components/distribution_load.py +108 -0
  56. ditto/writers/opendss/components/distribution_regulator.py +57 -0
  57. ditto/writers/opendss/components/distribution_transformer.py +54 -0
  58. ditto/writers/opendss/components/distribution_vsource.py +60 -0
  59. ditto/writers/opendss/components/geometry_branch.py +17 -0
  60. ditto/writers/opendss/components/matrix_impedance_branch.py +17 -0
  61. ditto/writers/opendss/components/matrix_impedance_fuse.py +18 -0
  62. ditto/writers/opendss/components/matrix_impedance_switch.py +21 -0
  63. ditto/writers/opendss/components/sequence_impedance_branch.py +17 -0
  64. ditto/writers/opendss/controllers/__init__.py +0 -0
  65. ditto/writers/opendss/controllers/distribution_regulator_controller.py +64 -0
  66. ditto/writers/opendss/equipment/__init__.py +0 -0
  67. ditto/writers/opendss/equipment/bare_conductor_equipment.py +46 -0
  68. ditto/writers/opendss/equipment/distribution_transformer_equipment.py +84 -0
  69. ditto/writers/opendss/equipment/geometry_branch_equipment.py +58 -0
  70. ditto/writers/opendss/equipment/matrix_impedance_branch_equipment.py +38 -0
  71. ditto/writers/opendss/equipment/matrix_impedance_fuse_equipment.py +25 -0
  72. ditto/writers/opendss/equipment/matrix_impedance_switch_equipment.py +17 -0
  73. ditto/writers/opendss/equipment/sequence_impedance_branch_equipment.py +47 -0
  74. ditto/writers/opendss/opendss_mapper.py +67 -0
  75. ditto/writers/opendss/write.py +307 -0
  76. nrel_ditto-0.0.7.dist-info/METADATA +30 -0
  77. nrel_ditto-0.0.7.dist-info/RECORD +78 -0
  78. nrel_ditto-0.0.7.dist-info/WHEEL +4 -0
ditto/__init__.py ADDED
@@ -0,0 +1 @@
1
+ __version__ = "0.0.7"
ditto/enumerations.py ADDED
@@ -0,0 +1,18 @@
1
+ from enum import Enum
2
+
3
+
4
+ class OpenDSSFileTypes(str, Enum):
5
+ MASTER_FILE = "Master.dss"
6
+ COORDINATE_FILE = "BusCoords.dss"
7
+ WIRES_FILE = "WireData.dss"
8
+ LINE_GEOMETRIES_FILE = "LineGeometry.dss"
9
+ LINECODES_FILE = "LineCodes.dss"
10
+ SWITCH_CODES_FILE = "SwitchCodes.dss"
11
+ FUSE_CODES_FILE = "FuseCodes.dss"
12
+ TRANSFORMERS_FILE = "Transformers.dss"
13
+ CAPACITORS_FILE = "Capacitors.dss"
14
+ LINES_FILE = "Lines.dss"
15
+ LOADS_FILE = "Loads.dss"
16
+ SWITCH_FILE = "Switches.dss"
17
+ FUSE_FILE = "Fuses.dss"
18
+ REGULATOR_CONTROLLERS_FILE = "RegControllers.dss"
File without changes
@@ -0,0 +1,31 @@
1
+ from ditto.readers.cim_iec_61968_13.components.distribution_bus import DistributionBusMapper
2
+ from ditto.readers.cim_iec_61968_13.components.distribution_capacitor import (
3
+ DistributionCapacitorMapper,
4
+ )
5
+ from ditto.readers.cim_iec_61968_13.components.distribution_load import DistributionLoadMapper
6
+ from ditto.readers.cim_iec_61968_13.components.distribution_transformer import (
7
+ DistributionTransformerMapper,
8
+ )
9
+ from ditto.readers.cim_iec_61968_13.equipment.distribution_transformer_equipment import (
10
+ DistributionTransformerEquipmentMapper,
11
+ )
12
+ from ditto.readers.cim_iec_61968_13.equipment.matrix_branch_equipment import (
13
+ MatrixImpedanceBranchEquipmentMapper,
14
+ )
15
+ from ditto.readers.cim_iec_61968_13.components.matrix_branch import MatrixImpedanceBranchMapper
16
+ from ditto.readers.cim_iec_61968_13.components.distribution_voltage_source import (
17
+ DistributionVoltageSourceMapper,
18
+ )
19
+ from ditto.readers.cim_iec_61968_13.equipment.voltage_source_equipment import (
20
+ VoltageSourceEquipmentMapper,
21
+ )
22
+ from ditto.readers.cim_iec_61968_13.controllers.regulator_controller import (
23
+ RegulatorControllerMapper,
24
+ )
25
+ from ditto.readers.cim_iec_61968_13.components.distribution_regulator import (
26
+ DistributionRegulatorMapper,
27
+ )
28
+
29
+ from ditto.readers.cim_iec_61968_13.components.matrix_impedance_switch import (
30
+ MatrixImpedanceSwitchMapper,
31
+ )
@@ -0,0 +1,8 @@
1
+ from abc import ABC
2
+
3
+ from gdm.distribution import DistributionSystem
4
+
5
+
6
+ class CimMapper(ABC):
7
+ def __init__(self, system: DistributionSystem):
8
+ self.system = system
@@ -0,0 +1,3 @@
1
+ from gdm.distribution.enums import Phase
2
+
3
+ phase_mapper = {"A": Phase.A, "B": Phase.B, "C": Phase.C}
File without changes
@@ -0,0 +1,61 @@
1
+ from gdm.distribution.components import DistributionBus
2
+ from gdm.distribution.common import VoltageLimitSet
3
+ from gdm.quantities import PositiveVoltage
4
+ from infrasys.location import Location
5
+ from gdm.distribution.enums import (
6
+ VoltageTypes,
7
+ LimitType,
8
+ )
9
+
10
+ from ditto.readers.cim_iec_61968_13.cim_mapper import CimMapper
11
+ from ditto.readers.cim_iec_61968_13.common import phase_mapper
12
+
13
+
14
+ class DistributionBusMapper(CimMapper):
15
+ def __init__(self, system):
16
+ super().__init__(system)
17
+
18
+ def parse(self, row):
19
+ phases = row["phase"].split(",")
20
+ self.n_phase = len(phases)
21
+ return DistributionBus(
22
+ name=self.map_name(row),
23
+ coordinate=self.map_coordinate(row),
24
+ rated_voltage=self.map_rated_voltage(row),
25
+ phases=self.map_phases(row),
26
+ voltagelimits=self.map_voltagelimits(row),
27
+ voltage_type=self.map_voltage_type(row),
28
+ )
29
+
30
+ def map_name(self, row):
31
+ return row["bus"]
32
+
33
+ def map_coordinate(self, row):
34
+ X, Y = row["x"], row["y"]
35
+ crs = None
36
+ location = Location(x=X, y=Y, crs=crs)
37
+ return location
38
+
39
+ # Nominal voltage is only defined by transformers
40
+ def map_rated_voltage(self, row):
41
+ return PositiveVoltage(float(row["rated_voltage"]) / 1.732, "volt")
42
+
43
+ def map_phases(self, row):
44
+ phases = row["phase"].split(",")
45
+ all_phases = [phase_mapper[phase] for phase in phases]
46
+ return all_phases
47
+
48
+ def map_voltagelimits(self, row):
49
+ return [
50
+ VoltageLimitSet(
51
+ limit_type=LimitType.MIN,
52
+ value=PositiveVoltage(float(row["rated_voltage"]) * 0.95, "volt"),
53
+ ),
54
+ VoltageLimitSet(
55
+ limit_type=LimitType.MAX,
56
+ value=PositiveVoltage(float(row["rated_voltage"]) * 1.05, "volt"),
57
+ ),
58
+ ]
59
+
60
+ def map_voltage_type(self, row):
61
+ return VoltageTypes.LINE_TO_GROUND.value
@@ -0,0 +1,43 @@
1
+ from gdm.distribution.components import DistributionBus, DistributionCapacitor
2
+
3
+ from ditto.readers.cim_iec_61968_13.equipment.capacitor_equipment import CapacitorEquipmentMapper
4
+ from ditto.readers.cim_iec_61968_13.cim_mapper import CimMapper
5
+ from ditto.readers.cim_iec_61968_13.common import phase_mapper
6
+
7
+
8
+ class DistributionCapacitorMapper(CimMapper):
9
+ def __init__(self, system):
10
+ super().__init__(system)
11
+
12
+ def parse(self, row):
13
+ return DistributionCapacitor(
14
+ name=self.map_name(row),
15
+ bus=self.map_bus(row),
16
+ phases=self.map_phases(row),
17
+ controllers=self.map_controllers(row),
18
+ equipment=self.map_equipment(row),
19
+ )
20
+
21
+ def map_name(self, row):
22
+ return row["capacitor"]
23
+
24
+ def map_bus(self, row):
25
+ bus_name = row["bus"]
26
+ bus = self.system.get_component(component_type=DistributionBus, name=bus_name)
27
+ return bus
28
+
29
+ def map_phases(self, row):
30
+ phases = row["phase"]
31
+ if phases is None:
32
+ phases = ["A", "B", "C"]
33
+ else:
34
+ phases = phases.split(",")
35
+ return [phase_mapper[phase] for phase in phases]
36
+
37
+ def map_controllers(self, row):
38
+ return []
39
+
40
+ def map_equipment(self, row):
41
+ mapper = CapacitorEquipmentMapper(self.system)
42
+ equipment = mapper.parse(row)
43
+ return equipment
@@ -0,0 +1,48 @@
1
+ from gdm.distribution.components import DistributionLoad, DistributionBus
2
+
3
+ from ditto.readers.cim_iec_61968_13.equipment.load_equipment import LoadEquipmentMapper
4
+ from ditto.readers.cim_iec_61968_13.cim_mapper import CimMapper
5
+ from ditto.readers.cim_iec_61968_13.common import phase_mapper
6
+
7
+
8
+ class DistributionLoadMapper(CimMapper):
9
+ def __init__(self, system):
10
+ super().__init__(system)
11
+
12
+ def parse(self, row):
13
+ return DistributionLoad(
14
+ name=self.map_name(row),
15
+ bus=self.map_bus(row),
16
+ phases=self.map_phases(row),
17
+ equipment=self.map_equipment(row),
18
+ )
19
+
20
+ def map_name(self, row):
21
+ return row["load"]
22
+
23
+ def map_bus(self, row):
24
+ bus_name = row["bus"]
25
+ bus = self.system.get_component(component_type=DistributionBus, name=bus_name)
26
+ return bus
27
+
28
+ def map_phases(self, row):
29
+ bus_name = row["bus"]
30
+ bus = self.system.get_component(component_type=DistributionBus, name=bus_name)
31
+ phases = row["phase"]
32
+
33
+ if phases is None:
34
+ phases = ["A", "B", "C"]
35
+ else:
36
+ phases = phases.split(",")
37
+ phases = [phase_mapper[phase] for phase in phases]
38
+
39
+ if row["grounded"] == "false" and len(phases) == 1:
40
+ diff = list(set(bus.phases).difference(phases))
41
+ if diff:
42
+ phases.append(sorted(diff)[0].value)
43
+ return phases
44
+
45
+ def map_equipment(self, row):
46
+ mapper = LoadEquipmentMapper(self.system)
47
+ equipment = mapper.parse(row)
48
+ return equipment
@@ -0,0 +1,56 @@
1
+ from gdm.distribution.components import DistributionBus, DistributionRegulator
2
+ from gdm.distribution.controllers import RegulatorController
3
+ from gdm.distribution.enums import Phase
4
+
5
+ from ditto.readers.cim_iec_61968_13.equipment.distribution_transformer_equipment import (
6
+ DistributionTransformerEquipmentMapper,
7
+ )
8
+
9
+ from ditto.readers.cim_iec_61968_13.cim_mapper import CimMapper
10
+ from ditto.readers.cim_iec_61968_13.common import phase_mapper
11
+
12
+
13
+ class DistributionRegulatorMapper(CimMapper):
14
+ def __init__(self, system):
15
+ super().__init__(system)
16
+
17
+ def parse(self, row):
18
+ return DistributionRegulator(
19
+ name=self.map_name(row),
20
+ buses=self.map_bus(row),
21
+ equipment=self.map_equipment(row),
22
+ winding_phases=self.map_winding_phases(row),
23
+ controllers=self.map_controllers(row),
24
+ )
25
+
26
+ def map_name(self, row):
27
+ return row["xfmr"]
28
+
29
+ def map_winding_phases(self, row):
30
+ if "wdg_1_phase" in row:
31
+ phase_1 = [phase_mapper[phs] for phs in row["wdg_1_phase"].replace("N", "")]
32
+ else:
33
+ phase_1 = [Phase.A, Phase.B, Phase.C]
34
+
35
+ if "wdg_2_phase" in row:
36
+ phase_2 = [phase_mapper[phs] for phs in row["wdg_2_phase"].replace("N", "")]
37
+ else:
38
+ phase_2 = [Phase.A, Phase.B, Phase.C]
39
+
40
+ return [phase_1, phase_2]
41
+
42
+ def map_bus(self, row):
43
+ bus_1_name = row["bus_1"]
44
+ bus_2_name = row["bus_2"]
45
+ bus_1 = self.system.get_component(DistributionBus, bus_1_name)
46
+ bus_2 = self.system.get_component(DistributionBus, bus_2_name)
47
+ return [bus_1, bus_2]
48
+
49
+ def map_equipment(self, row):
50
+ xfmr_equip_mapper = DistributionTransformerEquipmentMapper(self.system)
51
+ xfmr_equip = xfmr_equip_mapper.parse(row)
52
+ return xfmr_equip
53
+
54
+ def map_controllers(self, row):
55
+ reg_controllers = self.system.get_component(RegulatorController, row["xfmr"])
56
+ return [reg_controllers]
@@ -0,0 +1,38 @@
1
+ from gdm.distribution.components import DistributionBus, DistributionTransformer
2
+ from gdm.distribution.enums import Phase
3
+
4
+ from ditto.readers.cim_iec_61968_13.equipment.distribution_transformer_equipment import (
5
+ DistributionTransformerEquipmentMapper,
6
+ )
7
+ from ditto.readers.cim_iec_61968_13.cim_mapper import CimMapper
8
+
9
+
10
+ class DistributionTransformerMapper(CimMapper):
11
+ def __init__(self, system):
12
+ super().__init__(system)
13
+
14
+ def parse(self, row):
15
+ return DistributionTransformer(
16
+ name=self.map_name(row),
17
+ buses=self.map_bus(row),
18
+ equipment=self.map_equipment(row),
19
+ winding_phases=self.map_winding_phases(row),
20
+ )
21
+
22
+ def map_name(self, row):
23
+ return row["xfmr"]
24
+
25
+ def map_winding_phases(self, row):
26
+ return [[Phase.A, Phase.B, Phase.C], [Phase.A, Phase.B, Phase.C]]
27
+
28
+ def map_bus(self, row):
29
+ bus_1_name = row["bus_1"]
30
+ bus_2_name = row["bus_2"]
31
+ bus_1 = self.system.get_component(DistributionBus, bus_1_name)
32
+ bus_2 = self.system.get_component(DistributionBus, bus_2_name)
33
+ return [bus_1, bus_2]
34
+
35
+ def map_equipment(self, row):
36
+ xfmr_equip_mapper = DistributionTransformerEquipmentMapper(self.system)
37
+ xfmr_equip = xfmr_equip_mapper.parse(row)
38
+ return xfmr_equip
@@ -0,0 +1,36 @@
1
+ from gdm.distribution.components import DistributionBus, DistributionVoltageSource
2
+
3
+ from ditto.readers.cim_iec_61968_13.equipment.voltage_source_equipment import (
4
+ VoltageSourceEquipmentMapper,
5
+ )
6
+ from ditto.readers.cim_iec_61968_13.cim_mapper import CimMapper
7
+ from ditto.readers.cim_iec_61968_13.common import phase_mapper
8
+
9
+
10
+ class DistributionVoltageSourceMapper(CimMapper):
11
+ def __init__(self, system):
12
+ super().__init__(system)
13
+
14
+ def parse(self, row):
15
+ return DistributionVoltageSource(
16
+ name=self.map_name(row),
17
+ bus=self.map_bus(row),
18
+ phases=self.map_phases(),
19
+ equipment=self.map_equipment(row),
20
+ )
21
+
22
+ def map_name(self, row):
23
+ return row["source"]
24
+
25
+ def map_bus(self, row):
26
+ bus_name = row["bus"]
27
+ bus = self.system.get_component(component_type=DistributionBus, name=bus_name)
28
+ return bus
29
+
30
+ def map_phases(self):
31
+ return [phase_mapper[phase] for phase in ["A", "B", "C"]]
32
+
33
+ def map_equipment(self, row):
34
+ mapper = VoltageSourceEquipmentMapper(self.system)
35
+ equipment = mapper.parse(row)
36
+ return equipment
@@ -0,0 +1,42 @@
1
+ from gdm.distribution.components import MatrixImpedanceBranch, DistributionBus
2
+ from gdm.distribution.equipment import MatrixImpedanceBranchEquipment
3
+ from gdm.quantities import PositiveDistance
4
+
5
+ from ditto.readers.cim_iec_61968_13.cim_mapper import CimMapper
6
+ from ditto.readers.cim_iec_61968_13.common import phase_mapper
7
+
8
+
9
+ class MatrixImpedanceBranchMapper(CimMapper):
10
+ def __init__(self, system):
11
+ super().__init__(system)
12
+
13
+ def parse(self, row):
14
+ return MatrixImpedanceBranch(
15
+ name=self.map_name(row),
16
+ buses=self.map_buses(row),
17
+ length=self.map_length(row),
18
+ phases=self.map_phases(row),
19
+ equipment=self.map_equipment(row),
20
+ )
21
+
22
+ def map_name(self, row):
23
+ return row["line"]
24
+
25
+ def map_buses(self, row):
26
+ bus_1_name = row["bus_1"]
27
+ bus_1 = self.system.get_component(DistributionBus, bus_1_name)
28
+ bus_2_name = row["bus_2"]
29
+ bus_2 = self.system.get_component(DistributionBus, bus_2_name)
30
+ return [bus_1, bus_2]
31
+
32
+ def map_length(self, row):
33
+ length = float(row["length"])
34
+ return PositiveDistance(length, "m")
35
+
36
+ def map_phases(self, row):
37
+ phases = row["phases_1"].split(",")
38
+ return [phase_mapper[phase] for phase in phases]
39
+
40
+ def map_equipment(self, row):
41
+ equipment = self.system.get_component(MatrixImpedanceBranchEquipment, row["line_code"])
42
+ return equipment
@@ -0,0 +1,63 @@
1
+ from gdm.distribution.components import MatrixImpedanceSwitch, DistributionBus
2
+ from gdm.quantities import PositiveDistance
3
+ from gdm.distribution.equipment import (
4
+ MatrixImpedanceSwitchEquipment,
5
+ MatrixImpedanceBranchEquipment,
6
+ )
7
+
8
+ from ditto.readers.cim_iec_61968_13.cim_mapper import CimMapper
9
+
10
+
11
+ class MatrixImpedanceSwitchMapper(CimMapper):
12
+ def __init__(self, system):
13
+ super().__init__(system)
14
+
15
+ def parse(self, row):
16
+ self.bus_2 = self.system.get_component(DistributionBus, row["bus_2"])
17
+ self.n_phases = len(self.bus_2.phases)
18
+
19
+ return MatrixImpedanceSwitch(
20
+ name=self.map_name(row),
21
+ buses=self.map_buses(row),
22
+ length=PositiveDistance(1, "m"),
23
+ phases=self.map_phases(row),
24
+ equipment=self.map_equipment(row),
25
+ is_closed=self.map_is_closed(row),
26
+ )
27
+
28
+ def map_is_closed(self, row):
29
+ state = True if row["is_open"] == "false" else False
30
+ return [state] * 3
31
+
32
+ def map_name(self, row):
33
+ return row["switch_name"]
34
+
35
+ def map_buses(self, row):
36
+ bus_1_name = row["bus_1"]
37
+ bus_1 = self.system.get_component(DistributionBus, bus_1_name)
38
+ bus_2_name = row["bus_2"]
39
+ bus_2 = self.system.get_component(DistributionBus, bus_2_name)
40
+ return [bus_1, bus_2]
41
+
42
+ def map_length(self, row):
43
+ length = float(row["length"])
44
+ return PositiveDistance(length, "m")
45
+
46
+ def map_phases(self, row):
47
+ return self.bus_2.phases
48
+
49
+ def map_equipment(self, row):
50
+ equipments: list[MatrixImpedanceBranchEquipment] = list(
51
+ self.system.get_components(
52
+ MatrixImpedanceBranchEquipment,
53
+ filter_func=lambda x: len(x.r_matrix) == self.n_phases,
54
+ )
55
+ )
56
+ if len(equipments):
57
+ model_dict = equipments[0].model_dump()
58
+ equipment = MatrixImpedanceSwitchEquipment(**model_dict)
59
+ return equipment
60
+ else:
61
+ raise Exception(
62
+ "No Matrix Impedance Branch Equipment found with {} phases".format(self.n_phases)
63
+ )
File without changes
@@ -0,0 +1,77 @@
1
+ from gdm.distribution.controllers import RegulatorController
2
+ from gdm.distribution.components import DistributionBus
3
+ from gdm.quantities import PositiveVoltage
4
+ from infrasys.quantities import Time
5
+
6
+ from ditto.readers.cim_iec_61968_13.cim_mapper import CimMapper
7
+ from ditto.readers.cim_iec_61968_13.common import phase_mapper
8
+
9
+
10
+ class RegulatorControllerMapper(CimMapper):
11
+ def __init__(self, system):
12
+ super().__init__(system)
13
+
14
+ def parse(self, row):
15
+ return RegulatorController(
16
+ name=self.map_name(row),
17
+ delay=self.map_delay(row),
18
+ v_setpoint=self.map_vsetpoint(row),
19
+ min_v_limit=self.min_v_limit(row),
20
+ max_v_limit=self.max_v_limit(row),
21
+ pt_ratio=self.map_pt_ratio(row),
22
+ use_ldc=self.map_use_ldc(row),
23
+ is_reversible=self.map_is_reversible(row),
24
+ ldc_R=self.map_ldc_R(row),
25
+ ldc_X=self.map_ldc_X(row),
26
+ ct_primary=self.map_ct_primary(row),
27
+ max_step=self.map_max_step(row),
28
+ bandwidth=self.map_bandwidth(row),
29
+ controlled_bus=self.map_controlled_bus(row),
30
+ controlled_phase=self.map_controlled_phase(row),
31
+ )
32
+
33
+ def map_name(self, row):
34
+ return row["regulator"]
35
+
36
+ def map_use_ldc(self, row):
37
+ return row["ldc"]
38
+
39
+ def map_is_reversible(self, row):
40
+ return row["reversible"]
41
+
42
+ def map_controlled_bus(self, row):
43
+ bus_name = row["bus"]
44
+ return self.system.get_component(component_type=DistributionBus, name=bus_name)
45
+
46
+ def map_controlled_phase(self, row):
47
+ return phase_mapper[row["phase"]]
48
+
49
+ def map_delay(self, row):
50
+ return Time(float(row["initial_delay"]), "second")
51
+
52
+ def map_vsetpoint(self, row):
53
+ return PositiveVoltage(float(row["target"]), "volt")
54
+
55
+ def min_v_limit(self, row):
56
+ return PositiveVoltage(float(row["min_voltage"]), "volt")
57
+
58
+ def max_v_limit(self, row):
59
+ return PositiveVoltage(float(row["max_voltage"]), "volt")
60
+
61
+ def map_pt_ratio(self, row):
62
+ return float(row["pt_ratio"])
63
+
64
+ def map_ldc_R(self, row):
65
+ return float(row["line_drop_r"])
66
+
67
+ def map_ldc_X(self, row):
68
+ return float(row["line_drop_x"])
69
+
70
+ def map_ct_primary(self, row):
71
+ return float(row["ct_rating"])
72
+
73
+ def map_max_step(self, row):
74
+ return 5
75
+
76
+ def map_bandwidth(self, row):
77
+ return PositiveVoltage(float(row["deadband"]), "volt")
File without changes
@@ -0,0 +1,94 @@
1
+ from gdm.quantities import PositiveReactivePower, PositiveResistance, PositiveReactance
2
+ from gdm.distribution.equipment.phase_capacitor_equipment import PhaseCapacitorEquipment
3
+ from gdm.distribution.equipment.capacitor_equipment import CapacitorEquipment
4
+ from gdm.distribution.enums import ConnectionType, VoltageTypes
5
+ from gdm.quantities import PositiveVoltage
6
+
7
+ from ditto.readers.cim_iec_61968_13.cim_mapper import CimMapper
8
+
9
+
10
+ class CapacitorEquipmentMapper(CimMapper):
11
+ def __init__(self, system):
12
+ super().__init__(system)
13
+
14
+ def parse(self, row):
15
+ phases = row["phase"]
16
+ if phases is None:
17
+ self.phases = ["A", "B", "C"]
18
+ else:
19
+ self.phases = phases.split(",")
20
+
21
+ return CapacitorEquipment(
22
+ name=self.map_name(row),
23
+ phase_capacitors=self.map_phase_capacitors(row),
24
+ connection_type=self.map_connection_type(row),
25
+ rated_voltage=self.map_rated_voltage(row),
26
+ voltage_type=self.map_voltage_type(),
27
+ )
28
+
29
+ def map_name(self, row):
30
+ return row["capacitor"] + "_equipment"
31
+
32
+ def map_voltage_type(self):
33
+ n_phases = len(self.phases)
34
+ return VoltageTypes.LINE_TO_LINE if n_phases == 3 else VoltageTypes.LINE_TO_LINE
35
+
36
+ def map_rated_voltage(self, row):
37
+ return PositiveVoltage(float(row["rated_voltage"]), "volt")
38
+
39
+ def map_phase_capacitors(self, row):
40
+ phase_loads = []
41
+ n_phases = len(self.phases)
42
+ voltage = (
43
+ float(row["rated_voltage"]) if n_phases == 3 else float(row["rated_voltage"]) / 1.732
44
+ )
45
+ b1 = float(row["b1"])
46
+ var = voltage**2 * b1
47
+ var_per_phase = var / n_phases
48
+ for phase in self.phases:
49
+ if b1 > 0:
50
+ mapper = PhaseCapacitorEquipmentMapper(self.system)
51
+ phase_load = mapper.parse(row, var_per_phase, phase)
52
+ phase_loads.append(phase_load)
53
+ return phase_loads
54
+
55
+ def map_connection_type(self, row):
56
+ return ConnectionType.DELTA if row["conn"] == "D" else ConnectionType.STAR
57
+
58
+
59
+ class PhaseCapacitorEquipmentMapper(CimMapper):
60
+ def __init__(self, system):
61
+ super().__init__(system)
62
+
63
+ def parse(self, row, var_per_phase, phase):
64
+ return PhaseCapacitorEquipment(
65
+ name=self.map_name(row, phase),
66
+ resistance=self.map_resistance(),
67
+ reactance=self.map_reactance(),
68
+ rated_reactive_power=self.map_rated_reactive_power(var_per_phase),
69
+ num_banks_on=self.map_num_banks_on(row),
70
+ num_banks=self.map_num_banks(row),
71
+ )
72
+
73
+ def map_name(self, row, phase):
74
+ return row["capacitor"] + "_phase_capacitor_equipment_" + phase
75
+
76
+ # Resistance and Reactance not included for capacitors
77
+ def map_resistance(self):
78
+ return PositiveResistance(0, "ohm")
79
+
80
+ # Resistance and Reactance not included for capacitors
81
+ def map_reactance(self):
82
+ return PositiveReactance(0, "ohm")
83
+
84
+ # TODO: This doesn't make sense. We should have fixed and switched values
85
+ def map_rated_reactive_power(self, var_per_phase):
86
+ return PositiveReactivePower(var_per_phase, "var")
87
+
88
+ # TODO: This doesn't make sense. This should indicate if the bank is switched
89
+ def map_num_banks_on(self, row):
90
+ return row["steps"]
91
+
92
+ # TODO: This doesn't make sense. This should indicate how many banks are switched
93
+ def map_num_banks(self, row):
94
+ return row["steps"]