NREL-reV 0.13.1__py3-none-any.whl → 0.14.1__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.4
2
2
  Name: NREL-reV
3
- Version: 0.13.1
3
+ Version: 0.14.1
4
4
  Summary: National Renewable Energy Laboratory's (NREL's) Renewable Energy Potential(V) Model: reV
5
5
  Author-email: Galen Maclaurin <galen.maclaurin@nrel.gov>
6
6
  Maintainer-email: Grant Buster <gbuster@nrel.gov>, Paul Pinchuk <ppinchuk@nrel.gov>
@@ -22,7 +22,7 @@ Description-Content-Type: text/x-rst
22
22
  License-File: LICENSE
23
23
  Requires-Dist: NREL-gaps<0.9,>=0.8.0
24
24
  Requires-Dist: NREL-NRWAL<0.1,>=0.0.11
25
- Requires-Dist: NREL-PySAM~=6.0.1
25
+ Requires-Dist: NREL-PySAM~=7.0.0
26
26
  Requires-Dist: NREL-rex<0.4,>=0.3.2
27
27
  Requires-Dist: numpy<3,>=2.0.2
28
28
  Requires-Dist: packaging<25,>=24.2
@@ -156,9 +156,6 @@ Option 1: Install from PIP (recommended for analysts):
156
156
  3. Install reV:
157
157
  1) ``pip install NREL-reV`` or
158
158
 
159
- - NOTE: If you install using conda and want to run from files directly on S3 like in the `running reV locally example <https://nrel.github.io/reV/misc/examples.running_locally.html>`_
160
- you will also need to install S3 filesystem dependencies: ``pip install NREL-reV[s3]``
161
-
162
159
  - NOTE: If you install using conda and want to use `HSDS <https://github.com/NREL/hsds-examples>`_
163
160
  you will also need to install HSDS dependencies: ``pip install NREL-reV[hsds]``
164
161
 
@@ -1,13 +1,13 @@
1
- nrel_rev-0.13.1.dist-info/licenses/LICENSE,sha256=hDwoTANtan2ZpufBlXm5C3W_PJ-mCqItvlcobgjxL7k,1526
1
+ nrel_rev-0.14.1.dist-info/licenses/LICENSE,sha256=hDwoTANtan2ZpufBlXm5C3W_PJ-mCqItvlcobgjxL7k,1526
2
2
  reV/__init__.py,sha256=tXTpWu_qVo3uotfSw_TJ-gNbidGaIPPfUTwBlpCMJ-g,856
3
- reV/cli.py,sha256=jfGGOr6QlLz8ghA7vBgx5-VgNsy4bBQo5DdHk42-q9A,1601
4
- reV/version.py,sha256=tFE8iHJ9NQJexViXNVlx8ZdUEsRZbdDU4cMmweEbpgQ,51
3
+ reV/cli.py,sha256=u7G5M5moA7q8fCgC_1MB30Z7R14GNcngVf6eVNkfQU8,1682
4
+ reV/version.py,sha256=en0eHrVgai6A_9JZVnfZf8ZSffqqCeB8YJG-3yS393g,51
5
5
  reV/SAM/SAM.py,sha256=3NK9rRaJzqH6wz7CU_5XguKCRhmoilOpDdFFsFgOaxQ,33163
6
6
  reV/SAM/__init__.py,sha256=LJqoncyKDY5ZP5WA4kboh561bce11F9Ge645Izah0EY,240
7
7
  reV/SAM/defaults.py,sha256=JQMJomX7wsbMzxKjx_IMnA_9QFsV2yWCyl_JToDVSJo,6703
8
8
  reV/SAM/econ.py,sha256=dFhtUXp5eozSsPyk0XXji0HGexKJnxoct8cwE1ApHVg,20704
9
9
  reV/SAM/generation.py,sha256=kbDiQ0a0VCrfPi6P1RSMKdjlbxuO3rgiR0-YSM1pyU8,85653
10
- reV/SAM/version_checker.py,sha256=q-eXsmSB08A5hSelNH7uAe_bqPpqjsxaiS3OBjXBs-0,3997
10
+ reV/SAM/version_checker.py,sha256=MBSPqHYmTyjXJLi1ziJ1sGS18AH9an-PZRcl-6IPJGw,3963
11
11
  reV/SAM/windbos.py,sha256=fnq1uxtSl-vtJth0gTlHkCSsmvDbRROCo9RGdqA7hK4,7504
