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.
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 |
---|---|
|
Turbines ( |
|
Turbine Splitters |
|
Boiler Components ( |
|
Mixers ( |
|
Pumps ( |
|
Condenser, Feed Water Heaters ( |
and Storage Systems ( |
The integrated ultra-supercritical power plant model has a total of 4 degrees of freedom, listed below:
Boiler feed water flow (
boiler.inlet.flow_mol
),Steam flow to charge heat exchanger (
HXC.inlet_1.flow_mol
)Condensate flow to discharge heat exchanger (
HXD.inlet_2.flow_mol
),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 |
---|---|
|
Power out from the power pant in MW |
|
Revenue in $ per hour |
|
Total solar salt inventor y in kg |
|
Hot solar salt inventory in kg |
Notable Constraints
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:
The revenue is calculated by considering the given electricity price
lmp_signal
and the amount of net powerNetPower
produced by the plant and the storage system. This is shown in the equation below:
The salt inventory
SaltInventory
is given by the hot salt and total salt material balances, the latter involving a fixed amount of salttotal_salt
. The material balances are shown in the following equations:
[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.
====================================================================================