NREL-reV 0.8.9__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.8.9.dist-info → NREL_reV-0.9.2.dist-info}/METADATA +2 -1
- {NREL_reV-0.8.9.dist-info → NREL_reV-0.9.2.dist-info}/RECORD +34 -34
- reV/SAM/SAM.py +38 -0
- reV/SAM/generation.py +43 -10
- reV/bespoke/bespoke.py +304 -245
- reV/bespoke/cli_bespoke.py +2 -0
- reV/bespoke/place_turbines.py +181 -37
- reV/config/output_request.py +2 -1
- reV/config/project_points.py +1 -3
- reV/econ/econ.py +24 -13
- reV/econ/economies_of_scale.py +54 -35
- reV/generation/base.py +22 -2
- reV/generation/generation.py +50 -23
- reV/generation/output_attributes/lcoe_fcr_inputs.json +38 -3
- reV/handlers/__init__.py +0 -1
- reV/handlers/multi_year.py +45 -17
- reV/handlers/transmission.py +44 -27
- reV/hybrids/hybrid_methods.py +16 -14
- reV/hybrids/hybrids.py +10 -10
- reV/nrwal/nrwal.py +1 -1
- reV/qa_qc/qa_qc.py +1 -1
- reV/qa_qc/summary.py +4 -4
- reV/rep_profiles/rep_profiles.py +1 -1
- reV/supply_curve/exclusions.py +1 -1
- reV/supply_curve/extent.py +1 -1
- reV/supply_curve/points.py +254 -131
- reV/supply_curve/sc_aggregation.py +13 -45
- reV/supply_curve/supply_curve.py +200 -141
- reV/utilities/__init__.py +114 -39
- reV/version.py +1 -1
- {NREL_reV-0.8.9.dist-info → NREL_reV-0.9.2.dist-info}/LICENSE +0 -0
- {NREL_reV-0.8.9.dist-info → NREL_reV-0.9.2.dist-info}/WHEEL +0 -0
- {NREL_reV-0.8.9.dist-info → NREL_reV-0.9.2.dist-info}/entry_points.txt +0 -0
- {NREL_reV-0.8.9.dist-info → NREL_reV-0.9.2.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: NREL-reV
|
3
|
-
Version: 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
|
@@ -21,6 +21,7 @@ Requires-Dist: NREL-gaps >=0.6.11
|
|
21
21
|
Requires-Dist: NREL-NRWAL >=0.0.7
|
22
22
|
Requires-Dist: NREL-PySAM ~=4.1.0
|
23
23
|
Requires-Dist: NREL-rex >=0.2.85
|
24
|
+
Requires-Dist: numpy ~=1.24.4
|
24
25
|
Requires-Dist: packaging >=20.3
|
25
26
|
Requires-Dist: plotly >=4.7.1
|
26
27
|
Requires-Dist: plotting >=0.0.6
|
@@ -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,11 +14,11 @@ 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=
|
18
|
-
reV/bespoke/cli_bespoke.py,sha256=
|
17
|
+
reV/bespoke/bespoke.py,sha256=DgNPIeCmeqpOSaMbaqmJKQGatoLd8MOPTTQpZBlvzJI,110353
|
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
|
21
|
-
reV/bespoke/place_turbines.py,sha256=
|
21
|
+
reV/bespoke/place_turbines.py,sha256=Dy_dfGcLDjixK6jEaZdMmx575lY_S2XFvoy_8tGFbH0,26608
|
22
22
|
reV/bespoke/plotting_functions.py,sha256=VDJlA-fyN1O_ZA32P6EGEO7w4Ld5HnsENMx7wcayISo,5619
|
23
23
|
reV/config/__init__.py,sha256=oqFNU4JESU_fPxFmPyQNFAXLDAdzmTlPuabXTe3Rf2Y,92
|
24
24
|
reV/config/base_analysis_config.py,sha256=NvA3g5zQz8mIrV8ZSENLq0XBZGXa6RTGkwpZ76TVZj8,5615
|
@@ -26,72 +26,72 @@ reV/config/base_config.py,sha256=a748VQ3CRs9RVi5sSEPcaWOyH6R3t5tssaFqZntHyaE,100
|
|
26
26
|
reV/config/cli_project_points.py,sha256=6edOlLNOG-ZEbcpNS2MPfu-DXjcOTEh_MEvKOvQSZj4,6010
|
27
27
|
reV/config/curtailment.py,sha256=1bH7xzxOmD4PwLKcXFNotMAa9iCfGBUm2DKTOXViCJg,5548
|
28
28
|
reV/config/execution.py,sha256=hyf8W7XYUXE6tXBXs-4En7h_aDTYu8FzbslgBsKLJkQ,5046
|
29
|
-
reV/config/output_request.py,sha256=
|
30
|
-
reV/config/project_points.py,sha256=
|
29
|
+
reV/config/output_request.py,sha256=0aAV8_YrJGcskZGrfhS9EMml6B1tCcBn8SSkwTG11CI,4020
|
30
|
+
reV/config/project_points.py,sha256=NmIj7hQm4qSMBqgefZDRNot2B8APCDk0ynTwegk-1Go,37788
|
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
|
-
reV/generation/base.py,sha256=
|
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
|
-
reV/generation/output_attributes/lcoe_fcr_inputs.json,sha256=
|
43
|
+
reV/generation/output_attributes/lcoe_fcr_inputs.json,sha256=Yb-WTXt9YD4wE4Uu315W2uLFH6g3fT40YY83mxS-aWE,1289
|
44
44
|
reV/generation/output_attributes/linear_fresnel.json,sha256=B7mq-Hxg8oIDxnvKxp2Y43qbkueTZReq2_weMbRJfy4,1218
|
45
45
|
reV/generation/output_attributes/other.json,sha256=3OQ8Vj1B8YKJHhLyOuBp60IZUiITrGXX86xeOVypdWE,111
|
46
46
|
reV/generation/output_attributes/single_owner.json,sha256=y-7yg9o45_g67YFl32i8288kmUIBpB9RzolIusFcDN0,827
|
47
47
|
reV/generation/output_attributes/solar_water_heat.json,sha256=gslLJ59Sx4hD15a4UPzbfF_YtJnKjj1QGavg8Bh-F3g,1659
|
48
48
|
reV/generation/output_attributes/trough_heat.json,sha256=JrVEyPAQRZYWDT1Fq2grxNvnAes8G9jCJisA8HwV7bw,1086
|
49
49
|
reV/generation/output_attributes/windbos.json,sha256=mTKIpzkon4HECm83VqB9wCGBXLxVjac3K0jsIB2g0Sc,557
|
50
|
-
reV/handlers/__init__.py,sha256=
|
50
|
+
reV/handlers/__init__.py,sha256=N7KfWbXfHLizMpoUw6yo0egbyq3jb9QL4YouBLUf4mI,130
|
51
51
|
reV/handlers/cli_collect.py,sha256=QRjhuJ1lV4BwGoguu0m4etrNRPMXGIZlijNyYsb7_5U,799
|
52
52
|
reV/handlers/cli_multi_year.py,sha256=xMAQ70lVUMAPM10EkZwc_FreQLjnzQ9VmKl48MS1SO0,660
|
53
53
|
reV/handlers/exclusions.py,sha256=_s-LHbjHAAHSIM6tFXCoJlLKcv0FBxbm6JAmuE_X_-I,12266
|
54
|
-
reV/handlers/multi_year.py,sha256=
|
54
|
+
reV/handlers/multi_year.py,sha256=3s4sYWBl9-1rxeTBTMkl5lDeFqCioi4uuxcZlbWmIbE,30998
|
55
55
|
reV/handlers/outputs.py,sha256=VbSPFwA0ZH-oWUCCtef7zGyPbWXKY07ilPzpZIOMmuc,6034
|
56
|
-
reV/handlers/transmission.py,sha256=
|
56
|
+
reV/handlers/transmission.py,sha256=JzpmiweCez7vzGSutO21XIbG9czY_H6ysg_R7z290w0,25610
|
57
57
|
reV/hybrids/__init__.py,sha256=oBrJSt9WeBlER7GVd-NEJgVqFlasl0WuyHJRMgLgpAY,133
|
58
58
|
reV/hybrids/cli_hybrids.py,sha256=XdckQy0dXeeaQdNA3EM7osmBOp9GBuk4U6u1R6waZQc,4886
|
59
|
-
reV/hybrids/hybrid_methods.py,sha256=
|
60
|
-
reV/hybrids/hybrids.py,sha256=
|
59
|
+
reV/hybrids/hybrid_methods.py,sha256=5nGb2sadp8zT9atZJNVigpYm_JYJxt4gWCPo56-5Vjk,4917
|
60
|
+
reV/hybrids/hybrids.py,sha256=7DFaqkNdAUVJxd_YDoQI-psKcJAlWgOGapYb_kIv3kw,46601
|
61
61
|
reV/losses/__init__.py,sha256=DMmJo9oOVrF1npUcjuSHo_yslf94am8xdvYrvwjEsjM,141
|
62
62
|
reV/losses/power_curve.py,sha256=eGoYZMhGCETKHc-W3TYjl0PYFQDpv4lrvc7q84OI0SY,45148
|
63
63
|
reV/losses/scheduled.py,sha256=h2Kh1xAsxn575i0gKa66TsrNXr7Rj_GlNenfmX4-Lug,26452
|
64
64
|
reV/losses/utils.py,sha256=XyM38JVlBNad9BEMJqRLuK6xba_DfFZUxNSC7EcRelM,7511
|
65
65
|
reV/nrwal/__init__.py,sha256=HD-QXvKRM5s6Z24zfKw31yhBttrkTe8hzUnx0FZP_P0,114
|
66
66
|
reV/nrwal/cli_nrwal.py,sha256=sa2gI86sNGk3ZJuQPxy_xsxle4KWDyPNrM11hlq6Ask,1825
|
67
|
-
reV/nrwal/nrwal.py,sha256=
|
67
|
+
reV/nrwal/nrwal.py,sha256=2igOFrBeMD4F_R4-Vn77LV5RV8VbalN4Vs-NPG6Ndaw,36975
|
68
68
|
reV/qa_qc/__init__.py,sha256=YIfYSZkx7d-WJq-h9Xob9VP3Gc03bP1psGAkl0bRNMg,223
|
69
69
|
reV/qa_qc/cli_qa_qc.py,sha256=qeCbOc86YuZjRXejwiQvxxsMD_nkuYj55uAcGm9zh9k,9136
|
70
|
-
reV/qa_qc/qa_qc.py,sha256=
|
71
|
-
reV/qa_qc/summary.py,sha256=
|
70
|
+
reV/qa_qc/qa_qc.py,sha256=2ah8Oiz0vOVrezQgGRIHdB-YD34r2mUdzt3f7KyQpxo,17044
|
71
|
+
reV/qa_qc/summary.py,sha256=QzfQ0Fd1-Une56XZiGZ8YMl3ir25XNYMyfm-PMB4dZo,31279
|
72
72
|
reV/rep_profiles/__init__.py,sha256=v6YZk7tGLpw5gnSckjOn22xazTnv10siCFfWQl9H_fQ,114
|
73
73
|
reV/rep_profiles/cli_rep_profiles.py,sha256=i3fRolT7HTzTQePXpNLDyxwgpRa7FEfHO1mOqiSufK4,4613
|
74
|
-
reV/rep_profiles/rep_profiles.py,sha256=
|
74
|
+
reV/rep_profiles/rep_profiles.py,sha256=oqmtU9FbUlKurkglmZLyDBNH8VRKv8fgdSuvtYWLm04,48271
|
75
75
|
reV/supply_curve/__init__.py,sha256=dbf0cO0qmt1VhV8dnDddztrcpnwua9T2HBhM6tLKaP8,274
|
76
76
|
reV/supply_curve/aggregation.py,sha256=fv4FTdRUQWZ_1Ds84ubgJdrf5lR1xb3luhAnibe3Y3Q,38752
|
77
77
|
reV/supply_curve/cli_sc_aggregation.py,sha256=drzYGFEHC3Ww1GBnk_iClFoQuXjT3nUEpv8I4Fgx8W4,2867
|
78
78
|
reV/supply_curve/cli_supply_curve.py,sha256=e-XrHQIe4OqWTL6u-TUAyHrw7Alk7vkXQ2HoLbE3zTM,2163
|
79
79
|
reV/supply_curve/competitive_wind_farms.py,sha256=eOjM72-4oWtsqxB7Wh2gnB2zVAt4LY3iPE_DqWdXbQ4,15795
|
80
|
-
reV/supply_curve/exclusions.py,sha256=
|
81
|
-
reV/supply_curve/extent.py,sha256=
|
82
|
-
reV/supply_curve/points.py,sha256=
|
83
|
-
reV/supply_curve/sc_aggregation.py,sha256=
|
84
|
-
reV/supply_curve/supply_curve.py,sha256=
|
80
|
+
reV/supply_curve/exclusions.py,sha256=4-ZxTO5Vlu03vie0V_74uvdajQfCuC8FE96Pg8I4U_c,42950
|
81
|
+
reV/supply_curve/extent.py,sha256=a31po753hXSxQ8lfcCvpE8hoKc4bY7MmYq0NO0jtdqA,17414
|
82
|
+
reV/supply_curve/points.py,sha256=YEYHpn3KlBbGqpxywrfbrUrlhL3BndgX7cVQerdB6zg,86107
|
83
|
+
reV/supply_curve/sc_aggregation.py,sha256=6kJg4CaLlFAC196azbfzA-T_wXkXSwNDQKOW-k2lqcE,61645
|
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
|
-
reV/utilities/__init__.py,sha256=
|
86
|
+
reV/utilities/__init__.py,sha256=iOvOuqcXv_WaSP627z2i2wF5820DbUSGRa7lSj23diQ,10534
|
87
87
|
reV/utilities/cli_functions.py,sha256=1_T_sXz0Ct8lW-vOk3mMRcpD6NYsc9cGI7dEujIi9z4,3864
|
88
88
|
reV/utilities/curtailment.py,sha256=fu48Lje-iyd2Awfe-6jFebvgcKSeJ3daNNTqjFI2GvM,4963
|
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.
|
93
|
-
NREL_reV-0.
|
94
|
-
NREL_reV-0.
|
95
|
-
NREL_reV-0.
|
96
|
-
NREL_reV-0.
|
97
|
-
NREL_reV-0.
|
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
@@ -626,6 +626,8 @@ class RevPySam(Sam):
|
|
626
626
|
|
627
627
|
self._meta = self._parse_meta(meta)
|
628
628
|
self._parse_site_sys_inputs(site_sys_inputs)
|
629
|
+
_add_cost_defaults(self.sam_sys_inputs)
|
630
|
+
_add_sys_capacity(self.sam_sys_inputs)
|
629
631
|
|
630
632
|
@property
|
631
633
|
def meta(self):
|
@@ -916,3 +918,39 @@ class RevPySam(Sam):
|
|
916
918
|
msg += " for site {}".format(self.site)
|
917
919
|
logger.exception(msg)
|
918
920
|
raise SAMExecutionError(msg) from e
|
921
|
+
|
922
|
+
|
923
|
+
def _add_cost_defaults(sam_inputs):
|
924
|
+
"""Add default values for required cost outputs if they are missing. """
|
925
|
+
sam_inputs.setdefault("fixed_charge_rate", None)
|
926
|
+
|
927
|
+
reg_mult = sam_inputs.setdefault("capital_cost_multiplier", 1)
|
928
|
+
capital_cost = sam_inputs.setdefault("capital_cost", None)
|
929
|
+
fixed_operating_cost = sam_inputs.setdefault("fixed_operating_cost", None)
|
930
|
+
variable_operating_cost = sam_inputs.setdefault(
|
931
|
+
"variable_operating_cost", None)
|
932
|
+
|
933
|
+
sam_inputs["base_capital_cost"] = capital_cost
|
934
|
+
sam_inputs["base_fixed_operating_cost"] = fixed_operating_cost
|
935
|
+
sam_inputs["base_variable_operating_cost"] = variable_operating_cost
|
936
|
+
if capital_cost is not None:
|
937
|
+
sam_inputs["capital_cost"] = capital_cost * reg_mult
|
938
|
+
else:
|
939
|
+
sam_inputs["capital_cost"] = None
|
940
|
+
|
941
|
+
|
942
|
+
def _add_sys_capacity(sam_inputs):
|
943
|
+
"""Add system capacity SAM input if it is missing. """
|
944
|
+
cap = sam_inputs.get("system_capacity")
|
945
|
+
if cap is None:
|
946
|
+
cap = sam_inputs.get("turbine_capacity")
|
947
|
+
|
948
|
+
if cap is None:
|
949
|
+
cap = sam_inputs.get("wind_turbine_powercurve_powerout")
|
950
|
+
if cap is not None:
|
951
|
+
cap = max(cap)
|
952
|
+
|
953
|
+
if cap is None:
|
954
|
+
cap = sam_inputs.get("nameplate")
|
955
|
+
|
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)"""
|
@@ -887,11 +896,11 @@ class AbstractSamPv(AbstractSamSolar, ABC):
|
|
887
896
|
simulate reduced performance over time.
|
888
897
|
- ``analysis_period`` : Integer representing the number of years
|
889
898
|
to include in the lifetime of the model generator. Required if
|
890
|
-
``system_use_lifetime_output
|
899
|
+
``system_use_lifetime_output`` is set to 1.
|
891
900
|
- ``dc_degradation`` : List of percentage values representing the
|
892
901
|
annual DC degradation of capacity factors. Maybe a single value
|
893
902
|
that will be compound each year or a vector of yearly rates.
|
894
|
-
Required if ``system_use_lifetime_output
|
903
|
+
Required if ``system_use_lifetime_output`` is set to 1.
|
895
904
|
|
896
905
|
You may also include the following ``reV``-specific keys:
|
897
906
|
|
@@ -1546,7 +1555,7 @@ class Geothermal(AbstractSamGenerationFromWeatherFile):
|
|
1546
1555
|
- The design temperature is lower than the resource
|
1547
1556
|
temperature by a factor of ``MAX_RT_TO_EGS_RATIO``
|
1548
1557
|
|
1549
|
-
If either of these conditions are true, the ``design_temp`` is
|
1558
|
+
If either of these conditions are true, the ``design_temp`` is
|
1550
1559
|
adjusted to match the resource temperature input in order to
|
1551
1560
|
avoid SAM errors.
|
1552
1561
|
- ``set_EGS_PDT_to_RT`` : Boolean flag to set EGS design
|
@@ -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.
|