gdrsclib
gdrs.c
Go to the documentation of this file.
1 /***************************************************
2 Apache License Version 2.0
3 
4 Copyright 2007-2011 EcoEquity and Stockholm Environment Institute
5 
6 Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
7 file except in compliance with the License. You may obtain a copy of the License at
8 
9  http://www.apache.org/licenses/LICENSE-2.0
10 
11 Unless required by applicable law or agreed to in writing, software distributed under
12 the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
13 KIND, either express or implied. See the License for the specific language governing
14 permissions and limitations under the License.
15 ****************************************************/
16 
20 #include <math.h>
21 #include <stdio.h>
22 #include <string.h>
23 #include <stdlib.h>
24 #include <unistd.h>
25 #include <time.h>
26 #include "gdrs.h"
27 #ifdef DMALLOC
28 #include <dmalloc.h>
29 #endif
30 
31 
39  fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
40  sqlite3_finalize(stmt);
41  sqlite3_close(db);
42 }
43 
54 int loadgdrs(struct gdrs_struct *gdrs, const char *fname) {
55  int retcode, sql3ret, i, emergpath_idx;
56  struct datablock tempdb, tempdb2;
57  time_t now;
58  struct tm *timep;
59  double val;
60  sqlite3 *db;
61  sqlite3_stmt *stmt;
62  char querybuff[1024], subquery[255], param_name[255];
63 
64  // The return value is 0 if the access is permitted, and -1 otherwise
65  if (!access(fname, F_OK)) {
66  if ((sql3ret = sqlite3_open(fname, &db))) {
67  if (db == NULL) {
68  return GDRS_NOMEM;
69  } else {
70  sqlite3_close(db);
71  return GDRS_SQLITE_OFFSET + sql3ret;
72  }
73  }
74  } else {
75  return GDRS_FREADERROR;
76  }
77 
78  now = time(NULL);
79  timep = localtime(&now);
80  gdrs->thisyear = timep->tm_year + 1900;
81 
82  // *** Get total number of records
83  sprintf(querybuff, "SELECT COUNT(iso3) FROM country;");;
84  if ((sql3ret = sqlite3_prepare_v2(db, querybuff, strlen(querybuff), &stmt, NULL))) {
85  handle_sql3error(db, stmt);
86  return GDRS_SQLITE_OFFSET + sql3ret;
87  }
88  sqlite3_step(stmt);
89  gdrs->ad.numrecs = sqlite3_column_int(stmt, 0);
90  sqlite3_finalize(stmt);
91 
92  // *** Get min & max years for entire data set
93  // These will be updated later as data sets are read in
94  sprintf(querybuff, "SELECT MIN(year) AS min_year, MAX(year) AS max_year FROM core;");
95  if ((sql3ret = sqlite3_prepare_v2(db, querybuff, strlen(querybuff), &stmt, NULL))) {
96  handle_sql3error(db, stmt);
97  return GDRS_SQLITE_OFFSET + sql3ret;
98  }
99  sqlite3_step(stmt);
100  gdrs->ad.minyear = sqlite3_column_int(stmt, 0);
101  gdrs->ad.maxyear = sqlite3_column_int(stmt, 1);
102  sqlite3_finalize(stmt);
103 
104  // *** Get iso3 codes
105  sprintf(querybuff, "SELECT iso3 FROM country ORDER BY iso3;");
106  if ((sql3ret = sqlite3_prepare_v2(db, querybuff, strlen(querybuff), &stmt, NULL))) {
107  handle_sql3error(db, stmt);
108  return GDRS_SQLITE_OFFSET + sql3ret;
109  }
110  gdrs->iso3 = malloc(gdrs->ad.numrecs * sizeof(char *));
111  for (i = 0; sqlite3_step(stmt) == SQLITE_ROW; i++) {
112  gdrs->iso3[i] = strdup((const char*)sqlite3_column_text(stmt, 0));
113  }
114  sqlite3_finalize(stmt);
115 
116  // *** Get values for parameters from data table
117  sprintf(querybuff, "SELECT param_id, int_val FROM params WHERE int_val IS NOT NULL ORDER BY param_id;");
118  if ((sql3ret = sqlite3_prepare_v2(db, querybuff, strlen(querybuff), &stmt, NULL))) {
119  handle_sql3error(db, stmt);
120  return GDRS_SQLITE_OFFSET + sql3ret;
121  }
122  while (sqlite3_step(stmt) == SQLITE_ROW) {
123  strcpy(param_name, sqlite3_column_text(stmt, 0));
124  if (!strcmp(param_name, "a1_ref_year")) {
125  gdrs->a1refyear = sqlite3_column_int(stmt, 1); // The year compared to which A1 reduces emissions (e.g., 1990 or 2005)
126  } else if (!strcmp(param_name, "assign_mit_gap_to")) {
127  gdrs->assign_mitgap_to = sqlite3_column_int(stmt, 1); // If sequencing: either 1 (Annex 1) or 2 (Annex 2) for who bears responsibility for mitigation gap
128  } else if (!strcmp(param_name, "cumsince")) {
129  gdrs->cumsince = sqlite3_column_int(stmt, 1); // Calculate responsibility from this year
130  } else if (!strcmp(param_name, "do_luxcap")) {
131  gdrs->do_luxcap = sqlite3_column_int(stmt, 1); // Calculate responsibility from this year
132  } else if (!strcmp(param_name, "emerg_path_id")) {
133  gdrs->emerg_path_id = sqlite3_column_int(stmt, 1); // Start year of "emergency progam"
134  } else if (!strcmp(param_name, "emergstart")) {
135  gdrs->emergstart = sqlite3_column_int(stmt, 1); // Start year of "emergency progam"
136  } else if (!strcmp(param_name, "interp_between_thresholds")) {
137  gdrs->interp_between_thresholds = sqlite3_column_int(stmt, 1); // Interpolate between thresholds
138  } else if (!strcmp(param_name, "kab_only_ratified")) {
139  gdrs->kab_only_ratified = sqlite3_column_int(stmt, 1); // KABs--only include countries that ratified Kyoto
140  } else if (!strcmp(param_name, "use_lag")) {
141  gdrs->use_lag = sqlite3_column_int(stmt, 1); // Apply a (varying) time lag between mitigation investment and realized reductions
142  } else if (!strcmp(param_name, "sequenceyear")) {
143  gdrs->sequenceyear = sqlite3_column_int(stmt, 1); // End of the first committment period with sequencing: only A1 up to here
144  } else if (!strcmp(param_name, "use_kab")) {
145  gdrs->use_kab = sqlite3_column_int(stmt, 1); // Use Kyoto-adjusted baselines (KABs)
146  } else if (!strcmp(param_name, "use_lulucf")) {
147  gdrs->use_lulucf = sqlite3_column_int(stmt, 1); // Flag whether to include land-use change emissions
148  } else if (!strcmp(param_name, "use_netexports")) {
149  gdrs->use_netexports = sqlite3_column_int(stmt, 1); // Flag whether to include emissions embodied in traded goods
150  } else if (!strcmp(param_name, "use_nonco2")) {
151  gdrs->use_nonco2 = sqlite3_column_int(stmt, 1); // Flag whether to include non-CO2 gases
152  } else if (!strcmp(param_name, "usesequence")) {
153  gdrs->usesequence = sqlite3_column_int(stmt, 1); // Boolean: true if Annex 1 countries act first (sequencing)
154  }
155  }
156  sqlite3_finalize(stmt);
157  // Set the "cumsince" year as the minyear for the whole analysis -- but not if > 1990, since the 1990 values are used elsewhere
158  gdrs->ad.minyear = gdrs->cumsince < 1990 ? gdrs->cumsince : 1990;
159 
160  sprintf(querybuff, "SELECT param_id, real_val FROM params WHERE real_val IS NOT NULL ORDER BY param_id;");
161  if ((sql3ret = sqlite3_prepare_v2(db, querybuff, strlen(querybuff), &stmt, NULL))) {
162  handle_sql3error(db, stmt);
163  return GDRS_SQLITE_OFFSET + sql3ret;
164  }
165 
166  gdrs->billpercgwp = 0; // this will be the sum of the adaptation and mitigation parts
167  while (sqlite3_step(stmt) == SQLITE_ROW) {
168  strcpy(param_name, sqlite3_column_text(stmt, 0));
169  if (!strcmp(param_name, "a1_perc_rdxn")) {
170  gdrs->a1_perc_rdxn = sqlite3_column_double(stmt, 1); // If sequencing, % below ref year that A1 must reduce it's emissions by sequence year
171  } else if (!strcmp(param_name, "a1_shape_param")) {
172  gdrs->a1_shape_param = sqlite3_column_double(stmt, 1); // If sequencing, exponent on tfrac^a1_shape_param that affects how rapidly A1 countries approach target
173  } else if (!strcmp(param_name, "billpercgwp_adapt")) {
174  gdrs->billpercgwp += sqlite3_column_double(stmt, 1); // Bill as percent of GWP - adaptation
175  } else if (!strcmp(param_name, "billpercgwp_mit")) {
176  gdrs->billpercgwp += sqlite3_column_double(stmt, 1); // Bill as percent of GWP - mitigation
177  } else if (!strcmp(param_name, "dev_thresh")) {
178  gdrs->dt_low = sqlite3_column_double(stmt, 1); // Development threshold
179  } else if (!strcmp(param_name, "emisselast")) {
180  gdrs->emisselast = sqlite3_column_double(stmt, 1); // Emissions elasticity
181  } else if (!strcmp(param_name, "lux_thresh")) {
182  gdrs->dt_high = sqlite3_column_double(stmt, 1); // Luxury threshold
183  } else if (!strcmp(param_name, "lux_thresh_mult")) {
184  gdrs->lux_thresh_mult = sqlite3_column_double(stmt, 1); // Responsibility weight
185  } else if (!strcmp(param_name, "respweight")) {
186  gdrs->respweight = sqlite3_column_double(stmt, 1); // Responsibility weight
187  }
188  }
189 
190  sqlite3_finalize(stmt);
191 
192  // ************************************************************
193  // Emergency pathway
194  // ************************************************************
195  // First, min & max years
196  sprintf(querybuff, "SELECT MIN(year) AS min_year, MAX(year) AS max_year FROM pathways WHERE emergpath_GtC IS NOT NULL;");
197  if ((sql3ret = sqlite3_prepare_v2(db, querybuff, strlen(querybuff), &stmt, NULL))) {
198  handle_sql3error(db, stmt);
199  return GDRS_SQLITE_OFFSET + sql3ret;
200  }
201  sqlite3_step(stmt);
202  gdrs->emergpath.y_start = sqlite3_column_int(stmt, 0);
203  gdrs->emergpath.y_end = sqlite3_column_int(stmt, 1);
204  sqlite3_finalize(stmt);
205  allocts(&gdrs->emergpath, gdrs->ad);
206  emergpath_idx = gdrs->use_lulucf + 2 * gdrs->use_nonco2;
207  switch (emergpath_idx) {
208  case 0: {
209  sprintf(subquery, "source = 'fossil'");
210  break;
211  }
212  case 1: {
213  sprintf(subquery, "source = 'fossil' OR source ='lulucf'");
214  break;
215  }
216  case 2: {
217  sprintf(subquery, "source = 'fossil' OR source ='nonco2'");
218  break;
219  }
220  default: {
221  sprintf(subquery, "source = 'fossil' OR source ='lulucf' OR source ='nonco2'");
222  }
223  }
224  sprintf(querybuff,
225  "SELECT year, 1000 * SUM(emergpath_GtC) as emergpath_MtC FROM pathways, pathway_names WHERE pathway_names.pathway_id = %d AND pathway_names.name_short = pathways.pathway AND (%s) GROUP BY year ORDER BY year;",
226  gdrs->emerg_path_id, subquery);
227  if ((sql3ret = sqlite3_prepare_v2(db, querybuff, strlen(querybuff), &stmt, NULL))) {
228  handle_sql3error(db, stmt);
229  return GDRS_SQLITE_OFFSET + sql3ret;
230  }
231  for (i = 0; sqlite3_step(stmt) == SQLITE_ROW; i++) {
232  gdrs->emergpath.data[i] = sqlite3_column_double(stmt, 1);
233  }
234  sqlite3_finalize(stmt);
235 
236  // ************************************************************
237  // Fixed factors
238  // ************************************************************
239 
240  if ((retcode = allocff(&gdrs->annex1, gdrs->ad))) return retcode;
241  if ((retcode = allocff(&gdrs->annex2, gdrs->ad))) return retcode;
242  if ((retcode = allocff(&gdrs->frozen, gdrs->ad))) return retcode;
243  if ((retcode = allocff(&gdrs->kyoto_startep_frac_1990, gdrs->ad))) return retcode;
244  if ((retcode = allocff(&gdrs->kyoto_ratified, gdrs->ad))) return retcode;
245  if ((retcode = allocff(&gdrs->rci_lagged, gdrs->ad))) return retcode;
246 
247  sprintf(querybuff, "SELECT iso3, value FROM flags WHERE flag=\"annex_1\" ORDER BY iso3;");
248  if ((sql3ret = sqlite3_prepare_v2(db, querybuff, strlen(querybuff), &stmt, NULL))) {
249  handle_sql3error(db, stmt);
250  return GDRS_SQLITE_OFFSET + sql3ret;
251  }
252  for (i = 0; i < gdrs->ad.numrecs; i++) {
253  sqlite3_step(stmt);
254  val = sqlite3_column_int(stmt, 1);
255  gdrs->annex1.data[i] = (double) val;
256  }
257  sqlite3_finalize(stmt);
258 
259  sprintf(querybuff, "SELECT iso3, value FROM flags WHERE flag=\"annex_2\" ORDER BY iso3;");
260  if ((sql3ret = sqlite3_prepare_v2(db, querybuff, strlen(querybuff), &stmt, NULL))) {
261  handle_sql3error(db, stmt);
262  return GDRS_SQLITE_OFFSET + sql3ret;
263  }
264  for (i = 0; i < gdrs->ad.numrecs; i++) {
265  sqlite3_step(stmt);
266  val = sqlite3_column_int(stmt, 1);
267  gdrs->annex2.data[i] = (double) val;
268  }
269  sqlite3_finalize(stmt);
270 
271  // Note that SQLite3 returns 0.0 for NULL floats and 0 for NULL ints
272  sprintf(querybuff, "SELECT country.iso3, commitment_percent FROM country LEFT OUTER JOIN kyoto_info ON country.iso3 = kyoto_info.iso3 ORDER BY country.iso3;");
273  if ((sql3ret = sqlite3_prepare_v2(db, querybuff, strlen(querybuff), &stmt, NULL))) {
274  handle_sql3error(db, stmt);
275  return GDRS_SQLITE_OFFSET + sql3ret;
276  }
277  for (i = 0; i < gdrs->ad.numrecs; i++) {
278  sqlite3_step(stmt);
279  val = sqlite3_column_double(stmt, 1);
280  gdrs->kyoto_startep_frac_1990.data[i] = 0.01 * val;
281  }
282  sqlite3_finalize(stmt);
283 
284  sprintf(querybuff, "SELECT country.iso3, ratified FROM country LEFT OUTER JOIN kyoto_info ON country.iso3 = kyoto_info.iso3 ORDER BY country.iso3;");
285  if ((sql3ret = sqlite3_prepare_v2(db, querybuff, strlen(querybuff), &stmt, NULL))) {
286  handle_sql3error(db, stmt);
287  return GDRS_SQLITE_OFFSET + sql3ret;
288  }
289  for (i = 0; i < gdrs->ad.numrecs; i++) {
290  sqlite3_step(stmt);
291  val = sqlite3_column_int(stmt, 1);
292  gdrs->kyoto_ratified.data[i] = (double) val;
293  }
294  sqlite3_finalize(stmt);
295 
296  // ************************************************************
297  // Data files
298  // ************************************************************
299 
300  // *** Population
301  if ((retcode = readtable(db, "pop_person", &gdrs->pop, gdrs->ad))) {
302  sqlite3_close(db);
303  return retcode;
304  }
305  if (gdrs->pop.y_start > gdrs->ad.minyear) {
306  gdrs->ad.minyear = gdrs->pop.y_start;
307  }
308  if (gdrs->pop.y_end < gdrs->ad.maxyear) {
309  gdrs->ad.maxyear = gdrs->pop.y_end;
310  }
311  // writedb2delim(gdrs->pop, "testing/pop_temp.csv", ',', gdrs->ad);
312 
313  // *** GDP
314  if ((retcode = readtable(db, "gdp_blnUSDMER", &gdrs->gdp, gdrs->ad))) {
315  sqlite3_close(db);
316  return retcode;
317  }
318  if (gdrs->gdp.y_start > gdrs->ad.minyear) {
319  gdrs->ad.minyear = gdrs->gdp.y_start;
320  }
321  if (gdrs->gdp.y_end < gdrs->ad.maxyear) {
322  gdrs->ad.maxyear = gdrs->gdp.y_end;
323  }
324  // writedb2delim(gdrs->gdp, "testing/gdp_temp.csv", ',', gdrs->ad);
325 
326  // *** PPP to MER ratio
327  if ((retcode = readtable(db, "ppp2mer", &gdrs->ppp2mer, gdrs->ad))) {
328  sqlite3_close(db);
329  return retcode;
330  }
331  if (gdrs->ppp2mer.y_start > gdrs->ad.minyear) {
332  gdrs->ad.minyear = gdrs->ppp2mer.y_start;
333  }
334  if (gdrs->ppp2mer.y_end < gdrs->ad.maxyear) {
335  gdrs->ad.maxyear = gdrs->ppp2mer.y_end;
336  }
337  // writedb2delim(gdrs->ppp2mer, "testing/ppp2mer_temp.csv", ',', gdrs->ad);
338 
339  // *** Gini coefficient
340  if ((retcode = readtable(db, "gini", &gdrs->gini, gdrs->ad))) {
341  sqlite3_close(db);
342  return retcode;
343  }
344  if (gdrs->gini.y_start > gdrs->ad.minyear) {
345  gdrs->ad.minyear = gdrs->gini.y_start;
346  }
347  if (gdrs->gini.y_end < gdrs->ad.maxyear) {
348  gdrs->ad.maxyear = gdrs->gini.y_end;
349  }
350  // writedb2delim(gdrs->gini, "testing/gini.csv", ',', gdrs->ad);
351 
352  // *** Voluntary reductions
353  if ((retcode = readtable(db, "vol_rdxn_MtC", &gdrs->volrdxn, gdrs->ad))) {
354  sqlite3_close(db);
355  return retcode;
356  }
357  if (gdrs->usesequence) {
358  if (gdrs->volrdxn.y_start > gdrs->ad.minyear) {
359  gdrs->ad.minyear = gdrs->volrdxn.y_start;
360  }
361  if (gdrs->volrdxn.y_end < gdrs->ad.maxyear) {
362  gdrs->ad.maxyear = gdrs->volrdxn.y_end;
363  }
364  // writedb2delim(gdrs->volrdxn, "testing/volrdxn.csv", ',', gdrs->ad);
365  }
366 
367  // *** Baseline fossil CO2 emissions trajectory
368  if ((retcode = readtable(db, "fossil_CO2_MtC", &gdrs->bl_fossil, gdrs->ad))) {
369  sqlite3_close(db);
370  return retcode;
371  }
372  if (gdrs->bl_fossil.y_start > gdrs->ad.minyear) {
373  gdrs->ad.minyear = gdrs->bl_fossil.y_start;
374  }
375  if (gdrs->bl_fossil.y_end < gdrs->ad.maxyear) {
376  gdrs->ad.maxyear = gdrs->bl_fossil.y_end;
377  }
378  // Make a copy for "baseline"
379  gdrs->baseline = scalmult(1, gdrs->bl_fossil, gdrs->ad);
380  // writedb2delim(gdrs->bl_fossil, "testing/bl_fossil.csv", ',', gdrs->ad);
381 
382  // *** Baseline land use, land-use change & forestry trajectory
383  if ((retcode = readtable(db, "LULCF_MtC", &gdrs->bl_lulucf, gdrs->ad))) {
384  sqlite3_close(db);
385  return retcode;
386  }
387  if (gdrs->use_lulucf) {
388  if (gdrs->bl_lulucf.y_start > gdrs->ad.minyear) {
389  gdrs->ad.minyear = gdrs->bl_lulucf.y_start;
390  }
391  if (gdrs->bl_lulucf.y_end < gdrs->ad.maxyear) {
392  gdrs->ad.maxyear = gdrs->bl_lulucf.y_end;
393  }
394  tempdb = binop(gdrs->baseline, gdrs->bl_lulucf, '+', gdrs->ad);
395  cleardata(gdrs->baseline);
396  gdrs->baseline = scalmult(1, tempdb, gdrs->ad);
397  cleardata(tempdb);
398  }
399  // writedb2delim(gdrs->use_lulucf, "testing/use_lulucf.csv", ',', gdrs->ad);
400 
401  // *** Baseline non-CO2 emissions
402  if ((retcode = readtable(db, "NonCO2_MtCe", &gdrs->bl_nonco2, gdrs->ad))) {
403  sqlite3_close(db);
404  return retcode;
405  }
406  if (gdrs->use_nonco2) {
407  if (gdrs->bl_nonco2.y_start > gdrs->ad.minyear) {
408  gdrs->ad.minyear = gdrs->bl_nonco2.y_start;
409  }
410  if (gdrs->bl_nonco2.y_end < gdrs->ad.maxyear) {
411  gdrs->ad.maxyear = gdrs->bl_nonco2.y_end;
412  }
413  tempdb = binop(gdrs->baseline, gdrs->bl_nonco2, '+', gdrs->ad);
414  cleardata(gdrs->baseline);
415  gdrs->baseline = scalmult(1, tempdb, gdrs->ad);
416  cleardata(tempdb);
417  }
418  // writedb2delim(gdrs->bl_nonco2, "testing/bl_nonco2.csv", ',', gdrs->ad);
419  // writedb2delim(gdrs->baseline, "testing/baseline.csv", ',', gdrs->ad);
420 
421  // *** Baseline embodied emissions
422  // TODO: Change code on this and similar so that text for "use_netexports" is done
423  // before this, then put the check on years into readtable
424  if ((retcode = readtable(db, "net_export_ktCO2", &gdrs->bl_netexports, gdrs->ad))) {
425  sqlite3_close(db);
426  return retcode;
427  }
428  if (gdrs->use_netexports) {
429  if (gdrs->bl_netexports.y_start > gdrs->ad.minyear) {
430  gdrs->ad.minyear = gdrs->bl_netexports.y_start;
431  }
432  if (gdrs->bl_netexports.y_end < gdrs->ad.maxyear) {
433  gdrs->ad.maxyear = gdrs->bl_netexports.y_end;
434  }
435  // Convert from ktCO2 to MtC
436  tempdb2 = scalmult(1.0e-3 * 3.0/11.0, gdrs->bl_netexports, gdrs->ad);
437  // Subtract netexports to get corrected value
438  tempdb = binop(gdrs->baseline, tempdb2, '-', gdrs->ad);
439  cleardata(gdrs->baseline);
440  gdrs->baseline = scalmult(1, tempdb, gdrs->ad);
441  cleardata(tempdb);
442  cleardata(tempdb2);
443  }
444 
445  // *** Tax levels
446  sprintf(querybuff, "SELECT seq_no, ppp, value, quintile, global FROM tax_levels;");
447  if ((sql3ret = sqlite3_prepare_v2(db, querybuff, strlen(querybuff), &stmt, NULL))) {
448  handle_sql3error(db, stmt);
449  return GDRS_SQLITE_OFFSET + sql3ret;
450  }
451  // Have to loop through twice; first get the number of tax table entries
452  for (gdrs->num_tax_levels = 0; sqlite3_step(stmt) == SQLITE_ROW; gdrs->num_tax_levels++);
453  if (gdrs->num_tax_levels > TAX_MAX_ENTRIES) {
455  }
456  sqlite3_reset(stmt);
457  for (i = 0; sqlite3_step(stmt) == SQLITE_ROW; i++) {
458  gdrs->tax_levels[i].seq_no = sqlite3_column_int(stmt, 0);
459  gdrs->tax_levels[i].is_ppp = sqlite3_column_int(stmt, 1);
460  if (sqlite3_column_type(stmt, 2) != SQLITE_NULL) {
461  gdrs->tax_levels[i].value = sqlite3_column_double(stmt, 2);
462  gdrs->tax_levels[i].type = TAX_TYPE_VALUE;
463  } else if (sqlite3_column_type(stmt, 3) != SQLITE_NULL) {
464  gdrs->tax_levels[i].quintile = sqlite3_column_double(stmt, 3);
465  if (sqlite3_column_int(stmt, 4)) {
467  } else {
469  }
470  }
471  }
472  sqlite3_finalize(stmt);
473 
474  //
475  // Done with the database--can close
476  //
477  sqlite3_close(db);
478 
479  // *** Create scaled population
480  gdrs->scalpop = scalmult(1.0e-9, gdrs->pop, gdrs->ad);
481  // writedb2delim(gdrs->scalpop, "testing/scalpop.csv", ',', gdrs->ad);
482 
483  // *** Calculate sd of log (sigma) corresponding to Gini
484  gdrs->sdlog = transform(gdrs->gini, *gini2sdlog, gdrs->ad);
485  // writedb2delim(gdrs->sdlog, "testing/sdlog.csv", ',', gdrs->ad);
486 
487  if ((retcode = allocff(&gdrs->kyoto_startep_frac, gdrs->ad))) return retcode;
488  for (i = 0; i < gdrs->ad.numrecs; i++) {
489  val = getval(gdrs->baseline, i, 1990, gdrs->ad)/getval(gdrs->baseline, i, gdrs->emergstart, gdrs->ad);
490  val *= gdrs->kyoto_startep_frac_1990.data[i];
491  gdrs->kyoto_startep_frac.data[i] = val > 1.0 ? 1.0 : val;
492  }
493  // writeff2delim(gdrs->kyoto_startep_frac, "testing/kab_value.csv", ',', gdrs->ad);
494 
495  // *** Allocate memory for calculated results
496  gdrs->r.y_start = gdrs->ad.minyear;
497  gdrs->c.y_start = gdrs->ad.minyear;
498  gdrs->rci.y_start = gdrs->ad.minyear;
499  gdrs->alloc_gdrs.y_start = gdrs->ad.minyear;
500  gdrs->pop_above_dl.y_start = gdrs->ad.minyear;
501  gdrs->a1domrdxn.y_start = gdrs->ad.minyear;
502  gdrs->lux_emiss.y_start = gdrs->ad.minyear;
503  gdrs->zu_adj.y_start = gdrs->ad.minyear;
504  gdrs->yu_adj.y_start = gdrs->ad.minyear;
505  gdrs->pop_above_lux.y_start = gdrs->ad.minyear;
506  gdrs->lux_emiss_applied.y_start = gdrs->ad.minyear;
507  gdrs->kab_gap.y_start = gdrs->ad.minyear;
508 
509  gdrs->r.y_end = gdrs->ad.maxyear;
510  gdrs->c.y_end = gdrs->ad.maxyear;
511  gdrs->rci.y_end = gdrs->ad.maxyear;
512  gdrs->alloc_gdrs.y_end = gdrs->ad.maxyear;
513  gdrs->pop_above_dl.y_end = gdrs->ad.maxyear;
514  gdrs->a1domrdxn.y_end = gdrs->ad.maxyear;
515  gdrs->lux_emiss.y_end = gdrs->ad.maxyear;
516  gdrs->zu_adj.y_end = gdrs->ad.maxyear;
517  gdrs->yu_adj.y_end = gdrs->ad.maxyear;
518  gdrs->pop_above_lux.y_end = gdrs->ad.maxyear;
519  gdrs->lux_emiss_applied.y_end = gdrs->ad.maxyear;
520  gdrs->kab_gap.y_end = gdrs->ad.maxyear;
521 
522  if ((retcode = allocdata(&gdrs->r, gdrs->ad))) return retcode;
523  if ((retcode = allocdata(&gdrs->c, gdrs->ad))) return retcode;
524  if ((retcode = allocdata(&gdrs->rci, gdrs->ad))) return retcode;
525  if ((retcode = allocdata(&gdrs->alloc_gdrs, gdrs->ad))) return retcode;
526  if ((retcode = allocdata(&gdrs->pop_above_dl, gdrs->ad))) return retcode;
527  if ((retcode = allocdata(&gdrs->a1domrdxn, gdrs->ad))) return retcode;
528  if ((retcode = allocdata(&gdrs->lux_emiss, gdrs->ad))) return retcode;
529  if ((retcode = allocdata(&gdrs->zu_adj, gdrs->ad))) return retcode;
530  if ((retcode = allocts(&gdrs->yu_adj, gdrs->ad))) return retcode; // yu_adj is a timeseries
531  if ((retcode = allocdata(&gdrs->pop_above_lux, gdrs->ad))) return retcode;
532  if ((retcode = allocdata(&gdrs->lux_emiss_applied, gdrs->ad))) return retcode;
533  if ((retcode = allocdata(&gdrs->kab_gap, gdrs->ad))) return retcode;
534 
535  for (i = 0; i < gdrs->num_tax_levels; i++) {
536  gdrs->tax_revenue_mer_dens[i].y_start = gdrs->ad.minyear;
537  gdrs->tax_revenue_mer_dens[i].y_end = gdrs->ad.maxyear;
538  if ((retcode = allocdata(&(gdrs->tax_revenue_mer_dens[i]), gdrs->ad))) return retcode;
539  gdrs->tax_revenue_ppp_dens[i].y_start = gdrs->ad.minyear;
540  gdrs->tax_revenue_ppp_dens[i].y_end = gdrs->ad.maxyear;
541  if ((retcode = allocdata(&(gdrs->tax_revenue_ppp_dens[i]), gdrs->ad))) return retcode;
542  gdrs->tax_income_mer_dens[i].y_start = gdrs->ad.minyear;
543  gdrs->tax_income_mer_dens[i].y_end = gdrs->ad.maxyear;
544  if ((retcode = allocdata(&(gdrs->tax_income_mer_dens[i]), gdrs->ad))) return retcode;
545  gdrs->tax_income_ppp_dens[i].y_start = gdrs->ad.minyear;
546  gdrs->tax_income_ppp_dens[i].y_end = gdrs->ad.maxyear;
547  if ((retcode = allocdata(&(gdrs->tax_income_ppp_dens[i]), gdrs->ad))) return retcode;
548  gdrs->tax_pop_dens[i].y_start = gdrs->ad.minyear;
549  gdrs->tax_pop_dens[i].y_end = gdrs->ad.maxyear;
550  if ((retcode = allocdata(&(gdrs->tax_pop_dens[i]), gdrs->ad))) return retcode;
551  gdrs->tax_pop_below[i].y_start = gdrs->ad.minyear;
552  gdrs->tax_pop_below[i].y_end = gdrs->ad.maxyear;
553  if ((retcode = allocdata(&(gdrs->tax_pop_below[i]), gdrs->ad))) return retcode;
554  }
555 
556  calcybar(gdrs);
557 
558  // Create the "z-values" for thresholds
559  gdrs->zl = z(gdrs->dt_low, gdrs, XR_PPP);
560  gdrs->zu = z(gdrs->dt_high, gdrs, XR_MER);
561 
562  calcallocs(gdrs);
563 
564  return GDRS_OK;
565 }
566 
576 int readtable(sqlite3 *db, const char *column, struct datablock *table, struct appdata ad) {
577  sqlite3_stmt *stmt;
578  int i, year, sql3ret, err;
579  double val;
580  char querybuff[1024];
581 
582  // First, min & max years
583  sprintf(querybuff, "SELECT MIN(year) AS min_year, MAX(year) AS max_year FROM core WHERE %s IS NOT NULL;", column);
584  if ((sql3ret = sqlite3_prepare_v2(db, querybuff, strlen(querybuff), &stmt, NULL))) {
585  handle_sql3error(db, stmt);
586  return GDRS_SQLITE_OFFSET + sql3ret;
587  }
588  sqlite3_step(stmt);
589  table->y_start = sqlite3_column_int(stmt, 0);
590  table->y_end = sqlite3_column_int(stmt, 1);
591  sqlite3_finalize(stmt);
592 
593  // Initialize the variable
594  if ((err = allocdata(table, ad))) {
595  return err;
596  }
597 
598  // Next, whole table
599  sprintf(querybuff, "SELECT iso3, year, %s FROM core WHERE %s IS NOT NULL ORDER BY iso3, year;", column, column);
600  if ((sql3ret = sqlite3_prepare_v2(db, querybuff, strlen(querybuff), &stmt, NULL))) {
601  handle_sql3error(db, stmt);
602  return GDRS_SQLITE_OFFSET + sql3ret;
603  }
604  for (i = 0; i < ad.numrecs; i++) {
605  for (year = table->y_start; year <= table->y_end; year++) {
606  sqlite3_step(stmt);
607  val = sqlite3_column_double(stmt, 2);
608  setval(*table, val, i, year, ad);
609  }
610  }
611  sqlite3_finalize(stmt);
612 
613  return GDRS_OK;
614 }
615 
621 void cleargdrs(struct gdrs_struct gdrs) {
622  int i;
623 
624  cleardata(gdrs.bl_netexports);
625  cleardata(gdrs.bl_fossil);
626  cleardata(gdrs.bl_lulucf);
627  cleardata(gdrs.bl_nonco2);
628  cleardata(gdrs.baseline);
629  cleardata(gdrs.gdp);
630  cleardata(gdrs.pop);
631  cleardata(gdrs.scalpop);
632  cleardata(gdrs.ppp2mer);
633  cleardata(gdrs.ybar_ppp);
634  cleardata(gdrs.gini);
635  cleardata(gdrs.sdlog);
636  cleardata(gdrs.r);
637  cleardata(gdrs.c);
638  cleardata(gdrs.rci);
639  cleardata(gdrs.alloc_gdrs);
640  cleardata(gdrs.pop_above_dl);
641  cleardata(gdrs.volrdxn);
642  cleardata(gdrs.a1domrdxn);
643  cleardata(gdrs.lux_emiss);
644  cleardata(gdrs.zu_adj);
645  cleardata(gdrs.pop_above_lux);
647  cleardata(gdrs.kab_gap);
648  cleardata(gdrs.zu);
649  cleardata(gdrs.zl);
650 
651  clearts(gdrs.yu_adj);
652  clearts(gdrs.emergpath);
653 
654  clearff(gdrs.annex1);
655  clearff(gdrs.annex2);
656  clearff(gdrs.frozen);
657  clearff(gdrs.rci_lagged);
658 
659  for (i = 0; i < gdrs.ad.numrecs; i++) {
660  free(gdrs.iso3[i]);
661  }
662  free(gdrs.iso3);
663 
664  for (i = 0; i < gdrs.num_tax_levels; i++) {
669  cleardata(gdrs.tax_pop_dens[i]);
670  cleardata(gdrs.tax_pop_below[i]);
671  }
672 }
673 
687 double globaldist(double y, int year, struct gdrs_struct *gdrs, int ppp_or_mer, double *dist_deriv) {
688  int i;
689  double ybar, P, sigma, z;
690  double cum, deriv, cumP;
691 
692  if (y < 0) {
693  return NAN;
694  } else if (y == 0) {
695  return 0.0;
696  } else if (isinf(y) == 1) {
697  return 1.0;
698  }
699  cum = 0; // Cumulative distribution up to specified income level
700  deriv = 0; // Derivative of the cumulative distribution
701  cumP = 0;
702  for (i = 0; i < gdrs->ad.numrecs; i++) {
703  // Store values from tables into local variables for convenience
704  ybar = getval(gdrs->ybar_ppp, i, year, gdrs->ad);
705  sigma = getval(gdrs->sdlog, i, year, gdrs->ad);
706  P = getval(gdrs->scalpop, i, year, gdrs->ad);
707  if (ppp_or_mer == XR_MER) {
708  ybar /= getval(gdrs->ppp2mer, i, year, gdrs->ad);
709  }
710  z = ztransf(y, ybar, sigma);
711 
712  // Note that dz/dy = 1/(sigma * y)
713  if (dist_deriv) {
714  deriv += P * dnorm(z)/(sigma * y);
715  }
716  cum += P * pnorm(z);
717  cumP += P;
718  }
719  cum /= cumP;
720  deriv /= cumP;
721 
722  if (dist_deriv) *dist_deriv = deriv;
723 
724  return cum;
725 }
726 
739 double globalquintile(double q, int year, struct gdrs_struct *gdrs, int ppp_or_mer) {
740  double y, qcalc, qderiv;
741  int niter;
742 
743  y = INIT_Y;
744 
745  for (niter = 0; niter < MAXITER; niter++) {
746  qcalc = globaldist(y, year, gdrs, ppp_or_mer, &qderiv);
747  if (fabs(qcalc - q) < EPS_NEWTON) break;
748 
749  y += (q - qcalc)/qderiv;
750  }
751 
752  if (niter == MAXITER) {
753  y = NAN;
754  }
755 
756  return y;
757 }
758 
769 double nationalquintile(double q, double ybar, double sigma) {
770  return ybar * exp(sigma * (qnorm(q) - 0.5 * sigma));
771 }
772 
782 void combine_gap(struct fixedfactor* gap, int i, double newgap, int combine) {
783  switch (combine) {
784  case GAP_COMBINE_NONE:
785  gap->data[i] = newgap;
786  break;
787  case GAP_COMBINE_ADD:
788  gap->data[i] += newgap;
789  break;
790  case GAP_COMBINE_MAX:
791  if (newgap > gap->data[i]) gap->data[i] = newgap;
792  break;
793  case GAP_COMBINE_MIN:
794  if (newgap < gap->data[i]) gap->data[i] = newgap;
795  break;
796  default:
797  break;
798  }
799 }
800 
812 void calc_kab(struct fixedfactor* gap, double* totgap, int year, int period, int combine, struct gdrs_struct *gdrs) {
813  int i, emergstart;
814  double bau_at_start_ep, bau_now, tot_bau, ep;
815  double kyoto_startep_frac, filter;
816  double totgap_temp, newgap, ep_gap;
817  struct fixedfactor newgaps;
818 
819 
820  if (period == PER_BEFORE_EP) {
821  *totgap = 0.0;
822  for (i = 0; i < gdrs->ad.numrecs; i++) {
823  setval(gdrs->kab_gap, 0.0, i, year, gdrs->ad);
824  if (combine == GAP_COMBINE_NONE) {
825  // Make sure initialize to zero, if this is the first one
826  combine_gap(gap, i, 0.0, combine);
827  }
828  }
829  } else {
830  allocff(&newgaps, gdrs->ad);
831 
832  ep = gettsval(gdrs->emergpath, year, gdrs->ad);
833  emergstart = gdrs->emergstart;
834 
835  totgap_temp = 0;
836  tot_bau = 0;
837  for (i = 0; i < gdrs->ad.numrecs; i++) {
838  bau_at_start_ep = getval(gdrs->baseline, i, emergstart, gdrs->ad);
839  kyoto_startep_frac = gdrs->kyoto_startep_frac.data[i];
840  if (gdrs->kab_only_ratified) {
841  filter = gdrs->kyoto_ratified.data[i];
842  } else {
843  if (gdrs->kyoto_ratified.data[i] > 0.5) {
844  filter = gdrs->kyoto_ratified.data[i];
845  } else {
846  // Any countries without a Kyoto commitment get assigned a value of 0.0
847  filter = fabs(kyoto_startep_frac) < EPSILON ? 0.0 : 1.0;
848  }
849  }
850  tot_bau += bau_now = getval(gdrs->baseline, i, year, gdrs->ad);
851  newgap = filter * bau_at_start_ep * (1.0 - kyoto_startep_frac); // If "bau_now", the slab expands; if "bau_at_start_ep" it's a fixed slab
852  if (newgap < 0.0) newgap = 0.0;
853  newgaps.data[i] = newgap;
854  totgap_temp += newgap;
855  }
856 
857  // Check if the correction exceeds the current gap between BAU & EP, and adjust if necessary
858  *totgap = 0;
859  ep_gap = tot_bau > ep ? tot_bau - ep : 0.0;
860  for (i = 0; i < gdrs->ad.numrecs; i++) {
861  if (totgap_temp > ep_gap) {
862  newgap = fabs(totgap_temp) > EPSILON ? newgaps.data[i] * ep_gap/totgap_temp : 0.0;
863  } else {
864  newgap = newgaps.data[i];
865  }
866  setval(gdrs->kab_gap, newgap, i, year, gdrs->ad);
867  if (gdrs->use_kab) {
868  combine_gap(gap, i, newgap, combine);
869  *totgap += newgap;
870  }
871  }
872 
873  clearff(newgaps);
874  }
875 
876 }
877 
878 
892 void calc_luxemiss(struct fixedfactor* gap, double* totgap, int year, int period, int combine, struct gdrs_struct *gdrs) {
893  int i;
894  double lux_emiss, ybar, yu, yu_adj, yu_ppp, f1;
895  double blval, gamma, sigma, zu, filter, newgap;
896 
897  gamma = gdrs->emisselast;
898  yu = gdrs->dt_high; // The user-defined, fixed luxury threshold
899  if (gdrs->do_luxcap) {
900  yu_adj = gettsval(gdrs->yu_adj, year, gdrs->ad);
901  } else {
902  yu_adj = yu;
903  }
904 
905  *totgap = 0;
906  for (i = 0; i < gdrs->ad.numrecs; i++) {
907  // Always report luxury emissions (not net of frozen emissions), whether capping baselines or not, using user-defined line
908  blval = getval(gdrs->baseline, i, year, gdrs->ad);
909  sigma = getval(gdrs->sdlog, i, year, gdrs->ad);
910  // Fixed line...
911  zu = getval(gdrs->zu, i, year, gdrs->ad);
912  ybar = getval(gdrs->ybar_ppp, i, year, gdrs->ad);
913  // Convert fixed lux threshold to PPP for consistent comparison to ybar
914  yu_ppp = yu * getval(gdrs->ppp2mer, i, year, gdrs->ad);
915  f1 = pow(yu_ppp/ybar, gamma) * exp(-0.5 * gamma * (gamma - 1) * sigma * sigma);
916  lux_emiss = blval * (1 - pnorm(zu - gamma * sigma) - f1 * (1 - pnorm(zu)));
917  setval(gdrs->lux_emiss, lux_emiss, i, year, gdrs->ad);
918  if (gdrs->do_luxcap && (period != PER_BEFORE_EP)) {
919  // Correct baseline value for "frozen" emissions
920  blval -= gdrs->frozen.data[i];
921  zu = getval(gdrs->zu_adj, i, year, gdrs->ad);
922  // This captures the PPP conversion factor:
923  // f1' = f1 * (yu_adj * ppp2mer/yu * ppp2mer)^gamma = f1 * (yu_adj/yu)^gamma
924  f1 *= pow(yu_adj/yu, gamma);
925  // When sequencing, only apply luxury emissions to Annex 1
926  if (gdrs->usesequence && period == PER_SEQUENCE) {
927  filter = gdrs->annex1.data[i];
928  } else {
929  filter = 1;
930  }
931  newgap = filter * blval * (1 - pnorm(zu - gamma * sigma) - f1 * (1 - pnorm(zu)));
932  } else {
933  newgap = 0;
934  }
935  combine_gap(gap, i, newgap, combine);
936  *totgap += gap->data[i];
937  setval(gdrs->lux_emiss_applied, gap->data[i], i, year, gdrs->ad);
938  }
939 }
940 
947 void calcallocs(struct gdrs_struct *gdrs) {
948  int i, year;
949  // Basic RCI/GDRs
950  double bltot, globalrdxn, alloc, rci;
951  int lag_start, lag_ndx;
952  // For adjusted baselines
953  double totgap;
954  struct fixedfactor gap;
955  // For sequencing
956  int period;
957  double a1, a2, a1rci, a2rci, a1natlrdxn;
958  double tfrac, a1rdxn;
959  double blref, blval, f;
960 
961  //--------------------------------------
962  //
963  // Initialize variables
964  //
965  //--------------------------------------
966 
967  // Sequencing
968  f = 0.01 * gdrs->a1_perc_rdxn;
969  for (i = 0; i < gdrs->ad.numrecs; i++) {
970  gdrs->frozen.data[i] = 0.0;
971  }
972 
973  // To store results from "gaps", such as luxury-capped baselines or Kyoto-adjusted baselines
974  allocff(&gap, gdrs->ad);
975 
976  // Find start year for mitigation lag/smoothing
977  lag_start = gdrs->thisyear > gdrs->cumsince ? gdrs->thisyear : gdrs->cumsince;
978 
979  //--------------------------------------
980  //
981  // Loop over years
982  //
983  //--------------------------------------
984  for (year = gdrs->ad.minyear; year <= gdrs->ad.maxyear; year++) {
985  // First, get RCI based on allocations from previous (or initial) year; this will also calculate yu_adj if doing luxury-capping
986  nextrci(year, gdrs);
987 
988  if (gdrs->use_lag && year > lag_start) {
989  lag_ndx = year - lag_start;
990  } else {
991  lag_ndx = 0;
992  }
993 
994  for (i = 0; i < gdrs->ad.numrecs; i++) {
995  rci = getval(gdrs->rci, i, year, gdrs->ad);
996  if (gdrs->use_lag && lag_ndx > 0) {
997  rci = (rci + lag_ndx * getffval(gdrs->rci_lagged, i, gdrs->ad))/(lag_ndx + 1);
998  setval(gdrs->rci, rci, i, year, gdrs->ad);
999  }
1000  setffval(gdrs->rci_lagged, rci, i, gdrs->ad);
1001  }
1002 
1003  // Figure out the sequencing "period" -- period can equal PER_SEQUENCE only if using sequencing
1004  if (year < gdrs->emergstart) {
1005  period = PER_BEFORE_EP;
1006  } else {
1007  if (gdrs->usesequence && year <= gdrs->sequenceyear) {
1008  period = PER_SEQUENCE;
1009  } else {
1010  period = PER_GDRS;
1011  }
1012  }
1013 
1014  //------ Prep: if sequencing
1015  a1rci = a2rci = a1rdxn = 0.0;
1016  tfrac = -999.0; // Unused if not doing sequencing, so initialize to something wrong but recognizable
1017  if (period == PER_SEQUENCE) {
1018  tfrac = (double)(year - gdrs->emergstart) / (double)(gdrs->sequenceyear - gdrs->emergstart);
1019  for (i = 0; i < gdrs->ad.numrecs; i++) {
1020  rci = getffval(gdrs->rci_lagged, i, gdrs->ad);
1021  a1 = gdrs->annex1.data[i];
1022  a2 = gdrs->annex2.data[i];
1023  a1rci += a1 * rci;
1024  a2rci += a2 * rci;
1025  // a1 is either 0.0 or 1.0. This will definitely select for 1.0 (Annex 1)
1026  if (a1 > 0.5) {
1027  // TODO: This could give an error if a1refyear is less than start year for baseline
1028  blref = getval(gdrs->baseline, i, gdrs->a1refyear, gdrs->ad);
1029  // Annex 1 domestic reduction commitment -- interpolate between emerg start and end of 1st commitment period
1030  a1rdxn += (getval(gdrs->baseline, i, year, gdrs->ad) - (1 - f) * blref) * pow(tfrac, gdrs->a1_shape_param);
1031  }
1032  }
1033  }
1034 
1035  //------ Calculate luxury emissions and (if doing luxury-capped baselines), update gap & totgap
1036  calc_luxemiss(&gap, &totgap, year, period, GAP_COMBINE_NONE, gdrs);
1037  calc_kab(&gap, &totgap, year, period, GAP_COMBINE_MAX, gdrs);
1038 
1039  //----------------------------------
1040  // Calculate allocations
1041  //----------------------------------
1042  if (period == PER_BEFORE_EP) {
1043  globalrdxn = 0.0;
1044  } else {
1045  bltot = 0.0;
1046  for (i = 0; i < gdrs->ad.numrecs; i++) {
1047  // Note: frozen emissions are zero if not sequencing
1048  bltot += getval(gdrs->baseline, i, year, gdrs->ad) - gdrs->frozen.data[i];
1049  }
1050  // Note: totgap is zero if not using adjusted baselines
1051  globalrdxn = bltot - totgap - gettsval(gdrs->emergpath, year, gdrs->ad);
1052  }
1053  for (i = 0; i < gdrs->ad.numrecs; i++) {
1054  rci = getffval(gdrs->rci_lagged, i, gdrs->ad);
1055  blval = getval(gdrs->baseline, i, year, gdrs->ad) - gdrs->frozen.data[i];
1056 
1057  //------ Sequencing
1058  a1natlrdxn = 0.0;
1059  if (period == PER_SEQUENCE) {
1060  a1 = gdrs->annex1.data[i];
1061  a2 = gdrs->annex2.data[i];
1062  // Non-Annex 1
1063  if (a1 < 0.5) {
1064  alloc = blval;
1065  } else {
1066  // First, subtract off share of A1 domestic reductions
1067  a1natlrdxn = (rci/a1rci) * a1rdxn;
1068  alloc = blval - gap.data[i] - a1natlrdxn;
1069  // Next, assign remaining:
1070  if (gdrs->assign_mitgap_to == ANNEX1) {
1071  alloc -= (rci/a1rci) * (globalrdxn - a1rdxn);
1072  } else {
1073  alloc -= a2 * (rci/a2rci) * (globalrdxn - a1rdxn);
1074  }
1075  }
1076  // Store "frozen obligations" if at end of sequencing period
1077  if (year == gdrs->sequenceyear && gdrs->usesequence) {
1078  if (a1 > 0.5) {
1079  gdrs->frozen.data[i] = blval - alloc;
1080  }
1081  }
1082  } else {
1083  // Note: gap = 0 if not using adjusted baselines
1084  // Note: frozen emissions have already been subtracted off of baseline emissions
1085  alloc = blval - gap.data[i] - globalrdxn * rci;
1086  }
1087  // Update data series
1088  setval(gdrs->a1domrdxn, a1natlrdxn, i, year, gdrs->ad);
1089  setval(gdrs->alloc_gdrs, alloc, i, year, gdrs->ad);
1090  }
1091  }
1092  clearff(gap);
1093 }
1094 
1107 void nextrci(int year, struct gdrs_struct *gdrs) {
1108  int i, j, yprev, do_interp, ppp_or_mer;
1109  double sigma, gamma, popdens, z_tax, zl, zu, yl, yu, yu_ppp, ybar, E, P, A;
1110  double c, r, rci, rci_indiv, ppp2mer, pi, tax_mer;
1111  double csum, rsum, rprev;
1112  double gwp, tot_tax, ytax, ytax_ppp;
1113  struct fixedfactor r_ann;
1114 
1115  // TODO: Check return value and abort if nonzero
1116  allocff(&r_ann, gdrs->ad);
1117 
1118  do_interp = gdrs->interp_between_thresholds;
1119  gamma = gdrs->emisselast;
1120  yl = gdrs->dt_low;
1121 
1122  if (gdrs->do_luxcap) {
1123  yu = luxcap(year, gdrs);
1124  } else {
1125  yu = gdrs->dt_high;
1126  }
1127 
1128  yprev = year - 1;
1129  if (yprev < gdrs->baseline.y_start) yprev = gdrs->baseline.y_start;
1130 
1131  csum = rsum = gwp = 0.0;
1132  for (i = 0; i < gdrs->ad.numrecs; i++) {
1133  // Store values from tables into local variables for convenience
1134  ybar = getval(gdrs->ybar_ppp, i, year, gdrs->ad);
1135  sigma = getval(gdrs->sdlog, i, year, gdrs->ad);
1136  P = getval(gdrs->scalpop, i, year, gdrs->ad);
1137  ppp2mer = getval(gdrs->ppp2mer, i, year, gdrs->ad);
1138  pi = 1/ppp2mer;
1139  // Calculate gross world product in MER terms
1140  gwp += P * pi * ybar;
1141  // The luxury threshold is in MER terms, but some calculations here are in PPP,
1142  // so offer scaled version for each country
1143  yu_ppp = yu/pi;
1144  zl = getval(gdrs->zl, i, year, gdrs->ad);
1145  if (gdrs->do_luxcap) {
1146  zu = getval(gdrs->zu_adj, i, year, gdrs->ad);
1147  } else {
1148  zu = getval(gdrs->zu, i, year, gdrs->ad);
1149  }
1150  if (year <= gdrs->cumsince) {
1151  E = getval(gdrs->baseline, i, yprev, gdrs->ad);
1152  } else {
1153  E = getval(gdrs->alloc_gdrs, i, yprev, gdrs->ad);
1154  }
1155  A = rhat(E, gamma, sigma, ybar);
1156  // Calculate capacity and annual responsibility
1157  if (!do_interp) {
1158  c = P * capbetween(-INFINITY, INFINITY, zl, zl, yl, yl, ybar, sigma, pi, gdrs->lux_thresh_mult);
1159  r_ann.data[i] = respbetween(gamma, -INFINITY, INFINITY, zl, zl, yl, yl, ybar, sigma, A);
1160  } else {
1161  c = P * capbetween(-INFINITY, INFINITY, zl, zu, yl, yu_ppp, ybar, sigma, pi, gdrs->lux_thresh_mult);
1162  r_ann.data[i] = respbetween(gamma, -INFINITY, INFINITY, zl, zu, yl, yu_ppp, ybar, sigma, A);
1163  }
1164  // Responsibility is cumulative
1165  if (year <= gdrs->cumsince) {
1166  rprev = 0.0;
1167  } else {
1168  rprev = getval(gdrs->r, i, yprev, gdrs->ad);
1169  }
1170  r = r_ann.data[i] + rprev;
1171  // Don't allow negative values
1172  if (r < 0) r = 0;
1173  // Update global totals
1174  csum += c;
1175  rsum += r;
1176  // Store the non-normalized c & r values (these will be overwritten later) and pop above dl
1177  setval(gdrs->c, c, i, year, gdrs->ad);
1178  setval(gdrs->r, r, i, year, gdrs->ad);
1179  setval(gdrs->pop_above_dl, P * (1 - pnorm(zl)), i, year, gdrs->ad);
1180  // For population above luxury threshold, use the fixed, not adjusted, value
1181  zu = getval(gdrs->zu, i, year, gdrs->ad);
1182  setval(gdrs->pop_above_lux, P * (1 - pnorm(zu)), i, year, gdrs->ad);
1183  }
1184  // For tax, calculate any global quintiles for the current year
1185  for (i = 0; i < gdrs->num_tax_levels; i++) {
1186  if (gdrs->tax_levels[i].type == TAX_TYPE_GLOBAL_QUINTILE) {
1187  if (gdrs->tax_levels[i].is_ppp) {
1188  ppp_or_mer = XR_PPP;
1189  } else {
1190  ppp_or_mer = XR_MER;
1191  }
1192  gdrs->tax_levels[i].value = globalquintile(gdrs->tax_levels[i].quintile, year, gdrs, ppp_or_mer);
1193  }
1194  }
1195  // Calculate RCI and tax levels
1196  tot_tax = 0.01 * gdrs->billpercgwp * gwp;
1197  for (i = 0; i < gdrs->ad.numrecs; i++) {
1198  c = getval(gdrs->c, i, year, gdrs->ad);
1199  r = getval(gdrs->r, i, year, gdrs->ad);
1200  rci = (1 - gdrs->respweight) * c/csum + gdrs->respweight * r/rsum;
1201  setval(gdrs->rci, rci, i, year, gdrs->ad);
1202 
1203  // Tax calculation
1204  P = getval(gdrs->scalpop, i, year, gdrs->ad);
1205  ybar = getval(gdrs->ybar_ppp, i, year, gdrs->ad);
1206  sigma = getval(gdrs->sdlog, i, year, gdrs->ad);
1207  ppp2mer = getval(gdrs->ppp2mer, i, year, gdrs->ad);
1208  pi = 1/ppp2mer;
1209  if (year <= gdrs->cumsince) {
1210  E = getval(gdrs->baseline, i, yprev, gdrs->ad);
1211  } else {
1212  E = getval(gdrs->alloc_gdrs, i, yprev, gdrs->ad);
1213  }
1214  A = rhat(E, gamma, sigma, ybar);
1215  for (j = 0; j < gdrs->num_tax_levels; j++) {
1216  if (gdrs->tax_levels[j].type == TAX_TYPE_NATL_QUINTILE) {
1217  gdrs->tax_levels[j].value = nationalquintile(gdrs->tax_levels[i].quintile, ybar, sigma);
1218  if (!gdrs->tax_levels[j].is_ppp) {
1219  gdrs->tax_levels[j].value *= pi;
1220  }
1221  }
1222  if (gdrs->tax_levels[j].is_ppp) {
1223  ytax_ppp = gdrs->tax_levels[j].value;
1224  ytax = pi * ytax_ppp;
1225  } else {
1226  ytax = gdrs->tax_levels[j].value;
1227  ytax_ppp = ytax/pi;
1228  }
1229  rci_indiv = (1 - gdrs->respweight) * P * c_indiv(ytax, pi * yl, yu, do_interp)/csum;
1230  rci_indiv += gdrs->respweight * (r/rsum) * r_indiv(gamma, ytax_ppp, yl, yu/pi, A, do_interp)/r_ann.data[i];
1231  // TODO: Make this work properly: shouldn't get NAN's
1232  if (isnan(rci_indiv)) {
1233  rci_indiv = -9999;
1234  }
1235  // These densities can be summed across countries and then divided by each other. So:
1236  // tax rate = tax_revenue_mer_dens/tax_income_mer_dens
1237  // tax per capita = tax_revenue_mer_dens/tax_pop_dens
1238  // income at tax level (MER) = tax_income_mer_dens/tax_pop_dens
1239  // income at tax level (PPP) = tax_income_ppp_dens/tax_pop_dens
1240  // etc.
1241  // Note that ybar is in PPP terms
1242  z_tax = ztransf(ytax_ppp, ybar, sigma);
1243  popdens = P * dnorm(z_tax)/(sigma * ytax_ppp);
1244  tax_mer = rci_indiv * tot_tax * popdens;
1245  setval(gdrs->tax_revenue_mer_dens[j], tax_mer, i, year, gdrs->ad);
1246  setval(gdrs->tax_revenue_ppp_dens[j], tax_mer/pi, i, year, gdrs->ad);
1247  setval(gdrs->tax_income_mer_dens[j], ytax * popdens, i, year, gdrs->ad);
1248  setval(gdrs->tax_income_ppp_dens[j], ytax_ppp * popdens, i, year, gdrs->ad);
1249  setval(gdrs->tax_pop_dens[j], popdens, i, year, gdrs->ad);
1250  setval(gdrs->tax_pop_below[j], P * pnorm(z_tax), i, year, gdrs->ad);
1251  }
1252  }
1253 
1254  clearff(r_ann);
1255 }
1256 
1270 double M(double a, double zc, double ybar, double sigma) {
1271  double fact1, fact2, fact3;
1272 
1273  fact1 = pow(ybar, a);
1274  fact2 = exp(0.5 * sigma * sigma * a * (a - 1));
1275  if (!isinf(zc)) {
1276  fact3 = 1 - pnorm(zc - a * sigma);
1277  } else if (zc > 0) {
1278  fact3 = 0;
1279  } else {
1280  fact3 = 1;
1281  }
1282 
1283  return fact1 * fact2 * fact3;
1284 }
1285 
1299 double a_gamma(double gamma, double y, double a, double b) {
1300  double r, t1, t2;
1301 
1302  if (fabs(a - b) < EPSILON) {
1303  return 0;
1304  }
1305 
1306  r = gamma/(1 + gamma);
1307  t1 = r * (pow(y,gamma + 1) - pow(a, gamma+1));
1308  t2 = a * (pow(y, gamma) - pow(a, gamma));
1309 
1310  return (t1 - t2)/(b - a);
1311 }
1312 
1325 double b_gamma(double gamma, double y, double b) {
1326  return pow(y, gamma) - pow(b, gamma);
1327 }
1328 
1347 double A_gamma(double gamma, double za, double zb, double yl, double yu, double ybar, double sigma) {
1348  double r, t1, t2, t3, z;
1349 
1350  if (fabs(yu - yl) < EPSILON) {
1351  return 0;
1352  }
1353 
1354  r = 1/(1 + gamma);
1355  t1 = -gamma * r * (M(gamma + 1, zb, ybar, sigma) - M(gamma + 1, za, ybar, sigma));
1356  t2 = yl * (M(gamma, zb, ybar, sigma) - M(gamma, za, ybar, sigma));
1357  t3 = -pow(yl, gamma + 1) * r * (M(0, zb, ybar, sigma) - M(0, za, ybar, sigma));
1358 
1359  return (t1 + t2 + t3)/(yu - yl);
1360 }
1361 
1379 double B_gamma(double gamma, double za, double zb, double yu, double ybar, double sigma) {
1380  double t1, t2;
1381 
1382  t1 = -(M(gamma, zb, ybar, sigma) - M(gamma, za, ybar, sigma));
1383  t2 = -pow(yu, gamma) * (M(0, zb, ybar, sigma) - M(0, za, ybar, sigma));
1384 
1385  return t1 - t2;
1386 }
1387 
1408 double capbetween(double za, double zb, double zl, double zu, double yl, double yu_ppp, double ybar, double sigma, double pi, double luxmult) {
1409  double retval;
1410  double gamma = 1;
1411 
1412  if (zb <= za) {
1413  return NAN;
1414  } else if (zb < zl) {
1415  return 0;
1416  } else if (za < zl) {
1417  if (zb < zu) {
1418  retval = A_gamma(gamma, zl, zb, yl, yu_ppp, ybar, sigma);
1419  } else {
1420  retval = A_gamma(gamma, zl, zu, yl, yu_ppp, ybar, sigma) +
1421  a_gamma(gamma, yu_ppp, yl, yu_ppp) * (pnorm(zb) - pnorm(zu)) +
1422  luxmult * B_gamma(gamma, zu, zb, yu_ppp, ybar, sigma);
1423  }
1424  } else if (za < zu) {
1425  if (zb < zu) {
1426  retval = A_gamma(gamma, za, zb, yl, yu_ppp, ybar, sigma);
1427  } else {
1428  retval = A_gamma(gamma, za, zu, yl, yu_ppp, ybar, sigma) +
1429  a_gamma(gamma, yu_ppp, yl, yu_ppp) * (pnorm(zb) - pnorm(zu)) +
1430  luxmult * B_gamma(gamma, zu, zb, yu_ppp, ybar, sigma);
1431  }
1432  } else {
1433  retval = luxmult * B_gamma(gamma, za, zb, yu_ppp, ybar, sigma) +
1434  a_gamma(gamma, yu_ppp, yl, yu_ppp) * (pnorm(zb) - pnorm(za));
1435  }
1436 
1437  return pi * retval;
1438 }
1439 
1459 double respbetween(double gamma, double za, double zb, double zl, double zu, double yl, double yu_ppp, double ybar, double sigma, double A) {
1460  double retval;
1461 
1462  if (zb <= za) {
1463  return NAN;
1464  } else if (zb < zl) {
1465  return 0;
1466  } else if (za < zl) {
1467  if (zb < zu) {
1468  retval = A_gamma(gamma, zl, zb, yl, yu_ppp, ybar, sigma);
1469  } else {
1470  retval = A_gamma(gamma, zl, zu, yl, yu_ppp, ybar, sigma) +
1471  a_gamma(gamma, yu_ppp, yl, yu_ppp) * (pnorm(zb) - pnorm(zu)) +
1472  B_gamma(gamma, zu, zb, yu_ppp, ybar, sigma);
1473  }
1474  } else if (za < zu) {
1475  if (zb < zu) {
1476  retval = A_gamma(gamma, za, zb, yl, yu_ppp, ybar, sigma);
1477  } else {
1478  retval = A_gamma(gamma, za, zu, yl, yu_ppp, ybar, sigma) +
1479  a_gamma(gamma, yu_ppp, yl, yu_ppp) * (pnorm(zb) - pnorm(zu)) +
1480  B_gamma(gamma, zu, zb, yu_ppp, ybar, sigma);
1481  }
1482  } else {
1483  retval = B_gamma(gamma, za, zb, yu_ppp, ybar, sigma) +
1484  a_gamma(gamma, yu_ppp, yl, yu_ppp) * (pnorm(zb) - pnorm(za));
1485  }
1486 
1487  return A * retval;
1488 }
1489 
1503 double rhat(double E, double gamma, double sigma, double ybar) {
1504  return E * exp(-0.5 * gamma * (gamma-1) * sigma * sigma)/pow(ybar, gamma);
1505 }
1506 
1519 double c_indiv(double y, double yl, double yu, int do_interp) {
1520  if (y < yl) {
1521  return 0;
1522  } else if (do_interp) {
1523  if (y < yu) {
1524  return a_gamma(1, y, yl, yu);
1525  } else {
1526  return a_gamma(1, yu, yl, yu) + b_gamma(1, y, yu);
1527  }
1528  } else {
1529  return y - yl;
1530  }
1531 }
1532 
1546 double r_indiv(double gamma, double y, double yl, double yu, double A, int do_interp) {
1547  double retval;
1548 
1549  if (y < yl) {
1550  retval = 0;
1551  } else if (do_interp) {
1552  if (y < yu) {
1553  retval = a_gamma(gamma, y, yl, yu);
1554  } else {
1555  retval = a_gamma(gamma, yu, yl, yu) + b_gamma(gamma, y, yu);
1556  }
1557  } else {
1558  retval = pow(y,gamma) - pow(yl,gamma);
1559  }
1560 
1561  return A * retval;
1562 }
1563 
1572 double luxcap(int year, struct gdrs_struct *gdrs) {
1573  double sigma, gamma, zu, zushift, yu, ybar, E;
1574  double Ebau, Egap, Eep, Eabove, Fderiv;
1575  double f1, f2, f3, f4, f5, frozen_tot;
1576  int niter, i, recalc;
1577  // Sequencing
1578  int period;
1579  struct fixedfactor filter;
1580 
1581  // Assume line is not recalculated unless told otherwise
1582  recalc = 0;
1583 
1584  // The defined line & corresponding zu
1585  yu = gdrs->dt_high;
1586 
1587  gamma = gdrs->emisselast;
1588  // Emergency pathway
1589  Eep = gettsval(gdrs->emergpath, year, gdrs->ad);
1590 
1591  // Create a filter -- either A1, if sequencing and in the right period, or all 1s
1592  allocff(&filter, gdrs->ad);
1593 
1594  if (year < gdrs->emergstart) {
1595  period = PER_BEFORE_EP;
1596  } else {
1597  if (gdrs->usesequence && year <= gdrs->sequenceyear) {
1598  period = PER_SEQUENCE;
1599  } else {
1600  period = PER_GDRS;
1601  }
1602  }
1603 
1604  // Before emergency start date, the gap is (supposed to be) equal to zero, and
1605  // no work is done
1606  if (period != PER_BEFORE_EP) {
1607  Ebau = 0;
1608  Eabove = 0;
1609  frozen_tot = 0;
1610  for (i = 0; i < gdrs->ad.numrecs; i++) {
1611  // Set filter
1612  if (period == PER_SEQUENCE) {
1613  filter.data[i] = gdrs->annex1.data[i];;
1614  } else {
1615  filter.data[i] = 1;
1616  }
1617  // Calculate emissions above user-defined luxury threshold & global BAU emissions
1618  E = getval(gdrs->baseline, i, year, gdrs->ad);
1619  // Subtract off any "frozen" emissions from sequencing
1620  Ebau += E - gdrs->frozen.data[i];
1621  zu = getval(gdrs->zu, i, year, gdrs->ad);
1622  // Initialize the adjusted zu to the default value
1623  setval(gdrs->zu_adj, zu, i, year, gdrs->ad);
1624  // Add to Eabove only if the country is participating in GDRs
1625  if (filter.data[i]) {
1626  sigma = getval(gdrs->sdlog, i, year, gdrs->ad);
1627  ybar = getval(gdrs->ybar_ppp, i, year, gdrs->ad);
1628  // The luxury threshold is in MER
1629  ybar /= getval(gdrs->ppp2mer, i, year, gdrs->ad);
1630  // Only one factor, here, but have f1-f5 defined, so use f1
1631  f1 = pow(yu/ybar, gamma) * exp(-0.5 * gamma * (gamma - 1) * sigma * sigma);
1632  Eabove += E * (1 - pnorm(zu - gamma * sigma) - f1 * (1 - pnorm(zu)));
1633  }
1634  frozen_tot += gdrs->frozen.data[i];
1635  }
1636 
1637  // Calculate the gap that must be closed between BAU & EP
1638  Egap = Ebau + frozen_tot < Eep ? 0 : Ebau + frozen_tot - Eep;
1639  // If the luxury capping doesn't close the gap, then more work to do: return default
1640 
1641  if (Eabove > Egap) {
1642  recalc = 1;
1643  // Iterate to convergence, adjusting yu
1644  for (niter = 0; niter < MAXITER; niter++) {
1645  Eabove = 0;
1646  Fderiv = 0;
1647  for (i = 0; i < gdrs->ad.numrecs; i++) {
1648  // Only summing over those countries that are participating in GDRs
1649  if (!filter.data[i]) continue;
1650  // Store values from tables into local variables for convenience
1651  ybar = getval(gdrs->ybar_ppp, i, year, gdrs->ad);
1652  // The luxury threshold is in MER
1653  ybar /= getval(gdrs->ppp2mer, i, year, gdrs->ad);
1654  sigma = getval(gdrs->sdlog, i, year, gdrs->ad);
1655  // Have to recalculate zu for the altered yu
1656  zu = (1/sigma) * log(yu/ybar) + 0.5 * sigma;
1657  E = getval(gdrs->baseline, i, year, gdrs->ad) - gdrs->frozen.data[i];
1658 
1659  f1 = pow(yu/ybar, gamma) * exp(-0.5 * gamma * (gamma - 1) * sigma * sigma);
1660  zushift = zu - gamma * sigma;
1661  Eabove += E * (1 - pnorm(zushift) - f1 * (1 - pnorm(zu)));
1662  f2 = E/(sigma * yu);
1663  f3 = dnorm(zushift);
1664  f4 = gamma * sigma * (1 - pnorm(zu));
1665  f5 = dnorm(zu);
1666  Fderiv += f2 * (f3 + f1 * (f4 - f5));
1667  }
1668  if (fabs(Egap - Eabove) < EPS_NEWTON) {
1669  break;
1670  }
1671  // Note that Egap - Ebove = (Ebau - Eep) - (Ebau - Elcbaseline) = Elcbaseline - Eep
1672  // This is the same as the function f(yu) in the technical documentation
1673  yu = yu - (Egap - Eabove)/Fderiv;
1674  }
1675 
1676  if (niter == MAXITER) {
1677  yu = NAN;
1678  }
1679  }
1680  }
1681 
1682  // Assign adjusted zu's for this year, recalculating if yu has changed
1683  for (i = 0; i < gdrs->ad.numrecs; i++) {
1684  if (yu == NAN) {
1685  zu = NAN;
1686  } else {
1687  if (recalc) {
1688  ybar = getval(gdrs->ybar_ppp, i, year, gdrs->ad);
1689  // The luxury threshold is in MER
1690  ybar /= getval(gdrs->ppp2mer, i, year, gdrs->ad);
1691  sigma = getval(gdrs->sdlog, i, year, gdrs->ad);
1692  // Have to recalculate zu for the altered yu
1693  zu = (1/sigma) * log(yu/ybar) + 0.5 * sigma;
1694  } else {
1695  zu = getval(gdrs->zu, i, year, gdrs->ad);
1696  }
1697  }
1698  setval(gdrs->zu_adj, zu, i, year, gdrs->ad);
1699  }
1700 
1701  settsval(gdrs->yu_adj, yu, year, gdrs->ad);
1702 
1703  clearff(filter);
1704 
1705  return yu;
1706 }
1707 
1714 void calcybar(struct gdrs_struct *gdrs) {
1715  int i, year;
1716  double a[3], y;
1717 
1718  a[0] = gdrs->ppp2mer.y_start;
1719  a[1] = gdrs->gdp.y_start;
1720  a[2] = gdrs->scalpop.y_start;
1721  gdrs->ybar_ppp.y_start = a[0];
1722  for (i = 1; i < 3; i++) {
1723  if (a[i] > gdrs->ybar_ppp.y_start) gdrs->ybar_ppp.y_start = a[i];
1724  }
1725  a[0] = gdrs->ppp2mer.y_end;
1726  a[1] = gdrs->gdp.y_end;
1727  a[2] = gdrs->scalpop.y_end;
1728  gdrs->ybar_ppp.y_end = a[0];
1729  for (i = 1; i < 3; i++) {
1730  if (a[i] < gdrs->ybar_ppp.y_end) gdrs->ybar_ppp.y_end = a[i];
1731  }
1732 
1733  allocdata(&gdrs->ybar_ppp, gdrs->ad);
1734 
1735  for (i = 0; i < gdrs->ad.numrecs; i++) {
1736  for (year = gdrs->ybar_ppp.y_start; year <= gdrs->ybar_ppp.y_end; year++) {
1737  y = getval(gdrs->ppp2mer, i, year, gdrs->ad) * getval(gdrs->gdp, i, year, gdrs->ad);
1738  y /= getval(gdrs->scalpop, i, year, gdrs->ad);
1739  setval(gdrs->ybar_ppp, y, i, year, gdrs->ad);
1740  }
1741  }
1742 }
1743 
1754 struct datablock z(double y, struct gdrs_struct *gdrs, int ppp_or_mer) {
1755  int i, year;
1756  double ybar, sigma, z;
1757  struct datablock result;
1758  int do_calc = 1;
1759 
1760  if (y == 0) {
1761  z = -INFINITY;
1762  do_calc = 0;
1763  }
1764  if (isinf(y) == 1) {
1765  z = INFINITY;
1766  do_calc = 0;
1767  }
1768 
1769  // Use most constraining bounds
1770  result.y_start = gdrs->ybar_ppp.y_start;
1771  if (gdrs->sdlog.y_start > result.y_start) result.y_start = gdrs->sdlog.y_start;
1772  result.y_end = gdrs->ybar_ppp.y_end;
1773  if (gdrs->sdlog.y_end < result.y_end) result.y_end = gdrs->sdlog.y_end;
1774  allocdata(&result, gdrs->ad);
1775 
1776  for (i = 0; i < gdrs->ad.numrecs; i++) {
1777  for (year = result.y_start; year <= result.y_end; year++) {
1778  if (do_calc) {
1779  ybar = getval(gdrs->ybar_ppp, i, year, gdrs->ad);
1780  if (ppp_or_mer == XR_MER) {
1781  ybar /= getval(gdrs->ppp2mer, i, year, gdrs->ad);
1782  }
1783  sigma = getval(gdrs->sdlog, i, year, gdrs->ad);
1784  z = (1/sigma) * log(y/ybar) + 0.5 * sigma;
1785  }
1786  setval(result, z, i, year, gdrs->ad);
1787  }
1788  }
1789  return result;
1790 }
1791 
1800 int dump2sql3(const char *fname, struct gdrs_struct gdrs) {
1801  int sql3ret, i, j, k, year, numvals;
1802  char valbuff[GDRS_SQLITE_HALFBUFSIZE], sqlbuff[GDRS_SQLITE_BUFSIZE], *errmsg;
1803  sqlite3 *db;
1804  sqlite3_stmt *stmt;
1805  double alloc, tmp;
1806 
1807  if ((sql3ret = sqlite3_open(fname, &db))) {
1808  if (db == NULL) {
1809  return GDRS_NOMEM;
1810  } else {
1811  sqlite3_close(db);
1812  return GDRS_SQLITE_OFFSET + sql3ret;
1813  }
1814  }
1815 
1816  sqlite3_exec(db, "PRAGMA journal_mode = MEMORY", NULL, NULL, &errmsg);
1817 
1818  if ((sql3ret = sqlite3_exec(db, "DROP TABLE IF EXISTS gdrs;", NULL, NULL, &errmsg))) {
1819  fprintf(stderr, "Error: %s\n", errmsg);
1820  sqlite3_free(errmsg);
1821  sqlite3_close(db);
1822  return GDRS_SQLITE_OFFSET + sql3ret;
1823  }
1824 
1825  strcpy(sqlbuff, "CREATE TABLE gdrs (");
1826  strcat(sqlbuff, "iso3 TEXT NOT NULL");
1827  strcat(sqlbuff, ", year INT NOT NULL");
1828  strcat(sqlbuff, ", allocation_MtC REAL");
1829  strcat(sqlbuff, ", a1_dom_rdxn_MtC REAL");
1830  strcat(sqlbuff, ", r_MtC REAL");
1831  strcat(sqlbuff, ", c_blnUSDMER REAL");
1832  strcat(sqlbuff, ", rci REAL");
1833  strcat(sqlbuff, ", pop_above_dl REAL");
1834  strcat(sqlbuff, ", pop_above_lux REAL");
1835  strcat(sqlbuff, ", lux_emiss_MtC REAL");
1836  strcat(sqlbuff, ", lux_emiss_applied_MtC REAL");
1837  strcat(sqlbuff, ", kyoto_gap_MtC REAL");
1838  for (i = 0; i < gdrs.num_tax_levels; i++) {
1839  // Can't count on a POSIX environment, so don't use positional notation (eg., %1$d) in format
1840  sprintf(valbuff, ", tax_pop_below_%d REAL, tax_income_mer_dens_%d REAL, tax_income_ppp_dens_%d REAL, tax_revenue_mer_dens_%d REAL, tax_revenue_ppp_dens_%d REAL, tax_pop_dens_%d REAL",
1841  gdrs.tax_levels[i].seq_no, gdrs.tax_levels[i].seq_no, gdrs.tax_levels[i].seq_no, gdrs.tax_levels[i].seq_no, gdrs.tax_levels[i].seq_no, gdrs.tax_levels[i].seq_no);
1842  strcat(sqlbuff, valbuff);
1843  }
1844  strcat(sqlbuff, ");");
1845 
1846  if ((sql3ret = sqlite3_exec(db, sqlbuff, NULL, NULL, &errmsg))) {
1847  fprintf(stderr, "Error: %s\n", errmsg);
1848  sqlite3_free(errmsg);
1849  sqlite3_close(db);
1850  return GDRS_SQLITE_OFFSET + sql3ret;
1851  }
1852 
1853 
1855  sprintf(sqlbuff, "INSERT INTO gdrs VALUES(");
1856  for (i = 0; i < numvals; i++) {
1857  if (!i) {
1858  strcat(sqlbuff, "?");
1859  } else {
1860  strcat(sqlbuff, ",?");
1861  }
1862  }
1863  strcat(sqlbuff, ")");
1864  sqlite3_prepare_v2(db, sqlbuff, GDRS_SQLITE_BUFSIZE, &stmt, 0);
1865 
1866  sqlite3_exec(db, "BEGIN;", NULL, NULL, &errmsg);
1867  sqlite3_free(errmsg);
1868  for (i = 0; i < gdrs.ad.numrecs; i++) {
1869  for (year = gdrs.rci.y_start; year <= gdrs.rci.y_end; year++) {
1870  // If correcting for embodied emissions, get that correction to shift baseline back
1871  alloc = getval(gdrs.alloc_gdrs, i, year, gdrs.ad);
1872  if (gdrs.use_netexports) {
1873  alloc += 1.0e-3 * (3.0/11.0) * getval(gdrs.bl_netexports, i, year, gdrs.ad);
1874  }
1875  sqlite3_bind_text(stmt, 1, gdrs.iso3[i], -1, SQLITE_TRANSIENT);
1876  sqlite3_bind_int(stmt, 2, year);
1877  sqlite3_bind_double(stmt, 3, alloc);
1878  sqlite3_bind_double(stmt, 4, getval(gdrs.a1domrdxn, i, year, gdrs.ad));
1879  sqlite3_bind_double(stmt, 5, getval(gdrs.r, i, year, gdrs.ad));
1880  sqlite3_bind_double(stmt, 6, getval(gdrs.c, i, year, gdrs.ad));
1881  sqlite3_bind_double(stmt, 7, getval(gdrs.rci, i, year, gdrs.ad));
1882  sqlite3_bind_double(stmt, 8, 1e9 * getval(gdrs.pop_above_dl, i, year, gdrs.ad));
1883  sqlite3_bind_double(stmt, 9, 1e9 * getval(gdrs.pop_above_lux, i, year, gdrs.ad));
1884  sqlite3_bind_double(stmt, 10, getval(gdrs.lux_emiss, i, year, gdrs.ad));
1885  sqlite3_bind_double(stmt, 11, getval(gdrs.lux_emiss_applied, i, year, gdrs.ad));
1886  sqlite3_bind_double(stmt, 12, getval(gdrs.kab_gap, i, year, gdrs.ad));
1887  for (j = 0; j < gdrs.num_tax_levels; j++) {
1889  sqlite3_bind_double(stmt, 1 + k, 1e9 * getval(gdrs.tax_pop_below[j], i, year, gdrs.ad));
1890  sqlite3_bind_double(stmt, 2 + k, getval(gdrs.tax_income_mer_dens[j], i, year, gdrs.ad));
1891  sqlite3_bind_double(stmt, 3 + k, getval(gdrs.tax_income_ppp_dens[j], i, year, gdrs.ad));
1892  sqlite3_bind_double(stmt, 4 + k, getval(gdrs.tax_revenue_mer_dens[j], i, year, gdrs.ad));
1893  sqlite3_bind_double(stmt, 5 + k, getval(gdrs.tax_revenue_ppp_dens[j], i, year, gdrs.ad));
1894  sqlite3_bind_double(stmt, 6 + k, getval(gdrs.tax_pop_dens[j], i, year, gdrs.ad));
1895  }
1896  if (sqlite3_step(stmt) != SQLITE_DONE) {
1897  fprintf(stderr, "Error: %s\n\tSQL: %s\n", errmsg, sqlbuff);
1898  sqlite3_free(errmsg);
1899  sqlite3_close(db);
1900  return GDRS_SQLITE_OFFSET + sql3ret;
1901  }
1902  sqlite3_reset(stmt);
1903  }
1904  }
1905  sqlite3_exec(db, "END;", NULL, NULL, &errmsg);
1906  sqlite3_free(errmsg);
1907 
1908  if ((sql3ret = sqlite3_exec(db, "CREATE UNIQUE INDEX idx_gdrs ON gdrs(iso3 ASC, year ASC);", NULL, NULL, &errmsg))) {
1909  fprintf(stderr, "Error: %s\n", errmsg);
1910  sqlite3_free(errmsg);
1911  sqlite3_close(db);
1912  return GDRS_SQLITE_OFFSET + sql3ret;
1913  }
1914 
1915  // Add the scheme
1916  if ((sql3ret = sqlite3_exec(db,
1917  "INSERT OR IGNORE INTO schemes VALUES (\"Greenhouse Development Rights\", \"gdrs\");",
1918  NULL, NULL, &errmsg))) {
1919  fprintf(stderr, "Error: %s\n", errmsg);
1920  sqlite3_free(errmsg);
1921  sqlite3_close(db);
1922  return GDRS_SQLITE_OFFSET + sql3ret;
1923  }
1924 
1925  sqlite3_close(db);
1926 
1927  return GDRS_OK;
1928 }
For the application, basic dimensions: number of countries and bounding years.
Definition: datastruct.h:48
#define MAXITER
Definition: blockmath.h:20
float emisselast
Emissions elasticity.
Definition: gdrs.h:105
int loadgdrs(struct gdrs_struct *gdrs, const char *fname)
Function to translate from SQLite3 database to internal data structures.
Definition: gdrs.c:54
int a1refyear
The year compared to which A1 reduces emissions (e.g., 1990 or 2005)
Definition: gdrs.h:109
int emergstart
Start year of "emergency progam".
Definition: gdrs.h:97
#define sqlite3_step
Definition: sqlite3ext.h:313
#define TAX_TYPE_GLOBAL_QUINTILE
Definition: gdrs.h:67
double c_indiv(double y, double yl, double yu, int do_interp)
Calculate individual per capita capacity at a specified income level.
Definition: gdrs.c:1519
int use_lulucf
Flag whether to include land-use change emissions.
Definition: gdrs.h:117
#define PER_BEFORE_EP
Definition: gdrs.h:55
int y_start
The start year.
Definition: datastruct.h:60
double B_gamma(double gamma, double za, double zb, double yu, double ybar, double sigma)
Calculate the function.
Definition: gdrs.c:1379
int dump2sql3(const char *fname, struct gdrs_struct gdrs)
After the calculation, write all results to the SQLite3 database.
Definition: gdrs.c:1800
struct datablock zu
Luxury threshold converted to "z" variable .
Definition: gdrs.h:148
struct datablock binop(struct datablock a, struct datablock b, char op, struct appdata ad)
Carry out a binary operation (+, -, *, /) on two datablock structures.
Definition: blockmath.c:69
#define GDRS_NOMEM
Definition: gdrs.h:34
double qnorm(double p)
The inverse cumulative standardized normal distribution.
Definition: blockmath.c:167
int maxyear
Final year for the dataset.
Definition: datastruct.h:51
#define sqlite3_open
Definition: sqlite3ext.h:287
#define GDRS_SQLITE_OFFSET
Definition: gdrs.h:44
int cumsince
Calculate responsibility from this year.
Definition: gdrs.h:96
float a1_shape_param
If sequencing, exponent on tfrac^a1_shape_param that affects how rapidly A1 countries approach target...
Definition: gdrs.h:111
#define GDRS_TOO_MANY_TAX_ENTRIES
Definition: gdrs.h:36
struct datablock pop
Population in people.
Definition: gdrs.h:130
#define GDRS_NUM_PARAMS
Definition: gdrs.h:48
struct datablock lux_emiss_applied
Luxury emissions actually used in adjusted baseline (calculated)
Definition: gdrs.h:143
struct datablock gdp
GDP in MER.
Definition: gdrs.h:129
struct timeseries emergpath
The emergency pathway in GtC.
Definition: gdrs.h:137
#define GAP_COMBINE_MIN
Definition: gdrs.h:72
double r_indiv(double gamma, double y, double yl, double yu, double A, int do_interp)
Calculate individual per capita annual responsibility at a specified income level.
Definition: gdrs.c:1546
#define sqlite3_errmsg
Definition: sqlite3ext.h:266
float lux_thresh_mult
Tax multiplier for incomes above luxury threshold.
Definition: gdrs.h:102
A one-dimensional array that contains information on countries that is the same for all years...
Definition: datastruct.h:84
double value
Definition: gdrs.h:83
char ** iso3
The ISO 3-letter code for the country.
Definition: gdrs.h:94
struct datablock r
Responsibility (calculated)
Definition: gdrs.h:138
void combine_gap(struct fixedfactor *gap, int i, double newgap, int combine)
Calculate and store luxury emissions.
Definition: gdrs.c:782
#define GDRS_SQLITE_BUFSIZE
Definition: gdrs.h:46
int numrecs
Number of records (i.e., number of countries)
Definition: datastruct.h:49
This is the main struct that contains data from the sqlite3 database and calculated values...
Definition: gdrs.h:92
struct datablock ppp2mer
Ratio of GDP in PPP to GDP in MER.
Definition: gdrs.h:132
#define SQLITE_ROW
Definition: sqlite3.c:902
int y_end
The end year.
Definition: datastruct.h:95
int use_nonco2
Flag whether to include non-CO2 gases.
Definition: gdrs.h:119
#define TAX_MAX_ENTRIES
Definition: gdrs.h:64
int is_ppp
Definition: gdrs.h:81
float respweight
Responsibility weight.
Definition: gdrs.h:99
#define SQLITE_DONE
Definition: sqlite3.c:903
int readtable(sqlite3 *db, const char *column, struct datablock *table, struct appdata ad)
Helper function to read a column from the "core" table into a datablock.
Definition: gdrs.c:576
void cleargdrs(struct gdrs_struct gdrs)
Clear out the GDRs data structure.
Definition: gdrs.c:621
double nationalquintile(double q, double ybar, double sigma)
Calculate the income at a given quintile for a country.
Definition: gdrs.c:769
struct datablock tax_revenue_ppp_dens[TAX_MAX_ENTRIES]
Table to hold contribution to tax in different countries & years for the different tax levels (multip...
Definition: gdrs.h:158
#define GDRS_SQLITE_HALFBUFSIZE
Definition: gdrs.h:47
#define sqlite3_exec
Definition: sqlite3ext.h:268
int y_end
The end year.
Definition: datastruct.h:61
int sequenceyear
End of the first committment period with sequencing: only A1 up to here.
Definition: gdrs.h:107
#define ANNEX1
Definition: gdrs.h:58
#define EPS_NEWTON
Definition: gdrs.h:51
double getffval(struct fixedfactor ff, int row, struct appdata ad)
Get a value for a specified row (country) from a fixedfactor.
Definition: datastruct.c:507
#define sqlite3_finalize
Definition: sqlite3ext.h:272
#define sqlite3_column_int
Definition: sqlite3ext.h:240
void clearts(struct timeseries ts)
Free the memory taken up by a timeseries.
Definition: datastruct.c:323
float dt_high
Luxury threshold – in MER.
Definition: gdrs.h:101
#define sqlite3_column_text
Definition: sqlite3ext.h:248
#define GDRS_FREADERROR
Definition: gdrs.h:32
struct fixedfactor kyoto_startep_frac
For Annex I countries, Kyoto committments at the start of the emergency program as a fraction of BaU...
Definition: gdrs.h:153
struct fixedfactor kyoto_ratified
A filter equal to 1.0 if ratified and 0.0 if not.
Definition: gdrs.h:154
int num_tax_levels
Number of entries in the tax level table in the database.
Definition: gdrs.h:155
double b_gamma(double gamma, double y, double b)
Calculate the function.
Definition: gdrs.c:1325
#define sqlite3_reset
Definition: sqlite3ext.h:296
struct datablock ybar_ppp
Mean income in PPP.
Definition: gdrs.h:133
struct datablock scalmult(double scalar, struct datablock dbin, struct appdata ad)
Multiply a datablock by a scaling factor.
Definition: blockmath.c:103
void nextrci(int year, struct gdrs_struct *gdrs)
Calculate the GDRs Responsibility-Capacity Indicator for a particular year.
Definition: gdrs.c:1107
double rhat(double E, double gamma, double sigma, double ybar)
Calculate the factor for a country.
Definition: gdrs.c:1503
struct sqlite3_stmt sqlite3_stmt
Definition: sqlite3.c:2777
double capbetween(double za, double zb, double zl, double zu, double yl, double yu_ppp, double ybar, double sigma, double pi, double luxmult)
Calculate capacity per capita between two income limits.
Definition: gdrs.c:1408
int minyear
Earliest year for the dataset.
Definition: datastruct.h:50
double gettsval(struct timeseries ts, int year, struct appdata ad)
Get the value for a particular year from a timeseries.
Definition: datastruct.c:474
float billpercgwp
Bill as percent of GWP.
Definition: gdrs.h:98
void setffval(struct fixedfactor ff, double val, int row, struct appdata ad)
Set a value for a specified row (country) for a fixedfactor.
Definition: datastruct.c:524
struct fixedfactor annex2
Filter for Annex 2 countries.
Definition: gdrs.h:114
double luxcap(int year, struct gdrs_struct *gdrs)
If calculating luxury-capped baselines adjust the luxury threshold if needed to stay above emergency ...
Definition: gdrs.c:1572
int allocdata(struct datablock *dblock, struct appdata ad)
Create a datablock in memory, using application-specific dimensions.
Definition: datastruct.c:223
void calcallocs(struct gdrs_struct *gdrs)
Calculate allocations for all years.
Definition: gdrs.c:947
#define sqlite3_bind_double
Definition: sqlite3ext.h:215
struct datablock pop_above_lux
Population above luxury threshold (calculated)
Definition: gdrs.h:146
struct datablock tax_income_mer_dens[TAX_MAX_ENTRIES]
Table to hold tax income in MER terms (multiplied by pop & prob density–summable over countries) ...
Definition: gdrs.h:159
void settsval(struct timeseries ts, double val, int year, struct appdata ad)
Set the value for a particular year in a timeseries.
Definition: datastruct.c:491
double gini2sdlog(double gini)
The standard deviation of the log of income corresponding to a given Gini, assuming lognormal...
Definition: blockmath.c:235
struct fixedfactor rci_lagged
Averaged RCI for mitigation smoothing.
Definition: gdrs.h:141
struct datablock bl_nonco2
Baseline non-CO2 gases.
Definition: gdrs.h:120
double ztransf(double y, double ybar, double sigma)
The transformed value .
Definition: blockmath.c:213
void cleardata(struct datablock dblock)
Free the memory taken up by a datablock.
Definition: datastruct.c:305
int do_luxcap
Flag whether to use luxury-capped baselines.
Definition: gdrs.h:123
struct datablock tax_income_ppp_dens[TAX_MAX_ENTRIES]
Table to hold tax income in PPP terms (multiplied by pop & prob density–summable over countries) ...
Definition: gdrs.h:160
int thisyear
Store the current year.
Definition: gdrs.h:95
struct datablock zl
Development threshold converted to "z" variable .
Definition: gdrs.h:147
struct datablock zu_adj
Adjusted luxury threshold as "z" variable .
Definition: gdrs.h:150
struct datablock scalpop
Scaled population, in billions (calculated as 1.0e-9 * population)
Definition: gdrs.h:131
double getval(struct datablock db, int row, int year, struct appdata ad)
Get the data value from the datablock for specified row & year.
Definition: datastruct.c:432
struct datablock kab_gap
Gap between Kyoto-adjusted baseline and standard baseline.
Definition: gdrs.h:151
double globalquintile(double q, int year, struct gdrs_struct *gdrs, int ppp_or_mer)
Calculate the income at a given quintile for the world as a whole.
Definition: gdrs.c:739
void clearff(struct fixedfactor ff)
Free the memory taken up by a fixedfactor.
Definition: datastruct.c:314
struct datablock gini
Gini coefficient.
Definition: gdrs.h:134
#define INIT_Y
Definition: gdrs.h:53
#define sqlite3_close
Definition: sqlite3ext.h:228
void calc_kab(struct fixedfactor *gap, double *totgap, int year, int period, int combine, struct gdrs_struct *gdrs)
Calculate and store "Kyoto gap" for Kyoto-adjusted baselines.
Definition: gdrs.c:812
int allocff(struct fixedfactor *ff, struct appdata ad)
Create a fixedfactor in memory, of length = number of countries.
Definition: datastruct.c:254
#define sqlite3_column_type
Definition: sqlite3ext.h:250
double * data
The array, length = ad.numrecs when created.
Definition: datastruct.h:85
struct datablock bl_lulucf
Baseline land use, land-use change, and forestry.
Definition: gdrs.h:118
struct datablock baseline
Baseline emissions, the sum of all selected baseline components.
Definition: gdrs.h:126
#define sqlite3_column_double
Definition: sqlite3ext.h:239
double dnorm(double x)
The standard normal probability density.
Definition: blockmath.c:201
struct fixedfactor frozen
Emissions that are "frozen" following the first sequencing period.
Definition: gdrs.h:115
double A_gamma(double gamma, double za, double zb, double yl, double yu, double ybar, double sigma)
Calculate the function.
Definition: gdrs.c:1347
struct datablock alloc_gdrs
Emissions allocation (calculated)
Definition: gdrs.h:144
int use_kab
Flag whether to use Kyoto-adjusted baselines (KABs)
Definition: gdrs.h:124
void handle_sql3error(sqlite3 *db, sqlite3_stmt *stmt)
Function that wraps repetitive code for SQLite3 errors.
Definition: gdrs.c:38
struct datablock lux_emiss
Emissions over the luxury threshold (calculated)
Definition: gdrs.h:142
#define sqlite3_free
Definition: sqlite3ext.h:273
struct tax_entry tax_levels[TAX_MAX_ENTRIES]
Table of tax levels with associated information.
Definition: gdrs.h:156
int allocts(struct timeseries *ts, struct appdata ad)
Create a timeseries in memory, of length = y_start - y_end + 1.
Definition: datastruct.c:278
struct datablock z(double y, struct gdrs_struct *gdrs, int ppp_or_mer)
Calculate the "z" transformed version of an income level for all countries and years.
Definition: gdrs.c:1754
#define sqlite3_prepare_v2
Definition: sqlite3ext.h:337
#define GAP_COMBINE_NONE
Definition: gdrs.h:69
#define PER_GDRS
Definition: gdrs.h:57
double M(double a, double zc, double ybar, double sigma)
Calculate a function that is repeatedly used in calculations.
Definition: gdrs.c:1270
struct datablock tax_pop_below[TAX_MAX_ENTRIES]
Table to hold population below the tax line.
Definition: gdrs.h:162
struct datablock bl_fossil
Baseline fossil emissions.
Definition: gdrs.h:116
double a_gamma(double gamma, double y, double a, double b)
Calculate the function.
Definition: gdrs.c:1299
int usesequence
Boolean: true if Annex 1 countries act first (sequencing)
Definition: gdrs.h:106
struct datablock a1domrdxn
Annex 1 domestic reductions (if sequencing)
Definition: gdrs.h:128
struct datablock pop_above_dl
Population above development threshold (calculated)
Definition: gdrs.h:145
#define EPSILON
Definition: blockmath.h:22
double * data
The data, length = y_start - y_end + 1 when created.
Definition: datastruct.h:96
double respbetween(double gamma, double za, double zb, double zl, double zu, double yl, double yu_ppp, double ybar, double sigma, double A)
Calculate responsibility between two income limits.
Definition: gdrs.c:1459
#define GAP_COMBINE_MAX
Definition: gdrs.h:71
struct datablock volrdxn
Voluntary reductions.
Definition: gdrs.h:127
double pnorm(double x)
The cumulative standardized normal distribution.
Definition: blockmath.c:128
float dt_low
Development threshold – in PPP.
Definition: gdrs.h:100
#define SQLITE_TRANSIENT
Definition: sqlite3.c:4005
#define sqlite3_bind_int
Definition: sqlite3ext.h:216
struct appdata ad
Basic information about dimensions: number of countries, start year, end year.
Definition: gdrs.h:93
#define GDRS_NUM_TAX_PARAMS
Definition: gdrs.h:49
int assign_mitgap_to
If sequencing: either 1 (Annex 1) or 2 (Annex 2) for who bears responsibility for mitigation gap...
Definition: gdrs.h:112
struct datablock tax_revenue_mer_dens[TAX_MAX_ENTRIES]
Table to hold contribution to tax in different countries & years for the different tax levels (multip...
Definition: gdrs.h:157
#define TAX_TYPE_VALUE
Definition: gdrs.h:65
#define XR_PPP
Definition: gdrs.h:61
#define XR_MER
Definition: gdrs.h:62
#define PER_SEQUENCE
Definition: gdrs.h:56
struct datablock c
Capacity (calculated)
Definition: gdrs.h:139
void calc_luxemiss(struct fixedfactor *gap, double *totgap, int year, int period, int combine, struct gdrs_struct *gdrs)
Calculate and store luxury emissions.
Definition: gdrs.c:892
int interp_between_thresholds
If true, interpolate capacity and responsibility between thresholds.
Definition: gdrs.h:103
struct fixedfactor annex1
Filter for Annex 1 countries.
Definition: gdrs.h:113
int seq_no
Definition: gdrs.h:80
#define GAP_COMBINE_ADD
Definition: gdrs.h:70
int y_start
The start year.
Definition: datastruct.h:94
#define sqlite3_bind_text
Definition: sqlite3ext.h:222
float a1_perc_rdxn
If sequencing, % below ref year that A1 must reduce it&#39;s emissions by sequence year.
Definition: gdrs.h:108
A two-dimensional array that contains information for country/year combinations.
Definition: datastruct.h:59
struct timeseries filter(struct datablock data, struct fixedfactor filter, struct appdata ad)
Aggregate data in a datablock using a fixedfactor "filter" to produce a timeseries.
Definition: blockmath.c:250
struct datablock sdlog
Standard deviation of log income, estimated from Gini assuming lognormal distribution.
Definition: gdrs.h:135
struct timeseries yu_adj
Adjusted luxury threshold to ensure that adjusted baseline is not below emergency pathway...
Definition: gdrs.h:149
#define SQLITE_NULL
Definition: sqlite3.c:3460
void setval(struct datablock db, double val, int row, int year, struct appdata ad)
Set a specific value in a datablock, specified by row and year.
Definition: datastruct.c:454
struct datablock rci
Responsibility-Capacity Indicator (calculated)
Definition: gdrs.h:140
int type
Definition: gdrs.h:82
double quintile
Definition: gdrs.h:84
struct datablock transform(struct datablock dbin, double(*f)(double), struct appdata ad)
Apply a function to a datablock.
Definition: blockmath.c:38
struct datablock bl_netexports
Baseline net exports, for embodied carbon.
Definition: gdrs.h:122
struct fixedfactor kyoto_startep_frac_1990
For Annex I countries, Kyoto committments at the start of the emergency program as a fraction of 1990...
Definition: gdrs.h:152
#define GDRS_OK
Definition: gdrs.h:29
double globaldist(double y, int year, struct gdrs_struct *gdrs, int ppp_or_mer, double *dist_deriv)
Calculate the fraction of global population below a specified income level in the given year...
Definition: gdrs.c:687
struct datablock tax_pop_dens[TAX_MAX_ENTRIES]
Table to hold pop & prob dens at different tax levels.
Definition: gdrs.h:161
#define TAX_TYPE_NATL_QUINTILE
Definition: gdrs.h:66
int emerg_path_id
Integer ID indicating which emergency path to use.
Definition: gdrs.h:136
void calcybar(struct gdrs_struct *gdrs)
Calculate mean income from GDP and population.
Definition: gdrs.c:1714
int use_netexports
Flag whether to include emissions embodied in traded goods.
Definition: gdrs.h:121
int use_lag
Apply a (varying) time lag between mitigation investment and realized reductions. ...
Definition: gdrs.h:110
int kab_only_ratified
Flag whether to only include countries that ratified the Kyoto agreement.
Definition: gdrs.h:125