Skip to content

Damages

Back to general structure

Climate impacts in MIMOSA are calculated using the COACCH damage functions, developed in 2023 (see van der Wijst et al., 2023).

The COACCH damage functions are split in two parts: temperature-dependent damages (non-SLR, as a function of global mean temperature above pre-industrial), and sea-level rise damages (SLR, as function of global mean sea-level rise in meters):

\[ \text{damages}_{t,r} = \text{damages}_{\text{non-SLR},t,r} + \text{damages}_{\text{SLR},t,r} \]

Temperature-dependent damages

The temperature-dependent damages are modeled as a quadratic damage function \(D(\cdot)\) of global mean temperature:

\[ D(x; b_1, b_2) = b_1 \cdot x + b_2 \cdot x^2. \]

To calculate the damages, three transformations have to be taken from the above quadratic equation:

  • The COACCH damage functions were created as function of temperature relative to 1986-2005, which is 0.6°C above pre-industrial. For this reason, the temperature is shifted by 0.6°C.
  • The damages are scaled by a factor \(a_{q,r}\), which depends on the quantile \(q\) of the damage function. This represents the uncertainty in the damage function. For median damages, this factor is \(a_{0.5,r} = 1\). The quantile can be set using the damage quantile parameter.
  • Since we assume that until 2020 the climate damages are already incorporated in the baseline GDP, we subtract the damages of the initial time period \(t=0\).

Combining these three transformations, the damages are calculated as:

\[ \text{damages}_{\text{non-SLR},t,r} = a_{q,r} \cdot \big( D(\text{temperature}_t - 0.6; b_{1,r}, b_{2,r}) - D(T_0 - 0.6; b_{1,r}, b_{2,r}) \big). \]

All the damage coefficients are region-dependent (see Damage functions and coefficients).

Temperature-dependent damages aggregated to the world, and comparison with the literature:

Source code in mimosa/components/damages/coacch.py
def _get_constraints_temperature_dependent(
    m: AbstractModel,
) -> Sequence[GeneralConstraint]:
    """
    ## Temperature-dependent damages

    The temperature-dependent damages are modeled as a quadratic damage function $D(\\cdot)$ of global mean temperature:

    $$
    D(x; b_1, b_2) = b_1 \\cdot x + b_2 \\cdot x^2.
    $$

    To calculate the damages, three transformations have to be taken from the above quadratic equation:

    * The COACCH damage functions were created as function of temperature relative to 1986-2005, which is 0.6°C above pre-industrial.
        For this reason, the temperature is shifted by 0.6°C.
    * The damages are scaled by a factor $a_{q,r}$, which depends on the quantile $q$ of the damage function. This represents the uncertainty
        in the damage function. For median damages, this factor is $a_{0.5,r} = 1$. The quantile can be set using the [damage quantile parameter](../parameters.md#economics.damages.quantile).
    * Since we assume that until 2020 the climate damages are already incorporated in the baseline GDP,
        we subtract the damages of the initial time period $t=0$.

    Combining these three transformations, the damages are calculated as:

    $$
    \\text{damages}_{\\text{non-SLR},t,r} = a_{q,r} \\cdot \\big( D(\\text{temperature}_t - 0.6; b_{1,r}, b_{2,r}) -  D(T_0 - 0.6; b_{1,r}, b_{2,r}) \\big).
    $$

    All the damage coefficients are region-dependent (see [Damage functions and coefficients](./#damage-functions-and-coefficients)).

    ### Temperature-dependent damages aggregated to the world, and comparison with the literature:

    ``` plotly
    {"file_path": "./assets/plots/coacch_literature_comparison.json"}
    ```

    """
    constraints = []

    # Damages not related to SLR (dependent on temperature)
    m.damage_costs_non_slr = Var(m.t, m.regions, units=quant.unit("fraction_of_GDP"))

    m.damage_noslr_form = Param(
        m.regions, within=Any, doc="regional::COACCH.NoSLR_form"
    )  # String for functional form
    m.damage_noslr_b1 = Param(m.regions, doc="regional::COACCH.NoSLR_b1")
    m.damage_noslr_b2 = Param(m.regions, doc="regional::COACCH.NoSLR_b2")
    m.damage_noslr_b3 = Param(
        m.regions, within=Any, doc="regional::COACCH.NoSLR_b3"
    )  # Can be empty
    # (b2 and b3 are only used for some functional forms)

    m.damage_noslr_a = Param(
        m.regions,
        doc=lambda params: f'regional::COACCH.NoSLR_a (q={params["economics"]["damages"]["quantile"]})',
    )

    # Quadratic damage function for non-SLR damages. Factor `a` represents
    # the damage quantile
    constraints.append(
        RegionalConstraint(
            lambda m, t, r: m.damage_costs_non_slr[t, r]
            == m.damage_scale_factor
            * damage_fct(m.temperature[t] - 0.6, m.T0 - 0.6, m, r, is_slr=False),
            "damage_costs_non_slr",
        )
    )

    return constraints

