Turbine (Multistage)#

This is a composite model for a power plant turbine with high, intermediate and low pressure sections. This model contains an inlet stage with throttle valves for partial arc admission and optional splitters for steam extraction.

The figure below shows the layout of the mutistage turbine model. Optional splitters provide for steam extraction. The splitters can have two or more outlets (one being the main steam outlet). The streams that connect one stage to the next can also be omitted. This allows for connecting additional unit models (usually reheaters) between stages.

../../../../_images/turbine_multistage.svg

MultiStage Turbine Model#

Example#

This example sets up a turbine multistage turbine model similar to what could be found in a power plant steam cycle. There are 7 high-pressure stages, 14 intermediate-pressure stages, and 11 low-pressure stages. Steam extractions are provided after stages hp4, hp7, ip5, ip14, lp4, lp7, lp9, lp11. The extraction at ip14 uses a splitter with three outlets, one for the main steam, one for the boiler feed pump, and one for a feedwater heater. There is a disconnection between the HP and IP sections so that steam can be sent to a reheater. In this example, a heater block is a stand-in for a reheater model.

from pyomo.environ import (ConcreteModel, SolverFactory, TransformationFactory,
                           Constraint, value)
from pyomo.network import Arc

from idaes.core import FlowsheetBlock
from idaes.unit_models import Heater
from idaes.models_extra.power_generation.unit_models.helm import HelmTurbineMultistage
from idaes.models.properties import iapws95

solver = SolverFactory('ipopt')
solver.options = {'tol': 1e-6}

m = ConcreteModel()
m.fs = FlowsheetBlock(dynamic=False)
m.fs.properties = iapws95.Iapws95ParameterBlock()
m.fs.turb = HelmTurbineMultistage(
    property_package=m.fs.properties,
    num_hp=7,
    num_ip=14,
    num_lp=11,
    hp_split_locations=[4,7],
    ip_split_locations=[5, 14],
    lp_split_locations=[4,7,9,11],
    hp_disconnect=[7], # 7 is last stage in hp so disconnect hp from ip
    ip_split_num_outlets={14:3}
)
# Add reheater (for example using a simple heater block)
m.fs.reheat = Heater(property_package=m.fs.properties)
# Add Arcs (streams) to connect the HP and IP sections through reheater
m.fs.hp_to_reheat = Arc(source=m.fs.turb.hp_split[7].outlet_1,
                        destination=m.fs.reheat.inlet)
m.fs.reheat_to_ip = Arc(source=m.fs.reheat.outlet,
                        destination=m.fs.turb.ip_stages[1].inlet)
# Set the turbine inlet conditions and an initial flow guess
p = 2.4233e7
hin = iapws95.htpx(T=880, P=p)
m.fs.turb.inlet_split.inlet.enth_mol[0].fix(hin)
m.fs.turb.inlet_split.inlet.flow_mol[0].fix(26000)
m.fs.turb.inlet_split.inlet.pressure[0].fix(p)

# Set the inlet of the ip section for initialization, since it is disconnected
p = 7.802e+06
hin = iapws95.htpx(T=880, P=p)
m.fs.turb.ip_stages[1].inlet.enth_mol[0].value = hin
m.fs.turb.ip_stages[1].inlet.flow_mol[0].value = 25220.0
m.fs.turb.ip_stages[1].inlet.pressure[0].value = p
# Set the efficiency and pressure ratios of stages other than inlet and outlet
for i, s in turb.hp_stages.items():
    s.ratioP[:] = 0.88
    s.efficiency_isentropic[:] = 0.9
for i, s in turb.ip_stages.items():
    s.ratioP[:] = 0.85
    s.efficiency_isentropic[:] = 0.9
for i, s in turb.lp_stages.items():
    s.ratioP[:] = 0.82
    s.efficiency_isentropic[:] = 0.9
