Modelling a heat pump in oemof (solph)

How can I model a heat pump in oemof. I think it is necessary to create three buses (low temperature reservoir, electricity, high temperature). But the LinearTransformer class does not allow more than one input. Is there another way to do it?

It depends on which oemof version you use. If you use oemof < v0.1.2 (but 0.1.x) you have to model it with just two buses. You can calculate the COP in advance using the temperature of the reservoir and the average temperature of the heat bus. You can pass it as a list, numpy.array, pandas.Series etc…

from oemof import solph
cop = [2.5, 2.3, 2.5]  # length = number of time steps  
solph.LinearTransformer(
    label="pp_gas",
    inputs={electricity_bus: solph.Flow()},
    outputs={heat_bus: solph.Flow(nominal_value=maximum_output)},
    conversion_factors={electricity_bus: cop})

With oemof >= v0.1.2 you can use two or three buses. But think hard if you gain an extra value by using an extra bus.

from oemof import solph
b_el = solph.Bus(label='electricity')
b_th_low = solph.Bus(label='low_temp_heat')
b_th_high = solph.Bus(label='high_temp_heat')

cop = 3  # coefficient of performance of the heat pump

solph.LinearN1Transformer(
    label='heat_pump',
    inputs={bus_elec: Flow(), bus_low_temp_heat: Flow()},
    outputs={bus_th_high: Flow()},
    conversion_factors={bus_elec: cop,
                        b_th_low: cop/(cop-1)})
2 Likes

UPDATE: (bug fix)

With oemof > v0.2.0 the LinearTransformer and the LinearN1Transformer are renamed to Transformer . Now you can model unlimited inputs and outputs with the same class. Please notice, that the definition of the conversion_factors changed for input flows (see the API documentation of the Transformer class ).

    from oemof import solph

    b_el = solph.Bus(label='electricity')
    b_th_low = solph.Bus(label='low_temp_heat')
    b_th_high = solph.Bus(label='high_temp_heat')

    cop = 3  # coefficient of performance of the heat pump

    solph.Transformer(
        label='heat_pump',
        inputs={b_el: Flow(), b_th_low: Flow()},
        outputs={b_th_high: Flow()},
        conversion_factors={b_el: 1/cop,
                            b_th_low: (cop-1)/cop})

If you model the heat pump with one Input you just have to rename the class.

    from oemof import solph

    b_el = solph.Bus(label='electricity')
    b_heat = solph.Bus(label='heat')
    cop = [2.5, 2.3, 2.5]  # length = number of time steps  

    solph.Transformer(
        label="heat_pump",
        inputs={electricity_bus: solph.Flow()},
        outputs={heat_bus: solph.Flow(nominal_value=maximum_output)},
        conversion_factors={heat_bus: cop})
1 Like

hey @uwe.krien
I did not understand why did you put the COP like this

  cop = [2.5, 2.3, 2.5]  # length = number of time steps

i am working on a heat pump with COP range [2,5-3] based on surrounding temperature, could you please assist in how to add that ?