Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
3fdbca1
Partially clean up and mark TODOs for HeatkWhProduced output (no beha…
softwareengineerprogrammer Mar 27, 2026
1b67476
WIP - example_SAM-single-owner-PPA-7_heat for CHP
softwareengineerprogrammer Mar 27, 2026
4765379
fix degradation type check
softwareengineerprogrammer Mar 27, 2026
f18b649
handle potential TotalkWhProduced unit conversion in _get_utility_rat…
softwareengineerprogrammer Mar 27, 2026
c869ad5
regenerate example_SAM-single-owner-PPA-7_heat with corrected degrada…
softwareengineerprogrammer Mar 27, 2026
d5744c2
rename to example_SAM-single-owner-PPA-7_chp, update validate_read_pa…
softwareengineerprogrammer Mar 27, 2026
2f7d7f6
support cooling revenue
softwareengineerprogrammer Mar 27, 2026
e47a9c5
WIP - add example_SAM-single-owner-PPA-8_heat
softwareengineerprogrammer Mar 27, 2026
74b1f65
test_direct_use_heat_end_use_supported
softwareengineerprogrammer Mar 28, 2026
5945749
remove redundant statement
softwareengineerprogrammer Mar 28, 2026
9d2dc22
temporarily work around capex_total_per_kw_q calculation when no elec…
softwareengineerprogrammer Mar 28, 2026
6a28410
WIP - wiring up capacity payment revenue sources
softwareengineerprogrammer Mar 28, 2026
78477db
continued WIP on capacity payment revenue source line items in cash f…
softwareengineerprogrammer Mar 28, 2026
a1fc61e
heat price/amount
softwareengineerprogrammer Mar 28, 2026
5352020
regenerate capacity payment examples
softwareengineerprogrammer Mar 28, 2026
23ff8b8
round revenue USD to match SAM convention
softwareengineerprogrammer Mar 29, 2026
9b799b6
use correct HeatkWhProduced output (not HeatProduced)
softwareengineerprogrammer Mar 29, 2026
6d95b27
example_SAM-single-owner-PPA-9_cooling
softwareengineerprogrammer Mar 29, 2026
ded34de
include saved carbon production line item
softwareengineerprogrammer Mar 29, 2026
5d585be
update calculate_cashflow docstring
softwareengineerprogrammer Mar 29, 2026
fefd706
consolidate _get_capacity_payment_parameters and _get_capacity_paymen…
softwareengineerprogrammer Mar 29, 2026
cb3a41d
render USD prices as $
softwareengineerprogrammer Mar 29, 2026
1d304bb
remove addressed FIXME WIPs
softwareengineerprogrammer Mar 29, 2026
797f00c
address backfill_lcoe_nominal FIXME WIP - set LCOE line item to NaN f…
softwareengineerprogrammer Mar 29, 2026
6df5a63
address backfill_lppa_metrics FIXME WIP - set LPPA to NaN for direct-…
softwareengineerprogrammer Mar 29, 2026
bfe567a
EndUseOptions is_cogeneration_end_use_option and has_electricity_comp…
softwareengineerprogrammer Mar 29, 2026
6f149d6
fix backfill_lppa_metrics (error introduced in 6df5a630d9b9f6718075bf…
softwareengineerprogrammer Mar 29, 2026
2f203ed
skip calculating SAM-EM LCOE for non-electricity end-use option; rege…
softwareengineerprogrammer Mar 29, 2026
b263b72
clean up inaccurate PumpingkWh internal name (no behavioral change)
softwareengineerprogrammer Mar 29, 2026
a89c709
chp_percent_cost_allocation_for_electrical_plant derived output param…
softwareengineerprogrammer Mar 30, 2026
bf21060
code cleaup during audit of output correctness for SAM-EM + non-elect…
softwareengineerprogrammer Mar 30, 2026
d98267e
log error if economic model is unrecognized in LCOE/LCOH/LCOC calcula…
softwareengineerprogrammer Mar 30, 2026
3c7a53c
minor code cleanup/formatting in CalculateLCOELCOHLCOC
softwareengineerprogrammer Mar 30, 2026
23cfa71
fix issues in Outputs.py introduced in recent commits
softwareengineerprogrammer Mar 30, 2026
4401592
WIP - LCOH calculation in SAM cash flow profile
softwareengineerprogrammer Mar 30, 2026
994b85c
working-ish impl of LCOH insertion into SAM cash flow profile - WIP o…
softwareengineerprogrammer Mar 30, 2026
460f7dc
set CAPEX_heat_electricity_plant_ratio for end use options
softwareengineerprogrammer Mar 31, 2026
d4c76d4
break out EconomicsSamCalculations.py
softwareengineerprogrammer Mar 31, 2026
bae714d
WIP - Present value of annual heat costs ($) line item
softwareengineerprogrammer Mar 31, 2026
329f28a
WIP - Present value of annual heat provided (kWh) line item
softwareengineerprogrammer Mar 31, 2026
8ade446
regen example_SAM-single-owner-PPA-7/8
softwareengineerprogrammer Mar 31, 2026
62a3728
LCOH line items in MMBTU
softwareengineerprogrammer Mar 31, 2026
2195473
populate case report LCOH
softwareengineerprogrammer Mar 31, 2026
9b2e018
increase test_hip_ra_monte_carlo threshold
softwareengineerprogrammer Apr 1, 2026
c9216a5
remove redundant _get_ret_row_index
softwareengineerprogrammer Apr 1, 2026
3fdb895
minor code reorganization/cleanup
softwareengineerprogrammer Apr 1, 2026
91f678b
WIP - add PV of annual energy (electricity costs), pivoting to using …
softwareengineerprogrammer Apr 1, 2026
c812574
calculate LCOE based on PV of annual energy (electricity only) costs
softwareengineerprogrammer Apr 1, 2026
a2d0b74
minor - rounding
softwareengineerprogrammer Apr 1, 2026
136f5b5
regen non-Fervo SAM-EM examples
softwareengineerprogrammer Apr 1, 2026
251324b
code cleanup
softwareengineerprogrammer Apr 1, 2026
acd8e51
WIP - parameterizing backfill_lcoh_nominal for re-use with LCOC
softwareengineerprogrammer Apr 1, 2026
df5531a
insert_non_electricity_levelized_metrics parameterized & genericized …
softwareengineerprogrammer Apr 1, 2026
631adb3
insert_lcoc_metrics
softwareengineerprogrammer Apr 1, 2026
0548958
insert LCOC metrics in cash flow and include in case report
softwareengineerprogrammer Apr 1, 2026
9e1b451
regen Fervo_Project_Cape-{4,5,6}
softwareengineerprogrammer Apr 1, 2026
f4c1188
Merge pull request #144 from softwareengineerprogrammer/lcoh-lcoc-sam…
softwareengineerprogrammer Apr 1, 2026
e8c5272
add config and credentials to .aiexclude
softwareengineerprogrammer Apr 1, 2026
57f04d2
example14_data-center CHP update (WIP)
softwareengineerprogrammer Apr 1, 2026
a06d8b6
add example14_data-center AC add-on back on to model CAPEX only
softwareengineerprogrammer Apr 2, 2026
154d534
_insert_calculated_levelized_metrics_line_items code cleanup
softwareengineerprogrammer Apr 2, 2026
823f928
resolve dc example FIXME re correct heat price/rate parameter (remove…
softwareengineerprogrammer Apr 2, 2026
64e5dc7
Injection temperature documentation in tooltip text. (Redundant/overl…
softwareengineerprogrammer Apr 2, 2026
9b39280
make SAM-EM capacity payment price vectors consistent with SAM PPA pr…
softwareengineerprogrammer Apr 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .aiexclude
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
*.env
credentials
config
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# pre-commit install --install-hooks
# To update the versions:
# pre-commit autoupdate
exclude: '^(\.tox|ci/templates|\.bumpversion\.cfg|src/geophires_x(?!/(GEOPHIRESv3|EconomicsSam|EconomicsSamCashFlow|EconomicsUtils|EconomicsSamPreRevenue|SurfacePlantUtils|NumpyUtils|UPPReservoir)\.py))(/|$)'
exclude: '^(\.tox|ci/templates|\.bumpversion\.cfg|src/geophires_x(?!/(GEOPHIRESv3|EconomicsSam|EconomicsSamCashFlow|EconomicsUtils|EconomicsSamPreRevenue|EconomicsSamCalculations|SurfacePlantUtils|NumpyUtils|UPPReservoir)\.py))(/|$)'
# Note the order is intentional to avoid multiple passes of the hooks
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
Expand Down
132 changes: 84 additions & 48 deletions src/geophires_x/Economics.py

Large diffs are not rendered by default.

579 changes: 161 additions & 418 deletions src/geophires_x/EconomicsSam.py

Large diffs are not rendered by default.

627 changes: 627 additions & 0 deletions src/geophires_x/EconomicsSamCalculations.py

Large diffs are not rendered by default.

22 changes: 21 additions & 1 deletion src/geophires_x/EconomicsUtils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from geophires_x.GeoPHIRESUtils import is_float, is_int
from geophires_x.Parameter import OutputParameter, SCHEDULE_DSL_MULTIPLIER_SYMBOL
from geophires_x.Units import Units, PercentUnit, TimeUnit, CurrencyUnit, CurrencyFrequencyUnit
from geophires_x.Units import Units, PercentUnit, TimeUnit, CurrencyUnit, CurrencyFrequencyUnit, EnergyCostUnit

CONSTRUCTION_CAPEX_SCHEDULE_PARAMETER_NAME = 'Construction CAPEX Schedule'

Expand Down Expand Up @@ -50,6 +50,26 @@ def BuildPricingModel(
return Price


def lcoh_output_parameter() -> OutputParameter:
return OutputParameter(
Name="LCOH",
display_name='Direct-Use heat breakeven price (LCOH)',
UnitType=Units.ENERGYCOST,
PreferredUnits=EnergyCostUnit.DOLLARSPERMMBTU, # $/MMBTU
CurrentUnits=EnergyCostUnit.DOLLARSPERMMBTU,
)


def lcoc_output_parameter() -> OutputParameter:
return OutputParameter(
Name="LCOC",
display_name='Direct-Use Cooling Breakeven Price (LCOC)',
UnitType=Units.ENERGYCOST,
PreferredUnits=EnergyCostUnit.DOLLARSPERMMBTU,
CurrentUnits=EnergyCostUnit.DOLLARSPERMMBTU,
)


_SAM_EM_MOIC_RETURNS_TAX_QUALIFIER = 'after-tax'


Expand Down
12 changes: 12 additions & 0 deletions src/geophires_x/OptionList.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,18 @@ class EndUseOptions(GeophiresInputEnum):
COGENERATION_PARALLEL_EXTRA_HEAT = 51, f'Cogeneration Parallel Cycle, {_EXTRA_HEAT_SNIPPET}'
COGENERATION_PARALLEL_EXTRA_ELECTRICITY = 52, f'Cogeneration Parallel Cycle, {_EXTRA_ELECTRICITY_SNIPPET}'

@property
def is_cogeneration_end_use_option(self) -> bool:
return self.name.startswith('COGENERATION')

@property
def has_electricity_component(self) -> bool:
return self == self.ELECTRICITY or self.is_cogeneration_end_use_option

@property
def has_direct_use_heat_component(self) -> bool:
return self == self.HEAT or self.is_cogeneration_end_use_option

@staticmethod
def from_input_string(input_string: str) -> 'EndUseOptions':
"""
Expand Down
77 changes: 45 additions & 32 deletions src/geophires_x/Outputs.py

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/geophires_x/SUTRAOutputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ def PrintOutputs(self, model: Model):
f.write(f" Average Annual Auxiliary Heating Production: {np.average(model.surfaceplant.AnnualAuxiliaryHeatProduced.value):10.2f} " + model.surfaceplant.AnnualAuxiliaryHeatProduced.PreferredUnits.value + NL)
f.write(f" Average Annual Total Heating Production: {np.average(model.surfaceplant.AnnualTotalHeatProduced.value):10.2f} " + model.surfaceplant.AnnualTotalHeatProduced.PreferredUnits.value + NL)
f.write(f" Average Pumping Power: {np.average(model.wellbores.PumpingPower.value):10.2f} {model.wellbores.PumpingPower.CurrentUnits.value}{NL}")
f.write(f" Average Annual Electricity Use for Pumping: {np.average(model.surfaceplant.PumpingkWh.value):10.2f} " + model.surfaceplant.PumpingkWh.PreferredUnits.value + NL)
f.write(f" Average {model.surfaceplant.PumpingkWh.display_name}: {np.average(model.surfaceplant.PumpingkWh.value):10.2f} {model.surfaceplant.PumpingkWh.CurrentUnits.value}\n")
f.write(NL)
f.write(NL)
f.write(' ***CAPITAL COSTS (M$)***\n')
Expand Down
14 changes: 0 additions & 14 deletions src/geophires_x/SUTRAWellBores.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,20 +103,6 @@ def __init__(self, model: Model):
'pressure drop in the reservoir between injection well and production well (see docs)',
)

self.Tinj = self.ParameterDict[self.Tinj.Name] = floatParameter(
"Injection Temperature",
value=70.0,
DefaultValue=70.0,
Min=0.0,
Max=200.0,
UnitType=Units.TEMPERATURE,
PreferredUnits=TemperatureUnit.CELSIUS,
CurrentUnits=TemperatureUnit.CELSIUS,
Required=True,
ErrMessage="assume default injection temperature (70 deg.C)",
ToolTipText="Constant geofluid injection temperature at injection wellhead.",
)

# local variable initiation
sclass = str(__class__).replace("<class \'", "")
self.MyClass = sclass.replace("\'>", "")
Expand Down
24 changes: 18 additions & 6 deletions src/geophires_x/SurfacePlant.py
Original file line number Diff line number Diff line change
Expand Up @@ -397,8 +397,8 @@ def __init__(self, model: Model):
PreferredUnits=EnergyCostUnit.DOLLARSPERKWH,
CurrentUnits=EnergyCostUnit.DOLLARSPERKWH,
ErrMessage="assume default electricity rate ($0.07/kWh)",
ToolTipText="Price of electricity to calculate pumping costs in direct-use heat only mode or revenue" +
" from electricity sales in CHP mode."
ToolTipText="Price of electricity to calculate pumping costs in direct-use heat only mode or revenue "
"from electricity sales in CHP mode."
)
self.heat_price = self.ParameterDict[self.heat_price.Name] = floatParameter(
"Heat Rate",
Expand Down Expand Up @@ -532,7 +532,7 @@ def __init__(self, model: Model):
CurrentUnits=EnergyFrequencyUnit.GWPERYEAR
)
self.PumpingkWh = self.OutputParameterDict[self.PumpingkWh.Name] = OutputParameter(
Name="annual electricity production",
Name="Annual Electricity Use for Pumping",
UnitType=Units.ENERGYFREQUENCY,
PreferredUnits=EnergyFrequencyUnit.KWPERYEAR,
CurrentUnits=EnergyFrequencyUnit.KWPERYEAR
Expand All @@ -550,6 +550,13 @@ def __init__(self, model: Model):
PreferredUnits=PowerUnit.MW,
CurrentUnits=PowerUnit.MW
)
self.NetElectricityProducedMax = self.OutputParameterDict[self.NetElectricityProducedMax.Name] = OutputParameter(
Name="Maximum Net Electricity Generation",
UnitType=Units.POWER,
PreferredUnits=PowerUnit.MW,
CurrentUnits=PowerUnit.MW
)

self.TotalkWhProduced = self.OutputParameterDict[self.TotalkWhProduced.Name] = OutputParameter(
Name="Total Electricity Generation",
UnitType=Units.ENERGY,
Expand Down Expand Up @@ -591,9 +598,11 @@ def __init__(self, model: Model):
)
self.HeatkWhProduced = self.OutputParameterDict[self.HeatkWhProduced.Name] = OutputParameter(
Name="Heat Produced in kWh",
UnitType=Units.POWER,
PreferredUnits=PowerUnit.KW,
CurrentUnits=PowerUnit.KW
# display_name='Average Annual Heat Production',
UnitType=Units.ENERGY,
CurrentUnits=EnergyUnit.KWH,
# PreferredUnits=EnergyUnit.GWH,
PreferredUnits=EnergyUnit.KWH
)
self.Availability = self.OutputParameterDict[self.Availability.Name] = OutputParameter(
Name="Geofluid Availability",
Expand Down Expand Up @@ -750,3 +759,6 @@ def _calculate_derived_outputs(self, model: Model) -> None:
self.heat_to_power_conversion_efficiency.value = avg_efficiency

self.enduse_option_output.value = self.enduse_option.value.value

self.NetElectricityProducedMax.value = np.max(self.NetElectricityProduced.quantity()).to(
self.NetElectricityProducedMax.CurrentUnits).magnitude
1 change: 1 addition & 0 deletions src/geophires_x/SurfacePlantSUTRA.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ def __init__(self, model: Model):

self.PumpingkWh = self.OutputParameterDict[self.PumpingkWh.Name] = OutputParameter(
Name="Annual Pumping Electricity Required",
display_name='Annual Electricity Use for Pumping',
UnitType=Units.ENERGYFREQUENCY,
PreferredUnits=EnergyFrequencyUnit.KWhPERYEAR,
CurrentUnits=EnergyFrequencyUnit.KWhPERYEAR
Expand Down
27 changes: 26 additions & 1 deletion src/geophires_x/WellBores.py
Original file line number Diff line number Diff line change
Expand Up @@ -874,7 +874,32 @@ def __init__(self, model: Model):
CurrentUnits=TemperatureUnit.CELSIUS,
Required=True,
ErrMessage="assume default injection temperature (70 deg.C)",
ToolTipText="Constant geofluid injection temperature at injection wellhead."
ToolTipText="Constant geofluid injection temperature at injection wellhead. "
"This is the temperature to which the geofluid is cooled before being reinjected into "
"the reservoir. It directly affects total heat extraction: "
"HeatExtracted = flow_rate * cp * (ProducedTemperature - InjectionTemperature). "
"For direct-use heat end-use options (including heat pump, absorption chiller, and district "
"heating), this parameter directly controls how much thermal energy is extracted from the "
"geofluid for the surface application. A lower injection temperature means more heat is "
"extracted. "
"For end-use options with a power plant (electricity, CHP), the model calculates a "
"reinjection temperature from power plant correlations representing the thermodynamic "
"optimum exhaust temperature. If the provided injection temperature exceeds the "
"model-calculated reinjection temperature, the provided value is ignored and the "
"model-calculated value is used instead (a warning will be logged). "
"For pure electricity end-use, the injection temperature does not affect electricity "
"production; it only affects heat extraction accounting and First Law Efficiency reporting. "
"Providing an injection temperature lower than the model-calculated reinjection temperature "
"represents additional thermal losses between the power plant and the injection wellhead "
"(e.g. surface piping losses). "
"For CHP topping cycle configurations, providing an injection temperature lower than the "
"model-calculated reinjection temperature is necessary to model direct-use heat extraction; "
"the difference between the reinjection temperature and the injection temperature determines "
"the heat available for the direct-use application. If not provided (or if the default "
"exceeds the model-calculated reinjection temperature), the direct-use heat component will "
"be approximately zero."
# TODO re-assess tooltip text when FGEM is incorporated
# https://github.com/NatLabRockies/GEOPHIRES-X/issues/395?title=FGEM/flexible+geothermal+systems
)
self.Phydrostatic = self.ParameterDict[self.Phydrostatic.Name] = floatParameter(
"Reservoir Hydrostatic Pressure",
Expand Down
2 changes: 1 addition & 1 deletion src/geophires_x_schema_generator/geophires-request.json
Original file line number Diff line number Diff line change
Expand Up @@ -773,7 +773,7 @@
"maximum": 393700
},
"Injection Temperature": {
"description": "Constant geofluid injection temperature at injection wellhead.",
"description": "Constant geofluid injection temperature at injection wellhead. This is the temperature to which the geofluid is cooled before being reinjected into the reservoir. It directly affects total heat extraction: HeatExtracted = flow_rate * cp * (ProducedTemperature - InjectionTemperature). For direct-use heat end-use options (including heat pump, absorption chiller, and district heating), this parameter directly controls how much thermal energy is extracted from the geofluid for the surface application. A lower injection temperature means more heat is extracted. For end-use options with a power plant (electricity, CHP), the model calculates a reinjection temperature from power plant correlations representing the thermodynamic optimum exhaust temperature. If the provided injection temperature exceeds the model-calculated reinjection temperature, the provided value is ignored and the model-calculated value is used instead (a warning will be logged). For pure electricity end-use, the injection temperature does not affect electricity production; it only affects heat extraction accounting and First Law Efficiency reporting. Providing an injection temperature lower than the model-calculated reinjection temperature represents additional thermal losses between the power plant and the injection wellhead (e.g. surface piping losses). For CHP topping cycle configurations, providing an injection temperature lower than the model-calculated reinjection temperature is necessary to model direct-use heat extraction; the difference between the reinjection temperature and the injection temperature determines the heat available for the direct-use application. If not provided (or if the default exceeds the model-calculated reinjection temperature), the direct-use heat component will be approximately zero.",
"type": "number",
"units": "degC",
"category": "Well Bores",
Expand Down
12 changes: 10 additions & 2 deletions src/geophires_x_schema_generator/geophires-result.json
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,11 @@
"description": "The time at which cumulative cash flow reaches zero. For projects that never pay back, the calculated value will be \"N/A\". For SAM Economic Models, this is Simple Payback Period (SPB): the time at which cumulative non-discounted cash flow reaches zero, calculated using non-discounted after-tax net cash flow. See https://samrepo.nrelcloud.org/help/mtf_payback.html for important considerations regarding the limitations of this metric.",
"units": "yr"
},
"CHP: Percent cost allocation for electrical plant": {},
"CHP: Percent cost allocation for electrical plant": {
"type": "number",
"description": "CHP Electrical Plant Cost Allocation Ratio (cost electrical plant/total CAPEX)",
"units": "%"
},
"Estimated Jobs Created": {
"type": "number",
"description": "",
Expand Down Expand Up @@ -565,7 +569,11 @@
"Average Total Electricity Generation": {},
"Minimum Total Electricity Generation": {},
"Initial Total Electricity Generation": {},
"Maximum Net Electricity Generation": {},
"Maximum Net Electricity Generation": {
"type": "number",
"description": "",
"units": "MW"
},
"Average Net Electricity Generation": {},
"Minimum Net Electricity Generation": {},
"Initial Net Electricity Generation": {},
Expand Down
13 changes: 7 additions & 6 deletions tests/examples/Fervo_Project_Cape-4.out
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@

Simulation Metadata
----------------------
GEOPHIRES Version: 3.11.18
Simulation Date: 2026-02-27
Simulation Time: 13:15
Calculation Time: 1.787 sec
GEOPHIRES Version: 3.12.1
Simulation Date: 2026-04-01
Simulation Time: 10:35
Calculation Time: 1.765 sec

***SUMMARY OF RESULTS***

Expand Down Expand Up @@ -98,13 +98,13 @@ Simulation Metadata

***CAPITAL COSTS (M$)***

Exploration costs: 30.00 MUSD
Drilling and completion costs: 467.75 MUSD
Drilling and completion costs per well: 3.96 MUSD
Stimulation costs: 542.80 MUSD
Surface power plant costs: 1504.05 MUSD
Field gathering system costs: 56.44 MUSD
Total surface equipment costs: 1560.49 MUSD
Exploration costs: 30.00 MUSD
Overnight Capital Cost: 2601.04 MUSD
Inflation costs during construction: 59.82 MUSD
Total CAPEX: 2660.87 MUSD
Expand All @@ -120,7 +120,6 @@ Simulation Metadata


***SURFACE EQUIPMENT SIMULATION RESULTS***

Initial geofluid availability: 0.19 MW/(kg/s)
Maximum Total Electricity Generation: 614.60 MW
Average Total Electricity Generation: 610.21 MW
Expand Down Expand Up @@ -334,6 +333,8 @@ PPA revenue ($) 0 398,360,985 4
Electricity to grid (kWh) 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

Present value of annual costs ($) 2,298,728,919

Present value of annual energy costs ($) 2,298,728,919
Present value of annual energy nominal (kWh) 28,355,365,264
LCOE Levelized cost of energy nominal (cents/kWh) 8.11

Expand Down
13 changes: 7 additions & 6 deletions tests/examples/Fervo_Project_Cape-5.out
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@

Simulation Metadata
----------------------
GEOPHIRES Version: 3.11.18
Simulation Date: 2026-02-27
Simulation Time: 13:15
Calculation Time: 1.785 sec
GEOPHIRES Version: 3.12.1
Simulation Date: 2026-04-01
Simulation Time: 10:35
Calculation Time: 1.788 sec

***SUMMARY OF RESULTS***

Expand Down Expand Up @@ -108,13 +108,13 @@ Simulation Metadata

***CAPITAL COSTS (M$)***

Exploration costs: 30.00 MUSD
Drilling and completion costs: 436.98 MUSD
Drilling and completion costs per well: 4.65 MUSD
Stimulation costs: 454.02 MUSD
Surface power plant costs: 1467.78 MUSD
Field gathering system costs: 48.33 MUSD
Total surface equipment costs: 1516.11 MUSD
Exploration costs: 30.00 MUSD
Overnight Capital Cost: 2437.12 MUSD
Inflation costs during construction: 285.92 MUSD
Interest during construction: 142.66 MUSD
Expand All @@ -132,7 +132,6 @@ Simulation Metadata


***SURFACE EQUIPMENT SIMULATION RESULTS***

Initial geofluid availability: 0.19 MW/(kg/s)
Maximum Total Electricity Generation: 599.78 MW
Average Total Electricity Generation: 597.78 MW
Expand Down Expand Up @@ -347,6 +346,8 @@ PPA revenue ($) 0 0 0
Electricity to grid (kWh) 0 0 0 0 0 3,996,903,407 4,021,221,159 4,028,632,582 4,033,015,549 4,036,041,845 4,037,133,714 4,024,512,547 3,972,502,820 4,010,975,034 4,024,452,750 4,030,583,392 4,034,549,165 4,037,310,847 4,036,490,799 4,010,246,587 3,977,918,195 4,017,972,710 4,027,488,405 4,032,555,784 4,035,945,414 4,038,021,639 4,033,058,931 3,985,558,545 3,997,861,917 4,022,072,057 4,029,450,128 4,033,813,085 4,036,825,175 4,037,905,857 4,026,950,141

Present value of annual costs ($) 1,292,771,969

Present value of annual energy costs ($) 1,292,771,969
Present value of annual energy nominal (kWh) 15,057,196,989
LCOE Levelized cost of energy nominal (cents/kWh) 8.59

Expand Down
Loading