diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 4cacd668c..86f5fc217 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 3.14.0 +current_version = 3.14.1 commit = True tag = True diff --git a/.cookiecutterrc b/.cookiecutterrc index a0a81af09..2ad8d90ae 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.14.0 + version: 3.14.1 version_manager: "bump2version" website: "https://github.com/NREL" year_from: "2023" diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 2355e955f..a7d180b42 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -8,7 +8,7 @@ GEOPHIRES v3 (2023-2026) 3.14 ^^^^ -3.14: `Well integrity parameterization to trigger redrilling; Drawdown Parameter Schedule; Input params CSV unit and comment parsing; State ITC Amount; SAM-EM Other Incentives and One-time Grants fix `__ | `release `__ | **Changed:** SAM Economic Models inputs with Other Incentives and One-time Grants Etc parameters now calculate Overnight Capital Cost and Total CAPEX correctly. See `the tracking issue `__ for details. +3.14: `Well integrity parameterization to trigger redrilling; Drawdown Parameter Schedule; Input params CSV unit and comment parsing; State ITC Amount; SAM-EM Other Incentives and One-time Grants fix; Stimulation costs per well outputs `__ | `release `__ | **Changed:** SAM Economic Models inputs with Other Incentives and One-time Grants Etc parameters now calculate Overnight Capital Cost and Total CAPEX correctly. See `the tracking issue `__ for details. 3.13 diff --git a/README.rst b/README.rst index 23ef84f00..a7f4ffe59 100644 --- a/README.rst +++ b/README.rst @@ -58,9 +58,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.14.0.svg +.. |commits-since| image:: https://img.shields.io/github/commits-since/softwareengineerprogrammer/GEOPHIRES-X/v3.14.1.svg :alt: Commits since latest release - :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.14.0...main + :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.14.1...main .. |docs| image:: https://readthedocs.org/projects/GEOPHIRES-X/badge/?style=flat :target: https://softwareengineerprogrammer.github.io/GEOPHIRES diff --git a/docs/_images/fervo_project_cape-5-sensitivity-analysis-irr.svg b/docs/_images/fervo_project_cape-5-sensitivity-analysis-irr.svg index 5a30939ec..61aa28188 100644 --- a/docs/_images/fervo_project_cape-5-sensitivity-analysis-irr.svg +++ b/docs/_images/fervo_project_cape-5-sensitivity-analysis-irr.svg @@ -6,7 +6,7 @@ - 2026-05-19T09:37:03.835790 + 2026-06-11T12:36:22.865944 image/svg+xml @@ -40,23 +40,23 @@ z +" clip-path="url(#pd4382b90d2)" style="fill: none; stroke-dasharray: 7.4,3.2; stroke-dashoffset: 0; stroke: #003c4d; stroke-width: 2"/> +" clip-path="url(#pd4382b90d2)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - - + @@ -116,11 +116,11 @@ z +" clip-path="url(#pd4382b90d2)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - + @@ -134,11 +134,11 @@ L 421.635935 97.55355 +" clip-path="url(#pd4382b90d2)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - + @@ -153,11 +153,11 @@ L 553.962493 97.55355 +" clip-path="url(#pd4382b90d2)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - + @@ -1528,17 +1528,17 @@ L 777.594375 97.55355 " style="fill: none; stroke: #aaaaaa; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - + +" clip-path="url(#pd4382b90d2)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1550,7 +1550,7 @@ z - + @@ -1657,7 +1657,7 @@ z - + @@ -1669,17 +1669,17 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1747,7 +1747,7 @@ z - + @@ -1758,17 +1758,17 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1779,7 +1779,7 @@ z - + @@ -1833,7 +1833,7 @@ z - + @@ -1845,17 +1845,17 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1867,7 +1867,7 @@ z - + @@ -1881,17 +1881,17 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1905,7 +1905,7 @@ z - + @@ -1973,7 +1973,7 @@ z - + @@ -1984,17 +1984,17 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2057,7 +2057,7 @@ z - + @@ -2072,17 +2072,17 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2097,7 +2097,7 @@ z - + @@ -2109,7 +2109,7 @@ z - + @@ -2121,27 +2121,27 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pd4382b90d2)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2159,7 +2159,7 @@ z - + @@ -2171,7 +2171,7 @@ z - + @@ -2183,17 +2183,17 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2209,7 +2209,7 @@ z - + @@ -2221,27 +2221,27 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pd4382b90d2)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2259,7 +2259,7 @@ z - + @@ -2271,7 +2271,7 @@ z - + @@ -2283,17 +2283,17 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2309,7 +2309,7 @@ z - + @@ -2321,27 +2321,27 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pd4382b90d2)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2369,7 +2369,7 @@ z - + @@ -2382,7 +2382,7 @@ z - + @@ -2393,17 +2393,17 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2447,7 +2447,7 @@ z - + @@ -2461,17 +2461,17 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2485,7 +2485,7 @@ z - + @@ -2498,7 +2498,7 @@ z - + @@ -2510,17 +2510,17 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2532,7 +2532,7 @@ z - + @@ -2542,17 +2542,17 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2562,7 +2562,7 @@ z - + @@ -2574,7 +2574,7 @@ z - + @@ -2586,24 +2586,24 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + - + @@ -2615,27 +2615,27 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pd4382b90d2)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2654,7 +2654,7 @@ z - + @@ -2666,13 +2666,13 @@ z - + +" clip-path="url(#pd4382b90d2)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> @@ -3052,7 +3052,7 @@ z - + diff --git a/docs/_images/fervo_project_cape-5-sensitivity-analysis-lcoe.svg b/docs/_images/fervo_project_cape-5-sensitivity-analysis-lcoe.svg index 4b4d7ae7a..9f4a2eb0a 100644 --- a/docs/_images/fervo_project_cape-5-sensitivity-analysis-lcoe.svg +++ b/docs/_images/fervo_project_cape-5-sensitivity-analysis-lcoe.svg @@ -6,7 +6,7 @@ - 2026-05-19T09:37:03.087645 + 2026-06-11T12:36:23.911616 image/svg+xml @@ -40,23 +40,23 @@ z +" clip-path="url(#pd65a94fc7a)" style="fill: none; stroke-dasharray: 7.4,3.2; stroke-dashoffset: 0; stroke: #003c4d; stroke-width: 2"/> +" clip-path="url(#pd65a94fc7a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - - + @@ -104,11 +104,11 @@ z +" clip-path="url(#pd65a94fc7a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - + @@ -139,11 +139,11 @@ z +" clip-path="url(#pd65a94fc7a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - + @@ -180,11 +180,11 @@ z +" clip-path="url(#pd65a94fc7a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - + @@ -198,11 +198,11 @@ L 534.621117 97.55355 +" clip-path="url(#pd65a94fc7a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - + @@ -216,11 +216,11 @@ L 636.390021 97.55355 +" clip-path="url(#pd65a94fc7a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - + @@ -1618,17 +1618,17 @@ L 777.594375 97.55355 " style="fill: none; stroke: #aaaaaa; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - + +" clip-path="url(#pd65a94fc7a)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1803,7 +1803,7 @@ z - + @@ -1814,17 +1814,17 @@ z - + +" clip-path="url(#pd65a94fc7a)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1833,7 +1833,7 @@ z - + @@ -1881,17 +1881,17 @@ z - + +" clip-path="url(#pd65a94fc7a)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1903,7 +1903,7 @@ z - + @@ -1982,7 +1982,7 @@ z - + @@ -1997,27 +1997,27 @@ z - + +" clip-path="url(#pd65a94fc7a)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pd65a94fc7a)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2029,7 +2029,7 @@ z - + @@ -2044,27 +2044,27 @@ z - + +" clip-path="url(#pd65a94fc7a)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pd65a94fc7a)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2077,7 +2077,7 @@ z - + @@ -2092,17 +2092,17 @@ z - + +" clip-path="url(#pd65a94fc7a)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2118,7 +2118,7 @@ z - + @@ -2133,27 +2133,27 @@ z - + +" clip-path="url(#pd65a94fc7a)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pd65a94fc7a)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2171,7 +2171,7 @@ z - + @@ -2187,7 +2187,7 @@ z - + @@ -2203,17 +2203,17 @@ z - + +" clip-path="url(#pd65a94fc7a)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2229,7 +2229,7 @@ z - + @@ -2244,27 +2244,27 @@ z - + +" clip-path="url(#pd65a94fc7a)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pd65a94fc7a)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2282,7 +2282,7 @@ z - + @@ -2325,7 +2325,7 @@ z - + @@ -2341,27 +2341,27 @@ z - + +" clip-path="url(#pd65a94fc7a)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pd65a94fc7a)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2409,7 +2409,7 @@ z - + @@ -2438,17 +2438,17 @@ z - + +" clip-path="url(#pd65a94fc7a)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2462,7 +2462,7 @@ z - + @@ -2519,7 +2519,7 @@ z - + @@ -2534,17 +2534,17 @@ z - + +" clip-path="url(#pd65a94fc7a)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2557,7 +2557,7 @@ z - + @@ -2607,7 +2607,7 @@ z - + @@ -2623,24 +2623,24 @@ z - + +" clip-path="url(#pd65a94fc7a)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + - + @@ -2655,17 +2655,17 @@ z - + +" clip-path="url(#pd65a94fc7a)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2681,7 +2681,7 @@ z - + @@ -2691,17 +2691,17 @@ z - + +" clip-path="url(#pd65a94fc7a)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2711,7 +2711,7 @@ z - + @@ -2727,7 +2727,7 @@ z - + @@ -2743,37 +2743,37 @@ z - + +" clip-path="url(#pd65a94fc7a)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pd65a94fc7a)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pd65a94fc7a)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2793,7 +2793,7 @@ z - + @@ -3248,7 +3248,7 @@ z - + diff --git a/docs/_images/fervo_project_cape-5-sensitivity-analysis-project_npv.svg b/docs/_images/fervo_project_cape-5-sensitivity-analysis-project_npv.svg index 55be1c6fa..f20f89eae 100644 --- a/docs/_images/fervo_project_cape-5-sensitivity-analysis-project_npv.svg +++ b/docs/_images/fervo_project_cape-5-sensitivity-analysis-project_npv.svg @@ -6,7 +6,7 @@ - 2026-05-19T09:37:06.287103 + 2026-06-11T12:36:22.867731 image/svg+xml @@ -40,23 +40,23 @@ z +" clip-path="url(#p70ea259c4c)" style="fill: none; stroke-dasharray: 7.4,3.2; stroke-dashoffset: 0; stroke: #003c4d; stroke-width: 2"/> +" clip-path="url(#p70ea259c4c)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - - + @@ -122,11 +122,11 @@ z +" clip-path="url(#p70ea259c4c)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - + @@ -169,11 +169,11 @@ z +" clip-path="url(#p70ea259c4c)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - + @@ -187,11 +187,11 @@ L 478.476269 97.55355 +" clip-path="url(#p70ea259c4c)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - + @@ -207,11 +207,11 @@ L 595.65686 97.55355 +" clip-path="url(#p70ea259c4c)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - + @@ -1620,17 +1620,17 @@ L 777.594375 97.55355 " style="fill: none; stroke: #aaaaaa; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - + +" clip-path="url(#p70ea259c4c)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1642,7 +1642,7 @@ z - + @@ -1838,7 +1838,7 @@ z - + @@ -1860,17 +1860,17 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1934,7 +1934,7 @@ z - + @@ -1945,17 +1945,17 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1966,7 +1966,7 @@ z - + @@ -2002,7 +2002,7 @@ z - + @@ -2016,17 +2016,17 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2041,7 +2041,7 @@ z - + @@ -2055,17 +2055,17 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2077,7 +2077,7 @@ z - + @@ -2092,17 +2092,17 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2149,7 +2149,7 @@ z - + @@ -2164,17 +2164,17 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2189,7 +2189,7 @@ z - + @@ -2238,7 +2238,7 @@ z - + @@ -2252,27 +2252,27 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p70ea259c4c)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2290,7 +2290,7 @@ z - + @@ -2332,7 +2332,7 @@ z - + @@ -2346,17 +2346,17 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2372,7 +2372,7 @@ z - + @@ -2386,27 +2386,27 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p70ea259c4c)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2424,7 +2424,7 @@ z - + @@ -2439,7 +2439,7 @@ z - + @@ -2453,17 +2453,17 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2479,7 +2479,7 @@ z - + @@ -2493,27 +2493,27 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p70ea259c4c)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2541,7 +2541,7 @@ z - + @@ -2556,7 +2556,7 @@ z - + @@ -2571,17 +2571,17 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2596,7 +2596,7 @@ z - + @@ -2610,17 +2610,17 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2634,7 +2634,7 @@ z - + @@ -2649,7 +2649,7 @@ z - + @@ -2663,17 +2663,17 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2688,7 +2688,7 @@ z - + @@ -2698,17 +2698,17 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2716,7 +2716,7 @@ z - + @@ -2730,24 +2730,24 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + - + @@ -2761,27 +2761,27 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p70ea259c4c)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2800,7 +2800,7 @@ z - + @@ -2814,17 +2814,17 @@ z - + +" clip-path="url(#p70ea259c4c)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2844,7 +2844,7 @@ z - + @@ -3367,7 +3367,7 @@ z - + diff --git a/docs/_images/singh_et_al_base_simulation-production-temperature.png b/docs/_images/singh_et_al_base_simulation-production-temperature.png index 4cd7c51fb..92368c742 100644 Binary files a/docs/_images/singh_et_al_base_simulation-production-temperature.png and b/docs/_images/singh_et_al_base_simulation-production-temperature.png differ diff --git a/docs/conf.py b/docs/conf.py index 3f145048c..67e0874a9 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,7 +18,7 @@ year = '2025' author = 'NREL' copyright = f'{year}, {author}' -version = release = '3.14.0' +version = release = '3.14.1' pygments_style = 'trac' templates_path = ['./templates'] diff --git a/setup.py b/setup.py index 809e2a79d..5f5459147 100755 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ def read(*names, **kwargs): setup( name='geophires-x', - version='3.14.0', + version='3.14.1', license='MIT', description='GEOPHIRES is a free and open-source geothermal techno-economic simulator.', long_description='{}\n{}'.format( diff --git a/src/geophires_x/Economics.py b/src/geophires_x/Economics.py index 372245b23..f878891a4 100644 --- a/src/geophires_x/Economics.py +++ b/src/geophires_x/Economics.py @@ -1972,6 +1972,34 @@ def __init__(self, model: Model): f'total stimulation cost. ' f'For traditional hydrothermal reservoirs, {self.ccstimfixed.Name} should be set to $0.' ) + # noinspection SpellCheckingInspection + self.cstim_per_well = self.OutputParameterDict[self.cstim_per_well.Name] = OutputParameter( + Name='Stimulation costs per well', + value=None, + UnitType=Units.CURRENCY, + PreferredUnits=CurrencyUnit.MDOLLARS, + CurrentUnits=CurrencyUnit.MDOLLARS, + ToolTipText='Stimulation cost per well, including direct and indirect costs and contingency.' + ) + # noinspection SpellCheckingInspection + self.cstim_per_production_well = self.OutputParameterDict[self.cstim_per_production_well.Name] = OutputParameter( + Name='Stimulation costs per production well', + value=None, + UnitType=Units.CURRENCY, + PreferredUnits=CurrencyUnit.MDOLLARS, + CurrentUnits=CurrencyUnit.MDOLLARS, + ToolTipText='Stimulation cost per producton well, including direct and indirect costs and contingency.' + ) + # noinspection SpellCheckingInspection + self.cstim_per_injection_well = self.OutputParameterDict[self.cstim_per_injection_well.Name] = OutputParameter( + Name='Stimulation costs per injection well', + value=None, + UnitType=Units.CURRENCY, + PreferredUnits=CurrencyUnit.MDOLLARS, + CurrentUnits=CurrencyUnit.MDOLLARS, + ToolTipText='Stimulation cost per injection well, including direct and indirect costs and contingency.' + ) + # TODO switch order to align with theoretical basis, which lists indirect costs first contingency_and_indirect_costs_tooltip_stem = ( @@ -2446,15 +2474,19 @@ def __init__(self, model: Model): self.RITCValue = self.OutputParameterDict[self.RITCValue.Name] = investment_tax_credit_output_parameter() self.cost_one_production_well = self.OutputParameterDict[self.cost_one_production_well.Name] = OutputParameter( Name="Cost of One Production Well", + display_name='Drilling and completion costs per production well', UnitType=Units.CURRENCY, PreferredUnits=CurrencyUnit.MDOLLARS, - CurrentUnits=CurrencyUnit.MDOLLARS + CurrentUnits=CurrencyUnit.MDOLLARS, + ToolTipText='Drilling and completion costs per vertical production well' ) self.cost_one_injection_well = self.OutputParameterDict[self.cost_one_injection_well.Name] = OutputParameter( Name="Cost of One Injection Well", + display_name='Drilling and completion costs per injection well', UnitType=Units.CURRENCY, PreferredUnits=CurrencyUnit.MDOLLARS, - CurrentUnits=CurrencyUnit.MDOLLARS + CurrentUnits=CurrencyUnit.MDOLLARS, + ToolTipText='Drilling and completion costs per vertical injection well' ) self.cost_lateral_section = self.OutputParameterDict[self.cost_lateral_section.Name] = OutputParameter( Name="Cost of the entire (multi-) lateral section of a well", @@ -3047,25 +3079,76 @@ def calculate_wellfield_costs(self, model: Model) -> None: ) def calculate_stimulation_costs(self, model: Model) -> PlainQuantity: + production_wells_stimulated: bool = self.stimulation_cost_per_production_well.Provided if self.ccstimfixed.Valid: - stimulation_costs = self.ccstimfixed.quantity().to(self.Cstim.CurrentUnits).magnitude + stimulation_costs_cstim_u = self.ccstimfixed.quantity().to(self.Cstim.CurrentUnits).magnitude + + # Ideally we'd infer per-well costs per the below logic, but this doesn't necessarily + # cleanly map to legacy parameterizations that may have implicitly assumed that stimulation costs include + # both production and injection wells, even though the default behavior is and always has been only + # injection wells are stimulated. Production wells are only assumed to be stimulated when + # Reservoir Stimulation Capital Cost per Production Well is provided, which was added in v3.9.32. + + # num_stimulated_wells = model.wellbores.ninj.value + # if production_wells_stimulated: + # num_stimulated_wells += model.wellbores.nprod.value + # + # self.cstim_per_well.value = ( + # self.ccstimfixed.quantity() / num_stimulated_wells + # ).to(self.cstim_per_well.CurrentUnits).magnitude + # else: + # self.cstim_per_injection_well.value = ( + # self.ccstimfixed.quantity() / num_stimulated_wells + # ).to(self.cstim_per_injection_well.CurrentUnits).magnitude + + ret = quantity(stimulation_costs_cstim_u, self.Cstim.CurrentUnits) else: - stim_cost_per_injection_well = self.stimulation_cost_per_injection_well.quantity().to( + direct_stim_cost_per_injection_well_cstim_u = self.stimulation_cost_per_injection_well.quantity().to( self.Cstim.CurrentUnits).magnitude - stim_cost_per_production_well = self.stimulation_cost_per_production_well.quantity().to( + direct_stim_cost_per_production_well_cstim_u = self.stimulation_cost_per_production_well.quantity().to( self.Cstim.CurrentUnits).magnitude - stimulation_costs = ( - ( - stim_cost_per_injection_well * model.wellbores.ninj.value - + stim_cost_per_production_well * model.wellbores.nprod.value - ) - * self.ccstimadjfactor.value - * self._stimulation_indirect_cost_factor - * self._contingency_factor + def _total_cost_per_well(direct_cost_per_well) -> float: + return (direct_cost_per_well * self.ccstimadjfactor.value * self._stimulation_indirect_cost_factor + * self._contingency_factor) + + total_stim_cost_per_injection_well_cstim_u = _total_cost_per_well( + direct_stim_cost_per_injection_well_cstim_u) + total_stim_cost_per_production_well_cstim_u = _total_cost_per_well( + direct_stim_cost_per_production_well_cstim_u) + + stimulation_costs_cstim_u = ( + total_stim_cost_per_injection_well_cstim_u * model.wellbores.ninj.value + + total_stim_cost_per_production_well_cstim_u * model.wellbores.nprod.value ) - return quantity(stimulation_costs, self.Cstim.CurrentUnits) + ret = quantity(stimulation_costs_cstim_u, self.Cstim.CurrentUnits) + + if self.stimulation_cost_per_injection_well.Provided or self.stimulation_cost_per_production_well.Provided: + self.cstim_per_injection_well.value = quantity( + total_stim_cost_per_injection_well_cstim_u, self.Cstim.CurrentUnits).to( + self.cstim_per_injection_well.CurrentUnits).magnitude + + if production_wells_stimulated: + self.cstim_per_production_well.value = quantity( + total_stim_cost_per_production_well_cstim_u, self.Cstim.CurrentUnits).to( + self.cstim_per_production_well.CurrentUnits).magnitude + else: + # Only injection wells are assumed to be stimulated unless production well cost param is provided, + # so keep this value as None instead of 0 + pass + + if total_stim_cost_per_injection_well_cstim_u == total_stim_cost_per_production_well_cstim_u: + self.cstim_per_well.value = ret.to( + self.cstim_per_well.CurrentUnits).magnitude / (model.wellbores.ninj.value + model.wellbores.nprod.value) + else: + pass # Leave cstim_per_well value = None + else: + # Ideally we'd infer per-well costs per the above logic; see relevant comment above re: legacy + # parameterizations. + pass + + return ret def calculate_field_gathering_costs(self, model: Model) -> None: if self.ccgathfixed.Valid: diff --git a/src/geophires_x/Outputs.py b/src/geophires_x/Outputs.py index da8934884..12d48bed0 100644 --- a/src/geophires_x/Outputs.py +++ b/src/geophires_x/Outputs.py @@ -485,18 +485,18 @@ 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 + NL) - 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 + NL) + 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') 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' Drilling and completion costs per production well: {econ.cost_one_production_well.value:10.2f} ' + econ.cost_one_production_well.CurrentUnits.value + NL) - f.write(f' Drilling and completion costs per injection well: {econ.cost_one_injection_well.value:10.2f} ' + econ.cost_one_injection_well.CurrentUnits.value + NL) + 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') + f.write(f' {econ.cost_one_injection_well.display_name}: {econ.cost_one_injection_well.value:10.2f} {econ.cost_one_injection_well.CurrentUnits.value}\n') else: cpw_label = Outputs._field_label(econ.drilling_and_completion_costs_per_well.display_name, 47) f.write(f' {cpw_label}{econ.drilling_and_completion_costs_per_well.value:10.2f} {econ.Cwell.CurrentUnits.value}\n') - f.write(f' {econ.Cstim.display_name}: {econ.Cstim.value:10.2f} {econ.Cstim.CurrentUnits.value}\n') + self.write_stimulation_costs_outputs(econ, f) f.write(f' {econ.Cplant.display_name}: {econ.Cplant.value:10.2f} {econ.Cplant.CurrentUnits.value}\n') if model.surfaceplant.enduse_option.value.is_cogeneration_end_use_option: @@ -962,6 +962,35 @@ def o(output_param: OutputParameter): f'{ii:3.0f} {o(econ.ElecPrice).value[ii]:5.2f} {o(econ.ElecRevenue).value[ii]:5.2f} {o(econ.ElecCummRevenue).value[ii]:5.2f} | {o(econ.HeatPrice).value[ii]:5.2f} {o(econ.HeatRevenue).value[ii]:5.2f} {o(econ.HeatCummRevenue).value[ii]:5.2f} | {o(econ.CoolingPrice).value[ii]:5.2f} {o(econ.CoolingRevenue).value[ii]:5.2f} {o(econ.CoolingCummRevenue).value[ii]:5.2f} | {o(econ.CarbonPrice).value[ii]:5.2f} {o(econ.CarbonRevenue).value[ii]:5.2f} {o(econ.CarbonCummCashFlow).value[ii]:5.2f} | {opex:5.2f} {o(econ.TotalRevenue).value[ii]:5.2f} {o(econ.TotalCummRevenue).value[ii]:5.2f}\n') f.write(NL) + # noinspection PyMethodMayBeStatic + def write_stimulation_costs_outputs(self, econ: Economics, f) -> None: + f.write( + f' ' + f'{econ.Cstim.display_name}: {econ.Cstim.value:10.2f}' + f' ' + f'{econ.Cstim.CurrentUnits.value}\n' + ) + + def _write_output(_stim_cost_per_well_output: OutputParameter) -> None: + if _stim_cost_per_well_output.value is not None: + scw_label = Outputs._field_label(_stim_cost_per_well_output.display_name, 43) + # noinspection PyStringConversionWithoutDunderMethod + f.write( + f' ' + f'{scw_label}{_stim_cost_per_well_output.value:10.2f}' + f' ' + f'{_stim_cost_per_well_output.CurrentUnits.value}\n' + ) + + if econ.cstim_per_well.value is not None: + _write_output(econ.cstim_per_well) + else: + for stim_cost_per_well_output in [ + econ.cstim_per_production_well, + econ.cstim_per_injection_well + ]: + _write_output(stim_cost_per_well_output) + # noinspection PyMethodMayBeStatic def get_sam_cash_flow_profile_output(self, model): ret = '\n' @@ -1006,6 +1035,8 @@ def _print_extended_economics_header(self, f_output_file: TextIOWrapper | None = if close_f: f_output_file.close() + + @staticmethod def _field_label(field_name: str, print_width_before_value: int) -> str: return f'{field_name}:{" " * (print_width_before_value - len(field_name) - 1)}' diff --git a/src/geophires_x/__init__.py b/src/geophires_x/__init__.py index 6e9b3ce48..7499b9d6d 100644 --- a/src/geophires_x/__init__.py +++ b/src/geophires_x/__init__.py @@ -1 +1 @@ -__version__ = '3.14.0' +__version__ = '3.14.1' diff --git a/src/geophires_x_client/geophires_x_result.py b/src/geophires_x_client/geophires_x_result.py index c2f6eb03d..a42796a63 100644 --- a/src/geophires_x_client/geophires_x_result.py +++ b/src/geophires_x_client/geophires_x_result.py @@ -262,6 +262,9 @@ class GeophiresXResult: 'Drilling and completion costs (for redrilling)', 'Drilling and completion costs per redrilled well', 'Stimulation costs', + 'Stimulation costs per well', + 'Stimulation costs per production well', + 'Stimulation costs per injection well', 'Stimulation costs (for redrilling)', 'Surface power plant costs', 'of which Electrical Plant Cost', diff --git a/src/geophires_x_schema_generator/geophires-result.json b/src/geophires_x_schema_generator/geophires-result.json index b28445ceb..bb47e4667 100644 --- a/src/geophires_x_schema_generator/geophires-result.json +++ b/src/geophires_x_schema_generator/geophires-result.json @@ -425,8 +425,16 @@ "description": "Drilling and completion cost per well, including indirect costs (default: 5%).", "units": "MUSD" }, - "Drilling and completion costs per production well": {}, - "Drilling and completion costs per injection well": {}, + "Drilling and completion costs per production well": { + "type": "number", + "description": "Cost of One Production Well. Drilling and completion costs per vertical production well", + "units": "MUSD" + }, + "Drilling and completion costs per injection well": { + "type": "number", + "description": "Cost of One Injection Well. Drilling and completion costs per vertical 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 non-vertical section": { @@ -441,6 +449,21 @@ "description": "Default correlation: $1.25M per injection well plus 15% contingency plus 5% indirect costs. Provide Reservoir Stimulation Capital Cost per Injection Well and Reservoir Stimulation Capital Cost per Production Well to set the correlation costs per well. Provide Reservoir Stimulation Capital Cost Adjustment Factor to multiply the correlation-calculated cost. Provide Reservoir Stimulation Capital Cost to override the correlation and set your own total stimulation cost. For traditional hydrothermal reservoirs, Reservoir Stimulation Capital Cost should be set to $0.", "units": "MUSD" }, + "Stimulation costs per well": { + "type": "object", + "description": "Stimulation cost per well, including direct and indirect costs and contingency.", + "units": "MUSD" + }, + "Stimulation costs per production well": { + "type": "object", + "description": "Stimulation cost per producton well, including direct and indirect costs and contingency.", + "units": "MUSD" + }, + "Stimulation costs per injection well": { + "type": "object", + "description": "Stimulation cost per injection well, including direct and indirect costs and contingency.", + "units": "MUSD" + }, "Stimulation costs (for redrilling)": {}, "Surface power plant costs": { "type": "number", @@ -486,8 +509,6 @@ "units": "MUSD" }, "One-time Flat License Fees Etc": {}, - "Other Incentives": {}, - "One-time Grants Etc": {}, "Total Add-on CAPEX": { "type": "number", "description": "AddOn CAPEX Total", @@ -513,6 +534,8 @@ "description": "Interest During Construction (IDC) is the total accumulated interest incurred on debt during the construction phase. This cost is capitalized (added to the loan principal and total installed cost) rather than paid in cash.", "units": "MUSD" }, + "Other Incentives": {}, + "One-time Grants Etc": {}, "Total capital costs": { "type": "number", "description": "Total Capital Cost", diff --git a/tests/examples/Fervo_Project_Cape-4.out b/tests/examples/Fervo_Project_Cape-4.out index ca6f68d4e..0fcda0c26 100644 --- a/tests/examples/Fervo_Project_Cape-4.out +++ b/tests/examples/Fervo_Project_Cape-4.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.12.1 - Simulation Date: 2026-04-01 - Simulation Time: 10:35 - Calculation Time: 1.765 sec + GEOPHIRES Version: 3.14.0 + Simulation Date: 2026-06-11 + Simulation Time: 12:32 + Calculation Time: 1.831 sec ***SUMMARY OF RESULTS*** @@ -102,6 +102,7 @@ Simulation Metadata Drilling and completion costs: 467.75 MUSD Drilling and completion costs per well: 3.96 MUSD Stimulation costs: 542.80 MUSD + Stimulation costs per well: 4.60 MUSD Surface power plant costs: 1504.05 MUSD Field gathering system costs: 56.44 MUSD Total surface equipment costs: 1560.49 MUSD diff --git a/tests/examples/Fervo_Project_Cape-5.out b/tests/examples/Fervo_Project_Cape-5.out index bc0817755..d487fe634 100644 --- a/tests/examples/Fervo_Project_Cape-5.out +++ b/tests/examples/Fervo_Project_Cape-5.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.13.7 - Simulation Date: 2026-05-19 - Simulation Time: 09:33 - Calculation Time: 1.809 sec + GEOPHIRES Version: 3.14.0 + Simulation Date: 2026-06-11 + Simulation Time: 12:32 + Calculation Time: 1.832 sec ***SUMMARY OF RESULTS*** @@ -113,6 +113,7 @@ Simulation Metadata Drilling and completion costs: 436.98 MUSD Drilling and completion costs per well: 4.65 MUSD Stimulation costs: 454.02 MUSD + Stimulation costs per well: 4.83 MUSD Surface power plant costs: 1467.78 MUSD Field gathering system costs: 48.33 MUSD Total surface equipment costs: 1516.11 MUSD diff --git a/tests/examples/Fervo_Project_Cape-6.out b/tests/examples/Fervo_Project_Cape-6.out index 96857e663..c35eb72b6 100644 --- a/tests/examples/Fervo_Project_Cape-6.out +++ b/tests/examples/Fervo_Project_Cape-6.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.13.7 - Simulation Date: 2026-05-19 - Simulation Time: 09:33 - Calculation Time: 1.837 sec + GEOPHIRES Version: 3.14.0 + Simulation Date: 2026-06-11 + Simulation Time: 12:36 + Calculation Time: 1.847 sec ***SUMMARY OF RESULTS*** @@ -113,6 +113,7 @@ Simulation Metadata Drilling and completion costs: 92.98 MUSD Drilling and completion costs per well: 4.65 MUSD Stimulation costs: 96.60 MUSD + Stimulation costs per well: 4.83 MUSD Surface power plant costs: 293.50 MUSD Field gathering system costs: 9.87 MUSD Total surface equipment costs: 303.37 MUSD diff --git a/tests/examples/example1.out b/tests/examples/example1.out index f898737c8..8ba184fd1 100644 --- a/tests/examples/example1.out +++ b/tests/examples/example1.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.9.28 - Simulation Date: 2025-07-02 - Simulation Time: 12:19 - Calculation Time: 0.885 sec + GEOPHIRES Version: 3.14.0 + Simulation Date: 2026-06-11 + Simulation Time: 09:49 + Calculation Time: 0.911 sec ***SUMMARY OF RESULTS*** @@ -25,7 +25,7 @@ Simulation Metadata Economic Model = Fixed Charge Rate (FCR) Fixed Charge Rate (FCR): 5.00 - Accrued financing during construction: 0.00 % + Accrued financing during construction: 0.00 % Project lifetime: 30 yr Capacity factor: 90.0 % Project NPV: -35.81 MUSD @@ -92,13 +92,13 @@ Simulation Metadata ***CAPITAL COSTS (M$)*** + Exploration costs: 4.49 MUSD Drilling and completion costs: 17.38 MUSD Drilling and completion costs per well: 4.35 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.49 MUSD Total capital costs: 47.99 MUSD Annualized capital costs: 2.40 MUSD @@ -112,7 +112,6 @@ Simulation Metadata ***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 diff --git a/tests/examples/example14_data-center.out b/tests/examples/example14_data-center.out index 0b9466b27..fc95c0a4e 100644 --- a/tests/examples/example14_data-center.out +++ b/tests/examples/example14_data-center.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.12.1 - Simulation Date: 2026-04-07 - Simulation Time: 11:05 - Calculation Time: 1.846 sec + GEOPHIRES Version: 3.14.0 + Simulation Date: 2026-06-11 + Simulation Time: 12:31 + Calculation Time: 1.974 sec ***SUMMARY OF RESULTS*** @@ -107,6 +107,7 @@ Simulation Metadata Drilling and completion costs: 1278.62 MUSD Drilling and completion costs per well: 5.61 MUSD Stimulation costs: 1514.98 MUSD + Stimulation costs per well: 6.64 MUSD Surface power plant costs: 4225.49 MUSD of which Electrical Plant Cost: 4076.84 MUSD of which Heat Plant Cost: 148.65 MUSD diff --git a/tests/examples/example_SAM-single-owner-PPA-5.out b/tests/examples/example_SAM-single-owner-PPA-5.out index 84ff98183..285c51e95 100644 --- a/tests/examples/example_SAM-single-owner-PPA-5.out +++ b/tests/examples/example_SAM-single-owner-PPA-5.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.12.1 - Simulation Date: 2026-04-01 - Simulation Time: 09:30 - Calculation Time: 1.806 sec + GEOPHIRES Version: 3.14.0 + Simulation Date: 2026-06-11 + Simulation Time: 12:36 + Calculation Time: 1.811 sec ***SUMMARY OF RESULTS*** @@ -103,6 +103,7 @@ Simulation Metadata Drilling and completion costs: 106.12 MUSD Drilling and completion costs per well: 3.54 MUSD Stimulation costs: 75.00 MUSD + Stimulation costs per well: 2.50 MUSD Surface power plant costs: 287.61 MUSD Field gathering system costs: 10.69 MUSD Total surface equipment costs: 298.30 MUSD diff --git a/tests/examples/example_SAM-single-owner-PPA-6_carbon-revenue.out b/tests/examples/example_SAM-single-owner-PPA-6_carbon-revenue.out index 1e5e8b1f2..3282092aa 100644 --- a/tests/examples/example_SAM-single-owner-PPA-6_carbon-revenue.out +++ b/tests/examples/example_SAM-single-owner-PPA-6_carbon-revenue.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.12.1 - Simulation Date: 2026-04-04 - Simulation Time: 08:59 - Calculation Time: 1.830 sec + GEOPHIRES Version: 3.14.0 + Simulation Date: 2026-06-11 + Simulation Time: 12:36 + Calculation Time: 1.820 sec ***SUMMARY OF RESULTS*** @@ -113,6 +113,7 @@ Simulation Metadata Drilling and completion costs: 46.49 MUSD Drilling and completion costs per well: 4.65 MUSD Stimulation costs: 48.30 MUSD + Stimulation costs per well: 4.83 MUSD Surface power plant costs: 146.74 MUSD Field gathering system costs: 3.20 MUSD Total surface equipment costs: 149.94 MUSD diff --git a/tests/examples/example_SAM-single-owner-PPA-7_chp.out b/tests/examples/example_SAM-single-owner-PPA-7_chp.out index 84d1090f8..fbb2fddbd 100644 --- a/tests/examples/example_SAM-single-owner-PPA-7_chp.out +++ b/tests/examples/example_SAM-single-owner-PPA-7_chp.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.12.1 - Simulation Date: 2026-04-07 - Simulation Time: 10:14 - Calculation Time: 1.793 sec + GEOPHIRES Version: 3.14.0 + Simulation Date: 2026-06-11 + Simulation Time: 12:32 + Calculation Time: 1.859 sec ***SUMMARY OF RESULTS*** @@ -115,6 +115,7 @@ Simulation Metadata Drilling and completion costs: 46.49 MUSD Drilling and completion costs per well: 4.65 MUSD Stimulation costs: 48.30 MUSD + Stimulation costs per well: 4.83 MUSD Surface power plant costs: 154.20 MUSD of which Electrical Plant Cost: 131.92 MUSD of which Heat Plant Cost: 22.28 MUSD diff --git a/tests/examples/example_SAM-single-owner-PPA-7b_chp-cc.out b/tests/examples/example_SAM-single-owner-PPA-7b_chp-cc.out index c82383ac2..7950b0912 100644 --- a/tests/examples/example_SAM-single-owner-PPA-7b_chp-cc.out +++ b/tests/examples/example_SAM-single-owner-PPA-7b_chp-cc.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.12.1 - Simulation Date: 2026-04-07 - Simulation Time: 10:14 - Calculation Time: 1.798 sec + GEOPHIRES Version: 3.14.0 + Simulation Date: 2026-06-11 + Simulation Time: 12:32 + Calculation Time: 1.837 sec ***SUMMARY OF RESULTS*** @@ -116,6 +116,7 @@ Simulation Metadata Drilling and completion costs: 46.49 MUSD Drilling and completion costs per well: 4.65 MUSD Stimulation costs: 48.30 MUSD + Stimulation costs per well: 4.83 MUSD Surface power plant costs: 154.20 MUSD of which Electrical Plant Cost: 131.92 MUSD of which Heat Plant Cost: 22.28 MUSD diff --git a/tests/examples/example_SAM-single-owner-PPA-7c.out b/tests/examples/example_SAM-single-owner-PPA-7c.out index 3dc666c85..0c0912e93 100644 --- a/tests/examples/example_SAM-single-owner-PPA-7c.out +++ b/tests/examples/example_SAM-single-owner-PPA-7c.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.12.1 - Simulation Date: 2026-04-07 - Simulation Time: 10:14 - Calculation Time: 1.800 sec + GEOPHIRES Version: 3.14.0 + Simulation Date: 2026-06-11 + Simulation Time: 12:32 + Calculation Time: 1.860 sec ***SUMMARY OF RESULTS*** @@ -116,6 +116,7 @@ Simulation Metadata Drilling and completion costs: 46.49 MUSD Drilling and completion costs per well: 4.65 MUSD Stimulation costs: 48.30 MUSD + Stimulation costs per well: 4.83 MUSD Surface power plant costs: 200.00 MUSD of which Electrical Plant Cost: 160.00 MUSD of which Heat Plant Cost: 40.00 MUSD diff --git a/tests/examples/example_SAM-single-owner-PPA-7d_chp-bottoming.out b/tests/examples/example_SAM-single-owner-PPA-7d_chp-bottoming.out index f9e2764f4..ace718dd3 100644 --- a/tests/examples/example_SAM-single-owner-PPA-7d_chp-bottoming.out +++ b/tests/examples/example_SAM-single-owner-PPA-7d_chp-bottoming.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.12.1 - Simulation Date: 2026-04-13 - Simulation Time: 08:15 - Calculation Time: 19.782 sec + GEOPHIRES Version: 3.14.0 + Simulation Date: 2026-06-11 + Simulation Time: 12:32 + Calculation Time: 1.834 sec ***SUMMARY OF RESULTS*** @@ -115,6 +115,7 @@ Simulation Metadata Drilling and completion costs: 46.49 MUSD Drilling and completion costs per well: 4.65 MUSD Stimulation costs: 48.30 MUSD + Stimulation costs per well: 4.83 MUSD Surface power plant costs: 93.68 MUSD of which Electrical Plant Cost: 50.77 MUSD of which Heat Plant Cost: 42.91 MUSD diff --git a/tests/examples/example_SAM-single-owner-PPA-7e_chp-parallel.out b/tests/examples/example_SAM-single-owner-PPA-7e_chp-parallel.out index de5fa9c1b..e496d0597 100644 --- a/tests/examples/example_SAM-single-owner-PPA-7e_chp-parallel.out +++ b/tests/examples/example_SAM-single-owner-PPA-7e_chp-parallel.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.12.1 - Simulation Date: 2026-04-13 - Simulation Time: 08:24 - Calculation Time: 1.854 sec + GEOPHIRES Version: 3.14.0 + Simulation Date: 2026-06-11 + Simulation Time: 12:32 + Calculation Time: 1.872 sec ***SUMMARY OF RESULTS*** @@ -115,6 +115,7 @@ Simulation Metadata Drilling and completion costs: 46.49 MUSD Drilling and completion costs per well: 4.65 MUSD Stimulation costs: 48.30 MUSD + Stimulation costs per well: 4.83 MUSD Surface power plant costs: 126.16 MUSD of which Electrical Plant Cost: 44.06 MUSD of which Heat Plant Cost: 82.10 MUSD diff --git a/tests/examples/example_SAM-single-owner-PPA-8_heat.out b/tests/examples/example_SAM-single-owner-PPA-8_heat.out index fa286c56c..5ed976dd8 100644 --- a/tests/examples/example_SAM-single-owner-PPA-8_heat.out +++ b/tests/examples/example_SAM-single-owner-PPA-8_heat.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.13.0 - Simulation Date: 2026-04-14 - Simulation Time: 10:07 - Calculation Time: 1.867 sec + GEOPHIRES Version: 3.14.0 + Simulation Date: 2026-06-11 + Simulation Time: 12:32 + Calculation Time: 1.863 sec ***SUMMARY OF RESULTS*** @@ -109,6 +109,7 @@ Simulation Metadata Drilling and completion costs: 46.49 MUSD Drilling and completion costs per well: 4.65 MUSD Stimulation costs: 48.30 MUSD + Stimulation costs per well: 4.83 MUSD Surface power plant costs: 118.47 MUSD Field gathering system costs: 3.20 MUSD Total surface equipment costs: 121.67 MUSD diff --git a/tests/examples/example_SAM-single-owner-PPA-9_cooling.out b/tests/examples/example_SAM-single-owner-PPA-9_cooling.out index bd3fc698c..1d3c37aad 100644 --- a/tests/examples/example_SAM-single-owner-PPA-9_cooling.out +++ b/tests/examples/example_SAM-single-owner-PPA-9_cooling.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.13.0 - Simulation Date: 2026-04-14 - Simulation Time: 10:07 - Calculation Time: 1.885 sec + GEOPHIRES Version: 3.14.0 + Simulation Date: 2026-06-11 + Simulation Time: 12:31 + Calculation Time: 1.886 sec ***SUMMARY OF RESULTS*** @@ -111,6 +111,7 @@ Simulation Metadata Drilling and completion costs: 46.49 MUSD Drilling and completion costs per well: 4.65 MUSD Stimulation costs: 48.30 MUSD + Stimulation costs per well: 4.83 MUSD Surface power plant costs: 122.21 MUSD of which Absorption Chiller Cost: 3.74 MUSD Field gathering system costs: 3.20 MUSD diff --git a/tests/examples/example_SHR-3.out b/tests/examples/example_SHR-3.out index 696964296..90f4fdd96 100644 --- a/tests/examples/example_SHR-3.out +++ b/tests/examples/example_SHR-3.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.13.7 - Simulation Date: 2026-05-18 - Simulation Time: 11:46 - Calculation Time: 1.659 sec + GEOPHIRES Version: 3.14.0 + Simulation Date: 2026-06-11 + Simulation Time: 12:32 + Calculation Time: 1.531 sec ***SUMMARY OF RESULTS*** @@ -103,6 +103,7 @@ Simulation Metadata Drilling and completion costs: 20.01 MUSD Drilling and completion costs per well: 6.67 MUSD Stimulation costs: 26.32 MUSD + Stimulation costs per well: 8.77 MUSD Surface power plant costs: 188.47 MUSD Field gathering system costs: 0.64 MUSD Total surface equipment costs: 189.11 MUSD diff --git a/tests/geophires_x_tests/test_economics_sam.py b/tests/geophires_x_tests/test_economics_sam.py index 11bdb5b15..8dbac61c8 100644 --- a/tests/geophires_x_tests/test_economics_sam.py +++ b/tests/geophires_x_tests/test_economics_sam.py @@ -1011,6 +1011,9 @@ def _assert_capex_line_items_sum_to_total(self, r: GeophiresXResult): 'Drilling and completion costs per vertical production well', 'Drilling and completion costs per vertical injection well', 'Drilling and completion costs per non-vertical section', + 'Stimulation costs per well', + 'Stimulation costs per production well', + 'Stimulation costs per injection well', ]: capex_line_item_sum += quantity(capex_line_item['value'], capex_line_item['unit']).to(total_capex_unit)