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.
- {NREL_reV-0.9.0.dist-info → NREL_reV-0.9.2.dist-info}/METADATA +1 -1
- {NREL_reV-0.9.0.dist-info → NREL_reV-0.9.2.dist-info}/RECORD +15 -15
- reV/SAM/SAM.py +3 -0
- reV/SAM/generation.py +40 -7
- reV/bespoke/bespoke.py +7 -7
- reV/econ/econ.py +22 -11
- reV/econ/economies_of_scale.py +3 -7
- reV/generation/generation.py +19 -10
- reV/supply_curve/points.py +11 -6
- reV/supply_curve/supply_curve.py +2 -3
- reV/version.py +1 -1
- {NREL_reV-0.9.0.dist-info → NREL_reV-0.9.2.dist-info}/LICENSE +0 -0
- {NREL_reV-0.9.0.dist-info → NREL_reV-0.9.2.dist-info}/WHEEL +0 -0
- {NREL_reV-0.9.0.dist-info → NREL_reV-0.9.2.dist-info}/entry_points.txt +0 -0
- {NREL_reV-0.9.0.dist-info → NREL_reV-0.9.2.dist-info}/top_level.txt +0 -0
@@ -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=
|
4
|
-
reV/SAM/SAM.py,sha256=
|
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=
|
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=
|
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=
|
35
|
-
reV/econ/economies_of_scale.py,sha256=
|
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=
|
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=
|
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=
|
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.
|
93
|
-
NREL_reV-0.9.
|
94
|
-
NREL_reV-0.9.
|
95
|
-
NREL_reV-0.9.
|
96
|
-
NREL_reV-0.9.
|
97
|
-
NREL_reV-0.9.
|
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
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
|
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
|
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
|
-
|
1916
|
+
foc = foc_per_kw * plant_size_kw
|
1894
1917
|
logger.debug(
|
1895
|
-
"Setting the fixed_operating_cost to ${:,.2f}".format(
|
1896
|
-
|
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["
|
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] =
|
1267
|
-
self._meta[SupplyCurveField.MEAN_CF_AC] =
|
1268
|
-
self._meta[SupplyCurveField.MEAN_LCOE] =
|
1269
|
-
self._meta[SupplyCurveField.SC_POINT_ANNUAL_ENERGY_MW] =
|
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] =
|
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
|
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
|
79
|
+
specified. Typically, the CSV contains the following
|
80
|
+
columns:
|
80
81
|
|
81
|
-
- ``gid``: Integer specifying the GID of each
|
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
|
-
|
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 ``
|
92
|
-
site-specific
|
93
|
-
that do not correspond to a config
|
94
|
-
but they will be ignored. A
|
95
|
-
guidelines as the CSV input
|
96
|
-
|
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
|
reV/econ/economies_of_scale.py
CHANGED
@@ -212,11 +212,7 @@ class EconomiesOfScale:
|
|
212
212
|
if cost_per_mw is None:
|
213
213
|
return None
|
214
214
|
|
215
|
-
|
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.
|
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.
|
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
|
reV/generation/generation.py
CHANGED
@@ -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
|
-
|
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
|
-
|
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 ``
|
188
|
-
site-specific
|
189
|
-
that do not correspond to a config
|
190
|
-
but they will be ignored. A
|
191
|
-
guidelines as the CSV input
|
192
|
-
|
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
|
reV/supply_curve/points.py
CHANGED
@@ -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
|
2191
|
+
return None
|
2192
2192
|
|
2193
2193
|
if dset not in self.gen.datasets:
|
2194
|
-
return
|
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
|
-
|
2396
|
-
|
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
|
|
reV/supply_curve/supply_curve.py
CHANGED
@@ -1116,8 +1116,7 @@ class SupplyCurve:
|
|
1116
1116
|
|
1117
1117
|
return table
|
1118
1118
|
|
1119
|
-
#
|
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] =
|
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
File without changes
|
File without changes
|
File without changes
|
File without changes
|