Skip to content

Commit

Permalink
ENSO updates
Browse files Browse the repository at this point in the history
  • Loading branch information
forsyth2 committed Mar 25, 2020
1 parent 6705b36 commit e636f30
Show file tree
Hide file tree
Showing 7 changed files with 143 additions and 26 deletions.
6 changes: 4 additions & 2 deletions acme_diags/derivations/acme.py
Expand Up @@ -519,7 +519,8 @@ def cosp_histogram_standardize(cld):
]),
'NET_FLUX_SRF': OrderedDict([
(('FSNS','FLNS','LHFLX','SHFLX'), lambda fsns, flns, lhflx, shflx: netflux4(fsns, flns, lhflx, shflx)),
(('rsds','rsus','rlds','rlus','hfls','hfss'), lambda rsds, rsus, rlds, rlus, hfls, hfss: netflux6(rsds, rsus, rlds, rlus, hfls, hfss))
(('rsds','rsus','rlds','rlus','hfls','hfss'), lambda rsds, rsus, rlds, rlus, hfls, hfss: netflux6(rsds, rsus, rlds, rlus, hfls, hfss)),
(('QFLX'), lambda qflx: qflxconvert_units(qflx))
]),
'FLUT': OrderedDict([
(('rlut',), rename)
Expand Down Expand Up @@ -604,7 +605,8 @@ def cosp_histogram_standardize(cld):
(('QFLX',), lambda qflx: qflxconvert_units(qflx))
]),
'LHFLX': OrderedDict([
(('hfls',), rename)
(('hfls',), rename),
(('QFLX'), lambda qflx: qflxconvert_units(qflx))
]),
'SHFLX': OrderedDict([
(('hfss',), rename)
Expand Down
15 changes: 13 additions & 2 deletions acme_diags/driver/enso_diags_driver.py
Expand Up @@ -54,15 +54,26 @@ def calculate_nino_index_model(data, nino_region_str, parameter):
"""

try:
sst = data.get_timeseries_variable('SST')
try:
# Try sea surface temperature first.
sst = data.get_timeseries_variable('SST')
except RuntimeError as e:
if str(e).startswith('Neither does SST nor the variables in'):
print(e)
# Try surface temperature.
sst = data.get_timeseries_variable('TS')
print('Simulated sea surface temperature not found, using surface temperature.')
else:
raise e
nino_region = default_regions.regions_specs[nino_region_str]['domain']
sst_nino = sst(nino_region)
# Domain average
sst_avg = cdutil.averager(sst_nino, axis='xy')
# Get anomaly from annual cycle climatology
sst_avg_anomaly = cdutil.ANNUALCYCLE.departures(sst_avg)
nino_index = sst_avg_anomaly
except:
except RuntimeError as e:
print(e)
nino_index = calculate_nino_index(nino_region_str, parameter)
print("Simulated surface temperature not found, using built-in HadISST nino index time series.")

Expand Down
38 changes: 35 additions & 3 deletions acme_diags/parameter/enso_diags_parameter.py
Expand Up @@ -24,6 +24,38 @@ def check_values(self):
self.plot_type, valid_plot_types)
raise RuntimeError(msg)

if not (hasattr(self, 'start_yr') and hasattr(self, 'end_yr')):
msg = "You need to define both the 'start_yr' and 'end_yr' parameter."
raise RuntimeError(msg)
test_ref_start_yr_both_set = hasattr(self, 'test_start_yr') and hasattr(self, 'ref_start_yr')
if hasattr(self, 'start_yr'):
# Use `start_yr` as a default value for other parameters.
if not hasattr(self, 'test_start_yr'):
self.test_start_yr = self.start_yr
if not hasattr(self, 'ref_start_yr'):
self.ref_start_yr = self.start_yr
elif test_ref_start_yr_both_set and self.test_start_yr == self.ref_start_yr:
# Derive the value of self.start_yr
self.start_yr = self.test_start_yr

test_ref_end_yr_both_set = hasattr(self, 'test_end_yr') and hasattr(self, 'ref_end_yr')
if hasattr(self, 'end_yr'):
# Use `end_yr` as a default value for other parameters.
if not hasattr(self, 'test_end_yr'):
self.test_end_yr = self.end_yr
if not hasattr(self, 'ref_end_yr'):
self.ref_end_yr = self.end_yr
elif test_ref_end_yr_both_set and self.test_end_yr == self.ref_end_yr:
# Derive the value of self.end_yr
self.end_yr = self.test_end_yr

if hasattr(self, 'start_yr'):
# We need to re-evaluate this variable, since these attributes could have been set.
test_ref_end_yr_both_set = hasattr(self, 'test_end_yr') and hasattr(self, 'ref_end_yr')
if not (hasattr(self, 'end_yr') or test_ref_end_yr_both_set):
msg = "To use 'start_yr' you need to also define 'end_yr' or both 'test_end_yr' and 'ref_end_yr'."
raise RuntimeError(msg)

if hasattr(self, 'end_yr'):
# We need to re-evaluate this variable, since these attributes could have been set.
test_ref_start_yr_both_set = hasattr(self, 'test_start_yr') and hasattr(self, 'ref_start_yr')
if not (hasattr(self, 'start_yr') or test_ref_start_yr_both_set):
msg = "To use 'end_yr' you need to also define 'start_yr' or both 'test_start_yr' and 'ref_start_yr'."
raise RuntimeError(msg)
33 changes: 33 additions & 0 deletions run.py
@@ -0,0 +1,33 @@
# TODO: Remove before merging
# pip install . && python run.py
import os
from acme_diags.parameter.core_parameter import CoreParameter
from acme_diags.parameter.enso_diags_parameter import EnsoDiagsParameter
from acme_diags.run import runner

param = CoreParameter()
# Mac
param.test_data_path = '/Users/forsyth2/projectAIMS/data/test_model_data_for_acme_diags/time-series/E3SM_v1_amip'
param.reference_data_path = '/Users/forsyth2/projectAIMS/data/obs_for_e3sm_diags/time-series/ERA-Interim'
param.test_name = 'E3SM v1 amip'
param.reference_name = 'ERA-Interim'
prefix = ''
param.results_dir = os.path.join(prefix, 'enso_reg_diags_model_to_model_local')
param.run_type = 'model_vs_model'
param.diff_title = 'Model vs Model'
param.output_format = ['png']
param.output_format_subplot = ['png']
param.save_netcdf = True
param.test_start_yr = '2000'
param.ref_start_yr = '2000'
# param.end_yr = '2004'

# We're passing in this object as well as the CoreParameter object
enso_param = EnsoDiagsParameter()
#enso_param.start_yr = '2000'
# enso_param.test_start_yr = '2000'
# enso_param.ref_start_yr = '2000'
enso_param.end_yr = '2004'

runner.sets_to_run = ['enso_diags']
runner.run_diags([param, enso_param])
13 changes: 13 additions & 0 deletions test.cfg
@@ -0,0 +1,13 @@
[#]
sets = ["enso_diags"]
case_id = "PRECT-response"
variables = ["PRECT"]
ref_name = "GPCP_v2.3"
reference_name = "GPCP_v2.3"
regions = ["20S20N"]
seasons = ["ANN"]
reference_colormap = "diverging_bwr.rgb"
test_colormap = "diverging_bwr.rgb"
diff_colormap = "BrBG"
contour_levels = [-5,-3,-2,-1,-0.5,-0.2,0.2,0.5,1,2,3,5]
diff_levels = [-5,-3,-2,-1,-0.5,-0.2,0.2,0.5,1,2,3,5]
27 changes: 23 additions & 4 deletions tests/system/all_sets.cfg
Expand Up @@ -149,7 +149,7 @@ debug = True

[enso_diags]
sets = ["enso_diags"]
case_id = 'TREFHT-response'
case_id = 'TREFHT-response-map'
debug = True
diff_colormap = "BrBG"
output_format_subplot = ["png"]
Expand All @@ -168,11 +168,30 @@ print_statements = True

[#]
sets = ["enso_diags"]
plot_type = "scatter"
case_id = "TREFHT"
case_id = 'TREFHT-response-map-start-yrs'
debug = True
diff_colormap = "BrBG"
output_format_subplot = ["png"]
regions = ["20S20N"]
results_dir = "all_sets_results_test"
seasons = ["ANN"]
test_start_yr='2012'
ref_start_yr='2012'
end_yr = '2013'
test_data_path = '.'
test_file = 'TREFHT_201201_201312.nc'
reference_data_path = '.'
ref_file = 'TREFHT_201201_201312.nc'
test_name = "system tests"
variables = ["TREFHT"]
print_statements = True

[#]
sets = ["enso_diags"]
plot_type = "scatter"
case_id = "TREFHT-response-scatter"
debug = True
results_dir = "all_sets_results_test"
seasons = ["ANN"]
start_yr = '2012'
end_yr = '2013'
Expand All @@ -182,4 +201,4 @@ reference_data_path = '.'
ref_file = 'TREFHT_201201_201312.nc'
test_name = "system tests"
variables = ["TREFHT"]
print_statements = True
print_statements = True
37 changes: 22 additions & 15 deletions tests/system/test_diags.py
Expand Up @@ -130,6 +130,21 @@ def check_plots_plevs(self, set_name, region, plevs):
plev=plev
)

def check_enso_map_plots(self, case_id):
case_id_lower = case_id.lower()
nino_region_lower = 'NINO34'.lower()
set_name = 'enso_diags'
variables = ['TREFHT']
for variable in variables:
variable_lower = variable.lower()
png_path = '{}/{}/regression-coefficient-{}-over-{}.png'.format(
set_name, case_id, variable_lower, nino_region_lower)
full_png_path = '{}{}'.format(TestAllSets.results_dir, png_path)
self.assertTrue(os.path.exists(full_png_path))
html_path = '{}viewer/{}/map/{}/plot.html'.format(
TestAllSets.results_dir, set_name, case_id_lower)
self.check_html_image(html_path, png_path)

# Test results_dir
def test_results_dir(self):
self.assertTrue(TestAllSets.results_dir.endswith('all_sets_results_test/'))
Expand Down Expand Up @@ -158,23 +173,15 @@ def test_cosp_histogram(self):
)

def test_enso_diags_map(self):
case_id = 'TREFHT-response'
case_id_lower = case_id.lower()
nino_region_lower = 'NINO34'.lower()
set_name = 'enso_diags'
variables = ['TREFHT']
for variable in variables:
variable_lower = variable.lower()
png_path = '{}/{}/regression-coefficient-{}-over-{}.png'.format(
set_name, case_id, variable_lower, nino_region_lower)
full_png_path = '{}{}'.format(TestAllSets.results_dir, png_path)
self.assertTrue(os.path.exists(full_png_path))
html_path = '{}viewer/{}/map/{}/plot.html'.format(
TestAllSets.results_dir, set_name, case_id_lower)
self.check_html_image(html_path, png_path)
case_id = 'TREFHT-response-map'
self.check_enso_map_plots(case_id)

def test_enso_diags_map_start_yrs(self):
case_id = 'TREFHT-response-map-start-yrs'
self.check_enso_map_plots(case_id)

def test_enso_diags_scatter(self):
case_id = 'TREFHT'
case_id = 'TREFHT-response-scatter'
case_id_lower = case_id.lower()
set_name = 'enso_diags'
variables = ['TREFHT']
Expand Down

0 comments on commit e636f30

Please sign in to comment.