{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# calculating theoretical feedback ratios for plotting figure 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "import numpy as np\n",
    "\n",
    "ppm2GtCO2 = 2.124/0.272912\n",
    "ppm2PgC =  2.124/0.272912 * 12.01 / 44.0095\n",
    "\n",
    "ls_model_name = ['ACCESS-ESM1.5','BCC-CSM2-MR','CanESM5','CESM2','CNRM-ESM2-1','IPSL-CM6A-LR','MIROC-ES2L','MPI-ESM1.2-LR','NOAA-GFDL-ESM4','NorESM2-LM','UKESM1-0-LL']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ACCESS-ESM1.5\n",
      "beta land/ocean 0.37 0.9 (PgC/ppm)\n",
      "gamma land/ocean -21.1 -23.75 (PgC/degC)\n",
      "lambda AR: -26.6\n",
      "lambda OAE: -10.7\n",
      "---\n",
      "CESM2\n",
      "beta land/ocean 0.9 0.71 (PgC/ppm)\n",
      "gamma land/ocean -21.6 -10.85 (PgC/degC)\n",
      "lambda AR: -23.2\n",
      "lambda OAE: -26.4\n",
      "---\n",
      "CanESM5\n",
      "beta land/ocean 1.28 0.77 (PgC/ppm)\n",
      "gamma land/ocean 15.95 -14.72 (PgC/degC)\n",
      "lambda AR: -23.7\n",
      "lambda OAE: -39.7\n",
      "---\n",
      "MIROC-ES2L\n",
      "beta land/ocean 1.12 0.73 (PgC/ppm)\n",
      "gamma land/ocean -69.57 -22.25 (PgC/degC)\n",
      "lambda AR: -23.0\n",
      "lambda OAE: -27.8\n",
      "---\n",
      "MPI-ESM1.2-LR\n",
      "beta land/ocean 0.71 0.77 (PgC/ppm)\n",
      "gamma land/ocean -5.17 -20.11 (PgC/degC)\n",
      "lambda AR: -23.9\n",
      "lambda OAE: -24.3\n",
      "---\n",
      "NorESM2-LM\n",
      "beta land/ocean 0.85 0.78 (PgC/ppm)\n",
      "gamma land/ocean -20.95 -19.64 (PgC/degC)\n",
      "lambda AR: -24.8\n",
      "lambda OAE: -26.5\n",
      "---\n",
      "UKESM1-0-LL\n",
      "beta land/ocean 0.75 0.75 (PgC/ppm)\n",
      "gamma land/ocean -38.4 -14.07 (PgC/degC)\n",
      "lambda AR: -23.4\n",
      "lambda OAE: -18.2\n",
      "---\n",
      "+++ lambda A/R: -24.1%, stddev: 1.2%\n",
      "+++ lambda OAE: -24.8%, stddev: 8.3%\n",
      "---\n"
     ]
    }
   ],
   "source": [
    "def get_lambda_list(ls_gamma_land,ls_beta_land,ls_gamma_ocean,ls_beta_ocean,ls_alpha):\n",
    "    ls_lambda_OAE = []\n",
    "    ls_lambda_AR = []\n",
    "    for imodel in [0,3,2,6,7,9,10]:\n",
    "        alpha = ls_alpha[imodel]\n",
    "        beta_land = ls_beta_land[imodel] * 1\n",
    "        beta_ocean = ls_beta_ocean[imodel] * 1\n",
    "        gamma_land = ls_gamma_land[imodel] * 1\n",
    "        gamma_ocean = ls_gamma_ocean[imodel] * 1\n",
    "        model_name = ls_model_name[imodel]\n",
    "        print(model_name)\n",
    "        print('beta land/ocean',beta_land,beta_ocean,'(PgC/ppm)')\n",
    "        print('gamma land/ocean',gamma_land,gamma_ocean,'(PgC/degC)')\n",
    "\n",
    "        foo = (-beta_ocean-alpha*gamma_ocean)/(ppm2PgC)/(1+beta_ocean/ppm2PgC+alpha*gamma_ocean/ppm2PgC)\n",
    "        ls_lambda_AR.append(foo)\n",
    "        print(f'lambda AR: {foo*100:.1f}')\n",
    "\n",
    "        foo = (-beta_land-alpha*gamma_land)/(ppm2PgC)/(1+beta_land/ppm2PgC+alpha*gamma_land/ppm2PgC)\n",
    "        ls_lambda_OAE.append(foo)\n",
    "        print(f'lambda OAE: {foo*100:.1f}')\n",
    "    #     print(f'alpha: {alpha*1000:.2f}')\n",
    "        print('---')\n",
    "\n",
    "    ls_lambda_OAE = np.array(ls_lambda_OAE)\n",
    "    ls_lambda_AR = np.array(ls_lambda_AR)\n",
    "    print(f'+++ lambda A/R: {np.average(ls_lambda_AR):.1%}, stddev: {np.std(ls_lambda_AR):.1%}')\n",
    "    print(f'+++ lambda OAE: {np.average(ls_lambda_OAE):.1%}, stddev: {np.std(ls_lambda_OAE):.1%}')\n",
    "    print('---')\n",
    "    return ls_lambda_AR,ls_lambda_OAE\n",
    "    \n",
    "# 4xco2\n",
    "ls_gamma_land = [-21.1,-163.1,15.95,-21.6,-83.11,-8.67,-69.57,-5.17,-80.06,-20.95,-38.4]\n",
    "ls_beta_land = [0.37,1.81,1.28,0.9,1.36,0.62,1.12,0.71,0.93,0.85,0.75]\n",
    "ls_gamma_ocean = [-23.75,-19.94,-14.72,-10.85,-9.38,-12.97,-22.25,-20.11,-21.65,-19.64,-14.07]\n",
    "ls_beta_ocean = [0.9,0.92,0.77,0.71,0.7,0.76,0.73,0.77,0.84,0.78,0.75]\n",
    "ls_alpha = np.array([546,485,751,637,632,687,436,512,430,410,721]) * 0.00001\n",
    "\n",
    "ls_lambda_AR,ls_lambda_OAE = get_lambda_list(ls_gamma_land,ls_beta_land,ls_gamma_ocean,ls_beta_ocean,ls_alpha)\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "A/R\n",
      "[-26.616185834154027,-23.18052744372935,-23.69298287390421,0,-22.960520775578384,-23.90033909512007,-24.774695226066793,-23.393045143429678]\n",
      "OAE\n",
      "[-10.711631662793994,-26.41489574976597,-39.7253330168976,0,-27.77288378785428,-24.347405962452434,-26.458134978422375,-18.218499852339725]\n"
     ]
    }
   ],
   "source": [
    "print('A/R')\n",
    "strfoo = '['\n",
    "for imodel in range(len(ls_lambda_AR)):\n",
    "    strfoo = strfoo + str(ls_lambda_AR[imodel]*100) + ','\n",
    "    if ls_model_name[imodel]=='CanESM5':\n",
    "        strfoo = strfoo + '0,'\n",
    "strfoo = strfoo[:-1] + ']'\n",
    "print(strfoo)\n",
    "###\n",
    "print('OAE')\n",
    "strfoo = '['\n",
    "for imodel in range(len(ls_lambda_OAE)):\n",
    "    strfoo = strfoo + str(ls_lambda_OAE[imodel]*100) + ','\n",
    "    if ls_model_name[imodel]=='CanESM5':\n",
    "        strfoo = strfoo + '0,'\n",
    "strfoo = strfoo[:-1] + ']'\n",
    "print(strfoo)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ACCESS-ESM1.5\n",
      "beta land/ocean 0.75 1.06 (PgC/ppm)\n",
      "gamma land/ocean -12 -11.72 (PgC/degC)\n",
      "lambda AR: -31.4\n",
      "lambda OAE: -23.7\n",
      "---\n",
      "CESM2\n",
      "beta land/ocean 0.98 0.84 (PgC/ppm)\n",
      "gamma land/ocean -12.76 -4.24 (PgC/degC)\n",
      "lambda AR: -27.5\n",
      "lambda OAE: -29.3\n",
      "---\n",
      "CanESM5\n",
      "beta land/ocean 1.42 0.9 (PgC/ppm)\n",
      "gamma land/ocean -6.22 -7.71 (PgC/degC)\n",
      "lambda AR: -28.0\n",
      "lambda OAE: -39.1\n",
      "---\n",
      "MIROC-ES2L\n",
      "beta land/ocean 1.45 0.85 (PgC/ppm)\n",
      "gamma land/ocean -63.36 -10.44 (PgC/degC)\n",
      "lambda AR: -27.2\n",
      "lambda OAE: -34.4\n",
      "---\n",
      "MPI-ESM1.2-LR\n",
      "beta land/ocean 1.08 0.88 (PgC/ppm)\n",
      "gamma land/ocean -0.81 -11.4 (PgC/degC)\n",
      "lambda AR: -27.5\n",
      "lambda OAE: -33.6\n",
      "---\n",
      "NorESM2-LM\n",
      "beta land/ocean 0.94 0.88 (PgC/ppm)\n",
      "gamma land/ocean -15.61 -9.34 (PgC/degC)\n",
      "lambda AR: -28.2\n",
      "lambda OAE: -28.8\n",
      "---\n",
      "UKESM1-0-LL\n",
      "beta land/ocean 1 0.88 (PgC/ppm)\n",
      "gamma land/ocean -24.01 -7.35 (PgC/degC)\n",
      "lambda AR: -27.7\n",
      "lambda OAE: -27.0\n",
      "---\n",
      "+++ lambda A/R: -28.2%, stddev: 1.3%\n",
      "+++ lambda OAE: -30.8%, stddev: 4.8%\n",
      "---\n"
     ]
    }
   ],
   "source": [
    "# 2xco2\n",
    "ls_gamma_land = [-12, -132.84, -6.22, -12.76, -44.51, -12.24, -63.36, -0.81, -50.69, -15.61, -24.01]\n",
    "ls_beta_land = [0.75, 2.22, 1.42, 0.98, 1.37, 1.11, 1.45, 1.08, 1.08, 0.94, 1]\n",
    "ls_gamma_ocean = [-11.72, -12.38, -7.71, -4.24, -3.58, -7.37, -10.44, -11.4, -8.97, -9.34, -7.35]\n",
    "ls_beta_ocean = [1.06, 1.09, 0.9, 0.84, 0.81, 0.87, 0.85, 0.88, 0.97, 0.88, 0.88]\n",
    "ls_alpha = np.array([750, 592, 950, 789, 650, 876, 530, 636, 543, 509, 885]) * 0.00001\n",
    "\n",
    "ls_lambda_AR,ls_lambda_OAE = get_lambda_list(ls_gamma_land,ls_beta_land,ls_gamma_ocean,ls_beta_ocean,ls_alpha)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "A/R\n",
      "[-31.398857138214954,-27.523245379577126,-28.019632577033065,0,-27.228266479860828,-27.54672380778056,-28.158522530527147,-27.73055504767143]\n",
      "OAE\n",
      "[-23.70798183629439,-29.27959261492038,-39.05293882765925,0,-34.4091966240245,-33.602443435192164,-28.83460691820848,-27.049385610535193]\n"
     ]
    }
   ],
   "source": [
    "print('A/R')\n",
    "strfoo = '['\n",
    "for imodel in range(len(ls_lambda_AR)):\n",
    "    strfoo = strfoo + str(ls_lambda_AR[imodel]*100) + ','\n",
    "    if ls_model_name[imodel]=='CanESM5':\n",
    "        strfoo = strfoo + '0,'\n",
    "strfoo = strfoo[:-1] + ']'\n",
    "print(strfoo)\n",
    "###\n",
    "print('OAE')\n",
    "strfoo = '['\n",
    "for imodel in range(len(ls_lambda_OAE)):\n",
    "    strfoo = strfoo + str(ls_lambda_OAE[imodel]*100) + ','\n",
    "    if ls_model_name[imodel]=='CanESM5':\n",
    "        strfoo = strfoo + '0,'\n",
    "strfoo = strfoo[:-1] + ']'\n",
    "print(strfoo)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.7.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
