Skip to content

Commit ef9a11c

Browse files
Support multiple construction years for SAM-EM. WIP - TODO to update/remove Accrued financing during construction field
1 parent c3d6390 commit ef9a11c

File tree

7 files changed

+87
-82
lines changed

7 files changed

+87
-82
lines changed

docs/SAM-Economic-Models.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ The following table describes how GEOPHIRES parameters are transformed into SAM
2020
| `Maximum Total Electricity Generation` | Generation Profile | `Nameplate capacity` | `Singleowner` | `system_capacity` | .. N/A |
2121
| `Utilization Factor` | Generation Profile | `Nominal capacity factor` | `Singleowner` | `user_capacity_factor` | .. N/A |
2222
| `Net Electricity Generation` | AC Degradation | `Annual AC degradation rate` schedule | `Utilityrate5` | `degradation` | Percentage difference of each year's `Net Electricity Generation` from `Maximum Total Electricity Generation` is input as SAM as the degradation rate schedule in order to match SAM's generation profile to GEOPHIRES |
23-
| `Total CAPEX` × (1 + `Inflation Rate During Construction`) | Installation Costs | `Total Installed Cost` | `Singleowner` | `total_installed_cost` | Inflation during construction is treated as an indirect EPC capital cost percentage. Note that unlike the BICYCLE Economic Model's `Total capital costs`, SAM Economic Model's `Total CAPEX` is the total installed cost and does not subtract ITC value (if present). |
23+
| `Total CAPEX` × (1 + `Inflation Rate During Construction`) ^ `Construction Years` | Installation Costs | `Total Installed Cost` | `Singleowner` | `total_installed_cost` | Note that unlike the BICYCLE Economic Model's `Total capital costs`, SAM Economic Model's `Total CAPEX` is the total installed cost and does not subtract ITC value (if present). |
2424
| `Total O&M Cost`, `Inflation Rate` | Operating Costs | `Fixed operating cost`, `Escalation rate` set to `Inflation Rate` × -1 | `Singleowner` | `om_fixed`, `om_fixed_escal` | .. N/A |
2525
| `Plant Lifetime` | Financial Parameters → Analysis Parameters | `Analysis period` | `CustomGeneration`, `Singleowner` | `CustomGeneration.analysis_period`, `Singleowner.term_tenor` | .. N/A |
2626
| `Inflation Rate` | Financial Parameters → Analysis Parameters | `Inflation rate` | `Utilityrate5` | `inflation_rate` | .. N/A |
@@ -48,7 +48,8 @@ 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.
51+
2. Only 1 construction year is supported. Note that the `Inflation Rate During Construction` parameter can be used to
52+
partially account for longer construction periods.
5253

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

@@ -135,7 +136,6 @@ You can then manually enter the parameters from the logged mapping into the SAM
135136

136137
![](sam-desktop-app-manually-enter-system-capacity-from-geophires-log.png)
137138

138-
139139
## Examples
140140

141141
### SAM Single Owner PPA: 50 MWe

src/geophires_x/Economics.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1043,7 +1043,8 @@ def __init__(self, model: Model):
10431043
PreferredUnits=PercentUnit.PERCENT,
10441044
CurrentUnits=PercentUnit.TENTH,
10451045
ErrMessage="assume default inflation rate during construction (0)",
1046-
ToolTipText='For SAM Economic Models, this value is treated as an indirect EPC capital cost percentage.'
1046+
ToolTipText='For SAM Economic Models, total installed cost is calculated as Total CAPEX × '
1047+
'(1 + Inflation Rate During Construction) ^ Construction Years.'
10471048
)
10481049

10491050
self.contingency_percentage = self.ParameterDict[self.contingency_percentage.Name] = floatParameter(

src/geophires_x/EconomicsSam.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,15 @@ def _inv_msg(param_name: str, invalid_value: Any, supported_description: str) ->
9595
)
9696
)
9797

98-
if model.surfaceplant.construction_years.value != 1:
99-
raise ValueError(
100-
_inv_msg(
101-
model.surfaceplant.construction_years.Name,
102-
model.surfaceplant.construction_years.value,
103-
f'{model.surfaceplant.construction_years.Name} = 1',
104-
)
105-
)
98+
# FIXME WIP
99+
# if model.surfaceplant.construction_years.value != 1:
100+
# raise ValueError(
101+
# _inv_msg(
102+
# model.surfaceplant.construction_years.Name,
103+
# model.surfaceplant.construction_years.value,
104+
# f'{model.surfaceplant.construction_years.Name} = 1',
105+
# )
106+
# )
106107

107108
gtr: floatParameter = model.economics.GTR
108109
if gtr.Provided:
@@ -356,7 +357,11 @@ def _get_single_owner_parameters(model: Model) -> dict[str, Any]:
356357

357358
itc = econ.RITCValue.quantity()
358359
total_capex = econ.CCap.quantity() + itc
359-
ret['total_installed_cost'] = (total_capex * (1 + econ.inflrateconstruction.value)).to('USD').magnitude
360+
ret['total_installed_cost'] = (
361+
(total_capex * math.pow(1 + econ.inflrateconstruction.value, model.surfaceplant.construction_years.value))
362+
.to('USD')
363+
.magnitude
364+
)
360365

361366
opex_musd = econ.Coam.value
362367
ret['om_fixed'] = [opex_musd * 1e6]

0 commit comments

Comments
 (0)