NREL-reV 0.9.0__py3-none-any.whl → 0.9.2__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: NREL-reV
3
- Version: 0.9.0
3
+ Version: 0.9.2
4
4
  Summary: National Renewable Energy Laboratory's (NREL's) Renewable Energy Potential(V) Model: reV
5
5
  Home-page: https://nrel.github.io/reV/
6
6
  Author: Galen Maclaurin
@@ -1,11 +1,11 @@
1
1
  reV/__init__.py,sha256=tXTpWu_qVo3uotfSw_TJ-gNbidGaIPPfUTwBlpCMJ-g,856
2
2
  reV/cli.py,sha256=jfGGOr6QlLz8ghA7vBgx5-VgNsy4bBQo5DdHk42-q9A,1601
3
- reV/version.py,sha256=1L_LIr61Neb0VTgrPuHWPOXmcvf03SLALTnnaozT9Gs,50
4
- reV/SAM/SAM.py,sha256=KZ5EmHv2Uhoxh3xSDWYm7RmwMw-M7hfsh7P_qY-Shc8,31628
3
+ reV/version.py,sha256=ZggWF5z5HY0xtKYNitKGKEQSDJ5G21AZQKZMzs5u-wo,50
4
+ reV/SAM/SAM.py,sha256=SUyaWK3InUh90iQqbka-g_X36EfGuwslEfKEPCIpMrw,31691
5
5
  reV/SAM/__init__.py,sha256=LJqoncyKDY5ZP5WA4kboh561bce11F9Ge645Izah0EY,240
6
6
  reV/SAM/defaults.py,sha256=2zqT_mfrVtbvU7Pe6H4anNtiVkIyQbuJcGIOARzEsbM,7193
7
7
  reV/SAM/econ.py,sha256=dFhtUXp5eozSsPyk0XXji0HGexKJnxoct8cwE1ApHVg,20704
8
- reV/SAM/generation.py,sha256=_kDNC4ZJ_i9TUw8Tt2GdxgGqZ1hUrEe25WPr_SUas0Q,87542
8
+ reV/SAM/generation.py,sha256=D4vkir6uU9QgY_9AMQOXA-4blGcQoxRH0O6PEfgqWok,89142
9
9
  reV/SAM/version_checker.py,sha256=q-eXsmSB08A5hSelNH7uAe_bqPpqjsxaiS3OBjXBs-0,3997
10
10
  reV/SAM/windbos.py,sha256=fnq1uxtSl-vtJth0gTlHkCSsmvDbRROCo9RGdqA7hK4,7504
11
11
  reV/SAM/defaults/USA AZ Phoenix Sky Harbor Intl Ap (TMY3).csv,sha256=8QorTX0ACjgPgNV7kLSpTHOqfY4E17gkkpKB-qseiFk,406896
@@ -14,7 +14,7 @@ reV/SAM/defaults/US_Wave.csv,sha256=wvn9vGl9ZGKVHbCyq4muhMI6x1-nAaQfDS3hC4ftwBA,
14
14
  reV/SAM/defaults/geothermal.json,sha256=ivxnpxkfBrEl1MwLKXClLJfTfvF5UrbN87wpC_BFLck,2598
15
15
  reV/SAM/defaults/i_pvwattsv5.json,sha256=pZpNlK5MiowZmNwY7i9XRWp9G8pPLirwdBWCMVJVuKE,312
16
16
  reV/bespoke/__init__.py,sha256=vpXbyBUrUsTgK8UP_LafMjLiDg2CRG9WZLHPsOJoxek,109
17
- reV/bespoke/bespoke.py,sha256=22WO3APF5Tq20oifmQzrV-08amEyOmLjGZjLHsXezOU,110323
17
+ reV/bespoke/bespoke.py,sha256=DgNPIeCmeqpOSaMbaqmJKQGatoLd8MOPTTQpZBlvzJI,110353
18
18
  reV/bespoke/cli_bespoke.py,sha256=nZc6rJlfxH2IXUz9bym4EO-C1k6VvulgweWoRrMg_cE,3028
19
19
  reV/bespoke/gradient_free.py,sha256=URWV1yiO2jyWk3_GOpfpLV_wlgJhXXGmTUwCB3WTV0Y,12015
