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.

Unlike emission trading, financial transfers do not change the emission reductions attributed to a region or its regional emission allowances.

Usage:

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

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

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

    $$
    \\text{financial transfer abs}_{t,r} = \\text{financial transfer}_{t,r} = 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_abs = Param(
        m.t, m.regions, initialize=0, units=quant.unit("currency_unit")
    )
    m.financial_transfer = Param(
        m.t, m.regions, initialize=0, units=quant.unit("fraction_of_GDP")
    )

    return constraints

Usage:

params = load_params()
params["model structure"]["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 transfer abs}_{t,r} \geq - \text{damage costs}_{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 transfer abs}_{t,r} = 0 \]

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

\[ \text{financial transfer abs}_{0,r} = 0. \]

financial_transfer_abs is expressed in currency units (dollars), while financial_transfer is expressed as a fraction of gross GDP:

\[ \text{financial transfer}_{t,r} = \frac{\text{financial transfer abs}_{t,r}}{\text{GDP}_{\text{gross},t,r}} \]
Source code in mimosa/components/financialtransfer/globaldamagepool.py
def get_constraints(
    m: AbstractModel, context: ModelContext
) -> 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 transfer abs}_{t,r} \\geq - \\text{damage costs}_{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 transfer abs}_{t,r} = 0
    $$

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

    $$ \\text{financial transfer abs}_{0,r} = 0. $$

    `financial_transfer_abs` is expressed in currency units (dollars), while
    `financial_transfer` is expressed as a fraction of gross GDP:

    $$
    \\text{financial transfer}_{t,r} = \\frac{\\text{financial transfer abs}_{t,r}}{\\text{GDP}_{\\text{gross},t,r}}
    $$


    """
    constraints = []

    # Note: positive financial transfer means paying money, negative means receiving
    m.financial_transfer_abs = Var(
        m.t, m.regions, initialize=0, units=quant.unit("currency_unit")
    )
    m.financial_transfer = Var(
        m.t, m.regions, initialize=0, units=quant.unit("fraction_of_GDP")
    )

    constraints.extend(
        [
            GlobalConstraint(
                lambda m, t: (
                    sum(m.financial_transfer_abs[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_abs[0, r] == 0.0,
                "no_transfer_in_first_year",
            ),
            RegionalConstraint(
                lambda m, t, r: m.financial_transfer_abs[t, r]
                >= -m.damage_costs[t, r] * m.GDP_gross[t, r],
                "received_financial_transfer_max_own_damages",
            ),
            RegionalConstraint(
                lambda m, t, r: m.financial_transfer[t, r] * m.GDP_gross[t, r]
                == m.financial_transfer_abs[t, r],
                "financial_transfer_rel_to_gdp",
            ),
        ]
    )

    return constraints