Skip to content

Commit 76f9b18

Browse files
Rollback support for multiple construction years for SAM-EM for now. Meaningful and logically/conceptually consistent support will require deeper changes than just auto-calculating inflation costs, such as accounting for cost of construction financing. Created tracking issue NREL#406
1 parent afee41d commit 76f9b18

8 files changed

+56
-17
lines changed

docs/Fervo_Project_Cape-4.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,14 @@ in source code for the full set of inputs.
5454
| Fraction of Investment in Bonds (percent debt vs. equity) | 60% | Approximate remaining percentage of CAPEX with $1 billion sponsor equity per Matson, 2024. Note that this source says that Fervo ultimately wants to target "15% sponsor equity, 15% bridge loan, and 70% construction to term loans", but this case study does not attempt to model that capital structure. |
5555
| Exploration Capital Cost | $30M | Estimate significantly higher exploration costs than default correlation in consideration of potential risks associated with second/third/fourth-of-a-kind EGS projects |
5656
| Investment Tax Credit Rate (ITC) | 30% | Same as 400 MWe case study (Fervo_Project_Cape-3) |
57-
| Inflation Rate During Construction | 15% | Models a higher annual inflation rate (4.769%) over the 3-year construction period as a hedge against short-term inflation volatility. |
57+
| Inflation Rate During Construction | 15% | Conservatively models the equivalent of a higher annual inflation rate (4.769%) over a 3-year period as a hedge against construction delays and short-term inflation volatility. |
5858

5959
### Technical & Engineering Parameters
6060

6161
| Parameter | Input Value(s) | Source |
6262
|-------------------------------|----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
6363
| Plant Lifetime | 30 years | 30-year well life per Fervo Energy, 2025 (Geothermal Mythbusting: Water Use and Impacts). |
64-
| Construction time | 3 years | Calibrated to a 2-6 year construction time for a 1 GW plant (Yusifov & Enriquez, 2025). |
64+
| Construction time | 1 year | Calibrated to a 26 year construction time for a 1 GW plant (Yusifov & Enriquez, 2025). Note that the Inflation Rate During Construction parameter hedges against potential construction delays. |
6565
| Well diameter | 9⅝ inches | Next standard size up from 7", implied by announcement of "increasing casing diameter" |
6666
| Flow Rate per Production Well | 107 kg/s | Fercho et al, 2025 models reservoir performance using 100 kg/s per well. The announced increased casing diameter implies higher flow rates, so the case study uses the maximum flow rate achieved at Cape Station of 107 kg/s per Fervo Energy, 2024. |
6767
| Number of Doublets | 59 | Estimate based on extrapolation from previous case studies including [Project Red](https://gtp.scientificwebservices.com/geophires/?geophires-example-id=Fervo_Norbeck_Latimer_2023) and [Fervo_Project_Cape-3](https://gtp.scientificwebservices.com/geophires/?geophires-example-id=Fervo_Project_Cape-3) |

docs/SAM-Economic-Models.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ The following table describes how GEOPHIRES parameters are transformed into SAM
4848
### Limitations
4949

5050
1. Only Electricity end-use is supported
51+
2. Only 1 construction year is supported. Note that the `Inflation Rate During Construction` parameter can be used to partially account for longer construction periods.
5152

5253
## Using SAM Economic Models with Existing GEOPHIRES Inputs
5354

src/geophires_x/EconomicsSam.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,15 @@ def _inv_msg(param_name: str, invalid_value: Any, supported_description: str) ->
9292
)
9393
)
9494

