From 38b34ad79515655cdc4adafeddd5410b3436d93e Mon Sep 17 00:00:00 2001 From: Francesco Witte Date: Sat, 19 Oct 2024 19:32:27 +0200 Subject: [PATCH 1/6] Add a first draft for the new tutorial --- tutorial/advanced/hrsg.py | 306 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 306 insertions(+) create mode 100644 tutorial/advanced/hrsg.py diff --git a/tutorial/advanced/hrsg.py b/tutorial/advanced/hrsg.py new file mode 100644 index 000000000..451997614 --- /dev/null +++ b/tutorial/advanced/hrsg.py @@ -0,0 +1,306 @@ +# %%[sec_1] +from tespy.networks import Network + +nw = Network( + T_unit="C", p_unit="bar", h_unit="kJ / kg", m_unit="t / h" +) +# %%[sec_2] +from tespy.components import Merge +from tespy.components import Pump +from tespy.components import SimpleHeatExchanger +from tespy.components import Sink +from tespy.components import Source +from tespy.components import Splitter +from tespy.components import Turbine +from tespy.components import Valve + +# sources & sinks +live_steam = Source("live steam") +makeup_water = Source("makeup water") +process_steam = Sink("process steam") +process_condensate = Source("process condensate") +pre_feed_water = Sink("pre_feed_water") + +# other components +extraction_turbine = Turbine("extraction turbine") +condensing_turbine = Turbine("condensing turbine") +condenser = SimpleHeatExchanger("condenser") +steam_cond_pump = Pump("steam conditioner pump") +condensate_pump = Pump("condensate pump") + +merge_1 = Merge("merge 1") +merge_2 = Merge("merge 2", num_in=3) +conditioning_valve = Valve("conditioning valve") +splitter_1 = Splitter("steam extraction") +splitter_2 = Splitter("condensate split") +# %%[sec_3] +from tespy.connections import Connection + + +c1 = Connection(live_steam, "out1", extraction_turbine, "in1", label="1") +c2 = Connection(extraction_turbine, "out1", splitter_1, "in1", label="2") +c3 = Connection(splitter_1, "out2", merge_1, "in2", label="3") + +c4 = Connection(splitter_1, "out1", conditioning_valve, "in1", label="4") +c5 = Connection(conditioning_valve, "out1", condensing_turbine, "in1", label="5") +c6 = Connection(condensing_turbine, "out1", condenser, "in1", label="6") +c7 = Connection(condenser, "out1", splitter_2, "in1", label="7") +c8 = Connection(splitter_2, "out1", condensate_pump, "in1", label="8") + +c9 = Connection(splitter_2, "out2", steam_cond_pump, "in1", label="9") +c10 = Connection(steam_cond_pump,"out1", merge_1,"in1", label="10") +c11 = Connection(merge_1, "out1",process_steam,"in1", label="11") + +c12 = Connection(condensate_pump,"out1", merge_2, "in1", label="12") +c13 = Connection(process_condensate, "out1", merge_2, "in2", label="13") +c14 = Connection(makeup_water,"out1", merge_2, "in3", label="14") +c15 = Connection(merge_2, "out1", pre_feed_water, "in1", label="15") + +nw.add_conns(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15) +# %%[sec_4] +from tespy.connections import Ref + + +Tamb = 15 +pamb = 1.013 + +c1.set_attr(fluid={"water": 1}, T=480, p=88.5, m=200) + +extraction_mass_flow = 160 # t/h +c3.set_attr(m=extraction_mass_flow) +c7.set_attr(x=0, T=Tamb + 18) + +process_steam_pressure = 13 +process_steam_superheating = 10 +c11.set_attr(Td_bp=process_steam_superheating, p=process_steam_pressure) +c12.set_attr(p=pamb) + +condensate_return_fraction = 0.75 +c13.set_attr(fluid={"water": 1}, x=0, m=Ref(c11, condensate_return_fraction, 0)) +c14.set_attr(fluid={"water": 1}, m=1, T=Tamb) +# %%[sec_5] +extraction_turbine.set_attr(eta_s=0.9) +condensing_turbine.set_attr(eta_s=0.9) + +condenser.set_attr(pr=1) +conditioning_valve.set_attr(pr=0.85) +condensate_pump.set_attr(eta_s=0.7) +steam_cond_pump.set_attr(eta_s=0.7) + +nw.solve("design") +nw.print_results() +# %%[sec_6] +from tespy.components import Drum +from tespy.components import HeatExchanger + + +nw.del_conns(c15) + +steam_deaeration = Sink("steam deaeration") +to_hp_cond = Sink("to hp condenser") + +lp_feed_pump = Pump("lp feed pump") +hp_feed_pump = Pump("hp feed pump") + +lp_drum = Drum("low pressure drum") +splitter_3 = Splitter("splitter 3") +splitter_4 = Splitter("splitter 4") +merge_3 = Merge("merge 3") + +lp_evaporator = SimpleHeatExchanger("low pressure evaporator") +feed_water_preheater = HeatExchanger("feed water preheater") +hp_eco_1 = SimpleHeatExchanger("high pressure economizer 1") +hp_eco_2 = SimpleHeatExchanger("high pressure economizer 2") + +c15 = Connection(merge_2, "out1", lp_feed_pump, "in1", label="15") +c16 = Connection(lp_feed_pump, "out1", feed_water_preheater, "in2", label="16") +c17 = Connection(feed_water_preheater, "out2", lp_drum, "in1", label="17") +c18 = Connection(lp_drum, "out1", splitter_3, "in1", label="18") + +c19 = Connection(splitter_3, "out1", lp_evaporator, "in1", label="19") +c20 = Connection(lp_evaporator, "out1", lp_drum, "in2", label="20") +c21 = Connection(lp_drum, "out2", steam_deaeration, "in1", label="21") + +c22 = Connection(splitter_3, "out2", feed_water_preheater, "in1", label="22") +c23 = Connection(feed_water_preheater, "out1", hp_feed_pump, "in1", label="23") +c24 = Connection(hp_feed_pump, "out1", splitter_4, "in1", label="24") + +c25 = Connection(splitter_4, "out1", hp_eco_1, "in1", label="25") +c26 = Connection(hp_eco_1, "out1", hp_eco_2, "in1", label="26") +c27 = Connection(hp_eco_2, "out1", merge_3, "in1", label="27") + +c28 = Connection(splitter_4, "out2", merge_3, "in2", label="28") +c29 = Connection(merge_3, "out1", to_hp_cond, "in1", label="29") + +nw.add_conns(c15, c16, c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29) +# %%[sec_7] +c14.set_attr(m=None) + +c16.set_attr(p=2.3, T=55) +c17.set_attr(T=100, p0=2.3) +c20.set_attr(x=.05) +c21.set_attr(m=0.1) + +c24.set_attr(p=88.5) +c26.set_attr(T=116, p0=88.5) +c27.set_attr(T=231, p0=88.5) +c28.set_attr(m=0) + +lp_feed_pump.set_attr(eta_s=0.7) +hp_feed_pump.set_attr(eta_s=0.7) + +feed_water_preheater.set_attr(pr1=0.9, pr2=0.9) + +hp_eco_2.set_attr(pr=1) + +nw.solve("design") +nw.print_results() +# %%[sec_8] +nw.del_conns(c29, c1) + +hp_blowdown = Sink("hp blowdown") + +hp_drum = Drum("high pressure drum") +splitter_5 = Splitter("splitter 5") +splitter_6 = Splitter("splitter 6") +merge_4 = Merge("merge 4") + +hp_condenser = HeatExchanger("hp condenser") +hp_eco_3 = SimpleHeatExchanger("high pressure economizer 3") +hp_evaporator = SimpleHeatExchanger("high pressure evaporator") +hp_s_1 = SimpleHeatExchanger("high pressure superheater 1") +hp_s_2 = SimpleHeatExchanger("high pressure superheater 2") + +c29 = Connection(merge_3, "out1", hp_condenser, "in2", label="29") +c30 = Connection(hp_condenser, "out2", hp_eco_3, "in1", label="30") +c31 = Connection(hp_eco_3, "out1", hp_drum, "in1", label="31") +c32 = Connection(hp_drum, "out1", splitter_5, "in1", label="32") + +c33 = Connection(splitter_5, "out1", hp_blowdown, "in1", label="33") + +c34 = Connection(splitter_5, "out2", hp_evaporator, "in1", label="34") +c35 = Connection(hp_evaporator, "out1", hp_drum, "in2", label="35") + +c36 = Connection(hp_drum, "out2", splitter_6, "in1", label="36") + +c37 = Connection(splitter_6, "out1", hp_condenser, "in1", label="37") +c38 = Connection(hp_condenser, "out1", merge_4, "in1", label="38") + +c39 = Connection(splitter_6, "out2", hp_s_1, "in1", label="39") +c40 = Connection(hp_s_1, "out1", merge_4, "in2", label="40") +c41 = Connection(merge_4, "out1", hp_s_2, "in1", label="41") + +c42 = Connection(hp_s_2, "out1", extraction_turbine, "in1", label="42") + +nw.add_conns(c29, c30, c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, c41, c42) +# %%[sec_9] +from tespy.connections import Bus + + +c31.set_attr(T=290, p0=88.5) +c33.set_attr(m=2) +c35.set_attr(x=0.05) +c38.set_attr(x=0) +c40.set_attr(T=529) +c41.set_attr(T=429) +c42.set_attr(fluid={"water": 1}, T=480) + +hp_condenser.set_attr(pr1=1, pr2=1) +hp_eco_3.set_attr(pr=1) +hp_s_2.set_attr(pr=1) + +power_output = Bus("power output") +power_output.add_comps( + {"comp": extraction_turbine, "base": "component", "char": 0.97}, + {"comp": condensing_turbine, "base": "component", "char": 0.97}, + {"comp": condensate_pump, "base": "bus", "char": 0.97}, + {"comp": steam_cond_pump, "base": "bus", "char": 0.97}, + {"comp": lp_feed_pump, "base": "bus", "char": 0.97}, + {"comp": hp_feed_pump, "base": "bus", "char": 0.97} +) +nw.add_busses(power_output) + +nw.solve("design") +nw.print_results() +# %% [sec_10] +nw.del_conns(c19, c20, c25, c26, c27, c30, c31, c34, c35, c39, c40, c41, c42) + +lp_evaporator = HeatExchanger("low pressure evaporator") +hp_eco_1 = HeatExchanger("high pressure economizer 1") +hp_eco_2 = HeatExchanger("high pressure economizer 2") +hp_eco_3 = HeatExchanger("high pressure economizer 3") +hp_evaporator = HeatExchanger("high pressure evaporator") +hp_s_1 = HeatExchanger("high pressure superheater 1") +hp_s_2 = HeatExchanger("high pressure superheater 2") + +c19 = Connection(splitter_3, "out1", lp_evaporator, "in2", label="19") +c20 = Connection(lp_evaporator, "out2", lp_drum, "in2", label="20") + +c25 = Connection(splitter_4, "out1", hp_eco_1, "in2", label="25") +c26 = Connection(hp_eco_1, "out2", hp_eco_2, "in2", label="26") +c27 = Connection(hp_eco_2, "out2", merge_3, "in1", label="27") + +c30 = Connection(hp_condenser, "out2", hp_eco_3, "in2", label="30") +c31 = Connection(hp_eco_3, "out2", hp_drum, "in1", label="31") + +c34 = Connection(splitter_5, "out2", hp_evaporator, "in2", label="34") +c35 = Connection(hp_evaporator, "out2", hp_drum, "in2", label="35") + +c39 = Connection(splitter_6, "out2", hp_s_1, "in2", label="39") +c40 = Connection(hp_s_1, "out2", merge_4, "in2", label="40") +c41 = Connection(merge_4, "out1", hp_s_2, "in2", label="41") + +c42 = Connection(hp_s_2, "out2", extraction_turbine, "in1", label="42") +nw.add_conns(c19, c20, c25, c26, c27, c30, c31, c34, c35, c39, c40, c41, c42) + +c20.set_attr(x=.05) +c26.set_attr(T=116) +c27.set_attr(T=231, p0=88.5) +c31.set_attr(T=290, p0=88.5) +c33.set_attr(m=2) +c35.set_attr(x=0.05) +c38.set_attr(x=0) +c40.set_attr(T=529) +c41.set_attr(T=429) +c42.set_attr(fluid={"water": 1}, T=480) + +gt_exhaust = Source("gas turbine exhaust") +chimney = Sink("chimney") + +c43 = Connection(gt_exhaust, "out1", hp_s_2, "in1", label="43") +c44 = Connection(hp_s_2, "out1", hp_s_1, "in1", label="44") +c45 = Connection(hp_s_1, "out1", hp_evaporator, "in1", label="45") +c46 = Connection(hp_evaporator, "out1", hp_eco_3, "in1", label="46") +c47 = Connection(hp_eco_3, "out1", hp_eco_2, "in1", label="47") +c48 = Connection(hp_eco_2, "out1", lp_evaporator, "in1", label="48") +c49 = Connection(lp_evaporator, "out1", hp_eco_1, "in1", label="49") +c50 = Connection(hp_eco_1, "out1", chimney, "in1", label="50") +nw.add_conns(c43, c44, c45, c46, c47, c48, c49, c50) + +x_gh_CO2 = 0.061 +x_gh_H2O = 0.07768 +x_gh_N2 = 0.7364 +x_gh_O2 = 0.1126 +x_gh_Ar = 1 - x_gh_CO2 - x_gh_H2O - x_gh_N2 - x_gh_O2 + +T_gh = 713 +G_gh = 4 * 482 +c43.set_attr( + fluid={"O2": x_gh_O2, "N2": x_gh_N2, "CO2": x_gh_CO2, "water": x_gh_H2O, "Ar": x_gh_Ar}, + m=G_gh, + T=T_gh, + p=pamb, +) + +lp_evaporator.set_attr(pr1=1) +hp_eco_1.set_attr(pr1=1) +hp_eco_2.set_attr(pr1=1, pr2=1) +hp_eco_3.set_attr(pr1=1, pr2=1) + +hp_evaporator.set_attr(pr1=1) +hp_s_1.set_attr(pr1=1) +hp_s_2.set_attr(pr1=1, pr2=1) + +nw.solve("design") +nw.print_results() +# %% [sec_11] From fbc409528454b6b43590540d64513da0d8c19680 Mon Sep 17 00:00:00 2001 From: Francesco Witte Date: Sat, 19 Oct 2024 19:42:21 +0200 Subject: [PATCH 2/6] Add flowsheets --- .../tutorials/hrsg_steam_supply/flowsheet.svg | 1748 ++++++++++++++++ .../hrsg_steam_supply/flowsheet_p1.svg | 1739 ++++++++++++++++ .../hrsg_steam_supply/flowsheet_p2.svg | 1739 ++++++++++++++++ .../hrsg_steam_supply/flowsheet_p3.svg | 1748 ++++++++++++++++ .../hrsg_steam_supply/flowsheet_parts.svg | 1816 +++++++++++++++++ 5 files changed, 8790 insertions(+) create mode 100644 docs/_static/images/tutorials/hrsg_steam_supply/flowsheet.svg create mode 100644 docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p1.svg create mode 100644 docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p2.svg create mode 100644 docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p3.svg create mode 100644 docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_parts.svg diff --git a/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet.svg b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet.svg new file mode 100644 index 000000000..60d602300 --- /dev/null +++ b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet.svg @@ -0,0 +1,1748 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + condenser + process steam + condensatereturn + makeupwater + preheater + LP drum + HP drum + HP EC 2 + HP EC 3 + HP EV + HP S 1 + HP S 2 + HP COND + LP EV + HP EC 1 + condensingturbine + extractionturbine + 1 + 2 + 4 + 5 + 6 + 3 + 11 + 10 + 12 + 15 + 16 + 17 + 23 + 21 + 18 + 22 + 19 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 20 + 14 + 13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + 8 + 9 + 24 + 28 + 25 + 26 + 27 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 50 + + + diff --git a/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p1.svg b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p1.svg new file mode 100644 index 000000000..fcea5812c --- /dev/null +++ b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p1.svg @@ -0,0 +1,1739 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + condenser + process steam + condensatereturn + makeupwater + preheater + LP drum + HP drum + HP EC 2 + HP EC 3 + HP EV + HP S 1 + HP S 2 + HP COND + LP EV + HP EC 1 + condensingturbine + extractionturbine + 1 + 2 + 4 + 5 + 6 + 3 + 11 + 10 + 12 + 15 + 16 + 17 + 23 + 21 + 18 + 22 + 19 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 20 + 14 + 13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + 8 + 9 + 24 + 28 + 25 + 26 + 27 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 50 + + diff --git a/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p2.svg b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p2.svg new file mode 100644 index 000000000..a8888cb4e --- /dev/null +++ b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p2.svg @@ -0,0 +1,1739 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + condenser + process steam + condensatereturn + makeupwater + preheater + LP drum + HP drum + HP EC 2 + HP EC 3 + HP EV + HP S 1 + HP S 2 + HP COND + LP EV + HP EC 1 + condensingturbine + extractionturbine + 1 + 2 + 4 + 5 + 6 + 3 + 11 + 10 + 12 + 15 + 16 + 17 + 23 + 21 + 18 + 22 + 19 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 20 + 14 + 13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + 8 + 9 + 24 + 28 + 25 + 26 + 27 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 50 + + diff --git a/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p3.svg b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p3.svg new file mode 100644 index 000000000..fe00dff6d --- /dev/null +++ b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p3.svg @@ -0,0 +1,1748 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + condenser + process steam + condensatereturn + makeupwater + preheater + LP drum + HP drum + HP EC 2 + HP EC 3 + HP EV + HP S 1 + HP S 2 + HP COND + LP EV + HP EC 1 + condensingturbine + extractionturbine + 1 + 2 + 4 + 5 + 6 + 3 + 11 + 10 + 12 + 15 + 16 + 17 + 23 + 21 + 18 + 22 + 19 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 20 + 14 + 13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + 8 + 9 + 24 + 28 + 25 + 26 + 27 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 50 + + + diff --git a/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_parts.svg b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_parts.svg new file mode 100644 index 000000000..604a6650e --- /dev/null +++ b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_parts.svg @@ -0,0 +1,1816 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + condenser + process steam + condensatereturn + makeupwater + preheater + LP drum + HP drum + HP EC 2 + HP EC 3 + HP EV + HP S 1 + HP S 2 + HP COND + LP EV + HP EC 1 + condensingturbine + extractionturbine + 1 + 2 + 4 + 5 + 6 + 3 + 11 + 10 + 12 + 15 + 16 + 17 + 23 + 21 + 18 + 22 + 19 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 20 + 14 + 13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + 8 + 9 + 24 + 28 + 25 + 26 + 27 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 50 + + + + + 1 + 2 + 3 + 4 + + From fbc66cb12c03a774adfb0babcaf2b269c927d3d8 Mon Sep 17 00:00:00 2001 From: Francesco Witte Date: Sat, 19 Oct 2024 19:47:51 +0200 Subject: [PATCH 3/6] Include tutorial in tox --- ...lowsheet_parts.svg => flowsheet_steps.svg} | 0 docs/tutorials.rst | 9 +- docs/tutorials/hrsg_process_steam.rst | 90 +++++++++++++++++++ 3 files changed, 97 insertions(+), 2 deletions(-) rename docs/_static/images/tutorials/hrsg_steam_supply/{flowsheet_parts.svg => flowsheet_steps.svg} (100%) create mode 100644 docs/tutorials/hrsg_process_steam.rst diff --git a/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_parts.svg b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_steps.svg similarity index 100% rename from docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_parts.svg rename to docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_steps.svg diff --git a/docs/tutorials.rst b/docs/tutorials.rst index 503f4950a..414ffad19 100644 --- a/docs/tutorials.rst +++ b/docs/tutorials.rst @@ -85,10 +85,15 @@ out to us. We are looking forward to hearing from you! .. image:: /_static/images/tutorials/pygmo_optimization/pygmo_optimization_darkmode.svg :class: only-dark - .. grid-item-card:: Gas Turbine with Heat Recovery Steam Generator + .. grid-item-card:: Heat Recovery Steam Generator for Power and Process Heat Production + :link: tespy_tutorial_hrsg_label + :link-type: ref - Coming soon! + .. image:: /_static/images/tutorials/hrsg_steam_supply/flowsheet.svg + :class: only-light + .. image:: /_static/images/tutorials/hrsg_steam_supply/flowsheet_darkmode.svg + :class: only-dark .. toctree:: :maxdepth: 1 diff --git a/docs/tutorials/hrsg_process_steam.rst b/docs/tutorials/hrsg_process_steam.rst new file mode 100644 index 000000000..459a1707e --- /dev/null +++ b/docs/tutorials/hrsg_process_steam.rst @@ -0,0 +1,90 @@ +.. _tespy_tutorial_hrsg_label: + +Heat Recovery Steam Generator for Process Steam Supply +------------------------------------------------------ + +We provide the full script presented in this tutorial here: +:download:`stepwise.py ` + +.. figure:: /_static/images/tutorials/hrsg_steam_supply/flowsheet_steps.svg + :align: center + :alt: Topology of the heat recovery steam generator + :figclass: only-light + + Figure: Topology of the heat recovery steam generator + +.. figure:: /_static/images/tutorials/hrsg_steam_supply/flowsheet_steps_darkmode.svg + :align: center + :alt: Topology of the heat recovery steam generator + :figclass: only-dark + + Figure: Topology of the heat recovery steam generator + +Overview +^^^^^^^^ +In this tutorial we will build a combined heat and power plant utilizing flue +gas (e.g. from a gas turbine) to generate process steam and electricity. The +figure above shows the structure of the system and the 4 steps we take to build +the system. + +... + +- Table on boundary conditions +- Table on assumptions + +.... + +The challenge here lies in the complexity of the system. With a well-structured +approach the problem can be tackled. + +Set up the Network +^^^^^^^^^^^^^^^^^^ + +.. literalinclude:: /../tutorial/advanced/stepwise.py + :language: python + :start-after: [sec_1] + :end-before: [sec_2] + +Modeling the heat pump: Consumer system +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. figure:: /_static/images/tutorials/heat_pump_stepwise/flowsheet_p1.svg + :align: center + :alt: First part of the system + :figclass: only-light + + Figure: First part of the system + +.. figure:: /_static/images/tutorials/heat_pump_stepwise/flowsheet_p1_darkmode.svg + :align: center + :alt: First part of the system + :figclass: only-dark + + Figure: First part of the system + +Components +++++++++++ + +.. literalinclude:: /../tutorial/advanced/stepwise.py + :language: python + :start-after: [sec_2] + :end-before: [sec_3] + +Connections ++++++++++++ + +.. literalinclude:: /../tutorial/advanced/stepwise.py + :language: python + :start-after: [sec_3] + :end-before: [sec_4] + +Parametrization & solving ++++++++++++++++++++++++++ + +.. literalinclude:: /../tutorial/advanced/stepwise.py + :language: python + :start-after: [sec_5] + :end-before: [sec_6] + + +More to follow From ed386ed47875658d3d957c965830bc8a1de24a79 Mon Sep 17 00:00:00 2001 From: Francesco Witte Date: Sat, 19 Oct 2024 20:04:18 +0200 Subject: [PATCH 4/6] Check in darkmode figures --- .../hrsg_steam_supply/flowsheet_darkmode.svg | 1748 ++++++++++++++++ .../flowsheet_p1_darkmode.svg | 1739 ++++++++++++++++ .../flowsheet_p2_darkmode.svg | 1739 ++++++++++++++++ .../flowsheet_p3_darkmode.svg | 1748 ++++++++++++++++ .../flowsheet_steps_darkmode.svg | 1816 +++++++++++++++++ docs/tutorials.rst | 1 + docs/tutorials/hrsg_process_steam.rst | 27 +- 7 files changed, 8803 insertions(+), 15 deletions(-) create mode 100644 docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_darkmode.svg create mode 100644 docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p1_darkmode.svg create mode 100644 docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p2_darkmode.svg create mode 100644 docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p3_darkmode.svg create mode 100644 docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_steps_darkmode.svg diff --git a/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_darkmode.svg b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_darkmode.svg new file mode 100644 index 000000000..50d2e3af4 --- /dev/null +++ b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_darkmode.svg @@ -0,0 +1,1748 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + condenser + process steam + condensatereturn + makeupwater + preheater + LP drum + HP drum + HP EC 2 + HP EC 3 + HP EV + HP S 1 + HP S 2 + HP COND + LP EV + HP EC 1 + condensingturbine + extractionturbine + 1 + 2 + 4 + 5 + 6 + 3 + 11 + 10 + 12 + 15 + 16 + 17 + 23 + 21 + 18 + 22 + 19 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 20 + 14 + 13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + 8 + 9 + 24 + 28 + 25 + 26 + 27 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 50 + + + diff --git a/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p1_darkmode.svg b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p1_darkmode.svg new file mode 100644 index 000000000..dd2b8507f --- /dev/null +++ b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p1_darkmode.svg @@ -0,0 +1,1739 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + condenser + process steam + condensatereturn + makeupwater + preheater + LP drum + HP drum + HP EC 2 + HP EC 3 + HP EV + HP S 1 + HP S 2 + HP COND + LP EV + HP EC 1 + condensingturbine + extractionturbine + 1 + 2 + 4 + 5 + 6 + 3 + 11 + 10 + 12 + 15 + 16 + 17 + 23 + 21 + 18 + 22 + 19 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 20 + 14 + 13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + 8 + 9 + 24 + 28 + 25 + 26 + 27 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 50 + + diff --git a/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p2_darkmode.svg b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p2_darkmode.svg new file mode 100644 index 000000000..10c8c7d02 --- /dev/null +++ b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p2_darkmode.svg @@ -0,0 +1,1739 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + condenser + process steam + condensatereturn + makeupwater + preheater + LP drum + HP drum + HP EC 2 + HP EC 3 + HP EV + HP S 1 + HP S 2 + HP COND + LP EV + HP EC 1 + condensingturbine + extractionturbine + 1 + 2 + 4 + 5 + 6 + 3 + 11 + 10 + 12 + 15 + 16 + 17 + 23 + 21 + 18 + 22 + 19 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 20 + 14 + 13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + 8 + 9 + 24 + 28 + 25 + 26 + 27 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 50 + + diff --git a/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p3_darkmode.svg b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p3_darkmode.svg new file mode 100644 index 000000000..537bde925 --- /dev/null +++ b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_p3_darkmode.svg @@ -0,0 +1,1748 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + condenser + process steam + condensatereturn + makeupwater + preheater + LP drum + HP drum + HP EC 2 + HP EC 3 + HP EV + HP S 1 + HP S 2 + HP COND + LP EV + HP EC 1 + condensingturbine + extractionturbine + 1 + 2 + 4 + 5 + 6 + 3 + 11 + 10 + 12 + 15 + 16 + 17 + 23 + 21 + 18 + 22 + 19 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 20 + 14 + 13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + 8 + 9 + 24 + 28 + 25 + 26 + 27 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 50 + + + diff --git a/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_steps_darkmode.svg b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_steps_darkmode.svg new file mode 100644 index 000000000..e42a7ff53 --- /dev/null +++ b/docs/_static/images/tutorials/hrsg_steam_supply/flowsheet_steps_darkmode.svg @@ -0,0 +1,1816 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + condenser + process steam + condensatereturn + makeupwater + preheater + LP drum + HP drum + HP EC 2 + HP EC 3 + HP EV + HP S 1 + HP S 2 + HP COND + LP EV + HP EC 1 + condensingturbine + extractionturbine + 1 + 2 + 4 + 5 + 6 + 3 + 11 + 10 + 12 + 15 + 16 + 17 + 23 + 21 + 18 + 22 + 19 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 20 + 14 + 13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + 8 + 9 + 24 + 28 + 25 + 26 + 27 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 50 + + + + + 1 + 2 + 3 + 4 + + diff --git a/docs/tutorials.rst b/docs/tutorials.rst index 414ffad19..393b3df1c 100644 --- a/docs/tutorials.rst +++ b/docs/tutorials.rst @@ -104,3 +104,4 @@ out to us. We are looking forward to hearing from you! tutorials/starting_values.rst tutorials/heat_pump_exergy.rst tutorials/pygmo_optimization.rst + tutorials/hrsg_process_steam.rst diff --git a/docs/tutorials/hrsg_process_steam.rst b/docs/tutorials/hrsg_process_steam.rst index 459a1707e..b0313da7a 100644 --- a/docs/tutorials/hrsg_process_steam.rst +++ b/docs/tutorials/hrsg_process_steam.rst @@ -37,35 +37,32 @@ the system. The challenge here lies in the complexity of the system. With a well-structured approach the problem can be tackled. -Set up the Network -^^^^^^^^^^^^^^^^^^ +Steam supply and turbine section +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. literalinclude:: /../tutorial/advanced/stepwise.py - :language: python - :start-after: [sec_1] - :end-before: [sec_2] - -Modeling the heat pump: Consumer system -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. figure:: /_static/images/tutorials/heat_pump_stepwise/flowsheet_p1.svg +.. figure:: /_static/images/tutorials/hrsg_steam_supply/flowsheet_p1.svg :align: center :alt: First part of the system :figclass: only-light Figure: First part of the system -.. figure:: /_static/images/tutorials/heat_pump_stepwise/flowsheet_p1_darkmode.svg +.. figure:: /_static/images/tutorials/hrsg_steam_supply/flowsheet_p1_darkmode.svg :align: center :alt: First part of the system :figclass: only-dark Figure: First part of the system +.. literalinclude:: /../tutorial/advanced/hrsg.py + :language: python + :start-after: [sec_1] + :end-before: [sec_2] + Components ++++++++++ -.. literalinclude:: /../tutorial/advanced/stepwise.py +.. literalinclude:: /../tutorial/advanced/hrsg.py :language: python :start-after: [sec_2] :end-before: [sec_3] @@ -73,7 +70,7 @@ Components Connections +++++++++++ -.. literalinclude:: /../tutorial/advanced/stepwise.py +.. literalinclude:: /../tutorial/advanced/hrsg.py :language: python :start-after: [sec_3] :end-before: [sec_4] @@ -81,7 +78,7 @@ Connections Parametrization & solving +++++++++++++++++++++++++ -.. literalinclude:: /../tutorial/advanced/stepwise.py +.. literalinclude:: /../tutorial/advanced/hrsg.py :language: python :start-after: [sec_5] :end-before: [sec_6] From 5a320d6c2e3365bc186e636b038a50c8eb2a8c8f Mon Sep 17 00:00:00 2001 From: Francesco Witte Date: Sun, 20 Oct 2024 08:35:00 +0200 Subject: [PATCH 5/6] Add some description for the first step --- docs/tutorials/hrsg_process_steam.rst | 53 +++++++++++++++++++++++++-- tutorial/advanced/hrsg.py | 11 ++++-- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/docs/tutorials/hrsg_process_steam.rst b/docs/tutorials/hrsg_process_steam.rst index b0313da7a..638905fd0 100644 --- a/docs/tutorials/hrsg_process_steam.rst +++ b/docs/tutorials/hrsg_process_steam.rst @@ -27,6 +27,22 @@ gas (e.g. from a gas turbine) to generate process steam and electricity. The figure above shows the structure of the system and the 4 steps we take to build the system. +It is a simplified version of an actual plant with some unique features: + +- The economizer bypass (connection 28) actually represents a performance + downgrade for the boiler. The technical reason is to allow it to produce less + than 30 % of the nominal steam mass flow. With this measure the CHP plant + can produce almost any steam flow between 40 t/h and 210 t/h, which is a + unusual wide range. +- The real economizer has eight stages. To simplify, we only model there here. +- Interestingly, the boiler is operated with what could be called a "negative + approach" (the temperature coming out of the economizer was higher than that + of the HP drum). This issue is managed by increasing the economizer pressure. + Although this solution is inefficient from an energy standpoint, it was + chosen for operational safety, likely to reduce the risk of economizer + steaming. +- The sweetwater condenser is a solution for HP steam desuperheating. + ... - Table on boundary conditions @@ -54,21 +70,30 @@ Steam supply and turbine section Figure: First part of the system +In the first part we will model the steam supply part and the turbine. We start +by importing the :code:`Network` class and creating an instance of it. + .. literalinclude:: /../tutorial/advanced/hrsg.py :language: python :start-after: [sec_1] :end-before: [sec_2] -Components -++++++++++ +Components and Connections +++++++++++++++++++++++++++ + +For the components, we need to import the respective classes as shown in this +part of the flowsheet and create the respective instances. .. literalinclude:: /../tutorial/advanced/hrsg.py :language: python :start-after: [sec_2] :end-before: [sec_3] -Connections -+++++++++++ +The same applies for the connections. The extraction steam turbine is connected +to the live steam source. At a later stage, this connection will be replaced by +one that directly links the high pressure superheater 2. Similarly, the +connection 15 connects to a sink, which will be replaced by the low pressure +feed pump later. .. literalinclude:: /../tutorial/advanced/hrsg.py :language: python @@ -78,6 +103,26 @@ Connections Parametrization & solving +++++++++++++++++++++++++ +For the live steam at the turbine inlet we have to assume a steam mass flow. In +the completed model it will be governed from the flue gas mass flow. On top of +that, we need temperature and pressure information. For the steam supply a +pressure of 13 bar and 10 °C of superheating is required. There also is a +specific mass flow to be provided, which however cannot be directly as this +specification would cause convergence issues. Instead, massflow 3 is fixed +initially. The outlet of the condenser is saturated liquid at a temperature of +35 °C. The condensate pump pumps the pressure back to ambient pressure. It is +assumed that 75 % of the process steam leaving the plant returns in the form of +condensate. The remaining mass flow is replaced by the makeup water. + +.. literalinclude:: /../tutorial/advanced/hrsg.py + :language: python + :start-after: [sec_4] + :end-before: [sec_5] + +For the components we can specify the isentropic efficiencies of the turbines +and the pumps as well as the pressure ratio of the condensing turbine inlet +valve as well as the condenser pressure loss. + .. literalinclude:: /../tutorial/advanced/hrsg.py :language: python :start-after: [sec_5] diff --git a/tutorial/advanced/hrsg.py b/tutorial/advanced/hrsg.py index 451997614..3fbd13b9d 100644 --- a/tutorial/advanced/hrsg.py +++ b/tutorial/advanced/hrsg.py @@ -77,7 +77,8 @@ condensate_return_fraction = 0.75 c13.set_attr(fluid={"water": 1}, x=0, m=Ref(c11, condensate_return_fraction, 0)) -c14.set_attr(fluid={"water": 1}, m=1, T=Tamb) +c14.set_attr(fluid={"water": 1}, T=Tamb) +c15.set_attr(m=200) # %%[sec_5] extraction_turbine.set_attr(eta_s=0.9) condensing_turbine.set_attr(eta_s=0.9) @@ -88,6 +89,12 @@ steam_cond_pump.set_attr(eta_s=0.7) nw.solve("design") + +c3.set_attr(m=None) +c11.set_attr(m=extraction_mass_flow) + +nw.solve("design") + nw.print_results() # %%[sec_6] from tespy.components import Drum @@ -134,8 +141,6 @@ nw.add_conns(c15, c16, c17, c18, c19, c20, c21, c22, c23, c24, c25, c26, c27, c28, c29) # %%[sec_7] -c14.set_attr(m=None) - c16.set_attr(p=2.3, T=55) c17.set_attr(T=100, p0=2.3) c20.set_attr(x=.05) From 26ed7c51495b106a6df6b31ce2b3f444c84eaaa7 Mon Sep 17 00:00:00 2001 From: Francesco Witte Date: Sun, 20 Oct 2024 11:53:42 +0200 Subject: [PATCH 6/6] Include the remaining figures --- docs/tutorials/hrsg_process_steam.rst | 97 +++++++++++++++++++++++---- 1 file changed, 85 insertions(+), 12 deletions(-) diff --git a/docs/tutorials/hrsg_process_steam.rst b/docs/tutorials/hrsg_process_steam.rst index 638905fd0..04e20f471 100644 --- a/docs/tutorials/hrsg_process_steam.rst +++ b/docs/tutorials/hrsg_process_steam.rst @@ -25,7 +25,8 @@ Overview In this tutorial we will build a combined heat and power plant utilizing flue gas (e.g. from a gas turbine) to generate process steam and electricity. The figure above shows the structure of the system and the 4 steps we take to build -the system. +the system. The challenge here lies in the complexity of the system. With a +well-structured approach the problem can be tackled. It is a simplified version of an actual plant with some unique features: @@ -43,15 +44,37 @@ It is a simplified version of an actual plant with some unique features: steaming. - The sweetwater condenser is a solution for HP steam desuperheating. -... - -- Table on boundary conditions -- Table on assumptions - -.... - -The challenge here lies in the complexity of the system. With a well-structured -approach the problem can be tackled. +The table below indicate the most important boundary conditions. + ++---------------------+---------------+-------+------+ +| Location | Parameter | Value | Unit | ++=====================+===============+=======+======+ +| process steam | :code:`m` | 160 | t/h | ++ +---------------+-------+------+ +| | :code:`Td_bp` | 10 | °C | ++ +---------------+-------+------+ +| | :code:`p` | 13 | bar | ++---------------------+---------------+-------+------+ +| live steam | :code:`T` | 480 | °C | ++ +---------------+-------+------+ +| | :code:`p` | 88.5 | bar | ++---------------------+---------------+-------+------+ +| gas turbine exhaust | :code:`T` | 720 | °C | ++---------------------+---------------+-------+------+ + +And the most important component parameters: + ++----------------------+---------------+-------+------+ +| Component | Parameter | Value | Unit | ++======================+===============+=======+======+ +| turbines | :code:`eta_s` | 90 | % | ++----------------------+---------------+-------+------+ +| pumps | :code:`eta_s` | 70 | % | ++----------------------+---------------+-------+------+ +| heat exchangers | :code:`pr` | 100 | % | ++----------------------+---------------+-------+------+ +| feed water preheater | :code:`pr` | 90 | % | ++----------------------+---------------+-------+------+ Steam supply and turbine section ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -121,12 +144,62 @@ condensate. The remaining mass flow is replaced by the makeup water. For the components we can specify the isentropic efficiencies of the turbines and the pumps as well as the pressure ratio of the condensing turbine inlet -valve as well as the condenser pressure loss. +valve as well as the condenser pressure loss. Then we solve the system and +with the first solution, the extraction mass flow can be unset and instead, the +actual process steam mass flow is specified. .. literalinclude:: /../tutorial/advanced/hrsg.py :language: python :start-after: [sec_5] :end-before: [sec_6] +Low pressure preheating and high pressure economizer +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. figure:: /_static/images/tutorials/hrsg_steam_supply/flowsheet_p2.svg + :align: center + :alt: Second part of the system + :figclass: only-light + + Figure: Second part of the system + +.. figure:: /_static/images/tutorials/hrsg_steam_supply/flowsheet_p2_darkmode.svg + :align: center + :alt: Second part of the system + :figclass: only-dark + + Figure: Second part of the system + +Completing the Rankine cycle +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. figure:: /_static/images/tutorials/hrsg_steam_supply/flowsheet_p3.svg + :align: center + :alt: Third part of the system + :figclass: only-light + + Figure: Third part of the system + +.. figure:: /_static/images/tutorials/hrsg_steam_supply/flowsheet_p3_darkmode.svg + :align: center + :alt: Third part of the system + :figclass: only-dark + + Figure: Third part of the system + +Adding the exhaust gas +^^^^^^^^^^^^^^^^^^^^^^ + +.. figure:: /_static/images/tutorials/hrsg_steam_supply/flowsheet.svg + :align: center + :alt: Complete system + :figclass: only-light + + Figure: Complete system + +.. figure:: /_static/images/tutorials/hrsg_steam_supply/flowsheet_darkmode.svg + :align: center + :alt: First part of the system + :figclass: only-dark -More to follow + Figure: Complete system