Skip to content

Commit a007576

Browse files
after-tax LCOE
1 parent 79635ee commit a007576

File tree

4 files changed

+33
-7
lines changed

4 files changed

+33
-7
lines changed

src/geophires_x/Economics.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,8 @@ def CalculateLCOELCOHLCOC(econ, model: Model) -> tuple:
471471
model.surfaceplant.annual_heating_demand.value * discount_vector) * 1E2 # cents/kWh
472472
LCOH = LCOH * 2.931 # $/Million Btu
473473
elif econ.econmodel.value == EconomicModel.SAM_SINGLE_OWNER_PPA:
474-
LCOE = calculate_sam_economics(model)['LCOE']['value']
474+
# FIXME TODO designate nominal (as opposed to real) in client result
475+
LCOE = calculate_sam_economics(model)['LCOE (nominal)']['value']
475476
else:
476477
# must be BICYCLE
477478
# average return on investment (tax and inflation adjusted)

src/geophires_x/EconomicsSam.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def calculate_sam_economics(model: Model) -> dict[str, dict[str, Any]]:
5656
cash_flow = _calculate_cash_flow(model, single_owner)
5757

5858
data = [
59-
('LCOE', single_owner.Outputs.lcoe_real, 'cents/kWh'),
59+
('LCOE (nominal)', single_owner.Outputs.lcoe_nom, 'cents/kWh'),
6060
('IRR', single_owner.Outputs.project_return_aftertax_irr, '%'),
6161
('NPV', single_owner.Outputs.project_return_aftertax_npv * 1e-6, 'MUSD'),
6262
('CAPEX', single_owner.Outputs.adjusted_installed_cost * 1e-6, 'MUSD'),
@@ -261,6 +261,24 @@ def single_value_row(row_name: str, single_value: float) -> list[Any]:
261261
data_row('After-tax cumulative IRR (%)', _soo.cf_project_return_aftertax_irr)
262262
data_row('After-tax cumulative NPV ($)', _soo.cf_project_return_aftertax_npv)
263263

264+
blank_row()
265+
266+
category_row('AFTER-TAX LCOE AND PPA PRICE')
267+
data_row('Annual costs ($)', _soo.cf_annual_costs)
268+
data_row('PPA revenue ($)', _soo.cf_energy_value) # TODO config-ify repeated
269+
data_row('Electricity to grid (kWh)', _soo.cf_energy_sales) # TODO config-ify repeated
270+
271+
blank_row()
272+
single_value_row('Present value of annual costs ($)', _soo.npv_annual_costs)
273+
single_value_row('Present value of annual energy nominal ($)', _soo.npv_energy_nom) # TODO config-ify repeated
274+
single_value_row('LCOE Levelized cost of energy nominal (cents/kWh)', _soo.lcoe_nom)
275+
276+
blank_row()
277+
278+
single_value_row('Present value of PPA revenue ($)', _soo.npv_ppa_revenue)
279+
single_value_row('Present value of annual energy nominal ($)', _soo.npv_energy_nom) # TODO config-ify repeated
280+
single_value_row('LPPA Levelized PPA price nominal (cents/kWh)', _soo.lppa_nom)
281+
264282
return profile
265283

266284

tests/geophires_x_tests/generic-egs-case-2.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ Surface Plant Capital Cost Adjustment Factor, 0.71, -- $1900/kW (peak production
4343
Exploration Capital Cost, 30
4444
Well Drilling and Completion Capital Cost, 3.84, -- Assume cost continues to decrease from $4.8M/well (https://houston.innovationmap.com/fervo-energy-drilling-utah-project-2667300142.html)
4545
Reservoir Stimulation Capital Cost, 234, -- 78 wells @ $3M/well
46-
Economic Model, 3
46+
Economic Model, 5, -- SAM Single Owner PPA
4747
Starting Electricity Sale Price, 0.15
4848
Ending Electricity Sale Price, 1.00
4949
Electricity Escalation Rate Per Year, 0.004053223

tests/geophires_x_tests/test_economics_sam.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def _npv(r: GeophiresXResult) -> float:
3939

4040
base_result = self._get_result({})
4141
base_lcoe = _lcoe(base_result)
42-
self.assertGreater(base_lcoe, 6)
42+
self.assertGreater(base_lcoe, 7)
4343

4444
npvs = [_npv(self._get_result({'Starting Electricity Sale Price': x / 100.0})) for x in range(1, 20, 4)]
4545
for i in range(len(npvs) - 1):
@@ -71,13 +71,20 @@ def test_cash_flow(self):
7171
def get_row(name: str) -> list[float]:
7272
return next(r for r in cash_flow if r[0] == name)[1:]
7373

74+
def get_single_value(name: str) -> list[float]:
75+
return get_row(name)[0]
76+
7477
self.assertListEqual(get_row('PPA revenue ($)'), get_row('Total revenue ($)'))
7578

76-
tic = get_row('Total installed cost ($)')[0]
79+
tic = get_single_value('Total installed cost ($)')
7780
self.assertLess(tic, 0)
78-
self.assertAlmostEqual(get_row('Cash flow from investing activities ($)')[0], tic, places=2)
81+
self.assertAlmostEqual(get_single_value('Cash flow from investing activities ($)'), tic, places=2)
82+
83+
self.assertAlmostEqual(get_single_value('Cash flow from financing activities ($)'), -1.0 * tic, places=2)
7984

80-
self.assertAlmostEqual(get_row('Cash flow from financing activities ($)')[0], -1.0 * tic, places=2)
85+
self.assertAlmostEqual(
86+
m.economics.LCOE.value, get_single_value('LCOE Levelized cost of energy nominal (cents/kWh)'), places=2
87+
)
8188

8289
def test_only_electricity_end_use_supported(self):
8390
with self.assertRaises(RuntimeError):

0 commit comments

Comments
 (0)