95+
if model.surfaceplant.construction_years.value != 1:
96+
raise ValueError(
97+
_inv_msg(
98+
model.surfaceplant.construction_years.Name,
99+
model.surfaceplant.construction_years.value,
100+
f'{model.surfaceplant.construction_years.Name} = 1',
101+
)
102+
)
103+
95104
gtr: floatParameter = model.economics.GTR
96105
if gtr.Provided:
97106
model.logger.warning(

src/geophires_x/EconomicsSamCashFlow.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ def _calculate_sam_economics_cash_flow(model: Model, single_owner: Singleowner)
2222
_soo = single_owner.Outputs
2323

2424
profile = []
25+
26+
# TODO this and/or related logic will need to be adjusted when multiple construction years are supported
27+
# https://github.com/NREL/GEOPHIRES-X/issues/406
2528
total_duration = model.surfaceplant.plant_lifetime.value + model.surfaceplant.construction_years.value
2629

2730
# Prefix with 'Year ' partially as workaround for tabulate applying float formatting to ints, possibly related

tests/examples/Fervo_Project_Cape-4.out

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44

55
Simulation Metadata
66
----------------------
7-
GEOPHIRES Version: 3.9.40
8-
Simulation Date: 2025-07-26
9-
Simulation Time: 14:13
10-
Calculation Time: 1.709 sec
7+
GEOPHIRES Version: 3.9.41
8+
Simulation Date: 2025-07-27
9+
Simulation Time: 11:26
10+
Calculation Time: 1.738 sec
1111

1212
***SUMMARY OF RESULTS***
1313

@@ -212,8 +212,8 @@ Simulation Metadata
212212
***************************
213213
* SAM CASH FLOW PROFILE *
214214
***************************
215-
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
216-
Year 0 Year 1 Year 2 Year 3 Year 4 Year 5 Year 6 Year 7 Year 8 Year 9 Year 10 Year 11 Year 12 Year 13 Year 14 Year 15 Year 16 Year 17 Year 18 Year 19 Year 20 Year 21 Year 22 Year 23 Year 24 Year 25 Year 26 Year 27 Year 28 Year 29 Year 30 Year 31 Year 32
215+
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
216+
Year 0 Year 1 Year 2 Year 3 Year 4 Year 5 Year 6 Year 7 Year 8 Year 9 Year 10 Year 11 Year 12 Year 13 Year 14 Year 15 Year 16 Year 17 Year 18 Year 19 Year 20 Year 21 Year 22 Year 23 Year 24 Year 25 Year 26 Year 27 Year 28 Year 29 Year 30
217217
ENERGY
218218
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
219219
Electricity from grid (kWh) 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
@@ -430,4 +430,4 @@ Reserves major equipment 3 balance ($) 0 0 0
430430
Reserves total reserves balance ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
431431
Interest on reserves (%/year) 1.75
432432
Interest earned on reserves ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
433-
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
433+
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

tests/examples/Fervo_Project_Cape-4.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Inflated Bond Interest Rate, .056
1818

1919
Inflation Rate, .023, -- US inflation as of April 2025
2020
Inflation Rate During Construction, 0.15, -- Models a higher annual inflation rate (4.769%) over the 3-year construction period as a hedge against short-term inflation volatility.
21-
Construction Years, 3, -- Calibrated to a 2-6 year construction time for a 1 GW plant (Yusifov & Enriquez, 2025)
21+
Construction Years, 1, -- Calibrated to a 2-6 year construction time for a 1 GW plant (Yusifov & Enriquez, 2025)
2222

2323

2424
Combined Income Tax Rate, .28

tests/geophires_x_tests/generic-egs-case-3_no-inflation-rate-during-construction.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,7 @@ Electricity Escalation Rate Per Year, 0.004053223
3939
Electricity Escalation Start Year, 1
4040
Fraction of Investment in Bonds, .5
4141
Combined Income Tax Rate, .3
42-
Gross Revenue Tax Rate, 0
4342
Inflated Bond Interest Rate, .05
44-
Inflated Equity Interest Rate, .08
4543
Inflation Rate, .02
4644
Investment Tax Credit Rate, .3, -- https://programs.dsireusa.org/system/program/detail/658
4745
Production Tax Credit Electricity, 0.0275, -- https://programs.dsireusa.org/system/program/detail/734

tests/geophires_x_tests/test_economics_sam.py

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,17 @@ def test_only_electricity_end_use_supported(self):
198198

199199
self.assertIn('Invalid End-Use Option (Direct-Use Heat)', str(e.exception))
200200

201-
def test_multiple_construction_years_supported(self):
202-
self.assertIsNotNone(self._get_result({'Construction Years': 2}))
201+
def test_only_1_construction_year_supported(self):
202+
# TODO remove this test and uncomment test_multiple_construction_years_supported below once multiple
203+
# construction years are supported https://github.com/NREL/GEOPHIRES-X/issues/406
204+
with self.assertRaises(RuntimeError) as e:
205+
self._get_result({'Construction Years': 2})
206+
207+
self.assertIn('Invalid Construction Years (2)', str(e.exception))
208+
self.assertIn('SAM_SINGLE_OWNER_PPA only supports Construction Years = 1.', str(e.exception))
209+
210+
# def test_multiple_construction_years_supported(self):
211+
# self.assertIsNotNone(self._get_result({'Construction Years': 2}))
203212

204213
def test_ppa_pricing_model(self):
205214
self.assertListEqual(
@@ -527,23 +536,42 @@ def _accrued_financing(_r: GeophiresXResult) -> float:
527536
return _r.result['ECONOMIC PARAMETERS']['Accrued financing during construction']['value']
528537

529538
params1 = {
530-
'Construction Years': 3,
539+
'Construction Years': 1,
531540
'Inflation Rate': 0.04769,
532541
}
533542
r1: GeophiresXResult = self._get_result(
534543
params1, file_path=self._get_test_file_path('generic-egs-case-3_no-inflation-rate-during-construction.txt')
535544
)
536-
self.assertEqual(15.0, _accrued_financing(r1))
545+
self.assertAlmostEqual(4.769, _accrued_financing(r1), places=1)
537546

538547
params2 = {
539-
'Construction Years': 3,
548+
'Construction Years': 1,
540549
'Inflation Rate During Construction': 0.15,
541550
}
542551
r2: GeophiresXResult = self._get_result(
543552
params2, file_path=self._get_test_file_path('generic-egs-case-3_no-inflation-rate-during-construction.txt')
544553
)
545554
self.assertEqual(15.0, _accrued_financing(r2))
546555

556+
# TODO enable when multiple construction years are supported https://github.com/NREL/GEOPHIRES-X/issues/406
557+
# params3 = {
558+
# 'Construction Years': 3,
559+
# 'Inflation Rate': 0.04769,
560+
# }
561+
# r3: GeophiresXResult = self._get_result(
562+
# params3, file_path=self._get_test_file_path('generic-egs-case-3_no-inflation-rate-during-construction.txt')
563+
# )
564+
# self.assertEqual(15.0, _accrued_financing(r3))
565+
#
566+
# params4 = {
567+
# 'Construction Years': 3,
568+
# 'Inflation Rate During Construction': 0.15,
569+
# }
570+
# r4: GeophiresXResult = self._get_result(
571+
# params4, file_path=self._get_test_file_path('generic-egs-case-3_no-inflation-rate-during-construction.txt')
572+
# )
573+
# self.assertEqual(15.0, _accrued_financing(r4))
574+
547575
@staticmethod
548576
def _new_model(input_file: Path, additional_params: dict[str, Any] | None = None, read_and_calculate=True) -> Model:
549577
if additional_params is not None:

0 commit comments

Comments
 (0)