diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 5a6589af8..68e698111 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 3.11.15 +current_version = 3.11.17 commit = True tag = True diff --git a/.cookiecutterrc b/.cookiecutterrc index cdb8da3c3..ee51f30fa 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.11.15 + version: 3.11.17 version_manager: "bump2version" website: "https://github.com/NREL" year_from: "2023" diff --git a/README.rst b/README.rst index 622302ab4..b40c65c03 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.11.15.svg +.. |commits-since| image:: https://img.shields.io/github/commits-since/softwareengineerprogrammer/GEOPHIRES-X/v3.11.17.svg :alt: Commits since latest release - :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.11.15...main + :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.11.17...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 0a4c9b651..1de52409f 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-02-16T11:02:18.770776 + 2026-02-27T09:53:20.879903 image/svg+xml @@ -40,23 +40,23 @@ z +" clip-path="url(#p1380ac9988)" style="fill: none; stroke-dasharray: 7.4,3.2; stroke-dashoffset: 0; stroke: #003c4d; stroke-width: 2"/> +" clip-path="url(#p1380ac9988)" 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(#p1380ac9988)" 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(#p1380ac9988)" 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(#p1380ac9988)" 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(#p1380ac9988)" 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(#p1380ac9988)" 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(#p1380ac9988)" 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(#p1380ac9988)" 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(#p1380ac9988)" 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(#p1380ac9988)" 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(#p1380ac9988)" 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(#p1380ac9988)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p1380ac9988)" 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(#p1380ac9988)" 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(#p1380ac9988)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p1380ac9988)" 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(#p1380ac9988)" 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(#p1380ac9988)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p1380ac9988)" 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(#p1380ac9988)" 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(#p1380ac9988)" 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(#p1380ac9988)" 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(#p1380ac9988)" 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(#p1380ac9988)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + - + @@ -2615,27 +2615,27 @@ z - + +" clip-path="url(#p1380ac9988)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p1380ac9988)" 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(#p1380ac9988)" 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 e717f6488..bb301d97c 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-02-16T11:02:19.049934 + 2026-02-27T09:53:20.934933 image/svg+xml @@ -40,23 +40,23 @@ z +" clip-path="url(#pc8cb8ab830)" style="fill: none; stroke-dasharray: 7.4,3.2; stroke-dashoffset: 0; stroke: #003c4d; stroke-width: 2"/> +" clip-path="url(#pc8cb8ab830)" 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(#pc8cb8ab830)" 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(#pc8cb8ab830)" 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(#pc8cb8ab830)" 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(#pc8cb8ab830)" 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(#pc8cb8ab830)" 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(#pc8cb8ab830)" 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(#pc8cb8ab830)" 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(#pc8cb8ab830)" 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(#pc8cb8ab830)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pc8cb8ab830)" 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(#pc8cb8ab830)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pc8cb8ab830)" 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(#pc8cb8ab830)" 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(#pc8cb8ab830)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pc8cb8ab830)" 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(#pc8cb8ab830)" 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(#pc8cb8ab830)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pc8cb8ab830)" 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(#pc8cb8ab830)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pc8cb8ab830)" 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(#pc8cb8ab830)" 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(#pc8cb8ab830)" 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(#pc8cb8ab830)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + - + @@ -2655,17 +2655,17 @@ z - + +" clip-path="url(#pc8cb8ab830)" 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(#pc8cb8ab830)" 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(#pc8cb8ab830)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pc8cb8ab830)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pc8cb8ab830)" 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 765699728..671506ffb 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-02-16T11:02:19.973871 + 2026-02-27T09:53:21.774454 image/svg+xml @@ -40,23 +40,23 @@ z +" clip-path="url(#p3132e0a728)" style="fill: none; stroke-dasharray: 7.4,3.2; stroke-dashoffset: 0; stroke: #003c4d; stroke-width: 2"/> +" clip-path="url(#p3132e0a728)" 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(#p3132e0a728)" 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(#p3132e0a728)" 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(#p3132e0a728)" 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(#p3132e0a728)" 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(#p3132e0a728)" 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(#p3132e0a728)" 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(#p3132e0a728)" 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(#p3132e0a728)" 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(#p3132e0a728)" 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(#p3132e0a728)" 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(#p3132e0a728)" 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(#p3132e0a728)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p3132e0a728)" 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(#p3132e0a728)" 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(#p3132e0a728)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p3132e0a728)" 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(#p3132e0a728)" 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(#p3132e0a728)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p3132e0a728)" 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(#p3132e0a728)" 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(#p3132e0a728)" 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(#p3132e0a728)" 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(#p3132e0a728)" 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(#p3132e0a728)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + - + @@ -2761,27 +2761,27 @@ z - + +" clip-path="url(#p3132e0a728)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p3132e0a728)" 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(#p3132e0a728)" 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/conf.py b/docs/conf.py index ac372683f..282915ec7 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,7 +18,7 @@ year = '2025' author = 'NREL' copyright = f'{year}, {author}' -version = release = '3.11.15' +version = release = '3.11.17' pygments_style = 'trac' templates_path = ['./templates'] diff --git a/setup.py b/setup.py index f64a89172..37b67477b 100755 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ def read(*names, **kwargs): setup( name='geophires-x', - version='3.11.15', + version='3.11.17', 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 3780133a7..720632b84 100644 --- a/src/geophires_x/Economics.py +++ b/src/geophires_x/Economics.py @@ -2088,6 +2088,17 @@ def __init__(self, model: Model): CurrentUnits=CurrencyUnit.MDOLLARS, ) self.capex_total = self.OutputParameterDict[self.capex_total.Name] = total_capex_parameter_output_parameter() + self.capex_total_per_kw = self.OutputParameterDict[self.capex_total_per_kw.Name] = OutputParameter( + Name="Total CAPEX ($/kW)", + UnitType=Units.ENERGYCOST, + PreferredUnits=EnergyCostUnit.DOLLARSPERKW, + CurrentUnits=EnergyCostUnit.DOLLARSPERKW, + ToolTipText='The total capital expenditure (CAPEX) required to construct the plant, ' + 'normalized per kilowatt of capacity. ' + 'This metric is calculated based on the maximum net electricity generation of the facility. ' + 'It reflects all direct and indirect costs, contingency, and applicable cost escalations ' + 'included in the base Total CAPEX.', + ) # noinspection SpellCheckingInspection self.Coam = self.OutputParameterDict[self.Coam.Name] = OutputParameter( @@ -3521,6 +3532,16 @@ def _calculate_sam_economics(self, model: Model) -> None: # since SAM Economic Model doesn't subtract ITC from this value. self.capex_total.value = (self.sam_economics_calculations.capex.quantity() .to(self.capex_total.CurrentUnits.value).magnitude) + # self.capex_total_per_kw.value = PlainQuantity(self.capex_total.value, f'{self.capex_total.CurrentUnits}' + + # TODO define this as an output of SurfacePlant rather than calculating it on-demand here and elsewhere + max_net_electricity_generation_kw = quantity( + np.max(model.surfaceplant.NetElectricityProduced.value), + model.surfaceplant.NetElectricityProduced.CurrentUnits + ).to('kW') + capex_total_per_kw_q = self.capex_total.quantity().to('USD') / max_net_electricity_generation_kw + self.capex_total_per_kw.value = capex_total_per_kw_q.magnitude + self.CCap.value = (self.sam_economics_calculations.capex.quantity() .to(self.CCap.CurrentUnits.value).magnitude) diff --git a/src/geophires_x/Outputs.py b/src/geophires_x/Outputs.py index 050c41ff3..3b5e4dab9 100644 --- a/src/geophires_x/Outputs.py +++ b/src/geophires_x/Outputs.py @@ -221,6 +221,7 @@ def PrintOutputs(self, model: Model): if is_sam_econ_model: f.write(f' {Outputs._field_label(econ.capex_total.display_name, 50)}{econ.capex_total.value:10.2f} {econ.capex_total.CurrentUnits.value}\n') + f.write(f' {Outputs._field_label(econ.capex_total_per_kw.display_name, 50)}{econ.capex_total_per_kw.value:10.0f} {econ.capex_total_per_kw.CurrentUnits.value}\n') f.write(f' Number of production wells: {model.wellbores.nprod.value:10.0f}'+NL) f.write(f' Number of injection wells: {model.wellbores.ninj.value:10.0f}'+NL) diff --git a/src/geophires_x/__init__.py b/src/geophires_x/__init__.py index 84ede0673..d5e925eab 100644 --- a/src/geophires_x/__init__.py +++ b/src/geophires_x/__init__.py @@ -1 +1 @@ -__version__ = '3.11.15' +__version__ = '3.11.17' diff --git a/src/geophires_x_client/geophires_x_result.py b/src/geophires_x_client/geophires_x_result.py index d96393cd9..d203582f2 100644 --- a/src/geophires_x_client/geophires_x_result.py +++ b/src/geophires_x_client/geophires_x_result.py @@ -44,6 +44,7 @@ class GeophiresXResult: 'Average Net Electricity Production', 'Electricity breakeven price', 'Total CAPEX', + 'Total CAPEX ($/kW)', 'Average Direct-Use Heat Production', 'Direct-Use heat breakeven price', 'Direct-Use heat breakeven price (LCOH)', diff --git a/src/geophires_x_schema_generator/geophires-result.json b/src/geophires_x_schema_generator/geophires-result.json index f3ea69504..9a01c92f2 100644 --- a/src/geophires_x_schema_generator/geophires-result.json +++ b/src/geophires_x_schema_generator/geophires-result.json @@ -27,6 +27,11 @@ "description": "The total capital expenditure (CAPEX) required to construct the plant. This value includes all direct and indirect costs, and contingency. For SAM Economic models, it also includes any cost escalation from inflation during construction. It is used as the total installed cost input for SAM Economic Models.", "units": "MUSD" }, + "Total CAPEX ($/kW)": { + "type": "number", + "description": "The total capital expenditure (CAPEX) required to construct the plant, normalized per kilowatt of capacity. This metric is calculated based on the maximum net electricity generation of the facility. It reflects all direct and indirect costs, contingency, and applicable cost escalations included in the base Total CAPEX.", + "units": "USD/kW" + }, "Average Direct-Use Heat Production": {}, "Direct-Use heat breakeven price": {}, "Direct-Use heat breakeven price (LCOH)": { diff --git a/tests/examples/Fervo_Project_Cape-4.out b/tests/examples/Fervo_Project_Cape-4.out index 58aa7850a..25a7258b7 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.11.3 - Simulation Date: 2026-01-17 - Simulation Time: 09:41 - Calculation Time: 2.234 sec + GEOPHIRES Version: 3.11.16 + Simulation Date: 2026-02-27 + Simulation Time: 09:47 + Calculation Time: 1.795 sec ***SUMMARY OF RESULTS*** @@ -15,6 +15,7 @@ Simulation Metadata Average Net Electricity Production: 532.53 MW Electricity breakeven price: 8.11 cents/kWh Total CAPEX: 2660.87 MUSD + Total CAPEX ($/kW): 4954 USD/kW Number of production wells: 59 Number of injection wells: 59 Flowrate per production well: 107.0 kg/sec @@ -328,7 +329,7 @@ After-tax cumulative NPV ($) -1,064,346,550 -276,360,558 - AFTER-TAX LCOE AND PPA PRICE Annual costs ($) -1,064,346,550 504,481,845 -279,761,764 -280,941,051 -282,053,576 -283,104,409 -283,946,673 -284,197,129 -283,198,821 -283,951,600 -287,996,326 -289,476,868 -290,828,818 -292,141,214 -293,348,448 -294,183,709 -294,099,170 -292,511,863 -297,725,623 -299,899,742 -301,618,330 -318,291,569 -334,925,356 -336,358,826 -337,173,733 -336,651,121 -338,088,802 -343,176,493 -345,487,456 -347,698,476 627,560,501 PPA revenue ($) 0 398,360,985 400,859,527 404,023,741 406,864,580 409,397,136 411,063,538 410,414,761 404,969,797 406,031,044 419,401,219 423,001,126 426,005,415 428,743,476 430,961,457 431,646,734 428,727,061 419,997,324 436,749,150 441,881,181 445,124,646 448,012,403 450,560,179 452,154,561 451,204,088 444,986,839 445,920,708 460,361,453 464,070,591 467,122,922 469,876,708 -Electricity to grid (kWh) 0.0 4,193,273,525 4,219,573,970 4,227,516,388 4,232,001,035 4,233,245,126 4,225,570,913 4,194,325,606 4,114,710,394 4,101,737,992 4,212,547,398 4,224,519,385 4,230,441,060 4,233,667,186 4,231,750,368 4,214,888,525 4,163,207,043 4,055,985,743 4,194,671,056 4,220,853,770 4,228,811,003 4,233,321,393 4,234,588,146 4,226,928,684 4,195,686,141 4,116,056,232 4,103,061,353 4,213,834,812 4,225,738,401 4,231,569,184 4,234,649,495 +Electricity to grid (kWh) 0 4,193,273,525 4,219,573,970 4,227,516,388 4,232,001,035 4,233,245,126 4,225,570,913 4,194,325,606 4,114,710,394 4,101,737,992 4,212,547,398 4,224,519,385 4,230,441,060 4,233,667,186 4,231,750,368 4,214,888,525 4,163,207,043 4,055,985,743 4,194,671,056 4,220,853,770 4,228,811,003 4,233,321,393 4,234,588,146 4,226,928,684 4,195,686,141 4,116,056,232 4,103,061,353 4,213,834,812 4,225,738,401 4,231,569,184 4,234,649,495 Present value of annual costs ($) 2,298,728,919 Present value of annual energy nominal (kWh) 28,355,365,264 diff --git a/tests/examples/Fervo_Project_Cape-5.out b/tests/examples/Fervo_Project_Cape-5.out index 6a303150a..8d03fe8d1 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.11.12 - Simulation Date: 2026-02-16 - Simulation Time: 10:58 - Calculation Time: 1.862 sec + GEOPHIRES Version: 3.11.16 + Simulation Date: 2026-02-27 + Simulation Time: 09:49 + Calculation Time: 1.881 sec ***SUMMARY OF RESULTS*** @@ -15,6 +15,7 @@ Simulation Metadata Average Net Electricity Production: 510.13 MW Electricity breakeven price: 8.59 cents/kWh Total CAPEX: 2865.69 MUSD + Total CAPEX ($/kW): 5595 USD/kW Number of production wells: 56 Number of injection wells: 38 Flowrate per production well: 107.0 kg/sec diff --git a/tests/examples/Fervo_Project_Cape-6.out b/tests/examples/Fervo_Project_Cape-6.out index 8a0003fbe..07843d34d 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.11.12 - Simulation Date: 2026-02-16 - Simulation Time: 10:58 - Calculation Time: 1.884 sec + GEOPHIRES Version: 3.11.16 + Simulation Date: 2026-02-27 + Simulation Time: 09:53 + Calculation Time: 1.834 sec ***SUMMARY OF RESULTS*** @@ -15,6 +15,7 @@ Simulation Metadata Average Net Electricity Production: 103.22 MW Electricity breakeven price: 8.93 cents/kWh Total CAPEX: 577.72 MUSD + Total CAPEX ($/kW): 5573 USD/kW Number of production wells: 12 Number of injection wells: 8 Flowrate per production well: 100.0 kg/sec diff --git a/tests/examples/Fervo_Project_Cape-6.txt b/tests/examples/Fervo_Project_Cape-6.txt index 24ba6729a..31229fbb8 100644 --- a/tests/examples/Fervo_Project_Cape-6.txt +++ b/tests/examples/Fervo_Project_Cape-6.txt @@ -52,8 +52,6 @@ End-Use Option, 1, -- Electricity Power Plant Type, 2, -- Gen 2 ORC units (Turboden, 2025). Plant Lifetime, 30, -- Sets the project economic horizon, aligned with Fervo's anticipated 30-year well life (Fervo Energy, 2025). Modeling Distinction: While Fervo projects physical wellbore integrity for 30 years, GEOPHIRES simulates "redrilling events" to model thermal management of the reservoir volume. This treats the 30-year lifespan as an aggregate of shorter-lived thermal cycles delineated by discrete redrilling events occurring at intervals dictated by the Maximum Drawdown parameter. The modeled cost of each redrilling event is equivalent to the drilling and stimulation cost of the entire wellfield, serving as a conservative cost proxy for the major interventions (e.g., sidetracking and stimulating laterals into fresh rock, or drilling new wells if necessary) required to sustain the PPA target against thermal depletion. -Reservoir Model, 1 - Surface Temperature, 13, -- Surface temperature near Milford, UT (38.4987670, -112.9163432) ([Project InnerSpace, 2025](https://geomap.projectinnerspace.org/test/)). Number of Segments, 3 @@ -70,6 +68,7 @@ Reservoir Heat Capacity, 790 Reservoir Thermal Conductivity, 3.05 Reservoir Porosity, 0.0118 +Reservoir Model, 1, -- See the [reservoir engineering calibration section](#res-eng-params-calibration-section) for additional details. Reservoir Volume Option, 1, -- FRAC_NUM_SEP: Reservoir volume calculated with fracture separation and number of fractures as input Number of Fractures per Stimulated Well, 150, -- The model assumes an Extreme Limited Entry stimulation design (Fervo Energy, 2023) utilizing 12 stages with 15 clusters per stage (derived from Singh et al., 2025) and 81–85% stimulation success rate per 2024b ATB Moderate Scenario (NREL, 2025). diff --git a/tests/examples/example_SAM-single-owner-PPA-2.out b/tests/examples/example_SAM-single-owner-PPA-2.out index dc4a4a10d..73a472397 100644 --- a/tests/examples/example_SAM-single-owner-PPA-2.out +++ b/tests/examples/example_SAM-single-owner-PPA-2.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.11.9 - Simulation Date: 2026-01-28 - Simulation Time: 12:11 - Calculation Time: 1.059 sec + GEOPHIRES Version: 3.11.16 + Simulation Date: 2026-02-27 + Simulation Time: 09:53 + Calculation Time: 1.050 sec ***SUMMARY OF RESULTS*** @@ -15,6 +15,7 @@ Simulation Metadata Average Net Electricity Production: 404.31 MW Electricity breakeven price: 7.37 cents/kWh Total CAPEX: 1609.42 MUSD + Total CAPEX ($/kW): 3972 USD/kW Number of production wells: 39 Number of injection wells: 39 Flowrate per production well: 120.0 kg/sec diff --git a/tests/examples/example_SAM-single-owner-PPA-3.out b/tests/examples/example_SAM-single-owner-PPA-3.out index 213669cdc..6d530815e 100644 --- a/tests/examples/example_SAM-single-owner-PPA-3.out +++ b/tests/examples/example_SAM-single-owner-PPA-3.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.11.9 - Simulation Date: 2026-01-28 - Simulation Time: 12:11 - Calculation Time: 1.237 sec + GEOPHIRES Version: 3.11.16 + Simulation Date: 2026-02-27 + Simulation Time: 09:53 + Calculation Time: 1.239 sec ***SUMMARY OF RESULTS*** @@ -15,6 +15,7 @@ Simulation Metadata Average Net Electricity Production: 58.87 MW Electricity breakeven price: 7.64 cents/kWh Total CAPEX: 275.47 MUSD + Total CAPEX ($/kW): 4667 USD/kW Number of production wells: 6 Number of injection wells: 6 Flowrate per production well: 100.0 kg/sec diff --git a/tests/examples/example_SAM-single-owner-PPA-4.out b/tests/examples/example_SAM-single-owner-PPA-4.out index 18e4b13ba..d516b3624 100644 --- a/tests/examples/example_SAM-single-owner-PPA-4.out +++ b/tests/examples/example_SAM-single-owner-PPA-4.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.11.9 - Simulation Date: 2026-01-28 - Simulation Time: 12:11 - Calculation Time: 1.448 sec + GEOPHIRES Version: 3.11.16 + Simulation Date: 2026-02-27 + Simulation Time: 09:53 + Calculation Time: 1.326 sec ***SUMMARY OF RESULTS*** @@ -15,6 +15,7 @@ Simulation Metadata Average Net Electricity Production: 54.96 MW Electricity breakeven price: 6.97 cents/kWh Total CAPEX: 225.81 MUSD + Total CAPEX ($/kW): 4097 USD/kW Number of production wells: 6 Number of injection wells: 6 Flowrate per production well: 100.0 kg/sec diff --git a/tests/examples/example_SAM-single-owner-PPA-5.out b/tests/examples/example_SAM-single-owner-PPA-5.out index 9efc6aae0..7fec0283c 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.11.12 - Simulation Date: 2026-02-01 - Simulation Time: 09:42 - Calculation Time: 2.228 sec + GEOPHIRES Version: 3.11.16 + Simulation Date: 2026-02-27 + Simulation Time: 09:53 + Calculation Time: 1.854 sec ***SUMMARY OF RESULTS*** @@ -15,6 +15,7 @@ Simulation Metadata Average Net Electricity Production: 110.58 MW Electricity breakeven price: 7.78 cents/kWh Total CAPEX: 710.63 MUSD + Total CAPEX ($/kW): 6407 USD/kW Number of production wells: 15 Number of injection wells: 15 Flowrate per production well: 80.0 kg/sec diff --git a/tests/examples/example_SAM-single-owner-PPA.out b/tests/examples/example_SAM-single-owner-PPA.out index 27cb5cf4d..a9cd2585b 100644 --- a/tests/examples/example_SAM-single-owner-PPA.out +++ b/tests/examples/example_SAM-single-owner-PPA.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.11.9 - Simulation Date: 2026-01-28 - Simulation Time: 12:07 - Calculation Time: 1.275 sec + GEOPHIRES Version: 3.11.16 + Simulation Date: 2026-02-27 + Simulation Time: 09:49 + Calculation Time: 1.227 sec ***SUMMARY OF RESULTS*** @@ -15,6 +15,7 @@ Simulation Metadata Average Net Electricity Production: 54.96 MW Electricity breakeven price: 6.34 cents/kWh Total CAPEX: 225.81 MUSD + Total CAPEX ($/kW): 4097 USD/kW Number of production wells: 6 Number of injection wells: 6 Flowrate per production well: 100.0 kg/sec