Sea-level rise damages

In MIMOSA, sea-level rise damages are modelled separately from temperature dependent damages, as they occur on a different time scale: sea-level rise is a slow process with high inertia. Therefore, these damages are calculated as a function of global mean sea-level rise (SLR) in meters (calculated in the Sea-level rise component).

The SLR damages are calculated with the DIVA impact model (see Impact sectors used in the damage functions). These damages are available either with optimal adaptation (and include adaptation costs), or without adaptation. This can be chosen with the parameter coacch_slr_withadapt. By default, the optimal adaptation case is used.

Depending on the region, the SLR damages are modelled with different functional forms following from a best-fit regression. The SLR damages are either quadratic, linear, or logistic:

\[ D_{\text{\{form\}}_r}(\text{SLR}; \cdot) = \begin{cases} D_{\text{quadratic}}(\text{SLR}; b_1, b_2) = b_1 \cdot \text{SLR} + b_2 \cdot \text{SLR}^2\\[.2cm] D_{\text{linear}}(\text{SLR}; b_1) = b_1 \cdot \text{SLR}\\[.2cm] D_{\text{logistic}}(\text{SLR}; b_1, b_2, b_3) = \frac{b_1}{1 + b_2 \cdot e^{-b_3 \cdot \text{SLR}}} - \frac{b_1}{1 + b_2} \end{cases} \]

The values of \(b_1\), \(b_2\), and \(b_3\) are region-dependent and depend on whether adaptation is included or not. These are different values than the coefficients in the temperature-dependent damages. The functional form depends on the regression of the underlying impact data (see Damage functions and coefficients), and are equal to:

Region SLR (with opt. adapt.) SLR (no adaptation)
CAN Linear Quadratic
USA Linear Quadratic
MEX Linear Quadratic
RCAM Linear Quadratic
BRA Linear Quadratic
RSAM Linear Quadratic
NAF Linear Linear
WAF Linear Linear
EAF Linear Linear
SAF Linear Quadratic
WEU Logistic Linear
CEU Logistic Quadratic
TUR Linear Quadratic
UKR Linear Quadratic
STAN Linear Quadratic
RUS Linear Quadratic
ME Linear Quadratic
INDIA Linear Linear
KOR Linear Quadratic
CHN Linear Quadratic
SEAS Linear Linear
INDO Linear Linear
JAP Linear Linear
OCE Linear Quadratic
RSAS Logistic Quadratic
RSAF Linear Linear

To calculate the SLR damage costs, two additional transformations have to be taken:

  • Similar to temperature-dependent damages, the SLR damages are scaled by a factor \(a_{q,r}\), which depends on the quantile \(q\) of the damage function. This represents the uncertainty in the damage function. For median damages, this factor is \(a_{0.5,r} = 1\). The quantile can be set using the damage quantile parameter.
  • Since we assume that until 2020 the climate damages are already incorporated in the baseline GDP, we subtract the damages of the initial time period \(t=0\).

The SLR damage costs therefore become:

