Source code for tessif_examples.specialized.variable_chp

# src/tessif_examples/basic/variable_chp.py
"""Tessif minimum working example energy system model."""

import tessif.frused.namedtuples as nts
from pandas import date_range
from tessif import components, system_model

# from tessif_examples.data.model import components


[docs]def create_variable_chp(): """Create a specialized variable chp example. Same as create_chp() but with two chps that use additional functionality from tessif's :class:`tessif.components.CHP` class. Return ------ :class:`tessif.model.system_model.AbstractEnergySystem` Tessif energy system. Examples -------- Generic System Visualization: .. image:: ../../_static/system_model_graphs/variable_chp.png :align: center :alt: Image showing the variable_chp energy system graph """ # 2. Create a simulation time frame of four one-hour timesteps as a # :class:`pandas.DatetimeIndex`: periods = 4 timeframe = date_range("7/13/1990", periods=periods, freq="H") global_constraints = {"emissions": float("+inf")} # 3. Create the individual energy system components: gas_supply = components.Source( name="Gas Source", outputs=("gas",), # Minimum number of arguments required ) gas_grid = components.Bus( name="Gas Grid", inputs=("Gas Source.gas",), outputs=("CHP1.gas", "CHP2.gas"), # Minimum number of arguments required ) # conventional power supply is cheaper, but has emissions allocated to it chp1 = components.CHP( name="CHP1", inputs=("gas",), outputs=("electricity", "heat"), # Minimum number of arguments required conversions={ ("gas", "electricity"): 0.3, ("gas", "heat"): 0.2, }, conversion_factor_full_condensation={("gas", "electricity"): 0.5}, flow_rates={"electricity": (0, 9), "heat": (0, 6), "gas": (0, float("+inf"))}, flow_costs={"electricity": 3, "heat": 2, "gas": 0}, flow_emissions={"electricity": 2, "heat": 3, "gas": 0}, ) chp2 = components.CHP( name="CHP2", inputs=("gas",), outputs=("electricity", "heat"), # Minimum number of arguments required enthalpy_loss=nts.MinMax( [1.0 for p in range(0, periods)], [0.18 for p in range(0, periods)] ), power_wo_dist_heat=nts.MinMax( [8 for p in range(0, periods)], [20 for p in range(0, periods)] ), el_efficiency_wo_dist_heat=nts.MinMax( [0.43 for p in range(0, periods)], [0.53 for p in range(0, periods)] ), min_condenser_load=[3 for p in range(0, periods)], power_loss_index=[0.19 for p in range(0, periods)], back_pressure=False, flow_costs={"electricity": 3, "heat": 2, "gas": 0}, flow_emissions={"electricity": 2, "heat": 3, "gas": 0}, ) # back up power, expensive backup_power = components.Source( name="Backup Power", outputs=("electricity",), flow_costs={"electricity": 10}, ) # Power demand needing 20 energy units per time step power_demand = components.Sink( name="Power Demand", inputs=("electricity",), # Minimum number of arguments required flow_rates={"electricity": nts.MinMax(min=20, max=20)}, ) power_line = components.Bus( name="Powerline", inputs=("Backup Power.electricity", "CHP1.electricity", "CHP2.electricity"), outputs=("Power Demand.electricity",), # Minimum number of arguments required sector="Power", ) # Back up heat source, expensive backup_heat = components.Source( name="Backup Heat", outputs=("heat",), flow_costs={"heat": 10}, ) # Heat demand needing 10 energy units per time step heat_demand = components.Sink( name="Heat Demand", inputs=("heat",), # Minimum number of arguments required flow_rates={"heat": nts.MinMax(min=10, max=10)}, ) heat_grid = components.Bus( name="Heat Grid", inputs=("CHP1.heat", "CHP2.heat", "Backup Heat.heat"), outputs=("Heat Demand.heat",), # Minimum number of arguments required sector="Heat", ) # 4. Create the actual energy system: explicit_es = system_model.AbstractEnergySystem( uid="Variable_CHP_Example", busses=(gas_grid, power_line, heat_grid), chps=( chp1, chp2, ), sinks=(power_demand, heat_demand), sources=(gas_supply, backup_power, backup_heat), timeframe=timeframe, global_constraints=global_constraints, ) return explicit_es