# Script using the APRP method on GeoMIP output, to calculate
# SW radiative effects of cloud, surface albedo and 
# atmospheric absortpion changes. 

# Rick Russotto
# Started June 9, 2016

#Note: there was originally a plan to study the differences between the 
#"warm" and "solar" cases defined below, but this did not produce
#useful results for reasons described in the paper. 

import APRP as aprp
import netCDF4 as nc4
import os
import matplotlib.pyplot as plt
import geomipFunctions as gmf
import numpy as np
from mpl_toolkits.basemap import Basemap
from collections import OrderedDict



#For each model, the APRP code needs to be passed a dictionary of output files. I'll use a 
#dictionary of dictionaries so that I can easily loop through all the models. 
folder = '../nobackup/'
fluxPaths_G1 = OrderedDict()
#fluxPaths_G1['bn'] = {'clt': folder+'clt_Amon_BNU-ESM_G1_r1i1p1_185001-190012.nc', 
#                      'rsds': folder+'rsds_Amon_BNU-ESM_G1_r1i1p1_185001-190012.nc',
#                      'rsdscs': folder+'rsdscs_Amon_BNU-ESM_G1_r1i1p1_185001-190012.nc',
#                      'rsdt': folder+'rsdt_Amon_BNU-ESM_G1_r1i1p1_185001-190012.nc',
#                      'rsus': folder+'rsus_Amon_BNU-ESM_G1_r1i1p1_185001-190012.nc',
#                      'rsuscs': folder+'rsuscs_Amon_BNU-ESM_G1_r1i1p1_185001-190012.nc',
#                      'rsut': folder+'rsut_Amon_BNU-ESM_G1_r1i1p1_185001-190012.nc',
#                      'rsutcs': folder+'rsutcs_Amon_BNU-ESM_G1_r1i1p1_185001-190012.nc'
#                      }.
fluxPaths_G1['bn'] = {'clt': folder+'clt_Amon_BNU-ESM_G1_r3i1p1_185001-194912.nc', 
                      'rsds': folder+'rsds_Amon_BNU-ESM_G1_r3i1p1_185001-194912.nc',
                      'rsdscs': folder+'rsdscs_Amon_BNU-ESM_G1_r3i1p1_185001-194912.nc',
                      'rsdt': folder+'rsdt_Amon_BNU-ESM_G1_r3i1p1_185001-194912.nc',
                      'rsus': folder+'rsus_Amon_BNU-ESM_G1_r3i1p1_185001-194912.nc',
                      'rsuscs': folder+'rsuscs_Amon_BNU-ESM_G1_r3i1p1_185001-194912.nc',
                      'rsut': folder+'rsut_Amon_BNU-ESM_G1_r3i1p1_185001-194912.nc',
                      'rsutcs': folder+'rsutcs_Amon_BNU-ESM_G1_r3i1p1_185001-194912.nc'
                      }
fluxPaths_G1['ca'] = {'clt': folder+'clt_Amon_CanESM2_G1_r1i1p1_185001-194912.nc', 
                      'rsds': folder+'rsds_Amon_CanESM2_G1_r1i1p1_185001-194912.nc',
                      'rsdscs': folder+'rsdscs_Amon_CanESM2_G1_r1i1p1_185001-194912.nc',
                      'rsdt': folder+'rsdt_Amon_CanESM2_G1_r1i1p1_185001-194912.nc',
                      'rsus': folder+'rsus_Amon_CanESM2_G1_r1i1p1_185001-194912.nc',
                      'rsuscs': folder+'rsuscs_Amon_CanESM2_G1_r1i1p1_185001-194912.nc',
                      'rsut': folder+'rsut_Amon_CanESM2_G1_r1i1p1_185001-194912.nc',
                      'rsutcs': folder+'rsutcs_Amon_CanESM2_G1_r1i1p1_185001-194912.nc'
                      }                 
fluxPaths_G1['cc'] = {'clt': folder+'clt_Amon_CCSM4_G1_r1i1p1_185001-192412.nc', 
                      'rsds': folder+'rsds_Amon_CCSM4_G1_r1i1p1_185001-192412.nc',
                      'rsdscs': folder+'rsdscs_Amon_CCSM4_G1_r1i1p1_185001-192412.nc',
                      'rsdt': folder+'rsdt_Amon_CCSM4_G1_r1i1p1_185001-192412.nc',
                      'rsus': folder+'rsus_Amon_CCSM4_G1_r1i1p1_185001-192412.nc',
                      'rsuscs': folder+'rsuscs_Amon_CCSM4_G1_r1i1p1_185001-192412.nc',
                      'rsut': folder+'rsut_Amon_CCSM4_G1_r1i1p1_185001-192412.nc',
                      'rsutcs': folder+'rsutcs_Amon_CCSM4_G1_r1i1p1_185001-192412.nc'
                      }    
fluxPaths_G1['ce'] = {'clt': folder+'clt_Amon_CESM1-CAM5-1-FV2_G1_r1i1p1_000101-006001.nc', 
                      'rsds': folder+'rsds_Amon_CESM1-CAM5-1-FV2_G1_r1i1p1_000101-005912.nc',
                      'rsdscs': folder+'rsdscs_Amon_CESM1-CAM5-1-FV2_G1_r1i1p1_000101-006001.nc',
                      'rsdt': folder+'rsdt_Amon_CESM1-CAM5-1-FV2_G1_r1i1p1_000101-006001.nc',
                      'rsus': folder+'rsus_Amon_CESM1-CAM5-1-FV2_G1_r1i1p1_000101-005912.nc',
                      'rsuscs': folder+'rsuscs_Amon_CESM1-CAM5-1-FV2_G1_r1i1p1_000101-006001.nc',
                      'rsut': folder+'rsut_Amon_CESM1-CAM5-1-FV2_G1_r1i1p1_000101-006001.nc',
                      'rsutcs': folder+'rsutcs_Amon_CESM1-CAM5-1-FV2_G1_r1i1p1_000101-006001.nc'
                      }                      
#fluxPaths_G1['cs'] = {'clt': folder+'',     #Missing rsdscs, rsuscs; having talked to Dr. Phipps, these were never saved. 
#                      'rsds': folder+'', 
#                      'rsdscs': folder+'',
#                      'rsdt': folder+'',
#                      'rsus': folder+'',
#                      'rsuscs': folder+'',
#                      'rsut': folder+'',
#                      'rsutcs': folder+''
#                      }                                                
fluxPaths_G1['gi'] = {'clt': folder+'clt_Amon_GISS-E2-R_G1_r1i1p1_185001-191912.nc', 
                      'rsds': folder+'rsds_Amon_GISS-E2-R_G1_r1i1p1_185001-191912.nc',
                      'rsdscs': folder+'rsdscs_Amon_GISS-E2-R_G1_r1i1p1_185001-191912.nc',
                      'rsdt': folder+'rsdt_Amon_GISS-E2-R_G1_r1i1p1_185001-191912.nc',
                      'rsus': folder+'rsus_Amon_GISS-E2-R_G1_r1i1p1_185001-191912.nc',
                      'rsuscs': folder+'rsuscs_Amon_GISS-E2-R_G1_r1i1p1_185001-191912.nc',
                      'rsut': folder+'rsut_Amon_GISS-E2-R_G1_r1i1p1_185001-191912.nc',
                      'rsutcs': folder+'rsutcs_Amon_GISS-E2-R_G1_r1i1p1_185001-191912.nc'
                      }                     