12
12
  reV/SAM/defaults/USA AZ Phoenix Sky Harbor Intl Ap (TMY3).csv,sha256=8QorTX0ACjgPgNV7kLSpTHOqfY4E17gkkpKB-qseiFk,406896
13
13
  reV/SAM/defaults/USA CA Daggett (TMY2).csv,sha256=vVP-mk_cXj1GRHMbqsyZ60fTVMywTappzwp5-ILurFs,410050
@@ -16,7 +16,7 @@ reV/SAM/defaults/WY Southern-Flat Lands.srw,sha256=oSlFI7nnycW7SMnTXEXBXYkoh8rhV
16
16
  reV/SAM/defaults/geothermal.json,sha256=gnlxOBxxkbDDacIw6B9yP9iRkfmwj0WTWs8Zb71ytCo,7119
17
17
  reV/SAM/defaults/i_pvwattsv5.json,sha256=sF8rSe1bcqsKLXchvRxlp25dXOVe_q7rPJTf_vWR20Y,312
18
18
  reV/bespoke/__init__.py,sha256=vpXbyBUrUsTgK8UP_LafMjLiDg2CRG9WZLHPsOJoxek,109
19
- reV/bespoke/bespoke.py,sha256=2konhn_hV0YXd_h2cbBYbGPUb9oafKY0SvQhBzmOMBE,112661
19
+ reV/bespoke/bespoke.py,sha256=ZMl4kz9oAaXpZaNa5EgiD43RvKiKl3xymRv-z4lDYmQ,113169
20
20
  reV/bespoke/cli_bespoke.py,sha256=b6Xu0GKpXqPX3qVJ6-z0FrO97uCsH_1dVOa4r6IvesQ,2911
21
21
  reV/bespoke/gradient_free.py,sha256=URWV1yiO2jyWk3_GOpfpLV_wlgJhXXGmTUwCB3WTV0Y,12015
22
22
  reV/bespoke/pack_turbs.py,sha256=Dcd9F8obF8LPztzeycB5kxa5hXKSCiz3jC1WeAFUx28,3508
@@ -28,16 +28,16 @@ reV/config/cli_project_points.py,sha256=6edOlLNOG-ZEbcpNS2MPfu-DXjcOTEh_MEvKOvQS
28
28
  reV/config/curtailment.py,sha256=1bH7xzxOmD4PwLKcXFNotMAa9iCfGBUm2DKTOXViCJg,5548
29
29
  reV/config/execution.py,sha256=hyf8W7XYUXE6tXBXs-4En7h_aDTYu8FzbslgBsKLJkQ,5046
30
30
  reV/config/output_request.py,sha256=Sj3L5hcypLTCtLnKAqS7GSaI4_Hpb28QLuWT9IMCvrc,4520
31
- reV/config/project_points.py,sha256=5cY-vMXlGfgjpUDf1OeVLuUJXXXwis365JdOaclMqoY,41740
31
+ reV/config/project_points.py,sha256=CSq7lHgWfJ1pq1XlWJ5eykmGGhumkxVcg__Ln9RR4-Y,41886
32
32
  reV/config/sam_config.py,sha256=xvvx2FTuliq0Sk-BjRE3I9zdDmIdwHVBnWtXCcsoc40,7998
33
33
  reV/econ/__init__.py,sha256=UId1LNaAP9lErCEXVce6JZf0qVRUvwNFOPrajdRevGo,130
34
34
  reV/econ/cli_econ.py,sha256=2KNy3JQD0EKjStaoD2r6nv3ELFw88h2E_up-UKj_sfE,4286
35
35
  reV/econ/econ.py,sha256=edsNPZg2amhC_GZeotkY2MU3u17NgWeCpS6okZNrwAA,23637
36
- reV/econ/economies_of_scale.py,sha256=GfM0vj4LnwsthzhSsUnmLt78PAUHrxZI5ghWaxvoF7A,10568
36
+ reV/econ/economies_of_scale.py,sha256=UXBmHFDK-pngDGaIoKe90TQgW2LlNKxcjMQHMxSxky8,15044
37
37
  reV/econ/utilities.py,sha256=ZOA49S1jfsvdenvlL7m-BAJIrAvpAHSix5-wrSW0uLc,1232
