diff --git a/idaes_examples/mod/power_gen/gas_turbine.py b/idaes_examples/mod/power_gen/gas_turbine.py
index d345fce6..77cbcec5 100644
--- a/idaes_examples/mod/power_gen/gas_turbine.py
+++ b/idaes_examples/mod/power_gen/gas_turbine.py
@@ -234,7 +234,7 @@ def _add_models(self):
support_isentropic_performance_curves=True,
)
- def _add_performance_curves_gts1(self, flow_scale=0.896):
+ def _add_performance_curves_gts1(self, flow_scale=0.896*pyo.units.s/pyo.units.m**3):
"""Add isentropic head and efficiency curves for gas turbine stage 1"""
@self.gts1.performance_curve.Constraint(
@@ -262,9 +262,9 @@ def head_isen_eqn(b, t):
)
return b.head_isentropic[t] == -(
-2085.1 * f**3 + 38433 * f**2 - 150764 * f + 422313
- )
+ )*pyo.units.m**2/pyo.units.s**2
- def _add_performance_curves_gts2(self, flow_scale=0.896):
+ def _add_performance_curves_gts2(self, flow_scale=0.896*pyo.units.s/pyo.units.m**3):
"""Add isentropic head and efficiency curves for gas turbine stage 2"""
@self.gts2.performance_curve.Constraint(
@@ -290,9 +290,9 @@ def head_isen_eqn(b, t):
)
return b.head_isentropic[t] == -(
-1676.3 * f**3 + 34916 * f**2 - 173801 * f + 456957
- )
+ )*pyo.units.m**2/pyo.units.s**2
- def _add_performance_curves_gts3(self, flow_scale=0.896):
+ def _add_performance_curves_gts3(self, flow_scale=0.896*pyo.units.s/pyo.units.m**3):
"""Add isentropic head and efficiency curves for gas turbine stage 3"""
@self.gts3.performance_curve.Constraint(
@@ -320,7 +320,7 @@ def head_isen_eqn(b, t):
)
return b.head_isentropic[t] == -(
-1373.6 * f**3 + 31759 * f**2 - 188528 * f + 500520
- )
+ )*pyo.units.m**2/pyo.units.s**2
def _add_constraints(self):
"""Add additional flowsheet constraints and expressions"""
@@ -759,10 +759,10 @@ def _set_scaling(self):
for i in ["air05", "air07", "air09"]:
iscale.set_scaling_factor(self.splt1.split_fraction[0.0, i], 100)
- iscale.set_scaling_factor(self.valve01.control_volume.work, 1e-8)
- iscale.set_scaling_factor(self.valve02.control_volume.work, 1e-8)
- iscale.set_scaling_factor(self.valve03.control_volume.work, 1e-8)
- iscale.set_scaling_factor(self.vsv.control_volume.work, 1e-8)
+ iscale.set_scaling_factor(self.valve01.control_volume.work, 1)
+ iscale.set_scaling_factor(self.valve02.control_volume.work, 1)
+ iscale.set_scaling_factor(self.valve03.control_volume.work, 1)
+ iscale.set_scaling_factor(self.vsv.control_volume.work, 1)
iscale.set_scaling_factor(self.cmp1.control_volume.work, 1e-8)
iscale.set_scaling_factor(self.gts1.control_volume.work, 1e-8)
iscale.set_scaling_factor(self.gts2.control_volume.work, 1e-8)
@@ -889,6 +889,7 @@ def initialize(
self.feed_fuel1.initialize(outlvl=outlvl, solver=solver, optarg=optarg)
# compressor
propagate_state(self.air01)
+ self.vsv.valve_opening.fix(1-1e-6)
self.vsv.initialize(outlvl=outlvl, solver=solver, optarg=optarg)
propagate_state(self.air02)
self.cmp1.initialize(outlvl=outlvl, solver=solver, optarg=optarg)
diff --git a/idaes_examples/mod/power_gen/hrsg.py b/idaes_examples/mod/power_gen/hrsg.py
index f5ebcdd0..75864fe6 100644
--- a/idaes_examples/mod/power_gen/hrsg.py
+++ b/idaes_examples/mod/power_gen/hrsg.py
@@ -93,6 +93,7 @@ def _add_unit_models(self):
prop_water = self.prop_water
prop_gas = self.prop_gas
+
######### LP Section ###########
self.econ_lp = BoilerHeatExchanger(
doc="LP Economizer",
@@ -100,9 +101,11 @@ def _add_unit_models(self):
cold_side_name="tube",
hot_side_name="shell",
tube={"property_package": prop_water,
- "has_pressure_change": False,},
+ "has_pressure_change": False,
+ },
shell={"property_package": prop_gas,
- "has_pressure_change": False,},
+ "has_pressure_change": False,
+ },
has_holdup=False,
flow_pattern=HeatExchangerFlowPattern.countercurrent,
tube_arrangement=TubeArrangement.inLine,
@@ -115,10 +118,12 @@ def _add_unit_models(self):
property_package=prop_water,
momentum_mixing_type=MomentumMixingType.none,
inlet_list=["econ_lp", "Preheater"],
+ property_package_args={'has_phase_equilibrium':False}
)
self.drum_lp = HelmPhaseSeparator(
doc="Phase separator for LP evaporator (partial evaporator)",
property_package=prop_water,
+ property_package_args={'has_phase_equilibrium':False}
)
self.evap_lp = HeatExchanger(
doc="LP evaporator heat exchanger section",
@@ -135,6 +140,7 @@ def _add_unit_models(self):
property_package=prop_water,
momentum_mixing_type=MomentumMixingType.none,
inlet_list=["main", "soec_makeup"],
+ property_package_args={'has_phase_equilibrium':False}
)
self.split_fg_lp = Splitter(
doc="LP superheater flue bypass gas splitter",
@@ -166,14 +172,19 @@ def _add_unit_models(self):
doc="LP liquid split to IP and HP pumps",
property_package=prop_water,
outlet_list=["toIP", "toHP"],
+ property_package_args={'has_phase_equilibrium':False}
)
self.pump_ip = WaterPump(
doc="Intermediate pressure pump",
property_package=prop_water,
+ has_phase_equilibrium=False,
+ property_package_args={'has_phase_equilibrium':False}
)
self.pump_hp = WaterPump(
doc="High pressure pump",
property_package=prop_water,
+ has_phase_equilibrium=False,
+ property_package_args={'has_phase_equilibrium':False}
)
######### IP Section ###########
self.econ_ip1 = BoilerHeatExchanger(
@@ -182,9 +193,9 @@ def _add_unit_models(self):
hot_side_name="shell",
cold_side_name="tube",
tube={"property_package": prop_water,
- "has_pressure_change": True,},
+ "has_pressure_change": True},
shell={"property_package": prop_gas,
- "has_pressure_change": True,},
+ "has_pressure_change": True},
has_holdup=False,
flow_pattern=HeatExchangerFlowPattern.countercurrent,
tube_arrangement=TubeArrangement.inLine,
@@ -195,6 +206,7 @@ def _add_unit_models(self):
doc="IP economizer hot water split for natural gas preheater",
property_package=prop_water,
outlet_list=["toIP_ECON2", "toNGPH"],
+ property_package_args={'has_phase_equilibrium':False}
)
self.econ_ip2 = BoilerHeatExchanger(
doc="IP ecomonmizer part 2",
@@ -202,14 +214,15 @@ def _add_unit_models(self):
hot_side_name="shell",
cold_side_name="tube",
tube={"property_package": prop_water,
- "has_pressure_change": True,},
+ "has_pressure_change": True},
shell={"property_package": prop_gas,
- "has_pressure_change": True,},
+ "has_pressure_change": True},
has_holdup=False,
flow_pattern=HeatExchangerFlowPattern.countercurrent,
tube_arrangement=TubeArrangement.inLine,
cold_side_water_phase="Liq",
has_radiation=False,
+ # has_phase_equilibrium=False,
)
self.evap_ip = HeatExchanger(
doc="IP evaporator (total evaporator)",
@@ -219,6 +232,7 @@ def _add_unit_models(self):
tube={"property_package": prop_water},
delta_temperature_callback=delta_temperature_lmtd_callback,
flow_pattern=HeatExchangerFlowPattern.countercurrent,
+
)
self.sh_ip1 = BoilerHeatExchanger(
doc="IP superheater 1",
@@ -226,9 +240,9 @@ def _add_unit_models(self):
hot_side_name="shell",
cold_side_name="tube",
tube={"property_package": prop_water,
- "has_pressure_change": True,},
+ "has_pressure_change": True},
shell={"property_package": prop_gas,
- "has_pressure_change": True,},
+ "has_pressure_change": True},
has_holdup=False,
flow_pattern=HeatExchangerFlowPattern.countercurrent,
tube_arrangement=TubeArrangement.inLine,
@@ -241,11 +255,14 @@ def _add_unit_models(self):
property_package=prop_water,
momentum_mixing_type=MomentumMixingType.none,
inlet_list=["sh_ip1", "Cold_reheat"],
+ property_package_args={'has_phase_equilibrium':False}
)
self.splitter_ip2 = HelmSplitter(
doc="IP Splitter 2, for ejector, reclaimer and dryer",
property_package=prop_water,
outlet_list=["Cold_reheat", "toEjector", "toReclaimer", "toDryer"],
+ # has_phase_equilibrium=False,
+ property_package_args={'has_phase_equilibrium':False}
)
self.sh_ip2 = BoilerHeatExchanger(
doc="IP superheater 2",
@@ -253,9 +270,9 @@ def _add_unit_models(self):
hot_side_name="shell",
cold_side_name="tube",
tube={"property_package": prop_water,
- "has_pressure_change": True,},
+ "has_pressure_change": True},
shell={"property_package": prop_gas,
- "has_pressure_change": True,},
+ "has_pressure_change": True},
has_holdup=False,
flow_pattern=HeatExchangerFlowPattern.countercurrent,
tube_arrangement=TubeArrangement.inLine,
@@ -355,6 +372,7 @@ def _add_unit_models(self):
self.evap_hp_valve = HelmValve(
doc="HP evaporator valve",
property_package=prop_water,
+ property_package_args={'has_phase_equilibrium':False}
)
self.evap_hp_valve.pressure_flow_equation.deactivate()
self.evap_hp = HeatExchanger(
@@ -436,7 +454,7 @@ def _add_flowsheet_constraints(self):
def ip_sat_vap_eqn(b, t):
return (
b.tube.properties_out[t].enth_mol / 1e4
- == (b.tube.properties_out[t].enth_mol_sat_phase["Vap"] + 30) / 1e4
+ == (b.tube.properties_out[t].enth_mol_sat_phase["Vap"] + 30*pyo.units.J/pyo.units.mol) / 1e4
)
@self.evap_hp.Constraint(
@@ -445,7 +463,7 @@ def ip_sat_vap_eqn(b, t):
def hp_sat_vap_eqn(b, t):
return (
b.tube.properties_out[t].enth_mol / 1e4
- == (b.tube.properties_out[t].enth_mol_sat_phase["Vap"] + 30) / 1e4
+ == (b.tube.properties_out[t].enth_mol_sat_phase["Vap"] + 30*pyo.units.J/pyo.units.mol) / 1e4
)
@self.mixer1.Constraint(self.config.time, doc="Mixed state pressure eqn.")
@@ -1020,6 +1038,8 @@ def _set_scaling_factors(self):
if hasattr(unit, "deltaP_tube_uturn"):
iscale.set_scaling_factor(unit.deltaP_tube_uturn, 1e-2)
+ # iscale.set_scaling_factor(self.sh_ip2.N_Pr_tube_eqn, 1e9)
+ # iscale.set_scaling_factor(self.sh_hp4.N_Pr_tube_eqn, 1e9)
iscale.set_scaling_factor(self.evap_lp.shell.heat, 1e-8)
iscale.set_scaling_factor(self.evap_lp.tube.heat, 1e-8)
iscale.set_scaling_factor(self.evap_lp.tube.heat, 1e-8)
diff --git a/idaes_examples/mod/power_gen/ngcc.py b/idaes_examples/mod/power_gen/ngcc.py
index 49dfff98..38143237 100644
--- a/idaes_examples/mod/power_gen/ngcc.py
+++ b/idaes_examples/mod/power_gen/ngcc.py
@@ -360,7 +360,7 @@ def reboiler_duty_eqn(b, t):
@self.Constraint(self.config.time)
def net_power_constraint(b, t):
- return b.net_power_mw[t] / 100.0 == -b.net_power[t] / 1e6 / 100.0
+ return b.net_power_mw[t] / 100.0 == pyo.units.convert(-b.net_power[t] / 100.0,to_units=pyo.units.MW)
@self.Constraint(self.config.time)
def lp_steam_temperature_eqn(b, t):
@@ -438,7 +438,6 @@ def initialize(
self.cap_additional_reboiler_duty.fix()
self.fuel_lhv.fix()
self.fuel_hhv.fix()
-
self.gt.initialize(
load_from="gas_turbine_init.json.gz",
save_to="gas_turbine_init.json.gz",
diff --git a/idaes_examples/mod/power_gen/steam_turbine.py b/idaes_examples/mod/power_gen/steam_turbine.py
index 83c1a5b0..93bdab3e 100644
--- a/idaes_examples/mod/power_gen/steam_turbine.py
+++ b/idaes_examples/mod/power_gen/steam_turbine.py
@@ -68,31 +68,37 @@ def _add_models(self):
num_lp=11, # full load ave P ratio about 0.7194 with outlet
hp_disconnect=[7], # disconnected for reheater
ip_disconnect=[10], # disconnected for HRSG LP steam mix
+ property_package_args={'has_phase_equilibrium':False}
)
self.steam_turbine_lp_mix = helm.HelmMixer(
doc="Mix LP steam from HRSG into turbine LP steam.",
property_package=self.prop_water,
momentum_mixing_type=helm.MomentumMixingType.none,
inlet_list=["turbine", "hrsg"],
+ property_package_args={'has_phase_equilibrium':False}
)
self.steam_turbine_lp_split = helm.HelmSplitter(
doc="Split off carbon capture steam.",
property_package=self.prop_water,
outlet_list=["turbine", "reboiler", "soec"],
+ property_package_args={'has_phase_equilibrium':False}
)
self.dummy_reheat = gum.Heater(
doc="Dummy reheater, can be deactivated to couple with HRSG.",
property_package=self.prop_water,
+ property_package_args={'has_phase_equilibrium':False}
)
self.main_condenser = helm.HelmNtuCondenser(
doc="Main steam turbine condenser.",
shell={
"has_pressure_change": False,
"property_package": self.prop_water,
+ 'has_phase_equilibrium':False
},
tube={
"has_pressure_change": False,
"property_package": self.prop_water,
+ 'has_phase_equilibrium':False
},
)
self.hotwell = helm.HelmMixer(
@@ -100,19 +106,23 @@ def _add_models(self):
momentum_mixing_type=helm.MomentumMixingType.none,
inlet_list=["condensate", "makeup"],
property_package=self.prop_water,
+ property_package_args={'has_phase_equilibrium':False}
)
self.cond_pump = helm.HelmIsentropicCompressor(
- doc="Hotwell condensate pump", property_package=self.prop_water
+ doc="Hotwell condensate pump", property_package=self.prop_water,
+ property_package_args={'has_phase_equilibrium':False}
)
self.return_mix = helm.HelmMixer(
doc="Mixer for steam streams returning to HRSG.",
property_package=self.prop_water,
+ property_package_args={'has_phase_equilibrium':False},
momentum_mixing_type=helm.MomentumMixingType.none,
inlet_list=["pump", "reboiler", "dryer", "reclaimer"],
)
self.reboiler = gum.Heater(
doc="Carbon capture system reboiler",
property_package=self.prop_water,
+ property_package_args={'has_phase_equilibrium':False}
)
def _add_constraints(self):
@@ -123,7 +133,7 @@ def lp_mixer_pressure_constraint(b, t):
1e-6 * b.turbine_state[t].pressure == 1e-6 * b.mixed_state[t].pressure
)
- self.dummy_reheat.temperature_out = pyo.Var(self.time, initialize=850)
+ self.dummy_reheat.temperature_out = pyo.Var(self.time, initialize=850, units=pyo.units.K)
@self.dummy_reheat.Constraint(self.time)
def temperature_eqn(b, t):
@@ -146,8 +156,8 @@ def return_mixer_pressure_constraint(b, t):
return 1e-6 * b.pump_state[t].pressure == 1e-6 * b.mixed_state[t].pressure
# A few more variables and constraints
- self.hp_steam_temperature = pyo.Var(self.time, initialize=855)
- self.hot_reheat_temperature = pyo.Var(self.time, initialize=855)
+ self.hp_steam_temperature = pyo.Var(self.time, initialize=855, units=pyo.units.K)
+ self.hot_reheat_temperature = pyo.Var(self.time, initialize=855, units=pyo.units.K)
@self.Constraint(self.time)
def main_steam_temperature_eqn(b, t):
@@ -169,7 +179,7 @@ def reheat_steam_temperature_eqn(b, t):
def reboiler_condense_eqn(b, t):
return (
b.control_volume.properties_out[t].enth_mol
- == b.control_volume.properties_out[t].enth_mol_sat_phase["Liq"] - 100
+ == b.control_volume.properties_out[t].enth_mol_sat_phase["Liq"] - 100*pyo.units.J/pyo.units.mol
)
def _add_arcs(self):
diff --git a/idaes_examples/notebooks/_toc.yml b/idaes_examples/notebooks/_toc.yml
index 54b632e0..43a1de18 100644
--- a/idaes_examples/notebooks/_toc.yml
+++ b/idaes_examples/notebooks/_toc.yml
@@ -104,6 +104,9 @@ parts:
sections:
- file: docs/power_gen/supercritical/supercritical_power_plant_doc
- file: docs/power_gen/supercritical/supercritical_steam_cycle_doc
+ - file: docs/power_gen/ngcc/index
+ sections:
+ - file: docs/power_gen/ngcc/ngcc_doc
- file: docs/power_gen/solid_oxide_cell/index
sections:
- file: docs/power_gen/solid_oxide_cell/soc_pid_control_doc
@@ -113,9 +116,5 @@ parts:
# note: directory active/ will not be included in the docs, but
# it is kept here so it is visible to the 'idaesx' command (e.g. for preprocessing or browsing)
# The 'file' entry generates a warning, but it is required by the TOC format
- - file: active/power_gen/ngcc/index
- sections:
- # Moved this one to 'held'
- # - file: active/power_gen/ngcc/ngcc_soec_doc
- - file: active/power_gen/ngcc/ngcc_doc
root: index
+
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/data/00Readme.txt b/idaes_examples/notebooks/active/power_gen/ngcc/data/00Readme.txt
deleted file mode 100644
index b3331ebb..00000000
--- a/idaes_examples/notebooks/active/power_gen/ngcc/data/00Readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-This directory contains full saved model results.
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/gt_soec_base.svg b/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/gt_soec_base.svg
deleted file mode 100644
index dd408aac..00000000
--- a/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/gt_soec_base.svg
+++ /dev/null
@@ -1,662 +0,0 @@
-
\ No newline at end of file
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/hrsg_soec_base.svg b/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/hrsg_soec_base.svg
deleted file mode 100644
index b66362d3..00000000
--- a/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/hrsg_soec_base.svg
+++ /dev/null
@@ -1,1332 +0,0 @@
-
\ No newline at end of file
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/soec_soec_base.svg b/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/soec_soec_base.svg
deleted file mode 100644
index 87fae4f2..00000000
--- a/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/soec_soec_base.svg
+++ /dev/null
@@ -1,760 +0,0 @@
-
\ No newline at end of file
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/st_soec_base.svg b/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/st_soec_base.svg
deleted file mode 100644
index 4c16fab6..00000000
--- a/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/st_soec_base.svg
+++ /dev/null
@@ -1,465 +0,0 @@
-
\ No newline at end of file
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/00Readme.txt b/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/00Readme.txt
deleted file mode 100644
index 9fc0de07..00000000
--- a/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/00Readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-This directory contains tabulated model results.
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc.csv b/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc.csv
deleted file mode 100644
index bd74029e..00000000
--- a/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc.csv
+++ /dev/null
@@ -1,101 +0,0 @@
-,st_power (MW),gt_power (MW),gross_power (MW),net_power (MW),lhv_efficiency (%),hhv_efficiency (%),combustor_temperature (K),fuel_flow (kg/s),st_throttle_delta_pressure (bar),st_condenser_pressure (bar),st_throttle_inlet_temperature (K),st_throttle_outlet_temperature (K),fuel_cost_rate (USD_2018/h),other_variable_cost_rate (USD_2018/h),total_variable_cost_rate (USD_2018/h)
-650.0,215.39330487553852,481.0013493932915,696.39465426883,650.0,52.744074825695066,47.600771162003966,1642.247816940331,26.109447338280205,-4.863429297495247,0.09343316586276104,858.3305941557788,856.6514975916158,20594.375476034616,3665.798834734161,24260.174310768776
-646.0,214.61094659406908,477.59269176099696,692.203638355066,646.0,52.698790971428956,47.55990313291485,1641.5143778145093,25.9710714907792,-5.453899925996578,0.09303274324956412,858.3930903747474,856.5095632003962,20485.228617300756,3646.3706938795344,24131.59931118029
-645.0,214.41526281611982,476.740621633062,691.1558844491817,645.0,52.68738924950068,47.5496132423792,1641.3300437200753,25.936480117806628,-5.601511585724672,0.09293285116330405,858.4087963385343,856.4741447481821,20457.94394466871,3641.51402215103,24099.45796681974
-640.0,213.4361801420672,472.48094027995575,685.9171204220229,640.0,52.62988134886113,47.49771318673509,1640.402492727773,25.763542851292634,-6.339503619112701,0.09243473585069148,858.4878220994792,856.2974591758798,20321.536040118142,3617.233415141029,23938.76945525917
-635.0,212.45605468614454,468.22230663151134,680.6783613176559,635.0,52.57153522639919,47.445056647916665,1639.4650199882526,25.590635260262953,-7.077420424725511,0.09193880520672576,858.567688757183,856.1214550932906,20185.151542729684,3592.9569746058833,23778.108517335568
-630.0,211.47486506929354,463.9647423048062,675.4396073740998,630.0,52.51233276147628,47.39162727230746,1638.5174829674686,25.41775793459038,-7.81527010894534,0.09144505770711417,858.6484135840955,855.9461491255493,20048.790917777893,3568.6847833644647,23617.475701142357
-625.0,210.49259709767026,459.7082613789606,670.2008584766309,625.0,52.452255883685126,47.337408751624054,1637.559734435803,25.24491120666458,-8.553063956561566,0.09095348623969805,858.7300144620111,855.7715574594366,19912.454427442117,3544.4168880846964,23456.871315526812
-620.0,209.50923623055124,455.45287835183393,664.9621145823852,620.0,52.391285885031266,47.282384202169716,1636.591624111989,25.07209548008432,-9.290813671996723,0.09046408340537021,858.8125097118034,855.5976966308666,19776.142390069363,3520.1533454323467,23296.29573550171
-615.0,208.52477250339916,451.1986029502377,659.7233754536369,615.0,52.329403829145235,47.22653653414255,1635.6129973803274,24.89931102500382,-10.028533258094532,0.08997683803896846,858.8959182301865,855.4245830087045,19639.855018749455,3495.894193337403,23135.74921208686
-610.0,207.53918145882923,446.9454602666974,654.4846417255267,610.0,52.26658879908758,47.16984687030465,1634.6236998474374,24.72655880267609,-10.766232016103539,0.08949174838732744,858.9802590170057,855.2522347614017,19503.593071690906,3471.639566760981,22975.232638451886
-605.0,206.55245161819045,442.69346176875035,649.2459133869409,605.0,52.20282032530908,47.11229673718142,1633.62357059065,24.55383929506797,-11.503924793069661,0.08900880292361699,859.0655518821238,855.0806689972738,19367.356929055193,3447.3895333718247,22814.746462427018
-600.0,205.56456681305716,438.4426239583346,644.0071907713917,600.0,52.13807675895817,47.05386659699476,1632.6124463447538,24.381153270283455,-12.241625511582255,0.08852799256030318,859.1518170099436,854.9099035828395,19231.1471967005,3423.1442010126893,22654.29139771319
-595.0,204.57547918734832,434.1929968815723,638.7684760689206,595.0,52.07233272521172,46.99453354933066,1631.5901683630966,24.208502948988205,-12.979337320563445,0.08804932891838571,859.2390742509256,854.7399598796587,19094.96562622354,3398.90388146779,22493.86950769133
-590.0,203.5852306698162,429.94453590580775,633.529766575624,590.0,52.00557026480943,46.934281386214245,1630.556551403751,24.035886802799592,-13.71709745247244,0.08757276121212383,859.3273463349262,854.5708502871206,18958.811012080394,3374.6683601503096,22333.479372230704
-585.0,202.5937755889622,425.6972889851636,628.2910645741257,585.0,51.93776247209213,46.87308582567397,1629.5114286499188,23.863307171289694,-14.454911946545991,0.08709829747340309,859.4166542148805,854.4025963884434,18822.68519965772,3350.4379655390744,22173.123165196794
-580.0,201.60109566281855,421.4512752819068,623.0523709447253,580.0,51.86888400398899,46.81092399595183,1628.4546225060658,23.690765338763235,-15.192798163319171,0.0866259256788527,859.5070200928936,854.2352171301637,18686.58920197786,3326.212877952059,22012.80207992992
-575.0,200.60717198173495,417.20651475174196,617.813686733477,575.0,51.79890845807853,46.74777206924104,1627.3859515713496,23.518262744261705,-15.930774582985029,0.0861556328044914,859.5984666938027,854.068731658611,18550.52415411505,3301.993299432478,21852.517453547527
-570.0,199.6119849625183,412.9630282005694,612.5750131630876,570.0,51.72780831550451,46.68360521016851,1626.3052305492972,23.34580099118761,-16.66886093245483,0.08568740469543303,859.6910172697344,853.9031592806322,18414.491320786718,3277.7794551000356,21692.270775886755
-565.0,198.61551429931845,408.72083734333086,607.3363516426492,565.0,51.65555488404748,46.61839752441762,1625.2122701580897,23.173381855873906,-17.407078325011227,0.08522122592310885,859.7846956026913,853.7385194176474,18278.492103112832,3253.571594354084,21532.063697466918
-560.0,197.6177389114321,404.4799648640487,602.0977037754808,560.0,51.582118242743825,46.55212200874777,1624.1068770423883,23.00100729448041,-18.145449412858298,0.08475707963003394,859.8795260047061,853.5748315524629,18142.52804405557,3229.369991841891,21371.89803589746
-555.0,196.61863688842945,400.2404344757316,596.859071364161,555.0,51.50746718989202,46.48475050407081,1622.9888536879112,22.828679447431075,-18.88399855250507,0.08429494736264313,859.9755333152656,853.4121151684865,18006.60083191932,3205.174948081639,21211.77578000096
-550.0,195.6181854332243,396.0022709784406,591.6204564116649,550.0,51.43156919677391,46.416253653685054,1621.857998340181,22.656400640430526,-19.622751982327244,0.08383480889343668,860.0727428940274,853.2503896795387,17870.712301152496,3180.986789605144,21051.69909075764
-545.0,194.61636080430506,391.7655003129501,586.3818611172552,545.0,51.35439037002649,46.346600869316454,1620.7141049290021,22.4841733808816,-20.361738011129404,0.08337664203438114,860.1711806121377,853.0896743539882,17734.864429521804,3156.8058684548805,20891.670297976685
-540.0,193.61313825835782,387.5301496071578,581.1432878655157,540.0,51.275895426190765,46.275760308149216,1619.5569630006048,22.312000348331335,-21.100987215178233,0.0829204224450316,860.2708728348092,852.9299882265893,17599.059330576296,3132.6325608425805,20731.691891418875
-535.0,192.60849199562844,383.2962472110753,575.9047392067038,535.0,51.19604768269531,46.2036988646887,1618.3863576593428,22.13988437733075,-21.840532640485403,0.08246612343976482,860.3718464006996,852.7713500047513,17463.29924012768,3108.4672647427265,20571.766504870404
-530.0,191.60239511068355,379.0638227156672,570.6662178263507,530.0,51.114809070152575,46.13038218185854,1617.2020695210451,21.9678284309172,-22.58041000523615,0.08201371580059712,860.4741285933305,852.6137779661576,17327.58649533396,3084.3103961694446,20411.896891503402
-525.0,190.59481955218442,374.83290694965814,565.4277265018426,525.0,51.03214017146405,46.0557746862926,1616.0038746800083,21.795835562765305,-23.32065789576551,0.08156316760374675,860.5777471046309,852.4572898501233,17191.92350484518,3060.1623838624414,20252.08588870762
-520.0,189.58573609620035,370.60353194747404,560.1892680436745,520.0,50.94800029363989,45.97983965315111,1614.7915446912748,21.62390886599266,-24.06131794742113,0.08111444407035245,860.6827299892467,852.3019027443327,17056.312708422887,3036.0236620992737,20092.33637052216
-515.0,188.57511433854077,366.37573088058963,554.9508452191305,515.0,50.86234757837038,45.90253930590979,1613.564846569437,21.45205140667266,-24.80243499963021,0.08066750745385726,860.7891056083505,852.1476329694768,16920.756524496912,3011.89466136045,19932.65118585736
-510.0,187.56292271253744,362.14953794394097,549.7124606564784,510.0,50.775139157042204,45.82383495625988,1612.3235428040884,21.280266140371783,-25.54405721235267,0.0802223169786644,860.8969025616091,851.9944959649297,16785.257284332456,2987.7757966111767,19773.033080943635
-505.0,186.54912853954295,357.9249881887341,544.4741167282771,505.0,50.6863313549176,45.74368718837688,1611.0673913908272,21.108555810549593,-26.286236129356965,0.07977882884621298,861.0061496059234,851.8425061792868,16649.81715189092,2963.667453036583,19613.4846049275
-500.0,185.53369811996396,353.7021172935912,539.2358154135551,500.0,50.59587994735071,45.66205609015207,1609.7961458747811,20.936922828511303,-27.02902667251707,0.07933699632536474,861.1168755596187,851.6916769700688,16514.438029139987,2939.569969186917,19454.007998326902
-495.0,184.51659687267679,349.4809612671807,533.9975581398575,495.0,50.503740468051284,45.578901531396184,1608.5095554012041,20.765369135831595,-27.772487051235682,0.078896769943321,861.2291091907994,851.5420205169968,16379.121447537504,2915.483617661676,19294.60506519918
-490.0,183.49778953005915,345.2615560781221,528.7593456081813,490.0,50.40986856536102,45.49418348537363,1607.2073647648058,20.593896051807796,-28.516678572498773,0.07845809779066752,861.3428790886716,851.3935477529051,16243.868447706967,2891.40858369184,19135.277031398808
-485.0,182.4772403941548,341.0439372119646,523.5211776061194,485.0,50.31422039730226,45.40786238532824,1605.8893144463443,20.422504110516837,-29.26166534068915,0.07802092594899145,861.458213516867,851.2462683152626,16108.679450912792,2867.3449422624767,18976.02439317527
-480.0,181.45491365672973,336.8281391604717,518.2830528172015,480.0,50.21675304991835,45.31989950202956,1604.5551406215284,20.2511928943607,-30.007513842391305,0.07758519904134863,861.5751402479204,851.1001905192759,15973.554127765752,2843.2926347423036,18816.846762508056
-475.0,180.43077378167266,332.61419485558594,513.0449686372585,475.0,50.11742495664827,45.230257322252356,1603.204575124675,20.079960873366705,-30.75429242056267,0.07715086089454906,861.6936863783008,850.9553213505112,15838.491271467745,2819.2514463212583,18657.742717789002
-470.0,179.4047859427074,328.40213506832134,507.80692101102875,470.0,50.01619628984669,45.13889990211786,1601.837345347372,19.90880526167773,-31.502070654202257,0.0767178552880386,861.8138781236114,850.8116664709383,15703.488684615393,2795.2209858615397,18498.709670476932
-465.0,178.37691650277844,324.19198780136753,502.5689043041459,465.0,49.91302929015556,45.04579316434689,1600.4531740522327,19.737721904202868,-32.25091867348383,0.07628612674826758,861.9357405937188,850.669230227465,15568.543089793393,2771.2006699832236,18339.74375977662
-460.0,177.34713351437256,319.98377771167446,497.330911226047,460.0,49.80788849658286,44.9509051059027,1599.0517790837307,19.566705206812806,-33.000906454831444,0.07585562133145807,862.0592975477332,850.5280156468781,15433.650074514642,2747.1897132636063,18180.839787778248
-455.0,176.31540721342094,315.77752560464097,492.0929328180619,455.0,49.70074084115138,44.85420588341004,1597.6328729628358,19.395748122315602,-33.752103153136105,0.07542628732463622,862.1845711288809,850.3880243965427,15298.804080158357,2723.187126268187,18021.991206426545
-450.0,175.28171047434992,311.57324804295257,486.85495851730246,450.0,49.59155557807856,44.75566774924108,1596.196162359929,19.22484220135876,-34.504576536828964,0.0749980757876364,862.311581579477,850.2492566871969,15163.998442120115,2699.19172269738,17863.190164817497
-445.0,174.2460191918393,307.3709571092798,481.61697630111905,445.0,49.480304029080166,44.65526482165552,1594.7413474505054,19.053977712331708,-35.25839259232969,0.07457094086110339,862.4403469365424,850.111711094029,15029.225484387503,2675.2021362209757,17704.42762060848
-440.0,173.20831255655494,303.1706603523906,476.3789729089455,440.0,49.3669591432358,44.55297268758565,1593.268121170222,18.883143827550015,-36.01361535556164,0.0741448397796064,862.5708827092677,849.9753842759945,14894.476666396797,2651.2168466186295,17545.693513015427
-435.0,172.16857319863297,298.9723609307352,471.1409341293682,435.0,49.25149489016418,44.44876785498565,1591.7761683972342,18.712328865282316,-36.77030700814018,0.07371973255571478,862.7032015407236,849.8402705816462,14759.742773936803,2627.234213760751,17386.976987697555
-430.0,171.13225203583738,294.770085353877,465.9023373897143,430.0,49.13534326993093,44.343942683379346,1590.2647134417214,18.540970481222836,-37.5332175221805,0.07328984970905425,862.8319905130074,849.6991182128778,14624.58024611441,2603.1752838083653,17227.755529922775
-425.0,170.10687198032218,290.55558920069,460.6624611810122,425.0,49.02055843304805,44.24035101414661,1588.7326816326618,18.368287869330366,-38.308705697227175,0.07284736276735479,862.9495536087703,849.5415811928473,14488.373205750071,2578.9304306235126,17067.303636373585
-420.0,169.07939013053394,286.3431125512023,455.4225026817362,420.0,48.90366525669099,44.13485659877275,1587.1807311050834,18.19557907988968,-39.0855657006151,0.0724059500508119,863.0683806726084,849.3847173338154,14352.145517294246,2554.6819020783755,16906.82741937262
-415.0,168.04975766957492,282.13269875499776,450.1824564245727,415.0,48.784612639891726,44.02741331936691,1585.608499204108,18.02284041129453,-39.863838391491,0.07196559384004507,863.1884959357851,849.2285394120562,14215.89426102721,2530.429178462843,16746.323439490054
-410.0,167.01792404044903,277.9243928363667,444.94231687681577,410.0,48.663347436950474,43.917973212697184,1584.0156141596442,17.850068142600463,-40.64356576985844,0.0715262762060817,863.309924351335,849.0730606033045,14079.61650197578,2506.171737351689,16585.788239327467
-405.0,165.98383684940728,273.71824160243017,439.7020784518374,405.0,48.53981431910908,43.806486345352745,1582.4016947611356,17.677258545256276,-41.42479112658672,0.07108797888081372,863.4326916284328,848.9182944669278,13943.309299166838,2481.909055251697,16425.218354418535
-400.0,164.94744173962403,269.5142937789599,434.46173551858385,400.0,48.413955633090275,43.69290068607765,1580.7663500328833,17.50440789307071,-42.20755919076897,0.07065068314026395,863.5568242675674,848.7642549318498,13806.96971348867,2457.640609000983,16264.610322489654
-395.0,163.90868225989584,265.3126001472391,429.22128240713494,395.0,48.285711260370725,43.577161978766696,1579.1091789004913,17.331512468917328,-42.99191628025197,0.07021436969002168,863.682349597396,848.610956283072,13670.59481297967,2433.365876710381,16103.960689690051
-390.0,162.86749972956324,261.11321368045606,423.98071341001923,390.0,48.15501847798675,43.459213616844636,1577.429769847504,17.158568567851134,-43.777910452504386,0.06977901855619784,863.8092958133319,848.4584131498771,13534.181675286574,2409.0843382010103,15943.266013487584
-385.0,161.82383310067945,256.9161896783195,418.74002277899893,385.0,48.021811821264066,43.338996519381716,1575.7277005609465,16.985572496465203,-44.56559165331133,0.0693446089848221,863.9376920179408,848.3066404967274,13397.727387157034,2384.795474913952,15782.522862070986
-380.0,160.77759517422803,252.72161088961832,413.4992060638463,380.0,47.88602001156767,43.216446358432016,1574.002547918326,16.812521599586475,-45.35500315083104,0.06891113298562711,864.0675673563527,848.1556558383974,13261.22985426748,2360.4989140596113,15621.728768327092
-375.0,159.72876624062283,248.52948852088474,408.2582547615076,375.0,47.74757744463656,43.09150392709074,1572.253846691052,16.639410163687227,-46.146216214093116,0.06847854112274605,864.1989546476921,848.0054704256074,13124.684569952798,2336.193853451598,15460.878423404396
-370.0,158.67725443546735,244.33990980388978,403.0171642393571,370.0,47.60640680441248,42.96409944872407,1570.4811497889207,16.466235486020526,-46.93927887948865,0.06804682305177831,864.3318851099394,847.8561023655187,12988.089402364536,2311.8799136208872,15299.969315985423
-365.0,157.6229878292493,240.1529406391217,397.77592846837103,365.0,47.46243031010922,42.83416272728786,1568.6839878862113,16.29299384151117,-47.73425003044933,0.06761595412480285,864.4663919181838,847.7075679527532,12851.44141327131,2287.5565715622934,15138.997984833604
-360.0,156.56589141164199,235.96864989023535,392.53454130187737,360.0,47.31556675993745,42.70162047933169,1566.8618788565943,16.119681462900182,-48.53119110107578,0.06718590858856886,864.6025093878833,847.5598838351174,12714.737631168417,2263.223298347978,14977.960929516394
-355.0,155.50588694225365,231.78710950921428,387.2929964514679,355.0,47.16573138574153,42.56639620281071,1565.0143273094798,15.94629452295882,-49.330166193170534,0.06675665955310203,864.7402730287993,847.4130670309828,12577.97503724871,2238.87955663027,14816.854593878981
-350.0,154.4428927968889,227.6083946646699,382.0512874615588,350.0,47.012835699235985,42.42841003831622,1563.1408240995238,15.772829115706038,-50.13124219183371,0.06632817896722315,864.8797196017913,847.2671349504275,12441.150550587541,2214.5247980045824,14655.675348592124
-345.0,153.37682380777915,223.43258387544748,376.80940768322665,345.0,46.85678732730344,42.28757862043446,1561.2408458066436,15.599281237190507,-50.93448888226083,0.0659004375981481,865.020887178607,847.1221054193669,12304.261012984118,2190.158460311173,14494.419473295291
-340.0,152.3075910960107,219.25975915184316,371.5673502478539,340.0,46.69748983388573,42.14381491700586,1559.3138541841397,15.425646766309443,-51.73997907070009,0.06547340501212115,865.1638152048731,846.977996705839,12167.303173831986,2165.779964942093,14333.08313877408
-335.0,151.23510189442607,215.09000614656804,366.32510804099417,335.0,46.53484252614121,41.9970280541848,1557.3592955724253,15.251921446025325,-52.54778871244971,0.06504704955326407,865.3085445664035,846.8348275475112,12030.273675303306,2141.3887142039885,14171.662389507295
-330.0,150.15925935920993,210.92341431748653,361.08267367669646,330.0,46.36874024276677,41.84712312540328,1555.3766002760099,15.078100865204005,-53.35799704973574,0.06462133831798832,865.4551176589816,846.6926171795817,11893.169038023287,2116.984088768145,14010.153126791432
-325.0,149.07996236846367,206.76007710392415,355.8400394723878,325.0,46.19907312260963,41.694000982546356,1553.3651819013742,14.904180441163877,-54.17068676200277,0.06419623712281762,865.6035784616917,846.5513853622093,11755.98564730547,2092.5654452203735,13848.551092525842
-320.0,147.99710530622698,202.60009211799309,350.59719742422004,320.0,46.025726351918024,41.53755800784953,1551.3244366532103,14.73015540289594,-54.98594413080432,0.06377171046390112,865.7539726138651,846.4111524067785,11618.71973991621,2068.1321137050854,13686.851853621296
-315.0,146.91057783045812,198.44356135227625,345.35413918273434,315.0,45.84857988874536,41.37768586517746,1549.2537425865328,14.556020774806042,-55.80385922120616,0.06334772146694892,865.9063474956517,846.2719392002916,11481.367391251015,2043.6833956426804,13525.050786893695
-310.0,145.82026462359238,194.29059140490935,340.11085602850176,310.0,45.66750816312417,41.2142712294352,1547.1524588118023,14.381771360743718,-56.62452608128062,0.06292423182674027,866.060752312183,846.1337672272869,11343.924502736969,2019.2185614871805,13363.14306422415
-305.0,144.72604512432298,190.14129372311035,334.8673388474333,305.0,45.482379751607326,41.047195492846384,1545.0199246500943,14.207401728031392,-57.44804296109904,0.06250120173557362,866.2172381811799,845.9966585886152,11206.386789235434,1994.7368484839071,13201.123637719342
-300.0,143.62779323930135,185.99578486599296,329.6235781052943,300.0,45.29305702472957,40.87633444679227,1542.8554587348488,14.032906191162041,-58.274512552818514,0.062078589800063116,866.375858223898,845.8606360163745,11068.749766183211,1970.2374583806115,13038.987224563823
-295.0,142.52537703297122,181.85418678812184,324.3795638210931,295.0,45.0993957656686,40.701557937658855,1540.6583580567133,13.858278794851927,-59.10404225297956,0.06165635294586788,866.5366676589501,845.7257228840817,10931.008736225062,1945.719555048061,12876.728291273123
-290.0,141.41865839422653,177.71662714465918,319.1352855388857,290.0,44.90124475825272,40.52272949501967,1538.4278969470995,13.683513296100564,-59.93674444931749,0.06123444630933326,866.6997238987836,845.5919432110156,10793.158775063104,1921.1822619612324,12714.341037024336
-285.0,140.30749267758745,173.58323962001433,313.8907322976018,285.0,44.69844534205173,40.33970593011169,1536.1633259962505,13.508603144950412,-60.77273683396265,0.060812823115028315,866.8650866480856,845.4593216592293,10655.194716280637,1896.6246594979534,12551.81937577859
-280.0,139.1917283167399,169.45416428179314,308.645892598533,280.0,44.49083093198636,40.15233690228979,1533.863870900741,13.333541463631306,-61.61214274586189,0.060391434537563626,867.0328180034135,845.3278835214265,10517.111134891857,1872.0457820107501,12389.156916902606
-275.0,138.07120631570353,165.32954805979352,303.4007543754971,275.0,44.27822648558726,39.96046443823554,1531.5287312908597,13.158321027914589,-62.45509151051212,0.05997022959456329,867.202982548495,845.1976547055535,10378.902332634529,1847.444615208946,12226.346947843474
-270.0,136.9457601648844,161.20954476986077,298.1553049347452,270.0,44.06044799782464,39.763922476048236,1529.1570792001814,12.982934225574086,-63.301718992100604,0.05954915477447817,867.3756474711557,845.0686616641041,10240.562305205236,1822.820090326532,12063.382395531768
-265.0,135.81521480504716,157.09431614027704,292.90953094532415,265.0,43.8373018124499,39.562536243740645,1526.7480579970131,12.807373053390132,-64.15216783674713,0.059128154128776526,867.5508826325914,844.9409313871897,10102.084739896216,1798.1710837015264,11900.255823597743
-260.0,134.67938881450382,152.98402941664975,287.66341823115357,260.0,43.608584389394764,39.35612204931994,1524.3007791784653,12.631628963426738,-65.00658902413431,0.058707167606965156,867.7287607988084,844.8144910837295,9963.462894343262,1773.4963951931002,11736.959289536362
-255.0,133.5380788305465,148.87887378507153,282.4169526156181,255.0,43.374079241046736,39.14448451582038,1521.8143303570366,12.455693509612768,-65.86513660445561,0.05828613870812867,867.9093569467448,844.6893694030211,9824.690106530195,1748.7948389623748,11573.48494549257
-250.0,132.39109489492128,144.77902282321105,277.1701177181323,250.0,43.13356181146862,38.92742098472885,1519.2877505650836,12.279556677100633,-66.72798227025437,0.05786499520878965,868.0927502099278,844.5655931150029,9685.75847703546,1724.065008912312,11409.823485947772
-245.0,131.23823531942574,140.68466102234197,271.92289634176774,245.0,42.8867948945235,38.70471738090839,1516.7200434891163,12.103207942835748,-67.59530676757625,0.05744366179426007,868.2790227166074,844.4431890627618,9546.659705578517,1699.3054275929758,11245.965133171492
-240.0,130.0792497246881,136.59602286893008,266.67527259361816,240.0,42.63352179103695,38.47614203703526,1514.1102002778432,11.926637887515081,-68.46728501540389,0.0570220784773225,868.4682575954206,844.3221875736308,9407.386362486088,1674.5147725225233,11081.901135008611
-235.0,128.9139171500055,132.51330990650325,261.4272270565087,235.0,42.373478059953214,38.24145629884879,1511.457144846567,11.749834536304936,-69.34412046667086,0.0566001588848791,868.6605433540076,844.2026143781524,9267.929002356352,1649.6913624194303,10917.620364775783
-230.0,127.74197388548238,128.43676711144963,256.178740996932,230.0,42.106378894416125,38.00040313224553,1508.7597795425982,11.572786556049367,-70.2260164536524,0.0561778269136246,868.8559699661664,844.0844970844031,9128.278685924304,1624.8336060945262,10753.11229201883
-225.0,126.56318029397278,124.36661186253443,250.9297921565072,225.0,41.83192918816508,37.752716208057194,1506.0169357188681,11.395480067629807,-71.11320506310625,0.055754980853178274,869.0546326890698,843.9678585260862,8988.424465743396,1599.9395549023243,10588.36402064572
-220.0,125.37723864253407,120.3031209273222,245.68035956985628,220.0,41.54980872048471,37.49810653168028,1503.2274282350295,11.21790230253115,-72.00591504386132,0.05533153466183094,869.2566274251845,843.8527237472082,8848.356270378916,1575.007416127447,10423.363686506364
-215.0,124.18387315270208,116.24654533364179,240.43041848634385,215.0,41.25968447995432,37.23627356508305,1500.389994725571,11.04003775883386,-72.90440683290299,0.054907375074995775,869.4620554057403,843.7391119783814,8708.061872365939,1550.035013281137,10258.096885647075
-210.0,122.98273794903895,112.19720784368486,235.17994579272383,210.0,40.96119356184475,36.966889791951665,1497.5033592530367,10.861872312522685,-73.8089364246543,0.05448240734948378,869.6710178333042,843.6270443609375,8567.53013109051,1525.0203633341107,10092.55049442462
-205.0,121.77350988143411,108.15540418395156,229.9289140653857,205.0,40.6539577698234,36.6896138955194,1494.566159490493,10.683388720905517,-74.71979656236739,0.05405650563294279,869.8836215824955,843.5165347049638,8426.747446016745,1499.9610453909806,9926.708491407726
-200.0,120.55583090599671,104.121463926534,224.67729483253072,200.0,40.33757210306503,36.40408036834932,1491.5769846761045,10.504569101894965,-75.63729545779452,0.05362954055715563,870.0999760906825,843.4075940888116,8285.699712272282,1474.8545487844663,9760.554261056748
-195.0,119.32931246742855,100.0957455446194,219.42505801204794,195.0,40.011603657737496,36.10989852094092,1488.5343679468915,10.325394521907503,-76.56176155005302,0.05320137472306254,870.3201941649075,843.3002299559882,8144.37199559509,1449.698215215926,9594.070210811016
-190.0,118.09354757410902,96.07862325358423,214.17217082769326,190.0,39.675591796434645,35.80665263464083,1485.4367712906144,10.145844199292561,-77.49355191775226,0.05277185425079246,870.5443937772243,843.1944449150577,8002.747904021392,1424.4891269158077,9427.2370309372
-185.0,116.84811386687173,92.07048337937617,208.91859724624788,185.0,39.32904650800596,35.49390048141265,1482.2825761230633,9.965895116795803,-78.43305749715299,0.05234080504434443,870.7727000701751,843.0902369717692,7860.809282207948,1399.2240522330144,9260.033334440963
-180.0,115.59250555517927,88.07179637399102,203.6643019291703,180.0,38.97143280139529,35.17115923950015,1479.0701339650136,9.785525057465561,-79.380676799154,0.051908065343407146,871.0052435904864,842.987607514134,7718.5386060670735,1373.899871879939,9092.438477947013
-175.0,114.32621749703942,84.08302707169454,198.40924456873398,175.0,38.60218300043203,34.837916589300036,1475.797689298694,9.604708414035978,-80.33685496387105,0.051473441664840455,871.2421700983942,842.886557369295,7575.915677329496,1348.5129905646504,8924.428667894146
-170.0,113.04869663775678,80.10468598551596,193.15338262327273,170.0,38.220683545331255,34.49361880190507,1472.4634114827122,9.42341837236499,-81.30206520976633,0.051036733067036814,871.4836434712845,842.7870970384819,7432.919345776957,1323.0596435482985,8755.978989325256
-165.0,111.75933627418527,76.13733137409253,187.8966676482778,165.0,37.8262693701456,34.13766566483504,1469.0653879657095,9.241626970021603,-82.27680886754621,0.05059773427935732,871.7298532926413,842.6892551138378,7289.527555454166,1297.5359048708415,8587.063460325007
-160.0,110.45748904329777,72.18157023312652,182.6390592764243,160.0,37.418217472881906,33.7694046791592,1465.6016153022863,9.059305165809343,-83.26161820719658,0.05015623373579286,871.9810231685442,842.5930865006655,7145.717399506886,1271.9376971122258,8417.655096619112
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc_soec_stream_5kg_gt.csv b/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc_soec_stream_5kg_gt.csv
deleted file mode 100644
index b0e311f5..00000000
--- a/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc_soec_stream_5kg_gt.csv
+++ /dev/null
@@ -1,28 +0,0 @@
-,mass flow (kg/s),mole flow (kmol/s),mole percent Ar (%),mole percent C2H6 (%),mole percent C3H8 (%),mole percent C4H10 (%),mole percent CH4 (%),mole percent CO2 (%),mole percent H2O (%),mole percent N2 (%),mole percent O2 (%),pressure (bar),temperature (K),volumetric flow (m**3/s)
-air01,1101.1142875033825,38.1597014708379,0.9199999999999999,,,,,0.03,0.9900000000000001,77.32,20.74,1.03421,288.15,883.3174737153919
-air02,1101.1142875033825,38.1597014708379,0.9199999999999999,,,,,0.03,0.9900000000000001,77.32,20.74,1.098871958521849,288.1700180921796,831.3580235443553
-air03,1101.1142875033825,38.1597014708379,0.9199999999999999,,,,,0.03,0.9900000000000001,77.32,20.74,19.23025927413236,709.6448666689283,117.77866908228957
-air04a,1008.73520077831,34.95825507096401,0.9199999999999999,,,,,0.03,0.9900000000000001,77.32,20.739999999999995,19.23025927413236,709.6448666689283,107.89750959775876
-air04b,1008.73520077831,34.95825507096401,0.9199999999999999,9.999999999999999e-19,9.999999999999999e-19,9.999999999999999e-19,9.999999999999999e-19,0.03,0.9900000000000001,77.32,20.739999999999995,19.23025927413236,709.6448666689283,107.89750959775876
-air05,67.35725204415158,2.3343014063768694,0.9199999999999998,,,,,0.029999999999999992,0.9899999999999999,77.32,20.739999999999995,19.23025927413236,709.6448666689283,7.2047448560385075
-air06a,67.35725204415158,2.3343014063768694,0.9199999999999998,,,,,0.029999999999999992,0.9899999999999999,77.32,20.739999999999995,7.138926752662028,709.7299446049434,19.337625919680875
-air06b,67.35725204415158,2.3343014063768694,0.9199999999999998,,,,,0.029999999999999992,0.9899999999999999,77.32,20.739999999999995,7.138926752662028,709.7299446049434,19.337625919680875
-air07,14.7702720810366,0.5118716373514288,0.9199999999999999,,,,,0.03,0.9900000000000002,77.32,20.74,19.23025927413236,709.6448666689283,1.5798750478773045
-air08a,14.7702720810366,0.5118716373514288,0.9199999999999999,,,,,0.03,0.9900000000000002,77.32,20.74,2.799729194545529,709.7563948522172,10.798449886106164
-air08b,14.7702720810366,0.5118716373514288,0.9199999999999999,,,,,0.03,0.9900000000000002,77.32,20.74,2.799729194545529,709.7563948522172,10.798449886106164
-air09,10.251562599884059,0.35527335614558614,0.9199999999999999,,,,,0.029999999999999992,0.9900000000000001,77.32,20.739999999999995,19.23025927413236,709.6448666689283,1.0965395806149794
-air10a,10.251562599884059,0.35527335614558614,0.9199999999999999,,,,,0.029999999999999992,0.9900000000000001,77.32,20.739999999999995,1.100407319690911,709.7661542563852,19.0592203466656
-air10b,10.251562599884059,0.35527335614558614,0.9199999999999999,,,,,0.029999999999999992,0.9900000000000001,77.32,20.739999999999995,1.100407319690911,709.7661542563852,19.0592203466656
-fuel01,25.95136985716061,1.5050225988620711,9.999999999999999e-18,3.2,0.7000000000000001,0.4,93.10000000000001,1.0,1e-17,1.6,9.999999999999999e-18,31.026400000000002,299.817,1.1232652188390537
-fuel02,25.95136985716061,1.5050225988620711,9.999999999999999e-18,3.2,0.7000000000000001,0.4,93.10000000000001,1.0,1e-17,1.6,9.999999999999999e-18,31.026400000000002,446.9152950258822,1.7793820780548608
-g01,1034.686570635471,36.46327766982608,0.8820269794862983,0.1320800713520058,0.02889251560825127,0.016510008919000726,3.842704575897418,0.07003677162857677,0.9491377279254736,74.1946553116332,19.883956037549815,19.23025927413236,691.7793343522841,109.703373905701
-g02a,1034.8162733024383,36.506923325193085,0.8809724768861166,3.579949500067161e-18,1.78711157592441e-18,9.999999999999999e-19,9.999999999999999e-19,4.3244428199900025,9.217873630554871,74.10595229147015,11.470758781098874,18.26874631042574,1641.34663263546,273.54123346480657
-g02b,1034.8162733024383,36.50692332519309,0.8809724768861162,,,,,4.324442819990002,9.217873630554871,74.10595229147012,11.470758781098873,18.26874631042574,1641.34663263546,273.5412334648066
-g03,1034.8162733024383,36.506923325193085,0.8809724768861164,,,,,4.3244428199900025,9.217873630554871,74.10595229147013,11.470758781098874,7.138926752662028,1365.41933936123,581.3896126652335
-g04,1102.1735253465897,38.84122473156996,0.8833179745557123,,,,,4.066353020206737,8.723390330400731,74.29911190829564,12.027826766541176,7.138926752662028,1329.388517341602,602.2622008585412
-g05,1102.1735253465893,38.841224731569945,0.8833179745557123,,,,,4.066353020206737,8.723390330400731,74.29911190829564,12.027826766541176,2.799729194545529,1099.2683038098435,1268.8288839509657
-g06,1116.9437974276261,39.35309636892138,0.8837951031722132,,,,,4.013851570002851,8.622800960415955,74.33840505359888,12.141147312810103,2.799729194545529,1094.5654231668736,1280.0531254964085
-g07,1116.9437974276261,39.35309636892138,0.8837951031722132,,,,,4.013851570002851,8.622800960415955,74.33840505359888,12.141147312810103,1.100407319690911,899.6056443854467,2675.690182940732
-g08,1127.1953600275106,39.70836972506697,0.8841190307294001,,,,,3.97820779194144,8.554509795788102,74.36508157672507,12.218081804815975,1.100407319690911,898,2695.0281360424083
-st01,16.495737138359196,0.9156531636586919,,,,,,,100.0,,,43.430327782067046,460.19724622427833,0.018712234085710395
-st02,16.495737138359196,0.9156531636586919,,,,,,,100.0,,,43.430327782067046,325.67522660654794,0.016684026118343208
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc_soec_stream_5kg_hrsg_gas.csv b/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc_soec_stream_5kg_hrsg_gas.csv
deleted file mode 100644
index 502d7a57..00000000
--- a/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc_soec_stream_5kg_hrsg_gas.csv
+++ /dev/null
@@ -1,63 +0,0 @@
-,mass flow (kg/s),mole flow (kmol/s),mole percent CO2 (%),mole percent H2O (%),mole percent N2 (%),mole percent O2 (%),pressure (bar),temperature (K),volumetric flow (m**3/s)
-g08,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.100407319690911,897.9999999999999,2670.437103598008
-g09,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.0983976234630537,880.4212761145732,2622.9525369173016
-g10,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.0964275365694918,840.9399887250095,2509.831455347732
-g11,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.0945510285786115,821.1168733835063,2454.8697293193786
-g12,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.0927200013019978,787.0106783313902,2356.846075681646
-g13,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.0831848281426264,752.6474409743767,2273.7803472227038
-g14,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.0815037494144273,722.0918059320115,2184.861313357406
-g15,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.0815037494144273,586.1346173939501,1773.490350455747
-g16,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.08130776288593,579.3641717447459,1753.3224805405098
-g17,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.0468339191061942,577.578949695999,1805.4815636859348
-g18,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.046634710215391,569.7441688779903,1781.3294298140815
-g19,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.0464946419848498,559.1157295086687,1748.3331356713077
-g20,556.5870024323505,19.67865023576763,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.0464946419848498,559.1157295086687,874.1665678356538
-g21,556.5870024323505,19.67865023576763,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.0464946419848498,542.3018533449368,847.8783994970893
-g22,556.5870024323505,19.67865023576763,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.0464946419848498,559.1157295086687,874.1665678356538
-g23,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.0464946369848498,550.7175953460716,1722.0725050736237
-g24,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.0464946369848498,522.782287223579,1634.7198828857051
-g25,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.0115336788768345,518.8355316360592,1678.4517094927521
-g26,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.0113506196604183,516.9142453368858,1672.5389614555236
-g27,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.010181334184424,513.8060789128559,1664.4064346536982
-g28,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.01,480.81217281926723,1557.8067019861517
-g29,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.01,413.52941829103173,1339.8140390350563
-g30,1113.174004864701,39.35730047153526,4.013693621080585,8.630816486855723,75.02842213527906,12.327067756784619,1.01,387.06665144070695,1254.0760359582732
-hp01,134.55265070815372,7.468812049210355,,100.0,,,244.00000000000003,439.7716861441845,0.1470858268513
-hp02,134.55265070815372,7.468812049210355,,100.0,,,243.91268919460944,507.40428459634364,0.16000791801962613
-hp03,134.55265070815372,7.468812049210355,,100.0,,,243.82922382793305,511.21900489057447,0.16093614695911893
-hp04,134.55265070815372,7.468812049210355,,100.0,,,243.74717461694942,532.1802222450606,0.16656720586305637
-hp05,134.55265070815372,7.468812049210355,,100.0,,,243.66778525582257,547.1951232564138,0.1712809118286105
-hp06,134.55265070815372,7.468812049210355,,100.0,,,243.59045984919203,559.8210311205518,0.1758168855115598
-hp06b,134.55265070815372,7.468812049210355,,100.0,,,173.590459849192,559.3317956986742,0.17795010526342944
-hp07,134.55265070815372,7.468812049210355,,100.0,,,173.590459849192,627.2415196971301,1.085943475853971
-hp08,134.55265070815372,7.468812049210355,,100.0,,,173.4207108107916,658.5905761135058,1.5632148728576785
-hp09,134.55265070815372,7.468812049210355,,100.0,,,173.18280741729558,735.8696298569129,2.153276220810655
-hp10,134.55265070815372,7.468812049210355,,100.0,,,172.84976247178454,797.6526965832767,2.5045886415721395
-hp11,134.55265070815372,7.468812049210355,,100.0,,,172.45564969165318,859.5175621108472,2.817233457007133
-ip01,35.92277251384842,1.9940182135424476,,100.0,,,43.85,436.12545209746065,0.03961655002925777
-ip02,35.92277251384842,1.9940182135424476,,100.0,,,43.430327782067046,460.19724622427833,0.04074963868839372
-ip03,19.427035375489222,1.0783650498837554,,100.0,,,43.430327782067046,460.19724622427833,0.02203740460268332
-ip04,16.495737138359196,0.9156531636586919,,100.0,,,43.430327782067046,460.19724622427833,0.018712234085710395
-ip05,19.427035375489222,1.0783650498837554,,100.0,,,42.43281224594589,514.3170079206308,0.023907323009632837
-ip06,19.427035375489222,1.0783650498837554,,100.0,,,42.43281224594589,527.4354277663331,0.9114689101591396
-ip07,19.427035375489222,1.0783650498837554,,100.0,,,42.26432313893727,559.9971958796934,1.0322971894791337
-ip08,153.18582544446483,8.503111108003768,,100.0,,,24.001353467539808,578.3211012074823,16.016766266724154
-ip09,153.18582544446483,8.503111108003768,,100.0,,,22.992808951743164,705.684543188747,21.14788913147699
-ip10,153.18582544446483,8.503111108003768,,100.0,,,19.520691685069558,857.7119925922289,30.76017176329674
-ip11,134.55265070815372,7.468812049210355,,100.0,,,24.001353467539808,585.0649232898572,14.276257190177793
-ip12,0.09956896152403376,0.005526920916415662,,100.0,,,24.001353467539808,585.0649232898572,0.010564430320731566
-ip13,0.6574242513600467,0.03649261567244221,,100.0,,,24.001353467539808,585.0649232898572,0.0697537926312095
-ip14,0.03686742629403412,0.0020464545014836372,,100.0,,,24.001353467539808,585.0649232898572,0.003911694470108715
-ip15,133.75879006897563,7.4247460581200135,,100.0,,,24.001353467539808,585.0649232898572,14.192027272755743
-lp01,136.7681176025771,7.5917892313662545,,100.0,,,6.550000000000001,353.06884621222355,0.14069504884796233
-lp02,136.7681176025771,7.5917892313662545,,100.0,,,6.550000000000001,407.52227269824976,0.14686244230616405
-lp03,16.495737138359196,0.9156531636586919,,100.0,,,43.430327782067046,325.67522660654794,0.016684026118343208
-lp04,153.26385474093627,8.507442395024945,,100.0,,,6.550000000000001,398.89093783760757,0.16328580861772787
-lp05,153.26385474093627,8.507442395024945,,100.0,,,6.550000000000001,435.4346835656702,8.063613518420778
-lp06,170.47542322200218,9.462830262752803,,100.0,,,6.550000000000001,435.4346835656702,0.18832810554602078
-lp08,35.92277251384842,1.9940182135424476,,100.0,,,6.550000000000001,435.4346835656702,0.03968470977006257
-lp09,134.55265070815372,7.468812049210355,,100.0,,,6.550000000000001,435.4346835656702,0.1486433957759582
-lp10,38.642136035599805,2.1449659275454467,,100.0,,,6.550000000000001,435.4346835656704,11.224668176408528
-lp11,38.642136035599805,2.1449659275454467,,100.0,,,6.550000000000001,557.0014244510184,14.893932875124152
-lp12,55.85370451666565,3.100353795273301,,100.0,,,6.000000000000001,431.97647726522246,3.7417430545775936
-lp13,209.11755925760193,11.607796190298247,,100.0,,,6.550000000000001,435.4346835656702,11.412996281954559
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc_soec_stream_5kg_hrsg_steam.csv b/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc_soec_stream_5kg_hrsg_steam.csv
deleted file mode 100644
index e16c76df..00000000
--- a/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc_soec_stream_5kg_hrsg_steam.csv
+++ /dev/null
@@ -1 +0,0 @@
-""
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc_soec_stream_5kg_soec.csv b/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc_soec_stream_5kg_soec.csv
deleted file mode 100644
index 83d612ea..00000000
--- a/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc_soec_stream_5kg_soec.csv
+++ /dev/null
@@ -1,37 +0,0 @@
-,mass flow (kg/s),mole flow (kmol/s),mole percent Ar (%),mole percent CO2 (%),mole percent H2 (%),mole percent H2O (%),mole percent N2 (%),mole percent O2 (%),pressure (bar),temperature (K),vapor fraction (%),volumetric flow (m**3/s)
-feed01,89.61866574418417,9.57396116155975,,,54.09342512462085,45.90657487537917,,,2.9000019322230313,933.8458240129759,100,256.33073611509946
-feed01b,89.61866574418417,9.57396116155975,,,54.09342512462085,45.90657487537917,,,2.9000019322230313,933.8669616235236,100,256.3365460174378
-feed02,55.85370451666565,3.100353795273301,,,,100.0,,,2.9000019322230313,877.9961223458092,100.0,77.94102953778706
-feed02b,55.85374172091119,3.100353795273301,,,9.999999999995476e-18,100.0,,,2.9000019322230313,877.9961223540182,100,77.91642162643353
-feed03,55.85370451666565,3.100353795273301,,,,100.0,,,2.9000019322230313,577.1102804957496,100.0,50.948589166646144
-hstrm01,49.935699904423196,9.573961161559746,,,79.99995883661028,20.00004116338974,,,2.9000019322230313,967.4643177776798,100,265.65376422216326
-hstrm02,33.764928568947866,6.473607366286448,,,79.99995883661,20.000041163389994,,,2.9000019322230313,967.4643177776798,100,179.62660762143173
-hstrm03,16.17077133547535,3.100353795273297,,,79.99995883661073,20.00004116338927,,,2.9000019322230313,967.4643177776798,100,86.0271566007315
-hstrm04,16.17077133547535,3.100353795273297,,,79.99995883661073,20.00004116338927,,,2.9000019322230313,602.4465664839423,100,53.55525015796257
-hstrm05,16.17077133547535,3.100353795273297,,,79.99995883661073,20.00004116338927,,,2.9000019322230313,294.75226272676224,100,26.121279191431913
-hstrm06,5.0,2.4802817600079368,,,100.0,,,,2.9000019322230313,294.75226272676224,100,20.976825941300547
-hstrm07,5.0,2.4802817600079368,,,100.0,,,,2.9000019322230313,300.0,100,21.350454371783325
-hstrm08,5.0,2.4802817600079368,,,100.0,,,,6.612004405468509,393.9866864366824,100,12.311420895494079
-hstrm09,5.0,2.4802817600079368,,,100.0,,,,6.612004405468509,300.0,100,9.374059779630024
-hstrm10,5.0,2.4802817600079368,,,100.0,,,,15.0753700444682,394.05874524164653,100,5.41410916182838
-hstrm11,5.0,2.4802817600079368,,,100.0,,,,15.0753700444682,300.0,100,4.121612517514159
-hstrm12,5.0,2.4802817600079368,,,100.0,,,,34.37184370138749,394.21234870669565,100,2.389378079851893
-hstrm13,5.0,2.4802817600079368,,,100.0,,,,34.37184370138749,300.0,100,1.8186847921311518
-hstrm15,5.0,2.4802817600079368,,,100.0,,,,65.0,371.12240958068446,100,1.2015292283646866
-ostrm01,318.8335048810722,10.83700564134388,0.7544802344616545,0.024602616341140887,,0.8118863392576493,63.40914318323383,34.99988762670572,2.9000019322230313,980.5252648776553,100,304.8796177978298
-ostrm02,116.03551660012269,3.943994369289493,0.7544802344616657,0.024602616341141248,,0.8118863392576614,63.40914318323478,34.99988762670474,2.9000019322230313,980.5252648776553,100,110.9571717226365
-ostrm03,202.79798828094954,6.893011272054389,0.7544802344616496,0.024602616341140728,,0.8118863392576441,63.40914318323341,34.99988762670615,2.9000019322230313,980.5252648776553,100,193.92244607519336
-ostrm04,202.79798828094954,6.893011272054389,0.7544802344616496,0.024602616341140728,,0.8118863392576442,63.40914318323341,34.99988762670615,2.9000019322230313,604.5778899789707,100,119.57711835270436
-ostrm05,202.79798828094954,6.893011272054389,0.7544802344616496,0.024602616341140734,,0.8118863392576442,63.40914318323341,34.99988762670615,1.01,475.1115826888095,100,269.6473463175309
-ostrm06,202.79798828094954,6.893011272054389,0.7544802344616496,0.024602616341140734,,0.8118863392576442,63.40914318323342,34.99988762670615,1.01,328.8753414905283,100,186.5476262132615
-sweep01,279.1514771324358,9.59686476133991,0.8519768406138049,0.02778185349827624,,0.9168011654431159,71.60309708289064,26.60034305755416,2.9000019322230313,924.79976956185,100,254.65769060295526
-sweep01b,279.1514771324358,9.59686476133991,0.8519768406138049,0.02778185349827624,,0.9168011654431159,71.60309708289064,26.60034305755416,2.9000019322230313,924.8252418782765,100,254.66470154513897
-sweep02,163.1159604025825,5.652870392050419,0.9199999999999998,0.029999999999999992,,0.9900000000000001,77.32,20.739999999999995,2.9000019322230313,885.200742658851,100,143.58356599817895
-sweep03,163.1159604025825,5.652870392050419,0.9199999999999998,0.029999999999999992,,0.9900000000000001,77.32,20.739999999999995,2.9000019322230313,407.2817360484109,100,66.02141552694867
-sweep04,163.11596040258246,5.652870392050418,0.9199999999999999,0.03,,0.9900000000000001,77.32,20.74,1.01,288.15,100,133.99110886628762
-water00,55.85370451666565,3.100353795273301,,,,100.0,,,1.01,288.15,0.0,0.055903879941630215
-water01,55.85370451666565,3.100353795273301,,,,100.0,,,6.000000000000001,288.18502058879545,0.0,0.055891150815121304
-water02,27.905264669703694,1.5489786035769046,,,,100.0,,,6.000000000000001,288.18502058879545,0.0,0.02792397334584878
-water03,27.948439846961964,1.5513751916963967,,,,100.0,,,6.000000000000001,288.18502058879545,0.0,0.02796717746927253
-water04,27.905264669703694,1.5489786035769046,,,,100.0,,,6.000000000000001,431.97647726522246,20.67714732394928,1.8452784022549624
-water05,27.948439846961964,1.5513751916963967,,,,100.0,,,6.000000000000001,431.97647726522246,21.227035370301635,1.896464652326651
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc_soec_stream_5kg_st.csv b/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc_soec_stream_5kg_st.csv
deleted file mode 100644
index fdd016f2..00000000
--- a/idaes_examples/notebooks/active/power_gen/ngcc/data_tabulated/ngcc_soec_stream_5kg_st.csv
+++ /dev/null
@@ -1,23 +0,0 @@
-,mass flow (kg/s),molar enthalpy (kJ/mol),mole flow (kmol/s),pressure (bar),temperature (K),vapor fraction (dimensionless),volumetric flow (m**3/s)
-cw01,3603.0536,1.26,200.0,5.0,289.69843477991503,0.0,3.606515207717081
-cw02,3603.0536,2.111008036933931,200.0,5.0,300.99462904753096,0.0,3.615859145650672
-t01,134.55265070815372,63.534903396933515,7.468812049210355,172.45564969165318,859.5175621108472,1.0,2.817233457007133
-t02,134.55265070815372,54.783128896807774,7.468812049210355,24.001353467539808,585.0649232898572,1.0,14.276257190177793
-t02_dummy,134.55265070815372,54.783128896807774,7.468812049210355,24.001353467539808,585.0649232898572,1.0,14.276257190177793
-t03,153.18582544446483,65.87276785422965,8.503111108003768,19.520691685069558,857.7119925922289,1.0,30.76017176329674
-t03_dummy,153.18582544446483,65.87276785422965,8.503111108003768,19.520691685069558,857.7119925922289,1.0,30.76017176329674
-t04,153.18582544446483,55.68138097716851,8.503111108003768,2.9000019322230313,583.426280651301,1.0,141.3024118589549
-t05,38.642136035599805,54.529100006059785,2.1449659275454467,6.550000000000001,557.0014244510184,1.0,14.893932875124152
-t06,71.93661235183913,55.44926362736577,3.9930914351004456,2.9000019322230313,577.1102804957496,1.0,65.61908364843642
-t07,71.93661235183913,45.22489925091178,3.9930914351004456,0.05462634650024956,307.6085861455058,0.978005002851286,1824.1849215459354
-t08,71.93661235183913,2.600879702883339,3.9930914351004456,0.05462634650024956,307.6085861455052,0.0,0.07235803247502383
-t09,72.72979021236004,2.599779527196466,4.037119526190787,0.05462634650024956,307.59397467622864,0.0,0.07315549209200829
-t10,72.72979021236004,2.614490046301378,4.037119526190787,6.550000000000001,307.6494870116652,0.0,0.07313576523966817
-t11,136.7681176025771,6.037915966829335,7.5917892313662545,6.550000000000001,353.06884621222355,0.0,0.14069504884796233
-t12,0.7931778605209012,2.5,0.044028091090340775,1.01325,306.24808547589186,0.0,0.0007974260736106698
-t13,64.03764461155986,9.925546423707624,3.554631805175469,2.9000019322230313,404.218610659449,0.0,0.06856789697745799
-t14,3.42290092e-05,50.392922742736474,1.9e-06,16.0,475.9999999999998,1.0,4.256381861378689e-06
-t15,0.000648549648,50.49588623927032,3.6e-05,20.0,487.0000000000003,1.0,6.491796070568314e-05
-t16,191.82796148006466,55.44926362736577,10.648077035549216,2.9000019322230313,577.1102804957496,1.0,174.98148215409515
-t17,64.03764461155986,55.44926362736577,3.554631805175469,2.9000019322230313,577.1102804957496,1.0,58.4138093390126
-t18,55.85370451666565,55.44926362736577,3.100353795273301,2.9000019322230313,577.1102804957496,1.0,50.948589166646144
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/gas_turbine_init.json.gz b/idaes_examples/notebooks/active/power_gen/ngcc/gas_turbine_init.json.gz
deleted file mode 100644
index 9f98593e..00000000
Binary files a/idaes_examples/notebooks/active/power_gen/ngcc/gas_turbine_init.json.gz and /dev/null differ
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/hrsg_init.json.gz b/idaes_examples/notebooks/active/power_gen/ngcc/hrsg_init.json.gz
deleted file mode 100644
index 9dd547c5..00000000
Binary files a/idaes_examples/notebooks/active/power_gen/ngcc/hrsg_init.json.gz and /dev/null differ
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/index.md b/idaes_examples/notebooks/active/power_gen/ngcc/index.md
deleted file mode 100644
index 92640132..00000000
--- a/idaes_examples/notebooks/active/power_gen/ngcc/index.md
+++ /dev/null
@@ -1 +0,0 @@
-# Natural gas combined cycle
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc.ipynb b/idaes_examples/notebooks/active/power_gen/ngcc/ngcc.ipynb
deleted file mode 100644
index 7a640f1f..00000000
--- a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc.ipynb
+++ /dev/null
@@ -1,344 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "tags": [
- "header",
- "hide-cell"
- ]
- },
- "outputs": [],
- "source": [
- "###############################################################################\n",
- "# The Institute for the Design of Advanced Energy Systems Integrated Platform\n",
- "# Framework (IDAES IP) was produced under the DOE Institute for the\n",
- "# Design of Advanced Energy Systems (IDAES).\n",
- "#\n",
- "# Copyright (c) 2018-2023 by the software owners: The Regents of the\n",
- "# University of California, through Lawrence Berkeley National Laboratory,\n",
- "# National Technology & Engineering Solutions of Sandia, LLC, Carnegie Mellon\n",
- "# University, West Virginia University Research Corporation, et al.\n",
- "# All rights reserved. Please see the files COPYRIGHT.md and LICENSE.md\n",
- "# for full copyright and license information.\n",
- "###############################################################################"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# NGCC Baseline and Turndown\n",
- "Maintainer: John Eslick \n",
- "Author: John Eslick \n",
- "Updated: 2023-06-01 \n",
- "\n",
- "This notebook runs a series of net electric power outputs from 650 MW to 160 MW (about 100% to 25%) for an NGCC with 97% CO2 capture. The NGCC model is based on the NETL report \"Cost and Performance Baseline for Fossil Energy Plants Volume 1: Bituminous Coal and Natural Gas to Electricity.\" Sept 2019, Case B31B (https://www.netl.doe.gov/projects/files/CostAndPerformanceBaselineForFossilEnergyPlantsVol1BitumCoalAndNGtoElectBBRRev4-1_092419.pdf)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Imports\n",
- "\n",
- "Import the modules that will be used."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "import os\n",
- "import numpy as np\n",
- "import pandas as pd\n",
- "from IPython.core.display import SVG\n",
- "import pyomo.environ as pyo\n",
- "import idaes\n",
- "from idaes.core.solvers import use_idaes_solver_configuration_defaults\n",
- "import idaes.core.util.scaling as iscale\n",
- "import idaes.core.util as iutil\n",
- "from idaes_examples.mod.power_gen import ngcc\n",
- "import pytest\n",
- "import logging\n",
- "\n",
- "logging.getLogger(\"pyomo\").setLevel(logging.ERROR)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Make Output Directories\n",
- "\n",
- "This notebook can produce a large number of output files. To make it easier to manage, some subdirectories are used to organize output. This ensures that the directories exist."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "def make_directory(path):\n",
- " \"\"\"Make a directory if it doesn't exist\"\"\"\n",
- " try:\n",
- " os.mkdir(path)\n",
- " except FileExistsError:\n",
- " pass\n",
- "\n",
- "\n",
- "make_directory(\"data\")\n",
- "make_directory(\"data_pfds\")\n",
- "make_directory(\"data_tabulated\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Global Solver Settings\n",
- "\n",
- "Use the IDAES configuration system for solver settings. These will apply to all Ipopt instances created, including the ones created in initialization methods."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [],
- "source": [
- "use_idaes_solver_configuration_defaults()\n",
- "idaes.cfg.ipopt.options.nlp_scaling_method = \"user-scaling\"\n",
- "idaes.cfg.ipopt.options.linear_solver = \"ma57\"\n",
- "idaes.cfg.ipopt.options.OF_ma57_automatic_scaling = \"yes\"\n",
- "idaes.cfg.ipopt.options.ma57_pivtol = 1e-5\n",
- "idaes.cfg.ipopt.options.ma57_pivtolmax = 0.1\n",
- "solver = pyo.SolverFactory(\"ipopt\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Create the NGCC model\n",
- "\n",
- "Create the NGCC model and initialize it or read the saved initialization if available. The base initialized NGCC model is configured to match the baseline report with 90% capture using a Cansolv system."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [],
- "source": [
- "m = pyo.ConcreteModel()\n",
- "m.fs = ngcc.NgccFlowsheet(dynamic=False)\n",
- "iscale.calculate_scaling_factors(m)\n",
- "m.fs.initialize(\n",
- " load_from=\"ngcc_init.json.gz\",\n",
- " save_to=\"ngcc_init.json.gz\",\n",
- ")\n",
- "res = solver.solve(m, tee=True)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Show PFDs with baseline results\n",
- "\n",
- "This displays PFDs in the notebook, and saves them to files. The full NGCC model is too big to show well in a single PFD, so it is broken into the three main sections, gas turbine, heat recovery steam generator (HRSG), and steam turbine."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [],
- "source": [
- "def display_pfd():\n",
- " print(\"\\n\\nGas Turbine Section\\n\")\n",
- " display(SVG(m.fs.gt.write_pfd()))\n",
- " print(\"\\n\\nHRSG Section\\n\")\n",
- " display(SVG(m.fs.hrsg.write_pfd()))\n",
- " print(\"\\n\\nSteam Turbine Section\\n\")\n",
- " display(SVG(m.fs.st.write_pfd()))\n",
- "\n",
- "\n",
- "display_pfd()\n",
- "\n",
- "m.fs.gt.write_pfd(fname=\"data_pfds/gt_baseline.svg\")\n",
- "m.fs.hrsg.write_pfd(fname=\"data_pfds/hrsg_baseline.svg\")\n",
- "m.fs.st.write_pfd(fname=\"data_pfds/st_baseline.svg\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Test key model outputs against NETL baseline"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Assert results approximately agree with baseline report\n",
- "assert pyo.value(m.fs.net_power_mw[0]) == pytest.approx(646)\n",
- "assert pyo.value(m.fs.gross_power[0]) == pytest.approx(-690e6, rel=0.001)\n",
- "assert pyo.value(100 * m.fs.lhv_efficiency[0]) == pytest.approx(52.8, abs=0.1)\n",
- "assert pyo.value(\n",
- " m.fs.total_variable_cost_rate[0] / m.fs.net_power_mw[0]\n",
- ") == pytest.approx(37.2799, rel=0.01)\n",
- "assert pyo.value(m.fs.fuel_cost_rate[0] / m.fs.net_power_mw[0]) == pytest.approx(\n",
- " 31.6462, rel=0.01\n",
- ")\n",
- "assert pyo.value(\n",
- " m.fs.other_variable_cost_rate[0] / m.fs.net_power_mw[0]\n",
- ") == pytest.approx(5.63373, rel=0.01)\n",
- "assert pyo.value(m.fs.gt.gt_power[0]) == pytest.approx(-477e6, rel=0.001)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [],
- "source": [
- "from matplotlib import pyplot as plt\n",
- "\n",
- "\n",
- "variables = [\"net_power\", \"gross_power\", \"gt_power\"]\n",
- "netl_baseline = [646, 690, 477]\n",
- "idaes_prediction = [\n",
- " pyo.value(m.fs.net_power_mw[0]),\n",
- " -pyo.value(m.fs.gross_power[0]) * 1e-6,\n",
- " -pyo.value(m.fs.gt.gt_power[0]) * 1e-6,\n",
- "]\n",
- "\n",
- "label_location = np.arange(len(variables))\n",
- "\n",
- "width = 0.4\n",
- "\n",
- "fig, ax = plt.subplots()\n",
- "netl_data = ax.bar(variables, netl_baseline, label=\"NETL Baseline\")\n",
- "idaes_sim = ax.bar(\n",
- " label_location + (width / 2), idaes_prediction, width, label=\"IDAES Prediction\"\n",
- ")\n",
- "\n",
- "ax.set_ylabel(\"Power (MW)\")\n",
- "ax.set_xticks(label_location)\n",
- "ax.set_xticklabels(variables)\n",
- "ax.legend()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Run turndown cases 5 MW interval\n",
- "\n",
- "Here we set the CO2 capture rate to 97% and set the specific reboiler duty to PZ advanced solvent system. The minimum power is 160 MW net, which corresponds to a bit under 25%. This is roughly the minimum load for the NGCC modeled. Results are tabulated for tags in the tags_output tag group in a Pandas data frame. \n",
- "\n",
- "To run the series, change run_series to True. Running the turndown series takes a while, unless previous saved results are available. "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [],
- "source": [
- "run_series = False\n",
- "if run_series:\n",
- " idaes.cfg.ipopt.options.tol = 1e-6\n",
- " idaes.cfg.ipopt.options.max_iter = 50\n",
- " solver = pyo.SolverFactory(\"ipopt\")\n",
- "\n",
- " m.fs.cap_specific_reboiler_duty.fix(2.4e6)\n",
- " m.fs.cap_fraction.fix(0.97)\n",
- " powers = np.linspace(650, 160, int((650 - 160) / 5) + 1)\n",
- " powers = list(powers)\n",
- " powers.insert(1, 646)\n",
- "\n",
- " df = pd.DataFrame(columns=m.fs.tags_output.table_heading())\n",
- "\n",
- " for p in powers:\n",
- " print(\"Simulation for net power = \", p)\n",
- " fname = f\"data/ngcc_{int(p)}.json.gz\"\n",
- " if os.path.exists(fname):\n",
- " iutil.from_json(m, fname=fname, wts=iutil.StoreSpec(suffix=False))\n",
- " else:\n",
- " m.fs.net_power_mw.fix(p)\n",
- " res = solver.solve(m, tee=False, symbolic_solver_labels=True)\n",
- " if not pyo.check_optimal_termination(res):\n",
- " break\n",
- " iutil.to_json(m, fname=fname)\n",
- " df.loc[m.fs.tags_output[\"net_power\"].value] = m.fs.tags_output.table_row(\n",
- " numeric=True\n",
- " )\n",
- " if abs(p - 650) < 0.1:\n",
- " m.fs.gt.streams_dataframe().to_csv(\n",
- " \"data_tabulated/ngcc_stream_650mw_gt.csv\"\n",
- " )\n",
- " m.fs.st.steam_streams_dataframe().to_csv(\n",
- " \"data_tabulated/ngcc_stream_650mw_st.csv\"\n",
- " )\n",
- " m.fs.hrsg.steam_streams_dataframe().to_csv(\n",
- " \"data_tabulated/ngcc_stream_650mw_hrsg_steam.csv\"\n",
- " )\n",
- " m.fs.hrsg.flue_gas_streams_dataframe().to_csv(\n",
- " \"data_tabulated/ngcc_stream_650mw_hrsg_gas.csv\"\n",
- " )\n",
- " df.to_csv(\"data_tabulated/ngcc.csv\")\n",
- "\n",
- " # Display the results from the run stored in a pandas dataframe\n",
- " pd.set_option(\"display.max_rows\", None)\n",
- " pd.set_option(\"display.max_columns\", None)\n",
- " display(df)\n",
- "\n",
- " # Plot results\n",
- " plt.plot(df[\"net_power (MW)\"], df[\"lhv_efficiency (%)\"])\n",
- " plt.grid()\n",
- " plt.xlabel(\"Net Power (MW)\")\n",
- " plt.ylabel(\"LHV Efficiency (%)\")\n",
- " plt.title(\"Net Power vs. Efficiency\")\n",
- " plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3 (ipykernel)",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.10.9"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_init.json.gz b/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_init.json.gz
deleted file mode 100644
index d27944ab..00000000
Binary files a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_init.json.gz and /dev/null differ
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_test.ipynb b/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_test.ipynb
deleted file mode 100644
index 900511dc..00000000
--- a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_test.ipynb
+++ /dev/null
@@ -1,344 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "tags": [
- "header",
- "hide-cell"
- ]
- },
- "outputs": [],
- "source": [
- "###############################################################################\n",
- "# The Institute for the Design of Advanced Energy Systems Integrated Platform\n",
- "# Framework (IDAES IP) was produced under the DOE Institute for the\n",
- "# Design of Advanced Energy Systems (IDAES).\n",
- "#\n",
- "# Copyright (c) 2018-2023 by the software owners: The Regents of the\n",
- "# University of California, through Lawrence Berkeley National Laboratory,\n",
- "# National Technology & Engineering Solutions of Sandia, LLC, Carnegie Mellon\n",
- "# University, West Virginia University Research Corporation, et al.\n",
- "# All rights reserved. Please see the files COPYRIGHT.md and LICENSE.md\n",
- "# for full copyright and license information.\n",
- "###############################################################################"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# NGCC Baseline and Turndown\n",
- "Maintainer: John Eslick \n",
- "Author: John Eslick \n",
- "Updated: 2023-06-01 \n",
- "\n",
- "This notebook runs a series of net electric power outputs from 650 MW to 160 MW (about 100% to 25%) for an NGCC with 97% CO2 capture. The NGCC model is based on the NETL report \"Cost and Performance Baseline for Fossil Energy Plants Volume 1: Bituminous Coal and Natural Gas to Electricity.\" Sept 2019, Case B31B (https://www.netl.doe.gov/projects/files/CostAndPerformanceBaselineForFossilEnergyPlantsVol1BitumCoalAndNGtoElectBBRRev4-1_092419.pdf)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Imports\n",
- "\n",
- "Import the modules that will be used."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "import os\n",
- "import numpy as np\n",
- "import pandas as pd\n",
- "from IPython.core.display import SVG\n",
- "import pyomo.environ as pyo\n",
- "import idaes\n",
- "from idaes.core.solvers import use_idaes_solver_configuration_defaults\n",
- "import idaes.core.util.scaling as iscale\n",
- "import idaes.core.util as iutil\n",
- "from idaes_examples.mod.power_gen import ngcc\n",
- "import pytest\n",
- "import logging\n",
- "\n",
- "logging.getLogger(\"pyomo\").setLevel(logging.ERROR)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Make Output Directories\n",
- "\n",
- "This notebook can produce a large number of output files. To make it easier to manage, some subdirectories are used to organize output. This ensures that the directories exist."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "def make_directory(path):\n",
- " \"\"\"Make a directory if it doesn't exist\"\"\"\n",
- " try:\n",
- " os.mkdir(path)\n",
- " except FileExistsError:\n",
- " pass\n",
- "\n",
- "\n",
- "make_directory(\"data\")\n",
- "make_directory(\"data_pfds\")\n",
- "make_directory(\"data_tabulated\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Global Solver Settings\n",
- "\n",
- "Use the IDAES configuration system for solver settings. These will apply to all Ipopt instances created, including the ones created in initialization methods."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [],
- "source": [
- "use_idaes_solver_configuration_defaults()\n",
- "idaes.cfg.ipopt.options.nlp_scaling_method = \"user-scaling\"\n",
- "idaes.cfg.ipopt.options.linear_solver = \"ma57\"\n",
- "idaes.cfg.ipopt.options.OF_ma57_automatic_scaling = \"yes\"\n",
- "idaes.cfg.ipopt.options.ma57_pivtol = 1e-5\n",
- "idaes.cfg.ipopt.options.ma57_pivtolmax = 0.1\n",
- "solver = pyo.SolverFactory(\"ipopt\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Create the NGCC model\n",
- "\n",
- "Create the NGCC model and initialize it or read the saved initialization if available. The base initialized NGCC model is configured to match the baseline report with 90% capture using a Cansolv system."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [],
- "source": [
- "m = pyo.ConcreteModel()\n",
- "m.fs = ngcc.NgccFlowsheet(dynamic=False)\n",
- "iscale.calculate_scaling_factors(m)\n",
- "m.fs.initialize(\n",
- " load_from=\"ngcc_init.json.gz\",\n",
- " save_to=\"ngcc_init.json.gz\",\n",
- ")\n",
- "res = solver.solve(m, tee=True)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Show PFDs with baseline results\n",
- "\n",
- "This displays PFDs in the notebook, and saves them to files. The full NGCC model is too big to show well in a single PFD, so it is broken into the three main sections, gas turbine, heat recovery steam generator (HRSG), and steam turbine."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [],
- "source": [
- "def display_pfd():\n",
- " print(\"\\n\\nGas Turbine Section\\n\")\n",
- " display(SVG(m.fs.gt.write_pfd()))\n",
- " print(\"\\n\\nHRSG Section\\n\")\n",
- " display(SVG(m.fs.hrsg.write_pfd()))\n",
- " print(\"\\n\\nSteam Turbine Section\\n\")\n",
- " display(SVG(m.fs.st.write_pfd()))\n",
- "\n",
- "\n",
- "display_pfd()\n",
- "\n",
- "m.fs.gt.write_pfd(fname=\"data_pfds/gt_baseline.svg\")\n",
- "m.fs.hrsg.write_pfd(fname=\"data_pfds/hrsg_baseline.svg\")\n",
- "m.fs.st.write_pfd(fname=\"data_pfds/st_baseline.svg\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Test key model outputs against NETL baseline"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Assert results approximately agree with baseline reoprt\n",
- "assert pyo.value(m.fs.net_power_mw[0]) == pytest.approx(646)\n",
- "assert pyo.value(m.fs.gross_power[0]) == pytest.approx(-690e6, rel=0.001)\n",
- "assert pyo.value(100 * m.fs.lhv_efficiency[0]) == pytest.approx(52.8, abs=0.1)\n",
- "assert pyo.value(\n",
- " m.fs.total_variable_cost_rate[0] / m.fs.net_power_mw[0]\n",
- ") == pytest.approx(37.2799, rel=0.01)\n",
- "assert pyo.value(m.fs.fuel_cost_rate[0] / m.fs.net_power_mw[0]) == pytest.approx(\n",
- " 31.6462, rel=0.01\n",
- ")\n",
- "assert pyo.value(\n",
- " m.fs.other_variable_cost_rate[0] / m.fs.net_power_mw[0]\n",
- ") == pytest.approx(5.63373, rel=0.01)\n",
- "assert pyo.value(m.fs.gt.gt_power[0]) == pytest.approx(-477e6, rel=0.001)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [],
- "source": [
- "from matplotlib import pyplot as plt\n",
- "\n",
- "\n",
- "variables = [\"net_power\", \"gross_power\", \"gt_power\"]\n",
- "netl_baseline = [646, 690, 477]\n",
- "idaes_prediction = [\n",
- " pyo.value(m.fs.net_power_mw[0]),\n",
- " -pyo.value(m.fs.gross_power[0]) * 1e-6,\n",
- " -pyo.value(m.fs.gt.gt_power[0]) * 1e-6,\n",
- "]\n",
- "\n",
- "label_location = np.arange(len(variables))\n",
- "\n",
- "width = 0.4\n",
- "\n",
- "fig, ax = plt.subplots()\n",
- "netl_data = ax.bar(variables, netl_baseline, label=\"NETL Baseline\")\n",
- "idaes_sim = ax.bar(\n",
- " label_location + (width / 2), idaes_prediction, width, label=\"IDAES Prediction\"\n",
- ")\n",
- "\n",
- "ax.set_ylabel(\"Power (MW)\")\n",
- "ax.set_xticks(label_location)\n",
- "ax.set_xticklabels(variables)\n",
- "ax.legend()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Run turndown cases 5 MW interval\n",
- "\n",
- "Here we set the CO2 capture rate to 97% and set the specific reboiler duty to PZ advanced solvent system. The minimum power is 160 MW net, which corresponds to a bit under 25%. This is roughly the minimum load for the NGCC modeled. Results are tabulated for tags in the tags_output tag group in a Pandas data frame. \n",
- "\n",
- "To run the series, change run_series to True. Running the turndown series takes a while, unless previous saved results are available. "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [],
- "source": [
- "run_series = False\n",
- "if run_series:\n",
- " idaes.cfg.ipopt.options.tol = 1e-6\n",
- " idaes.cfg.ipopt.options.max_iter = 50\n",
- " solver = pyo.SolverFactory(\"ipopt\")\n",
- "\n",
- " m.fs.cap_specific_reboiler_duty.fix(2.4e6)\n",
- " m.fs.cap_fraction.fix(0.97)\n",
- " powers = np.linspace(650, 160, int((650 - 160) / 5) + 1)\n",
- " powers = list(powers)\n",
- " powers.insert(1, 646)\n",
- "\n",
- " df = pd.DataFrame(columns=m.fs.tags_output.table_heading())\n",
- "\n",
- " for p in powers:\n",
- " print(\"Simulation for net power = \", p)\n",
- " fname = f\"data/ngcc_{int(p)}.json.gz\"\n",
- " if os.path.exists(fname):\n",
- " iutil.from_json(m, fname=fname, wts=iutil.StoreSpec(suffix=False))\n",
- " else:\n",
- " m.fs.net_power_mw.fix(p)\n",
- " res = solver.solve(m, tee=False, symbolic_solver_labels=True)\n",
- " if not pyo.check_optimal_termination(res):\n",
- " break\n",
- " iutil.to_json(m, fname=fname)\n",
- " df.loc[m.fs.tags_output[\"net_power\"].value] = m.fs.tags_output.table_row(\n",
- " numeric=True\n",
- " )\n",
- " if abs(p - 650) < 0.1:\n",
- " m.fs.gt.streams_dataframe().to_csv(\n",
- " \"data_tabulated/ngcc_stream_650mw_gt.csv\"\n",
- " )\n",
- " m.fs.st.steam_streams_dataframe().to_csv(\n",
- " \"data_tabulated/ngcc_stream_650mw_st.csv\"\n",
- " )\n",
- " m.fs.hrsg.steam_streams_dataframe().to_csv(\n",
- " \"data_tabulated/ngcc_stream_650mw_hrsg_steam.csv\"\n",
- " )\n",
- " m.fs.hrsg.flue_gas_streams_dataframe().to_csv(\n",
- " \"data_tabulated/ngcc_stream_650mw_hrsg_gas.csv\"\n",
- " )\n",
- " df.to_csv(\"data_tabulated/ngcc.csv\")\n",
- "\n",
- " # Display the results from the run stored in a pandas dataframe\n",
- " pd.set_option(\"display.max_rows\", None)\n",
- " pd.set_option(\"display.max_columns\", None)\n",
- " display(df)\n",
- "\n",
- " # Plot results\n",
- " plt.plot(df[\"net_power (MW)\"], df[\"lhv_efficiency (%)\"])\n",
- " plt.grid()\n",
- " plt.xlabel(\"Net Power (MW)\")\n",
- " plt.ylabel(\"LHV Efficiency (%)\")\n",
- " plt.title(\"Net Power vs. Efficiency\")\n",
- " plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3 (ipykernel)",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.10.9"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 3
-}
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_usr.ipynb b/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_usr.ipynb
deleted file mode 100644
index 900511dc..00000000
--- a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_usr.ipynb
+++ /dev/null
@@ -1,344 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "tags": [
- "header",
- "hide-cell"
- ]
- },
- "outputs": [],
- "source": [
- "###############################################################################\n",
- "# The Institute for the Design of Advanced Energy Systems Integrated Platform\n",
- "# Framework (IDAES IP) was produced under the DOE Institute for the\n",
- "# Design of Advanced Energy Systems (IDAES).\n",
- "#\n",
- "# Copyright (c) 2018-2023 by the software owners: The Regents of the\n",
- "# University of California, through Lawrence Berkeley National Laboratory,\n",
- "# National Technology & Engineering Solutions of Sandia, LLC, Carnegie Mellon\n",
- "# University, West Virginia University Research Corporation, et al.\n",
- "# All rights reserved. Please see the files COPYRIGHT.md and LICENSE.md\n",
- "# for full copyright and license information.\n",
- "###############################################################################"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# NGCC Baseline and Turndown\n",
- "Maintainer: John Eslick \n",
- "Author: John Eslick \n",
- "Updated: 2023-06-01 \n",
- "\n",
- "This notebook runs a series of net electric power outputs from 650 MW to 160 MW (about 100% to 25%) for an NGCC with 97% CO2 capture. The NGCC model is based on the NETL report \"Cost and Performance Baseline for Fossil Energy Plants Volume 1: Bituminous Coal and Natural Gas to Electricity.\" Sept 2019, Case B31B (https://www.netl.doe.gov/projects/files/CostAndPerformanceBaselineForFossilEnergyPlantsVol1BitumCoalAndNGtoElectBBRRev4-1_092419.pdf)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Imports\n",
- "\n",
- "Import the modules that will be used."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "import os\n",
- "import numpy as np\n",
- "import pandas as pd\n",
- "from IPython.core.display import SVG\n",
- "import pyomo.environ as pyo\n",
- "import idaes\n",
- "from idaes.core.solvers import use_idaes_solver_configuration_defaults\n",
- "import idaes.core.util.scaling as iscale\n",
- "import idaes.core.util as iutil\n",
- "from idaes_examples.mod.power_gen import ngcc\n",
- "import pytest\n",
- "import logging\n",
- "\n",
- "logging.getLogger(\"pyomo\").setLevel(logging.ERROR)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Make Output Directories\n",
- "\n",
- "This notebook can produce a large number of output files. To make it easier to manage, some subdirectories are used to organize output. This ensures that the directories exist."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "def make_directory(path):\n",
- " \"\"\"Make a directory if it doesn't exist\"\"\"\n",
- " try:\n",
- " os.mkdir(path)\n",
- " except FileExistsError:\n",
- " pass\n",
- "\n",
- "\n",
- "make_directory(\"data\")\n",
- "make_directory(\"data_pfds\")\n",
- "make_directory(\"data_tabulated\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Global Solver Settings\n",
- "\n",
- "Use the IDAES configuration system for solver settings. These will apply to all Ipopt instances created, including the ones created in initialization methods."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [],
- "source": [
- "use_idaes_solver_configuration_defaults()\n",
- "idaes.cfg.ipopt.options.nlp_scaling_method = \"user-scaling\"\n",
- "idaes.cfg.ipopt.options.linear_solver = \"ma57\"\n",
- "idaes.cfg.ipopt.options.OF_ma57_automatic_scaling = \"yes\"\n",
- "idaes.cfg.ipopt.options.ma57_pivtol = 1e-5\n",
- "idaes.cfg.ipopt.options.ma57_pivtolmax = 0.1\n",
- "solver = pyo.SolverFactory(\"ipopt\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Create the NGCC model\n",
- "\n",
- "Create the NGCC model and initialize it or read the saved initialization if available. The base initialized NGCC model is configured to match the baseline report with 90% capture using a Cansolv system."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [],
- "source": [
- "m = pyo.ConcreteModel()\n",
- "m.fs = ngcc.NgccFlowsheet(dynamic=False)\n",
- "iscale.calculate_scaling_factors(m)\n",
- "m.fs.initialize(\n",
- " load_from=\"ngcc_init.json.gz\",\n",
- " save_to=\"ngcc_init.json.gz\",\n",
- ")\n",
- "res = solver.solve(m, tee=True)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Show PFDs with baseline results\n",
- "\n",
- "This displays PFDs in the notebook, and saves them to files. The full NGCC model is too big to show well in a single PFD, so it is broken into the three main sections, gas turbine, heat recovery steam generator (HRSG), and steam turbine."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [],
- "source": [
- "def display_pfd():\n",
- " print(\"\\n\\nGas Turbine Section\\n\")\n",
- " display(SVG(m.fs.gt.write_pfd()))\n",
- " print(\"\\n\\nHRSG Section\\n\")\n",
- " display(SVG(m.fs.hrsg.write_pfd()))\n",
- " print(\"\\n\\nSteam Turbine Section\\n\")\n",
- " display(SVG(m.fs.st.write_pfd()))\n",
- "\n",
- "\n",
- "display_pfd()\n",
- "\n",
- "m.fs.gt.write_pfd(fname=\"data_pfds/gt_baseline.svg\")\n",
- "m.fs.hrsg.write_pfd(fname=\"data_pfds/hrsg_baseline.svg\")\n",
- "m.fs.st.write_pfd(fname=\"data_pfds/st_baseline.svg\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Test key model outputs against NETL baseline"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Assert results approximately agree with baseline reoprt\n",
- "assert pyo.value(m.fs.net_power_mw[0]) == pytest.approx(646)\n",
- "assert pyo.value(m.fs.gross_power[0]) == pytest.approx(-690e6, rel=0.001)\n",
- "assert pyo.value(100 * m.fs.lhv_efficiency[0]) == pytest.approx(52.8, abs=0.1)\n",
- "assert pyo.value(\n",
- " m.fs.total_variable_cost_rate[0] / m.fs.net_power_mw[0]\n",
- ") == pytest.approx(37.2799, rel=0.01)\n",
- "assert pyo.value(m.fs.fuel_cost_rate[0] / m.fs.net_power_mw[0]) == pytest.approx(\n",
- " 31.6462, rel=0.01\n",
- ")\n",
- "assert pyo.value(\n",
- " m.fs.other_variable_cost_rate[0] / m.fs.net_power_mw[0]\n",
- ") == pytest.approx(5.63373, rel=0.01)\n",
- "assert pyo.value(m.fs.gt.gt_power[0]) == pytest.approx(-477e6, rel=0.001)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [],
- "source": [
- "from matplotlib import pyplot as plt\n",
- "\n",
- "\n",
- "variables = [\"net_power\", \"gross_power\", \"gt_power\"]\n",
- "netl_baseline = [646, 690, 477]\n",
- "idaes_prediction = [\n",
- " pyo.value(m.fs.net_power_mw[0]),\n",
- " -pyo.value(m.fs.gross_power[0]) * 1e-6,\n",
- " -pyo.value(m.fs.gt.gt_power[0]) * 1e-6,\n",
- "]\n",
- "\n",
- "label_location = np.arange(len(variables))\n",
- "\n",
- "width = 0.4\n",
- "\n",
- "fig, ax = plt.subplots()\n",
- "netl_data = ax.bar(variables, netl_baseline, label=\"NETL Baseline\")\n",
- "idaes_sim = ax.bar(\n",
- " label_location + (width / 2), idaes_prediction, width, label=\"IDAES Prediction\"\n",
- ")\n",
- "\n",
- "ax.set_ylabel(\"Power (MW)\")\n",
- "ax.set_xticks(label_location)\n",
- "ax.set_xticklabels(variables)\n",
- "ax.legend()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Run turndown cases 5 MW interval\n",
- "\n",
- "Here we set the CO2 capture rate to 97% and set the specific reboiler duty to PZ advanced solvent system. The minimum power is 160 MW net, which corresponds to a bit under 25%. This is roughly the minimum load for the NGCC modeled. Results are tabulated for tags in the tags_output tag group in a Pandas data frame. \n",
- "\n",
- "To run the series, change run_series to True. Running the turndown series takes a while, unless previous saved results are available. "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [],
- "source": [
- "run_series = False\n",
- "if run_series:\n",
- " idaes.cfg.ipopt.options.tol = 1e-6\n",
- " idaes.cfg.ipopt.options.max_iter = 50\n",
- " solver = pyo.SolverFactory(\"ipopt\")\n",
- "\n",
- " m.fs.cap_specific_reboiler_duty.fix(2.4e6)\n",
- " m.fs.cap_fraction.fix(0.97)\n",
- " powers = np.linspace(650, 160, int((650 - 160) / 5) + 1)\n",
- " powers = list(powers)\n",
- " powers.insert(1, 646)\n",
- "\n",
- " df = pd.DataFrame(columns=m.fs.tags_output.table_heading())\n",
- "\n",
- " for p in powers:\n",
- " print(\"Simulation for net power = \", p)\n",
- " fname = f\"data/ngcc_{int(p)}.json.gz\"\n",
- " if os.path.exists(fname):\n",
- " iutil.from_json(m, fname=fname, wts=iutil.StoreSpec(suffix=False))\n",
- " else:\n",
- " m.fs.net_power_mw.fix(p)\n",
- " res = solver.solve(m, tee=False, symbolic_solver_labels=True)\n",
- " if not pyo.check_optimal_termination(res):\n",
- " break\n",
- " iutil.to_json(m, fname=fname)\n",
- " df.loc[m.fs.tags_output[\"net_power\"].value] = m.fs.tags_output.table_row(\n",
- " numeric=True\n",
- " )\n",
- " if abs(p - 650) < 0.1:\n",
- " m.fs.gt.streams_dataframe().to_csv(\n",
- " \"data_tabulated/ngcc_stream_650mw_gt.csv\"\n",
- " )\n",
- " m.fs.st.steam_streams_dataframe().to_csv(\n",
- " \"data_tabulated/ngcc_stream_650mw_st.csv\"\n",
- " )\n",
- " m.fs.hrsg.steam_streams_dataframe().to_csv(\n",
- " \"data_tabulated/ngcc_stream_650mw_hrsg_steam.csv\"\n",
- " )\n",
- " m.fs.hrsg.flue_gas_streams_dataframe().to_csv(\n",
- " \"data_tabulated/ngcc_stream_650mw_hrsg_gas.csv\"\n",
- " )\n",
- " df.to_csv(\"data_tabulated/ngcc.csv\")\n",
- "\n",
- " # Display the results from the run stored in a pandas dataframe\n",
- " pd.set_option(\"display.max_rows\", None)\n",
- " pd.set_option(\"display.max_columns\", None)\n",
- " display(df)\n",
- "\n",
- " # Plot results\n",
- " plt.plot(df[\"net_power (MW)\"], df[\"lhv_efficiency (%)\"])\n",
- " plt.grid()\n",
- " plt.xlabel(\"Net Power (MW)\")\n",
- " plt.ylabel(\"LHV Efficiency (%)\")\n",
- " plt.title(\"Net Power vs. Efficiency\")\n",
- " plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3 (ipykernel)",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.10.9"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 3
-}
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/steam_turbine_init.json.gz b/idaes_examples/notebooks/active/power_gen/ngcc/steam_turbine_init.json.gz
deleted file mode 100644
index 213d5bef..00000000
Binary files a/idaes_examples/notebooks/active/power_gen/ngcc/steam_turbine_init.json.gz and /dev/null differ
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/gt_baseline.svg b/idaes_examples/notebooks/docs/power_gen/ngcc/data_pfds/gt_baseline.svg
similarity index 100%
rename from idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/gt_baseline.svg
rename to idaes_examples/notebooks/docs/power_gen/ngcc/data_pfds/gt_baseline.svg
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/hrsg_baseline.svg b/idaes_examples/notebooks/docs/power_gen/ngcc/data_pfds/hrsg_baseline.svg
similarity index 100%
rename from idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/hrsg_baseline.svg
rename to idaes_examples/notebooks/docs/power_gen/ngcc/data_pfds/hrsg_baseline.svg
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/st_baseline.svg b/idaes_examples/notebooks/docs/power_gen/ngcc/data_pfds/st_baseline.svg
similarity index 100%
rename from idaes_examples/notebooks/active/power_gen/ngcc/data_pfds/st_baseline.svg
rename to idaes_examples/notebooks/docs/power_gen/ngcc/data_pfds/st_baseline.svg
diff --git a/idaes_examples/notebooks/docs/power_gen/ngcc/gas_turbine_init.json.gz b/idaes_examples/notebooks/docs/power_gen/ngcc/gas_turbine_init.json.gz
new file mode 100644
index 00000000..1c4ca1bc
Binary files /dev/null and b/idaes_examples/notebooks/docs/power_gen/ngcc/gas_turbine_init.json.gz differ
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/gas_turbine_template.svg b/idaes_examples/notebooks/docs/power_gen/ngcc/gas_turbine_template.svg
similarity index 100%
rename from idaes_examples/notebooks/active/power_gen/ngcc/gas_turbine_template.svg
rename to idaes_examples/notebooks/docs/power_gen/ngcc/gas_turbine_template.svg
diff --git a/idaes_examples/notebooks/docs/power_gen/ngcc/hrsg_init.json.gz b/idaes_examples/notebooks/docs/power_gen/ngcc/hrsg_init.json.gz
new file mode 100644
index 00000000..65dbfe64
Binary files /dev/null and b/idaes_examples/notebooks/docs/power_gen/ngcc/hrsg_init.json.gz differ
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/hrsg_template.svg b/idaes_examples/notebooks/docs/power_gen/ngcc/hrsg_template.svg
similarity index 100%
rename from idaes_examples/notebooks/active/power_gen/ngcc/hrsg_template.svg
rename to idaes_examples/notebooks/docs/power_gen/ngcc/hrsg_template.svg
diff --git a/idaes_examples/notebooks/docs/power_gen/ngcc/index.md b/idaes_examples/notebooks/docs/power_gen/ngcc/index.md
new file mode 100644
index 00000000..81a36a46
--- /dev/null
+++ b/idaes_examples/notebooks/docs/power_gen/ngcc/index.md
@@ -0,0 +1 @@
+# Natural gas combined cycle
\ No newline at end of file
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_doc.ipynb b/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc.ipynb
similarity index 97%
rename from idaes_examples/notebooks/active/power_gen/ngcc/ngcc_doc.ipynb
rename to idaes_examples/notebooks/docs/power_gen/ngcc/ngcc.ipynb
index 4c941108..e0502cfe 100644
--- a/idaes_examples/notebooks/active/power_gen/ngcc/ngcc_doc.ipynb
+++ b/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc.ipynb
@@ -3,6 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
+ "id": "c886cc60",
"metadata": {
"tags": [
"header",
@@ -27,18 +28,20 @@
},
{
"cell_type": "markdown",
+ "id": "b8b80323",
"metadata": {},
"source": [
"# NGCC Baseline and Turndown\n",
- "Maintainer: John Eslick \n",
+ "Maintainer: Javal Vyas \n",
"Author: John Eslick \n",
- "Updated: 2023-06-01 \n",
+ "Updated: 2024-07-25 \n",
"\n",
- "This notebook runs a series of net electric power outputs from 650 MW to 160 MW (about 100% to 25%) for an NGCC with 97% CO2 capture. The NGCC model is based on the NETL report \"Cost and Performance Baseline for Fossil Energy Plants Volume 1: Bituminous Coal and Natural Gas to Electricity.\" Sept 2019, Case B31B (https://www.netl.doe.gov/projects/files/CostAndPerformanceBaselineForFossilEnergyPlantsVol1BitumCoalAndNGtoElectBBRRev4-1_092419.pdf)."
+ "This notebook runs a series of net electric power outputs from 650 MW to 160 MW (about 100% to 25%) for an NGCC with 97% CO2 capture. The NGCC model is based on the NETL report \"Cost and Performance Baseline for Fossil Energy Plants Volume 1, Bituminous Coal and Natural Gas to Electricity.\" Sept 2019, Case B31B [resource](https://www.osti.gov/servlets/purl/1893822). Another valuable resource for gaining a deeper understanding of the mathematical model would be the publication referenced [here](https://www.sciencedirect.com/science/article/pii/S1750583617302414). "
]
},
{
"cell_type": "markdown",
+ "id": "ee336f74",
"metadata": {},
"source": [
"## Imports\n",
@@ -49,6 +52,7 @@
{
"cell_type": "code",
"execution_count": 2,
+ "id": "82c19b96",
"metadata": {},
"outputs": [],
"source": [
@@ -62,6 +66,7 @@
"import idaes.core.util.scaling as iscale\n",
"import idaes.core.util as iutil\n",
"from idaes_examples.mod.power_gen import ngcc\n",
+ "import idaes.logger as idaeslog\n",
"import pytest\n",
"import logging\n",
"\n",
@@ -70,6 +75,7 @@
},
{
"cell_type": "markdown",
+ "id": "253dc19f",
"metadata": {},
"source": [
"## Make Output Directories\n",
@@ -80,6 +86,7 @@
{
"cell_type": "code",
"execution_count": 3,
+ "id": "0e45525b",
"metadata": {},
"outputs": [],
"source": [
@@ -98,6 +105,7 @@
},
{
"cell_type": "markdown",
+ "id": "6630fdb1",
"metadata": {},
"source": [
"## Global Solver Settings\n",
@@ -108,6 +116,7 @@
{
"cell_type": "code",
"execution_count": 4,
+ "id": "42e0b37d",
"metadata": {},
"outputs": [],
"source": [
@@ -122,6 +131,7 @@
},
{
"cell_type": "markdown",
+ "id": "050b533f",
"metadata": {},
"source": [
"## Create the NGCC model\n",
@@ -132,244 +142,23 @@
{
"cell_type": "code",
"execution_count": 5,
+ "id": "9913783b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "2023-11-02 10:27:04 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:04 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:04 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:04 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:04 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:04 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:04 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:04 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:04 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:05 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:05 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:05 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:05 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:05 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:05 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:07 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:07 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:07 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:09 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:09 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:09 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:09 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:09 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:09 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:09 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:10 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:10 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:10 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:10 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:10 [WARNING] idaes.models.properties.general_helmholtz.helmholtz_state: Helmholtz EoS packages using Mixed phase representation ignore the 'has_phase_equilibrium' configuration argument. However, setting this to True can result in errors when constructing material balances due to only having a single phase (thus phase transfer terms cannot be constructed).\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2023-11-02 10:27:11 [INFO] idaes.init.fs: NGCC load initial from ngcc_init.json.gz\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
+ "2024-07-25 03:12:25 [INFO] idaes.init.fs: NGCC load initial from ngcc_init.json.gz\n",
"Ipopt 3.13.2: nlp_scaling_method=user-scaling\n",
"tol=1e-06\n",
"max_iter=200\n",
"linear_solver=ma57\n",
"ma57_pivtol=1e-05\n",
"ma57_pivtolmax=0.1\n",
- "option_file_name=C:\\Users\\dkgun\\AppData\\Local\\Temp\\tmp6k86_an1_ipopt.opt\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
+ "option_file_name=C:\\Users\\javal\\AppData\\Local\\Temp\\tmpa9m4gkwo_ipopt.opt\n",
"\n",
- "Using option file \"C:\\Users\\dkgun\\AppData\\Local\\Temp\\tmp6k86_an1_ipopt.opt\".\n",
+ "Using option file \"C:\\Users\\javal\\AppData\\Local\\Temp\\tmpa9m4gkwo_ipopt.opt\".\n",
"\n",
"\n",
"******************************************************************************\n",
@@ -407,32 +196,20 @@
" inequality constraints with only upper bounds: 0\n",
"\n",
"iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n",
- " 0 0.0000000e+00 3.50e+01 1.00e+00 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
+ " 0 0.0000000e+00 3.50e+01 1.00e+00 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0\n",
"Reallocating memory for MA57: lfact (111709)\n",
- " 1 0.0000000e+00 3.49e-01 1.18e+04 -1.0 3.22e+03 - 9.90e-01 9.90e-01h 1\n",
- " 2 0.0000000e+00 3.15e-03 5.40e+02 -1.0 3.05e+03 - 9.89e-01 9.91e-01h 1\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- " 3 0.0000000e+00 3.09e-07 9.98e+02 -1.0 3.77e+01 - 9.90e-01 1.00e+00h 1\n",
+ " 1 0.0000000e+00 3.49e-01 1.12e+04 -1.0 3.06e+03 - 9.90e-01 9.90e-01h 1\n",
+ " 2 0.0000000e+00 3.15e-03 5.15e+02 -1.0 3.02e+03 - 9.89e-01 9.91e-01h 1\n",
+ " 3 0.0000000e+00 2.95e-07 9.98e+02 -1.0 3.74e+01 - 9.90e-01 1.00e+00h 1\n",
"\n",
"Number of Iterations....: 3\n",
"\n",
" (scaled) (unscaled)\n",
"Objective...............: 0.0000000000000000e+00 0.0000000000000000e+00\n",
"Dual infeasibility......: 0.0000000000000000e+00 0.0000000000000000e+00\n",
- "Constraint violation....: 3.0880664780852385e-07 3.0880664780852385e-07\n",
+ "Constraint violation....: 2.9462398742907681e-07 2.9462398742907681e-07\n",
"Complementarity.........: 0.0000000000000000e+00 0.0000000000000000e+00\n",
- "Overall NLP error.......: 3.0880664780852385e-07 3.0880664780852385e-07\n",
+ "Overall NLP error.......: 2.9462398742907681e-07 2.9462398742907681e-07\n",
"\n",
"\n",
"Number of objective function evaluations = 4\n",
@@ -442,8 +219,8 @@
"Number of equality constraint Jacobian evaluations = 4\n",
"Number of inequality constraint Jacobian evaluations = 0\n",
"Number of Lagrangian Hessian evaluations = 3\n",
- "Total CPU secs in IPOPT (w/o function evaluations) = 0.079\n",
- "Total CPU secs in NLP function evaluations = 1.060\n",
+ "Total CPU secs in IPOPT (w/o function evaluations) = 0.085\n",
+ "Total CPU secs in NLP function evaluations = 1.396\n",
"\n",
"EXIT: Optimal Solution Found.\n"
]
@@ -454,14 +231,16 @@
"m.fs = ngcc.NgccFlowsheet(dynamic=False)\n",
"iscale.calculate_scaling_factors(m)\n",
"m.fs.initialize(\n",
- " load_from=\"ngcc_init.json.gz\",\n",
- " save_to=\"ngcc_init.json.gz\",\n",
+ " load_from='ngcc_init.json.gz',\n",
+ " save_to='ngcc_init.json.gz',\n",
+ " outlvl=idaeslog.INFO_HIGH,\n",
")\n",
"res = solver.solve(m, tee=True)"
]
},
{
"cell_type": "markdown",
+ "id": "90988591",
"metadata": {},
"source": [
"## Show PFDs with baseline results\n",
@@ -472,6 +251,7 @@
{
"cell_type": "code",
"execution_count": 6,
+ "id": "ca2cf4a0",
"metadata": {},
"outputs": [
{
@@ -1154,11 +934,7 @@
""
]
},
- "metadata": {
- "filenames": {
- "image/svg+xml": "C:\\Users\\dkgun\\src\\dangunter\\examples\\idaes_examples\\notebooks\\_build\\jupyter_execute\\active\\power_gen\\ngcc\\ngcc_doc_11_1.svg"
- }
- },
+ "metadata": {},
"output_type": "display_data"
},
{
@@ -2511,11 +2287,7 @@
""
]
},
- "metadata": {
- "filenames": {
- "image/svg+xml": "C:\\Users\\dkgun\\src\\dangunter\\examples\\idaes_examples\\notebooks\\_build\\jupyter_execute\\active\\power_gen\\ngcc\\ngcc_doc_11_3.svg"
- }
- },
+ "metadata": {},
"output_type": "display_data"
},
{
@@ -3001,11 +2773,7 @@
""
]
},
- "metadata": {
- "filenames": {
- "image/svg+xml": "C:\\Users\\dkgun\\src\\dangunter\\examples\\idaes_examples\\notebooks\\_build\\jupyter_execute\\active\\power_gen\\ngcc\\ngcc_doc_11_5.svg"
- }
- },
+ "metadata": {},
"output_type": "display_data"
}
],
@@ -3028,6 +2796,7 @@
},
{
"cell_type": "markdown",
+ "id": "e41a86bf",
"metadata": {},
"source": [
"## Test key model outputs against NETL baseline"
@@ -3036,6 +2805,7 @@
{
"cell_type": "code",
"execution_count": 7,
+ "id": "70964b53",
"metadata": {},
"outputs": [],
"source": [
@@ -3058,12 +2828,13 @@
{
"cell_type": "code",
"execution_count": 8,
+ "id": "3602759a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- ""
+ ""
]
},
"execution_count": 8,
@@ -3072,16 +2843,12 @@
},
{
"data": {
- "image/png": "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XnsNhYWFMDY2hpmZmXTFp3379hg1ahRGjBjR4N93RURERHQ/NRqg3K5dO6xatQqfffYZTp48iYsXL+LOnTto2rQpfH190bRp0/qqk4iIiKhWavV1EUZGRvD19YWvr28dl0NERERUt/g0FhEREckaww4RERHJGsMOERERyRrDDhEREclajcNOWVkZTExMcOrUqfqoh4iIiKhO1TjsKJVKtGjRAuXl5fVRDxEREVGdqtVtrOnTp2PatGm4fv16XddDREREVKdq9Tk7//73v3Hu3Dm4uLjAzc0NVlZWeu1Hjx6tk+KIiIiIHletws7AgQPruAwiIiKi+lGrsPP+++/XdR1ERERE9aLWj57n5+dj9erViI6OlsbuHD16FJcvX66z4oiIiIgeV62u7Jw8eRIhISFQq9W4cOECRo8eDTs7O2zYsAE5OTn44osv6rpOIiIiolqp1ZWdSZMmYcSIETh79izMzc2l5c8//zz2799fZ8URERERPa5ahZ3U1FS8+eabVZY3a9YMOp3usYsiIiIiqiu1CjtmZmYoLCyssvzMmTNwcHB47KKIiIiI6kqtws4LL7yAWbNmoaysDACgUCiQk5ODqVOnIiwsrE4LJCIiInoctQo7CxcuRFFRERwdHXHnzh0EBQWhdevWaNKkCT766KO6rpGIiIio1mr1NJZarcbOnTvxv//9DydPnkRRURGee+45hISE1HV9RERERI+lVmGnuLgY5ubmCAwMRGBgYF3XRERERFRnahV2bGxs0LlzZwQFBaFbt27QarWwsLCo69qIiIiIHlutxuzs2rULvXv3RkpKCl544QXY2toiMDAQ06dPx86dO+u6RiIiIqJaq1XYCQwMxLRp07Bjxw7k5+dj7969aN26NebPn4/evXvXdY1EREREtVar21jAvc/USUxMlKaSkhL069cPwcHBdVgeERER0eOpVdhp1qwZ7ty5g+DgYAQHB2Pq1Klo27YtFApFXddHRERE9FhqdRvLwcEBt2/fhk6ng06nQ25uLu7cuVPXtRERERE9tlqFnePHj0On0+G9995DSUkJpk2bhqZNm6JLly6YPn16XddIREREVGu1HrNjY2ODF154AQEBAejSpQt+/PFHfPXVV0hJSeGnKBMREVGjUauws2HDBmlgckZGBuzs7BAYGIiFCxciKCiormskIiIiqrVahZ2xY8eia9eu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",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAGdCAYAAAD0e7I1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABF2UlEQVR4nO3deVhU9f4H8PcAw+4Mi8CAIuBSQKGYC4xwBRVFU9OkMkPFckkvZmiaoV4jMzXT3C5q1wXqpu1qhfuGehUQcUMhXEIxdcBSQFQW4fv7w4fza8IFEBg8vV/Pc57Hc77fc87nDEfmzTnfM6MQQggQERERyZSRoQsgIiIiqk8MO0RERCRrDDtEREQkaww7REREJGsMO0RERCRrDDtEREQkaww7REREJGsMO0RERCRrJoYuoDGoqKjAlStX0KRJEygUCkOXQ0RERNUghMDNmzfh4uICI6MHX79h2AFw5coVuLq6GroMIiIiqoVLly6hefPmD2xn2AHQpEkTAPdeLJVKZeBqiIiIqDoKCwvh6uoqvY8/CMMOIN26UqlUDDtERERPmEcNQeEAZSIiIpI1hh0iIiKSNYYdIiIikjWO2SEioirKy8tRVlZm6DLob87Y2BgmJiaP/bEwDDtERKSnqKgIv/32G4QQhi6FCJaWlnB2doapqWmtt2HQsOPu7o6LFy9WWf7Pf/4TsbGxKC4uxjvvvIOvv/4aJSUlCA0NxfLly+Hk5CT1zcnJwbhx47B3715YW1sjIiICc+fOhYkJcxwRUU2Vl5fjt99+g6WlJRwcHPhBq2QwQgiUlpbi2rVryM7ORps2bR76wYEPY9BEkJqaivLycmn+1KlT6NmzJ15++WUAwMSJE7F582Z89913UKvVGD9+PAYNGoSDBw8CuPefsm/fvtBoNDh06BCuXr2K4cOHQ6lUYs6cOQY5JiKiJ1lZWRmEEHBwcICFhYWhy6G/OQsLCyiVSly8eBGlpaUwNzev1XYUohFdp4yKikJCQgLOnj2LwsJCODg4YP369XjppZcAAL/88gu8vLyQlJQEf39/bN26Ff369cOVK1ekqz0rV67E1KlTce3atWpf8iosLIRarUZBQQE/Z4eI/taKi4uRnZ0NDw+PWr+xENWlh52T1X3/bjRPY5WWluLLL7/EG2+8AYVCgbS0NJSVlSEkJETq4+npiRYtWiApKQkAkJSUBB8fH73bWqGhoSgsLMTp06cfuK+SkhIUFhbqTURERCRPjSbsbNq0Cfn5+RgxYgQAQKfTwdTUFDY2Nnr9nJycoNPppD5/DjqV7ZVtDzJ37lyo1Wpp4vdiERERyVejGcW7Zs0a9OnTBy4uLvW+r+joaEyaNEmar/xuDSIiuj/39zY36P4uzOvboPv7O7hw4QI8PDxw7Ngx+Pr6IjExEd26dcONGzeqXFiQm0ZxZefixYvYtWsXRo0aJS3TaDQoLS1Ffn6+Xt/c3FxoNBqpT25ubpX2yrYHMTMzk74Hi9+HRUT05BsxYgQUCgXmzZunt3zTpk16T5QlJiZCoVDcd9LpdHB3d39gu0KhkO4+KBQKbNq0qdr1/Xm7xsbGcHFxwciRI3Hjxo26OPxa6dKlC65evQq1Wm2wGhpKowg7cXFxcHR0RN++/5/kO3ToAKVSid27d0vLsrKykJOTA61WCwDQarVIT09HXl6e1Gfnzp1QqVTw9vZuuAMgIiKDMzc3x8cff1ytAJGVlYWrV6/qTY6OjkhNTZXmf/jhhyp9lyxZUuv6Zs2ahatXryInJwfr1q3D/v37MWHChFpv73GZmppCo9H8LT5ewOBhp6KiAnFxcYiIiND7bBy1Wo2RI0di0qRJ2Lt3L9LS0vD6669Dq9XC398fANCrVy94e3tj2LBhOHHiBLZv344ZM2YgMjISZmZmhjokIiIygJCQEGg0GsydO/eRfR0dHaHRaPQmIyMjODg4SPN2dnZV+j7OVZAmTZpAo9GgWbNm6NatGyIiInD06FGp/Y8//sCQIUPQrFkzWFpawsfHB1999ZXeNr7//nv4+PjAwsIC9vb2CAkJwa1bt6T21atXw8vLC+bm5vD09MTy5csfWE/lVa7KOyjx8fGwsbHB9u3b4eXlBWtra/Tu3RtXr17VW68m+2gsDD5mZ9euXcjJycEbb7xRpW3RokUwMjJCWFiY3ocKVjI2NkZCQgLGjRsHrVYLKysrREREYNasWQ15CESNWkOPtWiMLpi/ZugSDCumwNAVNAhjY2PMmTMHr732GiZMmIDmzZsbuqQHunz5Mn7++Wf4+flJy4qLi9GhQwdMnToVKpUKmzdvxrBhw9CqVSt07twZV69exZAhQzB//ny8+OKLuHnzJg4cOCB90vW6deswc+ZM/Pvf/0b79u1x7NgxjB49WnpvrI7bt29jwYIF+O9//wsjIyMMHToUkydPxrp16+psH4Zg8LDTq1evB34kubm5OWJjYxEbG/vA9d3c3LBly5b6Ko+IiJ4gL774Inx9ffH+++9jzZo1D+z31yDk5ub20I8sqQtTp07FjBkzUF5ejuLiYvj5+eHTTz+V2ps1a4bJkydL82+99Ra2b9+Ob7/9Vgo7d+/exaBBg+Dm5gYA8PHxkfq///77WLhwIQYNGgQA8PDwQEZGBj777LNqB5GysjKsXLkSrVq1AgCMHz9e7wJCXezDEAwedoiIiOrSxx9/jO7du+sFh786cOAAmjRpIs0rlcp6r2vKlCkYMWIEhBC4dOkSpk2bhr59+2L//v0wNjZGeXk55syZg2+//RaXL19GaWkpSkpKYGlpCQBo164devToAR8fH4SGhqJXr1546aWXYGtri1u3buH8+fMYOXIkRo8eLe3z7t27Nbr1ZmlpKQUdAHB2dpbGxdbVPgyBYYeIiGSla9euCA0NRXR0tPT01F95eHg0+OPWTZs2RevWrQEAbdq0weLFi6HVarF3716EhITgk08+wZIlS7B48WL4+PjAysoKUVFRKC0tBXDvNt3OnTtx6NAh7NixA8uWLcP06dORkpIiBaJVq1bp3RqrXK+6/hr6FAqFdPelqKioTvZhCAw7REQkO/PmzYOvry+efvppQ5fyQJUB4c6dOwCAgwcPYsCAARg6dCiAew/wnDlzRu/pYoVCgYCAAAQEBGDmzJlwc3PDxo0bMWnSJLi4uODXX39FeHh4vdTr5ORU7/uoLww7REQkOz4+PggPD8fSpUvv256Xl4fi4mK9Zfb29jW6nZWdnY3jx4/rLWvTpg2srKzu2//mzZvQ6XTSbax3330XDg4O6NKli7Tu999/j0OHDsHW1haffvopcnNzpbCTkpKC3bt3o1evXnB0dERKSgquXbsGLy8vAMAHH3yACRMmQK1Wo3fv3igpKcGRI0dw48YNvQ/SfRwNsY/6wLBDRESP9CR+ovGsWbPwzTff3Lftfld8Kr9kurru9+Z+4MABBAYG3rf/zJkzMXPmTACAg4MDOnXqhB07dsDe3h4AMGPGDPz6668IDQ2FpaUlxowZg4EDB6Kg4N7TdCqVCvv378fixYtRWFgINzc3LFy4EH369AEAjBo1CpaWlvjkk08wZcoUWFlZwcfHB1FRUdU+pkdpiH3Uh0b1reeGwm89Jznjo+d89Lwmj57zW8+psZHVt54TERER1QeGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIqK/geDgYL1POnZ3d8fixYsfa5t1sY2GwK+LICKiR4tRN/D+qv+pzwAwYsQI5OfnY9OmTdL8559/DgAwMTGBnZ0d2rZtiyFDhmDEiBEwMqr6t35oaCh27dqF5ORkdOrUqcr2K7f313W2bdsGADhx4gT+9a9/ITk5GYWFhdBoNPDz88OyZcvg6Oh437qDg4Oxb98+AICZmRlatmyJ8ePH45///GeNjr82UlNTH/g9Xn8VHx+PqKgo5Ofn13obhsQrO0REJEu9e/fG1atXceHCBWzduhXdunXD22+/jX79+uHu3bt6fXNycnDo0CGMHz8ea9eufej2/jx99dVXAIBr166hR48esLOzw/bt25GZmYm4uDi4uLjg1q1bD61z9OjRuHr1KjIyMvDKK68gMjJS2u5flZaW1uKVuD8HBwdYWloafBsNgWGHiIhkyczMDBqNBs2aNcNzzz2HadOm4ccff8TWrVsRHx+v1zcuLg79+vXDuHHj8NVXX+HOnTsP3N6fJ1tbWwDAwYMHUVBQgNWrV6N9+/bw8PBAt27dsGjRInh4eDy0TktLS2g0GrRs2RIxMTFo06YNfvrpJwD3rvyMHz8eUVFRaNq0KUJDQwEAp06dQp8+fWBtbQ0nJycMGzYMv//+u7TNW7duYfjw4bC2toazszMWLlxYZb9/vQWVn5+PN998E05OTjA3N8ezzz6LhIQEJCYm4vXXX0dBQQEUCgUUCgViYmLuu42cnBwMGDAA1tbWUKlUeOWVV5Cbmyu1x8TEwNfXF//973/h7u4OtVqNV199FTdv3nzoa/S4GHaIiOhvo3v37mjXrh02bNggLRNCIC4uDkOHDoWnpydat26N77//vkbb1Wg0uHv3LjZu3IjH/X5tCwsLvSs4n3/+OUxNTXHw4EGsXLkS+fn56N69O9q3b48jR45g27ZtyM3NxSuvvCKtM2XKFOzbtw8//vgjduzYgcTERBw9evSB+6yoqECfPn1w8OBBfPnll8jIyMC8efNgbGyMLl26YPHixVCpVNIVrcmTJ993GwMGDMD169exb98+7Ny5E7/++isGDx6s1+/8+fPYtGkTEhISkJCQgH379mHevHmP9Zo9CsfsEBHR34qnpydOnjwpze/atQu3b9+WrpoMHToUa9aswbBhw/TWS0hIgLW1td6yadOmYdq0afD398e0adPw2muvYezYsejcuTO6d++O4cOHw8nJqVp1lZeX46uvvsLJkycxZswYaXmbNm0wf/58aX727Nlo37495syZIy1bu3YtXF1dcebMGbi4uGDNmjX48ssv0aNHDwD3AlPz5s0fuO9du3bh8OHDyMzMxFNPPQUAaNmypdSuVquhUCig0WgeuI3du3cjPT0d2dnZcHV1BQB88cUXeOaZZ5CamiqNg6qoqEB8fDyaNGkCABg2bBh2796Njz76qFqvU23wyg4REf2tCCGgUCik+bVr12Lw4MEwMbn39/+QIUNw8OBBnD9/Xm+9bt264fjx43rT2LFjpfaPPvoIOp0OK1euxDPPPIOVK1fC09MT6enpD61n+fLlsLa2hoWFBUaPHo2JEydi3LhxUnuHDh30+p84cQJ79+6FtbW1NHl6egK4d9Xk/PnzKC0thZ+fn7SOnZ0dnn766QfWcPz4cTRv3lwKOrWRmZkJV1dXKegAgLe3N2xsbJCZmSktc3d3l4IOADg7OyMvL6/W+60OXtmpZ+7vbTZ0CQZ3wfw1Q5dgWDV8qoSI6ldmZqY0jub69evYuHEjysrKsGLFCqlPeXk51q5dq3e1wcrKCq1bt37otu3t7fHyyy/j5Zdfxpw5c9C+fXssWLDgvk9yVQoPD8f06dNhYWEBZ2fnKk+K/fVpp6KiIvTv3x8ff/xxlW05Ozvj3LlzD63xfiwsLGq8Tm0plUq9eYVCgYqKinrdJ6/sEBHR38aePXuQnp6OsLAwAMC6devQvHlznDhxQu+KzcKFCxEfH4/y8vJa78vU1BStWrV65NNYarUarVu3RrNmze77SPxfPffcczh9+jTc3d3RunVrvcnKygqtWrWCUqlESkqKtM6NGzdw5syZB26zbdu2+O233x7Yx9TU9JGvhZeXFy5duoRLly5JyzIyMpCfnw9vb+9HHld9YtghIiJZKikpgU6nw+XLl3H06FHMmTMHAwYMQL9+/TB8+HAAwJo1a/DSSy/h2Wef1ZtGjhyJ33//XfoMnT9v789T5RNQCQkJGDp0KBISEnDmzBlkZWVhwYIF2LJlCwYMGFCnxxUZGYnr169jyJAhSE1Nxfnz57F9+3a8/vrrKC8vh7W1NUaOHIkpU6Zgz549OHXq1AM/W6hSUFAQunbtirCwMOzcuRPZ2dnYunWrdPzu7u4oKirC7t278fvvv+P27dtVthESEgIfHx+Eh4fj6NGjOHz4MIYPH46goCB07NixTl+DmmLYISIiWdq2bRucnZ3h7u6O3r17Y+/evVi6dCl+/PFHGBsbIy0tDSdOnJCu8vyZWq1Gjx49sGbNmirb+/MUGBgI4N7YFEtLS7zzzjvw9fWFv78/vv32W6xevbrKQOfH5eLigoMHD6K8vBy9evWCj48PoqKiYGNjIwWaTz75BP/4xz/Qv39/hISEIDAwsMrYn7/64Ycf0KlTJwwZMgTe3t549913pas5Xbp0wdixYzF48GA4ODjoDZiupFAo8OOPP8LW1hZdu3ZFSEgIWrZsiW+++aZOj782FOJxn5GTgcLCQqjVahQUFEClUtXptjlmh2N2DD1mh+cgz8GanIPFxcXIzs6Gh4cHzM3N67Eooup52DlZ3fdvXtkhIiIiWWPYISIiIllj2CEiIiJZY9ghIiIiWWPYISIiIllj2CEioir4oC41FnVxLjLsEBGRxNjYGAD0vnWbyJAqP8Dwr18zURP8biwiIpKYmJjA0tIS165dg1KprNbXFxDVByEEbt++jby8PNjY2EhBvDYYdoiISKJQKODs7Izs7GxcvHjR0OUQwcbGBhqN5rG2wbBDRER6TE1N0aZNG97KIoNTKpWPdUWnEsMOERFVYWRkxK+LINngzVgiIiKSNYYdIiIikjWGHSIiIpI1g4edy5cvY+jQobC3t4eFhQV8fHxw5MgRqV0IgZkzZ8LZ2RkWFhYICQnB2bNn9bZx/fp1hIeHQ6VSwcbGBiNHjkRRUVFDHwoRERE1QgYNOzdu3EBAQACUSiW2bt2KjIwMLFy4ELa2tlKf+fPnY+nSpVi5ciVSUlJgZWWF0NBQFBcXS33Cw8Nx+vRp7Ny5EwkJCdi/fz/GjBljiEMiIiKiRsagT2N9/PHHcHV1RVxcnLTMw8ND+rcQAosXL8aMGTMwYMAAAMAXX3wBJycnbNq0Ca+++ioyMzOxbds2pKamomPHjgCAZcuW4fnnn8eCBQvg4uLSsAdFREREjYpBr+z89NNP6NixI15++WU4Ojqiffv2WLVqldSenZ0NnU6HkJAQaZlarYafnx+SkpIAAElJSbCxsZGCDgCEhITAyMgIKSkp991vSUkJCgsL9SYiIiKSJ4OGnV9//RUrVqxAmzZtsH37dowbNw4TJkzA559/DgDQ6XQAACcnJ731nJycpDadTgdHR0e9dhMTE9jZ2Ul9/mru3LlQq9XS5OrqWteHRkRERI2EQcNORUUFnnvuOcyZMwft27fHmDFjMHr0aKxcubJe9xsdHY2CggJpunTpUr3uj4iIiAzHoGHH2dkZ3t7eesu8vLyQk5MDANJ3YeTm5ur1yc3Nldo0Gg3y8vL02u/evYvr168/8Ls0zMzMoFKp9CYiIiKSJ4OGnYCAAGRlZektO3PmDNzc3ADcG6ys0Wiwe/duqb2wsBApKSnQarUAAK1Wi/z8fKSlpUl99uzZg4qKCvj5+TXAURAREVFjZtCnsSZOnIguXbpgzpw5eOWVV3D48GH85z//wX/+8x8A9759NyoqCrNnz0abNm3g4eGBf/3rX3BxccHAgQMB3LsS1Lt3b+n2V1lZGcaPH49XX32VT2IRERGRYcNOp06dsHHjRkRHR2PWrFnw8PDA4sWLER4eLvV59913cevWLYwZMwb5+fkIDAzEtm3b9L6gbt26dRg/fjx69OgBIyMjhIWFYenSpYY4JCIiImpkFEIIYegiDK2wsBBqtRoFBQV1Pn7H/b3Ndbq9J9EF89cMXYJhxRQYdPc8B3kOGvocJKov1X3/NvjXRRARERHVJ4YdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYYdIiIikjWGHSIiIpI1hh0iIiKSNYOGnZiYGCgUCr3J09NTai8uLkZkZCTs7e1hbW2NsLAw5Obm6m0jJycHffv2haWlJRwdHTFlyhTcvXu3oQ+FiIiIGikTQxfwzDPPYNeuXdK8icn/lzRx4kRs3rwZ3333HdRqNcaPH49Bgwbh4MGDAIDy8nL07dsXGo0Ghw4dwtWrVzF8+HAolUrMmTOnwY+FiIiIGh+Dhx0TExNoNJoqywsKCrBmzRqsX78e3bt3BwDExcXBy8sLycnJ8Pf3x44dO5CRkYFdu3bByckJvr6++PDDDzF16lTExMTA1NS0oQ+HiIiIGhmDj9k5e/YsXFxc0LJlS4SHhyMnJwcAkJaWhrKyMoSEhEh9PT090aJFCyQlJQEAkpKS4OPjAycnJ6lPaGgoCgsLcfr06Qfus6SkBIWFhXoTERERyZNBw46fnx/i4+Oxbds2rFixAtnZ2fjHP/6BmzdvQqfTwdTUFDY2NnrrODk5QafTAQB0Op1e0Klsr2x7kLlz50KtVkuTq6tr3R4YERERNRoGvY3Vp08f6d9t27aFn58f3Nzc8O2338LCwqLe9hsdHY1JkyZJ84WFhQw8REREMmXw21h/ZmNjg6eeegrnzp2DRqNBaWkp8vPz9frk5uZKY3w0Gk2Vp7Mq5+83DqiSmZkZVCqV3kRERETy1KjCTlFREc6fPw9nZ2d06NABSqUSu3fvltqzsrKQk5MDrVYLANBqtUhPT0deXp7UZ+fOnVCpVPD29m7w+omIiKjxMehtrMmTJ6N///5wc3PDlStX8P7778PY2BhDhgyBWq3GyJEjMWnSJNjZ2UGlUuGtt96CVquFv78/AKBXr17w9vbGsGHDMH/+fOh0OsyYMQORkZEwMzMz5KERERFRI2HQsPPbb79hyJAh+OOPP+Dg4IDAwEAkJyfDwcEBALBo0SIYGRkhLCwMJSUlCA0NxfLly6X1jY2NkZCQgHHjxkGr1cLKygoRERGYNWuWoQ6JiIiIGhmDhp2vv/76oe3m5uaIjY1FbGzsA/u4ublhy5YtdV0aERERyUSjGrNDREREVNcYdoiIiEjWGHaIiIhI1hh2iIiISNYYdoiIiEjWDP6t50REJG/u7202dAkGd8H8NUOXYFgxBQbdPa/sEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrJnUdIX8/Hxs3LgRBw4cwMWLF3H79m04ODigffv2CA0NRZcuXeqjTiIiIqJaqfaVnStXrmDUqFFwdnbG7NmzcefOHfj6+qJHjx5o3rw59u7di549e8Lb2xvffPNNfdZMREREVG3VvrLTvn17REREIC0tDd7e3vftc+fOHWzatAmLFy/GpUuXMHny5DorlIiIiKg2qh12MjIyYG9v/9A+FhYWGDJkCIYMGYI//vjjsYsjIiIielzVvo1lb2+PkpKSam/4UcGIiIiIqCHUaICyWq2GVqtFt27d0K1bN/j7+0OpVNZXbURERESPrUaPnq9cuRJubm5Yu3YtgoKCYGNjg549e2Lu3LlITk5GeXl5fdVJREREVCs1CjsjRoxAfHw8Lly4gHPnzmHZsmVwcXHBypUrERAQAFtbW/Tt27e+aiUiIiKqsRp/zk6lli1bomXLlnjjjTeQnZ2NNWvWYNmyZdi2bVtd1kdERET0WGoVdnJycrB3714kJiYiMTERv//+O/z9/TF58mQEBQXVdY1EREREtVajsPPGG28gMTER169fR0BAAP7xj39gzJgx6NSpE0xMan2RiIiIiKje1CihxMfHo0WLFpg+fTp69OiB9u3bQ6FQ1FdtRERERI+tRmEnMzNTun21cOFClJSUIDAwEEFBQQgODsZzzz0HIyN+tygRERE1HjVKJk8//TTGjh2Lr7/+GjqdDgcPHsTzzz+Pw4cPo1+/frCzs0O/fv3qq1YiIiKiGnusgTbe3t6wt7eHra0tbG1t8fXXX2Pr1q11VRsRERHRY6tx2MnLy0NiYqJ0O+vMmTMwNTVF586dMXHiRHTr1q0+6iQiIiKqlRrdxvLy8oKzszOGDRuG9PR0vPTSS9ixYwdu3LiBffv2ISYmptaPns+bNw8KhQJRUVHSsuLiYkRGRsLe3h7W1tYICwtDbm6u3no5OTno27cvLC0t4ejoiClTpuDu3bu1qoGIiIjkp0ZXdgYOHIhu3bohMDAQlpaWdVZEamoqPvvsM7Rt21Zv+cSJE7F582Z89913UKvVGD9+PAYNGoSDBw8CAMrLy9G3b19oNBocOnQIV69exfDhw6FUKjFnzpw6q4+IiIieXDW6sjN37lz06tWrToNOUVERwsPDsWrVKtja2krLCwoKsGbNGnz66afo3r07OnTogLi4OBw6dAjJyckAgB07diAjIwNffvklfH190adPH3z44YeIjY1FaWlpndVIRERET64aXdmZNWtWtfrNnDmz2tuMjIxE3759ERISgtmzZ0vL09LSUFZWhpCQEGmZp6cnWrRogaSkJPj7+yMpKQk+Pj5wcnKS+oSGhmLcuHE4ffo02rdvf999lpSUoKSkRJovLCysdr1ERET0ZKlR2ImJiYGLiwscHR0hhLhvH4VCUe2w8/XXX+Po0aNITU2t0qbT6WBqagobGxu95U5OTtDpdFKfPwedyvbKtgeZO3cuPvjgg2rVSERERE+2GoWdPn36YM+ePejYsSPeeOMN9OvXr9YfInjp0iW8/fbb2LlzJ8zNzWu1jdqKjo7GpEmTpPnCwkK4uro2aA1ERETUMGqUVDZv3ozz58/Dz88PU6ZMQbNmzTB16lRkZWXVeMdpaWnIy8vDc889BxMTE5iYmGDfvn1YunQpTExM4OTkhNLSUuTn5+utl5ubC41GAwDQaDRVns6qnK/scz9mZmZQqVR6ExEREclTjS/LuLi4IDo6GllZWfjmm2+Ql5eHTp06ISAgAHfu3Kn2dnr06IH09HQcP35cmjp27Ijw8HDp30qlErt375bWycrKQk5ODrRaLQBAq9UiPT0deXl5Up+dO3dCpVLB29u7podGREREMvRYn6DcqVMnXLhwARkZGTh27BjKyspgYWFRrXWbNGmCZ599Vm+ZlZUV7O3tpeUjR47EpEmTYGdnB5VKhbfeegtarRb+/v4AgF69esHb2xvDhg3D/PnzodPpMGPGDERGRsLMzOxxDo2IiIhkolYDbpKSkjB69GhoNBosW7YMERERuHLlSp3fDlq0aBH69euHsLAwdO3aFRqNBhs2bJDajY2NkZCQAGNjY2i1WgwdOhTDhw+v9lNjREREJH81urIzf/58xMfH4/fff0d4eDgOHDhQ5YMAH0diYqLevLm5OWJjYxEbG/vAddzc3LBly5Y6q4GIiIjkpUZh57333kOLFi3wyiuvQKFQID4+/r79Pv3007qojYiIiOix1SjsdO3aFQqFAqdPn35gH4VC8dhFEREREdWVGoWdv95mIiIiImrsaveJgERERERPiGqHnXnz5uH27dvV6puSkoLNmzfXuigiIiKiulLtsJORkQE3Nzf885//xNatW3Ht2jWp7e7duzh58iSWL1+OLl26YPDgwWjSpEm9FExERERUE9Ues/PFF1/gxIkT+Pe//43XXnsNhYWFMDY2hpmZmXTFp3379hg1ahRGjBjR4N93RURERHQ/NRqg3K5dO6xatQqfffYZTp48iYsXL+LOnTto2rQpfH190bRp0/qqk4iIiKhWavV1EUZGRvD19YWvr28dl0NERERUt/g0FhEREckaww4RERHJGsMOERERyRrDDhEREclajcNOWVkZTExMcOrUqfqoh4iIiKhO1TjsKJVKtGjRAuXl5fVRDxEREVGdqtVtrOnTp2PatGm4fv16XddDREREVKdq9Tk7//73v3Hu3Dm4uLjAzc0NVlZWeu1Hjx6tk+KIiIiIHletws7AgQPruAwiIiKi+lGrsPP+++/XdR1ERERE9aLWj57n5+dj9erViI6OlsbuHD16FJcvX66z4oiIiIgeV62u7Jw8eRIhISFQq9W4cOECRo8eDTs7O2zYsAE5OTn44osv6rpOIiIiolqp1ZWdSZMmYcSIETh79izMzc2l5c8//zz2799fZ8URERERPa5ahZ3U1FS8+eabVZY3a9YMOp3usYsiIiIiqiu1CjtmZmYoLCyssvzMmTNwcHB47KKIiIiI6kqtws4LL7yAWbNmoaysDACgUCiQk5ODqVOnIiwsrE4LJCIiInoctQo7CxcuRFFRERwdHXHnzh0EBQWhdevWaNKkCT766KO6rpGIiIio1mr1NJZarcbOnTvxv//9DydPnkRRURGee+45hISE1HV9RERERI+lVmGnuLgY5ubmCAwMRGBgYF3XRERERFRnahV2bGxs0LlzZwQFBaFbt27QarWwsLCo69qIiIiIHlutxuzs2rULvXv3RkpKCl544QXY2toiMDAQ06dPx86dO+u6RiIiIqJaq1XYCQwMxLRp07Bjxw7k5+dj7969aN26NebPn4/evXvXdY1EREREtVar21jAvc/USUxMlKaSkhL069cPwcHBdVgeERER0eOpVdhp1qwZ7ty5g+DgYAQHB2Pq1Klo27YtFApFXddHRERE9FhqdRvLwcEBt2/fhk6ng06nQ25uLu7cuVPXtRERERE9tlqFnePHj0On0+G9995DSUkJpk2bhqZNm6JLly6YPn16XddIREREVGu1HrNjY2ODF154AQEBAejSpQt+/PFHfPXVV0hJSeGnKBMREVGjUauws2HDBmlgckZGBuzs7BAYGIiFCxciKCiormskIiIiqrVahZ2xY8eia9eu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",
"text/plain": [
""
]
},
- "metadata": {
- "filenames": {
- "image/png": "C:\\Users\\dkgun\\src\\dangunter\\examples\\idaes_examples\\notebooks\\_build\\jupyter_execute\\active\\power_gen\\ngcc\\ngcc_doc_14_1.png"
- }
- },
+ "metadata": {},
"output_type": "display_data"
}
],
@@ -3115,6 +2882,7 @@
},
{
"cell_type": "markdown",
+ "id": "6f43d5d6",
"metadata": {},
"source": [
"## Run turndown cases 5 MW interval\n",
@@ -3127,6 +2895,7 @@
{
"cell_type": "code",
"execution_count": 9,
+ "id": "cd410c4b",
"metadata": {},
"outputs": [],
"source": [
@@ -3186,13 +2955,6 @@
" plt.title(\"Net Power vs. Efficiency\")\n",
" plt.show()"
]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
}
],
"metadata": {
@@ -3211,9 +2973,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.11.5"
+ "version": "3.10.13"
}
},
"nbformat": 4,
- "nbformat_minor": 3
+ "nbformat_minor": 5
}
diff --git a/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc_doc.ipynb b/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc_doc.ipynb
new file mode 100644
index 00000000..4f2059d4
--- /dev/null
+++ b/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc_doc.ipynb
@@ -0,0 +1,2964 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "tags": [
+ "header",
+ "hide-cell"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "###############################################################################\n",
+ "# The Institute for the Design of Advanced Energy Systems Integrated Platform\n",
+ "# Framework (IDAES IP) was produced under the DOE Institute for the\n",
+ "# Design of Advanced Energy Systems (IDAES).\n",
+ "#\n",
+ "# Copyright (c) 2018-2023 by the software owners: The Regents of the\n",
+ "# University of California, through Lawrence Berkeley National Laboratory,\n",
+ "# National Technology & Engineering Solutions of Sandia, LLC, Carnegie Mellon\n",
+ "# University, West Virginia University Research Corporation, et al.\n",
+ "# All rights reserved. Please see the files COPYRIGHT.md and LICENSE.md\n",
+ "# for full copyright and license information.\n",
+ "###############################################################################"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# NGCC Baseline and Turndown\n",
+ "Maintainer: Javal Vyas \n",
+ "Author: John Eslick \n",
+ "Updated: 2024-07-25 \n",
+ "\n",
+ "This notebook runs a series of net electric power outputs from 650 MW to 160 MW (about 100% to 25%) for an NGCC with 97% CO2 capture. The NGCC model is based on the NETL report \"Cost and Performance Baseline for Fossil Energy Plants Volume 1, Bituminous Coal and Natural Gas to Electricity.\" Sept 2019, Case B31B [resource](https://www.osti.gov/servlets/purl/1893822). Another valuable resource for gaining a deeper understanding of the mathematical model would be the publication referenced [here](https://www.sciencedirect.com/science/article/pii/S1750583617302414). "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Imports\n",
+ "\n",
+ "Import the modules that will be used."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "from IPython.core.display import SVG\n",
+ "import pyomo.environ as pyo\n",
+ "import idaes\n",
+ "from idaes.core.solvers import use_idaes_solver_configuration_defaults\n",
+ "import idaes.core.util.scaling as iscale\n",
+ "import idaes.core.util as iutil\n",
+ "from idaes_examples.mod.power_gen import ngcc\n",
+ "import idaes.logger as idaeslog\n",
+ "import pytest\n",
+ "import logging\n",
+ "\n",
+ "logging.getLogger(\"pyomo\").setLevel(logging.ERROR)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Make Output Directories\n",
+ "\n",
+ "This notebook can produce a large number of output files. To make it easier to manage, some subdirectories are used to organize output. This ensures that the directories exist."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def make_directory(path):\n",
+ " \"\"\"Make a directory if it doesn't exist\"\"\"\n",
+ " try:\n",
+ " os.mkdir(path)\n",
+ " except FileExistsError:\n",
+ " pass\n",
+ "\n",
+ "\n",
+ "make_directory(\"data\")\n",
+ "make_directory(\"data_pfds\")\n",
+ "make_directory(\"data_tabulated\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Global Solver Settings\n",
+ "\n",
+ "Use the IDAES configuration system for solver settings. These will apply to all Ipopt instances created, including the ones created in initialization methods."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "use_idaes_solver_configuration_defaults()\n",
+ "idaes.cfg.ipopt.options.nlp_scaling_method = \"user-scaling\"\n",
+ "idaes.cfg.ipopt.options.linear_solver = \"ma57\"\n",
+ "idaes.cfg.ipopt.options.OF_ma57_automatic_scaling = \"yes\"\n",
+ "idaes.cfg.ipopt.options.ma57_pivtol = 1e-5\n",
+ "idaes.cfg.ipopt.options.ma57_pivtolmax = 0.1\n",
+ "solver = pyo.SolverFactory(\"ipopt\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Create the NGCC model\n",
+ "\n",
+ "Create the NGCC model and initialize it or read the saved initialization if available. The base initialized NGCC model is configured to match the baseline report with 90% capture using a Cansolv system."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "2024-07-25 03:12:25 [INFO] idaes.init.fs: NGCC load initial from ngcc_init.json.gz\n",
+ "Ipopt 3.13.2: nlp_scaling_method=user-scaling\n",
+ "tol=1e-06\n",
+ "max_iter=200\n",
+ "linear_solver=ma57\n",
+ "ma57_pivtol=1e-05\n",
+ "ma57_pivtolmax=0.1\n",
+ "option_file_name=C:\\Users\\javal\\AppData\\Local\\Temp\\tmpa9m4gkwo_ipopt.opt\n",
+ "\n",
+ "Using option file \"C:\\Users\\javal\\AppData\\Local\\Temp\\tmpa9m4gkwo_ipopt.opt\".\n",
+ "\n",
+ "\n",
+ "******************************************************************************\n",
+ "This program contains Ipopt, a library for large-scale nonlinear optimization.\n",
+ " Ipopt is released as open source code under the Eclipse Public License (EPL).\n",
+ " For more information visit http://projects.coin-or.org/Ipopt\n",
+ "\n",
+ "This version of Ipopt was compiled from source code available at\n",
+ " https://github.com/IDAES/Ipopt as part of the Institute for the Design of\n",
+ " Advanced Energy Systems Process Systems Engineering Framework (IDAES PSE\n",
+ " Framework) Copyright (c) 2018-2019. See https://github.com/IDAES/idaes-pse.\n",
+ "\n",
+ "This version of Ipopt was compiled using HSL, a collection of Fortran codes\n",
+ " for large-scale scientific computation. All technical papers, sales and\n",
+ " publicity material resulting from use of the HSL codes within IPOPT must\n",
+ " contain the following acknowledgement:\n",
+ " HSL, a collection of Fortran codes for large-scale scientific\n",
+ " computation. See http://www.hsl.rl.ac.uk.\n",
+ "******************************************************************************\n",
+ "\n",
+ "This is Ipopt version 3.13.2, running with linear solver ma57.\n",
+ "\n",
+ "Number of nonzeros in equality constraint Jacobian...: 7661\n",
+ "Number of nonzeros in inequality constraint Jacobian.: 0\n",
+ "Number of nonzeros in Lagrangian Hessian.............: 5948\n",
+ "\n",
+ "Total number of variables............................: 2404\n",
+ " variables with only lower bounds: 87\n",
+ " variables with lower and upper bounds: 1447\n",
+ " variables with only upper bounds: 0\n",
+ "Total number of equality constraints.................: 2404\n",
+ "Total number of inequality constraints...............: 0\n",
+ " inequality constraints with only lower bounds: 0\n",
+ " inequality constraints with lower and upper bounds: 0\n",
+ " inequality constraints with only upper bounds: 0\n",
+ "\n",
+ "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n",
+ " 0 0.0000000e+00 3.50e+01 1.00e+00 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0\n",
+ "Reallocating memory for MA57: lfact (111709)\n",
+ " 1 0.0000000e+00 3.49e-01 1.12e+04 -1.0 3.06e+03 - 9.90e-01 9.90e-01h 1\n",
+ " 2 0.0000000e+00 3.15e-03 5.15e+02 -1.0 3.02e+03 - 9.89e-01 9.91e-01h 1\n",
+ " 3 0.0000000e+00 2.95e-07 9.98e+02 -1.0 3.74e+01 - 9.90e-01 1.00e+00h 1\n",
+ "\n",
+ "Number of Iterations....: 3\n",
+ "\n",
+ " (scaled) (unscaled)\n",
+ "Objective...............: 0.0000000000000000e+00 0.0000000000000000e+00\n",
+ "Dual infeasibility......: 0.0000000000000000e+00 0.0000000000000000e+00\n",
+ "Constraint violation....: 2.9462398742907681e-07 2.9462398742907681e-07\n",
+ "Complementarity.........: 0.0000000000000000e+00 0.0000000000000000e+00\n",
+ "Overall NLP error.......: 2.9462398742907681e-07 2.9462398742907681e-07\n",
+ "\n",
+ "\n",
+ "Number of objective function evaluations = 4\n",
+ "Number of objective gradient evaluations = 4\n",
+ "Number of equality constraint evaluations = 4\n",
+ "Number of inequality constraint evaluations = 0\n",
+ "Number of equality constraint Jacobian evaluations = 4\n",
+ "Number of inequality constraint Jacobian evaluations = 0\n",
+ "Number of Lagrangian Hessian evaluations = 3\n",
+ "Total CPU secs in IPOPT (w/o function evaluations) = 0.085\n",
+ "Total CPU secs in NLP function evaluations = 1.396\n",
+ "\n",
+ "EXIT: Optimal Solution Found.\n"
+ ]
+ }
+ ],
+ "source": [
+ "m = pyo.ConcreteModel()\n",
+ "m.fs = ngcc.NgccFlowsheet(dynamic=False)\n",
+ "iscale.calculate_scaling_factors(m)\n",
+ "m.fs.initialize(\n",
+ " load_from='ngcc_init.json.gz',\n",
+ " save_to='ngcc_init.json.gz',\n",
+ " outlvl=idaeslog.INFO_HIGH,\n",
+ ")\n",
+ "res = solver.solve(m, tee=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Show PFDs with baseline results\n",
+ "\n",
+ "This displays PFDs in the notebook, and saves them to files. The full NGCC model is too big to show well in a single PFD, so it is broken into the three main sections, gas turbine, heat recovery steam generator (HRSG), and steam turbine."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "\n",
+ "Gas Turbine Section\n",
+ "\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "\n",
+ "HRSG Section\n",
+ "\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "\n",
+ "Steam Turbine Section\n",
+ "\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def display_pfd():\n",
+ " print(\"\\n\\nGas Turbine Section\\n\")\n",
+ " display(SVG(m.fs.gt.write_pfd()))\n",
+ " print(\"\\n\\nHRSG Section\\n\")\n",
+ " display(SVG(m.fs.hrsg.write_pfd()))\n",
+ " print(\"\\n\\nSteam Turbine Section\\n\")\n",
+ " display(SVG(m.fs.st.write_pfd()))\n",
+ "\n",
+ "\n",
+ "display_pfd()\n",
+ "\n",
+ "m.fs.gt.write_pfd(fname=\"data_pfds/gt_baseline.svg\")\n",
+ "m.fs.hrsg.write_pfd(fname=\"data_pfds/hrsg_baseline.svg\")\n",
+ "m.fs.st.write_pfd(fname=\"data_pfds/st_baseline.svg\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Test key model outputs against NETL baseline"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Assert results approximately agree with baseline reoprt\n",
+ "assert pyo.value(m.fs.net_power_mw[0]) == pytest.approx(646)\n",
+ "assert pyo.value(m.fs.gross_power[0]) == pytest.approx(-690e6, rel=0.001)\n",
+ "assert pyo.value(100 * m.fs.lhv_efficiency[0]) == pytest.approx(52.8, abs=0.1)\n",
+ "assert pyo.value(\n",
+ " m.fs.total_variable_cost_rate[0] / m.fs.net_power_mw[0]\n",
+ ") == pytest.approx(37.2799, rel=0.01)\n",
+ "assert pyo.value(m.fs.fuel_cost_rate[0] / m.fs.net_power_mw[0]) == pytest.approx(\n",
+ " 31.6462, rel=0.01\n",
+ ")\n",
+ "assert pyo.value(\n",
+ " m.fs.other_variable_cost_rate[0] / m.fs.net_power_mw[0]\n",
+ ") == pytest.approx(5.63373, rel=0.01)\n",
+ "assert pyo.value(m.fs.gt.gt_power[0]) == pytest.approx(-477e6, rel=0.001)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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XnsNhYWFMDY2hpmZmXTFp3379hg1ahRGjBjR4N93RURERHQ/NRqg3K5dO6xatQqfffYZTp48iYsXL+LOnTto2rQpfH190bRp0/qqk4iIiKhWavV1EUZGRvD19YWvr28dl0NERERUt/g0FhEREckaww4RERHJGsMOERERyRrDDhEREclajcNOWVkZTExMcOrUqfqoh4iIiKhO1TjsKJVKtGjRAuXl5fVRDxEREVGdqtVtrOnTp2PatGm4fv16XddDREREVKdq9Tk7//73v3Hu3Dm4uLjAzc0NVlZWeu1Hjx6tk+KIiIiIHletws7AgQPruAwiIiKi+lGrsPP+++/XdR1ERERE9aLWj57n5+dj9erViI6OlsbuHD16FJcvX66z4oiIiIgeV62u7Jw8eRIhISFQq9W4cOECRo8eDTs7O2zYsAE5OTn44osv6rpOIiIiolqp1ZWdSZMmYcSIETh79izMzc2l5c8//zz2799fZ8URERERPa5ahZ3U1FS8+eabVZY3a9YMOp3usYsiIiIiqiu1CjtmZmYoLCyssvzMmTNwcHB47KKIiIiI6kqtws4LL7yAWbNmoaysDACgUCiQk5ODqVOnIiwsrE4LJCIiInoctQo7CxcuRFFRERwdHXHnzh0EBQWhdevWaNKkCT766KO6rpGIiIio1mr1NJZarcbOnTvxv//9DydPnkRRURGee+45hISE1HV9RERERI+lVmGnuLgY5ubmCAwMRGBgYF3XRERERFRnahV2bGxs0LlzZwQFBaFbt27QarWwsLCo69qIiIiIHlutxuzs2rULvXv3RkpKCl544QXY2toiMDAQ06dPx86dO+u6RiIiIqJaq1XYCQwMxLRp07Bjxw7k5+dj7969aN26NebPn4/evXvXdY1EREREtVar21jAvc/USUxMlKaSkhL069cPwcHBdVgeERER0eOpVdhp1qwZ7ty5g+DgYAQHB2Pq1Klo27YtFApFXddHRERE9FhqdRvLwcEBt2/fhk6ng06nQ25uLu7cuVPXtRERERE9tlqFnePHj0On0+G9995DSUkJpk2bhqZNm6JLly6YPn16XddIREREVGu1HrNjY2ODF154AQEBAejSpQt+/PFHfPXVV0hJSeGnKBMREVGjUauws2HDBmlgckZGBuzs7BAYGIiFCxciKCiormskIiIiqrVahZ2xY8eia9eu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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from matplotlib import pyplot as plt\n",
+ "\n",
+ "\n",
+ "variables = [\"net_power\", \"gross_power\", \"gt_power\"]\n",
+ "netl_baseline = [646, 690, 477]\n",
+ "idaes_prediction = [\n",
+ " pyo.value(m.fs.net_power_mw[0]),\n",
+ " -pyo.value(m.fs.gross_power[0]) * 1e-6,\n",
+ " -pyo.value(m.fs.gt.gt_power[0]) * 1e-6,\n",
+ "]\n",
+ "\n",
+ "label_location = np.arange(len(variables))\n",
+ "\n",
+ "width = 0.4\n",
+ "\n",
+ "fig, ax = plt.subplots()\n",
+ "netl_data = ax.bar(variables, netl_baseline, label=\"NETL Baseline\")\n",
+ "idaes_sim = ax.bar(\n",
+ " label_location + (width / 2), idaes_prediction, width, label=\"IDAES Prediction\"\n",
+ ")\n",
+ "\n",
+ "ax.set_ylabel(\"Power (MW)\")\n",
+ "ax.set_xticks(label_location)\n",
+ "ax.set_xticklabels(variables)\n",
+ "ax.legend()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Run turndown cases 5 MW interval\n",
+ "\n",
+ "Here we set the CO2 capture rate to 97% and set the specific reboiler duty to PZ advanced solvent system. The minimum power is 160 MW net, which corresponds to a bit under 25%. This is roughly the minimum load for the NGCC modeled. Results are tabulated for tags in the tags_output tag group in a Pandas data frame. \n",
+ "\n",
+ "To run the series, change run_series to True. Running the turndown series takes a while, unless previous saved results are available. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "run_series = False\n",
+ "if run_series:\n",
+ " idaes.cfg.ipopt.options.tol = 1e-6\n",
+ " idaes.cfg.ipopt.options.max_iter = 50\n",
+ " solver = pyo.SolverFactory(\"ipopt\")\n",
+ "\n",
+ " m.fs.cap_specific_reboiler_duty.fix(2.4e6)\n",
+ " m.fs.cap_fraction.fix(0.97)\n",
+ " powers = np.linspace(650, 160, int((650 - 160) / 5) + 1)\n",
+ " powers = list(powers)\n",
+ " powers.insert(1, 646)\n",
+ "\n",
+ " df = pd.DataFrame(columns=m.fs.tags_output.table_heading())\n",
+ "\n",
+ " for p in powers:\n",
+ " print(\"Simulation for net power = \", p)\n",
+ " fname = f\"data/ngcc_{int(p)}.json.gz\"\n",
+ " if os.path.exists(fname):\n",
+ " iutil.from_json(m, fname=fname, wts=iutil.StoreSpec(suffix=False))\n",
+ " else:\n",
+ " m.fs.net_power_mw.fix(p)\n",
+ " res = solver.solve(m, tee=False, symbolic_solver_labels=True)\n",
+ " if not pyo.check_optimal_termination(res):\n",
+ " break\n",
+ " iutil.to_json(m, fname=fname)\n",
+ " df.loc[m.fs.tags_output[\"net_power\"].value] = m.fs.tags_output.table_row(\n",
+ " numeric=True\n",
+ " )\n",
+ " if abs(p - 650) < 0.1:\n",
+ " m.fs.gt.streams_dataframe().to_csv(\n",
+ " \"data_tabulated/ngcc_stream_650mw_gt.csv\"\n",
+ " )\n",
+ " m.fs.st.steam_streams_dataframe().to_csv(\n",
+ " \"data_tabulated/ngcc_stream_650mw_st.csv\"\n",
+ " )\n",
+ " m.fs.hrsg.steam_streams_dataframe().to_csv(\n",
+ " \"data_tabulated/ngcc_stream_650mw_hrsg_steam.csv\"\n",
+ " )\n",
+ " m.fs.hrsg.flue_gas_streams_dataframe().to_csv(\n",
+ " \"data_tabulated/ngcc_stream_650mw_hrsg_gas.csv\"\n",
+ " )\n",
+ " df.to_csv(\"data_tabulated/ngcc.csv\")\n",
+ "\n",
+ " # Display the results from the run stored in a pandas dataframe\n",
+ " pd.set_option(\"display.max_rows\", None)\n",
+ " pd.set_option(\"display.max_columns\", None)\n",
+ " display(df)\n",
+ "\n",
+ " # Plot results\n",
+ " plt.plot(df[\"net_power (MW)\"], df[\"lhv_efficiency (%)\"])\n",
+ " plt.grid()\n",
+ " plt.xlabel(\"Net Power (MW)\")\n",
+ " plt.ylabel(\"LHV Efficiency (%)\")\n",
+ " plt.title(\"Net Power vs. Efficiency\")\n",
+ " plt.show()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.13"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 3
+}
diff --git a/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc_init.json.gz b/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc_init.json.gz
new file mode 100644
index 00000000..e64b3e72
Binary files /dev/null and b/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc_init.json.gz differ
diff --git a/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc_test.ipynb b/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc_test.ipynb
new file mode 100644
index 00000000..4f2059d4
--- /dev/null
+++ b/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc_test.ipynb
@@ -0,0 +1,2964 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "tags": [
+ "header",
+ "hide-cell"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "###############################################################################\n",
+ "# The Institute for the Design of Advanced Energy Systems Integrated Platform\n",
+ "# Framework (IDAES IP) was produced under the DOE Institute for the\n",
+ "# Design of Advanced Energy Systems (IDAES).\n",
+ "#\n",
+ "# Copyright (c) 2018-2023 by the software owners: The Regents of the\n",
+ "# University of California, through Lawrence Berkeley National Laboratory,\n",
+ "# National Technology & Engineering Solutions of Sandia, LLC, Carnegie Mellon\n",
+ "# University, West Virginia University Research Corporation, et al.\n",
+ "# All rights reserved. Please see the files COPYRIGHT.md and LICENSE.md\n",
+ "# for full copyright and license information.\n",
+ "###############################################################################"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# NGCC Baseline and Turndown\n",
+ "Maintainer: Javal Vyas \n",
+ "Author: John Eslick \n",
+ "Updated: 2024-07-25 \n",
+ "\n",
+ "This notebook runs a series of net electric power outputs from 650 MW to 160 MW (about 100% to 25%) for an NGCC with 97% CO2 capture. The NGCC model is based on the NETL report \"Cost and Performance Baseline for Fossil Energy Plants Volume 1, Bituminous Coal and Natural Gas to Electricity.\" Sept 2019, Case B31B [resource](https://www.osti.gov/servlets/purl/1893822). Another valuable resource for gaining a deeper understanding of the mathematical model would be the publication referenced [here](https://www.sciencedirect.com/science/article/pii/S1750583617302414). "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Imports\n",
+ "\n",
+ "Import the modules that will be used."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "from IPython.core.display import SVG\n",
+ "import pyomo.environ as pyo\n",
+ "import idaes\n",
+ "from idaes.core.solvers import use_idaes_solver_configuration_defaults\n",
+ "import idaes.core.util.scaling as iscale\n",
+ "import idaes.core.util as iutil\n",
+ "from idaes_examples.mod.power_gen import ngcc\n",
+ "import idaes.logger as idaeslog\n",
+ "import pytest\n",
+ "import logging\n",
+ "\n",
+ "logging.getLogger(\"pyomo\").setLevel(logging.ERROR)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Make Output Directories\n",
+ "\n",
+ "This notebook can produce a large number of output files. To make it easier to manage, some subdirectories are used to organize output. This ensures that the directories exist."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def make_directory(path):\n",
+ " \"\"\"Make a directory if it doesn't exist\"\"\"\n",
+ " try:\n",
+ " os.mkdir(path)\n",
+ " except FileExistsError:\n",
+ " pass\n",
+ "\n",
+ "\n",
+ "make_directory(\"data\")\n",
+ "make_directory(\"data_pfds\")\n",
+ "make_directory(\"data_tabulated\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Global Solver Settings\n",
+ "\n",
+ "Use the IDAES configuration system for solver settings. These will apply to all Ipopt instances created, including the ones created in initialization methods."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "use_idaes_solver_configuration_defaults()\n",
+ "idaes.cfg.ipopt.options.nlp_scaling_method = \"user-scaling\"\n",
+ "idaes.cfg.ipopt.options.linear_solver = \"ma57\"\n",
+ "idaes.cfg.ipopt.options.OF_ma57_automatic_scaling = \"yes\"\n",
+ "idaes.cfg.ipopt.options.ma57_pivtol = 1e-5\n",
+ "idaes.cfg.ipopt.options.ma57_pivtolmax = 0.1\n",
+ "solver = pyo.SolverFactory(\"ipopt\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Create the NGCC model\n",
+ "\n",
+ "Create the NGCC model and initialize it or read the saved initialization if available. The base initialized NGCC model is configured to match the baseline report with 90% capture using a Cansolv system."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "2024-07-25 03:12:25 [INFO] idaes.init.fs: NGCC load initial from ngcc_init.json.gz\n",
+ "Ipopt 3.13.2: nlp_scaling_method=user-scaling\n",
+ "tol=1e-06\n",
+ "max_iter=200\n",
+ "linear_solver=ma57\n",
+ "ma57_pivtol=1e-05\n",
+ "ma57_pivtolmax=0.1\n",
+ "option_file_name=C:\\Users\\javal\\AppData\\Local\\Temp\\tmpa9m4gkwo_ipopt.opt\n",
+ "\n",
+ "Using option file \"C:\\Users\\javal\\AppData\\Local\\Temp\\tmpa9m4gkwo_ipopt.opt\".\n",
+ "\n",
+ "\n",
+ "******************************************************************************\n",
+ "This program contains Ipopt, a library for large-scale nonlinear optimization.\n",
+ " Ipopt is released as open source code under the Eclipse Public License (EPL).\n",
+ " For more information visit http://projects.coin-or.org/Ipopt\n",
+ "\n",
+ "This version of Ipopt was compiled from source code available at\n",
+ " https://github.com/IDAES/Ipopt as part of the Institute for the Design of\n",
+ " Advanced Energy Systems Process Systems Engineering Framework (IDAES PSE\n",
+ " Framework) Copyright (c) 2018-2019. See https://github.com/IDAES/idaes-pse.\n",
+ "\n",
+ "This version of Ipopt was compiled using HSL, a collection of Fortran codes\n",
+ " for large-scale scientific computation. All technical papers, sales and\n",
+ " publicity material resulting from use of the HSL codes within IPOPT must\n",
+ " contain the following acknowledgement:\n",
+ " HSL, a collection of Fortran codes for large-scale scientific\n",
+ " computation. See http://www.hsl.rl.ac.uk.\n",
+ "******************************************************************************\n",
+ "\n",
+ "This is Ipopt version 3.13.2, running with linear solver ma57.\n",
+ "\n",
+ "Number of nonzeros in equality constraint Jacobian...: 7661\n",
+ "Number of nonzeros in inequality constraint Jacobian.: 0\n",
+ "Number of nonzeros in Lagrangian Hessian.............: 5948\n",
+ "\n",
+ "Total number of variables............................: 2404\n",
+ " variables with only lower bounds: 87\n",
+ " variables with lower and upper bounds: 1447\n",
+ " variables with only upper bounds: 0\n",
+ "Total number of equality constraints.................: 2404\n",
+ "Total number of inequality constraints...............: 0\n",
+ " inequality constraints with only lower bounds: 0\n",
+ " inequality constraints with lower and upper bounds: 0\n",
+ " inequality constraints with only upper bounds: 0\n",
+ "\n",
+ "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n",
+ " 0 0.0000000e+00 3.50e+01 1.00e+00 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0\n",
+ "Reallocating memory for MA57: lfact (111709)\n",
+ " 1 0.0000000e+00 3.49e-01 1.12e+04 -1.0 3.06e+03 - 9.90e-01 9.90e-01h 1\n",
+ " 2 0.0000000e+00 3.15e-03 5.15e+02 -1.0 3.02e+03 - 9.89e-01 9.91e-01h 1\n",
+ " 3 0.0000000e+00 2.95e-07 9.98e+02 -1.0 3.74e+01 - 9.90e-01 1.00e+00h 1\n",
+ "\n",
+ "Number of Iterations....: 3\n",
+ "\n",
+ " (scaled) (unscaled)\n",
+ "Objective...............: 0.0000000000000000e+00 0.0000000000000000e+00\n",
+ "Dual infeasibility......: 0.0000000000000000e+00 0.0000000000000000e+00\n",
+ "Constraint violation....: 2.9462398742907681e-07 2.9462398742907681e-07\n",
+ "Complementarity.........: 0.0000000000000000e+00 0.0000000000000000e+00\n",
+ "Overall NLP error.......: 2.9462398742907681e-07 2.9462398742907681e-07\n",
+ "\n",
+ "\n",
+ "Number of objective function evaluations = 4\n",
+ "Number of objective gradient evaluations = 4\n",
+ "Number of equality constraint evaluations = 4\n",
+ "Number of inequality constraint evaluations = 0\n",
+ "Number of equality constraint Jacobian evaluations = 4\n",
+ "Number of inequality constraint Jacobian evaluations = 0\n",
+ "Number of Lagrangian Hessian evaluations = 3\n",
+ "Total CPU secs in IPOPT (w/o function evaluations) = 0.085\n",
+ "Total CPU secs in NLP function evaluations = 1.396\n",
+ "\n",
+ "EXIT: Optimal Solution Found.\n"
+ ]
+ }
+ ],
+ "source": [
+ "m = pyo.ConcreteModel()\n",
+ "m.fs = ngcc.NgccFlowsheet(dynamic=False)\n",
+ "iscale.calculate_scaling_factors(m)\n",
+ "m.fs.initialize(\n",
+ " load_from='ngcc_init.json.gz',\n",
+ " save_to='ngcc_init.json.gz',\n",
+ " outlvl=idaeslog.INFO_HIGH,\n",
+ ")\n",
+ "res = solver.solve(m, tee=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Show PFDs with baseline results\n",
+ "\n",
+ "This displays PFDs in the notebook, and saves them to files. The full NGCC model is too big to show well in a single PFD, so it is broken into the three main sections, gas turbine, heat recovery steam generator (HRSG), and steam turbine."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "\n",
+ "Gas Turbine Section\n",
+ "\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "\n",
+ "HRSG Section\n",
+ "\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "\n",
+ "Steam Turbine Section\n",
+ "\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def display_pfd():\n",
+ " print(\"\\n\\nGas Turbine Section\\n\")\n",
+ " display(SVG(m.fs.gt.write_pfd()))\n",
+ " print(\"\\n\\nHRSG Section\\n\")\n",
+ " display(SVG(m.fs.hrsg.write_pfd()))\n",
+ " print(\"\\n\\nSteam Turbine Section\\n\")\n",
+ " display(SVG(m.fs.st.write_pfd()))\n",
+ "\n",
+ "\n",
+ "display_pfd()\n",
+ "\n",
+ "m.fs.gt.write_pfd(fname=\"data_pfds/gt_baseline.svg\")\n",
+ "m.fs.hrsg.write_pfd(fname=\"data_pfds/hrsg_baseline.svg\")\n",
+ "m.fs.st.write_pfd(fname=\"data_pfds/st_baseline.svg\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Test key model outputs against NETL baseline"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Assert results approximately agree with baseline reoprt\n",
+ "assert pyo.value(m.fs.net_power_mw[0]) == pytest.approx(646)\n",
+ "assert pyo.value(m.fs.gross_power[0]) == pytest.approx(-690e6, rel=0.001)\n",
+ "assert pyo.value(100 * m.fs.lhv_efficiency[0]) == pytest.approx(52.8, abs=0.1)\n",
+ "assert pyo.value(\n",
+ " m.fs.total_variable_cost_rate[0] / m.fs.net_power_mw[0]\n",
+ ") == pytest.approx(37.2799, rel=0.01)\n",
+ "assert pyo.value(m.fs.fuel_cost_rate[0] / m.fs.net_power_mw[0]) == pytest.approx(\n",
+ " 31.6462, rel=0.01\n",
+ ")\n",
+ "assert pyo.value(\n",
+ " m.fs.other_variable_cost_rate[0] / m.fs.net_power_mw[0]\n",
+ ") == pytest.approx(5.63373, rel=0.01)\n",
+ "assert pyo.value(m.fs.gt.gt_power[0]) == pytest.approx(-477e6, rel=0.001)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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XnsNhYWFMDY2hpmZmXTFp3379hg1ahRGjBjR4N93RURERHQ/NRqg3K5dO6xatQqfffYZTp48iYsXL+LOnTto2rQpfH190bRp0/qqk4iIiKhWavV1EUZGRvD19YWvr28dl0NERERUt/g0FhEREckaww4RERHJGsMOERERyRrDDhEREclajcNOWVkZTExMcOrUqfqoh4iIiKhO1TjsKJVKtGjRAuXl5fVRDxEREVGdqtVtrOnTp2PatGm4fv16XddDREREVKdq9Tk7//73v3Hu3Dm4uLjAzc0NVlZWeu1Hjx6tk+KIiIiIHletws7AgQPruAwiIiKi+lGrsPP+++/XdR1ERERE9aLWj57n5+dj9erViI6OlsbuHD16FJcvX66z4oiIiIgeV62u7Jw8eRIhISFQq9W4cOECRo8eDTs7O2zYsAE5OTn44osv6rpOIiIiolqp1ZWdSZMmYcSIETh79izMzc2l5c8//zz2799fZ8URERERPa5ahZ3U1FS8+eabVZY3a9YMOp3usYsiIiIiqiu1CjtmZmYoLCyssvzMmTNwcHB47KKIiIiI6kqtws4LL7yAWbNmoaysDACgUCiQk5ODqVOnIiwsrE4LJCIiInoctQo7CxcuRFFRERwdHXHnzh0EBQWhdevWaNKkCT766KO6rpGIiIio1mr1NJZarcbOnTvxv//9DydPnkRRURGee+45hISE1HV9RERERI+lVmGnuLgY5ubmCAwMRGBgYF3XRERERFRnahV2bGxs0LlzZwQFBaFbt27QarWwsLCo69qIiIiIHlutxuzs2rULvXv3RkpKCl544QXY2toiMDAQ06dPx86dO+u6RiIiIqJaq1XYCQwMxLRp07Bjxw7k5+dj7969aN26NebPn4/evXvXdY1EREREtVar21jAvc/USUxMlKaSkhL069cPwcHBdVgeERER0eOpVdhp1qwZ7ty5g+DgYAQHB2Pq1Klo27YtFApFXddHRERE9FhqdRvLwcEBt2/fhk6ng06nQ25uLu7cuVPXtRERERE9tlqFnePHj0On0+G9995DSUkJpk2bhqZNm6JLly6YPn16XddIREREVGu1HrNjY2ODF154AQEBAejSpQt+/PFHfPXVV0hJSeGnKBMREVGjUauws2HDBmlgckZGBuzs7BAYGIiFCxciKCiormskIiIiqrVahZ2xY8eia9eu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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from matplotlib import pyplot as plt\n",
+ "\n",
+ "\n",
+ "variables = [\"net_power\", \"gross_power\", \"gt_power\"]\n",
+ "netl_baseline = [646, 690, 477]\n",
+ "idaes_prediction = [\n",
+ " pyo.value(m.fs.net_power_mw[0]),\n",
+ " -pyo.value(m.fs.gross_power[0]) * 1e-6,\n",
+ " -pyo.value(m.fs.gt.gt_power[0]) * 1e-6,\n",
+ "]\n",
+ "\n",
+ "label_location = np.arange(len(variables))\n",
+ "\n",
+ "width = 0.4\n",
+ "\n",
+ "fig, ax = plt.subplots()\n",
+ "netl_data = ax.bar(variables, netl_baseline, label=\"NETL Baseline\")\n",
+ "idaes_sim = ax.bar(\n",
+ " label_location + (width / 2), idaes_prediction, width, label=\"IDAES Prediction\"\n",
+ ")\n",
+ "\n",
+ "ax.set_ylabel(\"Power (MW)\")\n",
+ "ax.set_xticks(label_location)\n",
+ "ax.set_xticklabels(variables)\n",
+ "ax.legend()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Run turndown cases 5 MW interval\n",
+ "\n",
+ "Here we set the CO2 capture rate to 97% and set the specific reboiler duty to PZ advanced solvent system. The minimum power is 160 MW net, which corresponds to a bit under 25%. This is roughly the minimum load for the NGCC modeled. Results are tabulated for tags in the tags_output tag group in a Pandas data frame. \n",
+ "\n",
+ "To run the series, change run_series to True. Running the turndown series takes a while, unless previous saved results are available. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "run_series = False\n",
+ "if run_series:\n",
+ " idaes.cfg.ipopt.options.tol = 1e-6\n",
+ " idaes.cfg.ipopt.options.max_iter = 50\n",
+ " solver = pyo.SolverFactory(\"ipopt\")\n",
+ "\n",
+ " m.fs.cap_specific_reboiler_duty.fix(2.4e6)\n",
+ " m.fs.cap_fraction.fix(0.97)\n",
+ " powers = np.linspace(650, 160, int((650 - 160) / 5) + 1)\n",
+ " powers = list(powers)\n",
+ " powers.insert(1, 646)\n",
+ "\n",
+ " df = pd.DataFrame(columns=m.fs.tags_output.table_heading())\n",
+ "\n",
+ " for p in powers:\n",
+ " print(\"Simulation for net power = \", p)\n",
+ " fname = f\"data/ngcc_{int(p)}.json.gz\"\n",
+ " if os.path.exists(fname):\n",
+ " iutil.from_json(m, fname=fname, wts=iutil.StoreSpec(suffix=False))\n",
+ " else:\n",
+ " m.fs.net_power_mw.fix(p)\n",
+ " res = solver.solve(m, tee=False, symbolic_solver_labels=True)\n",
+ " if not pyo.check_optimal_termination(res):\n",
+ " break\n",
+ " iutil.to_json(m, fname=fname)\n",
+ " df.loc[m.fs.tags_output[\"net_power\"].value] = m.fs.tags_output.table_row(\n",
+ " numeric=True\n",
+ " )\n",
+ " if abs(p - 650) < 0.1:\n",
+ " m.fs.gt.streams_dataframe().to_csv(\n",
+ " \"data_tabulated/ngcc_stream_650mw_gt.csv\"\n",
+ " )\n",
+ " m.fs.st.steam_streams_dataframe().to_csv(\n",
+ " \"data_tabulated/ngcc_stream_650mw_st.csv\"\n",
+ " )\n",
+ " m.fs.hrsg.steam_streams_dataframe().to_csv(\n",
+ " \"data_tabulated/ngcc_stream_650mw_hrsg_steam.csv\"\n",
+ " )\n",
+ " m.fs.hrsg.flue_gas_streams_dataframe().to_csv(\n",
+ " \"data_tabulated/ngcc_stream_650mw_hrsg_gas.csv\"\n",
+ " )\n",
+ " df.to_csv(\"data_tabulated/ngcc.csv\")\n",
+ "\n",
+ " # Display the results from the run stored in a pandas dataframe\n",
+ " pd.set_option(\"display.max_rows\", None)\n",
+ " pd.set_option(\"display.max_columns\", None)\n",
+ " display(df)\n",
+ "\n",
+ " # Plot results\n",
+ " plt.plot(df[\"net_power (MW)\"], df[\"lhv_efficiency (%)\"])\n",
+ " plt.grid()\n",
+ " plt.xlabel(\"Net Power (MW)\")\n",
+ " plt.ylabel(\"LHV Efficiency (%)\")\n",
+ " plt.title(\"Net Power vs. Efficiency\")\n",
+ " plt.show()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.13"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 3
+}
diff --git a/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc_usr.ipynb b/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc_usr.ipynb
new file mode 100644
index 00000000..4f2059d4
--- /dev/null
+++ b/idaes_examples/notebooks/docs/power_gen/ngcc/ngcc_usr.ipynb
@@ -0,0 +1,2964 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "tags": [
+ "header",
+ "hide-cell"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "###############################################################################\n",
+ "# The Institute for the Design of Advanced Energy Systems Integrated Platform\n",
+ "# Framework (IDAES IP) was produced under the DOE Institute for the\n",
+ "# Design of Advanced Energy Systems (IDAES).\n",
+ "#\n",
+ "# Copyright (c) 2018-2023 by the software owners: The Regents of the\n",
+ "# University of California, through Lawrence Berkeley National Laboratory,\n",
+ "# National Technology & Engineering Solutions of Sandia, LLC, Carnegie Mellon\n",
+ "# University, West Virginia University Research Corporation, et al.\n",
+ "# All rights reserved. Please see the files COPYRIGHT.md and LICENSE.md\n",
+ "# for full copyright and license information.\n",
+ "###############################################################################"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# NGCC Baseline and Turndown\n",
+ "Maintainer: Javal Vyas \n",
+ "Author: John Eslick \n",
+ "Updated: 2024-07-25 \n",
+ "\n",
+ "This notebook runs a series of net electric power outputs from 650 MW to 160 MW (about 100% to 25%) for an NGCC with 97% CO2 capture. The NGCC model is based on the NETL report \"Cost and Performance Baseline for Fossil Energy Plants Volume 1, Bituminous Coal and Natural Gas to Electricity.\" Sept 2019, Case B31B [resource](https://www.osti.gov/servlets/purl/1893822). Another valuable resource for gaining a deeper understanding of the mathematical model would be the publication referenced [here](https://www.sciencedirect.com/science/article/pii/S1750583617302414). "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Imports\n",
+ "\n",
+ "Import the modules that will be used."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "from IPython.core.display import SVG\n",
+ "import pyomo.environ as pyo\n",
+ "import idaes\n",
+ "from idaes.core.solvers import use_idaes_solver_configuration_defaults\n",
+ "import idaes.core.util.scaling as iscale\n",
+ "import idaes.core.util as iutil\n",
+ "from idaes_examples.mod.power_gen import ngcc\n",
+ "import idaes.logger as idaeslog\n",
+ "import pytest\n",
+ "import logging\n",
+ "\n",
+ "logging.getLogger(\"pyomo\").setLevel(logging.ERROR)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Make Output Directories\n",
+ "\n",
+ "This notebook can produce a large number of output files. To make it easier to manage, some subdirectories are used to organize output. This ensures that the directories exist."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def make_directory(path):\n",
+ " \"\"\"Make a directory if it doesn't exist\"\"\"\n",
+ " try:\n",
+ " os.mkdir(path)\n",
+ " except FileExistsError:\n",
+ " pass\n",
+ "\n",
+ "\n",
+ "make_directory(\"data\")\n",
+ "make_directory(\"data_pfds\")\n",
+ "make_directory(\"data_tabulated\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Global Solver Settings\n",
+ "\n",
+ "Use the IDAES configuration system for solver settings. These will apply to all Ipopt instances created, including the ones created in initialization methods."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "use_idaes_solver_configuration_defaults()\n",
+ "idaes.cfg.ipopt.options.nlp_scaling_method = \"user-scaling\"\n",
+ "idaes.cfg.ipopt.options.linear_solver = \"ma57\"\n",
+ "idaes.cfg.ipopt.options.OF_ma57_automatic_scaling = \"yes\"\n",
+ "idaes.cfg.ipopt.options.ma57_pivtol = 1e-5\n",
+ "idaes.cfg.ipopt.options.ma57_pivtolmax = 0.1\n",
+ "solver = pyo.SolverFactory(\"ipopt\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Create the NGCC model\n",
+ "\n",
+ "Create the NGCC model and initialize it or read the saved initialization if available. The base initialized NGCC model is configured to match the baseline report with 90% capture using a Cansolv system."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "2024-07-25 03:12:25 [INFO] idaes.init.fs: NGCC load initial from ngcc_init.json.gz\n",
+ "Ipopt 3.13.2: nlp_scaling_method=user-scaling\n",
+ "tol=1e-06\n",
+ "max_iter=200\n",
+ "linear_solver=ma57\n",
+ "ma57_pivtol=1e-05\n",
+ "ma57_pivtolmax=0.1\n",
+ "option_file_name=C:\\Users\\javal\\AppData\\Local\\Temp\\tmpa9m4gkwo_ipopt.opt\n",
+ "\n",
+ "Using option file \"C:\\Users\\javal\\AppData\\Local\\Temp\\tmpa9m4gkwo_ipopt.opt\".\n",
+ "\n",
+ "\n",
+ "******************************************************************************\n",
+ "This program contains Ipopt, a library for large-scale nonlinear optimization.\n",
+ " Ipopt is released as open source code under the Eclipse Public License (EPL).\n",
+ " For more information visit http://projects.coin-or.org/Ipopt\n",
+ "\n",
+ "This version of Ipopt was compiled from source code available at\n",
+ " https://github.com/IDAES/Ipopt as part of the Institute for the Design of\n",
+ " Advanced Energy Systems Process Systems Engineering Framework (IDAES PSE\n",
+ " Framework) Copyright (c) 2018-2019. See https://github.com/IDAES/idaes-pse.\n",
+ "\n",
+ "This version of Ipopt was compiled using HSL, a collection of Fortran codes\n",
+ " for large-scale scientific computation. All technical papers, sales and\n",
+ " publicity material resulting from use of the HSL codes within IPOPT must\n",
+ " contain the following acknowledgement:\n",
+ " HSL, a collection of Fortran codes for large-scale scientific\n",
+ " computation. See http://www.hsl.rl.ac.uk.\n",
+ "******************************************************************************\n",
+ "\n",
+ "This is Ipopt version 3.13.2, running with linear solver ma57.\n",
+ "\n",
+ "Number of nonzeros in equality constraint Jacobian...: 7661\n",
+ "Number of nonzeros in inequality constraint Jacobian.: 0\n",
+ "Number of nonzeros in Lagrangian Hessian.............: 5948\n",
+ "\n",
+ "Total number of variables............................: 2404\n",
+ " variables with only lower bounds: 87\n",
+ " variables with lower and upper bounds: 1447\n",
+ " variables with only upper bounds: 0\n",
+ "Total number of equality constraints.................: 2404\n",
+ "Total number of inequality constraints...............: 0\n",
+ " inequality constraints with only lower bounds: 0\n",
+ " inequality constraints with lower and upper bounds: 0\n",
+ " inequality constraints with only upper bounds: 0\n",
+ "\n",
+ "iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls\n",
+ " 0 0.0000000e+00 3.50e+01 1.00e+00 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0\n",
+ "Reallocating memory for MA57: lfact (111709)\n",
+ " 1 0.0000000e+00 3.49e-01 1.12e+04 -1.0 3.06e+03 - 9.90e-01 9.90e-01h 1\n",
+ " 2 0.0000000e+00 3.15e-03 5.15e+02 -1.0 3.02e+03 - 9.89e-01 9.91e-01h 1\n",
+ " 3 0.0000000e+00 2.95e-07 9.98e+02 -1.0 3.74e+01 - 9.90e-01 1.00e+00h 1\n",
+ "\n",
+ "Number of Iterations....: 3\n",
+ "\n",
+ " (scaled) (unscaled)\n",
+ "Objective...............: 0.0000000000000000e+00 0.0000000000000000e+00\n",
+ "Dual infeasibility......: 0.0000000000000000e+00 0.0000000000000000e+00\n",
+ "Constraint violation....: 2.9462398742907681e-07 2.9462398742907681e-07\n",
+ "Complementarity.........: 0.0000000000000000e+00 0.0000000000000000e+00\n",
+ "Overall NLP error.......: 2.9462398742907681e-07 2.9462398742907681e-07\n",
+ "\n",
+ "\n",
+ "Number of objective function evaluations = 4\n",
+ "Number of objective gradient evaluations = 4\n",
+ "Number of equality constraint evaluations = 4\n",
+ "Number of inequality constraint evaluations = 0\n",
+ "Number of equality constraint Jacobian evaluations = 4\n",
+ "Number of inequality constraint Jacobian evaluations = 0\n",
+ "Number of Lagrangian Hessian evaluations = 3\n",
+ "Total CPU secs in IPOPT (w/o function evaluations) = 0.085\n",
+ "Total CPU secs in NLP function evaluations = 1.396\n",
+ "\n",
+ "EXIT: Optimal Solution Found.\n"
+ ]
+ }
+ ],
+ "source": [
+ "m = pyo.ConcreteModel()\n",
+ "m.fs = ngcc.NgccFlowsheet(dynamic=False)\n",
+ "iscale.calculate_scaling_factors(m)\n",
+ "m.fs.initialize(\n",
+ " load_from='ngcc_init.json.gz',\n",
+ " save_to='ngcc_init.json.gz',\n",
+ " outlvl=idaeslog.INFO_HIGH,\n",
+ ")\n",
+ "res = solver.solve(m, tee=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Show PFDs with baseline results\n",
+ "\n",
+ "This displays PFDs in the notebook, and saves them to files. The full NGCC model is too big to show well in a single PFD, so it is broken into the three main sections, gas turbine, heat recovery steam generator (HRSG), and steam turbine."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "\n",
+ "Gas Turbine Section\n",
+ "\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "\n",
+ "HRSG Section\n",
+ "\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "\n",
+ "Steam Turbine Section\n",
+ "\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": [
+ ""
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def display_pfd():\n",
+ " print(\"\\n\\nGas Turbine Section\\n\")\n",
+ " display(SVG(m.fs.gt.write_pfd()))\n",
+ " print(\"\\n\\nHRSG Section\\n\")\n",
+ " display(SVG(m.fs.hrsg.write_pfd()))\n",
+ " print(\"\\n\\nSteam Turbine Section\\n\")\n",
+ " display(SVG(m.fs.st.write_pfd()))\n",
+ "\n",
+ "\n",
+ "display_pfd()\n",
+ "\n",
+ "m.fs.gt.write_pfd(fname=\"data_pfds/gt_baseline.svg\")\n",
+ "m.fs.hrsg.write_pfd(fname=\"data_pfds/hrsg_baseline.svg\")\n",
+ "m.fs.st.write_pfd(fname=\"data_pfds/st_baseline.svg\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Test key model outputs against NETL baseline"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Assert results approximately agree with baseline reoprt\n",
+ "assert pyo.value(m.fs.net_power_mw[0]) == pytest.approx(646)\n",
+ "assert pyo.value(m.fs.gross_power[0]) == pytest.approx(-690e6, rel=0.001)\n",
+ "assert pyo.value(100 * m.fs.lhv_efficiency[0]) == pytest.approx(52.8, abs=0.1)\n",
+ "assert pyo.value(\n",
+ " m.fs.total_variable_cost_rate[0] / m.fs.net_power_mw[0]\n",
+ ") == pytest.approx(37.2799, rel=0.01)\n",
+ "assert pyo.value(m.fs.fuel_cost_rate[0] / m.fs.net_power_mw[0]) == pytest.approx(\n",
+ " 31.6462, rel=0.01\n",
+ ")\n",
+ "assert pyo.value(\n",
+ " m.fs.other_variable_cost_rate[0] / m.fs.net_power_mw[0]\n",
+ ") == pytest.approx(5.63373, rel=0.01)\n",
+ "assert pyo.value(m.fs.gt.gt_power[0]) == pytest.approx(-477e6, rel=0.001)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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XnsNhYWFMDY2hpmZmXTFp3379hg1ahRGjBjR4N93RURERHQ/NRqg3K5dO6xatQqfffYZTp48iYsXL+LOnTto2rQpfH190bRp0/qqk4iIiKhWavV1EUZGRvD19YWvr28dl0NERERUt/g0FhEREckaww4RERHJGsMOERERyRrDDhEREclajcNOWVkZTExMcOrUqfqoh4iIiKhO1TjsKJVKtGjRAuXl5fVRDxEREVGdqtVtrOnTp2PatGm4fv16XddDREREVKdq9Tk7//73v3Hu3Dm4uLjAzc0NVlZWeu1Hjx6tk+KIiIiIHletws7AgQPruAwiIiKi+lGrsPP+++/XdR1ERERE9aLWj57n5+dj9erViI6OlsbuHD16FJcvX66z4oiIiIgeV62u7Jw8eRIhISFQq9W4cOECRo8eDTs7O2zYsAE5OTn44osv6rpOIiIiolqp1ZWdSZMmYcSIETh79izMzc2l5c8//zz2799fZ8URERERPa5ahZ3U1FS8+eabVZY3a9YMOp3usYsiIiIiqiu1CjtmZmYoLCyssvzMmTNwcHB47KKIiIiI6kqtws4LL7yAWbNmoaysDACgUCiQk5ODqVOnIiwsrE4LJCIiInoctQo7CxcuRFFRERwdHXHnzh0EBQWhdevWaNKkCT766KO6rpGIiIio1mr1NJZarcbOnTvxv//9DydPnkRRURGee+45hISE1HV9RERERI+lVmGnuLgY5ubmCAwMRGBgYF3XRERERFRnahV2bGxs0LlzZwQFBaFbt27QarWwsLCo69qIiIiIHlutxuzs2rULvXv3RkpKCl544QXY2toiMDAQ06dPx86dO+u6RiIiIqJaq1XYCQwMxLRp07Bjxw7k5+dj7969aN26NebPn4/evXvXdY1EREREtVar21jAvc/USUxMlKaSkhL069cPwcHBdVgeERER0eOpVdhp1qwZ7ty5g+DgYAQHB2Pq1Klo27YtFApFXddHRERE9FhqdRvLwcEBt2/fhk6ng06nQ25uLu7cuVPXtRERERE9tlqFnePHj0On0+G9995DSUkJpk2bhqZNm6JLly6YPn16XddIREREVGu1HrNjY2ODF154AQEBAejSpQt+/PFHfPXVV0hJSeGnKBMREVGjUauws2HDBmlgckZGBuzs7BAYGIiFCxciKCiormskIiIiqrVahZ2xY8eia9eu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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from matplotlib import pyplot as plt\n",
+ "\n",
+ "\n",
+ "variables = [\"net_power\", \"gross_power\", \"gt_power\"]\n",
+ "netl_baseline = [646, 690, 477]\n",
+ "idaes_prediction = [\n",
+ " pyo.value(m.fs.net_power_mw[0]),\n",
+ " -pyo.value(m.fs.gross_power[0]) * 1e-6,\n",
+ " -pyo.value(m.fs.gt.gt_power[0]) * 1e-6,\n",
+ "]\n",
+ "\n",
+ "label_location = np.arange(len(variables))\n",
+ "\n",
+ "width = 0.4\n",
+ "\n",
+ "fig, ax = plt.subplots()\n",
+ "netl_data = ax.bar(variables, netl_baseline, label=\"NETL Baseline\")\n",
+ "idaes_sim = ax.bar(\n",
+ " label_location + (width / 2), idaes_prediction, width, label=\"IDAES Prediction\"\n",
+ ")\n",
+ "\n",
+ "ax.set_ylabel(\"Power (MW)\")\n",
+ "ax.set_xticks(label_location)\n",
+ "ax.set_xticklabels(variables)\n",
+ "ax.legend()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Run turndown cases 5 MW interval\n",
+ "\n",
+ "Here we set the CO2 capture rate to 97% and set the specific reboiler duty to PZ advanced solvent system. The minimum power is 160 MW net, which corresponds to a bit under 25%. This is roughly the minimum load for the NGCC modeled. Results are tabulated for tags in the tags_output tag group in a Pandas data frame. \n",
+ "\n",
+ "To run the series, change run_series to True. Running the turndown series takes a while, unless previous saved results are available. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "run_series = False\n",
+ "if run_series:\n",
+ " idaes.cfg.ipopt.options.tol = 1e-6\n",
+ " idaes.cfg.ipopt.options.max_iter = 50\n",
+ " solver = pyo.SolverFactory(\"ipopt\")\n",
+ "\n",
+ " m.fs.cap_specific_reboiler_duty.fix(2.4e6)\n",
+ " m.fs.cap_fraction.fix(0.97)\n",
+ " powers = np.linspace(650, 160, int((650 - 160) / 5) + 1)\n",
+ " powers = list(powers)\n",
+ " powers.insert(1, 646)\n",
+ "\n",
+ " df = pd.DataFrame(columns=m.fs.tags_output.table_heading())\n",
+ "\n",
+ " for p in powers:\n",
+ " print(\"Simulation for net power = \", p)\n",
+ " fname = f\"data/ngcc_{int(p)}.json.gz\"\n",
+ " if os.path.exists(fname):\n",
+ " iutil.from_json(m, fname=fname, wts=iutil.StoreSpec(suffix=False))\n",
+ " else:\n",
+ " m.fs.net_power_mw.fix(p)\n",
+ " res = solver.solve(m, tee=False, symbolic_solver_labels=True)\n",
+ " if not pyo.check_optimal_termination(res):\n",
+ " break\n",
+ " iutil.to_json(m, fname=fname)\n",
+ " df.loc[m.fs.tags_output[\"net_power\"].value] = m.fs.tags_output.table_row(\n",
+ " numeric=True\n",
+ " )\n",
+ " if abs(p - 650) < 0.1:\n",
+ " m.fs.gt.streams_dataframe().to_csv(\n",
+ " \"data_tabulated/ngcc_stream_650mw_gt.csv\"\n",
+ " )\n",
+ " m.fs.st.steam_streams_dataframe().to_csv(\n",
+ " \"data_tabulated/ngcc_stream_650mw_st.csv\"\n",
+ " )\n",
+ " m.fs.hrsg.steam_streams_dataframe().to_csv(\n",
+ " \"data_tabulated/ngcc_stream_650mw_hrsg_steam.csv\"\n",
+ " )\n",
+ " m.fs.hrsg.flue_gas_streams_dataframe().to_csv(\n",
+ " \"data_tabulated/ngcc_stream_650mw_hrsg_gas.csv\"\n",
+ " )\n",
+ " df.to_csv(\"data_tabulated/ngcc.csv\")\n",
+ "\n",
+ " # Display the results from the run stored in a pandas dataframe\n",
+ " pd.set_option(\"display.max_rows\", None)\n",
+ " pd.set_option(\"display.max_columns\", None)\n",
+ " display(df)\n",
+ "\n",
+ " # Plot results\n",
+ " plt.plot(df[\"net_power (MW)\"], df[\"lhv_efficiency (%)\"])\n",
+ " plt.grid()\n",
+ " plt.xlabel(\"Net Power (MW)\")\n",
+ " plt.ylabel(\"LHV Efficiency (%)\")\n",
+ " plt.title(\"Net Power vs. Efficiency\")\n",
+ " plt.show()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.13"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 3
+}
diff --git a/idaes_examples/notebooks/docs/power_gen/ngcc/steam_turbine_init.json.gz b/idaes_examples/notebooks/docs/power_gen/ngcc/steam_turbine_init.json.gz
new file mode 100644
index 00000000..56609eab
Binary files /dev/null and b/idaes_examples/notebooks/docs/power_gen/ngcc/steam_turbine_init.json.gz differ
diff --git a/idaes_examples/notebooks/active/power_gen/ngcc/steam_turbine_template.svg b/idaes_examples/notebooks/docs/power_gen/ngcc/steam_turbine_template.svg
similarity index 100%
rename from idaes_examples/notebooks/active/power_gen/ngcc/steam_turbine_template.svg
rename to idaes_examples/notebooks/docs/power_gen/ngcc/steam_turbine_template.svg