flat

Flat config files can be parsed using python’s default configparser.

Basic Energy System

Note

Original config file data can be found in: tessif/examples/data/tsf/cfg/flat/basic

Reading The Data

Setting spellings.get_from's logging level to debug for decluttering doctest output:

>>> from tessif.frused import configurations
>>> configurations.spellings_logging_level = 'debug'

Reading in the data:

>>> from tessif import parse
>>> from tessif.frused.paths import example_dir
>>> import os
>>> folder = os.path.join(example_dir, 'data', 'tsf', 'cfg', 'flat', 'basic')
>>> energy_system_mapping = parse.flat_config_folder(folder)

Printing the sorted keys to check for succesfull reading:

>>> keys = list(energy_system_mapping.keys())
>>> for key in sorted(keys):
...     print(key)
bus
global_constraints
sink
source
storage
timeframe
transformer

Transforming the Read-In Data

>>> from tessif.transform.mapping2es.tsf import transform
>>> es = transform(energy_system_mapping)
>>> for node in es.nodes:
...     print(node.uid.name)
Pipeline
Power Line
Air Chanel
Gas Station
Solar Panel
Air
Demand
Generator
Battery

Using the from_external Wrapper

>>> from tessif.model.energy_system import AbstractEnergySystem as AES
>>> es = AES.from_external(
...     path = folder,
...     parser = parse.flat_config_folder)

from_external parsed energy systems get an automated id:

>>> print(es.uid)
es_from_external_source

Show the parsed node names:

>>> for node in es.nodes:
...     print(node.uid.name)
Pipeline
Power Line
Air Chanel
Gas Station
Solar Panel
Air
Demand
Generator
Battery
>>> for transformer in es.transformers:
...     print(transformer.flow_rates)
{'air': MinMax(min=0, max=inf), 'electricity': MinMax(min=0, max=15), 'fuel': MinMax(min=0, max=50)}

Using the Simulate Wrapper

Original Data – Configuration File Busses

[fuel_supply_line]
'name'='Pipeline'
'inputs'=('Gas Station.fuel',)
'outputs'=('Generator.fuel',)
# Minimum number of arguments required
'latitude'=42
'longitude'=42
'region'='Here'
'sector'='Power'
'carrier'='fuel'
'node_type'='fuel_line'
# Total number of arguments to specify bus object

[power_line]
'name'='Power Line'
'inputs'=('Generator.electricity', 'Battery.electricity', 'Solar Panel.electricity')
'outputs'=('Demand.electricity', 'Battery.electricity')
# Minimum number of arguments required
'latitude'=42
'longitude'=42
'region'='Here'
'sector'='Power'
'carrier'='Force'
'node_type'='hub'
# Total number of arguments to specify bus object

[air_bus]
'name'='Air Chanel'
'inputs'=('Air.air',)
'outputs'=('Generator.air',)

Original Data – Configuration File Sinks

[my_sink]
'name'='Demand'
'inputs'=('electricity',)
# Minimum number of arguments required
'latitude'=42
'longitude'=42
'region'='Here'
'sector'='Power'
'carrier'='Force'
'node_type'='sink'
'accumulated_amounts'={'electricity': (0, '+inf')}
'flow_rates'={'electricity': (11, 11)}
'flow_costs'={'electricity': 0}
'flow_emissions'={'electricity': 0}
'flow_gradients'={'electricity': (12, 12)}
'gradient_costs'={'electricity': (0, 0)}
'timeseries'=None
'expandable'={'electricity': False}
'expansion_costs'={'electricity': 0}
'expansion_limits'={'electricity': (0, '+inf')}
'milp'={'electricity': False}
'initial_status'=True
'status_inertia'=(2, 1)
'status_changing_costs'=(0, 0)
'number_of_status_changes'=('+inf', 8)
'costs_for_being_active'=0
# Total number of arguments to specify sink object

Original Data – Configuration File Storages

[my_storage]
'name' = 'Battery'
'input' = 'electricity'
'output' = 'electricity'
'capacity' = 10
'initial_soc' = 10
# Minimum number of arguments required

# Additional node characteristics
'latitude' = 42
'longitude' = 42
'region' = 'Here'
'sector' = 'Power'
'carrier' = 'electricity'
'node_type' = 'storage'

# linear optimization problem parameters
'idle_changes' = (0, 1)
'flow_rates' = {'electricity': (0, 30)}
'flow_efficiencies' = {'electricity': (1, 1)}
'flow_costs' = {'electricity': 0}
'flow_emissions' = {'electricity': 0}
'flow_gradients' = {'electricity': ('+inf', '+inf')}
'gradient_costs' = {'electricity': (0, 0)}
'timeseries' = None

# expansion problem parameters
'expandable' = {'capacity': False, 'electricity': False}
'expansion_costs' = {'capacity': 2, 'electricity': 0}
'expansion_limits' = {
    'capacity': (0, '+inf'),
    'electricity': (0, '+inf')}

# mixed interger linear problem parameters
'milp' = {'electricity': False}
'initial_status' = True
'status_inertia' = (0, 2)
'status_changing_costs' = (0, 0)
'number_of_status_changes' = ('+inf', 42)
'costs_for_being_active' = 0
# Total number of arguments to specify storage object

Original Data – Configuration File Sources

# each source is denoted by its own section aka '[SECTION]'
[gas_station]
'name'='Gas Station'
'outputs'=('fuel',)
# Minimum number of arguments required
'latitude'=42
'longitude'=42
'region'='Here'
'sector'='Power'
'carrier'='Gas'
'node_type'='source'

