Public interface
Node types
Electrolyzer nodes
EnergyModelsHydrogen.SimpleElectrolyzer — TypeSimpleElectrolyzer <: AbstractElectrolyzerDescription 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
idis the name/identifier of the node.cap::TimeProfileis the installed capacity.opex_var::TimeProfileis the variable operating expense per capacity usage.opex_fixed::TimeProfileis the fixed operating expense per installed capacity.input::Dict{<:Resource, <:Real}are the inputResources with conversion valueReal.output::Dict{<:Resource, <:Real}are the producedResources with conversion valueReal.data::Vector{<:ExtensionData}is the additional data (e.g. for investments).load_limits::LoadLimitsare limits on the utilization load of the electrolyser.LoadLimitscan provide both lower and upper limits on the actual load.degradation_rate::Realis the percentage drop in efficiency due to degradation in %/1000 h.stack_replacement_cost::TimeProfileis the replacement cost of electrolyzer stacks.stack_lifetime::Realis the total operational stack life time.
- The nominal electrolyzer efficiency is captured through the combination of
inputandoutput. - 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 <: AbstractElectrolyzerDescription 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
idis the name/identifier of the node.cap::TimeProfileis the installed capacity.opex_var::TimeProfileis the variable operating expense per capacity used (through the variable:cap_use).opex_fixed::TimeProfileis the fixed operating expense per installed capacity.input::Dict{<:Resource, <:Real}are the inputResources with conversion valueReal.output::Dict{<:Resource, <:Real}are the producedResources with conversion valueReal.data::Vector{<:ExtensionData}is the additional data (e.g. for investments).load_limits::LoadLimitsare limits on the utilization load of the electrolyser.LoadLimitscan provide both lower and upper limits on the actual load.degradation_rate::Realis the percentage drop in efficiency due to degradation in %/1000 h.stack_replacement_cost::TimeProfileis the replacement cost of electrolyzer stacks.stack_lifetime::Realis the total operational stack life time.
- The nominal electrolyzer efficiency is captured through the combination of
inputandoutput. - 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 <: AbstractReformerA network node with start-up and shut-down time and costs that should be used for reformer technology descriptions.
Fields
idis the name/identifier of the node.cap::TimeProfileis the installed capacity.opex_var::TimeProfileis the variable operating expense per capacity usage.opex_fixed::TimeProfileis the fixed operating expense per installed capacity.input::Dict{<:Resource, <:Real}are the inputResources with conversion valueReal.output::Dict{<:Resource, <:Real}are the producedResources with conversion valueReal.data::Array{ExtensionData}is an array of additional data (e.g., for investments).load_limits::LoadLimitsare limits on the utilization load of the electrolyser.LoadLimitscan provide both lower and upper limits on the actual load.startup::CommitParametersare parameters for the startup state constraints.shutdown::CommitParametersare parameters for the shutdown state constraints.offline::CommitParametersare parameters for the offline state constraints.ramp_limit::AbstractRampParametersare 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:outputthrough theoutputdictionary. - 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
idis the name/identifier of the node.charge::EMB.UnionCapacityare the charging parameters of theSimpleHydrogenStoragenode. Depending on the chosen type, the charge parameters can include variable OPEX, fixed OPEX, and/or a capacity.level::EMB.UnionCapacityare the level parameters of theSimpleHydrogenStoragenode. Depending on the chosen type, the charge parameters can include variable OPEX and/or fixed OPEX.stor_res::Resourceis the storedResource.input::Dict{<:Resource, <:Real}are the inputResources with conversion valueReal.output::Dict{<:Resource, <:Real}are the generatedResources with conversion valueReal. Only relevant for linking and the storedResourceas the output value is not utilized in the calculations.data::Vector{<:ExtensionData}is the additional data (e.g., for investments). The fielddatais conditional through usage of a constructor.discharge_charge::Float64is the multiplier for specifying the maximum discharge rate relative to the charge rate. A value of2.0would imply that it is possible to have double the discharge rate compared to the installed charge capacity.level_charge::Float64is 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
idis the name/identifier of the node.charge::EMB.UnionCapacityare the charging parameters of theSimpleHydrogenStoragenode. Depending on the chosen type, the charge parameters can include variable OPEX, fixed OPEX, and/or a capacity.stor_res::Resourceis the storedResource.el_res::Resourceis theResourcerepresenting electricity. It must be specified explicitly for the proper calculation of the electricity demand for compression.data::Vector{<:ExtensionData}is the additional data (e.g., for investments). The fielddatais conditional through usage of a constructor.discharge_charge::Float64is the multiplier for specifying the maximum discharge rate relative to the charge rate. A value of2.0would imply that it is possible to have double the discharge rate compared to the installed charge capacity.level_charge::Float64is 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::Float64is the minimum pressure in the storage.p_charge::Float64is the charging pressure into the storage.p_max::Float64is the maximum pressure in the storage.
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
minis the minimum load as fraction of the installed capacity.maxis 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 CommitParametersType for providing parameters required in unit commitment constraints.
Fields
opex::TimeProfileis the cost profile per installed capacity and operational duration if the node is within the state.time::TimeProfileis 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 <: AbstractRampParametersParameters for both positive and negative ramping constraints for a node.
Fields
up::TimeProfileis the maximum positive rate of change of a node.down::TimeProfileis the maximum negative rate of change of a node.
EnergyModelsHydrogen.RampUp — Typestruct RampUp <: AbstractRampParametersParameters for positive ramping constraints for a node.
Fields
up::TimeProfileis the maximum positive rate of change of a node.
EnergyModelsHydrogen.RampDown — Typestruct RampDown <: AbstractRampParametersParameters for negative ramping constraints for a node.
Fields
down::TimeProfileis the maximum negative rate of change of a node.
EnergyModelsHydrogen.RampNone — Typestruct RampNone <: AbstractRampParametersParameters when no ramping constraints should be included.