Skip to content

Commit

Permalink
Ajout du test electrolyzer n inputs
Browse files Browse the repository at this point in the history
  • Loading branch information
Yann-Temudjin committed Mar 4, 2024
1 parent 966b4de commit 927cc47
Show file tree
Hide file tree
Showing 3 changed files with 492 additions and 56 deletions.
101 changes: 45 additions & 56 deletions src/andromede/libs/standard.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,28 @@
],
)

NODE_WITH_SPILL_AND_ENS_MODEL = model(
id="NODE_WITH_SPILL_AND_ENS_MODEL",
parameters=[float_parameter("spillage_cost"), float_parameter("ens_cost")],
variables=[
float_variable("spillage", lower_bound=literal(0)),
float_variable("unsupplied_energy", lower_bound=literal(0)),
],
ports=[ModelPort(port_type=BALANCE_PORT_TYPE, port_name="balance_port")],
binding_constraints=[
Constraint(
name="Balance",
expression=port_field("balance_port", "flow").sum_connections()
== var("spillage") - var("unsupplied_energy"),
)
],
objective_operational_contribution=(
param("spillage_cost") * var("spillage")
+ param("ens_cost") * var("unsupplied_energy")
)
.sum()
.expec(),
)
"""
A standard model for a linear cost generation, limited by a maximum generation.
"""
Expand All @@ -63,7 +85,9 @@
name="Max generation", expression=var("generation") <= param("p_max")
),
],
objective_contribution=(param("cost") * var("generation")).sum().expec(),
objective_operational_contribution=(param("cost") * var("generation"))
.sum()
.expec(),
)

