Financial transfers

Back to general structure

Besides emission trading, another mechanism to redistribute costs among regions is by allowing financial transfers to compensate for damage costs. In MIMOSA, two types can be chosen: either no financial transfers (default), or a global damage cost pool.

The financial transfer module can be chosen using the parameter financialtransfer module.

Note that the difference with emission trading is that (paid for) emission reductions are not affected by any financial transfer from this module.

Usage:

params = load_params()
params["model"]["financialtransfer module"] = "notransfer"
model = MIMOSA(params)

Without financial transfers, this variable is always equal to zero:

\[ \text{financial transf.}_{t,r} = \text{rel. financial transf.} = 0.0 \]
Source code in mimosa/components/financialtransfer/notransfer.py
def get_constraints(m: AbstractModel) -> Sequence[GeneralConstraint]:
    """
    Without financial transfers, this variable is always equal to zero:

    $$
    \\text{financial transf.}_{t,r} = \\text{rel. financial transf.} = 0.0
    $$
    """
    constraints = []

    # Since it is always zero, it is better to make it a Param instead of Var for numerical stability
    m.financial_transfer = Param(m.t, m.regions, initialize=0)
    m.rel_financial_transfer = Param(m.t, m.regions, initialize=0)

    return constraints

Usage:

params = load_params()
params["model"]["financialtransfer module"] = "globaldamagepool"
model = MIMOSA(params)

When allowing financial transfers for a global damage cost pool, a region can receive financial transfers up to its level of climate damages:

\[ \text{financial transf.}_{t,r} \geq - \text{damages}_{t,r} \cdot \text{GDP}_{\text{gross},t,r} \]

The sum of financial transfers per time period should be zero, since it is a redistribution of costs:

\[ \sum_r \text{financial transf.}_{t,r} = 0 \]

Also, in the first year, no financial transfers are allowed:

\[ \text{financial_transf.}_{0,r} = 0. \]

Finally, the financial transfers are expressed in currency units (dollars). They can also be expressed as percentage of GDP:

\[ \text{rel. financial transf.}_{t,r} = \frac{\text{financial transf.}_{t,r}}{\text{GDP}_{\text{gross},t,r}} \]
Source code in mimosa/components/financialtransfer/globaldamagepool.py
def get_constraints(m: AbstractModel) -> Sequence[GeneralConstraint]:
    """
    When allowing financial transfers for a global damage cost pool, a region can
    receive financial transfers up to its level of climate damages:

    $$
    \\text{financial transf.}_{t,r} \\geq - \\text{damages}_{t,r} \\cdot \\text{GDP}_{\\text{gross},t,r}
    $$

    The sum of financial transfers per time period should be zero, since it is a redistribution
    of costs:

    $$
    \\sum_r \\text{financial transf.}_{t,r} = 0
    $$

    Also, in the first year, no financial transfers are allowed:

    $$ \\text{financial_transf.}_{0,r} = 0. $$

    Finally, the financial transfers are expressed in currency units (dollars). They can also
    be expressed as percentage of GDP:

    $$
    \\text{rel. financial transf.}_{t,r} = \\frac{\\text{financial transf.}_{t,r}}{\\text{GDP}_{\\text{gross},t,r}}
    $$


    """
    constraints = []

    # Note: positive financial transfer means paying money, negative means receiving
    m.financial_transfer = Var(m.t, m.regions, initialize=0)
    m.rel_financial_transfer = Var(m.t, m.regions, initialize=0)

    constraints.extend(
        [
            GlobalConstraint(
                lambda m, t: (
                    sum(m.financial_transfer[t, r] for r in m.regions) == 0.0
                    if t > 0
                    else Constraint.Skip
                ),
                "zero_sum_of_yearly_financial_transfer",
            ),
            RegionalInitConstraint(
                lambda m, r: m.financial_transfer[0, r] == 0.0,
                "no_transfer_in_first_year",
            ),
            RegionalConstraint(
                lambda m, t, r: m.financial_transfer[t, r]
                >= -m.damage_costs[t, r] * m.GDP_gross[t, r],
                "received_financial_transfer_max_own_damages",
            ),
            RegionalConstraint(
                lambda m, t, r: m.rel_financial_transfer[t, r] * m.GDP_gross[t, r]
                == m.financial_transfer[t, r],
                "financial_transfer_rel_to_gdp",
            ),
        ]
    )

    return constraints