https://sealevel.info/CO2_Residence_Times/calc_est_co2_removal_rates_v01.pl

#!/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;
}