20
20
  reV/bespoke/pack_turbs.py,sha256=l4btC2dPZkLvDgAAGVhAYgAZDbvwimGYRdrQDq0xT68,3740
@@ -31,13 +31,13 @@ reV/config/project_points.py,sha256=NmIj7hQm4qSMBqgefZDRNot2B8APCDk0ynTwegk-1Go,
31
31
  reV/config/sam_config.py,sha256=xvvx2FTuliq0Sk-BjRE3I9zdDmIdwHVBnWtXCcsoc40,7998
32
32
  reV/econ/__init__.py,sha256=UId1LNaAP9lErCEXVce6JZf0qVRUvwNFOPrajdRevGo,130
33
33
  reV/econ/cli_econ.py,sha256=2KNy3JQD0EKjStaoD2r6nv3ELFw88h2E_up-UKj_sfE,4286
34
- reV/econ/econ.py,sha256=_sfUhtodY0auz1yROFCFPxUu3GUV_HvwwBo1uzOrnks,22982
35
- reV/econ/economies_of_scale.py,sha256=Hac0M5_HgYm3HmfAcHIiq0flLAJjVK-wJuyu_DDH5Gs,10634
34
+ reV/econ/econ.py,sha256=edsNPZg2amhC_GZeotkY2MU3u17NgWeCpS6okZNrwAA,23637
35
+ reV/econ/economies_of_scale.py,sha256=GfM0vj4LnwsthzhSsUnmLt78PAUHrxZI5ghWaxvoF7A,10568
36
36
  reV/econ/utilities.py,sha256=ZOA49S1jfsvdenvlL7m-BAJIrAvpAHSix5-wrSW0uLc,1232
37
37
  reV/generation/__init__.py,sha256=LBecrbpL69tROol_OwVHTKBrTqgSSxJW59fs0k3o0jQ,75
38
38
  reV/generation/base.py,sha256=p6g8Bj8T98OfKu44LTocGtEozstbUvti6wSi3oroS5U,48758
39
39
  reV/generation/cli_gen.py,sha256=5RSlr8yO9zlB-1FzFZGClqsxqsrbr9rcS_8PlOjVx2s,4435
40
- reV/generation/generation.py,sha256=WOclf4DzSy4qKpRCy4RUmnh7rkcLBcutH8NmQl9T2CQ,46367
40
+ reV/generation/generation.py,sha256=jtlUcfmQKDcXarRwj-iJBS_60TG-w2TKoowfU_1tBQg,46981
41
41
  reV/generation/output_attributes/generation.json,sha256=cy8efVCJgNSYCsR3x3_VpMCtynYS3oaQG4M2MwcdzFY,4954
42
42
  reV/generation/output_attributes/lcoe_fcr.json,sha256=d_TGMkZsmsfDXQiWfhYjFkmwqi-wKF8JdHmiMCj2h38,136
43
43
  reV/generation/output_attributes/lcoe_fcr_inputs.json,sha256=Yb-WTXt9YD4wE4Uu315W2uLFH6g3fT40YY83mxS-aWE,1289
@@ -79,9 +79,9 @@ reV/supply_curve/cli_supply_curve.py,sha256=e-XrHQIe4OqWTL6u-TUAyHrw7Alk7vkXQ2Ho
79
79
  reV/supply_curve/competitive_wind_farms.py,sha256=eOjM72-4oWtsqxB7Wh2gnB2zVAt4LY3iPE_DqWdXbQ4,15795
80
80
  reV/supply_curve/exclusions.py,sha256=4-ZxTO5Vlu03vie0V_74uvdajQfCuC8FE96Pg8I4U_c,42950
81
81
  reV/supply_curve/extent.py,sha256=a31po753hXSxQ8lfcCvpE8hoKc4bY7MmYq0NO0jtdqA,17414
82
- reV/supply_curve/points.py,sha256=0yMaxfvDW-EDMRcEMNKK5r1wdUbboR2iVVqe8DgTT0I,85944
82
+ reV/supply_curve/points.py,sha256=YEYHpn3KlBbGqpxywrfbrUrlhL3BndgX7cVQerdB6zg,86107
83
83
  reV/supply_curve/sc_aggregation.py,sha256=6kJg4CaLlFAC196azbfzA-T_wXkXSwNDQKOW-k2lqcE,61645
