Source code for tessif_examples.basic.zero_costs_es

# src/tessif_examples/zero_costs_es.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_zero_costs_es(): """Create a zero costs example problem. Create a small energy system having to costs alocated to commitment and expansion, but a low emission consttaint. Interesting about this example is the fact that there are many possible solutions, so solver ambiguity might be observed using this es. This energy system also serves as a method of validation for the post processing capabilities, to handle 0 costs in case of scaling results to maximum occuring costs. Return ------ es: :class:`tessif.system_model.AbstractEnergySystem` Tessif energy system. .. image:: ../images/zero_costs_example.png :align: center :alt: Image showing the zero costs example energy system graph. """ # 2. Create a simulation time frame of 2 one hour time steps as a # :class:`pandas.DatetimeIndex`: timeframe = date_range("7/13/1990", periods=4, freq="H") # 3. Creating the individual energy system components: # emitting source having no costs and no flow constraints but emissions emitting_source = components.Source( name="Emitting Source", outputs=("electricity",), # Minimum number of arguments required flow_emissions={"electricity": 1}, ) # capped source having no costs, no emission, no flow constraints # but existing and max installed capacity (for expansion) as well # as expansion costs capped_renewable = components.Source( name="Capped Renewable", outputs=("electricity",), # Minimum number of arguments required flow_rates={"electricity": nts.MinMax(min=0, max=2)}, expandable={"electricity": True}, expansion_limits={"electricity": nts.MinMax(min=2, max=4)}, ) # uncapped source having no costs and no emissions # and an externally set timeseries as well as expansion costs uncapped_min, uncapped_max = [1, 2, 3, 1], [1, 2, 3, 1] uncapped_renewable = components.Source( name="Uncapped Renewable", outputs=("electricity",), # Minimum number of arguments required flow_rates={"electricity": nts.MinMax(min=0, max=1)}, expandable={"electricity": True}, timeseries={"electricity": nts.MinMax(min=uncapped_min, max=uncapped_max)}, expansion_limits={ "electricity": nts.MinMax( min=max(uncapped_max), max=float("+inf"), ) }, ) electricity_line = components.Bus( name="Powerline", inputs=( "Emitting Source.electricity", "Capped Renewable.electricity", "Uncapped Renewable.electricity", ), outputs=("Demand.electricity",), # Minimum number of arguments required ) demand = components.Sink( name="Demand", inputs=("electricity",), # Minimum number of arguments required flow_rates={"electricity": nts.MinMax(min=10, max=10)}, ) global_constraints = {"emissions": 8} # 4. Creating the actual energy system: explicit_es = system_model.AbstractEnergySystem( uid="Zero Costs Example", busses=(electricity_line,), sinks=(demand,), sources=( emitting_source, capped_renewable, uncapped_renewable, ), timeframe=timeframe, global_constraints=global_constraints, ) return explicit_es