Beispiel #1
0
def test_initialize(build_turbine):
    """Initialize a turbine model"""
    m = build_turbine
    hin = iapws95.htpx(T=880, P=2.4233e7)
    # set inlet
    m.fs.turb.inlet.enth_mol[0].value = hin
    m.fs.turb.inlet.flow_mol[0].value = 26000 / 4.0
    m.fs.turb.inlet.pressure[0].value = 2.4233e7

    m.fs.turb.initialize(outlvl=1)

    eq_cons = activated_equalities_generator(m)
    for c in eq_cons:
        assert (abs(c.body() - c.lower) < 1e-4)
    assert (degrees_of_freedom(m) == 3
            )  #inlet was't fixed and still shouldn't be
Beispiel #2
0
def initialize(m):
    # ------------- ECONOMIZER -----------------------------------------------
    # BFW Boiler Feed Water inlet temeperature = 555 F = 563.706 K
    m.fs.ECON.side_1_inlet.flow_mol[0].fix(24194.177)  # mol/s
    m.fs.ECON.side_1_inlet.enth_mol[0].fix(14990.97)
    m.fs.ECON.side_1_inlet.pressure[0].fix(26922222.222)  # Pa

    # FLUE GAS Inlet from Primary Superheater
    FGrate = 28.3876e3  # mol/s equivalent of ~1930.08 klb/hr
    # Use FG molar composition to set component flow rates (baseline report)
    m.fs.ECON.side_2_inlet.flow_component[0, "H2O"].fix(FGrate * 8.69 / 100)
    m.fs.ECON.side_2_inlet.flow_component[0, "CO2"].fix(FGrate * 14.49 / 100)
    m.fs.ECON.side_2_inlet.flow_component[0, "N2"].fix(
        FGrate * (8.69 + 14.49 + 2.47 + 0.06 + 0.2) / 100)
    m.fs.ECON.side_2_inlet.flow_component[0, "O2"].fix(FGrate * 2.47 / 100)
    m.fs.ECON.side_2_inlet.flow_component[0, "NO"].fix(FGrate * 0.0006)
    m.fs.ECON.side_2_inlet.flow_component[0, "SO2"].fix(FGrate * 0.002)
    m.fs.ECON.side_2_inlet.temperature[0].fix(682.335)  # K
    m.fs.ECON.side_2_inlet.pressure[0].fix(100145)  # Pa

    # economizer design variables and parameters
    ITM = 0.0254  # inch to meter conversion
    # Based on NETL Baseline Report Rev3
    m.fs.ECON.tube_di.fix((2 - 2 * 0.188) * ITM)  # calc inner diameter
    #                                       (2 = outer diameter, thickness = 0.188)
    m.fs.ECON.tube_thickness.fix(0.188 * ITM)  # tube thickness
    m.fs.ECON.pitch_x.fix(3.5 * ITM)
    # pitch_y = (54.5) gas path transverse width /columns
    m.fs.ECON.pitch_y.fix(5.03 * ITM)
    m.fs.ECON.tube_length.fix(53.41 * 12 * ITM)  # use tube length (53.41 ft)
    m.fs.ECON.tube_nrow.fix(36 * 2.5)  # use to match baseline performance
    m.fs.ECON.tube_ncol.fix(130)  # 130 from NETL
    m.fs.ECON.nrow_inlet.fix(2)
    m.fs.ECON.delta_elevation.fix(50)
    # parameters
    # heat transfer resistance due to tube side fouling (water scales)
    m.fs.ECON.tube_r_fouling = 0.000176
    # heat transfer resistance due to tube shell fouling (ash deposition)
    m.fs.ECON.shell_r_fouling = 0.00088
    if m.fs.ECON.config.has_radiation is True:
        m.fs.ECON.emissivity_wall.fix(0.7)  # wall emissivity
    # correction factor for overall heat transfer coefficient
    m.fs.ECON.fcorrection_htc.fix(1.5)
    # correction factor for pressure drop calc tube side
    m.fs.ECON.fcorrection_dp_tube.fix(1.0)
    # correction factor for pressure drop calc shell side
    m.fs.ECON.fcorrection_dp_shell.fix(1.0)

    ## --------- Primary Superheater ------------
    #   Steam from water wall
    #    h = iapws95.htpx(773.15,1)
    #    print(h)
    hprsh = iapws95.htpx(773.15, 24865516.722)
    print(hprsh)
    m.fs.PrSH.side_1_inlet.flow_mol[0].fix(24190.26)  # mol/s
    m.fs.PrSH.side_1_inlet.enth_mol[0].fix(hprsh)  # J/mol
    m.fs.PrSH.side_1_inlet.pressure[0].fix(2.5449e7)  # Pascals

    # FLUE GAS Inlet from Primary Superheater
    FGrate = 28.3876e3 * 0.18  # mol/s equivalent of ~1930.08 klb/hr
    # Use FG molar composition to set component flow rates (baseline report)
    m.fs.PrSH.side_2_inlet.flow_component[0, "H2O"].fix(FGrate * 8.69 / 100)
    m.fs.PrSH.side_2_inlet.flow_component[0, "CO2"].fix(FGrate * 14.49 / 100)
    m.fs.PrSH.side_2_inlet.flow_component[0, "N2"].fix(
        FGrate * (8.69 + 14.49 + 2.47 + 0.06 + 0.2) / 100)
    m.fs.PrSH.side_2_inlet.flow_component[0, "O2"].fix(FGrate * 2.47 / 100)
    m.fs.PrSH.side_2_inlet.flow_component[0, "NO"].fix(FGrate * 0.0006)
    m.fs.PrSH.side_2_inlet.flow_component[0, "SO2"].fix(FGrate * 0.002)
    m.fs.PrSH.side_2_inlet.temperature[0].fix(1180.335)
    m.fs.PrSH.side_2_inlet.pressure[0].fix(100145)

    # Primary Superheater
    ITM = 0.0254  # inch to meter conversion
    m.fs.PrSH.tube_di.fix((2.5 - 2 * 0.165) * ITM)
    m.fs.PrSH.tube_thickness.fix(0.165 * ITM)
    m.fs.PrSH.pitch_x.fix(3 * ITM)
    # gas path transverse width 54.78 ft / number of columns
    m.fs.PrSH.pitch_y.fix(54.78 / 108 * 12 * ITM)
    m.fs.PrSH.tube_length.fix(53.13 * 12 * ITM)
    m.fs.PrSH.tube_nrow.fix(20 * 2)
    m.fs.PrSH.tube_ncol.fix(108)
    m.fs.PrSH.nrow_inlet.fix(4)
    m.fs.PrSH.delta_elevation.fix(50)
    m.fs.PrSH.tube_r_fouling = 0.000176  # (0.001 h-ft^2-F/BTU)
    m.fs.PrSH.shell_r_fouling = 0.003131  # (0.03131 - 0.1779 h-ft^2-F/BTU)
    if m.fs.PrSH.config.has_radiation is True:
        m.fs.PrSH.emissivity_wall.fix(0.7)  # wall emissivity
    #correction factor for overall heat transfer coefficient
    m.fs.PrSH.fcorrection_htc.fix(1.5)
    #correction factor for pressure drop calc tube side
    m.fs.PrSH.fcorrection_dp_tube.fix(1.0)
    #correction factor for pressure drop calc shell side
    m.fs.PrSH.fcorrection_dp_shell.fix(1.0)

    #  ----- Finishing Superheater ----------------------
    #   Steam from Platen Supeheater
    hfsh = iapws95.htpx(823.15, 24790249.01)
    print(hfsh)
    m.fs.FSH.side_1_inlet.flow_mol[0].fix(24194.177)  # mol/s
    m.fs.FSH.side_1_inlet.enth_mol[0].fix(hfsh)  # J/mol
    m.fs.FSH.side_1_inlet.pressure[0].fix(24790249.01)  #2.5449e7)    # Pascals

    # FLUE GAS Inlet from Primary Superheater
    FGrate = 28.3876e3  # mol/s equivalent of ~1930.08 klb/hr
    # Use FG molar composition to set component flow rates (baseline report)
    m.fs.FSH.side_2_inlet.flow_component[0, "H2O"].fix(FGrate * 8.69 / 100)
    m.fs.FSH.side_2_inlet.flow_component[0, "CO2"].fix(FGrate * 14.49 / 100)
    m.fs.FSH.side_2_inlet.flow_component[0, "N2"].fix(
        FGrate * (8.69 + 14.49 + 2.47 + 0.06 + 0.2) / 100)
    m.fs.FSH.side_2_inlet.flow_component[0, "O2"].fix(FGrate * 2.47 / 100)
    m.fs.FSH.side_2_inlet.flow_component[0, "NO"].fix(FGrate * 0.0006)
    m.fs.FSH.side_2_inlet.flow_component[0, "SO2"].fix(FGrate * 0.002)
    m.fs.FSH.side_2_inlet.temperature[0].fix(1300.335)
    m.fs.FSH.side_2_inlet.pressure[0].fix(100145)

    # Finishing Superheater
    ITM = 0.0254  # inch to meter conversion
    m.fs.FSH.tube_di.fix((2.5 - 2 * 0.165) * ITM)
    m.fs.FSH.tube_thickness.fix(0.165 * ITM)
    m.fs.FSH.pitch_x.fix(3 * ITM)
    # gas path transverse width 54.78 ft / number of columns
    m.fs.FSH.pitch_y.fix(54.78 / 108 * 12 * ITM)
    m.fs.FSH.tube_length.fix(53.13 * 12 * ITM)
    m.fs.FSH.tube_nrow.fix(8 * 2)  # 20*2
    m.fs.FSH.tube_ncol.fix(85)  #108
    m.fs.FSH.nrow_inlet.fix(2)
    m.fs.FSH.delta_elevation.fix(50)
    m.fs.FSH.tube_r_fouling = 0.000176  # (0.001 h-ft^2-F/BTU)
    m.fs.FSH.shell_r_fouling = 0.003131  # (0.03131 - 0.1779 h-ft^2-F/BTU)
    if m.fs.FSH.config.has_radiation is True:
        m.fs.FSH.emissivity_wall.fix(0.7)  # wall emissivity
    #correction factor for overall heat transfer coefficient
    m.fs.FSH.fcorrection_htc.fix(1.0)
    #correction factor for pressure drop calc tube side
    m.fs.FSH.fcorrection_dp_tube.fix(1.0)
    #correction factor for pressure drop calc shell side
    m.fs.FSH.fcorrection_dp_shell.fix(1.0)

    #  ----- Reheater Superheater ----------------------
    #   Steam from HP Turbine outlet
    m.fs.RH.side_1_inlet.flow_mol[0].fix(21235.27)  # mol/s
    m.fs.RH.side_1_inlet.enth_mol[0].fix(53942.7569)  # J/mol
    m.fs.RH.side_1_inlet.pressure[0].fix(3677172.33638)  # Pascals

    # FLUE GAS Inlet from Finishing Superheater
    FGrate = 28.3876e3 * 0.85  # mol/s equivalent of ~1930.08 klb/hr
    # Use FG molar composition to set component flow rates (baseline report)
    m.fs.RH.side_2_inlet.flow_component[0, "H2O"].fix(FGrate * 8.69 / 100)
    m.fs.RH.side_2_inlet.flow_component[0, "CO2"].fix(FGrate * 14.49 / 100)
    m.fs.RH.side_2_inlet.flow_component[0, "N2"].fix(
        FGrate * (8.69 + 14.49 + 2.47 + 0.06 + 0.2) / 100)
    m.fs.RH.side_2_inlet.flow_component[0, "O2"].fix(FGrate * 2.47 / 100)
    m.fs.RH.side_2_inlet.flow_component[0, "NO"].fix(FGrate * 0.0006)
    m.fs.RH.side_2_inlet.flow_component[0, "SO2"].fix(FGrate * 0.002)
    m.fs.RH.side_2_inlet.temperature[0].fix(1180.335)
    m.fs.RH.side_2_inlet.pressure[0].fix(100145)

    # Reheater Superheater
    ITM = 0.0254  # inch to meter conversion
    m.fs.RH.tube_di.fix((2.5 - 2 * 0.165) * ITM)
    m.fs.RH.tube_thickness.fix(0.11 * ITM)
    m.fs.RH.pitch_x.fix(3 * ITM)
    # gas path transverse width 54.08 ft / number of columns
    m.fs.RH.pitch_y.fix(54.08 / 108 * 12 * ITM)
    m.fs.RH.tube_length.fix(53.82 * 12 * ITM)
    m.fs.RH.tube_nrow.fix(18 * 2)
    m.fs.RH.tube_ncol.fix(82 + 70)
    m.fs.RH.nrow_inlet.fix(2)
    m.fs.RH.delta_elevation.fix(30)
    m.fs.RH.tube_r_fouling = 0.000176  # (0.001 h-ft^2-F/BTU)
    m.fs.RH.shell_r_fouling = 0.00088  # (0.03131 - 0.1779 h-ft^2-F/BTU)
    if m.fs.RH.config.has_radiation is True:
        m.fs.RH.emissivity_wall.fix(0.7)  # wall emissivity
    #correction factor for overall heat transfer coefficient
    m.fs.RH.fcorrection_htc.fix(1.8)
    #correction factor for pressure drop calc tube side
    m.fs.RH.fcorrection_dp_tube.fix(1.0)
    #correction factor for pressure drop calc shell side
    m.fs.RH.fcorrection_dp_shell.fix(1.0)

    #    Platen Superheater ------------------------------------------
    hpl = iapws95.htpx(798.15, 24790249.01)
    m.fs.PlSH.inlet[:].flow_mol.fix(24194.177)
    m.fs.PlSH.inlet[:].enth_mol.fix(hpl)
    m.fs.PlSH.inlet[:].pressure.fix(24790249.01)  #2.5449e7)
    m.fs.PlSH.heat_duty[:].fix(5.5e7)

    #    Water wall Superheater ------------------------------------------
    hww = iapws95.htpx(588.15, 2.5449e7)
    m.fs.Water_wall.inlet[:].flow_mol.fix(24194.177)
    m.fs.Water_wall.inlet[:].enth_mol.fix(hww)
    m.fs.Water_wall.inlet[:].pressure.fix(24865516.722)  #2.5449e7)
    m.fs.Water_wall.heat_duty[:].fix(8.76e8)

    #   splitter flue gas from Finishing SH to Reheater and Primary SH
    m.fs.Spl1.split_fraction[0, 'outlet_1'].fix(0.85)
    # FLUE GAS Inlet from Primary Superheater
    FGrate = 28.3876e3  # mol/s equivalent of ~1930.08 klb/hr
    # Use FG molar composition to set component flow rates (baseline report)
    m.fs.Spl1.inlet.flow_component[0, "H2O"].fix(FGrate * 8.69 / 100)
    m.fs.Spl1.inlet.flow_component[0, "CO2"].fix(FGrate * 14.49 / 100)
    m.fs.Spl1.inlet.flow_component[0, "N2"].fix(
        FGrate * (8.69 + 14.49 + 2.47 + 0.06 + 0.2) / 100)
    m.fs.Spl1.inlet.flow_component[0, "O2"].fix(FGrate * 2.47 / 100)
    m.fs.Spl1.inlet.flow_component[0, "NO"].fix(FGrate * 0.0006)
    m.fs.Spl1.inlet.flow_component[0, "SO2"].fix(FGrate * 0.002)
    m.fs.Spl1.inlet.temperature[0].fix(1180.335)
    m.fs.Spl1.inlet.pressure[0].fix(100145)

    #    mixer (econ inlet) fluegas outlet from reheater and primary superheater
    #     ['Reheat_out', 'PrSH_out']
    m.fs.mix1.Reheat_out.flow_component[0, "H2O"].fix(FGrate * 8.69 / 100)
    m.fs.mix1.Reheat_out.flow_component[0, "CO2"].fix(FGrate * 14.49 / 100)
    m.fs.mix1.Reheat_out.flow_component[0, "N2"].fix(
        FGrate * (8.69 + 14.49 + 2.47 + 0.06 + 0.2) / 100)
    m.fs.mix1.Reheat_out.flow_component[0, "O2"].fix(FGrate * 2.47 / 100)
    m.fs.mix1.Reheat_out.flow_component[0, "NO"].fix(FGrate * 0.0006)
    m.fs.mix1.Reheat_out.flow_component[0, "SO2"].fix(FGrate * 0.002)
    m.fs.mix1.Reheat_out.pressure.fix(100145)
    m.fs.mix1.Reheat_out.temperature.fix(731.5)
    # Fixed SprayWater as small flow and arbitrary conditions (will be connected from FW pump splitter)
    m.fs.mix1.PrSH_out.flow_component[0, "H2O"].fix(FGrate * 8.69 / 100)
    m.fs.mix1.PrSH_out.flow_component[0, "CO2"].fix(FGrate * 14.49 / 100)
    m.fs.mix1.PrSH_out.flow_component[0, "N2"].fix(
        FGrate * (8.69 + 14.49 + 2.47 + 0.06 + 0.2) / 100)
    m.fs.mix1.PrSH_out.flow_component[0, "O2"].fix(FGrate * 2.47 / 100)
    m.fs.mix1.PrSH_out.flow_component[0, "NO"].fix(FGrate * 0.0006)
    m.fs.mix1.PrSH_out.flow_component[0, "SO2"].fix(FGrate * 0.002)
    m.fs.mix1.PrSH_out.pressure.fix(100145)
    m.fs.mix1.PrSH_out.temperature.fix(731.15)

    # Attemperator inputs
    hatt = iapws95.htpx(875.15, 24865516.722)
    m.fs.ATMP1.Steam.flow_mol.fix(24194.177)
    m.fs.ATMP1.Steam.enth_mol.fix(hatt)
    m.fs.ATMP1.Steam.pressure.fix(24865516.722)
    # Fixed SprayWater from FW pump splitter (splitter is needded)
    hatt2 = iapws95.htpx(563.15, 2.5449e7)
    m.fs.ATMP1.SprayWater_state[:].flow_mol.fix(0.001)
    m.fs.ATMP1.SprayWater_state[:].pressure.fix(1.22e8)
    m.fs.ATMP1.SprayWater_state[:].enth_mol.fix(hatt2)

    # ---------  Initialization ------------------------------------------
    # Initialize Units
    m.fs.ECON.initialize(outlvl=4)
    m.fs.PrSH.initialize(outlvl=4)
    m.fs.FSH.initialize(outlvl=4)
    m.fs.RH.initialize(outlvl=4)
    m.fs.PlSH.initialize(outlvl=4)
    m.fs.Water_wall.initialize(outlvl=4)
    m.fs.Spl1.initialize(outlvl=4)
    m.fs.mix1.initialize(outlvl=4)
    m.fs.ATMP1.initialize(outlvl=4)
    print('initialization done')
