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.

Example#

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 idaes.models.properties.modular_properties.base.generic_property import (
    GenericParameterBlock)
import idaes.core.util.scaling as iscale
from idaes.models_extra.power_generation.properties.natural_gas_PR 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 = {
        "O2":0.2074,
        "H2O":0.0099,
        "CO2":0.0003,
        "N2":0.7732,
        "Ar":0.0092,
    }

    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(
        oxygen_side_property_package=m.fs.o2_side_prop_params,
        hydrogen_side_property_package=m.fs.h2_side_prop_params,
        reaction_eos=eos
    )

    m.fs.soec.hydrogen_side_inlet.temperature.fix(1023)
    m.fs.soec.hydrogen_side_inlet.pressure.fix(20e5)
    m.fs.soec.hydrogen_side_inlet.flow_mol.fix(2)
    for (t, i), c in m.fs.soec.hydrogen_side_inlet.mole_frac_comp.items():
        c.fix(feed_comp[i])
    m.fs.soec.oxygen_side_inlet.temperature.fix(1023)
    m.fs.soec.oxygen_side_inlet.pressure.fix(20e5)
    m.fs.soec.oxygen_side_inlet.flow_mol.fix(2)
    for (t, i), c in m.fs.soec.oxygen_side_inlet.mole_frac_comp.items():
        c.fix(sweep_comp[i])
    m.fs.soec.hydrogen_side_outlet_temperature.fix(1023)
    m.fs.soec.oxygen_side_outlet_temperature.fix(1023)
    m.fs.soec.water_utilization.fix(0.7)
    iscale.calculate_scaling_factors(m)
    m.fs.soec.initialize(optarg={"max_iter":30})
    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 idaes.models_extra.power_generation.properties.natural_gas_PR 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.

Output#

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.

Parameters:
  • 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

    Config args

    dynamic

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

    has_holdup

    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}

    oxygen_side_property_package

    Property package for the oxygen side, using idaes.models_e xtra.power_generation.properties.natural_gas_PR is strongly recommended, either Peng-Robinson or Ideal is okay

    hydrogen_side_property_package

    Property package for the hydrogen side, using idaes.models _extra.power_generation.properties.natural_gas_PR is strongly recommended, either Peng-Robinson or Ideal is okay

    oxygen_side_property_package_args

    Property package arguments for the oxygen side.

    hydrogen_side_property_package_args

    Property package arguments for the hydrogen side.

    reaction_eos

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

    has_heat_transfer

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

  • initialize (dict) – ProcessBlockData config for individual elements. Keys are BlockData indexes and values are dictionaries with config arguments as keys.

  • 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 override the default behavior of matching the BlockData index exactly to the index in initialize.

Returns:

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

build()[source]#

Construct a unit model data block

calculate_scaling_factors()[source]#

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)

Returns:

None

set_current_scale(scale=1e-06)[source]#

Set the expected electrical current scale

Parameters:

scale (float) – Expected electrical current scale

Returns:

None

set_flow_scale(scale=1)[source]#

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

Parameters:

scale (float) – Expected molar flow variable scale

Returns:

None

set_heat_scale(scale=1e-05)[source]#

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

Parameters:

scale (float) – Expected heat transfer scale

Returns:

None