From 170173a003ea82b684dbd0e18eed59a614032c77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrik=20Sch=C3=B6nfeldt?= Date: Tue, 9 Jul 2024 11:31:04 +0200 Subject: [PATCH] Reapply "Introduce variable for storage losses" This reverts commit 6dae8bc3725d063bef2249377e75d114a0487f0c. --- .../solph/components/_generic_storage.py | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/oemof/solph/components/_generic_storage.py b/src/oemof/solph/components/_generic_storage.py index 7e287fc09..b04410508 100644 --- a/src/oemof/solph/components/_generic_storage.py +++ b/src/oemof/solph/components/_generic_storage.py @@ -497,6 +497,8 @@ def _storage_content_bound_rule(block, n, t): self.STORAGES, m.TIMEPOINTS, bounds=_storage_content_bound_rule ) + self.storage_losses = Var(self.STORAGES, m.TIMESTEPS) + # set the initial storage content # ToDo: More elegant code possible? for n in group: @@ -508,16 +510,9 @@ def _storage_content_bound_rule(block, n, t): # ************* Constraints *************************** - def _storage_balance_rule(block, n, t): - """ - Rule definition for the storage balance of every storage n and - every timestep. - """ - expr = 0 - expr += block.storage_content[n, t + 1] - expr += ( - -block.storage_content[n, t] - * (1 - n.loss_rate[t]) ** m.timeincrement[t] + def _storage_losses_rule(block, n, t): + expr = block.storage_content[n, t] * ( + n.loss_rate[t] ** m.timeincrement[t] ) expr += ( n.fixed_losses_relative[t] @@ -525,13 +520,27 @@ def _storage_balance_rule(block, n, t): * m.timeincrement[t] ) expr += n.fixed_losses_absolute[t] * m.timeincrement[t] + + return expr == block.storage_losses[n, t] + + self.losses = Constraint( + self.STORAGES, m.TIMESTEPS, rule=_storage_losses_rule + ) + + def _storage_balance_rule(block, n, t): + """ + Rule definition for the storage balance of every storage n and + every timestep. + """ + expr = block.storage_content[n, t] + expr -= block.storage_losses[n, t] expr += ( - -m.flow[i[n], n, t] * n.inflow_conversion_factor[t] + m.flow[i[n], n, t] * n.inflow_conversion_factor[t] ) * m.timeincrement[t] - expr += ( + expr -= ( m.flow[n, o[n], t] / n.outflow_conversion_factor[t] ) * m.timeincrement[t] - return expr == 0 + return expr == block.storage_content[n, t + 1] self.balance = Constraint( self.STORAGES, m.TIMESTEPS, rule=_storage_balance_rule