84
- reV/supply_curve/supply_curve.py,sha256=i_Wo5cI11hNt5zfGZiqqBNM4_qERD1dVNmud1tWJteI,69942
84
+ reV/supply_curve/supply_curve.py,sha256=igbloCkvYQwaH4zjbrYO17J7TtCTX5dKkk-TnlGJJeY,69931
85
85
  reV/supply_curve/tech_mapping.py,sha256=7him2R-8kpigI47ATSN4ncnvzuF_AzeXyrtz_jmzLug,18573
86
86
  reV/utilities/__init__.py,sha256=iOvOuqcXv_WaSP627z2i2wF5820DbUSGRa7lSj23diQ,10534
87
87
  reV/utilities/cli_functions.py,sha256=1_T_sXz0Ct8lW-vOk3mMRcpD6NYsc9cGI7dEujIi9z4,3864
@@ -89,9 +89,9 @@ reV/utilities/curtailment.py,sha256=fu48Lje-iyd2Awfe-6jFebvgcKSeJ3daNNTqjFI2GvM,
89
89
  reV/utilities/exceptions.py,sha256=f7sRGsbFLpmL6Caq_H1cD4GfVhnLMyvYUsLPA1UVDDE,3974
90
90
  reV/utilities/pytest_utils.py,sha256=T22NFEGxPOc9wRwgy0Pt2cHvw3Vam9cKwUj4AkzI7bU,3244
91
91
  reV/utilities/slots.py,sha256=xsw-JuUVZ0YeoCNuwP_HxGNxFMA4xRs1tuImXHIJqaU,2618
92
- NREL_reV-0.9.0.dist-info/LICENSE,sha256=hDwoTANtan2ZpufBlXm5C3W_PJ-mCqItvlcobgjxL7k,1526
93
- NREL_reV-0.9.0.dist-info/METADATA,sha256=hkdHRfdqhgSf-YxHU7lZss4kgeJE5fYVfWWDHpK7FRQ,10294
94
- NREL_reV-0.9.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
95
- NREL_reV-0.9.0.dist-info/entry_points.txt,sha256=KGtPEOQRZMSqKXjjv5jt_T4e4HQN0fHiaGdAWwTtuW4,617
96
- NREL_reV-0.9.0.dist-info/top_level.txt,sha256=S6YF2ZYgXUB6n28SY0K2H8YB9tMJdXQ9CyQbo6VC89M,4
97
- NREL_reV-0.9.0.dist-info/RECORD,,
92
+ NREL_reV-0.9.2.dist-info/LICENSE,sha256=hDwoTANtan2ZpufBlXm5C3W_PJ-mCqItvlcobgjxL7k,1526
93
+ NREL_reV-0.9.2.dist-info/METADATA,sha256=eIecsAhbE1ayna5v0f8gIhfDFYeHN_Mgyjdo_uLEATY,10294
94
+ NREL_reV-0.9.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
95
+ NREL_reV-0.9.2.dist-info/entry_points.txt,sha256=KGtPEOQRZMSqKXjjv5jt_T4e4HQN0fHiaGdAWwTtuW4,617
96
+ NREL_reV-0.9.2.dist-info/top_level.txt,sha256=S6YF2ZYgXUB6n28SY0K2H8YB9tMJdXQ9CyQbo6VC89M,4
97
+ NREL_reV-0.9.2.dist-info/RECORD,,
reV/SAM/SAM.py CHANGED
@@ -950,4 +950,7 @@ def _add_sys_capacity(sam_inputs):
950
950
  if cap is not None:
951
951
  cap = max(cap)
952
952
 
953
+ if cap is None:
954
+ cap = sam_inputs.get("nameplate")
955
+
953
956
  sam_inputs["system_capacity"] = cap
reV/SAM/generation.py CHANGED
@@ -233,6 +233,15 @@ class AbstractSamGeneration(RevPySam, ScheduledLossesMixin, ABC):
233
233
  logger.error(msg)
234
234
  raise InputError(msg)
235
235
 
