From 4a922c74b2b9f5aa9bf78800eaf4501b7ba2bdc1 Mon Sep 17 00:00:00 2001 From: Pietro Zambelli Date: Thu, 10 Oct 2024 10:01:46 +0200 Subject: [PATCH] feat: feat: Start adding multi-language support Start introducing 'gettext' on dashboard and variables to traslate the name expose on the streamlit interface, add also files to translate from english to german, remove line on '.gitignore' file to not ignore translation files fix #7 --- .gitignore | 4 - locales/dashboard.pot | 658 ++++++++++ locales/de/LC_MESSAGES/dashboard.mo | Bin 0 -> 22074 bytes locales/de/LC_MESSAGES/dashboard.po | 795 ++++++++++++ locales/de/LC_MESSAGES/variables.mo | Bin 0 -> 1331 bytes locales/de/LC_MESSAGES/variables.po | 70 ++ locales/variables.pot | 70 ++ src/heatpumps/hp_dashboard.py | 1765 ++++++++++++++------------ src/heatpumps/variables.py | 1785 ++++++++++++++++----------- 9 files changed, 3586 insertions(+), 1561 deletions(-) create mode 100644 locales/dashboard.pot create mode 100644 locales/de/LC_MESSAGES/dashboard.mo create mode 100644 locales/de/LC_MESSAGES/dashboard.po create mode 100644 locales/de/LC_MESSAGES/variables.mo create mode 100644 locales/de/LC_MESSAGES/variables.po create mode 100644 locales/variables.pot 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 0000000000000000000000000000000000000000..ecc7bcf53770b4366b1c40c4e38d56e9d12d47ae GIT binary patch literal 22074 zcmdU%d5j#{UB`&>xad+hakY|nbecCt>g)O1&O*LHVR zQ&sKp35e(h|fKA_c7k3Q}N5{)j@5Ac=yI2twkYAOZ;fKp+U8?|ZMh zs;6qk4y$mqw*0H}_ul*6zu)`K{?)6#`DZ+SLyqs_$iK<+bmKEG;2(bei#_i9ehK((z^?%H{tMm$PTU%b-v@+*-baAK_gNrI^}YyvEAT&oF9JRSa#-Y@1&Y2;0GYb? z9-!X;5uot=2GGzC2#dTg0bd3DParJxUU{$m{xI-cxIO{Y{fB{i?+Q@!+jP%=5U6oK z02Ez*0w})x3Q+6%C{XnOL!jpQ7eLMLZyfvzaFOeO1D*!nd!OgM12_h*0Dl{(@&6h4 zDDcHcEuP1LqTjlMPXi@C?|0Wf;jTXndjSwb#ez;VL!zRdgU4_o;5Q^+j3x$ubR{o)J3`*zR!JkP%hQT`gneEyv0p=#c9 ztKbFxDez^$F9XHbe+B*&@Y^m~e*7j->-&A6*7Hf=OM#ySz8LtIK=Ji&fx`P$cm3^` z?epV6(d(^1@napR_amU*{~%C${tFKNK2Uo0MR)x#4!-J&y?+e&GM=vjMW-i$l9v=H zIs2f49|CIJUw7A^0E+&94n$2}=(jcn_BgK*`;zyZ@6w(e3AfqSuFkdhcUEOquru;2VJd4iq20`>LhGNuc!X zI?x9Wfuh%s17V-{VW8yXw}7t%egY^u{+WCJckcc_0bkDjZ(6tSy&CumuHOvQcn<=_ z&nJMI-;+Siw+}>=ycCG2c)tadUi~xhao~v!`~D9BALaVTfRcmH05y*DQfg0yyK)wG5K;i!sP&>JFvpuYM8|;R0*8L$qiA%K19RX#$?+7&yEq_^@du*q-k<0uUg$UE zKoyOSz*_TLa`0^q7C`z^{O;!jQ)GUaC2y7ECv)QdVn9wl++ z_tIp1M_f10B*|zkO(yR-GRX7Esl~;ut*v&4n-gxfleE9!C+VHhET@y8A51ep%>7{0 z_KzGtwsdmABF(_sO(G#%TsqcXI=1xS;?wOg4%7a2Tko}xooFvT_~61FhdG!wXTx3; zM|SZd$T-XgNjDiK{cS(#`S~F9!`m7Zas{L9EXw@NAPc*G5+6A7%}Ys|WYeLc@AZ-rj{-p}Hdr9hdk}UU`cV{}XbQIH*eu9kV$${hCyqIL;pc@QfaVgHnk5v}b zB+i{Ah71Vwab$ey#Qi5v-htPJ@cB1ShffD3|CSzp_<_n;Qpl}n6mFxIW4PCvW{Vqx zFdYY@`_6`0)Q|6j^7mbt7s2S`R;T^4R?kEj@7Z{s$kr|G!1pH}dl@#95wB zJ4UGvHB#+e$<#+E{5aV{k&KohsLaaGqH#g{D9*#Q7j(i#6k^wQGEMzK807wBI-ax{ z*q|DPy&Oc{a5G4c`f+$WhkJU`h^QN(HW}6rp)#r=o$m~i2s?=dNW)$l^}{rX^P_$i z-r{WJcThAzBs;)jglX1@T5~kmwmYK`O-MRnmigl;Lbe(D*(B^>dc$tJnMm*}3sKw7 zXxa^r`a%}o4y5Nt4c0syPnb zY8r?6R+0{-w^=6CZGXAjH5O9(d=#|Ii6x^Mjf*x@2yb@=K@8c@rdW$jkhFwPun0l7 z%bIPWOeJ9tza1foVm{PEK(HmO?#P)dYx|fHKHdrm1%PQdf}VVBsNNeT zTTEW&JK2J5$uyr#^X#aP6&V?69VAtSaf^P+B6l{(V zQ&d&Tog~Q^eaU$tgWV(!{aX<;-p}R`Cv~AGoQf*c6V9YfJdK{2kbUFkt#zzm5DbF!>c`yu(cdf^o#e}v7yn)>wO&JC<%5YdO zilg2rFJxhF5dz`SW^RIY5kPeEn#e@NKmCESh}fAr;}aBA9nO5~+c>UqgZ%A@ru=w1-ju`b`3Yo6{k3gY7Go7UL(By7j3&)SG>N+lFBrHkgErkV z#I!8B6=l<4%j@~vbpb*kfz_3V)z|qQo7<9K=Rt*puSuK`Qu8QE<1tvk>z$`gp6HOGl zRfNl3B^6`nid}H!2BYdk)hQYbwX<9iVbZISbY9^kR}j<@z?z7eHnuEoo2?P+E8^YM zpf#jYH;X43P0bo@p#=0jvLE7HWnsNhcstsRMp3?v7Wad+E7~)B4WA=ro=j}1Ma0Ap z+GMH_R-YP*5}?vNKwHZ#qOBTE3}{dOK+>m@$ju~1ISIFu4lc@7M#}0^9%hs6HuLT> zLEg!zF)a8;_!x;M>>Q8)*Tyi4aYYj9uQ>&6(2$mYb3F(17)q1_nlYfYy>CZ5U*rcq zW+^4|b3tXj$^uS2?b>#U55vI%OttOESrzowY=Q~R8$X{wlE zRi}}4B0G&msAm=cPmLZl&Vtv6QQjI6g2&}ts(0N~u7(H|9yy5{@mvb>$tcN3(PoJS zC*tl^mvg;p0UL3h8%?3z*(fMc;pMSEWNLK@F|@uj(z_^<9%109E52bm@+i#ev#UF? zjae!{UQ>-7D`rP2&&-9}{J0mTrtDA?X`2TtBVU6lR2*y~q$o&+;~rZsy2m&>-(b0u ztKHzUa&%`5F}(Ncrh-g&oBnK`kU^~`hgl(RMU*Bu!Y8H-8?G#d(MJNK2z%Mkg& zW`ZdyEW1nhh#2z}j}!O`UqUPvmeOYYx96}(*~^61cpU5a6$ofL=%EXMtxe2K>KDu* zfe4fmuuM+Bl~>yUCJn!T8X4zl0>s=OQWP77-Tt14#w^AagNTQT6%2b^6@$5#WSASd zlJSe3rE7AYAxeqjDqc(yWqs1jpBb+)hqQvFh}O^+6K~dINf$;IF3yIJ^XTToNE^7Q z7HjHS5urV(iDC?YOdLsAG^=FHp~{n-_oDb#nB_A1d;%J+fWR$`T@}IRJp?KiiuUq8_z`;V#s*I|ba}Fg?U2R@gTmE{L3y!VM zEjor&s6Gn{ZW@1B+AUWuXI+a)I8J(t#?8&!l@`8h-qjkFvYbSCD*>Yw@hjTo8wQ*Ka-5d`0-AZcBUj>E(E~%*(g`eJMK~2C4FJQV~1wjo_^@I? zy=5Xb$@iHu^F6X+cB&S~{R-$~LGY8U~JVk&@T zRAw`4*y6Kk7f}j4h{tuYjrutW2$yyohr-U`M$QF(D$T+Jj9-ik|eJKO%7-W}$_Q`wv9_kJKdy7a#0 z`^WdW|JcUGeZSGO1HRh_e+r6c_xgAcSUeK%X5FZ*qubRO_6eyBIWF1Nv3m2 zO5QtvgJ2_H08cM=pRsmWAmfE3RU%DDI&5 zE=5^~x^xhS?6n>ErWvPD?FG*SoUGk9Q(ke~4&G|gKQdWp4Q4C4oV5KPh~9U~UoSQq zQ1eCE4bo0dy(>0*L-)_j=UCp%So()E3`}@Pz!|n0|lSV=i z0w6Q%2y{qM}R`uLJBEwXbufi}b%)f?(+V8D$8)P$-DJ}d75oWs$7W;g28@jln z(CnsL`5uwxF%C1Xj^|yq>#mwGkgpq4PTJTFInSpP&yh8h$1Bxh-ENRo)o9(;6g#9~ zv(Q0|%e-}!%k96uGh*h}+)hg#{HE*dh)pH?7*9-cK#P@``&Y_8i&rKw#z8jBO>ZHrAl>szp&5!7*hZYpqa@ zz0vs^MAH;12wj|M{f_n{XX-OR)~d5HL)faDnT4qWUB=K$zt=Q#kL0JQD%)MWiQ}t8 z{3z`#QD>-qj(Zvze-CI2Z&jT5Z}F?juwmlInh?xc9dGW6^bH?GMCZ*_7QO4#Xiczq z=|*|Zjx-l`H_R(?NNEW;w0$TQxq&FL?@eX2FvkN)$?);TVc&DLYMw%mZrdB1NBzaj zo9ImVRmRoZM~3~23m#2Bg|+nZYFOmm(tG1S`k2t(A`@~~nfH&+{Mtu+l&~|EOq+dq zdvA`Y&Vr@M(*z8y3*FXr3PITUQ~uiWnTyNkSN!WMSJy9GxqN8tO6w|haXoC2Jcp*Fu=}Pn96TIBuom%r~K9B%jd6Y$hWSpJ~}d8LvKHH>B6Oza#Bm}V}}S! za$<#+OyDUtMQ-Pd__m%-?ox<6P@x`JVG>t(CY#EgvAW^^yJjp$lS`&QCmK?7O(l_OKMHLhR;apY6s94R3#RodXq8yAUM!LM z>)eZlh0d7#g?-wwHfhHiP;S`d9rVpLWNBVsr-m${?nd+_c;M~ z={Qud5Vpx6cBWuPtO%1yrV%@FbKUl5(QhPOXfjb}XN_4QVQ$|TNqu=E7>xKJV^%(U ziCdTe^Phil_t_DFhuQ{5b<@eKXaMb27;k?EH$VfIi3{zfgTZ(a)yOCp>`06KTS>Yz z?Q4E}N;x9jSye2|vUa9pM3wKNkaXSW4?w4 z>d^v+M(XW;yr0t_ltLoMH@2B-Shr+8Qob>hw1JD&fzaRm1?DuMozp5UrBJZZv&JS^ zeR^~JI+)rQNTEcMCLyHO(Mv{b78vQ>WY4rS7_pZh##C9&V)SWk8D?9XdCR7(Pzc(j zI~S&t|I)D~Tgd{Sqz*+rDPtc%c`=2C8X7EWpBfdpj%=!!TXb*j2sw0Q+J(5q{`qwG zx!q?Na!U+unAR$iBvs9JB<7}-i<-E5n=sKfZGpfF6?L-R=jdk8z{RJvIXWtsslw!e znN~0_KqaM=8O$o)5Taqx1zq~ZYM>P%DYGKWl=AQy)i;rrrY$A*R8FmJ>9b>w9nTw7 z>cW^Z2Ct2#bV-t-%rksubl|sUg*+R%z8EKy9=4#~w|)cfL3Ph~TH)FV>189vOiIgU z*kiTFm!d1|&U~v`6fkR)JnI^_kc8cj?=@vs4y8Ml4lYQ5^{gYJMRQD=YA<72qtT3mjRe2XgfrrzeApB61!aDhq>y4Xh@)lPy#QYrtSs2`MZ&TH=-n;FuXse$&%0Eh3@<{I) zt5l!cc=tKB_+{Gk9Z}B5W%{v8Qfcn&grgq8gbZ3NTz>HZ4Jb5uQ7)}5cX<=P*csTl z5t*!*HFKF^S!D?2rPtEnc9aFNVixme4Gk>DI%;CW-RELjrVLf^E=FulheD=xA)%F( z7GArCZfsU2Z;t(|dN~ty;lqvBwBgexwFL+pu-R3^vpnq;hIwWjY0!aEk-{Frn(O%e z0FlP&DwL!}Of#<`YVsU z*H%OwI%YJ}!CwsOnqJT&I~~|b@Oi_;VZ3c!cMTIH4XJHKXtNF3usgOZYeI#XH7TlB zJ%);BY9knCUJpuJC@bQ|XvM->uBKa%}eZpcEhn{a%)YzF{WtGexBb(tb66SyN!WYwsVvIv>CnJYswtX30`Q8Y$m8!SBr9S^EjNX^4&ze>bI z8~|L1)YEDx^)$IxMZFtw*>w@(Sr1bfHfz9!rD?F$A1Nk(YBXej0LxulA*O_OHbV`0 zETe_1yU%6FF`I_^LqC#VdOw(;QI;$mkPIaal5lR;*|z&EU4?3Lz%9sy7^IFHv%PGi z{!OHE4r>;5vY?n%7jrvGg46jeD?wzlVt-=-=oiSxr&*^mN40fg_wNfy` z&X+1hm_w35<1FfS-lo!~UZpUN6g8|ALS|{Csg;?(pe^wk)vQ|{;sL_FduHW|d+ro- zoJI92)4;x%8XKF+m8K8t7Ub6V`nRfkYwVyi6+F`;U~2_sBzcSNvg*it^xb$TC6(i{ z7r@t6g*=VypRt_R2?9;QLM9qpxyMWFttcpEGX86kqTE!A2Y8Z0IFntai;mw|q{phUXHLL6>kad-J4F^r?arzuqTdX=CX2F=h zP|;?({qy>vE#C`?77Ami0x{=`>}lah!W=piC_g#vv*Cvt`-ObPY*G*a74fz_cv?h9 z{GqN0MF)B~8t*>4`%Ki|8y#pC7Za9Z{w&qF>ovMh6yWYy-{S>Wud3;_Pgp zGzjzQaEoBZghdx@BVWXyh0=F~e=ibA#eJgpbk{F((=(nX<^$xZ5-Q>{=bM#R;3PdcgEmQ zazXntS}ojGiEILyf&LapibrED8w*qAe}}yDN(E*N^sq5qh00;-p>L|D=iW8`(3^x( zCAQp~*;DT_hP!GFn4fl>!q_V$m>P}NQhqW!+q-VhwN8vfZ}&q((=BKOW#;z08&NtG zWvT0T%Z|Z@yRK)j`N{G3H6h}YqHVDGv!Zcu-={SCH9sqw2ls!f_Q8Fh+6KZ>=xm2z zxv5^*rQ-f(QE>7$W`gQp=kFPj9az1mZ*c5YL@zGQ!`yA_^4%@759ZEItzS5G2~JmC&BjOh|V!t+whIbgHK~&bs4a zFdDl5RR+wlI~%i;ieC|~3R{|9*)qi_1*l zS3Ppo{k*vg+6wDdaAD6YjrMS%s{6LiRWuYTkI_79&z+$h?%tZUcLPn)&IX-`#cA1yNGo^6zwV=BHp)s-a`3Rv)^KE-#1HHZf0^AyHmH+?% literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..68ca13a88a77df74504334a4e5e5a77caee92568 GIT binary patch literal 1331 zcmZ{iOK%e~5Xa46GxmHL-TG9(#xRayyu~<< zac2`gun*uK@FTbl{0g1`zkxY$WU~-E!TsQN@F=(oJP95K^WZ6Pa=^RbR?HuR2f-)c z0q`Zb8+;9NymuhS`vkK8XK)9&Hdy}-jvS#&^-qCFulLV&@R>ix zdYlW#$MK$R!I$roH8>96<$B}yVdI)mvKZwFjAOI$-Ecl)LS><9kPN$_Au(a%j2faC zca{ywl690?W#mm#P6iLcrm_*GA_!v}xAjB(P8yXpow6-4MV3-!MDI`-#|FC_32d+~ zPcNucE9<0xW}~x1pBraHH6bfz6~Y=aaw4{tLZ@RZ>I9vCS9Ci;N&PbCQf0F+)lP@V zIP4c4vsf|^6B!gJ6SHZ27n)wF;Vn>_LAxMl{fTLRDv%37tzN3m)(B`MO^$)`EKd z8eDDEQ4x7_q}l~p_GhN%Ipmdc`MS~hIE}95Dy2#=OlmxTK8Fi%WD%pAAPGkg+_}Uk zZ7)l_T$+))IzKn*T^joFHLOtT1vZQu+C~L=X<55m|0x|cyc^wuOu7*{7Rx7HIiA0e z6Vobdp=a#FZp(BsynGfmafcc1uNWr@8Anq0dWYoV>hn3VxcVY(lT#fya{pMDCCb{4 zjk0BGuD-y5RQSe3)Fy4k(tXX2wzc}UIc%eWR=;=plVLObZJ7TzxJy=6*0l+gm2n8& sYZ5}|NWAQ_whdkjv|Ul0q+IG3*L$xPw+ar5XkDrC2C_BM$bA^*HzhDkMF0Q* literal 0 HcmV?d00001 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"