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