236
+ if len(resource) < 8760:
237
+ msg = (f"Detected resource time series of length {len(resource)}, "
238
+ "which is less than 8760. This may yield unexpected "
239
+ "results or fail altogether. If this is not intentional, "
240
+ "try setting 'time_index_step: 1' in your SAM config or "
241
+ "double check the resource input you're using.")
242
+ logger.warning(msg)
243
+ warn(msg)
244
+
236
245
  @abstractmethod
237
246
  def set_resource_data(self, resource, meta):
238
247
  """Placeholder for resource data setting (nsrdb or wtk)"""
@@ -1786,6 +1795,10 @@ class Geothermal(AbstractSamGenerationFromWeatherFile):
1786
1795
  "{}".format(self.sam_sys_inputs["nameplate"])
1787
1796
  )
1788
1797
  logger.info(msg)
1798
+ # required for downstream LCOE calcs
1799
+ self.sam_sys_inputs["system_capacity"] = (
1800
+ self.sam_sys_inputs["nameplate"]
1801
+ )
1789
1802
  return
1790
1803
 
1791
1804
  val = set(resource["potential_MW"].unique())
@@ -1801,6 +1814,8 @@ class Geothermal(AbstractSamGenerationFromWeatherFile):
1801
1814
 
1802
1815
  logger.debug("Setting the nameplate to {}".format(val))
1803
1816
  self.sam_sys_inputs["nameplate"] = val
1817
+ # required for downstream LCOE calcs
1818
+ self.sam_sys_inputs["system_capacity"] = val
1804
1819
 
1805
1820
  def _set_resource_potential_to_match_gross_output(self):
1806
1821
  """Set the resource potential input to match the gross generation.
@@ -1861,7 +1876,9 @@ class Geothermal(AbstractSamGenerationFromWeatherFile):
1861
1876
  logger.debug(
1862
1877
  "Setting the capital_cost to ${:,.2f}".format(capital_cost)
1863
1878
  )
1864
- self.sam_sys_inputs["capital_cost"] = capital_cost
1879
+ reg_mult = self.sam_sys_inputs.get("capital_cost_multiplier", 1)
1880
+ self.sam_sys_inputs["base_capital_cost"] = capital_cost
1881
+ self.sam_sys_inputs["capital_cost"] = capital_cost * reg_mult
1865
1882
 
1866
1883
  dc_per_well = self.sam_sys_inputs.pop("drill_cost_per_well", None)
1867
1884
  num_wells = self.sam_sys_inputs.pop(
@@ -1884,19 +1901,35 @@ class Geothermal(AbstractSamGenerationFromWeatherFile):
1884
1901
  drill_cost, num_wells, dc_per_well
1885
1902
  )
1886
1903
  )
1887
- self.sam_sys_inputs["capital_cost"] = capital_cost + drill_cost
1904
+ reg_mult = self.sam_sys_inputs.get(
1905
+ "capital_cost_multiplier", 1
1906
+ )
1907
+ base_cc = capital_cost / reg_mult
1908
+ new_base_cc = base_cc + drill_cost
1909
+ self.sam_sys_inputs["base_capital_cost"] = new_base_cc
1910
+ self.sam_sys_inputs["capital_cost"] = new_base_cc * reg_mult
1888
1911
 
1889
1912
  foc_per_kw = self.sam_sys_inputs.pop(
1890
1913
  "fixed_operating_cost_per_kw", None
1891
1914
  )
1892
1915
  if foc_per_kw is not None:
1893
- fixed_operating_cost = foc_per_kw * plant_size_kw
1916
+ foc = foc_per_kw * plant_size_kw
1894
1917
  logger.debug(
1895
- "Setting the fixed_operating_cost to ${:,.2f}".format(
1896
- capital_cost
1897
- )
1918
+ "Setting the fixed_operating_cost to ${:,.2f}".format(foc)
1919
+ )
1920
+ self.sam_sys_inputs["base_fixed_operating_cost"] = foc
1921
+ self.sam_sys_inputs["fixed_operating_cost"] = foc
1922
+
1923
+ voc_per_kw = self.sam_sys_inputs.pop(
1924
+ "variable_operating_cost_per_kw", None
1925
+ )
1926
+ if voc_per_kw is not None:
1927
+ voc = voc_per_kw * plant_size_kw
1928
+ logger.debug(
1929
+ "Setting the variable_operating_cost to ${:,.2f}".format(voc)
1898
1930
  )
1899
- self.sam_sys_inputs["fixed_operating_cost"] = fixed_operating_cost
1931
+ self.sam_sys_inputs["base_variable_operating_cost"] = voc
1932
+ self.sam_sys_inputs["variable_operating_cost"] = voc
1900
1933
 
1901
1934
  def _create_pysam_wfile(self, resource, meta):
1902
1935
  """Create PySAM weather input file.
