diff --git a/.gitignore b/.gitignore index 7a97322..c1d93ff 100644 --- a/.gitignore +++ b/.gitignore @@ -51,10 +51,6 @@ coverage.xml .hypothesis/ .pytest_cache/ -# Translations -*.mo -*.pot - # Django stuff: *.log local_settings.py diff --git a/locales/dashboard.pot b/locales/dashboard.pot new file mode 100644 index 0000000..14a1d40 --- /dev/null +++ b/locales/dashboard.pot @@ -0,0 +1,658 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2024-09-27 11:07+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + + +#: src/heatpumps/hp_dashboard.py:23 src/heatpumps/hp_dashboard.py:36 +#: src/heatpumps/hp_dashboard.py:124 src/heatpumps/hp_dashboard.py:132 +msgid "Design" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:28 src/heatpumps/hp_dashboard.py:124 +msgid "Partload" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:77 +msgid "Parameter 'scale' must be either 'lin' or 'log'." +msgstr "" + +#: src/heatpumps/hp_dashboard.py:79 +msgid "is not allowed." +msgstr "" + +#: src/heatpumps/hp_dashboard.py:107 +msgid "Heat Pump Dashboard" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:123 +msgid "Select Mode" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:124 +msgid "Start" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:134 +msgid "Design of the Heat Pump" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:136 +msgid "Setup" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:138 +msgid "Base Topology" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:148 +msgid "Heat Pump Model" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:152 +msgid "Process Type" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:153 +msgid "subcritical" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:153 src/heatpumps/hp_dashboard.py:157 +msgid "transcritical" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:158 +msgid "Transcritical" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:183 src/heatpumps/hp_dashboard.py:193 +msgid "Internal Heat Exchange" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:185 +msgid "Superheating/Subcooling" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:197 +msgid "No. {i}: Superheating/Subcooling" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:206 src/heatpumps/hp_dashboard.py:848 +#: src/heatpumps/hp_dashboard.py:981 +msgid "Refrigerant" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:235 +msgid "Refrigerant (High Temperature Circuit)" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:254 +msgid "Refrigerant (Low Temperature Circuit)" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:274 +msgid "Transcritical Pressure" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:276 +msgid "Value in bar" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:285 +msgid "Thermal Nominal Power" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:287 +msgid "Value in MW" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:294 src/heatpumps/hp_dashboard.py:583 +msgid "Heat Source" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:296 src/heatpumps/hp_dashboard.py:336 +msgid "Forward Temperature" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:304 src/heatpumps/hp_dashboard.py:344 +msgid "Return Temperature" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:315 src/heatpumps/hp_dashboard.py:355 +msgid "The return temperature must be lower than the forward temperature." +msgstr "" + +#: src/heatpumps/hp_dashboard.py:330 src/heatpumps/hp_dashboard.py:636 +msgid "Heat Sink" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:362 +msgid "The temperature of the heat sink must be higher than the heat source." +msgstr "" + +#: src/heatpumps/hp_dashboard.py:367 +msgid "Compressor" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:371 +msgid "Efficiency $\\eta_s$" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:383 +msgid "Efficiency $\\eta_{s,1}$" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:394 +msgid "Efficiency $\\eta_{s,2}$" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:406 +msgid "Efficiency $\\eta_{s,HTK}$" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:417 +msgid "Efficiency $\\eta_{s,NTK}$" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:429 +msgid "Efficiency $\\eta_{s,HTK,1}$" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:440 +msgid "Efficiency $\\eta_{s,HTK,2}$" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:451 +msgid "Efficiency $\\eta_{s,NTK,1}$" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:462 +msgid "Efficiency $\\eta_{s,NTK,2}$" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:473 +msgid "Ambient Conditions (Exergy)" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:475 src/heatpumps/hp_dashboard.py:599 +#: src/heatpumps/hp_dashboard.py:652 +msgid "Temperature" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:484 +msgid "Pressure in bar" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:491 +msgid "Parameters for Cost Calculation" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:494 +msgid "Heat Transfer Coefficient (Evaporation)" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:504 +msgid "Heat Transfer Coefficient (Condensation)" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:515 +msgid "Heat Transfer Coefficient (Transcritical)" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:525 +msgid "Heat Transfer Coefficient (Miscellaneous)" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:535 +msgid "Residence Time Flash Tank" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:546 +msgid "🧮 Execute Design" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:551 src/heatpumps/hp_dashboard.py:555 +msgid "Part Load" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:553 +msgid "Part Load Simulation of the Heat Pump" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:560 +msgid "Relative to Nominal Mass Flow" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:586 src/heatpumps/hp_dashboard.py:591 +#: src/heatpumps/hp_dashboard.py:639 src/heatpumps/hp_dashboard.py:644 +msgid "Constant" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:586 src/heatpumps/hp_dashboard.py:605 +#: src/heatpumps/hp_dashboard.py:639 src/heatpumps/hp_dashboard.py:658 +msgid "Variable" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:607 src/heatpumps/hp_dashboard.py:660 +msgid "Start Temperature" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:616 src/heatpumps/hp_dashboard.py:669 +msgid "End Temperature" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:689 +msgid "🧮 Simulate Part Load" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:692 +msgid "*heatpumps*" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:697 +msgid "" +"\n" +" The heat pump simulator *heatpumps* is a powerful simulation software\n" +" for analyzing and evaluating heat pumps.\n" +"\n" +" This dashboard allows you to control a variety of complex\n" +" thermodynamic plant models using numerical methods via a\n" +" simple interface, without requiring expert knowledge.\n" +" This includes both the design of heat pumps\n" +" as well as the simulation of their steady-state part load operation. The\n" +" simulation results provide insights into the pump's behavior, COP,\n" +" state variables, and costs of individual components as well as\n" +" total investment costs. This enables access to complex questions\n" +" that frequently arise in the design and planning of heat pumps.\n" +"\n" +" ### Key Features\n" +"\n" +" - Steady-state design and part load simulation based on [TESPy](https://github.com/oemof/tespy)\n" +" - Parameterization and result visualization via a [Streamlit](https://github.com/streamlit/streamlit) dashboard\n" +" - Common circuit topologies used in industry, research, and development\n" +" - Subcritical and transcritical processes\n" +" - Large selection of working fluids thanks to [CoolProp](https://github.com/CoolProp/CoolProp) integration\n" +" " +msgstr "" + +#: src/heatpumps/hp_dashboard.py:723 +msgid "Start Design" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:727 +msgid "Used Software" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:729 +msgid "" +"\n" +" #### Used Software:\n" +"\n" +" The open-source software TESPy is used for modeling and simulating the systems.\n" +" Additionally, a number of other Python packages are used for data processing,\n" +" preparation, and visualization.\n" +"\n" +" ---\n" +"\n" +" #### TESPy:\n" +"\n" +" TESPy (Thermal Engineering Systems in Python) is a powerful\n" +" simulation tool for thermal process engineering, such as power plants,\n" +" district heating systems, or heat pumps. The TESPy package allows for\n" +" system design and steady-state operation simulation. After that,\n" +" part load behavior can be determined based on the characteristics of\n" +" each component of the system. The component-based structure combined\n" +" with the solution method offers great flexibility regarding the\n" +" system topology and parameterization. More information on TESPy can\n" +" be found in its [online documentation](https://tespy.readthedocs.io) (in English).\n" +"\n" +" #### Other Packages:\n" +"\n" +" - [Streamlit](https://docs.streamlit.io) (Graphical User Interface)\n" +" - [NumPy](https://numpy.org) (Data Processing)\n" +" - [pandas](https://pandas.pydata.org) (Data Processing)\n" +" - [SciPy](https://scipy.org/) (Interpolation)\n" +" - [scikit-learn](https://scikit-learn.org) (Regression)\n" +" - [Matplotlib](https://matplotlib.org) (Data Visualization)\n" +" - [FluProDia](https://fluprodia.readthedocs.io) (Data Visualization)\n" +" - [CoolProp](http://www.coolprop.org) (Fluid Properties)\n" +" " +msgstr "" + +#: src/heatpumps/hp_dashboard.py:765 +msgid "Disclaimer" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:767 +msgid "" +"\n" +" #### Simulation Results:\n" +"\n" +" Numerical simulations are calculations performed using appropriate\n" +" iterative methods based on the specified boundary conditions and parameters.\n" +" In some cases, it is not possible to account for all possible influences,\n" +" so deviations from real-world experience may occur and should be taken into\n" +" account when evaluating the results. The results provide sufficient to exact\n" +" insights into the heat pump's general behavior, COP, and state variables in\n" +" each component. Nevertheless, all information and results are provided\n" +" without guarantee.\n" +" " +msgstr "" + +#: src/heatpumps/hp_dashboard.py:783 +msgid "Copyright" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:785 +msgid "" +"\n" +" #### Software License\n" +" MIT License\n" +"\n" +" Copyright © 2023 Jonas Freißmann and Malte Fritz\n" +"\n" +" Permission is hereby granted, free of charge, to any person obtaining a copy\n" +" of this software and associated documentation files (the \"Software\"), to deal\n" +" in the Software without restriction, including without limitation the rights\n" +" to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n" +" copies of the Software, and to permit persons to whom the Software is\n" +" furnished to do so, subject to the following conditions:\n" +"\n" +" The above copyright notice and this permission notice shall be included in all\n" +" copies or substantial portions of the Software.\n" +"\n" +" THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n" +" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n" +" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n" +" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n" +" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n" +" OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n" +" SOFTWARE.\n" +" " +msgstr "" + +#: src/heatpumps/hp_dashboard.py:821 src/heatpumps/hp_dashboard.py:960 +msgid "Topology" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:853 src/heatpumps/hp_dashboard.py:986 +msgid "#### High-Temperature Circuit" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:855 src/heatpumps/hp_dashboard.py:988 +msgid "#### Low-Temperature Circuit" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:859 +msgid "" +"\n" +" All substance data and classifications from\n" +" [CoolProp](http://www.coolprop.org) or\n" +" [Arpagaus et al. (2018)](https://doi.org/10.1016/j.energy.2018.03.166)\n" +" " +msgstr "" + +#: src/heatpumps/hp_dashboard.py:868 +msgid "Instructions" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:870 +msgid "" +"\n" +" #### Instructions\n" +"\n" +" You are now on the design simulation interface\n" +" for your heat pump. In the left sidebar, next to the\n" +" dimensioning and the choice of refrigerant, several central parameters\n" +" for the cycle process must be specified.\n" +"\n" +" These include, for example, the temperatures of the heat source and sink,\n" +" but also the associated network pressures. Additionally, an internal\n" +" heat exchanger can be optionally added. The resulting superheat of the\n" +" evaporated refrigerant must also be specified.\n" +"\n" +" Once the design simulation is successfully completed, the\n" +" generated results are processed graphically in state diagrams\n" +" and quantified. Key metrics such as the coefficient of performance (COP),\n" +" as well as relevant heat flows and power outputs, will be shown.\n" +" Furthermore, thermodynamic state variables at each process step will\n" +" be listed in a table.\n" +"\n" +" After the design simulation, a button will appear allowing you to switch\n" +" to the partial load interface. This can also be done via the\n" +" dropdown menu in the sidebar. Information on how to perform\n" +" partial load simulations is available on the start page of this interface.\n" +" " +msgstr "" + +#: src/heatpumps/hp_dashboard.py:901 +msgid "Running simulation..." +msgstr "" + +#: src/heatpumps/hp_dashboard.py:905 +msgid "The heat pump design simulation was successful." +msgstr "" + +#: src/heatpumps/hp_dashboard.py:910 +msgid "" +"An error occurred during the heat pump simulation. Please correct the input parameters and try again.\n" +"\n" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:919 +msgid "Visualizing results..." +msgstr "" + +#: src/heatpumps/hp_dashboard.py:945 +msgid "Design Results" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:955 +msgid "Topology & Refrigerant" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:992 +msgid "" +"\n" +" All substance data and classifications from\n" +" [CoolProp](http://www.coolprop.org) or\n" +" [Arpagaus et al. (2018)](https://doi.org/10.1016/j.energy.2018.03.166)\n" +" " +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1001 +msgid "State Diagrams" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1013 +msgid "Log(p)-h Diagram" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1066 +msgid "T-s Diagram" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1117 +msgid "State Quantities" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1150 +msgid "m in kg/s" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1151 +msgid "p in bar" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1152 +msgid "h in kJ/kg" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1153 +msgid "T in °C" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1154 +msgid "v in m³/kg" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1155 +msgid "vol in m³/s" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1156 +msgid "s in kJ/(kgK)" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1162 +msgid "Economic Assessment" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1170 +msgid "Total Investment Costs" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1172 +msgid "Specific Investment Costs" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1179 +msgid "" +"\n" +" Methodology for cost calculation analogous to\n" +" [Kosmadakis et al. (2020)](https://doi.org/10.1016/j.enconman.2020.113488),\n" +" based on [Bejan et al. (1995)](https://www.wiley.com/en-us/Thermal+Design+and+Optimization-p-9780471584674).\n" +" " +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1188 +msgid "Exergy Assessment" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1190 +msgid "Results of the Exergy Analysis" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1194 +msgid "Epsilon" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1196 +msgid "E_F" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1197 +msgid "E_P" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1198 +msgid "E_D" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1199 +msgid "E_L" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1201 +msgid "Results by Component" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1217 +msgid "E_F in W" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1218 +msgid "E_P in W" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1219 +msgid "E_D in W" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1227 +msgid "Grassmann Diagram" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1236 +msgid "Waterfall Diagram" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1245 +msgid "" +"\n" +" Definitions and methodology of the exergy analysis based on\n" +" [Morosuk and Tsatsaronis (2019)](https://doi.org/10.1016/j.energy.2018.10.090),\n" +" its implementation in TESPy described in [Witte and Hofmann et al. (2022)](https://doi.org/10.3390/en15114087)\n" +" and pedagogically prepared in [Witte, Freißmann and Fritz (2023)](https://fwitte.github.io/TESPy_teaching_exergy/).\n" +" " +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1256 +msgid "To calculate the partial load, click on \"Simulate Partial Load\"." +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1261 +msgid "Simulate Partial Load" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1266 +msgid "Operating Characteristics" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1270 +msgid "" +"\n" +" To perform a partial load simulation, a heat pump must first be\n" +" designed. Please switch to the \"Design\" mode first.\n" +" " +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1281 +msgid "" +"\n" +" Parameterization of the partial load calculation:\n" +" + Percentage share of partial load\n" +" + Range of source temperature\n" +" + Range of sink temperature\n" +" " +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1294 +msgid "Partial load simulation is running... This may take a while." +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1301 +msgid "The simulation of the heat pump characteristics was successful." +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1306 +msgid "Results are being visualized..." +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1307 +msgid "Diagrams" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1325 src/heatpumps/hp_dashboard.py:1350 +#: src/heatpumps/hp_dashboard.py:1379 +msgid "Source Temperature" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1359 +msgid "Exergy Analysis Partial Load" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1389 +msgid "Design New Heat Pump" +msgstr "" diff --git a/locales/de/LC_MESSAGES/dashboard.mo b/locales/de/LC_MESSAGES/dashboard.mo new file mode 100644 index 0000000..ecc7bcf Binary files /dev/null and b/locales/de/LC_MESSAGES/dashboard.mo differ diff --git a/locales/de/LC_MESSAGES/dashboard.po b/locales/de/LC_MESSAGES/dashboard.po new file mode 100644 index 0000000..a0e25b8 --- /dev/null +++ b/locales/de/LC_MESSAGES/dashboard.po @@ -0,0 +1,795 @@ +# Heatpump dashboard. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2024-09-27 11:07+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + + +#: src/heatpumps/hp_dashboard.py:23 src/heatpumps/hp_dashboard.py:36 +#: src/heatpumps/hp_dashboard.py:124 src/heatpumps/hp_dashboard.py:132 +msgid "Design" +msgstr "Auslegung" + +#: src/heatpumps/hp_dashboard.py:28 src/heatpumps/hp_dashboard.py:124 +msgid "Partload" +msgstr "Teillast" + +#: src/heatpumps/hp_dashboard.py:77 +msgid "Parameter 'scale' must be either 'lin' or 'log'." +msgstr "Der Parameter 'scale' muss entweder 'lin' oder 'log' sein." + +#: src/heatpumps/hp_dashboard.py:79 +msgid "is not allowed." +msgstr "ist nicht erlaubt." + +#: src/heatpumps/hp_dashboard.py:107 +msgid "Heat Pump Dashboard" +msgstr "Wärmepumpen Dashboard" + +#: src/heatpumps/hp_dashboard.py:123 +msgid "Select Mode" +msgstr "Auslegung der Wärmepumpe" + +#: src/heatpumps/hp_dashboard.py:124 +msgid "Start" +msgstr "Start" + +#: src/heatpumps/hp_dashboard.py:134 +msgid "Design of the Heat Pump" +msgstr "Auslegung der Wärmepumpe" + +#: src/heatpumps/hp_dashboard.py:136 +msgid "Setup" +msgstr "Setup" + +#: src/heatpumps/hp_dashboard.py:138 +msgid "Base Topology" +msgstr "Grundtopologie" + +#: src/heatpumps/hp_dashboard.py:148 +msgid "Heat Pump Model" +msgstr "Wärmepumpenmodell" + +#: src/heatpumps/hp_dashboard.py:152 +msgid "Process Type" +msgstr "Prozessart" + +#: src/heatpumps/hp_dashboard.py:153 +msgid "subcritical" +msgstr "subkritisch" + +#: src/heatpumps/hp_dashboard.py:153 src/heatpumps/hp_dashboard.py:157 +msgid "transcritical" +msgstr "transkritisch" + +#: src/heatpumps/hp_dashboard.py:158 +msgid "Transcritical" +msgstr "Transkritisch" + +#: src/heatpumps/hp_dashboard.py:183 src/heatpumps/hp_dashboard.py:193 +msgid "Internal Heat Exchange" +msgstr "Interne Wärmerübertragung" + +#: src/heatpumps/hp_dashboard.py:185 +msgid "Superheating/Subcooling" +msgstr "Überhitzung/Unterkühlung" + +#: src/heatpumps/hp_dashboard.py:197 +msgid "No. {i}: Superheating/Subcooling" +msgstr "Nr. {i}: Überhitzung/Unterkühlung" + +#: src/heatpumps/hp_dashboard.py:206 src/heatpumps/hp_dashboard.py:848 +#: src/heatpumps/hp_dashboard.py:981 +msgid "Refrigerant" +msgstr "Kältemittel" + +#: src/heatpumps/hp_dashboard.py:235 +msgid "Refrigerant (High Temperature Circuit)" +msgstr "Kältemittel (Hochtemperaturkreis)" + +#: src/heatpumps/hp_dashboard.py:254 +msgid "Refrigerant (Low Temperature Circuit)" +msgstr "Kältemittel (Niedertemperaturkreis)" + +#: src/heatpumps/hp_dashboard.py:274 +msgid "Transcritical Pressure" +msgstr "Traskritischer Druck" + +#: src/heatpumps/hp_dashboard.py:276 +msgid "Value in bar" +msgstr "Wert in bar" + +#: src/heatpumps/hp_dashboard.py:285 +msgid "Thermal Nominal Power" +msgstr "Wärmequelle" + +#: src/heatpumps/hp_dashboard.py:287 +msgid "Value in MW" +msgstr "Wert in MW" + +#: src/heatpumps/hp_dashboard.py:294 src/heatpumps/hp_dashboard.py:583 +msgid "Heat Source" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:296 src/heatpumps/hp_dashboard.py:336 +msgid "Forward Temperature" +msgstr "Temperatur Vorlauf" + +#: src/heatpumps/hp_dashboard.py:304 src/heatpumps/hp_dashboard.py:344 +msgid "Return Temperature" +msgstr "Temperatur Rücklauf" + +#: src/heatpumps/hp_dashboard.py:315 src/heatpumps/hp_dashboard.py:355 +msgid "The return temperature must be lower than the forward temperature." +msgstr "Die Rücklauftemperatur muss niedriger sein, als die Vorlauftemperatur" + +#: src/heatpumps/hp_dashboard.py:330 src/heatpumps/hp_dashboard.py:636 +msgid "Heat Sink" +msgstr "Wärmesenke" + +#: src/heatpumps/hp_dashboard.py:362 +msgid "The temperature of the heat sink must be higher than the heat source." +msgstr "Die Temperatur der Wärmesenke muss höher sein, als die der Wärmequelle." + +#: src/heatpumps/hp_dashboard.py:367 +msgid "Compressor" +msgstr "Verdichter" + +#: src/heatpumps/hp_dashboard.py:371 +msgid "Efficiency $\\eta_s$" +msgstr "Wirkungsgrad $\\eta_s$" + +#: src/heatpumps/hp_dashboard.py:383 +msgid "Efficiency $\\eta_{s,1}$" +msgstr "Wirkungsgrad $\\eta_{s,1}$" + +#: src/heatpumps/hp_dashboard.py:394 +msgid "Efficiency $\\eta_{s,2}$" +msgstr "Wirkungsgrad $\\eta_{s,2}" + +#: src/heatpumps/hp_dashboard.py:406 +msgid "Efficiency $\\eta_{s,HTK}$" +msgstr "Wirkungsgrad $\\eta_{s,HTK}$" + +#: src/heatpumps/hp_dashboard.py:417 +msgid "Efficiency $\\eta_{s,NTK}$" +msgstr "Wirkungsgrad $\\eta_{s,NTK}$" + +#: src/heatpumps/hp_dashboard.py:429 +msgid "Efficiency $\\eta_{s,HTK,1}$" +msgstr "Wirkungsgrad $\\eta_{s,HTK,1}$" + +#: src/heatpumps/hp_dashboard.py:440 +msgid "Efficiency $\\eta_{s,HTK,2}$" +msgstr "Wirkungsgrad $\\eta_{s,HTK,2}$" + +#: src/heatpumps/hp_dashboard.py:451 +msgid "Efficiency $\\eta_{s,NTK,1}$" +msgstr "Wirkungsgrad $\\eta_{s,NTK,1}$" + +#: src/heatpumps/hp_dashboard.py:462 +msgid "Efficiency $\\eta_{s,NTK,2}$" +msgstr "Wirkungsgrad $\\eta_{s,NTK,2}$" + +#: src/heatpumps/hp_dashboard.py:473 +msgid "Ambient Conditions (Exergy)" +msgstr "Umgebungsbedingungen (Exergie)" + +#: src/heatpumps/hp_dashboard.py:475 src/heatpumps/hp_dashboard.py:599 +#: src/heatpumps/hp_dashboard.py:652 +msgid "Temperature" +msgstr "Temperatur" + +#: src/heatpumps/hp_dashboard.py:484 +msgid "Pressure in bar" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:491 +msgid "Parameters for Cost Calculation" +msgstr "Parameter zur Kostenkalkulation" + +#: src/heatpumps/hp_dashboard.py:494 +msgid "Heat Transfer Coefficient (Evaporation)" +msgstr "Wärmedurchgangskoeffizient (Verdampfung)" + +#: src/heatpumps/hp_dashboard.py:504 +msgid "Heat Transfer Coefficient (Condensation)" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:515 +msgid "Heat Transfer Coefficient (Transcritical)" +msgstr "Wärmedurchgangskoeffizient (Transkritisch)" + +#: src/heatpumps/hp_dashboard.py:525 +msgid "Heat Transfer Coefficient (Miscellaneous)" +msgstr "Wärmedurchgangskoeffizient (Sonstige)" + +#: src/heatpumps/hp_dashboard.py:535 +msgid "Residence Time Flash Tank" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:546 +msgid "🧮 Execute Design" +msgstr "🧮 Auslegung ausführen" + +#: src/heatpumps/hp_dashboard.py:551 src/heatpumps/hp_dashboard.py:555 +msgid "Part Load" +msgstr "Teillast" + +#: src/heatpumps/hp_dashboard.py:553 +msgid "Part Load Simulation of the Heat Pump" +msgstr "Teillastsimulation der Wärmepumpe" + +#: src/heatpumps/hp_dashboard.py:560 +msgid "Relative to Nominal Mass Flow" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:586 src/heatpumps/hp_dashboard.py:591 +#: src/heatpumps/hp_dashboard.py:639 src/heatpumps/hp_dashboard.py:644 +msgid "Constant" +msgstr "Konstant" + +#: src/heatpumps/hp_dashboard.py:586 src/heatpumps/hp_dashboard.py:605 +#: src/heatpumps/hp_dashboard.py:639 src/heatpumps/hp_dashboard.py:658 +msgid "Variable" +msgstr "Variabel" + +#: src/heatpumps/hp_dashboard.py:607 src/heatpumps/hp_dashboard.py:660 +msgid "Start Temperature" +msgstr "Starttemperatur" + +#: src/heatpumps/hp_dashboard.py:616 src/heatpumps/hp_dashboard.py:669 +msgid "End Temperature" +msgstr "Endtemperatur" + +#: src/heatpumps/hp_dashboard.py:689 +msgid "🧮 Simulate Part Load" +msgstr "🧮 Teillast simulieren" + +#: src/heatpumps/hp_dashboard.py:692 +msgid "*heatpumps*" +msgstr "*Wärmepumpe*" + +#: src/heatpumps/hp_dashboard.py:697 +msgid "" +"\n" +" The heat pump simulator *heatpumps* is a powerful simulation software\n" +" for analyzing and evaluating heat pumps.\n" +"\n" +" This dashboard allows you to control a variety of complex\n" +" thermodynamic plant models using numerical methods via a\n" +" simple interface, without requiring expert knowledge.\n" +" This includes both the design of heat pumps\n" +" as well as the simulation of their steady-state part load operation. The\n" +" simulation results provide insights into the pump's behavior, COP,\n" +" state variables, and costs of individual components as well as\n" +" total investment costs. This enables access to complex questions\n" +" that frequently arise in the design and planning of heat pumps.\n" +"\n" +" ### Key Features\n" +"\n" +" - Steady-state design and part load simulation based on [TESPy](https://github.com/oemof/tespy)\n" +" - Parameterization and result visualization via a [Streamlit](https://github.com/streamlit/streamlit) dashboard\n" +" - Common circuit topologies used in industry, research, and development\n" +" - Subcritical and transcritical processes\n" +" - Large selection of working fluids thanks to [CoolProp](https://github.com/CoolProp/CoolProp) integration\n" +" " +msgstr "" +"\n" +" Der Wärmepumpensimulator *heatpumps* ist eine leistungsfähige Simulationssoftware\n" +" zur Analyse und Bewertung von Wärmepumpen.\n" +"\n" +" Mit diesem Dashboard lassen sich eine Vielzahl komplexer\n" +" thermodynamischer Anlagenmodelle mithilfe numerischer Methoden über eine\n" +" einfache Oberfläche steuern, ohne Fachkenntnisse über diese\n" +" vorauszusetzen. Dies beinhaltet sowohl die Auslegung von Wärmepumpen,\n" +" als auch die Simulation ihres stationären Teillastbetriebs. Dabei geben\n" +" die Ergebnisse der Simulationen Aufschluss über das prinzipielle\n" +" Verhalten, den COP, Zustandsgrößen und Kosten der einzelnen Komponenten\n" +" sowie Gesamtinvestitionskosten der betrachteten Wärmepumpe. Damit\n" +" wird Zugang zu komplexen Fragestellungen ermöglicht, die regelmäßig in\n" +" der Konzeption und Planung von Wärmepumpen aufkommen.\n" +"\n" +" ### Key Features\n" +"\n" +" - Stationäre Auslegungs- und Teillastsimulation basierend auf [TESPy](https://github.com/oemof/tespy)\n" +" - Parametrisierung and Ergebnisvisualisierung mithilfe eines [Streamlit](https://github.com/streamlit/streamlit) Dashboards\n" +" - In der Industrie, Forschung und Entwicklung gängige Schaltungstopologien\n" +" - Sub- und transkritische Prozesse\n" +" - Große Auswahl an Arbeitsmedien aufgrund der Integration von [CoolProp](https://github.com/CoolProp/CoolProp)\n" +" " + +#: src/heatpumps/hp_dashboard.py:723 +msgid "Start Design" +msgstr "Auslegung starten" + +#: src/heatpumps/hp_dashboard.py:727 +msgid "Used Software" +msgstr "Verwendete Software" + +#: src/heatpumps/hp_dashboard.py:729 +msgid "" +"\n" +" #### Used Software:\n" +"\n" +" The open-source software TESPy is used for modeling and simulating the systems.\n" +" Additionally, a number of other Python packages are used for data processing,\n" +" preparation, and visualization.\n" +"\n" +" ---\n" +"\n" +" #### TESPy:\n" +"\n" +" TESPy (Thermal Engineering Systems in Python) is a powerful\n" +" simulation tool for thermal process engineering, such as power plants,\n" +" district heating systems, or heat pumps. The TESPy package allows for\n" +" system design and steady-state operation simulation. After that,\n" +" part load behavior can be determined based on the characteristics of\n" +" each component of the system. The component-based structure combined\n" +" with the solution method offers great flexibility regarding the\n" +" system topology and parameterization. More information on TESPy can\n" +" be found in its [online documentation](https://tespy.readthedocs.io) (in English).\n" +"\n" +" #### Other Packages:\n" +"\n" +" - [Streamlit](https://docs.streamlit.io) (Graphical User Interface)\n" +" - [NumPy](https://numpy.org) (Data Processing)\n" +" - [pandas](https://pandas.pydata.org) (Data Processing)\n" +" - [SciPy](https://scipy.org/) (Interpolation)\n" +" - [scikit-learn](https://scikit-learn.org) (Regression)\n" +" - [Matplotlib](https://matplotlib.org) (Data Visualization)\n" +" - [FluProDia](https://fluprodia.readthedocs.io) (Data Visualization)\n" +" - [CoolProp](http://www.coolprop.org) (Fluid Properties)\n" +" " +msgstr "" +"\n" +" #### Verwendete Software:\n" +"\n" +" Zur Modellerstellung und Berechnung der Simulationen wird die\n" +" Open Source Software TESPy verwendet. Des Weiteren werden\n" +" eine Reihe weiterer Pythonpakete zur Datenverarbeitung,\n" +" -aufbereitung und -visualisierung genutzt.\n" +"\n" +" ---\n" +"\n" +" #### TESPy:\n" +"\n" +" TESPy (Thermal Engineering Systems in Python) ist ein\n" +" leistungsfähiges Simulationswerkzeug für thermische\n" +" Verfahrenstechnik, zum Beispiel für Kraftwerke,\n" +" Fernwärmesysteme oder Wärmepumpen. Mit dem TESPy-Paket ist es\n" +" möglich, Anlagen auszulegen und den stationären Betrieb zu\n" +" simulieren. Danach kann das Teillastverhalten anhand der\n" +" zugrundeliegenden Charakteristiken für jede Komponente der\n" +" Anlage ermittelt werden. Die komponentenbasierte Struktur in\n" +" Kombination mit der Lösungsmethode bieten eine sehr hohe\n" +" Flexibilität hinsichtlich der Anlagentopologie und der\n" +" Parametrisierung. Weitere Informationen zu TESPy sind in dessen\n" +" [Onlinedokumentation](https://tespy.readthedocs.io) in\n" +" englischer Sprache zu finden.\n" +"\n" +" #### Weitere Pakete:\n" +"\n" +" - [Streamlit](https://docs.streamlit.io) (Graphische Oberfläche)\n" +" - [NumPy](https://numpy.org) (Datenverarbeitung)\n" +" - [pandas](https://pandas.pydata.org) (Datenverarbeitung)\n" +" - [SciPy](https://scipy.org/) (Interpolation)\n" +" - [scikit-learn](https://scikit-learn.org) (Regression)\n" +" - [Matplotlib](https://matplotlib.org) (Datenvisualisierung)\n" +" - [FluProDia](https://fluprodia.readthedocs.io) (Datenvisualisierung)\n" +" - [CoolProp](http://www.coolprop.org) (Stoffdaten)\n" +" " +#: src/heatpumps/hp_dashboard.py:765 +msgid "Disclaimer" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:767 +msgid "" +"\n" +" #### Simulation Results:\n" +"\n" +" Numerical simulations are calculations performed using appropriate\n" +" iterative methods based on the specified boundary conditions and parameters.\n" +" In some cases, it is not possible to account for all possible influences,\n" +" so deviations from real-world experience may occur and should be taken into\n" +" account when evaluating the results. The results provide sufficient to exact\n" +" insights into the heat pump's general behavior, COP, and state variables in\n" +" each component. Nevertheless, all information and results are provided\n" +" without guarantee.\n" +" " +msgstr "" +"\n" +" #### Simulationsergebnisse:\n" +"\n" +" Numerische Simulationen sind Berechnungen mittels geeigneter\n" +" Iterationsverfahren in Bezug auf die vorgegebenen und gesetzten\n" +" Randbedingungen und Parameter. Eine Berücksichtigung aller\n" +" möglichen Einflüsse ist in Einzelfällen nicht möglich, so dass\n" +" Abweichungen zu Erfahrungswerten aus Praxisanwendungen\n" +" entstehen können und bei der Bewertung berücksichtigt werden\n" +" müssen. Die Ergebnisse geben hinreichenden bis genauen\n" +" Aufschluss über das prinzipielle Verhalten, den COP und\n" +" Zustandsgrößen in den einzelnen Komponenten der Wärmepumpe.\n" +" Dennoch sind alle Angaben und Ergebnisse ohne Gewähr.\n" +" " + +#: src/heatpumps/hp_dashboard.py:783 +msgid "Copyright" +msgstr "Urheberrecht" + +#: src/heatpumps/hp_dashboard.py:785 +msgid "" +"\n" +" #### Software License\n" +" MIT License\n" +"\n" +" Copyright © 2023 Jonas Freißmann and Malte Fritz\n" +"\n" +" Permission is hereby granted, free of charge, to any person obtaining a copy\n" +" of this software and associated documentation files (the \"Software\"), to deal\n" +" in the Software without restriction, including without limitation the rights\n" +" to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n" +" copies of the Software, and to permit persons to whom the Software is\n" +" furnished to do so, subject to the following conditions:\n" +"\n" +" The above copyright notice and this permission notice shall be included in all\n" +" copies or substantial portions of the Software.\n" +"\n" +" THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n" +" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n" +" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n" +" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n" +" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n" +" OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n" +" SOFTWARE.\n" +" " +msgstr "" + +#: src/heatpumps/hp_dashboard.py:821 src/heatpumps/hp_dashboard.py:960 +msgid "Topology" +msgstr "Topologie" + +#: src/heatpumps/hp_dashboard.py:853 src/heatpumps/hp_dashboard.py:986 +msgid "#### High-Temperature Circuit" +msgstr "#### Hochtemperaturkreis" + +#: src/heatpumps/hp_dashboard.py:855 src/heatpumps/hp_dashboard.py:988 +msgid "#### Low-Temperature Circuit" +msgstr "#### Niedertemperaturkreis" + +#: src/heatpumps/hp_dashboard.py:859 +msgid "" +"\n" +" All substance data and classifications from\n" +" [CoolProp](http://www.coolprop.org) or\n" +" [Arpagaus et al. (2018)](https://doi.org/10.1016/j.energy.2018.03.166)\n" +" " +msgstr "" +"\n" +" Alle Stoffdaten und Klassifikationen aus\n" +" [CoolProp](http://www.coolprop.org) oder\n" +" [Arpagaus et al. (2018)](https://doi.org/10.1016/j.energy.2018.03.166)\n" +" " + +#: src/heatpumps/hp_dashboard.py:868 +msgid "Instructions" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:870 +msgid "" +"\n" +" #### Instructions\n" +"\n" +" You are now on the design simulation interface\n" +" for your heat pump. In the left sidebar, next to the\n" +" dimensioning and the choice of refrigerant, several central parameters\n" +" for the cycle process must be specified.\n" +"\n" +" These include, for example, the temperatures of the heat source and sink,\n" +" but also the associated network pressures. Additionally, an internal\n" +" heat exchanger can be optionally added. The resulting superheat of the\n" +" evaporated refrigerant must also be specified.\n" +"\n" +" Once the design simulation is successfully completed, the\n" +" generated results are processed graphically in state diagrams\n" +" and quantified. Key metrics such as the coefficient of performance (COP),\n" +" as well as relevant heat flows and power outputs, will be shown.\n" +" Furthermore, thermodynamic state variables at each process step will\n" +" be listed in a table.\n" +"\n" +" After the design simulation, a button will appear allowing you to switch\n" +" to the partial load interface. This can also be done via the\n" +" dropdown menu in the sidebar. Information on how to perform\n" +" partial load simulations is available on the start page of this interface.\n" +" " +msgstr "" +"\n" +" #### Anleitung\n" +"\n" +" Sie befinden sich auf der Oberfläche zur Auslegungssimulation\n" +" Ihrer Wärmepumpe. Dazu sind links in der Sidebar neben der\n" +" Dimensionierung und der Wahl des zu verwendenden Kältemittels\n" +" verschiedene zentrale Parameter des Kreisprozesse vorzugeben.\n" +"\n" +" Dies sind zum Beispiel die Temperaturen der Wärmequelle und -senke,\n" +" aber auch die dazugehörigen Netzdrücke. Darüber hinaus kann\n" +" optional ein interner Wärmeübertrager hinzugefügt werden. Dazu ist\n" +" weiterhin die resultierende Überhitzung des verdampften\n" +" Kältemittels vorzugeben.\n" +"\n" +" Ist die Auslegungssimulation erfolgreich abgeschlossen, werden die\n" +" generierten Ergebnisse graphisch in Zustandsdiagrammen\n" +" aufgearbeitet und quantifiziert. Die zentralen Größen wie die\n" +" Leistungszahl (COP) sowie die relevanten Wärmeströme und Leistung\n" +" werden aufgeführt. Darüber hinaus werden die thermodynamischen\n" +" Zustandsgrößen in allen Prozessschritten tabellarisch aufgelistet.\n" +"\n" +" Im Anschluss an die Auslegungsimulation erscheint ein Knopf zum\n" +" Wechseln in die Teillastoberfläche. Dies kann ebenfalls über das\n" +" Dropdownmenü in der Sidebar erfolgen. Informationen zur\n" +" Durchführung der Teillastsimulationen befindet sich auf der\n" +" Startseite dieser Oberfläche.\n" +" " + +#: src/heatpumps/hp_dashboard.py:901 +msgid "Running simulation..." +msgstr "Simulation wird durchgeführt..." + +#: src/heatpumps/hp_dashboard.py:905 +msgid "The heat pump design simulation was successful." +msgstr "Die Simulation der Wärmepumpenauslegung war erfolgreich." + +#: src/heatpumps/hp_dashboard.py:910 +msgid "" +"An error occurred during the heat pump simulation. Please correct the input parameters and try again.\n" +"\n" +msgstr "" +"Bei der Simulation der Wärmepumpe ist der nachfolgende Fehler aufgetreten. Bitte korrigieren Sie die Eingangsparameter und versuchen es erneut.\n\n" +"\n" + +#: src/heatpumps/hp_dashboard.py:919 +msgid "Visualizing results..." +msgstr "Ergebnisse werden visualisiert..." + +#: src/heatpumps/hp_dashboard.py:945 +msgid "Design Results" +msgstr "Ergebnisse der Auslegung" + +#: src/heatpumps/hp_dashboard.py:955 +msgid "Topology & Refrigerant" +msgstr "Topologie & Kältemittel" + +#: src/heatpumps/hp_dashboard.py:992 +msgid "" +"\n" +" All substance data and classifications from\n" +" [CoolProp](http://www.coolprop.org) or\n" +" [Arpagaus et al. (2018)](https://doi.org/10.1016/j.energy.2018.03.166)\n" +" " +msgstr "" +"\n" +" Alle Stoffdaten und Klassifikationen aus\n" +" [CoolProp](http://www.coolprop.org) oder\n" +" [Arpagaus et al. (2018)](https://doi.org/10.1016/j.energy.2018.03.166)\n" +" " + +#: src/heatpumps/hp_dashboard.py:1001 +msgid "State Diagrams" +msgstr "Zustandsdiagramme" + +#: src/heatpumps/hp_dashboard.py:1013 +msgid "Log(p)-h Diagram" +msgstr "Log(p)-h Diagramm" + +#: src/heatpumps/hp_dashboard.py:1066 +msgid "T-s Diagram" +msgstr "T-s Diagramm" + +#: src/heatpumps/hp_dashboard.py:1117 +msgid "State Quantities" +msgstr "Zustandsgrößen" + +#: src/heatpumps/hp_dashboard.py:1150 +msgid "m in kg/s" +msgstr "m in kg/s" + +#: src/heatpumps/hp_dashboard.py:1151 +msgid "p in bar" +msgstr "p in bar" + +#: src/heatpumps/hp_dashboard.py:1152 +msgid "h in kJ/kg" +msgstr "h in kJ/kg" + +#: src/heatpumps/hp_dashboard.py:1153 +msgid "T in °C" +msgstr "T in °C" + +#: src/heatpumps/hp_dashboard.py:1154 +msgid "v in m³/kg" +msgstr "v in m³/kg" + +#: src/heatpumps/hp_dashboard.py:1155 +msgid "vol in m³/s" +msgstr "vol in m³/s" + +#: src/heatpumps/hp_dashboard.py:1156 +msgid "s in kJ/(kgK)" +msgstr "s in kJ/(kgK)" + +#: src/heatpumps/hp_dashboard.py:1162 +msgid "Economic Assessment" +msgstr "Ökonomische Bewertung" + +#: src/heatpumps/hp_dashboard.py:1170 +msgid "Total Investment Costs" +msgstr "Gesamtinvestitionskosten" + +#: src/heatpumps/hp_dashboard.py:1172 +msgid "Specific Investment Costs" +msgstr "Spez. Investitionskosten" + +#: src/heatpumps/hp_dashboard.py:1179 +msgid "" +"\n" +" Methodology for cost calculation analogous to\n" +" [Kosmadakis et al. (2020)](https://doi.org/10.1016/j.enconman.2020.113488),\n" +" based on [Bejan et al. (1995)](https://www.wiley.com/en-us/Thermal+Design+and+Optimization-p-9780471584674).\n" +" " +msgstr "" +"\n" +" Methodik zur Berechnung der Kosten analog zu\n" +" [Kosmadakis et al. (2020)](https://doi.org/10.1016/j.enconman.2020.113488),\n" +" basierend auf [Bejan et al. (1995)](https://www.wiley.com/en-us/Thermal+Design+and+Optimization-p-9780471584674).\n" +" " + + +#: src/heatpumps/hp_dashboard.py:1188 +msgid "Exergy Assessment" +msgstr "Exergiebewertung" + +#: src/heatpumps/hp_dashboard.py:1190 +msgid "Results of the Exergy Analysis" +msgstr "Ergebnisse der Exergieanalyse" + +#: src/heatpumps/hp_dashboard.py:1194 +msgid "Epsilon" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1196 +msgid "E_F" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1197 +msgid "E_P" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1198 +msgid "E_D" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1199 +msgid "E_L" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1201 +msgid "Results by Component" +msgstr "Ergebnisse nach Komponente" + +#: src/heatpumps/hp_dashboard.py:1217 +msgid "E_F in W" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1218 +msgid "E_P in W" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1219 +msgid "E_D in W" +msgstr "" + +#: src/heatpumps/hp_dashboard.py:1227 +msgid "Grassmann Diagram" +msgstr "Grassmann Diagramm" + +#: src/heatpumps/hp_dashboard.py:1236 +msgid "Waterfall Diagram" +msgstr "Wasserfall Diagramm" + +#: src/heatpumps/hp_dashboard.py:1245 +msgid "" +"\n" +" Definitions and methodology of the exergy analysis based on\n" +" [Morosuk and Tsatsaronis (2019)](https://doi.org/10.1016/j.energy.2018.10.090),\n" +" its implementation in TESPy described in [Witte and Hofmann et al. (2022)](https://doi.org/10.3390/en15114087)\n" +" and pedagogically prepared in [Witte, Freißmann and Fritz (2023)](https://fwitte.github.io/TESPy_teaching_exergy/).\n" +" " +msgstr "" +"\n" +" Definitionen und Methodik der Exergieanalyse basierend auf\n" +" [Morosuk und Tsatsaronis (2019)](https://doi.org/10.1016/j.energy.2018.10.090),\n" +" dessen Implementation in TESPy beschrieben in [Witte und Hofmann et al. (2022)](https://doi.org/10.3390/en15114087)\n" +" und didaktisch aufbereitet in [Witte, Freißmann und Fritz (2023)](https://fwitte.github.io/TESPy_teaching_exergy/).\n" +" " + + + +#: src/heatpumps/hp_dashboard.py:1256 +msgid "To calculate the partial load, click on \"Simulate Partial Load\"." +msgstr "Um die Teillast zu berechnen, drücke auf \"Teillast simulieren\"." + +#: src/heatpumps/hp_dashboard.py:1261 +msgid "Simulate Partial Load" +msgstr "Teillast simulieren" + +#: src/heatpumps/hp_dashboard.py:1266 +msgid "Operating Characteristics" +msgstr "Betriebscharakteristik" + +#: src/heatpumps/hp_dashboard.py:1270 +msgid "" +"\n" +" To perform a partial load simulation, a heat pump must first be\n" +" designed. Please switch to the \"Design\" mode first.\n" +" " +msgstr "" +"\n" +" Um eine Teillastsimulation durchzuführen, muss zunächst eine\n" +" Wärmepumpe ausgelegt werden. Wechseln Sie bitte zunächst in den\n" +" Modus \"Auslegung\".\n" +" " + +#: src/heatpumps/hp_dashboard.py:1281 +msgid "" +"\n" +" Parameterization of the partial load calculation:\n" +" + Percentage share of partial load\n" +" + Range of source temperature\n" +" + Range of sink temperature\n" +" " +msgstr "" +"\n" +" Parametrisierung der Teillastberechnung:\n" +" + Prozentualer Anteil Teillast\n" +" + Bereich der Quelltemperatur\n" +" + Bereich der Senkentemperatur\n" +" " + + +#: src/heatpumps/hp_dashboard.py:1294 +msgid "Partial load simulation is running... This may take a while." +msgstr "Teillastsimulation wird durchgeführt... Dies kann eine Weile dauern." + +#: src/heatpumps/hp_dashboard.py:1301 +msgid "The simulation of the heat pump characteristics was successful." +msgstr "Die Simulation der Wärmepumpencharakteristika war erfolgreich." + +#: src/heatpumps/hp_dashboard.py:1306 +msgid "Results are being visualized..." +msgstr "Ergebnisse werden visualisiert..." + +#: src/heatpumps/hp_dashboard.py:1307 +msgid "Diagrams" +msgstr "Diagramme" + +#: src/heatpumps/hp_dashboard.py:1325 src/heatpumps/hp_dashboard.py:1350 +#: src/heatpumps/hp_dashboard.py:1379 +msgid "Source Temperature" +msgstr "Quellentemperatur" + +#: src/heatpumps/hp_dashboard.py:1359 +msgid "Exergy Analysis Partial Load" +msgstr "Exergieanalyse Teillast" + +#: src/heatpumps/hp_dashboard.py:1389 +msgid "Design New Heat Pump" +msgstr "Neue Wärmepumpe auslegen" + diff --git a/locales/de/LC_MESSAGES/variables.mo b/locales/de/LC_MESSAGES/variables.mo new file mode 100644 index 0000000..68ca13a Binary files /dev/null and b/locales/de/LC_MESSAGES/variables.mo differ diff --git a/locales/de/LC_MESSAGES/variables.po b/locales/de/LC_MESSAGES/variables.po new file mode 100644 index 0000000..ae5489d --- /dev/null +++ b/locales/de/LC_MESSAGES/variables.po @@ -0,0 +1,70 @@ +# Heatpump dashboard. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2024-09-27 11:07+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + +msgid "Simple cycle" +msgstr "Einfacher Zyklus" + +msgid "Intercooler" +msgstr "Zwischenkühler" + +msgid "Economizer" +msgstr "Wärmetauscher" + +msgid "Flashtank" +msgstr "Entspannungsbehälter" + +msgid "Cascade cycle" +msgstr "Kaskadenzyklus" + +msgid "General" +msgstr "Allgemein" + +msgid "Closed" +msgstr "Geschlossen" + +msgid "Double Internal Heat Exchanger" +msgstr "Doppelte interne WÜT" + +msgid "Internal Heat Exchanger" +msgstr "Interne WÜT" + +msgid "Internal Heat Exchanger (Variant A)" +msgstr "Interne WÜT (Variant A)" + +msgid "Internal Heat Exchanger (Variant B)" +msgstr "Interne WÜT (Variant B)" + +msgid "Open" +msgstr "Offen" + +msgid "Parallel Connection" +msgstr "Parallelschaltung" + +msgid "Serial Connection" +msgstr "Serielle Verbindung" + +msgid "Transcritical" +msgstr "Transkritisch" + +msgid "open" +msgstr "offen" + +msgid "closed" +msgstr "geschlossen" + +msgid "series" +msgstr "Reihenschaltung" + +msgid "parallel" +msgstr "Parallelschaltung" diff --git a/locales/variables.pot b/locales/variables.pot new file mode 100644 index 0000000..7aa080c --- /dev/null +++ b/locales/variables.pot @@ -0,0 +1,70 @@ +# Heatpump dashboard. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2024-09-27 11:07+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" + +msgid "Simple cycle" +msgstr "" + +msgid "Intercooler" +msgstr "" + +msgid "Economizer" +msgstr "" + +msgid "Flashtank" +msgstr "" + +msgid "Cascade cycle" +msgstr "" + +msgid "General" +msgstr "" + +msgid "Closed" +msgstr "" + +msgid "Double Internal Heat Exchanger" +msgstr "" + +msgid "Internal Heat Exchanger" +msgstr "" + +msgid "Internal Heat Exchanger (Variant A)" +msgstr "" + +msgid "Internal Heat Exchanger (Variant B)" +msgstr "" + +msgid "Open" +msgstr "" + +msgid "Parallel Connection" +msgstr "" + +msgid "Serial Connection" +msgstr "" + +msgid "Transcritical" +msgstr "" + +msgid "open" +msgstr "" + +msgid "closed" +msgstr "" + +msgid "series" +msgstr "" + +msgid "parallel" +msgstr "" diff --git a/src/heatpumps/hp_dashboard.py b/src/heatpumps/hp_dashboard.py index efd19d2..2d2c3e2 100644 --- a/src/heatpumps/hp_dashboard.py +++ b/src/heatpumps/hp_dashboard.py @@ -1,25 +1,33 @@ +import gettext import json import os +import pathlib import darkdetect -import matplotlib.pyplot as plt import numpy as np import pandas as pd import streamlit as st import variables as var -from CoolProp.CoolProp import PropsSI as PSI from simulation import run_design, run_partload from streamlit import session_state as ss +__PRJDIR = pathlib.Path(__file__).parent.parent.absolute() +LOCDIR = __PRJDIR / "locales" + +# Initialize gettext +gettext.bindtextdomain("dashboard", localedir=LOCDIR) +gettext.textdomain("dashboard") +_ = gettext.gettext + def switch2design(): """Switch to design simulation tab.""" - ss.select = 'Auslegung' + ss.select = _("Design") def switch2partload(): """Switch to partload simulation tab.""" - ss.select = 'Teillast' + ss.select = _("Partload") def reset2design(): @@ -27,61 +35,61 @@ def reset2design(): keys = list(ss.keys()) for key in keys: ss.pop(key) - ss.select = 'Auslegung' + ss.select = _("Design") def info_df(label, refrigs): - """Create Dataframe with info of chosen refrigerant.""" + """Create DataFrame with info of chosen refrigerant.""" df_refrig = pd.DataFrame( - columns=['Typ', 'T_NBP', 'T_krit', 'p_krit', 'SK', 'ODP', 'GWP'] - ) - df_refrig.loc[label, 'Typ'] = refrigs[label]['type'] - df_refrig.loc[label, 'T_NBP'] = str(refrigs[label]['T_NBP']) - df_refrig.loc[label, 'T_krit'] = str(refrigs[label]['T_crit']) - df_refrig.loc[label, 'p_krit'] = str(refrigs[label]['p_crit']) - df_refrig.loc[label, 'SK'] = refrigs[label]['ASHRAE34'] - df_refrig.loc[label, 'ODP'] = str(refrigs[label]['ODP']) - df_refrig.loc[label, 'GWP'] = str(refrigs[label]['GWP100']) + columns=["Type", "T_NBP", "T_critical", "p_critical", "SK", "ODP", "GWP"] + ) + df_refrig.loc[label, "Type"] = refrigs[label]["type"] + df_refrig.loc[label, "T_NBP"] = str(refrigs[label]["T_NBP"]) + df_refrig.loc[label, "T_critical"] = str(refrigs[label]["T_crit"]) + df_refrig.loc[label, "p_critical"] = str(refrigs[label]["p_crit"]) + df_refrig.loc[label, "SK"] = refrigs[label]["ASHRAE34"] + df_refrig.loc[label, "ODP"] = str(refrigs[label]["ODP"]) + df_refrig.loc[label, "GWP"] = str(refrigs[label]["GWP100"]) return df_refrig -def calc_limits(wf, prop, padding_rel, scale='lin'): +def calc_limits(wf, prop, padding_rel, scale="lin"): """ - Calculate states diagram limits of given property. + Calculate the limits for a state diagram based on the given property. Parameters ---------- wf : str - Working fluid for which to filter heat pump simulation results. - + Working fluid to filter heat pump simulation results. + prop : str Fluid property to calculate limits for. padding_rel : float - Padding from minimum and maximum value to axes limit in relation to - full range between minimum and maximum. + Padding from minimum and maximum value to axis limit in relation + to the full range between minimum and maximum. scale : str - Either 'lin' or 'log'. Scale on with padding is applied. Defaults to - 'lin'. + Either 'lin' or 'log'. Scale on which padding is applied. Defaults to 'lin'. """ - if scale not in ['lin', 'log']: + if scale not in ["lin", "log"]: raise ValueError( - f"Parameter 'scale' has to be either 'lin' or 'log'. '{scale}' is " - + "not allowed." - ) + _("Parameter 'scale' must be either 'lin' or 'log'.") + + f" '{scale}' " + + _("is not allowed.") + ) - wfmask = ss.hp.nw.results['Connection'][wf] == 1.0 + wfmask = ss.hp.nw.results["Connection"][wf] == 1.0 - min_val = ss.hp.nw.results['Connection'].loc[wfmask, prop].min() - max_val = ss.hp.nw.results['Connection'].loc[wfmask, prop].max() - if scale == 'lin': + min_val = ss.hp.nw.results["Connection"].loc[wfmask, prop].min() + max_val = ss.hp.nw.results["Connection"].loc[wfmask, prop].max() + if scale == "lin": delta_val = max_val - min_val ax_min_val = min_val - padding_rel * delta_val ax_max_val = max_val + padding_rel * delta_val - elif scale == 'log': + elif scale == "log": delta_val = np.log10(max_val) - np.log10(min_val) ax_min_val = 10 ** (np.log10(min_val) - padding_rel * delta_val) ax_max_val = 10 ** (np.log10(max_val) + padding_rel * delta_val) @@ -89,1160 +97,1305 @@ def calc_limits(wf, prop, padding_rel, scale='lin'): return ax_min_val, ax_max_val -src_path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'static')) +src_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "static")) -# %% MARK: Initialisation -refrigpath = os.path.join(src_path, 'refrigerants.json') -with open(refrigpath, 'r', encoding='utf-8') as file: +# %% MARK: Initialization +refrigpath = os.path.join(src_path, "refrigerants.json") +with open(refrigpath, "r", encoding="utf-8") as file: refrigerants = json.load(file) st.set_page_config( - layout='wide', - page_title='Wärmepumpen Dashboard', - page_icon=os.path.join(src_path, 'img', 'page_icon_ZNES.png') - ) + layout="wide", + page_title=_("Heat Pump Dashboard"), + page_icon=os.path.join(src_path, "img", "page_icon_ZNES.png"), +) is_dark = darkdetect.isDark() +# --- # %% MARK: Sidebar with st.sidebar: if is_dark: - logo = os.path.join(src_path, 'img', 'Logo_ZNES_mitUnisV2_dark.svg') + logo = os.path.join(src_path, "img", "Logo_ZNES_mitUnisV2_dark.svg") else: - logo = os.path.join(src_path, 'img', 'Logo_ZNES_mitUnisV2.svg') + logo = os.path.join(src_path, "img", "Logo_ZNES_mitUnisV2.svg") st.image(logo, use_column_width=True) - mode = st.selectbox( - 'Auswahl Modus', ['Start', 'Auslegung', 'Teillast'], - key='select', label_visibility='hidden' + language = st.selectbox("", ["en", "de", "it"]) + try: + localizator = gettext.translation( + "dashboard", localedir=LOCDIR, languages=[language] ) + localizator.install() + _ = localizator.gettext + except Exception: + pass + + mode = st.selectbox( + _("Select Mode"), + [_("Start"), _("Design"), _("Partload")], + key="select", + label_visibility="hidden", + ) st.markdown("""---""") # %% MARK: Design - if mode == 'Auslegung': + if mode == _("Design"): ss.rerun_req = True - st.header('Auslegung der Wärmepumpe') + st.header(_("Design of the Heat Pump")) - with st.expander('Setup', expanded=True): + with st.expander(_("Setup"), expanded=True): base_topology = st.selectbox( - 'Grundtopologie', - var.base_topologies, - index=0, key='base_topology' + _("Base Topology"), var.base_topologies, index=0, key="base_topology" ) models = [] for model, mdata in var.hp_models.items(): - if mdata['base_topology'] == base_topology: - if mdata['process_type'] != 'transcritical': - models.append(mdata['display_name']) + if mdata["base_topology"] == base_topology: + if mdata["process_type"] != "transcritical": + models.append(mdata["display_name"]) model_name = st.selectbox( - 'Wärmepumpenmodell', models, index=0, key='model' + _("Heat Pump Model"), models, index=0, key="model" ) process_type = st.radio( - 'Prozessart', options=('subkritisch', 'transkritisch'), - horizontal=True + _("Process Type"), + options=(_("subcritical"), _("transcritical")), + horizontal=True, ) - if process_type == 'transkritisch': - model_name = f'{model_name} | Transkritisch' + if process_type == _("transcritical"): + model_name = f"{model_name} | {_('Transcritical')}" for model, mdata in var.hp_models.items(): - correct_base = mdata['base_topology'] == base_topology - correct_model_name = mdata['display_name'] == model_name + correct_base = mdata["base_topology"] == base_topology + correct_model_name = mdata["display_name"] == model_name if correct_base and correct_model_name: hp_model = mdata hp_model_name = model - if 'trans' in hp_model_name: - hp_model_name_topology = hp_model_name.replace('_trans', '') + if "trans" in hp_model_name: + hp_model_name_topology = hp_model_name.replace("_trans", "") else: hp_model_name_topology = hp_model_name break - parampath = os.path.abspath(os.path.join( - os.path.dirname(__file__), 'models', 'input', - f'params_hp_{hp_model_name}.json' - )) - with open(parampath, 'r', encoding='utf-8') as file: + parampath = os.path.abspath( + os.path.join( + os.path.dirname(__file__), + "models", + "input", + f"params_hp_{hp_model_name}.json", + ) + ) + with open(parampath, "r", encoding="utf-8") as file: params = json.load(file) - if hp_model['nr_ihx'] == 1: - with st.expander('Interne Wärmerübertragung'): - params['ihx']['dT_sh'] = st.slider( - 'Überhitzung/Unterkühlung', value=5, - min_value=0, max_value=25, format='%d°C', - key='dT_sh') - if hp_model['nr_ihx'] > 1: - with st.expander('Interne Wärmerübertragung'): + if hp_model["nr_ihx"] == 1: + with st.expander(_("Internal Heat Exchange")): + params["ihx"]["dT_sh"] = st.slider( + _("Superheating/Subcooling"), + value=5, + min_value=0, + max_value=25, + format="%d°C", + key="dT_sh", + ) + if hp_model["nr_ihx"] > 1: + with st.expander(_("Internal Heat Exchange")): dT_ihx = {} - for i in range(1, hp_model['nr_ihx']+1): - dT_ihx[i] = st.slider( - f'Nr. {i}: Überhitzung/Unterkühlung', value=5, - min_value=0, max_value=25, format='%d°C', - key=f'dT_ihx{i}' - ) - params[f'ihx{i}']['dT_sh'] = dT_ihx[i] + for i in range(1, hp_model["nr_ihx"] + 1): + dT_ihx[i] = st.slider( + _("No. {i}: Superheating/Subcooling"), + value=5, + min_value=0, + max_value=25, + format="%d°C", + key=f"dT_ihx{i}", + ) + params[f"ihx{i}"]["dT_sh"] = dT_ihx[i] - with st.expander('Kältemittel'): - if hp_model['nr_refrigs'] == 1: + with st.expander(_("Refrigerant")): + if hp_model["nr_refrigs"] == 1: refrig_index = None for ridx, (rlabel, rdata) in enumerate(refrigerants.items()): - if rlabel == params['setup']['refrig']: + if rlabel == params["setup"]["refrig"]: refrig_index = ridx break - elif rdata['CP'] == params['setup']['refrig']: + elif rdata["CP"] == params["setup"]["refrig"]: refrig_index = ridx break refrig_label = st.selectbox( - '', refrigerants.keys(), index=refrig_index, - key='refrigerant' - ) - params['setup']['refrig'] = refrigerants[refrig_label]['CP'] - params['fluids']['wf'] = refrigerants[refrig_label]['CP'] + "", refrigerants.keys(), index=refrig_index, key="refrigerant" + ) + params["setup"]["refrig"] = refrigerants[refrig_label]["CP"] + params["fluids"]["wf"] = refrigerants[refrig_label]["CP"] df_refrig = info_df(refrig_label, refrigerants) - elif hp_model['nr_refrigs'] == 2: + elif hp_model["nr_refrigs"] == 2: refrig2_index = None for ridx, (rlabel, rdata) in enumerate(refrigerants.items()): - if rlabel == params['setup']['refrig2']: + if rlabel == params["setup"]["refrig2"]: refrig2_index = ridx break - elif rdata['CP'] == params['setup']['refrig2']: + elif rdata["CP"] == params["setup"]["refrig2"]: refrig2_index = ridx break refrig2_label = st.selectbox( - 'Kältemittel (Hochtemperaturkreis)', refrigerants.keys(), - index=refrig2_index, key='refrigerant2' - ) - params['setup']['refrig2'] = refrigerants[refrig2_label]['CP'] - params['fluids']['wf2'] = refrigerants[refrig2_label]['CP'] + _("Refrigerant (High Temperature Circuit)"), + refrigerants.keys(), + index=refrig2_index, + key="refrigerant2", + ) + params["setup"]["refrig2"] = refrigerants[refrig2_label]["CP"] + params["fluids"]["wf2"] = refrigerants[refrig2_label]["CP"] df_refrig2 = info_df(refrig2_label, refrigerants) refrig1_index = None for ridx, (rlabel, rdata) in enumerate(refrigerants.items()): - if rlabel == params['setup']['refrig1']: + if rlabel == params["setup"]["refrig1"]: refrig1_index = ridx break - elif rdata['CP'] == params['setup']['refrig1']: + elif rdata["CP"] == params["setup"]["refrig1"]: refrig1_index = ridx break refrig1_label = st.selectbox( - 'Kältemittel (Niedertemperaturkreis)', refrigerants.keys(), - index=refrig1_index, key='refrigerant1' - ) - params['setup']['refrig1'] = refrigerants[refrig1_label]['CP'] - params['fluids']['wf1'] = refrigerants[refrig1_label]['CP'] + _("Refrigerant (Low Temperature Circuit)"), + refrigerants.keys(), + index=refrig1_index, + key="refrigerant1", + ) + params["setup"]["refrig1"] = refrigerants[refrig1_label]["CP"] + params["fluids"]["wf1"] = refrigerants[refrig1_label]["CP"] df_refrig1 = info_df(refrig1_label, refrigerants) - - if hp_model['nr_refrigs'] == 1: - T_crit = int(np.floor(refrigerants[refrig_label]['T_crit'])) - p_crit = int(np.floor(refrigerants[refrig_label]['p_crit'])) - elif hp_model['nr_refrigs'] == 2: - T_crit = int(np.floor(refrigerants[refrig2_label]['T_crit'])) - p_crit = int(np.floor(refrigerants[refrig2_label]['p_crit'])) + if hp_model["nr_refrigs"] == 1: + T_crit = int(np.floor(refrigerants[refrig_label]["T_crit"])) + p_crit = int(np.floor(refrigerants[refrig_label]["p_crit"])) + elif hp_model["nr_refrigs"] == 2: + T_crit = int(np.floor(refrigerants[refrig2_label]["T_crit"])) + p_crit = int(np.floor(refrigerants[refrig2_label]["p_crit"])) ss.T_crit = T_crit ss.p_crit = p_crit - if 'trans' in hp_model_name: - with st.expander('Traskritischer Druck'): - params['A0']['p'] = st.slider('Wert in bar', min_value=ss.p_crit, - value=params['A0']['p'], max_value=300, - format='%d bar', key='p_trans_out') - - with st.expander('Thermische Nennleistung'): - params['cons']['Q'] = st.number_input( - 'Wert in MW', value=abs(params['cons']['Q']/1e6), - step=0.1, key='Q_N' + if "trans" in hp_model_name: + with st.expander(_("Transcritical Pressure")): + params["A0"]["p"] = st.slider( + _("Value in bar"), + min_value=ss.p_crit, + value=params["A0"]["p"], + max_value=300, + format="%d bar", + key="p_trans_out", ) - params['cons']['Q'] *= -1e6 - with st.expander('Wärmequelle'): - params['B1']['T'] = st.slider( - 'Temperatur Vorlauf', min_value=0, max_value=T_crit, - value=params['B1']['T'], format='%d°C', key='T_heatsource_ff' - ) - params['B2']['T'] = st.slider( - 'Temperatur Rücklauf', min_value=0, max_value=T_crit, - value=params['B2']['T'], format='%d°C', key='T_heatsource_bf' - ) + # --- + with st.expander(_("Thermal Nominal Power")): + params["cons"]["Q"] = st.number_input( + _("Value in MW"), + value=abs(params["cons"]["Q"] / 1e6), + step=0.1, + key="Q_N", + ) + params["cons"]["Q"] *= -1e6 + + with st.expander(_("Heat Source")): + params["B1"]["T"] = st.slider( + _("Forward Temperature"), + min_value=0, + max_value=T_crit, + value=params["B1"]["T"], + format="%d°C", + key="T_heatsource_ff", + ) + params["B2"]["T"] = st.slider( + _("Return Temperature"), + min_value=0, + max_value=T_crit, + value=params["B2"]["T"], + format="%d°C", + key="T_heatsource_bf", + ) - invalid_temp_diff = params['B2']['T'] >= params['B1']['T'] + invalid_temp_diff = params["B2"]["T"] >= params["B1"]["T"] if invalid_temp_diff: st.error( - 'Die Rücklauftemperatur muss niedriger sein, als die ' - + 'Vorlauftemperatur.' + _( + "The return temperature must be lower than the forward temperature." ) + ) - # TODO: Aktuell wird T_mid im Modell als Mittelwert zwischen von Ver- - # dampfungs- und Kondensationstemperatur gebildet. An sich wäre - # es analytisch sicher interessant den Wert selbst festlegen zu - # können. + # TODO: Currently, T_mid in the model is formed as the average between the + # evaporation and condensation temperature. It would certainly be interesting + # analytically to be able to set this value manually. # if hp_model['nr_refrigs'] == 2: - # with st.expander('Zwischenwärmeübertrager'): + # with st.expander(_('Intermediate Heat Exchanger')): # param['design']['T_mid'] = st.slider( - # 'Mittlere Temperatur', min_value=0, max_value=T_crit, + # _('Average Temperature'), min_value=0, max_value=T_crit, # value=40, format='%d°C', key='T_mid' - # ) + # ) - with st.expander('Wärmesenke'): + with st.expander(_("Heat Sink")): T_max_sink = T_crit - if 'trans' in hp_model_name: + if "trans" in hp_model_name: T_max_sink = 200 # °C -- Ad hoc value, maybe find better one - params['C3']['T'] = st.slider( - 'Temperatur Vorlauf', min_value=0, max_value=T_max_sink, - value=params['C3']['T'], format='%d°C', key='T_consumer_ff' + params["C3"]["T"] = st.slider( + _("Forward Temperature"), + min_value=0, + max_value=T_max_sink, + value=params["C3"]["T"], + format="%d°C", + key="T_consumer_ff", ) - params['C1']['T'] = st.slider( - 'Temperatur Rücklauf', min_value=0, max_value=T_max_sink, - value=params['C1']['T'], format='%d°C', key='T_consumer_bf' + params["C1"]["T"] = st.slider( + _("Return Temperature"), + min_value=0, + max_value=T_max_sink, + value=params["C1"]["T"], + format="%d°C", + key="T_consumer_bf", ) - invalid_temp_diff = params['C1']['T'] >= params['C3']['T'] + invalid_temp_diff = params["C1"]["T"] >= params["C3"]["T"] if invalid_temp_diff: st.error( - 'Die Rücklauftemperatur muss niedriger sein, als die ' - + 'Vorlauftemperatur.' + _( + "The return temperature must be lower than the forward temperature." + ) ) - invalid_temp_diff = params['C1']['T'] <= params['B1']['T'] + invalid_temp_diff = params["C1"]["T"] <= params["B1"]["T"] if invalid_temp_diff: st.error( - 'Die Temperatur der Wärmesenke muss höher sein, als die ' - + 'der Wärmequelle.' + _( + "The temperature of the heat sink must be higher than the heat source." + ) ) - with st.expander('Verdichter'): - if hp_model['comp_var'] is None and hp_model['nr_refrigs'] == 1: - params['comp']['eta_s'] = st.slider( - 'Wirkungsgrad $\eta_s$', min_value=0, max_value=100, step=1, - value=int(params['comp']['eta_s']*100), format='%d%%' - ) / 100 - elif hp_model['comp_var'] is not None and hp_model['nr_refrigs'] == 1: - params['comp1']['eta_s'] = st.slider( - 'Wirkungsgrad $\eta_{s,1}$', min_value=0, max_value=100, step=1, - value=int(params['comp1']['eta_s']*100), format='%d%%' - ) / 100 - params['comp2']['eta_s'] = st.slider( - 'Wirkungsgrad $\eta_{s,2}$', min_value=0, max_value=100, step=1, - value=int(params['comp2']['eta_s']*100), format='%d%%' - ) / 100 - elif hp_model['comp_var'] is None and hp_model['nr_refrigs'] == 2: - params['HT_comp']['eta_s'] = st.slider( - 'Wirkungsgrad $\eta_{s,HTK}$', min_value=0, max_value=100, step=1, - value=int(params['HT_comp']['eta_s']*100), format='%d%%' - ) / 100 - params['LT_comp']['eta_s'] = st.slider( - 'Wirkungsgrad $\eta_{s,NTK}$', min_value=0, max_value=100, step=1, - value=int(params['LT_comp']['eta_s']*100), format='%d%%' - ) / 100 - elif hp_model['comp_var'] is not None and hp_model['nr_refrigs'] == 2: - params['HT_comp1']['eta_s'] = st.slider( - 'Wirkungsgrad $\eta_{s,HTK,1}$', min_value=0, max_value=100, step=1, - value=int(params['HT_comp1']['eta_s']*100), format='%d%%' - ) / 100 - params['HT_comp2']['eta_s'] = st.slider( - 'Wirkungsgrad $\eta_{s,HTK,2}$', min_value=0, max_value=100, step=1, - value=int(params['HT_comp2']['eta_s']*100), format='%d%%' - ) / 100 - params['LT_comp1']['eta_s'] = st.slider( - 'Wirkungsgrad $\eta_{s,NTK,1}$', min_value=0, max_value=100, step=1, - value=int(params['LT_comp1']['eta_s']*100), format='%d%%' - ) / 100 - params['LT_comp2']['eta_s'] = st.slider( - 'Wirkungsgrad $\eta_{s,NTK,2}$', min_value=0, max_value=100, step=1, - value=int(params['LT_comp2']['eta_s']*100), format='%d%%' - ) / 100 - - with st.expander('Umgebungsbedingungen (Exergie)'): - params['ambient']['T'] = st.slider( - 'Temperatur', min_value=1, max_value=45, step=1, - value=params['ambient']['T'], format='%d°C', key='T_env' + with st.expander(_("Compressor")): + if hp_model["comp_var"] is None and hp_model["nr_refrigs"] == 1: + params["comp"]["eta_s"] = ( + st.slider( + _("Efficiency $\eta_s$"), + min_value=0, + max_value=100, + step=1, + value=int(params["comp"]["eta_s"] * 100), + format="%d%%", + ) + / 100 ) - params['ambient']['p'] = st.number_input( - 'Druck in bar', value=float(params['ambient']['p']), step=0.01, - format='%.4f', key='p_env' + elif hp_model["comp_var"] is not None and hp_model["nr_refrigs"] == 1: + params["comp1"]["eta_s"] = ( + st.slider( + _("Efficiency $\eta_{s,1}$"), + min_value=0, + max_value=100, + step=1, + value=int(params["comp1"]["eta_s"] * 100), + format="%d%%", + ) + / 100 ) - - with st.expander('Parameter zur Kostenkalkulation'): - costcalcparams = {} - costcalcparams['k_evap'] = st.slider( - 'Wärmedurchgangskoeffizient (Verdampfung)', - min_value=0, max_value=5000, step=10, - value=1500, format='%d W/m²K', key='k_evap' + params["comp2"]["eta_s"] = ( + st.slider( + _("Efficiency $\eta_{s,2}$"), + min_value=0, + max_value=100, + step=1, + value=int(params["comp2"]["eta_s"] * 100), + format="%d%%", + ) + / 100 ) - - costcalcparams['k_cond'] = st.slider( - 'Wärmedurchgangskoeffizient (Verflüssigung)', - min_value=0, max_value=5000, step=10, - value=3500, format='%d W/m²K', key='k_cond' + elif hp_model["comp_var"] is None and hp_model["nr_refrigs"] == 2: + params["HT_comp"]["eta_s"] = ( + st.slider( + _("Efficiency $\eta_{s,HTK}$"), + min_value=0, + max_value=100, + step=1, + value=int(params["HT_comp"]["eta_s"] * 100), + format="%d%%", + ) + / 100 ) - - if 'trans' in hp_model_name: - costcalcparams['k_trans'] = st.slider( - 'Wärmedurchgangskoeffizient (transkritisch)', - min_value=0, max_value=1000, step=5, - value=60, format='%d W/m²K', key='k_trans' + params["LT_comp"]["eta_s"] = ( + st.slider( + _("Efficiency $\eta_{s,NTK}$"), + min_value=0, + max_value=100, + step=1, + value=int(params["LT_comp"]["eta_s"] * 100), + format="%d%%", ) - - costcalcparams['k_misc'] = st.slider( - 'Wärmedurchgangskoeffizient (Sonstige)', - min_value=0, max_value=1000, step=5, - value=50, format='%d W/m²K', key='k_misc' + / 100 + ) + elif hp_model["comp_var"] is not None and hp_model["nr_refrigs"] == 2: + params["HT_comp1"]["eta_s"] = ( + st.slider( + _("Efficiency $\eta_{s,HTK,1}$"), + min_value=0, + max_value=100, + step=1, + value=int(params["HT_comp1"]["eta_s"] * 100), + format="%d%%", + ) + / 100 + ) + params["HT_comp2"]["eta_s"] = ( + st.slider( + _("Efficiency $\eta_{s,HTK,2}$"), + min_value=0, + max_value=100, + step=1, + value=int(params["HT_comp2"]["eta_s"] * 100), + format="%d%%", + ) + / 100 + ) + params["LT_comp1"]["eta_s"] = ( + st.slider( + _("Efficiency $\eta_{s,NTK,1}$"), + min_value=0, + max_value=100, + step=1, + value=int(params["LT_comp1"]["eta_s"] * 100), + format="%d%%", + ) + / 100 + ) + params["LT_comp2"]["eta_s"] = ( + st.slider( + _("Efficiency $\eta_{s,NTK,2}$"), + min_value=0, + max_value=100, + step=1, + value=int(params["LT_comp2"]["eta_s"] * 100), + format="%d%%", + ) + / 100 ) - costcalcparams['residence_time'] = st.slider( - 'Verweildauer Flashtank', - min_value=0, max_value=60, step=1, - value=10, format='%d s', key='residence_time' + # --- + with st.expander(_("Ambient Conditions (Exergy)")): + params["ambient"]["T"] = st.slider( + _("Temperature"), + min_value=1, + max_value=45, + step=1, + value=params["ambient"]["T"], + format="%d°C", + key="T_env", + ) + params["ambient"]["p"] = st.number_input( + _("Pressure in bar"), + value=float(params["ambient"]["p"]), + step=0.01, + format="%.4f", + key="p_env", + ) + + with st.expander(_("Parameters for Cost Calculation")): + costcalcparams = {} + costcalcparams["k_evap"] = st.slider( + _("Heat Transfer Coefficient (Evaporation)"), + min_value=0, + max_value=5000, + step=10, + value=1500, + format="%d W/m²K", + key="k_evap", + ) + + costcalcparams["k_cond"] = st.slider( + _("Heat Transfer Coefficient (Condensation)"), + min_value=0, + max_value=5000, + step=10, + value=3500, + format="%d W/m²K", + key="k_cond", + ) + + if "trans" in hp_model_name: + costcalcparams["k_trans"] = st.slider( + _("Heat Transfer Coefficient (Transcritical)"), + min_value=0, + max_value=1000, + step=5, + value=60, + format="%d W/m²K", + key="k_trans", ) + costcalcparams["k_misc"] = st.slider( + _("Heat Transfer Coefficient (Miscellaneous)"), + min_value=0, + max_value=1000, + step=5, + value=50, + format="%d W/m²K", + key="k_misc", + ) + + costcalcparams["residence_time"] = st.slider( + _("Residence Time Flash Tank"), + min_value=0, + max_value=60, + step=1, + value=10, + format="%d s", + key="residence_time", + ) + ss.hp_params = params - run_sim = st.button('🧮 Auslegung ausführen') + run_sim = st.button(_("🧮 Execute Design")) # run_sim = True - # autorun = st.checkbox('AutoRun Simulation', value=True) + # autorun = st.checkbox(_('AutoRun Simulation'), value=True) # %% MARK: Offdesign - if mode == 'Teillast' and 'hp' in ss: + if mode == _("Part Load") and "hp" in ss: params = ss.hp_params - st.header('Teillastsimulation der Wärmepumpe') - - with st.expander('Teillast'): - (params['offdesign']['partload_min'], - params['offdesign']['partload_max']) = st.slider( - 'Bezogen auf Nennmassenstrom', - min_value=0, max_value=120, step=5, - value=(30, 100), format='%d%%', key='pl_slider' - ) + st.header(_("Part Load Simulation of the Heat Pump")) + + with st.expander(_("Part Load")): + ( + params["offdesign"]["partload_min"], + params["offdesign"]["partload_max"], + ) = st.slider( + _("Relative to Nominal Mass Flow"), + min_value=0, + max_value=120, + step=5, + value=(30, 100), + format="%d%%", + key="pl_slider", + ) - params['offdesign']['partload_min'] /= 100 - params['offdesign']['partload_max'] /= 100 + params["offdesign"]["partload_min"] /= 100 + params["offdesign"]["partload_max"] /= 100 - params['offdesign']['partload_steps'] = int(np.ceil( - (params['offdesign']['partload_max'] - - params['offdesign']['partload_min']) + params["offdesign"]["partload_steps"] = int( + np.ceil( + ( + params["offdesign"]["partload_max"] + - params["offdesign"]["partload_min"] + ) / 0.1 - ) + 1) + ) + + 1 + ) - with st.expander('Wärmequelle'): + with st.expander(_("Heat Source")): type_hs = st.radio( - '', ('Konstant', 'Variabel'), index=1, horizontal=True, - key='temp_hs' + "", + (_("Constant"), _("Variable")), + index=1, + horizontal=True, + key="temp_hs", + ) + if type_hs == _("Constant"): + params["offdesign"]["T_hs_ff_start"] = ss.hp.params["B1"]["T"] + params["offdesign"]["T_hs_ff_end"] = ( + params["offdesign"]["T_hs_ff_start"] + 1 ) - if type_hs == 'Konstant': - params['offdesign']['T_hs_ff_start'] = ( - ss.hp.params['B1']['T'] - ) - params['offdesign']['T_hs_ff_end'] = ( - params['offdesign']['T_hs_ff_start'] + 1 - ) - params['offdesign']['T_hs_ff_steps'] = 1 + params["offdesign"]["T_hs_ff_steps"] = 1 text = ( - f'Temperatur