\[ \text{damages}_{\text{SLR},t,r} = a_{q,r} \cdot \big( D_{\text{\{form\}}_r}(\text{SLR}_t; \cdot) - D_{\text{\{form\}}_r}(\text{SLR}_0; \cdot) \big). \]
Source code in mimosa/components/damages/coacch.py
def _get_constraints_slr(m: AbstractModel) -> Sequence[GeneralConstraint]:
    """

    ## Sea-level rise damages

    In MIMOSA, sea-level rise damages are modelled separately from temperature dependent damages, as they occur
    on a different time scale: sea-level rise is a slow process with high inertia. Therefore, these damages are
    calculated as a function of global mean sea-level rise (SLR) in meters (calculated in the [Sea-level rise](sealevelrise.md) component).

    The SLR damages are calculated with the DIVA impact model (see [Impact sectors used in the damage functions](./#impact-sectors-used-in-the-damage-functions)).
    These damages are available either with optimal adaptation (and include adaptation costs), or without adaptation. This can be
    chosen with the parameter [coacch_slr_withadapt](../parameters.md#economics.damages.coacch_slr_withadapt). By default, the optimal
    adaptation case is used.

    Depending on the region, the SLR damages are modelled with different functional forms following from a best-fit regression. The
    SLR damages are either quadratic, linear, or logistic:

    $$
    D_{\\text{\\{form\\}}_r}(\\text{SLR}; \\cdot) = \\begin{cases}
    D_{\\text{quadratic}}(\\text{SLR}; b_1, b_2) = b_1 \\cdot \\text{SLR} + b_2 \\cdot \\text{SLR}^2\\\\[.2cm]
    D_{\\text{linear}}(\\text{SLR}; b_1) = b_1 \\cdot \\text{SLR}\\\\[.2cm]
    D_{\\text{logistic}}(\\text{SLR}; b_1, b_2, b_3) = \\frac{b_1}{1 + b_2 \\cdot e^{-b_3 \\cdot \\text{SLR}}} - \\frac{b_1}{1 + b_2}
    \\end{cases}
    $$

    The values of $b_1$, $b_2$, and $b_3$ are region-dependent and depend on whether adaptation is included or not. These are different
    values than the coefficients in the temperature-dependent damages. The functional form
    depends on the regression of the underlying impact data (see [Damage functions and coefficients](./#damage-functions-and-coefficients)),
    and are equal to:

    <div class="tiny_table table_first_col_header table_scrollable" markdown>
    {{ read_csv_macro("docs/assets/data/coacch_slr_form.csv") }}
    </div>

    To calculate the SLR damage costs, two additional transformations have to be taken:

    * Similar to temperature-dependent damages, the SLR damages are scaled by a factor $a_{q,r}$, which depends on the quantile $q$ of the damage function.
        This represents the uncertainty in the damage function. For median damages, this factor is $a_{0.5,r} = 1$. The quantile can be set using the
        [damage quantile parameter](../parameters.md#economics.damages.quantile).
    * Since we assume that until 2020 the climate damages are already incorporated in the baseline GDP,
        we subtract the damages of the initial time period $t=0$.

    The SLR damage costs therefore become:

    $$
    \\text{damages}_{\\text{SLR},t,r} = a_{q,r} \\cdot \\big( D_{\\text{\\{form\\}}_r}(\\text{SLR}_t; \\cdot) - D_{\\text{\\{form\\}}_r}(\\text{SLR}_0; \\cdot) \\big).
    $$

    """
    constraints = []

    # SLR damages
    m.damage_costs_slr = Var(
        m.t, m.regions, bounds=(-0.5, 0.7), units=quant.unit("fraction_of_GDP")
    )

    def slr_param_name(params, name):
        """Returns the parameter name regional::COACCH.SLR... depending on if adaptation is included or not."""
        slr_with_adapt = params["economics"]["damages"]["coacch_slr_withadapt"]
        return f'regional::COACCH.SLR-{"Ad" if slr_with_adapt else "NoAd"}_{name}'

    m.damage_slr_form = Param(
        m.regions,
        within=Any,
        doc=lambda params: slr_param_name(params, "form"),
    )  # String for functional form
    m.damage_slr_b1 = Param(
        m.regions,
        doc=lambda params: slr_param_name(params, "b1"),
    )
    m.damage_slr_b2 = Param(
        m.regions,
        within=Any,
        doc=lambda params: slr_param_name(params, "b2"),
    )  # within=Any since it can be empty for some functional forms
    m.damage_slr_b3 = Param(
        m.regions,
        within=Any,
        doc=lambda params: slr_param_name(params, "b3"),
    )  # within=Any since it can be empty for some functional forms
    # (b2 and b3 are only used for some functional forms)

    m.damage_slr_a = Param(
        m.regions,
        doc=lambda params: slr_param_name(
            params, f'a (q={params["economics"]["damages"]["quantile"]})'
        ),
    )

    # Linear damage function for SLR damages, including adaptation costs
    constraints.append(
        RegionalConstraint(
            lambda m, t, r: m.damage_costs_slr[t, r]
            == m.damage_scale_factor
            * damage_fct(m.total_SLR[t], m.total_SLR[0], m, r, is_slr=True),
            "damage_costs_slr",
        )
    )

    return constraints

