NREL-reV 0.8.9__tar.gz → 0.9.2__tar.gz

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.
Files changed (89) hide show
  1. {NREL-reV-0.8.9 → NREL-reV-0.9.2/NREL_reV.egg-info}/PKG-INFO +1 -1
  2. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/NREL_reV.egg-info/requires.txt +1 -0
  3. {NREL-reV-0.8.9/NREL_reV.egg-info → NREL-reV-0.9.2}/PKG-INFO +1 -1
  4. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/SAM/SAM.py +38 -0
  5. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/SAM/generation.py +43 -10
  6. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/bespoke/bespoke.py +304 -245
  7. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/bespoke/cli_bespoke.py +2 -0
  8. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/bespoke/place_turbines.py +181 -37
  9. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/config/output_request.py +2 -1
  10. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/config/project_points.py +1 -3
  11. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/econ/econ.py +24 -13
  12. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/econ/economies_of_scale.py +54 -35
  13. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/generation/base.py +22 -2
  14. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/generation/generation.py +50 -23
  15. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/handlers/__init__.py +0 -1
  16. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/handlers/multi_year.py +45 -17
  17. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/handlers/transmission.py +44 -27
  18. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/hybrids/hybrid_methods.py +16 -14
  19. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/hybrids/hybrids.py +10 -10
  20. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/nrwal/nrwal.py +1 -1
  21. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/qa_qc/qa_qc.py +1 -1
  22. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/qa_qc/summary.py +4 -4
  23. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/rep_profiles/rep_profiles.py +1 -1
  24. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/supply_curve/exclusions.py +1 -1
  25. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/supply_curve/extent.py +1 -1
  26. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/supply_curve/points.py +254 -131
  27. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/supply_curve/sc_aggregation.py +13 -45
  28. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/supply_curve/supply_curve.py +200 -141
  29. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/utilities/__init__.py +114 -39
  30. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/version.py +1 -1
  31. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/LICENSE +0 -0
  32. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/NREL_reV.egg-info/SOURCES.txt +0 -0
  33. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/NREL_reV.egg-info/dependency_links.txt +0 -0
  34. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/NREL_reV.egg-info/entry_points.txt +0 -0
  35. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/NREL_reV.egg-info/not-zip-safe +0 -0
  36. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/NREL_reV.egg-info/top_level.txt +0 -0
  37. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/README.rst +0 -0
  38. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/SAM/__init__.py +0 -0
  39. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/SAM/defaults.py +0 -0
  40. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/SAM/econ.py +0 -0
  41. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/SAM/version_checker.py +0 -0
  42. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/SAM/windbos.py +0 -0
  43. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/__init__.py +0 -0
  44. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/bespoke/__init__.py +0 -0
  45. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/bespoke/gradient_free.py +0 -0
  46. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/bespoke/pack_turbs.py +0 -0
  47. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/bespoke/plotting_functions.py +0 -0
  48. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/cli.py +0 -0
  49. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/config/__init__.py +0 -0
  50. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/config/base_analysis_config.py +0 -0
  51. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/config/base_config.py +0 -0
  52. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/config/cli_project_points.py +0 -0
  53. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/config/curtailment.py +0 -0
  54. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/config/execution.py +0 -0
  55. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/config/sam_config.py +0 -0
  56. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/econ/__init__.py +0 -0
  57. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/econ/cli_econ.py +0 -0
  58. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/econ/utilities.py +0 -0
  59. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/generation/__init__.py +0 -0
  60. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/generation/cli_gen.py +0 -0
  61. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/handlers/cli_collect.py +0 -0
  62. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/handlers/cli_multi_year.py +0 -0
  63. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/handlers/exclusions.py +0 -0
  64. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/handlers/outputs.py +0 -0
  65. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/hybrids/__init__.py +0 -0
  66. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/hybrids/cli_hybrids.py +0 -0
  67. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/losses/__init__.py +0 -0
  68. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/losses/power_curve.py +0 -0
  69. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/losses/scheduled.py +0 -0
  70. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/losses/utils.py +0 -0
  71. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/nrwal/__init__.py +0 -0
  72. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/nrwal/cli_nrwal.py +0 -0
  73. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/qa_qc/__init__.py +0 -0
  74. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/qa_qc/cli_qa_qc.py +0 -0
  75. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/rep_profiles/__init__.py +0 -0
  76. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/rep_profiles/cli_rep_profiles.py +0 -0
  77. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/supply_curve/__init__.py +0 -0
  78. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/supply_curve/aggregation.py +0 -0
  79. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/supply_curve/cli_sc_aggregation.py +0 -0
  80. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/supply_curve/cli_supply_curve.py +0 -0
  81. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/supply_curve/competitive_wind_farms.py +0 -0
  82. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/supply_curve/tech_mapping.py +0 -0
  83. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/utilities/cli_functions.py +0 -0
  84. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/utilities/curtailment.py +0 -0
  85. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/utilities/exceptions.py +0 -0
  86. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/utilities/pytest_utils.py +0 -0
  87. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/reV/utilities/slots.py +0 -0
  88. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/setup.cfg +0 -0
  89. {NREL-reV-0.8.9 → NREL-reV-0.9.2}/setup.py +0 -0
@@ -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
@@ -2,6 +2,7 @@ NREL-gaps>=0.6.11
2
2
  NREL-NRWAL>=0.0.7
3
3
  NREL-PySAM~=4.1.0
4
4
  NREL-rex>=0.2.85
5
+ numpy~=1.24.4
5
6
  packaging>=20.3
6
7
  plotly>=4.7.1
7
8
  plotting>=0.0.6
@@ -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
@@ -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
@@ -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.