#!/usr/bin/perl
# linear interpolation:
# takes five inputs, and produces one output. The five inputs are:
# $x is the main input, which is expected to be between $x1 and $x2
# $x1 is the lower bound of the input range
# $y1 is the return value if $x = $x1
# $x2 is the upper bound of the input range
# $y2 is the return value if $x = $x2
sub interpolate {
local($x,$x1,$y1,$x2,$y2) = @_;
local($xrange) = $x2 - $x1;
local($yrange) = $y2 - $y1;
local($result) = (($x - $x1) / $xrange) * $yrange + $y1;
return $result;
}
# estimate CO2 removal rate in ppmv/yr as a function of CO2 level in ppmv
sub removal_rate {
local($co2level) = shift;
local($removalrate) = 0;
local($co2elevation) = $co2level - 280;
local($ratio) = 47.73;
if ($co2level <= 280) {
$removalrate = 0;
} elsif ($co2level < 319.19) {
$removalrate = $co2elevation / 50.90;
} elsif ($co2level <= 329.220) {
$removalrate = &interpolate( $co2level, 319.19, 0.770, 329.20, 1.236 );
} elsif ($co2level <= 343.485) {
$removalrate = &interpolate( $co2level, 329.20, 1.236, 343.485, 1.617 );
} elsif ($co2level <= 359.135) {
$removalrate = &interpolate( $co2level, 343.485, 1.617, 359.135, 1.513 );
} elsif ($co2level <= 376.150) {
$removalrate = &interpolate( $co2level, 359.135, 1.513, 376.150, 1.890 );
} elsif ($co2level <= 397.000) {
$removalrate = &interpolate( $co2level, 376.150, 1.890, 397.000, 2.280 );
} else { # > 397
$removalrate = $co2elevation / 51.32;
}
return $removalrate;
}
# DEBUG PRINT
# for ($i=270; $i<=500; $i++) {
# $removalrate = &removal_rate($i);
# printf("$i %2.4f\n", $removalrate);
# }
# SIMULATE DECLINE IN CO2 LEVEL IF EMISSIONS SUDDENLY WENT TO ZERO
$co2level = 410;
$year = 2019;
while ($co2level > 300) {
printf("$year %5.1f\n", $co2level);
$year += 1;
$removalrate = &removal_rate( $co2level );
$co2level -= $removalrate;
}