diff --git a/internal/test_unit/config/GridDiagConfig_APCP_06_FCST_OBS b/internal/test_unit/config/GridDiagConfig_APCP_06_FCST_OBS index 9372a6bb0f..5e7c75f5e2 100644 --- a/internal/test_unit/config/GridDiagConfig_APCP_06_FCST_OBS +++ b/internal/test_unit/config/GridDiagConfig_APCP_06_FCST_OBS @@ -42,8 +42,8 @@ data = { range = [0,25]; field = [ - { set_attr_name = "FCST_APCP"; }, - { set_attr_name = "OBS_APCP"; } + { ${FIELD1} }, + { ${FIELD2} } ]; } diff --git a/internal/test_unit/xml/unit_grid_diag.xml b/internal/test_unit/xml/unit_grid_diag.xml index 10049144ac..96c9cb217f 100644 --- a/internal/test_unit/xml/unit_grid_diag.xml +++ b/internal/test_unit/xml/unit_grid_diag.xml @@ -72,6 +72,10 @@ &DATA_DIR_OBS;/stage4_hmt/stage4_2012041018_06h.grib" \ > &OUTPUT_DIR;/grid_diag/obs_file_list; \ &MET_BIN;/grid_diag + + FIELD1 set_attr_name = "FCST_APCP"; + FIELD2 set_attr_name = "OBS_APCP"; + \ -data &OUTPUT_DIR;/grid_diag/fcst_file_list \ -data &OUTPUT_DIR;/grid_diag/obs_file_list \ @@ -84,4 +88,40 @@ + + + + echo "&DATA_DIR_MODEL;/grib1/gfs_hmt/gfs_2012040900_F006.grib \ + &DATA_DIR_MODEL;/grib1/gfs_hmt/gfs_2012040900_F012.grib \ + &DATA_DIR_MODEL;/grib1/gfs_hmt/gfs_2012040900_F018.grib \ + &DATA_DIR_MODEL;/grib1/gfs_hmt/gfs_2012040900_F024.grib \ + &DATA_DIR_MODEL;/grib1/gfs_hmt/gfs_2012040900_F030.grib \ + &DATA_DIR_MODEL;/grib1/gfs_hmt/gfs_2012040900_F036.grib \ + &DATA_DIR_MODEL;/grib1/gfs_hmt/gfs_2012040900_F042.grib" \ + > &OUTPUT_DIR;/grid_diag/fcst_file_list; \ + echo "&DATA_DIR_OBS;/stage4_hmt/stage4_2012040906_06h.grib \ + &DATA_DIR_OBS;/stage4_hmt/stage4_2012040912_06h.grib \ + &DATA_DIR_OBS;/stage4_hmt/stage4_2012040918_06h.grib \ + &DATA_DIR_OBS;/stage4_hmt/stage4_2012041000_06h.grib \ + &DATA_DIR_OBS;/stage4_hmt/stage4_2012041006_06h.grib \ + &DATA_DIR_OBS;/stage4_hmt/stage4_2012041012_06h.grib \ + &DATA_DIR_OBS;/stage4_hmt/stage4_2012041018_06h.grib" \ + > &OUTPUT_DIR;/grid_diag/obs_file_list; \ + &MET_BIN;/grid_diag + + FIELD1 name = "APCP"; + FIELD2 name = "APCP"; + + \ + -data &OUTPUT_DIR;/grid_diag/fcst_file_list \ + -data &OUTPUT_DIR;/grid_diag/obs_file_list \ + -config &CONFIG_DIR;/GridDiagConfig_APCP_06_FCST_OBS \ + -out &OUTPUT_DIR;/grid_diag/grid_diag_APCP_06_VARN.nc \ + -v 3 + + + &OUTPUT_DIR;/grid_diag/grid_diag_APCP_06_VARN.nc + + + diff --git a/src/basic/vx_config/config.tab.cc b/src/basic/vx_config/config.tab.cc index 5b67009f59..43fe74766f 100644 --- a/src/basic/vx_config/config.tab.cc +++ b/src/basic/vx_config/config.tab.cc @@ -1389,7 +1389,7 @@ yyparse (void) YYDPRINTF ((stderr, "Starting parse\n")); - yystate = 8; + yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ diff --git a/src/tools/other/grid_diag/grid_diag.cc b/src/tools/other/grid_diag/grid_diag.cc index 96e3be2a94..1ffa59d028 100644 --- a/src/tools/other/grid_diag/grid_diag.cc +++ b/src/tools/other/grid_diag/grid_diag.cc @@ -20,6 +20,7 @@ // 003 08/20/21 Halley Gotway Bugfix #1886 for integer overflow. // 004 07/06/22 Howard Soh METplus-Internal #19 Rename main to met_main // 005 10/03/22 Prestopnik MET #2227 Remove using namespace std and netCDF from header files +// 006 10/26/22 Linden MET #2232 Refine the Grid-Diag output variable names when specifying two input data sources // //////////////////////////////////////////////////////////////////////// @@ -264,7 +265,7 @@ void process_series(void) { // Process the 1d histograms for(int i_var=0; i_varmagic_str_attr() << " histogram with " << n_bins << " bins from " << min << " to " << max << ".\n"; + histograms[i_var_str] = vector(); init_pdf(n_bins, histograms[i_var_str]); + + // Keep track of unique output variable names + if(nc_var_sa.has( data_info->magic_str_attr() )) unique_variable_names = false; + nc_var_sa.add(data_info->magic_str_attr()); + } // for i_var } @@ -455,14 +462,14 @@ void setup_joint_histograms(void) { for(int i_var=0; i_varn_bins(); for(int j_var=i_var+1; j_varn_bins(); @@ -484,48 +491,48 @@ void setup_joint_histograms(void) { //////////////////////////////////////////////////////////////////////// void setup_nc_file(void) { - ConcatString cs, i_var_str; + ConcatString cs, i_var_str, j_var_str; - // Create NetCDF file - nc_out = open_ncfile(out_file.c_str(), true); + // Create NetCDF file + nc_out = open_ncfile(out_file.c_str(), true); - if(IS_INVALID_NC_P(nc_out)) { + if(IS_INVALID_NC_P(nc_out)) { mlog << Error << "\nsetup_nc_file() -> " - << "trouble opening output NetCDF file " - << out_file << "\n\n"; - exit(1); - } - - // Add global attributes - write_netcdf_global(nc_out, out_file.c_str(), program_name, - NULL, NULL, conf_info.desc.c_str()); - add_att(nc_out, "mask_grid", (conf_info.mask_grid_name.nonempty() ? - (string)conf_info.mask_grid_name : - na_str)); - add_att(nc_out, "mask_poly", (conf_info.mask_poly_name.nonempty() ? - (string)conf_info.mask_poly_name : - na_str)); - - // Add time range information to the global attributes - add_att(nc_out, "init_beg", (string)unix_to_yyyymmdd_hhmmss(init_beg)); - add_att(nc_out, "init_end", (string)unix_to_yyyymmdd_hhmmss(init_end)); - add_att(nc_out, "valid_beg", (string)unix_to_yyyymmdd_hhmmss(valid_beg)); - add_att(nc_out, "valid_end", (string)unix_to_yyyymmdd_hhmmss(valid_end)); - add_att(nc_out, "lead_beg", (string)sec_to_hhmmss(lead_beg)); - add_att(nc_out, "lead_end", (string)sec_to_hhmmss(lead_end)); - - // Write the grid size, mask size, and series length - write_nc_var_int("grid_size", "number of grid points", grid.nxy()); - write_nc_var_int("mask_size", "number of mask points", conf_info.mask_area.count()); - write_nc_var_int("n_series", "length of series", n_series); - - // Compression level - int deflate_level = compress_level; - if(deflate_level < 0) deflate_level = conf_info.conf.nc_compression(); - - for(int i_var=0; i_var < conf_info.get_n_data(); i_var++) { - - i_var_str << cs_erase << "VAR" << i_var; + << "trouble opening output NetCDF file " + << out_file << "\n\n"; + exit(1); + } + + // Add global attributes + write_netcdf_global(nc_out, out_file.c_str(), program_name, + NULL, NULL, conf_info.desc.c_str()); + add_att(nc_out, "mask_grid", (conf_info.mask_grid_name.nonempty() ? + (string)conf_info.mask_grid_name : + na_str)); + add_att(nc_out, "mask_poly", (conf_info.mask_poly_name.nonempty() ? + (string)conf_info.mask_poly_name : + na_str)); + + // Add time range information to the global attributes + add_att(nc_out, "init_beg", (string)unix_to_yyyymmdd_hhmmss(init_beg)); + add_att(nc_out, "init_end", (string)unix_to_yyyymmdd_hhmmss(init_end)); + add_att(nc_out, "valid_beg", (string)unix_to_yyyymmdd_hhmmss(valid_beg)); + add_att(nc_out, "valid_end", (string)unix_to_yyyymmdd_hhmmss(valid_end)); + add_att(nc_out, "lead_beg", (string)sec_to_hhmmss(lead_beg)); + add_att(nc_out, "lead_end", (string)sec_to_hhmmss(lead_end)); + + // Write the grid size, mask size, and series length + write_nc_var_int("grid_size", "number of grid points", grid.nxy()); + write_nc_var_int("mask_size", "number of mask points", conf_info.mask_area.count()); + write_nc_var_int("n_series", "length of series", n_series); + + // Compression level + int deflate_level = compress_level; + if(deflate_level < 0) deflate_level = conf_info.conf.nc_compression(); + + for(int i_var=0; i_var < conf_info.get_n_data(); i_var++) { + + i_var_str << cs_erase << "VAR" << i_var+1; VarInfo *data_info = conf_info.data_info[i_var]; @@ -534,11 +541,16 @@ void setup_nc_file(void) { var_name.add("_"); var_name.add(data_info->level_attr()); + if(multiple_data_sources && !unique_variable_names) { + var_name.add("_"); + var_name.add(i_var_str); + } + // 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; @@ -575,6 +587,8 @@ void setup_nc_file(void) { // Define histograms for(int i_var=0; i_var < conf_info.get_n_data(); i_var++) { + i_var_str << cs_erase << "VAR" << i_var+1; + VarInfo *data_info = conf_info.data_info[i_var]; // Set variable NetCDF name @@ -582,6 +596,11 @@ void setup_nc_file(void) { var_name.add("_"); var_name.add(data_info->level_attr()); + if(multiple_data_sources && !unique_variable_names) { + var_name.add("_"); + var_name.add(i_var_str); + } + ConcatString hist_name("hist_"); hist_name.add(var_name); NcDim var_dim = data_var_dims[i_var]; @@ -597,21 +616,36 @@ void setup_nc_file(void) { // Define joint histograms for(int i_var=0; i_var < conf_info.get_n_data(); i_var++) { + i_var_str << cs_erase << "VAR" << i_var+1; + VarInfo *data_info = conf_info.data_info[i_var]; for(int j_var=i_var+1; j_varname_attr()); hist_name.add("_"); hist_name.add(data_info->level_attr()); + + if(multiple_data_sources && !unique_variable_names) { + hist_name.add("_"); + hist_name.add(i_var_str); + } + hist_name.add("_"); hist_name.add(joint_info->name_attr()); hist_name.add("_"); hist_name.add(joint_info->level_attr()); + if(multiple_data_sources && !unique_variable_names) { + hist_name.add("_"); + hist_name.add(j_var_str); + } + NcDim var_dim = data_var_dims[i_var]; NcDim joint_dim = data_var_dims[j_var]; vector dims; @@ -662,7 +696,7 @@ void write_histograms(void) { for(int i_var=0; i_var < conf_info.get_n_data(); i_var++) { - i_var_str << cs_erase << "VAR" << i_var; + i_var_str << cs_erase << "VAR" << i_var+1; VarInfo *data_info = conf_info.data_info[i_var]; NcVar hist_var = hist_vars[i_var]; @@ -690,8 +724,8 @@ void write_joint_histograms(void) { VarInfo *joint_info = conf_info.data_info[j_var]; ij_var_str << cs_erase - << "VAR" << i_var << "_" - << "VAR" << j_var; + << "VAR" << i_var+1 << "_" + << "VAR" << j_var+1; long long *hist = joint_histograms[ij_var_str].data(); @@ -816,6 +850,7 @@ void usage() { void set_data_files(const StringArray & a) { data_files.push_back(a); + if(data_files.size() > 0) multiple_data_sources = true; } //////////////////////////////////////////////////////////////////////// diff --git a/src/tools/other/grid_diag/grid_diag.h b/src/tools/other/grid_diag/grid_diag.h index 18b18d3326..91f6bcc797 100644 --- a/src/tools/other/grid_diag/grid_diag.h +++ b/src/tools/other/grid_diag/grid_diag.h @@ -90,6 +90,12 @@ vector data_var_dims; vector hist_vars; vector joint_hist_vars; +static bool multiple_data_sources = false; +static bool unique_variable_names = true; + +// List of output NetCDF variable names +static StringArray nc_var_sa; + //////////////////////////////////////////////////////////////////////// // // Miscellaneous Variables diff --git a/src/tools/tc_utils/tc_gen/Makefile.am b/src/tools/tc_utils/tc_gen/Makefile.am index f66a1577ef..529bb89e3f 100644 --- a/src/tools/tc_utils/tc_gen/Makefile.am +++ b/src/tools/tc_utils/tc_gen/Makefile.am @@ -30,7 +30,7 @@ tc_gen_LDADD = -lvx_stat_out \ -lvx_statistics \ -lvx_gis \ -lvx_data2d \ - -lvx_seeps \ + -lvx_seeps \ -lvx_nc_util \ -lvx_regrid \ -lvx_grid \ diff --git a/src/tools/tc_utils/tc_gen/Makefile.in b/src/tools/tc_utils/tc_gen/Makefile.in index 0bda9b9032..35cd8d681e 100644 --- a/src/tools/tc_utils/tc_gen/Makefile.in +++ b/src/tools/tc_utils/tc_gen/Makefile.in @@ -337,10 +337,10 @@ tc_gen_LDADD = -lvx_stat_out \ -lvx_statistics \ -lvx_gis \ -lvx_data2d \ + -lvx_seeps \ -lvx_nc_util \ -lvx_regrid \ -lvx_grid \ - -lvx_seeps \ -lvx_config \ -lvx_pb_util \ -lvx_cal \ diff --git a/src/tools/tc_utils/tc_stat/Makefile.am b/src/tools/tc_utils/tc_stat/Makefile.am index 60827d3d98..248a1d5b99 100644 --- a/src/tools/tc_utils/tc_stat/Makefile.am +++ b/src/tools/tc_utils/tc_stat/Makefile.am @@ -31,7 +31,7 @@ tc_stat_LDADD = -lvx_stat_out \ -lvx_data2d_nccf \ -lvx_statistics \ -lvx_data2d \ - -lvx_seeps \ + -lvx_seeps \ -lvx_nc_util \ -lvx_regrid \ -lvx_grid \ diff --git a/src/tools/tc_utils/tc_stat/Makefile.in b/src/tools/tc_utils/tc_stat/Makefile.in index df8bbe5b6a..620bbce060 100644 --- a/src/tools/tc_utils/tc_stat/Makefile.in +++ b/src/tools/tc_utils/tc_stat/Makefile.in @@ -340,10 +340,10 @@ tc_stat_LDADD = -lvx_stat_out \ -lvx_data2d_nccf \ -lvx_statistics \ -lvx_data2d \ + -lvx_seeps \ -lvx_nc_util \ -lvx_regrid \ -lvx_grid \ - -lvx_seeps \ -lvx_config \ -lvx_gsl_prob \ -lvx_pb_util \