reV/bespoke/bespoke.py CHANGED
@@ -1263,10 +1263,10 @@ class BespokeSinglePlant:
1263
1263
  self._outputs.update(means)
1264
1264
 
1265
1265
  self._meta[SupplyCurveField.MEAN_RES] = self.res_df["windspeed"].mean()
1266
- self._meta[SupplyCurveField.MEAN_CF_DC] = None
1267
- self._meta[SupplyCurveField.MEAN_CF_AC] = None
1268
- self._meta[SupplyCurveField.MEAN_LCOE] = None
1269
- self._meta[SupplyCurveField.SC_POINT_ANNUAL_ENERGY_MW] = None
1266
+ self._meta[SupplyCurveField.MEAN_CF_DC] = np.nan
1267
+ self._meta[SupplyCurveField.MEAN_CF_AC] = np.nan
1268
+ self._meta[SupplyCurveField.MEAN_LCOE] = np.nan
1269
+ self._meta[SupplyCurveField.SC_POINT_ANNUAL_ENERGY_MW] = np.nan
1270
1270
  # copy dataset outputs to meta data for supply curve table summary
1271
1271
  if "cf_mean-means" in self.outputs:
1272
1272
  self._meta.loc[:, SupplyCurveField.MEAN_CF_AC] = self.outputs[
@@ -1373,7 +1373,7 @@ class BespokeSinglePlant:
1373
1373
  # convert SAM system capacity in kW to reV supply curve cap in MW
1374
1374
  capacity_ac_mw = system_capacity_kw / 1e3
1375
1375
  self._meta[SupplyCurveField.CAPACITY_AC_MW] = capacity_ac_mw
1376
- self._meta[SupplyCurveField.CAPACITY_DC_MW] = None
1376
+ self._meta[SupplyCurveField.CAPACITY_DC_MW] = np.nan
1377
1377
 
1378
1378
  # add required ReEDS multipliers to meta
1379
1379
  baseline_cost = self.plant_optimizer.capital_cost_per_kw(
@@ -1618,7 +1618,7 @@ class BespokeWindPlants(BaseAggregation):
1618
1618
  multiple sites can be specified to evaluate ``reV`` at
1619
1619
  multiple specific locations. A string pointing to a project
1620
1620
  points CSV file may also be specified. Typically, the CSV
1621
- contains two columns:
1621
+ contains the following columns:
1622
1622
 
1623
1623
  - ``gid``: Integer specifying the supply curve GID of
1624
1624
  each site.
@@ -1635,7 +1635,7 @@ class BespokeWindPlants(BaseAggregation):
1635
1635
  site-specific capital cost value for each location). Columns
1636
1636
  that do not correspond to a config key may also be included,
1637
1637
  but they will be ignored. The CSV file input can also have
1638
- these extra columns:
1638
+ these extra, optional columns:
1639
1639
 
1640
1640
  - ``capital_cost_multiplier``
1641
1641
  - ``fixed_operating_cost_multiplier``
reV/econ/econ.py CHANGED
@@ -76,25 +76,36 @@ class Econ(BaseGen):
76
76
  (or slice) representing the GIDs of multiple sites can be
77
77
  specified to evaluate reV at multiple specific locations.
78
78
  A string pointing to a project points CSV file may also be
79
- specified. Typically, the CSV contains two columns:
79
+ specified. Typically, the CSV contains the following
80
+ columns:
80
81
 
81
- - ``gid``: Integer specifying the GID of each site.
82
+ - ``gid``: Integer specifying the generation GID of each
83
+ site.
82
84
  - ``config``: Key in the `sam_files` input dictionary
83
85
  (see below) corresponding to the SAM configuration to
84
86
  use for each particular site. This value can also be
85
87
  ``None`` (or left out completely) if you specify only
86
88
  a single SAM configuration file as the `sam_files`
87
89
  input.
88
-
89
- The CSV file may also contain site-specific inputs by
90
+ - ``capital_cost_multiplier``: This is an *optional*
91
+ multiplier input that, if included, will be used to
92
+ regionally scale the ``capital_cost`` input in the SAM
93
+ config. If you include this column in your CSV, you
94
+ *do not* need to specify ``capital_cost``, unless you
95
+ would like that value to vary regionally and
96
+ independently of the multiplier (i.e. the multiplier
97
+ will still be applied on top of the ``capital_cost``
98
+ input).
99
+
100
+ The CSV file may also contain other site-specific inputs by
90
101
  including a column named after a config keyword (e.g. a
91
- column called ``capital_cost`` may be included to specify a
92
- site-specific capital cost value for each location). Columns
93
- that do not correspond to a config key may also be included,
94
- but they will be ignored. A DataFrame following the same
95
- guidelines as the CSV input (or a dictionary that can be
96
- used to initialize such a DataFrame) may be used for this
97
- input as well.
102
+ column called ``wind_turbine_rotor_diameter`` may be
103
+ included to specify a site-specific turbine diameter for
104
+ each location). Columns that do not correspond to a config
105
+ key may also be included, but they will be ignored. A
106
+ DataFrame following the same guidelines as the CSV input
107
+ (or a dictionary that can be used to initialize such a
108
+ DataFrame) may be used for this input as well.
98
109
  sam_files : dict | str
