From ebddb56d1acc0d25a10505fa30b5e5beff4ed77c Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Tue, 26 Jan 2021 09:32:54 -0700 Subject: [PATCH 001/165] Start on write netcdf pickle alternative. --- met/data/wrappers/write_pickle_dataplane.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/met/data/wrappers/write_pickle_dataplane.py b/met/data/wrappers/write_pickle_dataplane.py index 079557538b..bacf617ceb 100644 --- a/met/data/wrappers/write_pickle_dataplane.py +++ b/met/data/wrappers/write_pickle_dataplane.py @@ -13,12 +13,16 @@ import pickle import importlib.util import xarray as xr +import netCDF4 as nc print('Python Script:\t', sys.argv[0]) print('User Command:\t', sys.argv[2:]) print('Write Pickle:\t', sys.argv[1]) pickle_filename = sys.argv[1] +netcdf_filename = sys.argv[1] + '.nc4' + +print('Write NetCDF:\t', netcdf_filename) pyembed_module_name = sys.argv[2] sys.argv = sys.argv[2:] @@ -37,6 +41,21 @@ else: met_info = { 'attrs': met_in.attrs, 'met_data': met_in.met_data } +print('write_pickle_dataplane') print(met_info) pickle.dump( met_info, open( pickle_filename, "wb" ) ) + +# write NetCDF file +ds = nc.Dataset(netcdf_filename, 'w') + +nx, ny = met_in.met_data.shape +print(nx, ny) +ds.createDimension('x', nx) +ds.createDimension('y', ny) +ds.createVariable('met_data', met_in.met_data.dtype, ('x', 'y')) + +for attr in met_in.attrs: + attr_val = met_in.attrs[attr] + print(attr, attr_val, type(attr_val)) +ds.close() From 0fdbfdd617bca2b36fee468dc04e9dcb5a96b8dc Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Tue, 26 Jan 2021 09:38:43 -0700 Subject: [PATCH 002/165] Write dataplane array. --- met/data/wrappers/write_pickle_dataplane.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/met/data/wrappers/write_pickle_dataplane.py b/met/data/wrappers/write_pickle_dataplane.py index bacf617ceb..c9ba3a57eb 100644 --- a/met/data/wrappers/write_pickle_dataplane.py +++ b/met/data/wrappers/write_pickle_dataplane.py @@ -53,7 +53,8 @@ print(nx, ny) ds.createDimension('x', nx) ds.createDimension('y', ny) -ds.createVariable('met_data', met_in.met_data.dtype, ('x', 'y')) +dp = ds.createVariable('met_data', met_in.met_data.dtype, ('x', 'y')) +dp[:] = met_in.met_data for attr in met_in.attrs: attr_val = met_in.attrs[attr] From 6d46603cad053d426e22cf3927b7358892ec06aa Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Tue, 26 Jan 2021 09:46:16 -0700 Subject: [PATCH 003/165] Start on read of netcdf as pickle alternative. --- met/data/wrappers/read_pickle_dataplane.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/met/data/wrappers/read_pickle_dataplane.py b/met/data/wrappers/read_pickle_dataplane.py index f97f153df7..58badccdd2 100644 --- a/met/data/wrappers/read_pickle_dataplane.py +++ b/met/data/wrappers/read_pickle_dataplane.py @@ -9,7 +9,16 @@ import sys import numpy as np import pickle +import netCDF4 as nc print('Python Script:\t', sys.argv[0]) print('Load Pickle:\t', sys.argv[1]) met_info = pickle.load(open(sys.argv[1], "rb")) + +netcdf_filename = sys.argv[1] + '.nc4' +print('Read NetCDF:\t', netcdf_filename) + +# read NetCDF file +ds = nc.Dataset(netcdf_filename, 'r') +met_data = ds['met_data'][:] +met_info['met_data'] = met_data From 6fe424551448285776909c07dd1304515fff1912 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Tue, 2 Feb 2021 11:15:04 -0700 Subject: [PATCH 004/165] Create attribute variables. --- met/data/wrappers/write_pickle_dataplane.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/met/data/wrappers/write_pickle_dataplane.py b/met/data/wrappers/write_pickle_dataplane.py index c9ba3a57eb..a6e5b0a42a 100644 --- a/met/data/wrappers/write_pickle_dataplane.py +++ b/met/data/wrappers/write_pickle_dataplane.py @@ -59,4 +59,6 @@ for attr in met_in.attrs: attr_val = met_in.attrs[attr] print(attr, attr_val, type(attr_val)) + if type(attr_val) == str: + a = ds.createVariable(attr, 'str') ds.close() From 644db219b3a6518d51569b4bfe6bb626a510935f Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Wed, 3 Feb 2021 16:25:46 -0700 Subject: [PATCH 005/165] Use global attributes for met_info attrs. --- met/data/wrappers/write_pickle_dataplane.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/met/data/wrappers/write_pickle_dataplane.py b/met/data/wrappers/write_pickle_dataplane.py index a6e5b0a42a..1764bbbd9e 100644 --- a/met/data/wrappers/write_pickle_dataplane.py +++ b/met/data/wrappers/write_pickle_dataplane.py @@ -53,6 +53,7 @@ print(nx, ny) ds.createDimension('x', nx) ds.createDimension('y', ny) +ds.createDimension('str_dim', 1) dp = ds.createVariable('met_data', met_in.met_data.dtype, ('x', 'y')) dp[:] = met_in.met_data @@ -60,5 +61,5 @@ attr_val = met_in.attrs[attr] print(attr, attr_val, type(attr_val)) if type(attr_val) == str: - a = ds.createVariable(attr, 'str') + setattr(ds, attr, attr_val) ds.close() From 659406273e3cd211578ddda0e8201ca48fdd151b Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Wed, 3 Feb 2021 17:45:08 -0700 Subject: [PATCH 006/165] Add grid structure. --- met/data/wrappers/write_pickle_dataplane.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/met/data/wrappers/write_pickle_dataplane.py b/met/data/wrappers/write_pickle_dataplane.py index 1764bbbd9e..ec234a5c40 100644 --- a/met/data/wrappers/write_pickle_dataplane.py +++ b/met/data/wrappers/write_pickle_dataplane.py @@ -53,7 +53,6 @@ print(nx, ny) ds.createDimension('x', nx) ds.createDimension('y', ny) -ds.createDimension('str_dim', 1) dp = ds.createVariable('met_data', met_in.met_data.dtype, ('x', 'y')) dp[:] = met_in.met_data @@ -62,4 +61,7 @@ print(attr, attr_val, type(attr_val)) if type(attr_val) == str: setattr(ds, attr, attr_val) + if type(attr_val) == dict: + for key in attr_val: + setattr(ds, attr + '.' + key, attr_val[key]) ds.close() From c6667e38e598716282e8b22ec43d6002beb0024c Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Wed, 3 Feb 2021 18:54:31 -0700 Subject: [PATCH 007/165] Read metadata back into met_info.attrs. --- met/data/wrappers/read_pickle_dataplane.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/met/data/wrappers/read_pickle_dataplane.py b/met/data/wrappers/read_pickle_dataplane.py index 58badccdd2..ddbcddce5c 100644 --- a/met/data/wrappers/read_pickle_dataplane.py +++ b/met/data/wrappers/read_pickle_dataplane.py @@ -21,4 +21,11 @@ # read NetCDF file ds = nc.Dataset(netcdf_filename, 'r') met_data = ds['met_data'][:] +grid = {} +for attr, attr_val in ds.__dict__.items(): + print(attr, attr_val) + if 'grid' in attr: + grid_attr = attr.split('.')[1] + grid[grid_attr] = attr_val +print(grid) met_info['met_data'] = met_data From 1e6eb9ee260658c2e2d0098ce93d91f193698f7f Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Wed, 3 Feb 2021 19:20:17 -0700 Subject: [PATCH 008/165] Convert grid.nx and grid.ny to int. --- met/data/wrappers/read_pickle_dataplane.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/met/data/wrappers/read_pickle_dataplane.py b/met/data/wrappers/read_pickle_dataplane.py index ddbcddce5c..e3b1b03768 100644 --- a/met/data/wrappers/read_pickle_dataplane.py +++ b/met/data/wrappers/read_pickle_dataplane.py @@ -13,7 +13,8 @@ print('Python Script:\t', sys.argv[0]) print('Load Pickle:\t', sys.argv[1]) -met_info = pickle.load(open(sys.argv[1], "rb")) +# met_info = pickle.load(open(sys.argv[1], "rb")) +met_info = {} netcdf_filename = sys.argv[1] + '.nc4' print('Read NetCDF:\t', netcdf_filename) @@ -21,11 +22,16 @@ # read NetCDF file ds = nc.Dataset(netcdf_filename, 'r') met_data = ds['met_data'][:] +met_attrs = {} grid = {} for attr, attr_val in ds.__dict__.items(): - print(attr, attr_val) if 'grid' in attr: grid_attr = attr.split('.')[1] grid[grid_attr] = attr_val -print(grid) + else: + met_attrs[attr] = attr_val +grid['nx'], grid['ny'] = int(grid['nx']), int(grid['ny']) +met_attrs['grid'] = grid met_info['met_data'] = met_data +met_info['attrs'] = met_attrs +print(met_info) From e0055854e870f4d6a7c4c0ad3bd0e3220b69434c Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Wed, 3 Feb 2021 19:27:04 -0700 Subject: [PATCH 009/165] Rename _name key to name. --- met/data/wrappers/read_pickle_dataplane.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/met/data/wrappers/read_pickle_dataplane.py b/met/data/wrappers/read_pickle_dataplane.py index e3b1b03768..330ed740a0 100644 --- a/met/data/wrappers/read_pickle_dataplane.py +++ b/met/data/wrappers/read_pickle_dataplane.py @@ -32,6 +32,8 @@ met_attrs[attr] = attr_val grid['nx'], grid['ny'] = int(grid['nx']), int(grid['ny']) met_attrs['grid'] = grid +met_attrs['name'] = met_attrs['_name'] +del met_attrs['_name'] met_info['met_data'] = met_data met_info['attrs'] = met_attrs print(met_info) From ab986caf6564b54067b0caa91c0ae78c2d9bb5c9 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Thu, 4 Feb 2021 10:56:14 -0700 Subject: [PATCH 010/165] Removed pickle write. --- met/data/wrappers/read_pickle_dataplane.py | 5 +++-- met/data/wrappers/write_pickle_dataplane.py | 11 +++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/met/data/wrappers/read_pickle_dataplane.py b/met/data/wrappers/read_pickle_dataplane.py index 330ed740a0..dabc2f51e3 100644 --- a/met/data/wrappers/read_pickle_dataplane.py +++ b/met/data/wrappers/read_pickle_dataplane.py @@ -12,11 +12,12 @@ import netCDF4 as nc print('Python Script:\t', sys.argv[0]) -print('Load Pickle:\t', sys.argv[1]) +# print('Load Pickle:\t', sys.argv[1]) # met_info = pickle.load(open(sys.argv[1], "rb")) met_info = {} -netcdf_filename = sys.argv[1] + '.nc4' +# netcdf_filename = sys.argv[1] + '.nc4' +netcdf_filename = sys.argv[1] print('Read NetCDF:\t', netcdf_filename) # read NetCDF file diff --git a/met/data/wrappers/write_pickle_dataplane.py b/met/data/wrappers/write_pickle_dataplane.py index ec234a5c40..5794466064 100644 --- a/met/data/wrappers/write_pickle_dataplane.py +++ b/met/data/wrappers/write_pickle_dataplane.py @@ -19,8 +19,9 @@ print('User Command:\t', sys.argv[2:]) print('Write Pickle:\t', sys.argv[1]) -pickle_filename = sys.argv[1] -netcdf_filename = sys.argv[1] + '.nc4' +# pickle_filename = sys.argv[1] +# netcdf_filename = sys.argv[1] + '.nc4' +netcdf_filename = sys.argv[1] print('Write NetCDF:\t', netcdf_filename) @@ -44,13 +45,13 @@ print('write_pickle_dataplane') print(met_info) -pickle.dump( met_info, open( pickle_filename, "wb" ) ) +# pickle.dump( met_info, open( pickle_filename, "wb" ) ) # write NetCDF file ds = nc.Dataset(netcdf_filename, 'w') nx, ny = met_in.met_data.shape -print(nx, ny) +# print(nx, ny) ds.createDimension('x', nx) ds.createDimension('y', ny) dp = ds.createVariable('met_data', met_in.met_data.dtype, ('x', 'y')) @@ -59,6 +60,8 @@ for attr in met_in.attrs: attr_val = met_in.attrs[attr] print(attr, attr_val, type(attr_val)) + if attr == 'name': + setattr(ds, '_name', attr_val) if type(attr_val) == str: setattr(ds, attr, attr_val) if type(attr_val) == dict: From 760b6904f7fc7d6cc8da776dc89023280d9fa639 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Fri, 5 Feb 2021 08:42:44 -0700 Subject: [PATCH 011/165] Fixed write_pickle_dataplane to work for both numpy and xarray. --- met/data/wrappers/write_pickle_dataplane.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/met/data/wrappers/write_pickle_dataplane.py b/met/data/wrappers/write_pickle_dataplane.py index 5794466064..fdb06cbf3f 100644 --- a/met/data/wrappers/write_pickle_dataplane.py +++ b/met/data/wrappers/write_pickle_dataplane.py @@ -57,8 +57,8 @@ dp = ds.createVariable('met_data', met_in.met_data.dtype, ('x', 'y')) dp[:] = met_in.met_data -for attr in met_in.attrs: - attr_val = met_in.attrs[attr] +for attr in met_info['attrs']: + attr_val = met_info['attrs'][attr] print(attr, attr_val, type(attr_val)) if attr == 'name': setattr(ds, '_name', attr_val) From 791ebf05559e4d14235a7f1c439884276e60b088 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Fri, 5 Feb 2021 08:49:25 -0700 Subject: [PATCH 012/165] Use items() to iterate of key, value attrs. --- met/data/wrappers/write_pickle_dataplane.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/met/data/wrappers/write_pickle_dataplane.py b/met/data/wrappers/write_pickle_dataplane.py index fdb06cbf3f..44b57fea92 100644 --- a/met/data/wrappers/write_pickle_dataplane.py +++ b/met/data/wrappers/write_pickle_dataplane.py @@ -17,10 +17,7 @@ print('Python Script:\t', sys.argv[0]) print('User Command:\t', sys.argv[2:]) -print('Write Pickle:\t', sys.argv[1]) -# pickle_filename = sys.argv[1] -# netcdf_filename = sys.argv[1] + '.nc4' netcdf_filename = sys.argv[1] print('Write NetCDF:\t', netcdf_filename) @@ -57,8 +54,7 @@ dp = ds.createVariable('met_data', met_in.met_data.dtype, ('x', 'y')) dp[:] = met_in.met_data -for attr in met_info['attrs']: - attr_val = met_info['attrs'][attr] +for attr, attr_val in met_info['attrs'].items(): print(attr, attr_val, type(attr_val)) if attr == 'name': setattr(ds, '_name', attr_val) From c5f17e8d50e931c28895cf57005cadfa8d7dd0ba Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Sat, 13 Feb 2021 10:50:12 -0700 Subject: [PATCH 013/165] Write temporary text file. --- met/data/wrappers/write_pickle_point.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/met/data/wrappers/write_pickle_point.py b/met/data/wrappers/write_pickle_point.py index 1f5ee35bdb..907c0e005d 100644 --- a/met/data/wrappers/write_pickle_point.py +++ b/met/data/wrappers/write_pickle_point.py @@ -18,6 +18,7 @@ print('Write Pickle:\t', sys.argv[1]) pickle_filename = sys.argv[1] +tmp_filename = pickle_filename + '.txt' pyembed_module_name = sys.argv[2] sys.argv = sys.argv[2:] @@ -28,4 +29,8 @@ met_in = importlib.util.module_from_spec(spec) spec.loader.exec_module(met_in) +f = open(tmp_filename, 'w') +for line in met_in.point_data: + f.write(str(line) + '\n') + pickle.dump( met_in.point_data, open( pickle_filename, "wb" ) ) From d6142e8836d79ab13330b56e8a87ff30eaf0e24c Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Wed, 17 Feb 2021 08:53:38 -0700 Subject: [PATCH 014/165] Renamed scripts. --- ...{read_pickle_dataplane.py => read_tmp_dataplane.py} | 8 ++------ ...rite_pickle_dataplane.py => write_tmp_dataplane.py} | 10 +++------- 2 files changed, 5 insertions(+), 13 deletions(-) rename met/data/wrappers/{read_pickle_dataplane.py => read_tmp_dataplane.py} (77%) rename met/data/wrappers/{write_pickle_dataplane.py => write_tmp_dataplane.py} (87%) diff --git a/met/data/wrappers/read_pickle_dataplane.py b/met/data/wrappers/read_tmp_dataplane.py similarity index 77% rename from met/data/wrappers/read_pickle_dataplane.py rename to met/data/wrappers/read_tmp_dataplane.py index dabc2f51e3..e5fb0d6cb0 100644 --- a/met/data/wrappers/read_pickle_dataplane.py +++ b/met/data/wrappers/read_tmp_dataplane.py @@ -1,22 +1,18 @@ ######################################################################## # -# Reads temporary pickle file into memory. +# Reads temporary file into memory. # -# usage: /path/to/python read_pickle_dataplane.py pickle.tmp +# usage: /path/to/python read_tmp_dataplane.py dataplane.tmp # ######################################################################## import sys import numpy as np -import pickle import netCDF4 as nc print('Python Script:\t', sys.argv[0]) -# print('Load Pickle:\t', sys.argv[1]) -# met_info = pickle.load(open(sys.argv[1], "rb")) met_info = {} -# netcdf_filename = sys.argv[1] + '.nc4' netcdf_filename = sys.argv[1] print('Read NetCDF:\t', netcdf_filename) diff --git a/met/data/wrappers/write_pickle_dataplane.py b/met/data/wrappers/write_tmp_dataplane.py similarity index 87% rename from met/data/wrappers/write_pickle_dataplane.py rename to met/data/wrappers/write_tmp_dataplane.py index 44b57fea92..985535da5f 100644 --- a/met/data/wrappers/write_pickle_dataplane.py +++ b/met/data/wrappers/write_tmp_dataplane.py @@ -3,14 +3,13 @@ # Adapted from a script provided by George McCabe # Adapted by Randy Bullock # -# usage: /path/to/python write_pickle_dataplane.py \ -# pickle_output_filename .py +# usage: /path/to/python write_tmp_dataplane.py \ +# tmp_output_filename .py # ######################################################################## import os import sys -import pickle import importlib.util import xarray as xr import netCDF4 as nc @@ -39,16 +38,13 @@ else: met_info = { 'attrs': met_in.attrs, 'met_data': met_in.met_data } -print('write_pickle_dataplane') +print('write_tmp_dataplane') print(met_info) -# pickle.dump( met_info, open( pickle_filename, "wb" ) ) - # write NetCDF file ds = nc.Dataset(netcdf_filename, 'w') nx, ny = met_in.met_data.shape -# print(nx, ny) ds.createDimension('x', nx) ds.createDimension('y', ny) dp = ds.createVariable('met_data', met_in.met_data.dtype, ('x', 'y')) From b39ca2888eafdd227e2757f73bd3d22263b0b382 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Wed, 17 Feb 2021 08:57:06 -0700 Subject: [PATCH 015/165] Changed script names in Makefile.am. --- met/data/wrappers/Makefile.am | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/met/data/wrappers/Makefile.am b/met/data/wrappers/Makefile.am index d8a6d5a026..821987b273 100644 --- a/met/data/wrappers/Makefile.am +++ b/met/data/wrappers/Makefile.am @@ -23,8 +23,8 @@ wrappersdir = $(pkgdatadir)/wrappers wrappers_DATA = \ generic_python.py \ generic_pickle.py \ - read_pickle_dataplane.py \ - write_pickle_dataplane.py \ + read_tmp_dataplane.py \ + write_tmp_dataplane.py \ write_pickle_mpr.py \ write_pickle_point.py From 7cc2d7779306db1cac55d03c11a67c15b836f7f5 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Wed, 17 Feb 2021 09:09:57 -0700 Subject: [PATCH 016/165] Replaced pickle with tmp_nc. --- .../vx_data2d_python/python_dataplane.cc | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/met/src/libcode/vx_data2d_python/python_dataplane.cc b/met/src/libcode/vx_data2d_python/python_dataplane.cc index d5ace046d0..c1a5a3a163 100644 --- a/met/src/libcode/vx_data2d_python/python_dataplane.cc +++ b/met/src/libcode/vx_data2d_python/python_dataplane.cc @@ -31,15 +31,15 @@ GlobalPython GP; // this needs external linkage static const char * user_ppath = 0; -static const char write_pickle [] = "MET_BASE/wrappers/write_pickle_dataplane.py"; +static const char write_tmp_nc [] = "MET_BASE/wrappers/write_tmp_nc_dataplane.py"; -static const char read_pickle [] = "read_pickle_dataplane"; // NO ".py" suffix +static const char read_tmp_nc [] = "read_tmp_nc_dataplane"; // NO ".py" suffix -static const char pickle_base_name [] = "tmp_met_pickle"; +static const char tmp_nc_base_name [] = "tmp_met_nc"; -static const char pickle_var_name [] = "met_info"; +static const char tmp_nc_var_name [] = "met_info"; -static const char pickle_file_var_name [] = "pickle_filename"; +static const char tmp_nc_file_var_name [] = "tmp_nc_filename"; //////////////////////////////////////////////////////////////////////// @@ -51,7 +51,7 @@ static bool straight_python_dataplane(const char * script_name, Grid & met_grid_out, VarInfoPython &vinfo); -static bool pickle_dataplane(const char * script_name, +static bool tmp_nc_dataplane(const char * script_name, int script_argc, char ** script_argv, const bool use_xarray, DataPlane & met_dp_out, Grid & met_grid_out, VarInfoPython &vinfo); @@ -69,9 +69,9 @@ bool python_dataplane(const char * user_script_name, bool status = false; -if ( (user_ppath = getenv(user_python_path_env)) != 0 ) { // do_pickle = true; +if ( (user_ppath = getenv(user_python_path_env)) != 0 ) { // do_tmp_nc = true; - status = pickle_dataplane(user_script_name, + status = tmp_nc_dataplane(user_script_name, user_script_argc, user_script_argv, use_xarray, met_dp_out, met_grid_out, vinfo); @@ -276,7 +276,7 @@ return ( true ); //////////////////////////////////////////////////////////////////////// -bool pickle_dataplane(const char * user_script_name, +bool tmp_nc_dataplane(const char * user_script_name, int user_script_argc, char ** user_script_argv, const bool use_xarray, DataPlane & met_dp_out, Grid & met_grid_out, VarInfoPython &vinfo) @@ -287,7 +287,7 @@ int j; int status; ConcatString command; ConcatString path; -ConcatString pickle_path; +ConcatString tmp_nc_path; const char * tmp_dir = 0; Wchar_Argv wa; @@ -301,14 +301,14 @@ if ( ! tmp_dir ) tmp_dir = default_tmp_dir; path << cs_erase << tmp_dir << '/' - << pickle_base_name; + << tmp_nc_base_name; -pickle_path = make_temp_file_name(path.text(), 0); +tmp_nc_path = make_temp_file_name(path.text(), 0); command << cs_erase << user_ppath << ' ' // user's path to python - << replace_path(write_pickle) << ' ' // write_pickle.py - << pickle_path << ' ' // pickle output filename + << replace_path(write_tmp_nc) << ' ' // write_tmp_nc.py + << tmp_nc_path << ' ' // tmp_nc output filename << user_script_name; // user's script name for (j=1; j " + mlog << Error << "\ntmp_nc_dataplane() -> " << "command \"" << command.text() << "\" failed ... status = " << status << "\n\n"; @@ -346,15 +346,15 @@ if ( PyErr_Occurred() ) { PyErr_Print(); - mlog << Warning << "\npickle_dataplane() -> " + mlog << Warning << "\ntmp_nc_dataplane() -> " << "an error occurred initializing python\n\n"; return ( false ); } -mlog << Debug(3) << "Reading temporary pickle file: " - << pickle_path << "\n"; +mlog << Debug(3) << "Reading temporary tmp_nc file: " + << tmp_nc_path << "\n"; // // set the arguments @@ -362,9 +362,9 @@ mlog << Debug(3) << "Reading temporary pickle file: " StringArray a; -a.add(read_pickle); +a.add(read_tmp_nc); -a.add(pickle_path); +a.add(tmp_nc_path); wa.set(a); @@ -374,7 +374,7 @@ PySys_SetArgv (wa.wargc(), wa.wargv()); // import the python wrapper script as a module // -path = get_short_name(read_pickle); +path = get_short_name(read_tmp_nc); PyObject * module_obj = PyImport_ImportModule (path.text()); @@ -392,7 +392,7 @@ if ( PyErr_Occurred() ) { PyErr_Print(); - mlog << Warning << "\npickle_dataplane() -> " + mlog << Warning << "\ntmp_nc_dataplane() -> " << "an error occurred importing module " << '\"' << path << "\"\n\n"; @@ -402,7 +402,7 @@ if ( PyErr_Occurred() ) { if ( ! module_obj ) { - mlog << Warning << "\npickle_dataplane() -> " + mlog << Warning << "\ntmp_nc_dataplane() -> " << "error running python script\n\n"; return ( false ); @@ -410,7 +410,7 @@ if ( ! module_obj ) { } // - // read the pickle file + // read the tmp_nc file // // @@ -419,13 +419,13 @@ if ( ! module_obj ) { PyObject * module_dict_obj = PyModule_GetDict (module_obj); -PyObject * key_obj = PyUnicode_FromString (pickle_var_name); +PyObject * key_obj = PyUnicode_FromString (tmp_nc_var_name); PyObject * data_obj = PyDict_GetItem (module_dict_obj, key_obj); if ( ! data_obj || ! PyDict_Check(data_obj) ) { - mlog << Error << "\npickle_dataplane() -> " + mlog << Error << "\ntmp_nc_dataplane() -> " << "bad dict object\n\n"; exit ( 1 ); @@ -450,7 +450,7 @@ dataplane_from_numpy_array(np, attrs_dict_obj, met_dp_out, met_grid_out, vinfo); // cleanup // -remove_temp_file(pickle_path); +remove_temp_file(tmp_nc_path); // // done From df0db18e04a59280688781533b5f3092f4171091 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Wed, 17 Feb 2021 09:28:59 -0700 Subject: [PATCH 017/165] Fixed wrapper script names. --- met/src/libcode/vx_data2d_python/python_dataplane.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/met/src/libcode/vx_data2d_python/python_dataplane.cc b/met/src/libcode/vx_data2d_python/python_dataplane.cc index c1a5a3a163..8f70af5109 100644 --- a/met/src/libcode/vx_data2d_python/python_dataplane.cc +++ b/met/src/libcode/vx_data2d_python/python_dataplane.cc @@ -31,9 +31,9 @@ GlobalPython GP; // this needs external linkage static const char * user_ppath = 0; -static const char write_tmp_nc [] = "MET_BASE/wrappers/write_tmp_nc_dataplane.py"; +static const char write_tmp_nc [] = "MET_BASE/wrappers/write_tmp_dataplane.py"; -static const char read_tmp_nc [] = "read_tmp_nc_dataplane"; // NO ".py" suffix +static const char read_tmp_nc [] = "read_tmp_dataplane"; // NO ".py" suffix static const char tmp_nc_base_name [] = "tmp_met_nc"; From 044c704a2df6a953366d61a48bdccba22aae906a Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Wed, 17 Feb 2021 10:28:33 -0700 Subject: [PATCH 018/165] Test for attrs in met_in.met_data. --- met/data/wrappers/write_tmp_dataplane.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/met/data/wrappers/write_tmp_dataplane.py b/met/data/wrappers/write_tmp_dataplane.py index 985535da5f..f7ff2d7559 100644 --- a/met/data/wrappers/write_tmp_dataplane.py +++ b/met/data/wrappers/write_tmp_dataplane.py @@ -11,7 +11,6 @@ import os import sys import importlib.util -import xarray as xr import netCDF4 as nc print('Python Script:\t', sys.argv[0]) @@ -33,10 +32,12 @@ met_in = importlib.util.module_from_spec(spec) spec.loader.exec_module(met_in) -if isinstance(met_in.met_data, xr.DataArray): - met_info = { 'attrs': met_in.met_data.attrs, 'met_data': met_in.met_data } +met_info = {'met_data': met_in.met_data} +if hasattr(met_in.met_data, 'attrs') and met_in.met_data.attrs: + attrs = met_in.met_data.attrs else: - met_info = { 'attrs': met_in.attrs, 'met_data': met_in.met_data } + attrs = met_in.attrs +met_info['attrs'] = attrs print('write_tmp_dataplane') print(met_info) From d798e9dc0f098e481580dc1ce60e92a4d8179c0f Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Thu, 18 Feb 2021 11:48:11 -0700 Subject: [PATCH 019/165] Initial version of read_tmp_point module. --- met/data/wrappers/read_tmp_point.py | 43 +++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 met/data/wrappers/read_tmp_point.py diff --git a/met/data/wrappers/read_tmp_point.py b/met/data/wrappers/read_tmp_point.py new file mode 100644 index 0000000000..0b3214de14 --- /dev/null +++ b/met/data/wrappers/read_tmp_point.py @@ -0,0 +1,43 @@ +""" +Module Name: read_tmp_point.py + +Read MET Point Observations from a text file created by write_tmp_point.py script. + + Message_Type, Station_ID, Valid_Time, Lat, Lon, Elevation, + GRIB_Code or Variable_Name, Level, Height, QC_String, Observation_Value + +Version Date +1.0.0 2021/02/18 David Fillmore Initial version +""" + +__author__ = 'David Fillmore' +__version__ = '1.0.0' +__email__ = 'met_help@ucar.edu' + +import argparse + +def read_tmp_point(filename): + """ + Arguments: + filename (string): temporary file created by write_tmp_point.py + + Returns: + (list of lists): point data + """ + f = open(filename, 'r') + lines = f.readlines() + f.close() + + point_data = [eval(line.strip('\n')) for line in lines] + + return point_data + +if __name__ == '__main__': + """ + Parse command line arguments + """ + parser = argparse.ArgumentParser() + parser.add_argument('--filename', type=str) + args = parser.parse_args() + + point_data = read_tmp_point(args.filename) From 8116e751090c824591fb8528f4ddd7123df43674 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Thu, 18 Feb 2021 11:55:05 -0700 Subject: [PATCH 020/165] Added read_tmp_point.py to install list. --- met/data/wrappers/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/met/data/wrappers/Makefile.am b/met/data/wrappers/Makefile.am index 821987b273..cb35df1dae 100644 --- a/met/data/wrappers/Makefile.am +++ b/met/data/wrappers/Makefile.am @@ -26,6 +26,7 @@ wrappers_DATA = \ read_tmp_dataplane.py \ write_tmp_dataplane.py \ write_pickle_mpr.py \ + read_tmp_point.py \ write_pickle_point.py EXTRA_DIST = ${wrappers_DATA} From 7b5771574f7b2f3c414ecbe27842b8405c280369 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Thu, 18 Feb 2021 12:12:54 -0700 Subject: [PATCH 021/165] Start on Python3_Script::read_tmp_point. --- met/src/libcode/vx_python3_utils/python3_script.cc | 12 ++++++++++++ met/src/libcode/vx_python3_utils/python3_script.h | 1 + 2 files changed, 13 insertions(+) diff --git a/met/src/libcode/vx_python3_utils/python3_script.cc b/met/src/libcode/vx_python3_utils/python3_script.cc index 56837b65d0..71c994e40f 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.cc +++ b/met/src/libcode/vx_python3_utils/python3_script.cc @@ -234,6 +234,18 @@ return; } +//////////////////////////////////////////////////////////////////////// + +void Python3_Script::read_tmp_point(const char * tmp_filename) const + +{ + +mlog << Debug(3) << "Reading temporary point ascii file: " + << tmp_filename << "\n"; + +ConcatString command; + +} //////////////////////////////////////////////////////////////////////// diff --git a/met/src/libcode/vx_python3_utils/python3_script.h b/met/src/libcode/vx_python3_utils/python3_script.h index 20069762f9..312e5e0fb1 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.h +++ b/met/src/libcode/vx_python3_utils/python3_script.h @@ -77,6 +77,7 @@ class Python3_Script { void read_pickle (const char * variable_name, const char * pickle_filename) const; + void read_tmp_point (const char * tmp_filename) const; }; From 5502da9fea63afbe147ca8944be723514667c7fc Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Thu, 18 Feb 2021 13:07:51 -0700 Subject: [PATCH 022/165] Write MPR tmp ascii file. --- met/data/wrappers/write_pickle_mpr.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/met/data/wrappers/write_pickle_mpr.py b/met/data/wrappers/write_pickle_mpr.py index 2e3f2d0d04..efde687bf7 100644 --- a/met/data/wrappers/write_pickle_mpr.py +++ b/met/data/wrappers/write_pickle_mpr.py @@ -18,6 +18,7 @@ print('Write Pickle:\t', sys.argv[1]) pickle_filename = sys.argv[1] +tmp_filename = pickle_filename + '.txt' pyembed_module_name = sys.argv[2] sys.argv = sys.argv[2:] @@ -28,6 +29,8 @@ met_in = importlib.util.module_from_spec(spec) spec.loader.exec_module(met_in) -print(met_in) +f = open(tmp_filename, 'w') +for line in met_in.mpr_data: + f.write(str(line) + '\n') pickle.dump( met_in.mpr_data, open( pickle_filename, "wb" ) ) From 961b4fc1bab42bc8456129cf3e7c732ea68e8b79 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Thu, 18 Feb 2021 13:13:32 -0700 Subject: [PATCH 023/165] Renamed to read_tmp_ascii to use for point point and MPR. --- .../{read_tmp_point.py => read_tmp_ascii.py} | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) rename met/data/wrappers/{read_tmp_point.py => read_tmp_ascii.py} (73%) diff --git a/met/data/wrappers/read_tmp_point.py b/met/data/wrappers/read_tmp_ascii.py similarity index 73% rename from met/data/wrappers/read_tmp_point.py rename to met/data/wrappers/read_tmp_ascii.py index 0b3214de14..126150b168 100644 --- a/met/data/wrappers/read_tmp_point.py +++ b/met/data/wrappers/read_tmp_ascii.py @@ -1,8 +1,10 @@ """ -Module Name: read_tmp_point.py +Module Name: read_tmp_ascii.py -Read MET Point Observations from a text file created by write_tmp_point.py script. +Read MET Point Observations from a text file created by write_tmp_point.py script + or MET Matched Pairs from a text file created by write_tmp_mpr.py script +Point observation format: Message_Type, Station_ID, Valid_Time, Lat, Lon, Elevation, GRIB_Code or Variable_Name, Level, Height, QC_String, Observation_Value @@ -16,7 +18,7 @@ import argparse -def read_tmp_point(filename): +def read_tmp_ascii(filename): """ Arguments: filename (string): temporary file created by write_tmp_point.py @@ -28,9 +30,9 @@ def read_tmp_point(filename): lines = f.readlines() f.close() - point_data = [eval(line.strip('\n')) for line in lines] + data = [eval(line.strip('\n')) for line in lines] - return point_data + return data if __name__ == '__main__': """ @@ -40,4 +42,4 @@ def read_tmp_point(filename): parser.add_argument('--filename', type=str) args = parser.parse_args() - point_data = read_tmp_point(args.filename) + data = read_tmp_ascii(args.filename) From 4c0963ddf1efc9e4bc7927f585e59fa7458f871d Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Thu, 18 Feb 2021 13:17:39 -0700 Subject: [PATCH 024/165] Renamed to read_tmp_ascii to use for point point and MPR. --- met/data/wrappers/Makefile.am | 2 +- met/src/libcode/vx_python3_utils/python3_script.cc | 4 ++-- met/src/libcode/vx_python3_utils/python3_script.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/met/data/wrappers/Makefile.am b/met/data/wrappers/Makefile.am index cb35df1dae..a8f464313f 100644 --- a/met/data/wrappers/Makefile.am +++ b/met/data/wrappers/Makefile.am @@ -26,7 +26,7 @@ wrappers_DATA = \ read_tmp_dataplane.py \ write_tmp_dataplane.py \ write_pickle_mpr.py \ - read_tmp_point.py \ + read_tmp_ascii.py \ write_pickle_point.py EXTRA_DIST = ${wrappers_DATA} diff --git a/met/src/libcode/vx_python3_utils/python3_script.cc b/met/src/libcode/vx_python3_utils/python3_script.cc index 71c994e40f..fdef49a066 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.cc +++ b/met/src/libcode/vx_python3_utils/python3_script.cc @@ -236,11 +236,11 @@ return; //////////////////////////////////////////////////////////////////////// -void Python3_Script::read_tmp_point(const char * tmp_filename) const +void Python3_Script::read_tmp_ascii(const char * tmp_filename) const { -mlog << Debug(3) << "Reading temporary point ascii file: " +mlog << Debug(3) << "Reading temporary ascii file: " << tmp_filename << "\n"; ConcatString command; diff --git a/met/src/libcode/vx_python3_utils/python3_script.h b/met/src/libcode/vx_python3_utils/python3_script.h index 312e5e0fb1..fe199058a5 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.h +++ b/met/src/libcode/vx_python3_utils/python3_script.h @@ -77,7 +77,7 @@ class Python3_Script { void read_pickle (const char * variable_name, const char * pickle_filename) const; - void read_tmp_point (const char * tmp_filename) const; + void read_tmp_ascii (const char * tmp_filename) const; }; From 91122be96e435b0690dae5592ca9dd489c052a99 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Fri, 19 Feb 2021 13:07:23 -0700 Subject: [PATCH 025/165] Define Python3_Script::import_read_tmp_ascii_py. --- met/src/libcode/vx_python3_utils/python3_script.cc | 10 ++++++++++ met/src/libcode/vx_python3_utils/python3_script.h | 2 ++ 2 files changed, 12 insertions(+) diff --git a/met/src/libcode/vx_python3_utils/python3_script.cc b/met/src/libcode/vx_python3_utils/python3_script.cc index fdef49a066..0dd3464016 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.cc +++ b/met/src/libcode/vx_python3_utils/python3_script.cc @@ -27,6 +27,8 @@ using namespace std; static const char sq = '\''; // single quote +static const char read_tmp_ascii_py [] = "MET_BASE/wrappers/read_tmp_ascii.py"; + //////////////////////////////////////////////////////////////////////// @@ -236,6 +238,14 @@ return; //////////////////////////////////////////////////////////////////////// +void Python3_Script::import_read_tmp_ascii_py(void) const + +{ + +} + +//////////////////////////////////////////////////////////////////////// + void Python3_Script::read_tmp_ascii(const char * tmp_filename) const { diff --git a/met/src/libcode/vx_python3_utils/python3_script.h b/met/src/libcode/vx_python3_utils/python3_script.h index fe199058a5..7a8aec210e 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.h +++ b/met/src/libcode/vx_python3_utils/python3_script.h @@ -77,6 +77,8 @@ class Python3_Script { void read_pickle (const char * variable_name, const char * pickle_filename) const; + void import_read_tmp_ascii_py (void) const; + void read_tmp_ascii (const char * tmp_filename) const; }; From fef8484cfb23c63af53e869667e12a82d76c6f73 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Fri, 19 Feb 2021 13:20:31 -0700 Subject: [PATCH 026/165] Call Python3_Script::import_read_tmp_ascii_py. --- met/src/libcode/vx_python3_utils/python3_script.cc | 7 +++++++ met/src/tools/other/ascii2nc/python_handler.cc | 2 ++ 2 files changed, 9 insertions(+) diff --git a/met/src/libcode/vx_python3_utils/python3_script.cc b/met/src/libcode/vx_python3_utils/python3_script.cc index 0dd3464016..99c45b3a89 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.cc +++ b/met/src/libcode/vx_python3_utils/python3_script.cc @@ -242,6 +242,13 @@ void Python3_Script::import_read_tmp_ascii_py(void) const { +ConcatString module; + +module << cs_erase + << replace_path(read_tmp_ascii_py); + +mlog << Debug(3) << "Importing " << module << "\n"; + } //////////////////////////////////////////////////////////////////////// diff --git a/met/src/tools/other/ascii2nc/python_handler.cc b/met/src/tools/other/ascii2nc/python_handler.cc index e2733a605e..76e9dce677 100644 --- a/met/src/tools/other/ascii2nc/python_handler.cc +++ b/met/src/tools/other/ascii2nc/python_handler.cc @@ -379,6 +379,8 @@ wrapper = generic_pickle_wrapper; Python3_Script script(wrapper.text()); +script.import_read_tmp_ascii_py(); + script.read_pickle(list_name, pickle_path.text()); PyObject * obj = script.lookup(list_name); From 93e97624ed098724c0a1c3ab87d000d3e742353a Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Fri, 19 Feb 2021 18:04:57 -0700 Subject: [PATCH 027/165] Append MET_BASE/wrappers to sys.path. --- met/src/libcode/vx_python3_utils/python3_script.cc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/met/src/libcode/vx_python3_utils/python3_script.cc b/met/src/libcode/vx_python3_utils/python3_script.cc index 99c45b3a89..1364dc7e3c 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.cc +++ b/met/src/libcode/vx_python3_utils/python3_script.cc @@ -247,6 +247,19 @@ ConcatString module; module << cs_erase << replace_path(read_tmp_ascii_py); +ConcatString command; + +run_python_string("import sys"); + +command << cs_erase + << "sys.path.append(\"" + << module.dirname().c_str() + << "\")"; + +mlog << Debug(3) << command << "\n"; + +// run_python_string(command.text()); + mlog << Debug(3) << "Importing " << module << "\n"; } From 44d832872133db2a77dd1ed2d3e7ed3e690e3add Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Fri, 19 Feb 2021 18:26:10 -0700 Subject: [PATCH 028/165] Finished implementation of Python3_Script::import_read_tmp_ascii_py. --- met/src/libcode/vx_python3_utils/python3_script.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/met/src/libcode/vx_python3_utils/python3_script.cc b/met/src/libcode/vx_python3_utils/python3_script.cc index 1364dc7e3c..36cade0317 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.cc +++ b/met/src/libcode/vx_python3_utils/python3_script.cc @@ -258,9 +258,15 @@ command << cs_erase mlog << Debug(3) << command << "\n"; -// run_python_string(command.text()); +run_python_string(command.text()); + +mlog << Debug(2) << "Importing " << module << "\n"; + +command << cs_erase << "import read_tmp_ascii"; -mlog << Debug(3) << "Importing " << module << "\n"; +mlog << Debug(3) << command << "\n"; + +run_python_string(command.text()); } From 3953aba4190f0d50cf45512931d7ac4dc10eef7b Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Fri, 19 Feb 2021 19:30:56 -0700 Subject: [PATCH 029/165] Call Python3_Script::read_tmp_ascii in python_handler. --- met/src/libcode/vx_python3_utils/python3_script.cc | 10 +++++++++- met/src/tools/other/ascii2nc/python_handler.cc | 5 +++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/met/src/libcode/vx_python3_utils/python3_script.cc b/met/src/libcode/vx_python3_utils/python3_script.cc index 36cade0317..bb8c40f44e 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.cc +++ b/met/src/libcode/vx_python3_utils/python3_script.cc @@ -276,11 +276,19 @@ void Python3_Script::read_tmp_ascii(const char * tmp_filename) const { -mlog << Debug(3) << "Reading temporary ascii file: " +mlog << Debug(2) << "Reading temporary ascii file: " << tmp_filename << "\n"; ConcatString command; +command << "read_tmp_ascii.read_tmp_ascii(\"" + << tmp_filename + << "\")"; + +mlog << Debug(3) << command << "\n"; + +run_python_string(command.text()); + } //////////////////////////////////////////////////////////////////////// diff --git a/met/src/tools/other/ascii2nc/python_handler.cc b/met/src/tools/other/ascii2nc/python_handler.cc index 76e9dce677..35e697045e 100644 --- a/met/src/tools/other/ascii2nc/python_handler.cc +++ b/met/src/tools/other/ascii2nc/python_handler.cc @@ -332,6 +332,7 @@ const int N = user_script_args.n(); ConcatString command; ConcatString path; ConcatString pickle_path; +ConcatString tmp_ascii_path; const char * tmp_dir = 0; int status; @@ -348,6 +349,8 @@ path << cs_erase << pickle_base_name; pickle_path = make_temp_file_name(path.text(), 0); +tmp_ascii_path = make_temp_file_name(path.text(), 0); +tmp_ascii_path << ".txt"; command << cs_erase << user_path_to_python << ' ' // user's path to python @@ -383,6 +386,8 @@ script.import_read_tmp_ascii_py(); script.read_pickle(list_name, pickle_path.text()); +script.read_tmp_ascii(tmp_ascii_path.text()); + PyObject * obj = script.lookup(list_name); if ( ! PyList_Check(obj) ) { From 25961d6981f08b8ffd36e9819c4c15f3b9fdf854 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Sun, 21 Feb 2021 18:40:30 -0700 Subject: [PATCH 030/165] Revised python3_script::read_tmp_ascii with call to run, PyRun_String. --- met/src/libcode/vx_python3_utils/python3_script.cc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/met/src/libcode/vx_python3_utils/python3_script.cc b/met/src/libcode/vx_python3_utils/python3_script.cc index bb8c40f44e..9afac9a596 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.cc +++ b/met/src/libcode/vx_python3_utils/python3_script.cc @@ -287,7 +287,17 @@ command << "read_tmp_ascii.read_tmp_ascii(\"" mlog << Debug(3) << command << "\n"; -run_python_string(command.text()); +PyErr_Clear(); + +run(command.text()); + +if ( PyErr_Occurred() ) { + + mlog << Error << "\nPython3_Script::read_tmp_ascii() -> " + << "command \"" << command << "\" failed!\n\n"; + + exit ( 1 ); +} } From 794e8fb6173a9514cf388b7a75b09a037aa7a8d3 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Sun, 21 Feb 2021 18:48:45 -0700 Subject: [PATCH 031/165] Return PyObject* from Python3_Script::run. --- met/src/libcode/vx_python3_utils/python3_script.cc | 10 +++++++--- met/src/libcode/vx_python3_utils/python3_script.h | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/met/src/libcode/vx_python3_utils/python3_script.cc b/met/src/libcode/vx_python3_utils/python3_script.cc index 9afac9a596..b143619068 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.cc +++ b/met/src/libcode/vx_python3_utils/python3_script.cc @@ -165,10 +165,12 @@ return ( var ); //////////////////////////////////////////////////////////////////////// -void Python3_Script::run(const char * command) const +PyObject * Python3_Script::run(const char * command) const { +PyObject * pobj; + if ( empty(command) ) { mlog << Error << "\nPython3_Script::run(const char *) -> " @@ -178,7 +180,9 @@ if ( empty(command) ) { } -if ( ! PyRun_String(command, Py_file_input, Dict, Dict) ) { +pobj = PyRun_String(command, Py_file_input, Dict, Dict); + +if ( ! pobj ) { mlog << Error << "\nPython3_Script::run(const char *) -> " << "command \"" << command << "\" failed!\n\n"; @@ -190,7 +194,7 @@ if ( ! PyRun_String(command, Py_file_input, Dict, Dict) ) { fflush(stdout); fflush(stderr); -return; +return pobj; } diff --git a/met/src/libcode/vx_python3_utils/python3_script.h b/met/src/libcode/vx_python3_utils/python3_script.h index 7a8aec210e..5a765aeabb 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.h +++ b/met/src/libcode/vx_python3_utils/python3_script.h @@ -73,7 +73,7 @@ class Python3_Script { PyObject * lookup(const char * name) const; - void run(const char * command) const; // runs a command in the namespace of the script + PyObject * run(const char * command) const; // runs a command in the namespace of the script void read_pickle (const char * variable_name, const char * pickle_filename) const; From d569cfba0739b4849b57bbead4f2e7b96fe42b95 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Sun, 21 Feb 2021 18:58:06 -0700 Subject: [PATCH 032/165] Restored call to run_python_string for now. --- met/src/libcode/vx_python3_utils/python3_script.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/met/src/libcode/vx_python3_utils/python3_script.cc b/met/src/libcode/vx_python3_utils/python3_script.cc index b143619068..9a3c2ccaf9 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.cc +++ b/met/src/libcode/vx_python3_utils/python3_script.cc @@ -293,7 +293,10 @@ mlog << Debug(3) << command << "\n"; PyErr_Clear(); -run(command.text()); +PyObject * pobj; + +// pobj = run(command.text()); +run_python_string(command.text()); if ( PyErr_Occurred() ) { From ab0f2c6893996b6ac9a2d069fe7b09ca8394b915 Mon Sep 17 00:00:00 2001 From: johnhg Date: Fri, 26 Feb 2021 09:26:18 -0700 Subject: [PATCH 033/165] Per #1429, enhance error message from DataLine::get_item(). (#1682) --- met/src/basic/vx_util/data_line.cc | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/met/src/basic/vx_util/data_line.cc b/met/src/basic/vx_util/data_line.cc index ab16353db1..1853449b65 100644 --- a/met/src/basic/vx_util/data_line.cc +++ b/met/src/basic/vx_util/data_line.cc @@ -253,7 +253,11 @@ const char * DataLine::get_item(int k) const if ( (k < 0) || (k >= N_items) ) { - mlog << Error << "\nDataLine::get_item(int) -> range check error\n\n"; + ConcatString filename = (get_file() ? get_file()->filename() : ""); + + mlog << Error << "\nDataLine::get_item(int) -> " + << "range check error while reading item number " << k+1 + << " from file \"" << filename << "\"\n\n"; exit ( 1 ); @@ -640,7 +644,8 @@ LineDataFile::LineDataFile(const LineDataFile &) { -mlog << Error << "\nLineDataFile::LineDataFile(const LineDataFile &) -> should never be called!\n\n"; +mlog << Error << "\nLineDataFile::LineDataFile(const LineDataFile &) -> " + << "should never be called!\n\n"; exit ( 1 ); @@ -654,7 +659,8 @@ LineDataFile & LineDataFile::operator=(const LineDataFile &) { -mlog << Error << "\nLineDataFile::operator=(const LineDataFile &) -> should never be called!\n\n"; +mlog << Error << "\nLineDataFile::operator=(const LineDataFile &) -> " + << "should never be called!\n\n"; exit ( 1 ); @@ -698,7 +704,8 @@ in = new ifstream; if ( !in ) { - mlog << Error << "\nLineDataFile::open(const char *) -> can't allocate input stream\n\n"; + mlog << Error << "\nLineDataFile::open(const char *) -> " + << "can't allocate input stream\n\n"; exit ( 1 ); From b2754b405d8f2212fd24f29245faed5be4f873d9 Mon Sep 17 00:00:00 2001 From: johnhg Date: Fri, 26 Feb 2021 10:17:01 -0700 Subject: [PATCH 034/165] Feature 1429 tc_log second try (#1686) * Per #1429, enhance error message from DataLine::get_item(). * Per #1429, I realize that the line number actually is readily available in the DataLine class... so include it in the error message. --- met/src/basic/vx_util/data_line.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/met/src/basic/vx_util/data_line.cc b/met/src/basic/vx_util/data_line.cc index 1853449b65..da012b9a0a 100644 --- a/met/src/basic/vx_util/data_line.cc +++ b/met/src/basic/vx_util/data_line.cc @@ -253,11 +253,12 @@ const char * DataLine::get_item(int k) const if ( (k < 0) || (k >= N_items) ) { - ConcatString filename = (get_file() ? get_file()->filename() : ""); + ConcatString cs = (File ? File->filename() : ""); mlog << Error << "\nDataLine::get_item(int) -> " - << "range check error while reading item number " << k+1 - << " from file \"" << filename << "\"\n\n"; + << "range check error reading line number " << LineNumber + << ", item number " << k+1 << " of " << N_items + << " from file \"" << cs << "\"\n\n"; exit ( 1 ); From a1aead4ebcb2edc6a6deb4f225bc9f0a042aa477 Mon Sep 17 00:00:00 2001 From: johnhg Date: Fri, 26 Feb 2021 15:44:33 -0700 Subject: [PATCH 035/165] Feature 1588 ps_log (#1687) * Per #1588, updated pair_data_point.h/.cc to add detailed Debug(4) log messages, as specified in the GitHub issue. Do still need to test each of these cases to confirm that the log messages look good. * Per #1588, switch very detailed interpolation details from debug level 4 to 5. * Per #1588, remove the Debug(4) log message about duplicate obs since it's been moved up to a higher level. * Per #1588, add/update detailed log messages when processing point observations for bad data, off the grid, bad topo, big topo diffs, bad fcst value, and duplicate obs. --- met/src/basic/vx_util/interp_util.cc | 2 +- met/src/libcode/vx_statistics/pair_base.cc | 8 +- .../libcode/vx_statistics/pair_data_point.cc | 113 ++++++++++++++---- .../libcode/vx_statistics/pair_data_point.h | 7 ++ 4 files changed, 98 insertions(+), 32 deletions(-) diff --git a/met/src/basic/vx_util/interp_util.cc b/met/src/basic/vx_util/interp_util.cc index 90f3ae8c3f..9cb8a3d552 100644 --- a/met/src/basic/vx_util/interp_util.cc +++ b/met/src/basic/vx_util/interp_util.cc @@ -686,7 +686,7 @@ double interp_geog_match(const DataPlane &dp, const GridTemplate >, } if(!is_bad_data(interp_v)) { - mlog << Debug(4) + mlog << Debug(5) << "For observation value " << obs_v << " at grid (x, y) = (" << obs_x << ", " << obs_y << ") found forecast value " << interp_v << " at nearest matching geography point (" diff --git a/met/src/libcode/vx_statistics/pair_base.cc b/met/src/libcode/vx_statistics/pair_base.cc index bfcebaad0c..490037c78b 100644 --- a/met/src/libcode/vx_statistics/pair_base.cc +++ b/met/src/libcode/vx_statistics/pair_base.cc @@ -424,13 +424,7 @@ bool PairBase::add_point_obs(const char *sid, if(check_unique) { vector::iterator o_it = (*it).second.obs.begin(); for(;o_it != (*it).second.obs.end(); o_it++) { - if( (*o_it).ut == ut) { - mlog << Debug(4) - << "Skipping duplicate observation for [lat:lon:level:elevation] = [" - << obs_key << "] valid at " << unix_to_yyyymmdd_hhmmss(ut) - << " with value = " << o << "\n"; - return false; - } + if((*o_it).ut == ut) return false; } } diff --git a/met/src/libcode/vx_statistics/pair_data_point.cc b/met/src/libcode/vx_statistics/pair_data_point.cc index f5f1bc94e8..813ab5f815 100644 --- a/met/src/libcode/vx_statistics/pair_data_point.cc +++ b/met/src/libcode/vx_statistics/pair_data_point.cc @@ -603,12 +603,12 @@ void VxPairDataPoint::set_pd_size(int types, int masks, int interps) { rej_dup[i][j] = new int [n_interp]; for(k=0; kname() ) { + if(var_name != obs_info->name()) { rej_var++; return; } @@ -805,10 +805,10 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, // Check if the observation quality flag is included in the list if(obs_qty_filt.n() && strcmp(obs_qty, "")) { bool qty_match = false; - for(i=0; imagic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation with bad data value:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; rej_obs++; return; } @@ -845,6 +852,15 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, // Check if the observation's lat/lon is on the grid if(x < 0 || x >= gr.nx() || y < 0 || y >= gr.ny()) { + mlog << Debug(4) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation off the grid where (x, y) = (" + << x << ", " << y << ") and grid (nx, ny) = (" << gr.nx() + << ", " << gr.ny() << "):\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; rej_grd++; return; } @@ -861,12 +877,14 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, // Skip bad topography values if(is_bad_data(hdr_elv) || is_bad_data(topo)) { mlog << Debug(4) - << "Skipping observation due to missing topography values for " - << "[msg_typ:sid:lat:lon:elevation] = [" - << hdr_typ_str << ":" << hdr_sid_str << ":" - << hdr_lat << ":" << -1.0*hdr_lon << ":" - << hdr_elv << "] and model topography = " - << topo << ".\n"; + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation due to bad topography values " + << "where observation elevation = " << hdr_elv + << " and model topography = " << topo << ":\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; rej_topo++; return; } @@ -874,14 +892,16 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, // Check the topography difference threshold if(!sfc_info.topo_use_obs_thresh.check(topo - hdr_elv)) { mlog << Debug(4) - << "Skipping observation for topography difference since " + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation due to topography difference " + << "where observation elevation (" << hdr_elv + << ") minus model topography (" << topo << ") = " << topo - hdr_elv << " is not " - << sfc_info.topo_use_obs_thresh.get_str() << " for " - << "[msg_typ:sid:lat:lon:elevation] = [" - << hdr_typ_str << ":" << hdr_sid_str << ":" - << hdr_lat << ":" << -1.0*hdr_lon << ":" - << hdr_elv << "] and model topography = " - << topo << ".\n"; + << sfc_info.topo_use_obs_thresh.get_str() << ":\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; rej_topo++; return; } @@ -1099,6 +1119,14 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, } if(is_bad_data(fcst_v)) { + mlog << Debug(4) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation due to bad data in the interpolated " + << "forecast value:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; inc_count(rej_fcst, i, j, k); continue; } @@ -1113,6 +1141,13 @@ void VxPairDataPoint::add_point_obs(float *hdr_arr, const char *hdr_typ_str, hdr_lat, hdr_lon, obs_x, obs_y, hdr_ut, obs_lvl, obs_hgt, fcst_v, obs_v, obs_qty, cmn_v, csd_v, wgt_v)) { + mlog << Debug(4) + << "For " << fcst_info->magic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation since it is a duplicate:\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; inc_count(rej_dup, i, j, k); } @@ -1494,6 +1529,36 @@ PairDataPoint subset_climo_cdf_bin(const PairDataPoint &pd, return(out_pd); } +//////////////////////////////////////////////////////////////////////// + +// Write the point observation in the MET point format for logging +ConcatString point_obs_to_string(float *hdr_arr, const char *hdr_typ_str, + const char *hdr_sid_str, unixtime hdr_ut, + const char *obs_qty, float *obs_arr, + const char *var_name) { + ConcatString obs_cs, name; + + if((var_name != 0) && (0 < strlen(var_name))) name = var_name; + else name = obs_arr[1]; + + // + // Write the 11-column MET point format: + // Message_Type Station_ID Valid_Time(YYYYMMDD_HHMMSS) + // Lat(Deg North) Lon(Deg East) Elevation(msl) + // Var_Name(or GRIB_Code) Level Height(msl or agl) + // QC_String Observation_Value + // + obs_cs << " " + << hdr_typ_str << " " << hdr_sid_str << " " + << unix_to_yyyymmdd_hhmmss(hdr_ut) << " " + << hdr_arr[0] << " " << -1.0*hdr_arr[1] << " " + << hdr_arr[2] << " " << name << " " + << obs_arr[2] << " " << obs_arr[3] << " " + << obs_qty << " " << obs_arr[4]; + + return(obs_cs); +} + //////////////////////////////////////////////////////////////////////// // // End miscellaneous functions diff --git a/met/src/libcode/vx_statistics/pair_data_point.h b/met/src/libcode/vx_statistics/pair_data_point.h index 4c04625bd6..57ecb54aae 100644 --- a/met/src/libcode/vx_statistics/pair_data_point.h +++ b/met/src/libcode/vx_statistics/pair_data_point.h @@ -254,6 +254,13 @@ extern void subset_wind_pairs(const PairDataPoint &, extern PairDataPoint subset_climo_cdf_bin(const PairDataPoint &, const ThreshArray &, int i_bin); +// Write the point observation in the MET point format for logging +extern ConcatString point_obs_to_string( + float *hdr_arr, const char *hdr_typ_str, + const char *hdr_sid_str, unixtime hdr_ut, + const char *obs_qty, float *obs_arr, + const char *var_name); + //////////////////////////////////////////////////////////////////////// #endif // __PAIR_DATA_POINT_H__ From 2ba6cd99d40a0f276fc47522e41f4b0c061a37ef Mon Sep 17 00:00:00 2001 From: Howard Soh Date: Fri, 26 Feb 2021 16:16:23 -0700 Subject: [PATCH 036/165] #1454 Disabled plot_data_plane_CESM_SSMI_microwave and plot_data_plane_CESM_sea_ice_nc becaues of not evenly spaced --- test/xml/unit_plot_data_plane.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/xml/unit_plot_data_plane.xml b/test/xml/unit_plot_data_plane.xml index 1eb25e614c..67ecba95bf 100644 --- a/test/xml/unit_plot_data_plane.xml +++ b/test/xml/unit_plot_data_plane.xml @@ -343,6 +343,7 @@ + - - &MET_BIN;/plot_data_plane \ From 996197cff8c7272906602de8245ae26cd91549d5 Mon Sep 17 00:00:00 2001 From: johnhg Date: Mon, 1 Mar 2021 18:03:30 -0700 Subject: [PATCH 044/165] Feature 1684 bss and 1685 single reference model (#1689) * Per #1684, move an instance of the ClimoCDFInfo class into PairBase. Also define derive_climo_vals() and derive_climo_prob() utility functions. * Add to VxPairDataPoint and VxPairDataEnsemble functions to set the ClimoCDFInfo class. * Per #1684, update ensemble_stat and point_stat to set the ClimoCDFInfo object based on the contents of the config file. * Per #1684, update the vx_statistics library and stat_analysis to make calls to the new derive_climo_vals() and derive_climo_prob() functions. * Per #1684, since cdf_info is a member of PairBase class, need to handle it in the PairDataPoint and PairDataEnsemble assignment and subsetting logic. * Per #1684, during development, I ran across and then updated this log message. * Per #1684, working on log messages and figured that the regridding climo data should be moved from Debug(1) to at least Debug(2). * Per #1684 and #1685, update the logic for the derive_climo_vals() utility function. If only a single climo bin is requested, just return the climo mean. Otherwise, sample the requested number of values. * Per #1684, just fixing the format of this log message. * Per #1684, add a STATLine::get_offset() member function. * Per #1684, update parse_orank_line() logic. Rather than calling NumArray::clear() call NumArray::erase() to preserve allocated memory. Also, instead of parsing ensemble member values by column name, parse them by offset number. * Per #1684, call EnsemblePairData::extend() when parsing ORANK data to allocate one block of memory instead of bunches of litte ones. * Per #1684 and #1685, add another call to Ensemble-Stat to test computing the CRPSCL_EMP from a single climo mean instead of using the full climo distribution. * Per #1684 and #1685, update ensemble-stat docs about computing CRPSS_EMP relative to a single reference model. * Per #1684, need to update Grid-Stat to store the climo cdf info in the PairDataPoint objects. * Per #1684, remove debug print statements. * Per #1684, need to set cdf_info when aggregating MPR lines in Stat-Analysis. * Per #1684 and #1685, update PairDataEnsemble::compute_pair_vals() to print a log message indicating the climo data being used as reference: For a climo distribution defined by mean and stdev: DEBUG 3: Computing ensemble statistics relative to a 9-member climatological ensemble. For a single deterministic reference: DEBUG 3: Computing ensemble statistics relative to the climatological mean. --- met/docs/Users_Guide/ensemble-stat.rst | 6 +- met/src/libcode/vx_analysis_util/stat_line.cc | 16 +- met/src/libcode/vx_analysis_util/stat_line.h | 9 +- .../libcode/vx_statistics/compute_stats.cc | 3 +- met/src/libcode/vx_statistics/ens_stats.cc | 11 +- met/src/libcode/vx_statistics/pair_base.cc | 100 ++++++-- met/src/libcode/vx_statistics/pair_base.h | 48 ++-- .../vx_statistics/pair_data_ensemble.cc | 58 ++--- .../vx_statistics/pair_data_ensemble.h | 8 +- .../libcode/vx_statistics/pair_data_point.cc | 21 ++ .../libcode/vx_statistics/pair_data_point.h | 2 + met/src/libcode/vx_statistics/read_climo.cc | 2 +- .../tools/core/ensemble_stat/ensemble_stat.cc | 2 +- .../ensemble_stat/ensemble_stat_conf_info.cc | 4 +- met/src/tools/core/grid_stat/grid_stat.cc | 73 +++--- met/src/tools/core/point_stat/point_stat.cc | 2 +- .../core/point_stat/point_stat_conf_info.cc | 3 + .../core/stat_analysis/aggr_stat_line.cc | 45 ++-- .../tools/core/stat_analysis/aggr_stat_line.h | 1 + .../core/stat_analysis/parse_stat_line.cc | 9 +- .../tools/core/stat_analysis/stat_analysis.cc | 4 +- test/config/EnsembleStatConfig_one_cdf_bin | 237 ++++++++++++++++++ test/xml/unit_climatology.xml | 29 +++ 23 files changed, 550 insertions(+), 143 deletions(-) create mode 100644 test/config/EnsembleStatConfig_one_cdf_bin diff --git a/met/docs/Users_Guide/ensemble-stat.rst b/met/docs/Users_Guide/ensemble-stat.rst index 9a4b8f476e..cfe920c0e6 100644 --- a/met/docs/Users_Guide/ensemble-stat.rst +++ b/met/docs/Users_Guide/ensemble-stat.rst @@ -36,7 +36,11 @@ The ranked probability score (RPS) is included in the Ranked Probability Score ( Climatology data ~~~~~~~~~~~~~~~~ -The Ensemble-Stat output includes at least three statistics computed relative to external climatology data. The climatology is defined by mean and standard deviation fields, and both are required in the computation of ensemble skill score statistics. MET assumes that the climatology follows a normal distribution, defined by the mean and standard deviation at each point. When computing the CRPS skill score for (:ref:`Gneiting et al., 2004 `) the reference CRPS statistic is computed using the climatological mean and standard deviation directly. When computing the CRPS skill score for (:ref:`Hersbach, 2000 `) the reference CRPS statistic is computed by selecting equal-area-spaced values from the assumed normal climatological distribution. The number of points selected is determined by the *cdf_bins* setting in the *climo_cdf* dictionary. The reference CRPS is computed empirically from this ensemble of climatology values. The climatological distribution is also used for the RPSS. The forecast RPS statistic is computed from a probabilistic contingency table in which the probabilities are derived from the ensemble member values. In a simliar fashion, the climatogical probability for each observed value is derived from the climatological distribution. The area of the distribution to the left of the observed value is interpreted as the climatological probability. These climatological probabilities are also evaluated using a probabilistic contingency table from which the reference RPS score is computed. The skill scores are derived by comparing the forecast statistic to the reference climatology statistic. +The Ensemble-Stat output includes at least three statistics computed relative to external climatology data. The climatology is defined by mean and standard deviation fields, and typically both are required in the computation of ensemble skill score statistics. MET assumes that the climatology follows a normal distribution, defined by the mean and standard deviation at each point. + +When computing the CRPS skill score for (:ref:`Gneiting et al., 2004 `) the reference CRPS statistic is computed using the climatological mean and standard deviation directly. When computing the CRPS skill score for (:ref:`Hersbach, 2000 `) the reference CRPS statistic is computed by selecting equal-area-spaced values from the assumed normal climatological distribution. The number of points selected is determined by the *cdf_bins* setting in the *climo_cdf* dictionary. The reference CRPS is computed empirically from this ensemble of climatology values. If the number bins is set to 1, the climatological CRPS is computed using only the climatological mean value. In this way, the empirical CRPSS may be computed relative to a single model rather than a climatological distribution. + +The climatological distribution is also used for the RPSS. The forecast RPS statistic is computed from a probabilistic contingency table in which the probabilities are derived from the ensemble member values. In a simliar fashion, the climatogical probability for each observed value is derived from the climatological distribution. The area of the distribution to the left of the observed value is interpreted as the climatological probability. These climatological probabilities are also evaluated using a probabilistic contingency table from which the reference RPS score is computed. The skill scores are derived by comparing the forecast statistic to the reference climatology statistic. Ensemble observation error ~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/met/src/libcode/vx_analysis_util/stat_line.cc b/met/src/libcode/vx_analysis_util/stat_line.cc index b1d66871e0..9c2dadb7e8 100644 --- a/met/src/libcode/vx_analysis_util/stat_line.cc +++ b/met/src/libcode/vx_analysis_util/stat_line.cc @@ -327,6 +327,18 @@ bool STATLine::has(const char *col_str) const { +return ( !is_bad_data(get_offset(col_str)) ); + +} + + +//////////////////////////////////////////////////////////////////////// + + +int STATLine::get_offset(const char *col_str) const + +{ + int offset = bad_data_int; int dim = bad_data_int; @@ -353,10 +365,10 @@ if ( is_bad_data(offset) ) { } // - // Return whether a valid offset value was found + // Return the offset value // -return ( !is_bad_data(offset) ); +return ( offset ); } diff --git a/met/src/libcode/vx_analysis_util/stat_line.h b/met/src/libcode/vx_analysis_util/stat_line.h index ed52829950..6362031d58 100644 --- a/met/src/libcode/vx_analysis_util/stat_line.h +++ b/met/src/libcode/vx_analysis_util/stat_line.h @@ -61,10 +61,11 @@ class STATLine : public DataLine { // retrieve values of the header columns // - bool has (const char *) const; - ConcatString get (const char *, bool check_na = true) const; - const char * get_item (const char *, bool check_na = true) const; - const char * get_item (int, bool check_na = true) const; + bool has (const char *) const; + int get_offset(const char *) const; + ConcatString get (const char *, bool check_na = true) const; + const char * get_item (const char *, bool check_na = true) const; + const char * get_item (int, bool check_na = true) const; const char * version () const; const char * model () const; diff --git a/met/src/libcode/vx_statistics/compute_stats.cc b/met/src/libcode/vx_statistics/compute_stats.cc index 7e6e74f66f..211fe9860e 100644 --- a/met/src/libcode/vx_statistics/compute_stats.cc +++ b/met/src/libcode/vx_statistics/compute_stats.cc @@ -743,7 +743,8 @@ void compute_pctinfo(const PairDataPoint &pd, bool pstd_flag, // Use input climatological probabilities or derive them if(cmn_flag) { if(cprob_in) climo_prob = *cprob_in; - else climo_prob = derive_climo_prob(pd.cmn_na, pd.csd_na, + else climo_prob = derive_climo_prob(pd.cdf_info, + pd.cmn_na, pd.csd_na, pct_info.othresh); } diff --git a/met/src/libcode/vx_statistics/ens_stats.cc b/met/src/libcode/vx_statistics/ens_stats.cc index 4748b186ac..ebfe4b5e28 100644 --- a/met/src/libcode/vx_statistics/ens_stats.cc +++ b/met/src/libcode/vx_statistics/ens_stats.cc @@ -484,10 +484,10 @@ void RPSInfo::set(const PairDataEnsemble &pd) { // Check that thresholds are actually defined if(fthresh.n() == 0) { mlog << Error << "\nRPSInfo::set(const PairDataEnsemble &) -> " - << "no thresholds provided to compute the RPS line type! " - << "Specify thresholds using the \"" - << conf_key_prob_cat_thresh - << "\" configuration file option.\n\n"; + << "no thresholds provided to compute the RPS line type!\n" + << "Specify thresholds using the \"" << conf_key_prob_cat_thresh + << "\" configuration file option or by providing climatological " + << "mean and standard deviation data.\n\n"; exit(1); } @@ -522,7 +522,8 @@ void RPSInfo::set(const PairDataEnsemble &pd) { climo_pct.zero_out(); // Derive climatological probabilities - if(cmn_flag) climo_prob = derive_climo_prob(pd.cmn_na, pd.csd_na, + if(cmn_flag) climo_prob = derive_climo_prob(pd.cdf_info, + pd.cmn_na, pd.csd_na, fthresh[i]); // Loop over the observations diff --git a/met/src/libcode/vx_statistics/pair_base.cc b/met/src/libcode/vx_statistics/pair_base.cc index 490037c78b..8066ed262f 100644 --- a/met/src/libcode/vx_statistics/pair_base.cc +++ b/met/src/libcode/vx_statistics/pair_base.cc @@ -74,6 +74,8 @@ void PairBase::clear() { interp_mthd = InterpMthd_None; interp_shape = GridTemplateFactory::GridTemplate_None; + cdf_info.clear(); + o_na.clear(); x_na.clear(); y_na.clear(); @@ -121,6 +123,8 @@ void PairBase::erase() { interp_mthd = InterpMthd_None; interp_shape = GridTemplateFactory::GridTemplate_None; + cdf_info.clear(); + o_na.erase(); x_na.erase(); y_na.erase(); @@ -267,6 +271,15 @@ void PairBase::set_interp_shape(GridTemplateFactory::GridTemplates shape) { //////////////////////////////////////////////////////////////////////// +void PairBase::set_climo_cdf_info(const ClimoCDFInfo &info) { + + cdf_info = info; + + return; +} + +//////////////////////////////////////////////////////////////////////// + void PairBase::set_fcst_ut(unixtime ut){ fcst_ut = ut; @@ -1010,11 +1023,49 @@ bool set_climo_flag(const NumArray &f_na, const NumArray &c_na) { //////////////////////////////////////////////////////////////////////// -NumArray derive_climo_prob(const NumArray &mn_na, const NumArray &sd_na, +void derive_climo_vals(const ClimoCDFInfo &cdf_info, + double m, double s, + NumArray &climo_vals) { + + // Initialize + climo_vals.erase(); + + // cdf_info.cdf_ta starts with >=0.0 and ends with >=1.0. + // The number of bins is the number of thresholds minus 1. + + // Check for bad mean value + if(is_bad_data(m) || cdf_info.cdf_ta.n() < 2) { + return; + } + // Single climo bin + else if(cdf_info.cdf_ta.n() == 2) { + climo_vals.add(m); + } + // Check for bad standard deviation value + else if(is_bad_data(s)) { + return; + } + // Extract climo distribution values + else { + + // Skip the first and last thresholds + for(int i=1; i " + mlog << Error << "\nderive_climo_prob() -> " << "climatological threshold \"" << othresh.get_str() << "\" cannot be converted to a probability!\n\n"; exit(1); @@ -1060,23 +1111,17 @@ NumArray derive_climo_prob(const NumArray &mn_na, const NumArray &sd_na, // threshold else if(n_mn > 0 && n_sd > 0) { - mlog << Debug(2) - << "Deriving normal approximation of climatological " - << "probabilities for threshold " << othresh.get_str() - << ".\n"; + // The first (>=0.0) and last (>=1.0) climo thresholds are omitted + mlog << Debug(4) + << "Deriving climatological probabilities for threshold " + << othresh.get_str() << " by sampling " << cdf_info.cdf_ta.n()-2 + << " values from the normal climatological distribution.\n"; - // Compute probability value for each point + // Compute the probability by sampling from the climo distribution + // and deriving the event frequency for(i=0; i 2) { + mlog << Debug(3) + << "Computing ensemble statistics relative to a " + << cdf_info.cdf_ta.n() - 2 + << "-member climatological ensemble.\n"; + } + else { + mlog << Debug(3) + << "No reference climatology data provided.\n"; + } + // Compute the rank for each observation for(i=0, n_pair=0, n_skip_const=0, n_skip_vld=0; i=0.0) and last (>=1.0) climo CDF thresholds - for(int i=1; igrid() == vx_grid)) { - mlog << Debug(1) + mlog << Debug(2) << "Regridding the " << cur_ut_cs << " \"" << info->magic_str() << "\" climatology field to the verification grid.\n"; diff --git a/met/src/tools/core/ensemble_stat/ensemble_stat.cc b/met/src/tools/core/ensemble_stat/ensemble_stat.cc index 31ab7b8b56..f3affe5895 100644 --- a/met/src/tools/core/ensemble_stat/ensemble_stat.cc +++ b/met/src/tools/core/ensemble_stat/ensemble_stat.cc @@ -1735,7 +1735,7 @@ void process_grid_vx() { // Initialize pd_all.clear(); pd_all.set_ens_size(n_vx_vld[i]); - pd_all.set_climo_cdf(conf_info.vx_opt[i].cdf_info); + pd_all.set_climo_cdf_info(conf_info.vx_opt[i].cdf_info); pd_all.skip_const = conf_info.vx_opt[i].vx_pd.pd[0][0][0].skip_const; // Apply the current mask to the fields and compute the pairs diff --git a/met/src/tools/core/ensemble_stat/ensemble_stat_conf_info.cc b/met/src/tools/core/ensemble_stat/ensemble_stat_conf_info.cc index 0461bc1b7f..e4361e041a 100644 --- a/met/src/tools/core/ensemble_stat/ensemble_stat_conf_info.cc +++ b/met/src/tools/core/ensemble_stat/ensemble_stat_conf_info.cc @@ -877,8 +877,8 @@ void EnsembleStatVxOpt::set_vx_pd(EnsembleStatConfInfo *conf_info) { // Define the dimensions vx_pd.set_pd_size(n_msg_typ, n_mask, n_interp); - // Store climo CDF - vx_pd.set_climo_cdf(cdf_info); + // Store the climo CDF info + vx_pd.set_climo_cdf_info(cdf_info); // Store the list of surface message types vx_pd.set_msg_typ_sfc(conf_info->msg_typ_sfc); diff --git a/met/src/tools/core/grid_stat/grid_stat.cc b/met/src/tools/core/grid_stat/grid_stat.cc index 5a90a6464f..14b09c6d5a 100644 --- a/met/src/tools/core/grid_stat/grid_stat.cc +++ b/met/src/tools/core/grid_stat/grid_stat.cc @@ -145,7 +145,8 @@ static void build_outfile_name(unixtime, int, const char *, static void process_scores(); -static void get_mask_points(const MaskPlane &, const DataPlane *, +static void get_mask_points(const GridStatVxOpt &, + const MaskPlane &, const DataPlane *, const DataPlane *, const DataPlane *, const DataPlane *, const DataPlane *, PairDataPoint &); @@ -797,7 +798,8 @@ void process_scores() { } // Apply the current mask to the current fields - get_mask_points(mask_mp, &fcst_dp_smooth, &obs_dp_smooth, + get_mask_points(conf_info.vx_opt[i], mask_mp, + &fcst_dp_smooth, &obs_dp_smooth, &cmn_dp, &csd_dp, &wgt_dp, pd); // Set the mask name @@ -981,7 +983,8 @@ void process_scores() { } // Apply the current mask to the U-wind fields - get_mask_points(mask_mp, &fu_dp_smooth, &ou_dp_smooth, + get_mask_points(conf_info.vx_opt[i], mask_mp, + &fu_dp_smooth, &ou_dp_smooth, &cmnu_dp, &csdu_dp, &wgt_dp, pd_u); // Compute VL1L2 @@ -1136,9 +1139,11 @@ void process_scores() { mask_bad_data(mask_mp, ogy_dp); // Apply the current mask to the current fields - get_mask_points(mask_mp, &fgx_dp, &ogx_dp, + get_mask_points(conf_info.vx_opt[i], mask_mp, + &fgx_dp, &ogx_dp, 0, 0, &wgt_dp, pd_gx); - get_mask_points(mask_mp, &fgy_dp, &ogy_dp, + get_mask_points(conf_info.vx_opt[i], mask_mp, + &fgy_dp, &ogy_dp, 0, 0, &wgt_dp, pd_gy); // Set the mask name @@ -1217,7 +1222,8 @@ void process_scores() { conf_info.vx_opt[i].ocat_ta.need_perc()) { // Apply the current mask - get_mask_points(mask_mp, &fcst_dp, &obs_dp, + get_mask_points(conf_info.vx_opt[i], mask_mp, + &fcst_dp, &obs_dp, &cmn_dp, 0, 0, pd); // Process percentile thresholds @@ -1271,9 +1277,11 @@ void process_scores() { // Apply the current mask to the distance map and // thresholded fields - get_mask_points(mask_mp, &fcst_dp_dmap, &obs_dp_dmap, + get_mask_points(conf_info.vx_opt[i], mask_mp, + &fcst_dp_dmap, &obs_dp_dmap, 0, 0, 0, pd); - get_mask_points(mask_mp, &fcst_dp_thresh, &obs_dp_thresh, + get_mask_points(conf_info.vx_opt[i], mask_mp, + &fcst_dp_thresh, &obs_dp_thresh, 0, 0, 0, pd_thr); dmap_info.set_options( @@ -1346,7 +1354,8 @@ void process_scores() { conf_info.vx_opt[i].ocat_ta.need_perc()) { // Apply the current mask - get_mask_points(mask_mp, &fcst_dp, &obs_dp, + get_mask_points(conf_info.vx_opt[i], mask_mp, + &fcst_dp, &obs_dp, &cmn_dp, 0, 0, pd); // Process percentile thresholds @@ -1445,9 +1454,11 @@ void process_scores() { // Apply the current mask to the fractional coverage // and thresholded fields - get_mask_points(mask_mp, &fcst_dp_smooth, &obs_dp_smooth, + get_mask_points(conf_info.vx_opt[i], mask_mp, + &fcst_dp_smooth, &obs_dp_smooth, 0, 0, &wgt_dp, pd); - get_mask_points(mask_mp, &fcst_dp_thresh, &obs_dp_thresh, + get_mask_points(conf_info.vx_opt[i], mask_mp, + &fcst_dp_thresh, &obs_dp_thresh, 0, 0, 0, pd_thr); // Store climatology values as bad data @@ -1618,7 +1629,8 @@ void process_scores() { } // Apply the current mask to the current fields - get_mask_points(mask_mp, &fcst_dp_smooth, &obs_dp_smooth, + get_mask_points(conf_info.vx_opt[i], mask_mp, + &fcst_dp_smooth, &obs_dp_smooth, &cmn_dp_smooth, &csd_dp, &wgt_dp, pd); // Set the mask name @@ -1706,7 +1718,8 @@ void process_scores() { } // Apply the current mask to the U-wind fields - get_mask_points(mask_mp, &fu_dp_smooth, &ou_dp_smooth, + get_mask_points(conf_info.vx_opt[i], mask_mp, + &fu_dp_smooth, &ou_dp_smooth, &cmnu_dp_smooth, 0, &wgt_dp, pd_u); // Compute VL1L2 @@ -1790,29 +1803,33 @@ void process_scores() { //////////////////////////////////////////////////////////////////////// -void get_mask_points(const MaskPlane &mask_mp, +void get_mask_points(const GridStatVxOpt &vx_opt, + const MaskPlane &mask_mp, const DataPlane *fcst_ptr, const DataPlane *obs_ptr, const DataPlane *cmn_ptr, const DataPlane *csd_ptr, const DataPlane *wgt_ptr, PairDataPoint &pd) { - // Initialize - pd.erase(); + // Initialize + pd.erase(); - // Apply the mask the data fields or fill with default values - apply_mask(*fcst_ptr, mask_mp, pd.f_na); - apply_mask(*obs_ptr, mask_mp, pd.o_na); - pd.n_obs = pd.o_na.n(); + // Store the climo CDF info + pd.set_climo_cdf_info(vx_opt.cdf_info); + + // Apply the mask the data fields or fill with default values + apply_mask(*fcst_ptr, mask_mp, pd.f_na); + apply_mask(*obs_ptr, mask_mp, pd.o_na); + pd.n_obs = pd.o_na.n(); - if(cmn_ptr) apply_mask(*cmn_ptr, mask_mp, pd.cmn_na); - else pd.cmn_na.add_const(bad_data_double, pd.n_obs); - if(csd_ptr) apply_mask(*csd_ptr, mask_mp, pd.csd_na); - else pd.csd_na.add_const(bad_data_double, pd.n_obs); - if(wgt_ptr) apply_mask(*wgt_ptr, mask_mp, pd.wgt_na); - else pd.wgt_na.add_const(default_grid_weight, pd.n_obs); + if(cmn_ptr) apply_mask(*cmn_ptr, mask_mp, pd.cmn_na); + else pd.cmn_na.add_const(bad_data_double, pd.n_obs); + if(csd_ptr) apply_mask(*csd_ptr, mask_mp, pd.csd_na); + else pd.csd_na.add_const(bad_data_double, pd.n_obs); + if(wgt_ptr) apply_mask(*wgt_ptr, mask_mp, pd.wgt_na); + else pd.wgt_na.add_const(default_grid_weight, pd.n_obs); - if(cmn_ptr && csd_ptr) pd.add_climo_cdf(); + if(cmn_ptr && csd_ptr) pd.add_climo_cdf(); - return; + return; } //////////////////////////////////////////////////////////////////////// diff --git a/met/src/tools/core/point_stat/point_stat.cc b/met/src/tools/core/point_stat/point_stat.cc index f61583f3ee..d1edfdb935 100644 --- a/met/src/tools/core/point_stat/point_stat.cc +++ b/met/src/tools/core/point_stat/point_stat.cc @@ -1762,7 +1762,7 @@ void do_hira_ens(int i_vx, const PairDataPoint *pd_ptr) { hira_pd.clear(); hira_pd.extend(pd_ptr->n_obs); hira_pd.set_ens_size(gt->size()); - hira_pd.set_climo_cdf(conf_info.vx_opt[i_vx].cdf_info); + hira_pd.set_climo_cdf_info(conf_info.vx_opt[i_vx].cdf_info); f_ens.extend(gt->size()); // Process each observation point diff --git a/met/src/tools/core/point_stat/point_stat_conf_info.cc b/met/src/tools/core/point_stat/point_stat_conf_info.cc index 0d8dd3fa43..ecd6b8b3dc 100644 --- a/met/src/tools/core/point_stat/point_stat_conf_info.cc +++ b/met/src/tools/core/point_stat/point_stat_conf_info.cc @@ -932,6 +932,9 @@ void PointStatVxOpt::set_vx_pd(PointStatConfInfo *conf_info) { // Define the dimensions vx_pd.set_pd_size(n_msg_typ, n_mask, n_interp); + // Store the climo CDF info + vx_pd.set_climo_cdf_info(cdf_info); + // Store the surface message type group cs = surface_msg_typ_group_str; if(conf_info->msg_typ_group_map.count(cs) == 0) { diff --git a/met/src/tools/core/stat_analysis/aggr_stat_line.cc b/met/src/tools/core/stat_analysis/aggr_stat_line.cc index 3bd72ae766..db7cd98ba9 100644 --- a/met/src/tools/core/stat_analysis/aggr_stat_line.cc +++ b/met/src/tools/core/stat_analysis/aggr_stat_line.cc @@ -575,7 +575,22 @@ ConcatString StatHdrInfo::get_shc_str(const ConcatString &cur_case, //////////////////////////////////////////////////////////////////////// // -// Code for AggrTimeSeriesInfo structure. +// Code for AggrENSInfo structure +// +//////////////////////////////////////////////////////////////////////// + +void AggrENSInfo::clear() { + hdr.clear(); + ens_pd.clear(); + me_na.clear(); + mse_na.clear(); + me_oerr_na.clear(); + mse_oerr_na.clear(); +} + +//////////////////////////////////////////////////////////////////////// +// +// Code for AggrTimeSeriesInfo structure // //////////////////////////////////////////////////////////////////////// @@ -2190,6 +2205,9 @@ void aggr_mpr_lines(LineDataFile &f, STATAnalysisJob &job, // if(m.count(key) == 0) { + bool center = false; + aggr.pd.cdf_info.set_cdf_ta(nint(1.0/job.out_bin_size), center); + aggr.pd.f_na.clear(); aggr.pd.o_na.clear(); aggr.pd.cmn_na.clear(); @@ -2208,6 +2226,7 @@ void aggr_mpr_lines(LineDataFile &f, STATAnalysisJob &job, aggr.fcst_var = cur.fcst_var; aggr.obs_var = cur.obs_var; aggr.hdr.clear(); + m[key] = aggr; } // @@ -2552,8 +2571,7 @@ void aggr_ecnt_lines(LineDataFile &f, STATAnalysisJob &job, // Add a new map entry, if necessary // if(m.count(key) == 0) { - aggr.ens_pd.clear(); - aggr.hdr.clear(); + aggr.clear(); m[key] = aggr; } @@ -2775,8 +2793,7 @@ void aggr_rhist_lines(LineDataFile &f, STATAnalysisJob &job, // Add a new map entry, if necessary // if(m.count(key) == 0) { - aggr.ens_pd.clear(); - aggr.hdr.clear(); + aggr.clear(); for(i=0; i::iterator it; @@ -3045,17 +3062,17 @@ void aggr_orank_lines(LineDataFile &f, STATAnalysisJob &job, // Add a new map entry, if necessary // if(m.count(key) == 0) { - aggr.ens_pd.clear(); + aggr.clear(); + bool center = false; + aggr.ens_pd.cdf_info.set_cdf_ta(nint(1.0/job.out_bin_size), center); aggr.ens_pd.obs_error_flag = !is_bad_data(cur.ens_mean_oerr); aggr.ens_pd.set_ens_size(cur.n_ens); + aggr.ens_pd.extend(cur.total); for(i=0; i " - << "the \"N_ENS\" column must remain constant. " + << "the \"N_ENS\" column must remain constant. " << "Try setting \"-column_eq N_ENS n\".\n\n"; throw(1); } @@ -3099,12 +3116,12 @@ void aggr_orank_lines(LineDataFile &f, STATAnalysisJob &job, m[key].ens_pd.v_na.add(n_valid); // Derive ensemble from climo mean and standard deviation - cur_clm = derive_climo_cdf_inv(m[key].ens_pd.cdf_info, - cur.climo_mean, cur.climo_stdev); + derive_climo_vals(m[key].ens_pd.cdf_info, + cur.climo_mean, cur.climo_stdev, climo_vals); // Store empirical CRPS stats m[key].ens_pd.crps_emp_na.add(compute_crps_emp(cur.obs, cur.ens_na)); - m[key].ens_pd.crpscl_emp_na.add(compute_crps_emp(cur.obs, cur_clm)); + m[key].ens_pd.crpscl_emp_na.add(compute_crps_emp(cur.obs, climo_vals)); // Store Gaussian CRPS stats m[key].ens_pd.crps_gaus_na.add(compute_crps_gaus(cur.obs, cur.ens_mean, cur.spread)); diff --git a/met/src/tools/core/stat_analysis/aggr_stat_line.h b/met/src/tools/core/stat_analysis/aggr_stat_line.h index 2e6ab5b72e..e8ed7809f9 100644 --- a/met/src/tools/core/stat_analysis/aggr_stat_line.h +++ b/met/src/tools/core/stat_analysis/aggr_stat_line.h @@ -152,6 +152,7 @@ struct AggrENSInfo { StatHdrInfo hdr; PairDataEnsemble ens_pd; NumArray me_na, mse_na, me_oerr_na, mse_oerr_na; + void clear(); }; struct AggrRPSInfo { diff --git a/met/src/tools/core/stat_analysis/parse_stat_line.cc b/met/src/tools/core/stat_analysis/parse_stat_line.cc index 2f79ae4c3a..14bf981ea6 100644 --- a/met/src/tools/core/stat_analysis/parse_stat_line.cc +++ b/met/src/tools/core/stat_analysis/parse_stat_line.cc @@ -461,8 +461,7 @@ void parse_relp_line(STATLine &l, RELPData &r_data) { //////////////////////////////////////////////////////////////////////// void parse_orank_line(STATLine &l, ORANKData &o_data) { - int i; - char col_str[max_str_len]; + int i, ens1; o_data.total = atoi(l.get_item("TOTAL")); o_data.index = atoi(l.get_item("INDEX")); @@ -480,10 +479,10 @@ void parse_orank_line(STATLine &l, ORANKData &o_data) { o_data.n_ens = atoi(l.get_item("N_ENS")); // Parse out ENS_i - o_data.ens_na.clear(); + o_data.ens_na.erase(); + ens1 = l.get_offset("ENS_1"); for(i=0; i + + + + echo "&DATA_DIR_MODEL;/grib1/arw-fer-gep1/arw-fer-gep1_2012040912_F024.grib \ + &DATA_DIR_MODEL;/grib1/arw-fer-gep5/arw-fer-gep5_2012040912_F024.grib \ + &DATA_DIR_MODEL;/grib1/arw-sch-gep2/arw-sch-gep2_2012040912_F024.grib \ + &DATA_DIR_MODEL;/grib1/arw-sch-gep6/arw-sch-gep6_2012040912_F024.grib \ + &DATA_DIR_MODEL;/grib1/arw-tom-gep3/arw-tom-gep3_2012040912_F024.grib \ + &DATA_DIR_MODEL;/grib1/arw-tom-gep7/arw-tom-gep7_2012040912_F024.grib" \ + > &OUTPUT_DIR;/climatology/ensemble_stat_input_file_list; \ + &MET_BIN;/ensemble_stat + + OUTPUT_PREFIX ONE_CDF_BIN + CLIMO_MEAN_FILE_LIST "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cmean_1d.19590410" + + \ + &OUTPUT_DIR;/climatology/ensemble_stat_input_file_list \ + &CONFIG_DIR;/EnsembleStatConfig_one_cdf_bin \ + -point_obs &OUTPUT_DIR;/pb2nc/ndas.20120410.t12z.prepbufr.tm00.nc \ + -grid_obs &DATA_DIR_OBS;/laps/laps_2012041012_F000.grib \ + -outdir &OUTPUT_DIR;/climatology + + + &OUTPUT_DIR;/climatology/ensemble_stat_ONE_CDF_BIN_20120410_120000V.stat + &OUTPUT_DIR;/climatology/ensemble_stat_ONE_CDF_BIN_20120410_120000V_ecnt.txt + &OUTPUT_DIR;/climatology/ensemble_stat_ONE_CDF_BIN_20120410_120000V_ens.nc + + + From 40b57af2e2124ae9bec11181cf2b2452171482ec Mon Sep 17 00:00:00 2001 From: johnhg Date: Tue, 2 Mar 2021 16:09:21 -0700 Subject: [PATCH 045/165] Per #1691, add met-10.0.0-beta4 release notes. (#1692) --- met/docs/Users_Guide/release-notes.rst | 55 +++++++++++++++++++++++++- met/docs/conf.py | 2 +- met/docs/version | 2 +- 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/met/docs/Users_Guide/release-notes.rst b/met/docs/Users_Guide/release-notes.rst index 679c9e7fbf..791d657cfc 100644 --- a/met/docs/Users_Guide/release-notes.rst +++ b/met/docs/Users_Guide/release-notes.rst @@ -2,11 +2,64 @@ MET release notes _________________ When applicable, release notes are followed by the GitHub issue number which -describes the bugfix, enhancement, or new feature: `MET Git-Hub issues. `_ +describes the bugfix, enhancement, or new feature: `MET GitHub issues. `_ Version |version| release notes (|release_date|) ------------------------------------------------ +Version `10.0.0-beta4 `_ release notes (20210302) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* Bugfixes: + + * Fix the set_attr_accum option to set the accumulation time instead of the lead time (`#1646 `_). + * Correct the time offset for tests in unit_plot_data_plane.xml (`#1677 `_). + +* Repository and build: + + * Enhance the sample plotting R-script to read output from different versions of MET (`#1653 `_). + +* Library code: + + * Miscellaneous: + + * Update GRIB1/2 table entries for the MXUPHL, MAXREF, MAXUVV, and MAXDVV variables (`#1658 `_). + * Update the Air Force GRIB tables to reflect current AF usage (`#1519 `_). + * Enhance the DataLine::get_item() error message to include the file name, line number, and column (`#1429 `_). + + * NetCDF library: + + * Add support for the NetCDF-CF conventions time bounds option (`#1657 `_). + * Error out when reading CF-compliant NetCDF data with incomplete grid definition (`#1454 `_). + * Reformat and simplify the magic_str() printed for NetCDF data files (`#1655 `_). + + * Statistics computations: + + * Add support for the Hersbach CRPS algorithm by add new columns to the ECNT line type (`#1450 `_). + * Enhance MET to derive the Hersbach CRPSCL_EMP and CRPSS_EMP statistics from a single deterministic reference model (`#1685 `_). + * Correct the climatological CRPS computation to match the NOAA/EMC VSDB method (`#1451 `_). + * Modify the climatological Brier Score computation to match the NOAA/EMC VSDB method (`#1684 `_). + +* Application code: + + * ASCII2NC and Point2Grid: + + * Enhance ascii2nc and point2grid to gracefully process zero input observations rather than erroring out (`#1630 `_). + + * Point-Stat Tool: + + * Enhance the validation of masking regions to check for non-unique masking region names (`#1439 `_). + * Print the Point-Stat rejection code reason count log messages at verbosity level 2 for zero matched pairs (`#1644 `_). + * Add detailed log messages to Point-Stat when discarding observations (`#1588 `_). + + * Stat-Analysis Tool: + + * Add -fcst_init_inc/_exc and -fcst_valid_inc/_exc job command filtering options to Stat-Analysis (`#1135 `_). + + * MODE Tool: + + * Update the MODE AREA_RATIO output column to list the forecast area divided by the observation area (`#1643 `_). + Version `10.0.0-beta3 `_ release notes (20210127) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/met/docs/conf.py b/met/docs/conf.py index 15b76ffc0b..efa6f948c9 100644 --- a/met/docs/conf.py +++ b/met/docs/conf.py @@ -24,7 +24,7 @@ verinfo = version release = f'{version}' release_year = '2021' -release_date = f'{release_year}0127' +release_date = f'{release_year}0302' copyright = f'{release_year}, {author}' # -- General configuration --------------------------------------------------- diff --git a/met/docs/version b/met/docs/version index 16c1efe0d4..2e6b7f7038 100644 --- a/met/docs/version +++ b/met/docs/version @@ -1 +1 @@ -10.0.0-beta3 +10.0.0-beta4 From 23dc482ac49af3fef1103ef46585c488cf5b8f6d Mon Sep 17 00:00:00 2001 From: "Julie.Prestopnik" Date: Wed, 3 Mar 2021 10:11:09 -0700 Subject: [PATCH 046/165] Updated Python documentation --- met/docs/Users_Guide/appendixF.rst | 6 +++--- met/docs/requirements.txt | 11 +++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 met/docs/requirements.txt diff --git a/met/docs/Users_Guide/appendixF.rst b/met/docs/Users_Guide/appendixF.rst index aa4d1f84aa..e122d6a560 100644 --- a/met/docs/Users_Guide/appendixF.rst +++ b/met/docs/Users_Guide/appendixF.rst @@ -13,11 +13,11 @@ ________________________ In order to use Python embedding, the user's local Python installation must have the C-language Python header files and libraries. Sometimes when Python is installed locally, these header files and libraries are deleted at the end of the installation process, leaving only the binary executable and run-time shared object files. But the Python header files and libraries must be present to compile support in MET for Python embedding. Assuming the requisite Python files are present, and that Python embedding is enabled when building MET (which is done by passing the **--enable-python** option to the **configure** command line), the MET C++ code will use these in the compilation process to link directly to the Python libraries. -In addition to the **configure** option mentioned above, two variables, **MET_PYTHON_CC** and **MET_PYTHON_LD**, must also be set for the configuration process. These may either be set as environment variables or as command line options to **configure**. These constants are passed as compiler command line options when building MET to enable the compiler to find the requisite Python header files and libraries in the user's local filesystem. Fortunately, Python provides a way to set these variables properly. This frees the user from the necessity of having any expert knowledge of the compiling and linking process. Along with the **Python** executable, there should be another executable called **python-config**, whose output can be used to set these environment variables as follows: +In addition to the **configure** option mentioned above, two variables, **MET_PYTHON_CC** and **MET_PYTHON_LD**, must also be set for the configuration process. These may either be set as environment variables or as command line options to **configure**. These constants are passed as compiler command line options when building MET to enable the compiler to find the requisite Python header files and libraries in the user's local filesystem. Fortunately, Python provides a way to set these variables properly. This frees the user from the necessity of having any expert knowledge of the compiling and linking process. Along with the **Python** executable, there should be another executable called **python3-config**, whose output can be used to set these environment variables as follows: -• On the command line, run “**python-config --cflags**”. Set the value of **MET_PYTHON_CC** to the output of that command. +• On the command line, run “**python3-config --cflags**”. Set the value of **MET_PYTHON_CC** to the output of that command. -• Again on the command line, run “**python-config --ldflags**”. Set the value of **MET_PYTHON_LD** to the output of that command. +• Again on the command line, run “**python3-config --ldflags**”. Set the value of **MET_PYTHON_LD** to the output of that command. Make sure that these are set as environment variables or that you have included them on the command line prior to running **configure**. diff --git a/met/docs/requirements.txt b/met/docs/requirements.txt new file mode 100644 index 0000000000..f6bdb82841 --- /dev/null +++ b/met/docs/requirements.txt @@ -0,0 +1,11 @@ +sphinx +sphinx-gallery +sphinx-rtd-theme +sphinxcontrib-applehelp +sphinxcontrib-bibtex +sphinxcontrib-devhelp +sphinxcontrib-htmlhelp +sphinxcontrib-jsmath +sphinxcontrib-qthelp +sphinxcontrib-serializinghtml + From 9c9c54cef62a8e726ac3b52ee911a0684d693a6b Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Thu, 4 Mar 2021 16:11:13 -0700 Subject: [PATCH 047/165] Per #1694, add VarInfo::magic_str_attr() to construct a field summary string from the name_attr() and level_attr() functions. --- met/src/libcode/vx_data2d/var_info.cc | 13 +++++++++++++ met/src/libcode/vx_data2d/var_info.h | 1 + 2 files changed, 14 insertions(+) diff --git a/met/src/libcode/vx_data2d/var_info.cc b/met/src/libcode/vx_data2d/var_info.cc index e72a761096..aa4449d2e5 100644 --- a/met/src/libcode/vx_data2d/var_info.cc +++ b/met/src/libcode/vx_data2d/var_info.cc @@ -434,6 +434,19 @@ void VarInfo::set_magic(const ConcatString &nstr, const ConcatString &lstr) { /////////////////////////////////////////////////////////////////////////////// +ConcatString VarInfo::magic_str_attr() const { + ConcatString mstr(name_attr()); + ConcatString lstr(level_attr()); + + // Format as {name}/{level} or {name}{level} + if(lstr.nonempty() && lstr[0] != '(') mstr << "/"; + mstr << lstr; + + return(mstr); +} + +/////////////////////////////////////////////////////////////////////////////// + void VarInfo::set_dict(Dictionary &dict) { ThreshArray ta; NumArray na; diff --git a/met/src/libcode/vx_data2d/var_info.h b/met/src/libcode/vx_data2d/var_info.h index b9d7c501af..f2801a49c0 100644 --- a/met/src/libcode/vx_data2d/var_info.h +++ b/met/src/libcode/vx_data2d/var_info.h @@ -135,6 +135,7 @@ class VarInfo RegridInfo regrid() const; + ConcatString magic_str_attr() const; ConcatString name_attr() const; ConcatString units_attr() const; ConcatString level_attr() const; From a16bebc778370626234142d8e177b17e8c2e8f4c Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Thu, 4 Mar 2021 16:44:48 -0700 Subject: [PATCH 048/165] Per #1694, fixing 2 issues here. There was a bug in the computation of the max value. Had a less-than sign that should have been greater-than. Also, switch from tracking data by it's magic_str() to simply using VAR_i and VAR_j strings. We *could* have just used the i, j integers directly, but constructing the ij joint histogram integer could have been tricky since we start numbering with 0 instead of 1. i=0, j=1 would result in 01 which is the same as integer of 1. If we do want to switch to integers, we just need to make them 1-based and add +1 all over the place. --- met/src/tools/other/grid_diag/grid_diag.cc | 100 ++++++++++++--------- 1 file changed, 60 insertions(+), 40 deletions(-) diff --git a/met/src/tools/other/grid_diag/grid_diag.cc b/met/src/tools/other/grid_diag/grid_diag.cc index 2fe311e0b2..b9f4f2d12a 100644 --- a/met/src/tools/other/grid_diag/grid_diag.cc +++ b/met/src/tools/other/grid_diag/grid_diag.cc @@ -16,6 +16,7 @@ // ---- ---- ---- ----------- // 000 10/01/19 Fillmore New // 001 07/28/20 Halley Gotway Updates for #1391. +// 002 03/04/21 Halley Gotway Bugfix #1694. // //////////////////////////////////////////////////////////////////////// @@ -228,6 +229,7 @@ void process_series(void) { StringArray *cur_files; GrdFileType *cur_ftype; Grid cur_grid; + ConcatString i_var_str, j_var_str, ij_var_str; // List the lengths of the series options mlog << Debug(1) @@ -245,6 +247,8 @@ void process_series(void) { // Process the 1d histograms for(int i_var=0; i_varmagic_str() + << "Reading field " << data_info->magic_str_attr() << " data from file: " << (*cur_files)[i_series] << "\n"; @@ -268,7 +272,7 @@ void process_series(void) { // Regrid, if necessary if(!(cur_grid == grid)) { mlog << Debug(2) - << "Regridding field " << data_info->magic_str() + << "Regridding field " << data_info->magic_str_attr() << " to the verification grid.\n"; data_dp[i_var] = met_regrid(data_dp[i_var], cur_grid, grid, @@ -311,38 +315,40 @@ void process_series(void) { if(is_bad_data(var_mins[i_var]) || min < var_mins[i_var]) { var_mins[i_var] = min; } - if(is_bad_data(var_maxs[i_var]) || max < var_maxs[i_var]) { + if(is_bad_data(var_maxs[i_var]) || max > var_maxs[i_var]) { var_maxs[i_var] = max; } - + // Update partial sums - update_pdf(bin_mins[data_info->magic_str()][0], - bin_deltas[data_info->magic_str()], - histograms[data_info->magic_str()], + update_pdf(bin_mins[i_var_str][0], + bin_deltas[i_var_str], + histograms[i_var_str], data_dp[i_var], conf_info.mask_area); } // end for i_var // Process the 2d joint histograms for(int i_var=0; i_varmagic_str(); - joint_str.add("_"); - joint_str.add(joint_info->magic_str()); + ij_var_str << cs_erase << i_var_str << "_" << j_var_str; // Update joint partial sums update_joint_pdf(data_info->n_bins(), joint_info->n_bins(), - bin_mins[data_info->magic_str()][0], - bin_mins[joint_info->magic_str()][0], - bin_deltas[data_info->magic_str()], - bin_deltas[joint_info->magic_str()], - joint_histograms[joint_str], + bin_mins[i_var_str][0], + bin_mins[j_var_str][0], + bin_deltas[i_var_str], + bin_deltas[j_var_str], + joint_histograms[ij_var_str], data_dp[i_var], data_dp[j_var], conf_info.mask_area); } // end for j_var @@ -355,7 +361,7 @@ void process_series(void) { VarInfo *data_info = conf_info.data_info[i_var]; mlog << Debug(2) - << "Processed " << data_info->magic_str() + << "Processed " << data_info->magic_str_attr() << " data with range (" << var_mins[i_var] << ", " << var_maxs[i_var] << ") into bins with range (" << data_info->range()[0] << ", " @@ -364,7 +370,7 @@ void process_series(void) { if(var_mins[i_var] < data_info->range()[0] || var_maxs[i_var] > data_info->range()[1]) { mlog << Warning << "\nprocess_series() -> " - << "the range of the " << data_info->magic_str() + << "the range of the " << data_info->magic_str_attr() << " data (" << var_mins[i_var] << ", " << var_maxs[i_var] << ") falls outside the configuration file range (" << data_info->range()[0] << ", " @@ -378,9 +384,12 @@ void process_series(void) { //////////////////////////////////////////////////////////////////////// void setup_histograms(void) { + ConcatString i_var_str; for(int i_var=0; i_varmagic_str()] = bin_min; - bin_maxs[data_info->magic_str()] = bin_max; - bin_mids[data_info->magic_str()] = bin_mid; - bin_deltas[data_info->magic_str()] = delta; + bin_mins[i_var_str] = bin_min; + bin_maxs[i_var_str] = bin_max; + bin_mids[i_var_str] = bin_mid; + bin_deltas[i_var_str] = delta; // Initialize histograms mlog << Debug(2) - << "Initializing " << data_info->magic_str() + << "Initializing " << data_info->magic_str_attr() << " histogram with " << n_bins << " bins from " << min << " to " << max << ".\n"; - histograms[data_info->magic_str()] = vector(); - init_pdf(n_bins, histograms[data_info->magic_str()]); + histograms[i_var_str] = vector(); + init_pdf(n_bins, histograms[i_var_str]); } // for i_var } //////////////////////////////////////////////////////////////////////// void setup_joint_histograms(void) { + ConcatString i_var_str, j_var_str, ij_var_str; for(int i_var=0; i_varn_bins(); for(int j_var=i_var+1; j_varn_bins(); - ConcatString joint_str = data_info->magic_str(); - joint_str.add("_"); - joint_str.add(joint_info->magic_str()); + ij_var_str << cs_erase << i_var_str << "_" << j_var_str; + mlog << Debug(2) - << "Initializing " << joint_str << " joint histogram with " - << n_bins << " x " << n_joint_bins << " bins.\n"; - joint_histograms[joint_str] = vector(); + << "Initializing " << data_info->magic_str_attr() << "_" + << joint_info->magic_str_attr() << " joint histogram with " + << n_bins << " x " << n_joint_bins << " bins.\n"; + joint_histograms[ij_var_str] = vector(); init_joint_pdf(n_bins, n_joint_bins, - joint_histograms[joint_str]); + joint_histograms[ij_var_str]); } // end for j_var } // end for i_var } @@ -453,7 +467,7 @@ void setup_joint_histograms(void) { //////////////////////////////////////////////////////////////////////// void setup_nc_file(void) { - ConcatString cs; + ConcatString cs, i_var_str; // Create NetCDF file nc_out = open_ncfile(out_file.c_str(), true); @@ -494,6 +508,8 @@ void setup_nc_file(void) { for(int i_var=0; i_var < conf_info.get_n_data(); i_var++) { + i_var_str << cs_erase << "VAR" << i_var; + VarInfo *data_info = conf_info.data_info[i_var]; // Set variable NetCDF name @@ -534,9 +550,9 @@ void setup_nc_file(void) { add_var_att_local(&var_mid, "units", data_info->units_attr()); // Write bin values - var_min.putVar(bin_mins[data_info->magic_str()].data()); - var_max.putVar(bin_maxs[data_info->magic_str()].data()); - var_mid.putVar(bin_mids[data_info->magic_str()].data()); + var_min.putVar(bin_mins[i_var_str].data()); + var_max.putVar(bin_maxs[i_var_str].data()); + var_mid.putVar(bin_mids[i_var_str].data()); } // Define histograms @@ -625,13 +641,16 @@ void add_var_att_local(NcVar *var, const char *att_name, //////////////////////////////////////////////////////////////////////// void write_histograms(void) { + ConcatString i_var_str; for(int i_var=0; i_var < conf_info.get_n_data(); i_var++) { + i_var_str << cs_erase << "VAR" << i_var; + VarInfo *data_info = conf_info.data_info[i_var]; NcVar hist_var = hist_vars[i_var]; - int *hist = histograms[data_info->magic_str()].data(); + int *hist = histograms[i_var_str].data(); hist_var.putVar(hist); } @@ -642,6 +661,7 @@ void write_histograms(void) { void write_joint_histograms(void) { vector offsets; vector counts; + ConcatString var_cs; int i_hist=0; for(int i_var=0; i_varmagic_str(); - joint_str.add("_"); - joint_str.add(joint_info->magic_str()); + var_cs << cs_erase + << "VAR" << i_var << "_" + << "VAR" << j_var; - int *hist = joint_histograms[joint_str].data(); + int *hist = joint_histograms[var_cs].data(); offsets.clear(); counts.clear(); From 21e3eb7d5f046d353acc32db942d16554f61f1fc Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Thu, 4 Mar 2021 17:26:34 -0700 Subject: [PATCH 049/165] Per #1694, just switching to consistent variable name. --- met/src/tools/other/grid_diag/grid_diag.cc | 66 +++++++++++----------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/met/src/tools/other/grid_diag/grid_diag.cc b/met/src/tools/other/grid_diag/grid_diag.cc index b9f4f2d12a..7cc2f6c0ef 100644 --- a/met/src/tools/other/grid_diag/grid_diag.cc +++ b/met/src/tools/other/grid_diag/grid_diag.cc @@ -318,7 +318,7 @@ void process_series(void) { if(is_bad_data(var_maxs[i_var]) || max > var_maxs[i_var]) { var_maxs[i_var] = max; } - + // Update partial sums update_pdf(bin_mins[i_var_str][0], bin_deltas[i_var_str], @@ -510,34 +510,34 @@ void setup_nc_file(void) { i_var_str << cs_erase << "VAR" << i_var; - VarInfo *data_info = conf_info.data_info[i_var]; + VarInfo *data_info = conf_info.data_info[i_var]; + + // Set variable NetCDF name + ConcatString var_name = data_info->name_attr(); + var_name.add("_"); + var_name.add(data_info->level_attr()); - // Set variable NetCDF name - ConcatString var_name = data_info->name_attr(); - var_name.add("_"); - var_name.add(data_info->level_attr()); - - // Define histogram dimensions - NcDim var_dim = add_dim(nc_out, var_name, - (long) data_info->n_bins()); - data_var_dims.push_back(var_dim); - - // Define histogram bins - ConcatString var_min_name = var_name; - ConcatString var_max_name = var_name; - ConcatString var_mid_name = var_name; - var_min_name.add("_min"); - var_max_name.add("_max"); - var_mid_name.add("_mid"); - NcVar var_min = add_var(nc_out, var_min_name, ncFloat, var_dim, - deflate_level); - NcVar var_max = add_var(nc_out, var_max_name, ncFloat, var_dim, - deflate_level); - NcVar var_mid = add_var(nc_out, var_mid_name, ncFloat, var_dim, - deflate_level); - - // Add variable attributes - cs << cs_erase << "Minimum value of " << var_name << " bin"; + // Define histogram dimensions + NcDim var_dim = add_dim(nc_out, var_name, + (long) data_info->n_bins()); + data_var_dims.push_back(var_dim); + + // Define histogram bins + ConcatString var_min_name = var_name; + ConcatString var_max_name = var_name; + ConcatString var_mid_name = var_name; + var_min_name.add("_min"); + var_max_name.add("_max"); + var_mid_name.add("_mid"); + NcVar var_min = add_var(nc_out, var_min_name, ncFloat, var_dim, + deflate_level); + NcVar var_max = add_var(nc_out, var_max_name, ncFloat, var_dim, + deflate_level); + NcVar var_mid = add_var(nc_out, var_mid_name, ncFloat, var_dim, + deflate_level); + + // Add variable attributes + cs << cs_erase << "Minimum value of " << var_name << " bin"; add_var_att_local(&var_min, "long_name", cs); add_var_att_local(&var_min, "units", data_info->units_attr()); @@ -661,7 +661,7 @@ void write_histograms(void) { void write_joint_histograms(void) { vector offsets; vector counts; - ConcatString var_cs; + ConcatString ij_var_str; int i_hist=0; for(int i_var=0; i_var Date: Thu, 4 Mar 2021 17:29:39 -0700 Subject: [PATCH 050/165] Just consistent spacing. --- met/src/tools/other/grid_diag/grid_diag.cc | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/met/src/tools/other/grid_diag/grid_diag.cc b/met/src/tools/other/grid_diag/grid_diag.cc index 7cc2f6c0ef..6199ba408f 100644 --- a/met/src/tools/other/grid_diag/grid_diag.cc +++ b/met/src/tools/other/grid_diag/grid_diag.cc @@ -440,27 +440,27 @@ void setup_joint_histograms(void) { i_var_str << cs_erase << "VAR" << i_var; - VarInfo *data_info = conf_info.data_info[i_var]; - int n_bins = data_info->n_bins(); + VarInfo *data_info = conf_info.data_info[i_var]; + int n_bins = data_info->n_bins(); - for(int j_var=i_var+1; j_varn_bins(); + VarInfo *joint_info = conf_info.data_info[j_var]; + int n_joint_bins = joint_info->n_bins(); ij_var_str << cs_erase << i_var_str << "_" << j_var_str; - mlog << Debug(2) - << "Initializing " << data_info->magic_str_attr() << "_" + mlog << Debug(2) + << "Initializing " << data_info->magic_str_attr() << "_" << joint_info->magic_str_attr() << " joint histogram with " - << n_bins << " x " << n_joint_bins << " bins.\n"; - joint_histograms[ij_var_str] = vector(); + << n_bins << " x " << n_joint_bins << " bins.\n"; + joint_histograms[ij_var_str] = vector(); - init_joint_pdf(n_bins, n_joint_bins, - joint_histograms[ij_var_str]); - } // end for j_var + init_joint_pdf(n_bins, n_joint_bins, + joint_histograms[ij_var_str]); + } // end for j_var } // end for i_var } From f21b2e62a9791525db92a1ac61738762ba767ff4 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Fri, 5 Mar 2021 09:22:54 -0700 Subject: [PATCH 051/165] Added python3_script::import_read_tmp_ascii. --- .../vx_python3_utils/python3_script.cc | 34 +++++++++++++++---- .../libcode/vx_python3_utils/python3_script.h | 12 ++++++- .../tools/other/ascii2nc/python_handler.cc | 2 +- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/met/src/libcode/vx_python3_utils/python3_script.cc b/met/src/libcode/vx_python3_utils/python3_script.cc index 9a3c2ccaf9..ffef0ef99d 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.cc +++ b/met/src/libcode/vx_python3_utils/python3_script.cc @@ -77,8 +77,12 @@ void Python3_Script::clear() Module = 0; +ModuleAscii = 0; + Dict = 0; +DictAscii = 0; + Script_Filename.clear(); @@ -242,7 +246,7 @@ return; //////////////////////////////////////////////////////////////////////// -void Python3_Script::import_read_tmp_ascii_py(void) const +void Python3_Script::import_read_tmp_ascii_py(void) { @@ -266,11 +270,30 @@ run_python_string(command.text()); mlog << Debug(2) << "Importing " << module << "\n"; -command << cs_erase << "import read_tmp_ascii"; +ConcatString path = "read_tmp_ascii"; -mlog << Debug(3) << command << "\n"; +ModuleAscii = PyImport_ImportModule(path.text()); -run_python_string(command.text()); +if ( ! ModuleAscii ) { + + PyErr_Print(); + mlog << Error << "\nPython3_Script::Python3_Script(const char *) -> " + << "unable to import module \"" << path << "\"\n\n"; + + Py_Finalize(); + + exit ( 1 ); + +} + +DictAscii = PyModule_GetDict (ModuleAscii); + + // + // done + // + +fflush(stdout); +fflush(stderr); } @@ -293,8 +316,7 @@ mlog << Debug(3) << command << "\n"; PyErr_Clear(); -PyObject * pobj; - +// PyObject * pobj; // pobj = run(command.text()); run_python_string(command.text()); diff --git a/met/src/libcode/vx_python3_utils/python3_script.h b/met/src/libcode/vx_python3_utils/python3_script.h index 5a765aeabb..382bad9b58 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.h +++ b/met/src/libcode/vx_python3_utils/python3_script.h @@ -41,6 +41,10 @@ class Python3_Script { PyObject * Dict; // script dictionary, not allocated + PyObject * ModuleAscii; + + PyObject * DictAscii; + ConcatString Script_Filename; @@ -62,6 +66,8 @@ class Python3_Script { PyObject * module(); PyObject * dict(); + PyObject * module_ascii(); + PyObject * dict_ascii(); // // do stuff @@ -77,7 +83,7 @@ class Python3_Script { void read_pickle (const char * variable_name, const char * pickle_filename) const; - void import_read_tmp_ascii_py (void) const; + void import_read_tmp_ascii_py (void); void read_tmp_ascii (const char * tmp_filename) const; }; @@ -90,6 +96,10 @@ inline PyObject * Python3_Script::module() { return ( Module ); } inline PyObject * Python3_Script::dict() { return ( Dict ); } +inline PyObject * Python3_Script::module_ascii() { return ( ModuleAscii ); } + +inline PyObject * Python3_Script::dict_ascii() { return ( DictAscii ); } + inline ConcatString Python3_Script::filename() const { return ( Script_Filename ); } diff --git a/met/src/tools/other/ascii2nc/python_handler.cc b/met/src/tools/other/ascii2nc/python_handler.cc index 35e697045e..15aba246b8 100644 --- a/met/src/tools/other/ascii2nc/python_handler.cc +++ b/met/src/tools/other/ascii2nc/python_handler.cc @@ -386,7 +386,7 @@ script.import_read_tmp_ascii_py(); script.read_pickle(list_name, pickle_path.text()); -script.read_tmp_ascii(tmp_ascii_path.text()); +// script.read_tmp_ascii(tmp_ascii_path.text()); PyObject * obj = script.lookup(list_name); From 31ae2e459821b066b23affef003d9fb48f681877 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Fri, 5 Mar 2021 09:45:15 -0700 Subject: [PATCH 052/165] Restored read_tmp_ascii call. --- met/src/libcode/vx_python3_utils/python3_script.cc | 10 +++++----- met/src/tools/other/ascii2nc/python_handler.cc | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/met/src/libcode/vx_python3_utils/python3_script.cc b/met/src/libcode/vx_python3_utils/python3_script.cc index ffef0ef99d..b4f20f1bcd 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.cc +++ b/met/src/libcode/vx_python3_utils/python3_script.cc @@ -286,7 +286,7 @@ if ( ! ModuleAscii ) { } -DictAscii = PyModule_GetDict (ModuleAscii); +DictAscii = PyModule_GetDict(ModuleAscii); // // done @@ -308,7 +308,7 @@ mlog << Debug(2) << "Reading temporary ascii file: " ConcatString command; -command << "read_tmp_ascii.read_tmp_ascii(\"" +command << "read_tmp_ascii(\"" << tmp_filename << "\")"; @@ -316,9 +316,9 @@ mlog << Debug(3) << command << "\n"; PyErr_Clear(); -// PyObject * pobj; -// pobj = run(command.text()); -run_python_string(command.text()); +PyObject * pobj; + +pobj = PyRun_String(command.text(), Py_file_input, DictAscii, DictAscii); if ( PyErr_Occurred() ) { diff --git a/met/src/tools/other/ascii2nc/python_handler.cc b/met/src/tools/other/ascii2nc/python_handler.cc index 15aba246b8..35e697045e 100644 --- a/met/src/tools/other/ascii2nc/python_handler.cc +++ b/met/src/tools/other/ascii2nc/python_handler.cc @@ -386,7 +386,7 @@ script.import_read_tmp_ascii_py(); script.read_pickle(list_name, pickle_path.text()); -// script.read_tmp_ascii(tmp_ascii_path.text()); +script.read_tmp_ascii(tmp_ascii_path.text()); PyObject * obj = script.lookup(list_name); From f8becb96f090710003d1f0bbf88668dbc54e6936 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Fri, 5 Mar 2021 09:52:36 -0700 Subject: [PATCH 053/165] Added lookup into ascii module. --- met/src/libcode/vx_python3_utils/python3_script.cc | 13 +++++++++++++ met/src/libcode/vx_python3_utils/python3_script.h | 2 ++ met/src/tools/other/ascii2nc/python_handler.cc | 2 ++ 3 files changed, 17 insertions(+) diff --git a/met/src/libcode/vx_python3_utils/python3_script.cc b/met/src/libcode/vx_python3_utils/python3_script.cc index b4f20f1bcd..0373fb5ec6 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.cc +++ b/met/src/libcode/vx_python3_utils/python3_script.cc @@ -165,6 +165,19 @@ return ( var ); } +//////////////////////////////////////////////////////////////////////// + +PyObject * Python3_Script::lookup_ascii(const char * name) const + +{ + +PyObject * var = 0; + +var = PyDict_GetItemString (DictAscii, name); + +return ( var ); + +} //////////////////////////////////////////////////////////////////////// diff --git a/met/src/libcode/vx_python3_utils/python3_script.h b/met/src/libcode/vx_python3_utils/python3_script.h index 382bad9b58..42d3134492 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.h +++ b/met/src/libcode/vx_python3_utils/python3_script.h @@ -79,6 +79,8 @@ class Python3_Script { PyObject * lookup(const char * name) const; + PyObject * lookup_ascii(const char * name) const; + PyObject * run(const char * command) const; // runs a command in the namespace of the script void read_pickle (const char * variable_name, const char * pickle_filename) const; diff --git a/met/src/tools/other/ascii2nc/python_handler.cc b/met/src/tools/other/ascii2nc/python_handler.cc index 35e697045e..fac3effc11 100644 --- a/met/src/tools/other/ascii2nc/python_handler.cc +++ b/met/src/tools/other/ascii2nc/python_handler.cc @@ -390,6 +390,8 @@ script.read_tmp_ascii(tmp_ascii_path.text()); PyObject * obj = script.lookup(list_name); +// PyObject * obj = script.lookup_ascii(list_name); + if ( ! PyList_Check(obj) ) { mlog << Error << "\nPythonHandler::do_pickle() -> " From 922484461f32a35b15591817a9c4e06539bb9ff9 Mon Sep 17 00:00:00 2001 From: "Julie.Prestopnik" Date: Fri, 5 Mar 2021 15:49:53 -0700 Subject: [PATCH 054/165] Adding files for ReadTheDocs --- met/docs/requirements.txt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/met/docs/requirements.txt b/met/docs/requirements.txt index f6bdb82841..b323295f77 100644 --- a/met/docs/requirements.txt +++ b/met/docs/requirements.txt @@ -1,11 +1,11 @@ -sphinx -sphinx-gallery -sphinx-rtd-theme -sphinxcontrib-applehelp +sphinx==2.4.4 +sphinx-gallery==0.7.0 +sphinx-rtd-theme==0.4.3 +sphinxcontrib-applehelp==1.0.2 sphinxcontrib-bibtex -sphinxcontrib-devhelp -sphinxcontrib-htmlhelp -sphinxcontrib-jsmath -sphinxcontrib-qthelp -sphinxcontrib-serializinghtml +sphinxcontrib-devhelp==1.0.2 +sphinxcontrib-htmlhelp==1.0.3 +sphinxcontrib-jsmath==1.0.1 +sphinxcontrib-qthelp==1.0.3 +sphinxcontrib-serializinghtml==1.1.4 From 1b41a0aab645933595c1cd6d1240011ad23a8f7c Mon Sep 17 00:00:00 2001 From: "Julie.Prestopnik" Date: Fri, 5 Mar 2021 15:53:00 -0700 Subject: [PATCH 055/165] Adding .yaml file for ReadTheDocs --- .readthedocs.yaml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .readthedocs.yaml diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000000..c6dfdc81d4 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,22 @@ +# .readthedocs.yaml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Build all formats (htmlzip, pdf, epub) +formats: all + +# Optionally set the version of Python and requirements required to build your +# docs +python: + version: 3.7 + install: + - requirements: docs/requirements.txt + +# Configuration for Sphinx documentation (this is the default documentation +# type) +sphinx: + builder: html + configuration: conf.py \ No newline at end of file From 8382b33bb8662876a62ea5e8c9b2788df87a70fd Mon Sep 17 00:00:00 2001 From: "Julie.Prestopnik" Date: Fri, 5 Mar 2021 16:07:20 -0700 Subject: [PATCH 056/165] Updated path to requirements.txt file --- .readthedocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index c6dfdc81d4..751fd6e5e6 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -13,7 +13,7 @@ formats: all python: version: 3.7 install: - - requirements: docs/requirements.txt + - requirements: met/docs/requirements.txt # Configuration for Sphinx documentation (this is the default documentation # type) From 0303f1f3740c59dee3a959ea7deaad32abaec90d Mon Sep 17 00:00:00 2001 From: "Julie.Prestopnik" Date: Fri, 5 Mar 2021 16:12:21 -0700 Subject: [PATCH 057/165] Updated path to conf.py file --- .readthedocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 751fd6e5e6..36014c884e 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -19,4 +19,4 @@ python: # type) sphinx: builder: html - configuration: conf.py \ No newline at end of file + configuration: met/docs/conf.py \ No newline at end of file From 99a63631a6828b6f0a37e4becd7820cd1511136c Mon Sep 17 00:00:00 2001 From: "Julie.Prestopnik" Date: Fri, 5 Mar 2021 16:35:47 -0700 Subject: [PATCH 058/165] Removing ReadTheDocs files and working in separate branch --- .readthedocs.yaml | 22 ---------------------- met/docs/requirements.txt | 11 ----------- 2 files changed, 33 deletions(-) delete mode 100644 .readthedocs.yaml delete mode 100644 met/docs/requirements.txt diff --git a/.readthedocs.yaml b/.readthedocs.yaml deleted file mode 100644 index 36014c884e..0000000000 --- a/.readthedocs.yaml +++ /dev/null @@ -1,22 +0,0 @@ -# .readthedocs.yaml -# Read the Docs configuration file -# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details - -# Required -version: 2 - -# Build all formats (htmlzip, pdf, epub) -formats: all - -# Optionally set the version of Python and requirements required to build your -# docs -python: - version: 3.7 - install: - - requirements: met/docs/requirements.txt - -# Configuration for Sphinx documentation (this is the default documentation -# type) -sphinx: - builder: html - configuration: met/docs/conf.py \ No newline at end of file diff --git a/met/docs/requirements.txt b/met/docs/requirements.txt deleted file mode 100644 index b323295f77..0000000000 --- a/met/docs/requirements.txt +++ /dev/null @@ -1,11 +0,0 @@ -sphinx==2.4.4 -sphinx-gallery==0.7.0 -sphinx-rtd-theme==0.4.3 -sphinxcontrib-applehelp==1.0.2 -sphinxcontrib-bibtex -sphinxcontrib-devhelp==1.0.2 -sphinxcontrib-htmlhelp==1.0.3 -sphinxcontrib-jsmath==1.0.1 -sphinxcontrib-qthelp==1.0.3 -sphinxcontrib-serializinghtml==1.1.4 - From b0c8813be10f6a17732eed393ecd0fc01aff8359 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Sat, 6 Mar 2021 19:12:42 -0700 Subject: [PATCH 059/165] Return PyObject* from read_tmp_ascii. --- met/src/libcode/vx_python3_utils/python3_script.cc | 9 ++++++++- met/src/libcode/vx_python3_utils/python3_script.h | 2 +- met/src/tools/other/ascii2nc/python_handler.cc | 8 ++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/met/src/libcode/vx_python3_utils/python3_script.cc b/met/src/libcode/vx_python3_utils/python3_script.cc index 0373fb5ec6..7bd567ae2c 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.cc +++ b/met/src/libcode/vx_python3_utils/python3_script.cc @@ -312,7 +312,7 @@ fflush(stderr); //////////////////////////////////////////////////////////////////////// -void Python3_Script::read_tmp_ascii(const char * tmp_filename) const +PyObject* Python3_Script::read_tmp_ascii(const char * tmp_filename) const { @@ -341,6 +341,13 @@ if ( PyErr_Occurred() ) { exit ( 1 ); } +PyTypeObject* type = pobj->ob_type; + +const char* p = type->tp_name; + +mlog << Debug(2) << "read_tmp_ascii return type: " << p << "\n"; + +return pobj; } //////////////////////////////////////////////////////////////////////// diff --git a/met/src/libcode/vx_python3_utils/python3_script.h b/met/src/libcode/vx_python3_utils/python3_script.h index 42d3134492..6930d226a5 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.h +++ b/met/src/libcode/vx_python3_utils/python3_script.h @@ -87,7 +87,7 @@ class Python3_Script { void import_read_tmp_ascii_py (void); - void read_tmp_ascii (const char * tmp_filename) const; + PyObject * read_tmp_ascii (const char * tmp_filename) const; }; diff --git a/met/src/tools/other/ascii2nc/python_handler.cc b/met/src/tools/other/ascii2nc/python_handler.cc index fac3effc11..189a17ea13 100644 --- a/met/src/tools/other/ascii2nc/python_handler.cc +++ b/met/src/tools/other/ascii2nc/python_handler.cc @@ -153,7 +153,7 @@ if ( ! PyList_Check(obj) ) { mlog << Error << "\nPythonHandler::load_python_obs(PyObject *) -> " << "given object not a list!\n\n"; - exit ( 1 ); + // exit ( 1 ); } @@ -386,9 +386,9 @@ script.import_read_tmp_ascii_py(); script.read_pickle(list_name, pickle_path.text()); -script.read_tmp_ascii(tmp_ascii_path.text()); +PyObject * obj = script.read_tmp_ascii(tmp_ascii_path.text()); -PyObject * obj = script.lookup(list_name); +// PyObject * obj = script.lookup(list_name); // PyObject * obj = script.lookup_ascii(list_name); @@ -397,7 +397,7 @@ if ( ! PyList_Check(obj) ) { mlog << Error << "\nPythonHandler::do_pickle() -> " << "pickle object is not a list!\n\n"; - exit ( 1 ); + // exit ( 1 ); } From bd9ed77aabf08b300abff1a363535c6ddbad929f Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Sun, 7 Mar 2021 07:30:50 -0700 Subject: [PATCH 060/165] Put point_data in global namespace. --- met/data/wrappers/read_tmp_ascii.py | 8 ++++++-- met/src/tools/other/ascii2nc/python_handler.cc | 8 ++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/met/data/wrappers/read_tmp_ascii.py b/met/data/wrappers/read_tmp_ascii.py index 126150b168..b4f4303044 100644 --- a/met/data/wrappers/read_tmp_ascii.py +++ b/met/data/wrappers/read_tmp_ascii.py @@ -18,6 +18,8 @@ import argparse +point_data = None + def read_tmp_ascii(filename): """ Arguments: @@ -26,13 +28,15 @@ def read_tmp_ascii(filename): Returns: (list of lists): point data """ + print('read_tmp_ascii:' + filename) f = open(filename, 'r') lines = f.readlines() f.close() - data = [eval(line.strip('\n')) for line in lines] + global point_data + point_data = [eval(line.strip('\n')) for line in lines] - return data + return point_data if __name__ == '__main__': """ diff --git a/met/src/tools/other/ascii2nc/python_handler.cc b/met/src/tools/other/ascii2nc/python_handler.cc index 189a17ea13..d1b410523f 100644 --- a/met/src/tools/other/ascii2nc/python_handler.cc +++ b/met/src/tools/other/ascii2nc/python_handler.cc @@ -153,7 +153,7 @@ if ( ! PyList_Check(obj) ) { mlog << Error << "\nPythonHandler::load_python_obs(PyObject *) -> " << "given object not a list!\n\n"; - // exit ( 1 ); + exit ( 1 ); } @@ -386,18 +386,18 @@ script.import_read_tmp_ascii_py(); script.read_pickle(list_name, pickle_path.text()); -PyObject * obj = script.read_tmp_ascii(tmp_ascii_path.text()); +PyObject * dobj = script.read_tmp_ascii(tmp_ascii_path.text()); // PyObject * obj = script.lookup(list_name); -// PyObject * obj = script.lookup_ascii(list_name); +PyObject * obj = script.lookup_ascii(list_name); if ( ! PyList_Check(obj) ) { mlog << Error << "\nPythonHandler::do_pickle() -> " << "pickle object is not a list!\n\n"; - // exit ( 1 ); + exit ( 1 ); } From b358bedd65b51432c02c88056170d14a3b026939 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Sun, 7 Mar 2021 08:21:12 -0700 Subject: [PATCH 061/165] Remove temporary ascii file. --- met/data/wrappers/Makefile.am | 3 +- met/data/wrappers/write_tmp_point.py | 32 +++++++++++++++++++ met/src/tools/other/ascii2nc/ascii2nc.cc | 1 + .../tools/other/ascii2nc/python_handler.cc | 9 +++--- 4 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 met/data/wrappers/write_tmp_point.py diff --git a/met/data/wrappers/Makefile.am b/met/data/wrappers/Makefile.am index a8f464313f..5061e51d51 100644 --- a/met/data/wrappers/Makefile.am +++ b/met/data/wrappers/Makefile.am @@ -27,7 +27,8 @@ wrappers_DATA = \ write_tmp_dataplane.py \ write_pickle_mpr.py \ read_tmp_ascii.py \ - write_pickle_point.py + write_pickle_point.py \ + write_tmp_point.py EXTRA_DIST = ${wrappers_DATA} diff --git a/met/data/wrappers/write_tmp_point.py b/met/data/wrappers/write_tmp_point.py new file mode 100644 index 0000000000..4bbd046122 --- /dev/null +++ b/met/data/wrappers/write_tmp_point.py @@ -0,0 +1,32 @@ +######################################################################## +# +# Adapted from a script provided by George McCabe +# Adapted by Randy Bullock +# +# usage: /path/to/python write_tmp_point.py \ +# tmp_ascii_output_filename .py +# +######################################################################## + +import os +import sys +import importlib.util + +print('Python Script:\t', sys.argv[0]) +print('User Command:\t', sys.argv[2:]) +print('Write Temporary Ascii:\t', sys.argv[1]) + +tmp_filename = sys.argv[1] + '.txt' + +pyembed_module_name = sys.argv[2] +sys.argv = sys.argv[2:] + +user_base = os.path.basename(pyembed_module_name).replace('.py','') + +spec = importlib.util.spec_from_file_location(user_base, pyembed_module_name) +met_in = importlib.util.module_from_spec(spec) +spec.loader.exec_module(met_in) + +f = open(tmp_filename, 'w') +for line in met_in.point_data: + f.write(str(line) + '\n') diff --git a/met/src/tools/other/ascii2nc/ascii2nc.cc b/met/src/tools/other/ascii2nc/ascii2nc.cc index 4ced5397b1..360329659c 100644 --- a/met/src/tools/other/ascii2nc/ascii2nc.cc +++ b/met/src/tools/other/ascii2nc/ascii2nc.cc @@ -43,6 +43,7 @@ // 015 03-20-19 Fillmore Add aeronetv2 and aeronetv3 options. // 016 01-30-20 Bullock Add python option. // 017 01-25-21 Halley Gotway MET #1630 Handle zero obs. +// 018 03-01-21 Fillmore Replace pickle files for temporary ascii. // //////////////////////////////////////////////////////////////////////// diff --git a/met/src/tools/other/ascii2nc/python_handler.cc b/met/src/tools/other/ascii2nc/python_handler.cc index d1b410523f..522e877bce 100644 --- a/met/src/tools/other/ascii2nc/python_handler.cc +++ b/met/src/tools/other/ascii2nc/python_handler.cc @@ -27,9 +27,8 @@ using namespace std; static const char generic_python_wrapper [] = "generic_python"; -static const char generic_pickle_wrapper [] = "generic_pickle"; -static const char write_pickle_wrapper [] = "MET_BASE/wrappers/write_pickle_point.py"; +static const char write_pickle_wrapper [] = "MET_BASE/wrappers/write_tmp_point.py"; static const char list_name [] = "point_data"; @@ -378,13 +377,13 @@ if ( status ) { ConcatString wrapper; -wrapper = generic_pickle_wrapper; +wrapper = generic_python_wrapper; Python3_Script script(wrapper.text()); script.import_read_tmp_ascii_py(); -script.read_pickle(list_name, pickle_path.text()); +// script.read_pickle(list_name, pickle_path.text()); PyObject * dobj = script.read_tmp_ascii(tmp_ascii_path.text()); @@ -407,7 +406,7 @@ load_python_obs(obj); // cleanup // -remove_temp_file(pickle_path); +remove_temp_file(tmp_ascii_path); // // done From 450617347eff5b10d4a992ed0835329857ee7291 Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Sun, 7 Mar 2021 08:33:16 -0700 Subject: [PATCH 062/165] Added tmp_ascii_path. --- met/data/wrappers/write_tmp_point.py | 2 +- .../tools/other/ascii2nc/python_handler.cc | 20 ++++++++----------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/met/data/wrappers/write_tmp_point.py b/met/data/wrappers/write_tmp_point.py index 4bbd046122..94f56cd3dd 100644 --- a/met/data/wrappers/write_tmp_point.py +++ b/met/data/wrappers/write_tmp_point.py @@ -16,7 +16,7 @@ print('User Command:\t', sys.argv[2:]) print('Write Temporary Ascii:\t', sys.argv[1]) -tmp_filename = sys.argv[1] + '.txt' +tmp_filename = sys.argv[1] pyembed_module_name = sys.argv[2] sys.argv = sys.argv[2:] diff --git a/met/src/tools/other/ascii2nc/python_handler.cc b/met/src/tools/other/ascii2nc/python_handler.cc index 522e877bce..4cdd1a69be 100644 --- a/met/src/tools/other/ascii2nc/python_handler.cc +++ b/met/src/tools/other/ascii2nc/python_handler.cc @@ -28,11 +28,11 @@ using namespace std; static const char generic_python_wrapper [] = "generic_python"; -static const char write_pickle_wrapper [] = "MET_BASE/wrappers/write_tmp_point.py"; +static const char write_tmp_ascii_wrapper[] = "MET_BASE/wrappers/write_tmp_point.py"; static const char list_name [] = "point_data"; -static const char pickle_base_name [] = "tmp_ascii2nc_pickle"; +static const char tmp_base_name [] = "tmp_ascii2nc"; //////////////////////////////////////////////////////////////////////// @@ -345,17 +345,17 @@ if ( ! tmp_dir ) tmp_dir = default_tmp_dir; path << cs_erase << tmp_dir << '/' - << pickle_base_name; + << tmp_base_name; -pickle_path = make_temp_file_name(path.text(), 0); +// pickle_path = make_temp_file_name(path.text(), 0); tmp_ascii_path = make_temp_file_name(path.text(), 0); tmp_ascii_path << ".txt"; command << cs_erase - << user_path_to_python << ' ' // user's path to python - << replace_path(write_pickle_wrapper) << ' ' // write_pickle.py - << pickle_path << ' ' // pickle output filename - << user_script_filename; // user's script name + << user_path_to_python << ' ' // user's path to python + << replace_path(write_tmp_ascii_wrapper) << ' ' // write_tmp_point.py + << tmp_ascii_path << ' ' // pickle output filename + << user_script_filename; // user's script name for (j=0; j Date: Sun, 7 Mar 2021 08:42:08 -0700 Subject: [PATCH 063/165] Removed read_obs_from_pickle. --- .../tools/other/ascii2nc/python_handler.cc | 22 +++++++++---------- met/src/tools/other/ascii2nc/python_handler.h | 10 ++++----- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/met/src/tools/other/ascii2nc/python_handler.cc b/met/src/tools/other/ascii2nc/python_handler.cc index 4cdd1a69be..d894ab6c64 100644 --- a/met/src/tools/other/ascii2nc/python_handler.cc +++ b/met/src/tools/other/ascii2nc/python_handler.cc @@ -56,7 +56,7 @@ PythonHandler::PythonHandler(const string &program_name) : FileHandler(program_n { -use_pickle = false; +use_tmp_ascii = false; } @@ -81,13 +81,13 @@ for (j=1; j<(a.n()); ++j) { // j starts at one here, not zero } -use_pickle = false; +use_tmp_ascii = false; const char * c = getenv(user_python_path_env); if ( c ) { - use_pickle = true; + use_tmp_ascii = true; user_path_to_python = c; @@ -230,7 +230,7 @@ bool PythonHandler::readAsciiFiles(const vector< ConcatString > &ascii_filename_ bool status = false; -if ( use_pickle ) status = do_pickle (); +if ( use_tmp_ascii ) status = do_tmp_ascii (); else status = do_straight (); return ( status ); @@ -319,10 +319,10 @@ return ( true ); // - // wrapper usage: /path/to/python wrapper.py pickle_output_filename user_script_name [ user_script args ... ] + // wrapper usage: /path/to/python wrapper.py tmp_output_filename user_script_name [ user_script args ... ] // -bool PythonHandler::do_pickle() +bool PythonHandler::do_tmp_ascii() { @@ -330,7 +330,6 @@ int j; const int N = user_script_args.n(); ConcatString command; ConcatString path; -ConcatString pickle_path; ConcatString tmp_ascii_path; const char * tmp_dir = 0; int status; @@ -347,14 +346,13 @@ path << cs_erase << tmp_dir << '/' << tmp_base_name; -// pickle_path = make_temp_file_name(path.text(), 0); tmp_ascii_path = make_temp_file_name(path.text(), 0); tmp_ascii_path << ".txt"; command << cs_erase << user_path_to_python << ' ' // user's path to python << replace_path(write_tmp_ascii_wrapper) << ' ' // write_tmp_point.py - << tmp_ascii_path << ' ' // pickle output filename + << tmp_ascii_path << ' ' // temporary ascii output filename << user_script_filename; // user's script name for (j=0; j " + mlog << Error << "\nPythonHandler::do_tmp_ascii() -> " << "command \"" << command.text() << "\" failed ... status = " << status << "\n\n"; @@ -389,8 +387,8 @@ PyObject * obj = script.lookup_ascii(list_name); if ( ! PyList_Check(obj) ) { - mlog << Error << "\nPythonHandler::do_pickle() -> " - << "pickle object is not a list!\n\n"; + mlog << Error << "\nPythonHandler::do_tmp_ascii() -> " + << "tmp ascii object is not a list!\n\n"; exit ( 1 ); diff --git a/met/src/tools/other/ascii2nc/python_handler.h b/met/src/tools/other/ascii2nc/python_handler.h index abae8ddd5d..b0fb2ef492 100644 --- a/met/src/tools/other/ascii2nc/python_handler.h +++ b/met/src/tools/other/ascii2nc/python_handler.h @@ -50,9 +50,9 @@ class PythonHandler : public FileHandler static string getFormatString() { return "python"; } - bool use_pickle; + bool use_tmp_ascii; - ConcatString user_path_to_python; // if we're using pickle + ConcatString user_path_to_python; // if we're using temporary ascii ConcatString user_script_filename; @@ -68,15 +68,13 @@ class PythonHandler : public FileHandler virtual bool readAsciiFiles(const vector< ConcatString > &ascii_filename_list); - bool do_pickle (); - bool do_straight (); // straight-up python, no pickle + bool do_tmp_ascii(); + bool do_straight (); // straight-up python, no temporary ascii void load_python_obs(PyObject *); // python object is list of lists bool read_obs_from_script (const char * script_name, const char * variable_name); - - bool read_obs_from_pickle (const char * pickle_name, const char * variable_name); }; From 592c93714f9c9b4b8d3bcb00eadca58c2c8edd56 Mon Sep 17 00:00:00 2001 From: jprestop Date: Mon, 8 Mar 2021 18:15:41 -0700 Subject: [PATCH 064/165] Trying different options for formats (#1702) --- .readthedocs.yaml | 23 +++++++++++++++++++++++ met/docs/requirements.txt | 10 ++++++++++ 2 files changed, 33 insertions(+) create mode 100644 .readthedocs.yaml create mode 100644 met/docs/requirements.txt diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000000..e148a2aad0 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,23 @@ +# .readthedocs.yaml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Build all formats (htmlzip, pdf, epub) +#formats: all +formats: [] + +# Optionally set the version of Python and requirements required to build your +# docs +python: + version: 3.7 + install: + - requirements: met/docs/requirements.txt + +# Configuration for Sphinx documentation (this is the default documentation +# type) +sphinx: + builder: html + configuration: met/docs/conf.py \ No newline at end of file diff --git a/met/docs/requirements.txt b/met/docs/requirements.txt new file mode 100644 index 0000000000..87ac8f9656 --- /dev/null +++ b/met/docs/requirements.txt @@ -0,0 +1,10 @@ +sphinx==2.4.4 +sphinx-gallery==0.7.0 +sphinx-rtd-theme==0.4.3 +sphinxcontrib-applehelp==1.0.2 +sphinxcontrib-bibtex +sphinxcontrib-devhelp==1.0.2 +sphinxcontrib-htmlhelp==1.0.3 +sphinxcontrib-jsmath==1.0.1 +sphinxcontrib-qthelp==1.0.3 +sphinxcontrib-serializinghtml==1.1.4 From d80aafa54c59e69d63f9f97bb30c508545a4ef2f Mon Sep 17 00:00:00 2001 From: johnhg Date: Wed, 10 Mar 2021 10:56:52 -0700 Subject: [PATCH 065/165] Per #1706, add bugfix to the develop branch. Also add a new job to unit_stat_analysis.xml to test out the aggregation of the ECNT line type. This will add new unit test output and cause the NB to fail. (#1708) --- .../tools/core/stat_analysis/aggr_stat_line.cc | 1 + test/xml/unit_stat_analysis.xml | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/met/src/tools/core/stat_analysis/aggr_stat_line.cc b/met/src/tools/core/stat_analysis/aggr_stat_line.cc index db7cd98ba9..bb9819634f 100644 --- a/met/src/tools/core/stat_analysis/aggr_stat_line.cc +++ b/met/src/tools/core/stat_analysis/aggr_stat_line.cc @@ -2597,6 +2597,7 @@ void aggr_ecnt_lines(LineDataFile &f, STATAnalysisJob &job, m[key].ens_pd.var_oerr_na.add(square(cur.spread_oerr)); m[key].ens_pd.var_plus_oerr_na.add(square(cur.spread_plus_oerr)); m[key].ens_pd.wgt_na.add(cur.total); + m[key].ens_pd.skip_ba.add(false); // // Store the summary statistics diff --git a/test/xml/unit_stat_analysis.xml b/test/xml/unit_stat_analysis.xml index 0d5fa6edc4..799011f8a6 100644 --- a/test/xml/unit_stat_analysis.xml +++ b/test/xml/unit_stat_analysis.xml @@ -74,6 +74,22 @@ + + &MET_BIN;/stat_analysis + \ + -lookin &OUTPUT_DIR;/ensemble_stat/ensemble_stat_SKIP_CONST_20120410_120000V.stat \ + -job aggregate -line_type ECNT -by FCST_VAR -obs_thresh NA -vx_mask NWC,GRB \ + -dump_row &OUTPUT_DIR;/stat_analysis/AGG_ECNT_dump.stat \ + -out_stat &OUTPUT_DIR;/stat_analysis/AGG_ECNT_out.stat \ + -set_hdr VX_MASK NWC_AND_GRB \ + -v 1 + + + &OUTPUT_DIR;/stat_analysis/AGG_ECNT_dump.stat + &OUTPUT_DIR;/stat_analysis/AGG_ECNT_out.stat + + + &MET_BIN;/stat_analysis \ From 6ed8fc4fa40497da5dad10836b0738945a66ce5c Mon Sep 17 00:00:00 2001 From: johnhg Date: Wed, 10 Mar 2021 14:55:23 -0700 Subject: [PATCH 066/165] Feature 1471 python_grid (#1704) * Per #1471, defined a parse_grid_string() function in the vx_statistics library and then updated vx_data2d_python to call that function. However, this creates a circular dependency because vx_data2d_python now depends on vx_statistics. * Per #1471, because of the change in dependencies, I had to modify many, many Makefile.am files to link to the -lvx_statistics after -lvx_data2d_python. This is not great, but I didn't find a better solution. * Per #1471, add a sanity check to make sure the grid and data dimensions actually match. * Per #1471, add 3 new unit tests to demonstrate setting the python grid as a named grid, grid specification string, or a gridded data file. * Per #1471, document python grid changes in appendix F. * Per #1471, just spacing. * Per #1471, lots of Makefile.am changes to get this code to compile on kiowa. Worringly, it compiled and linked fine on my Mac laptop but not on kiowa. Must be some large differences in the linker logic. Co-authored-by: John Halley Gotway --- met/docs/Users_Guide/appendixF.rst | 30 +++++++-- met/internal_tests/basic/vx_util/Makefile.am | 30 ++++++--- .../libcode/vx_data2d_factory/Makefile.am | 11 +++- .../libcode/vx_nc_util/Makefile.am | 29 ++++++--- .../libcode/vx_tc_util/Makefile.am | 63 +++++++++++++------ .../tools/other/mode_time_domain/Makefile.am | 2 + met/scripts/python/Makefile.am | 1 + met/scripts/python/read_ascii_numpy_grid.py | 53 ++++++++++++++++ .../dataplane_from_numpy_array.cc | 39 +++++++++++- .../libcode/vx_python3_utils/python3_dict.cc | 19 ++++-- .../libcode/vx_python3_utils/python3_dict.h | 2 +- met/src/libcode/vx_statistics/apply_mask.cc | 45 +++++++++++++ met/src/libcode/vx_statistics/apply_mask.h | 2 + met/src/tools/core/ensemble_stat/Makefile.am | 1 + met/src/tools/core/grid_stat/Makefile.am | 1 + met/src/tools/core/mode/Makefile.am | 1 + met/src/tools/core/mode_analysis/Makefile.am | 13 ++-- met/src/tools/core/pcp_combine/Makefile.am | 2 + met/src/tools/core/point_stat/Makefile.am | 1 + .../tools/core/series_analysis/Makefile.am | 1 + met/src/tools/core/stat_analysis/Makefile.am | 9 +-- met/src/tools/core/wavelet_stat/Makefile.am | 1 + met/src/tools/dev_utils/Makefile.am | 1 + met/src/tools/other/ascii2nc/Makefile.am | 1 + met/src/tools/other/gen_vx_mask/Makefile.am | 2 + met/src/tools/other/grid_diag/Makefile.am | 1 + met/src/tools/other/gsi_tools/Makefile.am | 33 +++++----- met/src/tools/other/ioda2nc/Makefile.am | 1 + met/src/tools/other/lidar2nc/Makefile.am | 1 + met/src/tools/other/madis2nc/Makefile.am | 1 + met/src/tools/other/mode_graphics/Makefile.am | 1 + .../tools/other/mode_time_domain/Makefile.am | 1 + met/src/tools/other/modis_regrid/Makefile.am | 2 + met/src/tools/other/pb2nc/Makefile.am | 1 + .../tools/other/plot_data_plane/Makefile.am | 2 + .../tools/other/plot_point_obs/Makefile.am | 1 + met/src/tools/other/point2grid/Makefile.am | 1 + .../tools/other/regrid_data_plane/Makefile.am | 1 + .../tools/other/shift_data_plane/Makefile.am | 1 + met/src/tools/other/wwmca_tool/Makefile.am | 1 + .../tools/tc_utils/rmw_analysis/Makefile.am | 1 + met/src/tools/tc_utils/tc_gen/Makefile.am | 1 + met/src/tools/tc_utils/tc_pairs/Makefile.am | 1 + met/src/tools/tc_utils/tc_rmw/Makefile.am | 1 + met/src/tools/tc_utils/tc_stat/Makefile.am | 1 + test/xml/unit_python.xml | 62 ++++++++++++++++++ 46 files changed, 394 insertions(+), 82 deletions(-) create mode 100755 met/scripts/python/read_ascii_numpy_grid.py diff --git a/met/docs/Users_Guide/appendixF.rst b/met/docs/Users_Guide/appendixF.rst index e122d6a560..a5e34df338 100644 --- a/met/docs/Users_Guide/appendixF.rst +++ b/met/docs/Users_Guide/appendixF.rst @@ -65,7 +65,9 @@ The data must be loaded into a 2D NumPy array named **met_data**. In addition th 'long_name': 'FooBar', 'level': 'Surface', 'units': 'None', - + + # Define 'grid' as a string or a dictionary + 'grid': { 'type': 'Lambert Conformal', 'hemisphere': 'N', @@ -83,12 +85,32 @@ The data must be loaded into a 2D NumPy array named **met_data**. In addition th 'ny': 129, } - } + } + + +In the dictionary, valid time, initialization time, lead time and accumulation time (if any) must be indicated by strings. Valid and initialization times must be given in YYYYMMDD[_HH[MMSS]] format, and lead and accumulation times must be given in HH[MMSS] format, where the square brackets indicate optional elements. The dictionary must also include strings for the name, long_name, level, and units to describe the data. The rest of the **attrs** dictionary gives the grid size and projection information in the same format that is used in the netCDF files written out by the MET tools. Those entries are also listed below. Note that the **grid** entry in the **attrs** dictionary can either be defined as a string or as a dictionary itself. + +If specified as a string, **grid** can be defined as follows: + +• As a named grid: + +.. code-block:: none + 'grid': 'G212' + +• As a grid specification string, as described in :ref:`appendixB`: + +.. code-block:: none + + 'grid': 'lambert 185 129 12.19 -133.459 -95 40.635 6371.2 25 25 N' + +• As the path to an existing gridded data file: + +.. code-block:: none -In the dictionary, valid time, initialization time, lead time and accumulation time (if any) must be indicated by strings. Valid and initialization times must be given in YYYYMMDD[_HH[MMSS]] format, and lead and accumulation times must be given in HH[MMSS] format, where the square brackets indicate optional elements. The dictionary must also include strings for the name, long_name, level, and units to describe the data. The rest of the **attrs** dictionary gives the grid size and projection information in the same format that is used in the netCDF files written out by the MET tools. Those entries are also listed below. Note that the **grid** entry in the **attrs** dictionary is itself a dictionary. + 'grid': '/path/to/sample_data.grib' -The supported grid **type** strings are described below: +When specified as a dictionary, the contents of the **grid** dictionary vary based on the grid **type** string. The entries for the supported grid types are described below: • **Lambert Conformal** grid dictionary entries: diff --git a/met/internal_tests/basic/vx_util/Makefile.am b/met/internal_tests/basic/vx_util/Makefile.am index 364b846a0b..96afff9e82 100644 --- a/met/internal_tests/basic/vx_util/Makefile.am +++ b/met/internal_tests/basic/vx_util/Makefile.am @@ -82,18 +82,30 @@ endif test_ascii_header_SOURCES = test_ascii_header.cc test_ascii_header_CPPFLAGS = ${MET_CPPFLAGS} test_ascii_header_LDFLAGS = -L. ${MET_LDFLAGS} -test_ascii_header_LDADD = -lvx_util \ +test_ascii_header_LDADD = -lvx_stat_out \ + -lvx_statistics \ + -lvx_shapedata \ + -lvx_gsl_prob \ + -lvx_analysis_util \ + -lvx_shapedata \ + -lvx_util \ + $(PYTHON_LIBS) \ + -lvx_statistics \ + -lvx_data2d_factory \ + -lvx_data2d_nc_met \ + -lvx_data2d_nc_pinterp \ + $(PYTHON_LIBS) \ + -lvx_data2d_nccf \ + -lvx_data2d_grib $(GRIB2_LIBS) \ + -lvx_data2d \ + -lvx_nc_util \ + -lvx_regrid \ + -lvx_grid \ -lvx_config \ -lvx_gsl_prob \ -lvx_cal \ -lvx_util \ -lvx_math \ + -lvx_color \ -lvx_log \ - -lgsl -lgslcblas - -if ENABLE_PYTHON -test_ascii_header_LDADD += $(MET_PYTHON_LD) -lvx_data2d_python -lvx_python3_utils -lvx_data2d_python -lvx_python3_utils -lvx_math -test_ascii_header_LDADD += -lvx_data2d_python -lvx_python3_utils -lvx_data2d_python -lvx_python3_utils -test_ascii_header_LDADD += -lvx_math -lvx_grid -lvx_util -lvx_data2d -lvx_config -lvx_gsl_prob -lvx_cal -lvx_math -lvx_util -endif - + -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas -lvx_util diff --git a/met/internal_tests/libcode/vx_data2d_factory/Makefile.am b/met/internal_tests/libcode/vx_data2d_factory/Makefile.am index b1d31b3aa4..04a31968c0 100644 --- a/met/internal_tests/libcode/vx_data2d_factory/Makefile.am +++ b/met/internal_tests/libcode/vx_data2d_factory/Makefile.am @@ -25,20 +25,27 @@ test_is_grib_LDADD = -lvx_data2d_factory \ test_factory_SOURCES = test_factory.cc test_factory_CPPFLAGS = ${MET_CPPFLAGS} test_factory_LDFLAGS = -L. ${MET_LDFLAGS} -test_factory_LDADD = -lvx_data2d_factory \ +test_factory_LDADD = -lvx_stat_out \ + -lvx_statistics \ + -lvx_shapedata \ + -lvx_gsl_prob \ + -lvx_analysis_util \ + -lvx_data2d_factory \ -lvx_data2d_nc_met \ -lvx_data2d_grib $(GRIB2_LIBS) \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_util \ + -lvx_regrid \ -lvx_grid \ -lvx_config \ -lvx_gsl_prob \ + -lvx_cal \ -lvx_util \ -lvx_math \ -lvx_color \ - -lvx_cal \ -lvx_log \ -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas diff --git a/met/internal_tests/libcode/vx_nc_util/Makefile.am b/met/internal_tests/libcode/vx_nc_util/Makefile.am index 13bf6c2bc0..ff40235a5c 100644 --- a/met/internal_tests/libcode/vx_nc_util/Makefile.am +++ b/met/internal_tests/libcode/vx_nc_util/Makefile.am @@ -19,21 +19,32 @@ noinst_PROGRAMS = test_pressure_levels test_pressure_levels_SOURCES = test_pressure_levels.cc test_pressure_levels_CPPFLAGS = ${MET_CPPFLAGS} test_pressure_levels_LDFLAGS = -L. ${MET_LDFLAGS} -test_pressure_levels_LDADD = -lvx_tc_util \ +test_pressure_levels_LDADD = -lvx_stat_out \ + -lvx_statistics \ + -lvx_shapedata \ + -lvx_gsl_prob \ + -lvx_analysis_util \ + -lvx_tc_util \ + -lvx_shapedata \ + -lvx_util \ + $(PYTHON_LIBS) \ + -lvx_statistics \ + -lvx_data2d_factory \ + -lvx_data2d_nc_met \ + -lvx_data2d_nc_pinterp \ + $(PYTHON_LIBS) \ + -lvx_data2d_nccf \ + -lvx_data2d_grib $(GRIB2_LIBS) \ -lvx_data2d \ -lvx_nc_util \ + -lvx_regrid \ + -lvx_grid \ -lvx_config \ -lvx_gsl_prob \ -lvx_cal \ -lvx_util \ -lvx_math \ + -lvx_color \ -lvx_log \ - -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas + -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas -lvx_util -if ENABLE_PYTHON -test_pressure_levels_LDADD += $(MET_PYTHON_LD) -test_pressure_levels_LDADD += -lvx_data2d_python -lvx_python3_utils -test_pressure_levels_LDADD += -lvx_data2d_python -lvx_python3_utils -test_pressure_levels_LDADD += -lvx_grid -lvx_util -lvx_config -test_pressure_levels_LDADD += -lvx_data2d -lvx_gsl_prob -lvx_util -lvx_math -lvx_cal -lvx_config -endif diff --git a/met/internal_tests/libcode/vx_tc_util/Makefile.am b/met/internal_tests/libcode/vx_tc_util/Makefile.am index 2b71de8a9f..a5fc96c5d0 100644 --- a/met/internal_tests/libcode/vx_tc_util/Makefile.am +++ b/met/internal_tests/libcode/vx_tc_util/Makefile.am @@ -20,39 +20,64 @@ noinst_PROGRAMS = test_read \ test_read_SOURCES = test_read.cc test_read_CPPFLAGS = ${MET_CPPFLAGS} test_read_LDFLAGS = -L. ${MET_LDFLAGS} -test_read_LDADD = -lvx_tc_util \ +test_read_LDADD = -lvx_stat_out \ + -lvx_statistics \ + -lvx_shapedata \ + -lvx_gsl_prob \ + -lvx_analysis_util \ + -lvx_tc_util \ + -lvx_shapedata \ + -lvx_util \ + $(PYTHON_LIBS) \ + -lvx_statistics \ + -lvx_data2d_factory \ + -lvx_data2d_nc_met \ + -lvx_data2d_nc_pinterp \ + $(PYTHON_LIBS) \ + -lvx_data2d_nccf \ + -lvx_data2d_grib $(GRIB2_LIBS) \ + -lvx_data2d \ + -lvx_nc_util \ + -lvx_regrid \ + -lvx_grid \ -lvx_config \ -lvx_gsl_prob \ -lvx_cal \ -lvx_util \ -lvx_math \ + -lvx_color \ -lvx_log \ - -lgsl -lgslcblas - -if ENABLE_PYTHON -test_read_LDADD += $(MET_PYTHON_LD) -test_read_LDADD += -lvx_data2d_python -lvx_python3_utils -test_read_LDADD += -lvx_data2d_python -lvx_python3_utils -test_read_LDADD += -lvx_grid -lvx_util -lvx_config -test_read_LDADD += -lvx_data2d -lvx_gsl_prob -lvx_util -lvx_math -lvx_cal -lvx_config -endif + -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas -lvx_util test_read_prob_SOURCES = test_read_prob.cc test_read_prob_CPPFLAGS = ${MET_CPPFLAGS} test_read_prob_LDFLAGS = -L. ${MET_LDFLAGS} -test_read_prob_LDADD = -lvx_tc_util \ +test_read_prob_LDADD = -lvx_stat_out \ + -lvx_statistics \ + -lvx_shapedata \ + -lvx_gsl_prob \ + -lvx_analysis_util \ + -lvx_tc_util \ + -lvx_shapedata \ + -lvx_util \ + $(PYTHON_LIBS) \ + -lvx_statistics \ + -lvx_data2d_factory \ + -lvx_data2d_nc_met \ + -lvx_data2d_nc_pinterp \ + $(PYTHON_LIBS) \ + -lvx_data2d_nccf \ + -lvx_data2d_grib $(GRIB2_LIBS) \ + -lvx_data2d \ + -lvx_nc_util \ + -lvx_regrid \ + -lvx_grid \ -lvx_config \ -lvx_gsl_prob \ -lvx_cal \ -lvx_util \ -lvx_math \ + -lvx_color \ -lvx_log \ - -lgsl -lgslcblas + -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas -lvx_util -if ENABLE_PYTHON -test_read_prob_LDADD += $(MET_PYTHON_LD) -test_read_prob_LDADD += -lvx_data2d_python -lvx_python3_utils -test_read_prob_LDADD += -lvx_data2d_python -lvx_python3_utils -test_read_prob_LDADD += -lvx_grid -lvx_util -lvx_config -test_read_prob_LDADD += -lvx_data2d -lvx_gsl_prob -lvx_util -lvx_math -lvx_cal -lvx_config -endif diff --git a/met/internal_tests/tools/other/mode_time_domain/Makefile.am b/met/internal_tests/tools/other/mode_time_domain/Makefile.am index 2b62114046..693d9de44c 100644 --- a/met/internal_tests/tools/other/mode_time_domain/Makefile.am +++ b/met/internal_tests/tools/other/mode_time_domain/Makefile.am @@ -56,6 +56,7 @@ test_velocity_LDADD = \ -lvx_data2d_grib $(GRIB2_LIBS) \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ + -lvx_statistics \ -lvx_data2d_nccf \ -lvx_data2d \ -lvx_nc_util \ @@ -69,3 +70,4 @@ test_velocity_LDADD = \ -lvx_color \ -lvx_log \ -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas -lz + diff --git a/met/scripts/python/Makefile.am b/met/scripts/python/Makefile.am index b980d2e4ab..78dc7d88bc 100644 --- a/met/scripts/python/Makefile.am +++ b/met/scripts/python/Makefile.am @@ -27,6 +27,7 @@ pythonscriptsdir = $(pkgdatadir)/python pythonscripts_DATA = \ read_ascii_numpy.py \ + read_ascii_numpy_grid.py \ read_ascii_xarray.py \ read_ascii_point.py \ read_ascii_mpr.py diff --git a/met/scripts/python/read_ascii_numpy_grid.py b/met/scripts/python/read_ascii_numpy_grid.py new file mode 100755 index 0000000000..88d868a2ad --- /dev/null +++ b/met/scripts/python/read_ascii_numpy_grid.py @@ -0,0 +1,53 @@ +from __future__ import print_function + +import numpy as np +import os +import sys + +########################################### + +print('Python Script:\t', sys.argv[0]) + + ## + ## input file specified on the command line + ## load the data into the numpy array + ## + +if len(sys.argv) == 3: + # Read the input file as the first argument + input_file = os.path.expandvars(sys.argv[1]) + data_name = sys.argv[2] + try: + # Print some output to verify that this script ran + print("Input File:\t" + repr(input_file)) + print("Data Name:\t" + repr(data_name)) + met_data = np.loadtxt(input_file) + print("Data Shape:\t" + repr(met_data.shape)) + print("Data Type:\t" + repr(met_data.dtype)) + except NameError: + print("Can't find the input file") +else: + print("ERROR: read_ascii_numpy.py -> Must specify exactly one input file and a name for the data.") + sys.exit(1) + +########################################### + + ## + ## create the metadata dictionary + ## + +attrs = { + + 'valid': '20050807_120000', + 'init': '20050807_000000', + 'lead': '120000', + 'accum': '120000', + + 'name': data_name, + 'long_name': data_name + '_word', + 'level': 'Surface', + 'units': 'None', + 'grid': os.path.expandvars(os.getenv('PYTHON_GRID')) +} + +print("Attributes:\t" + repr(attrs)) diff --git a/met/src/libcode/vx_data2d_python/dataplane_from_numpy_array.cc b/met/src/libcode/vx_data2d_python/dataplane_from_numpy_array.cc index 7462c20829..61f997a267 100644 --- a/met/src/libcode/vx_data2d_python/dataplane_from_numpy_array.cc +++ b/met/src/libcode/vx_data2d_python/dataplane_from_numpy_array.cc @@ -12,6 +12,7 @@ #include "string.h" #include "vx_python3_utils.h" +#include "vx_statistics.h" #include "check_endian.h" #include "data_plane.h" @@ -219,9 +220,43 @@ dp_out.set_accum(t); //////////////////// -PyObject * py_grid = attrs.lookup_dict("grid"); + // + // attempt to parse "grid" as a string + // + +s = attrs.lookup_string("grid", false); + +if ( s.nonempty() ) { + + grid_out = parse_grid_string(s.c_str()); + +} +else { + + // + // otherwise, parse "grid" as a dictionary + // + + PyObject * py_grid = attrs.lookup_dict("grid"); -grid_from_python_dict(Python3_Dict(py_grid), grid_out); + grid_from_python_dict(Python3_Dict(py_grid), grid_out); + +} + + // + // make sure the grid and data dimensions match + // + +if ( grid_out.nx() != Nx || grid_out.ny() != Ny ) { + + mlog << Error << "\ndataplane_from_numpy_array() -> " + << "the grid dimensions (" << grid_out.nx() << ", " + << grid_out.ny() << ") and data dimensions (" << Nx + << ", " << Ny << ") do not match!\n\n"; + + exit ( 1 ); + +} //////////////////// diff --git a/met/src/libcode/vx_python3_utils/python3_dict.cc b/met/src/libcode/vx_python3_utils/python3_dict.cc index 9f6036f801..6d38599aa4 100644 --- a/met/src/libcode/vx_python3_utils/python3_dict.cc +++ b/met/src/libcode/vx_python3_utils/python3_dict.cc @@ -220,7 +220,7 @@ return ( t ); //////////////////////////////////////////////////////////////////////// -ConcatString Python3_Dict::lookup_string(const char * key) const +ConcatString Python3_Dict::lookup_string(const char * key, bool error_out) const { @@ -240,14 +240,23 @@ if ( ! a ) { if ( ! PyUnicode_Check(a) ) { - mlog << Error << "\nPython3_Dict::lookup_string(const char * key) -> " - << "value for key \"" << key << "\" not a character string\n\n"; + if ( error_out ) { - exit ( 1 ); + mlog << Error << "\nPython3_Dict::lookup_string(const char * key) -> " + << "value for key \"" << key << "\" not a character string\n\n"; + + exit ( 1 ); + + } + + s.clear(); } +else { -s = PyUnicode_AsUTF8(a); + s = PyUnicode_AsUTF8(a); + +} return ( s ); diff --git a/met/src/libcode/vx_python3_utils/python3_dict.h b/met/src/libcode/vx_python3_utils/python3_dict.h index 7ce77d7b05..34cfd803de 100644 --- a/met/src/libcode/vx_python3_utils/python3_dict.h +++ b/met/src/libcode/vx_python3_utils/python3_dict.h @@ -68,7 +68,7 @@ class Python3_Dict { int lookup_int (const char * key) const; double lookup_double (const char * key) const; - ConcatString lookup_string (const char * key) const; + ConcatString lookup_string (const char * key, bool error_out = true) const; PyObject * lookup_dict (const char * key) const; PyObject * lookup_list (const char * key) const; diff --git a/met/src/libcode/vx_statistics/apply_mask.cc b/met/src/libcode/vx_statistics/apply_mask.cc index f5ea562630..b97e9272d3 100644 --- a/met/src/libcode/vx_statistics/apply_mask.cc +++ b/met/src/libcode/vx_statistics/apply_mask.cc @@ -84,6 +84,51 @@ Grid parse_vx_grid(const RegridInfo info, const Grid *fgrid, const Grid *ogrid) //////////////////////////////////////////////////////////////////////// +Grid parse_grid_string(const char *grid_str) { + Grid grid; + StringArray sa; + + // Parse as a white-space separated string + sa.parse_wsss(grid_str); + + // Search for a named grid + if(sa.n() == 1 && find_grid_by_name(sa[0].c_str(), grid)) { + mlog << Debug(3) << "Use the grid named \"" + << grid_str << "\".\n"; + } + // Parse grid definition + else if(sa.n() > 1 && parse_grid_def(sa, grid)) { + mlog << Debug(3) << "Use the grid defined by string \"" + << grid_str << "\".\n"; + } + // Extract the grid from a gridded data file + else { + mlog << Debug(3) << "Use the grid defined by file \"" + << grid_str << "\".\n"; + + Met2dDataFileFactory m_factory; + Met2dDataFile *met_ptr = (Met2dDataFile *) 0; + + // Open the data file + if(!(met_ptr = m_factory.new_met_2d_data_file(grid_str))) { + mlog << Error << "\nparse_grid_string() -> " + << "can't open file \"" << grid_str + << "\"\n\n"; + exit(1); + } + + // Store the grid + grid = met_ptr->grid(); + + // Cleanup + if(met_ptr) { delete met_ptr; met_ptr = 0; } + } + + return(grid); +} + +//////////////////////////////////////////////////////////////////////// + void parse_grid_weight(const Grid &grid, const GridWeightType t, DataPlane &wgt_dp) { int x, y; diff --git a/met/src/libcode/vx_statistics/apply_mask.h b/met/src/libcode/vx_statistics/apply_mask.h index 0ac9aac85e..5e62500d73 100644 --- a/met/src/libcode/vx_statistics/apply_mask.h +++ b/met/src/libcode/vx_statistics/apply_mask.h @@ -29,6 +29,8 @@ static const char poly_str_delim[] = "{}"; extern Grid parse_vx_grid(const RegridInfo, const Grid *, const Grid *); +extern Grid parse_grid_string(const char *); + extern void parse_grid_weight(const Grid &, const GridWeightType, DataPlane &); diff --git a/met/src/tools/core/ensemble_stat/Makefile.am b/met/src/tools/core/ensemble_stat/Makefile.am index d7cd14c178..172302f19a 100644 --- a/met/src/tools/core/ensemble_stat/Makefile.am +++ b/met/src/tools/core/ensemble_stat/Makefile.am @@ -26,6 +26,7 @@ ensemble_stat_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_obs \ -lvx_nc_util \ diff --git a/met/src/tools/core/grid_stat/Makefile.am b/met/src/tools/core/grid_stat/Makefile.am index 8db13c50bf..e1451258f0 100644 --- a/met/src/tools/core/grid_stat/Makefile.am +++ b/met/src/tools/core/grid_stat/Makefile.am @@ -26,6 +26,7 @@ grid_stat_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_util \ -lvx_regrid \ diff --git a/met/src/tools/core/mode/Makefile.am b/met/src/tools/core/mode/Makefile.am index b3260abef1..662dee58ef 100644 --- a/met/src/tools/core/mode/Makefile.am +++ b/met/src/tools/core/mode/Makefile.am @@ -39,6 +39,7 @@ mode_LDADD = -lvx_pxm \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_util \ -lvx_regrid \ diff --git a/met/src/tools/core/mode_analysis/Makefile.am b/met/src/tools/core/mode_analysis/Makefile.am index 7305ea30a9..182faf29d1 100644 --- a/met/src/tools/core/mode_analysis/Makefile.am +++ b/met/src/tools/core/mode_analysis/Makefile.am @@ -8,10 +8,6 @@ MAINTAINERCLEANFILES = Makefile.in include ${top_srcdir}/Make-include -if ENABLE_PYTHON -LDFLAGS += -lvx_python3_utils -endif - # The program bin_PROGRAMS = mode_analysis @@ -25,6 +21,9 @@ mode_analysis_LDADD = -lvx_stat_out \ -lvx_gsl_prob \ -lvx_analysis_util \ -lvx_shapedata \ + -lvx_util \ + $(PYTHON_LIBS) \ + -lvx_statistics \ -lvx_data2d_factory \ -lvx_data2d_nc_met \ -lvx_data2d_nc_pinterp \ @@ -33,6 +32,7 @@ mode_analysis_LDADD = -lvx_stat_out \ -lvx_data2d_grib $(GRIB2_LIBS) \ -lvx_data2d \ -lvx_nc_util \ + -lvx_regrid \ -lvx_grid \ -lvx_config \ -lvx_gsl_prob \ @@ -43,9 +43,4 @@ mode_analysis_LDADD = -lvx_stat_out \ -lvx_log \ -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas -lvx_util -if ENABLE_PYTHON -mode_analysis_LDADD += $(MET_PYTHON_LD) -lvx_data2d_python -lvx_python3_utils -lvx_data2d_python -lvx_python3_utils -lvx_util -endif - - EXTRA_DIST = config_to_att.h diff --git a/met/src/tools/core/pcp_combine/Makefile.am b/met/src/tools/core/pcp_combine/Makefile.am index 1a07c63b71..0fa6d2ecc4 100644 --- a/met/src/tools/core/pcp_combine/Makefile.am +++ b/met/src/tools/core/pcp_combine/Makefile.am @@ -20,8 +20,10 @@ pcp_combine_LDADD = -lvx_data2d_factory \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_util \ + -lvx_regrid \ -lvx_grid \ -lvx_config \ -lvx_cal \ diff --git a/met/src/tools/core/point_stat/Makefile.am b/met/src/tools/core/point_stat/Makefile.am index ef64c96fc8..02dbac944a 100644 --- a/met/src/tools/core/point_stat/Makefile.am +++ b/met/src/tools/core/point_stat/Makefile.am @@ -26,6 +26,7 @@ point_stat_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_obs \ -lvx_nc_util \ diff --git a/met/src/tools/core/series_analysis/Makefile.am b/met/src/tools/core/series_analysis/Makefile.am index 79a33460f0..26352e71eb 100644 --- a/met/src/tools/core/series_analysis/Makefile.am +++ b/met/src/tools/core/series_analysis/Makefile.am @@ -26,6 +26,7 @@ series_analysis_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_util \ -lvx_regrid \ diff --git a/met/src/tools/core/stat_analysis/Makefile.am b/met/src/tools/core/stat_analysis/Makefile.am index 909143d9f3..60ca332858 100644 --- a/met/src/tools/core/stat_analysis/Makefile.am +++ b/met/src/tools/core/stat_analysis/Makefile.am @@ -8,19 +8,13 @@ MAINTAINERCLEANFILES = Makefile.in include ${top_srcdir}/Make-include -OPT_PYTHON_SOURCES = - -if ENABLE_PYTHON -LDFLAGS += -lvx_python3_utils -endif - # The program bin_PROGRAMS = stat_analysis stat_analysis_SOURCES = stat_analysis.cc \ aggr_stat_line.cc \ parse_stat_line.cc \ - stat_analysis_job.cc $(OPT_PYTHON_SOURCES) + stat_analysis_job.cc stat_analysis_CPPFLAGS = ${MET_CPPFLAGS} stat_analysis_LDFLAGS = ${MET_LDFLAGS} stat_analysis_LDADD = -lvx_stat_out \ @@ -34,6 +28,7 @@ stat_analysis_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_util \ -lvx_regrid \ diff --git a/met/src/tools/core/wavelet_stat/Makefile.am b/met/src/tools/core/wavelet_stat/Makefile.am index 4f6759db27..25150834a5 100644 --- a/met/src/tools/core/wavelet_stat/Makefile.am +++ b/met/src/tools/core/wavelet_stat/Makefile.am @@ -32,6 +32,7 @@ wavelet_stat_LDADD = -lvx_pxm \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_util \ -lvx_regrid \ diff --git a/met/src/tools/dev_utils/Makefile.am b/met/src/tools/dev_utils/Makefile.am index 03a83fc690..9240cb48bd 100644 --- a/met/src/tools/dev_utils/Makefile.am +++ b/met/src/tools/dev_utils/Makefile.am @@ -127,6 +127,7 @@ gen_climo_bin_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_util \ -lvx_regrid \ diff --git a/met/src/tools/other/ascii2nc/Makefile.am b/met/src/tools/other/ascii2nc/Makefile.am index 3b4f21b46a..7fce7b81ba 100644 --- a/met/src/tools/other/ascii2nc/Makefile.am +++ b/met/src/tools/other/ascii2nc/Makefile.am @@ -39,6 +39,7 @@ ascii2nc_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ -lvx_data2d_nccf \ $(PYTHON_LIBS) \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_obs \ -lvx_nc_util \ diff --git a/met/src/tools/other/gen_vx_mask/Makefile.am b/met/src/tools/other/gen_vx_mask/Makefile.am index 2b52cb7cb6..f8b773183b 100644 --- a/met/src/tools/other/gen_vx_mask/Makefile.am +++ b/met/src/tools/other/gen_vx_mask/Makefile.am @@ -24,6 +24,7 @@ gen_vx_mask_LDADD = -lvx_shapedata \ -lvx_data2d_nc_met \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ + -lvx_statistics \ -lvx_gis \ -lvx_nc_util \ -lvx_data2d \ @@ -39,6 +40,7 @@ gen_vx_mask_LDADD = -lvx_shapedata \ -lvx_stat_out \ -lvx_statistics \ -lvx_gsl_prob \ + -lvx_regrid \ -lvx_grid \ -lvx_config \ -lvx_gsl_prob \ diff --git a/met/src/tools/other/grid_diag/Makefile.am b/met/src/tools/other/grid_diag/Makefile.am index 877772a982..1d30d1bce4 100644 --- a/met/src/tools/other/grid_diag/Makefile.am +++ b/met/src/tools/other/grid_diag/Makefile.am @@ -26,6 +26,7 @@ grid_diag_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_util \ -lvx_regrid \ diff --git a/met/src/tools/other/gsi_tools/Makefile.am b/met/src/tools/other/gsi_tools/Makefile.am index 40c550a1c1..1c94d4be2b 100644 --- a/met/src/tools/other/gsi_tools/Makefile.am +++ b/met/src/tools/other/gsi_tools/Makefile.am @@ -8,10 +8,6 @@ MAINTAINERCLEANFILES = Makefile.in include ${top_srcdir}/Make-include -if ENABLE_PYTHON -LDFLAGS += -lvx_data2d_python -lvx_python3_utils -endif - # The programs bin_PROGRAMS = gsid2mpr \ @@ -36,28 +32,31 @@ gsid2mpr_CPPFLAGS = ${MET_CPPFLAGS} gsid2mpr_LDFLAGS = ${MET_LDFLAGS} gsid2mpr_LDADD = -lvx_stat_out \ -lvx_statistics \ + -lvx_shapedata \ -lvx_gsl_prob \ + -lvx_analysis_util \ + -lvx_shapedata \ + -lvx_util \ + $(PYTHON_LIBS) \ + -lvx_statistics \ -lvx_data2d_factory \ -lvx_data2d_nc_met \ - -lvx_data2d_grib $(GRIB2_LIBS) \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_data2d_grib $(GRIB2_LIBS) \ -lvx_data2d \ -lvx_nc_util \ -lvx_regrid \ -lvx_grid \ -lvx_config \ + -lvx_gsl_prob \ -lvx_cal \ -lvx_util \ -lvx_math \ -lvx_color \ -lvx_log \ - -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas - -if ENABLE_PYTHON -gsid2mpr_LDADD += $(MET_PYTHON_LD) -lvx_data2d_python -lvx_python3_utils -lvx_data2d_python -lvx_python3_utils -endif + -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas -lvx_util gsidens2orank_SOURCES = gsidens2orank.h \ gsi_record.h \ @@ -78,25 +77,29 @@ gsidens2orank_CPPFLAGS = ${MET_CPPFLAGS} gsidens2orank_LDFLAGS = ${MET_LDFLAGS} gsidens2orank_LDADD = -lvx_stat_out \ -lvx_statistics \ + -lvx_shapedata \ -lvx_gsl_prob \ + -lvx_analysis_util \ + -lvx_shapedata \ + -lvx_util \ + $(PYTHON_LIBS) \ + -lvx_statistics \ -lvx_data2d_factory \ -lvx_data2d_nc_met \ - -lvx_data2d_grib $(GRIB2_LIBS) \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_data2d_grib $(GRIB2_LIBS) \ -lvx_data2d \ -lvx_nc_util \ -lvx_regrid \ -lvx_grid \ -lvx_config \ + -lvx_gsl_prob \ -lvx_cal \ -lvx_util \ -lvx_math \ -lvx_color \ -lvx_log \ - -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas + -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas -lvx_util -if ENABLE_PYTHON -gsidens2orank_LDADD += $(MET_PYTHON_LD) -lvx_data2d_python -lvx_python3_utils -lvx_data2d_python -lvx_python3_utils -endif diff --git a/met/src/tools/other/ioda2nc/Makefile.am b/met/src/tools/other/ioda2nc/Makefile.am index e4067043df..83d74ba5d1 100644 --- a/met/src/tools/other/ioda2nc/Makefile.am +++ b/met/src/tools/other/ioda2nc/Makefile.am @@ -26,6 +26,7 @@ ioda2nc_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ -lvx_data2d_nccf \ $(PYTHON_LIBS) \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_obs \ -lvx_nc_util \ diff --git a/met/src/tools/other/lidar2nc/Makefile.am b/met/src/tools/other/lidar2nc/Makefile.am index 7bf377b10a..118ea7efd4 100644 --- a/met/src/tools/other/lidar2nc/Makefile.am +++ b/met/src/tools/other/lidar2nc/Makefile.am @@ -26,6 +26,7 @@ lidar2nc_LDADD = -lvx_shapedata \ -lvx_data2d_nc_met \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_nc_obs \ -lvx_nc_util \ -lvx_data2d \ diff --git a/met/src/tools/other/madis2nc/Makefile.am b/met/src/tools/other/madis2nc/Makefile.am index f83950661e..e85cf3c975 100644 --- a/met/src/tools/other/madis2nc/Makefile.am +++ b/met/src/tools/other/madis2nc/Makefile.am @@ -25,6 +25,7 @@ madis2nc_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ -lvx_data2d_nccf \ $(PYTHON_LIBS) \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_obs \ -lvx_nc_util \ diff --git a/met/src/tools/other/mode_graphics/Makefile.am b/met/src/tools/other/mode_graphics/Makefile.am index b360dbfb55..fc5e1f530b 100644 --- a/met/src/tools/other/mode_graphics/Makefile.am +++ b/met/src/tools/other/mode_graphics/Makefile.am @@ -27,6 +27,7 @@ plot_mode_field_LDADD = -lvx_config \ -lvx_plot_util \ -lvx_data2d_nc_met \ $(PYTHON_LIBS) \ + -lvx_statistics \ -lvx_grid \ -lvx_nc_util \ -lvx_ps \ diff --git a/met/src/tools/other/mode_time_domain/Makefile.am b/met/src/tools/other/mode_time_domain/Makefile.am index 9b5d9df97f..fde9fbe977 100644 --- a/met/src/tools/other/mode_time_domain/Makefile.am +++ b/met/src/tools/other/mode_time_domain/Makefile.am @@ -55,6 +55,7 @@ mtd_LDADD = -lvx_pxm \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_util \ -lvx_regrid \ diff --git a/met/src/tools/other/modis_regrid/Makefile.am b/met/src/tools/other/modis_regrid/Makefile.am index 843d226bbc..e63afad3f0 100644 --- a/met/src/tools/other/modis_regrid/Makefile.am +++ b/met/src/tools/other/modis_regrid/Makefile.am @@ -36,8 +36,10 @@ modis_regrid_LDADD = -lvx_pxm \ -lvx_data2d_grib $(GRIB2_LIBS) \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_util \ + -lvx_regrid \ -lvx_grid \ -lvx_config \ -lvx_gsl_prob \ diff --git a/met/src/tools/other/pb2nc/Makefile.am b/met/src/tools/other/pb2nc/Makefile.am index 40ed36c2d2..6eb653a1d0 100644 --- a/met/src/tools/other/pb2nc/Makefile.am +++ b/met/src/tools/other/pb2nc/Makefile.am @@ -42,6 +42,7 @@ pb2nc_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ -lvx_data2d_nccf \ $(PYTHON_LIBS) \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_obs \ -lvx_nc_util \ diff --git a/met/src/tools/other/plot_data_plane/Makefile.am b/met/src/tools/other/plot_data_plane/Makefile.am index 5470661e67..3997aaf742 100644 --- a/met/src/tools/other/plot_data_plane/Makefile.am +++ b/met/src/tools/other/plot_data_plane/Makefile.am @@ -20,6 +20,7 @@ plot_data_plane_LDADD = -lvx_data2d_factory \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_nc_util \ -lvx_data2d \ -lvx_plot_util \ @@ -30,6 +31,7 @@ plot_data_plane_LDADD = -lvx_data2d_factory \ -lvx_afm \ -lvx_nav \ -lvx_gnomon \ + -lvx_regrid \ -lvx_grid \ -lvx_config \ -lvx_gsl_prob \ diff --git a/met/src/tools/other/plot_point_obs/Makefile.am b/met/src/tools/other/plot_point_obs/Makefile.am index 677a41a5b4..77e7c1711d 100644 --- a/met/src/tools/other/plot_point_obs/Makefile.am +++ b/met/src/tools/other/plot_point_obs/Makefile.am @@ -40,6 +40,7 @@ plot_point_obs_LDADD = -lvx_statistics \ -lvx_cal \ -lvx_util \ $(PYTHON_LIBS) \ + -lvx_statistics \ -lvx_math \ -lvx_color \ -lvx_log \ diff --git a/met/src/tools/other/point2grid/Makefile.am b/met/src/tools/other/point2grid/Makefile.am index 054a049df7..ccd38b1ac5 100644 --- a/met/src/tools/other/point2grid/Makefile.am +++ b/met/src/tools/other/point2grid/Makefile.am @@ -22,6 +22,7 @@ point2grid_LDADD = -lvx_statistics \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_nc_util \ -lvx_data2d \ -lvx_gnomon \ diff --git a/met/src/tools/other/regrid_data_plane/Makefile.am b/met/src/tools/other/regrid_data_plane/Makefile.am index 8c28e3f93f..32bbc91cea 100644 --- a/met/src/tools/other/regrid_data_plane/Makefile.am +++ b/met/src/tools/other/regrid_data_plane/Makefile.am @@ -21,6 +21,7 @@ regrid_data_plane_LDADD = -lvx_statistics \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_nc_util \ -lvx_data2d \ -lvx_gnomon \ diff --git a/met/src/tools/other/shift_data_plane/Makefile.am b/met/src/tools/other/shift_data_plane/Makefile.am index 67e02fcfea..af2d6875b8 100644 --- a/met/src/tools/other/shift_data_plane/Makefile.am +++ b/met/src/tools/other/shift_data_plane/Makefile.am @@ -21,6 +21,7 @@ shift_data_plane_LDADD = -lvx_statistics \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_nc_util \ -lvx_data2d \ -lvx_gnomon \ diff --git a/met/src/tools/other/wwmca_tool/Makefile.am b/met/src/tools/other/wwmca_tool/Makefile.am index 7972849bf4..ba4e6d5e69 100644 --- a/met/src/tools/other/wwmca_tool/Makefile.am +++ b/met/src/tools/other/wwmca_tool/Makefile.am @@ -44,6 +44,7 @@ wwmca_regrid_LDADD = -lvx_pxm \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_util \ -lvx_regrid \ diff --git a/met/src/tools/tc_utils/rmw_analysis/Makefile.am b/met/src/tools/tc_utils/rmw_analysis/Makefile.am index eca92181cd..61223d7f69 100644 --- a/met/src/tools/tc_utils/rmw_analysis/Makefile.am +++ b/met/src/tools/tc_utils/rmw_analysis/Makefile.am @@ -26,6 +26,7 @@ rmw_analysis_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_util \ -lvx_regrid \ diff --git a/met/src/tools/tc_utils/tc_gen/Makefile.am b/met/src/tools/tc_utils/tc_gen/Makefile.am index 4865e6a517..281811cd88 100644 --- a/met/src/tools/tc_utils/tc_gen/Makefile.am +++ b/met/src/tools/tc_utils/tc_gen/Makefile.am @@ -27,6 +27,7 @@ tc_gen_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_util \ -lvx_regrid \ diff --git a/met/src/tools/tc_utils/tc_pairs/Makefile.am b/met/src/tools/tc_utils/tc_pairs/Makefile.am index 56d6239e2f..d5d4436698 100644 --- a/met/src/tools/tc_utils/tc_pairs/Makefile.am +++ b/met/src/tools/tc_utils/tc_pairs/Makefile.am @@ -29,6 +29,7 @@ tc_pairs_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_util \ -lvx_regrid \ diff --git a/met/src/tools/tc_utils/tc_rmw/Makefile.am b/met/src/tools/tc_utils/tc_rmw/Makefile.am index 5aed64e561..43d075577c 100644 --- a/met/src/tools/tc_utils/tc_rmw/Makefile.am +++ b/met/src/tools/tc_utils/tc_rmw/Makefile.am @@ -26,6 +26,7 @@ tc_rmw_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_util \ -lvx_regrid \ diff --git a/met/src/tools/tc_utils/tc_stat/Makefile.am b/met/src/tools/tc_utils/tc_stat/Makefile.am index 413d2a5141..06b56431ce 100644 --- a/met/src/tools/tc_utils/tc_stat/Makefile.am +++ b/met/src/tools/tc_utils/tc_stat/Makefile.am @@ -29,6 +29,7 @@ tc_stat_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ $(PYTHON_LIBS) \ -lvx_data2d_nccf \ + -lvx_statistics \ -lvx_data2d \ -lvx_nc_util \ -lvx_regrid \ diff --git a/test/xml/unit_python.xml b/test/xml/unit_python.xml index 58936ecbad..c204534f05 100644 --- a/test/xml/unit_python.xml +++ b/test/xml/unit_python.xml @@ -19,6 +19,68 @@ &TEST_DIR; true + + + &MET_BIN;/plot_data_plane + + PYTHON_GRID G212 + + \ + PYTHON_NUMPY \ + &OUTPUT_DIR;/python/letter_numpy_grid_name.ps \ + 'name = "&MET_BASE;/python/read_ascii_numpy_grid.py &DATA_DIR_PYTHON;/letter.txt LETTER";' \ + -plot_range 0.0 255.0 \ + -title "Grid Name: 'G212'" \ + -v 1 + + + &OUTPUT_DIR;/python/letter_numpy_grid_name.ps + + + + + + &MET_BIN;/plot_data_plane + + + PYTHON_GRID + lambert 185 129 12.19 -133.459 -95 40.635 6371.2 25 25 N + + + \ + PYTHON_NUMPY \ + &OUTPUT_DIR;/python/letter_numpy_grid_string.ps \ + 'name = "&MET_BASE;/python/read_ascii_numpy_grid.py &DATA_DIR_PYTHON;/letter.txt LETTER";' \ + -plot_range 0.0 255.0 \ + -title "Grid String: '${PYTHON_GRID}'" \ + -v 1 + + + &OUTPUT_DIR;/python/letter_numpy_grid_string.ps + + + + + + &MET_BIN;/plot_data_plane + + + PYTHON_GRID + &MET_DATA;/sample_fcst/2005080700/wrfprs_ruc13_12.tm00_G212 + + \ + PYTHON_NUMPY \ + &OUTPUT_DIR;/python/letter_numpy_grid_data_file.ps \ + 'name = "&MET_BASE;/python/read_ascii_numpy_grid.py &DATA_DIR_PYTHON;/letter.txt LETTER";' \ + -plot_range 0.0 255.0 \ + -title "Gridded Data File: 'wrfprs_ruc13_12.tm00_G212'" \ + -v 1 + + + &OUTPUT_DIR;/python/letter_numpy_grid_data_file.ps + + + &MET_BIN;/plot_data_plane From 0f08b74f6e38a07c5715a8b9732d528440702f1b Mon Sep 17 00:00:00 2001 From: MET Tools Test Account Date: Wed, 10 Mar 2021 17:03:26 -0700 Subject: [PATCH 067/165] Committing a fix for unit_python.xml directly to the develop branch. We referenced in a place where it's not defined. --- test/xml/unit_python.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/xml/unit_python.xml b/test/xml/unit_python.xml index c204534f05..1c89950159 100644 --- a/test/xml/unit_python.xml +++ b/test/xml/unit_python.xml @@ -52,7 +52,7 @@ &OUTPUT_DIR;/python/letter_numpy_grid_string.ps \ 'name = "&MET_BASE;/python/read_ascii_numpy_grid.py &DATA_DIR_PYTHON;/letter.txt LETTER";' \ -plot_range 0.0 255.0 \ - -title "Grid String: '${PYTHON_GRID}'" \ + -title "Grid String: 'lambert 185 129 12.19 -133.459 -95 40.635 6371.2 25 25 N'" \ -v 1 From 48bb90618ee3c2aaccc88c6dc8581b21f8ac8287 Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Thu, 11 Mar 2021 13:14:16 -0700 Subject: [PATCH 068/165] Add *.dSYM to the .gitignore files in the src and internal_tests directories. --- met/internal_tests/.gitignore | 1 + met/internal_tests/basic/.gitignore | 1 + met/internal_tests/basic/vx_config/.gitignore | 1 + met/internal_tests/basic/vx_log/.gitignore | 1 + met/internal_tests/basic/vx_util/.gitignore | 1 + met/internal_tests/libcode/.gitignore | 1 + met/internal_tests/libcode/vx_data2d/.gitignore | 1 + met/internal_tests/libcode/vx_data2d_factory/.gitignore | 1 + met/internal_tests/libcode/vx_data2d_grib/.gitignore | 1 + met/internal_tests/libcode/vx_data2d_nc_met/.gitignore | 1 + met/internal_tests/libcode/vx_data2d_nccf/.gitignore | 1 + met/internal_tests/libcode/vx_geodesy/.gitignore | 1 + met/internal_tests/libcode/vx_grid/.gitignore | 1 + met/internal_tests/libcode/vx_nc_util/.gitignore | 1 + met/internal_tests/libcode/vx_physics/.gitignore | 1 + met/internal_tests/libcode/vx_plot_util/.gitignore | 1 + met/internal_tests/libcode/vx_ps/.gitignore | 1 + met/internal_tests/libcode/vx_series_data/.gitignore | 1 + met/internal_tests/libcode/vx_solar/.gitignore | 1 + met/internal_tests/libcode/vx_tc_util/.gitignore | 1 + met/internal_tests/tools/.gitignore | 1 + met/internal_tests/tools/other/.gitignore | 1 + met/internal_tests/tools/other/mode_time_domain/.gitignore | 1 + met/src/.gitignore | 1 + met/src/basic/.gitignore | 1 + met/src/basic/enum_to_string/.gitignore | 1 + met/src/basic/vx_cal/.gitignore | 1 + met/src/basic/vx_config/.gitignore | 1 + met/src/basic/vx_log/.gitignore | 1 + met/src/basic/vx_math/.gitignore | 1 + met/src/basic/vx_util/.gitignore | 1 + met/src/libcode/.gitignore | 1 + met/src/libcode/vx_afm/.gitignore | 1 + met/src/libcode/vx_analysis_util/.gitignore | 1 + met/src/libcode/vx_color/.gitignore | 1 + met/src/libcode/vx_data2d/.gitignore | 1 + met/src/libcode/vx_data2d_factory/.gitignore | 1 + met/src/libcode/vx_data2d_grib/.gitignore | 1 + met/src/libcode/vx_data2d_grib2/.gitignore | 1 + met/src/libcode/vx_data2d_nc_met/.gitignore | 1 + met/src/libcode/vx_data2d_nc_pinterp/.gitignore | 1 + met/src/libcode/vx_data2d_nccf/.gitignore | 1 + met/src/libcode/vx_data2d_python/.gitignore | 1 + met/src/libcode/vx_geodesy/.gitignore | 1 + met/src/libcode/vx_gis/.gitignore | 1 + met/src/libcode/vx_gnomon/.gitignore | 1 + met/src/libcode/vx_grid/.gitignore | 1 + met/src/libcode/vx_gsl_prob/.gitignore | 1 + met/src/libcode/vx_nav/.gitignore | 1 + met/src/libcode/vx_nc_obs/.gitignore | 1 + met/src/libcode/vx_nc_util/.gitignore | 1 + met/src/libcode/vx_pb_util/.gitignore | 1 + met/src/libcode/vx_plot_util/.gitignore | 1 + met/src/libcode/vx_ps/.gitignore | 1 + met/src/libcode/vx_pxm/.gitignore | 1 + met/src/libcode/vx_regrid/.gitignore | 1 + met/src/libcode/vx_render/.gitignore | 1 + met/src/libcode/vx_shapedata/.gitignore | 1 + met/src/libcode/vx_solar/.gitignore | 1 + met/src/libcode/vx_stat_out/.gitignore | 1 + met/src/libcode/vx_statistics/.gitignore | 1 + met/src/libcode/vx_summary/.gitignore | 1 + met/src/libcode/vx_tc_util/.gitignore | 1 + met/src/libcode/vx_time_series/.gitignore | 1 + met/src/tools/.gitignore | 1 + met/src/tools/core/.gitignore | 1 + met/src/tools/core/ensemble_stat/.gitignore | 1 + met/src/tools/core/grid_stat/.gitignore | 1 + met/src/tools/core/mode/.gitignore | 1 + met/src/tools/core/mode_analysis/.gitignore | 1 + met/src/tools/core/pcp_combine/.gitignore | 1 + met/src/tools/core/point_stat/.gitignore | 1 + met/src/tools/core/series_analysis/.gitignore | 1 + met/src/tools/core/stat_analysis/.gitignore | 1 + met/src/tools/core/wavelet_stat/.gitignore | 1 + met/src/tools/dev_utils/.gitignore | 1 + met/src/tools/dev_utils/shapefiles/.gitignore | 1 + met/src/tools/other/.gitignore | 1 + met/src/tools/other/ascii2nc/.gitignore | 1 + met/src/tools/other/gen_vx_mask/.gitignore | 1 + met/src/tools/other/gis_utils/.gitignore | 1 + met/src/tools/other/grid_diag/.gitignore | 1 + met/src/tools/other/gsi_tools/.gitignore | 1 + met/src/tools/other/ioda2nc/.gitignore | 1 + met/src/tools/other/lidar2nc/.gitignore | 1 + met/src/tools/other/madis2nc/.gitignore | 1 + met/src/tools/other/mode_graphics/.gitignore | 1 + met/src/tools/other/mode_time_domain/.gitignore | 1 + met/src/tools/other/modis_regrid/.gitignore | 1 + met/src/tools/other/pb2nc/.gitignore | 1 + met/src/tools/other/plot_data_plane/.gitignore | 1 + met/src/tools/other/plot_point_obs/.gitignore | 1 + met/src/tools/other/point2grid/.gitignore | 1 + met/src/tools/other/regrid_data_plane/.gitignore | 1 + met/src/tools/other/shift_data_plane/.gitignore | 1 + met/src/tools/other/wwmca_tool/.gitignore | 1 + met/src/tools/tc_utils/.gitignore | 1 + met/src/tools/tc_utils/rmw_analysis/.gitignore | 1 + met/src/tools/tc_utils/tc_dland/.gitignore | 1 + met/src/tools/tc_utils/tc_gen/.gitignore | 1 + met/src/tools/tc_utils/tc_pairs/.gitignore | 1 + met/src/tools/tc_utils/tc_rmw/.gitignore | 1 + met/src/tools/tc_utils/tc_stat/.gitignore | 1 + 103 files changed, 103 insertions(+) diff --git a/met/internal_tests/.gitignore b/met/internal_tests/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/internal_tests/.gitignore +++ b/met/internal_tests/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/basic/.gitignore b/met/internal_tests/basic/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/internal_tests/basic/.gitignore +++ b/met/internal_tests/basic/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/basic/vx_config/.gitignore b/met/internal_tests/basic/vx_config/.gitignore index 67630fc1ad..4591eec130 100644 --- a/met/internal_tests/basic/vx_config/.gitignore +++ b/met/internal_tests/basic/vx_config/.gitignore @@ -12,3 +12,4 @@ test_config .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/basic/vx_log/.gitignore b/met/internal_tests/basic/vx_log/.gitignore index db14416cc0..ef6fcb721e 100644 --- a/met/internal_tests/basic/vx_log/.gitignore +++ b/met/internal_tests/basic/vx_log/.gitignore @@ -5,3 +5,4 @@ test_logger .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/basic/vx_util/.gitignore b/met/internal_tests/basic/vx_util/.gitignore index dc6b171d93..a495037a4e 100644 --- a/met/internal_tests/basic/vx_util/.gitignore +++ b/met/internal_tests/basic/vx_util/.gitignore @@ -8,3 +8,4 @@ test_add_rows .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/libcode/.gitignore b/met/internal_tests/libcode/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/internal_tests/libcode/.gitignore +++ b/met/internal_tests/libcode/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/libcode/vx_data2d/.gitignore b/met/internal_tests/libcode/vx_data2d/.gitignore index 061a79d193..f7b330410a 100644 --- a/met/internal_tests/libcode/vx_data2d/.gitignore +++ b/met/internal_tests/libcode/vx_data2d/.gitignore @@ -5,3 +5,4 @@ dump_default_table .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/libcode/vx_data2d_factory/.gitignore b/met/internal_tests/libcode/vx_data2d_factory/.gitignore index f7fee338ad..4c7f17b56a 100644 --- a/met/internal_tests/libcode/vx_data2d_factory/.gitignore +++ b/met/internal_tests/libcode/vx_data2d_factory/.gitignore @@ -5,3 +5,4 @@ test_factory .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/libcode/vx_data2d_grib/.gitignore b/met/internal_tests/libcode/vx_data2d_grib/.gitignore index 70d0ac9de2..f285e250bc 100644 --- a/met/internal_tests/libcode/vx_data2d_grib/.gitignore +++ b/met/internal_tests/libcode/vx_data2d_grib/.gitignore @@ -4,3 +4,4 @@ test_read_grib1 .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/libcode/vx_data2d_nc_met/.gitignore b/met/internal_tests/libcode/vx_data2d_nc_met/.gitignore index 40ab9911a0..554cb3b99e 100644 --- a/met/internal_tests/libcode/vx_data2d_nc_met/.gitignore +++ b/met/internal_tests/libcode/vx_data2d_nc_met/.gitignore @@ -4,3 +4,4 @@ test_read_nc_met .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/libcode/vx_data2d_nccf/.gitignore b/met/internal_tests/libcode/vx_data2d_nccf/.gitignore index 9f05a5dd30..c7cba20d1c 100644 --- a/met/internal_tests/libcode/vx_data2d_nccf/.gitignore +++ b/met/internal_tests/libcode/vx_data2d_nccf/.gitignore @@ -4,3 +4,4 @@ test_read_nccf .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/libcode/vx_geodesy/.gitignore b/met/internal_tests/libcode/vx_geodesy/.gitignore index 17fc2778c9..826fb4b0c3 100644 --- a/met/internal_tests/libcode/vx_geodesy/.gitignore +++ b/met/internal_tests/libcode/vx_geodesy/.gitignore @@ -4,3 +4,4 @@ test_spheroid .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/libcode/vx_grid/.gitignore b/met/internal_tests/libcode/vx_grid/.gitignore index 19037db3e9..733bb6d622 100644 --- a/met/internal_tests/libcode/vx_grid/.gitignore +++ b/met/internal_tests/libcode/vx_grid/.gitignore @@ -4,3 +4,4 @@ test_grid_area .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/libcode/vx_nc_util/.gitignore b/met/internal_tests/libcode/vx_nc_util/.gitignore index a93467f330..71ddcde80a 100644 --- a/met/internal_tests/libcode/vx_nc_util/.gitignore +++ b/met/internal_tests/libcode/vx_nc_util/.gitignore @@ -4,3 +4,4 @@ test_pressure_levels .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/libcode/vx_physics/.gitignore b/met/internal_tests/libcode/vx_physics/.gitignore index 094a57719a..f2ec7e5a62 100644 --- a/met/internal_tests/libcode/vx_physics/.gitignore +++ b/met/internal_tests/libcode/vx_physics/.gitignore @@ -4,3 +4,4 @@ test_thermo .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/libcode/vx_plot_util/.gitignore b/met/internal_tests/libcode/vx_plot_util/.gitignore index d570f17da2..01b5ee0c75 100644 --- a/met/internal_tests/libcode/vx_plot_util/.gitignore +++ b/met/internal_tests/libcode/vx_plot_util/.gitignore @@ -4,3 +4,4 @@ test_map_region .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/libcode/vx_ps/.gitignore b/met/internal_tests/libcode/vx_ps/.gitignore index ebef0f4ecf..916310e94c 100644 --- a/met/internal_tests/libcode/vx_ps/.gitignore +++ b/met/internal_tests/libcode/vx_ps/.gitignore @@ -4,3 +4,4 @@ test_ps .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/libcode/vx_series_data/.gitignore b/met/internal_tests/libcode/vx_series_data/.gitignore index a29fc045ef..44e011fc66 100644 --- a/met/internal_tests/libcode/vx_series_data/.gitignore +++ b/met/internal_tests/libcode/vx_series_data/.gitignore @@ -4,3 +4,4 @@ test_series_data .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/libcode/vx_solar/.gitignore b/met/internal_tests/libcode/vx_solar/.gitignore index 906dd21126..326d9d0cad 100644 --- a/met/internal_tests/libcode/vx_solar/.gitignore +++ b/met/internal_tests/libcode/vx_solar/.gitignore @@ -4,3 +4,4 @@ test_ra_dec .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/libcode/vx_tc_util/.gitignore b/met/internal_tests/libcode/vx_tc_util/.gitignore index 6a46ceef48..bd2b6485c5 100644 --- a/met/internal_tests/libcode/vx_tc_util/.gitignore +++ b/met/internal_tests/libcode/vx_tc_util/.gitignore @@ -5,3 +5,4 @@ test_read .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/tools/.gitignore b/met/internal_tests/tools/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/internal_tests/tools/.gitignore +++ b/met/internal_tests/tools/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/tools/other/.gitignore b/met/internal_tests/tools/other/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/internal_tests/tools/other/.gitignore +++ b/met/internal_tests/tools/other/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/internal_tests/tools/other/mode_time_domain/.gitignore b/met/internal_tests/tools/other/mode_time_domain/.gitignore index 092c0bed05..01fa57111b 100644 --- a/met/internal_tests/tools/other/mode_time_domain/.gitignore +++ b/met/internal_tests/tools/other/mode_time_domain/.gitignore @@ -4,3 +4,4 @@ test_velocity .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/.gitignore b/met/src/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/.gitignore +++ b/met/src/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/basic/.gitignore b/met/src/basic/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/basic/.gitignore +++ b/met/src/basic/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/basic/enum_to_string/.gitignore b/met/src/basic/enum_to_string/.gitignore index 02ea333a4d..7788d23d81 100644 --- a/met/src/basic/enum_to_string/.gitignore +++ b/met/src/basic/enum_to_string/.gitignore @@ -5,3 +5,4 @@ enum_parser.cc .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/basic/vx_cal/.gitignore b/met/src/basic/vx_cal/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/basic/vx_cal/.gitignore +++ b/met/src/basic/vx_cal/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/basic/vx_config/.gitignore b/met/src/basic/vx_config/.gitignore index cd85cdb95c..24c9ca6c7e 100644 --- a/met/src/basic/vx_config/.gitignore +++ b/met/src/basic/vx_config/.gitignore @@ -7,3 +7,4 @@ config.tab.h .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/basic/vx_log/.gitignore b/met/src/basic/vx_log/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/basic/vx_log/.gitignore +++ b/met/src/basic/vx_log/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/basic/vx_math/.gitignore b/met/src/basic/vx_math/.gitignore index 92b269f31e..7e5f500d16 100644 --- a/met/src/basic/vx_math/.gitignore +++ b/met/src/basic/vx_math/.gitignore @@ -5,3 +5,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/basic/vx_util/.gitignore b/met/src/basic/vx_util/.gitignore index 92b269f31e..7e5f500d16 100644 --- a/met/src/basic/vx_util/.gitignore +++ b/met/src/basic/vx_util/.gitignore @@ -5,3 +5,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/.gitignore b/met/src/libcode/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/.gitignore +++ b/met/src/libcode/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_afm/.gitignore b/met/src/libcode/vx_afm/.gitignore index 92b269f31e..7e5f500d16 100644 --- a/met/src/libcode/vx_afm/.gitignore +++ b/met/src/libcode/vx_afm/.gitignore @@ -5,3 +5,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_analysis_util/.gitignore b/met/src/libcode/vx_analysis_util/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_analysis_util/.gitignore +++ b/met/src/libcode/vx_analysis_util/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_color/.gitignore b/met/src/libcode/vx_color/.gitignore index db5274632b..222c1f46c6 100644 --- a/met/src/libcode/vx_color/.gitignore +++ b/met/src/libcode/vx_color/.gitignore @@ -6,3 +6,4 @@ color_parser_yacc.h .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_data2d/.gitignore b/met/src/libcode/vx_data2d/.gitignore index 92b269f31e..7e5f500d16 100644 --- a/met/src/libcode/vx_data2d/.gitignore +++ b/met/src/libcode/vx_data2d/.gitignore @@ -5,3 +5,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_data2d_factory/.gitignore b/met/src/libcode/vx_data2d_factory/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_data2d_factory/.gitignore +++ b/met/src/libcode/vx_data2d_factory/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_data2d_grib/.gitignore b/met/src/libcode/vx_data2d_grib/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_data2d_grib/.gitignore +++ b/met/src/libcode/vx_data2d_grib/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_data2d_grib2/.gitignore b/met/src/libcode/vx_data2d_grib2/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_data2d_grib2/.gitignore +++ b/met/src/libcode/vx_data2d_grib2/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_data2d_nc_met/.gitignore b/met/src/libcode/vx_data2d_nc_met/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_data2d_nc_met/.gitignore +++ b/met/src/libcode/vx_data2d_nc_met/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_data2d_nc_pinterp/.gitignore b/met/src/libcode/vx_data2d_nc_pinterp/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_data2d_nc_pinterp/.gitignore +++ b/met/src/libcode/vx_data2d_nc_pinterp/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_data2d_nccf/.gitignore b/met/src/libcode/vx_data2d_nccf/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_data2d_nccf/.gitignore +++ b/met/src/libcode/vx_data2d_nccf/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_data2d_python/.gitignore b/met/src/libcode/vx_data2d_python/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_data2d_python/.gitignore +++ b/met/src/libcode/vx_data2d_python/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_geodesy/.gitignore b/met/src/libcode/vx_geodesy/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_geodesy/.gitignore +++ b/met/src/libcode/vx_geodesy/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_gis/.gitignore b/met/src/libcode/vx_gis/.gitignore index 92b269f31e..7e5f500d16 100644 --- a/met/src/libcode/vx_gis/.gitignore +++ b/met/src/libcode/vx_gis/.gitignore @@ -5,3 +5,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_gnomon/.gitignore b/met/src/libcode/vx_gnomon/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_gnomon/.gitignore +++ b/met/src/libcode/vx_gnomon/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_grid/.gitignore b/met/src/libcode/vx_grid/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_grid/.gitignore +++ b/met/src/libcode/vx_grid/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_gsl_prob/.gitignore b/met/src/libcode/vx_gsl_prob/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_gsl_prob/.gitignore +++ b/met/src/libcode/vx_gsl_prob/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_nav/.gitignore b/met/src/libcode/vx_nav/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_nav/.gitignore +++ b/met/src/libcode/vx_nav/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_nc_obs/.gitignore b/met/src/libcode/vx_nc_obs/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_nc_obs/.gitignore +++ b/met/src/libcode/vx_nc_obs/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_nc_util/.gitignore b/met/src/libcode/vx_nc_util/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_nc_util/.gitignore +++ b/met/src/libcode/vx_nc_util/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_pb_util/.gitignore b/met/src/libcode/vx_pb_util/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_pb_util/.gitignore +++ b/met/src/libcode/vx_pb_util/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_plot_util/.gitignore b/met/src/libcode/vx_plot_util/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_plot_util/.gitignore +++ b/met/src/libcode/vx_plot_util/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_ps/.gitignore b/met/src/libcode/vx_ps/.gitignore index 92b269f31e..7e5f500d16 100644 --- a/met/src/libcode/vx_ps/.gitignore +++ b/met/src/libcode/vx_ps/.gitignore @@ -5,3 +5,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_pxm/.gitignore b/met/src/libcode/vx_pxm/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_pxm/.gitignore +++ b/met/src/libcode/vx_pxm/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_regrid/.gitignore b/met/src/libcode/vx_regrid/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_regrid/.gitignore +++ b/met/src/libcode/vx_regrid/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_render/.gitignore b/met/src/libcode/vx_render/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_render/.gitignore +++ b/met/src/libcode/vx_render/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_shapedata/.gitignore b/met/src/libcode/vx_shapedata/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_shapedata/.gitignore +++ b/met/src/libcode/vx_shapedata/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_solar/.gitignore b/met/src/libcode/vx_solar/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_solar/.gitignore +++ b/met/src/libcode/vx_solar/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_stat_out/.gitignore b/met/src/libcode/vx_stat_out/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_stat_out/.gitignore +++ b/met/src/libcode/vx_stat_out/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_statistics/.gitignore b/met/src/libcode/vx_statistics/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_statistics/.gitignore +++ b/met/src/libcode/vx_statistics/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_summary/.gitignore b/met/src/libcode/vx_summary/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_summary/.gitignore +++ b/met/src/libcode/vx_summary/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_tc_util/.gitignore b/met/src/libcode/vx_tc_util/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_tc_util/.gitignore +++ b/met/src/libcode/vx_tc_util/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/libcode/vx_time_series/.gitignore b/met/src/libcode/vx_time_series/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/libcode/vx_time_series/.gitignore +++ b/met/src/libcode/vx_time_series/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/.gitignore b/met/src/tools/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/tools/.gitignore +++ b/met/src/tools/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/core/.gitignore b/met/src/tools/core/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/tools/core/.gitignore +++ b/met/src/tools/core/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/core/ensemble_stat/.gitignore b/met/src/tools/core/ensemble_stat/.gitignore index ff7e359957..536328aba8 100644 --- a/met/src/tools/core/ensemble_stat/.gitignore +++ b/met/src/tools/core/ensemble_stat/.gitignore @@ -4,3 +4,4 @@ ensemble_stat .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/core/grid_stat/.gitignore b/met/src/tools/core/grid_stat/.gitignore index c4d713316d..5e2bcb8f66 100644 --- a/met/src/tools/core/grid_stat/.gitignore +++ b/met/src/tools/core/grid_stat/.gitignore @@ -4,3 +4,4 @@ grid_stat .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/core/mode/.gitignore b/met/src/tools/core/mode/.gitignore index 3eb452874c..8216720ddb 100644 --- a/met/src/tools/core/mode/.gitignore +++ b/met/src/tools/core/mode/.gitignore @@ -4,3 +4,4 @@ mode .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/core/mode_analysis/.gitignore b/met/src/tools/core/mode_analysis/.gitignore index 6108dd97e6..0e3a718728 100644 --- a/met/src/tools/core/mode_analysis/.gitignore +++ b/met/src/tools/core/mode_analysis/.gitignore @@ -4,3 +4,4 @@ mode_analysis .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/core/pcp_combine/.gitignore b/met/src/tools/core/pcp_combine/.gitignore index 012e9dce9d..2963b459b1 100644 --- a/met/src/tools/core/pcp_combine/.gitignore +++ b/met/src/tools/core/pcp_combine/.gitignore @@ -4,3 +4,4 @@ pcp_combine .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/core/point_stat/.gitignore b/met/src/tools/core/point_stat/.gitignore index 42294678d5..00088797c5 100644 --- a/met/src/tools/core/point_stat/.gitignore +++ b/met/src/tools/core/point_stat/.gitignore @@ -4,3 +4,4 @@ point_stat .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/core/series_analysis/.gitignore b/met/src/tools/core/series_analysis/.gitignore index 4e996c7b6c..4ae6680d91 100644 --- a/met/src/tools/core/series_analysis/.gitignore +++ b/met/src/tools/core/series_analysis/.gitignore @@ -4,3 +4,4 @@ series_analysis .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/core/stat_analysis/.gitignore b/met/src/tools/core/stat_analysis/.gitignore index aadcccda75..bcc102842e 100644 --- a/met/src/tools/core/stat_analysis/.gitignore +++ b/met/src/tools/core/stat_analysis/.gitignore @@ -4,3 +4,4 @@ stat_analysis .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/core/wavelet_stat/.gitignore b/met/src/tools/core/wavelet_stat/.gitignore index 31f707d25d..7ed6d133d1 100644 --- a/met/src/tools/core/wavelet_stat/.gitignore +++ b/met/src/tools/core/wavelet_stat/.gitignore @@ -4,3 +4,4 @@ wavelet_stat .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/dev_utils/.gitignore b/met/src/tools/dev_utils/.gitignore index 5993a9d79d..6dff8d3ff9 100644 --- a/met/src/tools/dev_utils/.gitignore +++ b/met/src/tools/dev_utils/.gitignore @@ -12,3 +12,4 @@ chk4copyright .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/dev_utils/shapefiles/.gitignore b/met/src/tools/dev_utils/shapefiles/.gitignore index d530071029..1ef4c3e5dc 100644 --- a/met/src/tools/dev_utils/shapefiles/.gitignore +++ b/met/src/tools/dev_utils/shapefiles/.gitignore @@ -4,3 +4,4 @@ make_mapfiles .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/.gitignore b/met/src/tools/other/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/tools/other/.gitignore +++ b/met/src/tools/other/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/ascii2nc/.gitignore b/met/src/tools/other/ascii2nc/.gitignore index 14e5831fd8..46e9e4600d 100644 --- a/met/src/tools/other/ascii2nc/.gitignore +++ b/met/src/tools/other/ascii2nc/.gitignore @@ -4,3 +4,4 @@ ascii2nc .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/gen_vx_mask/.gitignore b/met/src/tools/other/gen_vx_mask/.gitignore index 014957152f..def514617d 100644 --- a/met/src/tools/other/gen_vx_mask/.gitignore +++ b/met/src/tools/other/gen_vx_mask/.gitignore @@ -4,3 +4,4 @@ gen_vx_mask .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/gis_utils/.gitignore b/met/src/tools/other/gis_utils/.gitignore index 6f5206616c..6bcc0d4e28 100644 --- a/met/src/tools/other/gis_utils/.gitignore +++ b/met/src/tools/other/gis_utils/.gitignore @@ -6,3 +6,4 @@ gis_dump_dbf .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/grid_diag/.gitignore b/met/src/tools/other/grid_diag/.gitignore index 07d1d9d55d..2ea21992a5 100644 --- a/met/src/tools/other/grid_diag/.gitignore +++ b/met/src/tools/other/grid_diag/.gitignore @@ -4,3 +4,4 @@ grid_diag .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/gsi_tools/.gitignore b/met/src/tools/other/gsi_tools/.gitignore index f98752c930..d91d7ab411 100644 --- a/met/src/tools/other/gsi_tools/.gitignore +++ b/met/src/tools/other/gsi_tools/.gitignore @@ -5,3 +5,4 @@ gsid2mpr .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/ioda2nc/.gitignore b/met/src/tools/other/ioda2nc/.gitignore index 0d392220b0..58b6d8e6cc 100644 --- a/met/src/tools/other/ioda2nc/.gitignore +++ b/met/src/tools/other/ioda2nc/.gitignore @@ -5,3 +5,4 @@ ioda2nc .dirstamp Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/lidar2nc/.gitignore b/met/src/tools/other/lidar2nc/.gitignore index 25c289c10c..6a71017f06 100644 --- a/met/src/tools/other/lidar2nc/.gitignore +++ b/met/src/tools/other/lidar2nc/.gitignore @@ -4,3 +4,4 @@ lidar2nc .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/madis2nc/.gitignore b/met/src/tools/other/madis2nc/.gitignore index 048a33b4e4..eb5b9c9238 100644 --- a/met/src/tools/other/madis2nc/.gitignore +++ b/met/src/tools/other/madis2nc/.gitignore @@ -4,3 +4,4 @@ madis2nc .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/mode_graphics/.gitignore b/met/src/tools/other/mode_graphics/.gitignore index c344a0a483..0026eae5fa 100644 --- a/met/src/tools/other/mode_graphics/.gitignore +++ b/met/src/tools/other/mode_graphics/.gitignore @@ -6,3 +6,4 @@ plot_mode_field .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/mode_time_domain/.gitignore b/met/src/tools/other/mode_time_domain/.gitignore index 16272bfe7d..15cbce0f9f 100644 --- a/met/src/tools/other/mode_time_domain/.gitignore +++ b/met/src/tools/other/mode_time_domain/.gitignore @@ -6,3 +6,4 @@ mtd .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/modis_regrid/.gitignore b/met/src/tools/other/modis_regrid/.gitignore index 5659a845bd..de709555ac 100644 --- a/met/src/tools/other/modis_regrid/.gitignore +++ b/met/src/tools/other/modis_regrid/.gitignore @@ -4,3 +4,4 @@ modis_regrid .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/pb2nc/.gitignore b/met/src/tools/other/pb2nc/.gitignore index db0fc32617..ec395e3290 100644 --- a/met/src/tools/other/pb2nc/.gitignore +++ b/met/src/tools/other/pb2nc/.gitignore @@ -5,3 +5,4 @@ pb2nc .dirstamp Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/plot_data_plane/.gitignore b/met/src/tools/other/plot_data_plane/.gitignore index fb45412645..ba23c68111 100644 --- a/met/src/tools/other/plot_data_plane/.gitignore +++ b/met/src/tools/other/plot_data_plane/.gitignore @@ -4,3 +4,4 @@ plot_data_plane .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/plot_point_obs/.gitignore b/met/src/tools/other/plot_point_obs/.gitignore index 675f1ad662..c09f77682e 100644 --- a/met/src/tools/other/plot_point_obs/.gitignore +++ b/met/src/tools/other/plot_point_obs/.gitignore @@ -4,3 +4,4 @@ plot_point_obs .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/point2grid/.gitignore b/met/src/tools/other/point2grid/.gitignore index 7fc724ecfb..c86ed97c54 100644 --- a/met/src/tools/other/point2grid/.gitignore +++ b/met/src/tools/other/point2grid/.gitignore @@ -4,3 +4,4 @@ point2grid .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/regrid_data_plane/.gitignore b/met/src/tools/other/regrid_data_plane/.gitignore index 2bddf9a131..3b5934adac 100644 --- a/met/src/tools/other/regrid_data_plane/.gitignore +++ b/met/src/tools/other/regrid_data_plane/.gitignore @@ -4,3 +4,4 @@ regrid_data_plane .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/shift_data_plane/.gitignore b/met/src/tools/other/shift_data_plane/.gitignore index 84942ecee1..b539a2f8c3 100644 --- a/met/src/tools/other/shift_data_plane/.gitignore +++ b/met/src/tools/other/shift_data_plane/.gitignore @@ -4,3 +4,4 @@ shift_data_plane .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/other/wwmca_tool/.gitignore b/met/src/tools/other/wwmca_tool/.gitignore index a144c3a35d..ebecdacf1a 100644 --- a/met/src/tools/other/wwmca_tool/.gitignore +++ b/met/src/tools/other/wwmca_tool/.gitignore @@ -7,3 +7,4 @@ wwmca_plot .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/tc_utils/.gitignore b/met/src/tools/tc_utils/.gitignore index 6c6a5a4f31..1295d44db5 100644 --- a/met/src/tools/tc_utils/.gitignore +++ b/met/src/tools/tc_utils/.gitignore @@ -3,3 +3,4 @@ .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/tc_utils/rmw_analysis/.gitignore b/met/src/tools/tc_utils/rmw_analysis/.gitignore index 077554915a..ca237511e7 100644 --- a/met/src/tools/tc_utils/rmw_analysis/.gitignore +++ b/met/src/tools/tc_utils/rmw_analysis/.gitignore @@ -4,3 +4,4 @@ rmw_analysis .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/tc_utils/tc_dland/.gitignore b/met/src/tools/tc_utils/tc_dland/.gitignore index 75c82825a6..483d24cffa 100644 --- a/met/src/tools/tc_utils/tc_dland/.gitignore +++ b/met/src/tools/tc_utils/tc_dland/.gitignore @@ -4,3 +4,4 @@ tc_dland .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/tc_utils/tc_gen/.gitignore b/met/src/tools/tc_utils/tc_gen/.gitignore index 7b8c809236..28c0ebbfe4 100644 --- a/met/src/tools/tc_utils/tc_gen/.gitignore +++ b/met/src/tools/tc_utils/tc_gen/.gitignore @@ -4,3 +4,4 @@ tc_gen .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/tc_utils/tc_pairs/.gitignore b/met/src/tools/tc_utils/tc_pairs/.gitignore index d13a56b286..d69eaeca53 100644 --- a/met/src/tools/tc_utils/tc_pairs/.gitignore +++ b/met/src/tools/tc_utils/tc_pairs/.gitignore @@ -4,3 +4,4 @@ tc_pairs .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/tc_utils/tc_rmw/.gitignore b/met/src/tools/tc_utils/tc_rmw/.gitignore index b540dddec0..4f555bc016 100644 --- a/met/src/tools/tc_utils/tc_rmw/.gitignore +++ b/met/src/tools/tc_utils/tc_rmw/.gitignore @@ -4,3 +4,4 @@ tc_rmw .deps Makefile Makefile.in +*.dSYM diff --git a/met/src/tools/tc_utils/tc_stat/.gitignore b/met/src/tools/tc_utils/tc_stat/.gitignore index d18583f8b8..8f7a38909c 100644 --- a/met/src/tools/tc_utils/tc_stat/.gitignore +++ b/met/src/tools/tc_utils/tc_stat/.gitignore @@ -4,3 +4,4 @@ tc_stat .deps Makefile Makefile.in +*.dSYM From 6568493c6763869789ab142a98b4ca15fbf042aa Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Fri, 12 Mar 2021 13:56:04 -0700 Subject: [PATCH 069/165] Replaced tmp netcdf _name attribute with name_str. --- met/data/wrappers/read_tmp_dataplane.py | 4 ++-- met/data/wrappers/write_tmp_dataplane.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/met/data/wrappers/read_tmp_dataplane.py b/met/data/wrappers/read_tmp_dataplane.py index e5fb0d6cb0..e21c17ba3f 100644 --- a/met/data/wrappers/read_tmp_dataplane.py +++ b/met/data/wrappers/read_tmp_dataplane.py @@ -29,8 +29,8 @@ met_attrs[attr] = attr_val grid['nx'], grid['ny'] = int(grid['nx']), int(grid['ny']) met_attrs['grid'] = grid -met_attrs['name'] = met_attrs['_name'] -del met_attrs['_name'] +met_attrs['name'] = met_attrs['name_str'] +del met_attrs['name_str'] met_info['met_data'] = met_data met_info['attrs'] = met_attrs print(met_info) diff --git a/met/data/wrappers/write_tmp_dataplane.py b/met/data/wrappers/write_tmp_dataplane.py index f7ff2d7559..c04b1da6d0 100644 --- a/met/data/wrappers/write_tmp_dataplane.py +++ b/met/data/wrappers/write_tmp_dataplane.py @@ -54,7 +54,7 @@ for attr, attr_val in met_info['attrs'].items(): print(attr, attr_val, type(attr_val)) if attr == 'name': - setattr(ds, '_name', attr_val) + setattr(ds, 'name_str', attr_val) if type(attr_val) == str: setattr(ds, attr, attr_val) if type(attr_val) == dict: From 22f5e98acba65a3e5454fdee939a4ea87a4d334a Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Mon, 15 Mar 2021 14:49:09 -0600 Subject: [PATCH 070/165] Append user script path to system path. --- met/data/wrappers/write_tmp_dataplane.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/met/data/wrappers/write_tmp_dataplane.py b/met/data/wrappers/write_tmp_dataplane.py index c04b1da6d0..6af7d115a9 100644 --- a/met/data/wrappers/write_tmp_dataplane.py +++ b/met/data/wrappers/write_tmp_dataplane.py @@ -23,6 +23,11 @@ pyembed_module_name = sys.argv[2] sys.argv = sys.argv[2:] +# append user script dir to system path +pyembed_dir, pyembed_file = os.path.split(pyembed_module_name) +if pyembed_dir: + os.path.append(pyembed_dir) + if not pyembed_module_name.endswith('.py'): pyembed_module_name += '.py' From dee5d3b0f1b4c69bb941c7ea7d8175506c215746 Mon Sep 17 00:00:00 2001 From: johnhg Date: Mon, 15 Mar 2021 17:51:14 -0600 Subject: [PATCH 071/165] Revert "Feature 1319 no pickle" (#1717) --- met/data/wrappers/Makefile.am | 8 +- met/data/wrappers/read_pickle_dataplane.py | 15 +++ met/data/wrappers/read_tmp_ascii.py | 49 ------- met/data/wrappers/read_tmp_dataplane.py | 36 ------ ...tmp_point.py => write_pickle_dataplane.py} | 24 +++- met/data/wrappers/write_pickle_mpr.py | 5 +- met/data/wrappers/write_pickle_point.py | 5 - met/data/wrappers/write_tmp_dataplane.py | 68 ---------- .../vx_data2d_python/python_dataplane.cc | 54 ++++---- .../vx_python3_utils/python3_script.cc | 121 +----------------- .../libcode/vx_python3_utils/python3_script.h | 17 +-- met/src/tools/other/ascii2nc/ascii2nc.cc | 1 - .../tools/other/ascii2nc/python_handler.cc | 48 ++++--- met/src/tools/other/ascii2nc/python_handler.h | 10 +- 14 files changed, 96 insertions(+), 365 deletions(-) create mode 100644 met/data/wrappers/read_pickle_dataplane.py delete mode 100644 met/data/wrappers/read_tmp_ascii.py delete mode 100644 met/data/wrappers/read_tmp_dataplane.py rename met/data/wrappers/{write_tmp_point.py => write_pickle_dataplane.py} (52%) delete mode 100644 met/data/wrappers/write_tmp_dataplane.py diff --git a/met/data/wrappers/Makefile.am b/met/data/wrappers/Makefile.am index 5061e51d51..d8a6d5a026 100644 --- a/met/data/wrappers/Makefile.am +++ b/met/data/wrappers/Makefile.am @@ -23,12 +23,10 @@ wrappersdir = $(pkgdatadir)/wrappers wrappers_DATA = \ generic_python.py \ generic_pickle.py \ - read_tmp_dataplane.py \ - write_tmp_dataplane.py \ + read_pickle_dataplane.py \ + write_pickle_dataplane.py \ write_pickle_mpr.py \ - read_tmp_ascii.py \ - write_pickle_point.py \ - write_tmp_point.py + write_pickle_point.py EXTRA_DIST = ${wrappers_DATA} diff --git a/met/data/wrappers/read_pickle_dataplane.py b/met/data/wrappers/read_pickle_dataplane.py new file mode 100644 index 0000000000..f97f153df7 --- /dev/null +++ b/met/data/wrappers/read_pickle_dataplane.py @@ -0,0 +1,15 @@ +######################################################################## +# +# Reads temporary pickle file into memory. +# +# usage: /path/to/python read_pickle_dataplane.py pickle.tmp +# +######################################################################## + +import sys +import numpy as np +import pickle + +print('Python Script:\t', sys.argv[0]) +print('Load Pickle:\t', sys.argv[1]) +met_info = pickle.load(open(sys.argv[1], "rb")) diff --git a/met/data/wrappers/read_tmp_ascii.py b/met/data/wrappers/read_tmp_ascii.py deleted file mode 100644 index b4f4303044..0000000000 --- a/met/data/wrappers/read_tmp_ascii.py +++ /dev/null @@ -1,49 +0,0 @@ -""" -Module Name: read_tmp_ascii.py - -Read MET Point Observations from a text file created by write_tmp_point.py script - or MET Matched Pairs from a text file created by write_tmp_mpr.py script - -Point observation format: - Message_Type, Station_ID, Valid_Time, Lat, Lon, Elevation, - GRIB_Code or Variable_Name, Level, Height, QC_String, Observation_Value - -Version Date -1.0.0 2021/02/18 David Fillmore Initial version -""" - -__author__ = 'David Fillmore' -__version__ = '1.0.0' -__email__ = 'met_help@ucar.edu' - -import argparse - -point_data = None - -def read_tmp_ascii(filename): - """ - Arguments: - filename (string): temporary file created by write_tmp_point.py - - Returns: - (list of lists): point data - """ - print('read_tmp_ascii:' + filename) - f = open(filename, 'r') - lines = f.readlines() - f.close() - - global point_data - point_data = [eval(line.strip('\n')) for line in lines] - - return point_data - -if __name__ == '__main__': - """ - Parse command line arguments - """ - parser = argparse.ArgumentParser() - parser.add_argument('--filename', type=str) - args = parser.parse_args() - - data = read_tmp_ascii(args.filename) diff --git a/met/data/wrappers/read_tmp_dataplane.py b/met/data/wrappers/read_tmp_dataplane.py deleted file mode 100644 index e21c17ba3f..0000000000 --- a/met/data/wrappers/read_tmp_dataplane.py +++ /dev/null @@ -1,36 +0,0 @@ -######################################################################## -# -# Reads temporary file into memory. -# -# usage: /path/to/python read_tmp_dataplane.py dataplane.tmp -# -######################################################################## - -import sys -import numpy as np -import netCDF4 as nc - -print('Python Script:\t', sys.argv[0]) -met_info = {} - -netcdf_filename = sys.argv[1] -print('Read NetCDF:\t', netcdf_filename) - -# read NetCDF file -ds = nc.Dataset(netcdf_filename, 'r') -met_data = ds['met_data'][:] -met_attrs = {} -grid = {} -for attr, attr_val in ds.__dict__.items(): - if 'grid' in attr: - grid_attr = attr.split('.')[1] - grid[grid_attr] = attr_val - else: - met_attrs[attr] = attr_val -grid['nx'], grid['ny'] = int(grid['nx']), int(grid['ny']) -met_attrs['grid'] = grid -met_attrs['name'] = met_attrs['name_str'] -del met_attrs['name_str'] -met_info['met_data'] = met_data -met_info['attrs'] = met_attrs -print(met_info) diff --git a/met/data/wrappers/write_tmp_point.py b/met/data/wrappers/write_pickle_dataplane.py similarity index 52% rename from met/data/wrappers/write_tmp_point.py rename to met/data/wrappers/write_pickle_dataplane.py index 94f56cd3dd..079557538b 100644 --- a/met/data/wrappers/write_tmp_point.py +++ b/met/data/wrappers/write_pickle_dataplane.py @@ -3,30 +3,40 @@ # Adapted from a script provided by George McCabe # Adapted by Randy Bullock # -# usage: /path/to/python write_tmp_point.py \ -# tmp_ascii_output_filename .py +# usage: /path/to/python write_pickle_dataplane.py \ +# pickle_output_filename .py # ######################################################################## import os import sys +import pickle import importlib.util +import xarray as xr print('Python Script:\t', sys.argv[0]) print('User Command:\t', sys.argv[2:]) -print('Write Temporary Ascii:\t', sys.argv[1]) +print('Write Pickle:\t', sys.argv[1]) -tmp_filename = sys.argv[1] +pickle_filename = sys.argv[1] pyembed_module_name = sys.argv[2] sys.argv = sys.argv[2:] +if not pyembed_module_name.endswith('.py'): + pyembed_module_name += '.py' + user_base = os.path.basename(pyembed_module_name).replace('.py','') spec = importlib.util.spec_from_file_location(user_base, pyembed_module_name) met_in = importlib.util.module_from_spec(spec) spec.loader.exec_module(met_in) -f = open(tmp_filename, 'w') -for line in met_in.point_data: - f.write(str(line) + '\n') +if isinstance(met_in.met_data, xr.DataArray): + met_info = { 'attrs': met_in.met_data.attrs, 'met_data': met_in.met_data } +else: + met_info = { 'attrs': met_in.attrs, 'met_data': met_in.met_data } + +print(met_info) + +pickle.dump( met_info, open( pickle_filename, "wb" ) ) diff --git a/met/data/wrappers/write_pickle_mpr.py b/met/data/wrappers/write_pickle_mpr.py index efde687bf7..2e3f2d0d04 100644 --- a/met/data/wrappers/write_pickle_mpr.py +++ b/met/data/wrappers/write_pickle_mpr.py @@ -18,7 +18,6 @@ print('Write Pickle:\t', sys.argv[1]) pickle_filename = sys.argv[1] -tmp_filename = pickle_filename + '.txt' pyembed_module_name = sys.argv[2] sys.argv = sys.argv[2:] @@ -29,8 +28,6 @@ met_in = importlib.util.module_from_spec(spec) spec.loader.exec_module(met_in) -f = open(tmp_filename, 'w') -for line in met_in.mpr_data: - f.write(str(line) + '\n') +print(met_in) pickle.dump( met_in.mpr_data, open( pickle_filename, "wb" ) ) diff --git a/met/data/wrappers/write_pickle_point.py b/met/data/wrappers/write_pickle_point.py index 907c0e005d..1f5ee35bdb 100644 --- a/met/data/wrappers/write_pickle_point.py +++ b/met/data/wrappers/write_pickle_point.py @@ -18,7 +18,6 @@ print('Write Pickle:\t', sys.argv[1]) pickle_filename = sys.argv[1] -tmp_filename = pickle_filename + '.txt' pyembed_module_name = sys.argv[2] sys.argv = sys.argv[2:] @@ -29,8 +28,4 @@ met_in = importlib.util.module_from_spec(spec) spec.loader.exec_module(met_in) -f = open(tmp_filename, 'w') -for line in met_in.point_data: - f.write(str(line) + '\n') - pickle.dump( met_in.point_data, open( pickle_filename, "wb" ) ) diff --git a/met/data/wrappers/write_tmp_dataplane.py b/met/data/wrappers/write_tmp_dataplane.py deleted file mode 100644 index 6af7d115a9..0000000000 --- a/met/data/wrappers/write_tmp_dataplane.py +++ /dev/null @@ -1,68 +0,0 @@ -######################################################################## -# -# Adapted from a script provided by George McCabe -# Adapted by Randy Bullock -# -# usage: /path/to/python write_tmp_dataplane.py \ -# tmp_output_filename .py -# -######################################################################## - -import os -import sys -import importlib.util -import netCDF4 as nc - -print('Python Script:\t', sys.argv[0]) -print('User Command:\t', sys.argv[2:]) - -netcdf_filename = sys.argv[1] - -print('Write NetCDF:\t', netcdf_filename) - -pyembed_module_name = sys.argv[2] -sys.argv = sys.argv[2:] - -# append user script dir to system path -pyembed_dir, pyembed_file = os.path.split(pyembed_module_name) -if pyembed_dir: - os.path.append(pyembed_dir) - -if not pyembed_module_name.endswith('.py'): - pyembed_module_name += '.py' - -user_base = os.path.basename(pyembed_module_name).replace('.py','') - -spec = importlib.util.spec_from_file_location(user_base, pyembed_module_name) -met_in = importlib.util.module_from_spec(spec) -spec.loader.exec_module(met_in) - -met_info = {'met_data': met_in.met_data} -if hasattr(met_in.met_data, 'attrs') and met_in.met_data.attrs: - attrs = met_in.met_data.attrs -else: - attrs = met_in.attrs -met_info['attrs'] = attrs - -print('write_tmp_dataplane') -print(met_info) - -# write NetCDF file -ds = nc.Dataset(netcdf_filename, 'w') - -nx, ny = met_in.met_data.shape -ds.createDimension('x', nx) -ds.createDimension('y', ny) -dp = ds.createVariable('met_data', met_in.met_data.dtype, ('x', 'y')) -dp[:] = met_in.met_data - -for attr, attr_val in met_info['attrs'].items(): - print(attr, attr_val, type(attr_val)) - if attr == 'name': - setattr(ds, 'name_str', attr_val) - if type(attr_val) == str: - setattr(ds, attr, attr_val) - if type(attr_val) == dict: - for key in attr_val: - setattr(ds, attr + '.' + key, attr_val[key]) -ds.close() diff --git a/met/src/libcode/vx_data2d_python/python_dataplane.cc b/met/src/libcode/vx_data2d_python/python_dataplane.cc index 8f70af5109..d5ace046d0 100644 --- a/met/src/libcode/vx_data2d_python/python_dataplane.cc +++ b/met/src/libcode/vx_data2d_python/python_dataplane.cc @@ -31,15 +31,15 @@ GlobalPython GP; // this needs external linkage static const char * user_ppath = 0; -static const char write_tmp_nc [] = "MET_BASE/wrappers/write_tmp_dataplane.py"; +static const char write_pickle [] = "MET_BASE/wrappers/write_pickle_dataplane.py"; -static const char read_tmp_nc [] = "read_tmp_dataplane"; // NO ".py" suffix +static const char read_pickle [] = "read_pickle_dataplane"; // NO ".py" suffix -static const char tmp_nc_base_name [] = "tmp_met_nc"; +static const char pickle_base_name [] = "tmp_met_pickle"; -static const char tmp_nc_var_name [] = "met_info"; +static const char pickle_var_name [] = "met_info"; -static const char tmp_nc_file_var_name [] = "tmp_nc_filename"; +static const char pickle_file_var_name [] = "pickle_filename"; //////////////////////////////////////////////////////////////////////// @@ -51,7 +51,7 @@ static bool straight_python_dataplane(const char * script_name, Grid & met_grid_out, VarInfoPython &vinfo); -static bool tmp_nc_dataplane(const char * script_name, +static bool pickle_dataplane(const char * script_name, int script_argc, char ** script_argv, const bool use_xarray, DataPlane & met_dp_out, Grid & met_grid_out, VarInfoPython &vinfo); @@ -69,9 +69,9 @@ bool python_dataplane(const char * user_script_name, bool status = false; -if ( (user_ppath = getenv(user_python_path_env)) != 0 ) { // do_tmp_nc = true; +if ( (user_ppath = getenv(user_python_path_env)) != 0 ) { // do_pickle = true; - status = tmp_nc_dataplane(user_script_name, + status = pickle_dataplane(user_script_name, user_script_argc, user_script_argv, use_xarray, met_dp_out, met_grid_out, vinfo); @@ -276,7 +276,7 @@ return ( true ); //////////////////////////////////////////////////////////////////////// -bool tmp_nc_dataplane(const char * user_script_name, +bool pickle_dataplane(const char * user_script_name, int user_script_argc, char ** user_script_argv, const bool use_xarray, DataPlane & met_dp_out, Grid & met_grid_out, VarInfoPython &vinfo) @@ -287,7 +287,7 @@ int j; int status; ConcatString command; ConcatString path; -ConcatString tmp_nc_path; +ConcatString pickle_path; const char * tmp_dir = 0; Wchar_Argv wa; @@ -301,14 +301,14 @@ if ( ! tmp_dir ) tmp_dir = default_tmp_dir; path << cs_erase << tmp_dir << '/' - << tmp_nc_base_name; + << pickle_base_name; -tmp_nc_path = make_temp_file_name(path.text(), 0); +pickle_path = make_temp_file_name(path.text(), 0); command << cs_erase << user_ppath << ' ' // user's path to python - << replace_path(write_tmp_nc) << ' ' // write_tmp_nc.py - << tmp_nc_path << ' ' // tmp_nc output filename + << replace_path(write_pickle) << ' ' // write_pickle.py + << pickle_path << ' ' // pickle output filename << user_script_name; // user's script name for (j=1; j " + mlog << Error << "\npickle_dataplane() -> " << "command \"" << command.text() << "\" failed ... status = " << status << "\n\n"; @@ -346,15 +346,15 @@ if ( PyErr_Occurred() ) { PyErr_Print(); - mlog << Warning << "\ntmp_nc_dataplane() -> " + mlog << Warning << "\npickle_dataplane() -> " << "an error occurred initializing python\n\n"; return ( false ); } -mlog << Debug(3) << "Reading temporary tmp_nc file: " - << tmp_nc_path << "\n"; +mlog << Debug(3) << "Reading temporary pickle file: " + << pickle_path << "\n"; // // set the arguments @@ -362,9 +362,9 @@ mlog << Debug(3) << "Reading temporary tmp_nc file: " StringArray a; -a.add(read_tmp_nc); +a.add(read_pickle); -a.add(tmp_nc_path); +a.add(pickle_path); wa.set(a); @@ -374,7 +374,7 @@ PySys_SetArgv (wa.wargc(), wa.wargv()); // import the python wrapper script as a module // -path = get_short_name(read_tmp_nc); +path = get_short_name(read_pickle); PyObject * module_obj = PyImport_ImportModule (path.text()); @@ -392,7 +392,7 @@ if ( PyErr_Occurred() ) { PyErr_Print(); - mlog << Warning << "\ntmp_nc_dataplane() -> " + mlog << Warning << "\npickle_dataplane() -> " << "an error occurred importing module " << '\"' << path << "\"\n\n"; @@ -402,7 +402,7 @@ if ( PyErr_Occurred() ) { if ( ! module_obj ) { - mlog << Warning << "\ntmp_nc_dataplane() -> " + mlog << Warning << "\npickle_dataplane() -> " << "error running python script\n\n"; return ( false ); @@ -410,7 +410,7 @@ if ( ! module_obj ) { } // - // read the tmp_nc file + // read the pickle file // // @@ -419,13 +419,13 @@ if ( ! module_obj ) { PyObject * module_dict_obj = PyModule_GetDict (module_obj); -PyObject * key_obj = PyUnicode_FromString (tmp_nc_var_name); +PyObject * key_obj = PyUnicode_FromString (pickle_var_name); PyObject * data_obj = PyDict_GetItem (module_dict_obj, key_obj); if ( ! data_obj || ! PyDict_Check(data_obj) ) { - mlog << Error << "\ntmp_nc_dataplane() -> " + mlog << Error << "\npickle_dataplane() -> " << "bad dict object\n\n"; exit ( 1 ); @@ -450,7 +450,7 @@ dataplane_from_numpy_array(np, attrs_dict_obj, met_dp_out, met_grid_out, vinfo); // cleanup // -remove_temp_file(tmp_nc_path); +remove_temp_file(pickle_path); // // done diff --git a/met/src/libcode/vx_python3_utils/python3_script.cc b/met/src/libcode/vx_python3_utils/python3_script.cc index 7bd567ae2c..56837b65d0 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.cc +++ b/met/src/libcode/vx_python3_utils/python3_script.cc @@ -27,8 +27,6 @@ using namespace std; static const char sq = '\''; // single quote -static const char read_tmp_ascii_py [] = "MET_BASE/wrappers/read_tmp_ascii.py"; - //////////////////////////////////////////////////////////////////////// @@ -77,12 +75,8 @@ void Python3_Script::clear() Module = 0; -ModuleAscii = 0; - Dict = 0; -DictAscii = 0; - Script_Filename.clear(); @@ -165,29 +159,14 @@ return ( var ); } -//////////////////////////////////////////////////////////////////////// - -PyObject * Python3_Script::lookup_ascii(const char * name) const - -{ - -PyObject * var = 0; - -var = PyDict_GetItemString (DictAscii, name); - -return ( var ); - -} //////////////////////////////////////////////////////////////////////// -PyObject * Python3_Script::run(const char * command) const +void Python3_Script::run(const char * command) const { -PyObject * pobj; - if ( empty(command) ) { mlog << Error << "\nPython3_Script::run(const char *) -> " @@ -197,9 +176,7 @@ if ( empty(command) ) { } -pobj = PyRun_String(command, Py_file_input, Dict, Dict); - -if ( ! pobj ) { +if ( ! PyRun_String(command, Py_file_input, Dict, Dict) ) { mlog << Error << "\nPython3_Script::run(const char *) -> " << "command \"" << command << "\" failed!\n\n"; @@ -211,7 +188,7 @@ if ( ! pobj ) { fflush(stdout); fflush(stderr); -return pobj; +return; } @@ -257,98 +234,6 @@ return; } -//////////////////////////////////////////////////////////////////////// - -void Python3_Script::import_read_tmp_ascii_py(void) - -{ - -ConcatString module; - -module << cs_erase - << replace_path(read_tmp_ascii_py); - -ConcatString command; - -run_python_string("import sys"); - -command << cs_erase - << "sys.path.append(\"" - << module.dirname().c_str() - << "\")"; - -mlog << Debug(3) << command << "\n"; - -run_python_string(command.text()); - -mlog << Debug(2) << "Importing " << module << "\n"; - -ConcatString path = "read_tmp_ascii"; - -ModuleAscii = PyImport_ImportModule(path.text()); - -if ( ! ModuleAscii ) { - - PyErr_Print(); - mlog << Error << "\nPython3_Script::Python3_Script(const char *) -> " - << "unable to import module \"" << path << "\"\n\n"; - - Py_Finalize(); - - exit ( 1 ); - -} - -DictAscii = PyModule_GetDict(ModuleAscii); - - // - // done - // - -fflush(stdout); -fflush(stderr); - -} - -//////////////////////////////////////////////////////////////////////// - -PyObject* Python3_Script::read_tmp_ascii(const char * tmp_filename) const - -{ - -mlog << Debug(2) << "Reading temporary ascii file: " - << tmp_filename << "\n"; - -ConcatString command; - -command << "read_tmp_ascii(\"" - << tmp_filename - << "\")"; - -mlog << Debug(3) << command << "\n"; - -PyErr_Clear(); - -PyObject * pobj; - -pobj = PyRun_String(command.text(), Py_file_input, DictAscii, DictAscii); - -if ( PyErr_Occurred() ) { - - mlog << Error << "\nPython3_Script::read_tmp_ascii() -> " - << "command \"" << command << "\" failed!\n\n"; - - exit ( 1 ); -} - -PyTypeObject* type = pobj->ob_type; - -const char* p = type->tp_name; - -mlog << Debug(2) << "read_tmp_ascii return type: " << p << "\n"; - -return pobj; -} //////////////////////////////////////////////////////////////////////// diff --git a/met/src/libcode/vx_python3_utils/python3_script.h b/met/src/libcode/vx_python3_utils/python3_script.h index 6930d226a5..20069762f9 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.h +++ b/met/src/libcode/vx_python3_utils/python3_script.h @@ -41,10 +41,6 @@ class Python3_Script { PyObject * Dict; // script dictionary, not allocated - PyObject * ModuleAscii; - - PyObject * DictAscii; - ConcatString Script_Filename; @@ -66,8 +62,6 @@ class Python3_Script { PyObject * module(); PyObject * dict(); - PyObject * module_ascii(); - PyObject * dict_ascii(); // // do stuff @@ -79,15 +73,10 @@ class Python3_Script { PyObject * lookup(const char * name) const; - PyObject * lookup_ascii(const char * name) const; - - PyObject * run(const char * command) const; // runs a command in the namespace of the script + void run(const char * command) const; // runs a command in the namespace of the script void read_pickle (const char * variable_name, const char * pickle_filename) const; - void import_read_tmp_ascii_py (void); - - PyObject * read_tmp_ascii (const char * tmp_filename) const; }; @@ -98,10 +87,6 @@ inline PyObject * Python3_Script::module() { return ( Module ); } inline PyObject * Python3_Script::dict() { return ( Dict ); } -inline PyObject * Python3_Script::module_ascii() { return ( ModuleAscii ); } - -inline PyObject * Python3_Script::dict_ascii() { return ( DictAscii ); } - inline ConcatString Python3_Script::filename() const { return ( Script_Filename ); } diff --git a/met/src/tools/other/ascii2nc/ascii2nc.cc b/met/src/tools/other/ascii2nc/ascii2nc.cc index 360329659c..4ced5397b1 100644 --- a/met/src/tools/other/ascii2nc/ascii2nc.cc +++ b/met/src/tools/other/ascii2nc/ascii2nc.cc @@ -43,7 +43,6 @@ // 015 03-20-19 Fillmore Add aeronetv2 and aeronetv3 options. // 016 01-30-20 Bullock Add python option. // 017 01-25-21 Halley Gotway MET #1630 Handle zero obs. -// 018 03-01-21 Fillmore Replace pickle files for temporary ascii. // //////////////////////////////////////////////////////////////////////// diff --git a/met/src/tools/other/ascii2nc/python_handler.cc b/met/src/tools/other/ascii2nc/python_handler.cc index d894ab6c64..e2733a605e 100644 --- a/met/src/tools/other/ascii2nc/python_handler.cc +++ b/met/src/tools/other/ascii2nc/python_handler.cc @@ -27,12 +27,13 @@ using namespace std; static const char generic_python_wrapper [] = "generic_python"; +static const char generic_pickle_wrapper [] = "generic_pickle"; -static const char write_tmp_ascii_wrapper[] = "MET_BASE/wrappers/write_tmp_point.py"; +static const char write_pickle_wrapper [] = "MET_BASE/wrappers/write_pickle_point.py"; static const char list_name [] = "point_data"; -static const char tmp_base_name [] = "tmp_ascii2nc"; +static const char pickle_base_name [] = "tmp_ascii2nc_pickle"; //////////////////////////////////////////////////////////////////////// @@ -56,7 +57,7 @@ PythonHandler::PythonHandler(const string &program_name) : FileHandler(program_n { -use_tmp_ascii = false; +use_pickle = false; } @@ -81,13 +82,13 @@ for (j=1; j<(a.n()); ++j) { // j starts at one here, not zero } -use_tmp_ascii = false; +use_pickle = false; const char * c = getenv(user_python_path_env); if ( c ) { - use_tmp_ascii = true; + use_pickle = true; user_path_to_python = c; @@ -230,7 +231,7 @@ bool PythonHandler::readAsciiFiles(const vector< ConcatString > &ascii_filename_ bool status = false; -if ( use_tmp_ascii ) status = do_tmp_ascii (); +if ( use_pickle ) status = do_pickle (); else status = do_straight (); return ( status ); @@ -319,10 +320,10 @@ return ( true ); // - // wrapper usage: /path/to/python wrapper.py tmp_output_filename user_script_name [ user_script args ... ] + // wrapper usage: /path/to/python wrapper.py pickle_output_filename user_script_name [ user_script args ... ] // -bool PythonHandler::do_tmp_ascii() +bool PythonHandler::do_pickle() { @@ -330,7 +331,7 @@ int j; const int N = user_script_args.n(); ConcatString command; ConcatString path; -ConcatString tmp_ascii_path; +ConcatString pickle_path; const char * tmp_dir = 0; int status; @@ -344,16 +345,15 @@ if ( ! tmp_dir ) tmp_dir = default_tmp_dir; path << cs_erase << tmp_dir << '/' - << tmp_base_name; + << pickle_base_name; -tmp_ascii_path = make_temp_file_name(path.text(), 0); -tmp_ascii_path << ".txt"; +pickle_path = make_temp_file_name(path.text(), 0); command << cs_erase - << user_path_to_python << ' ' // user's path to python - << replace_path(write_tmp_ascii_wrapper) << ' ' // write_tmp_point.py - << tmp_ascii_path << ' ' // temporary ascii output filename - << user_script_filename; // user's script name + << user_path_to_python << ' ' // user's path to python + << replace_path(write_pickle_wrapper) << ' ' // write_pickle.py + << pickle_path << ' ' // pickle output filename + << user_script_filename; // user's script name for (j=0; j " + mlog << Error << "\nPythonHandler::do_pickle() -> " << "command \"" << command.text() << "\" failed ... status = " << status << "\n\n"; @@ -375,20 +375,18 @@ if ( status ) { ConcatString wrapper; -wrapper = generic_python_wrapper; +wrapper = generic_pickle_wrapper; Python3_Script script(wrapper.text()); -script.import_read_tmp_ascii_py(); +script.read_pickle(list_name, pickle_path.text()); -PyObject * dobj = script.read_tmp_ascii(tmp_ascii_path.text()); - -PyObject * obj = script.lookup_ascii(list_name); +PyObject * obj = script.lookup(list_name); if ( ! PyList_Check(obj) ) { - mlog << Error << "\nPythonHandler::do_tmp_ascii() -> " - << "tmp ascii object is not a list!\n\n"; + mlog << Error << "\nPythonHandler::do_pickle() -> " + << "pickle object is not a list!\n\n"; exit ( 1 ); @@ -400,7 +398,7 @@ load_python_obs(obj); // cleanup // -remove_temp_file(tmp_ascii_path); +remove_temp_file(pickle_path); // // done diff --git a/met/src/tools/other/ascii2nc/python_handler.h b/met/src/tools/other/ascii2nc/python_handler.h index b0fb2ef492..abae8ddd5d 100644 --- a/met/src/tools/other/ascii2nc/python_handler.h +++ b/met/src/tools/other/ascii2nc/python_handler.h @@ -50,9 +50,9 @@ class PythonHandler : public FileHandler static string getFormatString() { return "python"; } - bool use_tmp_ascii; + bool use_pickle; - ConcatString user_path_to_python; // if we're using temporary ascii + ConcatString user_path_to_python; // if we're using pickle ConcatString user_script_filename; @@ -68,13 +68,15 @@ class PythonHandler : public FileHandler virtual bool readAsciiFiles(const vector< ConcatString > &ascii_filename_list); - bool do_tmp_ascii(); - bool do_straight (); // straight-up python, no temporary ascii + bool do_pickle (); + bool do_straight (); // straight-up python, no pickle void load_python_obs(PyObject *); // python object is list of lists bool read_obs_from_script (const char * script_name, const char * variable_name); + + bool read_obs_from_pickle (const char * pickle_name, const char * variable_name); }; From 92f0ff07be798a70c05247abba620a44db485e17 Mon Sep 17 00:00:00 2001 From: "Julie.Prestopnik" Date: Wed, 17 Mar 2021 17:41:56 -0600 Subject: [PATCH 072/165] Fixed typos, added content, and modified release date format --- met/docs/conf.py | 2 +- met/docs/index.rst | 85 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/met/docs/conf.py b/met/docs/conf.py index efa6f948c9..13f65b1b9d 100644 --- a/met/docs/conf.py +++ b/met/docs/conf.py @@ -24,7 +24,7 @@ verinfo = version release = f'{version}' release_year = '2021' -release_date = f'{release_year}0302' +release_date = f'{release_year}-03-31' copyright = f'{release_year}, {author}' # -- General configuration --------------------------------------------------- diff --git a/met/docs/index.rst b/met/docs/index.rst index 4e00f3168d..a66a482aa1 100644 --- a/met/docs/index.rst +++ b/met/docs/index.rst @@ -1,16 +1,95 @@ ===================== MET version |version| ===================== -Developed by the `Developmental Testbed Center `_, Boulder, CO +Developed by the `Developmental Testbed Center `_, +Boulder, CO .. image:: _static/METplus_banner_photo_web.png History ------- -The Model Evaluation Tools (MET) were developed by the Developmental Testbed Center (DTC) and released in January 2008. The goal of the tools was to provide the community with a platform independent and extensible framework for reproducible verification. The DTC partners, including NCAR, NOAA, and the USAF, decided to start by replicating the NOAA EMC (see list of acronyms below) Mesoscale Branch verification package, called VSDB. In the first release, MET included several pre-processing, statistical, and analysis tools to provided the primary functionality as the EMC VSDB system, and also included a spatial verification package called MODE. +The Model Evaluation Tools (MET) were developed by the Developmental Testbed +Center (DTC) and released in January 2008. The goal of the tools was to +provide the community with a platform-independent and extensible framework +for reproducible verification. +The DTC partners, including NCAR, NOAA, and the USAF, decided to start by +replicating the NOAA EMC (see list of acronyms below) Mesoscale Branch +verification package, called VSDB. +In the first release, MET included several pre-processing, statistical, +and analysis tools to provide the same primary functionality as the EMC VSDB +system, and also included a spatial verification package called MODE. -Over the years, MET and VSDB packages grew in complexity. Verification capability at other NOAA laboratories, such as ESRL, were also under heavy development. An effort to unify verification capability was first started under the HIWPP project and led by NOAA ESRL. In 2015, the NGGPS Program Office started working groups to focus on several aspects of the next gen system, including the Verification and Validation Working Group. This group made the recommendation to use MET as the foundation for a unified verification capability. In 2016, NCAR and GSD leads visited EMC to gather requirements. At that time, the concept of METplus was developed as it extends beyond the original code base. It was originally called METplus but several constraints have driven the transition to the use of METplus. METplus is now the unified verification, validation, and diagnostics capability for NOAA's UFS and a component of NCAR's SIMA modeling frameworks. It being actively developed by NCAR, ESRL, EMC and is open to community contributions. +Over the years, MET and VSDB packages grew in complexity. Verification +capability at other NOAA laboratories, such as ESRL, were also under heavy +development. An effort to unify verification capability was first started +under the HIWPP project and led by NOAA ESRL. In 2015, the NGGPS +Program Office started working groups to focus on several aspects of the +next gen system, including the Verification and Validation Working Group. +This group made the recommendation to use MET as the foundation for a +unified verification capability. In 2016, NCAR and GSD leads visited EMC +to gather requirements. At that time, the concept of METplus was developed +as it extends beyond the original code base. It was originally MET+ but +several constraints have driven the transition to the use of METplus. +METplus is now the unified verification, validation, and +diagnostics capability for NOAA's UFS and a component of NCAR's SIMA +modeling frameworks. It is being actively developed by NCAR, ESRL, EMC +and is open to community contributions. +METplus Concept +--------------- +METplus is the overarching, or umbrella, repository and hence framework for +the Unified Forecast System verification capability. It is intended to be +extensible through adding additional capability developed by the community. +The core components of the framework include MET, the associated database and +display systems called METviewer and METexpress, and a suite of Python +wrappers to provide low-level automation and examples, also called use-cases. +A description of each tool along with some ancillary repositories are as +follows: + +* **MET** - core statistical tool that matches up grids with either gridded + analyses or point observations and applies configurable methods to compute + statistics and diagnostics +* **METviewer** - core database and display system intended for deep analysis + of MET output +* **METexpress** - core database and display system intended for quick + analysis via pre-defined queries of MET output +* **METplus wrappers** - suite of Python-based wrappers that provide + low-level automation of MET tools and newly developed plotting capability +* **METplus use-cases** - configuration files and sample data to show how to + invoke METplus wrappers to make using MET tools easier and reproducible +* **METcalcpy** - suite of Python-based scripts to be used by other + components of METplus tools for statistical aggregation, event + equalization, and other analysis needs +* **METplotpy** - suite of Python-based scripts to plot MET output, + and in come cases provide additional post-processing of output prior + to plotting +* **METdatadb** - database to store MET output and to be used by both + METviewer and METexpress + +The umbrella repository will be brought together by using a software package +called `manage_externals `_ +developed by the Community Earth System Modeling (CESM) team, hosted at NCAR +and NOAA Earth System's Research Laboratory. The manage_externals paackage +was developed because CESM is comprised of a number of different components +that are developed and managed independently. Each component also may have +additional "external" dependencies that need to be maintained independently. + +Acronyms +-------- + +* **MET** - Model Evaluation Tools +* **DTC** - Developmental Testbed Center +* **NCAR** - National Center for Atmospheric Research +* **NOAA** - National Oceanic and Atmospheric Administration +* **EMC** - Environmental Modeling Center +* **VSDB** - Verification Statistics Data Base +* **MODE** - Method for Object-Based Diagnostic Evaluation +* **UFS** - Unified Forecast System +* **SIMA** -System for Integrated Modeling of the Atmosphere +* **ESRL** - Earth Systems Research Laboratory +* **HIWPP** - High Impact Weather Predication Project +* **NGGPS** - Next Generation Global Predicatio System +* **GSD** - Global Systems Division .. toctree:: :hidden: From 40fce114a3b1cca69b2cf24649f8eb98d9ce74f8 Mon Sep 17 00:00:00 2001 From: Howard Soh Date: Thu, 18 Mar 2021 08:57:10 -0600 Subject: [PATCH 073/165] #1715 Initial release --- test/config/PB2NCConfig_pbl | 163 ++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 test/config/PB2NCConfig_pbl diff --git a/test/config/PB2NCConfig_pbl b/test/config/PB2NCConfig_pbl new file mode 100644 index 0000000000..80df6014b0 --- /dev/null +++ b/test/config/PB2NCConfig_pbl @@ -0,0 +1,163 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// PB2NC configuration file. +// +// For additional information, see the MET_BASE/config/README file. +// +//////////////////////////////////////////////////////////////////////////////// + +// +// PrepBufr message type +// +message_type = ["ONLYSF", "ADPUPA"]; + +// +// Mapping of message type group name to comma-separated list of values +// Derive PRMSL only for SURFACE message types +// +message_type_group_map = [ + { key = "SURFACE"; val = "ADPSFC,SFCSHP,MSONET"; }, + { key = "ANYAIR"; val = "AIRCAR,AIRCFT"; }, + { key = "ANYSFC"; val = "ADPSFC,SFCSHP,ADPUPA,PROFLR,MSONET"; }, + { key = "ONLYSF"; val = "ADPSFC,SFCSHP"; } +]; + +// +// Mapping of input PrepBufr message types to output message types +// +message_type_map = []; + +// +// PrepBufr station ID +// +station_id = []; + +//////////////////////////////////////////////////////////////////////////////// + +// +// Observation time window +// +obs_window = { + beg = -2700; + end = 2700; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// Observation retention regions +// +mask = { + grid = ""; + poly = ""; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// Observing location elevation +// +elevation_range = { + beg = -1000; + end = 100000; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// Observation types +// +pb_report_type = [ 120, 220, 221, 122, 222, 223, 224, 131, 133, 233, 153, 156, 157, 180, 280, 181, 182, 281, 282, 183, 284, 187, 287 ]; + +in_report_type = []; + +instrument_type = []; + +//////////////////////////////////////////////////////////////////////////////// + +// +// Vertical levels to retain +// +level_range = { + beg = 1; + end = 511; +} + +level_category = [0, 1, 4, 5, 6]; + +/////////////////////////////////////////////////////////////////////////////// + +// +// BUFR variable names to retain or derive. +// Use obs_bufr_map to rename variables in the output. +// If empty, process all available variables. +// +obs_bufr_var = ["TOB", "UOB", "VOB", "TOCC", "D_RH", "TDO", "PMO", "HOVI", "CEILING", "MXGS", "D_CAPE", "D_PBL"]; +//obs_bufr_var = ["TOB", "UOB", "VOB", "TOCC", "D_RH", "TDO", "PMO", "HOVI", "CEILING", "MXGS", "D_CAPE"]; +//////////////////////////////////////////////////////////////////////////////// + +// +// Mapping of input BUFR variable names to output variables names. +// The default PREPBUFR map, obs_prepbufr_map, is appended to this map. +// +obs_bufr_map = []; + +// +// Default mapping for PREPBUFR. Replace input BUFR variable names with GRIB +// abbreviations in the output. This default map is appended to obs_bufr_map. +// This should not typically be overridden. +// +obs_prefbufr_map = [ + { key = "POB"; val = "PRES"; }, + { key = "QOB"; val = "SPFH"; }, + { key = "TOB"; val = "TMP"; }, + { key = "UOB"; val = "UGRD"; }, + { key = "VOB"; val = "VGRD"; }, + { key = "D_DPT"; val = "DPT"; }, + { key = "D_WDIR"; val = "WDIR"; }, + { key = "D_WIND"; val = "WIND"; }, + { key = "D_RH"; val = "RH"; }, + { key = "D_MIXR"; val = "MIXR"; }, + { key = "D_PBL"; val = "HPBL"; }, + { key = "D_PRMSL"; val = "PRMSL"; }, + { key = "D_CAPE"; val = "CAPE"; }, + { key = "TDO"; val = "DPT"; }, + { key = "PMO"; val = "PRMSL"; }, + { key = "TOCC"; val = "TCDC"; }, + { key = "HOVI"; val = "VIS"; }, + { key = "CEILING"; val = "HGT"; }, + { key = "MXGS"; val = "GUST"; } +]; + +//////////////////////////////////////////////////////////////////////////////// + +quality_mark_thresh = 9; +event_stack_flag = TOP; + +//////////////////////////////////////////////////////////////////////////////// + +// +// Time periods for the summarization +// obs_var (string array) is added and works like grib_code (int array) +// when use_var_id is enabled and variable names are saved. +// +time_summary = { + flag = FALSE; + raw_data = FALSE; + beg = "000000"; + end = "235959"; + step = 300; + width = 600; + grib_code = []; + obs_var = [ "TMP", "WDIR", "RH" ]; + type = [ "min", "max", "range", "mean", "stdev", "median", "p80" ]; + vld_freq = 0; + vld_thresh = 0.0; +} + +//////////////////////////////////////////////////////////////////////////////// + +tmp_dir = "/tmp"; +version = "V10.0"; + +//////////////////////////////////////////////////////////////////////////////// From 1ac92d7ea4e71500b9afe7d83cb797db44c42d2b Mon Sep 17 00:00:00 2001 From: Howard Soh Date: Thu, 18 Mar 2021 08:59:15 -0600 Subject: [PATCH 074/165] #1715 Do not combined if there are no overlapping beteewn TQZ and UV records --- met/src/tools/other/pb2nc/pb2nc.cc | 74 ++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 20 deletions(-) diff --git a/met/src/tools/other/pb2nc/pb2nc.cc b/met/src/tools/other/pb2nc/pb2nc.cc index b2b6eba1fe..97048d444d 100644 --- a/met/src/tools/other/pb2nc/pb2nc.cc +++ b/met/src/tools/other/pb2nc/pb2nc.cc @@ -2920,16 +2920,27 @@ int combine_tqz_and_uv(map pqtzuv_map_tq, float *pqtzuv_tq, *pqtzuv_uv; float *pqtzuv_merged = (float *) 0; float *next_pqtzuv, *prev_pqtzuv; + float tq_pres_max, tq_pres_min, uv_pres_max, uv_pres_min; std::map::iterator it, it_tq, it_uv; // Gets pressure levels for TQZ records - for (it=pqtzuv_map_tq.begin(); it!=pqtzuv_map_tq.end(); ++it) { - tq_levels.add(int(it->first)); + it = pqtzuv_map_tq.begin(); + tq_pres_min = tq_pres_max = it->first; + for (; it!=pqtzuv_map_tq.end(); ++it) { + float pres_v = it->first; + if (tq_pres_min > pres_v) tq_pres_min = pres_v; + if (tq_pres_max < pres_v) tq_pres_max = pres_v; + tq_levels.add(nint(pres_v)); } // Gets pressure levels for common records - for (it=pqtzuv_map_uv.begin(); it!=pqtzuv_map_uv.end(); ++it) { - if (tq_levels.has(int(it->first))) { - common_levels.add(int(it->first)); + it = pqtzuv_map_uv.begin(); + uv_pres_min = uv_pres_max = it->first; + for (; it!=pqtzuv_map_uv.end(); ++it) { + float pres_v = it->first; + if (uv_pres_min > pres_v) uv_pres_min = pres_v; + if (uv_pres_max < pres_v) uv_pres_max = pres_v; + if (tq_levels.has(nint(pres_v))) { + common_levels.add(nint(pres_v)); } } @@ -2937,22 +2948,37 @@ int combine_tqz_and_uv(map pqtzuv_map_tq, log_tqz_and_uv(pqtzuv_map_tq, pqtzuv_map_uv, method_name); } + bool no_overlap = (tq_pres_max < uv_pres_min) || (tq_pres_min > uv_pres_max); + mlog << Debug(6) << method_name << "TQZ pressures: " << tq_pres_max + << " to " << tq_pres_min << " UV pressures: " << uv_pres_max + << " to " << uv_pres_min << (no_overlap ? " no overlap!" : " overlapping") << "\n"; + if( no_overlap ) { + mlog << Warning << method_name + << "Can not combine TQ and UV records because of no overlapping.\n"; + mlog << Warning << " TQZ record count: " << tq_count + << ", UV record count: " << uv_count + << " common_levels: " << common_levels.n() << "\n"; + return pqtzuv_map_merged.size(); + } + // Select first record by 1) merging two records with the same pressure // level or 2) interpolate + int tq_pres, uv_pres; next_pqtzuv = (float *)0; it_tq = pqtzuv_map_tq.begin(); it_uv = pqtzuv_map_uv.begin(); pqtzuv_tq = (float *)it_tq->second; pqtzuv_uv = (float *)it_uv->second;; pqtzuv_merged = new float[mxr8vt]; - if (common_levels.has(int(it_tq->first)) - || common_levels.has(int(it_uv->first))) { + tq_pres = nint(it_tq->first); + uv_pres = nint(it_uv->first); + if (common_levels.has(tq_pres) || common_levels.has(uv_pres)) { // Found the records with the same precsure level - if (it_tq->first != it_uv->first) { - if (common_levels.has(int(it_uv->first))) { + if (tq_pres != uv_pres) { + if (common_levels.has(uv_pres)) { pqtzuv_uv = pqtzuv_map_uv[it_uv->first]; } - else if (common_levels.has(int(it_tq->first))) { + else if (common_levels.has(tq_pres)) { pqtzuv_tq = pqtzuv_map_tq[it_tq->first]; } } @@ -2968,7 +2994,7 @@ int combine_tqz_and_uv(map pqtzuv_map_tq, prev_pqtzuv = (float *)it_uv->second; ++it_uv; } - next_pqtzuv = it_uv->second; + next_pqtzuv = (float *)it_uv->second; } else { //Interpolate TQZ into UV @@ -2978,7 +3004,7 @@ int combine_tqz_and_uv(map pqtzuv_map_tq, prev_pqtzuv = (float *)it_tq->second; ++it_tq; } - next_pqtzuv = it_tq->second; + next_pqtzuv = (float *)it_tq->second; } interpolate_pqtzuv(prev_pqtzuv, pqtzuv_merged, next_pqtzuv); } @@ -2996,6 +3022,7 @@ int combine_tqz_and_uv(map pqtzuv_map_tq, if(mlog.verbosity_level() >= PBL_DEBUG_LEVEL) { log_merged_tqz_uv(pqtzuv_map_tq, pqtzuv_map_uv, pqtzuv_map_merged, method_name); } + delete [] pqtzuv_merged; } return pqtzuv_map_merged.size(); @@ -3048,7 +3075,7 @@ float compute_pbl(map pqtzuv_map_tq, pbl_data_vgrd[index] = pqtzuv[5]; if (!is_eq(pbl_data_spfh[index], bad_data_float)) spfh_cnt++; if (!is_eq(pbl_data_hgt[index], bad_data_float)) hgt_cnt++; - selected_levels.add(int(it->first)); + selected_levels.add(nint(it->first)); } index--; @@ -3070,7 +3097,7 @@ float compute_pbl(map pqtzuv_map_tq, if (!is_eq(highest_pressure, bad_data_float)) { index = MAX_PBL_LEVEL - 1; for (; it!=pqtzuv_map_tq.end(); ++it) { - int pres_level = int(it->first); + int pres_level = nint(it->first); if (selected_levels.has(pres_level)) break; float *pqtzuv = pqtzuv_map_merged[it->first]; @@ -3192,9 +3219,14 @@ int interpolate_by_pressure(int length, float *pres_data, float *var_data) { << var_data[idx_start] << " and " << var_data[idx_end] << "\n"; float data_diff = var_data[idx_end] - var_data[idx_start]; for (idx2 = idx_start+1; idx2 pqtzuv_map_pivot, if (first_pres < it_pivot->first) break; } mlog << Debug(8) << method_name << "pivot->first: " << it_pivot->first - << " aux->first " << it_aux->first << " first_pres: " << first_pres - << " prev_pqtzuv[0]" << prev_pqtzuv[0] << "\n"; + << " aux->first: " << it_aux->first << " first_pres: " << first_pres + << " prev_pqtzuv[0]: " << prev_pqtzuv[0] << "\n"; // Find next UV level for (; it_aux!=pqtzuv_map_aux.end(); ++it_aux) { // Skip the records below the first mathcing/interpolated level From 9a9713545d232a2230aab7e69ec5f498e1578816 Mon Sep 17 00:00:00 2001 From: Howard Soh Date: Thu, 18 Mar 2021 08:59:58 -0600 Subject: [PATCH 075/165] #1715 Added pb2nc_compute_pbl_cape --- test/xml/unit_pb2nc.xml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/xml/unit_pb2nc.xml b/test/xml/unit_pb2nc.xml index a65f52110d..89ba3c0d30 100644 --- a/test/xml/unit_pb2nc.xml +++ b/test/xml/unit_pb2nc.xml @@ -131,6 +131,25 @@ + + &MET_BIN;/pb2nc + + STATION_ID + MASK_GRID + MASK_POLY + QUALITY_MARK_THRESH 2 + + \ + &DATA_DIR_OBS;/prepbufr/nam.20210311.t00z.prepbufr.tm00 \ + &OUTPUT_DIR;/pb2nc/nam.20210311.t00z.prepbufr.tm00.nc \ + &CONFIG_DIR;/PB2NCConfig_pbl \ + -v 1 + + + &OUTPUT_DIR;/pb2nc/nam.20210311.t00z.prepbufr.tm00.nc + + + &MET_BIN;/pb2nc From edb124ba2e74245bf9fed32a062dbcd85451facc Mon Sep 17 00:00:00 2001 From: Howard Soh Date: Thu, 18 Mar 2021 09:08:04 -0600 Subject: [PATCH 076/165] #1715 Added pb2nc_compute_pbl_cape --- test/xml/unit_pb2nc.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/xml/unit_pb2nc.xml b/test/xml/unit_pb2nc.xml index 89ba3c0d30..0366d902f9 100644 --- a/test/xml/unit_pb2nc.xml +++ b/test/xml/unit_pb2nc.xml @@ -141,12 +141,12 @@ \ &DATA_DIR_OBS;/prepbufr/nam.20210311.t00z.prepbufr.tm00 \ - &OUTPUT_DIR;/pb2nc/nam.20210311.t00z.prepbufr.tm00.nc \ + &OUTPUT_DIR;/pb2nc/nam.20210311.t00z.prepbufr.tm00.pbl.nc \ &CONFIG_DIR;/PB2NCConfig_pbl \ -v 1 - &OUTPUT_DIR;/pb2nc/nam.20210311.t00z.prepbufr.tm00.nc + &OUTPUT_DIR;/pb2nc/nam.20210311.t00z.prepbufr.tm00.pbl.nc From aefabdb867e2741c52a1ee6137dfd02c2fb70c5b Mon Sep 17 00:00:00 2001 From: Howard Soh Date: Thu, 18 Mar 2021 13:31:14 -0600 Subject: [PATCH 077/165] #1715 Reduced obs_bufr_var. Removed pb_report_type --- test/config/PB2NCConfig_pbl | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/config/PB2NCConfig_pbl b/test/config/PB2NCConfig_pbl index 80df6014b0..eeedd7a3e4 100644 --- a/test/config/PB2NCConfig_pbl +++ b/test/config/PB2NCConfig_pbl @@ -67,7 +67,7 @@ elevation_range = { // // Observation types // -pb_report_type = [ 120, 220, 221, 122, 222, 223, 224, 131, 133, 233, 153, 156, 157, 180, 280, 181, 182, 281, 282, 183, 284, 187, 287 ]; +pb_report_type = []; in_report_type = []; @@ -92,8 +92,7 @@ level_category = [0, 1, 4, 5, 6]; // Use obs_bufr_map to rename variables in the output. // If empty, process all available variables. // -obs_bufr_var = ["TOB", "UOB", "VOB", "TOCC", "D_RH", "TDO", "PMO", "HOVI", "CEILING", "MXGS", "D_CAPE", "D_PBL"]; -//obs_bufr_var = ["TOB", "UOB", "VOB", "TOCC", "D_RH", "TDO", "PMO", "HOVI", "CEILING", "MXGS", "D_CAPE"]; +obs_bufr_var = ["D_CAPE", "D_PBL"]; //////////////////////////////////////////////////////////////////////////////// // From b7fb7c1c0386e2c7aa4f44c97d3d3766e4981164 Mon Sep 17 00:00:00 2001 From: Howard Soh Date: Thu, 18 Mar 2021 13:41:32 -0600 Subject: [PATCH 078/165] #1715 Added a blank line for Error/Warning --- met/src/tools/other/pb2nc/pb2nc.cc | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/met/src/tools/other/pb2nc/pb2nc.cc b/met/src/tools/other/pb2nc/pb2nc.cc index 97048d444d..b36095ccf5 100644 --- a/met/src/tools/other/pb2nc/pb2nc.cc +++ b/met/src/tools/other/pb2nc/pb2nc.cc @@ -2428,7 +2428,7 @@ void write_netcdf_hdr_data() { // Check for no messages retained if(dim_count <= 0) { - mlog << Error << method_name << " -> " + mlog << Error << "\n" << method_name << " -> " << "No PrepBufr messages retained. Nothing to write.\n\n"; // Delete the NetCDF file remove_temp_file(ncfile); @@ -2950,14 +2950,13 @@ int combine_tqz_and_uv(map pqtzuv_map_tq, bool no_overlap = (tq_pres_max < uv_pres_min) || (tq_pres_min > uv_pres_max); mlog << Debug(6) << method_name << "TQZ pressures: " << tq_pres_max - << " to " << tq_pres_min << " UV pressures: " << uv_pres_max + << " to " << tq_pres_min << " UV pressures: " << uv_pres_max << " to " << uv_pres_min << (no_overlap ? " no overlap!" : " overlapping") << "\n"; if( no_overlap ) { - mlog << Warning << method_name - << "Can not combine TQ and UV records because of no overlapping.\n"; - mlog << Warning << " TQZ record count: " << tq_count - << ", UV record count: " << uv_count - << " common_levels: " << common_levels.n() << "\n"; + mlog << Warning << "\n" << method_name + << "Can not combine TQ and UV records because of no overlapping." + << " TQZ count: " << tq_count << ", UV count: " << uv_count + << " common_levels: " << common_levels.n() << "\n\n"; return pqtzuv_map_merged.size(); } @@ -3061,7 +3060,7 @@ float compute_pbl(map pqtzuv_map_tq, hgt_cnt = spfh_cnt = 0; for (it=pqtzuv_map_merged.begin(); it!=pqtzuv_map_merged.end(); ++it) { if (index < 0) { - mlog << Error << method_name << "negative index: " << index << "\n"; + mlog << Error << "\n" << method_name << "negative index: " << index << "\n\n"; break; } @@ -3081,7 +3080,7 @@ float compute_pbl(map pqtzuv_map_tq, index--; } if (index != -1) { - mlog << Error << method_name << "Missing some levels (" << index << ")\n"; + mlog << Error << "\n" << method_name << "Missing some levels (" << index << ")\n"; } if (pbl_level > MAX_PBL_LEVEL) { @@ -3166,10 +3165,10 @@ void insert_pbl(float *obs_arr, const float pbl_value, const int pbl_code, hdr_info << unix_to_yyyymmdd_hhmmss(hdr_vld_ut) << " " << hdr_typ << " " << hdr_sid; if (is_eq(pbl_value, bad_data_float)) { - mlog << Warning << "Failed to compute PBL " << hdr_info << "\n\n"; + mlog << Warning << "\nFailed to compute PBL " << hdr_info << "\n\n"; } else if (pbl_value < hdr_elv) { - mlog << Warning << "Not saved because the computed PBL (" << pbl_value + mlog << Warning << "\nNot saved because the computed PBL (" << pbl_value << ") is less than the station elevation (" << hdr_elv << "). " << hdr_info << "\n\n"; obs_arr[4] = 0; @@ -3183,7 +3182,7 @@ void insert_pbl(float *obs_arr, const float pbl_value, const int pbl_code, << " lat: " << hdr_lat << ", lon: " << hdr_lon << ", elv: " << hdr_elv << " " << hdr_info << "\n\n"; if (obs_arr[4] > MAX_PBL) { - mlog << Warning << " Computed PBL (" << obs_arr[4] << " from " + mlog << Warning << "\nComputed PBL (" << obs_arr[4] << " from " << pbl_value << ") is too high, Reset to " << MAX_PBL << " " << hdr_info<< "\n\n"; obs_arr[4] = MAX_PBL; @@ -3254,10 +3253,10 @@ void interpolate_pqtzuv(float *prev_pqtzuv, float *cur_pqtzuv, float *next_pqtzu if ((nint(prev_pqtzuv[0]) == nint(cur_pqtzuv[0])) || (nint(next_pqtzuv[0]) == nint(cur_pqtzuv[0])) || (nint(prev_pqtzuv[0]) == nint(next_pqtzuv[0]))) { - mlog << Error << method_name + mlog << Error << "\n" << method_name << " Can't interpolate because of same pressure levels. prev: " << prev_pqtzuv[0] << ", cur: " << cur_pqtzuv[0] - << ", next: " << prev_pqtzuv[0] << "\n"; + << ", next: " << prev_pqtzuv[0] << "\n\n"; } else { float p_ratio = (cur_pqtzuv[0] - prev_pqtzuv[0]) / (next_pqtzuv[0] - prev_pqtzuv[0]); From 8dbef78ebac8b2501e6a50ac127a69b836f1a17a Mon Sep 17 00:00:00 2001 From: johnhg Date: Thu, 18 Mar 2021 22:31:45 -0600 Subject: [PATCH 079/165] Per #1725, return good status from TrackInfoArray::add() when using an ATCF line to create a new track. (#1726) --- met/src/libcode/vx_tc_util/track_info.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/met/src/libcode/vx_tc_util/track_info.cc b/met/src/libcode/vx_tc_util/track_info.cc index b7c443c0f3..312d9aa620 100644 --- a/met/src/libcode/vx_tc_util/track_info.cc +++ b/met/src/libcode/vx_tc_util/track_info.cc @@ -801,6 +801,7 @@ bool TrackInfoArray::add(const ATCFTrackLine &l, bool check_dup, bool check_anly TrackInfo t; t.add(l, check_dup, check_anly); Track.push_back(t); + status = true; } return(status); From 5866b2ac1b80dd8f3783e358feba3da2f269d7ff Mon Sep 17 00:00:00 2001 From: johnhg Date: Thu, 18 Mar 2021 23:03:30 -0600 Subject: [PATCH 080/165] Per #1705, update the threshold node heirarchy by adding a climo_prob() function to determine the climatological probability of a CDP-type threshold. Also update derive_climo_prob() in pair_base.cc to call the new climo_prob() function. (#1724) --- met/src/basic/vx_config/threshold.cc | 150 +++++++++++++++++++++ met/src/basic/vx_config/threshold.h | 29 ++-- met/src/libcode/vx_statistics/pair_base.cc | 39 +----- 3 files changed, 177 insertions(+), 41 deletions(-) diff --git a/met/src/basic/vx_config/threshold.cc b/met/src/basic/vx_config/threshold.cc index 7879f7090a..b75ec9784a 100644 --- a/met/src/basic/vx_config/threshold.cc +++ b/met/src/basic/vx_config/threshold.cc @@ -166,6 +166,37 @@ return ( n ); //////////////////////////////////////////////////////////////////////// +double Or_Node::climo_prob() const + +{ + +if ( !left_child || !right_child ) { + + mlog << Error << "\nOr_Node::climo_prob() -> " + << "node not populated!\n\n"; + + exit ( 1 ); + +} + +double prob = bad_data_double; +double prob_left = left_child->climo_prob(); +double prob_right = right_child->climo_prob(); + +if ( !is_bad_data(prob_left) && !is_bad_data(prob_right) ) { + + prob = min(prob_left + prob_right, 1.0); + +} + +return ( prob ); + +} + + +//////////////////////////////////////////////////////////////////////// + + bool Or_Node::need_perc() const { @@ -356,6 +387,55 @@ return ( n ); //////////////////////////////////////////////////////////////////////// +double And_Node::climo_prob() const + +{ + +if ( !left_child || !right_child ) { + + mlog << Error << "\nAnd_Node::climo_prob() -> " + << "node not populated!\n\n"; + + exit ( 1 ); + +} + +double prob = bad_data_double; +double prob_left = left_child->climo_prob(); +double prob_right = right_child->climo_prob(); + + // + // For opposing inequalities, compute the difference in percentiles + // + +if ( !is_bad_data(prob_left) && !is_bad_data(prob_right) ) { + + // + // Support complex threshold types >a&&b + // + + if ( ( left_child->type() == thresh_gt || left_child->type() == thresh_ge ) && + ( right_child->type() == thresh_lt || right_child->type() == thresh_le ) ) { + + prob = max( 0.0, prob_right - ( 1.0 - prob_left ) ); + + } + else if ( ( left_child->type() == thresh_lt || left_child->type() == thresh_le ) && + ( right_child->type() == thresh_gt || right_child->type() == thresh_ge ) ) { + + prob = max( 0.0, prob_left - ( 1.0 - prob_right ) ); + + } +} + +return ( prob ); + +} + + +//////////////////////////////////////////////////////////////////////// + + bool And_Node::need_perc() const { @@ -540,6 +620,23 @@ return ( n ); //////////////////////////////////////////////////////////////////////// +double Not_Node::climo_prob() const + +{ + +double prob = bad_data_double; +double prob_child = child->climo_prob(); + +if ( !is_bad_data(prob_child) ) prob = 1.0 - prob_child; + +return ( prob ); + +} + + +//////////////////////////////////////////////////////////////////////// + + bool Not_Node::need_perc() const { @@ -1065,6 +1162,59 @@ return; //////////////////////////////////////////////////////////////////////// +double Simple_Node::climo_prob() const + +{ + +double prob = bad_data_double; + +if ( Ptype == perc_thresh_climo_dist ) { + + // Climo probability varies based on the threshold type + switch ( op ) { + + case thresh_lt: + case thresh_le: + + prob = PT/100.0; + break; + + case thresh_eq: + + prob = 0.0; + break; + + case thresh_ne: + + prob = 1.0; + break; + + case thresh_gt: + case thresh_ge: + + prob = 1.0 - PT/100.0; + break; + + default: + + mlog << Error << "\nSimple_Node::climo_prob() -> " + << "cannot convert climatological distribution percentile " + << "threshold to a probability!\n\n"; + + exit ( 1 ); + break; + + } // switch +} + +return ( prob ); + +} + + +//////////////////////////////////////////////////////////////////////// + + bool Simple_Node::need_perc() const { diff --git a/met/src/basic/vx_config/threshold.h b/met/src/basic/vx_config/threshold.h index ebca96a81c..493173e58d 100644 --- a/met/src/basic/vx_config/threshold.h +++ b/met/src/basic/vx_config/threshold.h @@ -157,6 +157,8 @@ class ThreshNode { virtual double pvalue() const = 0; + virtual double climo_prob() const = 0; + virtual bool need_perc() const = 0; virtual void set_perc(const NumArray *, const NumArray *, const NumArray *) = 0; @@ -197,6 +199,8 @@ class Or_Node : public ThreshNode { double pvalue() const; + double climo_prob() const; + bool need_perc() const; void set_perc(const NumArray *, const NumArray *, const NumArray *); @@ -217,10 +221,10 @@ class Or_Node : public ThreshNode { //////////////////////////////////////////////////////////////////////// -inline ThreshType Or_Node::type() const { return ( thresh_complex ); } -inline double Or_Node::value() const { return ( bad_data_double ); } -inline PercThreshType Or_Node::ptype() const { return ( no_perc_thresh_type ); } -inline double Or_Node::pvalue() const { return ( bad_data_double ); } +inline ThreshType Or_Node::type() const { return ( thresh_complex ); } +inline double Or_Node::value() const { return ( bad_data_double ); } +inline PercThreshType Or_Node::ptype() const { return ( no_perc_thresh_type ); } +inline double Or_Node::pvalue() const { return ( bad_data_double ); } //////////////////////////////////////////////////////////////////////// @@ -244,6 +248,8 @@ class And_Node : public ThreshNode { double pvalue() const; + double climo_prob() const; + bool need_perc() const; void set_perc(const NumArray *, const NumArray *, const NumArray *); @@ -293,6 +299,8 @@ class Not_Node : public ThreshNode { double pvalue() const; + double climo_prob() const; + bool need_perc() const; void set_perc(const NumArray *, const NumArray *, const NumArray *); @@ -363,6 +371,8 @@ class Simple_Node : public ThreshNode { double pvalue() const; + double climo_prob() const; + bool need_perc() const; void get_simple_nodes(vector &) const; @@ -435,6 +445,7 @@ class SingleThresh { double get_value() const; PercThreshType get_ptype() const; double get_pvalue() const; + double get_climo_prob() const; void get_simple_nodes(vector &) const; void multiply_by(const double); @@ -451,11 +462,11 @@ class SingleThresh { //////////////////////////////////////////////////////////////////////// -inline ThreshType SingleThresh::get_type() const { return ( node ? node->type() : thresh_na ); } -inline double SingleThresh::get_value() const { return ( node ? node->value() : bad_data_double ); } -inline PercThreshType SingleThresh::get_ptype() const { return ( node ? node->ptype() : no_perc_thresh_type ); } -inline double SingleThresh::get_pvalue() const { return ( node ? node->pvalue() : bad_data_double ); } - +inline ThreshType SingleThresh::get_type() const { return ( node ? node->type() : thresh_na ); } +inline double SingleThresh::get_value() const { return ( node ? node->value() : bad_data_double ); } +inline PercThreshType SingleThresh::get_ptype() const { return ( node ? node->ptype() : no_perc_thresh_type ); } +inline double SingleThresh::get_pvalue() const { return ( node ? node->pvalue() : bad_data_double ); } +inline double SingleThresh::get_climo_prob() const { return ( node ? node->climo_prob() : bad_data_double ); } //////////////////////////////////////////////////////////////////////// diff --git a/met/src/libcode/vx_statistics/pair_base.cc b/met/src/libcode/vx_statistics/pair_base.cc index 8066ed262f..0fe6a1b006 100644 --- a/met/src/libcode/vx_statistics/pair_base.cc +++ b/met/src/libcode/vx_statistics/pair_base.cc @@ -1064,46 +1064,21 @@ NumArray derive_climo_prob(const ClimoCDFInfo &cdf_info, const NumArray &mn_na, const NumArray &sd_na, const SingleThresh &othresh) { int i, n_mn, n_sd; - double prob; NumArray climo_prob, climo_vals; + double prob; // Number of valid climo mean and standard deviation n_mn = mn_na.n_valid(); n_sd = sd_na.n_valid(); - // For CDP threshold types, the climo probability is constant - if(othresh.get_ptype() == perc_thresh_climo_dist) { - - // Climo probability varies based on the threshold type - switch(othresh.get_type()) { - - case thresh_lt: - case thresh_le: - prob = othresh.get_pvalue()/100.0; - break; - - case thresh_eq: - prob = 0.0; - break; - - case thresh_ne: - prob = 1.0; - break; + // Check for constant climo probability + if(!is_bad_data(prob = othresh.get_climo_prob())) { - case thresh_gt: - case thresh_ge: - prob = 1.0 - othresh.get_pvalue()/100.0; - break; - - default: - mlog << Error << "\nderive_climo_prob() -> " - << "climatological threshold \"" << othresh.get_str() - << "\" cannot be converted to a probability!\n\n"; - exit(1); - break; - } + mlog << Debug(4) + << "For threshold " << othresh.get_str() + << ", using a constant climatological probability value of " + << prob << ".\n"; - // Add constant climo probability value climo_prob.add_const(prob, n_mn); } // If both mean and standard deviation were provided, use them to From 1a9f73a97b41565808717a08fec168182dbacccf Mon Sep 17 00:00:00 2001 From: johnhg Date: Thu, 18 Mar 2021 23:04:00 -0600 Subject: [PATCH 081/165] Bugfix 1716 develop perc_thresh (#1722) * Per #1716, committing changes from Randy Bullock to support floating point percentile thresholds. * Per #1716, no code changes, just consistent formatting. * Per #1716, change SFP50 example to SFP33.3 to show an example of using floating point percentile values. --- met/docs/Users_Guide/config_options.rst | 2 +- met/src/basic/vx_config/my_config_scanner.cc | 78 ++++++++++---------- 2 files changed, 41 insertions(+), 39 deletions(-) diff --git a/met/docs/Users_Guide/config_options.rst b/met/docs/Users_Guide/config_options.rst index 564e222e95..d8acbab286 100644 --- a/met/docs/Users_Guide/config_options.rst +++ b/met/docs/Users_Guide/config_options.rst @@ -81,7 +81,7 @@ The configuration file language supports the following data types: * The following percentile threshold types are supported: * "SFP" for a percentile of the sample forecast values. - e.g. ">SFP50" means greater than the 50-th forecast percentile. + e.g. ">SFP33.3" means greater than the 33.3-rd forecast percentile. * "SOP" for a percentile of the sample observation values. e.g. ">SOP75" means greater than the 75-th observation percentile. diff --git a/met/src/basic/vx_config/my_config_scanner.cc b/met/src/basic/vx_config/my_config_scanner.cc index 57246913cf..1acae0582b 100644 --- a/met/src/basic/vx_config/my_config_scanner.cc +++ b/met/src/basic/vx_config/my_config_scanner.cc @@ -169,6 +169,8 @@ static bool replace_env(ConcatString &); static bool is_fort_thresh_no_spaces(); +static bool is_simple_perc_thresh(); + static int do_simple_perc_thresh(); @@ -370,6 +372,8 @@ if ( is_float_v2() ) { if ( do_float() ) return ( token(FLOAT) ); } if ( is_fort_thresh_no_spaces() ) { return ( do_fort_thresh() ); } +if ( is_simple_perc_thresh() ) { return ( do_simple_perc_thresh() ); } + int t; if ( is_id() ) { t = do_id(); return ( token(t) ); } @@ -533,7 +537,6 @@ if ( is_lhs ) { strncpy(configlval.text, configtext, max_id_length); return ( if ( strcmp(configtext, "print" ) == 0 ) { return ( PRINT ); } - // // boolean? // @@ -554,17 +557,13 @@ for (j=0; jlookup(configtext); if ( e && (e->is_number()) && (! is_lhs) ) { - // cout << "=================== id = \"" << configtext << "\" is_lhs = " << (is_lhs ? "true" : "false") << "\n"; - - // cout << "do_id() -> \n"; - // e->dump(cout); - if ( e->type() == IntegerType ) { set_int(configlval.nval, e->i_value()); @@ -613,28 +607,20 @@ if ( e && (! is_lhs) && (e->type() == UserFunctionType) ) { } - /////////////////////////////////////////////////////////////////////// - - - - // // fortran threshold without spaces? (example: "le150") // -if ( (strncmp(configtext, "lt", 2) == 0) && is_number(configtext + 2, max_id_length - 2) ) { return ( do_fort_thresh() ); } - for (j=0; j " @@ -1482,11 +1493,8 @@ if ( index < 0 ) { } - configlval.pc_info.perc_index = index; -// configlval.pc_info.is_simple = true; -configlval.pc_info.value = value; -// configlval.pc_info.value2 = bad_data_double;; +configlval.pc_info.value = value; return ( SIMPLE_PERC_THRESH ); @@ -1495,9 +1503,3 @@ return ( SIMPLE_PERC_THRESH ); //////////////////////////////////////////////////////////////////////// - - - - - - From 8dfd7c075df6e59cc2714c41f9d35fe04fb3eb13 Mon Sep 17 00:00:00 2001 From: johnhg Date: Fri, 19 Mar 2021 12:32:00 -0600 Subject: [PATCH 082/165] Update pull_request_template.md --- .github/pull_request_template.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index b85706f034..a475d51459 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -4,7 +4,9 @@ - [ ] Recommend testing for the reviewer(s) to perform, including the location of input datasets, and any additional instructions:
-- [ ] Do these changes include sufficient documentation and testing updates? **[Yes or No]** +- [ ] Do these changes include sufficient documentation updates, ensuring that no errors or warnings exist in the build of the documentation? **[Yes or No]** + +- [ ] Do these changes include sufficient testing updates? **[Yes or No]** - [ ] Will this PR result in changes to the test suite? **[Yes or No]**
If **yes**, describe the new output and/or changes to the existing output:
From e2f77e44518877aaf75682ad4cfb78a730af0044 Mon Sep 17 00:00:00 2001 From: johnhg Date: Mon, 29 Mar 2021 10:33:31 -0600 Subject: [PATCH 083/165] Feature 1733 exc (#1734) * Per #1733, add column_exc_name, column_exc_val, init_exc_name, and init_exc_val options to the TCStat config files. * Per #1733, enhance tc_stat to support the column_exc and init_exc config file and job command filtering options. * Per #1733, update stat_analysis to support the -column_exc job filtering option. Still need to update docuementation and add unit tests. * Per #1773, update the user's guide with the new config and job command options. * Per #1733, add call to stat_analysis to exercise -column_str and -column_exc options. * Per #1733, I ran into a namespace conflict in tc_stat where -init_exc was used for to filter by time AND my string value. So I switched to using -init_str_exc instead. And made the corresponding change to -column_str_exc in stat_analysis and tc_stat. Also changed internal variable names to use IncMap and ExcMap to keep the logic clear. * Per #1733, tc_stat config file updates to switch from column_exc and init_exc to column_str_exc and init_str_exc. * Per #1733, add tc_stat and stat_analysis jobs to exercise the string filtering options. --- met/data/config/TCStatConfig_default | 12 + met/docs/Users_Guide/config_options.rst | 16 +- met/docs/Users_Guide/config_options_tc.rst | 52 ++- met/docs/Users_Guide/gsi-tools.rst | 4 +- met/docs/Users_Guide/stat-analysis.rst | 15 +- met/docs/Users_Guide/tc-stat.rst | 24 +- met/src/basic/vx_config/config_constants.h | 4 + met/src/libcode/vx_analysis_util/stat_job.cc | 77 +++- met/src/libcode/vx_analysis_util/stat_job.h | 3 +- .../tc_utils/tc_stat/tc_stat_conf_info.cc | 219 +++++----- met/src/tools/tc_utils/tc_stat/tc_stat_job.cc | 379 +++++++++++------- met/src/tools/tc_utils/tc_stat/tc_stat_job.h | 6 +- test/config/TCStatConfig_ALAL2010 | 12 + test/config/TCStatConfig_PROBRIRW | 12 + test/xml/unit_stat_analysis.xml | 15 + test/xml/unit_tc_stat.xml | 15 +- 16 files changed, 562 insertions(+), 303 deletions(-) diff --git a/met/data/config/TCStatConfig_default b/met/data/config/TCStatConfig_default index 3fc882f0f2..d385b01353 100644 --- a/met/data/config/TCStatConfig_default +++ b/met/data/config/TCStatConfig_default @@ -111,6 +111,12 @@ column_thresh_val = []; column_str_name = []; column_str_val = []; +// +// Stratify by excluding strings in non-numeric data columns. +// +column_str_exc_name = []; +column_str_exc_val = []; + // // Similar to the column_thresh options above // @@ -123,6 +129,12 @@ init_thresh_val = []; init_str_name = []; init_str_val = []; +// +// Similar to the column_str_exc options above +// +init_str_exc_name = []; +init_str_exc_val = []; + // // Stratify by the ADECK and BDECK distances to land. // diff --git a/met/docs/Users_Guide/config_options.rst b/met/docs/Users_Guide/config_options.rst index d8acbab286..e1f65cc7b4 100644 --- a/met/docs/Users_Guide/config_options.rst +++ b/met/docs/Users_Guide/config_options.rst @@ -3748,17 +3748,19 @@ Where "job_name" is set to one of the following: Job command FILTERING options that may be used only when -line_type has been listed once. These options take two arguments: the name of the data column to be used and the min, max, or exact value for that column. - If multiple column eq/min/max/str options are listed, the job will be + If multiple column eq/min/max/str/exc options are listed, the job will be performed on their intersection: .. code-block:: none - "-column_min col_name value" e.g. -column_min BASER 0.02 - "-column_max col_name value" - "-column_eq col_name value" - "-column_thresh col_name threshold" e.g. -column_thresh FCST '>273' - "-column_str col_name string" separate multiple filtering strings - with commas + "-column_min col_name value" e.g. -column_min BASER 0.02 + "-column_max col_name value" + "-column_eq col_name value" + "-column_thresh col_name threshold" e.g. -column_thresh FCST '>273' + "-column_str col_name string" separate multiple filtering strings + with commas + "-column_str_exc col_name string" separate multiple filtering strings + with commas Job command options to DEFINE the analysis job. Unless otherwise noted, diff --git a/met/docs/Users_Guide/config_options_tc.rst b/met/docs/Users_Guide/config_options_tc.rst index 155a394ed0..11f7330b4b 100644 --- a/met/docs/Users_Guide/config_options_tc.rst +++ b/met/docs/Users_Guide/config_options_tc.rst @@ -517,8 +517,8 @@ For example: Stratify by performing string matching on non-numeric data columns. Specify a comma-separated list of columns names and values -to be checked. May add using the "-column_str name string" job command -options. +to be included in the analysis. +May add using the "-column_str name string" job command options. For example: @@ -531,6 +531,23 @@ For example: column_str_name = []; column_str_val = []; +**column_str_exc_name, column_str_exc_val** + +Stratify by performing string matching on non-numeric data columns. +Specify a comma-separated list of columns names and values +to be excluded from the analysis. +May add using the "-column_str_exc name string" job command options. + +For example: + +| column_str_exc_name = [ "LEVEL" ]; +| column_str_exc_val = [ "TD" ]; +| + +.. code-block:: none + + column_str_exc_name = []; + column_str_exc_val = []; **init_thresh_name, init_thresh_val** @@ -567,6 +584,23 @@ For example: init_str_name = []; init_str_val = []; +**init_str_exc_name, init_str_exc_val** + +Just like the column_str_exc options above, but apply the string matching only +when lead = 0. If lead = 0 string does match, discard the entire track. +May add using the "-init_str_exc name thresh" job command options. + +For example: + +| init_str_exc_name = [ "LEVEL" ]; +| init_str_exc_val = [ "HU" ]; +| + +.. code-block:: none + + init_str_exc_name = []; + init_str_exc_val = []; + **water_only** Stratify by the ADECK and BDECK distances to land. Once either the ADECK or @@ -747,8 +781,10 @@ Where "job_name" is set to one of the following: "-track_watch_warn name" "-column_thresh name thresh" "-column_str name string" + "-column_str_exc name string" "-init_thresh name thresh" "-init_str name string" + "-init_str_exc name string" Additional filtering options that may be used only when -line_type has been listed only once. These options take two arguments: the name @@ -758,11 +794,13 @@ Where "job_name" is set to one of the following: .. code-block:: none - "-column_min col_name value" For example: -column_min TK_ERR 100.00 - "-column_max col_name value" - "-column_eq col_name value" - "-column_str col_name string" separate multiple filtering strings - with commas + "-column_min col_name value" For example: -column_min TK_ERR 100.00 + "-column_max col_name value" + "-column_eq col_name value" + "-column_str col_name string" separate multiple filtering strings + with commas + "-column_str_exc col_name string" separate multiple filtering strings + with commas Required Args: -dump_row diff --git a/met/docs/Users_Guide/gsi-tools.rst b/met/docs/Users_Guide/gsi-tools.rst index 0e7a6fb92a..019e5c3f7b 100644 --- a/met/docs/Users_Guide/gsi-tools.rst +++ b/met/docs/Users_Guide/gsi-tools.rst @@ -230,7 +230,7 @@ The GSID2MPR tool writes the same set of MPR output columns for the conventional - PRS_MAX_WGT - Pressure of the maximum weighing function -The gsid2mpr output may be passed to the Stat-Analysis tool to derive additional statistics. In particular, users should consider running the **aggregate_stat** job type to read MPR lines and compute partial sums (SL1L2), continuous statistics (CNT), contingency table counts (CTC), or contingency table statistics (CTS). Stat-Analysis has been enhanced to parse any extra columns found at the end of the input lines. Users can filter the values in those extra columns using the **-column_thresh** and **-column_str** job command options. +The gsid2mpr output may be passed to the Stat-Analysis tool to derive additional statistics. In particular, users should consider running the **aggregate_stat** job type to read MPR lines and compute partial sums (SL1L2), continuous statistics (CNT), contingency table counts (CTC), or contingency table statistics (CTS). Stat-Analysis has been enhanced to parse any extra columns found at the end of the input lines. Users can filter the values in those extra columns using the **-column_thresh**, **-column_str**, and **-column_str_exc** job command options. An example of the Stat-Analysis calling sequence is shown below: @@ -425,7 +425,7 @@ The GSID2MPR tool writes the same set of ORANK output columns for the convention - TZFND - d(Tz)/d(Tr) -The gsidens2orank output may be passed to the Stat-Analysis tool to derive additional statistics. In particular, users should consider running the **aggregate_stat** job type to read ORANK lines and ranked histograms (RHIST), probability integral transform histograms (PHIST), and spread-skill variance output (SSVAR). Stat-Analysis has been enhanced to parse any extra columns found at the end of the input lines. Users can filter the values in those extra columns using the **-column_thresh** and **-column_str** job command options. +The gsidens2orank output may be passed to the Stat-Analysis tool to derive additional statistics. In particular, users should consider running the **aggregate_stat** job type to read ORANK lines and ranked histograms (RHIST), probability integral transform histograms (PHIST), and spread-skill variance output (SSVAR). Stat-Analysis has been enhanced to parse any extra columns found at the end of the input lines. Users can filter the values in those extra columns using the **-column_thresh**, **-column_str**, and **-column_str_exc** job command options. An example of the Stat-Analysis calling sequence is shown below: diff --git a/met/docs/Users_Guide/stat-analysis.rst b/met/docs/Users_Guide/stat-analysis.rst index 50655fc573..ce2d8c7654 100644 --- a/met/docs/Users_Guide/stat-analysis.rst +++ b/met/docs/Users_Guide/stat-analysis.rst @@ -522,13 +522,14 @@ This job command option is extremely useful. It can be used multiple times to sp .. code-block:: none - -column_min col_name value - -column_max col_name value - -column_eq col_name value - -column_thresh col_name thresh - -column_str col_name string - -The column filtering options may be used when the **-line_type** has been set to a single value. These options take two arguments, the name of the data column to be used followed by a value, string, or threshold to be applied. If multiple column_min/max/eq/thresh/str options are listed, the job will be performed on their intersection. Each input line is only retained if its value meets the numeric filtering criteria defined or matches one of the strings defined by the **-column_str** option. Multiple filtering strings may be listed using commas. Defining thresholds in MET is described in :numref:`config_options`. + -column_min col_name value + -column_max col_name value + -column_eq col_name value + -column_thresh col_name thresh + -column_str col_name string + -column_str_exc col_name string + +The column filtering options may be used when the **-line_type** has been set to a single value. These options take two arguments, the name of the data column to be used followed by a value, string, or threshold to be applied. If multiple column_min/max/eq/thresh/str options are listed, the job will be performed on their intersection. Each input line is only retained if its value meets the numeric filtering criteria defined, matches one of the strings defined by the **-column_str** option, or does not match any of the string defined by the **-column_str_exc** option. Multiple filtering strings may be listed using commas. Defining thresholds in MET is described in :numref:`config_options`. .. code-block:: none diff --git a/met/docs/Users_Guide/tc-stat.rst b/met/docs/Users_Guide/tc-stat.rst index f1ddfbeb7d..c66a6f6894 100644 --- a/met/docs/Users_Guide/tc-stat.rst +++ b/met/docs/Users_Guide/tc-stat.rst @@ -251,7 +251,16 @@ _________________________ column_str_name = []; column_str_val = []; -The **column_str_name** and **column_str_val** fields stratify by performing string matching on non-numeric data columns. Specify a comma-separated list of columns names and values to be checked. The length of the **column_str_val** should match that of the **column_str_name**. Using the **-column_str name val** option within the job command lines may further refine these selections. +The **column_str_name** and **column_str_val** fields stratify by performing string matching on non-numeric data columns. Specify a comma-separated list of columns names and values to be **included** in the analysis. The length of the **column_str_val** should match that of the **column_str_name**. Using the **-column_str name val** option within the job command lines may further refine these selections. + +_________________________ + +.. code-block:: none + + column_str_exc_name = []; + column_str_exc_val = []; + +The **column_str_exc_name** and **column_str_exc_val** fields stratify by performing string matching on non-numeric data columns. Specify a comma-separated list of columns names and values to be **excluded** from the analysis. The length of the **column_str_exc_val** should match that of the **column_str_exc_name**. Using the **-column_str_exc name val** option within the job command lines may further refine these selections. _________________________ @@ -260,7 +269,7 @@ _________________________ init_thresh_name = []; init_thresh_val = []; -The **init_thresh_name** and **init_thresh_val** fields stratify by applying thresholds to numeric data columns only when lead = 0. If lead =0, but the value does not meet the threshold, discard the entire track. The length of the **init_thresh_val** should match that of the **init_thresh_name**. Using the **-init_thresh name val** option within the job command lines may further refine these selections. +The **init_thresh_name** and **init_thresh_val** fields stratify by applying thresholds to numeric data columns only when lead = 0. If lead = 0, but the value does not meet the threshold, discard the entire track. The length of the **init_thresh_val** should match that of the **init_thresh_name**. Using the **-init_thresh name val** option within the job command lines may further refine these selections. _________________________ @@ -269,7 +278,16 @@ _________________________ init_str_name = []; init_str_val = []; -The **init_str_name** and **init_str_val** fields stratify by performing string matching on non-numeric data columns only when lead = 0. If lead =0, but the string does not match, discard the entire track. The length of the **init_str_val** should match that of the **init_str_name**. Using the **-init_str name val** option within the job command lines may further refine these selections. +The **init_str_name** and **init_str_val** fields stratify by performing string matching on non-numeric data columns only when lead = 0. If lead = 0, but the string **does not** match, discard the entire track. The length of the **init_str_val** should match that of the **init_str_name**. Using the **-init_str name val** option within the job command lines may further refine these selections. + +_________________________ + +.. code-block:: none + + init_str_exc_name = []; + init_str_exc_val = []; + +The **init_str_exc_name** and **init_str_exc_val** fields stratify by performing string matching on non-numeric data columns only when lead = 0. If lead = 0, and the string **does** match, discard the entire track. The length of the **init_str_exc_val** should match that of the **init_str_exc_name**. Using the **-init_str_exc name val** option within the job command lines may further refine these selections. _________________________ diff --git a/met/src/basic/vx_config/config_constants.h b/met/src/basic/vx_config/config_constants.h index 1ae8d5d90d..e63a6935f0 100644 --- a/met/src/basic/vx_config/config_constants.h +++ b/met/src/basic/vx_config/config_constants.h @@ -1037,10 +1037,14 @@ static const char conf_key_column_thresh_name[] = "column_thresh_name"; static const char conf_key_column_thresh_val[] = "column_thresh_val"; static const char conf_key_column_str_name[] = "column_str_name"; static const char conf_key_column_str_val[] = "column_str_val"; +static const char conf_key_column_str_exc_name[] = "column_str_exc_name"; +static const char conf_key_column_str_exc_val[] = "column_str_exc_val"; static const char conf_key_init_thresh_name[] = "init_thresh_name"; static const char conf_key_init_thresh_val[] = "init_thresh_val"; static const char conf_key_init_str_name[] = "init_str_name"; static const char conf_key_init_str_val[] = "init_str_val"; +static const char conf_key_init_str_exc_name[] = "init_str_exc_name"; +static const char conf_key_init_str_exc_val[] = "init_str_exc_val"; static const char conf_key_water_only[] = "water_only"; static const char conf_key_rirw_track[] = "rirw.track"; static const char conf_key_rirw_time_adeck[] = "rirw.adeck.time"; diff --git a/met/src/libcode/vx_analysis_util/stat_job.cc b/met/src/libcode/vx_analysis_util/stat_job.cc index 346ba9e03f..870d5cac1d 100644 --- a/met/src/libcode/vx_analysis_util/stat_job.cc +++ b/met/src/libcode/vx_analysis_util/stat_job.cc @@ -172,7 +172,8 @@ void STATAnalysisJob::clear() { wmo_fisher_stats.clear(); column_thresh_map.clear(); - column_str_map.clear(); + column_str_inc_map.clear(); + column_str_exc_map.clear(); by_column.clear(); @@ -306,7 +307,8 @@ void STATAnalysisJob::assign(const STATAnalysisJob & aj) { wmo_fisher_stats = aj.wmo_fisher_stats; column_thresh_map = aj.column_thresh_map; - column_str_map = aj.column_str_map; + column_str_inc_map = aj.column_str_inc_map; + column_str_exc_map = aj.column_str_exc_map; by_column = aj.by_column; @@ -507,9 +509,16 @@ void STATAnalysisJob::dump(ostream & out, int depth) const { thr_it->second.dump(out, depth + 1); } - out << prefix << "column_str_map ...\n"; - for(map::const_iterator str_it = column_str_map.begin(); - str_it != column_str_map.end(); str_it++) { + out << prefix << "column_str_inc_map ...\n"; + for(map::const_iterator str_it = column_str_inc_map.begin(); + str_it != column_str_inc_map.end(); str_it++) { + out << prefix << str_it->first << ": \n"; + str_it->second.dump(out, depth + 1); + } + + out << prefix << "column_str_exc_map ...\n"; + for(map::const_iterator str_it = column_str_exc_map.begin(); + str_it != column_str_exc_map.end(); str_it++) { out << prefix << str_it->first << ": \n"; str_it->second.dump(out, depth + 1); } @@ -948,8 +957,8 @@ int STATAnalysisJob::is_keeper(const STATLine & L) const { // // column_str // - for(map::const_iterator str_it = column_str_map.begin(); - str_it != column_str_map.end(); str_it++) { + for(map::const_iterator str_it = column_str_inc_map.begin(); + str_it != column_str_inc_map.end(); str_it++) { // // Check if the current value is in the list for the column @@ -957,6 +966,18 @@ int STATAnalysisJob::is_keeper(const STATLine & L) const { if(!str_it->second.has(L.get_item(str_it->first.c_str(), false))) return(0); } + // + // column_str_exc + // + for(map::const_iterator str_it = column_str_exc_map.begin(); + str_it != column_str_exc_map.end(); str_it++) { + + // + // Check if the current value is not in the list for the column + // + if(str_it->second.has(L.get_item(str_it->first.c_str(), false))) return(0); + } + // // For MPR lines, check mask_grid, mask_poly, and mask_sid // @@ -1125,7 +1146,10 @@ void STATAnalysisJob::parse_job_command(const char *jobstring) { column_thresh_map.clear(); } else if(jc_array[i] == "-column_str" ) { - column_str_map.clear(); + column_str_inc_map.clear(); + } + else if(jc_array[i] == "-column_str_exc" ) { + column_str_exc_map.clear(); } else if(jc_array[i] == "-set_hdr" ) { hdr_name.clear(); @@ -1376,12 +1400,30 @@ void STATAnalysisJob::parse_job_command(const char *jobstring) { col_value.add_css(jc_array[i+2]); // If the column name is already present in the map, add to it - if(column_str_map.count(col_name) > 0) { - column_str_map[col_name].add(col_value); + if(column_str_inc_map.count(col_name) > 0) { + column_str_inc_map[col_name].add(col_value); } // Otherwise, add a new map entry else { - column_str_map.insert(pair(col_name, col_value)); + column_str_inc_map.insert(pair(col_name, col_value)); + } + i+=2; + } + else if(jc_array[i] == "-column_str_exc") { + + // Parse the column name and value + col_name = to_upper((string)jc_array[i+1]); + col_value.clear(); + col_value.set_ignore_case(1); + col_value.add_css(jc_array[i+2]); + + // If the column name is already present in the map, add to it + if(column_str_exc_map.count(col_name) > 0) { + column_str_exc_map[col_name].add(col_value); + } + // Otherwise, add a new map entry + else { + column_str_exc_map.insert(pair(col_name, col_value)); } i+=2; } @@ -2461,14 +2503,23 @@ ConcatString STATAnalysisJob::get_jobstring() const { } // column_str - for(map::const_iterator str_it = column_str_map.begin(); - str_it != column_str_map.end(); str_it++) { + for(map::const_iterator str_it = column_str_inc_map.begin(); + str_it != column_str_inc_map.end(); str_it++) { for(i=0; isecond.n(); i++) { js << "-column_str " << str_it->first << " " << str_it->second[i] << " "; } } + // column_str_exc + for(map::const_iterator str_it = column_str_exc_map.begin(); + str_it != column_str_exc_map.end(); str_it++) { + + for(i=0; isecond.n(); i++) { + js << "-column_str_exc " << str_it->first << " " << str_it->second[i] << " "; + } + } + // by_column if(by_column.n() > 0) { for(i=0; i column_thresh_map; // ASCII column string matching - map column_str_map; + map column_str_inc_map; + map column_str_exc_map; StringArray hdr_name; StringArray hdr_value; diff --git a/met/src/tools/tc_utils/tc_stat/tc_stat_conf_info.cc b/met/src/tools/tc_utils/tc_stat/tc_stat_conf_info.cc index 3b21161363..1bdc3af262 100644 --- a/met/src/tools/tc_utils/tc_stat/tc_stat_conf_info.cc +++ b/met/src/tools/tc_utils/tc_stat/tc_stat_conf_info.cc @@ -22,6 +22,16 @@ using namespace std; #include "vx_log.h" +//////////////////////////////////////////////////////////////////////// + +// Functions for parsing config entries +static void parse_conf_thresh_map(MetConfig &, + const char *, const char *, + map &); +static void parse_conf_string_map(MetConfig &, + const char *, const char *, + map &); + //////////////////////////////////////////////////////////////////////// // // Code for class TCStatConfInfo @@ -63,7 +73,7 @@ void TCStatConfInfo::clear() { //////////////////////////////////////////////////////////////////////// void TCStatConfInfo::read_config(const char *default_file_name, - const char *user_file_name) { + const char *user_file_name) { // Read the config file constants Conf.read(replace_path(config_const_filename).c_str()); @@ -84,8 +94,7 @@ void TCStatConfInfo::read_config(const char *default_file_name, void TCStatConfInfo::process_config() { int i; - StringArray sa, sa_val, sa_new; - ThreshArray ta_val, ta_new; + StringArray sa; ConcatString poly_file; // Conf: Version @@ -119,12 +128,12 @@ void TCStatConfInfo::process_config() { // Conf: TCStatJob::InitInc sa = Conf.lookup_string_array(conf_key_init_inc); - for(i=0; i " - << "the \"column_thresh_name\" and \"column_thresh_val\" " - << "entries must have the same length.\n\n"; - exit(1); - } + parse_conf_thresh_map(Conf, + conf_key_column_thresh_name, conf_key_column_thresh_val, + Filter.ColumnThreshMap); - // Add entries to the map - for(i=0; i 0) { - Filter.ColumnThreshMap[sa[i]].add(ta_val[i]); - } - else { - ta_new.clear(); - ta_new.add(ta_val[i]); - Filter.ColumnThreshMap.insert(pair(sa[i], ta_new)); - } - } // end for i - - // Conf: TCStatJob::ColumnStrName, TCStatJob::ColumnStrVal - sa = Conf.lookup_string_array(conf_key_column_str_name); - sa_val = Conf.lookup_string_array(conf_key_column_str_val); - - // Check that they are the same length - if(sa.n_elements() != sa_val.n_elements()) { - mlog << Error - << "\nTCStatConfInfo::process_config() -> " - << "the \"column_str_name\" and \"column_str_val\" " - << "entries must have the same length.\n\n"; - exit(1); - } + // Conf: TCStatJob::ColumnStrIncName, TCStatJob::ColumnStrIncVal + parse_conf_string_map(Conf, + conf_key_column_str_name, conf_key_column_str_val, + Filter.ColumnStrIncMap); - // Add entries to the map - for(i=0; i 0) { - Filter.ColumnStrMap[sa[i]].add(sa_val[i]); - } - else { - sa_new.clear(); - sa_new.set_ignore_case(1); - sa_new.add(sa_val[i]); - Filter.ColumnStrMap.insert(pair(sa[i], sa_new)); - } - } // end for i + // Conf: TCStatJob::ColumnStrExcName, TCStatJob::ColumnStrExcVal + parse_conf_string_map(Conf, + conf_key_column_str_exc_name, conf_key_column_str_exc_val, + Filter.ColumnStrExcMap); // Conf: TCStatJob::InitThreshName, TCStatJob::InitThreshVal - sa = Conf.lookup_string_array(conf_key_init_thresh_name); - ta_val = Conf.lookup_thresh_array(conf_key_init_thresh_val); + parse_conf_thresh_map(Conf, + conf_key_init_thresh_name, conf_key_init_thresh_val, + Filter.InitThreshMap); - // Check that they are the same length - if(sa.n_elements() != ta_val.n_elements()) { - mlog << Error - << "\nTCStatConfInfo::process_config() -> " - << "the \"init_thresh_name\" and \"init_thresh_val\" " - << "entries must have the same length.\n\n"; - exit(1); - } - - // Add entries to the map - for(i=0; i 0) { - Filter.InitThreshMap[sa[i]].add(ta_val[i]); - } - else { - ta_new.clear(); - ta_new.add(ta_val[i]); - Filter.InitThreshMap.insert(pair(sa[i], ta_new)); - } - } // end for i - - // Conf: TCStatJob::InitStrName, TCStatJob::InitStrVal - sa = Conf.lookup_string_array(conf_key_init_str_name); - sa_val = Conf.lookup_string_array(conf_key_init_str_val); - - // Check that they are the same length - if(sa.n_elements() != sa_val.n_elements()) { - mlog << Error - << "\nTCStatConfInfo::process_config() -> " - << "the \"init_str_name\" and \"init_str_val\" " - << "entries must have the same length.\n\n"; - exit(1); - } + // Conf: TCStatJob::InitStrIncName, TCStatJob::InitStrIncVal + parse_conf_string_map(Conf, + conf_key_init_str_name, conf_key_init_str_val, + Filter.InitStrIncMap); - // Add entries to the map - for(i=0; i 0) { - Filter.InitStrMap[sa[i]].add(sa_val[i]); - } - else { - sa_new.clear(); - sa_new.set_ignore_case(1); - sa_new.add(sa_val[i]); - Filter.InitStrMap.insert(pair(sa[i], sa_new)); - } - } // end for i + // Conf: TCStatJob::InitStrExcName, TCStatJob::InitStrExcVal + parse_conf_string_map(Conf, + conf_key_init_str_exc_name, conf_key_init_str_exc_val, + Filter.InitStrExcMap); // Conf: TCStatJob::WaterOnly Filter.WaterOnly = Conf.lookup_bool(conf_key_water_only); @@ -311,7 +248,7 @@ void TCStatConfInfo::process_config() { // Conf: Jobs Jobs = Conf.lookup_string_array(conf_key_jobs); - if(Jobs.n_elements() == 0) { + if(Jobs.n() == 0) { mlog << Error << "\nTCStatConfInfo::process_config() -> " << "must specify at least one entry in \"jobs\".\n\n"; @@ -322,3 +259,73 @@ void TCStatConfInfo::process_config() { } //////////////////////////////////////////////////////////////////////// + +void parse_conf_thresh_map(MetConfig &conf, + const char *conf_key_name, const char *conf_key_val, + map &m) { + StringArray sa; + ThreshArray ta_val, ta_new; + + sa = conf.lookup_string_array(conf_key_name); + ta_val = conf.lookup_thresh_array(conf_key_val); + + // Check that they are the same length + if(sa.n() != ta_val.n()) { + mlog << Error + << "\nTCStatConfInfo::parse_conf_thresh_map() -> " + << "the \"" << conf_key_name << "\" and \"" << conf_key_val << "\" " + << "entries must have the same length.\n\n"; + exit(1); + } + + // Add entries to the map + for(int i=0; i 0) { + m[sa[i]].add(ta_val[i]); + } + else { + ta_new.clear(); + ta_new.add(ta_val[i]); + m.insert(pair(sa[i], ta_new)); + } + } // end for i + + return; +} + +//////////////////////////////////////////////////////////////////////// + +void parse_conf_string_map(MetConfig &conf, + const char *conf_key_name, const char *conf_key_val, + map &m) { + StringArray sa, sa_val, sa_new; + + sa = conf.lookup_string_array(conf_key_name); + sa_val = conf.lookup_string_array(conf_key_val); + + // Check that they are the same length + if(sa.n() != sa_val.n()) { + mlog << Error + << "\nTCStatConfInfo::parse_conf_string_map() -> " + << "the \"" << conf_key_name << "\" and \"" << conf_key_val << "\" " + << "entries must have the same length.\n\n"; + exit(1); + } + + // Add entries to the map + for(int i=0; i 0) { + m[sa[i]].add(sa_val[i]); + } + else { + sa_new.clear(); + sa_new.set_ignore_case(1); + sa_new.add(sa_val[i]); + m.insert(pair(sa[i], sa_new)); + } + } // end for i + + return; +} + +//////////////////////////////////////////////////////////////////////// diff --git a/met/src/tools/tc_utils/tc_stat/tc_stat_job.cc b/met/src/tools/tc_utils/tc_stat/tc_stat_job.cc index e472af405b..6f6f812878 100644 --- a/met/src/tools/tc_utils/tc_stat/tc_stat_job.cc +++ b/met/src/tools/tc_utils/tc_stat/tc_stat_job.cc @@ -112,11 +112,11 @@ TCStatJob *TCStatJobFactory::new_tc_stat_job(const char *jobstring) { a = job->parse_job_command(jobstring); // Check for unused arguments - if(a.n_elements() > 0) { + if(a.n() > 0) { // Build list of unknown args - for(i=0; i " @@ -220,9 +220,11 @@ void TCStatJob::clear() { LineType.clear(); TrackWatchWarn.clear(); ColumnThreshMap.clear(); - ColumnStrMap.clear(); + ColumnStrIncMap.clear(); + ColumnStrExcMap.clear(); InitThreshMap.clear(); - InitStrMap.clear(); + InitStrIncMap.clear(); + InitStrExcMap.clear(); EventEqualLead.clear(); EventEqualCases.clear(); @@ -301,9 +303,11 @@ void TCStatJob::assign(const TCStatJob & j) { LineType = j.LineType; TrackWatchWarn = j.TrackWatchWarn; ColumnThreshMap = j.ColumnThreshMap; - ColumnStrMap = j.ColumnStrMap; + ColumnStrIncMap = j.ColumnStrIncMap; + ColumnStrExcMap = j.ColumnStrExcMap; InitThreshMap = j.InitThreshMap; - InitStrMap = j.InitStrMap; + InitStrIncMap = j.InitStrIncMap; + InitStrExcMap = j.InitStrExcMap; DumpFile = j.DumpFile; open_dump_file(); @@ -423,8 +427,14 @@ void TCStatJob::dump(ostream & out, int depth) const { thr_it->second.dump(out, depth + 1); } - out << prefix << "ColumnStrMap ...\n"; - for(str_it=ColumnStrMap.begin(); str_it!= ColumnStrMap.end(); str_it++) { + out << prefix << "ColumnStrIncMap ...\n"; + for(str_it=ColumnStrIncMap.begin(); str_it!= ColumnStrIncMap.end(); str_it++) { + out << prefix << str_it->first << ": \n"; + str_it->second.dump(out, depth + 1); + } + + out << prefix << "ColumnStrExcMap ...\n"; + for(str_it=ColumnStrExcMap.begin(); str_it!= ColumnStrExcMap.end(); str_it++) { out << prefix << str_it->first << ": \n"; str_it->second.dump(out, depth + 1); } @@ -435,8 +445,14 @@ void TCStatJob::dump(ostream & out, int depth) const { thr_it->second.dump(out, depth + 1); } - out << prefix << "InitStrMap ...\n"; - for(str_it=InitStrMap.begin(); str_it!= InitStrMap.end(); str_it++) { + out << prefix << "InitStrIncMap ...\n"; + for(str_it=InitStrIncMap.begin(); str_it!= InitStrIncMap.end(); str_it++) { + out << prefix << str_it->first << ": \n"; + str_it->second.dump(out, depth + 1); + } + + out << prefix << "InitStrExcMap ...\n"; + for(str_it=InitStrExcMap.begin(); str_it!= InitStrExcMap.end(); str_it++) { out << prefix << str_it->first << ": \n"; str_it->second.dump(out, depth + 1); } @@ -501,7 +517,7 @@ bool TCStatJob::is_keeper_track(const TrackPairInfo &pair, map::const_iterator str_it; // Check TrackWatchWarn for each TrackPoint - if(TrackWatchWarn.n_elements() > 0) { + if(TrackWatchWarn.n() > 0) { // Assume track will not be kept keep = false; @@ -539,7 +555,11 @@ bool TCStatJob::is_keeper_track(const TrackPairInfo &pair, keep = false; n.RejInitThresh += pair.n_points(); } - else if(InitStrMap.size() > 0) { + else if(InitStrIncMap.size() > 0) { + keep = false; + n.RejInitStr += pair.n_points(); + } + else if(InitStrExcMap.size() > 0) { keep = false; n.RejInitStr += pair.n_points(); } @@ -567,10 +587,10 @@ bool TCStatJob::is_keeper_track(const TrackPairInfo &pair, } } - // Check InitStr + // Check InitStrInc if(keep == true) { - for(str_it=InitStrMap.begin(); str_it!= InitStrMap.end(); str_it++) { + for(str_it=InitStrIncMap.begin(); str_it!= InitStrIncMap.end(); str_it++) { // Retrieve the column value v_str = pair.line(i_init)->get_item(str_it->first.c_str()); @@ -584,6 +604,23 @@ bool TCStatJob::is_keeper_track(const TrackPairInfo &pair, } } + // Check InitStrExc + if(keep == true) { + + for(str_it=InitStrExcMap.begin(); str_it!= InitStrExcMap.end(); str_it++) { + + // Retrieve the column value + v_str = pair.line(i_init)->get_item(str_it->first.c_str()); + + // Check the string value + if(str_it->second.has(v_str)) { + keep = false; + n.RejInitStr += pair.n_points(); + break; + } + } + } + // Check OutInitMask if(keep == true) { @@ -606,11 +643,11 @@ bool TCStatJob::is_keeper_track(const TrackPairInfo &pair, // MET-667 Check this track for required lead times // If no required lead times were defined, do nothing. - if(keep == true && LeadReq.n_elements() > 0){ + if(keep == true && LeadReq.n() > 0){ // Loop through the points and see if any of the // lead times are in the list of required lead times // defined in the configuration file. - for(int j=0; j::const_iterator str_it; // Check TC-STAT header columns - if(AModel.n_elements() > 0 && + if(AModel.n() > 0 && !AModel.has(line.amodel())) { keep = false; n.RejAModel++; } - else if(BModel.n_elements() > 0 && + else if(BModel.n() > 0 && !BModel.has(line.bmodel())) { keep = false; n.RejBModel++; } - else if(Desc.n_elements() > 0 && + else if(Desc.n() > 0 && !Desc.has(line.desc())) { keep = false; n.RejDesc++; } - else if(StormId.n_elements() > 0 && + else if(StormId.n() > 0 && !has_storm_id(StormId, (string)line.basin(), (string)line.cyclone(), line.init())) { keep = false; n.RejStormId++; } - else if(Basin.n_elements() > 0 && + else if(Basin.n() > 0 && !Basin.has(line.basin())) { keep = false; n.RejBasin++; } - else if(Cyclone.n_elements() > 0 && + else if(Cyclone.n() > 0 && !Cyclone.has(line.cyclone())) { keep = false; n.RejCyclone++; } - else if(StormName.n_elements() > 0 && + else if(StormName.n() > 0 && !StormName.has(line.storm_name())) { keep = false; n.RejStormName++; } else if(InitBeg > 0 && line.init() < InitBeg) { keep = false; n.RejInit++; } else if(InitEnd > 0 && line.init() > InitEnd) { keep = false; n.RejInit++; } - else if(InitInc.n_elements() > 0 && + else if(InitInc.n() > 0 && !InitInc.has(line.init())) { keep = false; n.RejInit++; } - else if(InitExc.n_elements() > 0 && + else if(InitExc.n() > 0 && InitExc.has(line.init())) { keep = false; n.RejInit++; } - else if(InitHour.n_elements() > 0 && + else if(InitHour.n() > 0 && !InitHour.has(line.init_hour())) { keep = false; n.RejInitHour++; } - else if(Lead.n_elements() > 0 && + else if(Lead.n() > 0 && !Lead.has(line.lead())) { keep = false; n.RejLead++; } else if(ValidBeg > 0 && line.valid() < ValidBeg) { keep = false; n.RejValid++; } else if(ValidEnd > 0 && line.valid() > ValidEnd) { keep = false; n.RejValid++; } - else if(ValidInc.n_elements() > 0 && + else if(ValidInc.n() > 0 && !ValidInc.has(line.valid())) { keep = false; n.RejValid++; } - else if(ValidExc.n_elements() > 0 && + else if(ValidExc.n() > 0 && ValidExc.has(line.valid())) { keep = false; n.RejValid++; } - else if(ValidHour.n_elements() > 0 && + else if(ValidHour.n() > 0 && !ValidHour.has(line.valid_hour())) { keep = false; n.RejValidHour++; } - else if(InitMask.n_elements() > 0 && + else if(InitMask.n() > 0 && !InitMask.has(line.init_mask())) { keep = false; n.RejInitMask++; } - else if(ValidMask.n_elements() > 0 && + else if(ValidMask.n() > 0 && !ValidMask.has(line.valid_mask())) { keep = false; n.RejValidMask++; } - else if(LineType.n_elements() > 0 && + else if(LineType.n() > 0 && !LineType.has(line.line_type())) { keep = false; n.RejLineType++; } // Check that PROBRIRW lines include the requested probability type @@ -701,27 +738,45 @@ bool TCStatJob::is_keeper_line(const TCStatLine &line, // Check the column threshold if(!thr_it->second.check_dbl(v_dbl)) { - keep = false; - n.RejColumnThresh++; - break; + keep = false; + n.RejColumnThresh++; + break; } } } - // Check ColumnStrMap + // Check ColumnStrIncMap if(keep == true) { // Loop through the column string matching - for(str_it=ColumnStrMap.begin(); str_it!= ColumnStrMap.end(); str_it++) { + for(str_it=ColumnStrIncMap.begin(); str_it!= ColumnStrIncMap.end(); str_it++) { // Retrieve the column value v_str = line.get_item(str_it->first.c_str()); // Check the string value if(!str_it->second.has(v_str)) { - keep = false; - n.RejColumnStr++; - break; + keep = false; + n.RejColumnStr++; + break; + } + } + } + + // Check ColumnStrExcMap + if(keep == true) { + + // Loop through the column string matching + for(str_it=ColumnStrExcMap.begin(); str_it!= ColumnStrExcMap.end(); str_it++) { + + // Retrieve the column value + v_str = line.get_item(str_it->first.c_str()); + + // Check the string value + if(str_it->second.has(v_str)) { + keep = false; + n.RejColumnStr++; + break; } } } @@ -805,10 +860,10 @@ double TCStatJob::get_column_double(const TCStatLine &line, v = atof(line.get_item(sa[0].c_str())); // If multiple columns, compute the requested difference - if(sa.n_elements() > 1) { + if(sa.n() > 1) { // Loop through the column - for(i=1; i 0) s << "-init_beg " << unix_to_yyyymmdd_hhmmss(InitBeg) << " "; if(InitEnd > 0) s << "-init_end " << unix_to_yyyymmdd_hhmmss(InitEnd) << " "; - for(i=0; i 0) s << "-valid_beg " << unix_to_yyyymmdd_hhmmss(ValidBeg) << " "; if(ValidEnd > 0) s << "-valid_end " << unix_to_yyyymmdd_hhmmss(ValidEnd) << " "; - for(i=0; isecond.n_elements(); i++) { + for(i=0; isecond.n(); i++) { s << "-column_thresh " << thr_it->first << " " << thr_it->second[i].get_str() << " "; } } - for(str_it=ColumnStrMap.begin(); str_it!= ColumnStrMap.end(); str_it++) { - for(i=0; isecond.n_elements(); i++) { + for(str_it=ColumnStrIncMap.begin(); str_it!= ColumnStrIncMap.end(); str_it++) { + for(i=0; isecond.n(); i++) { s << "-column_str " << str_it->first << " " << str_it->second[i] << " "; } } + for(str_it=ColumnStrExcMap.begin(); str_it!= ColumnStrExcMap.end(); str_it++) { + for(i=0; isecond.n(); i++) { + s << "-column_str_exc " << str_it->first << " " + << str_it->second[i] << " "; + } + } for(thr_it=InitThreshMap.begin(); thr_it!= InitThreshMap.end(); thr_it++) { - for(i=0; isecond.n_elements(); i++) { + for(i=0; isecond.n(); i++) { s << "-init_thresh " << thr_it->first << " " << thr_it->second[i].get_str() << " "; } } - for(str_it=InitStrMap.begin(); str_it!= InitStrMap.end(); str_it++) { - for(i=0; isecond.n_elements(); i++) { + for(str_it=InitStrIncMap.begin(); str_it!= InitStrIncMap.end(); str_it++) { + for(i=0; isecond.n(); i++) { s << "-init_str " << str_it->first << " " << str_it->second[i] << " "; } } + for(str_it=InitStrExcMap.begin(); str_it!= InitStrExcMap.end(); str_it++) { + for(i=0; isecond.n(); i++) { + s << "-init_str_exc " << str_it->first << " " + << str_it->second[i] << " "; + } + } if(WaterOnly != default_water_only) s << "-water_only " << bool_to_string(WaterOnly) << " "; if(RIRWTrack != default_rirw_track) { @@ -1223,7 +1294,7 @@ ConcatString TCStatJob::serialize() const { s << "-match_points " << bool_to_string(MatchPoints) << " "; if(EventEqual != default_event_equal) s << "-event_equal " << bool_to_string(EventEqual) << " "; - for(i=0; i " << "the track-based " << TCStatLineType_TCMPR_Str @@ -1611,7 +1682,7 @@ void TCStatJobFilter::filter_tracks(TCLineCounts &n) { if(EventEqual == true) event_equalize_tracks(); // Check for no common cases - if(EventEqualSet == true && EventEqualCases.n_elements() == 0) { + if(EventEqualSet == true && EventEqualCases.n() == 0) { mlog << Debug(1) << "Event equalization of tracks found no common cases.\n"; } @@ -1650,7 +1721,7 @@ void TCStatJobFilter::filter_lines(TCLineCounts &n) { if(EventEqual == true) event_equalize_lines(); // Check for no common cases - if(EventEqualSet == true && EventEqualCases.n_elements() == 0) { + if(EventEqualSet == true && EventEqualCases.n() == 0) { mlog << Debug(1) << "Event equalization of lines found no common cases.\n"; } @@ -1793,7 +1864,7 @@ StringArray TCStatJobSummary::parse_job_command(const char *jobstring) { a = TCStatJob::parse_job_command(jobstring); // Loop over the StringArray elements - for(i=0; i " << "this function may only be called when using the " << "-column option in the job command line:\n" @@ -1904,7 +1975,7 @@ void TCStatJobSummary::do_job(const StringArray &file_list, // // If not specified, assume TCMPR by adding it to the LineType - if(LineType.n_elements() == 0) LineType.add(TCStatLineType_TCMPR_Str); + if(LineType.n() == 0) LineType.add(TCStatLineType_TCMPR_Str); // Add the input file list TCSTFiles.add_files(file_list); @@ -1913,7 +1984,7 @@ void TCStatJobSummary::do_job(const StringArray &file_list, if(LineType.has(TCStatLineType_TCMPR_Str)) { // TCMPR and non-TCMPR LineTypes cannot be mixed - for(i=0; i " << "the track-based " << TCStatLineType_TCMPR_Str @@ -1950,7 +2021,7 @@ void TCStatJobSummary::summarize_tracks(TCLineCounts &n) { if(EventEqual == true) event_equalize_tracks(); // Check for no common cases - if(EventEqualSet == true && EventEqualCases.n_elements() == 0) { + if(EventEqualSet == true && EventEqualCases.n() == 0) { mlog << Debug(1) << "Event equalization of tracks found no common cases.\n"; } @@ -1992,7 +2063,7 @@ void TCStatJobSummary::summarize_lines(TCLineCounts &n) { if(EventEqual == true) event_equalize_lines(); // Check for no common cases - if(EventEqualSet == true && EventEqualCases.n_elements() == 0) { + if(EventEqualSet == true && EventEqualCases.n() == 0) { mlog << Debug(1) << "Event equalization of lines found no common cases.\n"; } @@ -2039,7 +2110,7 @@ void TCStatJobSummary::process_pair(TrackPairInfo &pair) { for(i=0; i&m) { mlog << Debug(5) << "Summary Map Insert (" << it->first << ") " - << it->second.Val.n_elements() << " values: " + << it->second.Val.n() << " values: " << it->second.Val.serialize() << "\n"; // Add the pair to the map @@ -2132,7 +2203,7 @@ void TCStatJobSummary::add_map(map&m) { mlog << Debug(5) << "Summary Map Add (" << it->first << ") " - << it->second.Val.n_elements() << " values: " + << it->second.Val.n() << " values: " << it->second.Val.serialize() << "\n"; // Add the value for the existing key @@ -2165,11 +2236,11 @@ void TCStatJobSummary::do_output(ostream &out) { // Setup the output table out_at.set_size((int) SummaryMap.size() + 1, - ByColumn.n_elements() + 24); + ByColumn.n() + 24); // Left-justify case info and right-justify summary output for(i=0; isecond.Val.n_elements(); i++) { + for(i=0; isecond.Val.n(); i++) { if(!is_bad_data(it->second.Val[i])) { v.add(it->second.Val[i]); init.add(it->second.Init[i]); @@ -2244,7 +2315,7 @@ void TCStatJobSummary::do_output(ostream &out) { // Build index array index.clear(); - for(i=0; isecond.Val.n_elements()); - out_at.set_entry(r, c++, v.n_elements()); + out_at.set_entry(r, c++, it->second.Val.n()); + out_at.set_entry(r, c++, v.n()); out_at.set_entry(r, c++, mean_ci.v); out_at.set_entry(r, c++, mean_ci.v_ncl[0]); out_at.set_entry(r, c++, mean_ci.v_ncu[0]); @@ -2352,11 +2423,11 @@ void TCStatJobSummary::compute_fsp(NumArray &total, NumArray &best, mlog << Debug(4) << "Computing frequency of superior performance for " - << Column.n_elements() << " columns and " - << case_list.n_elements() << " cases.\n"; + << Column.n() << " columns and " + << case_list.n() << " cases.\n"; // Loop over the columns being summarized - for(i=0; isecond.Hdr.n_elements(); k++) { + for(k=0; ksecond.Hdr.n(); k++) { // Check if entry matches the current case if(strncasecmp(Column[i].c_str(), it->first.c_str(), @@ -2498,9 +2569,9 @@ bool is_time_series(const TimeArray &init, const NumArray &lead, dsec = bad_data_int; // The arrays should all be of the same length > 1 - if(init.n_elements() != lead.n_elements() || - init.n_elements() != valid.n_elements() || - init.n_elements() < 2) { + if(init.n() != lead.n() || + init.n() != valid.n() || + init.n() < 2) { mlog << Debug(4) << "Skipping time-series computations since the array " << "lengths differ.\n"; @@ -2513,7 +2584,7 @@ bool is_time_series(const TimeArray &init, const NumArray &lead, dvalid = valid[1] - valid[0]; // Loop over the entries to determine the time spacing - for(i=0; i= mean); @@ -2609,8 +2680,8 @@ int compute_time_to_indep(const NumArray &val, int ds) { exp_runs = 1.0 + 2.0*(n_abv * n_bel)/(n_abv + n_bel); // Calculate effective sample size, time to independence - eff_size = val.n_elements()*(n_run_abv + n_run_bel)/exp_runs; - tind = ds*val.n_elements()/eff_size; + eff_size = val.n()*(n_run_abv + n_run_bel)/exp_runs; + tind = ds*val.n()/eff_size; return(nint(tind)); } @@ -2622,7 +2693,7 @@ StringArray intersection(const StringArray &s1, const StringArray &s2) { int i; // Add elements common to both list - for(i=0; isecond.Hdr.n_elements(); + r += it->second.Hdr.n(); } // Format the output table out_at.set_size(r + 1, - 9 + ByColumn.n_elements() + 15); - setup_table(out_at, 9 + ByColumn.n_elements(), get_precision()); + 9 + ByColumn.n() + 15); + setup_table(out_at, 9 + ByColumn.n(), get_precision()); // Initialize row and column indices r = c = 0; @@ -3339,7 +3410,7 @@ void TCStatJobRIRW::do_mpr_output(ostream &out) { out_at.set_entry(r, c++, "WINDOW_END"); // Write case column names - for(i=0; isecond.Hdr.n_elements(); i++,r++) { + for(i=0; isecond.Hdr.n(); i++,r++) { // Initialize column counter c = 0; @@ -3384,14 +3455,14 @@ void TCStatJobRIRW::do_mpr_output(ostream &out) { // Write case column values sa = it->first.split(":"); - for(j=1; jsecond.Hdr[i]; sa = cs.split(":"); - for(j=0; j 0) { if(!mask_poly.latlon_is_inside_dege(lat, lon)) { @@ -3967,7 +4038,7 @@ bool check_masks(const MaskPoly &mask_poly, const Grid &mask_grid, } // - // Check grid masking. + // Check grid masking // if(mask_grid.nx() > 0 || mask_grid.ny() > 0) { mask_grid.latlon_to_xy(lat, -1.0*lon, grid_x, grid_y); @@ -3977,7 +4048,7 @@ bool check_masks(const MaskPoly &mask_poly, const Grid &mask_grid, } // - // Check area mask. + // Check area mask // if(mask_area.nx() > 0 || mask_area.ny() > 0) { if(!mask_area.s_is_on(nint(grid_x), nint(grid_y))) { diff --git a/met/src/tools/tc_utils/tc_stat/tc_stat_job.h b/met/src/tools/tc_utils/tc_stat/tc_stat_job.h index f97d5ae581..4ad98be987 100644 --- a/met/src/tools/tc_utils/tc_stat/tc_stat_job.h +++ b/met/src/tools/tc_utils/tc_stat/tc_stat_job.h @@ -286,13 +286,15 @@ class TCStatJob { map ColumnThreshMap; // ASCII column string matching - map ColumnStrMap; + map ColumnStrIncMap; + map ColumnStrExcMap; // Numeric column thresholds map InitThreshMap; // ASCII column string matching - map InitStrMap; + map InitStrIncMap; + map InitStrExcMap; // Variables to the store the analysis job specification ConcatString DumpFile; // Dump TrackPairInfo used to a file diff --git a/test/config/TCStatConfig_ALAL2010 b/test/config/TCStatConfig_ALAL2010 index 714029745f..8f59d36f5b 100644 --- a/test/config/TCStatConfig_ALAL2010 +++ b/test/config/TCStatConfig_ALAL2010 @@ -112,6 +112,12 @@ column_thresh_val = []; column_str_name = []; column_str_val = []; +// +// Stratify by excluding strings in non-numeric data columns. +// +column_str_exc_name = []; +column_str_exc_val = []; + // // Similar to the column_thresh options above // @@ -124,6 +130,12 @@ init_thresh_val = []; init_str_name = []; init_str_val = []; +// +// Similar to the column_str_exc options above +// +init_str_exc_name = []; +init_str_exc_val = []; + // // Stratify by the ADECK and BDECK distances to land. // diff --git a/test/config/TCStatConfig_PROBRIRW b/test/config/TCStatConfig_PROBRIRW index 9843408d2a..bf443a9e66 100644 --- a/test/config/TCStatConfig_PROBRIRW +++ b/test/config/TCStatConfig_PROBRIRW @@ -112,6 +112,12 @@ column_thresh_val = []; column_str_name = []; column_str_val = []; +// +// Stratify by excluding strings in non-numeric data columns. +// +column_str_exc_name = []; +column_str_exc_val = []; + // // Similar to the column_thresh options above // @@ -124,6 +130,12 @@ init_thresh_val = []; init_str_name = []; init_str_val = []; +// +// Similar to the column_str_exc options above +// +init_str_exc_name = []; +init_str_exc_val = []; + // // Stratify by the ADECK and BDECK distances to land. // diff --git a/test/xml/unit_stat_analysis.xml b/test/xml/unit_stat_analysis.xml index 799011f8a6..1558d101fd 100644 --- a/test/xml/unit_stat_analysis.xml +++ b/test/xml/unit_stat_analysis.xml @@ -315,6 +315,21 @@
+ + &MET_BIN;/stat_analysis + \ + -lookin &OUTPUT_DIR;/point_stat/point_stat_GRIB1_NAM_GDAS_120000L_20120409_120000V.stat \ + -job filter -line_type MPR -fcst_var TMP -fcst_lev Z2 -vx_mask DTC165 \ + -column_str OBS_SID KDLN,KDHT,KDEN,KDLS,KDMA,KDMN,KDVT,KDEW \ + -column_str_exc OBS_SID KDLN,KDHT \ + -dump_row &OUTPUT_DIR;/stat_analysis/POINT_STAT_FILTER_OBS_SID.stat \ + -v 1 + + + &OUTPUT_DIR;/stat_analysis/POINT_STAT_FILTER_OBS_SID.stat + + + OUTPUT_DIR &OUTPUT_DIR;/stat_analysis diff --git a/test/xml/unit_tc_stat.xml b/test/xml/unit_tc_stat.xml index 8a7891a2fd..7353d72f68 100644 --- a/test/xml/unit_tc_stat.xml +++ b/test/xml/unit_tc_stat.xml @@ -15,7 +15,6 @@ &TEST_DIR; true - &MET_BIN;/tc_stat \ @@ -33,6 +32,20 @@ + + &MET_BIN;/tc_stat + \ + -lookin &OUTPUT_DIR;/tc_pairs/alal2010.tcst \ + -job filter -dump_row &OUTPUT_DIR;/tc_stat/ALAL2010_FILTER_STRINGS.tcst \ + -init_str LEVEL TS,HU -init_str_exc WATCH_WARN HUWARN \ + -column_str LEVEL HU -column_str_exc WATCH_WARN TSWATCH \ + -v 2 + + + &OUTPUT_DIR;/tc_stat/ALAL2010_FILTER_STRINGS.tcst + + + &MET_BIN;/tc_stat \ From 6055600ea746ff8f3317569cb925d5476c102b32 Mon Sep 17 00:00:00 2001 From: johnhg Date: Tue, 30 Mar 2021 16:55:05 -0600 Subject: [PATCH 084/165] Bugfix 1737 develop little_r (#1739) * Per #1737, migrate the same fix from main_v9.1 over to the develop branch. * Per #1737, add another unit test for running ascii2nc with corrupt littl_r records. --- .../tools/other/ascii2nc/little_r_handler.cc | 73 ++++++++++++------- test/xml/unit_ascii2nc.xml | 12 +++ 2 files changed, 60 insertions(+), 25 deletions(-) diff --git a/met/src/tools/other/ascii2nc/little_r_handler.cc b/met/src/tools/other/ascii2nc/little_r_handler.cc index b3d49787ea..a604a96355 100644 --- a/met/src/tools/other/ascii2nc/little_r_handler.cc +++ b/met/src/tools/other/ascii2nc/little_r_handler.cc @@ -66,6 +66,8 @@ static const string lr_grib_names[] = { // Little-R regular expression used to determine file type static const char *lr_rpt_reg_exp = "FM-[0-9]"; +static const char *lr_dtg_reg_exp = "[0-9]\\{14\\}"; + //////////////////////////////////////////////////////////////////////// @@ -137,46 +139,49 @@ bool LittleRHandler::_readObservations(LineDataFile &ascii_file) int n_data_hdr; StringArray mappedTypes; StringArray unmappedTypes; + bool is_bad_header = false; while (ascii_file.read_fwf_line(data_line, lr_rpt_wdth, n_lr_rpt_wdth)) { + // Check for expected header line if (!check_reg_exp(lr_rpt_reg_exp, data_line[4])) { mlog << Error << "\nLittleRHandler::_readObservations() -> " << "the fifth entry of the little_r report on line " - << data_line.line_number() << " does not match \"" + << data_line.line_number() + << " does not match the regular expression \"" << lr_rpt_reg_exp << "\":\n\"" << data_line[4] << "\"\n\n"; return false; } // Store the message type - ConcatString concat_string = (string)data_line[4]; - concat_string.ws_strip(); + ConcatString cs = (string)data_line[4]; + cs.ws_strip(); ConcatString hdr_typ; - if (_messageTypeMap[concat_string] != "") + if (_messageTypeMap.count(cs) > 0) { - hdr_typ = _messageTypeMap[concat_string]; - if (!mappedTypes.has(concat_string)) { + hdr_typ = _messageTypeMap[cs]; + if (!mappedTypes.has(cs)) { mlog << Debug(5) - << "Switching little_r report type \"" << concat_string + << "Switching little_r report type \"" << cs << "\" to message type \"" << hdr_typ << "\".\n"; - mappedTypes.add(concat_string); + mappedTypes.add(cs); } } else { - hdr_typ = concat_string; + hdr_typ = cs; hdr_typ.replace(" ", "_", false); - - if (!unmappedTypes.has(concat_string)) { - mlog << Warning << "\nLittleRHandler::_processObs() -> " + + if (!unmappedTypes.has(cs)) { + mlog << Warning << "\nLittleRHandler::_readObservations() -> " << "Storing message type as \"" << hdr_typ - << "\" for unexpected report type \"" << concat_string << "\".\n\n"; - unmappedTypes.add(concat_string); + << "\" for unexpected report type \"" << cs << "\".\n\n"; + unmappedTypes.add(cs); } } @@ -188,16 +193,29 @@ bool LittleRHandler::_readObservations(LineDataFile &ascii_file) // Store the valid time in YYYYMMDD_HHMMSS format - ConcatString hdr_vld_str; - - concat_string = data_line[17]; - concat_string.ws_strip(); - hdr_vld_str << cs_erase; - hdr_vld_str.format("%.8s_%.6s", - concat_string.text(), concat_string.text()+8); + time_t hdr_vld = 0; - time_t hdr_vld = _getValidTime(hdr_vld_str.text()); + if (check_reg_exp(lr_dtg_reg_exp, data_line[17])) + { + ConcatString hdr_vld_str; + cs = data_line[17]; + cs.ws_strip(); + hdr_vld_str << cs_erase; + hdr_vld_str.format("%.8s_%.6s", cs.text(), cs.text()+8); + hdr_vld = _getValidTime(hdr_vld_str.text()); + is_bad_header = false; + + } else + { + mlog << Warning << "\nLittleRHandler::_readObservations() -> " + << "the 18 entry of the little_r report on line " + << data_line.line_number() + << " does not match the timestring regular expression \"" + << lr_dtg_reg_exp << "\":\n\"" << data_line[17] << "\"\n\n"; + is_bad_header = true; + } + // Store the station location double hdr_lat = atof(data_line[0]); @@ -211,7 +229,8 @@ bool LittleRHandler::_readObservations(LineDataFile &ascii_file) // Observation of sea level pressure in pascals. - if (!is_eq(atof(data_line[18]), lr_missing_value)) + if (!is_eq(atof(data_line[18]), lr_missing_value) && + !is_bad_header) { ConcatString obs_qty = (is_eq(atof(data_line[19]), lr_missing_value) ? na_string : (string)data_line[19]); @@ -237,12 +256,16 @@ bool LittleRHandler::_readObservations(LineDataFile &ascii_file) int i_data = 0; while (ascii_file.read_fwf_line(data_line, lr_meas_wdth, n_lr_meas_wdth)) { + // Check for the end of report if (is_eq(atof(data_line[0]), lr_end_value) && - is_eq(atof(data_line[2]), lr_end_value)) + is_eq(atof(data_line[2]), lr_end_value)) break; + // Skip data lines if the header line is bad + if (is_bad_header) continue; + // Retrieve pressure and height double obs_prs = (is_eq(atof(data_line[0]), lr_missing_value) ? @@ -305,7 +328,7 @@ bool LittleRHandler::_readObservations(LineDataFile &ascii_file) if (n_data_hdr != i_data) { - mlog << Warning << "\nprocess_little_r_obs() -> " + mlog << Warning << "\nLittleRHandler::_readObservations() -> " << "the number of data lines specified in the header (" << n_data_hdr << ") does not match the number found in the data (" diff --git a/test/xml/unit_ascii2nc.xml b/test/xml/unit_ascii2nc.xml index fc1d1c4b86..2edb2bf9b7 100644 --- a/test/xml/unit_ascii2nc.xml +++ b/test/xml/unit_ascii2nc.xml @@ -76,6 +76,18 @@ + + &MET_BIN;/ascii2nc + \ + &DATA_DIR_OBS;/ascii/OBS:2015080700_bad_record \ + &OUTPUT_DIR;/ascii2nc/OBS:2015080700_bad_record.nc \ + -v 1 + + + &OUTPUT_DIR;/ascii2nc/OBS:2015080700_bad_record.nc + + + &MET_BIN;/ascii2nc \ From 804b1ac397ccc78bb19d39e855dbde27dcfaedc7 Mon Sep 17 00:00:00 2001 From: jprestop Date: Thu, 1 Apr 2021 12:14:29 -0600 Subject: [PATCH 085/165] Feature GitHub actions (#1742) * Adding files to build documenation via GitHub Actions * Removing html_theme_options * Removed warnings.log from help section --- .github/workflows/main.yml | 50 ++++++++++++++++++++++++++++++++++++++ met/docs/Makefile | 3 ++- met/docs/conf.py | 2 -- 3 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000000..d959c9e411 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,50 @@ +name: MET CI/CD Workflow +on: + push: + branches: + - develop + - develop-ref + - feature_* + - main_* + - bugfix_* + pull_request: + types: [opened, reopened, synchronize] + +jobs: + documentation: + name: Build Documentation + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: '3.6' + - name: Install dependencies + run: | + python -m pip install --upgrade python-dateutil requests sphinx \ + sphinx-gallery Pillow sphinx_rtd_theme + - name: Build docs + continue-on-error: true + run: | + DOCS_DIR=${GITHUB_WORKSPACE}/met/docs + cd ${DOCS_DIR} + make clean html + cd ${GITHUB_WORKSPACE} + warning_file=${DOCS_DIR}/_build/warnings.log + mkdir -p artifact/documentation + cp -r ${DOCS_DIR}/_build/html/* artifact/documentation + if [ -s $warning_file ]; then + cp -r ${DOCS_DIR}/_build/warnings.log artifact/doc_warnings.log + cp artifact/doc_warnings.log artifact/documentation + else + rm ${warning_file} + fi + - uses: actions/upload-artifact@v2 + with: + name: documentation + path: artifact/documentation + - uses: actions/upload-artifact@v2 + with: + name: documentation_warnings.log + path: artifact/doc_warnings.log + if-no-files-found: ignore diff --git a/met/docs/Makefile b/met/docs/Makefile index 6d88c8d309..81e7849441 100644 --- a/met/docs/Makefile +++ b/met/docs/Makefile @@ -21,4 +21,5 @@ clean: # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + [ -d $(BUILDDIR) ] || mkdir -p $(BUILDDIR) + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -w "$(BUILDDIR)/warnings.log" diff --git a/met/docs/conf.py b/met/docs/conf.py index 13f65b1b9d..2a51afe4d7 100644 --- a/met/docs/conf.py +++ b/met/docs/conf.py @@ -53,8 +53,6 @@ html_theme = 'sphinx_rtd_theme' html_theme_path = ["_themes", ] html_js_files = ['pop_ver.js'] -html_theme_options = {'canonical_url': 'https://dtcenter.github.io/MET/latest/'} -html_theme_options['versions'] = {'latest': '../latest', 'develop': '../develop'} html_css_files = ['theme_override.css'] # Add any paths that contain custom static files (such as style sheets) here, From 853ad34b7f8f74bc8a73d2787f3a4da49c59ca71 Mon Sep 17 00:00:00 2001 From: johnhg Date: Thu, 1 Apr 2021 16:56:03 -0600 Subject: [PATCH 086/165] Feature 1575 large_diffs (#1741) * Per #1575, add mpr_column and mpr_thresh entries to all of the Grid-Stat and Point-Stat config files. * Per #1575, define config strings to be parsed from the config files. * Per #1575, store col_name_ptr and col_thresh_ptr in PairBase. They are being used for PairDataPoint to do MPR filtering in Grid-Stat and Point-Stat. But they could be eventually be extended to filter ORANK columns for Ensemble-Stat. * Per #1575, add MPR filtering logic to pair_data_point.cc. Include filtering logic in PairDataPoint instead of VxPairDataPoint since Grid-Stat uses PairDataPoint. * Per #1575, update point_stat to parse the mpr_column and mpr_thresh config file options. Include the MPR rejection reason code counts in the log output. * Per #1575, updated Grid-Stat to parse mpr_column and mpr_thresh options. * Per #1575, update Point-Stat to store mpr_sa and mpr_ta locally and then call set_mpr_filt() after the VxPairDataPoint object has been sized and allocated. * Per #1575, renamed PairDataEnsemble::subset_pairs() to subset_pairs_obs_thresh() to be a little more explicit about things. I'll do the same for PairDataPoint using names subset_pairs_cnt_thresh() and subset_pairs_mpr_thresh(). * Per #1575, some cleanup, moving check_fo_thresh() utility function from vx_config to vx_statistics library. * Per #1575, when implementing this for Grid-Stat, I realized that there isn't much benefit in storing col_name_ptr and col_name_thresh in PairBase. These changes remove that. * Per #1575, updating pair_data_point.h/.cc to handle the subsetting of data based on the MPR thresh. * Per #1575, rename subset_pairs() to subset_pairs_cnt_thresh() to be a bit more explicit with the naming conventions. * Per #1575, no real changes here. Just reorganizing the location of the mpr_sa and mpr_ta members. * Per #1575, make the subset_pairs() utility function a member function of the PairDataPoint class named subset_pairs_cnt_thresh() and update the application code to call it. * Per #1575, need to actually set the mpr_thresh! * Per #1575, update subset_pairs_mpr_thresh() to make sure the StringArray and ThreshArray lengths are the same. * Per #1575, replace PairDataPoint::subset_pairs_mpr_thresh() with a utility function named apply_mpr_thresh_mask(). This is for Grid-Stat to apply the mpr_thresh settings after the DataPlane pairs have been created but prior to applying any smoothing operations. * Per #1575, add documentation about mpr_column and mpr_thresh. * Per #1575, mpr_columns can also include CLIMO_CDF. * Per #1575, add tests for Grid-Stat and Point-Stat to exercise the mpr_column and mpr_thresh config file options. --- met/data/config/GridStatConfig_default | 2 + met/data/config/PointStatConfig_default | 2 + met/docs/Users_Guide/config_options.rst | 25 +- met/docs/Users_Guide/grid-stat.rst | 4 +- met/docs/Users_Guide/point-stat.rst | 4 +- met/scripts/config/GridStatConfig_APCP_12 | 3 +- met/scripts/config/GridStatConfig_APCP_24 | 3 + met/scripts/config/GridStatConfig_POP_12 | 2 + met/scripts/config/GridStatConfig_all | 2 + met/scripts/config/PointStatConfig | 2 + met/src/basic/vx_config/config_constants.h | 6 +- met/src/basic/vx_config/config_util.cc | 40 -- met/src/basic/vx_config/config_util.h | 4 - met/src/libcode/vx_statistics/met_stats.cc | 2 +- met/src/libcode/vx_statistics/pair_base.h | 2 + .../vx_statistics/pair_data_ensemble.cc | 2 +- .../vx_statistics/pair_data_ensemble.h | 2 +- .../libcode/vx_statistics/pair_data_point.cc | 344 +++++++++++++++--- .../libcode/vx_statistics/pair_data_point.h | 32 +- .../tools/core/ensemble_stat/ensemble_stat.cc | 4 +- met/src/tools/core/grid_stat/grid_stat.cc | 14 +- .../core/grid_stat/grid_stat_conf_info.cc | 12 +- .../core/grid_stat/grid_stat_conf_info.h | 3 + met/src/tools/core/point_stat/point_stat.cc | 8 +- .../core/point_stat/point_stat_conf_info.cc | 12 + .../core/point_stat/point_stat_conf_info.h | 3 + .../core/series_analysis/series_analysis.cc | 4 +- test/config/GridStatConfig_APCP_regrid | 2 + test/config/GridStatConfig_GRIB_lvl_typ_val | 2 + test/config/GridStatConfig_GRIB_set_attr | 2 + test/config/GridStatConfig_GTG_latlon | 2 + test/config/GridStatConfig_GTG_lc | 2 + test/config/GridStatConfig_apply_mask | 2 + test/config/GridStatConfig_climo_WMO | 2 + test/config/GridStatConfig_climo_prob | 2 + test/config/GridStatConfig_fourier | 2 + test/config/GridStatConfig_grid_weight | 2 + test/config/GridStatConfig_interp_shape | 2 + test/config/GridStatConfig_mpr_thresh | 274 ++++++++++++++ test/config/GridStatConfig_no_leap | 2 + test/config/GridStatConfig_prob_as_scalar | 2 + test/config/GridStatConfig_python | 2 + test/config/GridStatConfig_python_mixed | 2 + test/config/GridStatConfig_rtma | 2 + test/config/GridStatConfig_rtma_perc_thresh | 2 + test/config/GridStatConfig_st4 | 2 + test/config/GridStatConfig_st4_censor | 2 + test/config/PointStatConfig_APCP | 2 + test/config/PointStatConfig_APCP_HIRA | 2 + test/config/PointStatConfig_GTG_latlon | 2 + test/config/PointStatConfig_GTG_lc | 2 + test/config/PointStatConfig_INTERP_OPTS | 2 + test/config/PointStatConfig_LAND_TOPO_MASK | 2 + test/config/PointStatConfig_MASK_SID | 2 + test/config/PointStatConfig_PHYS | 2 + test/config/PointStatConfig_PHYS_pint | 2 + test/config/PointStatConfig_WINDS | 2 + test/config/PointStatConfig_aeronet | 2 + test/config/PointStatConfig_airnow | 2 + test/config/PointStatConfig_climo | 2 + test/config/PointStatConfig_climo_WMO | 2 + test/config/PointStatConfig_climo_prob | 2 + test/config/PointStatConfig_dup | 2 + test/config/PointStatConfig_mpr_thresh | 221 +++++++++++ test/config/PointStatConfig_obs_summary | 2 + test/config/PointStatConfig_obs_summary_all | 2 + test/config/PointStatConfig_prob | 2 + test/config/PointStatConfig_python | 2 + test/config/PointStatConfig_sid_inc_exc | 2 + test/config/ref_config/GridStatConfig_03h | 2 + test/config/ref_config/GridStatConfig_24h | 3 + test/config/ref_config/PointStatConfig_ADPUPA | 2 + test/config/ref_config/PointStatConfig_ONLYSF | 2 + test/config/ref_config/PointStatConfig_WINDS | 2 + test/xml/unit_grid_stat.xml | 27 ++ test/xml/unit_point_stat.xml | 27 ++ 76 files changed, 1065 insertions(+), 118 deletions(-) create mode 100644 test/config/GridStatConfig_mpr_thresh create mode 100644 test/config/PointStatConfig_mpr_thresh diff --git a/met/data/config/GridStatConfig_default b/met/data/config/GridStatConfig_default index acd3a71051..c32872783a 100644 --- a/met/data/config/GridStatConfig_default +++ b/met/data/config/GridStatConfig_default @@ -43,6 +43,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/met/data/config/PointStatConfig_default b/met/data/config/PointStatConfig_default index ae05370fbc..b0a4981c62 100644 --- a/met/data/config/PointStatConfig_default +++ b/met/data/config/PointStatConfig_default @@ -38,6 +38,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = [ NA ]; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/met/docs/Users_Guide/config_options.rst b/met/docs/Users_Guide/config_options.rst index e1f65cc7b4..1277564934 100644 --- a/met/docs/Users_Guide/config_options.rst +++ b/met/docs/Users_Guide/config_options.rst @@ -640,12 +640,12 @@ to be verified. This dictionary may include the following entries: metadata of any output files, but the user can set the "desc" entry accordingly. - Examples of user-defined conversion functions include: + Examples of user-defined data censoring operations include: .. code-block:: none censor_thresh = [ >12000 ]; - censor_val = [ 12000 ]; + censor_val = [ 12000 ]; * Several configuration options are provided to override and correct the metadata read from the input file. The supported options are listed @@ -678,6 +678,25 @@ to be verified. This dictionary may include the following entries: is_wind_direction = boolean; is_prob = boolean; + * The "mpr_column" and "mpr_thresh" entries are arrays of strings and + thresholds to specify which matched pairs should be included in the + statistics. These options apply to the Point-Stat and Grid-Stat tools. + They are parsed seperately for each "obs.field" array entry. + The "mpr_column" strings specify MPR column names ("FCST", "OBS", + "CLIMO_MEAN", "CLIMO_STDEV", or "CLIMO_CDF"), differences of columns + ("FCST-OBS"), or the absolute value of those differences ("ABS(FCST-OBS)"). + The number of "mpr_thresh" thresholds must match the number of "mpr_column" + entries, and the n-th threshold is applied to the n-th column. Any matched + pairs which do not meet any of the specified thresholds are excluded from + the analysis. For example, the following settings exclude matched pairs + where the observation value differs from the forecast or climatological + mean values by more than 10: + + .. code-block:: none + + mpr_column = [ "ABS(OBS-FCST)", "ABS(OBS-CLIMO_MEAN)" ]; + mpr_thresh = [ <=10, <=10 ]; + * The "cat_thresh" entry is an array of thresholds to be used when computing categorical statistics. @@ -981,6 +1000,8 @@ or obs = { censor_thresh = []; censor_val = []; + mpr_column = []; + mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/met/docs/Users_Guide/grid-stat.rst b/met/docs/Users_Guide/grid-stat.rst index a3aac48240..ff5808df9c 100644 --- a/met/docs/Users_Guide/grid-stat.rst +++ b/met/docs/Users_Guide/grid-stat.rst @@ -221,13 +221,15 @@ __________________________ type = [ { method = NEAREST; width = 1; } ]; } censor_thresh = []; censor_val = []; + mpr_column = []; + mpr_thresh = []; eclv_points = 0.05; rank_corr_flag = TRUE; tmp_dir = "/tmp"; output_prefix = ""; version = "VN.N"; -The configuration options listed above are common to many MET tools and are described in :numref:`config_options`. +The configuration options listed above are common to multiple MET tools and are described in :numref:`config_options`. ___________________________ diff --git a/met/docs/Users_Guide/point-stat.rst b/met/docs/Users_Guide/point-stat.rst index 1ec6fdacb9..bfbbc53fba 100644 --- a/met/docs/Users_Guide/point-stat.rst +++ b/met/docs/Users_Guide/point-stat.rst @@ -334,6 +334,8 @@ ________________________ type = [ { method = NEAREST; width = 1; } ]; } censor_thresh = []; censor_val = []; + mpr_column = []; + mpr_thresh = []; eclv_points = 0.05; rank_corr_flag = TRUE; sid_inc = []; @@ -347,7 +349,7 @@ ________________________ output_prefix = ""; version = "VN.N"; -The configuration options listed above are common to many MET tools and are described in :numref:`config_options`. +The configuration options listed above are common to multiple MET tools and are described in :numref:`config_options`. _________________________ diff --git a/met/scripts/config/GridStatConfig_APCP_12 b/met/scripts/config/GridStatConfig_APCP_12 index 9ea99e03bc..f4308d3bca 100644 --- a/met/scripts/config/GridStatConfig_APCP_12 +++ b/met/scripts/config/GridStatConfig_APCP_12 @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; @@ -52,7 +54,6 @@ nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; rank_corr_flag = FALSE; - // // Forecast and observation fields to be verified // diff --git a/met/scripts/config/GridStatConfig_APCP_24 b/met/scripts/config/GridStatConfig_APCP_24 index 9d73b6b21c..af2cf4f003 100644 --- a/met/scripts/config/GridStatConfig_APCP_24 +++ b/met/scripts/config/GridStatConfig_APCP_24 @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; @@ -51,6 +53,7 @@ eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; rank_corr_flag = FALSE; + // // Forecast and observation fields to be verified // diff --git a/met/scripts/config/GridStatConfig_POP_12 b/met/scripts/config/GridStatConfig_POP_12 index faff0be7e3..c46f639b94 100644 --- a/met/scripts/config/GridStatConfig_POP_12 +++ b/met/scripts/config/GridStatConfig_POP_12 @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/met/scripts/config/GridStatConfig_all b/met/scripts/config/GridStatConfig_all index 1050ab5920..9360adca0a 100644 --- a/met/scripts/config/GridStatConfig_all +++ b/met/scripts/config/GridStatConfig_all @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/met/scripts/config/PointStatConfig b/met/scripts/config/PointStatConfig index fe007f5f9e..159e9ae1b8 100644 --- a/met/scripts/config/PointStatConfig +++ b/met/scripts/config/PointStatConfig @@ -33,6 +33,8 @@ regrid = { censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/met/src/basic/vx_config/config_constants.h b/met/src/basic/vx_config/config_constants.h index e63a6935f0..bc82d55625 100644 --- a/met/src/basic/vx_config/config_constants.h +++ b/met/src/basic/vx_config/config_constants.h @@ -380,7 +380,7 @@ struct MaskLatLon { // enum DuplicateType { - DuplicateType_None, // Apply no logic for duplicate point obs + DuplicateType_None, // Apply no logic for duplicate point obs DuplicateType_Unique // Filter out duplicate observation values }; @@ -394,7 +394,7 @@ enum ObsSummary { ObsSummary_None, // Keep all observations, no statistics ObsSummary_Nearest, // Keep only the observation closest in time ObsSummary_Min, // Keep only smallest value - ObsSummary_Max, // Keep only largest valueXS + ObsSummary_Max, // Keep only largest value ObsSummary_UW_Mean, // Calculate un-weighted mean ObsSummary_DW_Mean, // Calculate time weighted mean ObsSummary_Median, // Calculate median @@ -536,6 +536,8 @@ static const char conf_key_obs_qty[] = "obs_quality"; static const char conf_key_convert[] = "convert"; static const char conf_key_censor_thresh[] = "censor_thresh"; static const char conf_key_censor_val[] = "censor_val"; +static const char conf_key_mpr_column[] = "mpr_column"; +static const char conf_key_mpr_thresh[] = "mpr_thresh"; static const char conf_key_cnt_thresh[] = "cnt_thresh"; static const char conf_key_cnt_logic[] = "cnt_logic"; static const char conf_key_cat_thresh[] = "cat_thresh"; diff --git a/met/src/basic/vx_config/config_util.cc b/met/src/basic/vx_config/config_util.cc index 349eb06081..6eb13ef7a5 100644 --- a/met/src/basic/vx_config/config_util.cc +++ b/met/src/basic/vx_config/config_util.cc @@ -2285,46 +2285,6 @@ void check_mctc_thresh(const ThreshArray &ta) { /////////////////////////////////////////////////////////////////////////////// -bool check_fo_thresh(const double f, const double o, - const double cmn, const double csd, - const SingleThresh &ft, const SingleThresh &ot, - const SetLogic type) { - bool status = true; - bool fcheck = ft.check(f, cmn, csd); - bool ocheck = ot.check(o, cmn, csd); - SetLogic t = type; - - // If either of the thresholds is NA, reset the logic to intersection - // because an NA threshold is always true. - if(ft.get_type() == thresh_na || ot.get_type() == thresh_na) { - t = SetLogic_Intersection; - } - - switch(t) { - case(SetLogic_Union): - if(!fcheck && !ocheck) status = false; - break; - - case(SetLogic_Intersection): - if(!fcheck || !ocheck) status = false; - break; - - case(SetLogic_SymDiff): - if(fcheck == ocheck) status = false; - break; - - default: - mlog << Error << "\ncheck_fo_thresh() -> " - << "Unexpected SetLogic value of " << type << ".\n\n"; - exit(1); - break; - } - - return(status); -} - -/////////////////////////////////////////////////////////////////////////////// - const char * statlinetype_to_string(const STATLineType t) { const char *s = (const char *) 0; diff --git a/met/src/basic/vx_config/config_util.h b/met/src/basic/vx_config/config_util.h index d09a154c4c..ced39afb2d 100644 --- a/met/src/basic/vx_config/config_util.h +++ b/met/src/basic/vx_config/config_util.h @@ -80,10 +80,6 @@ extern void check_climo_n_vx(Dictionary *dict, const int); extern InterpMthd int_to_interpmthd(int); extern void check_mctc_thresh(const ThreshArray &); -extern bool check_fo_thresh(const double, const double, const double, const double, - const SingleThresh &, const SingleThresh &, - const SetLogic); - extern const char * statlinetype_to_string(const STATLineType); extern void statlinetype_to_string(const STATLineType, char *); extern STATLineType string_to_statlinetype(const char *); diff --git a/met/src/libcode/vx_statistics/met_stats.cc b/met/src/libcode/vx_statistics/met_stats.cc index e4074a79a6..27904462d1 100644 --- a/met/src/libcode/vx_statistics/met_stats.cc +++ b/met/src/libcode/vx_statistics/met_stats.cc @@ -1207,7 +1207,7 @@ void SL1L2Info::set(const PairDataPoint &pd_all) { zero_out(); // Apply continuous filtering thresholds to subset pairs - pd = subset_pairs(pd_all, fthresh, othresh, logic); + pd = pd_all.subset_pairs_cnt_thresh(fthresh, othresh, logic); // Check for no matched pairs to process if(pd.n_obs == 0) return; diff --git a/met/src/libcode/vx_statistics/pair_base.h b/met/src/libcode/vx_statistics/pair_base.h index 0c1bec3bd0..db7b63297f 100644 --- a/met/src/libcode/vx_statistics/pair_base.h +++ b/met/src/libcode/vx_statistics/pair_base.h @@ -71,6 +71,8 @@ class PairBase { MaskLatLon *mask_llpnt_ptr; // Pointer to Lat/Lon thresholds // which is not allocated + ////////////////////////////////////////////////////////////////// + ConcatString msg_typ; // Name of the verifying message type StringArray msg_typ_vals; // Message type values to be included diff --git a/met/src/libcode/vx_statistics/pair_data_ensemble.cc b/met/src/libcode/vx_statistics/pair_data_ensemble.cc index bc27df220c..5f21f17fe9 100644 --- a/met/src/libcode/vx_statistics/pair_data_ensemble.cc +++ b/met/src/libcode/vx_statistics/pair_data_ensemble.cc @@ -758,7 +758,7 @@ void PairDataEnsemble::compute_ssvar() { // //////////////////////////////////////////////////////////////////////// -PairDataEnsemble PairDataEnsemble::subset_pairs(const SingleThresh &ot) const { +PairDataEnsemble PairDataEnsemble::subset_pairs_obs_thresh(const SingleThresh &ot) const { // Check for no work to be done if(ot.get_type() == thresh_na) return(*this); diff --git a/met/src/libcode/vx_statistics/pair_data_ensemble.h b/met/src/libcode/vx_statistics/pair_data_ensemble.h index 5bfd4d4300..3d71af984b 100644 --- a/met/src/libcode/vx_statistics/pair_data_ensemble.h +++ b/met/src/libcode/vx_statistics/pair_data_ensemble.h @@ -142,7 +142,7 @@ class PairDataEnsemble : public PairBase { void compute_phist(); void compute_ssvar(); - PairDataEnsemble subset_pairs(const SingleThresh &ot) const; + PairDataEnsemble subset_pairs_obs_thresh(const SingleThresh &ot) const; }; //////////////////////////////////////////////////////////////////////// diff --git a/met/src/libcode/vx_statistics/pair_data_point.cc b/met/src/libcode/vx_statistics/pair_data_point.cc index d728b242cb..0ca19804dd 100644 --- a/met/src/libcode/vx_statistics/pair_data_point.cc +++ b/met/src/libcode/vx_statistics/pair_data_point.cc @@ -174,8 +174,7 @@ void PairDataPoint::set_point_pair(int i_obs, const char *sid, if(i_obs < 0 || i_obs >= n_obs) { mlog << Error << "\nPairDataPoint::set_point_pair() -> " << "range check error: " << i_obs << " not in (0, " - << n_obs << ").\n\n" - ; + << n_obs << ").\n\n"; exit(1); } @@ -232,6 +231,67 @@ bool PairDataPoint::add_grid_pair(const NumArray &f_in, const NumArray &o_in, return(true); } +//////////////////////////////////////////////////////////////////////// + +PairDataPoint PairDataPoint::subset_pairs_cnt_thresh( + const SingleThresh &ft, const SingleThresh &ot, + const SetLogic type) const { + + // Check for no work to be done + if(ft.get_type() == thresh_na && ot.get_type() == thresh_na) { + return(*this); + } + + int i; + PairDataPoint out_pd; + + // Allocate memory for output pairs + out_pd.extend(n_obs); + out_pd.set_climo_cdf_info(cdf_info); + + bool cmn_flag = set_climo_flag(f_na, cmn_na); + bool csd_flag = set_climo_flag(f_na, csd_na); + bool wgt_flag = set_climo_flag(f_na, wgt_na); + + // Loop over the pairs + for(i=0; i " + << "the \"" << conf_key_mpr_column << "\" (" + << write_css(sa) << ") and \"" << conf_key_mpr_thresh + << "\" (" << write_css(ta) + << ") config file entries must have the same length!\n\n"; + exit(1); + } + + mpr_column = sa; + mpr_thresh = ta; + + return; +} + +//////////////////////////////////////////////////////////////////////// + void VxPairDataPoint::set_climo_cdf_info(const ClimoCDFInfo &info) { for(int i=0; imagic_str() << " versus " + << obs_info->magic_str() + << ", skipping observation due to matched pair filter since " + << reason_cs << ":\n" + << point_obs_to_string(hdr_arr, hdr_typ_str, hdr_sid_str, + hdr_ut, obs_qty, obs_arr, var_name) + << "\n"; + inc_count(rej_mpr, i, j, k); + continue; + } + // Compute weight for current point wgt_v = (wgt_dp == (DataPlane *) 0 ? default_grid_weight : wgt_dp->get(x, y)); @@ -1336,64 +1445,199 @@ void VxPairDataPoint::inc_count(int ***&rej, int i, int j, int k) { // //////////////////////////////////////////////////////////////////////// -PairDataPoint subset_pairs(const PairDataPoint &pd, - const SingleThresh &ft, const SingleThresh &ot, - const SetLogic type) { +bool check_fo_thresh(double f, double o, double cmn, double csd, + const SingleThresh &ft, const SingleThresh &ot, + const SetLogic type) { + bool status = true; + bool fcheck = ft.check(f, cmn, csd); + bool ocheck = ot.check(o, cmn, csd); + SetLogic t = type; - // Check for no work to be done - if(ft.get_type() == thresh_na && ot.get_type() == thresh_na) { - return(pd); + // If either of the thresholds is NA, reset the logic to intersection + // because an NA threshold is always true. + if(ft.get_type() == thresh_na || ot.get_type() == thresh_na) { + t = SetLogic_Intersection; } - int i; - PairDataPoint out_pd; + switch(t) { + case(SetLogic_Union): + if(!fcheck && !ocheck) status = false; + break; - // Allocate memory for output pairs - out_pd.extend(pd.n_obs); - out_pd.set_climo_cdf_info(pd.cdf_info); + case(SetLogic_Intersection): + if(!fcheck || !ocheck) status = false; + break; - bool cmn_flag = set_climo_flag(pd.f_na, pd.cmn_na); - bool csd_flag = set_climo_flag(pd.f_na, pd.csd_na); - bool wgt_flag = set_climo_flag(pd.f_na, pd.wgt_na); + case(SetLogic_SymDiff): + if(fcheck == ocheck) status = false; + break; - // Loop over the pairs - for(i=0; i " + << "Unexpected SetLogic value of " << type << ".\n\n"; + exit(1); + break; + } - // Check for bad data - if(is_bad_data(pd.f_na[i]) || - is_bad_data(pd.o_na[i]) || - (cmn_flag && is_bad_data(pd.cmn_na[i])) || - (csd_flag && is_bad_data(pd.csd_na[i])) || - (wgt_flag && is_bad_data(pd.wgt_na[i]))) continue; + return(status); +} - // Keep pairs which meet the threshold criteria - if(check_fo_thresh(pd.f_na[i], pd.o_na[i], - pd.cmn_na[i], pd.csd_na[i], - ft, ot, type)) { +//////////////////////////////////////////////////////////////////////// - // Handle point data - if(pd.is_point_vx()) { - out_pd.add_point_pair(pd.sid_sa[i].c_str(), pd.lat_na[i], - pd.lon_na[i], pd.x_na[i], pd.y_na[i], - pd.vld_ta[i], pd.lvl_na[i], pd.elv_na[i], - pd.f_na[i], pd.o_na[i], pd.o_qc_sa[i].c_str(), - pd.cmn_na[i], pd.csd_na[i], pd.wgt_na[i]); - } - // Handle gridded data - else { - out_pd.add_grid_pair(pd.f_na[i], pd.o_na[i], pd.cmn_na[i], - pd.csd_na[i], pd.wgt_na[i]); +bool check_mpr_thresh(double f, double o, double cmn, double csd, + const StringArray &col_sa, const ThreshArray &col_ta, + ConcatString *reason_ptr) { + // Initialize + if(reason_ptr) reason_ptr->erase(); + + // Check arrays + if(col_sa.n() == 0 || col_ta.n() == 0) return(true); + + bool keep = true; + bool absv = false; + StringArray sa; + ConcatString cs; + double v, v_cur; + int i, j; + + // Loop over all the column filter names + for(i=0; i 1) { + + // Loop through the columns + for(j=1; j " + << "unsupported matched pair column name requested in \"" + << conf_key_mpr_column << "\" (" << s << ")!\n\n"; + exit(1); + } + + return(v); +} + +//////////////////////////////////////////////////////////////////////// + +void apply_mpr_thresh_mask(DataPlane &fcst_dp, DataPlane &obs_dp, + DataPlane &cmn_dp, DataPlane &csd_dp, + const StringArray &col_sa, const ThreshArray &col_ta) { + + // Check for no work to be done + if(col_sa.n() == 0 && col_ta.n() == 0) return; + + // Check for constant length + if(col_sa.n() != col_ta.n()) { + mlog << Error << "\napply_mpr_thresh_mask() -> " + << "the \"" << conf_key_mpr_column << "\" (" + << write_css(col_sa) << ") and \"" << conf_key_mpr_thresh + << "\" (" << write_css(col_ta) + << ") config file entries must have the same length!\n\n"; + exit(1); + } + + int nxy = fcst_dp.nx() * fcst_dp.ny(); + int n_skip = 0; + bool cmn_flag = !(cmn_dp.is_empty()); + bool csd_flag = !(csd_dp.is_empty()); + + // Loop over the pairs + for(int i=0; isubset_pairs(conf_info.vx_opt[i].othr_ta[m]); + pd = pd_ptr->subset_pairs_obs_thresh(conf_info.vx_opt[i].othr_ta[m]); // Continue if there are no points if(pd.n_obs == 0) continue; @@ -1779,7 +1779,7 @@ void process_grid_vx() { shc.set_obs_thresh(conf_info.vx_opt[i].othr_ta[l]); // Subset pairs using the current obs_thresh - pd = pd_all.subset_pairs(conf_info.vx_opt[i].othr_ta[l]); + pd = pd_all.subset_pairs_obs_thresh(conf_info.vx_opt[i].othr_ta[l]); // Continue if there are no points if(pd.n_obs == 0) continue; diff --git a/met/src/tools/core/grid_stat/grid_stat.cc b/met/src/tools/core/grid_stat/grid_stat.cc index 14b09c6d5a..cf30bd282f 100644 --- a/met/src/tools/core/grid_stat/grid_stat.cc +++ b/met/src/tools/core/grid_stat/grid_stat.cc @@ -106,6 +106,8 @@ // continuous and probabilistic statistics. // 050 03/02/20 Halley Gotway Add nc_pairs_var_name and rename // nc_pairs_var_str to nc_pairs_var_suffix. +// 051 03/28/21 Halley Gotway Add mpr_column and mpr_thresh +// filtering options. // //////////////////////////////////////////////////////////////////////// @@ -711,6 +713,13 @@ void process_scores() { << " climatology standard deviation field(s) for forecast " << conf_info.vx_opt[i].fcst_info->magic_str() << ".\n"; + // Apply MPR threshold filters + if(conf_info.vx_opt[i].mpr_sa.n() > 0) { + apply_mpr_thresh_mask(fcst_dp, obs_dp, cmn_dp, csd_dp, + conf_info.vx_opt[i].mpr_sa, + conf_info.vx_opt[i].mpr_ta); + } + // Setup the first pass through the data if(is_first_pass) setup_first_pass(fcst_dp); @@ -1961,8 +1970,9 @@ void do_cnt_sl1l2(const GridStatVxOpt &vx_opt, const PairDataPoint *pd_ptr) { for(i=0; isubset_pairs_cnt_thresh(vx_opt.fcnt_ta[i], + vx_opt.ocnt_ta[i], + vx_opt.cnt_logic); // Check for no matched pairs to process if(pd_thr.n_obs == 0) continue; diff --git a/met/src/tools/core/grid_stat/grid_stat_conf_info.cc b/met/src/tools/core/grid_stat/grid_stat_conf_info.cc index a5702ca06f..8b2b572eca 100644 --- a/met/src/tools/core/grid_stat/grid_stat_conf_info.cc +++ b/met/src/tools/core/grid_stat/grid_stat_conf_info.cc @@ -275,7 +275,7 @@ void GridStatConfInfo::process_flags() { // Check for at least one output data type if(!output_ascii_flag && !output_nc_flag) { - mlog << Error << "\nGridStatVxOpt::process_config() -> " + mlog << Error << "\nGridStatConfInfo::process_flags() -> " << "At least one output STAT or NetCDF type must be " << " requested in \"" << conf_key_output_flag << "\" or \"" << conf_key_nc_pairs_flag << "\".\n\n"; @@ -495,6 +495,9 @@ void GridStatVxOpt::clear() { var_name.clear(); var_suffix.clear(); + mpr_sa.clear(); + mpr_ta.clear(); + fcat_ta.clear(); ocat_ta.clear(); @@ -614,6 +617,10 @@ void GridStatVxOpt::process_config( // Populate the output_flag array with map values for(i=0; i= 5) { mlog << Debug(5) << "Parsed thresholds:\n" + << "Matched pair filter columns: " << write_css(mpr_sa) << "\n" + << "Matched pair filter thresholds: " << mpr_ta.get_str() << "\n" << "Forecast categorical thresholds: " << fcat_ta.get_str() << "\n" << "Observed categorical thresholds: " << ocat_ta.get_str() << "\n" << "Forecast continuous thresholds: " << fcnt_ta.get_str() << "\n" @@ -875,6 +884,7 @@ bool GridStatVxOpt::is_uv_match(const GridStatVxOpt &v) const { // // The following do not impact matched pairs: // desc, var_name, var_suffix, + // mpr_sa, mpr_ta, // fcat_ta, ocat_ta, // fcnt_ta, ocnt_ta, cnt_logic, // fwind_ta, owind_ta, wind_logic, diff --git a/met/src/tools/core/grid_stat/grid_stat_conf_info.h b/met/src/tools/core/grid_stat/grid_stat_conf_info.h index 3b92c5be06..e03b657488 100644 --- a/met/src/tools/core/grid_stat/grid_stat_conf_info.h +++ b/met/src/tools/core/grid_stat/grid_stat_conf_info.h @@ -145,6 +145,9 @@ class GridStatVxOpt { ConcatString var_suffix; // nc_pairs_var_suffix string // nc_pairs_var_str is deprecated + StringArray mpr_sa; // MPR filtering columns + ThreshArray mpr_ta; // MPR filtering thresholds + ThreshArray fcat_ta; // fcst categorical thresholds ThreshArray ocat_ta; // obs categorical thresholds diff --git a/met/src/tools/core/point_stat/point_stat.cc b/met/src/tools/core/point_stat/point_stat.cc index d1edfdb935..ba28097e6a 100644 --- a/met/src/tools/core/point_stat/point_stat.cc +++ b/met/src/tools/core/point_stat/point_stat.cc @@ -92,6 +92,8 @@ // 043 11/15/19 Halley Gotway Apply climatology bins to // continuous and probabilistic statistics. // 044 01/24/20 Halley Gotway Add HiRA RPS output. +// 045 03/28/21 Halley Gotway Add mpr_column and mpr_thresh +// filtering options. // //////////////////////////////////////////////////////////////////////// @@ -1016,6 +1018,7 @@ void process_scores() { << "Rejected: bad fcst value = " << conf_info.vx_opt[i].vx_pd.rej_fcst[j][k][l] << "\n" << "Rejected: bad climo mean = " << conf_info.vx_opt[i].vx_pd.rej_cmn[j][k][l] << "\n" << "Rejected: bad climo stdev = " << conf_info.vx_opt[i].vx_pd.rej_csd[j][k][l] << "\n" + << "Rejected: mpr filter = " << conf_info.vx_opt[i].vx_pd.rej_mpr[j][k][l] << "\n" << "Rejected: duplicates = " << conf_info.vx_opt[i].vx_pd.rej_dup[j][k][l] << "\n"; // Print report based on the number of matched pairs @@ -1421,8 +1424,9 @@ void do_cnt_sl1l2(const PointStatVxOpt &vx_opt, const PairDataPoint *pd_ptr) { for(i=0; isubset_pairs_cnt_thresh(vx_opt.fcnt_ta[i], + vx_opt.ocnt_ta[i], + vx_opt.cnt_logic); // Check for no matched pairs to process if(pd_thr.n_obs == 0) continue; diff --git a/met/src/tools/core/point_stat/point_stat_conf_info.cc b/met/src/tools/core/point_stat/point_stat_conf_info.cc index ecd6b8b3dc..5a039e1bae 100644 --- a/met/src/tools/core/point_stat/point_stat_conf_info.cc +++ b/met/src/tools/core/point_stat/point_stat_conf_info.cc @@ -606,6 +606,9 @@ void PointStatVxOpt::clear() { mask_sid.clear(); mask_llpnt.clear(); + mpr_sa.clear(); + mpr_ta.clear(); + mask_name.clear(); eclv_points.clear(); @@ -774,10 +777,16 @@ void PointStatVxOpt::process_config(GrdFileType ftype, int_to_setlogic(fdict.lookup_int(conf_key_wind_logic)), int_to_setlogic(odict.lookup_int(conf_key_wind_logic))); + // Conf: mpr_column and mpr_thresh + mpr_sa = odict.lookup_string_array(conf_key_mpr_column); + mpr_ta = odict.lookup_thresh_array(conf_key_mpr_thresh); + // Dump the contents of the current thresholds if(mlog.verbosity_level() >= 5) { mlog << Debug(5) << "Parsed thresholds:\n" + << "Matched pair filter columns: " << write_css(mpr_sa) << "\n" + << "Matched pair filter thresholds: " << mpr_ta.get_str() << "\n" << "Forecast categorical thresholds: " << fcat_ta.get_str() << "\n" << "Observed categorical thresholds: " << ocat_ta.get_str() << "\n" << "Forecast continuous thresholds: " << fcnt_ta.get_str() << "\n" @@ -932,6 +941,9 @@ void PointStatVxOpt::set_vx_pd(PointStatConfInfo *conf_info) { // Define the dimensions vx_pd.set_pd_size(n_msg_typ, n_mask, n_interp); + // Store the MPR filter threshold + vx_pd.set_mpr_thresh(mpr_sa, mpr_ta); + // Store the climo CDF info vx_pd.set_climo_cdf_info(cdf_info); diff --git a/met/src/tools/core/point_stat/point_stat_conf_info.h b/met/src/tools/core/point_stat/point_stat_conf_info.h index d849dcc113..dd1d787dfa 100644 --- a/met/src/tools/core/point_stat/point_stat_conf_info.h +++ b/met/src/tools/core/point_stat/point_stat_conf_info.h @@ -123,6 +123,9 @@ class PointStatVxOpt { StringArray mask_poly; // Masking polyline strings StringArray mask_sid; // Masking station ID's + StringArray mpr_sa; // MPR column names + ThreshArray mpr_ta; // MPR column thresholds + // Vector of MaskLatLon objects defining Lat/Lon Point masks vector mask_llpnt; diff --git a/met/src/tools/core/series_analysis/series_analysis.cc b/met/src/tools/core/series_analysis/series_analysis.cc index 5a17f62ff7..acc347aff0 100644 --- a/met/src/tools/core/series_analysis/series_analysis.cc +++ b/met/src/tools/core/series_analysis/series_analysis.cc @@ -1008,8 +1008,8 @@ void do_cnt(int n, const PairDataPoint *pd_ptr) { } // Apply continuous filtering thresholds to subset pairs - pd = subset_pairs(*pd_ptr, cnt_info.fthresh, cnt_info.othresh, - cnt_info.logic); + pd = pd_ptr->subset_pairs_cnt_thresh(cnt_info.fthresh, cnt_info.othresh, + cnt_info.logic); // Check for no matched pairs to process if(pd.n_obs == 0) continue; diff --git a/test/config/GridStatConfig_APCP_regrid b/test/config/GridStatConfig_APCP_regrid index 445ff414e9..7696febce9 100644 --- a/test/config/GridStatConfig_APCP_regrid +++ b/test/config/GridStatConfig_APCP_regrid @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_GRIB_lvl_typ_val b/test/config/GridStatConfig_GRIB_lvl_typ_val index ceadb05264..5e0f64d6a7 100644 --- a/test/config/GridStatConfig_GRIB_lvl_typ_val +++ b/test/config/GridStatConfig_GRIB_lvl_typ_val @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_GRIB_set_attr b/test/config/GridStatConfig_GRIB_set_attr index 88703198c1..d1d5dbc30d 100644 --- a/test/config/GridStatConfig_GRIB_set_attr +++ b/test/config/GridStatConfig_GRIB_set_attr @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_GTG_latlon b/test/config/GridStatConfig_GTG_latlon index 86419f863c..648863688e 100644 --- a/test/config/GridStatConfig_GTG_latlon +++ b/test/config/GridStatConfig_GTG_latlon @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_GTG_lc b/test/config/GridStatConfig_GTG_lc index 290756e91e..846f5a2e6e 100644 --- a/test/config/GridStatConfig_GTG_lc +++ b/test/config/GridStatConfig_GTG_lc @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_apply_mask b/test/config/GridStatConfig_apply_mask index fef335f064..1bb34bb9f1 100644 --- a/test/config/GridStatConfig_apply_mask +++ b/test/config/GridStatConfig_apply_mask @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_climo_WMO b/test/config/GridStatConfig_climo_WMO index 6974d71937..a9f4c120cf 100644 --- a/test/config/GridStatConfig_climo_WMO +++ b/test/config/GridStatConfig_climo_WMO @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_climo_prob b/test/config/GridStatConfig_climo_prob index 4d652daa12..7b91e8da0f 100644 --- a/test/config/GridStatConfig_climo_prob +++ b/test/config/GridStatConfig_climo_prob @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_fourier b/test/config/GridStatConfig_fourier index e978c99f8c..a441acd51f 100644 --- a/test/config/GridStatConfig_fourier +++ b/test/config/GridStatConfig_fourier @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_grid_weight b/test/config/GridStatConfig_grid_weight index c5cf23cef6..5ea4b6df87 100644 --- a/test/config/GridStatConfig_grid_weight +++ b/test/config/GridStatConfig_grid_weight @@ -41,6 +41,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_interp_shape b/test/config/GridStatConfig_interp_shape index cc212d77f8..af303ec165 100644 --- a/test/config/GridStatConfig_interp_shape +++ b/test/config/GridStatConfig_interp_shape @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_mpr_thresh b/test/config/GridStatConfig_mpr_thresh new file mode 100644 index 0000000000..bd28d883f2 --- /dev/null +++ b/test/config/GridStatConfig_mpr_thresh @@ -0,0 +1,274 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Grid-Stat configuration file. +// +// For additional information, please see the MET User's Guide. +// +//////////////////////////////////////////////////////////////////////////////// + +// +// Output model name to be written +// +model = "GFS"; + +// +// Output description to be written +// May be set separately in each "obs.field" entry +// +desc = "NA"; + +// +// Output observation type to be written +// +obtype = "GFSANL"; + +//////////////////////////////////////////////////////////////////////////////// + +// +// Verification grid +// +regrid = { + to_grid = NONE; + method = NEAREST; + width = 1; + vld_thresh = 0.5; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// May be set separately in each "field" entry +// +censor_thresh = []; +censor_val = []; +mpr_column = []; +mpr_thresh = []; +cat_thresh = []; +cnt_thresh = [ NA ]; +cnt_logic = UNION; +wind_thresh = [ NA ]; +wind_logic = UNION; +eclv_points = 0.05; +nc_pairs_var_name = ""; +nc_pairs_var_suffix = ""; +rank_corr_flag = FALSE; + +// +// Forecast and observation fields to be verified +// +fcst = { + + name = "TMP"; + level = "Z2"; + + field = [ + { + desc = "NO_MPR_THRESH"; + nc_pairs_var_suffix = desc; + }, + { + mpr_column = [ "OBS-FCST" ]; + mpr_thresh = [ >=-5&&<=5 ]; + desc = "OBS_FCST_DIFF"; + nc_pairs_var_suffix = desc; + }, + { + mpr_column = [ "ABS(OBS-FCST)" ]; + mpr_thresh = [ <=5 ]; + desc = "ABS_OBS_FCST_DIFF"; + nc_pairs_var_suffix = desc; + }, + { + mpr_column = [ "ABS(OBS-CLIMO_MEAN)" ]; + mpr_thresh = [ <=5 ]; + desc = "ABS_OBS_CLIMO_MEAN_DIFF"; + nc_pairs_var_suffix = desc; + }, + { + mpr_column = [ "CLIMO_CDF" ]; + mpr_thresh = [ >=0.25&&<=0.75 ]; + desc = "CLIMO_CDF_IQR"; + nc_pairs_var_suffix = desc; + } + ]; +} +obs = fcst; + +//////////////////////////////////////////////////////////////////////////////// + +// +// Climatology mean data +// +climo_mean = fcst; +climo_mean = { + + file_name = [ ${CLIMO_MEAN_FILE_LIST} ]; + + regrid = { + method = BILIN; + width = 2; + vld_thresh = 0.5; + } + + time_interp_method = DW_MEAN; + day_interval = ${DAY_INTERVAL}; + hour_interval = ${HOUR_INTERVAL}; +} + +climo_stdev = climo_mean; +climo_stdev = { + file_name = [ ${CLIMO_STDEV_FILE_LIST} ]; +} + +// +// May be set separately in each "obs.field" entry +// +climo_cdf = { + cdf_bins = 1; + center_bins = FALSE; + write_bins = TRUE; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// Verification masking regions +// +mask = { + grid = [ "FULL" ]; + poly = []; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// Confidence interval settings +// +ci_alpha = [ 0.05 ]; + +boot = { + interval = PCTILE; + rep_prop = 1.0; + n_rep = 0; + rng = "mt19937"; + seed = ""; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// Data smoothing methods +// +interp = { + field = BOTH; + vld_thresh = 1.0; + shape = SQUARE; + + type = [ + { + method = NEAREST; + width = 1; + } + ]; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// Neighborhood methods +// +nbrhd = { + width = [ 1 ]; + cov_thresh = [ >=0.5 ]; + vld_thresh = 1.0; + shape = SQUARE; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// Fourier decomposition +// +fourier = { + wave_1d_beg = []; + wave_1d_end = []; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// Gradient statistics +// May be set separately in each "obs.field" entry +// +gradient = { + dx = [ 1 ]; + dy = [ 1 ]; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// Distance Map statistics +// May be set separately in each "obs.field" entry +// +distance_map = { + baddeley_p = 2; + baddeley_max_dist = NA; + fom_alpha = 0.1; + zhu_weight = 0.5; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// Statistical output types +// +output_flag = { + fho = NONE; + ctc = NONE; + cts = NONE; + mctc = NONE; + mcts = NONE; + cnt = NONE; + sl1l2 = STAT; + sal1l2 = NONE; + vl1l2 = NONE; + val1l2 = NONE; + vcnt = NONE; + pct = NONE; + pstd = NONE; + pjc = NONE; + prc = NONE; + eclv = NONE; + nbrctc = NONE; + nbrcts = NONE; + nbrcnt = NONE; + grad = NONE; + dmap = NONE; +} + +// +// NetCDF matched pairs output file +// +nc_pairs_flag = { + latlon = FALSE; + raw = FALSE; + diff = TRUE; + climo = FALSE; + climo_cdp = FALSE; + weight = FALSE; + nbrhd = FALSE; + fourier = FALSE; + gradient = FALSE; + distance_map = FALSE; + apply_mask = FALSE; +} + +//////////////////////////////////////////////////////////////////////////////// + +grid_weight_flag = COS_LAT; +tmp_dir = "/tmp"; +output_prefix = "${OUTPUT_PREFIX}"; +version = "V10.0.0"; + +//////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_no_leap b/test/config/GridStatConfig_no_leap index e415640c07..47ab1f474b 100644 --- a/test/config/GridStatConfig_no_leap +++ b/test/config/GridStatConfig_no_leap @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_prob_as_scalar b/test/config/GridStatConfig_prob_as_scalar index 2c63950004..13c6143438 100644 --- a/test/config/GridStatConfig_prob_as_scalar +++ b/test/config/GridStatConfig_prob_as_scalar @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_python b/test/config/GridStatConfig_python index 85dd871c5e..0d5e908266 100644 --- a/test/config/GridStatConfig_python +++ b/test/config/GridStatConfig_python @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_python_mixed b/test/config/GridStatConfig_python_mixed index 367c0e1118..b3a6c2ea2b 100644 --- a/test/config/GridStatConfig_python_mixed +++ b/test/config/GridStatConfig_python_mixed @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_rtma b/test/config/GridStatConfig_rtma index 4d88b8e6c7..77d491e5b5 100644 --- a/test/config/GridStatConfig_rtma +++ b/test/config/GridStatConfig_rtma @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_rtma_perc_thresh b/test/config/GridStatConfig_rtma_perc_thresh index 0f96a179f4..cabb9c13df 100644 --- a/test/config/GridStatConfig_rtma_perc_thresh +++ b/test/config/GridStatConfig_rtma_perc_thresh @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_st4 b/test/config/GridStatConfig_st4 index abb1c4079f..7ad113c13f 100644 --- a/test/config/GridStatConfig_st4 +++ b/test/config/GridStatConfig_st4 @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/GridStatConfig_st4_censor b/test/config/GridStatConfig_st4_censor index fd9debdcdf..8f088b7a6d 100644 --- a/test/config/GridStatConfig_st4_censor +++ b/test/config/GridStatConfig_st4_censor @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/PointStatConfig_APCP b/test/config/PointStatConfig_APCP index 3923198689..920034bc27 100644 --- a/test/config/PointStatConfig_APCP +++ b/test/config/PointStatConfig_APCP @@ -31,6 +31,8 @@ obs_window = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/test/config/PointStatConfig_APCP_HIRA b/test/config/PointStatConfig_APCP_HIRA index 4941473a82..e39d21863c 100644 --- a/test/config/PointStatConfig_APCP_HIRA +++ b/test/config/PointStatConfig_APCP_HIRA @@ -31,6 +31,8 @@ obs_window = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/test/config/PointStatConfig_GTG_latlon b/test/config/PointStatConfig_GTG_latlon index 4a33c23102..fc5fa1eef9 100644 --- a/test/config/PointStatConfig_GTG_latlon +++ b/test/config/PointStatConfig_GTG_latlon @@ -31,6 +31,8 @@ obs_window = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/test/config/PointStatConfig_GTG_lc b/test/config/PointStatConfig_GTG_lc index 0a08acdf19..e1c5f89ab2 100644 --- a/test/config/PointStatConfig_GTG_lc +++ b/test/config/PointStatConfig_GTG_lc @@ -31,6 +31,8 @@ obs_window = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/test/config/PointStatConfig_INTERP_OPTS b/test/config/PointStatConfig_INTERP_OPTS index 902138d916..1538ce4bf9 100644 --- a/test/config/PointStatConfig_INTERP_OPTS +++ b/test/config/PointStatConfig_INTERP_OPTS @@ -31,6 +31,8 @@ obs_window = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/test/config/PointStatConfig_LAND_TOPO_MASK b/test/config/PointStatConfig_LAND_TOPO_MASK index a98c163ff1..9d9e77564e 100644 --- a/test/config/PointStatConfig_LAND_TOPO_MASK +++ b/test/config/PointStatConfig_LAND_TOPO_MASK @@ -31,6 +31,8 @@ obs_window = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/test/config/PointStatConfig_MASK_SID b/test/config/PointStatConfig_MASK_SID index 6333358fac..b9afca5389 100644 --- a/test/config/PointStatConfig_MASK_SID +++ b/test/config/PointStatConfig_MASK_SID @@ -31,6 +31,8 @@ obs_window = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/test/config/PointStatConfig_PHYS b/test/config/PointStatConfig_PHYS index 03a67ca8b4..aea79c4b19 100644 --- a/test/config/PointStatConfig_PHYS +++ b/test/config/PointStatConfig_PHYS @@ -31,6 +31,8 @@ obs_window = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/test/config/PointStatConfig_PHYS_pint b/test/config/PointStatConfig_PHYS_pint index 951d936320..be5abaaf6f 100644 --- a/test/config/PointStatConfig_PHYS_pint +++ b/test/config/PointStatConfig_PHYS_pint @@ -31,6 +31,8 @@ obs_window = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/test/config/PointStatConfig_WINDS b/test/config/PointStatConfig_WINDS index 66257da5fa..3dc709d48c 100644 --- a/test/config/PointStatConfig_WINDS +++ b/test/config/PointStatConfig_WINDS @@ -31,6 +31,8 @@ obs_window = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/test/config/PointStatConfig_aeronet b/test/config/PointStatConfig_aeronet index 7423d57bba..a1405e9424 100644 --- a/test/config/PointStatConfig_aeronet +++ b/test/config/PointStatConfig_aeronet @@ -31,6 +31,8 @@ regrid = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cat_thresh = [ NA ]; cnt_thresh = [ NA ]; //cnt_logic = UNION; diff --git a/test/config/PointStatConfig_airnow b/test/config/PointStatConfig_airnow index 89a1b22252..eb18e2000f 100644 --- a/test/config/PointStatConfig_airnow +++ b/test/config/PointStatConfig_airnow @@ -38,6 +38,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = [ NA ]; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/PointStatConfig_climo b/test/config/PointStatConfig_climo index 843c927614..17005f9979 100644 --- a/test/config/PointStatConfig_climo +++ b/test/config/PointStatConfig_climo @@ -31,6 +31,8 @@ regrid = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cat_thresh = [ NA ]; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/PointStatConfig_climo_WMO b/test/config/PointStatConfig_climo_WMO index fe2eedd6e9..722edd4881 100644 --- a/test/config/PointStatConfig_climo_WMO +++ b/test/config/PointStatConfig_climo_WMO @@ -31,6 +31,8 @@ regrid = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/PointStatConfig_climo_prob b/test/config/PointStatConfig_climo_prob index 2d59e5712b..53a754b87c 100644 --- a/test/config/PointStatConfig_climo_prob +++ b/test/config/PointStatConfig_climo_prob @@ -32,6 +32,8 @@ regrid = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cat_thresh = [ NA ]; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/PointStatConfig_dup b/test/config/PointStatConfig_dup index 9f0c2992ad..e67fb84089 100644 --- a/test/config/PointStatConfig_dup +++ b/test/config/PointStatConfig_dup @@ -30,6 +30,8 @@ regrid = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/test/config/PointStatConfig_mpr_thresh b/test/config/PointStatConfig_mpr_thresh new file mode 100644 index 0000000000..6a33eebf2a --- /dev/null +++ b/test/config/PointStatConfig_mpr_thresh @@ -0,0 +1,221 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Point-Stat configuration file. +// +// For additional information, please see the MET User's Guide. +// +//////////////////////////////////////////////////////////////////////////////// + +// +// Output model name to be written +// +model = "GFS"; + +// +// Output description to be written +// May be set separately in each "obs.field" entry +// +desc = "NA"; + +//////////////////////////////////////////////////////////////////////////////// + +// +// Verification grid +// +regrid = { + to_grid = NONE; + method = NEAREST; + width = 1; + vld_thresh = 0.5; +} + +//////////////////////////////////////////////////////////////////////////////// + +mpr_column = []; +mpr_thresh = []; +cat_thresh = [ NA ]; +cnt_thresh = [ NA ]; +cnt_logic = UNION; +wind_thresh = [ NA ]; +wind_logic = UNION; +eclv_points = 0.05; + +// +// Forecast and observation fields to be verified +// +fcst = { + sid_inc = []; + sid_exc = []; + cat_thresh = []; + message_type = [ "ADPSFC" ]; + + name = "TMP"; + level = "Z2"; + + field = [ + { + desc = "NO_MPR_THRESH"; + }, + { + mpr_column = [ "OBS-FCST" ]; + mpr_thresh = [ >=-5&&<=5 ]; + desc = "OBS_FCST_DIFF"; + }, + { + mpr_column = [ "ABS(OBS-FCST)" ]; + mpr_thresh = [ <=5 ]; + desc = "ABS_OBS_FCST_DIFF"; + }, + { + mpr_column = [ "ABS(OBS-CLIMO_MEAN)" ]; + mpr_thresh = [ <=5 ]; + desc = "ABS_OBS_CLIMO_MEAN_DIFF"; + }, + { + mpr_column = [ "CLIMO_CDF" ]; + mpr_thresh = [ >=0.25&&<=0.75 ]; + desc = "CLIMO_CDF_IQR"; + } + ]; +} +obs = fcst; + +//////////////////////////////////////////////////////////////////////////////// + +// +// Climatology mean data +// +climo_mean = fcst; +climo_mean = { + + file_name = [ ${CLIMO_MEAN_FILE_LIST} ]; + + regrid = { + method = BILIN; + width = 2; + vld_thresh = 0.5; + } + + time_interp_method = DW_MEAN; + day_interval = ${DAY_INTERVAL}; + hour_interval = ${HOUR_INTERVAL}; +} + +climo_stdev = climo_mean; +climo_stdev = { + file_name = [ ${CLIMO_STDEV_FILE_LIST} ]; +} + +// +// May be set separately in each "obs.field" entry +// +climo_cdf = { + cdf_bins = 1; + center_bins = FALSE; + write_bins = TRUE; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// Point observation time window +// +obs_window = { + beg = -5400; + end = 5400; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// Verification masking regions +// +mask = { + grid = [ "FULL" ]; + poly = []; + sid = []; + llpnt = []; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// Confidence interval settings +// +ci_alpha = [ 0.05 ]; + +boot = { + interval = PCTILE; + rep_prop = 1.0; + n_rep = 1000; + rng = "mt19937"; + seed = "1"; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// Interpolation methods +// +interp = { + vld_thresh = 1.0; + + type = [ + { + method = NEAREST; + width = 1; + } + ]; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// HiRA verification method +// +hira = { + flag = FALSE; + width = [ 2, 3, 4, 5 ]; + vld_thresh = 1.0; + cov_thresh = [ ==0.25 ]; + shape = SQUARE; + prob_cat_thresh = []; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// Statistical output types +// +output_flag = { + fho = NONE; + ctc = NONE; + cts = NONE; + mctc = NONE; + mcts = NONE; + cnt = NONE; + sl1l2 = STAT; + sal1l2 = NONE; + vl1l2 = NONE; + val1l2 = NONE; + vcnt = NONE; + pct = NONE; + pstd = NONE; + pjc = NONE; + prc = NONE; + ecnt = NONE; + rps = NONE; + eclv = NONE; + mpr = NONE; +} + +//////////////////////////////////////////////////////////////////////////////// + +obs_quality = []; +duplicate_flag = NONE; +rank_corr_flag = TRUE; +tmp_dir = "/tmp"; +output_prefix = "${OUTPUT_PREFIX}"; +version = "V10.0.0"; + +//////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_obs_summary b/test/config/PointStatConfig_obs_summary index 1bce341f5e..03b00e3438 100644 --- a/test/config/PointStatConfig_obs_summary +++ b/test/config/PointStatConfig_obs_summary @@ -30,6 +30,8 @@ regrid = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/test/config/PointStatConfig_obs_summary_all b/test/config/PointStatConfig_obs_summary_all index 4bbe7821b3..329a3bd05f 100644 --- a/test/config/PointStatConfig_obs_summary_all +++ b/test/config/PointStatConfig_obs_summary_all @@ -30,6 +30,8 @@ regrid = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/test/config/PointStatConfig_prob b/test/config/PointStatConfig_prob index 3c26b54ec0..c1d7f8d58f 100644 --- a/test/config/PointStatConfig_prob +++ b/test/config/PointStatConfig_prob @@ -31,6 +31,8 @@ obs_window = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/test/config/PointStatConfig_python b/test/config/PointStatConfig_python index e975b01b9e..2b073fff61 100644 --- a/test/config/PointStatConfig_python +++ b/test/config/PointStatConfig_python @@ -37,6 +37,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = [ NA ]; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/PointStatConfig_sid_inc_exc b/test/config/PointStatConfig_sid_inc_exc index a7766ff324..70f17d7943 100644 --- a/test/config/PointStatConfig_sid_inc_exc +++ b/test/config/PointStatConfig_sid_inc_exc @@ -33,6 +33,8 @@ obs_window = { censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/test/config/ref_config/GridStatConfig_03h b/test/config/ref_config/GridStatConfig_03h index dc93b76496..ce8b0f982c 100644 --- a/test/config/ref_config/GridStatConfig_03h +++ b/test/config/ref_config/GridStatConfig_03h @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; diff --git a/test/config/ref_config/GridStatConfig_24h b/test/config/ref_config/GridStatConfig_24h index 260e1e901d..1f7fb01cda 100644 --- a/test/config/ref_config/GridStatConfig_24h +++ b/test/config/ref_config/GridStatConfig_24h @@ -42,6 +42,8 @@ regrid = { // censor_thresh = []; censor_val = []; +mpr_column = []; +mpr_thresh = []; cat_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; @@ -51,6 +53,7 @@ eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; rank_corr_flag = FALSE; + // // Forecast and observation fields to be verified // diff --git a/test/config/ref_config/PointStatConfig_ADPUPA b/test/config/ref_config/PointStatConfig_ADPUPA index 9976d42778..a458683711 100644 --- a/test/config/ref_config/PointStatConfig_ADPUPA +++ b/test/config/ref_config/PointStatConfig_ADPUPA @@ -30,6 +30,8 @@ regrid = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_thresh = [ NA ]; diff --git a/test/config/ref_config/PointStatConfig_ONLYSF b/test/config/ref_config/PointStatConfig_ONLYSF index 8c969f69f0..9276f52a45 100644 --- a/test/config/ref_config/PointStatConfig_ONLYSF +++ b/test/config/ref_config/PointStatConfig_ONLYSF @@ -30,6 +30,8 @@ regrid = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_logic = INTERSECTION; diff --git a/test/config/ref_config/PointStatConfig_WINDS b/test/config/ref_config/PointStatConfig_WINDS index 82ba02f5e4..5e18b2f1dc 100644 --- a/test/config/ref_config/PointStatConfig_WINDS +++ b/test/config/ref_config/PointStatConfig_WINDS @@ -30,6 +30,8 @@ regrid = { //////////////////////////////////////////////////////////////////////////////// +mpr_column = []; +mpr_thresh = []; cnt_thresh = [ NA ]; cnt_logic = UNION; wind_logic = INTERSECTION; diff --git a/test/xml/unit_grid_stat.xml b/test/xml/unit_grid_stat.xml index 729761c71d..1d562778f7 100644 --- a/test/xml/unit_grid_stat.xml +++ b/test/xml/unit_grid_stat.xml @@ -234,4 +234,31 @@ + + &MET_BIN;/grid_stat + + OUTPUT_PREFIX MPR_THRESH + DAY_INTERVAL 1 + HOUR_INTERVAL 6 + CLIMO_MEAN_FILE_LIST + "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cmean_1d.19590409" + + + CLIMO_STDEV_FILE_LIST + "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cstdv_1d.19590409" + + + + \ + &DATA_DIR_MODEL;/grib2/gfs/gfs_2012040900_F012.grib2 \ + &DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120409_1200_000.grb2 \ + &CONFIG_DIR;/GridStatConfig_mpr_thresh \ + -outdir &OUTPUT_DIR;/grid_stat -v 3 + + + &OUTPUT_DIR;/grid_stat/grid_stat_MPR_THRESH_120000L_20120409_120000V.stat + &OUTPUT_DIR;/grid_stat/grid_stat_MPR_THRESH_120000L_20120409_120000V_pairs.nc + + + diff --git a/test/xml/unit_point_stat.xml b/test/xml/unit_point_stat.xml index c369108a08..8750e1ee68 100644 --- a/test/xml/unit_point_stat.xml +++ b/test/xml/unit_point_stat.xml @@ -8,6 +8,7 @@ + ]> @@ -454,4 +455,30 @@ + + &MET_BIN;/point_stat + + OUTPUT_PREFIX MPR_THRESH + DAY_INTERVAL 1 + HOUR_INTERVAL 6 + CLIMO_MEAN_FILE_LIST + "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cmean_1d.19590409" + + + CLIMO_STDEV_FILE_LIST + "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cstdv_1d.19590409" + + + + \ + &DATA_DIR_MODEL;/grib2/gfs/gfs_2012040900_F012.grib2 \ + &OUTPUT_DIR;/pb2nc/ndas.20120409.t12z.prepbufr.tm00.nc \ + &CONFIG_DIR;/PointStatConfig_mpr_thresh \ + -outdir &OUTPUT_DIR;/point_stat -v 3 + + + &OUTPUT_DIR;/point_stat/point_stat_MPR_THRESH_120000L_20120409_120000V.stat + + + From d26e62d13b9901af667132c6a41c3fc6a2a69d2a Mon Sep 17 00:00:00 2001 From: David Fillmore Date: Fri, 2 Apr 2021 12:21:00 -0600 Subject: [PATCH 087/165] Feature 1319 no pickle (#1720) * Try path insert. * sys.path insert. * Per #1319, adding David's changes back into the feature_1319_no_pickle branch. It compiles but TEST: python_numpy_plot_data_plane_pickle fails when testing on my Mac. Comitting now to test on kiowa. * Per #1319, small updated to write_tmp_dataplane.py script. Had a couple of if statements that should really be elif. Co-authored-by: John Halley Gotway Co-authored-by: John Halley Gotway --- met/data/wrappers/Makefile.am | 7 +- met/data/wrappers/read_pickle_dataplane.py | 15 --- met/data/wrappers/read_tmp_ascii.py | 49 +++++++ met/data/wrappers/read_tmp_dataplane.py | 36 ++++++ met/data/wrappers/write_pickle_dataplane.py | 42 ------ met/data/wrappers/write_tmp_dataplane.py | 68 ++++++++++ ...ite_pickle_point.py => write_tmp_point.py} | 13 +- .../vx_data2d_python/python_dataplane.cc | 54 ++++---- .../vx_python3_utils/python3_script.cc | 121 +++++++++++++++++- .../libcode/vx_python3_utils/python3_script.h | 17 ++- met/src/tools/other/ascii2nc/ascii2nc.cc | 1 + .../tools/other/ascii2nc/python_handler.cc | 48 +++---- met/src/tools/other/ascii2nc/python_handler.h | 10 +- 13 files changed, 355 insertions(+), 126 deletions(-) delete mode 100644 met/data/wrappers/read_pickle_dataplane.py create mode 100644 met/data/wrappers/read_tmp_ascii.py create mode 100644 met/data/wrappers/read_tmp_dataplane.py delete mode 100644 met/data/wrappers/write_pickle_dataplane.py create mode 100644 met/data/wrappers/write_tmp_dataplane.py rename met/data/wrappers/{write_pickle_point.py => write_tmp_point.py} (69%) diff --git a/met/data/wrappers/Makefile.am b/met/data/wrappers/Makefile.am index d8a6d5a026..f3518fa27b 100644 --- a/met/data/wrappers/Makefile.am +++ b/met/data/wrappers/Makefile.am @@ -23,10 +23,11 @@ wrappersdir = $(pkgdatadir)/wrappers wrappers_DATA = \ generic_python.py \ generic_pickle.py \ - read_pickle_dataplane.py \ - write_pickle_dataplane.py \ + read_tmp_dataplane.py \ + write_tmp_dataplane.py \ write_pickle_mpr.py \ - write_pickle_point.py + read_tmp_ascii.py \ + write_tmp_point.py EXTRA_DIST = ${wrappers_DATA} diff --git a/met/data/wrappers/read_pickle_dataplane.py b/met/data/wrappers/read_pickle_dataplane.py deleted file mode 100644 index f97f153df7..0000000000 --- a/met/data/wrappers/read_pickle_dataplane.py +++ /dev/null @@ -1,15 +0,0 @@ -######################################################################## -# -# Reads temporary pickle file into memory. -# -# usage: /path/to/python read_pickle_dataplane.py pickle.tmp -# -######################################################################## - -import sys -import numpy as np -import pickle - -print('Python Script:\t', sys.argv[0]) -print('Load Pickle:\t', sys.argv[1]) -met_info = pickle.load(open(sys.argv[1], "rb")) diff --git a/met/data/wrappers/read_tmp_ascii.py b/met/data/wrappers/read_tmp_ascii.py new file mode 100644 index 0000000000..b4f4303044 --- /dev/null +++ b/met/data/wrappers/read_tmp_ascii.py @@ -0,0 +1,49 @@ +""" +Module Name: read_tmp_ascii.py + +Read MET Point Observations from a text file created by write_tmp_point.py script + or MET Matched Pairs from a text file created by write_tmp_mpr.py script + +Point observation format: + Message_Type, Station_ID, Valid_Time, Lat, Lon, Elevation, + GRIB_Code or Variable_Name, Level, Height, QC_String, Observation_Value + +Version Date +1.0.0 2021/02/18 David Fillmore Initial version +""" + +__author__ = 'David Fillmore' +__version__ = '1.0.0' +__email__ = 'met_help@ucar.edu' + +import argparse + +point_data = None + +def read_tmp_ascii(filename): + """ + Arguments: + filename (string): temporary file created by write_tmp_point.py + + Returns: + (list of lists): point data + """ + print('read_tmp_ascii:' + filename) + f = open(filename, 'r') + lines = f.readlines() + f.close() + + global point_data + point_data = [eval(line.strip('\n')) for line in lines] + + return point_data + +if __name__ == '__main__': + """ + Parse command line arguments + """ + parser = argparse.ArgumentParser() + parser.add_argument('--filename', type=str) + args = parser.parse_args() + + data = read_tmp_ascii(args.filename) diff --git a/met/data/wrappers/read_tmp_dataplane.py b/met/data/wrappers/read_tmp_dataplane.py new file mode 100644 index 0000000000..e21c17ba3f --- /dev/null +++ b/met/data/wrappers/read_tmp_dataplane.py @@ -0,0 +1,36 @@ +######################################################################## +# +# Reads temporary file into memory. +# +# usage: /path/to/python read_tmp_dataplane.py dataplane.tmp +# +######################################################################## + +import sys +import numpy as np +import netCDF4 as nc + +print('Python Script:\t', sys.argv[0]) +met_info = {} + +netcdf_filename = sys.argv[1] +print('Read NetCDF:\t', netcdf_filename) + +# read NetCDF file +ds = nc.Dataset(netcdf_filename, 'r') +met_data = ds['met_data'][:] +met_attrs = {} +grid = {} +for attr, attr_val in ds.__dict__.items(): + if 'grid' in attr: + grid_attr = attr.split('.')[1] + grid[grid_attr] = attr_val + else: + met_attrs[attr] = attr_val +grid['nx'], grid['ny'] = int(grid['nx']), int(grid['ny']) +met_attrs['grid'] = grid +met_attrs['name'] = met_attrs['name_str'] +del met_attrs['name_str'] +met_info['met_data'] = met_data +met_info['attrs'] = met_attrs +print(met_info) diff --git a/met/data/wrappers/write_pickle_dataplane.py b/met/data/wrappers/write_pickle_dataplane.py deleted file mode 100644 index 079557538b..0000000000 --- a/met/data/wrappers/write_pickle_dataplane.py +++ /dev/null @@ -1,42 +0,0 @@ -######################################################################## -# -# Adapted from a script provided by George McCabe -# Adapted by Randy Bullock -# -# usage: /path/to/python write_pickle_dataplane.py \ -# pickle_output_filename .py -# -######################################################################## - -import os -import sys -import pickle -import importlib.util -import xarray as xr - -print('Python Script:\t', sys.argv[0]) -print('User Command:\t', sys.argv[2:]) -print('Write Pickle:\t', sys.argv[1]) - -pickle_filename = sys.argv[1] - -pyembed_module_name = sys.argv[2] -sys.argv = sys.argv[2:] - -if not pyembed_module_name.endswith('.py'): - pyembed_module_name += '.py' - -user_base = os.path.basename(pyembed_module_name).replace('.py','') - -spec = importlib.util.spec_from_file_location(user_base, pyembed_module_name) -met_in = importlib.util.module_from_spec(spec) -spec.loader.exec_module(met_in) - -if isinstance(met_in.met_data, xr.DataArray): - met_info = { 'attrs': met_in.met_data.attrs, 'met_data': met_in.met_data } -else: - met_info = { 'attrs': met_in.attrs, 'met_data': met_in.met_data } - -print(met_info) - -pickle.dump( met_info, open( pickle_filename, "wb" ) ) diff --git a/met/data/wrappers/write_tmp_dataplane.py b/met/data/wrappers/write_tmp_dataplane.py new file mode 100644 index 0000000000..b5a1b24995 --- /dev/null +++ b/met/data/wrappers/write_tmp_dataplane.py @@ -0,0 +1,68 @@ +######################################################################## +# +# Adapted from a script provided by George McCabe +# Adapted by Randy Bullock +# +# usage: /path/to/python write_tmp_dataplane.py \ +# tmp_output_filename .py +# +######################################################################## + +import os +import sys +import importlib.util +import netCDF4 as nc + +print('Python Script:\t', sys.argv[0]) +print('User Command:\t', sys.argv[2:]) + +netcdf_filename = sys.argv[1] + +print('Write NetCDF:\t', netcdf_filename) + +pyembed_module_name = sys.argv[2] +sys.argv = sys.argv[2:] + +# append user script dir to system path +pyembed_dir, pyembed_file = os.path.split(pyembed_module_name) +if pyembed_dir: + sys.path.insert(0, pyembed_dir) + +if not pyembed_module_name.endswith('.py'): + pyembed_module_name += '.py' + +user_base = os.path.basename(pyembed_module_name).replace('.py','') + +spec = importlib.util.spec_from_file_location(user_base, pyembed_module_name) +met_in = importlib.util.module_from_spec(spec) +spec.loader.exec_module(met_in) + +met_info = {'met_data': met_in.met_data} +if hasattr(met_in.met_data, 'attrs') and met_in.met_data.attrs: + attrs = met_in.met_data.attrs +else: + attrs = met_in.attrs +met_info['attrs'] = attrs + +print('write_tmp_dataplane') +print(met_info) + +# write NetCDF file +ds = nc.Dataset(netcdf_filename, 'w') + +nx, ny = met_in.met_data.shape +ds.createDimension('x', nx) +ds.createDimension('y', ny) +dp = ds.createVariable('met_data', met_in.met_data.dtype, ('x', 'y')) +dp[:] = met_in.met_data + +for attr, attr_val in met_info['attrs'].items(): + print(attr, attr_val, type(attr_val)) + if attr == 'name': + setattr(ds, 'name_str', attr_val) + elif type(attr_val) == str: + setattr(ds, attr, attr_val) + elif type(attr_val) == dict: + for key in attr_val: + setattr(ds, attr + '.' + key, attr_val[key]) +ds.close() diff --git a/met/data/wrappers/write_pickle_point.py b/met/data/wrappers/write_tmp_point.py similarity index 69% rename from met/data/wrappers/write_pickle_point.py rename to met/data/wrappers/write_tmp_point.py index 1f5ee35bdb..94f56cd3dd 100644 --- a/met/data/wrappers/write_pickle_point.py +++ b/met/data/wrappers/write_tmp_point.py @@ -3,21 +3,20 @@ # Adapted from a script provided by George McCabe # Adapted by Randy Bullock # -# usage: /path/to/python write_pickle_point.py \ -# pickle_output_filename .py +# usage: /path/to/python write_tmp_point.py \ +# tmp_ascii_output_filename .py # ######################################################################## import os import sys -import pickle import importlib.util print('Python Script:\t', sys.argv[0]) print('User Command:\t', sys.argv[2:]) -print('Write Pickle:\t', sys.argv[1]) +print('Write Temporary Ascii:\t', sys.argv[1]) -pickle_filename = sys.argv[1] +tmp_filename = sys.argv[1] pyembed_module_name = sys.argv[2] sys.argv = sys.argv[2:] @@ -28,4 +27,6 @@ met_in = importlib.util.module_from_spec(spec) spec.loader.exec_module(met_in) -pickle.dump( met_in.point_data, open( pickle_filename, "wb" ) ) +f = open(tmp_filename, 'w') +for line in met_in.point_data: + f.write(str(line) + '\n') diff --git a/met/src/libcode/vx_data2d_python/python_dataplane.cc b/met/src/libcode/vx_data2d_python/python_dataplane.cc index d5ace046d0..8f70af5109 100644 --- a/met/src/libcode/vx_data2d_python/python_dataplane.cc +++ b/met/src/libcode/vx_data2d_python/python_dataplane.cc @@ -31,15 +31,15 @@ GlobalPython GP; // this needs external linkage static const char * user_ppath = 0; -static const char write_pickle [] = "MET_BASE/wrappers/write_pickle_dataplane.py"; +static const char write_tmp_nc [] = "MET_BASE/wrappers/write_tmp_dataplane.py"; -static const char read_pickle [] = "read_pickle_dataplane"; // NO ".py" suffix +static const char read_tmp_nc [] = "read_tmp_dataplane"; // NO ".py" suffix -static const char pickle_base_name [] = "tmp_met_pickle"; +static const char tmp_nc_base_name [] = "tmp_met_nc"; -static const char pickle_var_name [] = "met_info"; +static const char tmp_nc_var_name [] = "met_info"; -static const char pickle_file_var_name [] = "pickle_filename"; +static const char tmp_nc_file_var_name [] = "tmp_nc_filename"; //////////////////////////////////////////////////////////////////////// @@ -51,7 +51,7 @@ static bool straight_python_dataplane(const char * script_name, Grid & met_grid_out, VarInfoPython &vinfo); -static bool pickle_dataplane(const char * script_name, +static bool tmp_nc_dataplane(const char * script_name, int script_argc, char ** script_argv, const bool use_xarray, DataPlane & met_dp_out, Grid & met_grid_out, VarInfoPython &vinfo); @@ -69,9 +69,9 @@ bool python_dataplane(const char * user_script_name, bool status = false; -if ( (user_ppath = getenv(user_python_path_env)) != 0 ) { // do_pickle = true; +if ( (user_ppath = getenv(user_python_path_env)) != 0 ) { // do_tmp_nc = true; - status = pickle_dataplane(user_script_name, + status = tmp_nc_dataplane(user_script_name, user_script_argc, user_script_argv, use_xarray, met_dp_out, met_grid_out, vinfo); @@ -276,7 +276,7 @@ return ( true ); //////////////////////////////////////////////////////////////////////// -bool pickle_dataplane(const char * user_script_name, +bool tmp_nc_dataplane(const char * user_script_name, int user_script_argc, char ** user_script_argv, const bool use_xarray, DataPlane & met_dp_out, Grid & met_grid_out, VarInfoPython &vinfo) @@ -287,7 +287,7 @@ int j; int status; ConcatString command; ConcatString path; -ConcatString pickle_path; +ConcatString tmp_nc_path; const char * tmp_dir = 0; Wchar_Argv wa; @@ -301,14 +301,14 @@ if ( ! tmp_dir ) tmp_dir = default_tmp_dir; path << cs_erase << tmp_dir << '/' - << pickle_base_name; + << tmp_nc_base_name; -pickle_path = make_temp_file_name(path.text(), 0); +tmp_nc_path = make_temp_file_name(path.text(), 0); command << cs_erase << user_ppath << ' ' // user's path to python - << replace_path(write_pickle) << ' ' // write_pickle.py - << pickle_path << ' ' // pickle output filename + << replace_path(write_tmp_nc) << ' ' // write_tmp_nc.py + << tmp_nc_path << ' ' // tmp_nc output filename << user_script_name; // user's script name for (j=1; j " + mlog << Error << "\ntmp_nc_dataplane() -> " << "command \"" << command.text() << "\" failed ... status = " << status << "\n\n"; @@ -346,15 +346,15 @@ if ( PyErr_Occurred() ) { PyErr_Print(); - mlog << Warning << "\npickle_dataplane() -> " + mlog << Warning << "\ntmp_nc_dataplane() -> " << "an error occurred initializing python\n\n"; return ( false ); } -mlog << Debug(3) << "Reading temporary pickle file: " - << pickle_path << "\n"; +mlog << Debug(3) << "Reading temporary tmp_nc file: " + << tmp_nc_path << "\n"; // // set the arguments @@ -362,9 +362,9 @@ mlog << Debug(3) << "Reading temporary pickle file: " StringArray a; -a.add(read_pickle); +a.add(read_tmp_nc); -a.add(pickle_path); +a.add(tmp_nc_path); wa.set(a); @@ -374,7 +374,7 @@ PySys_SetArgv (wa.wargc(), wa.wargv()); // import the python wrapper script as a module // -path = get_short_name(read_pickle); +path = get_short_name(read_tmp_nc); PyObject * module_obj = PyImport_ImportModule (path.text()); @@ -392,7 +392,7 @@ if ( PyErr_Occurred() ) { PyErr_Print(); - mlog << Warning << "\npickle_dataplane() -> " + mlog << Warning << "\ntmp_nc_dataplane() -> " << "an error occurred importing module " << '\"' << path << "\"\n\n"; @@ -402,7 +402,7 @@ if ( PyErr_Occurred() ) { if ( ! module_obj ) { - mlog << Warning << "\npickle_dataplane() -> " + mlog << Warning << "\ntmp_nc_dataplane() -> " << "error running python script\n\n"; return ( false ); @@ -410,7 +410,7 @@ if ( ! module_obj ) { } // - // read the pickle file + // read the tmp_nc file // // @@ -419,13 +419,13 @@ if ( ! module_obj ) { PyObject * module_dict_obj = PyModule_GetDict (module_obj); -PyObject * key_obj = PyUnicode_FromString (pickle_var_name); +PyObject * key_obj = PyUnicode_FromString (tmp_nc_var_name); PyObject * data_obj = PyDict_GetItem (module_dict_obj, key_obj); if ( ! data_obj || ! PyDict_Check(data_obj) ) { - mlog << Error << "\npickle_dataplane() -> " + mlog << Error << "\ntmp_nc_dataplane() -> " << "bad dict object\n\n"; exit ( 1 ); @@ -450,7 +450,7 @@ dataplane_from_numpy_array(np, attrs_dict_obj, met_dp_out, met_grid_out, vinfo); // cleanup // -remove_temp_file(pickle_path); +remove_temp_file(tmp_nc_path); // // done diff --git a/met/src/libcode/vx_python3_utils/python3_script.cc b/met/src/libcode/vx_python3_utils/python3_script.cc index 56837b65d0..7bd567ae2c 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.cc +++ b/met/src/libcode/vx_python3_utils/python3_script.cc @@ -27,6 +27,8 @@ using namespace std; static const char sq = '\''; // single quote +static const char read_tmp_ascii_py [] = "MET_BASE/wrappers/read_tmp_ascii.py"; + //////////////////////////////////////////////////////////////////////// @@ -75,8 +77,12 @@ void Python3_Script::clear() Module = 0; +ModuleAscii = 0; + Dict = 0; +DictAscii = 0; + Script_Filename.clear(); @@ -159,14 +165,29 @@ return ( var ); } +//////////////////////////////////////////////////////////////////////// + +PyObject * Python3_Script::lookup_ascii(const char * name) const + +{ + +PyObject * var = 0; + +var = PyDict_GetItemString (DictAscii, name); + +return ( var ); + +} //////////////////////////////////////////////////////////////////////// -void Python3_Script::run(const char * command) const +PyObject * Python3_Script::run(const char * command) const { +PyObject * pobj; + if ( empty(command) ) { mlog << Error << "\nPython3_Script::run(const char *) -> " @@ -176,7 +197,9 @@ if ( empty(command) ) { } -if ( ! PyRun_String(command, Py_file_input, Dict, Dict) ) { +pobj = PyRun_String(command, Py_file_input, Dict, Dict); + +if ( ! pobj ) { mlog << Error << "\nPython3_Script::run(const char *) -> " << "command \"" << command << "\" failed!\n\n"; @@ -188,7 +211,7 @@ if ( ! PyRun_String(command, Py_file_input, Dict, Dict) ) { fflush(stdout); fflush(stderr); -return; +return pobj; } @@ -234,6 +257,98 @@ return; } +//////////////////////////////////////////////////////////////////////// + +void Python3_Script::import_read_tmp_ascii_py(void) + +{ + +ConcatString module; + +module << cs_erase + << replace_path(read_tmp_ascii_py); + +ConcatString command; + +run_python_string("import sys"); + +command << cs_erase + << "sys.path.append(\"" + << module.dirname().c_str() + << "\")"; + +mlog << Debug(3) << command << "\n"; + +run_python_string(command.text()); + +mlog << Debug(2) << "Importing " << module << "\n"; + +ConcatString path = "read_tmp_ascii"; + +ModuleAscii = PyImport_ImportModule(path.text()); + +if ( ! ModuleAscii ) { + + PyErr_Print(); + mlog << Error << "\nPython3_Script::Python3_Script(const char *) -> " + << "unable to import module \"" << path << "\"\n\n"; + + Py_Finalize(); + + exit ( 1 ); + +} + +DictAscii = PyModule_GetDict(ModuleAscii); + + // + // done + // + +fflush(stdout); +fflush(stderr); + +} + +//////////////////////////////////////////////////////////////////////// + +PyObject* Python3_Script::read_tmp_ascii(const char * tmp_filename) const + +{ + +mlog << Debug(2) << "Reading temporary ascii file: " + << tmp_filename << "\n"; + +ConcatString command; + +command << "read_tmp_ascii(\"" + << tmp_filename + << "\")"; + +mlog << Debug(3) << command << "\n"; + +PyErr_Clear(); + +PyObject * pobj; + +pobj = PyRun_String(command.text(), Py_file_input, DictAscii, DictAscii); + +if ( PyErr_Occurred() ) { + + mlog << Error << "\nPython3_Script::read_tmp_ascii() -> " + << "command \"" << command << "\" failed!\n\n"; + + exit ( 1 ); +} + +PyTypeObject* type = pobj->ob_type; + +const char* p = type->tp_name; + +mlog << Debug(2) << "read_tmp_ascii return type: " << p << "\n"; + +return pobj; +} //////////////////////////////////////////////////////////////////////// diff --git a/met/src/libcode/vx_python3_utils/python3_script.h b/met/src/libcode/vx_python3_utils/python3_script.h index 20069762f9..6930d226a5 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.h +++ b/met/src/libcode/vx_python3_utils/python3_script.h @@ -41,6 +41,10 @@ class Python3_Script { PyObject * Dict; // script dictionary, not allocated + PyObject * ModuleAscii; + + PyObject * DictAscii; + ConcatString Script_Filename; @@ -62,6 +66,8 @@ class Python3_Script { PyObject * module(); PyObject * dict(); + PyObject * module_ascii(); + PyObject * dict_ascii(); // // do stuff @@ -73,10 +79,15 @@ class Python3_Script { PyObject * lookup(const char * name) const; - void run(const char * command) const; // runs a command in the namespace of the script + PyObject * lookup_ascii(const char * name) const; + + PyObject * run(const char * command) const; // runs a command in the namespace of the script void read_pickle (const char * variable_name, const char * pickle_filename) const; + void import_read_tmp_ascii_py (void); + + PyObject * read_tmp_ascii (const char * tmp_filename) const; }; @@ -87,6 +98,10 @@ inline PyObject * Python3_Script::module() { return ( Module ); } inline PyObject * Python3_Script::dict() { return ( Dict ); } +inline PyObject * Python3_Script::module_ascii() { return ( ModuleAscii ); } + +inline PyObject * Python3_Script::dict_ascii() { return ( DictAscii ); } + inline ConcatString Python3_Script::filename() const { return ( Script_Filename ); } diff --git a/met/src/tools/other/ascii2nc/ascii2nc.cc b/met/src/tools/other/ascii2nc/ascii2nc.cc index 4ced5397b1..360329659c 100644 --- a/met/src/tools/other/ascii2nc/ascii2nc.cc +++ b/met/src/tools/other/ascii2nc/ascii2nc.cc @@ -43,6 +43,7 @@ // 015 03-20-19 Fillmore Add aeronetv2 and aeronetv3 options. // 016 01-30-20 Bullock Add python option. // 017 01-25-21 Halley Gotway MET #1630 Handle zero obs. +// 018 03-01-21 Fillmore Replace pickle files for temporary ascii. // //////////////////////////////////////////////////////////////////////// diff --git a/met/src/tools/other/ascii2nc/python_handler.cc b/met/src/tools/other/ascii2nc/python_handler.cc index e2733a605e..d894ab6c64 100644 --- a/met/src/tools/other/ascii2nc/python_handler.cc +++ b/met/src/tools/other/ascii2nc/python_handler.cc @@ -27,13 +27,12 @@ using namespace std; static const char generic_python_wrapper [] = "generic_python"; -static const char generic_pickle_wrapper [] = "generic_pickle"; -static const char write_pickle_wrapper [] = "MET_BASE/wrappers/write_pickle_point.py"; +static const char write_tmp_ascii_wrapper[] = "MET_BASE/wrappers/write_tmp_point.py"; static const char list_name [] = "point_data"; -static const char pickle_base_name [] = "tmp_ascii2nc_pickle"; +static const char tmp_base_name [] = "tmp_ascii2nc"; //////////////////////////////////////////////////////////////////////// @@ -57,7 +56,7 @@ PythonHandler::PythonHandler(const string &program_name) : FileHandler(program_n { -use_pickle = false; +use_tmp_ascii = false; } @@ -82,13 +81,13 @@ for (j=1; j<(a.n()); ++j) { // j starts at one here, not zero } -use_pickle = false; +use_tmp_ascii = false; const char * c = getenv(user_python_path_env); if ( c ) { - use_pickle = true; + use_tmp_ascii = true; user_path_to_python = c; @@ -231,7 +230,7 @@ bool PythonHandler::readAsciiFiles(const vector< ConcatString > &ascii_filename_ bool status = false; -if ( use_pickle ) status = do_pickle (); +if ( use_tmp_ascii ) status = do_tmp_ascii (); else status = do_straight (); return ( status ); @@ -320,10 +319,10 @@ return ( true ); // - // wrapper usage: /path/to/python wrapper.py pickle_output_filename user_script_name [ user_script args ... ] + // wrapper usage: /path/to/python wrapper.py tmp_output_filename user_script_name [ user_script args ... ] // -bool PythonHandler::do_pickle() +bool PythonHandler::do_tmp_ascii() { @@ -331,7 +330,7 @@ int j; const int N = user_script_args.n(); ConcatString command; ConcatString path; -ConcatString pickle_path; +ConcatString tmp_ascii_path; const char * tmp_dir = 0; int status; @@ -345,15 +344,16 @@ if ( ! tmp_dir ) tmp_dir = default_tmp_dir; path << cs_erase << tmp_dir << '/' - << pickle_base_name; + << tmp_base_name; -pickle_path = make_temp_file_name(path.text(), 0); +tmp_ascii_path = make_temp_file_name(path.text(), 0); +tmp_ascii_path << ".txt"; command << cs_erase - << user_path_to_python << ' ' // user's path to python - << replace_path(write_pickle_wrapper) << ' ' // write_pickle.py - << pickle_path << ' ' // pickle output filename - << user_script_filename; // user's script name + << user_path_to_python << ' ' // user's path to python + << replace_path(write_tmp_ascii_wrapper) << ' ' // write_tmp_point.py + << tmp_ascii_path << ' ' // temporary ascii output filename + << user_script_filename; // user's script name for (j=0; j " + mlog << Error << "\nPythonHandler::do_tmp_ascii() -> " << "command \"" << command.text() << "\" failed ... status = " << status << "\n\n"; @@ -375,18 +375,20 @@ if ( status ) { ConcatString wrapper; -wrapper = generic_pickle_wrapper; +wrapper = generic_python_wrapper; Python3_Script script(wrapper.text()); -script.read_pickle(list_name, pickle_path.text()); +script.import_read_tmp_ascii_py(); -PyObject * obj = script.lookup(list_name); +PyObject * dobj = script.read_tmp_ascii(tmp_ascii_path.text()); + +PyObject * obj = script.lookup_ascii(list_name); if ( ! PyList_Check(obj) ) { - mlog << Error << "\nPythonHandler::do_pickle() -> " - << "pickle object is not a list!\n\n"; + mlog << Error << "\nPythonHandler::do_tmp_ascii() -> " + << "tmp ascii object is not a list!\n\n"; exit ( 1 ); @@ -398,7 +400,7 @@ load_python_obs(obj); // cleanup // -remove_temp_file(pickle_path); +remove_temp_file(tmp_ascii_path); // // done diff --git a/met/src/tools/other/ascii2nc/python_handler.h b/met/src/tools/other/ascii2nc/python_handler.h index abae8ddd5d..b0fb2ef492 100644 --- a/met/src/tools/other/ascii2nc/python_handler.h +++ b/met/src/tools/other/ascii2nc/python_handler.h @@ -50,9 +50,9 @@ class PythonHandler : public FileHandler static string getFormatString() { return "python"; } - bool use_pickle; + bool use_tmp_ascii; - ConcatString user_path_to_python; // if we're using pickle + ConcatString user_path_to_python; // if we're using temporary ascii ConcatString user_script_filename; @@ -68,15 +68,13 @@ class PythonHandler : public FileHandler virtual bool readAsciiFiles(const vector< ConcatString > &ascii_filename_list); - bool do_pickle (); - bool do_straight (); // straight-up python, no pickle + bool do_tmp_ascii(); + bool do_straight (); // straight-up python, no temporary ascii void load_python_obs(PyObject *); // python object is list of lists bool read_obs_from_script (const char * script_name, const char * variable_name); - - bool read_obs_from_pickle (const char * pickle_name, const char * variable_name); }; From 9e6613e4943a0e1ff06b2f3c076c3798c368f60e Mon Sep 17 00:00:00 2001 From: johnhg Date: Sun, 4 Apr 2021 16:26:42 -0600 Subject: [PATCH 088/165] Feature 1736 out_stat (#1744) * Per #1736, if -out_stat was used for aggregate or aggregate_stat jobs, do not write output to the -out or log output. * Per #1736, clarify stat_analysis documentation for -out_stat option. * Per #1736, for jobs which can write .stat output, don't waste time populating the output AsciiTable unless it's actually going to be written. Co-authored-by: John Halley Gotway --- met/docs/Users_Guide/stat-analysis.rst | 4 +- .../core/stat_analysis/stat_analysis_job.cc | 736 ++++++++++++------ 2 files changed, 488 insertions(+), 252 deletions(-) diff --git a/met/docs/Users_Guide/stat-analysis.rst b/met/docs/Users_Guide/stat-analysis.rst index ce2d8c7654..acbad3127d 100644 --- a/met/docs/Users_Guide/stat-analysis.rst +++ b/met/docs/Users_Guide/stat-analysis.rst @@ -548,7 +548,9 @@ This option specifies the desired output line type for the **aggregate_stat** jo -out_stat file -set_hdr col_name string -The Stat-Analysis tool writes its output to either standard out or the file specified using the **-out** command line option. However that output lacks the standard STAT header columns. The **-out_stat** job command option may be used for each job to specify the name of an output file to which full STAT output lines should be written. Jobs will often combine output with multiple entries in the header columns. For example, a job may aggregate output with three different values in the **VX_MASK** column, such as “mask1”, “mask2”, and “mask3”. The output **VX_MASK** column will contain the unique values encountered concatenated together with commas: “mask1,mask2,mask3”. Alternatively, the **-set_hdr** option may be used to specify what should be written to the output header columns, such as “-set_hdr VX_MASK all_three_masks”. +The Stat-Analysis tool writes its output to either the log file or the file specified using the **-out** command line option. However the **aggregate** and **aggregate_stat** jobs create STAT output lines and the standard output written lacks the full set of STAT header columns. The **-out_stat** job command option may be used for these jobs to specify the name of an output file to which full STAT output lines should be written. When the **-out_stat** job command option is used for **aggregate** and **aggregate_stat** jobs the output is sent to the **-out_stat** file instead of the log or **-out** file. + +Jobs will often combine output with multiple entries in the header columns. For example, a job may aggregate output with three different values in the **VX_MASK** column, such as “mask1”, “mask2”, and “mask3”. The output **VX_MASK** column will contain the unique values encountered concatenated together with commas: “mask1,mask2,mask3”. Alternatively, the **-set_hdr** option may be used to specify what should be written to the output header columns, such as “-set_hdr VX_MASK all_three_masks”. When using the “-out_stat” option to create a .stat output file and stratifying results using one or more “-by” job command options, those columns may be referenced in the “-set_hdr” option. When using multiple “-by” options, use “CASE” to reference the full case information string: diff --git a/met/src/tools/core/stat_analysis/stat_analysis_job.cc b/met/src/tools/core/stat_analysis/stat_analysis_job.cc index 5bd789ef3f..3ccc07ad70 100644 --- a/met/src/tools/core/stat_analysis/stat_analysis_job.cc +++ b/met/src/tools/core/stat_analysis/stat_analysis_job.cc @@ -38,6 +38,8 @@ // 017 03/01/18 Halley Gotway Update summary job type. // 018 04/04/19 Fillmore Added FCST and OBS units. // 019 01/24/20 Halley Gotway Add aggregate RPS lines. +// 020 04/02/21 Halley Gotway MET #1736, write output to -out or +// -out_stat, but not both. // //////////////////////////////////////////////////////////////////////// @@ -559,9 +561,10 @@ void do_job_aggr(const ConcatString &jobstring, LineDataFile &f, // // Write the ASCII Table and the job command line + // If -out_stat was specified, do not write output // write_jobstring(jobstring, sa_out); - write_table(out_at, sa_out); + if(!job.stat_out) write_table(out_at, sa_out); return; } @@ -911,9 +914,10 @@ void do_job_aggr_stat(const ConcatString &jobstring, LineDataFile &f, // // Write the ASCII Table and the job command line + // If -out_stat was specified, do not write output // write_jobstring(jobstring, sa_out); - write_table(out_at, sa_out); + if(!job.stat_out) write_table(out_at, sa_out); return; } @@ -1184,19 +1188,29 @@ void write_job_aggr_ctc(STATAnalysisJob &job, STATLineType lt, // FHO output line // if(lt == stat_fho) { - at.set_entry(r, c++, (string)"FHO:"); - write_case_cols(it->first, at, r, c); - write_fho_cols(it->second.cts_info, at, r, c); - if(job.stat_out) write_fho_cols(it->second.cts_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_fho_cols(it->second.cts_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"FHO:"); + write_case_cols(it->first, at, r, c); + write_fho_cols(it->second.cts_info, at, r, c); + } } // // CTC output line // else if(lt == stat_ctc) { - at.set_entry(r, c++, (string)"CTC:"); - write_case_cols(it->first, at, r, c); - write_ctc_cols(it->second.cts_info, at, r, c); - if(job.stat_out) write_ctc_cols(it->second.cts_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_ctc_cols(it->second.cts_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"CTC:"); + write_case_cols(it->first, at, r, c); + write_ctc_cols(it->second.cts_info, at, r, c); + } } // // CTS output line @@ -1219,19 +1233,30 @@ void write_job_aggr_ctc(STATAnalysisJob &job, STATLineType lt, // // Write the data line // - at.set_entry(r, c++, (string)"CTS:"); - write_case_cols(it->first, at, r, c); - write_cts_cols(it->second.cts_info, 0, at, r, c); - if(job.stat_out) write_cts_cols(it->second.cts_info, 0, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_cts_cols(it->second.cts_info, 0, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"CTS:"); + write_case_cols(it->first, at, r, c); + write_cts_cols(it->second.cts_info, 0, at, r, c); + } } // // ECLV output line // else if(lt == stat_eclv) { - at.set_entry(r, c++, (string)"ECLV:"); - write_case_cols(it->first, at, r, c); - write_eclv_cols(it->second.cts_info.cts, job.out_eclv_points, at, r, c); - if(job.stat_out) write_eclv_cols(it->second.cts_info.cts, job.out_eclv_points, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_eclv_cols(it->second.cts_info.cts, + job.out_eclv_points, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"ECLV:"); + write_case_cols(it->first, at, r, c); + write_eclv_cols(it->second.cts_info.cts, job.out_eclv_points, at, r, c); + } } // // NBRCTC output line @@ -1241,10 +1266,15 @@ void write_job_aggr_ctc(STATAnalysisJob &job, STATLineType lt, nbrcts_info.clear(); nbrcts_info.cts_info = it->second.cts_info; - at.set_entry(r, c++, (string)"NBRCTC:"); - write_case_cols(it->first, at, r, c); - write_nbrctc_cols(nbrcts_info, at, r, c); - if(job.stat_out) write_nbrctc_cols(nbrcts_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_nbrctc_cols(nbrcts_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"NBRCTC:"); + write_case_cols(it->first, at, r, c); + write_nbrctc_cols(nbrcts_info, at, r, c); + } } // // NBRCTS output line @@ -1270,10 +1300,15 @@ void write_job_aggr_ctc(STATAnalysisJob &job, STATLineType lt, // // Write the data line // - at.set_entry(r, c++, (string)"NBRCTS:"); - write_case_cols(it->first, at, r, c); - write_nbrcts_cols(nbrcts_info, 0, at, r, c); - if(job.stat_out) write_nbrcts_cols(nbrcts_info, 0, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_nbrcts_cols(nbrcts_info, 0, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"NBRCTS:"); + write_case_cols(it->first, at, r, c); + write_nbrcts_cols(nbrcts_info, 0, at, r, c); + } } } // end for it @@ -1344,10 +1379,15 @@ void write_job_aggr_mctc(STATAnalysisJob &job, STATLineType lt, // MCTC output line // if(lt == stat_mctc) { - at.set_entry(r, c++, (string)"MCTC:"); - write_case_cols(it->first, at, r, c); - write_mctc_cols(it->second.mcts_info, at, r, c); - if(job.stat_out) write_mctc_cols(it->second.mcts_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_mctc_cols(it->second.mcts_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"MCTC:"); + write_case_cols(it->first, at, r, c); + write_mctc_cols(it->second.mcts_info, at, r, c); + } } // // MCTS output line @@ -1370,10 +1410,15 @@ void write_job_aggr_mctc(STATAnalysisJob &job, STATLineType lt, // // Write the data line // - at.set_entry(r, c++, (string)"MCTS:"); - write_case_cols(it->first, at, r, c); - write_mcts_cols(it->second.mcts_info, 0, at, r, c); - if(job.stat_out) write_mcts_cols(it->second.mcts_info, 0, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_mcts_cols(it->second.mcts_info, 0, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"MCTS:"); + write_case_cols(it->first, at, r, c); + write_mcts_cols(it->second.mcts_info, 0, at, r, c); + } } } // end for it @@ -1454,10 +1499,15 @@ void write_job_aggr_pct(STATAnalysisJob &job, STATLineType lt, // PCT output line // if(lt == stat_pct) { - at.set_entry(r, c++, (string)"PCT:"); - write_case_cols(it->first, at, r, c); - write_pct_cols(it->second.pct_info, at, r, c); - if(job.stat_out) write_pct_cols(it->second.pct_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_pct_cols(it->second.pct_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"PCT:"); + write_case_cols(it->first, at, r, c); + write_pct_cols(it->second.pct_info, at, r, c); + } } // // PSTD output line @@ -1480,28 +1530,43 @@ void write_job_aggr_pct(STATAnalysisJob &job, STATLineType lt, // // Write the data line // - at.set_entry(r, c++, (string)"PSTD:"); - write_case_cols(it->first, at, r, c); - write_pstd_cols(it->second.pct_info, 0, at, r, c); - if(job.stat_out) write_pstd_cols(it->second.pct_info, 0, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_pstd_cols(it->second.pct_info, 0, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"PSTD:"); + write_case_cols(it->first, at, r, c); + write_pstd_cols(it->second.pct_info, 0, at, r, c); + } } // // PJC output line // else if(lt == stat_pjc) { - at.set_entry(r, c++, (string)"PJC:"); - write_case_cols(it->first, at, r, c); - write_pjc_cols(it->second.pct_info, at, r, c); - if(job.stat_out) write_pjc_cols(it->second.pct_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_pjc_cols(it->second.pct_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"PJC:"); + write_case_cols(it->first, at, r, c); + write_pjc_cols(it->second.pct_info, at, r, c); + } } // // PRC output line // else if(lt == stat_prc) { - at.set_entry(r, c++, (string)"PRC:"); - write_case_cols(it->first, at, r, c); - write_prc_cols(it->second.pct_info, at, r, c); - if(job.stat_out) write_prc_cols(it->second.pct_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_prc_cols(it->second.pct_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"PRC:"); + write_case_cols(it->first, at, r, c); + write_prc_cols(it->second.pct_info, at, r, c); + } } // // ECLV output lines @@ -1509,17 +1574,19 @@ void write_job_aggr_pct(STATAnalysisJob &job, STATLineType lt, else if(lt == stat_eclv) { ThreshArray prob_ta = string_to_prob_thresh(shc.get_fcst_thresh_str().c_str()); for(i=0; isecond.pct_info.pct.nrows(); i++, r++) { - c = 0; - at.set_entry(r, c++, (string)"ECLV:"); - write_case_cols(it->first, at, r, c); - write_eclv_cols(it->second.pct_info.pct.ctc_by_row(i), - job.out_eclv_points, at, r, c); if(job.stat_out) { shc.set_fcst_thresh(prob_ta[i]); write_header_cols(shc, job.stat_at, r); write_eclv_cols(it->second.pct_info.pct.ctc_by_row(i), job.out_eclv_points, job.stat_at, r, n_header_columns); } + else { + c = 0; + at.set_entry(r, c++, (string)"ECLV:"); + write_case_cols(it->first, at, r, c); + write_eclv_cols(it->second.pct_info.pct.ctc_by_row(i), + job.out_eclv_points, at, r, c); + } } } } // end for it @@ -1594,37 +1661,57 @@ void write_job_aggr_psum(STATAnalysisJob &job, STATLineType lt, // SL1L2 output line // if(lt == stat_sl1l2) { - at.set_entry(r, c++, (string)"SL1L2:"); - write_case_cols(it->first, at, r, c); - write_sl1l2_cols(it->second.sl1l2_info, at, r, c); - if(job.stat_out) write_sl1l2_cols(it->second.sl1l2_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_sl1l2_cols(it->second.sl1l2_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"SL1L2:"); + write_case_cols(it->first, at, r, c); + write_sl1l2_cols(it->second.sl1l2_info, at, r, c); + } } // // SAL1L2 output line // else if(lt == stat_sal1l2) { - at.set_entry(r, c++, (string)"SAL1L2:"); - write_case_cols(it->first, at, r, c); - write_sal1l2_cols(it->second.sl1l2_info, at, r, c); - if(job.stat_out) write_sal1l2_cols(it->second.sl1l2_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_sal1l2_cols(it->second.sl1l2_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"SAL1L2:"); + write_case_cols(it->first, at, r, c); + write_sal1l2_cols(it->second.sl1l2_info, at, r, c); + } } // // VL1L2 output line // else if(lt == stat_vl1l2) { - at.set_entry(r, c++, (string)"VL1L2:"); - write_case_cols(it->first, at, r, c); - write_vl1l2_cols(it->second.vl1l2_info, at, r, c); - if(job.stat_out) write_vl1l2_cols(it->second.vl1l2_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_vl1l2_cols(it->second.vl1l2_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"VL1L2:"); + write_case_cols(it->first, at, r, c); + write_vl1l2_cols(it->second.vl1l2_info, at, r, c); + } } // // VAL1L2 output line // else if(lt == stat_val1l2) { - at.set_entry(r, c++, (string)"VAL1L2:"); - write_case_cols(it->first, at, r, c); - write_val1l2_cols(it->second.vl1l2_info, at, r, c); - if(job.stat_out) write_val1l2_cols(it->second.vl1l2_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_val1l2_cols(it->second.vl1l2_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"VAL1L2:"); + write_case_cols(it->first, at, r, c); + write_val1l2_cols(it->second.vl1l2_info, at, r, c); + } } // // CNT output line @@ -1647,19 +1734,29 @@ void write_job_aggr_psum(STATAnalysisJob &job, STATLineType lt, else compute_cntinfo(it->second.sl1l2_info, 1, it->second.cnt_info); - at.set_entry(r, c++, (string)"CNT:"); - write_case_cols(it->first, at, r, c); - write_cnt_cols(it->second.cnt_info, 0, at, r, c); - if(job.stat_out) write_cnt_cols(it->second.cnt_info, 0, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_cnt_cols(it->second.cnt_info, 0, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"CNT:"); + write_case_cols(it->first, at, r, c); + write_cnt_cols(it->second.cnt_info, 0, at, r, c); + } } // // VCNT output line // else if(lt == stat_vcnt) { - at.set_entry(r, c++, (string)"VCNT:"); - write_case_cols(it->first, at, r, c); - write_vcnt_cols(it->second.vl1l2_info, at, r, c); - if(job.stat_out) write_vcnt_cols(it->second.vl1l2_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_vcnt_cols(it->second.vl1l2_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, (string)"VCNT:"); + write_case_cols(it->first, at, r, c); + write_vcnt_cols(it->second.vl1l2_info, at, r, c); + } } // // NBRCNT output line @@ -1671,10 +1768,15 @@ void write_job_aggr_psum(STATAnalysisJob &job, STATLineType lt, // it->second.nbrcnt_info.allocate_n_alpha(1); - at.set_entry(r, c++, "NBRCNT:"); - write_case_cols(it->first, at, r, c); - write_nbrcnt_cols(it->second.nbrcnt_info, 0, at, r, c); - if(job.stat_out) write_nbrcnt_cols(it->second.nbrcnt_info, 0, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_nbrcnt_cols(it->second.nbrcnt_info, 0, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "NBRCNT:"); + write_case_cols(it->first, at, r, c); + write_nbrcnt_cols(it->second.nbrcnt_info, 0, at, r, c); + } } } // end for it @@ -1732,10 +1834,15 @@ void write_job_aggr_grad(STATAnalysisJob &job, STATLineType lt, // // GRAD output line // - at.set_entry(r, c++, "GRAD:"); - write_case_cols(it->first, at, r, c); - write_grad_cols(it->second.grad_info, at, r, c); - if(job.stat_out) write_grad_cols(it->second.grad_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_grad_cols(it->second.grad_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "GRAD:"); + write_case_cols(it->first, at, r, c); + write_grad_cols(it->second.grad_info, at, r, c); + } } // end for it return; @@ -1967,10 +2074,15 @@ void write_job_aggr_ecnt(STATAnalysisJob &job, STATLineType lt, // // ECNT output line // - at.set_entry(r, c++, "ECNT:"); - write_case_cols(it->first, at, r, c); - write_ecnt_cols(ecnt_info, at, r, c); - if(job.stat_out) write_ecnt_cols(ecnt_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_ecnt_cols(ecnt_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "ECNT:"); + write_case_cols(it->first, at, r, c); + write_ecnt_cols(ecnt_info, at, r, c); + } } // end for it return; @@ -2028,10 +2140,15 @@ void write_job_aggr_rps(STATAnalysisJob &job, STATLineType lt, // // RPS output line // - at.set_entry(r, c++, "RPS:"); - write_case_cols(it->first, at, r, c); - write_rps_cols(it->second.rps_info, at, r, c); - if(job.stat_out) write_rps_cols(it->second.rps_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_rps_cols(it->second.rps_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "RPS:"); + write_case_cols(it->first, at, r, c); + write_rps_cols(it->second.rps_info, at, r, c); + } } // end for it return; @@ -2096,10 +2213,15 @@ void write_job_aggr_rhist(STATAnalysisJob &job, STATLineType lt, // // RHIST output line // - at.set_entry(r, c++, "RHIST:"); - write_case_cols(it->first, at, r, c); - write_rhist_cols(&(it->second.ens_pd), at, r, c); - if(job.stat_out) write_rhist_cols(&(it->second.ens_pd), job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_rhist_cols(&(it->second.ens_pd), job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "RHIST:"); + write_case_cols(it->first, at, r, c); + write_rhist_cols(&(it->second.ens_pd), at, r, c); + } } // end for it return; @@ -2164,10 +2286,15 @@ void write_job_aggr_phist(STATAnalysisJob &job, STATLineType lt, // // PHIST output line // - at.set_entry(r, c++, "PHIST:"); - write_case_cols(it->first, at, r, c); - write_phist_cols(&(it->second.ens_pd), at, r, c); - if(job.stat_out) write_phist_cols(&(it->second.ens_pd), job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_phist_cols(&(it->second.ens_pd), job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "PHIST:"); + write_case_cols(it->first, at, r, c); + write_phist_cols(&(it->second.ens_pd), at, r, c); + } } // end for it return; @@ -2232,10 +2359,15 @@ void write_job_aggr_relp(STATAnalysisJob &job, STATLineType lt, // // RELP output line // - at.set_entry(r, c++, "RELP:"); - write_case_cols(it->first, at, r, c); - write_relp_cols(&(it->second.ens_pd), at, r, c); - if(job.stat_out) write_relp_cols(&(it->second.ens_pd), job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_relp_cols(&(it->second.ens_pd), job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "RELP:"); + write_case_cols(it->first, at, r, c); + write_relp_cols(&(it->second.ens_pd), at, r, c); + } } // end for it return; @@ -2324,47 +2456,6 @@ void write_job_aggr_ssvar(STATAnalysisJob &job, STATLineType lt, // compute_cntinfo(bin_it->second.sl1l2_info, 0, cnt_info); - // - // SSVAR output line - // - at.set_entry(r, c++, "SSVAR:"); - write_case_cols(case_it->first, at, r, c); - at.set_entry(r, c++, n); - at.set_entry(r, c++, (int) case_it->second.ssvar_bins.size()); - at.set_entry(r, c++, i); - at.set_entry(r, c++, bin_it->second.bin_n); - at.set_entry(r, c++, bin_it->second.var_min); - at.set_entry(r, c++, bin_it->second.var_max); - at.set_entry(r, c++, bin_it->second.var_mean); - at.set_entry(r, c++, bin_it->second.sl1l2_info.fbar); - at.set_entry(r, c++, bin_it->second.sl1l2_info.obar); - at.set_entry(r, c++, bin_it->second.sl1l2_info.fobar); - at.set_entry(r, c++, bin_it->second.sl1l2_info.ffbar); - at.set_entry(r, c++, bin_it->second.sl1l2_info.oobar); - at.set_entry(r, c++, cnt_info.fbar.v_ncl[0]); - at.set_entry(r, c++, cnt_info.fbar.v_ncu[0]); - at.set_entry(r, c++, cnt_info.fstdev.v); - at.set_entry(r, c++, cnt_info.fstdev.v_ncl[0]); - at.set_entry(r, c++, cnt_info.fstdev.v_ncu[0]); - at.set_entry(r, c++, cnt_info.obar.v_ncl[0]); - at.set_entry(r, c++, cnt_info.obar.v_ncu[0]); - at.set_entry(r, c++, cnt_info.ostdev.v); - at.set_entry(r, c++, cnt_info.ostdev.v_ncl[0]); - at.set_entry(r, c++, cnt_info.ostdev.v_ncu[0]); - at.set_entry(r, c++, cnt_info.pr_corr.v); - at.set_entry(r, c++, cnt_info.pr_corr.v_ncl[0]); - at.set_entry(r, c++, cnt_info.pr_corr.v_ncu[0]); - at.set_entry(r, c++, cnt_info.me.v); - at.set_entry(r, c++, cnt_info.me.v_ncl[0]); - at.set_entry(r, c++, cnt_info.me.v_ncu[0]); - at.set_entry(r, c++, cnt_info.estdev.v); - at.set_entry(r, c++, cnt_info.estdev.v_ncl[0]); - at.set_entry(r, c++, cnt_info.estdev.v_ncu[0]); - at.set_entry(r, c++, cnt_info.mbias.v); - at.set_entry(r, c++, cnt_info.mse.v); - at.set_entry(r, c++, cnt_info.bcmse.v); - at.set_entry(r, c++, cnt_info.rmse.v); - // // Write the output STAT line // @@ -2407,6 +2498,48 @@ void write_job_aggr_ssvar(STATAnalysisJob &job, STATLineType lt, job.stat_at.set_entry(r, c++, cnt_info.bcmse.v); job.stat_at.set_entry(r, c++, cnt_info.rmse.v); } + // + // SSVAR output line + // + else { + at.set_entry(r, c++, "SSVAR:"); + write_case_cols(case_it->first, at, r, c); + at.set_entry(r, c++, n); + at.set_entry(r, c++, (int) case_it->second.ssvar_bins.size()); + at.set_entry(r, c++, i); + at.set_entry(r, c++, bin_it->second.bin_n); + at.set_entry(r, c++, bin_it->second.var_min); + at.set_entry(r, c++, bin_it->second.var_max); + at.set_entry(r, c++, bin_it->second.var_mean); + at.set_entry(r, c++, bin_it->second.sl1l2_info.fbar); + at.set_entry(r, c++, bin_it->second.sl1l2_info.obar); + at.set_entry(r, c++, bin_it->second.sl1l2_info.fobar); + at.set_entry(r, c++, bin_it->second.sl1l2_info.ffbar); + at.set_entry(r, c++, bin_it->second.sl1l2_info.oobar); + at.set_entry(r, c++, cnt_info.fbar.v_ncl[0]); + at.set_entry(r, c++, cnt_info.fbar.v_ncu[0]); + at.set_entry(r, c++, cnt_info.fstdev.v); + at.set_entry(r, c++, cnt_info.fstdev.v_ncl[0]); + at.set_entry(r, c++, cnt_info.fstdev.v_ncu[0]); + at.set_entry(r, c++, cnt_info.obar.v_ncl[0]); + at.set_entry(r, c++, cnt_info.obar.v_ncu[0]); + at.set_entry(r, c++, cnt_info.ostdev.v); + at.set_entry(r, c++, cnt_info.ostdev.v_ncl[0]); + at.set_entry(r, c++, cnt_info.ostdev.v_ncu[0]); + at.set_entry(r, c++, cnt_info.pr_corr.v); + at.set_entry(r, c++, cnt_info.pr_corr.v_ncl[0]); + at.set_entry(r, c++, cnt_info.pr_corr.v_ncu[0]); + at.set_entry(r, c++, cnt_info.me.v); + at.set_entry(r, c++, cnt_info.me.v_ncl[0]); + at.set_entry(r, c++, cnt_info.me.v_ncu[0]); + at.set_entry(r, c++, cnt_info.estdev.v); + at.set_entry(r, c++, cnt_info.estdev.v_ncl[0]); + at.set_entry(r, c++, cnt_info.estdev.v_ncu[0]); + at.set_entry(r, c++, cnt_info.mbias.v); + at.set_entry(r, c++, cnt_info.mse.v); + at.set_entry(r, c++, cnt_info.bcmse.v); + at.set_entry(r, c++, cnt_info.rmse.v); + } } // end for bin_it } // end for case_it @@ -2539,14 +2672,18 @@ void write_job_aggr_orank(STATAnalysisJob &job, STATLineType lt, RPSInfo rps_info; rps_info.fthresh = job.out_fcst_thresh; rps_info.set(it->second.ens_pd); - at.set_entry(r, c++, "RPS:"); - write_case_cols(it->first, at, r, c); - write_rps_cols(rps_info, at, r, c); + if(job.stat_out) { shc.set_fcst_thresh(job.out_fcst_thresh); write_header_cols(shc, job.stat_at, r); write_rps_cols(rps_info, job.stat_at, r, n_header_columns); } + else { + at.set_entry(r, c++, "RPS:"); + write_case_cols(it->first, at, r, c); + write_rps_cols(rps_info, at, r, c); + } + // Increment row counter r++; } @@ -2556,13 +2693,17 @@ void write_job_aggr_orank(STATAnalysisJob &job, STATLineType lt, // else if(lt == stat_rhist) { it->second.ens_pd.compute_rhist(); - at.set_entry(r, c++, "RHIST:"); - write_case_cols(it->first, at, r, c); - write_rhist_cols(&(it->second.ens_pd), at, r, c); + if(job.stat_out) { write_header_cols(shc, job.stat_at, r); write_rhist_cols(&(it->second.ens_pd), job.stat_at, r, n_header_columns); } + else { + at.set_entry(r, c++, "RHIST:"); + write_case_cols(it->first, at, r, c); + write_rhist_cols(&(it->second.ens_pd), at, r, c); + } + // Increment row counter r++; } @@ -2571,13 +2712,16 @@ void write_job_aggr_orank(STATAnalysisJob &job, STATLineType lt, // PHIST output line // else if(lt == stat_phist) { - at.set_entry(r, c++, "PHIST:"); - write_case_cols(it->first, at, r, c); - write_phist_cols(&(it->second.ens_pd), at, r, c); if(job.stat_out) { write_header_cols(shc, job.stat_at, r); write_phist_cols(&(it->second.ens_pd), job.stat_at, r, n_header_columns); } + else { + at.set_entry(r, c++, "PHIST:"); + write_case_cols(it->first, at, r, c); + write_phist_cols(&(it->second.ens_pd), at, r, c); + } + // Increment row counter r++; } @@ -2587,13 +2731,18 @@ void write_job_aggr_orank(STATAnalysisJob &job, STATLineType lt, // else if(lt == stat_relp) { it->second.ens_pd.compute_relp(); - at.set_entry(r, c++, "RELP:"); - write_case_cols(it->first, at, r, c); - write_relp_cols(&(it->second.ens_pd), at, r, c); + if(job.stat_out) { write_header_cols(shc, job.stat_at, r); - write_relp_cols(&(it->second.ens_pd), job.stat_at, r, n_header_columns); + write_relp_cols(&(it->second.ens_pd), job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "RELP:"); + write_case_cols(it->first, at, r, c); + write_relp_cols(&(it->second.ens_pd), at, r, c); } + // Increment row counter r++; } @@ -2609,14 +2758,18 @@ void write_job_aggr_orank(STATAnalysisJob &job, STATLineType lt, // Write a line for each ssvar bin // for(i=0; isecond.ens_pd.ssvar_bins[0].n_bin; i++) { - c = 0; - at.set_entry(r, c++, "SSVAR:"); - write_case_cols(it->first, at, r, c); - write_ssvar_cols(&(it->second.ens_pd), i, job.out_alpha, at, r, c); if(job.stat_out) { write_header_cols(shc, job.stat_at, r); - write_ssvar_cols(&(it->second.ens_pd), i, job.out_alpha, job.stat_at, r, n_header_columns); + write_ssvar_cols(&(it->second.ens_pd), i, job.out_alpha, job.stat_at, + r, n_header_columns); } + else { + c = 0; + at.set_entry(r, c++, "SSVAR:"); + write_case_cols(it->first, at, r, c); + write_ssvar_cols(&(it->second.ens_pd), i, job.out_alpha, at, r, c); + } + // Increment row counter r++; } @@ -2678,12 +2831,15 @@ void write_job_aggr_isc(STATAnalysisJob &job, STATLineType lt, // ISC output line // for(i=-1, c=0; i<=it->second.isc_info.n_scale; i++, r++, c=0) { - at.set_entry(r, c++, "ISC:"); - write_case_cols(it->first, at, r, c); - write_isc_cols(it->second.isc_info, i, at, r, c); if(job.stat_out) { write_header_cols(shc, job.stat_at, r); - write_isc_cols(it->second.isc_info, i, job.stat_at, r, n_header_columns); + write_isc_cols(it->second.isc_info, i, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "ISC:"); + write_case_cols(it->first, at, r, c); + write_isc_cols(it->second.isc_info, i, at, r, c); } } } // end for it @@ -2800,130 +2956,195 @@ void write_job_aggr_mpr(STATAnalysisJob &job, STATLineType lt, // if(lt == stat_fho) { mpr_to_ctc(job, it->second, cts_info); - at.set_entry(r, c++, "FHO:"); - write_case_cols(it->first, at, r, c); - write_fho_cols(cts_info, at, r, c); - if(job.stat_out) write_fho_cols(cts_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_fho_cols(cts_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "FHO:"); + write_case_cols(it->first, at, r, c); + write_fho_cols(cts_info, at, r, c); + } } // // CTC output line // else if(lt == stat_ctc) { mpr_to_ctc(job, it->second, cts_info); - at.set_entry(r, c++, "CTC:"); - write_case_cols(it->first, at, r, c); - write_ctc_cols(cts_info, at, r, c); - if(job.stat_out) write_ctc_cols(cts_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_ctc_cols(cts_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "CTC:"); + write_case_cols(it->first, at, r, c); + write_ctc_cols(cts_info, at, r, c); + } } // // CTS output line // else if(lt == stat_cts) { mpr_to_cts(job, it->second, cts_info, tmp_dir, rng_ptr); - at.set_entry(r, c++, "CTS:"); - write_case_cols(it->first, at, r, c); - write_cts_cols(cts_info, 0, at, r, c); - if(job.stat_out) write_cts_cols(cts_info, 0, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_cts_cols(cts_info, 0, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "CTS:"); + write_case_cols(it->first, at, r, c); + write_cts_cols(cts_info, 0, at, r, c); + } } // // ECLV output line // else if(lt == stat_eclv) { mpr_to_ctc(job, it->second, cts_info); - at.set_entry(r, c++, "ECLV:"); - write_case_cols(it->first, at, r, c); - write_eclv_cols(cts_info.cts, job.out_eclv_points, at, r, c); - if(job.stat_out) write_eclv_cols(cts_info.cts, job.out_eclv_points, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_eclv_cols(cts_info.cts, job.out_eclv_points, + job.stat_at, r, n_header_columns); + } + else { + at.set_entry(r, c++, "ECLV:"); + write_case_cols(it->first, at, r, c); + write_eclv_cols(cts_info.cts, job.out_eclv_points, at, r, c); + } } // // MCTC output line // else if(lt == stat_mctc) { mpr_to_mctc(job, it->second, mcts_info); - at.set_entry(r, c++, "MCTC:"); - write_case_cols(it->first, at, r, c); - write_mctc_cols(mcts_info, at, r, c); - if(job.stat_out) write_mctc_cols(mcts_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_mctc_cols(mcts_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "MCTC:"); + write_case_cols(it->first, at, r, c); + write_mctc_cols(mcts_info, at, r, c); + } } // // MCTS output line // else if(lt == stat_mcts) { mpr_to_mcts(job, it->second, mcts_info, tmp_dir, rng_ptr); - at.set_entry(r, c++, "MCTS:"); - write_case_cols(it->first, at, r, c); - write_mcts_cols(mcts_info, 0, at, r, c); - if(job.stat_out) write_mcts_cols(mcts_info, 0, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_mcts_cols(mcts_info, 0, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "MCTS:"); + write_case_cols(it->first, at, r, c); + write_mcts_cols(mcts_info, 0, at, r, c); + } } // // CNT output line // else if(lt == stat_cnt) { mpr_to_cnt(job, it->second, cnt_info, tmp_dir, rng_ptr); - at.set_entry(r, c++, "CNT:"); - write_case_cols(it->first, at, r, c); - write_cnt_cols(cnt_info, 0, at, r, c); - if(job.stat_out) write_cnt_cols(cnt_info, 0, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_cnt_cols(cnt_info, 0, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "CNT:"); + write_case_cols(it->first, at, r, c); + write_cnt_cols(cnt_info, 0, at, r, c); + } } // // SL1L2 output line // else if(lt == stat_sl1l2) { mpr_to_psum(job, it->second, sl1l2_info); - at.set_entry(r, c++, "SL1L2:"); - write_case_cols(it->first, at, r, c); - write_sl1l2_cols(sl1l2_info, at, r, c); - if(job.stat_out) write_sl1l2_cols(sl1l2_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_sl1l2_cols(sl1l2_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "SL1L2:"); + write_case_cols(it->first, at, r, c); + write_sl1l2_cols(sl1l2_info, at, r, c); + } } // // SAL1L2 output line // else if(lt == stat_sal1l2) { mpr_to_psum(job, it->second, sl1l2_info); - at.set_entry(r, c++, "SAL1L2:"); - write_case_cols(it->first, at, r, c); - write_sal1l2_cols(sl1l2_info, at, r, c); - if(job.stat_out) write_sal1l2_cols(sl1l2_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_sal1l2_cols(sl1l2_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "SAL1L2:"); + write_case_cols(it->first, at, r, c); + write_sal1l2_cols(sl1l2_info, at, r, c); + } } // // PCT output line // else if(lt == stat_pct) { mpr_to_pct(job, it->second, pct_info); - at.set_entry(r, c++, "PCT:"); - write_case_cols(it->first, at, r, c); - write_pct_cols(pct_info, at, r, c); - if(job.stat_out) write_pct_cols(pct_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_pct_cols(pct_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "PCT:"); + write_case_cols(it->first, at, r, c); + write_pct_cols(pct_info, at, r, c); + } } // // PSTD output line // else if(lt == stat_pstd) { mpr_to_pct(job, it->second, pct_info); - at.set_entry(r, c++, "PSTD:"); - write_case_cols(it->first, at, r, c); - write_pstd_cols(pct_info, 0, at, r, c); - if(job.stat_out) write_pstd_cols(pct_info, 0, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_pstd_cols(pct_info, 0, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "PSTD:"); + write_case_cols(it->first, at, r, c); + write_pstd_cols(pct_info, 0, at, r, c); + } } // // PJC output line // else if(lt == stat_pjc) { mpr_to_pct(job, it->second, pct_info); - at.set_entry(r, c++, "PJC:"); - write_case_cols(it->first, at, r, c); - write_pjc_cols(pct_info, at, r, c); - if(job.stat_out) write_pjc_cols(pct_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_pjc_cols(pct_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "PJC:"); + write_case_cols(it->first, at, r, c); + write_pjc_cols(pct_info, at, r, c); + } } // // PRC output line // else if(lt == stat_prc) { mpr_to_pct(job, it->second, pct_info); - at.set_entry(r, c++, "PRC:"); - write_case_cols(it->first, at, r, c); - write_prc_cols(pct_info, at, r, c); - if(job.stat_out) write_prc_cols(pct_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_prc_cols(pct_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "PRC:"); + write_case_cols(it->first, at, r, c); + write_prc_cols(pct_info, at, r, c); + } } } // end for it @@ -2987,19 +3208,29 @@ void write_job_aggr_mpr_wind(STATAnalysisJob &job, STATLineType lt, // VL1L2 output line // if(lt == stat_vl1l2) { - at.set_entry(r, c++, "VL1L2:"); - write_case_cols(it->first, at, r, c); - write_vl1l2_cols(it->second.vl1l2_info, at, r, c); - if(job.stat_out) write_vl1l2_cols(it->second.vl1l2_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_vl1l2_cols(it->second.vl1l2_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "VL1L2:"); + write_case_cols(it->first, at, r, c); + write_vl1l2_cols(it->second.vl1l2_info, at, r, c); + } } // // VCNT output line // else if(lt == stat_vcnt) { - at.set_entry(r, c++, "VCNT:"); - write_case_cols(it->first, at, r, c); - write_vcnt_cols(it->second.vl1l2_info, at, r, c); - if(job.stat_out) write_vcnt_cols(it->second.vl1l2_info, job.stat_at, r, n_header_columns); + if(job.stat_out) { + write_vcnt_cols(it->second.vl1l2_info, job.stat_at, + r, n_header_columns); + } + else { + at.set_entry(r, c++, "VCNT:"); + write_case_cols(it->first, at, r, c); + write_vcnt_cols(it->second.vl1l2_info, at, r, c); + } } } // end for it @@ -3444,28 +3675,31 @@ void write_job_ramp(STATAnalysisJob &job, } } - // - // Write the ramp CTC output lines - // - if(job.out_line_type.has(stat_ctc_str)) { - c = 0; - ctc_at.set_entry(r_ctc, c++, "RAMP_CTC:"); - write_case_cols(it->first, ctc_at, r_ctc, c); - write_job_ramp_cols(job, ctc_at, r_ctc, c); - write_ctc_cols(cts_info, ctc_at, r_ctc, c); - r_ctc++; - } + else { - // - // Write the ramp CTS output lines - // - if(job.out_line_type.has(stat_cts_str)) { - c = 0; - cts_at.set_entry(r_cts, c++, "RAMP_CTS:"); - write_case_cols(it->first, cts_at, r_cts, c); - write_job_ramp_cols(job, cts_at, r_cts, c); - write_cts_cols(cts_info, 0, cts_at, r_cts, c); - r_cts++; + // + // Write the ramp CTC output lines + // + if(job.out_line_type.has(stat_ctc_str)) { + c = 0; + ctc_at.set_entry(r_ctc, c++, "RAMP_CTC:"); + write_case_cols(it->first, ctc_at, r_ctc, c); + write_job_ramp_cols(job, ctc_at, r_ctc, c); + write_ctc_cols(cts_info, ctc_at, r_ctc, c); + r_ctc++; + } + + // + // Write the ramp CTS output lines + // + if(job.out_line_type.has(stat_cts_str)) { + c = 0; + cts_at.set_entry(r_cts, c++, "RAMP_CTS:"); + write_case_cols(it->first, cts_at, r_cts, c); + write_job_ramp_cols(job, cts_at, r_cts, c); + write_cts_cols(cts_info, 0, cts_at, r_cts, c); + r_cts++; + } } } // end for it From 338c6e2fcfcfc9437691b5e8485c696a3e06fac9 Mon Sep 17 00:00:00 2001 From: MET Tools Test Account Date: Sun, 4 Apr 2021 16:57:20 -0600 Subject: [PATCH 089/165] Per #1319, this is a hotfix to the develop branch. While running unit_python.xml works via the command line, it fails when run through cron. The problem is the PATH setting. Need to have the anaconda bin directory in the path for it to succeeed. Adding that for the single test. --- test/xml/unit_python.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/xml/unit_python.xml b/test/xml/unit_python.xml index 1c89950159..7ec0585b30 100644 --- a/test/xml/unit_python.xml +++ b/test/xml/unit_python.xml @@ -7,6 +7,7 @@ + @@ -394,6 +395,7 @@ &MET_BIN;/plot_data_plane MET_PYTHON_EXE &MET_PYTHON_EXE; + PATH &ANACONDA_BIN; \ PYTHON_NUMPY \ From 69f5b5cdaa37a140a572af534b0240f7d967536c Mon Sep 17 00:00:00 2001 From: MET Tools Test Account Date: Sun, 4 Apr 2021 22:06:32 -0600 Subject: [PATCH 090/165] Just lining up a log message in the output of gen_vx_mask. --- met/src/tools/other/gen_vx_mask/gen_vx_mask.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/met/src/tools/other/gen_vx_mask/gen_vx_mask.cc b/met/src/tools/other/gen_vx_mask/gen_vx_mask.cc index 1f59deede3..bee09aff7c 100644 --- a/met/src/tools/other/gen_vx_mask/gen_vx_mask.cc +++ b/met/src/tools/other/gen_vx_mask/gen_vx_mask.cc @@ -1161,8 +1161,10 @@ DataPlane combine(const DataPlane &dp_data, const DataPlane &dp_mask, // List the number of points inside the mask if(logic != SetLogic_None) { mlog << Debug(3) - << "Mask " << setlogic_to_string(logic) << ": " << n_in - << " of " << grid.nx() * grid.ny() << " points inside\n"; + << "Mask " << setlogic_to_string(logic) + << (logic == SetLogic_Intersection ? ":\t" : ":\t\t") + << n_in << " of " << grid.nx() * grid.ny() + << " points inside\n"; } return(dp); From dd22521ec446c9f287ee6708914afb36e2d9848d Mon Sep 17 00:00:00 2001 From: MET Tools Test Account Date: Sun, 4 Apr 2021 22:19:41 -0600 Subject: [PATCH 091/165] Per #1319, setting PATH as an envvar might cause problems. All variables set prior to the test are unset afterwards! So we'd run all the rest of the tests after unit_python.xml with an empty path. That would likely cause any subsequent call to Rscript to fail. Recommend tightening up this logic when we move these tests to GHA. --- test/xml/unit_python.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/xml/unit_python.xml b/test/xml/unit_python.xml index 7ec0585b30..341a812fb5 100644 --- a/test/xml/unit_python.xml +++ b/test/xml/unit_python.xml @@ -392,10 +392,10 @@ - &MET_BIN;/plot_data_plane + export PATH=&ANACONDA_BIN;:${PATH}; \ + &MET_BIN;/plot_data_plane MET_PYTHON_EXE &MET_PYTHON_EXE; - PATH &ANACONDA_BIN; \ PYTHON_NUMPY \ From e18f0b5b3e9d4071aba575f7548fc0fa86197782 Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Mon, 5 Apr 2021 09:46:55 -0600 Subject: [PATCH 092/165] Trying to get the PATH setting correct for unit_python.xml. --- test/xml/unit_python.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/xml/unit_python.xml b/test/xml/unit_python.xml index 341a812fb5..6ed8dfa9d8 100644 --- a/test/xml/unit_python.xml +++ b/test/xml/unit_python.xml @@ -392,7 +392,7 @@ - export PATH=&ANACONDA_BIN;:${PATH}; \ + export PATH='&ANACONDA_BIN;:${PATH}'; \ &MET_BIN;/plot_data_plane MET_PYTHON_EXE &MET_PYTHON_EXE; From 1bafac051003e226ce86baa5dc60be69116a60d8 Mon Sep 17 00:00:00 2001 From: "Julie.Prestopnik" Date: Mon, 5 Apr 2021 09:49:59 -0600 Subject: [PATCH 093/165] Changed weblink for METplus documentation --- met/docs/Users_Guide/masking.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/met/docs/Users_Guide/masking.rst b/met/docs/Users_Guide/masking.rst index b052528e99..8181985f0b 100644 --- a/met/docs/Users_Guide/masking.rst +++ b/met/docs/Users_Guide/masking.rst @@ -164,4 +164,4 @@ In this example, the Gen-Vx-Mask tool will read the ASCII Lat/Lon file named **C Feature-Relative Methods ________________________ -This section contains a description of several methods that may be used to perform feature-relative (or event -based) evaluation. The methodology pertains to examining the environment surrounding a particular feature or event such as a tropical, extra-tropical cyclone, convective cell, snow-band, etc. Several approaches are available for these types of investigations including applying masking described above (e.g. circle or box) or using the “FORCE” interpolation method in the regrid configuration option (see :numref:`config_options`). These methods generally require additional scripting, including potentially storm-track identification, outside of MET to be paired with the features of the MET tools. METplus may be used to execute this type of analysis. Please refer to the `METplus User's Guide `__. +This section contains a description of several methods that may be used to perform feature-relative (or event -based) evaluation. The methodology pertains to examining the environment surrounding a particular feature or event such as a tropical, extra-tropical cyclone, convective cell, snow-band, etc. Several approaches are available for these types of investigations including applying masking described above (e.g. circle or box) or using the “FORCE” interpolation method in the regrid configuration option (see :numref:`config_options`). These methods generally require additional scripting, including potentially storm-track identification, outside of MET to be paired with the features of the MET tools. METplus may be used to execute this type of analysis. Please refer to the `METplus User's Guide `__. From 9a9bbc7ad50bcb95edf08de4612a987d0913329b Mon Sep 17 00:00:00 2001 From: George McCabe Date: Mon, 5 Apr 2021 13:32:08 -0600 Subject: [PATCH 094/165] per #1319 added netCDF4 python package to MET docker image so it is available for python embedding cases that use MET_PYTHON_EXE --- scripts/docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/docker/Dockerfile b/scripts/docker/Dockerfile index 9a80592f6b..330e0bbadd 100644 --- a/scripts/docker/Dockerfile +++ b/scripts/docker/Dockerfile @@ -53,7 +53,7 @@ RUN yum -y update \ && yum -y install gv ncview wgrib wgrib2 ImageMagick ps2pdf \ && yum -y install python3 python3-devel python3-pip \ && pip3 install --upgrade pip \ - && python3 -m pip install numpy xarray + && python3 -m pip install numpy xarray netCDF4 # # Set the working directory. From 1757cb1a139932a3e8157148e5b292c69e6247a8 Mon Sep 17 00:00:00 2001 From: johnhg Date: Mon, 5 Apr 2021 21:33:34 -0600 Subject: [PATCH 095/165] Feature 1747 pylonglong (#1748) * Per #1747, update MET to interpret longlong values as integers. NetCDF file attributes that have an LL suffix are read into python as numpy.int64 objects. Right now MET fails when trying to read those as integers. Update the parsing logic to interpret those as ints. * Per #1747, since MET can now interpret both long and longlong's as ints, there's no need to cast nx and ny to ints in the read_tmp_dataplane.py script anymore. * Per #1747, this is slightly unrelated. But after installing the netCDF4 module on kiowa for /usr/local/met-python3/bin/python3, we should no longer need a custom PATH setting to get unit_python.xml to work. Reverting the change I made to it a couple of days ago to get it working. --- met/data/wrappers/read_tmp_dataplane.py | 1 - met/src/libcode/vx_python3_utils/python3_dict.cc | 8 ++++++++ test/xml/unit_python.xml | 4 +--- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/met/data/wrappers/read_tmp_dataplane.py b/met/data/wrappers/read_tmp_dataplane.py index e21c17ba3f..c6f8f57a9c 100644 --- a/met/data/wrappers/read_tmp_dataplane.py +++ b/met/data/wrappers/read_tmp_dataplane.py @@ -27,7 +27,6 @@ grid[grid_attr] = attr_val else: met_attrs[attr] = attr_val -grid['nx'], grid['ny'] = int(grid['nx']), int(grid['ny']) met_attrs['grid'] = grid met_attrs['name'] = met_attrs['name_str'] del met_attrs['name_str'] diff --git a/met/src/libcode/vx_python3_utils/python3_dict.cc b/met/src/libcode/vx_python3_utils/python3_dict.cc index 6d38599aa4..99a0d5fc93 100644 --- a/met/src/libcode/vx_python3_utils/python3_dict.cc +++ b/met/src/libcode/vx_python3_utils/python3_dict.cc @@ -164,6 +164,14 @@ if ( ! a ) { } +// If not a Long, try interpreting as LongLong for numpy.int64 values + +if ( ! PyLong_Check(a) ) { + + a = PyLong_FromLongLong(PyLong_AsLongLong(a)); + +} + if ( ! PyLong_Check(a) ) { mlog << Error << "\nPython3_Dict::lookup_int(const char *) -> " diff --git a/test/xml/unit_python.xml b/test/xml/unit_python.xml index 6ed8dfa9d8..1c89950159 100644 --- a/test/xml/unit_python.xml +++ b/test/xml/unit_python.xml @@ -7,7 +7,6 @@ - @@ -392,8 +391,7 @@ - export PATH='&ANACONDA_BIN;:${PATH}'; \ - &MET_BIN;/plot_data_plane + &MET_BIN;/plot_data_plane MET_PYTHON_EXE &MET_PYTHON_EXE; From acf97fc54d22178993e13ed9e2acd81f6f52a9ae Mon Sep 17 00:00:00 2001 From: MET Tools Test Account Date: Tue, 6 Apr 2021 20:19:31 -0600 Subject: [PATCH 096/165] Hotfix for the develop branch in tc_pairs.cc. The METplus unit tests kept failing through GHA with a divide by zero error. It occurs in compute_track_err() but only for a very specific set of data. The bdeck valid increment evaluates to 0 which causes the divide by 0 error. It also can evaluate to bad data (e.g. -9999). The fix is to check for 0 and bad data. If found, use the constant best_track_time_step value instead. --- met/src/tools/tc_utils/tc_pairs/tc_pairs.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/met/src/tools/tc_utils/tc_pairs/tc_pairs.cc b/met/src/tools/tc_utils/tc_pairs/tc_pairs.cc index a86b1a3d49..6fd095d299 100644 --- a/met/src/tools/tc_utils/tc_pairs/tc_pairs.cc +++ b/met/src/tools/tc_utils/tc_pairs/tc_pairs.cc @@ -1740,7 +1740,7 @@ void compute_track_err(const TrackInfo &adeck, const TrackInfo &bdeck, NumArray &altk_err, NumArray &crtk_err) { int i, i_adeck, i_bdeck, status; unixtime ut, ut_min, ut_max; - int ut_inc, n_ut; + int bd_inc, ut_inc, n_ut; float alat[mxp], alon[mxp], blat[mxp], blon[mxp]; float crtk[mxp], altk[mxp]; double x, y, tk, lon_min, lon_max; @@ -1760,8 +1760,10 @@ void compute_track_err(const TrackInfo &adeck, const TrackInfo &bdeck, // Determine the valid increment // For BEST tracks, use a constant time step // For non-BEST tracks, select the most common BDECK time step - if(bdeck.is_best_track()) ut_inc = best_track_time_step; - else ut_inc = bdeck.valid_inc(); + // Check for 0 and bad data + bd_inc = bdeck.valid_inc(); + ut_inc = (bdeck.is_best_track() || bd_inc == 0 || is_bad_data(bd_inc) ? + best_track_time_step : bd_inc); // Round the valid times to the nearest valid increment if(ut_min%ut_inc != 0) ut_min = (ut_min/ut_inc + 1)*ut_inc; From c06e6da0153eca1e72801f06c26982a9bc2b5fd6 Mon Sep 17 00:00:00 2001 From: "Julie.Prestopnik" Date: Fri, 9 Apr 2021 13:50:25 -0600 Subject: [PATCH 097/165] Turned specific section numbers into linked sections because section numbers can change --- met/docs/Users_Guide/tc-gen.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/met/docs/Users_Guide/tc-gen.rst b/met/docs/Users_Guide/tc-gen.rst index 45bd9e7404..33b9a73d81 100644 --- a/met/docs/Users_Guide/tc-gen.rst +++ b/met/docs/Users_Guide/tc-gen.rst @@ -6,7 +6,9 @@ TC-Gen Tool Introduction ____________ -The TC-Gen tool provides verification of tropical cyclone genesis forecasts in ATCF file format. Producing reliable tropical cyclone genesis forecasts is an important metric for global numerical weather prediction models. This tool ingests deterministic model output post-processed by a genesis tracking software (e.g. GFDL vortex tracker) and ATCF format reference dataset(s) (e.g. Best Track analysis and CARQ operational tracks) and outputs categorical counts and statistics. The capability to modify the spatial and temporal tolerances that define a “hit” forecast is included to give users the ability to condition the criteria based on model performance and/or conduct sensitivity analyses. Statistical aspects are outlined in Section 21.2 and practical aspects of the TC-Gen tool are described in Section 21.3. +The TC-Gen tool provides verification of tropical cyclone genesis forecasts in ATCF file format. Producing reliable tropical cyclone genesis forecasts is an important metric for global numerical weather prediction models. This tool ingests deterministic model output post-processed by a genesis tracking software (e.g. GFDL vortex tracker) and ATCF format reference dataset(s) (e.g. Best Track analysis and CARQ operational tracks) and outputs categorical counts and statistics. The capability to modify the spatial and temporal tolerances that define a “hit” forecast is included to give users the ability to condition the criteria based on model performance and/or conduct sensitivity analyses. Statistical aspects are outlined in :numref:`tc-gen_stat_aspects` and practical aspects of the TC-Gen tool are described in :numref:`tc-gen_practical_info`. + +.. _tc-gen_stat_aspects: Statistical aspects ___________________ @@ -17,6 +19,8 @@ Other considerations for interpreting the output of the TC-Gen tool involve the Care should be taken when interpreting the statistics for filtered data. In some cases, variables (e.g. storm name) are only available in either the forecast or reference datasets, rather than both. When filtering on a field that is only present in one dataset, the contingency table counts will be impacted. Similarly, the initialization field only impacts the model forecast data. If the valid time (which will impact the reference dataset) isn't also specified, the forecasts will be filtered and matched such that the number of misses will erroneously increase. See section 21.3 for more detail. +.. _tc-gen_practical_info: + Practical information _____________________ From b92a6f65ebde567ad89015544cc982b4f2127a60 Mon Sep 17 00:00:00 2001 From: "Julie.Prestopnik" Date: Fri, 9 Apr 2021 13:59:42 -0600 Subject: [PATCH 098/165] Removed hard-coded references to section numbers --- met/docs/Users_Guide/tc-gen.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/met/docs/Users_Guide/tc-gen.rst b/met/docs/Users_Guide/tc-gen.rst index 33b9a73d81..90bf81ec86 100644 --- a/met/docs/Users_Guide/tc-gen.rst +++ b/met/docs/Users_Guide/tc-gen.rst @@ -17,7 +17,7 @@ The TC-Gen tool populates a contingency tables with hits, misses, and false alar Other considerations for interpreting the output of the TC-Gen tool involve the size of the contingency table output. The size of the contingency table will change depending on the number of matches. Additionally, the number of misses is based on the forecast duration and interval (specified in the configuration file). This change is due to the number of model opportunities to forecast the event, which is determined by the specified duration/interval. -Care should be taken when interpreting the statistics for filtered data. In some cases, variables (e.g. storm name) are only available in either the forecast or reference datasets, rather than both. When filtering on a field that is only present in one dataset, the contingency table counts will be impacted. Similarly, the initialization field only impacts the model forecast data. If the valid time (which will impact the reference dataset) isn't also specified, the forecasts will be filtered and matched such that the number of misses will erroneously increase. See section 21.3 for more detail. +Care should be taken when interpreting the statistics for filtered data. In some cases, variables (e.g. storm name) are only available in either the forecast or reference datasets, rather than both. When filtering on a field that is only present in one dataset, the contingency table counts will be impacted. Similarly, the initialization field only impacts the model forecast data. If the valid time (which will impact the reference dataset) isn't also specified, the forecasts will be filtered and matched such that the number of misses will erroneously increase. See :numref:`tc-gen_practical_info` for more detail. .. _tc-gen_practical_info: From 11866b3d663cf1268c5dfdef0aa13f926b53c5b0 Mon Sep 17 00:00:00 2001 From: johnhg Date: Fri, 9 Apr 2021 15:14:15 -0600 Subject: [PATCH 099/165] Feature 1714 tc_gen (#1750) * Per #1714, add tc_gen genesis_match_window configuration option to define a search window relative to the forecast genesis time. * Per #1714, clarify docs to state the genesis_match_window.end = 12 allows for matches for early forecasts. Also add an example of this option to the tc_gen unit test. * Per #1714, switch ops_hit_tdiff to ops_hit_window. * Per #1714, skip genesis events for tracks where the cyclone number is > 50. * Per #1714, only discard cyclone numbers > 50 from the Best track, not the forecast tracks. * Per #1716, add note to the tc_gen chapter about skipping Best tracks with cyclone number > 50. * Per #1714, adding genesis_match_point_to_track config file option for TC-Gen. Note that this version of the code is close but doesn't actually compile yet. I still need to figure out exactly how to process the operational tracks. Should this logic also apply to the matching for those tracks? * Per #1714, the logic for checking the operational tracks is pretty simple. We only store/check operational track points for lead time = 0. So applying the genesis_match_point_to_track boolean config option does not make sense. * Per #1714, update the tc-gen user's guide chapter to describe the updated logic and new config file option. * Per #1714, fix the logic of the is_match() function. * Per #1714, reconfigure the call to tc_gen to exercise the new genesis_match_track_to_point option. * Per #1714, just fixing spacing in source code. * Committing 2 small changes not specifically related to #1714, but related the processing of genesis tracks. When getting items from ATCFGenLines, the columns to be shifted are off by one. We had been shifting offset 2 up to 3, but it should have remained at 2. Also when initializing a TrackInfo object, set the StormID by calling ATCFLineBase::storm_id() instead of constructing it from BASIN:CYCLONE:YYYY. For ATCFGenLines we want to set the Storm ID equal to the 3rd column rather than constructing it! * Per #1714, fix an error in the logic of GenesisInfo::is_match(const GenesisInfo &,...). I was using the index of the current GenesisInfo object instead of the one from the input argument. Fix this by adding GenesisInfo::genesis() member function to return a reference the TrackPoint for Genesis. * Per #1714, correcting logic for parsing the storm_id and warning_time columns for ATCFGen and regular ATCF line types. For ATCFGen line types, the code was incorrectly using the 3rd column when it should have used the 4th column! Co-authored-by: John Halley Gotway --- met/data/config/TCGenConfig_default | 27 +++++- met/docs/Users_Guide/tc-gen.rst | 36 +++++-- met/src/basic/vx_config/config_constants.h | 4 +- met/src/libcode/vx_tc_util/atcf_line_base.cc | 16 +++- met/src/libcode/vx_tc_util/genesis_info.cc | 25 ++++- met/src/libcode/vx_tc_util/genesis_info.h | 14 +-- met/src/libcode/vx_tc_util/track_info.cc | 2 +- met/src/tools/tc_utils/tc_gen/tc_gen.cc | 95 +++++++++++++------ met/src/tools/tc_utils/tc_gen/tc_gen.h | 4 + .../tools/tc_utils/tc_gen/tc_gen_conf_info.cc | 28 ++++-- .../tools/tc_utils/tc_gen/tc_gen_conf_info.h | 14 +-- test/config/TCGenConfig_2016 | 40 +++++++- 12 files changed, 229 insertions(+), 76 deletions(-) diff --git a/met/data/config/TCGenConfig_default b/met/data/config/TCGenConfig_default index db38b1302b..1a135491f5 100644 --- a/met/data/config/TCGenConfig_default +++ b/met/data/config/TCGenConfig_default @@ -150,18 +150,34 @@ dland_thresh = NA; // //////////////////////////////////////////////////////////////////////////////// +// +// Genesis matching logic. Compare the forecast genesis point to all points in +// the Best track (TRUE) or the single Best track genesis point (FALSE). +// +genesis_match_point_to_track = TRUE; + // // Radius in km to search for a matching genesis event // genesis_match_radius = 500; +// +// Time window in hours, relative to the model genesis time, to search for a +// matching Best track point +// +genesis_match_window = { + beg = 0; + end = 0; +} + // // Radius in km for a development scoring method hit // dev_hit_radius = 500; // -// Time window in hours for a development scoring method hit +// Time window in hours, relative to the model genesis time, for a development +// scoring method hit // dev_hit_window = { beg = -24; @@ -169,10 +185,13 @@ dev_hit_window = { } // -// Maximum Best track genesis minus model initialization time difference for an -// operational scoring method hit +// Time window in hours for the Best track genesis minus model initialization +// time difference for an operational scoring method hit // -ops_hit_tdiff = 48; +ops_hit_window = { + beg = 0; + end = 48; +} // // Discard genesis forecasts for initializations at or after the matching diff --git a/met/docs/Users_Guide/tc-gen.rst b/met/docs/Users_Guide/tc-gen.rst index 90bf81ec86..763c5663b4 100644 --- a/met/docs/Users_Guide/tc-gen.rst +++ b/met/docs/Users_Guide/tc-gen.rst @@ -65,15 +65,15 @@ The TC-Gen tool implements the following logic: * Parse the forecast genesis data and identify forecast genesis events separately for each model present. -* Parse the Best and operational track data, and identify Best track genesis events. +* Parse the Best and operational track data, and identify Best track genesis events. Note that Best tracks with a cyclone number greater than 50 are automatically discarded from the analysis. Large cyclone numbers are used for pre-season testing or to track invests prior to a storm actually forming. Running this tool at verbosity level 6 (-v 6) prints details about which tracks are discarded. * Loop over the filters defined in the configuration file and apply the following logic for each. * For each Best track genesis event meeting the filter critera, determine the initialization and lead times for which the model had an opportunity to forecast that genesis event. Store an unmatched genesis pair for each case. - * For each forecast genesis event, search for a matching Best track. A Best track matches if the valid time of one of its track points matches the forecast genesis time and is within a configurable radius of the forecast genesis location. If a Best track match is found, store the storm ID. + * For each forecast genesis event, search for a matching Best track. A configurable boolean option controls whether all Best track points are considered for a match or only the single Best track genesis point. A match occurs if the Best track point valid time is within a configurable window around the forecast genesis time and the Best track point location is within a configurable radius of the forecast genesis location. If a Best track match is found, store the storm ID. - * In no Best track match is found, apply the same logic to search the 0-hour operational track points. If an operational match is found, store the storm ID. + * In no Best track match is found, apply the same logic to search the operational track points with lead time of 0 hours. If an operational match is found, store the storm ID. * If a matching storm ID is found, match the forecast genesis event to the Best track genesis event for that storm ID. @@ -255,11 +255,30 @@ The **dland_thresh** entry is a threshold defining whether the genesis event sho ______________________ +.. code-block:: none + + genesis_match_point_to_track = TRUE; + +The **genesis_match_point_to_track** entry is a boolean which controls the matching logic. When set to its default value of TRUE, for each forecast genesis event, all Best track points are searched for a match. This logic implements the method used by the NOAA National Hurricane Center. When set to FALSE, only the single Best track genesis point is considered for a match. When selecting FALSE, users are encouraged to adjust the **genesis_match_radius** and/or **gensesis_match_window** options, described below, to enable matches to be found. + +______________________ + .. code-block:: none genesis_match_radius = 500; -The **genesis_match_radius** entry defines a search radius, in km, relative to the forecast genesis location. When searching for a match, only those Best genesis events which occur within this radius will be considered. Increasing this search radius should lead to an increase in the number of matched genesis pairs. +The **genesis_match_radius** entry defines a search radius, in km, relative to the forecast genesis location. When searching for a match, only Best or operational tracks with a track point within this radius will be considered. Increasing this search radius should lead to an increase in the number of matched genesis pairs. + +______________________ + +.. code-block:: none + + genesis_match_window = { + beg = 0; + end = 0; + } + +The **genesis_match_window** entry defines a time window, in hours, relative to the forecast genesis time. When searching for a match, only Best or operational tracks with a track point falling within this time window will be considered. The default time window of 0 requires a Best or operational track to exist at the forecast genesis time for a match to be found. Increasing this time window should lead to an increase in the number matched genesis pairs. For example, setting *end = 12;* would allow forecast genesis events to match Best tracks up to 12 hours prior to their existence. ______________________ @@ -278,15 +297,18 @@ ______________________ end = 24; } -The **dev_hit_window** entry defines a time window, in hours, relative to the forecast genesis time. The Best track genesis event must occur within this time window for the pair to be counted as contingency table HIT for the development scoring method. Tightening this window may cause development method HITS to become FALSE ALARMS. +The **dev_hit_window** entry defines a time window, in hours, relative to the forecast genesis time. The Best track genesis event must occur within this time window for the pair to be counted as a contingency table HIT for the development scoring method. Tightening this window may cause development method HITS to become FALSE ALARMS. ______________________ .. code-block:: none - ops_hit_tdiff = 48; + ops_hit_window = { + beg = 0; + end = 48; + } -The **ops_hit_tdiff** entry is an integer which defines a maximum allowable time difference in hours. For each matching forecast and Best track genesis event, if the difference between the Best track genesis time and the forecast initialization time is less than or equal to this value, then the pair is counted as a contingency table HIT for the operational scoring method. Otherwise, it is counted as a FALSE ALARM. +The **ops_hit_window** entry defines a time window, in hours, relative to the Best track genesis time. The model initialization time for the forecast genesis event must occur within this time window for the pairs to be counted as a contingency table HIT for the operationl scoring method. Otherwise, the pair is counted as a FALSE ALARM. ______________________ diff --git a/met/src/basic/vx_config/config_constants.h b/met/src/basic/vx_config/config_constants.h index bc82d55625..a6431fca54 100644 --- a/met/src/basic/vx_config/config_constants.h +++ b/met/src/basic/vx_config/config_constants.h @@ -1076,10 +1076,12 @@ static const char conf_key_category[] = "category"; static const char conf_key_vmax_thresh[] = "vmax_thresh"; static const char conf_key_mslp_thresh[] = "mslp_thresh"; static const char conf_key_basin_mask[] = "basin_mask"; +static const char conf_key_genesis_match_point_to_track[] = "genesis_match_point_to_track"; static const char conf_key_genesis_match_radius[] = "genesis_match_radius"; +static const char conf_key_genesis_match_window[] = "genesis_match_window"; static const char conf_key_dev_hit_radius[] = "dev_hit_radius"; static const char conf_key_dev_hit_window[] = "dev_hit_window"; -static const char conf_key_ops_hit_tdiff[] = "ops_hit_tdiff"; +static const char conf_key_ops_hit_window[] = "ops_hit_window"; static const char conf_key_discard_init_post_genesis_flag[] = "discard_init_post_genesis_flag"; static const char conf_key_dev_method_flag[] = "dev_method_flag"; static const char conf_key_ops_method_flag[] = "ops_method_flag"; diff --git a/met/src/libcode/vx_tc_util/atcf_line_base.cc b/met/src/libcode/vx_tc_util/atcf_line_base.cc index 5ae638f44f..aa970dc117 100644 --- a/met/src/libcode/vx_tc_util/atcf_line_base.cc +++ b/met/src/libcode/vx_tc_util/atcf_line_base.cc @@ -211,9 +211,12 @@ ConcatString ATCFLineBase::get_item(int i) const { int i_col = i; // For ATCFLineType_GenTrack: - // Columns 1 and 2 are consistent, use offsets 0 and 1 - // Columns 4-20 are the same as columns 3-19 of ATCFLineType_Track - // Shift those column indices by 1. + // Columns 1 and 2 are consistent: + // Use offsets 0 and 1 + // Column 3 for is an EXTRA column for this line type: + // Add special handling in storm_id() + // Columns 4-20 are the same as columns 3-19 of ATCFLineType_Track: + // Shift those column indices by 1. if(Type == ATCFLineType_GenTrack && i >= 2 && i <= 18) i_col++; cs = DataLine::get_item(i_col); @@ -252,7 +255,8 @@ ConcatString ATCFLineBase::basin() const { //////////////////////////////////////////////////////////////////////// ConcatString ATCFLineBase::cyclone_number() const { - return(get_item(CycloneNumberOffset)); } + return(get_item(CycloneNumberOffset)); +} //////////////////////////////////////////////////////////////////////// @@ -357,8 +361,10 @@ int ATCFLineBase::lead() const { ConcatString ATCFLineBase::storm_id() const { ConcatString cs; + // For ATCFLineType_GenTrack, use the contents of the extra 3rd column + // Call DataLine::get_item() to avoid the column shifting logic if(Type == ATCFLineType_GenTrack) { - cs = get_item(GenStormIdOffset); + cs = DataLine::get_item(GenStormIdOffset); } else { unixtime ut = valid(); diff --git a/met/src/libcode/vx_tc_util/genesis_info.cc b/met/src/libcode/vx_tc_util/genesis_info.cc index 8cc5ea36d9..91c708ff82 100644 --- a/met/src/libcode/vx_tc_util/genesis_info.cc +++ b/met/src/libcode/vx_tc_util/genesis_info.cc @@ -259,6 +259,7 @@ void GenesisInfo::set_dland(double d) { bool GenesisInfo::set(const TrackInfo &ti, const GenesisEventInfo &event_info) { + // Initialize clear(); @@ -298,14 +299,32 @@ int GenesisInfo::genesis_fhr() const { //////////////////////////////////////////////////////////////////////// -bool GenesisInfo::is_match(const TrackPoint &p, - const double rad) const { +const TrackPoint * GenesisInfo::genesis() const { + return(is_bad_data(GenesisIndex) ? 0 : &(Point[GenesisIndex])); +} + +//////////////////////////////////////////////////////////////////////// + +bool GenesisInfo::is_match(const TrackPoint &p, const double rad, + const int beg, const int end) const { // Check for matching in time and space - return(GenesisTime == p.valid() && + return(p.valid() >= (GenesisTime + beg) && + p.valid() <= (GenesisTime + end) && gc_dist(Lat, Lon, p.lat(), p.lon()) <= rad); } +//////////////////////////////////////////////////////////////////////// + +bool GenesisInfo::is_match(const GenesisInfo &gi, const double rad, + const int beg, const int end) const { + + // Input genesis point + const TrackPoint *p = gi.genesis(); + + return(p ? is_match(*p, rad, beg, end) : false); +} + //////////////////////////////////////////////////////////////////////// // // Code for class GenesisInfoArray diff --git a/met/src/libcode/vx_tc_util/genesis_info.h b/met/src/libcode/vx_tc_util/genesis_info.h index bc4a511020..9ef8afb742 100644 --- a/met/src/libcode/vx_tc_util/genesis_info.h +++ b/met/src/libcode/vx_tc_util/genesis_info.h @@ -55,11 +55,8 @@ class GenesisInfo : public TrackInfo { bool IsSet; - // TrackInfo for this Genesis event - TrackInfo Track; - int GenesisIndex; - // Genesis Information + int GenesisIndex; unixtime GenesisTime; int GenesisLead; double Lat; @@ -93,6 +90,8 @@ class GenesisInfo : public TrackInfo { // get stuff // + const TrackPoint *genesis() const; + double lat() const; double lon() const; double dland() const; @@ -105,7 +104,11 @@ class GenesisInfo : public TrackInfo { // bool is_match(const TrackPoint &, - const double) const; + const double, + const int, const int) const; + bool is_match(const GenesisInfo &, + const double, + const int, const int) const; }; //////////////////////////////////////////////////////////////////////// @@ -161,7 +164,6 @@ class GenesisInfoArray { const GenesisInfo & operator[](int) const; int n() const; int n_technique() const; - }; //////////////////////////////////////////////////////////////////////// diff --git a/met/src/libcode/vx_tc_util/track_info.cc b/met/src/libcode/vx_tc_util/track_info.cc index 312d9aa620..215f0c3b38 100644 --- a/met/src/libcode/vx_tc_util/track_info.cc +++ b/met/src/libcode/vx_tc_util/track_info.cc @@ -299,7 +299,7 @@ void TrackInfo::initialize(const ATCFTrackLine &l, bool check_anly) { MinValidTime = MaxValidTime = l.valid(); // Create the storm id - set_storm_id(); + set_storm_id(l.storm_id().c_str()); return; } diff --git a/met/src/tools/tc_utils/tc_gen/tc_gen.cc b/met/src/tools/tc_utils/tc_gen/tc_gen.cc index f3b614960c..743db7fd44 100644 --- a/met/src/tools/tc_utils/tc_gen/tc_gen.cc +++ b/met/src/tools/tc_utils/tc_gen/tc_gen.cc @@ -19,6 +19,7 @@ // 002 12/15/20 Halley Gotway Matching logic for MET #1448 // 003 12/31/20 Halley Gotway Add NetCDF output for MET #1430 // 004 01/14/21 Halley Gotway Add GENMPR output for MET #1597 +// 005 04/02/21 Halley Gotway Refinements for MET #1714 // //////////////////////////////////////////////////////////////////////// @@ -82,7 +83,7 @@ static void do_genesis_ctc (const TCGenVxOpt &, static int find_genesis_match (const GenesisInfo &, const GenesisInfoArray &, const TrackInfoArray &, - double); + bool, double, int, int); static void setup_txt_files (int, int); static void setup_table (AsciiTable &); @@ -370,14 +371,17 @@ void get_genesis_pairs(const TCGenVxOpt &vx_opt, conf_info.InitFreqHr*sec_per_hour, vx_opt.InitBeg, vx_opt.InitEnd, vx_opt.InitInc, vx_opt.InitExc); - } + } // end for i bga // Loop over the model genesis events looking for pairs. for(i=0; igenesis_time() - fgi->init(); offset_cs << cs_erase << "with an init vs genesis time offset of " << diff.OpsDSec/sec_per_hour << " hours.\n"; - if(diff.OpsDSec <= vx_opt.OpsHitDSec) { + // Ops Method: + // HIT if forecast init time is close enough to + // the BEST genesis time. + if(diff.OpsDSec >= vx_opt.OpsHitBeg && + diff.OpsDSec <= vx_opt.OpsHitEnd) { mlog << Debug(4) << case_cs << " is an ops method HIT " << offset_cs; @@ -591,10 +595,9 @@ void do_genesis_ctc(const TCGenVxOpt &vx_opt, int find_genesis_match(const GenesisInfo &fcst_gi, const GenesisInfoArray &bga, const TrackInfoArray &ota, - const double rad) { - int i, j; - int i_best = bad_data_int; - int i_oper = bad_data_int; + bool point2track, double rad, + int beg, int end) { + int i, j, i_best, i_oper; ConcatString case_cs; case_cs << fcst_gi.technique() << " " @@ -605,20 +608,36 @@ int find_genesis_match(const GenesisInfo &fcst_gi, << " forecast genesis at (" << fcst_gi.lat() << ", " << fcst_gi.lon() << ")"; - // Search the BEST track points for a match + // Search for a BEST track genesis match for(i=0, i_best=bad_data_int; i conf_info.FcstSecEnd) { - mlog << Debug(6) << "Skipping genesis event for forecast hour " - << fcst_gi.genesis_fhr() << ".\n"; + mlog << Debug(6) + << "Skipping forecast genesis event for forecast hour " + << fcst_gi.genesis_fhr() << " not between " + << conf_info.FcstSecBeg/sec_per_hour << " and " + << conf_info.FcstSecEnd/sec_per_hour << ".\n"; continue; } // Check the forecast track minimum duration if(fcst_gi.duration() < conf_info.MinDur*sec_per_hour) { - mlog << Debug(6) << "Skipping genesis event for track duration of " - << fcst_gi.duration()/sec_per_hour << ".\n"; + mlog << Debug(6) + << "Skipping forecast genesis event for track duration of " + << fcst_gi.duration()/sec_per_hour << " < " + << conf_info.MinDur << ".\n"; continue; } @@ -899,6 +925,15 @@ void process_best_tracks(const StringArray &files, continue; } + // Skip invest tracks with a large cyclone number + if(atof(best_ta[i].cyclone().c_str()) > max_best_cyclone_number) { + mlog << Debug(6) + << "Skipping Best track genesis event for cyclone number " + << best_ta[i].cyclone() << " > " << max_best_cyclone_number + << ".\n"; + continue; + } + // Check for duplicates if(best_ga.has_storm(best_gi, i_bga)) { diff --git a/met/src/tools/tc_utils/tc_gen/tc_gen.h b/met/src/tools/tc_utils/tc_gen/tc_gen.h index 3d6ff17e9c..10118842c6 100644 --- a/met/src/tools/tc_utils/tc_gen/tc_gen.h +++ b/met/src/tools/tc_utils/tc_gen/tc_gen.h @@ -77,6 +77,10 @@ const ConcatString genesis_name ("GENESIS"); const ConcatString genesis_dev_name("GENESIS_DEV"); const ConcatString genesis_ops_name("GENESIS_OPS"); +// Maximum Best track cyclone number to be processed +// Cyclone numbers > 50 are for testing or invests +static const int max_best_cyclone_number = 50; + //////////////////////////////////////////////////////////////////////// // // Variables for Command Line Arguments diff --git a/met/src/tools/tc_utils/tc_gen/tc_gen_conf_info.cc b/met/src/tools/tc_utils/tc_gen/tc_gen_conf_info.cc index cdab8c11da..e2046c0c13 100644 --- a/met/src/tools/tc_utils/tc_gen/tc_gen_conf_info.cc +++ b/met/src/tools/tc_utils/tc_gen/tc_gen_conf_info.cc @@ -156,10 +156,12 @@ void TCGenVxOpt::clear() { VxBasinMask.clear(); VxAreaMask.clear(); DLandThresh.clear(); + GenesisMatchPointTrack = false; GenesisMatchRadius = bad_data_double; + GenesisMatchBeg = GenesisMatchEnd = bad_data_int; DevHitRadius = bad_data_double; DevHitBeg = DevHitEnd = bad_data_int; - OpsHitDSec = bad_data_int; + OpsHitBeg = OpsHitEnd = bad_data_int; DiscardFlag = false; DevFlag = OpsFlag = false; CIAlpha = bad_data_double; @@ -242,24 +244,34 @@ void TCGenVxOpt::process_config(Dictionary &dict) { // Conf: dland_thresh DLandThresh = dict.lookup_thresh(conf_key_dland_thresh); + // Conf: genesis_match_point_to_track + GenesisMatchPointTrack = + dict.lookup_bool(conf_key_genesis_match_point_to_track); + // Conf: genesis_match_radius GenesisMatchRadius = dict.lookup_double(conf_key_genesis_match_radius); + // Conf: genesis_match_window + dict2 = dict.lookup_dictionary(conf_key_genesis_match_window); + parse_conf_range_int(dict2, beg, end); + GenesisMatchBeg = beg*sec_per_hour; + GenesisMatchEnd = end*sec_per_hour; + // Conf: dev_hit_radius - DevHitRadius = - dict.lookup_double(conf_key_dev_hit_radius); + DevHitRadius = dict.lookup_double(conf_key_dev_hit_radius); - // Conf: genesis_hit_window + // Conf: dev_hit_window dict2 = dict.lookup_dictionary(conf_key_dev_hit_window); parse_conf_range_int(dict2, beg, end); DevHitBeg = beg*sec_per_hour; DevHitEnd = end*sec_per_hour; - // Conf: ops_hit_tdiff - OpsHitDSec = nint( - dict.lookup_double(conf_key_ops_hit_tdiff) * - sec_per_hour); + // Conf: ops_hit_window + dict2 = dict.lookup_dictionary(conf_key_ops_hit_window); + parse_conf_range_int(dict2, beg, end); + OpsHitBeg = beg*sec_per_hour; + OpsHitEnd = end*sec_per_hour; // Conf: discard_init_post_genesis_flag DiscardFlag = diff --git a/met/src/tools/tc_utils/tc_gen/tc_gen_conf_info.h b/met/src/tools/tc_utils/tc_gen/tc_gen_conf_info.h index de7d14c1d9..0769f64f8f 100644 --- a/met/src/tools/tc_utils/tc_gen/tc_gen_conf_info.h +++ b/met/src/tools/tc_utils/tc_gen/tc_gen_conf_info.h @@ -131,16 +131,18 @@ class TCGenVxOpt { // Distance to land threshold SingleThresh DLandThresh; + // Matching logic + bool GenesisMatchPointTrack; + // Temporal and spatial matching criteria double GenesisMatchRadius; + int GenesisMatchBeg, GenesisMatchEnd; + + // Temporal and spatial scoring options double DevHitRadius; int DevHitBeg, DevHitEnd; - int OpsHitDSec; - - // Scoring methods - bool DiscardFlag; - bool DevFlag; - bool OpsFlag; + int OpsHitBeg, OpsHitEnd; + bool DiscardFlag, DevFlag, OpsFlag; // Output file options double CIAlpha; diff --git a/test/config/TCGenConfig_2016 b/test/config/TCGenConfig_2016 index 6d46d9f528..28ec263e85 100644 --- a/test/config/TCGenConfig_2016 +++ b/test/config/TCGenConfig_2016 @@ -90,6 +90,17 @@ filter = [ nc_pairs_flag = TRUE; output_flag = { genmpr = BOTH; } }, + { + desc = "AL_MATCH24HR"; + basin_mask = "AL"; + genesis_match_window = { beg = 0; end = 24; }; + }, + { + desc = "AL_POINT2POINT"; + basin_mask = "AL"; + genesis_match_window = { beg = 0; end = 24; }; + genesis_match_point_to_track = FALSE; + }, { desc = "AL_DLAND_300NM"; basin_mask = "AL"; @@ -119,7 +130,7 @@ filter = [ { desc = "ALL_MATCH_600KM_OPS60HR"; genesis_match_radius = 600; - ops_hit_tdiff = 60; + ops_hit_window = { beg = -60; end = 60; }; dev_method_flag = FALSE; ops_method_flag = TRUE; } @@ -193,18 +204,34 @@ dland_thresh = NA; // //////////////////////////////////////////////////////////////////////////////// +// +// Genesis matching logic. Compare the forecast genesis point to all points in +// the Best track (TRUE) or the single Best track genesis point (FALSE). +// +genesis_match_point_to_track = TRUE; + // // Radius in km to search for a matching genesis event // genesis_match_radius = 500; +// +// Time window in hours, relative to the model genesis time, to search for a +// matching Best track point +// +genesis_match_window = { + beg = 0; + end = 0; +} + // // Radius in km for a development scoring method hit // dev_hit_radius = 500; // -// Time window in hours for a development scoring method hit +// Time window in hours, relative to the model genesis time, for a development +// scoring method hit // dev_hit_window = { beg = -24; @@ -212,10 +239,13 @@ dev_hit_window = { } // -// Maximum Best track genesis minus model initialization time difference for an -// operational scoring method hit +// Time window in hours for the Best track genesis minus model initialization +// time difference for an operational scoring method hit // -ops_hit_tdiff = 48; +ops_hit_window = { + beg = 0; + end = 48; +} // // Discard genesis forecasts for initializations at or after the matching From a2bad6c9619924690af32fc50327eb512d609384 Mon Sep 17 00:00:00 2001 From: jprestop Date: Wed, 14 Apr 2021 15:04:45 -0600 Subject: [PATCH 100/165] feature_1552_gcc_10 (#1752) * Cleaned bash comparison operators; Made changes for MET to compile using GNU 10.1.0 compilers * Updated documentation for new flag for BUFRLIB compilation --- met/docs/Users_Guide/installation.rst | 2 +- scripts/installation/compile_MET_all.sh | 42 ++++++++++++------- .../config/install_met_env.cheyenne_gcc | 29 +++++++++++++ 3 files changed, 56 insertions(+), 17 deletions(-) create mode 100644 scripts/installation/config/install_met_env.cheyenne_gcc diff --git a/met/docs/Users_Guide/installation.rst b/met/docs/Users_Guide/installation.rst index d654119717..013cd4d384 100644 --- a/met/docs/Users_Guide/installation.rst +++ b/met/docs/Users_Guide/installation.rst @@ -69,7 +69,7 @@ NCEP's BUFRLIB is used by the MET to decode point-based observation datasets in .. code-block:: none gcc -c -DUNDERSCORE `./getdefflags_C.sh` *.c >> make.log - gfortran -c -fno-second-underscore `./getdefflags_F.sh` modv*.F moda*.F \ + gfortran -c -fno-second-underscore -fallow-argument-mismatch `./getdefflags_F.sh` modv*.F moda*.F \ `ls -1 *.F *.f | grep -v "mod[av]_"` >> make.log ar crv libbufr.a *.o diff --git a/scripts/installation/compile_MET_all.sh b/scripts/installation/compile_MET_all.sh index 59e3eb649e..5ef855cb24 100755 --- a/scripts/installation/compile_MET_all.sh +++ b/scripts/installation/compile_MET_all.sh @@ -68,7 +68,7 @@ export LD_LIBRARY_PATH=${TEST_BASE}/external_libs/lib:${MET_PYTHON}/lib:${MET_NE echo "LD_LIBRARY_PATH = ${LD_LIBRARY_PATH}" # Constants -if [ -z ${MET_GRIB2CLIB} ]; then +if [ [ -z ${MET_GRIB2CLIB} && -z ${MET_GRIB2CINC} ] ]; then COMPILE_ZLIB=1 COMPILE_LIBPNG=1 COMPILE_JASPER=1 @@ -128,18 +128,18 @@ COMPILER_VERSION=`echo $COMPILER | cut -d'_' -f2` echo "USE_MODULES = ${USE_MODULES}" -if [ ${USE_MODULES} == "TRUE" ]; then +if [ ${USE_MODULES} = "TRUE" ]; then echo "module load ${COMPILER_FAMILY}/${COMPILER_VERSION}" echo ${COMPILER_FAMILY}/${COMPILER_VERSION} module load ${COMPILER_FAMILY}/${COMPILER_VERSION} - if [ ${COMPILER_FAMILY} == "PrgEnv-intel" ]; then + if [ ${COMPILER_FAMILY} = "PrgEnv-intel" ]; then module load craype module switch craype craype-sandybridge fi fi -if [ ${COMPILER_FAMILY} == "gnu" ]; then +if [ ${COMPILER_FAMILY} = "gnu" ]; then if [ -z ${CC} ]; then export CC=`which gcc` else @@ -165,7 +165,7 @@ if [ ${COMPILER_FAMILY} == "gnu" ]; then else export F90=${F90} fi -elif [ ${COMPILER_FAMILY} == "pgi" ]; then +elif [ ${COMPILER_FAMILY} = "pgi" ]; then if [ -z ${CC} ]; then export CC=`which pgcc` else @@ -225,7 +225,7 @@ echo "export F90=${F90}" # Load Python module -if [ ${USE_MODULES} == "TRUE" ]; then +if [ ${USE_MODULES} = "TRUE" ]; then if [ ! -z ${PYTHON_MODULE} ]; then PYTHON_NAME=` echo $PYTHON_MODULE | cut -d'_' -f1` PYTHON_VERSION_NUM=`echo $PYTHON_MODULE | cut -d'_' -f2` @@ -241,7 +241,7 @@ python --version # Compile GSL if [ $COMPILE_GSL -eq 1 ]; then - if [ ${COMPILER_FAMILY} == "pgi" ]; then + if [ ${COMPILER_FAMILY} = "pgi" ]; then vrs="1.11"; else vrs="2.1"; @@ -295,8 +295,8 @@ if [ $COMPILE_BUFRLIB -eq 1 ]; then # For GNU and Intel follow BUFRLIB11 instructions if [[ ${COMPILER_FAMILY} == "gnu" ]]; then - ${FC} -c -fno-second-underscore `./getdefflags_F.sh` modv*.F moda*.F `ls -1 *.F *.f | grep -v "mod[av]_"` >> make.log 2>&1 - elif [[ ${COMPILER_FAMILY} == "intel" ]] || [[ ${COMPILER_FAMILY} == "ics" ]] || [[ ${COMPILER_FAMILY} == "ips" ]] || [[ ${COMPILER_FAMILY} == "ips" ]] || [[ ${COMPILER_FAMILY} == "PrgEnv-intel" ]]; then + ${FC} -c -fno-second-underscore -fallow-argument-mismatch `./getdefflags_F.sh` modv*.F moda*.F `ls -1 *.F *.f | grep -v "mod[av]_"` >> make.log 2>&1 + elif [[ ${COMPILER_FAMILY} == "intel" ]] || [[ ${COMPILER_FAMILY} == "ics" ]] || [[ ${COMPILER_FAMILY} == "ips" ]] || [[ ${COMPILER_FAMILY} == "ips" ]] || [[ ${COMPILER_FAMILY} == "PrgEnv-intel" ]]; then ${FC} -c `./getdefflags_F.sh` modv*.F moda*.F `ls -1 *.F *.f | grep -v "mod[av]_"` >> make.log 2>&1 elif [[ ${COMPILER_FAMILY} == "pgi" ]]; then ${FC} -c -Mnosecond_underscore `./getdefflags_F.sh` modv*.F moda*.F `ls -1 *.F *.f | grep -v "mod[av]_"` >> make.log 2>&1 @@ -460,8 +460,14 @@ if [ $COMPILE_HDF -eq 1 ]; then echo "configure returned with non-zero ($ret) status" exit 1 fi - cat mfhdf/hdiff/Makefile | sed 's/LIBS = -ljpeg -lz/LIBS = -ljpeg -lz -lm/g' > Makefile_NEW - mv Makefile_NEW mfhdf/hdiff/Makefile + cat mfhdf/hdiff/Makefile | \ + sed 's/LIBS = -ljpeg -lz/LIBS = -ljpeg -lz -lm/g' \ + > Makefile_new + mv Makefile_new mfhdf/hdiff/Makefile + cat hdf/src/Makefile | \ + sed 's/FFLAGS = -O2/FFLAGS = -w -fallow-argument-mismatch -O2/g' \ + > Makefile_new + mv Makefile_new hdf/src/Makefile echo "make > make.log 2>&1" make > make.log 2>&1 ret=$? @@ -624,7 +630,7 @@ fi if [ $COMPILE_CAIRO -eq 1 ]; then # If on Cray, compile PIXMAN - if [ ${COMPILER_FAMILY} == "PrgEnv-intel" ]; then + if [ ${COMPILER_FAMILY} = "PrgEnv-intel" ]; then echo echo "Compiling pixman at `date`" mkdir -p ${LIB_DIR}/pixman @@ -664,7 +670,7 @@ if [ $COMPILE_CAIRO -eq 1 ]; then tar -xf ${TAR_DIR}/cairo*.tar* cd cairo* export PKG_CONFIG=`which pkg-config` - if [ ${COMPILER_FAMILY} == "PrgEnv-intel" ]; then + if [ ${COMPILER_FAMILY} = "PrgEnv-intel" ]; then export PKG_CONFIG_PATH=${LIB_DIR}/lib/pkgconfig/ fi echo "cd `pwd`" @@ -699,7 +705,7 @@ if [ $COMPILE_MET -eq 1 ]; then cd ${MET_DIR} # If using source from a tar file remove everything and unpack the tar file # FALSE = compiling from github repo and we don't want to overwrite the files - if [ ${USE_MET_TAR_FILE} == "TRUE" ]; then + if [ ${USE_MET_TAR_FILE} = "TRUE" ]; then rm -rf met* tar -xzf ${MET_TARBALL} fi @@ -712,7 +718,11 @@ if [ $COMPILE_MET -eq 1 ]; then fi if [ -z ${MET_GRIB2CLIB} ]; then - export MET_GRIB2C=${LIB_DIR} + export MET_GRIB2CLIB=${LIB_DIR}/lib + export MET_GRIB2CINC=${LIB_DIR}/include + export LIB_JASPER=${LIB_DIR}/lib + export LIB_LIBPNG=${LIB_DIR}/lib + export LIB_Z=${LIB_DIR}/lib else export MET_GRIB2CLIB=${MET_GRIB2CLIB} export MET_GRIB2CINC=${MET_GRIB2CINC} @@ -744,7 +754,7 @@ if [ $COMPILE_MET -eq 1 ]; then export LIBS="${LIBS} -lhdf5_hl -lhdf5 -lz" export MET_FONT_DIR=${TEST_BASE}/fonts - if [ ${SET_D64BIT} == "TRUE" ]; then + if [ ${SET_D64BIT} = "TRUE" ]; then export CFLAGS="-D__64BIT__" export CXXFLAGS="-D__64BIT__" fi diff --git a/scripts/installation/config/install_met_env.cheyenne_gcc b/scripts/installation/config/install_met_env.cheyenne_gcc new file mode 100644 index 0000000000..57e013ebd2 --- /dev/null +++ b/scripts/installation/config/install_met_env.cheyenne_gcc @@ -0,0 +1,29 @@ +module load ncarenv/1.3 +module load gnu/10.1.0 +module load python/3.7.9 +module load netcdf/4.7.4 +ncar_pylib + +export TEST_BASE=/glade/p/ral/jntp/MET/MET_cross_platform_testing/met-10.0.0-beta4/gcc +export COMPILER=gnu_10.1.0 +export MET_SUBDIR=${TEST_BASE} +export MET_TARBALL=met-10.0.0-beta4.20210302.tar.gz +export USE_MODULES=TRUE +export MET_PYTHON=/glade/u/apps/ch/opt/python/3.7.9/gnu/9.1.0 +export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.7m +export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.7m\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm +export MET_NETCDF=/glade/u/apps/ch/opt/netcdf/4.7.4/gnu/10.1.0/ +export EXTERNAL_LIBS=/glade/p/ral/jntp/MET/MET_cross_platform_testing/met-10.0.0-beta4/gcc/external_libs/ +export MET_GSL=${EXTERNAL_LIBS} +export MET_BUFRLIB=${EXTERNAL_LIBS} +export BUFRLIB_NAME=-lbufr +export MET_HDF5=/glade/u/apps/ch/opt/netcdf/4.7.4/gnu/10.1.0/ +export MET_GRIB2CLIBS=${EXTERNAL_LIBS}/lib +export MET_GRIB2CINC=${EXTERNAL_LIBS}/include +export GRIB2CLIB_NAME=-lgrib2c +export LIB_JASPER=${EXTERNAL_LIBS}/lib +export LIB_LIBPNG=${EXTERNAL_LIBS}/lib +export LIB_Z=${EXTERNAL_LIBS}/lib +#export SET_D64BIT=FALSE +export CFLAGS="-Wall -g" +export CXXFLAGS="-Wall -g" From aa02a0e22caf2d352a7225f0df19783754b4fae0 Mon Sep 17 00:00:00 2001 From: Howard Soh Date: Thu, 15 Apr 2021 08:46:11 -0600 Subject: [PATCH 101/165] #1755 Support time string for slicing at MetNcCFDataFile::collect_time_offsets --- met/src/libcode/vx_data2d_nccf/data2d_nccf.cc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/met/src/libcode/vx_data2d_nccf/data2d_nccf.cc b/met/src/libcode/vx_data2d_nccf/data2d_nccf.cc index 6709845101..56e853a63c 100644 --- a/met/src/libcode/vx_data2d_nccf/data2d_nccf.cc +++ b/met/src/libcode/vx_data2d_nccf/data2d_nccf.cc @@ -469,13 +469,18 @@ LongArray MetNcCFDataFile::collect_time_offsets(VarInfo &vinfo) { } } } + else if (time_as_value) { + idx = convert_time_to_offset(dim_offset); + if (0 <= idx && idx < time_dim_size) time_offsets.add(idx); + } else if (0 <= time_dim_slot && dim_offset < time_dim_size) time_offsets.add(dim_offset); else error_code = error_code_unknown; - if (0 < time_offsets.n_elements()) - mlog << Debug(7) << method_name << " Found " << time_offsets.n_elements() - << " times from between " + int time_count = time_offsets.n_elements(); + if (0 < time_count) + mlog << Debug(7) << method_name << " Found " << time_count + << (time_count==1 ? " time" : " times") << " between " << unix_to_yyyymmdd_hhmmss(_file->ValidTime[0]) << " and " << unix_to_yyyymmdd_hhmmss(_file->ValidTime[time_dim_size-1]) << "\n"; else { From 800bfa1592e0f155978b9e10a1af3d401537c77e Mon Sep 17 00:00:00 2001 From: Howard Soh Date: Thu, 15 Apr 2021 08:53:21 -0600 Subject: [PATCH 102/165] #1755 Support time string for slicing at MetNcCFDataFile::collect_time_offsets --- met/src/libcode/vx_data2d_nccf/data2d_nccf.cc | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/met/src/libcode/vx_data2d_nccf/data2d_nccf.cc b/met/src/libcode/vx_data2d_nccf/data2d_nccf.cc index 56e853a63c..099b095565 100644 --- a/met/src/libcode/vx_data2d_nccf/data2d_nccf.cc +++ b/met/src/libcode/vx_data2d_nccf/data2d_nccf.cc @@ -469,13 +469,12 @@ LongArray MetNcCFDataFile::collect_time_offsets(VarInfo &vinfo) { } } } - else if (time_as_value) { - idx = convert_time_to_offset(dim_offset); - if (0 <= idx && idx < time_dim_size) time_offsets.add(idx); + else { + if (time_as_value) dim_offset = convert_time_to_offset(dim_offset); + if (0 <= time_dim_slot && dim_offset < time_dim_size) + time_offsets.add(dim_offset); + else error_code = error_code_unknown; } - else if (0 <= time_dim_slot && dim_offset < time_dim_size) - time_offsets.add(dim_offset); - else error_code = error_code_unknown; int time_count = time_offsets.n_elements(); if (0 < time_count) From c3329cdecd48f80ebe451e28e11670afc9f8a26c Mon Sep 17 00:00:00 2001 From: johnhg Date: Fri, 16 Apr 2021 09:59:29 -0600 Subject: [PATCH 103/165] Feature 1735 stat_analysis (#1754) * Per #1735, enhance Stat-Analysis to support multiple -out_thresh settings when processing aggregate_stat jobs for MPR line types. This applies to output for FHO, CTC, CTS, ECLV, CNT, SL1L2, and SAL1L2. * Per #1735, since we are writing multiple output line types to the same .stat file, adding stat_row counter to the job class. This way all functions that write to it can increment that row counter when needed. * Per #1735, lots of little changes here to enable the aggregate_stat job type to write multiple output line types.g * Per #1735, update documentation for stat_analysis. * Per #1735, add AsciiTable::expand() function to increase the AsciiTable dimensions and also update the Stat-Analysis handling of the output .stat file it writes. * Per #1735, fix bug in the write_job_aggr_ssvar where I was using the wrong row counter when writing .stat outptu. * Per #1735, print a warning message is the continuous filtering logic results in 0 matched pairs. Also, match existing logic to NOT WRITE any output, not even header rows, when the output AsciiTable contains no results. * Per #1735, update unit_stat_analysis.xml to consolidate jobs stat_analysis_AGG_STAT_ORANK_RHIST and stat_analysis_AGG_STAT_ORANK_PHIST down into 1 job with 2 output line types. Rename the output files accordingly. * Per #1735, update the STATAnalysis config file for processing MPR data by tweaking the jobs to write multiple output line types and/or apply multiple output thresholds. --- met/docs/Users_Guide/stat-analysis.rst | 8 +- met/src/basic/vx_util/ascii_table.cc | 50 +- met/src/basic/vx_util/ascii_table.h | 1 + met/src/libcode/vx_analysis_util/stat_job.cc | 161 +-- met/src/libcode/vx_analysis_util/stat_job.h | 1 + .../core/stat_analysis/aggr_stat_line.cc | 129 +-- .../tools/core/stat_analysis/aggr_stat_line.h | 8 +- .../core/stat_analysis/stat_analysis_job.cc | 919 +++++++++++------- test/config/STATAnalysisConfig_point_stat | 6 +- test/xml/unit_stat_analysis.xml | 34 +- 10 files changed, 800 insertions(+), 517 deletions(-) diff --git a/met/docs/Users_Guide/stat-analysis.rst b/met/docs/Users_Guide/stat-analysis.rst index acbad3127d..5d3d998fb9 100644 --- a/met/docs/Users_Guide/stat-analysis.rst +++ b/met/docs/Users_Guide/stat-analysis.rst @@ -44,9 +44,11 @@ The Stat-Analysis “aggregate” job aggregates values from multiple STAT lines Aggregate STAT lines and produce aggregated statistics ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The Stat-Analysis “aggregate-stat” job aggregates multiple STAT lines of the same type together and produces relevant statistics from the aggregated line. This may be done in the same manner listed above in :numref:`StA_Aggregated-values-from`. However, rather than writing out the aggregated STAT line itself, the relevant statistics generated from that aggregated line are provided in the output. Specifically, if a contingency table line type (FHO, CTC, PCT, MCTC, or NBRCTC) has been aggregated, a contingency table statistics (CTS, PSTD, MCTS, or NBRCTS) line type will be written out. If a partial sums line type (SL1L2 or SAL1L2) has been aggregated, a continuous statistics (CNT) line type will be written out. If a vector partial sums line type (VL1L2) has been aggregated, the vector continuous statistics (VCNT) line type will be written out. For ensembles, the ORANK line type can be accumulated into ECNT, RPS, RHIST, PHIST, RELP, or SSVAR output. If the matched pair line type (MPR) has been aggregated, the user may choose the line type to be output (FHO, CTC, CTS, CNT, MCTC, MCTS, SL1L2, SAL1L2, VL1L2, VCNT, WDIR, PCT, PSTD, PJC, PRC, or ECLV). +The Stat-Analysis “aggregate-stat” job aggregates multiple STAT lines of the same type together and produces relevant statistics from the aggregated line. This may be done in the same manner listed above in :numref:`StA_Aggregated-values-from`. However, rather than writing out the aggregated STAT line itself, the relevant statistics generated from that aggregated line are provided in the output. Specifically, if a contingency table line type (FHO, CTC, PCT, MCTC, or NBRCTC) has been aggregated, contingency table statistics (CTS, ECLV, PSTD, MCTS, or NBRCTS) line types can be computed. If a partial sums line type (SL1L2 or SAL1L2) has been aggregated, the continuous statistics (CNT) line type can be computed. If a vector partial sums line type (VL1L2) has been aggregated, the vector continuous statistics (VCNT) line type can be computed. For ensembles, the ORANK line type can be accumulated into ECNT, RPS, RHIST, PHIST, RELP, or SSVAR output. If the matched pair line type (MPR) has been aggregated, may output line types (FHO, CTC, CTS, CNT, MCTC, MCTS, SL1L2, SAL1L2, VL1L2, VCNT, WDIR, PCT, PSTD, PJC, PRC, or ECLV) can be computed. Multiple output line types may be specified for each “aggregate-stat” job, as long as each output is derivable from the input. -When aggregating the matched pair line type (MPR) and computing an output contingency table statistics (CTS) or continuous statistics (CNT) line type, the bootstrapping method is applied for computing confidence intervals. The bootstrapping method is applied here in the same way that it is applied in the statistics tools. For a set of n matched forecast-observation pairs, the matched pairs are resampled with replacement many times. For each replicated sample, the corresponding statistics are computed. The confidence intervals are derived from the statistics computed for each replicated sample. +When aggregating the matched pair line type (MPR), additional required job command options are determined by the requested output line type(s). For example, the “-out_thresh” (or “-out_fcst_thresh” and “-out_obs_thresh” options) are required to compute contingnecy table counts (FHO, CTC) or statistics (CTS). Those same job command options can also specify filtering thresholds when computing continuous partial sums (SL1L2, SAL1L2) or statistics (CNT). Output is written for each threshold specified. + +When aggregating the matched pair line type (MPR) and computing an output contingency table statistics (CTS) or continuous statistics (CNT) line type, the bootstrapping method can be applied to compute confidence intervals. The bootstrapping method is applied here in the same way that it is applied in the statistics tools. For a set of n matched forecast-observation pairs, the matched pairs are resampled with replacement many times. For each replicated sample, the corresponding statistics are computed. The confidence intervals are derived from the statistics computed for each replicated sample. .. _StA_Skill-Score-Index: @@ -541,7 +543,7 @@ Each analysis job is performed over a subset of the input data. Filtering the in -out_line_type name -This option specifies the desired output line type for the **aggregate_stat** job type. +This option specifies the desired output line type(s) for the **aggregate_stat** job type. .. code-block:: none diff --git a/met/src/basic/vx_util/ascii_table.cc b/met/src/basic/vx_util/ascii_table.cc index 2b345f2950..04b19a30c3 100644 --- a/met/src/basic/vx_util/ascii_table.cc +++ b/met/src/basic/vx_util/ascii_table.cc @@ -331,8 +331,6 @@ if ( e.size() != NRC ) { } -//for (j=0; j " - << "unexpected stat line type \"" << statlinetype_to_string(out_lt) - << "\"!\n\n"; - exit(1); - break; + // Write the STAT header row + // + switch(out_lt) { + case stat_sl1l2: write_header_row (sl1l2_columns, n_sl1l2_columns, 1, stat_at, 0, 0); break; + case stat_sal1l2: write_header_row (sal1l2_columns, n_sal1l2_columns, 1, stat_at, 0, 0); break; + case stat_vl1l2: write_header_row (vl1l2_columns, n_vl1l2_columns, 1, stat_at, 0, 0); break; + case stat_val1l2: write_header_row (val1l2_columns, n_val1l2_columns, 1, stat_at, 0, 0); break; + case stat_fho: write_header_row (fho_columns, n_fho_columns, 1, stat_at, 0, 0); break; + case stat_ctc: write_header_row (ctc_columns, n_ctc_columns, 1, stat_at, 0, 0); break; + case stat_cts: write_header_row (cts_columns, n_cts_columns, 1, stat_at, 0, 0); break; + case stat_mctc: write_mctc_header_row (1, n, stat_at, 0, 0); break; + case stat_mcts: write_header_row (mcts_columns, n_mcts_columns, 1, stat_at, 0, 0); break; + case stat_cnt: write_header_row (cnt_columns, n_cnt_columns, 1, stat_at, 0, 0); break; + case stat_vcnt: write_header_row (vcnt_columns, n_vcnt_columns, 1, stat_at, 0, 0); break; + case stat_pct: write_pct_header_row (1, n, stat_at, 0, 0); break; + case stat_pstd: write_pstd_header_row (1, n, stat_at, 0, 0); break; + case stat_pjc: write_pjc_header_row (1, n, stat_at, 0, 0); break; + case stat_prc: write_prc_header_row (1, n, stat_at, 0, 0); break; + case stat_eclv: write_eclv_header_row (1, n, stat_at, 0, 0); break; + case stat_mpr: write_header_row (mpr_columns, n_mpr_columns, 1, stat_at, 0, 0); break; + case stat_nbrctc: write_header_row (nbrctc_columns, n_sl1l2_columns, 1, stat_at, 0, 0); break; + case stat_nbrcts: write_header_row (nbrcts_columns, n_sl1l2_columns, 1, stat_at, 0, 0); break; + case stat_nbrcnt: write_header_row (nbrcnt_columns, n_sl1l2_columns, 1, stat_at, 0, 0); break; + case stat_grad: write_header_row (grad_columns, n_grad_columns, 1, stat_at, 0, 0); break; + case stat_isc: write_header_row (isc_columns, n_isc_columns, 1, stat_at, 0, 0); break; + case stat_wdir: write_header_row (job_wdir_columns, n_job_wdir_columns, 1, stat_at, 0, 0); break; + case stat_ecnt: write_header_row (ecnt_columns, n_ecnt_columns, 1, stat_at, 0, 0); break; + case stat_rps: write_header_row (rps_columns, n_rps_columns, 1, stat_at, 0, 0); break; + case stat_rhist: write_rhist_header_row (1, n, stat_at, 0, 0); break; + case stat_phist: write_phist_header_row (1, n, stat_at, 0, 0); break; + case stat_relp: write_relp_header_row (1, n, stat_at, 0, 0); break; + case stat_orank: write_header_row (orank_columns, n_orank_columns, 1, stat_at, 0, 0); break; + case stat_ssvar: write_header_row (ssvar_columns, n_ssvar_columns, 1, stat_at, 0, 0); break; + case stat_genmpr: write_header_row (genmpr_columns, n_genmpr_columns, 1, stat_at, 0, 0); break; + + // + // Write only header columns for unspecified line type + // + case no_stat_line_type: + write_header_row ((const char **) 0, 0, 1, stat_at, 0, 0); break; + + default: + mlog << Error << "\nSTATAnalysisJob::setup_stat_file() -> " + << "unexpected stat line type \"" << statlinetype_to_string(out_lt) + << "\"!\n\n"; + exit(1); + break; + } + + // + // Increment row counter + // + stat_row++; + } + // + // Expand the table, if needed + // + else { + + // + // Determine the required dimensions + // + int need_rows = max(stat_at.nrows(), stat_row + n_row); + int need_cols = max(stat_at.ncols(), n_col); + + if(need_rows > stat_at.nrows() || need_cols > stat_at.ncols()) { + + // + // Resize the STAT table + // + stat_at.expand(need_rows, need_cols); + justify_stat_cols(stat_at); + stat_at.set_precision(precision); + stat_at.set_bad_data_value(bad_data_double); + stat_at.set_bad_data_str(na_str); + stat_at.set_delete_trailing_blank_rows(1); + } } return; diff --git a/met/src/libcode/vx_analysis_util/stat_job.h b/met/src/libcode/vx_analysis_util/stat_job.h index c099336712..80facaf912 100644 --- a/met/src/libcode/vx_analysis_util/stat_job.h +++ b/met/src/libcode/vx_analysis_util/stat_job.h @@ -249,6 +249,7 @@ class STATAnalysisJob { char *stat_file; // dump output statistics to a STAT file ofstream *stat_out; // output file stream for -out_stat AsciiTable stat_at; // AsciiTable for buffering output STAT data + int stat_row; // Counter for the current stat row StringArray out_line_type; // output line types ThreshArray out_fcst_thresh; // output forecast threshold(s) diff --git a/met/src/tools/core/stat_analysis/aggr_stat_line.cc b/met/src/tools/core/stat_analysis/aggr_stat_line.cc index bb9819634f..b5c7a160dd 100644 --- a/met/src/tools/core/stat_analysis/aggr_stat_line.cc +++ b/met/src/tools/core/stat_analysis/aggr_stat_line.cc @@ -33,6 +33,8 @@ // 013 04/25/18 Halley Gotway Add ECNT line type. // 014 04/01/19 Fillmore Add FCST and OBS units. // 015 01/24/20 Halley Gotway Add aggregate RPS lines. +// 016 04/12/21 Halley Gotway MET #1735 Support multiple +// -out_thresh and -out_line_type options. // //////////////////////////////////////////////////////////////////////// @@ -2174,32 +2176,6 @@ void aggr_mpr_lines(LineDataFile &f, STATAnalysisJob &job, // key = job.get_case_info(line); - // - // Apply the continuous statistics filtering threshold - // - if((job.out_line_type.has(stat_cnt_str) || - job.out_line_type.has(stat_sl1l2_str)) && - (job.out_fcst_thresh.n() > 0 || - job.out_obs_thresh.n() > 0)) { - - SingleThresh fst, ost; - if(job.out_fcst_thresh.n() > 0) fst = job.out_fcst_thresh[0]; - if(job.out_obs_thresh.n() > 0) ost = job.out_obs_thresh[0]; - - if(!check_fo_thresh(cur.fcst, cur.obs, cur.climo_mean, cur.climo_stdev, - fst, ost, job.out_cnt_logic)) { - mlog << Debug(4) << "aggr_mpr_lines() -> " - << "skipping forecast (" - << cur.fcst << " " << job.out_fcst_thresh.get_str() - << ") and observation (" - << cur.obs << " " << job.out_obs_thresh.get_str() - << ") matched pair with " - << setlogic_to_string(job.out_cnt_logic) - << " logic.\n"; - continue; - } - } - // // Add a new map entry, if necessary // @@ -3370,23 +3346,20 @@ void aggr_time_series_lines(LineDataFile &f, STATAnalysisJob &job, //////////////////////////////////////////////////////////////////////// void mpr_to_ctc(STATAnalysisJob &job, const AggrMPRInfo &info, - CTSInfo &cts_info) { + int i_thresh, CTSInfo &cts_info) { int i; - int n = info.pd.f_na.n(); - SingleThresh ft = job.out_fcst_thresh[0]; - SingleThresh ot = job.out_obs_thresh[0]; // // Initialize // cts_info.clear(); - cts_info.fthresh = ft; - cts_info.othresh = ot; + cts_info.fthresh = job.out_fcst_thresh[i_thresh]; + cts_info.othresh = job.out_obs_thresh[i_thresh]; // // Populate the contingency table // - for(i=0; i " + << "no MPR lines retained for -out_fcst_thresh " + << job.out_fcst_thresh[i_thresh].get_str() << " -out_obs_thresh " + << job.out_obs_thresh[i_thresh].get_str() << " -out_cnt_logic " + << setlogic_to_string(job.out_cnt_logic) + << "\n\n"; + return; + } // // Set the precip flag based on fcst_var and obs_var @@ -3556,13 +3534,13 @@ void mpr_to_cnt(STATAnalysisJob &job, const AggrMPRInfo &info, // if(job.boot_interval == boot_bca_flag) { - compute_cnt_stats_ci_bca(rng_ptr, info.pd, + compute_cnt_stats_ci_bca(rng_ptr, pd_thr, precip_flag, job.rank_corr_flag, job.n_boot_rep, cnt_info, tmp_dir); } else { - compute_cnt_stats_ci_perc(rng_ptr, info.pd, + compute_cnt_stats_ci_perc(rng_ptr, pd_thr, precip_flag, job.rank_corr_flag, job.n_boot_rep, job.boot_rep_prop, cnt_info, tmp_dir); } @@ -3573,19 +3551,42 @@ void mpr_to_cnt(STATAnalysisJob &job, const AggrMPRInfo &info, //////////////////////////////////////////////////////////////////////// void mpr_to_psum(STATAnalysisJob &job, const AggrMPRInfo &info, - SL1L2Info &s_info) { + int i_thresh, SL1L2Info &s_info) { int i; - int n = info.pd.f_na.n(); int scount, sacount; double f, o, c; double f_sum, o_sum, ff_sum, oo_sum, fo_sum; double fa_sum, oa_sum, ffa_sum, ooa_sum, foa_sum; double abs_err_sum; + PairDataPoint pd_thr; // - // Initialize the SL1L2Info object and counts + // Initialize // s_info.clear(); + + // Apply continuous filtering thresholds to subset pairs + pd_thr = info.pd.subset_pairs_cnt_thresh( + job.out_fcst_thresh[i_thresh], + job.out_obs_thresh[i_thresh], + job.out_cnt_logic); + + // + // If there are no matched pairs to process, return + // + if(pd_thr.f_na.n() == 0 || pd_thr.o_na.n() == 0) { + mlog << Warning << "\nmpr_to_psum() -> " + << "no MPR lines retained for -out_fcst_thresh " + << job.out_fcst_thresh[i_thresh].get_str() << " -out_obs_thresh " + << job.out_obs_thresh[i_thresh].get_str() << " -out_cnt_logic " + << setlogic_to_string(job.out_cnt_logic) + << "\n\n"; + return; + } + + // + // Initialize counts + // scount = sacount = 0; f_sum = o_sum = ff_sum = oo_sum = fo_sum = 0.0; fa_sum = oa_sum = ffa_sum = ooa_sum = foa_sum = 0.0; @@ -3594,14 +3595,14 @@ void mpr_to_psum(STATAnalysisJob &job, const AggrMPRInfo &info, // // Update the partial sums // - for(i=0; i &, + const STATLineType); + +//////////////////////////////////////////////////////////////////////// + void set_job_from_config(MetConfig &c, STATAnalysisJob &job) { BootInfo boot_info; @@ -581,7 +588,9 @@ void do_job_aggr_stat(const ConcatString &jobstring, LineDataFile &f, ofstream *sa_out, const ConcatString &tmp_dir, gsl_rng *rng_ptr) { STATLine line; - STATLineType in_lt, out_lt; + STATLineType in_lt; + vector out_lt; + vector::iterator it; AsciiTable out_at; int i, n; @@ -598,19 +607,26 @@ void do_job_aggr_stat(const ConcatString &jobstring, LineDataFile &f, // supplied only once // if(job.line_type.n() != 1 || - job.out_line_type.n() != 1) { + job.out_line_type.n() == 0) { mlog << Error << "\ndo_job_aggr_stat() -> " - << "this function may only be called when the " - << "\"-line_type\" and \"-out_line_type\" options have been " - << "used exactly once: " << jobstring << "\n\n"; + << "the \"-line_type\" option must be used exactly once and " + << "the \"-out_line_type\" option must be used at least once: " + << jobstring << "\n\n"; throw(1); } + // + // Write the job command line + // + write_jobstring(jobstring, sa_out); + // // Determine the input and output line types for this job // in_lt = string_to_statlinetype(job.line_type[0].c_str()); - out_lt = string_to_statlinetype(job.out_line_type[0].c_str()); + for(i=0; i CTS, ECLV // NBRCTC -> NBRCTS // - if(((in_lt == stat_fho || - in_lt == stat_ctc) && - (out_lt == stat_cts || - out_lt == stat_eclv)) || - (in_lt == stat_nbrctc && - out_lt == stat_nbrcts)) { + if(((in_lt == stat_fho || + in_lt == stat_ctc) && + (has_line_type(out_lt, stat_cts) || + has_line_type(out_lt, stat_eclv))) || + (in_lt == stat_nbrctc && + has_line_type(out_lt, stat_nbrcts))) { aggr_ctc_lines(f, job, ctc_map, n_in, n_out); - write_job_aggr_ctc(job, out_lt, ctc_map, out_at); + for(it=out_lt.begin(); it!=out_lt.end(); it++) { + write_job_aggr_ctc(job, *it, ctc_map, out_at); + if(!job.stat_out) write_table(out_at, sa_out); + } } // @@ -649,22 +668,28 @@ void do_job_aggr_stat(const ConcatString &jobstring, LineDataFile &f, // MCTC -> MCTS // else if(in_lt == stat_mctc && - out_lt == stat_mcts) { + has_line_type(out_lt, stat_mcts)) { aggr_mctc_lines(f, job, mctc_map, n_in, n_out); - write_job_aggr_mctc(job, out_lt, mctc_map, out_at); + for(it=out_lt.begin(); it!=out_lt.end(); it++) { + write_job_aggr_mctc(job, *it, mctc_map, out_at); + if(!job.stat_out) write_table(out_at, sa_out); + } } // // Sum up the Nx2 contingency table lines: // PCT -> PSTD, PJC, PRC, ECLV // - else if( in_lt == stat_pct && - (out_lt == stat_pstd || - out_lt == stat_pjc || - out_lt == stat_prc || - out_lt == stat_eclv)) { + else if(in_lt == stat_pct && + (has_line_type(out_lt, stat_pstd) || + has_line_type(out_lt, stat_pjc) || + has_line_type(out_lt, stat_prc) || + has_line_type(out_lt, stat_eclv))) { aggr_pct_lines(f, job, pct_map, n_in, n_out); - write_job_aggr_pct(job, out_lt, pct_map, out_at); + for(it=out_lt.begin(); it!=out_lt.end(); it++) { + write_job_aggr_pct(job, *it, pct_map, out_at); + if(!job.stat_out) write_table(out_at, sa_out); + } } // @@ -672,42 +697,49 @@ void do_job_aggr_stat(const ConcatString &jobstring, LineDataFile &f, // SL1L2, SAL1L2 -> CNT // NBRCTC -> NBRCNT // - else if((in_lt == stat_sl1l2 || - in_lt == stat_sal1l2) && - out_lt == stat_cnt) { + else if((in_lt == stat_sl1l2 || + in_lt == stat_sal1l2) && + has_line_type(out_lt, stat_cnt)) { aggr_psum_lines(f, job, psum_map, n_in, n_out); - write_job_aggr_psum(job, out_lt, psum_map, out_at); + for(it=out_lt.begin(); it!=out_lt.end(); it++) { + write_job_aggr_psum(job, *it, psum_map, out_at); + if(!job.stat_out) write_table(out_at, sa_out); + } } // // Sum the vector partial sum line types: // VL1L2 -> VCNT // - else if(in_lt == stat_vl1l2 && - out_lt == stat_vcnt) { + else if(in_lt == stat_vl1l2 && + has_line_type(out_lt, stat_vcnt)) { aggr_psum_lines(f, job, psum_map, n_in, n_out); - write_job_aggr_psum(job, out_lt, psum_map, out_at); + for(it=out_lt.begin(); it!=out_lt.end(); it++) { + write_job_aggr_psum(job, *it, psum_map, out_at); + if(!job.stat_out) write_table(out_at, sa_out); + } } // // Sum the vector partial sum line types: // VL1L2, VAL1L2 -> WDIR // - else if((in_lt == stat_vl1l2 || - in_lt == stat_val1l2) && - out_lt == stat_wdir) { + else if((in_lt == stat_vl1l2 || + in_lt == stat_val1l2) && + has_line_type(out_lt, stat_wdir)) { aggr_wind_lines(f, job, wind_map, n_in, n_out); write_job_aggr_wind(job, in_lt, wind_map, out_at); + if(!job.stat_out) write_table(out_at, sa_out); } // // Sum the UGRD and VGRD matched pair lines: // MPR -> WDIR // - else if(in_lt == stat_mpr && - (out_lt == stat_wdir || - out_lt == stat_vl1l2 || - out_lt == stat_vcnt)) { + else if(in_lt == stat_mpr && + (has_line_type(out_lt, stat_wdir) || + has_line_type(out_lt, stat_vl1l2) || + has_line_type(out_lt, stat_vcnt))) { mlog << Debug(4) << "do_job_aggr_stat() -> " << "For MPR wind aggregation, searching for UGRD and VGRD MPR lines.\n"; @@ -717,11 +749,15 @@ void do_job_aggr_stat(const ConcatString &jobstring, LineDataFile &f, job.fcst_var.add(vgrd_abbr_str); aggr_mpr_wind_lines(f, job, wind_map, n_in, n_out); - if(out_lt == stat_wdir) { - write_job_aggr_wind(job, in_lt, wind_map, out_at); - } - else { - write_job_aggr_mpr_wind(job, out_lt, wind_map, out_at); + for(it=out_lt.begin(); it!=out_lt.end(); it++) { + if(*it == stat_wdir) { + write_job_aggr_wind(job, in_lt, wind_map, out_at); + if(!job.stat_out) write_table(out_at, sa_out); + } + else { + write_job_aggr_mpr_wind(job, *it, wind_map, out_at); + if(!job.stat_out) write_table(out_at, sa_out); + } } } @@ -730,14 +766,17 @@ void do_job_aggr_stat(const ConcatString &jobstring, LineDataFile &f, // ORANK -> ECNT, RPS, RHIST, PHIST, RELP, SSVAR // else if(in_lt == stat_orank && - (out_lt == stat_ecnt || out_lt == stat_rps || - out_lt == stat_rhist || out_lt == stat_phist || - out_lt == stat_relp || out_lt == stat_ssvar)) { + (has_line_type(out_lt, stat_ecnt) || + has_line_type(out_lt, stat_rps) || + has_line_type(out_lt, stat_rhist) || + has_line_type(out_lt, stat_phist) || + has_line_type(out_lt, stat_relp) || + has_line_type(out_lt, stat_ssvar))) { // // Check forecast thresholds for RPS // - if(out_lt == stat_rps) { + if(has_line_type(out_lt, stat_rps)) { if(job.out_fcst_thresh.n() == 0) { mlog << Error << "\ndo_job_aggr_stat() -> " @@ -749,7 +788,10 @@ void do_job_aggr_stat(const ConcatString &jobstring, LineDataFile &f, } aggr_orank_lines(f, job, orank_map, n_in, n_out); - write_job_aggr_orank(job, out_lt, orank_map, out_at, rng_ptr); + for(it=out_lt.begin(); it!=out_lt.end(); it++) { + write_job_aggr_orank(job, *it, orank_map, out_at, rng_ptr); + if(!job.stat_out) write_table(out_at, sa_out); + } } // @@ -758,29 +800,60 @@ void do_job_aggr_stat(const ConcatString &jobstring, LineDataFile &f, // SL1L2, SAL1L2, PCT, PSTD, PJC, PRC, ECLV // else if(in_lt == stat_mpr && - (out_lt == stat_fho || out_lt == stat_ctc || - out_lt == stat_cts || out_lt == stat_mctc || - out_lt == stat_mcts || out_lt == stat_cnt || - out_lt == stat_sl1l2 || out_lt == stat_sal1l2 || - out_lt == stat_pct || out_lt == stat_pstd || - out_lt == stat_pjc || out_lt == stat_prc || - out_lt == stat_eclv)) { + (has_line_type(out_lt, stat_fho) || + has_line_type(out_lt, stat_ctc) || + has_line_type(out_lt, stat_cts) || + has_line_type(out_lt, stat_mctc) || + has_line_type(out_lt, stat_mcts) || + has_line_type(out_lt, stat_cnt) || + has_line_type(out_lt, stat_sl1l2) || + has_line_type(out_lt, stat_sal1l2) || + has_line_type(out_lt, stat_pct) || + has_line_type(out_lt, stat_pstd) || + has_line_type(out_lt, stat_pjc) || + has_line_type(out_lt, stat_prc) || + has_line_type(out_lt, stat_eclv))) { + + // + // Check output thresholds for continuous line types + // + if(has_line_type(out_lt, stat_cnt) || + has_line_type(out_lt, stat_sl1l2) || + has_line_type(out_lt, stat_sal1l2)) { + + if(job.out_fcst_thresh.n() != job.out_obs_thresh.n()) { + mlog << Error << "\ndo_job_aggr_stat() -> " + << "when \"-out_line_type\" is set to CNT, SL1L2, " + << "or SAL1L2, the \"-out_fcst_thresh\" and " + << "\"-out_obs_thresh\" options must specify the " + << "same number of thresholds.\n\n"; + throw(1); + } + + // Store a single NA threshold + if(job.out_fcst_thresh.n() == 0) { + job.out_fcst_thresh.add("NA"); + job.out_obs_thresh.add("NA"); + } + } // // Check output threshold values for 2x2 contingency table // - if(out_lt == stat_fho || - out_lt == stat_ctc || - out_lt == stat_cts || - out_lt == stat_eclv) { + if(has_line_type(out_lt, stat_fho) || + has_line_type(out_lt, stat_ctc) || + has_line_type(out_lt, stat_cts) || + has_line_type(out_lt, stat_eclv)) { - if(job.out_fcst_thresh.n() != 1 || - job.out_obs_thresh.n() != 1) { + if(job.out_fcst_thresh.n() == 0 || + job.out_obs_thresh.n() == 0 || + job.out_fcst_thresh.n() != job.out_obs_thresh.n()) { mlog << Error << "\ndo_job_aggr_stat() -> " << "when \"-out_line_type\" is set to FHO, CTC, " << "CTS, or ECLV, the \"-out_thresh\" option or " << "\"-out_fcst_thresh\" and \"-out_obs_thresh\" " - << "options must specify exactly one threshold.\n\n"; + << "options must specify the same number of thresholds " + << "and at least one.\n\n"; throw(1); } } @@ -788,8 +861,8 @@ void do_job_aggr_stat(const ConcatString &jobstring, LineDataFile &f, // // Check output threshold values for NxN contingency table // - if(out_lt == stat_mctc || - out_lt == stat_mcts) { + if(has_line_type(out_lt, stat_mctc) || + has_line_type(out_lt, stat_mcts)) { if(job.out_fcst_thresh.n() <= 1 || job.out_fcst_thresh.n() != job.out_obs_thresh.n()) { @@ -807,9 +880,9 @@ void do_job_aggr_stat(const ConcatString &jobstring, LineDataFile &f, job.out_obs_thresh[i].get_value() > job.out_obs_thresh[i+1].get_value() || job.out_fcst_thresh[i].get_type() != job.out_fcst_thresh[i+1].get_type() || job.out_obs_thresh[i].get_type() != job.out_obs_thresh[i+1].get_type() || - job.out_fcst_thresh[i].get_type() == thresh_eq || - job.out_fcst_thresh[i].get_type() == thresh_ne || - job.out_obs_thresh[i].get_type() == thresh_eq || + job.out_fcst_thresh[i].get_type() == thresh_eq || + job.out_fcst_thresh[i].get_type() == thresh_ne || + job.out_obs_thresh[i].get_type() == thresh_eq || job.out_obs_thresh[i].get_type() == thresh_ne) { mlog << Error << "\ndo_job_aggr_stat() -> " @@ -825,10 +898,10 @@ void do_job_aggr_stat(const ConcatString &jobstring, LineDataFile &f, // // Check for output threshold values // - if(out_lt == stat_pct || - out_lt == stat_pstd || - out_lt == stat_pjc || - out_lt == stat_prc) { + if(has_line_type(out_lt, stat_pct) || + has_line_type(out_lt, stat_pstd) || + has_line_type(out_lt, stat_pjc) || + has_line_type(out_lt, stat_prc)) { if(job.out_obs_thresh.n() != 1) { mlog << Error << "\ndo_job_aggr_stat() -> " @@ -887,7 +960,10 @@ void do_job_aggr_stat(const ConcatString &jobstring, LineDataFile &f, // Parse the input MPR lines // aggr_mpr_lines(f, job, mpr_map, n_in, n_out); - write_job_aggr_mpr(job, out_lt, mpr_map, out_at, tmp_dir.c_str(), rng_ptr); + for(it=out_lt.begin(); it!=out_lt.end(); it++) { + write_job_aggr_mpr(job, *it, mpr_map, out_at, tmp_dir.c_str(), rng_ptr); + if(!job.stat_out) write_table(out_at, sa_out); + } } // @@ -897,7 +973,7 @@ void do_job_aggr_stat(const ConcatString &jobstring, LineDataFile &f, mlog << Error << "\ndo_job_aggr_stat() -> " << "invalid combination of \"-line_type " << statlinetype_to_string(in_lt) << "\" and " - << "\"-out_line_type " << statlinetype_to_string(out_lt) + << "\"-out_line_type " << statlinetype_to_string(out_lt[0]) << "\"\n\n"; throw(1); } @@ -912,13 +988,6 @@ void do_job_aggr_stat(const ConcatString &jobstring, LineDataFile &f, return; } - // - // Write the ASCII Table and the job command line - // If -out_stat was specified, do not write output - // - write_jobstring(jobstring, sa_out); - if(!job.stat_out) write_table(out_at, sa_out); - return; } @@ -1167,7 +1236,7 @@ void write_job_aggr_ctc(STATAnalysisJob &job, STATLineType lt, // // Loop through the map // - for(it = m.begin(), r=1; it != m.end(); it++, r++) { + for(it = m.begin(), r=1; it != m.end(); it++) { // // Write the output STAT header columns @@ -1176,7 +1245,7 @@ void write_job_aggr_ctc(STATAnalysisJob &job, STATLineType lt, job.hdr_name, job.hdr_value, lt); if(job.stat_out) { if(lt == stat_cts || lt == stat_nbrcts) shc.set_alpha(job.out_alpha); - write_header_cols(shc, job.stat_at, r); + write_header_cols(shc, job.stat_at, job.stat_row); } // @@ -1190,12 +1259,12 @@ void write_job_aggr_ctc(STATAnalysisJob &job, STATLineType lt, if(lt == stat_fho) { if(job.stat_out) { write_fho_cols(it->second.cts_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"FHO:"); write_case_cols(it->first, at, r, c); - write_fho_cols(it->second.cts_info, at, r, c); + write_fho_cols(it->second.cts_info, at, r++, c); } } // @@ -1204,12 +1273,12 @@ void write_job_aggr_ctc(STATAnalysisJob &job, STATLineType lt, else if(lt == stat_ctc) { if(job.stat_out) { write_ctc_cols(it->second.cts_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"CTC:"); write_case_cols(it->first, at, r, c); - write_ctc_cols(it->second.cts_info, at, r, c); + write_ctc_cols(it->second.cts_info, at, r++, c); } } // @@ -1235,12 +1304,12 @@ void write_job_aggr_ctc(STATAnalysisJob &job, STATLineType lt, // if(job.stat_out) { write_cts_cols(it->second.cts_info, 0, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"CTS:"); write_case_cols(it->first, at, r, c); - write_cts_cols(it->second.cts_info, 0, at, r, c); + write_cts_cols(it->second.cts_info, 0, at, r++, c); } } // @@ -1250,12 +1319,12 @@ void write_job_aggr_ctc(STATAnalysisJob &job, STATLineType lt, if(job.stat_out) { write_eclv_cols(it->second.cts_info.cts, job.out_eclv_points, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"ECLV:"); write_case_cols(it->first, at, r, c); - write_eclv_cols(it->second.cts_info.cts, job.out_eclv_points, at, r, c); + write_eclv_cols(it->second.cts_info.cts, job.out_eclv_points, at, r++, c); } } // @@ -1268,12 +1337,12 @@ void write_job_aggr_ctc(STATAnalysisJob &job, STATLineType lt, if(job.stat_out) { write_nbrctc_cols(nbrcts_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"NBRCTC:"); write_case_cols(it->first, at, r, c); - write_nbrctc_cols(nbrcts_info, at, r, c); + write_nbrctc_cols(nbrcts_info, at, r++, c); } } // @@ -1302,14 +1371,23 @@ void write_job_aggr_ctc(STATAnalysisJob &job, STATLineType lt, // if(job.stat_out) { write_nbrcts_cols(nbrcts_info, 0, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"NBRCTS:"); write_case_cols(it->first, at, r, c); - write_nbrcts_cols(nbrcts_info, 0, at, r, c); + write_nbrcts_cols(nbrcts_info, 0, at, r++, c); } } + // + // Unsupported line type + // + else { + mlog << Error << "\nwrite_job_aggr_ctc() -> " + << "unsupported output line type \"" + << statlinetype_to_string(lt) << "\" requested.\n\n"; + throw(1); + } } // end for it return; @@ -1358,7 +1436,7 @@ void write_job_aggr_mctc(STATAnalysisJob &job, STATLineType lt, // // Loop through the map // - for(it = m.begin(), r=1; it != m.end(); it++, r++) { + for(it = m.begin(), r=1; it != m.end(); it++) { // // Write the output STAT header columns @@ -1367,7 +1445,7 @@ void write_job_aggr_mctc(STATAnalysisJob &job, STATLineType lt, job.hdr_name, job.hdr_value, lt); if(job.stat_out) { if(lt == stat_mcts) shc.set_alpha(job.out_alpha); - write_header_cols(shc, job.stat_at, r); + write_header_cols(shc, job.stat_at, job.stat_row); } // @@ -1381,12 +1459,12 @@ void write_job_aggr_mctc(STATAnalysisJob &job, STATLineType lt, if(lt == stat_mctc) { if(job.stat_out) { write_mctc_cols(it->second.mcts_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"MCTC:"); write_case_cols(it->first, at, r, c); - write_mctc_cols(it->second.mcts_info, at, r, c); + write_mctc_cols(it->second.mcts_info, at, r++, c); } } // @@ -1412,14 +1490,23 @@ void write_job_aggr_mctc(STATAnalysisJob &job, STATLineType lt, // if(job.stat_out) { write_mcts_cols(it->second.mcts_info, 0, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"MCTS:"); write_case_cols(it->first, at, r, c); - write_mcts_cols(it->second.mcts_info, 0, at, r, c); + write_mcts_cols(it->second.mcts_info, 0, at, r++, c); } } + // + // Unsupported line type + // + else { + mlog << Error << "\nwrite_job_aggr_mctc() -> " + << "unsupported output line type \"" + << statlinetype_to_string(lt) << "\" requested.\n\n"; + throw(1); + } } // end for it return; @@ -1478,7 +1565,7 @@ void write_job_aggr_pct(STATAnalysisJob &job, STATLineType lt, // // Loop through the map // - for(it = m.begin(), r=1; it != m.end(); it++, r++) { + for(it = m.begin(), r=1; it != m.end(); it++) { // // Write the output STAT header columns @@ -1487,7 +1574,7 @@ void write_job_aggr_pct(STATAnalysisJob &job, STATLineType lt, job.hdr_name, job.hdr_value, lt); if(job.stat_out) { if(lt == stat_pstd) shc.set_alpha(job.out_alpha); - write_header_cols(shc, job.stat_at, r); + write_header_cols(shc, job.stat_at, job.stat_row); } // @@ -1501,12 +1588,12 @@ void write_job_aggr_pct(STATAnalysisJob &job, STATLineType lt, if(lt == stat_pct) { if(job.stat_out) { write_pct_cols(it->second.pct_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"PCT:"); write_case_cols(it->first, at, r, c); - write_pct_cols(it->second.pct_info, at, r, c); + write_pct_cols(it->second.pct_info, at, r++, c); } } // @@ -1532,12 +1619,12 @@ void write_job_aggr_pct(STATAnalysisJob &job, STATLineType lt, // if(job.stat_out) { write_pstd_cols(it->second.pct_info, 0, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"PSTD:"); write_case_cols(it->first, at, r, c); - write_pstd_cols(it->second.pct_info, 0, at, r, c); + write_pstd_cols(it->second.pct_info, 0, at, r++, c); } } // @@ -1546,12 +1633,12 @@ void write_job_aggr_pct(STATAnalysisJob &job, STATLineType lt, else if(lt == stat_pjc) { if(job.stat_out) { write_pjc_cols(it->second.pct_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"PJC:"); write_case_cols(it->first, at, r, c); - write_pjc_cols(it->second.pct_info, at, r, c); + write_pjc_cols(it->second.pct_info, at, r++, c); } } // @@ -1560,12 +1647,12 @@ void write_job_aggr_pct(STATAnalysisJob &job, STATLineType lt, else if(lt == stat_prc) { if(job.stat_out) { write_prc_cols(it->second.pct_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"PRC:"); write_case_cols(it->first, at, r, c); - write_prc_cols(it->second.pct_info, at, r, c); + write_prc_cols(it->second.pct_info, at, r++, c); } } // @@ -1573,22 +1660,31 @@ void write_job_aggr_pct(STATAnalysisJob &job, STATLineType lt, // else if(lt == stat_eclv) { ThreshArray prob_ta = string_to_prob_thresh(shc.get_fcst_thresh_str().c_str()); - for(i=0; isecond.pct_info.pct.nrows(); i++, r++) { + for(i=0; isecond.pct_info.pct.nrows(); i++) { if(job.stat_out) { shc.set_fcst_thresh(prob_ta[i]); - write_header_cols(shc, job.stat_at, r); + write_header_cols(shc, job.stat_at, job.stat_row); write_eclv_cols(it->second.pct_info.pct.ctc_by_row(i), - job.out_eclv_points, job.stat_at, r, n_header_columns); + job.out_eclv_points, job.stat_at, job.stat_row++, n_header_columns); } else { c = 0; at.set_entry(r, c++, (string)"ECLV:"); write_case_cols(it->first, at, r, c); write_eclv_cols(it->second.pct_info.pct.ctc_by_row(i), - job.out_eclv_points, at, r, c); + job.out_eclv_points, at, r++, c); } } } + // + // Unsupported line type + // + else { + mlog << Error << "\nwrite_job_aggr_pct() -> " + << "unsupported output line type \"" + << statlinetype_to_string(lt) << "\" requested.\n\n"; + throw(1); + } } // end for it return; @@ -1640,7 +1736,7 @@ void write_job_aggr_psum(STATAnalysisJob &job, STATLineType lt, // // Loop through the map // - for(it = m.begin(), r=1; it != m.end(); it++, r++) { + for(it = m.begin(), r=1; it != m.end(); it++) { // // Write the output STAT header columns @@ -1649,7 +1745,7 @@ void write_job_aggr_psum(STATAnalysisJob &job, STATLineType lt, job.hdr_name, job.hdr_value, lt); if(job.stat_out) { if(lt == stat_cnt || lt == stat_nbrcnt) shc.set_alpha(job.out_alpha); - write_header_cols(shc, job.stat_at, r); + write_header_cols(shc, job.stat_at, job.stat_row); } // @@ -1663,12 +1759,12 @@ void write_job_aggr_psum(STATAnalysisJob &job, STATLineType lt, if(lt == stat_sl1l2) { if(job.stat_out) { write_sl1l2_cols(it->second.sl1l2_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"SL1L2:"); write_case_cols(it->first, at, r, c); - write_sl1l2_cols(it->second.sl1l2_info, at, r, c); + write_sl1l2_cols(it->second.sl1l2_info, at, r++, c); } } // @@ -1677,12 +1773,12 @@ void write_job_aggr_psum(STATAnalysisJob &job, STATLineType lt, else if(lt == stat_sal1l2) { if(job.stat_out) { write_sal1l2_cols(it->second.sl1l2_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"SAL1L2:"); write_case_cols(it->first, at, r, c); - write_sal1l2_cols(it->second.sl1l2_info, at, r, c); + write_sal1l2_cols(it->second.sl1l2_info, at, r++, c); } } // @@ -1691,12 +1787,12 @@ void write_job_aggr_psum(STATAnalysisJob &job, STATLineType lt, else if(lt == stat_vl1l2) { if(job.stat_out) { write_vl1l2_cols(it->second.vl1l2_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"VL1L2:"); write_case_cols(it->first, at, r, c); - write_vl1l2_cols(it->second.vl1l2_info, at, r, c); + write_vl1l2_cols(it->second.vl1l2_info, at, r++, c); } } // @@ -1705,12 +1801,12 @@ void write_job_aggr_psum(STATAnalysisJob &job, STATLineType lt, else if(lt == stat_val1l2) { if(job.stat_out) { write_val1l2_cols(it->second.vl1l2_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"VAL1L2:"); write_case_cols(it->first, at, r, c); - write_val1l2_cols(it->second.vl1l2_info, at, r, c); + write_val1l2_cols(it->second.vl1l2_info, at, r++, c); } } // @@ -1736,12 +1832,12 @@ void write_job_aggr_psum(STATAnalysisJob &job, STATLineType lt, if(job.stat_out) { write_cnt_cols(it->second.cnt_info, 0, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"CNT:"); write_case_cols(it->first, at, r, c); - write_cnt_cols(it->second.cnt_info, 0, at, r, c); + write_cnt_cols(it->second.cnt_info, 0, at, r++, c); } } // @@ -1750,12 +1846,12 @@ void write_job_aggr_psum(STATAnalysisJob &job, STATLineType lt, else if(lt == stat_vcnt) { if(job.stat_out) { write_vcnt_cols(it->second.vl1l2_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, (string)"VCNT:"); write_case_cols(it->first, at, r, c); - write_vcnt_cols(it->second.vl1l2_info, at, r, c); + write_vcnt_cols(it->second.vl1l2_info, at, r++, c); } } // @@ -1770,14 +1866,23 @@ void write_job_aggr_psum(STATAnalysisJob &job, STATLineType lt, if(job.stat_out) { write_nbrcnt_cols(it->second.nbrcnt_info, 0, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, "NBRCNT:"); write_case_cols(it->first, at, r, c); - write_nbrcnt_cols(it->second.nbrcnt_info, 0, at, r, c); + write_nbrcnt_cols(it->second.nbrcnt_info, 0, at, r++, c); } } + // + // Unsupported line type + // + else { + mlog << Error << "\nwrite_job_aggr_psum() -> " + << "unsupported output line type \"" + << statlinetype_to_string(lt) << "\" requested.\n\n"; + throw(1); + } } // end for it return; @@ -1817,14 +1922,14 @@ void write_job_aggr_grad(STATAnalysisJob &job, STATLineType lt, // // Loop through the map // - for(it = m.begin(), r=1; it != m.end(); it++, r++) { + for(it = m.begin(), r=1; it != m.end(); it++) { // // Write the output STAT header columns // shc = it->second.hdr.get_shc(it->first, job.by_column, job.hdr_name, job.hdr_value, lt); - if(job.stat_out) write_header_cols(shc, job.stat_at, r); + if(job.stat_out) write_header_cols(shc, job.stat_at, job.stat_row); // // Initialize @@ -1836,12 +1941,12 @@ void write_job_aggr_grad(STATAnalysisJob &job, STATLineType lt, // if(job.stat_out) { write_grad_cols(it->second.grad_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, "GRAD:"); write_case_cols(it->first, at, r, c); - write_grad_cols(it->second.grad_info, at, r, c); + write_grad_cols(it->second.grad_info, at, r++, c); } } // end for it @@ -2052,14 +2157,14 @@ void write_job_aggr_ecnt(STATAnalysisJob &job, STATLineType lt, // // Loop through the map // - for(it = m.begin(), r=1; it != m.end(); it++, r++) { + for(it = m.begin(), r=1; it != m.end(); it++) { // // Write the output STAT header columns // shc = it->second.hdr.get_shc(it->first, job.by_column, job.hdr_name, job.hdr_value, lt); - if(job.stat_out) write_header_cols(shc, job.stat_at, r); + if(job.stat_out) write_header_cols(shc, job.stat_at, job.stat_row); // // Initialize @@ -2076,12 +2181,12 @@ void write_job_aggr_ecnt(STATAnalysisJob &job, STATLineType lt, // if(job.stat_out) { write_ecnt_cols(ecnt_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, "ECNT:"); write_case_cols(it->first, at, r, c); - write_ecnt_cols(ecnt_info, at, r, c); + write_ecnt_cols(ecnt_info, at, r++, c); } } // end for it @@ -2123,14 +2228,14 @@ void write_job_aggr_rps(STATAnalysisJob &job, STATLineType lt, // // Loop through the map // - for(it = m.begin(), r=1; it != m.end(); it++, r++) { + for(it = m.begin(), r=1; it != m.end(); it++) { // // Write the output STAT header columns // shc = it->second.hdr.get_shc(it->first, job.by_column, job.hdr_name, job.hdr_value, lt); - if(job.stat_out) write_header_cols(shc, job.stat_at, r); + if(job.stat_out) write_header_cols(shc, job.stat_at, job.stat_row); // // Initialize @@ -2142,12 +2247,12 @@ void write_job_aggr_rps(STATAnalysisJob &job, STATLineType lt, // if(job.stat_out) { write_rps_cols(it->second.rps_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, "RPS:"); write_case_cols(it->first, at, r, c); - write_rps_cols(it->second.rps_info, at, r, c); + write_rps_cols(it->second.rps_info, at, r++, c); } } // end for it @@ -2194,7 +2299,7 @@ void write_job_aggr_rhist(STATAnalysisJob &job, STATLineType lt, // // Loop through the map // - for(it = m.begin(), r=1; it != m.end(); it++, r++) { + for(it = m.begin(), r=1; it != m.end(); it++) { // // Write the output STAT header columns @@ -2202,7 +2307,7 @@ void write_job_aggr_rhist(STATAnalysisJob &job, STATLineType lt, shc = it->second.hdr.get_shc(it->first, job.by_column, job.hdr_name, job.hdr_value, lt); if(job.stat_out) { - write_header_cols(shc, job.stat_at, r); + write_header_cols(shc, job.stat_at, job.stat_row); } // @@ -2215,12 +2320,12 @@ void write_job_aggr_rhist(STATAnalysisJob &job, STATLineType lt, // if(job.stat_out) { write_rhist_cols(&(it->second.ens_pd), job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, "RHIST:"); write_case_cols(it->first, at, r, c); - write_rhist_cols(&(it->second.ens_pd), at, r, c); + write_rhist_cols(&(it->second.ens_pd), at, r++, c); } } // end for it @@ -2267,7 +2372,7 @@ void write_job_aggr_phist(STATAnalysisJob &job, STATLineType lt, // // Loop through the map // - for(it = m.begin(), r=1; it != m.end(); it++, r++) { + for(it = m.begin(), r=1; it != m.end(); it++) { // // Write the output STAT header columns @@ -2275,7 +2380,7 @@ void write_job_aggr_phist(STATAnalysisJob &job, STATLineType lt, shc = it->second.hdr.get_shc(it->first, job.by_column, job.hdr_name, job.hdr_value, lt); if(job.stat_out) { - write_header_cols(shc, job.stat_at, r); + write_header_cols(shc, job.stat_at, job.stat_row); } // @@ -2288,12 +2393,12 @@ void write_job_aggr_phist(STATAnalysisJob &job, STATLineType lt, // if(job.stat_out) { write_phist_cols(&(it->second.ens_pd), job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, "PHIST:"); write_case_cols(it->first, at, r, c); - write_phist_cols(&(it->second.ens_pd), at, r, c); + write_phist_cols(&(it->second.ens_pd), at, r++, c); } } // end for it @@ -2340,7 +2445,7 @@ void write_job_aggr_relp(STATAnalysisJob &job, STATLineType lt, // // Loop through the map // - for(it = m.begin(), r=1; it != m.end(); it++, r++) { + for(it = m.begin(), r=1; it != m.end(); it++) { // // Write the output STAT header columns @@ -2348,7 +2453,7 @@ void write_job_aggr_relp(STATAnalysisJob &job, STATLineType lt, shc = it->second.hdr.get_shc(it->first, job.by_column, job.hdr_name, job.hdr_value, lt); if(job.stat_out) { - write_header_cols(shc, job.stat_at, r); + write_header_cols(shc, job.stat_at, job.stat_row); } // @@ -2361,12 +2466,12 @@ void write_job_aggr_relp(STATAnalysisJob &job, STATLineType lt, // if(job.stat_out) { write_relp_cols(&(it->second.ens_pd), job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, "RELP:"); write_case_cols(it->first, at, r, c); - write_relp_cols(&(it->second.ens_pd), at, r, c); + write_relp_cols(&(it->second.ens_pd), at, r++, c); } } // end for it @@ -2444,7 +2549,7 @@ void write_job_aggr_ssvar(STATAnalysisJob &job, STATLineType lt, // for(bin_it = case_it->second.ssvar_bins.begin(), i=0; bin_it != case_it->second.ssvar_bins.end(); - bin_it++, r++, i++) { + bin_it++, i++) { // // Initialize @@ -2461,42 +2566,43 @@ void write_job_aggr_ssvar(STATAnalysisJob &job, STATLineType lt, // if(job.stat_out) { c = n_header_columns; - write_header_cols(shc, job.stat_at, r); - job.stat_at.set_entry(r, c++, n); - job.stat_at.set_entry(r, c++, (int) case_it->second.ssvar_bins.size()); - job.stat_at.set_entry(r, c++, i); - job.stat_at.set_entry(r, c++, bin_it->second.bin_n); - job.stat_at.set_entry(r, c++, bin_it->second.var_min); - job.stat_at.set_entry(r, c++, bin_it->second.var_max); - job.stat_at.set_entry(r, c++, bin_it->second.var_mean); - job.stat_at.set_entry(r, c++, bin_it->second.sl1l2_info.fbar); - job.stat_at.set_entry(r, c++, bin_it->second.sl1l2_info.obar); - job.stat_at.set_entry(r, c++, bin_it->second.sl1l2_info.fobar); - job.stat_at.set_entry(r, c++, bin_it->second.sl1l2_info.ffbar); - job.stat_at.set_entry(r, c++, bin_it->second.sl1l2_info.oobar); - job.stat_at.set_entry(r, c++, cnt_info.fbar.v_ncl[0]); - job.stat_at.set_entry(r, c++, cnt_info.fbar.v_ncu[0]); - job.stat_at.set_entry(r, c++, cnt_info.fstdev.v); - job.stat_at.set_entry(r, c++, cnt_info.fstdev.v_ncl[0]); - job.stat_at.set_entry(r, c++, cnt_info.fstdev.v_ncu[0]); - job.stat_at.set_entry(r, c++, cnt_info.obar.v_ncl[0]); - job.stat_at.set_entry(r, c++, cnt_info.obar.v_ncu[0]); - job.stat_at.set_entry(r, c++, cnt_info.ostdev.v); - job.stat_at.set_entry(r, c++, cnt_info.ostdev.v_ncl[0]); - job.stat_at.set_entry(r, c++, cnt_info.ostdev.v_ncu[0]); - job.stat_at.set_entry(r, c++, cnt_info.pr_corr.v); - job.stat_at.set_entry(r, c++, cnt_info.pr_corr.v_ncl[0]); - job.stat_at.set_entry(r, c++, cnt_info.pr_corr.v_ncu[0]); - job.stat_at.set_entry(r, c++, cnt_info.me.v); - job.stat_at.set_entry(r, c++, cnt_info.me.v_ncl[0]); - job.stat_at.set_entry(r, c++, cnt_info.me.v_ncu[0]); - job.stat_at.set_entry(r, c++, cnt_info.estdev.v); - job.stat_at.set_entry(r, c++, cnt_info.estdev.v_ncl[0]); - job.stat_at.set_entry(r, c++, cnt_info.estdev.v_ncu[0]); - job.stat_at.set_entry(r, c++, cnt_info.mbias.v); - job.stat_at.set_entry(r, c++, cnt_info.mse.v); - job.stat_at.set_entry(r, c++, cnt_info.bcmse.v); - job.stat_at.set_entry(r, c++, cnt_info.rmse.v); + write_header_cols(shc, job.stat_at, job.stat_row); + job.stat_at.set_entry(job.stat_row, c++, n); + job.stat_at.set_entry(job.stat_row, c++, (int) case_it->second.ssvar_bins.size()); + job.stat_at.set_entry(job.stat_row, c++, i); + job.stat_at.set_entry(job.stat_row, c++, bin_it->second.bin_n); + job.stat_at.set_entry(job.stat_row, c++, bin_it->second.var_min); + job.stat_at.set_entry(job.stat_row, c++, bin_it->second.var_max); + job.stat_at.set_entry(job.stat_row, c++, bin_it->second.var_mean); + job.stat_at.set_entry(job.stat_row, c++, bin_it->second.sl1l2_info.fbar); + job.stat_at.set_entry(job.stat_row, c++, bin_it->second.sl1l2_info.obar); + job.stat_at.set_entry(job.stat_row, c++, bin_it->second.sl1l2_info.fobar); + job.stat_at.set_entry(job.stat_row, c++, bin_it->second.sl1l2_info.ffbar); + job.stat_at.set_entry(job.stat_row, c++, bin_it->second.sl1l2_info.oobar); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.fbar.v_ncl[0]); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.fbar.v_ncu[0]); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.fstdev.v); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.fstdev.v_ncl[0]); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.fstdev.v_ncu[0]); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.obar.v_ncl[0]); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.obar.v_ncu[0]); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.ostdev.v); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.ostdev.v_ncl[0]); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.ostdev.v_ncu[0]); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.pr_corr.v); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.pr_corr.v_ncl[0]); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.pr_corr.v_ncu[0]); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.me.v); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.me.v_ncl[0]); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.me.v_ncu[0]); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.estdev.v); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.estdev.v_ncl[0]); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.estdev.v_ncu[0]); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.mbias.v); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.mse.v); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.bcmse.v); + job.stat_at.set_entry(job.stat_row, c++, cnt_info.rmse.v); + job.stat_row++; } // // SSVAR output line @@ -2539,6 +2645,7 @@ void write_job_aggr_ssvar(STATAnalysisJob &job, STATLineType lt, at.set_entry(r, c++, cnt_info.mse.v); at.set_entry(r, c++, cnt_info.bcmse.v); at.set_entry(r, c++, cnt_info.rmse.v); + r++; } } // end for bin_it } // end for case_it @@ -2653,21 +2760,21 @@ void write_job_aggr_orank(STATAnalysisJob &job, STATLineType lt, if(lt == stat_ecnt) { ECNTInfo ecnt_info; ecnt_info.set(it->second.ens_pd); - at.set_entry(r, c++, "ECNT:"); - write_case_cols(it->first, at, r, c); - write_ecnt_cols(ecnt_info, at, r, c); + if(job.stat_out) { - write_header_cols(shc, job.stat_at, r); - write_ecnt_cols(ecnt_info, job.stat_at, r, n_header_columns); + write_header_cols(shc, job.stat_at, job.stat_row); + write_ecnt_cols(ecnt_info, job.stat_at, + job.stat_row++, n_header_columns); + } + else { + at.set_entry(r, c++, "ECNT:"); + write_case_cols(it->first, at, r, c); + write_ecnt_cols(ecnt_info, at, r++, c); } - // Increment row counter - r++; } - // // RPS output line // - else if(lt == stat_rps) { RPSInfo rps_info; rps_info.fthresh = job.out_fcst_thresh; @@ -2675,19 +2782,16 @@ void write_job_aggr_orank(STATAnalysisJob &job, STATLineType lt, if(job.stat_out) { shc.set_fcst_thresh(job.out_fcst_thresh); - write_header_cols(shc, job.stat_at, r); - write_rps_cols(rps_info, job.stat_at, r, n_header_columns); + write_header_cols(shc, job.stat_at, job.stat_row); + write_rps_cols(rps_info, job.stat_at, + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, "RPS:"); write_case_cols(it->first, at, r, c); - write_rps_cols(rps_info, at, r, c); + write_rps_cols(rps_info, at, r++, c); } - - // Increment row counter - r++; } - // // RHIST output line // @@ -2695,37 +2799,31 @@ void write_job_aggr_orank(STATAnalysisJob &job, STATLineType lt, it->second.ens_pd.compute_rhist(); if(job.stat_out) { - write_header_cols(shc, job.stat_at, r); - write_rhist_cols(&(it->second.ens_pd), job.stat_at, r, n_header_columns); + write_header_cols(shc, job.stat_at, job.stat_row); + write_rhist_cols(&(it->second.ens_pd), job.stat_at, + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, "RHIST:"); write_case_cols(it->first, at, r, c); - write_rhist_cols(&(it->second.ens_pd), at, r, c); + write_rhist_cols(&(it->second.ens_pd), at, r++, c); } - - // Increment row counter - r++; } - // // PHIST output line // else if(lt == stat_phist) { if(job.stat_out) { - write_header_cols(shc, job.stat_at, r); - write_phist_cols(&(it->second.ens_pd), job.stat_at, r, n_header_columns); + write_header_cols(shc, job.stat_at, job.stat_row); + write_phist_cols(&(it->second.ens_pd), job.stat_at, + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, "PHIST:"); write_case_cols(it->first, at, r, c); - write_phist_cols(&(it->second.ens_pd), at, r, c); + write_phist_cols(&(it->second.ens_pd), at, r++, c); } - - // Increment row counter - r++; } - // // RELP output line // @@ -2733,20 +2831,16 @@ void write_job_aggr_orank(STATAnalysisJob &job, STATLineType lt, it->second.ens_pd.compute_relp(); if(job.stat_out) { - write_header_cols(shc, job.stat_at, r); + write_header_cols(shc, job.stat_at, job.stat_row); write_relp_cols(&(it->second.ens_pd), job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, "RELP:"); write_case_cols(it->first, at, r, c); - write_relp_cols(&(it->second.ens_pd), at, r, c); + write_relp_cols(&(it->second.ens_pd), at, r++, c); } - - // Increment row counter - r++; } - // // SSVAR output lines // @@ -2759,21 +2853,27 @@ void write_job_aggr_orank(STATAnalysisJob &job, STATLineType lt, // for(i=0; isecond.ens_pd.ssvar_bins[0].n_bin; i++) { if(job.stat_out) { - write_header_cols(shc, job.stat_at, r); + write_header_cols(shc, job.stat_at, job.stat_row); write_ssvar_cols(&(it->second.ens_pd), i, job.out_alpha, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { c = 0; at.set_entry(r, c++, "SSVAR:"); write_case_cols(it->first, at, r, c); - write_ssvar_cols(&(it->second.ens_pd), i, job.out_alpha, at, r, c); + write_ssvar_cols(&(it->second.ens_pd), i, job.out_alpha, at, r++, c); } - - // Increment row counter - r++; } } + // + // Unsupported line type + // + else { + mlog << Error << "\nwrite_job_aggr_orank() -> " + << "unsupported output line type \"" + << statlinetype_to_string(lt) << "\" requested.\n\n"; + throw(1); + } } // end for it return; @@ -2830,16 +2930,16 @@ void write_job_aggr_isc(STATAnalysisJob &job, STATLineType lt, // // ISC output line // - for(i=-1, c=0; i<=it->second.isc_info.n_scale; i++, r++, c=0) { + for(i=-1, c=0; i<=it->second.isc_info.n_scale; i++, c=0) { if(job.stat_out) { - write_header_cols(shc, job.stat_at, r); + write_header_cols(shc, job.stat_at, job.stat_row); write_isc_cols(it->second.isc_info, i, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, "ISC:"); write_case_cols(it->first, at, r, c); - write_isc_cols(it->second.isc_info, i, at, r, c); + write_isc_cols(it->second.isc_info, i, at, r++, c); } } } // end for it @@ -2854,7 +2954,7 @@ void write_job_aggr_mpr(STATAnalysisJob &job, STATLineType lt, AsciiTable &at, const char *tmp_dir, gsl_rng *rng_ptr) { map::iterator it; - int n, n_row, n_col, r, c; + int n, n_row, n_col, r, c, i; StatHdrColumns shc; CTSInfo cts_info; @@ -2866,8 +2966,21 @@ void write_job_aggr_mpr(STATAnalysisJob &job, STATLineType lt, // // Setup the output table // - n = 0; - n_row = 1 + m.size(); + n = 0; + + // Number of rows + n_row = 1; + if(lt == stat_fho || lt == stat_ctc || + lt == stat_cts || lt == stat_eclv || + lt == stat_cnt || lt == stat_sl1l2 || + lt == stat_sal1l2) { + n_row += job.out_fcst_thresh.n() * m.size(); + } + else { + n_row += m.size(); + } + + // Number of columns n_col = 1 + job.by_column.n(); if(lt == stat_fho) { n_col += n_fho_columns; } else if(lt == stat_ctc) { n_col += n_ctc_columns; } @@ -2919,97 +3032,103 @@ void write_job_aggr_mpr(STATAnalysisJob &job, STATLineType lt, // // Loop through the map // - for(it = m.begin(), r=1; it != m.end(); it++, r++) { + for(it = m.begin(), r=1; it != m.end(); it++) { // - // Process percentile thresholds. + // Process percentile thresholds // job.set_perc_thresh(it->second.pd.f_na, it->second.pd.o_na, it->second.pd.cmn_na); // - // Write the output STAT header columns + // Prepare the output STAT header columns // shc = it->second.hdr.get_shc(it->first, job.by_column, job.hdr_name, job.hdr_value, lt); - if(job.stat_out) { - if(lt == stat_cts || lt == stat_nbrcts || lt == stat_mcts || - lt == stat_cnt || lt == stat_nbrcnt || lt == stat_pstd) { - shc.set_alpha(job.out_alpha); - } - if(job.out_fcst_thresh.n() > 0 || job.out_obs_thresh.n() > 0) { - shc.set_fcst_thresh(job.out_fcst_thresh); - shc.set_obs_thresh(job.out_obs_thresh); - if(lt == stat_cnt || lt == stat_sl1l2) { - shc.set_thresh_logic(job.out_cnt_logic); - } - } - write_header_cols(shc, job.stat_at, r); - } - - // - // Initialize - // - c = 0; // // FHO output line // if(lt == stat_fho) { - mpr_to_ctc(job, it->second, cts_info); - if(job.stat_out) { - write_fho_cols(cts_info, job.stat_at, - r, n_header_columns); - } - else { - at.set_entry(r, c++, "FHO:"); - write_case_cols(it->first, at, r, c); - write_fho_cols(cts_info, at, r, c); - } + for(i=0; isecond, i, cts_info); + if(job.stat_out) { + shc.set_fcst_thresh(job.out_fcst_thresh[i]); + shc.set_obs_thresh(job.out_obs_thresh[i]); + write_header_cols(shc, job.stat_at, job.stat_row); + write_fho_cols(cts_info, job.stat_at, + job.stat_row++, n_header_columns); + } + else { + c = 0; + at.set_entry(r, c++, "FHO:"); + write_case_cols(it->first, at, r, c); + write_fho_cols(cts_info, at, r++, c); + } + } // end for i } // // CTC output line // else if(lt == stat_ctc) { - mpr_to_ctc(job, it->second, cts_info); - if(job.stat_out) { - write_ctc_cols(cts_info, job.stat_at, - r, n_header_columns); - } - else { - at.set_entry(r, c++, "CTC:"); - write_case_cols(it->first, at, r, c); - write_ctc_cols(cts_info, at, r, c); - } + for(i=0; isecond, i, cts_info); + if(job.stat_out) { + shc.set_fcst_thresh(job.out_fcst_thresh[i]); + shc.set_obs_thresh(job.out_obs_thresh[i]); + write_header_cols(shc, job.stat_at, job.stat_row); + write_ctc_cols(cts_info, job.stat_at, + job.stat_row++, n_header_columns); + } + else { + c = 0; + at.set_entry(r, c++, "CTC:"); + write_case_cols(it->first, at, r, c); + write_ctc_cols(cts_info, at, r++, c); + } + } // end for i } // // CTS output line // else if(lt == stat_cts) { - mpr_to_cts(job, it->second, cts_info, tmp_dir, rng_ptr); - if(job.stat_out) { - write_cts_cols(cts_info, 0, job.stat_at, - r, n_header_columns); - } - else { - at.set_entry(r, c++, "CTS:"); - write_case_cols(it->first, at, r, c); - write_cts_cols(cts_info, 0, at, r, c); - } + for(i=0; isecond, i, cts_info, tmp_dir, rng_ptr); + if(job.stat_out) { + shc.set_fcst_thresh(job.out_fcst_thresh[i]); + shc.set_obs_thresh(job.out_obs_thresh[i]); + shc.set_alpha(job.out_alpha); + write_header_cols(shc, job.stat_at, job.stat_row); + write_cts_cols(cts_info, 0, job.stat_at, + job.stat_row++, n_header_columns); + } + else { + c = 0; + at.set_entry(r, c++, "CTS:"); + write_case_cols(it->first, at, r, c); + write_cts_cols(cts_info, 0, at, r++, c); + } + } // end for i } // // ECLV output line // else if(lt == stat_eclv) { - mpr_to_ctc(job, it->second, cts_info); - if(job.stat_out) { - write_eclv_cols(cts_info.cts, job.out_eclv_points, - job.stat_at, r, n_header_columns); - } - else { - at.set_entry(r, c++, "ECLV:"); - write_case_cols(it->first, at, r, c); - write_eclv_cols(cts_info.cts, job.out_eclv_points, at, r, c); - } + for(i=0; isecond, i, cts_info); + if(job.stat_out) { + shc.set_fcst_thresh(job.out_fcst_thresh[i]); + shc.set_obs_thresh(job.out_obs_thresh[i]); + write_header_cols(shc, job.stat_at, job.stat_row); + write_eclv_cols(cts_info.cts, job.out_eclv_points, job.stat_at, + job.stat_row++, n_header_columns); + } + else { + c = 0; + at.set_entry(r, c++, "ECLV:"); + write_case_cols(it->first, at, r, c); + write_eclv_cols(cts_info.cts, job.out_eclv_points, at, r++, c); + } + } // end for i } // // MCTC output line @@ -3017,13 +3136,17 @@ void write_job_aggr_mpr(STATAnalysisJob &job, STATLineType lt, else if(lt == stat_mctc) { mpr_to_mctc(job, it->second, mcts_info); if(job.stat_out) { + shc.set_fcst_thresh(job.out_fcst_thresh); + shc.set_obs_thresh(job.out_obs_thresh); + write_header_cols(shc, job.stat_at, job.stat_row); write_mctc_cols(mcts_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { + c = 0; at.set_entry(r, c++, "MCTC:"); write_case_cols(it->first, at, r, c); - write_mctc_cols(mcts_info, at, r, c); + write_mctc_cols(mcts_info, at, r++, c); } } // @@ -3032,59 +3155,89 @@ void write_job_aggr_mpr(STATAnalysisJob &job, STATLineType lt, else if(lt == stat_mcts) { mpr_to_mcts(job, it->second, mcts_info, tmp_dir, rng_ptr); if(job.stat_out) { + shc.set_fcst_thresh(job.out_fcst_thresh); + shc.set_obs_thresh(job.out_obs_thresh); + shc.set_alpha(job.out_alpha); + write_header_cols(shc, job.stat_at, job.stat_row); write_mcts_cols(mcts_info, 0, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { + c = 0; at.set_entry(r, c++, "MCTS:"); write_case_cols(it->first, at, r, c); - write_mcts_cols(mcts_info, 0, at, r, c); + write_mcts_cols(mcts_info, 0, at, r++, c); } } // // CNT output line // else if(lt == stat_cnt) { - mpr_to_cnt(job, it->second, cnt_info, tmp_dir, rng_ptr); - if(job.stat_out) { - write_cnt_cols(cnt_info, 0, job.stat_at, - r, n_header_columns); - } - else { - at.set_entry(r, c++, "CNT:"); - write_case_cols(it->first, at, r, c); - write_cnt_cols(cnt_info, 0, at, r, c); - } + for(i=0; isecond, i, cnt_info, tmp_dir, rng_ptr); + if(cnt_info.n == 0) continue; + if(job.stat_out) { + shc.set_fcst_thresh(job.out_fcst_thresh[i]); + shc.set_obs_thresh(job.out_obs_thresh[i]); + shc.set_thresh_logic(job.out_cnt_logic); + shc.set_alpha(job.out_alpha); + write_header_cols(shc, job.stat_at, job.stat_row); + write_cnt_cols(cnt_info, 0, job.stat_at, + job.stat_row++, n_header_columns); + } + else { + c = 0; + at.set_entry(r, c++, "CNT:"); + write_case_cols(it->first, at, r, c); + write_cnt_cols(cnt_info, 0, at, r++, c); + } + } // end for i } // // SL1L2 output line // else if(lt == stat_sl1l2) { - mpr_to_psum(job, it->second, sl1l2_info); - if(job.stat_out) { - write_sl1l2_cols(sl1l2_info, job.stat_at, - r, n_header_columns); - } - else { - at.set_entry(r, c++, "SL1L2:"); - write_case_cols(it->first, at, r, c); - write_sl1l2_cols(sl1l2_info, at, r, c); - } + for(i=0; isecond, i, sl1l2_info); + if(sl1l2_info.scount == 0) continue; + if(job.stat_out) { + shc.set_fcst_thresh(job.out_fcst_thresh[i]); + shc.set_obs_thresh(job.out_obs_thresh[i]); + shc.set_thresh_logic(job.out_cnt_logic); + write_header_cols(shc, job.stat_at, job.stat_row); + write_sl1l2_cols(sl1l2_info, job.stat_at, + job.stat_row++, n_header_columns); + } + else { + c = 0; + at.set_entry(r, c++, "SL1L2:"); + write_case_cols(it->first, at, r, c); + write_sl1l2_cols(sl1l2_info, at, r++, c); + } + } // end for i } // // SAL1L2 output line // else if(lt == stat_sal1l2) { - mpr_to_psum(job, it->second, sl1l2_info); - if(job.stat_out) { - write_sal1l2_cols(sl1l2_info, job.stat_at, - r, n_header_columns); - } - else { - at.set_entry(r, c++, "SAL1L2:"); - write_case_cols(it->first, at, r, c); - write_sal1l2_cols(sl1l2_info, at, r, c); - } + for(i=0; isecond, i, sl1l2_info); + if(sl1l2_info.sacount == 0) continue; + if(job.stat_out) { + shc.set_fcst_thresh(job.out_fcst_thresh[i]); + shc.set_obs_thresh(job.out_obs_thresh[i]); + shc.set_thresh_logic(job.out_cnt_logic); + write_header_cols(shc, job.stat_at, job.stat_row); + write_sal1l2_cols(sl1l2_info, job.stat_at, + job.stat_row++, n_header_columns); + } + else { + c = 0; + at.set_entry(r, c++, "SAL1L2:"); + write_case_cols(it->first, at, r, c); + write_sal1l2_cols(sl1l2_info, at, r++, c); + } + } // end for i } // // PCT output line @@ -3092,13 +3245,17 @@ void write_job_aggr_mpr(STATAnalysisJob &job, STATLineType lt, else if(lt == stat_pct) { mpr_to_pct(job, it->second, pct_info); if(job.stat_out) { + shc.set_fcst_thresh(job.out_fcst_thresh); + shc.set_obs_thresh(job.out_obs_thresh); + write_header_cols(shc, job.stat_at, job.stat_row); write_pct_cols(pct_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { + c = 0; at.set_entry(r, c++, "PCT:"); write_case_cols(it->first, at, r, c); - write_pct_cols(pct_info, at, r, c); + write_pct_cols(pct_info, at, r++, c); } } // @@ -3107,13 +3264,18 @@ void write_job_aggr_mpr(STATAnalysisJob &job, STATLineType lt, else if(lt == stat_pstd) { mpr_to_pct(job, it->second, pct_info); if(job.stat_out) { + shc.set_fcst_thresh(job.out_fcst_thresh); + shc.set_obs_thresh(job.out_obs_thresh); + shc.set_alpha(job.out_alpha); + write_header_cols(shc, job.stat_at, job.stat_row); write_pstd_cols(pct_info, 0, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { + c = 0; at.set_entry(r, c++, "PSTD:"); write_case_cols(it->first, at, r, c); - write_pstd_cols(pct_info, 0, at, r, c); + write_pstd_cols(pct_info, 0, at, r++, c); } } // @@ -3122,13 +3284,18 @@ void write_job_aggr_mpr(STATAnalysisJob &job, STATLineType lt, else if(lt == stat_pjc) { mpr_to_pct(job, it->second, pct_info); if(job.stat_out) { + shc.set_fcst_thresh(job.out_fcst_thresh); + shc.set_obs_thresh(job.out_obs_thresh); + shc.set_alpha(job.out_alpha); + write_header_cols(shc, job.stat_at, job.stat_row); write_pjc_cols(pct_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { + c = 0; at.set_entry(r, c++, "PJC:"); write_case_cols(it->first, at, r, c); - write_pjc_cols(pct_info, at, r, c); + write_pjc_cols(pct_info, at, r++, c); } } // @@ -3137,17 +3304,36 @@ void write_job_aggr_mpr(STATAnalysisJob &job, STATLineType lt, else if(lt == stat_prc) { mpr_to_pct(job, it->second, pct_info); if(job.stat_out) { + shc.set_fcst_thresh(job.out_fcst_thresh); + shc.set_obs_thresh(job.out_obs_thresh); + shc.set_alpha(job.out_alpha); + write_header_cols(shc, job.stat_at, job.stat_row); write_prc_cols(pct_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { + c = 0; at.set_entry(r, c++, "PRC:"); write_case_cols(it->first, at, r, c); - write_prc_cols(pct_info, at, r, c); + write_prc_cols(pct_info, at, r++, c); } } + // + // Unsupported line type + // + else { + mlog << Error << "\nwrite_job_aggr_mpr() -> " + << "unsupported output line type \"" + << statlinetype_to_string(lt) << "\" requested.\n\n"; + throw(1); + } } // end for it + // + // Discard contents of an empty AsciiTable + // + if(r == 1) at.clear(); + return; } @@ -3187,7 +3373,7 @@ void write_job_aggr_mpr_wind(STATAnalysisJob &job, STATLineType lt, // // Loop through the map // - for(it = m.begin(), r=1; it != m.end(); it++, r++) { + for(it = m.begin(), r=1; it != m.end(); it++) { // // Write the output STAT header columns @@ -3196,7 +3382,7 @@ void write_job_aggr_mpr_wind(STATAnalysisJob &job, STATLineType lt, job.hdr_name, job.hdr_value, lt); if(job.stat_out) { if(lt == stat_cnt || lt == stat_nbrcnt) shc.set_alpha(job.out_alpha); - write_header_cols(shc, job.stat_at, r); + write_header_cols(shc, job.stat_at, job.stat_row); } // @@ -3210,12 +3396,12 @@ void write_job_aggr_mpr_wind(STATAnalysisJob &job, STATLineType lt, if(lt == stat_vl1l2) { if(job.stat_out) { write_vl1l2_cols(it->second.vl1l2_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, "VL1L2:"); write_case_cols(it->first, at, r, c); - write_vl1l2_cols(it->second.vl1l2_info, at, r, c); + write_vl1l2_cols(it->second.vl1l2_info, at, r++, c); } } // @@ -3224,14 +3410,23 @@ void write_job_aggr_mpr_wind(STATAnalysisJob &job, STATLineType lt, else if(lt == stat_vcnt) { if(job.stat_out) { write_vcnt_cols(it->second.vl1l2_info, job.stat_at, - r, n_header_columns); + job.stat_row++, n_header_columns); } else { at.set_entry(r, c++, "VCNT:"); write_case_cols(it->first, at, r, c); - write_vcnt_cols(it->second.vl1l2_info, at, r, c); + write_vcnt_cols(it->second.vl1l2_info, at, r++, c); } } + // + // Unsupported line type + // + else { + mlog << Error << "\nwrite_job_aggr_mpr_wind() -> " + << "unsupported output line type \"" + << statlinetype_to_string(lt) << "\" requested.\n\n"; + throw(1); + } } // end for it return; @@ -3263,7 +3458,7 @@ void write_job_ramp(STATAnalysisJob &job, // Initialize to one header row int n_stat_row = 1; - int r_stat, r_ctc, r_cts, r_mpr; + int r_ctc, r_cts, r_mpr; // // Setup CTC output table @@ -3340,7 +3535,7 @@ void write_job_ramp(STATAnalysisJob &job, // // Loop through the map // - for(it = m.begin(), r_stat = r_ctc = r_cts = r_mpr = 1; it != m.end(); it++) { + for(it = m.begin(), r_ctc = r_cts = r_mpr = 1; it != m.end(); it++) { // // Nothing to do @@ -3662,16 +3857,16 @@ void write_job_ramp(STATAnalysisJob &job, // CTC line type if(job.out_line_type.has(stat_ctc_str)) { - write_header_cols(ctc_shc, job.stat_at, r_stat); - write_ctc_cols(cts_info, job.stat_at, r_stat, n_header_columns); - r_stat++; + write_header_cols(ctc_shc, job.stat_at, job.stat_row); + write_ctc_cols(cts_info, job.stat_at, + job.stat_row++, n_header_columns); } // CTS line type if(job.out_line_type.has(stat_cts_str)) { - write_header_cols(cts_shc, job.stat_at, r_stat); - write_cts_cols(cts_info, 0, job.stat_at, r_stat, n_header_columns); - r_stat++; + write_header_cols(cts_shc, job.stat_at, job.stat_row); + write_cts_cols(cts_info, 0, job.stat_at, + job.stat_row++, n_header_columns); } } @@ -4011,6 +4206,11 @@ void setup_table(AsciiTable &at, int n_hdr_cols, int prec) { void write_table(AsciiTable &at, ofstream *sa_out) { + // + // Do not write an empty table + // + if(at.nrows() == 0 && at.ncols() == 0) return; + if(sa_out) *(sa_out) << at << "\n" << flush; else cout << at << "\n" << flush; @@ -4596,3 +4796,10 @@ void write_case_cols(const ConcatString &cs, AsciiTable &at, } //////////////////////////////////////////////////////////////////////// + +bool has_line_type(const vector &v, + const STATLineType lt) { + return(std::find(v.begin(), v.end(), lt) != v.end()); +} + +//////////////////////////////////////////////////////////////////////// diff --git a/test/config/STATAnalysisConfig_point_stat b/test/config/STATAnalysisConfig_point_stat index 68e1d17901..4d1a402a26 100644 --- a/test/config/STATAnalysisConfig_point_stat +++ b/test/config/STATAnalysisConfig_point_stat @@ -72,7 +72,7 @@ weight = []; // jobs = [ "-job aggregate_stat -fcst_var TMP -fcst_lev Z2 \ - -line_type MPR -out_line_type CNT \ + -line_type MPR -out_line_type CNT,SL1L2 -out_thresh NA,gt273 \ -dump_row ${OUTPUT_DIR}/CONFIG_POINT_STAT_agg_stat_mpr_to_cnt_dump.stat \ -out_stat ${OUTPUT_DIR}/CONFIG_POINT_STAT_agg_stat_mpr_to_cnt_out.stat \ -set_hdr VX_MASK CONUS", @@ -88,8 +88,8 @@ jobs = [ -out_wind_thresh >0 -out_wind_logic INTERSECTION \ -dump_row ${OUTPUT_DIR}/CONFIG_POINT_STAT_agg_stat_mpr_to_wdir_dump.stat", "-job aggregate_stat -fcst_var TMP -fcst_lev Z2 \ - -line_type MPR -out_line_type ECLV \ - -out_thresh >273 -out_eclv_points 0.1", + -line_type MPR -out_line_type ECLV,CTC,CTS \ + -out_thresh >273,>278 -out_eclv_points 0.1", "-job filter -fcst_var TMP -fcst_lev Z2 \ -line_type MPR -mask_sid ${CONFIG_DIR}/SID_CO.txt \ -dump_row ${OUTPUT_DIR}/CONFIG_POINT_STAT_filter_mpr_sid.stat", diff --git a/test/xml/unit_stat_analysis.xml b/test/xml/unit_stat_analysis.xml index 1558d101fd..93ef98b5bc 100644 --- a/test/xml/unit_stat_analysis.xml +++ b/test/xml/unit_stat_analysis.xml @@ -90,39 +90,21 @@ - + &MET_BIN;/stat_analysis \ -lookin &OUTPUT_DIR;/ensemble_stat/ensemble_stat_CMD_LINE_20120410_120000V.stat \ - -job aggregate_stat -line_type ORANK -out_line_type RHIST \ - -fcst_var APCP_24 -vx_mask NWC -vx_mask GRB \ - -dump_row &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_RHIST_dump.stat \ - -out_stat &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_RHIST_out.stat \ - -out &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_RHIST.out \ - -v 1 - - - &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_RHIST_dump.stat - &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_RHIST_out.stat - &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_RHIST.out - - - - - &MET_BIN;/stat_analysis - \ - -lookin &OUTPUT_DIR;/ensemble_stat/ensemble_stat_CMD_LINE_20120410_120000V.stat \ - -job aggregate_stat -line_type ORANK -out_line_type PHIST \ + -job aggregate_stat -line_type ORANK -out_line_type RHIST,PHIST \ -fcst_var APCP_24 -vx_mask NWC -vx_mask GRB -out_bin_size 0.10 \ - -dump_row &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_PHIST_dump.stat \ - -out_stat &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_PHIST_out.stat \ - -out &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_PHIST.out \ + -dump_row &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_RHIST_PHIST_dump.stat \ + -out_stat &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_RHIST_PHIST_out.stat \ + -out &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_RHIST_PHIST.out \ -v 1 - &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_PHIST_dump.stat - &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_PHIST_out.stat - &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_PHIST.out + &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_RHIST_PHIST_dump.stat + &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_RHIST_PHIST_out.stat + &OUTPUT_DIR;/stat_analysis/AGG_STAT_ORANK_RHIST_PHIST.out From 909c80bb672b4331165de696e7513464aec541e3 Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Fri, 16 Apr 2021 15:05:54 -0600 Subject: [PATCH 104/165] Per #1753, this one change to write_tmp_data.py solves this problem. When creating the variable to write the temp NetCDF file, we just need to pass through the fill value for the data. Also, make the script less verbose. --- met/data/wrappers/write_tmp_dataplane.py | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/met/data/wrappers/write_tmp_dataplane.py b/met/data/wrappers/write_tmp_dataplane.py index b5a1b24995..83a2042708 100644 --- a/met/data/wrappers/write_tmp_dataplane.py +++ b/met/data/wrappers/write_tmp_dataplane.py @@ -13,13 +13,7 @@ import importlib.util import netCDF4 as nc -print('Python Script:\t', sys.argv[0]) -print('User Command:\t', sys.argv[2:]) - netcdf_filename = sys.argv[1] - -print('Write NetCDF:\t', netcdf_filename) - pyembed_module_name = sys.argv[2] sys.argv = sys.argv[2:] @@ -44,25 +38,25 @@ attrs = met_in.attrs met_info['attrs'] = attrs -print('write_tmp_dataplane') -print(met_info) - # write NetCDF file ds = nc.Dataset(netcdf_filename, 'w') +# create dimensions and variable nx, ny = met_in.met_data.shape ds.createDimension('x', nx) ds.createDimension('y', ny) -dp = ds.createVariable('met_data', met_in.met_data.dtype, ('x', 'y')) +dp = ds.createVariable('met_data', met_in.met_data.dtype, ('x', 'y'), + fill_value=met_in.met_data.get_fill_value()) dp[:] = met_in.met_data +# append attributes for attr, attr_val in met_info['attrs'].items(): - print(attr, attr_val, type(attr_val)) if attr == 'name': setattr(ds, 'name_str', attr_val) - elif type(attr_val) == str: - setattr(ds, attr, attr_val) elif type(attr_val) == dict: for key in attr_val: setattr(ds, attr + '.' + key, attr_val[key]) + else: + setattr(ds, attr, attr_val) + ds.close() From ad553d7b5535d3b0806139981e6a25418f17b692 Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Fri, 16 Apr 2021 15:06:27 -0600 Subject: [PATCH 105/165] Per #1753, make the read_tmp_dataplane.py script less verbose. --- met/data/wrappers/read_tmp_dataplane.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/met/data/wrappers/read_tmp_dataplane.py b/met/data/wrappers/read_tmp_dataplane.py index c6f8f57a9c..09e2530ef0 100644 --- a/met/data/wrappers/read_tmp_dataplane.py +++ b/met/data/wrappers/read_tmp_dataplane.py @@ -10,11 +10,8 @@ import numpy as np import netCDF4 as nc -print('Python Script:\t', sys.argv[0]) met_info = {} - netcdf_filename = sys.argv[1] -print('Read NetCDF:\t', netcdf_filename) # read NetCDF file ds = nc.Dataset(netcdf_filename, 'r') @@ -32,4 +29,4 @@ del met_attrs['name_str'] met_info['met_data'] = met_data met_info['attrs'] = met_attrs -print(met_info) + From e4134abfb76f70f95e0c272467f470ee612f5970 Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Fri, 16 Apr 2021 15:08:12 -0600 Subject: [PATCH 106/165] Per #1753, there are 3 calls to the user's python version throughout MET. Update all 3 to print consistent log message when writing/reading the temp file. In particular, print the system command that is being executed at Debug(4) to make it easier to replicate python embedding problems that may arise. --- met/src/basic/vx_util/python_line.cc | 21 ++++++++++++------- .../vx_data2d_python/python_dataplane.cc | 9 +++++--- .../tools/other/ascii2nc/python_handler.cc | 6 ++++++ 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/met/src/basic/vx_util/python_line.cc b/met/src/basic/vx_util/python_line.cc index de9bcdc3b6..2f166d781a 100644 --- a/met/src/basic/vx_util/python_line.cc +++ b/met/src/basic/vx_util/python_line.cc @@ -242,8 +242,8 @@ sublist = PyList_GetItem(main_list, index); if ( ! sublist ) { - mlog << Error - << "\n\n PyLineDataFile::make_data_line() -> nul sublist pointer!\n\n"; + mlog << Error << "\nPyLineDataFile::make_data_line() ->" + << "nul sublist pointer!\n\n"; exit ( 1 ); @@ -255,8 +255,8 @@ if ( ! sublist ) { if ( ! PyList_Check(sublist) ) { - mlog << Error - << "\n\n PyLineDataFile::make_data_line() -> python object is not a list!\n\n"; + mlog << Error << "\nPyLineDataFile::make_data_line() ->" + << "python object is not a list!\n\n"; exit ( 1 ); @@ -336,8 +336,7 @@ if ( PyErr_Occurred() ) { PyErr_Print(); - mlog << Error - << "\nPyLineDataFile::do_straight() -> " + mlog << Error << "\nPyLineDataFile::do_straight() -> " << "an error occurred importing module " << '\"' << user_base.text() << "\"\n\n"; @@ -411,6 +410,9 @@ for (j=0; jread_pickle(list_name, pickle_path.text()); main_list = script->lookup(list_name); if ( ! main_list ) { - mlog << Error - << "\n\n PyLineDataFile::do_pickle() -> nul main list pointer!\n\n"; + mlog << Error << "\nPyLineDataFile::do_pickle() ->" + << "nul main list pointer!\n\n"; exit ( 1 ); diff --git a/met/src/libcode/vx_data2d_python/python_dataplane.cc b/met/src/libcode/vx_data2d_python/python_dataplane.cc index 8f70af5109..8280c99fe5 100644 --- a/met/src/libcode/vx_data2d_python/python_dataplane.cc +++ b/met/src/libcode/vx_data2d_python/python_dataplane.cc @@ -317,6 +317,9 @@ for (j=1; j Date: Fri, 16 Apr 2021 16:08:09 -0600 Subject: [PATCH 107/165] Per #1753, wrap the call to get_fill_value() in a try block in case the input in a regular numpy array instead of a masked array. --- met/data/wrappers/write_tmp_dataplane.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/met/data/wrappers/write_tmp_dataplane.py b/met/data/wrappers/write_tmp_dataplane.py index 83a2042708..b9194b2920 100644 --- a/met/data/wrappers/write_tmp_dataplane.py +++ b/met/data/wrappers/write_tmp_dataplane.py @@ -38,6 +38,12 @@ attrs = met_in.attrs met_info['attrs'] = attrs +# determine fill value +try: + fill = met_data.get_fill_value() +except: + fill = -9999. + # write NetCDF file ds = nc.Dataset(netcdf_filename, 'w') @@ -45,8 +51,7 @@ nx, ny = met_in.met_data.shape ds.createDimension('x', nx) ds.createDimension('y', ny) -dp = ds.createVariable('met_data', met_in.met_data.dtype, ('x', 'y'), - fill_value=met_in.met_data.get_fill_value()) +dp = ds.createVariable('met_data', met_in.met_data.dtype, ('x', 'y'), fill_value=fill) dp[:] = met_in.met_data # append attributes From 55aa8f73e8847f297d6631aa768dc7382123ddba Mon Sep 17 00:00:00 2001 From: johnhg Date: Thu, 22 Apr 2021 10:43:34 -0600 Subject: [PATCH 108/165] Per #1620, correct bug in read_ascii_mpr.py script. The MPR line type has 37 columns in it, not 36! (#1760) --- met/scripts/python/read_ascii_mpr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/met/scripts/python/read_ascii_mpr.py b/met/scripts/python/read_ascii_mpr.py index 9a4a84f890..781485c58c 100755 --- a/met/scripts/python/read_ascii_mpr.py +++ b/met/scripts/python/read_ascii_mpr.py @@ -22,7 +22,7 @@ # Read MPR lines, skipping the header row and first column. mpr_data = pd.read_csv(input_file, header=None, delim_whitespace=True, keep_default_na=False, - skiprows=1, usecols=range(1,36), + skiprows=1, usecols=range(1,37), dtype=str).values.tolist() print("Data Length:\t" + repr(len(mpr_data))) print("Data Type:\t" + repr(type(mpr_data))) From 9d8ee066fa82b14b5dabb90b616b8091df9e7a7b Mon Sep 17 00:00:00 2001 From: johnhg Date: Mon, 26 Apr 2021 09:36:51 -0600 Subject: [PATCH 109/165] Feature 1700 python (#1765) * Per #1700, no real change, removing extra newline. * Per #1700, move global_python.h from vx_data2d_python over to the vx_python3_utils library where it belongs better. * Per #1700, no code changes. Just removing commented out code. * Per #1700, lots of little changes to make the python scripts consistent, updating the write*.py functions to add the user script directory to the system path, and remove extraneous log messages. * Per #1700, rename generic_python.py to set_python_env.py. Still actually need to change the source code to handle this change! * Per #1700 remove the pickle import. * Per #1700, work in progress. Replaced pickle file with tmp file. * Per #1700, work in progress. Replaced pickle file with tmp file. * Per #1700, update read_tmp_ascii.py to work for both ascii2nc and stat_analysis. Just create an object named ascii_data and have both instances read it. * Per #1700, getting closer. Work in progress. Just need to get user-python embedding working for stat-analysis. * Per #1700, removing extraneous cout. * Per #1700, fix logic in PyLineDataFile::do_tmp_ascii() to get stat_analysis python embedding working again. * Per #1700, just comments. * Per #1700, replace references to pickle with user_python * Per #1700, update documentation to replace pickle with temp files. --- met/data/wrappers/Makefile.am | 9 +-- met/data/wrappers/generic_pickle.py | 10 --- met/data/wrappers/read_tmp_ascii.py | 17 ++--- .../{generic_python.py => set_python_env.py} | 4 +- met/data/wrappers/write_pickle_mpr.py | 33 --------- met/data/wrappers/write_tmp_dataplane.py | 4 + met/data/wrappers/write_tmp_mpr.py | 39 ++++++++++ met/data/wrappers/write_tmp_point.py | 17 +++-- met/docs/Users_Guide/appendixF.rst | 6 +- met/scripts/python/read_ascii_mpr.py | 2 +- met/scripts/python/read_ascii_numpy.py | 2 +- met/scripts/python/read_ascii_numpy_grid.py | 2 +- met/scripts/python/read_ascii_point.py | 2 +- met/scripts/python/read_ascii_xarray.py | 2 +- met/src/basic/vx_util/data_line.cc | 69 ++++------------- met/src/basic/vx_util/python_line.cc | 62 ++++++++-------- met/src/basic/vx_util/python_line.h | 4 +- met/src/libcode/vx_data2d_python/Makefile.am | 3 +- met/src/libcode/vx_python3_utils/Makefile.am | 3 +- .../global_python.h | 0 .../vx_python3_utils/python3_script.cc | 74 +++++++------------ .../libcode/vx_python3_utils/python3_script.h | 2 - .../libcode/vx_python3_utils/python3_util.cc | 4 - met/src/libcode/vx_statistics/pair_base.cc | 3 +- .../tools/core/stat_analysis/stat_analysis.cc | 2 + met/src/tools/other/ascii2nc/ascii2nc.cc | 3 +- .../tools/other/ascii2nc/python_handler.cc | 18 +++-- met/src/tools/other/ascii2nc/python_handler.h | 5 +- test/xml/unit_python.xml | 24 +++--- 29 files changed, 184 insertions(+), 241 deletions(-) delete mode 100644 met/data/wrappers/generic_pickle.py rename met/data/wrappers/{generic_python.py => set_python_env.py} (63%) delete mode 100644 met/data/wrappers/write_pickle_mpr.py create mode 100644 met/data/wrappers/write_tmp_mpr.py rename met/src/libcode/{vx_data2d_python => vx_python3_utils}/global_python.h (100%) diff --git a/met/data/wrappers/Makefile.am b/met/data/wrappers/Makefile.am index f3518fa27b..d2f83ff125 100644 --- a/met/data/wrappers/Makefile.am +++ b/met/data/wrappers/Makefile.am @@ -21,13 +21,12 @@ SUBDIRS = wrappersdir = $(pkgdatadir)/wrappers wrappers_DATA = \ - generic_python.py \ - generic_pickle.py \ + set_python_env.py \ read_tmp_dataplane.py \ - write_tmp_dataplane.py \ - write_pickle_mpr.py \ read_tmp_ascii.py \ - write_tmp_point.py + write_tmp_dataplane.py \ + write_tmp_point.py \ + write_tmp_mpr.py EXTRA_DIST = ${wrappers_DATA} diff --git a/met/data/wrappers/generic_pickle.py b/met/data/wrappers/generic_pickle.py deleted file mode 100644 index 2ea1528f56..0000000000 --- a/met/data/wrappers/generic_pickle.py +++ /dev/null @@ -1,10 +0,0 @@ -######################################################################## -# -# When MET_PYTHON_EXE is defined, this script initializes the Python -# environment for reading the temporary pickle file back into MET. -# -######################################################################## - -import sys -import numpy as np -import pickle diff --git a/met/data/wrappers/read_tmp_ascii.py b/met/data/wrappers/read_tmp_ascii.py index b4f4303044..66c008e3cd 100644 --- a/met/data/wrappers/read_tmp_ascii.py +++ b/met/data/wrappers/read_tmp_ascii.py @@ -8,6 +8,8 @@ Message_Type, Station_ID, Valid_Time, Lat, Lon, Elevation, GRIB_Code or Variable_Name, Level, Height, QC_String, Observation_Value +MPR format: See documentation of the MPR line type + Version Date 1.0.0 2021/02/18 David Fillmore Initial version """ @@ -18,25 +20,22 @@ import argparse -point_data = None - def read_tmp_ascii(filename): """ Arguments: - filename (string): temporary file created by write_tmp_point.py + filename (string): temporary file created by write_tmp_point.py or write_tmp_mpr.py Returns: - (list of lists): point data + (list of lists): point or mpr data """ - print('read_tmp_ascii:' + filename) f = open(filename, 'r') lines = f.readlines() f.close() - global point_data - point_data = [eval(line.strip('\n')) for line in lines] - - return point_data + global ascii_data + ascii_data = [eval(line.strip('\n')) for line in lines] + + return ascii_data if __name__ == '__main__': """ diff --git a/met/data/wrappers/generic_python.py b/met/data/wrappers/set_python_env.py similarity index 63% rename from met/data/wrappers/generic_python.py rename to met/data/wrappers/set_python_env.py index b436b6325a..5b6c2743c2 100644 --- a/met/data/wrappers/generic_python.py +++ b/met/data/wrappers/set_python_env.py @@ -1,11 +1,9 @@ ######################################################################## # -# When MET_PYTHON_EXE is not defined, this script initializes -# MET's python runtime environment. +# This script initializes MET's python runtime environment. # ######################################################################## import os import sys import numpy as np -import pickle diff --git a/met/data/wrappers/write_pickle_mpr.py b/met/data/wrappers/write_pickle_mpr.py deleted file mode 100644 index 2e3f2d0d04..0000000000 --- a/met/data/wrappers/write_pickle_mpr.py +++ /dev/null @@ -1,33 +0,0 @@ -######################################################################## -# -# Adapted from a script provided by George McCabe -# Adapted by Randy Bullock -# -# usage: /path/to/python write_pickle_mpr.py \ -# pickle_output_filename .py -# -######################################################################## - -import os -import sys -import pickle -import importlib.util - -print('Python Script:\t', sys.argv[0]) -print('User Command:\t', sys.argv[2:]) -print('Write Pickle:\t', sys.argv[1]) - -pickle_filename = sys.argv[1] - -pyembed_module_name = sys.argv[2] -sys.argv = sys.argv[2:] - -user_base = os.path.basename(pyembed_module_name).replace('.py','') - -spec = importlib.util.spec_from_file_location(user_base, pyembed_module_name) -met_in = importlib.util.module_from_spec(spec) -spec.loader.exec_module(met_in) - -print(met_in) - -pickle.dump( met_in.mpr_data, open( pickle_filename, "wb" ) ) diff --git a/met/data/wrappers/write_tmp_dataplane.py b/met/data/wrappers/write_tmp_dataplane.py index b9194b2920..ff254bf978 100644 --- a/met/data/wrappers/write_tmp_dataplane.py +++ b/met/data/wrappers/write_tmp_dataplane.py @@ -13,6 +13,10 @@ import importlib.util import netCDF4 as nc +print("Python Script:\t" + repr(sys.argv[0])) +print("User Command:\t" + repr(' '.join(sys.argv[2:]))) +print("Temporary File:\t" + repr(sys.argv[1])) + netcdf_filename = sys.argv[1] pyembed_module_name = sys.argv[2] sys.argv = sys.argv[2:] diff --git a/met/data/wrappers/write_tmp_mpr.py b/met/data/wrappers/write_tmp_mpr.py new file mode 100644 index 0000000000..ed0f4f0675 --- /dev/null +++ b/met/data/wrappers/write_tmp_mpr.py @@ -0,0 +1,39 @@ +######################################################################## +# +# Adapted from a script provided by George McCabe +# Adapted by Randy Bullock +# +# usage: /path/to/python write_tmp_mpr.py \ +# tmp_output_filename .py +# +######################################################################## + +import os +import sys +import importlib.util + +print("Python Script:\t" + repr(sys.argv[0])) +print("User Command:\t" + repr(' '.join(sys.argv[2:]))) +print("Temporary File:\t" + repr(sys.argv[1])) + +tmp_filename = sys.argv[1] +pyembed_module_name = sys.argv[2] +sys.argv = sys.argv[2:] + +# append user script dir to system path +pyembed_dir, pyembed_file = os.path.split(pyembed_module_name) +if pyembed_dir: + sys.path.insert(0, pyembed_dir) + +if not pyembed_module_name.endswith('.py'): + pyembed_module_name += '.py' + +user_base = os.path.basename(pyembed_module_name).replace('.py','') + +spec = importlib.util.spec_from_file_location(user_base, pyembed_module_name) +met_in = importlib.util.module_from_spec(spec) +spec.loader.exec_module(met_in) + +f = open(tmp_filename, 'w') +for line in met_in.mpr_data: + f.write(str(line) + '\n') diff --git a/met/data/wrappers/write_tmp_point.py b/met/data/wrappers/write_tmp_point.py index 94f56cd3dd..b6cecddfbb 100644 --- a/met/data/wrappers/write_tmp_point.py +++ b/met/data/wrappers/write_tmp_point.py @@ -4,7 +4,7 @@ # Adapted by Randy Bullock # # usage: /path/to/python write_tmp_point.py \ -# tmp_ascii_output_filename .py +# tmp_output_filename .py # ######################################################################## @@ -12,15 +12,22 @@ import sys import importlib.util -print('Python Script:\t', sys.argv[0]) -print('User Command:\t', sys.argv[2:]) -print('Write Temporary Ascii:\t', sys.argv[1]) +print("Python Script:\t" + repr(sys.argv[0])) +print("User Command:\t" + repr(' '.join(sys.argv[2:]))) +print("Temporary File:\t" + repr(sys.argv[1])) tmp_filename = sys.argv[1] - pyembed_module_name = sys.argv[2] sys.argv = sys.argv[2:] +# append user script dir to system path +pyembed_dir, pyembed_file = os.path.split(pyembed_module_name) +if pyembed_dir: + sys.path.insert(0, pyembed_dir) + +if not pyembed_module_name.endswith('.py'): + pyembed_module_name += '.py' + user_base = os.path.basename(pyembed_module_name).replace('.py','') spec = importlib.util.spec_from_file_location(user_base, pyembed_module_name) diff --git a/met/docs/Users_Guide/appendixF.rst b/met/docs/Users_Guide/appendixF.rst index a5e34df338..ee895a8166 100644 --- a/met/docs/Users_Guide/appendixF.rst +++ b/met/docs/Users_Guide/appendixF.rst @@ -35,11 +35,11 @@ The types of Python embedding supported in MET are described below. In all cases Setting this environment variable triggers slightly different processing logic in MET. Rather than executing the user-specified script with compiled Python instance directly, MET does the following: -1. Wrap the user's Python script and arguments with a wrapper script (write_pickle_mpr.py, write_pickle_point.py, or write_pickle_dataplane.py) and specify the name of a temporary file to be written. +1. Wrap the user's Python script and arguments with a wrapper script (write_tmp_mpr.py, write_tmp_point.py, or write_tmp_dataplane.py) and specify the name of a temporary file to be written. -2. Use a system call to the **MET_PYTHON_EXE** Python instance to execute these commands and write the resulting data objects to a temporary Python pickle file. +2. Use a system call to the **MET_PYTHON_EXE** Python instance to execute these commands and write the resulting data objects to a temporary ASCII or NetCDF file. -3. Use the compiled Python instance to read data from that temporary pickle file. +3. Use the compiled Python instance to run a wrapper script (read_tmp_ascii.py or read_tmp_dataplane.py) to read data from that temporary file. With this approach, users should be able to execute Python scripts in their own custom environments. diff --git a/met/scripts/python/read_ascii_mpr.py b/met/scripts/python/read_ascii_mpr.py index 781485c58c..4a8c988405 100755 --- a/met/scripts/python/read_ascii_mpr.py +++ b/met/scripts/python/read_ascii_mpr.py @@ -6,7 +6,7 @@ ######################################################################## -print('Python Script:\t', sys.argv[0]) +print("Python Script:\t" + repr(sys.argv[0])) ## ## input file specified on the command line diff --git a/met/scripts/python/read_ascii_numpy.py b/met/scripts/python/read_ascii_numpy.py index 70393db6d8..b7a1e081b4 100755 --- a/met/scripts/python/read_ascii_numpy.py +++ b/met/scripts/python/read_ascii_numpy.py @@ -6,7 +6,7 @@ ########################################### -print('Python Script:\t', sys.argv[0]) +print("Python Script:\t" + repr(sys.argv[0])) ## ## input file specified on the command line diff --git a/met/scripts/python/read_ascii_numpy_grid.py b/met/scripts/python/read_ascii_numpy_grid.py index 88d868a2ad..fa72cbff6b 100755 --- a/met/scripts/python/read_ascii_numpy_grid.py +++ b/met/scripts/python/read_ascii_numpy_grid.py @@ -6,7 +6,7 @@ ########################################### -print('Python Script:\t', sys.argv[0]) +print("Python Script:\t" + repr(sys.argv[0])) ## ## input file specified on the command line diff --git a/met/scripts/python/read_ascii_point.py b/met/scripts/python/read_ascii_point.py index d5521eb0ca..cfd37d272a 100755 --- a/met/scripts/python/read_ascii_point.py +++ b/met/scripts/python/read_ascii_point.py @@ -6,7 +6,7 @@ ######################################################################## -print('Python Script:\t', sys.argv[0]) +print("Python Script:\t" + repr(sys.argv[0])) ## ## input file specified on the command line diff --git a/met/scripts/python/read_ascii_xarray.py b/met/scripts/python/read_ascii_xarray.py index 0d15030f88..53f8574d48 100755 --- a/met/scripts/python/read_ascii_xarray.py +++ b/met/scripts/python/read_ascii_xarray.py @@ -7,7 +7,7 @@ ########################################### -print('Python Script:\t', sys.argv[0]) +print("Python Script:\t" + repr(sys.argv[0])) ## ## input file specified on the command line diff --git a/met/src/basic/vx_util/data_line.cc b/met/src/basic/vx_util/data_line.cc index da012b9a0a..16f275327e 100644 --- a/met/src/basic/vx_util/data_line.cc +++ b/met/src/basic/vx_util/data_line.cc @@ -193,18 +193,12 @@ out << prefix << "\n"; if ( N_items == 0 ) { out.flush(); return; } -// std::ostringstream sstream; -// sstream.width(2); - for (j=0; j(ldf); +PyLineDataFile * pldf = dynamic_cast(ldf); - if ( pldf ) { +if ( pldf ) { - const bool status = read_py_single_text_line(pldf); + const bool status = read_py_single_text_line(pldf); - return ( status ); + return ( status ); - } +} #endif /* WITH_PYTHON */ -//////////////////////////////////////////////////// ifstream & f = *(ldf->in); @@ -606,6 +587,7 @@ return ( true ); #endif /* WITH_PYTHON */ + //////////////////////////////////////////////////////////////////////// @@ -848,6 +830,7 @@ for (j=0; j " - << "pickle object is not a list!\n\n"; + << "tmp ascii object is not a list!\n\n"; exit ( 1 ); @@ -301,7 +303,7 @@ void PyLineDataFile::do_straight() ConcatString command, path, user_base; -path = generic_python_wrapper; +path = set_python_env_wrapper; mlog << Debug(3) << "PyLineDataFile::do_straight() -> " @@ -372,7 +374,13 @@ return; //////////////////////////////////////////////////////////////////////// -void PyLineDataFile::do_pickle() + // + // wrapper usage: /path/to/python wrapper.py + // tmp_output_filename user_script_name + // [ user_script args ... ] + // + +void PyLineDataFile::do_tmp_ascii() { @@ -380,7 +388,7 @@ int j; const int N = UserScriptArgs.n(); ConcatString command; ConcatString path; -ConcatString pickle_path; +ConcatString tmp_ascii_path; const char * tmp_dir = 0; int status; @@ -394,15 +402,16 @@ if ( ! tmp_dir ) tmp_dir = default_tmp_dir; path << cs_erase << tmp_dir << '/' - << pickle_base_name; + << tmp_base_name; -pickle_path = make_temp_file_name(path.text(), 0); +tmp_ascii_path = make_temp_file_name(path.text(), 0); +tmp_ascii_path << ".txt"; command << cs_erase - << UserPathToPython << ' ' // user's path to python - << replace_path(write_pickle_wrapper) << ' ' // write_pickle.py - << pickle_path << ' ' // pickle output filename - << UserScriptPath; // user's script name + << UserPathToPython << ' ' // user's path to python + << replace_path(write_tmp_mpr_wrapper) << ' ' // write_tmp_mpr.py + << tmp_ascii_path << ' ' // temporary ascii output filename + << UserScriptPath; // user's script name for (j=0; j " + mlog << Error << "\nPyLineDataFile::do_tmp_ascii() -> " << "command \"" << command.text() << "\" failed ... status = " << status << "\n\n"; @@ -427,31 +436,24 @@ if ( status ) { ConcatString wrapper; -wrapper = generic_pickle_wrapper; +wrapper = set_python_env_wrapper; script = new Python3_Script (wrapper.text()); mlog << Debug(4) << "Reading temporary Python line data file: " - << pickle_path << "\n"; - -script->read_pickle(list_name, pickle_path.text()); + << tmp_ascii_path << "\n"; -main_list = script->lookup(list_name); +script->import_read_tmp_ascii_py(); -if ( ! main_list ) { +PyObject * dobj = script->read_tmp_ascii(tmp_ascii_path.text()); - mlog << Error << "\nPyLineDataFile::do_pickle() ->" - << "nul main list pointer!\n\n"; - - exit ( 1 ); - -} +main_list = script->lookup_ascii(tmp_list_name); // // cleanup // -remove_temp_file(pickle_path); +remove_temp_file(tmp_ascii_path); // // done diff --git a/met/src/basic/vx_util/python_line.h b/met/src/basic/vx_util/python_line.h index b5a51bd230..5f994a144d 100644 --- a/met/src/basic/vx_util/python_line.h +++ b/met/src/basic/vx_util/python_line.h @@ -52,8 +52,8 @@ class PyLineDataFile : public LineDataFile { ConcatString UserPathToPython; - void do_straight (); // straight-up python, no pickle - void do_pickle (); // pickle + void do_straight (); // run compiled python interpreter + void do_tmp_ascii(); // run user-defined MET_PYTHON_EXE ConcatString make_header_line () const; ConcatString make_data_line (); diff --git a/met/src/libcode/vx_data2d_python/Makefile.am b/met/src/libcode/vx_data2d_python/Makefile.am index ae3d3c21d3..185dd5d548 100644 --- a/met/src/libcode/vx_data2d_python/Makefile.am +++ b/met/src/libcode/vx_data2d_python/Makefile.am @@ -17,7 +17,6 @@ libvx_data2d_python_a_SOURCES = \ grid_from_python_dict.h grid_from_python_dict.cc \ python_dataplane.h python_dataplane.cc \ data2d_python.h data2d_python.cc \ - var_info_python.h var_info_python.cc \ - global_python.h + var_info_python.h var_info_python.cc libvx_data2d_python_a_CPPFLAGS = ${MET_CPPFLAGS} -I../vx_python2_utils ${MET_PYTHON_CC} $(MET_PYTHON_LD) diff --git a/met/src/libcode/vx_python3_utils/Makefile.am b/met/src/libcode/vx_python3_utils/Makefile.am index 0f45bb5214..3d0941ec47 100644 --- a/met/src/libcode/vx_python3_utils/Makefile.am +++ b/met/src/libcode/vx_python3_utils/Makefile.am @@ -22,5 +22,6 @@ libvx_python3_utils_a_SOURCES = \ python3_script.h python3_script.cc \ python3_numpy.h python3_numpy.cc \ python3_util.h python3_util.cc \ - vx_python3_utils.h + vx_python3_utils.h \ + global_python.h libvx_python3_utils_a_CPPFLAGS = ${MET_CPPFLAGS} ${CPPFLAGS} ${MET_PYTHON_CC} $(MET_PYTHON_LD) diff --git a/met/src/libcode/vx_data2d_python/global_python.h b/met/src/libcode/vx_python3_utils/global_python.h similarity index 100% rename from met/src/libcode/vx_data2d_python/global_python.h rename to met/src/libcode/vx_python3_utils/global_python.h diff --git a/met/src/libcode/vx_python3_utils/python3_script.cc b/met/src/libcode/vx_python3_utils/python3_script.cc index 7bd567ae2c..d9ac7f41e5 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.cc +++ b/met/src/libcode/vx_python3_utils/python3_script.cc @@ -165,8 +165,10 @@ return ( var ); } + //////////////////////////////////////////////////////////////////////// + PyObject * Python3_Script::lookup_ascii(const char * name) const { @@ -175,10 +177,30 @@ PyObject * var = 0; var = PyDict_GetItemString (DictAscii, name); +if ( ! var ) { + + mlog << Error << "\nPython3_Script::lookup_ascii(const char * name) -> " + << "value for name \"" << name << "\" not found\n\n"; + + + exit ( 1 ); + +} + +if ( ! PyList_Check(var) ) { + + mlog << Error << "\nPython3_Script::lookup_ascii(const char * name) -> " + << "value for name \"" << name << "\" not a python list\n\n"; + + exit ( 1 ); + +} + return ( var ); } + //////////////////////////////////////////////////////////////////////// @@ -219,46 +241,6 @@ return pobj; //////////////////////////////////////////////////////////////////////// - // - // example: - // - // data = pickle.load( open( "save.p", "rb" ) ) - // - - -void Python3_Script::read_pickle(const char * variable, const char * pickle_filename) const - -{ - -mlog << Debug(3) << "Reading temporary pickle file: " - << pickle_filename << "\n"; - -ConcatString command; - -command << variable - << " = pickle.load(open(\"" - << pickle_filename - << "\", \"rb\"))"; - -PyErr_Clear(); - -run(command.text()); - -if ( PyErr_Occurred() ) { - - mlog << Error << "\nPython3_Script::read_pickle() -> " - << "command \"" << command << "\" failed!\n\n"; - - exit ( 1 ); - -} - -return; - -} - -//////////////////////////////////////////////////////////////////////// - void Python3_Script::import_read_tmp_ascii_py(void) { @@ -310,8 +292,10 @@ fflush(stderr); } + //////////////////////////////////////////////////////////////////////// + PyObject* Python3_Script::read_tmp_ascii(const char * tmp_filename) const { @@ -325,8 +309,6 @@ command << "read_tmp_ascii(\"" << tmp_filename << "\")"; -mlog << Debug(3) << command << "\n"; - PyErr_Clear(); PyObject * pobj; @@ -341,15 +323,11 @@ if ( PyErr_Occurred() ) { exit ( 1 ); } -PyTypeObject* type = pobj->ob_type; - -const char* p = type->tp_name; - -mlog << Debug(2) << "read_tmp_ascii return type: " << p << "\n"; - return pobj; + } + //////////////////////////////////////////////////////////////////////// diff --git a/met/src/libcode/vx_python3_utils/python3_script.h b/met/src/libcode/vx_python3_utils/python3_script.h index 6930d226a5..1174385c15 100644 --- a/met/src/libcode/vx_python3_utils/python3_script.h +++ b/met/src/libcode/vx_python3_utils/python3_script.h @@ -83,8 +83,6 @@ class Python3_Script { PyObject * run(const char * command) const; // runs a command in the namespace of the script - void read_pickle (const char * variable_name, const char * pickle_filename) const; - void import_read_tmp_ascii_py (void); PyObject * read_tmp_ascii (const char * tmp_filename) const; diff --git a/met/src/libcode/vx_python3_utils/python3_util.cc b/met/src/libcode/vx_python3_utils/python3_util.cc index 82990d8999..fe56b6f6b2 100644 --- a/met/src/libcode/vx_python3_utils/python3_util.cc +++ b/met/src/libcode/vx_python3_utils/python3_util.cc @@ -117,7 +117,6 @@ if ( PyLong_Check(obj) ) { // long? } - return ( k ); } @@ -154,7 +153,6 @@ if ( PyLong_Check(obj) ) { // long? } - return ( x ); } @@ -205,8 +203,6 @@ if ( PyUnicode_Check(obj) ) { // string? mlog << Error << "\npyobject_as_concat_string(PyObject *) -> " << "bad object type\n\n"; - cout << "\n\n pyobject_as_concat_string: obj = " << obj << "\n\n" << flush; - exit ( 1 ); } diff --git a/met/src/libcode/vx_statistics/pair_base.cc b/met/src/libcode/vx_statistics/pair_base.cc index 0fe6a1b006..1061423e25 100644 --- a/met/src/libcode/vx_statistics/pair_base.cc +++ b/met/src/libcode/vx_statistics/pair_base.cc @@ -496,8 +496,7 @@ void PairBase::set_point_obs(int i_obs, const char *sid, if(i_obs < 0 || i_obs >= n_obs) { mlog << Error << "\nPairBase::set_point_obs() -> " << "range check error: " << i_obs << " not in (0, " - << n_obs << ").\n\n" - ; + << n_obs << ").\n\n"; exit(1); } diff --git a/met/src/tools/core/stat_analysis/stat_analysis.cc b/met/src/tools/core/stat_analysis/stat_analysis.cc index c3d6788b71..02365d1525 100644 --- a/met/src/tools/core/stat_analysis/stat_analysis.cc +++ b/met/src/tools/core/stat_analysis/stat_analysis.cc @@ -39,6 +39,8 @@ // 010 07/26/18 Halley Gotway Support masks from gen_vx_mask. // 011 10/14/19 Halley Gotway Add support for climo distribution // percentile thresholds. +// 012 04/25/21 Halley Gotway Replace pickle files for temporary +// ascii. // //////////////////////////////////////////////////////////////////////// diff --git a/met/src/tools/other/ascii2nc/ascii2nc.cc b/met/src/tools/other/ascii2nc/ascii2nc.cc index 360329659c..6df5e2ba97 100644 --- a/met/src/tools/other/ascii2nc/ascii2nc.cc +++ b/met/src/tools/other/ascii2nc/ascii2nc.cc @@ -43,7 +43,8 @@ // 015 03-20-19 Fillmore Add aeronetv2 and aeronetv3 options. // 016 01-30-20 Bullock Add python option. // 017 01-25-21 Halley Gotway MET #1630 Handle zero obs. -// 018 03-01-21 Fillmore Replace pickle files for temporary ascii. +// 018 03-01-21 Fillmore Replace pickle files for temporary +// ascii. // //////////////////////////////////////////////////////////////////////// diff --git a/met/src/tools/other/ascii2nc/python_handler.cc b/met/src/tools/other/ascii2nc/python_handler.cc index 09c7b90d2c..2f3a0927c9 100644 --- a/met/src/tools/other/ascii2nc/python_handler.cc +++ b/met/src/tools/other/ascii2nc/python_handler.cc @@ -26,12 +26,14 @@ using namespace std; //////////////////////////////////////////////////////////////////////// -static const char generic_python_wrapper [] = "generic_python"; +static const char set_python_env_wrapper [] = "set_python_env"; static const char write_tmp_ascii_wrapper[] = "MET_BASE/wrappers/write_tmp_point.py"; static const char list_name [] = "point_data"; +static const char tmp_list_name [] = "ascii_data"; + static const char tmp_base_name [] = "tmp_ascii2nc"; @@ -230,8 +232,8 @@ bool PythonHandler::readAsciiFiles(const vector< ConcatString > &ascii_filename_ bool status = false; -if ( use_tmp_ascii ) status = do_tmp_ascii (); -else status = do_straight (); +if ( use_tmp_ascii ) status = do_tmp_ascii (); +else status = do_straight (); return ( status ); @@ -247,7 +249,7 @@ bool PythonHandler::do_straight() ConcatString command, path, user_base; -path = generic_python_wrapper; +path = set_python_env_wrapper; mlog << Debug(3) << "Running user's python script (" @@ -319,7 +321,9 @@ return ( true ); // - // wrapper usage: /path/to/python wrapper.py tmp_output_filename user_script_name [ user_script args ... ] + // wrapper usage: /path/to/python wrapper.py + // tmp_output_filename user_script_name + // [ user_script args ... ] // bool PythonHandler::do_tmp_ascii() @@ -378,7 +382,7 @@ if ( status ) { ConcatString wrapper; -wrapper = generic_python_wrapper; +wrapper = set_python_env_wrapper; Python3_Script script(wrapper.text()); @@ -389,7 +393,7 @@ script.import_read_tmp_ascii_py(); PyObject * dobj = script.read_tmp_ascii(tmp_ascii_path.text()); -PyObject * obj = script.lookup_ascii(list_name); +PyObject * obj = script.lookup_ascii(tmp_list_name); if ( ! PyList_Check(obj) ) { diff --git a/met/src/tools/other/ascii2nc/python_handler.h b/met/src/tools/other/ascii2nc/python_handler.h index b0fb2ef492..695b8fcb96 100644 --- a/met/src/tools/other/ascii2nc/python_handler.h +++ b/met/src/tools/other/ascii2nc/python_handler.h @@ -68,12 +68,11 @@ class PythonHandler : public FileHandler virtual bool readAsciiFiles(const vector< ConcatString > &ascii_filename_list); - bool do_tmp_ascii(); - bool do_straight (); // straight-up python, no temporary ascii + bool do_straight (); // run compiled python interpreter + bool do_tmp_ascii(); // run user-defined MET_PYTHON_EXE void load_python_obs(PyObject *); // python object is list of lists - bool read_obs_from_script (const char * script_name, const char * variable_name); }; diff --git a/test/xml/unit_python.xml b/test/xml/unit_python.xml index 6ed8dfa9d8..572e2f925d 100644 --- a/test/xml/unit_python.xml +++ b/test/xml/unit_python.xml @@ -374,24 +374,24 @@ - - + + &MET_BIN;/ascii2nc MET_PYTHON_EXE &MET_PYTHON_EXE; \ "&MET_BASE;/python/read_ascii_point.py &MET_DATA;/sample_obs/ascii/sample_ascii_obs.txt" \ - &OUTPUT_DIR;/python/ascii2nc_pickle.nc \ + &OUTPUT_DIR;/python/ascii2nc_user_python.nc \ -format python - &OUTPUT_DIR;/python/ascii2nc_pickle.nc + &OUTPUT_DIR;/python/ascii2nc_user_python.nc - - + + export PATH='&ANACONDA_BIN;:${PATH}'; \ &MET_BIN;/plot_data_plane @@ -399,19 +399,19 @@ \ PYTHON_NUMPY \ - &OUTPUT_DIR;/python/letter_pickle.ps \ + &OUTPUT_DIR;/python/letter_user_python.ps \ 'name = "&MET_BASE;/python/read_ascii_numpy.py &DATA_DIR_PYTHON;/letter.txt LETTER";' \ -plot_range 0.0 255.0 \ -title "Python enabled plot_data_plane" \ -v 1 - &OUTPUT_DIR;/python/letter_pickle.ps + &OUTPUT_DIR;/python/letter_user_python.ps - - + + &MET_BIN;/stat_analysis MET_PYTHON_EXE &MET_PYTHON_EXE; @@ -419,10 +419,10 @@ \ -lookin python &MET_BASE;/python/read_ascii_mpr.py &OUTPUT_DIR;/python/point_stat_120000L_20050807_120000V.stat \ -job aggregate_stat -line_type MPR -out_line_type sl1l2 -by FCST_VAR \ - -out_stat &OUTPUT_DIR;/python/stat_analysis_pickle_AGGR_MPR_to_SL1L2.stat + -out_stat &OUTPUT_DIR;/python/stat_analysis_user_python_AGGR_MPR_to_SL1L2.stat - &OUTPUT_DIR;/python/stat_analysis_pickle_AGGR_MPR_to_SL1L2.stat + &OUTPUT_DIR;/python/stat_analysis_user_python_AGGR_MPR_to_SL1L2.stat From 43247deb8d677c9e95ef244af80aa356fe73ecb7 Mon Sep 17 00:00:00 2001 From: johnhg Date: Mon, 26 Apr 2021 12:40:01 -0600 Subject: [PATCH 110/165] Feature 1766 v10.0.0_beta5 (#1767) * Per #1766, udpate the release date and add release notes for v10.0.0-beta5. * Per #1766 and #1728, update the copyright notice year to 2021. --- met/README | 2 +- met/data/copyright_notice.txt | 2 +- met/docs/Users_Guide/release-notes.rst | 53 +++++++++++++++++++ met/docs/conf.py | 2 +- .../basic/vx_config/test_config.cc | 2 +- .../basic/vx_config/test_lookup.cc | 2 +- .../basic/vx_config/test_lookup2.cc | 2 +- .../basic/vx_config/test_lookup3.cc | 2 +- .../basic/vx_config/test_met_478.cc | 2 +- .../basic/vx_config/test_string.cc | 2 +- .../vx_config/test_string_then_config.cc | 2 +- .../basic/vx_config/test_thresh.cc | 2 +- .../basic/vx_config/test_user_func.cc | 2 +- .../basic/vx_log/test_logger.cc | 2 +- .../basic/vx_log/test_reg_exp.cc | 2 +- .../basic/vx_util/test_add_rows.cc | 2 +- .../basic/vx_util/test_ascii_header.cc | 2 +- .../basic/vx_util/test_command_line.cc | 2 +- .../basic/vx_util/test_data_plane.cc | 2 +- .../basic/vx_util/test_table_float.cc | 2 +- .../libcode/vx_data2d/dump_default_table.cc | 2 +- .../libcode/vx_data2d/test_table_read.cc | 2 +- .../libcode/vx_data2d_factory/test_factory.cc | 2 +- .../libcode/vx_data2d_factory/test_is_grib.cc | 2 +- .../libcode/vx_data2d_grib/test_read_grib1.cc | 2 +- .../vx_data2d_nc_met/test_read_nc_met.cc | 2 +- .../libcode/vx_data2d_nccf/test_read_nccf.cc | 2 +- .../libcode/vx_geodesy/test_spheroid.cc | 2 +- .../libcode/vx_grid/test_grid_area.cc | 2 +- .../vx_nc_util/test_pressure_levels.cc | 2 +- .../libcode/vx_physics/test_thermo.cc | 2 +- .../libcode/vx_plot_util/test_map_region.cc | 2 +- met/internal_tests/libcode/vx_ps/test_ps.cc | 2 +- .../vx_series_data/test_series_data.cc | 2 +- .../libcode/vx_solar/test_ra_dec.cc | 2 +- .../libcode/vx_tc_util/test_read.cc | 2 +- .../libcode/vx_tc_util/test_read_prob.cc | 2 +- .../libcode/vx_tc_util/test_read_rmw.cc | 2 +- .../other/mode_time_domain/test_velocity.cc | 2 +- met/src/basic/enum_to_string/code.cc | 2 +- met/src/basic/enum_to_string/code.h | 2 +- met/src/basic/enum_to_string/enum.tab.h | 2 +- .../basic/enum_to_string/enum_to_string.cc | 2 +- met/src/basic/enum_to_string/info.cc | 2 +- met/src/basic/enum_to_string/info.h | 2 +- met/src/basic/enum_to_string/scope.cc | 2 +- met/src/basic/enum_to_string/scope.h | 2 +- met/src/basic/vx_cal/date_to_mjd.cc | 2 +- met/src/basic/vx_cal/day_dif.cc | 2 +- met/src/basic/vx_cal/day_of_week.cc | 2 +- met/src/basic/vx_cal/doyhms_to_unix.cc | 2 +- met/src/basic/vx_cal/is_dst.cc | 2 +- met/src/basic/vx_cal/is_leap_year.cc | 2 +- met/src/basic/vx_cal/mdyhms_to_unix.cc | 2 +- met/src/basic/vx_cal/mjd_to_date.cc | 2 +- met/src/basic/vx_cal/time_array.cc | 2 +- met/src/basic/vx_cal/time_array.h | 2 +- met/src/basic/vx_cal/time_strings.cc | 2 +- met/src/basic/vx_cal/unix_string.cc | 2 +- met/src/basic/vx_cal/unix_to_mdyhms.cc | 2 +- met/src/basic/vx_cal/vx_cal.h | 2 +- met/src/basic/vx_config/builtin.cc | 2 +- met/src/basic/vx_config/builtin.h | 2 +- met/src/basic/vx_config/calculator.cc | 2 +- met/src/basic/vx_config/calculator.h | 2 +- met/src/basic/vx_config/config_constants.h | 2 +- met/src/basic/vx_config/config_file.cc | 2 +- met/src/basic/vx_config/config_file.h | 2 +- met/src/basic/vx_config/config_funcs.cc | 2 +- met/src/basic/vx_config/config_funcs.h | 2 +- met/src/basic/vx_config/config_gaussian.h | 2 +- met/src/basic/vx_config/config_util.cc | 2 +- met/src/basic/vx_config/config_util.h | 2 +- met/src/basic/vx_config/data_file_type.h | 2 +- met/src/basic/vx_config/dictionary.cc | 2 +- met/src/basic/vx_config/dictionary.h | 2 +- met/src/basic/vx_config/icode.cc | 2 +- met/src/basic/vx_config/icode.h | 2 +- met/src/basic/vx_config/idstack.cc | 2 +- met/src/basic/vx_config/idstack.h | 2 +- met/src/basic/vx_config/number_stack.cc | 2 +- met/src/basic/vx_config/number_stack.h | 2 +- met/src/basic/vx_config/object_types.h | 2 +- met/src/basic/vx_config/scanner_stuff.h | 2 +- met/src/basic/vx_config/temp_file.cc | 2 +- met/src/basic/vx_config/temp_file.h | 2 +- met/src/basic/vx_config/threshold.cc | 2 +- met/src/basic/vx_config/threshold.h | 2 +- met/src/basic/vx_config/vx_config.h | 2 +- met/src/basic/vx_log/concat_string.cc | 2 +- met/src/basic/vx_log/concat_string.h | 2 +- met/src/basic/vx_log/file_fxns.cc | 2 +- met/src/basic/vx_log/file_fxns.h | 2 +- met/src/basic/vx_log/indent.cc | 2 +- met/src/basic/vx_log/indent.h | 2 +- met/src/basic/vx_log/logger.cc | 2 +- met/src/basic/vx_log/logger.h | 2 +- met/src/basic/vx_log/string_array.cc | 2 +- met/src/basic/vx_log/string_array.h | 2 +- met/src/basic/vx_log/vx_log.h | 2 +- met/src/basic/vx_math/affine.cc | 2 +- met/src/basic/vx_math/affine.h | 2 +- met/src/basic/vx_math/angles.cc | 2 +- met/src/basic/vx_math/angles.h | 2 +- met/src/basic/vx_math/hist.cc | 2 +- met/src/basic/vx_math/hist.h | 2 +- met/src/basic/vx_math/is_bad_data.h | 2 +- met/src/basic/vx_math/legendre.cc | 2 +- met/src/basic/vx_math/legendre.h | 2 +- met/src/basic/vx_math/math_constants.h | 2 +- met/src/basic/vx_math/nint.cc | 2 +- met/src/basic/vx_math/nint.h | 2 +- met/src/basic/vx_math/nti.cc | 2 +- met/src/basic/vx_math/nti.h | 2 +- met/src/basic/vx_math/ptile.cc | 2 +- met/src/basic/vx_math/ptile.h | 2 +- met/src/basic/vx_math/pwl.cc | 2 +- met/src/basic/vx_math/pwl.h | 2 +- met/src/basic/vx_math/so3.cc | 2 +- met/src/basic/vx_math/so3.h | 2 +- met/src/basic/vx_math/trig.h | 2 +- met/src/basic/vx_math/vx_math.h | 2 +- met/src/basic/vx_math/vx_vector.cc | 2 +- met/src/basic/vx_math/vx_vector.h | 2 +- met/src/basic/vx_util/CircularTemplate.cc | 2 +- met/src/basic/vx_util/CircularTemplate.h | 2 +- met/src/basic/vx_util/GridOffset.cc | 2 +- met/src/basic/vx_util/GridOffset.h | 2 +- met/src/basic/vx_util/GridPoint.cc | 2 +- met/src/basic/vx_util/GridPoint.h | 2 +- met/src/basic/vx_util/GridTemplate.cc | 2 +- met/src/basic/vx_util/GridTemplate.h | 2 +- met/src/basic/vx_util/RectangularTemplate.cc | 2 +- met/src/basic/vx_util/RectangularTemplate.h | 2 +- met/src/basic/vx_util/ascii_header.cc | 2 +- met/src/basic/vx_util/ascii_header.h | 2 +- met/src/basic/vx_util/ascii_table.cc | 2 +- met/src/basic/vx_util/ascii_table.h | 2 +- met/src/basic/vx_util/bool_to_string.h | 2 +- met/src/basic/vx_util/check_endian.cc | 2 +- met/src/basic/vx_util/check_endian.h | 2 +- met/src/basic/vx_util/comma_string.cc | 2 +- met/src/basic/vx_util/comma_string.h | 2 +- met/src/basic/vx_util/command_line.cc | 2 +- met/src/basic/vx_util/command_line.h | 2 +- met/src/basic/vx_util/conversions.cc | 2 +- met/src/basic/vx_util/conversions.h | 2 +- met/src/basic/vx_util/crc_array.h | 2 +- met/src/basic/vx_util/crr_array.h | 2 +- met/src/basic/vx_util/data_cube.cc | 2 +- met/src/basic/vx_util/data_cube.h | 2 +- met/src/basic/vx_util/data_line.cc | 2 +- met/src/basic/vx_util/data_line.h | 2 +- met/src/basic/vx_util/data_plane.cc | 2 +- met/src/basic/vx_util/data_plane.h | 2 +- met/src/basic/vx_util/data_plane_util.cc | 2 +- met/src/basic/vx_util/data_plane_util.h | 2 +- met/src/basic/vx_util/empty_string.h | 2 +- met/src/basic/vx_util/file_exists.cc | 2 +- met/src/basic/vx_util/file_exists.h | 2 +- met/src/basic/vx_util/file_linecount.cc | 2 +- met/src/basic/vx_util/file_linecount.h | 2 +- met/src/basic/vx_util/file_size.cc | 2 +- met/src/basic/vx_util/file_size.h | 2 +- met/src/basic/vx_util/filename_suffix.cc | 2 +- met/src/basic/vx_util/filename_suffix.h | 2 +- met/src/basic/vx_util/fix_float.cc | 2 +- met/src/basic/vx_util/fix_float.h | 2 +- met/src/basic/vx_util/get_filenames.cc | 2 +- met/src/basic/vx_util/get_filenames.h | 2 +- met/src/basic/vx_util/grib_constants.cc | 2 +- met/src/basic/vx_util/grib_constants.h | 2 +- met/src/basic/vx_util/int_array.h | 2 +- met/src/basic/vx_util/interp_mthd.cc | 2 +- met/src/basic/vx_util/interp_mthd.h | 2 +- met/src/basic/vx_util/interp_util.cc | 2 +- met/src/basic/vx_util/interp_util.h | 2 +- met/src/basic/vx_util/is_number.cc | 2 +- met/src/basic/vx_util/is_number.h | 2 +- met/src/basic/vx_util/long_array.cc | 2 +- met/src/basic/vx_util/long_array.h | 2 +- met/src/basic/vx_util/make_path.cc | 2 +- met/src/basic/vx_util/make_path.h | 2 +- met/src/basic/vx_util/mask_poly.cc | 2 +- met/src/basic/vx_util/mask_poly.h | 2 +- met/src/basic/vx_util/memory.cc | 2 +- met/src/basic/vx_util/memory.h | 2 +- met/src/basic/vx_util/met_buffer.cc | 2 +- met/src/basic/vx_util/met_buffer.h | 2 +- met/src/basic/vx_util/ncrr_array.h | 2 +- met/src/basic/vx_util/num_array.cc | 2 +- met/src/basic/vx_util/num_array.h | 2 +- met/src/basic/vx_util/observation.cc | 2 +- met/src/basic/vx_util/observation.h | 2 +- met/src/basic/vx_util/ordinal.cc | 2 +- met/src/basic/vx_util/ordinal.h | 2 +- met/src/basic/vx_util/polyline.cc | 2 +- met/src/basic/vx_util/polyline.h | 2 +- met/src/basic/vx_util/python_line.cc | 2 +- met/src/basic/vx_util/python_line.h | 2 +- met/src/basic/vx_util/read_fortran_binary.cc | 2 +- met/src/basic/vx_util/read_fortran_binary.h | 2 +- met/src/basic/vx_util/roman_numeral.cc | 2 +- met/src/basic/vx_util/roman_numeral.h | 2 +- met/src/basic/vx_util/smart_buffer.cc | 2 +- met/src/basic/vx_util/smart_buffer.h | 2 +- met/src/basic/vx_util/stat_column_defs.h | 2 +- met/src/basic/vx_util/string_fxns.cc | 2 +- met/src/basic/vx_util/string_fxns.h | 2 +- met/src/basic/vx_util/substring.cc | 2 +- met/src/basic/vx_util/substring.h | 2 +- met/src/basic/vx_util/thresh_array.cc | 2 +- met/src/basic/vx_util/thresh_array.h | 2 +- met/src/basic/vx_util/two_d_array.h | 2 +- met/src/basic/vx_util/two_to_one.cc | 2 +- met/src/basic/vx_util/two_to_one.h | 2 +- met/src/basic/vx_util/util_constants.h | 2 +- met/src/basic/vx_util/vx_util.h | 2 +- met/src/libcode/vx_afm/afm.cc | 2 +- met/src/libcode/vx_afm/afm.h | 2 +- met/src/libcode/vx_afm/afm_keywords.cc | 2 +- met/src/libcode/vx_afm/afm_keywords.h | 2 +- met/src/libcode/vx_afm/afm_line.cc | 2 +- met/src/libcode/vx_afm/afm_line.h | 2 +- met/src/libcode/vx_afm/afm_token.cc | 2 +- met/src/libcode/vx_afm/afm_token.h | 2 +- met/src/libcode/vx_afm/afm_token_types.h | 2 +- .../libcode/vx_afm/afmkeyword_to_string.cc | 2 +- met/src/libcode/vx_afm/afmkeyword_to_string.h | 2 +- .../libcode/vx_afm/afmtokentype_to_string.cc | 2 +- .../libcode/vx_afm/afmtokentype_to_string.h | 2 +- .../vx_analysis_util/analysis_utils.cc | 2 +- .../libcode/vx_analysis_util/analysis_utils.h | 2 +- .../libcode/vx_analysis_util/by_case_info.cc | 2 +- .../libcode/vx_analysis_util/by_case_info.h | 2 +- met/src/libcode/vx_analysis_util/mode_atts.cc | 2 +- met/src/libcode/vx_analysis_util/mode_atts.h | 2 +- met/src/libcode/vx_analysis_util/mode_job.cc | 2 +- met/src/libcode/vx_analysis_util/mode_job.h | 2 +- met/src/libcode/vx_analysis_util/mode_line.cc | 2 +- met/src/libcode/vx_analysis_util/mode_line.h | 2 +- met/src/libcode/vx_analysis_util/stat_job.cc | 2 +- met/src/libcode/vx_analysis_util/stat_job.h | 2 +- met/src/libcode/vx_analysis_util/stat_line.cc | 2 +- met/src/libcode/vx_analysis_util/stat_line.h | 2 +- .../libcode/vx_analysis_util/time_series.cc | 2 +- .../libcode/vx_analysis_util/time_series.h | 2 +- .../vx_analysis_util/vx_analysis_util.h | 2 +- met/src/libcode/vx_color/color.cc | 2 +- met/src/libcode/vx_color/color.h | 2 +- met/src/libcode/vx_color/color_list.cc | 2 +- met/src/libcode/vx_color/color_list.h | 2 +- met/src/libcode/vx_color/color_parser.h | 2 +- met/src/libcode/vx_color/color_table.cc | 2 +- met/src/libcode/vx_color/vx_color.h | 2 +- met/src/libcode/vx_data2d/data2d_utils.cc | 2 +- met/src/libcode/vx_data2d/data2d_utils.h | 2 +- met/src/libcode/vx_data2d/data_class.cc | 2 +- met/src/libcode/vx_data2d/data_class.h | 2 +- met/src/libcode/vx_data2d/level_info.cc | 2 +- met/src/libcode/vx_data2d/level_info.h | 2 +- met/src/libcode/vx_data2d/table_lookup.cc | 2 +- met/src/libcode/vx_data2d/table_lookup.h | 2 +- met/src/libcode/vx_data2d/var_info.cc | 2 +- met/src/libcode/vx_data2d/var_info.h | 2 +- met/src/libcode/vx_data2d/vx_data2d.h | 2 +- .../vx_data2d_factory/data2d_factory.cc | 2 +- .../vx_data2d_factory/data2d_factory.h | 2 +- .../vx_data2d_factory/data2d_factory_utils.cc | 2 +- .../vx_data2d_factory/data2d_factory_utils.h | 2 +- .../libcode/vx_data2d_factory/is_bufr_file.cc | 2 +- .../libcode/vx_data2d_factory/is_bufr_file.h | 2 +- .../libcode/vx_data2d_factory/is_grib_file.cc | 2 +- .../libcode/vx_data2d_factory/is_grib_file.h | 2 +- .../vx_data2d_factory/is_netcdf_file.cc | 2 +- .../vx_data2d_factory/is_netcdf_file.h | 2 +- .../vx_data2d_factory/parse_file_list.cc | 2 +- .../vx_data2d_factory/parse_file_list.h | 2 +- .../vx_data2d_factory/var_info_factory.cc | 2 +- .../vx_data2d_factory/var_info_factory.h | 2 +- .../vx_data2d_factory/vx_data2d_factory.h | 2 +- met/src/libcode/vx_data2d_grib/data2d_grib.cc | 2 +- met/src/libcode/vx_data2d_grib/data2d_grib.h | 2 +- .../vx_data2d_grib/data2d_grib_utils.cc | 2 +- .../vx_data2d_grib/data2d_grib_utils.h | 2 +- .../libcode/vx_data2d_grib/grib_classes.cc | 2 +- met/src/libcode/vx_data2d_grib/grib_classes.h | 2 +- .../libcode/vx_data2d_grib/grib_strings.cc | 2 +- met/src/libcode/vx_data2d_grib/grib_strings.h | 2 +- met/src/libcode/vx_data2d_grib/grib_utils.cc | 2 +- met/src/libcode/vx_data2d_grib/grib_utils.h | 2 +- .../libcode/vx_data2d_grib/var_info_grib.cc | 2 +- .../libcode/vx_data2d_grib/var_info_grib.h | 2 +- .../libcode/vx_data2d_grib/vx_data2d_grib.h | 2 +- .../libcode/vx_data2d_grib/vx_grib_classes.h | 2 +- .../libcode/vx_data2d_grib2/data2d_grib2.cc | 2 +- .../libcode/vx_data2d_grib2/data2d_grib2.h | 2 +- .../libcode/vx_data2d_grib2/var_info_grib2.cc | 2 +- .../libcode/vx_data2d_grib2/var_info_grib2.h | 2 +- .../libcode/vx_data2d_nc_met/data2d_nc_met.cc | 2 +- .../libcode/vx_data2d_nc_met/data2d_nc_met.h | 2 +- .../libcode/vx_data2d_nc_met/get_met_grid.cc | 2 +- .../libcode/vx_data2d_nc_met/get_met_grid.h | 2 +- met/src/libcode/vx_data2d_nc_met/met_file.cc | 2 +- met/src/libcode/vx_data2d_nc_met/met_file.h | 2 +- .../vx_data2d_nc_met/var_info_nc_met.cc | 2 +- .../vx_data2d_nc_met/var_info_nc_met.h | 2 +- .../vx_data2d_nc_met/vx_data2d_nc_met.h | 2 +- .../vx_data2d_nc_pinterp/data2d_nc_pinterp.cc | 2 +- .../vx_data2d_nc_pinterp/data2d_nc_pinterp.h | 2 +- .../vx_data2d_nc_pinterp/get_pinterp_grid.cc | 2 +- .../vx_data2d_nc_pinterp/get_pinterp_grid.h | 2 +- .../vx_data2d_nc_pinterp/pinterp_file.cc | 2 +- .../vx_data2d_nc_pinterp/pinterp_file.h | 2 +- .../var_info_nc_pinterp.cc | 2 +- .../var_info_nc_pinterp.h | 2 +- .../vx_data2d_nc_pinterp.h | 2 +- met/src/libcode/vx_data2d_nccf/data2d_nccf.cc | 2 +- met/src/libcode/vx_data2d_nccf/data2d_nccf.h | 2 +- met/src/libcode/vx_data2d_nccf/nccf_file.cc | 2 +- met/src/libcode/vx_data2d_nccf/nccf_file.h | 2 +- .../libcode/vx_data2d_nccf/var_info_nccf.cc | 2 +- .../libcode/vx_data2d_nccf/var_info_nccf.h | 2 +- .../libcode/vx_data2d_nccf/vx_data2d_nccf.h | 2 +- .../libcode/vx_data2d_python/data2d_python.cc | 2 +- .../libcode/vx_data2d_python/data2d_python.h | 2 +- .../dataplane_from_numpy_array.cc | 2 +- .../dataplane_from_numpy_array.h | 2 +- .../vx_data2d_python/dataplane_from_xarray.cc | 2 +- .../vx_data2d_python/dataplane_from_xarray.h | 2 +- .../vx_data2d_python/grid_from_python_dict.cc | 2 +- .../vx_data2d_python/grid_from_python_dict.h | 2 +- .../vx_data2d_python/python_dataplane.cc | 2 +- .../vx_data2d_python/python_dataplane.h | 2 +- .../vx_data2d_python/var_info_python.cc | 2 +- .../vx_data2d_python/var_info_python.h | 2 +- met/src/libcode/vx_geodesy/spheroid.cc | 2 +- met/src/libcode/vx_geodesy/spheroid.h | 2 +- met/src/libcode/vx_geodesy/vx_geodesy.h | 2 +- met/src/libcode/vx_gis/dbf_file.cc | 2 +- met/src/libcode/vx_gis/dbf_file.h | 2 +- met/src/libcode/vx_gis/shp_array.h | 2 +- met/src/libcode/vx_gis/shp_file.cc | 2 +- met/src/libcode/vx_gis/shp_file.h | 2 +- met/src/libcode/vx_gis/shp_point_record.cc | 2 +- met/src/libcode/vx_gis/shp_point_record.h | 2 +- met/src/libcode/vx_gis/shp_poly_record.cc | 2 +- met/src/libcode/vx_gis/shp_poly_record.h | 2 +- met/src/libcode/vx_gis/shp_types.h | 2 +- met/src/libcode/vx_gis/shx_file.cc | 2 +- met/src/libcode/vx_gis/shx_file.h | 2 +- met/src/libcode/vx_gnomon/gnomon.cc | 2 +- met/src/libcode/vx_gnomon/gnomon.h | 2 +- met/src/libcode/vx_grid/earth_rotation.cc | 2 +- met/src/libcode/vx_grid/earth_rotation.h | 2 +- met/src/libcode/vx_grid/find_grid_by_name.cc | 2 +- met/src/libcode/vx_grid/find_grid_by_name.h | 2 +- met/src/libcode/vx_grid/gaussian_grid.cc | 2 +- met/src/libcode/vx_grid/gaussian_grid.h | 2 +- met/src/libcode/vx_grid/gaussian_grid_defs.h | 2 +- met/src/libcode/vx_grid/goes_grid.cc | 2 +- met/src/libcode/vx_grid/goes_grid.h | 2 +- met/src/libcode/vx_grid/goes_grid_defs.h | 2 +- met/src/libcode/vx_grid/grid_base.cc | 2 +- met/src/libcode/vx_grid/grid_base.h | 2 +- met/src/libcode/vx_grid/latlon_grid.cc | 2 +- met/src/libcode/vx_grid/latlon_grid.h | 2 +- met/src/libcode/vx_grid/latlon_grid_defs.h | 2 +- met/src/libcode/vx_grid/latlon_xyz.cc | 2 +- met/src/libcode/vx_grid/latlon_xyz.h | 2 +- met/src/libcode/vx_grid/lc_grid.cc | 2 +- met/src/libcode/vx_grid/lc_grid.h | 2 +- met/src/libcode/vx_grid/lc_grid_defs.h | 2 +- met/src/libcode/vx_grid/merc_grid.cc | 2 +- met/src/libcode/vx_grid/merc_grid.h | 2 +- met/src/libcode/vx_grid/merc_grid_defs.h | 2 +- met/src/libcode/vx_grid/rot_latlon_grid.cc | 2 +- met/src/libcode/vx_grid/rot_latlon_grid.h | 2 +- met/src/libcode/vx_grid/st_grid.cc | 2 +- met/src/libcode/vx_grid/st_grid.h | 2 +- met/src/libcode/vx_grid/st_grid_defs.h | 2 +- met/src/libcode/vx_grid/tcrmw_grid.cc | 2 +- met/src/libcode/vx_grid/tcrmw_grid.h | 2 +- met/src/libcode/vx_grid/vx_grid.h | 2 +- met/src/libcode/vx_gsl_prob/gsl_bvn.cc | 2 +- met/src/libcode/vx_gsl_prob/gsl_bvn.h | 2 +- met/src/libcode/vx_gsl_prob/gsl_cdf.cc | 2 +- met/src/libcode/vx_gsl_prob/gsl_cdf.h | 2 +- met/src/libcode/vx_gsl_prob/gsl_randist.cc | 2 +- met/src/libcode/vx_gsl_prob/gsl_randist.h | 2 +- met/src/libcode/vx_gsl_prob/gsl_statistics.cc | 2 +- met/src/libcode/vx_gsl_prob/gsl_statistics.h | 2 +- met/src/libcode/vx_gsl_prob/gsl_wavelet2d.cc | 2 +- met/src/libcode/vx_gsl_prob/gsl_wavelet2d.h | 2 +- met/src/libcode/vx_gsl_prob/vx_gsl_prob.h | 2 +- met/src/libcode/vx_nav/nav.cc | 2 +- met/src/libcode/vx_nav/nav.h | 2 +- met/src/libcode/vx_nc_obs/nc_obs_util.cc | 2 +- met/src/libcode/vx_nc_obs/nc_obs_util.h | 2 +- met/src/libcode/vx_nc_obs/nc_summary.cc | 2 +- met/src/libcode/vx_nc_obs/nc_summary.h | 2 +- met/src/libcode/vx_nc_util/grid_output.cc | 2 +- met/src/libcode/vx_nc_util/grid_output.h | 2 +- met/src/libcode/vx_nc_util/load_tc_data.cc | 2 +- met/src/libcode/vx_nc_util/load_tc_data.h | 2 +- met/src/libcode/vx_nc_util/nc_constants.h | 2 +- met/src/libcode/vx_nc_util/nc_utils.cc | 2 +- met/src/libcode/vx_nc_util/nc_utils.h | 2 +- met/src/libcode/vx_nc_util/nc_var_info.cc | 2 +- met/src/libcode/vx_nc_util/nc_var_info.h | 2 +- met/src/libcode/vx_nc_util/vx_nc_util.h | 2 +- met/src/libcode/vx_nc_util/write_netcdf.cc | 2 +- met/src/libcode/vx_nc_util/write_netcdf.h | 2 +- met/src/libcode/vx_pb_util/copy_bytes.cc | 2 +- met/src/libcode/vx_pb_util/copy_bytes.h | 2 +- met/src/libcode/vx_pb_util/do_blocking.cc | 2 +- met/src/libcode/vx_pb_util/do_blocking.h | 2 +- met/src/libcode/vx_pb_util/do_unblocking.cc | 2 +- met/src/libcode/vx_pb_util/do_unblocking.h | 2 +- met/src/libcode/vx_pb_util/pblock.cc | 2 +- met/src/libcode/vx_pb_util/pblock.h | 2 +- met/src/libcode/vx_pb_util/vx_pb_util.h | 2 +- met/src/libcode/vx_physics/thermo.cc | 2 +- met/src/libcode/vx_physics/thermo.h | 2 +- .../libcode/vx_plot_util/data_plane_plot.cc | 2 +- .../libcode/vx_plot_util/data_plane_plot.h | 2 +- met/src/libcode/vx_plot_util/map_region.cc | 2 +- met/src/libcode/vx_plot_util/map_region.h | 2 +- met/src/libcode/vx_plot_util/vx_plot_util.cc | 2 +- met/src/libcode/vx_plot_util/vx_plot_util.h | 2 +- met/src/libcode/vx_ps/ps_text.cc | 2 +- met/src/libcode/vx_ps/ps_text.h | 2 +- met/src/libcode/vx_ps/table_helper.cc | 2 +- met/src/libcode/vx_ps/table_helper.h | 2 +- met/src/libcode/vx_ps/vx_ps.cc | 2 +- met/src/libcode/vx_ps/vx_ps.h | 2 +- met/src/libcode/vx_pxm/pbm.cc | 2 +- met/src/libcode/vx_pxm/pbm.h | 2 +- met/src/libcode/vx_pxm/pcm.cc | 2 +- met/src/libcode/vx_pxm/pcm.h | 2 +- met/src/libcode/vx_pxm/pgm.cc | 2 +- met/src/libcode/vx_pxm/pgm.h | 2 +- met/src/libcode/vx_pxm/ppm.cc | 2 +- met/src/libcode/vx_pxm/ppm.h | 2 +- met/src/libcode/vx_pxm/pxm_base.cc | 2 +- met/src/libcode/vx_pxm/pxm_base.h | 2 +- met/src/libcode/vx_pxm/pxm_utils.cc | 2 +- met/src/libcode/vx_pxm/pxm_utils.h | 2 +- met/src/libcode/vx_pxm/vx_pxm.h | 2 +- .../libcode/vx_python3_utils/global_python.h | 2 +- .../libcode/vx_python3_utils/python3_dict.cc | 2 +- .../libcode/vx_python3_utils/python3_dict.h | 2 +- .../libcode/vx_python3_utils/python3_list.cc | 2 +- .../libcode/vx_python3_utils/python3_list.h | 2 +- .../libcode/vx_python3_utils/wchar_argv.cc | 2 +- met/src/libcode/vx_python3_utils/wchar_argv.h | 2 +- met/src/libcode/vx_regrid/vx_regrid.cc | 2 +- met/src/libcode/vx_regrid/vx_regrid.h | 2 +- met/src/libcode/vx_regrid/vx_regrid_budget.cc | 2 +- met/src/libcode/vx_render/ascii85_filter.cc | 2 +- met/src/libcode/vx_render/ascii85_filter.h | 2 +- met/src/libcode/vx_render/bit_filter.cc | 2 +- met/src/libcode/vx_render/bit_filter.h | 2 +- met/src/libcode/vx_render/flate_filter.cc | 2 +- met/src/libcode/vx_render/flate_filter.h | 2 +- met/src/libcode/vx_render/hex_filter.cc | 2 +- met/src/libcode/vx_render/hex_filter.h | 2 +- met/src/libcode/vx_render/ps_filter.cc | 2 +- met/src/libcode/vx_render/ps_filter.h | 2 +- met/src/libcode/vx_render/psout_filter.cc | 2 +- met/src/libcode/vx_render/psout_filter.h | 2 +- met/src/libcode/vx_render/render_pbm.cc | 2 +- met/src/libcode/vx_render/render_pcm.cc | 2 +- met/src/libcode/vx_render/render_pgm.cc | 2 +- met/src/libcode/vx_render/render_ppm.cc | 2 +- met/src/libcode/vx_render/renderinfo.cc | 2 +- met/src/libcode/vx_render/renderinfo.h | 2 +- met/src/libcode/vx_render/rle_filter.cc | 2 +- met/src/libcode/vx_render/rle_filter.h | 2 +- met/src/libcode/vx_render/uc_queue.cc | 2 +- met/src/libcode/vx_render/uc_queue.h | 2 +- met/src/libcode/vx_render/vx_render.h | 2 +- met/src/libcode/vx_series_data/series_data.cc | 2 +- met/src/libcode/vx_series_data/series_data.h | 2 +- met/src/libcode/vx_series_data/series_pdf.cc | 2 +- met/src/libcode/vx_series_data/series_pdf.h | 2 +- met/src/libcode/vx_shapedata/engine.cc | 2 +- met/src/libcode/vx_shapedata/engine.h | 2 +- met/src/libcode/vx_shapedata/interest.cc | 2 +- met/src/libcode/vx_shapedata/interest.h | 2 +- met/src/libcode/vx_shapedata/mode_columns.h | 2 +- .../libcode/vx_shapedata/mode_conf_info.cc | 2 +- met/src/libcode/vx_shapedata/mode_conf_info.h | 2 +- met/src/libcode/vx_shapedata/moments.cc | 2 +- met/src/libcode/vx_shapedata/moments.h | 2 +- met/src/libcode/vx_shapedata/node.cc | 2 +- met/src/libcode/vx_shapedata/node.h | 2 +- met/src/libcode/vx_shapedata/set.cc | 2 +- met/src/libcode/vx_shapedata/set.h | 2 +- met/src/libcode/vx_shapedata/shape.h | 2 +- met/src/libcode/vx_shapedata/shapedata.cc | 2 +- met/src/libcode/vx_shapedata/shapedata.h | 2 +- met/src/libcode/vx_shapedata/vx_shapedata.h | 2 +- met/src/libcode/vx_solar/astro_constants.h | 2 +- met/src/libcode/vx_solar/siderial.cc | 2 +- met/src/libcode/vx_solar/siderial.h | 2 +- met/src/libcode/vx_solar/solar.cc | 2 +- met/src/libcode/vx_solar/solar.h | 2 +- met/src/libcode/vx_stat_out/stat_columns.cc | 2 +- met/src/libcode/vx_stat_out/stat_columns.h | 2 +- .../libcode/vx_stat_out/stat_hdr_columns.cc | 2 +- .../libcode/vx_stat_out/stat_hdr_columns.h | 2 +- met/src/libcode/vx_stat_out/vx_stat_out.h | 2 +- met/src/libcode/vx_statistics/apply_mask.cc | 2 +- met/src/libcode/vx_statistics/apply_mask.h | 2 +- met/src/libcode/vx_statistics/compute_ci.cc | 2 +- met/src/libcode/vx_statistics/compute_ci.h | 2 +- .../libcode/vx_statistics/compute_stats.cc | 2 +- met/src/libcode/vx_statistics/compute_stats.h | 2 +- met/src/libcode/vx_statistics/contable.cc | 2 +- met/src/libcode/vx_statistics/contable.h | 2 +- met/src/libcode/vx_statistics/contable_nx2.cc | 2 +- .../libcode/vx_statistics/contable_stats.cc | 2 +- met/src/libcode/vx_statistics/ens_stats.cc | 2 +- met/src/libcode/vx_statistics/ens_stats.h | 2 +- met/src/libcode/vx_statistics/met_stats.cc | 2 +- met/src/libcode/vx_statistics/met_stats.h | 2 +- met/src/libcode/vx_statistics/obs_error.cc | 2 +- met/src/libcode/vx_statistics/obs_error.h | 2 +- met/src/libcode/vx_statistics/pair_base.cc | 2 +- met/src/libcode/vx_statistics/pair_base.h | 2 +- .../vx_statistics/pair_data_ensemble.cc | 2 +- .../vx_statistics/pair_data_ensemble.h | 2 +- .../libcode/vx_statistics/pair_data_point.cc | 2 +- .../libcode/vx_statistics/pair_data_point.h | 2 +- met/src/libcode/vx_statistics/read_climo.cc | 2 +- met/src/libcode/vx_statistics/read_climo.h | 2 +- met/src/libcode/vx_statistics/vx_statistics.h | 2 +- met/src/libcode/vx_summary/summary_calc.cc | 2 +- met/src/libcode/vx_summary/summary_calc.h | 2 +- .../libcode/vx_summary/summary_calc_max.cc | 2 +- met/src/libcode/vx_summary/summary_calc_max.h | 2 +- .../libcode/vx_summary/summary_calc_mean.cc | 2 +- .../libcode/vx_summary/summary_calc_mean.h | 2 +- .../libcode/vx_summary/summary_calc_median.cc | 2 +- .../libcode/vx_summary/summary_calc_median.h | 2 +- .../libcode/vx_summary/summary_calc_min.cc | 2 +- met/src/libcode/vx_summary/summary_calc_min.h | 2 +- .../vx_summary/summary_calc_percentile.cc | 2 +- .../vx_summary/summary_calc_percentile.h | 2 +- .../libcode/vx_summary/summary_calc_range.cc | 2 +- .../libcode/vx_summary/summary_calc_range.h | 2 +- .../libcode/vx_summary/summary_calc_stdev.cc | 2 +- .../libcode/vx_summary/summary_calc_stdev.h | 2 +- met/src/libcode/vx_summary/summary_key.cc | 2 +- met/src/libcode/vx_summary/summary_key.h | 2 +- met/src/libcode/vx_summary/summary_obs.cc | 2 +- met/src/libcode/vx_summary/summary_obs.h | 2 +- .../vx_summary/time_summary_interval.cc | 2 +- .../vx_summary/time_summary_interval.h | 2 +- met/src/libcode/vx_summary/vx_summary.h | 2 +- met/src/libcode/vx_tc_util/atcf_line_base.cc | 2 +- met/src/libcode/vx_tc_util/atcf_line_base.h | 2 +- met/src/libcode/vx_tc_util/atcf_offsets.h | 2 +- met/src/libcode/vx_tc_util/atcf_prob_line.cc | 2 +- met/src/libcode/vx_tc_util/atcf_prob_line.h | 2 +- met/src/libcode/vx_tc_util/atcf_track_line.cc | 2 +- met/src/libcode/vx_tc_util/atcf_track_line.h | 2 +- met/src/libcode/vx_tc_util/genesis_info.cc | 2 +- met/src/libcode/vx_tc_util/genesis_info.h | 2 +- .../libcode/vx_tc_util/pair_data_genesis.cc | 2 +- .../libcode/vx_tc_util/pair_data_genesis.h | 2 +- met/src/libcode/vx_tc_util/prob_info_array.cc | 2 +- met/src/libcode/vx_tc_util/prob_info_array.h | 2 +- met/src/libcode/vx_tc_util/prob_info_base.cc | 2 +- met/src/libcode/vx_tc_util/prob_info_base.h | 2 +- met/src/libcode/vx_tc_util/prob_pair_info.cc | 2 +- met/src/libcode/vx_tc_util/prob_pair_info.h | 2 +- met/src/libcode/vx_tc_util/prob_rirw_info.cc | 2 +- met/src/libcode/vx_tc_util/prob_rirw_info.h | 2 +- .../libcode/vx_tc_util/prob_rirw_pair_info.cc | 2 +- .../libcode/vx_tc_util/prob_rirw_pair_info.h | 2 +- met/src/libcode/vx_tc_util/tc_columns.cc | 2 +- met/src/libcode/vx_tc_util/tc_columns.h | 2 +- met/src/libcode/vx_tc_util/tc_hdr_columns.cc | 2 +- met/src/libcode/vx_tc_util/tc_hdr_columns.h | 2 +- met/src/libcode/vx_tc_util/tc_stat_line.cc | 2 +- met/src/libcode/vx_tc_util/tc_stat_line.h | 2 +- met/src/libcode/vx_tc_util/track_info.cc | 2 +- met/src/libcode/vx_tc_util/track_info.h | 2 +- met/src/libcode/vx_tc_util/track_pair_info.cc | 2 +- met/src/libcode/vx_tc_util/track_pair_info.h | 2 +- met/src/libcode/vx_tc_util/track_point.cc | 2 +- met/src/libcode/vx_tc_util/track_point.h | 2 +- met/src/libcode/vx_tc_util/vx_tc_nc_util.cc | 2 +- met/src/libcode/vx_tc_util/vx_tc_nc_util.h | 2 +- met/src/libcode/vx_tc_util/vx_tc_util.h | 2 +- .../vx_time_series/compute_swinging_door.cc | 2 +- .../vx_time_series/compute_swinging_door.h | 2 +- .../vx_time_series/time_series_util.cc | 2 +- .../libcode/vx_time_series/time_series_util.h | 2 +- .../libcode/vx_time_series/vx_time_series.h | 2 +- .../tools/core/ensemble_stat/ensemble_stat.cc | 2 +- .../tools/core/ensemble_stat/ensemble_stat.h | 2 +- .../ensemble_stat/ensemble_stat_conf_info.cc | 2 +- .../ensemble_stat/ensemble_stat_conf_info.h | 2 +- met/src/tools/core/grid_stat/grid_stat.cc | 2 +- met/src/tools/core/grid_stat/grid_stat.h | 2 +- .../core/grid_stat/grid_stat_conf_info.cc | 2 +- .../core/grid_stat/grid_stat_conf_info.h | 2 +- met/src/tools/core/mode/cluster_page.cc | 2 +- met/src/tools/core/mode/fcst_enlarge_page.cc | 2 +- met/src/tools/core/mode/mode.cc | 2 +- met/src/tools/core/mode/mode_exec.cc | 2 +- met/src/tools/core/mode/mode_exec.h | 2 +- met/src/tools/core/mode/mode_ps_file.cc | 2 +- met/src/tools/core/mode/mode_ps_file.h | 2 +- met/src/tools/core/mode/mode_ps_table_defs.h | 2 +- met/src/tools/core/mode/obs_enlarge_page.cc | 2 +- met/src/tools/core/mode/overlap_page.cc | 2 +- met/src/tools/core/mode/page_1.cc | 2 +- met/src/tools/core/mode/plot_engine.cc | 2 +- .../tools/core/mode_analysis/config_to_att.cc | 2 +- .../tools/core/mode_analysis/config_to_att.h | 2 +- .../tools/core/mode_analysis/mode_analysis.cc | 2 +- met/src/tools/core/pcp_combine/pcp_combine.cc | 2 +- met/src/tools/core/point_stat/point_stat.cc | 2 +- met/src/tools/core/point_stat/point_stat.h | 2 +- .../core/point_stat/point_stat_conf_info.cc | 2 +- .../core/point_stat/point_stat_conf_info.h | 2 +- .../core/series_analysis/series_analysis.cc | 2 +- .../core/series_analysis/series_analysis.h | 2 +- .../series_analysis_conf_info.cc | 2 +- .../series_analysis_conf_info.h | 2 +- .../core/stat_analysis/aggr_stat_line.cc | 2 +- .../tools/core/stat_analysis/aggr_stat_line.h | 2 +- .../core/stat_analysis/parse_stat_line.cc | 2 +- .../core/stat_analysis/parse_stat_line.h | 2 +- .../tools/core/stat_analysis/stat_analysis.cc | 2 +- .../tools/core/stat_analysis/stat_analysis.h | 2 +- .../core/stat_analysis/stat_analysis_job.cc | 2 +- .../core/stat_analysis/stat_analysis_job.h | 2 +- .../tools/core/wavelet_stat/wavelet_stat.cc | 2 +- .../tools/core/wavelet_stat/wavelet_stat.h | 2 +- .../wavelet_stat/wavelet_stat_conf_info.cc | 2 +- .../wavelet_stat/wavelet_stat_conf_info.h | 2 +- met/src/tools/dev_utils/chk4copyright.cc | 2 +- met/src/tools/dev_utils/gen_climo_bin.cc | 2 +- .../tools/dev_utils/gribtab.dat_to_flat.cc | 2 +- met/src/tools/dev_utils/insitu_nc_file.cc | 2 +- met/src/tools/dev_utils/insitu_nc_file.h | 2 +- met/src/tools/dev_utils/insitu_nc_to_ascii.cc | 2 +- met/src/tools/dev_utils/met_nc_file.cc | 2 +- met/src/tools/dev_utils/met_nc_file.h | 2 +- met/src/tools/dev_utils/nceptab_to_flat.cc | 2 +- met/src/tools/dev_utils/pbtime.cc | 2 +- .../tools/dev_utils/reformat_county_data.cc | 2 +- met/src/tools/dev_utils/reformat_map_data.cc | 2 +- .../dev_utils/shapefiles/make_mapfiles.cc | 2 +- met/src/tools/dev_utils/swinging_door.cc | 2 +- .../tools/other/ascii2nc/aeronet_handler.cc | 2 +- .../tools/other/ascii2nc/aeronet_handler.h | 2 +- met/src/tools/other/ascii2nc/ascii2nc.cc | 2 +- .../other/ascii2nc/ascii2nc_conf_info.cc | 2 +- .../tools/other/ascii2nc/ascii2nc_conf_info.h | 2 +- met/src/tools/other/ascii2nc/file_handler.cc | 2 +- met/src/tools/other/ascii2nc/file_handler.h | 2 +- .../tools/other/ascii2nc/little_r_handler.cc | 2 +- .../tools/other/ascii2nc/little_r_handler.h | 2 +- met/src/tools/other/ascii2nc/met_handler.cc | 2 +- met/src/tools/other/ascii2nc/met_handler.h | 2 +- .../tools/other/ascii2nc/python_handler.cc | 2 +- met/src/tools/other/ascii2nc/python_handler.h | 2 +- .../tools/other/ascii2nc/surfrad_handler.cc | 2 +- .../tools/other/ascii2nc/surfrad_handler.h | 2 +- met/src/tools/other/ascii2nc/wwsis_handler.cc | 2 +- met/src/tools/other/ascii2nc/wwsis_handler.h | 2 +- .../tools/other/gen_vx_mask/gen_vx_mask.cc | 2 +- met/src/tools/other/gen_vx_mask/gen_vx_mask.h | 2 +- .../other/gen_vx_mask/grid_closed_poly.cc | 2 +- .../other/gen_vx_mask/grid_closed_poly.h | 2 +- met/src/tools/other/gis_utils/gis_dump_dbf.cc | 2 +- met/src/tools/other/gis_utils/gis_dump_shp.cc | 2 +- met/src/tools/other/gis_utils/gis_dump_shx.cc | 2 +- met/src/tools/other/grid_diag/grid_diag.cc | 2 +- met/src/tools/other/grid_diag/grid_diag.h | 2 +- .../other/grid_diag/grid_diag_conf_info.cc | 2 +- .../other/grid_diag/grid_diag_conf_info.h | 2 +- met/src/tools/other/gsi_tools/conv_offsets.h | 2 +- met/src/tools/other/gsi_tools/conv_record.cc | 2 +- met/src/tools/other/gsi_tools/conv_record.h | 2 +- met/src/tools/other/gsi_tools/ftto.h | 2 +- met/src/tools/other/gsi_tools/gsi_record.cc | 2 +- met/src/tools/other/gsi_tools/gsi_record.h | 2 +- met/src/tools/other/gsi_tools/gsi_util.cc | 2 +- met/src/tools/other/gsi_tools/gsi_util.h | 2 +- met/src/tools/other/gsi_tools/gsid2mpr.cc | 2 +- met/src/tools/other/gsi_tools/gsid2mpr.h | 2 +- .../tools/other/gsi_tools/gsidens2orank.cc | 2 +- met/src/tools/other/gsi_tools/gsidens2orank.h | 2 +- met/src/tools/other/gsi_tools/rad_config.cc | 2 +- met/src/tools/other/gsi_tools/rad_config.h | 2 +- met/src/tools/other/gsi_tools/rad_offsets.h | 2 +- met/src/tools/other/gsi_tools/rad_record.cc | 2 +- met/src/tools/other/gsi_tools/rad_record.h | 2 +- met/src/tools/other/ioda2nc/ioda2nc.cc | 2 +- .../tools/other/ioda2nc/ioda2nc_conf_info.cc | 2 +- .../tools/other/ioda2nc/ioda2nc_conf_info.h | 2 +- met/src/tools/other/lidar2nc/calipso_5km.cc | 2 +- met/src/tools/other/lidar2nc/calipso_5km.h | 2 +- met/src/tools/other/lidar2nc/hdf_utils.cc | 2 +- met/src/tools/other/lidar2nc/hdf_utils.h | 2 +- met/src/tools/other/lidar2nc/lidar2nc.cc | 2 +- met/src/tools/other/madis2nc/madis2nc.cc | 2 +- met/src/tools/other/madis2nc/madis2nc.h | 2 +- .../other/madis2nc/madis2nc_conf_info.cc | 2 +- .../tools/other/madis2nc/madis2nc_conf_info.h | 2 +- met/src/tools/other/mode_graphics/cgraph.h | 2 +- .../tools/other/mode_graphics/cgraph_font.cc | 2 +- .../tools/other/mode_graphics/cgraph_font.h | 2 +- .../tools/other/mode_graphics/cgraph_main.cc | 2 +- .../tools/other/mode_graphics/cgraph_main.h | 2 +- .../tools/other/mode_graphics/color_stack.cc | 2 +- .../tools/other/mode_graphics/color_stack.h | 2 +- met/src/tools/other/mode_graphics/gs_ps_map.h | 2 +- .../mode_graphics/mode_nc_output_file.cc | 2 +- .../other/mode_graphics/mode_nc_output_file.h | 2 +- .../other/mode_graphics/plot_mode_field.cc | 2 +- met/src/tools/other/mode_graphics/sincosd.h | 2 +- .../tools/other/mode_time_domain/2d_att.cc | 2 +- met/src/tools/other/mode_time_domain/2d_att.h | 2 +- .../other/mode_time_domain/2d_att_array.cc | 2 +- .../other/mode_time_domain/2d_att_array.h | 2 +- .../tools/other/mode_time_domain/2d_columns.h | 2 +- .../other/mode_time_domain/2d_moments.cc | 2 +- .../tools/other/mode_time_domain/2d_moments.h | 2 +- .../tools/other/mode_time_domain/3d_att.cc | 2 +- met/src/tools/other/mode_time_domain/3d_att.h | 2 +- .../mode_time_domain/3d_att_pair_array.cc | 2 +- .../mode_time_domain/3d_att_pair_array.h | 2 +- .../mode_time_domain/3d_att_single_array.cc | 2 +- .../mode_time_domain/3d_att_single_array.h | 2 +- .../tools/other/mode_time_domain/3d_conv.cc | 2 +- .../other/mode_time_domain/3d_moments.cc | 2 +- .../tools/other/mode_time_domain/3d_moments.h | 2 +- .../other/mode_time_domain/3d_pair_columns.h | 2 +- .../mode_time_domain/3d_single_columns.h | 2 +- .../other/mode_time_domain/3d_txt_header.h | 2 +- .../tools/other/mode_time_domain/fo_graph.cc | 2 +- .../tools/other/mode_time_domain/fo_graph.h | 2 +- .../tools/other/mode_time_domain/fo_node.cc | 2 +- .../tools/other/mode_time_domain/fo_node.h | 2 +- .../other/mode_time_domain/fo_node_array.cc | 2 +- .../other/mode_time_domain/fo_node_array.h | 2 +- .../other/mode_time_domain/interest_calc.cc | 2 +- .../other/mode_time_domain/interest_calc.h | 2 +- .../tools/other/mode_time_domain/mm_engine.cc | 2 +- .../tools/other/mode_time_domain/mm_engine.h | 2 +- met/src/tools/other/mode_time_domain/mtd.cc | 2 +- .../other/mode_time_domain/mtd_config_info.cc | 2 +- .../other/mode_time_domain/mtd_config_info.h | 2 +- .../tools/other/mode_time_domain/mtd_file.h | 2 +- .../other/mode_time_domain/mtd_file_base.cc | 2 +- .../other/mode_time_domain/mtd_file_base.h | 2 +- .../other/mode_time_domain/mtd_file_float.cc | 2 +- .../other/mode_time_domain/mtd_file_float.h | 2 +- .../other/mode_time_domain/mtd_file_int.cc | 2 +- .../other/mode_time_domain/mtd_file_int.h | 2 +- .../other/mode_time_domain/mtd_nc_defs.h | 2 +- .../other/mode_time_domain/mtd_nc_output.cc | 2 +- .../other/mode_time_domain/mtd_nc_output.h | 2 +- .../other/mode_time_domain/mtd_partition.cc | 2 +- .../other/mode_time_domain/mtd_partition.h | 2 +- .../other/mode_time_domain/mtd_read_data.cc | 2 +- .../other/mode_time_domain/mtd_read_data.h | 2 +- .../other/mode_time_domain/mtd_txt_output.cc | 2 +- .../other/mode_time_domain/mtd_txt_output.h | 2 +- .../tools/other/mode_time_domain/nc_grid.cc | 2 +- .../tools/other/mode_time_domain/nc_grid.h | 2 +- .../other/mode_time_domain/nc_utils_local.cc | 2 +- .../other/mode_time_domain/nc_utils_local.h | 2 +- .../other/modis_regrid/cloudsat_swath_file.cc | 2 +- .../other/modis_regrid/cloudsat_swath_file.h | 2 +- .../tools/other/modis_regrid/data_averager.cc | 2 +- .../tools/other/modis_regrid/data_averager.h | 2 +- .../modis_regrid/data_plane_to_netcdf.cc | 2 +- .../other/modis_regrid/data_plane_to_netcdf.h | 2 +- .../tools/other/modis_regrid/modis_file.cc | 2 +- met/src/tools/other/modis_regrid/modis_file.h | 2 +- .../tools/other/modis_regrid/modis_regrid.cc | 2 +- met/src/tools/other/modis_regrid/sat_utils.cc | 2 +- met/src/tools/other/modis_regrid/sat_utils.h | 2 +- met/src/tools/other/pb2nc/closepb.f | 6 +-- met/src/tools/other/pb2nc/dumppb.f | 6 +-- met/src/tools/other/pb2nc/numpbmsg.f | 8 +-- met/src/tools/other/pb2nc/openpb.f | 6 +-- met/src/tools/other/pb2nc/pb2nc.cc | 2 +- met/src/tools/other/pb2nc/pb2nc_conf_info.cc | 2 +- met/src/tools/other/pb2nc/pb2nc_conf_info.h | 2 +- met/src/tools/other/pb2nc/readpb.f | 6 +-- .../other/plot_data_plane/plot_data_plane.cc | 2 +- .../other/plot_point_obs/plot_point_obs.cc | 2 +- .../other/plot_point_obs/plot_point_obs.h | 2 +- .../plot_point_obs_conf_info.cc | 2 +- .../plot_point_obs/plot_point_obs_conf_info.h | 2 +- met/src/tools/other/point2grid/point2grid.cc | 2 +- .../other/point2grid/point2grid_conf_info.cc | 2 +- .../other/point2grid/point2grid_conf_info.h | 2 +- .../regrid_data_plane/regrid_data_plane.cc | 2 +- .../shift_data_plane/shift_data_plane.cc | 2 +- met/src/tools/other/wwmca_tool/af_cp_file.cc | 2 +- met/src/tools/other/wwmca_tool/af_cp_file.h | 2 +- met/src/tools/other/wwmca_tool/af_file.cc | 2 +- met/src/tools/other/wwmca_tool/af_file.h | 2 +- met/src/tools/other/wwmca_tool/af_pt_file.cc | 2 +- met/src/tools/other/wwmca_tool/af_pt_file.h | 2 +- met/src/tools/other/wwmca_tool/ave_interp.cc | 2 +- met/src/tools/other/wwmca_tool/ave_interp.h | 2 +- met/src/tools/other/wwmca_tool/interp_base.cc | 2 +- met/src/tools/other/wwmca_tool/interp_base.h | 2 +- met/src/tools/other/wwmca_tool/max_interp.cc | 2 +- met/src/tools/other/wwmca_tool/max_interp.h | 2 +- met/src/tools/other/wwmca_tool/min_interp.cc | 2 +- met/src/tools/other/wwmca_tool/min_interp.h | 2 +- met/src/tools/other/wwmca_tool/nc_output.cc | 2 +- .../tools/other/wwmca_tool/nearest_interp.cc | 2 +- .../tools/other/wwmca_tool/nearest_interp.h | 2 +- met/src/tools/other/wwmca_tool/wwmca_plot.cc | 2 +- met/src/tools/other/wwmca_tool/wwmca_ref.cc | 2 +- met/src/tools/other/wwmca_tool/wwmca_ref.h | 2 +- .../tools/other/wwmca_tool/wwmca_regrid.cc | 2 +- met/src/tools/other/wwmca_tool/wwmca_utils.cc | 2 +- met/src/tools/other/wwmca_tool/wwmca_utils.h | 2 +- .../tc_utils/rmw_analysis/rmw_analysis.cc | 2 +- .../tc_utils/rmw_analysis/rmw_analysis.h | 2 +- .../rmw_analysis/rmw_analysis_conf_info.cc | 2 +- .../rmw_analysis/rmw_analysis_conf_info.h | 2 +- met/src/tools/tc_utils/tc_dland/tc_dland.cc | 2 +- met/src/tools/tc_utils/tc_dland/tc_poly.cc | 2 +- met/src/tools/tc_utils/tc_dland/tc_poly.h | 2 +- met/src/tools/tc_utils/tc_gen/tc_gen.cc | 2 +- met/src/tools/tc_utils/tc_gen/tc_gen.h | 2 +- .../tools/tc_utils/tc_gen/tc_gen_conf_info.cc | 2 +- .../tools/tc_utils/tc_gen/tc_gen_conf_info.h | 2 +- met/src/tools/tc_utils/tc_pairs/tc_pairs.cc | 2 +- met/src/tools/tc_utils/tc_pairs/tc_pairs.h | 2 +- .../tc_utils/tc_pairs/tc_pairs_conf_info.cc | 2 +- .../tc_utils/tc_pairs/tc_pairs_conf_info.h | 2 +- met/src/tools/tc_utils/tc_rmw/tc_rmw.cc | 2 +- met/src/tools/tc_utils/tc_rmw/tc_rmw.h | 2 +- .../tools/tc_utils/tc_rmw/tc_rmw_conf_info.cc | 2 +- .../tools/tc_utils/tc_rmw/tc_rmw_conf_info.h | 2 +- met/src/tools/tc_utils/tc_stat/tc_stat.cc | 2 +- met/src/tools/tc_utils/tc_stat/tc_stat.h | 2 +- .../tc_utils/tc_stat/tc_stat_conf_info.cc | 2 +- .../tc_utils/tc_stat/tc_stat_conf_info.h | 2 +- .../tools/tc_utils/tc_stat/tc_stat_files.cc | 2 +- .../tools/tc_utils/tc_stat/tc_stat_files.h | 2 +- met/src/tools/tc_utils/tc_stat/tc_stat_job.cc | 2 +- met/src/tools/tc_utils/tc_stat/tc_stat_job.h | 2 +- 860 files changed, 923 insertions(+), 870 deletions(-) diff --git a/met/README b/met/README index 06aeafc3b5..3b0c6edba8 100644 --- a/met/README +++ b/met/README @@ -2,7 +2,7 @@ Model Evaluation Tools (MET) TERMS OF USE - IMPORTANT! ================================================================================ -Copyright 2020, UCAR/NCAR, NOAA, and CSU/CIRA +Copyright 2021, UCAR/NCAR, NOAA, and CSU/CIRA Licensed 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 diff --git a/met/data/copyright_notice.txt b/met/data/copyright_notice.txt index 5ae02fc8a3..59f11fd7d9 100644 --- a/met/data/copyright_notice.txt +++ b/met/data/copyright_notice.txt @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2019 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/docs/Users_Guide/release-notes.rst b/met/docs/Users_Guide/release-notes.rst index 791d657cfc..5bd26e9ea4 100644 --- a/met/docs/Users_Guide/release-notes.rst +++ b/met/docs/Users_Guide/release-notes.rst @@ -7,6 +7,59 @@ describes the bugfix, enhancement, or new feature: `MET GitHub issues. `_ release notes (20210426) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* Bugfixes: + + * Fix Grid-Diag bug when reading the same variable name from multiple data sources (`#1694 `_). + * Fix Stat-Analysis failure when aggregating ECNT lines (`#1706 `_). + * Fix intermittent PB2NC segfault when deriving PBL (`#1715 `_). + * Fix parsing error for floating point percentile thresholds, like ">SFP33.3" (`#1716 `_). + * Fix ascii2nc to handle bad records in little_r format (`#1737 `_). + +* Documentation: + + * Migrate the MET documetation to Read the Docs (`#1649 `_). + +* Library code: + + * Miscellaneous: + + * Add support for climatological probabilities for complex CDP thresholds, like >=CDP33&&<=CDP67 (`#1705 `_). + + * NetCDF library: + + * Extend CF-compliant NetCDF file support when defining the time dimension as a time string (`#1755 `_). + + * Python embedding: + + * Replace the pickle format for temporary python files with NetCDF for gridded data (`#1319 `_, `#1697 `_). + * Replace the pickle format for temporary python files with ASCII for point observations in ascii2nc and matched pair data in Stat-Analysis (`#1319 `_, `#1700 `_). + * Enhance python embedding to support the "grid" being defined as a named grid or specification string (`#1471 `_). + * Enhance the python embedding library code to parse python longlong variables as integers to make the python embedding scripts less particular (`#1747 `_). + * Fix the read_ascii_mpr.py python embedding script to pass all 37 columns of MPR data to Stat-Analysis (`#1620 `_). + * Fix the read_tmp_dataplane.py python embedding script to handle the fill value correctly (`#1753 `_). + +* Application code: + + * Point-Stat and Grid-Stat Tools: + + * Enhance Point-Stat and Grid-Stat by adding mpr_column and mpr_thresh configuration options to filter out matched pairs based on large fcst, obs, and climo differences (`#1575 `_). + + * Stat-Analysis Tool: + + * Enhance Stat-Analysis to process multiple output thresholds and write multiple output line types in a single aggregate_stat job (`#1735 `_). + * Enhance Stat-Analysis to skip writing job output to the logfile when the -out_stat option is provided (`#1736 `_). + * Enhance Stat-Analysis by adding a -column_exc job command option to exclude lines based on string values (`#1733 `_). + + * MET-TC Tools: + + * Fix TC-Pairs to report the correct number of lines read from input track data files (`#1725 `_). + * Enhance TC-Stat by adding a -column_exc job command option to exclude lines based on string values (`#1733 `_). + * Enhance the TC-Gen matching logic and update several config options to support its S2S application (`#1714 `_). + Version `10.0.0-beta4 `_ release notes (20210302) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/met/docs/conf.py b/met/docs/conf.py index 2a51afe4d7..7abb9ffef0 100644 --- a/met/docs/conf.py +++ b/met/docs/conf.py @@ -24,7 +24,7 @@ verinfo = version release = f'{version}' release_year = '2021' -release_date = f'{release_year}-03-31' +release_date = f'{release_year}-04-26' copyright = f'{release_year}, {author}' # -- General configuration --------------------------------------------------- diff --git a/met/internal_tests/basic/vx_config/test_config.cc b/met/internal_tests/basic/vx_config/test_config.cc index 36865e3592..bc98cf99c9 100644 --- a/met/internal_tests/basic/vx_config/test_config.cc +++ b/met/internal_tests/basic/vx_config/test_config.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/basic/vx_config/test_lookup.cc b/met/internal_tests/basic/vx_config/test_lookup.cc index 22f64d02ad..acfdd6ce47 100644 --- a/met/internal_tests/basic/vx_config/test_lookup.cc +++ b/met/internal_tests/basic/vx_config/test_lookup.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/basic/vx_config/test_lookup2.cc b/met/internal_tests/basic/vx_config/test_lookup2.cc index 8be3e13934..f0550e51cb 100644 --- a/met/internal_tests/basic/vx_config/test_lookup2.cc +++ b/met/internal_tests/basic/vx_config/test_lookup2.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/basic/vx_config/test_lookup3.cc b/met/internal_tests/basic/vx_config/test_lookup3.cc index 8c9640b7ad..00b5092ef0 100644 --- a/met/internal_tests/basic/vx_config/test_lookup3.cc +++ b/met/internal_tests/basic/vx_config/test_lookup3.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/basic/vx_config/test_met_478.cc b/met/internal_tests/basic/vx_config/test_met_478.cc index 5beeb7b1f7..d8eb495d1e 100644 --- a/met/internal_tests/basic/vx_config/test_met_478.cc +++ b/met/internal_tests/basic/vx_config/test_met_478.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/basic/vx_config/test_string.cc b/met/internal_tests/basic/vx_config/test_string.cc index 628c38d295..1ff22b98a4 100644 --- a/met/internal_tests/basic/vx_config/test_string.cc +++ b/met/internal_tests/basic/vx_config/test_string.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/basic/vx_config/test_string_then_config.cc b/met/internal_tests/basic/vx_config/test_string_then_config.cc index e55d9a5dac..1749c65838 100644 --- a/met/internal_tests/basic/vx_config/test_string_then_config.cc +++ b/met/internal_tests/basic/vx_config/test_string_then_config.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/basic/vx_config/test_thresh.cc b/met/internal_tests/basic/vx_config/test_thresh.cc index 8c31b855fa..1a8d346d4f 100644 --- a/met/internal_tests/basic/vx_config/test_thresh.cc +++ b/met/internal_tests/basic/vx_config/test_thresh.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/basic/vx_config/test_user_func.cc b/met/internal_tests/basic/vx_config/test_user_func.cc index decebc9f98..f32a198878 100644 --- a/met/internal_tests/basic/vx_config/test_user_func.cc +++ b/met/internal_tests/basic/vx_config/test_user_func.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/basic/vx_log/test_logger.cc b/met/internal_tests/basic/vx_log/test_logger.cc index 7906a10abc..723cb38df3 100644 --- a/met/internal_tests/basic/vx_log/test_logger.cc +++ b/met/internal_tests/basic/vx_log/test_logger.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/basic/vx_log/test_reg_exp.cc b/met/internal_tests/basic/vx_log/test_reg_exp.cc index 3f3f8915e4..81fc9b246e 100644 --- a/met/internal_tests/basic/vx_log/test_reg_exp.cc +++ b/met/internal_tests/basic/vx_log/test_reg_exp.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/basic/vx_util/test_add_rows.cc b/met/internal_tests/basic/vx_util/test_add_rows.cc index 4a239103d1..bff68be679 100644 --- a/met/internal_tests/basic/vx_util/test_add_rows.cc +++ b/met/internal_tests/basic/vx_util/test_add_rows.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/basic/vx_util/test_ascii_header.cc b/met/internal_tests/basic/vx_util/test_ascii_header.cc index addacd7689..f71643b0b6 100644 --- a/met/internal_tests/basic/vx_util/test_ascii_header.cc +++ b/met/internal_tests/basic/vx_util/test_ascii_header.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/basic/vx_util/test_command_line.cc b/met/internal_tests/basic/vx_util/test_command_line.cc index 48f93a698f..ce5fcfc137 100644 --- a/met/internal_tests/basic/vx_util/test_command_line.cc +++ b/met/internal_tests/basic/vx_util/test_command_line.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/basic/vx_util/test_data_plane.cc b/met/internal_tests/basic/vx_util/test_data_plane.cc index 6b6c163aba..dea6b89c32 100644 --- a/met/internal_tests/basic/vx_util/test_data_plane.cc +++ b/met/internal_tests/basic/vx_util/test_data_plane.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/basic/vx_util/test_table_float.cc b/met/internal_tests/basic/vx_util/test_table_float.cc index faa17b4e65..2afeceeab2 100644 --- a/met/internal_tests/basic/vx_util/test_table_float.cc +++ b/met/internal_tests/basic/vx_util/test_table_float.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_data2d/dump_default_table.cc b/met/internal_tests/libcode/vx_data2d/dump_default_table.cc index 864e4369b0..0bbac5baa1 100644 --- a/met/internal_tests/libcode/vx_data2d/dump_default_table.cc +++ b/met/internal_tests/libcode/vx_data2d/dump_default_table.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_data2d/test_table_read.cc b/met/internal_tests/libcode/vx_data2d/test_table_read.cc index 0bc20383c6..0d726501cd 100644 --- a/met/internal_tests/libcode/vx_data2d/test_table_read.cc +++ b/met/internal_tests/libcode/vx_data2d/test_table_read.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_data2d_factory/test_factory.cc b/met/internal_tests/libcode/vx_data2d_factory/test_factory.cc index 76d2de46f1..0701e448b8 100644 --- a/met/internal_tests/libcode/vx_data2d_factory/test_factory.cc +++ b/met/internal_tests/libcode/vx_data2d_factory/test_factory.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_data2d_factory/test_is_grib.cc b/met/internal_tests/libcode/vx_data2d_factory/test_is_grib.cc index 1e5a60b7ba..7100114d20 100644 --- a/met/internal_tests/libcode/vx_data2d_factory/test_is_grib.cc +++ b/met/internal_tests/libcode/vx_data2d_factory/test_is_grib.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_data2d_grib/test_read_grib1.cc b/met/internal_tests/libcode/vx_data2d_grib/test_read_grib1.cc index 4b229f94df..0595ef9ff6 100644 --- a/met/internal_tests/libcode/vx_data2d_grib/test_read_grib1.cc +++ b/met/internal_tests/libcode/vx_data2d_grib/test_read_grib1.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_data2d_nc_met/test_read_nc_met.cc b/met/internal_tests/libcode/vx_data2d_nc_met/test_read_nc_met.cc index f2d9d9b1eb..b4f7b00cf7 100644 --- a/met/internal_tests/libcode/vx_data2d_nc_met/test_read_nc_met.cc +++ b/met/internal_tests/libcode/vx_data2d_nc_met/test_read_nc_met.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_data2d_nccf/test_read_nccf.cc b/met/internal_tests/libcode/vx_data2d_nccf/test_read_nccf.cc index 7fb2b96248..60dea1f633 100644 --- a/met/internal_tests/libcode/vx_data2d_nccf/test_read_nccf.cc +++ b/met/internal_tests/libcode/vx_data2d_nccf/test_read_nccf.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_geodesy/test_spheroid.cc b/met/internal_tests/libcode/vx_geodesy/test_spheroid.cc index 1170852b6e..dd6e8392e7 100644 --- a/met/internal_tests/libcode/vx_geodesy/test_spheroid.cc +++ b/met/internal_tests/libcode/vx_geodesy/test_spheroid.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_grid/test_grid_area.cc b/met/internal_tests/libcode/vx_grid/test_grid_area.cc index 35ea95457c..28e95dda08 100644 --- a/met/internal_tests/libcode/vx_grid/test_grid_area.cc +++ b/met/internal_tests/libcode/vx_grid/test_grid_area.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_nc_util/test_pressure_levels.cc b/met/internal_tests/libcode/vx_nc_util/test_pressure_levels.cc index a79fab07b6..ed1e369549 100644 --- a/met/internal_tests/libcode/vx_nc_util/test_pressure_levels.cc +++ b/met/internal_tests/libcode/vx_nc_util/test_pressure_levels.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_physics/test_thermo.cc b/met/internal_tests/libcode/vx_physics/test_thermo.cc index 86cfe41339..49d1ad5622 100644 --- a/met/internal_tests/libcode/vx_physics/test_thermo.cc +++ b/met/internal_tests/libcode/vx_physics/test_thermo.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_plot_util/test_map_region.cc b/met/internal_tests/libcode/vx_plot_util/test_map_region.cc index a46ca42b94..4bad8a606f 100644 --- a/met/internal_tests/libcode/vx_plot_util/test_map_region.cc +++ b/met/internal_tests/libcode/vx_plot_util/test_map_region.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_ps/test_ps.cc b/met/internal_tests/libcode/vx_ps/test_ps.cc index 21aa68fde8..a5db88dc92 100644 --- a/met/internal_tests/libcode/vx_ps/test_ps.cc +++ b/met/internal_tests/libcode/vx_ps/test_ps.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_series_data/test_series_data.cc b/met/internal_tests/libcode/vx_series_data/test_series_data.cc index b7e92b3182..f2396821cd 100644 --- a/met/internal_tests/libcode/vx_series_data/test_series_data.cc +++ b/met/internal_tests/libcode/vx_series_data/test_series_data.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_solar/test_ra_dec.cc b/met/internal_tests/libcode/vx_solar/test_ra_dec.cc index 818ca6d823..1318e77bf2 100644 --- a/met/internal_tests/libcode/vx_solar/test_ra_dec.cc +++ b/met/internal_tests/libcode/vx_solar/test_ra_dec.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_tc_util/test_read.cc b/met/internal_tests/libcode/vx_tc_util/test_read.cc index 568fead189..bcd29bbf3c 100644 --- a/met/internal_tests/libcode/vx_tc_util/test_read.cc +++ b/met/internal_tests/libcode/vx_tc_util/test_read.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_tc_util/test_read_prob.cc b/met/internal_tests/libcode/vx_tc_util/test_read_prob.cc index 112defbab6..402876f47c 100644 --- a/met/internal_tests/libcode/vx_tc_util/test_read_prob.cc +++ b/met/internal_tests/libcode/vx_tc_util/test_read_prob.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/libcode/vx_tc_util/test_read_rmw.cc b/met/internal_tests/libcode/vx_tc_util/test_read_rmw.cc index 3b8beceacf..cffcd916bb 100644 --- a/met/internal_tests/libcode/vx_tc_util/test_read_rmw.cc +++ b/met/internal_tests/libcode/vx_tc_util/test_read_rmw.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2019 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/internal_tests/tools/other/mode_time_domain/test_velocity.cc b/met/internal_tests/tools/other/mode_time_domain/test_velocity.cc index a3d8b07506..802db6a97a 100644 --- a/met/internal_tests/tools/other/mode_time_domain/test_velocity.cc +++ b/met/internal_tests/tools/other/mode_time_domain/test_velocity.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/enum_to_string/code.cc b/met/src/basic/enum_to_string/code.cc index 3f70163872..ed79e593e5 100644 --- a/met/src/basic/enum_to_string/code.cc +++ b/met/src/basic/enum_to_string/code.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/enum_to_string/code.h b/met/src/basic/enum_to_string/code.h index e8092f6de2..244841bf13 100644 --- a/met/src/basic/enum_to_string/code.h +++ b/met/src/basic/enum_to_string/code.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/enum_to_string/enum.tab.h b/met/src/basic/enum_to_string/enum.tab.h index 6c3d1558ee..9c325b693b 100644 --- a/met/src/basic/enum_to_string/enum.tab.h +++ b/met/src/basic/enum_to_string/enum.tab.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/enum_to_string/enum_to_string.cc b/met/src/basic/enum_to_string/enum_to_string.cc index df22281acd..9ef21eb944 100644 --- a/met/src/basic/enum_to_string/enum_to_string.cc +++ b/met/src/basic/enum_to_string/enum_to_string.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/enum_to_string/info.cc b/met/src/basic/enum_to_string/info.cc index 2e06af874d..ba716a3ce1 100644 --- a/met/src/basic/enum_to_string/info.cc +++ b/met/src/basic/enum_to_string/info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/enum_to_string/info.h b/met/src/basic/enum_to_string/info.h index 884e31d91d..d05e27d635 100644 --- a/met/src/basic/enum_to_string/info.h +++ b/met/src/basic/enum_to_string/info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/enum_to_string/scope.cc b/met/src/basic/enum_to_string/scope.cc index 53aa01072a..703d3b5215 100644 --- a/met/src/basic/enum_to_string/scope.cc +++ b/met/src/basic/enum_to_string/scope.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/enum_to_string/scope.h b/met/src/basic/enum_to_string/scope.h index 8a567715b7..8ef6312b73 100644 --- a/met/src/basic/enum_to_string/scope.h +++ b/met/src/basic/enum_to_string/scope.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_cal/date_to_mjd.cc b/met/src/basic/vx_cal/date_to_mjd.cc index e9dc3b030c..faaa780f59 100644 --- a/met/src/basic/vx_cal/date_to_mjd.cc +++ b/met/src/basic/vx_cal/date_to_mjd.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_cal/day_dif.cc b/met/src/basic/vx_cal/day_dif.cc index dffe716c65..91bba5a773 100644 --- a/met/src/basic/vx_cal/day_dif.cc +++ b/met/src/basic/vx_cal/day_dif.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_cal/day_of_week.cc b/met/src/basic/vx_cal/day_of_week.cc index 42f4f16f83..fc4939b7f8 100644 --- a/met/src/basic/vx_cal/day_of_week.cc +++ b/met/src/basic/vx_cal/day_of_week.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_cal/doyhms_to_unix.cc b/met/src/basic/vx_cal/doyhms_to_unix.cc index 69a10b95a6..e4183ada5b 100644 --- a/met/src/basic/vx_cal/doyhms_to_unix.cc +++ b/met/src/basic/vx_cal/doyhms_to_unix.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_cal/is_dst.cc b/met/src/basic/vx_cal/is_dst.cc index 92ee8b65a9..57b9b2dfb0 100644 --- a/met/src/basic/vx_cal/is_dst.cc +++ b/met/src/basic/vx_cal/is_dst.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_cal/is_leap_year.cc b/met/src/basic/vx_cal/is_leap_year.cc index 07eb197103..53e642b8e7 100644 --- a/met/src/basic/vx_cal/is_leap_year.cc +++ b/met/src/basic/vx_cal/is_leap_year.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_cal/mdyhms_to_unix.cc b/met/src/basic/vx_cal/mdyhms_to_unix.cc index 20b0b97626..ea09fa197c 100644 --- a/met/src/basic/vx_cal/mdyhms_to_unix.cc +++ b/met/src/basic/vx_cal/mdyhms_to_unix.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_cal/mjd_to_date.cc b/met/src/basic/vx_cal/mjd_to_date.cc index 5be0176473..df7023f85a 100644 --- a/met/src/basic/vx_cal/mjd_to_date.cc +++ b/met/src/basic/vx_cal/mjd_to_date.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_cal/time_array.cc b/met/src/basic/vx_cal/time_array.cc index 29439a0c5e..4521693ed9 100644 --- a/met/src/basic/vx_cal/time_array.cc +++ b/met/src/basic/vx_cal/time_array.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_cal/time_array.h b/met/src/basic/vx_cal/time_array.h index fc35d26188..d1523b904f 100644 --- a/met/src/basic/vx_cal/time_array.h +++ b/met/src/basic/vx_cal/time_array.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_cal/time_strings.cc b/met/src/basic/vx_cal/time_strings.cc index 4f3ce06446..d15dea5280 100644 --- a/met/src/basic/vx_cal/time_strings.cc +++ b/met/src/basic/vx_cal/time_strings.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_cal/unix_string.cc b/met/src/basic/vx_cal/unix_string.cc index 0c2d22cc0f..2897d5a0cd 100644 --- a/met/src/basic/vx_cal/unix_string.cc +++ b/met/src/basic/vx_cal/unix_string.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_cal/unix_to_mdyhms.cc b/met/src/basic/vx_cal/unix_to_mdyhms.cc index fd30575698..5f5bf1dbfc 100644 --- a/met/src/basic/vx_cal/unix_to_mdyhms.cc +++ b/met/src/basic/vx_cal/unix_to_mdyhms.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_cal/vx_cal.h b/met/src/basic/vx_cal/vx_cal.h index cdff7e7a31..4648f2ed77 100644 --- a/met/src/basic/vx_cal/vx_cal.h +++ b/met/src/basic/vx_cal/vx_cal.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/builtin.cc b/met/src/basic/vx_config/builtin.cc index d0f2fedfb0..4396064a80 100644 --- a/met/src/basic/vx_config/builtin.cc +++ b/met/src/basic/vx_config/builtin.cc @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/builtin.h b/met/src/basic/vx_config/builtin.h index 48c2307527..d2691a2e5f 100644 --- a/met/src/basic/vx_config/builtin.h +++ b/met/src/basic/vx_config/builtin.h @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/calculator.cc b/met/src/basic/vx_config/calculator.cc index 17b2de7c05..bd7813f48f 100644 --- a/met/src/basic/vx_config/calculator.cc +++ b/met/src/basic/vx_config/calculator.cc @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/calculator.h b/met/src/basic/vx_config/calculator.h index e48c389b56..32c2d5f3c7 100644 --- a/met/src/basic/vx_config/calculator.h +++ b/met/src/basic/vx_config/calculator.h @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/config_constants.h b/met/src/basic/vx_config/config_constants.h index a6431fca54..2bb5acbeb8 100644 --- a/met/src/basic/vx_config/config_constants.h +++ b/met/src/basic/vx_config/config_constants.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/config_file.cc b/met/src/basic/vx_config/config_file.cc index 736444d85b..8b289a7487 100644 --- a/met/src/basic/vx_config/config_file.cc +++ b/met/src/basic/vx_config/config_file.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/config_file.h b/met/src/basic/vx_config/config_file.h index ced862aeaa..b3e90d80ff 100644 --- a/met/src/basic/vx_config/config_file.h +++ b/met/src/basic/vx_config/config_file.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/config_funcs.cc b/met/src/basic/vx_config/config_funcs.cc index 253a3d2729..adaf585f34 100644 --- a/met/src/basic/vx_config/config_funcs.cc +++ b/met/src/basic/vx_config/config_funcs.cc @@ -3,7 +3,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/config_funcs.h b/met/src/basic/vx_config/config_funcs.h index 87b1eb0b23..6f1db7c0c1 100644 --- a/met/src/basic/vx_config/config_funcs.h +++ b/met/src/basic/vx_config/config_funcs.h @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/config_gaussian.h b/met/src/basic/vx_config/config_gaussian.h index 136d4cf3a3..1a8e193231 100644 --- a/met/src/basic/vx_config/config_gaussian.h +++ b/met/src/basic/vx_config/config_gaussian.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2019 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/config_util.cc b/met/src/basic/vx_config/config_util.cc index 6eb13ef7a5..c55fd819ae 100644 --- a/met/src/basic/vx_config/config_util.cc +++ b/met/src/basic/vx_config/config_util.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/config_util.h b/met/src/basic/vx_config/config_util.h index ced39afb2d..a17d2badd3 100644 --- a/met/src/basic/vx_config/config_util.h +++ b/met/src/basic/vx_config/config_util.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////// // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/data_file_type.h b/met/src/basic/vx_config/data_file_type.h index 8586ab379e..f1407b5004 100644 --- a/met/src/basic/vx_config/data_file_type.h +++ b/met/src/basic/vx_config/data_file_type.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/dictionary.cc b/met/src/basic/vx_config/dictionary.cc index 68421e5fce..cbe3013cba 100644 --- a/met/src/basic/vx_config/dictionary.cc +++ b/met/src/basic/vx_config/dictionary.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/dictionary.h b/met/src/basic/vx_config/dictionary.h index 6aeac17bb5..a39949be04 100644 --- a/met/src/basic/vx_config/dictionary.h +++ b/met/src/basic/vx_config/dictionary.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/icode.cc b/met/src/basic/vx_config/icode.cc index 5104cb7bc6..a45736daf1 100644 --- a/met/src/basic/vx_config/icode.cc +++ b/met/src/basic/vx_config/icode.cc @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/icode.h b/met/src/basic/vx_config/icode.h index a1d1fbe95f..f0db2d0afb 100644 --- a/met/src/basic/vx_config/icode.h +++ b/met/src/basic/vx_config/icode.h @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/idstack.cc b/met/src/basic/vx_config/idstack.cc index 00013ac045..49b94c53af 100644 --- a/met/src/basic/vx_config/idstack.cc +++ b/met/src/basic/vx_config/idstack.cc @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/idstack.h b/met/src/basic/vx_config/idstack.h index 427c00545b..b50f3c1b90 100644 --- a/met/src/basic/vx_config/idstack.h +++ b/met/src/basic/vx_config/idstack.h @@ -2,7 +2,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/number_stack.cc b/met/src/basic/vx_config/number_stack.cc index d5e5d14c9a..92e557a4e6 100644 --- a/met/src/basic/vx_config/number_stack.cc +++ b/met/src/basic/vx_config/number_stack.cc @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/number_stack.h b/met/src/basic/vx_config/number_stack.h index 473eb7a518..31a53b6888 100644 --- a/met/src/basic/vx_config/number_stack.h +++ b/met/src/basic/vx_config/number_stack.h @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/object_types.h b/met/src/basic/vx_config/object_types.h index a9ae9f907e..9da202d731 100644 --- a/met/src/basic/vx_config/object_types.h +++ b/met/src/basic/vx_config/object_types.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/scanner_stuff.h b/met/src/basic/vx_config/scanner_stuff.h index e17a8089fa..2474c740ad 100644 --- a/met/src/basic/vx_config/scanner_stuff.h +++ b/met/src/basic/vx_config/scanner_stuff.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/temp_file.cc b/met/src/basic/vx_config/temp_file.cc index 40c929e413..5746993957 100644 --- a/met/src/basic/vx_config/temp_file.cc +++ b/met/src/basic/vx_config/temp_file.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/temp_file.h b/met/src/basic/vx_config/temp_file.h index 2603a494aa..d46c99317a 100644 --- a/met/src/basic/vx_config/temp_file.h +++ b/met/src/basic/vx_config/temp_file.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/threshold.cc b/met/src/basic/vx_config/threshold.cc index b75ec9784a..bb1dfaa49a 100644 --- a/met/src/basic/vx_config/threshold.cc +++ b/met/src/basic/vx_config/threshold.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/threshold.h b/met/src/basic/vx_config/threshold.h index 493173e58d..cf7d5640fe 100644 --- a/met/src/basic/vx_config/threshold.h +++ b/met/src/basic/vx_config/threshold.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_config/vx_config.h b/met/src/basic/vx_config/vx_config.h index 22d755317c..98550a5b22 100644 --- a/met/src/basic/vx_config/vx_config.h +++ b/met/src/basic/vx_config/vx_config.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_log/concat_string.cc b/met/src/basic/vx_log/concat_string.cc index 0f2b97e63b..9fea23870b 100644 --- a/met/src/basic/vx_log/concat_string.cc +++ b/met/src/basic/vx_log/concat_string.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_log/concat_string.h b/met/src/basic/vx_log/concat_string.h index b4c472de6c..29903f8e40 100644 --- a/met/src/basic/vx_log/concat_string.h +++ b/met/src/basic/vx_log/concat_string.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_log/file_fxns.cc b/met/src/basic/vx_log/file_fxns.cc index 52ed4d4a0e..16a98ce261 100644 --- a/met/src/basic/vx_log/file_fxns.cc +++ b/met/src/basic/vx_log/file_fxns.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_log/file_fxns.h b/met/src/basic/vx_log/file_fxns.h index 6e2dfb652c..4b868bbdbf 100644 --- a/met/src/basic/vx_log/file_fxns.h +++ b/met/src/basic/vx_log/file_fxns.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_log/indent.cc b/met/src/basic/vx_log/indent.cc index 1d6de068b5..0c70ff60df 100644 --- a/met/src/basic/vx_log/indent.cc +++ b/met/src/basic/vx_log/indent.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_log/indent.h b/met/src/basic/vx_log/indent.h index 1e3e940938..63f0d6af48 100644 --- a/met/src/basic/vx_log/indent.h +++ b/met/src/basic/vx_log/indent.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_log/logger.cc b/met/src/basic/vx_log/logger.cc index 31f49d15b3..899fbffd2e 100644 --- a/met/src/basic/vx_log/logger.cc +++ b/met/src/basic/vx_log/logger.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_log/logger.h b/met/src/basic/vx_log/logger.h index fed112ae51..6a92e43e71 100644 --- a/met/src/basic/vx_log/logger.h +++ b/met/src/basic/vx_log/logger.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_log/string_array.cc b/met/src/basic/vx_log/string_array.cc index e48a46e2b3..5894d80f2e 100644 --- a/met/src/basic/vx_log/string_array.cc +++ b/met/src/basic/vx_log/string_array.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_log/string_array.h b/met/src/basic/vx_log/string_array.h index 8cec395275..d940ef3958 100644 --- a/met/src/basic/vx_log/string_array.h +++ b/met/src/basic/vx_log/string_array.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_log/vx_log.h b/met/src/basic/vx_log/vx_log.h index c1d7b75f0a..3dfa05f868 100644 --- a/met/src/basic/vx_log/vx_log.h +++ b/met/src/basic/vx_log/vx_log.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/affine.cc b/met/src/basic/vx_math/affine.cc index 21d0c97bc2..b7094024e1 100644 --- a/met/src/basic/vx_math/affine.cc +++ b/met/src/basic/vx_math/affine.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/affine.h b/met/src/basic/vx_math/affine.h index 5294509d29..7e05c53496 100644 --- a/met/src/basic/vx_math/affine.h +++ b/met/src/basic/vx_math/affine.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/angles.cc b/met/src/basic/vx_math/angles.cc index fcef01f0cd..4e7be72e40 100644 --- a/met/src/basic/vx_math/angles.cc +++ b/met/src/basic/vx_math/angles.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/angles.h b/met/src/basic/vx_math/angles.h index 8841ad3e5d..5a53164aff 100644 --- a/met/src/basic/vx_math/angles.h +++ b/met/src/basic/vx_math/angles.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/hist.cc b/met/src/basic/vx_math/hist.cc index 1a5a0d2842..73d5ac2291 100644 --- a/met/src/basic/vx_math/hist.cc +++ b/met/src/basic/vx_math/hist.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/hist.h b/met/src/basic/vx_math/hist.h index f7b764a971..2580ad57c4 100644 --- a/met/src/basic/vx_math/hist.h +++ b/met/src/basic/vx_math/hist.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/is_bad_data.h b/met/src/basic/vx_math/is_bad_data.h index e08a5d15bf..809fa2f210 100644 --- a/met/src/basic/vx_math/is_bad_data.h +++ b/met/src/basic/vx_math/is_bad_data.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/legendre.cc b/met/src/basic/vx_math/legendre.cc index 8781f5b8f1..34521d3dfd 100644 --- a/met/src/basic/vx_math/legendre.cc +++ b/met/src/basic/vx_math/legendre.cc @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/legendre.h b/met/src/basic/vx_math/legendre.h index 4845ba9392..fca0738f72 100644 --- a/met/src/basic/vx_math/legendre.h +++ b/met/src/basic/vx_math/legendre.h @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/math_constants.h b/met/src/basic/vx_math/math_constants.h index b346d48a1c..b2638c4654 100644 --- a/met/src/basic/vx_math/math_constants.h +++ b/met/src/basic/vx_math/math_constants.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/nint.cc b/met/src/basic/vx_math/nint.cc index 98157bc265..f027903500 100644 --- a/met/src/basic/vx_math/nint.cc +++ b/met/src/basic/vx_math/nint.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/nint.h b/met/src/basic/vx_math/nint.h index cd431e46e4..3c466858d6 100644 --- a/met/src/basic/vx_math/nint.h +++ b/met/src/basic/vx_math/nint.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/nti.cc b/met/src/basic/vx_math/nti.cc index 31a0d04fad..bd19f6cfc2 100644 --- a/met/src/basic/vx_math/nti.cc +++ b/met/src/basic/vx_math/nti.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/nti.h b/met/src/basic/vx_math/nti.h index 582dd47165..b32d721ce2 100644 --- a/met/src/basic/vx_math/nti.h +++ b/met/src/basic/vx_math/nti.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/ptile.cc b/met/src/basic/vx_math/ptile.cc index c03dbda21d..a712c6ff05 100644 --- a/met/src/basic/vx_math/ptile.cc +++ b/met/src/basic/vx_math/ptile.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/ptile.h b/met/src/basic/vx_math/ptile.h index 9c129fef65..46a91c69f7 100644 --- a/met/src/basic/vx_math/ptile.h +++ b/met/src/basic/vx_math/ptile.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/pwl.cc b/met/src/basic/vx_math/pwl.cc index cc74432afe..102ecf586c 100644 --- a/met/src/basic/vx_math/pwl.cc +++ b/met/src/basic/vx_math/pwl.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/pwl.h b/met/src/basic/vx_math/pwl.h index 64f562ff61..22e6894dbb 100644 --- a/met/src/basic/vx_math/pwl.h +++ b/met/src/basic/vx_math/pwl.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/so3.cc b/met/src/basic/vx_math/so3.cc index 8b83539c80..41e3dbc82b 100644 --- a/met/src/basic/vx_math/so3.cc +++ b/met/src/basic/vx_math/so3.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/so3.h b/met/src/basic/vx_math/so3.h index 876e14bdbe..9d6a8e7377 100644 --- a/met/src/basic/vx_math/so3.h +++ b/met/src/basic/vx_math/so3.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/trig.h b/met/src/basic/vx_math/trig.h index 9893555b98..d88a2aeb79 100644 --- a/met/src/basic/vx_math/trig.h +++ b/met/src/basic/vx_math/trig.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/vx_math.h b/met/src/basic/vx_math/vx_math.h index e25093129a..08dc84b355 100644 --- a/met/src/basic/vx_math/vx_math.h +++ b/met/src/basic/vx_math/vx_math.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/vx_vector.cc b/met/src/basic/vx_math/vx_vector.cc index 5225259aec..a1fd9fe12a 100644 --- a/met/src/basic/vx_math/vx_vector.cc +++ b/met/src/basic/vx_math/vx_vector.cc @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_math/vx_vector.h b/met/src/basic/vx_math/vx_vector.h index 17cf3b1961..960ba8b63e 100644 --- a/met/src/basic/vx_math/vx_vector.h +++ b/met/src/basic/vx_math/vx_vector.h @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/CircularTemplate.cc b/met/src/basic/vx_util/CircularTemplate.cc index 31d24ff113..a49f40c62f 100644 --- a/met/src/basic/vx_util/CircularTemplate.cc +++ b/met/src/basic/vx_util/CircularTemplate.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1990 - 2018 +// ** Copyright UCAR (c) 1990 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Boulder, Colorado, USA diff --git a/met/src/basic/vx_util/CircularTemplate.h b/met/src/basic/vx_util/CircularTemplate.h index d8d9917598..fc92c7db8b 100644 --- a/met/src/basic/vx_util/CircularTemplate.h +++ b/met/src/basic/vx_util/CircularTemplate.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1990 - 2018 +// ** Copyright UCAR (c) 1990 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Boulder, Colorado, USA diff --git a/met/src/basic/vx_util/GridOffset.cc b/met/src/basic/vx_util/GridOffset.cc index da82e4cc27..4ae65fdf57 100644 --- a/met/src/basic/vx_util/GridOffset.cc +++ b/met/src/basic/vx_util/GridOffset.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1990 - 2018 +// ** Copyright UCAR (c) 1990 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Boulder, Colorado, USA diff --git a/met/src/basic/vx_util/GridOffset.h b/met/src/basic/vx_util/GridOffset.h index 941c67b3a4..8e4826011b 100644 --- a/met/src/basic/vx_util/GridOffset.h +++ b/met/src/basic/vx_util/GridOffset.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1990 - 2018 +// ** Copyright UCAR (c) 1990 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Boulder, Colorado, USA diff --git a/met/src/basic/vx_util/GridPoint.cc b/met/src/basic/vx_util/GridPoint.cc index fd260d9f4f..82581f2aeb 100644 --- a/met/src/basic/vx_util/GridPoint.cc +++ b/met/src/basic/vx_util/GridPoint.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1990 - 2018 +// ** Copyright UCAR (c) 1990 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Boulder, Colorado, USA diff --git a/met/src/basic/vx_util/GridPoint.h b/met/src/basic/vx_util/GridPoint.h index 67fa533488..84876e37fe 100644 --- a/met/src/basic/vx_util/GridPoint.h +++ b/met/src/basic/vx_util/GridPoint.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1990 - 2018 +// ** Copyright UCAR (c) 1990 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Boulder, Colorado, USA diff --git a/met/src/basic/vx_util/GridTemplate.cc b/met/src/basic/vx_util/GridTemplate.cc index 6ce6ee3f5a..85926d8ae5 100644 --- a/met/src/basic/vx_util/GridTemplate.cc +++ b/met/src/basic/vx_util/GridTemplate.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1990 - 2018 +// ** Copyright UCAR (c) 1990 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Boulder, Colorado, USA diff --git a/met/src/basic/vx_util/GridTemplate.h b/met/src/basic/vx_util/GridTemplate.h index 7388249977..28cfffec62 100644 --- a/met/src/basic/vx_util/GridTemplate.h +++ b/met/src/basic/vx_util/GridTemplate.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1990 - 2018 +// ** Copyright UCAR (c) 1990 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Boulder, Colorado, USA diff --git a/met/src/basic/vx_util/RectangularTemplate.cc b/met/src/basic/vx_util/RectangularTemplate.cc index 811861ca96..59c06901a0 100644 --- a/met/src/basic/vx_util/RectangularTemplate.cc +++ b/met/src/basic/vx_util/RectangularTemplate.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1990 - 2018 +// ** Copyright UCAR (c) 1990 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Boulder, Colorado, USA diff --git a/met/src/basic/vx_util/RectangularTemplate.h b/met/src/basic/vx_util/RectangularTemplate.h index 8ab12a9ec0..b45dcb6a77 100644 --- a/met/src/basic/vx_util/RectangularTemplate.h +++ b/met/src/basic/vx_util/RectangularTemplate.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1990 - 2018 +// ** Copyright UCAR (c) 1990 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Boulder, Colorado, USA diff --git a/met/src/basic/vx_util/ascii_header.cc b/met/src/basic/vx_util/ascii_header.cc index 553435cc88..48a967e84d 100644 --- a/met/src/basic/vx_util/ascii_header.cc +++ b/met/src/basic/vx_util/ascii_header.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/ascii_header.h b/met/src/basic/vx_util/ascii_header.h index 3d70361c82..0046f68c12 100644 --- a/met/src/basic/vx_util/ascii_header.h +++ b/met/src/basic/vx_util/ascii_header.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/ascii_table.cc b/met/src/basic/vx_util/ascii_table.cc index 04b19a30c3..910e5165d9 100644 --- a/met/src/basic/vx_util/ascii_table.cc +++ b/met/src/basic/vx_util/ascii_table.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/ascii_table.h b/met/src/basic/vx_util/ascii_table.h index 701804e666..4e0ed53804 100644 --- a/met/src/basic/vx_util/ascii_table.h +++ b/met/src/basic/vx_util/ascii_table.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/bool_to_string.h b/met/src/basic/vx_util/bool_to_string.h index dc93543173..c99cbb8978 100644 --- a/met/src/basic/vx_util/bool_to_string.h +++ b/met/src/basic/vx_util/bool_to_string.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/check_endian.cc b/met/src/basic/vx_util/check_endian.cc index 260f6d6c8f..795d7014a1 100644 --- a/met/src/basic/vx_util/check_endian.cc +++ b/met/src/basic/vx_util/check_endian.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/check_endian.h b/met/src/basic/vx_util/check_endian.h index 60c5f33ae4..bd4f65dec3 100644 --- a/met/src/basic/vx_util/check_endian.h +++ b/met/src/basic/vx_util/check_endian.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/comma_string.cc b/met/src/basic/vx_util/comma_string.cc index 98f3c9ae27..5535b63158 100644 --- a/met/src/basic/vx_util/comma_string.cc +++ b/met/src/basic/vx_util/comma_string.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/comma_string.h b/met/src/basic/vx_util/comma_string.h index ff89ddb11c..b7cbfaad83 100644 --- a/met/src/basic/vx_util/comma_string.h +++ b/met/src/basic/vx_util/comma_string.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/command_line.cc b/met/src/basic/vx_util/command_line.cc index 93fe6caa90..01a90bcb40 100644 --- a/met/src/basic/vx_util/command_line.cc +++ b/met/src/basic/vx_util/command_line.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/command_line.h b/met/src/basic/vx_util/command_line.h index 6cc72e838a..3cb114e980 100644 --- a/met/src/basic/vx_util/command_line.h +++ b/met/src/basic/vx_util/command_line.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/conversions.cc b/met/src/basic/vx_util/conversions.cc index 51baf1ec80..1851570488 100644 --- a/met/src/basic/vx_util/conversions.cc +++ b/met/src/basic/vx_util/conversions.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/conversions.h b/met/src/basic/vx_util/conversions.h index bd3a648123..1aae66121e 100644 --- a/met/src/basic/vx_util/conversions.h +++ b/met/src/basic/vx_util/conversions.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/crc_array.h b/met/src/basic/vx_util/crc_array.h index 8bd7b8d0aa..4fa5a99e6c 100644 --- a/met/src/basic/vx_util/crc_array.h +++ b/met/src/basic/vx_util/crc_array.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/crr_array.h b/met/src/basic/vx_util/crr_array.h index 79376d10eb..b6e9d877e7 100644 --- a/met/src/basic/vx_util/crr_array.h +++ b/met/src/basic/vx_util/crr_array.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/data_cube.cc b/met/src/basic/vx_util/data_cube.cc index 361fc77926..fcc416eca8 100644 --- a/met/src/basic/vx_util/data_cube.cc +++ b/met/src/basic/vx_util/data_cube.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/data_cube.h b/met/src/basic/vx_util/data_cube.h index 86982607db..7bee93e35e 100644 --- a/met/src/basic/vx_util/data_cube.h +++ b/met/src/basic/vx_util/data_cube.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/data_line.cc b/met/src/basic/vx_util/data_line.cc index 16f275327e..0a155a8eb2 100644 --- a/met/src/basic/vx_util/data_line.cc +++ b/met/src/basic/vx_util/data_line.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/data_line.h b/met/src/basic/vx_util/data_line.h index 0bb41ed9f9..d65c0dfbb5 100644 --- a/met/src/basic/vx_util/data_line.h +++ b/met/src/basic/vx_util/data_line.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/data_plane.cc b/met/src/basic/vx_util/data_plane.cc index 6f9223672c..043e1d7c7b 100644 --- a/met/src/basic/vx_util/data_plane.cc +++ b/met/src/basic/vx_util/data_plane.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/data_plane.h b/met/src/basic/vx_util/data_plane.h index 2a4f869225..54e3606b55 100644 --- a/met/src/basic/vx_util/data_plane.h +++ b/met/src/basic/vx_util/data_plane.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/data_plane_util.cc b/met/src/basic/vx_util/data_plane_util.cc index 7174a36b84..7b01b09f71 100644 --- a/met/src/basic/vx_util/data_plane_util.cc +++ b/met/src/basic/vx_util/data_plane_util.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/data_plane_util.h b/met/src/basic/vx_util/data_plane_util.h index 6d6e5fa456..401a22c2f7 100644 --- a/met/src/basic/vx_util/data_plane_util.h +++ b/met/src/basic/vx_util/data_plane_util.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/empty_string.h b/met/src/basic/vx_util/empty_string.h index b1ea9a7b61..b1ef49e074 100644 --- a/met/src/basic/vx_util/empty_string.h +++ b/met/src/basic/vx_util/empty_string.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/file_exists.cc b/met/src/basic/vx_util/file_exists.cc index 809defc109..fcf6b07203 100644 --- a/met/src/basic/vx_util/file_exists.cc +++ b/met/src/basic/vx_util/file_exists.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/file_exists.h b/met/src/basic/vx_util/file_exists.h index cd67bc73b5..202109ec75 100644 --- a/met/src/basic/vx_util/file_exists.h +++ b/met/src/basic/vx_util/file_exists.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/file_linecount.cc b/met/src/basic/vx_util/file_linecount.cc index 39ae299dcd..ce9840bc39 100644 --- a/met/src/basic/vx_util/file_linecount.cc +++ b/met/src/basic/vx_util/file_linecount.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/file_linecount.h b/met/src/basic/vx_util/file_linecount.h index ad4d628a3f..4a5ddfb0df 100644 --- a/met/src/basic/vx_util/file_linecount.h +++ b/met/src/basic/vx_util/file_linecount.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/file_size.cc b/met/src/basic/vx_util/file_size.cc index c058334d8d..c58e2785dd 100644 --- a/met/src/basic/vx_util/file_size.cc +++ b/met/src/basic/vx_util/file_size.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/file_size.h b/met/src/basic/vx_util/file_size.h index a036aecb0e..3a3d9f7293 100644 --- a/met/src/basic/vx_util/file_size.h +++ b/met/src/basic/vx_util/file_size.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/filename_suffix.cc b/met/src/basic/vx_util/filename_suffix.cc index 1c781cad56..3cafe60f3a 100644 --- a/met/src/basic/vx_util/filename_suffix.cc +++ b/met/src/basic/vx_util/filename_suffix.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/filename_suffix.h b/met/src/basic/vx_util/filename_suffix.h index 7f42f15585..8cba40fa33 100644 --- a/met/src/basic/vx_util/filename_suffix.h +++ b/met/src/basic/vx_util/filename_suffix.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/fix_float.cc b/met/src/basic/vx_util/fix_float.cc index 9e214b9af6..8c9973efa7 100644 --- a/met/src/basic/vx_util/fix_float.cc +++ b/met/src/basic/vx_util/fix_float.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/fix_float.h b/met/src/basic/vx_util/fix_float.h index 8bcea2d9bf..775f2581df 100644 --- a/met/src/basic/vx_util/fix_float.h +++ b/met/src/basic/vx_util/fix_float.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/get_filenames.cc b/met/src/basic/vx_util/get_filenames.cc index 5a2f2eedfe..b777c78455 100644 --- a/met/src/basic/vx_util/get_filenames.cc +++ b/met/src/basic/vx_util/get_filenames.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/get_filenames.h b/met/src/basic/vx_util/get_filenames.h index d9586ef95c..3ee386a73b 100644 --- a/met/src/basic/vx_util/get_filenames.h +++ b/met/src/basic/vx_util/get_filenames.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/grib_constants.cc b/met/src/basic/vx_util/grib_constants.cc index b310d358ba..e5a1f594e3 100644 --- a/met/src/basic/vx_util/grib_constants.cc +++ b/met/src/basic/vx_util/grib_constants.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/grib_constants.h b/met/src/basic/vx_util/grib_constants.h index 68445aebf0..1b1fdfcc0a 100644 --- a/met/src/basic/vx_util/grib_constants.h +++ b/met/src/basic/vx_util/grib_constants.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/int_array.h b/met/src/basic/vx_util/int_array.h index de454043f5..08c815ef6c 100644 --- a/met/src/basic/vx_util/int_array.h +++ b/met/src/basic/vx_util/int_array.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/interp_mthd.cc b/met/src/basic/vx_util/interp_mthd.cc index 5ac02d9920..a0c8386a8c 100644 --- a/met/src/basic/vx_util/interp_mthd.cc +++ b/met/src/basic/vx_util/interp_mthd.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/interp_mthd.h b/met/src/basic/vx_util/interp_mthd.h index 4612946c28..88cf766d09 100644 --- a/met/src/basic/vx_util/interp_mthd.h +++ b/met/src/basic/vx_util/interp_mthd.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/interp_util.cc b/met/src/basic/vx_util/interp_util.cc index 9cb8a3d552..98cfa27ea4 100644 --- a/met/src/basic/vx_util/interp_util.cc +++ b/met/src/basic/vx_util/interp_util.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/interp_util.h b/met/src/basic/vx_util/interp_util.h index 39b5d8d50b..4369557be4 100644 --- a/met/src/basic/vx_util/interp_util.h +++ b/met/src/basic/vx_util/interp_util.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/is_number.cc b/met/src/basic/vx_util/is_number.cc index 7df8455bd0..f1c8b9c32f 100644 --- a/met/src/basic/vx_util/is_number.cc +++ b/met/src/basic/vx_util/is_number.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/is_number.h b/met/src/basic/vx_util/is_number.h index f7418166d1..201173e107 100644 --- a/met/src/basic/vx_util/is_number.h +++ b/met/src/basic/vx_util/is_number.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/long_array.cc b/met/src/basic/vx_util/long_array.cc index 92aa4b568a..b7a80b59b5 100644 --- a/met/src/basic/vx_util/long_array.cc +++ b/met/src/basic/vx_util/long_array.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/long_array.h b/met/src/basic/vx_util/long_array.h index e9ffbfb0f2..c3dc4bccb2 100644 --- a/met/src/basic/vx_util/long_array.h +++ b/met/src/basic/vx_util/long_array.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/make_path.cc b/met/src/basic/vx_util/make_path.cc index 28610c732b..6ccf6df9b4 100644 --- a/met/src/basic/vx_util/make_path.cc +++ b/met/src/basic/vx_util/make_path.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/make_path.h b/met/src/basic/vx_util/make_path.h index 05cb065162..6e7f1b0c3d 100644 --- a/met/src/basic/vx_util/make_path.h +++ b/met/src/basic/vx_util/make_path.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/mask_poly.cc b/met/src/basic/vx_util/mask_poly.cc index 9e23f15921..d7e332c6f4 100644 --- a/met/src/basic/vx_util/mask_poly.cc +++ b/met/src/basic/vx_util/mask_poly.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/mask_poly.h b/met/src/basic/vx_util/mask_poly.h index 9f346bd4e7..d466b986ed 100644 --- a/met/src/basic/vx_util/mask_poly.h +++ b/met/src/basic/vx_util/mask_poly.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/memory.cc b/met/src/basic/vx_util/memory.cc index 80f755c4e3..0189a3fd75 100644 --- a/met/src/basic/vx_util/memory.cc +++ b/met/src/basic/vx_util/memory.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/memory.h b/met/src/basic/vx_util/memory.h index 4d43ad70d7..37d6091a4d 100644 --- a/met/src/basic/vx_util/memory.h +++ b/met/src/basic/vx_util/memory.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/met_buffer.cc b/met/src/basic/vx_util/met_buffer.cc index ff66edc210..fb596913ea 100644 --- a/met/src/basic/vx_util/met_buffer.cc +++ b/met/src/basic/vx_util/met_buffer.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/met_buffer.h b/met/src/basic/vx_util/met_buffer.h index c742294509..9ea54b9779 100644 --- a/met/src/basic/vx_util/met_buffer.h +++ b/met/src/basic/vx_util/met_buffer.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/ncrr_array.h b/met/src/basic/vx_util/ncrr_array.h index bb5a18a7b0..c40e282fe5 100644 --- a/met/src/basic/vx_util/ncrr_array.h +++ b/met/src/basic/vx_util/ncrr_array.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/num_array.cc b/met/src/basic/vx_util/num_array.cc index bf80325736..9493b14fb2 100644 --- a/met/src/basic/vx_util/num_array.cc +++ b/met/src/basic/vx_util/num_array.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/num_array.h b/met/src/basic/vx_util/num_array.h index 073bda597d..8c24299a42 100644 --- a/met/src/basic/vx_util/num_array.h +++ b/met/src/basic/vx_util/num_array.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/observation.cc b/met/src/basic/vx_util/observation.cc index e9b3e8cc57..7a9d6e7c8c 100644 --- a/met/src/basic/vx_util/observation.cc +++ b/met/src/basic/vx_util/observation.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/observation.h b/met/src/basic/vx_util/observation.h index 6b6f59eb46..3c84d65405 100644 --- a/met/src/basic/vx_util/observation.h +++ b/met/src/basic/vx_util/observation.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/ordinal.cc b/met/src/basic/vx_util/ordinal.cc index a35fc2b84e..415a9e2634 100644 --- a/met/src/basic/vx_util/ordinal.cc +++ b/met/src/basic/vx_util/ordinal.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/ordinal.h b/met/src/basic/vx_util/ordinal.h index 5cd3a2c6f1..41872ca93d 100644 --- a/met/src/basic/vx_util/ordinal.h +++ b/met/src/basic/vx_util/ordinal.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/polyline.cc b/met/src/basic/vx_util/polyline.cc index efed2dc476..5b266bf22d 100644 --- a/met/src/basic/vx_util/polyline.cc +++ b/met/src/basic/vx_util/polyline.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/polyline.h b/met/src/basic/vx_util/polyline.h index 4ec8be0951..5502425d68 100644 --- a/met/src/basic/vx_util/polyline.h +++ b/met/src/basic/vx_util/polyline.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/python_line.cc b/met/src/basic/vx_util/python_line.cc index 43a4dfc7dd..75b838427c 100644 --- a/met/src/basic/vx_util/python_line.cc +++ b/met/src/basic/vx_util/python_line.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/python_line.h b/met/src/basic/vx_util/python_line.h index 5f994a144d..e65cf9ba0c 100644 --- a/met/src/basic/vx_util/python_line.h +++ b/met/src/basic/vx_util/python_line.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/read_fortran_binary.cc b/met/src/basic/vx_util/read_fortran_binary.cc index 5b66ab9ee9..2c37d4b16a 100644 --- a/met/src/basic/vx_util/read_fortran_binary.cc +++ b/met/src/basic/vx_util/read_fortran_binary.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/read_fortran_binary.h b/met/src/basic/vx_util/read_fortran_binary.h index e92cbc1401..7249c04bad 100644 --- a/met/src/basic/vx_util/read_fortran_binary.h +++ b/met/src/basic/vx_util/read_fortran_binary.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/roman_numeral.cc b/met/src/basic/vx_util/roman_numeral.cc index 1020146448..61af948566 100644 --- a/met/src/basic/vx_util/roman_numeral.cc +++ b/met/src/basic/vx_util/roman_numeral.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/roman_numeral.h b/met/src/basic/vx_util/roman_numeral.h index 97f41529da..68c9cf260f 100644 --- a/met/src/basic/vx_util/roman_numeral.h +++ b/met/src/basic/vx_util/roman_numeral.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/smart_buffer.cc b/met/src/basic/vx_util/smart_buffer.cc index 047e553696..c3ed7e8150 100644 --- a/met/src/basic/vx_util/smart_buffer.cc +++ b/met/src/basic/vx_util/smart_buffer.cc @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/smart_buffer.h b/met/src/basic/vx_util/smart_buffer.h index da88ae98e8..1982136c0c 100644 --- a/met/src/basic/vx_util/smart_buffer.h +++ b/met/src/basic/vx_util/smart_buffer.h @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/stat_column_defs.h b/met/src/basic/vx_util/stat_column_defs.h index c7661cb3cb..0aad50d004 100644 --- a/met/src/basic/vx_util/stat_column_defs.h +++ b/met/src/basic/vx_util/stat_column_defs.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/string_fxns.cc b/met/src/basic/vx_util/string_fxns.cc index e393a69b61..7b8ea2114a 100644 --- a/met/src/basic/vx_util/string_fxns.cc +++ b/met/src/basic/vx_util/string_fxns.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/string_fxns.h b/met/src/basic/vx_util/string_fxns.h index bdb8eb8d28..93b3973fd4 100644 --- a/met/src/basic/vx_util/string_fxns.h +++ b/met/src/basic/vx_util/string_fxns.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/substring.cc b/met/src/basic/vx_util/substring.cc index 8edfc68952..3a5f3af102 100644 --- a/met/src/basic/vx_util/substring.cc +++ b/met/src/basic/vx_util/substring.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/substring.h b/met/src/basic/vx_util/substring.h index 32eff138bd..a4dee4f502 100644 --- a/met/src/basic/vx_util/substring.h +++ b/met/src/basic/vx_util/substring.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/thresh_array.cc b/met/src/basic/vx_util/thresh_array.cc index 46f04ead85..50358a5d83 100644 --- a/met/src/basic/vx_util/thresh_array.cc +++ b/met/src/basic/vx_util/thresh_array.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/thresh_array.h b/met/src/basic/vx_util/thresh_array.h index 781af2e96c..d27dc087c9 100644 --- a/met/src/basic/vx_util/thresh_array.h +++ b/met/src/basic/vx_util/thresh_array.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/two_d_array.h b/met/src/basic/vx_util/two_d_array.h index 7de51ad3a3..d76777efa7 100644 --- a/met/src/basic/vx_util/two_d_array.h +++ b/met/src/basic/vx_util/two_d_array.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/two_to_one.cc b/met/src/basic/vx_util/two_to_one.cc index aad0e5b2be..3eb7142a18 100644 --- a/met/src/basic/vx_util/two_to_one.cc +++ b/met/src/basic/vx_util/two_to_one.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/two_to_one.h b/met/src/basic/vx_util/two_to_one.h index 059492f152..72d5e8c8c6 100644 --- a/met/src/basic/vx_util/two_to_one.h +++ b/met/src/basic/vx_util/two_to_one.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/util_constants.h b/met/src/basic/vx_util/util_constants.h index fd55319b40..a83e4717a6 100644 --- a/met/src/basic/vx_util/util_constants.h +++ b/met/src/basic/vx_util/util_constants.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/basic/vx_util/vx_util.h b/met/src/basic/vx_util/vx_util.h index 05fdd41ab5..f8a79c5767 100644 --- a/met/src/basic/vx_util/vx_util.h +++ b/met/src/basic/vx_util/vx_util.h @@ -1,6 +1,6 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_afm/afm.cc b/met/src/libcode/vx_afm/afm.cc index 1003adb2d6..23df3616e3 100644 --- a/met/src/libcode/vx_afm/afm.cc +++ b/met/src/libcode/vx_afm/afm.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_afm/afm.h b/met/src/libcode/vx_afm/afm.h index 9b79eed461..5842a83f06 100644 --- a/met/src/libcode/vx_afm/afm.h +++ b/met/src/libcode/vx_afm/afm.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_afm/afm_keywords.cc b/met/src/libcode/vx_afm/afm_keywords.cc index 7dcd1490af..3007118b03 100644 --- a/met/src/libcode/vx_afm/afm_keywords.cc +++ b/met/src/libcode/vx_afm/afm_keywords.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_afm/afm_keywords.h b/met/src/libcode/vx_afm/afm_keywords.h index 471804f123..03aa9c5ea1 100644 --- a/met/src/libcode/vx_afm/afm_keywords.h +++ b/met/src/libcode/vx_afm/afm_keywords.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_afm/afm_line.cc b/met/src/libcode/vx_afm/afm_line.cc index 9f63760c68..686b8a4ba8 100644 --- a/met/src/libcode/vx_afm/afm_line.cc +++ b/met/src/libcode/vx_afm/afm_line.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_afm/afm_line.h b/met/src/libcode/vx_afm/afm_line.h index 100736c3bd..1ed49c33b5 100644 --- a/met/src/libcode/vx_afm/afm_line.h +++ b/met/src/libcode/vx_afm/afm_line.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_afm/afm_token.cc b/met/src/libcode/vx_afm/afm_token.cc index 37f21adb74..45d59be0f3 100644 --- a/met/src/libcode/vx_afm/afm_token.cc +++ b/met/src/libcode/vx_afm/afm_token.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_afm/afm_token.h b/met/src/libcode/vx_afm/afm_token.h index 5211a5fee7..fc08d7dac6 100644 --- a/met/src/libcode/vx_afm/afm_token.h +++ b/met/src/libcode/vx_afm/afm_token.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_afm/afm_token_types.h b/met/src/libcode/vx_afm/afm_token_types.h index 0c08ed5a8f..0e8e6029ba 100644 --- a/met/src/libcode/vx_afm/afm_token_types.h +++ b/met/src/libcode/vx_afm/afm_token_types.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_afm/afmkeyword_to_string.cc b/met/src/libcode/vx_afm/afmkeyword_to_string.cc index 276823a6ef..80b9ee4af4 100644 --- a/met/src/libcode/vx_afm/afmkeyword_to_string.cc +++ b/met/src/libcode/vx_afm/afmkeyword_to_string.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_afm/afmkeyword_to_string.h b/met/src/libcode/vx_afm/afmkeyword_to_string.h index fe0c4bfc4f..382c62c9f4 100644 --- a/met/src/libcode/vx_afm/afmkeyword_to_string.h +++ b/met/src/libcode/vx_afm/afmkeyword_to_string.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_afm/afmtokentype_to_string.cc b/met/src/libcode/vx_afm/afmtokentype_to_string.cc index 0573e9d63f..a7a4df02e6 100644 --- a/met/src/libcode/vx_afm/afmtokentype_to_string.cc +++ b/met/src/libcode/vx_afm/afmtokentype_to_string.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_afm/afmtokentype_to_string.h b/met/src/libcode/vx_afm/afmtokentype_to_string.h index e33953c05a..122ceb2ead 100644 --- a/met/src/libcode/vx_afm/afmtokentype_to_string.h +++ b/met/src/libcode/vx_afm/afmtokentype_to_string.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_analysis_util/analysis_utils.cc b/met/src/libcode/vx_analysis_util/analysis_utils.cc index bae152a8ca..298683a373 100644 --- a/met/src/libcode/vx_analysis_util/analysis_utils.cc +++ b/met/src/libcode/vx_analysis_util/analysis_utils.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_analysis_util/analysis_utils.h b/met/src/libcode/vx_analysis_util/analysis_utils.h index 338c8133f2..035c0c7ee8 100644 --- a/met/src/libcode/vx_analysis_util/analysis_utils.h +++ b/met/src/libcode/vx_analysis_util/analysis_utils.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_analysis_util/by_case_info.cc b/met/src/libcode/vx_analysis_util/by_case_info.cc index 7985f35890..4ed22aa36c 100644 --- a/met/src/libcode/vx_analysis_util/by_case_info.cc +++ b/met/src/libcode/vx_analysis_util/by_case_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_analysis_util/by_case_info.h b/met/src/libcode/vx_analysis_util/by_case_info.h index a5a9a8f034..1c5391f82f 100644 --- a/met/src/libcode/vx_analysis_util/by_case_info.h +++ b/met/src/libcode/vx_analysis_util/by_case_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_analysis_util/mode_atts.cc b/met/src/libcode/vx_analysis_util/mode_atts.cc index 26b84e0d96..138e488b10 100644 --- a/met/src/libcode/vx_analysis_util/mode_atts.cc +++ b/met/src/libcode/vx_analysis_util/mode_atts.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_analysis_util/mode_atts.h b/met/src/libcode/vx_analysis_util/mode_atts.h index 39a728d790..f50977ba08 100644 --- a/met/src/libcode/vx_analysis_util/mode_atts.h +++ b/met/src/libcode/vx_analysis_util/mode_atts.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_analysis_util/mode_job.cc b/met/src/libcode/vx_analysis_util/mode_job.cc index 7e20a2ead6..dea7bee574 100644 --- a/met/src/libcode/vx_analysis_util/mode_job.cc +++ b/met/src/libcode/vx_analysis_util/mode_job.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_analysis_util/mode_job.h b/met/src/libcode/vx_analysis_util/mode_job.h index 3518a5baea..27e551a8a5 100644 --- a/met/src/libcode/vx_analysis_util/mode_job.h +++ b/met/src/libcode/vx_analysis_util/mode_job.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_analysis_util/mode_line.cc b/met/src/libcode/vx_analysis_util/mode_line.cc index d4bf67b8e1..f62739af92 100644 --- a/met/src/libcode/vx_analysis_util/mode_line.cc +++ b/met/src/libcode/vx_analysis_util/mode_line.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_analysis_util/mode_line.h b/met/src/libcode/vx_analysis_util/mode_line.h index 0abf426b6b..e5b0822255 100644 --- a/met/src/libcode/vx_analysis_util/mode_line.h +++ b/met/src/libcode/vx_analysis_util/mode_line.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_analysis_util/stat_job.cc b/met/src/libcode/vx_analysis_util/stat_job.cc index 1b00c802da..826c61806d 100644 --- a/met/src/libcode/vx_analysis_util/stat_job.cc +++ b/met/src/libcode/vx_analysis_util/stat_job.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_analysis_util/stat_job.h b/met/src/libcode/vx_analysis_util/stat_job.h index 80facaf912..e07b962519 100644 --- a/met/src/libcode/vx_analysis_util/stat_job.h +++ b/met/src/libcode/vx_analysis_util/stat_job.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_analysis_util/stat_line.cc b/met/src/libcode/vx_analysis_util/stat_line.cc index 9c2dadb7e8..0a47746f8f 100644 --- a/met/src/libcode/vx_analysis_util/stat_line.cc +++ b/met/src/libcode/vx_analysis_util/stat_line.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_analysis_util/stat_line.h b/met/src/libcode/vx_analysis_util/stat_line.h index 6362031d58..fd615ef8d6 100644 --- a/met/src/libcode/vx_analysis_util/stat_line.h +++ b/met/src/libcode/vx_analysis_util/stat_line.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_analysis_util/time_series.cc b/met/src/libcode/vx_analysis_util/time_series.cc index 29de1adfa0..2829989f99 100644 --- a/met/src/libcode/vx_analysis_util/time_series.cc +++ b/met/src/libcode/vx_analysis_util/time_series.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_analysis_util/time_series.h b/met/src/libcode/vx_analysis_util/time_series.h index ca4c2a88ac..efc2f948d3 100644 --- a/met/src/libcode/vx_analysis_util/time_series.h +++ b/met/src/libcode/vx_analysis_util/time_series.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_analysis_util/vx_analysis_util.h b/met/src/libcode/vx_analysis_util/vx_analysis_util.h index 9748f9dbea..8ea79ebf2d 100644 --- a/met/src/libcode/vx_analysis_util/vx_analysis_util.h +++ b/met/src/libcode/vx_analysis_util/vx_analysis_util.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_color/color.cc b/met/src/libcode/vx_color/color.cc index ac145ca346..ffb72de3ad 100644 --- a/met/src/libcode/vx_color/color.cc +++ b/met/src/libcode/vx_color/color.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_color/color.h b/met/src/libcode/vx_color/color.h index c0f61649d1..608d0f2667 100644 --- a/met/src/libcode/vx_color/color.h +++ b/met/src/libcode/vx_color/color.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_color/color_list.cc b/met/src/libcode/vx_color/color_list.cc index 4c965b6538..517ae095fa 100644 --- a/met/src/libcode/vx_color/color_list.cc +++ b/met/src/libcode/vx_color/color_list.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_color/color_list.h b/met/src/libcode/vx_color/color_list.h index 0996750a05..5ebe43af49 100644 --- a/met/src/libcode/vx_color/color_list.h +++ b/met/src/libcode/vx_color/color_list.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_color/color_parser.h b/met/src/libcode/vx_color/color_parser.h index c05be5694e..9ac68cfd87 100644 --- a/met/src/libcode/vx_color/color_parser.h +++ b/met/src/libcode/vx_color/color_parser.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_color/color_table.cc b/met/src/libcode/vx_color/color_table.cc index 62f00688a3..aa990b8189 100644 --- a/met/src/libcode/vx_color/color_table.cc +++ b/met/src/libcode/vx_color/color_table.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_color/vx_color.h b/met/src/libcode/vx_color/vx_color.h index 95e73da43f..c8b9a30538 100644 --- a/met/src/libcode/vx_color/vx_color.h +++ b/met/src/libcode/vx_color/vx_color.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d/data2d_utils.cc b/met/src/libcode/vx_data2d/data2d_utils.cc index ec3e01d624..b86829221c 100644 --- a/met/src/libcode/vx_data2d/data2d_utils.cc +++ b/met/src/libcode/vx_data2d/data2d_utils.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d/data2d_utils.h b/met/src/libcode/vx_data2d/data2d_utils.h index 605282e5ac..20c5793e58 100644 --- a/met/src/libcode/vx_data2d/data2d_utils.h +++ b/met/src/libcode/vx_data2d/data2d_utils.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d/data_class.cc b/met/src/libcode/vx_data2d/data_class.cc index 431c5fffb6..80ddbf3ef1 100644 --- a/met/src/libcode/vx_data2d/data_class.cc +++ b/met/src/libcode/vx_data2d/data_class.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d/data_class.h b/met/src/libcode/vx_data2d/data_class.h index b6a946ee04..0762346ad7 100644 --- a/met/src/libcode/vx_data2d/data_class.h +++ b/met/src/libcode/vx_data2d/data_class.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d/level_info.cc b/met/src/libcode/vx_data2d/level_info.cc index f97a802146..f1f18bdabe 100644 --- a/met/src/libcode/vx_data2d/level_info.cc +++ b/met/src/libcode/vx_data2d/level_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d/level_info.h b/met/src/libcode/vx_data2d/level_info.h index 838827bbf2..c551fa0e54 100644 --- a/met/src/libcode/vx_data2d/level_info.h +++ b/met/src/libcode/vx_data2d/level_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d/table_lookup.cc b/met/src/libcode/vx_data2d/table_lookup.cc index 87e9864282..7f5264d1ee 100644 --- a/met/src/libcode/vx_data2d/table_lookup.cc +++ b/met/src/libcode/vx_data2d/table_lookup.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d/table_lookup.h b/met/src/libcode/vx_data2d/table_lookup.h index f2be0e4352..6a8365d795 100644 --- a/met/src/libcode/vx_data2d/table_lookup.h +++ b/met/src/libcode/vx_data2d/table_lookup.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d/var_info.cc b/met/src/libcode/vx_data2d/var_info.cc index aa4449d2e5..81e8f11252 100644 --- a/met/src/libcode/vx_data2d/var_info.cc +++ b/met/src/libcode/vx_data2d/var_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d/var_info.h b/met/src/libcode/vx_data2d/var_info.h index f2801a49c0..2d80138878 100644 --- a/met/src/libcode/vx_data2d/var_info.h +++ b/met/src/libcode/vx_data2d/var_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d/vx_data2d.h b/met/src/libcode/vx_data2d/vx_data2d.h index 7ed632d465..d080544991 100644 --- a/met/src/libcode/vx_data2d/vx_data2d.h +++ b/met/src/libcode/vx_data2d/vx_data2d.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_factory/data2d_factory.cc b/met/src/libcode/vx_data2d_factory/data2d_factory.cc index 8e7c9ef452..75664a0d1a 100644 --- a/met/src/libcode/vx_data2d_factory/data2d_factory.cc +++ b/met/src/libcode/vx_data2d_factory/data2d_factory.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_factory/data2d_factory.h b/met/src/libcode/vx_data2d_factory/data2d_factory.h index c66ecc1df0..43d0575e49 100644 --- a/met/src/libcode/vx_data2d_factory/data2d_factory.h +++ b/met/src/libcode/vx_data2d_factory/data2d_factory.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_factory/data2d_factory_utils.cc b/met/src/libcode/vx_data2d_factory/data2d_factory_utils.cc index f9d0d60c39..3d638a065b 100644 --- a/met/src/libcode/vx_data2d_factory/data2d_factory_utils.cc +++ b/met/src/libcode/vx_data2d_factory/data2d_factory_utils.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_factory/data2d_factory_utils.h b/met/src/libcode/vx_data2d_factory/data2d_factory_utils.h index d92c580c59..e86e8df108 100644 --- a/met/src/libcode/vx_data2d_factory/data2d_factory_utils.h +++ b/met/src/libcode/vx_data2d_factory/data2d_factory_utils.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_factory/is_bufr_file.cc b/met/src/libcode/vx_data2d_factory/is_bufr_file.cc index 81dd8244c6..6103e79286 100644 --- a/met/src/libcode/vx_data2d_factory/is_bufr_file.cc +++ b/met/src/libcode/vx_data2d_factory/is_bufr_file.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_factory/is_bufr_file.h b/met/src/libcode/vx_data2d_factory/is_bufr_file.h index 68ed46e117..9b2adb27c1 100644 --- a/met/src/libcode/vx_data2d_factory/is_bufr_file.h +++ b/met/src/libcode/vx_data2d_factory/is_bufr_file.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_factory/is_grib_file.cc b/met/src/libcode/vx_data2d_factory/is_grib_file.cc index 65603218b2..db7fc05046 100644 --- a/met/src/libcode/vx_data2d_factory/is_grib_file.cc +++ b/met/src/libcode/vx_data2d_factory/is_grib_file.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_factory/is_grib_file.h b/met/src/libcode/vx_data2d_factory/is_grib_file.h index f690aa4aa8..5301859de7 100644 --- a/met/src/libcode/vx_data2d_factory/is_grib_file.h +++ b/met/src/libcode/vx_data2d_factory/is_grib_file.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_factory/is_netcdf_file.cc b/met/src/libcode/vx_data2d_factory/is_netcdf_file.cc index 6ddecfa972..7cc6ca6283 100644 --- a/met/src/libcode/vx_data2d_factory/is_netcdf_file.cc +++ b/met/src/libcode/vx_data2d_factory/is_netcdf_file.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_factory/is_netcdf_file.h b/met/src/libcode/vx_data2d_factory/is_netcdf_file.h index 6a8f63e5c9..de06530466 100644 --- a/met/src/libcode/vx_data2d_factory/is_netcdf_file.h +++ b/met/src/libcode/vx_data2d_factory/is_netcdf_file.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_factory/parse_file_list.cc b/met/src/libcode/vx_data2d_factory/parse_file_list.cc index 93ae285016..b8cd615fd2 100644 --- a/met/src/libcode/vx_data2d_factory/parse_file_list.cc +++ b/met/src/libcode/vx_data2d_factory/parse_file_list.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_factory/parse_file_list.h b/met/src/libcode/vx_data2d_factory/parse_file_list.h index fc173a6b2b..35443a52ba 100644 --- a/met/src/libcode/vx_data2d_factory/parse_file_list.h +++ b/met/src/libcode/vx_data2d_factory/parse_file_list.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_factory/var_info_factory.cc b/met/src/libcode/vx_data2d_factory/var_info_factory.cc index 9c0f230b41..354be867c0 100644 --- a/met/src/libcode/vx_data2d_factory/var_info_factory.cc +++ b/met/src/libcode/vx_data2d_factory/var_info_factory.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_factory/var_info_factory.h b/met/src/libcode/vx_data2d_factory/var_info_factory.h index 53c658dd3c..35f12051b2 100644 --- a/met/src/libcode/vx_data2d_factory/var_info_factory.h +++ b/met/src/libcode/vx_data2d_factory/var_info_factory.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_factory/vx_data2d_factory.h b/met/src/libcode/vx_data2d_factory/vx_data2d_factory.h index 1ac73a478e..264c30886f 100644 --- a/met/src/libcode/vx_data2d_factory/vx_data2d_factory.h +++ b/met/src/libcode/vx_data2d_factory/vx_data2d_factory.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib/data2d_grib.cc b/met/src/libcode/vx_data2d_grib/data2d_grib.cc index 118215c5a5..adfe298daf 100644 --- a/met/src/libcode/vx_data2d_grib/data2d_grib.cc +++ b/met/src/libcode/vx_data2d_grib/data2d_grib.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib/data2d_grib.h b/met/src/libcode/vx_data2d_grib/data2d_grib.h index 61036f7181..63839220a5 100644 --- a/met/src/libcode/vx_data2d_grib/data2d_grib.h +++ b/met/src/libcode/vx_data2d_grib/data2d_grib.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib/data2d_grib_utils.cc b/met/src/libcode/vx_data2d_grib/data2d_grib_utils.cc index 19e6e366a2..8e6a694bdc 100644 --- a/met/src/libcode/vx_data2d_grib/data2d_grib_utils.cc +++ b/met/src/libcode/vx_data2d_grib/data2d_grib_utils.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib/data2d_grib_utils.h b/met/src/libcode/vx_data2d_grib/data2d_grib_utils.h index 20655cdbea..fa775f4a18 100644 --- a/met/src/libcode/vx_data2d_grib/data2d_grib_utils.h +++ b/met/src/libcode/vx_data2d_grib/data2d_grib_utils.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib/grib_classes.cc b/met/src/libcode/vx_data2d_grib/grib_classes.cc index 4e2192238a..ff351e2d28 100644 --- a/met/src/libcode/vx_data2d_grib/grib_classes.cc +++ b/met/src/libcode/vx_data2d_grib/grib_classes.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib/grib_classes.h b/met/src/libcode/vx_data2d_grib/grib_classes.h index d5e58d5b58..ce8b6687eb 100644 --- a/met/src/libcode/vx_data2d_grib/grib_classes.h +++ b/met/src/libcode/vx_data2d_grib/grib_classes.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib/grib_strings.cc b/met/src/libcode/vx_data2d_grib/grib_strings.cc index 00dd65ce69..2380f10c2f 100644 --- a/met/src/libcode/vx_data2d_grib/grib_strings.cc +++ b/met/src/libcode/vx_data2d_grib/grib_strings.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib/grib_strings.h b/met/src/libcode/vx_data2d_grib/grib_strings.h index 838f5ccaf2..500d5f7638 100644 --- a/met/src/libcode/vx_data2d_grib/grib_strings.h +++ b/met/src/libcode/vx_data2d_grib/grib_strings.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib/grib_utils.cc b/met/src/libcode/vx_data2d_grib/grib_utils.cc index 4b6f5fbe36..64c49234b4 100644 --- a/met/src/libcode/vx_data2d_grib/grib_utils.cc +++ b/met/src/libcode/vx_data2d_grib/grib_utils.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib/grib_utils.h b/met/src/libcode/vx_data2d_grib/grib_utils.h index 7b7168949a..7b3a1a9400 100644 --- a/met/src/libcode/vx_data2d_grib/grib_utils.h +++ b/met/src/libcode/vx_data2d_grib/grib_utils.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib/var_info_grib.cc b/met/src/libcode/vx_data2d_grib/var_info_grib.cc index 7594a1d1e6..de4d685846 100644 --- a/met/src/libcode/vx_data2d_grib/var_info_grib.cc +++ b/met/src/libcode/vx_data2d_grib/var_info_grib.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib/var_info_grib.h b/met/src/libcode/vx_data2d_grib/var_info_grib.h index 1fd2e8eca2..1e92bbbd93 100644 --- a/met/src/libcode/vx_data2d_grib/var_info_grib.h +++ b/met/src/libcode/vx_data2d_grib/var_info_grib.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib/vx_data2d_grib.h b/met/src/libcode/vx_data2d_grib/vx_data2d_grib.h index cd3cf6e1aa..92bf8fea02 100644 --- a/met/src/libcode/vx_data2d_grib/vx_data2d_grib.h +++ b/met/src/libcode/vx_data2d_grib/vx_data2d_grib.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib/vx_grib_classes.h b/met/src/libcode/vx_data2d_grib/vx_grib_classes.h index 1459dc589f..06131ea82a 100644 --- a/met/src/libcode/vx_data2d_grib/vx_grib_classes.h +++ b/met/src/libcode/vx_data2d_grib/vx_grib_classes.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib2/data2d_grib2.cc b/met/src/libcode/vx_data2d_grib2/data2d_grib2.cc index 291663cbf0..799b7cfb80 100644 --- a/met/src/libcode/vx_data2d_grib2/data2d_grib2.cc +++ b/met/src/libcode/vx_data2d_grib2/data2d_grib2.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib2/data2d_grib2.h b/met/src/libcode/vx_data2d_grib2/data2d_grib2.h index 69b47bbc3c..851bb78e0a 100644 --- a/met/src/libcode/vx_data2d_grib2/data2d_grib2.h +++ b/met/src/libcode/vx_data2d_grib2/data2d_grib2.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib2/var_info_grib2.cc b/met/src/libcode/vx_data2d_grib2/var_info_grib2.cc index b35efcd8b4..5fa3042bfe 100644 --- a/met/src/libcode/vx_data2d_grib2/var_info_grib2.cc +++ b/met/src/libcode/vx_data2d_grib2/var_info_grib2.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_grib2/var_info_grib2.h b/met/src/libcode/vx_data2d_grib2/var_info_grib2.h index 27ba9c396b..dd9cd994a0 100644 --- a/met/src/libcode/vx_data2d_grib2/var_info_grib2.h +++ b/met/src/libcode/vx_data2d_grib2/var_info_grib2.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_met/data2d_nc_met.cc b/met/src/libcode/vx_data2d_nc_met/data2d_nc_met.cc index f5ad0e5708..0c73e8f677 100644 --- a/met/src/libcode/vx_data2d_nc_met/data2d_nc_met.cc +++ b/met/src/libcode/vx_data2d_nc_met/data2d_nc_met.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_met/data2d_nc_met.h b/met/src/libcode/vx_data2d_nc_met/data2d_nc_met.h index 765d1b2e9c..36d80858c5 100644 --- a/met/src/libcode/vx_data2d_nc_met/data2d_nc_met.h +++ b/met/src/libcode/vx_data2d_nc_met/data2d_nc_met.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_met/get_met_grid.cc b/met/src/libcode/vx_data2d_nc_met/get_met_grid.cc index 7a3bbed67c..d4c7519596 100644 --- a/met/src/libcode/vx_data2d_nc_met/get_met_grid.cc +++ b/met/src/libcode/vx_data2d_nc_met/get_met_grid.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_met/get_met_grid.h b/met/src/libcode/vx_data2d_nc_met/get_met_grid.h index 2f33a62786..16aaf84662 100644 --- a/met/src/libcode/vx_data2d_nc_met/get_met_grid.h +++ b/met/src/libcode/vx_data2d_nc_met/get_met_grid.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_met/met_file.cc b/met/src/libcode/vx_data2d_nc_met/met_file.cc index 83c56a5e8e..39dc06ca68 100644 --- a/met/src/libcode/vx_data2d_nc_met/met_file.cc +++ b/met/src/libcode/vx_data2d_nc_met/met_file.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_met/met_file.h b/met/src/libcode/vx_data2d_nc_met/met_file.h index 71b01c4471..f2f218f617 100644 --- a/met/src/libcode/vx_data2d_nc_met/met_file.h +++ b/met/src/libcode/vx_data2d_nc_met/met_file.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_met/var_info_nc_met.cc b/met/src/libcode/vx_data2d_nc_met/var_info_nc_met.cc index 49f14705ec..facb4e8702 100644 --- a/met/src/libcode/vx_data2d_nc_met/var_info_nc_met.cc +++ b/met/src/libcode/vx_data2d_nc_met/var_info_nc_met.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_met/var_info_nc_met.h b/met/src/libcode/vx_data2d_nc_met/var_info_nc_met.h index bcc5ba6098..f2abb1e5ec 100644 --- a/met/src/libcode/vx_data2d_nc_met/var_info_nc_met.h +++ b/met/src/libcode/vx_data2d_nc_met/var_info_nc_met.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_met/vx_data2d_nc_met.h b/met/src/libcode/vx_data2d_nc_met/vx_data2d_nc_met.h index e3e29292ce..979f915512 100644 --- a/met/src/libcode/vx_data2d_nc_met/vx_data2d_nc_met.h +++ b/met/src/libcode/vx_data2d_nc_met/vx_data2d_nc_met.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_pinterp/data2d_nc_pinterp.cc b/met/src/libcode/vx_data2d_nc_pinterp/data2d_nc_pinterp.cc index ac21a36ea1..0af7e2e2b3 100644 --- a/met/src/libcode/vx_data2d_nc_pinterp/data2d_nc_pinterp.cc +++ b/met/src/libcode/vx_data2d_nc_pinterp/data2d_nc_pinterp.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_pinterp/data2d_nc_pinterp.h b/met/src/libcode/vx_data2d_nc_pinterp/data2d_nc_pinterp.h index f1488ef717..f467b41a6b 100644 --- a/met/src/libcode/vx_data2d_nc_pinterp/data2d_nc_pinterp.h +++ b/met/src/libcode/vx_data2d_nc_pinterp/data2d_nc_pinterp.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_pinterp/get_pinterp_grid.cc b/met/src/libcode/vx_data2d_nc_pinterp/get_pinterp_grid.cc index 2b933fb3a5..0dd8607c0b 100644 --- a/met/src/libcode/vx_data2d_nc_pinterp/get_pinterp_grid.cc +++ b/met/src/libcode/vx_data2d_nc_pinterp/get_pinterp_grid.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_pinterp/get_pinterp_grid.h b/met/src/libcode/vx_data2d_nc_pinterp/get_pinterp_grid.h index a6e71e3f0f..1ca10b7294 100644 --- a/met/src/libcode/vx_data2d_nc_pinterp/get_pinterp_grid.h +++ b/met/src/libcode/vx_data2d_nc_pinterp/get_pinterp_grid.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_pinterp/pinterp_file.cc b/met/src/libcode/vx_data2d_nc_pinterp/pinterp_file.cc index 84cec1cf06..b1b93d9e8a 100644 --- a/met/src/libcode/vx_data2d_nc_pinterp/pinterp_file.cc +++ b/met/src/libcode/vx_data2d_nc_pinterp/pinterp_file.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_pinterp/pinterp_file.h b/met/src/libcode/vx_data2d_nc_pinterp/pinterp_file.h index 8f0df6b8a6..3d2f0dc256 100644 --- a/met/src/libcode/vx_data2d_nc_pinterp/pinterp_file.h +++ b/met/src/libcode/vx_data2d_nc_pinterp/pinterp_file.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_pinterp/var_info_nc_pinterp.cc b/met/src/libcode/vx_data2d_nc_pinterp/var_info_nc_pinterp.cc index 02da4ac8ac..9f16c1dea8 100644 --- a/met/src/libcode/vx_data2d_nc_pinterp/var_info_nc_pinterp.cc +++ b/met/src/libcode/vx_data2d_nc_pinterp/var_info_nc_pinterp.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_pinterp/var_info_nc_pinterp.h b/met/src/libcode/vx_data2d_nc_pinterp/var_info_nc_pinterp.h index 226cc8ea8d..d48e6c2270 100644 --- a/met/src/libcode/vx_data2d_nc_pinterp/var_info_nc_pinterp.h +++ b/met/src/libcode/vx_data2d_nc_pinterp/var_info_nc_pinterp.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nc_pinterp/vx_data2d_nc_pinterp.h b/met/src/libcode/vx_data2d_nc_pinterp/vx_data2d_nc_pinterp.h index 561cc2be49..3e6285e090 100644 --- a/met/src/libcode/vx_data2d_nc_pinterp/vx_data2d_nc_pinterp.h +++ b/met/src/libcode/vx_data2d_nc_pinterp/vx_data2d_nc_pinterp.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nccf/data2d_nccf.cc b/met/src/libcode/vx_data2d_nccf/data2d_nccf.cc index 099b095565..4b023a32dc 100644 --- a/met/src/libcode/vx_data2d_nccf/data2d_nccf.cc +++ b/met/src/libcode/vx_data2d_nccf/data2d_nccf.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nccf/data2d_nccf.h b/met/src/libcode/vx_data2d_nccf/data2d_nccf.h index 962e9b21a2..0ebbf50df6 100644 --- a/met/src/libcode/vx_data2d_nccf/data2d_nccf.h +++ b/met/src/libcode/vx_data2d_nccf/data2d_nccf.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nccf/nccf_file.cc b/met/src/libcode/vx_data2d_nccf/nccf_file.cc index 91696d8a91..a43c25fcb5 100644 --- a/met/src/libcode/vx_data2d_nccf/nccf_file.cc +++ b/met/src/libcode/vx_data2d_nccf/nccf_file.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nccf/nccf_file.h b/met/src/libcode/vx_data2d_nccf/nccf_file.h index 8acb54ed37..71fa039a60 100644 --- a/met/src/libcode/vx_data2d_nccf/nccf_file.h +++ b/met/src/libcode/vx_data2d_nccf/nccf_file.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nccf/var_info_nccf.cc b/met/src/libcode/vx_data2d_nccf/var_info_nccf.cc index 24ed320c3c..8bfc679336 100644 --- a/met/src/libcode/vx_data2d_nccf/var_info_nccf.cc +++ b/met/src/libcode/vx_data2d_nccf/var_info_nccf.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nccf/var_info_nccf.h b/met/src/libcode/vx_data2d_nccf/var_info_nccf.h index d346baadc4..f3d5a47d5e 100644 --- a/met/src/libcode/vx_data2d_nccf/var_info_nccf.h +++ b/met/src/libcode/vx_data2d_nccf/var_info_nccf.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_nccf/vx_data2d_nccf.h b/met/src/libcode/vx_data2d_nccf/vx_data2d_nccf.h index e74225f5bb..e8c7ecc00f 100644 --- a/met/src/libcode/vx_data2d_nccf/vx_data2d_nccf.h +++ b/met/src/libcode/vx_data2d_nccf/vx_data2d_nccf.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_python/data2d_python.cc b/met/src/libcode/vx_data2d_python/data2d_python.cc index bee5fef172..97fab35c6a 100644 --- a/met/src/libcode/vx_data2d_python/data2d_python.cc +++ b/met/src/libcode/vx_data2d_python/data2d_python.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_python/data2d_python.h b/met/src/libcode/vx_data2d_python/data2d_python.h index 5aa5b53272..0aebfe2710 100644 --- a/met/src/libcode/vx_data2d_python/data2d_python.h +++ b/met/src/libcode/vx_data2d_python/data2d_python.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_python/dataplane_from_numpy_array.cc b/met/src/libcode/vx_data2d_python/dataplane_from_numpy_array.cc index 61f997a267..16fe195edc 100644 --- a/met/src/libcode/vx_data2d_python/dataplane_from_numpy_array.cc +++ b/met/src/libcode/vx_data2d_python/dataplane_from_numpy_array.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_python/dataplane_from_numpy_array.h b/met/src/libcode/vx_data2d_python/dataplane_from_numpy_array.h index b1135cbd42..b6d7a1f25e 100644 --- a/met/src/libcode/vx_data2d_python/dataplane_from_numpy_array.h +++ b/met/src/libcode/vx_data2d_python/dataplane_from_numpy_array.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_python/dataplane_from_xarray.cc b/met/src/libcode/vx_data2d_python/dataplane_from_xarray.cc index 0e1f1dbaed..9704c73cb9 100644 --- a/met/src/libcode/vx_data2d_python/dataplane_from_xarray.cc +++ b/met/src/libcode/vx_data2d_python/dataplane_from_xarray.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_python/dataplane_from_xarray.h b/met/src/libcode/vx_data2d_python/dataplane_from_xarray.h index f623575429..58cb05f30b 100644 --- a/met/src/libcode/vx_data2d_python/dataplane_from_xarray.h +++ b/met/src/libcode/vx_data2d_python/dataplane_from_xarray.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_python/grid_from_python_dict.cc b/met/src/libcode/vx_data2d_python/grid_from_python_dict.cc index 51286678c4..d60bb8e39a 100644 --- a/met/src/libcode/vx_data2d_python/grid_from_python_dict.cc +++ b/met/src/libcode/vx_data2d_python/grid_from_python_dict.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_python/grid_from_python_dict.h b/met/src/libcode/vx_data2d_python/grid_from_python_dict.h index dab07c107e..a8bee09c2d 100644 --- a/met/src/libcode/vx_data2d_python/grid_from_python_dict.h +++ b/met/src/libcode/vx_data2d_python/grid_from_python_dict.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_python/python_dataplane.cc b/met/src/libcode/vx_data2d_python/python_dataplane.cc index 8280c99fe5..aac7ac9e15 100644 --- a/met/src/libcode/vx_data2d_python/python_dataplane.cc +++ b/met/src/libcode/vx_data2d_python/python_dataplane.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_python/python_dataplane.h b/met/src/libcode/vx_data2d_python/python_dataplane.h index 56aabec2f0..6b125a393d 100644 --- a/met/src/libcode/vx_data2d_python/python_dataplane.h +++ b/met/src/libcode/vx_data2d_python/python_dataplane.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_python/var_info_python.cc b/met/src/libcode/vx_data2d_python/var_info_python.cc index 81fb4e8045..3ca19e0621 100644 --- a/met/src/libcode/vx_data2d_python/var_info_python.cc +++ b/met/src/libcode/vx_data2d_python/var_info_python.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_data2d_python/var_info_python.h b/met/src/libcode/vx_data2d_python/var_info_python.h index 9df494c98d..bc02c8868d 100644 --- a/met/src/libcode/vx_data2d_python/var_info_python.h +++ b/met/src/libcode/vx_data2d_python/var_info_python.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_geodesy/spheroid.cc b/met/src/libcode/vx_geodesy/spheroid.cc index 6e35857d70..377a5b746b 100644 --- a/met/src/libcode/vx_geodesy/spheroid.cc +++ b/met/src/libcode/vx_geodesy/spheroid.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_geodesy/spheroid.h b/met/src/libcode/vx_geodesy/spheroid.h index 00acaff589..311940ac24 100644 --- a/met/src/libcode/vx_geodesy/spheroid.h +++ b/met/src/libcode/vx_geodesy/spheroid.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_geodesy/vx_geodesy.h b/met/src/libcode/vx_geodesy/vx_geodesy.h index baace676e7..fd01ed6f19 100644 --- a/met/src/libcode/vx_geodesy/vx_geodesy.h +++ b/met/src/libcode/vx_geodesy/vx_geodesy.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gis/dbf_file.cc b/met/src/libcode/vx_gis/dbf_file.cc index 768cbc6581..703791d75e 100644 --- a/met/src/libcode/vx_gis/dbf_file.cc +++ b/met/src/libcode/vx_gis/dbf_file.cc @@ -1,6 +1,6 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gis/dbf_file.h b/met/src/libcode/vx_gis/dbf_file.h index 1616ecb90c..6bc2a354f4 100644 --- a/met/src/libcode/vx_gis/dbf_file.h +++ b/met/src/libcode/vx_gis/dbf_file.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gis/shp_array.h b/met/src/libcode/vx_gis/shp_array.h index 3f8492e713..419d1ca5bf 100644 --- a/met/src/libcode/vx_gis/shp_array.h +++ b/met/src/libcode/vx_gis/shp_array.h @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gis/shp_file.cc b/met/src/libcode/vx_gis/shp_file.cc index 99fa62e2dd..14417c0048 100644 --- a/met/src/libcode/vx_gis/shp_file.cc +++ b/met/src/libcode/vx_gis/shp_file.cc @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gis/shp_file.h b/met/src/libcode/vx_gis/shp_file.h index 2d7bf43320..77b2c48418 100644 --- a/met/src/libcode/vx_gis/shp_file.h +++ b/met/src/libcode/vx_gis/shp_file.h @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gis/shp_point_record.cc b/met/src/libcode/vx_gis/shp_point_record.cc index 971cc943a1..6fde8fb74c 100644 --- a/met/src/libcode/vx_gis/shp_point_record.cc +++ b/met/src/libcode/vx_gis/shp_point_record.cc @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gis/shp_point_record.h b/met/src/libcode/vx_gis/shp_point_record.h index 9b322372cf..e606f3f178 100644 --- a/met/src/libcode/vx_gis/shp_point_record.h +++ b/met/src/libcode/vx_gis/shp_point_record.h @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gis/shp_poly_record.cc b/met/src/libcode/vx_gis/shp_poly_record.cc index 2ff662ddb6..b540b78779 100644 --- a/met/src/libcode/vx_gis/shp_poly_record.cc +++ b/met/src/libcode/vx_gis/shp_poly_record.cc @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gis/shp_poly_record.h b/met/src/libcode/vx_gis/shp_poly_record.h index 6f37a06574..faad26478d 100644 --- a/met/src/libcode/vx_gis/shp_poly_record.h +++ b/met/src/libcode/vx_gis/shp_poly_record.h @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gis/shp_types.h b/met/src/libcode/vx_gis/shp_types.h index 7e62a82d99..d9e240ebe3 100644 --- a/met/src/libcode/vx_gis/shp_types.h +++ b/met/src/libcode/vx_gis/shp_types.h @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gis/shx_file.cc b/met/src/libcode/vx_gis/shx_file.cc index 8a2c0e63c9..1fec346dac 100644 --- a/met/src/libcode/vx_gis/shx_file.cc +++ b/met/src/libcode/vx_gis/shx_file.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gis/shx_file.h b/met/src/libcode/vx_gis/shx_file.h index ee4745e50b..43dab61c2b 100644 --- a/met/src/libcode/vx_gis/shx_file.h +++ b/met/src/libcode/vx_gis/shx_file.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gnomon/gnomon.cc b/met/src/libcode/vx_gnomon/gnomon.cc index 5d4d37d61b..9a1305eaed 100644 --- a/met/src/libcode/vx_gnomon/gnomon.cc +++ b/met/src/libcode/vx_gnomon/gnomon.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research(UCAR) // ** National Center for Atmospheric Research(NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gnomon/gnomon.h b/met/src/libcode/vx_gnomon/gnomon.h index 1a35917833..e413e6161c 100644 --- a/met/src/libcode/vx_gnomon/gnomon.h +++ b/met/src/libcode/vx_gnomon/gnomon.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research(UCAR) // ** National Center for Atmospheric Research(NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/earth_rotation.cc b/met/src/libcode/vx_grid/earth_rotation.cc index 2f3d8a3068..9171175e75 100644 --- a/met/src/libcode/vx_grid/earth_rotation.cc +++ b/met/src/libcode/vx_grid/earth_rotation.cc @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/earth_rotation.h b/met/src/libcode/vx_grid/earth_rotation.h index cfffd00ae5..3c95b3f4f9 100644 --- a/met/src/libcode/vx_grid/earth_rotation.h +++ b/met/src/libcode/vx_grid/earth_rotation.h @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/find_grid_by_name.cc b/met/src/libcode/vx_grid/find_grid_by_name.cc index ba32c5d5a4..a5f426b66d 100644 --- a/met/src/libcode/vx_grid/find_grid_by_name.cc +++ b/met/src/libcode/vx_grid/find_grid_by_name.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/find_grid_by_name.h b/met/src/libcode/vx_grid/find_grid_by_name.h index de75c46210..0281353f39 100644 --- a/met/src/libcode/vx_grid/find_grid_by_name.h +++ b/met/src/libcode/vx_grid/find_grid_by_name.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/gaussian_grid.cc b/met/src/libcode/vx_grid/gaussian_grid.cc index 6e9693cf3c..c44bd8a3dd 100644 --- a/met/src/libcode/vx_grid/gaussian_grid.cc +++ b/met/src/libcode/vx_grid/gaussian_grid.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/gaussian_grid.h b/met/src/libcode/vx_grid/gaussian_grid.h index 0632da7e5f..404b546097 100644 --- a/met/src/libcode/vx_grid/gaussian_grid.h +++ b/met/src/libcode/vx_grid/gaussian_grid.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/gaussian_grid_defs.h b/met/src/libcode/vx_grid/gaussian_grid_defs.h index 9eae84a424..6e97f544b5 100644 --- a/met/src/libcode/vx_grid/gaussian_grid_defs.h +++ b/met/src/libcode/vx_grid/gaussian_grid_defs.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/goes_grid.cc b/met/src/libcode/vx_grid/goes_grid.cc index 7909d1f1e9..eed67fbaaa 100644 --- a/met/src/libcode/vx_grid/goes_grid.cc +++ b/met/src/libcode/vx_grid/goes_grid.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/goes_grid.h b/met/src/libcode/vx_grid/goes_grid.h index 60729cc572..a43869b1f7 100644 --- a/met/src/libcode/vx_grid/goes_grid.h +++ b/met/src/libcode/vx_grid/goes_grid.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/goes_grid_defs.h b/met/src/libcode/vx_grid/goes_grid_defs.h index 194f6aa3c9..e402b4cbd8 100644 --- a/met/src/libcode/vx_grid/goes_grid_defs.h +++ b/met/src/libcode/vx_grid/goes_grid_defs.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/grid_base.cc b/met/src/libcode/vx_grid/grid_base.cc index 44a224f9cc..7b1fa99790 100644 --- a/met/src/libcode/vx_grid/grid_base.cc +++ b/met/src/libcode/vx_grid/grid_base.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/grid_base.h b/met/src/libcode/vx_grid/grid_base.h index f0b1334248..c2894f0df1 100644 --- a/met/src/libcode/vx_grid/grid_base.h +++ b/met/src/libcode/vx_grid/grid_base.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/latlon_grid.cc b/met/src/libcode/vx_grid/latlon_grid.cc index 3830d3991a..6176424ed1 100644 --- a/met/src/libcode/vx_grid/latlon_grid.cc +++ b/met/src/libcode/vx_grid/latlon_grid.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/latlon_grid.h b/met/src/libcode/vx_grid/latlon_grid.h index e5876b0f2d..4f0f01cb5b 100644 --- a/met/src/libcode/vx_grid/latlon_grid.h +++ b/met/src/libcode/vx_grid/latlon_grid.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/latlon_grid_defs.h b/met/src/libcode/vx_grid/latlon_grid_defs.h index 4cbdeff757..8643686044 100644 --- a/met/src/libcode/vx_grid/latlon_grid_defs.h +++ b/met/src/libcode/vx_grid/latlon_grid_defs.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/latlon_xyz.cc b/met/src/libcode/vx_grid/latlon_xyz.cc index 2425080f83..e1eae674da 100644 --- a/met/src/libcode/vx_grid/latlon_xyz.cc +++ b/met/src/libcode/vx_grid/latlon_xyz.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/latlon_xyz.h b/met/src/libcode/vx_grid/latlon_xyz.h index 1618de5bbc..a59e89324a 100644 --- a/met/src/libcode/vx_grid/latlon_xyz.h +++ b/met/src/libcode/vx_grid/latlon_xyz.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/lc_grid.cc b/met/src/libcode/vx_grid/lc_grid.cc index ad24440a8e..aab40b015f 100644 --- a/met/src/libcode/vx_grid/lc_grid.cc +++ b/met/src/libcode/vx_grid/lc_grid.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/lc_grid.h b/met/src/libcode/vx_grid/lc_grid.h index f9d0c5c747..6b67eabb0b 100644 --- a/met/src/libcode/vx_grid/lc_grid.h +++ b/met/src/libcode/vx_grid/lc_grid.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/lc_grid_defs.h b/met/src/libcode/vx_grid/lc_grid_defs.h index 04d2f5a69c..2fa028a86c 100644 --- a/met/src/libcode/vx_grid/lc_grid_defs.h +++ b/met/src/libcode/vx_grid/lc_grid_defs.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/merc_grid.cc b/met/src/libcode/vx_grid/merc_grid.cc index d1f6562721..c45dee4d6d 100644 --- a/met/src/libcode/vx_grid/merc_grid.cc +++ b/met/src/libcode/vx_grid/merc_grid.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/merc_grid.h b/met/src/libcode/vx_grid/merc_grid.h index fe925827c5..94dd842bda 100644 --- a/met/src/libcode/vx_grid/merc_grid.h +++ b/met/src/libcode/vx_grid/merc_grid.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/merc_grid_defs.h b/met/src/libcode/vx_grid/merc_grid_defs.h index b06d660820..a3c485556d 100644 --- a/met/src/libcode/vx_grid/merc_grid_defs.h +++ b/met/src/libcode/vx_grid/merc_grid_defs.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/rot_latlon_grid.cc b/met/src/libcode/vx_grid/rot_latlon_grid.cc index 48ddc21ca9..2e97cba498 100644 --- a/met/src/libcode/vx_grid/rot_latlon_grid.cc +++ b/met/src/libcode/vx_grid/rot_latlon_grid.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/rot_latlon_grid.h b/met/src/libcode/vx_grid/rot_latlon_grid.h index b25b7fbf76..eea580d285 100644 --- a/met/src/libcode/vx_grid/rot_latlon_grid.h +++ b/met/src/libcode/vx_grid/rot_latlon_grid.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/st_grid.cc b/met/src/libcode/vx_grid/st_grid.cc index c5b7e455c0..64ed1a062d 100644 --- a/met/src/libcode/vx_grid/st_grid.cc +++ b/met/src/libcode/vx_grid/st_grid.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/st_grid.h b/met/src/libcode/vx_grid/st_grid.h index f9f4067812..e80f3aadff 100644 --- a/met/src/libcode/vx_grid/st_grid.h +++ b/met/src/libcode/vx_grid/st_grid.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/st_grid_defs.h b/met/src/libcode/vx_grid/st_grid_defs.h index f19433b052..daab0a0df8 100644 --- a/met/src/libcode/vx_grid/st_grid_defs.h +++ b/met/src/libcode/vx_grid/st_grid_defs.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/tcrmw_grid.cc b/met/src/libcode/vx_grid/tcrmw_grid.cc index 8602fbae1a..f1f9b4d10c 100644 --- a/met/src/libcode/vx_grid/tcrmw_grid.cc +++ b/met/src/libcode/vx_grid/tcrmw_grid.cc @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/tcrmw_grid.h b/met/src/libcode/vx_grid/tcrmw_grid.h index f74f431420..9221838bae 100644 --- a/met/src/libcode/vx_grid/tcrmw_grid.h +++ b/met/src/libcode/vx_grid/tcrmw_grid.h @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_grid/vx_grid.h b/met/src/libcode/vx_grid/vx_grid.h index 798c8aea5a..8f81a980ba 100644 --- a/met/src/libcode/vx_grid/vx_grid.h +++ b/met/src/libcode/vx_grid/vx_grid.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gsl_prob/gsl_bvn.cc b/met/src/libcode/vx_gsl_prob/gsl_bvn.cc index 97dd0fbc7a..7fe3cc0fe4 100644 --- a/met/src/libcode/vx_gsl_prob/gsl_bvn.cc +++ b/met/src/libcode/vx_gsl_prob/gsl_bvn.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gsl_prob/gsl_bvn.h b/met/src/libcode/vx_gsl_prob/gsl_bvn.h index 8d322f241b..addff50eb4 100644 --- a/met/src/libcode/vx_gsl_prob/gsl_bvn.h +++ b/met/src/libcode/vx_gsl_prob/gsl_bvn.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gsl_prob/gsl_cdf.cc b/met/src/libcode/vx_gsl_prob/gsl_cdf.cc index 065c3a6b9b..8d6ee16e0c 100644 --- a/met/src/libcode/vx_gsl_prob/gsl_cdf.cc +++ b/met/src/libcode/vx_gsl_prob/gsl_cdf.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gsl_prob/gsl_cdf.h b/met/src/libcode/vx_gsl_prob/gsl_cdf.h index 0ea5b55afd..1fea3ada87 100644 --- a/met/src/libcode/vx_gsl_prob/gsl_cdf.h +++ b/met/src/libcode/vx_gsl_prob/gsl_cdf.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gsl_prob/gsl_randist.cc b/met/src/libcode/vx_gsl_prob/gsl_randist.cc index 335d6bf359..92b3031d68 100644 --- a/met/src/libcode/vx_gsl_prob/gsl_randist.cc +++ b/met/src/libcode/vx_gsl_prob/gsl_randist.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gsl_prob/gsl_randist.h b/met/src/libcode/vx_gsl_prob/gsl_randist.h index 3a260db080..619e86199b 100644 --- a/met/src/libcode/vx_gsl_prob/gsl_randist.h +++ b/met/src/libcode/vx_gsl_prob/gsl_randist.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gsl_prob/gsl_statistics.cc b/met/src/libcode/vx_gsl_prob/gsl_statistics.cc index f5b50e37fb..4d775903d6 100644 --- a/met/src/libcode/vx_gsl_prob/gsl_statistics.cc +++ b/met/src/libcode/vx_gsl_prob/gsl_statistics.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gsl_prob/gsl_statistics.h b/met/src/libcode/vx_gsl_prob/gsl_statistics.h index 6c493b7707..05600d8aa6 100644 --- a/met/src/libcode/vx_gsl_prob/gsl_statistics.h +++ b/met/src/libcode/vx_gsl_prob/gsl_statistics.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gsl_prob/gsl_wavelet2d.cc b/met/src/libcode/vx_gsl_prob/gsl_wavelet2d.cc index 860c1f1b40..afa8fc3aa5 100644 --- a/met/src/libcode/vx_gsl_prob/gsl_wavelet2d.cc +++ b/met/src/libcode/vx_gsl_prob/gsl_wavelet2d.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gsl_prob/gsl_wavelet2d.h b/met/src/libcode/vx_gsl_prob/gsl_wavelet2d.h index 1437d46f7e..59aa9ea12f 100644 --- a/met/src/libcode/vx_gsl_prob/gsl_wavelet2d.h +++ b/met/src/libcode/vx_gsl_prob/gsl_wavelet2d.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_gsl_prob/vx_gsl_prob.h b/met/src/libcode/vx_gsl_prob/vx_gsl_prob.h index 8258f3a768..1b94e82ad7 100644 --- a/met/src/libcode/vx_gsl_prob/vx_gsl_prob.h +++ b/met/src/libcode/vx_gsl_prob/vx_gsl_prob.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nav/nav.cc b/met/src/libcode/vx_nav/nav.cc index 8cee1584ca..6cc2056268 100644 --- a/met/src/libcode/vx_nav/nav.cc +++ b/met/src/libcode/vx_nav/nav.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nav/nav.h b/met/src/libcode/vx_nav/nav.h index c00804432a..67274110b7 100644 --- a/met/src/libcode/vx_nav/nav.h +++ b/met/src/libcode/vx_nav/nav.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nc_obs/nc_obs_util.cc b/met/src/libcode/vx_nc_obs/nc_obs_util.cc index 4b545cf306..5cd8709097 100644 --- a/met/src/libcode/vx_nc_obs/nc_obs_util.cc +++ b/met/src/libcode/vx_nc_obs/nc_obs_util.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nc_obs/nc_obs_util.h b/met/src/libcode/vx_nc_obs/nc_obs_util.h index 2141ac0e94..58c5748e24 100644 --- a/met/src/libcode/vx_nc_obs/nc_obs_util.h +++ b/met/src/libcode/vx_nc_obs/nc_obs_util.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nc_obs/nc_summary.cc b/met/src/libcode/vx_nc_obs/nc_summary.cc index d8219e246b..2870ee713c 100644 --- a/met/src/libcode/vx_nc_obs/nc_summary.cc +++ b/met/src/libcode/vx_nc_obs/nc_summary.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nc_obs/nc_summary.h b/met/src/libcode/vx_nc_obs/nc_summary.h index 6a99181041..85d11ec249 100644 --- a/met/src/libcode/vx_nc_obs/nc_summary.h +++ b/met/src/libcode/vx_nc_obs/nc_summary.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nc_util/grid_output.cc b/met/src/libcode/vx_nc_util/grid_output.cc index 1ae6e5bebb..e66b6d6766 100644 --- a/met/src/libcode/vx_nc_util/grid_output.cc +++ b/met/src/libcode/vx_nc_util/grid_output.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nc_util/grid_output.h b/met/src/libcode/vx_nc_util/grid_output.h index 9c14588ae5..177dae5b53 100644 --- a/met/src/libcode/vx_nc_util/grid_output.h +++ b/met/src/libcode/vx_nc_util/grid_output.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nc_util/load_tc_data.cc b/met/src/libcode/vx_nc_util/load_tc_data.cc index 240ac92c01..ec764baf67 100644 --- a/met/src/libcode/vx_nc_util/load_tc_data.cc +++ b/met/src/libcode/vx_nc_util/load_tc_data.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nc_util/load_tc_data.h b/met/src/libcode/vx_nc_util/load_tc_data.h index bb7a6172f0..b6f0e59b45 100644 --- a/met/src/libcode/vx_nc_util/load_tc_data.h +++ b/met/src/libcode/vx_nc_util/load_tc_data.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nc_util/nc_constants.h b/met/src/libcode/vx_nc_util/nc_constants.h index 86da357025..f1417ee916 100644 --- a/met/src/libcode/vx_nc_util/nc_constants.h +++ b/met/src/libcode/vx_nc_util/nc_constants.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nc_util/nc_utils.cc b/met/src/libcode/vx_nc_util/nc_utils.cc index 62b64e233b..d45a49f8b6 100644 --- a/met/src/libcode/vx_nc_util/nc_utils.cc +++ b/met/src/libcode/vx_nc_util/nc_utils.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nc_util/nc_utils.h b/met/src/libcode/vx_nc_util/nc_utils.h index 79cc241f07..e1e99d6c10 100644 --- a/met/src/libcode/vx_nc_util/nc_utils.h +++ b/met/src/libcode/vx_nc_util/nc_utils.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nc_util/nc_var_info.cc b/met/src/libcode/vx_nc_util/nc_var_info.cc index 416e2e2c4a..0cf01a5c8d 100644 --- a/met/src/libcode/vx_nc_util/nc_var_info.cc +++ b/met/src/libcode/vx_nc_util/nc_var_info.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nc_util/nc_var_info.h b/met/src/libcode/vx_nc_util/nc_var_info.h index bd98cf2545..8e59432f27 100644 --- a/met/src/libcode/vx_nc_util/nc_var_info.h +++ b/met/src/libcode/vx_nc_util/nc_var_info.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nc_util/vx_nc_util.h b/met/src/libcode/vx_nc_util/vx_nc_util.h index 208cc46b03..ee3878cdb7 100644 --- a/met/src/libcode/vx_nc_util/vx_nc_util.h +++ b/met/src/libcode/vx_nc_util/vx_nc_util.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nc_util/write_netcdf.cc b/met/src/libcode/vx_nc_util/write_netcdf.cc index b193234d51..bf8eff148c 100644 --- a/met/src/libcode/vx_nc_util/write_netcdf.cc +++ b/met/src/libcode/vx_nc_util/write_netcdf.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_nc_util/write_netcdf.h b/met/src/libcode/vx_nc_util/write_netcdf.h index 49fac996e5..fd4b3adb32 100644 --- a/met/src/libcode/vx_nc_util/write_netcdf.h +++ b/met/src/libcode/vx_nc_util/write_netcdf.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pb_util/copy_bytes.cc b/met/src/libcode/vx_pb_util/copy_bytes.cc index ad5941598e..eb1655d60a 100644 --- a/met/src/libcode/vx_pb_util/copy_bytes.cc +++ b/met/src/libcode/vx_pb_util/copy_bytes.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pb_util/copy_bytes.h b/met/src/libcode/vx_pb_util/copy_bytes.h index e4ab211f00..8a90f4bbd9 100644 --- a/met/src/libcode/vx_pb_util/copy_bytes.h +++ b/met/src/libcode/vx_pb_util/copy_bytes.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pb_util/do_blocking.cc b/met/src/libcode/vx_pb_util/do_blocking.cc index 21a5cd6c06..814da8beb5 100644 --- a/met/src/libcode/vx_pb_util/do_blocking.cc +++ b/met/src/libcode/vx_pb_util/do_blocking.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pb_util/do_blocking.h b/met/src/libcode/vx_pb_util/do_blocking.h index 819e0301b7..2eef4d2081 100644 --- a/met/src/libcode/vx_pb_util/do_blocking.h +++ b/met/src/libcode/vx_pb_util/do_blocking.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pb_util/do_unblocking.cc b/met/src/libcode/vx_pb_util/do_unblocking.cc index 782228f9ef..f4d5af6cf2 100644 --- a/met/src/libcode/vx_pb_util/do_unblocking.cc +++ b/met/src/libcode/vx_pb_util/do_unblocking.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pb_util/do_unblocking.h b/met/src/libcode/vx_pb_util/do_unblocking.h index 185c7cd588..61359bee87 100644 --- a/met/src/libcode/vx_pb_util/do_unblocking.h +++ b/met/src/libcode/vx_pb_util/do_unblocking.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pb_util/pblock.cc b/met/src/libcode/vx_pb_util/pblock.cc index 49ce48c0f1..26196a8421 100644 --- a/met/src/libcode/vx_pb_util/pblock.cc +++ b/met/src/libcode/vx_pb_util/pblock.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pb_util/pblock.h b/met/src/libcode/vx_pb_util/pblock.h index d325a61ab5..7f7e83b1eb 100644 --- a/met/src/libcode/vx_pb_util/pblock.h +++ b/met/src/libcode/vx_pb_util/pblock.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pb_util/vx_pb_util.h b/met/src/libcode/vx_pb_util/vx_pb_util.h index e41345b6f9..5da853037e 100644 --- a/met/src/libcode/vx_pb_util/vx_pb_util.h +++ b/met/src/libcode/vx_pb_util/vx_pb_util.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////// // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_physics/thermo.cc b/met/src/libcode/vx_physics/thermo.cc index cdd49e32be..93d6d61289 100644 --- a/met/src/libcode/vx_physics/thermo.cc +++ b/met/src/libcode/vx_physics/thermo.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_physics/thermo.h b/met/src/libcode/vx_physics/thermo.h index 8dd27d50cf..64ae2eda75 100644 --- a/met/src/libcode/vx_physics/thermo.h +++ b/met/src/libcode/vx_physics/thermo.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_plot_util/data_plane_plot.cc b/met/src/libcode/vx_plot_util/data_plane_plot.cc index e5357cd1f5..d5723c6455 100644 --- a/met/src/libcode/vx_plot_util/data_plane_plot.cc +++ b/met/src/libcode/vx_plot_util/data_plane_plot.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_plot_util/data_plane_plot.h b/met/src/libcode/vx_plot_util/data_plane_plot.h index fc6081dd2c..a6069a55e0 100644 --- a/met/src/libcode/vx_plot_util/data_plane_plot.h +++ b/met/src/libcode/vx_plot_util/data_plane_plot.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_plot_util/map_region.cc b/met/src/libcode/vx_plot_util/map_region.cc index f352751d58..0481e8787b 100644 --- a/met/src/libcode/vx_plot_util/map_region.cc +++ b/met/src/libcode/vx_plot_util/map_region.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_plot_util/map_region.h b/met/src/libcode/vx_plot_util/map_region.h index c45eb75457..b7ee0e101a 100644 --- a/met/src/libcode/vx_plot_util/map_region.h +++ b/met/src/libcode/vx_plot_util/map_region.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_plot_util/vx_plot_util.cc b/met/src/libcode/vx_plot_util/vx_plot_util.cc index 3f9b815ab6..fc6e54f22a 100644 --- a/met/src/libcode/vx_plot_util/vx_plot_util.cc +++ b/met/src/libcode/vx_plot_util/vx_plot_util.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_plot_util/vx_plot_util.h b/met/src/libcode/vx_plot_util/vx_plot_util.h index cbf675c74b..c13aa3b1b4 100644 --- a/met/src/libcode/vx_plot_util/vx_plot_util.h +++ b/met/src/libcode/vx_plot_util/vx_plot_util.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_ps/ps_text.cc b/met/src/libcode/vx_ps/ps_text.cc index ec13c056f8..923ca2e6e4 100644 --- a/met/src/libcode/vx_ps/ps_text.cc +++ b/met/src/libcode/vx_ps/ps_text.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_ps/ps_text.h b/met/src/libcode/vx_ps/ps_text.h index 3165c16d6f..efa376cfea 100644 --- a/met/src/libcode/vx_ps/ps_text.h +++ b/met/src/libcode/vx_ps/ps_text.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_ps/table_helper.cc b/met/src/libcode/vx_ps/table_helper.cc index 1c303ae8fa..f4dc483f89 100644 --- a/met/src/libcode/vx_ps/table_helper.cc +++ b/met/src/libcode/vx_ps/table_helper.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_ps/table_helper.h b/met/src/libcode/vx_ps/table_helper.h index 02a7e82f9c..d236dceca0 100644 --- a/met/src/libcode/vx_ps/table_helper.h +++ b/met/src/libcode/vx_ps/table_helper.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_ps/vx_ps.cc b/met/src/libcode/vx_ps/vx_ps.cc index f5d2e2b403..68d311077b 100644 --- a/met/src/libcode/vx_ps/vx_ps.cc +++ b/met/src/libcode/vx_ps/vx_ps.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_ps/vx_ps.h b/met/src/libcode/vx_ps/vx_ps.h index fe1f400c7c..28d4f92ccf 100644 --- a/met/src/libcode/vx_ps/vx_ps.h +++ b/met/src/libcode/vx_ps/vx_ps.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pxm/pbm.cc b/met/src/libcode/vx_pxm/pbm.cc index 806815837d..36b8a94a65 100644 --- a/met/src/libcode/vx_pxm/pbm.cc +++ b/met/src/libcode/vx_pxm/pbm.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pxm/pbm.h b/met/src/libcode/vx_pxm/pbm.h index 2e604a9342..d24537a7fb 100644 --- a/met/src/libcode/vx_pxm/pbm.h +++ b/met/src/libcode/vx_pxm/pbm.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pxm/pcm.cc b/met/src/libcode/vx_pxm/pcm.cc index 1b4160ff40..3919805709 100644 --- a/met/src/libcode/vx_pxm/pcm.cc +++ b/met/src/libcode/vx_pxm/pcm.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pxm/pcm.h b/met/src/libcode/vx_pxm/pcm.h index f84d45f517..3ef1f4968d 100644 --- a/met/src/libcode/vx_pxm/pcm.h +++ b/met/src/libcode/vx_pxm/pcm.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pxm/pgm.cc b/met/src/libcode/vx_pxm/pgm.cc index 6ea60e1f90..f8eb026cd8 100644 --- a/met/src/libcode/vx_pxm/pgm.cc +++ b/met/src/libcode/vx_pxm/pgm.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pxm/pgm.h b/met/src/libcode/vx_pxm/pgm.h index 8503af3740..adf2481c1e 100644 --- a/met/src/libcode/vx_pxm/pgm.h +++ b/met/src/libcode/vx_pxm/pgm.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pxm/ppm.cc b/met/src/libcode/vx_pxm/ppm.cc index bcac4944f3..c12c130e56 100644 --- a/met/src/libcode/vx_pxm/ppm.cc +++ b/met/src/libcode/vx_pxm/ppm.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pxm/ppm.h b/met/src/libcode/vx_pxm/ppm.h index 5d40eaa180..e9c6d80975 100644 --- a/met/src/libcode/vx_pxm/ppm.h +++ b/met/src/libcode/vx_pxm/ppm.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pxm/pxm_base.cc b/met/src/libcode/vx_pxm/pxm_base.cc index 576b16cde5..5e4450e36c 100644 --- a/met/src/libcode/vx_pxm/pxm_base.cc +++ b/met/src/libcode/vx_pxm/pxm_base.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pxm/pxm_base.h b/met/src/libcode/vx_pxm/pxm_base.h index 06ebc2ac9d..59d5717a04 100644 --- a/met/src/libcode/vx_pxm/pxm_base.h +++ b/met/src/libcode/vx_pxm/pxm_base.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pxm/pxm_utils.cc b/met/src/libcode/vx_pxm/pxm_utils.cc index d76d7b7faa..58640e2040 100644 --- a/met/src/libcode/vx_pxm/pxm_utils.cc +++ b/met/src/libcode/vx_pxm/pxm_utils.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pxm/pxm_utils.h b/met/src/libcode/vx_pxm/pxm_utils.h index b6f754e486..fee904887a 100644 --- a/met/src/libcode/vx_pxm/pxm_utils.h +++ b/met/src/libcode/vx_pxm/pxm_utils.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_pxm/vx_pxm.h b/met/src/libcode/vx_pxm/vx_pxm.h index e33203d0b5..d98c56d492 100644 --- a/met/src/libcode/vx_pxm/vx_pxm.h +++ b/met/src/libcode/vx_pxm/vx_pxm.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_python3_utils/global_python.h b/met/src/libcode/vx_python3_utils/global_python.h index e3ee2181c5..3459f27dda 100644 --- a/met/src/libcode/vx_python3_utils/global_python.h +++ b/met/src/libcode/vx_python3_utils/global_python.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_python3_utils/python3_dict.cc b/met/src/libcode/vx_python3_utils/python3_dict.cc index 99a0d5fc93..e3fbcc4191 100644 --- a/met/src/libcode/vx_python3_utils/python3_dict.cc +++ b/met/src/libcode/vx_python3_utils/python3_dict.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_python3_utils/python3_dict.h b/met/src/libcode/vx_python3_utils/python3_dict.h index 34cfd803de..1b747d183d 100644 --- a/met/src/libcode/vx_python3_utils/python3_dict.h +++ b/met/src/libcode/vx_python3_utils/python3_dict.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_python3_utils/python3_list.cc b/met/src/libcode/vx_python3_utils/python3_list.cc index 554be77c53..5a91bb92a9 100644 --- a/met/src/libcode/vx_python3_utils/python3_list.cc +++ b/met/src/libcode/vx_python3_utils/python3_list.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_python3_utils/python3_list.h b/met/src/libcode/vx_python3_utils/python3_list.h index b6690d510e..d502c09005 100644 --- a/met/src/libcode/vx_python3_utils/python3_list.h +++ b/met/src/libcode/vx_python3_utils/python3_list.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_python3_utils/wchar_argv.cc b/met/src/libcode/vx_python3_utils/wchar_argv.cc index f8dca24f47..2460fa5776 100644 --- a/met/src/libcode/vx_python3_utils/wchar_argv.cc +++ b/met/src/libcode/vx_python3_utils/wchar_argv.cc @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_python3_utils/wchar_argv.h b/met/src/libcode/vx_python3_utils/wchar_argv.h index 10be5bfe06..a7fe2b42b0 100644 --- a/met/src/libcode/vx_python3_utils/wchar_argv.h +++ b/met/src/libcode/vx_python3_utils/wchar_argv.h @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_regrid/vx_regrid.cc b/met/src/libcode/vx_regrid/vx_regrid.cc index 188ef51057..1094fd6c86 100644 --- a/met/src/libcode/vx_regrid/vx_regrid.cc +++ b/met/src/libcode/vx_regrid/vx_regrid.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_regrid/vx_regrid.h b/met/src/libcode/vx_regrid/vx_regrid.h index 11f7a65ba7..521b2d89c8 100644 --- a/met/src/libcode/vx_regrid/vx_regrid.h +++ b/met/src/libcode/vx_regrid/vx_regrid.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_regrid/vx_regrid_budget.cc b/met/src/libcode/vx_regrid/vx_regrid_budget.cc index a4e7771fa0..881e56ef1c 100644 --- a/met/src/libcode/vx_regrid/vx_regrid_budget.cc +++ b/met/src/libcode/vx_regrid/vx_regrid_budget.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/ascii85_filter.cc b/met/src/libcode/vx_render/ascii85_filter.cc index b3375e5da4..2646ac7f0d 100644 --- a/met/src/libcode/vx_render/ascii85_filter.cc +++ b/met/src/libcode/vx_render/ascii85_filter.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/ascii85_filter.h b/met/src/libcode/vx_render/ascii85_filter.h index 2c1ec28bda..85e650595d 100644 --- a/met/src/libcode/vx_render/ascii85_filter.h +++ b/met/src/libcode/vx_render/ascii85_filter.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/bit_filter.cc b/met/src/libcode/vx_render/bit_filter.cc index 6006daa8d6..f1d80dc6fc 100644 --- a/met/src/libcode/vx_render/bit_filter.cc +++ b/met/src/libcode/vx_render/bit_filter.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/bit_filter.h b/met/src/libcode/vx_render/bit_filter.h index 867afe83c7..77ba44f78d 100644 --- a/met/src/libcode/vx_render/bit_filter.h +++ b/met/src/libcode/vx_render/bit_filter.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/flate_filter.cc b/met/src/libcode/vx_render/flate_filter.cc index 7d1a27bd4f..40272d3f0a 100644 --- a/met/src/libcode/vx_render/flate_filter.cc +++ b/met/src/libcode/vx_render/flate_filter.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/flate_filter.h b/met/src/libcode/vx_render/flate_filter.h index abeeed4bdf..6d73cdc9f7 100644 --- a/met/src/libcode/vx_render/flate_filter.h +++ b/met/src/libcode/vx_render/flate_filter.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/hex_filter.cc b/met/src/libcode/vx_render/hex_filter.cc index 134d1f0640..0e2bc10654 100644 --- a/met/src/libcode/vx_render/hex_filter.cc +++ b/met/src/libcode/vx_render/hex_filter.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/hex_filter.h b/met/src/libcode/vx_render/hex_filter.h index e473dea92f..6f6965d099 100644 --- a/met/src/libcode/vx_render/hex_filter.h +++ b/met/src/libcode/vx_render/hex_filter.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/ps_filter.cc b/met/src/libcode/vx_render/ps_filter.cc index 0eaa98ad38..fe74d522a8 100644 --- a/met/src/libcode/vx_render/ps_filter.cc +++ b/met/src/libcode/vx_render/ps_filter.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/ps_filter.h b/met/src/libcode/vx_render/ps_filter.h index 9a17d621f3..041a0f3aa8 100644 --- a/met/src/libcode/vx_render/ps_filter.h +++ b/met/src/libcode/vx_render/ps_filter.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/psout_filter.cc b/met/src/libcode/vx_render/psout_filter.cc index db579b31b6..45a043ad53 100644 --- a/met/src/libcode/vx_render/psout_filter.cc +++ b/met/src/libcode/vx_render/psout_filter.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/psout_filter.h b/met/src/libcode/vx_render/psout_filter.h index cbfc03b364..5ea36d2c17 100644 --- a/met/src/libcode/vx_render/psout_filter.h +++ b/met/src/libcode/vx_render/psout_filter.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/render_pbm.cc b/met/src/libcode/vx_render/render_pbm.cc index 0a3d86e808..af98e535fd 100644 --- a/met/src/libcode/vx_render/render_pbm.cc +++ b/met/src/libcode/vx_render/render_pbm.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/render_pcm.cc b/met/src/libcode/vx_render/render_pcm.cc index 587a7670b1..3246800645 100644 --- a/met/src/libcode/vx_render/render_pcm.cc +++ b/met/src/libcode/vx_render/render_pcm.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/render_pgm.cc b/met/src/libcode/vx_render/render_pgm.cc index ceba2dfd21..9a199c6d47 100644 --- a/met/src/libcode/vx_render/render_pgm.cc +++ b/met/src/libcode/vx_render/render_pgm.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/render_ppm.cc b/met/src/libcode/vx_render/render_ppm.cc index fa17545723..2b1a63ff6c 100644 --- a/met/src/libcode/vx_render/render_ppm.cc +++ b/met/src/libcode/vx_render/render_ppm.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/renderinfo.cc b/met/src/libcode/vx_render/renderinfo.cc index 7ede10050c..a57330dfee 100644 --- a/met/src/libcode/vx_render/renderinfo.cc +++ b/met/src/libcode/vx_render/renderinfo.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/renderinfo.h b/met/src/libcode/vx_render/renderinfo.h index 6107f03515..27475473e8 100644 --- a/met/src/libcode/vx_render/renderinfo.h +++ b/met/src/libcode/vx_render/renderinfo.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/rle_filter.cc b/met/src/libcode/vx_render/rle_filter.cc index d022818119..39607b27b7 100644 --- a/met/src/libcode/vx_render/rle_filter.cc +++ b/met/src/libcode/vx_render/rle_filter.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/rle_filter.h b/met/src/libcode/vx_render/rle_filter.h index 2b8539a78b..e941d122ce 100644 --- a/met/src/libcode/vx_render/rle_filter.h +++ b/met/src/libcode/vx_render/rle_filter.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/uc_queue.cc b/met/src/libcode/vx_render/uc_queue.cc index 54126b9fdf..f176ee5953 100644 --- a/met/src/libcode/vx_render/uc_queue.cc +++ b/met/src/libcode/vx_render/uc_queue.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/uc_queue.h b/met/src/libcode/vx_render/uc_queue.h index ff2493126a..7795c9d2d4 100644 --- a/met/src/libcode/vx_render/uc_queue.h +++ b/met/src/libcode/vx_render/uc_queue.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_render/vx_render.h b/met/src/libcode/vx_render/vx_render.h index 0052dd4578..1adb848cf2 100644 --- a/met/src/libcode/vx_render/vx_render.h +++ b/met/src/libcode/vx_render/vx_render.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_series_data/series_data.cc b/met/src/libcode/vx_series_data/series_data.cc index c7aafa8203..02ec7e79bf 100644 --- a/met/src/libcode/vx_series_data/series_data.cc +++ b/met/src/libcode/vx_series_data/series_data.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_series_data/series_data.h b/met/src/libcode/vx_series_data/series_data.h index 4aa41f5e90..90235519b6 100644 --- a/met/src/libcode/vx_series_data/series_data.h +++ b/met/src/libcode/vx_series_data/series_data.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_series_data/series_pdf.cc b/met/src/libcode/vx_series_data/series_pdf.cc index 15f1c8cf15..994dc16618 100644 --- a/met/src/libcode/vx_series_data/series_pdf.cc +++ b/met/src/libcode/vx_series_data/series_pdf.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_series_data/series_pdf.h b/met/src/libcode/vx_series_data/series_pdf.h index 32962a1dd7..7a200357d5 100644 --- a/met/src/libcode/vx_series_data/series_pdf.h +++ b/met/src/libcode/vx_series_data/series_pdf.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_shapedata/engine.cc b/met/src/libcode/vx_shapedata/engine.cc index 849ba80da8..ff0b98e393 100644 --- a/met/src/libcode/vx_shapedata/engine.cc +++ b/met/src/libcode/vx_shapedata/engine.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_shapedata/engine.h b/met/src/libcode/vx_shapedata/engine.h index c56732fd7b..41906284fd 100644 --- a/met/src/libcode/vx_shapedata/engine.h +++ b/met/src/libcode/vx_shapedata/engine.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_shapedata/interest.cc b/met/src/libcode/vx_shapedata/interest.cc index 9e3735adb8..2c42129b94 100644 --- a/met/src/libcode/vx_shapedata/interest.cc +++ b/met/src/libcode/vx_shapedata/interest.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_shapedata/interest.h b/met/src/libcode/vx_shapedata/interest.h index 45095f82b9..80a38a7606 100644 --- a/met/src/libcode/vx_shapedata/interest.h +++ b/met/src/libcode/vx_shapedata/interest.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_shapedata/mode_columns.h b/met/src/libcode/vx_shapedata/mode_columns.h index f18b501305..f478579cba 100644 --- a/met/src/libcode/vx_shapedata/mode_columns.h +++ b/met/src/libcode/vx_shapedata/mode_columns.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_shapedata/mode_conf_info.cc b/met/src/libcode/vx_shapedata/mode_conf_info.cc index 40ae8db179..06ac25c914 100644 --- a/met/src/libcode/vx_shapedata/mode_conf_info.cc +++ b/met/src/libcode/vx_shapedata/mode_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_shapedata/mode_conf_info.h b/met/src/libcode/vx_shapedata/mode_conf_info.h index c644cbdc41..7521fad258 100644 --- a/met/src/libcode/vx_shapedata/mode_conf_info.h +++ b/met/src/libcode/vx_shapedata/mode_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_shapedata/moments.cc b/met/src/libcode/vx_shapedata/moments.cc index 5c471c35f0..ed7125beab 100644 --- a/met/src/libcode/vx_shapedata/moments.cc +++ b/met/src/libcode/vx_shapedata/moments.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_shapedata/moments.h b/met/src/libcode/vx_shapedata/moments.h index e925064b37..f05ac292c4 100644 --- a/met/src/libcode/vx_shapedata/moments.h +++ b/met/src/libcode/vx_shapedata/moments.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_shapedata/node.cc b/met/src/libcode/vx_shapedata/node.cc index 16a4cdd49f..1174ded749 100644 --- a/met/src/libcode/vx_shapedata/node.cc +++ b/met/src/libcode/vx_shapedata/node.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_shapedata/node.h b/met/src/libcode/vx_shapedata/node.h index 50be097612..56089e1f1c 100644 --- a/met/src/libcode/vx_shapedata/node.h +++ b/met/src/libcode/vx_shapedata/node.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_shapedata/set.cc b/met/src/libcode/vx_shapedata/set.cc index b994788310..3f1fd4152b 100644 --- a/met/src/libcode/vx_shapedata/set.cc +++ b/met/src/libcode/vx_shapedata/set.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_shapedata/set.h b/met/src/libcode/vx_shapedata/set.h index 6c811be5ee..4e73eb3082 100644 --- a/met/src/libcode/vx_shapedata/set.h +++ b/met/src/libcode/vx_shapedata/set.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_shapedata/shape.h b/met/src/libcode/vx_shapedata/shape.h index c84a96eb66..a78b28cdcd 100644 --- a/met/src/libcode/vx_shapedata/shape.h +++ b/met/src/libcode/vx_shapedata/shape.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_shapedata/shapedata.cc b/met/src/libcode/vx_shapedata/shapedata.cc index 8794f85389..4a0016ea59 100644 --- a/met/src/libcode/vx_shapedata/shapedata.cc +++ b/met/src/libcode/vx_shapedata/shapedata.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_shapedata/shapedata.h b/met/src/libcode/vx_shapedata/shapedata.h index 8d06f5f35c..c045e9971c 100644 --- a/met/src/libcode/vx_shapedata/shapedata.h +++ b/met/src/libcode/vx_shapedata/shapedata.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_shapedata/vx_shapedata.h b/met/src/libcode/vx_shapedata/vx_shapedata.h index 4efdc616ca..77ca27f1c7 100644 --- a/met/src/libcode/vx_shapedata/vx_shapedata.h +++ b/met/src/libcode/vx_shapedata/vx_shapedata.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_solar/astro_constants.h b/met/src/libcode/vx_solar/astro_constants.h index 9686d1f65b..53e53a8f7f 100644 --- a/met/src/libcode/vx_solar/astro_constants.h +++ b/met/src/libcode/vx_solar/astro_constants.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_solar/siderial.cc b/met/src/libcode/vx_solar/siderial.cc index 2db04d44ff..4e528ca7c3 100644 --- a/met/src/libcode/vx_solar/siderial.cc +++ b/met/src/libcode/vx_solar/siderial.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_solar/siderial.h b/met/src/libcode/vx_solar/siderial.h index 57b6bc24ab..c2ee6ffed0 100644 --- a/met/src/libcode/vx_solar/siderial.h +++ b/met/src/libcode/vx_solar/siderial.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_solar/solar.cc b/met/src/libcode/vx_solar/solar.cc index 5849df152a..283c71ec4f 100644 --- a/met/src/libcode/vx_solar/solar.cc +++ b/met/src/libcode/vx_solar/solar.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_solar/solar.h b/met/src/libcode/vx_solar/solar.h index dba2ff10e0..052d3ffe69 100644 --- a/met/src/libcode/vx_solar/solar.h +++ b/met/src/libcode/vx_solar/solar.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_stat_out/stat_columns.cc b/met/src/libcode/vx_stat_out/stat_columns.cc index aeaa1ff684..49b274da18 100644 --- a/met/src/libcode/vx_stat_out/stat_columns.cc +++ b/met/src/libcode/vx_stat_out/stat_columns.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_stat_out/stat_columns.h b/met/src/libcode/vx_stat_out/stat_columns.h index f5db8bb977..ff974d7c1e 100644 --- a/met/src/libcode/vx_stat_out/stat_columns.h +++ b/met/src/libcode/vx_stat_out/stat_columns.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_stat_out/stat_hdr_columns.cc b/met/src/libcode/vx_stat_out/stat_hdr_columns.cc index 85f933029b..2ab360b744 100644 --- a/met/src/libcode/vx_stat_out/stat_hdr_columns.cc +++ b/met/src/libcode/vx_stat_out/stat_hdr_columns.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_stat_out/stat_hdr_columns.h b/met/src/libcode/vx_stat_out/stat_hdr_columns.h index 8967621c02..a7d8564d62 100644 --- a/met/src/libcode/vx_stat_out/stat_hdr_columns.h +++ b/met/src/libcode/vx_stat_out/stat_hdr_columns.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_stat_out/vx_stat_out.h b/met/src/libcode/vx_stat_out/vx_stat_out.h index 7aba14f5b4..19800bb5ce 100644 --- a/met/src/libcode/vx_stat_out/vx_stat_out.h +++ b/met/src/libcode/vx_stat_out/vx_stat_out.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/apply_mask.cc b/met/src/libcode/vx_statistics/apply_mask.cc index b97e9272d3..1aea2fe836 100644 --- a/met/src/libcode/vx_statistics/apply_mask.cc +++ b/met/src/libcode/vx_statistics/apply_mask.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/apply_mask.h b/met/src/libcode/vx_statistics/apply_mask.h index 5e62500d73..5dcb6bd14c 100644 --- a/met/src/libcode/vx_statistics/apply_mask.h +++ b/met/src/libcode/vx_statistics/apply_mask.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/compute_ci.cc b/met/src/libcode/vx_statistics/compute_ci.cc index 9b0f55d38c..2e4caa83f6 100644 --- a/met/src/libcode/vx_statistics/compute_ci.cc +++ b/met/src/libcode/vx_statistics/compute_ci.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/compute_ci.h b/met/src/libcode/vx_statistics/compute_ci.h index f74559aa02..ab3fa01977 100644 --- a/met/src/libcode/vx_statistics/compute_ci.h +++ b/met/src/libcode/vx_statistics/compute_ci.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/compute_stats.cc b/met/src/libcode/vx_statistics/compute_stats.cc index 211fe9860e..701ef35b96 100644 --- a/met/src/libcode/vx_statistics/compute_stats.cc +++ b/met/src/libcode/vx_statistics/compute_stats.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/compute_stats.h b/met/src/libcode/vx_statistics/compute_stats.h index 102d0a2a49..0536350cce 100644 --- a/met/src/libcode/vx_statistics/compute_stats.h +++ b/met/src/libcode/vx_statistics/compute_stats.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/contable.cc b/met/src/libcode/vx_statistics/contable.cc index fbae3e5904..7d952e4eb6 100644 --- a/met/src/libcode/vx_statistics/contable.cc +++ b/met/src/libcode/vx_statistics/contable.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/contable.h b/met/src/libcode/vx_statistics/contable.h index e124870a16..dd7dd05ca5 100644 --- a/met/src/libcode/vx_statistics/contable.h +++ b/met/src/libcode/vx_statistics/contable.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/contable_nx2.cc b/met/src/libcode/vx_statistics/contable_nx2.cc index aaa0bde6fb..ab9b19922c 100644 --- a/met/src/libcode/vx_statistics/contable_nx2.cc +++ b/met/src/libcode/vx_statistics/contable_nx2.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/contable_stats.cc b/met/src/libcode/vx_statistics/contable_stats.cc index bfa961deb8..eb51399d43 100644 --- a/met/src/libcode/vx_statistics/contable_stats.cc +++ b/met/src/libcode/vx_statistics/contable_stats.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/ens_stats.cc b/met/src/libcode/vx_statistics/ens_stats.cc index ebfe4b5e28..ac9805a928 100644 --- a/met/src/libcode/vx_statistics/ens_stats.cc +++ b/met/src/libcode/vx_statistics/ens_stats.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/ens_stats.h b/met/src/libcode/vx_statistics/ens_stats.h index 8290ddfabd..987b172907 100644 --- a/met/src/libcode/vx_statistics/ens_stats.h +++ b/met/src/libcode/vx_statistics/ens_stats.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/met_stats.cc b/met/src/libcode/vx_statistics/met_stats.cc index 27904462d1..a01b8a57eb 100644 --- a/met/src/libcode/vx_statistics/met_stats.cc +++ b/met/src/libcode/vx_statistics/met_stats.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/met_stats.h b/met/src/libcode/vx_statistics/met_stats.h index 4967673101..93c1c60020 100644 --- a/met/src/libcode/vx_statistics/met_stats.h +++ b/met/src/libcode/vx_statistics/met_stats.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/obs_error.cc b/met/src/libcode/vx_statistics/obs_error.cc index 6ff2d4d185..03b91b8cdb 100644 --- a/met/src/libcode/vx_statistics/obs_error.cc +++ b/met/src/libcode/vx_statistics/obs_error.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/obs_error.h b/met/src/libcode/vx_statistics/obs_error.h index 4a440acf3e..e060aa4854 100644 --- a/met/src/libcode/vx_statistics/obs_error.h +++ b/met/src/libcode/vx_statistics/obs_error.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/pair_base.cc b/met/src/libcode/vx_statistics/pair_base.cc index 1061423e25..d90e3167a6 100644 --- a/met/src/libcode/vx_statistics/pair_base.cc +++ b/met/src/libcode/vx_statistics/pair_base.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/pair_base.h b/met/src/libcode/vx_statistics/pair_base.h index db7b63297f..ebe0f845fc 100644 --- a/met/src/libcode/vx_statistics/pair_base.h +++ b/met/src/libcode/vx_statistics/pair_base.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/pair_data_ensemble.cc b/met/src/libcode/vx_statistics/pair_data_ensemble.cc index 5f21f17fe9..53c4993580 100644 --- a/met/src/libcode/vx_statistics/pair_data_ensemble.cc +++ b/met/src/libcode/vx_statistics/pair_data_ensemble.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/pair_data_ensemble.h b/met/src/libcode/vx_statistics/pair_data_ensemble.h index 3d71af984b..d5bad07d03 100644 --- a/met/src/libcode/vx_statistics/pair_data_ensemble.h +++ b/met/src/libcode/vx_statistics/pair_data_ensemble.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/pair_data_point.cc b/met/src/libcode/vx_statistics/pair_data_point.cc index 0ca19804dd..361939a010 100644 --- a/met/src/libcode/vx_statistics/pair_data_point.cc +++ b/met/src/libcode/vx_statistics/pair_data_point.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/pair_data_point.h b/met/src/libcode/vx_statistics/pair_data_point.h index 739baf2ba6..33a090e2dc 100644 --- a/met/src/libcode/vx_statistics/pair_data_point.h +++ b/met/src/libcode/vx_statistics/pair_data_point.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/read_climo.cc b/met/src/libcode/vx_statistics/read_climo.cc index 27d79cbb42..af682ca973 100644 --- a/met/src/libcode/vx_statistics/read_climo.cc +++ b/met/src/libcode/vx_statistics/read_climo.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/read_climo.h b/met/src/libcode/vx_statistics/read_climo.h index 7a65c6e68c..f2fe419b23 100644 --- a/met/src/libcode/vx_statistics/read_climo.h +++ b/met/src/libcode/vx_statistics/read_climo.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_statistics/vx_statistics.h b/met/src/libcode/vx_statistics/vx_statistics.h index 2af3fc87fa..db1d6685d1 100644 --- a/met/src/libcode/vx_statistics/vx_statistics.h +++ b/met/src/libcode/vx_statistics/vx_statistics.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_calc.cc b/met/src/libcode/vx_summary/summary_calc.cc index 84ce0ab14c..727c787549 100644 --- a/met/src/libcode/vx_summary/summary_calc.cc +++ b/met/src/libcode/vx_summary/summary_calc.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_calc.h b/met/src/libcode/vx_summary/summary_calc.h index 41bd7b54fa..1779603445 100644 --- a/met/src/libcode/vx_summary/summary_calc.h +++ b/met/src/libcode/vx_summary/summary_calc.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_calc_max.cc b/met/src/libcode/vx_summary/summary_calc_max.cc index 9902e74012..3e3d4d6b03 100644 --- a/met/src/libcode/vx_summary/summary_calc_max.cc +++ b/met/src/libcode/vx_summary/summary_calc_max.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_calc_max.h b/met/src/libcode/vx_summary/summary_calc_max.h index 2b9733d416..51d947a98c 100644 --- a/met/src/libcode/vx_summary/summary_calc_max.h +++ b/met/src/libcode/vx_summary/summary_calc_max.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_calc_mean.cc b/met/src/libcode/vx_summary/summary_calc_mean.cc index abf834b6a3..3fbdece2cd 100644 --- a/met/src/libcode/vx_summary/summary_calc_mean.cc +++ b/met/src/libcode/vx_summary/summary_calc_mean.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_calc_mean.h b/met/src/libcode/vx_summary/summary_calc_mean.h index 552f0e0f21..34373a3bed 100644 --- a/met/src/libcode/vx_summary/summary_calc_mean.h +++ b/met/src/libcode/vx_summary/summary_calc_mean.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_calc_median.cc b/met/src/libcode/vx_summary/summary_calc_median.cc index 940e4e18e7..b7e02a7a39 100644 --- a/met/src/libcode/vx_summary/summary_calc_median.cc +++ b/met/src/libcode/vx_summary/summary_calc_median.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_calc_median.h b/met/src/libcode/vx_summary/summary_calc_median.h index a7b5ef702b..5a311796e3 100644 --- a/met/src/libcode/vx_summary/summary_calc_median.h +++ b/met/src/libcode/vx_summary/summary_calc_median.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_calc_min.cc b/met/src/libcode/vx_summary/summary_calc_min.cc index ad0c1e97cb..f6f4f5d05b 100644 --- a/met/src/libcode/vx_summary/summary_calc_min.cc +++ b/met/src/libcode/vx_summary/summary_calc_min.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_calc_min.h b/met/src/libcode/vx_summary/summary_calc_min.h index 5dee6ba548..0c65405056 100644 --- a/met/src/libcode/vx_summary/summary_calc_min.h +++ b/met/src/libcode/vx_summary/summary_calc_min.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_calc_percentile.cc b/met/src/libcode/vx_summary/summary_calc_percentile.cc index b4488acf4b..06386b326d 100644 --- a/met/src/libcode/vx_summary/summary_calc_percentile.cc +++ b/met/src/libcode/vx_summary/summary_calc_percentile.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_calc_percentile.h b/met/src/libcode/vx_summary/summary_calc_percentile.h index 7919c2e58e..a3b21ba0da 100644 --- a/met/src/libcode/vx_summary/summary_calc_percentile.h +++ b/met/src/libcode/vx_summary/summary_calc_percentile.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_calc_range.cc b/met/src/libcode/vx_summary/summary_calc_range.cc index 36a754f4cf..4856fa1e2d 100644 --- a/met/src/libcode/vx_summary/summary_calc_range.cc +++ b/met/src/libcode/vx_summary/summary_calc_range.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_calc_range.h b/met/src/libcode/vx_summary/summary_calc_range.h index e645018426..b155912b99 100644 --- a/met/src/libcode/vx_summary/summary_calc_range.h +++ b/met/src/libcode/vx_summary/summary_calc_range.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_calc_stdev.cc b/met/src/libcode/vx_summary/summary_calc_stdev.cc index 851d4ee845..ebe3489c38 100644 --- a/met/src/libcode/vx_summary/summary_calc_stdev.cc +++ b/met/src/libcode/vx_summary/summary_calc_stdev.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_calc_stdev.h b/met/src/libcode/vx_summary/summary_calc_stdev.h index b4aa83c0a1..6ee6bb3ed6 100644 --- a/met/src/libcode/vx_summary/summary_calc_stdev.h +++ b/met/src/libcode/vx_summary/summary_calc_stdev.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_key.cc b/met/src/libcode/vx_summary/summary_key.cc index 54731cde02..31a9fcf27d 100644 --- a/met/src/libcode/vx_summary/summary_key.cc +++ b/met/src/libcode/vx_summary/summary_key.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_key.h b/met/src/libcode/vx_summary/summary_key.h index 1941e91ed4..fd6c76e514 100644 --- a/met/src/libcode/vx_summary/summary_key.h +++ b/met/src/libcode/vx_summary/summary_key.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_obs.cc b/met/src/libcode/vx_summary/summary_obs.cc index 33cc40f626..4a2ef5a768 100644 --- a/met/src/libcode/vx_summary/summary_obs.cc +++ b/met/src/libcode/vx_summary/summary_obs.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/summary_obs.h b/met/src/libcode/vx_summary/summary_obs.h index afd6630b79..65da966e43 100644 --- a/met/src/libcode/vx_summary/summary_obs.h +++ b/met/src/libcode/vx_summary/summary_obs.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/time_summary_interval.cc b/met/src/libcode/vx_summary/time_summary_interval.cc index 78155eb337..2bee215b92 100644 --- a/met/src/libcode/vx_summary/time_summary_interval.cc +++ b/met/src/libcode/vx_summary/time_summary_interval.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/time_summary_interval.h b/met/src/libcode/vx_summary/time_summary_interval.h index 094340a91f..74dfd22d1e 100644 --- a/met/src/libcode/vx_summary/time_summary_interval.h +++ b/met/src/libcode/vx_summary/time_summary_interval.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_summary/vx_summary.h b/met/src/libcode/vx_summary/vx_summary.h index e0340a2729..429d3dc45d 100644 --- a/met/src/libcode/vx_summary/vx_summary.h +++ b/met/src/libcode/vx_summary/vx_summary.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/atcf_line_base.cc b/met/src/libcode/vx_tc_util/atcf_line_base.cc index aa970dc117..bc5474cec4 100644 --- a/met/src/libcode/vx_tc_util/atcf_line_base.cc +++ b/met/src/libcode/vx_tc_util/atcf_line_base.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/atcf_line_base.h b/met/src/libcode/vx_tc_util/atcf_line_base.h index e65f7004a3..816ddfeba4 100644 --- a/met/src/libcode/vx_tc_util/atcf_line_base.h +++ b/met/src/libcode/vx_tc_util/atcf_line_base.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/atcf_offsets.h b/met/src/libcode/vx_tc_util/atcf_offsets.h index de15fad578..5a82809c70 100644 --- a/met/src/libcode/vx_tc_util/atcf_offsets.h +++ b/met/src/libcode/vx_tc_util/atcf_offsets.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/atcf_prob_line.cc b/met/src/libcode/vx_tc_util/atcf_prob_line.cc index 2a26e5a68e..2f912e9516 100644 --- a/met/src/libcode/vx_tc_util/atcf_prob_line.cc +++ b/met/src/libcode/vx_tc_util/atcf_prob_line.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/atcf_prob_line.h b/met/src/libcode/vx_tc_util/atcf_prob_line.h index 9c4f9acae0..6e421c2d99 100644 --- a/met/src/libcode/vx_tc_util/atcf_prob_line.h +++ b/met/src/libcode/vx_tc_util/atcf_prob_line.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/atcf_track_line.cc b/met/src/libcode/vx_tc_util/atcf_track_line.cc index 86697c2514..49c0aad310 100644 --- a/met/src/libcode/vx_tc_util/atcf_track_line.cc +++ b/met/src/libcode/vx_tc_util/atcf_track_line.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/atcf_track_line.h b/met/src/libcode/vx_tc_util/atcf_track_line.h index 2e3f94e3a1..f548fa1735 100644 --- a/met/src/libcode/vx_tc_util/atcf_track_line.h +++ b/met/src/libcode/vx_tc_util/atcf_track_line.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/genesis_info.cc b/met/src/libcode/vx_tc_util/genesis_info.cc index 91c708ff82..0000d93b8a 100644 --- a/met/src/libcode/vx_tc_util/genesis_info.cc +++ b/met/src/libcode/vx_tc_util/genesis_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/genesis_info.h b/met/src/libcode/vx_tc_util/genesis_info.h index 9ef8afb742..5caa835e51 100644 --- a/met/src/libcode/vx_tc_util/genesis_info.h +++ b/met/src/libcode/vx_tc_util/genesis_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/pair_data_genesis.cc b/met/src/libcode/vx_tc_util/pair_data_genesis.cc index ba1f564b44..d10b809c58 100644 --- a/met/src/libcode/vx_tc_util/pair_data_genesis.cc +++ b/met/src/libcode/vx_tc_util/pair_data_genesis.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/pair_data_genesis.h b/met/src/libcode/vx_tc_util/pair_data_genesis.h index 81843fce09..0f0473d53a 100644 --- a/met/src/libcode/vx_tc_util/pair_data_genesis.h +++ b/met/src/libcode/vx_tc_util/pair_data_genesis.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/prob_info_array.cc b/met/src/libcode/vx_tc_util/prob_info_array.cc index 7422735634..ea8827a682 100644 --- a/met/src/libcode/vx_tc_util/prob_info_array.cc +++ b/met/src/libcode/vx_tc_util/prob_info_array.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/prob_info_array.h b/met/src/libcode/vx_tc_util/prob_info_array.h index 6ee42dbb10..1228b91880 100644 --- a/met/src/libcode/vx_tc_util/prob_info_array.h +++ b/met/src/libcode/vx_tc_util/prob_info_array.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/prob_info_base.cc b/met/src/libcode/vx_tc_util/prob_info_base.cc index 710f566eed..07de90221a 100644 --- a/met/src/libcode/vx_tc_util/prob_info_base.cc +++ b/met/src/libcode/vx_tc_util/prob_info_base.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/prob_info_base.h b/met/src/libcode/vx_tc_util/prob_info_base.h index b823ad0a31..4f416db319 100644 --- a/met/src/libcode/vx_tc_util/prob_info_base.h +++ b/met/src/libcode/vx_tc_util/prob_info_base.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/prob_pair_info.cc b/met/src/libcode/vx_tc_util/prob_pair_info.cc index f1b9c44d90..4f8189d7e0 100644 --- a/met/src/libcode/vx_tc_util/prob_pair_info.cc +++ b/met/src/libcode/vx_tc_util/prob_pair_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/prob_pair_info.h b/met/src/libcode/vx_tc_util/prob_pair_info.h index f037410814..3bb29586ed 100644 --- a/met/src/libcode/vx_tc_util/prob_pair_info.h +++ b/met/src/libcode/vx_tc_util/prob_pair_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/prob_rirw_info.cc b/met/src/libcode/vx_tc_util/prob_rirw_info.cc index ebf8788c6e..edbd318334 100644 --- a/met/src/libcode/vx_tc_util/prob_rirw_info.cc +++ b/met/src/libcode/vx_tc_util/prob_rirw_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/prob_rirw_info.h b/met/src/libcode/vx_tc_util/prob_rirw_info.h index 8350aef620..9f47615dbf 100644 --- a/met/src/libcode/vx_tc_util/prob_rirw_info.h +++ b/met/src/libcode/vx_tc_util/prob_rirw_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/prob_rirw_pair_info.cc b/met/src/libcode/vx_tc_util/prob_rirw_pair_info.cc index c627a693d2..61b69cc125 100644 --- a/met/src/libcode/vx_tc_util/prob_rirw_pair_info.cc +++ b/met/src/libcode/vx_tc_util/prob_rirw_pair_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/prob_rirw_pair_info.h b/met/src/libcode/vx_tc_util/prob_rirw_pair_info.h index 9c3420d0cf..d3465e2743 100644 --- a/met/src/libcode/vx_tc_util/prob_rirw_pair_info.h +++ b/met/src/libcode/vx_tc_util/prob_rirw_pair_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/tc_columns.cc b/met/src/libcode/vx_tc_util/tc_columns.cc index 422823e754..b4b383268d 100644 --- a/met/src/libcode/vx_tc_util/tc_columns.cc +++ b/met/src/libcode/vx_tc_util/tc_columns.cc @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////// // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/tc_columns.h b/met/src/libcode/vx_tc_util/tc_columns.h index d7d88cfe30..fe091fc296 100644 --- a/met/src/libcode/vx_tc_util/tc_columns.h +++ b/met/src/libcode/vx_tc_util/tc_columns.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/tc_hdr_columns.cc b/met/src/libcode/vx_tc_util/tc_hdr_columns.cc index b450a87d2a..c001395d77 100644 --- a/met/src/libcode/vx_tc_util/tc_hdr_columns.cc +++ b/met/src/libcode/vx_tc_util/tc_hdr_columns.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/tc_hdr_columns.h b/met/src/libcode/vx_tc_util/tc_hdr_columns.h index 002f0b7fc5..1d8408cb07 100644 --- a/met/src/libcode/vx_tc_util/tc_hdr_columns.h +++ b/met/src/libcode/vx_tc_util/tc_hdr_columns.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/tc_stat_line.cc b/met/src/libcode/vx_tc_util/tc_stat_line.cc index 9cd7d09344..f57d4c01ad 100644 --- a/met/src/libcode/vx_tc_util/tc_stat_line.cc +++ b/met/src/libcode/vx_tc_util/tc_stat_line.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/tc_stat_line.h b/met/src/libcode/vx_tc_util/tc_stat_line.h index 952b6cc904..26fd11eff2 100644 --- a/met/src/libcode/vx_tc_util/tc_stat_line.h +++ b/met/src/libcode/vx_tc_util/tc_stat_line.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/track_info.cc b/met/src/libcode/vx_tc_util/track_info.cc index 215f0c3b38..be717f65c7 100644 --- a/met/src/libcode/vx_tc_util/track_info.cc +++ b/met/src/libcode/vx_tc_util/track_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/track_info.h b/met/src/libcode/vx_tc_util/track_info.h index bd92f52f4b..75e7390f69 100644 --- a/met/src/libcode/vx_tc_util/track_info.h +++ b/met/src/libcode/vx_tc_util/track_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/track_pair_info.cc b/met/src/libcode/vx_tc_util/track_pair_info.cc index ec202d7a3a..b82d0a5f0d 100644 --- a/met/src/libcode/vx_tc_util/track_pair_info.cc +++ b/met/src/libcode/vx_tc_util/track_pair_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/track_pair_info.h b/met/src/libcode/vx_tc_util/track_pair_info.h index 0ee9cce003..c2cc548b93 100644 --- a/met/src/libcode/vx_tc_util/track_pair_info.h +++ b/met/src/libcode/vx_tc_util/track_pair_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/track_point.cc b/met/src/libcode/vx_tc_util/track_point.cc index 139b4fa68f..17946957f0 100644 --- a/met/src/libcode/vx_tc_util/track_point.cc +++ b/met/src/libcode/vx_tc_util/track_point.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/track_point.h b/met/src/libcode/vx_tc_util/track_point.h index 73cca157e8..147c13cfd9 100644 --- a/met/src/libcode/vx_tc_util/track_point.h +++ b/met/src/libcode/vx_tc_util/track_point.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/vx_tc_nc_util.cc b/met/src/libcode/vx_tc_util/vx_tc_nc_util.cc index 997c0ba835..7bd51ffbbe 100644 --- a/met/src/libcode/vx_tc_util/vx_tc_nc_util.cc +++ b/met/src/libcode/vx_tc_util/vx_tc_nc_util.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/vx_tc_nc_util.h b/met/src/libcode/vx_tc_util/vx_tc_nc_util.h index 9e520180e4..9f9ad259d9 100644 --- a/met/src/libcode/vx_tc_util/vx_tc_nc_util.h +++ b/met/src/libcode/vx_tc_util/vx_tc_nc_util.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_tc_util/vx_tc_util.h b/met/src/libcode/vx_tc_util/vx_tc_util.h index 2b3d74d0c9..76e5448429 100644 --- a/met/src/libcode/vx_tc_util/vx_tc_util.h +++ b/met/src/libcode/vx_tc_util/vx_tc_util.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_time_series/compute_swinging_door.cc b/met/src/libcode/vx_time_series/compute_swinging_door.cc index de98846d28..20330ae837 100644 --- a/met/src/libcode/vx_time_series/compute_swinging_door.cc +++ b/met/src/libcode/vx_time_series/compute_swinging_door.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_time_series/compute_swinging_door.h b/met/src/libcode/vx_time_series/compute_swinging_door.h index b6caa08ba1..9b48fec68e 100644 --- a/met/src/libcode/vx_time_series/compute_swinging_door.h +++ b/met/src/libcode/vx_time_series/compute_swinging_door.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_time_series/time_series_util.cc b/met/src/libcode/vx_time_series/time_series_util.cc index e08f898370..9206598cea 100644 --- a/met/src/libcode/vx_time_series/time_series_util.cc +++ b/met/src/libcode/vx_time_series/time_series_util.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_time_series/time_series_util.h b/met/src/libcode/vx_time_series/time_series_util.h index dc6822b2ff..41a681b058 100644 --- a/met/src/libcode/vx_time_series/time_series_util.h +++ b/met/src/libcode/vx_time_series/time_series_util.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/libcode/vx_time_series/vx_time_series.h b/met/src/libcode/vx_time_series/vx_time_series.h index c1e4877472..e440328ced 100644 --- a/met/src/libcode/vx_time_series/vx_time_series.h +++ b/met/src/libcode/vx_time_series/vx_time_series.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/ensemble_stat/ensemble_stat.cc b/met/src/tools/core/ensemble_stat/ensemble_stat.cc index bcb202970e..b3e736fdae 100644 --- a/met/src/tools/core/ensemble_stat/ensemble_stat.cc +++ b/met/src/tools/core/ensemble_stat/ensemble_stat.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/ensemble_stat/ensemble_stat.h b/met/src/tools/core/ensemble_stat/ensemble_stat.h index fe94cdf728..34e66b148a 100644 --- a/met/src/tools/core/ensemble_stat/ensemble_stat.h +++ b/met/src/tools/core/ensemble_stat/ensemble_stat.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/ensemble_stat/ensemble_stat_conf_info.cc b/met/src/tools/core/ensemble_stat/ensemble_stat_conf_info.cc index e4361e041a..ff21bcd27d 100644 --- a/met/src/tools/core/ensemble_stat/ensemble_stat_conf_info.cc +++ b/met/src/tools/core/ensemble_stat/ensemble_stat_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/ensemble_stat/ensemble_stat_conf_info.h b/met/src/tools/core/ensemble_stat/ensemble_stat_conf_info.h index dfc91c712c..289ac667d6 100644 --- a/met/src/tools/core/ensemble_stat/ensemble_stat_conf_info.h +++ b/met/src/tools/core/ensemble_stat/ensemble_stat_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/grid_stat/grid_stat.cc b/met/src/tools/core/grid_stat/grid_stat.cc index cf30bd282f..310677504d 100644 --- a/met/src/tools/core/grid_stat/grid_stat.cc +++ b/met/src/tools/core/grid_stat/grid_stat.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/grid_stat/grid_stat.h b/met/src/tools/core/grid_stat/grid_stat.h index 0a05a8c104..2e872d0d36 100644 --- a/met/src/tools/core/grid_stat/grid_stat.h +++ b/met/src/tools/core/grid_stat/grid_stat.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/grid_stat/grid_stat_conf_info.cc b/met/src/tools/core/grid_stat/grid_stat_conf_info.cc index 8b2b572eca..20b1dec99e 100644 --- a/met/src/tools/core/grid_stat/grid_stat_conf_info.cc +++ b/met/src/tools/core/grid_stat/grid_stat_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/grid_stat/grid_stat_conf_info.h b/met/src/tools/core/grid_stat/grid_stat_conf_info.h index e03b657488..e006f8fa70 100644 --- a/met/src/tools/core/grid_stat/grid_stat_conf_info.h +++ b/met/src/tools/core/grid_stat/grid_stat_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/mode/cluster_page.cc b/met/src/tools/core/mode/cluster_page.cc index 261599ad9c..b295da4b6c 100644 --- a/met/src/tools/core/mode/cluster_page.cc +++ b/met/src/tools/core/mode/cluster_page.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/mode/fcst_enlarge_page.cc b/met/src/tools/core/mode/fcst_enlarge_page.cc index edea030dfa..6713cc5628 100644 --- a/met/src/tools/core/mode/fcst_enlarge_page.cc +++ b/met/src/tools/core/mode/fcst_enlarge_page.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/mode/mode.cc b/met/src/tools/core/mode/mode.cc index a4d60101f2..1c3e5f67c7 100644 --- a/met/src/tools/core/mode/mode.cc +++ b/met/src/tools/core/mode/mode.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/mode/mode_exec.cc b/met/src/tools/core/mode/mode_exec.cc index edce0762e8..d25ccde24b 100644 --- a/met/src/tools/core/mode/mode_exec.cc +++ b/met/src/tools/core/mode/mode_exec.cc @@ -1,7 +1,7 @@ /////////////////////////////////////////////////////////////////////// -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/mode/mode_exec.h b/met/src/tools/core/mode/mode_exec.h index 85739aaad4..5f93f51e2f 100644 --- a/met/src/tools/core/mode/mode_exec.h +++ b/met/src/tools/core/mode/mode_exec.h @@ -3,7 +3,7 @@ //////////////////////////////////////////////////////////////////////// -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/mode/mode_ps_file.cc b/met/src/tools/core/mode/mode_ps_file.cc index c50164edf7..c36bd746b1 100644 --- a/met/src/tools/core/mode/mode_ps_file.cc +++ b/met/src/tools/core/mode/mode_ps_file.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/mode/mode_ps_file.h b/met/src/tools/core/mode/mode_ps_file.h index f0535b728b..251cc814de 100644 --- a/met/src/tools/core/mode/mode_ps_file.h +++ b/met/src/tools/core/mode/mode_ps_file.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/mode/mode_ps_table_defs.h b/met/src/tools/core/mode/mode_ps_table_defs.h index 0c22523339..8215625e62 100644 --- a/met/src/tools/core/mode/mode_ps_table_defs.h +++ b/met/src/tools/core/mode/mode_ps_table_defs.h @@ -3,7 +3,7 @@ //////////////////////////////////////////////////////////////////////// -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/mode/obs_enlarge_page.cc b/met/src/tools/core/mode/obs_enlarge_page.cc index 92d4e991ec..dd2061d0c5 100644 --- a/met/src/tools/core/mode/obs_enlarge_page.cc +++ b/met/src/tools/core/mode/obs_enlarge_page.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/mode/overlap_page.cc b/met/src/tools/core/mode/overlap_page.cc index b51a52e9f1..1222788c47 100644 --- a/met/src/tools/core/mode/overlap_page.cc +++ b/met/src/tools/core/mode/overlap_page.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/mode/page_1.cc b/met/src/tools/core/mode/page_1.cc index f08967acfd..02cbfebaa2 100644 --- a/met/src/tools/core/mode/page_1.cc +++ b/met/src/tools/core/mode/page_1.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/mode/plot_engine.cc b/met/src/tools/core/mode/plot_engine.cc index f9aa7bcff2..ca78825ba5 100644 --- a/met/src/tools/core/mode/plot_engine.cc +++ b/met/src/tools/core/mode/plot_engine.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/mode_analysis/config_to_att.cc b/met/src/tools/core/mode_analysis/config_to_att.cc index ceb016121b..6df08525c8 100644 --- a/met/src/tools/core/mode_analysis/config_to_att.cc +++ b/met/src/tools/core/mode_analysis/config_to_att.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/mode_analysis/config_to_att.h b/met/src/tools/core/mode_analysis/config_to_att.h index ee477474c5..a909c647e6 100644 --- a/met/src/tools/core/mode_analysis/config_to_att.h +++ b/met/src/tools/core/mode_analysis/config_to_att.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/mode_analysis/mode_analysis.cc b/met/src/tools/core/mode_analysis/mode_analysis.cc index 3cd984dc62..1debd48121 100644 --- a/met/src/tools/core/mode_analysis/mode_analysis.cc +++ b/met/src/tools/core/mode_analysis/mode_analysis.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/pcp_combine/pcp_combine.cc b/met/src/tools/core/pcp_combine/pcp_combine.cc index 65c4f51bce..6ff36272aa 100644 --- a/met/src/tools/core/pcp_combine/pcp_combine.cc +++ b/met/src/tools/core/pcp_combine/pcp_combine.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/point_stat/point_stat.cc b/met/src/tools/core/point_stat/point_stat.cc index ba28097e6a..478cda7707 100644 --- a/met/src/tools/core/point_stat/point_stat.cc +++ b/met/src/tools/core/point_stat/point_stat.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research led(UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/point_stat/point_stat.h b/met/src/tools/core/point_stat/point_stat.h index 25a46aa249..9d34a7282a 100644 --- a/met/src/tools/core/point_stat/point_stat.h +++ b/met/src/tools/core/point_stat/point_stat.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/point_stat/point_stat_conf_info.cc b/met/src/tools/core/point_stat/point_stat_conf_info.cc index 5a039e1bae..d992c08425 100644 --- a/met/src/tools/core/point_stat/point_stat_conf_info.cc +++ b/met/src/tools/core/point_stat/point_stat_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/point_stat/point_stat_conf_info.h b/met/src/tools/core/point_stat/point_stat_conf_info.h index dd1d787dfa..addf779f0a 100644 --- a/met/src/tools/core/point_stat/point_stat_conf_info.h +++ b/met/src/tools/core/point_stat/point_stat_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/series_analysis/series_analysis.cc b/met/src/tools/core/series_analysis/series_analysis.cc index acc347aff0..3166e348c1 100644 --- a/met/src/tools/core/series_analysis/series_analysis.cc +++ b/met/src/tools/core/series_analysis/series_analysis.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/series_analysis/series_analysis.h b/met/src/tools/core/series_analysis/series_analysis.h index 3ab9ddea20..3dc9618304 100644 --- a/met/src/tools/core/series_analysis/series_analysis.h +++ b/met/src/tools/core/series_analysis/series_analysis.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/series_analysis/series_analysis_conf_info.cc b/met/src/tools/core/series_analysis/series_analysis_conf_info.cc index df14d088d5..ecd221b6ce 100644 --- a/met/src/tools/core/series_analysis/series_analysis_conf_info.cc +++ b/met/src/tools/core/series_analysis/series_analysis_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/series_analysis/series_analysis_conf_info.h b/met/src/tools/core/series_analysis/series_analysis_conf_info.h index 86714731a3..05ed960108 100644 --- a/met/src/tools/core/series_analysis/series_analysis_conf_info.h +++ b/met/src/tools/core/series_analysis/series_analysis_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/stat_analysis/aggr_stat_line.cc b/met/src/tools/core/stat_analysis/aggr_stat_line.cc index b5c7a160dd..6d7d952956 100644 --- a/met/src/tools/core/stat_analysis/aggr_stat_line.cc +++ b/met/src/tools/core/stat_analysis/aggr_stat_line.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/stat_analysis/aggr_stat_line.h b/met/src/tools/core/stat_analysis/aggr_stat_line.h index 6ffbd42091..166dde307e 100644 --- a/met/src/tools/core/stat_analysis/aggr_stat_line.h +++ b/met/src/tools/core/stat_analysis/aggr_stat_line.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/stat_analysis/parse_stat_line.cc b/met/src/tools/core/stat_analysis/parse_stat_line.cc index 14bf981ea6..6f057faf3a 100644 --- a/met/src/tools/core/stat_analysis/parse_stat_line.cc +++ b/met/src/tools/core/stat_analysis/parse_stat_line.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/stat_analysis/parse_stat_line.h b/met/src/tools/core/stat_analysis/parse_stat_line.h index 7575d7ef47..74f1ee3cd6 100644 --- a/met/src/tools/core/stat_analysis/parse_stat_line.h +++ b/met/src/tools/core/stat_analysis/parse_stat_line.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/stat_analysis/stat_analysis.cc b/met/src/tools/core/stat_analysis/stat_analysis.cc index 02365d1525..8c1df6d2d6 100644 --- a/met/src/tools/core/stat_analysis/stat_analysis.cc +++ b/met/src/tools/core/stat_analysis/stat_analysis.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/stat_analysis/stat_analysis.h b/met/src/tools/core/stat_analysis/stat_analysis.h index 3004407fa5..c07abfa476 100644 --- a/met/src/tools/core/stat_analysis/stat_analysis.h +++ b/met/src/tools/core/stat_analysis/stat_analysis.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/stat_analysis/stat_analysis_job.cc b/met/src/tools/core/stat_analysis/stat_analysis_job.cc index 58858c6117..4f585d9e6f 100644 --- a/met/src/tools/core/stat_analysis/stat_analysis_job.cc +++ b/met/src/tools/core/stat_analysis/stat_analysis_job.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/stat_analysis/stat_analysis_job.h b/met/src/tools/core/stat_analysis/stat_analysis_job.h index 74feb5a282..e03c74330d 100644 --- a/met/src/tools/core/stat_analysis/stat_analysis_job.h +++ b/met/src/tools/core/stat_analysis/stat_analysis_job.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/wavelet_stat/wavelet_stat.cc b/met/src/tools/core/wavelet_stat/wavelet_stat.cc index f371220327..e557d039a0 100644 --- a/met/src/tools/core/wavelet_stat/wavelet_stat.cc +++ b/met/src/tools/core/wavelet_stat/wavelet_stat.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/wavelet_stat/wavelet_stat.h b/met/src/tools/core/wavelet_stat/wavelet_stat.h index aa40a5a0a5..ab807cc9a7 100644 --- a/met/src/tools/core/wavelet_stat/wavelet_stat.h +++ b/met/src/tools/core/wavelet_stat/wavelet_stat.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/wavelet_stat/wavelet_stat_conf_info.cc b/met/src/tools/core/wavelet_stat/wavelet_stat_conf_info.cc index 75480e850b..087d1fbaba 100644 --- a/met/src/tools/core/wavelet_stat/wavelet_stat_conf_info.cc +++ b/met/src/tools/core/wavelet_stat/wavelet_stat_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/core/wavelet_stat/wavelet_stat_conf_info.h b/met/src/tools/core/wavelet_stat/wavelet_stat_conf_info.h index cf18c27919..8b1473572b 100644 --- a/met/src/tools/core/wavelet_stat/wavelet_stat_conf_info.h +++ b/met/src/tools/core/wavelet_stat/wavelet_stat_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/dev_utils/chk4copyright.cc b/met/src/tools/dev_utils/chk4copyright.cc index c838647688..ecae014bb8 100644 --- a/met/src/tools/dev_utils/chk4copyright.cc +++ b/met/src/tools/dev_utils/chk4copyright.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/dev_utils/gen_climo_bin.cc b/met/src/tools/dev_utils/gen_climo_bin.cc index 7eba741a94..01c49691fb 100644 --- a/met/src/tools/dev_utils/gen_climo_bin.cc +++ b/met/src/tools/dev_utils/gen_climo_bin.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/dev_utils/gribtab.dat_to_flat.cc b/met/src/tools/dev_utils/gribtab.dat_to_flat.cc index e950e051d9..47d199cdd2 100644 --- a/met/src/tools/dev_utils/gribtab.dat_to_flat.cc +++ b/met/src/tools/dev_utils/gribtab.dat_to_flat.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/dev_utils/insitu_nc_file.cc b/met/src/tools/dev_utils/insitu_nc_file.cc index 68c9db434e..753f44204c 100644 --- a/met/src/tools/dev_utils/insitu_nc_file.cc +++ b/met/src/tools/dev_utils/insitu_nc_file.cc @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/dev_utils/insitu_nc_file.h b/met/src/tools/dev_utils/insitu_nc_file.h index bac3804d04..ccb165a8ad 100644 --- a/met/src/tools/dev_utils/insitu_nc_file.h +++ b/met/src/tools/dev_utils/insitu_nc_file.h @@ -1,7 +1,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/dev_utils/insitu_nc_to_ascii.cc b/met/src/tools/dev_utils/insitu_nc_to_ascii.cc index c72874c6a7..04efec517e 100644 --- a/met/src/tools/dev_utils/insitu_nc_to_ascii.cc +++ b/met/src/tools/dev_utils/insitu_nc_to_ascii.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2018 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/dev_utils/met_nc_file.cc b/met/src/tools/dev_utils/met_nc_file.cc index 5336cebd9a..664ee7fea4 100644 --- a/met/src/tools/dev_utils/met_nc_file.cc +++ b/met/src/tools/dev_utils/met_nc_file.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/dev_utils/met_nc_file.h b/met/src/tools/dev_utils/met_nc_file.h index b655d568ff..03bac0723c 100644 --- a/met/src/tools/dev_utils/met_nc_file.h +++ b/met/src/tools/dev_utils/met_nc_file.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/dev_utils/nceptab_to_flat.cc b/met/src/tools/dev_utils/nceptab_to_flat.cc index 3660546756..3916da530a 100644 --- a/met/src/tools/dev_utils/nceptab_to_flat.cc +++ b/met/src/tools/dev_utils/nceptab_to_flat.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/dev_utils/pbtime.cc b/met/src/tools/dev_utils/pbtime.cc index e2814050a0..5cda897428 100644 --- a/met/src/tools/dev_utils/pbtime.cc +++ b/met/src/tools/dev_utils/pbtime.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/dev_utils/reformat_county_data.cc b/met/src/tools/dev_utils/reformat_county_data.cc index fbb2fead12..edb9650e88 100644 --- a/met/src/tools/dev_utils/reformat_county_data.cc +++ b/met/src/tools/dev_utils/reformat_county_data.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/dev_utils/reformat_map_data.cc b/met/src/tools/dev_utils/reformat_map_data.cc index ae60536e86..5304a521c3 100644 --- a/met/src/tools/dev_utils/reformat_map_data.cc +++ b/met/src/tools/dev_utils/reformat_map_data.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/dev_utils/shapefiles/make_mapfiles.cc b/met/src/tools/dev_utils/shapefiles/make_mapfiles.cc index bd360cd4d2..5dbccfccd3 100644 --- a/met/src/tools/dev_utils/shapefiles/make_mapfiles.cc +++ b/met/src/tools/dev_utils/shapefiles/make_mapfiles.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/dev_utils/swinging_door.cc b/met/src/tools/dev_utils/swinging_door.cc index 8ad266981b..49181206d9 100644 --- a/met/src/tools/dev_utils/swinging_door.cc +++ b/met/src/tools/dev_utils/swinging_door.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ascii2nc/aeronet_handler.cc b/met/src/tools/other/ascii2nc/aeronet_handler.cc index 3cf3a29a2d..1a1fe249a1 100644 --- a/met/src/tools/other/ascii2nc/aeronet_handler.cc +++ b/met/src/tools/other/ascii2nc/aeronet_handler.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ascii2nc/aeronet_handler.h b/met/src/tools/other/ascii2nc/aeronet_handler.h index 6d015a5dc1..a2c30e3a91 100644 --- a/met/src/tools/other/ascii2nc/aeronet_handler.h +++ b/met/src/tools/other/ascii2nc/aeronet_handler.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ascii2nc/ascii2nc.cc b/met/src/tools/other/ascii2nc/ascii2nc.cc index 6df5e2ba97..a8f74f9daf 100644 --- a/met/src/tools/other/ascii2nc/ascii2nc.cc +++ b/met/src/tools/other/ascii2nc/ascii2nc.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ascii2nc/ascii2nc_conf_info.cc b/met/src/tools/other/ascii2nc/ascii2nc_conf_info.cc index a09969629f..5f856ecdfb 100644 --- a/met/src/tools/other/ascii2nc/ascii2nc_conf_info.cc +++ b/met/src/tools/other/ascii2nc/ascii2nc_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ascii2nc/ascii2nc_conf_info.h b/met/src/tools/other/ascii2nc/ascii2nc_conf_info.h index 45d1909950..d228aee919 100644 --- a/met/src/tools/other/ascii2nc/ascii2nc_conf_info.h +++ b/met/src/tools/other/ascii2nc/ascii2nc_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ascii2nc/file_handler.cc b/met/src/tools/other/ascii2nc/file_handler.cc index 28ef53e8cc..f5b57aec74 100644 --- a/met/src/tools/other/ascii2nc/file_handler.cc +++ b/met/src/tools/other/ascii2nc/file_handler.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ascii2nc/file_handler.h b/met/src/tools/other/ascii2nc/file_handler.h index 1a9514433b..5a160e3068 100644 --- a/met/src/tools/other/ascii2nc/file_handler.h +++ b/met/src/tools/other/ascii2nc/file_handler.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ascii2nc/little_r_handler.cc b/met/src/tools/other/ascii2nc/little_r_handler.cc index a604a96355..b99d3c7f32 100644 --- a/met/src/tools/other/ascii2nc/little_r_handler.cc +++ b/met/src/tools/other/ascii2nc/little_r_handler.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ascii2nc/little_r_handler.h b/met/src/tools/other/ascii2nc/little_r_handler.h index 39f35e8383..6774bf718f 100644 --- a/met/src/tools/other/ascii2nc/little_r_handler.h +++ b/met/src/tools/other/ascii2nc/little_r_handler.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ascii2nc/met_handler.cc b/met/src/tools/other/ascii2nc/met_handler.cc index 081db7906a..22fc024fdd 100644 --- a/met/src/tools/other/ascii2nc/met_handler.cc +++ b/met/src/tools/other/ascii2nc/met_handler.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ascii2nc/met_handler.h b/met/src/tools/other/ascii2nc/met_handler.h index 9e01f64a12..4dbc117ce9 100644 --- a/met/src/tools/other/ascii2nc/met_handler.h +++ b/met/src/tools/other/ascii2nc/met_handler.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ascii2nc/python_handler.cc b/met/src/tools/other/ascii2nc/python_handler.cc index 2f3a0927c9..92b1a73e05 100644 --- a/met/src/tools/other/ascii2nc/python_handler.cc +++ b/met/src/tools/other/ascii2nc/python_handler.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ascii2nc/python_handler.h b/met/src/tools/other/ascii2nc/python_handler.h index 695b8fcb96..a3b4cfb696 100644 --- a/met/src/tools/other/ascii2nc/python_handler.h +++ b/met/src/tools/other/ascii2nc/python_handler.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ascii2nc/surfrad_handler.cc b/met/src/tools/other/ascii2nc/surfrad_handler.cc index e6849dc962..c55cb11092 100644 --- a/met/src/tools/other/ascii2nc/surfrad_handler.cc +++ b/met/src/tools/other/ascii2nc/surfrad_handler.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ascii2nc/surfrad_handler.h b/met/src/tools/other/ascii2nc/surfrad_handler.h index 8b74858869..d3680aef57 100644 --- a/met/src/tools/other/ascii2nc/surfrad_handler.h +++ b/met/src/tools/other/ascii2nc/surfrad_handler.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ascii2nc/wwsis_handler.cc b/met/src/tools/other/ascii2nc/wwsis_handler.cc index a96d5ec547..461896e4bb 100644 --- a/met/src/tools/other/ascii2nc/wwsis_handler.cc +++ b/met/src/tools/other/ascii2nc/wwsis_handler.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ascii2nc/wwsis_handler.h b/met/src/tools/other/ascii2nc/wwsis_handler.h index 85605404ae..f960f31408 100644 --- a/met/src/tools/other/ascii2nc/wwsis_handler.h +++ b/met/src/tools/other/ascii2nc/wwsis_handler.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gen_vx_mask/gen_vx_mask.cc b/met/src/tools/other/gen_vx_mask/gen_vx_mask.cc index bee09aff7c..85bb95d2af 100644 --- a/met/src/tools/other/gen_vx_mask/gen_vx_mask.cc +++ b/met/src/tools/other/gen_vx_mask/gen_vx_mask.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gen_vx_mask/gen_vx_mask.h b/met/src/tools/other/gen_vx_mask/gen_vx_mask.h index e3c4b629ce..d51194e5da 100644 --- a/met/src/tools/other/gen_vx_mask/gen_vx_mask.h +++ b/met/src/tools/other/gen_vx_mask/gen_vx_mask.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gen_vx_mask/grid_closed_poly.cc b/met/src/tools/other/gen_vx_mask/grid_closed_poly.cc index daf74b481c..a39c63457a 100644 --- a/met/src/tools/other/gen_vx_mask/grid_closed_poly.cc +++ b/met/src/tools/other/gen_vx_mask/grid_closed_poly.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gen_vx_mask/grid_closed_poly.h b/met/src/tools/other/gen_vx_mask/grid_closed_poly.h index c99af54033..0d1780a3e8 100644 --- a/met/src/tools/other/gen_vx_mask/grid_closed_poly.h +++ b/met/src/tools/other/gen_vx_mask/grid_closed_poly.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gis_utils/gis_dump_dbf.cc b/met/src/tools/other/gis_utils/gis_dump_dbf.cc index a14d2dc770..785db46fd5 100644 --- a/met/src/tools/other/gis_utils/gis_dump_dbf.cc +++ b/met/src/tools/other/gis_utils/gis_dump_dbf.cc @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gis_utils/gis_dump_shp.cc b/met/src/tools/other/gis_utils/gis_dump_shp.cc index 2a2fe8f8b5..a9ecb7c350 100644 --- a/met/src/tools/other/gis_utils/gis_dump_shp.cc +++ b/met/src/tools/other/gis_utils/gis_dump_shp.cc @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gis_utils/gis_dump_shx.cc b/met/src/tools/other/gis_utils/gis_dump_shx.cc index 015ec7e8db..ba9869d541 100644 --- a/met/src/tools/other/gis_utils/gis_dump_shx.cc +++ b/met/src/tools/other/gis_utils/gis_dump_shx.cc @@ -4,7 +4,7 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/grid_diag/grid_diag.cc b/met/src/tools/other/grid_diag/grid_diag.cc index 6199ba408f..c72a81aba3 100644 --- a/met/src/tools/other/grid_diag/grid_diag.cc +++ b/met/src/tools/other/grid_diag/grid_diag.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/grid_diag/grid_diag.h b/met/src/tools/other/grid_diag/grid_diag.h index 2204fbc04f..419d6b8f50 100644 --- a/met/src/tools/other/grid_diag/grid_diag.h +++ b/met/src/tools/other/grid_diag/grid_diag.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/grid_diag/grid_diag_conf_info.cc b/met/src/tools/other/grid_diag/grid_diag_conf_info.cc index 5ae8b4bd62..14b6edaa29 100644 --- a/met/src/tools/other/grid_diag/grid_diag_conf_info.cc +++ b/met/src/tools/other/grid_diag/grid_diag_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/grid_diag/grid_diag_conf_info.h b/met/src/tools/other/grid_diag/grid_diag_conf_info.h index 1a273115cf..7127aa2927 100644 --- a/met/src/tools/other/grid_diag/grid_diag_conf_info.h +++ b/met/src/tools/other/grid_diag/grid_diag_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gsi_tools/conv_offsets.h b/met/src/tools/other/gsi_tools/conv_offsets.h index cdbf853930..d64f4169bf 100644 --- a/met/src/tools/other/gsi_tools/conv_offsets.h +++ b/met/src/tools/other/gsi_tools/conv_offsets.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gsi_tools/conv_record.cc b/met/src/tools/other/gsi_tools/conv_record.cc index 1777c1d6d9..1bf283f83e 100644 --- a/met/src/tools/other/gsi_tools/conv_record.cc +++ b/met/src/tools/other/gsi_tools/conv_record.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gsi_tools/conv_record.h b/met/src/tools/other/gsi_tools/conv_record.h index fb52969d69..229c55424e 100644 --- a/met/src/tools/other/gsi_tools/conv_record.h +++ b/met/src/tools/other/gsi_tools/conv_record.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gsi_tools/ftto.h b/met/src/tools/other/gsi_tools/ftto.h index 8880fa36d4..a3c316f5e5 100644 --- a/met/src/tools/other/gsi_tools/ftto.h +++ b/met/src/tools/other/gsi_tools/ftto.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gsi_tools/gsi_record.cc b/met/src/tools/other/gsi_tools/gsi_record.cc index a147ebba88..23739a1ea9 100644 --- a/met/src/tools/other/gsi_tools/gsi_record.cc +++ b/met/src/tools/other/gsi_tools/gsi_record.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gsi_tools/gsi_record.h b/met/src/tools/other/gsi_tools/gsi_record.h index 69b870abf7..048415f4ff 100644 --- a/met/src/tools/other/gsi_tools/gsi_record.h +++ b/met/src/tools/other/gsi_tools/gsi_record.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gsi_tools/gsi_util.cc b/met/src/tools/other/gsi_tools/gsi_util.cc index 5dc275c598..acee7eff0a 100644 --- a/met/src/tools/other/gsi_tools/gsi_util.cc +++ b/met/src/tools/other/gsi_tools/gsi_util.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gsi_tools/gsi_util.h b/met/src/tools/other/gsi_tools/gsi_util.h index 8ec21493d8..adb8b3e28a 100644 --- a/met/src/tools/other/gsi_tools/gsi_util.h +++ b/met/src/tools/other/gsi_tools/gsi_util.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gsi_tools/gsid2mpr.cc b/met/src/tools/other/gsi_tools/gsid2mpr.cc index b58aee704c..306099ad75 100644 --- a/met/src/tools/other/gsi_tools/gsid2mpr.cc +++ b/met/src/tools/other/gsi_tools/gsid2mpr.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gsi_tools/gsid2mpr.h b/met/src/tools/other/gsi_tools/gsid2mpr.h index 7982fe2f6a..4b6eb07313 100644 --- a/met/src/tools/other/gsi_tools/gsid2mpr.h +++ b/met/src/tools/other/gsi_tools/gsid2mpr.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gsi_tools/gsidens2orank.cc b/met/src/tools/other/gsi_tools/gsidens2orank.cc index 25a7926cd1..bbfe926e81 100644 --- a/met/src/tools/other/gsi_tools/gsidens2orank.cc +++ b/met/src/tools/other/gsi_tools/gsidens2orank.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gsi_tools/gsidens2orank.h b/met/src/tools/other/gsi_tools/gsidens2orank.h index d17f55658b..15b403684e 100644 --- a/met/src/tools/other/gsi_tools/gsidens2orank.h +++ b/met/src/tools/other/gsi_tools/gsidens2orank.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gsi_tools/rad_config.cc b/met/src/tools/other/gsi_tools/rad_config.cc index ec37e71242..955891d595 100644 --- a/met/src/tools/other/gsi_tools/rad_config.cc +++ b/met/src/tools/other/gsi_tools/rad_config.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gsi_tools/rad_config.h b/met/src/tools/other/gsi_tools/rad_config.h index cdfa2e9f40..c85d3fccaf 100644 --- a/met/src/tools/other/gsi_tools/rad_config.h +++ b/met/src/tools/other/gsi_tools/rad_config.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gsi_tools/rad_offsets.h b/met/src/tools/other/gsi_tools/rad_offsets.h index 71981dd4d7..b9c5098d7d 100644 --- a/met/src/tools/other/gsi_tools/rad_offsets.h +++ b/met/src/tools/other/gsi_tools/rad_offsets.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gsi_tools/rad_record.cc b/met/src/tools/other/gsi_tools/rad_record.cc index 9d37022ae3..d250bcba27 100644 --- a/met/src/tools/other/gsi_tools/rad_record.cc +++ b/met/src/tools/other/gsi_tools/rad_record.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/gsi_tools/rad_record.h b/met/src/tools/other/gsi_tools/rad_record.h index 5d300f5141..596bb7f49f 100644 --- a/met/src/tools/other/gsi_tools/rad_record.h +++ b/met/src/tools/other/gsi_tools/rad_record.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ioda2nc/ioda2nc.cc b/met/src/tools/other/ioda2nc/ioda2nc.cc index 9069459123..a9a08722b6 100644 --- a/met/src/tools/other/ioda2nc/ioda2nc.cc +++ b/met/src/tools/other/ioda2nc/ioda2nc.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ioda2nc/ioda2nc_conf_info.cc b/met/src/tools/other/ioda2nc/ioda2nc_conf_info.cc index 0b849be48f..ca5c9c0e92 100644 --- a/met/src/tools/other/ioda2nc/ioda2nc_conf_info.cc +++ b/met/src/tools/other/ioda2nc/ioda2nc_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/ioda2nc/ioda2nc_conf_info.h b/met/src/tools/other/ioda2nc/ioda2nc_conf_info.h index 8751ca6df7..217c7a8b61 100644 --- a/met/src/tools/other/ioda2nc/ioda2nc_conf_info.h +++ b/met/src/tools/other/ioda2nc/ioda2nc_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/lidar2nc/calipso_5km.cc b/met/src/tools/other/lidar2nc/calipso_5km.cc index 5b7956619c..185dc58797 100644 --- a/met/src/tools/other/lidar2nc/calipso_5km.cc +++ b/met/src/tools/other/lidar2nc/calipso_5km.cc @@ -1,6 +1,6 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/lidar2nc/calipso_5km.h b/met/src/tools/other/lidar2nc/calipso_5km.h index 6e3b59edd6..eaa1dd6863 100644 --- a/met/src/tools/other/lidar2nc/calipso_5km.h +++ b/met/src/tools/other/lidar2nc/calipso_5km.h @@ -1,6 +1,6 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/lidar2nc/hdf_utils.cc b/met/src/tools/other/lidar2nc/hdf_utils.cc index 91c2753056..d7cd7d5740 100644 --- a/met/src/tools/other/lidar2nc/hdf_utils.cc +++ b/met/src/tools/other/lidar2nc/hdf_utils.cc @@ -1,6 +1,6 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/lidar2nc/hdf_utils.h b/met/src/tools/other/lidar2nc/hdf_utils.h index 670d6c7b8a..7dba934a4e 100644 --- a/met/src/tools/other/lidar2nc/hdf_utils.h +++ b/met/src/tools/other/lidar2nc/hdf_utils.h @@ -1,6 +1,6 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/lidar2nc/lidar2nc.cc b/met/src/tools/other/lidar2nc/lidar2nc.cc index b8bca05f9c..627c1f70c6 100644 --- a/met/src/tools/other/lidar2nc/lidar2nc.cc +++ b/met/src/tools/other/lidar2nc/lidar2nc.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/madis2nc/madis2nc.cc b/met/src/tools/other/madis2nc/madis2nc.cc index 621c841215..ded94c4f33 100644 --- a/met/src/tools/other/madis2nc/madis2nc.cc +++ b/met/src/tools/other/madis2nc/madis2nc.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/madis2nc/madis2nc.h b/met/src/tools/other/madis2nc/madis2nc.h index 6860d1079b..142698193e 100644 --- a/met/src/tools/other/madis2nc/madis2nc.h +++ b/met/src/tools/other/madis2nc/madis2nc.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/madis2nc/madis2nc_conf_info.cc b/met/src/tools/other/madis2nc/madis2nc_conf_info.cc index b11ff0a436..cf6c2af280 100644 --- a/met/src/tools/other/madis2nc/madis2nc_conf_info.cc +++ b/met/src/tools/other/madis2nc/madis2nc_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/madis2nc/madis2nc_conf_info.h b/met/src/tools/other/madis2nc/madis2nc_conf_info.h index d7e6f56f7a..3fd72e1933 100644 --- a/met/src/tools/other/madis2nc/madis2nc_conf_info.h +++ b/met/src/tools/other/madis2nc/madis2nc_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_graphics/cgraph.h b/met/src/tools/other/mode_graphics/cgraph.h index 9a092448a1..0d1ba11d63 100644 --- a/met/src/tools/other/mode_graphics/cgraph.h +++ b/met/src/tools/other/mode_graphics/cgraph.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_graphics/cgraph_font.cc b/met/src/tools/other/mode_graphics/cgraph_font.cc index a96cf4cab3..83d7b62a41 100644 --- a/met/src/tools/other/mode_graphics/cgraph_font.cc +++ b/met/src/tools/other/mode_graphics/cgraph_font.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_graphics/cgraph_font.h b/met/src/tools/other/mode_graphics/cgraph_font.h index ec636fb65a..66184a66b7 100644 --- a/met/src/tools/other/mode_graphics/cgraph_font.h +++ b/met/src/tools/other/mode_graphics/cgraph_font.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_graphics/cgraph_main.cc b/met/src/tools/other/mode_graphics/cgraph_main.cc index 67535e2270..6ed1092825 100644 --- a/met/src/tools/other/mode_graphics/cgraph_main.cc +++ b/met/src/tools/other/mode_graphics/cgraph_main.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_graphics/cgraph_main.h b/met/src/tools/other/mode_graphics/cgraph_main.h index 9758279d93..d570e5e6cc 100644 --- a/met/src/tools/other/mode_graphics/cgraph_main.h +++ b/met/src/tools/other/mode_graphics/cgraph_main.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_graphics/color_stack.cc b/met/src/tools/other/mode_graphics/color_stack.cc index 66873be59e..0df39516f9 100644 --- a/met/src/tools/other/mode_graphics/color_stack.cc +++ b/met/src/tools/other/mode_graphics/color_stack.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_graphics/color_stack.h b/met/src/tools/other/mode_graphics/color_stack.h index 4841d1e04c..6193027dd1 100644 --- a/met/src/tools/other/mode_graphics/color_stack.h +++ b/met/src/tools/other/mode_graphics/color_stack.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_graphics/gs_ps_map.h b/met/src/tools/other/mode_graphics/gs_ps_map.h index fe412f6350..83b383e911 100644 --- a/met/src/tools/other/mode_graphics/gs_ps_map.h +++ b/met/src/tools/other/mode_graphics/gs_ps_map.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_graphics/mode_nc_output_file.cc b/met/src/tools/other/mode_graphics/mode_nc_output_file.cc index fea96bc3b7..708ece18cf 100644 --- a/met/src/tools/other/mode_graphics/mode_nc_output_file.cc +++ b/met/src/tools/other/mode_graphics/mode_nc_output_file.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_graphics/mode_nc_output_file.h b/met/src/tools/other/mode_graphics/mode_nc_output_file.h index f4e7d11c89..3be5937c9e 100644 --- a/met/src/tools/other/mode_graphics/mode_nc_output_file.h +++ b/met/src/tools/other/mode_graphics/mode_nc_output_file.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_graphics/plot_mode_field.cc b/met/src/tools/other/mode_graphics/plot_mode_field.cc index b2bad56907..51516be279 100644 --- a/met/src/tools/other/mode_graphics/plot_mode_field.cc +++ b/met/src/tools/other/mode_graphics/plot_mode_field.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_graphics/sincosd.h b/met/src/tools/other/mode_graphics/sincosd.h index e8eee5b7bb..d61be2fa1c 100644 --- a/met/src/tools/other/mode_graphics/sincosd.h +++ b/met/src/tools/other/mode_graphics/sincosd.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/2d_att.cc b/met/src/tools/other/mode_time_domain/2d_att.cc index aeb1222952..1df67272cc 100644 --- a/met/src/tools/other/mode_time_domain/2d_att.cc +++ b/met/src/tools/other/mode_time_domain/2d_att.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/2d_att.h b/met/src/tools/other/mode_time_domain/2d_att.h index dffbadf004..0e6f66b059 100644 --- a/met/src/tools/other/mode_time_domain/2d_att.h +++ b/met/src/tools/other/mode_time_domain/2d_att.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/2d_att_array.cc b/met/src/tools/other/mode_time_domain/2d_att_array.cc index 759727e7c6..6b1502145e 100644 --- a/met/src/tools/other/mode_time_domain/2d_att_array.cc +++ b/met/src/tools/other/mode_time_domain/2d_att_array.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/2d_att_array.h b/met/src/tools/other/mode_time_domain/2d_att_array.h index 40fe4b51b5..3c7154383a 100644 --- a/met/src/tools/other/mode_time_domain/2d_att_array.h +++ b/met/src/tools/other/mode_time_domain/2d_att_array.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/2d_columns.h b/met/src/tools/other/mode_time_domain/2d_columns.h index 55ba828e97..8d34ef589e 100644 --- a/met/src/tools/other/mode_time_domain/2d_columns.h +++ b/met/src/tools/other/mode_time_domain/2d_columns.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/2d_moments.cc b/met/src/tools/other/mode_time_domain/2d_moments.cc index 6cf491d6ba..b2d521e75e 100644 --- a/met/src/tools/other/mode_time_domain/2d_moments.cc +++ b/met/src/tools/other/mode_time_domain/2d_moments.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/2d_moments.h b/met/src/tools/other/mode_time_domain/2d_moments.h index 0b65bf3d6e..e5de613c1f 100644 --- a/met/src/tools/other/mode_time_domain/2d_moments.h +++ b/met/src/tools/other/mode_time_domain/2d_moments.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/3d_att.cc b/met/src/tools/other/mode_time_domain/3d_att.cc index fab1364c19..0fc640ff05 100644 --- a/met/src/tools/other/mode_time_domain/3d_att.cc +++ b/met/src/tools/other/mode_time_domain/3d_att.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/3d_att.h b/met/src/tools/other/mode_time_domain/3d_att.h index a149952bd6..20e1c9a41f 100644 --- a/met/src/tools/other/mode_time_domain/3d_att.h +++ b/met/src/tools/other/mode_time_domain/3d_att.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/3d_att_pair_array.cc b/met/src/tools/other/mode_time_domain/3d_att_pair_array.cc index 1f244560a6..17e281d75d 100644 --- a/met/src/tools/other/mode_time_domain/3d_att_pair_array.cc +++ b/met/src/tools/other/mode_time_domain/3d_att_pair_array.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/3d_att_pair_array.h b/met/src/tools/other/mode_time_domain/3d_att_pair_array.h index e7853ad8a1..8aaadaf128 100644 --- a/met/src/tools/other/mode_time_domain/3d_att_pair_array.h +++ b/met/src/tools/other/mode_time_domain/3d_att_pair_array.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/3d_att_single_array.cc b/met/src/tools/other/mode_time_domain/3d_att_single_array.cc index b47ca8f8f1..71e34b5b4f 100644 --- a/met/src/tools/other/mode_time_domain/3d_att_single_array.cc +++ b/met/src/tools/other/mode_time_domain/3d_att_single_array.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/3d_att_single_array.h b/met/src/tools/other/mode_time_domain/3d_att_single_array.h index 7fa3bccdb1..7a95cbbee8 100644 --- a/met/src/tools/other/mode_time_domain/3d_att_single_array.h +++ b/met/src/tools/other/mode_time_domain/3d_att_single_array.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/3d_conv.cc b/met/src/tools/other/mode_time_domain/3d_conv.cc index cad22733bd..44ea6788e7 100644 --- a/met/src/tools/other/mode_time_domain/3d_conv.cc +++ b/met/src/tools/other/mode_time_domain/3d_conv.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/3d_moments.cc b/met/src/tools/other/mode_time_domain/3d_moments.cc index a0053c65c6..854e3c82dd 100644 --- a/met/src/tools/other/mode_time_domain/3d_moments.cc +++ b/met/src/tools/other/mode_time_domain/3d_moments.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/3d_moments.h b/met/src/tools/other/mode_time_domain/3d_moments.h index 38acc409b5..424249877b 100644 --- a/met/src/tools/other/mode_time_domain/3d_moments.h +++ b/met/src/tools/other/mode_time_domain/3d_moments.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/3d_pair_columns.h b/met/src/tools/other/mode_time_domain/3d_pair_columns.h index 96af542227..bd746ef8f3 100644 --- a/met/src/tools/other/mode_time_domain/3d_pair_columns.h +++ b/met/src/tools/other/mode_time_domain/3d_pair_columns.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/3d_single_columns.h b/met/src/tools/other/mode_time_domain/3d_single_columns.h index 841ffe5a95..0fbefaccbc 100644 --- a/met/src/tools/other/mode_time_domain/3d_single_columns.h +++ b/met/src/tools/other/mode_time_domain/3d_single_columns.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/3d_txt_header.h b/met/src/tools/other/mode_time_domain/3d_txt_header.h index 8dbd9b0a0a..fc7cf7ec70 100644 --- a/met/src/tools/other/mode_time_domain/3d_txt_header.h +++ b/met/src/tools/other/mode_time_domain/3d_txt_header.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/fo_graph.cc b/met/src/tools/other/mode_time_domain/fo_graph.cc index d483e4d5f9..9c22800a4f 100644 --- a/met/src/tools/other/mode_time_domain/fo_graph.cc +++ b/met/src/tools/other/mode_time_domain/fo_graph.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/fo_graph.h b/met/src/tools/other/mode_time_domain/fo_graph.h index 4c1191741a..fa1d5247e4 100644 --- a/met/src/tools/other/mode_time_domain/fo_graph.h +++ b/met/src/tools/other/mode_time_domain/fo_graph.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/fo_node.cc b/met/src/tools/other/mode_time_domain/fo_node.cc index 8f03f24f42..7e0891034d 100644 --- a/met/src/tools/other/mode_time_domain/fo_node.cc +++ b/met/src/tools/other/mode_time_domain/fo_node.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/fo_node.h b/met/src/tools/other/mode_time_domain/fo_node.h index 36233db527..58d01ca9c8 100644 --- a/met/src/tools/other/mode_time_domain/fo_node.h +++ b/met/src/tools/other/mode_time_domain/fo_node.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/fo_node_array.cc b/met/src/tools/other/mode_time_domain/fo_node_array.cc index 8e83173f35..5f72d8f456 100644 --- a/met/src/tools/other/mode_time_domain/fo_node_array.cc +++ b/met/src/tools/other/mode_time_domain/fo_node_array.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/fo_node_array.h b/met/src/tools/other/mode_time_domain/fo_node_array.h index 1c04e486ff..7b6b7dae5b 100644 --- a/met/src/tools/other/mode_time_domain/fo_node_array.h +++ b/met/src/tools/other/mode_time_domain/fo_node_array.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/interest_calc.cc b/met/src/tools/other/mode_time_domain/interest_calc.cc index 874635c400..40e6ce9ada 100644 --- a/met/src/tools/other/mode_time_domain/interest_calc.cc +++ b/met/src/tools/other/mode_time_domain/interest_calc.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/interest_calc.h b/met/src/tools/other/mode_time_domain/interest_calc.h index 9a14a71046..c520a5b0be 100644 --- a/met/src/tools/other/mode_time_domain/interest_calc.h +++ b/met/src/tools/other/mode_time_domain/interest_calc.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mm_engine.cc b/met/src/tools/other/mode_time_domain/mm_engine.cc index 89c5c6d3e0..6daf8b7e96 100644 --- a/met/src/tools/other/mode_time_domain/mm_engine.cc +++ b/met/src/tools/other/mode_time_domain/mm_engine.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mm_engine.h b/met/src/tools/other/mode_time_domain/mm_engine.h index 122b533fe0..e5aecef10f 100644 --- a/met/src/tools/other/mode_time_domain/mm_engine.h +++ b/met/src/tools/other/mode_time_domain/mm_engine.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd.cc b/met/src/tools/other/mode_time_domain/mtd.cc index f8628b2f3c..bcabb80f03 100644 --- a/met/src/tools/other/mode_time_domain/mtd.cc +++ b/met/src/tools/other/mode_time_domain/mtd.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd_config_info.cc b/met/src/tools/other/mode_time_domain/mtd_config_info.cc index 1b2bd261e8..8f700c0b85 100644 --- a/met/src/tools/other/mode_time_domain/mtd_config_info.cc +++ b/met/src/tools/other/mode_time_domain/mtd_config_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd_config_info.h b/met/src/tools/other/mode_time_domain/mtd_config_info.h index fa512b9b3d..93665449e4 100644 --- a/met/src/tools/other/mode_time_domain/mtd_config_info.h +++ b/met/src/tools/other/mode_time_domain/mtd_config_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd_file.h b/met/src/tools/other/mode_time_domain/mtd_file.h index 81b50ba7e4..5fc052fe1c 100644 --- a/met/src/tools/other/mode_time_domain/mtd_file.h +++ b/met/src/tools/other/mode_time_domain/mtd_file.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd_file_base.cc b/met/src/tools/other/mode_time_domain/mtd_file_base.cc index 15f822051b..7c185333f3 100644 --- a/met/src/tools/other/mode_time_domain/mtd_file_base.cc +++ b/met/src/tools/other/mode_time_domain/mtd_file_base.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd_file_base.h b/met/src/tools/other/mode_time_domain/mtd_file_base.h index e29009bbee..2d1e76d513 100644 --- a/met/src/tools/other/mode_time_domain/mtd_file_base.h +++ b/met/src/tools/other/mode_time_domain/mtd_file_base.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd_file_float.cc b/met/src/tools/other/mode_time_domain/mtd_file_float.cc index 8be27e5521..9b1cf559f8 100644 --- a/met/src/tools/other/mode_time_domain/mtd_file_float.cc +++ b/met/src/tools/other/mode_time_domain/mtd_file_float.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd_file_float.h b/met/src/tools/other/mode_time_domain/mtd_file_float.h index e965b7e628..630e69577c 100644 --- a/met/src/tools/other/mode_time_domain/mtd_file_float.h +++ b/met/src/tools/other/mode_time_domain/mtd_file_float.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd_file_int.cc b/met/src/tools/other/mode_time_domain/mtd_file_int.cc index dbc36d62c5..1d885d85bf 100644 --- a/met/src/tools/other/mode_time_domain/mtd_file_int.cc +++ b/met/src/tools/other/mode_time_domain/mtd_file_int.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd_file_int.h b/met/src/tools/other/mode_time_domain/mtd_file_int.h index 041e01aeca..52f7cfcc87 100644 --- a/met/src/tools/other/mode_time_domain/mtd_file_int.h +++ b/met/src/tools/other/mode_time_domain/mtd_file_int.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd_nc_defs.h b/met/src/tools/other/mode_time_domain/mtd_nc_defs.h index b95197a54f..df29bc5fa6 100644 --- a/met/src/tools/other/mode_time_domain/mtd_nc_defs.h +++ b/met/src/tools/other/mode_time_domain/mtd_nc_defs.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd_nc_output.cc b/met/src/tools/other/mode_time_domain/mtd_nc_output.cc index 8a5b4c5ce3..2df09ae472 100644 --- a/met/src/tools/other/mode_time_domain/mtd_nc_output.cc +++ b/met/src/tools/other/mode_time_domain/mtd_nc_output.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd_nc_output.h b/met/src/tools/other/mode_time_domain/mtd_nc_output.h index 5dbf8b8a85..ec2ed57e8e 100644 --- a/met/src/tools/other/mode_time_domain/mtd_nc_output.h +++ b/met/src/tools/other/mode_time_domain/mtd_nc_output.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd_partition.cc b/met/src/tools/other/mode_time_domain/mtd_partition.cc index c3534e0221..6de39e9182 100644 --- a/met/src/tools/other/mode_time_domain/mtd_partition.cc +++ b/met/src/tools/other/mode_time_domain/mtd_partition.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd_partition.h b/met/src/tools/other/mode_time_domain/mtd_partition.h index 1e00ad9773..926c9ee495 100644 --- a/met/src/tools/other/mode_time_domain/mtd_partition.h +++ b/met/src/tools/other/mode_time_domain/mtd_partition.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd_read_data.cc b/met/src/tools/other/mode_time_domain/mtd_read_data.cc index cf2fd2d2fa..a129082909 100644 --- a/met/src/tools/other/mode_time_domain/mtd_read_data.cc +++ b/met/src/tools/other/mode_time_domain/mtd_read_data.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd_read_data.h b/met/src/tools/other/mode_time_domain/mtd_read_data.h index 7950d87d0f..cebb9c482f 100644 --- a/met/src/tools/other/mode_time_domain/mtd_read_data.h +++ b/met/src/tools/other/mode_time_domain/mtd_read_data.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/mtd_txt_output.cc b/met/src/tools/other/mode_time_domain/mtd_txt_output.cc index c19abb2489..3b717c6b5d 100644 --- a/met/src/tools/other/mode_time_domain/mtd_txt_output.cc +++ b/met/src/tools/other/mode_time_domain/mtd_txt_output.cc @@ -1,6 +1,6 @@ // ** National Center for Atmospheric Research (NCAR) // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** Research Applications Lab (RAL) // ** P.O.Box 3000, Boulder, Colorado, 80307-3000, USA diff --git a/met/src/tools/other/mode_time_domain/mtd_txt_output.h b/met/src/tools/other/mode_time_domain/mtd_txt_output.h index 1100eeb8e6..797ac26b6e 100644 --- a/met/src/tools/other/mode_time_domain/mtd_txt_output.h +++ b/met/src/tools/other/mode_time_domain/mtd_txt_output.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/nc_grid.cc b/met/src/tools/other/mode_time_domain/nc_grid.cc index e123acbd25..2b4a3e89b4 100644 --- a/met/src/tools/other/mode_time_domain/nc_grid.cc +++ b/met/src/tools/other/mode_time_domain/nc_grid.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/nc_grid.h b/met/src/tools/other/mode_time_domain/nc_grid.h index 6677e1b413..79e1115bfe 100644 --- a/met/src/tools/other/mode_time_domain/nc_grid.h +++ b/met/src/tools/other/mode_time_domain/nc_grid.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/nc_utils_local.cc b/met/src/tools/other/mode_time_domain/nc_utils_local.cc index 8aceca0d79..a0c0f976bf 100644 --- a/met/src/tools/other/mode_time_domain/nc_utils_local.cc +++ b/met/src/tools/other/mode_time_domain/nc_utils_local.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/mode_time_domain/nc_utils_local.h b/met/src/tools/other/mode_time_domain/nc_utils_local.h index ac357d0846..5e16d2845e 100644 --- a/met/src/tools/other/mode_time_domain/nc_utils_local.h +++ b/met/src/tools/other/mode_time_domain/nc_utils_local.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/modis_regrid/cloudsat_swath_file.cc b/met/src/tools/other/modis_regrid/cloudsat_swath_file.cc index b403c02c4b..49d6fc5d4d 100644 --- a/met/src/tools/other/modis_regrid/cloudsat_swath_file.cc +++ b/met/src/tools/other/modis_regrid/cloudsat_swath_file.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/modis_regrid/cloudsat_swath_file.h b/met/src/tools/other/modis_regrid/cloudsat_swath_file.h index 83cf08b800..33d815e045 100644 --- a/met/src/tools/other/modis_regrid/cloudsat_swath_file.h +++ b/met/src/tools/other/modis_regrid/cloudsat_swath_file.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/modis_regrid/data_averager.cc b/met/src/tools/other/modis_regrid/data_averager.cc index 39d5991613..a582682bfc 100644 --- a/met/src/tools/other/modis_regrid/data_averager.cc +++ b/met/src/tools/other/modis_regrid/data_averager.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/modis_regrid/data_averager.h b/met/src/tools/other/modis_regrid/data_averager.h index 034660eee6..adad4f996a 100644 --- a/met/src/tools/other/modis_regrid/data_averager.h +++ b/met/src/tools/other/modis_regrid/data_averager.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/modis_regrid/data_plane_to_netcdf.cc b/met/src/tools/other/modis_regrid/data_plane_to_netcdf.cc index f8c401997b..40f9771931 100644 --- a/met/src/tools/other/modis_regrid/data_plane_to_netcdf.cc +++ b/met/src/tools/other/modis_regrid/data_plane_to_netcdf.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/modis_regrid/data_plane_to_netcdf.h b/met/src/tools/other/modis_regrid/data_plane_to_netcdf.h index 59e018e67d..682bc3d29b 100644 --- a/met/src/tools/other/modis_regrid/data_plane_to_netcdf.h +++ b/met/src/tools/other/modis_regrid/data_plane_to_netcdf.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/modis_regrid/modis_file.cc b/met/src/tools/other/modis_regrid/modis_file.cc index 261f06c3df..c3825f8d85 100644 --- a/met/src/tools/other/modis_regrid/modis_file.cc +++ b/met/src/tools/other/modis_regrid/modis_file.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/modis_regrid/modis_file.h b/met/src/tools/other/modis_regrid/modis_file.h index 3495a2ce8c..3a87eacd51 100644 --- a/met/src/tools/other/modis_regrid/modis_file.h +++ b/met/src/tools/other/modis_regrid/modis_file.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/modis_regrid/modis_regrid.cc b/met/src/tools/other/modis_regrid/modis_regrid.cc index fa4ffa1f6b..600abf655c 100644 --- a/met/src/tools/other/modis_regrid/modis_regrid.cc +++ b/met/src/tools/other/modis_regrid/modis_regrid.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/modis_regrid/sat_utils.cc b/met/src/tools/other/modis_regrid/sat_utils.cc index 4e22431ec7..e1fc2540c0 100644 --- a/met/src/tools/other/modis_regrid/sat_utils.cc +++ b/met/src/tools/other/modis_regrid/sat_utils.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/modis_regrid/sat_utils.h b/met/src/tools/other/modis_regrid/sat_utils.h index f5c0de52bf..6cc285f92a 100644 --- a/met/src/tools/other/modis_regrid/sat_utils.h +++ b/met/src/tools/other/modis_regrid/sat_utils.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/pb2nc/closepb.f b/met/src/tools/other/pb2nc/closepb.f index d8e3d442e9..7d0cbb7262 100644 --- a/met/src/tools/other/pb2nc/closepb.f +++ b/met/src/tools/other/pb2nc/closepb.f @@ -1,7 +1,7 @@ C* *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -C* ** Copyright UCAR (c) 1992 - 2018 -C* ** University Corporation for AtmospheriC*Research (UCAR) -C* ** National Center for AtmospheriC*Research (NCAR) +C* ** Copyright UCAR (c) 1992 - 2021 +C* ** University Corporation for Atmospheric Research (UCAR) +C* ** National Center for Atmospheric Research (NCAR) C* ** Research Applications Lab (RAL) C* ** P.O.Box 3000, Boulder, Colorado, 80307-3000, USA C* *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* diff --git a/met/src/tools/other/pb2nc/dumppb.f b/met/src/tools/other/pb2nc/dumppb.f index 9f75a2e0ee..8c07364668 100644 --- a/met/src/tools/other/pb2nc/dumppb.f +++ b/met/src/tools/other/pb2nc/dumppb.f @@ -1,7 +1,7 @@ C* *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -C* ** Copyright UCAR (c) 1992 - 2018 -C* ** University Corporation for AtmospheriC*Research (UCAR) -C* ** National Center for AtmospheriC*Research (NCAR) +C* ** Copyright UCAR (c) 1992 - 2021 +C* ** University Corporation for Atmospheric Research (UCAR) +C* ** National Center for Atmospheric Research (NCAR) C* ** Research Applications Lab (RAL) C* ** P.O.Box 3000, Boulder, Colorado, 80307-3000, USA C* *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* diff --git a/met/src/tools/other/pb2nc/numpbmsg.f b/met/src/tools/other/pb2nc/numpbmsg.f index 18a5d09128..d6b5b4b4d4 100644 --- a/met/src/tools/other/pb2nc/numpbmsg.f +++ b/met/src/tools/other/pb2nc/numpbmsg.f @@ -1,7 +1,7 @@ C* *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -C* ** Copyright UCAR (c) 1992 - 2018 -C* ** University Corporation for AtmospheriC*Research (UCAR) -C* ** National Center for AtmospheriC*Research (NCAR) +C* ** Copyright UCAR (c) 1992 - 2021 +C* ** University Corporation for Atmospheric Research (UCAR) +C* ** National Center for Atmospheric Research (NCAR) C* ** Research Applications Lab (RAL) C* ** P.O.Box 3000, Boulder, Colorado, 80307-3000, USA C* *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* @@ -60,4 +60,4 @@ SUBROUTINE GET_TMIN ( FID, TMIN ) TMIN = IUPVS01(FID,'MINU') C* END - \ No newline at end of file + diff --git a/met/src/tools/other/pb2nc/openpb.f b/met/src/tools/other/pb2nc/openpb.f index dc78c877bc..532cf0ce54 100644 --- a/met/src/tools/other/pb2nc/openpb.f +++ b/met/src/tools/other/pb2nc/openpb.f @@ -1,7 +1,7 @@ C* *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -C* ** Copyright UCAR (c) 1992 - 2018 -C* ** University Corporation for AtmospheriC*Research (UCAR) -C* ** National Center for AtmospheriC*Research (NCAR) +C* ** Copyright UCAR (c) 1992 - 2021 +C* ** University Corporation for Atmospheric Research (UCAR) +C* ** National Center for Atmospheric Research (NCAR) C* ** Research Applications Lab (RAL) C* ** P.O.Box 3000, Boulder, Colorado, 80307-3000, USA C* *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* diff --git a/met/src/tools/other/pb2nc/pb2nc.cc b/met/src/tools/other/pb2nc/pb2nc.cc index b36095ccf5..1113290c76 100644 --- a/met/src/tools/other/pb2nc/pb2nc.cc +++ b/met/src/tools/other/pb2nc/pb2nc.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/pb2nc/pb2nc_conf_info.cc b/met/src/tools/other/pb2nc/pb2nc_conf_info.cc index 5f990d0099..8acd87755b 100644 --- a/met/src/tools/other/pb2nc/pb2nc_conf_info.cc +++ b/met/src/tools/other/pb2nc/pb2nc_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/pb2nc/pb2nc_conf_info.h b/met/src/tools/other/pb2nc/pb2nc_conf_info.h index d99451dbae..26dc20c282 100644 --- a/met/src/tools/other/pb2nc/pb2nc_conf_info.h +++ b/met/src/tools/other/pb2nc/pb2nc_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/pb2nc/readpb.f b/met/src/tools/other/pb2nc/readpb.f index d5aef7bfa3..dec7eab8da 100644 --- a/met/src/tools/other/pb2nc/readpb.f +++ b/met/src/tools/other/pb2nc/readpb.f @@ -1,7 +1,7 @@ C* *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -C* ** Copyright UCAR (c) 1992 - 2018 -C* ** University Corporation for AtmospheriC*Research (UCAR) -C* ** National Center for AtmospheriC*Research (NCAR) +C* ** Copyright UCAR (c) 1992 - 2021 +C* ** University Corporation for Atmospheric Research (UCAR) +C* ** National Center for Atmospheric Research (NCAR) C* ** Research Applications Lab (RAL) C* ** P.O.Box 3000, Boulder, Colorado, 80307-3000, USA C* *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* diff --git a/met/src/tools/other/plot_data_plane/plot_data_plane.cc b/met/src/tools/other/plot_data_plane/plot_data_plane.cc index 1f6886c3fb..80251a7ccf 100644 --- a/met/src/tools/other/plot_data_plane/plot_data_plane.cc +++ b/met/src/tools/other/plot_data_plane/plot_data_plane.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/plot_point_obs/plot_point_obs.cc b/met/src/tools/other/plot_point_obs/plot_point_obs.cc index 768f7393a1..6ffee6c271 100644 --- a/met/src/tools/other/plot_point_obs/plot_point_obs.cc +++ b/met/src/tools/other/plot_point_obs/plot_point_obs.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/plot_point_obs/plot_point_obs.h b/met/src/tools/other/plot_point_obs/plot_point_obs.h index 56faf4f28a..7fec0e19f0 100644 --- a/met/src/tools/other/plot_point_obs/plot_point_obs.h +++ b/met/src/tools/other/plot_point_obs/plot_point_obs.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/plot_point_obs/plot_point_obs_conf_info.cc b/met/src/tools/other/plot_point_obs/plot_point_obs_conf_info.cc index 93213bdc35..a53740f278 100644 --- a/met/src/tools/other/plot_point_obs/plot_point_obs_conf_info.cc +++ b/met/src/tools/other/plot_point_obs/plot_point_obs_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/plot_point_obs/plot_point_obs_conf_info.h b/met/src/tools/other/plot_point_obs/plot_point_obs_conf_info.h index 743fbeaf75..8261cc3f91 100644 --- a/met/src/tools/other/plot_point_obs/plot_point_obs_conf_info.h +++ b/met/src/tools/other/plot_point_obs/plot_point_obs_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/point2grid/point2grid.cc b/met/src/tools/other/point2grid/point2grid.cc index f5a5f57e3b..f81a0c6bea 100644 --- a/met/src/tools/other/point2grid/point2grid.cc +++ b/met/src/tools/other/point2grid/point2grid.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/point2grid/point2grid_conf_info.cc b/met/src/tools/other/point2grid/point2grid_conf_info.cc index 73c1f3a78b..8c50524235 100644 --- a/met/src/tools/other/point2grid/point2grid_conf_info.cc +++ b/met/src/tools/other/point2grid/point2grid_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/point2grid/point2grid_conf_info.h b/met/src/tools/other/point2grid/point2grid_conf_info.h index 73196a33e2..fe62f7258a 100644 --- a/met/src/tools/other/point2grid/point2grid_conf_info.h +++ b/met/src/tools/other/point2grid/point2grid_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/regrid_data_plane/regrid_data_plane.cc b/met/src/tools/other/regrid_data_plane/regrid_data_plane.cc index 7d68ffb1c2..695201ed10 100644 --- a/met/src/tools/other/regrid_data_plane/regrid_data_plane.cc +++ b/met/src/tools/other/regrid_data_plane/regrid_data_plane.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/shift_data_plane/shift_data_plane.cc b/met/src/tools/other/shift_data_plane/shift_data_plane.cc index 99020a8f9b..979babbfe1 100644 --- a/met/src/tools/other/shift_data_plane/shift_data_plane.cc +++ b/met/src/tools/other/shift_data_plane/shift_data_plane.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/af_cp_file.cc b/met/src/tools/other/wwmca_tool/af_cp_file.cc index 66d7c0927b..c5ad453f95 100644 --- a/met/src/tools/other/wwmca_tool/af_cp_file.cc +++ b/met/src/tools/other/wwmca_tool/af_cp_file.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/af_cp_file.h b/met/src/tools/other/wwmca_tool/af_cp_file.h index 72d4261be5..2b3713fd73 100644 --- a/met/src/tools/other/wwmca_tool/af_cp_file.h +++ b/met/src/tools/other/wwmca_tool/af_cp_file.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/af_file.cc b/met/src/tools/other/wwmca_tool/af_file.cc index 142497efc0..8e42f35045 100644 --- a/met/src/tools/other/wwmca_tool/af_file.cc +++ b/met/src/tools/other/wwmca_tool/af_file.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/af_file.h b/met/src/tools/other/wwmca_tool/af_file.h index 670916fc5d..bd95a18c5b 100644 --- a/met/src/tools/other/wwmca_tool/af_file.h +++ b/met/src/tools/other/wwmca_tool/af_file.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/af_pt_file.cc b/met/src/tools/other/wwmca_tool/af_pt_file.cc index abbf324c68..e64897d80f 100644 --- a/met/src/tools/other/wwmca_tool/af_pt_file.cc +++ b/met/src/tools/other/wwmca_tool/af_pt_file.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/af_pt_file.h b/met/src/tools/other/wwmca_tool/af_pt_file.h index 0ef403f189..61859d8755 100644 --- a/met/src/tools/other/wwmca_tool/af_pt_file.h +++ b/met/src/tools/other/wwmca_tool/af_pt_file.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/ave_interp.cc b/met/src/tools/other/wwmca_tool/ave_interp.cc index 84f381878e..51b4f88fb0 100644 --- a/met/src/tools/other/wwmca_tool/ave_interp.cc +++ b/met/src/tools/other/wwmca_tool/ave_interp.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/ave_interp.h b/met/src/tools/other/wwmca_tool/ave_interp.h index 84275c6368..96f16737e1 100644 --- a/met/src/tools/other/wwmca_tool/ave_interp.h +++ b/met/src/tools/other/wwmca_tool/ave_interp.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/interp_base.cc b/met/src/tools/other/wwmca_tool/interp_base.cc index 7666c1dac9..3bf262eefa 100644 --- a/met/src/tools/other/wwmca_tool/interp_base.cc +++ b/met/src/tools/other/wwmca_tool/interp_base.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/interp_base.h b/met/src/tools/other/wwmca_tool/interp_base.h index 3de5dd30e9..81b030aef2 100644 --- a/met/src/tools/other/wwmca_tool/interp_base.h +++ b/met/src/tools/other/wwmca_tool/interp_base.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/max_interp.cc b/met/src/tools/other/wwmca_tool/max_interp.cc index 3bcccbaaeb..2f870ea7f2 100644 --- a/met/src/tools/other/wwmca_tool/max_interp.cc +++ b/met/src/tools/other/wwmca_tool/max_interp.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/max_interp.h b/met/src/tools/other/wwmca_tool/max_interp.h index ae28eebbdf..a4760c3062 100644 --- a/met/src/tools/other/wwmca_tool/max_interp.h +++ b/met/src/tools/other/wwmca_tool/max_interp.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/min_interp.cc b/met/src/tools/other/wwmca_tool/min_interp.cc index e4d868c9ec..3973ba011e 100644 --- a/met/src/tools/other/wwmca_tool/min_interp.cc +++ b/met/src/tools/other/wwmca_tool/min_interp.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/min_interp.h b/met/src/tools/other/wwmca_tool/min_interp.h index e909fa9b58..fc301a6e16 100644 --- a/met/src/tools/other/wwmca_tool/min_interp.h +++ b/met/src/tools/other/wwmca_tool/min_interp.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/nc_output.cc b/met/src/tools/other/wwmca_tool/nc_output.cc index 26b7330004..fb55d045b5 100644 --- a/met/src/tools/other/wwmca_tool/nc_output.cc +++ b/met/src/tools/other/wwmca_tool/nc_output.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/nearest_interp.cc b/met/src/tools/other/wwmca_tool/nearest_interp.cc index e845adff8d..3b5cb14624 100644 --- a/met/src/tools/other/wwmca_tool/nearest_interp.cc +++ b/met/src/tools/other/wwmca_tool/nearest_interp.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/nearest_interp.h b/met/src/tools/other/wwmca_tool/nearest_interp.h index 7e06c82085..d4a3eb7c57 100644 --- a/met/src/tools/other/wwmca_tool/nearest_interp.h +++ b/met/src/tools/other/wwmca_tool/nearest_interp.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/wwmca_plot.cc b/met/src/tools/other/wwmca_tool/wwmca_plot.cc index a62aa5ddd3..fce0ed780b 100644 --- a/met/src/tools/other/wwmca_tool/wwmca_plot.cc +++ b/met/src/tools/other/wwmca_tool/wwmca_plot.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/wwmca_ref.cc b/met/src/tools/other/wwmca_tool/wwmca_ref.cc index dd4079c7ae..828e517485 100644 --- a/met/src/tools/other/wwmca_tool/wwmca_ref.cc +++ b/met/src/tools/other/wwmca_tool/wwmca_ref.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/wwmca_ref.h b/met/src/tools/other/wwmca_tool/wwmca_ref.h index 95f1bff12f..043669e11e 100644 --- a/met/src/tools/other/wwmca_tool/wwmca_ref.h +++ b/met/src/tools/other/wwmca_tool/wwmca_ref.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/wwmca_regrid.cc b/met/src/tools/other/wwmca_tool/wwmca_regrid.cc index e99b45c774..df4c3324af 100644 --- a/met/src/tools/other/wwmca_tool/wwmca_regrid.cc +++ b/met/src/tools/other/wwmca_tool/wwmca_regrid.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/wwmca_utils.cc b/met/src/tools/other/wwmca_tool/wwmca_utils.cc index 1288a06193..9d02297c60 100644 --- a/met/src/tools/other/wwmca_tool/wwmca_utils.cc +++ b/met/src/tools/other/wwmca_tool/wwmca_utils.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/other/wwmca_tool/wwmca_utils.h b/met/src/tools/other/wwmca_tool/wwmca_utils.h index 91ea2f054b..1070195941 100644 --- a/met/src/tools/other/wwmca_tool/wwmca_utils.h +++ b/met/src/tools/other/wwmca_tool/wwmca_utils.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/rmw_analysis/rmw_analysis.cc b/met/src/tools/tc_utils/rmw_analysis/rmw_analysis.cc index 084ea2edeb..5965ba8c84 100644 --- a/met/src/tools/tc_utils/rmw_analysis/rmw_analysis.cc +++ b/met/src/tools/tc_utils/rmw_analysis/rmw_analysis.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2019 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/rmw_analysis/rmw_analysis.h b/met/src/tools/tc_utils/rmw_analysis/rmw_analysis.h index 3f6d344889..2c00e1d609 100644 --- a/met/src/tools/tc_utils/rmw_analysis/rmw_analysis.h +++ b/met/src/tools/tc_utils/rmw_analysis/rmw_analysis.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2019 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/rmw_analysis/rmw_analysis_conf_info.cc b/met/src/tools/tc_utils/rmw_analysis/rmw_analysis_conf_info.cc index 3437b9e2bd..4e3c1cd734 100644 --- a/met/src/tools/tc_utils/rmw_analysis/rmw_analysis_conf_info.cc +++ b/met/src/tools/tc_utils/rmw_analysis/rmw_analysis_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2019 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/rmw_analysis/rmw_analysis_conf_info.h b/met/src/tools/tc_utils/rmw_analysis/rmw_analysis_conf_info.h index 576ad9db0a..2fde1a15a0 100644 --- a/met/src/tools/tc_utils/rmw_analysis/rmw_analysis_conf_info.h +++ b/met/src/tools/tc_utils/rmw_analysis/rmw_analysis_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2019 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_dland/tc_dland.cc b/met/src/tools/tc_utils/tc_dland/tc_dland.cc index dcd2d83ab9..e7c378549c 100644 --- a/met/src/tools/tc_utils/tc_dland/tc_dland.cc +++ b/met/src/tools/tc_utils/tc_dland/tc_dland.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_dland/tc_poly.cc b/met/src/tools/tc_utils/tc_dland/tc_poly.cc index 02f0cbd726..ef50388018 100644 --- a/met/src/tools/tc_utils/tc_dland/tc_poly.cc +++ b/met/src/tools/tc_utils/tc_dland/tc_poly.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_dland/tc_poly.h b/met/src/tools/tc_utils/tc_dland/tc_poly.h index 29197aec30..0d307f910f 100644 --- a/met/src/tools/tc_utils/tc_dland/tc_poly.h +++ b/met/src/tools/tc_utils/tc_dland/tc_poly.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_gen/tc_gen.cc b/met/src/tools/tc_utils/tc_gen/tc_gen.cc index 743db7fd44..21ecc6269f 100644 --- a/met/src/tools/tc_utils/tc_gen/tc_gen.cc +++ b/met/src/tools/tc_utils/tc_gen/tc_gen.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_gen/tc_gen.h b/met/src/tools/tc_utils/tc_gen/tc_gen.h index 10118842c6..a531652c32 100644 --- a/met/src/tools/tc_utils/tc_gen/tc_gen.h +++ b/met/src/tools/tc_utils/tc_gen/tc_gen.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_gen/tc_gen_conf_info.cc b/met/src/tools/tc_utils/tc_gen/tc_gen_conf_info.cc index e2046c0c13..02f75d16d7 100644 --- a/met/src/tools/tc_utils/tc_gen/tc_gen_conf_info.cc +++ b/met/src/tools/tc_utils/tc_gen/tc_gen_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_gen/tc_gen_conf_info.h b/met/src/tools/tc_utils/tc_gen/tc_gen_conf_info.h index 0769f64f8f..a02a62e562 100644 --- a/met/src/tools/tc_utils/tc_gen/tc_gen_conf_info.h +++ b/met/src/tools/tc_utils/tc_gen/tc_gen_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_pairs/tc_pairs.cc b/met/src/tools/tc_utils/tc_pairs/tc_pairs.cc index 6fd095d299..dc3792da05 100644 --- a/met/src/tools/tc_utils/tc_pairs/tc_pairs.cc +++ b/met/src/tools/tc_utils/tc_pairs/tc_pairs.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_pairs/tc_pairs.h b/met/src/tools/tc_utils/tc_pairs/tc_pairs.h index 6d14b21bb5..7a6d435715 100644 --- a/met/src/tools/tc_utils/tc_pairs/tc_pairs.h +++ b/met/src/tools/tc_utils/tc_pairs/tc_pairs.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_pairs/tc_pairs_conf_info.cc b/met/src/tools/tc_utils/tc_pairs/tc_pairs_conf_info.cc index 4c122d7aeb..9bb8105282 100644 --- a/met/src/tools/tc_utils/tc_pairs/tc_pairs_conf_info.cc +++ b/met/src/tools/tc_utils/tc_pairs/tc_pairs_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_pairs/tc_pairs_conf_info.h b/met/src/tools/tc_utils/tc_pairs/tc_pairs_conf_info.h index be457218b4..ffbe04442a 100644 --- a/met/src/tools/tc_utils/tc_pairs/tc_pairs_conf_info.h +++ b/met/src/tools/tc_utils/tc_pairs/tc_pairs_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_rmw/tc_rmw.cc b/met/src/tools/tc_utils/tc_rmw/tc_rmw.cc index be0c6edddc..27e224387c 100644 --- a/met/src/tools/tc_utils/tc_rmw/tc_rmw.cc +++ b/met/src/tools/tc_utils/tc_rmw/tc_rmw.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_rmw/tc_rmw.h b/met/src/tools/tc_utils/tc_rmw/tc_rmw.h index 8e9620c8fe..acc8e81513 100644 --- a/met/src/tools/tc_utils/tc_rmw/tc_rmw.h +++ b/met/src/tools/tc_utils/tc_rmw/tc_rmw.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_rmw/tc_rmw_conf_info.cc b/met/src/tools/tc_utils/tc_rmw/tc_rmw_conf_info.cc index 2299208b48..e309e0e7f8 100644 --- a/met/src/tools/tc_utils/tc_rmw/tc_rmw_conf_info.cc +++ b/met/src/tools/tc_utils/tc_rmw/tc_rmw_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_rmw/tc_rmw_conf_info.h b/met/src/tools/tc_utils/tc_rmw/tc_rmw_conf_info.h index 5e23d6765e..f8fc48f276 100644 --- a/met/src/tools/tc_utils/tc_rmw/tc_rmw_conf_info.h +++ b/met/src/tools/tc_utils/tc_rmw/tc_rmw_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_stat/tc_stat.cc b/met/src/tools/tc_utils/tc_stat/tc_stat.cc index 98713d12c1..5595e02b93 100644 --- a/met/src/tools/tc_utils/tc_stat/tc_stat.cc +++ b/met/src/tools/tc_utils/tc_stat/tc_stat.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_stat/tc_stat.h b/met/src/tools/tc_utils/tc_stat/tc_stat.h index 57e519af53..4addd94508 100644 --- a/met/src/tools/tc_utils/tc_stat/tc_stat.h +++ b/met/src/tools/tc_utils/tc_stat/tc_stat.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_stat/tc_stat_conf_info.cc b/met/src/tools/tc_utils/tc_stat/tc_stat_conf_info.cc index 1bdc3af262..6305732e18 100644 --- a/met/src/tools/tc_utils/tc_stat/tc_stat_conf_info.cc +++ b/met/src/tools/tc_utils/tc_stat/tc_stat_conf_info.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_stat/tc_stat_conf_info.h b/met/src/tools/tc_utils/tc_stat/tc_stat_conf_info.h index 65e68d80f8..e6a40e3ee3 100644 --- a/met/src/tools/tc_utils/tc_stat/tc_stat_conf_info.h +++ b/met/src/tools/tc_utils/tc_stat/tc_stat_conf_info.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_stat/tc_stat_files.cc b/met/src/tools/tc_utils/tc_stat/tc_stat_files.cc index 4478cf831b..a70064d4b8 100644 --- a/met/src/tools/tc_utils/tc_stat/tc_stat_files.cc +++ b/met/src/tools/tc_utils/tc_stat/tc_stat_files.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_stat/tc_stat_files.h b/met/src/tools/tc_utils/tc_stat/tc_stat_files.h index e6b6118d9e..18edf7bf1b 100644 --- a/met/src/tools/tc_utils/tc_stat/tc_stat_files.h +++ b/met/src/tools/tc_utils/tc_stat/tc_stat_files.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_stat/tc_stat_job.cc b/met/src/tools/tc_utils/tc_stat/tc_stat_job.cc index 6f6f812878..59e4dd9616 100644 --- a/met/src/tools/tc_utils/tc_stat/tc_stat_job.cc +++ b/met/src/tools/tc_utils/tc_stat/tc_stat_job.cc @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) diff --git a/met/src/tools/tc_utils/tc_stat/tc_stat_job.h b/met/src/tools/tc_utils/tc_stat/tc_stat_job.h index 4ad98be987..111c6a3564 100644 --- a/met/src/tools/tc_utils/tc_stat/tc_stat_job.h +++ b/met/src/tools/tc_utils/tc_stat/tc_stat_job.h @@ -1,5 +1,5 @@ // *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* -// ** Copyright UCAR (c) 1992 - 2020 +// ** Copyright UCAR (c) 1992 - 2021 // ** University Corporation for Atmospheric Research (UCAR) // ** National Center for Atmospheric Research (NCAR) // ** Research Applications Lab (RAL) From ddf29e0d6872f602afd0552ccb8e0c117d6374d9 Mon Sep 17 00:00:00 2001 From: johnhg Date: Tue, 27 Apr 2021 10:27:19 -0600 Subject: [PATCH 111/165] Bugfix 1768 edeck (#1769) * Per #1768, update logic in ATCFProbLine::read_line(). If read_line() from the base class returns bad status, have this one return bad status as well. But do NOT for unsupported line types. Just print a Debug(4) log message instead. * Per #1768, update the probability line types to match those listed in https://www.nrlmry.navy.mil/atcf_web/docs/database/new/edeck.txt. That documentation was last updated in 11/2020, so presumably these reflect NHC's latest changes. * Per #1768, renaming enumerated value from ATCFLineType_ProbRIRW to ATCFLineType_ProbRI since there are now separated ATCF line type for rapid intensitifcation (RI) and weakening (RW). Will work more with this data in future issues to verify more of these probability types. --- met/src/libcode/vx_tc_util/atcf_line_base.cc | 12 ++-- met/src/libcode/vx_tc_util/atcf_line_base.h | 11 +++- met/src/libcode/vx_tc_util/atcf_prob_line.cc | 57 ++++++++++--------- met/src/libcode/vx_tc_util/prob_info_array.cc | 2 +- met/src/libcode/vx_tc_util/prob_info_base.cc | 2 +- met/src/libcode/vx_tc_util/prob_pair_info.cc | 2 +- met/src/tools/tc_utils/tc_pairs/tc_pairs.cc | 2 +- 7 files changed, 51 insertions(+), 37 deletions(-) diff --git a/met/src/libcode/vx_tc_util/atcf_line_base.cc b/met/src/libcode/vx_tc_util/atcf_line_base.cc index bc5474cec4..c4fca4e38e 100644 --- a/met/src/libcode/vx_tc_util/atcf_line_base.cc +++ b/met/src/libcode/vx_tc_util/atcf_line_base.cc @@ -482,11 +482,13 @@ ATCFLineType string_to_atcflinetype(const char *s) { else if(strlen(s) == 0) t = ATCFLineType_Track; // BDECK else if(strcasecmp(s, "TR") == 0) t = ATCFLineType_ProbTR; else if(strcasecmp(s, "IN") == 0) t = ATCFLineType_ProbIN; - else if(strcasecmp(s, "RI") == 0) t = ATCFLineType_ProbRIRW; - else if(strcasecmp(s, "WD") == 0) t = ATCFLineType_ProbWD; + else if(strcasecmp(s, "RI") == 0) t = ATCFLineType_ProbRI; + else if(strcasecmp(s, "RW") == 0) t = ATCFLineType_ProbRW; + else if(strcasecmp(s, "WR") == 0) t = ATCFLineType_ProbWR; else if(strcasecmp(s, "PR") == 0) t = ATCFLineType_ProbPR; else if(strcasecmp(s, "GN") == 0) t = ATCFLineType_ProbGN; else if(strcasecmp(s, "GS") == 0) t = ATCFLineType_ProbGS; + else if(strcasecmp(s, "ER") == 0) t = ATCFLineType_ProbER; else t = NoATCFLineType; return(t); @@ -502,11 +504,13 @@ ConcatString atcflinetype_to_string(const ATCFLineType t) { case ATCFLineType_GenTrack: s = "GenTrack"; break; case ATCFLineType_ProbTR: s = "ProbTR"; break; case ATCFLineType_ProbIN: s = "ProbIN"; break; - case ATCFLineType_ProbRIRW: s = "ProbRIRW"; break; - case ATCFLineType_ProbWD: s = "ProbWD"; break; + case ATCFLineType_ProbRI: s = "ProbRI"; break; + case ATCFLineType_ProbRW: s = "ProbRW"; break; + case ATCFLineType_ProbWR: s = "ProbWR"; break; case ATCFLineType_ProbPR: s = "ProbPR"; break; case ATCFLineType_ProbGN: s = "ProbGN"; break; case ATCFLineType_ProbGS: s = "ProbGS"; break; + case ATCFLineType_ProbER: s = "ProbER"; break; case NoATCFLineType: s = na_str; break; default: s = na_str; break; } diff --git a/met/src/libcode/vx_tc_util/atcf_line_base.h b/met/src/libcode/vx_tc_util/atcf_line_base.h index 816ddfeba4..313c294e54 100644 --- a/met/src/libcode/vx_tc_util/atcf_line_base.h +++ b/met/src/libcode/vx_tc_util/atcf_line_base.h @@ -13,9 +13,12 @@ //////////////////////////////////////////////////////////////////////// // -// Based on Best Track file format information at: +// Best Track file format information: // http://www.nrlmry.navy.mil/atcf_web/docs/database/new/abrdeck.html // +// EDeck file format information: +// https://www.nrlmry.navy.mil/atcf_web/docs/database/new/edeck.txt +// //////////////////////////////////////////////////////////////////////// #include @@ -31,11 +34,13 @@ enum ATCFLineType { ATCFLineType_GenTrack, // Genesis Track and intensity line type (numeric) ATCFLineType_ProbTR, // Track probability (TR) ATCFLineType_ProbIN, // Intensity probability (IN) - ATCFLineType_ProbRIRW, // Rapid intensification probability (RI) - ATCFLineType_ProbWD, // Wind radii probability (WD) + ATCFLineType_ProbRI, // Rapid intensification probability (RI) + ATCFLineType_ProbRW, // Rapid weakening probability (RW) + ATCFLineType_ProbWR, // Wind radii probability (WR) ATCFLineType_ProbPR, // Pressure probability (PR) ATCFLineType_ProbGN, // TC genesis probability (GN) ATCFLineType_ProbGS, // TC genesis shape probability (GS) + ATCFLineType_ProbER, // Eyewall replacement probability (ER) NoATCFLineType }; diff --git a/met/src/libcode/vx_tc_util/atcf_prob_line.cc b/met/src/libcode/vx_tc_util/atcf_prob_line.cc index 2f912e9516..a06ad1c5eb 100644 --- a/met/src/libcode/vx_tc_util/atcf_prob_line.cc +++ b/met/src/libcode/vx_tc_util/atcf_prob_line.cc @@ -98,6 +98,7 @@ void ATCFProbLine::dump(ostream &out, int indent_depth) const { //////////////////////////////////////////////////////////////////////// void ATCFProbLine::clear() { + ATCFLineBase::clear(); return; @@ -106,40 +107,44 @@ void ATCFProbLine::clear() { //////////////////////////////////////////////////////////////////////// int ATCFProbLine::read_line(LineDataFile * ldf) { - int status; + int status = 0; int n_expect; - clear(); + // Read lines until good status is found + while(status == 0) { + + clear(); - status = ATCFLineBase::read_line(ldf); + // Return bad status from the base class + if(!(status = ATCFLineBase::read_line(ldf))) return(0); - // Check for bad return status or blank line - if(!status) return(0); + // Check the line type + switch(Type) { + case ATCFLineType_ProbRI: + n_expect = MinATCFProbRIRWElements; + break; - // Check the line type - switch(Type) { - case ATCFLineType_ProbRIRW: - n_expect = MinATCFProbRIRWElements; - break; + default: + mlog << Debug(4) + << "ATCFProbLine::read_line(LineDataFile * ldf) -> " + << "skipping ATCF line type (" + << atcflinetype_to_string(Type) << ")\n"; + status = 0; + continue; + } - default: + // Check for the minumum number of elements + if(n_items() < n_expect) { mlog << Warning << "\nint ATCFProbLine::read_line(LineDataFile * ldf) -> " - << "unexpected ATCF line type (" - << atcflinetype_to_string(Type) << ")\n\n"; - return(0); - } - - // Check for the minumum number of elements - if(n_items() < n_expect) { - mlog << Warning - << "\nint ATCFProbLine::read_line(LineDataFile * ldf) -> " - << "found fewer than the expected number of elements (" - << n_items() << "<" << n_expect - << ") in ATCF " << atcflinetype_to_string(Type) << " line:\n" - << DataLine::get_line() << "\n\n"; - return(0); - } + << "found fewer than the expected number of elements (" + << n_items() << "<" << n_expect + << ") in ATCF " << atcflinetype_to_string(Type) << " line:\n" + << DataLine::get_line() << "\n\n"; + status = 0; + continue; + } + } return(1); } diff --git a/met/src/libcode/vx_tc_util/prob_info_array.cc b/met/src/libcode/vx_tc_util/prob_info_array.cc index ea8827a682..6197121ff8 100644 --- a/met/src/libcode/vx_tc_util/prob_info_array.cc +++ b/met/src/libcode/vx_tc_util/prob_info_array.cc @@ -184,7 +184,7 @@ bool ProbInfoArray::add(const ATCFProbLine &l, bool check_dup) { // Store based on the input line type switch(l.type()) { - case(ATCFLineType_ProbRIRW): + case(ATCFLineType_ProbRI): // Check for no entries or a mismatch with the latest entry if( ProbRIRW.size() == 0 || diff --git a/met/src/libcode/vx_tc_util/prob_info_base.cc b/met/src/libcode/vx_tc_util/prob_info_base.cc index 07de90221a..f8d3bb791e 100644 --- a/met/src/libcode/vx_tc_util/prob_info_base.cc +++ b/met/src/libcode/vx_tc_util/prob_info_base.cc @@ -280,7 +280,7 @@ void ProbInfoBase::set(const TCStatLine &l) { switch(l.type()) { case TCStatLineType_ProbRIRW: - Type = ATCFLineType_ProbRIRW; + Type = ATCFLineType_ProbRI; break; default: diff --git a/met/src/libcode/vx_tc_util/prob_pair_info.cc b/met/src/libcode/vx_tc_util/prob_pair_info.cc index 4f8189d7e0..3415f040d2 100644 --- a/met/src/libcode/vx_tc_util/prob_pair_info.cc +++ b/met/src/libcode/vx_tc_util/prob_pair_info.cc @@ -200,7 +200,7 @@ ProbPairInfoBase * new_prob_pair(const ATCFLineType t) { ProbPairInfoBase *new_pair = (ProbPairInfoBase *) 0; switch(t) { - case ATCFLineType_ProbRIRW: + case ATCFLineType_ProbRI: new_pair = new ProbRIRWPairInfo; break; diff --git a/met/src/tools/tc_utils/tc_pairs/tc_pairs.cc b/met/src/tools/tc_utils/tc_pairs/tc_pairs.cc index dc3792da05..46c3a80b04 100644 --- a/met/src/tools/tc_utils/tc_pairs/tc_pairs.cc +++ b/met/src/tools/tc_utils/tc_pairs/tc_pairs.cc @@ -949,7 +949,7 @@ void filter_probs(ProbInfoArray &probs) { } // If we've made it here, retain this probability - if(p[i]->type() == ATCFLineType_ProbRIRW) probs.add(p.prob_rirw(i)); + if(p[i]->type() == ATCFLineType_ProbRI) probs.add(p.prob_rirw(i)); } // Print summary filtering info From 9190a29ba2a560a25e802cbd75d792d8cb9d0625 Mon Sep 17 00:00:00 2001 From: johnhg Date: Wed, 28 Apr 2021 13:33:21 -0600 Subject: [PATCH 112/165] Feature 1771 release_notes (#1772) * Per #1771, draft version of combined met-10.0.0 release notes. * Per #1771, add bolding to indicate emphasis. * Per #1771, add bolding to indicate emphasis. * Per #1771, add bolding to indicate emphasis. * Per #1771, add bolding to indicate emphasis. * Per #1771, add bolding to indicate emphasis. * Per #1771, add bolding to indicate emphasis. * Per #1771, add bolding to indicate emphasis. * Per #1771, add bolding to indicate emphasis. * Per #1771, also update the flowchart for met-10.0.0. * Per #1771, update flowchart to indicate that tc_gen now has netcdf output. * Per #1771, rotate the authorship list for met-10.0.0, shifting Barb from first author down to the end. --- met/docs/Flowchart/MET_flowchart.pptx | Bin 324389 -> 348311 bytes met/docs/Flowchart/MET_flowchart_v10.0.0.png | Bin 0 -> 166779 bytes .../Users_Guide/figure/overview-figure.png | Bin 172285 -> 166779 bytes met/docs/Users_Guide/release-notes.rst | 258 +++++++----------- met/docs/conf.py | 2 +- 5 files changed, 103 insertions(+), 157 deletions(-) create mode 100644 met/docs/Flowchart/MET_flowchart_v10.0.0.png diff --git a/met/docs/Flowchart/MET_flowchart.pptx b/met/docs/Flowchart/MET_flowchart.pptx index acb06acef654270cbf35bb7dc5eb69557504c699..575eaada143e9fdec65e32b93b8d25aebeb57fb9 100644 GIT binary patch delta 27814 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 delta 5194 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 z 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 R>GuKn$jK;4S4n;i`hWF7KB52s literal 0 HcmV?d00001 diff --git a/met/docs/Users_Guide/figure/overview-figure.png b/met/docs/Users_Guide/figure/overview-figure.png index 8bf523df65b496f72afe9e02c5fc861d40d2bb7f..a6def17819b10602c9c94e61094babef84c6320c 100644 GIT binary patch literal 166779 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 z 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 R>GuKn$jK;4S4n;i`hWF7KB52s literal 172285 zcmd?RWmp`+za;V?%w;~Pw)4a zhk1JFsp+n+s-K;6iWn6o8Ds-zLCI7?SY+zL$oig@F2Z9=J}FEd=!cZleSo z|NfW&ufN~^=G~&DCQFNh;n93Ay6L)qQxuWuyy>8+im6DdsFXy{ zOQB(R|e7r`Kjrz)hZ^lM{1s z0vZ`K7*ag=zYn((eMTZ|sTBXuX)q)l{JUTi$J9CiR7$2u2BP)=K!^su!I$v$1Oo4^RPs4G6 z?|!-eQD8q$YwUj|)$My%Vo3iHGb9d|rB0{O>~JO*_??`X*pb-1YWluV>-p<@eb+TY zkI__RD(~|1pBonAo+0D6*Ac5)S2^gdi#$8gbYv8`OM4b|Qy{V#SI#?Uy7It3f3 zcB!eUoSvnw1_?q(74B|sySW#ujS^8G*`g-0Sn5@S!WfkE1Y-^{g)|46N4NUJE;hRD zFI^T@l%Z$xMOXyrf}XFU@*L$9#GswlJC=Hb-UN*YG-`BQfp!Rq)j`^1w;LN9^Gny; zQKToEnN;wQgwmp6l?olo6{27)3}_T0UI@g-*R%-Cffn0^+bouxRBudVtGNQPu=P%_ z(-?^02+MA@()Z>g@hN96zOB@3;(aG*t4)^j>m452wR$kAh5CO^SL(kyt^1B8lY560 z>#JQA2fe*`85rd3tgA(Z2Y;ayh5r71mh8A536%CudAYav?sR3d%~c}kk2tLlFpy=6 z*>y(U{K{4ZC`!J*k6xPrD_`tahK3~XiZvv_tFWNn*GK!`=j-``K1FZtm)>i@-Q6~D zt!MLyIc<_(2~w%ZRlL#2NRI~G>TJt8&{kU=2?Oc3>?`DtHq8sX-f*TLdvEi!>1l<# zD1-(LF_xQTl1M7656{mxdIJ1-W3gC_i0%)fP)P@#+}>VaK7IPcZu$^5z(x?&FrnfZ z?FkQQF9U&lukYMV?bkI#0q2dkQlVNb9)aK;682vO`Lar`xDr!g}@@M9;>Cl zXUueUHY-3T$?-Q_44DWIj`%we1IlQX*22&x;Uk@kf}?{hn=zR0uCW%F=2{(p z)b~8T{~G_O+MsOoX8@7qXxEM1q%ZjC_l5jRJRTcJ7<;~M1ho8WU$fGSG09-;dra+d zZ_xf>pH98Z{bW%tfC($!#ifr}B(Ur3juS^C#Nx9$0JH! zhb``*m+a4I+7W^#;fRUzn>|f)A;i~g(ss|Av#d78MU4{$xwpl4NXOC5ewDTy|I-EIe5h8Mt}D0_5%A4{R! z-QBeuXpsl&uz;GtAHloP&LqUl_$)mSMe%ONou0_A*voMcwo2et2*4XUZc)u+A;~}( zAxp(#rF;kMn+QFw)bMWL_ht}_R^a`b^$v4}^-K;O6lAzgv7#Q$h}RXyR+e!fdcK_s zD(+N%(5r577azlw6XZ9&EoIPsm@P#h2~s&<*Lx8(1PQ zx0qQW#pH}aZUPLKqogrR#s9Du}5Utf~K1#m1=*V=j zT3cJs(YZhEXBmHX|2!Cpoc56j*6^znF&3tW77Jk#>;Y|$1%&w^KOa289eSgl(?*w1 z7s&u2j}sOP)F;8b9!b5J8tEoPIhuO&75A}S$;lBZMikwIM`kDLHlKJx9wq*gS$eRX z&MatIt=f3cIOxSgj469r-4TNl8UYrP&`qxJ7!A~cp8Q8NY?RC~>LCpY1sxy1vJvwW zHFmY*76((OGh#C;Cz35Yr*{ryg2_pphH}hTk5jEic%%5#k z93@G_7KAL>vKzy+NgdFD3!S{TB zMf-ttAenLbl3kpFOlKkj5qA-_a)oT0LbmsoUcykc8#Y8{B7*_$2gyn~;fvhrM{T_{Og3+;^X889H0Z;caT=vT~=w8F@HM{JwF*>nDqCFF35+rhqQi^Ev zsy~-h>(t8=r-pYPu6FtNj?sYR;v*I$#T-pU7XMci=*teRme}ch5o4hnoM(QM-Sh*A zjadw=uHcUl?2n3ppUs&aexGnL7Y#%Z%&^7Wx+}{oJO5T% zJW&)ficx8eWnrx)2z`N~Tf-yiGMGU#A!|9rgp-y^rW7${tCPA|Zo> zC+oT$W7gD=v_nph2?`IcL?;6|+J#pJF^CrEeX%Pdq|mAz7ncj>j~kJK-V_xyXZZLL zUsEvXwTp2(GzDdc9h9*8!=z#-++qm#{vw;lITl1P31k{Lr&k1!*2Xnr_y-m$rn=M* zoH@uQOwt(d9onc&ax&XjLw{8Aq~8sCnFcQF)En7$*j6Q#HcGp4qFw3`$wtBGz0`te zi_fH@7MFkos)QY(Np(oVH&ZcOaM>^#K{oHothAN=S!hTCD_2@F42Vyk&|Nrhyg7-; zO+JC+@i|~m)2P-(3uF=qsPUuvIwZ}Lt`4jjrNjFb2$W_)O*wtG`pTvpafZEthTLYK z*exx%{(NWBZ>^z4E#JPpbomB~D){CyinWQ|2d))BBj@k`Alj&pFE>D*Y_d8-P8TDF zc^j`{riP55vj{^;jkB?>5i7@bf3_CpMkSmSQ_GpTEt1e~vPAZi@G?1A`(ad`U2VwLKUmWorJ+<1IoX zP9k)4VwWE=|*W{$o!*(iQI$=bP@+HMM>FE?s`FM zOe7s(>3%p(Wb8D-eopR>0}qGXvJ7f!&uis}GAewL<4Bb)#3(t=;d7HFrT#Kr(P`0l zCr%Sj8$Rzs3k?gq^U|gu{WHU7?(y+)VBZi+R2OMCSh%r5Aa^4SCq z`iC#3CEEGvzWVA4n8ioU(Q}eEoc7BKg02MGPci7ulBR-ITbUX%@XBPVcmuwDLehpb zyy-LOzgj%(ogfmXn!g`eC@oCwxS>#ZuvaLgT^_Q9*kH{i%fDg4cKUdV%(Njl@gw^`Gy`)t&eDAXlB~r{7_y4vxFK( z%6*AQq?Fo;&}Sew9MaO+D?i^QM<|H*b{hjxY8v(U8tw)g*2Ip)*_Z# z7#bcNzfMt?Gi9uvy4YMW(`zYFkYA-)O+gg9S{P3e7ljt0bAVBB-W#H_EL%qV1px&m z@a^Sysi7l`3)j^h%ntt`lUO!uy@=mEBgyKbHiex-=>sQMVv&(8Kc~ehcnO{}&k(&$ zMGaoi2&oyF1?3ox#RRhYVa}}U4fbLgYixH-?qD0r8v9}AH1RaP;t+`3G-`jMF|%rA zuuxS$0d=540`L^-lnO8Um>_ma&I%63&s+TSL|b?XUoPkC*kHP1W-cP5{YK(#=3ASv z1Di6`V3CkrENU$zE{oX-$#rn^{4J3GoCB%BwjU*NsInVS;glL0CA0Beva$)rDd_yn z@W?0^W8>u1aLBXPU9&v^76B_UK>{HUPO-6@h>0qL;EAl!mbW~_Ijt{CA1~8EznH|Z zHro4%k02jO1>EwaMiVW#sF4LStt<)^q^=@#RcJ)FlzPG*3vWfpUa~fmD=)KDCvSy} z35~zC9|xsq9C#Xu7uot7m`sc~vr?{~DA~MJK8rbZ#N|`Q%jfq|*ZQK567sUjxyD~S z#wO3E&BjECYu$;|k`fsSL%$Bwg%wv>nh)zfXOH_gV7x678~fT9mY7NzNO&~(tw|)OukNK8cGIIQLdM-LgeKAA0fAc z8SE2zAesnz82q+E?z9i+5!gQc@j03+Y*4TIO{3eigt}iXz2o!8u2f&A-}Zz=mfuc| z)4hf=yi_+<37kZC&K7S?;%G!ZBqgVM0~E9u+4!SVz))gva3<_mzt0Hh&KOW^jgfrHpotXo$E<&T zhb<3+b{4C_bI@TS#K2IiGvKQs%rwe~UKr{UJ;lD&P(`3Ui9(|l1b`W4!Nbp1RV<+B zIt0|=`rcPPI|vqi;xk1IhAEh>urZ9He75DKfa~#hk*1-N!LrBiS~DW5F;NSV>|or= z(wQ*&5i(hf6Vt|qEgFAuGL!D5va_TRaM_Vf7C6*^erno%_EqX%wCU4eM7OC3_Xr`I zYhaM?S=mYy^1V%N**7AZR}&Yc>6ajuG_c5wwj^g$sw}*M;UGihj@Mysa$zny*x^)7 zg3jDg{g?K9LMOvT;eb*a)P)1-utc{68EAJ&4Nr)l&UK1@f%ZZl9qkahd)_DtPGomT zP9hb-fpN#Q>7wxd^<_oUCx$a$z)R^CHiWvd@p1q(@i!8^896L)D0}CPtMehm1X#ahgZu=+UNzEys_vZ5e5WCEn=4D0=!4&*o@K}!S-}N?Z|2Lg&!VI>rZ8kLj`}C&FbXRoa>3}rr4hFp{o~%Xycgm$hEnU zaYV}&NOeqkL{bA?m%_21m4qfJ&c^h)!wd)C7RmF+U-@jHpX90_1F0@;G!PPC`b+8@ z5Fov&DfBqFuc(_8r&W%}gMX5FX(<_o7DI&EIBH++TCQQkl&7m{Jl@E59(DdKKoWV!g5OXAigsZtT+2Yq>Vbu zXJ%nzL>D(45~XiTM-Gj4H0OSLG8NNx2HkHDV;em5-W%uG8wHEHQUL%5X~cuUEiu8R zPVgb(Q4oROEK^<^$dK}|y`O4CaI#p8UmtdpEU$g*wuaubG?J%wnEolii$fMewZJk? zm%$G#ZQ8?X5Qv?Wv%H3BvVZ2h)A)g8GuFjB1i`ztOh6eFXJuRS6;mQO>}uCCBCnZ4 zbjo2YuA{%un47t4axtwTTJe&$Xkv`Q0YFkPVJiOiXoS*a;DTT`qnHFhC;K|kM7?>} z?Bv_TC`WQyZ@)LK^R@iYW?s3_~%FeIzR(|8Hc0MAmI`XC%pRUpUxhxY-F_iCUCwv6jz3z?q8d zD&d&-rF{It$niWBgNdFik*dlQhj=RB6%`OL}J@ggliFCSX6rY_TcvlLK)8!?O?yl9? z3BWQ6ctKbrO0Ke%65?de&?XcUS>{j|=niTK%qhR|V5mZ}u1ySqYQLLT81xgU>Rm?S z@gL3rs75R4O8b`yyiUbe*IjAJ+_X9QB`J76$-p#8+C6>G8mF2!xqEJ@5H;1#6w_?z) zx=3iM5Jp65tOAuJ?_dg3N)0iwu_Q@QGhMDD_0dVN8;qJIV=$t%P;hA$&3|vY?FLe;Z9;@J%vpf}xE5(~4D2IiG5TKyo znRHkxVzp=}nSvO$aQf1vti!n-Ul`;Jpc$AMDH-T=M6(e5cu;7`3DlU8!+JEyn})mP zbV9I~YyG+g*(kBa@v z---+cV}K7WzpO=hoH8EWIc60_wtV?RdI!5vc$Qs@4TV%#P}$xr?`4m!V2tyIC<5^# z7P6PuZ|MYrn9n9_6>WGLf>as9Iz(Obiwxk>!s!@6SQspqpW+jEY*wu$NI#?s{wyJVIsJ&8j}KbC4BQEM!~4HT2(H*Tb zc|uTWVb|N;-VsS1OnoYL^2P1XGURR&yZgx%__^r)k)jo>mbQc#r$z2$TYc*Tp&7%_ z4w|#j1KQ!Fw$T}VujOvainS!8j>Bfp%g=T<^if!5&J*qQM5Q5)$>BwNPVN3LzczftpO+>VmBe@U5tEYQEhDhMbrO%bhA4*r9u z`tOh%{of?mU$>0|%#7pzUz)oxUdpYmtzoyJl>Cn&LjxU%0c6*TAk;V7GKpZuxw64b zUz-151_8rC*Z@t7m6o#+cD32O|L+keBNKIAhheShl*O?*6%Hy9`tPX#XhHzH0fyJA z&zARpl8<1>Q)$2^J@Q57^Zs)-rhxR4n_~;Wdj99^1$+EuC^}|IZI%CnB{Z@6n?~Wg z5G4NRRXWfc(pf#16N)yz1K_Unk5(owF3k%ZDp~L<4Jdkl@A%j@+l^zghKPvhGmrE6 z$%$R&HygD7>S4$supnNDh{`sOSL!zb@KjL<;qLEkBOpVPgdc4lZ;vBP%Q$8JwPr+y z>;%o441~qvwh8y+jUEesMO`1IXEW zA#xS^hvRTjiTO3OomY?tfo@S4+Tm{NEip)X*Ndwji@Gm zV1T6A0T9v*dd(GJ#N}&DhCBru% zqDsjQFs@*9Fp;poH_)L6&LUL1Dk`A7%8*QZ{Kp;lm4L_2rkf1YP!w|kkn!)Tk_F~4 zv!DRLi*cgb=2O#L@p zz@d@|`raP3yB(^jsa0uIf_Qd}x_xcWjsT7n03n4v&veYp%w%O{tF>wyL}8HEfBt;D z|HWXBK}_5YVB$pGfiJ!$CMHW&nts2}4LjUzRUH6mLI)IG0ncT(xY`>e!pR4aNsVU1 zc1u-v_dlF*ne;TU4lEgQel}Sm5@`VRCF(dZT3)BiiiT57b_MSJP8gmr)sa5Z^@g3? z2S18sP;ZcAiqSxsF@57{?_4PttF>p@mzw=+0j3j1*#>&E!CzBO0$3nu=&T=aOt!hc zFW2g8pDCL2F*7>>45mNXRkP!d*54PKSzNkpE``$4agjYeJ?y5J4vfc`Pm*hcgS&_M zK{(Wg1_mlg!_xo*oC*Io!=1?$C}N#ZRaGSx@JyF`->Jh%m-aQ;ut`+@FdE_C*z3T7 z8ibTTvWA2@>x`~ZFu_A|Pz19ASzl|H%Qk2v9Q~{9LK!&6YpX8=2rd_E&4&Qifoo36 zq}Os(`*kCZT{)>9Vr!8W@PbeBNRftttqbSnIH%p#dN;um=D@$?A*U zl7*>U(9VYUj zD&DtQ8XD<9&{wa(dg@~cxyvz-z-bLx19_zX5img4kE2PXPY(|T?7X~qg;La}-o`Fa ztu`T%UNR~wXyMyikceNYkak@w)k;-R?-?~eAac?JD~$*pog5iX8AC&yC%hsp9AJ!O zG|a-JL~Ekr!1eDCIY&c;;r~h&8epJJ2tr6Bn5Ks2_|h4)XXeU2|Ij5XiJeuwnX1f0 zQvpN%lmu)JoBwI^?GVX$}mrY@Sb}EMtGmku#_2=O8 z%L@RQ1(%P8!J+oW1M_>nzfVofWYqQWkW#q)SGOipT*Q+VS%8ZiOyTi;aRIh0yxk zf;>H2NkXZ_|I2%t1b}~bdR+i(caD%q+kI(^qkl&b&4yR?a(yz3r5K`)vH1IQ#TjNb ztSXc;5^t2t8=4#htZjO~n$u>_wByusa)&)vQ{SaT5{b|bGy$wbx+oop#d-K4nFX;WyL1u}gq-!#Dt#_@mIe+by1(=*}go|R!jx1_Z6wXae^V?n4j z?g}lV=5?OfoPfs(mF5J(kuKF-Q}OEE?d@L1<>nU5p4J{rjQ)*b^#gDN?DCj&s{aw6 zL~%i^tT%%?0u|?x{ivGtM!C2$96A!T;2gB*TGN-?_yoi@ab#x_QV`?s1$=U>q(p#pjs@O7A5A^zdos z)QYNP>cKU^Zs1-u!wn*42)D>VCKtuC#K7R7t2r6T^m>EeZ&GQ=QOVKa5o$p>S!Maj zi80COPdR4}esFLP@A&uy+S@vOac*w!ukLTIn6U9QXi7Mp#C!UOmzxf(q#eQ19HEX+ z5;0i|xtCAdsKq3sLnFf@G{P~nvWnvqQ)4qzQ{yvDUM}t~A3nH$@MPXOP@S6mF*-Us zDnP|r;NVgjfDgMbMPj_HZVjEHo1IMo-`;p*B?|pyl2vg(IXia4W%=3d^J98+VQF?@ z<7-8CezrP1&*=55l%Tkv(E1tC*)JmEGooL=h>1TmHMuo^_;B?JsKk;}(?8jFRY+caF)A4FDNDr7-AZZZnS)S)pMjE+gOZwoQdpQ?kUVmmk zeL6RAaHxxvlkjHtCYF34cQPvuaj{~IjqxDibqi#4YTxsp?a|Fw=baZ6-wMuXDK-l+ z#7-^le9lAZ`LS#$sp7bdRvkF>J9yoB`huTC!@f>H@F3|8w! z2PBv4mm_F~5el^N?pMO`at@NJ%kg8osb|e9%_<-#@eu^RT`o@=E9Zimb(+f*`M;ck zgDNScVk;)~ZISzJO5e?}FCAnpWD5Bu5%HyFesVM}SA4(r{cK-bca7jv9YNFjgf%2h zf=Hm>pY-I!GLA@*rOZtK)0qhUud~jZZrs-2QJGOZAGXiFw|+@j&+xCil>=kJLT{Y} zhtm*PBOF>;aOgIe^dqu#C8wl>{2(I#1&f3SVQuqZOE!N4WFVQ0y6jFrd6f!Gi==P) zsn(2uIIz}ioy}#RnUmuWl=Kz|8W*H5Wb0c%q=4~6K0KC7qgkra#jHkUG3o-B#ff^$ z27o5&W_=|a-QK+`2b2myJ3}$i>B0LkfDR{;i3nW;jS)4Q);7eFVh+b!EnNd11y5GE z#ca9?Qzpqr6a1kT8|%S{a3$F6ed1LMOM}brYwF7=p=bFx-w)fqdoeH^J0kc?1**j% z0Z)`M6-zLcDJm3r)U*{Qf}rOQdOe=IF~x6f8n)?+ZSM$0GBY%IYnt9GH(b&uTxDHr z9Jh@9_`yQ*=y&x!URip@`KP-|K8aR9eiQE)T0GF(L+ANw=;1FXXE?r0KR ze}wMuu=4EcYKFX}rG3?~_+UVr6{<_1D_=51P4-i^F!cSJGWXOHF~7SgmLT-lU?g_P zC0f`oUGv#T?Lv2-|hFC+v%r{UG&WM6wNO^ASY~r$-}bL7{EMak;kbw>KyqJ zp5?djLDRQuPet-BbVM+_I*9GL@gM_AorA;xoXzTY^3m1&>F(Fl>Ljk6NQd}mZVYic^Q)TS9V^kv#j%9~X+^I$48cbwU-&~1jnC|<5ZS~Gs zriX|C;hvy;VP_;_Gef{~8j9G!kcbjwvv)|Tec|w!9bOl&fOKns8!42b(YgfbY_s=` zp}vb^8mWIb83JYsZ_Tt33!$=W`!2+N6VM94hGgHiIVSM?7yGCX?`tbnos$U+1Wz^2 zp3wP7N~0~ikJgVs#@!!>(Z$oBjrAe}E%_%FDuGBuWI8v@Jy)2C!H0rR_&ACRb#D~!EPqdo*6xrYc zJvHug*@QT**bq`;Hclp3at94(b=Ld#O6Z`U-3iXbpa_*wQ^U}L-0_pRHC%QBd$5J4 zL_)#O*Ke&r@)<9}FxEzbTXbimE8*S6#RqObaV$G;9IY3nUc_kg$&>mx56wbI<#HTd&wGSt4u zUhlW8+!e|X9Nr6^#cKT(W#MPh*-o{q$ry0Ud9$R9BNQYQnA6#eaDm4P2geK|wM@l( zH&G64Rl#(3B%$_uR~yf>Lj-&`RL5eY=si+Jp{D2|{~VgHxc-rY?E_|frl)j`UOqtZ zeX;pr>X>eLlC!V|HKIe|2itRQwDuw+A#nunSlFy-t~BwlR4{@4TfRYBq@hA$t_WNp zzuAqXt6h9W_OFZytN!Dki=0i!8J;(X!!O}>;Sz2sp%s!K80%@i_dH+AC!A3B!h@VX+Ngwe zE>+k;YGH&hi(Y2n6KtDz-krPB-IyMIJePX^h&N~J>rU}D8Lc=mK9+iy{D+GAN>6gW zHfqhbYPj{XKY7m;>=mkD^k!&-m|Mtqn-m>A*IP(Ol@OI;pOKvw2Bw17CM^k6c>2J9cg?iE1POX&}_3YJ(A4kG_s%^wu1B zCq#C>R{tw^&FsKJY>|u3@Akx)nB(Qa_2b+SHOC@}c6VkC-# zjkfRCODx;<82_E3`2ASlfi3DT=`UfHg#EK!BVQMWS$Z)w#U6xvC6tgC0x2iqwIV6R znm(oq6^N0+F>7MK9j%9|L0$Mte_T`L_n!3^n;pJAtZbsI;wGG;ZrKi@la=!I!gNrh zhpnV$ThPtynn-wiybQa#sDY)cV-Yo<>0kQYeoRy{3PmhAP5b9r4rvkx_~*Y|AtP4x z@uT=D>C6(p%Zgv=je9o#(7%!4OD}Ksx0GcCDdsuB^04e7kAobCaUn97fs%LbtCwNe zS~IWDSN7rD03nm3SfRk1tB^@vsz&SCs?whf&=i>D6tUzIXws(wajz58 z-^@rb;pU7`&a`^ZPHP1`f5qe5X0b1!mzpT_5W>**<)zq+)Js_gXXbuR!N6fUag6Ub zI+HPPH!)qTP$RF|%Tm9#S4Xm*6?ME3Y_+S370Rj`;qR_{jPIEx+4vTG*wTF#6{K@q zMSy~@o$++7bN{XAe%%*q%+NOHylNS|ez(;RwHvlbP!E6i7wzDVfzU0ey=$RB*zMDX z%Lx2Z>RgNvJ5_kru*^IxrY1Ia@IOzb3hT`-ehQ)4zu{JA9jP!F zPgEn~V#S|)#+o58P=bO*wH&l=)Otadfhg2mQPAdcUQ0^&m_$~Mv<7|8Xx>AutAY1q zMaFP4{`uYlPOA~Jc&&`@OpcSVGY2N!^vyv9KaX_X9I_Od)DRFxJ2$0qShWNU>bY%X z7{FL?3HU#-&R3EDK(tFf!2QGm^IB+%rs@2UC&`;Trpg1Q*Ieg-9ZSX`cZ4 zX;+BLSAr7?KxhGx6FD(k4XVwIOvFZRX%)-MUK*^2nfESe`7)P}kqlVoT_u)SNLn8rs;B+2eY~LPI*3n`#ucnBnXX1HX zRj6yW_IlGt^aD!+oRh^U zR;PTNTY9oj6vs%Ss6;hOa}s96ILpS*dNvt!MG1VRDWEYVW394Pm1P)-f1__yRkmt4 zgpFd_ft3#|qVEw*9F}gt6j-e^oa%%|q@QKySnZZSyGFmC#LMt=e-A?Jt*RQAwf16e zI3Cm)Qq-y^u2xZQ#GES;unPB~TQ1xn-mb)mAp|s#G?tVL_aHd#4;C`J#DkZD?nf$n zsuC5FQ~^4GViu*eyu6r+_TdwUHQEXeVhND-MGB(Zg!(31fp32O`ntKSFNOhBU?JiO zf7k5wEr7B8I!l-=6*;acxX*f5x82>JiG+jab_VO2QlP(!=K9WgTiIhQ5$4XJKqGN5 zIPY#YFlpRzkRLW-mtMb;G2VaNM9CLt^|F>vpuKA2P9pAW&1dvnuvb=i+;$Eml|g&{ zpZa`Gq(4%iZk9yjPp?PtNN>YcaD*Z<9D_Dp1Fhenn9Fy)NGt-MIvW?{f(|5R=Tldg zb{$@2X8HZCVXMEXY2II2#W8baQB-9_$d3pKAmkxScuZ@ZHSeE&hi`qGwZ4;n%i{Ci zxng7a{HqS@j+otI3?Mw0>kNO?8;ewuxZ}ef09256wHCk(8x8K11Ghq}pQmi@)Y zbpB##OxG=YrHk?TftTk7gEJer@J_{WjO#WEA8`BPACP`;(oWQ1>A~<1KDv#ti=$dz5F@MpUoA3Q;rA3rKY%% z)>NdC&wJx(jg0Tl49pW-0O)DJC#;+oC@iqYcpjs?Mo~qc3-qb^|7(wkOyALkFKGS@ zOr|HL<^)SbpH7UQ*dCI5>b-&p<0m}}u2F5N5m7K$DRV?I_ThCHE|lNZ?nnNNiZE}` zq#y8xTSYgP=QC@>CI9ZA#5{3gMyZ=;*fgA)q`1$E=wNR(?JHFfQq4?w9Ac))PI6c_ zVwZ6ds&SZ@o*^}i{S<6*D8Igkc3aNQnSt&L3c}RDaKhc2n`3cG?fx6#5r{!rSy6tfr#k%L=fzvNyW@!d95|TjS$? zcKhMt9O-{`3V8i<=rSvcTCSY$8PL)12$i}uM1bGy0IidovX7UyPyyhO_rc}*^+w$m zW`I!qFRc1kP+%`H^5OLN`R1WoX}H>>?Ib#azHR$9u|I+4*!WmD+uhac zuJn1aWmKyuz6pBlO-&r>ibK^(iwN{w)9fh3(cOToh5<`6BK(?0nbhjlO zNsU0{D8@Kw`s(dBBQ1QLkBP=}myT^z5HasZ18w;Gsl&}T_4@-2t(vxpW}khpD%RNs z2};KGX2oCpA#?=a%JgqlBU*l3QpWjQ)|Z&QnR|XLR$CYHe^5~-__eilIsPucFD2}q z=XN@79kKu5bw3~p5oI_hiVz3jTd_*hisjmq5GXhR5gtg(EQZG+FtcB($~f0@PyYx0 z!$W@9PA+KpJP;xQC-g{2SSR+mw!7K98^&3#(+pA`eiFs6amv1yeJ2&20t$tMHe z^pO*17>mVk5s9ziWD7U;_mh9r#K72-^ihYM@x6qNW64KIgH*V7{b=J)a{Cat z{0CMOFXye5dgYZN=`o^PID(Hqo5IvvDQrewrd8*0vgj>Ry*;@?)#u8^$Wp1e_vu`~ z+xSSQd!e-N>a6u|K46*jIyv3+Ax%A;qt z&qFS=!8Jym$(!b&h!!}oIcZdYqx5bDYRecQdCZU{d_+z@zf5{XZC2FyvIQX3OH4>K z+kl)nJv%OrReslaC(17g&dbR-5GQCyr3*Hyj2mBbp!B+02&;x;=Z*Y`w4a) zX_w8$6`%qE>28FJ-{tQ%_hU6+yH4Xo10W{9zrS}m5!Hvj6{XJMLUS<(c7Fg(cLP3q z>2VSOzH$`|%5(}Dc@m(DOxYJrblwv*M*pnzqvT!8K}mC2c64hVo4}On57p8Wca1FpVjH`vM-D17dc*m#vUt4p6A7Lq+Ym9qI&c6XDcZ0H9mQ5qi zMtG22HLm49JxF*kKPXeF;0l{Az`4raScU6hpSGfqtg6Y%uGT(sVdF!T9W5{@=DiY29A`~U z0`0ffgAmoA00;f~=}7^)^AvU>{(JIC1?~QbJ_4iRPigdYv(1VbKLygh1njpDt-q0Q z{(5swVwEY4oKwub!=99Lw^sZTl2>>7BRMfo>~AC ze|eh^^B8rT=ino&qwcCoyogiqhTVdC#A`gJn)jN7zilLpovQk{u>Op5ri9 zybVwJjsNAsY%g;GdGUH=tXrw<~oO{?8mO?m;26Du~`(kUfdJ^#bj7>SW*)`;p8vsj|6OaD%=ZhR; zOIelGzQz)J|MyzNV9`+-)5MW{Eh@H8d~RiVrf2b_iN61~4)#fc@x;p&N)SA%-+^jB ze^n49t<%T*^J_r+8S4IQZ$EO(y}+1N${d~0IRdvHw#!eGl+D|O1MNMXP+>=~1|>4n z(h)6H9_k>G2blJQEGb@T2wDQPC96qawD@)RsIpt}s^7}wuA$`OhJ3R2{%s%{!<|)L zsE-NftN~+CI&L;kqe#10cYvbcc#?HX&3+eyej_t#8rl7VC6-AlguZrN-QSC_bQZ_k3a`)W~rUX`lYZoPvG zRd0v^2pl-LxGQb0B#_j%SZT2A5`}k&EKa#CQ6As876)?=UGQ+!EpCIeAq5dAxO0Nv zMC~LU9;ztEzmjZM=pXO&zhsk%4!wAcCR3qq$Eu$T&qOO;+v<>fqoQcdnTS^wQ$i!z zz`N$dU-QDb2>2j8)j!SG7Nj1&>+QeAP5|p!8P_`29TiN1$96tN%*fBU)-9Z*f&9a9 z(HM8Z93w9CN=C0In0uBl#3o1LF(azB*V}lP9ERa8M3n#~4ip#pNU6&M63jZ&OR_d) z)GBtLPmodix!x_&T{5zYza^Jc2UuMm-s|V4_}qIQ=lDN0_bIQXKA|7->Q+t=Zqu zmS2RHT`TO44CU84J~7^-GpHw!7n_ROa^Is$Y0&%nT4y(s($8ai{9|N-k;w`|g7wa7 zOgIf2&0v}oOeIVxC3|K3RY-6&7TW>94DjNZ_9`R-o{XS}xC~(9T~_E#++9;so>`L? z&HC_;tCxT^U3tt%W9o%u;YP2bN8S!fVYGyiQ(oGq0Q2ShAqG_cY^_^+U6{R#ks8O# zX_&#V0M6~}fHt2!3yTmON;d>rN@7xfsb zm^apWH+FS@k?(xZF+G4#yH8y*MNRnQ!>@>-^}Jp}%-?l{u`)0lXnS~9wxkZcCEevFzX?k^h9_+x;^Nsx-_RH298o4dL_I6v*8O;AtwuPkSWMvI43wPAD&(_$B@ zbz1q%ILDw}m&0j059~PmQ7Vrs8ua|&3jG8flDVHNZlv{X9_f3+>Bxyvyi0D#n_!iu1(|6^UXGVFrGFyp#huRCclO_WVoB7_W{*yMjqMzfO&3z(M9v zHF^W-6L+QeU1!3WV(teP0wQ#F9VTrn7l!0s4$916z=wZbZGYc4h>b6?l^^h$w%LC# z+Gd_qjWc6ST}s){#aKf-O412`PHRv5YhZyg@M##Ha#WU!hG`GJn3sR*(7R5Q{pLtQ z`zmKkWicXqRlfH-y%0U5G9_B%70JDKWrkOGlWY08$wUR+w?eH|(x?Y=yyh!1$lU;G zfA;u^_D^e<@Z0cY-;!dDvQYczk{{bUy-9gnjN|Bs^|eyyJ+P*bicu61mI{?ONrfLr z$HzT>&?QgnL(lv=zTQl?o^6~>4AvRsP3Q{KagDYIS0Xs)sV

MctP7R!ux|`w~7cpF#S*_7+Cg8LQ=9K|}S%Fck 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 E0OyX1wg3PC diff --git a/met/docs/Users_Guide/release-notes.rst b/met/docs/Users_Guide/release-notes.rst index 5bd26e9ea4..536170ede6 100644 --- a/met/docs/Users_Guide/release-notes.rst +++ b/met/docs/Users_Guide/release-notes.rst @@ -2,219 +2,165 @@ MET release notes _________________ When applicable, release notes are followed by the GitHub issue number which -describes the bugfix, enhancement, or new feature: `MET GitHub issues. `_ +describes the bugfix, enhancement, or new feature: +`MET GitHub issues. `_ -Version |version| release notes (|release_date|) ------------------------------------------------- +MET Version |version| release notes (|release_date|) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Version `10.0.0-beta5 `_ release notes (20210426) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -* Bugfixes: - - * Fix Grid-Diag bug when reading the same variable name from multiple data sources (`#1694 `_). - * Fix Stat-Analysis failure when aggregating ECNT lines (`#1706 `_). - * Fix intermittent PB2NC segfault when deriving PBL (`#1715 `_). - * Fix parsing error for floating point percentile thresholds, like ">SFP33.3" (`#1716 `_). - * Fix ascii2nc to handle bad records in little_r format (`#1737 `_). +* Repository and build: + + * **Migrate GitHub respository from the NCAR to DTCenter organization** (`#1462 `_). + * **Switch to consistent vX.Y.Z version numbering, from v10.0 to v10.0.0** (`#1590 `_). + * Switch from tagging releases as met-X.Y.Z to vX.Y.Z instead (`#1541 `_). + * Add a GitHub pull request template (`#1516 `_). + * Resolve warnings from autoconf (`#1498 `_). + * Restructure nightly builds (`#1510 `_). + * Update the MET unit test logic by unsetting environment variables after each test to provide a clean environment for the next (`#1624 `_). + * Run the nightly build as the shared met_test user (`#1116 `_). + * Correct the time offset for tests in unit_plot_data_plane.xml (`#1677 `_). + * Enhance the sample plotting R-script to read output from different versions of MET (`#1653 `_). * Documentation: - * Migrate the MET documetation to Read the Docs (`#1649 `_). + * **Migrate the MET documentation to Read the Docs** (`#1649 `_). + * Enhance and update documentation (`#1459 `_ and `#1460 `_). + * Update comments at the top of each MET config file directing users to the MET User's Guide (`#1598 `_). + * Migrate content from README and README_TC in data/config to the MET User's Guide (`#1474 `_). + * Add version selector to the Sphinx documentation page (`#1461 `_). + * Make bolding consistent across the documentation (`#1458 `_). + * Implement hanging indents for references (`#1457 `_). + * Correct typos and spelling errors (`#1456 `_). + * Update the Grid-Diag documentation to clarify the -data command line option (`#1611 `_). + * Documentation updates to correct typos and apply consistent formatting (`#1455 `_). + * Correct the definition of H_RATE and PODY in MET User's Guide Appendix C (`#1631 `_). * Library code: - * Miscellaneous: - - * Add support for climatological probabilities for complex CDP thresholds, like >=CDP33&&<=CDP67 (`#1705 `_). + * Bugfixes: - * NetCDF library: + * Apply the GRIB ensemble filtering option (GRIB_ens) whenever specified by the user (`#1604 `_). + * Fix the set_attr_accum option to set the accumulation time instead of the lead time (`#1646 `_). + * Fix ASCII file list parsing logic (`#1484 `_ and `#1508 `_). + * Fix parsing error for floating point percentile thresholds, like ">SFP33.3" (`#1716 `_). - * Extend CF-compliant NetCDF file support when defining the time dimension as a time string (`#1755 `_). - - * Python embedding: + * Python embedding enhancements: - * Replace the pickle format for temporary python files with NetCDF for gridded data (`#1319 `_, `#1697 `_). - * Replace the pickle format for temporary python files with ASCII for point observations in ascii2nc and matched pair data in Stat-Analysis (`#1319 `_, `#1700 `_). - * Enhance python embedding to support the "grid" being defined as a named grid or specification string (`#1471 `_). - * Enhance the python embedding library code to parse python longlong variables as integers to make the python embedding scripts less particular (`#1747 `_). + * **Replace the pickle format for temporary python files with NetCDF for gridded data** (`#1319 `_, `#1697 `_). + * **Replace the pickle format for temporary python files with ASCII for point observations in ascii2nc and matched pair data in Stat-Analysis** (`#1319 `_, `#1700 `_). + * **Complete support for Python XArray embedding** (`#1534 `_). + * Treat gridded fields of entirely missing data as missing files and fix python embedding to call common data processing code (`#1494 `_). + * Clarify error messages for Xarray python embedding (`#1472 `_). + * Add support for Gaussian grids with python embedding (`#1477 `_). + * Correct error messages from python embedding (`#1473 `_). + * Enhance to support the "grid" being defined as a named grid or specification string (`#1471 `_). + * Enhance to parse python longlong variables as integers to make the python embedding scripts less particular (`#1747 `_). * Fix the read_ascii_mpr.py python embedding script to pass all 37 columns of MPR data to Stat-Analysis (`#1620 `_). * Fix the read_tmp_dataplane.py python embedding script to handle the fill value correctly (`#1753 `_). -* Application code: - - * Point-Stat and Grid-Stat Tools: - - * Enhance Point-Stat and Grid-Stat by adding mpr_column and mpr_thresh configuration options to filter out matched pairs based on large fcst, obs, and climo differences (`#1575 `_). - - * Stat-Analysis Tool: - - * Enhance Stat-Analysis to process multiple output thresholds and write multiple output line types in a single aggregate_stat job (`#1735 `_). - * Enhance Stat-Analysis to skip writing job output to the logfile when the -out_stat option is provided (`#1736 `_). - * Enhance Stat-Analysis by adding a -column_exc job command option to exclude lines based on string values (`#1733 `_). - - * MET-TC Tools: - - * Fix TC-Pairs to report the correct number of lines read from input track data files (`#1725 `_). - * Enhance TC-Stat by adding a -column_exc job command option to exclude lines based on string values (`#1733 `_). - * Enhance the TC-Gen matching logic and update several config options to support its S2S application (`#1714 `_). - -Version `10.0.0-beta4 `_ release notes (20210302) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -* Bugfixes: - - * Fix the set_attr_accum option to set the accumulation time instead of the lead time (`#1646 `_). - * Correct the time offset for tests in unit_plot_data_plane.xml (`#1677 `_). - -* Repository and build: - - * Enhance the sample plotting R-script to read output from different versions of MET (`#1653 `_). - -* Library code: - * Miscellaneous: + * **Enhance support for rotated latlon grids and update related documentation** (`#1574 `_). + * Parse the -v and -log options prior to application-specific command line options (`#1527 `_). * Update GRIB1/2 table entries for the MXUPHL, MAXREF, MAXUVV, and MAXDVV variables (`#1658 `_). * Update the Air Force GRIB tables to reflect current AF usage (`#1519 `_). * Enhance the DataLine::get_item() error message to include the file name, line number, and column (`#1429 `_). + * Add support for climatological probabilities for complex CDP thresholds, like >=CDP33&&<=CDP67 (`#1705 `_). + * Update the NCL-derived color tables (`#1568 `_). * NetCDF library: + * Enhance to support additional NetCDF data types (`#1492 `_ and `#1493 `_). * Add support for the NetCDF-CF conventions time bounds option (`#1657 `_). + * Extend CF-compliant NetCDF file support when defining the time dimension as a time string (`#1755 `_). * Error out when reading CF-compliant NetCDF data with incomplete grid definition (`#1454 `_). * Reformat and simplify the magic_str() printed for NetCDF data files (`#1655 `_). + * Parse the "init_time" and "valid_time" attributes from MET NetCDF input files (`#1346 `_). * Statistics computations: - * Add support for the Hersbach CRPS algorithm by add new columns to the ECNT line type (`#1450 `_). + * **Modify the climatological Brier Score computation to match the NOAA/EMC VSDB method** (`#1684 `_). + * **Add support for the Hersbach CRPS algorithm by add new columns to the ECNT line type** (`#1450 `_). * Enhance MET to derive the Hersbach CRPSCL_EMP and CRPSS_EMP statistics from a single deterministic reference model (`#1685 `_). * Correct the climatological CRPS computation to match the NOAA/EMC VSDB method (`#1451 `_). - * Modify the climatological Brier Score computation to match the NOAA/EMC VSDB method (`#1684 `_). + * Refine log messages when verifying probabilities (`#1502 `_). * Application code: - * ASCII2NC and Point2Grid: - - * Enhance ascii2nc and point2grid to gracefully process zero input observations rather than erroring out (`#1630 `_). - - * Point-Stat Tool: - - * Enhance the validation of masking regions to check for non-unique masking region names (`#1439 `_). - * Print the Point-Stat rejection code reason count log messages at verbosity level 2 for zero matched pairs (`#1644 `_). - * Add detailed log messages to Point-Stat when discarding observations (`#1588 `_). + * ASCII2NC Tool: - * Stat-Analysis Tool: + * Fix to handle bad records in little_r format (`#1737 `_). + * Create empty output files for zero input observations instead of erroring out (`#1630 `_). - * Add -fcst_init_inc/_exc and -fcst_valid_inc/_exc job command filtering options to Stat-Analysis (`#1135 `_). + * MADIS2NC Tool: - * MODE Tool: + * Clarify various error messages (`#1409 `_). - * Update the MODE AREA_RATIO output column to list the forecast area divided by the observation area (`#1643 `_). + * PB2NC Tool: -Version `10.0.0-beta3 `_ release notes (20210127) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * Fix intermittent segfault when deriving PBL (`#1715 `_). -* Bugfixes: + * Point2Grid Tool: - * Correct the climatological CDF values in the Grid-Stat NetCDF matched pairs output files, and correct the climatological probability values for climatgological distribution percentile (CDP) threshold types (`#1638 `_). - * Apply the GRIB ensemble filtering option (GRIB_ens) whenever specified by the user (`#1604 `_). + * **Support additional NetCDF point observation data sources** (`#1345 `_, `#1509 `_, and `#1511 `_). + * Support the 2-dimensional time variable in Himawari data files (`#1580 `_). + * Create empty output files for zero input observations instead of erroring out (`#1630 `_). + * Improve the point2grid runtime performance (`#1421 `_). + * Process point observations by variable name instead of GRIB code (`#1408 `_). -* Repository and build: + * Plot-Point-Obs Tool: - * Update the MET unit test logic by unsetting environment variables after each test to provide a clean environment for the next (`#1624 `_). + * **Overhaul Plot-Point-Obs to make it highly configurable** (`#213 `_, `#1528 `_, and `#1052 `_). + * Support regridding option in the config file (`#1627 `_). -* Documentation: - - * Update the Grid-Diag documentation to clarify the -data command line option (`#1611 `_). - * Documentation updates to correct typos and apply consistent formatting (`#1455 `_). - * Correct the definition of H_RATE and PODY in MET User's Guide Appendix C (`#1631 `_). + * Point-Stat Tool: -* Library code: - - * When reading MET NetCDF files, parse the "init_time" and "valid_time" attributes (`#1346 `_). - * Python embedding enhancements: + * **Add mpr_column and mpr_thresh configuration options to filter out matched pairs based on large fcst, obs, and climo differences** (`#1575 `_). + * **Print the rejection code reason count log messages at verbosity level 2 for zero matched pairs** (`#1644 `_). + * **Add detailed log messages when discarding observations** (`#1588 `_). + * Update log messages (`#1514 `_). + * Enhance the validation of masking regions to check for non-unique masking region names (`#1439 `_). - * Complete support for Python XArray embedding (`#1534 `_). - * Correct error messages from Python embedding (`#1473 `_). - -* Application code: + * Grid-Stat Tool: - * Enhance Plot-Point-Obs to support regridding in the config file (`#1627 `_). - * Update ASCII2NC and Point2Grid to create empty output files for zero input observations instead of erroring out (`#1630 `_). - * Point2Grid Tool: + * **Add mpr_column and mpr_thresh configuration options to filter out matched pairs based on large fcst, obs, and climo differences** (`#1575 `_). + * Correct the climatological CDF values in the NetCDF matched pairs output files and correct the climatological probability values for climatgological distribution percentile (CDP) threshold types (`#1638 `_). - * Improve the Point2Grid runtime performance (`#1421 `_). - * Process point observations by variable name instead of GRIB code (`#1408 `_). - * Support the 2-dimensional time variable in Himawari data files (`#1580 `_). + * Stat-Analysis Tool: - * TC-Gen Tool: + * **Process multiple output thresholds and write multiple output line types in a single aggregate_stat job** (`#1735 `_). + * Skip writing job output to the logfile when the -out_stat option is provided (`#1736 `_). + * Add -fcst_init_inc/_exc and -fcst_valid_inc/_exc job command filtering options to Stat-Analysis (`#1135 `_). + * Add -column_exc job command option to exclude lines based on string values (`#1733 `_). + * Fix Stat-Analysis failure when aggregating ECNT lines (`#1706 `_). - * Overhaul the Tropical Cyclone genesis matching logic, add the development and operational scoring algorithms, and add many config file options (`#1448 `_). - * Add config file options to filter data by initialization time (init_inc and init_exc) and hurricane basin (basin_mask) (`#1626 `_). - * Add the genesis matched pair (GENMPR) output line type (`#1597 `_). - * Add a gridded NetCDF output file with counts for genesis events and track points (`#1430 `_). + * Grid-Diag Tool: -Version `10.0.0-beta2 `_ release notes (20201207) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * Fix bug when reading the same variable name from multiple data sources (`#1694 `_). -* Repository and build: + * MODE Tool: - * Switch from tagging releases as met-X.Y.Z to vX.Y.Z instead (`#1541 `_). - * Switch to consistent vX.Y.Z version numbering, from v10.0 to v10.0.0 (`#1590 `_). - * Run the nightly build as the shared met_test user (`#1116 `_). + * **Update the MODE AREA_RATIO output column to list the forecast area divided by the observation area** (`#1643 `_). + * **Incremental development toward the Multivariate MODE tool** (`#1282 `_, `#1284 `_, and `#1290 `_). -* Documentation: - - * Update comments at the top of each MET config file directing users to the MET User's Guide (`#1598 `_). - * Migrate content from README and README_TC in data/config to the MET User's Guide (`#1474 `_). - * Add version selector to the Sphinx documentation page (`#1461 `_). - * Make bolding consistent across the documentation (`#1458 `_). - * Implement hanging indents for references (`#1457 `_). - * Correct typos and spelling errors (`#1456 `_). + * TC-Pairs Tool: -* Library code: - - * Enhance support for rotated latlon grids and update related documentation (`#1574 `_). - * Update the NCL-derived color tables (`#1568 `_). - * Parse the -v and -log options prior to application-specific command line options (`#1527 `_). - * Treat gridded fields of entirely missing data as missing files and fix python embedding to call common data processing code (`#1494 `_). - -* Application code: - - * Overhaul the plot_point_obs tool to make it highly configurable (`#213 `_, `#1528 `_, and `#1052 `_). - * Add new ioda2nc tool (`#1355 `_). - * Incremental development toward the Multivariate MODE tool (`#1282 `_, `#1284 `_, and `#1290 `_). + * Fix to report the correct number of lines read from input track data files (`#1725 `_). + * Fix to read supported RI edeck input lines and ignore unsupported edeck probability line types (`#1768 `_). -Version `10.0.0-beta1 `_ release notes (20201022) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * TC-Stat Tool: -* Bugfixes since the version 9.1 release: - - * Clarify madis2nc error messages (`#1409 `_). - * Fix tc_gen lead window filtering option (`#1465 `_). - * Clarify error messages for Xarray python embedding (`#1472 `_). - * Add support for Gaussian grids with python embedding (`#1477 `_). - * Fix ASCII file list parsing logic (`#1484 `_ and `#1508 `_). + * Add -column_exc job command option to exclude lines based on string values (`#1733 `_). -* Repository and build: - - * Migrate GitHub respository from the NCAR to DTCenter organization (`#1462 `_). - * Add a GitHub pull request template (`#1516 `_). - * Resolve warnings from autoconf (`#1498 `_). - * Restructure nightly builds (`#1510 `_). + * TC-Gen Tool: -* Documentation: - - * Enhance and update documentation (`#1459 `_ and `#1460 `_). + * **Overhaul the genesis matching logic, add the development and operational scoring algorithms, and add many config file options** (`#1448 `_). + * Add config file options to filter data by initialization time (init_inc and init_exc) and hurricane basin (basin_mask) (`#1626 `_). + * Add the genesis matched pair (GENMPR) output line type (`#1597 `_). + * Add a gridded NetCDF output file with counts for genesis events and track points (`#1430 `_). + * Enhance the matching logic and update several config options to support its S2S application (`#1714 `_). + * Fix lead window filtering option (`#1465 `_). -* Library code: - - * Refine log messages when verifying probabilities (`#1502 `_). - * Enhance NetCDF library code to support additional data types (`#1492 `_ and `#1493 `_). + * IODA2NC Tool: -* Application code: - - * Update point_stat log messages (`#1514 `_). - * Enhance point2grid to support additional NetCDF point observation data sources (`#1345 `_, `#1509 `_, and `#1511 `_). + * **Add the new ioda2nc tool** (`#1355 `_). diff --git a/met/docs/conf.py b/met/docs/conf.py index 7abb9ffef0..5d54deb22a 100644 --- a/met/docs/conf.py +++ b/met/docs/conf.py @@ -19,7 +19,7 @@ project = 'MET' author = 'UCAR/NCAR, NOAA, CSU/CIRA, and CU/CIRES' -author_list = 'Brown, B., Bullock, R., Fowler, T., Halley Gotway, J., Newman, K., Jensen, T.' +author_list = 'Bullock, R., Fowler, T., Halley Gotway, J., Newman, K., Jensen, T., Brown, B.' version = 'develop' verinfo = version release = f'{version}' From 205c4a837b5ed8e68dd7ec32d42766b16929fa5d Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Wed, 28 Apr 2021 14:22:41 -0600 Subject: [PATCH 113/165] Committing hotfix to the develop branch to fix a bad merge that caused the MET compilation to fail. --- met/src/basic/vx_util/python_line.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/met/src/basic/vx_util/python_line.cc b/met/src/basic/vx_util/python_line.cc index 8afa48d6d7..75b838427c 100644 --- a/met/src/basic/vx_util/python_line.cc +++ b/met/src/basic/vx_util/python_line.cc @@ -442,7 +442,6 @@ script = new Python3_Script (wrapper.text()); mlog << Debug(4) << "Reading temporary Python line data file: " << tmp_ascii_path << "\n"; - << pickle_path << "\n"; script->import_read_tmp_ascii_py(); From b32edba0e23820cea04f5831f49ba8babfdd08ef Mon Sep 17 00:00:00 2001 From: jprestop Date: Thu, 29 Apr 2021 12:55:10 -0600 Subject: [PATCH 114/165] Update compile_MET_all.sh Added "-L${LIB_LIBPNG}" to rpath to fix problem on WCOSS" --- scripts/installation/compile_MET_all.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/installation/compile_MET_all.sh b/scripts/installation/compile_MET_all.sh index 5ef855cb24..0d11f4f8fd 100755 --- a/scripts/installation/compile_MET_all.sh +++ b/scripts/installation/compile_MET_all.sh @@ -68,7 +68,7 @@ export LD_LIBRARY_PATH=${TEST_BASE}/external_libs/lib:${MET_PYTHON}/lib:${MET_NE echo "LD_LIBRARY_PATH = ${LD_LIBRARY_PATH}" # Constants -if [ [ -z ${MET_GRIB2CLIB} && -z ${MET_GRIB2CINC} ] ]; then +if [[ -z ${MET_GRIB2CLIB} && -z ${MET_GRIB2CINC} ]]; then COMPILE_ZLIB=1 COMPILE_LIBPNG=1 COMPILE_JASPER=1 @@ -750,7 +750,7 @@ if [ $COMPILE_MET -eq 1 ]; then export LDFLAGS="-Wl,--disable-new-dtags" export LDFLAGS="${LDFLAGS} -Wl,-rpath,${LIB_DIR}/lib:${MET_NETCDF}/lib:${MET_HDF5}/lib:${MET_BUFRLIB}:${MET_GRIB2CLIB}:${MET_PYTHON}/lib:${MET_GSL}/lib" export LDFLAGS="${LDFLAGS} -Wl,-rpath,${LIB_JASPER}:${LIB_LIBPNG}:${LIB_Z}" - export LDFLAGS="${LDFLAGS} -L${LIB_JASPER} -L${MET_HDF5}/lib" + export LDFLAGS="${LDFLAGS} -L${LIB_JASPER} -L${LIB_LIBPNG} -L${MET_HDF5}/lib" export LIBS="${LIBS} -lhdf5_hl -lhdf5 -lz" export MET_FONT_DIR=${TEST_BASE}/fonts From 30417be041f85ca9c9f883649d4c8f7e19e69ccd Mon Sep 17 00:00:00 2001 From: jprestop Date: Mon, 3 May 2021 14:40:52 -0600 Subject: [PATCH 115/165] Update pull_request_template.md Added entry for completion date of pull request review. --- .github/pull_request_template.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index a475d51459..3c7ad6b33b 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -11,6 +11,8 @@ - [ ] Will this PR result in changes to the test suite? **[Yes or No]**
If **yes**, describe the new output and/or changes to the existing output:
+- [ ] Please complete this pull request review by **[Fill in date]**.
+ ## Pull Request Checklist ## See the [METplus Workflow](https://dtcenter.github.io/METplus/Contributors_Guide/github_workflow.html) for details. - [ ] Complete the PR definition above. From cfe37eab9b1d453d1790372fadb7dea36b24f0e7 Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Mon, 3 May 2021 15:01:55 -0600 Subject: [PATCH 116/165] Per #1731, add ioda2nc documentation. --- met/docs/Users_Guide/data_io.rst | 30 +++-- met/docs/Users_Guide/overview.rst | 2 +- met/docs/Users_Guide/reformat_point.rst | 145 +++++++++++++++++++++++- 3 files changed, 160 insertions(+), 17 deletions(-) diff --git a/met/docs/Users_Guide/data_io.rst b/met/docs/Users_Guide/data_io.rst index 2a97f546c5..3dd4552ab9 100644 --- a/met/docs/Users_Guide/data_io.rst +++ b/met/docs/Users_Guide/data_io.rst @@ -10,13 +10,13 @@ Data must often be preprocessed prior to using it for verification. Several MET Input data formats __________________ -The MET package can handle gridded input data in one of four formats: GRIB version 1, GRIB version 2, NetCDF files following the Climate and Forecast (CF) conventions, and NetCDF files produced by the MET tools themselves. MET supports standard NCEP, USAF, UKMet Office and ECMWF grib tables along with custom, user-defined GRIB tables and the extended PDS including ensemble member metadata. See :numref:`Configuration File Details` for more information. Point observation files may be supplied in either PrepBUFR, ASCII, or MADIS format. Note that MET does not require the Unified Post-Processor to be used, but does require that the input GRIB data be on a standard, de-staggered grid on pressure or regular levels in the vertical. While the Grid-Stat, Wavelet-Stat, MODE, and MTD tools can be run on a gridded field at virtually any level, the Point-Stat tool can only be used to verify forecasts at the surface or on pressure or height levels. MET does not interpolate between native model vertical levels. +The MET package can handle multiple gridded input data formats: GRIB version 1, GRIB version 2, and NetCDF files following the Climate and Forecast (CF) conventions, containing WRF output post-processed using wrf_interp, or produced by the MET tools themselves. MET supports standard NCEP, USAF, UKMet Office and ECMWF GRIB tables along with custom, user-defined GRIB tables and the extended PDS including ensemble member metadata. See :numref:`Configuration File Details` for more information. Point observation files may be supplied in either PrepBUFR, ASCII, or MADIS format. Note that MET does not require the Unified Post-Processor to be used, but does require that the input GRIB data be on a standard, de-staggered grid on pressure or regular levels in the vertical. While the Grid-Stat, Wavelet-Stat, MODE, and MTD tools can be run on a gridded field at virtually any level, the Point-Stat tool can only be used to verify forecasts at the surface or on pressure or height levels. MET does not interpolate between native model vertical levels. When comparing two gridded fields with the Grid-Stat, Wavelet-Stat, Ensemble-Stat, MODE, MTD, or Series-Analysis tools, the input model and observation datasets must be on the same grid. MET will regrid files according to user specified options. Alternatively, outside of MET, the copygb and wgrib2 utilities are recommended for re-gridding GRIB1 and GRIB2 files, respectively. To preserve characteristics of the observations, it is generally preferred to re-grid the model data to the observation grid, rather than vice versa. -Input point observation files in PrepBUFR format are available through NCEP. The PrepBUFR observation files contain a wide variety of point-based observation types in a single file in a standard format. However, some users may wish to use observations not included in the standard PrepBUFR files. For this reason, prior to performing the verification step in the Point-Stat tool, the PrepBUFR file is reformatted with the PB2NC tool. In this step, the user can select various ways of stratifying the observation data spatially, temporally, and by type. The remaining observations are reformatted into an intermediate NetCDF file. The ASCII2NC tool may be used to convert ASCII point observations that are not available in the PrepBUFR files into this NetCDF format for use by the Point-Stat verification tool. Users with METAR or RAOB data from MADIS can convert these observations into NetCDF format with the MADIS2NC tool, then use them with the Point-Stat or Ensemble-Stat verification tools. +Input point observation files in PrepBUFR format are available through NCEP. The PrepBUFR observation files contain a wide variety of point-based observation types in a single file in a standard format. However, some users may wish to use observations not included in the standard PrepBUFR files. For this reason, prior to performing the verification step in the Point-Stat tool, the PrepBUFR file is reformatted with the PB2NC tool. In this step, the user can select various ways of stratifying the observation data spatially, temporally, and by type. The remaining observations are reformatted into an intermediate NetCDF file. The ASCII2NC tool may be used to convert ASCII point observations that are not available in the PrepBUFR files into this common NetCDF point observation format. Several other MET tools, described below, are also provided to reformat point observations into this common NetCDF point observation format prior to passing them as input to the Point-Stat or Ensemble-Stat verification tools. -Tropical cyclone forecasts and observations are typically provided in a specific ASCII format, in A Deck and B Deck files. +Tropical cyclone forecasts and observations are typically provided in a specific ATCF (Automated Tropical Cyclone Forecasting) ASCII format, in A-deck, B-deck, and E-deck files. .. _Intermediate data formats: @@ -55,32 +55,38 @@ The following is a summary of the input and output formats for each of the tools #. **PB2NC Tool** - * **Input**: One PrepBUFR point observation file and one configuration file. + * **Input**: PrepBUFR point observation file(s) and one configuration file. * **Output**: One NetCDF file containing the observations that have been retained. #. **ASCII2NC Tool** - * **Input**: One or more ASCII point observation file(s) that has (have) been formatted as expected, and optional configuration file. + * **Input**: ASCII point observation file(s) that has (have) been formatted as expected, and optional configuration file. * **Output**: One NetCDF file containing the reformatted observations. #. **MADIS2NC Tool** - * **Input**: One MADIS point observation file. + * **Input**: MADIS point observation file(s) in NetCDF format. * **Output**: One NetCDF file containing the reformatted observations. #. **LIDAR2NC Tool** - * **Input**: One CALIPSO satellite HDF file + * **Input**: One CALIPSO satellite HDF file. + + * **Output**: One NetCDF file containing the reformatted observations. + +#. **IODA2NC Tool** + + * **Input**: IODA observation file(s) in NetCDF format. * **Output**: One NetCDF file containing the reformatted observations. #. **Point2Grid Tool** - * **Input**: One NetCDF file containing point observation from the ASCII2NC, PB2NC, MADIS2NC, or LIDAR2NC tool. + * **Input**: One NetCDF file in the common point observation format. * **Output**: One NetCDF file containing a gridded representation of the point observations. @@ -116,7 +122,7 @@ The following is a summary of the input and output formats for each of the tools #. **Point-Stat Tool** - * **Input**: One gridded model file, at least one point observation file in NetCDF format (as the output of the PB2NC, ASCII2NC, MADIS2NC, or LIDAR2NC tool), and one configuration file. + * **Input**: One gridded model file, at least one NetCDF file in the common point observation format, and one configuration file. * **Output**: One STAT file containing all of the requested line types and several ASCII files for each line type requested. @@ -194,9 +200,9 @@ The following is a summary of the input and output formats for each of the tools #. **TC-Pairs Tool** - * **Input**: At least one A-deck and one B-deck ATCF format file containing output from a tropical cyclone tracker and one configuration file. The A-deck files contain forecast tracks while the B-deck files are typically the NHC Best Track Analysis but could also be any ATCF format reference. + * **Input**: At least one A-deck or E-deck file and one B-deck ATCF format file containing output from a tropical cyclone tracker and one configuration file. The A-deck files contain forecast tracks, the E-deck files contain forecast probabilities, and the B-deck files are typically the NHC Best Track Analysis but could also be any ATCF format reference. - * **Output**: ASCII output with the suffix .tcstat. + * **Output**: ASCII output with the suffix .tcst. #. **TC-Stat Tool** @@ -208,7 +214,7 @@ The following is a summary of the input and output formats for each of the tools * **Input**: One or more Tropical Cyclone genesis format files, one or more verifying operational and BEST track files in ATCF format, and one configuration file. - * **Output**: One STAT file containing all of the requested line types and several ASCII files for each line type requested. + * **Output**: One STAT file containing all of the requested line types, several ASCII files for each line type requested, and one gridded NetCDF file containing counts of track points. #. **TC-RMW Tool** diff --git a/met/docs/Users_Guide/overview.rst b/met/docs/Users_Guide/overview.rst index 9450a2e3af..733255d409 100644 --- a/met/docs/Users_Guide/overview.rst +++ b/met/docs/Users_Guide/overview.rst @@ -57,7 +57,7 @@ The MODE (Method for Object-based Diagnostic Evaluation) tool also uses gridded The MODE-TD tool extends object-based analysis from two-dimensional forecasts and observations to include the time dimension. In addition to the two dimensional information provided by MODE, MODE-TD can be used to examine even more features including displacement in time, and duration and speed of moving areas of interest. -The Grid-Diag tools produce multivariate probability density functions (PDFs) that may be used either for exploring the relationship between two fields, or for the computation of percentiles generated from the sample for use with percentile thresholding. The output from this tool requires post-processing by METplus or user-provided utilities. +The Grid-Diag tool produces multivariate probability density functions (PDFs) that may be used either for exploring the relationship between two fields, or for the computation of percentiles generated from the sample for use with percentile thresholding. The output from this tool requires post-processing by METplus or user-provided utilities. The Wavelet-Stat tool decomposes two-dimensional forecasts and observations according to the Intensity-Scale verification technique described by :ref:`Casati et al. (2004) `. There are many types of spatial verification approaches and the Intensity-Scale technique belongs to the scale-decomposition (or scale-separation) verification approaches. The spatial scale components are obtained by applying a wavelet transformation to the forecast and observation fields. The resulting scale-decomposition measures error, bias and skill of the forecast on each spatial scale. Information is provided on the scale dependency of the error and skill, on the no-skill to skill transition scale, and on the ability of the forecast to reproduce the observed scale structure. The Wavelet-Stat tool is primarily used for precipitation fields. However, the tool can be applied to other variables, such as cloud fraction. diff --git a/met/docs/Users_Guide/reformat_point.rst b/met/docs/Users_Guide/reformat_point.rst index 2dfdce4b1c..17a73fec15 100644 --- a/met/docs/Users_Guide/reformat_point.rst +++ b/met/docs/Users_Guide/reformat_point.rst @@ -599,13 +599,13 @@ MADIS2NC tool _____________ -This section describes how to run the MADIS2NC tool. The MADIS2NC tool is used to reformat `Meteorological Assimilation Data Ingest System (MADIS) `_ point observations into the NetCDF format expected by the MET statistics tools. Since the MADIS2NC tool simply performs a reformatting step, no configuration file is needed. The MADIS2NC tool supports many of the MADIS data types, as listed in the usage statement below. Support for additional MADIS data types may be added in the future based on user feedback. +This section describes how to run the MADIS2NC tool. The MADIS2NC tool is used to reformat `Meteorological Assimilation Data Ingest System (MADIS) `_ point observations into the NetCDF format expected by the MET statistics tools. An optional configuration file controls the processing of the point observations. The MADIS2NC tool supports many of the MADIS data types, as listed in the usage statement below. Support for additional MADIS data types may be added in the future based on user feedback. madis2nc usage ~~~~~~~~~~~~~~ -The usage statement for MADIS2NC tool is shown below: +The usage statement for the MADIS2NC tool is shown below: .. code-block:: none @@ -635,7 +635,7 @@ Required arguments for madis2nc 1. The **madis_file** argument is one or more input MADIS point observation files to be processed. -2. The **netcdf_file** argument is the NetCDF output file to be written. +2. The **out_file** argument is the NetCDF output file to be written. 3. The argument **-type str** is a type of MADIS observations (metar, raob, profiler, maritime, mesonet or acarsProfiles). @@ -778,7 +778,6 @@ We will not give a detailed description of each CALIPSO data product that lidar2 **Layer_Base** gives the elevation in meters above ground level of the cloud base for each cloud level at each observation location. Similarly, **Layer_Top** gives the elevation of the top of each cloud layer. Note that if there are multiple cloud layers at a particular location, then there will be more than one base (or top) given for that location. For convenience, **Min_Base** and **Max_Top** give, respectively, the base elevation for the bottom cloud layer, and the top elevation for the top cloud layer. For these data types, there will be only one value per observation location regardless of how many cloud layers there are at that location. - .. _lidar2nc_grib_code_table: .. list-table:: lidar2nc GRIB codes and their meaning, units, and abbreviations @@ -837,7 +836,145 @@ We will not give a detailed description of each CALIPSO data product that lidar2 - Horizontal Averaging - NA - Horizontal_Averaging + + +IODA2NC tool +____________ + + +This section describes the IODA2NC tool which is used to reformat IODA (Interface for Observation Data Access) point observations from the `Joint Center for Satellite Data Assimilation (JCSDA) `_ into the NetCDF format expected by the MET statistics tools. An optional configuration file controls the processing of the point observations. The IODA2NC tool reads NetCDF point observation files created by the `IODA Converters `_. Support for interfacing with data from IODA may be added in the future based on user feedback. + + +ioda2nc usage +~~~~~~~~~~~~~ + +The usage statement for the IODA2NC tool is shown below: + +.. code-block:: none + + Usage: ioda2nc + ioda_file + netcdf_file + [-config config_file] + [-obs_var var] + [-iodafile ioda_file] + [-valid_beg time] + [-valid_end time] + [-nmsg n] + [-log file] + [-v level] + [-compress level] + +ioda2nc has required arguments and can also take optional ones. + +Required arguments for ioda2nc +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +1. The **ioda_file** argument is an input IODA NetCDF point observation file to be processed. + +2. The **netcdf_file** argument is the NetCDF output file to be written. + +Optional arguments for ioda2nc +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +3. The **-config config_file** is a IODA2NCConfig file to filter the point observations and define time summaries. + +4. The **-obs_var var_list** setting is a comma-separated list of variables to be saved from input the input file (by defaults, saves "all"). + +5. The **-iodafile ioda_file** option specifies additional input IODA observation files to be processed. + +6. The **-valid_beg time** and **-valid_end time** options in YYYYMMDD[_HH[MMSS]] format overrides the retention time window from the configuration file. + +7. The **-nmsg n** indicates the number of IODA records to process. + +8. The **-log** file option directs output and errors to the specified log file. All messages will be written to that file as well as standard out and error. Thus, users can save the messages without having to redirect the output on the command line. The default behavior is no log file. + +9. The **-v level** option indicates the desired level of verbosity. The value of “level” will override the default setting of 2. Setting the verbosity to 0 will make the tool run with no log messages, while increasing the verbosity above 1 will increase the amount of logging. + +10. The **-compress level** option indicates the desired level of compression (deflate level) for NetCDF variables. The valid level is between 0 and 9. The value of “level” will override the default setting of 0 from the configuration file or the environment variable MET_NC_COMPRESS. Setting the compression level to 0 will make no compression for the NetCDF output. Lower number is for fast compression and higher number is for better compression. + +An example of the ioda2nc calling sequence is shown below: + +.. code-block:: none + + ioda2nc \ + ioda.NC001007.2020031012.nc ioda2nc.2020031012.nc \ + -config IODA2NCConfig -v 3 -lg run_ioda2nc.log +In this example, the IODA2NC tool will reformat the data in the input ioda.NC001007.2020031012.nc file and write the output to a file named ioda2nc.2020031012.nc. The data to be processed is specified by IODA2NCConfig, log messages will be written to the ioda2nc.log file, and the verbosity level is three. + + +ioda2nc configuration file +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The default configuration file for the IODA2NC tool named **IODA2NcConfig_default** can be found in the installed *share/met/config* directory. It is recommended that users make a copy of this file prior to modifying its contents. + +The IODA2NC configuration file is optional and only necessary when defining filtering the input observations or defining time summaries. The contents of the default IODA2NC configuration file are described below. + +__________________ + +.. code-block:: none + + obs_window = { beg = -5400; end = 5400; } + mask = { grid = ""; poly = ""; } + tmp_dir = "/tmp"; + version = "VN.N"; + +The configuration options listed above are common to many MET tools and are described in :numref:`config_options`. + +_________________ + + +.. code-block:: none + + message_type = []; + message_type_group_map = []; + message_type_map = []; + station_id = []; + elevation_range = { ... }; + level_range = { ... }; + obs_var = []; + quality_mark_thresh = 0; + time_summary = { ... } + +The configuration options listed above are supported by other point observation pre-processing tools and are described in :numref:`pb2nc configuration file`. + +_________________ + +.. code-block:: none + + obs_name_map = []; + +This entry is an array of dictionaries, each containing a **key** string and **val** string which define a mapping of input IODA variable names to output variable names. The default IODA map, obs_var_map, is appended to this map. + +_________________ + +.. code-block:: none + + metadata_map = [ + { key = "message_type"; val = "msg_type"; }, + { key = "station_id"; val = "report_identifier"; }, + { key = "pressure"; val = "air_pressure,pressure"; }, + { key = "height"; val = "height,height_above_mean_sea_level"; }, + { key = "elevation"; val = ""; } + ]; + +This entry is an array of dictionaries, each containing a **key** string and **val** string which define a mapping of metadata for IODA data files. + +_________________ + +.. code-block:: none + + missing_thresh = [ <=-1e9, >=1e9, ==-9999 ]; + +The **missing_thresh** option is an array of thresholds. Any data values which meet any of these thresholds are interpreted as being bad, or missing, data. + + +ioda2nc output +~~~~~~~~~~~~~~ + +The NetCDF output of the IODA2NC tool is structured in the same way as the output of the PB2NC tool described in :numref:`pb2nc output`. + Point2Grid tool _______________ From 5201e14ec352ba55dd44689efd4ca89a2c9832fb Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Tue, 4 May 2021 16:11:31 -0600 Subject: [PATCH 117/165] Changes to make the authorship list consistent with METplus. --- met/docs/Users_Guide/index.rst | 7 +++-- met/docs/conf.py | 16 +++++------- met/docs/index.rst | 47 ++++++++++++++++++++++++++++++---- 3 files changed, 51 insertions(+), 19 deletions(-) diff --git a/met/docs/Users_Guide/index.rst b/met/docs/Users_Guide/index.rst index e687d3ac5e..40151728e5 100644 --- a/met/docs/Users_Guide/index.rst +++ b/met/docs/Users_Guide/index.rst @@ -8,8 +8,6 @@ This User's guide is provided as an aid to users of the Model Evaluation Tools ( It is important to note here that MET is an evolving software package. This documentation describes the |release| release dated |release_date|. Previous releases of MET have occurred each year since 2008. Intermediate releases may include bug fixes. MET is also able to accept new modules contributed by the community. If you have code you would like to contribute, we will gladly consider your contribution. Please send an email to: `met_help@ucar.edu `__. We will then determine the maturity of the new verification method and coordinate the inclusion of the new module in a future version. -This User's Guide was prepared by many current and former developers of MET, including David Ahijevych, Lindsay Blank, Barbara Brown, Randy Bullock, Tatiana Burek, David Fillmore, Tressa Fowler, Eric Gilleland, Lisa Goodrich, John Halley Gotway, Tracy Hertneky, Lacey Holland, Anne Holmes, Michelle Harrold, Tara Jensen, George McCabe, Kathryn Newman, Paul Oldenburg, John Opatz, Julie Prestopnik, Paul Prestopnik, Nancy Rehak, Howard Soh, Bonny Strong, and Minna Win-Gildenmeister. - **Model Evaluation Tools (MET) TERMS OF USE - IMPORTANT!** Copyright |copyright| @@ -26,13 +24,14 @@ the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +.. _citations: + **Citations** The citation for this User's Guide should be: |author_list|, |release_year|: The MET Version |version| User's Guide. -Developmental Testbed Center. -Available at: `MET releases `_ +Developmental Testbed Center. Available at: https://github.com/dtcenter/MET/releases **Acknowledgments** diff --git a/met/docs/conf.py b/met/docs/conf.py index 5d54deb22a..eff4dbae1f 100644 --- a/met/docs/conf.py +++ b/met/docs/conf.py @@ -75,13 +75,9 @@ # -- Export variables -------------------------------------------------------- -rst_epilog = """ -.. |copyright| replace:: {copyrightstr} -.. |author_list| replace:: {author_liststr} -.. |release_date| replace:: {release_datestr} -.. |release_year| replace:: {release_yearstr} -""".format(copyrightstr = copyright, - author_liststr = author_list, - release_datestr = release_date, - release_yearstr = release_year) - +rst_epilog = f""" +.. |copyright| replace:: {copyright} +.. |author_list| replace:: {author_list} +.. |release_date| replace:: {release_date} +.. |release_year| replace:: {release_year} +""" diff --git a/met/docs/index.rst b/met/docs/index.rst index a66a482aa1..2897901d29 100644 --- a/met/docs/index.rst +++ b/met/docs/index.rst @@ -90,7 +90,48 @@ Acronyms * **HIWPP** - High Impact Weather Predication Project * **NGGPS** - Next Generation Global Predicatio System * **GSD** - Global Systems Division - + +Authors +------- + +Many authors, listed below in alphabetical order, have contributed to the documentation of MET. +To cite this documentation in publications, please refer to the MET User's Guide :ref:`Citation Instructions`. + +* David Ahijevych [#NCAR]_ +* Lindsay Blank +* Barbara Brown [#NCAR]_ +* Randy Bullock [#NCAR]_ +* Tatiana Burek [#NCAR]_ +* David Fillmore [#NCAR]_ +* Tressa Fowler +* Eric Gilleland [#NCAR]_ +* Lisa Goodrich [#NCAR]_ +* John Halley Gotway [#NCAR]_ +* Tracy Hertneky [#NCAR]_ +* Lacey Holland +* Anne Holmes +* Michelle Harrold [#NCAR]_ +* Tara Jensen [#NCAR]_ +* George McCabe [#NCAR]_ +* Kathryn Newman [#NCAR]_ +* Paul Oldenburg +* John Opatz [#NCAR]_ +* Julie Prestopnik [#NCAR]_ +* Paul Prestopnik [#NCAR]_ +* Nancy Rehak [#NCAR]_ +* Howard Soh [#NCAR]_ +* Bonny Strong [#CIR]_ +* Minna Win-Gildenmeister [#NCAR]_ + +.. rubric:: Organization + +.. [#NCAR] `National Center for Atmospheric Research, Research + Applications Laboratory `_, `Developmental Testbed Center `_ +.. [#CIR] `Cooperative Institute for Research in the Atmosphere at + National Oceanic and Atmospheric Administration (NOAA) Earth + System Research Laboratory `_ + + .. toctree:: :hidden: :caption: Model Evaluation Tools @@ -102,7 +143,3 @@ Index ===== * :ref:`genindex` - - - - From d6618d6b3b9a005d0aa62fad28eb27ff9951e3c1 Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Tue, 4 May 2021 16:38:45 -0600 Subject: [PATCH 118/165] Rename CIR to CIRA. --- met/docs/index.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/met/docs/index.rst b/met/docs/index.rst index 2897901d29..dc494fd188 100644 --- a/met/docs/index.rst +++ b/met/docs/index.rst @@ -118,16 +118,16 @@ To cite this documentation in publications, please refer to the MET User's Guide * John Opatz [#NCAR]_ * Julie Prestopnik [#NCAR]_ * Paul Prestopnik [#NCAR]_ -* Nancy Rehak [#NCAR]_ +* Nancy Rehak * Howard Soh [#NCAR]_ -* Bonny Strong [#CIR]_ +* Bonny Strong [#CIRA]_ * Minna Win-Gildenmeister [#NCAR]_ .. rubric:: Organization .. [#NCAR] `National Center for Atmospheric Research, Research Applications Laboratory `_, `Developmental Testbed Center `_ -.. [#CIR] `Cooperative Institute for Research in the Atmosphere at +.. [#CIRA] `Cooperative Institute for Research in the Atmosphere at National Oceanic and Atmospheric Administration (NOAA) Earth System Research Laboratory `_ From bb9f18ebca6cfb7d32583471a43006bc673de985 Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Wed, 5 May 2021 10:43:41 -0600 Subject: [PATCH 119/165] Per #1731, fix alignment issued caused by tabs vs spaces. --- met/docs/Users_Guide/reformat_point.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/met/docs/Users_Guide/reformat_point.rst b/met/docs/Users_Guide/reformat_point.rst index 17a73fec15..f872a12b40 100644 --- a/met/docs/Users_Guide/reformat_point.rst +++ b/met/docs/Users_Guide/reformat_point.rst @@ -931,9 +931,9 @@ _________________ message_type_group_map = []; message_type_map = []; station_id = []; - elevation_range = { ... }; - level_range = { ... }; - obs_var = []; + elevation_range = { ... }; + level_range = { ... }; + obs_var = []; quality_mark_thresh = 0; time_summary = { ... } From 01bdecb423c79afdea43a5ec8b8ae783233e762a Mon Sep 17 00:00:00 2001 From: johnhg Date: Wed, 5 May 2021 15:35:00 -0600 Subject: [PATCH 120/165] Per #1777, fixing memory management in DbfHeader::set_subrecords(). It is dynamically allocating a buffer based on the record_legnth (e.g. 5) but then reading 32 characters into it! Deleting the dynamically allocated buf variable causes it to abort. Since we always read 32 bytes here, switch to a static buffer of that size rather than dynamically allocating. (#1779) Co-authored-by: John.H.Gotway@noaa.gov --- met/src/libcode/vx_gis/dbf_file.cc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/met/src/libcode/vx_gis/dbf_file.cc b/met/src/libcode/vx_gis/dbf_file.cc index 703791d75e..eb0fdc921f 100644 --- a/met/src/libcode/vx_gis/dbf_file.cc +++ b/met/src/libcode/vx_gis/dbf_file.cc @@ -301,13 +301,11 @@ void DbfHeader::set_subrecords(int fd) int j; int bytes, n_read; int pos; -unsigned char * buf = 0; - subrec = new DbfSubRecord [n_subrecs]; -buf = new unsigned char [record_length]; +unsigned char buf[32]; // // seek to the first record @@ -360,8 +358,6 @@ for (j=0; j Date: Wed, 5 May 2021 15:35:30 -0600 Subject: [PATCH 121/165] Feature 1731 authorship (#1776) * Per #1731, add ioda2nc documentation. * Changes to make the authorship list consistent with METplus. * Rename CIR to CIRA. * Per #1731, fix alignment issued caused by tabs vs spaces. --- met/docs/Users_Guide/data_io.rst | 30 +++-- met/docs/Users_Guide/index.rst | 7 +- met/docs/Users_Guide/overview.rst | 2 +- met/docs/Users_Guide/reformat_point.rst | 145 +++++++++++++++++++++++- met/docs/conf.py | 16 +-- met/docs/index.rst | 47 +++++++- 6 files changed, 211 insertions(+), 36 deletions(-) diff --git a/met/docs/Users_Guide/data_io.rst b/met/docs/Users_Guide/data_io.rst index 2a97f546c5..3dd4552ab9 100644 --- a/met/docs/Users_Guide/data_io.rst +++ b/met/docs/Users_Guide/data_io.rst @@ -10,13 +10,13 @@ Data must often be preprocessed prior to using it for verification. Several MET Input data formats __________________ -The MET package can handle gridded input data in one of four formats: GRIB version 1, GRIB version 2, NetCDF files following the Climate and Forecast (CF) conventions, and NetCDF files produced by the MET tools themselves. MET supports standard NCEP, USAF, UKMet Office and ECMWF grib tables along with custom, user-defined GRIB tables and the extended PDS including ensemble member metadata. See :numref:`Configuration File Details` for more information. Point observation files may be supplied in either PrepBUFR, ASCII, or MADIS format. Note that MET does not require the Unified Post-Processor to be used, but does require that the input GRIB data be on a standard, de-staggered grid on pressure or regular levels in the vertical. While the Grid-Stat, Wavelet-Stat, MODE, and MTD tools can be run on a gridded field at virtually any level, the Point-Stat tool can only be used to verify forecasts at the surface or on pressure or height levels. MET does not interpolate between native model vertical levels. +The MET package can handle multiple gridded input data formats: GRIB version 1, GRIB version 2, and NetCDF files following the Climate and Forecast (CF) conventions, containing WRF output post-processed using wrf_interp, or produced by the MET tools themselves. MET supports standard NCEP, USAF, UKMet Office and ECMWF GRIB tables along with custom, user-defined GRIB tables and the extended PDS including ensemble member metadata. See :numref:`Configuration File Details` for more information. Point observation files may be supplied in either PrepBUFR, ASCII, or MADIS format. Note that MET does not require the Unified Post-Processor to be used, but does require that the input GRIB data be on a standard, de-staggered grid on pressure or regular levels in the vertical. While the Grid-Stat, Wavelet-Stat, MODE, and MTD tools can be run on a gridded field at virtually any level, the Point-Stat tool can only be used to verify forecasts at the surface or on pressure or height levels. MET does not interpolate between native model vertical levels. When comparing two gridded fields with the Grid-Stat, Wavelet-Stat, Ensemble-Stat, MODE, MTD, or Series-Analysis tools, the input model and observation datasets must be on the same grid. MET will regrid files according to user specified options. Alternatively, outside of MET, the copygb and wgrib2 utilities are recommended for re-gridding GRIB1 and GRIB2 files, respectively. To preserve characteristics of the observations, it is generally preferred to re-grid the model data to the observation grid, rather than vice versa. -Input point observation files in PrepBUFR format are available through NCEP. The PrepBUFR observation files contain a wide variety of point-based observation types in a single file in a standard format. However, some users may wish to use observations not included in the standard PrepBUFR files. For this reason, prior to performing the verification step in the Point-Stat tool, the PrepBUFR file is reformatted with the PB2NC tool. In this step, the user can select various ways of stratifying the observation data spatially, temporally, and by type. The remaining observations are reformatted into an intermediate NetCDF file. The ASCII2NC tool may be used to convert ASCII point observations that are not available in the PrepBUFR files into this NetCDF format for use by the Point-Stat verification tool. Users with METAR or RAOB data from MADIS can convert these observations into NetCDF format with the MADIS2NC tool, then use them with the Point-Stat or Ensemble-Stat verification tools. +Input point observation files in PrepBUFR format are available through NCEP. The PrepBUFR observation files contain a wide variety of point-based observation types in a single file in a standard format. However, some users may wish to use observations not included in the standard PrepBUFR files. For this reason, prior to performing the verification step in the Point-Stat tool, the PrepBUFR file is reformatted with the PB2NC tool. In this step, the user can select various ways of stratifying the observation data spatially, temporally, and by type. The remaining observations are reformatted into an intermediate NetCDF file. The ASCII2NC tool may be used to convert ASCII point observations that are not available in the PrepBUFR files into this common NetCDF point observation format. Several other MET tools, described below, are also provided to reformat point observations into this common NetCDF point observation format prior to passing them as input to the Point-Stat or Ensemble-Stat verification tools. -Tropical cyclone forecasts and observations are typically provided in a specific ASCII format, in A Deck and B Deck files. +Tropical cyclone forecasts and observations are typically provided in a specific ATCF (Automated Tropical Cyclone Forecasting) ASCII format, in A-deck, B-deck, and E-deck files. .. _Intermediate data formats: @@ -55,32 +55,38 @@ The following is a summary of the input and output formats for each of the tools #. **PB2NC Tool** - * **Input**: One PrepBUFR point observation file and one configuration file. + * **Input**: PrepBUFR point observation file(s) and one configuration file. * **Output**: One NetCDF file containing the observations that have been retained. #. **ASCII2NC Tool** - * **Input**: One or more ASCII point observation file(s) that has (have) been formatted as expected, and optional configuration file. + * **Input**: ASCII point observation file(s) that has (have) been formatted as expected, and optional configuration file. * **Output**: One NetCDF file containing the reformatted observations. #. **MADIS2NC Tool** - * **Input**: One MADIS point observation file. + * **Input**: MADIS point observation file(s) in NetCDF format. * **Output**: One NetCDF file containing the reformatted observations. #. **LIDAR2NC Tool** - * **Input**: One CALIPSO satellite HDF file + * **Input**: One CALIPSO satellite HDF file. + + * **Output**: One NetCDF file containing the reformatted observations. + +#. **IODA2NC Tool** + + * **Input**: IODA observation file(s) in NetCDF format. * **Output**: One NetCDF file containing the reformatted observations. #. **Point2Grid Tool** - * **Input**: One NetCDF file containing point observation from the ASCII2NC, PB2NC, MADIS2NC, or LIDAR2NC tool. + * **Input**: One NetCDF file in the common point observation format. * **Output**: One NetCDF file containing a gridded representation of the point observations. @@ -116,7 +122,7 @@ The following is a summary of the input and output formats for each of the tools #. **Point-Stat Tool** - * **Input**: One gridded model file, at least one point observation file in NetCDF format (as the output of the PB2NC, ASCII2NC, MADIS2NC, or LIDAR2NC tool), and one configuration file. + * **Input**: One gridded model file, at least one NetCDF file in the common point observation format, and one configuration file. * **Output**: One STAT file containing all of the requested line types and several ASCII files for each line type requested. @@ -194,9 +200,9 @@ The following is a summary of the input and output formats for each of the tools #. **TC-Pairs Tool** - * **Input**: At least one A-deck and one B-deck ATCF format file containing output from a tropical cyclone tracker and one configuration file. The A-deck files contain forecast tracks while the B-deck files are typically the NHC Best Track Analysis but could also be any ATCF format reference. + * **Input**: At least one A-deck or E-deck file and one B-deck ATCF format file containing output from a tropical cyclone tracker and one configuration file. The A-deck files contain forecast tracks, the E-deck files contain forecast probabilities, and the B-deck files are typically the NHC Best Track Analysis but could also be any ATCF format reference. - * **Output**: ASCII output with the suffix .tcstat. + * **Output**: ASCII output with the suffix .tcst. #. **TC-Stat Tool** @@ -208,7 +214,7 @@ The following is a summary of the input and output formats for each of the tools * **Input**: One or more Tropical Cyclone genesis format files, one or more verifying operational and BEST track files in ATCF format, and one configuration file. - * **Output**: One STAT file containing all of the requested line types and several ASCII files for each line type requested. + * **Output**: One STAT file containing all of the requested line types, several ASCII files for each line type requested, and one gridded NetCDF file containing counts of track points. #. **TC-RMW Tool** diff --git a/met/docs/Users_Guide/index.rst b/met/docs/Users_Guide/index.rst index e687d3ac5e..40151728e5 100644 --- a/met/docs/Users_Guide/index.rst +++ b/met/docs/Users_Guide/index.rst @@ -8,8 +8,6 @@ This User's guide is provided as an aid to users of the Model Evaluation Tools ( It is important to note here that MET is an evolving software package. This documentation describes the |release| release dated |release_date|. Previous releases of MET have occurred each year since 2008. Intermediate releases may include bug fixes. MET is also able to accept new modules contributed by the community. If you have code you would like to contribute, we will gladly consider your contribution. Please send an email to: `met_help@ucar.edu `__. We will then determine the maturity of the new verification method and coordinate the inclusion of the new module in a future version. -This User's Guide was prepared by many current and former developers of MET, including David Ahijevych, Lindsay Blank, Barbara Brown, Randy Bullock, Tatiana Burek, David Fillmore, Tressa Fowler, Eric Gilleland, Lisa Goodrich, John Halley Gotway, Tracy Hertneky, Lacey Holland, Anne Holmes, Michelle Harrold, Tara Jensen, George McCabe, Kathryn Newman, Paul Oldenburg, John Opatz, Julie Prestopnik, Paul Prestopnik, Nancy Rehak, Howard Soh, Bonny Strong, and Minna Win-Gildenmeister. - **Model Evaluation Tools (MET) TERMS OF USE - IMPORTANT!** Copyright |copyright| @@ -26,13 +24,14 @@ the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +.. _citations: + **Citations** The citation for this User's Guide should be: |author_list|, |release_year|: The MET Version |version| User's Guide. -Developmental Testbed Center. -Available at: `MET releases `_ +Developmental Testbed Center. Available at: https://github.com/dtcenter/MET/releases **Acknowledgments** diff --git a/met/docs/Users_Guide/overview.rst b/met/docs/Users_Guide/overview.rst index 9450a2e3af..733255d409 100644 --- a/met/docs/Users_Guide/overview.rst +++ b/met/docs/Users_Guide/overview.rst @@ -57,7 +57,7 @@ The MODE (Method for Object-based Diagnostic Evaluation) tool also uses gridded The MODE-TD tool extends object-based analysis from two-dimensional forecasts and observations to include the time dimension. In addition to the two dimensional information provided by MODE, MODE-TD can be used to examine even more features including displacement in time, and duration and speed of moving areas of interest. -The Grid-Diag tools produce multivariate probability density functions (PDFs) that may be used either for exploring the relationship between two fields, or for the computation of percentiles generated from the sample for use with percentile thresholding. The output from this tool requires post-processing by METplus or user-provided utilities. +The Grid-Diag tool produces multivariate probability density functions (PDFs) that may be used either for exploring the relationship between two fields, or for the computation of percentiles generated from the sample for use with percentile thresholding. The output from this tool requires post-processing by METplus or user-provided utilities. The Wavelet-Stat tool decomposes two-dimensional forecasts and observations according to the Intensity-Scale verification technique described by :ref:`Casati et al. (2004) `. There are many types of spatial verification approaches and the Intensity-Scale technique belongs to the scale-decomposition (or scale-separation) verification approaches. The spatial scale components are obtained by applying a wavelet transformation to the forecast and observation fields. The resulting scale-decomposition measures error, bias and skill of the forecast on each spatial scale. Information is provided on the scale dependency of the error and skill, on the no-skill to skill transition scale, and on the ability of the forecast to reproduce the observed scale structure. The Wavelet-Stat tool is primarily used for precipitation fields. However, the tool can be applied to other variables, such as cloud fraction. diff --git a/met/docs/Users_Guide/reformat_point.rst b/met/docs/Users_Guide/reformat_point.rst index 2dfdce4b1c..f872a12b40 100644 --- a/met/docs/Users_Guide/reformat_point.rst +++ b/met/docs/Users_Guide/reformat_point.rst @@ -599,13 +599,13 @@ MADIS2NC tool _____________ -This section describes how to run the MADIS2NC tool. The MADIS2NC tool is used to reformat `Meteorological Assimilation Data Ingest System (MADIS) `_ point observations into the NetCDF format expected by the MET statistics tools. Since the MADIS2NC tool simply performs a reformatting step, no configuration file is needed. The MADIS2NC tool supports many of the MADIS data types, as listed in the usage statement below. Support for additional MADIS data types may be added in the future based on user feedback. +This section describes how to run the MADIS2NC tool. The MADIS2NC tool is used to reformat `Meteorological Assimilation Data Ingest System (MADIS) `_ point observations into the NetCDF format expected by the MET statistics tools. An optional configuration file controls the processing of the point observations. The MADIS2NC tool supports many of the MADIS data types, as listed in the usage statement below. Support for additional MADIS data types may be added in the future based on user feedback. madis2nc usage ~~~~~~~~~~~~~~ -The usage statement for MADIS2NC tool is shown below: +The usage statement for the MADIS2NC tool is shown below: .. code-block:: none @@ -635,7 +635,7 @@ Required arguments for madis2nc 1. The **madis_file** argument is one or more input MADIS point observation files to be processed. -2. The **netcdf_file** argument is the NetCDF output file to be written. +2. The **out_file** argument is the NetCDF output file to be written. 3. The argument **-type str** is a type of MADIS observations (metar, raob, profiler, maritime, mesonet or acarsProfiles). @@ -778,7 +778,6 @@ We will not give a detailed description of each CALIPSO data product that lidar2 **Layer_Base** gives the elevation in meters above ground level of the cloud base for each cloud level at each observation location. Similarly, **Layer_Top** gives the elevation of the top of each cloud layer. Note that if there are multiple cloud layers at a particular location, then there will be more than one base (or top) given for that location. For convenience, **Min_Base** and **Max_Top** give, respectively, the base elevation for the bottom cloud layer, and the top elevation for the top cloud layer. For these data types, there will be only one value per observation location regardless of how many cloud layers there are at that location. - .. _lidar2nc_grib_code_table: .. list-table:: lidar2nc GRIB codes and their meaning, units, and abbreviations @@ -837,7 +836,145 @@ We will not give a detailed description of each CALIPSO data product that lidar2 - Horizontal Averaging - NA - Horizontal_Averaging + + +IODA2NC tool +____________ + + +This section describes the IODA2NC tool which is used to reformat IODA (Interface for Observation Data Access) point observations from the `Joint Center for Satellite Data Assimilation (JCSDA) `_ into the NetCDF format expected by the MET statistics tools. An optional configuration file controls the processing of the point observations. The IODA2NC tool reads NetCDF point observation files created by the `IODA Converters `_. Support for interfacing with data from IODA may be added in the future based on user feedback. + + +ioda2nc usage +~~~~~~~~~~~~~ + +The usage statement for the IODA2NC tool is shown below: + +.. code-block:: none + + Usage: ioda2nc + ioda_file + netcdf_file + [-config config_file] + [-obs_var var] + [-iodafile ioda_file] + [-valid_beg time] + [-valid_end time] + [-nmsg n] + [-log file] + [-v level] + [-compress level] + +ioda2nc has required arguments and can also take optional ones. + +Required arguments for ioda2nc +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +1. The **ioda_file** argument is an input IODA NetCDF point observation file to be processed. + +2. The **netcdf_file** argument is the NetCDF output file to be written. + +Optional arguments for ioda2nc +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +3. The **-config config_file** is a IODA2NCConfig file to filter the point observations and define time summaries. + +4. The **-obs_var var_list** setting is a comma-separated list of variables to be saved from input the input file (by defaults, saves "all"). + +5. The **-iodafile ioda_file** option specifies additional input IODA observation files to be processed. + +6. The **-valid_beg time** and **-valid_end time** options in YYYYMMDD[_HH[MMSS]] format overrides the retention time window from the configuration file. + +7. The **-nmsg n** indicates the number of IODA records to process. + +8. The **-log** file option directs output and errors to the specified log file. All messages will be written to that file as well as standard out and error. Thus, users can save the messages without having to redirect the output on the command line. The default behavior is no log file. + +9. The **-v level** option indicates the desired level of verbosity. The value of “level” will override the default setting of 2. Setting the verbosity to 0 will make the tool run with no log messages, while increasing the verbosity above 1 will increase the amount of logging. + +10. The **-compress level** option indicates the desired level of compression (deflate level) for NetCDF variables. The valid level is between 0 and 9. The value of “level” will override the default setting of 0 from the configuration file or the environment variable MET_NC_COMPRESS. Setting the compression level to 0 will make no compression for the NetCDF output. Lower number is for fast compression and higher number is for better compression. + +An example of the ioda2nc calling sequence is shown below: + +.. code-block:: none + + ioda2nc \ + ioda.NC001007.2020031012.nc ioda2nc.2020031012.nc \ + -config IODA2NCConfig -v 3 -lg run_ioda2nc.log +In this example, the IODA2NC tool will reformat the data in the input ioda.NC001007.2020031012.nc file and write the output to a file named ioda2nc.2020031012.nc. The data to be processed is specified by IODA2NCConfig, log messages will be written to the ioda2nc.log file, and the verbosity level is three. + + +ioda2nc configuration file +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The default configuration file for the IODA2NC tool named **IODA2NcConfig_default** can be found in the installed *share/met/config* directory. It is recommended that users make a copy of this file prior to modifying its contents. + +The IODA2NC configuration file is optional and only necessary when defining filtering the input observations or defining time summaries. The contents of the default IODA2NC configuration file are described below. + +__________________ + +.. code-block:: none + + obs_window = { beg = -5400; end = 5400; } + mask = { grid = ""; poly = ""; } + tmp_dir = "/tmp"; + version = "VN.N"; + +The configuration options listed above are common to many MET tools and are described in :numref:`config_options`. + +_________________ + + +.. code-block:: none + + message_type = []; + message_type_group_map = []; + message_type_map = []; + station_id = []; + elevation_range = { ... }; + level_range = { ... }; + obs_var = []; + quality_mark_thresh = 0; + time_summary = { ... } + +The configuration options listed above are supported by other point observation pre-processing tools and are described in :numref:`pb2nc configuration file`. + +_________________ + +.. code-block:: none + + obs_name_map = []; + +This entry is an array of dictionaries, each containing a **key** string and **val** string which define a mapping of input IODA variable names to output variable names. The default IODA map, obs_var_map, is appended to this map. + +_________________ + +.. code-block:: none + + metadata_map = [ + { key = "message_type"; val = "msg_type"; }, + { key = "station_id"; val = "report_identifier"; }, + { key = "pressure"; val = "air_pressure,pressure"; }, + { key = "height"; val = "height,height_above_mean_sea_level"; }, + { key = "elevation"; val = ""; } + ]; + +This entry is an array of dictionaries, each containing a **key** string and **val** string which define a mapping of metadata for IODA data files. + +_________________ + +.. code-block:: none + + missing_thresh = [ <=-1e9, >=1e9, ==-9999 ]; + +The **missing_thresh** option is an array of thresholds. Any data values which meet any of these thresholds are interpreted as being bad, or missing, data. + + +ioda2nc output +~~~~~~~~~~~~~~ + +The NetCDF output of the IODA2NC tool is structured in the same way as the output of the PB2NC tool described in :numref:`pb2nc output`. + Point2Grid tool _______________ diff --git a/met/docs/conf.py b/met/docs/conf.py index 5d54deb22a..eff4dbae1f 100644 --- a/met/docs/conf.py +++ b/met/docs/conf.py @@ -75,13 +75,9 @@ # -- Export variables -------------------------------------------------------- -rst_epilog = """ -.. |copyright| replace:: {copyrightstr} -.. |author_list| replace:: {author_liststr} -.. |release_date| replace:: {release_datestr} -.. |release_year| replace:: {release_yearstr} -""".format(copyrightstr = copyright, - author_liststr = author_list, - release_datestr = release_date, - release_yearstr = release_year) - +rst_epilog = f""" +.. |copyright| replace:: {copyright} +.. |author_list| replace:: {author_list} +.. |release_date| replace:: {release_date} +.. |release_year| replace:: {release_year} +""" diff --git a/met/docs/index.rst b/met/docs/index.rst index a66a482aa1..dc494fd188 100644 --- a/met/docs/index.rst +++ b/met/docs/index.rst @@ -90,7 +90,48 @@ Acronyms * **HIWPP** - High Impact Weather Predication Project * **NGGPS** - Next Generation Global Predicatio System * **GSD** - Global Systems Division - + +Authors +------- + +Many authors, listed below in alphabetical order, have contributed to the documentation of MET. +To cite this documentation in publications, please refer to the MET User's Guide :ref:`Citation Instructions`. + +* David Ahijevych [#NCAR]_ +* Lindsay Blank +* Barbara Brown [#NCAR]_ +* Randy Bullock [#NCAR]_ +* Tatiana Burek [#NCAR]_ +* David Fillmore [#NCAR]_ +* Tressa Fowler +* Eric Gilleland [#NCAR]_ +* Lisa Goodrich [#NCAR]_ +* John Halley Gotway [#NCAR]_ +* Tracy Hertneky [#NCAR]_ +* Lacey Holland +* Anne Holmes +* Michelle Harrold [#NCAR]_ +* Tara Jensen [#NCAR]_ +* George McCabe [#NCAR]_ +* Kathryn Newman [#NCAR]_ +* Paul Oldenburg +* John Opatz [#NCAR]_ +* Julie Prestopnik [#NCAR]_ +* Paul Prestopnik [#NCAR]_ +* Nancy Rehak +* Howard Soh [#NCAR]_ +* Bonny Strong [#CIRA]_ +* Minna Win-Gildenmeister [#NCAR]_ + +.. rubric:: Organization + +.. [#NCAR] `National Center for Atmospheric Research, Research + Applications Laboratory `_, `Developmental Testbed Center `_ +.. [#CIRA] `Cooperative Institute for Research in the Atmosphere at + National Oceanic and Atmospheric Administration (NOAA) Earth + System Research Laboratory `_ + + .. toctree:: :hidden: :caption: Model Evaluation Tools @@ -102,7 +143,3 @@ Index ===== * :ref:`genindex` - - - - From 4427233cee9808a8ecf83795e1b82f378086a296 Mon Sep 17 00:00:00 2001 From: j-opatz <59586397+j-opatz@users.noreply.github.com> Date: Fri, 7 May 2021 11:06:58 -0600 Subject: [PATCH 122/165] Updated input sources to include newly acceptable data formats --- met/docs/Users_Guide/tc-pairs.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/met/docs/Users_Guide/tc-pairs.rst b/met/docs/Users_Guide/tc-pairs.rst index 2df76d0506..57bffcf04e 100644 --- a/met/docs/Users_Guide/tc-pairs.rst +++ b/met/docs/Users_Guide/tc-pairs.rst @@ -35,11 +35,11 @@ tc_pairs has required arguments and can accept several optional arguments. Required arguments for tc_pairs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -1. The **-adeck source** argument indicates the adeck ATCF format data source containing tropical cyclone model forecast (output from tracker) data to be verified. It specifies the name of an ATCF format file or top-level directory containing ATCF format files ending in “.dat” to be processed. The **-adeck** or **-edeck** option must be used at least once. +1. The **-adeck source** argument indicates the adeck TC-Pairs acceptable format data source containing tropical cyclone model forecast (output from tracker) data to be verified. Acceptable data formats are limited to the standard ATCF format and the one column modified ATCF file, generated from a genesis mode run for extratropical cyclones. It specifies the name of a TC-Pairs acceptable format file or top-level directory containing TC-Pairs acceptable format files ending in “.dat” to be processed. The **-adeck** or **-edeck** option must be used at least once. 2. The **-edeck source** argument indicates the edeck ATCF format data source containing probabilistic track data to be verified. It specifies the name of an ATCF format file or top-level directory containing ATCF format files ending in “.dat” to be processed. The **-adeck** or **-edeck** option must be used at least once. -3. The **-bdeck source** argument indicates the ATCF format data source containing the tropical cyclone reference dataset to be used for verifying the adeck source. It specifies the name of an ATCF format file or top-level directory containing ATCF format files ending in “.dat” to be processed. This source is expected to be the NHC Best Track Analysis, but could also be any ATCF-formatted reference. +3. The **-bdeck source** argument indicates the TC-Pairs acceptable format data source containing the tropical cyclone reference dataset to be used for verifying the adeck source. This source is typically the NHC Best Track Analysis, but could be any TC-Pairs acceptable formatted reference. The acceptable data formats for bdecks are the same as those for adecks. This arguement specifies the name of a TC-Pairs acceptable format file or top-level directory containing TC-Pairs acceptable format files ending in “.dat” to be processed. 4. The **-config file** argument indicates the name of the configuration file to be used. The contents of the configuration file are discussed below. From 278e57bac90f2e937f73af62286da4aee66c9c04 Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Fri, 7 May 2021 11:07:48 -0600 Subject: [PATCH 123/165] Per #1731, add more details about the grid-diag bin definition. --- met/docs/Users_Guide/grid-diag.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/met/docs/Users_Guide/grid-diag.rst b/met/docs/Users_Guide/grid-diag.rst index b84f2acab2..fe0753e084 100644 --- a/met/docs/Users_Guide/grid-diag.rst +++ b/met/docs/Users_Guide/grid-diag.rst @@ -93,6 +93,8 @@ _____________________ The **name** and **level** entries in the **data** dictionary define the data to be processed. The **n_bins** parameter specifies the number of histogram bins for that variable, and the **range** parameter the lower and upper bounds of the histogram. The interval length is the upper and lower difference divided by **n_bins**. +Each bin is inclusive on the left side and exclusive on the right, such as [a,b). Grid-Diag prints a warning message if the actual range of data values falls outside the range defined for that variable in the configuration file. Any data values less than or greater than the configured range are counted in the first or last bin, respectively. + grid_diag output file ~~~~~~~~~~~~~~~~~~~~~ From a8d2a99f12a40c90b9dd8f629ea235562b907438 Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Fri, 7 May 2021 11:15:14 -0600 Subject: [PATCH 124/165] Per #1731, clarify wording. --- met/docs/Users_Guide/grid-diag.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/met/docs/Users_Guide/grid-diag.rst b/met/docs/Users_Guide/grid-diag.rst index fe0753e084..fb6c14f58c 100644 --- a/met/docs/Users_Guide/grid-diag.rst +++ b/met/docs/Users_Guide/grid-diag.rst @@ -91,9 +91,9 @@ _____________________ ]; } -The **name** and **level** entries in the **data** dictionary define the data to be processed. The **n_bins** parameter specifies the number of histogram bins for that variable, and the **range** parameter the lower and upper bounds of the histogram. The interval length is the upper and lower difference divided by **n_bins**. +The **name** and **level** entries in the **data** dictionary define the data to be processed. The **n_bins** parameter specifies the number of histogram bins for that variable, and the **range** parameter the lower and upper bounds of the histogram. The interval length is the upper and lower difference divided by **n_bins**. Each bin is inclusive on the left side and exclusive on the right, such as [a,b). -Each bin is inclusive on the left side and exclusive on the right, such as [a,b). Grid-Diag prints a warning message if the actual range of data values falls outside the range defined for that variable in the configuration file. Any data values less than or greater than the configured range are counted in the first or last bin, respectively. +Grid-Diag prints a warning message if the actual range of data values falls outside the range defined for that variable in the configuration file. Any data values less than the configured range are counted in the first bin, while values greater than the configured range are counted in the last bin. grid_diag output file ~~~~~~~~~~~~~~~~~~~~~ From 200897e543261c0f6412b17055b82254e095ed39 Mon Sep 17 00:00:00 2001 From: j-opatz <59586397+j-opatz@users.noreply.github.com> Date: Fri, 7 May 2021 12:41:35 -0600 Subject: [PATCH 125/165] Update met/docs/Users_Guide/tc-pairs.rst Co-authored-by: johnhg --- met/docs/Users_Guide/tc-pairs.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/met/docs/Users_Guide/tc-pairs.rst b/met/docs/Users_Guide/tc-pairs.rst index 57bffcf04e..a0f82295d9 100644 --- a/met/docs/Users_Guide/tc-pairs.rst +++ b/met/docs/Users_Guide/tc-pairs.rst @@ -39,7 +39,7 @@ Required arguments for tc_pairs 2. The **-edeck source** argument indicates the edeck ATCF format data source containing probabilistic track data to be verified. It specifies the name of an ATCF format file or top-level directory containing ATCF format files ending in “.dat” to be processed. The **-adeck** or **-edeck** option must be used at least once. -3. The **-bdeck source** argument indicates the TC-Pairs acceptable format data source containing the tropical cyclone reference dataset to be used for verifying the adeck source. This source is typically the NHC Best Track Analysis, but could be any TC-Pairs acceptable formatted reference. The acceptable data formats for bdecks are the same as those for adecks. This arguement specifies the name of a TC-Pairs acceptable format file or top-level directory containing TC-Pairs acceptable format files ending in “.dat” to be processed. +3. The **-bdeck source** argument indicates the TC-Pairs acceptable format data source containing the tropical cyclone reference dataset to be used for verifying the adeck source. This source is typically the NHC Best Track Analysis, but could be any TC-Pairs acceptable formatted reference. The acceptable data formats for bdecks are the same as those for adecks. This argument specifies the name of a TC-Pairs acceptable format file or top-level directory containing TC-Pairs acceptable format files ending in “.dat” to be processed. 4. The **-config file** argument indicates the name of the configuration file to be used. The contents of the configuration file are discussed below. From 3978109b395dcedebc3662963bf4eb07dbacdceb Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Fri, 7 May 2021 13:39:09 -0600 Subject: [PATCH 126/165] Changes to align Xarray language with that used in Xarray documentation, to clarify only DataArray Xarray structures are supported and not Xarray Dataset structures, and an example of how to quickly create a DataArray for MET from a Dataset. --- met/docs/Users_Guide/appendixF.rst | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/met/docs/Users_Guide/appendixF.rst b/met/docs/Users_Guide/appendixF.rst index ee895a8166..4363e67cc3 100644 --- a/met/docs/Users_Guide/appendixF.rst +++ b/met/docs/Users_Guide/appendixF.rst @@ -46,7 +46,7 @@ With this approach, users should be able to execute Python scripts in their own Python Embedding for 2D data ____________________________ -We now describe how to write Python scripts so that the MET tools may extract 2D gridded data fields from them. Currently, MET offers two ways to interact with Python scripts: by using NumPy arrays or by using Xarray objects. The interface to be used (NumPy or Xarray) is specified on the command line (more on this later). The user's scripts can use any Python libraries that are supported by the local Python installation, or any personal or institutional libraries or code that are desired in order to implement the Python script, so long as the data has been loaded into either a NumPy array or an Xarray object by the end of the script. This offers advantages when using data file formats that MET does not directly support. If there is Python code to read the data format, the user can use those tools to read the data, and then copy the data into a NumPy array or an Xarray object. MET can then ingest the data via the Python script. Note that whether a NumPy array or an Xarray object is used, the data should be stored as double precision floating point numbers. Using different data types, such as integers or single precision floating point numbers, will lead to unexpected results in MET. +We now describe how to write Python scripts so that the MET tools may extract 2D gridded data fields from them. Currently, MET offers two ways to interact with Python scripts: by using NumPy arrays or by using Xarray DataArray's. The interface to be used (NumPy or Xarray) is specified on the command line (more on this later). The user's scripts can use any Python libraries that are supported by the local Python installation, or any personal or institutional libraries or code that are desired in order to implement the Python script, so long as the data has been loaded into either a NumPy array or an Xarray DataArray by the end of the script. This offers advantages when using data file formats that MET does not directly support. If there is Python code to read the data format, the user can use those tools to read the data, and then copy the data into a NumPy array or an Xarray DataArray. MET can then ingest the data via the Python script. Note that whether a NumPy array or an Xarray DataArray is used, the data should be stored as double precision floating point numbers. Using different data types, such as integers or single precision floating point numbers, will lead to unexpected results in MET. **Using NumPy** @@ -87,8 +87,8 @@ The data must be loaded into a 2D NumPy array named **met_data**. In addition th } - -In the dictionary, valid time, initialization time, lead time and accumulation time (if any) must be indicated by strings. Valid and initialization times must be given in YYYYMMDD[_HH[MMSS]] format, and lead and accumulation times must be given in HH[MMSS] format, where the square brackets indicate optional elements. The dictionary must also include strings for the name, long_name, level, and units to describe the data. The rest of the **attrs** dictionary gives the grid size and projection information in the same format that is used in the netCDF files written out by the MET tools. Those entries are also listed below. Note that the **grid** entry in the **attrs** dictionary can either be defined as a string or as a dictionary itself. +.. _attrs-specs-ref: +In the **attrs** dictionary, valid time, initialization time, lead time and accumulation time (if any) must be indicated by strings. Valid and initialization times must be given in YYYYMMDD[_HH[MMSS]] format, and lead and accumulation times must be given in HH[MMSS] format, where the square brackets indicate optional elements. The dictionary must also include strings for the name, long_name, level, and units to describe the data. The rest of the **attrs** dictionary gives the grid size and projection information in the same format that is used in the netCDF files written out by the MET tools. Those entries are also listed below. Note that the **grid** entry in the **attrs** dictionary can either be defined as a string or as a dictionary itself. If specified as a string, **grid** can be defined as follows: @@ -171,9 +171,16 @@ When specified as a dictionary, the contents of the **grid** dictionary vary bas Additional information about supported grids can be found in :ref:`appendixB`. -**Using Xarray Objects** +**Using Xarray DataArray's** + +To use Xarray DataArray's, a similar procedure to the NumPy case is followed. The Xarray DataArray can be represented as a NumPy N-dimensional array (ndarray) via the **values** property of the DataArray, and an **attrs** property that contains a dictionary of attributes. The user must name the Xarray DataArray to be **met_data**. When one of the MET tools runs the Python script, it will look for an Xarray DataArray named **met_data**, and will retrieve the data and metadata from the **values** and **attrs** properties, respectively, of the Xarray DataArray. The Xarray DataArray **attrs** dictionary is populated in the same way as for the NumPy interface (please see :ref:`attrs-specs-ref` for requirements of each entry in the **attrs** dictionary). The **values** NumPy ndarray property of the Xarray DataArray is also populated in the same way as the NumPy case. + +.. note:: + Currently, MET does not support Xarray Dataset structures. If you have a Dataset in Xarray, you can create a DataArray of a single variable using: + met_data = xr.DataArray(ds.varname,attrs=ds.attrs) -To use Xarray objects, a similar procedure to the NumPy case is followed. An Xarray object has a NumpyArray called **values**, and an attributes dictionary called **attrs**. The user must name the Xarray object to be **met_data**. When one of the MET tools runs the Python script, it will look for an Xarray object named **met_data**, and will retrieve the data and metadata from the **values** and **attrs** parts, respectively, of the Xarray object. The Xarray **attrs** dictionary is populated in the same way as for the NumPy interface. The **values** Numpy array part of the Xarray object is also populated in the same way as the NumPy case. + ds = your Dataset name + varname = variable name in the Dataset you'd like to use in MET __________________ From c13bc9e4a8a6af71727c49b6bac5db1465d0f83b Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Fri, 7 May 2021 13:50:04 -0600 Subject: [PATCH 127/165] Corrects plural of DataArray. --- met/docs/Users_Guide/appendixF.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/met/docs/Users_Guide/appendixF.rst b/met/docs/Users_Guide/appendixF.rst index 4363e67cc3..e1ff711d80 100644 --- a/met/docs/Users_Guide/appendixF.rst +++ b/met/docs/Users_Guide/appendixF.rst @@ -46,7 +46,7 @@ With this approach, users should be able to execute Python scripts in their own Python Embedding for 2D data ____________________________ -We now describe how to write Python scripts so that the MET tools may extract 2D gridded data fields from them. Currently, MET offers two ways to interact with Python scripts: by using NumPy arrays or by using Xarray DataArray's. The interface to be used (NumPy or Xarray) is specified on the command line (more on this later). The user's scripts can use any Python libraries that are supported by the local Python installation, or any personal or institutional libraries or code that are desired in order to implement the Python script, so long as the data has been loaded into either a NumPy array or an Xarray DataArray by the end of the script. This offers advantages when using data file formats that MET does not directly support. If there is Python code to read the data format, the user can use those tools to read the data, and then copy the data into a NumPy array or an Xarray DataArray. MET can then ingest the data via the Python script. Note that whether a NumPy array or an Xarray DataArray is used, the data should be stored as double precision floating point numbers. Using different data types, such as integers or single precision floating point numbers, will lead to unexpected results in MET. +We now describe how to write Python scripts so that the MET tools may extract 2D gridded data fields from them. Currently, MET offers two ways to interact with Python scripts: by using NumPy arrays or by using Xarray DataArrays. The interface to be used (NumPy or Xarray) is specified on the command line (more on this later). The user's scripts can use any Python libraries that are supported by the local Python installation, or any personal or institutional libraries or code that are desired in order to implement the Python script, so long as the data has been loaded into either a NumPy array or an Xarray DataArray by the end of the script. This offers advantages when using data file formats that MET does not directly support. If there is Python code to read the data format, the user can use those tools to read the data, and then copy the data into a NumPy array or an Xarray DataArray. MET can then ingest the data via the Python script. Note that whether a NumPy array or an Xarray DataArray is used, the data should be stored as double precision floating point numbers. Using different data types, such as integers or single precision floating point numbers, will lead to unexpected results in MET. **Using NumPy** @@ -173,7 +173,7 @@ Additional information about supported grids can be found in :ref:`appendixB`. **Using Xarray DataArray's** -To use Xarray DataArray's, a similar procedure to the NumPy case is followed. The Xarray DataArray can be represented as a NumPy N-dimensional array (ndarray) via the **values** property of the DataArray, and an **attrs** property that contains a dictionary of attributes. The user must name the Xarray DataArray to be **met_data**. When one of the MET tools runs the Python script, it will look for an Xarray DataArray named **met_data**, and will retrieve the data and metadata from the **values** and **attrs** properties, respectively, of the Xarray DataArray. The Xarray DataArray **attrs** dictionary is populated in the same way as for the NumPy interface (please see :ref:`attrs-specs-ref` for requirements of each entry in the **attrs** dictionary). The **values** NumPy ndarray property of the Xarray DataArray is also populated in the same way as the NumPy case. +To use Xarray DataArrays, a similar procedure to the NumPy case is followed. The Xarray DataArray can be represented as a NumPy N-dimensional array (ndarray) via the **values** property of the DataArray, and an **attrs** property that contains a dictionary of attributes. The user must name the Xarray DataArray to be **met_data**. When one of the MET tools runs the Python script, it will look for an Xarray DataArray named **met_data**, and will retrieve the data and metadata from the **values** and **attrs** properties, respectively, of the Xarray DataArray. The Xarray DataArray **attrs** dictionary is populated in the same way as for the NumPy interface (please see :ref:`attrs-specs-ref` for requirements of each entry in the **attrs** dictionary). The **values** NumPy ndarray property of the Xarray DataArray is also populated in the same way as the NumPy case. .. note:: Currently, MET does not support Xarray Dataset structures. If you have a Dataset in Xarray, you can create a DataArray of a single variable using: From 4ef85f99968b36e71d160cee0d93ddbf8564a4b3 Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Fri, 7 May 2021 13:52:44 -0600 Subject: [PATCH 128/165] Aligns references to NumPy arrays with NumPy docs to refer to them as ndarrays. --- met/docs/Users_Guide/appendixF.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/met/docs/Users_Guide/appendixF.rst b/met/docs/Users_Guide/appendixF.rst index e1ff711d80..270b32b48e 100644 --- a/met/docs/Users_Guide/appendixF.rst +++ b/met/docs/Users_Guide/appendixF.rst @@ -46,11 +46,11 @@ With this approach, users should be able to execute Python scripts in their own Python Embedding for 2D data ____________________________ -We now describe how to write Python scripts so that the MET tools may extract 2D gridded data fields from them. Currently, MET offers two ways to interact with Python scripts: by using NumPy arrays or by using Xarray DataArrays. The interface to be used (NumPy or Xarray) is specified on the command line (more on this later). The user's scripts can use any Python libraries that are supported by the local Python installation, or any personal or institutional libraries or code that are desired in order to implement the Python script, so long as the data has been loaded into either a NumPy array or an Xarray DataArray by the end of the script. This offers advantages when using data file formats that MET does not directly support. If there is Python code to read the data format, the user can use those tools to read the data, and then copy the data into a NumPy array or an Xarray DataArray. MET can then ingest the data via the Python script. Note that whether a NumPy array or an Xarray DataArray is used, the data should be stored as double precision floating point numbers. Using different data types, such as integers or single precision floating point numbers, will lead to unexpected results in MET. +We now describe how to write Python scripts so that the MET tools may extract 2D gridded data fields from them. Currently, MET offers two ways to interact with Python scripts: by using NumPy N-dimensional arrays (ndarrays) or by using Xarray DataArrays. The interface to be used (NumPy or Xarray) is specified on the command line (more on this later). The user's scripts can use any Python libraries that are supported by the local Python installation, or any personal or institutional libraries or code that are desired in order to implement the Python script, so long as the data has been loaded into either a NumPy ndarray or an Xarray DataArray by the end of the script. This offers advantages when using data file formats that MET does not directly support. If there is Python code to read the data format, the user can use those tools to read the data, and then copy the data into a NumPy ndarray or an Xarray DataArray. MET can then ingest the data via the Python script. Note that whether a NumPy ndarray or an Xarray DataArray is used, the data should be stored as double precision floating point numbers. Using different data types, such as integers or single precision floating point numbers, will lead to unexpected results in MET. **Using NumPy** -The data must be loaded into a 2D NumPy array named **met_data**. In addition there must be a Python dictionary named **attrs** which contains metadata such as timestamps, grid projection and other information. Here is an example **attrs** dictionary: +The data must be loaded into a 2D NumPy ndarray named **met_data**. In addition there must be a Python dictionary named **attrs** which contains metadata such as timestamps, grid projection and other information. Here is an example **attrs** dictionary: .. code-block:: none From 3a914efd7c1e13ee02d577cb54c97426964c968f Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Fri, 7 May 2021 13:55:28 -0600 Subject: [PATCH 129/165] Fixes formatting of note for Xarray. --- met/docs/Users_Guide/appendixF.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/met/docs/Users_Guide/appendixF.rst b/met/docs/Users_Guide/appendixF.rst index 270b32b48e..31ae566149 100644 --- a/met/docs/Users_Guide/appendixF.rst +++ b/met/docs/Users_Guide/appendixF.rst @@ -176,7 +176,7 @@ Additional information about supported grids can be found in :ref:`appendixB`. To use Xarray DataArrays, a similar procedure to the NumPy case is followed. The Xarray DataArray can be represented as a NumPy N-dimensional array (ndarray) via the **values** property of the DataArray, and an **attrs** property that contains a dictionary of attributes. The user must name the Xarray DataArray to be **met_data**. When one of the MET tools runs the Python script, it will look for an Xarray DataArray named **met_data**, and will retrieve the data and metadata from the **values** and **attrs** properties, respectively, of the Xarray DataArray. The Xarray DataArray **attrs** dictionary is populated in the same way as for the NumPy interface (please see :ref:`attrs-specs-ref` for requirements of each entry in the **attrs** dictionary). The **values** NumPy ndarray property of the Xarray DataArray is also populated in the same way as the NumPy case. .. note:: - Currently, MET does not support Xarray Dataset structures. If you have a Dataset in Xarray, you can create a DataArray of a single variable using: + Currently, MET does not support Xarray Dataset structures. If you have a Dataset in Xarray, you can create a DataArray of a single variable using:: met_data = xr.DataArray(ds.varname,attrs=ds.attrs) ds = your Dataset name From 82532cbdc377386bebb1b27f2f37822f0a493b9d Mon Sep 17 00:00:00 2001 From: j-opatz <59586397+j-opatz@users.noreply.github.com> Date: Fri, 7 May 2021 13:56:58 -0600 Subject: [PATCH 130/165] Update met/docs/Users_Guide/tc-pairs.rst Co-authored-by: johnhg --- met/docs/Users_Guide/tc-pairs.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/met/docs/Users_Guide/tc-pairs.rst b/met/docs/Users_Guide/tc-pairs.rst index a0f82295d9..24afaf814a 100644 --- a/met/docs/Users_Guide/tc-pairs.rst +++ b/met/docs/Users_Guide/tc-pairs.rst @@ -35,7 +35,7 @@ tc_pairs has required arguments and can accept several optional arguments. Required arguments for tc_pairs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -1. The **-adeck source** argument indicates the adeck TC-Pairs acceptable format data source containing tropical cyclone model forecast (output from tracker) data to be verified. Acceptable data formats are limited to the standard ATCF format and the one column modified ATCF file, generated from a genesis mode run for extratropical cyclones. It specifies the name of a TC-Pairs acceptable format file or top-level directory containing TC-Pairs acceptable format files ending in “.dat” to be processed. The **-adeck** or **-edeck** option must be used at least once. +1. The **-adeck source** argument indicates the adeck TC-Pairs acceptable format data source containing tropical cyclone model forecast (output from tracker) data to be verified. Acceptable data formats are limited to the standard ATCF format and the one column modified ATCF file, generated by running the tracker in genesis mode. It specifies the name of a TC-Pairs acceptable format file or top-level directory containing TC-Pairs acceptable format files ending in “.dat” to be processed. The **-adeck** or **-edeck** option must be used at least once. 2. The **-edeck source** argument indicates the edeck ATCF format data source containing probabilistic track data to be verified. It specifies the name of an ATCF format file or top-level directory containing ATCF format files ending in “.dat” to be processed. The **-adeck** or **-edeck** option must be used at least once. From 8568cd31323026dbe768e586bd0e308631235a47 Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Fri, 7 May 2021 13:58:06 -0600 Subject: [PATCH 131/165] Fixes hyperlink reference. --- met/docs/Users_Guide/appendixF.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/met/docs/Users_Guide/appendixF.rst b/met/docs/Users_Guide/appendixF.rst index 31ae566149..f2adc94f49 100644 --- a/met/docs/Users_Guide/appendixF.rst +++ b/met/docs/Users_Guide/appendixF.rst @@ -43,6 +43,7 @@ Setting this environment variable triggers slightly different processing logic i With this approach, users should be able to execute Python scripts in their own custom environments. +.. _pyembed-2d-data: Python Embedding for 2D data ____________________________ @@ -87,7 +88,6 @@ The data must be loaded into a 2D NumPy ndarray named **met_data**. In addition } -.. _attrs-specs-ref: In the **attrs** dictionary, valid time, initialization time, lead time and accumulation time (if any) must be indicated by strings. Valid and initialization times must be given in YYYYMMDD[_HH[MMSS]] format, and lead and accumulation times must be given in HH[MMSS] format, where the square brackets indicate optional elements. The dictionary must also include strings for the name, long_name, level, and units to describe the data. The rest of the **attrs** dictionary gives the grid size and projection information in the same format that is used in the netCDF files written out by the MET tools. Those entries are also listed below. Note that the **grid** entry in the **attrs** dictionary can either be defined as a string or as a dictionary itself. If specified as a string, **grid** can be defined as follows: @@ -173,7 +173,7 @@ Additional information about supported grids can be found in :ref:`appendixB`. **Using Xarray DataArray's** -To use Xarray DataArrays, a similar procedure to the NumPy case is followed. The Xarray DataArray can be represented as a NumPy N-dimensional array (ndarray) via the **values** property of the DataArray, and an **attrs** property that contains a dictionary of attributes. The user must name the Xarray DataArray to be **met_data**. When one of the MET tools runs the Python script, it will look for an Xarray DataArray named **met_data**, and will retrieve the data and metadata from the **values** and **attrs** properties, respectively, of the Xarray DataArray. The Xarray DataArray **attrs** dictionary is populated in the same way as for the NumPy interface (please see :ref:`attrs-specs-ref` for requirements of each entry in the **attrs** dictionary). The **values** NumPy ndarray property of the Xarray DataArray is also populated in the same way as the NumPy case. +To use Xarray DataArrays, a similar procedure to the NumPy case is followed. The Xarray DataArray can be represented as a NumPy N-dimensional array (ndarray) via the **values** property of the DataArray, and an **attrs** property that contains a dictionary of attributes. The user must name the Xarray DataArray to be **met_data**. When one of the MET tools runs the Python script, it will look for an Xarray DataArray named **met_data**, and will retrieve the data and metadata from the **values** and **attrs** properties, respectively, of the Xarray DataArray. The Xarray DataArray **attrs** dictionary is populated in the same way as for the NumPy interface (please see :ref:`pyembed-2d-data` for requirements of each entry in the **attrs** dictionary). The **values** NumPy ndarray property of the Xarray DataArray is also populated in the same way as the NumPy case. .. note:: Currently, MET does not support Xarray Dataset structures. If you have a Dataset in Xarray, you can create a DataArray of a single variable using:: From 4da81e231febed8a653f06b55c7c5a56f1efd3e1 Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Fri, 7 May 2021 13:59:30 -0600 Subject: [PATCH 132/165] Fixes line spacing in note directive. --- met/docs/Users_Guide/appendixF.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/met/docs/Users_Guide/appendixF.rst b/met/docs/Users_Guide/appendixF.rst index f2adc94f49..763b0577f2 100644 --- a/met/docs/Users_Guide/appendixF.rst +++ b/met/docs/Users_Guide/appendixF.rst @@ -177,6 +177,7 @@ To use Xarray DataArrays, a similar procedure to the NumPy case is followed. The .. note:: Currently, MET does not support Xarray Dataset structures. If you have a Dataset in Xarray, you can create a DataArray of a single variable using:: + met_data = xr.DataArray(ds.varname,attrs=ds.attrs) ds = your Dataset name From d0512c107ad3e2342ca28293d5befc2d2f546d35 Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Fri, 7 May 2021 14:02:01 -0600 Subject: [PATCH 133/165] Changes to reference again. --- met/docs/Users_Guide/appendixF.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/met/docs/Users_Guide/appendixF.rst b/met/docs/Users_Guide/appendixF.rst index 763b0577f2..4588ea9c15 100644 --- a/met/docs/Users_Guide/appendixF.rst +++ b/met/docs/Users_Guide/appendixF.rst @@ -43,7 +43,6 @@ Setting this environment variable triggers slightly different processing logic i With this approach, users should be able to execute Python scripts in their own custom environments. -.. _pyembed-2d-data: Python Embedding for 2D data ____________________________ @@ -88,6 +87,8 @@ The data must be loaded into a 2D NumPy ndarray named **met_data**. In addition } +.. _pyembed-2d-data: + In the **attrs** dictionary, valid time, initialization time, lead time and accumulation time (if any) must be indicated by strings. Valid and initialization times must be given in YYYYMMDD[_HH[MMSS]] format, and lead and accumulation times must be given in HH[MMSS] format, where the square brackets indicate optional elements. The dictionary must also include strings for the name, long_name, level, and units to describe the data. The rest of the **attrs** dictionary gives the grid size and projection information in the same format that is used in the netCDF files written out by the MET tools. Those entries are also listed below. Note that the **grid** entry in the **attrs** dictionary can either be defined as a string or as a dictionary itself. If specified as a string, **grid** can be defined as follows: From d0bd33677f0e6b748429cd1bcbbefa85ac80b9ab Mon Sep 17 00:00:00 2001 From: Howard Soh Date: Fri, 7 May 2021 14:06:41 -0600 Subject: [PATCH 134/165] #1782 Set the time offset to 0 if the time dimension does not exist at the data variable --- met/src/libcode/vx_data2d_nccf/data2d_nccf.cc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/met/src/libcode/vx_data2d_nccf/data2d_nccf.cc b/met/src/libcode/vx_data2d_nccf/data2d_nccf.cc index 4b023a32dc..9da4858f33 100644 --- a/met/src/libcode/vx_data2d_nccf/data2d_nccf.cc +++ b/met/src/libcode/vx_data2d_nccf/data2d_nccf.cc @@ -365,16 +365,23 @@ LongArray MetNcCFDataFile::collect_time_offsets(VarInfo &vinfo) { return(time_offsets); } + int time_dim_slot = info->t_slot; + int time_dim_size = _file->ValidTime.n_elements(); + if (0 < time_dim_size && time_dim_slot < 0) { + // The time dimension does not exist at the variable and the time + // variable exists. Stop time slicing and set the time offset to 0. + time_offsets.add(0); + return(time_offsets); + } + double time_lower = bad_data_double; double time_upper = bad_data_double; int error_code = error_code_no_error; - int time_dim_slot = info->t_slot; - int time_dim_size = _file->ValidTime.n_elements(); LevelInfo level = vinfo.level(); LongArray dimension = vinfo_nc->dimension(); bool is_time_range = (level.type() == LevelType_Time); bool time_as_value = !level.is_time_as_offset(); - + long dim_offset = (time_dim_slot >= 0) ? dimension[time_dim_slot] : -1; bool include_all_times = (dim_offset == vx_data2d_star); From e376795d94e7250f10aeceda29fb562cab33b3a6 Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Fri, 7 May 2021 14:08:53 -0600 Subject: [PATCH 135/165] Updates to link and note directive. --- met/docs/Users_Guide/appendixF.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/met/docs/Users_Guide/appendixF.rst b/met/docs/Users_Guide/appendixF.rst index 4588ea9c15..c6b561cc05 100644 --- a/met/docs/Users_Guide/appendixF.rst +++ b/met/docs/Users_Guide/appendixF.rst @@ -43,6 +43,8 @@ Setting this environment variable triggers slightly different processing logic i With this approach, users should be able to execute Python scripts in their own custom environments. +.. _pyembed-2d-data: + Python Embedding for 2D data ____________________________ @@ -87,8 +89,6 @@ The data must be loaded into a 2D NumPy ndarray named **met_data**. In addition } -.. _pyembed-2d-data: - In the **attrs** dictionary, valid time, initialization time, lead time and accumulation time (if any) must be indicated by strings. Valid and initialization times must be given in YYYYMMDD[_HH[MMSS]] format, and lead and accumulation times must be given in HH[MMSS] format, where the square brackets indicate optional elements. The dictionary must also include strings for the name, long_name, level, and units to describe the data. The rest of the **attrs** dictionary gives the grid size and projection information in the same format that is used in the netCDF files written out by the MET tools. Those entries are also listed below. Note that the **grid** entry in the **attrs** dictionary can either be defined as a string or as a dictionary itself. If specified as a string, **grid** can be defined as follows: @@ -181,8 +181,9 @@ To use Xarray DataArrays, a similar procedure to the NumPy case is followed. The met_data = xr.DataArray(ds.varname,attrs=ds.attrs) - ds = your Dataset name - varname = variable name in the Dataset you'd like to use in MET + | ds = your Dataset name + | varname = variable name in the Dataset you'd like to use in MET + | __________________ From 9d1c71e314334cd6b2e2568620b8fc1160d1f3bb Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Fri, 7 May 2021 14:12:44 -0600 Subject: [PATCH 136/165] Corrects plural of DataArray once more. --- met/docs/Users_Guide/appendixF.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/met/docs/Users_Guide/appendixF.rst b/met/docs/Users_Guide/appendixF.rst index c6b561cc05..31a3f05d88 100644 --- a/met/docs/Users_Guide/appendixF.rst +++ b/met/docs/Users_Guide/appendixF.rst @@ -172,7 +172,7 @@ When specified as a dictionary, the contents of the **grid** dictionary vary bas Additional information about supported grids can be found in :ref:`appendixB`. -**Using Xarray DataArray's** +**Using Xarray DataArrays** To use Xarray DataArrays, a similar procedure to the NumPy case is followed. The Xarray DataArray can be represented as a NumPy N-dimensional array (ndarray) via the **values** property of the DataArray, and an **attrs** property that contains a dictionary of attributes. The user must name the Xarray DataArray to be **met_data**. When one of the MET tools runs the Python script, it will look for an Xarray DataArray named **met_data**, and will retrieve the data and metadata from the **values** and **attrs** properties, respectively, of the Xarray DataArray. The Xarray DataArray **attrs** dictionary is populated in the same way as for the NumPy interface (please see :ref:`pyembed-2d-data` for requirements of each entry in the **attrs** dictionary). The **values** NumPy ndarray property of the Xarray DataArray is also populated in the same way as the NumPy case. From ee1011993f51ed62a5d7a60a1df16492d3f857db Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Fri, 7 May 2021 14:16:55 -0600 Subject: [PATCH 137/165] Adds more clarity to NumPy heading. --- met/docs/Users_Guide/appendixF.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/met/docs/Users_Guide/appendixF.rst b/met/docs/Users_Guide/appendixF.rst index 31a3f05d88..2f6d62b6de 100644 --- a/met/docs/Users_Guide/appendixF.rst +++ b/met/docs/Users_Guide/appendixF.rst @@ -50,7 +50,7 @@ ____________________________ We now describe how to write Python scripts so that the MET tools may extract 2D gridded data fields from them. Currently, MET offers two ways to interact with Python scripts: by using NumPy N-dimensional arrays (ndarrays) or by using Xarray DataArrays. The interface to be used (NumPy or Xarray) is specified on the command line (more on this later). The user's scripts can use any Python libraries that are supported by the local Python installation, or any personal or institutional libraries or code that are desired in order to implement the Python script, so long as the data has been loaded into either a NumPy ndarray or an Xarray DataArray by the end of the script. This offers advantages when using data file formats that MET does not directly support. If there is Python code to read the data format, the user can use those tools to read the data, and then copy the data into a NumPy ndarray or an Xarray DataArray. MET can then ingest the data via the Python script. Note that whether a NumPy ndarray or an Xarray DataArray is used, the data should be stored as double precision floating point numbers. Using different data types, such as integers or single precision floating point numbers, will lead to unexpected results in MET. -**Using NumPy** +**Using NumPy N-dimensional Arrays** The data must be loaded into a 2D NumPy ndarray named **met_data**. In addition there must be a Python dictionary named **attrs** which contains metadata such as timestamps, grid projection and other information. Here is an example **attrs** dictionary: From 560995bccee968bb5300293b50b29bbcde7418c5 Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Fri, 7 May 2021 14:20:10 -0600 Subject: [PATCH 138/165] Adds bold for emphasis. --- met/docs/Users_Guide/appendixF.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/met/docs/Users_Guide/appendixF.rst b/met/docs/Users_Guide/appendixF.rst index 2f6d62b6de..9ea00d32e2 100644 --- a/met/docs/Users_Guide/appendixF.rst +++ b/met/docs/Users_Guide/appendixF.rst @@ -179,11 +179,10 @@ To use Xarray DataArrays, a similar procedure to the NumPy case is followed. The .. note:: Currently, MET does not support Xarray Dataset structures. If you have a Dataset in Xarray, you can create a DataArray of a single variable using:: - met_data = xr.DataArray(ds.varname,attrs=ds.attrs) + **met_data = xr.DataArray(ds.varname,attrs=ds.attrs)** | ds = your Dataset name | varname = variable name in the Dataset you'd like to use in MET - | __________________ From 35bfce73cd9f555b0db85f4595c1728b16fec709 Mon Sep 17 00:00:00 2001 From: Daniel Adriaansen Date: Fri, 7 May 2021 14:25:13 -0600 Subject: [PATCH 139/165] Removes bold in note directive. --- met/docs/Users_Guide/appendixF.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/met/docs/Users_Guide/appendixF.rst b/met/docs/Users_Guide/appendixF.rst index 9ea00d32e2..187d77465d 100644 --- a/met/docs/Users_Guide/appendixF.rst +++ b/met/docs/Users_Guide/appendixF.rst @@ -177,9 +177,9 @@ Additional information about supported grids can be found in :ref:`appendixB`. To use Xarray DataArrays, a similar procedure to the NumPy case is followed. The Xarray DataArray can be represented as a NumPy N-dimensional array (ndarray) via the **values** property of the DataArray, and an **attrs** property that contains a dictionary of attributes. The user must name the Xarray DataArray to be **met_data**. When one of the MET tools runs the Python script, it will look for an Xarray DataArray named **met_data**, and will retrieve the data and metadata from the **values** and **attrs** properties, respectively, of the Xarray DataArray. The Xarray DataArray **attrs** dictionary is populated in the same way as for the NumPy interface (please see :ref:`pyembed-2d-data` for requirements of each entry in the **attrs** dictionary). The **values** NumPy ndarray property of the Xarray DataArray is also populated in the same way as the NumPy case. .. note:: - Currently, MET does not support Xarray Dataset structures. If you have a Dataset in Xarray, you can create a DataArray of a single variable using:: + Currently, MET does not support Xarray Dataset structures. If you have a Dataset in Xarray, you can create a DataArray of a single variable using: - **met_data = xr.DataArray(ds.varname,attrs=ds.attrs)** + met_data = xr.DataArray(ds.varname,attrs=ds.attrs) | ds = your Dataset name | varname = variable name in the Dataset you'd like to use in MET From 50b77c0217a5d9c5e876a28d01b7234662daa295 Mon Sep 17 00:00:00 2001 From: johnhg Date: Fri, 7 May 2021 19:28:04 -0600 Subject: [PATCH 140/165] Feature 1778 debug (#1785) * Per #1778, please see https://github.com/dtcenter/MET/issues/1778#issuecomment-834800531 for details. Basically, when doing development, compile with the -g debug option. Otherwise, remove it by default. * Per #1778, update stale URL's in the README and configure.ac file. Also, change the default MET version from 8.1 to development. --- met/README | 8 ++++---- met/configure.ac | 13 ++++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/met/README b/met/README index 3b0c6edba8..91965d9cd5 100644 --- a/met/README +++ b/met/README @@ -20,8 +20,8 @@ This is the main directory for the Model Evaluation Tools source code release. ================================================================================ For questions, please: -- Refer to the MET User's Guide in the /doc sub-directory. -- Refer to the MET website: http://www.dtcenter.org/met/users +- Refer to the MET User's Guide: https://met.readthedocs.io/en/latest +- Refer to the MET website: http://dtcenter.org/community-code/model-evaluation-tools-met - Send mail to met_help@ucar.edu. Dependencies @@ -52,7 +52,7 @@ Dependencies - It is suggested that the following tools be used in conjunction with MET: - Unified Post-Processor - - http://www.dtcenter.org/wrf-nmm/users + - http://dtcenter.org/community-code/unified-post-processor-upp NOTE: The required libraries should be compiled with the same set of compilers to be used in compiling MET. @@ -63,7 +63,7 @@ How to compile and run? For more detailed instructions on building MET and for a list of supported platforms and compilers, please refer to the MET User's Guide in the doc/ sub-directory, or the MET Online Tutorial: - http://www.dtcenter.org/met/users/support/online_tutorial + http://dtcenter.org/community-code/model-evaluation-tools-met/online-tutorial - Set the $CXX and $F77 environment variables to specify the C++ and FORTRAN compilers to be used. If not set, configure will search for compilers and the diff --git a/met/configure.ac b/met/configure.ac index 104612c287..dac13bfa64 100644 --- a/met/configure.ac +++ b/met/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) -AC_INIT([MET], [m4_esyscmd_s(echo ${MET_BUILD_VERSION:-8.1})], [met_help@ucar.edu], [], [http://www.dtcenter.org/met/users]) +AC_INIT([MET], [m4_esyscmd_s(echo ${MET_BUILD_VERSION:-development})], [met_help@ucar.edu], [], [http://dtcenter.org/community-code/model-evaluation-tools-met]) AC_CONFIG_SRCDIR([src/tools/tc_utils/tc_dland/tc_dland.cc]) AC_CONFIG_HEADERS([config.h]) @@ -1041,11 +1041,14 @@ CPPFLAGS=$CPPFLAGS' -DMET_BASE="\"$(pkgdatadir)\""' AC_SUBST(FC_LIBS, [-lgfortran]) -# The CXXFLAGS default to "-O2 -g". The optimization is causing -# problems so just set it to "-g" if the user hasn't overridden it -# themselves. +# For GNU compilers, CFLAGS, CXXFLAGS, and FFLAGS default to "-O2 -g". +# The CXXFLAGS "-O2" optimization has caused problems in the past. +# For Intel compilers, "-g" slows down runtimes considerably (MET #1778). +# For development, retain the "-g" option. Otherwise, discard it. -: ${CXXFLAGS="-g"} +AM_COND_IF([ENABLE_DEVELOPMENT], [: ${CFLAGS="-g -O2"}], [: ${CFLAGS="-O2"}]) +AM_COND_IF([ENABLE_DEVELOPMENT], [: ${CXXFLAGS="-g"} ], [: ${CXXFLAGS=""}] ) +AM_COND_IF([ENABLE_DEVELOPMENT], [: ${FFLAGS="-g -O2"}], [: ${FFLAGS="-O2"}]) # Checks for programs. From d39433e1dbd6067276a8381df04bd56e7fee5173 Mon Sep 17 00:00:00 2001 From: "Julie.Prestopnik" Date: Mon, 10 May 2021 11:58:36 -0600 Subject: [PATCH 141/165] Made suggested changes by Tara Jensen --- met/docs/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/met/docs/conf.py b/met/docs/conf.py index eff4dbae1f..814c69634c 100644 --- a/met/docs/conf.py +++ b/met/docs/conf.py @@ -19,12 +19,12 @@ project = 'MET' author = 'UCAR/NCAR, NOAA, CSU/CIRA, and CU/CIRES' -author_list = 'Bullock, R., Fowler, T., Halley Gotway, J., Newman, K., Jensen, T., Brown, B.' +author_list = 'Halley Gotway, J., K. Newman, H. Soh, J. Opatz, T. Jensen, J. Prestopnik, L. Goodrich, D. Fillmore, B. Brown, R. Bullock, T. Fowler' version = 'develop' verinfo = version release = f'{version}' release_year = '2021' -release_date = f'{release_year}-04-26' +release_date = f'{release_year}-05-10' copyright = f'{release_year}, {author}' # -- General configuration --------------------------------------------------- From 1e50cd2752d2bf6e99ebe7f5a3b211180348bb28 Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Mon, 10 May 2021 14:02:11 -0600 Subject: [PATCH 142/165] Update python embedding docs to list required packages for the base python version. --- met/docs/Users_Guide/appendixF.rst | 4 +++- met/docs/Users_Guide/installation.rst | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/met/docs/Users_Guide/appendixF.rst b/met/docs/Users_Guide/appendixF.rst index 187d77465d..aaaa228318 100644 --- a/met/docs/Users_Guide/appendixF.rst +++ b/met/docs/Users_Guide/appendixF.rst @@ -6,13 +6,15 @@ Appendix F Python Embedding Introduction ____________ -MET includes the ability to embed Python to a limited degree. Users may use Python scripts and whatever associated Python packages they wish in order to prepare 2D gridded data fields, point observations, and matched pairs as input to the MET tools. We fully expect that this degree of embedding will increase in the future. In addition, plans are in place to extend Python with MET in upcoming releases, allowing users to invoke MET tools directly from their Python script. While MET version 8.0 was built on Python 2.x, MET version 9.0 is built on Python 3.6+. +MET includes the ability to embed Python to a limited degree. Users may use Python scripts and whatever associated Python packages they wish in order to prepare 2D gridded data fields, point observations, and matched pairs as input to the MET tools. We fully expect that this degree of embedding will increase in the future. In addition, plans are in place to extend Python with MET in upcoming releases, allowing users to invoke MET tools directly from their Python script. While MET version 8.0 was built on Python 2.x, MET versions 9.0 and beyond are built on Python 3.6+. Compiling Python Support ________________________ In order to use Python embedding, the user's local Python installation must have the C-language Python header files and libraries. Sometimes when Python is installed locally, these header files and libraries are deleted at the end of the installation process, leaving only the binary executable and run-time shared object files. But the Python header files and libraries must be present to compile support in MET for Python embedding. Assuming the requisite Python files are present, and that Python embedding is enabled when building MET (which is done by passing the **--enable-python** option to the **configure** command line), the MET C++ code will use these in the compilation process to link directly to the Python libraries. +The local Python installation must also support a minimum set of required packages. The MET build includes some python wrapper scripts to facilitate the passing of data in memory as well as the reading and writing of temporary files. The packages required by those wrapper scripts are **sys, os, argparse, importlib, numpy and netCDF4**. While most of these are standard packages and readily available, numpy and netCDF4 may not be. Users are advised to confirm their availability prior to compiling MET with python embedding support. + In addition to the **configure** option mentioned above, two variables, **MET_PYTHON_CC** and **MET_PYTHON_LD**, must also be set for the configuration process. These may either be set as environment variables or as command line options to **configure**. These constants are passed as compiler command line options when building MET to enable the compiler to find the requisite Python header files and libraries in the user's local filesystem. Fortunately, Python provides a way to set these variables properly. This frees the user from the necessity of having any expert knowledge of the compiling and linking process. Along with the **Python** executable, there should be another executable called **python3-config**, whose output can be used to set these environment variables as follows: • On the command line, run “**python3-config --cflags**”. Set the value of **MET_PYTHON_CC** to the output of that command. diff --git a/met/docs/Users_Guide/installation.rst b/met/docs/Users_Guide/installation.rst index 013cd4d384..ec53e46232 100644 --- a/met/docs/Users_Guide/installation.rst +++ b/met/docs/Users_Guide/installation.rst @@ -177,7 +177,7 @@ The following environment variables should also be set: MET_PYTHON_CC='-I/usr/include/python3.6' MET_PYTHON_LD='-L/usr/lib/python3.6/config-x86_64-linux-gnu -lpython3.6m' - For more information about Python support in MET, please refer to :numref:`Appendix F, Section %s `. + Note that this version of Python must include support for a minimum set of required pacakges. For more information about Python support in MET, including the list of required packages, please refer to :numref:`Appendix F, Section %s `. * If compiling MODIS-Regrid and/or lidar2nc, set $MET_HDF to point to the main HDF4 directory, or set $MET_HDFINC to point to the directory with the HDF4 include files and set $MET_HDFLIB to point to the directory with the HDF4 library files. Also, set $MET_HDFEOS to point to the main HDF EOS directory, or set $MET_HDFEOSINC to point to the directory with the HDF EOS include files and set $MET_HDFEOSLIB to point to the directory with the HDF EOS library files. From 3b7b7fef38f1e792e3387fdc9a6d5405969ab174 Mon Sep 17 00:00:00 2001 From: johnhg Date: Mon, 10 May 2021 15:37:25 -0600 Subject: [PATCH 143/165] Feature 1786 v10.0.0 (#1787) * Per #1786, updates for the v10.0.0 release. Note that no changes were needed in conf.py. It had already been updated. * Added update MET to compile using GNU version 10 compilers and PGI version 20 compilers * Made updates to improve compilation * Per #1768, added a couple more 10.0.0 release notes. * Adding pgi config file from cheyenne Co-authored-by: Julie.Prestopnik --- met/docs/Users_Guide/release-notes.rst | 15 ++++++++-- scripts/installation/compile_MET_all.sh | 27 +++++++++-------- .../config/install_met_env.cheyenne_pgi | 29 +++++++++++++++++++ 3 files changed, 57 insertions(+), 14 deletions(-) create mode 100644 scripts/installation/config/install_met_env.cheyenne_pgi diff --git a/met/docs/Users_Guide/release-notes.rst b/met/docs/Users_Guide/release-notes.rst index 536170ede6..70d1a1a028 100644 --- a/met/docs/Users_Guide/release-notes.rst +++ b/met/docs/Users_Guide/release-notes.rst @@ -20,11 +20,16 @@ MET Version |version| release notes (|release_date|) * Run the nightly build as the shared met_test user (`#1116 `_). * Correct the time offset for tests in unit_plot_data_plane.xml (`#1677 `_). * Enhance the sample plotting R-script to read output from different versions of MET (`#1653 `_). - + * Update the default configuration options to compile the development code with the debug (-g) option and the production code without it (`#1788 `_). + * Update MET to compile using GCC version 10 (`#1552 https://github.com/dtcenter/MET/issues/1552`_). + * Update MET to compile using PGI version 20 (`#1317 https://github.com/dtcenter/MET/issues/1317`_). + * Documentation: * **Migrate the MET documentation to Read the Docs** (`#1649 `_). - * Enhance and update documentation (`#1459 `_ and `#1460 `_). + * Enhance and update documentation (`#1459 `_ and `#1460 `_, and `#1731 `_). + * Enhance the python embedding documentation (`#1468 `_). + * Document the supported grid definition templates (`#1469 `_). * Update comments at the top of each MET config file directing users to the MET User's Guide (`#1598 `_). * Migrate content from README and README_TC in data/config to the MET User's Guide (`#1474 `_). * Add version selector to the Sphinx documentation page (`#1461 `_). @@ -46,6 +51,7 @@ MET Version |version| release notes (|release_date|) * Python embedding enhancements: + * Note that the netCDF4 Python package is now required in place of the pickle package! * **Replace the pickle format for temporary python files with NetCDF for gridded data** (`#1319 `_, `#1697 `_). * **Replace the pickle format for temporary python files with ASCII for point observations in ascii2nc and matched pair data in Stat-Analysis** (`#1319 `_, `#1700 `_). * **Complete support for Python XArray embedding** (`#1534 `_). @@ -108,6 +114,10 @@ MET Version |version| release notes (|release_date|) * Improve the point2grid runtime performance (`#1421 `_). * Process point observations by variable name instead of GRIB code (`#1408 `_). + * GIS Tools: + + * Fix memory corruption bug in the gis_dump_dbf utility which causes it to abort at runtime (`#1777 `_). + * Plot-Point-Obs Tool: * **Overhaul Plot-Point-Obs to make it highly configurable** (`#213 `_, `#1528 `_, and `#1052 `_). @@ -120,6 +130,7 @@ MET Version |version| release notes (|release_date|) * **Add detailed log messages when discarding observations** (`#1588 `_). * Update log messages (`#1514 `_). * Enhance the validation of masking regions to check for non-unique masking region names (`#1439 `_). + * Fix Point-Stat runtime error for some CF-complaint NetCDF files (`#1782 `_). * Grid-Stat Tool: diff --git a/scripts/installation/compile_MET_all.sh b/scripts/installation/compile_MET_all.sh index 0d11f4f8fd..3357e80b73 100755 --- a/scripts/installation/compile_MET_all.sh +++ b/scripts/installation/compile_MET_all.sh @@ -64,11 +64,11 @@ if [ ! -e $TAR_DIR ]; then fi # Update library linker path -export LD_LIBRARY_PATH=${TEST_BASE}/external_libs/lib:${MET_PYTHON}/lib:${MET_NETCDF}/lib:${MET_HDF5}/lib:${MET_BUFRLIB}:${MET_GRIB2CLIB}:${LIB_JASPER}:${LIB_LIBPNG}:${LIB_Z}:${LD_LIBRARY_PATH} +export LD_LIBRARY_PATH=${TEST_BASE}/external_libs/lib${MET_PYTHON:+:$MET_PYTHON/lib}${MET_NETCDF:+:$MET_NETCDF/lib}${MET_HDF5:+:$MET_HDF5/lib}${MET_BUFRLIB:+:$MET_BUFRLIB}${MET_GRIB2CLIB:+:$MET_GRIB2CLIB}${LIB_JASPER:+$LIB_JASPER}${LIB_LIBPNG:+:$LIB_JASPER}${LIB_Z:+$LIB_Z}:${LD_LIBRARY_PATH} echo "LD_LIBRARY_PATH = ${LD_LIBRARY_PATH}" # Constants -if [[ -z ${MET_GRIB2CLIB} && -z ${MET_GRIB2CINC} ]]; then +if [[ -z ${MET_GRIB2CLIB} ]] && [[ -z ${MET_GRIB2C} ]]; then COMPILE_ZLIB=1 COMPILE_LIBPNG=1 COMPILE_JASPER=1 @@ -185,7 +185,7 @@ elif [ ${COMPILER_FAMILY} = "pgi" ]; then export F77=${F90} export FC=${F90} fi -elif [[ ${COMPILER_FAMILY} == "intel" ]] || [[ ${COMPILER_FAMILY} == "ics" ]] || [[ ${COMPILER_FAMILY} == "ips" ]] || [[ ${COMPILER_FAMILY} == "PrgEnv-intel" ]]; then +elif [[ ${COMPILER_FAMILY} == "intel" ]] || [[ ${COMPILER_FAMILY} == "ics" ]] || [[ ${COMPILER_FAMILY} == "ips" ]] || [[ ${COMPILER_FAMILY} == "PrgEnv-intel" ]]; then if [ -z ${CC} ]; then export CC=`which icc` else @@ -353,8 +353,8 @@ if [[ $COMPILE_LIBPNG -eq 1 && $HOST != ys* ]]; then tar -xzf ${TAR_DIR}/libpng*.tar.gz cd libpng* echo "cd `pwd`" - echo "./configure --prefix=${LIB_DIR} LDFLAGS=-L/${LIB_DIR}/lib CPPFLAGS=-I/${LIB_DIR}/include > configure.log 2>&1" - ./configure --prefix=${LIB_DIR} LDFLAGS=-L/${LIB_DIR}/lib CPPFLAGS=-I/${LIB_DIR}/include > configure.log 2>&1 + echo "./configure --prefix=${LIB_DIR} LDFLAGS=-L${LIB_DIR}/lib CPPFLAGS=-I${LIB_DIR}/include > configure.log 2>&1" + ./configure --prefix=${LIB_DIR} LDFLAGS=-L${LIB_DIR}/lib CPPFLAGS=-I${LIB_DIR}/include > configure.log 2>&1 ret=$? if [ $ret != 0 ]; then echo "configure returned with non-zero ($ret) status" @@ -530,8 +530,8 @@ if [ $COMPILE_NETCDF -eq 1 ]; then tar -xzf ${TAR_DIR}/hdf5*.tar.gz cd hdf5* echo "cd `pwd`" - echo "./configure --prefix=${LIB_DIR} --with-zlib=${LIB_DIR}/lib CFLAGS=-fPIC CXXFLAGS=-fPIC LDFLAGS=-L${LIB_DIR}/lib CPPFLAGS=-I${LIB_DIR}/include > configure.log 2>&1" - ./configure --prefix=${LIB_DIR} --with-zlib=${LIB_Z} CFLAGS=-fPIC CXXFLAGS=-fPIC LDFLAGS=-L${LIB_DIR}/lib:{LIB_Z} CPPFLAGS=-I${LIB_DIR}/include > configure.log 2>&1 + echo "./configure --prefix=${LIB_DIR} --with-zlib=${LIB_DIR}/lib CFLAGS=-fPIC CXXFLAGS=-fPIC FFLAGS=-fPIC LDFLAGS=-L${LIB_DIR}/lib CPPFLAGS=-I${LIB_DIR}/include > configure.log 2>&1" + ./configure --prefix=${LIB_DIR} --with-zlib=${LIB_Z} CFLAGS=-fPIC CXXFLAGS=-fPIC FFLAGS=-fPIC LDFLAGS=-L${LIB_DIR}/lib:${LIB_Z} CPPFLAGS=-I${LIB_DIR}/include > configure.log 2>&1 ret=$? if [ $ret != 0 ]; then echo "configure returned with non-zero ($ret) status" @@ -674,8 +674,8 @@ if [ $COMPILE_CAIRO -eq 1 ]; then export PKG_CONFIG_PATH=${LIB_DIR}/lib/pkgconfig/ fi echo "cd `pwd`" - echo "./configure --prefix=${LIB_DIR} ax_cv_c_float_words_bigendian=no LDFLAGS=-L/${LIB_DIR}/lib CPPFLAGS=-I/${LIB_DIR}/include > configure.log 2>&1" - ./configure --prefix=${LIB_DIR} ax_cv_c_float_words_bigendian=no LDFLAGS=-L/${LIB_DIR}/lib CPPFLAGS=-I/${LIB_DIR}/include > configure.log 2>&1 + echo "./configure --prefix=${LIB_DIR} ax_cv_c_float_words_bigendian=no LDFLAGS=-L${LIB_DIR}/lib CPPFLAGS=-I${LIB_DIR}/include > configure.log 2>&1" + ./configure --prefix=${LIB_DIR} ax_cv_c_float_words_bigendian=no LDFLAGS=-L${LIB_DIR}/lib CPPFLAGS=-I${LIB_DIR}/include > configure.log 2>&1 ret=$? if [ $ret != 0 ]; then echo "configure returned with non-zero ($ret) status" @@ -748,9 +748,12 @@ if [ $COMPILE_MET -eq 1 ]; then export MET_PYTHON_LD=${MET_PYTHON_LD} export MET_PYTHON_CC=${MET_PYTHON_CC} export LDFLAGS="-Wl,--disable-new-dtags" - export LDFLAGS="${LDFLAGS} -Wl,-rpath,${LIB_DIR}/lib:${MET_NETCDF}/lib:${MET_HDF5}/lib:${MET_BUFRLIB}:${MET_GRIB2CLIB}:${MET_PYTHON}/lib:${MET_GSL}/lib" - export LDFLAGS="${LDFLAGS} -Wl,-rpath,${LIB_JASPER}:${LIB_LIBPNG}:${LIB_Z}" - export LDFLAGS="${LDFLAGS} -L${LIB_JASPER} -L${LIB_LIBPNG} -L${MET_HDF5}/lib" + # https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html + # ${parameter:+word} + # If parameter is null or unset, nothing is substituted, otherwise the expansion of word is substituted. + export LDFLAGS="${LDFLAGS} -Wl,-rpath,${LIB_DIR}/lib${MET_NETCDF:+:$MET_NETCDF/lib}${MET_HDF5:+:$MET_HDF5/lib}${MET_BUFRLIB:+:$MET_BUFRLIB}${MET_GRIB2CLIB:+:$MET_GRIB2CLIB}${MET_PYTHON:+:$MET_PYTHON/lib}${MET_GSL:+$MET_GSL/lib}" + export LDFLAGS="${LDFLAGS} -Wl,-rpath,${LIB_JASPER:+$LIB_JASPER}${LIB_LIBPNG:+:$LIB_JASPER}${LIB_Z:+$LIB_Z}" + export LDFLAGS="${LDFLAGS} ${LIB_JASPER:+-L$LIB_JASPER} ${LIB_LIBPNG:+-L$LIB_LIBPNG} ${MET_HDF5:+-L$MET_HDF5/lib}" export LIBS="${LIBS} -lhdf5_hl -lhdf5 -lz" export MET_FONT_DIR=${TEST_BASE}/fonts diff --git a/scripts/installation/config/install_met_env.cheyenne_pgi b/scripts/installation/config/install_met_env.cheyenne_pgi new file mode 100644 index 0000000000..635f93e8f3 --- /dev/null +++ b/scripts/installation/config/install_met_env.cheyenne_pgi @@ -0,0 +1,29 @@ +module load ncarenv/1.3 +module load pgi/20.4 +module load python/3.7.9 +ncar_pylib + +export TEST_BASE=/glade/p/ral/jntp/MET/MET_cross_platform_testing/met-10.0.0-beta4/pgi +export COMPILER=pgi_20.4 +export MET_SUBDIR=${TEST_BASE} +export MET_TARBALL=met-10.0.0-beta4.20210302.tar.gz +export USE_MODULES=TRUE +export MET_PYTHON=/glade/u/apps/ch/opt/python/3.7.9/gnu/9.1.0 +export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.7m +export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.7m\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm +export EXTERNAL_LIBS=/glade/p/ral/jntp/MET/MET_cross_platform_testing/met-10.0.0-beta4/pgi/external_libs/ +export MET_NETCDF=${EXTERNAL_LIBS} +export MET_GSL=${EXTERNAL_LIBS} +export MET_BUFRLIB=${EXTERNAL_LIBS} +export BUFRLIB_NAME=-lbufr +export MET_HDF5=${EXTERNAL_LIBS} +export MET_GRIB2CLIB=${EXTERNAL_LIBS}/lib +export MET_GRIB2CINC=${EXTERNAL_LIBS}/include +export GRIB2CLIB_NAME=-lgrib2c +export LIB_JASPER=${EXTERNAL_LIBS}/lib +export LIB_LIBPNG=${EXTERNAL_LIBS}/lib +export LIB_Z=${EXTERNAL_LIBS}/lib +export SET_D64BIT=FALSE +export CFLAGS="-Wall -g" +export CXXFLAGS="-Wall -g -lcurl" + From 7283fb37991e28cada1935821a8eb722342f86a0 Mon Sep 17 00:00:00 2001 From: johnhg Date: Wed, 12 May 2021 11:28:23 -0600 Subject: [PATCH 144/165] Per #1789, remove duplicate plot_point_obs configuration section. (#1791) --- met/docs/Users_Guide/plotting.rst | 125 ------------------------------ 1 file changed, 125 deletions(-) diff --git a/met/docs/Users_Guide/plotting.rst b/met/docs/Users_Guide/plotting.rst index 31f915068f..04e9ee629a 100644 --- a/met/docs/Users_Guide/plotting.rst +++ b/met/docs/Users_Guide/plotting.rst @@ -201,131 +201,6 @@ Users are encouraged to define as many **point_data** array entries as needed to For each observation, this tool stores the observation latitude, longitude, and value. However, unless the **dotsize(x)** function is not constant or the **fill_plot_info.flag** entry is set to true, the observation value is simply set to a flag value. For each **plot_data** array entry, the tool stores and plots only the unique combination of observation latitude, longitude, and value. Therefore multiple obsevations at the same location will typically be plotted as a single circle. -plot_point_obs configuration file -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The default configuration file for the Plot-Point-Obs tool named **PlotPointObsConfig_default** can be found in the installed *share/met/config* directory. The contents of the configuration file are described in the subsections below. - -Note that environment variables may be used when editing configuration files, as described in :numref:`pb2nc configuration file` for the PB2NC tool. - -______________________ - -.. code-block:: none - - grid_data = { - - field = []; - - grid_plot_info = { - color_table = "MET_BASE/colortables/met_default.ctable"; - plot_min = 0.0; - plot_max = 0.0; - colorbar_flag = TRUE; - } - } - -The **grid_data** dictionary defines a gridded field of data to be plotted as a base image prior to plotting point locations on top of it. The data to be plotted is specified by the **field** array. If **field** is empty, no base image will be plotted. If **field** has length one, the requested data will be read from the input file specified by the **-plot_grid** command line argument. - -The **grid_plot_info** dictionary inside **grid_data** specifies the options for for plotting the gridded data. The options within **grid_plot_info** are described in :numref:`config_options`. - -______________________ - -.. code-block:: none - - point_data = [ - { fill_color = [ 255, 0, 0 ]; } - ]; - -The **point_data** entry is an array of dictionaries. Each dictionary may include a list of filtering, data processing, and plotting options, described below. For each input point observation, the tool checks the **point_data** filtering options in the order specified. The point information is added to the first matching array entry. The default entry simply specifies that all points be plotted red. - -______________________ - -.. code-block:: none - - msg_typ = []; - sid_inc = []; - sid_exc = []; - obs_var = []; - obs_quality = []; - -The options listed above define filtering criteria for the input point observation strings. If empty, no filtering logic is applied. If a comma-separated list of strings is provided, only those observations meeting all of the criteria are included. The **msg_typ** entry specifies the message type. The **sid_inc** and **sid_exc** entries explicitly specify station id's to be included or excluded. The **obs_var** entry specifies the observation variable names, and **obs_quality** specifies quality control strings. - -______________________ - -.. code-block:: none - - obs_gc = []; - -When using older point observation files which have GRIB codes, the **obs_gc** entry specifies a list of integer GRIB codes to be included. - -______________________ - -.. code-block:: none - - valid_beg = ""; - valid_end = ""; - -The **valid_beg** and **valid_end** options are time strings which specify a range of dates to be included. When left to their default empty strings no time filtering is applied. - -______________________ - -.. code-block:: none - - lat_thresh = NA; - lon_thresh = NA; - elv_thresh = NA; - hgt_thresh = NA; - prs_thresh = NA; - obs_thresh = NA; - -The options listed above define filtering thresholds for the input point observation values. The default NA thresholds always evaluate to true and therefore apply no filtering. The **lat_thresh** and **lon_thresh** thresholds filter the latitude and longitude of the point observations, respectively. The **elv_thresh** threshold filters by the station elevation. The **hgt_thresh** and **prs_thresh** thresholds filter by the observation height and pressure level. The **obs_thresh** threshold filters by the observation value. - -______________________ - -.. code-block:: none - - convert(x) = x; - censor_thresh = []; - censor_val = []; - -The **convert(x)** function, **censor_thresh** option, and **censor_val** option may be specified separately for each **point_data** array entry to transform the observation values prior to plotting. These options are further described in :numref:`config_options`. - -______________________ - -.. code-block:: none - - dotsize(x) = 10; - -The **dotsize(x)** function defines the size of the circle to be plotted as a function of the observation value. The default setting shown above defines the dot size as a constant value. - -______________________ - -.. code-block:: none - - line_color = []; - line_width = 1; - -The **line_color** and **line_width** entries define the color and thickness of the outline for each circle plotted. When **line_color** is left as an empty array, no outline is drawn. Otherwise, **line_color** should be specified using 3 intergers between 0 and 255 to define the red, green, and blue components of the color. - -______________________ - -.. code-block:: none - - fill_color = []; - fill_plot_info = { // Overrides fill_color - flag = FALSE; - color_table = "MET_BASE/colortables/met_default.ctable"; - plot_min = 0.0; - plot_max = 0.0; - colorbar_flag = TRUE; - } - -The circles are filled in based on the setting of the **fill_color** and **fill_plot_info** entries. As described above for **line_color**, if **fill_color** is empty, the points are not filled in. Otherwise, **fill_color** must be specified using 3 integers between 0 and 255. If **fill_plot_info.flag** is set to true, then its settings override **fill_color**. The **fill_plot_info** dictionary defines a colortable which is used to determine the color to be used based on the observation value. - -Users are encouraged to define as many **point_data** array entries as needed to filter and plot the input observations in the way they would like. Each point observation is plotted using the options specified in the first matching array entry. Note that the filtering, processing, and plotting options specified inside each **point_data** array entry take precedence over ones specified at the higher level of configuration file context. - -For each observation, this tool stores the observation latitude, longitude, and value. However, unless the **dotsize(x)** function is not constant or the **fill_plot_info.flag** entry is set to true, the observation value is simply set to a flag value. For each **plot_data** array entry, the tool stores and plots only the unique combination of observation latitude, longitude, and value. Therefore multiple obsevations at the same location will typically be plotted as a single circle. - .. _plot_data_plane-usage: plot_data_plane usage From a0dcfd9e806436b15fd9003ff3afcdc6de69eac1 Mon Sep 17 00:00:00 2001 From: MET Tools Test Account Date: Fri, 14 May 2021 10:49:42 -0600 Subject: [PATCH 145/165] Update the version of Fortify on kiowa from 19.2.0 to 20.2.1. --- scripts/environment/development.kiowa | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/environment/development.kiowa b/scripts/environment/development.kiowa index a9192bbe74..00659dd3d4 100644 --- a/scripts/environment/development.kiowa +++ b/scripts/environment/development.kiowa @@ -42,4 +42,4 @@ export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:\ /usr/bin/X11:/opt/bin:${MET_NETCDF}/bin" # Fortify bin directory -export FORTIFY_BIN=/d1/projects/Fortify/19.2.0/Fortify_SCA_and_Apps_19.2.0/bin +export FORTIFY_BIN=/d1/projects/Fortify/20.2.1/Fortify_SCA_and_Apps_20.2.1/bin From 9a242f5a876473ecd19358e963ca5a9da98cb61f Mon Sep 17 00:00:00 2001 From: Howard Soh Date: Thu, 20 May 2021 08:07:39 -0600 Subject: [PATCH 146/165] #1795 Release memory at time_values --- met/src/libcode/vx_data2d_nccf/nccf_file.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/met/src/libcode/vx_data2d_nccf/nccf_file.cc b/met/src/libcode/vx_data2d_nccf/nccf_file.cc index a43c25fcb5..f948800ef1 100644 --- a/met/src/libcode/vx_data2d_nccf/nccf_file.cc +++ b/met/src/libcode/vx_data2d_nccf/nccf_file.cc @@ -375,6 +375,7 @@ bool NcCfFile::open(const char * filepath) } } } + delete [] time_values; } NcVar init_time_var = get_var(_ncFile, "forecast_reference_time"); From 754889bbffd850a650f262c064569c6bdf6a6247 Mon Sep 17 00:00:00 2001 From: johnhg Date: Thu, 20 May 2021 12:20:53 -0600 Subject: [PATCH 147/165] Bugfix 1798 develop py_grid_string (#1800) * Per #1798, fix up the read_tmpe_dataplane.py script to handle a grid string or dictionary. * Per #1798, add a test to unit_python.xml to exercise this bugfix. --- met/data/wrappers/read_tmp_dataplane.py | 9 +++++++-- test/xml/unit_python.xml | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/met/data/wrappers/read_tmp_dataplane.py b/met/data/wrappers/read_tmp_dataplane.py index 09e2530ef0..98bbe728d8 100644 --- a/met/data/wrappers/read_tmp_dataplane.py +++ b/met/data/wrappers/read_tmp_dataplane.py @@ -17,14 +17,19 @@ ds = nc.Dataset(netcdf_filename, 'r') met_data = ds['met_data'][:] met_attrs = {} + +# grid is defined as a dictionary or string grid = {} for attr, attr_val in ds.__dict__.items(): - if 'grid' in attr: + if 'grid.' in attr: grid_attr = attr.split('.')[1] grid[grid_attr] = attr_val else: met_attrs[attr] = attr_val -met_attrs['grid'] = grid + +if grid: + met_attrs['grid'] = grid + met_attrs['name'] = met_attrs['name_str'] del met_attrs['name_str'] met_info['met_data'] = met_data diff --git a/test/xml/unit_python.xml b/test/xml/unit_python.xml index 572e2f925d..801fe16b2d 100644 --- a/test/xml/unit_python.xml +++ b/test/xml/unit_python.xml @@ -374,6 +374,26 @@ + + + &MET_BIN;/plot_data_plane + + MET_PYTHON_EXE &MET_PYTHON_EXE; + PYTHON_GRID G212 + + \ + PYTHON_NUMPY \ + &OUTPUT_DIR;/python/letter_numpy_grid_name_user_python.ps \ + 'name = "&MET_BASE;/python/read_ascii_numpy_grid.py &DATA_DIR_PYTHON;/letter.txt LETTER";' \ + -plot_range 0.0 255.0 \ + -title "Grid Name: 'G212'" \ + -v 1 + + + &OUTPUT_DIR;/python/letter_numpy_grid_name_user_python.ps + + + &MET_BIN;/ascii2nc From fa51ade9d486de8d379e3c6b3db27cff855694a7 Mon Sep 17 00:00:00 2001 From: Howard Soh Date: Thu, 20 May 2021 16:41:09 -0600 Subject: [PATCH 148/165] #1794 Corrected the offset for Filter --- met/src/libcode/vx_render/renderinfo.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/met/src/libcode/vx_render/renderinfo.cc b/met/src/libcode/vx_render/renderinfo.cc index a57330dfee..2fe1b85537 100644 --- a/met/src/libcode/vx_render/renderinfo.cc +++ b/met/src/libcode/vx_render/renderinfo.cc @@ -157,7 +157,7 @@ void RenderInfo::add_filter(const int k) { -if ( Nfilters > max_filters ) { +if ( Nfilters >= max_filters ) { mlog << Error << "\nRenderInfo::add_filter() -> " << "too many filters!\n\n"; From c2ab53137db13da8e69e4271429006274ef3d6dd Mon Sep 17 00:00:00 2001 From: bikegeek Date: Thu, 20 May 2021 17:23:00 -0600 Subject: [PATCH 149/165] Github Issue #1801: Comment out code that checks for BEST track to support extra-tropical cyclone tracks not verified against BEST tracks. --- met/scripts/Rscripts/plot_tcmpr.R | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/met/scripts/Rscripts/plot_tcmpr.R b/met/scripts/Rscripts/plot_tcmpr.R index cf9c9c45d8..ffeeb2b43c 100644 --- a/met/scripts/Rscripts/plot_tcmpr.R +++ b/met/scripts/Rscripts/plot_tcmpr.R @@ -477,12 +477,14 @@ for(i in 1:length(info_list)) { cat("Found ", length(uniq_list), " unique entries for ", info_list[i], ": ", paste(uniq_list, collapse=", "), "\n", sep=''); + # Comment out to support plotting extra-tropical cyclone tracks not + # verified against BEST tracks # Check for a single BDECK model - if(info_list[i] == "BMODEL" & length(uniq_list) != 1) { - cat("ERROR: Must have exactly 1 BDECK model name. ", - "Try setting \"-bmodel name\" in the \"-filter\" option.\n"); - quit(status=1); - } + #if(info_list[i] == "BMODEL" & length(uniq_list) != 1) { + # cat("ERROR: Must have exactly 1 BDECK model name. ", + # "Try setting \"-bmodel name\" in the \"-filter\" option.\n"); + # quit(status=1); + #} } ######################################################################## From 8d9128c3034f7ac496143b6ebc0d13e36bcdff67 Mon Sep 17 00:00:00 2001 From: Howard Soh Date: Fri, 21 May 2021 08:35:32 -0600 Subject: [PATCH 150/165] #1795 Cleanup --- met/src/libcode/vx_grid/gaussian_grid.cc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/met/src/libcode/vx_grid/gaussian_grid.cc b/met/src/libcode/vx_grid/gaussian_grid.cc index c44bd8a3dd..6a175077a4 100644 --- a/met/src/libcode/vx_grid/gaussian_grid.cc +++ b/met/src/libcode/vx_grid/gaussian_grid.cc @@ -157,20 +157,18 @@ for (j=0; j Date: Fri, 21 May 2021 08:36:53 -0600 Subject: [PATCH 151/165] #1795 Create DataCube for 2D or 3D only, not both to avoid memory leak --- .../tc_utils/rmw_analysis/rmw_analysis.cc | 72 ++++++++++--------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/met/src/tools/tc_utils/rmw_analysis/rmw_analysis.cc b/met/src/tools/tc_utils/rmw_analysis/rmw_analysis.cc index 5965ba8c84..5f02d8bb34 100644 --- a/met/src/tools/tc_utils/rmw_analysis/rmw_analysis.cc +++ b/met/src/tools/tc_utils/rmw_analysis/rmw_analysis.cc @@ -243,41 +243,26 @@ void setup() { // Initialize statistical data cube lists for(int i_var = 0; i_var < data_names.size(); i_var++) { - // Size data cubes - DataCube* data_count_2d = new DataCube(); - DataCube* data_count_3d = new DataCube(); - DataCube* data_mean_2d = new DataCube(); - DataCube* data_mean_3d = new DataCube(); - DataCube* data_stdev_2d = new DataCube(); - DataCube* data_stdev_3d = new DataCube(); - DataCube* data_max_2d = new DataCube(); - DataCube* data_max_3d = new DataCube(); - DataCube* data_min_2d = new DataCube(); - DataCube* data_min_3d = new DataCube(); - - data_count_2d->set_size(n_range, n_azimuth, 1); - data_count_3d->set_size(n_range, n_azimuth, n_level); - data_mean_2d->set_size(n_range, n_azimuth, 1); - data_mean_3d->set_size(n_range, n_azimuth, n_level); - data_stdev_2d->set_size(n_range, n_azimuth, 1); - data_stdev_3d->set_size(n_range, n_azimuth, n_level); - data_max_2d->set_size(n_range, n_azimuth, 1); - data_max_3d->set_size(n_range, n_azimuth, n_level); - data_min_2d->set_size(n_range, n_azimuth, 1); - data_min_3d->set_size(n_range, n_azimuth, n_level); - - data_count_2d->set_constant(0); - data_count_3d->set_constant(0); - data_mean_2d->set_constant(0); - data_mean_3d->set_constant(0); - data_stdev_2d->set_constant(0); - data_stdev_3d->set_constant(0); - data_max_2d->set_constant(-1.0e6); - data_max_3d->set_constant(-1.0e6); - data_min_2d->set_constant(1.0e6); - data_min_3d->set_constant(1.0e6); - if (data_n_dims[i_var] == 2) { + // Size data cubes + DataCube* data_count_2d = new DataCube(); + DataCube* data_mean_2d = new DataCube(); + DataCube* data_stdev_2d = new DataCube(); + DataCube* data_max_2d = new DataCube(); + DataCube* data_min_2d = new DataCube(); + + data_count_2d->set_size(n_range, n_azimuth, 1); + data_mean_2d->set_size(n_range, n_azimuth, 1); + data_stdev_2d->set_size(n_range, n_azimuth, 1); + data_max_2d->set_size(n_range, n_azimuth, 1); + data_min_2d->set_size(n_range, n_azimuth, 1); + + data_count_2d->set_constant(0); + data_mean_2d->set_constant(0); + data_stdev_2d->set_constant(0); + data_max_2d->set_constant(-1.0e6); + data_min_2d->set_constant(1.0e6); + data_counts.push_back(data_count_2d); data_means.push_back(data_mean_2d); data_stdevs.push_back(data_stdev_2d); @@ -285,6 +270,25 @@ void setup() { data_maxs.push_back(data_max_2d); } if (data_n_dims[i_var] == 3) { + // Size data cubes + DataCube* data_count_3d = new DataCube(); + DataCube* data_mean_3d = new DataCube(); + DataCube* data_stdev_3d = new DataCube(); + DataCube* data_max_3d = new DataCube(); + DataCube* data_min_3d = new DataCube(); + + data_count_3d->set_size(n_range, n_azimuth, n_level); + data_mean_3d->set_size(n_range, n_azimuth, n_level); + data_stdev_3d->set_size(n_range, n_azimuth, n_level); + data_max_3d->set_size(n_range, n_azimuth, n_level); + data_min_3d->set_size(n_range, n_azimuth, n_level); + + data_count_3d->set_constant(0); + data_mean_3d->set_constant(0); + data_stdev_3d->set_constant(0); + data_max_3d->set_constant(-1.0e6); + data_min_3d->set_constant(1.0e6); + data_counts.push_back(data_count_3d); data_means.push_back(data_mean_3d); data_stdevs.push_back(data_stdev_3d); From 564c6571eb4d7ca63aedf2e23a2d7636bed8f86c Mon Sep 17 00:00:00 2001 From: jprestop Date: Fri, 21 May 2021 09:53:17 -0600 Subject: [PATCH 152/165] Bugfix 1395 develop comp script (#1804) * Updated compile script and added assocaited config files * Added jet config file * Updated orion file * Added new stampede config file and modulefiles for various machines --- scripts/installation/compile_MET_all.sh | 6 +- ...tall_met_env.cray => install_MET_env.cray} | 14 ++-- ...tall_met_env.dell => install_MET_env.dell} | 15 ++-- .../config/install_met_env.cheyenne | 18 ----- .../installation/config/install_met_env.jet | 10 +-- .../installation/config/install_met_env.orion | 14 ++-- ..._env.casper => install_met_env_all.casper} | 10 +-- .../config/install_met_env_all.cheyenne | 18 +++++ .../config/install_met_env_all.hera | 13 ++++ .../config/install_met_env_met_only.casper | 28 ++++++++ .../config/install_met_env_met_only.cheyenne | 30 ++++++++ ...env.hera => install_met_env_met_only.hera} | 17 +++-- .../config/install_met_env_met_only.stampede | 28 ++++++++ .../installation/modulefiles/10.0.0_casper | 20 ++++++ .../installation/modulefiles/10.0.0_cheyenne | 29 ++++++++ scripts/installation/modulefiles/10.0.0_cray | 37 ++++++++++ scripts/installation/modulefiles/10.0.0_dell | 31 +++++++++ scripts/installation/modulefiles/10.0.0_hera | 68 +++++++++++++++++++ scripts/installation/modulefiles/10.0.0_jet | 21 ++++++ scripts/installation/modulefiles/10.0.0_orion | 46 +++++++++++++ .../installation/modulefiles/10.0.0_stampede | 23 +++++++ 21 files changed, 435 insertions(+), 61 deletions(-) rename scripts/installation/config/{install_met_env.cray => install_MET_env.cray} (80%) rename scripts/installation/config/{install_met_env.dell => install_MET_env.dell} (77%) delete mode 100644 scripts/installation/config/install_met_env.cheyenne rename scripts/installation/config/{install_met_env.casper => install_met_env_all.casper} (70%) create mode 100644 scripts/installation/config/install_met_env_all.cheyenne create mode 100644 scripts/installation/config/install_met_env_all.hera create mode 100644 scripts/installation/config/install_met_env_met_only.casper create mode 100644 scripts/installation/config/install_met_env_met_only.cheyenne rename scripts/installation/config/{install_met_env.hera => install_met_env_met_only.hera} (76%) create mode 100644 scripts/installation/config/install_met_env_met_only.stampede create mode 100644 scripts/installation/modulefiles/10.0.0_casper create mode 100644 scripts/installation/modulefiles/10.0.0_cheyenne create mode 100644 scripts/installation/modulefiles/10.0.0_cray create mode 100644 scripts/installation/modulefiles/10.0.0_dell create mode 100644 scripts/installation/modulefiles/10.0.0_hera create mode 100755 scripts/installation/modulefiles/10.0.0_jet create mode 100644 scripts/installation/modulefiles/10.0.0_orion create mode 100644 scripts/installation/modulefiles/10.0.0_stampede diff --git a/scripts/installation/compile_MET_all.sh b/scripts/installation/compile_MET_all.sh index 3357e80b73..96569b6241 100755 --- a/scripts/installation/compile_MET_all.sh +++ b/scripts/installation/compile_MET_all.sh @@ -64,7 +64,7 @@ if [ ! -e $TAR_DIR ]; then fi # Update library linker path -export LD_LIBRARY_PATH=${TEST_BASE}/external_libs/lib${MET_PYTHON:+:$MET_PYTHON/lib}${MET_NETCDF:+:$MET_NETCDF/lib}${MET_HDF5:+:$MET_HDF5/lib}${MET_BUFRLIB:+:$MET_BUFRLIB}${MET_GRIB2CLIB:+:$MET_GRIB2CLIB}${LIB_JASPER:+$LIB_JASPER}${LIB_LIBPNG:+:$LIB_JASPER}${LIB_Z:+$LIB_Z}:${LD_LIBRARY_PATH} +export LD_LIBRARY_PATH=${TEST_BASE}/external_libs/lib${MET_PYTHON:+:$MET_PYTHON/lib}${MET_NETCDF:+:$MET_NETCDF/lib}${MET_HDF5:+:$MET_HDF5/lib}${MET_BUFRLIB:+:$MET_BUFRLIB}${MET_GRIB2CLIB:+:$MET_GRIB2CLIB}${LIB_JASPER:+$LIB_JASPER}${LIB_LIBPNG:+:$LIB_JASPER}${LIB_Z:+$LIB_Z}${MET_GSL:+:$MET_GSL/lib}:${LD_LIBRARY_PATH} echo "LD_LIBRARY_PATH = ${LD_LIBRARY_PATH}" # Constants @@ -751,8 +751,8 @@ if [ $COMPILE_MET -eq 1 ]; then # https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html # ${parameter:+word} # If parameter is null or unset, nothing is substituted, otherwise the expansion of word is substituted. - export LDFLAGS="${LDFLAGS} -Wl,-rpath,${LIB_DIR}/lib${MET_NETCDF:+:$MET_NETCDF/lib}${MET_HDF5:+:$MET_HDF5/lib}${MET_BUFRLIB:+:$MET_BUFRLIB}${MET_GRIB2CLIB:+:$MET_GRIB2CLIB}${MET_PYTHON:+:$MET_PYTHON/lib}${MET_GSL:+$MET_GSL/lib}" - export LDFLAGS="${LDFLAGS} -Wl,-rpath,${LIB_JASPER:+$LIB_JASPER}${LIB_LIBPNG:+:$LIB_JASPER}${LIB_Z:+$LIB_Z}" + export LDFLAGS="${LDFLAGS} -Wl,-rpath,${LIB_DIR}/lib${MET_NETCDF:+:$MET_NETCDF/lib}${MET_HDF5:+:$MET_HDF5/lib}${MET_BUFRLIB:+:$MET_BUFRLIB}${MET_GRIB2CLIB:+:$MET_GRIB2CLIB}${MET_PYTHON:+:$MET_PYTHON/lib}${MET_GSL:+:$MET_GSL/lib}" + export LDFLAGS="${LDFLAGS} -Wl,-rpath,${LIB_JASPER:+$LIB_JASPER}${LIB_LIBPNG:+:$LIB_PNG}${LIB_Z:+$LIB_Z}" export LDFLAGS="${LDFLAGS} ${LIB_JASPER:+-L$LIB_JASPER} ${LIB_LIBPNG:+-L$LIB_LIBPNG} ${MET_HDF5:+-L$MET_HDF5/lib}" export LIBS="${LIBS} -lhdf5_hl -lhdf5 -lz" export MET_FONT_DIR=${TEST_BASE}/fonts diff --git a/scripts/installation/config/install_met_env.cray b/scripts/installation/config/install_MET_env.cray similarity index 80% rename from scripts/installation/config/install_met_env.cray rename to scripts/installation/config/install_MET_env.cray index 3b20ef7c0d..4adea40a2c 100644 --- a/scripts/installation/config/install_met_env.cray +++ b/scripts/installation/config/install_MET_env.cray @@ -10,10 +10,10 @@ module load NetCDF-intel-sandybridge/4.7.4 module load HDF5-parallel-intel-sandybridge/1.10.6 module use /gpfs/hps/nco/ops/nwprod/lib/modulefiles module load bufr-intel/11.0.1 -module load g2c-intel/1.5.0 module load jasper-gnu-sandybridge/1.900.1 module load png-intel-sandybridge/1.2.44 module load zlib-intel-sandybridge/1.2.7 +module load g2c-intel/1.6.3 export FC=ftn export F77=ftn @@ -21,11 +21,11 @@ export F90=ftn export CC=cc export CXX=CC export CRAYPE_LINK_TYPE=dynamic -export TEST_BASE=/gpfs/hps3/emc/meso/noscrub/emc.metplus/for_nco/met/9.1 +export TEST_BASE=/gpfs/hps3/emc/meso/noscrub/emc.metplus/met/10.0.0 export BIN_DIR_PATH=${TEST_BASE}/exec export COMPILER=intel_18.1.163 export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=met-9.1.20200810.tar.gz +export MET_TARBALL=met-10.0.0.20210510.tar.gz export USE_MODULES=TRUE export PYTHON_MODULE=python_3.6.3 export MET_PYTHON=/gpfs/hps/usrx/local/prod/python/3.6.3 @@ -34,12 +34,12 @@ export MET_PYTHON_LD=-L/gpfs/hps/usrx/local/prod/python/3.6.3/lib\ -lpython3.6m\ export MET_NETCDF=$NETCDF export MET_HDF5=$HDF5 export MET_BUFRLIB=/gpfs/hps/nco/ops/nwprod/lib/bufr/v11.3.0/intel -export MET_GRIB2CLIB=/gpfs/hps/nco/ops/nwprod/lib/g2c/v1.5.0/intel -export MET_GRIB2CINC=/gpfs/hps/nco/ops/nwprod/lib/g2c/v1.5.0/src +export MET_GRIB2CLIB=/gpfs/hps/nco/ops/nwprod/lib/g2c/v1.6.3/intel +export MET_GRIB2CINC=/gpfs/hps/nco/ops/nwprod/lib/g2c/v1.6.3/intel/include/libg2c_v1.6.3_4 export MET_GSL=$GSL_ROOT export BUFRLIB_NAME=-lbufr_v11.3.0_4_64 -export GRIB2CLIB_NAME=-lg2c_v1.5.0_4 +export GRIB2CLIB_NAME=-lg2c_v1.6.3_4 export LIB_JASPER=/usrx/local/prod/jasper/1.900.1/gnu/sandybridge/lib export LIB_LIBPNG=/usrx/local/prod/png/1.2.44/intel/sandybridge/lib export LIB_Z=/usrx/local/prod/zlib/1.2.7/intel/sandybridge/lib -export SET_D64BIT=TRUE +export SET_D64BIT=FALSE diff --git a/scripts/installation/config/install_met_env.dell b/scripts/installation/config/install_MET_env.dell similarity index 77% rename from scripts/installation/config/install_met_env.dell rename to scripts/installation/config/install_MET_env.dell index e85bd9dc00..5c3dbdb673 100644 --- a/scripts/installation/config/install_met_env.dell +++ b/scripts/installation/config/install_MET_env.dell @@ -3,17 +3,18 @@ module load python/3.6.3 module load NetCDF/4.5.0 module load HDF5-serial/1.10.1 module load bufr/11.3.0 -module load g2c/1.5.0 module load zlib/1.2.11 module load jasper/1.900.1 module load libpng/1.2.59 module load gsl/2.1 +module load g2c/1.6.3 -export TEST_BASE=/gpfs/dell2/emc/verification/noscrub/emc.metplus/for_nco/met/9.1 +export TEST_BASE=/gpfs/dell2/emc/verification/noscrub/emc.metplus/met/10.0.0 +export LIB_DIR=${TEST_BASE}/external_libs export BIN_DIR_PATH=${TEST_BASE}/exec export COMPILER=ips_18.0.5.274 export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=met-9.1.20200810.tar.gz +export MET_TARBALL=met-10.0.0.20210510.tar.gz export USE_MODULES=TRUE export PYTHON_MODULE=python_3.6.3 export MET_PYTHON=/usrx/local/prod/packages/python/3.6.3/ @@ -22,12 +23,12 @@ export MET_PYTHON_LD=-L/usrx/local/prod/packages/python/3.6.3/lib/\ -lpython3.6m export MET_NETCDF=/usrx/local/prod/packages/ips/18.0.1/netcdf/4.5.0 export MET_HDF5=/usrx/local/prod/packages/ips/18.0.1/hdf5/1.10.1 export MET_BUFRLIB=/gpfs/dell1/nco/ops/nwprod/lib/bufr/v11.3.0/ips/18.0.1 -export MET_GRIB2CLIB=/gpfs/dell1/nco/ops/nwprod/lib/g2c/v1.5.0/ips/18.0.1 -export MET_GRIB2CINC=/gpfs/dell1/nco/ops/nwprod/lib/g2c/v1.5.0/src +export MET_GRIB2CLIB=/gpfs/dell1/nco/ops/nwprod/lib/g2c/v1.6.3/ips/18.0.1/lib +export MET_GRIB2CINC=/gpfs/dell1/nco/ops/nwprod/lib/g2c/v1.6.3/ips/18.0.1/include/libg2c_v1.6.3_4 export MET_GSL=$GSL_ROOT export BUFRLIB_NAME=-lbufr_v11.3.0_4_64 -export GRIB2CLIB_NAME=-lg2c_v1.5.0_4 +export GRIB2CLIB_NAME=-lg2c_v1.6.3_4 export LIB_JASPER=/usrx/local/prod/packages/gnu/4.8.5/jasper/1.900.1/lib export LIB_LIBPNG=/usrx/local/prod/packages/gnu/4.8.5/libpng/1.2.59/lib export LIB_Z=/usrx/local/prod/packages/ips/18.0.1/zlib/1.2.11/lib -export SET_D64BIT=TRUE +export SET_D64BIT=FALSE diff --git a/scripts/installation/config/install_met_env.cheyenne b/scripts/installation/config/install_met_env.cheyenne deleted file mode 100644 index a62ec10ab1..0000000000 --- a/scripts/installation/config/install_met_env.cheyenne +++ /dev/null @@ -1,18 +0,0 @@ -module load ncarenv/1.3 -module load intel/19.0.5 -module load python/3.7.5 -module load netcdf/4.7.3 -ncar_pylib - -export TEST_BASE=/glade/p/ral/jntp/MET/MET_releases/9.1 -export COMPILER=intel_19.0.5 -export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=met-9.1.20200810.tar.gz -export USE_MODULES=TRUE -export MET_PYTHON=/glade/u/apps/ch/opt/python/3.7.5/gnu/8.3.0 -export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.7m -export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.7m\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm -export MET_NETCDF=/glade/u/apps/ch/opt/netcdf/4.7.3/intel/19.0.5 -export SET_D64BIT=FALSE -export CFLAGS="-Wall -g" -export CXXFLAGS="-Wall -g" diff --git a/scripts/installation/config/install_met_env.jet b/scripts/installation/config/install_met_env.jet index be38709ff3..19cd1be739 100644 --- a/scripts/installation/config/install_met_env.jet +++ b/scripts/installation/config/install_met_env.jet @@ -1,15 +1,11 @@ -module load intel/18.0.5.274 -module load intelpython/3.6.5 -module load netcdf/4.6.1 -module load hdf5/1.10.4 -export TEST_BASE=/contrib/met/9.0 +export TEST_BASE=/contrib/met/10.0.0 export COMPILER=intel_18.0.5.274 export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=met-9.0.1.20200423.tar.gz +export MET_TARBALL=met-10.0.0.20210510.tar.gz export USE_MODULES=TRUE export PYTHON_MODULE=intelpython_3.6.5 export MET_PYTHON=/apps/intel/intelpython3 export MET_PYTHON_CC=-I/apps/intel/intelpython3/include/python3.6m export MET_PYTHON_LD=-L/apps/intel/intelpython3/lib\ -lpython3.6m\ -lpthread\ -ldl\ -lutil\ -lrt\ -lm\ -Xlinker\ -export-dynamic export MET_NETCDF=/apps/netcdf/4.6.1/intel/18.0.5.274 -export MET_HDF5=/apps/hdf5/1.10.4/intel/18.0.5.274 +export MET_HDF5=/apps/hdf5/1.10.4/intel_seq/18.0.5.274 diff --git a/scripts/installation/config/install_met_env.orion b/scripts/installation/config/install_met_env.orion index ce5219d638..790407dd51 100644 --- a/scripts/installation/config/install_met_env.orion +++ b/scripts/installation/config/install_met_env.orion @@ -1,14 +1,14 @@ -module load intel/2020 -module load intelpython3/2020 +module load intel/2020.2 +module load intelpython3/2020.2 -export TEST_BASE=/apps/contrib/MET/9.1 +export TEST_BASE=/apps/contrib/MET/10.0.0 export COMPILER=intel_2020 export MET_SUBDIR=${TEST_BASE}/ -export MET_TARBALL=met-9.1.20200810.tar.gz +export MET_TARBALL=met-10.0.0.20210510.tar.gz export USE_MODULES=TRUE -export MET_PYTHON=/apps/intel-2020/intel-2020/intelpython3/ -export MET_PYTHON_CC=-I/apps/intel-2020/intel-2020/intelpython3/include/python3.7m -export MET_PYTHON_LD=-L/apps/intel-2020/intel-2020/intelpython3/lib\ -lpython3.7m\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lrt\ -lm +export MET_PYTHON=/apps/intel-2020.2/intel-2020.2/intelpython3 +export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.7m +export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.7m\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lrt\ -lm export SET_D64BIT=FALSE export CFLAGS="-Wall -g" export CXXFLAGS="-Wall -g" diff --git a/scripts/installation/config/install_met_env.casper b/scripts/installation/config/install_met_env_all.casper similarity index 70% rename from scripts/installation/config/install_met_env.casper rename to scripts/installation/config/install_met_env_all.casper index a203c63f44..360d65ea44 100644 --- a/scripts/installation/config/install_met_env.casper +++ b/scripts/installation/config/install_met_env_all.casper @@ -1,17 +1,17 @@ module load intel/19.0.5 module load python/3.7.5 -module load netcdf/4.7.3 +module load netcdf/4.7.4 ncar_pylib -export TEST_BASE=/glade/p/ral/jntp/MET/MET_releases/casper/9.1 +export TEST_BASE=/glade/p/ral/jntp/MET/MET_releases/casper/10.0.0 export COMPILER=intel_19.0.5 export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=met-9.1.20200810.tar.gz +export MET_TARBALL=met-10.0.0.20210510.tar.gz export USE_MODULES=TRUE export MET_PYTHON=/glade/u/apps/dav/opt/python/3.7.5/gnu/8.3.0/ export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.7m export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.7m\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm export MET_NETCDF=/glade/u/apps/dav/opt/netcdf/4.7.3/intel/19.0.5 export SET_D64BIT=FALSE -export CFLAGS="-Wall -g" -export CXXFLAGS="-Wall -g" +#export CFLAGS="-Wall -g" +#export CXXFLAGS="-Wall -g" diff --git a/scripts/installation/config/install_met_env_all.cheyenne b/scripts/installation/config/install_met_env_all.cheyenne new file mode 100644 index 0000000000..1c9b9533a6 --- /dev/null +++ b/scripts/installation/config/install_met_env_all.cheyenne @@ -0,0 +1,18 @@ +module load ncarenv/1.3 +module load intel/19.0.5 +module load python/3.7.9 +module load netcdf/4.7.4 +ncar_pylib + +export TEST_BASE=/glade/p/ral/jntp/MET/MET_releases/10.0.0 +export COMPILER=intel_19.0.5 +export MET_SUBDIR=${TEST_BASE} +export MET_TARBALL=met-10.0.0.20210510.tar.gz +export USE_MODULES=TRUE +export MET_PYTHON=/glade/u/apps/ch/opt/python/3.7.9/gnu/9.1.0 +export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.7m +export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.7m\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm +export MET_NETCDF=/glade/u/apps/ch/opt/netcdf/4.7.4/intel/19.0.5/ +export SET_D64BIT=FALSE +#export CFLAGS="-Wall -g" +#export CXXFLAGS="-Wall -g" diff --git a/scripts/installation/config/install_met_env_all.hera b/scripts/installation/config/install_met_env_all.hera new file mode 100644 index 0000000000..a9ea2355bd --- /dev/null +++ b/scripts/installation/config/install_met_env_all.hera @@ -0,0 +1,13 @@ +module use -a /contrib/anaconda/modulefiles +module load intel/18.0.5.274 +module load anaconda/latest +export TEST_BASE=/contrib/met/10.0.0 +export COMPILER=intel_18.0.5.274 +export MET_SUBDIR=${TEST_BASE} +export MET_TARBALL=met-10.0.0.20210510.tar.gz +export USE_MODULES=TRUE +export PYTHON_MODULE=anaconda_latest +export MET_PYTHON=/contrib/anaconda/anaconda3/latest/ +export MET_PYTHON_CC=-I${MET_PYTHON}include/python3.7m +export MET_PYTHON_LD=-L${MET_PYTHON}/lib/python3.7/config-3.7m-x86_64-linux-gnu\ -L${MET_PYTHON}/lib\ -lpython3.7m\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lrt\ -lm\ -Xlinker\ -export-dynamic +export SET_D64BIT=FALSE diff --git a/scripts/installation/config/install_met_env_met_only.casper b/scripts/installation/config/install_met_env_met_only.casper new file mode 100644 index 0000000000..02eb6a1c13 --- /dev/null +++ b/scripts/installation/config/install_met_env_met_only.casper @@ -0,0 +1,28 @@ +module load intel/19.0.5 +module load python/3.7.5 +module load netcdf/4.7.4 +ncar_pylib + +export TEST_BASE=/glade/p/ral/jntp/MET/MET_releases/casper/10.0.0 +export COMPILER=intel_19.0.5 +export MET_SUBDIR=${TEST_BASE} +export MET_TARBALL=met-10.0.0.20210510.tar.gz +export USE_MODULES=TRUE +export MET_PYTHON=/glade/u/apps/dav/opt/python/3.7.5/gnu/8.3.0/ +export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.7m +export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.7m\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm +export MET_NETCDF=/glade/u/apps/dav/opt/netcdf/4.7.4/intel/19.0.5 +export EXTERNAL_LIBS=/glade/p/ral/jntp/MET/MET_releases/casper/10.0.0/external_libs +export MET_GSL=${EXTERNAL_LIBS} +export MET_BUFRLIB=${EXTERNAL_LIBS} +export BUFRLIB_NAME=-lbufr +export MET_HDF5=${EXTERNAL_LIBS} +export MET_GRIB2CLIB=${EXTERNAL_LIBS}/lib +export MET_GRIB2CINC=${EXTERNAL_LIBS}/include +export GRIB2CLIB_NAME=-lgrib2c +export LIB_JASPER=${EXTERNAL_LIBS}/lib +export LIB_LIBPNG=${EXTERNAL_LIBS}/lib +export LIB_Z=${EXTERNAL_LIBS}/lib +export SET_D64BIT=FALSE +#export CFLAGS="-Wall -g" +#export CXXFLAGS="-Wall -g" diff --git a/scripts/installation/config/install_met_env_met_only.cheyenne b/scripts/installation/config/install_met_env_met_only.cheyenne new file mode 100644 index 0000000000..81de3a5406 --- /dev/null +++ b/scripts/installation/config/install_met_env_met_only.cheyenne @@ -0,0 +1,30 @@ +module load ncarenv/1.3 +module load intel/19.0.5 +module load python/3.7.9 +module load netcdf/4.7.4 +ncar_pylib + +export TEST_BASE=/glade/p/ral/jntp/MET/MET_releases/10.0.0 +export COMPILER=intel_19.0.5 +export MET_SUBDIR=${TEST_BASE} +export MET_TARBALL=met-10.0.0.20210510.tar.gz +export USE_MODULES=TRUE +export MET_PYTHON=/glade/u/apps/ch/opt/python/3.7.9/gnu/9.1.0 +export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.7m +export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.7m\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lm +export MET_NETCDF=/glade/u/apps/ch/opt/netcdf/4.7.4/intel/19.0.5/ +export +EXTERNAL_LIBS=/glade/p/ral/jntp/MET/MET_releases/10.0.0/external_libs +export MET_GSL=${EXTERNAL_LIBS} +export MET_BUFRLIB=${EXTERNAL_LIBS} +export BUFRLIB_NAME=-lbufr +export MET_HDF5=${EXTERNAL_LIBS} +export MET_GRIB2CLIB=${EXTERNAL_LIBS}/lib +export MET_GRIB2CINC=${EXTERNAL_LIBS}/include +export GRIB2CLIB_NAME=-lgrib2c +export LIB_JASPER=${EXTERNAL_LIBS}/lib +export LIB_LIBPNG=${EXTERNAL_LIBS}/lib +export LIB_Z=${EXTERNAL_LIBS}/lib +export SET_D64BIT=FALSE +#export CFLAGS="-Wall -g" +#export CXXFLAGS="-Wall -g" diff --git a/scripts/installation/config/install_met_env.hera b/scripts/installation/config/install_met_env_met_only.hera similarity index 76% rename from scripts/installation/config/install_met_env.hera rename to scripts/installation/config/install_met_env_met_only.hera index 2ba085d542..7966263813 100644 --- a/scripts/installation/config/install_met_env.hera +++ b/scripts/installation/config/install_met_env_met_only.hera @@ -1,25 +1,28 @@ module use -a /contrib/anaconda/modulefiles module load intel/18.0.5.274 module load anaconda/latest -export TEST_BASE=/contrib/met/9.1 +export TEST_BASE=/contrib/met/10.0.0 export COMPILER=intel_18.0.5.274 export MET_SUBDIR=${TEST_BASE} -export MET_TARBALL=met-9.1.1.20201118.tar.gz +export MET_TARBALL=met-10.0.0.20210510.tar.gz export USE_MODULES=TRUE export PYTHON_MODULE=anaconda_latest export MET_PYTHON=/contrib/anaconda/anaconda3/latest/ export MET_PYTHON_CC=-I${MET_PYTHON}include/python3.7m export MET_PYTHON_LD=-L${MET_PYTHON}/lib/python3.7/config-3.7m-x86_64-linux-gnu\ -L${MET_PYTHON}/lib\ -lpython3.7m\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lrt\ -lm\ -Xlinker\ -export-dynamic -export EXTERNAL_LIBS=/contrib/met/9.1/external_libs -export MET_NETCDF=/contrib/met/9.1/external_libs +export EXTERNAL_LIBS=/contrib/met/10.0.0/external_libs/ +export MET_NETCDF=${EXTERNAL_LIBS} +export MET_GSL=${EXTERNAL_LIBS} +export MET_BUFRLIB=${EXTERNAL_LIBS} +export BUFRLIB_NAME=-lbufr export MET_HDF5=${EXTERNAL_LIBS} -export MET_BUFRLIB=${EXTERNAL_LIBS}/lib export MET_GRIB2CLIB=${EXTERNAL_LIBS}/lib export MET_GRIB2CINC=${EXTERNAL_LIBS}/include -export MET_GSL=${EXTERNAL_LIBS} -export BUFRLIB_NAME=-lbufr export GRIB2CLIB_NAME=-lgrib2c export LIB_JASPER=${EXTERNAL_LIBS}/lib export LIB_LIBPNG=${EXTERNAL_LIBS}/lib export LIB_Z=${EXTERNAL_LIBS}/lib export SET_D64BIT=FALSE +#export CFLAGS="-Wall -g" +#export CXXFLAGS="-Wall -g -lcurl" + diff --git a/scripts/installation/config/install_met_env_met_only.stampede b/scripts/installation/config/install_met_env_met_only.stampede new file mode 100644 index 0000000000..7113983130 --- /dev/null +++ b/scripts/installation/config/install_met_env_met_only.stampede @@ -0,0 +1,28 @@ +module load intel/18.0.2 +module load python3/3.7.0 +module load hdf5/1.10.4 +module load netcdf/4.6.2 + +export TEST_BASE=/work2/06612/tg859120/stampede2/met/10.0.0 +export COMPILER=intel_18.0.2 +export MET_SUBDIR=${TEST_BASE}/ +export MET_TARBALL=met-10.0.0.20210510.tar.gz +export USE_MODULES=TRUE +export MET_PYTHON=/opt/apps/intel18/python3/3.7.0 +export MET_PYTHON_CC=-I${MET_PYTHON}/include/python3.7m +export MET_PYTHON_LD=-L${MET_PYTHON}/lib\ -lpython3.7m\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lrt\ -lm +export MET_HDF5=/opt/apps/intel18/hdf5/1.10.4/x86_64/ +export MET_NETCDF=/opt/apps/intel18/netcdf/4.6.2/x86_64/ +export EXTERNAL_LIBS=/work2/06612/tg859120/stampede2/met/10.0.0/external_libs +export MET_GSL=${EXTERNAL_LIBS} +export MET_BUFRLIB=${EXTERNAL_LIBS} +export BUFRLIB_NAME=-lbufr +export MET_GRIB2CLIB=${EXTERNAL_LIBS}/lib +export MET_GRIB2CINC=${EXTERNAL_LIBS}/include +export GRIB2CLIB_NAME=-lgrib2c +export LIB_JASPER=${EXTERNAL_LIBS}/lib +export LIB_LIBPNG=${EXTERNAL_LIBS}/lib +export LIB_Z=${EXTERNAL_LIBS}/lib +export SET_D64BIT=FALSE +#export CFLAGS="-Wall -g" +#export CXXFLAGS="-Wall -g" diff --git a/scripts/installation/modulefiles/10.0.0_casper b/scripts/installation/modulefiles/10.0.0_casper new file mode 100644 index 0000000000..27504264a6 --- /dev/null +++ b/scripts/installation/modulefiles/10.0.0_casper @@ -0,0 +1,20 @@ +#%Module###################################################################### +## +## Model Evaluation Tools +## +proc ModulesHelp { } { + puts stderr "Sets up the paths and environment variables to use the Model Evaluation Tools v10.0.0 *** For help see the official MET webpage at http://www.dtcenter.org/met/users ***" +} + +# The intel compiler is required to run MET +module load intel/19.0.5 +module load python/3.7.5 +module load netcdf/4.7.4 + +set base /glade/p/ral/jntp/MET/MET_releases/casper/10.0.0 +set ver 10.0.0 +set share $base/share/met + +prepend-path PATH $base/bin:/glade/p/ral/jntp/MET/MET_releases/casper/10.0.0/external_libs/bin + +setenv METversion V$ver diff --git a/scripts/installation/modulefiles/10.0.0_cheyenne b/scripts/installation/modulefiles/10.0.0_cheyenne new file mode 100644 index 0000000000..98bd539cfc --- /dev/null +++ b/scripts/installation/modulefiles/10.0.0_cheyenne @@ -0,0 +1,29 @@ +#%Module###################################################################### +## +## Model Evaluation Tools +## +proc ModulesHelp { } { + puts stderr "Sets up the paths and environment variables to use the Model Evaluation Tools v10.0.0 + *** For help see the official MET webpage at http://www.dtcenter.org/met/users ***" +} + +# If they exist, remove ncdump and ncgen from /glade/p/ral/jntp/MET/MET_releases/10.0.0/external_libs/bin + +# The intel compiler is required to run MET +module load ncarenv/1.3 +module load intel/19.0.5 +module load python/3.7.9 +module load netcdf/4.7.4 + +set base /glade/p/ral/jntp/MET/MET_releases/10.0.0 +set ver 10.0.0 +set share $base/share/met + +prepend-path PATH $base/bin:/glade/p/ral/jntp/MET/MET_releases/10.0.0/external_libs/bin + + +setenv METversion V$ver + +# setenv MET_BUFRLIB /glade/p/ral/jntp/MET/MET_releases/10.0.0/external_libs/libs +# setenv MET_GRIB2C /glade/p/ral/jntp/MET/MET_releases/10.0.0/external_libs +# setenv MET_GSL /glade/p/ral/jntp/MET/MET_releases/10.0.0/external_libs diff --git a/scripts/installation/modulefiles/10.0.0_cray b/scripts/installation/modulefiles/10.0.0_cray new file mode 100644 index 0000000000..e50a8bc1dd --- /dev/null +++ b/scripts/installation/modulefiles/10.0.0_cray @@ -0,0 +1,37 @@ +#%Module###################################################################### +## +## Model Evaluation Tools +## +proc ModulesHelp { } { + puts stderr "Sets up the paths and environment variables to use the Model Evaluation Tools v10.0.0 + *** For help see the official MET webpage at http://www.dtcenter.org/met/users ***" +} + +# The intel compiler is required to run MET + +module load PrgEnv-intel/5.2.56 +module unload intel/15.0.3.187 +module load intel/18.1.163 +module swap craype-haswell craype-sandybridge +module load cray-mpich/7.2.0 +module load python/3.6.3 +module load gsl-intel-haswell/2.1 +module use /usrx/local/dev/modulefiles +module load NetCDF-intel-sandybridge/4.7.4 +module load HDF5-parallel-intel-sandybridge/1.10.6 +module use /gpfs/hps/nco/ops/nwprod/lib/modulefiles +module load bufr-intel/11.0.1 +module load jasper-gnu-sandybridge/1.900.1 +module load png-intel-sandybridge/1.2.44 +module load zlib-intel-sandybridge/1.2.7 +module load g2c-intel/1.6.3 + +set base /gpfs/hps3/emc/meso/noscrub/emc.metplus/met/10.0.0 +set ver 10.0.0 +set share $base/share/met +set lib_base $base + +prepend-path PATH $base/exec + +setenv METversion V$ver +setenv MET_ROOT $base diff --git a/scripts/installation/modulefiles/10.0.0_dell b/scripts/installation/modulefiles/10.0.0_dell new file mode 100644 index 0000000000..05e23803e1 --- /dev/null +++ b/scripts/installation/modulefiles/10.0.0_dell @@ -0,0 +1,31 @@ +#%Module###################################################################### +## +## Model Evaluation Tools +## +proc ModulesHelp { } { + puts stderr "Sets up the paths and environment variables to use the Model Evaluation Tools v10.0.0 + *** For help see the official MET webpage at http://www.dtcenter.org/met/users ***" +} + +# The intel compiler is required to run MET + +module load ips/18.0.1.163 +module load python/3.6.3 +module load bufr/11.3.0 +module load NetCDF/4.5.0 +module load HDF5-serial/1.8.20 +module load jasper/1.900.1 +module load libpng/1.2.59 +module load zlib/1.2.11 +module load gsl/2.1 +module load g2c/1.6.3 + +set base /gpfs/dell2/emc/verification/noscrub/emc.metplus/met/10.0.0 +set ver 10.0.0 +set share $base/share/met +set lib_base $base + +prepend-path PATH $base/exec + +setenv METversion V$ver +setenv MET_ROOT $base diff --git a/scripts/installation/modulefiles/10.0.0_hera b/scripts/installation/modulefiles/10.0.0_hera new file mode 100644 index 0000000000..216c567fb8 --- /dev/null +++ b/scripts/installation/modulefiles/10.0.0_hera @@ -0,0 +1,68 @@ +#%Module###################################################################### +## +## Model Evaluation Tools +## +proc ModulesHelp { } { + puts stderr "Sets up the paths and environment variables to use the Model Evaluation Tools v10.0.0 + *** For help see the official MET webpage at http://www.dtcenter.org/met/users ***" +} + +# The intel compiler is required to run MET +prereq intel +prereq anaconda/latest + +set base /contrib/met +set ver 10.0.0 +set share $base/$ver/share/met +set lib_base $base/10.0.0 + + +prepend-path PATH $base/$ver/bin:$lib_base/external_libs/bin + + +#prepend-path LD_LIBRARY_PATH $lib_base/external_libs/lib + +#setenv METversion $ver +#setenv MET_ROOT $base/$ver/met-10.0.0-beta5 +#setenv MET_CONFIG $share/config +#setenv MET_POLY $share/poly +#setenv MET_COLORTABLES $share/colortables +#setenv MET_PS $share/ps +#setenv MET_TCDATA $share/tc_data +#setenv MET_TABLES $share/table_files +### +#setenv CC icc +#setenv CXX icc +#setenv F77 ifort + +#module load intel/18.0.5.274 +#module load anaconda/latest + +#setenv libdir /contrib/met/10.0.0-beta5/external_libs/lib +#setenv incdir /contrib/met/10.0.0-beta5/external_libs/include +#setenv iprefix /contrib/met/10.0.0-beta5/external_libs +#setenv basedir /contrib/met/10.0.0-beta5/met-10.0.0-beta5 + +#setenv MET_HDF5 $iprefix +#setenv MET_NETCDF $incdir +#setenv MET_GRIB2CINC $incdir +#setenv MET_GRIB2CLIB $libdir +#setenv MET_GSLLIB $libdir +#setenv MET_GSLINC $incdir +#setenv MET_BUFR $libdir +#setenv MET_HDFINC $incdir +#setenv MET_HDFLIB $libdir +#setenv MET_HDFEOSINC $incdir +#setenv MET_HDFEOSLIB $libdir +#setenv MET_PYTHON /contrib/anaconda3/latest +#setenv MET_PYTHON_CC -I/contrib/anaconda/anaconda3/latest/include/python3.7m +#setenv MET_PYTHON_LD -L/contrib/anaconda/anaconda3/latest/lib\ -lpython3.7m\ -lpthread\ -ldl\ -lutil\ -lm\ -Xlinker\ -export-dynamic +#setenv MET_FONT_DIR $basedir/fonts/ + +# CAIRO and FREETYPE were not used +#setenv MET_CAIROLIB $libdir +#setenv MET_CAIROINC $incdir/cairo +#setenv MET_FREETYPELIB $libdir +#setenv MET_FREETYPEINC $incdir/freetype2 + + diff --git a/scripts/installation/modulefiles/10.0.0_jet b/scripts/installation/modulefiles/10.0.0_jet new file mode 100755 index 0000000000..4d379eb920 --- /dev/null +++ b/scripts/installation/modulefiles/10.0.0_jet @@ -0,0 +1,21 @@ +#%Module###################################################################### +## +## Model Evaluation Tools +## +proc ModulesHelp { } { + puts stderr "Sets up the paths and environment variables to use the Model Evaluation Tools v10.0.0 + *** For help see the official MET webpage at http://www.dtcenter.org/met/users ***" +} + +prereq intel +prereq intelpython/3.6.5 +prereq netcdf/4.6.1 +prereq hdf5/1.10.4 + +set base /contrib/met/10.0.0 +set ver 10.0.0 +set share $base/share/met + +prepend-path PATH $base/bin:$base/external_libs/bin:/apps/intel/intelpython3/bin:/apps/netcdf/4.6.1/intel/18.0.5.274/bin:/apps/hdf5/1.10.4/intel_seq/18.0.5.274/bin + + diff --git a/scripts/installation/modulefiles/10.0.0_orion b/scripts/installation/modulefiles/10.0.0_orion new file mode 100644 index 0000000000..cbc04944f5 --- /dev/null +++ b/scripts/installation/modulefiles/10.0.0_orion @@ -0,0 +1,46 @@ +#%Module###################################################################### +## +## Model Evaluation Tools +## +proc ModulesHelp { } { + puts stderr "Sets up the paths and environment variables to use the Model Evaluation Tools v10.0.0. + *** For help see the official MET webpage at http://www.dtcenter.org/met/users ***" +} + +prereq intel/2020.2 +prereq intelpython3/2020.2 + +set base /apps/contrib/MET +set ver 10.0.0 +set share $base/$ver/share/met +set lib_base $base/10.0.0 + +prepend-path PATH $base/$ver/bin:$lib_base/external_libs/bin + +#export CC=icc +#export CXX=icc +#export F77=ifort +#module load intel/2020.2 +#module load intelpython3/2020.2 +#export libdir=/apps/contrib/met/10.0.0/external_libs/lib +#export incdir=/apps/contrib/met/10.0.0/external_libs/include +#export iprefix=/apps/contrib/met/10.0.0/external_libs +#export basedir=/apps/contrib/met/10.0.0/met-10.0.0 +#export MET_HDF5=$iprefix +#export MET_NETCDF=$incdir +#export MET_GRIB2CINC=$incdir +#export MET_GRIB2CLIB=$libdir +#setenv MET_GSLLIB=$libdir +#export MET_GSLINC=$incdir +#export MET_BUFR=$libdir +#export MET_HDFINC=$incdir +#export MET_HDFLIB=$libdir +#export MET_HDFEOSINC=$incdir +#export MET_HDFEOSLIB=$libdir +#export MET_PYTHON=/apps/intel-2020/intel-2020/intelpython3/ +#export MET_PYTHON_CC=-I/apps/intel-2020/intel-2020/intelpython3/include/python3.7m +#exoprt MET_PYTHON_LD=-L/apps/intel-2020/intel-2020/intelpython3/lib\ -lpython3.7m\ -lcrypt\ -lpthread\ -ldl\ -lutil\ -lrt\ -lm +#export MET_FONT_DIR=$basedir/fonts/ +#export LDFLAGS=-Wl,--disable-new-dtags -Wl,-rpath,${libdir}:${MET_PYTHON}/lib +#export CPPFLAGS=-I/apps/contrib/met/10.0.0/external_libs/include + diff --git a/scripts/installation/modulefiles/10.0.0_stampede b/scripts/installation/modulefiles/10.0.0_stampede new file mode 100644 index 0000000000..baf04f43f0 --- /dev/null +++ b/scripts/installation/modulefiles/10.0.0_stampede @@ -0,0 +1,23 @@ +#%Module###################################################################### +## +## Model Evaluation Tools +## +proc ModulesHelp { } { + puts stderr "Sets up the paths and environment variables to use the Model Evaluation Tools v10.0.0 + *** For help see the official MET webpage at http://www.dtcenter.org/met/users ***" +} + +module load intel/18.0.2 +module load python3/3.7.0 +module load hdf5/1.10.4 +module load netcdf/4.6.2 + +set base /work2/06612/tg859120/stampede2/met/10.0.0 +set ver 10.0.0 +set share $base/share/met +set lib_base $base + +prepend-path PATH $base/bin + +setenv METversion V$ver +setenv MET_ROOT $base From 7a88a83c93d9cac87d7cce0d6466c6e641e8c588 Mon Sep 17 00:00:00 2001 From: bikegeek Date: Fri, 21 May 2021 10:24:49 -0600 Subject: [PATCH 153/165] Gitub Issue #1801 Remove code that checks for -bmodel filter to support plotting of extra-tropical cyclone tracks that aren't verified against BEST tracks. --- met/scripts/Rscripts/plot_tcmpr.R | 8 -------- 1 file changed, 8 deletions(-) diff --git a/met/scripts/Rscripts/plot_tcmpr.R b/met/scripts/Rscripts/plot_tcmpr.R index ffeeb2b43c..f42ba17c94 100644 --- a/met/scripts/Rscripts/plot_tcmpr.R +++ b/met/scripts/Rscripts/plot_tcmpr.R @@ -477,14 +477,6 @@ for(i in 1:length(info_list)) { cat("Found ", length(uniq_list), " unique entries for ", info_list[i], ": ", paste(uniq_list, collapse=", "), "\n", sep=''); - # Comment out to support plotting extra-tropical cyclone tracks not - # verified against BEST tracks - # Check for a single BDECK model - #if(info_list[i] == "BMODEL" & length(uniq_list) != 1) { - # cat("ERROR: Must have exactly 1 BDECK model name. ", - # "Try setting \"-bmodel name\" in the \"-filter\" option.\n"); - # quit(status=1); - #} } ######################################################################## From 09e74849772831c6947a31094f93b5565f55d586 Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Mon, 24 May 2021 09:18:37 -0600 Subject: [PATCH 154/165] Migrate issue and PR template changes from PR #1803 into the develop branch so that they'll be available for future releases. --- .github/ISSUE_TEMPLATE/bug_report.md | 12 +++++++++--- .github/ISSUE_TEMPLATE/enhancement_request.md | 8 +++++--- .github/ISSUE_TEMPLATE/new_feature_request.md | 8 +++++--- .github/ISSUE_TEMPLATE/sub-issue.md | 4 ++-- .github/ISSUE_TEMPLATE/task.md | 8 +++++--- .github/pull_request_template.md | 6 ++++-- 6 files changed, 30 insertions(+), 16 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index d141b3a414..a22e24ef90 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -48,8 +48,9 @@ Describe the steps to reproduce the behavior: - [ ] Select **requestor(s)** ### Projects and Milestone ### -- [ ] Review **projects** and select relevant **Repository** and **Organization** ones or add "alert:NEED PROJECT ASSIGNMENT" label -- [ ] Select **milestone** to relevant bugfix version +- [ ] Select **Organization** level **Project** for support of the current coordinated release +- [ ] Select **Repository** level **Project** for development toward the next official release or add **alert: NEED PROJECT ASSIGNMENT** label +- [ ] Select **Milestone** as the next bugfix version ## Define Related Issue(s) ## Consider the impact to the other METplus components. @@ -68,10 +69,15 @@ Branch name: `bugfix__main__` - [ ] Submit a pull request to merge into **main_\**. Pull request: `bugfix main_ ` - [ ] Define the pull request metadata, as permissions allow. -Select: **Reviewer(s)**, **Project(s)**, **Milestone**, and **Linked issues** +Select: **Reviewer(s)** and **Linked issues** +Select: **Organization** level software support **Project** for the current coordinated release +Select: **Milestone** as the next bugfix version - [ ] Iterate until the reviewer(s) accept and merge your changes. - [ ] Delete your fork or branch. - [ ] Complete the steps above to fix the bug on the **develop** branch. Branch name: `bugfix__develop_` Pull request: `bugfix develop ` +Select: **Reviewer(s)** and **Linked issues** +Select: **Repository** level development cycle **Project** for the next official release +Select: **Milestone** as the next official version - [ ] Close this issue. diff --git a/.github/ISSUE_TEMPLATE/enhancement_request.md b/.github/ISSUE_TEMPLATE/enhancement_request.md index c5e0e6ea01..f84aa44202 100644 --- a/.github/ISSUE_TEMPLATE/enhancement_request.md +++ b/.github/ISSUE_TEMPLATE/enhancement_request.md @@ -38,8 +38,8 @@ Consider breaking the enhancement down into sub-issues. - [ ] Select **requestor(s)** ### Projects and Milestone ### -- [ ] Review **projects** and select relevant **Repository** and **Organization** ones or add "alert:NEED PROJECT ASSIGNMENT" label -- [ ] Select **milestone** to next major version milestone or "Future Versions" +- [ ] Select **Repository** and/or **Organization** level **Project(s)** or add **alert: NEED PROJECT ASSIGNMENT** label +- [ ] Select **Milestone** as the next official version or **Future Versions** ## Define Related Issue(s) ## Consider the impact to the other METplus components. @@ -58,7 +58,9 @@ Branch name: `feature__` - [ ] Submit a pull request to merge into **develop**. Pull request: `feature ` - [ ] Define the pull request metadata, as permissions allow. -Select: **Reviewer(s)**, **Project(s)**, **Milestone**, and **Linked issues** +Select: **Reviewer(s)** and **Linked issues** +Select: **Repository** level development cycle **Project** for the next official release +Select: **Milestone** as the next official version - [ ] Iterate until the reviewer(s) accept and merge your changes. - [ ] Delete your fork or branch. - [ ] Close this issue. diff --git a/.github/ISSUE_TEMPLATE/new_feature_request.md b/.github/ISSUE_TEMPLATE/new_feature_request.md index 002b5589f0..5fa488ead3 100644 --- a/.github/ISSUE_TEMPLATE/new_feature_request.md +++ b/.github/ISSUE_TEMPLATE/new_feature_request.md @@ -42,8 +42,8 @@ Consider breaking the new feature down into sub-issues. - [ ] Select **requestor(s)** ### Projects and Milestone ### -- [ ] Review **projects** and select relevant **Repository** and **Organization** ones or add "alert:NEED PROJECT ASSIGNMENT" label -- [ ] Select **milestone** to next major version milestone or "Future Versions" +- [ ] Select **Repository** and/or **Organization** level **Project(s)** or add **alert: NEED PROJECT ASSIGNMENT** label +- [ ] Select **Milestone** as the next official version or **Future Versions** ## Define Related Issue(s) ## Consider the impact to the other METplus components. @@ -62,7 +62,9 @@ Branch name: `feature__` - [ ] Submit a pull request to merge into **develop**. Pull request: `feature ` - [ ] Define the pull request metadata, as permissions allow. -Select: **Reviewer(s)**, **Project(s)**, **Milestone**, and **Linked issues** +Select: **Reviewer(s)** and **Linked issues** +Select: **Repository** level development cycle **Project** for the next official release +Select: **Milestone** as the next official version - [ ] Iterate until the reviewer(s) accept and merge your changes. - [ ] Delete your fork or branch. - [ ] Close this issue. diff --git a/.github/ISSUE_TEMPLATE/sub-issue.md b/.github/ISSUE_TEMPLATE/sub-issue.md index 7a9cacb1d5..3552fa1934 100644 --- a/.github/ISSUE_TEMPLATE/sub-issue.md +++ b/.github/ISSUE_TEMPLATE/sub-issue.md @@ -28,5 +28,5 @@ This is a sub-issue of #*List the parent issue number here*. - [ ] Select **requestor(s)** ### Projects and Milestone ### -- [ ] Review **projects** and select relevant **Repository** and **Organization** ones or add "alert:NEED PROJECT ASSIGNMENT" label -- [ ] Select **milestone** to next major version milestone or "Future Versions" +- [ ] Select **Repository** and/or **Organization** level **Project(s)** or add **alert: NEED PROJECT ASSIGNMENT** label +- [ ] Select **Milestone** as the next official version or **Future Versions** diff --git a/.github/ISSUE_TEMPLATE/task.md b/.github/ISSUE_TEMPLATE/task.md index 634a271bab..88dfc5c9d3 100644 --- a/.github/ISSUE_TEMPLATE/task.md +++ b/.github/ISSUE_TEMPLATE/task.md @@ -38,8 +38,8 @@ Consider breaking the task down into sub-issues. - [ ] Select **requestor(s)** ### Projects and Milestone ### -- [ ] Review **projects** and select relevant **Repository** and **Organization** ones or add "alert:NEED PROJECT ASSIGNMENT" label -- [ ] Select **milestone** to next major version milestone or "Future Versions" +- [ ] Select **Repository** and/or **Organization** level **Project(s)** or add **alert: NEED PROJECT ASSIGNMENT** label +- [ ] Select **Milestone** as the next official version or **Future Versions** ## Define Related Issue(s) ## Consider the impact to the other METplus components. @@ -58,7 +58,9 @@ Branch name: `feature__` - [ ] Submit a pull request to merge into **develop**. Pull request: `feature ` - [ ] Define the pull request metadata, as permissions allow. -Select: **Reviewer(s)**, **Project(s)**, **Milestone**, and **Linked issues** +Select: **Reviewer(s)** and **Linked issues** +Select: **Repository** level development cycle **Project** for the next official release +Select: **Milestone** as the next official version - [ ] Iterate until the reviewer(s) accept and merge your changes. - [ ] Delete your fork or branch. - [ ] Close this issue. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 3c7ad6b33b..f3d05479d2 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -18,7 +18,9 @@ See the [METplus Workflow](https://dtcenter.github.io/METplus/Contributors_Guide - [ ] Complete the PR definition above. - [ ] Ensure the PR title matches the feature or bugfix branch name. - [ ] Define the PR metadata, as permissions allow. -Select: **Reviewer(s)**, **Project(s)**, and **Milestone** -- [ ] After submitting the PR, select **Linked Issues** with the original issue number. +Select: **Reviewer(s)** +Select: **Organization** level software support **Project** or **Repository** level development cycle **Project** +Select: **Milestone** as the version that will include these changes +- [ ] After submitting the PR, select **Linked issues** with the original issue number. - [ ] After the PR is approved, merge your changes. If permissions do not allow this, request that the reviewer do the merge. - [ ] Close the linked issue and delete your feature or bugfix branch from GitHub. From 1996ccd6d9fb37bd56fafce77e9ff8d91e0538d5 Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Mon, 24 May 2021 09:57:45 -0600 Subject: [PATCH 155/165] Per met-help question (https://rt.rap.ucar.edu/rt/Ticket/Display.html?id=99964) clarify the description of the obs_thresh option. --- met/docs/Users_Guide/config_options.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/met/docs/Users_Guide/config_options.rst b/met/docs/Users_Guide/config_options.rst index 1277564934..b27e819908 100644 --- a/met/docs/Users_Guide/config_options.rst +++ b/met/docs/Users_Guide/config_options.rst @@ -2342,10 +2342,11 @@ e.g. nc_var_str = "MIN"; **obs_thresh** The "obs_thresh" entry is an array of thresholds for filtering observation -values prior to applying ensemble verification logic. The default setting -of NA means that no observations should be filtered out. Verification output -will be computed separately for each threshold specified. This option may be -set separately for each obs.field entry. +values prior to applying ensemble verification logic. They specify the values +to be included in the verification, not excluded. The default setting of NA, +which always evaluates to true, means that all observations should be used. +Verification output will be computed separately for each threshold specified. +This option may be set separately for each obs.field entry. .. code-block:: none From 283f57b48051eee19aee25b54587abccac13d621 Mon Sep 17 00:00:00 2001 From: jprestop Date: Thu, 27 May 2021 11:01:21 -0600 Subject: [PATCH 156/165] Update README.md Adding GitHub Discussions information --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 04ea3264fc..c6bd5c5341 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,4 @@ This repository contains the source code for the Model Evaluation Tools package (met), unit test code (test), and scripts used to build and test the code (scripts). -Please see the MET website (https://dtcenter.org/community-code/model-evaluation-tools-met) and direct questions to met_help@ucar.edu. +Please see the [MET website](https://dtcenter.org/community-code/model-evaluation-tools-met) for more information. Support for the METplus components is provided through the [METplus Discussions](https://github.com/dtcenter/METplus/discussions) forum. Users are welcome and encouraged to answer or address each other’s questions there! For more information, please read "[Welcome to the METplus Components Discussions](https://giithub.com/dtcenter/METplus/discussions/939)". From 9991c32d24c1e49b940766aa3d88a653b8424494 Mon Sep 17 00:00:00 2001 From: George McCabe <23407799+georgemccabe@users.noreply.github.com> Date: Thu, 27 May 2021 12:45:32 -0600 Subject: [PATCH 157/165] changed non-unicode apostrophe and fixed typo in URL --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c6bd5c5341..4b6e40f7ea 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,4 @@ This repository contains the source code for the Model Evaluation Tools package (met), unit test code (test), and scripts used to build and test the code (scripts). -Please see the [MET website](https://dtcenter.org/community-code/model-evaluation-tools-met) for more information. Support for the METplus components is provided through the [METplus Discussions](https://github.com/dtcenter/METplus/discussions) forum. Users are welcome and encouraged to answer or address each other’s questions there! For more information, please read "[Welcome to the METplus Components Discussions](https://giithub.com/dtcenter/METplus/discussions/939)". +Please see the [MET website](https://dtcenter.org/community-code/model-evaluation-tools-met) for more information. Support for the METplus components is provided through the [METplus Discussions](https://github.com/dtcenter/METplus/discussions) forum. Users are welcome and encouraged to answer or address each other's questions there! For more information, please read "[Welcome to the METplus Components Discussions](https://github.com/dtcenter/METplus/discussions/939)". From b6bb5e7839cb8ea8fe58d312393b71f09c6fa823 Mon Sep 17 00:00:00 2001 From: hsoh-u Date: Fri, 28 May 2021 16:50:42 -0600 Subject: [PATCH 158/165] Feature 1581 api point obs (#1812) * #1581 Initial release * #1581 Added met_nc_point_obs.cc met_nc_point_obs.h * Removed nc_ in function names and moved them to the struct members * #1581 Added HDR_TYPE_ARR_LEN * #1581 Changed API calls (API names) * #1581 Cleanup * #1581 Removed duplicated definitions:hdr_arr_len, hdr_typ_arr_len, and obs_arr_len * #1581 Removed duplicated definitions:hdr_arr_len and obs_arr_len * #1581 Removed duplicated definitions: str_len, hdr_arr_len, and obs_arr_len * Added vx_nc_obs library * #1581 Using common APIs * #1581 Corrected API calls because of renaming for common APIs * #1581 Moved function from nc_obs_util to nc_point_obs2 * #1581renamed met_nc_point_obs to nc_point_obs * #1581 API ica changed from obs_vars to nc_point_obs * #1581 Initial release * #1581 Renamed from met_nc_point_obs to nc_point_obs * 1581 Renamed met_nc_point_obs to nc_point_obs * Per #1581, update the Makefile.am for lidar2nc to fix a linker error. Unfortunatley, the vx_config library now depends on the vx_gsl_prob library. threshold.cc in vx_config includes a call to normal_cdf_inv(double, double, double) which is defined in vx_gsl_prob. This adds to the complexity of dependencies for MET's libraries. Just linking to -lvx_gsl_prob one more time does fix the linker problem but doesn't solve the messy dependencies. * #1581 Added method for NcDataBuffer * Cleanup * #1581 Cleanup * #1581 Cleanup * #1591 Cleanup * #1591 Corrected API * #1581 Avoid reading PB header twice * #1581 Warning if PB header is not defined but read_pb_hdr_data is called * #1581 Cleanup libraries * 1581 cleanup * 1581 cleanup * 1581 cleanup * #1581 Cleanup for Fortify (removed unused variables) * #1581 Cleanup * #1581 Cleanup * #1581 Use MetNcPointObsIn instead of MetNcPointObs * #1581 Use MetNcPointObsOut instead of MetNcPointObs2Write * #1581 Separated nc_point_obs2.cc to nc_point_obs_in.cc and nc_point_obs_out.cc * #1581 Renamed nc_point_obs2.cc to nc_point_obs_in.cc And added add nc_point_obs_in.h nc_point_obs_out.h nc_point_obs_out.cc * #1581 Removed APIs related with writing point obs * #1581 Changed copyright years * #1581 Cleanup * #1581 Updated copyright year * #1581 Cleanup * #1581 Reanmed read_obs_data_strings to read_obs_data_table_lookups * #1581 Reanmed read_obs_data_strings to read_obs_data_table_lookups * #1581 Added more APIs Co-authored-by: Howard Soh Co-authored-by: John Halley Gotway --- met/src/libcode/vx_nc_obs/Makefile.am | 3 + met/src/libcode/vx_nc_obs/nc_obs_util.cc | 1913 ++++++++--------- met/src/libcode/vx_nc_obs/nc_obs_util.h | 277 +-- met/src/libcode/vx_nc_obs/nc_point_obs.cc | 167 ++ met/src/libcode/vx_nc_obs/nc_point_obs.h | 109 + met/src/libcode/vx_nc_obs/nc_point_obs_in.cc | 113 + met/src/libcode/vx_nc_obs/nc_point_obs_in.h | 58 + met/src/libcode/vx_nc_obs/nc_point_obs_out.cc | 607 ++++++ met/src/libcode/vx_nc_obs/nc_point_obs_out.h | 104 + met/src/libcode/vx_nc_obs/nc_summary.cc | 111 +- met/src/libcode/vx_nc_obs/nc_summary.h | 6 +- met/src/libcode/vx_nc_util/nc_utils.h | 1 + met/src/libcode/vx_nc_util/write_netcdf.cc | 41 - met/src/tools/core/ensemble_stat/Makefile.am | 8 +- .../tools/core/ensemble_stat/ensemble_stat.cc | 165 +- .../tools/core/ensemble_stat/ensemble_stat.h | 9 - met/src/tools/core/point_stat/Makefile.am | 10 +- met/src/tools/core/point_stat/point_stat.cc | 188 +- met/src/tools/core/point_stat/point_stat.h | 6 - met/src/tools/other/ascii2nc/Makefile.am | 12 +- met/src/tools/other/ascii2nc/file_handler.cc | 76 +- met/src/tools/other/ascii2nc/file_handler.h | 4 +- met/src/tools/other/ioda2nc/Makefile.am | 12 +- met/src/tools/other/ioda2nc/ioda2nc.cc | 57 +- met/src/tools/other/lidar2nc/Makefile.am | 3 + met/src/tools/other/lidar2nc/lidar2nc.cc | 110 +- met/src/tools/other/madis2nc/Makefile.am | 12 +- met/src/tools/other/madis2nc/madis2nc.cc | 79 +- met/src/tools/other/madis2nc/madis2nc.h | 4 - met/src/tools/other/pb2nc/Makefile.am | 11 +- met/src/tools/other/pb2nc/pb2nc.cc | 181 +- .../tools/other/plot_point_obs/Makefile.am | 16 +- .../other/plot_point_obs/plot_point_obs.cc | 263 +-- met/src/tools/other/point2grid/Makefile.am | 11 +- met/src/tools/other/point2grid/point2grid.cc | 127 +- 35 files changed, 2649 insertions(+), 2225 deletions(-) create mode 100644 met/src/libcode/vx_nc_obs/nc_point_obs.cc create mode 100644 met/src/libcode/vx_nc_obs/nc_point_obs.h create mode 100644 met/src/libcode/vx_nc_obs/nc_point_obs_in.cc create mode 100644 met/src/libcode/vx_nc_obs/nc_point_obs_in.h create mode 100644 met/src/libcode/vx_nc_obs/nc_point_obs_out.cc create mode 100644 met/src/libcode/vx_nc_obs/nc_point_obs_out.h diff --git a/met/src/libcode/vx_nc_obs/Makefile.am b/met/src/libcode/vx_nc_obs/Makefile.am index 67734a45f9..ba2fb8c910 100644 --- a/met/src/libcode/vx_nc_obs/Makefile.am +++ b/met/src/libcode/vx_nc_obs/Makefile.am @@ -13,5 +13,8 @@ include ${top_srcdir}/Make-include noinst_LIBRARIES = libvx_nc_obs.a libvx_nc_obs_a_SOURCES = \ nc_obs_util.cc nc_obs_util.h \ + nc_point_obs.cc nc_point_obs.h \ + nc_point_obs_in.cc nc_point_obs_in.h \ + nc_point_obs_out.cc nc_point_obs_out.h \ nc_summary.cc nc_summary.h libvx_nc_obs_a_CPPFLAGS = ${MET_CPPFLAGS} diff --git a/met/src/libcode/vx_nc_obs/nc_obs_util.cc b/met/src/libcode/vx_nc_obs/nc_obs_util.cc index 5cd8709097..805461b078 100644 --- a/met/src/libcode/vx_nc_obs/nc_obs_util.cc +++ b/met/src/libcode/vx_nc_obs/nc_obs_util.cc @@ -16,18 +16,14 @@ using namespace std; -//#include #include -//#include "vx_math.h" #include "vx_nc_util.h" #include "nc_obs_util.h" /////////////////////////////////////////////////////////////////////////////// -struct NcDataBuffer nc_data_buffer; -struct NcHeaderData hdr_data; float hdr_arr_block[NC_BUFFER_SIZE_32K][HDR_ARRAY_LEN]; /////////////////////////////////////////////////////////////////////////////// @@ -45,406 +41,614 @@ static const string err_msg_hdr_arr = "error writing the header array to the netCDF file\n\n"; /////////////////////////////////////////////////////////////////////////////// +// struct NcDataBuffer -bool add_nc_header_to_array (const char *hdr_typ, const char *hdr_sid, - const time_t hdr_vld, const float hdr_lat, - const float hdr_lon, const float hdr_elv) +NcDataBuffer::NcDataBuffer() { + reset_counters(); +} + +/////////////////////////////////////////////////////////////////////////////// + +void NcDataBuffer::reset_counters() { + processed_count = 0; + obs_count = 0; + obs_buf_size = 0; + cur_obs_idx = 0; + obs_data_idx = 0; + obs_data_offset = 0; + hdr_count = 0; + hdr_buf_size = 0; + cur_hdr_idx = 0; + hdr_data_idx = 0; + hdr_data_offset = 0; + pb_hdr_count = 0; + pb_hdr_data_offset = 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// struct NcPointObsData + +NcPointObsData::NcPointObsData(): + obs_cnt(0), + obs_ids((int *)0), + obs_hids((int *)0), + obs_qids((int *)0), + obs_lvls((float *)0), + obs_hgts((float *)0), + obs_vals((float *)0), + obs_arr((float *)0), + is_obs_array(false) { - bool added = false; - bool new_vld = false; - - // Can't filter duplicated one because header index was - // assigned before checking - int hdr_index; - if (!hdr_data.typ_array.has(hdr_typ, hdr_index, false)) { - hdr_index = hdr_data.typ_array.n_elements(); - hdr_data.typ_array.add(hdr_typ); // Message type +} + +/////////////////////////////////////////////////////////////////////////////// + +void NcPointObsData::clear() { + obs_cnt = 0; + is_obs_array = false; + + clear_numbers(); + clear_strings(); +} + +/////////////////////////////////////////////////////////////////////////////// + +void NcPointObsData::clear_numbers() { + if (0 != obs_ids) { + delete [] obs_ids; + obs_ids = (int *)0; } - hdr_data.typ_idx_array.add(hdr_index); // Index of Message type - - if (!hdr_data.sid_array.has(hdr_sid, hdr_index, false)) { - hdr_index = hdr_data.sid_array.n_elements(); - hdr_data.sid_array.add(hdr_sid); // Station ID + if (0 != obs_hids) { + delete [] obs_hids; + obs_hids = (int *)0; } - hdr_data.sid_idx_array.add(hdr_index); // Index of Station ID - - if (hdr_data.min_vld_time == -1 || hdr_data.min_vld_time > hdr_vld) { - if (hdr_data.min_vld_time == -1) hdr_data.max_vld_time = hdr_vld; - hdr_data.min_vld_time = hdr_vld; - new_vld = true; + if (0 != obs_qids) { + delete [] obs_qids; + obs_qids = (int *)0; } - else if (hdr_data.max_vld_time < hdr_vld) { - hdr_data.max_vld_time = hdr_vld; - new_vld = true; + if (0 != obs_lvls) { + delete [] obs_lvls; + obs_lvls = (float *)0; } - if (new_vld || !hdr_data.vld_num_array.has(hdr_vld, hdr_index, false)) { - hdr_index = hdr_data.vld_array.n_elements(); - hdr_data.vld_array.add(unix_to_yyyymmdd_hhmmss(hdr_vld)); // Valid time - hdr_data.vld_num_array.add(hdr_vld); // Valid time + if (0 != obs_hgts) { + delete [] obs_hgts; + obs_hgts = (float *)0; + } + if (0 != obs_vals) { + delete [] obs_vals; + obs_vals = (float *)0; + } + if (0 != obs_arr) { + delete [] obs_arr; + obs_arr = (float *)0; } - hdr_data.vld_idx_array.add(hdr_index); // Index of Valid time - - hdr_data.lat_array.add(hdr_lat); // Latitude - hdr_data.lon_array.add(hdr_lon); // Longitude - hdr_data.elv_array.add(hdr_elv); // Elevation - nc_data_buffer.cur_hdr_idx++; - added = true; - return added; } /////////////////////////////////////////////////////////////////////////////// -bool add_nc_header_prepbufr (const int pb_report_type, - const int in_report_type, const int instrument_type) -{ - bool added = true; - // Can't filter duplicated one because header index was - // assigned before checking - hdr_data.prpt_typ_array.add(pb_report_type); - hdr_data.irpt_typ_array.add(in_report_type); - hdr_data.inst_typ_array.add(instrument_type); - return added; +void NcPointObsData::clear_strings() { + var_names.clear(); + qty_names.clear(); } -//////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +float NcPointObsData::get_obs_val(int index) { + float obs_val = (is_obs_array ? obs_arr[index*obs_cnt+4] : obs_vals[index]); + return obs_val; +} + +/////////////////////////////////////////////////////////////////////////////// + +bool NcPointObsData::read_obs_data_numbers(NetcdfObsVars obs_vars, bool stop) { + bool succeed = true; + const char* method_name = "NcPointObsData::read_obs_data_numbers()"; -int check_nc_dims_vars(const NetcdfObsVars obs_vars) { - int exit_code = exit_code_no_error; - if(IS_INVALID_NC(obs_vars.strl_dim) || - IS_INVALID_NC(obs_vars.obs_dim) || - IS_INVALID_NC(obs_vars.hdr_dim)) { - exit_code = exit_code_no_dim; + clear_numbers(); + obs_cnt = obs_vars.obs_cnt; + + StringArray missing_vars; + StringArray failed_vars; + if (!IS_INVALID_NC(obs_vars.obs_arr_var)) { + is_obs_array = true; + obs_arr = new float[obs_cnt*OBS_ARRAY_LEN]; + if (!get_nc_data(&obs_vars.obs_arr_var, obs_arr)) { + succeed = false; + failed_vars.add(nc_var_obs_arr); + } } - else if(IS_INVALID_NC(obs_vars.hdr_typ_var) || - IS_INVALID_NC(obs_vars.hdr_sid_var) || - IS_INVALID_NC(obs_vars.hdr_vld_var)) { - exit_code = exit_code_no_hdr_vars; + else { + if (IS_INVALID_NC(obs_vars.obs_hid_var)) { + succeed = false; + missing_vars.add(nc_var_obs_hid); + } + else { + obs_hids = new int[obs_cnt]; + if (!get_nc_data(&obs_vars.obs_hid_var, obs_hids)) { + succeed = false; + failed_vars.add(nc_var_obs_hid); + } + } + if (IS_INVALID_NC(obs_vars.obs_lvl_var)) { + succeed = false; + missing_vars.add(nc_var_obs_lvl); + } + else { + obs_lvls = new float[obs_cnt]; + if (!get_nc_data(&obs_vars.obs_lvl_var, obs_lvls)) { + succeed = false; + failed_vars.add(nc_var_obs_lvl); + } + } + if (IS_INVALID_NC(obs_vars.obs_hgt_var)) { + succeed = false; + missing_vars.add(nc_var_obs_hgt); + } + else { + obs_hgts = new float[obs_cnt]; + if (!get_nc_data(&obs_vars.obs_hgt_var, obs_hgts)) { + succeed = false; + failed_vars.add(nc_var_obs_hgt); + } + } + if (IS_INVALID_NC(obs_vars.obs_val_var)) { + succeed = false; + missing_vars.add(nc_var_obs_val); + } + else { + obs_vals = new float[obs_cnt]; + if (!get_nc_data(&obs_vars.obs_val_var, obs_vals)) { + succeed = false; + failed_vars.add(nc_var_obs_val); + } + } + if (IS_VALID_NC(obs_vars.obs_gc_var)) { + obs_ids = new int[obs_cnt]; + if (!get_nc_data(&obs_vars.obs_gc_var, obs_ids)) { + succeed = false; + failed_vars.add(nc_var_obs_gc); + } + } + else if (IS_VALID_NC(obs_vars.obs_vid_var)) { + obs_ids = new int[obs_cnt]; + if (!get_nc_data(&obs_vars.obs_vid_var, obs_ids)) { + succeed = false; + failed_vars.add(nc_var_obs_vid); + } + } + else succeed = false; + } - else if((IS_INVALID_NC(obs_vars.obs_arr_var) && IS_INVALID_NC(obs_vars.obs_val_var))) { - exit_code = exit_code_no_obs_vars; + + for (int idx=0; idxmin_vld_time = -1; - my_hdr_data->max_vld_time = -1; - - my_hdr_data->typ_array.clear(); - my_hdr_data->sid_array.clear(); - my_hdr_data->vld_array.clear(); - my_hdr_data->vld_num_array.clear(); - my_hdr_data->typ_idx_array.clear(); - my_hdr_data->sid_idx_array.clear(); - my_hdr_data->vld_idx_array.clear(); - my_hdr_data->lat_array.clear(); - my_hdr_data->lon_array.clear(); - my_hdr_data->elv_array.clear(); - my_hdr_data->prpt_typ_array.clear(); - my_hdr_data->irpt_typ_array.clear(); - my_hdr_data->inst_typ_array.clear(); + if (stop && !succeed) exit(1); + return succeed; } + /////////////////////////////////////////////////////////////////////////////// +// struc NetcdfObsVars -long count_nc_headers(vector< Observation > &observations) +NetcdfObsVars::NetcdfObsVars() { - long nhdr = 0; - - string prev_header_type = ""; - string prev_station_id = ""; - time_t prev_valid_time = 0; - double prev_latitude = bad_data_double; - double prev_longitude = bad_data_double; - double prev_elevation = bad_data_double; - const string method_name = " count_nc_headers()"; - - for (vector< Observation >::iterator obs = observations.begin(); - obs != observations.end(); ++obs) - { - if (obs->getHeaderType() != prev_header_type || - obs->getStationId() != prev_station_id || - obs->getValidTime() != prev_valid_time || - !is_eq(obs->getLatitude(), prev_latitude) || - !is_eq(obs->getLongitude(), prev_longitude) || - !is_eq(obs->getElevation(), prev_elevation)) - { - nhdr++; - - prev_header_type = obs->getHeaderType(); - prev_station_id = obs->getStationId(); - prev_valid_time = obs->getValidTime(); - prev_latitude = obs->getLatitude(); - prev_longitude = obs->getLongitude(); - prev_elevation = obs->getElevation(); - } - //else mlog << Debug(7) << method_name - // << " FFF obs->getHeaderIndex(): " << obs->getHeaderIndex() - // << ", nhdr: " << nhdr << " count: " << count - // << "\n"; - obs->setHeaderIndex(nhdr-1); - } /* endfor - obs */ - - return nhdr; + reset(); } /////////////////////////////////////////////////////////////////////////////// -void create_nc_dimensions(NetcdfObsVars &obs_vars, NcFile *f_out) { - const string method_name = " create_nc_dimensions()"; +void NetcdfObsVars::create_dimensions(NcFile *f_out) { + const string method_name = " create_dimensions()"; mlog << Debug(7) << method_name << " is called" << "\n"; // Define netCDF dimensions - if (IS_INVALID_NC(obs_vars.strl_dim)) obs_vars.strl_dim = add_dim(f_out, nc_dim_mxstr, HEADER_STR_LEN); - if (IS_INVALID_NC(obs_vars.strl2_dim)) obs_vars.strl2_dim = add_dim(f_out, nc_dim_mxstr2, HEADER_STR_LEN2); - if (IS_INVALID_NC(obs_vars.strl3_dim)) obs_vars.strl3_dim = add_dim(f_out, nc_dim_mxstr3, HEADER_STR_LEN3); - if (IS_INVALID_NC(obs_vars.hdr_dim) && obs_vars.hdr_cnt > 0) { - obs_vars.hdr_dim = add_dim(f_out, nc_dim_nhdr, obs_vars.hdr_cnt); + if (IS_INVALID_NC(strl_dim)) strl_dim = add_dim(f_out, nc_dim_mxstr, HEADER_STR_LEN); + if (IS_INVALID_NC(strl2_dim)) strl2_dim = add_dim(f_out, nc_dim_mxstr2, HEADER_STR_LEN2); + if (IS_INVALID_NC(strl3_dim)) strl3_dim = add_dim(f_out, nc_dim_mxstr3, HEADER_STR_LEN3); + if (IS_INVALID_NC(hdr_dim) && hdr_cnt > 0) { + hdr_dim = add_dim(f_out, nc_dim_nhdr, hdr_cnt); } - if (IS_INVALID_NC(obs_vars.obs_dim)) { - if (obs_vars.obs_cnt > 0) obs_vars.obs_dim = add_dim(f_out, nc_dim_nobs, obs_vars.obs_cnt); // fixed dimension; - else obs_vars.obs_dim = add_dim(f_out, nc_dim_nobs); // unlimited dimension; + if (IS_INVALID_NC(obs_dim)) { + if (obs_cnt > 0) obs_dim = add_dim(f_out, nc_dim_nobs, obs_cnt); // fixed dimension; + else obs_dim = add_dim(f_out, nc_dim_nobs); // unlimited dimension; } - nc_data_buffer.obs_vars = obs_vars; } /////////////////////////////////////////////////////////////////////////////// -void create_nc_hdr_vars (NetcdfObsVars &obs_vars, NcFile *f_out, - const int hdr_count, const int deflate_level) { - const string method_name = " create_nc_hdr_vars()"; +void NetcdfObsVars::create_hdr_vars (NcFile *f_out, const int hdr_count) { + const string method_name = " create_hdr_vars()"; mlog << Debug(7) << method_name << " hdr_count: " << hdr_count << "\n"; - + // Define netCDF dimensions - create_nc_dimensions(obs_vars, f_out); - - NcDim hdr_dim; - obs_vars.hdr_cnt = hdr_count; - if (!IS_INVALID_NC(obs_vars.hdr_dim)) { - hdr_dim = obs_vars.hdr_dim; - } - else { + hdr_cnt = hdr_count; + create_dimensions(f_out); + + if (IS_INVALID_NC(hdr_dim)) { hdr_dim = (hdr_count > 0) ? add_dim(f_out, nc_dim_nhdr, hdr_count) : add_dim(f_out, nc_dim_nhdr); // unlimited dimension - obs_vars.hdr_dim = hdr_dim; } // Define netCDF header variables - obs_vars.hdr_typ_var = add_var(f_out, nc_var_hdr_typ, ncInt, hdr_dim, deflate_level); - obs_vars.hdr_sid_var = add_var(f_out, nc_var_hdr_sid, ncInt, hdr_dim, deflate_level); - obs_vars.hdr_vld_var = add_var(f_out, nc_var_hdr_vld, ncInt, hdr_dim, deflate_level); - obs_vars.hdr_lat_var = add_var(f_out, nc_var_hdr_lat, ncFloat, hdr_dim, deflate_level); - obs_vars.hdr_lon_var = add_var(f_out, nc_var_hdr_lon, ncFloat, hdr_dim, deflate_level); - obs_vars.hdr_elv_var = add_var(f_out, nc_var_hdr_elv, ncFloat, hdr_dim, deflate_level); - - add_att(&obs_vars.hdr_typ_var, "long_name", "index of message type"); - add_att(&obs_vars.hdr_typ_var, "_FillValue", (int)FILL_VALUE); - add_att(&obs_vars.hdr_sid_var, "long_name", "index of station identification"); - add_att(&obs_vars.hdr_sid_var, "_FillValue", (int)FILL_VALUE); - add_att(&obs_vars.hdr_vld_var, "long_name", "index of valid time"); - add_att(&obs_vars.hdr_vld_var, "_FillValue", (int)FILL_VALUE); - - add_att(&obs_vars.hdr_lat_var, "long_name", "latitude"); - add_att(&obs_vars.hdr_lat_var, "_FillValue", FILL_VALUE); - add_att(&obs_vars.hdr_lat_var, "units", "degrees_north"); - add_att(&obs_vars.hdr_lon_var, "long_name", "longitude"); - add_att(&obs_vars.hdr_lon_var, "_FillValue", FILL_VALUE); - add_att(&obs_vars.hdr_lon_var, "units", "degrees_east"); - add_att(&obs_vars.hdr_elv_var, "long_name", "elevation"); - add_att(&obs_vars.hdr_elv_var, "_FillValue", FILL_VALUE); - add_att(&obs_vars.hdr_elv_var, "units", "meters above sea level (msl)"); - nc_data_buffer.obs_vars = obs_vars; -} - -/////////////////////////////////////////////////////////////////////////////// - -NcDim create_nc_obs_var_var (NetcdfObsVars &obs_vars, NcFile *f_out, - int var_count, const int deflate_level) { - NcDim var_dim = add_dim(f_out, nc_dim_nvar, var_count); - // If the string length is modified, update nc_tools.cc, too. - if (IS_INVALID_NC(obs_vars.strl2_dim)) obs_vars.strl2_dim = add_dim(f_out, nc_dim_mxstr2, HEADER_STR_LEN2); - - obs_vars.obs_var = add_var(f_out, nc_var_obs_var, ncChar, var_dim, obs_vars.strl2_dim, deflate_level); - add_att(&obs_vars.obs_var, "long_name", "variable names"); - return var_dim; + hdr_typ_var = add_var(f_out, nc_var_hdr_typ, ncInt, hdr_dim, deflate_level); + hdr_sid_var = add_var(f_out, nc_var_hdr_sid, ncInt, hdr_dim, deflate_level); + hdr_vld_var = add_var(f_out, nc_var_hdr_vld, ncInt, hdr_dim, deflate_level); + hdr_lat_var = add_var(f_out, nc_var_hdr_lat, ncFloat, hdr_dim, deflate_level); + hdr_lon_var = add_var(f_out, nc_var_hdr_lon, ncFloat, hdr_dim, deflate_level); + hdr_elv_var = add_var(f_out, nc_var_hdr_elv, ncFloat, hdr_dim, deflate_level); + + add_att(&hdr_typ_var, "long_name", "index of message type"); + add_att(&hdr_typ_var, "_FillValue", (int)FILL_VALUE); + add_att(&hdr_sid_var, "long_name", "index of station identification"); + add_att(&hdr_sid_var, "_FillValue", (int)FILL_VALUE); + add_att(&hdr_vld_var, "long_name", "index of valid time"); + add_att(&hdr_vld_var, "_FillValue", (int)FILL_VALUE); + + add_att(&hdr_lat_var, "long_name", "latitude"); + add_att(&hdr_lat_var, "_FillValue", FILL_VALUE); + add_att(&hdr_lat_var, "units", "degrees_north"); + add_att(&hdr_lon_var, "long_name", "longitude"); + add_att(&hdr_lon_var, "_FillValue", FILL_VALUE); + add_att(&hdr_lon_var, "units", "degrees_east"); + add_att(&hdr_elv_var, "long_name", "elevation"); + add_att(&hdr_elv_var, "_FillValue", FILL_VALUE); + add_att(&hdr_elv_var, "units", "meters above sea level (msl)"); } /////////////////////////////////////////////////////////////////////////////// -void create_nc_obs_vars (NetcdfObsVars &obs_vars, NcFile *f_out, - const int deflate_level, bool use_var_id) { +void NetcdfObsVars::create_obs_vars (NcFile *f_out) { const char *long_name_str; - const string method_name = " create_nc_obs_vars()"; + const string method_name = " create_obs_vars()"; // Define netCDF dimensions - create_nc_dimensions(obs_vars, f_out); - + create_dimensions(f_out); + // Define netCDF variables - obs_vars.obs_qty_var = add_var(f_out, nc_var_obs_qty, ncInt, obs_vars.obs_dim, deflate_level); - obs_vars.obs_hid_var = add_var(f_out, nc_var_obs_hid, ncInt, obs_vars.obs_dim, deflate_level); + obs_qty_var = add_var(f_out, nc_var_obs_qty, ncInt, obs_dim, deflate_level); + obs_hid_var = add_var(f_out, nc_var_obs_hid, ncInt, obs_dim, deflate_level); if (use_var_id) - obs_vars.obs_vid_var = add_var(f_out, nc_var_obs_vid, ncInt, obs_vars.obs_dim, deflate_level); + obs_vid_var = add_var(f_out, nc_var_obs_vid, ncInt, obs_dim, deflate_level); else - obs_vars.obs_gc_var = add_var(f_out, nc_var_obs_gc, ncInt, obs_vars.obs_dim, deflate_level); - obs_vars.obs_lvl_var = add_var(f_out, nc_var_obs_lvl, ncFloat, obs_vars.obs_dim, deflate_level); - obs_vars.obs_hgt_var = add_var(f_out, nc_var_obs_hgt, ncFloat, obs_vars.obs_dim, deflate_level); - obs_vars.obs_val_var = add_var(f_out, nc_var_obs_val, ncFloat, obs_vars.obs_dim, deflate_level); + obs_gc_var = add_var(f_out, nc_var_obs_gc, ncInt, obs_dim, deflate_level); + obs_lvl_var = add_var(f_out, nc_var_obs_lvl, ncFloat, obs_dim, deflate_level); + obs_hgt_var = add_var(f_out, nc_var_obs_hgt, ncFloat, obs_dim, deflate_level); + obs_val_var = add_var(f_out, nc_var_obs_val, ncFloat, obs_dim, deflate_level); add_att(f_out, nc_att_obs_version, MET_NC_Obs_version); add_att(f_out, nc_att_use_var_id, (use_var_id ? "true" : "false")); // Add variable attributes - add_att(&obs_vars.obs_qty_var, "long_name", "index of quality flag"); - add_att(&obs_vars.obs_hid_var, "long_name", "index of matching header data"); - add_att(&obs_vars.obs_hid_var, "_FillValue", (int)FILL_VALUE); - add_att(&obs_vars.obs_val_var, "long_name", "observation value"); - add_att(&obs_vars.obs_val_var, "_FillValue", FILL_VALUE); + add_att(&obs_qty_var, "long_name", "index of quality flag"); + add_att(&obs_hid_var, "long_name", "index of matching header data"); + add_att(&obs_hid_var, "_FillValue", (int)FILL_VALUE); + add_att(&obs_val_var, "long_name", "observation value"); + add_att(&obs_val_var, "_FillValue", FILL_VALUE); if (use_var_id) { - long_name_str = (obs_vars.attr_pb2nc + long_name_str = (attr_pb2nc ? "index of BUFR variable corresponding to the observation type" : "index of variable names at var_name"); - add_att(&obs_vars.obs_vid_var, "long_name", long_name_str); - add_att(&obs_vars.obs_vid_var, "_FillValue", (int)FILL_VALUE); + add_att(&obs_vid_var, "long_name", long_name_str); + add_att(&obs_vid_var, "_FillValue", (int)FILL_VALUE); } else { - add_att(&obs_vars.obs_gc_var, "long_name", "grib code corresponding to the observation type"); - add_att(&obs_vars.obs_gc_var, "_FillValue", (int)FILL_VALUE); + add_att(&obs_gc_var, "long_name", "grib code corresponding to the observation type"); + add_att(&obs_gc_var, "_FillValue", (int)FILL_VALUE); } - add_att(&obs_vars.obs_lvl_var, "long_name", "pressure level (hPa) or accumulation interval (sec)"); - add_att(&obs_vars.obs_lvl_var, "_FillValue", FILL_VALUE); - long_name_str = (obs_vars.attr_agl) + add_att(&obs_lvl_var, "long_name", "pressure level (hPa) or accumulation interval (sec)"); + add_att(&obs_lvl_var, "_FillValue", FILL_VALUE); + long_name_str = (attr_agl) ? "height in meters above sea level or ground level (msl or agl)" : "height in meters above sea level (msl)"; - add_att(&obs_vars.obs_hgt_var, "long_name", long_name_str); - add_att(&obs_vars.obs_hgt_var, "_FillValue", FILL_VALUE); - nc_data_buffer.obs_vars = obs_vars; + add_att(&obs_hgt_var, "long_name", long_name_str); + add_att(&obs_hgt_var, "_FillValue", FILL_VALUE); } /////////////////////////////////////////////////////////////////////////////// -void create_nc_obs_name_vars (NetcdfObsVars &obs_vars, NcFile *f_out, - const int var_count, const int unit_count, const int deflate_level) { - const string method_name = " create_nc_other_vars()"; - +void NetcdfObsVars::create_obs_name_vars (NcFile *f_out, const int var_count, const int unit_count) { + const string method_name = " create_other_vars()"; + if (var_count > 0) { - NcDim var_dim = create_nc_obs_var_var(obs_vars, f_out, var_count, deflate_level); + NcDim var_dim = create_var_obs_var(f_out, var_count); if (unit_count > 0) { - obs_vars.unit_var = add_var(f_out, nc_var_unit, ncChar, var_dim, obs_vars.strl2_dim, deflate_level); - obs_vars.desc_var = add_var(f_out, nc_var_desc, ncChar, var_dim, obs_vars.strl3_dim, deflate_level); - - add_att(&obs_vars.unit_var, "long_name", "variable units"); - add_att(&obs_vars.desc_var, "long_name", "variable descriptions"); + unit_var = add_var(f_out, nc_var_unit, ncChar, var_dim, strl2_dim, deflate_level); + desc_var = add_var(f_out, nc_var_desc, ncChar, var_dim, strl3_dim, deflate_level); + + add_att(&unit_var, "long_name", "variable units"); + add_att(&desc_var, "long_name", "variable descriptions"); } } } +//////////////////////////////////////////////////////////////////////// + +void NetcdfObsVars::create_pb_hdrs (NcFile *f_out, const int hdr_count) { + const string method_name = " create_pb_hdrs()"; + mlog << Debug(7) << method_name << " hdr_count: " << hdr_count << "\n"; + + // Define netCDF dimensions + if (IS_INVALID_NC(pb_hdr_dim)) pb_hdr_dim = add_dim(f_out, nc_dim_npbhdr, hdr_count); + + raw_hdr_cnt = hdr_count; + hdr_prpt_typ_var = add_var(f_out, nc_var_hdr_prpt_typ, ncInt, pb_hdr_dim, deflate_level); + hdr_irpt_typ_var = add_var(f_out, nc_var_hdr_irpt_typ, ncInt, pb_hdr_dim, deflate_level); + hdr_inst_typ_var = add_var(f_out, nc_var_hdr_inst_typ, ncInt, pb_hdr_dim, deflate_level); + add_att(&hdr_prpt_typ_var, "long_name", "PB report type"); + add_att(&hdr_prpt_typ_var, "_FillValue", (int)FILL_VALUE); + add_att(&hdr_irpt_typ_var, "long_name", "In report type"); + add_att(&hdr_irpt_typ_var, "_FillValue", (int)FILL_VALUE); + add_att(&hdr_inst_typ_var, "long_name", "instrument type"); + add_att(&hdr_inst_typ_var, "_FillValue", (int)FILL_VALUE); +} + /////////////////////////////////////////////////////////////////////////////// -void create_nc_table_vars (NetcdfObsVars &obs_vars, NcFile *f_out, const int deflate_level) { - const string method_name = " create_nc_table_vars()"; - +void NetcdfObsVars::create_table_vars (NcFile *f_out, NcHeaderData &hdr_data, + NcDataBuffer &data_buffer) { + const string method_name = " create_table_vars()"; + // Define netCDF dimensions NcDim hdr_typ_dim = add_dim(f_out, nc_dim_nhdr_typ, hdr_data.typ_array.n_elements()); NcDim hdr_sid_dim = add_dim(f_out, nc_dim_nhdr_sid, hdr_data.sid_array.n_elements()); NcDim hdr_vld_dim = add_dim(f_out, nc_dim_nhdr_vld, hdr_data.vld_array.n_elements()); - NcDim obs_qty_dim = add_dim(f_out, nc_dim_nqty, nc_data_buffer.qty_data_array.n_elements()); + NcDim obs_qty_dim = add_dim(f_out, nc_dim_nqty, data_buffer.qty_data_array.n_elements()); // Define netCDF header variables - obs_vars.hdr_typ_tbl_var = add_var(f_out, nc_var_hdr_typ_tbl, ncChar, hdr_typ_dim, obs_vars.strl2_dim, deflate_level); - obs_vars.hdr_sid_tbl_var = add_var(f_out, nc_var_hdr_sid_tbl, ncChar, hdr_sid_dim, obs_vars.strl2_dim, deflate_level); - obs_vars.hdr_vld_tbl_var = add_var(f_out, nc_var_hdr_vld_tbl, ncChar, hdr_vld_dim, obs_vars.strl_dim, deflate_level); - obs_vars.obs_qty_tbl_var = add_var(f_out, nc_var_obs_qty_tbl, ncChar, obs_qty_dim, obs_vars.strl_dim, deflate_level); + hdr_typ_tbl_var = add_var(f_out, nc_var_hdr_typ_tbl, ncChar, hdr_typ_dim, strl2_dim, deflate_level); + hdr_sid_tbl_var = add_var(f_out, nc_var_hdr_sid_tbl, ncChar, hdr_sid_dim, strl2_dim, deflate_level); + hdr_vld_tbl_var = add_var(f_out, nc_var_hdr_vld_tbl, ncChar, hdr_vld_dim, strl_dim, deflate_level); + obs_qty_tbl_var = add_var(f_out, nc_var_obs_qty_tbl, ncChar, obs_qty_dim, strl_dim, deflate_level); + + add_att(&obs_qty_tbl_var, "long_name", "quality flag"); + add_att(&hdr_typ_tbl_var, "long_name", "message type"); + add_att(&hdr_sid_tbl_var, "long_name", "station identification"); + add_att(&hdr_vld_tbl_var, "long_name", "valid time"); + add_att(&hdr_vld_tbl_var, "units", "YYYYMMDD_HHMMSS UTC"); +} - add_att(&obs_vars.obs_qty_tbl_var, "long_name", "quality flag"); - add_att(&obs_vars.hdr_typ_tbl_var, "long_name", "message type"); - add_att(&obs_vars.hdr_sid_tbl_var, "long_name", "station identification"); - add_att(&obs_vars.hdr_vld_tbl_var, "long_name", "valid time"); - add_att(&obs_vars.hdr_vld_tbl_var, "units", "YYYYMMDD_HHMMSS UTC"); +/////////////////////////////////////////////////////////////////////////////// + +NcDim NetcdfObsVars::create_var_obs_var (NcFile *f_out, int var_count) { + NcDim var_dim = add_dim(f_out, nc_dim_nvar, var_count); + // If the string length is modified, update nc_tools.cc, too. + if (IS_INVALID_NC(strl2_dim)) strl2_dim = add_dim(f_out, nc_dim_mxstr2, HEADER_STR_LEN2); + obs_var = add_var(f_out, nc_var_obs_var, ncChar, var_dim, strl2_dim, deflate_level); + add_att(&obs_var, "long_name", "variable names"); + return var_dim; } //////////////////////////////////////////////////////////////////////// -void create_nc_pb_hdrs (NetcdfObsVars &obs_vars, NcFile *f_out, - const int hdr_count, const int deflate_level) { - const string method_name = " create_nc_pb_hdrs()"; - mlog << Debug(7) << method_name << " hdr_count: " << hdr_count << "\n"; - - // Define netCDF dimensions - if (IS_INVALID_NC(obs_vars.pb_hdr_dim)) obs_vars.pb_hdr_dim = add_dim(f_out, nc_dim_npbhdr, hdr_count); - - obs_vars.raw_hdr_cnt = hdr_count; - obs_vars.hdr_prpt_typ_var = add_var(f_out, nc_var_hdr_prpt_typ, ncInt, obs_vars.pb_hdr_dim, deflate_level); - obs_vars.hdr_irpt_typ_var = add_var(f_out, nc_var_hdr_irpt_typ, ncInt, obs_vars.pb_hdr_dim, deflate_level); - obs_vars.hdr_inst_typ_var = add_var(f_out, nc_var_hdr_inst_typ, ncInt, obs_vars.pb_hdr_dim, deflate_level); - add_att(&obs_vars.hdr_prpt_typ_var, "long_name", "PB report type"); - add_att(&obs_vars.hdr_prpt_typ_var, "_FillValue", (int)FILL_VALUE); - add_att(&obs_vars.hdr_irpt_typ_var, "long_name", "In report type"); - add_att(&obs_vars.hdr_irpt_typ_var, "_FillValue", (int)FILL_VALUE); - add_att(&obs_vars.hdr_inst_typ_var, "long_name", "instrument type"); - add_att(&obs_vars.hdr_inst_typ_var, "_FillValue", (int)FILL_VALUE); -} +bool NetcdfObsVars::is_valid(bool exit_on_error) { + bool valid = true; + const char* method_name = "NetcdfObsVars::is_valid()"; + StringArray missing_dims; + StringArray missing_vars; -//////////////////////////////////////////////////////////////////////// + if(IS_INVALID_NC(hdr_dim)) missing_dims.add(nc_dim_nhdr); + if(IS_INVALID_NC(obs_dim)) missing_dims.add(nc_dim_nobs); + if(IS_INVALID_NC(strl_dim)) missing_dims.add("mxstr"); + + if(IS_INVALID_NC(hdr_typ_var)) missing_vars.add("hdr_typ"); + if(IS_INVALID_NC(hdr_sid_var)) missing_vars.add("hdr_sid"); + if(IS_INVALID_NC(hdr_vld_var)) missing_vars.add("hdr_vld"); + if(IS_INVALID_NC(hdr_arr_var) && IS_INVALID_NC(hdr_lat_var)) missing_vars.add("hdr_lat/hdr_arr"); + if(IS_INVALID_NC(obs_arr_var) && IS_INVALID_NC(obs_val_var)) missing_vars.add("obs_val/obs_arr"); + + if (0 < missing_dims.n()) { + valid = false; + for (int idx=0; idx " + << "can not find the dimension\"" << missing_dims[idx] << "\".\n\n"; + } + } + + if (0 < missing_vars.n()) { + valid = false; + for (int idx=0; idx " + << "can't read \"" << missing_vars[idx] + << "\" variable from the netCDF file\n\n"; + } + } -NcDataBuffer *get_nc_data_buffer() { - return &nc_data_buffer; + if (!valid && exit_on_error) exit(1); + + if(IS_INVALID_NC(obs_qty_var)) + mlog << Debug(3) << "Quality marker information not found input file.\n"; + + return valid; } -//////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +void NetcdfObsVars::read_dims_vars(NcFile *f_in) { + + NcVar ncVar; + // Define netCDF dimensions + strl_dim = get_nc_dim(f_in, nc_dim_mxstr); // header string dimension + if (has_dim(f_in, nc_dim_mxstr2)) + strl2_dim = get_nc_dim(f_in, nc_dim_mxstr2); // header string dimension (bigger dimension) + if (has_dim(f_in, nc_dim_mxstr3)) + strl3_dim = get_nc_dim(f_in, nc_dim_mxstr3); // header string dimension (bigger dimension) + + if (has_dim(f_in, nc_dim_hdr_arr)) { + hdr_arr_dim = get_nc_dim(f_in, nc_dim_hdr_arr); // Header array width + obs_arr_dim = get_nc_dim(f_in, nc_dim_obs_arr); // Observation array width + } + else { + if (has_dim(f_in, nc_dim_nhdr_typ)) + hdr_typ_dim = get_nc_dim(f_in, nc_dim_nhdr_typ); // header dimension for message type + if (has_dim(f_in, nc_dim_nhdr_sid)) + hdr_sid_dim = get_nc_dim(f_in, nc_dim_nhdr_sid); // header dimension for station id + if (has_dim(f_in, nc_dim_nhdr_vld)) + hdr_vld_dim = get_nc_dim(f_in, nc_dim_nhdr_vld); // header dimension for valid time + if (has_dim(f_in, nc_dim_npbhdr)) + pb_hdr_dim = get_nc_dim(f_in, nc_dim_npbhdr); // header dimension for PB headers + } + obs_dim = get_nc_dim(f_in, nc_dim_nobs); // Observation array length + hdr_dim = get_nc_dim(f_in, nc_dim_nhdr); // Header array length + + // Get netCDF header variables + hdr_typ_var = get_var(f_in, nc_var_hdr_typ); // Message type (String or int) + hdr_sid_var = get_var(f_in, nc_var_hdr_sid); // Station ID (String or int) + hdr_vld_var = get_var(f_in, nc_var_hdr_vld); // Valid time (String or int) + + ncVar = get_var(f_in, nc_var_hdr_lat); + if (IS_INVALID_NC(ncVar)) { + hdr_arr_var = get_var(f_in, nc_var_hdr_arr); // Header array + } else { + hdr_lat_var = ncVar; // Header array + hdr_lon_var = get_var(f_in, nc_var_hdr_lon); // Header array + hdr_elv_var = get_var(f_in, nc_var_hdr_elv); // Header array + hdr_typ_tbl_var = get_var(f_in, nc_var_hdr_typ_tbl); // Message type (String) + hdr_sid_tbl_var = get_var(f_in, nc_var_hdr_sid_tbl); // Station ID (String) + hdr_vld_tbl_var = get_var(f_in, nc_var_hdr_vld_tbl); // Valid time (String) + } + + // Get netCDF variables + ncVar = get_var(f_in, nc_var_obs_hid); + if (IS_INVALID_NC(ncVar)) { + obs_arr_var = get_var(f_in, nc_var_obs_arr); + } else { + obs_hid_var = ncVar; // Obs. header id array + ncVar = get_var(f_in, nc_var_obs_gc); + if (!IS_INVALID_NC(ncVar)) obs_gc_var = ncVar; // Obs. grib code array + ncVar = get_var(f_in, nc_var_obs_vid); + if (!IS_INVALID_NC(ncVar)) obs_vid_var = ncVar; // Obs. variable id array + obs_lvl_var = get_var(f_in, nc_var_obs_lvl); // Obs. pressure level array + obs_hgt_var = get_var(f_in, nc_var_obs_hgt); // Obs. highth array + obs_val_var = get_var(f_in, nc_var_obs_val); // Obs. value array + } + ncVar = get_var(f_in, nc_var_obs_qty); + if (!IS_INVALID_NC(ncVar)) obs_qty_var = ncVar; + ncVar = get_var(f_in, nc_var_obs_qty_tbl); + if (!IS_INVALID_NC(ncVar)) obs_qty_tbl_var = ncVar; -NcHeaderData *get_hdr_data_buffer() { - return &hdr_data; + ncVar = get_var(f_in, nc_var_obs_var); + if (!IS_INVALID_NC(ncVar)) obs_var = ncVar; + ncVar = get_var(f_in, nc_var_unit); + if (!IS_INVALID_NC(ncVar)) unit_var = ncVar; + ncVar = get_var(f_in, nc_var_desc); + if (!IS_INVALID_NC(ncVar)) desc_var = ncVar; + + // PrepBufr only headers + ncVar = get_var(f_in, nc_var_hdr_prpt_typ); + if (!IS_INVALID_NC(ncVar)) hdr_prpt_typ_var = ncVar; + ncVar = get_var(f_in, nc_var_hdr_irpt_typ); + if (!IS_INVALID_NC(ncVar)) hdr_irpt_typ_var = ncVar; + ncVar = get_var(f_in, nc_var_hdr_inst_typ); + if (!IS_INVALID_NC(ncVar)) hdr_inst_typ_var = ncVar; + + bool _use_var_id = false; + if (!get_global_att(f_in, nc_att_use_var_id, _use_var_id)) { + _use_var_id = IS_VALID_NC(obs_var); + } + + use_var_id = _use_var_id; } //////////////////////////////////////////////////////////////////////// -NcHeaderData get_nc_hdr_data(NetcdfObsVars obs_vars) { - NcHeaderData my_hdr_data; - long nhdr_count = get_dim_size(&obs_vars.hdr_dim); - int strl_len = get_dim_size(&obs_vars.strl_dim); +void NetcdfObsVars::read_header_data(NcHeaderData &hdr_data) { + bool is_valid_obs_nc = true; + long nhdr_count = get_dim_size(&hdr_dim); + int strl_len = get_dim_size(&strl_dim); int strl2_len = strl_len; int typ_len = strl_len; int sid_len = strl_len; int vld_len = strl_len; - int hdr_arr_len = IS_INVALID_NC(obs_vars.hdr_arr_dim) - ? 0 : get_dim_size(&obs_vars.hdr_arr_dim); - bool has_array_vars = IS_INVALID_NC(obs_vars.hdr_typ_tbl_var); + int hdr_arr_len = IS_INVALID_NC(hdr_arr_dim) + ? 0 : get_dim_size(&hdr_arr_dim); + bool has_array_vars = IS_INVALID_NC(hdr_typ_tbl_var); + const char *method_name = "get_nc_header() -> "; - if (!IS_INVALID_NC(obs_vars.strl2_dim)) { + if (!IS_INVALID_NC(strl2_dim)) { NcDim str_dim; - strl2_len = get_dim_size(&obs_vars.strl2_dim); - string dim_name = GET_NC_NAME(obs_vars.strl2_dim); - str_dim = get_nc_dim((IS_INVALID_NC(obs_vars.hdr_typ_tbl_var) - ? &obs_vars.hdr_typ_var : &obs_vars.hdr_typ_tbl_var), dim_name); + strl2_len = get_dim_size(&strl2_dim); + string dim_name = GET_NC_NAME(strl2_dim); + str_dim = get_nc_dim((IS_INVALID_NC(hdr_typ_tbl_var) + ? &hdr_typ_var : &hdr_typ_tbl_var), dim_name); if (!IS_INVALID_NC(str_dim)) typ_len = strl2_len; - - str_dim = get_nc_dim((IS_INVALID_NC(obs_vars.hdr_sid_tbl_var) - ? &obs_vars.hdr_sid_var : &obs_vars.hdr_sid_tbl_var), dim_name); + + str_dim = get_nc_dim((IS_INVALID_NC(hdr_sid_tbl_var) + ? &hdr_sid_var : &hdr_sid_tbl_var), dim_name); if (!IS_INVALID_NC(str_dim)) sid_len = strl2_len; - - str_dim = get_nc_dim((IS_INVALID_NC(obs_vars.hdr_vld_tbl_var) - ? &obs_vars.hdr_vld_var : &obs_vars.hdr_vld_tbl_var), dim_name); + + str_dim = get_nc_dim((IS_INVALID_NC(hdr_vld_tbl_var) + ? &hdr_vld_var : &hdr_vld_tbl_var), dim_name); if (!IS_INVALID_NC(str_dim)) vld_len = strl2_len; } - - my_hdr_data.typ_len = typ_len; - my_hdr_data.sid_len = sid_len; - my_hdr_data.vld_len = vld_len; - my_hdr_data.strl_len = strl_len; - my_hdr_data.strll_len = strl2_len; - + + hdr_data.typ_len = typ_len; + hdr_data.sid_len = sid_len; + hdr_data.vld_len = vld_len; + hdr_data.strl_len = strl_len; + hdr_data.strll_len = strl2_len; + + hdr_data.lat_array.extend(nhdr_count); + hdr_data.lon_array.extend(nhdr_count); + hdr_data.elv_array.extend(nhdr_count); + hdr_data.typ_idx_array.extend(nhdr_count); + hdr_data.sid_idx_array.extend(nhdr_count); + hdr_data.vld_idx_array.extend(nhdr_count); + int buf_size = ((nhdr_count > NC_BUFFER_SIZE_32K) - ? NC_BUFFER_SIZE_32K : (nhdr_count)); - + ? NC_BUFFER_SIZE_32K : (nhdr_count)); + // // Allocate space to store the data // @@ -462,124 +666,120 @@ NcHeaderData get_nc_hdr_data(NetcdfObsVars obs_vars) { long lengths[2] = { 1, 1 }; long offsets_1D[1] = { 0 }; long lengths_1D[1] = { 1 }; - - //lengths[0] = buf_size; - //lengths[1] = strl_len; + for(int i_start=0; i_start NC_BUFFER_SIZE_32K) ? NC_BUFFER_SIZE_32K : (nhdr_count-i_start); - - offsets[0] = i_start; - lengths[0] = buf_size; - offsets_1D[0] = i_start; - lengths_1D[0] = buf_size; - + + offsets[0] = offsets_1D[0] = i_start; + lengths[0] = lengths_1D[0] = buf_size; + // // Get the corresponding header message type // if (has_array_vars) { lengths[1] = typ_len; - if(!get_nc_data(&obs_vars.hdr_typ_var, + if(!get_nc_data(&hdr_typ_var, (char *)&hdr_typ_block[0], lengths, offsets)) { - mlog << Error << "\nget_nc_header() -> " + mlog << Error << "\n" << method_name << "trouble getting hdr_typ\n\n"; exit(1); } - + // // Get the corresponding header station id // lengths[1] = sid_len; - if(!get_nc_data(&obs_vars.hdr_sid_var, + if(!get_nc_data(&hdr_sid_var, (char *)&hdr_sid_block[0], lengths, offsets)) { - mlog << Error << "\nget_nc_header() -> " + mlog << Error << "\n" << method_name << "trouble getting hdr_sid\n\n"; exit(1); } - + // // Get the corresponding header valid time // lengths[1] = vld_len; - if(!get_nc_data(&obs_vars.hdr_vld_var, + if(!get_nc_data(&hdr_vld_var, (char *)&hdr_vld_block[0], lengths, offsets)) { mlog << Error << "\nget_nc_header() -> " << "trouble getting hdr_vld\n\n"; exit(1); } - + // // Get the header for this observation // lengths[1] = hdr_arr_len; - if(!get_nc_data(&obs_vars.hdr_arr_var, + if(!get_nc_data(&hdr_arr_var, (float *)&hdr_arr_block[0], lengths, offsets)) { - mlog << Error << "\nget_nc_header() -> " + mlog << Error << "\n" << method_name << "trouble getting hdr_arr\n\n"; exit(1); } for (int hIndex = 0; hIndex < buf_size; hIndex++) { - my_hdr_data.typ_array.add(hdr_typ_block[hIndex]); - my_hdr_data.sid_array.add(hdr_sid_block[hIndex]); - my_hdr_data.vld_array.add(hdr_vld_block[hIndex]); - my_hdr_data.lat_array.add(hdr_arr_block[hIndex][0]); - my_hdr_data.lon_array.add(hdr_arr_block[hIndex][1]); - my_hdr_data.elv_array.add(hdr_arr_block[hIndex][2]); + hdr_data.typ_array.add(hdr_typ_block[hIndex]); + hdr_data.sid_array.add(hdr_sid_block[hIndex]); + hdr_data.vld_array.add(hdr_vld_block[hIndex]); + hdr_data.lat_array.add(hdr_arr_block[hIndex][0]); + hdr_data.lon_array.add(hdr_arr_block[hIndex][1]); + hdr_data.elv_array.add(hdr_arr_block[hIndex][2]); } } else { // Get the corresponding header message type (index, not string) - if(!get_nc_data(&obs_vars.hdr_typ_var, + if(!get_nc_data(&hdr_typ_var, hdr_typ_idx_block, lengths_1D, offsets_1D)) { - mlog << Error << "\nget_nc_header() -> " + mlog << Error << "\n" << method_name << "trouble getting hdr_typ\n\n"; exit(1); } - + // Get the corresponding header station id (index, not string) - if(!get_nc_data(&obs_vars.hdr_sid_var, + if(!get_nc_data(&hdr_sid_var, hdr_sid_idx_block, lengths_1D, offsets_1D)) { - mlog << Error << "\nget_nc_header() -> " + mlog << Error << "\n" << method_name << "trouble getting hdr_sid\n\n"; exit(1); } - + // Get the corresponding header valid time (index, not string) - if(!get_nc_data(&obs_vars.hdr_vld_var, + if(!get_nc_data(&hdr_vld_var, hdr_vld_idx_block, lengths_1D, offsets_1D)) { - mlog << Error << "\nget_nc_header() -> " + mlog << Error << "\n" << method_name << "trouble getting hdr_vld\n\n"; exit(1); } - + // // Get the header for this observation // - if(!get_nc_data(&obs_vars.hdr_lat_var, + if(!get_nc_data(&hdr_lat_var, hdr_lat_block, lengths_1D, offsets_1D)) { - mlog << Error << "\nget_nc_header() -> " + mlog << Error << "\n" << method_name << "trouble getting hdr_lat\n\n"; exit(1); } - if(!get_nc_data(&obs_vars.hdr_lon_var, + if(!get_nc_data(&hdr_lon_var, hdr_lon_block, lengths_1D, offsets_1D)) { - mlog << Error << "\nget_nc_header() -> " + mlog << Error << "\n" << method_name << "trouble getting hdr_lon\n\n"; exit(1); } - if(!get_nc_data(&obs_vars.hdr_elv_var, + if(!get_nc_data(&hdr_elv_var, hdr_elv_block, lengths_1D, offsets_1D)) { - mlog << Error << "\nget_nc_header() -> " + mlog << Error << "\n" << method_name << "trouble getting hdr_elv\n\n"; exit(1); } for (int hIndex = 0; hIndex < buf_size; hIndex++) { - my_hdr_data.typ_idx_array.add(hdr_typ_idx_block[hIndex]); - my_hdr_data.sid_idx_array.add(hdr_sid_idx_block[hIndex]); - my_hdr_data.vld_idx_array.add(hdr_vld_idx_block[hIndex]); - my_hdr_data.lat_array.add(hdr_lat_block[hIndex]); - my_hdr_data.lon_array.add(hdr_lon_block[hIndex]); - my_hdr_data.elv_array.add(hdr_elv_block[hIndex]); + hdr_data.typ_idx_array.add(hdr_typ_idx_block[hIndex]); + hdr_data.sid_idx_array.add(hdr_sid_idx_block[hIndex]); + hdr_data.vld_idx_array.add(hdr_vld_idx_block[hIndex]); + hdr_data.lat_array.add(hdr_lat_block[hIndex]); + hdr_data.lon_array.add(hdr_lon_block[hIndex]); + hdr_data.elv_array.add(hdr_elv_block[hIndex]); } } } @@ -590,224 +790,115 @@ NcHeaderData get_nc_hdr_data(NetcdfObsVars obs_vars) { delete[] hdr_lat_block; delete[] hdr_lon_block; delete[] hdr_elv_block; - + if (!has_array_vars) { int tmp_dim_size; - + lengths[1] = typ_len; - tmp_dim_size = get_dim_size(&obs_vars.hdr_typ_dim); + tmp_dim_size = get_dim_size(&hdr_typ_dim); for(int i_start=0; i_start NC_BUFFER_SIZE_32K) ? NC_BUFFER_SIZE_32K : (tmp_dim_size-i_start); offsets[0] = i_start; lengths[0] = buf_size; - + // Get the corresponding header message type (string) - if(!get_nc_data(&obs_vars.hdr_typ_tbl_var, + if(!get_nc_data(&hdr_typ_tbl_var, (char *)&hdr_typ_block[0], lengths, offsets)) { - mlog << Error << "\nget_nc_header() -> " + mlog << Error << "\n" << method_name << "trouble getting hdr_typ\n\n"; exit(1); } for (int hIndex = 0; hIndex < buf_size; hIndex++) { - my_hdr_data.typ_array.add(hdr_typ_block[hIndex]); + hdr_data.typ_array.add(hdr_typ_block[hIndex]); } } - + lengths[1] = sid_len; - tmp_dim_size = get_dim_size(&obs_vars.hdr_sid_dim); + tmp_dim_size = get_dim_size(&hdr_sid_dim); for(int i_start=0; i_start NC_BUFFER_SIZE_32K) ? NC_BUFFER_SIZE_32K : (tmp_dim_size-i_start); offsets[0] = i_start; lengths[0] = buf_size; - + // Get the corresponding header station id (string) - if(!get_nc_data(&obs_vars.hdr_sid_tbl_var, + if(!get_nc_data(&hdr_sid_tbl_var, (char *)&hdr_sid_block[0], lengths, offsets)) { - mlog << Error << "\nget_nc_header() -> " + mlog << Error << "\n" << method_name << "trouble getting hdr_typ\n\n"; exit(1); } for (int hIndex = 0; hIndex < buf_size; hIndex++) { - my_hdr_data.sid_array.add(hdr_sid_block[hIndex]); + hdr_data.sid_array.add(hdr_sid_block[hIndex]); } } lengths[1] = vld_len; - tmp_dim_size = get_dim_size(&obs_vars.hdr_vld_dim); + tmp_dim_size = get_dim_size(&hdr_vld_dim); for(int i_start=0; i_start NC_BUFFER_SIZE_32K) ? NC_BUFFER_SIZE_32K : (tmp_dim_size-i_start); offsets[0] = i_start; lengths[0] = buf_size; - + // Get the corresponding header valid time (string) - if(!get_nc_data(&obs_vars.hdr_vld_tbl_var, + if(!get_nc_data(&hdr_vld_tbl_var, (char *)&hdr_vld_block[0], lengths, offsets)) { - mlog << Error << "\nget_nc_header() -> " + mlog << Error << "\n" << method_name << "trouble getting hdr_typ\n\n"; exit(1); } for (int hIndex = 0; hIndex < buf_size; hIndex++) { - my_hdr_data.vld_array.add(hdr_vld_block[hIndex]); + hdr_data.vld_array.add(hdr_vld_block[hIndex]); } } } - if (!IS_INVALID_NC(obs_vars.pb_hdr_dim)) { - get_nc_pb_hdr_data(obs_vars, &my_hdr_data); - int last_prpt_typ = my_hdr_data.prpt_typ_array.n_elements() - 1; - int last_irpt_typ = my_hdr_data.irpt_typ_array.n_elements() - 1; - int last_inst_typ = my_hdr_data.inst_typ_array.n_elements() - 1; - mlog << Debug(10) - << " prpt_typ[0,-1] " << my_hdr_data.prpt_typ_array[0] - << "," << my_hdr_data.prpt_typ_array[last_prpt_typ] - << " irpt_typ[0,-1] " << my_hdr_data.irpt_typ_array[0] - << "," << my_hdr_data.irpt_typ_array[last_irpt_typ] - << " inst_typ[0,-1] " << my_hdr_data.inst_typ_array[0] - << "," << my_hdr_data.inst_typ_array[last_inst_typ] << "\n"; - } - return my_hdr_data; -} - -//////////////////////////////////////////////////////////////////////// -int get_nc_hdr_cur_index() { - //return (nc_data_buffer.cur_hdr_idx < 0) ? 0 : nc_data_buffer.cur_hdr_idx; - return nc_data_buffer.cur_hdr_idx; + if (!IS_INVALID_NC(pb_hdr_dim)) { + read_pb_hdr_data(hdr_data); + int last_prpt_typ = hdr_data.prpt_typ_array.n_elements() - 1; + int last_irpt_typ = hdr_data.irpt_typ_array.n_elements() - 1; + int last_inst_typ = hdr_data.inst_typ_array.n_elements() - 1; + if (0 > last_prpt_typ) mlog << Debug(7) << " prpt_typ is empty\n"; + else if (0 > last_irpt_typ) mlog << Debug(7) << " irpt_typ is empty\n"; + else if (0 > last_inst_typ) mlog << Debug(7) << " inst_typ is empty\n"; + else { + mlog << Debug(10) + << " prpt_typ[0,-1] " << hdr_data.prpt_typ_array[0] + << "," << hdr_data.prpt_typ_array[last_prpt_typ] + << " irpt_typ[0,-1] " << hdr_data.irpt_typ_array[0] + << "," << hdr_data.irpt_typ_array[last_irpt_typ] + << " inst_typ[0,-1] " << hdr_data.inst_typ_array[0] + << "," << hdr_data.inst_typ_array[last_inst_typ] << "\n"; + } + } } //////////////////////////////////////////////////////////////////////// -int get_nc_obs_buf_index() { - return nc_data_buffer.obs_data_idx; -} - -//////////////////////////////////////////////////////////////////////// +bool NetcdfObsVars::read_obs_data(int buf_size, int offset, + int qty_len, float *obs_arr, int *qty_idx_arr, char *obs_qty_buf) { + bool result = true; + long offsets[2] = { offset, 0 }; + long lengths[2] = { buf_size, 1 }; + const char *method_name = "read_obs_data() -> "; -void get_nc_pb_hdr_data(NetcdfObsVars obs_vars, NcHeaderData *my_hdr_data) { + if (IS_VALID_NC(obs_arr_var)) { + // Read the current observation message + lengths[1] = OBS_ARRAY_LEN; + if(!get_nc_data(&obs_arr_var, (float *)obs_arr, lengths, offsets)) { + mlog << Error << "\n" << method_name << "trouble getting obs_arr\n\n"; + result = false; + } - long offsets[1] = { 0 }; - long lengths[1] = { 1 }; - int pb_hdr_count = get_dim_size(&obs_vars.pb_hdr_dim); - - // Read PB report type - int buf_size = ((pb_hdr_count > NC_BUFFER_SIZE_32K) - ? NC_BUFFER_SIZE_32K : (pb_hdr_count)); - int *hdr_prpt_typ_block = new int[buf_size]; - int *hdr_irpt_typ_block = new int[buf_size]; - int *hdr_inst_typ_block = new int[buf_size]; - for(int i_start=0; i_start NC_BUFFER_SIZE_32K) buf_size = NC_BUFFER_SIZE_32K; - offsets[0] = i_start; - lengths[0] = buf_size; - - if (!IS_INVALID_NC(obs_vars.hdr_prpt_typ_var)) { - // Get the corresponding header PB message type (string) - if(!get_nc_data(&obs_vars.hdr_prpt_typ_var, - hdr_prpt_typ_block, lengths, offsets)) { - mlog << Error << "\nget_nc_header() -> " - << "trouble getting hdr_prpt_typ\n\n"; - exit(1); + if (0 != obs_qty_buf) { + lengths[1] = qty_len; + if(!get_nc_data(&obs_qty_var, obs_qty_buf, lengths, offsets)) { + mlog << Error << "\n" << method_name << "trouble getting obs_qty\n\n"; + result = false; } } - - if (!IS_INVALID_NC(obs_vars.hdr_irpt_typ_var)) { - // Get the corresponding header In message type (string) - if(!get_nc_data(&obs_vars.hdr_irpt_typ_var, - hdr_irpt_typ_block, lengths, offsets)) { - mlog << Error << "\nget_nc_header() -> " - << "trouble getting hdr_irpt_typ\n\n"; - exit(1); - } - } - - if (!IS_INVALID_NC(obs_vars.hdr_inst_typ_var)) { - // Get the corresponding header instrument type (string) - if(!get_nc_data(&obs_vars.hdr_inst_typ_var, - hdr_inst_typ_block, lengths, offsets)) { - mlog << Error << "\nget_nc_header() -> " - << "trouble getting hdr_inst_typ\n\n"; - exit(1); - } - } - - for (int hIndex = 0; hIndex < buf_size; hIndex++) { - my_hdr_data->prpt_typ_array.add(hdr_prpt_typ_block[hIndex]); - my_hdr_data->irpt_typ_array.add(hdr_irpt_typ_block[hIndex]); - my_hdr_data->inst_typ_array.add(hdr_inst_typ_block[hIndex]); - } - } - - delete[] hdr_prpt_typ_block; - delete[] hdr_irpt_typ_block; - delete[] hdr_inst_typ_block; - -} - -/////////////////////////////////////////////////////////////////////////////// - -void init_nc_dims_vars_config(NetcdfObsVars &obs_vars, bool use_var_id) { - obs_vars.attr_agl = false; - obs_vars.attr_pb2nc = false; - obs_vars.use_var_id = use_var_id; - obs_vars.hdr_cnt = 0; // header array length (fixed dimension if hdr_cnt > 0) - obs_vars.obs_cnt = 0; // obs. array length (fixed dimension if obs_cnt > 0) - //obs_vars.hdr_str_len = 0; // string length for header (message) type header - nc_data_buffer.obs_vars = obs_vars; -} - -//////////////////////////////////////////////////////////////////////// - -bool is_using_var_id(const char * nc_name) { - bool use_var_id = false; - ConcatString attr_name = nc_att_use_var_id; - if (!get_global_att(nc_name, nc_att_use_var_id, use_var_id)) { - use_var_id = false; - } - return use_var_id; -} - -/////////////////////////////////////////////////////////////////////////////// - -void nc_obs_initialize() { - nc_data_buffer.obs_data_idx = 0; - nc_data_buffer.obs_data_offset = 0; - nc_data_buffer.hdr_data_idx = 0; - nc_data_buffer.hdr_data_offset = 0; - nc_data_buffer.pb_hdr_data_offset = 0; - - strcpy(nc_data_buffer.prev_hdr_typ_buf, "NotDefined"); - strcpy(nc_data_buffer.prev_hdr_sid_buf, "NotDefined"); - strcpy(nc_data_buffer.prev_hdr_vld_buf, "NotDefined"); - for (int index=0; index trouble getting obs_arr\n\n"; - result = false; - } - - lengths[1] = qty_len; - if(!get_nc_data(&obs_vars.obs_qty_var, obs_qty_buf, lengths, offsets)) { - mlog << Error << "\nprocess_point_obs() -> trouble getting obs_qty\n\n"; - result = false; - } } else { int *obs_hid_buf = new int[buf_size]; @@ -815,48 +906,48 @@ bool read_nc_obs_data(NetcdfObsVars obs_vars, int buf_size, int offset, float *obs_lvl_buf = new float[buf_size]; float *obs_hgt_buf = new float[buf_size]; float *obs_val_buf = new float[buf_size]; - + lengths[1] = 1; - - if(!get_nc_data(&obs_vars.obs_hid_var, obs_hid_buf, lengths, offsets)) { - mlog << Error << "\nread_nc_obs_array() -> " + + if(!get_nc_data(&obs_hid_var, obs_hid_buf, lengths, offsets)) { + mlog << Error << "\n" << method_name << "can't read the record for observation " << "index " << offset << "\n\n"; result = false; } - if(!get_nc_data((IS_INVALID_NC(obs_vars.obs_gc_var) ? &obs_vars.obs_vid_var : &obs_vars.obs_gc_var), + if(!get_nc_data((IS_INVALID_NC(obs_gc_var) ? &obs_vid_var : &obs_gc_var), obs_vid_buf, lengths, offsets)) { - mlog << Error << "\nread_nc_obs_array() -> " + mlog << Error << "\n" << method_name << "can't read the record (vid or gc) for observation " << "index " << offset << "\n\n"; result = false; } - if(!get_nc_data(&obs_vars.obs_lvl_var, obs_lvl_buf, lengths, offsets)) { - mlog << Error << "\nread_nc_obs_array() -> " + if(!get_nc_data(&obs_lvl_var, obs_lvl_buf, lengths, offsets)) { + mlog << Error << "\n" << method_name << "can't read the record (lvl) for observation " << "index " << offset << "\n\n"; result = false; } - if(!get_nc_data(&obs_vars.obs_hgt_var, obs_hgt_buf, lengths, offsets)) { - mlog << Error << "\nread_nc_obs_array() -> " + if(!get_nc_data(&obs_hgt_var, obs_hgt_buf, lengths, offsets)) { + mlog << Error << "\n" << method_name << "can't read the record (hgt) for observation " << "index " << offset << "\n\n"; result = false; } - if(!get_nc_data(&obs_vars.obs_val_var, obs_val_buf, lengths, offsets)) { - mlog << Error << "\nread_nc_obs_array() -> " + if(!get_nc_data(&obs_val_var, obs_val_buf, lengths, offsets)) { + mlog << Error << "\n" << method_name << "can't read the record (val) for observation " << "index " << offset << "\n\n"; result = false; } - if (!get_nc_data(&obs_vars.obs_qty_var, qty_idx_arr, lengths, offsets)) { - mlog << Error << "\nread_nc_obs_array() -> " + if (!get_nc_data(&obs_qty_var, qty_idx_arr, lengths, offsets)) { + mlog << Error << "\n" << method_name << "can't read the index of quality flag for observation " << "index " << offset << "\n\n"; result = false; } - + if (result) { float *tmp_obs_arr = obs_arr; for(int index=0; index 0) - obs_vars.strl_dim = get_nc_dim(f_in, nc_dim_mxstr); // header string dimension - if (has_dim(f_in, nc_dim_mxstr2)) - obs_vars.strl2_dim = get_nc_dim(f_in, nc_dim_mxstr2); // header string dimension (bigger dimension) - if (has_dim(f_in, nc_dim_mxstr3)) - obs_vars.strl3_dim = get_nc_dim(f_in, nc_dim_mxstr3); // header string dimension (bigger dimension) +void NetcdfObsVars::read_pb_hdr_data(NcHeaderData &hdr_data) { + const char *method_name = "get_nc_pb_hdr_data() -> "; - if (has_dim(f_in, nc_dim_hdr_arr)) { - obs_vars.hdr_arr_dim = get_nc_dim(f_in, nc_dim_hdr_arr); // Header array width - obs_vars.obs_arr_dim = get_nc_dim(f_in, nc_dim_obs_arr); // Observation array width + int pb_hdr_count = get_dim_size(&pb_hdr_dim); + if (pb_hdr_count < 0) { + mlog << Warning << "\n" << method_name + << "No extra header for PREPBUFR\n\n"; + return; } - else { - if (has_dim(f_in, nc_dim_nhdr_typ)) - obs_vars.hdr_typ_dim = get_nc_dim(f_in, nc_dim_nhdr_typ); // header dimension for message type - if (has_dim(f_in, nc_dim_nhdr_sid)) - obs_vars.hdr_sid_dim = get_nc_dim(f_in, nc_dim_nhdr_sid); // header dimension for station id - if (has_dim(f_in, nc_dim_nhdr_vld)) - obs_vars.hdr_vld_dim = get_nc_dim(f_in, nc_dim_nhdr_vld); // header dimension for valid time - if (has_dim(f_in, nc_dim_npbhdr)) - obs_vars.pb_hdr_dim = get_nc_dim(f_in, nc_dim_npbhdr); // header dimension for PB headers - } - obs_vars.obs_dim = get_nc_dim(f_in, nc_dim_nobs); // Observation array length - obs_vars.hdr_dim = get_nc_dim(f_in, nc_dim_nhdr); // Header array length - // Get netCDF header variables - obs_vars.hdr_typ_var = get_var(f_in, nc_var_hdr_typ); // Message type (String or int) - obs_vars.hdr_sid_var = get_var(f_in, nc_var_hdr_sid); // Station ID (String or int) - obs_vars.hdr_vld_var = get_var(f_in, nc_var_hdr_vld); // Valid time (String or int) - - ncVar = get_var(f_in, nc_var_hdr_lat); - if (IS_INVALID_NC(ncVar)) { - obs_vars.hdr_arr_var = get_var(f_in, nc_var_hdr_arr); // Header array - } else { - obs_vars.hdr_lat_var = ncVar; // Header array - obs_vars.hdr_lon_var = get_var(f_in, nc_var_hdr_lon); // Header array - obs_vars.hdr_elv_var = get_var(f_in, nc_var_hdr_elv); // Header array - obs_vars.hdr_typ_tbl_var = get_var(f_in, nc_var_hdr_typ_tbl); // Message type (String) - obs_vars.hdr_sid_tbl_var = get_var(f_in, nc_var_hdr_sid_tbl); // Station ID (String) - obs_vars.hdr_vld_tbl_var = get_var(f_in, nc_var_hdr_vld_tbl); // Valid time (String) - } - - // Get netCDF variables - ncVar = get_var(f_in, nc_var_obs_hid); - if (IS_INVALID_NC(ncVar)) { - obs_vars.obs_arr_var = get_var(f_in, nc_var_obs_arr); - } else { - obs_vars.obs_hid_var = ncVar; // Obs. header id array - ncVar = get_var(f_in, nc_var_obs_gc); - if (!IS_INVALID_NC(ncVar)) obs_vars.obs_gc_var = ncVar; // Obs. grib code array - ncVar = get_var(f_in, nc_var_obs_vid); - if (!IS_INVALID_NC(ncVar)) obs_vars.obs_vid_var = ncVar; // Obs. variable id array - obs_vars.obs_lvl_var = get_var(f_in, nc_var_obs_lvl); // Obs. pressure level array - obs_vars.obs_hgt_var = get_var(f_in, nc_var_obs_hgt); // Obs. highth array - obs_vars.obs_val_var = get_var(f_in, nc_var_obs_val); // Obs. value array - } - ncVar = get_var(f_in, nc_var_obs_qty); - if (!IS_INVALID_NC(ncVar)) obs_vars.obs_qty_var = ncVar; - ncVar = get_var(f_in, nc_var_obs_qty_tbl); - if (!IS_INVALID_NC(ncVar)) obs_vars.obs_qty_tbl_var = ncVar; + long offsets[1] = { 0 }; + long lengths[1] = { 1 }; + bool has_hdr_prpt_typ_var = !IS_INVALID_NC(hdr_prpt_typ_var); + bool has_hdr_irpt_typ_var = !IS_INVALID_NC(hdr_irpt_typ_var); + bool has_hdr_inst_typ_var = !IS_INVALID_NC(hdr_inst_typ_var); - // PrepBufr only headers - ncVar = get_var(f_in, nc_var_hdr_prpt_typ); - if (!IS_INVALID_NC(ncVar)) obs_vars.hdr_prpt_typ_var = ncVar; - ncVar = get_var(f_in, nc_var_hdr_irpt_typ); - if (!IS_INVALID_NC(ncVar)) obs_vars.hdr_irpt_typ_var = ncVar; - ncVar = get_var(f_in, nc_var_hdr_inst_typ); - if (!IS_INVALID_NC(ncVar)) obs_vars.hdr_inst_typ_var = ncVar; - - bool use_var_id = false; - if (!get_global_att(f_in, nc_att_use_var_id, use_var_id)) use_var_id = false; + if (has_hdr_prpt_typ_var) hdr_data.prpt_typ_array.extend(pb_hdr_count); + if (has_hdr_irpt_typ_var) hdr_data.irpt_typ_array.extend(pb_hdr_count); + if (has_hdr_inst_typ_var) hdr_data.inst_typ_array.extend(pb_hdr_count); - obs_vars.use_var_id = use_var_id; - nc_data_buffer.obs_vars = obs_vars; -} + // Read PB report type + int buf_size = ((pb_hdr_count > NC_BUFFER_SIZE_32K) + ? NC_BUFFER_SIZE_32K : (pb_hdr_count)); + int *hdr_prpt_typ_block = new int[buf_size]; + int *hdr_irpt_typ_block = new int[buf_size]; + int *hdr_inst_typ_block = new int[buf_size]; + for(int i_start=0; i_start NC_BUFFER_SIZE_32K) buf_size = NC_BUFFER_SIZE_32K; + offsets[0] = i_start; + lengths[0] = buf_size; -/////////////////////////////////////////////////////////////////////////////// + if (has_hdr_prpt_typ_var) { + // Get the corresponding header PB message type (string) + if(!get_nc_data(&hdr_prpt_typ_var, + hdr_prpt_typ_block, lengths, offsets)) { + mlog << Error << "\n" << method_name + << "trouble getting hdr_prpt_typ\n\n"; + exit(1); + } + } -void reset_header_buffer(int buf_size, bool reset_all) { - for (int i=0; i 0) + obs_cnt = 0; // obs. array length (fixed dimension if obs_cnt > 0) + //hdr_str_len = 0; // string length for header (message) type header } /////////////////////////////////////////////////////////////////////////////// -void write_header_to_nc(const NetcdfObsVars &obs_vars, - NcDataBuffer &data_buf, const int buf_size, const bool is_pb) +void NetcdfObsVars::write_header_to_nc(NcDataBuffer &data_buf, + const int buf_size, const bool is_pb) { + int dim_size; + bool is_prepbufr = is_pb || attr_pb2nc; long offsets[2] = { data_buf.hdr_data_offset, 0 }; long lengths[1] = { buf_size } ; - const string method_name = " write_header_to_nc()"; + const string method_name = " NetcdfObsVars::write_header_to_nc() "; + + ConcatString log_message; + if (is_prepbufr) { + log_message.add(", pb_hdr_data_offset: "); + log_message.add(data_buf.pb_hdr_data_offset); + log_message.add(", raw_hdr_cnt: "); + log_message.add(raw_hdr_cnt); + } + + mlog << Debug(7) << method_name << " buf_size: " << buf_size + << " is_prepbufr: " << is_prepbufr << ", hdr_data_offset: " + << data_buf.hdr_data_offset << log_message << "\n"; - mlog << Debug(7) << method_name << " buf_size: " << buf_size << "\n"; - //lengths[1] = HEADER_STR_LEN2; - if(!put_nc_data((NcVar *)&obs_vars.hdr_typ_var, (int *)data_buf.hdr_typ_buf, lengths, offsets)) { + dim_size = get_dim_size(&hdr_typ_var, 0); + if ((0 < dim_size) &&(dim_size < lengths[0])) { + mlog << Error << "\n" << method_name << " mismatching dimensions: allocated=" + << dim_size << ", data size=" << lengths[0] << " (hdr_typ)\n\n"; + exit(1); + } + else if(!put_nc_data((NcVar *)&hdr_typ_var, (int *)data_buf.hdr_typ_buf, lengths, offsets)) { mlog << Error << err_msg_message_type; exit(1); } - + // Station ID - if(!put_nc_data((NcVar *)&obs_vars.hdr_sid_var, (int *)data_buf.hdr_sid_buf, lengths, offsets)) { + if(!put_nc_data((NcVar *)&hdr_sid_var, (int *)data_buf.hdr_sid_buf, lengths, offsets)) { mlog << Error << err_msg_station_id; exit(1); } - + // Valid Time - if(!put_nc_data((NcVar *)&obs_vars.hdr_vld_var, (int *)data_buf.hdr_vld_buf, lengths, offsets)) { + if(!put_nc_data((NcVar *)&hdr_vld_var, (int *)data_buf.hdr_vld_buf, lengths, offsets)) { mlog << Error << err_msg_valid_time; exit(1); } - - // Write the header array which consists of the following: - // LAT LON ELV - - if(!put_nc_data((NcVar *)&obs_vars.hdr_lat_var, (float *)data_buf.hdr_lat_buf, lengths, offsets)) { + + // Write the header array which consists of the following: LAT LON ELV + dim_size = get_dim_size(&hdr_lat_var, 0); + if ((0 < dim_size) &&(dim_size < lengths[0])) { + mlog << Error << "\n" << method_name << " mismatching dimensions: allocated=" + << dim_size << ", data size=" << lengths[0] << " (hdr_lat)\n\n"; + exit(1); + } + else if(!put_nc_data((NcVar *)&hdr_lat_var, (float *)data_buf.hdr_lat_buf, lengths, offsets)) { mlog << Error << err_msg_hdr_arr; exit(1); } - if(!put_nc_data((NcVar *)&obs_vars.hdr_lon_var, (float *)data_buf.hdr_lon_buf, lengths, offsets)) { + if(!put_nc_data((NcVar *)&hdr_lon_var, (float *)data_buf.hdr_lon_buf, lengths, offsets)) { mlog << Error << err_msg_hdr_arr; exit(1); } - if(!put_nc_data((NcVar *)&obs_vars.hdr_elv_var, (float *)data_buf.hdr_elv_buf, lengths, offsets)) { + if(!put_nc_data((NcVar *)&hdr_elv_var, (float *)data_buf.hdr_elv_buf, lengths, offsets)) { mlog << Error << err_msg_hdr_arr; exit(1); } - - //for(int hi=0; hi buf_size) pb_hdr_len = buf_size; - - lengths[0] = pb_hdr_len; - if(!put_nc_data((NcVar *)&obs_vars.hdr_prpt_typ_var, data_buf.hdr_prpt_typ_buf, lengths, offsets)) { - mlog << Error << "error writing the pb message type to the netCDF file\n\n"; - exit(1); + + if (is_prepbufr) { + if (0 == raw_hdr_cnt) { + mlog << Debug(6) << method_name + << "No header for PREPBUFR report/instrument\n"; } - if(!put_nc_data((NcVar *)&obs_vars.hdr_irpt_typ_var, data_buf.hdr_irpt_typ_buf, lengths, offsets)) { - mlog << Error << "error writing the in message type to the netCDF file\n\n"; - exit(1); + else if (data_buf.hdr_data_offset == data_buf.pb_hdr_data_offset) { + int save_len = lengths[0]; + int pb_hdr_len = raw_hdr_cnt - offsets[0]; + if (pb_hdr_len > buf_size) pb_hdr_len = buf_size; + + lengths[0] = pb_hdr_len; + if(IS_VALID_NC(hdr_prpt_typ_var) && !put_nc_data((NcVar *)&hdr_prpt_typ_var, + data_buf.hdr_prpt_typ_buf, lengths, offsets)) { + mlog << Error << "error writing the pb message type to the netCDF file\n\n"; + exit(1); + } + if(IS_VALID_NC(hdr_irpt_typ_var) && !put_nc_data((NcVar *)&hdr_irpt_typ_var, + data_buf.hdr_irpt_typ_buf, lengths, offsets)) { + mlog << Error << "error writing the in message type to the netCDF file\n\n"; + exit(1); + } + if(IS_VALID_NC(hdr_inst_typ_var) && !put_nc_data((NcVar *)&hdr_inst_typ_var, + data_buf.hdr_inst_typ_buf, lengths, offsets)) { + mlog << Error << "error writing the instrument type to the netCDF file\n\n"; + exit(1); + } + lengths[0] = save_len; + data_buf.pb_hdr_data_offset += pb_hdr_len; } - if(!put_nc_data((NcVar *)&obs_vars.hdr_inst_typ_var, data_buf.hdr_inst_typ_buf, lengths, offsets)) { - mlog << Error << "error writing the instrument type to the netCDF file\n\n"; - exit(1); + else { + mlog << Debug(6) << method_name + << "Does not match header offsets for report/instrument: " << data_buf.hdr_data_offset + << " : " << data_buf.pb_hdr_data_offset << "\n"; } - lengths[0] = save_len; - data_buf.pb_hdr_data_offset += pb_hdr_len; } - + data_buf.hdr_data_offset += buf_size; data_buf.hdr_data_idx = 0; } /////////////////////////////////////////////////////////////////////////////// -// Saves the headers at NcHeaderData hdr_data -// -void write_nc_arr_headers(const NetcdfObsVars &obs_vars) +void NetcdfObsVars::write_table_vars (NcHeaderData &hdr_data, NcDataBuffer &data_buffer) { - int cur_hdr_idx = nc_data_buffer.cur_hdr_idx; - int buf_size = (cur_hdr_idx > OBS_BUFFER_SIZE) ? OBS_BUFFER_SIZE : cur_hdr_idx; - const string method_name = " write_nc_arr_headers()"; - - mlog << Debug(5) << method_name << " hdr_count: " << cur_hdr_idx - << ", typ_idx_array: " << hdr_data.typ_idx_array.n_elements() - << ", sid_idx_array: " << hdr_data.sid_idx_array.n_elements() - << ", vld_idx_array: " << hdr_data.vld_idx_array.n_elements() - << ", lat_array: " << hdr_data.lat_array.n_elements() - << ", lon_array: " << hdr_data.lon_array.n_elements() - << ", elv_array: " << hdr_data.elv_array.n_elements() - << "\n"; - - int hdr_data_idx = 0; - bool is_pb_hdr = (0 < hdr_data.prpt_typ_array.n_elements()) - && !IS_INVALID_NC(obs_vars.hdr_prpt_typ_var); - nc_data_buffer.obs_vars = obs_vars; - nc_data_buffer.hdr_buf_size = buf_size; - nc_data_buffer.hdr_data_idx = hdr_data_idx; - for (int index=0; index= buf_size) { - write_header_to_nc(obs_vars, nc_data_buffer, hdr_data_idx, is_pb_hdr); - hdr_data_idx = nc_data_buffer.hdr_data_idx; - } - } - - write_nc_buf_headers(obs_vars); + mlog << Debug(5) << "write_table_vars() is called. valid hdr_typ_tbl_var: " + << !IS_INVALID_NC(hdr_typ_tbl_var) << "\n"; + if (IS_INVALID_NC(hdr_typ_tbl_var)) + mlog << Warning << "\nwrite_table_vars() is called without creating variables\n\n"; + if (!IS_INVALID_NC(hdr_typ_tbl_var)) + write_nc_string_array (&hdr_typ_tbl_var, hdr_data.typ_array, HEADER_STR_LEN2); + if (!IS_INVALID_NC(hdr_sid_tbl_var)) + write_nc_string_array (&hdr_sid_tbl_var, hdr_data.sid_array, HEADER_STR_LEN2); + if (!IS_INVALID_NC(hdr_vld_tbl_var)) + write_nc_string_array (&hdr_vld_tbl_var, hdr_data.vld_array, HEADER_STR_LEN); + if (!IS_INVALID_NC(obs_qty_tbl_var)) + write_nc_string_array (&obs_qty_tbl_var, data_buffer.qty_data_array, HEADER_STR_LEN); } /////////////////////////////////////////////////////////////////////////////// -void write_nc_buf_headers (const NetcdfObsVars &obs_vars) +void NetcdfObsVars::write_obs_buffer(NcDataBuffer &data_buffer, const int buf_size) { - if (0 < nc_data_buffer.hdr_data_idx) { - write_header_to_nc(obs_vars, nc_data_buffer, nc_data_buffer.hdr_data_idx); - } - write_nc_table_vars((NetcdfObsVars &)obs_vars); -} - -/////////////////////////////////////////////////////////////////////////////// + long offsets[2] = { data_buffer.obs_data_offset, 0 }; + long lengths[1] = { buf_size} ; + const string method_name = " write_obs_buffer()"; -void write_nc_header (const NetcdfObsVars &obs_vars, - const char *hdr_typ, const char *hdr_sid, const time_t hdr_vld, - const float hdr_lat, const float hdr_lon, const float hdr_elv) -{ - // Can't filter duplicated one because header index was - // assigned before checking - int hdr_index; - bool new_vld = false; - int hdr_data_idx = nc_data_buffer.hdr_data_idx; - - // Message type - if (!hdr_data.typ_array.has(hdr_typ, hdr_index, false)) { - hdr_index = hdr_data.typ_array.n_elements(); - hdr_data.typ_array.add(hdr_typ); + mlog << Debug(7) << method_name << " offset: " + << offsets[0] << ", " << offsets[1] << " buf_size: " << buf_size << "\n"; + mlog << Debug(7) << " obs_qty_var: " << GET_NC_NAME(obs_qty_var) << "\n"; + + if(!put_nc_data((NcVar *)&obs_qty_var, (int*)data_buffer.qty_idx_buf, lengths, offsets)) { + mlog << Error << "\n" << method_name << " -> " + << "error writing the quality flag to the " + << "netCDF file\n\n"; + exit(1); } - nc_data_buffer.hdr_typ_buf[hdr_data_idx] = hdr_index; - - // Station ID - if (!hdr_data.sid_array.has(hdr_sid, hdr_index, false)) { - hdr_index = hdr_data.sid_array.n_elements(); - hdr_data.sid_array.add(hdr_sid); + if(!put_nc_data((NcVar *)&obs_hid_var, (int*)data_buffer.obs_hid_buf, lengths, offsets)) { + mlog << Error << "\n" << method_name << " -> " + << "error writing the observation header index array to the " + << "netCDF file\n\n"; + exit(1); } - nc_data_buffer.hdr_sid_buf[hdr_data_idx] = hdr_index; - - // Valid Time - if (hdr_data.min_vld_time == -1 || hdr_data.min_vld_time > hdr_vld) { - if (hdr_data.min_vld_time == -1) hdr_data.max_vld_time = hdr_vld; - hdr_data.min_vld_time = hdr_vld; - new_vld = true; + bool use_var_id = !IS_INVALID_NC(obs_vid_var); + bool result = use_var_id + ? put_nc_data((NcVar *)&obs_vid_var, (int*)data_buffer.obs_vid_buf, lengths, offsets) + : put_nc_data((NcVar *)&obs_gc_var, (int*)data_buffer.obs_vid_buf, lengths, offsets); + if(!result) { + mlog << Error << "\n" << method_name << " -> " + << "error writing the observation " + << (use_var_id ? "variable_index" : "grib_code") + << " array to the netCDF file\n\n"; + exit(1); } - else if (hdr_data.max_vld_time < hdr_vld) { - hdr_data.max_vld_time = hdr_vld; - new_vld = true; + if(!put_nc_data((NcVar *)&obs_lvl_var, (float*)data_buffer.obs_lvl_buf, lengths, offsets)) { + mlog << Error << "\n" << method_name << " -> " + << "error writing the observation level array to the " + << "netCDF file\n\n"; + exit(1); } - - if (new_vld || !hdr_data.vld_num_array.has(hdr_vld, hdr_index, false)) { - hdr_index = hdr_data.vld_array.n_elements(); - hdr_data.vld_array.add(unix_to_yyyymmdd_hhmmss(hdr_vld)); - hdr_data.vld_num_array.add(hdr_vld); + if(!put_nc_data((NcVar *)&obs_hgt_var, (float*)data_buffer.obs_hgt_buf, lengths, offsets)) { + mlog << Error << "\n" << method_name << " -> " + << "error writing the observation hight array to the " + << "netCDF file\n\n"; + exit(1); } - nc_data_buffer.hdr_vld_buf[hdr_data_idx] = hdr_index; - - // Write the header array which consists of the following: - // LAT LON ELV - nc_data_buffer.hdr_lat_buf[hdr_data_idx] = (float) hdr_lat; - nc_data_buffer.hdr_lon_buf[hdr_data_idx] = (float) hdr_lon; - nc_data_buffer.hdr_elv_buf[hdr_data_idx] = (float) hdr_elv; - - hdr_data_idx++; - nc_data_buffer.hdr_data_idx = hdr_data_idx; - nc_data_buffer.cur_hdr_idx++; - - if (hdr_data_idx >= OBS_BUFFER_SIZE) { - write_header_to_nc(nc_data_buffer.obs_vars, nc_data_buffer, OBS_BUFFER_SIZE); + if(!put_nc_data((NcVar *)&obs_val_var, (float*)data_buffer.obs_val_buf, lengths, offsets)) { + mlog << Error << "\n" << method_name << " -> " + << "error writing the observation data array to the " + << "netCDF file\n\n"; + exit(1); } + + data_buffer.obs_data_offset += buf_size; + data_buffer.obs_data_idx = 0; +} + +//////////////////////////////////////////////////////////////////////// + +void NetcdfObsVars::write_obs_var_names(StringArray &obs_names) { + write_nc_string_array (&obs_var, obs_names, HEADER_STR_LEN2); +} + +//////////////////////////////////////////////////////////////////////// + +void NetcdfObsVars::write_obs_var_units(StringArray &units) { + write_nc_string_array (&unit_var, units, HEADER_STR_LEN2); +} + +//////////////////////////////////////////////////////////////////////// + +void NetcdfObsVars::write_obs_var_descriptions(StringArray &descriptions) { + write_nc_string_array (&desc_var, descriptions, HEADER_STR_LEN3); } - + +//////////////////////////////////////////////////////////////////////// +// End of NetcdfObsVars + /////////////////////////////////////////////////////////////////////////////// -void write_nc_observation(const NetcdfObsVars &obs_vars) +// struct NcHeaderData + +NcHeaderData::NcHeaderData() { - if (0 < nc_data_buffer.obs_data_idx){ - nc_data_buffer.obs_vars = obs_vars; - write_nc_obs_buffer(nc_data_buffer.obs_data_idx); - } + reset_counters(); } /////////////////////////////////////////////////////////////////////////////// -void write_nc_observation(const NetcdfObsVars &obs_vars, - const float obs_arr[OBS_ARRAY_LEN], const char *obs_qty) -{ - int qty_index; - int obs_data_idx = nc_data_buffer.obs_data_idx; - if (!nc_data_buffer.qty_data_array.has(obs_qty, qty_index, false)) { - qty_index = nc_data_buffer.qty_data_array.n_elements(); - nc_data_buffer.qty_data_array.add(obs_qty); - } - nc_data_buffer.qty_idx_buf[obs_data_idx] = qty_index; - - //for (int idx=0; idx= OBS_BUFFER_SIZE) { - write_nc_obs_buffer(OBS_BUFFER_SIZE); - } +void NcHeaderData::clear() { + reset_counters(); + + typ_array.clear(); + sid_array.clear(); + vld_array.clear(); + vld_num_array.clear(); + typ_idx_array.clear(); + sid_idx_array.clear(); + vld_idx_array.clear(); + lat_array.clear(); + lon_array.clear(); + elv_array.clear(); + prpt_typ_array.clear(); + irpt_typ_array.clear(); + inst_typ_array.clear(); } /////////////////////////////////////////////////////////////////////////////// -void write_nc_table_vars (NetcdfObsVars &obs_vars) +void NcHeaderData::reset_counters() { + valid_point_obs = false; + typ_len = 0; + sid_len = 0; + vld_len = 0; + strl_len = 0; + strll_len = 0; + hdr_count = 0; + + min_vld_time = -1; + max_vld_time = -1; +} + + +/////////////////////////////////////////////////////////////////////////////// + +long count_nc_headers(vector< Observation > &observations) { - mlog << Debug(5) << " write_nc_table_vars() is called. valid hdr_typ_tbl_var: " - << !IS_INVALID_NC(obs_vars.hdr_typ_tbl_var) << "\n"; - if (IS_INVALID_NC(obs_vars.hdr_typ_tbl_var)) - mlog << Warning << "\nwrite_nc_table_vars() is called without creating variables\n\n"; - if (!IS_INVALID_NC(obs_vars.hdr_typ_tbl_var)) - write_nc_string_array (&obs_vars.hdr_typ_tbl_var, hdr_data.typ_array, HEADER_STR_LEN2); - if (!IS_INVALID_NC(obs_vars.hdr_sid_tbl_var)) - write_nc_string_array (&obs_vars.hdr_sid_tbl_var, hdr_data.sid_array, HEADER_STR_LEN2); - if (!IS_INVALID_NC(obs_vars.hdr_vld_tbl_var)) - write_nc_string_array (&obs_vars.hdr_vld_tbl_var, hdr_data.vld_array, HEADER_STR_LEN); - if (!IS_INVALID_NC(obs_vars.obs_qty_tbl_var)) - write_nc_string_array (&obs_vars.obs_qty_tbl_var, nc_data_buffer.qty_data_array, HEADER_STR_LEN); + long nhdr = 0; + + string prev_header_type = ""; + string prev_station_id = ""; + time_t prev_valid_time = 0; + double prev_latitude = bad_data_double; + double prev_longitude = bad_data_double; + double prev_elevation = bad_data_double; + const string method_name = " count_nc_headers()"; + + for (vector< Observation >::iterator obs = observations.begin(); + obs != observations.end(); ++obs) + { + if (obs->getHeaderType() != prev_header_type || + obs->getStationId() != prev_station_id || + obs->getValidTime() != prev_valid_time || + !is_eq(obs->getLatitude(), prev_latitude) || + !is_eq(obs->getLongitude(), prev_longitude) || + !is_eq(obs->getElevation(), prev_elevation)) + { + nhdr++; + + prev_header_type = obs->getHeaderType(); + prev_station_id = obs->getStationId(); + prev_valid_time = obs->getValidTime(); + prev_latitude = obs->getLatitude(); + prev_longitude = obs->getLongitude(); + prev_elevation = obs->getElevation(); + } + obs->setHeaderIndex(nhdr-1); + } /* endfor - obs */ + + return nhdr; +} + + +/////////////////////////////////////////////////////////////////////////////// + +bool is_using_var_id(const char * nc_name) { + bool use_var_id = false; + if (!get_global_att(nc_name, nc_att_use_var_id, use_var_id)) { + use_var_id = false; + } + return use_var_id; +} + +//////////////////////////////////////////////////////////////////////// + +bool is_using_var_id(NcFile *nc_file) { + bool use_var_id = false; + if (!get_global_att(nc_file, nc_att_use_var_id, use_var_id)) { + use_var_id = false; + } + return use_var_id; } /////////////////////////////////////////////////////////////////////////////// int write_nc_string_array (NcVar *ncVar, StringArray &strArray, const int str_len) { - //float obs_arr[obs_arr_len]; const string method_name = " write_nc_string_array() "; int data_count = strArray.n_elements(); int max_buf_size = (1024 * 8); @@ -1278,7 +1380,7 @@ int write_nc_string_array (NcVar *ncVar, StringArray &strArray, const int str_le mlog << Debug(7) << method_name << " " << GET_NC_NAME_P(ncVar) << " data count: " << data_count << "\n"; - + // Initialize data_buf for (int indexX=0; indexX 0) { lengths[0] = (data_count <= max_buf_size) ? data_count : (data_count % buf_size); mlog << Debug(7) << method_name << " Save to NetCDF. offsets: " << offsets[0] @@ -1330,169 +1432,4 @@ int write_nc_string_array (NcVar *ncVar, StringArray &strArray, const int str_le return processed_count; } -/////////////////////////////////////////////////////////////////////////////// - -void write_nc_obs_buffer(const int buf_size) -{ - const NetcdfObsVars &obs_vars = nc_data_buffer.obs_vars; - long offsets[2] = { nc_data_buffer.obs_data_offset, 0 }; - long lengths[1] = { buf_size} ; - const string method_name = " write_nc_obs_buffer()"; - - mlog << Debug(7) << method_name << " offset: " - << offsets[0] << ", " << offsets[1] << " buf_size: " << buf_size << "\n"; - mlog << Debug(7) << " obs_qty_var: " << GET_NC_NAME(obs_vars.obs_qty_var) << "\n"; - - //lengths[1] = HEADER_STR_LEN; - if(!put_nc_data((NcVar *)&obs_vars.obs_qty_var, (int*)nc_data_buffer.qty_idx_buf, lengths, offsets)) { - mlog << Error << "\n" << method_name << " -> " - << "error writing the quality flag to the " - << "netCDF file\n\n"; - exit(1); - } - //lengths[1] = OBS_ARRAY_LEN; - if(!put_nc_data((NcVar *)&obs_vars.obs_hid_var, (int*)nc_data_buffer.obs_hid_buf, lengths, offsets)) { - mlog << Error << "\n" << method_name << " -> " - << "error writing the observation header index array to the " - << "netCDF file\n\n"; - exit(1); - } - bool use_var_id = !IS_INVALID_NC(obs_vars.obs_vid_var); - bool result = use_var_id - ? put_nc_data((NcVar *)&obs_vars.obs_vid_var, (int*)nc_data_buffer.obs_vid_buf, lengths, offsets) - : put_nc_data((NcVar *)&obs_vars.obs_gc_var, (int*)nc_data_buffer.obs_vid_buf, lengths, offsets); - if(!result) { - mlog << Error << "\n" << method_name << " -> " - << "error writing the observation " - << (use_var_id ? "variable_index" : "grib_code") - << " array to the netCDF file\n\n"; - exit(1); - } - if(!put_nc_data((NcVar *)&obs_vars.obs_lvl_var, (float*)nc_data_buffer.obs_lvl_buf, lengths, offsets)) { - mlog << Error << "\n" << method_name << " -> " - << "error writing the observation level array to the " - << "netCDF file\n\n"; - exit(1); - } - if(!put_nc_data((NcVar *)&obs_vars.obs_hgt_var, (float*)nc_data_buffer.obs_hgt_buf, lengths, offsets)) { - mlog << Error << "\n" << method_name << " -> " - << "error writing the observation hight array to the " - << "netCDF file\n\n"; - exit(1); - } - if(!put_nc_data((NcVar *)&obs_vars.obs_val_var, (float*)nc_data_buffer.obs_val_buf, lengths, offsets)) { - mlog << Error << "\n" << method_name << " -> " - << "error writing the observation data array to the " - << "netCDF file\n\n"; - exit(1); - } - - nc_data_buffer.obs_data_offset += buf_size; - nc_data_buffer.obs_data_idx = 0; -} - -/////////////////////////////////////////////////////////////////////////////// - -int write_nc_observations(const NetcdfObsVars &obs_vars, - const vector< Observation > observations, - const bool use_var_id, const bool do_header) -{ - int prev_hdr_idx = -1; - string prev_header_type = ""; - string prev_station_id = ""; - ConcatString obs_qty; - int headerOffset = nc_data_buffer.cur_hdr_idx; - //float obs_arr[obs_arr_len]; - const string method_name = " write_nc_observations()"; - - int obs_buf_size = observations.size(); - mlog << Debug(7) << method_name << " obs_count: " << obs_buf_size << "\n"; - if (obs_buf_size > OBS_BUFFER_SIZE) obs_buf_size = OBS_BUFFER_SIZE; - - //if (reset) { - // nc_data_buffer.obs_vars = obs_vars; - // nc_data_buffer.obs_buf_size = obs_buf_size; - // nc_data_buffer.obs_data_idx = 0; - // nc_data_buffer.obs_data_offset = 0; - // nc_data_buffer.hdr_data_idx = 0; - // nc_data_buffer.hdr_data_offset = 0; - // - // nc_data_buffer.processed_count =0; - //} - float obs_arr[OBS_ARRAY_LEN]; - bool header_to_vector = IS_INVALID_NC(obs_vars.hdr_arr_var) - || IS_INVALID_NC(obs_vars.hdr_lat_var); - mlog << Debug(5) << method_name << " do_header: " << do_header - << " header_to_vector: " << header_to_vector << "\n"; - for (vector< Observation >::const_iterator obs = observations.begin(); - obs != observations.end(); ++obs) - { - nc_data_buffer.processed_count++; - - if (do_header) { - if (obs->getHeaderIndex() != prev_hdr_idx) { - mlog << Debug(9) << method_name << " obs->getHeaderIndex(): " - << obs->getHeaderIndex() << " at obs " << nc_data_buffer.processed_count << "\n"; - prev_hdr_idx = obs->getHeaderIndex(); - if (header_to_vector) { - add_nc_header_to_array( - obs->getHeaderType().c_str(), - obs->getStationId().c_str(), - obs->getValidTime(), - obs->getLatitude(), - obs->getLongitude(), - obs->getElevation()); - } - else { - write_nc_header( - obs_vars, - obs->getHeaderType().c_str(), - obs->getStationId().c_str(), - obs->getValidTime(), - obs->getLatitude(), - obs->getLongitude(), - obs->getElevation()); - } - } - } - - obs_arr[0] = obs->getHeaderIndex(); - obs_arr[1] = (use_var_id ? obs->getVarCode() : obs->getGribCode()); - obs_arr[2] = obs->getPressureLevel(); - obs_arr[3] = obs->getHeight(); - obs_arr[4] = obs->getValue(); - obs_qty = (obs->getQualityFlag().length() == 0 ? na_str : obs->getQualityFlag().c_str()); - if (do_header) obs_arr[0] += headerOffset; - - write_nc_observation(obs_vars, obs_arr, obs_qty.text()); - - } /* endfor - obs */ - - if (nc_data_buffer.obs_data_idx > 0) { - write_nc_obs_buffer(nc_data_buffer.obs_data_idx); - } - - //Caller handles writing headers - - return nc_data_buffer.processed_count; -} - -//////////////////////////////////////////////////////////////////////// - -void write_obs_var_names(NetcdfObsVars &obs_vars, StringArray &obs_names) { - write_nc_string_array (&obs_vars.obs_var, obs_names, HEADER_STR_LEN2); -} - -//////////////////////////////////////////////////////////////////////// - -void write_obs_var_units(NetcdfObsVars &obs_vars, StringArray &units) { - write_nc_string_array (&obs_vars.unit_var, units, HEADER_STR_LEN2); -} - -//////////////////////////////////////////////////////////////////////// - -void write_obs_var_descriptions(NetcdfObsVars &obs_vars, StringArray &descriptions) { - write_nc_string_array (&obs_vars.desc_var, descriptions, HEADER_STR_LEN3); -} - //////////////////////////////////////////////////////////////////////// diff --git a/met/src/libcode/vx_nc_obs/nc_obs_util.h b/met/src/libcode/vx_nc_obs/nc_obs_util.h index 58c5748e24..4985639c09 100644 --- a/met/src/libcode/vx_nc_obs/nc_obs_util.h +++ b/met/src/libcode/vx_nc_obs/nc_obs_util.h @@ -16,9 +16,101 @@ #include using namespace netCDF; +#include "nc_summary.h" + +//////////////////////////////////////////////////////////////////////// + + +static const char empty_name[] = ""; + + //////////////////////////////////////////////////////////////////////// // struct definition +struct NcDataBuffer { + int processed_count; + int obs_count; + int obs_buf_size; + int cur_obs_idx; + int obs_data_idx; + int obs_data_offset; + int hdr_count; + int hdr_buf_size; + int cur_hdr_idx; + int hdr_data_idx; + int hdr_data_offset; + int pb_hdr_count; + int pb_hdr_data_offset; + + int prev_hdr_vld; + char prev_hdr_typ_buf[HEADER_STR_LEN2]; + char prev_hdr_sid_buf[HEADER_STR_LEN2]; + char prev_hdr_vld_buf[HEADER_STR_LEN]; + float prev_hdr_arr_buf[HDR_ARRAY_LEN]; + + char hdr_typ_str_buf[OBS_BUFFER_SIZE][HEADER_STR_LEN2]; + char hdr_sid_str_buf[OBS_BUFFER_SIZE][HEADER_STR_LEN2]; + char hdr_vld_str_buf[OBS_BUFFER_SIZE][HEADER_STR_LEN]; + float hdr_arr_buf[OBS_BUFFER_SIZE][HDR_ARRAY_LEN]; + float obs_data_buf[OBS_BUFFER_SIZE][OBS_ARRAY_LEN]; + char qty_data_buf[OBS_BUFFER_SIZE][HEADER_STR_LEN]; + + StringArray qty_data_array; + int hdr_typ_buf[OBS_BUFFER_SIZE]; + int hdr_sid_buf[OBS_BUFFER_SIZE]; + int hdr_vld_buf[OBS_BUFFER_SIZE]; + float hdr_lat_buf[OBS_BUFFER_SIZE]; + float hdr_lon_buf[OBS_BUFFER_SIZE]; + float hdr_elv_buf[OBS_BUFFER_SIZE]; + int hdr_prpt_typ_buf[OBS_BUFFER_SIZE]; + int hdr_irpt_typ_buf[OBS_BUFFER_SIZE]; + int hdr_inst_typ_buf[OBS_BUFFER_SIZE]; + int obs_hid_buf[OBS_BUFFER_SIZE]; + int obs_vid_buf[OBS_BUFFER_SIZE]; + int qty_idx_buf[OBS_BUFFER_SIZE]; + float obs_lvl_buf[OBS_BUFFER_SIZE]; + float obs_hgt_buf[OBS_BUFFER_SIZE]; + float obs_val_buf[OBS_BUFFER_SIZE]; + + NcDataBuffer(); + void reset_counters(); +}; + +//////////////////////////////////////////////////////////////////////// + +struct NcHeaderData { + bool valid_point_obs; + int typ_len; + int sid_len; + int vld_len; + int strl_len; + int strll_len; + int min_vld_time; + int max_vld_time; + int hdr_count; + int hdr_type_count; + + StringArray typ_array; + StringArray sid_array; + StringArray vld_array; + IntArray vld_num_array; + IntArray typ_idx_array; + IntArray sid_idx_array; + IntArray vld_idx_array; + NumArray lat_array; + NumArray lon_array; + NumArray elv_array; + IntArray prpt_typ_array; + IntArray irpt_typ_array; + IntArray inst_typ_array; + + NcHeaderData(); + void clear(); + void reset_counters(); +}; + +//////////////////////////////////////////////////////////////////////// + struct NetcdfObsVars { bool attr_agl ; bool attr_pb2nc ; @@ -26,7 +118,8 @@ struct NetcdfObsVars { int hdr_cnt ; // header array count (fixed dimension if hdr_cnt > 0) int obs_cnt ; // obs. array count (fixed dimension if obs_cnt > 0) int raw_hdr_cnt ; // raw data (PrepBufr) header array count - + int deflate_level; + NcDim strl_dim ; // header string dimension (16 bytes) NcDim strl2_dim ; // header string dimension (40 bytes) NcDim strl3_dim ; // header string dimension (80 bytes) @@ -38,7 +131,7 @@ struct NetcdfObsVars { NcDim obs_dim ; // Observation array length (V1.0) NcDim hdr_dim ; // Header array length (V1.0) NcDim pb_hdr_dim ; // PrefBufr Header array length (V1.2) - + NcVar hdr_typ_tbl_var ; // Message type (string) (V1.1) NcVar hdr_sid_tbl_var ; // Station ID (string) (V1.1) NcVar hdr_vld_tbl_var ; // Valid time (string) (V1.1) @@ -65,155 +158,87 @@ struct NetcdfObsVars { NcVar obs_var ; // Observation variable name (V1.1) NcVar unit_var ; // The unit of the observation variable (V1.1) NcVar desc_var ; // The description of the observation variable (V1.1) -}; -struct NcHeaderData { - int typ_len; - int sid_len; - int vld_len; - int strl_len; - int strll_len; - int min_vld_time; - int max_vld_time; - - StringArray typ_array; - StringArray sid_array; - StringArray vld_array; - IntArray vld_num_array; - IntArray typ_idx_array; - IntArray sid_idx_array; - IntArray vld_idx_array; - NumArray lat_array; - NumArray lon_array; - NumArray elv_array; - IntArray prpt_typ_array; - IntArray irpt_typ_array; - IntArray inst_typ_array; -}; + NetcdfObsVars(); + bool is_valid(bool exit_on_error=false); + void reset(bool _use_var_id = true); -struct NcDataBuffer { - NetcdfObsVars obs_vars; - int processed_count; - int obs_count; - int obs_buf_size; - int cur_obs_idx; - int obs_data_idx; - int obs_data_offset; - int hdr_count; - int hdr_buf_size; - int cur_hdr_idx; - int hdr_data_idx; - int hdr_data_offset; - int pb_hdr_count; - int pb_hdr_data_offset; + void create_dimensions(NcFile *f_out); + void create_hdr_vars (NcFile *f_out, const int hdr_count); + void create_obs_vars (NcFile *f_out); + void create_obs_name_vars (NcFile *f_out, const int var_count, const int unit_count); + void create_table_vars (NcFile *f_out, NcHeaderData &hdr_data, NcDataBuffer &data_buffer); + void create_pb_hdrs (NcFile *f_out, const int hdr_count); + NcDim create_var_obs_var (NcFile *f_out, int var_count); - int prev_hdr_vld; - char prev_hdr_typ_buf[HEADER_STR_LEN2]; - char prev_hdr_sid_buf[HEADER_STR_LEN2]; - char prev_hdr_vld_buf[HEADER_STR_LEN]; - float prev_hdr_arr_buf[HDR_ARRAY_LEN]; + int get_hdr_index(); + int get_obs_index(); + + void read_dims_vars(NcFile *f_in); + void read_header_data(NcHeaderData &hdr_data); + bool read_obs_data(int buf_size, int offset, int qty_len, float *obs_arr, + int *qty_idx_arr, char *obs_qty_buf); + void read_pb_hdr_data(NcHeaderData &hdr_data); + + void write_header_to_nc(NcDataBuffer &data_buf, const int buf_size, const bool is_pb = false); + void write_obs_buffer(NcDataBuffer &data_buffer, const int buf_size); + void write_obs_var_names(StringArray &obs_names); + void write_obs_var_units(StringArray &units); + void write_obs_var_descriptions(StringArray &descriptions); + void write_table_vars(NcHeaderData &hdr_data, NcDataBuffer &data_buffer); + +}; // NetcdfObsVars + +//////////////////////////////////////////////////////////////////////// + +struct NcPointObsData { + int obs_cnt; + bool is_obs_array; - char hdr_typ_str_buf[OBS_BUFFER_SIZE][HEADER_STR_LEN2]; - char hdr_sid_str_buf[OBS_BUFFER_SIZE][HEADER_STR_LEN2]; - char hdr_vld_str_buf[OBS_BUFFER_SIZE][HEADER_STR_LEN]; - float hdr_arr_buf[OBS_BUFFER_SIZE][HDR_ARRAY_LEN]; - float obs_data_buf[OBS_BUFFER_SIZE][OBS_ARRAY_LEN]; - char qty_data_buf[OBS_BUFFER_SIZE][HEADER_STR_LEN]; + int *obs_ids; // grib_code or var_id + int *obs_hids; + int *obs_qids; + float *obs_lvls; + float *obs_hgts; + float *obs_vals; + float *obs_arr; // nobs * 5 + StringArray var_names; + StringArray qty_names; - StringArray qty_data_array; - int hdr_typ_buf[OBS_BUFFER_SIZE]; - int hdr_sid_buf[OBS_BUFFER_SIZE]; - int hdr_vld_buf[OBS_BUFFER_SIZE]; - float hdr_lat_buf[OBS_BUFFER_SIZE]; - float hdr_lon_buf[OBS_BUFFER_SIZE]; - float hdr_elv_buf[OBS_BUFFER_SIZE]; - int hdr_prpt_typ_buf[OBS_BUFFER_SIZE]; - int hdr_irpt_typ_buf[OBS_BUFFER_SIZE]; - int hdr_inst_typ_buf[OBS_BUFFER_SIZE]; - int obs_hid_buf[OBS_BUFFER_SIZE]; - int obs_vid_buf[OBS_BUFFER_SIZE]; - int qty_idx_buf[OBS_BUFFER_SIZE]; - float obs_lvl_buf[OBS_BUFFER_SIZE]; - float obs_hgt_buf[OBS_BUFFER_SIZE]; - float obs_val_buf[OBS_BUFFER_SIZE]; + NcPointObsData(); + void clear(); + void clear_numbers(); + void clear_strings(); + float get_obs_val(int index); + bool read_obs_data_numbers(NetcdfObsVars obs_vars, bool stop=true); + bool read_obs_data_table_lookups(NetcdfObsVars obs_vars, bool stop=true); }; //////////////////////////////////////////////////////////////////////// + // extern variables //////////////////////////////////////////////////////////////////////// -extern bool add_nc_header_to_array - (const char *hdr_typ, const char *hdr_sid, const time_t hdr_vld, - const float hdr_lat, const float hdr_lon, const float hdr_elv); extern bool add_nc_header_prepbufr (const int pb_report_type, - const int in_report_type, const int instrument_type); -//extern bool is_same_header -// (const char *hdr_typ, const char *hdr_sid, const unixtime hdr_vld, -// const float hdr_lat, const float hdr_lon, const float hdr_elv); -//extern bool is_same_header -// (const char *hdr_typ, const char *hdr_sid, const char *hdr_vld, -// const float hdr_lat, const float hdr_lon, const float hdr_elv); + const int in_report_type, const int instrument_type); -extern int check_nc_dims_vars(const NetcdfObsVars obs_vars); - -extern void clear_header_data(NcHeaderData *); - extern long count_nc_headers (vector< Observation > &observations); -extern void create_nc_hdr_vars (NetcdfObsVars &, NcFile *, const int hdr_count, const int deflate_level=0); -extern void create_nc_name_vars(NetcdfObsVars &, NcFile *, const int var_count = 0, - const int unit_count=0, const int deflate_level=0); -extern void create_nc_obs_name_vars(NetcdfObsVars &, NcFile *, - const int var_count, const int unit_count, const int deflate_level=0); -extern NcDim create_nc_obs_var_var(NetcdfObsVars &, NcFile *, int var_count, const int deflate_level); -extern void create_nc_obs_vars (NetcdfObsVars &, NcFile *, const int deflate_level=0, const bool use_var_id=true); -extern void create_nc_table_vars(NetcdfObsVars &, NcFile *, const int deflate_level=0); - -extern void create_nc_pb_hdrs (NetcdfObsVars &, NcFile *, const int hdr_count, const int deflate_level=0); - -extern NcDataBuffer *get_nc_data_buffer(); -extern NcHeaderData *get_hdr_data_buffer(); - extern int get_nc_hdr_cur_index(); extern int get_nc_obs_buf_index(); -extern NcHeaderData get_nc_hdr_data(NetcdfObsVars obs_vars); -extern void get_nc_pb_hdr_data (NetcdfObsVars obs_vars, NcHeaderData *header_data); - -extern void init_nc_dims_vars_config(NetcdfObsVars &, bool use_var_id = true); extern bool is_using_var_id (const char * nc_name); - -extern void nc_obs_initialize (); - -extern bool read_nc_obs_data(NetcdfObsVars obs_vars, int buf_size, int offset, - int qty_len, float *obs_arr, int *qty_idx_arr, char *obs_qty_buf); - -extern void read_nc_dims_vars (NetcdfObsVars &, NcFile *); +extern bool is_using_var_id (NcFile * nc_file); extern void reset_header_buffer(int buf_size, bool reset_all=false); -extern void set_header_buffer(int buf_size, bool reset_all=false); +extern void set_header_buffer (int buf_size, bool reset_all=false); -extern void write_header_to_nc (const NetcdfObsVars &, NcDataBuffer &data_buf, - const int buf_size, const bool is_pb = false); +extern string seconds_to_time_string(const int secs); -extern void write_nc_table_vars (NetcdfObsVars &); -extern void write_nc_arr_headers (const NetcdfObsVars &); -extern void write_nc_buf_headers (const NetcdfObsVars &); -extern void write_nc_header (const NetcdfObsVars &, - const char *hdr_typ, const char *hdr_sid, const time_t hdr_vld, - const float hdr_lat, const float hdr_lon, const float hdr_elv); extern void write_nc_obs_buffer (const int buf_size); -extern int write_nc_observations (const NetcdfObsVars &, const vector< Observation > observations, - const bool use_var_idx = true, const bool do_header = true); -extern void write_nc_observation (const NetcdfObsVars &, - const float obs_arr[OBS_ARRAY_LEN], const char *obs_qty); -extern void write_nc_observation (const NetcdfObsVars &); -extern int write_nc_string_array (NcVar *ncVar, StringArray &strArray, const int str_len); - -extern void write_obs_var_names(NetcdfObsVars &, StringArray &); -extern void write_obs_var_units(NetcdfObsVars &, StringArray &); -extern void write_obs_var_descriptions(NetcdfObsVars &, StringArray &); +extern int write_nc_string_array (NcVar *ncVar, StringArray &strArray, + const int str_len); #endif /* __NC_OBS_UTIL_H__ */ diff --git a/met/src/libcode/vx_nc_obs/nc_point_obs.cc b/met/src/libcode/vx_nc_obs/nc_point_obs.cc new file mode 100644 index 0000000000..b665e9d2e9 --- /dev/null +++ b/met/src/libcode/vx_nc_obs/nc_point_obs.cc @@ -0,0 +1,167 @@ +// *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +// ** Copyright UCAR (c) 1992 - 2021 +// ** University Corporation for Atmospheric Research (UCAR) +// ** National Center for Atmospheric Research (NCAR) +// ** Research Applications Lab (RAL) +// ** P.O.Box 3000, Boulder, Colorado, 80307-3000, USA +// *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* + + +//////////////////////////////////////////////////////////////////////// + + +using namespace std; + +#include +#include +#include +#include +#include +#include +#include + +#include "vx_log.h" +#include "is_bad_data.h" + +#include "nc_point_obs.h" + +//////////////////////////////////////////////////////////////////////// + + + // + // Code for class MetNcPointObs + // + + +//////////////////////////////////////////////////////////////////////// + +MetNcPointObs::MetNcPointObs() { + init_from_scratch(); +} + +//////////////////////////////////////////////////////////////////////// + +MetNcPointObs::~MetNcPointObs() { + close(); +} + +//////////////////////////////////////////////////////////////////////// + +void MetNcPointObs::init_from_scratch() { + obs_nc = (NcFile *) 0; + + nobs = 0; + nhdr = 0; + qty_length = 0; + keep_nc = false; + use_var_id = false; + use_arr_vars = false; + + return; +} + +//////////////////////////////////////////////////////////////////////// + +void MetNcPointObs::close() { + if ( !keep_nc && obs_nc ) { + delete obs_nc; + obs_nc = (NcFile *) 0; + } + + obs_data.clear(); + header_data.clear(); + return; +} + +//////////////////////////////////////////////////////////////////////// + +int MetNcPointObs::get_qty_length() { + qty_length = get_nc_string_length(&obs_vars.obs_qty_tbl_var); + return qty_length; +} + +//////////////////////////////////////////////////////////////////////// + +bool MetNcPointObs::get_header(int header_offset, float hdr_arr[HDR_ARRAY_LEN], + ConcatString &hdr_typ_str, ConcatString &hdr_sid_str, ConcatString &hdr_vld_str) { + int hdr_idx; + + // Read the corresponding header array for this observation + hdr_arr[0] = header_data.lat_array[header_offset]; + hdr_arr[1] = header_data.lon_array[header_offset]; + hdr_arr[2] = header_data.elv_array[header_offset]; + + // Read the corresponding header type for this observation + hdr_idx = use_arr_vars ? header_offset : header_data.typ_idx_array[header_offset]; + hdr_typ_str = header_data.typ_array[hdr_idx]; + + // Read the corresponding header Station ID for this observation + hdr_idx = use_arr_vars ? header_offset : header_data.sid_idx_array[header_offset]; + hdr_sid_str = header_data.sid_array[hdr_idx]; + + // Read the corresponding valid time for this observation + hdr_idx = use_arr_vars ? header_offset : header_data.vld_idx_array[header_offset]; + hdr_vld_str = header_data.vld_array[hdr_idx]; + + return true; +} + +//////////////////////////////////////////////////////////////////////// + +bool MetNcPointObs::get_header_type(int header_offset, int hdr_typ_arr[HDR_TYPE_ARR_LEN]) { + int hdr_idx; + // Read the header integer types + hdr_typ_arr[0] = (header_data.prpt_typ_array.n() > header_offset ? + header_data.prpt_typ_array[header_offset] : bad_data_int); + hdr_typ_arr[1] = (header_data.irpt_typ_array.n() > header_offset ? + header_data.irpt_typ_array[header_offset] : bad_data_int); + hdr_typ_arr[2] = (header_data.inst_typ_array.n() > header_offset ? + header_data.inst_typ_array[header_offset] : bad_data_int); + + return true; +} + +//////////////////////////////////////////////////////////////////////// + +bool MetNcPointObs::get_lats(float *hdr_lats) { + for (int idx=0; idx + +#include "observation.h" +#include "nc_utils.h" +#include "nc_obs_util.h" +#include "nc_var_info.h" +#include "vx_summary.h" + + +//////////////////////////////////////////////////////////////////////// + + +class MetNcPointObs { + + protected: + + int nobs; + int nhdr; + int qty_length; + bool keep_nc; + bool use_var_id; + bool use_arr_vars; + NcFile *obs_nc; // allocated + + NetcdfObsVars obs_vars; + NcPointObsData obs_data; + NcHeaderData header_data; + + void init_from_scratch(); + + public: + + MetNcPointObs(); + ~MetNcPointObs(); + + bool open(const char * filename); + void close(); + bool set_netcdf(NcFile *nc_file, bool _keep_nc=false); + + int get_buf_size(); + int get_hdr_cnt(); + int get_grib_code_or_var_index(const float obs_arr[OBS_ARRAY_LEN]); + NcHeaderData get_header_data(); + bool get_header(int header_offset, float hdr_arr[HDR_ARRAY_LEN], + ConcatString &hdr_typ_str, ConcatString &hdr_sid_str, + ConcatString &hdr_vld_str); + int get_header_offset(const float obs_arr[OBS_ARRAY_LEN]); + bool get_header_type(int header_offset, int hdr_typ_arr[HDR_TYPE_ARR_LEN]); + bool get_lats(float *hdr_lats); + bool get_lons(float *hdr_lons); + int get_obs_cnt(); + NcPointObsData get_point_obs_data(); + StringArray get_qty_data(); + int get_qty_length(); + StringArray get_var_names(); + + bool is_same_obs_values(const float obs_arr1[OBS_ARRAY_LEN], const float obs_arr2[OBS_ARRAY_LEN]); + bool is_using_var_id(); + bool is_using_obs_arr(); + + void set_grib_code_or_var_index(float obs_arr[OBS_ARRAY_LEN], int grib_code); + // variables + + // data + +}; // MetNcPointObs + +//////////////////////////////////////////////////////////////////////// + +inline NcHeaderData MetNcPointObs::get_header_data() { return header_data; } +inline int MetNcPointObs::get_buf_size() { return OBS_BUFFER_SIZE; } +inline int MetNcPointObs::get_grib_code_or_var_index(const float obs_arr[OBS_ARRAY_LEN]) { return obs_arr[1]; }; +inline int MetNcPointObs::get_hdr_cnt() { return nhdr; } +inline int MetNcPointObs::get_header_offset(const float obs_arr[OBS_ARRAY_LEN]) { return obs_arr[0]; }; +inline int MetNcPointObs::get_obs_cnt() { return nobs; } +inline NcPointObsData MetNcPointObs::get_point_obs_data() { return obs_data; } +inline StringArray MetNcPointObs::get_qty_data() { return obs_data.qty_names; } +inline StringArray MetNcPointObs::get_var_names() { return obs_data.var_names; } +inline bool MetNcPointObs::is_using_obs_arr() { return use_arr_vars; } +inline bool MetNcPointObs::is_using_var_id() { return use_var_id; } +inline void MetNcPointObs::set_grib_code_or_var_index(float obs_arr[OBS_ARRAY_LEN], int grib_code) { obs_arr[1] = grib_code; } + +//////////////////////////////////////////////////////////////////////// + + +#endif /* __NC_POINT_OBS_H__ */ + + +//////////////////////////////////////////////////////////////////////// + diff --git a/met/src/libcode/vx_nc_obs/nc_point_obs_in.cc b/met/src/libcode/vx_nc_obs/nc_point_obs_in.cc new file mode 100644 index 0000000000..3345edb5a7 --- /dev/null +++ b/met/src/libcode/vx_nc_obs/nc_point_obs_in.cc @@ -0,0 +1,113 @@ +// *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +// ** Copyright UCAR (c) 1992 - 2021 +// ** University Corporation for Atmospheric Research (UCAR) +// ** National Center for Atmospheric Research (NCAR) +// ** Research Applications Lab (RAL) +// ** P.O.Box 3000, Boulder, Colorado, 80307-3000, USA +// *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* + + +//////////////////////////////////////////////////////////////////////// + + +using namespace std; + +#include +#include +#include +#include +#include +#include +#include + +#include "vx_log.h" + +#include "nc_point_obs_in.h" + +//////////////////////////////////////////////////////////////////////// + + + // + // Code for class MetNcPointObs + // + + +//////////////////////////////////////////////////////////////////////// + +MetNcPointObsIn::MetNcPointObsIn() { + init_from_scratch(); +} + +//////////////////////////////////////////////////////////////////////// + +MetNcPointObsIn::~MetNcPointObsIn() { + close(); +} + +//////////////////////////////////////////////////////////////////////// + +bool MetNcPointObsIn::check_nc(const char *nc_name, const char *caller) { + bool exit_on_error = false; + bool valid = obs_vars.is_valid(exit_on_error); + if (!valid) { + mlog << Error << "\n" << (0 != caller ? caller : "") << " -> " + << "missing core data from the netCDF file: " + << nc_name << "\n\n"; + exit(1); + } + return valid; +} + +//////////////////////////////////////////////////////////////////////// + +bool MetNcPointObsIn::read_dim_headers() { + bool status = false; + if( IS_VALID_NC_P(obs_nc) ) { + status = true; + obs_vars.read_dims_vars(obs_nc); + nobs = obs_vars.obs_cnt = GET_NC_SIZE(obs_vars.obs_dim); + nhdr = obs_vars.hdr_cnt = GET_NC_SIZE(obs_vars.hdr_dim); + obs_vars.use_var_id = use_var_id = IS_VALID_NC(obs_vars.obs_vid_var); + use_arr_vars = IS_VALID_NC(obs_vars.obs_arr_var); + obs_vars.read_header_data(header_data); + } + return status; +} + +////////////////////////////////////////////////////////////////////// + +bool MetNcPointObsIn::read_obs_data() { + bool status = read_obs_data_numbers() && read_obs_data_table_lookups(); + return status; +} + +//////////////////////////////////////////////////////////////////////// + +bool MetNcPointObsIn::read_obs_data(int buf_size, int start, float *obs_arr_block, + int *obs_qty_idx_block, char *obs_qty_str_block) { + return obs_vars.read_obs_data(buf_size, start, qty_length, obs_arr_block, + obs_qty_idx_block, obs_qty_str_block); +} + +//////////////////////////////////////////////////////////////////////// + +bool MetNcPointObsIn::read_obs_data_numbers() { + bool status = false; + if( IS_VALID_NC_P(obs_nc) ) { + status = obs_data.read_obs_data_numbers(obs_vars); + } + return status; +} + +//////////////////////////////////////////////////////////////////////// + +bool MetNcPointObsIn::read_obs_data_table_lookups() { + bool status = false; + if( IS_VALID_NC_P(obs_nc) ) { + status = obs_data.read_obs_data_table_lookups(obs_vars); + } + return status; +} + +//////////////////////////////////////////////////////////////////////// + diff --git a/met/src/libcode/vx_nc_obs/nc_point_obs_in.h b/met/src/libcode/vx_nc_obs/nc_point_obs_in.h new file mode 100644 index 0000000000..aa55ebcd8f --- /dev/null +++ b/met/src/libcode/vx_nc_obs/nc_point_obs_in.h @@ -0,0 +1,58 @@ +// *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +// ** Copyright UCAR (c) 1992 - 2021 +// ** University Corporation for Atmospheric Research (UCAR) +// ** National Center for Atmospheric Research (NCAR) +// ** Research Applications Lab (RAL) +// ** P.O.Box 3000, Boulder, Colorado, 80307-3000, USA +// *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* + + +//////////////////////////////////////////////////////////////////////// + +#ifndef __NC_POINT_OBS_IN_H__ +#define __NC_POINT_OBS_IN_H__ + +//////////////////////////////////////////////////////////////////////// + + +#include + +#include "observation.h" +#include "nc_utils.h" +#include "nc_obs_util.h" +#include "nc_var_info.h" +#include "nc_point_obs.h" + + +//////////////////////////////////////////////////////////////////////// + + +class MetNcPointObsIn : public MetNcPointObs { + + public: + + MetNcPointObsIn(); + ~MetNcPointObsIn(); + + bool check_nc(const char *nc_name, const char *caller=empty_name); + bool read_dim_headers(); + bool read_obs_data(); + bool read_obs_data(int buf_size, int start, float *obs_arr_block, + int *obs_qty_idx_block, char *obs_qty_str_block); + bool read_obs_data_numbers(); + bool read_obs_data_table_lookups(); + + // variables + + // data + +}; // MetNcPointObs + +//////////////////////////////////////////////////////////////////////// + + +#endif /* __NC_POINT_OBS_IN_H__ */ + + +//////////////////////////////////////////////////////////////////////// + diff --git a/met/src/libcode/vx_nc_obs/nc_point_obs_out.cc b/met/src/libcode/vx_nc_obs/nc_point_obs_out.cc new file mode 100644 index 0000000000..b758df0093 --- /dev/null +++ b/met/src/libcode/vx_nc_obs/nc_point_obs_out.cc @@ -0,0 +1,607 @@ +// *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +// ** Copyright UCAR (c) 1992 - 2021 +// ** University Corporation for Atmospheric Research (UCAR) +// ** National Center for Atmospheric Research (NCAR) +// ** Research Applications Lab (RAL) +// ** P.O.Box 3000, Boulder, Colorado, 80307-3000, USA +// *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* + + +//////////////////////////////////////////////////////////////////////// + + +using namespace std; + +#include +#include +#include + +#include "vx_log.h" + +#include "nc_point_obs_out.h" +#include "nc_summary.h" +#include "write_netcdf.h" + +//////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////// + + + // + // Code for class MetNcPointObsOut + // + +//////////////////////////////////////////////////////////////////////// + +MetNcPointObsOut::MetNcPointObsOut() { + init_from_scratch(); +} + +//////////////////////////////////////////////////////////////////////// + +MetNcPointObsOut::~MetNcPointObsOut() { + close(); +} + +//////////////////////////////////////////////////////////////////////// + +void MetNcPointObsOut::init_from_scratch() { + MetNcPointObs::init_from_scratch(); + raw_hdr_cnt = 0; + reset_hdr_buffer = false; +} + +bool MetNcPointObsOut::add_header(const char *hdr_typ, const char *hdr_sid, + const time_t hdr_vld, const float hdr_lat, + const float hdr_lon, const float hdr_elv) +{ + bool added = false; + bool new_vld = false; + const char *method_name = "MetNcPointObsOut::add_header() "; + + // Can't filter duplicated one because header index was + // assigned before checking + int hdr_index; + add_header_strings(hdr_typ, hdr_sid); + + if (header_data.min_vld_time == -1 || header_data.min_vld_time > hdr_vld) { + if (header_data.min_vld_time == -1) header_data.max_vld_time = hdr_vld; + header_data.min_vld_time = hdr_vld; + new_vld = true; + } + else if (header_data.max_vld_time < hdr_vld) { + header_data.max_vld_time = hdr_vld; + new_vld = true; + } + if (new_vld || !header_data.vld_num_array.has(hdr_vld, hdr_index, false)) { + hdr_index = header_data.vld_array.n_elements(); + header_data.vld_array.add(unix_to_yyyymmdd_hhmmss(hdr_vld)); // Valid time + header_data.vld_num_array.add(hdr_vld); // Valid time + } + header_data.vld_idx_array.add(hdr_index); // Index of Valid time + + header_data.lat_array.add(hdr_lat); // Latitude + header_data.lon_array.add(hdr_lon); // Longitude + header_data.elv_array.add(hdr_elv); // Elevation + data_buffer.cur_hdr_idx++; + mlog << Debug(9) << method_name << "header is added (cur_hdr_idx=" + << data_buffer.cur_hdr_idx << ", obs_idx=" << data_buffer.cur_obs_idx << ")\n"; + added = true; + return added; +} + +/////////////////////////////////////////////////////////////////////////////// + +bool MetNcPointObsOut::add_header_prepbufr(const int pb_report_type, + const int in_report_type, + const int instrument_type) +{ + bool added = true; + const char *method_name = "add_header_prepbufr() "; + // Can't filter duplicated one because header index was + // assigned before checking + header_data.prpt_typ_array.add(pb_report_type); + header_data.irpt_typ_array.add(in_report_type); + header_data.inst_typ_array.add(instrument_type); + mlog << Debug(9) << method_name << "pb_report_type: " << pb_report_type + << ", in_report_type: " << in_report_type << ", instrument_type: " + << instrument_type << "\n"; + return added; +} + +/////////////////////////////////////////////////////////////////////////////// + +bool MetNcPointObsOut::add_header_strings(const char *hdr_typ, const char *hdr_sid) +{ + bool added = false; + + // Can't filter duplicated one because header index was + // assigned before checking + int hdr_index; + if (!header_data.typ_array.has(hdr_typ, hdr_index, false)) { + hdr_index = header_data.typ_array.n_elements(); + header_data.typ_array.add(hdr_typ); // Message type + added = true; + } + header_data.typ_idx_array.add(hdr_index); // Index of Message type + + if (!header_data.sid_array.has(hdr_sid, hdr_index, false)) { + hdr_index = header_data.sid_array.n_elements(); + header_data.sid_array.add(hdr_sid); // Station ID + added = true; + } + header_data.sid_idx_array.add(hdr_index); // Index of Station ID + + return added; +} + +/////////////////////////////////////////////////////////////////////////////// + +bool MetNcPointObsOut::add_header_vld(const char *hdr_vld) +{ + bool added = false; + + // Can't filter duplicated one because header index was + // assigned before checking + int hdr_index; + if (!header_data.vld_array.has(hdr_vld, hdr_index, false)) { + hdr_index = header_data.typ_array.n_elements(); + header_data.vld_array.add(hdr_vld); // Valid time + added = true; + } + return added; +} + +//////////////////////////////////////////////////////////////////////// + +void MetNcPointObsOut::create_pb_hdrs(int pb_hdr_count) { + raw_hdr_cnt = pb_hdr_count; + obs_vars.create_pb_hdrs(obs_nc, pb_hdr_count); +} + +//////////////////////////////////////////////////////////////////////// +// If raw_hdr_cnt is greater than 0, skip updating header index for obs. + +void MetNcPointObsOut::get_dim_counts(int *obs_cnt, int *hdr_cnt) { + string method_name = "get_dim_counts() "; + SummaryObs *summary_obs = out_data.summary_obs; + bool do_summary = out_data.summary_info.flag; + + // + // Initialize the header and observation record counters + // + int obs_count = out_data.observations.size(); + int hdr_count = (out_data.processed_hdr_cnt > 0) + ? out_data.processed_hdr_cnt + : summary_obs->countHeaders(out_data.observations); // count and reset header index + if (do_summary) { + int summary_count = summary_obs->getSummaries().size(); + int summary_hdr_count = summary_obs->countSummaryHeaders(); + if (out_data.summary_info.raw_data) { + obs_count += summary_count; + hdr_count += summary_hdr_count; + } + else { + obs_count = summary_count; + hdr_count = summary_hdr_count; + if (out_data.processed_hdr_cnt > 0) { + reset_hdr_buffer = true; + } + } + } + *obs_cnt = obs_count; + *hdr_cnt = hdr_count; + mlog << Debug(7) << method_name << "obs_count: " + << obs_count << " header count: " << hdr_count << "\n"; + + // + // Add global attributes + // + + if (do_summary) write_summary_attributes(obs_nc, out_data.summary_info); + +} + +//////////////////////////////////////////////////////////////////////// + +void MetNcPointObsOut::init_buffer() { + + data_buffer.obs_data_idx = 0; + data_buffer.obs_data_offset = 0; + data_buffer.hdr_data_idx = 0; + data_buffer.hdr_data_offset = 0; + data_buffer.pb_hdr_data_offset = 0; + + strcpy(data_buffer.prev_hdr_typ_buf, "NotDefined"); + strcpy(data_buffer.prev_hdr_sid_buf, "NotDefined"); + strcpy(data_buffer.prev_hdr_vld_buf, "NotDefined"); + for (int index=0; indexgetName().c_str(), program_name.c_str()); + + return true; +} + +//////////////////////////////////////////////////////////////////////// + +void MetNcPointObsOut::init_obs_vars(bool using_var_id, int deflate_level, + bool attr_agl) { + use_var_id = using_var_id; + obs_vars.reset(using_var_id); + obs_vars.attr_agl = attr_agl; + out_data.deflate_level = obs_vars.deflate_level = deflate_level; + + header_data.clear(); +} + +/////////////////////////////////////////////////////////////////////////////// + +void MetNcPointObsOut::reset_header_buffer(int buf_size, bool reset_all) { + for (int i=0; i observations, + SummaryObs *summary_obs, + TimeSummaryInfo summary_info, + int processed_hdr_cnt) { + out_data.processed_hdr_cnt = processed_hdr_cnt; + out_data.observations = observations; + out_data.summary_obs = summary_obs; + out_data.summary_info = summary_info; +} + +//////////////////////////////////////////////////////////////////////// + +void MetNcPointObsOut::set_using_var_id(bool using_var_id) { + use_var_id = obs_vars.use_var_id = using_var_id; +} + +//////////////////////////////////////////////////////////////////////// +// Saves the headers at NcHeaderData header_data +// +void MetNcPointObsOut::write_arr_headers() { + int cur_hdr_idx = data_buffer.cur_hdr_idx; + int buf_size = (cur_hdr_idx > OBS_BUFFER_SIZE) ? OBS_BUFFER_SIZE : cur_hdr_idx; + const string method_name = " write_arr_headers()"; + + mlog << Debug(5) << method_name << " hdr_count: " << cur_hdr_idx + << ", typ_idx_array: " << header_data.typ_idx_array.n_elements() + << ", sid_idx_array: " << header_data.sid_idx_array.n_elements() + << ", vld_idx_array: " << header_data.vld_idx_array.n_elements() + << ", lat_array: " << header_data.lat_array.n_elements() + << ", lon_array: " << header_data.lon_array.n_elements() + << ", elv_array: " << header_data.elv_array.n_elements() + << "\n"; + + int hdr_data_idx = 0; + bool is_pb_hdr = (0 < header_data.prpt_typ_array.n_elements()) + && !IS_INVALID_NC(obs_vars.hdr_prpt_typ_var); + data_buffer.hdr_buf_size = buf_size; + data_buffer.hdr_data_idx = hdr_data_idx; + for (int index=0; index= buf_size) { + obs_vars.write_header_to_nc(data_buffer, hdr_data_idx, is_pb_hdr); + hdr_data_idx = data_buffer.hdr_data_idx; + } + } + + write_buf_headers(); +} + +/////////////////////////////////////////////////////////////////////////////// + +void MetNcPointObsOut::write_buf_headers () { + if (0 < data_buffer.hdr_data_idx) { + obs_vars.write_header_to_nc(data_buffer, data_buffer.hdr_data_idx); + } + obs_vars.write_table_vars(header_data, data_buffer); +} + +/////////////////////////////////////////////////////////////////////////////// + +void MetNcPointObsOut::write_header(const char *hdr_typ, const char *hdr_sid, + const time_t hdr_vld, const float hdr_lat, + const float hdr_lon, const float hdr_elv) +{ + // Can't filter duplicated one because header index was + // assigned before checking + int hdr_index; + bool new_vld = false; + int hdr_data_idx = data_buffer.hdr_data_idx; + const char *method_name = "MetNcPointObsOut::write_header"; + + // Message type + if (!header_data.typ_array.has(hdr_typ, hdr_index, false)) { + hdr_index = header_data.typ_array.n_elements(); + header_data.typ_array.add(hdr_typ); + } + data_buffer.hdr_typ_buf[hdr_data_idx] = hdr_index; + + // Station ID + if (!header_data.sid_array.has(hdr_sid, hdr_index, false)) { + hdr_index = header_data.sid_array.n_elements(); + header_data.sid_array.add(hdr_sid); + } + data_buffer.hdr_sid_buf[hdr_data_idx] = hdr_index; + + // Valid Time + if (header_data.min_vld_time == -1 || header_data.min_vld_time > hdr_vld) { + if (header_data.min_vld_time == -1) header_data.max_vld_time = hdr_vld; + header_data.min_vld_time = hdr_vld; + new_vld = true; + } + else if (header_data.max_vld_time < hdr_vld) { + header_data.max_vld_time = hdr_vld; + new_vld = true; + } + + if (new_vld || !header_data.vld_num_array.has(hdr_vld, hdr_index, false)) { + hdr_index = header_data.vld_array.n_elements(); + header_data.vld_array.add(unix_to_yyyymmdd_hhmmss(hdr_vld)); + header_data.vld_num_array.add(hdr_vld); + } + data_buffer.hdr_vld_buf[hdr_data_idx] = hdr_index; + + // Write the header array which consists of the following: + // LAT LON ELV + data_buffer.hdr_lat_buf[hdr_data_idx] = (float) hdr_lat; + data_buffer.hdr_lon_buf[hdr_data_idx] = (float) hdr_lon; + data_buffer.hdr_elv_buf[hdr_data_idx] = (float) hdr_elv; + + hdr_data_idx++; + data_buffer.hdr_data_idx = hdr_data_idx; + data_buffer.cur_hdr_idx++; + mlog << Debug(9) << method_name << "header is added (cur_index=" + << data_buffer.cur_hdr_idx << ")\n"; + + if (hdr_data_idx >= OBS_BUFFER_SIZE) { + obs_vars.write_header_to_nc(data_buffer, OBS_BUFFER_SIZE); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void MetNcPointObsOut::write_observation() +{ + if (0 < data_buffer.obs_data_idx){ + obs_vars.write_obs_buffer(data_buffer, data_buffer.obs_data_idx); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void MetNcPointObsOut::write_observation(const float obs_arr[OBS_ARRAY_LEN], + const char *obs_qty) +{ + int qty_index; + int obs_data_idx = data_buffer.obs_data_idx; + if (!data_buffer.qty_data_array.has(obs_qty, qty_index, false)) { + qty_index = data_buffer.qty_data_array.n_elements(); + data_buffer.qty_data_array.add(obs_qty); + } + data_buffer.qty_idx_buf[obs_data_idx] = qty_index; + + data_buffer.obs_hid_buf[obs_data_idx] = obs_arr[0]; + data_buffer.obs_vid_buf[obs_data_idx] = obs_arr[1]; + data_buffer.obs_lvl_buf[obs_data_idx] = obs_arr[2]; + data_buffer.obs_hgt_buf[obs_data_idx] = obs_arr[3]; + data_buffer.obs_val_buf[obs_data_idx] = obs_arr[4]; + data_buffer.obs_data_idx++; + data_buffer.cur_obs_idx++; + + if (data_buffer.obs_data_idx >= OBS_BUFFER_SIZE) { + obs_vars.write_obs_buffer(data_buffer, OBS_BUFFER_SIZE); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void MetNcPointObsOut::write_obs_data() +{ + string method_name = "write_obs_data() "; + bool do_summary = out_data.summary_info.flag; + bool do_save_raw_data = out_data.summary_info.raw_data; + bool do_header = (out_data.processed_hdr_cnt == 0); + + mlog << Debug(5) << method_name << "do_header: " << (do_header ? "true" : "false") + << ", do_summary: " << (do_summary ? "true" : "false") + << ", save_raw_data: " << (do_save_raw_data ? "true" : "false") + << "\n"; + + if (!do_summary || (do_summary && do_save_raw_data)) { + mlog << Debug(5) << method_name << "writing " + << (int)out_data.observations.size() << " raw data...\n"; + write_obs_data(out_data.observations, do_header); + } + if (do_summary) { + mlog << Debug(5) << method_name << "writing summary" + << (do_save_raw_data ? " " : " (summary only)") << "...\n"; + bool tmp_do_header = true ; + write_obs_data(out_data.summary_obs->getSummaries(), + tmp_do_header); + } + + int obs_buf_index = get_obs_index(); + if (obs_buf_index > 0) { + obs_vars.write_obs_buffer(data_buffer, obs_buf_index); + } + +} + +/////////////////////////////////////////////////////////////////////////////// + +int MetNcPointObsOut::write_obs_data(const vector< Observation > observations, + const bool do_header) +{ + int prev_hdr_idx = -1; + string prev_header_type = ""; + string prev_station_id = ""; + ConcatString obs_qty; + int headerOffset = data_buffer.cur_hdr_idx; + const string method_name = " write_obs_data()"; + + int obs_buf_size = observations.size(); + if (obs_buf_size > OBS_BUFFER_SIZE) obs_buf_size = OBS_BUFFER_SIZE; + + float obs_arr[OBS_ARRAY_LEN]; + bool header_to_vector = IS_INVALID_NC(obs_vars.hdr_arr_var) + || IS_INVALID_NC(obs_vars.hdr_lat_var); + mlog << Debug(5) << method_name << " obs_count: " << obs_buf_size + << " do_header: " << do_header + << " header_to_vector: " << header_to_vector << "\n"; + for (vector< Observation >::const_iterator obs = observations.begin(); + obs != observations.end(); ++obs) + { + data_buffer.processed_count++; + + if (do_header) { + if (obs->getHeaderIndex() != prev_hdr_idx) { + mlog << Debug(9) << method_name << " obs->getHeaderIndex(): " + << obs->getHeaderIndex() << " at obs " << data_buffer.processed_count << "\n"; + prev_hdr_idx = obs->getHeaderIndex(); + if (header_to_vector) { + add_header( + obs->getHeaderType().c_str(), + obs->getStationId().c_str(), + obs->getValidTime(), + obs->getLatitude(), + obs->getLongitude(), + obs->getElevation()); + } + else { + write_header( + obs->getHeaderType().c_str(), + obs->getStationId().c_str(), + obs->getValidTime(), + obs->getLatitude(), + obs->getLongitude(), + obs->getElevation()); + } + } + } + + obs_arr[0] = obs->getHeaderIndex(); + obs_arr[1] = (use_var_id ? obs->getVarCode() : obs->getGribCode()); + obs_arr[2] = obs->getPressureLevel(); + obs_arr[3] = obs->getHeight(); + obs_arr[4] = obs->getValue(); + obs_qty = (obs->getQualityFlag().length() == 0 ? na_str : obs->getQualityFlag().c_str()); + if (do_header) obs_arr[0] += headerOffset; + + write_observation(obs_arr, obs_qty.text()); + + } // endfor - obs + + if (data_buffer.obs_data_idx > 0) { + obs_vars.write_obs_buffer(data_buffer, data_buffer.obs_data_idx); + } + + //Caller handles writing headers + + return data_buffer.processed_count; +} + +//////////////////////////////////////////////////////////////////////// + +bool MetNcPointObsOut::write_to_netcdf(StringArray obs_names, StringArray obs_units, + StringArray obs_descs) { + const char *method_name = " write_to_netcdf() "; + + write_obs_data(); + obs_vars.create_table_vars(obs_nc, header_data, data_buffer); + write_arr_headers(); + + if (use_var_id) { + int var_count = obs_names.n_elements(); + if (var_count > 0) { + int unit_count = obs_units.n(); + obs_vars.create_obs_name_vars (obs_nc, var_count, unit_count); + obs_vars.write_obs_var_names(obs_names); + if( unit_count > 0 ) obs_vars.write_obs_var_units(obs_units); + if( obs_descs.n() > 0 ) obs_vars.write_obs_var_descriptions(obs_descs); + mlog << Debug(7) << method_name << var_count + << " variable names were saved\n"; + } + else mlog << Warning << "\n" << method_name + << "variable names are not added because of empty names\n\n"; + } + else mlog << Debug(7) << method_name << "use_var_id is false\n"; +} + +//////////////////////////////////////////////////////////////////////// diff --git a/met/src/libcode/vx_nc_obs/nc_point_obs_out.h b/met/src/libcode/vx_nc_obs/nc_point_obs_out.h new file mode 100644 index 0000000000..510aadd767 --- /dev/null +++ b/met/src/libcode/vx_nc_obs/nc_point_obs_out.h @@ -0,0 +1,104 @@ +// *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +// ** Copyright UCAR (c) 1992 - 2021 +// ** University Corporation for Atmospheric Research (UCAR) +// ** National Center for Atmospheric Research (NCAR) +// ** Research Applications Lab (RAL) +// ** P.O.Box 3000, Boulder, Colorado, 80307-3000, USA +// *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* + + +//////////////////////////////////////////////////////////////////////// + +#ifndef __NC_POINT_OBS_OUT_H__ +#define __NC_POINT_OBS_OUT_H__ + +//////////////////////////////////////////////////////////////////////// + +#include + +#include "observation.h" +#include "nc_utils.h" +#include "nc_obs_util.h" +#include "nc_point_obs.h" +#include "nc_var_info.h" +#include "vx_summary.h" + + +//////////////////////////////////////////////////////////////////////// + +class MetNcPointObsOut : public MetNcPointObs { + + protected: + int raw_hdr_cnt; + bool reset_hdr_buffer; + + NcDataBuffer data_buffer; + NcObsOutputData out_data; + + void init_from_scratch(); + + public: + + MetNcPointObsOut(); + ~MetNcPointObsOut(); + + bool add_header(const char *hdr_typ, const char *hdr_sid, const time_t hdr_vld, + const float hdr_lat, const float hdr_lon, const float hdr_elv); + bool add_header_prepbufr (const int pb_report_type, const int in_report_type, + const int instrument_type); + bool add_header_strings(const char *hdr_typ, const char *hdr_sid); + bool add_header_vld(const char *hdr_vld); + + void create_pb_hdrs(int pb_hdr_count); + + int get_buf_size(); + void get_dim_counts(int *obs_cnt, int *hdr_cnt); + int get_hdr_index(); + int get_obs_index(); + NcObsOutputData *get_output_data(); + NetcdfObsVars *get_obs_vars(); + + void init_buffer(); + void init_obs_vars(bool using_var_id, int deflate_level, bool attr_agl=false); + bool init_netcdf(int obs_count, int hdr_count, string program_name); + + void reset_header_buffer(int buf_size, bool reset_all); + void set_nc_out_data(vector observations, + SummaryObs *summary_obs, TimeSummaryInfo summary_info, + int processed_hdr_cnt=0); + void set_using_var_id(bool using_var_id); + + void write_arr_headers(); + void write_buf_headers (); + void write_header (const char *hdr_typ, const char *hdr_sid, const time_t hdr_vld, + const float hdr_lat, const float hdr_lon, const float hdr_elv); + void write_observation(); + void write_observation(const float obs_arr[OBS_ARRAY_LEN], const char *obs_qty); + void write_obs_data(); + int write_obs_data(const vector< Observation > observations, + const bool do_header = true); + bool write_to_netcdf(StringArray obs_names, StringArray obs_units, + StringArray obs_descs); + + // variables + + // data + +}; // MetNcPointObsOut + + +//////////////////////////////////////////////////////////////////////// + +inline int MetNcPointObsOut::get_hdr_index() { return data_buffer.cur_hdr_idx; } +inline int MetNcPointObsOut::get_obs_index() { return data_buffer.obs_data_idx; } +inline NcObsOutputData *MetNcPointObsOut::get_output_data() { return &out_data; } +inline NetcdfObsVars *MetNcPointObsOut::get_obs_vars() { return &obs_vars; } + +//////////////////////////////////////////////////////////////////////// + + +#endif /* __NC_POINT_OBS_OUT_H__ */ + + +//////////////////////////////////////////////////////////////////////// + diff --git a/met/src/libcode/vx_nc_obs/nc_summary.cc b/met/src/libcode/vx_nc_obs/nc_summary.cc index 2870ee713c..b7c2786027 100644 --- a/met/src/libcode/vx_nc_obs/nc_summary.cc +++ b/met/src/libcode/vx_nc_obs/nc_summary.cc @@ -8,7 +8,7 @@ //////////////////////////////////////////////////////////////////////// // -// Filename: summary_util.cc +// Filename: nc_summary.cc // // Description: // Common routines for time summary (into NetCDF). @@ -16,21 +16,16 @@ using namespace std; -//#include #include -//#include "vx_math.h" -//#include "vx_nc_util.h" #include "write_netcdf.h" #include "nc_obs_util.h" -#include "nc_summary.h" +#include "vx_summary.h" //////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////// - -string _secsToTimeString(const int secs) +string seconds_to_time_string(const int secs) { // Get the different fields from the number of seconds @@ -50,108 +45,13 @@ string _secsToTimeString(const int secs) return string(string_buffer); } -//////////////////////////////////////////////////////////////////////// -// If raw_hdr_cnt is greater than 0, skip updating header index for obs. - -void init_netcdf_output(NcFile *nc_file, NetcdfObsVars &obs_vars, - NcObsOutputData &nc_out_data, string program_name) -{ - string method_name = "init_netcdf_output() "; - SummaryObs *summary_obs = nc_out_data.summary_obs; - bool do_summary = nc_out_data.summary_info.flag; - - // - // Initialize the header and observation record counters - // - int obs_count = nc_out_data.observations.size(); - int hdr_count = (nc_out_data.processed_hdr_cnt > 0) - ? nc_out_data.processed_hdr_cnt - : summary_obs->countHeaders(nc_out_data.observations); // count and reset header index - if (do_summary) { - int summary_count = summary_obs->getSummaries().size(); - int summary_hdr_count = summary_obs->countSummaryHeaders(); - if (nc_out_data.summary_info.raw_data) { - obs_count += summary_count; - hdr_count += summary_hdr_count; - } - else { - if (nc_out_data.processed_hdr_cnt > 0) { - bool hdr_cnt = get_nc_hdr_cur_index(); - bool reset_array = true; - reset_header_buffer(hdr_cnt, reset_array); - mlog << Debug(5) << method_name << "reset headers (" << hdr_cnt << ") raw data.\n"; - } - obs_count = summary_count; - hdr_count = summary_hdr_count; - } - } - mlog << Debug(7) << method_name << "obs_count: " - << obs_count << " header count: " << hdr_count << "\n"; - obs_vars.obs_cnt = obs_count; - - create_nc_hdr_vars(obs_vars, nc_file, hdr_count, nc_out_data.deflate_level); - create_nc_obs_vars(obs_vars, nc_file, nc_out_data.deflate_level, - obs_vars.use_var_id); - - // - // Add global attributes - // - write_netcdf_global(nc_file, nc_file->getName().c_str(), program_name.c_str()); - - if (do_summary) write_summary_attributes(nc_file, nc_out_data.summary_info); - -} - -//////////////////////////////////////////////////////////////////////// - -bool write_observations(NcFile *nc_file, NetcdfObsVars &obs_vars, - NcObsOutputData &nc_out_data) -{ - bool use_var_id = obs_vars.use_var_id; - string method_name = "write_observations() "; - bool do_summary = nc_out_data.summary_info.flag; - bool do_save_raw_data = nc_out_data.summary_info.raw_data; - bool do_header = (nc_out_data.processed_hdr_cnt == 0); - - mlog << Debug(5) << method_name << "do_header: " << (do_header ? "true" : "false") - << ", do_summary: " << (do_summary ? "true" : "false") - << ", save_raw_data: " << (do_save_raw_data ? "true" : "false") - << "\n"; - - if (!do_summary || (do_summary && do_save_raw_data)) { - mlog << Debug(5) << method_name << "writing " - << (int)nc_out_data.observations.size() << " raw data...\n"; - write_nc_observations(obs_vars, nc_out_data.observations, use_var_id, do_header); - } - if (do_summary) { - mlog << Debug(5) << method_name << "writing summary" - << (do_save_raw_data ? " " : " (summary only)") << "...\n"; - bool tmp_do_header = true; - write_nc_observations(obs_vars, nc_out_data.summary_obs->getSummaries(), - use_var_id, tmp_do_header); - } - - int obs_buf_index = get_nc_obs_buf_index(); - if (obs_buf_index > 0) { - write_nc_obs_buffer(obs_buf_index); - } - - create_nc_table_vars (obs_vars, nc_file, nc_out_data.deflate_level); - - write_nc_arr_headers(obs_vars); - - //write_nc_table_vars(obs_vars); - - return true; -} - //////////////////////////////////////////////////////////////////////// void write_summary_attributes(NcFile *nc_file, TimeSummaryInfo summary_info) { add_att(nc_file, "time_summary_beg", - _secsToTimeString(summary_info.beg)); + seconds_to_time_string(summary_info.beg)); add_att(nc_file, "time_summary_end", - _secsToTimeString(summary_info.end)); + seconds_to_time_string(summary_info.end)); char att_string[1024]; @@ -187,4 +87,3 @@ void write_summary_attributes(NcFile *nc_file, TimeSummaryInfo summary_info) { } //////////////////////////////////////////////////////////////////////// - diff --git a/met/src/libcode/vx_nc_obs/nc_summary.h b/met/src/libcode/vx_nc_obs/nc_summary.h index 85d11ec249..3f42868ff4 100644 --- a/met/src/libcode/vx_nc_obs/nc_summary.h +++ b/met/src/libcode/vx_nc_obs/nc_summary.h @@ -16,6 +16,7 @@ #include using namespace netCDF; #include "nc_utils.h" +#include "nc_obs_util.h" #include "vx_summary.h" //////////////////////////////////////////////////////////////////////// @@ -33,10 +34,7 @@ struct NcObsOutputData { extern string _secsToTimeString(const int secs); -extern void init_netcdf_output(NcFile *, NetcdfObsVars &obs_vars, - NcObsOutputData &nc_out_data, string program_name); - -extern bool write_observations(NcFile *, NetcdfObsVars &, NcObsOutputData &nc_out_data); +// Not moved to nc_obs_util to reduce the dependency (library) extern void write_summary_attributes(NcFile *, TimeSummaryInfo); diff --git a/met/src/libcode/vx_nc_util/nc_utils.h b/met/src/libcode/vx_nc_util/nc_utils.h index e1e99d6c10..f1dec583e3 100644 --- a/met/src/libcode/vx_nc_util/nc_utils.h +++ b/met/src/libcode/vx_nc_util/nc_utils.h @@ -77,6 +77,7 @@ static const string C_unknown_str = string("unknown"); #define NC_BUFFER_SIZE_16K (16*1024) #define HDR_ARRAY_LEN 3 // Observation header length +#define HDR_TYPE_ARR_LEN 3 // Observation header type length (prpt/irpt/inst) #define OBS_ARRAY_LEN 5 // Observation values length #define HEADER_STR_LEN 16 // Maximum length for header string #define HEADER_STR_LEN2 40 // Maximum length for header string 2 diff --git a/met/src/libcode/vx_nc_util/write_netcdf.cc b/met/src/libcode/vx_nc_util/write_netcdf.cc index bf8eff148c..71d67342b7 100644 --- a/met/src/libcode/vx_nc_util/write_netcdf.cc +++ b/met/src/libcode/vx_nc_util/write_netcdf.cc @@ -315,44 +315,3 @@ ConcatString s; /////////////////////////////////////////////////////////////////////////////// -//bool is_same_header (const char *hdr_typ, const char *hdr_sid, const char *hdr_vld, -// const float hdr_lat, const float hdr_lon, const float hdr_elv) { -// bool new_header = -// !is_eq(nc_data_buffer.prev_hdr_arr_buf[0],hdr_lat) || -// !is_eq(nc_data_buffer.prev_hdr_arr_buf[1], hdr_lon) || -// !is_eq(nc_data_buffer.prev_hdr_arr_buf[2], hdr_elv) || -// 0 != strcmp(nc_data_buffer.prev_hdr_typ_buf, hdr_typ) || -// 0 != strcmp(nc_data_buffer.prev_hdr_sid_buf, hdr_sid) || -// 0 != strcmp(nc_data_buffer.prev_hdr_vld_buf, hdr_vld); -// if (new_header) { -// strcpy(nc_data_buffer.prev_hdr_typ_buf, hdr_typ); -// strcpy(nc_data_buffer.prev_hdr_sid_buf, hdr_sid); -// strcpy(nc_data_buffer.prev_hdr_vld_buf, hdr_vld); -// nc_data_buffer.prev_hdr_arr_buf[0] = hdr_lat; -// nc_data_buffer.prev_hdr_arr_buf[1] = hdr_lon; -// nc_data_buffer.prev_hdr_arr_buf[2] = hdr_elv; -// } -// return new_header; -//} -// -//bool is_same_header (const char *hdr_typ, const char *hdr_sid, const unixtime hdr_vld, -// const float hdr_lat, const float hdr_lon, const float hdr_elv) { -// bool new_header = -// !is_eq(nc_data_buffer.prev_hdr_arr_buf[0],hdr_lat) || -// !is_eq(nc_data_buffer.prev_hdr_arr_buf[1], hdr_lon) || -// !is_eq(nc_data_buffer.prev_hdr_arr_buf[2], hdr_elv) || -// 0 != strcmp(nc_data_buffer.prev_hdr_typ_buf, hdr_typ) || -// 0 != strcmp(nc_data_buffer.prev_hdr_sid_buf, hdr_sid) || -// !is_eq(nc_data_buffer.prev_hdr_vld, hdr_vld); -// if (new_header) { -// strcpy(nc_data_buffer.prev_hdr_typ_buf, hdr_typ); -// strcpy(nc_data_buffer.prev_hdr_sid_buf, hdr_sid); -// nc_data_buffer.prev_hdr_vld = hdr_vld; -// nc_data_buffer.prev_hdr_arr_buf[0] = hdr_lat; -// nc_data_buffer.prev_hdr_arr_buf[1] = hdr_lon; -// nc_data_buffer.prev_hdr_arr_buf[2] = hdr_elv; -// } -// return new_header; -//} - -/////////////////////////////////////////////////////////////////////////////// diff --git a/met/src/tools/core/ensemble_stat/Makefile.am b/met/src/tools/core/ensemble_stat/Makefile.am index 172302f19a..5aec02dd98 100644 --- a/met/src/tools/core/ensemble_stat/Makefile.am +++ b/met/src/tools/core/ensemble_stat/Makefile.am @@ -24,20 +24,20 @@ ensemble_stat_LDADD = -lvx_stat_out \ -lvx_data2d_nc_met \ -lvx_data2d_grib $(GRIB2_LIBS) \ -lvx_data2d_nc_pinterp \ - $(PYTHON_LIBS) \ -lvx_data2d_nccf \ - -lvx_statistics \ + $(PYTHON_LIBS) \ -lvx_data2d \ -lvx_nc_obs \ -lvx_nc_util \ -lvx_regrid \ -lvx_grid \ -lvx_config \ - -lvx_cal \ + -lvx_color \ -lvx_util \ -lvx_math \ - -lvx_color \ + -lvx_cal \ -lvx_log \ + $(PYTHON_LIBS) \ -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas EXTRA_DIST = ensemble_stat.h \ diff --git a/met/src/tools/core/ensemble_stat/ensemble_stat.cc b/met/src/tools/core/ensemble_stat/ensemble_stat.cc index b3e736fdae..eecc5c183f 100644 --- a/met/src/tools/core/ensemble_stat/ensemble_stat.cc +++ b/met/src/tools/core/ensemble_stat/ensemble_stat.cc @@ -86,6 +86,7 @@ using namespace std; #include "vx_log.h" #include "nc_obs_util.h" +#include "nc_point_obs_in.h" //////////////////////////////////////////////////////////////////////// @@ -941,124 +942,60 @@ void process_point_obs(int i_nc) { int i_obs, j; unixtime hdr_ut; NcFile *obs_in = (NcFile *) 0; + const char *method_name = "process_point_obs() -> "; mlog << Debug(2) << "\n" << sep_str << "\n\n" << "Processing point observation file: " << point_obs_file_list[i_nc] << "\n"; // Open the observation file as a NetCDF file. - obs_in = open_ncfile(point_obs_file_list[i_nc].c_str()); + MetNcPointObsIn nc_point_obs; + if(!nc_point_obs.open(point_obs_file_list[i_nc].c_str())) { + nc_point_obs.close(); - if(IS_INVALID_NC_P(obs_in)) { - delete obs_in; - obs_in = (NcFile *) 0; - - mlog << Warning << "\nprocess_point_obs() -> " + mlog << Warning << "\n" << method_name << "can't open observation netCDF file: " << point_obs_file_list[i_nc] << "\n\n"; return; } // Read the dimensions and variables - NetcdfObsVars obs_vars; - read_nc_dims_vars(obs_vars, obs_in); - - bool use_var_id = obs_vars.use_var_id; - if (use_var_id) { - NcDim var_dim = get_nc_dim(obs_in,nc_dim_nvar); - get_dim_size(&var_dim); - } + nc_point_obs.read_dim_headers(); + nc_point_obs.check_nc(point_obs_file_list[i_nc].c_str(), method_name); // exit if missing dims/vars + nc_point_obs.read_obs_data_table_lookups(); - int exit_code = check_nc_dims_vars(obs_vars); + int hdr_count = nc_point_obs.get_hdr_cnt(); + int obs_count = nc_point_obs.get_obs_cnt(); + bool use_var_id = nc_point_obs.is_using_var_id(); + bool use_arr_vars = nc_point_obs.is_using_obs_arr(); - if(exit_code == exit_code_no_dim) { - mlog << Error << "\nprocess_point_obs() -> " - << "can't read \"mxstr\", \"nobs\" or \"nmsg\" " - << "dimensions from netCDF file: " - << point_obs_file_list[i_nc] << "\n\n"; - exit(1); - } - - // Read the variables - - if(exit_code == exit_code_no_hdr_vars) { - mlog << Error << "\nprocess_point_obs() -> " - << "can't read \"hdr_typ\", \"hdr_sid\", " - << "or \"hdr_vld\" variables from netCDF file: " - << point_obs_file_list[i_nc] << "\n\n"; - exit(1); - } - if(exit_code == exit_code_no_loc_vars) { - mlog << Error << "\nprocess_point_obs() -> " - << "can't read \"hdr_arr\", or \"hdr_lat\" variables from netCDF file: " - << point_obs_file_list[i_nc] << "\n\n"; - exit(1); - } - if(exit_code == exit_code_no_obs_vars) { - mlog << Error << "\nprocess_point_obs() -> " - << "can't read \"obs_arr\" or \"obs_val\" variables from netCDF file: " - << point_obs_file_list[i_nc] << "\n\n"; - exit(1); - } - - if(IS_INVALID_NC(obs_vars.obs_qty_var)) - mlog << Debug(3) << "Quality marker information not found input file.\n"; - - bool use_arr_vars = !IS_INVALID_NC(obs_vars.obs_arr_var); - int hdr_count = GET_NC_SIZE(obs_vars.hdr_dim); - int obs_count = GET_NC_SIZE(obs_vars.obs_dim); mlog << Debug(2) << "Searching " << (obs_count) << " observations from " << (hdr_count) << " header messages.\n"; - int qty_len = get_nc_string_length(obs_in, obs_vars.obs_qty_tbl_var, - (use_arr_vars ? nc_var_obs_qty : nc_var_obs_qty_tbl)); - - NcHeaderData header_data = get_nc_hdr_data(obs_vars); - int buf_size = ((obs_count > DEF_NC_BUFFER_SIZE) ? DEF_NC_BUFFER_SIZE : (obs_count)); int obs_qty_idx_block[buf_size]; float obs_arr_block[buf_size][OBS_ARRAY_LEN]; - char obs_qty_str_block[buf_size][qty_len]; - StringArray obs_qty_array; - - float obs_arr[OBS_ARRAY_LEN], hdr_arr[hdr_arr_len]; - int hdr_typ_arr[hdr_typ_arr_len]; + float obs_arr[OBS_ARRAY_LEN], hdr_arr[HDR_ARRAY_LEN]; + int hdr_typ_arr[HDR_TYPE_ARR_LEN]; ConcatString hdr_typ_str; ConcatString hdr_sid_str; ConcatString hdr_vld_str; ConcatString obs_qty_str; - - StringArray var_names; ConcatString var_name; - - if (use_var_id) { - NcVar obs_var = get_nc_var(obs_in, nc_var_obs_var); - if (!get_nc_data_to_array(&obs_var, &var_names)) { - mlog << Error << "\nprocess_point_obs() -> " - << "trouble getting variable names from " - << GET_NC_NAME(obs_var) << "\n\n"; - exit(1); - } - } - - if (!IS_INVALID_NC(obs_vars.obs_qty_tbl_var)) { - if (!get_nc_data_to_array(&obs_vars.obs_qty_tbl_var, &obs_qty_array)) { - mlog << Error << "\nprocess_point_obs() -> " - << "trouble getting obs_qty\n\n"; - exit(1); - } - } + StringArray var_names; + StringArray obs_qty_array = nc_point_obs.get_qty_data(); + if(use_var_id) var_names = nc_point_obs.get_var_names(); for(int i_start=0; i_start DEF_NC_BUFFER_SIZE) ? DEF_NC_BUFFER_SIZE : (obs_count-i_start); + buf_size = ((obs_count-i_start) > DEF_NC_BUFFER_SIZE) + ? DEF_NC_BUFFER_SIZE : (obs_count-i_start); - if (!read_nc_obs_data(obs_vars, buf_size, i_start, qty_len, - (float *)obs_arr_block, obs_qty_idx_block, (char *)obs_qty_str_block)) { + if (!nc_point_obs.read_obs_data(buf_size, i_start, (float *)obs_arr_block, + obs_qty_idx_block, (char *)0)) { exit(1); } - // Process each observation in the file for(int i_offset=0; i_offset= hdr_count) { - mlog << Warning << "\nprocess_point_obs() -> " + mlog << Warning << "\n" << method_name << "range check error for header index " << headerOffset << " from observation number " << i_obs << " of point observation file: " @@ -1088,35 +1021,19 @@ void process_point_obs(int i_nc) { } // Read the corresponding header array for this observation - hdr_arr[0] = header_data.lat_array[headerOffset]; - hdr_arr[1] = header_data.lon_array[headerOffset]; - hdr_arr[2] = header_data.elv_array[headerOffset]; + // - the corresponding header type, header Station ID, and valid time + nc_point_obs.get_header(headerOffset, hdr_arr, hdr_typ_str, + hdr_sid_str, hdr_vld_str); // Read the header integer types - hdr_typ_arr[0] = (header_data.prpt_typ_array.n() > headerOffset ? - header_data.prpt_typ_array[headerOffset] : bad_data_int); - hdr_typ_arr[1] = (header_data.irpt_typ_array.n() > headerOffset ? - header_data.irpt_typ_array[headerOffset] : bad_data_int); - hdr_typ_arr[2] = (header_data.inst_typ_array.n() > headerOffset ? - header_data.inst_typ_array[headerOffset] : bad_data_int); - - // Read the corresponding header type for this observation - hdr_idx = use_arr_vars ? headerOffset : header_data.typ_idx_array[headerOffset]; - hdr_typ_str = header_data.typ_array[hdr_idx]; - - // Read the corresponding header Station ID for this observation - hdr_idx = use_arr_vars ? headerOffset : header_data.sid_idx_array[headerOffset]; - hdr_sid_str = header_data.sid_array[hdr_idx]; - - // Read the corresponding valid time for this observation - hdr_idx = use_arr_vars ? headerOffset : header_data.vld_idx_array[headerOffset]; - hdr_vld_str = header_data.vld_array[hdr_idx]; + nc_point_obs.get_header_type(headerOffset, hdr_typ_arr); // Convert string to a unixtime hdr_ut = timestring_to_unix(hdr_vld_str.c_str()); - if (use_var_id && obs_arr[1] < var_names.n()) { - var_name = var_names[obs_arr[1]]; + int grib_code = nc_point_obs.get_grib_code_or_var_index(obs_arr); + if (use_var_id && grib_code < var_names.n()) { + var_name = var_names[grib_code]; } else { var_name = ""; @@ -1127,21 +1044,17 @@ void process_point_obs(int i_nc) { for(j=0; j " + mlog << Warning << "\n" << method_name << "can't open observation netCDF file: " << obs_file[i_nc] << "\n\n"; return; } - // Read the dimensions and variables - NetcdfObsVars obs_vars; - read_nc_dims_vars(obs_vars, obs_in); - - bool use_var_id = obs_vars.use_var_id; - if (use_var_id) { - NcDim var_dim = get_nc_dim(obs_in,nc_dim_nvar); - get_dim_size(&var_dim); - } - - int exit_code = check_nc_dims_vars(obs_vars); - if(exit_code == exit_code_no_dim) { - mlog << Error << "\nprocess_obs_file() -> " - << "can't read \"mxstr\", \"nobs\" or \"nmsg\" " - << "dimensions from netCDF file: " - << obs_file[i_nc] << "\n\n"; - exit(1); - } - - if(exit_code == exit_code_no_hdr_vars) { - mlog << Error << "\nprocess_obs_file() -> " - << "can't read \"hdr_typ\", \"hdr_sid\", " - << "or \"hdr_vld\" variables from netCDF file: " - << obs_file[i_nc] << "\n\n"; - exit(1); - } - - if(exit_code == exit_code_no_loc_vars) { - mlog << Error << "\nprocess_obs_file() -> " - << "can't read \"hdr_arr\" or \"hdr_lat\" " - << "variables from netCDF file: " - << obs_file[i_nc] << "\n\n"; - exit(1); - } - if(exit_code == exit_code_no_obs_vars) { - mlog << Error << "\nprocess_obs_file() -> " - << "can't read \"obs_arr\" or \"obs_val\" " - << "variables from netCDF file: " - << obs_file[i_nc] << "\n\n"; - exit(1); - } - - if(IS_INVALID_NC(obs_vars.obs_qty_var)) - mlog << Debug(3) << "Quality marker information not found input file\n"; - - int obs_count = get_dim_size(&obs_vars.obs_dim); - int hdr_count = get_dim_size(&obs_vars.hdr_dim); + nc_point_obs.read_dim_headers(); + nc_point_obs.check_nc(obs_file[i_nc].c_str(), method_name); + nc_point_obs.read_obs_data_table_lookups(); + bool use_var_id = nc_point_obs.is_using_var_id(); + int hdr_count = nc_point_obs.get_hdr_cnt(); + int obs_count = nc_point_obs.get_obs_cnt(); mlog << Debug(2) << "Searching " << obs_count << " observations from " << hdr_count << " messages.\n"; - StringArray var_names; ConcatString var_name(""); - if (use_var_id) { - if (!get_nc_data_to_array(obs_in, nc_var_obs_var, &var_names)) { - mlog << Error << "\nprocess_obs_file() -> " - << "trouble getting variable names from " - << nc_var_obs_var << "\n\n"; - exit(1); - } - } + bool use_arr_vars = nc_point_obs.is_using_obs_arr(); + StringArray var_names; + StringArray obs_qty_array = nc_point_obs.get_qty_data(); + if( use_var_id ) var_names = nc_point_obs.get_var_names(); - bool use_arr_vars = !IS_INVALID_NC(obs_vars.obs_arr_var); int buf_size = ((obs_count > BUFFER_SIZE) ? BUFFER_SIZE : (obs_count)); - NcHeaderData header_data = get_nc_hdr_data(obs_vars); - int typ_len = header_data.typ_len; - int sid_len = header_data.sid_len; - int vld_len = header_data.vld_len; - int qty_len = get_nc_string_length(obs_in, obs_vars.obs_qty_tbl_var, - (use_arr_vars ? nc_var_obs_qty : nc_var_obs_qty_tbl)); - int obs_qty_idx_block[buf_size]; float obs_arr_block[buf_size][OBS_ARRAY_LEN]; - char obs_qty_block[buf_size][qty_len]; - StringArray obs_qty_array; - - if (!IS_INVALID_NC(obs_vars.obs_qty_tbl_var)) { - if (!get_nc_data_to_array(&obs_vars.obs_qty_tbl_var, &obs_qty_array)) { - mlog << Error << "\nprocess_obs_file() -> " - << "trouble getting obs_qty\n\n"; - exit(1); - } - } // Process each observation in the file int str_length, block_size; @@ -764,13 +700,13 @@ void process_obs_file(int i_nc) { block_size = (obs_count - i_block_start_idx); if (block_size > BUFFER_SIZE) block_size = BUFFER_SIZE; - if (!read_nc_obs_data(obs_vars, block_size, i_block_start_idx, qty_len, - (float *)obs_arr_block, obs_qty_idx_block, (char *)obs_qty_block)) { + if (!nc_point_obs.read_obs_data(block_size, i_block_start_idx, + (float *)obs_arr_block, + obs_qty_idx_block, (char *)0)) { exit(1); } int hdr_idx; - strcpy(obs_qty_str, ""); for(int i_block_idx=0; i_block_idx= hdr_count) { - mlog << Warning << "\nprocess_obs_file() -> " + mlog << Warning << "\n" << method_name << "range check error for header index " << headerOffset << " from observation number " << i_obs << " of point observation file: " << obs_file[i_nc] @@ -798,46 +730,26 @@ void process_obs_file(int i_nc) { } // Read the corresponding header array for this observation - hdr_arr[0] = header_data.lat_array[headerOffset]; - hdr_arr[1] = header_data.lon_array[headerOffset]; - hdr_arr[2] = header_data.elv_array[headerOffset]; - - // Read the corresponding header type for this observation - hdr_idx = use_arr_vars ? headerOffset : header_data.typ_idx_array[headerOffset]; - str_length = header_data.typ_array[hdr_idx].length(); - if (str_length > typ_len) str_length = typ_len; - strncpy(hdr_typ_str, header_data.typ_array[hdr_idx].c_str(), str_length); - hdr_typ_str[str_length] = bad_data_char; - - // Read the corresponding header Station ID for this observation - hdr_idx = use_arr_vars ? headerOffset : header_data.sid_idx_array[headerOffset]; - str_length = header_data.sid_array[hdr_idx].length(); - if (str_length > sid_len) str_length = sid_len; - strncpy(hdr_sid_str, header_data.sid_array[hdr_idx].c_str(), str_length); - hdr_sid_str[str_length] = bad_data_char; - - // Read the corresponding valid time for this observation - hdr_idx = use_arr_vars ? headerOffset : header_data.vld_idx_array[headerOffset]; - str_length = header_data.vld_array[hdr_idx].length(); - if (str_length > vld_len) str_length = vld_len; - strncpy(hdr_vld_str, header_data.vld_array[hdr_idx].c_str(), str_length); - hdr_vld_str[str_length] = bad_data_char; + // - the corresponding header type, header Station ID, and valid time + nc_point_obs.get_header(headerOffset, hdr_arr, hdr_typ_str, + hdr_sid_str, hdr_vld_str); // Store the variable name - int grib_code = obs_arr[1]; + int org_grib_code = nc_point_obs.get_grib_code_or_var_index(obs_arr); + int grib_code = org_grib_code; if (use_var_id && grib_code < var_names.n()) { var_name = var_names[grib_code]; - obs_arr[1] = bad_data_int; + grib_code = bad_data_int; } else { var_name = ""; } // Check for wind components - is_ugrd = ( use_var_id && var_name == ugrd_abbr_str ) || - (!use_var_id && nint(obs_arr[1]) == ugrd_grib_code); - is_vgrd = ( use_var_id && var_name == vgrd_abbr_str ) || - (!use_var_id && nint(obs_arr[1]) == vgrd_grib_code); + is_ugrd = ( use_var_id && var_name == ugrd_abbr_str ) || + (!use_var_id && nint(grib_code) == ugrd_grib_code); + is_vgrd = ( use_var_id && var_name == vgrd_abbr_str ) || + (!use_var_id && nint(grib_code) == vgrd_grib_code); // If the current observation is UGRD, save it as the // previous. If vector winds are to be computed, UGRD @@ -852,10 +764,8 @@ void process_obs_file(int i_nc) { // and at the same vertical level. if(vflag && is_vgrd) { - if(!is_eq(obs_arr[0], prev_obs_arr[0]) || - !is_eq(obs_arr[2], prev_obs_arr[2]) || - !is_eq(obs_arr[3], prev_obs_arr[3])) { - mlog << Error << "\nprocess_obs_file() -> " + if(!nc_point_obs.is_same_obs_values(obs_arr, prev_obs_arr)) { + mlog << Error << "\n" << method_name << "for observation index " << i_obs << ", when computing VL1L2 and/or VAL1L2 vector winds " << "each UGRD observation must be followed by a VGRD " @@ -866,7 +776,7 @@ void process_obs_file(int i_nc) { } // Convert string to a unixtime - hdr_ut = timestring_to_unix(hdr_vld_str); + hdr_ut = timestring_to_unix(hdr_vld_str.c_str()); // Check each conf_info.vx_pd object to see if this observation // should be added @@ -876,23 +786,19 @@ void process_obs_file(int i_nc) { if(conf_info.vx_opt[j].vx_pd.fcst_dpa.n_planes() == 0) continue; // Attempt to add the observation to the conf_info.vx_pd object - conf_info.vx_opt[j].vx_pd.add_point_obs(hdr_arr, - hdr_typ_str, hdr_sid_str, - hdr_ut, obs_qty_str, obs_arr, - grid, var_name.c_str()); + conf_info.vx_opt[j].vx_pd.add_point_obs( + hdr_arr, hdr_typ_str.c_str(), hdr_sid_str.c_str(), + hdr_ut, obs_qty_str.c_str(), obs_arr, + grid, var_name.c_str()); } - obs_arr[1] = grib_code; + nc_point_obs.set_grib_code_or_var_index(obs_arr, org_grib_code); } } // end for i_block_start_idx // Deallocate and clean up - if(obs_in) { - delete obs_in; - obs_in = (NcFile *) 0; - } - clear_header_data(&header_data); + nc_point_obs.close(); return; } diff --git a/met/src/tools/core/point_stat/point_stat.h b/met/src/tools/core/point_stat/point_stat.h index 9d34a7282a..dc232a52de 100644 --- a/met/src/tools/core/point_stat/point_stat.h +++ b/met/src/tools/core/point_stat/point_stat.h @@ -63,12 +63,6 @@ static const char * program_name = "point_stat"; static const char * default_config_filename = "MET_BASE/config/PointStatConfig_default"; -// Observation header length -static const int hdr_arr_len = 3; - -// Observation values length -static const int obs_arr_len = 5; - // Header columns static const char **txt_columns[n_txt] = { fho_columns, ctc_columns, cts_columns, diff --git a/met/src/tools/other/ascii2nc/Makefile.am b/met/src/tools/other/ascii2nc/Makefile.am index 7fce7b81ba..f548cb9330 100644 --- a/met/src/tools/other/ascii2nc/Makefile.am +++ b/met/src/tools/other/ascii2nc/Makefile.am @@ -31,7 +31,6 @@ ascii2nc_LDFLAGS = ${MET_LDFLAGS} ascii2nc_LDADD = -lvx_stat_out \ -lvx_statistics \ -lvx_shapedata \ - -lvx_gsl_prob \ -lvx_analysis_util \ -lvx_data2d_factory \ -lvx_data2d_nc_met \ @@ -39,22 +38,21 @@ ascii2nc_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ -lvx_data2d_nccf \ $(PYTHON_LIBS) \ - -lvx_statistics \ -lvx_data2d \ -lvx_nc_obs \ -lvx_nc_util \ -lvx_regrid \ -lvx_grid \ + -lvx_summary \ + -lvx_pb_util \ -lvx_config \ -lvx_gsl_prob \ - -lvx_pb_util \ - -lvx_cal \ + -lvx_color \ -lvx_util \ - $(PYTHON_LIBS) \ + -lvx_cal \ -lvx_math \ - -lvx_color \ -lvx_log \ - -lvx_summary \ + $(PYTHON_LIBS) \ -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas diff --git a/met/src/tools/other/ascii2nc/file_handler.cc b/met/src/tools/other/ascii2nc/file_handler.cc index f5b57aec74..106667f8d3 100644 --- a/met/src/tools/other/ascii2nc/file_handler.cc +++ b/met/src/tools/other/ascii2nc/file_handler.cc @@ -76,7 +76,7 @@ FileHandler::~FileHandler() bool FileHandler::readAsciiFiles(const vector< ConcatString > &ascii_filename_list) { - nc_obs_initialize(); + nc_point_obs.init_buffer(); // Loop through the ASCII files, reading in the observations. At the end of // this loop, all of the observations will be in the _observations vector. @@ -156,15 +156,12 @@ bool FileHandler::writeNetcdfFile(const string &nc_filename) if (!_writeObservations()) return false; - // Add variable names - if (use_var_id) write_obs_var_names(obs_vars, obs_names); - // Close the netCDF file. _closeNetcdf(); - mlog << Debug(2) << "Finished processing " << obs_vars.obs_cnt - << " observations for " << obs_vars.hdr_cnt << " headers.\n"; + mlog << Debug(2) << "Finished processing " << nc_point_obs.get_obs_cnt() + << " observations for " << nc_point_obs.get_hdr_cnt() << " headers.\n"; return true; } @@ -249,16 +246,15 @@ bool FileHandler::_openNetcdf(const string &nc_filename) // // Define the NetCDF dimensions and variables // - init_nc_dims_vars_config(obs_vars, use_var_id); - obs_vars.attr_agl = true; + nc_point_obs.set_netcdf(_ncFile, true); + // Note: use_var_id was set by the handler + nc_point_obs.init_obs_vars(use_var_id, deflate_level, true); + nc_point_obs.set_nc_out_data(_observations, &summary_obs, _summaryInfo); - nc_out_data.processed_hdr_cnt = 0; - nc_out_data.deflate_level = deflate_level; - nc_out_data.observations = _observations; - nc_out_data.summary_obs = &summary_obs; - nc_out_data.summary_info = _summaryInfo; + int obs_cnt, hdr_cnt; + nc_point_obs.get_dim_counts(&obs_cnt, &hdr_cnt); + nc_point_obs.init_netcdf(obs_cnt, hdr_cnt, _programName); - init_netcdf_output(_ncFile, obs_vars, nc_out_data, _programName); // // Initialize the header and observation record counters @@ -270,48 +266,6 @@ bool FileHandler::_openNetcdf(const string &nc_filename) } -//////////////////////////////////////////////////////////////////////// - -//bool FileHandler::_writeHdrInfo(const ConcatString &hdr_typ, -// const ConcatString &hdr_sid, -// const time_t hdr_vld, -// double lat, double lon, double elv) { -// // -// // Increment header count before writing -// // -// _hdrNum++; -// write_nc_header(obs_vars, hdr_typ, hdr_sid, hdr_vld, lat, lon, elv); -// -// return true; -//} - -//////////////////////////////////////////////////////////////////////// - -//bool FileHandler::_writeObsInfo(int gc, float prs, float hgt, float obs, -// const ConcatString &qty) { -// float obs_arr[OBS_ARRAY_LEN]; -// ConcatString obs_qty; -// -// // -// // Increment observation count before writing -// // -// _obsNum++; -// -// // -// // Build the observation array -// // -// obs_arr[0] = _hdrNum; // Index of header -// obs_arr[1] = gc; // GRIB code corresponding to the observation type -// obs_arr[2] = prs; // Pressure level (hPa) or accumulation interval (sec) -// obs_arr[3] = hgt; // Height in meters above sea level or ground level (msl or agl) -// obs_arr[4] = obs; // Observation value -// -// obs_qty = (qty.length() == 0 ? na_str : qty.text()); -// write_nc_observation(obs_vars, nc_data_buffer, obs_arr, obs_qty.text()); -// -// return true; -//} - //////////////////////////////////////////////////////////////////////// bool FileHandler::_addObservations(const Observation &obs) @@ -383,14 +337,8 @@ bool FileHandler::_addObservations(const Observation &obs) bool FileHandler::_writeObservations() { - write_observations(_ncFile, obs_vars, nc_out_data); - - int var_count = (use_var_id ? obs_names.n_elements() : 0); - if (var_count > 0) { - int unit_count = 0; - create_nc_obs_name_vars (obs_vars, _ncFile, var_count, unit_count, deflate_level); - write_obs_var_names(obs_vars, obs_names); - } + StringArray descs, units; + nc_point_obs.write_to_netcdf(obs_names, units, descs); return true; } diff --git a/met/src/tools/other/ascii2nc/file_handler.h b/met/src/tools/other/ascii2nc/file_handler.h index 5a160e3068..1a50209513 100644 --- a/met/src/tools/other/ascii2nc/file_handler.h +++ b/met/src/tools/other/ascii2nc/file_handler.h @@ -36,6 +36,7 @@ using namespace netCDF; #include "vx_summary.h" #include "nc_obs_util.h" +#include "nc_point_obs_out.h" #include "nc_summary.h" //////////////////////////////////////////////////////////////////////// @@ -85,8 +86,7 @@ class FileHandler // Variables for writing output NetCDF file NcFile *_ncFile; - NetcdfObsVars obs_vars; - NcObsOutputData nc_out_data; + MetNcPointObsOut nc_point_obs; long _nhdr; diff --git a/met/src/tools/other/ioda2nc/Makefile.am b/met/src/tools/other/ioda2nc/Makefile.am index 83d74ba5d1..5942b7460c 100644 --- a/met/src/tools/other/ioda2nc/Makefile.am +++ b/met/src/tools/other/ioda2nc/Makefile.am @@ -18,7 +18,6 @@ ioda2nc_LDFLAGS = ${MET_LDFLAGS} ioda2nc_LDADD = -lvx_stat_out \ -lvx_statistics \ -lvx_shapedata \ - -lvx_gsl_prob \ -lvx_analysis_util \ -lvx_data2d_factory \ -lvx_data2d_nc_met \ @@ -26,22 +25,21 @@ ioda2nc_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ -lvx_data2d_nccf \ $(PYTHON_LIBS) \ - -lvx_statistics \ -lvx_data2d \ -lvx_nc_obs \ -lvx_nc_util \ -lvx_regrid \ -lvx_grid \ + -lvx_pb_util \ + -lvx_summary \ -lvx_config \ -lvx_gsl_prob \ - -lvx_pb_util \ - -lvx_cal \ + -lvx_color \ -lvx_util \ - $(PYTHON_LIBS) \ -lvx_math \ - -lvx_color \ + -lvx_cal \ -lvx_log \ - -lvx_summary \ + $(PYTHON_LIBS) \ -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas $(BLIB_NAME) \ $(FLIBS) diff --git a/met/src/tools/other/ioda2nc/ioda2nc.cc b/met/src/tools/other/ioda2nc/ioda2nc.cc index a9a08722b6..f822a1b005 100644 --- a/met/src/tools/other/ioda2nc/ioda2nc.cc +++ b/met/src/tools/other/ioda2nc/ioda2nc.cc @@ -46,6 +46,7 @@ using namespace std; #include "vx_summary.h" #include "nc_obs_util.h" +#include "nc_point_obs_out.h" #include "nc_summary.h" //////////////////////////////////////////////////////////////////////// @@ -76,7 +77,6 @@ static ConcatString ncfile; // Input configuration file static ConcatString config_file; static IODA2NCConfInfo conf_info; -static NcObsOutputData nc_out_data; static Grid mask_grid; static MaskPlane mask_area; @@ -105,7 +105,7 @@ static IntArray filtered_times; static bool do_summary; static bool save_summary_only = false; static SummaryObs *summary_obs; -static NetcdfObsVars obs_vars; +static MetNcPointObsOut nc_point_obs; //////////////////////////////////////////////////////////////////////// @@ -205,7 +205,7 @@ void initialize() { n_total_obs = 0; - nc_obs_initialize(); + nc_point_obs.init_buffer(); core_dims.clear(); core_dims.add("nvars"); @@ -323,7 +323,10 @@ void open_netcdf() { } // Define netCDF variables - init_nc_dims_vars_config(obs_vars); + int deflate_level = compress_level; + if(deflate_level < 0) deflate_level = conf_info.conf.nc_compression(); + nc_point_obs.set_netcdf(f_out, true); + nc_point_obs.init_obs_vars(true, deflate_level); // Add global attributes write_netcdf_global(f_out, ncfile.text(), program_name); @@ -335,7 +338,7 @@ void open_netcdf() { void process_ioda_file(int i_pb) { int npbmsg, npbmsg_total; - int idx, i_msg, i_read, n_file_obs, i_ret, n_hdr_obs; + int idx, i_msg, i_read, n_file_obs, n_hdr_obs; int rej_typ, rej_sid, rej_vld, rej_grid, rej_poly; int rej_elv, rej_nobs; double x, y; @@ -525,7 +528,7 @@ void process_ioda_file(int i_pb) { << "trouble getting datetime\n\n"; exit(1); } - + StringArray raw_var_names; if(do_all_vars || obs_var_names.n() == 0) raw_var_names = obs_value_vars; else raw_var_names = obs_var_names; @@ -562,7 +565,7 @@ void process_ioda_file(int i_pb) { } // Initialize counts - i_ret = n_file_obs = i_msg = 0; + n_file_obs = i_msg = 0; rej_typ = rej_sid = rej_vld = rej_grid = rej_poly = 0; rej_elv = rej_nobs = 0; @@ -591,7 +594,7 @@ void process_ioda_file(int i_pb) { for(int idx=0; idx 0) { if(bin_count > 0 && (i_read+1)%bin_count == 0) { @@ -768,7 +771,7 @@ void process_ioda_file(int i_pb) { } // Store the index to the header data - obs_arr[0] = (float) get_nc_hdr_cur_index(); + obs_arr[0] = (float) nc_point_obs.get_hdr_index(); n_hdr_obs = 0; for(idx=0; idx 0) { - add_nc_header_to_array(modified_hdr_typ, hdr_sid.c_str(), hdr_vld_ut, - hdr_lat, hdr_lon, hdr_elv); + //nc_point_obs.add_header(modified_hdr_typ, hdr_sid.c_str(), hdr_vld_ut, + // hdr_lat, hdr_lon, hdr_elv); i_msg++; } else { @@ -810,8 +813,7 @@ void process_ioda_file(int i_pb) { cout << log_message << "\n"; } - int obs_buf_index = get_nc_obs_buf_index(); - if(obs_buf_index > 0) write_nc_obs_buffer(obs_buf_index); + nc_point_obs.write_observation(); if(mlog.verbosity_level() > 0) cout << "\n" << flush; @@ -831,7 +833,7 @@ void process_ioda_file(int i_pb) { << rej_elv << "\n" << "Rejected based on zero observations\t= " << rej_nobs << "\n" - << "Total Records retained\t\t= " + << "Total Records retained\t\t\t= " << i_msg << "\n" << "Total observations retained or derived\t= " << n_file_obs << "\n"; @@ -898,22 +900,16 @@ void process_ioda_file(int i_pb) { //////////////////////////////////////////////////////////////////////// void write_netcdf_hdr_data() { + int obs_cnt, hdr_cnt; + const long hdr_count = (long) nc_point_obs.get_hdr_index(); static const string method_name = "\nwrite_netcdf_hdr_data()"; - const long hdr_count = (long) get_nc_hdr_cur_index(); - int deflate_level = compress_level; - if(deflate_level < 0) deflate_level = conf_info.conf.nc_compression(); - - nc_out_data.processed_hdr_cnt = hdr_count; - nc_out_data.deflate_level = deflate_level; - nc_out_data.observations = observations; - nc_out_data.summary_obs = summary_obs; - nc_out_data.summary_info = conf_info.getSummaryInfo(); - - init_netcdf_output(f_out, obs_vars, nc_out_data, program_name); + nc_point_obs.set_nc_out_data(observations, summary_obs, conf_info.getSummaryInfo()); + nc_point_obs.get_dim_counts(&obs_cnt, &hdr_cnt); + nc_point_obs.init_netcdf(obs_cnt, hdr_cnt, program_name); // Check for no messages retained - if(obs_vars.hdr_cnt <= 0) { + if(hdr_cnt <= 0) { mlog << Error << method_name << " -> " << "No IODA reocrds retained. Nothing to write.\n\n"; // Delete the NetCDF file @@ -922,8 +918,6 @@ void write_netcdf_hdr_data() { } // Make sure all obs data is processed before handling header - write_observations(f_out, obs_vars, nc_out_data); - StringArray nc_var_name_arr; StringArray nc_var_unit_arr; StringArray nc_var_desc_arr; @@ -940,10 +934,7 @@ void write_netcdf_hdr_data() { nc_var_desc_arr.add(obs_var_descs[i]); } - create_nc_obs_name_vars(obs_vars, f_out, var_count, units_count, deflate_level); - write_obs_var_names(obs_vars, nc_var_name_arr); - write_obs_var_units(obs_vars, nc_var_unit_arr); - write_obs_var_descriptions(obs_vars, nc_var_desc_arr); + nc_point_obs.write_to_netcdf(nc_var_name_arr, nc_var_unit_arr, nc_var_desc_arr); return; } @@ -981,6 +972,8 @@ void addObservation(const float *obs_arr, const ConcatString &hdr_typ, void clean_up() { + nc_point_obs.close(); + if(f_out) { delete f_out; f_out = (NcFile *) 0; diff --git a/met/src/tools/other/lidar2nc/Makefile.am b/met/src/tools/other/lidar2nc/Makefile.am index 118ea7efd4..9563167eee 100644 --- a/met/src/tools/other/lidar2nc/Makefile.am +++ b/met/src/tools/other/lidar2nc/Makefile.am @@ -45,8 +45,11 @@ lidar2nc_LDADD = -lvx_shapedata \ -lvx_grid \ -lvx_util \ -lvx_config \ + -lvx_gsl_prob \ -lvx_math \ -lvx_cal \ -lvx_log \ + $(PYTHON_LIBS) \ + -lvx_summary \ -lmfhdf -ldf -ljpeg \ -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas -lz diff --git a/met/src/tools/other/lidar2nc/lidar2nc.cc b/met/src/tools/other/lidar2nc/lidar2nc.cc index 627c1f70c6..547692cf24 100644 --- a/met/src/tools/other/lidar2nc/lidar2nc.cc +++ b/met/src/tools/other/lidar2nc/lidar2nc.cc @@ -60,20 +60,21 @@ using namespace std; #include "calipso_5km.h" #include "nc_obs_util.h" +#include "nc_point_obs_out.h" //////////////////////////////////////////////////////////////////////// -struct NcHeaderData *header_data = get_hdr_data_buffer(); - static ConcatString program_name; static CommandLine cline; static const int na_len = strlen(na_str); -static NetcdfObsVars obs_vars; static IntArray valid_times; +static NcFile *ncf; +static MetNcPointObsOut nc_point_obs; + //////////////////////////////////////////////////////////////////////// @@ -96,7 +97,7 @@ static void set_compress (const StringArray &); static void process_calipso_file (NcFile *, const char * filename); -static void write_nc_record(NetcdfObsVars a_obs_vars, const float * f, int qc_value = -1); +static void write_nc_record(const float * f, int qc_value = -1); //////////////////////////////////////////////////////////////////////// @@ -136,7 +137,8 @@ if ( output_filename.empty() ) usage(); // open the output file // -static NcFile *ncf = open_ncfile(output_filename.text(), true); +ncf = open_ncfile(output_filename.text(), true); +nc_point_obs.set_netcdf(ncf); // // process the lidar file @@ -146,6 +148,7 @@ mlog << Debug(1) << "Processing Lidar File: " << cline[0] << "\n"; process_calipso_file(ncf, cline[0].c_str()); +nc_point_obs.close(); // // done @@ -261,7 +264,6 @@ return ( t ); //////////////////////////////////////////////////////////////////////// - void process_calipso_file(NcFile * out, const char * filename) { @@ -271,7 +273,7 @@ int hdf_sd_id; int n_data; NcDim nc_dim; NcVar nc_lat_var, nc_lon_var, nc_data_var, nc_time_var; - +const char *method_name = "process_calipso_file() "; // // open hdf file @@ -317,7 +319,7 @@ buf_size = max(buf_size, hdr_vld_bytes); buf_size = max(buf_size, hdr_arr_bytes); -mlog << Debug(1) << "Writing MET File:\t" << output_filename << "\n"; +mlog << Debug(1) << method_name << "Writing MET File:\t" << output_filename << "\n"; // @@ -330,23 +332,18 @@ mlog << Debug(1) << "Writing MET File:\t" << output_filename << "\n"; // // add the variables to the netcdf file // - + int obs_cnt = 0; bool use_var_id = false; - init_nc_dims_vars_config(obs_vars, use_var_id); - obs_vars.attr_agl = true; - create_nc_hdr_vars(obs_vars, out, n_data, deflate_level); - create_nc_obs_vars(obs_vars, out, deflate_level, use_var_id); - - if (!IS_INVALID_NC(obs_vars.strl2_dim)) { - NcDim str_dim; - string dim_name = GET_NC_NAME(obs_vars.strl2_dim); - str_dim = get_nc_dim(&obs_vars.hdr_typ_var, dim_name); - } + NetcdfObsVars *obs_vars = nc_point_obs.get_obs_vars(); + nc_point_obs.init_buffer(); + nc_point_obs.init_obs_vars(use_var_id, deflate_level, true); + //nc_point_obs.get_dim_counts(&obs_cnt, &hdr_cnt); + nc_point_obs.init_netcdf(obs_cnt, nhdr_dim_size, program_name); + mlog << Debug(4) << method_name << " hdr_dim: " << nhdr_dim_size << "\n"; // // global attributes for netcdf output file // - const unixtime now = time(0); int month, day, year, hour, minute, second; ConcatString s; @@ -385,8 +382,7 @@ mlog << Debug(2) << "Processing Lidar points\t= " << n_data << "\n"; memset(ibuf, 0, n_data*sizeof(int)); -header_data->typ_array.add(hdr_typ_string); -obs_vars.hdr_typ_var.putVar(ibuf); +obs_vars->hdr_typ_var.putVar(ibuf); // // populate the hdr_sid variable @@ -394,8 +390,8 @@ obs_vars.hdr_typ_var.putVar(ibuf); memset(ibuf, 0, n_data*sizeof(int)); -header_data->sid_array.add(na_str); -obs_vars.hdr_sid_var.putVar(ibuf); +obs_vars->hdr_sid_var.putVar(ibuf); +nc_point_obs.add_header_strings(hdr_typ_string, na_str); // // populate the obs_qty variable @@ -435,9 +431,9 @@ for (j=0; jhdr_lat_var.putVar(fhdr_lat_buf); +obs_vars->hdr_lon_var.putVar(fhdr_lon_buf); +obs_vars->hdr_elv_var.putVar(fhdr_elv_buf); delete [] fhdr_lat_buf; delete [] fhdr_lon_buf; @@ -473,14 +469,15 @@ for (j=0; jvld_array.add(junk); + //header_data.vld_array.add(junk); + nc_point_obs.add_header_vld(junk); } ibuf[j] = v_idx; } // for j -obs_vars.hdr_vld_var.putVar(ibuf); +obs_vars->hdr_vld_var.putVar(ibuf); delete[] ibuf; @@ -502,62 +499,60 @@ for (j=0; j obs_vector; static vector< ConcatString > md_files; @@ -144,7 +145,7 @@ int main(int argc, char *argv[]) { // process_command_line(argc, argv); - nc_obs_initialize(); + nc_point_obs.init_buffer(); // // Process the MADIS file @@ -155,9 +156,7 @@ int main(int argc, char *argv[]) { process_madis_file((*it_mdfile).c_str()); } - bool use_var_id = true; - bool do_header = false; - int nhdr = get_nc_hdr_cur_index(); + int nhdr = nc_point_obs.get_obs_index(); if (conf_info.getSummaryInfo().flag) { int summmary_hdr_cnt = 0; @@ -172,7 +171,8 @@ int main(int argc, char *argv[]) { } setup_netcdf_out(nhdr); - write_observations(f_out, obs_vars, nc_out_data); + StringArray obs_names, descs, units; + nc_point_obs.write_to_netcdf(obs_names, units, descs); // // Deallocate memory and clean up @@ -354,6 +354,8 @@ void clean_up() { if (summary_obs) delete summary_obs; + nc_point_obs.close(); + // // Close the output NetCDF file // @@ -387,19 +389,22 @@ void setup_netcdf_out(int nhdr) { } bool use_var_id = false; - init_nc_dims_vars_config(obs_vars, use_var_id); - obs_vars.obs_cnt = obs_vector.size(); - mlog << Debug(5) << "setup_netcdf_out() nhdr:\t" << nhdr - << "\tobs_cnt:\t" << obs_vars.obs_cnt << "\n"; + int obs_cnt, hdr_cnt; + nc_point_obs.set_netcdf(f_out, true); + nc_point_obs.set_using_var_id(use_var_id); - nc_out_data.processed_hdr_cnt = 0; - nc_out_data.deflate_level = compress_level; - nc_out_data.observations = obs_vector; - nc_out_data.summary_obs = summary_obs; - nc_out_data.summary_info = conf_info.getSummaryInfo(); + NetcdfObsVars *obs_vars = nc_point_obs.get_obs_vars(); + obs_vars->deflate_level = compress_level; - init_netcdf_output(f_out, obs_vars, nc_out_data, program_name); + //obs_vars.reset(use_var_id); + obs_vars->obs_cnt = obs_vector.size(); + mlog << Debug(5) << "setup_netcdf_out() nhdr:\t" << nhdr + << "\tobs_cnt:\t" << obs_vars->obs_cnt << "\n"; + nc_point_obs.set_nc_out_data(obs_vector, summary_obs, conf_info.getSummaryInfo()); + nc_point_obs.get_dim_counts(&obs_cnt, &hdr_cnt); + nc_point_obs.init_netcdf(obs_cnt, hdr_cnt, program_name); + // // Add the command line arguments that were applied. // @@ -744,7 +749,7 @@ void process_madis_metar(NcFile *&f_in) { double tmp_dbl; time_t hdr_vld; ConcatString hdr_typ, hdr_sid; - float hdr_arr[hdr_arr_len], obs_arr[obs_arr_len], conversion; + float hdr_arr[HDR_ARRAY_LEN], obs_arr[OBS_ARRAY_LEN], conversion; float wdir, wind, ugrd, vgrd; int count; StringArray missing_vars, missing_qty_vars; @@ -1140,18 +1145,16 @@ void process_madis_metar(NcFile *&f_in) { // Snow Cover obs_arr[2] = bad_data_float; obs_arr[4] = snowCover[i_idx]; - //count += process_obs(66, conversion, obs_arr, snowCoverQty[i_idx], - // snowCover_var, hdr_typ, hdr_sid, hdr_vld, - // hdr_arr[0], hdr_arr[1], hdr_arr[2]); - process_obs(66, conversion, obs_arr, snowCoverQty[i_idx], - snowCover_var, hdr_typ, hdr_sid, hdr_vld, - hdr_arr[0], hdr_arr[1], hdr_arr[2]); + count += process_obs(66, conversion, obs_arr, snowCoverQty[i_idx], + snowCover_var, hdr_typ, hdr_sid, hdr_vld, + hdr_arr[0], hdr_arr[1], hdr_arr[2]); } } // end for i_hdr print_rej_counts(); + mlog << Debug(5) << " Added " << count << "data\n"; // // Cleanup @@ -1172,7 +1175,7 @@ void process_madis_raob(NcFile *&f_in) { char qty; time_t hdr_vld; ConcatString hdr_typ, hdr_sid; - float hdr_arr[hdr_arr_len], obs_arr[obs_arr_len], conversion; + float hdr_arr[HDR_ARRAY_LEN], obs_arr[OBS_ARRAY_LEN], conversion; float wdir, wind, ugrd, vgrd; int count; StringArray missing_vars, missing_qty_vars; @@ -1594,7 +1597,7 @@ void process_madis_raob(NcFile *&f_in) { hdr_vld = (time_t)tmp_dbl; - hdr_idx = get_nc_hdr_cur_index(); + hdr_idx = nc_point_obs.get_obs_index(); // // Process the station name. @@ -1985,7 +1988,7 @@ void process_madis_profiler(NcFile *&f_in) { double tmp_dbl; time_t hdr_vld; ConcatString hdr_typ, hdr_sid; - float hdr_arr[hdr_arr_len], obs_arr[obs_arr_len], conversion; + float hdr_arr[HDR_ARRAY_LEN], obs_arr[OBS_ARRAY_LEN], conversion; float pressure; int count; StringArray missing_vars, missing_qty_vars; @@ -2170,7 +2173,7 @@ void process_madis_profiler(NcFile *&f_in) { hdr_vld = (time_t)tmp_dbl; - hdr_idx = get_nc_hdr_cur_index(); + hdr_idx = nc_point_obs.get_obs_index(); // // Initialize the observation array: hdr_id @@ -2243,7 +2246,7 @@ void process_madis_maritime(NcFile *&f_in) { double tmp_dbl; time_t hdr_vld; ConcatString hdr_typ, hdr_sid; - float hdr_arr[hdr_arr_len], obs_arr[obs_arr_len], conversion; + float hdr_arr[HDR_ARRAY_LEN], obs_arr[OBS_ARRAY_LEN], conversion; float pressure; int count; StringArray missing_vars, missing_qty_vars; @@ -2504,7 +2507,7 @@ void process_madis_maritime(NcFile *&f_in) { hdr_vld = (time_t)tmp_dbl; - hdr_idx = get_nc_hdr_cur_index(); + hdr_idx = nc_point_obs.get_obs_index(); // @@ -2595,18 +2598,16 @@ void process_madis_maritime(NcFile *&f_in) { // APCP_24 obs_arr[2] = 86400; obs_arr[4] = precip24Hour_arr[i_idx]; - //count += process_obs(61, conversion, obs_arr, precip24HourQty_arr[i_idx], - // in_precip24Hour_var, hdr_typ, hdr_sid, hdr_vld, - // hdr_arr[0], hdr_arr[1], hdr_arr[2]); - process_obs(61, conversion, obs_arr, precip24HourQty_arr[i_idx], - in_precip24Hour_var, hdr_typ, hdr_sid, hdr_vld, - hdr_arr[0], hdr_arr[1], hdr_arr[2]); + count += process_obs(61, conversion, obs_arr, precip24HourQty_arr[i_idx], + in_precip24Hour_var, hdr_typ, hdr_sid, hdr_vld, + hdr_arr[0], hdr_arr[1], hdr_arr[2]); } } // end for i_hdr print_rej_counts(); + mlog << Debug(5) << " Added " << count << "data\n"; // // Cleanup @@ -2625,7 +2626,7 @@ void process_madis_mesonet(NcFile *&f_in) { double tmp_dbl; time_t hdr_vld; ConcatString hdr_typ, hdr_sid; - float hdr_arr[hdr_arr_len], obs_arr[obs_arr_len], conversion; + float hdr_arr[HDR_ARRAY_LEN], obs_arr[OBS_ARRAY_LEN], conversion; float wdir, wind, ugrd, vgrd; int count; StringArray missing_vars, missing_qty_vars; @@ -2981,7 +2982,7 @@ void process_madis_mesonet(NcFile *&f_in) { if(is_bad_data(tmp_dbl)) continue; hdr_vld = (time_t)tmp_dbl; - hdr_idx = get_nc_hdr_cur_index(); + hdr_idx = nc_point_obs.get_obs_index(); // // Initialize the observation array: hdr_id, gc, lvl, hgt, ob @@ -3204,7 +3205,7 @@ void process_madis_acarsProfiles(NcFile *&f_in) { char qty; time_t hdr_vld; ConcatString hdr_typ, hdr_sid; - float hdr_arr[hdr_arr_len], obs_arr[obs_arr_len], conversion; + float hdr_arr[HDR_ARRAY_LEN], obs_arr[OBS_ARRAY_LEN], conversion; float pressure, wdir, wind, ugrd, vgrd; int count; StringArray missing_vars, missing_qty_vars; @@ -3428,7 +3429,7 @@ void process_madis_acarsProfiles(NcFile *&f_in) { i_cnt++; mlog << Debug(3) << " Mandatory Level: " << i_lvl << "\n"; - hdr_idx = get_nc_hdr_cur_index(); + hdr_idx = nc_point_obs.get_obs_index(); // // Use cur to index into the NetCDF variables. diff --git a/met/src/tools/other/madis2nc/madis2nc.h b/met/src/tools/other/madis2nc/madis2nc.h index 142698193e..74c03ed917 100644 --- a/met/src/tools/other/madis2nc/madis2nc.h +++ b/met/src/tools/other/madis2nc/madis2nc.h @@ -76,9 +76,6 @@ static const char *DEFAULT_CONFIG_FILENAME = "MET_BASE/config/Madis2NcConfig_default"; static const float fill_value = -9999.f; -static const int strl_len = 16; // Length of "YYYYMMDD_HHMMSS" -static const int hdr_arr_len = 3; // Observation header length -static const int obs_arr_len = 5; // Observation values length //////////////////////////////////////////////////////////////////////// // @@ -146,7 +143,6 @@ int processed_count; //////////////////////////////////////////////////////////////////////// static Madis2NcConfInfo conf_info; -static NcObsOutputData nc_out_data; static bool do_summary; static bool save_summary_only = false; diff --git a/met/src/tools/other/pb2nc/Makefile.am b/met/src/tools/other/pb2nc/Makefile.am index 6eb653a1d0..ce99c025a1 100644 --- a/met/src/tools/other/pb2nc/Makefile.am +++ b/met/src/tools/other/pb2nc/Makefile.am @@ -42,22 +42,21 @@ pb2nc_LDADD = -lvx_stat_out \ -lvx_data2d_nc_pinterp \ -lvx_data2d_nccf \ $(PYTHON_LIBS) \ - -lvx_statistics \ -lvx_data2d \ -lvx_nc_obs \ -lvx_nc_util \ -lvx_regrid \ -lvx_grid \ + -lvx_pb_util \ + -lvx_summary \ -lvx_config \ -lvx_gsl_prob \ - -lvx_pb_util \ - -lvx_cal \ + -lvx_color \ -lvx_util \ - $(PYTHON_LIBS) \ -lvx_math \ - -lvx_color \ + -lvx_cal \ -lvx_log \ - -lvx_summary \ + $(PYTHON_LIBS) \ -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas $(BLIB_NAME) \ $(FLIBS) diff --git a/met/src/tools/other/pb2nc/pb2nc.cc b/met/src/tools/other/pb2nc/pb2nc.cc index 1113290c76..a374bfc6f0 100644 --- a/met/src/tools/other/pb2nc/pb2nc.cc +++ b/met/src/tools/other/pb2nc/pb2nc.cc @@ -88,6 +88,7 @@ using namespace std; #include "vx_summary.h" #include "nc_obs_util.h" +#include "nc_point_obs_out.h" #include "nc_summary.h" //////////////////////////////////////////////////////////////////////// @@ -130,11 +131,6 @@ static const int mxr8nm = 8; // Maximum number of BUFR variable types // Length of the "YYYYMMDD_HHMMSS" string -static const int strl_len = 16; -// Observation header length -static const int hdr_arr_len = 3; -// Observation values length -static const int obs_arr_len = 5; static const int COUNT_THRESHOLD = 5; // File unit number for opening the PrepBufr file @@ -204,7 +200,7 @@ static ConcatString ncfile; // Input configuration file static ConcatString config_file; static PB2NCConfInfo conf_info; -static NcObsOutputData nc_out_data; +static MetNcPointObsOut nc_point_obs; // Beginning and ending retention times static unixtime valid_beg_ut, valid_end_ut; @@ -217,7 +213,6 @@ static int nmsg_percent = -1; static bool dump_flag = false; static ConcatString dump_dir = (string)"."; -static bool obs_to_vector = true; static bool do_all_vars = false; static bool override_vars = false; static bool collect_metadata = false; @@ -295,8 +290,6 @@ static map variableTypeMap; static bool do_summary; static SummaryObs *summary_obs; -static NetcdfObsVars obs_vars; - //////////////////////////////////////////////////////////////////////// @@ -471,7 +464,7 @@ void initialize() { n_total_obs = 0; - nc_obs_initialize(); + nc_point_obs.init_buffer(); prepbufr_vars.clear(); prepbufr_hdrs.clear(); @@ -784,18 +777,11 @@ void open_netcdf() { } // Define netCDF variables - init_nc_dims_vars_config(obs_vars); - obs_vars.attr_pb2nc = true; - - if (!obs_to_vector) { - - create_nc_obs_vars(obs_vars, f_out, - (compress_level >= 0 ? compress_level : - conf_info.conf.nc_compression())); - - // Add global attributes - write_netcdf_global(f_out, ncfile.text(), program_name); - } + bool use_var_id = true; + int deflate_level = compress_level; + if (deflate_level < 0) deflate_level = conf_info.conf.nc_compression(); + nc_point_obs.set_netcdf(f_out, true); + nc_point_obs.init_obs_vars(use_var_id, deflate_level); return; } @@ -835,7 +821,7 @@ void process_pbfile(int i_pb) { unixtime hdr_vld_ut = (unixtime) 0; float quality_mark, dl_category; - float obs_arr[obs_arr_len]; + float obs_arr[OBS_ARRAY_LEN]; float pqtzuv[mxr8vt], pqtzuv_qty[mxr8vt]; const int debug_level_for_performance = 3; @@ -1024,7 +1010,7 @@ void process_pbfile(int i_pb) { diff_file_time_count = 0; cycle_minute = missing_cycle_minute; // initialize - for (int idx=0; idx mxr8lv) { @@ -1757,7 +1743,7 @@ void process_pbfile(int i_pb) { } mlog << Debug(10) << "var: " << var_name << " nlev2: " << nlev2 << ", vIdx: " << vIdx << ", obs_data_idx: " - << get_nc_obs_buf_index() << ", nlev: " << nlev << "\n"; + << nc_point_obs.get_obs_index() << ", nlev: " << nlev << "\n"; // Search through the vertical levels for(lv=0; lv 0) { - add_nc_header_to_array(modified_hdr_typ, hdr_sid.c_str(), hdr_vld_ut, - hdr_lat, hdr_lon, hdr_elv); + nc_point_obs.add_header(modified_hdr_typ, hdr_sid.c_str(), hdr_vld_ut, + hdr_lat, hdr_lon, hdr_elv); if (is_prepbufr) { - add_nc_header_prepbufr(pb_report_type, in_report_type, instrument_type); + nc_point_obs.add_header_prepbufr(pb_report_type, in_report_type, instrument_type); } i_msg++; @@ -1911,8 +1897,7 @@ void process_pbfile(int i_pb) { } mlog << Warning << "\n"; } - int obs_buf_index = get_nc_obs_buf_index(); - if (obs_buf_index > 0) write_nc_obs_buffer(obs_buf_index); + nc_point_obs.write_observation(); if(mlog.verbosity_level() > 0) cout << "\n" << flush; @@ -2399,80 +2384,37 @@ void process_pbfile_metadata(int i_pb) { void write_netcdf_hdr_data() { long dim_count, pb_hdr_count; bool is_prepbufr = is_prepbufr_file(&event_names); - static const string method_name = "\nwrite_netcdf_hdr_data()"; + TimeSummaryInfo summary_info = conf_info.getSummaryInfo(); + static const string method_name = "write_netcdf_hdr_data() "; - pb_hdr_count = (long) get_nc_hdr_cur_index(); - if (obs_to_vector) { - int deflate_level = compress_level; - if (deflate_level < 0) deflate_level = conf_info.conf.nc_compression(); + pb_hdr_count = (long) nc_point_obs.get_hdr_index(); + nc_point_obs.set_nc_out_data(observations, summary_obs, + summary_info, pb_hdr_count); - nc_out_data.processed_hdr_cnt = pb_hdr_count; - nc_out_data.deflate_level = deflate_level; - nc_out_data.observations = observations; - nc_out_data.summary_obs = summary_obs; - nc_out_data.summary_info = conf_info.getSummaryInfo(); - - init_netcdf_output(f_out, obs_vars, nc_out_data, program_name); - dim_count = obs_vars.hdr_cnt; - } - else { - dim_count = pb_hdr_count; - if (do_summary) { - int summary_hdr_cnt = summary_obs->countSummaryHeaders(); - if (save_summary_only) - dim_count = summary_hdr_cnt; - else - dim_count += summary_hdr_cnt; - } - } + int obs_cnt, hdr_cnt; + nc_point_obs.get_dim_counts(&obs_cnt, &hdr_cnt); + dim_count = hdr_cnt; // Check for no messages retained if(dim_count <= 0) { - mlog << Error << "\n" << method_name << " -> " + mlog << Error << "\n" << method_name << "-> " << "No PrepBufr messages retained. Nothing to write.\n\n"; // Delete the NetCDF file remove_temp_file(ncfile); exit(1); } - int deflate_level = compress_level; - if (deflate_level < 0) deflate_level = conf_info.conf.nc_compression(); + nc_point_obs.get_obs_vars()->attr_pb2nc = true; + nc_point_obs.init_netcdf(obs_cnt, hdr_cnt, program_name); + if (is_prepbufr) { - if (!nc_out_data.summary_info.flag || nc_out_data.summary_info.raw_data) - create_nc_pb_hdrs(obs_vars, f_out, pb_hdr_count, deflate_level); + if (!summary_info.flag || summary_info.raw_data) { + nc_point_obs.create_pb_hdrs(pb_hdr_count); + } } // Make sure all obs data is processed before handling header - if (obs_to_vector) { - write_observations(f_out, obs_vars, nc_out_data); - } - else { - if (do_summary) { - // Write out the summary data - if (save_summary_only) reset_header_buffer(pb_hdr_count, true); - write_nc_observations(obs_vars, summary_obs->getSummaries()); - mlog << Debug(4) << "write_netcdf_hdr_data obs count: " - << (int)summary_obs->getObservations().size() - << " summary count: " << (int)summary_obs->getSummaries().size() - << " header count: " << dim_count - << " summary header count: " << (dim_count-pb_hdr_count) << "\n"; - - TimeSummaryInfo summaryInfo = conf_info.getSummaryInfo(); - if (summaryInfo.flag) { - write_summary_attributes(f_out, summaryInfo); - } - } - - create_nc_hdr_vars(obs_vars, f_out, dim_count, deflate_level); - create_nc_table_vars(obs_vars, f_out, deflate_level); - - // Write out the header data - write_nc_arr_headers(obs_vars); - if (get_nc_hdr_cur_index() > 0) { - // Write out the remaining header data - write_nc_buf_headers(obs_vars); - } - } + nc_point_obs.write_observation(); StringArray nc_var_name_arr; StringArray nc_var_unit_arr; @@ -2512,11 +2454,9 @@ void write_netcdf_hdr_data() { } // end for i - dim_count = bufr_obs_name_arr.n_elements(); - create_nc_obs_name_vars (obs_vars, f_out, dim_count, dim_count, deflate_level); - write_obs_var_names (obs_vars, nc_var_name_arr); - write_obs_var_units (obs_vars, nc_var_unit_arr); - write_obs_var_descriptions (obs_vars, nc_var_desc_arr); + bool using_obs_vars = true; + nc_point_obs.write_to_netcdf(nc_var_name_arr, nc_var_unit_arr, + nc_var_desc_arr); return; } @@ -2538,38 +2478,20 @@ void addObservation(const float *obs_arr, const ConcatString &hdr_typ, obs_qty.format("%d", quality_code); } - if (obs_to_vector) { - int var_index = obs_arr[1]; - //assert(var_index >= 0 && strlen("Variable index can't be negative")); - string var_name = bufr_obs_name_arr[var_index]; - Observation obs = Observation(hdr_typ.text(), - hdr_sid.text(), - hdr_vld, - hdr_lat, hdr_lon, hdr_elv, - obs_qty.text(), - var_index, - obs_arr[2], obs_arr[3], obs_arr[4], - var_name); - obs.setHeaderIndex(obs_arr[0]); - observations.push_back(obs); - if (do_summary) summary_obs->addObservationObj(obs); - } - else { - if (!save_summary_only) - write_nc_observation(obs_vars, obs_arr, obs_qty.text()); - if (do_summary) { - string var_name = bufr_obs_name_arr[(obs_arr[1])]; - conf_info.getSummaryInfo(); - summary_obs->addObservation( - hdr_typ.text(), - hdr_sid.text(), - hdr_vld, - hdr_lat, hdr_lon, hdr_elv, - obs_qty.text(), - obs_arr[1], obs_arr[2], obs_arr[3], obs_arr[4], - var_name); - } - } + int var_index = obs_arr[1]; + //assert(var_index >= 0 && strlen("Variable index can't be negative")); + string var_name = bufr_obs_name_arr[var_index]; + Observation obs = Observation(hdr_typ.text(), + hdr_sid.text(), + hdr_vld, + hdr_lat, hdr_lon, hdr_elv, + obs_qty.text(), + var_index, + obs_arr[2], obs_arr[3], obs_arr[4], + var_name); + obs.setHeaderIndex(obs_arr[0]); + observations.push_back(obs); + if (do_summary) summary_obs->addObservationObj(obs); return; } @@ -2577,6 +2499,8 @@ void addObservation(const float *obs_arr, const ConcatString &hdr_typ, void clean_up() { + nc_point_obs.close(); + if(f_out) { delete f_out; f_out = (NcFile *) 0; @@ -3291,7 +3215,7 @@ void interpolate_pqtzuv(float *prev_pqtzuv, float *cur_pqtzuv, float *next_pqtzu void merge_records(float *first_pqtzuv, map pqtzuv_map_pivot, map pqtzuv_map_aux, map &pqtzuv_map_merged) { - float cur_pres, next_pres; + float cur_pres; float *cur_pqtzuv, *next_pqtzuv, *prev_pqtzuv; float *pqtzuv_merged; std::map::iterator it_pivot, it_aux; @@ -3311,7 +3235,6 @@ void merge_records(float *first_pqtzuv, map pqtzuv_map_pivot, for (; it_aux!=pqtzuv_map_aux.end(); ++it_aux) { // Skip the records below the first mathcing/interpolated level if (it_pivot->first < it_aux->first) { - next_pres = it_aux->first; break; } prev_pqtzuv = (float *)it_aux->second; diff --git a/met/src/tools/other/plot_point_obs/Makefile.am b/met/src/tools/other/plot_point_obs/Makefile.am index 77e7c1711d..fffb055719 100644 --- a/met/src/tools/other/plot_point_obs/Makefile.am +++ b/met/src/tools/other/plot_point_obs/Makefile.am @@ -21,29 +21,29 @@ plot_point_obs_LDADD = -lvx_statistics \ -lvx_data2d_grib $(GRIB2_LIBS) \ -lvx_data2d_nc_pinterp \ -lvx_data2d_nccf \ - -lvx_nc_util \ + $(PYTHON_LIBS) \ -lvx_data2d \ - -lvx_nc_obs \ - -lvx_nc_util \ + -lvx_nc_util \ + -lvx_statistics \ + -lvx_nc_obs \ + -lvx_nc_util \ -lvx_gnomon \ -lvx_regrid \ -lvx_plot_util \ -lvx_render \ -lvx_pxm \ - -lvx_color \ -lvx_ps \ -lvx_afm \ -lvx_nav \ -lvx_grid \ -lvx_config \ -lvx_gsl_prob \ - -lvx_cal \ + -lvx_color \ -lvx_util \ - $(PYTHON_LIBS) \ - -lvx_statistics \ -lvx_math \ - -lvx_color \ + -lvx_cal \ -lvx_log \ + $(PYTHON_LIBS) \ -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas EXTRA_DIST = plot_point_obs.h \ plot_point_obs_conf_info.h diff --git a/met/src/tools/other/plot_point_obs/plot_point_obs.cc b/met/src/tools/other/plot_point_obs/plot_point_obs.cc index 6ffee6c271..1ba1b9938b 100644 --- a/met/src/tools/other/plot_point_obs/plot_point_obs.cc +++ b/met/src/tools/other/plot_point_obs/plot_point_obs.cc @@ -65,6 +65,7 @@ using namespace std; #include "vx_render.h" #include "vx_plot_util.h" #include "nc_obs_util.h" +#include "nc_point_obs_in.h" //////////////////////////////////////////////////////////////////////// @@ -147,272 +148,108 @@ int main(int argc, char *argv[]) { //////////////////////////////////////////////////////////////////////// void process_point_obs(const char *point_obs_filename) { - int h, v; - int obs_hid_block[DEF_NC_BUFFER_SIZE]; - int obs_vid_block[DEF_NC_BUFFER_SIZE]; - int obs_qty_block[DEF_NC_BUFFER_SIZE]; - float obs_lvl_block[DEF_NC_BUFFER_SIZE]; - float obs_hgt_block[DEF_NC_BUFFER_SIZE]; - float obs_val_block[DEF_NC_BUFFER_SIZE]; - float obs_arr_block[DEF_NC_BUFFER_SIZE][OBS_ARRAY_LEN]; + int h, v, i_obs; + const char *method_name = "\nprocess_point_obs() -> "; + const char *method_name_s = "\nprocess_point_obs() "; // Open the netCDF point observation file mlog << Debug(1) << "Reading point observation file: " << point_obs_filename << "\n"; - NcFile * f_in = open_ncfile(point_obs_filename); + MetNcPointObsIn nc_point_obs; + if(!nc_point_obs.open(point_obs_filename)) { + nc_point_obs.close(); - if(!f_in || IS_INVALID_NC_P(f_in)) { - mlog << Error << "\nprocess_point_obs() -> " + mlog << Error << "\n" << method_name << "trouble opening point observation file " << point_obs_filename << ".\n\n"; - delete f_in; - f_in = (NcFile *) 0; exit(1); } // Read the dimensions and variables - NetcdfObsVars obsVars; - read_nc_dims_vars(obsVars, f_in); - bool use_var_id = obsVars.use_var_id; - bool use_qty_idx = IS_VALID_NC(obsVars.obs_qty_tbl_var); + nc_point_obs.read_dim_headers(); + nc_point_obs.check_nc(point_obs_filename, method_name_s); // exit if missing dims/vars + nc_point_obs.read_obs_data(); + + bool use_var_id = nc_point_obs.is_using_var_id(); // Print warning about ineffective command line arguments if(use_var_id && ivar.n() != 0) { - mlog << Warning << "\n-gc option is ignored!\n\n"; + mlog << Warning << "\n" << method_name << "-gc option is ignored!\n\n"; } if(!use_var_id && svar.n() != 0) { - mlog << Warning << "\n-obs_var option is ignored!\n\n"; + mlog << Warning << "\n" << method_name << "-obs_var option is ignored!\n\n"; } - if(IS_INVALID_NC(obsVars.hdr_dim) || - IS_INVALID_NC(obsVars.obs_dim) || - IS_INVALID_NC(obsVars.strl_dim) || - IS_INVALID_NC(obsVars.hdr_typ_var) || - IS_INVALID_NC(obsVars.hdr_sid_var) || - IS_INVALID_NC(obsVars.hdr_vld_var)) { - mlog << Error << "\nprocess_point_obs() -> " - << "trouble reading point observation file " - << point_obs_filename << ".\n\n"; - exit(1); - } - if(is_version_less_than_1_02(f_in)) { - if(IS_INVALID_NC(obsVars.hdr_arr_dim) || - IS_INVALID_NC(obsVars.obs_arr_dim) || - IS_INVALID_NC(obsVars.hdr_arr_var) || - IS_INVALID_NC(obsVars.obs_arr_var)) { - mlog << Error << "\nprocess_point_obs() -> " - << "trouble reading point observation file " - << point_obs_filename << "(2D variables).\n\n"; - exit(1); - } - } - else { - if(IS_INVALID_NC(obsVars.hdr_lat_var) || - IS_INVALID_NC(obsVars.hdr_typ_tbl_var) || - IS_INVALID_NC(obsVars.obs_qty_tbl_var) || - IS_INVALID_NC(obsVars.obs_val_var)) { - mlog << Error << "\nprocess_point_obs() -> " - << "trouble reading point observation file " - << point_obs_filename << "(header or obs).\n\n"; - exit(1); - } - } - - long nhdr_count = get_dim_size(&obsVars.hdr_dim); - long nobs_count = get_dim_size(&obsVars.obs_dim); + long nhdr_count = nc_point_obs.get_hdr_cnt(); + long nobs_count = nc_point_obs.get_obs_cnt(); mlog << Debug(2) << "Processing " << nobs_count << " observations at " << nhdr_count << " locations.\n"; // Get the corresponding header: // message type, staton_id, valid_time, and lat/lon/elv - NcHeaderData header_data = get_nc_hdr_data(obsVars); - bool use_hdr_arr = !IS_INVALID_NC(obsVars.hdr_arr_var); - bool use_obs_arr = !IS_INVALID_NC(obsVars.obs_arr_var); + bool use_obs_arr = nc_point_obs.is_using_obs_arr(); - int hdr_arr_len = use_hdr_arr ? get_dim_size(&obsVars.hdr_arr_dim) : - HDR_ARRAY_LEN; - int obs_arr_len = use_obs_arr ? get_dim_size(&obsVars.obs_arr_dim) : - OBS_ARRAY_LEN; - int buf_size; + int buf_size = (nobs_count > DEF_NC_BUFFER_SIZE) ? DEF_NC_BUFFER_SIZE : nobs_count; // Allocate space to store the data - float hdr_arr[hdr_arr_len]; - float obs_arr[obs_arr_len]; - - long offsets[2] = { 0, 0 }; - long lengths[2] = { 1, 1 }; - long offsets_1D[1] = { 0 }; - long lengths_1D[1] = { 1 }; - - if(use_var_id) { - NcVar obs_var_var = get_nc_var(f_in, nc_var_obs_var); - long var_count = get_dim_size(&obs_var_var, 0); - long var_len = get_dim_size(&obs_var_var, 1); - char obs_var_str[var_count][var_len]; - - lengths[0] = var_count; - lengths[1] = var_len; - if(!get_nc_data(&obs_var_var, - (char *) &obs_var_str[0], - lengths, offsets)) { - mlog << Error << "\nprocess_point_obs() -> " - << "trouble getting " << nc_var_obs_var << "\n\n"; - exit(1); - } - for(int index=0; index " - << "trouble getting " << nc_var_obs_qty_tbl << "\n\n"; - exit(1); - } - for(int index=0; index DEF_NC_BUFFER_SIZE) ? DEF_NC_BUFFER_SIZE : (nobs_count-i_start); - offsets[0] = i_start; - lengths[0] = buf_size; - offsets_1D[0] = i_start; - lengths_1D[0] = buf_size; - if(use_obs_arr) { - lengths[1] = obs_arr_len; - - // Read the current observation message - if(!get_nc_data(&obsVars.obs_arr_var, - (float *) &obs_arr_block[0], - lengths, offsets)) { - mlog << Error << "\nprocess_point_obs() -> " - << "trouble getting obs_arr\n\n"; - exit(1); - } - - lengths[1] = qty_len; - if(!get_nc_data(&obsVars.obs_qty_var, - (char *) qty_str_block, - lengths, offsets)) { - mlog << Error << "\nprocess_point_obs() -> " - << "trouble getting obs_qty\n\n"; - exit(1); - } - qty_list.clear(); - for(int index=0; index " - << "trouble getting obs_hid\n\n"; - exit(1); - } - if(!get_nc_data((IS_INVALID_NC(obsVars.obs_vid_var) ? - &obsVars.obs_gc_var : &obsVars.obs_vid_var), - (int *)&obs_vid_block[0], lengths_1D, offsets)) { - mlog << Error << "\nprocess_point_obs() -> " - << "trouble getting obs_hid\n\n"; - exit(1); - } - if(!get_nc_data(&obsVars.obs_lvl_var, - (float *) &obs_lvl_block[0], - lengths_1D, offsets_1D)) { - mlog << Error << "\nprocess_point_obs() -> " - << "trouble getting obs_lvl\n\n"; - exit(1); - } - if(!get_nc_data(&obsVars.obs_hgt_var, - (float *) &obs_hgt_block[0], - lengths_1D, offsets_1D)) { - mlog << Error << "\nprocess_point_obs() -> " - << "trouble getting obs_hgt\n\n"; - exit(1); - } - if(!get_nc_data(&obsVars.obs_val_var, - (float *) &obs_val_block[0], - lengths_1D, offsets_1D)) { - mlog << Error << "\nprocess_point_obs() -> " - << "trouble getting obs_val\n\n"; - exit(1); - } - if (use_qty_idx) { - if(!get_nc_data(&obsVars.obs_qty_var, - (int *) obs_qty_block, - lengths_1D, offsets_1D)) { - mlog << Error << "\nprocess_point_obs() -> " - << "trouble getting obs_qty\n\n"; - exit(1); - } - } + if (!nc_point_obs.read_obs_data(buf_size, i_start, (float *)obs_arr_block, + obs_qty_block, (char *)0)) { + exit(1); } int typ_idx, sid_idx, vld_idx; for(int i_offset=0; i_offset= 1.0E10 && obs_arr[1] >= 1.0E10) break; + int qty_offset = use_obs_arr ? i_obs : obs_qty_block[i_offset]; + obs_qty_str = qty_list[qty_offset]; + // Get the header index and variable type for this observation. h = nint(obs_arr[0]); v = nint(obs_arr[1]); - typ_idx = (use_obs_arr ? h : header_data.typ_idx_array[h]); - sid_idx = (use_obs_arr ? h : header_data.sid_idx_array[h]); - vld_idx = (use_obs_arr ? h : header_data.vld_idx_array[h]); + // Read the corresponding header array for this observation + // - the corresponding header type, header Station ID, and valid time + nc_point_obs.get_header(h, hdr_arr, hdr_typ_str, hdr_sid_str, hdr_vld_str); // Store data in an observation object Observation cur_obs( - header_data.typ_array[typ_idx], // message type - header_data.sid_array[sid_idx], // station id + hdr_typ_str, // message type + hdr_sid_str, // station id timestring_to_time_t( // valid time - header_data.vld_array[vld_idx].c_str()), - header_data.lat_array[h], // latitude - header_data.lon_array[h], // longitude - header_data.elv_array[h], // elevation - (use_qty_idx ? // quality string - qty_list[obs_qty_block[i_offset]] : - qty_list[i_offset]), + hdr_vld_str.c_str()), + hdr_arr[0], // latitude + hdr_arr[1], // longitude + hdr_arr[2], // elevation + obs_qty_str.c_str(), // quality string (use_var_id ? bad_data_int : v), // grib code (double) obs_arr[2], // pressure (double) obs_arr[3], // height @@ -426,7 +263,7 @@ void process_point_obs(const char *point_obs_filename) { } // end for i_start // Clean up - if(f_in) { delete f_in; f_in = (NcFile *) 0; } + nc_point_obs.close(); return; } diff --git a/met/src/tools/other/point2grid/Makefile.am b/met/src/tools/other/point2grid/Makefile.am index ccd38b1ac5..28ec81099a 100644 --- a/met/src/tools/other/point2grid/Makefile.am +++ b/met/src/tools/other/point2grid/Makefile.am @@ -20,19 +20,20 @@ point2grid_LDADD = -lvx_statistics \ -lvx_data2d_nc_met \ -lvx_data2d_grib $(GRIB2_LIBS) \ -lvx_data2d_nc_pinterp \ - $(PYTHON_LIBS) \ -lvx_data2d_nccf \ - -lvx_statistics \ - -lvx_nc_util \ + $(PYTHON_LIBS) \ -lvx_data2d \ + -lvx_nc_util \ + -lvx_nc_obs \ -lvx_gnomon \ -lvx_regrid \ -lvx_grid \ -lvx_config \ -lvx_gsl_prob \ - -lvx_cal \ + -lvx_color \ -lvx_util \ -lvx_math \ - -lvx_color \ + -lvx_cal \ -lvx_log \ + $(PYTHON_LIBS) \ -lm -lnetcdf_c++4 -lnetcdf -lgsl -lgslcblas diff --git a/met/src/tools/other/point2grid/point2grid.cc b/met/src/tools/other/point2grid/point2grid.cc index f81a0c6bea..6402fff121 100644 --- a/met/src/tools/other/point2grid/point2grid.cc +++ b/met/src/tools/other/point2grid/point2grid.cc @@ -38,6 +38,8 @@ using namespace std; #include "vx_regrid.h" #include "vx_util.h" #include "vx_statistics.h" +#include "nc_obs_util.h" +#include "nc_point_obs_in.h" #include "point2grid_conf_info.h" @@ -612,22 +614,11 @@ void process_point_file(NcFile *nc_in, MetConfig &config, VarInfo *vinfo, NcVar var_obs_gc, var_obs_var; clock_t start_clock = clock(); - bool use_var_id = true; bool has_prob_thresh = !prob_cat_thresh.check(bad_data_double); unixtime requested_valid_time, valid_time; static const char *method_name = "process_point_file() -> "; - - if (!get_dim(nc_in, ConcatString(nc_dim_nhdr), nhdr, true)) { - mlog << Error << "\n" << method_name - << "can not find the header dimension\"" << nc_dim_nhdr << "\".\n\n"; - exit(1); - } - if (!get_dim(nc_in, ConcatString(nc_dim_nobs), nobs, true)) { - mlog << Error << "\n" << method_name - << "can not find the obs dimension\"" << nc_dim_nobs << "\".\n\n"; - exit(1); - } + static const char *method_name_s = "process_point_file()"; // Check for at least one configuration string if(FieldSA.n() < 1) { @@ -636,70 +627,39 @@ void process_point_file(NcFile *nc_in, MetConfig &config, VarInfo *vinfo, usage(); } - int *obs_ids = new int[nobs]; // grib_code or var_id - int *obs_hids = new int[nobs]; + MetNcPointObsIn nc_point_obs; + nc_point_obs.set_netcdf(nc_in, true); + // Read the dimensions and variables + nc_point_obs.read_dim_headers(); + nc_point_obs.check_nc(GET_NC_NAME_P(nc_in).c_str(), method_name_s); // exit if missing dims/vars + // Read all obs data to compute the cell mapping + nc_point_obs.read_obs_data(); + NcHeaderData header_data = nc_point_obs.get_header_data(); + NcPointObsData obs_data = nc_point_obs.get_point_obs_data(); + + nhdr = nc_point_obs.get_hdr_cnt(); + nobs = nc_point_obs.get_obs_cnt(); + bool empty_input = (nhdr == 0 && nobs == 0); + bool use_var_id = nc_point_obs.is_using_var_id(); + float *hdr_lats = new float[nhdr]; float *hdr_lons = new float[nhdr]; - float *obs_lvls = new float[nobs]; - float *obs_hgts = new float[nobs]; - float *obs_vals = new float[nobs]; - int *hdr_typ_ids = new int[nhdr]; - int *hdr_vld_ids = new int[nhdr]; - int *obs_qty_ids = new int[nobs]; IntArray var_index_array; IntArray valid_time_array; - StringArray qc_tables; - StringArray var_names; - StringArray hdr_types; - StringArray hdr_valid_times; + StringArray qc_tables = nc_point_obs.get_qty_data(); + StringArray var_names = nc_point_obs.get_var_names(); + StringArray hdr_valid_times = header_data.vld_array; + hdr_valid_times.sort(); + + nc_point_obs.get_lats(hdr_lats); + nc_point_obs.get_lons(hdr_lons); - if (!get_nc_data_string_array(nc_in, nc_var_hdr_typ_tbl, &hdr_types)) exit(1); // Check the message types - prepare_message_types(hdr_types); + prepare_message_types(header_data.typ_array); // Check and read obs_vid and obs_var if exists bool success_to_read = true; - bool empty_input = (nhdr == 0 && nobs == 0); - NcVar obs_vid_var = get_var(nc_in, nc_var_obs_vid); - if (IS_VALID_NC(obs_vid_var)) { - if (success_to_read) success_to_read = get_nc_data_int_array(nc_in, nc_var_obs_vid, obs_ids); - if (success_to_read) success_to_read = get_nc_data_string_array(nc_in, nc_var_obs_var, &var_names); - } - else { - use_var_id = false; - if (success_to_read) success_to_read = get_nc_data_int_array(nc_in, nc_var_obs_gc, obs_ids, false); - if (!success_to_read) { - mlog << Error << "\n" << method_name - << "\"" << InputFilename << "\" is very old format. Not supported\n\n"; - } - } - if (!empty_input) { - if (success_to_read) - success_to_read = get_nc_data_int_array(nc_in, nc_var_obs_hid, obs_hids); - if (success_to_read) - success_to_read = get_nc_data_int_array(nc_in, nc_var_hdr_vld, hdr_vld_ids); - if (success_to_read) - success_to_read = get_nc_data_int_array(nc_in, nc_var_hdr_typ, hdr_typ_ids); - if (success_to_read) - success_to_read = get_nc_data_int_array(nc_in, nc_var_obs_qty, obs_qty_ids); - if (success_to_read) - success_to_read = get_nc_data_float_array(nc_in, nc_var_hdr_lat, hdr_lats); - if (success_to_read) - success_to_read = get_nc_data_float_array(nc_in, nc_var_hdr_lon, hdr_lons); - if (success_to_read) - success_to_read = get_nc_data_float_array(nc_in, nc_var_obs_lvl, obs_lvls); - if (success_to_read) - success_to_read = get_nc_data_float_array(nc_in, nc_var_obs_hgt, obs_hgts); - if (success_to_read) - success_to_read = get_nc_data_float_array(nc_in, nc_var_obs_val, obs_vals); - if (success_to_read) - success_to_read = get_nc_data_string_array( - nc_in, nc_var_hdr_vld_tbl, &hdr_valid_times); - if (success_to_read) - success_to_read = get_nc_data_string_array( - nc_in, nc_var_obs_qty_tbl, &qc_tables); - } if (success_to_read) { bool has_qc_flags = (qc_flags.n() > 0); IntArray qc_idx_array = prepare_qc_array(qc_flags, qc_tables); @@ -772,7 +732,7 @@ void process_point_file(NcFile *nc_in, MetConfig &config, VarInfo *vinfo, else { bool not_found_grib_code = true; for (idx=0; idx= 4) { @@ -1111,16 +1071,9 @@ void process_point_file(NcFile *nc_in, MetConfig &config, VarInfo *vinfo, } } - delete [] obs_ids; - delete [] obs_hids; delete [] hdr_lats; delete [] hdr_lons; - delete [] obs_lvls; - delete [] obs_hgts; - delete [] obs_vals; - delete [] hdr_typ_ids; - delete [] hdr_vld_ids; - delete [] obs_qty_ids; + nc_point_obs.close(); mlog << Debug(LEVEL_FOR_PERFORMANCE) << method_name << "took " << (clock()-start_clock)/double(CLOCKS_PER_SEC) << " seconds\n"; @@ -1166,14 +1119,12 @@ void process_point_nccf_file(NcFile *nc_in, MetConfig &config, usage(); } - bool is_2d_time = false; unixtime valid_time = bad_data_int; valid_beg_ut = valid_end_ut = conf_info.valid_time; NcVar time_var = get_nc_var_time(nc_in); if( IS_VALID_NC(time_var) ) { if( 1 < get_dim_count(&time_var) ) { - is_2d_time = true; double max_time = bad_data_double; skip_times = new bool[from_size]; valid_times = new double[from_size]; From d3cd134e1d76571a92099b69607d03fff92ed29a Mon Sep 17 00:00:00 2001 From: Seth Linden Date: Fri, 4 Jun 2021 10:15:16 -0600 Subject: [PATCH 159/165] Feature 1792 gen_vx_mask (#1816) * Per issue #1792, Change -type from optional to required. Set default_mask_type to MaskType_None. Added a check on mask_type to see if it's set and print error message accordingly. * Update test_gen_vx_mask.sh * For the first test, added -type poly, since the masking type is now required. SL * For all of the Poly unit tests added -type poly to the command line. The mask type is now required. SL * Modified document to indicate that -type string (masking type) is now required on the command line for gen_vx_mask. SL * Update met/docs/Users_Guide/masking.rst Co-authored-by: johnhg * Update met/src/tools/other/gen_vx_mask/gen_vx_mask.cc Co-authored-by: johnhg Co-authored-by: Seth Linden Co-authored-by: johnhg --- met/docs/Users_Guide/masking.rst | 8 +++---- met/scripts/examples/test_gen_vx_mask.sh | 3 ++- met/scripts/mk/gen_vx_mask.mk | 2 +- .../tools/other/gen_vx_mask/gen_vx_mask.cc | 22 ++++++++++++++----- met/src/tools/other/gen_vx_mask/gen_vx_mask.h | 7 +++--- test/xml/unit_gen_vx_mask.xml | 10 ++++----- 6 files changed, 33 insertions(+), 19 deletions(-) diff --git a/met/docs/Users_Guide/masking.rst b/met/docs/Users_Guide/masking.rst index 8181985f0b..08ef85727c 100644 --- a/met/docs/Users_Guide/masking.rst +++ b/met/docs/Users_Guide/masking.rst @@ -21,7 +21,7 @@ The usage statement for the Gen-Vx-Mask tool is shown below: input_grid mask_file out_file - [-type str] + -type str [-input_field string] [-mask_field string] [-complement] @@ -36,7 +36,7 @@ The usage statement for the Gen-Vx-Mask tool is shown below: [-v level] [-compress level] -gen_vx_mask has three required arguments and can take optional ones. +gen_vx_mask has four required arguments and can take optional ones. Note, -type string (masking type) was previously optional but is now required. Required arguments for gen_vx_mask ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -57,11 +57,11 @@ Required arguments for gen_vx_mask 3. The **out_file** argument is the output NetCDF mask file to be written. +4. The **-type string** is required to set the masking type. The application will give an error message and exit if "-type string" is not specified on the command line. See description of supported types below. + Optional arguments for gen_vx_mask ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -4. The **-type string** option can be used to override the default masking type (poly). See description of supported types below. - 5. The **-input_field string** option can be used to read existing mask data from “input_file”. 6. The **-mask_field string** option can be used to define the field from “mask_file” to be used for “data” masking. diff --git a/met/scripts/examples/test_gen_vx_mask.sh b/met/scripts/examples/test_gen_vx_mask.sh index b7730910bd..b1edab42a2 100755 --- a/met/scripts/examples/test_gen_vx_mask.sh +++ b/met/scripts/examples/test_gen_vx_mask.sh @@ -5,7 +5,8 @@ echo "*** Running Gen-Vx-Mask to generate a polyline mask file for the Continent gen_vx_mask \ ../data/sample_fcst/2005080700/wrfprs_ruc13_24.tm00_G212 \ $MET_BASE/poly/CONUS.poly \ - ${TEST_OUT_DIR}/gen_vx_mask/CONUS_poly.nc -v 2 + ${TEST_OUT_DIR}/gen_vx_mask/CONUS_poly.nc \ + -type poly -v 2 echo echo "*** Running Gen-Vx-Mask to generate a circle mask file ***" diff --git a/met/scripts/mk/gen_vx_mask.mk b/met/scripts/mk/gen_vx_mask.mk index 3020041b0b..136dadb1e5 100644 --- a/met/scripts/mk/gen_vx_mask.mk +++ b/met/scripts/mk/gen_vx_mask.mk @@ -23,7 +23,7 @@ gen_vx_mask: ${GEN_VX_MASK_EXEC} ${GEN_VX_MASK_EXEC} \ ../data/sample_fcst/2005080700/wrfprs_ruc13_24.tm00_G212 \ ../data/poly/CONUS.poly \ - ${TEST_OUT_DIR}/gen_vx_mask/CONUS_poly.nc -v 2 + ${TEST_OUT_DIR}/gen_vx_mask/CONUS_poly.nc -type poly -v 2 @ echo echo "*** Running Gen-Vx-Mask to generate a circle mask file ***" diff --git a/met/src/tools/other/gen_vx_mask/gen_vx_mask.cc b/met/src/tools/other/gen_vx_mask/gen_vx_mask.cc index 85bb95d2af..18eabfd993 100644 --- a/met/src/tools/other/gen_vx_mask/gen_vx_mask.cc +++ b/met/src/tools/other/gen_vx_mask/gen_vx_mask.cc @@ -24,6 +24,7 @@ // 006 07/09/18 Bullock Add shapefile masking type. // 007 04/08/19 Halley Gotway Add percentile thresholds. // 008 04/06/20 Halley Gotway Generalize input_grid option. +// 009 06/01/21 Seth Linden Change -type from optional to required // //////////////////////////////////////////////////////////////////////// @@ -138,6 +139,17 @@ void process_command_line(int argc, char **argv) { mask_filename = cline[1]; out_filename = cline[2]; + // Check for the mask type (from -type string) + if(mask_type == MaskType_None) { + mlog << Error << "\n" << program_name << " -> " + << "the -type command line requirement must be set to a specific masking type!\n" + << "\t\t \"poly\", \"box\", \"circle\", \"track\", \"grid\", " + << "\"data\", \"solar_alt\", \"solar_azi\", \"lat\", \"lon\" " + << "or \"shape\"" + << "\n\n"; + exit(1); + } + // List the input files mlog << Debug(1) << "Input Grid:\t\t" << input_gridname << "\n" @@ -1340,7 +1352,7 @@ void usage() { << "\tinput_grid\n" << "\tmask_file\n" << "\tout_file\n" - << "\t[-type string]\n" + << "\t-type string\n" << "\t[-input_field string]\n" << "\t[-mask_field string]\n" << "\t[-complement]\n" @@ -1380,12 +1392,12 @@ void usage() { << "\t\t\"out_file\" is the output NetCDF mask file to be " << "written (required).\n" - << "\t\t\"-type string\" overrides the default masking type (" - << masktype_to_string(default_mask_type) << ") (optional)\n" + << "\t\t\"-type string\" specify the masking type " + << "(required).\n" << "\t\t \"poly\", \"box\", \"circle\", \"track\", \"grid\", " << "\"data\", \"solar_alt\", \"solar_azi\", \"lat\", \"lon\" " << "or \"shape\"\n" - + << "\t\t\"-input_field string\" reads existing mask data from " << "the \"input_grid\" gridded data file (optional).\n" @@ -1446,7 +1458,7 @@ void usage() { void set_type(const StringArray & a) { if(type_is_set) { mlog << Error << "\n" << program_name << " -> " - << "the -type command line option can only be used once!\n" + << "the -type command line requirement can only be used once!\n" << "To apply multiple masks, run this tool multiple times " << "using the output of one run as the input to the next." << "\n\n"; diff --git a/met/src/tools/other/gen_vx_mask/gen_vx_mask.h b/met/src/tools/other/gen_vx_mask/gen_vx_mask.h index d51194e5da..70181b8b4e 100644 --- a/met/src/tools/other/gen_vx_mask/gen_vx_mask.h +++ b/met/src/tools/other/gen_vx_mask/gen_vx_mask.h @@ -17,6 +17,7 @@ // 000 12/09/14 Halley Gotway New // 001 06/02/16 Halley Gotway Add box masking type. // 002 11/15/16 Halley Gotway Add solar masking types. +// 003 06/03/21 Seth Linden Changed default mask type to MaskType_None // //////////////////////////////////////////////////////////////////////// @@ -75,7 +76,7 @@ extern const char * masktype_to_string(MaskType); // //////////////////////////////////////////////////////////////////////// -static const MaskType default_mask_type = MaskType_Poly; +static const MaskType default_mask_type = MaskType_None; static const double default_mask_val = 1.0; //////////////////////////////////////////////////////////////////////// @@ -86,10 +87,10 @@ static const double default_mask_val = 1.0; // Input data file, mask file, and output NetCDF file static ConcatString input_gridname, mask_filename, out_filename; - -// Optional arguments static MaskType mask_type = default_mask_type; static bool type_is_set = false; + +// Optional arguments static ConcatString input_field_str, mask_field_str; static SetLogic set_logic = SetLogic_None; static bool complement = false; diff --git a/test/xml/unit_gen_vx_mask.xml b/test/xml/unit_gen_vx_mask.xml index b4aac5e497..9e9faf2638 100644 --- a/test/xml/unit_gen_vx_mask.xml +++ b/test/xml/unit_gen_vx_mask.xml @@ -31,7 +31,7 @@ &DATA_DIR_MODEL;/grib1/gfs/gfs_2012040900_F012.grib \ &MET_BASE;/poly/CONUS.poly \ &OUTPUT_DIR;/gen_vx_mask/POLY_GFS_LATLON_CONUS_mask.nc \ - -v 1 + -type poly -v 1 &OUTPUT_DIR;/gen_vx_mask/POLY_GFS_LATLON_CONUS_mask.nc @@ -48,7 +48,7 @@ &DATA_DIR_MODEL;/grib1/gfs/gfs_2012040900_F012_g008.grib \ &MET_BASE;/poly/CONUS.poly \ &OUTPUT_DIR;/gen_vx_mask/POLY_GFS_MERCATOR_CONUS_mask.nc \ - -v 1 + -type poly -v 1 &OUTPUT_DIR;/gen_vx_mask/POLY_GFS_MERCATOR_CONUS_mask.nc @@ -65,7 +65,7 @@ &DATA_DIR_MODEL;/grib1/nam/nam_2012040900_F012.grib \ &MET_BASE;/poly/CONUS.poly \ &OUTPUT_DIR;/gen_vx_mask/POLY_NAM_LAMBERT_CONUS_mask.nc \ - -v 1 + -type poly -v 1 &OUTPUT_DIR;/gen_vx_mask/POLY_NAM_LAMBERT_CONUS_mask.nc @@ -82,7 +82,7 @@ &DATA_DIR_MODEL;/grib1/arw-tom-gep0/arw-tom-gep0_2012040900_F012.grib \ &MET_BASE;/poly/NWC.poly \ &OUTPUT_DIR;/gen_vx_mask/POLY_HMT_STEREO_NWC_mask.nc \ - -v 1 + -type poly -v 1 &OUTPUT_DIR;/gen_vx_mask/POLY_HMT_STEREO_NWC_mask.nc @@ -100,7 +100,7 @@ &DATA_DIR_MODEL;/grib1/gfs/gfs_2012040900_F012.grib \ &MET_BASE;/poly/NAK.poly \ &OUTPUT_DIR;/gen_vx_mask/POLY_GFS_LATLON_NAK_mask.nc \ - -v 1 + -type poly -v 1 &OUTPUT_DIR;/gen_vx_mask/POLY_GFS_LATLON_NAK_mask.nc From f52da93deda49152a43b285de327ea3f485ad9c5 Mon Sep 17 00:00:00 2001 From: johnhg Date: Fri, 4 Jun 2021 11:14:31 -0600 Subject: [PATCH 160/165] Fix 2 minor formatting errors in the release notes. --- met/docs/Users_Guide/release-notes.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/met/docs/Users_Guide/release-notes.rst b/met/docs/Users_Guide/release-notes.rst index 70d1a1a028..03b1964a8e 100644 --- a/met/docs/Users_Guide/release-notes.rst +++ b/met/docs/Users_Guide/release-notes.rst @@ -21,8 +21,8 @@ MET Version |version| release notes (|release_date|) * Correct the time offset for tests in unit_plot_data_plane.xml (`#1677 `_). * Enhance the sample plotting R-script to read output from different versions of MET (`#1653 `_). * Update the default configuration options to compile the development code with the debug (-g) option and the production code without it (`#1788 `_). - * Update MET to compile using GCC version 10 (`#1552 https://github.com/dtcenter/MET/issues/1552`_). - * Update MET to compile using PGI version 20 (`#1317 https://github.com/dtcenter/MET/issues/1317`_). + * Update MET to compile using GCC version 10 (`#1552 `_). + * Update MET to compile using PGI version 20 (`#1317 `_). * Documentation: From e3026500a96b631f9de94e781862ed5b6e5fd122 Mon Sep 17 00:00:00 2001 From: John Halley Gotway Date: Sat, 5 Jun 2021 14:34:14 -0600 Subject: [PATCH 161/165] PR #1816 for issue #1792 unexpectedly caused the NB to fail on 20210605. We changed -type from optional to required, but missed adding the -type option in unit_met_test_scripts.xml and unit_ref_config.xml. This is a hotfix to resolve that. --- test/xml/unit_met_test_scripts.xml | 2 +- test/xml/unit_ref_config.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/xml/unit_met_test_scripts.xml b/test/xml/unit_met_test_scripts.xml index 1579ea8034..2812eeeaaa 100644 --- a/test/xml/unit_met_test_scripts.xml +++ b/test/xml/unit_met_test_scripts.xml @@ -32,7 +32,7 @@ &MET_DATA;/sample_fcst/2005080700/wrfprs_ruc13_24.tm00_G212 \ &MET_BASE;/poly/CONUS.poly \ &OUTPUT_DIR;/gen_vx_mask/CONUS_poly.nc \ - -v 2 + -type poly -v 2 &OUTPUT_DIR;/gen_vx_mask/CONUS_poly.nc diff --git a/test/xml/unit_ref_config.xml b/test/xml/unit_ref_config.xml index 7801efbbc6..4e7e26113b 100644 --- a/test/xml/unit_ref_config.xml +++ b/test/xml/unit_ref_config.xml @@ -26,7 +26,7 @@ &DATA_DIR_MODEL;/grib1/ref_config/2011090200/AFWAv3.4_Noahv3.3/postprd/wrfprs_012.tm00 \ &MET_BASE;/poly/CONUS.poly \ &OUTPUT_DIR;/ref_config/gen_vx_mask/CONUS.nc \ - -v 2 + -type poly -v 2 &OUTPUT_DIR;/ref_config/gen_vx_mask/CONUS.nc From a70197a002437231c132ef67e39c18e1a2570f25 Mon Sep 17 00:00:00 2001 From: lisagoodrich <33230218+lisagoodrich@users.noreply.github.com> Date: Fri, 11 Jun 2021 14:42:39 -0600 Subject: [PATCH 162/165] Feature 1811 anchor links (#1822) * testing new anchoring link idea. * testing without the bold asterik * tinkering with the look * another attempt * another attempt #2 * another attempt #3 * another attempt #4 * making sure new anchor works as expected. * seeing if link will save with spaces instead of dashes * need underscores to link * is it fixed? * testing * testing 2 * testing 4 * testing 5 * testing 6 * testing 7 * testing 8 * going back to test original problem * able to link with spaces instead of underscores. Testing if a return is possible to keep under 79 character limit. * double checking everything is still working. * DO NOT break ref lines apart, it won't work. * trying a shorter name. * continuing to add anchors * updating lines 1946 thru 2214 with anchors * updating lines 2214 thru 3371 with anchors * updating lines 3371 to the end with anchors * testing anchor * testing anchor * testing anchor 3 * testing anchor 4 * testing anchor 45 percent * testing anchor final half * fixing typo * numbering fcst, obs_1 and 2 to create different links. * finding more anchors that need numbers to keep them separate. * fixing warnings * fixing warnings * fixing typo --- met/docs/Users_Guide/config_options.rst | 466 +++++++++++++++------ met/docs/Users_Guide/config_options_tc.rst | 299 +++++++++---- 2 files changed, 538 insertions(+), 227 deletions(-) diff --git a/met/docs/Users_Guide/config_options.rst b/met/docs/Users_Guide/config_options.rst index b27e819908..af7af2ec5f 100644 --- a/met/docs/Users_Guide/config_options.rst +++ b/met/docs/Users_Guide/config_options.rst @@ -291,7 +291,9 @@ References: Settings common to multiple tools _________________________________ -**exit_on_warning** +.. _exit_on_warning: + +:ref:`exit_on_warning ` The "exit_on_warning" entry in ConfigConstants may be set to true or false. If set to true and a MET tool encounters a warning, it will immediately exit @@ -301,8 +303,10 @@ with bad status after writing the warning message. exit_on_warning = FALSE; -**nc_compression** - +.. _nc_compression: + +:ref:`nc_compression ` + The "nc_compression" entry in ConfigConstants defines the compression level for the NetCDF variables. Setting this option in the config file of one of the tools overrides the default value set in ConfigConstants. The @@ -322,7 +326,9 @@ writing of NetCDF files within MET significantly. nc_compression = 0; -**output_precision** +.. _output_precision: + +:ref:`output_precision ` The "output_precision" entry in ConfigConstants defines the precision (number of significant decimal places) to be written to the ASCII output @@ -333,8 +339,10 @@ override the default value set in ConfigConstants. output_precision = 5; -**tmp_dir** - +.. _tmp_dir_1: + +:ref:`tmp_dir ` + The "tmp_dir" entry in ConfigConstants defines the directory for the temporary files. The directory must exist and be writable. The environment variable MET_TMP_DIR overrides the default value at the configuration file. @@ -345,8 +353,10 @@ Some tools override the temporary directory by the command line argument tmp_dir = "/tmp"; -**message_type_group_map** +.. _message_type_group_map_1: +:ref:`message_type_group_map ` + The "message_type_group_map" entry is an array of dictionaries, each containing a "key" string and "val" string. This defines a mapping of message type group names to a comma-separated list of values. This map is @@ -364,7 +374,9 @@ which surface verification logic should be applied. { key = "ONLYSF"; val = "ADPSFC,SFCSHP"; } ]; -**message_type_map** +.. _message_type_map: + +:ref:`message_type_map ` The "message_type_map" entry is an array of dictionaries, each containing a "key" string and "val" string. This defines a mapping of input strings @@ -387,8 +399,10 @@ types. { key = "FM-97 ACARS"; val = "AIRCFT"; } ]; -**model** - +.. _model: + +:ref:`model ` + The "model" entry specifies a name for the model being verified. This name is written to the MODEL column of the ASCII output generated. If you're verifying multiple models, you should choose descriptive model names (no @@ -399,8 +413,10 @@ e.g. model = "GFS"; model = "WRF"; -**desc** - +.._desc: + +:ref:`desc ` + The "desc" entry specifies a user-specified description for each verification task. This string is written to the DESC column of the ASCII output generated. It may be set separately in each "obs.field" verification task @@ -414,8 +430,10 @@ e.g. desc = "QC_9"; desc = "NA"; -**obtype** - +.. _obtype: + +:ref:`obtype ` + The "obtype" entry specifies a name to describe the type of verifying gridded observation used. This name is written to the OBTYPE column in the ASCII output generated. If you're using multiple types of verifying observations, @@ -428,8 +446,10 @@ the configuration file obtype value is written. obtype = "ANALYS"; -**regrid** - +.. _regrid: + +:ref:`regrid ` + The "regrid" entry is a dictionary containing information about how to handle input gridded data files. The "regrid" entry specifies regridding logic using the following entries: @@ -535,7 +555,9 @@ using the following entries: censor_val = []; } -**fcst** +.. _fcst: + +:ref:`fcst ` The "fcst" entry is a dictionary containing information about the field(s) to be verified. This dictionary may include the following entries: @@ -962,8 +984,10 @@ File-format specific settings for the "field" entry: ]; } -**obs** - +.. _obs: + +:ref:`obs ` + The "obs" entry specifies the same type of information as "fcst", but for the observation data. It will often be set to the same things as "fcst", as shown in the example below. However, when comparing forecast and @@ -1085,8 +1109,10 @@ or obs = fcst; -**climo_mean** - +.. _climo_mean: + +:ref:`climo_mean ` + The "climo_mean" dictionary specifies climatology mean data to be read by the Grid-Stat, Point-Stat, Ensemble-Stat, and Series-Analysis tools. It consists of several entires defining the climatology file names and fields to be used. @@ -1141,8 +1167,10 @@ of several entires defining the climatology file names and fields to be used. hour_interval = 6; } -**climo_stdev** - +.. _climo_stdev: + +:ref:`climo_stdev ` + The "climo_stdev" dictionary specifies climatology standard deviation data to be read by the Grid-Stat, Point-Stat, Ensemble-Stat, and Series-Analysis tools. The "climo_mean" and "climo_stdev" data define the climatological @@ -1171,8 +1199,10 @@ over the "climo_mean" setting and then updating the "file_name" entry. file_name = [ "/path/to/climatological/standard/deviation/files" ]; } -**climo_cdf** - +.. _climo_cdf: + +:ref:`climo_cdf ` + The "climo_cdf" dictionary specifies how the the climatological mean ("climo_mean") and standard deviation ("climo_stdev") data are used to evaluate model performance relative to where the observation value falls @@ -1234,8 +1264,10 @@ all pairs into a single climatological bin. write_bins = FALSE; or TRUE } -**climatology data for probability forecasts** +.. _climato_data: +:ref:`climatology data for probability forecasts ` + When specifying climatology data for probability forecasts, either supply a probabilistic "climo_mean" field or non-probabilistic "climo_mean" and "climo_stdev" fields from which a normal approximation of the climatological @@ -1250,7 +1282,9 @@ the MET tools use the mean, standard deviation, and observation event threshold to derive a normal approximation of the climatological probabilities. Those derived probability values are used to compute BSS. -**mask_missing_flag** +.. _mask_missing_flag: + +:ref:`mask_missing_flag ` The "mask_missing_flag" entry specifies how missing data should be handled in the Wavelet-Stat and MODE tools: @@ -1268,7 +1302,9 @@ in the Wavelet-Stat and MODE tools: mask_missing_flag = BOTH; -**obs_window** +.. _obs_window: + +:ref:`obs_window ` The "obs_window" entry is a dictionary specifying a beginning ("beg" entry) and ending ("end" entry) time offset values in seconds. It defines @@ -1284,8 +1320,10 @@ Point-Stat and Ensemble-Stat, the reference time is the forecast valid time. end = 5400; } -**mask** +.. _mask: +:ref:`mask ` + The "mask" entry is a dictionary that specifies the verification masking regions to be used when computing statistics. Each mask defines a geographic extent, and any matched pairs falling inside that area will be @@ -1394,7 +1432,9 @@ is included in the mask. } -**ci_alpha** +.. _ci_alpha: + +:ref:`ci_alpha ` The "ci_alpha" entry is an array of floats specifying the values for alpha to be used when computing confidence intervals. Values of alpha must be @@ -1406,7 +1446,9 @@ interval. ci_alpha = [ 0.05, 0.10 ]; -**boot** +.. _boot: + +:ref:`boot ` The "boot" entry defines the parameters to be used in calculation of bootstrap confidence intervals. The interval variable indicates what method @@ -1468,7 +1510,9 @@ should be used for computing bootstrap confidence intervals: seed = ""; } -**interp** +.. _interp: + +:ref:`interp ` The "interp" entry is a dictionary that specifies what interpolation or smoothing (for the Grid-Stat tool) methods should be applied. @@ -1571,8 +1615,10 @@ This dictionary may include the following entries: ]; } -**nbrhd** - +.. _nbrhd: + +:ref:`nbrhd ` + The "nbrhd" entry is a dictionary that is very similar to the "interp" entry. It specifies information for computing neighborhood statistics in Grid-Stat. This dictionary may include the following entries: @@ -1616,8 +1662,10 @@ Grid-Stat. This dictionary may include the following entries: cov_thresh = [ >=0.5 ]; } -**fourier** +.. _fourier: +:ref:`fourier ` + The "fourier" entry is a dictionary which specifies the application of the Fourier decomposition method. It consists of two arrays of the same length which define the beginning and ending wave numbers to be included. If the @@ -1647,7 +1695,9 @@ of the verification grid: wave_1d_end = [ 3, 9, 20 ]; } -**gradient** +.. _gradient: + +:ref:`gradient ` The "gradient" entry is a dictionary which specifies the number and size of gradients to be computed. The "dx" and "dy" entries specify the size of the @@ -1667,8 +1717,10 @@ This configuration option may be set separately in each "obs.field" entry. dy = [ 1 ]; } -**distance_map** - +.. _distance_map: + +:ref:`distance_map ` + The "distance_map" entry is a dictionary containing options related to the distance map statistics in the DMAP output line type. The "baddeley_p" entry is an integer specifying the exponent used in the Lp-norm when computing the @@ -1693,8 +1745,10 @@ This configuration option may be set separately in each "obs.field" entry. zhu_weight = 0.5; } -**land_mask** - +.. _land_mask: + +:ref:`land_mask ` + The "land_mask" dictionary defines the land/sea mask field which is used when verifying at the surface. For point observations whose message type appears in the "LANDSF" entry of the "message_type_group_map" setting, @@ -1720,8 +1774,10 @@ land_mask.flag may be set separately in each "obs.field" entry. thresh = eq1; } -**topo_mask** - +.. _topo_mask: + +:ref:`topo_mask ` + The "topo_mask" dictionary defines the model topography field which is used when verifying at the surface. This logic is applied to point observations whose message type appears in the "SURFACE" entry of the @@ -1749,8 +1805,10 @@ topo_mask.flag may be set separately in each "obs.field" entry. interp_fcst_thresh = ge-50&&le50; } -**hira** +.. _hira: +:ref:`hira ` + The "hira" entry is a dictionary that is very similar to the "interp" and "nbrhd" entries. It specifies information for applying the High Resolution Assessment (HiRA) verification logic in Point-Stat. HiRA is analogous to @@ -1801,8 +1859,10 @@ This dictionary may include the following entries: prob_cat_thresh = []; } -**output_flag** +.. _output_flag: +:ref:`output_flag ` + The "output_flag" entry is a dictionary that specifies what verification methods should be applied to the input data. Options exist for each output line type from the MET tools. Each line type may be set to one of: @@ -1851,7 +1911,9 @@ output line type from the MET tools. Each line type may be set to one of: grad = NONE; Gradient statistics (S1 score) } -**nc_pairs_flag** +.. _nc_pairs_flag: + +:ref:`nc_pairs_flag ` The "nc_pairs_flag" can be set either to a boolean value or a dictionary in either Grid-Stat, Wavelet-Stat or MODE. The dictionary (with slightly @@ -1881,7 +1943,9 @@ netcdf output will be generated. apply_mask = TRUE; } -**nc_pairs_var_name** +.. _nc_pairs_var_name: + +:ref:`nc_pairs_var_name ` The "nc_pairs_var_name" entry specifies a string for each verification task in Grid-Stat. This string is parsed from each "obs.field" dictionary entry @@ -1900,8 +1964,10 @@ For example: nc_pairs_var_name = ""; -**nc_pairs_var_suffix** - +.. _nc_pairs_var_suffix: + +:ref:`nc_pairs_var_suffix ` + The "nc_pairs_var_suffix" entry is similar to the "nc_pairs_var_name" entry described above. It is also parsed from each "obs.field" dictionary entry. However, it defines a suffix to be appended to the output variable name. @@ -1922,8 +1988,10 @@ now deprecated. nc_pairs_var_suffix = ""; -**ps_plot_flag** - +.. _ps_plot_flag: + +:ref:`ps_plot_flag ` + The "ps_plot_flag" entry is a boolean value for Wavelet-Stat and MODE indicating whether a PostScript plot should be generated summarizing the verification. @@ -1932,8 +2000,10 @@ the verification. ps_plot_flag = TRUE; -**grid_weight_flag** +.. _grid_weight_flag: +:ref:`grid_weight_flag ` + The "grid_weight_flag" specifies how grid weighting should be applied during the computation of continuous statistics and partial sums. It is meant to account for grid box area distortion and is often applied to global @@ -1955,7 +2025,9 @@ by the sum of the weights for the current masking region. grid_weight_flag = NONE; -**rank_corr_flag** +.. _rank_corr_flag: + +ref:`rank_corr_flag ` The "rank_corr_flag" entry is a boolean to indicate whether Kendall's Tau and Spearman's Rank Correlation Coefficients (in the CNT line type) should @@ -1966,7 +2038,9 @@ intensive and slows down the runtime significantly. rank_corr_flag = FALSE; -**duplicate_flag** +.. _duplicate_flag: + +:ref:`duplicate_flag ` The "duplicate_flag" entry specifies how to handle duplicate point observations in Point-Stat and Ensemble-Stat: @@ -1987,7 +2061,9 @@ in those cases. duplicate_flag = NONE; -**obs_summary** +.. _obs_summary: + +:ref:`obs_summary ` The "obs_summary" entry specifies how to compute statistics on observations that appear at a single location (lat,lon,level,elev) @@ -2022,8 +2098,10 @@ in those cases. obs_summary = NONE; -**obs_perc_value** +.. _obs_perc_value: +:ref:`obs_perc_value ` + Percentile value to use when obs_summary = PERC .. code-block:: none @@ -2031,7 +2109,9 @@ Percentile value to use when obs_summary = PERC obs_perc_value = 50; -**obs_quality** +.. _obs_quality: + +:ref:`obs_quality ` The "obs_quality" entry specifies the quality flag values that are to be retained and used for verification. An empty list signifies that all @@ -2045,7 +2125,9 @@ an array of strings, even if the values themselves are numeric. obs_quality = [ "1", "2", "3", "9" ]; -**met_data_dir** +.. _met_data_dir: + +:ref:`met_data_dir ` The "met_data_dir" entry specifies the location of the internal MET data sub-directory which contains data files used when generating plots. It @@ -2056,8 +2138,10 @@ locate the static data files they need at run time. met_data_dir = "MET_BASE"; -**fcst_raw_plot, obs_raw_plot, wvlt_plot, object_plot** - +.. _many_plots: + +:ref:`fcst_raw_plot, obs_raw_plot, wvlt_plot, object_plot ` + The "fcst_raw_plot" entry is a dictionary used by Wavelet-Stat and MODE containing colortable plotting information for the plotting of the raw forecast field: @@ -2087,7 +2171,9 @@ forecast field: The "obs_raw_plot", "wvlt_plot", and "object_plot" entries are dictionaries similar to the "fcst_raw_plot" described above. -**tmp_dir** +.. _tmp_dir_2: + +:ref:`tmp_dir ` The "tmp_dir" entry is a string specifying the location where temporary files should be written. @@ -2097,7 +2183,9 @@ files should be written. tmp_dir = "/tmp"; -**output_prefix** +.. _output_prefix: + +:ref:`output_prefix ` The "output_prefix" entry specifies a string to be included in the output file name. The MET statistics tools construct output file names that @@ -2109,8 +2197,10 @@ of the same tool. output_prefix = ""; -**version** - +.. _version: + +:ref:`version ` + The "version" entry specifies the version number of the configuration file. The configuration file version number should match the version number of the MET code being run. This value should generally not be modified. @@ -2119,8 +2209,10 @@ the MET code being run. This value should generally not be modified. version = "VN.N"; -**time_summary** - +.. _time_summary: + +:ref:`time_summary ` + This feature was implemented to allow additional processing of observations with high temporal resolution. The "flag" entry toggles the "time_summary" on (TRUE) and off (FALSE). Obs may be summarized across the user specified @@ -2196,7 +2288,9 @@ _____________________________________ EnsembleStatConfig_default ~~~~~~~~~~~~~~~~~~~~~~~~~~ -**ens** +.. _ens: + +:ref:`ens ` The "ens" entry is a dictionary that specifies the fields for which ensemble products should be generated. This is very similar to the "fcst" and "obs" @@ -2238,8 +2332,10 @@ entries. This dictionary may include the following entries: ]; } -**nbrhd_prob** - +.. _nbrhd_prob: + +:ref:`nbrhd_prob ` + The nbrhd_prob dictionary defines the neighborhoods used to compute NEP and NMEP output. The neighborhood shape is a SQUARE or CIRCLE centered on the current point, and the width array specifies the width of the square or @@ -2259,7 +2355,9 @@ specified. vld_thresh = 0.0; } -**nmep_smooth** +.. _nmep_smooth: + +:ref:`nmep_smooth ` Similar to the interp dictionary, the nmep_smooth dictionary includes a type array of dictionaries to define one or more methods for smoothing the NMEP @@ -2285,7 +2383,9 @@ combination of the categorical threshold (cat_thresh), neighborhood width ]; } -**fcst, obs** +.. _fcst, obs_1: + +:ref:`fcst, obs ` The fcst and obs entries define the fields for which Ensemble-Stat should compute rank histograms, probability integral transform histograms, @@ -2323,8 +2423,10 @@ data is provided, the climo_cdf thresholds will be used instead. } -**nc_var_str** - +.. _nc_var_str: + +:ref:`nc_var_str ` + The "nc_var_str" entry specifies a string for each ensemble field and verification task in Ensemble-Stat. This string is parsed from each "ens.field" and "obs.field" dictionary entry and is used to customize @@ -2339,7 +2441,9 @@ e.g. nc_var_str = "MIN"; nc_var_str = ""; -**obs_thresh** +.. _obs_thresh: + +:ref:`obs_thresh ` The "obs_thresh" entry is an array of thresholds for filtering observation values prior to applying ensemble verification logic. They specify the values @@ -2352,7 +2456,9 @@ This option may be set separately for each obs.field entry. obs_thresh = [ NA ]; -**skip_const** +.. _skip_const: + +:ref:`skip_const ` Setting "skip_const" to true tells Ensemble-Stat to exclude pairs where all the ensemble members and the observation have a constant value. For example, @@ -2365,7 +2471,9 @@ random. skip_const = FALSE; -**obs_error** +.. _obs_error: + +:ref:`obs_error ` Observation error options @@ -2422,7 +2530,9 @@ levels, and range of values. max = NA; } -**ensemble_flag** +.. _ensemble_flag: + +:ref:`ensemble_flag ` The "ensemble_flag" entry is a dictionary of boolean value indicating which ensemble products should be generated: @@ -2473,7 +2583,9 @@ which ensemble products should be generated: weight = FALSE; } -**rng** +.. _rng: + +:ref:`rng ` See: `Random Number Generator Performance `_ used for random assignment of ranks when they are tied. @@ -2826,7 +2938,9 @@ MET User's Guide for a description of these attributes. MODEConfig_default ~~~~~~~~~~~~~~~~~~ -**quilt** +.. _quilt: + +:ref:`quilt ` The "quilt" entry is a boolean to indicate whether all permutations of convolution radii and thresholds should be run. If set to false, the number @@ -2841,7 +2955,9 @@ MODE will be run. quilt = false; -**fcst, obs** +.. _fcst, obs_2: + +:ref:`fcst, obs ` The object definition settings for MODE are contained within the "fcst" and "obs" entries: @@ -2925,7 +3041,9 @@ The object definition settings for MODE are contained within the "fcst" and merge_flag = THRESH; } -**grid_res** +.. _grid_res: + +:ref:`grid_res ` The "grid_res" entry is the nominal spacing for each grid square in kilometers. The variable is not used directly in the code, but subsequent @@ -2937,7 +3055,9 @@ are used for these variables. grid_res = 4; -**match_flag** +.. _match_flag: + +:ref:`match_flag ` The "match_flag" entry specifies the matching method to be applied: @@ -2955,8 +3075,10 @@ The "match_flag" entry specifies the matching method to be applied: match_flag = MERGE_BOTH; -**max_centroid_dist** - +.. _max_centroid_dist: + +:ref:`max_centroid_dist ` + The "max_centroid_dist" entry specifies the maximum allowable distance in grid squares between the centroids of objects for them to be compared. Setting this to a reasonable value speeds up the runtime enabling MODE to @@ -2966,8 +3088,10 @@ skip unreasonable object comparisons. max_centroid_dist = 800.0/grid_res; -**weight** - +.. _weight: + +:ref:`weight ` + The weight variables control how much weight is assigned to each pairwise attribute when computing a total interest value for object pairs. The weights need not sum to any particular value but must be non-negative. When the @@ -2988,7 +3112,9 @@ sum of the weights listed. inten_perc_value = 50; } -**interest_function** +.. _interest_function: + +:ref:`interest_function ` The set of interest function variables listed define which values are of interest for each pairwise attribute measured. The interest functions may be @@ -3044,7 +3170,9 @@ mathematical functions. inten_perc_ratio = ratio_if; } -**total_interest_thresh** +.. _total_interest_thresh: + +:ref:`total_interest_thresh ` The total_interest_thresh variable should be set between 0 and 1. This threshold is applied to the total interest values computed for each pair of @@ -3054,8 +3182,10 @@ objects and is used in determining matches. total_interest_thresh = 0.7; -**print_interest_thresh** - +.. _print_interest_thresh: + +:ref:`print_interest_thresh ` + The print_interest_thresh variable determines which pairs of object attributes will be written to the output object attribute ASCII file. The user may choose to set the print_interest_thresh to the same value as the @@ -3068,7 +3198,9 @@ the max_centroid_dist variable. print_interest_thresh = 0.0; -**plot_valid_flag** +.. _plot_valid_flag: + +:ref:`plot_valid_flag ` When applied, the plot_valid_flag variable indicates that only the region containing valid data after masking is applied should be plotted. TRUE @@ -3079,7 +3211,9 @@ region containing valid data after masking should be plotted. plot_valid_flag = FALSE; -**plot_gcarc_flag** +.. _plot_gcarc_flag: + +:ref:`plot_gcarc_flag ` When applied, the plot_gcarc_flag variable indicates that the edges of polylines should be plotted using great circle arcs as opposed to straight @@ -3089,7 +3223,9 @@ lines in the grid. plot_gcarc_flag = FALSE; -**ct_stats_flag** +.. _ct_stats_flag: + +:ref:`ct_stats_flag ` The ct_stats_flag can be set to TRUE or FALSE to produce additional output, in the form of contingency table counts and statistics. @@ -3098,8 +3234,10 @@ in the form of contingency table counts and statistics. ct_stats_flag = TRUE; -**shift_right** - +.. _shift_right: + +:ref:`shift_right ` + When MODE is run on global grids, this parameter specifies how many grid squares to shift the grid to the right. MODE does not currently connect objects from one side of a global grid to the other, potentially causing @@ -3173,7 +3311,9 @@ following criteria: 7 - Auxiliary levels generated via interpolation from spanning levels (upper-air profile reports) -**message_type** +.. _message_type: + +:ref:`message_type ` In the PB2NC tool, the "message_type" entry is an array of message types to be retained. An empty list indicates that all should be retained. @@ -3194,7 +3334,9 @@ For example: message_type = []; -**message_type_group_map** +.. _message_type_group_map_2: + +:ref:`message_type_group_map ` Mapping of message type group name to comma-separated list of values. The default setting defines ANYAIR, ANYSFC, and ONLYSF as groups. @@ -3209,8 +3351,10 @@ Derive PRMSL only for SURFACE message types. { key = "ONLYSF"; val = "ADPSFC,SFCSHP"; } ]; -**station_id** - +.. _station_id: + +:ref:`station_id ` + The "station_id" entry is an array of station ids to be retained or the filename which contains station ids. An array of station ids contains a comma-separated list. An empty list indicates that all @@ -3222,7 +3366,9 @@ For example: station_id = [ "KDEN" ]; station_id = []; -**elevation_range** +.. _elevation_range: + +:ref:`elevation_range ` The "elevation_range" entry is a dictionary which contains "beg" and "end" entries specifying the range of observing locations elevations to be @@ -3235,8 +3381,10 @@ retained. end = 100000; } -**pb_report_type** - +.. _pb_report_type: + +:ref:`pb_report_type ` + The "pb_report_type" entry is an array of PREPBUFR report types to be retained. The numeric "pb_report_type" entry allows for further stratification within message types. An empty list indicates that all should @@ -3255,8 +3403,10 @@ For example: pb_report_type = []; -**in_report_type** - +.. _in_report_type: + +:ref:`in_report_type ` + The "in_report_type" entry is an array of input report type values to be retained. The numeric "in_report_type" entry provides additional stratification of observations. An empty list indicates that all should @@ -3274,7 +3424,9 @@ For example: in_report_type = []; -**instrument_type** +.. _instrument_type: + +:ref:`instrument_type ` The "instrument_type" entry is an array of instrument types to be retained. An empty list indicates that all should be retained. @@ -3283,8 +3435,10 @@ An empty list indicates that all should be retained. instrument_type = []; -**level_range** - +.. _level_range: + +:ref:`level_range ` + The "level_range" entry is a dictionary which contains "beg" and "end" entries specifying the range of vertical levels (1 to 255) to be retained. @@ -3295,8 +3449,10 @@ entries specifying the range of vertical levels (1 to 255) to be retained. end = 255; } -**level_category** - +.. _level_category: + +:ref:`level_category ` + The "level_category" entry is an array of integers specifying which level categories should be retained: @@ -3331,7 +3487,9 @@ See: `Current Table A Entries in PREPBUFR mnemonic table ` The "obs_bufr_var" entry is an array of strings containing BUFR variable names to be retained or derived. This replaces the "obs_grib_code" setting @@ -3351,7 +3509,9 @@ command line option to see the list of available observation variables. obs_bufr_var = [ "QOB", "TOB", "ZOB", "UOB", "VOB" ]; -**obs_bufr_map** +.. _obs_bufr_map: + +:ref:`obs_bufr_map ` Mapping of input BUFR variable names to output variables names. The default PREPBUFR map, obs_prepbufr_map, is appended to this map. @@ -3362,8 +3522,10 @@ of the forecast the observation is used to verify. obs_bufr_map = []; -**obs_prefbufr_map** - +.. _obs_prefbufr_map: + +:ref:`obs_prefbufr_map ` + Default mapping for PREPBUFR. Replace input BUFR variable names with GRIB abbreviations in the output. This default map is appended to obs_bufr_map. This should not typically be overridden. This default mapping provides @@ -3387,8 +3549,10 @@ abbreviations to the output. { key = "D_PRMSL"; val = "PRMSL"; } ]; -**quality_mark_thresh** - +.. _quality_mark_thresh: + +:ref:`quality_mark_thresh ` + The "quality_mark_thresh" entry specifies the maximum quality mark value to be retained. Observations with a quality mark LESS THAN OR EQUAL TO this threshold will be retained, while observations with a quality mark @@ -3400,8 +3564,10 @@ See `Code table for observation quality markers ` + The "event_stack_flag" entry is set to "TOP" or "BOTTOM" to specify whether observations should be drawn from the top of the event stack (most quality controlled) or the bottom of the event stack (most raw). @@ -3413,7 +3579,9 @@ stack (most quality controlled) or the bottom of the event stack (most raw). SeriesAnalysisConfig_default ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -**block_size** +.. _block_size: + +:ref:`block_size ` Computation may be memory intensive, especially for large grids. The "block_size" entry sets the number of grid points to be processed @@ -3424,8 +3592,10 @@ require less memory but increase the number of passes through the data. block_size = 1024; -**vld_thresh** - +.. _vld_thresh: + +:ref:`vld_thresh ` + Ratio of valid matched pairs to total length of series for a grid point. If valid threshold is exceeded at that grid point the statistics are computed and stored. If not, a bad data flag is stored. The default @@ -3436,8 +3606,10 @@ setting requires all data in the series to be valid. vld_thresh = 1.0; -**output_stats** - +.. _output_stats: + +:ref:`output_stats ` + Statistical output types need to be specified explicitly. Refer to User's Guide for available output types. To keep output file size reasonable, it is recommended to process a few output types at a time, especially if the @@ -3462,7 +3634,9 @@ grid is large. STATAnalysisConfig_default ~~~~~~~~~~~~~~~~~~~~~~~~~~ -**jobs** +.. _jobs: + +:ref:`jobs ` The "jobs" entry is an array of STAT-Analysis jobs to be performed. Each element in the array contains the specifications for a single analysis @@ -3928,7 +4102,9 @@ confidence intervals computed for the aggregated statistics. WaveletStatConfig_default ~~~~~~~~~~~~~~~~~~~~~~~~~ -**grid_decomp_flag** +.. _grid_decomp_flag: + +:ref:`grid_decomp_flag ` The "grid_decomp_flag" entry specifies how the grid should be decomposed in Wavelet-Stat into dyadic (2^n x 2^n) tiles: @@ -3943,8 +4119,10 @@ Wavelet-Stat into dyadic (2^n x 2^n) tiles: grid_decomp_flag = AUTO; -**tile** - +.. _tile: + +:ref:`tile ` + The "tile" entry is a dictionary that specifies how tiles should be defined in Wavelet-Stat when the "grid_decomp_flag" is set to "TILE": @@ -3967,8 +4145,10 @@ in Wavelet-Stat when the "grid_decomp_flag" is set to "TILE": ]; } -**wavelet** - +.. _wavelet: + +:ref:`wavelet ` + The "wavelet" entry is a dictionary in Wavelet-Stat that specifies how the wavelet decomposition should be performed: @@ -4002,8 +4182,10 @@ wavelet decomposition should be performed: member = 2; } -**obs_raw_plot, wvlt_plot, object_plot** - +.. _obs_raw_wvlt_object_plots: + +:ref:`obs_raw_plot, wvlt_plot, object_plot ` + The "obs_raw_plot", "wvlt_plot", and "object_plot" entries are dictionaries similar to the "fcst_raw_plot" described in the "Settings common to multiple tools" section. @@ -4011,12 +4193,16 @@ tools" section. WWMCARegridConfig_default ~~~~~~~~~~~~~~~~~~~~~~~~~ -**to_grid** +.. _to_grid: + +:ref:`to_grid ` Please see the description of the "to_grid" entry in the "regrid" dictionary above. -**NetCDF output information** - +.. _NetCDF output information: + +:ref:`NetCDF output information ` + Supply the NetCDF output information. For example: .. code-block:: none @@ -4033,15 +4219,19 @@ Supply the NetCDF output information. For example: long_name = ""; level = ""; -**max_minutes (pixel age)** - +.. _max_minutes (pixel age): + +:ref:`max_minutes (pixel age) ` + Maximum pixel age in minutes .. code-block:: none max_minutes = 120; -**swap_endian** +.. _swap_endian: + +:ref:`swap_endian ` The WWMCA pixel age data is stored in binary data files in 4-byte blocks. The swap_endian option indicates whether the endian-ness of the data should @@ -4051,8 +4241,10 @@ be swapped after reading. swap_endian = TRUE; -**write_pixel_age** - +.. _write_pixel_age: + +:ref:`write_pixel_age ` + By default, wwmca_regrid writes the cloud percent data specified on the command line to the output file. This option writes the pixel age data, in minutes, to the output file instead. diff --git a/met/docs/Users_Guide/config_options_tc.rst b/met/docs/Users_Guide/config_options_tc.rst index 11f7330b4b..f3fcc75450 100644 --- a/met/docs/Users_Guide/config_options_tc.rst +++ b/met/docs/Users_Guide/config_options_tc.rst @@ -8,7 +8,9 @@ See :numref:`config_options` for a description of the configuration file syntax. Configuration settings common to multiple tools _______________________________________________ -**storm_id** +.. _storm_id_1: + +:ref:`storm_id ` Specify a comma-separated list of storm id's to be used: @@ -28,7 +30,9 @@ This may also be set using basin, cyclone, and timing information below. storm_id = []; -**basin** +.. _basin: + +:ref:`basin ` Specify a comma-separated list of basins to be used. Expected format is a 2-letter basin identifier. An empty list indicates that all should be used. @@ -46,8 +50,10 @@ For example: basin = []; -**cyclone** - +.. _cyclone: + +:ref:`cyclone ` + Specify a comma-separated list of cyclone numbers (01-99) to be used. An empty list indicates that all should be used. @@ -60,7 +66,9 @@ For example: cyclone = []; -**storm_name** +.. _storm_name_1: + +:ref:`storm_name ` Specify a comma-separated list of storm names to be used. An empty list indicates that all should be used. @@ -74,7 +82,9 @@ For example: storm_name = []; -**init_beg, init_end, init_inc, init_exc** +.. _init_beg end inc exc: + +:ref:`init_beg, init_end, init_inc, init_exc ` Specify a model initialization time window in YYYYMMDD[_HH[MMSS]] format or provide a list of specific initialization times to include (inc) @@ -98,8 +108,10 @@ For example: init_exc = []; -**valid_beg, valid_end** - +.. _valid_beg, valid_end_1: + +:ref:`valid_beg, valid_end ` + Specify a model valid time window in YYYYMMDD[_HH[MMSS]] format. Tracks for which all valid times fall within the time window will be used. An empty string indicates that all times should be used. @@ -116,7 +128,9 @@ For example: valid_beg = ""; valid_end = ""; -**init_hour** +.. _init_hour_1: + +:ref:`init_hour ` Specify a comma-separated list of model initialization hours to be used in HH[MMSS] format. An empty list indicates that all hours should be used. @@ -130,7 +144,9 @@ For example: init_hour = []; -**lead_req** +.. _lead_req: + +:ref:`lead_req ` Specify the required lead time in HH[MMSS] format. Tracks that contain all of these required times will be @@ -143,7 +159,9 @@ all lead times will be used. lead_req = []; -**init_mask, valid_mask** +.. _init_mask, valid_mask: + +:ref:`init_mask, valid_mask ` Specify lat/lon polylines defining masking regions to be applied. Tracks whose initial location falls within init_mask will be used. @@ -159,7 +177,9 @@ For example: init_mask = ""; valid_mask = ""; -**version** +.. _version: + +:ref:`version ` Indicate the version number for the contents of this configuration file. The value should generally not be modified. @@ -176,7 +196,9 @@ _____________________________________ TCPairsConfig_default ~~~~~~~~~~~~~~~~~~~~~ -**model** +.. _model_1: + +:ref:`model ` The "model" entry specifies an array of model names to be verified. If verifying multiple models, choose descriptive model names (no whitespace) @@ -191,8 +213,9 @@ For example: model = []; +.. _check_dup: -**check_dup** +:ref:`check_dup ` Specify whether the code should check for duplicate ATCF lines when building tracks. Setting this to FALSE makes the parsing of tracks quicker. @@ -206,8 +229,10 @@ For example: check_dup = FALSE; -**interp12** - +.. _interp12: + +:ref:`interp12 ` + Specify whether special processing should be performed for interpolated model names ending in 'I' (e.g. AHWI). Search for corresponding tracks whose model name ends in '2' (e.g. AHW2) and apply the following logic: @@ -224,8 +249,10 @@ name ends in '2' (e.g. AHW2) and apply the following logic: interp12 = REPLACE; -**consensus** - +.. _consensus: + +:ref:`consensus ` + Specify how consensus forecasts should be defined: | name = consensus model name @@ -251,8 +278,10 @@ For example: consensus = []; -**lag_time** - +.. _lag_time: + +:ref:`lag_time ` + Specify a comma-separated list of forecast lag times to be used in HH[MMSS] format. For each ADECK track identified, a lagged track will be derived for each entry listed. @@ -267,8 +296,10 @@ For example: lag_time = []; -**best_technique, best_baseline, oper_technique, oper_baseline** - +.. _best: + +:ref:`best_technique, best_baseline, oper_technique, oper_baseline ` + Specify comma-separated lists of CLIPER/SHIFOR baseline forecasts to be derived from the BEST and operational tracks, as defined by the best_technique and oper_technique settings. @@ -292,8 +323,10 @@ For example: oper_baseline = []; -**anly_track** - +.. _anly_track: + +:ref:`anly_track ` + Analysis tracks consist of multiple track points with a lead time of zero for the same storm. An analysis track may be generated by running model analysis fields through a tracking algorithm. Specify which datasets should @@ -310,8 +343,10 @@ For example: anly_track = BDECK; -**match_points** - +.. _match_points: + +:ref:`match_points ` + Specify whether only those track points common to both the ADECK and BDECK tracks should be written out. @@ -326,8 +361,10 @@ For example: match_points = FALSE; -**dland_file** - +.. _dland_file: + +:ref:`dland_file ` + Specify the NetCDF output of the gen_dland tool containing a gridded representation of the minimum distance to land. @@ -337,8 +374,10 @@ representation of the minimum distance to land. dland_file = "MET_BASE/tc_data/dland_nw_hem_tenth_degree.nc"; -**watch_warn** - +.. _watch_warn: + +:ref:`watch_warn ` + Specify watch/warning information. Specify an ASCII file containing watch/warning information to be used. At each track point, the most severe watch/warning status in effect, if any, will be written to the output. @@ -355,8 +394,10 @@ occurring 4 hours (-14400 second) prior to the watch/warning time. } -**basin_map** - +.. _basin_map: + +:ref:`basin_map ` + The basin_map entry defines a mapping of input names to output values. Whenever the basin string matches "key" in the input ATCF files, it is replaced with "val". This map can be used to modify basin names to make them @@ -395,7 +436,9 @@ parameter will result in missed matches. TCStatConfig_default ____________________ -**amodel, bmodel** +.. _amodel, bmodel: + +:ref:`amodel, bmodel ` Stratify by the AMODEL or BMODEL columns. Specify comma-separated lists of model names to be used for all analyses @@ -413,8 +456,9 @@ For example: amodel = []; bmodel = []; +.. _valid_beg end inc exc: -**valid_beg, valid_end, valid_inc, valid_exc** + ref:`valid_beg, valid_end, valid_inc, valid_exc ` Stratify by the VALID times. Define beginning and ending time windows in YYYYMMDD[_HH[MMSS]] @@ -437,8 +481,10 @@ For example: valid_inc = []; valid_exc = []; -**ini_hour, valid_hour, lead, lead_req** - +.. _ini valid_hour lead req: + +:ref:`ini_hour, valid_hour, lead, lead_req ` + Stratify by the initialization and valid hours and lead time. Specify a comma-separated list of initialization hours, valid hours, and lead times in HH[MMSS] format. @@ -461,7 +507,9 @@ For example: lead_req = []; -**line_type** +.. _line_type: + +:ref:`line_type ` Stratify by the LINE_TYPE column. May add using the "-line_type" job command option. @@ -475,8 +523,10 @@ For example: line_type = []; -**track_watch_warn** - +.. _track_watch_warn: + +:ref:`track_watch_warn ` + Stratify by checking the watch/warning status for each track point common to both the ADECK and BDECK tracks. If the watch/warning status of any of the track points appears in the list, retain the entire track. @@ -495,8 +545,10 @@ For example: track_watch_warn = []; -**column_thresh_name, column_thresh_val** - +.. _column_thresh_name_and_val: + +:ref:`column_thresh_name, column_thresh_val ` + Stratify by applying thresholds to numeric data columns. Specify a comma-separated list of columns names and thresholds to be applied. May add using the "-column_thresh name thresh" job command @@ -513,8 +565,10 @@ For example: column_thresh_name = []; column_thresh_val = []; -**column_str_name, column_str_val** - +.. _column_str_name, column_str_val: + +:ref:`column_str_name, column_str_val ` + Stratify by performing string matching on non-numeric data columns. Specify a comma-separated list of columns names and values to be included in the analysis. @@ -531,7 +585,9 @@ For example: column_str_name = []; column_str_val = []; -**column_str_exc_name, column_str_exc_val** +.. _column_str_name val: + +:ref:`column_str_exc_name, column_str_exc_val ` Stratify by performing string matching on non-numeric data columns. Specify a comma-separated list of columns names and values @@ -549,8 +605,10 @@ For example: column_str_exc_name = []; column_str_exc_val = []; -**init_thresh_name, init_thresh_val** - +.. _init_thresh_name, init_thresh_val: + +:ref:`init_thresh_name, init_thresh_val ` + Just like the column_thresh options above, but apply the threshold only when lead = 0. If lead = 0 value does not meet the threshold, discard the entire track. May add using the "-init_thresh name thresh" job command @@ -566,9 +624,10 @@ For example: init_thresh_name = []; init_thresh_val = []; +.. _init_str_name, init_str_val: + +:ref:`init_str_name, init_str_val ` -**init_str_name, init_str_val** - Just like the column_str options above, but apply the string matching only when lead = 0. If lead = 0 string does not match, discard the entire track. May add using the "-init_str name thresh" job command options. @@ -584,8 +643,10 @@ For example: init_str_name = []; init_str_val = []; -**init_str_exc_name, init_str_exc_val** - +.. _init_str_exc_name and _exc_val: + +:ref:`init_str_exc_name, init_str_exc_val ` + Just like the column_str_exc options above, but apply the string matching only when lead = 0. If lead = 0 string does match, discard the entire track. May add using the "-init_str_exc name thresh" job command options. @@ -601,7 +662,9 @@ For example: init_str_exc_name = []; init_str_exc_val = []; -**water_only** +.. _water_only: + +:ref:`water_only ` Stratify by the ADECK and BDECK distances to land. Once either the ADECK or BDECK track encounters land, discard the remainder of the track. @@ -615,7 +678,9 @@ For example: water_only = FALSE; -**rirw** +.. _rirw: + +:ref:`rirw ` Specify whether only those track points for which rapid intensification or weakening of the maximum wind speed occurred in the previous time @@ -647,7 +712,9 @@ May modify using the following job command options: bdeck = adeck; Copy settings to the BDECK or specify different logic. } -**landfall, landfall_beg, landfall_end** +.. _landfall beg end: + +:ref:`landfall, landfall_beg, landfall_end ` Specify whether only those track points occurring near landfall should be retained, and define the landfall retention window as a time string in HH[MMSS] @@ -678,8 +745,10 @@ For example: landfall_beg = "-24"; landfall_end = "00"; -**event_equal** - +.. _event_equal: + +:ref:`event_equal ` + Specify whether only those cases common to all models in the dataset should be retained. May modify using the "-event_equal" job command option. @@ -693,8 +762,10 @@ For example: event_equal = FALSE; -**event_equal_lead** - +.. _event_equal_lead: + +:ref:`event_equal_lead ` + Specify lead times that must be present for a track to be included in the event equalization logic. @@ -703,8 +774,10 @@ event equalization logic. event_equal_lead = [ "12", "24", "36" ]; -**out_int_mask** - +.. _out_int_mask: + +:ref:`out_int_mask ` + Apply polyline masking logic to the location of the ADECK track at the initialization time. If it falls outside the mask, discard the entire track. May modify using the "-out_init_mask" job command option. @@ -719,8 +792,10 @@ For example: out_init_mask = ""; -**out_valid_mask** - +.. _out_valid_mask: + +:ref:`out_valid_mask ` + Apply polyline masking logic to the location of the ADECK track at the valid time. If it falls outside the mask, discard only the current track point. May modify using the "-out_valid_mask" job command option. @@ -734,8 +809,10 @@ For example: out_valid_mask = ""; -**job** - +.. _job: + +:ref:`job ` + The "jobs" entry is an array of TCStat jobs to be performed. Each element in the array contains the specifications for a single analysis job to be performed. The format for an analysis job is as follows: @@ -920,7 +997,9 @@ Where "job_name" is set to one of the following: TCGenConfig_default ___________________ -**int_freq** +.. _int_freq: + +:ref:`int_freq ` Model initialization frequency in hours, starting at 0. @@ -928,8 +1007,10 @@ Model initialization frequency in hours, starting at 0. init_freq = 6; -**lead_window** - +.. _lead_window: + +:ref:`lead_window ` + Lead times in hours to be searched for genesis events. @@ -940,7 +1021,9 @@ Lead times in hours to be searched for genesis events. end = 120; } -**min_duration** +.. _min_duration: + +:ref:`min_duration ` Minimum track duration for genesis event in hours. @@ -948,7 +1031,9 @@ Minimum track duration for genesis event in hours. min_duration = 12; -**fcst_genesis** +.. _fcst_genesis: + +:ref:`fcst_genesis ` Forecast genesis event criteria. Defined as tracks reaching the specified intensity category, maximum wind speed threshold, and minimum sea-level @@ -963,8 +1048,10 @@ track point where all of these criteria are met. mslp_thresh = NA; } -**best_genesis** - +.. _best_genesis: + +:ref:`best_genesis ` + BEST track genesis event criteria. Defined as tracks reaching the specified intensity category, maximum wind speed threshold, and minimum sea-level pressure threshold. The BEST track genesis time is the valid time of the @@ -979,8 +1066,10 @@ first track point where all of these criteria are met. mslp_thresh = NA; } -**oper_genesis** - +.. _oper_genesis: + +:ref:`oper_genesis ` + Operational track genesis event criteria. Defined as tracks reaching the specified intensity category, maximum wind speed threshold, and minimum sea-level pressure threshold. The operational track genesis time is valid @@ -998,7 +1087,9 @@ time of the first track point where all of these criteria are met. Track filtering options which may be specified separately in each filter array entry ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -**filter** +.. _filter: + +:ref:`filter ` Filter is an array of dictionaries containing the track filtering options listed below. If empty, a single filter is defined using the top-level @@ -1008,15 +1099,19 @@ settings. filter = []; -**desc** - +.. _desc: + +:ref:`desc ` + Description written to output DESC column .. code-block:: none desc = "NA"; -**model** +.. _model_2: + +:ref:`model ` Forecast ATCF ID's If empty, all ATCF ID's found will be processed. @@ -1027,7 +1122,9 @@ Statistics will be generated separately for each ATCF ID. model = []; -**storm_id** +.. _storm_id_2: + +:ref:`storm_id ` BEST and operational track storm identifiers @@ -1035,7 +1132,9 @@ BEST and operational track storm identifiers storm_id = []; -**storm_name** +.. _storm_name_2: + +:ref:`storm_name ` BEST and operational track storm names @@ -1043,8 +1142,10 @@ BEST and operational track storm names storm_name = []; -**init_beg, init_end** - +.. _init_beg, init_end2: + +:ref:`init_beg, init_end ` + Forecast and operational initialization time window .. code-block:: none @@ -1052,8 +1153,10 @@ Forecast and operational initialization time window init_beg = ""; init_end = ""; -**valid_beg, valid_end** - +.. _valid_beg, valid_end_2: + +:ref:`valid_beg, valid_end ` + Forecast, BEST, and operational valid time window .. code-block:: none @@ -1061,7 +1164,9 @@ Forecast, BEST, and operational valid time window valid_beg = ""; valid_end = ""; -**init_hour** +.. _init_hour_2: + +:ref:`init_hour ` Forecast and operational initialization hours @@ -1069,7 +1174,9 @@ Forecast and operational initialization hours init_hour = []; -**lead** +.. _lead: + +:ref:`lead ` Forecast and operational lead times in hours @@ -1077,7 +1184,9 @@ Forecast and operational lead times in hours lead = []; -**vx_mask** +.. _vx_mask: + +:ref:`vx_mask ` Spatial masking region (path to gridded data file or polyline file) @@ -1085,7 +1194,9 @@ Spatial masking region (path to gridded data file or polyline file) vx_mask = ""; -**dland_thresh** +.. _dland_thresh: + +:ref:`dland_thresh ` Distance to land threshold @@ -1093,7 +1204,9 @@ Distance to land threshold dland_thresh = NA; -**genesis_window** +.. _genesis_window: + +:ref:`genesis_window ` Genesis matching time window, in hours relative to the forecast genesis time @@ -1104,7 +1217,9 @@ Genesis matching time window, in hours relative to the forecast genesis time end = 24; } -**genesis_radius** +.. _genesis_radius: + +:ref:`genesis_radius ` Genesis matching search radius in km. @@ -1115,7 +1230,9 @@ Genesis matching search radius in km. Global settings _______________ -**ci_alpha** +.. _ci_alpha: + +:ref:`ci_alpha ` Confidence interval alpha value @@ -1123,7 +1240,9 @@ Confidence interval alpha value ci_alpha = 0.05; -**output_flag** +.. _output_flag: + +:ref:`output_flag ` Statistical output types From fd0f0a414d4d08d9f326c4cd2c5a80a2aaa0f7cb Mon Sep 17 00:00:00 2001 From: johnhg Date: Fri, 11 Jun 2021 21:06:33 -0600 Subject: [PATCH 163/165] Feature 1749 hss (#1825) * Per #1749, updating the MET version number from 10.0 to 10.1 prior to adding new columns of output to existing line types. * Per #1749, adding 10.1 columns to the Makefile.am * Per #1749, changes for the mechanics of adding the HSS_EC statistic to the MCTS line type. Still need to acutally compute it and make the expected correct value configurable. * Per #1749, add hss_ec_value as a configurable option for Point-Stat and Grid-Stat. Still need to actually compute it correctly, add it to other test config files, add support to series_analysis/stat_analysis, update the docs, and make writeup corresponding issues for other METplus components. * Per #1749, fix the column offsets for the HSS_EC columns. * Per #1749, add correct definition of HSS_EC. * Per #1749, pass hss_ec_value from the config file into the computation of the MCTS statistics. * Per #1749, add hss_ec_value entry to all the Grid-Stat config files. * Per #1749, update the documentation about the HSS_EC statistic. * Per #1749, add the -hss_ec_value job command option to Stat-Analysis. * Per #1749, no real code changes here. Just changing to consistent ordering with hss_ec_value preceeding rank_corr_flag. * Per #1749, update docs for stat_analysis supporting hss_ec_value. * Per #1749, add HSS_EC to Series-Analysis, but only with a constant hss_ec_value for now. * Per #1749, add EC_VALUE to the MCTC line type definition. * Per #1749, move ECvalue from the MCTSInfo class into the ContingencyTable class so that it's available to be included in the MCTC output line type. * Per #1749, update point_stat, grid_stat, and series_analysis to accomodate the move of ECvalue from the MCTSInfo class to the ContingencyTable class. * Per #1749, update library code to write EC_VALUE to the MCTC line type and update the User's Guide docs. * Per #1749, update stat_analysis code for the addition of EC_VALUE in the MCTC line type. * Per #1749, write EC_VALUE to the MCTC output line type. * Per #1749, store the ec_value that was actually used to compute the stats. * Per #1749, parsing EC_VALUE from the MCTC line type. * Per #1749, move the MCTC EC_VALUE column to the end of the line, as requested by METdatadb. * Per #932, need to write MCTS HSS_EC value to temp file during the bootstrapping process. * Added new reference for Ou 2016 * Layout correction * Added generalized HSS, removed word from HSS_EC * Per #1749, change the hss_ec_value config entry to match new conventions. Co-authored-by: j-opatz <59586397+j-opatz@users.noreply.github.com> --- met/data/config/Ascii2NcConfig_default | 2 +- met/data/config/EnsembleStatConfig_default | 2 +- met/data/config/GridDiagConfig_default | 2 +- met/data/config/GridStatConfig_default | 3 +- met/data/config/MODEAnalysisConfig_default | 2 +- met/data/config/MODEConfig_default | 2 +- met/data/config/MTDConfig_default | 2 +- met/data/config/Madis2NcConfig_default | 2 +- met/data/config/PB2NCConfig_default | 2 +- met/data/config/Point2GridConfig_default | 2 +- met/data/config/PointStatConfig_default | 3 +- met/data/config/RMWAnalysisConfig_default | 2 +- met/data/config/STATAnalysisConfig_GO_Index | 3 +- met/data/config/STATAnalysisConfig_default | 3 +- met/data/config/SeriesAnalysisConfig_default | 3 +- met/data/config/TCGenConfig_default | 2 +- met/data/config/TCPairsConfig_default | 2 +- met/data/config/TCRMWConfig_default | 2 +- met/data/config/TCStatConfig_default | 2 +- met/data/config/WaveletStatConfig_default | 2 +- met/data/table_files/Makefile.am | 1 + .../table_files/met_header_columns_V10.1.txt | 37 ++++++ .../table_files/stat_column_description.txt | 4 + met/docs/Users_Guide/appendixC.rst | 21 +++- met/docs/Users_Guide/config_options.rst | 21 +++- met/docs/Users_Guide/grid-stat.rst | 1 + met/docs/Users_Guide/point-stat.rst | 14 ++- met/docs/Users_Guide/refs.rst | 7 ++ met/docs/Users_Guide/series-analysis.rst | 1 + met/docs/Users_Guide/stat-analysis.rst | 1 + met/scripts/config/EnsembleStatConfig | 2 +- met/scripts/config/GridStatConfig_APCP_12 | 3 +- met/scripts/config/GridStatConfig_APCP_24 | 5 +- met/scripts/config/GridStatConfig_POP_12 | 3 +- met/scripts/config/GridStatConfig_all | 3 +- met/scripts/config/MODEAnalysisConfig | 2 +- met/scripts/config/MODEConfig_APCP_12 | 2 +- met/scripts/config/MODEConfig_APCP_24 | 2 +- met/scripts/config/MODEConfig_RH | 2 +- met/scripts/config/PB2NCConfig_G212 | 2 +- met/scripts/config/PointStatConfig | 2 +- met/scripts/config/STATAnalysisConfig | 3 +- met/scripts/config/WaveletStatConfig_APCP_12 | 2 +- .../config/WaveletStatConfig_APCP_12_NC | 2 +- met/src/basic/vx_config/config_constants.h | 1 + met/src/basic/vx_util/ascii_header.cc | 15 ++- met/src/basic/vx_util/stat_column_defs.h | 15 +-- met/src/basic/vx_util/util_constants.h | 3 +- met/src/libcode/vx_analysis_util/stat_job.cc | 18 +++ met/src/libcode/vx_analysis_util/stat_job.h | 5 + met/src/libcode/vx_stat_out/stat_columns.cc | 33 +++++- met/src/libcode/vx_statistics/compute_ci.cc | 28 ++++- met/src/libcode/vx_statistics/contable.cc | 36 +++++- met/src/libcode/vx_statistics/contable.h | 8 +- .../libcode/vx_statistics/contable_stats.cc | 106 ++++++++++++++++-- met/src/libcode/vx_statistics/met_stats.cc | 20 +++- met/src/libcode/vx_statistics/met_stats.h | 2 +- met/src/tools/core/grid_stat/grid_stat.cc | 2 + .../core/grid_stat/grid_stat_conf_info.cc | 6 +- .../core/grid_stat/grid_stat_conf_info.h | 3 +- met/src/tools/core/point_stat/point_stat.cc | 2 + .../core/point_stat/point_stat_conf_info.cc | 8 +- .../core/point_stat/point_stat_conf_info.h | 1 + .../core/series_analysis/series_analysis.cc | 43 ++++--- .../series_analysis_conf_info.cc | 4 + .../series_analysis_conf_info.h | 1 + .../core/stat_analysis/aggr_stat_line.cc | 2 + .../core/stat_analysis/parse_stat_line.cc | 3 + .../core/stat_analysis/stat_analysis_job.cc | 4 +- test/config/Ascii2NcConfig.surfrad | 2 +- test/config/Ascii2NcConfig_aeronet | 2 +- test/config/EnsembleStatConfig | 2 +- test/config/EnsembleStatConfig_MASK_SID | 2 +- test/config/EnsembleStatConfig_climo | 2 +- test/config/EnsembleStatConfig_grid_weight | 2 +- test/config/EnsembleStatConfig_one_cdf_bin | 2 +- test/config/EnsembleStatConfig_python | 2 +- test/config/EnsembleStatConfig_qty | 2 +- test/config/GridDiagConfig | 2 +- test/config/GridDiagConfig_APCP_06_FCST_OBS | 2 +- test/config/GridDiagConfig_TMP | 2 +- test/config/GridStatConfig_APCP_regrid | 3 +- test/config/GridStatConfig_GRIB_lvl_typ_val | 3 +- test/config/GridStatConfig_GRIB_set_attr | 3 +- test/config/GridStatConfig_GTG_latlon | 3 +- test/config/GridStatConfig_GTG_lc | 3 +- test/config/GridStatConfig_apply_mask | 3 +- test/config/GridStatConfig_climo_WMO | 3 +- test/config/GridStatConfig_climo_prob | 3 +- test/config/GridStatConfig_fourier | 3 +- test/config/GridStatConfig_grid_weight | 3 +- test/config/GridStatConfig_interp_shape | 3 +- test/config/GridStatConfig_mpr_thresh | 3 +- test/config/GridStatConfig_no_leap | 3 +- test/config/GridStatConfig_prob_as_scalar | 3 +- test/config/GridStatConfig_python | 3 +- test/config/GridStatConfig_python_mixed | 3 +- test/config/GridStatConfig_rtma | 3 +- test/config/GridStatConfig_rtma_perc_thresh | 3 +- test/config/GridStatConfig_st4 | 3 +- test/config/GridStatConfig_st4_censor | 3 +- test/config/MODEConfig_cut_line | 2 +- test/config/MODEConfig_hmt | 2 +- test/config/MODEConfig_perc_thresh | 2 +- test/config/MODEConfig_python | 2 +- test/config/MODEConfig_python_mixed | 2 +- test/config/MODEConfig_quilt | 2 +- test/config/MTDConfig_python | 2 +- test/config/Madis2NcConfig_time_summary | 2 +- test/config/NetcdfConfig | 2 +- test/config/PB2NCConfig | 2 +- test/config/PB2NCConfig_airnow | 2 +- test/config/PB2NCConfig_all | 2 +- test/config/PB2NCConfig_summary | 2 +- test/config/PB2NCConfig_vlevel | 2 +- test/config/Point2GridConfig_valid_time | 2 +- test/config/PointStatConfig_APCP | 2 +- test/config/PointStatConfig_APCP_HIRA | 2 +- test/config/PointStatConfig_GTG_latlon | 2 +- test/config/PointStatConfig_GTG_lc | 2 +- test/config/PointStatConfig_INTERP_OPTS | 2 +- test/config/PointStatConfig_LAND_TOPO_MASK | 2 +- test/config/PointStatConfig_MASK_SID | 2 +- test/config/PointStatConfig_PHYS | 2 +- test/config/PointStatConfig_PHYS_pint | 2 +- test/config/PointStatConfig_WINDS | 2 +- test/config/PointStatConfig_aeronet | 2 +- test/config/PointStatConfig_airnow | 2 +- test/config/PointStatConfig_climo | 2 +- test/config/PointStatConfig_climo_WMO | 2 +- test/config/PointStatConfig_climo_prob | 2 +- test/config/PointStatConfig_dup | 2 +- test/config/PointStatConfig_mpr_thresh | 2 +- test/config/PointStatConfig_obs_summary | 2 +- test/config/PointStatConfig_obs_summary_all | 2 +- test/config/PointStatConfig_prob | 2 +- test/config/PointStatConfig_python | 2 +- test/config/PointStatConfig_qty | 2 +- test/config/PointStatConfig_sid_inc_exc | 2 +- test/config/RMWAnalysisConfig | 2 +- test/config/STATAnalysisConfig_APCP_HIRA | 2 +- test/config/STATAnalysisConfig_climo | 2 +- test/config/STATAnalysisConfig_filter_times | 2 +- test/config/STATAnalysisConfig_grid_stat | 2 +- test/config/STATAnalysisConfig_point_stat | 2 +- test/config/STATAnalysisConfig_ramps | 2 +- test/config/SeriesAnalysisConfig | 3 +- test/config/SeriesAnalysisConfig_climo | 3 +- test/config/SeriesAnalysisConfig_conditional | 3 +- test/config/SeriesAnalysisConfig_python | 3 +- test/config/TCGenConfig_2016 | 2 +- test/config/TCPairsConfig_ALAL2010 | 2 +- test/config/TCPairsConfig_BASIN_MAP | 2 +- test/config/TCPairsConfig_INTERP12 | 2 +- test/config/TCPairsConfig_PROBRIRW | 2 +- test/config/TCRMWConfig_gonzalo | 2 +- test/config/TCRMWConfig_pressure_lev_out | 2 +- test/config/TCStatConfig_ALAL2010 | 2 +- test/config/TCStatConfig_PROBRIRW | 2 +- test/config/WaveletStatConfig | 2 +- test/config/WaveletStatConfig_python | 2 +- test/config/WaveletStatConfig_python_mixed | 2 +- test/config/ref_config/GridStatConfig_03h | 3 +- test/config/ref_config/GridStatConfig_24h | 3 +- test/config/ref_config/PB2NCConfig | 2 +- test/config/ref_config/PointStatConfig_ADPUPA | 2 +- test/config/ref_config/PointStatConfig_ONLYSF | 2 +- test/config/ref_config/PointStatConfig_WINDS | 2 +- test/hdr/met_10_1.hdr | 36 ++++++ 169 files changed, 617 insertions(+), 200 deletions(-) create mode 100644 met/data/table_files/met_header_columns_V10.1.txt create mode 100644 test/hdr/met_10_1.hdr diff --git a/met/data/config/Ascii2NcConfig_default b/met/data/config/Ascii2NcConfig_default index 7659fefc88..458e31df81 100644 --- a/met/data/config/Ascii2NcConfig_default +++ b/met/data/config/Ascii2NcConfig_default @@ -49,4 +49,4 @@ message_type_map = [ // Indicate a version number for the contents of this configuration file. // The value should generally not be modified. // -version = "V10.0.0"; +version = "V10.1.0"; diff --git a/met/data/config/EnsembleStatConfig_default b/met/data/config/EnsembleStatConfig_default index 81c0c30c77..e18b258044 100644 --- a/met/data/config/EnsembleStatConfig_default +++ b/met/data/config/EnsembleStatConfig_default @@ -291,6 +291,6 @@ rng = { grid_weight_flag = NONE; output_prefix = ""; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/data/config/GridDiagConfig_default b/met/data/config/GridDiagConfig_default index b2dc85319e..9ff8d0b81e 100644 --- a/met/data/config/GridDiagConfig_default +++ b/met/data/config/GridDiagConfig_default @@ -61,6 +61,6 @@ mask = { //////////////////////////////////////////////////////////////////////////////// -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/data/config/GridStatConfig_default b/met/data/config/GridStatConfig_default index c32872783a..e79a3e42b1 100644 --- a/met/data/config/GridStatConfig_default +++ b/met/data/config/GridStatConfig_default @@ -53,6 +53,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -256,6 +257,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = ""; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/data/config/MODEAnalysisConfig_default b/met/data/config/MODEAnalysisConfig_default index 15363eccfc..2a1e3849c6 100644 --- a/met/data/config/MODEAnalysisConfig_default +++ b/met/data/config/MODEAnalysisConfig_default @@ -188,6 +188,6 @@ unmatched = FALSE; //////////////////////////////////////////////////////////////////////////////// -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/data/config/MODEConfig_default b/met/data/config/MODEConfig_default index e4a5cf9701..0b38827ef3 100644 --- a/met/data/config/MODEConfig_default +++ b/met/data/config/MODEConfig_default @@ -244,6 +244,6 @@ shift_right = 0; // grid squares //////////////////////////////////////////////////////////////////////////////// output_prefix = ""; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/data/config/MTDConfig_default b/met/data/config/MTDConfig_default index af89f2d5ef..6e539d30d6 100644 --- a/met/data/config/MTDConfig_default +++ b/met/data/config/MTDConfig_default @@ -232,6 +232,6 @@ txt_output = { output_prefix = ""; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/data/config/Madis2NcConfig_default b/met/data/config/Madis2NcConfig_default index 0dc7fbdf25..41cfb3a477 100644 --- a/met/data/config/Madis2NcConfig_default +++ b/met/data/config/Madis2NcConfig_default @@ -34,4 +34,4 @@ time_summary = { // Indicate a version number for the contents of this configuration file. // The value should generally not be modified. // -version = "V10.0.0"; +version = "V10.1.0"; diff --git a/met/data/config/PB2NCConfig_default b/met/data/config/PB2NCConfig_default index e20be13f62..82750e9912 100644 --- a/met/data/config/PB2NCConfig_default +++ b/met/data/config/PB2NCConfig_default @@ -153,6 +153,6 @@ time_summary = { //////////////////////////////////////////////////////////////////////////////// tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/data/config/Point2GridConfig_default b/met/data/config/Point2GridConfig_default index 04d62a4364..4429c77d59 100644 --- a/met/data/config/Point2GridConfig_default +++ b/met/data/config/Point2GridConfig_default @@ -77,6 +77,6 @@ quality_mark_thresh = 2; //////////////////////////////////////////////////////////////////////////////// tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/data/config/PointStatConfig_default b/met/data/config/PointStatConfig_default index b0a4981c62..048ff2cb4a 100644 --- a/met/data/config/PointStatConfig_default +++ b/met/data/config/PointStatConfig_default @@ -46,6 +46,7 @@ cnt_logic = UNION; wind_thresh = [ NA ]; wind_logic = UNION; eclv_points = 0.05; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -288,6 +289,6 @@ output_flag = { tmp_dir = "/tmp"; output_prefix = ""; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/data/config/RMWAnalysisConfig_default b/met/data/config/RMWAnalysisConfig_default index 9f68709615..da5d813a30 100644 --- a/met/data/config/RMWAnalysisConfig_default +++ b/met/data/config/RMWAnalysisConfig_default @@ -64,7 +64,7 @@ valid_mask = ""; //////////////////////////////////////////////////////////////////////////////// -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/data/config/STATAnalysisConfig_GO_Index b/met/data/config/STATAnalysisConfig_GO_Index index 4f854fdf30..2b5ce181f5 100644 --- a/met/data/config/STATAnalysisConfig_GO_Index +++ b/met/data/config/STATAnalysisConfig_GO_Index @@ -153,9 +153,10 @@ boot = { //////////////////////////////////////////////////////////////////////////////// +hss_ec_value = NA; rank_corr_flag = FALSE; vif_flag = FALSE; tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/data/config/STATAnalysisConfig_default b/met/data/config/STATAnalysisConfig_default index bc4a50ca44..8ce7bde069 100644 --- a/met/data/config/STATAnalysisConfig_default +++ b/met/data/config/STATAnalysisConfig_default @@ -108,9 +108,10 @@ wmo_fisher_stats = [ "CNT:PR_CORR", "CNT:SP_CORR", //////////////////////////////////////////////////////////////////////////////// +hss_ec_value = NA; rank_corr_flag = FALSE; vif_flag = FALSE; tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/data/config/SeriesAnalysisConfig_default b/met/data/config/SeriesAnalysisConfig_default index d34c85b8c6..c725cb2a5c 100644 --- a/met/data/config/SeriesAnalysisConfig_default +++ b/met/data/config/SeriesAnalysisConfig_default @@ -143,8 +143,9 @@ output_stats = { //////////////////////////////////////////////////////////////////////////////// +hss_ec_value = NA; rank_corr_flag = FALSE; tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/data/config/TCGenConfig_default b/met/data/config/TCGenConfig_default index 1a135491f5..9ed75cc2c2 100644 --- a/met/data/config/TCGenConfig_default +++ b/met/data/config/TCGenConfig_default @@ -282,4 +282,4 @@ nc_pairs_grid = "G003"; // Indicate a version number for the contents of this configuration file. // The value should generally not be modified. // -version = "V10.0.0"; +version = "V10.1.0"; diff --git a/met/data/config/TCPairsConfig_default b/met/data/config/TCPairsConfig_default index 08dbee43d8..8c62d1dce3 100644 --- a/met/data/config/TCPairsConfig_default +++ b/met/data/config/TCPairsConfig_default @@ -145,4 +145,4 @@ basin_map = [ // Indicate a version number for the contents of this configuration file. // The value should generally not be modified. // -version = "V10.0.0"; +version = "V10.1.0"; diff --git a/met/data/config/TCRMWConfig_default b/met/data/config/TCRMWConfig_default index fe587c53e0..8d9acfc338 100644 --- a/met/data/config/TCRMWConfig_default +++ b/met/data/config/TCRMWConfig_default @@ -104,6 +104,6 @@ rmw_scale = 0.2; //////////////////////////////////////////////////////////////////////////////// -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/data/config/TCStatConfig_default b/met/data/config/TCStatConfig_default index d385b01353..3857a8501f 100644 --- a/met/data/config/TCStatConfig_default +++ b/met/data/config/TCStatConfig_default @@ -203,4 +203,4 @@ jobs = []; // Indicate a version number for the contents of this configuration file. // The value should generally not be modified. // -version = "V10.0.0"; +version = "V10.1.0"; diff --git a/met/data/config/WaveletStatConfig_default b/met/data/config/WaveletStatConfig_default index 19cf73eb65..5a50fe2f0d 100644 --- a/met/data/config/WaveletStatConfig_default +++ b/met/data/config/WaveletStatConfig_default @@ -138,6 +138,6 @@ wvlt_plot = { //////////////////////////////////////////////////////////////////////////////// output_prefix = ""; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/data/table_files/Makefile.am b/met/data/table_files/Makefile.am index aac15fa588..354ba05876 100644 --- a/met/data/table_files/Makefile.am +++ b/met/data/table_files/Makefile.am @@ -19,6 +19,7 @@ tablefilesdir = $(pkgdatadir)/table_files tablefiles_DATA = \ + met_header_columns_V10.1.txt \ met_header_columns_V10.0.txt \ met_header_columns_V9.1.txt \ met_header_columns_V9.0.txt \ diff --git a/met/data/table_files/met_header_columns_V10.1.txt b/met/data/table_files/met_header_columns_V10.1.txt new file mode 100644 index 0000000000..6c64d89a5f --- /dev/null +++ b/met/data/table_files/met_header_columns_V10.1.txt @@ -0,0 +1,37 @@ +V10.1 : STAT : CNT : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FBAR FBAR_NCL FBAR_NCU FBAR_BCL FBAR_BCU FSTDEV FSTDEV_NCL FSTDEV_NCU FSTDEV_BCL FSTDEV_BCU OBAR OBAR_NCL OBAR_NCU OBAR_BCL OBAR_BCU OSTDEV OSTDEV_NCL OSTDEV_NCU OSTDEV_BCL OSTDEV_BCU PR_CORR PR_CORR_NCL PR_CORR_NCU PR_CORR_BCL PR_CORR_BCU SP_CORR KT_CORR RANKS FRANK_TIES ORANK_TIES ME ME_NCL ME_NCU ME_BCL ME_BCU ESTDEV ESTDEV_NCL ESTDEV_NCU ESTDEV_BCL ESTDEV_BCU MBIAS MBIAS_BCL MBIAS_BCU MAE MAE_BCL MAE_BCU MSE MSE_BCL MSE_BCU BCMSE BCMSE_BCL BCMSE_BCU RMSE RMSE_BCL RMSE_BCU E10 E10_BCL E10_BCU E25 E25_BCL E25_BCU E50 E50_BCL E50_BCU E75 E75_BCL E75_BCU E90 E90_BCL E90_BCU EIQR EIQR_BCL EIQR_BCU MAD MAD_BCL MAD_BCU ANOM_CORR ANOM_CORR_NCL ANOM_CORR_NCU ANOM_CORR_BCL ANOM_CORR_BCU ME2 ME2_BCL ME2_BCU MSESS MSESS_BCL MSESS_BCU RMSFA RMSFA_BCL RMSFA_BCU RMSOA RMSOA_BCL RMSOA_BCU ANOM_CORR_UNCNTR ANOM_CORR_UNCNTR_BCL ANOM_CORR_UNCNTR_BCU +V10.1 : STAT : CTC : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FY_OY FY_ON FN_OY FN_ON +V10.1 : STAT : CTS : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL BASER BASER_NCL BASER_NCU BASER_BCL BASER_BCU FMEAN FMEAN_NCL FMEAN_NCU FMEAN_BCL FMEAN_BCU ACC ACC_NCL ACC_NCU ACC_BCL ACC_BCU FBIAS FBIAS_BCL FBIAS_BCU PODY PODY_NCL PODY_NCU PODY_BCL PODY_BCU PODN PODN_NCL PODN_NCU PODN_BCL PODN_BCU POFD POFD_NCL POFD_NCU POFD_BCL POFD_BCU FAR FAR_NCL FAR_NCU FAR_BCL FAR_BCU CSI CSI_NCL CSI_NCU CSI_BCL CSI_BCU GSS GSS_BCL GSS_BCU HK HK_NCL HK_NCU HK_BCL HK_BCU HSS HSS_BCL HSS_BCU ODDS ODDS_NCL ODDS_NCU ODDS_BCL ODDS_BCU LODDS LODDS_NCL LODDS_NCU LODDS_BCL LODDS_BCU ORSS ORSS_NCL ORSS_NCU ORSS_BCL ORSS_BCU EDS EDS_NCL EDS_NCU EDS_BCL EDS_BCU SEDS SEDS_NCL SEDS_NCU SEDS_BCL SEDS_BCU EDI EDI_NCL EDI_NCU EDI_BCL EDI_BCU SEDI SEDI_NCL SEDI_NCU SEDI_BCL SEDI_BCU BAGSS BAGSS_BCL BAGSS_BCU +V10.1 : STAT : FHO : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL F_RATE H_RATE O_RATE +V10.1 : STAT : ISC : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL TILE_DIM TILE_XLL TILE_YLL NSCALE ISCALE MSE ISC FENERGY2 OENERGY2 BASER FBIAS +V10.1 : STAT : MCTC : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL (N_CAT) F[0-9]*_O[0-9]* EC_VALUE +V10.1 : STAT : MCTS : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL N_CAT ACC ACC_NCL ACC_NCU ACC_BCL ACC_BCU HK HK_BCL HK_BCU HSS HSS_BCL HSS_BCU GER GER_BCL GER_BCU HSS_EC HSS_EC_BCL HSS_EC_BCU EC_VALUE +V10.1 : STAT : MPR : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL INDEX OBS_SID OBS_LAT OBS_LON OBS_LVL OBS_ELV FCST OBS OBS_QC CLIMO_MEAN CLIMO_STDEV CLIMO_CDF +V10.1 : STAT : NBRCNT : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FBS FBS_BCL FBS_BCU FSS FSS_BCL FSS_BCU AFSS AFSS_BCL AFSS_BCU UFSS UFSS_BCL UFSS_BCU F_RATE F_RATE_BCL F_RATE_BCU O_RATE O_RATE_BCL O_RATE_BCU +V10.1 : STAT : NBRCTC : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FY_OY FY_ON FN_OY FN_ON +V10.1 : STAT : NBRCTS : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL BASER BASER_NCL BASER_NCU BASER_BCL BASER_BCU FMEAN FMEAN_NCL FMEAN_NCU FMEAN_BCL FMEAN_BCU ACC ACC_NCL ACC_NCU ACC_BCL ACC_BCU FBIAS FBIAS_BCL FBIAS_BCU PODY PODY_NCL PODY_NCU PODY_BCL PODY_BCU PODN PODN_NCL PODN_NCU PODN_BCL PODN_BCU POFD POFD_NCL POFD_NCU POFD_BCL POFD_BCU FAR FAR_NCL FAR_NCU FAR_BCL FAR_BCU CSI CSI_NCL CSI_NCU CSI_BCL CSI_BCU GSS GSS_BCL GSS_BCU HK HK_NCL HK_NCU HK_BCL HK_BCU HSS HSS_BCL HSS_BCU ODDS ODDS_NCL ODDS_NCU ODDS_BCL ODDS_BCU LODDS LODDS_NCL LODDS_NCU LODDS_BCL LODDS_BCU ORSS ORSS_NCL ORSS_NCU ORSS_BCL ORSS_BCU EDS EDS_NCL EDS_NCU EDS_BCL EDS_BCU SEDS SEDS_NCL SEDS_NCU SEDS_BCL SEDS_BCU EDI EDI_NCL EDI_NCU EDI_BCL EDI_BCU SEDI SEDI_NCL SEDI_NCU SEDI_BCL SEDI_BCU BAGSS BAGSS_BCL BAGSS_BCU +V10.1 : STAT : GRAD : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FGBAR OGBAR MGBAR EGBAR S1 S1_OG FGOG_RATIO DX DY +V10.1 : STAT : DMAP : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FY OY FBIAS BADDELEY HAUSDORFF MED_FO MED_OF MED_MIN MED_MAX MED_MEAN FOM_FO FOM_OF FOM_MIN FOM_MAX FOM_MEAN ZHU_FO ZHU_OF ZHU_MIN ZHU_MAX ZHU_MEAN +V10.1 : STAT : ORANK : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL INDEX OBS_SID OBS_LAT OBS_LON OBS_LVL OBS_ELV OBS PIT RANK N_ENS_VLD (N_ENS) ENS_[0-9]* OBS_QC ENS_MEAN CLIMO_MEAN SPREAD ENS_MEAN_OERR SPREAD_OERR SPREAD_PLUS_OERR CLIMO_STDEV +V10.1 : STAT : PCT : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL (N_THRESH) THRESH_[0-9]* OY_[0-9]* ON_[0-9]* +V10.1 : STAT : PJC : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL (N_THRESH) THRESH_[0-9]* OY_TP_[0-9]* ON_TP_[0-9]* CALIBRATION_[0-9]* REFINEMENT_[0-9]* LIKELIHOOD_[0-9]* BASER_[0-9]* +V10.1 : STAT : PRC : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL (N_THRESH) THRESH_[0-9]* PODY_[0-9]* POFD_[0-9]* +V10.1 : STAT : PSTD : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL (N_THRESH) BASER BASER_NCL BASER_NCU RELIABILITY RESOLUTION UNCERTAINTY ROC_AUC BRIER BRIER_NCL BRIER_NCU BRIERCL BRIERCL_NCL BRIERCL_NCU BSS BSS_SMPL THRESH_[0-9]* +V10.1 : STAT : ECLV : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL BASER VALUE_BASER (N_PTS) CL_[0-9]* VALUE_[0-9]* +V10.1 : STAT : ECNT : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL N_ENS CRPS CRPSS IGN ME RMSE SPREAD ME_OERR RMSE_OERR SPREAD_OERR SPREAD_PLUS_OERR CRPSCL CRPS_EMP CRPSCL_EMP CRPSS_EMP +V10.1 : STAT : RPS : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL N_PROB RPS_REL RPS_RES RPS_UNC RPS RPSS RPSS_SMPL RPS_COMP +V10.1 : STAT : RHIST : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL (N_RANK) RANK_[0-9]* +V10.1 : STAT : PHIST : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL BIN_SIZE (N_BIN) BIN_[0-9]* +V10.1 : STAT : RELP : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL (N_ENS) RELP_[0-9]* +V10.1 : STAT : SAL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FABAR OABAR FOABAR FFABAR OOABAR MAE +V10.1 : STAT : SL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FBAR OBAR FOBAR FFBAR OOBAR MAE +V10.1 : STAT : SSVAR : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL N_BIN BIN_i BIN_N VAR_MIN VAR_MAX VAR_MEAN FBAR OBAR FOBAR FFBAR OOBAR FBAR_NCL FBAR_NCU FSTDEV FSTDEV_NCL FSTDEV_NCU OBAR_NCL OBAR_NCU OSTDEV OSTDEV_NCL OSTDEV_NCU PR_CORR PR_CORR_NCL PR_CORR_NCU ME ME_NCL ME_NCU ESTDEV ESTDEV_NCL ESTDEV_NCU MBIAS MSE BCMSE RMSE +V10.1 : STAT : VAL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL UFABAR VFABAR UOABAR VOABAR UVFOABAR UVFFABAR UVOOABAR +V10.1 : STAT : VL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL UFBAR VFBAR UOBAR VOBAR UVFOBAR UVFFBAR UVOOBAR F_SPEED_BAR O_SPEED_BAR +V10.1 : STAT : VCNT : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FBAR FBAR_BCL FBAR_BCU OBAR OBAR_BCL OBAR_BCU FS_RMS FS_RMS_BCL FS_RMS_BCU OS_RMS OS_RMS_BCL OS_RMS_BCU MSVE MSVE_BCL MSVE_BCU RMSVE RMSVE_BCL RMSVE_BCU FSTDEV FSTDEV_BCL FSTDEV_BCU OSTDEV OSTDEV_BCL OSTDEV_BCU FDIR FDIR_BCL FDIR_BCU ODIR ODIR_BCL ODIR_BCU FBAR_SPEED FBAR_SPEED_BCL FBAR_SPEED_BCU OBAR_SPEED OBAR_SPEED_BCL OBAR_SPEED_BCU VDIFF_SPEED VDIFF_SPEED_BCL VDIFF_SPEED_BCU VDIFF_DIR VDIFF_DIR_BCL VDIFF_DIR_BCU SPEED_ERR SPEED_ERR_BCL SPEED_ERR_BCU SPEED_ABSERR SPEED_ABSERR_BCL SPEED_ABSERR_BCU DIR_ERR DIR_ERR_BCL DIR_ERR_BCU DIR_ABSERR DIR_ABSERR_BCL DIR_ABSERR_BCU +V10.1 : STAT : GENMPR : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL INDEX STORM_ID AGEN_INIT AGEN_FHR AGEN_LAT AGEN_LON AGEN_DLAND BGEN_LAT BGEN_LON BGEN_DLAND GEN_DIST GEN_TDIFF INIT_TDIFF DEV_CAT OPS_CAT + +V10.1 : MODE : OBJ : VERSION MODEL N_VALID GRID_RES DESC FCST_LEAD FCST_VALID FCST_ACCUM OBS_LEAD OBS_VALID OBS_ACCUM FCST_RAD FCST_THR OBS_RAD OBS_THR FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE OBJECT_ID OBJECT_CAT CENTROID_X CENTROID_Y CENTROID_LAT CENTROID_LON AXIS_ANG LENGTH WIDTH AREA AREA_THRESH CURVATURE CURVATURE_X CURVATURE_Y COMPLEXITY INTENSITY_10 INTENSITY_25 INTENSITY_50 INTENSITY_75 INTENSITY_90 INTENSITY_USER INTENSITY_SUM CENTROID_DIST BOUNDARY_DIST CONVEX_HULL_DIST ANGLE_DIFF ASPECT_DIFF AREA_RATIO INTERSECTION_AREA UNION_AREA SYMMETRIC_DIFF INTERSECTION_OVER_AREA CURVATURE_RATIO COMPLEXITY_RATIO PERCENTILE_INTENSITY_RATIO INTEREST +V10.1 : MODE : CTS : VERSION MODEL N_VALID GRID_RES DESC FCST_LEAD FCST_VALID FCST_ACCUM OBS_LEAD OBS_VALID OBS_ACCUM FCST_RAD FCST_THR OBS_RAD OBS_THR FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE FIELD TOTAL FY_OY FY_ON FN_OY FN_ON BASER FMEAN ACC FBIAS PODY PODN POFD FAR CSI GSS HK HSS ODDS + +V10.1 : TCST : TCMPR : VERSION AMODEL BMODEL DESC STORM_ID BASIN CYCLONE STORM_NAME INIT LEAD VALID INIT_MASK VALID_MASK LINE_TYPE TOTAL INDEX LEVEL WATCH_WARN INITIALS ALAT ALON BLAT BLON TK_ERR X_ERR Y_ERR ALTK_ERR CRTK_ERR ADLAND BDLAND AMSLP BMSLP AMAX_WIND BMAX_WIND AAL_WIND_34 BAL_WIND_34 ANE_WIND_34 BNE_WIND_34 ASE_WIND_34 BSE_WIND_34 ASW_WIND_34 BSW_WIND_34 ANW_WIND_34 BNW_WIND_34 AAL_WIND_50 BAL_WIND_50 ANE_WIND_50 BNE_WIND_50 ASE_WIND_50 BSE_WIND_50 ASW_WIND_50 BSW_WIND_50 ANW_WIND_50 BNW_WIND_50 AAL_WIND_64 BAL_WIND_64 ANE_WIND_64 BNE_WIND_64 ASE_WIND_64 BSE_WIND_64 ASW_WIND_64 BSW_WIND_64 ANW_WIND_64 BNW_WIND_64 ARADP BRADP ARRP BRRP AMRD BMRD AGUSTS BGUSTS AEYE BEYE ADIR BDIR ASPEED BSPEED ADEPTH BDEPTH +V10.1 : TCST : PROBRIRW : VERSION AMODEL BMODEL DESC STORM_ID BASIN CYCLONE STORM_NAME INIT LEAD VALID INIT_MASK VALID_MASK LINE_TYPE ALAT ALON BLAT BLON INITIALS TK_ERR X_ERR Y_ERR ADLAND BDLAND RIRW_BEG RIRW_END RIRW_WINDOW AWIND_END BWIND_BEG BWIND_END BDELTA BDELTA_MAX BLEVEL_BEG BLEVEL_END (N_THRESH) THRESH_[0-9]* PROB_[0-9]* diff --git a/met/data/table_files/stat_column_description.txt b/met/data/table_files/stat_column_description.txt index cc11747af0..b5a10899d0 100644 --- a/met/data/table_files/stat_column_description.txt +++ b/met/data/table_files/stat_column_description.txt @@ -86,6 +86,10 @@ MCTS_HSS_BCU "Heidke skill score bootstrap confidence interval upper limit" MCTS_GER "Gerrity skill score" MCTS_GER_BCL "Gerrity skill score bootstrap confidence interval lower limit" MCTS_GER_BCU "Gerrity skill score bootstrap confidence interval upper limit" +MCTS_HSS_EC "Heidke skill score with expected correct" +MCTS_HSS_EC_BCL "Heidke skill score with expected correct bootstrap confidence interval lower limit" +MCTS_HSS_EC_BCU "Heidke skill score with expected correct bootstrap confidence interval upper limit" +MCTS_EC_VALUE "Heidke skill score expected correct value" CNT_TOTAL "Total number of matched pairs" CNT_FBAR "Forecast mean" CNT_FBAR_NCL "Forecast mean normal confidence interval lower limit" diff --git a/met/docs/Users_Guide/appendixC.rst b/met/docs/Users_Guide/appendixC.rst index 05905e9c67..547e211d7f 100644 --- a/met/docs/Users_Guide/appendixC.rst +++ b/met/docs/Users_Guide/appendixC.rst @@ -240,7 +240,7 @@ HK is also known as the True Skill Statistic (TSS) and less commonly (although p Heidke Skill Score (HSS) ~~~~~~~~~~~~~~~~~~~~~~~~ -Called "HSS" in CTS output :numref:`table_PS_format_info_CTS` +Called "HSS" in CTS output :numref:`table_PS_format_info_CTS` and "HSS" in MCTS output :numref:`table_PS_format_info_MCTS` HSS is a skill score based on Accuracy, where the Accuracy is corrected by the number of correct forecasts that would be expected by chance. In particular, @@ -250,8 +250,27 @@ where .. math:: C_2 = \frac{(n_{11} + n_{10}) (n_{11} + n_{01}) + (n_{01} + n_{00}) (n_{10} + n_{00})}{T}. +A more general format that uses percentages is provided by Ou (:ref:`Ou, 2016 `), + +.. math:: \text{HSS(\%) } = 100 \ast \frac{(H - E)}{(T - E)} + +where H is the number of forecasts in the correct category and E is the expected number of forecasts by chance. + HSS can range from minus infinity to 1. A perfect forecast would have HSS = 1. +Heidke Skill Score - Expected Correct (HSS_EC) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Called "HSS_EC" in MCTS output :numref:`table_PS_format_info_MCTS` + +HSS_EC is a skill score based on Accuracy, where the Accuracy is corrected by the number of correct forecasts that would be expected by chance. In particular, + +.. math:: \text{HSS } = \frac{n_{11} + n_{00} - C_2}{T - C_2}, + +The C_2 value is user-configurable with a default value of T divided by the number of contingency table categories. + +HSS_EC can range from minus infinity to 1. A perfect forecast would have HSS_EC = 1. + Odds Ratio (OR) ~~~~~~~~~~~~~~~ diff --git a/met/docs/Users_Guide/config_options.rst b/met/docs/Users_Guide/config_options.rst index af7af2ec5f..a490ea1e27 100644 --- a/met/docs/Users_Guide/config_options.rst +++ b/met/docs/Users_Guide/config_options.rst @@ -2025,6 +2025,24 @@ by the sum of the weights for the current masking region. grid_weight_flag = NONE; +.. _hss_ec_value: + +ref:`hss_ec_value ` + +The "hss_ec_value" entry is a floating point number used in the computation +of the HSS_EC statistic in the MCTS line type. It specifies the expected +correct (EC) rate by chance for multi-category contingency tables. If set +to its default value of NA, it will automatically be replaced with 1.0 +divided by the MCTC table dimension. For example, for a 4x4 table, the +default hss_ec_value is 1.0 / 4 = 0.25. + +It set, it must greater than or equal to 0.0 and less than 1.0. A value of +0.0 produces an HSS_EC statistic equal to the Accuracy statistic. + +.. code-block:: none + + hss_ec_value = NA; + .. _rank_corr_flag: ref:`rank_corr_flag ` @@ -4010,7 +4028,8 @@ Where "job_name" is set to one of the following: "-boot_seed value" .. code-block:: none - + + "-hss_ec_value value" "-rank_corr_flag value" "-vif_flag value" diff --git a/met/docs/Users_Guide/grid-stat.rst b/met/docs/Users_Guide/grid-stat.rst index ff5808df9c..123954bc47 100644 --- a/met/docs/Users_Guide/grid-stat.rst +++ b/met/docs/Users_Guide/grid-stat.rst @@ -224,6 +224,7 @@ __________________________ mpr_column = []; mpr_thresh = []; eclv_points = 0.05; + hss_ec_value = NA; rank_corr_flag = TRUE; tmp_dir = "/tmp"; output_prefix = ""; diff --git a/met/docs/Users_Guide/point-stat.rst b/met/docs/Users_Guide/point-stat.rst index bfbbc53fba..a1a7cdd9cf 100644 --- a/met/docs/Users_Guide/point-stat.rst +++ b/met/docs/Users_Guide/point-stat.rst @@ -337,6 +337,7 @@ ________________________ mpr_column = []; mpr_thresh = []; eclv_points = 0.05; + hss_ec_value = NA; rank_corr_flag = TRUE; sid_inc = []; sid_exc = []; @@ -873,9 +874,12 @@ The first set of header columns are common to all of the output files generated * - 26 - N_CAT - Dimension of the contingency table - * - 27 + * - 28 - Fi_Oj - Count of events in forecast category i and observation category j, with the observations incrementing first (repeated) + * - \* + - EC_VALUE + - Expected correct rate, used for MCTS HSS_EC .. role:: raw-html(raw) @@ -914,6 +918,12 @@ The first set of header columns are common to all of the output files generated * - 38-40 - GER, :raw-html:`
` GER_BCL, :raw-html:`
` GER_BCU - Gerrity Score and bootstrap confidence limits + * - 41-43 + - HSS_EC, :raw-html:`
` HSS_EC_BCL, :raw-html:`
` HSS_EC_BCU + - Heidke Skill Score with user-specific expected correct and bootstrap confidence limits + * - 44 + - EC_VALUE + - Expected correct rate, used for MCTS HSS_EC .. _table_PS_format_info_PCT: @@ -1081,7 +1091,7 @@ The first set of header columns are common to all of the output files generated * - 29 - POFD_i - Probability of false detection when forecast is greater than the ith probability thresholds (repeated) - * - * + * - \* - THRESH_n - Last probability threshold value diff --git a/met/docs/Users_Guide/refs.rst b/met/docs/Users_Guide/refs.rst index 7e02dcb6d1..a039a91ab8 100644 --- a/met/docs/Users_Guide/refs.rst +++ b/met/docs/Users_Guide/refs.rst @@ -176,6 +176,13 @@ References | verification. *Monthly Weather Review*, 115, 1330-1338. | +.. _Ou-2016: + +| Ou, M. H., Charles, M., & Collins, D. C. 2016: Sensitivity of calibrated week-2 +| probabilistic forecast skill to reforecast sampling of the NCEP global +| ensemble forecast system. *Weather and Forecasting,* 31(4), 1093-1107. +| + .. _Roberts-2008: | Roberts, N.M., and H.W. Lean, 2008: Scale-selective verification of rainfall diff --git a/met/docs/Users_Guide/series-analysis.rst b/met/docs/Users_Guide/series-analysis.rst index bed3367d58..26e7e200ea 100644 --- a/met/docs/Users_Guide/series-analysis.rst +++ b/met/docs/Users_Guide/series-analysis.rst @@ -110,6 +110,7 @@ ____________________ boot = { interval = PCTILE; rep_prop = 1.0; n_rep = 1000; rng = "mt19937"; seed = ""; } mask = { grid = [ "FULL" ]; poly = []; } + hss_ec_value = NA; rank_corr_flag = TRUE; tmp_dir = "/tmp"; version = "VN.N"; diff --git a/met/docs/Users_Guide/stat-analysis.rst b/met/docs/Users_Guide/stat-analysis.rst index 5d3d998fb9..d12ae5746a 100644 --- a/met/docs/Users_Guide/stat-analysis.rst +++ b/met/docs/Users_Guide/stat-analysis.rst @@ -268,6 +268,7 @@ ________________________ boot = { interval = PCTILE; rep_prop = 1.0; n_rep = 1000; rng = "mt19937"; seed = ""; } + hss_ec_value = NA; rank_corr_flag = TRUE; tmp_dir = "/tmp"; version = "VN.N"; diff --git a/met/scripts/config/EnsembleStatConfig b/met/scripts/config/EnsembleStatConfig index 506e5eea3b..c09cb523e8 100644 --- a/met/scripts/config/EnsembleStatConfig +++ b/met/scripts/config/EnsembleStatConfig @@ -302,6 +302,6 @@ rng = { grid_weight_flag = NONE; output_prefix = ""; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/scripts/config/GridStatConfig_APCP_12 b/met/scripts/config/GridStatConfig_APCP_12 index f4308d3bca..e63c3a3d23 100644 --- a/met/scripts/config/GridStatConfig_APCP_12 +++ b/met/scripts/config/GridStatConfig_APCP_12 @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -210,6 +211,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "APCP_12"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/scripts/config/GridStatConfig_APCP_24 b/met/scripts/config/GridStatConfig_APCP_24 index af2cf4f003..9ad9e8bb53 100644 --- a/met/scripts/config/GridStatConfig_APCP_24 +++ b/met/scripts/config/GridStatConfig_APCP_24 @@ -22,7 +22,7 @@ desc = "NA"; // obtype = "MC_PCP"; -//////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////f // // Verification grid @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -220,6 +221,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "APCP_24"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/scripts/config/GridStatConfig_POP_12 b/met/scripts/config/GridStatConfig_POP_12 index c46f639b94..20c48f59a6 100644 --- a/met/scripts/config/GridStatConfig_POP_12 +++ b/met/scripts/config/GridStatConfig_POP_12 @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -220,6 +221,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "POP_12"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/scripts/config/GridStatConfig_all b/met/scripts/config/GridStatConfig_all index 9360adca0a..901ec29565 100644 --- a/met/scripts/config/GridStatConfig_all +++ b/met/scripts/config/GridStatConfig_all @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -251,6 +252,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = ""; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/scripts/config/MODEAnalysisConfig b/met/scripts/config/MODEAnalysisConfig index f068a4161a..c305e257e4 100644 --- a/met/scripts/config/MODEAnalysisConfig +++ b/met/scripts/config/MODEAnalysisConfig @@ -186,6 +186,6 @@ simple = TRUE; //////////////////////////////////////////////////////////////////////////////// -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/scripts/config/MODEConfig_APCP_12 b/met/scripts/config/MODEConfig_APCP_12 index ae652f395a..2eed350075 100644 --- a/met/scripts/config/MODEConfig_APCP_12 +++ b/met/scripts/config/MODEConfig_APCP_12 @@ -240,6 +240,6 @@ shift_right = 0; // grid squares //////////////////////////////////////////////////////////////////////////////// output_prefix = ""; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/scripts/config/MODEConfig_APCP_24 b/met/scripts/config/MODEConfig_APCP_24 index 05f512a8b5..b9e9ee910d 100644 --- a/met/scripts/config/MODEConfig_APCP_24 +++ b/met/scripts/config/MODEConfig_APCP_24 @@ -246,6 +246,6 @@ shift_right = 0; // grid squares //////////////////////////////////////////////////////////////////////////////// output_prefix = ""; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/scripts/config/MODEConfig_RH b/met/scripts/config/MODEConfig_RH index a0f492a964..18ff0de05f 100644 --- a/met/scripts/config/MODEConfig_RH +++ b/met/scripts/config/MODEConfig_RH @@ -242,6 +242,6 @@ shift_right = 0; // grid squares //////////////////////////////////////////////////////////////////////////////// output_prefix = ""; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/scripts/config/PB2NCConfig_G212 b/met/scripts/config/PB2NCConfig_G212 index 2a5e1dce07..d5fbe9c141 100644 --- a/met/scripts/config/PB2NCConfig_G212 +++ b/met/scripts/config/PB2NCConfig_G212 @@ -94,6 +94,6 @@ event_stack_flag = TOP; //////////////////////////////////////////////////////////////////////////////// tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/scripts/config/PointStatConfig b/met/scripts/config/PointStatConfig index 159e9ae1b8..6df8e67daf 100644 --- a/met/scripts/config/PointStatConfig +++ b/met/scripts/config/PointStatConfig @@ -209,6 +209,6 @@ output_flag = { rank_corr_flag = TRUE; tmp_dir = "/tmp"; output_prefix = ""; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/scripts/config/STATAnalysisConfig b/met/scripts/config/STATAnalysisConfig index 4189ff537d..6ff87047e5 100644 --- a/met/scripts/config/STATAnalysisConfig +++ b/met/scripts/config/STATAnalysisConfig @@ -104,9 +104,10 @@ boot = { //////////////////////////////////////////////////////////////////////////////// +hss_ec_value = NA; rank_corr_flag = TRUE; vif_flag = FALSE; tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/scripts/config/WaveletStatConfig_APCP_12 b/met/scripts/config/WaveletStatConfig_APCP_12 index ce14725a80..8abdaddb57 100644 --- a/met/scripts/config/WaveletStatConfig_APCP_12 +++ b/met/scripts/config/WaveletStatConfig_APCP_12 @@ -144,6 +144,6 @@ wvlt_plot = { //////////////////////////////////////////////////////////////////////////////// output_prefix = ""; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/scripts/config/WaveletStatConfig_APCP_12_NC b/met/scripts/config/WaveletStatConfig_APCP_12_NC index d8da0a3646..2598e74883 100644 --- a/met/scripts/config/WaveletStatConfig_APCP_12_NC +++ b/met/scripts/config/WaveletStatConfig_APCP_12_NC @@ -136,6 +136,6 @@ wvlt_plot = { //////////////////////////////////////////////////////////////////////////////// output_prefix = ""; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/met/src/basic/vx_config/config_constants.h b/met/src/basic/vx_config/config_constants.h index 2bb5acbeb8..d3b8773e58 100644 --- a/met/src/basic/vx_config/config_constants.h +++ b/met/src/basic/vx_config/config_constants.h @@ -591,6 +591,7 @@ static const char conf_key_duplicate_flag[] = "duplicate_flag"; static const char conf_key_obs_summary[] = "obs_summary"; static const char conf_key_percentile[] = "obs_perc_value"; static const char conf_key_rank_corr_flag[] = "rank_corr_flag"; +static const char conf_key_hss_ec_value[] = "hss_ec_value"; static const char conf_key_tmp_dir[] = "tmp_dir"; static const char conf_key_output_prefix[] = "output_prefix"; static const char conf_key_met_data_dir[] = "met_data_dir"; diff --git a/met/src/basic/vx_util/ascii_header.cc b/met/src/basic/vx_util/ascii_header.cc index 48a967e84d..3e171cdacb 100644 --- a/met/src/basic/vx_util/ascii_header.cc +++ b/met/src/basic/vx_util/ascii_header.cc @@ -240,9 +240,18 @@ int AsciiHeaderLine::col_offset(const char *name, const int dim) const { // Fixed columns after variable ones else if(match >= (VarBegOffset + NVarCols)) { - offset = match + // Matching column offset - (dim * NVarCols) - // Plus total of variable columns - NVarCols; // Minus variable column names + + // Handle MCTC special case for dim*dim + if(is_mctc()) { + offset = match + // Matching column offset + (dim * dim * NVarCols) - // Plus total of variable columns + NVarCols; // Minus variable column names + } + else { + offset = match + // Matching column offset + (dim * NVarCols) - // Plus total of variable columns + NVarCols; // Minus variable column names + } } // Variable columns diff --git a/met/src/basic/vx_util/stat_column_defs.h b/met/src/basic/vx_util/stat_column_defs.h index 0aad50d004..d34fa22fdd 100644 --- a/met/src/basic/vx_util/stat_column_defs.h +++ b/met/src/basic/vx_util/stat_column_defs.h @@ -64,7 +64,7 @@ static const char * cts_columns [] = { }; static const char * mctc_columns [] = { - "TOTAL", "N_CAT" + "TOTAL", "N_CAT", "Fi_Oj", "EC_VALUE" }; static const char * mcts_columns [] = { @@ -72,7 +72,8 @@ static const char * mcts_columns [] = { "ACC", "ACC_NCL", "ACC_NCU", "ACC_BCL", "ACC_BCU", "HK", "HK_BCL", "HK_BCU", "HSS", "HSS_BCL", "HSS_BCU", - "GER", "GER_BCL", "GER_BCU" + "GER", "GER_BCL", "GER_BCU", + "HSS_EC", "HSS_EC_BCL", "HSS_EC_BCU", "EC_VALUE" }; static const char * cnt_columns [] = { @@ -415,11 +416,11 @@ static const int n_genmpr_columns = sizeof(genmpr_columns)/sizeof(*genmpr_ //////////////////////////////////////////////////////////////////////// -inline int get_n_mctc_columns (int n) { return(2 + n*n); } -inline int get_n_pct_columns (int n) { return(3 + 3*(max(1, n)-1)); } -inline int get_n_pstd_columns (int n) { return(17 + max(1, n) ); } -inline int get_n_pjc_columns (int n) { return(3 + 7*(max(1, n)-1)); } -inline int get_n_prc_columns (int n) { return(3 + 3*(max(1, n)-1)); } +inline int get_n_mctc_columns (int n) { return(3 + n*n); } // n = N_CAT +inline int get_n_pct_columns (int n) { return(3 + 3*(max(1, n)-1)); } // n = N_THRESH +inline int get_n_pstd_columns (int n) { return(17 + max(1, n) ); } // n = N_THRESH +inline int get_n_pjc_columns (int n) { return(3 + 7*(max(1, n)-1)); } // n = N_THRESH +inline int get_n_prc_columns (int n) { return(3 + 3*(max(1, n)-1)); } // n = N_THRESH inline int get_n_eclv_columns (int n) { return(4 + 2*n); } // n = N_PNT inline int get_n_rhist_columns (int n) { return(2 + n); } // n = N_RANK inline int get_n_phist_columns (int n) { return(3 + n); } // n = N_BINS diff --git a/met/src/basic/vx_util/util_constants.h b/met/src/basic/vx_util/util_constants.h index a83e4717a6..ade03d5840 100644 --- a/met/src/basic/vx_util/util_constants.h +++ b/met/src/basic/vx_util/util_constants.h @@ -18,6 +18,7 @@ //////////////////////////////////////////////////////////////////////// // Released versions of MET +static const char met_version_10_1_0[] = "V10.1.0"; static const char met_version_10_0_0[] = "V10.0.0"; static const char met_version_9_1[] = "V9.1"; static const char met_version_9_0[] = "V9.0"; @@ -39,7 +40,7 @@ static const char met_version_1_1[] = "V1.1"; //////////////////////////////////////////////////////////////////////// -static const char * const met_version = met_version_10_0_0; +static const char * const met_version = met_version_10_1_0; static const char default_met_data_dir[] = "MET_BASE"; static const char txt_file_ext[] = ".txt"; static const char stat_file_ext[] = ".stat"; diff --git a/met/src/libcode/vx_analysis_util/stat_job.cc b/met/src/libcode/vx_analysis_util/stat_job.cc index 826c61806d..dcd03688dc 100644 --- a/met/src/libcode/vx_analysis_util/stat_job.cc +++ b/met/src/libcode/vx_analysis_util/stat_job.cc @@ -202,6 +202,7 @@ void STATAnalysisJob::clear() { boot_interval = bad_data_int; boot_rep_prop = bad_data_double; n_boot_rep = bad_data_int; + hss_ec_value = bad_data_double; rank_corr_flag = false; vif_flag = false; @@ -344,6 +345,7 @@ void STATAnalysisJob::assign(const STATAnalysisJob & aj) { boot_rep_prop = aj.boot_rep_prop; n_boot_rep = aj.n_boot_rep; + hss_ec_value = aj.hss_ec_value; rank_corr_flag = aj.rank_corr_flag; vif_flag = aj.vif_flag; @@ -626,6 +628,9 @@ void STATAnalysisJob::dump(ostream & out, int depth) const { out << prefix << "boot_seed = " << boot_seed << "\n"; + out << prefix << "hss_ec_value = " + << hss_ec_value << "\n"; + out << prefix << "rank_corr_flag = " << rank_corr_flag << "\n"; @@ -1601,6 +1606,10 @@ void STATAnalysisJob::parse_job_command(const char *jobstring) { set_boot_seed(jc_array[i+1].c_str()); i++; } + else if(jc_array[i] == "-hss_ec_value") { + hss_ec_value = atof(jc_array[i+1].c_str()); + i++; + } else if(jc_array[i] == "-rank_corr_flag") { rank_corr_flag = atoi(jc_array[i+1].c_str()); i++; @@ -2767,6 +2776,15 @@ ConcatString STATAnalysisJob::get_jobstring() const { } } + // Jobs which write MCTC or MCTS output + if(!is_bad_data(hss_ec_value) && + (out_line_type.has(stat_mctc_str) || + out_line_type.has(stat_mcts_str))) { + + // hss_ec_value + js << "-hss_ec_value " << hss_ec_value << " "; + } + // Jobs which compute rank correlations if(out_line_type.has(stat_cnt_str)) { diff --git a/met/src/libcode/vx_analysis_util/stat_job.h b/met/src/libcode/vx_analysis_util/stat_job.h index e07b962519..72254bef5c 100644 --- a/met/src/libcode/vx_analysis_util/stat_job.h +++ b/met/src/libcode/vx_analysis_util/stat_job.h @@ -323,6 +323,11 @@ class STATAnalysisJob { char *boot_rng; char *boot_seed; + // + // MCTS HSS Expected Correct rate + // + double hss_ec_value; + // // Rank correlation flag // diff --git a/met/src/libcode/vx_stat_out/stat_columns.cc b/met/src/libcode/vx_stat_out/stat_columns.cc index 49b274da18..8c24ba7153 100644 --- a/met/src/libcode/vx_stat_out/stat_columns.cc +++ b/met/src/libcode/vx_stat_out/stat_columns.cc @@ -134,7 +134,7 @@ void write_mctc_header_row(int hdr_flag, int n_cat, AsciiTable &at, at.set_entry(r, c+1, (string)mctc_columns[1]); // Write Fi_Oj for each cell of the NxN table - for(i=0, col=c+2; i " + << "the expected correct values do not match: " + << ECvalue << " != " << t.ECvalue << "\n\n"; + + exit ( 1 ); + +} + if ( E ) { for ( int i=0; isize(); ++i ) (*E)[i] += (*t.E)[i]; } @@ -137,7 +147,8 @@ void ContingencyTable::clear() { if (E) delete E; E = new vector(); - + + ECvalue = bad_data_double; Name.clear(); Nrows = Ncols = 0; @@ -160,6 +171,7 @@ void ContingencyTable::assign(const ContingencyTable & t) if (E) delete E; E = new vector(*(t.E)); + ECvalue = t.ECvalue; Name = t.Name; // @@ -198,14 +210,14 @@ int r, c; Indent prefix(depth); ConcatString junk; -out << prefix << "Name = "; +out << prefix << "Name = "; if ( Name.length() > 0 ) out << '\"' << Name << "\"\n"; else out << "(nul)\n"; -out << prefix << "Nrows = " << Nrows << "\n"; -out << prefix << "Ncols = " << Ncols << "\n"; - +out << prefix << "Nrows = " << Nrows << "\n"; +out << prefix << "Ncols = " << Ncols << "\n"; +out << prefix << "ECvalue = " << ECvalue << "\n"; out << prefix << "\n"; if ( E->empty() ) { out.flush(); return; } @@ -497,6 +509,20 @@ return; //////////////////////////////////////////////////////////////////////// +void ContingencyTable::set_ec_value(double v) + +{ + +ECvalue = v; + +return; + +} + + +//////////////////////////////////////////////////////////////////////// + + void ContingencyTable::set_name(const char * text) { diff --git a/met/src/libcode/vx_statistics/contable.h b/met/src/libcode/vx_statistics/contable.h index dd7dd05ca5..c7b2602dd1 100644 --- a/met/src/libcode/vx_statistics/contable.h +++ b/met/src/libcode/vx_statistics/contable.h @@ -53,6 +53,8 @@ class ContingencyTable { int Nrows; int Ncols; + double ECvalue; + ConcatString Name; public: @@ -82,6 +84,7 @@ class ContingencyTable { virtual void set_size(int); virtual void set_size(int NR, int NC); + void set_ec_value(double); void set_name(const char *); // @@ -91,6 +94,7 @@ class ContingencyTable { int nrows() const; int ncols() const; + double ec_value() const; ConcatString name() const; // @@ -125,6 +129,7 @@ class ContingencyTable { virtual double gaccuracy () const; virtual double gheidke () const; + virtual double gheidke_ec(double) const; virtual double gkuiper () const; virtual double gerrity () const; @@ -137,7 +142,8 @@ class ContingencyTable { inline int ContingencyTable::nrows() const { return ( Nrows ); } inline int ContingencyTable::ncols() const { return ( Ncols ); } -inline ConcatString ContingencyTable::name() const { return ( Name ); } +inline double ContingencyTable::ec_value() const { return ( ECvalue ); } +inline ConcatString ContingencyTable::name() const { return ( Name ); } //////////////////////////////////////////////////////////////////////// diff --git a/met/src/libcode/vx_statistics/contable_stats.cc b/met/src/libcode/vx_statistics/contable_stats.cc index eb51399d43..ab06b0bc6d 100644 --- a/met/src/libcode/vx_statistics/contable_stats.cc +++ b/met/src/libcode/vx_statistics/contable_stats.cc @@ -775,7 +775,8 @@ double ContingencyTable::gaccuracy() const { if ( Nrows != Ncols ) { - mlog << Error << "\nContingencyTable::gaccuracy() -> table not square!\n\n"; + mlog << Error << "\nContingencyTable::gaccuracy() -> " + << "table not square!\n\n"; exit ( 1 ); @@ -795,13 +796,14 @@ double ContingencyTable::gaccuracy() const { //////////////////////////////////////////////////////////////////////// -double ContingencyTable::gheidke()const // Reference: Eq. 7.11, page 249 in Wilks, 1st Ed. +double ContingencyTable::gheidke() const // Reference: Eq. 7.11, page 249 in Wilks, 1st Ed. { if ( Nrows != Ncols ) { - mlog << Error << "\nContingencyTable::gheidke() -> table not square!\n\n"; + mlog << Error << "\nContingencyTable::gheidke() -> " + << "table not square!\n\n"; exit ( 1 ); @@ -811,7 +813,8 @@ const int N = total(); if ( N == 0 ) { - mlog << Error << "\nContingencyTable::gheidke() -> table empty!\n\n"; + mlog << Error << "\nContingencyTable::gheidke() -> " + << "table empty!\n\n"; exit ( 1 ); @@ -875,16 +878,98 @@ return ( ans ); } +//////////////////////////////////////////////////////////////////////// +// +// Reference: +// Ou et al., 2016: Sensitivity of Calibrated Week-2 Probabilistic +// Forecast Skill to Reforecast Sampling of the NCEP Global +// Ensemble Forecast System. +// Weather and Forecasting, 31, 1093-1107. +// +//////////////////////////////////////////////////////////////////////// + +double ContingencyTable::gheidke_ec(double ec_value) const + +{ + +if ( Nrows != Ncols ) { + + mlog << Error << "\nContingencyTable::gheidke_ec(double) -> " + << "table not square!\n\n"; + + exit ( 1 ); + +} + +if ( ec_value < 0.0 || ec_value >= 1.0 ) { + + mlog << Error << "\nContingencyTable::gheidke_ec(double) -> " + << "ec_value (" << ec_value << ") must be >=0 and <1.0!\n\n"; + + exit ( 1 ); + +} + +const int N = total(); + +if ( N == 0 ) { + + mlog << Error << "\nContingencyTable::gheidke_ec(double) -> " + << "table empty!\n\n"; + + exit ( 1 ); + +} + +int j, sum; +double num, denom, ans; + + // + // sum counts on the diagonal + // + +for (j=0, sum=0; j table not square!\n\n"; + mlog << Error << "\nContingencyTable::gkuiper() -> " + << "table not square!\n\n"; exit ( 1 ); @@ -894,7 +979,8 @@ const int N = total(); if ( N == 0 ) { - mlog << Error << "\nContingencyTable::gkuiper() -> table empty!\n\n"; + mlog << Error << "\nContingencyTable::gkuiper() -> " + << "table empty!\n\n"; exit ( 1 ); @@ -982,7 +1068,8 @@ double ContingencyTable::gerrity() const // Reference: Pages 84-91 in if ( Nrows != Ncols ) { - mlog << Error << "\nContingencyTable::gerrity() -> table not square!\n\n"; + mlog << Error << "\nContingencyTable::gerrity() -> " + << "table not square!\n\n"; exit ( 1 ); @@ -992,7 +1079,8 @@ const int N = total(); if ( N == 0 ) { - mlog << Error << "\nContingencyTable::gerrity() -> table empty!\n\n"; + mlog << Error << "\nContingencyTable::gerrity() -> " + << "table empty!\n\n"; exit ( 1 ); diff --git a/met/src/libcode/vx_statistics/met_stats.cc b/met/src/libcode/vx_statistics/met_stats.cc index a01b8a57eb..c65310d3aa 100644 --- a/met/src/libcode/vx_statistics/met_stats.cc +++ b/met/src/libcode/vx_statistics/met_stats.cc @@ -523,6 +523,7 @@ void MCTSInfo::clear() { acc.clear(); hk.clear(); hss.clear(); + hss_ec.clear(); ger.clear(); return; @@ -545,6 +546,7 @@ void MCTSInfo::assign(const MCTSInfo &c) { acc = c.acc; hk = c.hk; hss = c.hss; + hss_ec = c.hss_ec; ger = c.ger; return; @@ -569,6 +571,7 @@ void MCTSInfo::allocate_n_alpha(int i) { acc.allocate_n_alpha(n_alpha); hk.allocate_n_alpha(n_alpha); hss.allocate_n_alpha(n_alpha); + hss_ec.allocate_n_alpha(n_alpha); ger.allocate_n_alpha(n_alpha); } @@ -623,10 +626,19 @@ void MCTSInfo::add(double f, double o, double cmn, double csd) { void MCTSInfo::compute_stats() { - acc.v = cts.gaccuracy(); - hk.v = cts.gkuiper(); - hss.v = cts.gheidke(); - ger.v = cts.gerrity(); + // + // Define the HSS expected correct value, if needed. + // Default to 1 divided by the number of categories. + // + if(is_bad_data(cts.ec_value()) && cts.nrows() > 0) { + cts.set_ec_value(1.0/cts.nrows()); + } + + acc.v = cts.gaccuracy(); + hk.v = cts.gkuiper(); + hss.v = cts.gheidke(); + hss_ec.v = cts.gheidke_ec(cts.ec_value()); + ger.v = cts.gerrity(); return; } diff --git a/met/src/libcode/vx_statistics/met_stats.h b/met/src/libcode/vx_statistics/met_stats.h index 93c1c60020..38d5b3bafd 100644 --- a/met/src/libcode/vx_statistics/met_stats.h +++ b/met/src/libcode/vx_statistics/met_stats.h @@ -128,7 +128,7 @@ class MCTSInfo { ThreshArray fthresh; ThreshArray othresh; - CIInfo acc, hk, hss, ger; + CIInfo acc, hk, hss, hss_ec, ger; void clear(); void allocate_n_alpha(int); diff --git a/met/src/tools/core/grid_stat/grid_stat.cc b/met/src/tools/core/grid_stat/grid_stat.cc index 310677504d..1d75923bf3 100644 --- a/met/src/tools/core/grid_stat/grid_stat.cc +++ b/met/src/tools/core/grid_stat/grid_stat.cc @@ -108,6 +108,7 @@ // nc_pairs_var_str to nc_pairs_var_suffix. // 051 03/28/21 Halley Gotway Add mpr_column and mpr_thresh // filtering options. +// 052 05/28/21 Halley Gotway Add MCTS HSS_EC output. // //////////////////////////////////////////////////////////////////////// @@ -1896,6 +1897,7 @@ void do_mcts(MCTSInfo &mcts_info, int i_vx, // Set up the MCTSInfo size, thresholds, and alpha values // mcts_info.cts.set_size(conf_info.vx_opt[i_vx].fcat_ta.n() + 1); + mcts_info.cts.set_ec_value(conf_info.vx_opt[i_vx].hss_ec_value); mcts_info.set_fthresh(conf_info.vx_opt[i_vx].fcat_ta); mcts_info.set_othresh(conf_info.vx_opt[i_vx].ocat_ta); mcts_info.allocate_n_alpha(conf_info.vx_opt[i_vx].get_n_ci_alpha()); diff --git a/met/src/tools/core/grid_stat/grid_stat_conf_info.cc b/met/src/tools/core/grid_stat/grid_stat_conf_info.cc index 20b1dec99e..0bae27039c 100644 --- a/met/src/tools/core/grid_stat/grid_stat_conf_info.cc +++ b/met/src/tools/core/grid_stat/grid_stat_conf_info.cc @@ -529,6 +529,7 @@ void GridStatVxOpt::clear() { grad_dx.clear(); grad_dy.clear(); + hss_ec_value = bad_data_double; rank_corr_flag = false; for(i=0; i " << "unsupported column name requested \"" << c diff --git a/met/src/tools/core/series_analysis/series_analysis_conf_info.cc b/met/src/tools/core/series_analysis/series_analysis_conf_info.cc index ecd221b6ce..0920787d0f 100644 --- a/met/src/tools/core/series_analysis/series_analysis_conf_info.cc +++ b/met/src/tools/core/series_analysis/series_analysis_conf_info.cc @@ -81,6 +81,7 @@ void SeriesAnalysisConfInfo::clear() { mask_area.clear(); block_size = bad_data_int; vld_data_thresh = bad_data_double; + hss_ec_value = bad_data_double; rank_corr_flag = false; tmp_dir.clear(); version.clear(); @@ -424,6 +425,9 @@ void SeriesAnalysisConfInfo::process_config(GrdFileType ftype, boot_rng = boot_info.rng; boot_seed = boot_info.seed; + // Conf: hss_ec_value + hss_ec_value = conf.lookup_double(conf_key_hss_ec_value); + // Conf: rank_corr_flag rank_corr_flag = conf.lookup_bool(conf_key_rank_corr_flag); diff --git a/met/src/tools/core/series_analysis/series_analysis_conf_info.h b/met/src/tools/core/series_analysis/series_analysis_conf_info.h index 05ed960108..339de45ef4 100644 --- a/met/src/tools/core/series_analysis/series_analysis_conf_info.h +++ b/met/src/tools/core/series_analysis/series_analysis_conf_info.h @@ -72,6 +72,7 @@ class SeriesAnalysisConfInfo { int block_size; // Number of grid points to read concurrently double vld_data_thresh; // Minimum valid data ratio for each point + double hss_ec_value; // MCTS HSS expected correct value bool rank_corr_flag; // Flag for computing rank correlations ConcatString tmp_dir; // Directory for temporary files diff --git a/met/src/tools/core/stat_analysis/aggr_stat_line.cc b/met/src/tools/core/stat_analysis/aggr_stat_line.cc index 6d7d952956..e6f621feb0 100644 --- a/met/src/tools/core/stat_analysis/aggr_stat_line.cc +++ b/met/src/tools/core/stat_analysis/aggr_stat_line.cc @@ -3425,6 +3425,7 @@ void mpr_to_mctc(STATAnalysisJob &job, const AggrMPRInfo &info, // mcts_info.clear(); mcts_info.cts.set_size(job.out_fcst_thresh.n() + 1); + mcts_info.cts.set_ec_value(job.hss_ec_value); mcts_info.set_fthresh(job.out_fcst_thresh); mcts_info.set_othresh(job.out_obs_thresh); @@ -3447,6 +3448,7 @@ void mpr_to_mcts(STATAnalysisJob &job, const AggrMPRInfo &info, // mcts_info.clear(); mcts_info.cts.set_size(job.out_fcst_thresh.n() + 1); + mcts_info.cts.set_ec_value(job.hss_ec_value); mcts_info.set_fthresh(job.out_fcst_thresh); mcts_info.set_othresh(job.out_obs_thresh); diff --git a/met/src/tools/core/stat_analysis/parse_stat_line.cc b/met/src/tools/core/stat_analysis/parse_stat_line.cc index 6f057faf3a..c62180d9f9 100644 --- a/met/src/tools/core/stat_analysis/parse_stat_line.cc +++ b/met/src/tools/core/stat_analysis/parse_stat_line.cc @@ -113,6 +113,9 @@ void parse_mctc_ctable(STATLine &l, ContingencyTable &ct) { } } + // EC_VALUE + ct.set_ec_value(atof(l.get_item("EC_VALUE"))); + return; } diff --git a/met/src/tools/core/stat_analysis/stat_analysis_job.cc b/met/src/tools/core/stat_analysis/stat_analysis_job.cc index 4f585d9e6f..451b6d785f 100644 --- a/met/src/tools/core/stat_analysis/stat_analysis_job.cc +++ b/met/src/tools/core/stat_analysis/stat_analysis_job.cc @@ -42,6 +42,7 @@ // -out_stat, but not both. // 021 04/12/21 Halley Gotway MET #1735 Support multiple // -out_thresh and -out_line_type options. +// 022 05/28/21 Halley Gotway Add MCTS HSS_EC output. // //////////////////////////////////////////////////////////////////////// @@ -113,13 +114,14 @@ void set_job_from_config(MetConfig &c, STATAnalysisJob &job) { job.out_alpha = c.lookup_double(conf_key_out_alpha, false); - boot_info = parse_conf_boot(&c); + boot_info = parse_conf_boot(&c); job.boot_interval = boot_info.interval; job.boot_rep_prop = boot_info.rep_prop; job.n_boot_rep = boot_info.n_rep; job.set_boot_rng(boot_info.rng.c_str()); job.set_boot_seed(boot_info.seed.c_str()); + job.hss_ec_value = c.lookup_double(conf_key_hss_ec_value); job.rank_corr_flag = (int) c.lookup_bool(conf_key_rank_corr_flag); job.vif_flag = (int) c.lookup_bool(conf_key_vif_flag); diff --git a/test/config/Ascii2NcConfig.surfrad b/test/config/Ascii2NcConfig.surfrad index 5002c2d379..caca1df8b7 100644 --- a/test/config/Ascii2NcConfig.surfrad +++ b/test/config/Ascii2NcConfig.surfrad @@ -50,4 +50,4 @@ time_summary = { // Indicate a version number for the contents of this configuration file. // The value should generally not be modified. // -version = "V10.0.0"; +version = "V10.1.0"; diff --git a/test/config/Ascii2NcConfig_aeronet b/test/config/Ascii2NcConfig_aeronet index e435bf9eb5..76dd6954cc 100644 --- a/test/config/Ascii2NcConfig_aeronet +++ b/test/config/Ascii2NcConfig_aeronet @@ -46,4 +46,4 @@ message_type_map = [ // Indicate a version number for the contents of this configuration file. // The value should generally not be modified. // -version = "V10.0.0"; +version = "V10.1.0"; diff --git a/test/config/EnsembleStatConfig b/test/config/EnsembleStatConfig index 41e3dad62e..be1bae6735 100644 --- a/test/config/EnsembleStatConfig +++ b/test/config/EnsembleStatConfig @@ -242,6 +242,6 @@ rng = { grid_weight_flag = NONE; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/EnsembleStatConfig_MASK_SID b/test/config/EnsembleStatConfig_MASK_SID index c0b32d9244..6dd857db76 100644 --- a/test/config/EnsembleStatConfig_MASK_SID +++ b/test/config/EnsembleStatConfig_MASK_SID @@ -233,6 +233,6 @@ rng = { grid_weight_flag = NONE; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/EnsembleStatConfig_climo b/test/config/EnsembleStatConfig_climo index 583ce9dc86..d209f009c9 100644 --- a/test/config/EnsembleStatConfig_climo +++ b/test/config/EnsembleStatConfig_climo @@ -253,6 +253,6 @@ rng = { grid_weight_flag = NONE; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/EnsembleStatConfig_grid_weight b/test/config/EnsembleStatConfig_grid_weight index 9444ddfacb..3a40783171 100644 --- a/test/config/EnsembleStatConfig_grid_weight +++ b/test/config/EnsembleStatConfig_grid_weight @@ -245,6 +245,6 @@ rng = { grid_weight_flag = ${GRID_WEIGHT}; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/EnsembleStatConfig_one_cdf_bin b/test/config/EnsembleStatConfig_one_cdf_bin index 5e838940a9..3343bb6a2e 100644 --- a/test/config/EnsembleStatConfig_one_cdf_bin +++ b/test/config/EnsembleStatConfig_one_cdf_bin @@ -232,6 +232,6 @@ rng = { grid_weight_flag = NONE; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/EnsembleStatConfig_python b/test/config/EnsembleStatConfig_python index aa990d6c85..48eef201c6 100644 --- a/test/config/EnsembleStatConfig_python +++ b/test/config/EnsembleStatConfig_python @@ -273,6 +273,6 @@ rng = { grid_weight_flag = NONE; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/EnsembleStatConfig_qty b/test/config/EnsembleStatConfig_qty index e5bdb92f2f..83ecacdbb1 100644 --- a/test/config/EnsembleStatConfig_qty +++ b/test/config/EnsembleStatConfig_qty @@ -227,6 +227,6 @@ rng = { grid_weight_flag = NONE; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridDiagConfig b/test/config/GridDiagConfig index b2dc85319e..9ff8d0b81e 100644 --- a/test/config/GridDiagConfig +++ b/test/config/GridDiagConfig @@ -61,6 +61,6 @@ mask = { //////////////////////////////////////////////////////////////////////////////// -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridDiagConfig_APCP_06_FCST_OBS b/test/config/GridDiagConfig_APCP_06_FCST_OBS index ca0c00553b..9ddae92cf6 100644 --- a/test/config/GridDiagConfig_APCP_06_FCST_OBS +++ b/test/config/GridDiagConfig_APCP_06_FCST_OBS @@ -56,6 +56,6 @@ mask = { //////////////////////////////////////////////////////////////////////////////// -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridDiagConfig_TMP b/test/config/GridDiagConfig_TMP index 06978fb1ca..14a6c46b4a 100644 --- a/test/config/GridDiagConfig_TMP +++ b/test/config/GridDiagConfig_TMP @@ -67,6 +67,6 @@ mask = { //////////////////////////////////////////////////////////////////////////////// -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_APCP_regrid b/test/config/GridStatConfig_APCP_regrid index 7696febce9..dfcfbf73a7 100644 --- a/test/config/GridStatConfig_APCP_regrid +++ b/test/config/GridStatConfig_APCP_regrid @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -202,6 +203,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_GRIB_lvl_typ_val b/test/config/GridStatConfig_GRIB_lvl_typ_val index 5e0f64d6a7..1b3a539f57 100644 --- a/test/config/GridStatConfig_GRIB_lvl_typ_val +++ b/test/config/GridStatConfig_GRIB_lvl_typ_val @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -299,6 +300,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "GRIB_lvl_typ_val"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_GRIB_set_attr b/test/config/GridStatConfig_GRIB_set_attr index d1d5dbc30d..dae59b6282 100644 --- a/test/config/GridStatConfig_GRIB_set_attr +++ b/test/config/GridStatConfig_GRIB_set_attr @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -231,6 +232,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "GRIB_set_attr"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_GTG_latlon b/test/config/GridStatConfig_GTG_latlon index 648863688e..0f18b04d2d 100644 --- a/test/config/GridStatConfig_GTG_latlon +++ b/test/config/GridStatConfig_GTG_latlon @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -210,6 +211,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_GTG_lc b/test/config/GridStatConfig_GTG_lc index 846f5a2e6e..531a3bb9cf 100644 --- a/test/config/GridStatConfig_GTG_lc +++ b/test/config/GridStatConfig_GTG_lc @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -210,6 +211,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_apply_mask b/test/config/GridStatConfig_apply_mask index 1bb34bb9f1..1c62a9a929 100644 --- a/test/config/GridStatConfig_apply_mask +++ b/test/config/GridStatConfig_apply_mask @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -211,6 +212,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_climo_WMO b/test/config/GridStatConfig_climo_WMO index a9f4c120cf..39e64895ce 100644 --- a/test/config/GridStatConfig_climo_WMO +++ b/test/config/GridStatConfig_climo_WMO @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -271,6 +272,6 @@ nc_pairs_flag = { grid_weight_flag = COS_LAT; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_climo_prob b/test/config/GridStatConfig_climo_prob index 7b91e8da0f..b5f4629bf1 100644 --- a/test/config/GridStatConfig_climo_prob +++ b/test/config/GridStatConfig_climo_prob @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -281,6 +282,6 @@ nc_pairs_flag = { grid_weight_flag = COS_LAT; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_fourier b/test/config/GridStatConfig_fourier index a441acd51f..6b2ba521f3 100644 --- a/test/config/GridStatConfig_fourier +++ b/test/config/GridStatConfig_fourier @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -237,6 +238,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_grid_weight b/test/config/GridStatConfig_grid_weight index 5ea4b6df87..af74b784c7 100644 --- a/test/config/GridStatConfig_grid_weight +++ b/test/config/GridStatConfig_grid_weight @@ -51,6 +51,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; tmp_field = [ { name = "TMP"; level = [ "P500" ]; } ]; @@ -222,6 +223,6 @@ nc_pairs_flag = { grid_weight_flag = ${GRID_WEIGHT}; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_interp_shape b/test/config/GridStatConfig_interp_shape index af303ec165..f6a69c5e35 100644 --- a/test/config/GridStatConfig_interp_shape +++ b/test/config/GridStatConfig_interp_shape @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -205,6 +206,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_mpr_thresh b/test/config/GridStatConfig_mpr_thresh index bd28d883f2..4e95022a48 100644 --- a/test/config/GridStatConfig_mpr_thresh +++ b/test/config/GridStatConfig_mpr_thresh @@ -51,6 +51,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -269,6 +270,6 @@ nc_pairs_flag = { grid_weight_flag = COS_LAT; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_no_leap b/test/config/GridStatConfig_no_leap index 47ab1f474b..3b80dc0330 100644 --- a/test/config/GridStatConfig_no_leap +++ b/test/config/GridStatConfig_no_leap @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -211,6 +212,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_prob_as_scalar b/test/config/GridStatConfig_prob_as_scalar index 13c6143438..f497641518 100644 --- a/test/config/GridStatConfig_prob_as_scalar +++ b/test/config/GridStatConfig_prob_as_scalar @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -232,6 +233,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_python b/test/config/GridStatConfig_python index 0d5e908266..9bb128ac92 100644 --- a/test/config/GridStatConfig_python +++ b/test/config/GridStatConfig_python @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -208,6 +209,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "python"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_python_mixed b/test/config/GridStatConfig_python_mixed index b3a6c2ea2b..38a5f9fa90 100644 --- a/test/config/GridStatConfig_python_mixed +++ b/test/config/GridStatConfig_python_mixed @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -216,6 +217,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "python_mixed"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_rtma b/test/config/GridStatConfig_rtma index 77d491e5b5..b49db75a73 100644 --- a/test/config/GridStatConfig_rtma +++ b/test/config/GridStatConfig_rtma @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -212,6 +213,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_rtma_perc_thresh b/test/config/GridStatConfig_rtma_perc_thresh index cabb9c13df..55b42b4456 100644 --- a/test/config/GridStatConfig_rtma_perc_thresh +++ b/test/config/GridStatConfig_rtma_perc_thresh @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -215,6 +216,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_st4 b/test/config/GridStatConfig_st4 index 7ad113c13f..00dbf1d8a0 100644 --- a/test/config/GridStatConfig_st4 +++ b/test/config/GridStatConfig_st4 @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -216,6 +217,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/GridStatConfig_st4_censor b/test/config/GridStatConfig_st4_censor index 8f088b7a6d..d0ae97d7d9 100644 --- a/test/config/GridStatConfig_st4_censor +++ b/test/config/GridStatConfig_st4_censor @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -225,6 +226,6 @@ nc_pairs_flag = { grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/MODEConfig_cut_line b/test/config/MODEConfig_cut_line index d7e96fde63..105881ad2f 100644 --- a/test/config/MODEConfig_cut_line +++ b/test/config/MODEConfig_cut_line @@ -234,6 +234,6 @@ shift_right = 50; // grid squares //////////////////////////////////////////////////////////////////////////////// output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/MODEConfig_hmt b/test/config/MODEConfig_hmt index 2e633e7385..cad4f3a3c2 100644 --- a/test/config/MODEConfig_hmt +++ b/test/config/MODEConfig_hmt @@ -234,6 +234,6 @@ ct_stats_flag = TRUE; //////////////////////////////////////////////////////////////////////////////// output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/MODEConfig_perc_thresh b/test/config/MODEConfig_perc_thresh index 386db31cfa..659137e487 100644 --- a/test/config/MODEConfig_perc_thresh +++ b/test/config/MODEConfig_perc_thresh @@ -235,6 +235,6 @@ ct_stats_flag = TRUE; //////////////////////////////////////////////////////////////////////////////// output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/MODEConfig_python b/test/config/MODEConfig_python index 109723086c..a638b6603b 100644 --- a/test/config/MODEConfig_python +++ b/test/config/MODEConfig_python @@ -239,6 +239,6 @@ ct_stats_flag = TRUE; //////////////////////////////////////////////////////////////////////////////// output_prefix = "python"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/MODEConfig_python_mixed b/test/config/MODEConfig_python_mixed index f909b4b5f7..56253f07d0 100644 --- a/test/config/MODEConfig_python_mixed +++ b/test/config/MODEConfig_python_mixed @@ -242,6 +242,6 @@ ct_stats_flag = TRUE; //////////////////////////////////////////////////////////////////////////////// output_prefix = "python_mixed"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/MODEConfig_quilt b/test/config/MODEConfig_quilt index 54b431e083..d4b2fcc341 100644 --- a/test/config/MODEConfig_quilt +++ b/test/config/MODEConfig_quilt @@ -232,6 +232,6 @@ ct_stats_flag = TRUE; //////////////////////////////////////////////////////////////////////////////// output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/MTDConfig_python b/test/config/MTDConfig_python index f3d379e7ce..ed68eb6afc 100644 --- a/test/config/MTDConfig_python +++ b/test/config/MTDConfig_python @@ -230,6 +230,6 @@ txt_output = { output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/Madis2NcConfig_time_summary b/test/config/Madis2NcConfig_time_summary index b00db1b0de..7c8c1e586b 100644 --- a/test/config/Madis2NcConfig_time_summary +++ b/test/config/Madis2NcConfig_time_summary @@ -33,4 +33,4 @@ time_summary = { // Indicate a version number for the contents of this configuration file. // The value should generally not be modified. // -version = "V10.0.0"; +version = "V10.1.0"; diff --git a/test/config/NetcdfConfig b/test/config/NetcdfConfig index 5dd9bd155c..e1b0eceaf9 100644 --- a/test/config/NetcdfConfig +++ b/test/config/NetcdfConfig @@ -12,4 +12,4 @@ nc_compression = 2; -version = "V10.0.0"; +version = "V10.1.0"; diff --git a/test/config/PB2NCConfig b/test/config/PB2NCConfig index ca99186394..fbd4b0418c 100644 --- a/test/config/PB2NCConfig +++ b/test/config/PB2NCConfig @@ -101,6 +101,6 @@ event_stack_flag = TOP; //////////////////////////////////////////////////////////////////////////////// tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PB2NCConfig_airnow b/test/config/PB2NCConfig_airnow index 2842bcebcf..f9cba2c0bb 100644 --- a/test/config/PB2NCConfig_airnow +++ b/test/config/PB2NCConfig_airnow @@ -134,6 +134,6 @@ time_summary = { //////////////////////////////////////////////////////////////////////////////// tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PB2NCConfig_all b/test/config/PB2NCConfig_all index 71f235c18e..de74b934fe 100644 --- a/test/config/PB2NCConfig_all +++ b/test/config/PB2NCConfig_all @@ -100,6 +100,6 @@ event_stack_flag = TOP; //////////////////////////////////////////////////////////////////////////////// tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PB2NCConfig_summary b/test/config/PB2NCConfig_summary index 841666ee4d..e2825f289e 100644 --- a/test/config/PB2NCConfig_summary +++ b/test/config/PB2NCConfig_summary @@ -128,6 +128,6 @@ time_summary = { //////////////////////////////////////////////////////////////////////////////// tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PB2NCConfig_vlevel b/test/config/PB2NCConfig_vlevel index eacc39f123..68a8d47925 100644 --- a/test/config/PB2NCConfig_vlevel +++ b/test/config/PB2NCConfig_vlevel @@ -101,6 +101,6 @@ event_stack_flag = TOP; //////////////////////////////////////////////////////////////////////////////// tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/Point2GridConfig_valid_time b/test/config/Point2GridConfig_valid_time index 9463d22cc1..cc93c91b86 100644 --- a/test/config/Point2GridConfig_valid_time +++ b/test/config/Point2GridConfig_valid_time @@ -77,6 +77,6 @@ valid_time = "20201022_173000"; //////////////////////////////////////////////////////////////////////////////// tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_APCP b/test/config/PointStatConfig_APCP index 920034bc27..003f9f50a0 100644 --- a/test/config/PointStatConfig_APCP +++ b/test/config/PointStatConfig_APCP @@ -131,6 +131,6 @@ duplicate_flag = NONE; rank_corr_flag = FALSE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_APCP_HIRA b/test/config/PointStatConfig_APCP_HIRA index e39d21863c..eefbcfdda0 100644 --- a/test/config/PointStatConfig_APCP_HIRA +++ b/test/config/PointStatConfig_APCP_HIRA @@ -134,6 +134,6 @@ duplicate_flag = NONE; rank_corr_flag = FALSE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_GTG_latlon b/test/config/PointStatConfig_GTG_latlon index fc5fa1eef9..7e6e2c53d2 100644 --- a/test/config/PointStatConfig_GTG_latlon +++ b/test/config/PointStatConfig_GTG_latlon @@ -153,6 +153,6 @@ duplicate_flag = NONE; rank_corr_flag = TRUE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_GTG_lc b/test/config/PointStatConfig_GTG_lc index e1c5f89ab2..4b6df47f87 100644 --- a/test/config/PointStatConfig_GTG_lc +++ b/test/config/PointStatConfig_GTG_lc @@ -161,6 +161,6 @@ duplicate_flag = NONE; rank_corr_flag = TRUE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_INTERP_OPTS b/test/config/PointStatConfig_INTERP_OPTS index 1538ce4bf9..4923dab75b 100644 --- a/test/config/PointStatConfig_INTERP_OPTS +++ b/test/config/PointStatConfig_INTERP_OPTS @@ -144,6 +144,6 @@ duplicate_flag = NONE; rank_corr_flag = FALSE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_LAND_TOPO_MASK b/test/config/PointStatConfig_LAND_TOPO_MASK index 9d9e77564e..74d7e28be1 100644 --- a/test/config/PointStatConfig_LAND_TOPO_MASK +++ b/test/config/PointStatConfig_LAND_TOPO_MASK @@ -184,6 +184,6 @@ duplicate_flag = NONE; rank_corr_flag = TRUE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_MASK_SID b/test/config/PointStatConfig_MASK_SID index b9afca5389..95c30a9d16 100644 --- a/test/config/PointStatConfig_MASK_SID +++ b/test/config/PointStatConfig_MASK_SID @@ -139,6 +139,6 @@ duplicate_flag = NONE; rank_corr_flag = TRUE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_PHYS b/test/config/PointStatConfig_PHYS index aea79c4b19..4a5640ddcb 100644 --- a/test/config/PointStatConfig_PHYS +++ b/test/config/PointStatConfig_PHYS @@ -140,6 +140,6 @@ duplicate_flag = NONE; rank_corr_flag = TRUE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_PHYS_pint b/test/config/PointStatConfig_PHYS_pint index be5abaaf6f..9102584bff 100644 --- a/test/config/PointStatConfig_PHYS_pint +++ b/test/config/PointStatConfig_PHYS_pint @@ -135,6 +135,6 @@ duplicate_flag = NONE; rank_corr_flag = TRUE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_WINDS b/test/config/PointStatConfig_WINDS index 3dc709d48c..4f17fff75a 100644 --- a/test/config/PointStatConfig_WINDS +++ b/test/config/PointStatConfig_WINDS @@ -155,6 +155,6 @@ duplicate_flag = NONE; rank_corr_flag = TRUE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_aeronet b/test/config/PointStatConfig_aeronet index a1405e9424..b36dd7f39c 100644 --- a/test/config/PointStatConfig_aeronet +++ b/test/config/PointStatConfig_aeronet @@ -205,6 +205,6 @@ duplicate_flag = NONE; rank_corr_flag = TRUE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_airnow b/test/config/PointStatConfig_airnow index eb18e2000f..cbf3c76c11 100644 --- a/test/config/PointStatConfig_airnow +++ b/test/config/PointStatConfig_airnow @@ -232,6 +232,6 @@ output_flag = { tmp_dir = "/tmp"; output_prefix = ""; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_climo b/test/config/PointStatConfig_climo index 17005f9979..cd81aa6fbf 100644 --- a/test/config/PointStatConfig_climo +++ b/test/config/PointStatConfig_climo @@ -274,6 +274,6 @@ duplicate_flag = NONE; rank_corr_flag = TRUE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_climo_WMO b/test/config/PointStatConfig_climo_WMO index 722edd4881..fa7499ab84 100644 --- a/test/config/PointStatConfig_climo_WMO +++ b/test/config/PointStatConfig_climo_WMO @@ -222,6 +222,6 @@ duplicate_flag = NONE; rank_corr_flag = TRUE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_climo_prob b/test/config/PointStatConfig_climo_prob index 53a754b87c..18ac41ccdf 100644 --- a/test/config/PointStatConfig_climo_prob +++ b/test/config/PointStatConfig_climo_prob @@ -224,6 +224,6 @@ duplicate_flag = NONE; rank_corr_flag = TRUE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_dup b/test/config/PointStatConfig_dup index e67fb84089..4dfe9f5c11 100644 --- a/test/config/PointStatConfig_dup +++ b/test/config/PointStatConfig_dup @@ -157,6 +157,6 @@ duplicate_flag = ${DUPLICATE_FLAG}; rank_corr_flag = FALSE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_mpr_thresh b/test/config/PointStatConfig_mpr_thresh index 6a33eebf2a..daf7a11d2f 100644 --- a/test/config/PointStatConfig_mpr_thresh +++ b/test/config/PointStatConfig_mpr_thresh @@ -216,6 +216,6 @@ duplicate_flag = NONE; rank_corr_flag = TRUE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_obs_summary b/test/config/PointStatConfig_obs_summary index 03b00e3438..908f86e44c 100644 --- a/test/config/PointStatConfig_obs_summary +++ b/test/config/PointStatConfig_obs_summary @@ -145,6 +145,6 @@ output_flag = { rank_corr_flag = FALSE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_obs_summary_all b/test/config/PointStatConfig_obs_summary_all index 329a3bd05f..636ed3d001 100644 --- a/test/config/PointStatConfig_obs_summary_all +++ b/test/config/PointStatConfig_obs_summary_all @@ -214,6 +214,6 @@ output_flag = { rank_corr_flag = FALSE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_prob b/test/config/PointStatConfig_prob index c1d7f8d58f..b1fe365e2b 100644 --- a/test/config/PointStatConfig_prob +++ b/test/config/PointStatConfig_prob @@ -142,6 +142,6 @@ duplicate_flag = NONE; rank_corr_flag = FALSE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_python b/test/config/PointStatConfig_python index 2b073fff61..0c66c8c4f0 100644 --- a/test/config/PointStatConfig_python +++ b/test/config/PointStatConfig_python @@ -211,7 +211,7 @@ output_flag = { rank_corr_flag = FALSE; tmp_dir = "/tmp"; output_prefix = ""; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_qty b/test/config/PointStatConfig_qty index a8255ffa70..98ad597e46 100644 --- a/test/config/PointStatConfig_qty +++ b/test/config/PointStatConfig_qty @@ -164,6 +164,6 @@ duplicate_flag = NONE; rank_corr_flag = TRUE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/PointStatConfig_sid_inc_exc b/test/config/PointStatConfig_sid_inc_exc index 70f17d7943..62e6e9b43f 100644 --- a/test/config/PointStatConfig_sid_inc_exc +++ b/test/config/PointStatConfig_sid_inc_exc @@ -148,6 +148,6 @@ obs_summary = NEAREST; rank_corr_flag = TRUE; tmp_dir = "/tmp"; output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/RMWAnalysisConfig b/test/config/RMWAnalysisConfig index 9f68709615..da5d813a30 100644 --- a/test/config/RMWAnalysisConfig +++ b/test/config/RMWAnalysisConfig @@ -64,7 +64,7 @@ valid_mask = ""; //////////////////////////////////////////////////////////////////////////////// -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/STATAnalysisConfig_APCP_HIRA b/test/config/STATAnalysisConfig_APCP_HIRA index b1ca1898d0..22faf3ae7a 100644 --- a/test/config/STATAnalysisConfig_APCP_HIRA +++ b/test/config/STATAnalysisConfig_APCP_HIRA @@ -101,6 +101,6 @@ boot = { rank_corr_flag = TRUE; vif_flag = FALSE; tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/STATAnalysisConfig_climo b/test/config/STATAnalysisConfig_climo index 969fbac88e..d316900db6 100644 --- a/test/config/STATAnalysisConfig_climo +++ b/test/config/STATAnalysisConfig_climo @@ -107,6 +107,6 @@ wmo_fisher_stats = [ "CNT:PR_CORR", "CNT:SP_CORR", rank_corr_flag = FALSE; vif_flag = FALSE; tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/STATAnalysisConfig_filter_times b/test/config/STATAnalysisConfig_filter_times index b9f296d24b..8a9d7afcb4 100644 --- a/test/config/STATAnalysisConfig_filter_times +++ b/test/config/STATAnalysisConfig_filter_times @@ -104,6 +104,6 @@ boot = { rank_corr_flag = TRUE; vif_flag = FALSE; tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/STATAnalysisConfig_grid_stat b/test/config/STATAnalysisConfig_grid_stat index b29fcbe58a..1453703dfc 100644 --- a/test/config/STATAnalysisConfig_grid_stat +++ b/test/config/STATAnalysisConfig_grid_stat @@ -97,6 +97,6 @@ boot = { rank_corr_flag = TRUE; vif_flag = FALSE; tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/STATAnalysisConfig_point_stat b/test/config/STATAnalysisConfig_point_stat index 4d1a402a26..31603edab7 100644 --- a/test/config/STATAnalysisConfig_point_stat +++ b/test/config/STATAnalysisConfig_point_stat @@ -118,6 +118,6 @@ boot = { rank_corr_flag = TRUE; vif_flag = FALSE; tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/STATAnalysisConfig_ramps b/test/config/STATAnalysisConfig_ramps index cd6ec9f268..5a5d06e424 100644 --- a/test/config/STATAnalysisConfig_ramps +++ b/test/config/STATAnalysisConfig_ramps @@ -96,6 +96,6 @@ boot = { rank_corr_flag = TRUE; vif_flag = FALSE; tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/SeriesAnalysisConfig b/test/config/SeriesAnalysisConfig index 3765058299..8c5e965230 100644 --- a/test/config/SeriesAnalysisConfig +++ b/test/config/SeriesAnalysisConfig @@ -109,8 +109,9 @@ output_stats = { //////////////////////////////////////////////////////////////////////////////// +hss_ec_value = NA; rank_corr_flag = FALSE; tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/SeriesAnalysisConfig_climo b/test/config/SeriesAnalysisConfig_climo index e3ca67d4b3..a1ceb41577 100644 --- a/test/config/SeriesAnalysisConfig_climo +++ b/test/config/SeriesAnalysisConfig_climo @@ -140,8 +140,9 @@ output_stats = { //////////////////////////////////////////////////////////////////////////////// +hss_ec_value = NA; rank_corr_flag = FALSE; tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/SeriesAnalysisConfig_conditional b/test/config/SeriesAnalysisConfig_conditional index 96318ddee9..a4b1447a1c 100644 --- a/test/config/SeriesAnalysisConfig_conditional +++ b/test/config/SeriesAnalysisConfig_conditional @@ -109,8 +109,9 @@ output_stats = { //////////////////////////////////////////////////////////////////////////////// +hss_ec_value = NA; rank_corr_flag = FALSE; tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/SeriesAnalysisConfig_python b/test/config/SeriesAnalysisConfig_python index 84dbd5cdd5..945a1a56b6 100644 --- a/test/config/SeriesAnalysisConfig_python +++ b/test/config/SeriesAnalysisConfig_python @@ -140,8 +140,9 @@ output_stats = { //////////////////////////////////////////////////////////////////////////////// +hss_ec_value = NA; rank_corr_flag = FALSE; tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/TCGenConfig_2016 b/test/config/TCGenConfig_2016 index 28ec263e85..b1d78ba8e7 100644 --- a/test/config/TCGenConfig_2016 +++ b/test/config/TCGenConfig_2016 @@ -326,4 +326,4 @@ nc_pairs_grid = "G003"; // Indicate a version number for the contents of this configuration file. // The value should generally not be modified. // -version = "V10.0.0"; +version = "V10.1.0"; diff --git a/test/config/TCPairsConfig_ALAL2010 b/test/config/TCPairsConfig_ALAL2010 index 8e8c6e8416..8468de62e7 100644 --- a/test/config/TCPairsConfig_ALAL2010 +++ b/test/config/TCPairsConfig_ALAL2010 @@ -136,4 +136,4 @@ basin_map = [ // Indicate a version number for the contents of this configuration file. // The value should generally not be modified. // -version = "V10.0.0"; +version = "V10.1.0"; diff --git a/test/config/TCPairsConfig_BASIN_MAP b/test/config/TCPairsConfig_BASIN_MAP index 794470fa31..a66e91e031 100644 --- a/test/config/TCPairsConfig_BASIN_MAP +++ b/test/config/TCPairsConfig_BASIN_MAP @@ -137,4 +137,4 @@ basin_map = [ // Indicate a version number for the contents of this configuration file. // The value should generally not be modified. // -version = "V10.0.0"; +version = "V10.1.0"; diff --git a/test/config/TCPairsConfig_INTERP12 b/test/config/TCPairsConfig_INTERP12 index e736c246d6..8183e6b73a 100644 --- a/test/config/TCPairsConfig_INTERP12 +++ b/test/config/TCPairsConfig_INTERP12 @@ -137,4 +137,4 @@ basin_map = [ // Indicate a version number for the contents of this configuration file. // The value should generally not be modified. // -version = "V10.0.0"; +version = "V10.1.0"; diff --git a/test/config/TCPairsConfig_PROBRIRW b/test/config/TCPairsConfig_PROBRIRW index 8927788054..db7d915ee7 100644 --- a/test/config/TCPairsConfig_PROBRIRW +++ b/test/config/TCPairsConfig_PROBRIRW @@ -136,4 +136,4 @@ basin_map = [ // Indicate a version number for the contents of this configuration file. // The value should generally not be modified. // -version = "V10.0.0"; +version = "V10.1.0"; diff --git a/test/config/TCRMWConfig_gonzalo b/test/config/TCRMWConfig_gonzalo index 29eb10d0a0..933bb6c153 100644 --- a/test/config/TCRMWConfig_gonzalo +++ b/test/config/TCRMWConfig_gonzalo @@ -105,6 +105,6 @@ rmw_scale = 0.2; //////////////////////////////////////////////////////////////////////////////// -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/TCRMWConfig_pressure_lev_out b/test/config/TCRMWConfig_pressure_lev_out index fae14f3330..df980f1295 100644 --- a/test/config/TCRMWConfig_pressure_lev_out +++ b/test/config/TCRMWConfig_pressure_lev_out @@ -105,6 +105,6 @@ rmw_scale = 0.2; //////////////////////////////////////////////////////////////////////////////// -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/TCStatConfig_ALAL2010 b/test/config/TCStatConfig_ALAL2010 index 8f59d36f5b..33a746fe84 100644 --- a/test/config/TCStatConfig_ALAL2010 +++ b/test/config/TCStatConfig_ALAL2010 @@ -204,4 +204,4 @@ jobs = [ // Indicate a version number for the contents of this configuration file. // The value should generally not be modified. // -version = "V10.0.0"; +version = "V10.1.0"; diff --git a/test/config/TCStatConfig_PROBRIRW b/test/config/TCStatConfig_PROBRIRW index bf443a9e66..8dd855f4f2 100644 --- a/test/config/TCStatConfig_PROBRIRW +++ b/test/config/TCStatConfig_PROBRIRW @@ -200,4 +200,4 @@ jobs = [ // Indicate a version number for the contents of this configuration file. // The value should generally not be modified. // -version = "V10.0.0"; +version = "V10.1.0"; diff --git a/test/config/WaveletStatConfig b/test/config/WaveletStatConfig index 384ccaab1f..b9a3983bdf 100644 --- a/test/config/WaveletStatConfig +++ b/test/config/WaveletStatConfig @@ -134,6 +134,6 @@ wvlt_plot = { //////////////////////////////////////////////////////////////////////////////// output_prefix = "${OUTPUT_PREFIX}"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/WaveletStatConfig_python b/test/config/WaveletStatConfig_python index 9d0d7b80a9..28df2065a8 100644 --- a/test/config/WaveletStatConfig_python +++ b/test/config/WaveletStatConfig_python @@ -125,6 +125,6 @@ wvlt_plot = { //////////////////////////////////////////////////////////////////////////////// output_prefix = "python"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/WaveletStatConfig_python_mixed b/test/config/WaveletStatConfig_python_mixed index 479f438748..a5e09298b7 100644 --- a/test/config/WaveletStatConfig_python_mixed +++ b/test/config/WaveletStatConfig_python_mixed @@ -134,6 +134,6 @@ wvlt_plot = { //////////////////////////////////////////////////////////////////////////////// output_prefix = "python_mixed"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/ref_config/GridStatConfig_03h b/test/config/ref_config/GridStatConfig_03h index ce8b0f982c..70f885dd08 100644 --- a/test/config/ref_config/GridStatConfig_03h +++ b/test/config/ref_config/GridStatConfig_03h @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -198,6 +199,6 @@ nc_pairs_flag = FALSE; grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "${MODEL}_F${FCST_TIME}_03h"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/ref_config/GridStatConfig_24h b/test/config/ref_config/GridStatConfig_24h index 1f7fb01cda..a66ffcf276 100644 --- a/test/config/ref_config/GridStatConfig_24h +++ b/test/config/ref_config/GridStatConfig_24h @@ -52,6 +52,7 @@ wind_logic = UNION; eclv_points = 0.05; nc_pairs_var_name = ""; nc_pairs_var_suffix = ""; +hss_ec_value = NA; rank_corr_flag = FALSE; // @@ -198,6 +199,6 @@ nc_pairs_flag = FALSE; grid_weight_flag = NONE; tmp_dir = "/tmp"; output_prefix = "${MODEL}_F${FCST_TIME}_24h"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/ref_config/PB2NCConfig b/test/config/ref_config/PB2NCConfig index 0840d4c2aa..21bfdf4fb4 100644 --- a/test/config/ref_config/PB2NCConfig +++ b/test/config/ref_config/PB2NCConfig @@ -101,6 +101,6 @@ event_stack_flag = TOP; //////////////////////////////////////////////////////////////////////////////// tmp_dir = "/tmp"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/ref_config/PointStatConfig_ADPUPA b/test/config/ref_config/PointStatConfig_ADPUPA index a458683711..8c3be8c75e 100644 --- a/test/config/ref_config/PointStatConfig_ADPUPA +++ b/test/config/ref_config/PointStatConfig_ADPUPA @@ -182,6 +182,6 @@ duplicate_flag = NONE; rank_corr_flag = FALSE; tmp_dir = "/tmp"; output_prefix = "${MODEL}_F${FCST_TIME}_ADPUPA"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/ref_config/PointStatConfig_ONLYSF b/test/config/ref_config/PointStatConfig_ONLYSF index 9276f52a45..4dbf27b30c 100644 --- a/test/config/ref_config/PointStatConfig_ONLYSF +++ b/test/config/ref_config/PointStatConfig_ONLYSF @@ -192,6 +192,6 @@ duplicate_flag = NONE; rank_corr_flag = FALSE; tmp_dir = "/tmp"; output_prefix = "${MODEL}_F${FCST_TIME}_ONLYSF"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/config/ref_config/PointStatConfig_WINDS b/test/config/ref_config/PointStatConfig_WINDS index 5e18b2f1dc..3309419131 100644 --- a/test/config/ref_config/PointStatConfig_WINDS +++ b/test/config/ref_config/PointStatConfig_WINDS @@ -175,6 +175,6 @@ duplicate_flag = NONE; rank_corr_flag = FALSE; tmp_dir = "/tmp"; output_prefix = "${MODEL}_F${FCST_TIME}_WINDS"; -version = "V10.0.0"; +version = "V10.1.0"; //////////////////////////////////////////////////////////////////////////////// diff --git a/test/hdr/met_10_1.hdr b/test/hdr/met_10_1.hdr new file mode 100644 index 0000000000..77d4fa0053 --- /dev/null +++ b/test/hdr/met_10_1.hdr @@ -0,0 +1,36 @@ +CNT : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FBAR FBAR_NCL FBAR_NCU FBAR_BCL FBAR_BCU FSTDEV FSTDEV_NCL FSTDEV_NCU FSTDEV_BCL FSTDEV_BCU OBAR OBAR_NCL OBAR_NCU OBAR_BCL OBAR_BCU OSTDEV OSTDEV_NCL OSTDEV_NCU OSTDEV_BCL OSTDEV_BCU PR_CORR PR_CORR_NCL PR_CORR_NCU PR_CORR_BCL PR_CORR_BCU SP_CORR KT_CORR RANKS FRANK_TIES ORANK_TIES ME ME_NCL ME_NCU ME_BCL ME_BCU ESTDEV ESTDEV_NCL ESTDEV_NCU ESTDEV_BCL ESTDEV_BCU MBIAS MBIAS_BCL MBIAS_BCU MAE MAE_BCL MAE_BCU MSE MSE_BCL MSE_BCU BCMSE BCMSE_BCL BCMSE_BCU RMSE RMSE_BCL RMSE_BCU E10 E10_BCL E10_BCU E25 E25_BCL E25_BCU E50 E50_BCL E50_BCU E75 E75_BCL E75_BCU E90 E90_BCL E90_BCU EIQR EIQR_BCL EIQR_BCU MAD MAD_BCL MAD_BCU ANOM_CORR ANOM_CORR_NCL ANOM_CORR_NCU ANOM_CORR_BCL ANOM_CORR_BCU ME2 ME2_BCL ME2_BCU MSESS MSESS_BCL MSESS_BCU RMSFA RMSFA_BCL RMSFA_BCU RMSOA RMSOA_BCL RMSOA_BCU ANOM_CORR_UNCNTR ANOM_CORR_UNCNTR_BCL ANOM_CORR_UNCNTR_BCU +CTC : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FY_OY FY_ON FN_OY FN_ON +CTS : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL BASER BASER_NCL BASER_NCU BASER_BCL BASER_BCU FMEAN FMEAN_NCL FMEAN_NCU FMEAN_BCL FMEAN_BCU ACC ACC_NCL ACC_NCU ACC_BCL ACC_BCU FBIAS FBIAS_BCL FBIAS_BCU PODY PODY_NCL PODY_NCU PODY_BCL PODY_BCU PODN PODN_NCL PODN_NCU PODN_BCL PODN_BCU POFD POFD_NCL POFD_NCU POFD_BCL POFD_BCU FAR FAR_NCL FAR_NCU FAR_BCL FAR_BCU CSI CSI_NCL CSI_NCU CSI_BCL CSI_BCU GSS GSS_BCL GSS_BCU HK HK_NCL HK_NCU HK_BCL HK_BCU HSS HSS_BCL HSS_BCU ODDS ODDS_NCL ODDS_NCU ODDS_BCL ODDS_BCU LODDS LODDS_NCL LODDS_NCU LODDS_BCL LODDS_BCU ORSS ORSS_NCL ORSS_NCU ORSS_BCL ORSS_BCU EDS EDS_NCL EDS_NCU EDS_BCL EDS_BCU SEDS SEDS_NCL SEDS_NCU SEDS_BCL SEDS_BCU EDI EDI_NCL EDI_NCU EDI_BCL EDI_BCU SEDI SEDI_NCL SEDI_NCU SEDI_BCL SEDI_BCU BAGSS BAGSS_BCL BAGSS_BCU +FHO : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL F_RATE H_RATE O_RATE +ISC : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL TILE_DIM TILE_XLL TILE_YLL NSCALE ISCALE MSE ISC FENERGY2 OENERGY2 BASER FBIAS +MCTC : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL N_CAT _VAR_ +MCTS : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL N_CAT ACC ACC_NCL ACC_NCU ACC_BCL ACC_BCU HK HK_BCL HK_BCU HSS HSS_BCL HSS_BCU GER GER_BCL GER_BCU HSS_EC HSS_EC_BCL HSS_EC_BCU EC_VALUE +MPR : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL INDEX OBS_SID OBS_LAT OBS_LON OBS_LVL OBS_ELV FCST OBS OBS_QC CLIMO_MEAN CLIMO_STDEV CLIMO_CDF_VAR_ +NBRCNT : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FBS FBS_BCL FBS_BCU FSS FSS_BCL FSS_BCU AFSS AFSS_BCL AFSS_BCU UFSS UFSS_BCL UFSS_BCU F_RATE F_RATE_BCL F_RATE_BCU O_RATE O_RATE_BCL O_RATE_BCU +NBRCTC : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FY_OY FY_ON FN_OY FN_ON +NBRCTS : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL BASER BASER_NCL BASER_NCU BASER_BCL BASER_BCU FMEAN FMEAN_NCL FMEAN_NCU FMEAN_BCL FMEAN_BCU ACC ACC_NCL ACC_NCU ACC_BCL ACC_BCU FBIAS FBIAS_BCL FBIAS_BCU PODY PODY_NCL PODY_NCU PODY_BCL PODY_BCU PODN PODN_NCL PODN_NCU PODN_BCL PODN_BCU POFD POFD_NCL POFD_NCU POFD_BCL POFD_BCU FAR FAR_NCL FAR_NCU FAR_BCL FAR_BCU CSI CSI_NCL CSI_NCU CSI_BCL CSI_BCU GSS GSS_BCL GSS_BCU HK HK_NCL HK_NCU HK_BCL HK_BCU HSS HSS_BCL HSS_BCU ODDS ODDS_NCL ODDS_NCU ODDS_BCL ODDS_BCU LODDS LODDS_NCL LODDS_NCU LODDS_BCL LODDS_BCU ORSS ORSS_NCL ORSS_NCU ORSS_BCL ORSS_BCU EDS EDS_NCL EDS_NCU EDS_BCL EDS_BCU SEDS SEDS_NCL SEDS_NCU SEDS_BCL SEDS_BCU EDI EDI_NCL EDI_NCU EDI_BCL EDI_BCU SEDI SEDI_NCL SEDI_NCU SEDI_BCL SEDI_BCU BAGSS BAGSS_BCL BAGSS_BCU +GRAD : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FGBAR OGBAR MGBAR EGBAR S1 S1_OG FGOG_RATIO DX DY +DMAP : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FY OY FBIAS BADDELEY HAUSDORFF MED_FO MED_OF MED_MIN MED_MAX MED_MEAN FOM_FO FOM_OF FOM_MIN FOM_MAX FOM_MEAN ZHU_FO ZHU_OF ZHU_MIN ZHU_MAX ZHU_MEAN +ORANK : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL INDEX OBS_SID OBS_LAT OBS_LON OBS_LVL OBS_ELV OBS PIT RANK N_ENS_VLD N_ENS _VAR_ +PCT : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL N_THRESH _VAR_ +PJC : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL N_THRESH _VAR_ +PRC : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL N_THRESH _VAR_ +PSTD : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL N_THRESH BASER BASER_NCL BASER_NCU RELIABILITY RESOLUTION UNCERTAINTY ROC_AUC BRIER BRIER_NCL BRIER_NCU BRIERCL BRIERCL_NCL BRIERCL_NCU BSS BSS_SMPL _VAR_ +ECLV : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL BASE N_PTS _VAR_ +ECNT : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL N_ENS CRPS CRPSS IGN ME RMSE SPREAD ME_OERR RMSE_OERR SPREAD_OERR SPREAD_PLUS_OERR CRPSCL CRPS_EMP CRPSCL_EMP CRPSS_EMP +RPS : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL N_PROB RPS_REL RPS_RES RPS_UNC RPS RPSS RPSS_SMPL RPS_COMP +RHIST : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL CRPS IGN N_RANK CRPSS SPREAD _VAR_ +PHIST : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL BIN_SIZE N_BIN _VAR_ +RELP : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL N_ENS _VAR_ +SAL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FABAR OABAR FOABAR FFABAR OOABAR MAE +SL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FBAR OBAR FOBAR FFBAR OOBAR MAE +SSVAR : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL N_BIN BIN_i BIN_N VAR_MIN VAR_MAX VAR_MEAN FBAR OBAR FOBAR FFBAR OOBAR FBAR_NCL FBAR_NCU FSTDEV FSTDEV_NCL FSTDEV_NCU OBAR_NCL OBAR_NCU OSTDEV OSTDEV_NCL OSTDEV_NCU PR_CORR PR_CORR_NCL PR_CORR_NCU ME ME_NCL ME_NCU ESTDEV ESTDEV_NCL ESTDEV_NCU MBIAS MSE BCMSE RMSE +VL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL UFBAR VFBAR UOBAR VOBAR UVFOBAR UVFFBAR UVOOBAR F_SPEED_BAR O_SPEED_BAR +VAL1L2 : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL UFABAR VFABAR UOABAR VOABAR UVFOABAR UVFFABAR UVOOABAR +VCNT : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL FBAR FBAR_BCL FBAR_BCU OBAR OBAR_BCL OBAR_BCU FS_RMS FS_RMS_BCL FS_RMS_BCU OS_RMS OS_RMS_BCL OS_RMS_BCU MSVE MSVE_BCL MSVE_BCU RMSVE RMSVE_BCL RMSVE_BCU FSTDEV FSTDEV_BCL FSTDEV_BCU OSTDEV OSTDEV_BCL OSTDEV_BCU FDIR FDIR_BCL FDIR_BCU ODIR ODIR_BCL ODIR_BCU FBAR_SPEED FBAR_SPEED_BCL FBAR_SPEED_BCU OBAR_SPEED OBAR_SPEED_BCL OBAR_SPEED_BCU VDIFF_SPEED VDIFF_SPEED_BCL VDIFF_SPEED_BCU VDIFF_DIR VDIFF_DIR_BCL VDIFF_DIR_BCU SPEED_ERR SPEED_ERR_BCL SPEED_ERR_BCU SPEED_ABSERR SPEED_ABSERR_BCL SPEED_ABSERR_BCU DIR_ERR DIR_ERR_BCL DIR_ERR_BCU DIR_ABSERR DIR_ABSERR_BCL DIR_ABSERR_BCU +GENMPR : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE TOTAL INDEX STORM_ID AGEN_INIT AGEN_FHR AGEN_LAT AGEN_LON AGEN_DLAND BGEN_LAT BGEN_LON BGEN_DLAND GEN_DIST GEN_TDIFF INIT_TDIFF DEV_CAT OPS_CAT +MODE_SOA : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE N_VALID GRID_RES OBJECT_ID OBJECT_CAT CENTROID_X CENTROID_Y CENTROID_LAT CENTROID_LON AXIS_ANG LENGTH WIDTH AREA AREA_THRESH CURVATURE CURVATURE_X CURVATURE_Y COMPLEXITY INTENSITY_10 INTENSITY_25 INTENSITY_50 INTENSITY_75 INTENSITY_90 INTENSITY_50 INTENSITY_SUM +MODE_POA : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE N_VALID GRID_RES OBJECT_ID OBJECT_CAT CENTROID_DIST BOUNDARY_DIST CONVEX_HULL_DIST ANGLE_DIFF ASPECT_DIFF AREA_RATIO INTERSECTION_AREA UNION_AREA SYMMETRIC_DIFF INTERSECTION_OVER_AREA CURVATURE_RATIO COMPLEXITY_RATIO PERCENTILE_INTENSITY_RATIO INTEREST +MODE_CTS : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE N_VALID GRID_RES FIELD TOTAL FY_OY FY_ON FN_OY FN_ON BASER FMEAN ACC FBIAS PODY PODN POFD FAR CSI GSS HK HSS ODDS +TCST_TCMPR : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE AMODEL BMODEL STORM_ID BASIN CYCLONE STORM_NAME INIT_MASK VALID_MASK TOTAL INDEX LEVEL WATCH_WARN INITIALS ALAT ALON BLAT BLON TK_ERR X_ERR Y_ERR ALTK_ERR CRTK_ERR ADLAND BDLAND AMSLP BMSLP AMAX_WIND BMAX_WIND AAL_WIND_34 BAL_WIND_34 ANE_WIND_34 BNE_WIND_34 ASE_WIND_34 BSE_WIND_34 ASW_WIND_34 BSW_WIND_34 ANW_WIND_34 BNW_WIND_34 AAL_WIND_50 BAL_WIND_50 ANE_WIND_50 BNE_WIND_50 ASE_WIND_50 BSE_WIND_50 ASW_WIND_50 BSW_WIND_50 ANW_WIND_50 BNW_WIND_50 AAL_WIND_64 BAL_WIND_64 ANE_WIND_64 BNE_WIND_64 ASE_WIND_64 BSE_WIND_64 ASW_WIND_64 BSW_WIND_64 ANW_WIND_64 BNW_WIND_64 ARADP BRADP ARRP BRRP AMRD BMRD AGUSTS BGUSTS AEYE BEYE ADIR BDIR ASPEED BSPEED ADEPTH BDEPTH +TCST_PROBRIRW : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_LEAD OBS_VALID_BEG OBS_VALID_END FCST_VAR FCST_UNITS FCST_LEV OBS_VAR OBS_UNITS OBS_LEV OBTYPE VX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESH ALPHA LINE_TYPE ALAT ALON BLAT BLON INITIALS TK_ERR X_ERR Y_ERR ADLAND BDLAND RI_BEG RI_END RI_WINDOW AWIND_END BWIND_BEG BWIND_END BDELTA BDELTA_MAX BLEVEL_BEG BLEVEL_END N_THRESH _VAR_ From 26536361b0571317c87209b715a21478c812223b Mon Sep 17 00:00:00 2001 From: johnhg Date: Fri, 11 Jun 2021 21:49:58 -0600 Subject: [PATCH 164/165] Feature 1826 v10.1.0_beta1 (#1828) * Per #1826, add update the version in the docs to 10.1.0-beta1 and add release notes for this development version. * Per #1826, change the beta1 release date to 6/11 so that I can do it today. --- met/docs/Users_Guide/release-notes.rst | 13 ++++++++++++- met/docs/conf.py | 4 ++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/met/docs/Users_Guide/release-notes.rst b/met/docs/Users_Guide/release-notes.rst index 03b1964a8e..ecfe62c141 100644 --- a/met/docs/Users_Guide/release-notes.rst +++ b/met/docs/Users_Guide/release-notes.rst @@ -5,7 +5,18 @@ When applicable, release notes are followed by the GitHub issue number which describes the bugfix, enhancement, or new feature: `MET GitHub issues. `_ -MET Version |version| release notes (|release_date|) +MET Version 10.1.0-beta1 release notes (|release_date|) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Add the HSS_EC statistic to the MCTS line type and a configurable option for its computation (`#1749 `_). +* Implement a common API for reading and writing the common NetCDF point observation file format (`#1402 `_ and `#1581 `_). +* Change -type for gen_vx_mask from an optional argument to a required one (`#1792 `_). +* Fix python embedding when using a named grid with MET_PYTHON_EXE set (`#1798 `_). +* Fix Fortify High finding for src/libcode/vx_data2d_nccf/nccf_file.cc (`#1795 `_). +* Modify plot_tcmpr.R script to support plotting of extra-tropical cyclone tracks not verified against BEST tracks (`#1801 `_). +* Add anchors to link directly to configuration items in the MET User's Guide (`#1811 `_). + +MET Version 10.0.0 release notes (20210510) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Repository and build: diff --git a/met/docs/conf.py b/met/docs/conf.py index 814c69634c..3fe33bf60d 100644 --- a/met/docs/conf.py +++ b/met/docs/conf.py @@ -20,11 +20,11 @@ project = 'MET' author = 'UCAR/NCAR, NOAA, CSU/CIRA, and CU/CIRES' author_list = 'Halley Gotway, J., K. Newman, H. Soh, J. Opatz, T. Jensen, J. Prestopnik, L. Goodrich, D. Fillmore, B. Brown, R. Bullock, T. Fowler' -version = 'develop' +version = '10.1.0-beta1' verinfo = version release = f'{version}' release_year = '2021' -release_date = f'{release_year}-05-10' +release_date = f'{release_year}-06-11' copyright = f'{release_year}, {author}' # -- General configuration --------------------------------------------------- From 69af41093a22465b70d6dad7fdb04a2f9f236d28 Mon Sep 17 00:00:00 2001 From: MET Tools Test Account Date: Sat, 12 Jun 2021 06:35:55 -0600 Subject: [PATCH 165/165] Revoming Randy and David from the email notification list for nightly run scripts. --- scripts/fortify/run_nightly.sh | 2 +- scripts/regression/test_nightly.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/fortify/run_nightly.sh b/scripts/fortify/run_nightly.sh index 19be9df4c8..85a400bd81 100755 --- a/scripts/fortify/run_nightly.sh +++ b/scripts/fortify/run_nightly.sh @@ -20,7 +20,7 @@ #======================================================================= # Constants -EMAIL_LIST="johnhg@ucar.edu bullock@ucar.edu hsoh@ucar.edu fillmore@ucar.edu" +EMAIL_LIST="johnhg@ucar.edu hsoh@ucar.edu" KEEP_DAYS=5 function usage { diff --git a/scripts/regression/test_nightly.sh b/scripts/regression/test_nightly.sh index 434baea543..48d198e66b 100755 --- a/scripts/regression/test_nightly.sh +++ b/scripts/regression/test_nightly.sh @@ -21,7 +21,7 @@ #======================================================================= # Constants -EMAIL_LIST="johnhg@ucar.edu bullock@ucar.edu hsoh@ucar.edu fillmore@ucar.edu" +EMAIL_LIST="johnhg@ucar.edu hsoh@ucar.edu" KEEP_DAYS=5 # Usage statement