Skip to content

Commit 06bc7b9

Browse files
set sam ppa price from geophires electricity price
1 parent 6c24b89 commit 06bc7b9

File tree

2 files changed

+62
-47
lines changed

2 files changed

+62
-47
lines changed

src/geophires_x/EconomicsSam.py

Lines changed: 40 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -23,40 +23,8 @@
2323
import geophires_x.Model as Model
2424

2525

26-
def get_single_owner_parameters(model: Model) -> dict[str, Any]:
27-
econ = model.economics
28-
29-
ret: dict[str, Any] = {}
30-
31-
itc = econ.CCap.value * econ.RITC.value
32-
total_capex_musd = (
33-
econ.CCap.value - itc
34-
)
35-
ret['total_installed_cost'] = total_capex_musd * 1e6
36-
37-
opex_musd = econ.Coam.value
38-
ret['om_fixed'] = [opex_musd * 1e6]
39-
40-
average_net_generation_MW = get_average_net_generation_MW(model)
41-
ret['system_capacity'] = average_net_generation_MW * 1e3
42-
43-
geophires_ctr_tenths = Decimal(econ.CTR.value)
44-
fed_rate_tenths = geophires_ctr_tenths * (Decimal(0.7))
45-
state_rate_tenths = geophires_ctr_tenths - fed_rate_tenths
46-
ret['federal_tax_rate'] = [float(fed_rate_tenths * Decimal(100))]
47-
ret['state_tax_rate'] = [float(state_rate_tenths * Decimal(100))]
48-
49-
geophires_itc_tenths = Decimal(econ.RITC.value)
50-
ret['itc_fed_percent'] = [float(geophires_itc_tenths * Decimal(100))]
51-
52-
geophires_ptr_tenths = Decimal(econ.PTR.value)
53-
ret['property_tax_rate'] = float(geophires_ptr_tenths * Decimal(100))
54-
55-
return ret
56-
57-
5826
def calculate_sam_economics(
59-
model: Model
27+
model: Model
6028
) -> dict[str, dict[str, Any]]:
6129
custom_gen = CustomGeneration.new()
6230
grid = Grid.from_existing(custom_gen)
@@ -72,12 +40,11 @@ def calculate_sam_economics(
7240
for module_file, module in zip(file_names, modules):
7341
with open(Path(project_dir, f'{module_file}.json'), encoding='utf-8') as file:
7442
data = json.load(file)
75-
# loop through each key-value pair
7643
for k, v in data.items():
7744
if k != 'number_inputs':
7845
module.value(k, v)
7946

80-
for k, v in get_single_owner_parameters(model).items():
47+
for k, v in _get_single_owner_parameters(model).items():
8148
single_owner.value(k, v)
8249

8350
for module in modules:
@@ -97,17 +64,51 @@ def calculate_sam_economics(
9764
ret = {}
9865
for e in display_data:
9966
field_display = e[0] + ':' + ' ' * (max_field_name_len - len(e[0]) - 1)
100-
print(f'{field_display}\t{sig_figs(e[1], 5)} {e[2]}')
101-
ret[e[0]] = {'value': sig_figs(e[1], 5), 'unit': e[2]}
67+
# print(f'{field_display}\t{sig_figs(e[1], 5)} {e[2]}')
68+
ret[e[0]] = {'value': _sig_figs(e[1], 5), 'unit': e[2]}
69+
70+
return ret
71+
72+
73+
def _get_single_owner_parameters(model: Model) -> dict[str, Any]:
74+
econ = model.economics
75+
76+
ret: dict[str, Any] = {}
77+
78+
itc = econ.CCap.value * econ.RITC.value
79+
total_capex_musd = (
80+
econ.CCap.value - itc
81+
)
82+
ret['total_installed_cost'] = total_capex_musd * 1e6
83+
84+
opex_musd = econ.Coam.value
85+
ret['om_fixed'] = [opex_musd * 1e6]
86+
87+
average_net_generation_MW = _get_average_net_generation_MW(model)
88+
ret['system_capacity'] = average_net_generation_MW * 1e3
89+
90+
geophires_ctr_tenths = Decimal(econ.CTR.value)
91+
fed_rate_tenths = geophires_ctr_tenths * (Decimal(0.7))
92+
state_rate_tenths = geophires_ctr_tenths - fed_rate_tenths
93+
ret['federal_tax_rate'] = [float(fed_rate_tenths * Decimal(100))]
94+
ret['state_tax_rate'] = [float(state_rate_tenths * Decimal(100))]
95+
96+
geophires_itc_tenths = Decimal(econ.RITC.value)
97+
ret['itc_fed_percent'] = [float(geophires_itc_tenths * Decimal(100))]
98+
99+
geophires_ptr_tenths = Decimal(econ.PTR.value)
100+
ret['property_tax_rate'] = float(geophires_ptr_tenths * Decimal(100))
101+
102+
ret['ppa_price_input'] = [econ.ElecStartPrice.value]
102103

103104
return ret
104105

105106

106-
def get_average_net_generation_MW(model: Model) -> float:
107+
def _get_average_net_generation_MW(model: Model) -> float:
107108
return np.average(model.surfaceplant.NetElectricityProduced.value)
108109

109110

110-
def sig_figs(val: float, num_sig_figs: int) -> float:
111+
def _sig_figs(val: float, num_sig_figs: int) -> float:
111112
if val is None:
112113
return None
113114

tests/test_geophires_x.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -915,13 +915,27 @@ def test_negative_electricity_production_raises_error(self):
915915
self.assertIn('Electricity production calculated as negative', str(e.exception))
916916

917917
def test_economic_model_single_owner_ppa_sam(self):
918-
result = GeophiresXClient().get_geophires_result(
919-
GeophiresInputParameters(
920-
from_file_path=self._get_test_file_path('geophires_x_tests/generic-egs-case.txt'),
921-
params={
922-
'Economic Model': 5,
923-
},
918+
def _get_result(_params) -> GeophiresXResult:
919+
return GeophiresXClient().get_geophires_result(
920+
GeophiresInputParameters(
921+
from_file_path=self._get_test_file_path('geophires_x_tests/generic-egs-case.txt'),
922+
params={
923+
'Economic Model': 5,
924+
}
925+
| _params,
926+
)
924927
)
925-
)
926928

927-
self.assertGreater(result.result['SUMMARY OF RESULTS']['Electricity breakeven price']['value'], 6)
929+
def _lcoe(r: GeophiresXResult) -> float:
930+
return r.result['SUMMARY OF RESULTS']['Electricity breakeven price']['value']
931+
932+
def _npv(r: GeophiresXResult) -> float:
933+
return r.result['ECONOMIC PARAMETERS']['Project NPV']['value']
934+
935+
base_result = _get_result({})
936+
base_lcoe = _lcoe(base_result)
937+
self.assertGreater(base_lcoe, 6)
938+
939+
npvs = [_npv(_get_result({'Starting Electricity Sale Price': x / 100.0})) for x in range(1, 20, 2)]
940+
for i in range(len(npvs) - 1):
941+
self.assertLess(npvs[i], npvs[i + 1])

0 commit comments

Comments
 (0)