fluxPaths_G1['hg'] = {'clt': folder+'clt_Amon_HadGEM2-ES_G1_r1i1p1_185912-190911.nc', 
                      'rsds': folder+'rsds_Amon_HadGEM2-ES_G1_r1i1p1_185912-190911.nc',
                      'rsdscs': folder+'rsdscs_Amon_HadGEM2-ES_G1_r1i1p1_185912-190911.nc',
                      'rsdt': folder+'rsdt_Amon_HadGEM2-ES_G1_r1i1p1_185912-190911.nc',
                      'rsus': folder+'rsus_Amon_HadGEM2-ES_G1_r1i1p1_185912-190911.nc',
                      'rsuscs': folder+'rsuscs_Amon_HadGEM2-ES_G1_r1i1p1_185912-190911.nc',
                      'rsut': folder+'rsut_Amon_HadGEM2-ES_G1_r1i1p1_185912-190911.nc',
                      'rsutcs': folder+'rsutcs_Amon_HadGEM2-ES_G1_r1i1p1_185912-190911.nc'
                      }                          
fluxPaths_G1['ip'] = {'clt': folder+'clt_Amon_IPSL-CM5A-LR_G1_r1i1p1_185001-189912.nc', 
                      'rsds': folder+'rsds_Amon_IPSL-CM5A-LR_G1_r1i1p1_185001-189912.nc',
                      'rsdscs': folder+'rsdscs_Amon_IPSL-CM5A-LR_G1_r1i1p1_185001-189912.nc',
                      'rsdt': folder+'rsdt_Amon_IPSL-CM5A-LR_G1_r1i1p1_185001-189912.nc',
                      'rsus': folder+'rsus_Amon_IPSL-CM5A-LR_G1_r1i1p1_185001-189912.nc',
                      'rsuscs': folder+'rsuscs_Amon_IPSL-CM5A-LR_G1_r1i1p1_185001-189912.nc',
                      'rsut': folder+'rsut_Amon_IPSL-CM5A-LR_G1_r1i1p1_185001-189912.nc',
                      'rsutcs': folder+'rsutcs_Amon_IPSL-CM5A-LR_G1_r1i1p1_185001-189912.nc'
                      }                    
fluxPaths_G1['mi'] = {'clt': folder+'clt_Amon_MIROC-ESM_G1_r1i1p1_000101-005212.nc', 
                      'rsds': folder+'rsds_Amon_MIROC-ESM_G1_r1i1p1_000101-005212.nc',
                      'rsdscs': folder+'rsdscs_Amon_MIROC-ESM_G1_r1i1p1_000101-005212.nc',
                      'rsdt': folder+'rsdt_Amon_MIROC-ESM_G1_r1i1p1_000101-005212.nc',
                      'rsus': folder+'rsus_Amon_MIROC-ESM_G1_r1i1p1_000101-005212.nc',
                      'rsuscs': folder+'rsuscs_Amon_MIROC-ESM_G1_r1i1p1_000101-005212.nc',
                      'rsut': folder+'rsut_Amon_MIROC-ESM_G1_r1i1p1_000101-005212.nc',
                      'rsutcs': folder+'rsutcs_Amon_MIROC-ESM_G1_r1i1p1_000101-005212.nc'
                      }        
fluxPaths_G1['mp'] = {'clt': folder+'clt_Amon_MPI-ESM-LR_G1_r2i1p1_185001-191912.nc', 
                      'rsds': folder+'rsds_Amon_MPI-ESM-LR_G1_r2i1p1_185001-191912.nc',
                      'rsdscs': folder+'rsdscs_Amon_MPI-ESM-LR_G1_r2i1p1_185001-191912.nc',
                      'rsdt': folder+'rsdt_Amon_MPI-ESM-LR_G1_r2i1p1_185001-189912.nc',
                      'rsus': folder+'rsus_Amon_MPI-ESM-LR_G1_r2i1p1_185001-191912.nc',
                      'rsuscs': folder+'rsuscs_Amon_MPI-ESM-LR_G1_r2i1p1_185001-191912.nc',
                      'rsut': folder+'rsut_Amon_MPI-ESM-LR_G1_r2i1p1_185001-189912.nc',
                      'rsutcs': folder+'rsutcs_Amon_MPI-ESM-LR_G1_r2i1p1_185001-191912.nc'
                      }                              
fluxPaths_G1['no'] = {'clt': folder+'clt_Amon_NorESM1-M_G1_r1i1p1_000101-005012.nc', 
                      'rsds': folder+'rsds_Amon_NorESM1-M_G1_r1i1p1_000101-005012.nc',
                      'rsdscs': folder+'rsdscs_Amon_NorESM1-M_G1_r1i1p1_000101-005012.nc',
                      'rsdt': folder+'rsdt_Amon_NorESM1-M_G1_r1i1p1_000101-005012.nc',
                      'rsus': folder+'rsus_Amon_NorESM1-M_G1_r1i1p1_000101-005012.nc',
                      'rsuscs': folder+'rsuscs_Amon_NorESM1-M_G1_r1i1p1_000101-005012.nc',
                      'rsut': folder+'rsut_Amon_NorESM1-M_G1_r1i1p1_000101-005012.nc',
                      'rsutcs': folder+'rsutcs_Amon_NorESM1-M_G1_r1i1p1_000101-005012.nc'
                      }                              
                      
fluxPaths_PI = OrderedDict()
fluxPaths_PI['bn'] = {'clt': folder+'clt_Amon_BNU-ESM_piControl_r1i1p1_145001-200812.nc', 
                      'rsds': folder+'rsds_Amon_BNU-ESM_piControl_r1i1p1_145001-200812.nc',
                      'rsdscs': folder+'rsdscs_Amon_BNU-ESM_piControl_r1i1p1_145001-200812.nc',
                      'rsdt': folder+'rsdt_Amon_BNU-ESM_piControl_r1i1p1_145001-200812.nc',
                      'rsus': folder+'rsus_Amon_BNU-ESM_piControl_r1i1p1_145001-200812.nc',
                      'rsuscs': folder+'rsuscs_Amon_BNU-ESM_piControl_r1i1p1_145001-200812.nc',
                      'rsut': folder+'rsut_Amon_BNU-ESM_piControl_r1i1p1_145001-200812.nc',
                      'rsutcs': folder+'rsutcs_Amon_BNU-ESM_piControl_r1i1p1_145001-200812.nc'
                      }    
fluxPaths_PI['ca'] = {'clt': folder+'clt_Amon_CanESM2_piControl_r1i1p1_201501-231012.nc', 
                      'rsds': folder+'rsds_Amon_CanESM2_piControl_r1i1p1_201501-231012.nc',
                      'rsdscs': folder+'rsdscs_Amon_CanESM2_piControl_r1i1p1_201501-231012.nc',
                      'rsdt': folder+'rsdt_Amon_CanESM2_piControl_r1i1p1_201501-231012.nc',
                      'rsus': folder+'rsus_Amon_CanESM2_piControl_r1i1p1_201501-231012.nc',
                      'rsuscs': folder+'rsuscs_Amon_CanESM2_piControl_r1i1p1_201501-231012.nc',
                      'rsut': folder+'rsut_Amon_CanESM2_piControl_r1i1p1_201501-231012.nc',
                      'rsutcs': folder+'rsutcs_Amon_CanESM2_piControl_r1i1p1_201501-231012.nc'
                      }    
