Skip to content

ProcessΒΆ

The Process component is used for controllable energy conversion processes between two or more buses with arbitrary energy carriers (bus0, bus1, bus2, etc.). It serves as an alternative to Link with a different parameterisation for multi-carrier processes like electrolysis, heat pumps, or combined heat and power (CHP) plants.

  • The Process component has one internal dispatch variable p and one or more power outputs p0, p1, p2, etc. associated with the buses bus0, bus1, bus2, etc. The power at each bus is determined by pX = rateX * p, where rateX is the corresponding rate parameter. Positive rates produce energy at the bus, negative rates consume energy from it.

  • p_nom constrains the internal dispatch p and also determines how capital_cost and marginal_cost are accounted.

  • For consistency, the internal dispatch carries the same unit as the output at an optional reference bus, chosen by setting its corresponding rateX to 1. or -1..

  • The columns bus2, rate2, bus3, rate3, etc. in n.processes are automatically added to the component attributes.

  • For delayed energy transport, use the attribute delay0, delay1, ... which postpones the output at bus0, bus1, ... in terms of elapsed time, taking snapshot weightings into account. See this example.

Comparison with Link

The key difference to Link is that efficiency, efficiency2, ... are replaced by rate0, rate1, rate2, ... with a single sign convention: the power output at busX is always rateX * p. This avoids the implicit sign convention of Links where bus0 is always the input and efficiencies for additional inputs must be negative.

Process for an electrolyser

An electrolyser consuming electricity at bus0 and producing hydrogen at bus1 with 70% efficiency:

n.add(
    "Process",
    "electrolyser",
    bus0="electricity",
    bus1="hydrogen",
    rate0=-1,          # consumes 1 unit of electricity (reference bus)
    rate1=0.7,         # produces 0.7 units of hydrogen
    p_nom_extendable=True,
    capital_cost=100,  # cost per MW of electricity input
)

Process for a CHP plant

A combined heat and power plant taking gas as input and producing electricity and heat. This example illustrates sector coupling with processes including a CHP plant.

n.add(
    "Process",
    "CHP",
    bus0="gas",
    bus1="electricity",
    bus2="heat",
    rate0=-1,          # consumes 1 unit of gas
    rate1=0.3,         # produces 0.3 units of electricity
    rate2=0.5,         # produces 0.5 units of heat
    p_nom_extendable=True,
    capital_cost=50,
)

Process for the Haber-Bosch process

The Haber-Bosch process consumes electricity and hydrogen and produces ammonia. Using the ammonia output as reference bus (rate1=1):

