diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 588e7c4a..b7bee018 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 3.4.30 +current_version = 3.4.34 commit = True tag = True diff --git a/.cookiecutterrc b/.cookiecutterrc index 56f1cc49..14835c33 100644 --- a/.cookiecutterrc +++ b/.cookiecutterrc @@ -54,7 +54,7 @@ default_context: sphinx_doctest: "no" sphinx_theme: "sphinx-py3doc-enhanced-theme" test_matrix_separate_coverage: "no" - version: 3.4.30 + version: 3.4.34 version_manager: "bump2version" website: "https://github.com/NREL" year_from: "2023" diff --git a/.gitignore b/.gitignore index a29eacb7..51095ee9 100644 --- a/.gitignore +++ b/.gitignore @@ -55,6 +55,7 @@ pip-log.txt coverage.xml htmlcov nosetests.xml +--cov-report=term-missing # Translations *.mo diff --git a/README.rst b/README.rst index 5fe24a94..3be6360f 100644 --- a/README.rst +++ b/README.rst @@ -47,9 +47,9 @@ Free software: `MIT license `__ :alt: Supported implementations :target: https://pypi.org/project/geophires-x -.. |commits-since| image:: https://img.shields.io/github/commits-since/softwareengineerprogrammer/GEOPHIRES-X/v3.4.30.svg +.. |commits-since| image:: https://img.shields.io/github/commits-since/softwareengineerprogrammer/GEOPHIRES-X/v3.4.34.svg :alt: Commits since latest release - :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.4.30...main + :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.4.34...main .. |docs| image:: https://readthedocs.org/projects/GEOPHIRES-X/badge/?style=flat :target: https://nrel.github.io/GEOPHIRES-X diff --git a/docs/conf.py b/docs/conf.py index 7b36b2c1..97ad1ed5 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,7 +18,7 @@ year = '2023' author = 'NREL' copyright = f'{year}, {author}' -version = release = '3.4.30' +version = release = '3.4.34' pygments_style = 'trac' templates_path = ['./templates'] diff --git a/setup.py b/setup.py index 6f308274..519c3b3f 100755 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ def read(*names, **kwargs): setup( name='geophires-x', - version='3.4.30', + version='3.4.34', license='MIT', description='GEOPHIRES is a free and open-source geothermal techno-economic simulator.', long_description='{}\n{}'.format( @@ -59,9 +59,10 @@ def read(*names, **kwargs): 'Documentation': 'https://nrel.github.io/python-geophires-x-nrel/', }, keywords=['geothermal'], - python_requires='>=3.7', + python_requires='>=3.8', install_requires=[ - 'numpy', + 'numpy==1.24; python_version == "3.8"', # Last version compatible with Python 3.8 + 'numpy==1.26; python_version > "3.8"', 'numpy-financial', 'pint', 'forex_python', diff --git a/src/geophires_x/Economics.py b/src/geophires_x/Economics.py index 6266fa79..68580b03 100644 --- a/src/geophires_x/Economics.py +++ b/src/geophires_x/Economics.py @@ -95,43 +95,13 @@ def calculate_cost_of_one_vertical_well(model: Model, depth_m: float, well_corre ) if well_correlation is WellDrillingCostCorrelation.SIMPLE: - cost_of_one_well = vertical_drilling_cost_per_m * depth_m * 1E-6 - - elif well_correlation is WellDrillingCostCorrelation.VERTICAL_SMALL: - cost_of_one_well = (0.30212 * depth_m ** 2 + 584.91124 * depth_m + 751368.47270) * 1E-6 - elif well_correlation is WellDrillingCostCorrelation.VERTICAL_LARGE: - cost_of_one_well = (0.28180 * depth_m ** 2 + 1275.52130 * depth_m + 632315.12640) * 1E-6 - elif well_correlation is WellDrillingCostCorrelation.DEVIATED_SMALL: - cost_of_one_well = (0.28977 * depth_m ** 2 + 882.15067 * depth_m + 680562.50150) * 1E-6 - elif well_correlation is WellDrillingCostCorrelation.DEVIATED_LARGE: - cost_of_one_well = (0.25528 * depth_m ** 2 + 1716.71568 * depth_m + 500866.89110) * 1E-6 - elif well_correlation is WellDrillingCostCorrelation.VERTICAL_SMALL_INT1: - cost_of_one_well = (0.13710 * depth_m ** 2 + 129.61033 * depth_m + 1205587.57100) * 1E-6 - elif well_correlation is WellDrillingCostCorrelation.VERTICAL_LARGE_INT1: - cost_of_one_well = (0.18927 * depth_m ** 2 + 293.45174 * depth_m + 1326526.31300) * 1E-6 - elif well_correlation is WellDrillingCostCorrelation.DEVIATED_SMALL_INT1: - cost_of_one_well = (0.15340 * depth_m ** 2 + 120.31700 * depth_m + 1431801.54400) * 1E-6 - elif well_correlation is WellDrillingCostCorrelation.DEVIATED_LARGE_INT1: - cost_of_one_well = (0.19950 * depth_m ** 2 + 296.13011 * depth_m + 1697867.70900) * 1E-6 - elif well_correlation is WellDrillingCostCorrelation.VERTICAL_SMALL_INT2: - cost_of_one_well = (0.00804 * depth_m ** 2 + 455.60507 * depth_m + 921007.68680) * 1E-6 - elif well_correlation is WellDrillingCostCorrelation.VERTICAL_LARGE_INT2: - cost_of_one_well = (0.00315 * depth_m ** 2 + 782.69676 * depth_m + 983620.25270) * 1E-6 - elif well_correlation is WellDrillingCostCorrelation.DEVIATED_SMALL_INT2: - cost_of_one_well = (0.00854 * depth_m ** 2 + 506.08357 * depth_m + 1057330.39000) * 1E-6 - elif well_correlation is WellDrillingCostCorrelation.DEVIATED_LARGE_INT2: - cost_of_one_well = (0.00380 * depth_m ** 2 + 838.90249 * depth_m + 1181947.04400) * 1E-6 - elif well_correlation is WellDrillingCostCorrelation.VERTICAL_SMALL_IDEAL: - cost_of_one_well = (0.00252 * depth_m ** 2 + 439.44503 * depth_m + 590611.90110) * 1E-6 - elif well_correlation is WellDrillingCostCorrelation.VERTICAL_LARGE_IDEAL: - cost_of_one_well = (-0.00240 * depth_m ** 2 + 752.93946 * depth_m + 524337.65380) * 1E-6 - elif well_correlation is WellDrillingCostCorrelation.DEVIATED_SMALL_IDEAL: - cost_of_one_well = (0.00719 * depth_m ** 2 + 455.85233 * depth_m + 753377.73080) * 1E-6 - elif well_correlation is WellDrillingCostCorrelation.DEVIATED_LARGE_IDEAL: - cost_of_one_well = (0.00376 * depth_m ** 2 + 762.52696 * depth_m + 765103.07690) * 1E-6 + cost_of_one_well = vertical_drilling_cost_per_m * depth_m * 1E-6 + else: + cost_of_one_well = well_correlation.calculate_cost_MUSD(depth_m) # account for adjustment factor cost_of_one_well = well_cost_adjustment_factor * cost_of_one_well + return cost_of_one_well @@ -195,60 +165,16 @@ def calculate_cost_of_non_vertical_section(model: Model, length_m: float, well_c if not NonverticalsCased: # assume that casing & cementing costs 50% of drilling costs casing_factor = 0.5 + if model.economics.Nonvertical_drilling_cost_per_m.Provided or well_correlation is WellDrillingCostCorrelation.SIMPLE: cost_of_non_vertical_section = casing_factor * ((num_nonvertical_sections * nonvertical_drilling_cost_per_m * length_per_section_m)) * 1E-6 - elif well_correlation is WellDrillingCostCorrelation.VERTICAL_SMALL: - cost_per_section = (0.30212 * length_per_section_m ** 2 + 584.91124 * length_per_section_m + 751368.47270) * 1E-6 - cost_of_non_vertical_section = casing_factor * num_nonvertical_sections * cost_per_section - elif well_correlation is WellDrillingCostCorrelation.VERTICAL_LARGE: - cost_per_section = (0.28180 * length_per_section_m ** 2 + 1275.52130 * length_per_section_m + 632315.12640) * 1E-6 - cost_of_non_vertical_section = casing_factor * num_nonvertical_sections * cost_per_section - elif well_correlation is WellDrillingCostCorrelation.DEVIATED_SMALL: - cost_per_section = (0.28977 * length_per_section_m ** 2 + 882.15067 * length_per_section_m + 680562.50150) * 1E-6 - cost_of_non_vertical_section = casing_factor * num_nonvertical_sections * cost_per_section - elif well_correlation is WellDrillingCostCorrelation.DEVIATED_LARGE: - cost_per_section = (0.25528 * length_per_section_m ** 2 + 1716.71568 * length_per_section_m + 500866.89110) * 1E-6 - cost_of_non_vertical_section = casing_factor * num_nonvertical_sections * cost_per_section - elif well_correlation is WellDrillingCostCorrelation.VERTICAL_SMALL_INT1: - cost_per_section = (0.13710 * length_per_section_m ** 2 + 129.61033 * length_per_section_m + 1205587.57100) * 1E-6 - cost_of_non_vertical_section = casing_factor * num_nonvertical_sections * cost_per_section - elif well_correlation is WellDrillingCostCorrelation.VERTICAL_LARGE_INT1: - cost_per_section = (0.18927 * length_per_section_m ** 2 + 293.45174 * length_per_section_m + 1326526.31300) * 1E-6 - cost_of_non_vertical_section = casing_factor * num_nonvertical_sections * cost_per_section - elif well_correlation is WellDrillingCostCorrelation.DEVIATED_SMALL_INT1: - cost_per_section = (0.15340 * length_per_section_m ** 2 + 120.31700 * length_per_section_m + 1431801.54400) * 1E-6 - cost_of_non_vertical_section = casing_factor * num_nonvertical_sections * cost_per_section - elif well_correlation is WellDrillingCostCorrelation.DEVIATED_LARGE_INT1: - cost_per_section = (0.19950 * length_per_section_m ** 2 + 296.13011 * length_per_section_m + 1697867.70900) * 1E-6 - cost_of_non_vertical_section = casing_factor * num_nonvertical_sections * cost_per_section - elif well_correlation is WellDrillingCostCorrelation.VERTICAL_SMALL_INT2: - cost_per_section = (0.00804 * length_per_section_m ** 2 + 455.60507 * length_per_section_m + 921007.68680) * 1E-6 - cost_of_non_vertical_section = casing_factor * num_nonvertical_sections * cost_per_section - elif well_correlation is WellDrillingCostCorrelation.VERTICAL_LARGE_INT2: - cost_per_section = (0.00315 * length_per_section_m ** 2 + 782.69676 * length_per_section_m + 983620.25270) * 1E-6 - cost_of_non_vertical_section = casing_factor * num_nonvertical_sections * cost_per_section - elif well_correlation is WellDrillingCostCorrelation.DEVIATED_SMALL_INT2: - cost_per_section = (0.00854 * length_per_section_m ** 2 + 506.08357 * length_per_section_m + 1057330.39000) * 1E-6 - cost_of_non_vertical_section = casing_factor * num_nonvertical_sections * cost_per_section - elif well_correlation is WellDrillingCostCorrelation.DEVIATED_LARGE_INT2: - cost_per_section = (0.00380 * length_per_section_m ** 2 + 838.90249 * length_per_section_m + 1181947.04400) * 1E-6 - cost_of_non_vertical_section = casing_factor * num_nonvertical_sections * cost_per_section - elif well_correlation is WellDrillingCostCorrelation.VERTICAL_SMALL_IDEAL: - cost_per_section = (0.00252 * length_per_section_m ** 2 + 439.44503 * length_per_section_m + 590611.90110) * 1E-6 - cost_of_non_vertical_section = casing_factor * num_nonvertical_sections * cost_per_section - elif well_correlation is WellDrillingCostCorrelation.VERTICAL_LARGE_IDEAL: - cost_per_section = (-0.00240 * length_per_section_m ** 2 + 752.93946 * length_per_section_m + 524337.65380) * 1E-6 - cost_of_non_vertical_section = casing_factor * num_nonvertical_sections * cost_per_section - elif well_correlation is WellDrillingCostCorrelation.DEVIATED_SMALL_IDEAL: - cost_per_section = (0.00719 * length_per_section_m ** 2 + 455.85233 * length_per_section_m + 753377.73080) * 1E-6 - cost_of_non_vertical_section = casing_factor * num_nonvertical_sections * cost_per_section - elif well_correlation is WellDrillingCostCorrelation.DEVIATED_LARGE_IDEAL: - cost_per_section = (0.00376 * length_per_section_m ** 2 + 762.52696 * length_per_section_m + 765103.07690) * 1E-6 + else: + cost_per_section = well_correlation.calculate_cost_MUSD(length_per_section_m) cost_of_non_vertical_section = casing_factor * num_nonvertical_sections * cost_per_section # account for adjustment factor - cost_of_non_vertical_section = well_cost_adjustment_factor * cost_of_non_vertical_section + return cost_of_non_vertical_section @@ -1613,7 +1539,7 @@ def __init__(self, model: Model): CurrentUnits=EnergyCostUnit.DOLLARSPERKWH, ) self.CoolingPrice = self.OutputParameterDict[self.CoolingPrice.Name] = OutputParameter( - "Heat Sale Price Model", + "Cooling Sale Price Model", UnitType=Units.ENERGYCOST, PreferredUnits=EnergyCostUnit.CENTSSPERKWH, CurrentUnits=EnergyCostUnit.DOLLARSPERKWH, diff --git a/src/geophires_x/OptionList.py b/src/geophires_x/OptionList.py index ec908493..06ddaecb 100644 --- a/src/geophires_x/OptionList.py +++ b/src/geophires_x/OptionList.py @@ -51,27 +51,41 @@ class ReservoirVolume(str, Enum): class WellDrillingCostCorrelation(str, Enum): - """Note: order must be retained since input is read as an int""" - - VERTICAL_SMALL = "vertical small diameter, baseline" - DEVIATED_SMALL = "deviated small diameter, baseline" - VERTICAL_LARGE = "vertical large diameter, baseline" - DEVIATED_LARGE = "deviated large diameter, baseline" - - SIMPLE = "Simple" - - VERTICAL_SMALL_INT1 = "vertical small diameter, intermediate1" - VERTICAL_SMALL_INT2 = "vertical small diameter, intermediate2" - DEVIATED_SMALL_INT1 = "deviated small diameter, intermediate1" - DEVIATED_SMALL_INT2 = "deviated small diameter, intermediate2" - VERTICAL_LARGE_INT1 = "vertical large diameter, intermediate1" - VERTICAL_LARGE_INT2 = "vertical large diameter, intermediate2" - DEVIATED_LARGE_INT1 = "deviated large diameter, intermediate1" - DEVIATED_LARGE_INT2 = "deviated large diameter, intermediate2" - VERTICAL_SMALL_IDEAL = "vertical open-hole, small diameter, ideal" - DEVIATED_SMALL_IDEAL = "deviated liner, small diameter, ideal" - VERTICAL_LARGE_IDEAL = "vertical open-hole, large diameter, ideal" - DEVIATED_LARGE_IDEAL = "deviated liner, large diameter, ideal" + """Note: order must be retained since input is read as an int; first int arg is duplicative of order""" + + VERTICAL_SMALL = 1, "vertical small diameter, baseline", 0.30212, 584.91124, 751368.47270 + DEVIATED_SMALL = 2, "deviated small diameter, baseline", 0.28977, 882.15067, 680562.50150 + VERTICAL_LARGE = 3, "vertical large diameter, baseline", 0.28180, 1275.52130, 632315.12640 + DEVIATED_LARGE = 4, "deviated large diameter, baseline", 0.25528, 1716.71568, 500866.89110 + + SIMPLE = 5, "Simple", 0, 1846*1E6, 0 # Based on Fervo Project Cape cost per meter (~$1846/m) + + VERTICAL_SMALL_INT1 = 6, "vertical small diameter, intermediate1", 0.13710, 129.61033, 1205587.57100 + VERTICAL_SMALL_INT2 = 7, "vertical small diameter, intermediate2", 0.00804, 455.60507, 921007.68680 + DEVIATED_SMALL_INT1 = 8, "deviated small diameter, intermediate1", 0.15340, 120.31700, 1431801.54400 + DEVIATED_SMALL_INT2 = 9, "deviated small diameter, intermediate2", 0.00854, 506.08357, 1057330.39000 + VERTICAL_LARGE_INT1 = 10, "vertical large diameter, intermediate1", 0.18927, 293.45174, 1326526.31300 + VERTICAL_LARGE_INT2 = 11, "vertical large diameter, intermediate2", 0.00315, 782.69676, 983620.25270 + DEVIATED_LARGE_INT1 = 12, "deviated large diameter, intermediate1", 0.19950, 296.13011, 1697867.70900 + DEVIATED_LARGE_INT2 = 13, "deviated large diameter, intermediate2", 0.00380, 838.90249, 1181947.04400 + VERTICAL_SMALL_IDEAL = 14, "vertical open-hole, small diameter, ideal", 0.00252, 439.44503, 590611.90110 + DEVIATED_SMALL_IDEAL = 15, "deviated liner, small diameter, ideal", 0.00719, 455.85233, 753377.73080 + VERTICAL_LARGE_IDEAL = 16, "vertical open-hole, large diameter, ideal", -0.00240, 752.93946, 524337.65380 + DEVIATED_LARGE_IDEAL = 17, "deviated liner, large diameter, ideal", 0.00376, 762.52696, 765103.07690 + + + def __new__(cls, *args, **kwds): + obj = str.__new__(cls) + obj._value_ = args[1] + return obj + + def __init__(self, idx: int, _: str, c2:float, c1:float, c0:float): + self._c2 = c2 + self._c1 = c1 + self._c0 = c0 + + def calculate_cost_MUSD(self, meters) -> float: + return (self._c2 * meters ** 2 + self._c1 * meters + self._c0) * 1E-6 diff --git a/src/geophires_x/Outputs.py b/src/geophires_x/Outputs.py index 7fbb6074..37be3750 100644 --- a/src/geophires_x/Outputs.py +++ b/src/geophires_x/Outputs.py @@ -2043,7 +2043,7 @@ def o(output_param: OutputParameter): if output_param.Name in econ.OutputParameterDict: return econ.OutputParameterDict[output_param.Name] else: - return o + return output_param f.write('Start (' + o(econ.ElecPrice).CurrentUnits.value + diff --git a/src/geophires_x/SUTRAEconomics.py b/src/geophires_x/SUTRAEconomics.py index 5df76624..c6563bca 100644 --- a/src/geophires_x/SUTRAEconomics.py +++ b/src/geophires_x/SUTRAEconomics.py @@ -424,48 +424,20 @@ def Calculate(self, model: Model) -> None: # CAPEX # Drilling + self.C1well = 0 if self.ccwellfixed.Valid: self.C1well = self.ccwellfixed.value self.Cwell.value = self.C1well * (model.wellbores.nprod.value + model.wellbores.ninj.value) else: if model.reserv.depth.value > 7000.0 or model.reserv.depth.value < 500: - print("Warning: simple user-specified cost per meter used for drilling depth < 500 or > 7000 m") + print('Warning: simple user-specified cost per meter used for drilling depth < 500 or > 7000 m') model.logger.warning( - "Warning: simple user-specified cost per meter used for drilling depth < 500 or > 7000 m" + 'Warning: simple user-specified cost per meter used for drilling depth < 500 or > 7000 m' ) - if self.wellcorrelation.value == WellDrillingCostCorrelation.VERTICAL_SMALL: - self.C1well = (0.30212 * model.reserv.depth.value ** 2 + 584.91124 * model.reserv.depth.value + 751368.47270) * 1E-6 - elif self.wellcorrelation.value == WellDrillingCostCorrelation.VERTICAL_LARGE: - self.C1well = (0.28180 * model.reserv.depth.value ** 2 + 1275.52130 * model.reserv.depth.value + 632315.12640) * 1E-6 - elif self.wellcorrelation.value == WellDrillingCostCorrelation.DEVIATED_SMALL: - self.C1well = (0.28977 * model.reserv.depth.value ** 2 + 882.15067 * model.reserv.depth.value + 680562.50150) * 1E-6 - elif self.wellcorrelation.value == WellDrillingCostCorrelation.DEVIATED_LARGE: - self.C1well = (0.25528 * model.reserv.depth.value ** 2 + 1716.71568 * model.reserv.depth.value + 500866.89110) * 1E-6 - elif self.wellcorrelation.value == WellDrillingCostCorrelation.VERTICAL_SMALL_INT1: - self.C1well = (0.13710 * model.reserv.depth.value ** 2 + 129.61033 * model.reserv.depth.value + 1205587.57100) * 1E-6 - elif self.wellcorrelation.value == WellDrillingCostCorrelation.VERTICAL_LARGE_INT1: - self.C1well = (0.18927 * model.reserv.depth.value ** 2 + 293.45174 * model.reserv.depth.value + 1326526.31300) * 1E-6 - elif self.wellcorrelation.value == WellDrillingCostCorrelation.DEVIATED_SMALL_INT1: - self.C1well = (0.15340 * model.reserv.depth.value ** 2 + 120.31700 * model.reserv.depth.value + 1431801.54400) * 1E-6 - elif self.wellcorrelation.value == WellDrillingCostCorrelation.DEVIATED_LARGE_INT1: - self.C1well = (0.19950 * model.reserv.depth.value ** 2 + 296.13011 * model.reserv.depth.value + 1697867.70900) * 1E-6 - elif self.wellcorrelation.value == WellDrillingCostCorrelation.VERTICAL_SMALL_INT2: - self.C1well = (0.00804 * model.reserv.depth.value ** 2 + 455.60507 * model.reserv.depth.value + 921007.68680) * 1E-6 - elif self.wellcorrelation.value == WellDrillingCostCorrelation.VERTICAL_LARGE_INT2: - self.C1well = (0.00315 * model.reserv.depth.value ** 2 + 782.69676 * model.reserv.depth.value + 983620.25270) * 1E-6 - elif self.wellcorrelation.value == WellDrillingCostCorrelation.DEVIATED_SMALL_INT2: - self.C1well = (0.00854 * model.reserv.depth.value ** 2 + 506.08357 * model.reserv.depth.value + 1057330.39000) * 1E-6 - elif self.wellcorrelation.value == WellDrillingCostCorrelation.DEVIATED_LARGE_INT2: - self.C1well = (0.00380 * model.reserv.depth.value ** 2 + 838.90249 * model.reserv.depth.value + 1181947.04400) * 1E-6 - elif self.wellcorrelation.value == WellDrillingCostCorrelation.VERTICAL_SMALL_IDEAL: - self.C1well = (0.00252 * model.reserv.depth.value ** 2 + 439.44503 * model.reserv.depth.value + 590611.90110) * 1E-6 - elif self.wellcorrelation.value == WellDrillingCostCorrelation.VERTICAL_LARGE_IDEAL: - self.C1well = (-0.00240 * model.reserv.depth.value ** 2 + 752.93946 * model.reserv.depth.value + 524337.65380) * 1E-6 - elif self.wellcorrelation.value == WellDrillingCostCorrelation.DEVIATED_SMALL_IDEAL: - self.C1well = (0.00719 * model.reserv.depth.value ** 2 + 455.85233 * model.reserv.depth.value + 753377.73080) * 1E-6 - elif self.wellcorrelation.value == WellDrillingCostCorrelation.DEVIATED_LARGE_IDEAL: - self.C1well = (0.00376 * model.reserv.depth.value ** 2 + 762.52696 * model.reserv.depth.value + 765103.07690) * 1E-6 + + if self.wellcorrelation.value == WellDrillingCostCorrelation.SIMPLE: + self.C1well = self.wellcorrelation.value.calculate_cost_MUSD(model.reserv.depth.value) self.C1well = self.C1well * self.ccwelladjfactor.value self.Cwell.value = self.C1well * (model.wellbores.nprod.value + model.wellbores.ninj.value) diff --git a/src/geophires_x/__init__.py b/src/geophires_x/__init__.py index 4524efd2..2f8d763e 100644 --- a/src/geophires_x/__init__.py +++ b/src/geophires_x/__init__.py @@ -1 +1 @@ -__version__ = '3.4.30' +__version__ = '3.4.34' diff --git a/src/geophires_x_client/geophires_x_result.py b/src/geophires_x_client/geophires_x_result.py index 6ca8cb91..08c13bd6 100644 --- a/src/geophires_x_client/geophires_x_result.py +++ b/src/geophires_x_client/geophires_x_result.py @@ -277,6 +277,7 @@ class GeophiresXResult: 'Average Annual Total Heating Production', 'Average Annual Electricity Use for Pumping', ], + 'Simulation Metadata': [_StringValueField('GEOPHIRES Version')], } ) @@ -310,8 +311,9 @@ def __init__(self, output_file_path, logger_name=None): else: is_string_field = isinstance(field, _StringValueField) field_name = field.field_name if is_string_field else field + indent = 4 if category != 'Simulation Metadata' else 1 self.result[category][field_name] = self._get_result_field( - field_name, is_string_value_field=is_string_field + field_name, is_string_value_field=is_string_field, min_indentation_spaces=indent ) try: @@ -422,9 +424,9 @@ def _json_fields(self) -> MappingProxyType: except FileNotFoundError: return {} - def _get_result_field(self, field_name: str, is_string_value_field: bool = False): + def _get_result_field(self, field_name: str, is_string_value_field: bool = False, min_indentation_spaces: int = 4): # TODO make this less fragile with proper regex - matching_lines = set(filter(lambda line: f' {field_name}: ' in line, self._lines)) + matching_lines = set(filter(lambda line: f'{min_indentation_spaces * " "}{field_name}: ' in line, self._lines)) if len(matching_lines) == 0: self._logger.debug(f'Field not found: {field_name}') diff --git a/src/geophires_x_schema_generator/__init__.py b/src/geophires_x_schema_generator/__init__.py index 1554d7e5..7715fb2e 100644 --- a/src/geophires_x_schema_generator/__init__.py +++ b/src/geophires_x_schema_generator/__init__.py @@ -2,7 +2,7 @@ import os import sys from pathlib import Path -from typing import Tuple +from typing import Tuple, Any # Ruff disabled because imports are order-dependent # ruff: noqa: I001 @@ -91,11 +91,15 @@ def generate_json_schema(self) -> dict: param = input_params[param_name] units_val = param['CurrentUnits'] if isinstance(param['CurrentUnits'], str) else None + min_val, max_val = _get_min_and_max(param, default_val=None) properties[param_name] = { 'description': param['ToolTipText'], 'type': param['json_parameter_type'], 'units': units_val, 'category': param['parameter_category'], + 'default': param['DefaultValue'], + 'minimum': min_val, + 'maximum': max_val, } if param['Required']: @@ -145,27 +149,13 @@ def get_input_params_table(category_params, category_name) -> str: # if param['Required']: # TODO designate required params - def get_key(k): - if k in param and str(param[k]) != '': # noqa - return param[k] # noqa - else: - return '' - - min_val = get_key('Min') - max_val = get_key('Max') - - if 'AllowableRange' in param: - # TODO warn if min/max are defined and at odds with allowable range - min_val = min(param['AllowableRange']) - max_val = max(param['AllowableRange']) - - # TODO include full AllowableRange in reference (or fully describe if possible using min/max/increment) + min_val, max_val = _get_min_and_max(param) input_rst += f"""\n * - {param['Name']} - - {get_key('ToolTipText')} - - {get_key('PreferredUnits')} - - {get_key('json_parameter_type')} - - {get_key('DefaultValue')} + - {_get_key(param, 'ToolTipText')} + - {_get_key(param, 'PreferredUnits')} + - {_get_key(param, 'json_parameter_type')} + - {_get_key(param, 'DefaultValue')} - {min_val} - {max_val}""" @@ -218,3 +208,22 @@ def get_key(k): - {get_key('json_parameter_type')}""" return output_rst + + +def _get_key(param: dict, k: str, default_val='') -> Any: + if k in param and str(param[k]) != '': + return param[k] + else: + return default_val + + +def _get_min_and_max(param: dict, default_val='') -> Tuple: + min_val = _get_key(param, 'Min', default_val=default_val) + max_val = _get_key(param, 'Max', default_val=default_val) + + if 'AllowableRange' in param: + # TODO warn if min/max are defined and at odds with allowable range + min_val = min(param['AllowableRange']) + max_val = max(param['AllowableRange']) + + return (min_val, max_val) diff --git a/src/geophires_x_schema_generator/geophires-request.json b/src/geophires_x_schema_generator/geophires-request.json index 5cfa1f52..289af2f8 100644 --- a/src/geophires_x_schema_generator/geophires-request.json +++ b/src/geophires_x_schema_generator/geophires-request.json @@ -27,8 +27,9 @@ "Injection Well Diameter", "Ramey Production Wellbore Model", "Injection Temperature", - "Heat Transfer Fluid", "Closed-loop Configuration", + "Well Geometry Configuration", + "Heat Transfer Fluid", "Total Nonvertical Length", "Circulation Pump Efficiency", "Utilization Factor", @@ -44,1063 +45,1686 @@ "description": "0: Cylindrical model, 1: Multiple parallel fractures model, 2: 1D linear heat sweep model, 3: m/a single fracture drawdown model, 4: Linear thermal drawdown model, 5: Generic user-provided temperature profile, 6: TOUGH2, 7: SUTRA", "type": "integer", "units": null, - "category": "Reservoir" + "category": "Reservoir", + "default": "Annual Percentage Thermal Drawdown", + "minimum": 0, + "maximum": 7 }, "Reservoir Depth": { "description": "Depth of the reservoir", "type": "number", "units": "kilometer", - "category": "Reservoir" + "category": "Reservoir", + "default": 3.0, + "minimum": 0.1, + "maximum": 15 }, "Maximum Temperature": { "description": "Maximum allowable reservoir temperature (e.g. due to drill bit or logging tools constraints). GEOPHIRES will cap the drilling depth to stay below this maximum temperature.", "type": "number", "units": "degC", - "category": "Reservoir" + "category": "Reservoir", + "default": 400.0, + "minimum": 50, + "maximum": 600 }, "Number of Segments": { "description": "Number of rock segments from surface to reservoir depth with specific geothermal gradient", "type": "integer", "units": null, - "category": "Reservoir" + "category": "Reservoir", + "default": 1, + "minimum": 1, + "maximum": 4 }, "Gradients": { "description": "Geothermal gradients", "type": "number", "units": "degC/m", - "category": "Reservoir" + "category": "Reservoir", + "default": [ + 0.05, + 0.0, + 0.0, + 0.0 + ], + "minimum": 0.0, + "maximum": 500.0 }, "Gradient 1": { "description": "Geothermal gradient 1 in rock segment 1", "type": "number", "units": "degC/m", - "category": "Reservoir" + "category": "Reservoir", + "default": 0.05, + "minimum": 0.0, + "maximum": 500.0 }, "Gradient 2": { "description": "Geothermal gradient 2 in rock segment 2", "type": "number", "units": "degC/km", - "category": "Reservoir" + "category": "Reservoir", + "default": 0.0, + "minimum": 0.0, + "maximum": 500.0 }, "Gradient 3": { "description": "Geothermal gradient 3 in rock segment 3", "type": "number", "units": "degC/km", - "category": "Reservoir" + "category": "Reservoir", + "default": 0.0, + "minimum": 0.0, + "maximum": 500.0 }, "Gradient 4": { "description": "Geothermal gradient 4 in rock segment 4", "type": "number", "units": "degC/km", - "category": "Reservoir" + "category": "Reservoir", + "default": 0.0, + "minimum": 0.0, + "maximum": 500.0 }, "Thicknesses": { "description": "Thicknesses of rock segments", "type": "array", "units": "kilometer", - "category": "Reservoir" + "category": "Reservoir", + "default": [ + 100000.0, + 0.01, + 0.01, + 0.01, + 0.01 + ], + "minimum": 0.01, + "maximum": 100.0 }, "Thickness 1": { "description": "Thickness of rock segment 1", "type": "number", "units": "kilometer", - "category": "Reservoir" + "category": "Reservoir", + "default": 2.0, + "minimum": 0.01, + "maximum": 100.0 }, "Thickness 2": { "description": "Thickness of rock segment 2", "type": "number", "units": "kilometer", - "category": "Reservoir" + "category": "Reservoir", + "default": 0.01, + "minimum": 0.01, + "maximum": 100.0 }, "Thickness 3": { "description": "Thickness of rock segment 3", "type": "number", "units": "kilometer", - "category": "Reservoir" + "category": "Reservoir", + "default": 0.01, + "minimum": 0.01, + "maximum": 100.0 }, "Thickness 4": { "description": "Thickness of rock segment 4", "type": "number", "units": "kilometer", - "category": "Reservoir" + "category": "Reservoir", + "default": 0.01, + "minimum": 0.01, + "maximum": 100.0 }, "Reservoir Volume Option": { "description": "Specifies how the reservoir volume, and fracture distribution (for reservoir models 1 and 2) are calculated. The reservoir volume is used by GEOPHIRES to estimate the stored heat in place. The fracture distribution is needed as input for the EGS fracture-based reservoir models 1 and 2: Specify number of fractures and fracture separation, 2: Specify reservoir volume and fracture separation, 3: Specify reservoir volume and number of fractures, 4: Specify reservoir volume only (sufficient for reservoir models 3, 4, 5 and 6)", "type": "integer", "units": null, - "category": "Reservoir" + "category": "Reservoir", + "default": "Specify reservoir volume and number of fractures", + "minimum": 1, + "maximum": 4 }, "Fracture Shape": { "description": "Specifies the shape of the (identical) fractures in a fracture-based reservoir: 1: Circular fracture with known area, 2: Circular fracture with known diameter, 3: Square fracture, 4: Rectangular fracture", "type": "integer", "units": null, - "category": "Reservoir" + "category": "Reservoir", + "default": "Circular fracture with known area", + "minimum": 1, + "maximum": 4 }, "Fracture Area": { "description": "Effective heat transfer area per fracture", "type": "number", "units": "m**2", - "category": "Reservoir" + "category": "Reservoir", + "default": 250000.0, + "minimum": 1, + "maximum": 100000000.0 }, "Fracture Height": { "description": "Diameter (if fracture shape = 2) or height (if fracture shape = 3 or 4) of each fracture", "type": "number", "units": "meter", - "category": "Reservoir" + "category": "Reservoir", + "default": 500.0, + "minimum": 1, + "maximum": 10000 }, "Fracture Width": { "description": "Width of each fracture", "type": "number", "units": "meter", - "category": "Reservoir" + "category": "Reservoir", + "default": 500.0, + "minimum": 1, + "maximum": 10000 }, "Number of Fractures": { "description": "Number of identical parallel fractures in EGS fracture-based reservoir model.", "type": "integer", "units": null, - "category": "Reservoir" + "category": "Reservoir", + "default": 10, + "minimum": 1, + "maximum": 149 }, "Fracture Separation": { "description": "Separation of identical parallel fractures with uniform spatial distribution in EGS fracture-based reservoir", "type": "number", "units": "meter", - "category": "Reservoir" + "category": "Reservoir", + "default": 50.0, + "minimum": 1, + "maximum": 10000.0 }, "Reservoir Volume": { "description": "Geothermal reservoir volume", "type": "number", "units": "m**3", - "category": "Reservoir" + "category": "Reservoir", + "default": 125000000.0, + "minimum": 10, + "maximum": 1000000000000.0 }, "Water Loss Fraction": { "description": "Fraction of water lost in the reservoir defined as (total geofluid lost)/(total geofluid produced).", "type": "number", "units": "", - "category": "Reservoir" + "category": "Reservoir", + "default": 0.0, + "minimum": 0.0, + "maximum": 0.99 }, "Reservoir Heat Capacity": { "description": "Constant and uniform reservoir rock heat capacity", "type": "number", "units": "J/kg/K", - "category": "Reservoir" + "category": "Reservoir", + "default": 1000.0, + "minimum": 100, + "maximum": 10000 }, "Reservoir Density": { "description": "Constant and uniform reservoir rock density", "type": "number", "units": "kg/m**3", - "category": "Reservoir" + "category": "Reservoir", + "default": 2700.0, + "minimum": 100, + "maximum": 10000 }, "Reservoir Thermal Conductivity": { "description": "Constant and uniform reservoir rock thermal conductivity", "type": "number", "units": "W/m/K", - "category": "Reservoir" + "category": "Reservoir", + "default": 3.0, + "minimum": 0.01, + "maximum": 100 }, "Reservoir Permeability": { "description": "Constant and uniform reservoir permeability", "type": "number", "units": "m**2", - "category": "Reservoir" + "category": "Reservoir", + "default": 1e-13, + "minimum": 1e-20, + "maximum": 1e-05 }, "Reservoir Porosity": { "description": "Constant and uniform reservoir porosity", "type": "number", "units": "", - "category": "Reservoir" + "category": "Reservoir", + "default": 0.04, + "minimum": 0.001, + "maximum": 0.99 }, "Surface Temperature": { "description": "Surface temperature used for calculating bottom-hole temperature (with geothermal gradient and reservoir depth)", "type": "number", "units": "degC", - "category": "Reservoir" + "category": "Reservoir", + "default": 15.0, + "minimum": -50, + "maximum": 50 }, "Drawdown Parameter": { "description": "specify the thermal drawdown for reservoir model 3 and 4", "type": "number", "units": "1/year", - "category": "Reservoir" + "category": "Reservoir", + "default": 0.005, + "minimum": 0, + "maximum": 0.2 }, "Cylindrical Reservoir Input Depth": { "description": "Depth of the inflow end of a cylindrical reservoir", "type": "number", "units": "kilometer", - "category": "Reservoir" + "category": "Reservoir", + "default": 3.0, + "minimum": 0.1, + "maximum": 15 }, "Cylindrical Reservoir Output Depth": { "description": "Depth of the outflow end of a cylindrical reservoir", "type": "number", "units": "kilometer", - "category": "Reservoir" + "category": "Reservoir", + "default": 3.0, + "minimum": 0.1, + "maximum": 15 }, "Cylindrical Reservoir Length": { "description": "Length of cylindrical reservoir", "type": "number", "units": "kilometer", - "category": "Reservoir" + "category": "Reservoir", + "default": 4.0, + "minimum": 0.1, + "maximum": 10.0 }, "Cylindrical Reservoir Radius of Effect": { "description": "The radius of effect - the distance into the rock from the center of the cylinder that will be perturbed by at least 1 C", "type": "number", "units": "meter", - "category": "Reservoir" + "category": "Reservoir", + "default": 30.0, + "minimum": 0, + "maximum": 1000.0 }, "Cylindrical Reservoir Radius of Effect Factor": { "description": "The radius of effect reduction factor - to account for the fact that we cannot extract 100% of the heat in the cylinder.", "type": "number", "units": "", - "category": "Reservoir" + "category": "Reservoir", + "default": 1.0, + "minimum": 0.0, + "maximum": 10.0 }, "Drilled length": { "description": "Depth of the inflow end of a cyclindrical reservoir", "type": "number", "units": "kilometer", - "category": "Reservoir" + "category": "Reservoir", + "default": 0.0, + "minimum": 0.0, + "maximum": 150 }, "SUTRA Annual Heat File Name": { "description": "SUTRA file with heat stored, heat supplied and efficiency for each year", "type": "string", "units": null, - "category": "Reservoir" + "category": "Reservoir", + "default": null, + "minimum": null, + "maximum": null }, "SUTRA Heat Budget File Name": { "description": "SUTRA file with target heat and simulated heat for each SUTRA time step over lifetime", "type": "string", "units": null, - "category": "Reservoir" + "category": "Reservoir", + "default": null, + "minimum": null, + "maximum": null }, "SUTRA Balance and Storage Well Output File Name": { "description": "SUTRA file with well flow rate and temperature for each SUTRA time step over lifetime", "type": "string", "units": null, - "category": "Reservoir" + "category": "Reservoir", + "default": null, + "minimum": null, + "maximum": null }, "Number of Production Wells": { "description": "Number of (identical) production wells", "type": "integer", "units": null, - "category": "Well Bores" + "category": "Well Bores", + "default": 1, + "minimum": 1, + "maximum": 200 }, "Number of Injection Wells": { "description": "Number of (identical) injection wells", "type": "integer", "units": null, - "category": "Well Bores" + "category": "Well Bores", + "default": 1, + "minimum": 0, + "maximum": 200 }, "Production Well Diameter": { "description": "Inner diameter of production wellbore (assumed constant along the wellbore) to calculate frictional pressure drop and wellbore heat transmission with Rameys model", "type": "number", "units": "in", - "category": "Well Bores" + "category": "Well Bores", + "default": 8.0, + "minimum": 1.0, + "maximum": 30.0 }, "Injection Well Diameter": { "description": "Inner diameter of production wellbore (assumed constant along the wellbore) to calculate frictional pressure drop and wellbore heat transmission with Rameys model", "type": "number", "units": "in", - "category": "Well Bores" + "category": "Well Bores", + "default": 8.0, + "minimum": 1.0, + "maximum": 30.0 }, "Ramey Production Wellbore Model": { "description": "Select whether to use Rameys model to estimate the geofluid temperature drop in the production wells", "type": "boolean", "units": null, - "category": "Well Bores" + "category": "Well Bores", + "default": true, + "minimum": null, + "maximum": null }, "Production Wellbore Temperature Drop": { "description": "Specify constant production well geofluid temperature drop in case Rameys model is disabled.", "type": "number", "units": "degC", - "category": "Well Bores" + "category": "Well Bores", + "default": 5.0, + "minimum": -5.0, + "maximum": 50.0 }, "Injection Wellbore Temperature Gain": { "description": "Specify constant injection well geofluid temperature gain.", "type": "number", "units": "degC", - "category": "Well Bores" + "category": "Well Bores", + "default": 0.0, + "minimum": -5.0, + "maximum": 50.0 }, "Production Flow Rate per Well": { "description": "Geofluid flow rate per production well.", "type": "number", "units": "kg/sec", - "category": "Well Bores" + "category": "Well Bores", + "default": 50.0, + "minimum": 1.0, + "maximum": 500.0 }, "Reservoir Impedance": { "description": "Reservoir resistance to flow per well-pair. For EGS-type reservoirs when the injection well is in hydraulic communication with the production well, this parameter specifies the overall pressure drop in the reservoir between injection well and production well (see docs)", "type": "number", "units": "GPa.s/m**3", - "category": "Well Bores" + "category": "Well Bores", + "default": 1000.0, + "minimum": 0.0001, + "maximum": 10000.0 }, "Well Separation": { "description": "Well separation for built-in TOUGH2 doublet reservoir model", "type": "number", "units": "in", - "category": "Well Bores" + "category": "Well Bores", + "default": 1000.0, + "minimum": 10.0, + "maximum": 10000.0 }, "Injection Temperature": { "description": "Constant geofluid injection temperature at injection wellhead.", "type": "number", "units": "degC", - "category": "Well Bores" + "category": "Well Bores", + "default": 70.0, + "minimum": 0.0, + "maximum": 200.0 }, - "Average reservoir Pressure": { - "description": "Average reservoir far-field pressure. Default value is calculated with built-in modified Xie-Bloomfield-Shook equation (DOE, 2016).", + "Reservoir Hydrostatic Pressure": { + "description": "Reservoir hydrostatic far-field pressure. Default value is calculated with built-in modified Xie-Bloomfield-Shook equation (DOE, 2016).", "type": "number", "units": "kPa", - "category": "Well Bores" + "category": "Well Bores", + "default": 29430, + "minimum": 100.0, + "maximum": 100000.0 }, "Production Wellhead Pressure": { "description": "Constant production wellhead pressure; Required if specifying productivity index", "type": "number", "units": "kPa", - "category": "Well Bores" + "category": "Well Bores", + "default": 446.02, + "minimum": 0.0, + "maximum": 10000.0 }, "Injectivity Index": { "description": "Injectivity index defined as ratio of injection well flow rate over injection well outflow pressure drop (flowing bottom hole pressure - hydrostatic reservoir pressure).", "type": "number", "units": "kg/sec/bar", - "category": "Well Bores" + "category": "Well Bores", + "default": 10.0, + "minimum": 0.01, + "maximum": 10000.0 }, "Productivity Index": { "description": "Productivity index defined as ratio of production well flow rate over production well inflow pressure drop (see docs)", "type": "number", "units": "kg/sec/bar", - "category": "Well Bores" + "category": "Well Bores", + "default": 10.0, + "minimum": 0.01, + "maximum": 10000.0 }, "Maximum Drawdown": { "description": "Maximum allowable thermal drawdown before redrilling of all wells into new reservoir (most applicable to EGS-type reservoirs with heat farming strategies). E.g. a value of 0.2 means that all wells are redrilled after the production temperature (at the wellhead) has dropped by 20% of its initial temperature", "type": "number", "units": "", - "category": "Well Bores" + "category": "Well Bores", + "default": 1.0, + "minimum": 0.0, + "maximum": 1.000001 }, "Is AGS": { "description": "Set to true if the model is for an Advanced Geothermal System (AGS)", "type": "boolean", "units": null, - "category": "Well Bores" + "category": "Well Bores", + "default": false, + "minimum": null, + "maximum": null }, - "Heat Transfer Fluid": { - "description": "", - "type": "integer", - "units": null, - "category": "Well Bores" + "Overpressure Percentage": { + "description": "enter the amount of pressure over the hydrostatic pressure in the reservoir (100%=hydrostatic)", + "type": "number", + "units": "%", + "category": "Well Bores", + "default": 100.0, + "minimum": -1.8e+30, + "maximum": 1.8e+30 + }, + "Overpressure Depletion Rate": { + "description": "enter the amount of pressure over the hydrostatic pressure in the reservoir (100%=hydrostatic)", + "type": "number", + "units": "%/yr", + "category": "Well Bores", + "default": 0.0, + "minimum": -1.8e+30, + "maximum": 1.8e+30 + }, + "Injection Reservoir Temperature": { + "description": "enter the temperature of the injection reservoir (100 C)", + "type": "number", + "units": "degC", + "category": "Well Bores", + "default": 100.0, + "minimum": -1.8e+30, + "maximum": 1.8e+30 + }, + "Injection Reservoir Depth": { + "description": "enter the depth of the injection reservoir (1000 m)", + "type": "number", + "units": "meter", + "category": "Well Bores", + "default": 1000.0, + "minimum": -1.8e+30, + "maximum": 1.8e+30 + }, + "Injection Reservoir Initial Pressure": { + "description": "enter the depth of the injection reservoir initial pressure (use lithostatic pressure)", + "type": "number", + "units": "kPa", + "category": "Well Bores", + "default": 0.0, + "minimum": -1.8e+30, + "maximum": 1.8e+30 + }, + "Injection Reservoir Inflation Rate": { + "description": "enter the rate at which the pressure increases per year in the injection reservoir (1000 kPa/yr)", + "type": "number", + "units": "kPa/yr", + "category": "Well Bores", + "default": 1000.0, + "minimum": -1.8e+30, + "maximum": 1.8e+30 }, "Closed-loop Configuration": { "description": "", "type": "integer", "units": null, - "category": "Well Bores" + "category": "Well Bores", + "default": "vertical", + "minimum": 1, + "maximum": 4 }, - "Total Nonvertical Length": { + "Well Geometry Configuration": { "description": "", - "type": "number", - "units": "meter", - "category": "Well Bores" + "type": "integer", + "units": null, + "category": "Well Bores", + "default": "vertical", + "minimum": 1, + "maximum": 4 }, "Water Thermal Conductivity": { "description": "Water Thermal Conductivity", "type": "number", "units": "W/m/K", - "category": "Well Bores" + "category": "Well Bores", + "default": 0.6, + "minimum": 0.0, + "maximum": 100.0 + }, + "Heat Transfer Fluid": { + "description": "", + "type": "integer", + "units": null, + "category": "Well Bores", + "default": "water", + "minimum": 1, + "maximum": 2 + }, + "Total Nonvertical Length": { + "description": "", + "type": "number", + "units": "meter", + "category": "Well Bores", + "default": 1000.0, + "minimum": 50.0, + "maximum": 20000.0 }, "Nonvertical Wellbore Diameter": { "description": "Non-vertical Wellbore Diameter", "type": "number", "units": "meter", - "category": "Well Bores" + "category": "Well Bores", + "default": 0.156, + "minimum": 0.01, + "maximum": 100.0 }, "Number of Multilateral Sections": { "description": "Number of Nonvertical Wellbore Sections", "type": "integer", "units": null, - "category": "Well Bores" - }, - "Closed Loop Calculation Start Year": { - "description": "Closed Loop Calculation Start Year", - "type": "number", - "units": "yr", - "category": "Well Bores" + "category": "Well Bores", + "default": 1, + "minimum": 0, + "maximum": 100 }, "Multilaterals Cased": { "description": "", "type": "boolean", "units": null, - "category": "Well Bores" + "category": "Well Bores", + "default": false, + "minimum": null, + "maximum": null + }, + "Closed Loop Calculation Start Year": { + "description": "Closed Loop Calculation Start Year", + "type": "number", + "units": "yr", + "category": "Well Bores", + "default": 0.01, + "minimum": 0.01, + "maximum": 100.0 }, "End-Use Option": { "description": "Select the end-use application of the geofluid heat (see docs for details)", "type": "integer", "units": null, - "category": "Surface Plant" + "category": "Surface Plant", + "default": null, + "minimum": 1, + "maximum": 52 }, "Power Plant Type": { "description": "Specify the type of physical plant. 1: Subcritical ORC, 2: Supercritical ORC, 3: Single-flash, 4: Double-flash, 5: Absorption Chiller, 6: Heat Pump 7: District Heating, 8: Reservoir Thermal Energy Storage", "type": "integer", "units": null, - "category": "Surface Plant" + "category": "Surface Plant", + "default": "Subcritical ORC", + "minimum": 1, + "maximum": 9 }, "Circulation Pump Efficiency": { "description": "Specify the overall efficiency of the injection and production well pumps", "type": "number", "units": "", - "category": "Surface Plant" + "category": "Surface Plant", + "default": 0.75, + "minimum": 0.1, + "maximum": 1.0 }, "Utilization Factor": { "description": "Ratio of the time the plant is running in normal production in a 1-year time period.", "type": "number", "units": "", - "category": "Surface Plant" + "category": "Surface Plant", + "default": 0.9, + "minimum": 0.1, + "maximum": 1.0 }, "End-Use Efficiency Factor": { "description": "Constant thermal efficiency of the direct-use application", "type": "number", "units": "", - "category": "Surface Plant" + "category": "Surface Plant", + "default": 0.9, + "minimum": 0.1, + "maximum": 1.0 }, "CHP Fraction": { "description": "Fraction of produced geofluid flow rate going to direct-use heat application in CHP parallel cycle", "type": "number", "units": "", - "category": "Surface Plant" + "category": "Surface Plant", + "default": 0.5, + "minimum": 0.0001, + "maximum": 0.9999 }, "CHP Bottoming Entering Temperature": { "description": "Power plant entering geofluid temperature used in CHP bottoming cycle", "type": "number", "units": "degC", - "category": "Surface Plant" + "category": "Surface Plant", + "default": 150.0, + "minimum": 0, + "maximum": 400 }, "Ambient Temperature": { "description": "Ambient (or dead-state) temperature used for calculating power plant utilization efficiency", "type": "number", "units": "degC", - "category": "Surface Plant" + "category": "Surface Plant", + "default": 15.0, + "minimum": -50, + "maximum": 50 }, "Plant Lifetime": { "description": "System lifetime", "type": "integer", "units": "yr", - "category": "Surface Plant" + "category": "Surface Plant", + "default": 30, + "minimum": 1, + "maximum": 100 }, "Surface Piping Length": { "description": "", "type": "number", "units": "kilometer", - "category": "Surface Plant" + "category": "Surface Plant", + "default": 0.0, + "minimum": 0, + "maximum": 100 }, "Plant Outlet Pressure": { "description": "Constant plant outlet pressure equal to injection well pump(s) suction pressure", "type": "number", "units": "kPa", - "category": "Surface Plant" + "category": "Surface Plant", + "default": 100.0, + "minimum": 0.01, + "maximum": 15000.0 }, "Electricity Rate": { "description": "Price of electricity to calculate pumping costs in direct-use heat only mode or revenue from electricity sales in CHP mode.", "type": "number", "units": "USD/kWh", - "category": "Surface Plant" + "category": "Surface Plant", + "default": 0.07, + "minimum": 0.0, + "maximum": 1.0 }, "Heat Rate": { "description": "Price of heat to calculate revenue from heat sales in CHP mode.", "type": "number", "units": "USD/kWh", - "category": "Surface Plant" + "category": "Surface Plant", + "default": 0.02, + "minimum": 0.0, + "maximum": 1.0 }, "Construction Years": { "description": "Number of years spent in construction (assumes whole years, no fractions)", "type": "integer", "units": null, - "category": "Economics" + "category": "Economics", + "default": 1, + "minimum": 1, + "maximum": 14 }, "Dead-state Pressure": { "description": "", "type": "number", "units": "Pa", - "category": "Surface Plant" + "category": "Surface Plant", + "default": 100000.0, + "minimum": 80000.0, + "maximum": 110000.0 }, "Isentropic Efficiency for CO2 Turbine": { "description": "", "type": "number", "units": "", - "category": "Surface Plant" + "category": "Surface Plant", + "default": 0.9, + "minimum": 0.8, + "maximum": 1.0 }, "Generator Conversion Efficiency": { "description": "", "type": "number", "units": "", - "category": "Surface Plant" + "category": "Surface Plant", + "default": 0.98, + "minimum": 0.8, + "maximum": 1.0 }, "Isentropic Efficiency for CO2 Compressor": { "description": "", "type": "number", "units": "", - "category": "Surface Plant" + "category": "Surface Plant", + "default": 0.9, + "minimum": 0.8, + "maximum": 1.0 }, "CO2 Temperature Decline with Cooling": { "description": "", "type": "number", "units": "degC", - "category": "Surface Plant" + "category": "Surface Plant", + "default": 12.0, + "minimum": 0.0, + "maximum": 15.0 }, "CO2 Turbine Outlet Pressure": { "description": "", "type": "number", "units": "bar", - "category": "Surface Plant" + "category": "Surface Plant", + "default": 81.0, + "minimum": 75.0, + "maximum": 200.0 }, "Economic Model": { "description": "Specify the economic model to calculate the levelized cost of energy. 1: Fixed Charge Rate Model, 2: Standard Levelized Cost Model, 3: BICYCLE Levelized Cost Model, 4: CLGS", "type": "integer", "units": null, - "category": "Economics" + "category": "Economics", + "default": "Standard Levelized Cost", + "minimum": 1, + "maximum": 4 }, "Reservoir Stimulation Capital Cost": { "description": "Total reservoir stimulation capital cost", "type": "number", "units": "MUSD", - "category": "Economics" + "category": "Economics", + "default": -1.0, + "minimum": 0, + "maximum": 100 }, "Reservoir Stimulation Capital Cost Adjustment Factor": { "description": "Multiplier for built-in reservoir stimulation capital cost correlation", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 1.0, + "minimum": 0, + "maximum": 10 }, "Exploration Capital Cost": { "description": "Total exploration capital cost", "type": "number", "units": "MUSD", - "category": "Economics" + "category": "Economics", + "default": -1.0, + "minimum": 0, + "maximum": 100 }, "Exploration Capital Cost Adjustment Factor": { "description": "Multiplier for built-in exploration capital cost correlation", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 1.0, + "minimum": 0, + "maximum": 10 }, "Well Drilling and Completion Capital Cost": { "description": "Well Drilling and Completion Capital Cost", "type": "number", "units": "MUSD", - "category": "Economics" + "category": "Economics", + "default": -1.0, + "minimum": 0, + "maximum": 200 + }, + "Injection Well Drilling and Completion Capital Cost": { + "description": "Injection Well Drilling and Completion Capital Cost", + "type": "number", + "units": "MUSD", + "category": "Economics", + "default": -1.0, + "minimum": 0, + "maximum": 200 }, "Well Drilling and Completion Capital Cost Adjustment Factor": { "description": "Well Drilling and Completion Capital Cost Adjustment Factor", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 1.0, + "minimum": 0, + "maximum": 10 + }, + "Injection Well Drilling and Completion Capital Cost Adjustment Factor": { + "description": "Injection Well Drilling and Completion Capital Cost Adjustment Factor", + "type": "number", + "units": "", + "category": "Economics", + "default": 1.0, + "minimum": 0, + "maximum": 10 }, "Wellfield O&M Cost": { "description": "Total annual wellfield O&M cost", "type": "number", "units": "MUSD/yr", - "category": "Economics" + "category": "Economics", + "default": -1.0, + "minimum": 0, + "maximum": 100 }, "Wellfield O&M Cost Adjustment Factor": { "description": "Multiplier for built-in wellfield O&M cost correlation", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 1.0, + "minimum": 0, + "maximum": 10 }, "Surface Plant Capital Cost": { "description": "Total surface plant capital cost", "type": "number", "units": "MUSD", - "category": "Economics" + "category": "Economics", + "default": -1.0, + "minimum": 0, + "maximum": 1000 }, "Surface Plant Capital Cost Adjustment Factor": { "description": "Multiplier for built-in surface plant capital cost correlation", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 1.0, + "minimum": 0, + "maximum": 10 }, "Field Gathering System Capital Cost": { "description": "Total field gathering system capital cost", "type": "number", "units": "MUSD", - "category": "Economics" + "category": "Economics", + "default": -1.0, + "minimum": 0, + "maximum": 100 }, "Field Gathering System Capital Cost Adjustment Factor": { "description": "Multiplier for built-in field gathering system capital cost correlation", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 1.0, + "minimum": 0, + "maximum": 10 }, "Surface Plant O&M Cost": { "description": "Total annual surface plant O&M cost", "type": "number", "units": "MUSD/yr", - "category": "Economics" + "category": "Economics", + "default": -1.0, + "minimum": 0, + "maximum": 100 }, "Surface Plant O&M Cost Adjustment Factor": { "description": "Multiplier for built-in surface plant O&M cost correlation", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 1.0, + "minimum": 0, + "maximum": 10 }, "Water Cost": { "description": "Total annual make-up water cost", "type": "number", "units": "MUSD/yr", - "category": "Economics" + "category": "Economics", + "default": -1.0, + "minimum": 0, + "maximum": 100 }, "Water Cost Adjustment Factor": { "description": "Multiplier for built-in make-up water cost correlation", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 1.0, + "minimum": 0, + "maximum": 10 }, "Total Capital Cost": { "description": "Total initial capital cost.", "type": "number", "units": "MUSD", - "category": "Economics" + "category": "Economics", + "default": -1.0, + "minimum": 0, + "maximum": 1000 }, "Total O&M Cost": { "description": "Total initial O&M cost.", "type": "number", "units": "MUSD/yr", - "category": "Economics" + "category": "Economics", + "default": -1.0, + "minimum": 0, + "maximum": 100 }, "Time steps per year": { "description": "Number of internal simulation time steps per year", "type": "integer", "units": null, - "category": "Economics" + "category": "Economics", + "default": 4, + "minimum": 1, + "maximum": 100 }, "Fixed Charge Rate": { "description": "Fixed charge rate (FCR) used in the Fixed Charge Rate Model", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 0.1, + "minimum": 0.0, + "maximum": 1.0 }, "Discount Rate": { "description": "Discount rate used in the Standard Levelized Cost Model", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 0.07, + "minimum": 0.0, + "maximum": 1.0 }, "Fraction of Investment in Bonds": { "description": "Fraction of geothermal project financing through bonds (see docs)", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 0.5, + "minimum": 0.0, + "maximum": 1.0 }, "Inflated Bond Interest Rate": { "description": "Inflated bond interest rate (see docs)", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 0.05, + "minimum": 0.0, + "maximum": 1.0 }, "Inflated Equity Interest Rate": { "description": "Inflated equity interest rate (see docs)", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 0.1, + "minimum": 0.0, + "maximum": 1.0 }, "Inflation Rate": { "description": "Inflation rate", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 0.02, + "minimum": 0.0, + "maximum": 1.0 }, "Combined Income Tax Rate": { "description": "Combined income tax rate (see docs)", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 0.02, + "minimum": 0.0, + "maximum": 1.0 }, "Gross Revenue Tax Rate": { "description": "Gross revenue tax rate (see docs)", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 0.02, + "minimum": 0.0, + "maximum": 1.0 }, "Investment Tax Credit Rate": { "description": "Investment tax credit rate (see docs)", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": 0.0, + "maximum": 1.0 }, "Property Tax Rate": { "description": "Property tax rate (see docs)", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": 0.0, + "maximum": 1.0 }, "Inflation Rate During Construction": { "description": "", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": 0.0, + "maximum": 1.0 }, "Well Drilling Cost Correlation": { "description": "Select the built-in well drilling and completion cost correlation: 1. vertical small diameter, baseline; 2. deviated small diameter, baseline; 3. vertical large diameter, baseline; 4. deviated large diameter, baseline; 5. Simple; 6. vertical small diameter, intermediate1; 7. vertical small diameter, intermediate2; 8. deviated small diameter, intermediate1; 9. deviated small diameter, intermediate2; 10. vertical large diameter, intermediate1; 11. vertical large diameter, intermediate2; 12. deviated large diameter, intermediate1; 13. deviated large diameter, intermediate2; 14. vertical open-hole, small diameter, ideal; 15. deviated liner, small diameter, ideal; 16. vertical open-hole, large diameter, ideal; 17. deviated liner, large diameter, ideal", "type": "integer", "units": null, - "category": "Economics" + "category": "Economics", + "default": "", + "minimum": 1, + "maximum": 17 }, "Do AddOn Calculations": { "description": "Set to true if you want the add-on economics calculations to be made", "type": "boolean", "units": null, - "category": "Economics" + "category": "Economics", + "default": false, + "minimum": null, + "maximum": null }, "Do Carbon Price Calculations": { "description": "Set to true if you want the Carbon Credit economics calculations to be made", "type": "boolean", "units": null, - "category": "Economics" + "category": "Economics", + "default": false, + "minimum": null, + "maximum": null }, "Do S-DAC-GT Calculations": { "description": "Set to true if you want the S-DAC-GT economics calculations to be made", "type": "boolean", "units": null, - "category": "Economics" + "category": "Economics", + "default": false, + "minimum": null, + "maximum": null }, "All-in Vertical Drilling Costs": { "description": "Set user specified all-in cost per meter of vertical drilling, including drilling, casing, cement, insulated insert", "type": "number", "units": "USD/m", - "category": "Economics" + "category": "Economics", + "default": 1000.0, + "minimum": 0.0, + "maximum": 10000.0 }, "All-in Nonvertical Drilling Costs": { "description": "Set user specified all-in cost per meter of non-vertical drilling, including drilling, casing, cement, insulated insert", "type": "number", "units": "USD/m", - "category": "Economics" + "category": "Economics", + "default": 1300.0, + "minimum": 0.0, + "maximum": 15000.0 }, "Absorption Chiller Capital Cost": { "description": "Absorption chiller capital cost", "type": "number", "units": "MUSD", - "category": "Economics" + "category": "Economics", + "default": 5, + "minimum": 0, + "maximum": 100 }, "Absorption Chiller O&M Cost": { "description": "Absorption chiller O&M cost", "type": "number", "units": "MUSD/yr", - "category": "Economics" + "category": "Economics", + "default": 1, + "minimum": 0, + "maximum": 100 }, "Heat Pump Capital Cost": { "description": "Heat pump capital cost", "type": "number", "units": "MUSD", - "category": "Economics" + "category": "Economics", + "default": 5, + "minimum": 0, + "maximum": 100 }, "Peaking Fuel Cost Rate": { "description": "Price of peaking fuel for peaking boilers", "type": "number", "units": "USD/kWh", - "category": "Economics" + "category": "Economics", + "default": 0.034, + "minimum": 0.0, + "maximum": 1.0 }, "Peaking Boiler Efficiency": { "description": "Peaking boiler efficiency", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 0.85, + "minimum": 0, + "maximum": 1 }, "District Heating Piping Cost Rate": { "description": "District heating piping cost rate ($/m)", "type": "number", "units": "USD/m", - "category": "Economics" + "category": "Economics", + "default": 1200, + "minimum": 0, + "maximum": 10000 }, "Total District Heating Network Cost": { "description": "Total district heating network cost ($M)", "type": "number", "units": "MUSD", - "category": "Economics" + "category": "Economics", + "default": 10, + "minimum": 0, + "maximum": 1000 }, "District Heating O&M Cost": { "description": "Total annual district heating O&M cost ($M/year)", "type": "number", "units": "MUSD/yr", - "category": "Economics" + "category": "Economics", + "default": 1, + "minimum": 0, + "maximum": 100 }, "District Heating Network Piping Length": { "description": "District heating network piping length (km)", "type": "number", "units": "kilometer", - "category": "Economics" + "category": "Economics", + "default": 10.0, + "minimum": 0, + "maximum": 1000 }, "District Heating Road Length": { "description": "District heating road length (km)", "type": "number", "units": "kilometer", - "category": "Economics" + "category": "Economics", + "default": 10.0, + "minimum": 0, + "maximum": 1000 }, "District Heating Land Area": { "description": "District heating land area (km2)", "type": "number", "units": "km**2", - "category": "Economics" + "category": "Economics", + "default": 10.0, + "minimum": 0, + "maximum": 1000 }, "District Heating Population": { "description": "Specify the population in the district heating network", "type": "number", "units": null, - "category": "Economics" + "category": "Economics", + "default": 200, + "minimum": 0, + "maximum": 1000000 }, "Starting Heat Sale Price": { "description": "", "type": "number", "units": "USD/kWh", - "category": "Economics" + "category": "Economics", + "default": 0.025, + "minimum": 0, + "maximum": 100 }, "Ending Heat Sale Price": { "description": "", "type": "number", "units": "USD/kWh", - "category": "Economics" + "category": "Economics", + "default": 0.025, + "minimum": 0, + "maximum": 100 }, "Heat Escalation Start Year": { "description": "Number of years after start of project before start of escalation", "type": "integer", "units": "yr", - "category": "Economics" + "category": "Economics", + "default": 5, + "minimum": 0, + "maximum": 100 }, "Heat Escalation Rate Per Year": { "description": "additional cost per year of price after escalation starts", "type": "number", "units": "USD/kWh", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": 0.0, + "maximum": 100.0 }, "Starting Electricity Sale Price": { "description": "", "type": "number", "units": "USD/kWh", - "category": "Economics" + "category": "Economics", + "default": 0.055, + "minimum": 0, + "maximum": 100 }, "Ending Electricity Sale Price": { "description": "", "type": "number", "units": "USD/kWh", - "category": "Economics" + "category": "Economics", + "default": 0.055, + "minimum": 0, + "maximum": 100 }, "Electricity Escalation Start Year": { "description": "Number of years after start of project before start of escalation", "type": "integer", "units": "yr", - "category": "Economics" + "category": "Economics", + "default": 5, + "minimum": 0, + "maximum": 100 }, "Electricity Escalation Rate Per Year": { "description": "additional cost per year of price after escalation starts", "type": "number", "units": "USD/kWh", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": 0.0, + "maximum": 100.0 }, "Starting Cooling Sale Price": { "description": "", "type": "number", "units": "USD/kWh", - "category": "Economics" + "category": "Economics", + "default": 0.025, + "minimum": 0, + "maximum": 100 }, "Ending Cooling Sale Price": { "description": "", "type": "number", "units": "USD/kWh", - "category": "Economics" + "category": "Economics", + "default": 0.025, + "minimum": 0, + "maximum": 100 }, "Cooling Escalation Start Year": { "description": "Number of years after start of project before start of escalation", "type": "integer", "units": "yr", - "category": "Economics" + "category": "Economics", + "default": 5, + "minimum": 0, + "maximum": 100 }, "Cooling Escalation Rate Per Year": { "description": "additional cost per year of price after escalation starts", "type": "number", "units": "USD/kWh", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": 0.0, + "maximum": 100.0 }, "Starting Carbon Credit Value": { "description": "", "type": "number", "units": "USD/lb", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": 0, + "maximum": 1000 }, "Ending Carbon Credit Value": { "description": "", "type": "number", "units": "USD/lb", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": 0, + "maximum": 1000 }, "Carbon Escalation Start Year": { "description": "Number of years after start of project before start of Carbon incentives", "type": "integer", "units": "yr", - "category": "Economics" + "category": "Economics", + "default": 0, + "minimum": 0, + "maximum": 100 }, "Carbon Escalation Rate Per Year": { "description": "additional value per year of price after escalation starts", "type": "number", "units": "USD/lb", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": 0.0, + "maximum": 100.0 }, "Current Grid CO2 production": { "description": "CO2 intensity of the grid (how much CO2 is produced per kWh of electricity produced (0.93916924 lbs/kWh for Texas ERCOT))", "type": "number", "units": "lbs/kWh", - "category": "Economics" + "category": "Economics", + "default": 0.93916924, + "minimum": 0, + "maximum": 50000 }, "CO2 produced by Natural Gas": { "description": "CO2 intensity of buring natural gas (how much CO2 is produced per kWh of heat produced (0.407855 lbs/kWh))", "type": "number", "units": "lbs/kWh", - "category": "Economics" + "category": "Economics", + "default": 0.070324961, + "minimum": 0, + "maximum": 50000 }, "Annual License Fees Etc": { "description": "", "type": "number", "units": "MUSD", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": -1000.0, + "maximum": 1000.0 }, "One-time Flat License Fees Etc": { "description": "", "type": "number", "units": "MUSD", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": -1000.0, + "maximum": 1000.0 }, "Other Incentives": { "description": "", "type": "number", "units": "MUSD", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": -1000.0, + "maximum": 1000.0 }, "Tax Relief Per Year": { "description": "Fixed percent reduction in annual tax rate", "type": "number", "units": "%", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": 0.0, + "maximum": 100.0 }, "One-time Grants Etc": { "description": "", "type": "number", "units": "MUSD", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": -1000.0, + "maximum": 1000.0 }, "Fixed Internal Rate": { "description": "Fixed Internal Rate (used in NPV calculation)", "type": "number", "units": "%", - "category": "Economics" + "category": "Economics", + "default": 6.25, + "minimum": 0.0, + "maximum": 100.0 }, "CHP Electrical Plant Cost Allocation Ratio": { "description": "CHP Electrical Plant Cost Allocation Ratio (cost electrical plant/total CAPEX)", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": -1.0, + "minimum": 0.0, + "maximum": 1.0 }, "Production Tax Credit Electricity": { "description": "Production tax credit for electricity in $/kWh", "type": "number", "units": "USD/kWh", - "category": "Economics" + "category": "Economics", + "default": 0.04, + "minimum": 0.0, + "maximum": 10.0 }, "Production Tax Credit Heat": { "description": "Production tax credit for heat in $/MMBTU", "type": "number", "units": "USD/MMBTU", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": 0.0, + "maximum": 100.0 }, "Production Tax Credit Cooling": { "description": "Production tax credit for cooling in $/MMBTU", "type": "number", "units": "USD/MMBTU", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": 0.0, + "maximum": 100.0 }, "Production Tax Credit Duration": { "description": "Production tax credit for duration in years", "type": "integer", "units": "yr", - "category": "Economics" + "category": "Economics", + "default": 10, + "minimum": 0, + "maximum": 99 }, "Production Tax Credit Inflation Adjusted": { "description": "Production tax credit inflation adjusted", "type": "boolean", "units": null, - "category": "Economics" + "category": "Economics", + "default": false, + "minimum": null, + "maximum": null }, "Operation & Maintenance Cost of Surface Plant": { "description": "", "type": "number", "units": "", - "category": "Economics" + "category": "Economics", + "default": 0.015, + "minimum": 0.0, + "maximum": 0.2 }, "Capital Cost for Surface Plant for Direct-use System": { "description": "", "type": "number", "units": "USD/kW", - "category": "Economics" + "category": "Economics", + "default": 100.0, + "minimum": 0.0, + "maximum": 10000.0 }, "Capital Cost for Power Plant for Electricity Generation": { "description": "", "type": "number", "units": "USD/kW", - "category": "Economics" + "category": "Economics", + "default": 3000.0, + "minimum": 0.0, + "maximum": 10000.0 }, "Do CCUS Calculations": { "description": "Set to true if you want the CCUS economics calculations to be made", "type": "boolean", "units": null, - "category": "Economics" + "category": "Economics", + "default": false, + "minimum": null, + "maximum": null }, "Ending CCUS Credit Value": { "description": "", "type": "number", "units": "USD/lb", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": 0, + "maximum": 1000 }, "CCUS Escalation Start Year": { "description": "Number of years after start of project before start of CCUS incentives", "type": "integer", "units": "yr", - "category": "Economics" + "category": "Economics", + "default": 0, + "minimum": 0, + "maximum": 100 }, "CCUS Escalation Rate Per Year": { "description": "additional value per year of price after escalation starts", "type": "number", "units": "USD/mt", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": 0.0, + "maximum": 100.0 }, "Starting CCUS Credit Value": { "description": "", "type": "number", "units": "USD/mt", - "category": "Economics" + "category": "Economics", + "default": 0.0, + "minimum": 0, + "maximum": 1000 }, "AddOn Nickname": { "description": "", "type": "array", "units": null, - "category": "Economics" + "category": "Economics", + "default": [], + "minimum": 0.0, + "maximum": 1000.0 }, "AddOn CAPEX": { "description": "", "type": "array", "units": "MUSD", - "category": "Economics" + "category": "Economics", + "default": [], + "minimum": 0.0, + "maximum": 1000.0 }, "AddOn OPEX": { "description": "", "type": "array", "units": "MUSD/yr", - "category": "Economics" + "category": "Economics", + "default": [], + "minimum": 0.0, + "maximum": 1000.0 }, "AddOn Electricity Gained": { "description": "", "type": "array", "units": "kW/yr", - "category": "Economics" + "category": "Economics", + "default": [], + "minimum": 0.0, + "maximum": 1000.0 }, "AddOn Heat Gained": { "description": "", "type": "array", "units": "kW/yr", - "category": "Economics" + "category": "Economics", + "default": [], + "minimum": 0.0, + "maximum": 1000.0 }, "AddOn Profit Gained": { "description": "", "type": "array", "units": "MUSD/yr", - "category": "Economics" + "category": "Economics", + "default": [], + "minimum": 0.0, + "maximum": 1000.0 } } } diff --git a/tests/example1_addons.csv b/tests/example1_addons.csv index 3ad1ee79..305fa7b2 100644 --- a/tests/example1_addons.csv +++ b/tests/example1_addons.csv @@ -96,6 +96,7 @@ SURFACE EQUIPMENT SIMULATION RESULTS,Average Annual Total Electricity Generation SURFACE EQUIPMENT SIMULATION RESULTS,Average Annual Net Electricity Generation,,42.3,GWh SURFACE EQUIPMENT SIMULATION RESULTS,Average Pumping Power,,0.2,MW SURFACE EQUIPMENT SIMULATION RESULTS,Initial pumping power/net installed power,,3.82,% +Simulation Metadata,GEOPHIRES Version,,3.4.31, POWER GENERATION PROFILE,THERMAL DRAWDOWN,1,1.0, POWER GENERATION PROFILE,THERMAL DRAWDOWN,2,1.0056, POWER GENERATION PROFILE,THERMAL DRAWDOWN,3,1.0073, @@ -727,35 +728,35 @@ REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,28,151.92,MUSD REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,29,158.33,MUSD REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,30,164.74,MUSD REVENUE & CASHFLOW PROFILE,Heat Price,1,0.0,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,2,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,3,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,4,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,5,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,6,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,7,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,8,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,9,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,10,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,11,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,12,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,13,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,14,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,15,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,16,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,17,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,18,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,19,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,20,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,21,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,22,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,23,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,24,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,25,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,26,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,27,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,28,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,29,2.5,cents/kWh -REVENUE & CASHFLOW PROFILE,Heat Price,30,2.5,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,2,1.23,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,3,1.23,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,4,1.23,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,5,1.23,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,6,1.23,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,7,1.23,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,8,1.23,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,9,1.23,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,10,2.23,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,11,3.23,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,12,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,13,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,14,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,15,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,16,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,17,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,18,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,19,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,20,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,21,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,22,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,23,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,24,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,25,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,26,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,27,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,28,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,29,3.59,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,30,3.59,cents/kWh REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,1,0.0,MUSD/yr REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,2,0.0,MUSD/yr REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,3,0.0,MUSD/yr diff --git a/tests/examples/FIXME_example1_outputunits.out b/tests/examples/FIXME_example1_outputunits.out deleted file mode 100644 index 7df4de12..00000000 --- a/tests/examples/FIXME_example1_outputunits.out +++ /dev/null @@ -1,201 +0,0 @@ - ***************** - ***CASE REPORT*** - ***************** - -Simulation Metadata ----------------------- - GEOPHIRES Version: 3.0 - Simulation Date: 2023-09-29 - Simulation Time: 21:03 - Calculation Time: 13.691 sec - - ***SUMMARY OF RESULTS*** - - End-Use Option: Electricity - Average Net Electricity Production: 5.39 MW - Electricity breakeven price: 9.33 cents/kWh - Number of production wells: 2 - Number of injection wells: 2 - Flowrate per production well: 55.0 kg/sec - Well depth (or total length, if not vertical): 3.0 kilometer - Geothermal gradient: 0.0500 degC/m - - - ***ECONOMIC PARAMETERS*** - - Economic Model = Fixed Charge Rate (FCR) - Fixed Charge Rate (FCR): 5.00 - Accrued financing during construction: 0.00 - Project lifetime: 30 yr - Capacity factor: 90.0 % - Project NPV: -38.67 MUSD - Project IRR: -0.03 % - Project VIR=PI=PIR: 0.25 - Project MOIC: -0.25 - - ***ENGINEERING PARAMETERS*** - - Number of Production Wells: 2 - Number of Injection Wells: 2 - Well depth (or total length, if not vertical): 3.0 kilometer - Water loss rate: 2.0 - Pump efficiency: 80.0 - Injection temperature: 50.0 degC - Production Wellbore heat transmission calculated with Ramey's model - Average production well temperature drop: 2.9 degC - Flowrate per production well: 55.0 kg/sec - Injection well casing ID: 7.000 in - Production well casing ID: 7.000 in - Number of times redrilling: 0 - Power plant type: Supercritical ORC - - - ***RESOURCE CHARACTERISTICS*** - - Maximum reservoir temperature: 400.0 degC - Number of segments: 1 - Geothermal gradient: 0.0500 degC/m - - - ***RESERVOIR PARAMETERS*** - - Reservoir Model = Multiple Parallel Fractures Model - Bottom-hole temperature: 338.00 degF - Fracture model = Square - Well separation: fracture height: 900.00 meter - Fracture area: 810000.00 m**2 - Reservoir volume: 1000000000 m**3 - Reservoir hydrostatic pressure: 29430.00 kPa - Plant outlet pressure: 1062.72 kPa - Production wellhead pressure: 1131.67 kPa - Productivity Index: 5.00 kg/sec/bar - Injectivity Index: 5.00 kg/sec/bar - Reservoir density: 2700.00 kg/m**3 - Reservoir thermal conductivity: 2.70 W/m/K - Reservoir heat capacity: 1000.00 J/kg/K - - - ***RESERVOIR SIMULATION RESULTS*** - - Maximum Production Temperature: 167.3 degC - Average Production Temperature: 167.1 degC - Minimum Production Temperature: 165.4 degC - Initial Production Temperature: 165.4 degC - Average Reservoir Heat Extraction: 54.38 MW - Production Wellbore Heat Transmission Model = Ramey Model - Average Production Well Temperature Drop: 2.9 degC - Average Injection Well Pump Pressure Drop: 185.4 kPa - Average Production Well Pump Pressure Drop: 1161.8 kPa - - - ***CAPITAL COSTS (M$)*** - - Drilling and completion costs: 21.95 MUSD - Drilling and completion costs per well: 5.49 MUSD - Stimulation costs: 3.02 MUSD - Surface power plant costs: 18.92 MUSD - Field gathering system costs: 2.31 MUSD - Total surface equipment costs: 21.23 MUSD - Exploration costs: 4.86 MEUR - Total capital costs: 51.52 MUSD - Annualized capital costs: 2.58 MUSD - - - ***OPERATING AND MAINTENANCE COSTS (M$/yr)*** - - Wellfield maintenance costs: 0.44 MUSD/yr - Power plant maintenance costs: 0.87 MUSD/yr - Water costs: 0.05 MEUR/yr - Total operating and maintenance costs: 1.37 MUSD/yr - - - ***SURFACE EQUIPMENT SIMULATION RESULTS*** - - Initial geofluid availability: 0.11 MW/(kg/s) - Maximum Total Electricity Generation: 5.62 MW - Average Total Electricity Generation: 5.59 MW - Minimum Total Electricity Generation: 5.43 MW - Initial Total Electricity Generation: 5.43 MW - Maximum Net Electricity Generation: 5.42 MW - Average Net Electricity Generation: 5.39 MW - Minimum Net Electricity Generation: 5.22 MW - Initial Net Electricity Generation: 5.22 MW - Average Annual Total Electricity Generation: 43.86 GWh - Average Annual Net Electricity Generation: 42.26 GWh - Initial pumping power/net installed power: 100.00 % - Average Pumping Power: 0.20 MW - - ****************************** - * POWER GENERATION PROFILE * - ****************************** - YEAR THERMAL GEOFLUID PUMP NET FIRST LAW - DRAWDOWN TEMPERATURE POWER POWER EFFICIENCY - (degC) (MW) (MW) (%) - 1 1.0000 165.41 0.2066 5.2226 9.7429 - 2 1.0056 166.33 0.2055 5.3142 9.8355 - 3 1.0071 166.59 0.2053 5.3407 9.8621 - 4 1.0080 166.73 0.2051 5.3545 9.8759 - 5 1.0085 166.82 0.2050 5.3636 9.8851 - 6 1.0089 166.89 0.2049 5.3703 9.8918 - 7 1.0093 166.94 0.2049 5.3757 9.8971 - 8 1.0095 166.98 0.2048 5.3800 9.9015 - 9 1.0097 167.02 0.2048 5.3837 9.9051 - 10 1.0099 167.05 0.2047 5.3868 9.9083 - 11 1.0101 167.08 0.2047 5.3896 9.9111 - 12 1.0102 167.10 0.2047 5.3921 9.9135 - 13 1.0104 167.13 0.2047 5.3943 9.9158 - 14 1.0105 167.15 0.2046 5.3963 9.9178 - 15 1.0106 167.16 0.2046 5.3982 9.9196 - 16 1.0107 167.18 0.2046 5.3999 9.9213 - 17 1.0108 167.20 0.2046 5.4014 9.9228 - 18 1.0109 167.21 0.2046 5.4029 9.9243 - 19 1.0110 167.22 0.2045 5.4042 9.9256 - 20 1.0110 167.24 0.2045 5.4055 9.9269 - 21 1.0111 167.25 0.2045 5.4067 9.9281 - 22 1.0112 167.26 0.2045 5.4078 9.9292 - 23 1.0112 167.27 0.2045 5.4089 9.9303 - 24 1.0113 167.28 0.2045 5.4099 9.9313 - 25 1.0114 167.29 0.2045 5.4108 9.9322 - 26 1.0114 167.30 0.2045 5.4117 9.9331 - 27 1.0115 167.31 0.2045 5.4126 9.9340 - 28 1.0115 167.32 0.2044 5.4134 9.9348 - 29 1.0116 167.32 0.2044 5.4142 9.9356 - 30 1.0116 167.33 0.2044 5.4149 9.9363 - - - *************************************************************** - * HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE * - *************************************************************** - YEAR ELECTRICITY HEAT RESERVOIR PERCENTAGE OF - PROVIDED EXTRACTED HEAT CONTENT TOTAL HEAT MINED - (GWh/year) (GWh/year) (10^15 J) (%) - 1 41.6 424.5 322.47 0.47 - 2 42.0 426.5 320.94 0.95 - 3 42.2 427.2 319.40 1.42 - 4 42.3 427.6 317.86 1.90 - 5 42.3 427.9 316.32 2.37 - 6 42.4 428.1 314.78 2.85 - 7 42.4 428.3 313.24 3.32 - 8 42.4 428.4 311.69 3.80 - 9 42.5 428.6 310.15 4.27 - 10 42.5 428.7 308.61 4.75 - 11 42.5 428.8 307.06 5.23 - 12 42.5 428.9 305.52 5.70 - 13 42.5 428.9 303.98 6.18 - 14 42.6 429.0 302.43 6.66 - 15 42.6 429.1 300.89 7.13 - 16 42.6 429.1 299.34 7.61 - 17 42.6 429.2 297.80 8.09 - 18 42.6 429.2 296.25 8.56 - 19 42.6 429.3 294.71 9.04 - 20 42.6 429.3 293.16 9.52 - 21 42.6 429.4 291.61 10.00 - 22 42.6 429.4 290.07 10.47 - 23 42.6 429.4 288.52 10.95 - 24 42.7 429.5 286.98 11.43 - 25 42.7 429.5 285.43 11.90 - 26 42.7 429.6 283.88 12.38 - 27 42.7 429.6 282.34 12.86 - 28 42.7 429.6 280.79 13.34 - 29 42.7 429.6 279.24 13.81 - 30 35.6 358.1 277.95 14.21 diff --git a/tests/examples/example11_AC.out b/tests/examples/example11_AC.out index c17c29c5..41b7fbf7 100644 --- a/tests/examples/example11_AC.out +++ b/tests/examples/example11_AC.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.29 - Simulation Date: 2024-05-15 - Simulation Time: 11:52 - Calculation Time: 0.106 sec + GEOPHIRES Version: 3.4.31 + Simulation Date: 2024-06-17 + Simulation Time: 06:45 + Calculation Time: 0.110 sec ***SUMMARY OF RESULTS*** @@ -211,32 +211,32 @@ Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Pr Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) ________________________________________________________________________________________________________________________________________________________________________________________ 1 0.00 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -29.74 0.00 | 0.00 0.00 0.00 | 0.00 -29.74 -29.74 - 2 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.41 3.00 | 0.00 0.00 0.00 | 0.58 2.41 -27.33 - 3 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.41 5.99 | 0.00 0.00 0.00 | 0.58 2.41 -24.91 - 4 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.41 8.99 | 0.00 0.00 0.00 | 0.58 2.41 -22.50 - 5 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.41 11.99 | 0.00 0.00 0.00 | 0.58 2.41 -20.08 - 6 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.41 14.98 | 0.00 0.00 0.00 | 0.58 2.41 -17.67 - 7 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.41 17.98 | 0.00 0.00 0.00 | 0.58 2.41 -15.26 - 8 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.41 20.97 | 0.00 0.00 0.00 | 0.58 2.41 -12.85 - 9 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.41 23.97 | 0.00 0.00 0.00 | 0.58 2.41 -10.44 - 10 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.41 26.96 | 0.00 0.00 0.00 | 0.58 2.41 -8.03 - 11 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.40 29.94 | 0.00 0.00 0.00 | 0.58 2.40 -5.63 - 12 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.39 32.92 | 0.00 0.00 0.00 | 0.58 2.39 -3.23 - 13 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.39 35.88 | 0.00 0.00 0.00 | 0.58 2.39 -0.85 - 14 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.37 38.84 | 0.00 0.00 0.00 | 0.58 2.37 1.53 - 15 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.36 41.79 | 0.00 0.00 0.00 | 0.58 2.36 3.89 - 16 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.35 44.72 | 0.00 0.00 0.00 | 0.58 2.35 6.24 - 17 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.33 47.64 | 0.00 0.00 0.00 | 0.58 2.33 8.57 - 18 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.32 50.54 | 0.00 0.00 0.00 | 0.58 2.32 10.89 - 19 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.30 53.42 | 0.00 0.00 0.00 | 0.58 2.30 13.19 - 20 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.28 56.29 | 0.00 0.00 0.00 | 0.58 2.28 15.48 - 21 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.26 59.14 | 0.00 0.00 0.00 | 0.58 2.26 17.74 - 22 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.25 61.96 | 0.00 0.00 0.00 | 0.58 2.25 19.99 - 23 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.23 64.77 | 0.00 0.00 0.00 | 0.58 2.23 22.21 - 24 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.21 67.56 | 0.00 0.00 0.00 | 0.58 2.21 24.42 - 25 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.19 70.33 | 0.00 0.00 0.00 | 0.58 2.19 26.60 - 26 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.16 73.08 | 0.00 0.00 0.00 | 0.58 2.16 28.77 - 27 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.14 75.80 | 0.00 0.00 0.00 | 0.58 2.14 30.91 - 28 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.12 78.51 | 0.00 0.00 0.00 | 0.58 2.12 33.03 - 29 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.10 81.20 | 0.00 0.00 0.00 | 0.58 2.10 35.14 - 30 5.50 0.00 0.00 | 6.55 0.00 0.00 | 6.55 2.08 83.86 | 0.00 0.00 0.00 | 0.58 2.08 37.22 + 2 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.41 3.00 | 0.00 0.00 0.00 | 0.58 2.41 -27.33 + 3 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.41 5.99 | 0.00 0.00 0.00 | 0.58 2.41 -24.91 + 4 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.41 8.99 | 0.00 0.00 0.00 | 0.58 2.41 -22.50 + 5 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.41 11.99 | 0.00 0.00 0.00 | 0.58 2.41 -20.08 + 6 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.41 14.98 | 0.00 0.00 0.00 | 0.58 2.41 -17.67 + 7 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.41 17.98 | 0.00 0.00 0.00 | 0.58 2.41 -15.26 + 8 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.41 20.97 | 0.00 0.00 0.00 | 0.58 2.41 -12.85 + 9 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.41 23.97 | 0.00 0.00 0.00 | 0.58 2.41 -10.44 + 10 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.41 26.96 | 0.00 0.00 0.00 | 0.58 2.41 -8.03 + 11 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.40 29.94 | 0.00 0.00 0.00 | 0.58 2.40 -5.63 + 12 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.39 32.92 | 0.00 0.00 0.00 | 0.58 2.39 -3.23 + 13 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.39 35.88 | 0.00 0.00 0.00 | 0.58 2.39 -0.85 + 14 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.37 38.84 | 0.00 0.00 0.00 | 0.58 2.37 1.53 + 15 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.36 41.79 | 0.00 0.00 0.00 | 0.58 2.36 3.89 + 16 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.35 44.72 | 0.00 0.00 0.00 | 0.58 2.35 6.24 + 17 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.33 47.64 | 0.00 0.00 0.00 | 0.58 2.33 8.57 + 18 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.32 50.54 | 0.00 0.00 0.00 | 0.58 2.32 10.89 + 19 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.30 53.42 | 0.00 0.00 0.00 | 0.58 2.30 13.19 + 20 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.28 56.29 | 0.00 0.00 0.00 | 0.58 2.28 15.48 + 21 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.26 59.14 | 0.00 0.00 0.00 | 0.58 2.26 17.74 + 22 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.25 61.96 | 0.00 0.00 0.00 | 0.58 2.25 19.99 + 23 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.23 64.77 | 0.00 0.00 0.00 | 0.58 2.23 22.21 + 24 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.21 67.56 | 0.00 0.00 0.00 | 0.58 2.21 24.42 + 25 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.19 70.33 | 0.00 0.00 0.00 | 0.58 2.19 26.60 + 26 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.16 73.08 | 0.00 0.00 0.00 | 0.58 2.16 28.77 + 27 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.14 75.80 | 0.00 0.00 0.00 | 0.58 2.14 30.91 + 28 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.12 78.51 | 0.00 0.00 0.00 | 0.58 2.12 33.03 + 29 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.10 81.20 | 0.00 0.00 0.00 | 0.58 2.10 35.14 + 30 5.50 0.00 0.00 | 2.50 0.00 0.00 | 6.55 2.08 83.86 | 0.00 0.00 0.00 | 0.58 2.08 37.22 diff --git a/tests/examples/example1_addons.out b/tests/examples/example1_addons.out index dfea0e0c..82928683 100644 --- a/tests/examples/example1_addons.out +++ b/tests/examples/example1_addons.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.29 - Simulation Date: 2024-05-15 - Simulation Time: 11:52 - Calculation Time: 0.632 sec + GEOPHIRES Version: 3.4.31 + Simulation Date: 2024-06-17 + Simulation Time: 06:45 + Calculation Time: 0.619 sec ***SUMMARY OF RESULTS*** @@ -211,35 +211,35 @@ Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Pr Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) ________________________________________________________________________________________________________________________________________________________________________________________ 1 0.00 -31.07 0.00 | 0.00 0.00 0.00 | 0.00 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -31.07 -31.07 - 2 9.00 5.07 3.74 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.01 0.51 0.51 | -0.82 5.07 -26.00 - 3 9.00 5.12 7.53 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.01 0.52 1.03 | -0.82 5.12 -20.88 - 4 9.00 5.13 11.33 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.01 0.52 1.55 | -0.82 5.13 -15.74 - 5 9.00 5.14 15.14 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.01 0.52 2.07 | -0.82 5.14 -10.60 - 6 9.00 5.15 18.95 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.01 0.52 2.59 | -0.82 5.15 -5.45 - 7 9.00 5.15 22.76 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.01 0.52 3.11 | -0.82 5.15 -0.30 - 8 10.20 6.02 27.09 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.03 0.87 3.98 | -0.82 6.02 5.72 - 9 11.40 6.88 31.94 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.04 1.22 5.20 | -0.82 6.88 12.60 - 10 12.60 7.74 37.29 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.04 1.57 6.77 | -0.82 7.74 20.34 - 11 13.80 8.60 43.16 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.06 1.92 8.69 | -0.82 8.60 28.94 - 12 15.00 9.47 49.54 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.07 2.27 10.95 | -0.82 9.47 38.41 - 13 15.00 9.82 55.93 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.07 2.62 13.57 | -0.82 9.82 48.22 - 14 15.00 10.17 62.31 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.09 2.97 16.54 | -0.82 10.17 58.40 - 15 15.00 10.52 68.70 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.32 19.86 | -0.82 10.52 68.92 - 16 15.00 10.70 75.10 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.49 23.35 | -0.82 10.70 79.62 - 17 15.00 10.71 81.49 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 26.85 | -0.82 10.71 90.33 - 18 15.00 10.71 87.89 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 30.34 | -0.82 10.71 101.04 - 19 15.00 10.71 94.28 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 33.84 | -0.82 10.71 111.75 - 20 15.00 10.71 100.68 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 37.34 | -0.82 10.71 122.46 - 21 15.00 10.72 107.08 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 40.84 | -0.82 10.72 133.18 - 22 15.00 10.72 113.48 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 44.34 | -0.82 10.72 143.89 - 23 15.00 10.72 119.89 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 47.84 | -0.82 10.72 154.61 - 24 15.00 10.72 126.29 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 51.34 | -0.82 10.72 165.34 - 25 15.00 10.72 132.70 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 54.84 | -0.82 10.72 176.06 - 26 15.00 10.73 139.10 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 58.34 | -0.82 10.73 186.78 - 27 15.00 10.73 145.51 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 61.85 | -0.82 10.73 197.51 - 28 15.00 10.73 151.92 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 65.35 | -0.82 10.73 208.24 - 29 15.00 10.73 158.33 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 68.85 | -0.82 10.73 218.97 - 30 15.00 10.73 164.74 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 72.36 | -0.82 10.73 229.70 + 2 9.00 5.07 3.74 | 1.23 0.00 0.00 | 2.50 0.00 0.00 | 0.01 0.51 0.51 | -0.82 5.07 -26.00 + 3 9.00 5.12 7.53 | 1.23 0.00 0.00 | 2.50 0.00 0.00 | 0.01 0.52 1.03 | -0.82 5.12 -20.88 + 4 9.00 5.13 11.33 | 1.23 0.00 0.00 | 2.50 0.00 0.00 | 0.01 0.52 1.55 | -0.82 5.13 -15.74 + 5 9.00 5.14 15.14 | 1.23 0.00 0.00 | 2.50 0.00 0.00 | 0.01 0.52 2.07 | -0.82 5.14 -10.60 + 6 9.00 5.15 18.95 | 1.23 0.00 0.00 | 2.50 0.00 0.00 | 0.01 0.52 2.59 | -0.82 5.15 -5.45 + 7 9.00 5.15 22.76 | 1.23 0.00 0.00 | 2.50 0.00 0.00 | 0.01 0.52 3.11 | -0.82 5.15 -0.30 + 8 10.20 6.02 27.09 | 1.23 0.00 0.00 | 2.50 0.00 0.00 | 0.03 0.87 3.98 | -0.82 6.02 5.72 + 9 11.40 6.88 31.94 | 1.23 0.00 0.00 | 2.50 0.00 0.00 | 0.04 1.22 5.20 | -0.82 6.88 12.60 + 10 12.60 7.74 37.29 | 2.23 0.00 0.00 | 2.50 0.00 0.00 | 0.04 1.57 6.77 | -0.82 7.74 20.34 + 11 13.80 8.60 43.16 | 3.23 0.00 0.00 | 2.50 0.00 0.00 | 0.06 1.92 8.69 | -0.82 8.60 28.94 + 12 15.00 9.47 49.54 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.07 2.27 10.95 | -0.82 9.47 38.41 + 13 15.00 9.82 55.93 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.07 2.62 13.57 | -0.82 9.82 48.22 + 14 15.00 10.17 62.31 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.09 2.97 16.54 | -0.82 10.17 58.40 + 15 15.00 10.52 68.70 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.32 19.86 | -0.82 10.52 68.92 + 16 15.00 10.70 75.10 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.49 23.35 | -0.82 10.70 79.62 + 17 15.00 10.71 81.49 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 26.85 | -0.82 10.71 90.33 + 18 15.00 10.71 87.89 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 30.34 | -0.82 10.71 101.04 + 19 15.00 10.71 94.28 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 33.84 | -0.82 10.71 111.75 + 20 15.00 10.71 100.68 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 37.34 | -0.82 10.71 122.46 + 21 15.00 10.72 107.08 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 40.84 | -0.82 10.72 133.18 + 22 15.00 10.72 113.48 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 44.34 | -0.82 10.72 143.89 + 23 15.00 10.72 119.89 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 47.84 | -0.82 10.72 154.61 + 24 15.00 10.72 126.29 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 51.34 | -0.82 10.72 165.34 + 25 15.00 10.72 132.70 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 54.84 | -0.82 10.72 176.06 + 26 15.00 10.73 139.10 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 58.34 | -0.82 10.73 186.78 + 27 15.00 10.73 145.51 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 61.85 | -0.82 10.73 197.51 + 28 15.00 10.73 151.92 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 65.35 | -0.82 10.73 208.24 + 29 15.00 10.73 158.33 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 68.85 | -0.82 10.73 218.97 + 30 15.00 10.73 164.74 | 3.59 0.00 0.00 | 2.50 0.00 0.00 | 0.10 3.50 72.36 | -0.82 10.73 229.70 diff --git a/tests/examples/example1_outputunits.out b/tests/examples/example1_outputunits.out new file mode 100644 index 00000000..2a9f67de --- /dev/null +++ b/tests/examples/example1_outputunits.out @@ -0,0 +1,241 @@ + ***************** + ***CASE REPORT*** + ***************** + +Simulation Metadata +---------------------- + GEOPHIRES Version: 3.4.31 + Simulation Date: 2024-06-13 + Simulation Time: 07:42 + Calculation Time: 0.621 sec + + ***SUMMARY OF RESULTS*** + + End-Use Option: Electricity + Average Net Electricity Production: 5.39 MW + Electricity breakeven price: 8.71 cents/kWh + Number of production wells: 2 + Number of injection wells: 2 + Flowrate per production well: 55.0 kg/sec + Well depth (or total length, if not vertical): 3.0 kilometer + Geothermal gradient: 0.0500 degC/m + + + ***ECONOMIC PARAMETERS*** + + Economic Model = Fixed Charge Rate (FCR) + Fixed Charge Rate (FCR): 5.00 + Accrued financing during construction: 0.00 + Project lifetime: 30 yr + Capacity factor: 90.0 % + Project NPV: -33.63 MUSD + Project IRR: -2.77 % + Project VIR=PI=PIR: 0.28 + Project MOIC: -0.20 + Project Payback Period: N/A + + ***ENGINEERING PARAMETERS*** + + Number of Production Wells: 2 + Number of Injection Wells: 2 + Well depth (or total length, if not vertical): 3.0 kilometer + Water loss rate: 2.0 + Pump efficiency: 80.0 + Injection temperature: 50.0 degC + Production Wellbore heat transmission calculated with Ramey's model + Average production well temperature drop: 3.0 degC + Flowrate per production well: 55.0 kg/sec + Injection well casing ID: 7.000 in + Production well casing ID: 7.000 in + Number of times redrilling: 0 + Power plant type: Supercritical ORC + + + ***RESOURCE CHARACTERISTICS*** + + Maximum reservoir temperature: 400.0 degC + Number of segments: 1 + Geothermal gradient: 0.0500 degC/m + + + ***RESERVOIR PARAMETERS*** + + Reservoir Model = Multiple Parallel Fractures Model + Bottom-hole temperature: 338.00 degF + Fracture model = Square + Well separation: fracture height: 900.00 meter + Fracture area: 810000.00 m**2 + Reservoir volume: 1000000000 m**3 + Reservoir hydrostatic pressure: 28841.05 kPa + Plant outlet pressure: 1067.94 kPa + Production wellhead pressure: 1136.89 kPa + Productivity Index: 5.00 kg/sec/bar + Injectivity Index: 5.00 kg/sec/bar + Reservoir density: 2700.00 kg/m**3 + Reservoir thermal conductivity: 2.70 W/m/K + Reservoir heat capacity: 1000.00 J/kg/K + + + ***RESERVOIR SIMULATION RESULTS*** + + Maximum Production Temperature: 167.3 degC + Average Production Temperature: 167.0 degC + Minimum Production Temperature: 165.3 degC + Initial Production Temperature: 165.3 degC + Average Reservoir Heat Extraction: 53.52 MW + Production Wellbore Heat Transmission Model = Ramey Model + Average Production Well Temperature Drop: 3.0 degC + Average Injection Well Pump Pressure Drop: 217.9 kPa + Average Production Well Pump Pressure Drop: 1112.0 kPa + + + ***CAPITAL COSTS (M$)*** + + Drilling and completion costs: 16.42 MUSD + Drilling and completion costs per well: 4.11 MUSD + Stimulation costs: 3.02 MUSD + Surface power plant costs: 20.80 MUSD + Field gathering system costs: 2.30 MUSD + Total surface equipment costs: 23.10 MUSD + Exploration costs: 4.31 MUSD + Total capital costs: 46.85 MUSD + Annualized capital costs: 2.34 MUSD + + + ***OPERATING AND MAINTENANCE COSTS (M$/yr)*** + + Wellfield maintenance costs: 0.38 MUSD/yr + Power plant maintenance costs: 0.90 MUSD/yr + Water costs: 0.06 MUSD/yr + Total operating and maintenance costs: 1.34 MUSD/yr + + + ***SURFACE EQUIPMENT SIMULATION RESULTS*** + + Initial geofluid availability: 0.11 MW/(kg/s) + Maximum Total Electricity Generation: 5.62 MW + Average Total Electricity Generation: 5.59 MW + Minimum Total Electricity Generation: 5.42 MW + Initial Total Electricity Generation: 5.42 MW + Maximum Net Electricity Generation: 5.42 MW + Average Net Electricity Generation: 5.39 MW + Minimum Net Electricity Generation: 5.22 MW + Initial Net Electricity Generation: 5.22 MW + Average Annual Total Electricity Generation: 43.83 GWh + Average Annual Net Electricity Generation: 42.28 GWh + Initial pumping power/net installed power: 3.82 % + Average Pumping Power: 0.20 MW + + ************************************************************ + * HEATING, COOLING AND/OR ELECTRICITY PRODUCTION PROFILE * + ************************************************************ + YEAR THERMAL GEOFLUID PUMP NET FIRST LAW + DRAWDOWN TEMPERATURE POWER POWER EFFICIENCY + (degC) (MW) (MW) (%) + 1 1.0000 165.34 0.1993 5.2230 9.9020 + 2 1.0056 166.27 0.1984 5.3158 9.9972 + 3 1.0073 166.54 0.1981 5.3426 10.0245 + 4 1.0081 166.68 0.1980 5.3566 10.0387 + 5 1.0087 166.77 0.1979 5.3658 10.0481 + 6 1.0091 166.84 0.1978 5.3727 10.0551 + 7 1.0094 166.89 0.1978 5.3781 10.0605 + 8 1.0097 166.94 0.1977 5.3825 10.0650 + 9 1.0099 166.97 0.1977 5.3862 10.0688 + 10 1.0101 167.01 0.1977 5.3894 10.0720 + 11 1.0102 167.03 0.1976 5.3922 10.0749 + 12 1.0104 167.06 0.1976 5.3947 10.0774 + 13 1.0105 167.08 0.1976 5.3970 10.0797 + 14 1.0107 167.10 0.1976 5.3990 10.0817 + 15 1.0108 167.12 0.1976 5.4009 10.0836 + 16 1.0109 167.14 0.1975 5.4026 10.0853 + 17 1.0110 167.15 0.1975 5.4042 10.0869 + 18 1.0111 167.17 0.1975 5.4056 10.0884 + 19 1.0111 167.18 0.1975 5.4070 10.0898 + 20 1.0112 167.19 0.1975 5.4083 10.0911 + 21 1.0113 167.21 0.1975 5.4095 10.0923 + 22 1.0114 167.22 0.1975 5.4106 10.0935 + 23 1.0114 167.23 0.1974 5.4117 10.0946 + 24 1.0115 167.24 0.1974 5.4127 10.0956 + 25 1.0115 167.25 0.1974 5.4137 10.0966 + 26 1.0116 167.26 0.1974 5.4146 10.0975 + 27 1.0116 167.27 0.1974 5.4155 10.0984 + 28 1.0117 167.27 0.1974 5.4163 10.0993 + 29 1.0117 167.28 0.1974 5.4171 10.1000 + 30 1.0118 167.29 0.1974 5.4179 10.1008 + + + ******************************************************************* + * ANNUAL HEATING, COOLING AND/OR ELECTRICITY PRODUCTION PROFILE * + ******************************************************************* + YEAR ELECTRICITY HEAT RESERVOIR PERCENTAGE OF + PROVIDED EXTRACTED HEAT CONTENT TOTAL HEAT MINED + (GWh/year) (GWh/year) (10^15 J) (%) + 1 41.6 417.7 322.50 0.46 + 2 42.0 419.8 320.99 0.93 + 3 42.2 420.5 319.47 1.40 + 4 42.3 420.9 317.96 1.87 + 5 42.3 421.1 316.44 2.33 + 6 42.4 421.4 314.92 2.80 + 7 42.4 421.5 313.41 3.27 + 8 42.5 421.7 311.89 3.74 + 9 42.5 421.8 310.37 4.21 + 10 42.5 421.9 308.85 4.68 + 11 42.5 422.0 307.33 5.14 + 12 42.5 422.1 305.81 5.61 + 13 42.6 422.2 304.29 6.08 + 14 42.6 422.2 302.77 6.55 + 15 42.6 422.3 301.25 7.02 + 16 42.6 422.4 299.73 7.49 + 17 42.6 422.4 298.21 7.96 + 18 42.6 422.5 296.69 8.43 + 19 42.6 422.5 295.17 8.90 + 20 42.6 422.6 293.65 9.37 + 21 42.7 422.6 292.13 9.84 + 22 42.7 422.6 290.60 10.31 + 23 42.7 422.7 289.08 10.78 + 24 42.7 422.7 287.56 11.25 + 25 42.7 422.8 286.04 11.72 + 26 42.7 422.8 284.52 12.19 + 27 42.7 422.8 282.99 12.66 + 28 42.7 422.8 281.47 13.13 + 29 42.7 422.9 279.95 13.60 + 30 35.6 352.4 278.68 13.99 + + + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.00 -46.85 0.00 | 0.00 0.00 0.00 | 0.00 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -46.85 -46.85 + 2 5.50 0.95 2.29 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 0.95 -45.91 + 3 5.50 0.97 4.60 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 0.97 -44.94 + 4 5.50 0.98 6.92 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 0.98 -43.96 + 5 5.50 0.98 9.24 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 0.98 -42.97 + 6 5.50 0.99 11.57 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 0.99 -41.99 + 7 5.50 0.99 13.90 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 0.99 -41.00 + 8 5.50 0.99 16.24 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 0.99 -40.00 + 9 5.50 0.99 18.57 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 0.99 -39.01 + 10 5.50 1.00 20.91 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.00 -38.01 + 11 5.50 1.00 23.24 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.00 -37.02 + 12 5.50 1.00 25.58 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.00 -36.02 + 13 5.50 1.00 27.92 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.00 -35.02 + 14 5.50 1.00 30.26 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.00 -34.02 + 15 5.50 1.00 32.61 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.00 -33.02 + 16 5.50 1.00 34.95 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.00 -32.02 + 17 5.50 1.00 37.29 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.00 -31.01 + 18 5.50 1.00 39.63 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.00 -30.01 + 19 5.50 1.00 41.98 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.00 -29.01 + 20 5.50 1.00 44.32 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.00 -28.00 + 21 5.50 1.00 46.67 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.00 -27.00 + 22 5.50 1.01 49.01 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.01 -25.99 + 23 5.50 1.01 51.36 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.01 -24.99 + 24 5.50 1.01 53.71 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.01 -23.98 + 25 5.50 1.01 56.06 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.01 -22.97 + 26 5.50 1.01 58.40 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.01 -21.97 + 27 5.50 1.01 60.75 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.01 -20.96 + 28 5.50 1.01 63.10 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.01 -19.95 + 29 5.50 1.01 65.45 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.01 -18.94 + 30 5.50 1.01 67.80 | 2.50 0.00 0.00 | 2.50 0.00 0.00 | 0.00 0.00 0.00 | 1.34 1.01 -17.93 diff --git a/tests/examples/FIXME_example1_outputunits.txt b/tests/examples/example1_outputunits.txt similarity index 91% rename from tests/examples/FIXME_example1_outputunits.txt rename to tests/examples/example1_outputunits.txt index 2884740a..ced2a023 100644 --- a/tests/examples/FIXME_example1_outputunits.txt +++ b/tests/examples/example1_outputunits.txt @@ -50,5 +50,7 @@ Time steps per year,6, ---[1/year] ***Output unit conversions you wish to make*** *************************** Units:Bottom-hole temperature, degF, ---[This is what I want the units to be for this output parameter -Units:Exploration cost,MEUR, ---[This is what I want the units to be for this output parameter -Units:O&M Make-up Water costs, MEUR/yr + +-- See https://github.com/NREL/GEOPHIRES-X/issues/236 re: currency conversions. +-- Units:Exploration cost,MEUR, ---[This is what I want the units to be for this output parameter +-- Units:O&M Make-up Water costs, MEUR/yr diff --git a/tests/examples/example_SHR-1.txt b/tests/examples/example_SHR-1.txt index d76ddd24..84676c7e 100644 --- a/tests/examples/example_SHR-1.txt +++ b/tests/examples/example_SHR-1.txt @@ -1,13 +1,5 @@ --- Superhot Rock (SHR) Example 1 ---- See relevant discussion regarding thermosiphoning: https://github.com/NREL/GEOPHIRES-X/issues/188?#issuecomment-2102937796 -Starting Electricity Sale Price, 0.06 -Ending Electricity Sale Price, 0.10 -Electricity Escalation Start Year, 1 -Electricity Escalation Rate Per Year, 0.012 -Annual License Etc, 0 -Flat License Etc, 0 -Tax Relief Per Year, 2.212 Reservoir Model, 1 Reservoir Depth, 7.5 Number of Segments, 1 @@ -46,3 +38,12 @@ Inflation Rate During Construction, 0 Time steps per year, 6 Maximum Temperature, 500 Well Drilling and Completion Capital Cost, 40 +Starting Electricity Sale Price, 0.06 +Ending Electricity Sale Price, 0.10 +Electricity Escalation Start Year, 1 +Electricity Escalation Rate Per Year, 0.012 +Annual License Etc, 0 +Flat License Etc, 0 +Tax Relief Per Year, 2.212 + +--- See relevant discussion regarding thermosiphoning: https://github.com/NREL/GEOPHIRES-X/issues/188?#issuecomment-2102937796 diff --git a/tests/examples/example_SHR-2.txt b/tests/examples/example_SHR-2.txt index c1a43362..5c4ea7b3 100644 --- a/tests/examples/example_SHR-2.txt +++ b/tests/examples/example_SHR-2.txt @@ -1,12 +1,5 @@ --- Superhot Rock (SHR) Example 2 -Starting Electricity Sale Price, 0.06 -Ending Electricity Sale Price, 0.10 -Electricity Escalation Start Year, 1 -Electricity Escalation Rate Per Year, 0.012 -Annual License Etc, 0 -Flat License Etc, 0 -Tax Relief Per Year, 2.212 Reservoir Model, 1 Reservoir Depth, 7.5 Number of Segments, 1 @@ -45,3 +38,10 @@ Fixed Charge Rate, .05 Inflation Rate During Construction, 0 Time steps per year, 6 Maximum Temperature, 500 +Starting Electricity Sale Price, 0.06 +Ending Electricity Sale Price, 0.10 +Electricity Escalation Start Year, 1 +Electricity Escalation Rate Per Year, 0.012 +Annual License Etc, 0 +Flat License Etc, 0 +Tax Relief Per Year, 2.212 diff --git a/tests/geophires-result_example-3.csv b/tests/geophires-result_example-3.csv index 1a3ac5dc..0d410760 100644 --- a/tests/geophires-result_example-3.csv +++ b/tests/geophires-result_example-3.csv @@ -78,6 +78,7 @@ SURFACE EQUIPMENT SIMULATION RESULTS,Initial Net Heat Production,,11.67,MW SURFACE EQUIPMENT SIMULATION RESULTS,Average Annual Heat Production,,87.2,GWh SURFACE EQUIPMENT SIMULATION RESULTS,Average Pumping Power,,0.18,MW SURFACE EQUIPMENT SIMULATION RESULTS,Initial pumping power/net installed power,,100.0,% +Simulation Metadata,GEOPHIRES Version,,3.0, POWER GENERATION PROFILE,THERMAL DRAWDOWN,0,1.0, POWER GENERATION PROFILE,THERMAL DRAWDOWN,1,1.0081, POWER GENERATION PROFILE,THERMAL DRAWDOWN,2,1.0097, diff --git a/tests/test_geophires_x.py b/tests/test_geophires_x.py index a3339c76..da0b6d26 100644 --- a/tests/test_geophires_x.py +++ b/tests/test_geophires_x.py @@ -174,9 +174,11 @@ def get_output_file_for_example(example_file: str): ) geophires_result: GeophiresXResult = client.get_geophires_result(input_params) del geophires_result.result['metadata'] + del geophires_result.result['Simulation Metadata'] expected_result: GeophiresXResult = GeophiresXResult(get_output_file_for_example(example_file_path)) del expected_result.result['metadata'] + del expected_result.result['Simulation Metadata'] try: self.assertDictEqual( @@ -364,3 +366,37 @@ def test_vapor_pressure_above_critical_temperature(self): result = GeophiresXClient().get_geophires_result(input_params) self.assertIsNotNone(result) self.assertIn('SUMMARY OF RESULTS', result.result) + + def test_heat_price(self): + def input_for_heat_prices(params) -> GeophiresInputParameters: + return GeophiresInputParameters( + from_file_path=self._get_test_file_path('examples/example1.txt'), params=params + ) + + result_escalating = GeophiresXClient().get_geophires_result( + input_for_heat_prices({'Starting Heat Sale Price': 0.015, 'Ending Heat Sale Price': 0.015}) + ) + self.assertIsNotNone(result_escalating) + cashflow_constant = result_escalating.result['REVENUE & CASHFLOW PROFILE'] + self.assertEqual(cashflow_constant[0][4], 'Heat Price (cents/kWh)') + + # First entry (index 1 - header is index 0) is hardcoded to zero per + # https://github.com/NREL/GEOPHIRES-X/blob/becec79cc7510a35f7a9cb01127dabc829720015/src/geophires_x/Economics.py#L2920-L2925 + # so start test at index 2. + for i in range(2, len(cashflow_constant[0])): + self.assertEqual(cashflow_constant[i][4], 1.5) + + result_escalating = GeophiresXClient().get_geophires_result( + input_for_heat_prices( + { + 'Starting Heat Sale Price': 0.015, + 'Ending Heat Sale Price': 0.030, + 'Heat Escalation Rate Per Year': 0.005, + 'Heat Escalation Start Year': 0, + } + ) + ) + cashflow_escalating = result_escalating.result['REVENUE & CASHFLOW PROFILE'] + + self.assertEqual(cashflow_escalating[2][4], 1.5) + self.assertEqual(cashflow_escalating[-1][4], 3.0) diff --git a/tests/test_geophires_x_client.py b/tests/test_geophires_x_client.py index fbbd02d2..15bfb99c 100644 --- a/tests/test_geophires_x_client.py +++ b/tests/test_geophires_x_client.py @@ -32,6 +32,9 @@ def test_geophires_x_result_1(self): assert result.result['SUMMARY OF RESULTS']['Direct-Use heat breakeven price']['unit'] == 'USD/MMBTU' assert result.result['SUMMARY OF RESULTS']['End-Use Option']['value'] == 'Direct-Use Heat' + assert 'GEOPHIRES Version' in result.result['Simulation Metadata'] + assert '3.' in result.result['Simulation Metadata']['GEOPHIRES Version']['value'] + def test_geophires_x_result_2(self): test_result_path = self._get_test_file_path('geophires-result_example-2.out') result = GeophiresXResult(test_result_path)