fluxPaths_PI['cc'] = {'clt': folder+'clt_Amon_CCSM4_piControl_r1i1p1_080001-130012.nc', 
                      'rsds': folder+'rsds_Amon_CCSM4_piControl_r1i1p1_080001-130012.nc',
                      'rsdscs': folder+'rsdscs_Amon_CCSM4_piControl_r1i1p1_080001-130012.nc',
                      'rsdt': folder+'rsdt_Amon_CCSM4_piControl_r1i1p1_080001-130012.nc',
                      'rsus': folder+'rsus_Amon_CCSM4_piControl_r1i1p1_080001-130012.nc',
                      'rsuscs': folder+'rsuscs_Amon_CCSM4_piControl_r1i1p1_080001-130012.nc',
                      'rsut': folder+'rsut_Amon_CCSM4_piControl_r1i1p1_080001-130012.nc',
                      'rsutcs': folder+'rsutcs_Amon_CCSM4_piControl_r1i1p1_080001-130012.nc'
                      }    
fluxPaths_PI['ce'] = {'clt': folder+'clt_Amon_CESM1-CAM5-1-FV2_piControl_r1i1p1_000101-005012.nc', 
                      'rsds': folder+'rsds_Amon_CESM1-CAM5-1-FV2_piControl_r1i1p1_000101-005012.nc',
                      'rsdscs': folder+'rsdscs_Amon_CESM1-CAM5-1-FV2_piControl_r1i1p1_000101-005012.nc',
                      'rsdt': folder+'rsdt_Amon_CESM1-CAM5-1-FV2_piControl_r1i1p1_000101-005012.nc',
                      'rsus': folder+'rsus_Amon_CESM1-CAM5-1-FV2_piControl_r1i1p1_000101-005012.nc',
                      'rsuscs': folder+'rsuscs_Amon_CESM1-CAM5-1-FV2_piControl_r1i1p1_000101-005012.nc',
                      'rsut': folder+'rsut_Amon_CESM1-CAM5-1-FV2_piControl_r1i1p1_000101-005012.nc',
                      'rsutcs': folder+'rsutcs_Amon_CESM1-CAM5-1-FV2_piControl_r1i1p1_000101-005012.nc'
                      }                           
#fluxPaths_PI['cs'] = {'clt': folder+'', 
#                      'rsds': folder+'',
#                      'rsdscs': folder+'',
#                      'rsdt': folder+'',
#                      'rsus': folder+'',
#                      'rsuscs': folder+'',
#                      'rsut': folder+'',
#                      'rsutcs': folder+''
#                      }                        
fluxPaths_PI['gi'] = {'clt': folder+'clt_Amon_GISS-E2-R_piControl_r1i1p1_185001-191912.nc', 
                      'rsds': folder+'rsds_Amon_GISS-E2-R_piControl_r1i1p1_185001-191912.nc',
                      'rsdscs': folder+'rsdscs_Amon_GISS-E2-R_piControl_r1i1p1_185001-191912.nc',
                      'rsdt': folder+'rsdt_Amon_GISS-E2-R_piControl_r1i1p1_185001-191912.nc',
                      'rsus': folder+'rsus_Amon_GISS-E2-R_piControl_r1i1p1_185001-191912.nc',
                      'rsuscs': folder+'rsuscs_Amon_GISS-E2-R_piControl_r1i1p1_185001-191912.nc',
                      'rsut': folder+'rsut_Amon_GISS-E2-R_piControl_r1i1p1_185001-191912.nc',
                      'rsutcs': folder+'rsutcs_Amon_GISS-E2-R_piControl_r1i1p1_185001-191912.nc'
                      }                          
fluxPaths_PI['hg'] = {'clt': folder+'clt_Amon_HadGEM2-ES_piControl_r1i1p1_185912-190911.nc', 
                      'rsds': folder+'rsds_Amon_HadGEM2-ES_piControl_r1i1p1_185912-190911.nc',
                      'rsdscs': folder+'rsdscs_Amon_HadGEM2-ES_piControl_r1i1p1_185912-190911.nc',
                      'rsdt': folder+'rsdt_Amon_HadGEM2-ES_piControl_r1i1p1_185912-190911.nc',
                      'rsus': folder+'rsus_Amon_HadGEM2-ES_piControl_r1i1p1_185912-190911.nc',
                      'rsuscs': folder+'rsuscs_Amon_HadGEM2-ES_piControl_r1i1p1_185912-190911.nc',
                      'rsut': folder+'rsut_Amon_HadGEM2-ES_piControl_r1i1p1_185912-190911.nc',
                      'rsutcs': folder+'rsutcs_Amon_HadGEM2-ES_piControl_r1i1p1_185912-190911.nc'
                      }                          
fluxPaths_PI['ip'] = {'clt': folder+'clt_Amon_IPSL-CM5A-LR_piControl_r1i1p1_180001-279912.nc', 
                      'rsds': folder+'rsds_Amon_IPSL-CM5A-LR_piControl_r1i1p1_180001-279912.nc',
                      'rsdscs': folder+'rsdscs_Amon_IPSL-CM5A-LR_piControl_r1i1p1_180001-279912.nc',
                      'rsdt': folder+'rsdt_Amon_IPSL-CM5A-LR_piControl_r1i1p1_180001-279912.nc',
                      'rsus': folder+'rsus_Amon_IPSL-CM5A-LR_piControl_r1i1p1_180001-279912.nc',
                      'rsuscs': folder+'rsuscs_Amon_IPSL-CM5A-LR_piControl_r1i1p1_180001-279912.nc',
                      'rsut': folder+'rsut_Amon_IPSL-CM5A-LR_piControl_r1i1p1_180001-279912.nc',
                      'rsutcs': folder+'rsutcs_Amon_IPSL-CM5A-LR_piControl_r1i1p1_180001-279912.nc'
                      }          
fluxPaths_PI['mi'] = {'clt': folder+'clt_Amon_MIROC-ESM_piControl_r1i1p1_180001-233012.nc', 
                      'rsds': folder+'rsds_Amon_MIROC-ESM_piControl_r1i1p1_180001-233012.nc',
                      'rsdscs': folder+'rsdscs_Amon_MIROC-ESM_piControl_r1i1p1_180001-233012.nc',
                      'rsdt': folder+'rsdt_Amon_MIROC-ESM_piControl_r1i1p1_180001-233012.nc',
                      'rsus': folder+'rsus_Amon_MIROC-ESM_piControl_r1i1p1_180001-233012.nc',
                      'rsuscs': folder+'rsuscs_Amon_MIROC-ESM_piControl_r1i1p1_180001-233012.nc',
                      'rsut': folder+'rsut_Amon_MIROC-ESM_piControl_r1i1p1_180001-233012.nc',
                      'rsutcs': folder+'rsutcs_Amon_MIROC-ESM_piControl_r1i1p1_180001-233012.nc'
                      }        
