diff --git a/.bumpversion.cfg b/.bumpversion.cfg index d397297b..3d6b2d61 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 3.10.25 +current_version = 3.11.1 commit = True tag = True diff --git a/.cookiecutterrc b/.cookiecutterrc index 1efcb17e..8140eb80 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.10.25 + version: 3.11.1 version_manager: "bump2version" website: "https://github.com/NREL" year_from: "2023" diff --git a/CHANGELOG.rst b/CHANGELOG.rst index b817a708..c087b033 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,6 +4,11 @@ Changelog GEOPHIRES v3 (2023-2025) ------------------------ +3.11 +^^^^ + +3.11: `SAM Economic Models Project Payback Period fix `__ | `release `__ + 3.10 ^^^^ diff --git a/README.rst b/README.rst index 2fc6a6a5..904097d3 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.10.25.svg +.. |commits-since| image:: https://img.shields.io/github/commits-since/softwareengineerprogrammer/GEOPHIRES-X/v3.11.1.svg :alt: Commits since latest release - :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.10.25...main + :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.11.1...main .. |docs| image:: https://readthedocs.org/projects/GEOPHIRES-X/badge/?style=flat :target: https://nrel.github.io/GEOPHIRES-X 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 1abab346..3d9883db 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-01-14T11:34:35.314403 + 2026-01-16T11:45:33.862062 image/svg+xml @@ -40,23 +40,23 @@ z +" clip-path="url(#pb88346b142)" style="fill: none; stroke-dasharray: 7.4,3.2; stroke-dashoffset: 0; stroke: #003c4d; stroke-width: 2"/> +" clip-path="url(#pb88346b142)" 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(#pb88346b142)" 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 425.443697 97.55355 +" clip-path="url(#pb88346b142)" 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 540.822944 97.55355 +" clip-path="url(#pb88346b142)" 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 @@ z +" clip-path="url(#pb88346b142)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - + @@ -1499,17 +1499,17 @@ L 775.475487 97.55355 " style="fill: none; stroke: #aaaaaa; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - + +" clip-path="url(#pb88346b142)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1521,7 +1521,7 @@ z - + @@ -1645,7 +1645,7 @@ z - + @@ -1689,17 +1689,17 @@ z - + +" clip-path="url(#pb88346b142)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1780,7 +1780,7 @@ z - + @@ -1791,17 +1791,17 @@ z - + +" clip-path="url(#pb88346b142)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1812,7 +1812,7 @@ z - + @@ -1878,7 +1878,7 @@ z - + @@ -1890,17 +1890,17 @@ z - + +" clip-path="url(#pb88346b142)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1912,7 +1912,7 @@ z - + @@ -1926,17 +1926,17 @@ z - + +" clip-path="url(#pb88346b142)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1948,7 +1948,7 @@ z - + @@ -1960,17 +1960,17 @@ z - + +" clip-path="url(#pb88346b142)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1982,7 +1982,7 @@ z - + @@ -1997,17 +1997,17 @@ z - + +" clip-path="url(#pb88346b142)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2020,7 +2020,7 @@ z - + @@ -2032,27 +2032,27 @@ z - + +" clip-path="url(#pb88346b142)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pb88346b142)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2071,7 +2071,7 @@ z - + @@ -2083,27 +2083,27 @@ z - + +" clip-path="url(#pb88346b142)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pb88346b142)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2120,7 +2120,7 @@ z - + @@ -2132,7 +2132,7 @@ z - + @@ -2144,17 +2144,17 @@ z - + +" clip-path="url(#pb88346b142)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2169,7 +2169,7 @@ z - + @@ -2181,17 +2181,17 @@ z - + +" clip-path="url(#pb88346b142)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2208,7 +2208,7 @@ z - + @@ -2236,7 +2236,7 @@ z - + @@ -2248,17 +2248,17 @@ z - + +" clip-path="url(#pb88346b142)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2273,7 +2273,7 @@ z - + @@ -2285,27 +2285,27 @@ z - + +" clip-path="url(#pb88346b142)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pb88346b142)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2333,7 +2333,7 @@ z - + @@ -2378,7 +2378,7 @@ z - + @@ -2390,17 +2390,17 @@ z - + +" clip-path="url(#pb88346b142)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2412,7 +2412,7 @@ z - + @@ -2426,17 +2426,17 @@ z - + +" clip-path="url(#pb88346b142)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2450,7 +2450,7 @@ z - + @@ -2463,7 +2463,7 @@ z - + @@ -2475,27 +2475,27 @@ z - + +" clip-path="url(#pb88346b142)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#pb88346b142)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2503,7 +2503,7 @@ z - + @@ -2515,24 +2515,24 @@ z - + +" clip-path="url(#pb88346b142)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + - + @@ -2945,7 +2945,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 4a15cdb7..3a917a14 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-01-14T11:34:41.535134 + 2026-01-16T11:45:36.341692 image/svg+xml @@ -40,23 +40,23 @@ z +" clip-path="url(#p33a301077c)" style="fill: none; stroke-dasharray: 7.4,3.2; stroke-dashoffset: 0; stroke: #003c4d; stroke-width: 2"/> +" clip-path="url(#p33a301077c)" 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(#p33a301077c)" 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(#p33a301077c)" 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(#p33a301077c)" 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 552.524168 97.55355 +" clip-path="url(#p33a301077c)" 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 654.269459 97.55355 +" clip-path="url(#p33a301077c)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - + @@ -1572,27 +1572,27 @@ L 777.635625 97.55355 " style="fill: none; stroke: #aaaaaa; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - + +" clip-path="url(#p33a301077c)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p33a301077c)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1601,7 +1601,7 @@ z - + @@ -1649,17 +1649,17 @@ z - + +" clip-path="url(#p33a301077c)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1669,7 +1669,7 @@ z - + @@ -1684,27 +1684,27 @@ z - + +" clip-path="url(#p33a301077c)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p33a301077c)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1748,7 +1748,7 @@ z - + @@ -1763,27 +1763,27 @@ z - + +" clip-path="url(#p33a301077c)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p33a301077c)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1796,7 +1796,7 @@ z - + @@ -1811,27 +1811,27 @@ z - + +" clip-path="url(#p33a301077c)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p33a301077c)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1851,7 +1851,7 @@ z - + @@ -1866,17 +1866,17 @@ z - + +" clip-path="url(#p33a301077c)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1891,7 +1891,7 @@ z - + @@ -1906,27 +1906,27 @@ z - + +" clip-path="url(#p33a301077c)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p33a301077c)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1943,7 +1943,7 @@ z - + @@ -2108,7 +2108,7 @@ z - + @@ -2123,17 +2123,17 @@ z - + +" clip-path="url(#p33a301077c)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2148,7 +2148,7 @@ z - + @@ -2163,17 +2163,17 @@ z - + +" clip-path="url(#p33a301077c)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2190,7 +2190,7 @@ z - + @@ -2206,7 +2206,7 @@ z - + @@ -2221,27 +2221,27 @@ z - + +" clip-path="url(#p33a301077c)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p33a301077c)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2317,7 +2317,7 @@ z - + @@ -2346,17 +2346,17 @@ z - + +" clip-path="url(#p33a301077c)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2370,7 +2370,7 @@ z - + @@ -2398,7 +2398,7 @@ z - + @@ -2413,17 +2413,17 @@ z - + +" clip-path="url(#p33a301077c)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2436,7 +2436,7 @@ z - + @@ -2506,7 +2506,7 @@ z - + @@ -2522,24 +2522,24 @@ z - + +" clip-path="url(#p33a301077c)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + - + @@ -2554,17 +2554,17 @@ z - + +" clip-path="url(#p33a301077c)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2621,7 +2621,7 @@ z - + @@ -2631,17 +2631,17 @@ z - + +" clip-path="url(#p33a301077c)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2651,7 +2651,7 @@ z - + @@ -2667,7 +2667,7 @@ z - + @@ -3122,7 +3122,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 58aa8054..ab2d4a4a 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-01-14T11:34:39.966020 + 2026-01-16T11:45:36.155664 image/svg+xml @@ -40,23 +40,23 @@ z +" clip-path="url(#p06a079b055)" style="fill: none; stroke-dasharray: 7.4,3.2; stroke-dashoffset: 0; stroke: #003c4d; stroke-width: 2"/> +" clip-path="url(#p06a079b055)" 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(#p06a079b055)" 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(#p06a079b055)" 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 477.985028 97.55355 +" clip-path="url(#p06a079b055)" 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 579.669218 97.55355 +" clip-path="url(#p06a079b055)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #aaaaaa; stroke-opacity: 0.7; stroke-width: 0.8"/> - + @@ -1570,17 +1570,17 @@ L 777.635625 97.55355 " style="fill: none; stroke: #aaaaaa; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/> - + +" clip-path="url(#p06a079b055)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1592,7 +1592,7 @@ z - + @@ -1757,7 +1757,7 @@ z - + @@ -1770,17 +1770,17 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1833,7 +1833,7 @@ z - + @@ -1844,17 +1844,17 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -1865,7 +1865,7 @@ z - + @@ -1931,7 +1931,7 @@ z - + @@ -1945,17 +1945,17 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2002,7 +2002,7 @@ z - + @@ -2016,17 +2016,17 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2070,7 +2070,7 @@ z - + @@ -2093,17 +2093,17 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2118,7 +2118,7 @@ z - + @@ -2133,17 +2133,17 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2158,7 +2158,7 @@ z - + @@ -2214,7 +2214,7 @@ z - + @@ -2228,17 +2228,17 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2257,7 +2257,7 @@ z - + @@ -2271,17 +2271,17 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2301,7 +2301,7 @@ z - + @@ -2315,27 +2315,27 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p06a079b055)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2352,7 +2352,7 @@ z - + @@ -2367,7 +2367,7 @@ z - + @@ -2380,17 +2380,17 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2405,7 +2405,7 @@ z - + @@ -2419,17 +2419,17 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2446,7 +2446,7 @@ z - + @@ -2461,7 +2461,7 @@ z - + @@ -2474,17 +2474,17 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2499,7 +2499,7 @@ z - + @@ -2513,27 +2513,27 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + +" clip-path="url(#p06a079b055)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2561,7 +2561,7 @@ z - + @@ -2576,7 +2576,7 @@ z - + @@ -2591,17 +2591,17 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2648,7 +2648,7 @@ z - + @@ -2662,17 +2662,17 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #84d1a8; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2686,7 +2686,7 @@ z - + @@ -2701,7 +2701,7 @@ z - + @@ -2715,17 +2715,17 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #808080; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2740,7 +2740,7 @@ z - + @@ -2750,17 +2750,17 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #b0b0b0; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + @@ -2768,7 +2768,7 @@ z - + @@ -2781,24 +2781,24 @@ z - + +" clip-path="url(#p06a079b055)" style="fill: #4ab67d; stroke: #ffffff; stroke-width: 0.5; stroke-linejoin: miter"/> - + - + @@ -3321,7 +3321,7 @@ z - + diff --git a/docs/conf.py b/docs/conf.py index 91725628..b3cdd21a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,7 +18,7 @@ year = '2025' author = 'NREL' copyright = f'{year}, {author}' -version = release = '3.10.25' +version = release = '3.11.1' pygments_style = 'trac' templates_path = ['./templates'] diff --git a/setup.py b/setup.py index ff1b24c8..638e5c1a 100755 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ def read(*names, **kwargs): setup( name='geophires-x', - version='3.10.25', + version='3.11.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/EconomicsSam.py b/src/geophires_x/EconomicsSam.py index d5506245..9b9139d2 100644 --- a/src/geophires_x/EconomicsSam.py +++ b/src/geophires_x/EconomicsSam.py @@ -521,21 +521,43 @@ def _calculate_project_vir(cash_flow: list[list[Any]], model: Model) -> float: def _calculate_project_payback_period(cash_flow: list[list[Any]], model) -> float | None: """ - See payback period output parameter's tooltip text for details relevant to this implementation. - """ + Calculates the Simple Payback Period (SPB). + SPB is the time required for the cumulative non-discounted after-tax net cash flow to turn positive. + The calculation assumes annual cash flows. The returned value represents the number of years + from the start of the provided cash flow list until the investment is recovered. + """ try: + # Get flattened annual after-tax cash flow after_tax_cash_flow = _after_tax_net_cash_flow_all_years(cash_flow, _pre_revenue_years_count(model)) - cumm_cash_flow = np.zeros(len(after_tax_cash_flow)) - cumm_cash_flow[0] = after_tax_cash_flow[0] - for year in range(1, len(after_tax_cash_flow)): - cumm_cash_flow[year] = cumm_cash_flow[year - 1] + after_tax_cash_flow[year] - if cumm_cash_flow[year] >= 0: - year_before_full_recovery = year - 1 - payback_period = ( - year_before_full_recovery - + abs(cumm_cash_flow[year_before_full_recovery]) / after_tax_cash_flow[year] - ) + + cumulative_cash_flow = np.zeros(len(after_tax_cash_flow)) + cumulative_cash_flow[0] = after_tax_cash_flow[0] + + # Handle edge case where the first year is already positive + if cumulative_cash_flow[0] >= 0: + # If the project is profitable immediately (rare for SPB), return 0 or fraction. + # For standard SPB logic where Index 0 is an investment year, this is an edge case. + pass + + for year_index in range(1, len(after_tax_cash_flow)): + cumulative_cash_flow[year_index] = cumulative_cash_flow[year_index - 1] + after_tax_cash_flow[year_index] + + if cumulative_cash_flow[year_index] >= 0: + # Payback occurred in this year (year_index). + # We need to calculate how far into this year the break-even point occurred. + + previous_year_index = year_index - 1 + unrecovered_cost_at_start_of_year = abs(cumulative_cash_flow[previous_year_index]) + cash_flow_in_current_year = after_tax_cash_flow[year_index] + + # Fraction of the current year required to recover the remaining cost + fraction_of_year = unrecovered_cost_at_start_of_year / cash_flow_in_current_year + + # Total years elapsed = Full years prior to this one + fraction of this one. + # If we are at year_index, the number of full years passed is equal to year_index. + # Example: If year_index is 5 (6th year), 5 full years (Indices 0..4) have passed. + payback_period = year_index + fraction_of_year return float(payback_period) diff --git a/src/geophires_x/__init__.py b/src/geophires_x/__init__.py index 891f6ea2..94015dc8 100644 --- a/src/geophires_x/__init__.py +++ b/src/geophires_x/__init__.py @@ -1 +1 @@ -__version__ = '3.10.25' +__version__ = '3.11.1' diff --git a/tests/examples/Fervo_Project_Cape-4.out b/tests/examples/Fervo_Project_Cape-4.out index 60d36561..b86ef62e 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.10.25 - Simulation Date: 2026-01-13 - Simulation Time: 11:08 - Calculation Time: 1.855 sec + GEOPHIRES Version: 3.11.0 + Simulation Date: 2026-01-16 + Simulation Time: 11:41 + Calculation Time: 1.775 sec ***SUMMARY OF RESULTS*** @@ -34,7 +34,7 @@ Simulation Metadata After-tax IRR: 27.55 % Project VIR=PI=PIR: 1.45 Project MOIC: 4.20 - Project Payback Period: 2.33 yr + Project Payback Period: 3.33 yr Estimated Jobs Created: 1300 ***ENGINEERING PARAMETERS*** diff --git a/tests/examples/Fervo_Project_Cape-5.out b/tests/examples/Fervo_Project_Cape-5.out index 691c251a..31c5d155 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.10.25 - Simulation Date: 2026-01-14 - Simulation Time: 11:38 - Calculation Time: 1.828 sec + GEOPHIRES Version: 3.11.0 + Simulation Date: 2026-01-16 + Simulation Time: 11:42 + Calculation Time: 1.791 sec ***SUMMARY OF RESULTS*** @@ -38,7 +38,7 @@ Simulation Metadata After-tax IRR: 24.46 % Project VIR=PI=PIR: 1.45 Project MOIC: 5.05 - Project Payback Period: 4.93 yr + Project Payback Period: 5.93 yr Estimated Jobs Created: 1269 ***ENGINEERING PARAMETERS*** diff --git a/tests/examples/Fervo_Project_Cape-6.out b/tests/examples/Fervo_Project_Cape-6.out index 04373ec9..6c2adcdd 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.10.25 - Simulation Date: 2026-01-15 - Simulation Time: 11:34 - Calculation Time: 1.834 sec + GEOPHIRES Version: 3.11.0 + Simulation Date: 2026-01-16 + Simulation Time: 11:42 + Calculation Time: 1.811 sec ***SUMMARY OF RESULTS*** @@ -38,7 +38,7 @@ Simulation Metadata After-tax IRR: 35.45 % Project VIR=PI=PIR: 1.69 Project MOIC: 5.26 - Project Payback Period: 2.88 yr + Project Payback Period: 3.88 yr Estimated Jobs Created: 272 ***ENGINEERING PARAMETERS*** diff --git a/tests/examples/Fervo_Project_Cape-6.txt b/tests/examples/Fervo_Project_Cape-6.txt index eadbf724..53404859 100644 --- a/tests/examples/Fervo_Project_Cape-6.txt +++ b/tests/examples/Fervo_Project_Cape-6.txt @@ -73,7 +73,7 @@ Reservoir Volume Option, 1, -- FRAC_NUM_SEP: Reservoir volume calculated with fr 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). Fracture Separation, 9.8255, -- Based on 30 foot cluster spacing (Singh et al., 2025) marginally uprated to align with long-term thermal decline behavior trend towards wider fracture spacing (Fercho et al., 2025). -Fracture Shape, 4, -- Bench design and fracture geometry Singh et al., 2025 are given in rectangular dimensions. +Fracture Shape, 4, -- Bench design and fracture geometry in Singh et al., 2025 are given in rectangular dimensions. Fracture Width, 305, -- Matches intra-bench well spacing of 500 ft (corresponding to fracture length of 1000 ft) (Singh. et al., 2025) Fracture Height, 95, -- Actual fracture geometry is irregular and heterogeneous; this height complies with the minimum height required by the implemented bench design (200 ft; 60.96 meters) and yields an effective fracture surface area consistent with simulation results in Singh. et al., 2025. diff --git a/tests/examples/example_SAM-single-owner-PPA-2.out b/tests/examples/example_SAM-single-owner-PPA-2.out index 6bd01e4f..1c69cd13 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.10.22 - Simulation Date: 2025-12-15 - Simulation Time: 09:15 - Calculation Time: 1.013 sec + GEOPHIRES Version: 3.11.0 + Simulation Date: 2026-01-16 + Simulation Time: 11:42 + Calculation Time: 1.086 sec ***SUMMARY OF RESULTS*** @@ -34,7 +34,7 @@ Simulation Metadata After-tax IRR: 59.73 % Project VIR=PI=PIR: 4.58 Project MOIC: 9.59 - Project Payback Period: 1.13 yr + Project Payback Period: 2.13 yr Estimated Jobs Created: 976 ***ENGINEERING PARAMETERS*** diff --git a/tests/examples/example_SAM-single-owner-PPA-3.out b/tests/examples/example_SAM-single-owner-PPA-3.out index 85e785da..a2508bc3 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.10.22 - Simulation Date: 2025-12-15 - Simulation Time: 09:15 - Calculation Time: 1.189 sec + GEOPHIRES Version: 3.11.0 + Simulation Date: 2026-01-16 + Simulation Time: 11:41 + Calculation Time: 1.221 sec ***SUMMARY OF RESULTS*** @@ -34,7 +34,7 @@ Simulation Metadata After-tax IRR: 30.00 % Project VIR=PI=PIR: 2.27 Project MOIC: 4.61 - Project Payback Period: 2.94 yr + Project Payback Period: 3.94 yr Estimated Jobs Created: 125 ***ENGINEERING PARAMETERS*** diff --git a/tests/examples/example_SAM-single-owner-PPA-4.out b/tests/examples/example_SAM-single-owner-PPA-4.out index f7e2cfeb..40414392 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.10.22 - Simulation Date: 2025-12-15 - Simulation Time: 09:15 - Calculation Time: 1.205 sec + GEOPHIRES Version: 3.11.0 + Simulation Date: 2026-01-16 + Simulation Time: 11:42 + Calculation Time: 1.231 sec ***SUMMARY OF RESULTS*** @@ -34,7 +34,7 @@ Simulation Metadata After-tax IRR: 22.13 % Project VIR=PI=PIR: 1.76 Project MOIC: 3.38 - Project Payback Period: 4.29 yr + Project Payback Period: 5.29 yr Estimated Jobs Created: 125 ***ENGINEERING PARAMETERS*** @@ -434,7 +434,6 @@ Interest earned on reserves ($) 0 0 0 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - ***EXTENDED ECONOMICS*** Royalty Holder NPV: 50.59 MUSD diff --git a/tests/examples/example_SAM-single-owner-PPA-5.out b/tests/examples/example_SAM-single-owner-PPA-5.out index ac43d769..99e01af5 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.10.24 - Simulation Date: 2025-12-24 - Simulation Time: 15:35 - Calculation Time: 1.840 sec + GEOPHIRES Version: 3.11.0 + Simulation Date: 2026-01-16 + Simulation Time: 11:42 + Calculation Time: 1.865 sec ***SUMMARY OF RESULTS*** @@ -34,7 +34,7 @@ Simulation Metadata After-tax IRR: 16.54 % Project VIR=PI=PIR: 1.58 Project MOIC: 5.72 - Project Payback Period: 8.92 yr + Project Payback Period: 9.92 yr Estimated Jobs Created: 250 ***ENGINEERING PARAMETERS*** diff --git a/tests/examples/example_SAM-single-owner-PPA.out b/tests/examples/example_SAM-single-owner-PPA.out index ae6a8d64..a23128ea 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.10.22 - Simulation Date: 2025-12-15 - Simulation Time: 09:15 - Calculation Time: 1.196 sec + GEOPHIRES Version: 3.11.0 + Simulation Date: 2026-01-16 + Simulation Time: 11:41 + Calculation Time: 1.222 sec ***SUMMARY OF RESULTS*** @@ -34,7 +34,7 @@ Simulation Metadata After-tax IRR: 24.35 % Project VIR=PI=PIR: 1.93 Project MOIC: 3.85 - Project Payback Period: 3.91 yr + Project Payback Period: 4.91 yr Estimated Jobs Created: 125 ***ENGINEERING PARAMETERS***