Integrated Model for an Ultra-supercritical Power Plant with Thermal Energy Storage System

Author: Naresh Susarla (naresh.susarla@netl.doe.gov)

This notebook presents an integrated model for the ultra-supercritical power plant with the thermal energy storage (TES) system. The design of TES system and its optimal integration with the ultra-supercritical power plant are studied separately. The optimal solution obtained from the design model is used to develop the integrated model presented in this tutorial. For further details on the ultra-supercritical power plant model and the design of TES system, readers are welcomed to refer to other Jupyter Notebook tutorials included in this repository to specifically describe those problems.

In this notebook, the components for TES implementation are the following: (1) Storage fluid: Solar salt, (2) steam source during charge: HP steam, (3) condensate recycle: Boiler Feed Pump, and (4) condensate source during discharge: Boiler Feed Pump. An overview of the integrated plant flowsheet is shown in the following process flow diagram.

9a0532be24f54c049957b8b0c8c9fa9f

Note that in this model, both the charge and discharge heat exchangers are included in the same flowsheet. The integrated model is also constructed using the unit models from the power generation unit model library in addition to the IAPWS property package for steam and water, and the Solar salt property package in the storage heat exchangers. The unit models used are shown in the table below:

Unit Model

Units in Flowsheet

HelmTurbineStage

Turbines (T_1 to T_11) and BFPT

HelmSplitter

Turbine Splitters

Heater

Boiler Components (Boiler, RH_1, and RH_2)

HelmMixer

Mixers (CM and DA)

HelmIsentropicCompresssor

Pumps (CP, BP, BFWP, and SP)

HeatExchanger

Condenser, Feed Water Heaters (FWH_1 to FWH_9),

and Storage Systems (HXC and HXD)

The integrated ultra-supercritical power plant model has a total of 4 degrees of freedom, listed below:

  1. Boiler feed water flow (boiler.inlet.flow_mol),

  2. Steam flow to charge heat exchanger (HXC.inlet_1.flow_mol)

  3. Condensate flow to discharge heat exchanger (HXD.inlet_2.flow_mol),

  4. Cooler enthalpy at outlet (cooler.outlet.enth_mol)

To describe the process, first import flowsheet module. The detailed model can be accessed from the Dispatches repository, integrated_storage_with_ultrasupercritical_power_plant.py.

[1]:
from dispatches.case_studies.fossil_case.ultra_supercritical_plant import (ultra_supercritical_powerplant as usc)
import dispatches.case_studies.fossil_case.ultra_supercritical_plant.storage.integrated_storage_with_ultrasupercritical_power_plant as isp
from idaes.core.solvers import get_solver

The integrated model (isp) first imports the ultra-supercritical power plant model and then adds all the unit models required for the integration of a TES system (create_integrated_model). These unit models are connected using Arcs (_create_arcs). Further flowsheet constraints (_make_constraints) are added to the model along with model inputs (set_model_input), bounds (add_bounds) and scaling factors (set_scaling_factors) to all variables in the flowsheets.

The important variables and constraints are described below along with the methods to construct them in the model. Also, note that it is assumed that the power plant alone can produce a maximum power of 436 MW.

Notable Variables

Variable Name

Description

PlantPowerOut

Power out from the power pant in MW

Revenue

Revenue in $ per hour

SaltInventory

Total solar salt inventor y in kg

HotSaltInventory

Hot solar salt inventory in kg

Notable Constraints

  1. The net power is given by the sum of the power produced by the storage system and the plant as shown in the following equation:

\[NetPower = PlantPowerOut + ST.mechanical_{work}\]
  1. The revenue is calculated by considering the given electricity price lmp_signal and the amount of net power NetPower produced by the plant and the storage system. This is shown in the equation below:

\[Revenue = lmp_{signal} * NetPower\]
  1. The salt inventory SaltInventory is given by the hot salt and total salt material balances, the latter involving a fixed amount of salt total_salt. The material balances are shown in the following equations:

\[HotSaltInventory = HotSaltInventory + F^{charge}_{salt, outlet} - F^{discharge}_{salt, inlet}\]
\[total_salt = HotSaltInventory + ColdSaltInventory\]
[2]:
# Build the ultra-supercritical power plant model and initialize
max_power = 436

