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.

4d98d4b73e25433c976200f095f401d1

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
WARNING: DEPRECATED: The 'pyomo.contrib.incidence_analysis.util' module has
    been moved to 'pyomo.contrib.incidence_analysis.scc_solver'. However, we
    recommend importing this functionality (e.g.
    solve_strongly_connected_components) directly from
    'pyomo.contrib.incidence_analysis'.  (deprecated in 6.5.0) (called from
    c:\gmlc_fe\source_code\idaes-
    pse\idaes\core\initialization\block_triangularization.py:18)

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)
2023-03-28 13:51:21 [INFO] idaes.init.fs.boiler.control_volume: Initialization Complete
2023-03-28 13:51:21 [INFO] idaes.init.fs.boiler: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:21 [INFO] idaes.init.fs.turbine_splitter[1]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:22 [INFO] idaes.init.fs.turbine_splitter[2]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:22 [INFO] idaes.init.fs.reheater[1].control_volume: Initialization Complete
2023-03-28 13:51:22 [INFO] idaes.init.fs.reheater[1]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:22 [INFO] idaes.init.fs.turbine_splitter[3]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:22 [INFO] idaes.init.fs.turbine_splitter[4]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:22 [INFO] idaes.init.fs.reheater[2].control_volume: Initialization Complete
2023-03-28 13:51:22 [INFO] idaes.init.fs.reheater[2]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:22 [INFO] idaes.init.fs.turbine_splitter[5]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:22 [INFO] idaes.init.fs.turbine_splitter[6]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:23 [INFO] idaes.init.fs.turbine_splitter[7]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:23 [INFO] idaes.init.fs.turbine_splitter[8]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:23 [INFO] idaes.init.fs.turbine_splitter[9]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:23 [INFO] idaes.init.fs.turbine_splitter[10]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:24 [INFO] idaes.init.fs.condenser_mix: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:24 [INFO] idaes.init.fs.condenser.control_volume: Initialization Complete
2023-03-28 13:51:24 [INFO] idaes.init.fs.condenser: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:24 [INFO] idaes.init.fs.fwh_mixer[1]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:24 [INFO] idaes.init.fs.fwh[1].hot_side: Initialization Complete
2023-03-28 13:51:24 [INFO] idaes.init.fs.fwh[1].cold_side: Initialization Complete
2023-03-28 13:51:24 [INFO] idaes.init.fs.fwh[1]: Initialization Completed, optimal - Optimal Solution Found
2023-03-28 13:51:24 [INFO] idaes.init.fs.fwh_mixer[2]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:24 [INFO] idaes.init.fs.fwh[2].hot_side: Initialization Complete
2023-03-28 13:51:24 [INFO] idaes.init.fs.fwh[2].cold_side: Initialization Complete
2023-03-28 13:51:24 [INFO] idaes.init.fs.fwh[2]: Initialization Completed, optimal - Optimal Solution Found
2023-03-28 13:51:24 [INFO] idaes.init.fs.fwh_mixer[3]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:24 [INFO] idaes.init.fs.fwh[3].hot_side: Initialization Complete
2023-03-28 13:51:24 [INFO] idaes.init.fs.fwh[3].cold_side: Initialization Complete
2023-03-28 13:51:25 [INFO] idaes.init.fs.fwh[3]: Initialization Completed, optimal - Optimal Solution Found
2023-03-28 13:51:25 [INFO] idaes.init.fs.fwh_mixer[4]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:25 [INFO] idaes.init.fs.fwh[4].hot_side: Initialization Complete
2023-03-28 13:51:25 [INFO] idaes.init.fs.fwh[4].cold_side: Initialization Complete
2023-03-28 13:51:25 [INFO] idaes.init.fs.fwh[4]: Initialization Completed, optimal - Optimal Solution Found
2023-03-28 13:51:25 [INFO] idaes.init.fs.fwh[5].hot_side: Initialization Complete
2023-03-28 13:51:25 [INFO] idaes.init.fs.fwh[5].cold_side: Initialization Complete
2023-03-28 13:51:25 [INFO] idaes.init.fs.fwh[5]: Initialization Completed, optimal - Optimal Solution Found
2023-03-28 13:51:25 [INFO] idaes.init.fs.deaerator: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:26 [INFO] idaes.init.fs.fwh_mixer[6]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:26 [INFO] idaes.init.fs.fwh[6].hot_side: Initialization Complete
2023-03-28 13:51:26 [INFO] idaes.init.fs.fwh[6].cold_side: Initialization Complete
2023-03-28 13:51:26 [INFO] idaes.init.fs.fwh[6]: Initialization Completed, optimal - Optimal Solution Found
2023-03-28 13:51:26 [INFO] idaes.init.fs.fwh_mixer[7]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:26 [INFO] idaes.init.fs.fwh[7].hot_side: Initialization Complete
2023-03-28 13:51:26 [INFO] idaes.init.fs.fwh[7].cold_side: Initialization Complete
2023-03-28 13:51:26 [INFO] idaes.init.fs.fwh[7]: Initialization Completed, optimal - Optimal Solution Found
2023-03-28 13:51:26 [INFO] idaes.init.fs.fwh_mixer[8]: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:26 [INFO] idaes.init.fs.fwh[8].hot_side: Initialization Complete
2023-03-28 13:51:26 [INFO] idaes.init.fs.fwh[8].cold_side: Initialization Complete
2023-03-28 13:51:27 [INFO] idaes.init.fs.fwh[8]: Initialization Completed, optimal - Optimal Solution Found
2023-03-28 13:51:27 [INFO] idaes.init.fs.fwh[9].hot_side: Initialization Complete
2023-03-28 13:51:27 [INFO] idaes.init.fs.fwh[9].cold_side: Initialization Complete
2023-03-28 13:51:27 [INFO] idaes.init.fs.fwh[9]: Initialization Completed, optimal - Optimal Solution Found
Model Initialization =  optimal
*******************  USC Model Initialized   ********************
2023-03-28 13:51:31 [INFO] idaes.init.fs.ess_hp_split: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:31 [INFO] idaes.init.fs.hxc.hot_side: Initialization Complete
2023-03-28 13:51:31 [INFO] idaes.init.dispatches.properties.solarsalt_properties: fs.hxc.cold_side.properties_in Initialisation Step 1 Complete.
2023-03-28 13:51:31 [INFO] idaes.init.dispatches.properties.solarsalt_properties: Initialization Step 1 Complete.
2023-03-28 13:51:31 [INFO] idaes.init.dispatches.properties.solarsalt_properties: fs.hxc.cold_side.properties_out Initialisation Step 1 Complete.
2023-03-28 13:51:31 [INFO] idaes.init.dispatches.properties.solarsalt_properties: Initialization Step 1 Complete.
2023-03-28 13:51:31 [INFO] idaes.init.dispatches.properties.solarsalt_properties: State Released.
2023-03-28 13:51:31 [INFO] idaes.init.fs.hxc.cold_side: Initialization Complete
2023-03-28 13:51:31 [INFO] idaes.init.dispatches.properties.solarsalt_properties: State Released.
2023-03-28 13:51:31 [INFO] idaes.init.fs.hxc: Initialization Completed, optimal - Optimal Solution Found
2023-03-28 13:51:31 [INFO] idaes.init.fs.cooler.control_volume: Initialization Complete
2023-03-28 13:51:31 [INFO] idaes.init.fs.cooler: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:31 [INFO] idaes.init.fs.hx_pump.control_volume: Initialization Complete
2023-03-28 13:51:31 [INFO] idaes.init.fs.hx_pump: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:31 [INFO] idaes.init.fs.ess_bfp_split: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:32 [INFO] idaes.init.fs.recycle_mixer: Initialization Complete: optimal - Optimal Solution Found
2023-03-28 13:51:32 [INFO] idaes.init.dispatches.properties.solarsalt_properties: fs.hxd.hot_side.properties_in Initialisation Step 1 Complete.
2023-03-28 13:51:32 [INFO] idaes.init.dispatches.properties.solarsalt_properties: Initialization Step 1 Complete.
2023-03-28 13:51:32 [INFO] idaes.init.dispatches.properties.solarsalt_properties: fs.hxd.hot_side.properties_out Initialisation Step 1 Complete.
2023-03-28 13:51:32 [INFO] idaes.init.dispatches.properties.solarsalt_properties: Initialization Step 1 Complete.
2023-03-28 13:51:32 [INFO] idaes.init.dispatches.properties.solarsalt_properties: State Released.
2023-03-28 13:51:32 [INFO] idaes.init.fs.hxd.hot_side: Initialization Complete
2023-03-28 13:51:32 [INFO] idaes.init.fs.hxd.cold_side: Initialization Complete
2023-03-28 13:51:32 [INFO] idaes.init.dispatches.properties.solarsalt_properties: State Released.
2023-03-28 13:51:32 [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 0x19479ec6810>

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.............:      613

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 -1.0590705e+00 6.50e+07 1.00e+00  -1.0 0.00e+00    -  0.00e+00 0.00e+00   0
   1 -1.0586553e+00 6.50e+07 5.00e+02  -1.0 4.71e+06    -  6.26e-01 1.24e-03h  1
   2 -7.4299304e-01 6.10e+07 7.68e+02  -1.0 8.35e+07    -  1.31e-01 7.83e-02h  1
   3  3.6695644e-01 5.60e+07 2.47e+03  -1.0 7.71e+07    -  1.15e-01 2.48e-01h  1
   4  3.0456421e+00 9.25e+07 9.14e+03  -1.0 5.85e+07    -  4.06e-01 7.63e-01h  1
   5  3.5688553e+00 4.50e+07 1.91e+03  -1.0 1.44e+07    -  2.85e-02 1.00e+00h  1
   6  3.3951042e+00 3.08e+05 2.04e+03  -1.0 8.19e+05    -  2.32e-01 1.00e+00h  1
   7  3.3935811e+00 2.15e+01 2.07e+01  -1.0 6.62e+03    -  9.90e-01 1.00e+00h  1
   8  3.3903711e+00 1.31e+02 3.13e-01  -1.0 8.27e+04    -  9.85e-01 1.00e+00f  1
   9  3.1703911e+00 1.76e+04 3.06e-02  -1.0 1.66e+06    -  9.02e-01 1.00e+00f  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  10  1.6668719e+00 6.68e+05 1.30e-01  -1.0 1.56e+07    -  8.95e-01 9.56e-01f  1
  11 -5.9195788e-01 1.47e+06 1.92e+00  -1.0 1.91e+08    -  3.86e-01 2.68e-01f  1
  12 -1.2855395e+00 9.40e+05 1.42e-01  -1.0 2.70e+07    -  9.66e-01 1.00e+00h  1
  13 -3.3201741e+00 8.43e+06 9.87e-02  -1.0 2.84e+07    -  9.99e-01 1.00e+00h  1
  14 -3.3465878e+00 2.68e+05 1.76e-03  -1.0 5.07e+05    -  1.00e+00 1.00e+00h  1
  15 -3.3462665e+00 8.93e+04 1.00e-06  -1.0 1.59e+04    -  1.00e+00 1.00e+00h  1
  16 -3.3465121e+00 6.38e+04 1.00e-06  -1.0 3.01e+03    -  1.00e+00 1.00e+00h  1
  17 -3.3466830e+00 5.31e+04 1.00e-06  -1.0 2.05e+03    -  1.00e+00 1.00e+00h  1
  18 -3.3468124e+00 4.63e+04 1.00e-06  -1.0 1.56e+03    -  1.00e+00 1.00e+00h  1
  19 -3.3469154e+00 4.15e+04 1.00e-06  -1.0 1.24e+03    -  1.00e+00 1.00e+00h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  20 -3.3469999e+00 3.78e+04 1.00e-06  -1.0 1.02e+03    -  1.00e+00 1.00e+00h  1
  21 -3.3470711e+00 3.50e+04 1.00e-06  -1.0 8.55e+02    -  1.00e+00 1.00e+00h  1
  22 -4.5148141e+00 4.82e+06 4.45e-01  -1.7 2.10e+07    -  1.00e+00 1.00e+00h  1
  23 -4.9252252e+00 1.93e+06 1.52e-02  -1.7 3.98e+06    -  1.00e+00 9.93e-01h  1
  24 -5.0845325e+00 1.88e+06 1.68e-02  -1.7 1.41e+06    -  1.00e+00 1.00e+00h  1
  25 -5.0124627e+00 1.76e+05 2.57e-03  -1.7 8.45e+05    -  1.00e+00 1.00e+00h  1
  26 -4.9932040e+00 4.63e+04 1.39e-02  -1.7 2.60e+05    -  8.67e-01 1.00e+00h  1
  27 -5.0160633e+00 5.06e+04 4.18e-02  -1.7 4.03e+05    -  1.79e-01 3.86e-01h  1
  28 -5.0084905e+00 4.88e+04 3.73e-01  -1.7 6.29e+05    -  1.00e+00 8.20e-02h  2
  29 -4.9995582e+00 1.90e+03 2.90e-01  -1.7 9.65e+04    -  2.18e-01 1.00e+00h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  30 -5.0023236e+00 5.88e+02 3.43e-04  -1.7 8.21e+04    -  1.00e+00 1.00e+00h  1
  31 -5.3618995e+00 2.39e+05 1.30e+00  -3.8 5.99e+06    -  8.07e-01 1.00e+00f  1
  32 -5.3805798e+00 5.48e+04 3.36e-02  -3.8 1.19e+05    -  9.74e-01 1.00e+00h  1
  33 -5.3824280e+00 4.71e+03 1.57e-03  -3.8 1.09e+04    -  9.90e-01 1.00e+00h  1
  34 -5.3824008e+00 8.33e+01 3.80e-02  -3.8 2.32e+03    -  5.45e-01 1.00e+00h  1
  35 -5.3821342e+00 2.67e+01 2.80e-05  -3.8 5.30e+03    -  1.00e+00 1.00e+00h  1
  36 -5.3823777e+00 1.54e+01 2.84e-06  -3.8 4.72e+03    -  1.00e+00 1.00e+00h  1
  37 -5.3823609e+00 1.65e-02 1.32e-07  -3.8 3.31e+02    -  1.00e+00 1.00e+00h  1
  38 -5.3823608e+00 5.32e-07 1.50e-09  -3.8 1.11e+00    -  1.00e+00 1.00e+00h  1
  39 -5.3854726e+00 1.96e+02 1.98e-04  -5.7 4.58e+04    -  9.96e-01 1.00e+00f  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  40 -5.3854734e+00 4.42e-02 3.28e+01  -5.7 9.73e+00  -4.0 1.00e+00 1.00e+00h  1
  41 -5.3854734e+00 6.34e-05 2.86e-01  -5.7 5.37e+01  -4.5 1.00e+00 1.00e+00h  1
  42 -5.3854734e+00 5.96e-08 9.11e-04  -5.7 1.58e-01  -5.0 1.00e+00 1.00e+00h  1
  43 -5.3854734e+00 1.13e-07 4.25e-08  -5.7 1.02e-02  -5.4 1.00e+00 1.00e+00h  1
  44 -5.3854965e+00 5.74e-01 5.96e-03  -7.0 1.20e+03    -  7.96e-01 5.08e-01h  1
  45 -5.3855132e+00 4.62e-01 1.82e-05  -7.0 6.15e+02    -  1.00e+00 1.00e+00h  1
  46 -5.3855132e+00 3.98e-03 1.63e-05  -7.0 3.27e+02    -  1.00e+00 1.00e+00h  1
  47 -5.3855132e+00 1.10e-03 1.72e-05  -7.0 1.19e+03    -  1.00e+00 1.00e+00H  1
  48 -5.3855132e+00 7.97e-04 4.30e-05  -7.0 2.16e+02    -  1.00e+00 1.00e+00h  1
  49 -5.3855132e+00 8.94e-08 3.94e-05  -7.0 1.27e+00    -  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.3855132e+00 8.94e-08 1.74e-04  -7.0 2.36e-03    -  1.00e+00 1.00e+00h  1
  51 -5.3855132e+00 5.96e-08 1.74e-04  -7.0 3.35e-06    -  1.00e+00 1.00e+00H  1
  52 -5.3855132e+00 5.41e-08 3.94e-05  -7.0 2.84e-06    -  1.00e+00 1.00e+00h  1
  53 -5.3855132e+00 1.49e-08 1.74e-04  -7.0 1.55e-06    -  1.00e+00 1.00e+00h  1
  54 -5.3855132e+00 3.53e-08 1.63e-04  -7.0 2.37e-06    -  1.00e+00 6.25e-02h  5
  55 -5.3855132e+00 7.45e-08 1.74e-04  -7.0 1.96e-06    -  1.00e+00 1.00e+00h  1
  56 -5.3855132e+00 1.04e-07 1.68e-04  -7.0 1.78e-06    -  1.00e+00 3.12e-02h  6
  57 -5.3855132e+00 1.19e-07 1.74e-04  -7.0 8.73e-07    -  1.00e+00 1.00e+00h  1
  58 -5.3855132e+00 1.04e-07 1.68e-04  -7.0 6.83e-06    -  1.00e+00 3.12e-02h  6
  59 -5.3855132e+00 1.04e-07 1.68e-04  -7.0 6.62e-06    -  1.00e+00 4.88e-04h 12
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  60 -5.3855132e+00 8.94e-08 1.63e-04  -7.0 6.61e-06    -  1.00e+00 3.12e-02h  6
  61 -5.3855132e+00 1.34e-07 1.60e-04  -7.0 7.91e-06    -  1.00e+00 1.56e-02h  7
  62 -5.3855132e+00 1.79e-07 1.59e-04  -7.0 6.73e-06    -  1.00e+00 7.81e-03h  8
  63 -5.3855132e+00 1.49e-08 1.74e-04  -7.0 6.49e-06    -  1.00e+00 1.00e+00h  1
  64 -5.3855132e+00 5.96e-08 8.68e-05  -7.0 2.17e-06    -  1.00e+00 5.00e-01h  2
  65 -5.3855132e+00 2.98e-08 4.34e-05  -7.0 3.69e-06    -  1.00e+00 5.00e-01h  2
  66 -5.3855132e+00 1.34e-07 4.07e-05  -7.0 1.94e-06    -  1.00e+00 6.25e-02h  5
  67 -5.3855132e+00 2.98e-08 3.05e-05  -7.0 1.93e-06    -  1.00e+00 2.50e-01h  3
  68 -5.3855132e+00 2.79e-08 2.29e-05  -7.0 1.20e-06    -  1.00e+00 2.50e-01h  3
  69 -5.3855132e+00 8.94e-08 2.15e-05  -7.0 1.68e-06    -  1.00e+00 6.25e-02h  5
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
  70 -5.3855132e+00 1.04e-07 9.09e-13  -7.0 1.62e-06    -  1.00e+00 1.00e+00h  1

Number of Iterations....: 70

                                   (scaled)                 (unscaled)
Objective...............:  -5.3855131870393791e+00   -5.3855131870393791e+00
Dual infeasibility......:   9.0909224592650162e-13    9.0909224592650162e-13
Constraint violation....:   4.6566128730773926e-10    1.0430812835693358e-07
Complementarity.........:   9.0909090946458144e-08    9.0909090946458144e-08
Overall NLP error.......:   9.0909090946458144e-08    1.0430812835693358e-07


Number of objective function evaluations             = 145
Number of objective gradient evaluations             = 71
Number of equality constraint evaluations            = 145
Number of inequality constraint evaluations          = 145
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.674
Total CPU secs in NLP function evaluations           =      9.392

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


***************** Optimization Results ******************
Revenue ($/h): 9649.224293
Storage Capital Cost ($/h): 46.535959
Fuel Cost ($/h): 7388.293500
Hot Previous Salt Inventory (kg): 75000.000000
Hot Salt Inventory (kg): 0.222573
Cold Previous Salt Inventory (kg): 6664292.000000
Cold Salt Inventory (kg): 6739291.777427
Salt Amount (kg): 6739292.000000


***************** Costing Results ******************
Obj (M$/year): 5.385513
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.721451


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

Net Power (MW): 438.601104
Plant Power (MW): 436.000002
ES turbine Power (MW): 2.601102
Boiler feed water flow (mol/s): 17889.270531
Boiler duty (MW_th): 919.470762
Cooling duty (MW_th): 0.000001
HXC heat duty (MW): 0.000027
HXD heat duty (MW): 10.009724
Makeup water flow: 239.920955


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

HXC area (m2): 25.107983
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.000635
HXC Water temperature in (K): 866.150000
HXC Steam temperature out (K): 550.455256
HXC Delta temperature at inlet (K): 35.150000
HXC Delta temperature at outlet (K): 37.305256


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

HXD area (m2): 2204.820060
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.920955
HXD Water temperature in (K): 483.855738
HXD Steam temperature out (K): 826.099858
HXD Delta temperature at inlet (K): 4.900142
HXD Delta temperature at outlet (K): 29.294262


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: 10.127999067306519
Solution:
- number of solutions: 0
  number of solutions displayed: 0


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

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 :   25.108 :                      meter ** 2 : False : (0, 6000)
    HX Coefficient : 0.030155 : kilogram / kelvin / second ** 3 : False : (0, 10000)
         Heat Duty :   27.421 :                            watt : False : (0, 200000000.0)

    Expressions:

    Key             : Value  : Units
    Delta T Driving : 36.217 : kelvin
         Delta T In : 35.150 : kelvin
        Delta T Out : 37.305 : kelvin

------------------------------------------------------------------------------------
    Stream Table
                         Units        shell Inlet shell Outlet tube Inlet tube Outlet
    Molar Flow          mole / second  0.00063453  0.00063453           -           -
    Mass Flow       kilogram / second  1.1431e-05  1.1431e-05           -           -
    T                          kelvin      866.15      550.46           -           -
    P                          pascal  8.6047e+06  8.6047e+06           -           -
    Vapor Fraction      dimensionless      1.0000      0.0000           -           -
    Molar Enthalpy       joule / mole      65223.      22009.           -           -
    flow_mass       kilogram / second           -           -  5.7072e-05  5.7072e-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.8 :                      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.294 : 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          mole / second         -             -      239.92      239.92
    Mass Flow       kilogram / second         -             -      4.3222      4.3222
    T                          kelvin         -             -      483.86      826.10
    P                          pascal         -             -  3.4958e+07  3.4958e+07
    Vapor Fraction      dimensionless         -             -      0.0000      0.0000
    Molar Enthalpy       joule / mole         -             -      16468.      58189.
====================================================================================