Parameters defined in this module

  • damage_scale_factor: Manual scaling factor to increase or decrease damages. Type: float. Default: 1. Min: -inf. Max: inf.
  • damage quantile: Damage quantile (Only used for COACCH). Type: enum. Default: 0.5. Allowed values: [0.025, 0.05, 0.16, 0.25, 0.33, 0.5, 0.67, 0.75, 0.84, 0.95, 0.975].
Source code in mimosa/components/damages/coacch.py
def get_constraints(m: AbstractModel) -> Sequence[GeneralConstraint]:
    """
    The COACCH damage functions are split in two parts: temperature-dependent damages (non-SLR, as a function
    of global mean temperature above pre-industrial), and sea-level rise damages (SLR, as function of global mean
    sea-level rise in meters):

    $$
    \\text{damages}_{t,r} = \\text{damages}_{\\text{non-SLR},t,r} + \\text{damages}_{\\text{SLR},t,r}
    $$

    :::mimosa.components.damages.coacch._get_constraints_temperature_dependent

    :::mimosa.components.damages.coacch._get_constraints_slr



    ## Parameters defined in this module
    - damage_scale_factor: Manual scaling factor to increase or decrease damages. Type: float. Default: 1. Min: -inf. Max: inf.
    - damage quantile: Damage quantile (Only used for COACCH). Type: enum. Default: 0.5. Allowed values: [0.025, 0.05, 0.16, 0.25, 0.33, 0.5, 0.67, 0.75, 0.84, 0.95, 0.975].


    """
    constraints = []

    m.damage_costs = Var(m.t, m.regions, units=quant.unit("fraction_of_GDP"))
    m.damage_scale_factor = Param(doc="::economics.damages.scale factor")

    # Total damages are sum of non-SLR and SLR damages
    constraints.append(
        RegionalConstraint(
            lambda m, t, r: m.damage_costs[t, r]
            == m.damage_costs_non_slr[t, r] + m.damage_costs_slr[t, r],
            "damage_costs",
        ),
    )

    # Get constraints for temperature dependent damages
    constraints.extend(_get_constraints_temperature_dependent(m))

    # Get constraints for sea-level rise damages
    constraints.extend(_get_constraints_slr(m))

    return constraints

Damage functions and coefficients

Visualisation of damage functions and damage coefficients

Download COACCH damage function coefficients

Impact sectors used in the damage functions

Climate change impact area Model source Variable used in CGE
Agriculture EPIC biophysical model and GLOBIOM model (Change in) Crop yield
Forestry G4M model (Change in) Net physical wood production per hectare
Fishery DBEM envelope model and DSFM food web model (Change in) Fish catches
Sea-level rise DIVA model - Annual land loss due to submergence
- Expected annual damages to assets
- Expected annual number of people flooded
- Annual protection costs
Riverine floods GLOFRIS model - Expected annual damages for the industrial, commercial, and residential sectors
- Expected annual number of people flooded
Road transportation OSDaMage model Expected annual damages for the road infrastructure
Energy supply Schleypen et al. (2019) Changes in wind and hydropower production
Energy demand Schleypen et al. (2019) Changes in energy demand by households and by the industrial, agricultural and service sectors for coal, oil, gas, and electricity
Labour productivity Dasgupta et al. (2022) Changes in per capita production of value added