n.add(
    "Process",
    "Haber-Bosch",
    bus0="electricity",
    bus1="ammonia",
    bus2="hydrogen",
    rate0=-costs.at["Haber-Bosch", "electricity-input"],
    rate1=1,           # reference bus
    rate2=-costs.at["Haber-Bosch", "hydrogen-input"], # in tH2/tNH3
    p_nom_extendable=True,
    capital_cost=costs.at["Haber-Bosch", "capital_cost"], # in Eur/(tNH3/h)
    marginal_cost=costs.at["Haber-Bosch", "VOM"], # in Eur/tNH3
)
attribute type unit default description status
name string nan nan Unique name Input (required)
bus0 string nan nan Name of first bus to which process is attached. Input (required)
bus1 string nan nan Name of second bus to which process is attached. Further buses (bus2, bus3, etc.) are automatically expanded as needed. Input (required)
type string nan nan Placeholder for process type. Not implemented. Input (optional)
carrier string nan nan Carrier of the process describing its technology (e.g. gas boiler, electrolyser, HVDC process). Input (optional)
rate0 static or series per unit -1 Rate of energy transfer at bus0 relative to internal power p. Can be time-dependent (e.g. to represent temperature-dependent heat pump COP). Rates for further buses (e.g. bus2, bus3, etc.) are automatically expanded as needed (e.g. rate2, rate3, etc.). Input (optional)
rate1 static or series per unit 1 Rate of energy transfer at bus1 relative to internal power p. Can be time-dependent (e.g. to represent temperature-dependent heat pump COP). Rates for further buses (e.g. bus2, bus3, etc.) are automatically expanded as needed (e.g. rate2, rate3, etc.). Input (optional)
active boolean nan True Whether to consider the component in basic functionality or not Input (optional)
build_year int year 0 Build year Input (optional)
lifetime float years inf Lifetime Input (optional)
p_nom float MW 0 Limit of power which can pass through process (in units of bus0). Ignored if p_nom_extendable=True. Input (optional)
p_nom_mod float MW 0 Unit size of process module (e.g. fixed blocks of 100 MW). Input (optional)
p_nom_extendable boolean nan False Switch to allow capacity p_nom to be extended. Input (optional)
p_nom_min float MW 0 If p_nom_extendable=True, set its minimum value. Input (optional)
p_nom_max float MW inf If p_nom_extendable=True, set its maximum value. Input (optional)
p_nom_set float MW nan If p_nom is extendable in optimization, set its value. Input (optional)
p_set static or series MW nan The dispatch set point for p0 of the process (for optimisation and power flow). Input (optional)
p_init static MW nan Active power used as a starting point for limiting the ramp in the very first snapshot (for optimisation) Input (optional)
p_min_pu static or series per unit of p_nom 0. Minimal dispatch per unit of p_nom for the process. Can also be negative. Input (optional)
p_max_pu static or series per unit of p_nom 1. Maximal dispatch per unit of p_nom for the process. Can also be negative. Input (optional)
capital_cost float currency/MW 0 Fixed period costs of extending p_nom by 1 MW (unit of bus0, e.g. annuitized investment costs). Used directly unless overnight_cost is specified. Any length factor must already be included. Input (optional)
overnight_cost float currency/MW nan Overnight (upfront) investment cost per MW (unit of bus0). If specified, PyPSA calculates annuity using discount_rate and lifetime. Takes precedence over capital_cost. Input (optional)
discount_rate float per unit nan Discount rate for annuity calculation when using overnight_cost. Supports 0% rate (simple depreciation). Input (optional)
fom_cost float currency/MW 0 Fixed period operation and maintenance costs per MW (unit of bus0), added to annuitized investment cost. Input (optional)
marginal_cost static or series currency/MWh 0. Marginal cost of 1 MWh consumption from bus0 (e.g. including variable operation and maintenance costs of an electrolyser but excluding electricity costs). Input (optional)
marginal_cost_quadratic static or series currency/MWh 0. Quadratic marginal cost for 1 MWh of consumption from bus0. Input (optional)
stand_by_cost static or series currency/h 0. Stand-by cost for operating the process. This cost is incurred whenever the status is 1 (including when dispatch decision is zero). Input (optional)
length float km 0 Length of the process. Useful for calculating capital_cost for HVDC connections. Input (optional)
terrain_factor float per unit 1 Terrain factor for increasing capital_cost calculated from length. Input (optional)
committable boolean nan False Apply unit commitment constraints. This is only possible with p_nom_extendable=False. Input (optional)
start_up_cost float currency 0 Cost to start up the process. Only used if committable=True. Input (optional)
shut_down_cost float currency 0 Cost to shut down the process. Only used if committable=True. Input (optional)
min_up_time int snapshots 0 Minimum number of snapshots for status to be 1. Only used if committable=True. Does not consider snapshot weightings. Input (optional)
min_down_time int snapshots 0 Minimum number of snapshots for status to be 0. Only used if committable=True. Does not consider snapshot weightings. Input (optional)
up_time_before int snapshots 1 Number of snapshots that the process was online before network.snapshots start. Only read if committable=True and min_up_time>0. Does not consider snapshot weightings. Input (optional)
down_time_before int snapshots 0 Number of snapshots that the process was offline before network.snapshots start. Only read if committable=True and min_down_time>0. Does not consider snapshot weightings. Input (optional)
ramp_limit_up static or series per unit nan Maximum increase from one snapshot to the next, per unit of p_nom. Ignored if NaN. Does not consider snapshot weightings. Input (optional)
ramp_limit_down static or series per unit nan Maximum decrease from one snapshot to the next, per unit of p_nom. Ignored if NaN. Does not consider snapshot weightings. Input (optional)
ramp_limit_start_up float per unit nan Maximum increase at start up, per unit of p_nom. Only used if committable=True. Ignored if NaN. Input (optional)
ramp_limit_shut_down float per unit nan Maximum decrease at shut down, per unit of p_nom. Only used if committable=True. Ignored if NaN. Input (optional)
delay0 int snapshot weighting units 0 Delay of energy delivery to bus0 in units of n.snapshot_weightings.generators. Energy withdrawn at snapshot t arrives at the first snapshot whose cumulative generator weighting start is at least delay0 units later. Auto-expanded as delay2, delay3, etc. for additional ports. Input (optional)
cyclic_delay0 boolean nan True Whether delayed energy wraps cyclically from end to start of the optimization period. If False, energy is lost at the tail and first snapshots receive nothing from delayed processes. Auto-expanded as cyclic_delay2, cyclic_delay3, etc. for additional ports. Input (optional)
delay1 int snapshot weighting units 0 Delay of energy delivery to bus1 in units of n.snapshot_weightings.generators. Energy withdrawn at snapshot t arrives at the first snapshot whose cumulative generator weighting start is at least delay1 units later. Auto-expanded as delay2, delay3, etc. for additional ports. Input (optional)
cyclic_delay1 boolean nan True Whether delayed energy wraps cyclically from end to start of the optimization period. If False, energy is lost at the tail and first snapshots receive nothing from delayed processes. Auto-expanded as cyclic_delay2, cyclic_delay3, etc. for additional ports. Input (optional)
p series MW 0. Power in component. Output
p0 series MW 0. Power at bus0 (positive if process is withdrawing from bus0). Output
p1 series MW 0. Power at bus1 (positive if process is withdrawing from bus1). Output
p_nom_opt float MW 0 Optimised nominal capacity. Output
status series nan 1. Status in the snapshot (1 is on, 0 is off). Only returned if committable=True. Output
start_up series nan 1. Whether the unit was started in the snapshot (1 is yes, 0 is no). Only returned if committable=True. Output
shut_down series nan 1. Whether the unit was shut down in the snapshot (1 is yes, 0 is no). Only returned if committable=True. Output
mu_lower series currency/MW nan Shadow price of lower p_nom limit \(-F \leq f\). Always non-negative. Output
mu_upper series currency/MW nan Shadow price of upper p_nom limit \(f \leq F\). Always non-negative. Output
mu_p_set series currency/MWh nan Shadow price of fixed dispatch p_set Output
mu_ramp_limit_up series currency/MWh nan Shadow price of upper ramp up limit Output
mu_ramp_limit_down series currency/MWh nan Shadow price of lower ramp down limit Output