Skip to content

Commit 922be29

Browse files
Define dedicated Total CAPEX output parameter, with tooltip text, for SAM-EM isntead of changing display name of Economics.CCap.
1 parent 20c5607 commit 922be29

File tree

4 files changed

+30
-16
lines changed

4 files changed

+30
-16
lines changed

src/geophires_x/Economics.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
from geophires_x.EconomicsSam import calculate_sam_economics, SamEconomicsCalculations
1010
from geophires_x.EconomicsUtils import BuildPricingModel, wacc_output_parameter, nominal_discount_rate_parameter, \
1111
real_discount_rate_parameter, after_tax_irr_parameter, moic_parameter, project_vir_parameter, \
12-
project_payback_period_parameter, inflation_cost_during_construction_output_parameter
12+
project_payback_period_parameter, inflation_cost_during_construction_output_parameter, \
13+
total_capex_parameter_output_parameter
1314
from geophires_x.GeoPHIRESUtils import quantity
1415
from geophires_x.OptionList import Configuration, WellDrillingCostCorrelation, EconomicModel, EndUseOptions, PlantType, \
1516
_WellDrillingCostCorrelationCitation
@@ -1831,8 +1832,10 @@ def __init__(self, model: Model):
18311832
display_name='Total capital costs',
18321833
UnitType=Units.CURRENCY,
18331834
PreferredUnits=CurrencyUnit.MDOLLARS,
1834-
CurrentUnits=CurrencyUnit.MDOLLARS
1835+
CurrentUnits=CurrencyUnit.MDOLLARS,
18351836
)
1837+
self.capex_total = self.OutputParameterDict[self.capex_total.Name] = total_capex_parameter_output_parameter()
1838+
18361839
# noinspection SpellCheckingInspection
18371840
self.Coam = self.OutputParameterDict[self.Coam.Name] = OutputParameter(
18381841
Name="Total O&M Cost",
@@ -2583,10 +2586,12 @@ def Calculate(self, model: Model) -> None:
25832586
if self.econmodel.value == EconomicModel.SAM_SINGLE_OWNER_PPA:
25842587
self.sam_economics_calculations = calculate_sam_economics(model)
25852588

2586-
# Distinguish capex from default display name of 'Total capital costs' since SAM Economic Model doesn't
2587-
# subtract ITC from this value.
2588-
self.CCap.display_name = 'Total CAPEX'
2589-
self.CCap.value = self.sam_economics_calculations.capex.quantity().to(self.CCap.CurrentUnits.value).magnitude
2589+
# Setting capex_total distinguishes capex from CCap's display name of 'Total capital costs',
2590+
# since SAM Economic Model doesn't subtract ITC from this value.
2591+
self.capex_total.value = (self.sam_economics_calculations.capex.quantity()
2592+
.to(self.capex_total.CurrentUnits.value).magnitude)
2593+
self.CCap.value = (self.sam_economics_calculations.capex.quantity()
2594+
.to(self.CCap.CurrentUnits.value).magnitude)
25902595

25912596
self.wacc.value = self.sam_economics_calculations.wacc.value
25922597
self.nominal_discount_rate.value = self.sam_economics_calculations.nominal_discount_rate.value

src/geophires_x/EconomicsSam.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
project_vir_parameter,
3939
project_payback_period_parameter,
4040
inflation_cost_during_construction_output_parameter,
41+
total_capex_parameter_output_parameter,
4142
)
4243
from geophires_x.GeoPHIRESUtils import is_float, is_int, sig_figs, quantity
4344
from geophires_x.OptionList import EconomicModel, EndUseOptions
@@ -56,12 +57,7 @@ class SamEconomicsCalculations:
5657
)
5758
)
5859

59-
capex: OutputParameter = field(
60-
default_factory=lambda: OutputParameter(
61-
UnitType=Units.CURRENCY,
62-
CurrentUnits=CurrencyUnit.MDOLLARS,
63-
)
64-
)
60+
capex: OutputParameter = field(default_factory=total_capex_parameter_output_parameter)
6561

6662
project_npv: OutputParameter = field(
6763
default_factory=lambda: OutputParameter(
@@ -329,7 +325,6 @@ def _get_utility_rate_parameters(m: Model) -> dict[str, Any]:
329325
def _get_single_owner_parameters(model: Model) -> dict[str, Any]:
330326
"""
331327
TODO:
332-
- Construction years
333328
- Break out indirect costs (instead of lumping all into direct cost):
334329
https://github.com/NREL/GEOPHIRES-X/issues/383
335330
"""

src/geophires_x/EconomicsUtils.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,3 +131,16 @@ def inflation_cost_during_construction_output_parameter() -> OutputParameter:
131131
CurrentUnits=CurrencyUnit.MDOLLARS,
132132
ToolTipText='The calculated amount of cost escalation due to inflation over the construction period.'
133133
)
134+
135+
136+
def total_capex_parameter_output_parameter() -> OutputParameter:
137+
return OutputParameter(
138+
Name='Total CAPEX',
139+
UnitType=Units.CURRENCY,
140+
CurrentUnits=CurrencyUnit.MDOLLARS,
141+
PreferredUnits=CurrencyUnit.MDOLLARS,
142+
ToolTipText="The total capital expenditure (CAPEX) required to construct the plant. "
143+
"This value includes all direct and indirect costs, contingency, and any cost escalation from "
144+
"inflation during construction. It is used as the total installed cost input for "
145+
"SAM Economic Models."
146+
)

src/geophires_x/Outputs.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ def PrintOutputs(self, model: Model):
222222
f.write(f' {model.economics.LCOH.display_name}: {model.economics.LCOH.value:10.2f} {model.economics.LCOH.CurrentUnits.value}\n')
223223

224224
if econ.econmodel.value == EconomicModel.SAM_SINGLE_OWNER_PPA:
225-
f.write(f' {Outputs._field_label(econ.CCap.display_name, 50)}{econ.CCap.value:10.2f} {econ.CCap.CurrentUnits.value}\n')
225+
f.write(f' {Outputs._field_label(econ.capex_total.display_name, 50)}{econ.capex_total.value:10.2f} {econ.capex_total.CurrentUnits.value}\n')
226226

227227
f.write(f' Number of production wells: {model.wellbores.nprod.value:10.0f}'+NL)
228228
f.write(f' Number of injection wells: {model.wellbores.ninj.value:10.0f}'+NL)
@@ -500,8 +500,9 @@ def PrintOutputs(self, model: Model):
500500
icc_label = Outputs._field_label(econ.inflation_cost_during_construction.display_name, 47)
501501
f.write(f' {icc_label}{econ.inflation_cost_during_construction.value:10.2f} {econ.inflation_cost_during_construction.CurrentUnits.value}\n')
502502

503-
capex_label = Outputs._field_label(econ.CCap.display_name, 50)
504-
f.write(f' {capex_label}{econ.CCap.value:10.2f} {econ.CCap.CurrentUnits.value}\n')
503+
capex_param = econ.CCap if econ.econmodel.value != EconomicModel.SAM_SINGLE_OWNER_PPA else econ.capex_total
504+
capex_label = Outputs._field_label(capex_param.display_name, 50)
505+
f.write(f' {capex_label}{capex_param.value:10.2f} {capex_param.CurrentUnits.value}\n')
505506

506507
if model.economics.econmodel.value == EconomicModel.FCR:
507508
f.write(f' Annualized capital costs: {(model.economics.CCap.value*(1+model.economics.inflrateconstruction.value)*model.economics.FCR.value):10.2f} ' + model.economics.CCap.CurrentUnits.value + NL)

0 commit comments

Comments
 (0)