38
38
  reV/generation/__init__.py,sha256=LBecrbpL69tROol_OwVHTKBrTqgSSxJW59fs0k3o0jQ,75
39
39
  reV/generation/base.py,sha256=D--WPQ8ZWElE06HtZF9rQYK1cAa4MWBDEqkOZ2hmFEE,49482
40
- reV/generation/cli_gen.py,sha256=5RSlr8yO9zlB-1FzFZGClqsxqsrbr9rcS_8PlOjVx2s,4435
40
+ reV/generation/cli_gen.py,sha256=JYcTX9bM1hb_HQX-9yUwvE5fXNxRMINttlGo4Pvo138,4530
41
41
  reV/generation/generation.py,sha256=FrNN3p-WScRtnVHhaqxpTAgvVbE0cIF9_2Or_qDlJ8g,49029
42
42
  reV/generation/output_attributes/generation.json,sha256=cy8efVCJgNSYCsR3x3_VpMCtynYS3oaQG4M2MwcdzFY,4954
43
43
  reV/generation/output_attributes/lcoe_fcr.json,sha256=d_TGMkZsmsfDXQiWfhYjFkmwqi-wKF8JdHmiMCj2h38,136
@@ -61,7 +61,7 @@ reV/hybrids/hybrid_methods.py,sha256=5nGb2sadp8zT9atZJNVigpYm_JYJxt4gWCPo56-5Vjk
61
61
  reV/hybrids/hybrids.py,sha256=7DFaqkNdAUVJxd_YDoQI-psKcJAlWgOGapYb_kIv3kw,46601
62
62
  reV/losses/__init__.py,sha256=DMmJo9oOVrF1npUcjuSHo_yslf94am8xdvYrvwjEsjM,141
63
63
  reV/losses/power_curve.py,sha256=P7xhRlTDqVoz5m3BJMwqYbrSKBkZfeWVEzFVmFARVGE,45289
64
- reV/losses/scheduled.py,sha256=w25YIXi7ykkeP9FgB_6vpjNm1MNOYNRjM-dqqVQJvGA,27276
64
+ reV/losses/scheduled.py,sha256=JKOVKh6jNOQx2Dj-uSPx1kpICcoHuYGPpievxkVqOQM,26878
65
65
  reV/losses/utils.py,sha256=XyM38JVlBNad9BEMJqRLuK6xba_DfFZUxNSC7EcRelM,7511
66
66
  reV/nrwal/__init__.py,sha256=HD-QXvKRM5s6Z24zfKw31yhBttrkTe8hzUnx0FZP_P0,114
67
67
  reV/nrwal/cli_nrwal.py,sha256=sa2gI86sNGk3ZJuQPxy_xsxle4KWDyPNrM11hlq6Ask,1825
@@ -74,25 +74,26 @@ reV/rep_profiles/__init__.py,sha256=v6YZk7tGLpw5gnSckjOn22xazTnv10siCFfWQl9H_fQ,
74
74
  reV/rep_profiles/cli_rep_profiles.py,sha256=i3fRolT7HTzTQePXpNLDyxwgpRa7FEfHO1mOqiSufK4,4613
75
75
  reV/rep_profiles/rep_profiles.py,sha256=dJ2jcklbelYYNS3IUXIYHg8E0poXLOWrwdqeBBnqYIE,48271
76
76
  reV/supply_curve/__init__.py,sha256=dbf0cO0qmt1VhV8dnDddztrcpnwua9T2HBhM6tLKaP8,274
77
- reV/supply_curve/aggregation.py,sha256=dnnuDG9BEGEgY17uA8nSF3s6L6Q6Lxe94aS7AIKSlm0,40471
77
+ reV/supply_curve/aggregation.py,sha256=DvIUmj0PbZ8NxgOSmpXvzn9wJnOiQO2Xm2w_WCRVK-U,40908
78
78
  reV/supply_curve/cli_sc_aggregation.py,sha256=qGfJyZjg4tFARG2dl-wAlHv9KjEp2u4wg1Boxz18Gf0,3347
