blob: 54f5843213bf20829aca4b3bbf782798358cece3 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
import numpy as np
import datetime
# import Apache OCW dependences
import ocw.data_source.local as local
from ocw.dataset import Bounds as Bounds
import ocw.dataset_processor as dsp
import ocw.metrics as metrics
import ocw.plotter as plotter
import ocw.utils as utils
# nClimDiv observation file
file_obs = 'nClimDiv/nClimDiv_tave_1895-2005.nc'
# CMIP5 simulations
model_file_path = 'CMIP5_historical'
dataset_name = ['BNU-ESM','CanESM2','CNRM-CM5','CSIRO-Mk3',
'GISS-E2-H','HadCM3','inmcm4','MIROC-ESM',
'MPI-ESM-LR','NorESM1-M']
nmodel = len(dataset_name) # number of CMIP5 simulations
# temporal boundary
start_date = datetime.datetime(1979, 12, 1)
end_date = datetime.datetime(2005, 8, 31)
nyear = 26
month_start = 6 # June
month_end = 8 # August
regions = []
regions.append(['WA', 'OR', 'ID'])
regions.append(['CA', 'NV', 'AZ', 'NM', 'UT','CO'])
regions.append(['MT', 'WY', 'ND', 'SD', 'NE'])
regions.append(['KS', 'TX', 'OK'])
regions.append(['MN', 'IA', 'MO', 'WI', 'IL', 'IN', 'MI','OH'])
regions.append(['ME', 'VT', 'NH', 'MA', 'NY', 'CT', 'RI','NJ','PA','WV','DE', 'MD'])
regions.append(['KY', 'VA', 'AR','AL', 'LA','MS', 'FL', 'GA','NC','SC', 'DC','TN'])
plotter.fill_US_states_with_color(regions, 'NCA_seven_regions', colors=True,
region_names=['NW','SW','NGP','SGP','MW','NE','SE'])
n_region = 7 # number of regions
# CONUS regional boundaries
NW_bounds = Bounds(boundary_type='us_states',
us_states=regions[0])
SW_bounds = Bounds(boundary_type='us_states',
us_states=regions[1])
NGP_bounds = Bounds(boundary_type='us_states',
us_states=regions[2])
SGP_bounds = Bounds(boundary_type='us_states',
us_states=regions[3])
MW_bounds = Bounds(boundary_type='us_states',
us_states=regions[4])
NE_bounds = Bounds(boundary_type='us_states',
us_states=regions[5])
SE_bounds = Bounds(boundary_type='us_states',
us_states=regions[6])
regional_bounds = [NW_bounds, SW_bounds, NGP_bounds,
SGP_bounds, MW_bounds, NE_bounds, SE_bounds]
""" Load nClimDiv file into OCW Dataset """
obs_dataset = local.load_file(file_obs, variable_name='tave')
""" Load CMIP5 simulations into a list of OCW Datasets"""
model_dataset = local.load_multiple_files(file_path=model_file_path, variable_name='tas',
dataset_name=dataset_name, variable_unit='K')
""" Temporal subset of obs_dataset """
obs_dataset_subset = dsp.temporal_slice(obs_dataset,
start_time=start_date, end_time=end_date)
obs_dataset_season = dsp.temporal_subset(obs_dataset_subset, month_start, month_end,
average_each_year=True)
""" Temporal subset of model_dataset """
model_dataset_subset = [dsp.temporal_slice(dataset,start_time=start_date, end_time=end_date)
for dataset in model_dataset]
model_dataset_season = [dsp.temporal_subset(dataset, month_start, month_end,
average_each_year=True) for dataset in model_dataset_subset]
""" Spatial subset of obs_dataset and generate time series """
obs_timeseries = np.zeros([nyear, n_region]) # region index 0-6: NW, SW, NGP, SGP, MW, NE, SE
model_timeseries = np.zeros([nmodel, nyear, n_region])
for iregion in np.arange(n_region):
obs_timeseries[:, iregion] = utils.calc_time_series(
dsp.subset(obs_dataset_season, regional_bounds[iregion]))
for imodel in np.arange(nmodel):
model_timeseries[imodel, :, iregion] = utils.calc_time_series(
dsp.subset(model_dataset_season[imodel], regional_bounds[iregion]))
year = np.arange(nyear)
regional_trends_obs = np.zeros(n_region)
regional_trends_obs_error = np.zeros(n_region)
regional_trends_model = np.zeros([nmodel, n_region])
regional_trends_model_error = np.zeros([nmodel, n_region])
regional_trends_ens = np.zeros(n_region)
regional_trends_ens_error = np.zeros(n_region)
for iregion in np.arange(n_region):
regional_trends_obs[iregion], regional_trends_obs_error[iregion] = utils.calculate_temporal_trend_of_time_series(
year, obs_timeseries[:,iregion])
for imodel in np.arange(nmodel):
regional_trends_model[imodel, iregion], regional_trends_model_error[iregion] = utils.calculate_temporal_trend_of_time_series(
year, model_timeseries[imodel, :, iregion])
regional_trends_ens[iregion], regional_trends_ens_error[iregion] = utils.calculate_ensemble_temporal_trends(
model_timeseries[:, :, iregion])
""" Generate plots """
plotter.fill_US_states_with_color(regions, 'nClimDiv_tave_trends_JJA_1980-2005',
values=regional_trends_obs,
region_names=['%.3f' %(10*i) for i in regional_trends_obs])
plotter.fill_US_states_with_color(regions, 'CMIP5_ENS_tave_trends_JJA_1980-2005',
values=regional_trends_ens,
region_names=['%.3f' %(10*i) for i in regional_trends_ens])
bias_ens = regional_trends_ens - regional_trends_obs
plotter.fill_US_states_with_color(regions, 'CMIP5_ENS_tave_trends_bias_from_nClimDiv_JJA_1980-2005',
values=bias_ens,
region_names=['%.3f' %(10*i) for i in bias_ens])
obs_data = np.vstack([regional_trends_obs, regional_trends_obs_error])
ens_data = np.vstack([regional_trends_ens, regional_trends_ens_error])
plotter.draw_plot_to_compare_trends(obs_data, ens_data, regional_trends_model,
fname='Trends_comparison_btn_CMIP5_and_nClimDiv',
data_labels=['NW','SW','NGP','SGP','MW','NE','SE'],
xlabel='NCA regions', ylabel='tas trend [K/year]')