From 4a922c74b2b9f5aa9bf78800eaf4501b7ba2bdc1 Mon Sep 17 00:00:00 2001
From: Pietro Zambelli '
+ f'{_("Temperature")} '
+ f'{params["offdesign"]["T_hs_ff_start"]} °C'
- + r'
' + 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"