diff --git a/Documentation/KC_ghg_tutorial.py b/Documentation/KC_ghg_tutorial.py
new file mode 100755
index 000000000..a17201189
--- /dev/null
+++ b/Documentation/KC_ghg_tutorial.py
@@ -0,0 +1,454 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+
+# This document is meant to help teach how to use the Drawdown Solutions Python Model
+# and to demonstrate the use of the FaIR model.
+
+# Creator: Kristina Colbert
+# Last Updated: May 26, 2021
+
+# Table of Contents:
+ # Set up your Python Environment
+ # Basic Usage of the Drawdown Model
+ # Accessing the Results of a Scenario Run
+ # Using the Methane Module
+ # Multigas Emissions Reductions
+ # FaIR Tutorial
+ # Using the FaIR Model within Drawdown
+
+
+
+
+###########----############----############----############----############
+# SET UP YOUR PYTHON ENVIRONMENT
+
+# 1. Download the Drawdown Python Code from Github:
+ # https://github.com/ProjectDrawdown/solutions
+ git clone https://github.com/ProjectDrawdown/solutions.git
+
+# This only downloads it to your computer, you'll need to tell Python that it's a
+# module that will be called. There are two options:
+ # a.) Everytime you open python, you will need to input on the console:
+ import sys
+ #sys.path.append('/Users/kristinacolbert/Box/Kristina Colbert/Python/solutions')
+ sys.path.append('/Users/kristinacolbert/Box/Kristina Colbert/GHG_Accounting/Python/Models/PD_Model/edited_copy/solutions')
+ # b.) Alternatively, you can make it permanent within the .bash_profile by
+ # finding your .bash_profile (for me it's located in /Users/kristinacolbert/).
+ # Make sure bash is the prescribed shell. For a Mac you can change this by:
+ chsh -s /bin/bash
+ # Once you have located your .bash_profile, open it, and add to the end:
+ export PYTHONPATH="/Users/kristinacolbert/Box/Kristina Colbert/Python/solutions"
+ # c.) If you are using Spyder as an IDE, you can go up to the menu bar and select python. Scroll down to
+ PYTHONPATH manager. From there you can let it know where the solutions module path is located.
+
+# 2. Install the FaIR Simple Climate Model within Python:
+ # https://github.com/OMS-NetZero/FAIR
+ pip install fair
+
+# Now you have the two most important modules installed. There may be a few more you need
+# and they are listed in the requirements.txt file within the solutions directory.
+
+# 3. Install required modules:
+ cd solutions
+ pip install -r requirements.txt
+"""
+
+
+
+
+##########----############----############----############----############
+# BASIC USAGE OF THE DRAWDOWN MODEL
+
+
+# First thing to do is import the solutions module, and more specifically
+# the script called "factory" which will be the "workhorse" of the python code
+import solution.factory
+
+# Running the following code will save all the included solutions to a dictionary
+# for an easy lookup.
+solutions = solution.factory.all_solutions_scenarios()
+
+# If you look at the saved variable "solutions", you'll find a list of solution nicknames
+# and each of the possible Project Drawdown Scenarios (PDS) associated with the solution
+
+# A full list can be overwhelming, so to focus on just one let's save Improved Rice
+solution1 = solution.factory.one_solution_scenarios("improvedrice")
+
+# For demonstration purposes, we are interested in running the one PDS scenario called
+# "PDS-86p2050-Plausible-Custom PDS-Avg" under the Improved Rice solution.
+# This is how we will run the single scenario:
+rice = solutions["improvedrice"][0](scenario="PDS-86p2050-Plausible-Custom PDS-Avg")
+
+# It should be super quick. So what's happening behind the scenes?
+# Well, the line of code is calling on a specific script. The script is hidden at:
+# /solutions/solution/improvedrice/__init__.py
+# About halfway down the "__init__.py" is a line that says "class Scenario:"
+# Below that line is all of the subscripts that are being run to produce our results!
+# If you're interested in checking out each subscript you can go into the
+# /solutions/model/ directory to check each one out.
+
+
+
+
+##########----############----############----############----############
+# ACCESSING THE RESULTS OF A SCENARIO RUN
+
+# How about we check out a few cool results after running our scenario?
+# If you are on Spyder, which I recommend you use for your Python IDE software,
+# You can double-click on the last saved variable "rice" in the Variable explorer tab
+# When the object window opens, there will be a lot of drop down options like
+# "ac", "ad", "ae", "c2", etc.. Each of these is one of those drop down options
+# stores the results of the subscripts we were calling in the "__init__.py"
+
+# Not every nickname is descriptive so here is a list of a few important ones:
+ # ac: Advanced Controls
+ # ad: Adoption Data
+ # ae: Agro-Ecological Zoning Allocation of the Land
+ # c2: CO2 Emissions Calculations & FaIR Climate Modeling
+ # c4: CH4 Emissions Calculations
+ # ef: Emissions Factors for converting to CO2eq
+ # fc: First Costs
+ # ht: Helper Tables
+ # n2o: N2O Emissions Calculations
+ # name: Naming Convention of the Solution
+ # oc: Operating Cost
+ # pds_ca: Custom Adoption Data for the Project Drawdown Scenario
+ # ref_ca: Custom Adoption Data for the Reference Scenario
+ # scenario: Naming Convention of the Scenario
+ # solution_category: LAND
+ # tla_per_region: Total Land Area for each Drawdown Region
+ # ua: Unit Adoption (a mix of functions to calculate annual adoption)
+ # units: Units for first cost, functional unit, implementation unit, operating cost
+ # vmas: Variable Meta Analysis Datasets
+
+# The way to call on these is in the naming convention:
+# solutionname.subscriptname.variablename
+
+# Let's explore and practice calling the results, here's one for the operating cost per implementation unit
+rice.ac.soln_fixed_oper_cost_per_iunit
+# Output: 384.34648706769167
+
+# Sequestration rate
+rice.ac.seq_rate_global
+# Output: 1.45484
+
+# PDS functional units adopted
+rice.ua.soln_pds_funits_adopted
+# Output is a dataframe of size (47,10) for each region and year
+
+# Methane (land) emissions avoided in tons-CH4 per year
+rice.c4.avoided_direct_emissions_ch4_land()
+# Note you need to place the () at the end to make the object callable
+
+# Total CO2eq emission redution in units of MMT
+rice_mmt = rice.c2.co2_mmt_reduced()
+
+#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
+
+# For fun let's try making a figure of the CO2eq results
+# Import the plotting module called matplotlib
+import matplotlib.pyplot as plt
+
+# Setup the figure axes and labels
+x = list(range(2014,2061))
+fig, (ax1) = plt.subplots(nrows=1, ncols=1, figsize=(8, 4))
+ax1.plot(x,rice_mmt['World'], c = "b", label="Drawdown")
+ax1.set_ylabel('CO2eq Emission Reductions (MMT)')
+
+
+
+
+##########----############----############----############----############
+# USING THE METHANE MODULE
+
+# Let's load another solution and scenario that is important for
+# reducting methane emissions; Landfill Methane
+landfill = solutions["landfillmethane"][0](scenario="PDS-0p2050-Drawdown2020")
+
+# The methane module/subscript is located at:
+# /solutions/model/ch4calcs.py
+
+# In this subscript, there are a couple important inputs coming from other subscripts.
+# Those inputs include the advanced controls and functional units adopted, and if
+# previously calculated, the co2-eq emissions saved.
+ # ac
+ # soln_net_annual_funits_adopted
+ # soln_pds_direct_ch4_co2_emissions_saved
+
+# Take a look at these inputs if you're curious about what they look like:
+landfill.ua.soln_net_annual_funits_adopted() # Net Annual Adopted Units
+landfill.ua.soln_pds_direct_ch4_co2_emissions_saved() # CO2eq methane avoided
+landfill.ac.ch4_co2_per_funit # CO2eq methane emitted per functional unit
+
+#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
+
+# Callable results for the methane module, without relying on CO2eq:
+
+# 1.) CH4 reduced by the RRS (not in CO2eq)
+landfill.c4.ch4_tons_reduced()
+
+# 2.) CH4 avoided by the LAND (not in CO2eq), let's use the improved rice solution
+rice.c4.avoided_direct_emissions_ch4_land()
+
+# 3.) Annual CH4 avoided or reduced by Land or RRS model (converted into Megatons CH4)
+# ** A very useful result. **
+landfill.c4.ch4_megatons_avoided_or_reduced()
+
+# 4.) A simple way to calculate the CH4 concentration (in ppb) avoided or reduced
+# We don't recommend this calculation method, it is a simplistic concentration calculation
+# Using the FaIR model is more accurate
+landfill.c4.ch4_ppb_calculator_avoided_or_reduced()
+
+#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
+
+# Callable results for the methane module, using CO2eq:
+
+# 1.) CO2eq methane reduced (for the RRS model)
+# The prior code seems to multiply out the dataset in zeros, no explanation why.
+# We don't recommend using this calculation method.
+landfill.c4.ch4_co2eq_tons_reduced()
+
+# 2.) CO2eq methane avoided (for the LAND model), let's use the improved rice solution
+rice.c4.avoided_direct_emissions_ch4_co2eq_land()
+
+# 3.) A technically incorrect way to calculate methane concentration based on CO2eq emissions
+# We don't recommend this calculation method, but it is saved due to prior coding expertise
+# It is also hard-coded into the CO2 Calculations module
+landfill.c4.ch4_ppb_calculator()
+
+#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
+
+# For fun let's try making a figure of the CH4 reduction results:
+y = landfill.c4.ch4_megatons_avoided_or_reduced()
+x = list(range(2014,2061))
+fig, (ax1) = plt.subplots(nrows=1, ncols=1, figsize=(8, 4))
+ax1.plot(x,y['World'], c = "b", label="Drawdown")
+ax1.set_ylabel('CH4 Emission Reductions (Mt-CH4)')
+
+
+
+
+##########----############----############----############----############
+# MULTIGAS EMISSIONS REDUCTIONS
+
+emisreduction_annual = landfill.c2.ghg_emissions_reductions_global_annual()
+emisreduction_cummulative = landfill.c2.ghg_emissions_reductions_global_cummulative()
+
+
+
+
+
+
+
+
+##########----############----############----############----############
+# FaIR TUTORIAL
+
+# FaIR (Finite-amplitude Impulse Response) Model is a simple climate-carbon cycle
+# model written in the python coding language. FaIR takes emissions of greenhouse
+# gases, aerosol and ozone precursors, and converts these into atmospheric
+# concentrations, radiative forcing and temperature change.
+
+# First make sure you had installed the FaIR module from the github repository
+# pip install fair
+
+# Next load the module
+import fair
+
+# Let's also load the "numpy" module for some basic scientific computing tools
+# We will nickname this module "np" for shorthand (this is pretty common practice)
+import numpy as np
+
+# The "workhorse" of the FaIR python code is the "forward.py"
+# Let's take a very specific function, "fair_scm" built into forward.py and load it
+from fair.forward import fair_scm
+
+# Let's also import the Representative Concentration Pathway (RCP) Emissions and load it
+# And give it a shorthand name, "emissions"
+from fair.RCPs import rcp85
+emissions = rcp85.Emissions.emissions
+
+# If you take a look into our new object, emissions, its a big array of 736 rows and 40 columns!
+# The first column is year from 1765 to 2500.
+# The subsequent columns are emissions of greenhouse gases and other forcing agents.
+# Just to focus on a few in "emissions":
+ # Column 0: Year
+ # Column 1: Fossil CO2 (Gt-C)
+ # Column 2: Other CO2 (Gt-C)
+ # Column 3: CH4 (Mt-CH4)
+ # Column 4: N2O (Mt-N2O)
+
+# Now the magic happens in one single line! We input the emissions data into the "fair_scm"
+# function that we loaded just before.
+C,F,T = fair_scm(emissions=emissions)
+
+# The outputs are a tuple of (C, F, T) arrays
+ # C: Concentrations (nt, 31) in multigas mode
+ # Column 0: CO2
+ # Column 1: CH4
+ # Column 2: N2O
+ # For other columns see: https://github.com/OMS-NetZero/FAIR
+ # F: Radiative forcing (nt, 13) in Watts per meter squared
+ # T: Temperature change anomaly (nt,) in Celsius
+
+# "Behind the curtain" of the fair_scm function a lot of calculations are occuring. Emissions
+# are being converted over to increased concentrations. And then concentrations are depleted on
+# and annual timestep as "sinks" uptake and reduce atmospheric constituents. On each timestep, the
+# radiative forcing or "efficiency at absorbing heat" is being calculated for each ghg or species.
+# Once the radiative forcing is calculated for the 39 species, they are aggreagated as a total
+# radiative forcing. The last step calculates the global atmospheric temperature from the total
+# forcing.
+
+# A few cool features are built into the FaIR model. For one, the carbon cycle is temperature
+# sensitive. As more CO2 stays in the atmosphere, it causes global temperatures to rise. But the
+# higher temperatures weaken the carbon sinks of the ocean and land. It becomes harder for the ocean
+# and vegetation on the land to absorb/sequester CO2. The FaIR model captures this "positive" feedback
+
+# A second cool feature is the FaIR model is tuned to replicate historic observations of concentrations
+# and global temperature.
+
+# And third, it prescribes natural emissions of methane and nitrous oxide. Although, the natural emissions
+# timeseries are slightly unusual and unrealistic as they calculated them back from the balance of
+# concentration observations and prescribed historical anthropogenic emissions. This is worth noting as the
+# developers are aware of the flawed assumptions.
+
+#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
+# Okay so let's have fun and make a plot of the FaIR outputs (C,F,T).
+
+# Setup the plotting area
+from matplotlib import pyplot as plt
+import pandas as pd
+plt.style.use('seaborn-darkgrid')
+plt.rcParams['figure.figsize'] = (16, 9)
+
+# Setup an arrry
+rcpemissions = pd.DataFrame(emissions, index = range(1765,2501),
+ columns=['Year','FossilCO2 (Gt-C)', 'OtherCO2 (Gt-C)', 'CH4 (Mt-CH4)',
+ 'N2O (Mt-N2O)', 'SOx (Mt-S)', 'CO (Mt-CO)', 'NMVOC (Mt)',
+ 'NOx (Mt-N)', 'BC (Mt)', 'OC (Mt)', 'NH3 (Mt-N)', 'CF4 (kt)',
+ 'C2F6 (kt)', 'C6F14 (kt)', 'HFC23 (kt)', 'HFC32 (kt)',
+ 'HFC43_10 (kt)', 'HFC125 (kt)', 'HFC134a (kt)', 'HFC143a (kt)',
+ 'HFC227ea (kt)', 'HFC245fa (kt)', 'SF6 (kt)', 'CFC_11 (kt)',
+ 'CFC_12 (kt)', 'CFC_113 (kt)','CFC_114 (kt)','CFC_115 (kt)',
+ 'CARB_TET (kt)', 'MCF (kt)', 'HCFC_22 (kt)', 'HCFC_141B (kt)',
+ 'HCFC_142B (kt)', 'HALON1211 (kt)', 'HALON1202 (kt)',
+ 'HALON1301 (kt)', 'HALON2404 (kt)', 'CH3BR (kt)', 'CH3CL (kt)'])
+rcpemissions.index.name="Year"
+result1 = pd.DataFrame({'CO2(ppm)': C[:,0,], 'CH4(ppb)': C[:,1,], 'N2O(ppb)': C[:,2,]}, index=rcp85.Emissions.year)
+result1.index.name="Year"
+result2 = pd.DataFrame({'CO2(Wm-2)': F[:,0,], 'CH4(Wm-2)': F[:,1,], 'N2O(Wm-2)': F[:,2,], 'others(Wm-2)': np.sum(F, axis=1)-F[:,0,]-F[:,1,]-F[:,2,], 'total(Wm-2)': np.sum(F, axis=1)}, index=rcp85.Emissions.year)
+result2.index.name="Year"
+result3 = pd.DataFrame({'TempAnomaly(C)': T}, index=rcp85.Emissions.year)
+result3.index.name="Year"
+
+# Make the four panel figure of emissions and concentrations
+fig = plt.figure()
+ax1 = fig.add_subplot(221)
+ax1.plot(rcpemissions.index, rcpemissions.iloc[:,3], color='black')
+ax1.set_ylabel('CH$_4$ Emissions (Mt-CH$_4$)')
+ax2 = fig.add_subplot(222)
+ax2.plot(rcpemissions.index, rcpemissions.iloc[:,1], color='blue')
+ax2.set_ylabel('CO$_2$ Emissions (Gt-C)')
+ax3 = fig.add_subplot(223)
+ax3.plot(result2.index, result2.iloc[:,1], color='orange')
+ax3.set_ylabel('CH$_4$ concentrations (ppb)')
+ax4 = fig.add_subplot(224)
+ax4.plot(result2.index, result2.iloc[:,0], color='red')
+ax4.set_ylabel('CO$_2$ concentrations (ppm)')
+
+
+
+
+##########----############----############----############----############
+# USING THE FaIR MODEL WITHIN DRAWDOWN
+
+
+
+
+
+
+
+
+
+# Test out the new functionality of the co2calcs.py
+landfill.c2.FaIR_CFT_baseline_co2eq()
+C3=landfill.c2.FaIR_CFT_baseline_RCP3()[0]
+F3=landfill.c2.FaIR_CFT_baseline_RCP3()[1]
+T3=landfill.c2.FaIR_CFT_baseline_RCP3()[2]
+E3=landfill.c2.FaIR_CFT_baseline_RCP3()[3]
+
+C45=landfill.c2.FaIR_CFT_baseline_RCP45()[0]
+F45=landfill.c2.FaIR_CFT_baseline_RCP45()[1]
+T45=landfill.c2.FaIR_CFT_baseline_RCP45()[2]
+E45=landfill.c2.FaIR_CFT_baseline_RCP45()[3]
+
+C6=landfill.c2.FaIR_CFT_baseline_RCP6()[0]
+F6=landfill.c2.FaIR_CFT_baseline_RCP6()[1]
+T6=landfill.c2.FaIR_CFT_baseline_RCP6()[2]
+E6=landfill.c2.FaIR_CFT_baseline_RCP6()[3]
+
+C85=landfill.c2.FaIR_CFT_baseline_RCP85()[0]
+F85=landfill.c2.FaIR_CFT_baseline_RCP85()[1]
+T85=landfill.c2.FaIR_CFT_baseline_RCP85()[2]
+E85=landfill.c2.FaIR_CFT_baseline_RCP85()[3]
+
+# Plot the default RCPs in the FaIR model
+# The Drawdown code will run the default FaIR model
+plt.style.use('seaborn-darkgrid')
+plt.rcParams['figure.figsize'] = (16, 9)
+plt.rcParams['figure.constrained_layout.use'] = True
+fig, (ax1, ax2, ax3) = plt.subplots(nrows=1, ncols=3, figsize=(8, 4))
+
+ax1.plot(C3.index,C3['CO2(ppm)'], c = "green", label="RCP3PD")
+ax1.plot(C45.index,C45['CO2(ppm)'], c = "blue", label="RCP4.5")
+ax1.plot(C6.index,C6['CO2(ppm)'], c = "red", label="RCP6.0")
+ax1.plot(C85.index,C85['CO2(ppm)'], c = "black", label="RCP8.5")
+ax1.set_ylabel('CO2 Concentration (ppm)')
+ax1.set_xlim([1800, 2100])
+ax1.set_ylim([250, 1000])
+ax1.legend(loc='upper left');
+
+ax2.plot(C3.index,C3['CH4(ppb)'], c = "green", label="RCP3PD")
+ax2.plot(C45.index,C45['CH4(ppb)'], c = "blue", label="RCP4.5")
+ax2.plot(C6.index,C6['CH4(ppb)'], c = "red", label="RCP6.0")
+ax2.plot(C85.index,C85['CH4(ppb)'], c = "black", label="RCP8.5")
+ax2.set_ylabel('CH4 Concentration (ppb)')
+ax2.set_xlim([1800, 2100])
+ax2.set_ylim([700, 4000])
+
+ax3.plot(T3.index,T3['TempAnomaly(C)'], c = "green", label="RCP3PD")
+ax3.plot(T45.index,T45['TempAnomaly(C)'], c = "blue", label="RCP4.5")
+ax3.plot(T6.index,T6['TempAnomaly(C)'], c = "red", label="RCP6.5")
+ax3.plot(T85.index,T85['TempAnomaly(C)'], c = "black", label="RCP8.5")
+ax3.set_ylabel('Temperature Anomaly (C)')
+ax3.set_xlim([1800, 2100])
+ax3.set_ylim([-2, 6])
+
+C3d=landfill.c2.FaIR_CFT_Drawdown_RCP3()[0]
+F3d=landfill.c2.FaIR_CFT_Drawdown_RCP3()[1]
+T3d=landfill.c2.FaIR_CFT_Drawdown_RCP3()[2]
+E3d=landfill.c2.FaIR_CFT_Drawdown_RCP3()[3]
+
+C45d=landfill.c2.FaIR_CFT_Drawdown_RCP45()[0]
+F45d=landfill.c2.FaIR_CFT_Drawdown_RCP45()[1]
+T45d=landfill.c2.FaIR_CFT_Drawdown_RCP45()[2]
+E45d=landfill.c2.FaIR_CFT_Drawdown_RCP45()[3]
+
+C6d=landfill.c2.FaIR_CFT_Drawdown_RCP6()[0]
+F6d=landfill.c2.FaIR_CFT_Drawdown_RCP6()[1]
+T6d=landfill.c2.FaIR_CFT_Drawdown_RCP6()[2]
+E6d=landfill.c2.FaIR_CFT_Drawdown_RCP6()[3]
+
+C85d=landfill.c2.FaIR_CFT_Drawdown_RCP85()[0]
+F85d=landfill.c2.FaIR_CFT_Drawdown_RCP85()[1]
+T85d=landfill.c2.FaIR_CFT_Drawdown_RCP85()[2]
+E85d=landfill.c2.FaIR_CFT_Drawdown_RCP85()[3]
+
+
+
+
+
+
+
+
diff --git a/Start_Here.ipynb b/Start_Here.ipynb
index 3cb9d200c..dbf78e31c 100644
--- a/Start_Here.ipynb
+++ b/Start_Here.ipynb
@@ -2,38 +2,45 @@
"cells": [
{
"cell_type": "markdown",
+ "id": "11e7be6b",
+ "metadata": {},
"source": [
- "Welcome to the Drawdown Solutions library!\r\n",
- "\r\n",
- "This jupyter notebook is a stub. It needs to be expanded to include additional useful samples.\r\n",
- "\r\n",
+ "Welcome to the Drawdown Solutions library!\n",
+ "\n",
+ "This jupyter notebook is a stub. It needs to be expanded to include additional useful samples.\n",
+ "\n",
"(A helpful tutorial for jupyter notebooks is [here](https://nbviewer.jupyter.org/github/jupyter/notebook/blob/master/docs/source/examples/Notebook/Notebook%20Basics.ipynb)---or [here](https://youtu.be/3C9E2yPBw7s?t=131) if you'd prefer a video introduction.)"
- ],
- "metadata": {}
+ ]
},
{
"cell_type": "markdown",
+ "id": "d96fa055",
+ "metadata": {},
"source": [
"# Working with Solutions/Scenarios"
- ],
- "metadata": {}
+ ]
},
{
"cell_type": "code",
"execution_count": 1,
- "source": [
- "# Import modules we'll use later\r\n",
- "\r\n",
- "from solution import factory\r\n",
- "import pandas as pd\r\n",
- "import matplotlib"
- ],
+ "id": "70785e50",
+ "metadata": {},
"outputs": [],
- "metadata": {}
+ "source": [
+ "# Import modules we'll use later\n",
+ "\n",
+ "from solution import factory\n",
+ "import pandas as pd\n",
+ "from matplotlib import pyplot as plt\n",
+ "plt.style.use('seaborn-darkgrid')"
+ ]
},
{
"cell_type": "code",
"execution_count": 2,
+ "id": "d2252191",
+ "metadata": {},
+ "outputs": [],
"source": [
"# The factory module has several ways of constructing solutions and scenarios.\r\n",
"# The simplest is to get the most recent PDS scenario of a particular type for a particular solution\r\n",
@@ -46,69 +53,51 @@
{
"cell_type": "code",
"execution_count": 3,
+ "id": "09f4ac17",
+ "metadata": {},
+ "outputs": [],
"source": [
- "# All the work of calculating carbon impact, capital cost and operating cost for the scenario \r\n",
- "# was done by that constructure. Here, for example, is the carbon impact. (In this case, we\r\n",
- "# only have global data, and only modeled out to 2050)\r\n",
- "\r\n",
- "bi_co2e = bikeinfra_pds2.c2.co2eq_mmt_reduced()\r\n",
- "bi_co2e"
- ],
+ "# Running a scenario should be super quick. So what's happening behind the scenes? \n",
+ "# Well, the line of code is calling on a specific script. The script is hidden at:\n",
+ "# /solutions/solution/bikeinfrastructure/__init__.py \n",
+ "# About halfway down the \"__init__.py\" is all of the subscripts that are being run to produce our results!\n",
+ "\n",
+ "# If you're interested in checking out each subscript you can go into the \n",
+ "# /solutions/model/ directory to check each one out.\n",
+ "\n",
+ "# Not every subscript nickname is descriptive so here is a list of a few important ones:\n",
+ " # ac: Advanced Controls\n",
+ " # ad: Adoption Data\n",
+ " # ae: Agro-Ecological Zoning Allocation of the Land\n",
+ " # c2: CO2 Emissions Calculations & FaIR Climate Modeling\n",
+ " # c4: CH4 Emissions Calculations\n",
+ " # ef: Emissions Factors for converting to CO2eq\n",
+ " # fc: First Costs\n",
+ " # ht: Helper Tables\n",
+ " # n2o: N2O Emissions Calculations\n",
+ " # name: Naming Convention of the Solution\n",
+ " # oc: Operating Cost\n",
+ " # pds_ca: Custom Adoption Data for the Project Drawdown Scenario\n",
+ " # ref_ca: Custom Adoption Data for the Reference Scenario\n",
+ " # scenario: Naming Convention of the Scenario\n",
+ " # solution_category: LAND\n",
+ " # tla_per_region: Total Land Area for each Drawdown Region\n",
+ " # ua: Unit Adoption (a mix of functions to calculate annual adoption)\n",
+ " # units: Units for first cost, functional unit, implementation unit, operating cost\n",
+ " # vmas: Variable Meta Analysis Datasets\n",
+ " \n",
+ "# The way to call on these is in the naming convention:\n",
+ "# solutionname.subscriptname.variablename\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "523f5cdd",
+ "metadata": {},
"outputs": [
{
- "output_type": "execute_result",
"data": {
- "text/plain": [
- " World OECD90 Eastern Europe Asia (Sans Japan) Middle East and Africa Latin America China India EU USA\n",
- "Year \n",
- "2014 0.000000 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2015 0.000000 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2016 0.000000 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2017 0.000000 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2018 0.000000 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2019 0.000000 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2020 78.521223 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2021 89.731723 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2022 100.641071 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2023 111.255350 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2024 121.580472 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2025 131.624606 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2026 151.200284 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2027 157.831089 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2028 164.590307 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2029 171.460410 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2030 179.145789 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2031 185.463192 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2032 192.560849 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2033 199.699347 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2034 206.861193 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2035 212.905981 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2036 221.184782 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2037 228.311607 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2038 235.391842 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2039 242.407851 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2040 250.928085 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2041 256.178047 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2042 262.897327 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2043 269.482775 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2044 275.916966 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2045 281.215273 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2046 288.261917 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2047 294.137871 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2048 299.792955 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2049 305.217274 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2050 310.606903 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2051 0.000000 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2052 0.000000 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2053 0.000000 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2054 0.000000 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2055 0.000000 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2056 0.000000 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2057 0.000000 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2058 0.000000 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2059 0.000000 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
- "2060 0.000000 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0"
- ],
"text/html": [
"
\n",
"\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
Year
\n",
+ "
FossilCO2 (Gt-C)
\n",
+ "
OtherCO2 (Gt-C)
\n",
+ "
CH4 (Mt-CH4)
\n",
+ "
N2O (Mt-N2O)
\n",
+ "
SOx (Mt-S)
\n",
+ "
CO (Mt-CO)
\n",
+ "
NMVOC (Mt)
\n",
+ "
NOx (Mt-N)
\n",
+ "
BC (Mt)
\n",
+ "
...
\n",
+ "
MCF (kt)
\n",
+ "
HCFC_22 (kt)
\n",
+ "
HCFC_141B (kt)
\n",
+ "
HCFC_142B (kt)
\n",
+ "
HALON1211 (kt)
\n",
+ "
HALON1202 (kt)
\n",
+ "
HALON1301 (kt)
\n",
+ "
HALON2404 (kt)
\n",
+ "
CH3BR (kt)
\n",
+ "
CH3CL (kt)
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
1765
\n",
+ "
1765.0
\n",
+ "
0.00300
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
0.000000
\n",
+ "
...
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.000
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.000
\n",
+ "
0.0
\n",
+ "
157.267
\n",
+ "
3100.211
\n",
+ "
\n",
+ "
\n",
+ "
1766
\n",
+ "
1766.0
\n",
+ "
0.00300
\n",
+ "
0.005338
\n",
+ "
1.963262
\n",
+ "
0.005191
\n",
+ "
0.098883
\n",
+ "
9.050221
\n",
+ "
1.596875
\n",
+ "
0.109502
\n",
+ "
0.106998
\n",
+ "
...
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.000
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.000
\n",
+ "
0.0
\n",
+ "
157.267
\n",
+ "
3100.211
\n",
+ "
\n",
+ "
\n",
+ "
1767
\n",
+ "
1767.0
\n",
+ "
0.00300
\n",
+ "
0.010677
\n",
+ "
2.436448
\n",
+ "
0.010117
\n",
+ "
0.116306
\n",
+ "
12.960844
\n",
+ "
2.292316
\n",
+ "
0.168038
\n",
+ "
0.133383
\n",
+ "
...
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.000
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.000
\n",
+ "
0.0
\n",
+ "
157.267
\n",
+ "
3100.211
\n",
+ "
\n",
+ "
\n",
+ "
1768
\n",
+ "
1768.0
\n",
+ "
0.00300
\n",
+ "
0.016015
\n",
+ "
2.911105
\n",
+ "
0.015043
\n",
+ "
0.133811
\n",
+ "
16.876539
\n",
+ "
2.988648
\n",
+ "
0.226625
\n",
+ "
0.159847
\n",
+ "
...
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.000
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.000
\n",
+ "
0.0
\n",
+ "
157.267
\n",
+ "
3100.211
\n",
+ "
\n",
+ "
\n",
+ "
1769
\n",
+ "
1769.0
\n",
+ "
0.00300
\n",
+ "
0.021353
\n",
+ "
3.387278
\n",
+ "
0.019969
\n",
+ "
0.151398
\n",
+ "
20.797465
\n",
+ "
3.685897
\n",
+ "
0.285264
\n",
+ "
0.186393
\n",
+ "
...
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.000
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.000
\n",
+ "
0.0
\n",
+ "
157.267
\n",
+ "
3100.211
\n",
+ "
\n",
+ "
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
\n",
+ "
\n",
+ "
2496
\n",
+ "
2496.0
\n",
+ "
1.49520
\n",
+ "
0.000000
\n",
+ "
922.990320
\n",
+ "
13.344000
\n",
+ "
12.856400
\n",
+ "
690.283200
\n",
+ "
176.239600
\n",
+ "
26.241600
\n",
+ "
4.249600
\n",
+ "
...
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.002
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.008
\n",
+ "
0.0
\n",
+ "
160.316
\n",
+ "
3511.082
\n",
+ "
\n",
+ "
\n",
+ "
2497
\n",
+ "
2497.0
\n",
+ "
1.49255
\n",
+ "
0.000000
\n",
+ "
923.041410
\n",
+ "
13.344000
\n",
+ "
12.856400
\n",
+ "
690.283200
\n",
+ "
176.239600
\n",
+ "
26.241600
\n",
+ "
4.249600
\n",
+ "
...
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.002
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.008
\n",
+ "
0.0
\n",
+ "
160.328
\n",
+ "
3511.082
\n",
+ "
\n",
+ "
\n",
+ "
2498
\n",
+ "
2498.0
\n",
+ "
1.48990
\n",
+ "
0.000000
\n",
+ "
923.092510
\n",
+ "
13.344000
\n",
+ "
12.856400
\n",
+ "
690.283200
\n",
+ "
176.239600
\n",
+ "
26.241600
\n",
+ "
4.249600
\n",
+ "
...
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.002
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.008
\n",
+ "
0.0
\n",
+ "
160.339
\n",
+ "
3511.082
\n",
+ "
\n",
+ "
\n",
+ "
2499
\n",
+ "
2499.0
\n",
+ "
1.48725
\n",
+ "
0.000000
\n",
+ "
923.143600
\n",
+ "
13.344000
\n",
+ "
12.856400
\n",
+ "
690.283200
\n",
+ "
176.239600
\n",
+ "
26.241600
\n",
+ "
4.249600
\n",
+ "
...
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.002
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.008
\n",
+ "
0.0
\n",
+ "
160.351
\n",
+ "
3511.082
\n",
+ "
\n",
+ "
\n",
+ "
2500
\n",
+ "
2500.0
\n",
+ "
1.48460
\n",
+ "
0.000000
\n",
+ "
923.194700
\n",
+ "
13.344000
\n",
+ "
12.856400
\n",
+ "
690.283200
\n",
+ "
176.239600
\n",
+ "
26.241600
\n",
+ "
4.249600
\n",
+ "
...
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.002
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.0
\n",
+ "
0.008
\n",
+ "
0.0
\n",
+ "
160.351
\n",
+ "
3511.082
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
736 rows × 40 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Year FossilCO2 (Gt-C) OtherCO2 (Gt-C) CH4 (Mt-CH4) N2O (Mt-N2O) \\\n",
+ "1765 1765.0 0.00300 0.000000 0.000000 0.000000 \n",
+ "1766 1766.0 0.00300 0.005338 1.963262 0.005191 \n",
+ "1767 1767.0 0.00300 0.010677 2.436448 0.010117 \n",
+ "1768 1768.0 0.00300 0.016015 2.911105 0.015043 \n",
+ "1769 1769.0 0.00300 0.021353 3.387278 0.019969 \n",
+ "... ... ... ... ... ... \n",
+ "2496 2496.0 1.49520 0.000000 922.990320 13.344000 \n",
+ "2497 2497.0 1.49255 0.000000 923.041410 13.344000 \n",
+ "2498 2498.0 1.48990 0.000000 923.092510 13.344000 \n",
+ "2499 2499.0 1.48725 0.000000 923.143600 13.344000 \n",
+ "2500 2500.0 1.48460 0.000000 923.194700 13.344000 \n",
+ "\n",
+ " SOx (Mt-S) CO (Mt-CO) NMVOC (Mt) NOx (Mt-N) BC (Mt) ... MCF (kt) \\\n",
+ "1765 0.000000 0.000000 0.000000 0.000000 0.000000 ... 0.0 \n",
+ "1766 0.098883 9.050221 1.596875 0.109502 0.106998 ... 0.0 \n",
+ "1767 0.116306 12.960844 2.292316 0.168038 0.133383 ... 0.0 \n",
+ "1768 0.133811 16.876539 2.988648 0.226625 0.159847 ... 0.0 \n",
+ "1769 0.151398 20.797465 3.685897 0.285264 0.186393 ... 0.0 \n",
+ "... ... ... ... ... ... ... ... \n",
+ "2496 12.856400 690.283200 176.239600 26.241600 4.249600 ... 0.0 \n",
+ "2497 12.856400 690.283200 176.239600 26.241600 4.249600 ... 0.0 \n",
+ "2498 12.856400 690.283200 176.239600 26.241600 4.249600 ... 0.0 \n",
+ "2499 12.856400 690.283200 176.239600 26.241600 4.249600 ... 0.0 \n",
+ "2500 12.856400 690.283200 176.239600 26.241600 4.249600 ... 0.0 \n",
+ "\n",
+ " HCFC_22 (kt) HCFC_141B (kt) HCFC_142B (kt) HALON1211 (kt) \\\n",
+ "1765 0.0 0.000 0.0 0.0 \n",
+ "1766 0.0 0.000 0.0 0.0 \n",
+ "1767 0.0 0.000 0.0 0.0 \n",
+ "1768 0.0 0.000 0.0 0.0 \n",
+ "1769 0.0 0.000 0.0 0.0 \n",
+ "... ... ... ... ... \n",
+ "2496 0.0 0.002 0.0 0.0 \n",
+ "2497 0.0 0.002 0.0 0.0 \n",
+ "2498 0.0 0.002 0.0 0.0 \n",
+ "2499 0.0 0.002 0.0 0.0 \n",
+ "2500 0.0 0.002 0.0 0.0 \n",
+ "\n",
+ " HALON1202 (kt) HALON1301 (kt) HALON2404 (kt) CH3BR (kt) CH3CL (kt) \n",
+ "1765 0.0 0.000 0.0 157.267 3100.211 \n",
+ "1766 0.0 0.000 0.0 157.267 3100.211 \n",
+ "1767 0.0 0.000 0.0 157.267 3100.211 \n",
+ "1768 0.0 0.000 0.0 157.267 3100.211 \n",
+ "1769 0.0 0.000 0.0 157.267 3100.211 \n",
+ "... ... ... ... ... ... \n",
+ "2496 0.0 0.008 0.0 160.316 3511.082 \n",
+ "2497 0.0 0.008 0.0 160.328 3511.082 \n",
+ "2498 0.0 0.008 0.0 160.339 3511.082 \n",
+ "2499 0.0 0.008 0.0 160.351 3511.082 \n",
+ "2500 0.0 0.008 0.0 160.351 3511.082 \n",
+ "\n",
+ "[736 rows x 40 columns]"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Save the RCP8.5 emission scenario as a variable\n",
+ "emissions = rcp85.Emissions.emissions\n",
+ "\n",
+ "# If you take a look into our new object, emissions, its a big array of 736 rows and 40 columns!\n",
+ "# The first column is year from 1765 to 2500. \n",
+ "# The subsequent columns are emissions of greenhouse gases and other forcing agents.\n",
+ "# Just to focus on a few in \"emissions\":\n",
+ " # Column 0: Year\n",
+ " # Column 1: Fossil CO2 (Gt-C)\n",
+ " # Column 2: Other CO2 (Gt-C)\n",
+ " # Column 3: CH4 (Mt-CH4)\n",
+ " # Column 4: N2O (Mt-N2O)\n",
+ " \n",
+ "# Let's make this look nice in a dataframe:\n",
+ "rcpemissions = pd.DataFrame(emissions, index = range(1765,2501),\n",
+ " columns=['Year','FossilCO2 (Gt-C)', 'OtherCO2 (Gt-C)', 'CH4 (Mt-CH4)',\n",
+ " 'N2O (Mt-N2O)', 'SOx (Mt-S)', 'CO (Mt-CO)', 'NMVOC (Mt)',\n",
+ " 'NOx (Mt-N)', 'BC (Mt)', 'OC (Mt)', 'NH3 (Mt-N)', 'CF4 (kt)',\n",
+ " 'C2F6 (kt)', 'C6F14 (kt)', 'HFC23 (kt)', 'HFC32 (kt)',\n",
+ " 'HFC43_10 (kt)', 'HFC125 (kt)', 'HFC134a (kt)', 'HFC143a (kt)',\n",
+ " 'HFC227ea (kt)', 'HFC245fa (kt)', 'SF6 (kt)', 'CFC_11 (kt)',\n",
+ " 'CFC_12 (kt)', 'CFC_113 (kt)','CFC_114 (kt)','CFC_115 (kt)',\n",
+ " 'CARB_TET (kt)', 'MCF (kt)', 'HCFC_22 (kt)', 'HCFC_141B (kt)',\n",
+ " 'HCFC_142B (kt)', 'HALON1211 (kt)', 'HALON1202 (kt)', \n",
+ " 'HALON1301 (kt)', 'HALON2404 (kt)', 'CH3BR (kt)', 'CH3CL (kt)']) \n",
+ "rcpemissions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "36ad4de6",
+ "metadata": {},
+ "source": [
+ "## In Depth: How the Climate Model Works\n",
+ "\n",
+ "\"Behind the curtain\" of the fair_scm function a lot of calculations are occuring. Emissions are being converted over to increased concentrations. And then concentrations are depleted on and annual timestep as \"sinks\" uptake and reduce atmospheric constituents. On each timestep, the radiative forcing or \"efficiency at absorbing heat\" is being calculated for each ghg or species. Once the radiative forcing is calculated for the 39 species, they are aggreagated as a total radiative forcing. The last step calculates the global atmospheric temperature from the total forcing.\n",
+ "\n",
+ "A few cool features are built into the FaIR model. For one, the carbon cycle is temperature sensitive. As more CO2 stays in the atmosphere, it causes global temperatures to rise. But the higher temperatures weaken the carbon sinks of the ocean and land. It becomes harder for the ocean and vegetation on the land to absorb/sequester CO2. The FaIR model captures this \"positive\" feedback\n",
+ "\n",
+ "A second cool feature is the FaIR model is tuned to replicate historic observations of concentrations and global temperature.\n",
+ "\n",
+ "And third, it prescribes natural emissions of methane and nitrous oxide. Although, the natural emissions timeseries are slightly unusual and unrealistic as they calculated them back from the balance of concentration observations and prescribed historical anthropogenic emissions. This is worth noting as the developers are aware of the flawed assumptions."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "695f5339",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Now the magic happens in one single line! We input the emissions data into the \"fair_scm\" function\n",
+ "\n",
+ "C,F,T = fair_scm(emissions=emissions)\n",
+ "\n",
+ "# The outputs are a tuple of (C, F, T) arrays\n",
+ " # C: Concentrations (nt, 31) in multigas mode\n",
+ " # Column 0: CO2 ppm\n",
+ " # Column 1: CH4 ppb\n",
+ " # Column 2: N2O pbb\n",
+ " # For other columns see: https://github.com/OMS-NetZero/FAIR\n",
+ " # F: Radiative forcing (nt, 13) in Watts per meter squared\n",
+ " # T: Temperature change anomaly (nt,) in Celsius"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "f705ee21",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Okay so let's have fun and make a plot of the FaIR outputs (C,F,T) for the RCP8.5 scenario.\n",
+ "\n",
+ "fig = plt.figure()\n",
+ "ax1 = fig.add_subplot(221)\n",
+ "ax1.plot(rcpemissions.index, rcpemissions.iloc[:,1], color='black')\n",
+ "ax1.set_ylabel('CO$_2$ emissions (Gt-C)')\n",
+ "ax2 = fig.add_subplot(222)\n",
+ "ax2.plot(result1.index, result1.iloc[:,0], color='blue')\n",
+ "ax2.set_ylabel('CO$_2$ concentration (ppm)')\n",
+ "ax3 = fig.add_subplot(223)\n",
+ "ax3.plot(result2.index, result2.iloc[:,0], color='orange')\n",
+ "ax3.set_ylabel('CO$_2$ radiative forcing (Wm-2)')\n",
+ "ax4 = fig.add_subplot(224)\n",
+ "ax4.plot(result3.index, result3.iloc[:,0], color='red')\n",
+ "ax4.set_ylabel('global temperature anomaly (C)');"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b209bb58",
+ "metadata": {},
+ "source": [
+ "## Sending the Solution Emission Reductions to the FaIR Model\n",
+ "\n",
+ "Now that we've practiced using the FaIR model, let's put it to use for Project Drawdown purposes. We want to know how much of an impact our solutions make on the global greenhouse gas concentrations and global temperature. To do this, we will subtract out our emission reductions from the baseline RCP scenario. This will give us a scenario that includes our solution implementation. Then we'll simply run FaIR for the two scenarios; the baseline (no solution implmentation) and the solution scenario.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "7c003814",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# The factory module has several ways of constructing solutions and scenarios.\n",
+ "# The simplest is to get the most recent Project Drawdown Scenario (PDS) of a particular type \n",
+ "# for a particular solution.\n",
+ "\n",
+ "# We will load the first conservative Project Drawdown Scenario (PDS1) of an industry-based solution, \n",
+ "# let's load the refrigerants solution.\n",
+ "\n",
+ "refrigerants_pds1 = factory.solution_pds_type(\"refrigerants\", \"PDS1\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "811f8536",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#For demonstration purposes we will chose the RCP8.5 scenario as a baseline emission scenario. \n",
+ "#To load the scenario and run it through the FaIR model we will use:\n",
+ "\n",
+ "baseline = refrigerants_pds1.c2.FaIR_CFT_baseline_RCP85()\n",
+ "\n",
+ "#Within this variable that we’ve called “baseline”, there are 4 essential results. \n",
+ "# Essentially, the output is a data frame for the global mean concentration of greenhouse gases “C”, \n",
+ "# radiative forcing “F”, and temperature “T”. As well as, the emission scenario, “E”.\n",
+ "\n",
+ "# We can save each of these results as its own variable for easy access:\n",
+ "C85_base = refrigerants_pds1.c2.FaIR_CFT_baseline_RCP85()[0]\n",
+ "F85_base = refrigerants_pds1.c2.FaIR_CFT_baseline_RCP85()[1]\n",
+ "T85_base = refrigerants_pds1.c2.FaIR_CFT_baseline_RCP85()[2]\n",
+ "E85_base = refrigerants_pds1.c2.FaIR_CFT_baseline_RCP85()[3]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "67109773",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Now that we have the baseline emission scenario, we want to compare it to our Project Drawdown \n",
+ "# emission reductions. We can create a reduction scenario by subtracting the emission reductions \n",
+ "# for CO2, CH4, and N2O from the total emissions in our baseline scenario. \n",
+ "\n",
+ "# The command that will run our reduction scenario in FaIR to produce our climate results is:\n",
+ "reduction = refrigerants_pds1.c2.FaIR_CFT_Drawdown_RCP85()\n",
+ "\n",
+ "# Again, the output will have concentration, radiative forcing, temperature, and global emissions.\n",
+ "C85_pds1 = refrigerants_pds1.c2.FaIR_CFT_baseline_RCP85()[0]\n",
+ "F85_pds1 = refrigerants_pds1.c2.FaIR_CFT_baseline_RCP85()[1]\n",
+ "T85_pds1 = refrigerants_pds1.c2.FaIR_CFT_baseline_RCP85()[2]\n",
+ "E85_pds1 = refrigerants_pds1.c2.FaIR_CFT_baseline_RCP85()[3]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "0868d2d6",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Let's plot our results to see the impact of reducing our use of damaging refridgerants!\n",
+ "# Check that out! A single solution can make an impact globally! Imagine what all of the solutions could do!\n",
+ "\n",
+ "fig = plt.figure()\n",
+ "ax1 = fig.add_subplot(221)\n",
+ "ax1.plot(C85_base.index,C85_base['CO2(ppm)'], c = \"green\", label=\"Baseline\")\n",
+ "ax1.plot(C85_pds1.index,C85_pds1['CO2(ppm)'], c = \"blue\", label=\"Solution\")\n",
+ "ax1.set_ylabel('CO$_2$ concentration (ppm)')\n",
+ "ax1.set_xlim([2020, 2060])\n",
+ "ax1.set_ylim([400, 650])\n",
+ "ax1.legend(loc='upper left')\n",
+ "\n",
+ "ax2 = fig.add_subplot(222)\n",
+ "ax2.plot(T85_base.index,T85_base['TempAnomaly(C)'], c = \"green\", label=\"Baseline\")\n",
+ "ax2.plot(T85_pds1.index,T85_pds1['TempAnomaly(C)'], c = \"blue\", label=\"Solution\")\n",
+ "ax2.set_ylabel('global temperature anomaly (C)')\n",
+ "ax2.set_xlim([2020, 2060])\n",
+ "ax2.set_ylim([1.25, 2.75]);\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/Tutorial_GHG_Accounting.ipynb b/Tutorial_GHG_Accounting.ipynb
new file mode 100644
index 000000000..6c3459348
--- /dev/null
+++ b/Tutorial_GHG_Accounting.ipynb
@@ -0,0 +1,734 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "af1f5442",
+ "metadata": {},
+ "source": [
+ "# Greenhouse Gas (GHG) Accounting Tutorial\n",
+ "\n",
+ "This tutorial will help teach you to use the Project Drawdown Solutions Model. We'll go over how to calculate the greenhouse gas emission reductions.\n",
+ "\n",
+ "Recently updated and new features of the model calculate the total emission reductions for separate GHGs, including carbon dioxide (CO2), methane (CH4), and nitrous oxide (N2O). The model will also maintain its calculation of the total emission reduction in terms of CO2-equalivalent emissions. This allows the user to report emission reductions for separate gases and for the combined total CO2-eq GHG emissions.\n",
+ "\n",
+ "\n",
+ "## CO2-Equivalent vs. Individual Gas Emissions\n",
+ "\n",
+ "CO2-eq is a unit of measure that standardizes climate effects of greenhouse gases to the radiative forcing of a unit of carbon dioxide over a specified timeframe. In short, it allows us to compare the climate impact of CO2 to other different greenhouse gases like methane and nitrous oxide. \n",
+ "\n",
+ "An advantage to the CO2-eq unit is it’s a common unit for all greenhouse gases. This allows us to report the total greenhouse gas emissions by summing all the individual gases. Since CO2 equivalence provides a single number that encompasses all gases, the climate community has readily adapted this unit. However, there are a few drawbacks to using it. For one, when reported as a summed total, we cannot differentiate each gas and their contribution to the total emissions. This makes it difficult for policymakers to target strategies on certain activities or sectors for methane or nitrous oxide.\n",
+ "\n",
+ "To avoid ambiguity, Project Drawdown reports emission reductions in both CO2-eq emissions and individual GHGs emissions (CO2, CH4, N2O). There are many valuable reasons for reporting greenhouse gas emissions individually. For one, it improves the transparency and clarity about the solutions model assumptions. This enhances our trust in the model results. It also indicates what solutions may be most beneficial for targeting other greenhouse gases beyond just carbon dioxide. As cutting methane and nitrous oxide emissions become a growing concern for meeting nationally determined contributions and other long-term climate goals, reporting those emissions can help target Project Drawdown solutions and sectors to reach those objectives.\n",
+ "\n",
+ "\n",
+ "## How CO2-Equivalent is Calculated\n",
+ "\n",
+ "The way CO2-eq is calculated is by using an index called the Global Warming Potential (GWP). The GWP depends on two things. First, it depends on what greenhouse gas we are talking about. If it is methane, then we know that methane is more effective at trapping heat in the atmosphere than CO2, and that alone will increase the GWP. Second, the GWP depends on how long the greenhouse gas stays in the atmosphere or its lifetime – the time it takes before the gas is removed or chemically broken down.\n",
+ "\n",
+ "Project Drawdown currently uses the 100-year GWP for methane (GWP = 28) and nitrous oxide (GWP = 265). In a 100-year timespan, methane’s heat-trapping ability will drop to 28x more effective as a greenhouse gas than CO2. Another way of looking at the GWP is to say if 1 tonne of methane was released, it would create an equivalent warming as 28 tonnes of CO2.\n",
+ "\n",
+ "Multiply the total emissions for a particular greenhouse gas by the GWP of that gas to get CO2-eq. For instance, we emit on average 400 Megatons (Mt) of CH4 each year. This equates to 400 x 28 = 11.2 Gigatons (Gt) CO2-eq emissions annually. Now, if our emissions for nitrous oxide were 9 Mt-N2O, our annual CO2-eq emissions would be 9 x 265 = 2.4 Gt CO2-eq. As for CO2 emissions, the factor is 1 and we do not need to make a conversion.\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7f762b46",
+ "metadata": {},
+ "source": [
+ "### Initial Setup\n",
+ "\n",
+ "Here we will show how to load a scenario and look into a few variables.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "56c3cb54",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Import modules we'll use later\n",
+ "\n",
+ "from solution import factory\n",
+ "import pandas as pd\n",
+ "import matplotlib"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "dbdd7198",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# The factory module has several ways of constructing solutions and scenarios.\n",
+ "# The simplest is to get the most recent Project Drawdown Scenario (PDS) of a particular type \n",
+ "# for a particular solution.\n",
+ "\n",
+ "# We will load the first conservative Project Drawdown Scenario (PDS1) of an industry-based solution, \n",
+ "# let's load the Landfill Methane solution. This solution aims to capture methane gas within landills and\n",
+ "# utilize that captured gas as fuel for electricity generation.\n",
+ "\n",
+ "landfill_pds1 = factory.solution_pds_type(\"landfillmethane\", \"PDS1\")\n",
+ "\n",
+ "# We will also load a land-based solution to demonstrate it's capabilities. This is the Improved Rice solution.\n",
+ "\n",
+ "rice_pds1 = factory.solution_pds_type(\"improvedrice\", \"PDS1\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "6d0153b9",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Behind the scenes all of our calculations were made. We just need to know how to call on those results.\n",
+ "# The way to call on the results is in the following convention:\n",
+ "# Solution_name.Component_name.Variable_name\n",
+ "\n",
+ "# You’ll need the solution name, in this case “landfill_pds1”. You’ll need the component name. For example, we’ll \n",
+ "# pick the advanced controls, “ac”. And, we need a variable name. How about the functional units adopted for\n",
+ "# the solution being implemented.\n",
+ "# The output will show a dataframe of the world regions and the years modelled (2014-2060). \n",
+ "\n",
+ "# Units: TeraWatt Hours of Electricity (TWh)\n",
+ "\n",
+ "funits = landfill_pds1.ua.soln_pds_funits_adopted"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "f7cf22e3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "3778763.0859725103"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# We may be interested in what Project Drawdown's model is using as an emission factor.\n",
+ "# The emission factor is the amount of CO2-equivalent methane emitted per functional unit.\n",
+ "\n",
+ "# Units: tons CO2-eq (methane) per TeraWatt Hours of Electricity\n",
+ "\n",
+ "ch4emis_factor = landfill_pds1.ac.ch4_co2_per_funit\n",
+ "ch4emis_factor"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "b650b84b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.0"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# The same could be done for nitrous oxide if it were a greenhouse gas included in our solution.\n",
+ "\n",
+ "# Units: tons CO2-eq (nitrous oxide) per TeraWatt Hours of Electricity\n",
+ "\n",
+ "n2oemis_factor = landfill_pds1.ac.n2o_co2_per_funit\n",
+ "n2oemis_factor"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "23935944",
+ "metadata": {},
+ "source": [
+ "### Calling on the GHG results\n",
+ "\n",
+ "If you take home only one thing from this tutorial this is it! \n",
+ "\n",
+ "To bypass all the commands for each individual gas, you can use the following two commands to provide a summary of GHG reductions."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "20f4a686",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
CO2 (Gt-C)
\n",
+ "
CH4 (Mt-CH4)
\n",
+ "
N2O (Mt-N2O)
\n",
+ "
\n",
+ "
\n",
+ "
Year
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
2014
\n",
+ "
NaN
\n",
+ "
0.000000e+00
\n",
+ "
0.000000e+00
\n",
+ "
\n",
+ "
\n",
+ "
2015
\n",
+ "
0.000000
\n",
+ "
0.000000e+00
\n",
+ "
0.000000e+00
\n",
+ "
\n",
+ "
\n",
+ "
2016
\n",
+ "
0.000000
\n",
+ "
0.000000e+00
\n",
+ "
0.000000e+00
\n",
+ "
\n",
+ "
\n",
+ "
2017
\n",
+ "
0.000000
\n",
+ "
0.000000e+00
\n",
+ "
0.000000e+00
\n",
+ "
\n",
+ "
\n",
+ "
2018
\n",
+ "
0.000000
\n",
+ "
0.000000e+00
\n",
+ "
0.000000e+00
\n",
+ "
\n",
+ "
\n",
+ "
2019
\n",
+ "
0.000000
\n",
+ "
0.000000e+00
\n",
+ "
0.000000e+00
\n",
+ "
\n",
+ "
\n",
+ "
2020
\n",
+ "
0.006669
\n",
+ "
7.104418e-07
\n",
+ "
-2.111232e-08
\n",
+ "
\n",
+ "
\n",
+ "
2021
\n",
+ "
0.010003
\n",
+ "
1.065663e-06
\n",
+ "
-3.166847e-08
\n",
+ "
\n",
+ "
\n",
+ "
2022
\n",
+ "
0.013338
\n",
+ "
1.420884e-06
\n",
+ "
-4.222463e-08
\n",
+ "
\n",
+ "
\n",
+ "
2023
\n",
+ "
0.016672
\n",
+ "
1.776104e-06
\n",
+ "
-5.278079e-08
\n",
+ "
\n",
+ "
\n",
+ "
2024
\n",
+ "
0.020007
\n",
+ "
2.131325e-06
\n",
+ "
-6.333695e-08
\n",
+ "
\n",
+ "
\n",
+ "
2025
\n",
+ "
0.023341
\n",
+ "
2.486546e-06
\n",
+ "
-7.389310e-08
\n",
+ "
\n",
+ "
\n",
+ "
2026
\n",
+ "
0.026675
\n",
+ "
2.841767e-06
\n",
+ "
-8.444926e-08
\n",
+ "
\n",
+ "
\n",
+ "
2027
\n",
+ "
0.030010
\n",
+ "
3.196988e-06
\n",
+ "
-9.500542e-08
\n",
+ "
\n",
+ "
\n",
+ "
2028
\n",
+ "
0.033344
\n",
+ "
3.552209e-06
\n",
+ "
-1.055616e-07
\n",
+ "
\n",
+ "
\n",
+ "
2029
\n",
+ "
0.036679
\n",
+ "
3.907430e-06
\n",
+ "
-1.161177e-07
\n",
+ "
\n",
+ "
\n",
+ "
2030
\n",
+ "
0.040013
\n",
+ "
4.262651e-06
\n",
+ "
-1.266739e-07
\n",
+ "
\n",
+ "
\n",
+ "
2031
\n",
+ "
0.042724
\n",
+ "
4.551463e-06
\n",
+ "
-1.352566e-07
\n",
+ "
\n",
+ "
\n",
+ "
2032
\n",
+ "
0.045435
\n",
+ "
4.840276e-06
\n",
+ "
-1.438393e-07
\n",
+ "
\n",
+ "
\n",
+ "
2033
\n",
+ "
0.048146
\n",
+ "
5.129089e-06
\n",
+ "
-1.524220e-07
\n",
+ "
\n",
+ "
\n",
+ "
2034
\n",
+ "
0.050857
\n",
+ "
5.417902e-06
\n",
+ "
-1.610047e-07
\n",
+ "
\n",
+ "
\n",
+ "
2035
\n",
+ "
0.053568
\n",
+ "
5.706714e-06
\n",
+ "
-1.695874e-07
\n",
+ "
\n",
+ "
\n",
+ "
2036
\n",
+ "
0.055514
\n",
+ "
5.913962e-06
\n",
+ "
-1.757462e-07
\n",
+ "
\n",
+ "
\n",
+ "
2037
\n",
+ "
0.057045
\n",
+ "
6.077142e-06
\n",
+ "
-1.805954e-07
\n",
+ "
\n",
+ "
\n",
+ "
2038
\n",
+ "
0.058577
\n",
+ "
6.240322e-06
\n",
+ "
-1.854447e-07
\n",
+ "
\n",
+ "
\n",
+ "
2039
\n",
+ "
0.060109
\n",
+ "
6.403502e-06
\n",
+ "
-1.902939e-07
\n",
+ "
\n",
+ "
\n",
+ "
2040
\n",
+ "
0.061641
\n",
+ "
6.566682e-06
\n",
+ "
-1.951432e-07
\n",
+ "
\n",
+ "
\n",
+ "
2041
\n",
+ "
0.063172
\n",
+ "
6.729862e-06
\n",
+ "
-1.999924e-07
\n",
+ "
\n",
+ "
\n",
+ "
2042
\n",
+ "
0.064704
\n",
+ "
6.893042e-06
\n",
+ "
-2.048417e-07
\n",
+ "
\n",
+ "
\n",
+ "
2043
\n",
+ "
0.066236
\n",
+ "
7.056222e-06
\n",
+ "
-2.096909e-07
\n",
+ "
\n",
+ "
\n",
+ "
2044
\n",
+ "
0.067768
\n",
+ "
7.219402e-06
\n",
+ "
-2.145402e-07
\n",
+ "
\n",
+ "
\n",
+ "
2045
\n",
+ "
0.069299
\n",
+ "
7.382582e-06
\n",
+ "
-2.193894e-07
\n",
+ "
\n",
+ "
\n",
+ "
2046
\n",
+ "
0.070831
\n",
+ "
7.545762e-06
\n",
+ "
-2.242387e-07
\n",
+ "
\n",
+ "
\n",
+ "
2047
\n",
+ "
0.072363
\n",
+ "
7.708942e-06
\n",
+ "
-2.290879e-07
\n",
+ "
\n",
+ "
\n",
+ "
2048
\n",
+ "
0.073895
\n",
+ "
7.872122e-06
\n",
+ "
-2.339372e-07
\n",
+ "
\n",
+ "
\n",
+ "
2049
\n",
+ "
0.075426
\n",
+ "
8.035302e-06
\n",
+ "
-2.387864e-07
\n",
+ "
\n",
+ "
\n",
+ "
2050
\n",
+ "
0.076958
\n",
+ "
8.198482e-06
\n",
+ "
-2.436356e-07
\n",
+ "
\n",
+ "
\n",
+ "
2051
\n",
+ "
0.000000
\n",
+ "
0.000000e+00
\n",
+ "
0.000000e+00
\n",
+ "
\n",
+ "
\n",
+ "
2052
\n",
+ "
0.000000
\n",
+ "
0.000000e+00
\n",
+ "
0.000000e+00
\n",
+ "
\n",
+ "
\n",
+ "
2053
\n",
+ "
0.000000
\n",
+ "
0.000000e+00
\n",
+ "
0.000000e+00
\n",
+ "
\n",
+ "
\n",
+ "
2054
\n",
+ "
0.000000
\n",
+ "
0.000000e+00
\n",
+ "
0.000000e+00
\n",
+ "
\n",
+ "
\n",
+ "
2055
\n",
+ "
0.000000
\n",
+ "
0.000000e+00
\n",
+ "
0.000000e+00
\n",
+ "
\n",
+ "
\n",
+ "
2056
\n",
+ "
0.000000
\n",
+ "
0.000000e+00
\n",
+ "
0.000000e+00
\n",
+ "
\n",
+ "
\n",
+ "
2057
\n",
+ "
0.000000
\n",
+ "
0.000000e+00
\n",
+ "
0.000000e+00
\n",
+ "
\n",
+ "
\n",
+ "
2058
\n",
+ "
0.000000
\n",
+ "
0.000000e+00
\n",
+ "
0.000000e+00
\n",
+ "
\n",
+ "
\n",
+ "
2059
\n",
+ "
0.000000
\n",
+ "
0.000000e+00
\n",
+ "
0.000000e+00
\n",
+ "
\n",
+ "
\n",
+ "
2060
\n",
+ "
0.000000
\n",
+ "
0.000000e+00
\n",
+ "
0.000000e+00
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " CO2 (Gt-C) CH4 (Mt-CH4) N2O (Mt-N2O)\n",
+ "Year \n",
+ "2014 NaN 0.000000e+00 0.000000e+00\n",
+ "2015 0.000000 0.000000e+00 0.000000e+00\n",
+ "2016 0.000000 0.000000e+00 0.000000e+00\n",
+ "2017 0.000000 0.000000e+00 0.000000e+00\n",
+ "2018 0.000000 0.000000e+00 0.000000e+00\n",
+ "2019 0.000000 0.000000e+00 0.000000e+00\n",
+ "2020 0.006669 7.104418e-07 -2.111232e-08\n",
+ "2021 0.010003 1.065663e-06 -3.166847e-08\n",
+ "2022 0.013338 1.420884e-06 -4.222463e-08\n",
+ "2023 0.016672 1.776104e-06 -5.278079e-08\n",
+ "2024 0.020007 2.131325e-06 -6.333695e-08\n",
+ "2025 0.023341 2.486546e-06 -7.389310e-08\n",
+ "2026 0.026675 2.841767e-06 -8.444926e-08\n",
+ "2027 0.030010 3.196988e-06 -9.500542e-08\n",
+ "2028 0.033344 3.552209e-06 -1.055616e-07\n",
+ "2029 0.036679 3.907430e-06 -1.161177e-07\n",
+ "2030 0.040013 4.262651e-06 -1.266739e-07\n",
+ "2031 0.042724 4.551463e-06 -1.352566e-07\n",
+ "2032 0.045435 4.840276e-06 -1.438393e-07\n",
+ "2033 0.048146 5.129089e-06 -1.524220e-07\n",
+ "2034 0.050857 5.417902e-06 -1.610047e-07\n",
+ "2035 0.053568 5.706714e-06 -1.695874e-07\n",
+ "2036 0.055514 5.913962e-06 -1.757462e-07\n",
+ "2037 0.057045 6.077142e-06 -1.805954e-07\n",
+ "2038 0.058577 6.240322e-06 -1.854447e-07\n",
+ "2039 0.060109 6.403502e-06 -1.902939e-07\n",
+ "2040 0.061641 6.566682e-06 -1.951432e-07\n",
+ "2041 0.063172 6.729862e-06 -1.999924e-07\n",
+ "2042 0.064704 6.893042e-06 -2.048417e-07\n",
+ "2043 0.066236 7.056222e-06 -2.096909e-07\n",
+ "2044 0.067768 7.219402e-06 -2.145402e-07\n",
+ "2045 0.069299 7.382582e-06 -2.193894e-07\n",
+ "2046 0.070831 7.545762e-06 -2.242387e-07\n",
+ "2047 0.072363 7.708942e-06 -2.290879e-07\n",
+ "2048 0.073895 7.872122e-06 -2.339372e-07\n",
+ "2049 0.075426 8.035302e-06 -2.387864e-07\n",
+ "2050 0.076958 8.198482e-06 -2.436356e-07\n",
+ "2051 0.000000 0.000000e+00 0.000000e+00\n",
+ "2052 0.000000 0.000000e+00 0.000000e+00\n",
+ "2053 0.000000 0.000000e+00 0.000000e+00\n",
+ "2054 0.000000 0.000000e+00 0.000000e+00\n",
+ "2055 0.000000 0.000000e+00 0.000000e+00\n",
+ "2056 0.000000 0.000000e+00 0.000000e+00\n",
+ "2057 0.000000 0.000000e+00 0.000000e+00\n",
+ "2058 0.000000 0.000000e+00 0.000000e+00\n",
+ "2059 0.000000 0.000000e+00 0.000000e+00\n",
+ "2060 0.000000 0.000000e+00 0.000000e+00"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# This command will print out annual greenhouse gas emission reductions for CO2, CH4, and N2O for \n",
+ "# a particular solution. Note, we're swapping over to using the Improved Rice solution here.\n",
+ "\n",
+ "# Units: Gt-C of CO2, Mt-CH4, Mt-N2O\n",
+ "ghgreduced_annual = rice_pds1.c2.ghg_emissions_reductions_global_annual()\n",
+ "ghgreduced_annual"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "d4853394",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "CO2 (Gt-C) 1.491021\n",
+ "CH4 (Mt-CH4) 0.000159\n",
+ "N2O (Mt-N2O) -0.000005\n",
+ "Name: ghg_emissions_reductions_global_cumulative, dtype: float64"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# We can do a quick command to calculate the cumulative emissions over the 2014-2060 time period:\n",
+ "\n",
+ "# Units: Gt-C of CO2, Mt-CH4, Mt-N2O\n",
+ "ghgreduced_cumulative = rice_pds1.c2.ghg_emissions_reductions_global_cumulative()\n",
+ "ghgreduced_cumulative"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "40f13207",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# If we want to just announce our results in CO2-eq taking in account all of our GHG emissions:\n",
+ "\n",
+ "# Units: Mt CO2-eq\n",
+ "\n",
+ "ghgreduced_co2eq = rice_pds1.c2.co2eq_mmt_reduced()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "eb390e7c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "World 3993.938029\n",
+ "OECD90 0.000000\n",
+ "Eastern Europe 0.000000\n",
+ "Asia (Sans Japan) 0.000000\n",
+ "Middle East and Africa 0.000000\n",
+ "Latin America 0.000000\n",
+ "China 0.000000\n",
+ "India 0.000000\n",
+ "EU 0.000000\n",
+ "USA 0.000000\n",
+ "dtype: float64"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# We can do a quick command to calculate the cumulative emissions over the 2014-2060 time period:\n",
+ "\n",
+ "# Units: Mt CO2-eq\n",
+ "\n",
+ "ghgreduced_co2eq_cumulative = ghgreduced_co2eq.sum(axis=0)\n",
+ "ghgreduced_co2eq_cumulative"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "63f330f8",
+ "metadata": {},
+ "source": [
+ "### Individual Gas Results\n",
+ "This is more of a behind-the-scenes look at how the greenhouse gas emission reductions are being calculated."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "c755adf8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "## METHANE\n",
+ "\n",
+ "# CH4 emissions avoided/reduced for the Improved Rice solution\n",
+ "\n",
+ "# Units: megatons of methane (Mt-CH4)\n",
+ "\n",
+ "ch4reduced = rice_pds1.c4.ch4_megatons_avoided_or_reduced()\n",
+ "\n",
+ "\n",
+ "# If we want our results in tons of CO2-eq we can simply use the Global Warming Index to make our conversion:\n",
+ "# Remember that the GWP = 28 for methane and GWP = 265 for nitrous oxide.\n",
+ "\n",
+ "# Units: megatons of CO2-eq methane (Mt-CO2-eq)\n",
+ "\n",
+ "ch4reduced_co2eq = 28 * ch4reduced"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "b0c39b0a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "## NITROUS OXIDE\n",
+ "\n",
+ "# N2O emissions avoided/reduced for the Improved Rice solution\n",
+ "\n",
+ "# Units: megatons of nitrous oxide (Mt-N2O)\n",
+ "\n",
+ "n2oreduced = rice_pds1.n2o.n2o_megatons_avoided_or_reduced()\n",
+ "\n",
+ "\n",
+ "# If we want our results in tons of CO2-eq we can simply use the Global Warming Index to make our conversion:\n",
+ "# Remember that the GWP = 28 for methane and GWP = 265 for nitrous oxide.\n",
+ "\n",
+ "# Units: megatons of CO2-eq nitrous oxide (Mt-CO2-eq)\n",
+ "\n",
+ "n2oreduced_co2eq = 265 * n2oreduced"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "2fe20c03",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "## CARBON DIOXIDE\n",
+ "\n",
+ "# If a user is interested in the total CO2 emissions reduced/avoided, they would execute the following command.\n",
+ "\n",
+ "# Units: megatons of carbon dioxide (Mt-CO2)\n",
+ "\n",
+ "co2reduced = rice_pds1.c2.co2only_mmt_reduced()\n",
+ "\n",
+ "\n",
+ "# And for the Land model, we can find the total CO2 sequestered by:\n",
+ "co2sequest = rice_pds1.c2.co2_sequestered_global()\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/model/ch4calcs.py b/model/ch4calcs.py
index 3dff167f3..ed6aa7154 100644
--- a/model/ch4calcs.py
+++ b/model/ch4calcs.py
@@ -1,6 +1,6 @@
"""CH4 Calcs module.
-Computes reductions in CO2-equivalent emissions.
+Computes reductions for methane in individual gas units and CO2-equivalent emissions.
"""
from functools import lru_cache
@@ -9,6 +9,9 @@
from model.data_handler import DataHandler
from model.decorators import data_func
+from model import emissionsfactors
+
+
class CH4Calcs(DataHandler):
"""CH4 Calcs module.
@@ -26,12 +29,11 @@ def __init__(self, ac, soln_net_annual_funits_adopted,
self.soln_pds_direct_ch4_co2_emissions_saved = soln_pds_direct_ch4_co2_emissions_saved
+
@lru_cache()
@data_func
- def ch4_tons_reduced(self):
- """CH4 reduced, in tons.
- replace gas_ch4_step = `gas_tons_ch4' * `e'^(-(time_from_present - `n')/12)
- SolarPVUtil 'CH4 Calcs'!A10:K56
+ def ch4_co2eq_tons_reduced(self):
+ """CH4 reduced, in tons of CO2eq per year.
"""
if self.ac.ch4_is_co2eq:
result = self.soln_net_annual_funits_adopted * 0
@@ -39,54 +41,116 @@ def ch4_tons_reduced(self):
result = self.soln_net_annual_funits_adopted * self.ac.ch4_co2_per_funit
result.loc[:self.ac.report_start_year - 1] = 0.0
result.loc[self.ac.report_end_year + 1:] = 0.0
+ result.name = "ch4_co2eq_tons_reduced"
+ return result
+
+ @lru_cache()
+ def ch4_tons_reduced(self):
+ """CH4 reduced from the RRS model, in tons CH4 per year.
+ """
+ if self.ac.ch4_is_co2eq:
+ ef = emissionsfactors.CO2Equiv(self.ac.co2eq_conversion_source)
+ result = (self.soln_net_annual_funits_adopted * self.ac.ch4_co2_per_funit)/ef.CH4multiplier
+ else:
+ result = self.soln_net_annual_funits_adopted * self.ac.ch4_co2_per_funit
+ result.loc[:self.ac.report_start_year - 1] = 0.0
+ result.loc[self.ac.report_end_year + 1:] = 0.0
result.name = "ch4_tons_reduced"
return result
+
@lru_cache()
- def avoided_direct_emissions_ch4_land(self):
- """CH4 emissions avoided, in tons
- replace gas_ch4_step = `gas_tons_ch4' * `e'^(-(time_from_present - `n')/12)
- Improved Rice 'CH4 Calcs'!A12:K58
+ def avoided_direct_emissions_ch4_co2eq_land(self):
+ """CH4 emissions avoided from the land model, in tons of CO2eq per year
"""
result = self.soln_pds_direct_ch4_co2_emissions_saved.copy(deep=True)
result.loc[:self.ac.report_start_year - 1] = 0.0
result.loc[self.ac.report_end_year + 1:] = 0.0
+ result.name = "avoided_direct_emissions_ch4_co2eq_land"
+ return result
+
+
+
+ @lru_cache()
+ def avoided_direct_emissions_ch4_land(self):
+ """CH4 direct emissions avoided, in tons per year
+ """
+ ef = emissionsfactors.CO2Equiv(self.ac.co2eq_conversion_source)
+ result = self.soln_pds_direct_ch4_co2_emissions_saved.copy(deep=True) / ef.CH4multiplier
+ result.loc[:self.ac.report_start_year - 1] = 0.0
+ result.loc[self.ac.report_end_year + 1:] = 0.0
result.name = "avoided_direct_emissions_ch4_land"
return result
+
+
+
+ @lru_cache()
+ def ch4_megatons_avoided_or_reduced(self):
+ """CH4 emissions avoided or reduced, in megatons per year (units needed for the FaIR model). A key result!
+ """
+ if self.soln_pds_direct_ch4_co2_emissions_saved is not None:
+ ch4_tons = self.avoided_direct_emissions_ch4_land()
+ else:
+ ch4_tons = self.ch4_tons_reduced()
+ result = ch4_tons * 0.000001
+ result.name = "ch4_megatons_avoided_or_reduced"
+ return result
+
@lru_cache()
- def ch4_ppb_calculator(self):
+ def ch4_ppb_calculator_avoided_or_reduced(self):
"""Parts Per Billion reduction calculator for CH4.
-
Each yearly reduction in CH4 (in metric tons) is modeled as a discrete avoided pulse.
A Simplified atmospheric lifetime function for CH4 is taken from Myhrvald and Caldeira
(2012). Atmospheric tons of CH4 are converted to parts per billion CH4 based on the
molar mass of CH4 and the moles of atmosphere.
-
- SolarPVUtil 'CH4 Calcs'!A64:AW110
"""
if self.soln_pds_direct_ch4_co2_emissions_saved is not None:
ch4_tons = self.avoided_direct_emissions_ch4_land()
else:
ch4_tons = self.ch4_tons_reduced()
-
col_years = np.arange(2015, 2061)
index_years = ch4_tons.index.values
-
deltas = index_years.reshape(-1, 1) - col_years.reshape(1, -1) + 1
-
vals = np.exp( - deltas / 12) * ch4_tons.loc[col_years, "World"].values.reshape(1, -1)
vals[deltas < 1] = 0 # Overwrite values for negative deltas
-
total = vals.sum(axis=1).reshape(-1, 1)
ppb = total / (16.04 * 1.8 * 10 ** 5)
+ ppb_calculator = pd.DataFrame(np.concatenate([ppb, total, vals], axis=1),
+ columns=["PPB", "Total"] + list(col_years),
+ index=ch4_tons.index.copy(),
+ dtype=np.float64
+ )
+ ppb_calculator.name = "ch4_ppb_calculator_avoided_or_reduced"
+ return ppb_calculator
+
+
+ @lru_cache()
+ def ch4_ppb_calculator(self):
+ """Parts Per Billion reduction calculator for CH4 using CO2eq.
+ This is the original way drawdown was calculating the concentration of methane
+ in the atmosphere. This way is incorrect since the equation taken from Myhrvald and Caldeira (2012)
+ assumes metric tons are converted to ppb, NOT CO2eq tons of methane (like it is done here).
+ """
+ if self.soln_pds_direct_ch4_co2_emissions_saved is not None:
+ ch4_tons = self.avoided_direct_emissions_ch4_co2eq_land()
+ else:
+ ch4_tons = self.ch4_co2eq_tons_reduced()
+ col_years = np.arange(2015, 2061)
+ index_years = ch4_tons.index.values
+ deltas = index_years.reshape(-1, 1) - col_years.reshape(1, -1) + 1
+ vals = np.exp( - deltas / 12) * ch4_tons.loc[col_years, "World"].values.reshape(1, -1)
+ vals[deltas < 1] = 0 # Overwrite values for negative deltas
+ total = vals.sum(axis=1).reshape(-1, 1)
+ ppb = total / (16.04 * 1.8 * 10 ** 5)
ppb_calculator = pd.DataFrame(np.concatenate([ppb, total, vals], axis=1),
columns=["PPB", "Total"] + list(col_years),
index=ch4_tons.index.copy(),
dtype=np.float64
)
- ppb_calculator.name = "ch4_ppb_calculator"
+ ppb_calculator.name = "ch4_ppb_calculator_co2eq"
return ppb_calculator
+
\ No newline at end of file
diff --git a/model/co2calcs.py b/model/co2calcs.py
index 1fd4c488f..dc60d61ac 100644
--- a/model/co2calcs.py
+++ b/model/co2calcs.py
@@ -1,6 +1,6 @@
"""CO2 Calcs module.
-Computes reductions in CO2-equivalent emissions.
+Computes reductions for CO2 and total GHGs in CO2-equivalent emissions.
"""
from functools import lru_cache, wraps
@@ -11,6 +11,7 @@
from io import StringIO
import fair
+from fair.RCPs import rcp3pd, rcp45, rcp6, rcp85
import numpy as np
import pandas as pd
import model.advanced_controls
@@ -30,6 +31,10 @@ def default(self, obj):
return obj.tolist()
return json.JSONEncoder.default(self, obj)
+
+###########----############----############----############----############
+# CO2-EQ CALCULATIONS AND PRIOR USE OF FAIR
+
@lru_cache
def fair_scm_cached(json_input: str):
input = json.loads(json_input)
@@ -89,11 +94,18 @@ def co2_ppm_calculator_cached(
ppm_calculator.name = 'co2_ppm_calculator'
return ppm_calculator
+
+
+###########----############----############----############----############
+# CO2 MODULE IMPORTS
+
class CO2Calcs(DataHandler):
"""CO2 Calcs module.
Arguments:
ac: advanced_cost.py object, storing settings to control model operation.
ch4_ppb_calculator:
+ ch4_megatons_avoided_or_reduced:
+ n2o_megatons_avoided_or_reduced:
soln_pds_net_grid_electricity_units_saved:
soln_pds_net_grid_electricity_units_used:
soln_pds_direct_co2_emissions_saved:
@@ -111,6 +123,8 @@ class CO2Calcs(DataHandler):
"""
def __init__(self, ac, soln_net_annual_funits_adopted=None, ch4_ppb_calculator=None,
+ ch4_megatons_avoided_or_reduced=None,
+ n2o_megatons_avoided_or_reduced=None,
soln_pds_net_grid_electricity_units_saved=None,
soln_pds_net_grid_electricity_units_used=None,
soln_pds_direct_co2eq_emissions_saved=None,
@@ -125,6 +139,8 @@ def __init__(self, ac, soln_net_annual_funits_adopted=None, ch4_ppb_calculator=N
ref_protected_deg_land=None, regimes=None):
self.ac = ac
self.ch4_ppb_calculator = ch4_ppb_calculator
+ self.ch4_megatons_avoided_or_reduced = ch4_megatons_avoided_or_reduced
+ self.n2o_megatons_avoided_or_reduced = n2o_megatons_avoided_or_reduced
self.soln_pds_net_grid_electricity_units_saved = soln_pds_net_grid_electricity_units_saved
self.soln_pds_net_grid_electricity_units_used = soln_pds_net_grid_electricity_units_used
self.soln_pds_direct_co2eq_emissions_saved = soln_pds_direct_co2eq_emissions_saved
@@ -160,6 +176,10 @@ def __init__(self, ac, soln_net_annual_funits_adopted=None, ch4_ppb_calculator=N
self.baseline = model.fairutil.baseline_emissions()
+
+###########----############----############----############----############
+# CO2 EMISSIONS CALCULATIONS
+
@lru_cache()
@data_func
def co2_mmt_reduced(self):
@@ -251,6 +271,61 @@ def co2eq_mmt_reduced(self):
m.name = "co2eq_mmt_reduced"
return m
+ @lru_cache()
+ @data_func
+ def co2only_mmt_reduced(self):
+ """CO2 MMT Reduced
+ Annual CO2 reductions by region are calculated by multiplying the estimated energy
+ unit savings by region by the emission factor of the energy unit in question by region
+ and year. In this sample the values used are the regional future grid BAU CO2-eq emission
+ intensity values (by year) from the AMPERE 3 MESSAGE Base model used in the IPCC 5th
+ Assessment Report WG3.
+
+ Reduced Grid MMT CO2 Emissions = NEU(t) * EF(e,t)
+
+ where
+ NEU(t) = Net Energy Units at time, t
+ EF(e,t) = CO2 Emissions Factor of REF energy grid at time, t
+ SolarPVUtil 'CO2 Calcs'!A64:K110
+ """
+ s = self.ac.report_start_year
+ e = self.ac.report_end_year
+ if (self.ac.solution_category != model.advanced_controls.SOLUTION_CATEGORY.LAND and
+ self.ac.solution_category != model.advanced_controls.SOLUTION_CATEGORY.OCEAN):
+ # RRS
+ co2eq_reduced_grid_emissions = self.co2eq_reduced_grid_emissions()
+ m = pd.DataFrame(0.0, columns=co2eq_reduced_grid_emissions.columns.copy(),
+ index=co2eq_reduced_grid_emissions.index.copy(), dtype=np.float64)
+ m.index = m.index.astype(int)
+ m = m.add(co2eq_reduced_grid_emissions.loc[s:e], fill_value=0)
+ m = m.add(self.co2eq_replaced_grid_emissions().loc[s:e], fill_value=0)
+ m = m.sub(self.co2eq_increased_grid_usage_emissions().loc[s:e], fill_value=0)
+ m = m.add(self.co2only_direct_reduced_emissions().loc[s:e], fill_value=0)
+ m = m.add(self.co2eq_reduced_fuel_emissions().loc[s:e], fill_value=0)
+ m = m.sub(self.co2eq_net_indirect_emissions().loc[s:e], fill_value=0)
+ else:
+ # LAND/OCEAN
+ if self.ac.solution_category == model.advanced_controls.SOLUTION_CATEGORY.LAND:
+ regions = model.dd.REGIONS
+ else:
+ regions = model.dd.OCEAN_REGIONS
+ index = pd.Index(list(range(2015, 2061)), name='Year')
+ m = pd.DataFrame(0., columns=regions, index=index, dtype=np.float64)
+ if (self.soln_pds_direct_co2eq_emissions_saved is not None or
+ self.soln_pds_direct_co2_emissions_saved is not None):
+ if self.ac.emissions_use_agg_co2eq is None or self.ac.emissions_use_agg_co2eq:
+ m = m.add(self.soln_pds_direct_co2eq_emissions_saved.loc[s:e], fill_value=0)
+ else:
+ m = m.add(self.soln_pds_direct_co2_emissions_saved.loc[s:e], fill_value=0)
+ if self.annual_land_area_harvested is not None:
+ m = m.sub(self.direct_emissions_from_harvesting().loc[s:e], fill_value=0)
+ if self.co2eq_reduced_grid_emissions() is not None:
+ m = m.add(self.co2eq_reduced_grid_emissions().loc[s:e], fill_value=0)
+ if self.co2eq_increased_grid_usage_emissions() is not None:
+ m = m.sub(self.co2eq_increased_grid_usage_emissions().loc[s:e], fill_value=0)
+ m.name = "co2only_mmt_reduced"
+ return m
+
@lru_cache()
@data_func
@@ -465,7 +540,6 @@ def co2eq_increased_grid_usage_emissions(self):
return None
return self.soln_pds_net_grid_electricity_units_used * self.conv_ref_grid_CO2eq_per_KWh
-
@lru_cache()
@data_func
def co2eq_direct_reduced_emissions(self):
@@ -481,6 +555,19 @@ def co2eq_direct_reduced_emissions(self):
return (self.soln_pds_direct_co2_emissions_saved / 1000000 +
self.soln_pds_direct_ch4_co2_emissions_saved / 1000000 +
self.soln_pds_direct_n2o_co2_emissions_saved / 1000000)
+
+ @data_func
+ def co2only_direct_reduced_emissions(self):
+ """Direct MMT CO2-eq Emissions Reduced = [DEm(Con,t) - DEm(Sol,t)] / 1000000
+
+ where
+ DEm(Con,t) = Direct Emissions of Conventional at time, t
+ DEm(Sol,t) = Direct Emissions of Solution at time, t
+
+ NOTE: Includes CH4-CO2-eq and N2O-CO2-eq
+ SolarPVUtil 'CO2 Calcs'!A344:K390
+ """
+ return (self.soln_pds_direct_co2_emissions_saved / 1000000)
@lru_cache()
@@ -543,9 +630,14 @@ def direct_emissions_from_harvesting(self):
self.ac.seq_rate_global * self.ac.harvest_frequency -
self.ac.carbon_not_emitted_after_harvesting) * C_TO_CO2EQ
+
+
+###########----############----############----############----############
+# UTILIZATION OF THE FaIR SIMPLE CLIMATE MODEL
+
@data_func
- def FaIR_CFT_baseline(self):
- """Return FaIR results for the baseline case.
+ def FaIR_CFT_baseline_co2eq(self):
+ """Return FaIR results for the baseline case in CO2eq emissions.
Finite Amplitude Impulse-Response simple climate-carbon-cycle model.
https://github.com/OMS-NetZero/FAIR
@@ -554,18 +646,25 @@ def FaIR_CFT_baseline(self):
C: CO2 concentration in ppm for the World.
F: Radiative forcing in watts per square meter
T: Change in temperature since pre-industrial time in Kelvin
+
+ Assumes all methane and nitrous oxide emissions are first converted into
+ CO2-eq emissions and then run FaIR in CO2-only mode. As a scientific note:
+ this is very crude and a bad use of the FaIR model since CH4 and N2O have
+ their own radiative forcings and lifetimes which CO2-eq poorly represents.
+
+ Assumes only one background emission of RCP4.5
"""
kwargs = model.fairutil.fair_scm_kwargs()
(C, F, T) = fair_scm(self.baseline.values, False, **kwargs)
result = pd.DataFrame({'C': C, 'F': F, 'T': T}, index=self.baseline.index)
- result.name = 'FaIR_CFT_baseline'
+ result.name = 'FaIR_CFT_baseline_co2eq'
return result
@lru_cache()
@data_func
- def FaIR_CFT(self):
- """Return FaIR results for the baseline + Drawdown solution.
+ def FaIR_CFT_Drawdown_co2eq(self):
+ """Return FaIR results for the baseline + Drawdown solution in CO2eq emissions.
Finite Amplitude Impulse-Response simple climate-carbon-cycle model.
https://github.com/OMS-NetZero/FAIR
@@ -588,28 +687,464 @@ def FaIR_CFT(self):
kwargs = model.fairutil.fair_scm_kwargs()
(C, F, T) = fair_scm(emissions.values, False, **kwargs)
result = pd.DataFrame({'C': C , 'F': F, 'T': T}, index=emissions.index)
- result.name = 'FaIR_CFT'
+ result.name = 'FaIR_CFT_Drawdown_co2eq'
return result
@lru_cache()
@data_func
- def FaIR_CFT_RCP45(self):
- """Return FaIR results for the RCP45 case.
+ def FaIR_CFT_baseline_RCP3(self):
+ """Return FaIR results for the baseline case of RCP3 (formerly rcp2.6).
Finite Amplitude Impulse-Response simple climate-carbon-cycle model.
https://github.com/OMS-NetZero/FAIR
- Returns DataFrame containing columns C, F, T:
- C: CO2 concentration in ppm for the World.
- F: Radiative forcing in watts per square meter
- T: Change in temperature since pre-industrial time in Kelvin
+ Returns 4 DataFrames for years 1765-2500 containing:
+ 1: Multigas concentrations for the World.
+ CO2(ppm), CH4(ppb), N2O(ppb)
+ 2: Radiative forcing in watts per square meter
+ CO2(Wm-2), CH4(Wm-2), N2O(Wm-2), others(Wm-2), total(Wm-2)
+ 3: Change in temperature since pre-industrial time in Celsius
+ 4: RCP emissions (39 individual gases)
"""
- kwargs = model.fairutil.fair_scm_kwargs()
- (C, F, T) = fair_scm(fair.RCPs.rcp45.Emissions.emissions[:, 0],False, **kwargs)
- result = pd.DataFrame({'C': C, 'F': F, 'T': T}, index=fair.RCPs.rcp45.Emissions.year)
- result.name = 'FaIR_CFT_RCP45'
+ emissions = rcp3pd.Emissions.emissions
+ rcpemissions = pd.DataFrame(emissions, index = range(1765,2501),
+ columns=['Year', 'FossilCO2 (Gt-C)', 'OtherCO2 (Gt-C)', 'CH4 (Mt-CH4)',
+ 'N2O (Mt-N2O)', 'SOx (Mt-S)', 'CO (Mt-CO)', 'NMVOC (Mt)',
+ 'NOx (Mt-N)', 'BC (Mt)', 'OC (Mt)', 'NH3 (Mt-N)', 'CF4 (kt)',
+ 'C2F6 (kt)', 'C6F14 (kt)', 'HFC23 (kt)', 'HFC32 (kt)',
+ 'HFC43_10 (kt)', 'HFC125 (kt)', 'HFC134a (kt)', 'HFC143a (kt)',
+ 'HFC227ea (kt)', 'HFC245fa (kt)', 'SF6 (kt)', 'CFC_11 (kt)',
+ 'CFC_12 (kt)', 'CFC_113 (kt)','CFC_114 (kt)','CFC_115 (kt)',
+ 'CARB_TET (kt)', 'MCF (kt)', 'HCFC_22 (kt)', 'HCFC_141B (kt)',
+ 'HCFC_142B (kt)', 'HALON1211 (kt)', 'HALON1202 (kt)',
+ 'HALON1301 (kt)', 'HALON2404 (kt)', 'CH3BR (kt)', 'CH3CL (kt)'])
+ rcpemissions.index.name="Year"
+ rcpemissions.name = 'FaIR_CFT_baseline_emis_rcp3'
+
+ (C,F,T) = fair.forward.fair_scm(emissions=emissions)
+ result1 = pd.DataFrame({'CO2(ppm)': C[:,0,], 'CH4(ppb)': C[:,1,], 'N2O(ppb)': C[:,2,]}, index=rcp3pd.Emissions.year)
+ result1.index.name="Year"
+ result1.name = 'FaIR_CFT_baseline_conc_rcp3'
+ result2 = pd.DataFrame({'CO2(Wm-2)': F[:,0,], 'CH4(Wm-2)': F[:,1,], 'N2O(Wm-2)': F[:,2,], 'others(Wm-2)': np.sum(F, axis=1)-F[:,0,]-F[:,1,]-F[:,2,], 'total(Wm-2)': np.sum(F, axis=1)}, index=rcp3pd.Emissions.year)
+ result2.index.name="Year"
+ result2.name = 'FaIR_CFT_baseline_forc_rcp3'
+ result3 = pd.DataFrame({'TempAnomaly(C)': T}, index=rcp3pd.Emissions.year)
+ result3.index.name="Year"
+ result3.name = 'FaIR_CFT_baseline_temp_rcp3'
+ return result1, result2, result3, rcpemissions
+
+ @lru_cache()
+ @data_func
+ def FaIR_CFT_baseline_RCP45(self):
+ """Return FaIR results for the baseline case of RCP4.5
+
+ Finite Amplitude Impulse-Response simple climate-carbon-cycle model.
+ https://github.com/OMS-NetZero/FAIR
+
+ Returns 4 DataFrames for years 1765-2500 containing:
+ 1: Multigas concentrations for the World.
+ CO2(ppm), CH4(ppb), N2O(ppb)
+ 2: Radiative forcing in watts per square meter
+ CO2(Wm-2), CH4(Wm-2), N2O(Wm-2), others(Wm-2), total(Wm-2)
+ 3: Change in temperature since pre-industrial time in Celsius
+ 4: RCP emissions (39 individual gases)
+ """
+ emissions = rcp45.Emissions.emissions
+ rcpemissions = pd.DataFrame(emissions, index = range(1765,2501),
+ columns=['Year', 'FossilCO2 (Gt-C)', 'OtherCO2 (Gt-C)', 'CH4 (Mt-CH4)',
+ 'N2O (Mt-N2O)', 'SOx (Mt-S)', 'CO (Mt-CO)', 'NMVOC (Mt)',
+ 'NOx (Mt-N)', 'BC (Mt)', 'OC (Mt)', 'NH3 (Mt-N)', 'CF4 (kt)',
+ 'C2F6 (kt)', 'C6F14 (kt)', 'HFC23 (kt)', 'HFC32 (kt)',
+ 'HFC43_10 (kt)', 'HFC125 (kt)', 'HFC134a (kt)', 'HFC143a (kt)',
+ 'HFC227ea (kt)', 'HFC245fa (kt)', 'SF6 (kt)', 'CFC_11 (kt)',
+ 'CFC_12 (kt)', 'CFC_113 (kt)','CFC_114 (kt)','CFC_115 (kt)',
+ 'CARB_TET (kt)', 'MCF (kt)', 'HCFC_22 (kt)', 'HCFC_141B (kt)',
+ 'HCFC_142B (kt)', 'HALON1211 (kt)', 'HALON1202 (kt)',
+ 'HALON1301 (kt)', 'HALON2404 (kt)', 'CH3BR (kt)', 'CH3CL (kt)'])
+ rcpemissions.index.name="Year"
+ rcpemissions.name = 'FaIR_CFT_baseline_emis_rcp45'
+
+ (C,F,T) = fair.forward.fair_scm(emissions=emissions)
+ result1 = pd.DataFrame({'CO2(ppm)': C[:,0,], 'CH4(ppb)': C[:,1,], 'N2O(ppb)': C[:,2,]}, index=rcp45.Emissions.year)
+ result1.index.name="Year"
+ result1.name = 'FaIR_CFT_baseline_conc_rcp45'
+ result2 = pd.DataFrame({'CO2(Wm-2)': F[:,0,], 'CH4(Wm-2)': F[:,1,], 'N2O(Wm-2)': F[:,2,], 'others(Wm-2)': np.sum(F, axis=1)-F[:,0,]-F[:,1,]-F[:,2,], 'total(Wm-2)': np.sum(F, axis=1)}, index=rcp45.Emissions.year)
+ result2.index.name="Year"
+ result2.name = 'FaIR_CFT_baseline_forc_rcp45'
+ result3 = pd.DataFrame({'TempAnomaly(C)': T}, index=rcp45.Emissions.year)
+ result3.index.name="Year"
+ result3.name = 'FaIR_CFT_baseline_temp_rcp45'
+ return result1, result2, result3, rcpemissions
+
+ @lru_cache()
+ @data_func
+ def FaIR_CFT_baseline_RCP6(self):
+ """Return FaIR results for the baseline case of RCP6.0
+
+ Finite Amplitude Impulse-Response simple climate-carbon-cycle model.
+ https://github.com/OMS-NetZero/FAIR
+
+ Returns 4 DataFrames for years 1765-2500 containing:
+ 1: Multigas concentrations for the World.
+ CO2(ppm), CH4(ppb), N2O(ppb)
+ 2: Radiative forcing in watts per square meter
+ CO2(Wm-2), CH4(Wm-2), N2O(Wm-2), others(Wm-2), total(Wm-2)
+ 3: Change in temperature since pre-industrial time in Celsius
+ 4: RCP emissions (39 individual gases)
+ """
+ emissions = rcp6.Emissions.emissions
+ rcpemissions = pd.DataFrame(emissions, index = range(1765,2501),
+ columns=['Year', 'FossilCO2 (Gt-C)', 'OtherCO2 (Gt-C)', 'CH4 (Mt-CH4)',
+ 'N2O (Mt-N2O)', 'SOx (Mt-S)', 'CO (Mt-CO)', 'NMVOC (Mt)',
+ 'NOx (Mt-N)', 'BC (Mt)', 'OC (Mt)', 'NH3 (Mt-N)', 'CF4 (kt)',
+ 'C2F6 (kt)', 'C6F14 (kt)', 'HFC23 (kt)', 'HFC32 (kt)',
+ 'HFC43_10 (kt)', 'HFC125 (kt)', 'HFC134a (kt)', 'HFC143a (kt)',
+ 'HFC227ea (kt)', 'HFC245fa (kt)', 'SF6 (kt)', 'CFC_11 (kt)',
+ 'CFC_12 (kt)', 'CFC_113 (kt)','CFC_114 (kt)','CFC_115 (kt)',
+ 'CARB_TET (kt)', 'MCF (kt)', 'HCFC_22 (kt)', 'HCFC_141B (kt)',
+ 'HCFC_142B (kt)', 'HALON1211 (kt)', 'HALON1202 (kt)',
+ 'HALON1301 (kt)', 'HALON2404 (kt)', 'CH3BR (kt)', 'CH3CL (kt)'])
+ rcpemissions.index.name="Year"
+ rcpemissions.name = 'FaIR_CFT_baseline_emis_rcp6'
+
+ (C,F,T) = fair.forward.fair_scm(emissions=emissions)
+ result1 = pd.DataFrame({'CO2(ppm)': C[:,0,], 'CH4(ppb)': C[:,1,], 'N2O(ppb)': C[:,2,]}, index=rcp6.Emissions.year)
+ result1.index.name="Year"
+ result1.name = 'FaIR_CFT_baseline_conc_rcp6'
+ result2 = pd.DataFrame({'CO2(Wm-2)': F[:,0,], 'CH4(Wm-2)': F[:,1,], 'N2O(Wm-2)': F[:,2,], 'others(Wm-2)': np.sum(F, axis=1)-F[:,0,]-F[:,1,]-F[:,2,], 'total(Wm-2)': np.sum(F, axis=1)}, index=rcp6.Emissions.year)
+ result2.index.name="Year"
+ result2.name = 'FaIR_CFT_baseline_forc_rcp6'
+ result3 = pd.DataFrame({'TempAnomaly(C)': T}, index=rcp6.Emissions.year)
+ result3.index.name="Year"
+ result3.name = 'FaIR_CFT_baseline_temp_rcp6'
+ return result1, result2, result3, rcpemissions
+
+ @data_func
+ def FaIR_CFT_baseline_RCP85(self):
+ """Return FaIR results for the baseline case of RCP8.5
+
+ Finite Amplitude Impulse-Response simple climate-carbon-cycle model.
+ https://github.com/OMS-NetZero/FAIR
+
+ Returns 4 DataFrames for years 1765-2500 containing:
+ 1: Multigas concentrations for the World.
+ CO2(ppm), CH4(ppb), N2O(ppb)
+ 2: Radiative forcing in watts per square meter
+ CO2(Wm-2), CH4(Wm-2), N2O(Wm-2), others(Wm-2), total(Wm-2)
+ 3: Change in temperature since pre-industrial time in Celsius
+ 4: RCP emissions (39 individual gases)
+ """
+ emissions = rcp85.Emissions.emissions
+ rcpemissions = pd.DataFrame(emissions, index = range(1765,2501),
+ columns=['Year', 'FossilCO2 (Gt-C)', 'OtherCO2 (Gt-C)', 'CH4 (Mt-CH4)',
+ 'N2O (Mt-N2O)', 'SOx (Mt-S)', 'CO (Mt-CO)', 'NMVOC (Mt)',
+ 'NOx (Mt-N)', 'BC (Mt)', 'OC (Mt)', 'NH3 (Mt-N)', 'CF4 (kt)',
+ 'C2F6 (kt)', 'C6F14 (kt)', 'HFC23 (kt)', 'HFC32 (kt)',
+ 'HFC43_10 (kt)', 'HFC125 (kt)', 'HFC134a (kt)', 'HFC143a (kt)',
+ 'HFC227ea (kt)', 'HFC245fa (kt)', 'SF6 (kt)', 'CFC_11 (kt)',
+ 'CFC_12 (kt)', 'CFC_113 (kt)','CFC_114 (kt)','CFC_115 (kt)',
+ 'CARB_TET (kt)', 'MCF (kt)', 'HCFC_22 (kt)', 'HCFC_141B (kt)',
+ 'HCFC_142B (kt)', 'HALON1211 (kt)', 'HALON1202 (kt)',
+ 'HALON1301 (kt)', 'HALON2404 (kt)', 'CH3BR (kt)', 'CH3CL (kt)'])
+ rcpemissions.index.name="Year"
+ rcpemissions.name = 'FaIR_CFT_baseline_emis_rcp85'
+
+ (C,F,T) = fair.forward.fair_scm(emissions=emissions)
+ result1 = pd.DataFrame({'CO2(ppm)': C[:,0,], 'CH4(ppb)': C[:,1,], 'N2O(ppb)': C[:,2,]}, index=rcp85.Emissions.year)
+ result1.index.name="Year"
+ result1.name = 'FaIR_CFT_baseline_conc_rcp85'
+ result2 = pd.DataFrame({'CO2(Wm-2)': F[:,0,], 'CH4(Wm-2)': F[:,1,], 'N2O(Wm-2)': F[:,2,], 'others(Wm-2)': np.sum(F, axis=1)-F[:,0,]-F[:,1,]-F[:,2,], 'total(Wm-2)': np.sum(F, axis=1)}, index=rcp85.Emissions.year)
+ result2.index.name="Year"
+ result2.name = 'FaIR_CFT_baseline_forc_rcp85'
+ result3 = pd.DataFrame({'TempAnomaly(C)': T}, index=rcp85.Emissions.year)
+ result3.index.name="Year"
+ result3.name = 'FaIR_CFT_baseline_temp_rcp85'
+ return result1, result2, result3, rcpemissions
+
+ @lru_cache()
+ @lru_cache()
+ @data_func
+ def ghg_emissions_reductions_global_annual(self):
+ """ Return annual emission reductions for 2014-2060.
+ Columns of CO2 (Gt-C), CH4 (Mt-CH4), N2O (Mt-N2O)
+ """
+ # N2O Emission reductions if applicable
+ if self.n2o_megatons_avoided_or_reduced is not None:
+ n2oreduction = self.n2o_megatons_avoided_or_reduced['World']
+ else:
+ n2oreduction = 0.0
+ # CH4 Emission reductions if applicable
+ if self.ch4_megatons_avoided_or_reduced is not None:
+ ch4reduction = self.ch4_megatons_avoided_or_reduced['World']
+ else:
+ ch4reduction = 0.0
+
+ # CO2 Emission reductions from RRS of Squestered Land
+ co2only_mmt_reduced = self.co2only_mmt_reduced()
+ if co2only_mmt_reduced is not None:
+ co2reduction = (co2only_mmt_reduced['World'] / 1000.0) / C_TO_CO2EQ
+
+ co2_sequestered_global = self.co2_sequestered_global()
+ if co2_sequestered_global is not None:
+ co2reduction = (co2_sequestered_global['All'] / 1000.0) / C_TO_CO2EQ
+
+ co2reduction.loc[:self.ac.report_start_year - 1] = 0.0
+ co2reduction.loc[self.ac.report_end_year + 1:] = 0.0
+
+ result = pd.DataFrame({'CO2 (Gt-C)': co2reduction , 'CH4 (Mt-CH4)': ch4reduction, 'N2O (Mt-N2O)': n2oreduction})
+ result.name = 'ghg_emissions_reductions_global_annual'
return result
+
+
+ @lru_cache()
+ @data_func
+ def ghg_emissions_reductions_global_cumulative(self):
+ """ Return cumulative emission reductions for 2014-2060.
+ For CO2 (Gt-C), CH4 (Mt-CH4), N2O (Mt-N2O)
+ """
+ annual_reductions = self.ghg_emissions_reductions_global_annual()
+ result = annual_reductions.sum(axis=0)
+ result.name = 'ghg_emissions_reductions_global_cumulative'
+ return result
+
+
+ @lru_cache()
+ @data_func
+ def FaIR_CFT_Drawdown_RCP3(self):
+ """Return FaIR results for the baseline + Drawdown case of RCP3 (formerly RCP2.6)
+
+ Finite Amplitude Impulse-Response simple climate-carbon-cycle model.
+ https://github.com/OMS-NetZero/FAIR
+
+ Returns 4 DataFrames for years 1765-2500 containing:
+ 1: Multigas concentrations for the World.
+ CO2(ppm), CH4(ppb), N2O(ppb)
+ 2: Radiative forcing in watts per square meter
+ CO2(Wm-2), CH4(Wm-2), N2O(Wm-2), others(Wm-2), total(Wm-2)
+ 3: Change in temperature since pre-industrial time in Celsius
+ 4: RCP emissions (39 individual gases)
+ """
+ # Call on the solution emission reductions
+ annual_reductions = self.ghg_emissions_reductions_global_annual()
+ # Call on the RCP scenario
+ rcpemissions = rcp3pd.Emissions.emissions
+ rcpemissionsnew = pd.DataFrame(rcpemissions, index = range(1765,2501),
+ columns=['Year','FossilCO2 (Gt-C)', 'OtherCO2 (Gt-C)', 'CH4 (Mt-CH4)',
+ 'N2O (Mt-N2O)', 'SOx (Mt-S)', 'CO (Mt-CO)', 'NMVOC (Mt)',
+ 'NOx (Mt-N)', 'BC (Mt)', 'OC (Mt)', 'NH3 (Mt-N)', 'CF4 (kt)',
+ 'C2F6 (kt)', 'C6F14 (kt)', 'HFC23 (kt)', 'HFC32 (kt)',
+ 'HFC43_10 (kt)', 'HFC125 (kt)', 'HFC134a (kt)', 'HFC143a (kt)',
+ 'HFC227ea (kt)', 'HFC245fa (kt)', 'SF6 (kt)', 'CFC_11 (kt)',
+ 'CFC_12 (kt)', 'CFC_113 (kt)','CFC_114 (kt)','CFC_115 (kt)',
+ 'CARB_TET (kt)', 'MCF (kt)', 'HCFC_22 (kt)', 'HCFC_141B (kt)',
+ 'HCFC_142B (kt)', 'HALON1211 (kt)', 'HALON1202 (kt)',
+ 'HALON1301 (kt)', 'HALON2404 (kt)', 'CH3BR (kt)', 'CH3CL (kt)'])
+ rcpemissionsnew.index.name="Year"
+ rcpemissionsnew.name = 'FaIR_CFT_Drawdown_emis_rcp3'
+ rcpemissionschopped = rcpemissionsnew.iloc[249:296,:]
+
+ # Replace the CO2 emissions
+ a0 = rcpemissionschopped.iloc[:,1]- annual_reductions.iloc[:,0]
+ rcpemissionsnew.iloc[249:296,1] = a0
+ # Replace the CH4 emissions
+ a1 = rcpemissionschopped.iloc[:,3]- annual_reductions.iloc[:,1]
+ rcpemissionsnew.iloc[249:296,3] = a1
+ # Replace the N2O emissions
+ a2 = rcpemissionschopped.iloc[:,4]- annual_reductions.iloc[:,2]
+ rcpemissionsnew.iloc[249:296,4] = a2
+
+ emissionsnew = rcpemissionsnew.to_numpy()
+ (C,F,T) = fair.forward.fair_scm(emissions=emissionsnew)
+ result1 = pd.DataFrame({'CO2(ppm)': C[:,0,], 'CH4(ppb)': C[:,1,], 'N2O(ppb)': C[:,2,]}, index=rcp3pd.Emissions.year)
+ result1.index.name="Year"
+ result1.name = 'FaIR_CFT_Drawdown_conc_rcp3'
+ result2 = pd.DataFrame({'CO2(Wm-2)': F[:,0,], 'CH4(Wm-2)': F[:,1,], 'N2O(Wm-2)': F[:,2,], 'others(Wm-2)': np.sum(F, axis=1)-F[:,0,]-F[:,1,]-F[:,2,], 'total(Wm-2)': np.sum(F, axis=1)}, index=rcp3pd.Emissions.year)
+ result2.index.name="Year"
+ result2.name = 'FaIR_CFT_Drawdown_forc_rcp3'
+ result3 = pd.DataFrame({'TempAnomaly(C)': T}, index=rcp3pd.Emissions.year)
+ result3.index.name="Year"
+ result3.name = 'FaIR_CFT_Drawdown_temp_rcp3'
+ return result1, result2, result3, rcpemissionsnew
+
+ @lru_cache()
+ @data_func
+ def FaIR_CFT_Drawdown_RCP45(self):
+ """Return FaIR results for the baseline + Drawdown case of RCP4.5
+
+ Finite Amplitude Impulse-Response simple climate-carbon-cycle model.
+ https://github.com/OMS-NetZero/FAIR
+
+ Returns 4 DataFrames for years 1765-2500 containing:
+ 1: Multigas concentrations for the World.
+ CO2(ppm), CH4(ppb), N2O(ppb)
+ 2: Radiative forcing in watts per square meter
+ CO2(Wm-2), CH4(Wm-2), N2O(Wm-2), others(Wm-2), total(Wm-2)
+ 3: Change in temperature since pre-industrial time in Celsius
+ 4: RCP emissions (39 individual gases)
+ """
+ # Call on the solution emission reductions
+ annual_reductions = self.ghg_emissions_reductions_global_annual()
+ # Call on the RCP scenario
+ rcpemissions = rcp45.Emissions.emissions
+ rcpemissionsnew = pd.DataFrame(rcpemissions, index = range(1765,2501),
+ columns=['Year','FossilCO2 (Gt-C)', 'OtherCO2 (Gt-C)', 'CH4 (Mt-CH4)',
+ 'N2O (Mt-N2O)', 'SOx (Mt-S)', 'CO (Mt-CO)', 'NMVOC (Mt)',
+ 'NOx (Mt-N)', 'BC (Mt)', 'OC (Mt)', 'NH3 (Mt-N)', 'CF4 (kt)',
+ 'C2F6 (kt)', 'C6F14 (kt)', 'HFC23 (kt)', 'HFC32 (kt)',
+ 'HFC43_10 (kt)', 'HFC125 (kt)', 'HFC134a (kt)', 'HFC143a (kt)',
+ 'HFC227ea (kt)', 'HFC245fa (kt)', 'SF6 (kt)', 'CFC_11 (kt)',
+ 'CFC_12 (kt)', 'CFC_113 (kt)','CFC_114 (kt)','CFC_115 (kt)',
+ 'CARB_TET (kt)', 'MCF (kt)', 'HCFC_22 (kt)', 'HCFC_141B (kt)',
+ 'HCFC_142B (kt)', 'HALON1211 (kt)', 'HALON1202 (kt)',
+ 'HALON1301 (kt)', 'HALON2404 (kt)', 'CH3BR (kt)', 'CH3CL (kt)'])
+ rcpemissionsnew.index.name="Year"
+ rcpemissionsnew.name = 'FaIR_CFT_Drawdown_emis_rcp45'
+ rcpemissionschopped = rcpemissionsnew.iloc[249:296,:]
+
+ # Replace the CO2 emissions
+ a0 = rcpemissionschopped.iloc[:,1]- annual_reductions.iloc[:,0]
+ rcpemissionsnew.iloc[249:296,1] = a0
+ # Replace the CH4 emissions
+ a1 = rcpemissionschopped.iloc[:,3]- annual_reductions.iloc[:,1]
+ rcpemissionsnew.iloc[249:296,3] = a1
+ # Replace the N2O emissions
+ a2 = rcpemissionschopped.iloc[:,4]- annual_reductions.iloc[:,2]
+ rcpemissionsnew.iloc[249:296,4] = a2
+
+ emissionsnew = rcpemissionsnew.to_numpy()
+ (C,F,T) = fair.forward.fair_scm(emissions=emissionsnew)
+ result1 = pd.DataFrame({'CO2(ppm)': C[:,0,], 'CH4(ppb)': C[:,1,], 'N2O(ppb)': C[:,2,]}, index=rcp45.Emissions.year)
+ result1.index.name="Year"
+ result1.name = 'FaIR_CFT_Drawdown_conc_rcp45'
+ result2 = pd.DataFrame({'CO2(Wm-2)': F[:,0,], 'CH4(Wm-2)': F[:,1,], 'N2O(Wm-2)': F[:,2,], 'others(Wm-2)': np.sum(F, axis=1)-F[:,0,]-F[:,1,]-F[:,2,], 'total(Wm-2)': np.sum(F, axis=1)}, index=rcp45.Emissions.year)
+ result2.index.name="Year"
+ result2.name = 'FaIR_CFT_Drawdown_forc_rcp45'
+ result3 = pd.DataFrame({'TempAnomaly(C)': T}, index=rcp45.Emissions.year)
+ result3.index.name="Year"
+ result3.name = 'FaIR_CFT_Drawdown_temp_rcp45'
+ return result1, result2, result3, rcpemissionsnew
+
+ @lru_cache()
+ @data_func
+ def FaIR_CFT_Drawdown_RCP6(self):
+ """Return FaIR results for the baseline + Drawdown case of RCP6.0
+
+ Finite Amplitude Impulse-Response simple climate-carbon-cycle model.
+ https://github.com/OMS-NetZero/FAIR
+
+ Returns 4 DataFrames for years 1765-2500 containing:
+ 1: Multigas concentrations for the World.
+ CO2(ppm), CH4(ppb), N2O(ppb)
+ 2: Radiative forcing in watts per square meter
+ CO2(Wm-2), CH4(Wm-2), N2O(Wm-2), others(Wm-2), total(Wm-2)
+ 3: Change in temperature since pre-industrial time in Celsius
+ 4: RCP emissions (39 individual gases)
+ """
+ # Call on the solution emission reductions
+ annual_reductions = self.ghg_emissions_reductions_global_annual()
+ # Call on the RCP scenario
+ rcpemissions = rcp6.Emissions.emissions
+ rcpemissionsnew = pd.DataFrame(rcpemissions, index = range(1765,2501),
+ columns=['Year','FossilCO2 (Gt-C)', 'OtherCO2 (Gt-C)', 'CH4 (Mt-CH4)',
+ 'N2O (Mt-N2O)', 'SOx (Mt-S)', 'CO (Mt-CO)', 'NMVOC (Mt)',
+ 'NOx (Mt-N)', 'BC (Mt)', 'OC (Mt)', 'NH3 (Mt-N)', 'CF4 (kt)',
+ 'C2F6 (kt)', 'C6F14 (kt)', 'HFC23 (kt)', 'HFC32 (kt)',
+ 'HFC43_10 (kt)', 'HFC125 (kt)', 'HFC134a (kt)', 'HFC143a (kt)',
+ 'HFC227ea (kt)', 'HFC245fa (kt)', 'SF6 (kt)', 'CFC_11 (kt)',
+ 'CFC_12 (kt)', 'CFC_113 (kt)','CFC_114 (kt)','CFC_115 (kt)',
+ 'CARB_TET (kt)', 'MCF (kt)', 'HCFC_22 (kt)', 'HCFC_141B (kt)',
+ 'HCFC_142B (kt)', 'HALON1211 (kt)', 'HALON1202 (kt)',
+ 'HALON1301 (kt)', 'HALON2404 (kt)', 'CH3BR (kt)', 'CH3CL (kt)'])
+ rcpemissionsnew.index.name="Year"
+ rcpemissionsnew.name = 'FaIR_CFT_Drawdown_emis_rcp6'
+ rcpemissionschopped = rcpemissionsnew.iloc[249:296,:]
+
+ # Replace the CO2 emissions
+ a0 = rcpemissionschopped.iloc[:,1]- annual_reductions.iloc[:,0]
+ rcpemissionsnew.iloc[249:296,1] = a0
+ # Replace the CH4 emissions
+ a1 = rcpemissionschopped.iloc[:,3]- annual_reductions.iloc[:,1]
+ rcpemissionsnew.iloc[249:296,3] = a1
+ # Replace the N2O emissions
+ a2 = rcpemissionschopped.iloc[:,4]- annual_reductions.iloc[:,2]
+ rcpemissionsnew.iloc[249:296,4] = a2
+
+ emissionsnew = rcpemissionsnew.to_numpy()
+ (C,F,T) = fair.forward.fair_scm(emissions=emissionsnew)
+ result1 = pd.DataFrame({'CO2(ppm)': C[:,0,], 'CH4(ppb)': C[:,1,], 'N2O(ppb)': C[:,2,]}, index=rcp6.Emissions.year)
+ result1.index.name="Year"
+ result1.name = 'FaIR_CFT_Drawdown_conc_rcp6'
+ result2 = pd.DataFrame({'CO2(Wm-2)': F[:,0,], 'CH4(Wm-2)': F[:,1,], 'N2O(Wm-2)': F[:,2,], 'others(Wm-2)': np.sum(F, axis=1)-F[:,0,]-F[:,1,]-F[:,2,], 'total(Wm-2)': np.sum(F, axis=1)}, index=rcp6.Emissions.year)
+ result2.index.name="Year"
+ result2.name = 'FaIR_CFT_Drawdown_forc_rcp6'
+ result3 = pd.DataFrame({'TempAnomaly(C)': T}, index=rcp6.Emissions.year)
+ result3.index.name="Year"
+ result3.name = 'FaIR_CFT_Drawdown_temp_rcp6'
+ return result1, result2, result3, rcpemissionsnew
+
+ @lru_cache()
+ @data_func
+ def FaIR_CFT_Drawdown_RCP85(self):
+ """Return FaIR results for the baseline + Drawdown case of RCP8.5
+
+ Finite Amplitude Impulse-Response simple climate-carbon-cycle model.
+ https://github.com/OMS-NetZero/FAIR
+
+ Returns 4 DataFrames for years 1765-2500 containing:
+ 1: Multigas concentrations for the World.
+ CO2(ppm), CH4(ppb), N2O(ppb)
+ 2: Radiative forcing in watts per square meter
+ CO2(Wm-2), CH4(Wm-2), N2O(Wm-2), others(Wm-2), total(Wm-2)
+ 3: Change in temperature since pre-industrial time in Celsius
+ 4: RCP emissions (39 individual gases)
+ """
+ # Call on the solution emission reductions
+ annual_reductions = self.ghg_emissions_reductions_global_annual()
+ # Call on the RCP scenario
+ rcpemissions = rcp85.Emissions.emissions
+ rcpemissionsnew = pd.DataFrame(rcpemissions, index = range(1765,2501),
+ columns=['Year','FossilCO2 (Gt-C)', 'OtherCO2 (Gt-C)', 'CH4 (Mt-CH4)',
+ 'N2O (Mt-N2O)', 'SOx (Mt-S)', 'CO (Mt-CO)', 'NMVOC (Mt)',
+ 'NOx (Mt-N)', 'BC (Mt)', 'OC (Mt)', 'NH3 (Mt-N)', 'CF4 (kt)',
+ 'C2F6 (kt)', 'C6F14 (kt)', 'HFC23 (kt)', 'HFC32 (kt)',
+ 'HFC43_10 (kt)', 'HFC125 (kt)', 'HFC134a (kt)', 'HFC143a (kt)',
+ 'HFC227ea (kt)', 'HFC245fa (kt)', 'SF6 (kt)', 'CFC_11 (kt)',
+ 'CFC_12 (kt)', 'CFC_113 (kt)','CFC_114 (kt)','CFC_115 (kt)',
+ 'CARB_TET (kt)', 'MCF (kt)', 'HCFC_22 (kt)', 'HCFC_141B (kt)',
+ 'HCFC_142B (kt)', 'HALON1211 (kt)', 'HALON1202 (kt)',
+ 'HALON1301 (kt)', 'HALON2404 (kt)', 'CH3BR (kt)', 'CH3CL (kt)'])
+ rcpemissionsnew.index.name="Year"
+ rcpemissionsnew.name = 'FaIR_CFT_Drawdown_emis_rcp85'
+ rcpemissionschopped = rcpemissionsnew.iloc[249:296,:]
+
+ # Replace the CO2 emissions
+ a0 = rcpemissionschopped.iloc[:,1]- annual_reductions.iloc[:,0]
+ rcpemissionsnew.iloc[249:296,1] = a0
+ # Replace the CH4 emissions
+ a1 = rcpemissionschopped.iloc[:,3]- annual_reductions.iloc[:,1]
+ rcpemissionsnew.iloc[249:296,3] = a1
+ # Replace the N2O emissions
+ a2 = rcpemissionschopped.iloc[:,4]- annual_reductions.iloc[:,2]
+ rcpemissionsnew.iloc[249:296,4] = a2
+
+ emissionsnew = rcpemissionsnew.to_numpy()
+ (C,F,T) = fair.forward.fair_scm(emissions=emissionsnew)
+ result1 = pd.DataFrame({'CO2(ppm)': C[:,0,], 'CH4(ppb)': C[:,1,], 'N2O(ppb)': C[:,2,]}, index=rcp85.Emissions.year)
+ result1.index.name="Year"
+ result1.name = 'FaIR_CFT_Drawdown_conc_rcp85'
+ result2 = pd.DataFrame({'CO2(Wm-2)': F[:,0,], 'CH4(Wm-2)': F[:,1,], 'N2O(Wm-2)': F[:,2,], 'others(Wm-2)': np.sum(F, axis=1)-F[:,0,]-F[:,1,]-F[:,2,], 'total(Wm-2)': np.sum(F, axis=1)}, index=rcp85.Emissions.year)
+ result2.index.name="Year"
+ result2.name = 'FaIR_CFT_Drawdown_forc_rcp85'
+ result3 = pd.DataFrame({'TempAnomaly(C)': T}, index=rcp85.Emissions.year)
+ result3.index.name="Year"
+ result3.name = 'FaIR_CFT_Drawdown_temp_rcp85'
+ return result1, result2, result3, rcpemissionsnew
+
+
+###########----############----############----############----############
+## PRIOR RADIATIVE FORCING EQUATIONS USED FOR CO2-EQ CALCULATIONS
+
# The following formulae come from the SolarPVUtil Excel implementation of 27Aug18.
# There was no explanation of where they came from or what they really mean.
diff --git a/model/emissionsfactors.py b/model/emissionsfactors.py
index 8db09c050..416c12a06 100644
--- a/model/emissionsfactors.py
+++ b/model/emissionsfactors.py
@@ -31,6 +31,9 @@ def __init__(self, conversion_source=None):
if self.conversion_source == CO2EQ_SOURCE.AR5_WITH_FEEDBACK:
self.CH4multiplier = 34
self.N2Omultiplier = 298
+ elif self.conversion_source == CO2EQ_SOURCE.AR5_WITHOUT_FEEDBACK:
+ self.CH4multiplier = 28
+ self.N2Omultiplier = 265
elif self.conversion_source == CO2EQ_SOURCE.AR4:
self.CH4multiplier = 25
self.N2Omultiplier = 298
diff --git a/model/n2ocalcs.py b/model/n2ocalcs.py
new file mode 100644
index 000000000..b2fccfe10
--- /dev/null
+++ b/model/n2ocalcs.py
@@ -0,0 +1,69 @@
+"""N2O Calcs module.
+
+"""
+
+from functools import lru_cache
+import numpy as np
+import pandas as pd
+
+from model.data_handler import DataHandler
+from model.decorators import data_func
+from model import emissionsfactors
+
+
+class N2OCalcs(DataHandler):
+ """N2O Calcs module.
+ Arguments:
+ ac: advanced_cost.py object, storing settings to control model operation.
+ soln_net_annual_funits_adopted: annual functional/land units
+ soln_pds_direct_n2o_co2_emissions_saved: direct n2o emissions avoided per land unit
+ (not used for RRS).
+ """
+
+ def __init__(self, ac, soln_net_annual_funits_adopted,
+ soln_pds_direct_n2o_co2_emissions_saved=None):
+ self.ac = ac
+ self.soln_net_annual_funits_adopted = soln_net_annual_funits_adopted
+ self.soln_pds_direct_n2o_co2_emissions_saved = soln_pds_direct_n2o_co2_emissions_saved
+
+
+ @lru_cache()
+ def n2o_tons_reduced(self):
+ """n2o reduced from the RRS model, in tons n2o per year.
+ """
+ if self.ac.n2o_is_co2eq:
+ ef = emissionsfactors.CO2Equiv(self.ac.co2eq_conversion_source)
+ result = (self.soln_net_annual_funits_adopted * self.ac.n2o_co2_per_funit)/ef.N2Omultiplier
+ else:
+ result = self.soln_net_annual_funits_adopted * self.ac.n2o_co2_per_funit
+ result.loc[:self.ac.report_start_year - 1] = 0.0
+ result.loc[self.ac.report_end_year + 1:] = 0.0
+ result.name = "n2o_tons_reduced"
+ return result
+
+
+ @lru_cache()
+ def avoided_direct_emissions_n2o_land(self):
+ """n2o emissions avoided, in tons per year
+ """
+ ef = emissionsfactors.CO2Equiv(self.ac.co2eq_conversion_source)
+ result = self.soln_pds_direct_n2o_co2_emissions_saved.copy(deep=True) / ef.N2Omultiplier
+ result.loc[:self.ac.report_start_year - 1] = 0.0
+ result.loc[self.ac.report_end_year + 1:] = 0.0
+ result.name = "avoided_direct_emissions_n2o_land"
+ return result
+
+
+ @lru_cache()
+ def n2o_megatons_avoided_or_reduced(self):
+ """n2o emissions avoided or reduced, Mega in tons per year (units needed for the FaIR model)
+ """
+ if self.soln_pds_direct_n2o_co2_emissions_saved is not None:
+ n2o_tons = self.avoided_direct_emissions_n2o_land()
+ else:
+ n2o_tons = self.n2o_tons_reduced()
+
+ result = n2o_tons * 0.000001
+ result.name = "n2o_megatons_avoided_or_reduced"
+ return result
+
diff --git a/solution/biogas/__init__.py b/solution/biogas/__init__.py
index e9114d60e..71a765069 100644
--- a/solution/biogas/__init__.py
+++ b/solution/biogas/__init__.py
@@ -11,6 +11,7 @@
from model import advanced_controls as ac
from model import ch4calcs
from model import co2calcs
+from model import n2ocalcs
from model import customadoption
from model import dd
from model import emissionsfactors
@@ -336,8 +337,13 @@ def __init__(self, scenario=None):
self.c4 = ch4calcs.CH4Calcs(ac=self.ac,
soln_net_annual_funits_adopted=soln_net_annual_funits_adopted)
+ self.n2o = n2ocalcs.N2OCalcs(ac=self.ac,
+ soln_net_annual_funits_adopted=soln_net_annual_funits_adopted)
+
self.c2 = co2calcs.CO2Calcs(ac=self.ac,
ch4_ppb_calculator=self.c4.ch4_ppb_calculator(),
+ ch4_megatons_avoided_or_reduced=self.c4.ch4_megatons_avoided_or_reduced(),
+ n2o_megatons_avoided_or_reduced=self.n2o.n2o_megatons_avoided_or_reduced(),
soln_pds_net_grid_electricity_units_saved=self.ua.soln_pds_net_grid_electricity_units_saved(),
soln_pds_net_grid_electricity_units_used=self.ua.soln_pds_net_grid_electricity_units_used(),
soln_pds_direct_co2_emissions_saved=self.ua.soln_pds_direct_co2_emissions_saved(),
diff --git a/solution/biogas_small/__init__.py b/solution/biogas_small/__init__.py
index d1168135f..6411170b2 100644
--- a/solution/biogas_small/__init__.py
+++ b/solution/biogas_small/__init__.py
@@ -11,6 +11,7 @@
from model import advanced_controls as ac
from model import ch4calcs
from model import co2calcs
+from model import n2ocalcs
from model import customadoption
from model import dd
from model import emissionsfactors
@@ -319,8 +320,13 @@ def __init__(self, scenario=None):
self.c4 = ch4calcs.CH4Calcs(ac=self.ac,
soln_net_annual_funits_adopted=soln_net_annual_funits_adopted)
+ self.n2o = n2ocalcs.N2OCalcs(ac=self.ac,
+ soln_net_annual_funits_adopted=soln_net_annual_funits_adopted)
+
self.c2 = co2calcs.CO2Calcs(ac=self.ac,
ch4_ppb_calculator=self.c4.ch4_ppb_calculator(),
+ ch4_megatons_avoided_or_reduced=self.c4.ch4_megatons_avoided_or_reduced(),
+ n2o_megatons_avoided_or_reduced=self.n2o.n2o_megatons_avoided_or_reduced(),
soln_pds_net_grid_electricity_units_saved=self.ua.soln_pds_net_grid_electricity_units_saved(),
soln_pds_net_grid_electricity_units_used=self.ua.soln_pds_net_grid_electricity_units_used(),
soln_pds_direct_co2_emissions_saved=self.ua.soln_pds_direct_co2_emissions_saved(),
diff --git a/solution/biomass/__init__.py b/solution/biomass/__init__.py
index 68d537efd..3c53d4ddc 100644
--- a/solution/biomass/__init__.py
+++ b/solution/biomass/__init__.py
@@ -357,6 +357,7 @@ def __init__(self, scenario=None):
self.c2 = co2calcs.CO2Calcs(ac=self.ac,
ch4_ppb_calculator=self.c4.ch4_ppb_calculator(),
+ ch4_megatons_avoided_or_reduced=self.c4.ch4_megatons_avoided_or_reduced(),
soln_pds_net_grid_electricity_units_saved=self.ua.soln_pds_net_grid_electricity_units_saved(),
soln_pds_net_grid_electricity_units_used=self.ua.soln_pds_net_grid_electricity_units_used(),
soln_pds_direct_co2_emissions_saved=self.ua.soln_pds_direct_co2_emissions_saved(),
diff --git a/solution/improvedrice/__init__.py b/solution/improvedrice/__init__.py
index 4805fff6d..3a61b0de1 100644
--- a/solution/improvedrice/__init__.py
+++ b/solution/improvedrice/__init__.py
@@ -12,6 +12,7 @@
from model import aez
from model import ch4calcs
from model import co2calcs
+from model import n2ocalcs
from model import customadoption
from model import dd
from model import emissionsfactors
@@ -377,8 +378,15 @@ def __init__(self, scenario=None):
soln_pds_direct_ch4_co2_emissions_saved=self.ua.direct_ch4_co2_emissions_saved_land(),
soln_net_annual_funits_adopted=soln_net_annual_funits_adopted)
+ self.n2o = n2ocalcs.N2OCalcs(ac=self.ac,
+ soln_pds_direct_n2o_co2_emissions_saved=self.ua.direct_n2o_co2_emissions_saved_land(),
+ soln_net_annual_funits_adopted=soln_net_annual_funits_adopted)
+
+
self.c2 = co2calcs.CO2Calcs(ac=self.ac,
ch4_ppb_calculator=self.c4.ch4_ppb_calculator(),
+ ch4_megatons_avoided_or_reduced=self.c4.ch4_megatons_avoided_or_reduced(),
+ n2o_megatons_avoided_or_reduced=self.n2o.n2o_megatons_avoided_or_reduced(),
soln_pds_net_grid_electricity_units_saved=self.ua.soln_pds_net_grid_electricity_units_saved(),
soln_pds_net_grid_electricity_units_used=self.ua.soln_pds_net_grid_electricity_units_used(),
soln_pds_direct_co2eq_emissions_saved=self.ua.direct_co2eq_emissions_saved_land(),
@@ -395,3 +403,5 @@ def __init__(self, scenario=None):
regime_distribution=self.ae.get_land_distribution(),
regimes=dd.THERMAL_MOISTURE_REGIMES8)
+
+
diff --git a/solution/landfillmethane/__init__.py b/solution/landfillmethane/__init__.py
index 647217876..d88a8c685 100644
--- a/solution/landfillmethane/__init__.py
+++ b/solution/landfillmethane/__init__.py
@@ -351,6 +351,7 @@ def __init__(self, scenario=None):
self.c2 = co2calcs.CO2Calcs(ac=self.ac,
ch4_ppb_calculator=self.c4.ch4_ppb_calculator(),
+ ch4_megatons_avoided_or_reduced=self.c4.ch4_megatons_avoided_or_reduced(),
soln_pds_net_grid_electricity_units_saved=self.ua.soln_pds_net_grid_electricity_units_saved(),
soln_pds_net_grid_electricity_units_used=self.ua.soln_pds_net_grid_electricity_units_used(),
soln_pds_direct_co2_emissions_saved=self.ua.soln_pds_direct_co2_emissions_saved(),
diff --git a/solution/managedgrazing/__init__.py b/solution/managedgrazing/__init__.py
index e798068d5..22c55dcd3 100644
--- a/solution/managedgrazing/__init__.py
+++ b/solution/managedgrazing/__init__.py
@@ -398,6 +398,7 @@ def __init__(self, scenario=None):
self.c2 = co2calcs.CO2Calcs(ac=self.ac,
ch4_ppb_calculator=self.c4.ch4_ppb_calculator(),
+ ch4_megatons_avoided_or_reduced=self.c4.ch4_megatons_avoided_or_reduced(),
soln_pds_net_grid_electricity_units_saved=self.ua.soln_pds_net_grid_electricity_units_saved(),
soln_pds_net_grid_electricity_units_used=self.ua.soln_pds_net_grid_electricity_units_used(),
soln_pds_direct_co2eq_emissions_saved=self.ua.direct_co2eq_emissions_saved_land(),
diff --git a/solution/methaneleak/__init__.py b/solution/methaneleak/__init__.py
index 7fe46adc7..8594acf7c 100644
--- a/solution/methaneleak/__init__.py
+++ b/solution/methaneleak/__init__.py
@@ -278,6 +278,7 @@ def __init__(self, scenario=None):
self.c2 = co2calcs.CO2Calcs(ac=self.ac,
ch4_ppb_calculator=self.c4.ch4_ppb_calculator(),
+ ch4_megatons_avoided_or_reduced=self.c4.ch4_megatons_avoided_or_reduced(),
soln_pds_net_grid_electricity_units_saved=self.ua.soln_pds_net_grid_electricity_units_saved(),
soln_pds_net_grid_electricity_units_used=self.ua.soln_pds_net_grid_electricity_units_used(),
soln_pds_direct_co2_emissions_saved=self.ua.soln_pds_direct_co2_emissions_saved(),
diff --git a/solution/nutrientmanagement/__init__.py b/solution/nutrientmanagement/__init__.py
index 53266248a..6b53144e2 100644
--- a/solution/nutrientmanagement/__init__.py
+++ b/solution/nutrientmanagement/__init__.py
@@ -12,6 +12,7 @@
from model import aez
from model import ch4calcs
from model import co2calcs
+from model import n2ocalcs
from model import customadoption
from model import dd
from model import emissionsfactors
@@ -365,8 +366,13 @@ def __init__(self, scenario=None):
soln_pds_direct_ch4_co2_emissions_saved=self.ua.direct_ch4_co2_emissions_saved_land(),
soln_net_annual_funits_adopted=soln_net_annual_funits_adopted)
+ self.n2o = n2ocalcs.N2OCalcs(ac=self.ac,
+ soln_pds_direct_n2o_co2_emissions_saved=self.ua.direct_n2o_co2_emissions_saved_land(),
+ soln_net_annual_funits_adopted=soln_net_annual_funits_adopted)
+
self.c2 = co2calcs.CO2Calcs(ac=self.ac,
ch4_ppb_calculator=self.c4.ch4_ppb_calculator(),
+ n2o_megatons_avoided_or_reduced=self.n2o.n2o_megatons_avoided_or_reduced(),
soln_pds_net_grid_electricity_units_saved=self.ua.soln_pds_net_grid_electricity_units_saved(),
soln_pds_net_grid_electricity_units_used=self.ua.soln_pds_net_grid_electricity_units_used(),
soln_pds_direct_co2eq_emissions_saved=self.ua.direct_co2eq_emissions_saved_land(),
@@ -382,4 +388,3 @@ def __init__(self, scenario=None):
annual_land_area_harvested=self.ua.soln_pds_annual_land_area_harvested(),
regime_distribution=self.ae.get_land_distribution(),
regimes=dd.THERMAL_MOISTURE_REGIMES8)
-
diff --git a/solution/peatlands/__init__.py b/solution/peatlands/__init__.py
index 7834d4b20..b107a4557 100644
--- a/solution/peatlands/__init__.py
+++ b/solution/peatlands/__init__.py
@@ -12,6 +12,7 @@
from model import aez
from model import ch4calcs
from model import co2calcs
+from model import n2ocalcs
from model import customadoption
from model import dd
from model import emissionsfactors
@@ -480,8 +481,14 @@ def constrained_tla(rate):
soln_pds_direct_ch4_co2_emissions_saved=self.ua.direct_ch4_co2_emissions_saved_land(),
soln_net_annual_funits_adopted=soln_net_annual_funits_adopted)
+ self.n2o = n2ocalcs.N2OCalcs(ac=self.ac,
+ soln_pds_direct_n2o_co2_emissions_saved=self.ua.direct_n2o_co2_emissions_saved_land(),
+ soln_net_annual_funits_adopted=soln_net_annual_funits_adopted)
+
self.c2 = co2calcs.CO2Calcs(ac=self.ac,
ch4_ppb_calculator=self.c4.ch4_ppb_calculator(),
+ ch4_megatons_avoided_or_reduced=self.c4.ch4_megatons_avoided_or_reduced(),
+ n2o_megatons_avoided_or_reduced=self.n2o.n2o_megatons_avoided_or_reduced(),
soln_pds_net_grid_electricity_units_saved=self.ua.soln_pds_net_grid_electricity_units_saved(),
soln_pds_net_grid_electricity_units_used=self.ua.soln_pds_net_grid_electricity_units_used(),
soln_pds_direct_co2eq_emissions_saved=self.ua.direct_co2eq_emissions_saved_land(),
diff --git a/solution/perennialbioenergy/__init__.py b/solution/perennialbioenergy/__init__.py
index 04ab17db8..dd2187976 100644
--- a/solution/perennialbioenergy/__init__.py
+++ b/solution/perennialbioenergy/__init__.py
@@ -12,6 +12,7 @@
from model import aez
from model import ch4calcs
from model import co2calcs
+from model import n2ocalcs
from model import customadoption
from model import dd
from model import emissionsfactors
@@ -303,8 +304,13 @@ def __init__(self, scenario=None):
soln_pds_direct_ch4_co2_emissions_saved=self.ua.direct_ch4_co2_emissions_saved_land(),
soln_net_annual_funits_adopted=soln_net_annual_funits_adopted)
+ self.n2o = n2ocalcs.N2OCalcs(ac=self.ac,
+ soln_pds_direct_n2o_co2_emissions_saved=self.ua.direct_n2o_co2_emissions_saved_land(),
+ soln_net_annual_funits_adopted=soln_net_annual_funits_adopted)
+
self.c2 = co2calcs.CO2Calcs(ac=self.ac,
ch4_ppb_calculator=self.c4.ch4_ppb_calculator(),
+ n2o_megatons_avoided_or_reduced=self.n2o.n2o_megatons_avoided_or_reduced(),
soln_pds_net_grid_electricity_units_saved=self.ua.soln_pds_net_grid_electricity_units_saved(),
soln_pds_net_grid_electricity_units_used=self.ua.soln_pds_net_grid_electricity_units_used(),
soln_pds_direct_co2eq_emissions_saved=self.ua.direct_co2eq_emissions_saved_land(),
diff --git a/solution/riceintensification/__init__.py b/solution/riceintensification/__init__.py
index 19d159da0..cac5b5f8c 100644
--- a/solution/riceintensification/__init__.py
+++ b/solution/riceintensification/__init__.py
@@ -12,6 +12,7 @@
from model import aez
from model import ch4calcs
from model import co2calcs
+from model import n2ocalcs
from model import customadoption
from model import dd
from model import emissionsfactors
@@ -361,8 +362,14 @@ def __init__(self, scenario=None):
soln_pds_direct_ch4_co2_emissions_saved=self.ua.direct_ch4_co2_emissions_saved_land(),
soln_net_annual_funits_adopted=soln_net_annual_funits_adopted)
+ self.n2o = n2ocalcs.N2OCalcs(ac=self.ac,
+ soln_pds_direct_n2o_co2_emissions_saved=self.ua.direct_n2o_co2_emissions_saved_land(),
+ soln_net_annual_funits_adopted=soln_net_annual_funits_adopted)
+
self.c2 = co2calcs.CO2Calcs(ac=self.ac,
ch4_ppb_calculator=self.c4.ch4_ppb_calculator(),
+ ch4_megatons_avoided_or_reduced=self.c4.ch4_megatons_avoided_or_reduced(),
+ n2o_megatons_avoided_or_reduced=self.n2o.n2o_megatons_avoided_or_reduced(),
soln_pds_net_grid_electricity_units_saved=self.ua.soln_pds_net_grid_electricity_units_saved(),
soln_pds_net_grid_electricity_units_used=self.ua.soln_pds_net_grid_electricity_units_used(),
soln_pds_direct_co2eq_emissions_saved=self.ua.direct_co2eq_emissions_saved_land(),
diff --git a/solution/silvopasture/__init__.py b/solution/silvopasture/__init__.py
index b83164c00..4e37422d9 100644
--- a/solution/silvopasture/__init__.py
+++ b/solution/silvopasture/__init__.py
@@ -404,6 +404,7 @@ def __init__(self, scenario=None):
self.c2 = co2calcs.CO2Calcs(ac=self.ac,
ch4_ppb_calculator=self.c4.ch4_ppb_calculator(),
+ ch4_megatons_avoided_or_reduced=self.c4.ch4_megatons_avoided_or_reduced(),
soln_pds_net_grid_electricity_units_saved=self.ua.soln_pds_net_grid_electricity_units_saved(),
soln_pds_net_grid_electricity_units_used=self.ua.soln_pds_net_grid_electricity_units_used(),
soln_pds_direct_co2eq_emissions_saved=self.ua.direct_co2eq_emissions_saved_land(),
diff --git a/solution/wastetoenergy/__init__.py b/solution/wastetoenergy/__init__.py
index f6d05a02f..4baef6f74 100644
--- a/solution/wastetoenergy/__init__.py
+++ b/solution/wastetoenergy/__init__.py
@@ -11,6 +11,7 @@
from model import advanced_controls as ac
from model import ch4calcs
from model import co2calcs
+from model import n2ocalcs
from model import customadoption
from model import dd
from model import emissionsfactors
@@ -419,8 +420,13 @@ def __init__(self, scenario=None):
self.c4 = ch4calcs.CH4Calcs(ac=self.ac,
soln_net_annual_funits_adopted=soln_net_annual_funits_adopted)
+ self.n2o = n2ocalcs.N2OCalcs(ac=self.ac,
+ soln_net_annual_funits_adopted=soln_net_annual_funits_adopted)
+
self.c2 = co2calcs.CO2Calcs(ac=self.ac,
ch4_ppb_calculator=self.c4.ch4_ppb_calculator(),
+ ch4_megatons_avoided_or_reduced=self.c4.ch4_megatons_avoided_or_reduced(),
+ n2o_megatons_avoided_or_reduced=self.n2o.n2o_megatons_avoided_or_reduced(),
soln_pds_net_grid_electricity_units_saved=self.ua.soln_pds_net_grid_electricity_units_saved(),
soln_pds_net_grid_electricity_units_used=self.ua.soln_pds_net_grid_electricity_units_used(),
soln_pds_direct_co2_emissions_saved=self.ua.soln_pds_direct_co2_emissions_saved(),