NREL-erad 0.1.0__py3-none-any.whl → 1.0.0__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.
- erad/__init__.py +1 -1
- erad/constants.py +20 -68
- erad/cypher_queries/load_data_v1.cypher +212 -0
- erad/data/World_Earthquakes_1960_2016.csv +23410 -0
- erad/db/__init__.py +0 -0
- erad/db/assets/__init__.py +0 -0
- erad/db/assets/critical_infras.py +171 -0
- erad/db/assets/distribution_lines.py +101 -0
- erad/db/credential_model.py +20 -0
- erad/db/disaster_input_model.py +23 -0
- erad/db/inject_earthquake.py +52 -0
- erad/db/inject_flooding.py +53 -0
- erad/db/neo4j_.py +162 -0
- erad/db/utils.py +14 -0
- erad/exceptions.py +68 -0
- erad/metrics/__init__.py +0 -0
- erad/metrics/check_microgrid.py +208 -0
- erad/metrics/metric.py +178 -0
- erad/programs/__init__.py +0 -0
- erad/programs/backup.py +62 -0
- erad/programs/microgrid.py +45 -0
- erad/scenarios/__init__.py +0 -0
- erad/scenarios/abstract_scenario.py +103 -0
- erad/scenarios/common.py +93 -0
- erad/scenarios/earthquake_scenario.py +161 -0
- erad/scenarios/fire_scenario.py +160 -0
- erad/scenarios/flood_scenario.py +494 -0
- erad/scenarios/flows.csv +671 -0
- erad/scenarios/utilities.py +76 -0
- erad/scenarios/wind_scenario.py +89 -0
- erad/utils/__init__.py +0 -0
- erad/utils/ditto_utils.py +252 -0
- erad/utils/hifld_utils.py +147 -0
- erad/utils/opendss_utils.py +357 -0
- erad/utils/overpass.py +76 -0
- erad/utils/util.py +178 -0
- erad/visualization/__init__.py +0 -0
- erad/visualization/plot_graph.py +218 -0
- {nrel_erad-0.1.0.dist-info → nrel_erad-1.0.0.dist-info}/METADATA +39 -29
- nrel_erad-1.0.0.dist-info/RECORD +42 -0
- {nrel_erad-0.1.0.dist-info → nrel_erad-1.0.0.dist-info}/WHEEL +1 -2
- {nrel_erad-0.1.0.dist-info → nrel_erad-1.0.0.dist-info}/licenses/LICENSE.txt +28 -28
- erad/default_fragility_curves/__init__.py +0 -15
- erad/default_fragility_curves/default_fire_boundary_dist.py +0 -94
- erad/default_fragility_curves/default_flood_depth.py +0 -108
- erad/default_fragility_curves/default_flood_velocity.py +0 -101
- erad/default_fragility_curves/default_fragility_curves.py +0 -23
- erad/default_fragility_curves/default_peak_ground_acceleration.py +0 -163
- erad/default_fragility_curves/default_peak_ground_velocity.py +0 -94
- erad/default_fragility_curves/default_wind_speed.py +0 -94
- erad/enums.py +0 -40
- erad/gdm_mapping.py +0 -83
- erad/models/__init__.py +0 -1
- erad/models/asset.py +0 -287
- erad/models/asset_mapping.py +0 -20
- erad/models/fragility_curve.py +0 -116
- erad/models/hazard/__init__.py +0 -5
- erad/models/hazard/base_models.py +0 -12
- erad/models/hazard/common.py +0 -26
- erad/models/hazard/earthquake.py +0 -93
- erad/models/hazard/flood.py +0 -83
- erad/models/hazard/wild_fire.py +0 -121
- erad/models/hazard/wind.py +0 -143
- erad/models/probability.py +0 -73
- erad/probability_builder.py +0 -35
- erad/quantities.py +0 -25
- erad/runner.py +0 -122
- erad/systems/__init__.py +0 -2
- erad/systems/asset_system.py +0 -414
- erad/systems/hazard_system.py +0 -122
- nrel_erad-0.1.0.dist-info/RECORD +0 -35
- nrel_erad-0.1.0.dist-info/top_level.txt +0 -1
erad/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "0.0
|
1
|
+
__version__ = "1.0.0"
|
erad/constants.py
CHANGED
@@ -1,68 +1,20 @@
|
|
1
|
-
"""Module for managing constants in ERAD package.
|
2
|
-
|
3
|
-
_Do not change this constants in your code._
|
4
|
-
"""
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
DEFAULT_TIME_STAMP = datetime(1970, 1, 1, 0, 0, 0)
|
23
|
-
|
24
|
-
ASSET_TYPES = (
|
25
|
-
asset.AssetState,
|
26
|
-
asset.Asset,
|
27
|
-
prob.AccelerationProbability,
|
28
|
-
prob.TemperatureProbability,
|
29
|
-
prob.DistanceProbability,
|
30
|
-
prob.SpeedProbability,
|
31
|
-
)
|
32
|
-
|
33
|
-
HAZARD_TYPES = (
|
34
|
-
hazard.EarthQuakeModel,
|
35
|
-
hazard.FloodModel,
|
36
|
-
hazard.FireModel,
|
37
|
-
hazard.WindModel,
|
38
|
-
)
|
39
|
-
|
40
|
-
HAZARD_MODELS = (
|
41
|
-
hazard.EarthQuakeModel,
|
42
|
-
hazard.FloodModelArea,
|
43
|
-
hazard.FireModelArea,
|
44
|
-
hazard.FloodModel,
|
45
|
-
hazard.FireModel,
|
46
|
-
hazard.WindModel,
|
47
|
-
frag.ProbabilityFunction,
|
48
|
-
frag.FragilityCurve,
|
49
|
-
frag.HazardFragilityCurves,
|
50
|
-
)
|
51
|
-
|
52
|
-
SUPPORTED_MODELS = [
|
53
|
-
hazard.EarthQuakeModel,
|
54
|
-
hazard.FloodModelArea,
|
55
|
-
hazard.FireModelArea,
|
56
|
-
hazard.FloodModel,
|
57
|
-
hazard.FireModel,
|
58
|
-
hazard.WindModel,
|
59
|
-
prob.AccelerationProbability,
|
60
|
-
prob.TemperatureProbability,
|
61
|
-
prob.DistanceProbability,
|
62
|
-
prob.SpeedProbability,
|
63
|
-
frag.ProbabilityFunction,
|
64
|
-
frag.FragilityCurve,
|
65
|
-
frag.HazardFragilityCurves,
|
66
|
-
asset.AssetState,
|
67
|
-
asset.Asset,
|
68
|
-
]
|
1
|
+
""" Module for managing constants in ERAD package.
|
2
|
+
|
3
|
+
_Do not change this constants in your code._
|
4
|
+
"""
|
5
|
+
|
6
|
+
import os
|
7
|
+
|
8
|
+
ROOT_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
9
|
+
DATA_FOLDER_NAME = "data"
|
10
|
+
DATA_FOLDER = os.path.join(ROOT_PATH, DATA_FOLDER_NAME)
|
11
|
+
|
12
|
+
FIRE_HISTORIC_GEODATAFRAME_PATH = "US_Wildfires_1878_2019.gdb"
|
13
|
+
EARTHQUAKE_HISTORIC_CSV_PATH = "World_Earthquakes_1960_2016.csv"
|
14
|
+
FLOOD_HISTORIC_SHP_PATH = "FEMA_100_Year_Flood_Zones_in_the_US\\FEMA_100_Year_Flood_Zones_in_the_US.shp"
|
15
|
+
#FLOOD_HISTORIC_SHP_PATH = "NFHL_06_20230323.gdb"
|
16
|
+
ELEVATION_RASTER_FILE = "TrueMarble.250m.21600x21600.B2.tif"
|
17
|
+
|
18
|
+
SMARTDS_VALID_YEARS = [2016, 2017, 2018]
|
19
|
+
SMARTDS_VALID_AREAS = ['SFO', 'GSO', 'AUS']
|
20
|
+
|
@@ -0,0 +1,212 @@
|
|
1
|
+
LOAD CSV WITH HEADERS FROM 'file:///buses.csv' AS bus_row
|
2
|
+
WITH bus_row WHERE bus_row.name IS NOT NULL
|
3
|
+
MERGE (bus:Bus {name: bus_row.name, longitude: toFloat(bus_row.longitude),
|
4
|
+
latitude: toFloat(bus_row.latitude)});
|
5
|
+
|
6
|
+
LOAD CSV WITH HEADERS FROM 'file:///loads.csv' AS load_row
|
7
|
+
WITH load_row WHERE load_row.name IS NOT NULL
|
8
|
+
MERGE (load:Load {name: load_row.name, kw: toFloat(load_row.kw),
|
9
|
+
kvar: toFloat(load_row.kvar), source: load_row.source,
|
10
|
+
critical_load_factor: toFloat(load_row.critical_load_factor)})
|
11
|
+
MERGE (load_bus:Bus {name: load_row.source})
|
12
|
+
MERGE (load)-[:CONSUMES_POWER_FROM]->(load_bus);
|
13
|
+
|
14
|
+
LOAD CSV WITH HEADERS FROM 'file:///line_sections.csv' AS line_row
|
15
|
+
WITH line_row WHERE line_row.name IS NOT NULL
|
16
|
+
MERGE (from_bus:Bus {name: line_row.source})
|
17
|
+
MERGE (to_bus:Bus {name: line_row.target})
|
18
|
+
MERGE (from_bus)-[:CONNECTS_TO {name: line_row.name, source: line_row.source,
|
19
|
+
target: line_row.target,ampacity: toFloat(line_row.ampacity),
|
20
|
+
height_m: toFloat(line_row.height_m), geom_type: line_row.geom_type}]->(to_bus);
|
21
|
+
|
22
|
+
LOAD CSV WITH HEADERS FROM 'file:///transformers.csv' AS xfmr_row
|
23
|
+
WITH xfmr_row WHERE xfmr_row.name IS NOT NULL
|
24
|
+
MERGE (from_bus:Bus {name: xfmr_row.source})
|
25
|
+
MERGE (to_bus:Bus {name: xfmr_row.target})
|
26
|
+
MERGE (from_bus)-[:CONNECTS_TO {name: xfmr_row.name, source: xfmr_row.source,
|
27
|
+
target: xfmr_row.target, kva: xfmr_row.kva,
|
28
|
+
height_m: toFloat(xfmr_row.height_m)}]->(to_bus);
|
29
|
+
|
30
|
+
|
31
|
+
LOAD CSV WITH HEADERS FROM 'file:///pv_systems.csv' AS pv_row
|
32
|
+
WITH pv_row WHERE pv_row.name IS NOT NULL
|
33
|
+
MERGE (sa:Solar {capacity: toFloat(pv_row.capacity),
|
34
|
+
name: pv_row.name, owner: pv_row.owner})
|
35
|
+
MERGE (ba:Bus {name: pv_row.bus})
|
36
|
+
MERGE (lo:Load {name: pv_row.owner})
|
37
|
+
MERGE (sa)-[:INJECTS_ACTIVE_POWER_TO]->(ba)
|
38
|
+
MERGE (lo)-[:OWNS]->(sa);
|
39
|
+
|
40
|
+
LOAD CSV WITH HEADERS FROM 'file:///energy_storage.csv' AS es_row
|
41
|
+
WITH es_row WHERE es_row.name IS NOT NULL
|
42
|
+
MERGE (ea:EnergyStorage {kw: toFloat(es_row.kw), name: es_row.name,
|
43
|
+
owner:es_row.owner})
|
44
|
+
MERGE (ba:Bus {name: es_row.bus})
|
45
|
+
MERGE (lo:Load {name: es_row.owner})
|
46
|
+
MERGE (ea)-[:INJECTS_POWER]->(ba)
|
47
|
+
MERGE (ba)-[:CONSUMES_POWER]->(ea)
|
48
|
+
MERGE (lo)-[:OWNS]->(ea);
|
49
|
+
|
50
|
+
LOAD CSV WITH HEADERS FROM 'file:///substation.csv' AS sub_row
|
51
|
+
WITH sub_row WHERE sub_row.name IS NOT NULL
|
52
|
+
MERGE (b:Bus {name: sub_row.name})
|
53
|
+
SET b:Substation;
|
54
|
+
|
55
|
+
MATCH (b:Bus)-[CONSUMES_POWER]-(c:Load)
|
56
|
+
SET c.longitude = b.longitude
|
57
|
+
SET c.latitude = b.latitude;
|
58
|
+
|
59
|
+
MATCH (c:Load)
|
60
|
+
WHERE c.latitude IS NULL
|
61
|
+
DETACH DELETE c;
|
62
|
+
|
63
|
+
LOAD CSV WITH HEADERS FROM 'file:///pharmacies.csv' AS p_row
|
64
|
+
WITH p_row WHERE p_row.name IS NOT NULL
|
65
|
+
MERGE (p:Pharmacy {name: (p_row.name + p_row.gid), source:p_row.source,
|
66
|
+
kw:toFloat(p_row.kw), kvar:toFloat(p_row.kvar),
|
67
|
+
backup_capacity_kw:toFloat(p_row.backup_capacity_kw),
|
68
|
+
backup: toInteger(p_row.backup),
|
69
|
+
longitude: toFloat(p_row.longitude), latitude: toFloat(p_row.latitude)})
|
70
|
+
WITH p
|
71
|
+
MATCH (lo:Load)
|
72
|
+
MERGE (lo)-[:VISITS_FOR_MEDICINE {distance: point.distance(
|
73
|
+
point({longitude: p.longitude, latitude:p.latitude}),
|
74
|
+
point({longitude: lo.longitude, latitude:lo.latitude})
|
75
|
+
)}]->(p);
|
76
|
+
|
77
|
+
MATCH (p:Pharmacy)
|
78
|
+
WITH p
|
79
|
+
MATCH (b:Bus {name: p.source})
|
80
|
+
MERGE (b)<-[:GETS_POWER_FROM]-(p);
|
81
|
+
|
82
|
+
LOAD CSV WITH HEADERS FROM 'file:///groceries.csv' AS g_row
|
83
|
+
WITH g_row WHERE g_row.name IS NOT NULL
|
84
|
+
MERGE (g:Grocery {name: (g_row.name + g_row.gid), source:g_row.source,
|
85
|
+
kw:toFloat(g_row.kw), kvar:toFloat(g_row.kvar),
|
86
|
+
backup_capacity_kw:toFloat(g_row.backup_capacity_kw),
|
87
|
+
backup: toInteger(g_row.backup),
|
88
|
+
longitude: toFloat(g_row.longitude), latitude: toFloat(g_row.latitude)})
|
89
|
+
WITH g
|
90
|
+
MATCH (lo:Load)
|
91
|
+
MERGE (lo)-[:VISITS_FOR_GROCERIES {distance: point.distance(
|
92
|
+
point({longitude: g.longitude, latitude:g.latitude}),
|
93
|
+
point({longitude: lo.longitude, latitude:lo.latitude})
|
94
|
+
)}]->(g);
|
95
|
+
|
96
|
+
MATCH (g:Grocery)
|
97
|
+
WITH g
|
98
|
+
MATCH (b:Bus {name: g.source})
|
99
|
+
MERGE (b)<-[:GETS_POWER_FROM]-(g);
|
100
|
+
|
101
|
+
LOAD CSV WITH HEADERS FROM 'file:///medical_centers.csv' AS m_row
|
102
|
+
WITH m_row WHERE m_row.name IS NOT NULL
|
103
|
+
MERGE (m:Hospital {name: (m_row.name + m_row.gid),
|
104
|
+
source:m_row.source, kw:toFloat(m_row.kw), kvar:toFloat(m_row.kvar),
|
105
|
+
backup_capacity_kw:toFloat(m_row.backup_capacity_kw),
|
106
|
+
longitude: toFloat(m_row.longitude),
|
107
|
+
latitude: toFloat(m_row.latitude), backup: toInteger(m_row.backup)})
|
108
|
+
WITH m
|
109
|
+
MATCH (lo:Load)
|
110
|
+
MERGE (lo)-[:VISITS_DURING_HEALTH_EMERGENCY {distance: point.distance(
|
111
|
+
point({longitude: m.longitude, latitude:m.latitude}),
|
112
|
+
point({longitude: lo.longitude, latitude:lo.latitude})
|
113
|
+
)}]->(m);
|
114
|
+
|
115
|
+
MATCH (h:Hospital)
|
116
|
+
WITH h
|
117
|
+
MATCH (b:Bus {name: h.source})
|
118
|
+
MERGE (b)<-[:GETS_POWER_FROM]-(h);
|
119
|
+
|
120
|
+
LOAD CSV WITH HEADERS FROM 'file:///banking.csv' AS b_row
|
121
|
+
WITH b_row WHERE b_row.name IS NOT NULL
|
122
|
+
MERGE (b:Banking {name: (b_row.name + b_row.gid),
|
123
|
+
source: b_row.source,kw:toFloat(b_row.kw), kvar:toFloat(b_row.kvar),
|
124
|
+
backup_capacity_kw:toFloat(b_row.backup_capacity_kw),
|
125
|
+
backup: toInteger(b_row.backup),
|
126
|
+
longitude: toFloat(b_row.longitude), latitude: toFloat(b_row.latitude)})
|
127
|
+
WITH b
|
128
|
+
MATCH (lo:Load)
|
129
|
+
MERGE (lo)-[:VISITS_TO_WITHDRAW_OR_DEPOSIT_CURRENCY {distance: point.distance(
|
130
|
+
point({longitude: b.longitude, latitude:b.latitude}),
|
131
|
+
point({longitude: lo.longitude, latitude:lo.latitude})
|
132
|
+
)}]->(b);
|
133
|
+
|
134
|
+
MATCH (b1:Banking)
|
135
|
+
WITH b1
|
136
|
+
MATCH (b:Bus {name: b1.source})
|
137
|
+
MERGE (b)<-[:GETS_POWER_FROM]-(b1);
|
138
|
+
|
139
|
+
LOAD CSV WITH HEADERS FROM 'file:///convenience.csv' AS c_row
|
140
|
+
WITH c_row WHERE c_row.name IS NOT NULL
|
141
|
+
MERGE (c:Convenience {name: (c_row.name + c_row.gid),
|
142
|
+
source:c_row.source, kw:toFloat(c_row.kw), kvar:toFloat(c_row.kvar),
|
143
|
+
backup_capacity_kw:toFloat(c_row.backup_capacity_kw),
|
144
|
+
backup: toInteger(c_row.backup),
|
145
|
+
longitude: toFloat(c_row.longitude), latitude: toFloat(c_row.latitude)})
|
146
|
+
WITH c
|
147
|
+
MATCH (lo:Load)
|
148
|
+
MERGE (lo)-[:VISITS_FOR_SERVICE {distance: point.distance(
|
149
|
+
point({longitude: c.longitude, latitude:c.latitude}),
|
150
|
+
point({longitude: lo.longitude, latitude:lo.latitude})
|
151
|
+
)}]->(c);
|
152
|
+
|
153
|
+
MATCH (c:Convenience)
|
154
|
+
WITH c
|
155
|
+
MATCH (b:Bus {name: c.source})
|
156
|
+
MERGE (b)<-[:GETS_POWER_FROM]-(c);
|
157
|
+
|
158
|
+
LOAD CSV WITH HEADERS FROM 'file:///shelters.csv' AS s_row
|
159
|
+
WITH s_row WHERE s_row.use_type IS NOT NULL
|
160
|
+
MERGE (s:Shelter {name: (s_row.use_type + s_row.gid),
|
161
|
+
backup: toInteger(s_row.backup), source: s_row.source, kw:toFloat(s_row.kw),
|
162
|
+
kvar:toFloat(s_row.kvar),
|
163
|
+
backup_capacity_kw:toFloat(s_row.backup_capacity_kw),
|
164
|
+
longitude: toFloat(s_row.longitude), latitude: toFloat(s_row.latitude)})
|
165
|
+
WITH s
|
166
|
+
MATCH (lo:Load)
|
167
|
+
MERGE (lo)-[:VISITS_FOR_SERVICE {distance: point.distance(
|
168
|
+
point({longitude: s.longitude, latitude:s.latitude}),
|
169
|
+
point({longitude: lo.longitude, latitude:lo.latitude})
|
170
|
+
)}]->(s);
|
171
|
+
|
172
|
+
MATCH (s:Shelter)
|
173
|
+
WITH s
|
174
|
+
MATCH (b:Bus {name: s.source})
|
175
|
+
MERGE (b)<-[:GETS_POWER_FROM]-(s);
|
176
|
+
|
177
|
+
MATCH (b1:Bus)-[r:CONNECTS_TO]-(b2:Bus)
|
178
|
+
SET r.longitude = (b1.longitude + b2.longitude)/2
|
179
|
+
SET r.latitude = (b1.latitude + b2.latitude)/2;
|
180
|
+
|
181
|
+
MATCH p=(sourceNode:Bus)-[r:CONNECTS_TO]-(targetNode:Bus)
|
182
|
+
WHERE r.ampacity IS NOT NULL
|
183
|
+
WITH r,sourceNode, CASE r.num_phase
|
184
|
+
WHEN 3 THEN 1.732
|
185
|
+
ELSE 1
|
186
|
+
END AS multiplier
|
187
|
+
SET r.kva = multiplier*r.ampacity*sourceNode.kv;
|
188
|
+
|
189
|
+
MATCH p=(sourceNode:Bus)-[r:CONSUMES_POWER_FROM]-(targetNode:Load)
|
190
|
+
SET targetNode.kw = toFloat(targetNode.kw)
|
191
|
+
SET targetNode.kvar = toFloat(targetNode.kvar)
|
192
|
+
SET r.kva = sqrt(targetNode.kw*targetNode.kw+targetNode.kvar*targetNode.kvar);
|
193
|
+
|
194
|
+
MATCH p=(sourceNode:Bus)-[r:INJECTS_ACTIVE_POWER_TO]-(targetNode:Solar)
|
195
|
+
SET targetNode.capacity = toFloat(targetNode.capacity)
|
196
|
+
SET r.kva = targetNode.capacity;
|
197
|
+
|
198
|
+
|
199
|
+
MATCH p=(sourceNode:Bus)-[r:INJECTS_POWER]-(targetNode:EnergyStorage)
|
200
|
+
SET targetNode.kw = toFloat(targetNode.kw)
|
201
|
+
SET r.kva = targetNode.kw;
|
202
|
+
|
203
|
+
MATCH (sourceNode:Bus)-[r:CONNECTS_TO]-(targetNode:Bus)
|
204
|
+
SET r.kva = toFloat(r.kva);
|
205
|
+
|
206
|
+
MATCH p=()-[r:GETS_POWER_FROM]->()
|
207
|
+
WHERE r.kva is null
|
208
|
+
SET r.kva = 300;
|
209
|
+
|
210
|
+
MATCH p=()-[r:CONNECTS_TO]->()
|
211
|
+
WHERE r.kva IS null
|
212
|
+
SET r.kva = 300;
|