fluxPaths_PI['mp'] = {'clt': folder+'clt_Amon_MPI-ESM-LR_piControl_r1i1p1_185001-203512.nc', 
                      'rsds': folder+'rsds_Amon_MPI-ESM-LR_piControl_r1i1p1_185001-203512.nc',
                      'rsdscs': folder+'rsdscs_Amon_MPI-ESM-LR_piControl_r1i1p1_185001-203512.nc',
                      'rsdt': folder+'rsdt_Amon_MPI-ESM-LR_piControl_r1i1p1_185001-203512.nc',
                      'rsus': folder+'rsus_Amon_MPI-ESM-LR_piControl_r1i1p1_185001-203512.nc',
                      'rsuscs': folder+'rsuscs_Amon_MPI-ESM-LR_piControl_r1i1p1_185001-203512.nc',
                      'rsut': folder+'rsut_Amon_MPI-ESM-LR_piControl_r1i1p1_185001-203512.nc',
                      'rsutcs': folder+'rsutcs_Amon_MPI-ESM-LR_piControl_r1i1p1_185001-203512.nc'
                      }                            
fluxPaths_PI['no'] = {'clt': folder+'clt_Amon_NorESM1-M_piControl_r1i1p1_070001-115012.nc', 
                      'rsds': folder+'rsds_Amon_NorESM1-M_piControl_r1i1p1_070001-115012.nc',
                      'rsdscs': folder+'rsdscs_Amon_NorESM1-M_piControl_r1i1p1_070001-115012.nc',
                      'rsdt': folder+'rsdt_Amon_NorESM1-M_piControl_r1i1p1_070001-115012.nc',
                      'rsus': folder+'rsus_Amon_NorESM1-M_piControl_r1i1p1_070001-115012.nc',
                      'rsuscs': folder+'rsuscs_Amon_NorESM1-M_piControl_r1i1p1_070001-115012.nc',
                      'rsut': folder+'rsut_Amon_NorESM1-M_piControl_r1i1p1_070001-115012.nc',
                      'rsutcs': folder+'rsutcs_Amon_NorESM1-M_piControl_r1i1p1_070001-115012.nc'
                      }                             
                      
fluxPaths_A4 = OrderedDict()
fluxPaths_A4['bn'] = {'clt': folder+'clt_Amon_BNU-ESM_abrupt4xCO2_r1i1p1_185001-199912.nc', 
                      'rsds': folder+'rsds_Amon_BNU-ESM_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsdscs': folder+'rsdscs_Amon_BNU-ESM_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsdt': folder+'rsdt_Amon_BNU-ESM_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsus': folder+'rsus_Amon_BNU-ESM_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsuscs': folder+'rsuscs_Amon_BNU-ESM_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsut': folder+'rsut_Amon_BNU-ESM_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsutcs': folder+'rsutcs_Amon_BNU-ESM_abrupt4xCO2_r1i1p1_185001-199912.nc'
                      }    
fluxPaths_A4['ca'] = {'clt': folder+'clt_Amon_CanESM2_abrupt4xCO2_r1i1p1_185001-199912.nc', 
                      'rsds': folder+'rsds_Amon_CanESM2_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsdscs': folder+'rsdscs_Amon_CanESM2_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsdt': folder+'rsdt_Amon_CanESM2_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsus': folder+'rsus_Amon_CanESM2_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsuscs': folder+'rsuscs_Amon_CanESM2_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsut': folder+'rsut_Amon_CanESM2_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsutcs': folder+'rsutcs_Amon_CanESM2_abrupt4xCO2_r1i1p1_185001-199912.nc'
                      }    
fluxPaths_A4['cc'] = {'clt': folder+'clt_Amon_CCSM4_abrupt4xCO2_r1i1p1_185001-200012.nc', 
                      'rsds': folder+'rsds_Amon_CCSM4_abrupt4xCO2_r1i1p1_185001-200012.nc',
                      'rsdscs': folder+'rsdscs_Amon_CCSM4_abrupt4xCO2_r1i1p1_185001-200012.nc',
                      'rsdt': folder+'rsdt_Amon_CCSM4_abrupt4xCO2_r1i1p1_185001-200012.nc',
                      'rsus': folder+'rsus_Amon_CCSM4_abrupt4xCO2_r1i1p1_185001-200012.nc',
                      'rsuscs': folder+'rsuscs_Amon_CCSM4_abrupt4xCO2_r1i1p1_185001-200012.nc',
                      'rsut': folder+'rsut_Amon_CCSM4_abrupt4xCO2_r1i1p1_185001-200012.nc',
                      'rsutcs': folder+'rsutcs_Amon_CCSM4_abrupt4xCO2_r1i1p1_185001-200012.nc'
                      }    
fluxPaths_A4['ce'] = {'clt': folder+'clt_Amon_CESM1-CAM5-1-FV2_abrupt4xCO2_r3i1p1_000101-015012.nc', 
                      'rsds': folder+'rsds_Amon_CESM1-CAM5-1-FV2_abrupt4xCO2_r3i1p1_000101-015012.nc',
                      'rsdscs': folder+'rsdscs_Amon_CESM1-CAM5-1-FV2_abrupt4xCO2_r3i1p1_000101-015012.nc',
                      'rsdt': folder+'rsdt_Amon_CESM1-CAM5-1-FV2_abrupt4xCO2_r3i1p1_000101-015012.nc',
                      'rsus': folder+'rsus_Amon_CESM1-CAM5-1-FV2_abrupt4xCO2_r3i1p1_000101-015012.nc',
                      'rsuscs': folder+'rsuscs_Amon_CESM1-CAM5-1-FV2_abrupt4xCO2_r3i1p1_000101-015012.nc',
                      'rsut': folder+'rsut_Amon_CESM1-CAM5-1-FV2_abrupt4xCO2_r3i1p1_000101-015012.nc',
                      'rsutcs': folder+'rsutcs_Amon_CESM1-CAM5-1-FV2_abrupt4xCO2_r3i1p1_000101-015012.nc'
                      }                           
#fluxPaths_A4['cs'] = {'clt': folder+'', 
#                      'rsds': folder+'',
#                      'rsdscs': folder+'',
#                      'rsdt': folder+'',
#                      'rsus': folder+'',
#                      'rsuscs': folder+'',
#                      'rsut': folder+'',
#                      'rsutcs': folder+''
#                      }                        
fluxPaths_A4['gi'] = {'clt': folder+'clt_Amon_GISS-E2-R_abrupt4xCO2_r1i1p1_185001-191912.nc', 
                      'rsds': folder+'rsds_Amon_GISS-E2-R_abrupt4xCO2_r1i1p1_185001-191912.nc',
                      'rsdscs': folder+'rsdscs_Amon_GISS-E2-R_abrupt4xCO2_r1i1p1_185001-191912.nc',
                      'rsdt': folder+'rsdt_Amon_GISS-E2-R_abrupt4xCO2_r1i1p1_185001-191912.nc',
                      'rsus': folder+'rsus_Amon_GISS-E2-R_abrupt4xCO2_r1i1p1_185001-191912.nc',
                      'rsuscs': folder+'rsuscs_Amon_GISS-E2-R_abrupt4xCO2_r1i1p1_185001-191912.nc',
                      'rsut': folder+'rsut_Amon_GISS-E2-R_abrupt4xCO2_r1i1p1_185001-191912.nc',
                      'rsutcs': folder+'rsutcs_Amon_GISS-E2-R_abrupt4xCO2_r1i1p1_185001-191912.nc'
                      }                                                