Beispiel #3
0
def test_initialize():
    """Make a turbine model and make sure it doesn't throw exception"""
    m = build_turbine_for_run_test()
    turb = m.fs.turb

    # Set the inlet of the turbine
    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, which is disconnected
    # here to insert reheater
    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

    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

    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)

    # Congiure with reheater for a full test
    turb.ip_stages[1].inlet.unfix()
    turb.inlet_split.inlet.flow_mol.unfix()
    turb.inlet_mix.use_equal_pressure_constraint()
    turb.initialize(outlvl=1)

    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)
    m.fs.reheat.initialize(outlvl=4)

    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.flowsheet().config.time, rule=reheat_T_rule)

    TransformationFactory("network.expand_arcs").apply_to(m)
    m.fs.turb.outlet_stage.control_volume.properties_out[0].pressure.fix()

    assert (degrees_of_freedom(m) == 0)
    solver.solve(m, tee=True)

    eq_cons = activated_equalities_generator(m)
    for c in eq_cons:
        assert (abs(c.body() - c.lower) < 1e-4)

    return m
Beispiel #4
0
def test_initialize_dyn(build_turbine_dyn):
    """Initialize a turbine model"""
    m = build_turbine_dyn
    hin = iapws95.htpx(T=880, P=2.4233e7)
    """
def initialize(m, fileinput=None, outlvl=3):
    """ Initialize a mode from create_model(), set model inputs before
    initializing.

    Args:
        m (ConcreteModel): A Pyomo model from create_model()
        fileinput (str|None): File to load initialized model state from. If a
            file is supplied skip initialization routine. If None, initialize.

    Returns:
        solver: A Pyomo solver object, that can be used to solve the model.

    """
    init_log = getInitLogger(m.name, outlvl)
    solver = pyo.SolverFactory("ipopt")
    solver.options = {
        "tol": 1e-7,
        "linear_solver": "ma27",
        "max_iter": 40,
    }
    if fileinput is not None:
        init_log.log(5,
                     "Loading initial values from file: {}".format(fileinput))
        ms.from_json(m, fname=fileinput)
        return solver

    init_log.log(5, "Starting initialization")
    ############################################################################
    #  Initialize turbine                                                      #
    ############################################################################
    # Extraction rates are calculated from the feedwater heater models, so to
    # initialize the turbine fix some initial guesses. They get unfixed after
    # solving the turbine
    m.fs.turb.outlet_stage.control_volume.properties_out[:].pressure.fix(3500)
    m.fs.turb.lp_split[11].split_fraction[:, "outlet_2"].fix(0.04403)
    m.fs.turb.lp_split[10].split_fraction[:, "outlet_2"].fix(0.04025)
    m.fs.turb.lp_split[8].split_fraction[:, "outlet_2"].fix(0.04362)
    m.fs.turb.lp_split[4].split_fraction[:, "outlet_2"].fix(0.08025)
    m.fs.turb.ip_split[10].split_fraction[:, "outlet_2"].fix(0.045)
    m.fs.turb.ip_split[10].split_fraction[:, "outlet_3"].fix(0.04)
    m.fs.turb.ip_split[5].split_fraction[:, "outlet_2"].fix(0.05557)
    m.fs.turb.hp_split[7].split_fraction[:, "outlet_2"].fix(0.09741)
    m.fs.turb.hp_split[4].split_fraction[:, "outlet_2"].fix(0.0740)
    # Put in a rough initial guess for the IP section inlet, since it is
    # disconnected from the HP section for the reheater.
    ip1_pin = 5.35e6
    ip1_hin = iapws95.htpx(T=866, P=ip1_pin)
    ip1_fin = pyo.value(m.fs.turb.inlet_split.inlet.flow_mol[0])
    m.fs.turb.ip_stages[1].inlet.enth_mol[:].value = ip1_hin
    m.fs.turb.ip_stages[1].inlet.flow_mol[:].value = ip1_fin
    m.fs.turb.ip_stages[1].inlet.pressure[:].value = ip1_pin
    # initialize turbine
    assert degrees_of_freedom(m.fs.turb) == 0
    m.fs.turb.initialize(outlvl=5, optarg=solver.options)
    # The turbine outlet pressure is determined by the condenser once hooked up
    m.fs.turb.outlet_stage.control_volume.properties_out[:].pressure.unfix()
    # Extraction rates are calculated once the feedwater heater models are
    # added so unfix the splits.
    m.fs.turb.lp_split[11].split_fraction[:, "outlet_2"].unfix()
    m.fs.turb.lp_split[10].split_fraction[:, "outlet_2"].unfix()
    m.fs.turb.lp_split[8].split_fraction[:, "outlet_2"].unfix()
    m.fs.turb.lp_split[4].split_fraction[:, "outlet_2"].unfix()
    m.fs.turb.ip_split[10].split_fraction[:, "outlet_3"].unfix()
    m.fs.turb.ip_split[5].split_fraction[:, "outlet_2"].unfix()
    m.fs.turb.hp_split[7].split_fraction[:, "outlet_2"].unfix()
    m.fs.turb.hp_split[4].split_fraction[:, "outlet_2"].unfix()
    # Initialize the boiler feed pump turbine.
    _set_port(m.fs.bfpt.inlet, m.fs.turb.ip_split[10].outlet_3)
    m.fs.bfpt.initialize(outlvl=5, optarg=solver.options)
    ############################################################################
    #  Condenser section                                                       #
    ############################################################################
    # initialize condenser mixer
    _set_port(m.fs.condenser_mix.main, m.fs.turb.outlet_stage.outlet)
    _set_port(m.fs.condenser_mix.bfpt, m.fs.bfpt.outlet)
    m.fs.condenser_mix.initialize(outlvl=5, optarg=solver.options)
    # initialize condenser hx
    _set_port(m.fs.condenser.inlet_1, m.fs.condenser_mix.outlet_tpx)
    _set_port(m.fs.condenser.outlet_2, m.fs.condenser.inlet_2)
    # This still has the outlet vapor fraction fixed at 0, so if that isn't
    # true for the initial pressure guess this could fail to initialize
    m.fs.condenser.inlet_1.fix()
    m.fs.condenser.inlet_1.pressure.unfix()
    res = solver.solve(m.fs.condenser, tee=init_tee(init_log))
    init_log.log(4, "Condenser initialized: {}".format(condition(res)))
    init_log.log(
        3, "Init condenser pressure: {}".format(
            m.fs.condenser.shell.properties_in[0].pressure.value))
    m.fs.condenser.inlet_1.unfix()
    # initialize hotwell
    _set_port(m.fs.hotwell.condensate, m.fs.condenser.outlet_1_ph)
    m.fs.hotwell.initialize(outlvl=5, optarg=solver.options)
    m.fs.hotwell.condensate.unfix()
    # initialize condensate pump
    _set_port(m.fs.cond_pump.inlet, m.fs.hotwell.outlet)
    m.fs.cond_pump.initialize(outlvl=5, optarg=solver.options)
    ############################################################################
    #  Low-pressure FWH section                                                #
    ############################################################################
    # fwh1
    m.fs.fwh1.drain_mix.drain.flow_mol[:] = 1000
    m.fs.fwh1.drain_mix.drain.pressure[:] = 1e5
    m.fs.fwh1.drain_mix.drain.enth_mol[:] = 6117
    _set_port(m.fs.fwh1.condense.inlet_2, m.fs.cond_pump.outlet)
    _set_port(m.fs.fwh1.drain_mix.steam, m.fs.turb.lp_split[11].outlet_2)
    m.fs.fwh1.initialize(outlvl=5, optarg=solver.options)
    # initialize fwh1 drain pump
    _set_port(m.fs.fwh1_pump.inlet, m.fs.fwh1.condense.outlet_1)
    m.fs.fwh1_pump.initialize(outlvl=5, optarg=solver.options)
    # initialize mixer to add fwh1 drain to feedwater
    _set_port(m.fs.fwh1_return.feedwater, m.fs.fwh1.condense.outlet_2)
    _set_port(m.fs.fwh1_return.fwh1_drain, m.fs.fwh1.condense.outlet_1)
    m.fs.fwh1_return.initialize(outlvl=5, optarg=solver.options)
    m.fs.fwh1_return.feedwater.unfix()
    m.fs.fwh1_return.fwh1_drain.unfix()
    # fwh2
    m.fs.fwh2.drain_mix.drain.flow_mol[:] = 100
    m.fs.fwh2.drain_mix.drain.pressure[:] = 1.5e5
    m.fs.fwh2.drain_mix.drain.enth_mol[:] = 7000
    _set_port(m.fs.fwh2.cooling.inlet_2, m.fs.fwh1_return.outlet)
    _set_port(m.fs.fwh2.desuperheat.inlet_1, m.fs.turb.lp_split[10].outlet_2)
    m.fs.fwh2.initialize(outlvl=5, optarg=solver.options)
    # fwh3
    m.fs.fwh3.drain_mix.drain.flow_mol[:] = 100
    m.fs.fwh3.drain_mix.drain.pressure[:] = 2.5e5
    m.fs.fwh3.drain_mix.drain.enth_mol[:] = 8000
    _set_port(m.fs.fwh3.cooling.inlet_2, m.fs.fwh2.desuperheat.outlet_2)
    _set_port(m.fs.fwh3.desuperheat.inlet_1, m.fs.turb.lp_split[8].outlet_2)
    m.fs.fwh3.initialize(outlvl=5, optarg=solver.options)
    # fwh4
    _set_port(m.fs.fwh4.cooling.inlet_2, m.fs.fwh3.desuperheat.outlet_2)
    _set_port(m.fs.fwh4.desuperheat.inlet_1, m.fs.turb.lp_split[4].outlet_2)
    m.fs.fwh4.initialize(outlvl=5, optarg=solver.options)
    ############################################################################
    #  boiler feed pump and deaerator                                          #
    ############################################################################
    _set_port(m.fs.fwh5_da.feedwater, m.fs.fwh4.desuperheat.outlet_2)
    _set_port(m.fs.fwh5_da.steam, m.fs.turb.ip_split[10].outlet_2)
    m.fs.fwh5_da.drain.flow_mol[:] = 2000
    m.fs.fwh5_da.drain.pressure[:] = 3e6
    m.fs.fwh5_da.drain.enth_mol[:] = 9000
    m.fs.fwh5_da.initialize(outlvl=5, optarg=solver.options)
    _set_port(m.fs.bfp.inlet, m.fs.fwh5_da.outlet)
    m.fs.bfp.control_volume.properties_out[:].pressure.fix()
    m.fs.bfp.initialize(outlvl=5, optarg=solver.options)
    m.fs.bfp.control_volume.properties_out[:].pressure.unfix()
    ############################################################################
    #  High-pressure feedwater heaters                                         #
    ############################################################################
    # fwh6
    m.fs.fwh6.drain_mix.drain.flow_mol[:] = 1000
    m.fs.fwh6.drain_mix.drain.pressure[:] = 1e7
    m.fs.fwh6.drain_mix.drain.enth_mol[:] = 9500
    _set_port(m.fs.fwh6.cooling.inlet_2, m.fs.bfp.outlet)
    _set_port(m.fs.fwh6.desuperheat.inlet_1, m.fs.turb.ip_split[5].outlet_2)
    m.fs.fwh6.initialize(outlvl=5, optarg=solver.options)
    # fwh7
    m.fs.fwh7.drain_mix.drain.flow_mol[:] = 2000
    m.fs.fwh7.drain_mix.drain.pressure[:] = 1e7
    m.fs.fwh7.drain_mix.drain.enth_mol[:] = 9500
    _set_port(m.fs.fwh7.cooling.inlet_2, m.fs.fwh6.desuperheat.outlet_2)
    _set_port(m.fs.fwh7.desuperheat.inlet_1, m.fs.turb.hp_split[7].outlet_2)
    m.fs.fwh7.initialize(outlvl=5, optarg=solver.options)
    # fwh8
    _set_port(m.fs.fwh8.cooling.inlet_2, m.fs.fwh7.desuperheat.outlet_2)
    _set_port(m.fs.fwh8.desuperheat.inlet_1, m.fs.turb.hp_split[4].outlet_2)
    m.fs.fwh8.initialize(outlvl=5, optarg=solver.options)

    res = solver.solve(m, tee=init_tee(init_log))
    init_log.log(5, "Initialization Complete: {}".format(condition(res)))

    return solver