m = usc.build_plant_model()
usc.initialize(m)

# Create the integrated flowsheet, add properties, unit models, and arcs
m = isp.create_integrated_model(m, max_power=max_power)

# Give all the required inputs to the model
isp.set_model_input(m)

# Add scaling factor
isp.set_scaling_factors(m)

# Initialize the model with a sequential initialization and custom
# routines
isp.initialize(m)

# Add cost correlations
m = isp.build_costing(m)

# Initialize with bounds
isp.initialize_with_costing(m)

# Add bounds
isp.add_bounds(m)
2022-10-28 12:23:07 [INFO] idaes.init.fs.boiler.control_volume: Initialization Complete
2022-10-28 12:23:07 [INFO] idaes.init.fs.boiler: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:07 [INFO] idaes.init.fs.turbine_splitter[1]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:07 [INFO] idaes.init.fs.turbine_splitter[2]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:07 [INFO] idaes.init.fs.reheater[1].control_volume: Initialization Complete
2022-10-28 12:23:07 [INFO] idaes.init.fs.reheater[1]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:07 [INFO] idaes.init.fs.turbine_splitter[3]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:07 [INFO] idaes.init.fs.turbine_splitter[4]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:07 [INFO] idaes.init.fs.reheater[2].control_volume: Initialization Complete
2022-10-28 12:23:07 [INFO] idaes.init.fs.reheater[2]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:08 [INFO] idaes.init.fs.turbine_splitter[5]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:08 [INFO] idaes.init.fs.turbine_splitter[6]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:08 [INFO] idaes.init.fs.turbine_splitter[7]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:08 [INFO] idaes.init.fs.turbine_splitter[8]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:08 [INFO] idaes.init.fs.turbine_splitter[9]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:08 [INFO] idaes.init.fs.turbine_splitter[10]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:09 [INFO] idaes.init.fs.condenser_mix: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:09 [INFO] idaes.init.fs.condenser.control_volume: Initialization Complete
2022-10-28 12:23:09 [INFO] idaes.init.fs.condenser: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:09 [INFO] idaes.init.fs.fwh_mixer[1]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:09 [INFO] idaes.init.fs.fwh[1].hot_side: Initialization Complete
2022-10-28 12:23:09 [INFO] idaes.init.fs.fwh[1].cold_side: Initialization Complete
2022-10-28 12:23:09 [INFO] idaes.init.fs.fwh[1]: Initialization Completed, optimal - Optimal Solution Found
2022-10-28 12:23:09 [INFO] idaes.init.fs.fwh_mixer[2]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:09 [INFO] idaes.init.fs.fwh[2].hot_side: Initialization Complete
2022-10-28 12:23:09 [INFO] idaes.init.fs.fwh[2].cold_side: Initialization Complete
2022-10-28 12:23:09 [INFO] idaes.init.fs.fwh[2]: Initialization Completed, optimal - Optimal Solution Found
2022-10-28 12:23:09 [INFO] idaes.init.fs.fwh_mixer[3]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:09 [INFO] idaes.init.fs.fwh[3].hot_side: Initialization Complete
2022-10-28 12:23:09 [INFO] idaes.init.fs.fwh[3].cold_side: Initialization Complete
2022-10-28 12:23:09 [INFO] idaes.init.fs.fwh[3]: Initialization Completed, optimal - Optimal Solution Found
2022-10-28 12:23:10 [INFO] idaes.init.fs.fwh_mixer[4]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:10 [INFO] idaes.init.fs.fwh[4].hot_side: Initialization Complete
2022-10-28 12:23:10 [INFO] idaes.init.fs.fwh[4].cold_side: Initialization Complete
2022-10-28 12:23:10 [INFO] idaes.init.fs.fwh[4]: Initialization Completed, optimal - Optimal Solution Found
2022-10-28 12:23:10 [INFO] idaes.init.fs.fwh[5].hot_side: Initialization Complete
2022-10-28 12:23:10 [INFO] idaes.init.fs.fwh[5].cold_side: Initialization Complete
2022-10-28 12:23:10 [INFO] idaes.init.fs.fwh[5]: Initialization Completed, optimal - Optimal Solution Found
2022-10-28 12:23:10 [INFO] idaes.init.fs.deaerator: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:10 [INFO] idaes.init.fs.fwh_mixer[6]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:10 [INFO] idaes.init.fs.fwh[6].hot_side: Initialization Complete
2022-10-28 12:23:10 [INFO] idaes.init.fs.fwh[6].cold_side: Initialization Complete
2022-10-28 12:23:10 [INFO] idaes.init.fs.fwh[6]: Initialization Completed, optimal - Optimal Solution Found
2022-10-28 12:23:10 [INFO] idaes.init.fs.fwh_mixer[7]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:10 [INFO] idaes.init.fs.fwh[7].hot_side: Initialization Complete
2022-10-28 12:23:10 [INFO] idaes.init.fs.fwh[7].cold_side: Initialization Complete
2022-10-28 12:23:11 [INFO] idaes.init.fs.fwh[7]: Initialization Completed, optimal - Optimal Solution Found
2022-10-28 12:23:11 [INFO] idaes.init.fs.fwh_mixer[8]: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:11 [INFO] idaes.init.fs.fwh[8].hot_side: Initialization Complete
2022-10-28 12:23:11 [INFO] idaes.init.fs.fwh[8].cold_side: Initialization Complete
2022-10-28 12:23:11 [INFO] idaes.init.fs.fwh[8]: Initialization Completed, optimal - Optimal Solution Found
2022-10-28 12:23:11 [INFO] idaes.init.fs.fwh[9].hot_side: Initialization Complete
2022-10-28 12:23:11 [INFO] idaes.init.fs.fwh[9].cold_side: Initialization Complete
2022-10-28 12:23:11 [INFO] idaes.init.fs.fwh[9]: Initialization Completed, optimal - Optimal Solution Found
Model Initialization =  optimal
*******************  USC Model Initialized   ********************
2022-10-28 12:23:13 [INFO] idaes.init.fs.ess_hp_split: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:13 [INFO] idaes.init.fs.hxc.hot_side: Initialization Complete
2022-10-28 12:23:13 [INFO] idaes.init.dispatches.properties.solarsalt_properties: fs.hxc.cold_side.properties_in Initialisation Step 1 Complete.
2022-10-28 12:23:13 [INFO] idaes.init.dispatches.properties.solarsalt_properties: Initialization Step 1 Complete.
2022-10-28 12:23:13 [INFO] idaes.init.dispatches.properties.solarsalt_properties: fs.hxc.cold_side.properties_out Initialisation Step 1 Complete.
2022-10-28 12:23:13 [INFO] idaes.init.dispatches.properties.solarsalt_properties: Initialization Step 1 Complete.
2022-10-28 12:23:13 [INFO] idaes.init.dispatches.properties.solarsalt_properties: State Released.
2022-10-28 12:23:13 [INFO] idaes.init.fs.hxc.cold_side: Initialization Complete
2022-10-28 12:23:14 [INFO] idaes.init.dispatches.properties.solarsalt_properties: State Released.
2022-10-28 12:23:14 [INFO] idaes.init.fs.hxc: Initialization Completed, optimal - Optimal Solution Found
2022-10-28 12:23:14 [INFO] idaes.init.fs.cooler.control_volume: Initialization Complete
2022-10-28 12:23:14 [INFO] idaes.init.fs.cooler: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:14 [INFO] idaes.init.fs.hx_pump.control_volume: Initialization Complete
2022-10-28 12:23:14 [INFO] idaes.init.fs.hx_pump: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:14 [INFO] idaes.init.fs.ess_bfp_split: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:14 [INFO] idaes.init.fs.recycle_mixer: Initialization Complete: optimal - Optimal Solution Found
2022-10-28 12:23:14 [INFO] idaes.init.dispatches.properties.solarsalt_properties: fs.hxd.hot_side.properties_in Initialisation Step 1 Complete.
2022-10-28 12:23:14 [INFO] idaes.init.dispatches.properties.solarsalt_properties: Initialization Step 1 Complete.
2022-10-28 12:23:14 [INFO] idaes.init.dispatches.properties.solarsalt_properties: fs.hxd.hot_side.properties_out Initialisation Step 1 Complete.
2022-10-28 12:23:14 [INFO] idaes.init.dispatches.properties.solarsalt_properties: Initialization Step 1 Complete.
2022-10-28 12:23:14 [INFO] idaes.init.dispatches.properties.solarsalt_properties: State Released.
2022-10-28 12:23:14 [INFO] idaes.init.fs.hxd.hot_side: Initialization Complete
2022-10-28 12:23:14 [INFO] idaes.init.fs.hxd.cold_side: Initialization Complete
2022-10-28 12:23:15 [INFO] idaes.init.dispatches.properties.solarsalt_properties: State Released.
2022-10-28 12:23:15 [INFO] idaes.init.fs.hxd: Initialization Completed, optimal - Optimal Solution Found
Integrated Model Initialization =  optimal
***************   Integrated Model Initialized   ***************
Cost Initialization =  optimal
******************** Costing Initialized *************************


