Newer
Older
*** | (C) 2006-2019 Potsdam Institute for Climate Impact Research (PIK)
*** | authors, and contributors see CITATION.cff file. This file is part
*** | of REMIND and licensed under AGPL-3.0-or-later. Under Section 7 of
*** | AGPL-3.0, you are granted additional permissions described in the
*** | REMIND License Exception, version 1.0 (see LICENSE file).
*** | Contact: remind@pik-potsdam.de
*** SOF ./modules/15_climate/magicc/postsolve.gms
***---------------------------------------------------------------------------
*' HERE goes the code for the iterative adjustment of the emission budget for SSP runs
*' emission budgets are adjusted, such that a predefined forcing target in 2100 is met
*' the actual 2100 forcing after each iteration is calculated by a magicc run started from GAMS
***---------------------------------------------------------------------------
Lavinia Baumstark
committed
*' @code
*** Generate MAGICC scenario file
$include "./core/magicc.gms";
*** execute MAGICC (this is cheap enough, ~2s)
*** read in results
Execute "Rscript read_DAT_TOTAL_ANTHRO_RF.R";
Execute_Loadpoint 'p15_forc_magicc' p15_forc_magicc;
Execute "Rscript read_DAT_SURFACE_TEMP.R";
Execute_Loadpoint 'p15_magicc_temp' pm_globalMeanTemperature = pm_globalMeanTemperature;
*** MAGICC only reports unitl 2300:
***---------------------------------------------------------------------------
*' calibrate temperature (GMT anomaly) to match HADCRUT4 in 2000.
*' This ensures that different MAGICC configurations start at the same observed temperature.
***---------------------------------------------------------------------------
$ifthen.cm_magicc_calibrateTemperature2000 %cm_magicc_calibrateTemperature2000% == "HADCRUT4"
***---------------------------------------------------------------------------
*' Calibrate temperature such that anomaly in 2006-2015 reference period is 0.97 (SR1.5 Table 2.2, footnote 1)
***---------------------------------------------------------------------------
s15_tempOffset2010 = sum(tall$(tall.val gt 2005 and tall.val le 2015),pm_globalMeanTemperature(tall))/10;
display s15_tempOffset2010;
pm_globalMeanTemperature(tall) = pm_globalMeanTemperature(tall) - s15_tempOffset2010 + 0.97;
display pm_globalMeanTemperature;
*** temperature convergence indicator
p15_gmt_conv = 100*smax(t,abs(pm_globalMeanTemperature(t)/max(p15_gmt0(t),1e-8) -1));
display p15_gmt_conv;
*** save temp from last iteration
p15_gmt0(tall) = pm_globalMeanTemperature(tall);
$endif.cm_magicc_calibrateTemperature2000
*** offset from HADCRUT4 to zero temperature in 1900, instead of the default 1870 (20 year averages each).
pm_globalMeanTemperatureZeroed1900(tall) = pm_globalMeanTemperature(tall) + 0.092;
*** derive temperature impulse response (TIRF) from MAGICC pulse scenarios
$ifthen.cm_magicc_tirf "%cm_magicc_temperatureImpulseResponse%" == "on"
* the TIRF does not change much with emissions profile (see, e.g., figure in Schultes et al. 2017);
* thus only compute TIRF after each of the first 10 iterations, then only every fifth iteration.
* runtime is ca 30s, so switching on TIRF adds ca 10min to runtime
if( ((iteration.val le 10) or ( mod(iteration.val,5 ) eq 0)) ,
execute "Rscript run_magicc_temperatureImpulseResponse.R";
execute_loadpoint 'pm_magicc_temperatureImpulseResponse' pm_temperatureImpulseResponseCO2 = pm_temperatureImpulseResponse;
);
*NOTE the MAGICC results (*.OUT files) are from the last pulse experiment now, so take care if reading them in after this point.
$endif.cm_magicc_tirf
***---------------------------------------------------------------------------
*' Iterative adjustment of budgets or carbon taxes to meet forcing target
***---------------------------------------------------------------------------
if (cm_iterative_target_adj eq 2, !! otherwise adjustment happens in core/postsolve.gms
***---------------------------------------------------------------------------
*' Iterative adjustment for budget runs: scale current budget with the ratio of target forcing s15_gr_forc_os to current forcing p15_forc_magicc.
*' The offset is only there to increase the speed of convergence, the values have no physical meaning.
*' For low stabilization targets (rcp2.0, rcp2.6, rcp3.7) the target is the 2100 forcing target (s15_rcpCluster eq 1),
*' for lower targets the forcing target is valid during the full century (s15_rcpCluster eq 0).
***---------------------------------------------------------------------------
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
if ((cm_emiscen eq 6),
display sm_budgetCO2eqGlob, s15_gr_forc_os, p15_forc_magicc;
if (s15_rcpCluster eq 1,
sm_budgetCO2eqGlob
=
sm_budgetCO2eqGlob
* (s15_gr_forc_os - s15_forcing_budgetiterationoffset)
/ (p15_forc_magicc("2100") - s15_forcing_budgetiterationoffset)
;
pm_budgetCO2eq(regi)
=
pm_budgetCO2eq(regi)
* (s15_gr_forc_os - s15_forcing_budgetiterationoffset)
/ (p15_forc_magicc("2100") - s15_forcing_budgetiterationoffset)
;
elseif (s15_rcpCluster eq 0),
sm_budgetCO2eqGlob
=
sm_budgetCO2eqGlob
* (s15_gr_forc_nte - s15_forcing_budgetiterationoffset)
/ (smax(tall,p15_forc_magicc(tall)) - s15_forcing_budgetiterationoffset)
;
pm_budgetCO2eq(regi)
=
pm_budgetCO2eq(regi)
* (s15_gr_forc_nte - s15_forcing_budgetiterationoffset)
/ (smax(tall,p15_forc_magicc(tall)) - s15_forcing_budgetiterationoffset)
;
);
display sm_budgetCO2eqGlob;
);
***---------------------------------------------------------------------------
*' Iterative adjustment for carbon tax runs: scale current tax pathway with the ratio of target forcing s15_gr_forc_os to current forcing p15_forc_magicc.
*' The offset is only there to increase the speed of convergence, the values have no physical meaning.
*' For low stabilization targets (rcp2.0, rcp2.6, rcp3.7) the target is the 2100 forcing target (s15_rcpCluster eq 1),
*' for lower targets the forcing target is valid during the full century (s15_rcpCluster eq 0).
***---------------------------------------------------------------------------
if (cm_emiscen eq 9,
display pm_taxCO2eq, s15_gr_forc_os, p15_forc_magicc;
if (s15_rcpCluster eq 1,
pm_taxCO2eq(t,regi)
=
pm_taxCO2eq(t,regi)
* ((p15_forc_magicc("2100") - s15_forcing_budgetiterationoffset_tax - max(0,(cm_startyear-2020)/20))
/ (s15_gr_forc_os - s15_forcing_budgetiterationoffset_tax - max(0,(cm_startyear-2020)/20)))**1.2
;
elseif (s15_rcpCluster eq 0),
pm_taxCO2eq(t,regi)
=
pm_taxCO2eq(t,regi)
* ((smax(tall,p15_forc_magicc(tall)) - s15_forcing_budgetiterationoffset_tax - max(0,(cm_startyear-2020)/20))
/ (s15_gr_forc_nte - s15_forcing_budgetiterationoffset_tax - max(0,(cm_startyear-2020)/20)))**1.2
;
);
pm_taxCO2eq(t,regi)$(t.val gt 2110) = pm_taxCO2eq("2110",regi); !! to prevent huge taxes after 2110 and the resulting convergence problems, set taxes after 2110 equal to 2110 value
display pm_taxCO2eq;
);
);
Lavinia Baumstark
committed
*' @stop