79
79
  reV/supply_curve/cli_supply_curve.py,sha256=e-XrHQIe4OqWTL6u-TUAyHrw7Alk7vkXQ2HoLbE3zTM,2163
80
+ reV/supply_curve/cli_tech_mapping.py,sha256=ztNJhgk3WlSD5Gn7Rh3qBLMvX_pFkjuQT7qUK4s0P2w,1731
80
81
  reV/supply_curve/competitive_wind_farms.py,sha256=eOjM72-4oWtsqxB7Wh2gnB2zVAt4LY3iPE_DqWdXbQ4,15795
81
82
  reV/supply_curve/exclusions.py,sha256=4-ZxTO5Vlu03vie0V_74uvdajQfCuC8FE96Pg8I4U_c,42950
82
83
  reV/supply_curve/extent.py,sha256=a31po753hXSxQ8lfcCvpE8hoKc4bY7MmYq0NO0jtdqA,17414
83
- reV/supply_curve/points.py,sha256=k_OrtRF4G_BYl4wky-AolCOBgOAktN4_ZCV1LLYyZl8,88549
84
- reV/supply_curve/sc_aggregation.py,sha256=SokYyLXdjQwgvdmgiWhLSSTssnkX6ZdCSwO0WzC8SYw,63911
84
+ reV/supply_curve/points.py,sha256=p9Kqzas1jX8uCXcvYX7o6mdUVsgeHCC_F9pjBaEypPI,93548
85
+ reV/supply_curve/sc_aggregation.py,sha256=l7uXs-grLb0enblPNsEDKccSP11WZ2Pah5baWtgtvzE,68067
85
86
  reV/supply_curve/supply_curve.py,sha256=9zhAA_9XSxE18j1Z9FuC71Wr3I0VuakfR5mt1_gHYuU,69931
86
- reV/supply_curve/tech_mapping.py,sha256=rsCyv6YBIbHwCXOrYdaVbuKjphi24QsjaWA7F8m8KCY,18567
87
- reV/utilities/__init__.py,sha256=Z77DeuW_HtMFr7ssywUEgOLikWkDTtbaEdEWiSxwO4Y,10592
87
+ reV/supply_curve/tech_mapping.py,sha256=WP-o5Sk5q1Jz_F9Rpe77_fvTYGH8R4GnYDfRMSTuHB8,17804
88
+ reV/utilities/__init__.py,sha256=HVb1P-ee-z2P6UTjyc0s0gYFK7XYM71BQLEMxj26apA,10834
88
89
  reV/utilities/_clean_readme.py,sha256=IFI9wGPX5nnLTNVLJzH8IOHq9unQlAlHRu4Namib0LA,709
89
90
  reV/utilities/cli_functions.py,sha256=1_T_sXz0Ct8lW-vOk3mMRcpD6NYsc9cGI7dEujIi9z4,3864
90
91
  reV/utilities/curtailment.py,sha256=As902-2aLGnCiVEutYfAFIOwuV--_rCQhxGNOY9RB-4,5241
91
92
  reV/utilities/exceptions.py,sha256=f7sRGsbFLpmL6Caq_H1cD4GfVhnLMyvYUsLPA1UVDDE,3974
92
93
  reV/utilities/pytest_utils.py,sha256=spCw9yQ8KEYOkQZpCi9IEmaWIvIqHqbUPDXXNQJJ68U,3241
93
94
  reV/utilities/slots.py,sha256=xsw-JuUVZ0YeoCNuwP_HxGNxFMA4xRs1tuImXHIJqaU,2618