# linear optimization problem parameters
'accumulated_amounts'={'fuel': (0, '+inf')}
# 'flow_rates'={'fuel': nts.MinMax(min=0, max=22)}
'flow_rates'={'fuel': (0, 100)}
'flow_costs'={'fuel': 10}
'flow_emissions'={'fuel': 3}
# 'flow_gradients'={'fuel': nts.PositiveNegative(positive=42, negative=42)}
'flow_gradients'={'fuel': (100, 100)}
# 'gradient_costs'={'fuel': nts.PositiveNegative(positive=1, negative=1)}
'gradient_costs'={'fuel': (0, 0)}
# 'timeseries'={'fuel': nts.MinMax(min=0, max=np.array([10, 22, 22]))}
'timeseries'= None

# expansion problem parameters
'expandable'={'fuel': False}
'expansion_costs'={'fuel': 5}
# 'expansion_limits'={'fuel': nts.MinMax(min=0, max=float('+inf'))}
'expansion_limits'={'fuel': (0, '+inf')}

# mixed integer linear problem parameters
'milp'={'fuel': False}
'initial_status'=True
# 'status_inertia'=nts.OnOff(on=1, off=1)
'status_inertia'=(1, 1)
# 'status_changing_costs'=nts.OnOff(on=0, off=0)
'status_changing_costs'=(0, 0)
#'number_of_status_changes'=nts.OnOff(on=float('+inf'), off=10)
'number_of_status_changes'=('+inf', 10)
'costs_for_being_active'=0.5

# Total number of arguments to specify source object

[solar_panel]
'name'='Solar Panel'
'outputs'=('electricity',)
# Minimum number of arguments required
'latitude'=42
'longitude'=42
'region'='Here'
'sector'='Power'
'carrier'='Electricity'
'node_type'='Renewable'
'accumulated_amounts'= {'electricity': (0, '+inf')}
'flow_rates'={'electricity': (20, 20)}
'flow_costs'={'electricity': 0}
'flow_emissions'={'electricity': 0}
'flow_gradients'={'electricity': (42, 42)}
'gradient_costs'={'electricity': (0, 0)}
'timeseries'={'electricity': ([12, 3, 7], [12, 3, 7])}
'expandable'={'electricity': False}
'expansion_costs'={'electricity': 5}
'expansion_limits'={'electricity': (0, '+inf')}
'milp'={'electricity': False}
'initial_status'=True
'status_inertia' = (1, 1)
'status_changing_costs'=(0, 0)
'number_of_status_changes'=('+inf', 10)
'costs_for_being_active'= 0
# Total number of arguments to specify source object

[air]
'name'='Air'
'outputs'=('air',)

Original Data – Configuration File Timeframe

# for specifying timeframes see https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.date_range.html
  
[primary]
start =  '01/01/2015'
periods = 3
freq = 'H'

[secondary]
start =  '10/03/2019'
periods = 3
freq = 'H'

Original Data – Configuration File Transformers

[my_transformer]
'name' = 'Generator'
'inputs' = ('fuel', 'air')
'outputs' = ('electricity',)
'conversions' = {
    ('fuel', 'electricity'): 0.42,
    ('air', 'electricity'): 0.8,}
# Minimum number of arguments required


# addition node characteristics
'latitude' = 42
'longitude' = 42
'region' = 'Here'
'sector' = 'Power'
'carrier' = 'electricity'
'node_type' = 'renewable'

# linear optimization problem parmeters
'flow_rates' = {
    'air': (0, '+inf'),
    'fuel': (0, 50),
    'electricity': (0, 15)}
'flow_costs' = {'fuel': 0, 'electricity': 10, 'air': 0}
'flow_emissions' = {'fuel': 0, 'electricity': 10, 'air': 0}
'flow_gradients' = {
   'fuel': (50, 50),
   'electricity': (15, 15),
   'air': ('+inf', '+inf'),}
'gradient_costs' = {
   'air': (0, 0), 
   'fuel': (0, 0),
   'electricity': (0, 0),}
'timeseries' = None

# expansion problem paramters
'expandable' = {'fuel': False, 'electricity': False, 'air': False}
'expansion_costs' = {'fuel': 0, 'electricity': 0, 'air': 0}
'expansion_limits' = {
    'fuel': (0, '+inf'),
    'electricity': (0, '+inf'),
    'air': (0, '+inf')}

# mixed integer linear problem parameters
'milp' = {'electricity': False, 'fuel': False, 'air': False}
'initial_status' = True
'status_inertia' = (0, 2)
'status_changing_costs' = (0, 0)
'number_of_status_changes' = ('+inf', 9)
'costs_for_being_active' = 0

# Total number of arguments to specify transformer object

Original Data – Configuration File Timeframe

# for specifying timeframes see https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.date_range.html
  
[primary]
start =  '01/01/2015'
periods = 3
freq = 'H'

[secondary]
start =  '10/03/2019'
periods = 3
freq = 'H'

Original Data – Configuration File Global_Constraints

[primary]
name = 'default'
emissions = '+inf'
material = '+inf'

[secondary]
name = '80% Reduction'
emissions = 30
material = '+inf'

[tertiary]
name = '100% Reduction'
emissions = 0
material = '+inf'

[quartiary]
name = '100% Reduction - 50% Material'
emissions = 0
material = 20