├── requirements.txt
├── component_validation.csv
├── connection_validation.csv
├── LICENSE
├── .gitignore
├── sCO2.py
├── README.md
└── flowsheet.svg
/requirements.txt:
--------------------------------------------------------------------------------
1 | tespy==0.9.3
2 | CoolProp==6.8.0
3 |
--------------------------------------------------------------------------------
/component_validation.csv:
--------------------------------------------------------------------------------
1 | label;E_F;E_P;E_D;epsilon;y_Dk;y*_Dk
2 | CMP;85,3;73,1;12,1;85,8;7,2;
3 | Compressor 1;47,6;40,2;7,3;84,6;4,4;
4 | Compressor 2;37,7;32,9;4,8;87,3;2,9;
5 | Heater;158;155,1;2,9;98,2;1,7;
6 | REC;213,1;205,4;7,6;96,4;4,6;
7 | Recuperator 1;73,9;70;3,9;94,8;2,3;
8 | Recuperator 2;139,2;135,4;3,8;97,3;2,2;
9 | Cooler;22,3;;20,9;;12,5;
10 | Turbine;197,4;185,3;12,2;93,8;7,3;
11 |
--------------------------------------------------------------------------------
/connection_validation.csv:
--------------------------------------------------------------------------------
1 | label;T;p;e_T;e_M
2 | 1;35;75;7,59;198,46
3 | 2;123,26;258,4;34,86;218,09
4 | 3;433,63;257;231,28;217,95
5 | 4;600;250;362,76;217,23
6 | 5;456,95;77,95;213,8;198,8
7 | 6;128,26;75,15;33,56;198,48
8 | 10;128,26;75,15;33,56;198,48
9 | 11;264,11;257,51;116,43;218
10 | 12;264,11;257,51;116,43;218
11 | 13;264,11;257,51;116,43;218
12 | 14;269,11;76,94;95,93;198,68
13 | 15;128,26;75,15;33,56;198,48
14 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) Francesco Witte, Julius Meier, Ilja Tuschy, Mathias Hofmann
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | pip-wheel-metadata/
24 | share/python-wheels/
25 | *.egg-info/
26 | .installed.cfg
27 | *.egg
28 | MANIFEST
29 |
30 | # PyInstaller
31 | # Usually these files are written by a python script from a template
32 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
33 | *.manifest
34 | *.spec
35 |
36 | # Installer logs
37 | pip-log.txt
38 | pip-delete-this-directory.txt
39 |
40 | # Unit test / coverage reports
41 | htmlcov/
42 | .tox/
43 | .nox/
44 | .coverage
45 | .coverage.*
46 | .cache
47 | nosetests.xml
48 | coverage.xml
49 | *.cover
50 | *.py,cover
51 | .hypothesis/
52 | .pytest_cache/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | target/
76 |
77 | # Jupyter Notebook
78 | .ipynb_checkpoints
79 |
80 | # IPython
81 | profile_default/
82 | ipython_config.py
83 |
84 | # pyenv
85 | .python-version
86 |
87 | # pipenv
88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
91 | # install all needed dependencies.
92 | #Pipfile.lock
93 |
94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow
95 | __pypackages__/
96 |
97 | # Celery stuff
98 | celerybeat-schedule
99 | celerybeat.pid
100 |
101 | # SageMath parsed files
102 | *.sage.py
103 |
104 | # Environments
105 | .env
106 | .venv
107 | env/
108 | venv/
109 | ENV/
110 | env.bak/
111 | venv.bak/
112 |
113 | # Spyder project settings
114 | .spyderproject
115 | .spyproject
116 |
117 | # Rope project settings
118 | .ropeproject
119 |
120 | # mkdocs documentation
121 | /site
122 |
123 | # mypy
124 | .mypy_cache/
125 | .dmypy.json
126 | dmypy.json
127 |
128 | # Pyre type checker
129 | .pyre/
130 |
--------------------------------------------------------------------------------
/sCO2.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from tespy.networks import Network
4 | from tespy.components import (
5 | Sink, Source, Turbine, SimpleHeatExchanger, Merge, Splitter,
6 | HeatExchanger, CycleCloser, Compressor)
7 | from tespy.connections import Connection, Bus, Ref
8 | import pandas as pd
9 | import numpy as np
10 | from tespy.tools import ExergyAnalysis
11 |
12 | import plotly.graph_objects as go
13 |
14 | fmt_dict = {
15 | 'E_F': {
16 | 'unit': ' in MW',
17 | 'float': '{:.2f}',
18 | 'factor': 1e6,
19 | },
20 | 'E_P': {
21 | 'unit': ' in MW',
22 | 'float': '{:.2f}',
23 | 'factor': 1e6,
24 | },
25 | 'E_D': {
26 | 'unit': ' in MW',
27 | 'float': '{:.2f}',
28 | 'factor': 1e6,
29 | },
30 | 'E_L': {
31 | 'unit': ' in MW',
32 | 'float': '{:.2f}',
33 | 'factor': 1e6,
34 | },
35 | 'epsilon': {
36 | 'unit': ' in %',
37 | 'float': '{:.1f}',
38 | 'factor': 1 / 100,
39 | 'markdown_header': 'ε'
40 | },
41 | 'y_Dk': {
42 | 'unit': ' in %',
43 | 'float': '{:.1f}',
44 | 'factor': 1 / 100
45 | },
46 | 'y*_Dk': {
47 | 'unit': ' in %',
48 | 'float': '{:.1f}',
49 | 'factor': 1 / 100
50 | },
51 | 'e_T': {
52 | 'unit': ' in kJ/kg',
53 | 'float': '{:.1f}',
54 | 'factor': 1000
55 | },
56 | 'e_M': {
57 | 'unit': ' in kJ/kg',
58 | 'float': '{:.1f}',
59 | 'factor': 1000
60 | },
61 | 'e_PH': {
62 | 'unit': ' in kJ/kg',
63 | 'float': '{:.1f}',
64 | 'factor': 1000
65 | },
66 | 'E_T': {
67 | 'unit': ' in MW',
68 | 'float': '{:.2f}',
69 | 'factor': 1e6
70 | },
71 | 'E_M': {
72 | 'unit': ' in MW',
73 | 'float': '{:.2f}',
74 | 'factor': 1e6
75 | },
76 | 'E_PH': {
77 | 'unit': ' in MW',
78 | 'float': '{:.2f}',
79 | 'factor': 1e6
80 | },
81 | 'T': {
82 | 'unit': ' in °C',
83 | 'float': '{:.1f}',
84 | 'factor': 1
85 | },
86 | 'p': {
87 | 'unit': ' in bar',
88 | 'float': '{:.2f}',
89 | 'factor': 1
90 | },
91 | 'h': {
92 | 'unit': ' in kJ/kg',
93 | 'float': '{:.1f}',
94 | 'factor': 1
95 | }
96 | }
97 |
98 |
99 | def result_to_markdown(df, filename, prefix=''):
100 |
101 | for col in df.columns:
102 | fmt = fmt_dict[col]['float']
103 | if prefix == 'δ ':
104 | unit = ' in %'
105 | df[col] *= 100
106 | else:
107 | unit = fmt_dict[col]['unit']
108 | df[col] /= fmt_dict[col]['factor']
109 | for row in df.index:
110 | df.loc[row, col] = str(fmt.format(df.loc[row, col]))
111 | if 'markdown_header' not in fmt_dict[col]:
112 | fmt_dict[col]['markdown_header'] = col
113 |
114 | df = df.rename(columns={
115 | col: prefix + fmt_dict[col]['markdown_header'] + unit
116 | })
117 | df.to_markdown(
118 | filename, disable_numparse=True,
119 | colalign=['left'] + ['right' for _ in df.columns]
120 | )
121 |
122 |
123 | # specification of ambient state
124 | pamb = 1.01325
125 | Tamb = 15
126 |
127 |
128 | # setting up network
129 | nw = Network(fluids=['CO2'])
130 | nw.set_attr(
131 | T_unit='C', p_unit='bar', h_unit='kJ / kg', m_unit='kg / s',
132 | s_unit="kJ / kgK")
133 |
134 | # components definition
135 | water_in = Source('Water source')
136 | water_out = Sink('Water sink')
137 |
138 | closer = CycleCloser('Cycle closer')
139 |
140 | cp1 = Compressor('Compressor 1', fkt_group='CMP')
141 | cp2 = Compressor('Compressor 2', fkt_group='CMP')
142 |
143 | rec1 = HeatExchanger('Recuperator 1', fkt_group='REC')
144 | rec2 = HeatExchanger('Recuperator 2', fkt_group='REC')
145 |
146 | cooler = SimpleHeatExchanger('Water cooler')
147 | heater = SimpleHeatExchanger('Heater')
148 |
149 | turb = Turbine('Turbine')
150 |
151 | sp1 = Splitter('Splitter 1', fkt_group='REC')
152 | m1 = Merge('Merge 1', fkt_group='REC')
153 |
154 | # connections definition
155 | # power cycle
156 | c1 = Connection(cooler, 'out1', cp1, 'in1', label='1')
157 | c2 = Connection(cp1, 'out1', rec1, 'in2', label='2')
158 | c3 = Connection(rec2, 'out2', heater, 'in1', label='3')
159 |
160 | c0 = Connection(heater, 'out1', closer, 'in1', label='0')
161 | c4 = Connection(closer, 'out1', turb, 'in1', label='4')
162 | c5 = Connection(turb, 'out1', rec2, 'in1', label='5')
163 | c6 = Connection(sp1, 'out1', cooler, 'in1', label='6')
164 |
165 | c10 = Connection(sp1, 'out2', cp2, 'in1', label='10')
166 | c11 = Connection(cp2, 'out1', m1, 'in2', label='11')
167 | c12 = Connection(rec1, 'out2', m1, 'in1', label='12')
168 | c13 = Connection(m1, 'out1', rec2, 'in2', label='13')
169 |
170 | c14 = Connection(rec2, 'out1', rec1, 'in1', label='14')
171 | c15 = Connection(rec1, 'out1', sp1, 'in1', label='15')
172 |
173 | # add connections to network
174 | nw.add_conns(c0, c1, c2, c3, c4, c5, c6, c10, c11, c12, c13, c14, c15)
175 |
176 | # power bus
177 | power = Bus('total output power')
178 | power.add_comps({'comp': turb, 'char': 0.99 * 0.99, 'base': 'component'},
179 | {'comp': cp1, 'char': 0.98 * 0.97, 'base': 'bus'},
180 | {'comp': cp2, 'char': 0.98 * 0.97, 'base': 'bus'})
181 |
182 | heat_input_bus = Bus('heat input')
183 | heat_input_bus.add_comps({'comp': heater, 'base': 'bus'})
184 |
185 | nw.add_busses(power, heat_input_bus)
186 |
187 | # connection parameters
188 | c1.set_attr(T=35, p=75, fluid={'CO2': 1}, m=10)
189 | c2.set_attr(p=258.4)
190 | c3.set_attr(p=257, T=433.63)
191 | c4.set_attr(T=600, p=250)
192 | c5.set_attr(p=77.95)
193 | c6.set_attr(p=75.15, T=128.26)
194 | c11.set_attr(p=257.51)
195 | c14.set_attr(p=76.94, T=269.11)
196 |
197 | # component parameters
198 | turb.set_attr(eta_s=0.9)
199 | cp1.set_attr(eta_s=0.85)
200 | cp2.set_attr(eta_s=0.85)
201 | # rec1.set_attr(ttd_u=5)
202 |
203 | # solve final state
204 | nw.solve(mode='design')
205 | rec2.set_attr(ttd_l=5)
206 | rec1.set_attr(ttd_l=5)
207 | c11.set_attr(T=Ref(c12, 1, 0))
208 | c3.set_attr(T=None)
209 | c6.set_attr(T=None)
210 | c14.set_attr(T=None)
211 | c1.set_attr(m=None)
212 | power.set_attr(P=-100e6)
213 | nw.solve(mode='design')
214 | # print results to prompt and generate model documentation
215 | nw.print_results()
216 |
217 | # carry out exergy analysis
218 | ean = ExergyAnalysis(nw, E_P=[power], E_F=[heat_input_bus])
219 | ean.analyse(pamb=pamb, Tamb=Tamb)
220 |
221 | # print exergy analysis results to prompt
222 | ean.print_results()
223 |
224 | # generate Grassmann diagram
225 | links, nodes = ean.generate_plotly_sankey_input(
226 | node_order=[
227 | 'E_F', 'heat input', 'Heater', 'Cycle closer', 'CMP', 'REC',
228 | 'Turbine', 'Water cooler', 'total output power', 'E_P', 'E_L', 'E_D'
229 | ]
230 | )
231 |
232 | # norm values to to E_F
233 | links['value'] = [val / links['value'][0] for val in links['value']]
234 |
235 | fig = go.Figure(go.Sankey(
236 | arrangement="snap",
237 | textfont={"family": "Linux Libertine O"},
238 | node={
239 | "label": nodes,
240 | 'pad': 11,
241 | 'color': 'orange'},
242 | link=links))
243 | fig.show()
244 |
245 | # validation (connections)
246 |
247 | df_original_data = pd.read_csv(
248 | 'connection_validation.csv', sep=';', decimal=',', index_col='label'
249 | )
250 |
251 | df_tespy = pd.concat(
252 | # units of exergy are J/kg in TESPy, kJ/kg in original data
253 | [nw.results['Connection'], ean.connection_data / 1e3], axis=1
254 | )
255 | # make index numeric to match indices
256 | df_tespy.index = pd.to_numeric(df_tespy.index, errors='coerce')
257 | # select available indices
258 | idx = np.intersect1d(df_tespy.index, df_original_data.index)
259 | df_tespy = df_tespy.loc[idx, df_original_data.columns]
260 |
261 | df_diff_abs = df_tespy - df_original_data
262 | df_diff_rel = (df_tespy - df_original_data) / df_original_data
263 |
264 | result_to_markdown(df_diff_abs, 'connections_delta_absolute', 'Δ ')
265 | result_to_markdown(df_diff_rel, 'connections_delta_relative', 'δ ')
266 |
267 | # validation (components, needs re-check)
268 |
269 | df_original_data = pd.read_csv(
270 | 'component_validation.csv', sep=';', decimal=',', index_col='label'
271 | )
272 |
273 | # use aggregated data, as these include mechanical losses of compressor/turbine
274 | df_tespy = ean.aggregation_data.copy()
275 | # # select available indices
276 | idx = np.intersect1d(df_tespy.index, df_original_data.index)
277 | cols = ['E_F', 'E_P', 'E_D']
278 | # original data in MW
279 | df_tespy = df_tespy.loc[idx, cols] / 1e6
280 | df_original_data = df_original_data.loc[idx, cols]
281 |
282 | df_diff_abs = (df_tespy - df_original_data).dropna()
283 | df_diff_rel = ((df_tespy - df_original_data) / df_original_data).dropna()
284 |
285 | result_to_markdown(df_diff_abs * 1e6, 'components_delta_absolute', 'Δ ')
286 | result_to_markdown(df_diff_rel, 'components_delta_relative', 'δ ')
287 |
288 | # export results
289 |
290 | network_result = ean.network_data.to_frame().transpose()
291 |
292 | ean.aggregation_data.drop(columns=['group'], inplace=True)
293 | result_to_markdown(ean.aggregation_data, 'components_result')
294 | result_to_markdown(ean.connection_data, 'connections_result')
295 | result_to_markdown(network_result, 'network_result')
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Exergy Analysis of a Supercritical CO2 Power Cycle in TESPy
2 |
3 | Example for the exergy analysis in [TESPy][]. Find more information
4 | about the exergy analysis feature in the respective [online
5 | documentation][].
6 |
7 | The supercritical CO2 power cycle model has the following
8 | topology:
9 |
10 |
11 |
12 |
13 |
14 | ## Usage
15 |
16 | Clone the repository and build a new python environment. From the base
17 | directory of the repository run
18 |
19 | ``` bash
20 | pip install -r ./requirements.txt
21 | ```
22 |
23 | to install the version requirements for the sCO2.py python script.
24 |
25 | The original data of the plant are obtained from the following
26 | publication:
27 |
28 | *M. Penkuhn, G. Tsatsaronis, Exergoeconomic analyses of different sCO2
29 | cycle configurations, in: The 6th International Symposium –
30 | Supercritical CO2 Power Cycles, 2018.*
31 |
32 | ## Valdiation and Results of Exergy Analysis
33 |
34 | The tables below show the results of the simulation as well as the
35 | validation results. The original data from the publication are provided
36 | in the .csv files [component_validation.csv][] and
37 | [connection_validation.csv][].
38 |
39 | ### Connection data
40 |
41 | **TESPy simulation**
42 |
43 | | | e_PH in kJ/kg | e_T in kJ/kg | e_M in kJ/kg | E_PH in MW | E_T in MW | E_M in MW |
44 | |:---|----------------:|---------------:|---------------:|-------------:|------------:|------------:|
45 | | 0 | 580.2 | 362.9 | 217.2 | 683.34 | 427.47 | 255.86 |
46 | | 1 | 206.1 | 7.6 | 198.5 | 176.65 | 6.51 | 170.14 |
47 | | 2 | 252.9 | 34.8 | 218.1 | 216.85 | 29.87 | 186.98 |
48 | | 3 | 449.4 | 231.4 | 218.0 | 529.24 | 272.54 | 256.70 |
49 | | 4 | 580.2 | 362.9 | 217.2 | 683.34 | 427.47 | 255.86 |
50 | | 5 | 412.8 | 214.0 | 198.8 | 486.14 | 252.00 | 234.15 |
51 | | 6 | 232.0 | 33.6 | 198.5 | 198.93 | 28.77 | 170.16 |
52 | | 10 | 232.0 | 33.6 | 198.5 | 74.36 | 10.75 | 63.61 |
53 | | 11 | 334.4 | 116.4 | 218.0 | 107.17 | 37.31 | 69.86 |
54 | | 12 | 334.4 | 116.4 | 218.0 | 286.71 | 99.81 | 186.90 |
55 | | 13 | 334.4 | 116.4 | 218.0 | 393.88 | 137.12 | 256.76 |
56 | | 14 | 294.6 | 95.9 | 198.7 | 347.02 | 113.01 | 234.01 |
57 | | 15 | 232.0 | 33.6 | 198.5 | 273.28 | 39.52 | 233.77 |
58 |
59 | **Absolute difference in the values Δ**
60 |
61 | | | Δ T in °C | Δ p in bar | Δ e_T in kJ/kg | Δ e_M in kJ/kg |
62 | |:---|------------:|-------------:|-----------------:|-----------------:|
63 | | 1 | -0.0 | -0.00 | -0.0 | 0.0 |
64 | | 2 | -0.0 | 0.00 | -0.0 | 0.0 |
65 | | 3 | 0.1 | 0.00 | 0.0 | 0.0 |
66 | | 4 | 0.0 | 0.00 | 0.0 | 0.0 |
67 | | 5 | 0.2 | -0.00 | 0.0 | 0.0 |
68 | | 6 | -0.0 | 0.00 | -0.0 | -0.0 |
69 | | 10 | -0.0 | 0.00 | -0.0 | -0.0 |
70 | | 11 | 0.0 | 0.00 | -0.0 | 0.0 |
71 | | 12 | 0.0 | 0.00 | -0.0 | 0.0 |
72 | | 13 | 0.0 | 0.00 | -0.0 | 0.0 |
73 | | 14 | 0.0 | 0.00 | 0.0 | 0.0 |
74 | | 15 | -0.0 | 0.00 | -0.0 | -0.0 |
75 |
76 | **Relative deviation in the values δ**
77 |
78 | | | δ T in % | δ p in % | δ e_T in % | δ e_M in % |
79 | |:---|-----------:|-----------:|-------------:|-------------:|
80 | | 1 | -0.0 | -0.0 | -0.0 | 0.0 |
81 | | 2 | -0.0 | 0.0 | -0.0 | 0.0 |
82 | | 3 | 0.0 | 0.0 | 0.1 | 0.0 |
83 | | 4 | 0.0 | 0.0 | 0.1 | 0.0 |
84 | | 5 | 0.0 | -0.0 | 0.1 | 0.0 |
85 | | 6 | -0.0 | 0.0 | -0.0 | -0.0 |
86 | | 10 | -0.0 | 0.0 | -0.0 | -0.0 |
87 | | 11 | 0.0 | 0.0 | -0.0 | 0.0 |
88 | | 12 | 0.0 | 0.0 | -0.0 | 0.0 |
89 | | 13 | 0.0 | 0.0 | -0.0 | 0.0 |
90 | | 14 | 0.0 | 0.0 | 0.0 | 0.0 |
91 | | 15 | -0.0 | 0.0 | -0.0 | -0.0 |
92 |
93 | *Deviation due to differences in fluid property data*
94 |
95 | ### Component data
96 |
97 | **TESPy simulation**
98 |
99 | | | E_F in MW | E_P in MW | E_D in MW | ε in % | y_Dk in % | y*_Dk in % |
100 | |:--------------|------------:|------------:|------------:|---------:|------------:|-------------:|
101 | | Heater | 154.93 | 154.09 | 0.84 | 99.5 | 0.5 | 1.5 |
102 | | Cycle closer | nan | nan | nan | nan | nan | nan |
103 | | Water cooler | 22.28 | nan | 22.28 | nan | 14.4 | 40.6 |
104 | | Compressor 1 | 47.49 | 40.20 | 7.29 | 84.6 | 4.7 | 13.3 |
105 | | Recuperator 1 | 73.81 | 69.93 | 3.87 | 94.8 | 2.5 | 7.1 |
106 | | Recuperator 2 | 139.19 | 135.43 | 3.76 | 97.3 | 2.4 | 6.8 |
107 | | Turbine | 197.19 | 185.07 | 12.12 | 93.9 | 7.8 | 22.1 |
108 | | Splitter 1 | nan | nan | nan | nan | nan | nan |
109 | | Compressor 2 | 37.58 | 32.81 | 4.76 | 87.3 | 3.1 | 8.7 |
110 | | Merge 1 | 0.00 | 0.00 | 0.00 | 0.0 | 0.0 | 0.0 |
111 |
112 | **Absolute difference in the values Δ**
113 |
114 | | | Δ E_F in MW | Δ E_P in MW | Δ E_D in MW |
115 | |:--------------|--------------:|--------------:|--------------:|
116 | | Compressor 1 | -0.11 | -0.00 | -0.01 |
117 | | Compressor 2 | -0.12 | -0.09 | -0.04 |
118 | | Heater | -3.07 | -1.01 | -2.06 |
119 | | Recuperator 1 | -0.09 | -0.07 | -0.03 |
120 | | Recuperator 2 | -0.01 | 0.03 | -0.04 |
121 | | Turbine | -0.21 | -0.23 | -0.08 |
122 |
123 | **Relative deviation in the values δ**
124 |
125 | | | δ E_F in % | δ E_P in % | δ E_D in % |
126 | |:--------------|-------------:|-------------:|-------------:|
127 | | Compressor 1 | -0.23 | -0.00 | -0.09 |
128 | | Compressor 2 | -0.33 | -0.26 | -0.75 |
129 | | Heater | -1.94 | -0.65 | -71.11 |
130 | | Recuperator 1 | -0.12 | -0.09 | -0.65 |
131 | | Recuperator 2 | -0.01 | 0.02 | -0.99 |
132 | | Turbine | -0.11 | -0.12 | -0.63 |
133 |
134 | *High deviation due to differences in component exergy balances*
135 |
136 | ### Network data (results only)
137 |
138 | | E_F in MW | E_P in MW | E_D in MW | E_L in MW | ε in % |
139 | |------------:|------------:|------------:|------------:|---------:|
140 | | 154.93 | 100.00 | 54.93 | 0.00 | 64.5 |
141 |
142 | ## Citation
143 |
144 | The state of this repository is archived via zenodo. If you are using the
145 | TESPy model within your own research, you can refer to this model via the
146 | zenodo doi: [10.5281/zenodo.4751796][].
147 |
148 | ## MIT License
149 |
150 | Copyright (c) Francesco Witte, Julius Meier, Ilja Tuschy, Mathias Hofmann
151 |
152 | Permission is hereby granted, free of charge, to any person obtaining a copy
153 | of this software and associated documentation files (the "Software"), to deal
154 | in the Software without restriction, including without limitation the rights
155 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
156 | copies of the Software, and to permit persons to whom the Software is
157 | furnished to do so, subject to the following conditions:
158 |
159 | The above copyright notice and this permission notice shall be included in all
160 | copies or substantial portions of the Software.
161 |
162 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
163 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
164 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
165 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
166 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
167 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
168 | SOFTWARE.
169 |
170 |
171 | [TESPy]: https://github.com/oemof/tespy
172 | [online documentation]: https://tespy.readthedocs.io/
173 | [pdf model report]: sCO2_model_report.pdf
174 | [component_validation.csv]: component_validation.csv
175 | [connection_validation.csv]: connection_validation.csv
176 | [10.5281/zenodo.4751796]: https://zenodo.org/record/4751796
177 |
--------------------------------------------------------------------------------
/flowsheet.svg:
--------------------------------------------------------------------------------
1 |
2 |
693 |
--------------------------------------------------------------------------------