[2]:
<pyomo.core.base.PyomoModel.ConcreteModel at 0x2512fe55d10>

Next, set up the model inputs, fix the degress of freedom, and solve the model using the model_analysis method for an initial empty Solar salt tank scenario.

[3]:
optarg = {"max_iter": 300}
solver = get_solver('ipopt', optarg)

power_demand = 460

# Tank scenarios: "hot_empty", "hot_full", "hot_half_full"
tank_scenario = "hot_empty"

# If hot_empty is selected and fix_power is True
# then ensure that power_demand <= max_power
fix_power = False

isp.model_analysis(m,
                   solver,
                   power=power_demand,
                   max_power=max_power,
                   tank_scenario=tank_scenario,
                   fix_power=fix_power)
Ipopt 3.13.2: nlp_scaling_method=gradient-based
tol=1e-06
max_iter=150
linear_solver=ma27


******************************************************************************
This program contains Ipopt, a library for large-scale nonlinear optimization.
 Ipopt is released as open source code under the Eclipse Public License (EPL).
         For more information visit http://projects.coin-or.org/Ipopt

This version of Ipopt was compiled from source code available at
    https://github.com/IDAES/Ipopt as part of the Institute for the Design of
    Advanced Energy Systems Process Systems Engineering Framework (IDAES PSE
    Framework) Copyright (c) 2018-2019. See https://github.com/IDAES/idaes-pse.