94
- nrel_rev-0.13.1.dist-info/METADATA,sha256=NBPaM4N0X7tMQzuI9YEH7RouPlSGJih9MAfZto6RyXA,11021
95
- nrel_rev-0.13.1.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
96
- nrel_rev-0.13.1.dist-info/entry_points.txt,sha256=4IfJtZm2iMJwrbC8J0Or7VjZWnFpvCaHYVpvSWfIwDA,616
97
- nrel_rev-0.13.1.dist-info/top_level.txt,sha256=S6YF2ZYgXUB6n28SY0K2H8YB9tMJdXQ9CyQbo6VC89M,4
98
- nrel_rev-0.13.1.dist-info/RECORD,,
95
+ nrel_rev-0.14.1.dist-info/METADATA,sha256=0EADVsx-loQXOEowljo4an8-FB9ZjXBm9XBC_Ie0edA,10733
96
+ nrel_rev-0.14.1.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
97
+ nrel_rev-0.14.1.dist-info/entry_points.txt,sha256=4IfJtZm2iMJwrbC8J0Or7VjZWnFpvCaHYVpvSWfIwDA,616
98
+ nrel_rev-0.14.1.dist-info/top_level.txt,sha256=S6YF2ZYgXUB6n28SY0K2H8YB9tMJdXQ9CyQbo6VC89M,4
99
+ nrel_rev-0.14.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (79.0.0)
2
+ Generator: setuptools (80.7.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -6,8 +6,9 @@ Created on Mon Feb 3 14:40:42 2020
6
6
  @author: gbuster
7
7
  """
8
8
  import logging
9
+ import importlib
9
10
  from warnings import warn
10
- from pkg_resources import get_distribution
11
+
11
12
  from packaging import version
12
13
  from reV.utilities.exceptions import PySAMVersionError, PySAMVersionWarning
13
14
 
@@ -105,7 +106,7 @@ class PySamVersionChecker:
105
106
  @property
106
107
  def pysam_version(self):
107
108
  """Get the PySAM distribution version"""
108
- return str(get_distribution('nrel-pysam')).split(' ')[1]
109
+ return importlib.metadata.version("nrel-pysam")
109
110
 
110
111
  @classmethod
111
112
  def run(cls, tech, parameters):
reV/bespoke/bespoke.py CHANGED
@@ -23,7 +23,7 @@ from rex.multi_year_resource import MultiYearWindResource
23
23
  from rex.utilities.bc_parse_table import parse_bc_table
24
24
  from rex.utilities.execution import SpawnProcessPool
25
25
  from rex.utilities.loggers import create_dirs, log_mem
26
- from rex.utilities.utilities import parse_year
26
+ from rex.utilities.utilities import parse_year, check_res_file
27
27
 
28
28
  from reV.config.output_request import SAMOutputRequest
29
29
  from reV.econ.utilities import lcoe_fcr
@@ -80,7 +80,8 @@ class BespokeMultiPlantData:
80
80
  Option to pre-load relative humidity data (useful for icing
81
81
  runs). If ``False``, relative humidities are not loaded.
82
82
  """
83
- self.res_fpath = res_fpath
83
+ self.res_fpath = ([res_fpath]
84
+ if isinstance(res_fpath, str) else res_fpath)
84
85
  self.sc_gid_to_hh = sc_gid_to_hh
85
86
  self.sc_gid_to_res_gid = sc_gid_to_res_gid
86
87
  self.hh_to_res_gids = {}
@@ -104,8 +105,9 @@ class BespokeMultiPlantData:
104
105
  hh: sorted(gids) for hh, gids in self.hh_to_res_gids.items()
105
106
  }
106
107
 
108
+ hsds = all(check_res_file(fp)[1] for fp in self.res_fpath)
107
109
  start_time = time.time()
