Skip to content

Commit 1bb8c25

Browse files
templatize reservoir params table
1 parent f6ccfad commit 1bb8c25

6 files changed

Lines changed: 56 additions & 18 deletions

File tree

docs/Fervo_Project_Red.md.jinja

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,13 @@ The baseline data for this evaluation was extracted from Figure 5 of Fervo Energ
6363

6464
The GEOPHIRES Gringarten model utilizes a multiple parallel fracture geometry. The critical inputs defining this geometry for the Project Red simulation are detailed below:
6565

66-
| Parameter | Input Value | Derivation Notes |
66+
| Parameter | Input{{ nbsp }}Value | Derivation Notes |
6767
| :--- | :--- | :--- |
68-
| **Number of Fractures** | `{{ input_params['Number of Fractures'] }}` | Fervo estimates between 75 and 100 fractures were created. This value is de-rated in the model to account for the physical reality of imperfect flow distribution and uneven utilization across the entire stimulated rock volume. |
69-
| **Fracture Shape** | `{{ input_params['Fracture Shape'] }}` | Rectangular geometry (Shape 4), representing standard transverse hydraulic fractures along a horizontal wellbore. |
70-
| **Fracture Height** | `{{ input_params['Fracture Height'] }}` | Estimated vertical propagation of the stimulated fracture network. |
71-
| **Fracture Width** | `{{ input_params['Fracture Width'] }}` | Set to match the distance between the injection and production wellbores, assuming a dipole flow field directly connecting the laterals. |
72-
| **Fracture Separation** | `{{ input_params['Fracture Separation'] }}` | The modeled physical spacing between individual transverse fractures along the lateral section. |
68+
| **Number of Fractures** | `{{ input_params['Number of Fractures'] }}` | {{ input_params_comments['Number of Fractures'] }} |
69+
| **Fracture Shape** | `{{ input_params['Fracture Shape'] }}` | {{ input_params_comments['Fracture Shape'] }} |
70+
| **Fracture Height** | `{{ input_params['Fracture Height'] }}` | {{ input_params_comments['Fracture Height'] }} |
71+
| **Fracture Width** | `{{ input_params['Fracture Width'] }}` | {{ input_params_comments['Fracture Width'] }} |
72+
| **Fracture Separation** | `{{ input_params['Fracture Separation'] }}` | {{ input_params_comments['Fracture Separation'] }} |
7373

7474
*Note: These parameters represent a simplified, homogenized analytical equivalent of a highly complex, heterogeneous subsurface fracture network.*
7575

src/geophires_docs/__init__.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import json
44
import os
5+
import re
56
from pathlib import Path
67
from typing import Any
78

@@ -11,6 +12,8 @@
1112
from geophires_x_client import GeophiresXClient
1213
from geophires_x_client import GeophiresXResult
1314

15+
_NON_BREAKING_SPACE = '\xa0'
16+
1417