This version of Ipopt was compiled using HSL, a collection of Fortran codes
    for large-scale scientific computation.  All technical papers, sales and
    publicity material resulting from use of the HSL codes within IPOPT must
    contain the following acknowledgement:
        HSL, a collection of Fortran codes for large-scale scientific
        computation. See http://www.hsl.rl.ac.uk.
******************************************************************************

This is Ipopt version 3.13.2, running with linear solver ma27.

Number of nonzeros in equality constraint Jacobian...:     1595
Number of nonzeros in inequality constraint Jacobian.:        8
Number of nonzeros in Lagrangian Hessian.............:      503

Total number of variables............................:      611
                     variables with only lower bounds:        0
                variables with lower and upper bounds:      499
                     variables with only upper bounds:        1
Total number of equality constraints.................:      605
Total number of inequality constraints...............:        7
        inequality constraints with only lower bounds:        2
   inequality constraints with lower and upper bounds:        0
        inequality constraints with only upper bounds:        5

iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
   0 -6.1496664e-01 2.83e+08 1.00e+00  -1.0 0.00e+00    -  0.00e+00 0.00e+00   0
   1 -6.1438587e-01 2.82e+08 8.68e+00  -1.0 3.09e+06    -  1.95e-02 2.23e-03h  1
   2 -6.1106486e-01 2.82e+08 6.28e+01  -1.0 3.24e+07    -  1.45e-02 2.17e-03h  1
   3 -5.8518823e-01 2.77e+08 6.81e+02  -1.0 3.28e+07    -  1.59e-01 1.67e-02h  1
   4  1.0350043e+00 2.95e+08 2.20e+05  -1.0 3.34e+07    -  2.33e-02 1.00e+00h  1
   5  1.2311738e+00 2.56e+08 1.90e+05  -1.0 3.56e+07    -  6.54e-01 1.36e-01h  1
   6  1.2315358e+00 2.56e+08 2.77e+06  -1.0 3.07e+07  -4.0 8.91e-02 1.80e-04h  1
   7  1.6550837e+00 2.04e+08 2.36e+07  -1.0 3.07e+07  -4.5 3.46e-01 2.11e-01h  1
   8  2.5130753e+00 8.90e+07 1.42e+08  -1.0 2.42e+07  -5.0 7.07e-02 3.62e-01h  1
   9  3.3202605e+00 1.98e+07 5.59e+06  -1.0 1.55e+07  -5.4 7.61e-02 9.86e-01h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  10  3.1394219e+00 1.33e+06 1.70e+07  -1.0 8.67e+05  -5.9 4.55e-02 1.00e+00h  1
  11  3.0998559e+00 1.37e+06 1.95e+05  -1.0 1.84e+05  -6.4 9.83e-01 1.00e+00h  1
  12  3.0995517e+00 1.33e+01 7.74e+02  -1.0 1.38e+03  -6.9 9.90e-01 1.00e+00h  1
  13  2.9721633e+00 1.75e+04 2.61e+01  -1.0 1.17e+06    -  9.66e-01 1.00e+00f  1
  14  1.9062570e-01 4.58e+05 6.87e+00  -1.0 3.81e+07    -  7.37e-01 1.00e+00f  1
  15 -1.2634681e+00 4.28e+06 3.61e+00  -1.0 1.64e+08    -  4.75e-01 1.46e-01h  1
  16 -1.3364941e+00 2.22e+06 2.62e+02  -1.0 5.69e+05  -7.3 1.07e-01 4.51e-01h  1
  17 -1.3391960e+00 2.19e+06 2.58e+02  -1.0 6.17e+05  -7.8 3.29e-03 1.77e-02h  1
  18 -1.4453580e+00 4.08e+03 2.41e+03  -1.0 4.46e+05  -8.3 9.91e-01 1.00e+00f  1
  19 -1.4715549e+00 1.77e+03 2.16e+02  -1.0 1.17e+05  -8.8 9.20e-01 1.00e+00h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  20 -2.1553064e+00 1.63e+05 2.06e+02  -1.0 8.25e+07    -  9.51e-02 4.61e-02f  1
  21 -4.0182155e+00 1.19e+07 1.49e+03  -1.0 3.75e+07    -  1.00e+00 1.00e+00h  1
  22 -3.5232387e+00 6.23e+06 8.34e+02  -1.0 2.32e+07    -  6.96e-01 4.40e-01h  2
  23 -3.5339657e+00 2.49e+04 1.96e-02  -1.0 1.14e+04  -9.2 1.00e+00 1.00e+00h  1
  24 -3.8631799e+00 1.17e+04 3.67e+00  -1.0 2.31e+07    -  1.00e+00 3.23e-01h  1
  25 -3.7813088e+00 1.02e+05 6.08e+00  -1.0 5.89e+06    -  1.00e+00 1.00e+00f  1
  26 -3.5417036e+00 6.73e+05 1.82e-02  -1.0 1.73e+06    -  1.00e+00 1.00e+00h  1
  27 -3.4144202e+00 2.51e+05 1.95e-02  -1.0 1.56e+06    -  1.00e+00 1.00e+00h  1
  28 -3.3970510e+00 3.09e+03 1.84e-04  -1.0 3.14e+05    -  1.00e+00 1.00e+00h  1
  29 -4.7981799e+00 5.68e+06 8.22e+00  -2.5 2.56e+07    -  4.36e-01 6.60e-01f  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  30 -4.9768896e+00 1.60e+07 1.79e+01  -2.5 1.08e+07    -  1.73e-02 8.72e-01h  1
  31 -5.0936781e+00 1.49e+06 1.67e+01  -2.5 1.47e+06    -  2.80e-02 8.97e-01h  1
  32 -5.1112184e+00 7.25e+04 1.52e+01  -2.5 1.62e+05    -  1.01e-01 1.00e+00h  1
  33 -5.1957960e+00 5.03e+05 3.46e+00  -2.5 1.94e+06    -  7.72e-01 1.00e+00h  1
  34 -5.1958092e+00 2.36e+02 7.05e-05  -2.5 4.58e+02  -9.7 1.00e+00 1.00e+00h  1
  35 -5.3343492e+00 1.22e+06 3.52e-02  -3.8 3.22e+07    -  8.31e-02 1.01e-01f  1
  36 -5.3712928e+00 2.64e+05 1.37e-01  -3.8 7.49e+05    -  9.59e-01 7.91e-01h  1
  37 -5.3825670e+00 9.52e+03 5.95e-04  -3.8 1.41e+05    -  1.00e+00 1.00e+00h  1
  38 -5.3823998e+00 1.41e+02 6.74e-07  -3.8 2.04e+03    -  1.00e+00 1.00e+00h  1
  39 -5.3824002e+00 1.40e-01 2.24e-07  -3.8 7.50e+01    -  1.00e+00 1.00e+00h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  40 -5.3855111e+00 1.97e+02 1.97e-04  -5.7 4.58e+04    -  9.96e-01 1.00e+00h  1
  41 -5.3855147e+00 1.20e+00 1.47e-04  -5.7 1.35e+01 -10.2 1.00e+00 1.00e+00h  1
  42 -5.3855152e+00 1.16e-02 9.14e-07  -5.7 5.00e+01    -  1.00e+00 1.00e+00h  1
  43 -5.3855152e+00 3.07e-06 2.21e-09  -5.7 5.62e+00    -  1.00e+00 1.00e+00h  1
  44 -5.3855520e+00 7.90e-01 5.02e-06  -7.0 5.41e+02    -  1.00e+00 1.00e+00h  1
  45 -5.3855520e+00 2.65e-03 5.47e-06  -7.0 4.98e+01    -  1.00e+00 1.00e+00H  1
  46 -5.3855520e+00 4.93e-06 4.04e-05  -7.0 5.89e+00    -  1.00e+00 1.00e+00h  1
  47 -5.3855520e+00 1.04e-07 4.04e-05  -7.0 2.23e+01    -  1.00e+00 1.00e+00H  1
  48 -5.3855520e+00 4.47e-08 1.74e-04  -7.0 1.65e-01    -  1.00e+00 1.00e+00h  1
  49 -5.3855520e+00 6.14e-08 1.74e-04  -7.0 8.61e-06    -  1.00e+00 1.00e+00h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  50 -5.3855520e+00 4.65e-08 1.74e-04  -7.0 4.15e-06    -  1.00e+00 1.00e+00h  1
  51 -5.3855520e+00 7.45e-08 1.74e-04  -7.0 5.52e-07    -  1.00e+00 1.00e+00h  1
  52 -5.3855520e+00 4.47e-08 4.04e-05  -7.0 9.04e-07    -  1.00e+00 1.00e+00H  1
  53 -5.3855520e+00 5.96e-08 2.02e-05  -7.0 1.90e-06    -  1.00e+00 5.00e-01h  2
  54 -5.3855520e+00 8.94e-08 4.04e-05  -7.0 2.96e-06    -  1.00e+00 1.00e+00h  1
  55 -5.3855520e+00 4.29e-08 1.74e-04  -7.0 1.02e-05    -  1.00e+00 1.00e+00h  1
  56 -5.3855520e+00 5.04e-08 8.68e-05  -7.0 5.54e-06    -  1.00e+00 5.00e-01h  2
  57 -5.3855520e+00 8.94e-08 8.41e-05  -7.0 8.57e-06    -  1.00e+00 3.12e-02h  6
  58 -5.3855520e+00 2.98e-08 4.20e-05  -7.0 5.11e-06    -  1.00e+00 5.00e-01h  2
  59 -5.3855520e+00 1.04e-07 1.74e-04  -7.0 1.04e-05    -  1.00e+00 1.00e+00h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  60 -5.3855520e+00 1.94e-07 1.52e-04  -7.0 1.28e-05    -  1.00e+00 1.25e-01h  4
  61 -5.3855520e+00 5.96e-08 1.14e-04  -7.0 1.11e-05    -  1.00e+00 2.50e-01h  3
  62 -5.3855520e+00 5.96e-08 9.97e-05  -7.0 6.69e-06    -  1.00e+00 1.25e-01h  4
  63 -5.3855520e+00 1.49e-08 7.48e-05  -7.0 2.17e-06    -  1.00e+00 2.50e-01h  3
  64 -5.3855520e+00 6.14e-08 6.54e-05  -7.0 2.00e-06    -  1.00e+00 1.25e-01h  4
  65 -5.3855520e+00 9.12e-08 4.91e-05  -7.0 5.75e-06    -  1.00e+00 2.50e-01h  3
  66 -5.3855520e+00 1.49e-08 3.68e-05  -7.0 1.42e-06    -  1.00e+00 2.50e-01h  3
  67 -5.3855520e+00 2.41e-08 2.76e-05  -7.0 8.03e-06    -  1.00e+00 2.50e-01h  3
  68 -5.3855520e+00 6.14e-08 2.07e-05  -7.0 3.83e-06    -  1.00e+00 2.50e-01h  3
  69 -5.3855520e+00 1.67e-08 2.01e-05  -7.0 2.98e-06    -  1.00e+00 3.12e-02h  6
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  70 -5.3855520e+00 1.49e-08 3.85e-09  -7.0 4.55e-06    -  1.00e+00 1.00e+00w  1

