Source code for tessif_examples.basic.emission_objective

# src/tessif_examples/emission_objective.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


[docs]def create_emission_objective(): """Create minimum emission constraint commitment problem example. Create a minimal working example using :mod:`tessif's model <tessif.model>` optimizing it for costs and keeping the total emissions below an emission objective. Return ------ :class:`tessif.system_model.AbstractEnergySystem` Tessif energy system. Examples -------- Generic System Visualization: .. image:: ../../_static/system_model_graphs/emission_objective.png :align: center :alt: Image showing the emission_objective example energy system graph """ # 2. Create a simulation time frame of four one-hour timesteps as a # :class:`pandas.DatetimeIndex`: timeframe = date_range("7/13/1990", periods=4, freq="H") # 3. Creating the individual energy system components: # first supply chain fuel_supply = components.Source( name="Gas Station", outputs=("fuel",), # Minimum number of arguments required flow_emissions={"fuel": 1.5}, flow_costs={"fuel": 2}, ) fuel_supply_line = components.Bus( name="Pipeline", inputs=("Gas Station.fuel",), outputs=("Generator.fuel",), # Minimum number of arguments required ) # conventional power supply is cheaper, but has emissions allocated to it power_generator = components.Transformer( name="Generator", inputs=("fuel",), outputs=("electricity",), conversions={("fuel", "electricity"): 0.42}, # Minimum number of arguments required flow_costs={"electricity": 2, "fuel": 0}, flow_emissions={"electricity": 3, "fuel": 0}, ) # second supply chain gas_supply = components.Source( name="Gas Source", outputs=("gas",), # Minimum number of arguments required flow_emissions={"gas": 0.5}, flow_costs={"gas": 1}, ) gas_grid = components.Bus( name="Gas Grid", inputs=("Gas Source.gas",), outputs=("Gas Plant.gas",), # Minimum number of arguments required ) # conventional power supply is cheaper, but has emissions allocated to it gas_plant = components.Transformer( name="Gas Plant", inputs=("gas",), outputs=("electricity",), conversions={("gas", "electricity"): 0.6}, # Minimum number of arguments required flow_rates={"electricity": (0, 5), "gas": (0, float("+inf"))}, flow_costs={"electricity": 1, "gas": 0}, flow_emissions={"electricity": 2, "gas": 0}, ) # wind power is more expensive but has no emissions allocated to it wind_power = components.Source( name="Wind Power", outputs=("electricity",), flow_costs={"electricity": 10}, ) # Demand needing 10 energy units per time step demand = components.Sink( name="Demand", inputs=("electricity",), # Minimum number of arguments required flow_rates={"electricity": nts.MinMax(min=10, max=10)}, ) electricity_line = components.Bus( name="Powerline", inputs=( "Generator.electricity", "Wind Power.electricity", "Gas Plant.electricity", ), outputs=("Demand.electricity",), # Minimum number of arguments required ) global_constraints = {"emissions": 60} # 4. Creating the actual energy system: explicit_es = system_model.AbstractEnergySystem( uid="Emission_Objective_Example", busses=(fuel_supply_line, electricity_line, gas_grid), sinks=(demand,), sources=(fuel_supply, wind_power, gas_supply), transformers=(power_generator, gas_plant), timeframe=timeframe, global_constraints=global_constraints, ) return explicit_es