Source code for ezclimate.bau
import numpy as np
from abc import ABCMeta, abstractmethod
[docs]class BusinessAsUsual(object):
"""Abstract BAU class for the EZ-Climate model.
Parameters
----------
ghg_start : float
today's GHG-level
ghg_end : float
GHG-level in the last period
Attributes
----------
ghg_start : float
today's GHG-level
ghg_end : float
GHG-level in the last period
emission_by_decisions : ndarray
emissions at decision time periods??
emission_per_period : ndarray
total emission at decision time period??
emission_to_ghg : ndarray
GHG levels in decision time period??
emission_to_bau : float
constant for converting GHG to emission??
"""
__metaclass__ = ABCMeta
def __init__(self, ghg_start, ghg_end):
self.ghg_start = ghg_start
self.ghg_end = ghg_end
self.emission_by_decisions = None
self.emission_per_period = None
self.emission_to_ghg = None
self.emission_to_bau = None
self.bau_path = None
@abstractmethod
[docs] def emission_by_time(self):
pass
[docs]class DLWBusinessAsUsual(BusinessAsUsual):
"""Business-as-usual scenario of emissions. Emissions growth is assumed to slow down
exogenously - these assumptions represent an attempt to model emissions growth in a
business-as-usual scenario that is in the absence of incentives.
Parameters
----------
ghg_start : float
today's GHG-level
ghg_end : float
GHG-level in the last period
emit_time : ndarray or list
time, in years, from now when emissions occurs
emit_level : ndarray or list
emission levels in future times `emit_time`
Attributes
----------
ghg_start : float
today's GHG-level
ghg_end : float
GHG-level in the last period
emission_by_decisions : ndarray
emissions at decision time periods??
emission_per_period : ndarray
total emission at decision time period??
emission_to_ghg : ndarray
GHG levels in decision time period??
emission_to_bau : float
constant for converting GHG to emission??
emit_time : ndarray or list
time, in years, from now when emissions occurs
emit_level : ndarray or list
emission levels in future times `emit_time`
"""
def __init__(self, ghg_start=400.0, ghg_end=1000.0, emit_time=[0, 30, 60], emit_level=[52.0, 70.0, 81.4]):
super(DLWBusinessAsUsual, self).__init__(ghg_start, ghg_end)
self.emit_time = emit_time
self.emit_level = emit_level
[docs] def emission_by_time(self, time):
"""Returns the BAU emissions at any time
Parameters
----------
time : int
future time period in years
Returns
-------
float
emission
"""
if time < self.emit_time[1]:
emissions = self.emit_level[0] + float(time) / (self.emit_time[1] - self.emit_time[0]) \
* (self.emit_level[1] - self.emit_level[0])
elif time < self.emit_time[2]:
emissions = self.emit_level[1] + float(time - self.emit_time[1]) / (self.emit_time[2]
- self.emit_time[1]) * (self.emit_level[2] - self.emit_level[1])
else:
emissions = self.emit_level[2]
return emissions
[docs] def bau_emissions_setup(self, tree):
"""Create default business as usual emissions path. The emission rate in each period is
assumed to be the average of the emissions at the beginning and at the end of the period.
Parameters
----------
tree : `TreeModel` object
provides the tree structure used
"""
num_periods = tree.num_periods
self.emission_by_decisions = np.zeros(num_periods)
self.emission_per_period = np.zeros(num_periods)
self.bau_path = np.zeros(num_periods)
self.bau_path[0] = self.ghg_start
self.emission_by_decisions[0] = self.emission_by_time(tree.decision_times[0])
period_len = tree.decision_times[1:] - tree.decision_times[:-1]
for n in range(1, num_periods):
self.emission_by_decisions[n] = self.emission_by_time(tree.decision_times[n])
self.emission_per_period[n] = period_len[n] * (self.emission_by_decisions[n-1:n].mean())
#the total increase in ghg level of 600 (from 400 to 1000) in the bau path is allocated over time
self.emission_to_ghg = (self.ghg_end - self.ghg_start) * self.emission_per_period / self.emission_per_period.sum()
self.emission_to_bau = self.emission_to_ghg[-1] / self.emission_per_period[-1]
for n in range(1, num_periods):
self.bau_path[n] = self.bau_path[n-1] + self.emission_per_period[n]*self.emission_to_bau