Number of Iterations....: 70

                                   (scaled)                 (unscaled)
Objective...............:  -5.3855520382602888e+00   -5.3855520382602888e+00
Dual infeasibility......:   3.8460481061476119e-09    3.8460481061476119e-09
Constraint violation....:   4.6566128730773926e-10    1.4901161193847656e-08
Complementarity.........:   9.0909091367155361e-08    9.0909091367155361e-08
Overall NLP error.......:   9.0909091367155361e-08    9.0909091367155361e-08


Number of objective function evaluations             = 122
Number of objective gradient evaluations             = 71
Number of equality constraint evaluations            = 122
Number of inequality constraint evaluations          = 122
Number of equality constraint Jacobian evaluations   = 71
Number of inequality constraint Jacobian evaluations = 71
Number of Lagrangian Hessian evaluations             = 70
Total CPU secs in IPOPT (w/o function evaluations)   =      0.536
Total CPU secs in NLP function evaluations           =      8.785

EXIT: Optimal Solution Found.
================================


***************** Optimization Results ******************
Revenue ($/h): 9649.224451
Storage Capital Cost ($/h): 46.535959
Fuel Cost ($/h): 7388.289773
Hot Previous Salt Inventory (kg): 75000.000000
Hot Salt Inventory (kg): 0.222636
Cold Previous Salt Inventory (kg): 6664292.000000
Cold Salt Inventory (kg): 6739291.777364
Salt Amount (kg): 6739292.000000


