Function for calculating the total emissions of an energy system

Hi,

I am trying to write a function to calculate the total emissions of my energy system with oemof. I have started from the function in the repository:

emission_limit

because I want to know also the total amount. I characterized the flows that I want to include in the calculation with the attribute ‘emission’, and formulated it as:

def emission_tot(om,flows=None):
    
    if flows is None:
        flows = {}
        for (i, o) in om.flows:
            if hasattr(om.flows[i, o], 'emission'):
                flows[(i, o)] = om.flows[i, o]

    else:
        for (i, o) in flows:
            if not hasattr(flows[i, o], 'emission'):
                raise ValueError(('Flow with source: {0} and target: {1} '
                                 'has no attribute emission.').format(i.label, o.label))
                                                                  
    return sum(om.flow[i, o, t]*om.timeincrement[t]*om.flows[i, o].emission
                for (i, o) in flows
                for t in om.TIMESTEPS)
   
    om.emission_tot = emission_tot.__call__(om)

but if I call it as:

global_emissions = emission_tot(om, flows=None)

I get the summation expression, but I can’t evaluate it. I imagine it is an issue of pyomo language, but I can’t find the way to get the result of the expression.
Do you have any suggestion?

Thanks!

Hi,

I modified the code this way:

import pyomo.environ as po

def emission_tot(om,flows=None):
    
    if flows is None:
        flows = {}
        for (i, o) in om.flows:
            if hasattr(om.flows[i, o], 'emission'):
                flows[(i, o)] = om.flows[i, o]

    else:
        for (i, o) in flows:
            if not hasattr(flows[i, o], 'emission'):
                raise ValueError(('Flow with source: {0} and target: {1} '
                                 'has no attribute emission.').format(i.label, o.label))
    def emission_cal(m):                                                              
       return sum(m.flow[i, o, t]*m.timeincrement[t]*m.flows[i, o].emission
                for (i, o) in flows
                for t in m.TIMESTEPS)
    
    om.emission_tot = po.Objective(rule=emission_cal)
   
    return om.emission_tot()

and it seems returning a result.
Do you think is it ok?

Maybe I do not understand your question. Do you want to get the emission results or do you want to set a constraint?

Because the emission limit is a function that sets a constraint. You use it before you pass your model to the solver.

If you want to calculate the overall emission in the results you can just use the results dictionary.

Text and images licensed under CC BY 4.0Data licensed under CC0 1.0Code licensed under MITSite terms of serviceOpenmod mailing list.