diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 1fccc357fa..4c1eb33e9c 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -360,6 +360,8 @@ jobs: - jobid: 'job3' tests: 'climatology_2.5deg' - jobid: 'job4' + tests: 'climatology_mixed' + - jobid: 'job5' tests: 'python point2grid plot_data_plane mode mode_analysis perc_thresh hira plot_point_obs quality_filter obs_summary duplicate_flag' fail-fast: false steps: diff --git a/data/table_files/met_header_columns_V12.0.txt b/data/table_files/met_header_columns_V12.0.txt index 3d98f02206..5a7f27978e 100644 --- a/data/table_files/met_header_columns_V12.0.txt +++ b/data/table_files/met_header_columns_V12.0.txt @@ -5,7 +5,7 @@ V12.0 : STAT : FHO : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID V12.0 : 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 V12.0 : 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 V12.0 : 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 -V12.0 : 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 +V12.0 : 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 OBS_CLIMO_MEAN OBS_CLIMO_STDEV OBS_CLIMO_CDF FCST_CLIMO_MEAN FCST_CLIMO_STDEV V12.0 : STAT : SEEPS : 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 S12 S13 S21 S23 S31 S32 PF1 PF2 PF3 PV1 PV2 PV3 MEAN_FCST MEAN_OBS SEEPS V12.0 : STAT : SEEPS_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 OBS_SID OBS_LAT OBS_LON FCST OBS OBS_QC FCST_CAT OBS_CAT P1 P2 T1 T2 SEEPS V12.0 : 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 @@ -13,7 +13,7 @@ V12.0 : STAT : NBRCTC : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID V12.0 : 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 V12.0 : 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 V12.0 : 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 G GBETA BETA_VALUE -V12.0 : 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 +V12.0 : 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 OBS_CLIMO_MEAN SPREAD ENS_MEAN_OERR SPREAD_OERR SPREAD_PLUS_OERR OBS_CLIMO_STDEV FCST_CLIMO_MEAN FCST_CLIMO_STDEV V12.0 : 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]* V12.0 : 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]* V12.0 : 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]* diff --git a/docs/Users_Guide/config_options.rst b/docs/Users_Guide/config_options.rst index de538bd7cb..beb5b2cbc7 100644 --- a/docs/Users_Guide/config_options.rst +++ b/docs/Users_Guide/config_options.rst @@ -158,15 +158,15 @@ The configuration file language supports the following data types: .. note:: - Prior to MET version 12.0.0, forecast climatological inputs were not - supported. The observation climatological inputs were used to process - threshold types named "SCP" and "CDP". + Prior to MET version 12.0.0, forecast climatological inputs were not + supported. The observation climatological inputs were used to process + threshold types named "SCP" and "CDP". - For backward compatibility, the "SCP" threshold type is processed the same - as "SOCP" and "CDP" the same as "OCDP". + For backward compatibility, the "SCP" threshold type is processed the same + as "SOCP" and "CDP" the same as "OCDP". - Users are encouraged to replace the deprecated "SCP" and "CDP" threshold - types with the updated "SOCP" and "OCDP" types, respectively. + Users are encouraged to replace the deprecated "SCP" and "CDP" threshold + types with the updated "SOCP" and "OCDP" types, respectively. * Piecewise-Linear Function (currently used only by MODE): @@ -324,8 +324,10 @@ To run this utility: -e EXISTING_FILE, --existing=EXISTING_FILE Save the text into the named file (optional, default: ../../../data/table_files/ndbc_stations.xml) -NOTE: The downloaded files are written to a subdirectory ndbc_temp_data which -can be deleted once the final output file is created. +.. note:: + + The downloaded files are written to a subdirectory ndbc_temp_data which + can be deleted once the final output file is created. MET_BASE -------- @@ -1508,8 +1510,11 @@ the climatology file names and fields to be used. with 6 and 12 being common choices. Use "NA" if the timing of the climatology data should not be checked. -* The "day_interval" and "hour_interval" entries replace the deprecated - entries "match_month", "match_day", and "time_step". +.. note:: + + As of MET version 11.0.0, the "day_interval" and "hour_interval" entries + replace the "match_month", "match_day", and "time_step" entries, which are + now deprecated. .. code-block:: none @@ -1563,6 +1568,27 @@ over the "climo_mean" setting and then updating the "file_name" entry. file_name = [ "/path/to/climatological/standard/deviation/files" ]; } +Prior to MET version 12.0.0, forecast climatological inputs were not supported. +If the "climo_mean" and "climo_stdev" dictionaries are defined at the top-level +configuration file context, the same data is used for both the forecast and +observation climatologies. To specify separate forecast and observation +climatologies, define "climo_mean" and "climo_stdev" inside the "fcst" and "obs" +dictionaries, as shown below. + +.. code-block:: none + + fcst = { + field = [ ... ]; + climo_mean = { ... }; + climo_stdev = { ... }; + } + + obs = { + field = [ ... ]; + climo_mean = { ... }; + climo_stdev = { ... }; + } + climo_cdf --------- @@ -2269,8 +2295,10 @@ For example: | nc_pairs_var_suffix = "FREEZING"; (for the freezing level height) | -NOTE: This option was previously named "nc_pairs_var_str", which is -now deprecated. +.. note:: + + Prior to MET version 9.0.0, this option was named "nc_pairs_var_str",' + which is now deprecated. .. code-block:: none diff --git a/docs/Users_Guide/grid-diag.rst b/docs/Users_Guide/grid-diag.rst index f2fd55e78c..59bbb38616 100644 --- a/docs/Users_Guide/grid-diag.rst +++ b/docs/Users_Guide/grid-diag.rst @@ -27,7 +27,9 @@ The following sections describe the usage statement, required arguments, and opt [-v level] [-compress level] - NOTE: The "-data" option can be used once to read all fields from each input file or once for each field to be processed. +.. note:: + + The "-data" option can be used once to read all fields from each input file or once for each field to be processed. grid_diag has required arguments and can accept several optional arguments. diff --git a/docs/Users_Guide/mode.rst b/docs/Users_Guide/mode.rst index 491b452002..bb59cfee3e 100644 --- a/docs/Users_Guide/mode.rst +++ b/docs/Users_Guide/mode.rst @@ -913,7 +913,7 @@ The contents of the columns in this ASCII file are summarized in :numref:`MODE_o * - 50 - AREA_RATIO - The forecast object area divided by the observation object area (unitless) :raw-html:`
` - **NOTE:** Prior to met-10.0.0, defined as the lesser of the two object areas divided by the greater of the two + **NOTE:** Prior to MET version 10.0.0, the AREA_RATIO was defined as the lesser of the two object areas divided by the greater of the two. * - 51 - INTERSECTION :raw-html:`
` \_AREA - Intersection area of two objects (in grid squares) diff --git a/internal/test_unit/bin/unit_test.sh b/internal/test_unit/bin/unit_test.sh index 0e2579464d..e3bc29e181 100755 --- a/internal/test_unit/bin/unit_test.sh +++ b/internal/test_unit/bin/unit_test.sh @@ -86,6 +86,7 @@ UNIT_XML="unit_ascii2nc.xml \ unit_climatology_1.0deg.xml \ unit_climatology_1.5deg.xml \ unit_climatology_2.5deg.xml \ + unit_climatology_mixed.xml \ unit_grib_tables.xml \ unit_grid_weight.xml \ unit_netcdf.xml \ diff --git a/internal/test_unit/config/GridStatConfig_climo_FCST_NCEP_1.0DEG_OBS_WMO_1.5DEG b/internal/test_unit/config/GridStatConfig_climo_FCST_NCEP_1.0DEG_OBS_WMO_1.5DEG new file mode 100644 index 0000000000..ab1cdd8362 --- /dev/null +++ b/internal/test_unit/config/GridStatConfig_climo_FCST_NCEP_1.0DEG_OBS_WMO_1.5DEG @@ -0,0 +1,277 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// 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 = "${OBS_CLIMO_DIR}/mslp_mean.grib"; + method = BILIN; + width = 2; + vld_thresh = 0.5; + shape = SQUARE; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// 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 = ""; +hss_ec_value = NA; +rank_corr_flag = FALSE; + +// +// Forecast and observation fields to be verified +// + +field_list = [ + { name = "TMP"; level = [ "P500" ]; }, + { name = "UGRD"; level = [ "P500" ]; }, + { name = "VGRD"; level = [ "P500" ]; }, + { name = "TMP"; level = [ "P850" ]; cat_thresh = [ >FCDP75, >OCDP75 ]; }, + { name = "UGRD"; level = [ "P850" ]; cat_thresh = [ >FCDP75, >OCDP75 ]; }, + { name = "VGRD"; level = [ "P850" ]; cat_thresh = [ >FCDP75, >OCDP75 ]; } +]; + +fcst = { + + field = field_list; + + climo_mean = { + field = field_list; + file_name = [ "${FCST_CLIMO_DIR}/cmean_1d.19590410" ]; + }; + + climo_stdev = { + field = field_list; + file_name = [ "${FCST_CLIMO_DIR}/cstdv_1d.19590410" ]; + }; + + time_interp_method = DW_MEAN; + day_interval = 1; + hour_interval = 6; +} + +obs = { + + field = field_list; + + climo_mean = { + field = field_list; + file_name = [ "${OBS_CLIMO_DIR}/t500hPa_mean.grib", + "${OBS_CLIMO_DIR}/t850hPa_mean.grib", + "${OBS_CLIMO_DIR}/u500hPa_mean.grib", + "${OBS_CLIMO_DIR}/u850hPa_mean.grib", + "${OBS_CLIMO_DIR}/v500hPa_mean.grib", + "${OBS_CLIMO_DIR}/v850hPa_mean.grib" ]; + }; + + climo_stdev = { + field = field_list; + file_name = [ "${OBS_CLIMO_DIR}/t850hPa_stdev.grib", + "${OBS_CLIMO_DIR}/u850hPa_stdev.grib", + "${OBS_CLIMO_DIR}/v850hPa_stdev.grib" ]; + }; + + time_interp_method = DW_MEAN; + day_interval = 1; + hour_interval = 12; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// May be set separately in each "obs.field" entry +// +climo_cdf = { + cdf_bins = 1; + center_bins = TRUE; + write_bins = FALSE; + direct_prob = FALSE; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// 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 = []; + dy = []; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// 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; + beta_value(n) = n * n / 2.0; +} + +//////////////////////////////////////////////////////////////////////////////// + +// +// Statistical output types +// +output_flag = { + fho = NONE; + ctc = NONE; + cts = NONE; + mctc = NONE; + mcts = NONE; + cnt = STAT; + sl1l2 = STAT; + sal1l2 = STAT; + vl1l2 = STAT; + val1l2 = STAT; + vcnt = STAT; + pct = NONE; + pstd = NONE; + pjc = NONE; + prc = NONE; + eclv = NONE; + nbrctc = NONE; + nbrcts = NONE; + nbrcnt = NONE; + grad = NONE; + dmap = NONE; + seeps = NONE; +} + +// +// NetCDF matched pairs output file +// +nc_pairs_flag = { + latlon = TRUE; + raw = TRUE; + diff = TRUE; + climo = TRUE; + climo_cdp = TRUE; + weight = TRUE; + nbrhd = FALSE; + fourier = FALSE; + gradient = FALSE; + distance_map = FALSE; + apply_mask = FALSE; +} + +//////////////////////////////////////////////////////////////////////////////// +// Threshold for SEEPS p1 (Probability of being dry) + +seeps_p1_thresh = NA; + +//////////////////////////////////////////////////////////////////////////////// + +grid_weight_flag = COS_LAT; +tmp_dir = "/tmp"; +output_prefix = "${OUTPUT_PREFIX}"; +version = "V12.0.0"; + +//////////////////////////////////////////////////////////////////////////////// diff --git a/internal/test_unit/config/GridStatConfig_mpr_thresh b/internal/test_unit/config/GridStatConfig_mpr_thresh index 01a9037fd0..e99405be7a 100644 --- a/internal/test_unit/config/GridStatConfig_mpr_thresh +++ b/internal/test_unit/config/GridStatConfig_mpr_thresh @@ -79,32 +79,18 @@ fcst = { desc = "ABS_OBS_FCST_DIFF"; nc_pairs_var_suffix = desc; }, -// MET #2924 Replace this section -// { -// mpr_column = [ "ABS(OBS-OBS_CLIMO_MEAN)" ]; -// mpr_thresh = [ <=5 ]; -// desc = "ABS_OBS_CLIMO_MEAN_DIFF"; -// nc_pairs_var_suffix = desc; -// }, -// { -// mpr_column = [ "OBS_CLIMO_CDF" ]; -// mpr_thresh = [ >=0.25&&<=0.75 ]; -// desc = "OBS_CLIMO_CDF_IQR"; -// nc_pairs_var_suffix = desc; -// } { - mpr_column = [ "ABS(OBS-CLIMO_MEAN)" ]; + mpr_column = [ "ABS(OBS-OBS_CLIMO_MEAN)" ]; mpr_thresh = [ <=5 ]; desc = "ABS_OBS_CLIMO_MEAN_DIFF"; nc_pairs_var_suffix = desc; }, { - mpr_column = [ "CLIMO_CDF" ]; + mpr_column = [ "OBS_CLIMO_CDF" ]; mpr_thresh = [ >=0.25&&<=0.75 ]; - desc = "CLIMO_CDF_IQR"; + desc = "OBS_CLIMO_CDF_IQR"; nc_pairs_var_suffix = desc; } -// MET #2924 End replace ]; } obs = fcst; diff --git a/internal/test_unit/config/PointStatConfig_mpr_thresh b/internal/test_unit/config/PointStatConfig_mpr_thresh index e0d54b9219..675b0696c2 100644 --- a/internal/test_unit/config/PointStatConfig_mpr_thresh +++ b/internal/test_unit/config/PointStatConfig_mpr_thresh @@ -68,28 +68,16 @@ fcst = { mpr_thresh = [ <=5 ]; desc = "ABS_OBS_FCST_DIFF"; }, -// MET #2924 Replace this section -// { -// mpr_column = [ "ABS(OBS-OBS_CLIMO_MEAN)" ]; -// mpr_thresh = [ <=5 ]; -// desc = "ABS_OBS_CLIMO_MEAN_DIFF"; -// }, -// { -// mpr_column = [ "OBS_CLIMO_CDF" ]; -// mpr_thresh = [ >=0.25&&<=0.75 ]; -// desc = "OBS_CLIMO_CDF_IQR"; -// } { - mpr_column = [ "ABS(OBS-CLIMO_MEAN)" ]; + mpr_column = [ "ABS(OBS-OBS_CLIMO_MEAN)" ]; mpr_thresh = [ <=5 ]; desc = "ABS_OBS_CLIMO_MEAN_DIFF"; }, { - mpr_column = [ "CLIMO_CDF" ]; + mpr_column = [ "OBS_CLIMO_CDF" ]; mpr_thresh = [ >=0.25&&<=0.75 ]; - desc = "CLIMO_CDF_IQR"; + desc = "OBS_CLIMO_CDF_IQR"; } -// MET #2924 End replace ]; } obs = fcst; diff --git a/internal/test_unit/hdr/met_12_0.hdr b/internal/test_unit/hdr/met_12_0.hdr index b7d835c72c..f3785b7b48 100644 --- a/internal/test_unit/hdr/met_12_0.hdr +++ b/internal/test_unit/hdr/met_12_0.hdr @@ -5,7 +5,7 @@ FHO : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_L 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 +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 OBS_CLIMO_MEAN OBS_CLIMO_STDEV OBS_CLIMO_CDF FCST_CLIMO_MEAN FCST_CLIMO_STDEV SEEPS : 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 S12 S13 S21 S23 S31 S32 PF1 PF2 PF3 PV1 PV2 PV3 MEAN_FCST MEAN_OBS SEEPS SEEPS_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 OBS_SID OBS_LAT OBS_LON FCST OBS OBS_QC FCST_CAT OBS_CAT P1 P2 T1 T2 SEEPS 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 diff --git a/internal/test_unit/xml/unit_climatology_1.5deg.xml b/internal/test_unit/xml/unit_climatology_1.5deg.xml index 278df4a8be..de22d95673 100644 --- a/internal/test_unit/xml/unit_climatology_1.5deg.xml +++ b/internal/test_unit/xml/unit_climatology_1.5deg.xml @@ -82,19 +82,11 @@ OUTPUT_DIR &OUTPUT_DIR;/climatology_1.5deg - - \ - -lookin &OUTPUT_DIR;/climatology_1.5deg/point_stat_WMO_CLIMO_1.5DEG_120000L_20120409_120000V.stat \ - -job filter -line_type MPR -column_thresh CLIMO_CDF 'lt0.1||gt0.9' \ - -dump_row &OUTPUT_DIR;/climatology_1.5deg/stat_analysis_WMO_1.5DEG_FILTER_CDF_dump.stat - - &OUTPUT_DIR;/climatology_1.5deg/stat_analysis_WMO_1.5DEG_FILTER_CDF_dump.stat diff --git a/internal/test_unit/xml/unit_climatology_mixed.xml b/internal/test_unit/xml/unit_climatology_mixed.xml new file mode 100644 index 0000000000..0433b39e8d --- /dev/null +++ b/internal/test_unit/xml/unit_climatology_mixed.xml @@ -0,0 +1,39 @@ + + + + + + + + + + +]> + + + + + + &TEST_DIR; + true + + + &MET_BIN;/grid_stat + + OUTPUT_PREFIX FCST_NCEP_1.0DEG_OBS_WMO_1.5DEG + FCST_CLIMO_DIR &DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg + OBS_CLIMO_DIR &DATA_DIR_CLIMO;/ERA_DAILY_1.5deg + + \ + &DATA_DIR_MODEL;/grib2/gfs/gfs_2012040900_F024.grib2 \ + &DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120410_0000_000.grb2 \ + &CONFIG_DIR;/GridStatConfig_climo_FCST_NCEP_1.0DEG_OBS_WMO_1.5DEG \ + -outdir &OUTPUT_DIR;/climatology_mixed -v 2 + + + &OUTPUT_DIR;/climatology_mixed/grid_stat_FCST_NCEP_1.0DEG_OBS_WMO_1.5DEG_240000L_20120410_000000V.stat + &OUTPUT_DIR;/climatology_mixed/grid_stat_FCST_NCEP_1.0DEG_OBS_WMO_1.5DEG_240000L_20120410_000000V_pairs.nc + + + diff --git a/src/basic/vx_config/threshold.cc b/src/basic/vx_config/threshold.cc index bfff7a0089..cbf0a3cb7d 100644 --- a/src/basic/vx_config/threshold.cc +++ b/src/basic/vx_config/threshold.cc @@ -103,9 +103,8 @@ for (auto const& x : perc_thresh_info_map) { } // - // MET #2924: For backward compatibility support SCP and CDP - // threshold types - // + // MET #2924 Backward compatible support for SCP and CDP types + // if ( !match && (search_cs.startswith(scp_perc_thresh_type_str.c_str()) || diff --git a/src/basic/vx_util/stat_column_defs.h b/src/basic/vx_util/stat_column_defs.h index 5ae3a64b1a..a7b5427143 100644 --- a/src/basic/vx_util/stat_column_defs.h +++ b/src/basic/vx_util/stat_column_defs.h @@ -197,7 +197,6 @@ static const char * const eclv_columns [] = { "N_PNT", "CL_", "VALUE_" }; -/* MET #2924 Replace this change static const char * const mpr_columns [] = { "TOTAL", "INDEX", "OBS_SID", "OBS_LAT", "OBS_LON", "OBS_LVL", @@ -206,17 +205,6 @@ static const char * const mpr_columns [] = { "OBS_CLIMO_MEAN", "OBS_CLIMO_STDEV", "OBS_CLIMO_CDF", "FCST_CLIMO_MEAN", "FCST_CLIMO_STDEV" }; -*/ - -static const char * const mpr_columns [] = { - "TOTAL", "INDEX", "OBS_SID", - "OBS_LAT", "OBS_LON", "OBS_LVL", - "OBS_ELV", "FCST", "OBS", - "OBS_QC", - "CLIMO_MEAN", "CLIMO_STDEV", "CLIMO_CDF" -}; - -// MET #2924 End replace static const char * const nbrctc_columns [] = { "TOTAL", "FY_OY", "FY_ON", @@ -308,7 +296,6 @@ static const char * const phist_columns [] = { "BIN_" }; -/* MET #2924 Replace this section static const char * const orank_columns [] = { "TOTAL", "INDEX", "OBS_SID", "OBS_LAT", "OBS_LON", "OBS_LVL", @@ -319,19 +306,6 @@ static const char * const orank_columns [] = { "SPREAD_OERR", "SPREAD_PLUS_OERR", "OBS_CLIMO_STDEV", "FCST_CLIMO_MEAN", "FCST_CLIMO_STDEV" }; -*/ - -static const char * const orank_columns [] = { - "TOTAL", "INDEX", "OBS_SID", - "OBS_LAT", "OBS_LON", "OBS_LVL", - "OBS_ELV", "OBS", "PIT", - "RANK", "N_ENS_VLD", "N_ENS", - "ENS_", "OBS_QC", "ENS_MEAN", - "CLIMO_MEAN", "SPREAD", "ENS_MEAN_OERR", - "SPREAD_OERR", "SPREAD_PLUS_OERR", "CLIMO_STDEV" -}; - -// MET #2924 End replace static const char * const ssvar_columns [] = { "TOTAL", "N_BIN", "BIN_i", diff --git a/src/libcode/vx_data2d_grib/data2d_grib_utils.cc b/src/libcode/vx_data2d_grib/data2d_grib_utils.cc index f948b26253..cc3e81f82c 100644 --- a/src/libcode/vx_data2d_grib/data2d_grib_utils.cc +++ b/src/libcode/vx_data2d_grib/data2d_grib_utils.cc @@ -669,7 +669,8 @@ void read_pds(const GribRecord &r, int &bms_flag, // // Set the valid and accumulation times based on the - // contents of the time range indicator + // contents of the time range indicator in GRIB1 Table 5: + // https://www.nco.ncep.noaa.gov/pmb/docs/on388/table5.html // switch((int) pds->tri) { @@ -725,6 +726,11 @@ void read_pds(const GribRecord &r, int &bms_flag, accum = 0; break; + case 123: // Average of N uninitialized analyses, starting at the reference time, at intervals of P2. + valid_ut = init_ut; + accum = 0; + break; + case 136: // Climatological Standard Deviation valid_ut = init_ut; accum = 0; diff --git a/src/libcode/vx_stat_out/stat_columns.cc b/src/libcode/vx_stat_out/stat_columns.cc index 35a2fe7ba0..51992d7b50 100644 --- a/src/libcode/vx_stat_out/stat_columns.cc +++ b/src/libcode/vx_stat_out/stat_columns.cc @@ -488,10 +488,8 @@ void write_orank_header_row(int hdr_flag, int n_ens, AsciiTable &at, at.set_entry(r, c+17+n_ens, (string)orank_columns[18]); at.set_entry(r, c+18+n_ens, (string)orank_columns[19]); at.set_entry(r, c+19+n_ens, (string)orank_columns[20]); - /* MET #2924 Uncomment this section at.set_entry(r, c+20+n_ens, (string)orank_columns[21]); at.set_entry(r, c+21+n_ens, (string)orank_columns[22]); - */ return; } @@ -4126,13 +4124,11 @@ void write_mpr_cols(const PairDataPoint *pd_ptr, int i, at.set_entry(r, c+12, // Observation Climatological CDF Value pd_ptr->ocdf_na[i]); -/* MET #2924 Uncomment this section at.set_entry(r, c+13, // Forecast Climatological Mean Value pd_ptr->fcmn_na[i]); at.set_entry(r, c+14, // Forecast Climatological Standard Deviation Value pd_ptr->fcsd_na[i]); -*/ return; } @@ -4589,7 +4585,6 @@ void write_orank_cols(const PairDataEnsemble *pd_ptr, int i, at.set_entry(r, c+19+pd_ptr->n_ens, pd_ptr->ocsd_na[i]); -/* MET #2924 Uncomment this section // Forecast climatology mean values at.set_entry(r, c+20+pd_ptr->n_ens, pd_ptr->fcmn_na[i]); @@ -4597,7 +4592,6 @@ void write_orank_cols(const PairDataEnsemble *pd_ptr, int i, // Forecast climatology standard deviation values at.set_entry(r, c+21+pd_ptr->n_ens, pd_ptr->fcsd_na[i]); -*/ return; } diff --git a/src/libcode/vx_statistics/pair_data_point.cc b/src/libcode/vx_statistics/pair_data_point.cc index 0d29dda9ed..0e7f6203e7 100644 --- a/src/libcode/vx_statistics/pair_data_point.cc +++ b/src/libcode/vx_statistics/pair_data_point.cc @@ -820,7 +820,6 @@ double get_mpr_column_value(double f, double o, const ClimoPntInfo &cpi, const char *s) { double v; -/* #MET #2924 Replace this section if(strcasecmp(s, "FCST") == 0) v = f; else if(strcasecmp(s, "OBS") == 0) v = o; else if(strcasecmp(s, "FCST_CLIMO_MEAN") == 0) v = cpi.fcmn; @@ -831,16 +830,6 @@ double get_mpr_column_value(double f, double o, const ClimoPntInfo &cpi, v = (is_bad_data(cpi.ocmn) || is_bad_data(cpi.ocsd) ? bad_data_double : normal_cdf(o, cpi.ocmn, cpi.ocsd)); } -*/ - if(strcasecmp(s, "FCST") == 0) v = f; - else if(strcasecmp(s, "OBS") == 0) v = o; - else if(strcasecmp(s, "CLIMO_MEAN") == 0) v = cpi.ocmn; - else if(strcasecmp(s, "CLIMO_STDEV") == 0) v = cpi.ocsd; - else if(strcasecmp(s, "CLIMO_CDF") == 0) { - v = (is_bad_data(cpi.ocmn) || is_bad_data(cpi.ocsd) ? - bad_data_double : normal_cdf(o, cpi.ocmn, cpi.ocsd)); - } -// MET #2924 End replace else { mlog << Error << "\nget_mpr_column_value() -> " << "unsupported matched pair column name requested in \"" diff --git a/src/libcode/vx_statistics/read_climo.cc b/src/libcode/vx_statistics/read_climo.cc index 8e43749a8d..f5a0f2db71 100644 --- a/src/libcode/vx_statistics/read_climo.cc +++ b/src/libcode/vx_statistics/read_climo.cc @@ -29,7 +29,7 @@ using namespace std; static void read_climo_file( const char *, GrdFileType, Dictionary *, unixtime, int, int, const Grid &, const RegridInfo &, - DataPlaneArray &dpa); + DataPlaneArray &dpa, const char *); static DataPlaneArray climo_time_interp( const DataPlaneArray &, int, unixtime, InterpMthd); @@ -40,7 +40,8 @@ static DataPlane climo_hms_interp( //////////////////////////////////////////////////////////////////////// DataPlane read_climo_data_plane(Dictionary *dict, int i_vx, - unixtime vld_ut, const Grid &vx_grid) { + unixtime vld_ut, const Grid &vx_grid, + const char *desc) { DataPlane dp; DataPlaneArray dpa; @@ -48,13 +49,13 @@ DataPlane read_climo_data_plane(Dictionary *dict, int i_vx, if(!dict) return dp; // Read array of climatology fields - dpa = read_climo_data_plane_array(dict, i_vx, vld_ut, vx_grid); + dpa = read_climo_data_plane_array(dict, i_vx, vld_ut, vx_grid, desc); // Check for multiple matches if(dpa.n_planes() > 1) { mlog << Warning << "\nread_climo_data_plane() -> " - << "Found " << dpa.n_planes() << " matching climatology " - << "fields. Using the first match found.\n\n"; + << "Found " << dpa.n_planes() << " matching " << desc + << " fields. Using the first match found.\n\n"; } // Store the first match found @@ -67,7 +68,8 @@ DataPlane read_climo_data_plane(Dictionary *dict, int i_vx, DataPlaneArray read_climo_data_plane_array(Dictionary *dict, int i_vx, unixtime vld_ut, - const Grid &vx_grid) { + const Grid &vx_grid, + const char *desc) { DataPlaneArray dpa; StringArray climo_files; RegridInfo regrid_info; @@ -100,7 +102,7 @@ DataPlaneArray read_climo_data_plane_array(Dictionary *dict, int i_vx, // Range check day_interval if(!is_bad_data(day_interval) && day_interval < 1) { mlog << Error << "\nread_climo_data_plane_array() -> " - << "The \"" << conf_key_day_interval << "\" entry (" + << "The " << conf_key_day_interval << " entry (" << day_interval << ") can be set to " << na_str << " or a value of at least 1.\n\n"; exit(1); @@ -113,7 +115,7 @@ DataPlaneArray read_climo_data_plane_array(Dictionary *dict, int i_vx, if(!is_bad_data(hour_interval) && (hour_interval <= 0 || hour_interval > 24)) { mlog << Error << "\nread_climo_data_plane_array() -> " - << "The \"" << conf_key_hour_interval << "\" entry (" + << "The " << conf_key_hour_interval << " entry (" << hour_interval << ") can be set to " << na_str << " or a value between 0 and 24.\n\n"; exit(1); @@ -131,14 +133,15 @@ DataPlaneArray read_climo_data_plane_array(Dictionary *dict, int i_vx, // Search the files for the requested records for(i=0; i " - << "Trouble reading climatology file \"" - << climo_file << "\"\n\n"; + << "Trouble reading climatology file " + << climo_file << "\n\n"; return; } @@ -191,21 +194,21 @@ void read_climo_file(const char *climo_file, GrdFileType ctype, // Check the day time step if(!is_bad_data(day_ts) && abs(day_diff_sec) >= day_ts) { - mlog << Debug(3) << "Skipping " << clm_ut_cs << " \"" << info->magic_str() - << "\" climatology field with " << day_diff_sec / sec_per_day + mlog << Debug(3) << "Skipping " << clm_ut_cs << " " << info->magic_str() + << " climatology field with " << day_diff_sec / sec_per_day << " day offset (" << conf_key_day_interval << " = " - << day_ts / sec_per_day << ") from file \"" - << climo_file << "\".\n"; + << day_ts / sec_per_day << ") from file " + << climo_file << ".\n"; continue; } // Check the hour time step if(!is_bad_data(hour_ts) && abs(hms_diff_sec) >= hour_ts) { - mlog << Debug(3) << "Skipping " << clm_ut_cs << " \"" << info->magic_str() - << "\" climatology field with " << (double) hms_diff_sec / sec_per_hour + mlog << Debug(3) << "Skipping " << clm_ut_cs << " " << info->magic_str() + << " climatology field with " << (double) hms_diff_sec / sec_per_hour << " hour offset (" << conf_key_hour_interval << " = " - << hour_ts / sec_per_hour << ") from file \"" - << climo_file << "\".\n"; + << hour_ts / sec_per_hour << ") from file " + << climo_file << ".\n"; continue; } @@ -213,17 +216,17 @@ void read_climo_file(const char *climo_file, GrdFileType ctype, unixtime clm_vld_ut = vld_ut + day_diff_sec + hms_diff_sec; // Print log message for matching record - mlog << Debug(3) << "Storing " << clm_ut_cs << " \"" << info->magic_str() - << "\" climatology field with " << day_diff_sec / sec_per_day + mlog << Debug(3) << "Storing " << clm_ut_cs << " " << info->magic_str() + << " climatology field with " << day_diff_sec / sec_per_day << " day, " << (double) hms_diff_sec / sec_per_hour << " hour offset as time " - << unix_to_yyyymmdd_hhmmss(clm_vld_ut) << " from file \"" - << climo_file << "\".\n"; + << unix_to_yyyymmdd_hhmmss(clm_vld_ut) << " from file " + << climo_file << ".\n"; // Regrid, if needed if(!(mtddf->grid() == vx_grid)) { - mlog << Debug(2) << "Regridding " << clm_ut_cs << " \"" - << info->magic_str() - << "\" climatology field to the verification grid.\n"; + mlog << Debug(2) << "Regridding " << clm_ut_cs << " " + << desc << " field " << info->magic_str() + << " to the verification grid.\n"; dp = met_regrid(clm_dpa[i], mtddf->grid(), vx_grid, regrid_info); } @@ -343,8 +346,8 @@ DataPlaneArray climo_time_interp(const DataPlaneArray &dpa, int day_ts, // This should only occur when day_interval > 1. if(day_ts <= 3600*24) { mlog << Error << "\nclimo_time_interp() -> " - << "Expecting 1 or 2 climatology fields when \"" - << conf_key_day_interval << "\" <= 1 but found " + << "Expecting 1 or 2 climatology fields when " + << conf_key_day_interval << " <= 1 but found " << it->second.n() << "\n\n"; exit(1); } diff --git a/src/libcode/vx_statistics/read_climo.h b/src/libcode/vx_statistics/read_climo.h index a017df6388..362efa3fce 100644 --- a/src/libcode/vx_statistics/read_climo.h +++ b/src/libcode/vx_statistics/read_climo.h @@ -19,10 +19,12 @@ //////////////////////////////////////////////////////////////////////// extern DataPlane read_climo_data_plane(Dictionary *, int, - unixtime, const Grid &); + unixtime, const Grid &, + const char *); extern DataPlaneArray read_climo_data_plane_array(Dictionary *, int, - unixtime, const Grid &); + unixtime, const Grid &, + const char *); //////////////////////////////////////////////////////////////////////// diff --git a/src/tools/core/ensemble_stat/ensemble_stat.cc b/src/tools/core/ensemble_stat/ensemble_stat.cc index 3dedd76ef5..826b8eaf7a 100644 --- a/src/tools/core/ensemble_stat/ensemble_stat.cc +++ b/src/tools/core/ensemble_stat/ensemble_stat.cc @@ -784,18 +784,22 @@ void process_point_vx() { // Read forecast climatology data fcmn_dpa = read_climo_data_plane_array( conf_info.conf.lookup_array(conf_key_fcst_climo_mean_field, false), - i, ens_valid_ut, grid); + i, ens_valid_ut, grid, + "forecast climatology mean"); fcsd_dpa = read_climo_data_plane_array( - conf_info.conf.lookup_array(conf_key_fcst_climo_stdev_field, false), - i, ens_valid_ut, grid); + conf_info.conf.lookup_array(conf_key_fcst_climo_stdev_field, false), + i, ens_valid_ut, grid, + "forecast climatology standard deviation"); // Read observation climatology data ocmn_dpa = read_climo_data_plane_array( conf_info.conf.lookup_array(conf_key_obs_climo_mean_field, false), - i, ens_valid_ut, grid); + i, ens_valid_ut, grid, + "observation climatology mean"); ocsd_dpa = read_climo_data_plane_array( - conf_info.conf.lookup_array(conf_key_obs_climo_stdev_field, false), - i, ens_valid_ut, grid); + conf_info.conf.lookup_array(conf_key_obs_climo_stdev_field, false), + i, ens_valid_ut, grid, + "observation climatology standard deviation"); mlog << Debug(3) << "For " << conf_info.vx_opt[i].vx_pd.fcst_info->magic_str() << ", found " @@ -1424,18 +1428,22 @@ void process_grid_vx() { // Read forecast climatology data fcmn_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_fcst_climo_mean_field, false), - i, ens_valid_ut, grid); + i, ens_valid_ut, grid, + "forecast climatology mean"); fcsd_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_fcst_climo_stdev_field, false), - i, ens_valid_ut, grid); + i, ens_valid_ut, grid, + "forecast climatology standard deviation"); // Read observation climatology data ocmn_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_obs_climo_mean_field, false), - i, ens_valid_ut, grid); + i, ens_valid_ut, grid, + "observation climatology mean"); ocsd_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_obs_climo_stdev_field, false), - i, ens_valid_ut, grid); + i, ens_valid_ut, grid, + "observation climatology standard deviation"); mlog << Debug(3) << "For " << conf_info.vx_opt[i].vx_pd.fcst_info->magic_str() << ", found " diff --git a/src/tools/core/grid_stat/grid_stat.cc b/src/tools/core/grid_stat/grid_stat.cc index fcd0bc33a9..33f3e14dfc 100644 --- a/src/tools/core/grid_stat/grid_stat.cc +++ b/src/tools/core/grid_stat/grid_stat.cc @@ -196,8 +196,8 @@ static void clean_up(); static void usage(); static void set_outdir(const StringArray &); static void set_compress(const StringArray &); -static bool read_data_plane(VarInfo* info, DataPlane& dp, Met2dDataFile* mtddf, - const ConcatString &filename); +static bool read_data_plane(VarInfo *info, DataPlane &dp, Met2dDataFile *mtddf, + const ConcatString &filename, const char *desc); #ifdef WITH_UGRID static void set_ugrid_config(const StringArray &); #endif @@ -725,7 +725,8 @@ void process_scores() { // Read the gridded data from the input forecast file if(!read_data_plane(conf_info.vx_opt[i].fcst_info, - fcst_dp, fcst_mtddf, fcst_file)) continue; + fcst_dp, fcst_mtddf, fcst_file, + "forecast")) continue; mlog << Debug(3) << "Reading forecast data for " @@ -740,7 +741,8 @@ void process_scores() { // Read the gridded data from the input observation file if(!read_data_plane(conf_info.vx_opt[i].obs_info, - obs_dp, obs_mtddf, obs_file)) continue; + obs_dp, obs_mtddf, obs_file, + "observation")) continue; mlog << Debug(3) << "Reading observation data for " @@ -790,18 +792,22 @@ void process_scores() { // Read forecast climatology data fcmn_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_fcst_climo_mean_field, false), - i, fcst_dp.valid(), grid); + i, fcst_dp.valid(), grid, + "forecast climatology mean"); fcsd_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_fcst_climo_stdev_field, false), - i, fcst_dp.valid(), grid); + i, fcst_dp.valid(), grid, + "forecast climatology standard deviation"); // Read observation climatology data ocmn_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_obs_climo_mean_field, false), - i, fcst_dp.valid(), grid); + i, fcst_dp.valid(), grid, + "observation climatology mean"); ocsd_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_obs_climo_stdev_field, false), - i, fcst_dp.valid(), grid); + i, fcst_dp.valid(), grid, + "observation climatology standard deviation"); mlog << Debug(3) << "For " << conf_info.vx_opt[i].fcst_info->magic_str() << ", found " @@ -1048,27 +1054,33 @@ void process_scores() { // Read forecast data for UGRD if(!read_data_plane(conf_info.vx_opt[ui].fcst_info, - fu_dp, fcst_mtddf, fcst_file)) continue; + fu_dp, fcst_mtddf, fcst_file, + "U-wind forecast")) continue; // Read observation data for UGRD if(!read_data_plane(conf_info.vx_opt[ui].obs_info, - ou_dp, obs_mtddf, obs_file)) continue; + ou_dp, obs_mtddf, obs_file, + "U-wind observation")) continue; // Read the forecast climatology data for UGRD fcmnu_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_fcst_climo_mean_field, false), - ui, fcst_dp.valid(), grid); + ui, fcst_dp.valid(), grid, + "forecast U-wind climatology mean"); fcsdu_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_fcst_climo_stdev_field, false), - ui, fcst_dp.valid(), grid); + ui, fcst_dp.valid(), grid, + "forecast U-wind climatology standard deviation"); // Read the observation climatology data for UGRD ocmnu_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_obs_climo_mean_field, false), - ui, fcst_dp.valid(), grid); + ui, fcst_dp.valid(), grid, + "observation U-wind climatology mean"); ocsdu_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_obs_climo_stdev_field, false), - ui, fcst_dp.valid(), grid); + ui, fcst_dp.valid(), grid, + "observation U-wind climatology standard deviation"); // If requested in the config file, smooth the forecast // and climatology U-wind fields @@ -1178,7 +1190,6 @@ void process_scores() { i, mthd, pnts, conf_info.vx_opt[i].interp_info.field); } - /* MET #2924 Replace this section if(conf_info.vx_opt[i].nc_info.do_climo && !fcmn_dp.is_empty()) { write_nc((string)"FCST_CLIMO_MEAN", fcmn_dp, @@ -1209,26 +1220,6 @@ void process_scores() { i, mthd, pnts, conf_info.vx_opt[i].interp_info.field); } - */ - if(conf_info.vx_opt[i].nc_info.do_climo && - !ocmn_dp.is_empty()) { - write_nc((string)"CLIMO_MEAN", ocmn_dp, - i, mthd, pnts, - conf_info.vx_opt[i].interp_info.field); - } - if(conf_info.vx_opt[i].nc_info.do_climo && - !ocsd_dp.is_empty()) { - write_nc((string)"CLIMO_STDEV", fcsd_dp, - i, mthd, pnts, - conf_info.vx_opt[i].interp_info.field); - } - if(conf_info.vx_opt[i].nc_info.do_climo && - !ocmn_dp.is_empty() && !ocsd_dp.is_empty()) { - write_nc((string)"CLIMO_CDF", normal_cdf(obs_dp, ocmn_dp, ocsd_dp), - i, mthd, pnts, - conf_info.vx_opt[i].interp_info.field); - } - // MET #2924 End replace // Write out the fields of requested climo distribution percentile threshold values if(conf_info.vx_opt[i].nc_info.do_climo_cdp && @@ -1249,7 +1240,6 @@ void process_scores() { // Process all CDP thresholds except 0 and 100 for(vector::iterator it = simp.begin(); it != simp.end(); it++) { - /* MET #2924 Replace this section if(it->ptype() == perc_thresh_fcst_climo_dist && !is_eq(it->pvalue(), 0.0) && !is_eq(it->pvalue(), 100.0)) { @@ -1266,16 +1256,6 @@ void process_scores() { i, mthd, pnts, conf_info.vx_opt[i].interp_info.field); } - */ - if(it->ptype() == perc_thresh_obs_climo_dist && - !is_eq(it->pvalue(), 0.0) && - !is_eq(it->pvalue(), 100.0)) { - cs << cs_erase << "CLIMO_CDP" << nint(it->pvalue()); - write_nc(cs, normal_cdf_inv(it->pvalue()/100.0, ocmn_dp, ocsd_dp), - i, mthd, pnts, - conf_info.vx_opt[i].interp_info.field); - } - // MET #2924 End replace } // end for it } @@ -1912,19 +1892,23 @@ void process_scores() { // Read forecast data for UGRD if(!read_data_plane(conf_info.vx_opt[ui].fcst_info, - fu_dp, fcst_mtddf, fcst_file)) continue; + fu_dp, fcst_mtddf, fcst_file, + "U-wind forecast")) continue; // Read observation data for UGRD if(!read_data_plane(conf_info.vx_opt[ui].obs_info, - ou_dp, obs_mtddf, obs_file)) continue; + ou_dp, obs_mtddf, obs_file, + "U-wind observation")) continue; // Read climatology data for UGRD fcmnu_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_fcst_climo_mean_field, false), - ui, fcst_dp.valid(), grid); + ui, fcst_dp.valid(), grid, + "forecast U-wind climatology mean"); ocmnu_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_obs_climo_mean_field, false), - ui, fcst_dp.valid(), grid); + ui, fcst_dp.valid(), grid, + "observation U-wind climatology mean"); // Apply Fourier decomposition to the U-wind fields fu_dp_smooth = fu_dp; @@ -2037,7 +2021,6 @@ void process_scores() { i, shc.get_interp_mthd(), bad_data_int, FieldType::Both); } - /* MET #2924 Replace this change if(conf_info.vx_opt[i].nc_info.do_climo && !fcmn_dp_smooth.is_empty()) { write_nc((string)"FCST_CLIMO_MEAN", fcmn_dp_smooth, @@ -2050,14 +2033,6 @@ void process_scores() { i, shc.get_interp_mthd(), bad_data_int, FieldType::Both); } - */ - if(conf_info.vx_opt[i].nc_info.do_climo && - !ocmn_dp_smooth.is_empty()) { - write_nc((string)"CLIMO_MEAN", ocmn_dp_smooth, - i, shc.get_interp_mthd(), - bad_data_int, FieldType::Both); - } - // MET #2924 End replace } // end if } // end for j @@ -2838,7 +2813,6 @@ void write_nc(const ConcatString &field_name, const DataPlane &dp, level_att = shc.get_fcst_lev(); units_att = conf_info.vx_opt[i_vx].fcst_info->units_attr(); } - /* MET #2924 Replace this section else if(field_name == "OBS_CLIMO_MEAN") { var_name << cs_erase << field_name << "_" << obs_name << var_suffix << "_" << mask_str; @@ -2895,52 +2869,6 @@ void write_nc(const ConcatString &field_name, const DataPlane &dp, level_att = shc.get_obs_lev(); units_att = conf_info.vx_opt[i_vx].obs_info->units_attr(); } - */ - else if(field_name == "CLIMO_MEAN") { - var_name << cs_erase << field_name << "_" - << obs_name << var_suffix << "_" << mask_str; - - // Append interpolation string for Fourier decomposition - if(interp_str.nonempty()) { - if(interp_str.startswith("_WV")) var_name << interp_str; - } - long_att << cs_erase - << "Climatology mean for " - << obs_long_name; - level_att = shc.get_obs_lev(); - units_att = conf_info.vx_opt[i_vx].obs_info->units_attr(); - } - else if(field_name == "CLIMO_STDEV") { - var_name << cs_erase << field_name << "_" - << obs_name << var_suffix << "_" << mask_str; - long_att << cs_erase - << "Climatology standard deviation for " - << obs_long_name; - level_att = shc.get_obs_lev(); - units_att = conf_info.vx_opt[i_vx].obs_info->units_attr(); - } - else if(field_name == "CLIMO_CDF") { - var_name << cs_erase << field_name << "_" - << obs_name << var_suffix << "_" << mask_str; - long_att << cs_erase - << "Climatology cumulative distribution function for " - << obs_long_name; - level_att = shc.get_obs_lev(); - units_att = conf_info.vx_opt[i_vx].obs_info->units_attr(); - } - else if(field_name.startswith("CLIMO_CDP")) { - var_name << cs_erase - << field_name << "_" - << conf_info.vx_opt[i_vx].obs_info->name_attr() << "_" - << conf_info.vx_opt[i_vx].obs_info->level_attr() - << var_suffix << "_" << mask_str; - long_att << cs_erase - << "Climatology distribution percentile thresholds for " - << obs_long_name; - level_att = shc.get_obs_lev(); - units_att = conf_info.vx_opt[i_vx].obs_info->units_attr(); - } - // MET #2924 end replace else if(check_reg_exp("FCST_XGRAD_", field_name.c_str()) || check_reg_exp("FCST_YGRAD_", field_name.c_str())) { var_name << cs_erase << field_name << "_" @@ -3394,15 +3322,15 @@ void set_compress(const StringArray & a) { //////////////////////////////////////////////////////////////////////// -bool read_data_plane(VarInfo* info, DataPlane& dp, Met2dDataFile* mtddf, - const ConcatString &filename) { +bool read_data_plane(VarInfo *info, DataPlane &dp, Met2dDataFile *mtddf, + const ConcatString &filename, const char *desc) { bool status = mtddf->data_plane(*info, dp); if(!status) { mlog << Warning << "\nread_data_plane() -> " << info->magic_str() - << " not found in file: " << filename + << " not found in " << desc << " file: " << filename << "\n\n"; return false; } @@ -3410,7 +3338,7 @@ bool read_data_plane(VarInfo* info, DataPlane& dp, Met2dDataFile* mtddf, // Regrid, if necessary if(!(mtddf->grid() == grid)) { mlog << Debug(1) - << "Regridding field " + << "Regridding " << desc << " field " << info->magic_str() << " to the verification grid.\n"; dp = met_regrid(dp, mtddf->grid(), grid, info->regrid()); diff --git a/src/tools/core/point_stat/point_stat.cc b/src/tools/core/point_stat/point_stat.cc index 5532ea7e1d..bda41ddf26 100644 --- a/src/tools/core/point_stat/point_stat.cc +++ b/src/tools/core/point_stat/point_stat.cc @@ -668,18 +668,22 @@ void process_fcst_climo_files() { // Read forecast climatology data fcmn_dpa = read_climo_data_plane_array( conf_info.conf.lookup_array(conf_key_fcst_climo_mean_field, false), - i, fcst_dpa[0].valid(), grid); + i, fcst_dpa[0].valid(), grid, + "forecast climatology mean"); fcsd_dpa = read_climo_data_plane_array( conf_info.conf.lookup_array(conf_key_fcst_climo_stdev_field, false), - i, fcst_dpa[0].valid(), grid); + i, fcst_dpa[0].valid(), grid, + "forecast climatology standard deviation"); // Read observation climatology data ocmn_dpa = read_climo_data_plane_array( conf_info.conf.lookup_array(conf_key_obs_climo_mean_field, false), - i, fcst_dpa[0].valid(), grid); + i, fcst_dpa[0].valid(), grid, + "observation climatology mean"); ocsd_dpa = read_climo_data_plane_array( conf_info.conf.lookup_array(conf_key_obs_climo_stdev_field, false), - i, fcst_dpa[0].valid(), grid); + i, fcst_dpa[0].valid(), grid, + "observation climatology standard deviation"); // Store data for the current verification task conf_info.vx_opt[i].vx_pd.set_fcst_dpa(fcst_dpa); diff --git a/src/tools/core/series_analysis/series_analysis.cc b/src/tools/core/series_analysis/series_analysis.cc index 5622908e0d..a2e8cdf5c1 100644 --- a/src/tools/core/series_analysis/series_analysis.cc +++ b/src/tools/core/series_analysis/series_analysis.cc @@ -738,19 +738,25 @@ void process_scores() { << min(i_point + conf_info.block_size, nxy) << ".\n"; } - // Read climatology data for the current series entry + // Read forecast climatology data fcmn_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_fcst_climo_mean_field, false), - i_fcst, fcst_dp.valid(), grid); + i_fcst, fcst_dp.valid(), grid, + "forecast climatology mean"); fcsd_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_fcst_climo_stdev_field, false), - i_fcst, fcst_dp.valid(), grid); + i_fcst, fcst_dp.valid(), grid, + "forecast climatology standard deviation"); + + // Read observation climatology data ocmn_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_obs_climo_mean_field, false), - i_fcst, fcst_dp.valid(), grid); + i_fcst, fcst_dp.valid(), grid, + "observation climatology mean"); ocsd_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_obs_climo_stdev_field, false), - i_fcst, fcst_dp.valid(), grid); + i_fcst, fcst_dp.valid(), grid, + "observation climatology standard deviation"); bool fcmn_flag = (fcmn_dp.nx() == fcst_dp.nx() && fcmn_dp.ny() == fcst_dp.ny()); diff --git a/src/tools/other/gen_ens_prod/gen_ens_prod.cc b/src/tools/other/gen_ens_prod/gen_ens_prod.cc index 368fceab6f..b088c74dcf 100644 --- a/src/tools/other/gen_ens_prod/gen_ens_prod.cc +++ b/src/tools/other/gen_ens_prod/gen_ens_prod.cc @@ -469,7 +469,8 @@ void get_climo_mean_stdev(GenEnsProdVarInfo *ens_info, int i_var, cmn_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_climo_mean_field, false), - i_var, ens_valid_ut, grid); + i_var, ens_valid_ut, grid, + "climatology mean"); mlog << Debug(4) << "Reading climatology standard deviation data for ensemble field \"" @@ -477,7 +478,8 @@ void get_climo_mean_stdev(GenEnsProdVarInfo *ens_info, int i_var, csd_dp = read_climo_data_plane( conf_info.conf.lookup_array(conf_key_climo_stdev_field, false), - i_var, ens_valid_ut, grid); + i_var, ens_valid_ut, grid, + "climatology standard deviation"); // Unset the MET_ENS_MEMBER_ID environment variable if(set_ens_mem_id) { diff --git a/src/tools/other/gsi_tools/gsid2mpr.cc b/src/tools/other/gsi_tools/gsid2mpr.cc index e5a770f8e3..d0468d3b08 100644 --- a/src/tools/other/gsi_tools/gsid2mpr.cc +++ b/src/tools/other/gsi_tools/gsid2mpr.cc @@ -392,10 +392,8 @@ void write_mpr_row_conv(AsciiTable &at, int row, const ConvData &d) { at.set_entry(row, col++, na_str); // OBS_CLIMO_MEAN at.set_entry(row, col++, na_str); // OBS_CLIMO_STDEV at.set_entry(row, col++, na_str); // OBS_CLIMO_CDF - /* MET #2924 Uncomment this section at.set_entry(row, col++, na_str); // FCST_CLIMO_MEAN at.set_entry(row, col++, na_str); // FCST_CLIMO_STDEV - */ // Write extra columns at.set_entry(row, col++, d.prs); // OBS_PRS @@ -450,10 +448,8 @@ void write_mpr_row_rad(AsciiTable &at, int row, const RadData & d) { at.set_entry(row, col++, na_str); // OBS_CLIMO_MEAN at.set_entry(row, col++, na_str); // OBS_CLIMO_STDEV at.set_entry(row, col++, na_str); // OBS_CLIMO_CDF - /* MET #2924 Uncomment this section at.set_entry(row, col++, na_str); // FCST_CLIMO_MEAN at.set_entry(row, col++, na_str); // FCST_CLIMO_STDEV - */ // Write extra columns at.set_entry(row, col++, d.use); // CHAN_USE diff --git a/src/tools/other/gsi_tools/gsidens2orank.cc b/src/tools/other/gsi_tools/gsidens2orank.cc index fed035bd69..39edb87cc5 100644 --- a/src/tools/other/gsi_tools/gsidens2orank.cc +++ b/src/tools/other/gsi_tools/gsidens2orank.cc @@ -641,10 +641,8 @@ void write_orank_row_conv(AsciiTable &at, int row, int i_obs) { at.set_entry(row, col++, bad_data_double); // SPREAD_OERR at.set_entry(row, col++, bad_data_double); // SPREAD_PLUS_OERR at.set_entry(row, col++, bad_data_double); // OBS_CLIMO_STDEV - /* MET #2924 Uncomment this section at.set_entry(row, col++, bad_data_double); // FCST_CLIMO_MEAN at.set_entry(row, col++, bad_data_double); // FCST_CLIMO_STDEV - */ // Write extra columns at.set_entry(row, col++, d->n_use); // N_USE @@ -711,10 +709,8 @@ void write_orank_row_rad(AsciiTable &at, int row, int i_obs) { at.set_entry(row, col++, bad_data_double); // SPREAD_OERR at.set_entry(row, col++, bad_data_double); // SPREAD_PLUS_OERR at.set_entry(row, col++, bad_data_double); // OBS_CLIMO_STDEV - /* MET #2924 Uncomment this section at.set_entry(row, col++, bad_data_double); // FCST_CLIMO_MEAN at.set_entry(row, col++, bad_data_double); // FCST_CLIMO_STDEV - */ // Write extra columns at.set_entry(row, col++, d->n_use); // N_USE