Skip to content

Commit ca2bc77

Browse files
committed
match opex pre- and postprocessing
1 parent 93c230f commit ca2bc77

File tree

3 files changed

+36
-11
lines changed

3 files changed

+36
-11
lines changed

revoletion/blocks.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -257,9 +257,9 @@ def extrapolate_opex(self):
257257
observation_horizon=self.scenario.prj_duration_yrs,
258258
discount_rate=self.scenario.wacc,
259259
occurs_at='end')
260-
self.opex_ann = eco.annuity_due_recur(nominal_value=self.opex_yrl,
261-
observation_horizon=self.scenario.prj_duration_yrs,
262-
discount_rate=self.scenario.wacc)
260+
self.opex_ann = eco.annuity_recur(nominal_value=self.opex_yrl,
261+
observation_horizon=self.scenario.prj_duration_yrs,
262+
discount_rate=self.scenario.wacc)
263263
self.scenario.opex_sim += self.opex_sim
264264
self.scenario.opex_yrl += self.opex_yrl
265265
self.scenario.opex_prj += self.opex_prj
@@ -319,7 +319,10 @@ def __init__(self, name, scenario):
319319

320320
# runtime factor to compensate for difference between simulation and project timeframe
321321
# opex is uprated in importance for short simulations
322-
self.factor_opex = (1 / self.scenario.sim_yr_rat) if scenario.compensate_sim_prj else 1
322+
self.factor_opex = eco.annuity_recur(nominal_value=utils.scale_sim2prj(value=1,
323+
scenario=self.scenario),
324+
observation_horizon=self.scenario.prj_duration_yrs,
325+
discount_rate=self.scenario.wacc) if scenario.compensate_sim_prj else 1
323326
self.opex_ep_spec = None # initial value
324327
self.calc_opex_ep_spec() # uprate opex values for short simulations, exact process depends on class
325328

@@ -639,9 +642,9 @@ def calc_opex_sim(self):
639642
self.scenario.prj_duration_yrs,
640643
self.scenario.wacc,
641644
occurs_at='end')
642-
self.opex_ann_ext = eco.annuity_due_recur(nominal_value=self.opex_yrl_ext,
643-
observation_horizon=self.scenario.prj_duration_yrs,
644-
discount_rate=self.scenario.wacc)
645+
self.opex_ann_ext = eco.annuity_recur(nominal_value=self.opex_yrl_ext,
646+
observation_horizon=self.scenario.prj_duration_yrs,
647+
discount_rate=self.scenario.wacc)
645648
self.scenario.opex_sim_ext += self.opex_sim_ext
646649
self.scenario.opex_yrl_ext += self.opex_yrl_ext
647650
self.scenario.opex_prj_ext += self.opex_prj_ext

revoletion/economics.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,12 @@ def annuity_due_capex(capex_init: float,
120120
return annuity_due
121121

122122

123-
def annuity_due_recur(nominal_value:float,
124-
observation_horizon:float,
125-
discount_rate:float):
123+
def annuity_due_recur(nominal_value: float,
124+
observation_horizon: float,
125+
discount_rate: float):
126126
"""
127127
Calculate the annuity due of a yearly recurring (lifespan=1) and nonchanging (cost_change_ratio=1)
128-
mainenance expense (the equivalent yearly sum to generate the same NPV) over a observation horizon.
128+
mainenance expense (the equivalent yearly sum to generate the same NPV) over an observation horizon.
129129
"""
130130
annuity_due_recur = annuity_due_capex(capex_init=nominal_value,
131131
capex_replacement=nominal_value,
@@ -134,3 +134,21 @@ def annuity_due_recur(nominal_value:float,
134134
discount_rate=discount_rate,
135135
cost_change_ratio=1)
136136
return annuity_due_recur
137+
138+
139+
def annuity_recur(nominal_value: float,
140+
observation_horizon: float,
141+
discount_rate: float):
142+
"""
143+
Calculate the annuity of a periodically recurring and nonchanging (cost_change_ratio=1)
144+
expense (the equivalent yearly sum to generate the same NPV) over a observation horizon.
145+
"""
146+
present_value = acc_discount(nominal_value=nominal_value,
147+
observation_horizon=observation_horizon,
148+
discount_rate=discount_rate,
149+
occurs_at='end')
150+
annuity_recur = annuity(present_value=present_value,
151+
observation_horizon=observation_horizon,
152+
discount_rate=discount_rate,
153+
occurs_at='end')
154+
return annuity_recur

revoletion/utils.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ def scale_year2prj(value, scenario):
112112
return value * scenario.prj_duration_yrs
113113

114114

115+
def scale_sim2prj(value, scenario):
116+
return scale_year2prj(scale_sim2year(value, scenario), scenario)
117+
118+
115119
def read_demand_file(block):
116120
"""
117121
Read in a CommodityDemand csv file

0 commit comments

Comments
 (0)