SOEC Simple Design Model

The simple SOEC design model can be used as a design point model during initial development of a flowsheet concept. The model does basic mass and energy balances to calculate cell voltage and current. Users specify the outlet temperature and water utilization, for which typical representative values can be readily obtained. Based on typical current densities the size of the SOEC module can be estimated, if rough capital costs are needed.

Performance of the SOEC away from the design point can be handled in two way. Either the more detailed spatially discretized models can be used, or surrogate models can be coupled with this model.


The example below shows how to setup a feedwater heater with all three sections. The feedwater flow rate, steam conditions, heat transfer coefficients and areas are not necessarily realistic.

import pyomo.environ as pyo
import idaes
from idaes.core import FlowsheetBlock
from import (
import idaes.core.util.scaling as iscale
from import get_prop
from idaes.models_extra.power_generation.unit_models.soec_design import SoecDesign, EosType
import pytest

def soec_example_flowsheet(eos=EosType.PR):
    m = pyo.ConcreteModel()
    m.fs = FlowsheetBlock(dynamic=False)

    sweep_comp = {

    feed_comp = {
        "H2": 0.01,
        "H2O": 0.99,

    m.fs.o2_side_prop_params = GenericParameterBlock(
        **get_prop(sweep_comp, {"Vap"}, eos=eos),
        doc="Air property parameters",
    m.fs.h2_side_prop_params = GenericParameterBlock(
        **get_prop(feed_comp, {"Vap"}, eos=eos),
        doc="Flue gas property parameters",
    m.fs.soec = SoecDesign(

    for (t, i), c in m.fs.soec.hydrogen_side_inlet.mole_frac_comp.items():
    for (t, i), c in m.fs.soec.oxygen_side_inlet.mole_frac_comp.items():
    return m

# create a flowsheet with the SOEC model
model = soec_example_flowsheet()

Model Structure

Internally the model consist of several subunits. The internal structure is not important. The SOEC consist two sides separated by a solid oxide electrolyte. The oxygen side carries the oxygen generated by electrolysis and a sweep gas. The hydrogen side contains water and hydrogen. The water is broken into hydrogen and oxygen. Hydrogen stays on the hydrogen side and oxygen leaves in the water side.

The hydrogen side properties are specified by providing a physical property parameter block to the hydrogen_side_property_package config option, and must contain only hydrogen and water. The oxygen side properties are specified by providing a physical property parameter block to the oxygen_side_property_package config option, and must contain at least oxygen and other sweep gas components. Typical sweep gas choices are air or steam. It is recommended that the property parameters be used with the generic IDAES property package. See the example above.

There four ports, an inlet and outlet on the hydrogen side and an inlet and outlet on the oxygen side. The ports are named hydrogen_side_inlet, hydrogen_side_outlet, oxygen_side_inlet, and oxygen_side_outlet.

Degrees of Freedom

The typical variables that should be specified are: * inlet ports, * water utilization water_utilization, * hydrogen side outlet temperature hydrogen_side_outlet_temperature, and * oxygen side outlet temperature oxygen_side_outlet_temperature.

If the has_heat_transfer configuration option is set to true the heat variable should also be specified.


The main outputs of interest in the model are the outlet ports, cell_voltage and current.

SoecDesign Class

class idaes.models_extra.power_generation.unit_models.soec_design.SoecDesign(*args, **kwds)

Simple SOEC model for process design.

  • rule (function) – A rule function or None. Default rule calls build().

  • concrete (bool) – If True, make this a toplevel model. Default - False.

  • ctype (class) – Pyomo ctype of the block. Default - pyomo.environ.Block

  • default (dict) –

    Default ProcessBlockData config


    Indicates whether this model will be dynamic or not, default = useDefault. Valid values: { useDefault - get flag from parent (default = False), True - set as a dynamic model, False - set as a steady-state model.}


    Indicates whether holdup terms should be constructed or not. Must be True if dynamic = True, default - False. Valid values: { useDefault - get flag from parent (default = False), True - construct holdup terms, False - do not construct holdup terms}


    Property package for the oxygen side, using idaes.models_e is strongly recomended, either Peng-Robinson or Ideal is okay


    Property package for the hydrogen side, using idaes.models is strongly recomended, either Peng-Robinson or Ideal is okay


    Property package arguments for the oxygen side.


    Property package arguments for the hydrogen side.


    Reaction properties equation of state in: {EosType.PR, EosType.IDEAL}.


    Indicates whether the SOEC is adiabatic. Default=False (adiabatic)

  • initialize (dict) – ProcessBlockData config for individual elements. Keys are BlockData indexes and values are dictionaries described under the “default” argument above.

  • idx_map (function) – Function to take the index of a BlockData element and return the index in the initialize dict from which to read arguments. This can be provided to overide the default behavior of matching the BlockData index exactly to the index in initialize.


(SoecDesign) New instance

SoecDesignData Class

class idaes.models_extra.power_generation.unit_models.soec_design.SoecDesignData(component)[source]

Simple 0D SOEC model. This model can be used to develop a flowsheet at the design point or for the basis of a surrogate. For off-design applications, a more detailed model is required.


Construct a unit model data block


Calculate scale factors for the unit model equations

initialize_build(outlvl=0, solver=None, optarg=None)[source]

This is a general purpose initialization routine for simple unit models. This method assumes a single ControlVolume block called controlVolume, and first initializes this and then attempts to solve the entire unit.

More complex models should overload this method with their own initialization routines,

Keyword Arguments
  • state_args – a dict of arguments to be passed to the property package(s) to provide an initial state for initialization (see documentation of the specific property package) (default = {}).

  • outlvl – sets output level of initialization routine

  • optarg – solver options dictionary object (default=None, use default solver options)

  • solver – str indicating which solver to use during initialization (default = None, use default IDAES solver)




Set the expected electrical current scale


scale (float) – Expected electrical current scale




Set default flow scaling in the property packages based on the expected magnitude of typical flows


scale (float) – Expected molar flow variable scale




Set the heat transfer scale factor roughly based on the size of the process.


scale (float) – Expected heat transfer scale