@@ -1382,32 +1382,45 @@ def run_plant_optimization(self):
1382
1382
eos_mult = (self .plant_optimizer .capital_cost
1383
1383
/ self .plant_optimizer .capacity
1384
1384
/ baseline_cost )
1385
- reg_mult = self .sam_sys_inputs .get ("capital_cost_multiplier" , 1 )
1385
+ reg_mult_cc = self .sam_sys_inputs .get (
1386
+ "capital_cost_multiplier" , 1 )
1387
+ reg_mult_foc = self .sam_sys_inputs .get (
1388
+ "fixed_operating_cost_multiplier" , 1 )
1389
+ reg_mult_voc = self .sam_sys_inputs .get (
1390
+ "variable_operating_cost_multiplier" , 1 )
1391
+ reg_mult_bos = self .sam_sys_inputs .get (
1392
+ "balance_of_system_cost_multiplier" , 1 )
1386
1393
1387
1394
self ._meta [SupplyCurveField .EOS_MULT ] = eos_mult
1388
- self ._meta [SupplyCurveField .REG_MULT ] = reg_mult
1395
+ self ._meta [SupplyCurveField .REG_MULT ] = reg_mult_cc
1389
1396
1390
- cap_cost = (
1391
- self .plant_optimizer .capital_cost
1392
- + self .plant_optimizer .balance_of_system_cost
1393
- )
1394
1397
self ._meta [SupplyCurveField .COST_SITE_OCC_USD_PER_AC_MW ] = (
1395
- cap_cost / capacity_ac_mw
1398
+ (self .plant_optimizer .capital_cost
1399
+ + self .plant_optimizer .balance_of_system_cost )
1400
+ / capacity_ac_mw
1396
1401
)
1397
1402
self ._meta [SupplyCurveField .COST_BASE_OCC_USD_PER_AC_MW ] = (
1398
- cap_cost / eos_mult / reg_mult / capacity_ac_mw
1403
+ (self .plant_optimizer .capital_cost / eos_mult / reg_mult_cc
1404
+ + self .plant_optimizer .balance_of_system_cost / reg_mult_bos )
1405
+ / capacity_ac_mw
1399
1406
)
1400
1407
self ._meta [SupplyCurveField .COST_SITE_FOC_USD_PER_AC_MW ] = (
1401
- self .plant_optimizer .fixed_operating_cost / capacity_ac_mw
1408
+ self .plant_optimizer .fixed_operating_cost
1409
+ / capacity_ac_mw
1402
1410
)
1403
1411
self ._meta [SupplyCurveField .COST_BASE_FOC_USD_PER_AC_MW ] = (
1404
- self .plant_optimizer .fixed_operating_cost / capacity_ac_mw
1412
+ self .plant_optimizer .fixed_operating_cost
1413
+ / reg_mult_foc
1414
+ / capacity_ac_mw
1405
1415
)
1406
1416
self ._meta [SupplyCurveField .COST_SITE_VOC_USD_PER_AC_MW ] = (
1407
- self .plant_optimizer .variable_operating_cost / capacity_ac_mw
1417
+ self .plant_optimizer .variable_operating_cost
1418
+ / capacity_ac_mw
1408
1419
)
1409
1420
self ._meta [SupplyCurveField .COST_BASE_VOC_USD_PER_AC_MW ] = (
1410
- self .plant_optimizer .variable_operating_cost / capacity_ac_mw
1421
+ self .plant_optimizer .variable_operating_cost
1422
+ / reg_mult_voc
1423
+ / capacity_ac_mw
1411
1424
)
1412
1425
self ._meta [SupplyCurveField .FIXED_CHARGE_RATE ] = (
1413
1426
self .plant_optimizer .fixed_charge_rate
@@ -1489,8 +1502,9 @@ def __init__(self, excl_fpath, res_fpath, tm_dset, objective_function,
1489
1502
ws_bins = (0.0 , 20.0 , 5.0 ), wd_bins = (0.0 , 360.0 , 45.0 ),
1490
1503
excl_dict = None , area_filter_kernel = 'queen' , min_area = None ,
1491
1504
resolution = 64 , excl_area = None , data_layers = None ,
1492
- pre_extract_inclusions = False , prior_run = None , gid_map = None ,
1493
- bias_correct = None , pre_load_data = False ):
1505
+ pre_extract_inclusions = False , eos_mult_baseline_cap_mw = 200 ,
1506
+ prior_run = None , gid_map = None , bias_correct = None ,
1507
+ pre_load_data = False ):
1494
1508
"""reV bespoke analysis class.
1495
1509
1496
1510
Much like generation, ``reV`` bespoke analysis runs SAM
@@ -1855,6 +1869,13 @@ def __init__(self, excl_fpath, res_fpath, tm_dset, objective_function,
1855
1869
the `excl_dict` input. It is typically faster to compute
1856
1870
the inclusion mask on the fly with parallel workers.
1857
1871
By default, ``False``.
1872
+ eos_mult_baseline_cap_mw : int | float, optional
1873
+ Baseline plant capacity (MW) used to calculate economies of
1874
+ scale (EOS) multiplier from the `capital_cost_function`. EOS
1875
+ multiplier is calculated as the $-per-kW of the wind plant
1876
+ divided by the $-per-kW of a plant with this baseline
1877
+ capacity. By default, `200` (MW), which aligns the baseline
1878
+ with ATB assumptions. See here: https://tinyurl.com/y85hnu6h.
1858
1879
prior_run : str, optional
1859
1880
Optional filepath to a bespoke output HDF5 file belonging to
1860
1881
a prior run. If specified, this module will only run the
@@ -1980,6 +2001,7 @@ def __init__(self, excl_fpath, res_fpath, tm_dset, objective_function,
1980
2001
self ._ws_bins = ws_bins
1981
2002
self ._wd_bins = wd_bins
1982
2003
self ._data_layers = data_layers
2004
+ self ._eos_mult_baseline_cap_mw = eos_mult_baseline_cap_mw
1983
2005
self ._prior_meta = self ._parse_prior_run (prior_run )
1984
2006
self ._gid_map = BespokeSinglePlant ._parse_gid_map (gid_map )
1985
2007
self ._bias_correct = Gen ._parse_bc (bias_correct )
@@ -2453,8 +2475,8 @@ def run_serial(cls, excl_fpath, res_fpath, tm_dset,
2453
2475
area_filter_kernel = 'queen' , min_area = None ,
2454
2476
resolution = 64 , excl_area = 0.0081 , data_layers = None ,
2455
2477
gids = None , exclusion_shape = None , slice_lookup = None ,
2456
- prior_meta = None , gid_map = None , bias_correct = None ,
2457
- pre_loaded_data = None ):
2478
+ eos_mult_baseline_cap_mw = 200 , prior_meta = None ,
2479
+ gid_map = None , bias_correct = None , pre_loaded_data = None ):
2458
2480
"""
2459
2481
Standalone serial method to run bespoke optimization.
2460
2482
See BespokeWindPlants docstring for parameter description.
@@ -2520,6 +2542,7 @@ def run_serial(cls, excl_fpath, res_fpath, tm_dset,
2520
2542
excl_area = excl_area ,
2521
2543
data_layers = data_layers ,
2522
2544
exclusion_shape = exclusion_shape ,
2545
+ eos_mult_baseline_cap_mw = eos_mult_baseline_cap_mw ,
2523
2546
prior_meta = prior_meta ,
2524
2547
gid_map = gid_map ,
2525
2548
bias_correct = bias_correct ,
@@ -2612,6 +2635,7 @@ def run_parallel(self, max_workers=None):
2612
2635
gids = gid ,
2613
2636
exclusion_shape = self .shape ,
2614
2637
slice_lookup = copy .deepcopy (self .slice_lookup ),
2638
+ eos_mult_baseline_cap_mw = self ._eos_mult_baseline_cap_mw ,
2615
2639
prior_meta = self ._get_prior_meta (gid ),
2616
2640
gid_map = self ._gid_map ,
2617
2641
bias_correct = self ._get_bc_for_gid (gid ),
@@ -2676,6 +2700,7 @@ def run(self, out_fpath=None, max_workers=None):
2676
2700
afk = self ._area_filter_kernel
2677
2701
wlm = self ._wake_loss_multiplier
2678
2702
i_bc = self ._get_bc_for_gid (gid )
2703
+ ebc = self ._eos_mult_baseline_cap_mw
2679
2704
2680
2705
si = self .run_serial (self ._excl_fpath ,
2681
2706
self ._res_fpath ,
@@ -2700,6 +2725,7 @@ def run(self, out_fpath=None, max_workers=None):
2700
2725
excl_area = self ._excl_area ,
2701
2726
data_layers = self ._data_layers ,
2702
2727
slice_lookup = slice_lookup ,
2728
+ eos_mult_baseline_cap_mw = ebc ,
2703
2729
prior_meta = prior_meta ,
2704
2730
gid_map = self ._gid_map ,
2705
2731
bias_correct = i_bc ,
0 commit comments