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.
- ditto/__init__.py +1 -0
- ditto/enumerations.py +18 -0
- ditto/readers/__init__.py +0 -0
- ditto/readers/cim_iec_61968_13/__init__.py +31 -0
- ditto/readers/cim_iec_61968_13/cim_mapper.py +8 -0
- ditto/readers/cim_iec_61968_13/common.py +3 -0
- ditto/readers/cim_iec_61968_13/components/__init__.py +0 -0
- ditto/readers/cim_iec_61968_13/components/distribution_bus.py +61 -0
- ditto/readers/cim_iec_61968_13/components/distribution_capacitor.py +43 -0
- ditto/readers/cim_iec_61968_13/components/distribution_load.py +48 -0
- ditto/readers/cim_iec_61968_13/components/distribution_regulator.py +56 -0
- ditto/readers/cim_iec_61968_13/components/distribution_transformer.py +38 -0
- ditto/readers/cim_iec_61968_13/components/distribution_voltage_source.py +36 -0
- ditto/readers/cim_iec_61968_13/components/matrix_branch.py +42 -0
- ditto/readers/cim_iec_61968_13/components/matrix_impedance_switch.py +63 -0
- ditto/readers/cim_iec_61968_13/controllers/__init__.py +0 -0
- ditto/readers/cim_iec_61968_13/controllers/regulator_controller.py +77 -0
- ditto/readers/cim_iec_61968_13/equipment/__init__.py +0 -0
- ditto/readers/cim_iec_61968_13/equipment/capacitor_equipment.py +94 -0
- ditto/readers/cim_iec_61968_13/equipment/distribution_transformer_equipment.py +64 -0
- ditto/readers/cim_iec_61968_13/equipment/load_equipment.py +104 -0
- ditto/readers/cim_iec_61968_13/equipment/matrix_branch_equipment.py +56 -0
- ditto/readers/cim_iec_61968_13/equipment/voltage_source_equipment.py +62 -0
- ditto/readers/cim_iec_61968_13/equipment/winding_equipment.py +115 -0
- ditto/readers/cim_iec_61968_13/length_units.py +26 -0
- ditto/readers/cim_iec_61968_13/queries.py +674 -0
- ditto/readers/cim_iec_61968_13/reader.py +202 -0
- ditto/readers/opendss/__init__.py +0 -0
- ditto/readers/opendss/common.py +138 -0
- ditto/readers/opendss/components/__init__.py +0 -0
- ditto/readers/opendss/components/branches.py +405 -0
- ditto/readers/opendss/components/buses.py +60 -0
- ditto/readers/opendss/components/cables.py +83 -0
- ditto/readers/opendss/components/capacitors.py +109 -0
- ditto/readers/opendss/components/conductors.py +50 -0
- ditto/readers/opendss/components/fuses.py +0 -0
- ditto/readers/opendss/components/loads.py +127 -0
- ditto/readers/opendss/components/loadshapes.py +141 -0
- ditto/readers/opendss/components/pv_systems.py +136 -0
- ditto/readers/opendss/components/sources.py +128 -0
- ditto/readers/opendss/components/storage.py +0 -0
- ditto/readers/opendss/components/transformers.py +231 -0
- ditto/readers/opendss/controllers/__init__.py +0 -0
- ditto/readers/opendss/controllers/regulators.py +0 -0
- ditto/readers/opendss/graph_utils.py +201 -0
- ditto/readers/opendss/reader.py +124 -0
- ditto/readers/reader.py +28 -0
- ditto/writers/__init__.py +0 -0
- ditto/writers/abstract_writer.py +12 -0
- ditto/writers/opendss/__init__.py +34 -0
- ditto/writers/opendss/components/__init__.py +0 -0
- ditto/writers/opendss/components/distribution_branch.py +39 -0
- ditto/writers/opendss/components/distribution_bus.py +39 -0
- ditto/writers/opendss/components/distribution_capacitor.py +67 -0
- ditto/writers/opendss/components/distribution_load.py +108 -0
- ditto/writers/opendss/components/distribution_regulator.py +57 -0
- ditto/writers/opendss/components/distribution_transformer.py +54 -0
- ditto/writers/opendss/components/distribution_vsource.py +60 -0
- ditto/writers/opendss/components/geometry_branch.py +17 -0
- ditto/writers/opendss/components/matrix_impedance_branch.py +17 -0
- ditto/writers/opendss/components/matrix_impedance_fuse.py +18 -0
- ditto/writers/opendss/components/matrix_impedance_switch.py +21 -0
- ditto/writers/opendss/components/sequence_impedance_branch.py +17 -0
- ditto/writers/opendss/controllers/__init__.py +0 -0
- ditto/writers/opendss/controllers/distribution_regulator_controller.py +64 -0
- ditto/writers/opendss/equipment/__init__.py +0 -0
- ditto/writers/opendss/equipment/bare_conductor_equipment.py +46 -0
- ditto/writers/opendss/equipment/distribution_transformer_equipment.py +84 -0
- ditto/writers/opendss/equipment/geometry_branch_equipment.py +58 -0
- ditto/writers/opendss/equipment/matrix_impedance_branch_equipment.py +38 -0
- ditto/writers/opendss/equipment/matrix_impedance_fuse_equipment.py +25 -0
- ditto/writers/opendss/equipment/matrix_impedance_switch_equipment.py +17 -0
- ditto/writers/opendss/equipment/sequence_impedance_branch_equipment.py +47 -0
- ditto/writers/opendss/opendss_mapper.py +67 -0
- ditto/writers/opendss/write.py +307 -0
- nrel_ditto-0.0.7.dist-info/METADATA +30 -0
- nrel_ditto-0.0.7.dist-info/RECORD +78 -0
- 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
|
+
)
|
|
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"]
|