108
- with MultiYearWindResource(self.res_fpath) as res:
110
+ with MultiYearWindResource(self.res_fpath, hsds=hsds) as res:
109
111
  self._wind_dirs = {
110
112
  hh: res[f"winddirection_{hh}m", :, gids]
111
113
  for hh, gids in self.hh_to_res_gids.items()
@@ -488,7 +490,9 @@ class BespokeSinglePlant:
488
490
  self._pre_loaded_data = pre_loaded_data
489
491
  self._outputs = {}
490
492
 
491
- res = res if not isinstance(res, str) else MultiYearWindResource(res)
493
+ if isinstance(res, str):
494
+ __, hsds = check_res_file(res)
495
+ res = MultiYearWindResource(res, hsds=hsds)
492
496
 
493
497
  self._sc_point = AggSCPoint(
494
498
  gid,
@@ -1087,8 +1091,8 @@ class BespokeSinglePlant:
1087
1091
  fcr = lcoe_kwargs['fixed_charge_rate']
1088
1092
  cc = lcoe_kwargs['capital_cost']
1089
1093
  foc = lcoe_kwargs['fixed_operating_cost']
1090
- voc = lcoe_kwargs['variable_operating_cost']
1091
- aep = self.outputs['annual_energy-means']
1094
+ voc = lcoe_kwargs['variable_operating_cost'] # $/kWh
1095
+ aep = self.outputs['annual_energy-means'] # kWh
1092
1096
 
1093
1097
  my_mean_lcoe = lcoe_fcr(fcr, cc, foc, aep, voc)
1094
1098
 
@@ -1184,6 +1188,7 @@ class BespokeSinglePlant:
1184
1188
  'wind_resource_data',
1185
1189
  'wind_turbine_powercurve_powerout',
1186
1190
  'adjust_hourly',
1191
+ 'adjust_timeindex',
1187
1192
  'capital_cost',
1188
1193
  'fixed_operating_cost',
1189
1194
  'variable_operating_cost',
@@ -1387,12 +1392,12 @@ class BespokeSinglePlant:
1387
1392
  self._meta[SupplyCurveField.EOS_MULT] = eos_mult
1388
1393
  self._meta[SupplyCurveField.REG_MULT] = reg_mult_cc
1389
1394
 
1390
- self._meta[SupplyCurveField.COST_SITE_OCC_USD_PER_AC_MW] = (
1395
+ self._meta[SupplyCurveField.COST_SITE_CC_USD_PER_AC_MW] = (
1391
1396
  (self.plant_optimizer.capital_cost
1392
1397
  + self.plant_optimizer.balance_of_system_cost)
1393
1398
  / capacity_ac_mw
1394
1399
  )
1395
- self._meta[SupplyCurveField.COST_BASE_OCC_USD_PER_AC_MW] = (
1400
+ self._meta[SupplyCurveField.COST_BASE_CC_USD_PER_AC_MW] = (
1396
1401
  (self.plant_optimizer.capital_cost / eos_mult / reg_mult_cc
1397
1402
  + self.plant_optimizer.balance_of_system_cost / reg_mult_bos)
1398
1403
  / capacity_ac_mw
@@ -1406,14 +1411,13 @@ class BespokeSinglePlant:
1406
1411
  / reg_mult_foc
1407
1412
  / capacity_ac_mw
1408
1413
  )
1409
- self._meta[SupplyCurveField.COST_SITE_VOC_USD_PER_AC_MW] = (
1410
- self.plant_optimizer.variable_operating_cost
1411
- / capacity_ac_mw
1414
+ self._meta[SupplyCurveField.COST_SITE_VOC_USD_PER_AC_MWH] = (
1415
+ self.plant_optimizer.variable_operating_cost * 1000 # to $/MWh
1412
1416
  )
1413
- self._meta[SupplyCurveField.COST_BASE_VOC_USD_PER_AC_MW] = (
1417
+ self._meta[SupplyCurveField.COST_BASE_VOC_USD_PER_AC_MWH] = (
1414
1418
  self.plant_optimizer.variable_operating_cost
1415
1419
  / reg_mult_voc
1416
- / capacity_ac_mw
1420
+ * 1000 # to $/MWh
1417
1421
  )
1418
1422
  self._meta[SupplyCurveField.FIXED_CHARGE_RATE] = (
1419
1423
  self.plant_optimizer.fixed_charge_rate
@@ -1972,7 +1976,8 @@ class BespokeWindPlants(BaseAggregation):
1972
1976
  pre_extract_inclusions=pre_extract_inclusions,
1973
1977
  )
1974
1978
 
1975
- self._res_fpath = res_fpath
1979
+ self._res_fpath = ([res_fpath]
1980
+ if isinstance(res_fpath, str) else res_fpath)
1976
1981
  self._obj_fun = objective_function
1977
1982
  self._cap_cost_fun = capital_cost_function
1978
1983
  self._foc_fun = fixed_operating_cost_function
@@ -2123,8 +2128,9 @@ class BespokeWindPlants(BaseAggregation):
2123
2128
  )
2124
2129
  )
2125
2130
 
2131
+ hsds = all(check_res_file(fp)[1] for fp in self._res_fpath)
2126
2132
  # just check that this file exists, cannot check res_fpath if *glob
2127
- with MultiYearWindResource(self._res_fpath) as f:
2133
+ with MultiYearWindResource(self._res_fpath, hsds=hsds) as f:
2128
2134
  assert any(f.dsets)
2129
2135
 
2130
2136
  def _pre_load_data(self, pre_load_data):
@@ -2494,6 +2500,7 @@ class BespokeWindPlants(BaseAggregation):
2494
2500
  "area_filter_kernel": area_filter_kernel,
2495
2501
  "min_area": min_area,
2496
2502
  "h5_handler": MultiYearWindResource,
2503
+ "hsds": all(check_res_file(fp)[1] for fp in res_fpath),
2497
2504
  }
2498
2505
 
2499
2506
  with AggFileHandler(excl_fpath, res_fpath, **file_kwargs) as fh:
reV/cli.py CHANGED
@@ -12,6 +12,7 @@ from reV.handlers.cli_collect import collect_command
12
12
  from reV.handlers.cli_multi_year import my_command
13
13
  from reV.supply_curve.cli_sc_aggregation import sc_agg_command
14
14
  from reV.supply_curve.cli_supply_curve import sc_command
15
+ from reV.supply_curve.cli_tech_mapping import tm_command
15
16
  from reV.rep_profiles.cli_rep_profiles import rep_profiles_command
16
17
  from reV.hybrids.cli_hybrids import hybrids_command
17
18
  from reV.nrwal.cli_nrwal import nrwal_command
@@ -24,8 +25,9 @@ logger = logging.getLogger(__name__)
24
25
 
25
26
 
26
27
  commands = [bespoke_command, gen_command, econ_command, collect_command,
27
- my_command, sc_agg_command, sc_command, rep_profiles_command,
28
- hybrids_command, nrwal_command, qa_qc_command]
28
+ my_command, tm_command, sc_agg_command, sc_command,
29
+ rep_profiles_command, hybrids_command, nrwal_command,
30
+ qa_qc_command]
29
31
  main = make_cli(commands, info={"name": "reV", "version": __version__})
30
32
  main.add_command(qa_qc_extra)
31
33
  main.add_command(project_points)
@@ -464,8 +464,10 @@ class ProjectPoints:
464
464
  h_var = "wind_turbine_hub_ht"
465
465
  if self._h is None:
466
466
  if "wind" in self.tech:
467
- # wind technology, get a list of h values
468
- self._h = [self[site][1][h_var] for site in self.sites]
467
+ if h_var in self.df.columns:
468
+ self._h = self.df[h_var].values.tolist()
469
+ else:
470
+ self._h = [self[site][1][h_var] for site in self.sites]
469
471
 
470
472
  return self._h
471
473
 
@@ -837,7 +839,6 @@ class ProjectPoints:
837
839
  logger.error(msg)
838
840
  raise ConfigError(msg)
839
841
 
840
-
841
842
  unused_configs = set(curtail_configs) - set(df_configs)
842
843
  if unused_configs:
843
844
  msg = ("One or more curtailment configurations not found in "
@@ -1164,12 +1165,14 @@ class ProjectPoints:
1164
1165
  multi_h5_res, hsds = check_res_file(res_file)
1165
1166
  if multi_h5_res:
1166
1167
  res_cls = MultiFileResourceX
1168
+ res_kwargs = {}
1167
1169
  else:
1168
1170
  res_cls = ResourceX
1171
+ res_kwargs = {"hsds": hsds}
1169
1172
 
1170
1173
  logger.info("Extracting ProjectPoints for desired regions")
1171
1174
  points = []
1172
- with res_cls(res_file, hsds=hsds) as f:
1175
+ with res_cls(res_file, **res_kwargs) as f:
1173
1176
  meta = f.meta
1174
1177
  for region, region_col in regions.items():
1175
1178
  logger.debug("- {}: {}".format(region_col, region))
@@ -1181,7 +1184,7 @@ class ProjectPoints:
1181
1184
  if duplicates:
1182
1185
  msg = (
1183
1186
  "reV Cannot currently handle duplicate "
1184
- "Resource gids! The given regions containg the "
1187
+ "Resource gids! The given regions containing the "
1185
1188
  "same gids:\n{}".format(duplicates)
1186
1189
  )
1187
1190
  logger.error(msg)