{ "cells": [ { "cell_type": "markdown", "id": "c658d359", "metadata": {}, "source": [ "# Session 3 — DICE — Notebook 1 (Basics)\n", "\n", "This notebook is a **minimal teaching scaffold** to help you (and students) simulate the DICE-style model step by step and produce a few baseline plots. \n", "Scope (kept intentionally small):\n", "- Load the provided `DICE.py` (parameters, state-update, light planner scaffolding).\n", "- Build the time grid and initial state matrix.\n", "- Pick **one simple control path** (abatement `μ_t`) and simulate.\n", "- Plot **one endogenous path** (e.g., temperature `T_AT`) and **one exogenous path** (e.g., non-CO₂ forcing `F_EX`).\n", "\n", "> Advanced/optimization content is **not** the focus here; see Notebook 2 for the control problem.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Session 3 — Objectives and prerequisites\n", "\n", "**Learning objectives**\n", "- Identify the economic and climate blocks of the original `DICE.py` model.\n", "- Run a controlled BAU-versus-transition comparison.\n", "- Build and compare SSP parameterizations, then construct one mitigation ramp.\n", "\n", "**Prerequisites.** Slides for Session 3; Sessions 1–2; comfort with NumPy matrices and model indices stored in `Params`.\n" ], "id": "session3-cell-1" }, { "cell_type": "markdown", "metadata": { "x3a_technical_cell": true }, "source": [ "## Technical setup\n", "\n", "Run the notebook from this session directory. The original course module and data files are stored next to it.\n", "\n", "**Convention.** At the initial date, control variables are `NaN`: the initial state is given, but the control is chosen only for subsequent transitions.\n" ], "id": "x3a-setup-3-markdown" }, { "cell_type": "code", "execution_count": null, "metadata": { "x3a_technical_cell": true }, "outputs": [], "source": [ "# Install dependencies in the current notebook kernel before running imports.\n", "%pip install -r requirements.txt\n" ], "id": "x3a-setup-3-code" }, { "cell_type": "markdown", "id": "32b38891", "metadata": {}, "source": [ "## 0) Setup\n" ] }, { "cell_type": "code", "execution_count": null, "id": "730f9072", "metadata": {}, "outputs": [], "source": [ "# Standard imports\n", "import sys, math\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n" ] }, { "cell_type": "markdown", "id": "c497d70c", "metadata": {}, "source": [ "## 1) Import the DICE module & inspect parameters\n" ] }, { "cell_type": "code", "execution_count": null, "id": "bc2a80df", "metadata": {}, "outputs": [], "source": [ "from DICE import *\n", "\n", "# Create a default parameter object\n", "p = Params()\n", "print(p)\n", "print(\"\\nNumber of periods nT =\", p.nT, \"with step Δ =\", p.Delta, \"years\")\n", "print(\"Time runs from\", p.t0, \"to\", p.tT)\n" ] }, { "cell_type": "markdown", "id": "d672fd91", "metadata": {}, "source": [ "## 2) Build initial state matrix\n", "### Time Structure and Variables in the DICE Model\n", "\n", "Before setting up the numerical solution, let us clarify the time indexing and the role of variables:\n", "\n", "- We work in **discrete time** with finite horizon $T$.\n", "- Periods are indexed by $i=0,1,2,\\dots,I$ with time step $\\Delta$ years.\n", "- Calendar time is $t(i) = t_0 + i\\Delta$.\n", "\n", "Thus, the time grid is:\n", "$$\n", "t = \\{t_0, t_0 + \\Delta, t_0 + 2\\Delta, \\dots, T\\}.\n", "$$\n", "\n", "- Variables can be written as $Y_t$ (calendar time) or $Y(i)$ (discrete index).\n", "\n", "### Setting exogenous states\n", "Exogenous state variables are given by $x_t \\in \\mathbb{R}^{N_x}$: productivity $A_t$, carbon intensity $\\sigma_t$, radiative forcing $F_t^{EX}$, land-use emissions $E_t^{land}$, population $L_t$, etc.\n", "\n", "They follow an exogenous process:\n", " $$\n", " x_t = g(x_{t-1}), \\quad g: \\mathbb{R}^{N_x} \\to \\mathbb{R}^{N_x}.\n", " $$\n", "\n", "They are next stored in to $y$ matrix, other variabels are yet left NaN.\n" ] }, { "cell_type": "code", "execution_count": null, "id": "d8fd8ab7", "metadata": {}, "outputs": [], "source": [ "# Initialize the simulation matrix with exogenous drivers and initial states\n", "sim = init_states(p)\n", "\n", "# Convert to a tidy DataFrame for inspection (optional)\n", "df0 = mat_to_df(sim, p)\n", "df0.head()" ] }, { "cell_type": "markdown", "id": "576256cb", "metadata": {}, "source": [ "## 3) Choose a simple control path, then simulate\n", "\n", "The vector of **Endogenous states/flows** $y_t \\in \\mathbb{R}^{N_y}$: carbon stocks $(M_t^{AT}, M_t^{UP}, M_t^{LO})$, temperatures $(T_t^{AT}, T_t^{OC})$, output $Y_t$, capital $K_t$, etc. They evolve according to\n", " $$\n", " y_t = f(y_{t-1}, x_{t-1}, z_t), \\quad f: \\mathbb{R}^{N_y}\\times \\mathbb{R}^{N_x}\\times \\mathbb{R}^2 \\to \\mathbb{R}^{N_y}.\n", " $$\n", "\n", "By setting **decision variables (controls)** $z_t = [\\mu_t, s_t]' \\in \\mathbb{R}^2$: abatement rate and saving rate, we are able to numerically solve the path of the economy.\n", "\n", "### Numerical Resolution (Open Loop)\n", "Under Assumptions (1) and (2), decisions are exogenous and the model can be solved recursively:\n", "1. Update exogenous states: $x_t = g(x_{t-1})$.\n", "2. Compute endogenous states: $y_t = f(y_{t-1}, x_{t-1}, z_t)$.\n", "\n", "This provides the full trajectory $(x_t, y_t, z_t)$ for $t = t_0, \\dots, T$.\n", "\n", "### In this example\n", "For this **basics** notebook we avoid optimization. We simply **feed exogenous controls**, then call the **state updater**:\n", "- Fix saving rate `s_t` to a constant (e.g., 20%).\n", "- Set a **ramp** for the abatement rate `μ_t` to 3% (purely illustrative).\n" ] }, { "cell_type": "code", "execution_count": null, "id": "1c5d48bf", "metadata": {}, "outputs": [], "source": [ "# Time indices to update (DICE arrays start at t=1 for transitions)\n", "timevec = range(1, p.nT)\n", "\n", "# 3.a) Controls: saving and abatement (illustrative — not optimal)\n", "sim[1:, p.i_s] = 0.20 # constant saving rate at 20%\n", "# Start abatement at 3%\n", "sim[1:, p.i_mu] =0.03\n", "\n", "# 3.b) Propagate the system forward using the update function\n", "sim = update_path(sim, timevec, p)\n", "\n", "# Show a couple lines to confirm variables updated (e.g., Y, C, T_AT, F_EX)\n", "cols_to_show = ['time','s','mu','Y','C','T_AT','F_EX','E_land']\n", "pd.DataFrame(sim, columns=p.col)[cols_to_show].head(8)\n" ] }, { "cell_type": "markdown", "id": "7021c5b8", "metadata": {}, "source": [ "## 4) Plot: one endogenous path and one exogenous driver\n" ] }, { "cell_type": "code", "execution_count": null, "id": "3055f5fa", "metadata": {}, "outputs": [], "source": [ "years = sim[:, p.i_time]\n", "\n", "# Endogenous example: atmospheric temperature T_AT\n", "plt.figure()\n", "plt.plot(years, sim[:, p.i_T_AT], linewidth=2)\n", "plt.xlabel(\"Year\"); plt.ylabel(\"Atmospheric temperature (°C)\")\n", "plt.title(\"Endogenous path: $T_{AT}$\")\n", "plt.grid(True)\n", "plt.show()\n", "\n", "# Exogenous example: non-CO₂ forcing F_EX\n", "plt.figure()\n", "plt.plot(years, sim[:, p.i_F_EX], linewidth=2)\n", "plt.xlabel(\"Year\"); plt.ylabel(\"Non-CO$_2$ forcing (W/m$^2$)\")\n", "plt.title(\"Exogenous driver: $F_{EX}$\")\n", "plt.grid(True)\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "6e0dea12", "metadata": {}, "source": [ "## 5) Optional: quick look at Output and Consumption\n" ] }, { "cell_type": "code", "execution_count": null, "id": "903b1a3e", "metadata": {}, "outputs": [], "source": [ "plt.figure()\n", "plt.plot(years, sim[:, p.i_Q], linewidth=2, label=\"Output Q\")\n", "plt.plot(years, sim[:, p.i_C], linewidth=2, label=\"Consumption C\")\n", "plt.xlabel(\"Year\"); plt.ylabel(\"Level (model units)\")\n", "plt.title(\"Output and Consumption (illustrative controls)\")\n", "plt.grid(True); plt.legend()\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "255ff986-d60b-42ae-8527-4f6e607f28c6", "metadata": {}, "source": [ "## 6) Question: Compare a laissez-faire scenario (no abatement $\\mu=0$) against a green transition scenario (abatement starting at 0 in 2020 and reaching 100\\% linearly in 2050). Report in a graph.\n" ] }, { "cell_type": "code", "execution_count": null, "id": "a2843925-d0d9-4435-a39d-0473c47b151b", "metadata": {}, "outputs": [], "source": [ "# Your code here. Here is an help:\n", "sim_BAU = sim.copy()\n", "sim_BAU[1:, p.i_s] = 0.20 # constant saving rate at 20%\n", "sim_BAU[1:, p.i_mu] = 0" ] }, { "cell_type": "code", "execution_count": null, "id": "a8383cac-6edf-43a9-bf88-d3d5376f045e", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "x3a_technical_cell": true }, "source": [ "---\n", "\n", "*Original notebook continuation: `DICE_Notebook1-2_generation_scenarios.ipynb`.*\n" ], "id": "x3a-merge-1" }, { "cell_type": "markdown", "id": "a67f7ef2", "metadata": {}, "source": [ "# DICE — Notebook 2 (Exercises): Scenarios & Forcing\n" ] }, { "cell_type": "markdown", "id": "e54d67b7", "metadata": {}, "source": [ "**Learning objectives (1h30min)**\n", "0. Load a minimal DICE code and identify its **blocks**: parameters, initial states, economic equations, climate equations. \n", "1. SSP Scenarios: generate meaningful SSP scenarios by adjusting the calibration of exogenous variables.\n", "2. Introduce some forcing objectives, by adjusting\n", "\n", "> This notebook uses the provided `DICE.py` module (teaching version).\n" ] }, { "cell_type": "markdown", "id": "c90571a5-d813-4254-8f4b-a1c3b79cf4e2", "metadata": {}, "source": [ "# 0) Load DICE and run baseline\n" ] }, { "cell_type": "code", "execution_count": null, "id": "008c6e85", "metadata": {}, "outputs": [], "source": [ "\n", "# 1) Load DICE and baseline run\n", "import numpy as np, pandas as pd, matplotlib.pyplot as plt\n", "import DICE \n", "\n", "p = Params()\n", "path = init_states(p)\n", "path[1:, p.i_mu] = 0.03 # baseline abatement path\n", "path = update_path(path, range(1, p.nT), p)\n", "df_base = mat_to_df(path, p)\n", "df_base.head()\n" ] }, { "cell_type": "markdown", "id": "c6944132-3ed8-4b44-a927-33301588d09b", "metadata": {}, "source": [ "## 1) SSP Scenarios\n", "\n", "In what follows, we want to simulate two extreme narratives, the **SSP1** and **SSP5** storylines, as well as the **baseline (SSP2)**. \n", "\n", "- **SSP1** – *Sustainability: Taking the Green Road (Low challenges to mitigation and adaptation)* \n", " *The world shifts gradually toward a more sustainable path, emphasizing inclusive development and respect for environmental boundaries. Educational and health investments accelerate the demographic transition, inequality is reduced, and consumption patterns shift toward low material growth and lower resource and energy intensity.*\n", "\n", "- **SSP5** – *Fossil-fueled Development: Taking the Highway (High challenges to mitigation, low challenges to adaptation)* \n", " *This world emphasizes competitive markets, innovation, and human capital development. Rapid economic growth is fueled by fossil resources and energy-intensive lifestyles. Local environmental problems are managed, but global commons are stressed, with high emissions and reliance on future technological fixes or geo-engineering.*\n", "\n", "We thus consider three scenarios: the **optimistic** (SSP1), the **baseline** (SSP2, current calibration), and the **pessimistic** (SSP5). \n", "The table below summarizes the proposed core calibration changes:\n", "\n", "| Parameter (description) | Symbol | SSP1 (Optimistic) | SSP2 (Baseline — DICE) | SSP5 (Pessimistic) |\n", "|----------------------------------------|----------|--------------------------------------------|-------------------------|-------------------------------------------|\n", "| Emissions intensity (initial) | $\\sigma_0$ | 25% lower than baseline | calibrated value | 15% higher than baseline |\n", "| Decline rate of emissions intensity | $g_{\\sigma}$ | 25% faster decline | calibrated value | 50% slower decline |\n", "| Long-run population (asymptote) | $L_{\\infty}$ | 9 billion | calibrated value | 16 billion |\n", "| Population growth parameter | $l_g$ | 20% lower | calibrated value | 30% higher |\n", "| Total factor productivity (TFP) level | $A_0$ | 5% higher than baseline | calibrated value | 3% lower than baseline |\n", "| TFP growth rate | $g_A$ | 15% faster than baseline | calibrated value | 20% slower than baseline |\n", "\n", "> **Instructions**: For each scenario, initialize parameters accordingly, run the model, and compare trajectories for output, emissions, forcing, and temperatures.\n" ] }, { "cell_type": "markdown", "id": "d5f73c83-63ec-45c5-adbb-29b0d8079889", "metadata": {}, "source": [ "#### 1-A) Build the calibration and check it works in new p vector.\n", "Use the table to fill each scenarios and have the right narrative.\n" ] }, { "cell_type": "code", "execution_count": null, "id": "f0d7e2f2-892a-4351-a19e-411ef627cab1", "metadata": {}, "outputs": [], "source": [ "# Your code for question 1-A should be here\n", "\n", "def make_params_variant(**kwargs):\n", " q = Params()\n", " for k, v in kwargs.items():\n", " setattr(q, k, v)\n", " return q\n", "\n", "p_base = Params()\n", "\n", "# Worked example: SSP1 (optimistic)\n", "p_opt = make_params_variant(\n", " sigma0=p_base.sigma0 * 0.75, # 25% lower initial emissions intensity\n", " gsig=p_base.gsig * 1.25, # 25% faster decline\n", " Linf=9000, # long-run population: 9 billion\n", " lg=p_base.lg * 0.80, # 20% lower population growth parameter\n", " A0=p_base.A0 * 1.05, # 5% higher initial TFP\n", " gA=p_base.gA * 1.15, # 15% faster TFP growth\n", ")\n", "\n", "# Student task: implement SSP5 (pessimistic) using the calibration table above.\n", "# p_pes = make_params_variant(sigma0=..., gsig=..., Linf=..., lg=..., A0=..., gA=...)\n" ] }, { "cell_type": "markdown", "id": "cfd7bc54-6602-436a-b7f8-9f62daa65256", "metadata": {}, "source": [ "#### 1-B) Provide some graph comparing Emissions, GDP, damages (define them manually) and temperatures.\n" ] }, { "cell_type": "code", "execution_count": null, "id": "c74ce6f0-4f7b-4cd3-ba57-15d1164e5b5e", "metadata": {}, "outputs": [], "source": [ "# Your code for question 1-B should be here\n", "\n", "### 1-B) Report the graph and compare them\n", "sim_bas = init_states(p_base)\n", "#sim_opt = init_states(p_opt)\n", "#sim_pes = init_states(p_pes)\n", "\n", "\n", "sim_bas[1:, p_base.i_s] = 0.20 # constant saving rate at 20%\n", "sim_bas[1:, p_base.i_mu] = 0.03\n", "timevec = range(1, p.nT)\n", "sim_bas = update_path(sim_bas, timevec, p_base)\n" ] }, { "cell_type": "markdown", "id": "8a149234-6e0a-40ba-9289-910c3f824fbb", "metadata": {}, "source": [ "#### 1-C) According to all the figures, do you think that SSPs narrative are the main drivers of climate change? What is the temperatures in best versus worst case of climate change?\n" ] }, { "cell_type": "markdown", "id": "00d1d2a3-4ce0-4e67-992b-db514a0f5fca", "metadata": {}, "source": [ "Write your answer here.\n" ] }, { "cell_type": "markdown", "id": "a629e5da-d47f-4ce9-a69a-041beb8a06c0", "metadata": {}, "source": [ "## 2) Mitigation schedules: ramp abatement to reach (near) net-zero by 2100 / 2080 / 2060\n", "\n", "Up to now, our scenarios were purely **exogenous**: we varied productivity, population, and emissions intensity to mimic different SSP narratives. \n", "We now enrich the analysis by introducing a **second decision variable**: the **abatement rate** $\\mu_t$, which measures the fraction of industrial emissions avoided through mitigation policies and technologies. \n", "\n", "- In the **baseline** exercises, $\\mu_t$ was fixed at a constant, low level (e.g. 3%). \n", "- In this exercise, we explicitly feed an **abatement trajectory** $\\{\\mu_t\\}$ into the model. \n", "- Conceptually, pushing $\\mu_t \\to 1$ means that almost all industrial CO₂ emissions are eliminated. Note, however, that **land-use emissions** $E_{\\text{land},t}$ remain exogenous and may stay positive for some time.\n", "\n", "This mirrors the way scenarios are constructed in **CMIP6 (Coupled Model Intercomparison Project Phase 6)**, where each SSP storyline can be combined with different **climate policy assumptions**: \n", "- A **high-ambition mitigation pathway** ramps abatement quickly, reaching **net-zero emissions** by mid-century (e.g. 2060). \n", "- A **delayed mitigation pathway** reaches net-zero much later (e.g. 2100). \n", "- The resulting **forcing levels by 2100** (e.g. 2.6, 4.5, 8.5 W/m²) define the well-known **SSP1-2.6**, **SSP2-4.5**, and **SSP5-8.5** scenarios. \n", "\n", "3. Interpret the results in light of the IPCC’s SSP scenario framework: *early and ambitious decarbonization (SSP1-2.6) vs. delayed action with high warming (SSP5-8.5).*\n" ] }, { "cell_type": "markdown", "id": "68ab2f00-c352-461e-ab8e-443fe3a3083c", "metadata": {}, "source": [ "#### 2-a) Construct linear ramps for $\\mu_t$ that reach **net zero** by 2100, 2080, and 2060. \n", "Recall that in this model, we only have two decision variables in here. Saving remains unchanged $\\{s_t\\}_{t=t_{0}}^{T}=0.2$ while mitigation path must be adjusted: $\\{\\mu_t\\}_{t=t_{0}}^{T}$. It should gradually increase to 1 to reach net zero at some specific date.\n", "Recall that here, our simulations, including decision variables, are all stacked into matrix $w = [y,x,z]$. In what follows, we modify directly $w$.\n" ] }, { "cell_type": "code", "execution_count": null, "id": "f62ee6ce-d553-43a9-a1ed-21daf0098e21", "metadata": {}, "outputs": [], "source": [ "# Worked example: a linear abatement ramp reaching 100% in 2100\n", "years = sim_bas[:, p_base.i_time]\n", "mu_initial = 0.03\n", "target_year = 2100\n", "\n", "ramp2100 = np.clip(\n", " mu_initial + (1 - mu_initial) * (years - years[0]) / (target_year - years[0]),\n", " mu_initial,\n", " 1.0,\n", ")\n", "\n", "plt.figure(figsize=(7, 4))\n", "plt.plot(years, ramp2100, linewidth=2, label=\"Net zero in 2100\")\n", "plt.xlabel(\"Year\")\n", "plt.ylabel(r\"Abatement rate $\\mu_t$\")\n", "plt.ylim(0, 1.05)\n", "plt.grid(True)\n", "plt.legend()\n", "plt.show()\n", "\n", "# Student task: construct analogous ramps reaching 100% in 2080 and 2060.\n", "# ramp2080 = ...\n", "# ramp2060 = ...\n" ] }, { "cell_type": "markdown", "id": "cbe93dd6-5757-4d6b-8f63-a288089bf978", "metadata": {}, "source": [ "#### 2-b) Simulate the model under each ramp and compare the paths for **forcing $F_t$**, **temperatures $T_{AT,t}$**, and **emissions $E_t$**.\n", "Recall that once the matrix of decision $z$ of size $I\\times 2$ has been modified (as part of matri $w$), we can once again solve the new system with alternative climate policy:\n", " $$\n", " y_t = f_p (y_{t-1}, x_{t-1}, z_t), \\quad f: \\mathbb{R}^{N_y}\\times \\mathbb{R}^{N_x}\\times \\mathbb{R}^2 \\to \\mathbb{R}^{N_y}.\n", " $$\n", "\n", " How effective is climate policy in curbing emissions?\n" ] }, { "cell_type": "code", "execution_count": null, "id": "7b5a199e-d8e2-4f5c-b5d9-d38253504e84", "metadata": {}, "outputs": [], "source": [ "# Worked example: simulate the model with the 2100 ramp defined above\n", "sim2100 = sim_bas.copy()\n", "sim2100[1:, p_base.i_s] = 0.20\n", "sim2100[1:, p_base.i_mu] = ramp2100[1:]\n", "sim2100 = update_path(sim2100, range(1, p_base.nT), p_base)\n", "\n", "# Check the resulting forcing, temperature, and emissions paths\n", "fig, axes = plt.subplots(1, 3, figsize=(15, 4))\n", "\n", "axes[0].plot(years, sim2100[:, p_base.i_F], linewidth=2, label=\"Net zero in 2100\")\n", "axes[0].set_xlabel(\"Year\")\n", "axes[0].set_ylabel(r\"W/m$^2$\")\n", "axes[0].set_title(\"Forcing\")\n", "axes[0].grid(True)\n", "axes[0].legend()\n", "\n", "axes[1].plot(years, sim2100[:, p_base.i_T_AT], linewidth=2, label=\"Net zero in 2100\")\n", "axes[1].set_xlabel(\"Year\")\n", "axes[1].set_ylabel(r\"$^{\\circ}$C\")\n", "axes[1].set_title(\"Atmospheric temperature\")\n", "axes[1].grid(True)\n", "axes[1].legend()\n", "\n", "axes[2].plot(years, sim2100[:, p_base.i_E], linewidth=2, label=\"Net zero in 2100\")\n", "axes[2].set_xlabel(\"Year\")\n", "axes[2].set_ylabel(r\"GtCO$_2$\")\n", "axes[2].set_title(\"Emissions\")\n", "axes[2].grid(True)\n", "axes[2].legend()\n", "\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "# Student task: repeat the same procedure with ramp2080 and ramp2060,\n", "# then add the corresponding trajectories to the comparison graphs.\n", "# sim2080 = ...\n", "# sim2060 = ...\n" ] }, { "cell_type": "markdown", "id": "c59239c6-7345-450f-9f93-cdd32c1b7e4a", "metadata": {}, "source": [ "Write your answer here.\n" ] }, { "cell_type": "markdown", "id": "99a12e3f-0b95-42a5-8045-bc66627e5a26", "metadata": {}, "source": [ "### 2-c) What is the economic cost of climate mitigation? \n", "Provide a 2 plots, one showing the consumption gap defined as $100\\times (c_t^{alt}/c_t^{base}-1)$ and in a second figure the temperature gap $(T_t^{alt}-T_t^{base})$. $T_t^{alt}$ denotes the temperature path in alternative regimes (e.g. optimistic or pessimistic) while *base* is baseline. \n", "Comment the result your find about the sacrifice that must be done by society in terms of consumption loss during the transition. What drives this sacrifice?\n" ] }, { "cell_type": "code", "execution_count": null, "id": "4d1c261f-cc6e-4d38-b386-ab19443a42dc", "metadata": {}, "outputs": [], "source": [ "# Your code here." ] }, { "cell_type": "markdown", "id": "5a90527c-4286-4691-ad7a-3e95ee86f294", "metadata": {}, "source": [ "Write your answer here.\n" ] }, { "cell_type": "markdown", "id": "283f3ca2-f972-4708-9560-38cf9c134984", "metadata": {}, "source": [ "## 3) Providing core scenarios mixing SSPs $\\times$ Forcing as in IPCC\n", "\n", "The table below shows how **SSP storylines** combine with **radiative forcing targets** (W/m² by 2100). \n", "For example, *SSP1-2.6* corresponds to the **SSP1 narrative** combined with a **2.6 W/m² forcing pathway**.\n", "\n", "| | **1.9** | **2.6** | **4.5** | **7.0** | **8.5** |\n", "|------|---------|---------|---------|---------|---------|\n", "| **SSP1** | SSP1-1.9 | SSP1-2.6 | – | – | – |\n", "| **SSP2** | – | SSP2-2.6 | SSP2-4.5 | SSP2-7.0 | – |\n", "| **SSP3** | – | – | SSP3-4.5 | SSP3-7.0 | SSP3-8.5 |\n", "| **SSP4** | – | SSP4-2.6 | SSP4-4.5 | SSP4-7.0 | – |\n", "| **SSP5** | – | – | SSP5-4.5 | – | SSP5-8.5 |\n", "\n", "### Approximate Mapping: Forcing → Global Warming by 2100\n", "\n", "Radiative forcing pathways translate into different **global mean temperature increases** relative to preindustrial levels (1850–1900). \n", "Values below are **approximate central estimates** (IPCC AR6, median climate sensitivity assumptions):\n", "\n", "- **1.9 W/m² (SSP1-1.9)** → ~ **1.5 °C** stabilization (consistent with Paris Agreement “1.5 °C” target). \n", "- **2.6 W/m² (SSP1/2/4-2.6)** → ~ **2.0 °C** warming by 2100 (low-forcing pathway). \n", "- **4.5 W/m² (SSP2/3/4/5-4.5)** → ~ **2.5–3.0 °C** warming by 2100 (intermediate pathway). \n", "- **7.0 W/m² (SSP2/3/4-7.0)** → ~ **3.5–4.0 °C** warming by 2100 (high-forcing pathway). \n", "- **8.5 W/m² (SSP3/5-8.5)** → ~ **4.5 °C or more** warming by 2100 (very high emissions, “worst-case” reference).\n", "\n", "---\n", "\n", " **Interpretation**: \n", "- Lower forcing pathways (SSP1-1.9, SSP1/2-2.6) require **early, ambitious mitigation** and typically correspond to net-zero CO₂ by mid-century. \n", "- Higher forcing pathways (SSP3-7.0, SSP5-8.5) assume **limited mitigation**, continued fossil fuel use, and delayed or absent net-zero transitions. \n", "- Intermediate cases (SSP2-4.5) represent **current policy trajectories** or delayed mitigation efforts.\n" ] }, { "cell_type": "markdown", "id": "f411029c-ccfc-4a96-92c7-9343c42281f4", "metadata": {}, "source": [ "#### 3-A) Some core scenarii outside the diagonal are not evaluated (e.g. SSP1-8.5). Why?\n" ] }, { "cell_type": "markdown", "id": "6ea2cab4-8389-4ac6-8845-ac5476bf3cac", "metadata": {}, "source": [ "Write your answer here.\n" ] }, { "cell_type": "markdown", "id": "26c695a9-423d-4550-80f8-38daa9376b27", "metadata": {}, "source": [ "#### 3-B) Try to compute the SSP1-1.9, which corresponds to net zero by 2060 and optimistic scenario. Is SSP1-1.9 out of reach?\n" ] }, { "cell_type": "code", "execution_count": null, "id": "6f758419-967b-47b5-9c53-459def68d1aa", "metadata": {}, "outputs": [], "source": [ "# Your code here." ] }, { "cell_type": "markdown", "id": "9b63a437-ea14-470e-9dc1-884396e178d3", "metadata": {}, "source": [ "Write your answer here.\n" ] }, { "cell_type": "markdown", "id": "6d56ab9b-153d-4736-b04c-bdb3762caaa3", "metadata": {}, "source": [ "#### 3-C) Is it possible to obtain a 4°C of warming in SSP1? Evaluate SSP1 under no mitigation policy with $\\mu=0$ to mimic SSP1-8.5\n" ] }, { "cell_type": "code", "execution_count": null, "id": "f679ad62-17e0-4b6a-ab33-e5c7e071f0a4", "metadata": {}, "outputs": [], "source": [ "# Your code here" ] }, { "cell_type": "markdown", "id": "423732a6-f646-4ae4-b860-f4d2f35105c2", "metadata": {}, "source": [ "Write your answer here.\n" ] }, { "cell_type": "markdown", "id": "533afbc7-12ba-47b2-a96f-54efe13e550e", "metadata": {}, "source": [ "#### 3-D) Is it possible to obtain a 1.5°C in pessimistic environment? Evaluate SSP5 under mitigation policy with $\\mu=1$ by 2060 to mimic SSP5-1.9\n" ] }, { "cell_type": "code", "execution_count": null, "id": "d2720e60-84ce-4d9b-945d-9e405980dfe3", "metadata": {}, "outputs": [], "source": [ "# Your code here" ] }, { "cell_type": "markdown", "id": "4cabec61-e068-47d7-b208-be78a5be2d6d", "metadata": {}, "source": [ "Write your answer here.\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.7" }, "x3a_merged_sources": [ "Session1/DICE_Notebook1-1_basics.ipynb", "Session1/DICE_Notebook1-2_generation_scenarios.ipynb" ], "x3a_provenance": { "session": 3, "source_files": [ "Session1/DICE_Notebook1-1_basics.ipynb", "Session1/DICE_Notebook1-2_generation_scenarios.ipynb" ], "allowed_changes": [ "file rename", "session title", "local-path normalization", "optional installation cell", "stored-output normalization" ] } }, "nbformat": 4, "nbformat_minor": 5 }