Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
54453a5
include indirect costs in vertical/lateral drilling cost sub-items (W…
softwareengineerprogrammer Sep 10, 2026
3e9d485
fix display name output issue in previous commit, regenerate select a…
softwareengineerprogrammer Sep 10, 2026
b1d7097
add coverage to test_non_vertical_section_cost
softwareengineerprogrammer Sep 10, 2026
8d05fca
update tooltip texts and regenerate schema
softwareengineerprogrammer Sep 10, 2026
c2eeaf3
Bump version: 3.16.2 → 3.17.0
softwareengineerprogrammer Sep 10, 2026
bdd4cf6
v3.17 CHANGELOG entry
softwareengineerprogrammer Sep 10, 2026
3963365
Merge pull request #181 from softwareengineerprogrammer/vertical-and-…
softwareengineerprogrammer Sep 10, 2026
c450ce8
update v3.17 CHANGELOG entry PR link
softwareengineerprogrammer Sep 10, 2026
6fae1b6
sort test_geophires_examples order alphabetically (except for SBT)
softwareengineerprogrammer Sep 11, 2026
7b2d30c
include standard newline after surface equipment simulation results h…
softwareengineerprogrammer Sep 12, 2026
f8effef
GHA py313 & py314
softwareengineerprogrammer Sep 12, 2026
89e63fb
GHA py313 & py314
softwareengineerprogrammer Sep 12, 2026
1ebd045
upload-pages-artifact@v5
softwareengineerprogrammer Sep 12, 2026
4a798c0
set enforce-pr-checklist permissions per CodeQL finding (https://gith…
softwareengineerprogrammer Sep 12, 2026
2872315
temporarily disable py314
softwareengineerprogrammer Sep 12, 2026
490eee1
Merge pull request #182 from softwareengineerprogrammer/gha_2026-09-12
softwareengineerprogrammer Sep 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .bumpversion.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 3.16.2
current_version = 3.17.0
commit = True
tag = True

Expand Down
2 changes: 1 addition & 1 deletion .cookiecutterrc
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ default_context:
sphinx_doctest: "no"
sphinx_theme: "sphinx-py3doc-enhanced-theme"
test_matrix_separate_coverage: "no"
version: 3.16.2
version: 3.17.0
version_manager: "bump2version"
website: "https://github.com/NREL"
year_from: "2023"
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/enforce-pr-checklist.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ on:
pull_request:
types: [opened, edited, synchronize]

permissions:
pull-requests: read

jobs:
verify-pr-checklist:
runs-on: ubuntu-latest
Expand Down
14 changes: 13 additions & 1 deletion .github/workflows/github-actions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,18 @@ jobs:
python_arch: 'x64'
tox_env: 'py312'
os: 'ubuntu-latest'
- name: 'py313 (ubuntu)'
python: '3.13'
toxpython: 'python3.13'
python_arch: 'x64'
tox_env: 'py313'
os: 'ubuntu-latest'
# - name: 'py314 (ubuntu)'
# python: '3.14'
# toxpython: 'python3.14'
# python_arch: 'x64'
# tox_env: 'py314'
# os: 'ubuntu-latest'
Comment on lines +83 to +88

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

py314 fails (https://github.com/softwareengineerprogrammer/GEOPHIRES/actions/runs/34702022162/job/103575354221), so commented it out and left as implicit TODO for now

# - name: 'pypy38 (ubuntu)'
# python: 'pypy-3.8'
# toxpython: 'pypy3.8'
Expand Down Expand Up @@ -201,7 +213,7 @@ jobs:
done

- name: upload artifact
uses: actions/upload-pages-artifact@v4
uses: actions/upload-pages-artifact@v5

- name: deploy to GitHub Pages
id: deployment
Expand Down
5 changes: 5 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ Changelog
GEOPHIRES v3 (2023-2026)
------------------------

3.17
^^^^

3.17: `Warn user if ORC is used with production temperature greater than 200 degrees C <https://github.com/NatLabRockies/GEOPHIRES-X/pull/517>`__; `Include indirect costs in vertical and lateral (non-vertical) section drilling costs <https://github.com/NatLabRockies/GEOPHIRES-X/pull/520>`__ | `release <https://github.com/NREL/GEOPHIRES-X/releases/tag/v3.17.0>`__

3.16
^^^^

Expand Down
4 changes: 2 additions & 2 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,9 @@ Free software: `MIT license <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.16.2.svg
.. |commits-since| image:: https://img.shields.io/github/commits-since/softwareengineerprogrammer/GEOPHIRES-X/v3.17.0.svg
:alt: Commits since latest release
:target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.16.2...main
:target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.17.0...main

.. |docs| image:: https://readthedocs.org/projects/GEOPHIRES-X/badge/?style=flat
:target: https://softwareengineerprogrammer.github.io/GEOPHIRES
Expand Down
2 changes: 1 addition & 1 deletion docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
year = '2025'
author = 'NREL'
copyright = f'{year}, {author}'
version = release = '3.16.2'
version = release = '3.17.0'

pygments_style = 'trac'
templates_path = ['./templates']
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def read(*names, **kwargs):

setup(
name='geophires-x',
version='3.16.2',
version='3.17.0',
license='MIT',
description='GEOPHIRES is a free and open-source geothermal techno-economic simulator.',
long_description='{}\n{}'.format(
Expand Down
33 changes: 29 additions & 4 deletions src/geophires_x/Economics.py
Original file line number Diff line number Diff line change
Expand Up @@ -2042,6 +2042,9 @@ def __init__(self, model: Model):
f'Provide {self.ccexplfixed.Name} to override the default correlation and set your own cost.'
)

wellfield_indirect_costs_default_note = (f'(default: '
f'{self.wellfield_indirect_capital_cost_percentage.DefaultValue}%)')

# noinspection SpellCheckingInspection
self.Cwell = self.OutputParameterDict[self.Cwell.Name] = OutputParameter(
Name="Wellfield cost",
Expand All @@ -2051,7 +2054,7 @@ def __init__(self, model: Model):
CurrentUnits=CurrencyUnit.MDOLLARS,
ToolTipText=f'Includes total drilling and completion cost of all injection and production wells and '
f'laterals, plus indirect costs '
f'(default: {self.wellfield_indirect_capital_cost_percentage.DefaultValue}%).'
f'{wellfield_indirect_costs_default_note}.'
)
self.drilling_and_completion_costs_per_well = self.OutputParameterDict[
self.drilling_and_completion_costs_per_well.Name] = OutputParameter(
Expand All @@ -2060,7 +2063,7 @@ def __init__(self, model: Model):
PreferredUnits=CurrencyUnit.MDOLLARS,
CurrentUnits=CurrencyUnit.MDOLLARS,
ToolTipText='Drilling and completion cost per well, including indirect costs '
f'(default: {self.wellfield_indirect_capital_cost_percentage.DefaultValue}%).'
f'{wellfield_indirect_costs_default_note}.'
)

# noinspection SpellCheckingInspection
Expand Down Expand Up @@ -2514,7 +2517,25 @@ def __init__(self, model: Model):
Name='Drilling and completion costs per non-vertical section',
UnitType=Units.CURRENCY,
PreferredUnits=CurrencyUnit.MDOLLARS,
CurrentUnits=CurrencyUnit.MDOLLARS
CurrentUnits=CurrencyUnit.MDOLLARS,
ToolTipText=f'Drilling and completion costs per non-vertical section (lateral), '
f'including indirect costs {wellfield_indirect_costs_default_note}.'
)
self.cost_per_vertical_production_well = self.OutputParameterDict[self.cost_per_vertical_production_well.Name] = OutputParameter(
Name="Drilling and completion costs per vertical production well",
UnitType=Units.CURRENCY,
PreferredUnits=CurrencyUnit.MDOLLARS,
CurrentUnits=CurrencyUnit.MDOLLARS,
ToolTipText=f'Drilling and completion costs per vertical production well section, '
f'including indirect costs {wellfield_indirect_costs_default_note}.'
)
self.cost_per_vertical_injection_well = self.OutputParameterDict[self.cost_per_vertical_injection_well.Name] = OutputParameter(
Name="Drilling and completion costs per vertical injection well",
UnitType=Units.CURRENCY,
PreferredUnits=CurrencyUnit.MDOLLARS,
CurrentUnits=CurrencyUnit.MDOLLARS,
ToolTipText=f'Drilling and completion costs per vertical production well section, '
f'including indirect costs {wellfield_indirect_costs_default_note}.'
)
self.cost_to_junction_section = self.OutputParameterDict[self.cost_to_junction_section.Name] = OutputParameter(
Name="Cost of the entire section of a well from bottom of vertical to junction with laterals",
Expand Down Expand Up @@ -4101,7 +4122,11 @@ def _calculate_derived_outputs(self, model: Model) -> None:
self.cost_per_lateral_section.value = (
self.cost_lateral_section.quantity().to(self.cost_per_lateral_section.CurrentUnits).magnitude
/ model.wellbores.numnonverticalsections.value
)
) * self._wellfield_indirect_cost_factor
self.cost_per_vertical_production_well.value = self.cost_one_production_well.quantity().to(
self.cost_per_vertical_production_well.CurrentUnits).magnitude * self._wellfield_indirect_cost_factor
self.cost_per_vertical_injection_well.value = self.cost_one_injection_well.quantity().to(
self.cost_per_vertical_injection_well.CurrentUnits).magnitude * self._wellfield_indirect_cost_factor

if hasattr(self, 'discountrate'):
self.real_discount_rate.value = self.discountrate.quantity().to(convertible_unit(
Expand Down
14 changes: 10 additions & 4 deletions src/geophires_x/Outputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -486,9 +486,15 @@ def PrintOutputs(self, model: Model):
f.write(f' {model.economics.Cwell.display_name}: {model.economics.Cwell.value:10.2f} {model.economics.Cwell.CurrentUnits.value}\n')

if econ.cost_lateral_section.value > 0.0:
f.write(f' Drilling and completion costs per vertical production well: {econ.cost_one_production_well.value:10.2f} {econ.cost_one_production_well.CurrentUnits.value}\n')
f.write(f' Drilling and completion costs per vertical injection well: {econ.cost_one_injection_well.value:10.2f} {econ.cost_one_injection_well.CurrentUnits.value}\n')
f.write(f' {econ.cost_per_lateral_section.Name}: {econ.cost_per_lateral_section.value:10.2f} {econ.cost_lateral_section.CurrentUnits.value}\n')
f.write(f' {econ.cost_per_vertical_production_well.display_name}: '
f'{econ.cost_per_vertical_production_well.value:10.2f} '
f'{econ.cost_per_vertical_production_well.CurrentUnits.value}\n')
f.write(f' {econ.cost_per_vertical_injection_well.display_name}: '
f'{econ.cost_per_vertical_injection_well.value:10.2f} '
f'{econ.cost_per_vertical_injection_well.CurrentUnits.value}\n')
f.write(f' {econ.cost_per_lateral_section.display_name}: '
f'{econ.cost_per_lateral_section.value:10.2f} '
f'{econ.cost_lateral_section.CurrentUnits.value}\n')
elif round(econ.cost_one_production_well.value, 4) != round(econ.cost_one_injection_well.value, 4) \
and model.economics.cost_one_injection_well.value != -1:
f.write(f' {econ.cost_one_production_well.display_name}: {econ.cost_one_production_well.value:10.2f} {econ.cost_one_production_well.CurrentUnits.value}\n')
Expand Down Expand Up @@ -633,7 +639,7 @@ def _render_additional_capital_cost_modifiers(additional_modifiers: list[tuple[P
else:
f.write(f' {econ.Coam.display_name}: {econ.Coam.value:10.2f} {econ.Coam.CurrentUnits.value}\n')

f.write('\n\n ***SURFACE EQUIPMENT SIMULATION RESULTS***\n')
f.write('\n\n ***SURFACE EQUIPMENT SIMULATION RESULTS***\n\n')

if model.surfaceplant.enduse_option.value.has_electricity_component:
sp = model.surfaceplant
Expand Down
2 changes: 1 addition & 1 deletion src/geophires_x/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = '3.16.2'
__version__ = '3.17.0'
14 changes: 11 additions & 3 deletions src/geophires_x_schema_generator/geophires-result.json
Original file line number Diff line number Diff line change
Expand Up @@ -435,11 +435,19 @@
"description": "Cost of One Injection Well",
"units": "MUSD"
},
"Drilling and completion costs per vertical production well": {},
"Drilling and completion costs per vertical injection well": {},
"Drilling and completion costs per vertical production well": {
"type": "number",
"description": "Drilling and completion costs per vertical production well section, including indirect costs (default: 5%).",
"units": "MUSD"
},
"Drilling and completion costs per vertical injection well": {
"type": "number",
"description": "Drilling and completion costs per vertical production well section, including indirect costs (default: 5%).",
"units": "MUSD"
},
"Drilling and completion costs per non-vertical section": {
"type": "number",
"description": "",
"description": "Drilling and completion costs per non-vertical section (lateral), including indirect costs (default: 5%).",
"units": "MUSD"
},
"Drilling and completion costs (for redrilling)": {},
Expand Down
16 changes: 8 additions & 8 deletions tests/examples/Fervo_Norbeck_Latimer_2023.out
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@

Simulation Metadata
----------------------
GEOPHIRES Version: 3.9.47
Simulation Date: 2025-07-31
Simulation Time: 08:57
Calculation Time: 0.475 sec
GEOPHIRES Version: 3.17.0
Simulation Date: 2026-09-12
Simulation Time: 07:18
Calculation Time: 0.536 sec

***SUMMARY OF RESULTS***

Expand Down Expand Up @@ -95,15 +95,15 @@ Simulation Metadata

***CAPITAL COSTS (M$)***

Exploration costs: 3.62 MUSD
Drilling and completion costs: 10.13 MUSD
Drilling and completion costs per vertical production well: 3.02 MUSD
Drilling and completion costs per vertical injection well: 3.02 MUSD
Drilling and completion costs per non-vertical section: 1.80 MUSD
Drilling and completion costs per vertical production well: 3.17 MUSD
Drilling and completion costs per vertical injection well: 3.17 MUSD
Drilling and completion costs per non-vertical section: 1.89 MUSD
Stimulation costs: 1.51 MUSD
Surface power plant costs: 11.34 MUSD
Field gathering system costs: 1.52 MUSD
Total surface equipment costs: 12.85 MUSD
Exploration costs: 3.62 MUSD
Total capital costs: 28.12 MUSD


Expand Down
15 changes: 8 additions & 7 deletions tests/examples/Fervo_Project_Red-2026.out
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@

Simulation Metadata
----------------------
GEOPHIRES Version: 3.13.3
Simulation Date: 2026-04-23
Simulation Time: 09:27
Calculation Time: 1.039 sec
GEOPHIRES Version: 3.17.0
Simulation Date: 2026-09-12
Simulation Time: 07:18
Calculation Time: 1.201 sec

***SUMMARY OF RESULTS***

Expand Down Expand Up @@ -102,9 +102,9 @@ Simulation Metadata

Exploration costs: 3.62 MUSD
Drilling and completion costs: 10.13 MUSD
Drilling and completion costs per vertical production well: 3.02 MUSD
Drilling and completion costs per vertical injection well: 3.02 MUSD
Drilling and completion costs per non-vertical section: 1.80 MUSD
Drilling and completion costs per vertical production well: 3.17 MUSD
Drilling and completion costs per vertical injection well: 3.17 MUSD
Drilling and completion costs per non-vertical section: 1.89 MUSD
Stimulation costs: 1.51 MUSD
Surface power plant costs: 10.49 MUSD
Field gathering system costs: 1.61 MUSD
Expand All @@ -123,6 +123,7 @@ Simulation Metadata


***SURFACE EQUIPMENT SIMULATION RESULTS***

Initial geofluid availability: 0.15 MW/(kg/s)
Maximum Total Electricity Generation: 2.75 MW
Average Total Electricity Generation: 2.69 MW
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@

Simulation Metadata
----------------------
GEOPHIRES Version: 3.9.7
Simulation Date: 2025-05-15
Simulation Time: 09:22
Calculation Time: 1.580 sec
GEOPHIRES Version: 3.17.0
Simulation Date: 2026-09-12
Simulation Time: 07:19
Calculation Time: 1.869 sec

***SUMMARY OF RESULTS***

Expand All @@ -24,7 +24,7 @@ Simulation Metadata
***ECONOMIC PARAMETERS***

Economic Model = BICYCLE
Accrued financing during construction: 0.00 %
Accrued financing during construction: 0.00 %
Project lifetime: 40 yr
Capacity factor: 90.0 %
Project NPV: -74.72 MUSD
Expand Down Expand Up @@ -74,15 +74,15 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t

***CAPITAL COSTS (M$)***

Exploration costs: 7.74 MUSD
Drilling and completion costs: 53.82 MUSD
Drilling and completion costs per vertical production well: 8.35 MUSD
Drilling and completion costs per vertical injection well: 8.35 MUSD
Drilling and completion costs per non-vertical section: 11.52 MUSD
Drilling and completion costs per vertical production well: 8.76 MUSD
Drilling and completion costs per vertical injection well: 8.76 MUSD
Drilling and completion costs per non-vertical section: 12.10 MUSD
Stimulation costs: 0.00 MUSD
Surface power plant costs: 6.74 MUSD
Field gathering system costs: 0.99 MUSD
Total surface equipment costs: 7.72 MUSD
Exploration costs: 7.74 MUSD
Total capital costs: 69.27 MUSD


Expand Down
15 changes: 8 additions & 7 deletions tests/examples/example_SAM-single-owner-PPA-3.out
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@

Simulation Metadata
----------------------
GEOPHIRES Version: 3.12.1
Simulation Date: 2026-04-05
Simulation Time: 07:35
Calculation Time: 1.219 sec
GEOPHIRES Version: 3.17.0
Simulation Date: 2026-09-12
Simulation Time: 07:17
Calculation Time: 1.247 sec

***SUMMARY OF RESULTS***

Expand Down Expand Up @@ -100,9 +100,9 @@ Simulation Metadata

Exploration costs: 3.89 MUSD
Drilling and completion costs: 49.18 MUSD
Drilling and completion costs per vertical production well: 3.37 MUSD
Drilling and completion costs per vertical injection well: 3.37 MUSD
Drilling and completion costs per non-vertical section: 2.14 MUSD
Drilling and completion costs per vertical production well: 3.54 MUSD
Drilling and completion costs per vertical injection well: 3.54 MUSD
Drilling and completion costs per non-vertical section: 2.24 MUSD
Stimulation costs: 9.06 MUSD
Surface power plant costs: 144.44 MUSD
Field gathering system costs: 5.80 MUSD
Expand All @@ -123,6 +123,7 @@ Simulation Metadata


***SURFACE EQUIPMENT SIMULATION RESULTS***

Initial geofluid availability: 0.19 MW/(kg/s)
Maximum Total Electricity Generation: 59.02 MW
Average Total Electricity Generation: 58.87 MW
Expand Down
Loading