diff --git a/data/table_files/met_header_columns_V11.0.txt b/data/table_files/met_header_columns_V11.0.txt
index 7a448d8d17..59a97d40a6 100644
--- a/data/table_files/met_header_columns_V11.0.txt
+++ b/data/table_files/met_header_columns_V11.0.txt
@@ -36,5 +36,5 @@ V11.0 : STAT : SSIDX : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID
V11.0 : 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
V11.0 : 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
-V11.0 : 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
+V11.0 : 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 NUM_MEMBERS TRACK_SPREAD DIST_MEAN MSLP_SPREAD MAX_WIND_SPREAD
V11.0 : 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/docs/Users_Guide/tc-pairs.rst b/docs/Users_Guide/tc-pairs.rst
index 3de6d0b470..77ee2af4c7 100644
--- a/docs/Users_Guide/tc-pairs.rst
+++ b/docs/Users_Guide/tc-pairs.rst
@@ -156,7 +156,7 @@ ____________________
}
];
-The **consensus** field allows the user to generate a user-defined consensus forecasts from any number of models. All models used in the consensus forecast need to be included in the **model** field (first entry in **TCPairsConfig_default**). The name field is the desired consensus model name. The **members** field is a comma-separated list of model IDs that make up the members of the consensus. The **required** field is a comma-separated list of true/false values associated with each consensus member. If a member is designated as true, the member is required to be present in order for the consensus to be generated. If a member is false, the consensus will be generated regardless of whether the member is present. The length of the required array must be the same length as the members array. The **min_req** field is the number of members required in order for the consensus to be computed. The required and min_req field options are applied at each forecast lead time. If any member of the consensus has a non-valid position or intensity value, the consensus for that valid time will not be generated.
+The **consensus** field allows the user to generate a user-defined consensus forecasts from any number of models. All models used in the consensus forecast need to be included in the **model** field (first entry in **TCPairsConfig_default**). The name field is the desired consensus model name. The **members** field is a comma-separated list of model IDs that make up the members of the consensus. The **required** field is a comma-separated list of true/false values associated with each consensus member. If a member is designated as true, the member is required to be present in order for the consensus to be generated. If a member is false, the consensus will be generated regardless of whether the member is present. The length of the required array must be the same length as the members array. The **min_req** field is the number of members required in order for the consensus to be computed. The required and min_req field options are applied at each forecast lead time. If any member of the consensus has a non-valid position or intensity value, the consensus for that valid time will not be generated. If a consensus model is indicated in the configuration file there will be non-missing output for the consensus track variables in the output file (NUM_MEMBERS, TRACK_SPREAD, DIST_MEAN, MSLP_SPREAD, MAX_WIND_SPREAD). See the TCMPR line type definitions below.
____________________
@@ -472,7 +472,22 @@ TC-Pairs produces output in TCST format. The default output file name can be ove
* - 78, 79
- A/BDEPTH
- system depth, D-deep, M-medium, S-shallow, X-unknown
-
+ * - 80
+ - NUM_MEMBERS
+ - consensus variable: number of models (or ensemble members) that were used to build the consensus track
+ * - 81
+ - TRACK_SPREAD
+ - consensus variable: the standard deviation of the distances from the member locations to the consensus track location (nm)
+ * - 82
+ - DIST_MEAN
+ - consensus variable: the mean of the distances from the member location to the consensus track location (nm)
+ * - 83
+ - MSLP_SPREAD
+ - consensus variable: the standard deviation of the member's mean sea level pressure values
+ * - 84
+ - MAX_WIND_SPREAD
+ - consensus variable: the standard deviation of the member's maximum wind speed values
+
.. _PROBRIRW Line Type:
.. list-table:: Format information for PROBRIRW (Probability of Rapid Intensification/Weakening) output line type.
diff --git a/internal/test_unit/config/TCPairsConfig_CONSENSUS b/internal/test_unit/config/TCPairsConfig_CONSENSUS
new file mode 100644
index 0000000000..16b2106a2a
--- /dev/null
+++ b/internal/test_unit/config/TCPairsConfig_CONSENSUS
@@ -0,0 +1,198 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// TC-Pairs configuration file.
+//
+// For additional information, please see the MET User's Guide.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+//
+// ATCF file format reference:
+// http://www.nrlmry.navy.mil/atcf_web/docs/database/new/abrdeck.html
+//
+
+//
+// Models
+//
+model = [];
+
+//
+// Description
+//
+desc = "NA";
+
+//
+// Storm identifiers
+//
+storm_id = [ "AL132020" ];
+
+//
+// Basins
+//
+basin = [];
+
+//
+// Cyclone numbers
+//
+cyclone = [];
+
+//
+// Storm names
+//
+storm_name = [];
+
+//
+// Model initialization time windows to include or exclude
+//
+init_beg = ${INIT_BEG};
+init_end = ${INIT_END};
+init_inc = [];
+init_exc = [];
+
+//
+// Valid model time windows to include or exclude
+//
+valid_beg = "";
+valid_end = "";
+valid_inc = [];
+valid_exc = [];
+
+//
+// Valid times for which output should be written
+//
+write_valid = [];
+
+//
+// Model initialization hours
+//
+init_hour = [];
+
+//
+// Required lead time in hours
+//
+lead_req = [];
+
+//
+// lat/lon polylines defining masking regions
+//
+init_mask = "";
+valid_mask = "";
+
+//
+// Specify if the code should check for duplicate ATCF lines
+//
+check_dup = TRUE;
+
+//
+// Specify special processing to be performed for interpolated models.
+// Set to NONE, FILL, or REPLACE.
+//
+interp12 = NONE;
+
+//
+// Specify how consensus forecasts should be defined
+// See NHC Consensus Definitions in Table 2:
+// https://www.nhc.noaa.gov/modelsummary.shtml
+//
+consensus = [
+ {
+ name = "UEMN_CONS";
+ members = [ "UE00", "UE01", "UE02", "UE03", "UE04",
+ "UE05", "UE06", "UE07", "UE08", "UE09",
+ "UE10", "UE11", "UE12", "UE13", "UE14",
+ "UE15", "UE16", "UE17", "UE18", "UE19",
+ "UE20", "UE21", "UE22", "UE23", "UE24",
+ "UE25", "UE26", "UE27", "UE28", "UE29",
+ "UE30", "UE31", "UE32", "UE33", "UE34",
+ "UE35" ];
+ required = [];
+ min_req = 36;
+ },
+ {
+ name = "HCCA_CONS";
+ members = [ "AEMI", "GFSI", "CTCI", "DSHP", "EGRI", "EMN2", "EMXI", "HWFI", "LGEM" ];
+ required = [];
+ min_req = 8;
+ },
+ {
+ name = "GFEX_CONS";
+ members = [ "GFSI", "EMXI" ];
+ required = [];
+ min_req = 2;
+ },
+ {
+ name = "TVCA_CONS";
+ members = [ "GFSI", "EGRI", "HWFI", "EMHI", "CTCI", "EMNI" ];
+ required = [];
+ min_req = 2;
+ },
+ {
+ name = "TVCX_CONS";
+ members = [ "GFSI", "EMXI", "EMXI", "HWFI", "CTCI", "EGRI" ];
+ required = [ TRUE, TRUE, FALSE, FALSE, FALSE, FALSE ];
+ min_req = 2;
+ },
+ {
+ name = "ICON_CONS";
+ members = [ "DSHP", "LGEM", "HWFI", "HMNI" ];
+ required = [ TRUE, TRUE, TRUE, TRUE ];
+ min_req = 4;
+ },
+ {
+ name = "IVCN_CONS";
+ members = [ "DSHP", "LGEM", "HWFI", "HMNI", "CTCI" ];
+ required = [];
+ min_req = 2;
+ }
+];
+
+//
+// Forecast lag times
+//
+lag_time = [];
+
+//
+// CLIPER/SHIFOR baseline forecasts to be derived from the BEST
+// and operational (CARQ) tracks.
+//
+best_baseline = [ "BCLP" ];
+oper_baseline = [ "OCLP" ];
+
+//
+// Specify if only those track points common to both the ADECK and BDECK
+// tracks be written out.
+//
+match_points = TRUE;
+
+//
+// Specify the NetCDF output of the gen_dland tool containing a gridded
+// representation of the minimum distance to land.
+//
+dland_file = "${MET_TEST_OUTPUT}/tc_dland/tc_dland_half_deg.nc";
+
+//
+// Specify watch/warning information:
+// - Input watch/warning filename
+// - Watch/warning time offset in seconds
+//
+watch_warn = {
+ file_name = "MET_BASE/tc_data/wwpts_us.txt";
+ time_offset = -14400;
+}
+
+//
+// Modify basin names to make them consistent across ATCF input files.
+//
+basin_map = [
+ { key = "SI"; val = "SH"; },
+ { key = "SP"; val = "SH"; },
+ { key = "AU"; val = "SH"; },
+ { key = "AB"; val = "IO"; },
+ { key = "BB"; val = "IO"; }
+];
+
+//
+// Indicate a version number for the contents of this configuration file.
+// The value should generally not be modified.
+//
+version = "V11.0.0";
diff --git a/internal/test_unit/hdr/met_11_0.hdr b/internal/test_unit/hdr/met_11_0.hdr
index 99e888ee32..c1d7e318f0 100644
--- a/internal/test_unit/hdr/met_11_0.hdr
+++ b/internal/test_unit/hdr/met_11_0.hdr
@@ -33,5 +33,5 @@ SSIDX : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_L
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_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 NUM_MEMBERS TRACK_SPREAD DIST_MEAN MSLP_SPREAD MAX_WIND_SPREAD
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_
diff --git a/internal/test_unit/xml/unit_tc_pairs.xml b/internal/test_unit/xml/unit_tc_pairs.xml
index d35465237a..44f986fd10 100644
--- a/internal/test_unit/xml/unit_tc_pairs.xml
+++ b/internal/test_unit/xml/unit_tc_pairs.xml
@@ -36,6 +36,25 @@
+
+ &MET_BIN;/tc_pairs
+
+ INIT_BEG "20200823_00"
+ INIT_END "20200823_18"
+
+ \
+ -adeck &DATA_DIR;/adeck/aal132020.dat \
+ -bdeck &DATA_DIR;/bdeck/bal132020.dat \
+ -config &CONFIG_DIR;/TCPairsConfig_CONSENSUS \
+ -out &OUTPUT_DIR;/tc_pairs/al132020_CONSENSUS \
+ -log &OUTPUT_DIR;/tc_pairs/tc_pairs_CONSENSUS.log \
+ -v 2
+
+
+
+
&MET_BIN;/tc_pairs
diff --git a/internal/test_util/libcode/vx_nc_util/Makefile.am b/internal/test_util/libcode/vx_nc_util/Makefile.am
index b374eba00f..39d0cd9867 100644
--- a/internal/test_util/libcode/vx_nc_util/Makefile.am
+++ b/internal/test_util/libcode/vx_nc_util/Makefile.am
@@ -42,6 +42,7 @@ test_pressure_levels_LDADD = -lvx_stat_out \
-lvx_config \
-lvx_gsl_prob \
-lvx_cal \
+ -lvx_nav \
-lvx_util_math \
-lvx_util \
-lvx_math \
diff --git a/internal/test_util/libcode/vx_nc_util/Makefile.in b/internal/test_util/libcode/vx_nc_util/Makefile.in
index 57f091eed3..bc6cf1d1db 100644
--- a/internal/test_util/libcode/vx_nc_util/Makefile.in
+++ b/internal/test_util/libcode/vx_nc_util/Makefile.in
@@ -343,6 +343,7 @@ test_pressure_levels_LDADD = -lvx_stat_out \
-lvx_config \
-lvx_gsl_prob \
-lvx_cal \
+ -lvx_nav \
-lvx_util_math \
-lvx_util \
-lvx_math \
diff --git a/src/libcode/vx_tc_util/tc_columns.cc b/src/libcode/vx_tc_util/tc_columns.cc
index 1c71d754ff..ec73a544d9 100644
--- a/src/libcode/vx_tc_util/tc_columns.cc
+++ b/src/libcode/vx_tc_util/tc_columns.cc
@@ -298,6 +298,12 @@ void write_tc_mpr_cols(const TrackPairInfo &p, int i,
at.set_entry(r, c++, systemsdepth_to_string(p.adeck()[i].depth()));
at.set_entry(r, c++, systemsdepth_to_string(p.bdeck()[i].depth()));
+ at.set_entry(r, c++, p.adeck()[i].num_members());
+ at.set_entry(r, c++, p.adeck()[i].spread());
+ at.set_entry(r, c++, p.adeck()[i].dist_mean());
+ at.set_entry(r, c++, p.adeck()[i].mslp_stdev());
+ at.set_entry(r, c++, p.adeck()[i].v_max_stdev());
+
return;
}
diff --git a/src/libcode/vx_tc_util/tc_columns.h b/src/libcode/vx_tc_util/tc_columns.h
index 5241d92997..af6cab2e5a 100644
--- a/src/libcode/vx_tc_util/tc_columns.h
+++ b/src/libcode/vx_tc_util/tc_columns.h
@@ -68,7 +68,12 @@ static const char * tc_mpr_cols [] = {
"AEYE", "BEYE",
"ADIR", "BDIR",
"ASPEED", "BSPEED",
- "ADEPTH", "BDEPTH"
+ "ADEPTH", "BDEPTH",
+ "NUM_MEMBERS",
+ "TRACK_SPREAD",
+ "DIST_MEAN",
+ "MSLP_SPREAD",
+ "MAX_WIND_SPREAD"
};
static const int n_tc_mpr_cols = sizeof(tc_mpr_cols)/sizeof(*tc_mpr_cols);
diff --git a/src/libcode/vx_tc_util/track_info.cc b/src/libcode/vx_tc_util/track_info.cc
index 4a4c34900c..479d0ae6f1 100644
--- a/src/libcode/vx_tc_util/track_info.cc
+++ b/src/libcode/vx_tc_util/track_info.cc
@@ -18,7 +18,6 @@ using namespace std;
#include
#include "math_constants.h"
-
#include "track_info.h"
////////////////////////////////////////////////////////////////////////
@@ -862,9 +861,10 @@ TrackInfo consensus(const TrackInfoArray &tracks,
int pcnt;
TrackPoint pavg, psum;
QuadInfo wavg;
- NumArray plon;
+ NumArray plon, plat, pvmax, pmslp;
double lon_range, lon_shift, lon_avg;
-
+ double track_spread, vmax_stdev, mslp_stdev;
+
// Check for at least one track
if(tracks.n() == 0) {
mlog << Error
@@ -926,6 +926,9 @@ TrackInfo consensus(const TrackInfoArray &tracks,
pavg.clear();
psum.clear();
plon.clear();
+ plat.clear();
+ pvmax.clear();
+ pmslp.clear();
pcnt = 0;
// Loop through the tracks and get an average TrackPoint
@@ -948,8 +951,11 @@ TrackInfo consensus(const TrackInfoArray &tracks,
if(pcnt == 1) psum = tracks.Track[j][i_pnt];
else psum += tracks.Track[j][i_pnt];
- // Store the longitude values
+ // Store the track point latitude, longitude v_max and mslp values
plon.add(tracks.Track[j][i_pnt].lon());
+ plat.add(tracks.Track[j][i_pnt].lat());
+ pvmax.add(tracks.Track[j][i_pnt].v_max());
+ pmslp.add(tracks.Track[j][i_pnt].mslp());
}
// Check for missing required member and the minimum number of points
@@ -981,6 +987,29 @@ TrackInfo consensus(const TrackInfoArray &tracks,
if(!is_bad_data(pavg.lat())) pavg.set_lat(psum.lat()/pcnt);
if(!is_bad_data(pavg.lon())) pavg.set_lon(rescale_deg(lon_avg, -180.0, 180.0));
+ // Save the number of members that went into the consensus
+ if(pcnt > 0) pavg.set_num_members(pcnt);
+
+ // Compute track spread and distance mean, convert to nautical-miles
+ double track_spread, dist_mean;
+ compute_gc_dist_stdev(pavg.lat(), pavg.lon(), plat, plon, track_spread, dist_mean);
+
+ if(!is_bad_data(track_spread)) {
+ track_spread *= tc_nautical_miles_per_km;
+ pavg.set_spread(track_spread);
+ }
+
+ if(!is_bad_data(dist_mean)) {
+ dist_mean *= tc_nautical_miles_per_km;
+ pavg.set_dist_mean(dist_mean);
+ }
+
+ // Compute wind-speed (v_max) and pressure (mslp) standard deviation
+ vmax_stdev = pvmax.stdev();
+ mslp_stdev = pmslp.stdev();
+ if(!is_bad_data(vmax_stdev)) pavg.set_v_max_stdev(vmax_stdev);
+ if(!is_bad_data(mslp_stdev)) pavg.set_mslp_stdev(mslp_stdev);
+
// Compute the average winds
for(j=0; j