Skip to content

Commit 4c5c8d6

Browse files
authored
Merge pull request #24 from NREL-Distribution-Suites/al/erad_v1
minor updates
2 parents 08c4131 + 532b953 commit 4c5c8d6

6 files changed

Lines changed: 76 additions & 24 deletions

File tree

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "NREL-erad"
7-
version="0.1.2"
7+
version="0.1.3"
88
description = "Graph based scalable tool for computing energy resilience metrics for distribution systems."
99
readme = "README.md"
1010
requires-python = ">=3.11"
@@ -35,7 +35,7 @@ classifiers = [
3535
"Programming Language :: Python :: 3.8",
3636
]
3737
dependencies = [
38-
"grid-data-models~=2.1.3",
38+
"grid-data-models~=2.1.4",
3939
"gdmloader",
4040
"geopandas",
4141
"requests",

src/erad/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.0.1"
1+
__version__ = "0.0.2"

src/erad/constants.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@
3434
AssetTypes.transmission_tower: 0.0,
3535
AssetTypes.distribution_poles: 0.0,
3636
AssetTypes.transmission_overhead_lines: 30.0,
37-
AssetTypes.distribution_overhead_lines: 10.0,
37+
AssetTypes.distribution_overhead_lines: 0.0,
3838
AssetTypes.transformer_mad_mount: 0.3,
39-
AssetTypes.transformer_pole_mount: 6.0,
39+
AssetTypes.transformer_pole_mount: 4.0,
4040
AssetTypes.transmission_junction_box: -1.0,
4141
AssetTypes.distribution_junction_box: -1.0,
42-
AssetTypes.switch: 6.0,
42+
AssetTypes.switch: 4.0,
4343
}
4444

