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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: NREL-reV
3
- Version: 0.8.9
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=5sOKYlhrQ6858lYWfLNR9VQAeS8QEJLD468IpSw5c6c,50
4
- reV/SAM/SAM.py,sha256=0mtFxEpKUKAxWDq0q963i_uCEpB9ysab4thqCxQ38Nc,30332
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=cK1wcg78D6aE91u1_pwS52TjxIsZrZbE48wivJxTyiY,87525
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=Z8WlSAL7MtndXCv4Zt-cTtVx50lI8gj5eE__As7UAmA,103328
18
- reV/bespoke/cli_bespoke.py,sha256=dtUbmzLwJRP6arCC29heWTiMtybRBGJjS2qPprfYphk,2892
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=EHKwZiqhargWoZc6HKYgdKEFRah8Z8gOkLXtmLYZYgI,20349
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=nIv76smnQwAjOEJ-VmOAV6gGZ656DnyRYNnmoV3jxxg,3977
30
- reV/config/project_points.py,sha256=XQS827NE4oh_3_9S-NccBsooFX7Vkn6_W29QL0kxQT4,37857
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=5KERAXTWm_TsQRV96m4ZeDyYlEiSGa43A_ubBIZ7y74,22987
35
- reV/econ/economies_of_scale.py,sha256=-PBX0TFNAYzEbj5zF0pYdz3W9hQFIuj0FI0BDwbsALk,9760
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=Rst2jttjg5knfKZC8DJSIfaRTQ3Ueq9DTSsh1LCq4lw,47943
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=shaX6vMJ6pW8i3qiUkZYPYeTAkfWRMIJSh_UgHrKnWE,45389
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=KVU3bo-qEooPl6YlhZf45oy_b_LMx8jgBwQUg-sISVI,576
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=YfcU9X_XPatfGGUe08BxqGKQrsg6Ut3k5S2t4tNtDo8,164
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=u1qKlcdq0nXMXkyzN9zEA6BETVhQ0ZPodnIGPrMxELw,29710
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=NiDB5HCLAsVYSNo8WBEZMebNQ7CCkm9czNbIPTuUm6U,24634
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=kP-wXVL5AsBtNfPi8APvGVi9nuAeMomydR2iE828mCU,4824
60
- reV/hybrids/hybrids.py,sha256=fIhYsrYvdGDiHhGp4eZunrV-9FcdlrGAefL40-vbw8k,46590
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=hgSbN30x5SBB8BwJdmqdpRfRcQKnAWTjknPsPfSOMfE,36949
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=ia4m52MpK5237DL8I5RxeLfUPbiONpNtsIc0GasaxcQ,17059
71
- reV/qa_qc/summary.py,sha256=d9niU6k93cX-unoYUZ-JViDfStJR5Ume3n25mwfHe_k,31255
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=7xmaQmrxuCyrYd8UVXaiQuVCB11ZsQadk_psbNca2-g,48245
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=d-fLcwlSMvS_pfSKRJaaMqeJoBD7gY3vjSvC__JIQsI,42949
81
- reV/supply_curve/extent.py,sha256=jLeW8QywfRGnat1ggMBkENKqSPJQ-KKa8YnzjW5R7PQ,17429
82
- reV/supply_curve/points.py,sha256=8kPLNG6erBhfIoXicay5vhRTJRebi9L1dZLIHBTuilI,81669
83
- reV/supply_curve/sc_aggregation.py,sha256=bCOOC2XlrWDGtEIJykUlTXWapIRb5BVf2GxDNWGfc9Y,63039
84
- reV/supply_curve/supply_curve.py,sha256=VD2B3lrw5gTQQ03HKv7G-E2mTBsiZsQCCegKPnjYyfY,66599
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=oWNYacCjbRlEfjLBUIEt4nkX8F2yDU972eRqm6JVCp8,7062
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.8.9.dist-info/LICENSE,sha256=hDwoTANtan2ZpufBlXm5C3W_PJ-mCqItvlcobgjxL7k,1526
93
- NREL_reV-0.8.9.dist-info/METADATA,sha256=b8TaKuWDwjUFkcDnhf8l5_gbE7r3SIJvOXIPV2a6TJc,10264
94
- NREL_reV-0.8.9.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
95
- NREL_reV-0.8.9.dist-info/entry_points.txt,sha256=KGtPEOQRZMSqKXjjv5jt_T4e4HQN0fHiaGdAWwTtuW4,617
96
- NREL_reV-0.8.9.dist-info/top_level.txt,sha256=S6YF2ZYgXUB6n28SY0K2H8YB9tMJdXQ9CyQbo6VC89M,4
97
- NREL_reV-0.8.9.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
@@ -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``=1.
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``=1.
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 a
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["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.