Skip to content

Commit

Permalink
Merge pull request #307 from forsyth2/streamflow
Browse files Browse the repository at this point in the history
Streamflow Diagnostics
  • Loading branch information
forsyth2 authored Oct 1, 2020
2 parents e785582 + 1961dc1 commit 748b82c
Show file tree
Hide file tree
Showing 16 changed files with 891 additions and 9 deletions.
6 changes: 6 additions & 0 deletions acme_diags/driver/default_diags/streamflow_model_vs_model.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[#]
sets = ["streamflow"]
case_id = "seasonality"
variables = ["RIVER_DISCHARGE_OVER_LAND_LIQ"]
regions = ["global"]
seasons = ["ANN"]
8 changes: 8 additions & 0 deletions acme_diags/driver/default_diags/streamflow_model_vs_obs.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[#]
sets = ["streamflow"]
case_id = "seasonality"
variables = ["RIVER_DISCHARGE_OVER_LAND_LIQ"]
ref_name = "GSIM"
reference_name = "GSIM monthly streamflow (1986-1995)"
regions = ["global"]
seasons = ["ANN"]
316 changes: 316 additions & 0 deletions acme_diags/driver/streamflow_driver.py

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions acme_diags/driver/utils/dataset.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,18 @@ def get_climo_variable(self, var, season, extra_vars=[], *args, **kwargs):
return variables[0] if len(variables) == 1 else variables


def get_static_variable(self, static_var, primary_var):
if self.ref:
# Get the reference variable from timeseries files.
data_path = self.parameters.reference_data_path
elif self.test:
# Get the test variable from timeseries files.
data_path = self.parameters.test_data_path
file_path = self._get_timeseries_file_path(primary_var, data_path)
with cdms2.open(file_path) as f:
return f(static_var)


def is_timeseries(self):
"""
Return True if this dataset is for timeseries data.
Expand Down
4 changes: 3 additions & 1 deletion acme_diags/parameter/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from .area_mean_time_series_parameter import AreaMeanTimeSeriesParameter
from .enso_diags_parameter import EnsoDiagsParameter
from .qbo_parameter import QboParameter
from .streamflow_parameter import StreamflowParameter

SET_TO_PARAMETERS = {
'zonal_mean_xy': CoreParameter,
Expand All @@ -14,5 +15,6 @@
'cosp_histogram': CoreParameter,
'area_mean_time_series': AreaMeanTimeSeriesParameter,
'enso_diags': EnsoDiagsParameter,
'qbo': QboParameter
'qbo': QboParameter,
'streamflow': StreamflowParameter
}
2 changes: 1 addition & 1 deletion acme_diags/parameter/core_parameter.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def __init__(self):

self.sets = ['zonal_mean_xy', 'zonal_mean_2d', 'meridional_mean_2d',
'lat_lon', 'polar', 'area_mean_time_series', 'cosp_histogram',
'enso_diags', 'qbo']
'enso_diags', 'qbo', 'streamflow']
self.dataset = ''
self.run_type = 'model_vs_obs'
self.variables = []
Expand Down
62 changes: 62 additions & 0 deletions acme_diags/parameter/streamflow_parameter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
from .core_parameter import CoreParameter


class StreamflowParameter(CoreParameter):
def __init__(self):
super(StreamflowParameter, self).__init__()
self.max_num_gauges = None
self.test_mat_file = None
self.ref_mat_file = None
self.plot_type = 'seasonality'
self.print_statements = False
self.ref_timeseries_input = True
self.test_timeseries_input = True
self.granulate.remove('seasons')

def check_values(self):
if not hasattr(self, 'gauges_path'):
msg = 'gauges_path must be specified'
raise RuntimeError(msg)

# TODO: In future pull requests add 'scatter', 'bias'
valid_plot_types = ['seasonality']
if self.plot_type not in valid_plot_types:
msg = 'plot_type={} not in {}'.format(
self.plot_type, valid_plot_types)
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)
4 changes: 3 additions & 1 deletion acme_diags/parser/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from .area_mean_time_series_parser import AreaMeanTimeSeriesParser
from .enso_diags_parser import EnsoDiagsParser
from .qbo_parser import QboParser
from .streamflow_parser import StreamflowParser

SET_TO_PARSER = {
'zonal_mean_xy': CoreParser,
Expand All @@ -14,6 +15,7 @@
'cosp_histogram': CoreParser,
'area_mean_time_series': AreaMeanTimeSeriesParser,
'enso_diags': EnsoDiagsParser,
'qbo': QboParser
'qbo': QboParser,
'streamflow': StreamflowParser
}

67 changes: 67 additions & 0 deletions acme_diags/parser/streamflow_parser.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
from .core_parser import CoreParser
from acme_diags.parameter.streamflow_parameter import StreamflowParameter


class StreamflowParser(CoreParser):
def __init__(self, *args, **kwargs):
if 'parameter_cls' in kwargs:
super().__init__(*args, **kwargs)
else:
super().__init__(parameter_cls=StreamflowParameter, *args, **kwargs)


def load_default_args(self, files=[]):
# This has '-p' and '--parameter' reserved.
super().load_default_args(files)

self.add_argument(
'--gauges_path',
dest='gauges_path',
help='The file containing the gauge data.',
action='store_const',
const=True,
required=False)

self.add_argument(
'--max_num_gauges',
dest='max_num_gauges',
help='The maximum number of gauges that should be processed.',
action='store_const',
const=True,
required=False)

self.add_argument(
'--print_statements',
dest='print_statements',
help='Print information useful for debugging.',
action='store_const',
const=True,
required=False)

self.add_argument(
'--ref_timeseries_input',
dest='ref_timeseries_input',
help='The input reference data are timeseries files.',
action='store_const',
const=True,
required=False)

self.add_argument(
'--test_timeseries_input',
dest='test_timeseries_input',
help='The input test data are timeseries files.',
action='store_const',
const=True,
required=False)

self.add_argument(
'--start_yr',
dest='start_yr',
help="Start year for the timeseries files.",
required=False)

self.add_argument(
'--end_yr',
dest='end_yr',
help="End year for the timeseries files.",
required=False)
Loading

0 comments on commit 748b82c

Please sign in to comment.