fluxPaths_A4['hg'] = {'clt': folder+'clt_Amon_HadGEM2-ES_abrupt4xCO2_r1i1p1_185912-190911.nc', 
                      'rsds': folder+'rsds_Amon_HadGEM2-ES_abrupt4xCO2_r1i1p1_185912-191011.nc',
                      'rsdscs': folder+'rsdscs_Amon_HadGEM2-ES_abrupt4xCO2_r1i1p1_185912-191011.nc',
                      'rsdt': folder+'rsdt_Amon_HadGEM2-ES_abrupt4xCO2_r1i1p1_185912-191011.nc',
                      'rsus': folder+'rsus_Amon_HadGEM2-ES_abrupt4xCO2_r1i1p1_185912-191011.nc',
                      'rsuscs': folder+'rsuscs_Amon_HadGEM2-ES_abrupt4xCO2_r1i1p1_185912-191011.nc',
                      'rsut': folder+'rsut_Amon_HadGEM2-ES_abrupt4xCO2_r1i1p1_185912-191011.nc',
                      'rsutcs': folder+'rsutcs_Amon_HadGEM2-ES_abrupt4xCO2_r1i1p1_185912-191011.nc'
                      }                          
fluxPaths_A4['ip'] = {'clt': folder+'clt_Amon_IPSL-CM5A-LR_abrupt4xCO2_r1i1p1_185001-204912.nc', 
                      'rsds': folder+'rsds_Amon_IPSL-CM5A-LR_abrupt4xCO2_r1i1p1_185001-204912.nc',
                      'rsdscs': folder+'rsdscs_Amon_IPSL-CM5A-LR_abrupt4xCO2_r1i1p1_185001-204912.nc',
                      'rsdt': folder+'rsdt_Amon_IPSL-CM5A-LR_abrupt4xCO2_r1i1p1_185001-204912.nc',
                      'rsus': folder+'rsus_Amon_IPSL-CM5A-LR_abrupt4xCO2_r1i1p1_185001-204912.nc',
                      'rsuscs': folder+'rsuscs_Amon_IPSL-CM5A-LR_abrupt4xCO2_r1i1p1_185001-204912.nc',
                      'rsut': folder+'rsut_Amon_IPSL-CM5A-LR_abrupt4xCO2_r1i1p1_185001-204912.nc',
                      'rsutcs': folder+'rsutcs_Amon_IPSL-CM5A-LR_abrupt4xCO2_r1i1p1_185001-204912.nc'
                      }              
fluxPaths_A4['mi'] = {'clt': folder+'clt_Amon_MIROC-ESM_abrupt4xCO2_r1i1p1_000101-015012.nc', 
                      'rsds': folder+'rsds_Amon_MIROC-ESM_abrupt4xCO2_r1i1p1_000101-015012.nc',
                      'rsdscs': folder+'rsdscs_Amon_MIROC-ESM_abrupt4xCO2_r1i1p1_000101-015012.nc',
                      'rsdt': folder+'rsdt_Amon_MIROC-ESM_abrupt4xCO2_r1i1p1_000101-015012.nc',
                      'rsus': folder+'rsus_Amon_MIROC-ESM_abrupt4xCO2_r1i1p1_000101-015012.nc',
                      'rsuscs': folder+'rsuscs_Amon_MIROC-ESM_abrupt4xCO2_r1i1p1_000101-015012.nc',
                      'rsut': folder+'rsut_Amon_MIROC-ESM_abrupt4xCO2_r1i1p1_000101-015012.nc',
                      'rsutcs': folder+'rsutcs_Amon_MIROC-ESM_abrupt4xCO2_r1i1p1_000101-015012.nc'
                      }        
fluxPaths_A4['mp'] = {'clt': folder+'clt_Amon_MPI-ESM-LR_abrupt4xCO2_r1i1p1_185001-199912.nc', 
                      'rsds': folder+'rsds_Amon_MPI-ESM-LR_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsdscs': folder+'rsdscs_Amon_MPI-ESM-LR_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsdt': folder+'rsdt_Amon_MPI-ESM-LR_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsus': folder+'rsus_Amon_MPI-ESM-LR_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsuscs': folder+'rsuscs_Amon_MPI-ESM-LR_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsut': folder+'rsut_Amon_MPI-ESM-LR_abrupt4xCO2_r1i1p1_185001-199912.nc',
                      'rsutcs': folder+'rsutcs_Amon_MPI-ESM-LR_abrupt4xCO2_r1i1p1_185001-199912.nc'
                      }                              
fluxPaths_A4['no'] = {'clt': folder+'clt_Amon_NorESM1-M_abrupt4xCO2_r1i1p1_000101-015012.nc', 
                      'rsds': folder+'rsds_Amon_NorESM1-M_abrupt4xCO2_r1i1p1_000101-015012.nc',
                      'rsdscs': folder+'rsdscs_Amon_NorESM1-M_abrupt4xCO2_r1i1p1_000101-015012.nc',
                      'rsdt': folder+'rsdt_Amon_NorESM1-M_abrupt4xCO2_r1i1p1_000101-015012.nc',
                      'rsus': folder+'rsus_Amon_NorESM1-M_abrupt4xCO2_r1i1p1_000101-015012.nc',
                      'rsuscs': folder+'rsuscs_Amon_NorESM1-M_abrupt4xCO2_r1i1p1_000101-015012.nc',
                      'rsut': folder+'rsut_Amon_NorESM1-M_abrupt4xCO2_r1i1p1_000101-015012.nc',
                      'rsutcs': folder+'rsutcs_Amon_NorESM1-M_abrupt4xCO2_r1i1p1_000101-015012.nc'
                      }                             


#Dictionaries for whether to load APRP results from a file (for tag explanation see below)
loadNpyFile_geo = OrderedDict()
loadNpyFile_geo['bn'] = False
loadNpyFile_geo['ca'] = False
loadNpyFile_geo['cc'] = False
loadNpyFile_geo['ce'] = False
loadNpyFile_geo['gi'] = False
loadNpyFile_geo['hg'] = False
loadNpyFile_geo['ip'] = False
loadNpyFile_geo['mi'] = False
loadNpyFile_geo['mp'] = False
loadNpyFile_geo['no'] = False

loadNpyFile_warm = OrderedDict()
loadNpyFile_warm['bn'] = False
loadNpyFile_warm['ca'] = False
loadNpyFile_warm['cc'] = False
loadNpyFile_warm['ce'] = False
loadNpyFile_warm['gi'] = False
loadNpyFile_warm['hg'] = False
loadNpyFile_warm['ip'] = False
loadNpyFile_warm['mi'] = False
loadNpyFile_warm['mp'] = False
loadNpyFile_warm['no'] = False

loadNpyFile_solar = OrderedDict()
loadNpyFile_solar['bn'] = False
loadNpyFile_solar['ca'] = False
loadNpyFile_solar['cc'] = False
loadNpyFile_solar['ce'] = False
loadNpyFile_solar['gi'] = False
loadNpyFile_solar['hg'] = False
loadNpyFile_solar['ip'] = False
loadNpyFile_solar['mi'] = False
loadNpyFile_solar['mp'] = False
loadNpyFile_solar['no'] = False

#The npy files are pretty big in this case (total > 1 GB for 4 models) so I'm putting them in a "nobackup" directory. 
#Would take a couple of minutes to regenerate them. 