99
110
  A dictionary mapping SAM input configuration ID(s) to SAM
100
111
  configuration(s). Keys are the SAM config ID(s) which
@@ -212,11 +212,7 @@ class EconomiesOfScale:
212
212
  if cost_per_mw is None:
213
213
  return None
214
214
 
215
- cost = cap * cost_per_mw
216
- if cost > 0:
217
- return cost
218
-
219
- return None
215
+ return cap * cost_per_mw
220
216
 
221
217
  @property
222
218
  def raw_capital_cost(self):
@@ -278,7 +274,7 @@ class EconomiesOfScale:
278
274
  Fixed operating cost from input data arg
279
275
  """
280
276
  foc_from_cap = self._cost_from_cap(
281
- SupplyCurveField.COST_BASE_FOC_USD_PER_AC_MW
277
+ SupplyCurveField.COST_SITE_FOC_USD_PER_AC_MW
282
278
  )
283
279
  if foc_from_cap is not None:
284
280
  return foc_from_cap
@@ -297,7 +293,7 @@ class EconomiesOfScale:
297
293
  Variable operating cost from input data arg
298
294
  """
299
295
  voc_from_cap = self._cost_from_cap(
300
- SupplyCurveField.COST_BASE_VOC_USD_PER_AC_MW
296
+ SupplyCurveField.COST_SITE_VOC_USD_PER_AC_MW
301
297
  )
302
298
  if voc_from_cap is not None:
303
299
  return voc_from_cap
@@ -171,7 +171,7 @@ class Gen(BaseGen):
171
171
  multiple sites can be specified to evaluate reV at multiple
172
172
  specific locations. A string pointing to a project points
173
173
  CSV file may also be specified. Typically, the CSV contains
174
- two columns:
174
+ the following columns:
175
175
 
176
176
  - ``gid``: Integer specifying the generation GID of each
177
177
  site.
@@ -181,16 +181,25 @@ class Gen(BaseGen):
181
181
  ``None`` (or left out completely) if you specify only
182
182
  a single SAM configuration file as the `sam_files`
183
183
  input.