# Usually these fractions would be determined by the boiler feed water heater
# network. Since this example doesn't include them, just fix split fractions
turb.hp_split[4].split_fraction[0,"outlet_2"].fix(0.03)
turb.hp_split[7].split_fraction[0,"outlet_2"].fix(0.03)
turb.ip_split[5].split_fraction[0,"outlet_2"].fix(0.04)
turb.ip_split[14].split_fraction[0,"outlet_2"].fix(0.04)
turb.ip_split[14].split_fraction[0,"outlet_3"].fix(0.15)
turb.lp_split[4].split_fraction[0,"outlet_2"].fix(0.04)
turb.lp_split[7].split_fraction[0,"outlet_2"].fix(0.04)
turb.lp_split[9].split_fraction[0,"outlet_2"].fix(0.04)
turb.lp_split[11].split_fraction[0,"outlet_2"].fix(0.04)
# unfix inlet flow for pressure driven simulation
turb.inlet_split.inlet.flow_mol.unfix()
# Set the inlet steam mixer to use the constraints that the pressures of all
# inlet streams are equal
turb.inlet_mix.use_equal_pressure_constraint()
# Initialize turbine
turb.initialize(outlvl=1)
# Copy conditions out of turbine to initialize the reheater
for t in m.fs.time:
    m.fs.reheat.inlet.flow_mol[t].value = \
        value(turb.hp_split[7].outlet_1_state[t].flow_mol)
    m.fs.reheat.inlet.enth_mol[t].value = \
        value(turb.hp_split[7].outlet_1_state[t].enth_mol)
    m.fs.reheat.inlet.pressure[t].value = \
        value(turb.hp_split[7].outlet_1_state[t].pressure)
# initialize the reheater
m.fs.reheat.initialize(outlvl=4)
# Add constraint to the reheater to result in 880K outlet temperature
def reheat_T_rule(b, t):
    return m.fs.reheat.control_volume.properties_out[t].temperature == 880
m.fs.reheat.temperature_out_equation = Constraint(m.fs.reheat.time_ref,
    rule=reheat_T_rule)
# Expand the Arcs connecting the turbine to the reheater
TransformationFactory("network.expand_arcs").apply_to(m)
# Fix the outlet pressure (usually determined by condenser)
m.fs.turb.outlet_stage.control_volume.properties_out[0].pressure.fix()

# Solve the pressure driven flow model with reheat
solver.solve(m, tee=True)

Unit Models#

The multistage turbine model contains the models in the table below. The splitters for steam extraction are not present if a turbine section contains no steam extractions.

Unit

Index Sets

Doc

inlet_split

None

Splitter to split the main steam feed into steams for each arc (Separator)

throttle_valve

Admission Arcs

Throttle valves for each admission arc (HelmValve)

inlet_stage

Admission Arcs

Parallel inlet turbine stages that represent admission arcs (TurbineInlet)

inlet_mix

None

Mixer to combine the streams from each arc back to one stream (Mixer)

hp_stages

HP stages

Turbine stages in the high-pressure section (TurbineStage)

ip_stages

IP stages

Turbine stages in the intermediate-pressure section (TurbineStage)

lp_stages

LP stages

Turbine stages in the low-pressure section (TurbineStage)

hp_splits

subset of HP stages

Extraction splitters in the high-pressure section (Separator)

ip_splits

subset of IP stages

Extraction splitters in the high-pressure section (Separator)

lp_splits

subset of LP stages

Extraction splitters in the high-pressure section (Separator)

outlet_stage

None

The final stage in the turbine, which calculates exhaust losses (TurbineOutlet)

Initialization#

The initialization approach is to sequentially initialize each sub-unit using the outlet of the previous model. Before initializing the model, the inlet of the turbine, and any stage that is disconnected should be given a reasonable guess. The efficiency and pressure ration of the stages in the HP, IP and LP sections should be specified. For the inlet and outlet stages the flow coefficient should be specified. Valve coefficients should also be specified. A reasonable guess for split fractions should also be given for any extraction splitters present. The most likely cause of initialization failure is flow coefficients in inlet stage, outlet stage, or valves that do not pair well with the specified flow rates.

The flow coefficients for the inlet and outlet stage can be difficult to determine, therefore the initialization arguments calculate_outlet_cf and calculate_outlet_cf are provided. If these are True, the first stage flow coefficient is calculated from the flow and pressure ratio guesses, and the outlet flow coefficient is calculated from the exhaust pressure and flow.

TurbineMultistage Class#

class idaes.models_extra.power_generation.unit_models.helm.turbine_multistage.HelmTurbineMultistage(*args, **kwds)#