#Run APRP for each model, or load pre-calculated results, in 3 combinations: 
#(Use years 10-49 for G1 and abrupt4xCO2, 0-39 for piControl)
#G1 - piControl (effects of geoengineering)
aprp_geo = OrderedDict()
for key in fluxPaths_G1.keys():
    if not(loadNpyFile_geo[key]):
        aprp_geo[key] = aprp.aprp_main(fluxPaths_PI[key], 0, 40*12-1, fluxPaths_G1[key], 10*12, 50*12-1)
        print('Finished APRP calculation (G1 - piControl): ' + gmf.modelNames[key])
        np.save('../nobackup/npyFiles/aprp_geo_'+key+'.npy', aprp_geo[key])
    else:
        aprp_geo[key] = np.load('../nobackup/npyFiles/aprp_geo_'+key+'.npy').item()
        print('Loaded APRP results (G1 - piControl): ' + gmf.modelNames[key])
        
#abrupt4xCO2 - piControl (effects of global warming)
aprp_warm = OrderedDict()
for key in fluxPaths_G1.keys():
    if not(loadNpyFile_warm[key]):
        aprp_warm[key] = aprp.aprp_main(fluxPaths_PI[key], 0, 40*12-1, fluxPaths_A4[key], 10*12, 50*12-1)
        print('Finished APRP calculation (abrupt4xCO2 - piControl): ' + gmf.modelNames[key])
        np.save('../nobackup/npyFiles/aprp_warm_'+key+'.npy', aprp_warm[key])
    else:
        aprp_warm[key] = np.load('../nobackup/npyFiles/aprp_warm_'+key+'.npy').item()
        print('Loaded APRP results (abrupt4xCO2 - piControl): ' + gmf.modelNames[key])        
        
#abrupt4xCO2 - G1 (effects of solar constant increase (with 4xCO2))
aprp_solar = OrderedDict()
for key in fluxPaths_G1.keys():
    if not(loadNpyFile_solar[key]):
        aprp_solar[key] = aprp.aprp_main(fluxPaths_G1[key], 10*12, 50*12-1, fluxPaths_A4[key], 10*12, 50*12-1)
        print('Finished APRP calculation (abrupt4xCO2 - G1): ' + gmf.modelNames[key])
        np.save('../nobackup/npyFiles/aprp_solar_'+key+'.npy', aprp_solar[key])
    else:
        aprp_solar[key] = np.load('../nobackup/npyFiles/aprp_solar_'+key+'.npy').item()
        print('Loaded APRP results (abrupt4xCO2 - G1): ' + gmf.modelNames[key])      







#####   PLOTS   #####

#Define a mapping function to plot one of the APRP results for a particular model, then run it a bunch of times
#
#Mandatory inputs: 
#figNo: figure number
#case: "geo" (G1-piControl), "warm" (abrupt4xCO2-piControl), or "solar" (abrupt4xCO2-G1)
#key: identifies the model
#variable: which APRP output variable we're looking at (see documentation of APRP.py) 
#
#Optional inputs:
#innerDict: which dictionary in the APRP output we're looking at (see documentation of APRP.py)
#clevs: where to plot the contours
#ext: whether to extend the colormap above and below the highest and lowest contours
#cmap: color map to use
#clabel: colorbar label (variable name if 'default')
#titleString: what to put in the first line of plot title (2nd line will be case and model)
#save: whether to save the plot as a pdf



#Version that saves png plots, and has bigger text for paper supplement
def plotAPRP_annualMean_contourf_PNG(figNo, case, key, variable, 
        innerDict='APRP', clevs='default', ext='both', cmap='default', clabel='default', save=False):
    #Create the figure and empty map
    w,h = plt.figaspect(1./2.5)  #Makes figure window 3:1; plot itself approximately that
    plt.figure(figNo, figsize=(w,h))    
    Map = Basemap(projection='moll', resolution='l', lon_0=0, lat_0=0)
    Map.drawcoastlines(linewidth=1)
    Map.drawparallels(np.linspace(-90.,90.,7))
    Map.drawmeridians(np.linspace(-150., 150., 11))
    #Obtain the data to plot, and latitude and longitude
    if case == 'geo':
        plotData = np.mean(aprp_geo[key][innerDict][variable], axis=0)
        lon = aprp_geo[key]['Time1_preliminaries']['lon']           
        lat = aprp_geo[key]['Time1_preliminaries']['lat']
    elif case == 'warm':
        plotData = np.mean(aprp_warm[key][innerDict][variable], axis=0)
        lon = aprp_warm[key]['Time1_preliminaries']['lon']           
        lat = aprp_warm[key]['Time1_preliminaries']['lat']
    else: #Solar case
        plotData = np.mean(aprp_solar[key][innerDict][variable], axis=0)
        lon = aprp_solar[key]['Time1_preliminaries']['lon']           
        lat = aprp_solar[key]['Time1_preliminaries']['lat']
    lon = np.append(lon,360.) #was missing 360 value causing white stripe on map    
    lons, lats = np.meshgrid(lon, lat)
    plotData = np.append(plotData, plotData[:,0:1], axis=1)
    #Set default colormap (just one for now--could change this based on which variable is being used)
    if cmap =='default':
        cmap = plt.cm.RdBu_r
    #Make the plot
    if clevs == 'default':  #Use default matplotlib behavior when no levels are specified 
        Map.contourf(lons, lats, plotData, latlon=True, extend=ext, cmap=cmap)            
        cbar = plt.colorbar()                                                             
    else:
        Map.contourf(lons, lats, plotData, latlon=True, extend=ext, cmap=cmap, levels=clevs)
        cbar = plt.colorbar(ticks=np.linspace(min(clevs), max(clevs), 11))
    #Colorbar label (could eventually have a dictionary of these for each variable)
    clabelDict = {'cloud': 'W m$^{-2}$', 
                  'surface': 'W m$^{-2}$', 
                  'noncloud': 'W m$^{-2}$'}
    if clabel == 'default':
        try: #Label in the above dictionary
            cbar.ax.set_ylabel(clabelDict[variable], fontsize = 24)
        except: #Just print the variable name
            cbar.ax.set_ylabel(variable, fontsize=24)
    else: #argument-specified label
        cbar.ax.set_ylabel(clabel, fontsize=24)
    cbar.ax.tick_params(labelsize=22)
    #Title the plot 
    titleString  = gmf.modelNames[key]
    plt.title(titleString, fontsize=26)
    plt.tight_layout()
    #Save the figure if specified
    if(save):   
        plt.savefig('plots/individualModels/APRP_'+variable+'_'+case+'_'+key+'.png')

#Save the png plots
#cloud
plotAPRP_annualMean_contourf_PNG(700, 'geo', 'bn', 'cloud', clevs=np.linspace(-20.,20.,12), save=True)
plotAPRP_annualMean_contourf_PNG(701, 'geo', 'ca', 'cloud', clevs=np.linspace(-20.,20.,12), save=True)
plotAPRP_annualMean_contourf_PNG(702, 'geo', 'cc', 'cloud', clevs=np.linspace(-20.,20.,12), save=True)
plotAPRP_annualMean_contourf_PNG(703, 'geo', 'ce', 'cloud', clevs=np.linspace(-20.,20.,12), save=True)
plotAPRP_annualMean_contourf_PNG(704, 'geo', 'hg', 'cloud', clevs=np.linspace(-20.,20.,12), save=True)
plotAPRP_annualMean_contourf_PNG(705, 'geo', 'ip', 'cloud', clevs=np.linspace(-20.,20.,12), save=True)
plotAPRP_annualMean_contourf_PNG(706, 'geo', 'mi', 'cloud', clevs=np.linspace(-20.,20.,12), save=True)
plotAPRP_annualMean_contourf_PNG(707, 'geo', 'mp', 'cloud', clevs=np.linspace(-20.,20.,12), save=True)
plotAPRP_annualMean_contourf_PNG(708, 'geo', 'no', 'cloud', clevs=np.linspace(-20.,20.,12), save=True)