184
-
185
- The CSV file may also contain site-specific inputs by
184
+ - ``capital_cost_multiplier``: This is an *optional*
185
+ multiplier input that, if included, will be used to
186
+ regionally scale the ``capital_cost`` input in the SAM
187
+ config. If you include this column in your CSV, you
188
+ *do not* need to specify ``capital_cost``, unless you
189
+ would like that value to vary regionally and
190
+ independently of the multiplier (i.e. the multiplier
191
+ will still be applied on top of the ``capital_cost``
192
+ input).
193
+
194
+ The CSV file may also contain other site-specific inputs by
186
195
  including a column named after a config keyword (e.g. a
187
- column called ``capital_cost`` may be included to specify a
188
- site-specific capital cost value for each location). Columns
189
- that do not correspond to a config key may also be included,
190
- but they will be ignored. A DataFrame following the same
191
- guidelines as the CSV input (or a dictionary that can be
192
- used to initialize such a DataFrame) may be used for this
193
- input as well.
196
+ column called ``wind_turbine_rotor_diameter`` may be
197
+ included to specify a site-specific turbine diameter for
198
+ each location). Columns that do not correspond to a config
199
+ key may also be included, but they will be ignored. A
200
+ DataFrame following the same guidelines as the CSV input
201
+ (or a dictionary that can be used to initialize such a
202
+ DataFrame) may be used for this input as well.
194
203
 
195
204
  .. Note:: By default, the generation GID of each site is
196
205
  assumed to match the resource GID to be evaluated for that
@@ -2188,10 +2188,10 @@ class GenerationSupplyCurvePoint(AggregationSupplyCurvePoint):
2188
2188
  def _compute_cost_per_ac_mw(self, dset):
2189
2189
  """Compute a cost per AC MW for a given input. """
2190
2190
  if self._sam_system_capacity <= 0:
2191
- return 0
2191
+ return None
2192
2192
 
2193
2193
  if dset not in self.gen.datasets:
2194
- return 0
2194
+ return None
2195
2195
 
2196
2196
  sam_cost = self.exclusion_weighted_mean(self.gen[dset])
2197
2197
  sam_cost_per_mw = sam_cost / self._sam_system_capacity
@@ -2391,10 +2391,11 @@ class GenerationSupplyCurvePoint(AggregationSupplyCurvePoint):
2391
2391
  summary[SupplyCurveField.RAW_LCOE] = eos.raw_lcoe
2392
2392
  summary[SupplyCurveField.MEAN_LCOE] = eos.scaled_lcoe
2393
2393
  summary[SupplyCurveField.EOS_MULT] = eos.capital_cost_scalar
2394
- summary[SupplyCurveField.COST_SITE_OCC_USD_PER_AC_MW] = (
2395
- summary[SupplyCurveField.COST_SITE_OCC_USD_PER_AC_MW]
2396
- * summary[SupplyCurveField.EOS_MULT]
2397
- )
2394
+ cost = summary[SupplyCurveField.COST_SITE_OCC_USD_PER_AC_MW]
2395
+ if cost is not None:
2396
+ summary[SupplyCurveField.COST_SITE_OCC_USD_PER_AC_MW] = (
2397
+ cost * summary[SupplyCurveField.EOS_MULT]
2398
+ )
2398
2399
  return summary
2399
2400
 
2400
2401
  @classmethod
@@ -2537,6 +2538,10 @@ class GenerationSupplyCurvePoint(AggregationSupplyCurvePoint):
2537
2538
  if cap_cost_scale is not None:
2538
2539
  summary = point.economies_of_scale(cap_cost_scale, summary)
2539
2540
 
2541
+ for arg, val in summary.items():
2542
+ if val is None:
2543
+ summary[arg] = np.nan
2544
+
2540
2545
  return summary
2541
2546
 
2542
2547
 
@@ -1116,8 +1116,7 @@ class SupplyCurve:
1116
1116
 
1117
1117
  return table
1118
1118
 
1119
- # pylint: disable=C901
1120
- def _full_sort(
1119
+ def _full_sort( # noqa: C901
1121
1120
  self,
1122
1121
  trans_table,
1123
1122
  trans_costs=None,
@@ -1289,7 +1288,7 @@ class SupplyCurve:
1289
1288
 
1290
1289
  for col in _REQUIRED_OUTPUT_COLS:
1291
1290
  if col not in self._trans_table:
1292
- self._trans_table[col] = None
1291
+ self._trans_table[col] = np.nan
1293
1292
  if col not in columns:
1294
1293
  columns.append(col)
1295
1294
 
reV/version.py CHANGED
@@ -2,4 +2,4 @@
2
2
  reV Version number
3
3
  """
4
4
 
5
- __version__ = "0.9.0"
5
+ __version__ = "0.9.2"