Skip to content

Config file for complex modeling artifacts conversion #98

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
May 16, 2025
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
150 changes: 150 additions & 0 deletions src/andromede/input_converter/src/cc_configuration/battery.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
#
# See AUTHORS.txt
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# SPDX-License-Identifier: MPL-2.0
#
# This file is part of the Antares project.

# Configuration file to convert a complex modelling artefact in an Antares study into an Andromede model.

#TODOs :
#*idem pour battery_pcomp

template:
name: battery
model: andromede-v1-models.battery
template-parameters:
- name: area
description: "Area identifier for the battery component"

component:
id: battery_${area}
parameters:
- id: reservoir_capacity
time-dependent: false
scenario-dependent: false
value:
type: cluster_data
data:
area: z_batteries
cluster: z_batteries_batteries_${area}_1
field: nominalcapacity #field in the file "list.ini"

- id: injection_nominal_capacity
time-dependent: false
scenario-dependent: false
value:
type: from_timeseries
data:
path: input/links/${area}/capacities/z_batteries_direct.txt
column: 0 #Read the first column
operation:
type: max

- id: withdrawal_nominal_capacity
time-dependent: false
scenario-dependent: false
value:
type: cluster_data
data:
area: ${area}
cluster: ${area}_batteries_inj
field: nominalcapacity #field in the file "list.ini"

- id: efficiency_injection
time-dependent: false
scenario-dependent: false
value:
type: binding_constraint_data
data:
binding-constraint-id: batteries_${area}
field: ${area}%z_batteries
operation:
multiply_by: -1

- id: efficiency_withdrawal
time-dependent: false
scenario-dependent: false
value:
type: binding_constraint_data
data:
binding-constraint-id: batteries_${area}
field: ${area}.${area}_batteries_inj

- id: lower_rule_curve
time-dependent: false
scenario-dependent: false
value:
type: constant
data: 0

- id: upper_rule_curve
time-dependent: true
scenario-dependent: false
value:
type: from_timeseries
data:
path: input/thermal/series/z_batteries/z_batteries_batteries_${area}_1/series.txt
column: 0
operation:
divide_by: reservoir_capacity

- id: p_max_injection_modulation
time-dependent: true
scenario-dependent: false
value:
type: from_timeseries
data:
path: input/links/${area}/capacities/z_batteries_direct.txt
column: 0
operation:
divide_by: injection_nominal_capacity

- id: p_max_withdrawal_modulation
time-dependent: true
scenario-dependent: false
value:
type: from_timeseries
data:
path: input/thermal/series/${area}/${area}_batteries_inj/series.txt
column: 0
operation:
divide_by: withdrawal_nominal_capacity

- id: marginal_cost
time-dependent: true
scenario-dependent: false
value:
type: from_timeseries
data:
path: input/links/${area}/capacities/z_batteries_parameters
column: 0

area-connections: #Syntax for hybrid connections: https://antares-simulator.readthedocs.io/en/latest/user-guide/solver/08-hybrid-studies/
#To handle the case of hybrid studies, where we replace complex modeling artifacts for batteries by a model.
- component: battery_${area}
port: injection_port
area: ${area}

connections:
- component1: battery_${area}
port1: injection_port
component2: ${area}
port2: balance_port

legacy-objects-to-delete:
binding_constraints:
- id: batteries_${area}
- id: battery_level_${area}
links:
- id: ${area}%z_batteries
nodes:
- id: z_batteries
thermal_clusters:
- id: ${area}.${area}_batteries_inj
- id: z_batteries.z_batteries_batteries_${area}_1
- id: z_batteries.z_batteries_batteries_${area}_2
56 changes: 56 additions & 0 deletions src/andromede/libs/reference_models/andromede_v1_models.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,59 @@ library:
- port: hydrogen_port
field: flow
definition: efficiency * power

- id: battery
parameters:
- id: reservoir_capacity
time-dependent: false
scenario-dependent: false
- id: injection_nominal_capacity
time-dependent: false
scenario-dependent: false
- id: withdrawal_nominal_capacity
time-dependent: false
scenario-dependent: false
- id: efficiency_injection
time-dependent: false
scenario-dependent: false
- id: efficiency_withdrawal
time-dependent: false
scenario-dependent: false
- id: lower_rule_curve
time-dependent: true
scenario-dependent: true
- id: upper_rule_curve
time-dependent: true
scenario-dependent: true
- id: p_max_injection_modulation # Read in p_max_injection
time-dependent: true
scenario-dependent: true
- id: p_max_withdrawal_modulation # Read in p_max_withdrawal
time-dependent: true
scenario-dependent: true
- id: marginal_cost
time-dependent: true
scenario-dependent: false


variables:
- id: p_injection
lower-bound: 0
upper-bound: p_max_injection_modulation * injection_nominal_capacity # p_max_injection_modulation is a timeseries with adimensional values between 0 and 1
- id: p_withdrawal
lower-bound: 0
upper-bound: p_max_withdrawal_modulation * withdrawal_nominal_capacity # p_max_withdrawal_modulation is a timeseries with adimensional values between 0 and 1
- id: level
lower-bound: lower_rule_curve * reservoir_capacity
upper-bound: upper_rule_curve * reservoir_capacity
ports:
- id: injection_port
type: flow
port-field-definitions:
- port: injection_port
field: flow
definition: p_withdrawal - p_injection
constraints:
- id: level_equation
expression: level[t+1] = level + efficiency_injection * p_injection - efficiency_withdrawal * p_withdrawal
objective: expec(sum(marginal_cost * p_injection))
5 changes: 5 additions & 0 deletions tests/e2e/models/andromede-v1/test_andromede_v1_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,11 @@ def test_model_behaviour(
)
status = problem.solver.Solve()
assert status == problem.solver.OPTIMAL
assert math.isclose(
problem.solver.Objective().Value(),
problem.solver.Objective().BestBound(),
rel_tol=relative_accuracy,
)
assert math.isclose(
reference_values[k, 0],
problem.solver.Objective().Value(),
Expand Down
Loading