Multistage steam turbine with optional reheat and extraction

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

    Only False, in a dynamic flowsheet this is pseudo-steady- state.

    has_holdup

    Only False, in a dynamic flowsheet this is pseudo-steady- state.

    property_package

    Property parameter object used to define property calculations, default - useDefault. Valid values: { useDefault - use default package from parent model or flowsheet, PropertyParameterObject - a PropertyParameterBlock object.}

    property_package_args

    A ConfigBlock with arguments to be passed to a property block(s) and used when constructing these, default - None. Valid values: { see property package for documentation.}

    num_parallel_inlet_stages

    Number of parallel inlet stages to simulate partial arc admission. Default=4

    throttle_valve_function

    The type of valve function, if custom provide an expression rule with the valve_function_rule argument. default - ValveFunctionType.linear Valid values - { ValveFunctionType.linear, ValveFunctionType.quick_opening, ValveFunctionType.equal_percentage, ValveFunctionType.custom}

    throttle_valve_function_callback

    A callback to add a custom valve function to the throttle valves or None. If a callback is provided, it should take the valve block data as an argument and add a valve_function expressions to it. Default=None

    num_hp

    Number of high pressure stages not including inlet stage

    num_ip

    Number of intermediate pressure stages

    num_lp

    Number of low pressure stages not including outlet stage

    hp_split_locations

    A list of index locations of splitters in the HP section. The indexes indicate after which stage to include splitters. 0 is between the inlet stage and the first regular HP stage.

    ip_split_locations

    A list of index locations of splitters in the IP section. The indexes indicate after which stage to include splitters.

    lp_split_locations

    A list of index locations of splitters in the LP section. The indexes indicate after which stage to include splitters.

    hp_disconnect

    HP Turbine stages to not connect to next with an arc. This is usually used to insert additional units between stages on a flowsheet, such as a reheater

    ip_disconnect

    IP Turbine stages to not connect to next with an arc. This is usually used to insert additional units between stages on a flowsheet, such as a reheater

    lp_disconnect

    LP Turbine stages to not connect to next with an arc. This is usually used to insert additional units between stages on a flowsheet, such as a reheater

    hp_split_num_outlets

    Dict, hp split index: number of splitter outlets, if not 2

    ip_split_num_outlets

    Dict, ip split index: number of splitter outlets, if not 2

    lp_split_num_outlets

    Dict, lp split index: number of splitter outlets, if not 2

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

(HelmTurbineMultistage) New instance

TurbineMultistageData Class#

class idaes.models_extra.power_generation.unit_models.helm.turbine_multistage.HelmTurbineMultistageData(component)[source]#
build()[source]#

General build method for UnitModelBlockData. This method calls a number of sub-methods which automate the construction of expected attributes of unit models.

Inheriting models should call super().build.

Parameters:

None

Returns:

None

initialize_build(outlvl=0, solver=None, flow_iterate=2, optarg=None, copy_disconnected_flow=True, copy_disconnected_pressure=True, calculate_outlet_cf=False, calculate_inlet_cf=False)[source]#

Initialize

Parameters:
  • outlvl – logging level default is NOTSET, which inherits from the parent logger

  • solver – the NL solver

  • flow_iterate – If not calculating flow coefficients, this is the number of times to update the flow and repeat initialization (1 to 5 where 1 does not update the flow guess)

  • optarg – solver arguments, default is None

  • copy_disconnected_flow – Copy the flow through the disconnected stages default is True

  • copy_disconnected_pressure – Copy the pressure through the disconnected stages default is True

  • calculate_outlet_cf – Use the flow initial flow guess to calculate the outlet stage flow coefficient, default is False,

  • calculate_inlet_cf – Use the inlet stage ratioP to calculate the flow coefficient for the inlet stage default is False

Returns:

None

throttle_cv_fix(value)[source]#

Fix the thottle valve coefficients. These are generally the same for each of the parallel stages so this provides a convenient way to set them.

Parameters:

value – The value to fix the turbine inlet flow coefficients at

turbine_inlet_cf_fix(value)[source]#

Fix the inlet turbine stage flow coefficient. These are generally the same for each of the parallel stages so this provides a convenient way to set them.

Parameters:

value – The value to fix the turbine inlet flow coefficients at

turbine_outlet_cf_fix(value)[source]#

Fix the inlet turbine stage flow coefficient. These are generally the same for each of the parallel stages so this provides a convenient way to set them.

Parameters:

value – The value to fix the turbine inlet flow coefficients at