"""
Expand Down Expand Up @@ -133,7 +157,9 @@
lower_bound=literal(0),
), # To test both ways of setting constraints
],
objective_contribution=(param("cost") * var("generation")).sum().expec(),
objective_operational_contribution=(param("cost") * var("generation"))
.sum()
.expec(),
)

# For now, no starting cost
Expand All @@ -159,17 +185,17 @@
"nb_on",
lower_bound=literal(0),
upper_bound=param("nb_units_max"),
structural_type=ANTICIPATIVE_TIME_VARYING,
structure=ANTICIPATIVE_TIME_VARYING,
),
int_variable(
"nb_stop",
lower_bound=literal(0),
structural_type=ANTICIPATIVE_TIME_VARYING,
structure=ANTICIPATIVE_TIME_VARYING,
),
int_variable(
"nb_start",
lower_bound=literal(0),
structural_type=ANTICIPATIVE_TIME_VARYING,
structure=ANTICIPATIVE_TIME_VARYING,
),
],
ports=[ModelPort(port_type=BALANCE_PORT_TYPE, port_name="balance_port")],
Expand Down Expand Up @@ -208,7 +234,9 @@
),
# It also works by writing ExpressionRange(-param("d_min_down") + 1, 0) as ExpressionRange's __post_init__ wraps integers to literal nodes. However, MyPy does not seem to infer that ExpressionRange's attributes are necessarily of ExpressionNode type and raises an error if the arguments in the constructor are integer (whereas it runs correctly), this why we specify it here with literal(0) instead of 0.
],
objective_contribution=(param("cost") * var("generation")).sum().expec(),
objective_operational_contribution=(param("cost") * var("generation"))
.sum()
.expec(),
)

# Same model as previous one, except that starting/stopping variables are now non anticipative
Expand All @@ -234,17 +262,17 @@
"nb_on",
lower_bound=literal(0),
upper_bound=param("nb_units_max"),
structural_type=NON_ANTICIPATIVE_TIME_VARYING,
structure=NON_ANTICIPATIVE_TIME_VARYING,
),
int_variable(
"nb_stop",
lower_bound=literal(0),
structural_type=NON_ANTICIPATIVE_TIME_VARYING,
structure=NON_ANTICIPATIVE_TIME_VARYING,
),
int_variable(
"nb_start",
lower_bound=literal(0),
structural_type=NON_ANTICIPATIVE_TIME_VARYING,
structure=NON_ANTICIPATIVE_TIME_VARYING,
),
],
ports=[ModelPort(port_type=BALANCE_PORT_TYPE, port_name="balance_port")],
Expand Down Expand Up @@ -282,7 +310,9 @@
<= param("nb_units_max").shift(-param("d_min_down")) - var("nb_on"),
),
],
objective_contribution=(param("cost") * var("generation")).sum().expec(),
objective_operational_contribution=(param("cost") * var("generation"))
.sum()
.expec(),
)

SPILLAGE_MODEL = model(
Expand All @@ -296,7 +326,7 @@
definition=-var("spillage"),
)
],
objective_contribution=(param("cost") * var("spillage")).sum().expec(),
objective_operational_contribution=(param("cost") * var("spillage")).sum().expec(),
)

UNSUPPLIED_ENERGY_MODEL = model(
Expand All @@ -310,7 +340,9 @@
definition=var("unsupplied_energy"),
)
],
objective_contribution=(param("cost") * var("unsupplied_energy")).sum().expec(),
objective_operational_contribution=(param("cost") * var("unsupplied_energy"))
.sum()
.expec(),
)

# Simplified model
Expand Down Expand Up @@ -357,48 +389,5 @@
== param("inflows"),
),
],
objective_contribution=literal(0), # Implcitement nul ?
)

SHORT_TERM_STORAGE_COMPLEX = model(
id="STS_COMPLEX",
parameters=[
float_parameter("p_max_injection"),
float_parameter("p_max_withdrawal"),
float_parameter("level_min"),
float_parameter("level_max"),
float_parameter("inflows"),
float_parameter(
"efficiency"
), # Should be constant, but time-dependent values should work as well
],
variables=[
float_variable(
"injection", lower_bound=literal(0), upper_bound=param("p_max_injection")
),
float_variable(
"withdrawal", lower_bound=literal(0), upper_bound=param("p_max_withdrawal")
),
float_variable(
"level", lower_bound=param("level_min"), upper_bound=param("level_max")
),
],
ports=[ModelPort(port_type=BALANCE_PORT_TYPE, port_name="balance_port")],
port_fields_definitions=[
PortFieldDefinition(
port_field=PortFieldId("balance_port", "flow"),
definition=var("withdrawal") - var("injection"),
)
],
constraints=[
Constraint(
name="Level",
expression=var("level")
- var("level").shift(-1)
- param("efficiency") * var("injection")
+ var("withdrawal")
== param("inflows"),
),
],
objective_contribution=literal(0), # Implcitement nul ?
objective_operational_contribution=literal(0), # Implcitement nul ?
)
197 changes: 197 additions & 0 deletions src/andromede/libs/standard_sc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
from andromede.expression import literal, param, var
from andromede.expression.expression import port_field
from andromede.libs.standard import CONSTANT, TIME_AND_SCENARIO_FREE
from andromede.model import (
Constraint,
ModelPort,
PortField,
PortType,
float_parameter,
float_variable,
model,
)
from andromede.model.model import PortFieldDefinition, PortFieldId

"""
Flow port
"""
FLOW_PORT = PortType(id="flow_port", fields=[PortField("flow")])

"""
Simple node that manage flow interconnections.
"""
NODE_MODEL = model(
id="Noeud",
ports=[ModelPort(port_type=FLOW_PORT, port_name="FlowN")],
binding_constraints=[
Constraint(
name="Balance",
expression=port_field("FlowN", "flow").sum_connections() == literal(0),
)
],
)

"""
Basic consumption model.
It consume a fixed amount of energy "d" each hour.
"""
DEMAND_MODEL = model(
id="Energy Demand model",
parameters=[float_parameter("demand", CONSTANT)],
ports=[ModelPort(port_type=FLOW_PORT, port_name="FlowD")],
port_fields_definitions=[
PortFieldDefinition(
port_field=PortFieldId("FlowD", "flow"),
definition=-param("demand"),
)
],
)

"""
Model of a power generator.
The power production p is bounded between p_min and p_max.
An emission factor is used to determine the CO² emission according to the production.
"""
PROD_MODEL = model(
id="Production",
parameters=[float_parameter("p_max", CONSTANT), float_parameter("cost", CONSTANT)],
variables=[
float_variable("prod", lower_bound=literal(0), upper_bound=param("p_max"))
],
ports=[ModelPort(port_type=FLOW_PORT, port_name="FlowP")],
port_fields_definitions=[
PortFieldDefinition(
port_field=PortFieldId("FlowP", "flow"),
definition=var("prod"),
)
],
objective_operational_contribution=(param("cost") * var("prod")).sum().expec(),
)

"""
Simple Convertor model.
"""
CONVERTOR_MODEL = model(
id="Convertor model",
parameters=[float_parameter("alpha")],
variables=[
float_variable("input", lower_bound=literal(0)),
float_variable("output"),
],
ports=[
ModelPort(port_type=FLOW_PORT, port_name="FlowDI"),
ModelPort(port_type=FLOW_PORT, port_name="FlowDO"),
],
port_fields_definitions=[
PortFieldDefinition(
port_field=PortFieldId("FlowDI", "flow"),
definition=-var("input"),
),
PortFieldDefinition(
port_field=PortFieldId("FlowDO", "flow"),
definition=var("output"),
),
],
constraints=[
Constraint(
name="Conversion",
expression=var("output") == var("input") * param("alpha"),
)
],
)

"""
Two inputs Convertor model.
"""
TWO_INPUTS_CONVERTOR_MODEL = model(
id="Convertor model",
parameters=[float_parameter("alpha1"), float_parameter("alpha2")],
variables=[
float_variable("input1", lower_bound=literal(0)),
float_variable("input2", lower_bound=literal(0)),
float_variable("output"),
],
ports=[
ModelPort(port_type=FLOW_PORT, port_name="FlowDI1"),
ModelPort(port_type=FLOW_PORT, port_name="FlowDI2"),
ModelPort(port_type=FLOW_PORT, port_name="FlowDO"),
],
port_fields_definitions=[
PortFieldDefinition(
port_field=PortFieldId("FlowDI1", "flow"),
definition=-var("input1"),
),
PortFieldDefinition(
port_field=PortFieldId("FlowDI2", "flow"),
definition=-var("input2"),
),
PortFieldDefinition(
port_field=PortFieldId("FlowDO", "flow"),
definition=var("output"),
),
],
constraints=[
Constraint(
name="Conversion",
expression=var("output")
== var("input1") * param("alpha1") + var("input2") * param("alpha2"),
)
],
)

DECOMPOSE_1_FLOW_INTO_2_FLOW = model(
id="Consumption electrolyzer model",
variables=[
float_variable("input1", lower_bound=literal(0)),
float_variable("input2", lower_bound=literal(0)),
float_variable("output"),
],
ports=[
ModelPort(port_type=FLOW_PORT, port_name="FlowDI1"),
ModelPort(port_type=FLOW_PORT, port_name="FlowDI2"),
ModelPort(port_type=FLOW_PORT, port_name="FlowDO"),
],
port_fields_definitions=[
PortFieldDefinition(
port_field=PortFieldId("FlowDI1", "flow"),
definition=-var("input1"),
),
PortFieldDefinition(
port_field=PortFieldId("FlowDI2", "flow"),
definition=-var("input2"),
),
PortFieldDefinition(
port_field=PortFieldId("FlowDO", "flow"), definition=var("output")
),
],
constraints=[
Constraint(
name="output",
expression=var("output") == var("input1") + var("input2"),
),
],
)

CONVERTOR_MODEL_MOD = model(
id="Convertor model",
parameters=[float_parameter("alpha")],
variables=[
float_variable("input", lower_bound=literal(0)),
],
ports=[
ModelPort(port_type=FLOW_PORT, port_name="FlowDI"),
ModelPort(port_type=FLOW_PORT, port_name="FlowDO"),
],
port_fields_definitions=[
PortFieldDefinition(
port_field=PortFieldId("FlowDO", "flow"),
definition=var("input") * param("alpha"),
),
],
constraints=[
Constraint(
name="Conversion",
expression=var("input") == port_field("FlowDI", "flow").sum_connections(),
)
],
)
Loading

0 comments on commit 927cc47

Please sign in to comment.