├── 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 | 21 | 23 | 26 | 30 | 34 | 35 | 41 | 51 | 52 | 85 | 95 | 96 | 98 | 99 | 101 | image/svg+xml 102 | 104 | 105 | 106 | 107 | 112 | 120 | 126 | 0 140 | 149 | 155 | 164 | G 178 | 186 | 191 | 198 | 205 | 212 | 213 | 219 | 226 | 230 | 231 | 241 | 247 | 254 | 258 | 259 | 265 | 272 | 276 | 277 | 282 | 289 | 294 | 299 | 300 | 301 | 307 | 313 | 319 | 324 | 331 | 338 | 345 | 346 | 352 | 358 | 364 | 370 | 376 | 382 | 391 | M 405 | 411 | 417 | 423 | 4 437 | 5 451 | 11 465 | 3 479 | 13 493 | 12 507 | 2 521 | 1 535 | 6 549 | 15 563 | 10 577 | 14 591 | 0 605 | Compressor 1 619 | Compressor 2 630 | Cooler 641 | Heater 652 | Recuperator 1 666 | Recuperator 2 680 | Turbine 691 | 692 | 693 | --------------------------------------------------------------------------------