***************** Costing Results ******************
Obj (M$/year): 5.385552
Plant capital cost (M$/y): 63.043181
Plant fixed operating costs (M$/y): 0.470617
Plant variable operating costs (M$/y): 14.617427
Charge capital cost (M$/y): 0.407655
Charge Operating costs (M$/y): 64.721418


***************** Power Plant Operation ******************

Net Power (MW): 438.601111
Plant Power (MW): 436.000002
ES turbine Power (MW): 2.601109
Boiler feed water flow (mol/s): 17889.191749
Boiler duty (MW_th): 919.470166
Cooling duty (MW_th): 0.000001
HXC heat duty (MW): 0.000027
HXD heat duty (MW): 10.009724
Makeup water flow: 239.921458


***************** Charge Heat Exchanger (HXC) ******************

HXC area (m2): 24.750149
HXC Salt flow (kg/s): 0.000057
HXC Salt temperature in (K): 513.150000
HXC Salt temperature out (K): 831.000000
HXC Steam flow to storage (mol/s): 0.000636
HXC Water temperature in (K): 866.150000
HXC Steam temperature out (K): 551.387076
HXC Delta temperature at inlet (K): 35.150000
HXC Delta temperature at outlet (K): 38.237076


*************** Discharge Heat Exchanger (HXD) ****************