#noncloud
plotAPRP_annualMean_contourf_PNG(710, 'geo', 'bn', 'noncloud', clevs=np.linspace(-4.,4.,12), save=True)
plotAPRP_annualMean_contourf_PNG(711, 'geo', 'ca', 'noncloud', clevs=np.linspace(-4.,4.,12), save=True)
plotAPRP_annualMean_contourf_PNG(712, 'geo', 'cc', 'noncloud', clevs=np.linspace(-4.,4.,12), save=True)
plotAPRP_annualMean_contourf_PNG(713, 'geo', 'ce', 'noncloud', clevs=np.linspace(-4.,4.,12), save=True)
plotAPRP_annualMean_contourf_PNG(714, 'geo', 'hg', 'noncloud', clevs=np.linspace(-4.,4.,12), save=True)
plotAPRP_annualMean_contourf_PNG(715, 'geo', 'ip', 'noncloud', clevs=np.linspace(-4.,4.,12), save=True)
plotAPRP_annualMean_contourf_PNG(716, 'geo', 'mi', 'noncloud', clevs=np.linspace(-4.,4.,12), save=True)
plotAPRP_annualMean_contourf_PNG(717, 'geo', 'mp', 'noncloud', clevs=np.linspace(-4.,4.,12), save=True)
plotAPRP_annualMean_contourf_PNG(718, 'geo', 'no', 'noncloud', clevs=np.linspace(-4.,4.,12), save=True)


#surface
plotAPRP_annualMean_contourf_PNG(720, 'geo', 'bn', 'surface', clevs=np.linspace(-20.,20.,12), save=True)
plotAPRP_annualMean_contourf_PNG(721, 'geo', 'ca', 'surface', clevs=np.linspace(-20.,20.,12), save=True)
plotAPRP_annualMean_contourf_PNG(722, 'geo', 'cc', 'surface', clevs=np.linspace(-20.,20.,12), save=True)
plotAPRP_annualMean_contourf_PNG(723, 'geo', 'ce', 'surface', clevs=np.linspace(-20.,20.,12), save=True)
plotAPRP_annualMean_contourf_PNG(724, 'geo', 'hg', 'surface', clevs=np.linspace(-20.,20.,12), save=True)
plotAPRP_annualMean_contourf_PNG(725, 'geo', 'ip', 'surface', clevs=np.linspace(-20.,20.,12), save=True)
plotAPRP_annualMean_contourf_PNG(726, 'geo', 'mi', 'surface', clevs=np.linspace(-20.,20.,12), save=True)
plotAPRP_annualMean_contourf_PNG(727, 'geo', 'mp', 'surface', clevs=np.linspace(-20.,20.,12), save=True)
plotAPRP_annualMean_contourf_PNG(728, 'geo', 'no', 'surface', clevs=np.linspace(-20.,20.,12), save=True)

plt.show()



