Public interface
Node types
Electrolyzer nodes
EnergyModelsHydrogen.SimpleElectrolyzer
— TypeSimpleElectrolyzer <: AbstractElectrolyzer
Description of a simple electrolyzer node with minimum and maximum load as well as stack replacement. Degradation is calculated, but not used for the efficiency calculations.
New fields compared to NetworkNode
: min_load
, max_load
, degradation_rate
, stack_lifetime
, and stack_replacement_cost
.
Fields
id
is the name/identifier of the node.cap::TimeProfile
is the installed capacity.opex_var::TimeProfile
is the variable operating expense per capacity usage.opex_fixed::TimeProfile
is the fixed operating expense per installed capacity.input::Dict{<:Resource, <:Real}
are the inputResource
s with conversion valueReal
.output::Dict{<:Resource, <:Real}
are the producedResource
s with conversion valueReal
.data::Vector{Data}
is the additional data (e.g. for investments).load_limits::LoadLimits
are limits on the utilization load of the electrolyser.LoadLimits
can provide both lower and upper limits on the actual load.degradation_rate::Real
is the percentage drop in efficiency due to degradation in %/1000 h.stack_replacement_cost::TimeProfile
is the replacement cost of electrolyzer stacks.stack_lifetime::Real
is the total operational stack life time.
- The nominal electrolyzer efficiency is captured through the combination of
input
andoutput
. - The fixed and variable operating expenses are always related to installed capacity and its usage. This implies if you define the capacity via the input through a value of 1, then the variable operating expense is calaculated through the required electricity.
- Stack replacement can only be done once a strategic period, in the first operational period. The thought process behind is that it would otherwise lead to issues if a strategic period is repeated.
EnergyModelsHydrogen.Electrolyzer
— TypeElectrolyzer <: AbstractElectrolyzer
Description of an electrolyzer node with minimum and maximum load as well as degredation and stack replacement.
New fields: min_load
, max_load
, stack_lifetime
, stack_replacement_cost
, and degradation_rate
.
Fields
id
is the name/identifier of the node.cap::TimeProfile
is the installed capacity.opex_var::TimeProfile
is the variable operating expense per capacity used (through the variable:cap_use
).opex_fixed::TimeProfile
is the fixed operating expense per installed capacity.input::Dict{<:Resource, <:Real}
are the inputResource
s with conversion valueReal
.output::Dict{<:Resource, <:Real}
are the producedResource
s with conversion valueReal
.data::Vector{Data}
is the additional data (e.g. for investments).load_limits::LoadLimits
are limits on the utilization load of the electrolyser.LoadLimits
can provide both lower and upper limits on the actual load.degradation_rate::Real
is the percentage drop in efficiency due to degradation in %/1000 h.stack_replacement_cost::TimeProfile
is the replacement cost of electrolyzer stacks.stack_lifetime::Real
is the total operational stack life time.
- The nominal electrolyzer efficiency is captured through the combination of
input
andoutput
. - The fixed and variable operating expenses are always related to installed capacity and its usage. This implies if you define the capacity via the input through a value of 1, then the variable operating expense is calaculated through the required electricity.
- Stack replacement can only be done once a strategic period, in the first operational period. The thought process behind is that it would otherwise lead to issues if a strategic period is repeated.
Reformer nodes
EnergyModelsHydrogen.Reformer
— TypeReformer <: AbstractReformer
A network node with start-up and shut-down time and costs that should be used for reformer technology descriptions.
Fields
id
is the name/identifier of the node.cap::TimeProfile
is the installed capacity.opex_var::TimeProfile
is the variable operating expense per capacity usage.opex_fixed::TimeProfile
is the fixed operating expense per installed capacity.input::Dict{<:Resource, <:Real}
are the inputResource
s with conversion valueReal
.output::Dict{<:Resource, <:Real}
are the producedResource
s with conversion valueReal
.data::Array{Data}
is an array of additional data (e.g., for investments).load_limits::LoadLimits
are limits on the utilization load of the electrolyser.LoadLimits
can provide both lower and upper limits on the actual load.startup::CommitParameters
are parameters for the startup state constraints.shutdown::CommitParameters
are parameters for the shutdown state constraints.offline::CommitParameters
are parameters for the offline state constraints.ramp_limit::AbstractRampParameters
are the limit on the allowable change in the capacity usage.
- If you introduce CO₂ capture through the application of
CaptureEnergyEmissions
, you have to add your CO₂ instance as output. The reason for this is that we declare the variable:output
through theoutput
dictionary. - The specified startup, shutdown, and offline costs are relative to the installed capacity and a duration of 1 of an operational period.
- The rate limit is relative to the installed capacity and a duration of 1 of an operational period.
Hydrogen storage nodes
EnergyModelsHydrogen.SimpleHydrogenStorage
— TypeSimpleHydrogenStorage{T} <: AbstractH2Storage{T}
Storage
node in which the maximum discharge usage is directly linked to the charge capacity, that is it is not possbible to have a larger discharge usage than the charge capacity and a multiplier discharge_charge
.
Fields
id
is the name/identifier of the node.charge::EMB.UnionCapacity
are the charging parameters of theSimpleHydrogenStorage
node. Depending on the chosen type, the charge parameters can include variable OPEX, fixed OPEX, and/or a capacity.level::EMB.UnionCapacity
are the level parameters of theSimpleHydrogenStorage
node. Depending on the chosen type, the charge parameters can include variable OPEX and/or fixed OPEX.stor_res::Resource
is the storedResource
.input::Dict{<:Resource, <:Real}
are the inputResource
s with conversion valueReal
.output::Dict{<:Resource, <:Real}
are the generatedResource
s with conversion valueReal
. Only relevant for linking and the storedResource
as the output value is not utilized in the calculations.data::Vector{<:Data}
is the additional data (e.g., for investments). The fielddata
is conditional through usage of a constructor.discharge_charge::Float64
is the multiplier for specifying the maximum discharge rate relative to the charge rate. A value of2.0
would imply that it is possible to have double the discharge rate compared to the installed charge capacity.level_charge::Float64
is the multiplier for specifying the installed storage level capacity relative to the installed storage charge capacity. It is used for checking input data in the case of a generic model and for limiting investments in the case of anAbstractInvestmentModel
.
EnergyModelsHydrogen.HydrogenStorage
— TypeHydrogenStorage{T} <: AbstractH2Storage{T}
Storage
node in which the maximum discharge usage is directly linked to the charge capacity, that is it is not possbible to have a larger discharge usage than the charge capacity and a multiplier discharge_charge
.
It differs from SimpleHydrogenStorage
through incorporation of a piecewise linear curve for the electricity demand, depending on the current storage level and the defined upper (field p_max
) and charge pressure (field p_charge
) of the node.
Fields
id
is the name/identifier of the node.charge::EMB.UnionCapacity
are the charging parameters of theSimpleHydrogenStorage
node. Depending on the chosen type, the charge parameters can include variable OPEX, fixed OPEX, and/or a capacity.stor_res::Resource
is the storedResource
.el_res::Resource
is theResource
representing electricity. It must be specified explicitly for the proper calculation of the electricity demand for compression.data::Vector{<:Data}
is the additional data (e.g., for investments). The fielddata
is conditional through usage of a constructor.discharge_charge::Float64
is the multiplier for specifying the maximum discharge rate relative to the charge rate. A value of2.0
would imply that it is possible to have double the discharge rate compared to the installed charge capacity.level_charge::Float64
is the multiplier for specifying the installed storage level capacity relative to the installed storage charge capacity. It is used for checking input data in the case of a generic model and for limiting investments in the case of anAbstractInvestmentModel
.p_min::Float64
is the minimum pressure in the storage.p_charge::Float64
is the charging pressure into the storage.p_max::Float64
is the maximum pressure in the storage.
The unit for the pressure inputs p_min
, p_charge
, and p_max
are not relevant as the isentropic compression is only dependent on the pressure ratio. It is however necessary that all pressures use the same unit, e.g., bar or Pa.
Additional types
Limiting the load
The load of a Node
can be constrained to an upper and lower bound. This is achieved through the type LoadLimits
which incorporates the values for both.
LoadLimits
is a Parametric Composite Type. This implies that the values for min and max have to be of the same type (e.g., both have to be Float or Integer)
Load limits are incorporated for both electrolyser nodes as well as the reformer node.
EnergyModelsHydrogen.LoadLimits
— TypeLoadLimits{T<:Real} <: AbstractLoadLimits{T}
Type for the incorporation of limits on the capacity utilization of the node through constraining the variable :cap_use
.
Fields
min
is the minimum load as fraction of the installed capacity.max
is the maximum load as fraction of the installed capacity.
Unit commitment
Unit commitment implies in the context of EMX to parameters that provide information on the stage cost and the minimum time in a stage. They are currently only implemented for the Reformer
node, but can be generalized for other node types, if desired.
EnergyModelsHydrogen.CommitParameters
— Typestruct CommitParameters
Type for providing parameters required in unit commitment constraints.
Fields
opex::TimeProfile
is the cost profile per installed capacity and operational duration if the node is within the state.time::TimeProfile
is the minimum time the node has to remain in the state before it can transition to the next state.
Change of utilization
Change of utilization constraints, also called ramping constraints, require different types to allow for both constraints on the positive change of utilization (ramp up) and negative change of utilization (ramp down). They are currently only implemented for the Reformer
node, but can be generalized for other node types, if desired. In addition, we provide a type when no constraints should be incorporated.
EnergyModelsHydrogen.RampBi
— Typestruct RampBi <: AbstractRampParameters
Parameters for both positive and negative ramping constraints for a node.
Fields
up::TimeProfile
is the maximum positive rate of change of a node.down::TimeProfile
is the maximum negative rate of change of a node.
The same profile is used for positive and negative bounds if you provide only a single TimeProfile
as input.
EnergyModelsHydrogen.RampUp
— Typestruct RampUp <: AbstractRampParameters
Parameters for positive ramping constraints for a node.
Fields
up::TimeProfile
is the maximum positive rate of change of a node.
EnergyModelsHydrogen.RampDown
— Typestruct RampDown <: AbstractRampParameters
Parameters for negative ramping constraints for a node.
Fields
down::TimeProfile
is the maximum negative rate of change of a node.
EnergyModelsHydrogen.RampNone
— Typestruct RampNone <: AbstractRampParameters
Parameters when no ramping constraints should be included.