Time Varying Efficiency Transformer
Occasionally it can be useful to model a transformer with time varying efficiency, i.e. a singular efficiency value for each timestep. Common application is modelling a heat pump with ambient temperature dependent efficiency values. In this case a function would be developed to map the ambient temperature to a machine specific efficiency value prior to optimizatinón. A time varying temperature profile input would lead to a respective timeseries of efficiency numbers which in turn would then be used to parameterize the transformer.
The
create_time_varying_efficiency_transformer
can be used to try out this time varying efficiency transformers. Following
results show case its usage.
Tessif Energy System
>>> from tessif.examples.data.tsf.py_hard import create_time_varying_efficiency_transformer
>>> tsf_es = create_time_varying_efficiency_transformer()
>>> for transformer in tsf_es.transformers:
... print(transformer.conversions)
{('energy', 'electricity'): [0.6, 0.8, 0.4]}
Software Specific Transformations
Note the pypsa particularities
>>> import tessif.transform.es2es.omf as tsf2omf # nopep8
>>> import tessif.transform.es2es.ppsa as tsf2pypsa # nopep8
>>> import tessif.transform.es2es.fine as tsf2fine # nopep8
>>> import tessif.transform.es2es.cllp as tsf2cllp # nopep8
>>> omf_es = tsf2omf.transform(tsf_es)
>>> pypsa_es = tsf2pypsa.transform(tsf_es, forced_links=("Transformer",))
>>> fine_es = tsf2fine.transform(tsf_es)
>>> cllp_es = tsf2cllp.transform(tsf_es)
Software Specific Optimizatinos
>>> import tessif.simulate as optimize # nopep8
>>> optimized_omf_es = optimize.omf_from_es(omf_es)
>>> optimized_pypsa_es = optimize.ppsa_from_es(pypsa_es)
>>> optimized_fine_es = optimize.fine_from_es(fine_es)
>>> optimized_cllp_es = optimize.cllp_from_es(cllp_es)
Post-Processing Using Tessif
>>> import tessif.transform.es2mapping.omf as post_process_omf # nopep8
>>> import tessif.transform.es2mapping.ppsa as post_process_pypsa # nopep8
>>> import tessif.transform.es2mapping.fine as post_process_fine # nopep8
>>> import tessif.transform.es2mapping.cllp as post_process_cllp # nopep8
>>> omf_all_res = post_process_omf.AllResultier(optimized_omf_es)
>>> pypsa_all_res = post_process_pypsa.AllResultier(optimized_pypsa_es)
>>> fine_all_res = post_process_fine.AllResultier(optimized_fine_es)
>>> cllp_all_res = post_process_cllp.AllResultier(optimized_cllp_es)
Results Insepction
Loads
>>> print(omf_all_res.node_load["Transformer"])
Transformer Com Bus Powerline
1990-07-13 00:00:00 -16.666667 10.0
1990-07-13 01:00:00 -12.500000 10.0
1990-07-13 02:00:00 -25.000000 10.0
>>> print(pypsa_all_res.node_load["Transformer"])
Transformer Com Bus Powerline
1990-07-13 00:00:00 -16.666667 10.0
1990-07-13 01:00:00 -12.500000 10.0
1990-07-13 02:00:00 -25.000000 10.0
>>> print(fine_all_res.node_load["Transformer"])
Transformer Com Bus Powerline
1990-07-13 00:00:00 -16.666667 10.0
1990-07-13 01:00:00 -12.500000 10.0
1990-07-13 02:00:00 -25.000000 10.0
>>> print(cllp_all_res.node_load["Transformer"])
Transformer Com Bus Powerline
1990-07-13 00:00:00 -16.666667 10.0
1990-07-13 01:00:00 -12.500000 10.0
1990-07-13 02:00:00 -25.000000 10.0
Inflows
>>> print(omf_all_res.node_inflows["Transformer"])
Transformer Com Bus
1990-07-13 00:00:00 16.666667
1990-07-13 01:00:00 12.500000
1990-07-13 02:00:00 25.000000
>>> print(pypsa_all_res.node_inflows["Transformer"])
Transformer Com Bus
1990-07-13 00:00:00 16.666667
1990-07-13 01:00:00 12.500000
1990-07-13 02:00:00 25.000000
>>> print(fine_all_res.node_inflows["Transformer"])
Transformer Com Bus
1990-07-13 00:00:00 16.666667
1990-07-13 01:00:00 12.500000
1990-07-13 02:00:00 25.000000
>>> print(cllp_all_res.node_inflows["Transformer"])
Transformer Com Bus
1990-07-13 00:00:00 16.666667
1990-07-13 01:00:00 12.500000
1990-07-13 02:00:00 25.000000
Outflows
>>> print(omf_all_res.node_outflows["Transformer"])
Transformer Powerline
1990-07-13 00:00:00 10.0
1990-07-13 01:00:00 10.0
1990-07-13 02:00:00 10.0
>>> print(pypsa_all_res.node_outflows["Transformer"])
Transformer Powerline
1990-07-13 00:00:00 10.0
1990-07-13 01:00:00 10.0
1990-07-13 02:00:00 10.0
>>> print(fine_all_res.node_outflows["Transformer"])
Transformer Powerline
1990-07-13 00:00:00 10.0
1990-07-13 01:00:00 10.0
1990-07-13 02:00:00 10.0
>>> print(cllp_all_res.node_outflows["Transformer"])
Transformer Powerline
1990-07-13 00:00:00 10.0
1990-07-13 01:00:00 10.0
1990-07-13 02:00:00 10.0
Summed_Loads
>>> print(omf_all_res.node_summed_loads["Transformer"])
1990-07-13 00:00:00 10.0
1990-07-13 01:00:00 10.0
1990-07-13 02:00:00 10.0
Freq: H, dtype: float64
>>> print(pypsa_all_res.node_summed_loads["Transformer"])
1990-07-13 00:00:00 10.0
1990-07-13 01:00:00 10.0
1990-07-13 02:00:00 10.0
Freq: H, dtype: float64
>>> print(fine_all_res.node_summed_loads["Transformer"])
1990-07-13 00:00:00 10.0
1990-07-13 01:00:00 10.0
1990-07-13 02:00:00 10.0
Freq: H, dtype: float64
>>> print(cllp_all_res.node_summed_loads["Transformer"])
1990-07-13 00:00:00 10.0
1990-07-13 01:00:00 10.0
1990-07-13 02:00:00 10.0
dtype: float64
Installed Capacities
>>> print(omf_all_res.node_installed_capacity["Transformer"])
10.0
>>> print(pypsa_all_res.node_installed_capacity["Transformer"])
10.0
>>> print(fine_all_res.node_installed_capacity["Transformer"])
10
>>> print(cllp_all_res.node_installed_capacity["Transformer"])
10.0
Original Capacities
>>> print(omf_all_res.node_original_capacity["Transformer"])
0
>>> print(pypsa_all_res.node_original_capacity["Transformer"])
0.0
>>> print(fine_all_res.node_original_capacity["Transformer"])
0.0
>>> print(cllp_all_res.node_original_capacity["Transformer"])
0.0
Reference Capacities
Highest Installed Capacity:
>>> print(omf_all_res.node_reference_capacity)
25.0
>>> print(pypsa_all_res.node_reference_capacity)
25.0
>>> print(fine_all_res.node_reference_capacity)
25.0
>>> print(cllp_all_res.node_reference_capacity)
25.0
Characteristic Values
>>> print(omf_all_res.node_characteristic_value["Transformer"])
1.0
>>> print(round(pypsa_all_res.node_characteristic_value["Transformer"], 1))
1.0
>>> print(fine_all_res.node_characteristic_value["Transformer"])
1.0
>>> print(cllp_all_res.node_characteristic_value["Transformer"])
1.0
Net Energy Flows
Note that the tessif -> fine implementation has some issues here
>>> print(omf_all_res.edge_net_energy_flow[("Transformer", "Powerline")])
30.0
>>> print(pypsa_all_res.edge_net_energy_flow[("Transformer", "Powerline")])
30.0
>>> print(fine_all_res.edge_net_energy_flow[("Transformer", "Powerline")])
0.0
>>> print(cllp_all_res.edge_net_energy_flow[("Transformer", "Powerline")])
30.0
Costs
>>> print(omf_all_res.edge_specific_flow_costs[("Transformer", "Powerline")])
100
>>> print(pypsa_all_res.edge_specific_flow_costs[("Transformer", "Powerline")])
100.0
>>> print(fine_all_res.edge_specific_flow_costs[("Transformer", "Powerline")])
100.0
>>> print(cllp_all_res.edge_specific_flow_costs[("Transformer", "Powerline")])
100.0
Emissions
>>> print(omf_all_res.edge_specific_emissions[("Transformer", "Powerline")])
1000
>>> print(pypsa_all_res.edge_specific_emissions[("Transformer", "Powerline")])
1000.0
>>> print(fine_all_res.edge_specific_emissions[("Transformer", "Powerline")])
1000.0
>>> print(cllp_all_res.edge_specific_emissions[("Transformer", "Powerline")])
1000.0
Edge Weights
>>> print(omf_all_res.edge_weight[("Transformer", "Powerline")])
0.1
>>> print(pypsa_all_res.edge_weight[("Transformer", "Powerline")])
0.1
>>> print(fine_all_res.edge_weight[("Transformer", "Powerline")])
0.1
>>> print(cllp_all_res.edge_weight[("Transformer", "Powerline")])
0.1
Integrated Global Results
>>> omf_igr = post_process_omf.IntegratedGlobalResultier(optimized_omf_es)
>>> ppsa_igr = post_process_pypsa.IntegratedGlobalResultier(optimized_pypsa_es)
>>> fine_igr = post_process_fine.IntegratedGlobalResultier(optimized_fine_es)
>>> cllp_igr = post_process_cllp.IntegratedGlobalResultier(optimized_cllp_es)
>>> print("omf:", omf_igr.global_results)
omf: {'emissions (sim)': 30000.0, 'costs (sim)': 3000.0, 'opex (ppcd)': 3000.0, 'capex (ppcd)': 0.0}
>>> print("ppsa:", ppsa_igr.global_results)
ppsa: {'emissions (sim)': 30000.0, 'costs (sim)': 3000.0, 'opex (ppcd)': 3000.0, 'capex (ppcd)': 0.0}
Note how the current tessif -> fine implementation averages the time varying efficiencies thus leading to higher costs and emissions while at the same time not processing the net energy flow correctly:
>>> print("fine:", fine_igr.global_results)
fine: {'emissions (sim)': 32500.0, 'costs (sim)': 3250.0, 'opex (ppcd)': 0.0, 'capex (ppcd)': 0.0}
>>> print("cllp:", cllp_igr.global_results)
cllp: {'emissions (sim)': 30000.0, 'costs (sim)': 3000.0, 'opex (ppcd)': 3000.0, 'capex (ppcd)': 0.0}