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