skipGlobalMeans = True
if not skipGlobalMeans:
    # Calculate the global, annual means of the radiative responses
    # Input arguments:
    # case: "geo" (G1-piControl), "warm" (abrupt4xCO2-piControl), or "solar" (abrupt4xCO2-G1)
    # key: identifies the model
    # variable: which APRP output variable we're looking at (see documentation of APRP.py) 
    #
    #Optional inputs:
    #innerDict: which dictionary in the APRP output we're looking at (see documentation of APRP.py)
    # feedback: if True, divide the global mean of the quantity by the change in the global mean 
    #           temperature for the case. (This is for calculating feedback parameters.)
    def calcAPRP_globalMeanVariable(case, key, variable, innerDict = 'APRP', feedback=False):
        if case == 'geo':
            Data = np.mean(aprp_geo[key][innerDict][variable], axis=0) #This is taking the annual mean
            lat = aprp_geo[key]['Time1_preliminaries']['lat']
        elif case == 'warm':
            Data = np.mean(aprp_warm[key][innerDict][variable], axis=0)
            lat = aprp_warm[key]['Time1_preliminaries']['lat']
        else: #Solar case
            Data = np.mean(aprp_solar[key][innerDict][variable], axis=0)
            lat = aprp_solar[key]['Time1_preliminaries']['lat']
        areaWeights = np.cos(lat*np.pi/180)
        areaWeights2D = np.tile(areaWeights,(np.shape(Data)[1],1))
        #print(np.shape(areaWeights2D)) #debug
        areaWeights2D = np.swapaxes(areaWeights2D,0,1)
        weighted2DMatrix = Data*areaWeights2D
        sumWeighted = np.sum(weighted2DMatrix)
        sumWeights = np.sum(areaWeights2D)
        weightedMean = sumWeighted/sumWeights
        if not(feedback):
            return weightedMean       
        else:
            return weightedMean / tempDiff[case][key]
            
            
    #Run these calculations, save to npy files and also print to console where they can be copied into comments here
    
    #Dictionaries to hold the results
    globalMean_APRPcloud_geo = OrderedDict()
    globalMean_APRPnoncloud_geo = OrderedDict()
    globalMean_APRPsurface_geo = OrderedDict()
    globalMean_APRPcloud_warm = OrderedDict()
    globalMean_APRPnoncloud_warm = OrderedDict()
    globalMean_APRPsurface_warm = OrderedDict()
    globalMean_APRPcloud_solar = OrderedDict()
    globalMean_APRPnoncloud_solar = OrderedDict()
    globalMean_APRPsurface_solar = OrderedDict()
        
    #Run calculations and populate the dictionaries
    for key in fluxPaths_G1.keys():
        globalMean_APRPcloud_geo[key] = calcAPRP_globalMeanVariable('geo', key, 'cloud')
        globalMean_APRPnoncloud_geo[key] = calcAPRP_globalMeanVariable('geo', key, 'noncloud')
        globalMean_APRPsurface_geo[key] = calcAPRP_globalMeanVariable('geo', key, 'surface')
        globalMean_APRPcloud_warm[key] = calcAPRP_globalMeanVariable('warm', key, 'cloud')
        globalMean_APRPnoncloud_warm[key] = calcAPRP_globalMeanVariable('warm', key, 'noncloud')
        globalMean_APRPsurface_warm[key] = calcAPRP_globalMeanVariable('warm', key, 'surface')
        globalMean_APRPcloud_solar[key] = calcAPRP_globalMeanVariable('solar', key, 'cloud')
        globalMean_APRPnoncloud_solar[key] = calcAPRP_globalMeanVariable('solar', key, 'noncloud')
        globalMean_APRPsurface_solar[key] = calcAPRP_globalMeanVariable('solar', key, 'surface')
       
    
    #Save dictionaries to npy files (where they can be loaded and looked at in interactive sessions)
    np.save('npyFiles/globalMean_APRPcloud_geo.npy', globalMean_APRPcloud_geo)
    np.save('npyFiles/globalMean_APRPnoncloud_geo.npy', globalMean_APRPnoncloud_geo)
    np.save('npyFiles/globalMean_APRPsurface_geo.npy', globalMean_APRPsurface_geo)
    np.save('npyFiles/globalMean_APRPcloud_warm.npy', globalMean_APRPcloud_warm)
    np.save('npyFiles/globalMean_APRPnoncloud_warm.npy', globalMean_APRPnoncloud_warm)
    np.save('npyFiles/globalMean_APRPsurface_warm.npy', globalMean_APRPsurface_warm)
    np.save('npyFiles/globalMean_APRPcloud_solar.npy', globalMean_APRPcloud_solar)
    np.save('npyFiles/globalMean_APRPnoncloud_solar.npy', globalMean_APRPnoncloud_solar)
    np.save('npyFiles/globalMean_APRPsurface_solar.npy', globalMean_APRPsurface_solar)
    
    
    
    #Print out numbers
    
    print('Global mean change in absorbed SW at TOA due to clouds (W m^-2):')
    print('G1 minus piControl ("geo"):')
    for key, value in globalMean_APRPcloud_geo.items():
        print(gmf.modelNames[key] + ': ' + str(value))
    #   BNU-ESM:            1.35916813646
    #   CanESM-2:           1.43895440791
    #   CCSM4:              2.08838788498
    #   CESM-CAM5.1-FV:     0.712345747162
    #   GISS-E2-R:         -2.61797437131
    #   HadGEM2-ES:         1.05438036034
    #   IPSL-CM5A-LR:       1.3244050879
    #   MIROC-ESM:          3.28577298794
    #   MPI-ESM-LR:         2.62501722014
    #   NorESM1-M:          2.07022868641
    print('abrupt4xCO2 minus piControl ("warm"):')
    for key, value in globalMean_APRPcloud_warm.items():
        print(gmf.modelNames[key] + ': ' + str(value))
    #   BNU-ESM:            0.273964959102
    #   CanESM-2:          -0.171428890006
    #   CCSM4:              0.231649057036
    #   CESM-CAM5.1-FV:     1.1588389728
    #   GISS-E2-R:         -1.88277941448
    #   HadGEM2-ES:         0.683929081734
    #   IPSL-CM5A-LR:       4.88043845824
    #   MIROC-ESM:          1.30721141836
    #   MPI-ESM-LR:         1.71480282345
    #   NorESM1-M:          0.700636109477
    print('abrupt4xCO2 minus G1 ("solar"):')
    for key, value in globalMean_APRPcloud_solar.items():
        print(gmf.modelNames[key] + ': ' + str(value))
    #    #('bn', -1.15546553836), 
    #    #('ca', -1.6622476238946817),  #Difference in number of decimal places here is due 
    #    #('cc', -1.9495943403904368),  #to different printing methods--printing the dictionary values
    #    #('ce', 0.23841351091142876),  #in iPython vs. console output listed here. 
    #    #('gi', 0.75438830600521667), 
    #    #('hg', -0.41268975793350926), 
    #    #('ip', 3.4853042355473249), 
    #    #('mi', -2.1329747199913998),
    #    #('mp', -1.0213484862989934), 
    #    #('no', -1.4555450450845102)
    print(' ')
    #
    print('Global mean change in absorbed SW at TOA due to non-cloud atmosphere (W m^-2):')
    print('G1 minus piControl ("geo"):')
    for key, value in globalMean_APRPnoncloud_geo.items():
        print(gmf.modelNames[key] + ': ' + str(value))
    #   BNU-ESM:            0.0519998402991
    #   CanESM-2:           0.410851268956
    #   CCSM4:             -0.050801576057
    #   CESM-CAM5.1-FV:    -0.0868993760732
    #   GISS-E2-R:          2.59405998761
    #   HadGEM2-ES:         1.06899230421
    #   IPSL-CM5A-LR:       1.2086178012
    #   MIROC-ESM:          0.0591918189991
    #   MPI-ESM-LR:        -0.00246902555408
    #   NorESM1-M:         -0.204370510875
    print('abrupt4xCO2 minus piControl ("warm"):')
    for key, value in globalMean_APRPnoncloud_warm.items():
        print(gmf.modelNames[key] + ': ' + str(value))
    #   BNU-ESM:            1.58438968345
    #   CanESM-2:           2.02721309204
    #   CCSM4:              1.02400596268
    #   CESM-CAM5.1-FV:     1.22615099806
    #   GISS-E2-R:          1.1543863772
    #   HadGEM2-ES:         2.03618514988
    #   IPSL-CM5A-LR:       2.3348970114
    #   MIROC-ESM:          1.92674301147
    #   MPI-ESM-LR:         1.4327310307
    #   NorESM1-M:          0.964534836819
    print('abrupt4xCO2 minus G1 ("solar"):')
    for key, value in globalMean_APRPnoncloud_solar.items():
        print(gmf.modelNames[key] + ': ' + str(value))
    #    #('bn', 1.51362771399), 
    #    #('ca', 1.5818120019626145), 
    #    #('cc', 1.062075084083562), 
    #    #('ce', 1.2712433619485379), 
    #    #('gi', -1.5926631679266547), 
    #    #('hg', 0.89870236809570936), 
    #    #('ip', 1.1000179615511245), 
    #    #('mi', 1.8220864359781954), 
    #    #('mp', 1.4091038776124951), 
    #    #('no', 1.1669207766554812)
    print(' ')    
    #
    print('Global mean change in absorbed SW at TOA due to surface albedo (W m^-2):')
    print('G1 minus piControl ("geo"):')
    for key, value in globalMean_APRPsurface_geo.items():
        print(gmf.modelNames[key] + ': ' + str(value))
    #   BNU-ESM:           0.506108076824
    #   CanESM-2:          -0.0379708876622
    #   CCSM4:             0.277262001711
    #   CESM-CAM5.1-FV:    0.865587138848
    #   GISS-E2-R:         1.01316597874
    #   HadGEM2-ES:        0.49530706195
    #   IPSL-CM5A-LR:      0.149627453549
    #   MIROC-ESM:         0.0166840213753
    #   MPI-ESM-LR:        0.1695297307
    #   NorESM1-M:         0.0504476497596
    print('abrupt4xCO2 minus piControl ("warm"):')
    for key, value in globalMean_APRPsurface_warm.items():
        print(gmf.modelNames[key] + ': ' + str(value))
    #   BNU-ESM:           2.53420172243
    #   CanESM-2:          1.26124313947
    #   CCSM4:             1.59449598828
    #   CESM-CAM5.1-FV:    1.68268166438
    #   GISS-E2-R:         0.142716964325
    #   HadGEM2-ES:        1.52999292876
    #   IPSL-CM5A-LR:      0.878279747975
    #   MIROC-ESM:         2.25970576094
    #   MPI-ESM-LR:        0.98465461199
    #   NorESM1-M:         0.905970989144
    print('abrupt4xCO2 minus G1 ("solar"):')
    for key, value in globalMean_APRPsurface_solar.items():
        print(gmf.modelNames[key] + ': ' + str(value))
    #    #('bn', 2.02219475316), 
    #    #('ca', 1.3020379198551437), 
    #    #('cc', 1.3229258218877569), 
    #    #('ce', 0.97698376904819817), 
    #    #('gi', -0.87808320301731524), 
    #    #('hg', 1.0595105479514586), 
    #    #('ip', 0.72822810552794737), 
    #    #('mi', 2.2500010494978353), 
    #    #('mp', 0.81929223549134034), 
    #    #('no', 0.86245915134729134)
    print(' ')    
    
    


