diff --git a/component/core.py b/component/core.py
index 49b3c26827d6c3026d99f58b7a0209496e183923..2c1967f37aa6b0e025eba8e1d4e48e44fa4c9ad9 100644
--- a/component/core.py
+++ b/component/core.py
@@ -252,7 +252,8 @@ class AbstractComponent:
if self.capacity is None:
return []
else:
- return [(self.name + ".capacity", VariableKind.UNINDEXED)]
+ return [(self.name + ".capacity", VariableKind.UNINDEXED),(self.name + ".capital_cost", VariableKind.UNINDEXED)]
+
# TODO make these functions into generator functions
def non_state_base_variable_names(self):
@@ -264,6 +265,7 @@ class AbstractComponent:
def add_design_variables(self, d_block):
if self.capacity is not None:
+ d_block.add(self.name + ".capital_cost", pyo.Var())
if isinstance(self.capacity, tuple):
d_block.add(self.name + ".capacity", pyo.Var(bounds=self.capacity))
elif isinstance(self.capacity, (int, float)):
@@ -402,6 +404,13 @@ class AbstractComponent:
T_N = T
f_b = self.factor_effort_maintenance_operation
self_design_annuity = design_annuity(A_0, T, T_N, r, q, f_b)
+ if self.capacity is not None:
+ d_annuity = model.component_dict[self.name + ".capital_cost"]
+
+ def rule(m):
+ return d_annuity == self_design_annuity
+
+ model.add(self.name + ".cost_design_annuity", pyo.Constraint(rule=rule))
return self_design_annuity
@@ -417,6 +426,15 @@ class AbstractComponent:
self_operational_annuity = 0.0
else:
self_operational_annuity = operational_annuity(T, r, q, A_V)
+ model.add(self.name + ".operation_cost", pyo.Var())
+ o_annuity = model.component_dict[self.name + ".operation_cost"]
+
+ def rule(m):
+
+ return o_annuity == self_operational_annuity / pyo.quicksum(model.step_size(t)
+ for t in model.T) * 365 * 24
+
+ model.add(self.name + ".cost_operation_annuity", pyo.Constraint(rule=rule))
return self_operational_annuity
@@ -758,6 +776,7 @@ class BaseGrid(AbstractComponent):
return [
(self.name + ".input_1", VariableKind.INDEXED),
(self.name + ".output_1", VariableKind.INDEXED),
+ (self.name + ".operation_cost", VariableKind.UNINDEXED),
]
def add_non_state_variables(self, o_block):
@@ -767,6 +786,8 @@ class BaseGrid(AbstractComponent):
output = pyo.Var(o_block.T, bounds=(0, None))
o_block.add(self.name + ".output_1", output)
+
+
def add_non_state_model(self, d_block, o_block):
input = o_block.component_dict[self.name + ".input_1"]