HXD area (m2): 2204.890140
HXD Salt flow (kg/s): 20.833329
HXD Salt temperature in (K): 831.000000
HXD Salt temperature out (K): 513.150000
HXD Steam flow to storage (mol/s): 239.921458
HXD Water temperature in (K): 483.857199
HXD Steam temperature out (K): 826.099858
HXD Delta temperature at inlet (K): 4.900142
HXD Delta temperature at outlet (K): 29.292801


Solver details

Problem:
- Lower bound: -inf
  Upper bound: inf
  Number of objectives: 1
  Number of constraints: 612
  Number of variables: 611
  Sense: unknown
Solver:
- Status: ok
  Message: Ipopt 3.13.2\x3a Optimal Solution Found
  Termination condition: optimal
  Id: 0
  Error rc: 0
  Time: 9.49144172668457
Solution:
- number of solutions: 0
  number of solutions displayed: 0


==============================================================
[3]:
<pyomo.core.base.PyomoModel.ConcreteModel at 0x2512fe55d10>

Print the charge and discharge heat exchangers report to see the results.

[4]:
m.fs.hxc.report()
m.fs.hxd.report()

====================================================================================
Unit : fs.hxc                                                              Time: 0.0
------------------------------------------------------------------------------------
    Unit Performance

    Variables:

    Key            : Value    : Units                           : Fixed : Bounds
           HX Area :   24.750 :                      meter ** 2 : False : (0, 6000)
    HX Coefficient : 0.030221 : kilogram / kelvin / second ** 3 : False : (0, 10000)
         Heat Duty :   27.429 :                            watt : False : (0, 200000000.0)

    Expressions:

    Key             : Value  : Units
    Delta T Driving : 36.672 : kelvin
         Delta T In : 35.150 : kelvin
        Delta T Out : 38.237 : kelvin