4545
ASSET_TYPES = (

src/erad/default_fragility_curves/default_flood_depth.py

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,33 @@
33
import erad.models.fragility_curve as frag
44
from erad.enums import AssetTypes
55

6+
7+
moderate_mu_meters = {
8+
"Class 1": 1.524,
9+
"Class 2": 1.463,
10+
"Class 3": 1.372,
11+
"Class 4": 1.280,
12+
"Class 5": 1.219,
13+
"Class 6": 1.128,
14+
"Class 7": 1.067,
15+
"Class 8": 0.975,
16+
"Class 9": 0.914,
17+
"Class 10": 0.853,
18+
}
19+
20+
dispersion_values = {
21+
"Class 1": 0.45,
22+
"Class 2": 0.45,
23+
"Class 3": 0.50,
24+
"Class 4": 0.50,
25+
"Class 5": 0.50,
26+
"Class 6": 0.50,
27+
"Class 7": 0.55,
28+
"Class 8": 0.55,
29+
"Class 9": 0.60,
30+
"Class 10": 0.60,
31+
}
32+
633
DEFAULT_FLOOD_DEPTH_FRAGILITY_CURVES = frag.HazardFragilityCurves(
734
asset_state_param="flood_depth",
835
curves=[
@@ -17,63 +44,71 @@
1744
asset_type=AssetTypes.battery_storage,
1845
prob_function=frag.ProbabilityFunction(
1946
distribution="lognorm",
20-
parameters=[Distance(0.35, "m"), Distance(0.50, "m"), 1 / 0.35],
47+
parameters=[Distance(0.4, "m"), Distance(0.01, "m"), 0.7],
2148
),
2249
),
2350
frag.FragilityCurve(
2451
asset_type=AssetTypes.distribution_junction_box,
2552
prob_function=frag.ProbabilityFunction(
2653
distribution="lognorm",
27-
parameters=[Distance(0.40, "m"), Distance(1.0, "m"), 1 / 0.40],
54+
parameters=[Distance(0.8, "m"), Distance(2.0, "m"), 1 / 0.8],
2855
),
2956
),
3057
frag.FragilityCurve(
3158
asset_type=AssetTypes.distribution_overhead_lines,
3259
prob_function=frag.ProbabilityFunction(
3360
distribution="lognorm",
34-
parameters=[Distance(0.35, "m"), Distance(1.0, "m"), 1 / 0.35],
61+
parameters=[
62+
Distance(dispersion_values["Class 4"], "m"),
63+
Distance(0.01, "m"),
64+
moderate_mu_meters["Class 4"],
65+
],
3566
),
3667
),
3768
frag.FragilityCurve(
3869
asset_type=AssetTypes.distribution_poles,
3970
prob_function=frag.ProbabilityFunction(
4071
distribution="lognorm",
41-
parameters=[Distance(0.35, "m"), Distance(1.0, "m"), 1 / 0.35],
72+
parameters=[
73+
Distance(dispersion_values["Class 4"], "m"),
74+
Distance(0.01, "m"),
75+
moderate_mu_meters["Class 4"],
76+
],
4277
),
4378
),
4479
frag.FragilityCurve(
4580
asset_type=AssetTypes.distribution_underground_cables,
4681
prob_function=frag.ProbabilityFunction(
4782
distribution="lognorm",
48-
parameters=[Distance(0.8, "m"), Distance(1.0, "m"), 1 / 0.8],
83+
parameters=[Distance(0.8, "m"), Distance(2.0, "m"), 1 / 0.8],
4984
),
5085
),
5186
frag.FragilityCurve(
5287
asset_type=AssetTypes.solar_panels,
5388
prob_function=frag.ProbabilityFunction(
5489
distribution="lognorm",
55-
parameters=[Distance(0.35, "m"), Distance(0.6, "m"), 1 / 0.35],
90+
parameters=[Distance(0.4, "m"), Distance(0.01, "m"), 0.8],
5691
),
5792
),
5893
frag.FragilityCurve(
5994
asset_type=AssetTypes.substation,
6095
prob_function=frag.ProbabilityFunction(
6196
distribution="lognorm",
62-
parameters=[Distance(0.40, "m"), Distance(1.0, "m"), 1 / 0.4],
97+
parameters=[Distance(0.01, "m"), Distance(0.01, "m"), 1],
6398
),
6499
),
65100
frag.FragilityCurve(
66101
asset_type=AssetTypes.transformer_mad_mount,
67102
prob_function=frag.ProbabilityFunction(
68103
distribution="lognorm",
69-
parameters=[Distance(0.35, "m"), Distance(0.6, "m"), 1 / 0.35],
104+
parameters=[Distance(0.5, "m"), Distance(0.01, "m"), 0.9],
70105
),
71106
),
72107
frag.FragilityCurve(
73108
asset_type=AssetTypes.transformer_pole_mount,
74109
prob_function=frag.ProbabilityFunction(
75110
distribution="lognorm",
76-
parameters=[Distance(0.30, "m"), Distance(0.8, "m"), 1 / 0.3],
111+
parameters=[Distance(0.5, "m"), Distance(0.01, "m"), 1.2],
77112
),
78113
),
79114
frag.FragilityCurve(

src/erad/models/fragility_curve.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,16 @@ def example(cls) -> "HazardFragilityCurves":
7474
)
7575

7676
def plot(
77-
self, file_path: Path, x_min: float = 0, x_max: float = None, number_of_points: int = 100
77+
self,
78+
file_path: Path | None = None,
79+
x_min: float = 0,
80+
x_max: float = 4,
81+
number_of_points: int = 100,
7882
):
7983
"""Plot the fragility curves."""
80-
file_path = Path(file_path)
81-
assert file_path.suffix.lower() == ".html", "File path should be an HTML file"
84+
if file_path is not None:
85+
file_path = Path(file_path)
86+
assert file_path.suffix.lower() == ".html", "File path should be an HTML file"
8287

8388
if not self.curves:
8489
raise ValueError("No curves to plot")
@@ -113,4 +118,5 @@ def plot(
113118
)
114119

115120
fig.show()
116-
fig.write_html(file_path)
121+
if file_path:
122+
fig.write_html(file_path)

src/erad/systems/asset_system.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,14 @@ def get_undirected_graph(self):
7070
return g
7171

7272
@classmethod
73-
def from_gdm(cls, dist_system: DistributionSystem) -> "AssetSystem":
73+
def from_gdm(
74+
cls, dist_system: DistributionSystem, flip_coordinates: bool = False
75+
) -> "AssetSystem":
7476
"""Create a AssetSystem from a DistributionSystem."""
7577
asset_map = AssetSystem.map_asets(dist_system)
7678
# list_of_assets = AssetSystem._build_assets(asset_map)
7779
system = AssetSystem(auto_add_composed_components=True)
78-
list_of_assets = system._build_assets(asset_map)
80+
list_of_assets = system._build_assets(asset_map, flip_coordinates)
7981
system.add_components(*list_of_assets)
8082
return system
8183

@@ -177,10 +179,14 @@ def _prepopulate_bus_assets(
177179
self,
178180
asset_map: dict[AssetTypes : list[gdc.DistributionComponentBase]],
179181
list_of_assets: dict[str, Asset],
182+
flip_coordinates: bool = False,
180183
):
181184
for asset_type, components in asset_map.items():
182185
for component in components:
183-
lat, long = AssetSystem._get_component_coordinate(component)
186+
if flip_coordinates:
187+
long, lat = AssetSystem._get_component_coordinate(component)
188+
else:
189+
lat, long = AssetSystem._get_component_coordinate(component)
184190
if isinstance(component, gdc.DistributionBus):
185191
list_of_assets[str(component.uuid)] = Asset(
186192
name=component.name,
@@ -197,21 +203,26 @@ def _prepopulate_bus_assets(
197203
def _build_assets(
198204
self,
199205
asset_map: dict[AssetTypes : list[gdc.DistributionComponentBase]],
206+
flip_coordinates: bool = False,
200207
) -> list[Asset]:
201208
list_of_assets: dict[str, Asset] = {}
202209

203-
self._prepopulate_bus_assets(asset_map, list_of_assets)
210+
self._prepopulate_bus_assets(asset_map, list_of_assets, flip_coordinates)
204211

205212
for asset_type, components in asset_map.items():
206213
for component in components:
207214
if not isinstance(component, gdc.DistributionBus):
208-
lat, long = AssetSystem._get_component_coordinate(component)
215+
if flip_coordinates:
216+
long, lat = AssetSystem._get_component_coordinate(component)
217+
else:
218+
lat, long = AssetSystem._get_component_coordinate(component)
209219
if hasattr(component, "buses"):
210220
connections = [c.uuid for c in component.buses]
211221
elif hasattr(component, "bus"):
212222
connections = [component.bus.uuid]
213223
else:
214224
connections = []
225+
215226
list_of_assets[str(component.uuid)] = Asset(
216227
name=component.name,
217228
connections=connections,

0 commit comments

Comments
 (0)