NREL-reV 0.14.2__py3-none-any.whl → 0.14.5__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.
- {nrel_rev-0.14.2.dist-info → nrel_rev-0.14.5.dist-info}/METADATA +5 -5
- {nrel_rev-0.14.2.dist-info → nrel_rev-0.14.5.dist-info}/RECORD +20 -20
- {nrel_rev-0.14.2.dist-info → nrel_rev-0.14.5.dist-info}/WHEEL +1 -1
- reV/bespoke/bespoke.py +96 -19
- reV/bespoke/place_turbines.py +46 -11
- reV/cli.py +3 -1
- reV/config/output_request.py +3 -0
- reV/config/project_points.py +4 -0
- reV/supply_curve/cli_sc_aggregation.py +39 -2
- reV/supply_curve/exclusions.py +55 -26
- reV/supply_curve/extent.py +18 -9
- reV/supply_curve/points.py +18 -3
- reV/supply_curve/sc_aggregation.py +64 -15
- reV/supply_curve/tech_mapping.py +8 -7
- reV/utilities/__init__.py +402 -13
- reV/utilities/cli_functions.py +43 -1
- reV/version.py +1 -1
- {nrel_rev-0.14.2.dist-info → nrel_rev-0.14.5.dist-info}/entry_points.txt +0 -0
- {nrel_rev-0.14.2.dist-info → nrel_rev-0.14.5.dist-info}/licenses/LICENSE +0 -0
- {nrel_rev-0.14.2.dist-info → nrel_rev-0.14.5.dist-info}/top_level.txt +0 -0
reV/utilities/__init__.py
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
"""reV utilities."""
|
3
|
-
|
3
|
+
import ast
|
4
|
+
import inspect
|
5
|
+
from enum import Enum, EnumMeta
|
4
6
|
|
5
7
|
import PySAM
|
6
8
|
from rex.utilities.loggers import log_versions as rex_log_versions
|
@@ -8,7 +10,50 @@ from rex.utilities.loggers import log_versions as rex_log_versions
|
|
8
10
|
from reV.version import __version__
|
9
11
|
|
10
12
|
|
11
|
-
class
|
13
|
+
class _DocstringEnumMeta(EnumMeta):
|
14
|
+
"""Metaclass to assign docstrings to Enum members"""
|
15
|
+
|
16
|
+
def __new__(metacls, clsname, bases, clsdict):
|
17
|
+
cls = super().__new__(metacls, clsname, bases, clsdict)
|
18
|
+
|
19
|
+
try:
|
20
|
+
source = inspect.getsource(cls)
|
21
|
+
except TypeError:
|
22
|
+
return cls # source not available (e.g., in interactive shell)
|
23
|
+
|
24
|
+
module = ast.parse(source)
|
25
|
+
|
26
|
+
for node in ast.iter_child_nodes(module):
|
27
|
+
if isinstance(node, ast.ClassDef) and node.name == cls.__name__:
|
28
|
+
prev = None
|
29
|
+
for body_item in node.body:
|
30
|
+
if isinstance(body_item, ast.Assign):
|
31
|
+
target = body_item.targets[0]
|
32
|
+
if isinstance(target, ast.Name):
|
33
|
+
name = target.id
|
34
|
+
prev = body_item
|
35
|
+
elif (isinstance(body_item, ast.Expr)
|
36
|
+
and isinstance(body_item.value, ast.Constant)):
|
37
|
+
if prev:
|
38
|
+
doc = body_item.value.s
|
39
|
+
member = cls.__members__.get(name)
|
40
|
+
if member:
|
41
|
+
member._description = (doc.strip()
|
42
|
+
.replace("\n ", " "))
|
43
|
+
prev = None
|
44
|
+
return cls
|
45
|
+
|
46
|
+
|
47
|
+
class DocEnum(Enum, metaclass=_DocstringEnumMeta):
|
48
|
+
"""Base Enum class with docstring support"""
|
49
|
+
|
50
|
+
@property
|
51
|
+
def description(self):
|
52
|
+
"""Description of enum member pulled from docstring"""
|
53
|
+
return getattr(self, '_description', None)
|
54
|
+
|
55
|
+
|
56
|
+
class FieldEnum(str, DocEnum):
|
12
57
|
"""Base Field enum with some mapping methods."""
|
13
58
|
|
14
59
|
@classmethod
|
@@ -118,89 +163,373 @@ class SupplyCurveField(FieldEnum):
|
|
118
163
|
|
119
164
|
Not all of these columns are guaranteed in every supply-curve like
|
120
165
|
output (e.g. "convex_hull_area" is a bespoke-only output).
|
166
|
+
|
167
|
+
The docstrings for each field are used as a description when
|
168
|
+
exporting metadata information about supply curve columns. See
|
169
|
+
TBA for details.
|
121
170
|
"""
|
122
171
|
|
172
|
+
# ############## #
|
173
|
+
# Shared outputs #
|
174
|
+
# ############## #
|
175
|
+
|
123
176
|
SC_GID = "sc_gid"
|
177
|
+
"""Supply curve GID (Specific to this particular supply curve output)"""
|
178
|
+
|
124
179
|
LATITUDE = "latitude"
|
180
|
+
"""Centroid latitude of the supply curve grid-cell"""
|
181
|
+
|
125
182
|
LONGITUDE = "longitude"
|
183
|
+
"""Centroid longitude of the supply curve grid-cell"""
|
184
|
+
|
126
185
|
COUNTRY = "country"
|
186
|
+
"""Country of the supply curve grid-cell"""
|
187
|
+
|
127
188
|
STATE = "state"
|
189
|
+
"""State of the supply curve grid-cell"""
|
190
|
+
|
128
191
|
COUNTY = "county"
|
192
|
+
"""County of the supply curve grid-cell"""
|
193
|
+
|
129
194
|
ELEVATION = "elevation_m"
|
195
|
+
"""Mean elevation of the supply curve grid-cell"""
|
196
|
+
|
130
197
|
TIMEZONE = "timezone"
|
198
|
+
"""
|
199
|
+
Timezone of supply curve grid-cell, expressed as an hourly offset from UTC
|
200
|
+
"""
|
201
|
+
|
131
202
|
SC_POINT_GID = "sc_point_gid"
|
203
|
+
"""
|
204
|
+
Unique ID that can be used to match supply curve grid-cells across reV
|
205
|
+
supply curves at the same resolution
|
206
|
+
"""
|
207
|
+
|
132
208
|
SC_ROW_IND = "sc_row_ind"
|
209
|
+
"""Supply curve grid-cell row ID (Invariant across supply curves)"""
|
210
|
+
|
133
211
|
SC_COL_IND = "sc_col_ind"
|
212
|
+
"""Supply curve grid-cell column ID (Invariant across supply curves)"""
|
213
|
+
|
134
214
|
SOURCE_GIDS = "source_gids"
|
215
|
+
|
135
216
|
RES_GIDS = "res_gids"
|
217
|
+
"""List of resource GID's mapped to this supply curve grid-cells"""
|
218
|
+
|
136
219
|
GEN_GIDS = "gen_gids"
|
220
|
+
"""List of generation GID's mapped to this supply curve point"""
|
221
|
+
|
137
222
|
GID_COUNTS = "gid_counts"
|
223
|
+
"""
|
224
|
+
Number of high-resolution cells corresponding to each generation GID
|
225
|
+
for this supply curve point
|
226
|
+
"""
|
227
|
+
|
138
228
|
N_GIDS = "n_gids"
|
229
|
+
"""
|
230
|
+
Total number of not fully excluded pixels associated with the available
|
231
|
+
resource/generation gids
|
232
|
+
"""
|
233
|
+
|
139
234
|
ZONE_ID = "zone_id"
|
235
|
+
"""Zone ID of the supply curve grid-cell, if applicable. Defaults to 1."""
|
236
|
+
|
140
237
|
MEAN_RES = "resource"
|
238
|
+
"""
|
239
|
+
Mean resource (e.g. wind speed, gha, temperature, etc.) across the supply
|
240
|
+
curve grid-cell
|
241
|
+
"""
|
242
|
+
|
141
243
|
MEAN_CF_AC = "capacity_factor_ac"
|
244
|
+
"""Mean capacity factor (AC) across supply curve grid-cell"""
|
245
|
+
|
142
246
|
MEAN_CF_DC = "capacity_factor_dc"
|
247
|
+
"""Mean capacity factor (DC) across supply curve grid-cell"""
|
248
|
+
|
249
|
+
WAKE_LOSSES = "losses_wakes_pct"
|
250
|
+
"""Mean wake losses across supply curve grid-cell"""
|
251
|
+
|
143
252
|
MEAN_LCOE = "lcoe_site_usd_per_mwh"
|
253
|
+
"""
|
254
|
+
Mean power plant levelized cost of energy across supply curve grid-cell
|
255
|
+
"""
|
256
|
+
|
144
257
|
CAPACITY_AC_MW = "capacity_ac_mw"
|
258
|
+
"""
|
259
|
+
Capacity of system based on area_sq_km * AC capacity density assumption
|
260
|
+
"""
|
261
|
+
|
145
262
|
CAPACITY_DC_MW = "capacity_dc_mw"
|
263
|
+
"""
|
264
|
+
Capacity of system based on area_sq_km * DC capacity density assumption
|
265
|
+
"""
|
266
|
+
|
146
267
|
OFFSHORE = "offshore"
|
268
|
+
"""
|
269
|
+
Flag value indicating if the supply curve grid-cell is offshore (1)
|
270
|
+
or not (0)
|
271
|
+
"""
|
272
|
+
|
147
273
|
AREA_SQ_KM = "area_developable_sq_km"
|
274
|
+
"""Developable area after spatial exclusions applied"""
|
275
|
+
|
148
276
|
MEAN_FRICTION = "friction_site"
|
277
|
+
|
149
278
|
MEAN_LCOE_FRICTION = "lcoe_friction_usd_per_mwh"
|
279
|
+
|
150
280
|
RAW_LCOE = "lcoe_raw_usd_per_mwh"
|
281
|
+
"""
|
282
|
+
Mean power plant levelized cost of energy across supply curve grid-cell
|
283
|
+
without any multipliers or economies of scale applied
|
284
|
+
"""
|
285
|
+
|
151
286
|
EOS_MULT = "multiplier_cc_eos"
|
287
|
+
"""
|
288
|
+
Capital cost economies of Scale (EOS) multiplier value (defaults to `1`
|
289
|
+
if no EOS curve was specified)
|
290
|
+
"""
|
291
|
+
|
152
292
|
FIXED_EOS_MULT = "multiplier_foc_eos"
|
293
|
+
"""
|
294
|
+
Fixed operating cost economies of Scale (EOS) multiplier value (defaults
|
295
|
+
to `1` if no EOS curve was specified)
|
296
|
+
"""
|
297
|
+
|
153
298
|
VAR_EOS_MULT = "multiplier_voc_eos"
|
299
|
+
"""
|
300
|
+
Variable operating cost economies of Scale (EOS) multiplier value
|
301
|
+
(defaults to `1` if no EOS curve was specified)
|
302
|
+
"""
|
303
|
+
|
154
304
|
REG_MULT = "multiplier_cc_regional"
|
305
|
+
"""
|
306
|
+
Regional capital cost multiplier to capture taxes, labor, land lease
|
307
|
+
regional differences
|
308
|
+
"""
|
309
|
+
|
155
310
|
SC_POINT_ANNUAL_ENERGY_MWH = "annual_energy_site_mwh"
|
311
|
+
"""
|
312
|
+
Total annual energy for supply curve grid-cell (computed using
|
313
|
+
"capacity_ac_mw" and "capacity_factor_ac")
|
314
|
+
"""
|
315
|
+
|
156
316
|
COST_BASE_CC_USD_PER_AC_MW = "cost_base_cc_usd_per_ac_mw"
|
317
|
+
"""
|
318
|
+
Included-area weighted capital cost for supply curve grid-cell with no
|
319
|
+
multipliers or economies of scale applied (defaults to `None` for
|
320
|
+
non-LCOE runs)
|
321
|
+
"""
|
322
|
+
|
157
323
|
COST_SITE_CC_USD_PER_AC_MW = "cost_site_cc_usd_per_ac_mw"
|
324
|
+
"""
|
325
|
+
Included-area weighted capital cost for supply curve grid-cell
|
326
|
+
(defaults to `None` for non-LCOE runs)
|
327
|
+
"""
|
328
|
+
|
158
329
|
COST_BASE_FOC_USD_PER_AC_MW = "cost_base_foc_usd_per_ac_mw"
|
330
|
+
"""
|
331
|
+
Included-area weighted fixed operating cost for supply curve grid-cell
|
332
|
+
with no multipliers or economies of scale applied (defaults to `None` for
|
333
|
+
non-LCOE runs)
|
334
|
+
"""
|
335
|
+
|
159
336
|
COST_SITE_FOC_USD_PER_AC_MW = "cost_site_foc_usd_per_ac_mw"
|
337
|
+
"""
|
338
|
+
Included-area weighted fixed operating cost for supply curve grid-cell
|
339
|
+
(defaults to `None` for non-LCOE runs)
|
340
|
+
"""
|
341
|
+
|
160
342
|
COST_BASE_VOC_USD_PER_AC_MWH = "cost_base_voc_usd_per_ac_mwh"
|
343
|
+
"""
|
344
|
+
Included-area weighted variable operating cost for supply curve grid-cell
|
345
|
+
with no multipliers or economies of scale applied (defaults to `None` for
|
346
|
+
non-LCOE runs)
|
347
|
+
"""
|
348
|
+
|
161
349
|
COST_SITE_VOC_USD_PER_AC_MWH = "cost_site_voc_usd_per_ac_mwh"
|
350
|
+
"""
|
351
|
+
Included-area weighted variable operating cost for supply curve grid-cell
|
352
|
+
(defaults to `None` for non-LCOE runs)
|
353
|
+
"""
|
354
|
+
|
162
355
|
FIXED_CHARGE_RATE = "fixed_charge_rate"
|
356
|
+
"""
|
357
|
+
Fixed charge rate used for LCOE computation
|
358
|
+
(defaults to `None` for non-LCOE runs)
|
359
|
+
"""
|
360
|
+
|
361
|
+
# ############### #
|
362
|
+
# Bespoke outputs #
|
363
|
+
# ############### #
|
163
364
|
|
164
|
-
# Bespoke outputs
|
165
365
|
POSSIBLE_X_COORDS = "possible_x_coords"
|
366
|
+
"""
|
367
|
+
List of turbine x coordinates considered during layout optimization
|
368
|
+
(in meters relative to grid-cell)
|
369
|
+
"""
|
370
|
+
|
166
371
|
POSSIBLE_Y_COORDS = "possible_y_coords"
|
372
|
+
"""
|
373
|
+
List of turbine y coordinates considered during layout optimization
|
374
|
+
(in meters relative to grid-cell)
|
375
|
+
"""
|
376
|
+
|
167
377
|
TURBINE_X_COORDS = "turbine_x_coords"
|
378
|
+
"""
|
379
|
+
List of optimized layout turbine x coordinates
|
380
|
+
(in meters relative to grid-cell)
|
381
|
+
"""
|
382
|
+
|
168
383
|
TURBINE_Y_COORDS = "turbine_y_coords"
|
384
|
+
"""
|
385
|
+
List of optimized layout turbine y coordinates
|
386
|
+
(in meters relative to grid-cell)
|
387
|
+
"""
|
388
|
+
|
169
389
|
N_TURBINES = "n_turbines"
|
390
|
+
"""
|
391
|
+
Number of turbines in the optimized layout for this supply curve
|
392
|
+
grid-cell
|
393
|
+
"""
|
394
|
+
|
170
395
|
INCLUDED_AREA = "area_included_sq_km"
|
396
|
+
"""Area available for wind turbine layout optimization"""
|
397
|
+
|
171
398
|
INCLUDED_AREA_CAPACITY_DENSITY = (
|
172
399
|
"capacity_density_included_area_mw_per_km2"
|
173
400
|
)
|
401
|
+
"""
|
402
|
+
Capacity density of the optimized wind plant layout defined using the
|
403
|
+
area available after removing the exclusions
|
404
|
+
"""
|
405
|
+
|
174
406
|
CONVEX_HULL_AREA = "area_convex_hull_sq_km"
|
407
|
+
"""Area of the convex hull of the optimized wind plant layout"""
|
408
|
+
|
175
409
|
CONVEX_HULL_CAPACITY_DENSITY = "capacity_density_convex_hull_mw_per_km2"
|
410
|
+
"""
|
411
|
+
Capacity density of the optimized wind plant layout defined using the
|
412
|
+
convex hull area of the layout
|
413
|
+
"""
|
414
|
+
|
176
415
|
FULL_CELL_CAPACITY_DENSITY = "capacity_density_full_cell_mw_per_km2"
|
416
|
+
"""
|
417
|
+
Capacity density of the optimized wind plant layout defined using the full
|
418
|
+
non-excluded area of the supply curve grid-cell
|
419
|
+
"""
|
420
|
+
|
177
421
|
BESPOKE_AEP = "optimized_plant_aep"
|
422
|
+
"""
|
423
|
+
Annual energy production of the optimized wind plant layout computed using
|
424
|
+
wind speed/direction joint probability distribution (as opposed to
|
425
|
+
historical weather data)
|
426
|
+
"""
|
427
|
+
|
178
428
|
BESPOKE_OBJECTIVE = "optimized_plant_objective"
|
429
|
+
"""
|
430
|
+
Objective function value of the optimized wind plant layout. This is
|
431
|
+
typically the LCOE computed using wind speed/direction joint probability
|
432
|
+
distribution (as opposed to historical weather data)
|
433
|
+
"""
|
434
|
+
|
179
435
|
BESPOKE_CAPITAL_COST = "optimized_plant_capital_cost"
|
436
|
+
"""Capital cost of the optimized wind plant layout"""
|
437
|
+
|
180
438
|
BESPOKE_FIXED_OPERATING_COST = "optimized_plant_fixed_operating_cost"
|
439
|
+
"""Annual fixed operating cost of the optimized wind plant layout"""
|
440
|
+
|
181
441
|
BESPOKE_VARIABLE_OPERATING_COST = "optimized_plant_variable_operating_cost"
|
442
|
+
"""Variable operating cost of the optimized wind plant layout"""
|
443
|
+
|
182
444
|
BESPOKE_BALANCE_OF_SYSTEM_COST = "optimized_plant_balance_of_system_cost"
|
445
|
+
"""Balance of system cost of the optimized wind plant layout"""
|
446
|
+
|
447
|
+
# #################### #
|
448
|
+
# Transmission outputs #
|
449
|
+
# #################### #
|
183
450
|
|
184
|
-
# Transmission outputs
|
185
451
|
TRANS_GID = "trans_gid"
|
452
|
+
"""Transmission connection feature GID"""
|
453
|
+
|
186
454
|
TRANS_TYPE = "trans_type"
|
455
|
+
"""Transmission connection feature type"""
|
456
|
+
|
187
457
|
TOTAL_LCOE_FRICTION = "lcoe_total_friction_usd_per_mwh"
|
188
458
|
TRANS_CAPACITY = "trans_capacity"
|
459
|
+
|
189
460
|
DIST_SPUR_KM = "dist_spur_km"
|
461
|
+
"""
|
462
|
+
Distance between the grid-cell centroid and cheapest available electrical
|
463
|
+
substation. Used in lcot calculations.
|
464
|
+
"""
|
465
|
+
|
190
466
|
DIST_EXPORT_KM = "dist_export_km"
|
467
|
+
"""Length of the offshore export cable"""
|
468
|
+
|
191
469
|
REINFORCEMENT_DIST_KM = "dist_reinforcement_km"
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
470
|
+
"""
|
471
|
+
Distance between the connected substation and nearest regional load
|
472
|
+
center. Used in lcot calculations.
|
473
|
+
"""
|
474
|
+
|
475
|
+
TIE_LINE_COST_PER_MW = "cost_spur_usd_per_mw_ac"
|
476
|
+
"""
|
477
|
+
Cost of the spur line used to connect the grid-cell centroid with the
|
478
|
+
cheapest available electrical substation
|
479
|
+
"""
|
480
|
+
|
481
|
+
CONNECTION_COST_PER_MW = "cost_poi_usd_per_mw_ac"
|
482
|
+
"""Substation connection/upgrade/installation cost"""
|
483
|
+
|
484
|
+
EXPORT_COST_PER_MW = "cost_export_usd_per_mw_ac"
|
485
|
+
"""Cost of the offshore export cable """
|
486
|
+
|
487
|
+
REINFORCEMENT_COST_PER_MW = "cost_reinforcement_usd_per_mw_ac"
|
488
|
+
"""Non-levelized reinforcement transmission capital costs"""
|
489
|
+
|
490
|
+
TOTAL_TRANS_CAP_COST_PER_MW = "cost_total_trans_usd_per_mw_ac"
|
491
|
+
"""
|
492
|
+
Non-levelized spur and point-of-interconnection transmission capital costs
|
493
|
+
"""
|
494
|
+
|
197
495
|
LCOT = "lcot_usd_per_mwh"
|
496
|
+
"""
|
497
|
+
Levelized cost of transmission. Includes spur-transmission,
|
498
|
+
point-of-interconnection, and reinforcement costs.
|
499
|
+
"""
|
500
|
+
|
198
501
|
TOTAL_LCOE = "lcoe_all_in_usd_per_mwh"
|
502
|
+
"""All-in LCOE. Includes site-lcoe + lcot"""
|
503
|
+
|
199
504
|
N_PARALLEL_TRANS = "count_num_parallel_trans"
|
505
|
+
"""
|
506
|
+
Number of parallel transmission lines connecting the grid-cell centroid
|
507
|
+
with the cheapest available electrical substation
|
508
|
+
"""
|
509
|
+
|
200
510
|
POI_LAT = "latitude_poi"
|
511
|
+
"""
|
512
|
+
Latitude of the cheapest available electrical substation for the supply
|
513
|
+
curve grid-cell
|
514
|
+
"""
|
515
|
+
|
201
516
|
POI_LON = "longitude_poi"
|
517
|
+
"""
|
518
|
+
Longitude of the cheapest available electrical substation for the supply
|
519
|
+
curve grid-cell
|
520
|
+
"""
|
521
|
+
|
202
522
|
REINFORCEMENT_POI_LAT = "latitude_reinforcement_poi"
|
523
|
+
"""
|
524
|
+
Latitude of the nearest regional load center for the supply curve
|
525
|
+
grid-cell
|
526
|
+
"""
|
527
|
+
|
203
528
|
REINFORCEMENT_POI_LON = "longitude_reinforcement_poi"
|
529
|
+
"""
|
530
|
+
Longitude of the nearest regional load center for the supply curve
|
531
|
+
grid-cell
|
532
|
+
"""
|
204
533
|
|
205
534
|
@classmethod
|
206
535
|
def map_from_legacy(cls):
|
@@ -221,6 +550,11 @@ class SupplyCurveField(FieldEnum):
|
|
221
550
|
|
222
551
|
return legacy_map
|
223
552
|
|
553
|
+
@property
|
554
|
+
def units(self):
|
555
|
+
"""Units of the supply curve column, or ``"N/A"`` if not applicable"""
|
556
|
+
return _SC_UNITS.get(self, "N/A")
|
557
|
+
|
224
558
|
|
225
559
|
class _LegacySCAliases(Enum):
|
226
560
|
"""Legacy supply curve column names.
|
@@ -242,10 +576,13 @@ class _LegacySCAliases(Enum):
|
|
242
576
|
TRANS_CAPACITY = "avail_cap"
|
243
577
|
DIST_SPUR_KM = "dist_km"
|
244
578
|
REINFORCEMENT_DIST_KM = "reinforcement_dist_km"
|
245
|
-
TIE_LINE_COST_PER_MW = "tie_line_cost_per_mw"
|
246
|
-
CONNECTION_COST_PER_MW = "connection_cost_per_mw"
|
247
|
-
|
248
|
-
|
579
|
+
TIE_LINE_COST_PER_MW = "tie_line_cost_per_mw", "cost_spur_usd_per_mw"
|
580
|
+
CONNECTION_COST_PER_MW = "connection_cost_per_mw", "cost_poi_usd_per_mw"
|
581
|
+
EXPORT_COST_PER_MW = "cost_export_usd_per_mw"
|
582
|
+
REINFORCEMENT_COST_PER_MW = ("reinforcement_cost_per_mw",
|
583
|
+
"cost_reinforcement_usd_per_mw")
|
584
|
+
TOTAL_TRANS_CAP_COST_PER_MW = ("trans_cap_cost_per_mw",
|
585
|
+
"cost_total_trans_usd_per_mw")
|
249
586
|
LCOT = "lcot"
|
250
587
|
TOTAL_LCOE = "total_lcoe"
|
251
588
|
TOTAL_LCOE_FRICTION = "total_lcoe_friction"
|
@@ -331,3 +668,55 @@ def log_versions(logger):
|
|
331
668
|
logger.info("Running with reV version {}".format(__version__))
|
332
669
|
rex_log_versions(logger)
|
333
670
|
logger.debug("- PySAM version {}".format(PySAM.__version__))
|
671
|
+
|
672
|
+
|
673
|
+
_SC_UNITS = {
|
674
|
+
SupplyCurveField.ELEVATION: "m",
|
675
|
+
SupplyCurveField.LATITUDE: "degrees",
|
676
|
+
SupplyCurveField.LONGITUDE: "degrees",
|
677
|
+
|
678
|
+
SupplyCurveField.AREA_SQ_KM: "km2",
|
679
|
+
SupplyCurveField.CAPACITY_AC_MW: "MWac",
|
680
|
+
SupplyCurveField.CAPACITY_DC_MW: "MWdc",
|
681
|
+
SupplyCurveField.MEAN_CF_AC: "ratio",
|
682
|
+
SupplyCurveField.MEAN_CF_DC: "ratio",
|
683
|
+
SupplyCurveField.WAKE_LOSSES: "%",
|
684
|
+
SupplyCurveField.MEAN_LCOE: "$/MWh",
|
685
|
+
SupplyCurveField.RAW_LCOE: "$/MWh",
|
686
|
+
SupplyCurveField.SC_POINT_ANNUAL_ENERGY_MWH: "MWh",
|
687
|
+
SupplyCurveField.COST_BASE_CC_USD_PER_AC_MW: "$/MWac",
|
688
|
+
SupplyCurveField.COST_SITE_CC_USD_PER_AC_MW: "$/MWac",
|
689
|
+
SupplyCurveField.COST_BASE_FOC_USD_PER_AC_MW: "$/MWac",
|
690
|
+
SupplyCurveField.COST_SITE_FOC_USD_PER_AC_MW: "$/MWac",
|
691
|
+
SupplyCurveField.COST_BASE_VOC_USD_PER_AC_MWH: "$/MWh",
|
692
|
+
SupplyCurveField.COST_SITE_VOC_USD_PER_AC_MWH: "$/MWh",
|
693
|
+
|
694
|
+
SupplyCurveField.BESPOKE_AEP: "MWh",
|
695
|
+
SupplyCurveField.BESPOKE_CAPITAL_COST: "$",
|
696
|
+
SupplyCurveField.BESPOKE_FIXED_OPERATING_COST: "$/year",
|
697
|
+
SupplyCurveField.BESPOKE_VARIABLE_OPERATING_COST: "$/kWh",
|
698
|
+
SupplyCurveField.BESPOKE_BALANCE_OF_SYSTEM_COST: "$",
|
699
|
+
SupplyCurveField.INCLUDED_AREA: "km2",
|
700
|
+
SupplyCurveField.INCLUDED_AREA_CAPACITY_DENSITY: "MW/km2",
|
701
|
+
SupplyCurveField.CONVEX_HULL_AREA: "km2",
|
702
|
+
SupplyCurveField.CONVEX_HULL_CAPACITY_DENSITY: "MW/km2",
|
703
|
+
SupplyCurveField.FULL_CELL_CAPACITY_DENSITY: "MW/km2",
|
704
|
+
|
705
|
+
SupplyCurveField.LCOT: "$/MWh",
|
706
|
+
SupplyCurveField.MEAN_RES: "varies",
|
707
|
+
SupplyCurveField.REINFORCEMENT_COST_PER_MW: "$/MWac",
|
708
|
+
SupplyCurveField.REINFORCEMENT_DIST_KM: "km",
|
709
|
+
SupplyCurveField.TOTAL_LCOE: "$/MWh",
|
710
|
+
SupplyCurveField.TOTAL_TRANS_CAP_COST_PER_MW: "$/MWac",
|
711
|
+
SupplyCurveField.DIST_SPUR_KM: "km",
|
712
|
+
SupplyCurveField.DIST_EXPORT_KM: "km",
|
713
|
+
SupplyCurveField.TIE_LINE_COST_PER_MW: "$/MWac",
|
714
|
+
SupplyCurveField.CONNECTION_COST_PER_MW: "$/MWac",
|
715
|
+
SupplyCurveField.EXPORT_COST_PER_MW: "$/MWac",
|
716
|
+
|
717
|
+
SupplyCurveField.POI_LAT: "degrees",
|
718
|
+
SupplyCurveField.POI_LON: "degrees",
|
719
|
+
SupplyCurveField.REINFORCEMENT_POI_LAT: "degrees",
|
720
|
+
SupplyCurveField.REINFORCEMENT_POI_LON: "degrees",
|
721
|
+
|
722
|
+
}
|
reV/utilities/cli_functions.py
CHANGED
@@ -5,10 +5,11 @@ General CLI utility functions.
|
|
5
5
|
import logging
|
6
6
|
from warnings import warn
|
7
7
|
|
8
|
+
import pandas as pd
|
8
9
|
from gaps.pipeline import Status
|
9
10
|
from rex.utilities.loggers import init_mult
|
10
11
|
|
11
|
-
from reV.utilities import ModuleName
|
12
|
+
from reV.utilities import ModuleName, SupplyCurveField
|
12
13
|
from reV.utilities.exceptions import ConfigWarning, PipelineError
|
13
14
|
|
14
15
|
|
@@ -115,3 +116,44 @@ def parse_from_pipeline(config, out_dir, config_key, target_modules):
|
|
115
116
|
.format(config_key, val[0]))
|
116
117
|
|
117
118
|
return config
|
119
|
+
|
120
|
+
|
121
|
+
def compile_descriptions(cols=None):
|
122
|
+
"""Compile a meta table with reV column descriptions.
|
123
|
+
|
124
|
+
Descriptions are pulled from the
|
125
|
+
:class:`~reV.utilities.SupplyCurveField` enum, which
|
126
|
+
contains the known reV supply curve field descriptions. Columns
|
127
|
+
which do not have a known description are excluded from the
|
128
|
+
output.
|
129
|
+
|
130
|
+
Parameters
|
131
|
+
----------
|
132
|
+
cols : iterable, optional
|
133
|
+
Optional iterable of column names to include in the output.
|
134
|
+
By default, ``None``, which compiles all known reV supply curve
|
135
|
+
field descriptions.
|
136
|
+
|
137
|
+
Returns
|
138
|
+
-------
|
139
|
+
pd.DataFrame
|
140
|
+
Pandas DataFrame containing column names, corresponding units,
|
141
|
+
and descriptions for each column. Only columns that have a known
|
142
|
+
description are included in the output.
|
143
|
+
"""
|
144
|
+
if not cols:
|
145
|
+
cols = [c.value for c in SupplyCurveField]
|
146
|
+
|
147
|
+
data = []
|
148
|
+
for col in cols:
|
149
|
+
try:
|
150
|
+
scf = SupplyCurveField(col)
|
151
|
+
except ValueError:
|
152
|
+
continue
|
153
|
+
|
154
|
+
if scf.description is None:
|
155
|
+
continue
|
156
|
+
|
157
|
+
data.append((str(scf), scf.units, scf.description))
|
158
|
+
|
159
|
+
return pd.DataFrame(data, columns=["reV Column", "Units", "Description"])
|
reV/version.py
CHANGED
File without changes
|
File without changes
|
File without changes
|