1518
def _get_file_path(file_name) -> Path:
1619
return Path(os.path.join(os.path.abspath(os.path.dirname(__file__)), file_name))
@@ -82,6 +85,31 @@ def _get_input_parameters_dict( # TODO consolidate with FervoProjectCape5TestCa
8285
return ret
8386

8487

88+
def _get_input_parameters_comments_dict(_params: GeophiresInputParameters) -> dict[str, str]:
89+
ret: dict[str, str] = {}
90+
91+
with open(_get_file_path('../geophires_x_schema_generator/geophires-request.json'), encoding='utf-8') as f:
92+
request_schema = json.loads(f.read())
93+
94+
input_params_with_comments: dict[str, Any] = _get_input_parameters_dict(_params, include_parameter_comments=True)
95+
for k, v in input_params_with_comments.items():
96+
comment: str = ''
97+
98+
if v is not None and isinstance(v, str) and ',' in v:
99+
if k in request_schema['properties'] and request_schema['properties'][k]['type'] == 'array':
100+
comment = v.split(', --', maxsplit=1)[1]
101+
else:
102+
comment = v.split(',', maxsplit=1)[1]
103+
# Strip ' --' and optional whitespace from the start of the comment
104+
comment = re.sub(r'^\s*--\s*', '', comment)
105+
106+
comment = comment.strip()
107+
108+
ret[k] = comment
109+
110+
return ret
111+
112+
85113
def _get_full_profile(
86114
input_and_result: tuple[GeophiresInputParameters, GeophiresXResult], profile_key: str
87115
) -> list[PlainQuantity]:

src/geophires_docs/generate_fervo_project_cape_5_md.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from jinja2 import FileSystemLoader
1616
from pint.facets.plain import PlainQuantity
1717

18+
from geophires_docs import _NON_BREAKING_SPACE
1819
from geophires_docs import _PROJECT_ROOT
1920
from geophires_docs import _get_fpc5_input_file_path
2021
from geophires_docs import _get_fpc5_result_file_path
@@ -31,7 +32,6 @@
3132
_current_project_root: Path | None = None
3233

3334
_log = _get_logger(__name__)
34-
_NON_BREAKING_SPACE = '\xa0'
3535

3636

3737
def _get_schema(schema_file_name: str) -> dict[str, Any]:

src/geophires_docs/generate_fervo_project_red_2026_docs.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
from scipy.interpolate import interp1d
1111
from scipy.ndimage import maximum_filter
1212

13+
from geophires_docs import _NON_BREAKING_SPACE
1314
from geophires_docs import _PROJECT_ROOT
1415
from geophires_docs import _get_full_production_temperature_profile
16+
from geophires_docs import _get_input_parameters_comments_dict
1517
from geophires_docs import _get_input_parameters_dict
1618
from geophires_docs import _get_logger
1719
from geophires_x_client import GeophiresInputParameters
@@ -401,12 +403,21 @@ def generate_fervo_project_red_2026_md(
401403

402404
result_values: dict[str, Any] = {} # get_result_values(result)
403405

406+
def _get_input_params_dict_with_nbsp() -> dict[str, Any]:
407+
input_params_dict: dict[str, Any] = _get_input_parameters_dict(input_params)
408+
409+
for k, v in input_params_dict.items():
410+
if isinstance(v, str):
411+
input_params_dict[k] = v.replace(' ', _NON_BREAKING_SPACE)
412+
413+
return input_params_dict
414+
404415
# noinspection PyDictCreation
405416
template_values = {
406-
# **get_fpc5_input_parameter_values(input_params, result),
407-
# **_get_input_parameters_dict(input_params),
408-
'input_params': _get_input_parameters_dict(input_params),
417+
'input_params': _get_input_params_dict_with_nbsp(),
418+
'input_params_comments': _get_input_parameters_comments_dict(input_params),
409419
**result_values,
420+
'nbsp': _NON_BREAKING_SPACE,
410421
}
411422

412423
docs_dir = project_root / 'docs'

tests/examples/Fervo_Project_Red-2026.out

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ Simulation Metadata
66
----------------------
77
GEOPHIRES Version: 3.13.1
88
Simulation Date: 2026-04-21
9-
Simulation Time: 08:54
10-
Calculation Time: 1.015 sec
9+
Simulation Time: 09:24
10+
Calculation Time: 1.008 sec
1111

1212
***SUMMARY OF RESULTS***
1313

tests/examples/Fervo_Project_Red-2026.txt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ Reservoir Thermal Conductivity, 2.7
1616
Number of Segments, 1
1717
Gradient 1, 76
1818

19-
Number of Fractures, 65, -- Paper estimates between 75 and 100; value is de-rated to account for imperfect flow across fractured surface area
20-
Fracture Shape, 4, -- per the paper
21-
Fracture Height, 300 foot, -- per the paper
22-
Fracture Width, 365 foot, -- per the paper (distance between wellbores assumes a dipole flow field)
23-
Fracture Separation, 10
19+
Number of Fractures, 65, -- Fervo estimates between 75 and 100 fractures were created. This value is de-rated in the model to account for the physical reality of imperfect flow distribution and uneven utilization across the entire stimulated rock volume.
20+
Fracture Shape, 4, -- Rectangular geometry (Shape 4), representing standard transverse hydraulic fractures along a horizontal wellbore.
21+
Fracture Height, 300 foot, -- Estimated vertical propagation of the stimulated fracture network.
22+
Fracture Width, 365 foot, -- Set to match the distance between the injection and production wellbores, assuming a dipole flow field directly connecting the laterals.
23+
Fracture Separation, 10, -- The modeled physical spacing between individual transverse fractures along the lateral section.
2424

2525
Plant Outlet Pressure, 1500 psi, -- per the paper
2626

@@ -33,7 +33,6 @@ Number of Multilateral Sections, 2, -- Two parallel horizontal sections
3333
Nonvertical Length per Multilateral Section, 3250 feet, -- per the paper
3434

3535
Well Drilling Cost Correlation, 10, -- per the drill cost paper - works out to $400/ft
36-
Horizontal Well Drilling Cost Correlation, 10, -- per the drill cost paper - works out to $400/ft
3736

3837
Production Flow Rate per Well, 36, -- per https://fervoenergy.com/enhanced-geothermal-has-been-proven-at-scale-heres-what-two-years-of-production-data-show/
3938
Production Wellhead Pressure, 225 psi, -- per https://fervoenergy.com/enhanced-geothermal-has-been-proven-at-scale-heres-what-two-years-of-production-data-show/

0 commit comments

Comments
 (0)