Skip to content

Commit 430f116

Browse files
Merge pull request #146 from softwareengineerprogrammer/graph-data-comparison
Project Red 2026 Update: Graph data comparison
2 parents 5c933b1 + 31ed839 commit 430f116

19 files changed

Lines changed: 672 additions & 84 deletions

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ docs/hip_ra_x_parameters.rst
114114
_site/
115115
/docs/geophires_x.rstx
116116
/docs/temperature.txt
117+
118+
src/geophires_docs/fervo_project_red-2026_graph-data-extraction.xcf
119+
117120
/geophires_x.rst
118121
/modules.rst
119122
/Useful sites for Sphinx docstrings.txt

docs/Fervo_Project_Red.md

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
.. raw:: html
2+
3+
<style type="text/css">
4+
a.image-reference {
5+
max-width: 66%;
6+
}
7+
8+
a.image-reference > img, a.image-reference > img:active {
9+
max-width: 100%;
10+
}
11+
12+
a.image-reference {
13+
display: block;
14+
margin: auto;
15+
align-content: center;
16+
}
17+
</style>
18+
19+
20+
# Fervo Project Red: Evaluating the Gringarten Model against Empirical EGS Data
21+
22+
ℹ️ The GEOPHIRES (Gringarten) model parameters used in this evaluation can be explored and executed via the [Fervo_Project_Red-2026 example in the web interface](https://gtp.scientificwebservices.com/geophires/?geophires-example-id=Fervo_Project_Red-2026).
23+
24+
---
25+
26+
This document[^author] evaluates the accuracy of the analytical GEOPHIRES (Gringarten) reservoir model by comparing it against real-world Enhanced Geothermal Systems (EGS) empirical data from the Fervo Project Red site.
27+
For comparative context, it also includes the predictive temperature curve generated by Fervo's proprietary modeling.
28+
29+
[^author]: Author: Jonathan Pezzino, Scientific Web Services LLC. GitHub profile: [softwareengineerprogrammer](https://github.com/softwareengineerprogrammer).
30+
31+
**Data Source & Methodology Notes:** The empirical production data evaluated here is derived from Figure 5 of Fervo Energy's report, [Enhanced Geothermal Has Been Proven at Scale: Here’s What Two Years of Production Data Show](https://fervoenergy.com/enhanced-geothermal-has-been-proven-at-scale-heres-what-two-years-of-production-data-show/).
32+
It should be noted that this analysis contains inherent limitations: the data points were semi-manually extracted from
33+
the published chart using image processing techniques, which introduces minor digitization artifacts.
34+
35+
Additionally, aligning the data for statistical analysis requires establishing a threshold between the initial
36+
thermal conditioning phase and steady-state operations.
37+
This boundary is an analytical judgment call necessitated by structural differences in the models: the Fervo curve
38+
appears to assume an idealized steady-state flow from inception, omitting the early thermal ramp-up phase entirely.
39+
Conversely, while the GEOPHIRES (Gringarten) model does account for early transient heat transfer, its precision
40+
during this rapid ramp-up is inherently constrained by its temporal resolution (100 time steps per year).
41+
42+
## Production Temperature: Measured vs. Modeled
43+
44+
The charts below plot the measured flowing temperature over a roughly two-year period. Data points captured during early thermal conditioning and transient operations (e.g., shut-ins, flow-rate testing) are rendered in gray and excluded from the steady-state statistical alignment.
45+
46+
![](_images/fervo_project_red-2026_production-temperature-data-vs-modeling-1.png)
47+
48+
*Detail view of the steady-state temperature plateau (175°C–185°C):*
49+
![](_images/fervo_project_red-2026_production-temperature-data-vs-modeling-2.png)
50+
51+
## Statistical Alignment Analysis
52+
53+
The variance analysis (results displayed in legend captions) evaluates the predictive accuracy of both models against the measured steady-state data (excluding the initial thermal conditioning/ramp-up period).
54+
55+
Both models demonstrate high predictive fidelity, tracking steady-state flowing temperatures within 1.5°C of the empirical data.
56+
57+
* **Overall Fit:** GEOPHIRES mathematically achieves a tighter overall fit, yielding a lower Root Mean Square Error (RMSE) and a higher coefficient of determination (R²).
58+
* **Systematic Bias:** The Fervo model exhibits slightly less systemic underestimation, with a cold bias of -0.50°C compared to the GEOPHIRES cold bias of -0.70°C.
59+
* **R² Context:** The relatively low R² values for both models are expected statistical artifacts. Because the steady-state temperature profile is essentially a flat plateau, natural sensor variance and minor reservoir oscillations account for a disproportionately large portion of the total sum of squares, suppressing the R² score despite the low absolute error.
60+
61+
## Modeling Assumptions and Power Production Discrepancies
62+
63+
While the Gringarten model accurately predicts the reservoir's thermal drawdown, translating that thermal energy into net electrical power introduces additional variables.
64+
Users comparing GEOPHIRES power production estimates to Fervo's published net generation may notice discrepancies.
65+
These arise from fundamental differences between an idealized techno-economic model and a real-world, non-commercial operational plant:
66+
67+
* **Commercial Optimization:** Fervo has explicitly noted that Project Red is a non-commercial, non-optimized learning facility designed to prove EGS viability at scale. Its empirical power generation figures reflect this experimental testing phase rather than the maximized output modeled by GEOPHIRES for mature commercial operations.
68+
* **Capacity Factor and Transients:** While the GEOPHIRES model utilizes a 90% capacity factor, this derating is applied continuously across the simulation. Real-world output is subject to discrete transient operational events (such as thermal conditioning, testing, and maintenance shut-ins) which inherently causes the time-averaged power production to diverge temporally from an uninterrupted analytical model.
69+
* **ORC Efficiency:** The power generation results rely on the GEOPHIRES built-in supercritical ORC efficiency correlation, which assumes the selection of an optimal working fluid for each specific geofluid temperature. For further details, please refer to the [Surface Plant section in the Theoretical Basis for GEOPHIRES](Theoretical-Basis-for-GEOPHIRES.html#surface-plant). Real-world net generation is constrained by the specific, fixed surface equipment installed at the site, which may operate below this theoretical optimum. This limitation may be addressed in the future by [FGEM integration](https://github.com/NatLabRockies/GEOPHIRES-X/issues/395).
70+
71+
---
72+
73+
## Previous Versions
74+
75+
1. [Fervo_Norbeck_Latimer_2023](https://gtp.scientificwebservices.com/geophires/?geophires-example-id=Fervo_Norbeck_Latimer_2023)
76+
77+
---
78+
79+
## Disclaimer: Independent Analysis
80+
81+
This case study is an independent techno-economic evaluation developed by the author and contributors to the GEOPHIRES
82+
open-source project. It is not affiliated with, sponsored by, or endorsed by Fervo Energy.
83+
The author and contributors are not employees or agents of Fervo Energy, and this work has not been reviewed or
84+
approved by the company. All modeling assumptions, including those derived from public data sources, represent the
85+
independent interpretation of the author and the GEOPHIRES open-source community and do not constitute proprietary
86+
information or official company projections.
87+
88+
---
89+
90+
## Footnotes

docs/GEOPHIRES-Examples.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,7 @@ or in the [web interface](https://gtp.scientificwebservices.com/geophires) under
88
## Case Study: 500 MW EGS Project Modeled on Fervo Cape Station
99

1010
See documentation: [Case Study: 500 MWe EGS Project Modeled on Fervo Cape Station](Fervo_Project_Cape-5.html).
11+
12+
## Fervo Project Red: Evaluating the Gringarten Model against Empirical EGS Data
13+
14+
See documentation: [Fervo Project Red: Evaluating the Gringarten Model against Empirical EGS Data](Fervo_Project_Red.html).
155 KB
Loading
149 KB
Loading
-3.71 KB
Loading

docs/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Contents
2424

2525
GEOPHIRES-Examples
2626
Fervo_Project_Cape-5
27+
Fervo_Project_Red
2728

2829

2930
.. reference/index

docs/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ sphinx>=1.3
22
sphinx-py3doc-enhanced-theme
33
m2r2
44
Jinja2
5+
opencv-python

setup.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ def read(*names, **kwargs):
9292
# eg:
9393
# "rst": ["docutils>=0.11"],
9494
# ":python_version=="2.6"": ["argparse"],
95-
'development': ['bumpversion', 'sphinx_py3doc_enhanced_theme']
95+
'development': [
96+
'bumpversion',
97+
'sphinx_py3doc_enhanced_theme',
98+
'opencv-python', # generate_fervo_project_red_2026_docs
99+
],
96100
},
97101
)

src/geophires_docs/__init__.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
from __future__ import annotations
22

3+
import json
34
import os
45
from pathlib import Path
56
from typing import Any
67

8+
from pint.facets.plain import PlainQuantity
9+
710
from geophires_x_client import GeophiresInputParameters
11+
from geophires_x_client import GeophiresXClient
12+
from geophires_x_client import GeophiresXResult
813

914

1015
def _get_file_path(file_name) -> Path:
@@ -75,3 +80,28 @@ def _get_input_parameters_dict( # TODO consolidate with FervoProjectCape5TestCa
7580
# TODO preserve newlines
7681

7782
return ret
83+
84+
85+
def _get_full_profile(
86+
input_and_result: tuple[GeophiresInputParameters, GeophiresXResult], profile_key: str
87+
) -> list[PlainQuantity]:
88+
"""
89+
:return: List of data points with length Time steps per year * Plant lifetime
90+
"""
91+
92+
input_params: GeophiresInputParameters = input_and_result[0]
93+
result = GeophiresXClient().get_geophires_result(input_params)
94+
95+
with open(result.json_output_file_path, encoding='utf-8') as f:
96+
full_result_obj = json.load(f)
97+
98+
net_gen_obj = full_result_obj[profile_key]
99+
net_gen_obj_unit = net_gen_obj['CurrentUnits'].replace('CELSIUS', 'degC')
100+
profile = [PlainQuantity(it, net_gen_obj_unit) for it in net_gen_obj['value']]
101+
return profile
102+
103+
104+
def _get_full_production_temperature_profile(
105+
input_and_result: tuple[GeophiresInputParameters, GeophiresXResult],
106+
) -> list[PlainQuantity]:
107+
return _get_full_profile(input_and_result, 'Produced Temperature')

0 commit comments

Comments
 (0)