Skip to content

Commit 3c7b22d

Browse files
incorporate power generation sensivitity into doc
1 parent 1c9174a commit 3c7b22d

8 files changed

Lines changed: 19 additions & 9 deletions

docs/Fervo_Project_Red.md.jinja

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,9 @@ Both models demonstrate high predictive fidelity, tracking steady-state flowing
178178

179179
<div id="long-term-forecast-section"></div>
180180

181-
### Long-Term Forecast (8-Year Horizon)
181+
### Long-Term Forecast ({{ long_term_forecast_years }}-Year Horizon)
182182

183-
To evaluate the model's predictive behavior over a longer timeframe, the GEOPHIRES simulation was extended to an 8-year horizon.
183+
To evaluate the model's predictive behavior over a longer timeframe, the GEOPHIRES simulation was extended to an {{ long_term_forecast_years }}-year horizon.
184184
This timeframe aligns with the redrilling interval modeled in the [Cape Station case study](Fervo_Project_Cape-5.html)
185185
and provides a plausible view of the anticipated thermal decline before major wellfield intervention would be required.
186186

@@ -225,6 +225,14 @@ While the {{ input_params['Number of Fractures'] }}-fracture baseline is current
225225
estimate based on existing data alignment, time and additional multi-year operational data will ultimately determine
226226
which structural interpretation within this predictive envelope is the most accurate.
227227

228+
To further quantify the impact of these varying fracture geometries, the corresponding average annual net electricity
229+
generation over the {{ long_term_forecast_years }}-year horizon was also evaluated. While the flowing temperatures across all sensitivity cases
230+
essentially converge by year {{ long_term_forecast_years }}, their distinct intermediate thermal decline paths result in measurable differences in
231+
total power output. Utilizing Average Annual Net Electricity Generation (GWh) isolates these aggregate differences,
232+
providing a relative basis for comparing the lifecycle performance of each sensitivity case.
233+
234+
![](_images/fervo_project_red-2026_production-temperature-data-vs-modeling-power-sensitivity.png)
235+
228236
## Discussion
229237

230238
### Evaluating the Predictive Power of Gringarten
-52.6 KB
Loading
-38 KB
Loading
-28.1 KB
Loading
-27.4 KB
Loading
-39.3 KB
Loading
-18 KB
Loading

src/geophires_docs/generate_fervo_project_red_2026_docs.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from typing import Any
55

66
import cv2
7+
import matplotlib.patches as mpatches
78
import matplotlib.pyplot as plt
89
import numpy as np
910
import pandas as pd
@@ -509,9 +510,9 @@ def _generate_fracture_sensitivity_graph(
509510
show_excluded_measured_temperatures: bool = False,
510511
calculate_stats: bool = True,
511512
) -> pd.DataFrame:
512-
import matplotlib.patches as mpatches
513-
514-
_log.info('Running 8-year fracture sensitivity analysis (including power generation)...')
513+
_log.info(
514+
f'Running {_LONG_TERM_FORECAST_PLANT_LIFETIME_YEARS}-year fracture sensitivity analysis (including power generation)...'
515+
)
515516

516517
is_steady_state = _get_steady_state_mask(df_prod, steady_state_start_years)
517518

@@ -613,7 +614,7 @@ def _generate_fracture_sensitivity_graph(
613614
final_temp_degc = float(geophires_y[-1]) if geophires_y else 0.0
614615
power_data.append(
615616
{
616-
'Number of Fractures': frac_count,
617+
number_of_fractures_param_name: frac_count,
617618
#'Average Net Electricity Production (MW)': avg_generation_v,
618619
f'{avg_generation_param} ({avg_generation_u})': avg_generation_v,
619620
f'Year {_LONG_TERM_FORECAST_PLANT_LIFETIME_YEARS} Flowing Temperature (°C)': final_temp_degc,
@@ -672,16 +673,16 @@ def _savefig(version: int | str) -> None:
672673
plt.close(fig)
673674

674675
df_power = pd.DataFrame(power_data)
675-
df_power = df_power.sort_values('Number of Fractures').reset_index(drop=True)
676+
df_power = df_power.sort_values(number_of_fractures_param_name).reset_index(drop=True)
676677
df_power.to_csv(power_csv_path, index=False)
677678

678679
fig_pwr, ax_pwr = plt.subplots(figsize=(8, 5))
679-
x_labels = [str(x) for x in df_power['Number of Fractures']]
680+
x_labels = [str(x) for x in df_power[number_of_fractures_param_name]]
680681
y_values = df_power[f'{avg_generation_param} ({avg_generation_u})']
681682

682683
bars = ax_pwr.bar(x_labels, y_values, color='#1f77b4', alpha=0.8, edgecolor='black')
683684

684-
baseline_idx = df_power.index[df_power['Number of Fractures'] == base_number_of_fractures].tolist()[0]
685+
baseline_idx = df_power.index[df_power[number_of_fractures_param_name] == base_number_of_fractures].tolist()[0]
685686
bars[baseline_idx].set_color('green')
686687
bars[baseline_idx].set_edgecolor('black')
687688

@@ -762,6 +763,7 @@ def _get_input_params_dict_with_nbsp() -> dict[str, Any]:
762763
'geophires_rmse_degc': f'{geophires_stats_alignment.rmse_degc:.2f}',
763764
'geophires_r2': f'{geophires_stats_alignment.r2:.4f}',
764765
'geophires_bias_degc': f'{geophires_stats_alignment.bias_degc:.2f}',
766+
'long_term_forecast_years': _LONG_TERM_FORECAST_PLANT_LIFETIME_YEARS,
765767
}
766768

767769
# Set up Jinja environment

0 commit comments

Comments
 (0)