Public interface

Node types

Electrolyzer nodes

EnergyModelsHydrogen.SimpleElectrolyzerType
SimpleElectrolyzer <: 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 input Resources with conversion value Real.
  • output::Dict{<:Resource, <:Real} are the produced Resources with conversion value Real.
  • 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.
Note
  • The nominal electrolyzer efficiency is captured through the combination of input and output.
  • 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.
source
EnergyModelsHydrogen.ElectrolyzerType
Electrolyzer <: 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 input Resources with conversion value Real.
  • output::Dict{<:Resource, <:Real} are the produced Resources with conversion value Real.
  • 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.
Note
  • The nominal electrolyzer efficiency is captured through the combination of input and output.
  • 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.
source

Reformer nodes

EnergyModelsHydrogen.ReformerType
Reformer <: 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 input Resources with conversion value Real.

  • output::Dict{<:Resource, <:Real} are the produced Resources with conversion value Real.

  • 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.

Note
  • 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 the output 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.
source

Hydrogen storage nodes

EnergyModelsHydrogen.SimpleHydrogenStorageType
SimpleHydrogenStorage{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 the SimpleHydrogenStorage 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 the SimpleHydrogenStorage node. Depending on the chosen type, the charge parameters can include variable OPEX and/or fixed OPEX.
  • stor_res::Resource is the stored Resource.
  • input::Dict{<:Resource, <:Real} are the input Resources with conversion value Real.
  • output::Dict{<:Resource, <:Real} are the generated Resources with conversion value Real. Only relevant for linking and the stored Resource as the output value is not utilized in the calculations.
  • data::Vector{<:Data} is the additional data (e.g., for investments). The field data 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 of 2.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 an AbstractInvestmentModel.
source
EnergyModelsHydrogen.HydrogenStorageType
HydrogenStorage{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 the SimpleHydrogenStorage node. Depending on the chosen type, the charge parameters can include variable OPEX, fixed OPEX, and/or a capacity.
  • stor_res::Resource is the stored Resource.
  • el_res::Resource is the Resource 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 field data 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 of 2.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 an AbstractInvestmentModel.
  • 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.
Units for pressure

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.

source

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.

Parametric type

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.LoadLimitsType
LoadLimits{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.
source

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.CommitParametersType
struct 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.
source

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.RampBiType
struct 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.
Note

The same profile is used for positive and negative bounds if you provide only a single TimeProfile as input.

source
EnergyModelsHydrogen.RampUpType
struct RampUp <: AbstractRampParameters

Parameters for positive ramping constraints for a node.

Fields

  • up::TimeProfile is the maximum positive rate of change of a node.
source
EnergyModelsHydrogen.RampDownType
struct RampDown <: AbstractRampParameters

Parameters for negative ramping constraints for a node.

Fields

  • down::TimeProfile is the maximum negative rate of change of a node.
source