' + f'{_("Temperature")}

' + f'{params["offdesign"]["T_hs_ff_start"]} °C' - + r'

' - ) + + r"

" + ) st.markdown(text, unsafe_allow_html=True) - elif type_hs == 'Variabel': - params['offdesign']['T_hs_ff_start'] = st.slider( - 'Starttemperatur', - min_value=0, max_value=ss.T_crit, step=1, - value=int( - ss.hp.params['B1']['T'] - - 5 - ), - format='%d°C', key='T_hs_ff_start_slider' - ) - params['offdesign']['T_hs_ff_end'] = st.slider( - 'Endtemperatur', - min_value=0, max_value=ss.T_crit, step=1, - value=int( - ss.hp.params['B1']['T'] - + 5 - ), - format='%d°C', key='T_hs_ff_end_slider' + elif type_hs == _("Variable"): + params["offdesign"]["T_hs_ff_start"] = st.slider( + _("Start Temperature"), + min_value=0, + max_value=ss.T_crit, + step=1, + value=int(ss.hp.params["B1"]["T"] - 5), + format="%d°C", + key="T_hs_ff_start_slider", + ) + params["offdesign"]["T_hs_ff_end"] = st.slider( + _("End Temperature"), + min_value=0, + max_value=ss.T_crit, + step=1, + value=int(ss.hp.params["B1"]["T"] + 5), + format="%d°C", + key="T_hs_ff_end_slider", + ) + params["offdesign"]["T_hs_ff_steps"] = int( + np.ceil( + ( + params["offdesign"]["T_hs_ff_end"] + - params["offdesign"]["T_hs_ff_start"] + ) + / 3 ) - params['offdesign']['T_hs_ff_steps'] = int(np.ceil( - (params['offdesign']['T_hs_ff_end'] - - params['offdesign']['T_hs_ff_start']) - / 3 - ) + 1) + + 1 + ) - with st.expander('Wärmesenke'): + # --- + with st.expander(_("Heat Sink")): type_cons = st.radio( - '', ('Konstant', 'Variabel'), index=1, horizontal=True, - key='temp_cons' + "", + (_("Constant"), _("Variable")), + index=1, + horizontal=True, + key="temp_cons", + ) + if type_cons == _("Constant"): + params["offdesign"]["T_cons_ff_start"] = ss.hp.params["C3"]["T"] + params["offdesign"]["T_cons_ff_end"] = ( + params["offdesign"]["T_cons_ff_start"] + 1 ) - if type_cons == 'Konstant': - params['offdesign']['T_cons_ff_start'] = ( - ss.hp.params['C3']['T'] - ) - params['offdesign']['T_cons_ff_end'] = ( - params['offdesign']['T_cons_ff_start'] + 1 - ) - params['offdesign']['T_cons_ff_steps'] = 1 + params["offdesign"]["T_cons_ff_steps"] = 1 text = ( - f'Temperatur