------------------------------------------------------------------------------------
    Stream Table
                                     Units        shell Inlet shell Outlet tube Inlet tube Outlet
    Molar Flow (mol/s)              mole / second  0.00063601  0.00063601           -           -
    Mass Flow (kg/s)            kilogram / second  1.1458e-05  1.1458e-05           -           -
    T (K)                                  kelvin      866.15      551.39           -           -
    P (Pa)                                 pascal  8.6047e+06  8.6047e+06           -           -
    Vapor Fraction                  dimensionless      1.0000      0.0000           -           -
    Molar Enthalpy (J/mol) Vap       joule / mole      65223.     -34295.           -           -
    Molar Enthalpy (J/mol) Liq       joule / mole      65223.      22096.           -           -
    flow_mass                   kilogram / second           -           -  5.7089e-05  5.7089e-05
    temperature                            kelvin           -           -      513.15         831
    pressure                               pascal           -           -      101325  1.0132e+05
====================================================================================

====================================================================================
Unit : fs.hxd                                                              Time: 0.0
------------------------------------------------------------------------------------
    Unit Performance

    Variables:

    Key            : Value      : Units                           : Fixed : Bounds
           HX Area :     2204.9 :                      meter ** 2 : False : (0, 6000)
    HX Coefficient :     332.30 : kilogram / kelvin / second ** 3 : False : (0, 10000)
         Heat Duty : 1.0010e+07 :                            watt : False : (0, 200000000.0)

    Expressions:

    Key             : Value  : Units
    Delta T Driving : 13.662 : kelvin
         Delta T In : 4.9001 : kelvin
        Delta T Out : 29.293 : kelvin

------------------------------------------------------------------------------------
    Stream Table
                                     Units        shell Inlet shell Outlet tube Inlet tube Outlet
    flow_mass                   kilogram / second    20.833        20.833           -           -
    temperature                            kelvin       831        513.15           -           -
    pressure                               pascal    101325    1.0132e+05           -           -
    Molar Flow (mol/s)              mole / second         -             -      239.92      239.92
    Mass Flow (kg/s)            kilogram / second         -             -      4.3223      4.3223
    T (K)                                  kelvin         -             -      483.86      826.10
    P (Pa)                                 pascal         -             -  3.4958e+07  3.4958e+07
    Vapor Fraction                  dimensionless         -             -      0.0000      0.0000
    Molar Enthalpy (J/mol) Vap       joule / mole         -             -      52205.      58189.
    Molar Enthalpy (J/mol) Liq       joule / mole         -             -      16468.      58189.
====================================================================================