' + f'{_("Temperature")}

' + f'{params["offdesign"]["T_cons_ff_start"]} °C' - + r'

' - ) + + r"

" + ) st.markdown(text, unsafe_allow_html=True) - elif type_cons == 'Variabel': - params['offdesign']['T_cons_ff_start'] = st.slider( - 'Starttemperatur', - min_value=0, max_value=ss.T_crit, step=1, - value=int( - ss.hp.params['C3']['T'] - - 10 - ), - format='%d°C', key='T_cons_ff_start_slider' - ) - params['offdesign']['T_cons_ff_end'] = st.slider( - 'Endtemperatur', - min_value=0, max_value=ss.T_crit, step=1, - value=int( - ss.hp.params['C3']['T'] - + 10 - ), - format='%d°C', key='T_cons_ff_end_slider' + elif type_cons == _("Variable"): + params["offdesign"]["T_cons_ff_start"] = st.slider( + _("Start Temperature"), + min_value=0, + max_value=ss.T_crit, + step=1, + value=int(ss.hp.params["C3"]["T"] - 10), + format="%d°C", + key="T_cons_ff_start_slider", + ) + params["offdesign"]["T_cons_ff_end"] = st.slider( + _("End Temperature"), + min_value=0, + max_value=ss.T_crit, + step=1, + value=int(ss.hp.params["C3"]["T"] + 10), + format="%d°C", + key="T_cons_ff_end_slider", + ) + params["offdesign"]["T_cons_ff_steps"] = int( + np.ceil( + ( + params["offdesign"]["T_cons_ff_end"] + - params["offdesign"]["T_cons_ff_start"] + ) + / 1 ) - params['offdesign']['T_cons_ff_steps'] = int(np.ceil( - (params['offdesign']['T_cons_ff_end'] - - params['offdesign']['T_cons_ff_start']) - / 1 - ) + 1) + + 1 + ) ss.hp_params = params - run_pl_sim = st.button('🧮 Teillast simulieren') + run_pl_sim = st.button(_("🧮 Simulate Part Load")) # %% MARK: Main Content -st.title('*heatpumps*') +st.title(_("*heatpumps*")) -if mode == 'Start': +if mode == "Start": # %% MARK: Landing Page st.write( - """ - Der Wärmepumpensimulator *heatpumps* ist eine leistungsfähige Simulationssoftware - zur Analyse und Bewertung von Wärmepumpen. - - Mit diesem Dashboard lassen sich eine Vielzahl komplexer - thermodynamischer Anlagenmodelle mithilfe numerischer Methoden über eine - einfache Oberfläche steuern, ohne Fachkenntnisse über diese - vorauszusetzen. Dies beinhaltet sowohl die Auslegung von Wärmepumpen, - als auch die Simulation ihres stationären Teillastbetriebs. Dabei geben - die Ergebnisse der Simulationen Aufschluss über das prinzipielle - Verhalten, den COP, Zustandsgrößen und Kosten der einzelnen Komponenten - sowie Gesamtinvestitionskosten der betrachteten Wärmepumpe. Damit - wird Zugang zu komplexen Fragestellungen ermöglicht, die regelmäßig in - der Konzeption und Planung von Wärmepumpen aufkommen. - - ### Key Features - - - Stationäre Auslegungs- und Teillastsimulation basierend auf [TESPy](https://github.com/oemof/tespy) - - Parametrisierung and Ergebnisvisualisierung mithilfe eines [Streamlit](https://github.com/streamlit/streamlit) Dashboards - - In der Industrie, Forschung und Entwicklung gängige Schaltungstopologien - - Sub- und transkritische Prozesse - - Große Auswahl an Arbeitsmedien aufgrund der Integration von [CoolProp](https://github.com/CoolProp/CoolProp) - """ + _( + """ + The heat pump simulator *heatpumps* is a powerful simulation software + for analyzing and evaluating heat pumps. + + This dashboard allows you to control a variety of complex + thermodynamic plant models using numerical methods via a + simple interface, without requiring expert knowledge. + This includes both the design of heat pumps + as well as the simulation of their steady-state part load operation. The + simulation results provide insights into the pump's behavior, COP, + state variables, and costs of individual components as well as + total investment costs. This enables access to complex questions + that frequently arise in the design and planning of heat pumps. + + ### Key Features + + - Steady-state design and part load simulation based on [TESPy](https://github.com/oemof/tespy) + - Parameterization and result visualization via a [Streamlit](https://github.com/streamlit/streamlit) dashboard + - Common circuit topologies used in industry, research, and development + - Subcritical and transcritical processes + - Large selection of working fluids thanks to [CoolProp](https://github.com/CoolProp/CoolProp) integration + """ ) + ) - st.button('Auslegung starten', on_click=switch2design) + st.button(_("Start Design"), on_click=switch2design) st.markdown("""---""") - with st.expander('Verwendete Software'): + with st.expander(_("Used Software")): st.info( - """ - #### Verwendete Software: - - Zur Modellerstellung und Berechnung der Simulationen wird die - Open Source Software TESPy verwendet. Des Weiteren werden - eine Reihe weiterer Pythonpakete zur Datenverarbeitung, - -aufbereitung und -visualisierung genutzt. - - --- - - #### TESPy: - - TESPy (Thermal Engineering Systems in Python) ist ein - leistungsfähiges Simulationswerkzeug für thermische - Verfahrenstechnik, zum Beispiel für Kraftwerke, - Fernwärmesysteme oder Wärmepumpen. Mit dem TESPy-Paket ist es - möglich, Anlagen auszulegen und den stationären Betrieb zu - simulieren. Danach kann das Teillastverhalten anhand der - zugrundeliegenden Charakteristiken für jede Komponente der - Anlage ermittelt werden. Die komponentenbasierte Struktur in - Kombination mit der Lösungsmethode bieten eine sehr hohe - Flexibilität hinsichtlich der Anlagentopologie und der - Parametrisierung. Weitere Informationen zu TESPy sind in dessen - [Onlinedokumentation](https://tespy.readthedocs.io) in - englischer Sprache zu finden. - - #### Weitere Pakete: - - - [Streamlit](https://docs.streamlit.io) (Graphische Oberfläche) - - [NumPy](https://numpy.org) (Datenverarbeitung) - - [pandas](https://pandas.pydata.org) (Datenverarbeitung) - - [SciPy](https://scipy.org/) (Interpolation) - - [scikit-learn](https://scikit-learn.org) (Regression) - - [Matplotlib](https://matplotlib.org) (Datenvisualisierung) - - [FluProDia](https://fluprodia.readthedocs.io) (Datenvisualisierung) - - [CoolProp](http://www.coolprop.org) (Stoffdaten) - """ + _( + """ + #### Used Software: + + The open-source software TESPy is used for modeling and simulating the systems. + Additionally, a number of other Python packages are used for data processing, + preparation, and visualization. + + --- + + #### TESPy: + + TESPy (Thermal Engineering Systems in Python) is a powerful + simulation tool for thermal process engineering, such as power plants, + district heating systems, or heat pumps. The TESPy package allows for + system design and steady-state operation simulation. After that, + part load behavior can be determined based on the characteristics of + each component of the system. The component-based structure combined + with the solution method offers great flexibility regarding the + system topology and parameterization. More information on TESPy can + be found in its [online documentation](https://tespy.readthedocs.io) (in English). + + #### Other Packages: + + - [Streamlit](https://docs.streamlit.io) (Graphical User Interface) + - [NumPy](https://numpy.org) (Data Processing) + - [pandas](https://pandas.pydata.org) (Data Processing) + - [SciPy](https://scipy.org/) (Interpolation) + - [scikit-learn](https://scikit-learn.org) (Regression) + - [Matplotlib](https://matplotlib.org) (Data Visualization) + - [FluProDia](https://fluprodia.readthedocs.io) (Data Visualization) + - [CoolProp](http://www.coolprop.org) (Fluid Properties) + """ ) + ) - with st.expander('Disclaimer'): + with st.expander(_("Disclaimer")): st.warning( - """ - #### Simulationsergebnisse: - - Numerische Simulationen sind Berechnungen mittels geeigneter - Iterationsverfahren in Bezug auf die vorgegebenen und gesetzten - Randbedingungen und Parameter. Eine Berücksichtigung aller - möglichen Einflüsse ist in Einzelfällen nicht möglich, so dass - Abweichungen zu Erfahrungswerten aus Praxisanwendungen - entstehen können und bei der Bewertung berücksichtigt werden - müssen. Die Ergebnisse geben hinreichenden bis genauen - Aufschluss über das prinzipielle Verhalten, den COP und - Zustandsgrößen in den einzelnen Komponenten der Wärmepumpe. - Dennoch sind alle Angaben und Ergebnisse ohne Gewähr. - """ + _( + """ + #### Simulation Results: + + Numerical simulations are calculations performed using appropriate + iterative methods based on the specified boundary conditions and parameters. + In some cases, it is not possible to account for all possible influences, + so deviations from real-world experience may occur and should be taken into + account when evaluating the results. The results provide sufficient to exact + insights into the heat pump's general behavior, COP, and state variables in + each component. Nevertheless, all information and results are provided + without guarantee. + """ ) + ) - with st.expander('Copyright'): - + with st.expander(_("Copyright")): st.success( - """ - #### Softwarelizenz - MIT License - - Copyright © 2023 Jonas Freißmann and Malte Fritz - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - """ + _( + """ + #### Software License + MIT License + + Copyright © 2023 Jonas Freißmann and Malte Fritz + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + """ + ) ) -if mode == 'Auslegung': +# --- +if mode == "Design": # %% MARK: Design Simulation if not run_sim: # %% Topology & Refrigerant col_left, col_right = st.columns([1, 4]) with col_left: - st.subheader('Topologie') + st.subheader(str(_("Topology"))) if is_dark: try: top_file = os.path.join( - src_path, 'img', 'topologies', - f'hp_{hp_model_name_topology}_dark.svg' - ) + src_path, + "img", + "topologies", + f"hp_{hp_model_name_topology}_dark.svg", + ) st.image(top_file) - except: + except: # noqa: E722 top_file = os.path.join( - src_path, 'img', 'topologies', f'hp_{hp_model_name_topology}.svg' - ) + src_path, + "img", + "topologies", + f"hp_{hp_model_name_topology}.svg", + ) st.image(top_file) else: top_file = os.path.join( - src_path, 'img', 'topologies', f'hp_{hp_model_name_topology}.svg' - ) + src_path, "img", "topologies", f"hp_{hp_model_name_topology}.svg" + ) st.image(top_file) with col_right: - st.subheader('Kältemittel') + st.subheader(str(_("Refrigerant"))) - if hp_model['nr_refrigs'] == 1: + if hp_model["nr_refrigs"] == 1: st.dataframe(df_refrig, use_container_width=True) - elif hp_model['nr_refrigs'] == 2: - st.markdown('#### Hochtemperaturkreis') + elif hp_model["nr_refrigs"] == 2: + st.markdown(_("#### High-Temperature Circuit")) st.dataframe(df_refrig2, use_container_width=True) - st.markdown('#### Niedertemperaturkreis') + st.markdown(_("#### Low-Temperature Circuit")) st.dataframe(df_refrig1, use_container_width=True) st.write( - """ - Alle Stoffdaten und Klassifikationen aus - [CoolProp](http://www.coolprop.org) oder - [Arpagaus et al. (2018)](https://doi.org/10.1016/j.energy.2018.03.166) - """ + _( + """ + All substance data and classifications from + [CoolProp](http://www.coolprop.org) or + [Arpagaus et al. (2018)](https://doi.org/10.1016/j.energy.2018.03.166) + """ ) + ) - with st.expander('Anleitung'): + with st.expander(_("Instructions")): st.info( - """ - #### Anleitung - - Sie befinden sich auf der Oberfläche zur Auslegungssimulation - Ihrer Wärmepumpe. Dazu sind links in der Sidebar neben der - Dimensionierung und der Wahl des zu verwendenden Kältemittels - verschiedene zentrale Parameter des Kreisprozesse vorzugeben. - - Dies sind zum Beispiel die Temperaturen der Wärmequelle und -senke, - aber auch die dazugehörigen Netzdrücke. Darüber hinaus kann - optional ein interner Wärmeübertrager hinzugefügt werden. Dazu ist - weiterhin die resultierende Überhitzung des verdampften - Kältemittels vorzugeben. - - Ist die Auslegungssimulation erfolgreich abgeschlossen, werden die - generierten Ergebnisse graphisch in Zustandsdiagrammen - aufgearbeitet und quantifiziert. Die zentralen Größen wie die - Leistungszahl (COP) sowie die relevanten Wärmeströme und Leistung - werden aufgeführt. Darüber hinaus werden die thermodynamischen - Zustandsgrößen in allen Prozessschritten tabellarisch aufgelistet. - - Im Anschluss an die Auslegungsimulation erscheint ein Knopf zum - Wechseln in die Teillastoberfläche. Dies kann ebenfalls über das - Dropdownmenü in der Sidebar erfolgen. Informationen zur - Durchführung der Teillastsimulationen befindet sich auf der - Startseite dieser Oberfläche. - """ + _( + """ + #### Instructions + + You are now on the design simulation interface + for your heat pump. In the left sidebar, next to the + dimensioning and the choice of refrigerant, several central parameters + for the cycle process must be specified. + + These include, for example, the temperatures of the heat source and sink, + but also the associated network pressures. Additionally, an internal + heat exchanger can be optionally added. The resulting superheat of the + evaporated refrigerant must also be specified. + + Once the design simulation is successfully completed, the + generated results are processed graphically in state diagrams + and quantified. Key metrics such as the coefficient of performance (COP), + as well as relevant heat flows and power outputs, will be shown. + Furthermore, thermodynamic state variables at each process step will + be listed in a table. + + After the design simulation, a button will appear allowing you to switch + to the partial load interface. This can also be done via the + dropdown menu in the sidebar. Information on how to perform + partial load simulations is available on the start page of this interface. + """ ) + ) if run_sim: # %% Run Design Simulation - with st.spinner('Simulation wird durchgeführt...'): + with st.spinner(_("Running simulation...")): try: ss.hp = run_design(hp_model_name, params) - sim_succeded = True - st.success( - 'Die Simulation der Wärmepumpenauslegung war erfolgreich.' - ) + sim_succeeded = True + st.success(_("The heat pump design simulation was successful.")) except ValueError as e: - sim_succeded = False - print(f'ValueError: {e}') + sim_succeeded = False + print(f"ValueError: {e}") st.error( - 'Bei der Simulation der Wärmepumpe ist der nachfolgende ' - + 'Fehler aufgetreten. Bitte korrigieren Sie die ' - + f'Eingangsparameter und versuchen es erneut.\n\n"{e}"' + _( + "An error occurred during the heat pump simulation. " + "Please correct the input parameters and try again.\n\n" ) + + f'"{e}"' + ) # %% MARK: Results - if sim_succeded: - with st.spinner('Ergebnisse werden visualisiert...'): - - stateconfigpath = os.path.abspath(os.path.join( - os.path.dirname(__file__), 'models', 'input', - 'state_diagram_config.json' - )) - with open(stateconfigpath, 'r', encoding='utf-8') as file: + if sim_succeeded: + with st.spinner(_("Visualizing results...")): + stateconfigpath = os.path.abspath( + os.path.join( + os.path.dirname(__file__), + "models", + "input", + "state_diagram_config.json", + ) + ) + with open(stateconfigpath, "r", encoding="utf-8") as file: config = json.load(file) - if hp_model['nr_refrigs'] == 1: - if ss.hp.params['setup']['refrig'] in config: - state_props = config[ - ss.hp.params['setup']['refrig'] - ] + if hp_model["nr_refrigs"] == 1: + if ss.hp.params["setup"]["refrig"] in config: + state_props = config[ss.hp.params["setup"]["refrig"]] else: - state_props = config['MISC'] - if hp_model['nr_refrigs'] == 2: - if ss.hp.params['setup']['refrig1'] in config: - state_props1 = config[ - ss.hp.params['setup']['refrig1'] - ] + state_props = config["MISC"] + if hp_model["nr_refrigs"] == 2: + if ss.hp.params["setup"]["refrig1"] in config: + state_props1 = config[ss.hp.params["setup"]["refrig1"]] else: - state_props1 = config['MISC'] - if ss.hp.params['setup']['refrig2'] in config: - state_props2 = config[ - ss.hp.params['setup']['refrig2'] - ] + state_props1 = config["MISC"] + if ss.hp.params["setup"]["refrig2"] in config: + state_props2 = config[ss.hp.params["setup"]["refrig2"]] else: - state_props2 = config['MISC'] + state_props2 = config["MISC"] - st.header('Ergebnisse der Auslegung') + st.header(_("Design Results")) col1, col2, col3, col4 = st.columns(4) - col1.metric('COP', round(ss.hp.cop, 2)) - Q_dot_ab = abs( - ss.hp.buses['heat output'].P.val / 1e6 - ) - col2.metric('Q_dot_ab', f"{Q_dot_ab:.2f} MW") - col3.metric( - 'P_zu', - f"{ss.hp.buses['power input'].P.val/1e6:.2f} MW" - ) - Q_dot_zu = abs( - ss.hp.comps['evap'].Q.val/1e6 - ) - col4.metric('Q_dot_zu', f'{Q_dot_zu:.2f} MW') - - with st.expander('Topologie & Kältemittel'): + col1.metric("COP", round(ss.hp.cop, 2)) + Q_dot_ab = abs(ss.hp.buses["heat output"].P.val / 1e6) + col2.metric("Q_dot_ab", f"{Q_dot_ab:.2f} MW") + col3.metric("P_zu", f"{ss.hp.buses['power input'].P.val/1e6:.2f} MW") + Q_dot_zu = abs(ss.hp.comps["evap"].Q.val / 1e6) + col4.metric("Q_dot_zu", f"{Q_dot_zu:.2f} MW") + + with st.expander(_("Topology & Refrigerant")): # %% Topology & Refrigerant col_left, col_right = st.columns([1, 4]) with col_left: - st.subheader('Topologie') + st.subheader(str(_("Topology"))) top_file = os.path.join( - src_path, 'img', 'topologies', - f'hp_{hp_model_name_topology}_label.svg' - ) + src_path, + "img", + "topologies", + f"hp_{hp_model_name_topology}_label.svg", + ) if is_dark: top_file_dark = os.path.join( - src_path, 'img', 'topologies', - f'hp_{hp_model_name_topology}_label_dark.svg' - ) + src_path, + "img", + "topologies", + f"hp_{hp_model_name_topology}_label_dark.svg", + ) if os.path.exists(top_file_dark): top_file = top_file_dark st.image(top_file) with col_right: - st.subheader('Kältemittel') + st.subheader(str(_("Refrigerant"))) - if hp_model['nr_refrigs'] == 1: + if hp_model["nr_refrigs"] == 1: st.dataframe(df_refrig, use_container_width=True) - elif hp_model['nr_refrigs'] == 2: - st.markdown('#### Hochtemperaturkreis') + elif hp_model["nr_refrigs"] == 2: + st.markdown(_("#### High-Temperature Circuit")) st.dataframe(df_refrig2, use_container_width=True) - st.markdown('#### Niedertemperaturkreis') + st.markdown(_("#### Low-Temperature Circuit")) st.dataframe(df_refrig1, use_container_width=True) st.write( - """ - Alle Stoffdaten und Klassifikationen aus - [CoolProp](http://www.coolprop.org) oder - [Arpagaus et al. (2018)](https://doi.org/10.1016/j.energy.2018.03.166) - """ + _( + """ + All substance data and classifications from + [CoolProp](http://www.coolprop.org) or + [Arpagaus et al. (2018)](https://doi.org/10.1016/j.energy.2018.03.166) + """ ) + ) - with st.expander('Zustandsdiagramme'): + with st.expander(_("State Diagrams")): # %% State Diagrams col_left, _, col_right = st.columns([0.495, 0.01, 0.495]) - _, slider_left, _, slider_right, _ = ( - st.columns([0.5, 8, 1, 8, 0.5]) - ) + _, slider_left, _, slider_right, _ = st.columns([0.5, 8, 1, 8, 0.5]) if is_dark: - state_diagram_style = 'dark' + state_diagram_style = "dark" else: - state_diagram_style = 'light' + state_diagram_style = "light" with col_left: # %% Log(p)-h-Diagram - st.subheader('Log(p)-h-Diagramm') - if hp_model['nr_refrigs'] == 1: + st.subheader("Log(p)-h Diagram") + if hp_model["nr_refrigs"] == 1: xmin, xmax = calc_limits( - wf=ss.hp.wf, prop='h', padding_rel=0.35 - ) + wf=ss.hp.wf, prop="h", padding_rel=0.35 + ) ymin, ymax = calc_limits( - wf=ss.hp.wf, prop='p', padding_rel=0.25, - scale='log' - ) + wf=ss.hp.wf, prop="p", padding_rel=0.25, scale="log" + ) diagram = ss.hp.generate_state_diagram( - diagram_type='logph', + diagram_type="logph", figsize=(12, 7.5), - xlims=(xmin, xmax), ylims=(ymin, ymax), + xlims=(xmin, xmax), + ylims=(ymin, ymax), style=state_diagram_style, - return_diagram=True, display_info=False, - open_file=False, savefig=False - ) + return_diagram=True, + display_info=False, + open_file=False, + savefig=False, + ) st.pyplot(diagram.fig) - elif hp_model['nr_refrigs'] == 2: + elif hp_model["nr_refrigs"] == 2: xmin1, xmax1 = calc_limits( - wf=ss.hp.wf1, prop='h', padding_rel=0.35 - ) + wf=ss.hp.wf1, prop="h", padding_rel=0.35 + ) ymin1, ymax1 = calc_limits( - wf=ss.hp.wf1, prop='p', padding_rel=0.25, - scale='log' - ) + wf=ss.hp.wf1, prop="p", padding_rel=0.25, scale="log" + ) xmin2, xmax2 = calc_limits( - wf=ss.hp.wf2, prop='h', padding_rel=0.35 - ) + wf=ss.hp.wf2, prop="h", padding_rel=0.35 + ) ymin2, ymax2 = calc_limits( - wf=ss.hp.wf2, prop='p', padding_rel=0.25, - scale='log' - ) + wf=ss.hp.wf2, prop="p", padding_rel=0.25, scale="log" + ) diagram1, diagram2 = ss.hp.generate_state_diagram( - diagram_type='logph', + diagram_type="logph", figsize=(12, 7.5), xlims=((xmin1, xmax1), (xmin2, xmax2)), ylims=((ymin1, ymax1), (ymin2, ymax2)), style=state_diagram_style, - return_diagram=True, display_info=False, - savefig=False, open_file=False - ) + return_diagram=True, + display_info=False, + savefig=False, + open_file=False, + ) st.pyplot(diagram1.fig) st.pyplot(diagram2.fig) with col_right: # %% T-s-Diagram - st.subheader('T-s-Diagramm') - if hp_model['nr_refrigs'] == 1: + st.subheader("T-s Diagram") + if hp_model["nr_refrigs"] == 1: xmin, xmax = calc_limits( - wf=ss.hp.wf, prop='s', padding_rel=0.35 - ) + wf=ss.hp.wf, prop="s", padding_rel=0.35 + ) ymin, ymax = calc_limits( - wf=ss.hp.wf, prop='T', padding_rel=0.25 - ) + wf=ss.hp.wf, prop="T", padding_rel=0.25 + ) diagram = ss.hp.generate_state_diagram( - diagram_type='Ts', + diagram_type="Ts", figsize=(12, 7.5), - xlims=(xmin, xmax), ylims=(ymin, ymax), + xlims=(xmin, xmax), + ylims=(ymin, ymax), style=state_diagram_style, - return_diagram=True, display_info=False, - open_file=False, savefig=False - ) + return_diagram=True, + display_info=False, + open_file=False, + savefig=False, + ) st.pyplot(diagram.fig) - elif hp_model['nr_refrigs'] == 2: + elif hp_model["nr_refrigs"] == 2: xmin1, xmax1 = calc_limits( - wf=ss.hp.wf1, prop='s', padding_rel=0.35 - ) + wf=ss.hp.wf1, prop="s", padding_rel=0.35 + ) ymin1, ymax1 = calc_limits( - wf=ss.hp.wf1, prop='T', padding_rel=0.25 - ) + wf=ss.hp.wf1, prop="T", padding_rel=0.25 + ) xmin2, xmax2 = calc_limits( - wf=ss.hp.wf2, prop='s', padding_rel=0.35 - ) + wf=ss.hp.wf2, prop="s", padding_rel=0.35 + ) ymin2, ymax2 = calc_limits( - wf=ss.hp.wf2, prop='T', padding_rel=0.25 - ) + wf=ss.hp.wf2, prop="T", padding_rel=0.25 + ) diagram1, diagram2 = ss.hp.generate_state_diagram( - diagram_type='Ts', + diagram_type="Ts", figsize=(12, 7.5), xlims=((xmin1, xmax1), (xmin2, xmax2)), ylims=((ymin1, ymax1), (ymin2, ymax2)), style=state_diagram_style, - return_diagram=True, display_info=False, - savefig=False, open_file=False - ) + return_diagram=True, + display_info=False, + savefig=False, + open_file=False, + ) st.pyplot(diagram1.fig) st.pyplot(diagram2.fig) - - with st.expander('Zustandsgrößen'): + # --- + with st.expander("State Quantities"): # %% State Quantities - state_quantities = ( - ss.hp.nw.results['Connection'].copy() - ) - state_quantities = state_quantities.loc[:, ~state_quantities.columns.str.contains('_unit', case=False, regex=False)] + state_quantities = ss.hp.nw.results["Connection"].copy() + state_quantities = state_quantities.loc[ + :, + ~state_quantities.columns.str.contains( + "_unit", case=False, regex=False + ), + ] try: - state_quantities['water'] = ( - state_quantities['water'] == 1.0 - ) + state_quantities["water"] = state_quantities["water"] == 1.0 except KeyError: - state_quantities['H2O'] = ( - state_quantities['H2O'] == 1.0 - ) - if hp_model['nr_refrigs'] == 1: - refrig = ss.hp.params['setup']['refrig'] - state_quantities[refrig] = ( - state_quantities[refrig] == 1.0 - ) - elif hp_model['nr_refrigs'] == 2: - refrig1 = ss.hp.params['setup']['refrig1'] - state_quantities[refrig1] = ( - state_quantities[refrig1] == 1.0 - ) - refrig2 = ss.hp.params['setup']['refrig2'] - state_quantities[refrig2] = ( - state_quantities[refrig2] == 1.0 - ) - if 'Td_bp' in state_quantities.columns: - del state_quantities['Td_bp'] + state_quantities["H2O"] = state_quantities["H2O"] == 1.0 + if hp_model["nr_refrigs"] == 1: + refrig = ss.hp.params["setup"]["refrig"] + state_quantities[refrig] = state_quantities[refrig] == 1.0 + elif hp_model["nr_refrigs"] == 2: + refrig1 = ss.hp.params["setup"]["refrig1"] + state_quantities[refrig1] = state_quantities[refrig1] == 1.0 + refrig2 = ss.hp.params["setup"]["refrig2"] + state_quantities[refrig2] = state_quantities[refrig2] == 1.0 + if "Td_bp" in state_quantities.columns: + del state_quantities["Td_bp"] for col in state_quantities.columns: if state_quantities[col].dtype == np.float64: state_quantities[col] = state_quantities[col].apply( - lambda x: f'{x:.5}' - ) - state_quantities['x'] = state_quantities['x'].apply( - lambda x: '-' if float(x) < 0 else x - ) + lambda x: f"{x:.5}" + ) + state_quantities["x"] = state_quantities["x"].apply( + lambda x: "-" if float(x) < 0 else x + ) state_quantities.rename( columns={ - 'm': 'm in kg/s', - 'p': 'p in bar', - 'h': 'h in kJ/kg', - 'T': 'T in °C', - 'v': 'v in m³/kg', - 'vol': 'vol in m³/s', - 's': 's in kJ/(kgK)' - }, - inplace=True) - st.dataframe( - data=state_quantities, use_container_width=True - ) + "m": "m in kg/s", + "p": "p in bar", + "h": "h in kJ/kg", + "T": "T in °C", + "v": "v in m³/kg", + "vol": "vol in m³/s", + "s": "s in kJ/(kgK)", + }, + inplace=True, + ) + st.dataframe(data=state_quantities, use_container_width=True) - with st.expander('Ökonomische Bewertung'): + with st.expander("Economic Assessment"): # %% Eco Results ss.hp.calc_cost( - ref_year='2013', current_year='2019', **costcalcparams - ) + ref_year="2013", current_year="2019", **costcalcparams + ) col1, col2 = st.columns(2) invest_total = ss.hp.cost_total - col1.metric( - 'Gesamtinvestitionskosten', - f'{invest_total:,.0f} €' - ) - inv_sepc = ( - invest_total - / abs(ss.hp.params["cons"]["Q"]/1e6) - ) - col2.metric( - 'Spez. Investitionskosten', - f'{inv_sepc:,.0f} €/MW' - ) - costdata = pd.DataFrame({ - k: [round(v, 2)] - for k, v in ss.hp.cost.items() - }) - st.dataframe( - costdata, use_container_width=True, hide_index=True - ) + col1.metric("Total Investment Costs", f"{invest_total:,.0f} €") + inv_sepc = invest_total / abs(ss.hp.params["cons"]["Q"] / 1e6) + col2.metric("Specific Investment Costs", f"{inv_sepc:,.0f} €/MW") + costdata = pd.DataFrame( + {k: [round(v, 2)] for k, v in ss.hp.cost.items()} + ) + st.dataframe(costdata, use_container_width=True, hide_index=True) st.write( + # _( """ - Methodik zur Berechnung der Kosten analog zu - [Kosmadakis et al. (2020)](https://doi.org/10.1016/j.enconman.2020.113488), - basierend auf [Bejan et al. (1995)](https://www.wiley.com/en-us/Thermal+Design+and+Optimization-p-9780471584674). - """ - ) - + Methodology for cost calculation analogous to + [Kosmadakis et al. (2020)](https://doi.org/10.1016/j.enconman.2020.113488), + based on [Bejan et al. (1995)](https://www.wiley.com/en-us/Thermal+Design+and+Optimization-p-9780471584674). + """ + # ) + ) - with st.expander('Exergiebewertung'): + with st.expander("Exergy Assessment"): # %% Exergy Analysis - st.header('Ergebnisse der Exergieanalyse') + st.header("Results of the Exergy Analysis") col1, col2, col3, col4, col5 = st.columns(5) col1.metric( - 'Epsilon', - f'{ss.hp.ean.network_data.epsilon*1e2:.2f} %' - ) - col2.metric( - 'E_F', - f'{(ss.hp.ean.network_data.E_F)/1e6:.2f} MW' - ) - col3.metric( - 'E_P', - f'{(ss.hp.ean.network_data.E_P)/1e6:.2f} MW' - ) - col4.metric( - 'E_D', - f'{(ss.hp.ean.network_data.E_D)/1e6:.2f} MW' - ) - col5.metric( - 'E_L', - f'{(ss.hp.ean.network_data.E_L)/1e3:.2f} KW' - ) + "Epsilon", f"{ss.hp.ean.network_data.epsilon*1e2:.2f} %" + ) + col2.metric("E_F", f"{(ss.hp.ean.network_data.E_F)/1e6:.2f} MW") + col3.metric("E_P", f"{(ss.hp.ean.network_data.E_P)/1e6:.2f} MW") + col4.metric("E_D", f"{(ss.hp.ean.network_data.E_D)/1e6:.2f} MW") + col5.metric("E_L", f"{(ss.hp.ean.network_data.E_L)/1e3:.2f} kW") - st.subheader('Ergebnisse nach Komponente') - exergy_component_result = ( - ss.hp.ean.component_data.copy() - ) + st.subheader("Results by Component") + exergy_component_result = ss.hp.ean.component_data.copy() exergy_component_result = exergy_component_result.drop( - 'group', axis=1 - ) - exergy_component_result.dropna(subset=['E_F'], inplace=True) - for col in ['E_F', 'E_P', 'E_D']: - exergy_component_result[col] = ( - exergy_component_result[col].round(2) - ) - for col in ['epsilon', 'y_Dk', 'y*_Dk']: - exergy_component_result[col] = ( - exergy_component_result[col].round(4) - ) + "group", axis=1 + ) + exergy_component_result.dropna(subset=["E_F"], inplace=True) + for col in ["E_F", "E_P", "E_D"]: + exergy_component_result[col] = exergy_component_result[ + col + ].round(2) + for col in ["epsilon", "y_Dk", "y*_Dk"]: + exergy_component_result[col] = exergy_component_result[ + col + ].round(4) exergy_component_result.rename( columns={ - 'E_F': 'E_F in W', - 'E_P': 'E_P in W', - 'E_D': 'E_D in W', + "E_F": "E_F in W", + "E_P": "E_P in W", + "E_D": "E_D in W", }, - inplace=True) - st.dataframe( - data=exergy_component_result, use_container_width=True - ) + inplace=True, + ) + st.dataframe(data=exergy_component_result, use_container_width=True) col6, _, col7 = st.columns([0.495, 0.01, 0.495]) with col6: - st.subheader('Grassmann Diagramm') + st.subheader("Grassmann Diagram") diagram_placeholder_sankey = st.empty() diagram_sankey = ss.hp.generate_sankey_diagram() diagram_placeholder_sankey.plotly_chart( diagram_sankey, use_container_width=True - ) + ) with col7: - st.subheader('Wasserfall Diagramm') + st.subheader("Waterfall Diagram") diagram_placeholder_waterfall = st.empty() diagram_waterfall = ss.hp.generate_waterfall_diagram() diagram_placeholder_waterfall.pyplot( diagram_waterfall, use_container_width=True - ) + ) st.write( + # _( """ - Definitionen und Methodik der Exergieanalyse basierend auf - [Morosuk und Tsatsaronis (2019)](https://doi.org/10.1016/j.energy.2018.10.090), - dessen Implementation in TESPy beschrieben in [Witte und Hofmann et al. (2022)](https://doi.org/10.3390/en15114087) - und didaktisch aufbereitet in [Witte, Freißmann und Fritz (2023)](https://fwitte.github.io/TESPy_teaching_exergy/). - """ - ) + Definitions and methodology of the exergy analysis based on + [Morosuk and Tsatsaronis (2019)](https://doi.org/10.1016/j.energy.2018.10.090), + its implementation in TESPy described in [Witte and Hofmann et al. (2022)](https://doi.org/10.3390/en15114087) + and pedagogically prepared in [Witte, Freißmann and Fritz (2023)](https://fwitte.github.io/TESPy_teaching_exergy/). + """ + # ) + ) st.info( - 'Um die Teillast zu berechnen, drücke auf "Teillast ' - + 'simulieren".' - ) + # _( + 'To calculate the partial load, click on "Simulate Partial Load".' + # ) + ) - st.button('Teillast simulieren', on_click=switch2partload) + st.button("Simulate Partial Load", on_click=switch2partload) -if mode == 'Teillast': +# --- +if mode == "Partial Load": # %% MARK: Offdesign Simulation - st.header('Betriebscharakteristik') + st.header(_("Operating Characteristics")) - if 'hp' not in ss: + if "hp" not in ss: st.warning( - ''' - Um eine Teillastsimulation durchzuführen, muss zunächst eine - Wärmepumpe ausgelegt werden. Wechseln Sie bitte zunächst in den - Modus "Auslegung". - ''' + _( + """ + To perform a partial load simulation, a heat pump must first be + designed. Please switch to the "Design" mode first. + """ + ) ) else: - if not run_pl_sim and 'partload_char' not in ss: + if not run_pl_sim and "partload_char" not in ss: # %% Landing Page st.write( - ''' - Parametrisierung der Teillastberechnung: - + Prozentualer Anteil Teillast - + Bereich der Quelltemperatur - + Bereich der Senkentemperatur - ''' + _( + """ + Parameterization of the partial load calculation: + + Percentage share of partial load + + Range of source temperature + + Range of sink temperature + """ ) + ) if run_pl_sim: # %% Run Offdesign Simulation with st.spinner( - 'Teillastsimulation wird durchgeführt... Dies kann eine ' - + 'Weile dauern.' - ): - ss.hp, ss.partload_char = ( - run_partload(ss.hp) - ) + _("Partial load simulation is running... This may take a while.") + ): + ss.hp, ss.partload_char = run_partload(ss.hp) # ss.partload_char = pd.read_csv( # 'partload_char.csv', index_col=[0, 1, 2], sep=';' # ) st.success( - 'Die Simulation der Wärmepumpencharakteristika war ' - + 'erfolgreich.' - ) + _("The simulation of the heat pump characteristics was successful.") + ) - if run_pl_sim or 'partload_char' in ss: + if run_pl_sim or "partload_char" in ss: # %% Results - with st.spinner('Ergebnisse werden visualisiert...'): - - with st.expander('Diagramme', expanded=True): + with st.spinner(_("Results are being visualized...")): + with st.expander(_("Diagrams"), expanded=True): col_left, col_right = st.columns(2) with col_left: figs, axes = ss.hp.plot_partload_char( - ss.partload_char, cmap_type='COP', - cmap='plasma', return_fig_ax=True - ) + ss.partload_char, + cmap_type="COP", + cmap="plasma", + return_fig_ax=True, + ) pl_cop_placeholder = st.empty() - if type_hs == 'Konstant': - T_select_cop = ( - ss.hp.params['offdesign']['T_hs_ff_start'] - ) - elif type_hs == 'Variabel': - T_hs_min = ss.hp.params['offdesign']['T_hs_ff_start'] - T_hs_max = ss.hp.params['offdesign']['T_hs_ff_end'] + if type_hs == "Constant": + T_select_cop = ss.hp.params["offdesign"]["T_hs_ff_start"] + elif type_hs == "Variable": + T_hs_min = ss.hp.params["offdesign"]["T_hs_ff_start"] + T_hs_max = ss.hp.params["offdesign"]["T_hs_ff_end"] T_select_cop = st.slider( - 'Quellentemperatur', + _("Source Temperature"), min_value=T_hs_min, max_value=T_hs_max, - value=int((T_hs_max+T_hs_min)/2), - format='%d °C', - key='pl_cop_slider' - ) + value=int((T_hs_max + T_hs_min) / 2), + format="%d °C", + key="pl_cop_slider", + ) pl_cop_placeholder.pyplot(figs[T_select_cop]) with col_right: figs, axes = ss.hp.plot_partload_char( - ss.partload_char, cmap_type='T_cons_ff', - cmap='plasma', return_fig_ax=True - ) + ss.partload_char, + cmap_type="T_cons_ff", + cmap="plasma", + return_fig_ax=True, + ) pl_T_cons_ff_placeholder = st.empty() - if type_hs == 'Konstant': - T_select_T_cons_ff = ( - ss.hp.params['offdesign']['T_hs_ff_start'] - ) - elif type_hs == 'Variabel': + if type_hs == "Constant": + T_select_T_cons_ff = ss.hp.params["offdesign"][ + "T_hs_ff_start" + ] + elif type_hs == "Variable": T_select_T_cons_ff = st.slider( - 'Quellentemperatur', + _("Source Temperature"), min_value=T_hs_min, max_value=T_hs_max, - value=int((T_hs_max+T_hs_min)/2), - format='%d °C', - key='pl_T_cons_ff_slider' - ) + value=int((T_hs_max + T_hs_min) / 2), + format="%d °C", + key="pl_T_cons_ff_slider", + ) pl_T_cons_ff_placeholder.pyplot(figs[T_select_T_cons_ff]) - with st.expander('Exergieanalyse Teillast', expanded=True): - + with st.expander(_("Exergy Analysis Partial Load"), expanded=True): col_left_1, col_right_1 = st.columns(2) with col_left_1: figs, axes = ss.hp.plot_partload_char( - ss.partload_char, cmap_type='epsilon', - cmap='plasma', return_fig_ax=True + ss.partload_char, + cmap_type="epsilon", + cmap="plasma", + return_fig_ax=True, ) pl_epsilon_placeholder = st.empty() - if type_hs == 'Konstant': - T_select_epsilon = ( - ss.hp.params['offdesign']['T_hs_ff_start'] - ) - elif type_hs == 'Variabel': - T_hs_min = ss.hp.params['offdesign']['T_hs_ff_start'] - T_hs_max = ss.hp.params['offdesign']['T_hs_ff_end'] + if type_hs == "Constant": + T_select_epsilon = ss.hp.params["offdesign"][ + "T_hs_ff_start" + ] + elif type_hs == "Variable": + T_hs_min = ss.hp.params["offdesign"]["T_hs_ff_start"] + T_hs_max = ss.hp.params["offdesign"]["T_hs_ff_end"] T_select_epsilon = st.slider( - 'Quellentemperatur', + _("Source Temperature"), min_value=T_hs_min, max_value=T_hs_max, value=int((T_hs_max + T_hs_min) / 2), - format='%d °C', - key='pl_epsilon_slider' + format="%d °C", + key="pl_epsilon_slider", ) pl_epsilon_placeholder.pyplot(figs[T_select_epsilon]) - st.button('Neue Wärmepumpe auslegen', on_click=reset2design) + st.button(_("Design New Heat Pump"), on_click=reset2design) diff --git a/src/heatpumps/variables.py b/src/heatpumps/variables.py index 59d53f1..3fc0ecf 100644 --- a/src/heatpumps/variables.py +++ b/src/heatpumps/variables.py @@ -1,768 +1,1051 @@ +import gettext +import pathlib + from models import (HeatPumpCascade, HeatPumpCascade2IHX, - HeatPumpCascade2IHXTrans, HeatPumpCascadeTrans, - HeatPumpEcon, HeatPumpEconIHX, HeatPumpEconIHXTrans, - HeatPumpEconTrans, HeatPumpFlash, HeatPumpFlashTrans, - HeatPumpIC, HeatPumpICTrans, HeatPumpIHX, HeatPumpIHXEcon, - HeatPumpIHXEconTrans, HeatPumpIHXPC, HeatPumpIHXPCIHX, - HeatPumpIHXPCIHXTrans, HeatPumpIHXPCTrans, - HeatPumpIHXTrans, HeatPumpPC, HeatPumpPCIHX, - HeatPumpPCIHXTrans, HeatPumpPCTrans, HeatPumpSimple, - HeatPumpSimpleTrans, HeatPumpCascadeEcon, HeatPumpCascadeEconIHX, - HeatPumpCascadeEconIHXTrans, HeatPumpCascadeEconTrans, - HeatPumpCascadeFlash, HeatPumpCascadeFlashTrans, - HeatPumpCascadeIC, HeatPumpCascadeICTrans, HeatPumpCascadeIHXEcon, + HeatPumpCascade2IHXTrans, HeatPumpCascadeEcon, + HeatPumpCascadeEconIHX, HeatPumpCascadeEconIHXTrans, + HeatPumpCascadeEconTrans, HeatPumpCascadeFlash, + HeatPumpCascadeFlashTrans, HeatPumpCascadeIC, + HeatPumpCascadeICTrans, HeatPumpCascadeIHXEcon, HeatPumpCascadeIHXEconTrans, HeatPumpCascadeIHXPC, HeatPumpCascadeIHXPCIHX, HeatPumpCascadeIHXPCIHXTrans, HeatPumpCascadeIHXPCTrans, HeatPumpCascadePC, HeatPumpCascadePCIHX, HeatPumpCascadePCIHXTrans, - HeatPumpCascadePCTrans) + HeatPumpCascadePCTrans, HeatPumpCascadeTrans, HeatPumpEcon, + HeatPumpEconIHX, HeatPumpEconIHXTrans, HeatPumpEconTrans, + HeatPumpFlash, HeatPumpFlashTrans, HeatPumpIC, + HeatPumpICTrans, HeatPumpIHX, HeatPumpIHXEcon, + HeatPumpIHXEconTrans, HeatPumpIHXPC, HeatPumpIHXPCIHX, + HeatPumpIHXPCIHXTrans, HeatPumpIHXPCTrans, + HeatPumpIHXTrans, HeatPumpPC, HeatPumpPCIHX, + HeatPumpPCIHXTrans, HeatPumpPCTrans, HeatPumpSimple, + HeatPumpSimpleTrans) + +__PRJDIR = pathlib.Path(__file__).parent.parent.absolute() +LOCDIR = __PRJDIR / "locales" + +# Initialize gettext +gettext.bindtextdomain("variables", localedir=LOCDIR) +gettext.textdomain("variables") +_ = gettext.gettext + # %% Important variables for the heat pump dashboard # %% Model parameters base_topologies = ( - 'Einfacher Kreis', - 'Zwischenkühlung', - 'Economizer', - 'Flashtank', - 'Kaskadierter Kreis' - ) + _("Simple cycle"), + _("Intercooler"), + _("Economizer"), + _("Flashtank"), + _("Cascade cycle"), +) hp_models = { - 'simple': { - 'base_topology': 'Einfacher Kreis', - 'display_name': 'Allgemein', - 'nr_ihx': 0, - 'econ_type': None, - 'comp_var': None, - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'ihx': { - 'base_topology': 'Einfacher Kreis', - 'display_name': 'Interne WÜT', - 'nr_ihx': 1, - 'econ_type': None, - 'comp_var': None, - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'simple_trans': { - 'base_topology': 'Einfacher Kreis', - 'display_name': 'Allgemein | Transkritisch', - 'nr_ihx': 0, - 'econ_type': None, - 'comp_var': None, - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'ihx_trans': { - 'base_topology': 'Einfacher Kreis', - 'display_name': 'Interne WÜT | Transkritisch', - 'nr_ihx': 1, - 'econ_type': None, - 'comp_var': None, - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'ic': { - 'base_topology': 'Zwischenkühlung', - 'display_name': 'Allgemein', - 'nr_ihx': 0, - 'econ_type': None, - 'comp_var': 'series', - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'ic_trans': { - 'base_topology': 'Zwischenkühlung', - 'display_name': 'Allgemein | Transkritisch', - 'nr_ihx': 0, - 'econ_type': None, - 'comp_var': 'series', - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'econ_closed': { - 'base_topology': 'Economizer', - 'display_name': 'Geschlossen | Reihenschaltung', - 'nr_ihx': 0, - 'econ_type': 'closed', - 'comp_var': 'series', - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'econ_closed_trans': { - 'base_topology': 'Economizer', - 'display_name': 'Geschlossen | Reihenschaltung | Transkritisch', - 'nr_ihx': 0, - 'econ_type': 'closed', - 'comp_var': 'series', - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'ihx_econ_closed': { - 'base_topology': 'Economizer', - 'display_name': 'Geschlossen | Reihenschaltung | interne WÜT (Variante A)', - 'nr_ihx': 1, - 'econ_type': 'closed', - 'comp_var': 'series', - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'ihx_econ_closed_trans': { - 'base_topology': 'Economizer', - 'display_name': 'Geschlossen | Reihenschaltung | interne WÜT (Variante A) | Transkritisch', - 'nr_ihx': 1, - 'econ_type': 'closed', - 'comp_var': 'series', - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'econ_closed_ihx': { - 'base_topology': 'Economizer', - 'display_name': 'Geschlossen | Reihenschaltung | interne WÜT (Variante B)', - 'nr_ihx': 1, - 'econ_type': 'closed', - 'comp_var': 'series', - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'econ_closed_ihx_trans': { - 'base_topology': 'Economizer', - 'display_name': 'Geschlossen | Reihenschaltung | interne WÜT (Variante B) | Transkritisch', - 'nr_ihx': 1, - 'econ_type': 'closed', - 'comp_var': 'series', - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'econ_open': { - 'base_topology': 'Economizer', - 'display_name': 'Offen | Reihenschaltung', - 'nr_ihx': 0, - 'econ_type': 'open', - 'comp_var': 'series', - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'econ_open_trans': { - 'base_topology': 'Economizer', - 'display_name': 'Offen | Reihenschaltung | Transkritisch', - 'nr_ihx': 0, - 'econ_type': 'open', - 'comp_var': 'series', - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'ihx_econ_open': { - 'base_topology': 'Economizer', - 'display_name': 'Offen | Reihenschaltung | interne WÜT (Variante A)', - 'nr_ihx': 1, - 'econ_type': 'open', - 'comp_var': 'series', - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'ihx_econ_open_trans': { - 'base_topology': 'Economizer', - 'display_name': 'Offen | Reihenschaltung | interne WÜT (Variante A) | Transkritisch', - 'nr_ihx': 1, - 'econ_type': 'open', - 'comp_var': 'series', - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'econ_open_ihx': { - 'base_topology': 'Economizer', - 'display_name': 'Offen | Reihenschaltung | interne WÜT (Variante B)', - 'nr_ihx': 1, - 'econ_type': 'open', - 'comp_var': 'series', - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'econ_open_ihx_trans': { - 'base_topology': 'Economizer', - 'display_name': 'Offen | Reihenschaltung | interne WÜT (Variante B) | Transkritisch', - 'nr_ihx': 1, - 'econ_type': 'open', - 'comp_var': 'series', - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'pc_econ_closed': { - 'base_topology': 'Economizer', - 'display_name': 'Geschlossen | Parallelschaltung', - 'nr_ihx': 0, - 'econ_type': 'closed', - 'comp_var': 'parallel', - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'pc_econ_closed_trans': { - 'base_topology': 'Economizer', - 'display_name': 'Geschlossen | Parallelschaltung | Transkritisch', - 'nr_ihx': 0, - 'econ_type': 'closed', - 'comp_var': 'parallel', - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'ihx_pc_econ_closed': { - 'base_topology': 'Economizer', - 'display_name': 'Geschlossen | Parallelschaltung | interne WÜT (Variante A)', - 'nr_ihx': 1, - 'econ_type': 'closed', - 'comp_var': 'parallel', - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'ihx_pc_econ_closed_trans': { - 'base_topology': 'Economizer', - 'display_name': 'Geschlossen | Parallelschaltung | interne WÜT (Variante A) | Transkritisch', - 'nr_ihx': 1, - 'econ_type': 'closed', - 'comp_var': 'parallel', - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'pc_econ_closed_ihx': { - 'base_topology': 'Economizer', - 'display_name': 'Geschlossen | Parallelschaltung | interne WÜT (Variante B)', - 'nr_ihx': 1, - 'econ_type': 'closed', - 'comp_var': 'parallel', - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'pc_econ_closed_ihx_trans': { - 'base_topology': 'Economizer', - 'display_name': 'Geschlossen | Parallelschaltung | interne WÜT (Variante B) | Transkritisch', - 'nr_ihx': 1, - 'econ_type': 'closed', - 'comp_var': 'parallel', - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'ihx_pc_econ_closed_ihx': { - 'base_topology': 'Economizer', - 'display_name': 'Geschlossen | Parallelschaltung | doppelte interne WÜT', - 'nr_ihx': 2, - 'econ_type': 'closed', - 'comp_var': 'parallel', - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'ihx_pc_econ_closed_ihx_trans': { - 'base_topology': 'Economizer', - 'display_name': 'Geschlossen | Parallelschaltung | doppelte interne WÜT | Transkritisch', - 'nr_ihx': 2, - 'econ_type': 'closed', - 'comp_var': 'parallel', - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'pc_econ_open': { - 'base_topology': 'Economizer', - 'display_name': 'Offen | Parallelschaltung', - 'nr_ihx': 0, - 'econ_type': 'open', - 'comp_var': 'parallel', - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'pc_econ_open_trans': { - 'base_topology': 'Economizer', - 'display_name': 'Offen | Parallelschaltung | Transkritisch', - 'nr_ihx': 0, - 'econ_type': 'open', - 'comp_var': 'parallel', - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'ihx_pc_econ_open': { - 'base_topology': 'Economizer', - 'display_name': 'Offen | Parallelschaltung | interne WÜT (Variante A)', - 'nr_ihx': 1, - 'econ_type': 'open', - 'comp_var': 'parallel', - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'ihx_pc_econ_open_trans': { - 'base_topology': 'Economizer', - 'display_name': 'Offen | Parallelschaltung | interne WÜT (Variante A) | Transkritisch', - 'nr_ihx': 1, - 'econ_type': 'open', - 'comp_var': 'parallel', - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'pc_econ_open_ihx': { - 'base_topology': 'Economizer', - 'display_name': 'Offen | Parallelschaltung | interne WÜT (Variante B)', - 'nr_ihx': 1, - 'econ_type': 'open', - 'comp_var': 'parallel', - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'pc_econ_open_ihx_trans': { - 'base_topology': 'Economizer', - 'display_name': 'Offen | Parallelschaltung | interne WÜT (Variante B) | Transkritisch', - 'nr_ihx': 1, - 'econ_type': 'open', - 'comp_var': 'parallel', - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'ihx_pc_econ_open_ihx': { - 'base_topology': 'Economizer', - 'display_name': 'Offen | Parallelschaltung | doppelte interne WÜT', - 'nr_ihx': 2, - 'econ_type': 'open', - 'comp_var': 'parallel', - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'ihx_pc_econ_open_ihx_trans': { - 'base_topology': 'Economizer', - 'display_name': 'Offen | Parallelschaltung | doppelte interne WÜT | Transkritisch', - 'nr_ihx': 2, - 'econ_type': 'open', - 'comp_var': 'parallel', - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'flash': { - 'base_topology': 'Flashtank', - 'display_name': 'Allgemein', - 'nr_ihx': 0, - 'econ_type': None, - 'comp_var': 'series', - 'nr_refrigs': 1, - 'process_type': 'subcritical' - }, - 'flash_trans': { - 'base_topology': 'Flashtank', - 'display_name': 'Allgemein | Transkritisch', - 'nr_ihx': 0, - 'econ_type': None, - 'comp_var': 'series', - 'nr_refrigs': 1, - 'process_type': 'transcritical' - }, - 'cascade': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Allgemein', - 'nr_ihx': 0, - 'econ_type': None, - 'comp_var': None, - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Allgemein | Transkritisch', - 'nr_ihx': 0, - 'econ_type': None, - 'comp_var': None, - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - 'cascade_2ihx': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Doppelte interne WÜT', - 'nr_ihx': 2, - 'econ_type': None, - 'comp_var': None, - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_2ihx_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Doppelte interne WÜT | Transkritisch', - 'nr_ihx': 2, - 'econ_type': None, - 'comp_var': None, - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - 'cascade_ic': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Zwischenkühlung', - 'nr_ihx': 0, - 'econ_type': None, - 'comp_var': 'series', - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_ic_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Zwischenkühlung | Transkritisch', - 'nr_ihx': 0, - 'econ_type': None, - 'comp_var': 'series', - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - 'cascade_econ_closed': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Geschlossen | Reihenschaltung', - 'nr_ihx': 0, - 'econ_type': 'closed', - 'comp_var': 'series', - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_econ_closed_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Geschlossen | Reihenschaltung | Transkritisch', - 'nr_ihx': 0, - 'econ_type': 'closed', - 'comp_var': 'series', - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - 'cascade_ihx_econ_closed': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Geschlossen | Reihenschaltung | interne WÜT (Variante A)', - 'nr_ihx': 2, - 'econ_type': 'closed', - 'comp_var': 'series', - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_ihx_econ_closed_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Geschlossen | Reihenschaltung | interne WÜT (Variante A) | Transkritisch', - 'nr_ihx': 2, - 'econ_type': 'closed', - 'comp_var': 'series', - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - 'cascade_econ_closed_ihx': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Geschlossen | Reihenschaltung | interne WÜT (Variante B)', - 'nr_ihx': 2, - 'econ_type': 'closed', - 'comp_var': 'series', - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_econ_closed_ihx_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Geschlossen | Reihenschaltung | interne WÜT (Variante B) | Transkritisch', - 'nr_ihx': 2, - 'econ_type': 'closed', - 'comp_var': 'series', - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - 'cascade_econ_open': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Offen | Reihenschaltung', - 'nr_ihx': 0, - 'econ_type': 'open', - 'comp_var': 'series', - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_econ_open_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Offen | Reihenschaltung | Transkritisch', - 'nr_ihx': 0, - 'econ_type': 'open', - 'comp_var': 'series', - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - 'cascade_ihx_econ_open': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Offen | Reihenschaltung | interne WÜT (Variante A)', - 'nr_ihx': 2, - 'econ_type': 'open', - 'comp_var': 'series', - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_ihx_econ_open_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Offen | Reihenschaltung | interne WÜT (Variante A) | Transkritisch', - 'nr_ihx': 2, - 'econ_type': 'open', - 'comp_var': 'series', - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - 'cascade_econ_open_ihx': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Offen | Reihenschaltung | interne WÜT (Variante B)', - 'nr_ihx': 2, - 'econ_type': 'open', - 'comp_var': 'series', - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_econ_open_ihx_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Offen | Reihenschaltung | interne WÜT (Variante B) | Transkritisch', - 'nr_ihx': 2, - 'econ_type': 'open', - 'comp_var': 'series', - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - 'cascade_pc_econ_closed': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Geschlossen | Parallelschaltung', - 'nr_ihx': 0, - 'econ_type': 'closed', - 'comp_var': 'parallel', - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_pc_econ_closed_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Geschlossen | Parallelschaltung | Transkritisch', - 'nr_ihx': 0, - 'econ_type': 'closed', - 'comp_var': 'parallel', - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - 'cascade_ihx_pc_econ_closed': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Geschlossen | Parallelschaltung | interne WÜT (Variante A)', - 'nr_ihx': 2, - 'econ_type': 'closed', - 'comp_var': 'parallel', - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_ihx_pc_econ_closed_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Geschlossen | Parallelschaltung | interne WÜT (Variante A) | Transkritisch', - 'nr_ihx': 2, - 'econ_type': 'closed', - 'comp_var': 'parallel', - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - 'cascade_pc_econ_closed_ihx': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Geschlossen | Parallelschaltung | interne WÜT (Variante B)', - 'nr_ihx': 2, - 'econ_type': 'closed', - 'comp_var': 'parallel', - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_pc_econ_closed_ihx_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Geschlossen | Parallelschaltung | interne WÜT (Variante B) | Transkritisch', - 'nr_ihx': 2, - 'econ_type': 'closed', - 'comp_var': 'parallel', - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - 'cascade_ihx_pc_econ_closed_ihx': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Geschlossen | Parallelschaltung | doppelte interne WÜT', - 'nr_ihx': 4, - 'econ_type': 'closed', - 'comp_var': 'parallel', - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_ihx_pc_econ_closed_ihx_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Geschlossen | Parallelschaltung | doppelte interne WÜT | Transkritisch', - 'nr_ihx': 4, - 'econ_type': 'closed', - 'comp_var': 'parallel', - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - 'cascade_pc_econ_open': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Offen | Parallelschaltung', - 'nr_ihx': 0, - 'econ_type': 'open', - 'comp_var': 'parallel', - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_pc_econ_open_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Offen | Parallelschaltung | Transkritisch', - 'nr_ihx': 0, - 'econ_type': 'open', - 'comp_var': 'parallel', - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - 'cascade_ihx_pc_econ_open': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Offen | Parallelschaltung | interne WÜT (Variante A)', - 'nr_ihx': 2, - 'econ_type': 'open', - 'comp_var': 'parallel', - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_ihx_pc_econ_open_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Offen | Parallelschaltung | interne WÜT (Variante A) | Transkritisch', - 'nr_ihx': 2, - 'econ_type': 'open', - 'comp_var': 'parallel', - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - 'cascade_pc_econ_open_ihx': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Offen | Parallelschaltung | interne WÜT (Variante B)', - 'nr_ihx': 2, - 'econ_type': 'open', - 'comp_var': 'parallel', - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_pc_econ_open_ihx_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Offen | Parallelschaltung | interne WÜT (Variante B) | Transkritisch', - 'nr_ihx': 2, - 'econ_type': 'open', - 'comp_var': 'parallel', - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - 'cascade_ihx_pc_econ_open_ihx': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Offen | Parallelschaltung | doppelte interne WÜT', - 'nr_ihx': 4, - 'econ_type': 'open', - 'comp_var': 'parallel', - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_ihx_pc_econ_open_ihx_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Offen | Parallelschaltung | doppelte interne WÜT | Transkritisch', - 'nr_ihx': 4, - 'econ_type': 'open', - 'comp_var': 'parallel', - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - 'cascade_flash': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Flashtank', - 'nr_ihx': 0, - 'econ_type': None, - 'comp_var': 'series', - 'nr_refrigs': 2, - 'process_type': 'subcritical' - }, - 'cascade_flash_trans': { - 'base_topology': 'Kaskadierter Kreis', - 'display_name': 'Flashtank | Transkritisch', - 'nr_ihx': 0, - 'econ_type': None, - 'comp_var': 'series', - 'nr_refrigs': 2, - 'process_type': 'transcritical' - }, - } + "simple": { + "base_topology": _("Simple cycle"), + "display_tags": [ + _("General"), + ], + "nr_ihx": 0, + "econ_type": None, + "comp_var": None, + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "ihx": { + "base_topology": _("Simple cycle"), + "display_tags": [ + _("Internal Heat Exchanger"), + ], + "nr_ihx": 1, + "econ_type": None, + "comp_var": None, + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "simple_trans": { + "base_topology": _("Simple cycle"), + "display_tags": [ + _("General"), + _("Transcritical"), + ], + "nr_ihx": 0, + "econ_type": None, + "comp_var": None, + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "ihx_trans": { + "base_topology": _("Simple cycle"), + "display_tags": [ + _("Internal Heat Exchanger"), + _("Transcritical"), + ], + "nr_ihx": 1, + "econ_type": None, + "comp_var": None, + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "ic": { + "base_topology": _("Intercooler"), + "display_tags": [ + _("General"), + ], + "nr_ihx": 0, + "econ_type": None, + "comp_var": "series", + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "ic_trans": { + "base_topology": _("Intercooler"), + "display_tags": [ + _("General"), + _("Transcritical"), + ], + "nr_ihx": 0, + "econ_type": None, + "comp_var": "series", + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "econ_closed": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Closed"), + _("Serial Connection"), + ], + "nr_ihx": 0, + "econ_type": "closed", + "comp_var": "series", + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "econ_closed_trans": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Closed"), + _("Serial Connection"), + _("Transcritical"), + ], + "nr_ihx": 0, + "econ_type": "closed", + "comp_var": "series", + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "ihx_econ_closed": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Closed"), + _("Serial Connection"), + _("Internal Heat Exchanger (Variant A)"), + ], + "nr_ihx": 1, + "econ_type": "closed", + "comp_var": "series", + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "ihx_econ_closed_trans": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Closed"), + _("Serial Connection"), + _("Internal Heat Exchanger (Variant A)"), + _("Transcritical"), + ], + "nr_ihx": 1, + "econ_type": "closed", + "comp_var": "series", + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "econ_closed_ihx": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Closed"), + _("Serial Connection"), + _("Internal Heat Exchanger (Variant B)"), + ], + "nr_ihx": 1, + "econ_type": "closed", + "comp_var": "series", + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "econ_closed_ihx_trans": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Closed"), + _("Serial Connection"), + _("Internal Heat Exchanger (Variant B)"), + _("Transcritical"), + ], + "nr_ihx": 1, + "econ_type": "closed", + "comp_var": "series", + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "econ_open": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Open"), + _("Serial Connection"), + ], + "nr_ihx": 0, + "econ_type": "open", + "comp_var": "series", + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "econ_open_trans": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Open"), + _("Serial Connection"), + _("Transcritical"), + ], + "nr_ihx": 0, + "econ_type": "open", + "comp_var": "series", + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "ihx_econ_open": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Open"), + _("Serial Connection"), + _("Internal Heat Exchanger (Variant A)"), + ], + "nr_ihx": 1, + "econ_type": "open", + "comp_var": "series", + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "ihx_econ_open_trans": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Open"), + _("Serial Connection"), + _("Internal Heat Exchanger (Variant A)"), + _("Transcritical"), + ], + "nr_ihx": 1, + "econ_type": "open", + "comp_var": "series", + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "econ_open_ihx": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Open"), + _("Serial Connection"), + _("Internal Heat Exchanger (Variant B)"), + ], + "nr_ihx": 1, + "econ_type": "open", + "comp_var": "series", + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "econ_open_ihx_trans": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Open"), + _("Serial Connection"), + _("Internal Heat Exchanger (Variant B)"), + _("Transcritical"), + ], + "nr_ihx": 1, + "econ_type": "open", + "comp_var": "series", + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "pc_econ_closed": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Closed"), + _("Parallel Connection"), + ], + "nr_ihx": 0, + "econ_type": "closed", + "comp_var": "parallel", + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "pc_econ_closed_trans": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Closed"), + _("Parallel Connection"), + _("Transcritical"), + ], + "nr_ihx": 0, + "econ_type": "closed", + "comp_var": "parallel", + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "ihx_pc_econ_closed": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Closed"), + _("Parallel Connection"), + _("Internal Heat Exchanger (Variant A)"), + ], + "nr_ihx": 1, + "econ_type": "closed", + "comp_var": "parallel", + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "ihx_pc_econ_closed_trans": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Closed"), + _("Parallel Connection"), + _("Internal Heat Exchanger (Variant A)"), + _("Transcritical"), + ], + "nr_ihx": 1, + "econ_type": "closed", + "comp_var": "parallel", + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "pc_econ_closed_ihx": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Closed"), + _("Parallel Connection"), + _("Internal Heat Exchanger (Variant B)"), + ], + "nr_ihx": 1, + "econ_type": "closed", + "comp_var": "parallel", + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "pc_econ_closed_ihx_trans": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Closed"), + _("Parallel Connection"), + _("Internal Heat Exchanger (Variant B)"), + _("Transcritical"), + ], + "nr_ihx": 1, + "econ_type": "closed", + "comp_var": "parallel", + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "ihx_pc_econ_closed_ihx": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Closed"), + _("Parallel Connection"), + _("Double Internal Heat Exchanger"), + ], + "nr_ihx": 2, + "econ_type": "closed", + "comp_var": "parallel", + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "ihx_pc_econ_closed_ihx_trans": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Closed"), + _("Parallel Connection"), + _("Double Internal Heat Exchanger"), + _("Transcritical"), + ], + "nr_ihx": 2, + "econ_type": "closed", + "comp_var": "parallel", + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "pc_econ_open": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Open"), + _("Parallel Connection"), + ], + "nr_ihx": 0, + "econ_type": "open", + "comp_var": "parallel", + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "pc_econ_open_trans": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Open"), + _("Parallel Connection"), + _("Transcritical"), + ], + "nr_ihx": 0, + "econ_type": "open", + "comp_var": "parallel", + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "ihx_pc_econ_open": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Open"), + _("Parallel Connection"), + _("Internal Heat Exchanger (Variant A)"), + ], + "nr_ihx": 1, + "econ_type": "open", + "comp_var": "parallel", + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "ihx_pc_econ_open_trans": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Open"), + _("Parallel Connection"), + _("Internal Heat Exchanger (Variant A)"), + _("Transcritical"), + ], + "nr_ihx": 1, + "econ_type": "open", + "comp_var": "parallel", + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "pc_econ_open_ihx": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Open"), + _("Parallel Connection"), + _("Internal Heat Exchanger (Variant B)"), + ], + "nr_ihx": 1, + "econ_type": "open", + "comp_var": "parallel", + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "pc_econ_open_ihx_trans": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Open"), + _("Parallel Connection"), + _("Internal Heat Exchanger (Variant B)"), + _("Transcritical"), + ], + "nr_ihx": 1, + "econ_type": "open", + "comp_var": "parallel", + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "ihx_pc_econ_open_ihx": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Open"), + _("Parallel Connection"), + _("Double Internal Heat Exchanger"), + ], + "nr_ihx": 2, + "econ_type": "open", + "comp_var": "parallel", + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "ihx_pc_econ_open_ihx_trans": { + "base_topology": _("Economizer"), + "display_tags": [ + _("Open"), + _("Parallel Connection"), + _("Double Internal Heat Exchanger"), + _("Transcritical"), + ], + "nr_ihx": 2, + "econ_type": "open", + "comp_var": "parallel", + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "flash": { + "base_topology": _("Flashtank"), + "display_tags": [ + _("General"), + ], + "nr_ihx": 0, + "econ_type": None, + "comp_var": "series", + "nr_refrigs": 1, + "process_type": "subcritical", + }, + "flash_trans": { + "base_topology": _("Flashtank"), + "display_tags": [ + _("General"), + _("Transcritical"), + ], + "nr_ihx": 0, + "econ_type": None, + "comp_var": "series", + "nr_refrigs": 1, + "process_type": "transcritical", + }, + "cascade": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("General"), + ], + "nr_ihx": 0, + "econ_type": None, + "comp_var": None, + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("General"), + _("Transcritical"), + ], + "nr_ihx": 0, + "econ_type": None, + "comp_var": None, + "nr_refrigs": 2, + "process_type": "transcritical", + }, + "cascade_2ihx": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Double Internal Heat Exchanger"), + ], + "nr_ihx": 2, + "econ_type": None, + "comp_var": None, + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_2ihx_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Double Internal Heat Exchanger"), + _("Transcritical"), + ], + "nr_ihx": 2, + "econ_type": None, + "comp_var": None, + "nr_refrigs": 2, + "process_type": "transcritical", + }, + "cascade_ic": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Intercooler"), + ], + "nr_ihx": 0, + "econ_type": None, + "comp_var": "series", + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_ic_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Intercooler"), + _("Transcritical"), + ], + "nr_ihx": 0, + "econ_type": None, + "comp_var": "series", + "nr_refrigs": 2, + "process_type": "transcritical", + }, + "cascade_econ_closed": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Closed"), + _("Serial Connection"), + ], + "nr_ihx": 0, + "econ_type": "closed", + "comp_var": "series", + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_econ_closed_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Closed"), + _("Serial Connection"), + _("Transcritical"), + ], + "nr_ihx": 0, + "econ_type": "closed", + "comp_var": "series", + "nr_refrigs": 2, + "process_type": "transcritical", + }, + "cascade_ihx_econ_closed": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Closed"), + _("Serial Connection"), + _("Internal Heat Exchanger (Variant A)"), + ], + "nr_ihx": 2, + "econ_type": "closed", + "comp_var": "series", + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_ihx_econ_closed_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Closed"), + _("Serial Connection"), + _("Internal Heat Exchanger (Variant A)"), + _("Transcritical"), + ], + "nr_ihx": 2, + "econ_type": "closed", + "comp_var": "series", + "nr_refrigs": 2, + "process_type": "transcritical", + }, + "cascade_econ_closed_ihx": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Closed"), + _("Serial Connection"), + _("Internal Heat Exchanger (Variant B)"), + ], + "nr_ihx": 2, + "econ_type": "closed", + "comp_var": "series", + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_econ_closed_ihx_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Closed"), + _("Serial Connection"), + _("Internal Heat Exchanger (Variant B)"), + _("Transcritical"), + ], + "nr_ihx": 2, + "econ_type": "closed", + "comp_var": "series", + "nr_refrigs": 2, + "process_type": "transcritical", + }, + "cascade_econ_open": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Open"), + _("Serial Connection"), + ], + "nr_ihx": 0, + "econ_type": "open", + "comp_var": "series", + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_econ_open_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Open"), + _("Serial Connection"), + _("Transcritical"), + ], + "nr_ihx": 0, + "econ_type": "open", + "comp_var": "series", + "nr_refrigs": 2, + "process_type": "transcritical", + }, + "cascade_ihx_econ_open": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Open"), + _("Serial Connection"), + _("Internal Heat Exchanger (Variant A)"), + ], + "nr_ihx": 2, + "econ_type": "open", + "comp_var": "series", + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_ihx_econ_open_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Open"), + _("Serial Connection"), + _("Internal Heat Exchanger (Variant A)"), + _("Transcritical"), + ], + "nr_ihx": 2, + "econ_type": "open", + "comp_var": "series", + "nr_refrigs": 2, + "process_type": "transcritical", + }, + "cascade_econ_open_ihx": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Open"), + _("Serial Connection"), + _("Internal Heat Exchanger (Variant B)"), + ], + "nr_ihx": 2, + "econ_type": "open", + "comp_var": "series", + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_econ_open_ihx_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Open"), + _("Serial Connection"), + _("Internal Heat Exchanger (Variant B)"), + _("Transcritical"), + ], + "nr_ihx": 2, + "econ_type": "open", + "comp_var": "series", + "nr_refrigs": 2, + "process_type": "transcritical", + }, + "cascade_pc_econ_closed": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Closed"), + _("Parallel Connection"), + ], + "nr_ihx": 0, + "econ_type": "closed", + "comp_var": "parallel", + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_pc_econ_closed_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Closed"), + _("Parallel Connection"), + _("Transcritical"), + ], + "nr_ihx": 0, + "econ_type": "closed", + "comp_var": "parallel", + "nr_refrigs": 2, + "process_type": "transcritical", + }, + "cascade_ihx_pc_econ_closed": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Closed"), + _("Parallel Connection"), + _("Internal Heat Exchanger (Variant A)"), + ], + "nr_ihx": 2, + "econ_type": "closed", + "comp_var": "parallel", + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_ihx_pc_econ_closed_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Closed"), + _("Parallel Connection"), + _("Internal Heat Exchanger (Variant A)"), + _("Transcritical"), + ], + "nr_ihx": 2, + "econ_type": "closed", + "comp_var": "parallel", + "nr_refrigs": 2, + "process_type": "transcritical", + }, + "cascade_pc_econ_closed_ihx": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Closed"), + _("Parallel Connection"), + _("Internal Heat Exchanger (Variant B)"), + ], + "nr_ihx": 2, + "econ_type": "closed", + "comp_var": "parallel", + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_pc_econ_closed_ihx_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Closed"), + _("Parallel Connection"), + _("Internal Heat Exchanger (Variant B)"), + _("Transcritical"), + ], + "nr_ihx": 2, + "econ_type": "closed", + "comp_var": "parallel", + "nr_refrigs": 2, + "process_type": "transcritical", + }, + "cascade_ihx_pc_econ_closed_ihx": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Closed"), + _("Parallel Connection"), + _("Double Internal Heat Exchanger"), + ], + "nr_ihx": 4, + "econ_type": "closed", + "comp_var": "parallel", + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_ihx_pc_econ_closed_ihx_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Closed"), + _("Parallel Connection"), + _("Double Internal Heat Exchanger"), + _("Transcritical"), + ], + "nr_ihx": 4, + "econ_type": "closed", + "comp_var": "parallel", + "nr_refrigs": 2, + "process_type": "transcritical", + }, + "cascade_pc_econ_open": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Open"), + _("Parallel Connection"), + ], + "nr_ihx": 0, + "econ_type": "open", + "comp_var": "parallel", + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_pc_econ_open_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Open"), + _("Parallel Connection"), + _("Transcritical"), + ], + "nr_ihx": 0, + "econ_type": "open", + "comp_var": "parallel", + "nr_refrigs": 2, + "process_type": "transcritical", + }, + "cascade_ihx_pc_econ_open": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Open"), + _("Parallel Connection"), + _("Internal Heat Exchanger (Variant A)"), + ], + "nr_ihx": 2, + "econ_type": "open", + "comp_var": "parallel", + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_ihx_pc_econ_open_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Open"), + _("Parallel Connection"), + _("Internal Heat Exchanger (Variant A)"), + _("Transcritical"), + ], + "nr_ihx": 2, + "econ_type": "open", + "comp_var": "parallel", + "nr_refrigs": 2, + "process_type": "transcritical", + }, + "cascade_pc_econ_open_ihx": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Open"), + _("Parallel Connection"), + _("Internal Heat Exchanger (Variant B)"), + ], + "nr_ihx": 2, + "econ_type": "open", + "comp_var": "parallel", + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_pc_econ_open_ihx_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Open"), + _("Parallel Connection"), + _("Internal Heat Exchanger (Variant B)"), + _("Transcritical"), + ], + "nr_ihx": 2, + "econ_type": "open", + "comp_var": "parallel", + "nr_refrigs": 2, + "process_type": "transcritical", + }, + "cascade_ihx_pc_econ_open_ihx": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Open"), + _("Parallel Connection"), + _("Double Internal Heat Exchanger"), + ], + "nr_ihx": 4, + "econ_type": "open", + "comp_var": "parallel", + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_ihx_pc_econ_open_ihx_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Open"), + _("Parallel Connection"), + _("Double Internal Heat Exchanger"), + _("Transcritical"), + ], + "nr_ihx": 4, + "econ_type": "open", + "comp_var": "parallel", + "nr_refrigs": 2, + "process_type": "transcritical", + }, + "cascade_flash": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Flashtank"), + ], + "nr_ihx": 0, + "econ_type": None, + "comp_var": "series", + "nr_refrigs": 2, + "process_type": "subcritical", + }, + "cascade_flash_trans": { + "base_topology": _("Cascade cycle"), + "display_tags": [ + _("Flashtank"), + _("Transcritical"), + ], + "nr_ihx": 0, + "econ_type": None, + "comp_var": "series", + "nr_refrigs": 2, + "process_type": "transcritical", + }, +} -hp_model_classes = { - 'simple': HeatPumpSimple, - 'simple_trans': HeatPumpSimpleTrans, - 'ihx': HeatPumpIHX, - 'ihx_trans': HeatPumpIHXTrans, - 'ic': HeatPumpIC, - 'ic_trans': HeatPumpICTrans, - 'econ_closed': HeatPumpEcon, - 'econ_closed_trans': HeatPumpEconTrans, - 'econ_closed_ihx': HeatPumpEconIHX, - 'econ_closed_ihx_trans': HeatPumpEconIHXTrans, - 'ihx_econ_closed': HeatPumpIHXEcon, - 'ihx_econ_closed_trans': HeatPumpIHXEconTrans, - 'econ_open': HeatPumpEcon, - 'econ_open_trans': HeatPumpEconTrans, - 'econ_open_ihx': HeatPumpEconIHX, - 'econ_open_ihx_trans': HeatPumpEconIHXTrans, - 'ihx_econ_open': HeatPumpIHXEcon, - 'ihx_econ_open_trans': HeatPumpIHXEconTrans, - 'pc_econ_closed': HeatPumpPC, - 'pc_econ_closed_trans': HeatPumpPCTrans, - 'ihx_pc_econ_closed': HeatPumpIHXPC, - 'ihx_pc_econ_closed_trans': HeatPumpIHXPCTrans, - 'pc_econ_closed_ihx': HeatPumpPCIHX, - 'pc_econ_closed_ihx_trans': HeatPumpPCIHXTrans, - 'ihx_pc_econ_closed_ihx': HeatPumpIHXPCIHX, - 'ihx_pc_econ_closed_ihx_trans': HeatPumpIHXPCIHXTrans, - 'pc_econ_open': HeatPumpPC, - 'pc_econ_open_trans': HeatPumpPCTrans, - 'ihx_pc_econ_open': HeatPumpIHXPC, - 'ihx_pc_econ_open_trans': HeatPumpIHXPCTrans, - 'pc_econ_open_ihx': HeatPumpPCIHX, - 'pc_econ_open_ihx_trans': HeatPumpPCIHXTrans, - 'ihx_pc_econ_open_ihx': HeatPumpIHXPCIHX, - 'ihx_pc_econ_open_ihx_trans': HeatPumpIHXPCIHXTrans, - 'flash': HeatPumpFlash, - 'flash_trans': HeatPumpFlashTrans, - 'cascade': HeatPumpCascade, - 'cascade_trans': HeatPumpCascadeTrans, - 'cascade_2ihx': HeatPumpCascade2IHX, - 'cascade_2ihx_trans': HeatPumpCascade2IHXTrans, - 'cascade_ic': HeatPumpCascadeIC, - 'cascade_ic_trans': HeatPumpCascadeICTrans, - 'cascade_econ_closed': HeatPumpCascadeEcon, - 'cascade_econ_closed_trans': HeatPumpCascadeEconTrans, - 'cascade_ihx_econ_closed': HeatPumpCascadeIHXEcon, - 'cascade_ihx_econ_closed_trans': HeatPumpCascadeIHXEconTrans, - 'cascade_econ_closed_ihx': HeatPumpCascadeEconIHX, - 'cascade_econ_closed_ihx_trans': HeatPumpCascadeEconIHXTrans, - 'cascade_econ_open': HeatPumpCascadeEcon, - 'cascade_econ_open_trans': HeatPumpCascadeEconTrans, - 'cascade_ihx_econ_open': HeatPumpCascadeIHXEcon, - 'cascade_ihx_econ_open_trans': HeatPumpCascadeIHXEconTrans, - 'cascade_econ_open_ihx': HeatPumpCascadeEconIHX, - 'cascade_econ_open_ihx_trans': HeatPumpCascadeEconIHXTrans, - 'cascade_pc_econ_closed': HeatPumpCascadePC, - 'cascade_pc_econ_closed_trans': HeatPumpCascadePCTrans, - 'cascade_ihx_pc_econ_closed': HeatPumpCascadeIHXPC, - 'cascade_ihx_pc_econ_closed_trans': HeatPumpCascadeIHXPCTrans, - 'cascade_pc_econ_closed_ihx': HeatPumpCascadePCIHX, - 'cascade_pc_econ_closed_ihx_trans': HeatPumpCascadePCIHXTrans, - 'cascade_ihx_pc_econ_closed_ihx': HeatPumpCascadeIHXPCIHX, - 'cascade_ihx_pc_econ_closed_ihx_trans': HeatPumpCascadeIHXPCIHXTrans, - 'cascade_pc_econ_open': HeatPumpCascadePC, - 'cascade_pc_econ_open_trans': HeatPumpCascadePCTrans, - 'cascade_ihx_pc_econ_open': HeatPumpCascadeIHXPC, - 'cascade_ihx_pc_econ_open_trans': HeatPumpCascadeIHXPCTrans, - 'cascade_pc_econ_open_ihx': HeatPumpCascadePCIHX, - 'cascade_pc_econ_open_ihx_trans': HeatPumpCascadePCIHXTrans, - 'cascade_ihx_pc_econ_open_ihx': HeatPumpCascadeIHXPCIHX, - 'cascade_ihx_pc_econ_open_ihx_trans': HeatPumpCascadeIHXPCIHXTrans, - 'cascade_flash': HeatPumpCascadeFlash, - 'cascade_flash_trans': HeatPumpCascadeFlashTrans - } +for k, v in hp_models.items(): + v["display_name"] = " | ".join(v["display_tags"]) -# %% Misc -econ_translate = { - 'offen': 'open', - 'geschlossen': 'closed' -} -comp_translate = { - 'Reihenschaltung': 'series', - 'Parallelschaltung': 'parallel' +hp_model_classes = { + "simple": HeatPumpSimple, + "simple_trans": HeatPumpSimpleTrans, + "ihx": HeatPumpIHX, + "ihx_trans": HeatPumpIHXTrans, + "ic": HeatPumpIC, + "ic_trans": HeatPumpICTrans, + "econ_closed": HeatPumpEcon, + "econ_closed_trans": HeatPumpEconTrans, + "econ_closed_ihx": HeatPumpEconIHX, + "econ_closed_ihx_trans": HeatPumpEconIHXTrans, + "ihx_econ_closed": HeatPumpIHXEcon, + "ihx_econ_closed_trans": HeatPumpIHXEconTrans, + "econ_open": HeatPumpEcon, + "econ_open_trans": HeatPumpEconTrans, + "econ_open_ihx": HeatPumpEconIHX, + "econ_open_ihx_trans": HeatPumpEconIHXTrans, + "ihx_econ_open": HeatPumpIHXEcon, + "ihx_econ_open_trans": HeatPumpIHXEconTrans, + "pc_econ_closed": HeatPumpPC, + "pc_econ_closed_trans": HeatPumpPCTrans, + "ihx_pc_econ_closed": HeatPumpIHXPC, + "ihx_pc_econ_closed_trans": HeatPumpIHXPCTrans, + "pc_econ_closed_ihx": HeatPumpPCIHX, + "pc_econ_closed_ihx_trans": HeatPumpPCIHXTrans, + "ihx_pc_econ_closed_ihx": HeatPumpIHXPCIHX, + "ihx_pc_econ_closed_ihx_trans": HeatPumpIHXPCIHXTrans, + "pc_econ_open": HeatPumpPC, + "pc_econ_open_trans": HeatPumpPCTrans, + "ihx_pc_econ_open": HeatPumpIHXPC, + "ihx_pc_econ_open_trans": HeatPumpIHXPCTrans, + "pc_econ_open_ihx": HeatPumpPCIHX, + "pc_econ_open_ihx_trans": HeatPumpPCIHXTrans, + "ihx_pc_econ_open_ihx": HeatPumpIHXPCIHX, + "ihx_pc_econ_open_ihx_trans": HeatPumpIHXPCIHXTrans, + "flash": HeatPumpFlash, + "flash_trans": HeatPumpFlashTrans, + "cascade": HeatPumpCascade, + "cascade_trans": HeatPumpCascadeTrans, + "cascade_2ihx": HeatPumpCascade2IHX, + "cascade_2ihx_trans": HeatPumpCascade2IHXTrans, + "cascade_ic": HeatPumpCascadeIC, + "cascade_ic_trans": HeatPumpCascadeICTrans, + "cascade_econ_closed": HeatPumpCascadeEcon, + "cascade_econ_closed_trans": HeatPumpCascadeEconTrans, + "cascade_ihx_econ_closed": HeatPumpCascadeIHXEcon, + "cascade_ihx_econ_closed_trans": HeatPumpCascadeIHXEconTrans, + "cascade_econ_closed_ihx": HeatPumpCascadeEconIHX, + "cascade_econ_closed_ihx_trans": HeatPumpCascadeEconIHXTrans, + "cascade_econ_open": HeatPumpCascadeEcon, + "cascade_econ_open_trans": HeatPumpCascadeEconTrans, + "cascade_ihx_econ_open": HeatPumpCascadeIHXEcon, + "cascade_ihx_econ_open_trans": HeatPumpCascadeIHXEconTrans, + "cascade_econ_open_ihx": HeatPumpCascadeEconIHX, + "cascade_econ_open_ihx_trans": HeatPumpCascadeEconIHXTrans, + "cascade_pc_econ_closed": HeatPumpCascadePC, + "cascade_pc_econ_closed_trans": HeatPumpCascadePCTrans, + "cascade_ihx_pc_econ_closed": HeatPumpCascadeIHXPC, + "cascade_ihx_pc_econ_closed_trans": HeatPumpCascadeIHXPCTrans, + "cascade_pc_econ_closed_ihx": HeatPumpCascadePCIHX, + "cascade_pc_econ_closed_ihx_trans": HeatPumpCascadePCIHXTrans, + "cascade_ihx_pc_econ_closed_ihx": HeatPumpCascadeIHXPCIHX, + "cascade_ihx_pc_econ_closed_ihx_trans": HeatPumpCascadeIHXPCIHXTrans, + "cascade_pc_econ_open": HeatPumpCascadePC, + "cascade_pc_econ_open_trans": HeatPumpCascadePCTrans, + "cascade_ihx_pc_econ_open": HeatPumpCascadeIHXPC, + "cascade_ihx_pc_econ_open_trans": HeatPumpCascadeIHXPCTrans, + "cascade_pc_econ_open_ihx": HeatPumpCascadePCIHX, + "cascade_pc_econ_open_ihx_trans": HeatPumpCascadePCIHXTrans, + "cascade_ihx_pc_econ_open_ihx": HeatPumpCascadeIHXPCIHX, + "cascade_ihx_pc_econ_open_ihx_trans": HeatPumpCascadeIHXPCIHXTrans, + "cascade_flash": HeatPumpCascadeFlash, + "cascade_flash_trans": HeatPumpCascadeFlashTrans, } + # %% Styling -st_color_hex = '#ff4b4b' +st_color_hex = "#ff4b4b"