diff --git a/.github/ISSUE_TEMPLATE/enhancement_request.md b/.github/ISSUE_TEMPLATE/enhancement_request.md
index e1134781cd..78cd208f15 100644
--- a/.github/ISSUE_TEMPLATE/enhancement_request.md
+++ b/.github/ISSUE_TEMPLATE/enhancement_request.md
@@ -39,8 +39,8 @@ Consider breaking the enhancement down into sub-issues.
- [ ] Select **requestor(s)**
### Milestone and Projects ###
-- [ ] Select **Milestone** as the next official version or **Backlog of Development Ideas**
-- [ ] For the next official version, select the **MET-X.Y.Z Development** project
+- [ ] Select **Milestone** as a **MET-X.Y.Z** version, **Consider for Next Release**, or **Backlog of Development Ideas**
+- [ ] For a **MET-X.Y.Z** version, select the **MET-X.Y.Z Development** project
## Define Related Issue(s) ##
Consider the impact to the other METplus components.
diff --git a/.github/ISSUE_TEMPLATE/new_feature_request.md b/.github/ISSUE_TEMPLATE/new_feature_request.md
index e4adb302c7..ea95d70c13 100644
--- a/.github/ISSUE_TEMPLATE/new_feature_request.md
+++ b/.github/ISSUE_TEMPLATE/new_feature_request.md
@@ -43,8 +43,8 @@ Consider breaking the new feature down into sub-issues.
- [ ] Select **requestor(s)**
### Milestone and Projects ###
-- [ ] Select **Milestone** as the next official version or **Backlog of Development Ideas**
-- [ ] For the next official version, select the **MET-X.Y.Z Development** project
+- [ ] Select **Milestone** as a **MET-X.Y.Z** version, **Consider for Next Release**, or **Backlog of Development Ideas**
+- [ ] For a **MET-X.Y.Z** version, select the **MET-X.Y.Z Development** project
## Define Related Issue(s) ##
Consider the impact to the other METplus components.
diff --git a/.github/ISSUE_TEMPLATE/sub-issue.md b/.github/ISSUE_TEMPLATE/sub-issue.md
index e02109e963..45ee00432d 100644
--- a/.github/ISSUE_TEMPLATE/sub-issue.md
+++ b/.github/ISSUE_TEMPLATE/sub-issue.md
@@ -29,5 +29,5 @@ This is a sub-issue of #*List the parent issue number here*.
- [ ] Select **requestor(s)**
### Milestone and Projects ###
-- [ ] Select **Milestone** as the next official version or **Backlog of Development Ideas**
-- [ ] For the next official version, select the **MET-X.Y.Z Development** project
+- [ ] Select **Milestone** as a **MET-X.Y.Z** version, **Consider for Next Release**, or **Backlog of Development Ideas**
+- [ ] For a **MET-X.Y.Z** version, select the **MET-X.Y.Z Development** project
diff --git a/.github/ISSUE_TEMPLATE/task.md b/.github/ISSUE_TEMPLATE/task.md
index 05ad99baf8..33685adf25 100644
--- a/.github/ISSUE_TEMPLATE/task.md
+++ b/.github/ISSUE_TEMPLATE/task.md
@@ -39,8 +39,8 @@ Consider breaking the task down into sub-issues.
- [ ] Select **requestor(s)**
### Milestone and Projects ###
-- [ ] Select **Milestone** as the next official version or **Backlog of Development Ideas**
-- [ ] For the next official version, select the **MET-X.Y.Z Development** project
+- [ ] Select **Milestone** as a **MET-X.Y.Z** version, **Consider for Next Release**, or **Backlog of Development Ideas**
+- [ ] For a **MET-X.Y.Z** version, select the **MET-X.Y.Z Development** project
## Define Related Issue(s) ##
Consider the impact to the other METplus components.
diff --git a/.github/jobs/run_unit_tests.sh b/.github/jobs/run_unit_tests.sh
index e866b2cc61..b85bac84fe 100755
--- a/.github/jobs/run_unit_tests.sh
+++ b/.github/jobs/run_unit_tests.sh
@@ -15,7 +15,7 @@ source ${MET_REPO_DIR}/.github/jobs/test_env_vars.sh
echo "Running MET unit tests..."
for testname in $TESTS_TO_RUN; do
CMD_LOGFILE=/met/logs/unit_${testname}.log
- time_command ${MET_TEST_BASE}/perl/unit.pl ${MET_TEST_BASE}/xml/unit_${testname}.xml
+ time_command ${MET_TEST_BASE}/python/unit.py ${MET_TEST_BASE}/xml/unit_${testname}.xml
if [ $? != 0 ]; then
echo "ERROR: Unit test ${testname} failed"
cat /met/logs/unit_${testname}.log
diff --git a/.github/jobs/set_job_controls.sh b/.github/jobs/set_job_controls.sh
index 9c39a50716..aa72ad4162 100755
--- a/.github/jobs/set_job_controls.sh
+++ b/.github/jobs/set_job_controls.sh
@@ -6,7 +6,7 @@ run_unit_tests=false
run_diff=false
run_update_truth=false
met_base_repo=met-base
-met_base_tag=v3.2
+met_base_tag=v3.3
input_data_version=develop
truth_data_version=develop
@@ -57,6 +57,12 @@ elif [ "${GITHUB_EVENT_NAME}" == "push" ]; then
input_data_version=${branch_name:6}
fi
+ # check for main_vX.Y in the branch name
+ elif [[ "${branch_name}" =~ .*(main_v)([0-9]+\.[0-9]+).* ]]; then
+
+ truth_data_version=${BASH_REMATCH[1]}${BASH_REMATCH[2]}
+ input_data_version=${BASH_REMATCH[2]}
+
fi
# check commit messages for skip or force keywords
@@ -87,14 +93,27 @@ elif [ "${GITHUB_EVENT_NAME}" == "push" ]; then
elif [ "${GITHUB_EVENT_NAME}" == "workflow_dispatch" ]; then
+ branch_name=`cut -d "/" -f3 <<< "${GITHUB_REF}"`
+
+ # check for main_vX.Y in the branch name
+ if [[ "${branch_name}" =~ .*(main_v)([0-9]+\.[0-9]+).* ]]; then
+
+ truth_data_version=${BASH_REMATCH[1]}${BASH_REMATCH[2]}
+ input_data_version=${BASH_REMATCH[2]}
+
+ fi
+
if [ "${force_tests}" == "true" ]; then
+
run_diff=true
+
fi
fi
# if updating truth or running diff, run unit tests
-if [ "$run_update_truth" == "true" ] || [ "$run_diff" == "true" ]; then
+if [ "$run_update_truth" == "true" ] ||
+ [ "$run_diff" == "true" ]; then
run_unit_tests=true
diff --git a/.github/workflows/build_docker_and_trigger_metplus.yml b/.github/workflows/build_docker_and_trigger_metplus.yml
index 13606d5ed3..7d1ab738d8 100644
--- a/.github/workflows/build_docker_and_trigger_metplus.yml
+++ b/.github/workflows/build_docker_and_trigger_metplus.yml
@@ -5,7 +5,7 @@ on:
branches:
- develop
paths-ignore:
- - 'met/docs/**'
+ - 'docs/**'
workflow_dispatch:
@@ -29,7 +29,7 @@ jobs:
env:
SOURCE_BRANCH: ${{ steps.get_branch_name.outputs.branch_name }}-lite
MET_BASE_REPO: met-base
- MET_BASE_TAG: v3.2
+ MET_BASE_TAG: v3.3
- name: Push Docker Image
run: .github/jobs/push_docker_image.sh
diff --git a/.github/workflows/compilation_options.yml b/.github/workflows/compilation_options.yml
index 7a8dc73cf0..cf6c5fc97a 100644
--- a/.github/workflows/compilation_options.yml
+++ b/.github/workflows/compilation_options.yml
@@ -63,6 +63,10 @@ jobs:
config: '--enable-mode_graphics'
- jobid: 'job8'
config: '--enable-modis'
+ - jobid: 'job9'
+ config: '--enable-all MET_CXX_STANDARD=11'
+ - jobid: 'job10'
+ config: '--enable-all MET_CXX_STANDARD=14'
fail-fast: false
steps:
- uses: actions/checkout@v4
diff --git a/.github/workflows/release-checksum.yml b/.github/workflows/release-checksum.yml
index 683f258a6c..55d8b41cb0 100644
--- a/.github/workflows/release-checksum.yml
+++ b/.github/workflows/release-checksum.yml
@@ -9,6 +9,6 @@ jobs:
add-checksum:
runs-on: ubuntu-latest
steps:
- - uses: dtcenter/metplus-action-release-checksum@v1
+ - uses: dtcenter/metplus-action-release-checksum@v2
with:
token: ${{ secrets.METPLUS_BOT_TOKEN }}
diff --git a/.github/workflows/sonarqube.yml b/.github/workflows/sonarqube.yml
index 6a6627fb69..b476a488b6 100644
--- a/.github/workflows/sonarqube.yml
+++ b/.github/workflows/sonarqube.yml
@@ -61,7 +61,7 @@ jobs:
run: .github/jobs/build_sonarqube_image.sh
env:
MET_BASE_REPO: met-base
- MET_BASE_TAG: v3.2
+ MET_BASE_TAG: v3.3
SOURCE_BRANCH: ${{ steps.get_branch_name.outputs.branch_name }}
WD_REFERENCE_BRANCH: ${{ github.event.inputs.reference_branch }}
SONAR_SCANNER_VERSION: 5.0.1.3006
diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml
index 1fccc357fa..4e6e3872b7 100644
--- a/.github/workflows/testing.yml
+++ b/.github/workflows/testing.yml
@@ -176,7 +176,7 @@ jobs:
- jobid: 'job1'
tests: 'ascii2nc_indy pb2nc_indy tc_dland tc_pairs tc_stat plot_tc tc_rmw rmw_analysis tc_diag tc_gen'
- jobid: 'job2'
- tests: 'met_test_scripts mode_multivar mode_graphics mtd regrid airnow gsi_tools netcdf modis series_analysis wwmca_regrid gen_vx_mask grid_weight interp_shape grid_diag grib_tables lidar2nc shift_data_plane trmm2nc aeronet wwmca_plot ioda2nc gaussian'
+ tests: 'met_test_scripts mode_multivar mode_graphics mtd regrid airnow gsi_tools netcdf modis series_analysis wwmca_regrid gen_vx_mask interp_shape grid_diag grib_tables lidar2nc shift_data_plane trmm2nc aeronet wwmca_plot ioda2nc gaussian'
fail-fast: false
steps:
- uses: actions/checkout@v4
@@ -310,6 +310,8 @@ jobs:
tests: 'ensemble_stat stat_analysis_es'
- jobid: 'job5'
tests: 'ugrid'
+ - jobid: 'job6'
+ tests: 'grid_weight point_weight'
fail-fast: false
steps:
- uses: actions/checkout@v4
@@ -360,6 +362,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/.github/workflows/update_truth.yml b/.github/workflows/update_truth.yml
index adb67ecacc..a5ce785489 100644
--- a/.github/workflows/update_truth.yml
+++ b/.github/workflows/update_truth.yml
@@ -12,7 +12,7 @@ on:
jobs:
update_truth:
- name: "Update or create truth reference branch"
+ name: "Update reference branch truth data"
runs-on: ubuntu-latest
steps:
- name: Check if branch is develop or main_vX.Y
@@ -31,7 +31,8 @@ jobs:
with:
fetch-depth: 0
token: ${{ secrets.METPLUS_BOT_TOKEN }}
- - name: Resolve conflicts between branch and branch-ref
+ - name: Resolve conflicts with an update branch
+ id: resolve_conflicts
run: |
branch_name=${{ env.branch_name }}
cd ${GITHUB_WORKSPACE}
@@ -39,23 +40,34 @@ jobs:
echo ERROR: ${branch_name}-ref does not exist
exit 1
fi
-
+
echo ${branch_name}-ref does exist -- update it
git config --global user.name "metplus-bot"
git config --global user.email "97135045+metplus-bot@users.noreply.github.com"
+
+ # checkout branch (develop or main_vX.Y)
echo git checkout ${branch_name}
git checkout ${branch_name}
- echo git checkout -b update_truth_for_${branch_name}
- git checkout -b update_truth_for_${branch_name}
+
+ # create unique branch name to update *-ref branch
+ update_branch=update_${branch_name}_$(uuidgen | cut -d "-" -f1)
+ echo "update_branch=${update_branch}" >> $GITHUB_OUTPUT
+ echo git checkout -b ${update_branch}
+ git checkout -b ${update_branch}
+
+ # merge -ref branch into the update branch (favoring update branch changes)
echo git merge -s ours origin/${branch_name}-ref
git merge -s ours origin/${branch_name}-ref
- echo git push origin update_truth_for_${branch_name}
- git push origin update_truth_for_${branch_name}
+
+ # push update branch to origin
+ echo git push origin ${update_branch}
+ git push origin ${update_branch}
- name: Create Pull Request
- run: gh pr create --base $BASE --body "$BODY" --title "$TITLE"
+ run: gh pr create --head $HEAD --base $BASE --body "$BODY" --title "$TITLE"
env:
GH_TOKEN: ${{ github.token }}
+ HEAD: ${{ steps.resolve_conflicts.outputs.update_branch }}
BASE: ${{ env.branch_name }}-ref
- BODY: ${{ github.event.inputs.change_summary }}
Created by @${{ github.actor}}
+ BODY: ${{ github.event.inputs.change_summary }}
Created by @${{ github.actor }}
TITLE: Update ${{ env.branch_name }}-ref after ${{ github.event.inputs.pull_requests }}
diff --git a/.gitignore b/.gitignore
index d26e2e4a32..bbd21255b1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,5 @@ make.log
make_install.log
.idea
cmake-build-debug
+
+__pycache__
\ No newline at end of file
diff --git a/Makefile.in b/Makefile.in
index 582d2a65c8..0ae957d7b3 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -256,6 +256,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/configure b/configure
index 40672ec913..758f3502f6 100755
--- a/configure
+++ b/configure
@@ -797,6 +797,7 @@ MET_ATLAS
MET_PROJLIB
MET_PROJINC
MET_PROJ
+MET_CXX_STANDARD
OPENMP_CFLAGS
am__fastdepCC_FALSE
am__fastdepCC_TRUE
@@ -933,6 +934,7 @@ CFLAGS
LDFLAGS
LIBS
CPPFLAGS
+MET_CXX_STANDARD
MET_PROJ
MET_PROJINC
MET_PROJLIB
@@ -1667,6 +1669,9 @@ Some influential environment variables:
LIBS libraries to pass to the linker, e.g. -l
CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if
you have headers in a nonstandard directory
+ MET_CXX_STANDARD
+ Specify the version of the supported C++ standard. Values may be
+ 11, 14, or 17. Default value is 17.
MET_PROJ Where proj lib and include subdirectories are located. If they
are installed in /usr/local, you don't have to specify them.
MET_PROJINC Where proj include files are located. Use if the libraries and
@@ -5317,6 +5322,26 @@ printf "%s\n" "$ac_cv_prog_c_openmp" >&6; }
CPPFLAGS="${CPPFLAGS} ${OPENMP_CFLAGS}"
LDFLAGS="${LDFLAGS} ${OPENMP_CFLAGS}"
+#
+# Look for a specified C++ Standard
+#
+
+# Configure the variable. The help text will appear if the user uses "configure --help".
+
+
+
+# Set a default value
+
+if (test -z "$MET_CXX_STANDARD"); then
+ MET_CXX_STANDARD=17
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: c++17 will be used as the C++ standard" >&5
+printf "%s\n" "$as_me: c++17 will be used as the C++ standard" >&6;}
+elif (test -n "$MET_CXX_STANDARD"); then
+ MET_CXX_STANDARD=${MET_CXX_STANDARD}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: MET_CXX_STANDARD will be set" >&5
+printf "%s\n" "$as_me: MET_CXX_STANDARD will be set" >&6;}
+fi
+
#
# Look for the Proj library.
#
@@ -6988,7 +7013,7 @@ fi
CPPFLAGS=$CPPFLAGS' -DMET_BASE="\"$(pkgdatadir)\""'
# Add -std=c++11 to CXXFLAGS
-CXXFLAGS=$CXXFLAGS' -std=c++11'
+CXXFLAGS=$CXXFLAGS' -std=c++'$MET_CXX_STANDARD
# Define other variables for the makefiles
diff --git a/configure.ac b/configure.ac
index 2f8159d58c..03436847af 100644
--- a/configure.ac
+++ b/configure.ac
@@ -15,6 +15,24 @@ AC_OPENMP()
CPPFLAGS="${CPPFLAGS} ${OPENMP_CFLAGS}"
LDFLAGS="${LDFLAGS} ${OPENMP_CFLAGS}"
+#
+# Look for a specified C++ Standard
+#
+
+# Configure the variable. The help text will appear if the user uses "configure --help".
+
+AC_ARG_VAR([MET_CXX_STANDARD], [Specify the version of the supported C++ standard. Values may be 11, 14, or 17. Default value is 17.])
+
+# Set a default value
+
+if (test -z "$MET_CXX_STANDARD"); then
+ MET_CXX_STANDARD=17
+ AC_MSG_NOTICE([c++17 will be used as the C++ standard])
+elif (test -n "$MET_CXX_STANDARD"); then
+ MET_CXX_STANDARD=${MET_CXX_STANDARD}
+ AC_MSG_NOTICE([MET_CXX_STANDARD will be set])
+fi
+
#
# Look for the Proj library.
#
@@ -1160,7 +1178,7 @@ AM_CONDITIONAL([ENABLE_DEVELOPMENT], [test -n "$MET_DEVELOPMENT"])
CPPFLAGS=$CPPFLAGS' -DMET_BASE="\"$(pkgdatadir)\""'
# Add -std=c++11 to CXXFLAGS
-CXXFLAGS=$CXXFLAGS' -std=c++11'
+CXXFLAGS=$CXXFLAGS' -std=c++'$MET_CXX_STANDARD
# Define other variables for the makefiles
diff --git a/data/Makefile.in b/data/Makefile.in
index 262e9e43cc..43aab3f3d9 100644
--- a/data/Makefile.in
+++ b/data/Makefile.in
@@ -260,6 +260,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/data/climo/Makefile.in b/data/climo/Makefile.in
index c6415ac06c..0030bfbd90 100644
--- a/data/climo/Makefile.in
+++ b/data/climo/Makefile.in
@@ -230,6 +230,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/data/climo/seeps/Makefile.in b/data/climo/seeps/Makefile.in
index 761a867e6b..f40096bb49 100644
--- a/data/climo/seeps/Makefile.in
+++ b/data/climo/seeps/Makefile.in
@@ -202,6 +202,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/data/colortables/Makefile.in b/data/colortables/Makefile.in
index 82b6b46710..05fcc3df5a 100644
--- a/data/colortables/Makefile.in
+++ b/data/colortables/Makefile.in
@@ -260,6 +260,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/data/colortables/NCL_colortables/Makefile.in b/data/colortables/NCL_colortables/Makefile.in
index df79826d8d..1d174cffda 100644
--- a/data/colortables/NCL_colortables/Makefile.in
+++ b/data/colortables/NCL_colortables/Makefile.in
@@ -202,6 +202,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/data/config/ConfigConstants b/data/config/ConfigConstants
index 23210b6c34..15a2a8db4c 100644
--- a/data/config/ConfigConstants
+++ b/data/config/ConfigConstants
@@ -137,6 +137,10 @@ NONE = 1;
COS_LAT = 2;
AREA = 3;
+// Point weight flag settings
+NONE = 1;
+SID = 2;
+
// Duplicate flag settings
NONE = 1;
UNIQUE = 2;
diff --git a/data/config/EnsembleStatConfig_default b/data/config/EnsembleStatConfig_default
index 57f1984807..c4b2463f7d 100644
--- a/data/config/EnsembleStatConfig_default
+++ b/data/config/EnsembleStatConfig_default
@@ -120,6 +120,8 @@ message_type_group_map = [
{ key = "ONLYSF"; val = "ADPSFC,SFCSHP"; }
];
+obtype_as_group_val_flag = FALSE;
+
//
// Ensemble bin sizes
// May be set separately in each "obs.field" entry
@@ -130,7 +132,8 @@ ens_phist_bin_size = 0.05;
////////////////////////////////////////////////////////////////////////////////
//
-// Climatology data
+// Climatology mean data
+// May be set separately in the "fcst" and "obs" dictionaries
//
climo_mean = {
@@ -149,12 +152,17 @@ climo_mean = {
hour_interval = 6;
}
+//
+// Climatology standard deviation data
+// May be set separately in the "fcst" and "obs" dictionaries
+//
climo_stdev = climo_mean;
climo_stdev = {
file_name = [];
}
//
+// Climatology distribution settings
// May be set separately in each "obs.field" entry
//
climo_cdf = {
@@ -260,8 +268,10 @@ rng = {
////////////////////////////////////////////////////////////////////////////////
-grid_weight_flag = NONE;
-output_prefix = "";
-version = "V12.0.0";
+grid_weight_flag = NONE;
+point_weight_flag = NONE;
+
+output_prefix = "";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/data/config/GenEnsProdConfig_default b/data/config/GenEnsProdConfig_default
index e2cb994bba..16a36f9833 100644
--- a/data/config/GenEnsProdConfig_default
+++ b/data/config/GenEnsProdConfig_default
@@ -13,7 +13,6 @@ model = "FCST";
//
// Output description to be written
-// May be set separately in each "obs.field" entry
//
desc = "NA";
@@ -95,7 +94,7 @@ nmep_smooth = {
////////////////////////////////////////////////////////////////////////////////
//
-// Climatology data
+// Climatology mean data
//
climo_mean = {
@@ -114,6 +113,9 @@ climo_mean = {
hour_interval = 6;
}
+//
+// Climatology standard deviation data
+//
climo_stdev = climo_mean;
climo_stdev = {
file_name = [];
diff --git a/data/config/GridStatConfig_default b/data/config/GridStatConfig_default
index 4bec5ecf4b..aa4d9517b5 100644
--- a/data/config/GridStatConfig_default
+++ b/data/config/GridStatConfig_default
@@ -75,7 +75,8 @@ obs = fcst;
////////////////////////////////////////////////////////////////////////////////
//
-// Climatology data
+// Climatology mean data
+// May be set separately in the "fcst" and "obs" dictionaries
//
climo_mean = {
@@ -94,12 +95,17 @@ climo_mean = {
hour_interval = 6;
}
+//
+// Climatology standard deviation data
+// May be set separately in the "fcst" and "obs" dictionaries
+//
climo_stdev = climo_mean;
climo_stdev = {
file_name = [];
}
//
+// Climatology distribution settings
// May be set separately in each "obs.field" entry
//
climo_cdf = {
@@ -265,8 +271,9 @@ nc_pairs_flag = {
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/data/config/Makefile.in b/data/config/Makefile.in
index e88150a766..6ff5c30139 100644
--- a/data/config/Makefile.in
+++ b/data/config/Makefile.in
@@ -202,6 +202,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/data/config/Point2GridConfig_default b/data/config/Point2GridConfig_default
index 8361e871c9..3b8625023d 100644
--- a/data/config/Point2GridConfig_default
+++ b/data/config/Point2GridConfig_default
@@ -22,11 +22,12 @@ obs_window = {
////////////////////////////////////////////////////////////////////////////////
-
//
-// Observation message type
+// Point observation filtering options
//
-message_type = [];
+message_type = [];
+obs_quality_inc = [];
+obs_quality_exc = [];
////////////////////////////////////////////////////////////////////////////////
@@ -72,10 +73,6 @@ var_name_map = [
////////////////////////////////////////////////////////////////////////////////
-quality_mark_thresh = 2;
-
-////////////////////////////////////////////////////////////////////////////////
-
tmp_dir = "/tmp";
version = "V12.0.0";
diff --git a/data/config/PointStatConfig_default b/data/config/PointStatConfig_default
index d4b277c6a3..95665fe017 100644
--- a/data/config/PointStatConfig_default
+++ b/data/config/PointStatConfig_default
@@ -115,10 +115,13 @@ message_type_group_map = [
{ key = "WATERSF"; val = "SFCSHP"; }
];
+obtype_as_group_val_flag = FALSE;
+
////////////////////////////////////////////////////////////////////////////////
//
-// Climatology data
+// Climatology mean data
+// May be set separately in the "fcst" and "obs" dictionaries
//
climo_mean = {
@@ -137,12 +140,17 @@ climo_mean = {
hour_interval = 6;
}
+//
+// Climatology standard deviation data
+// May be set separately in the "fcst" and "obs" dictionaries
+//
climo_stdev = climo_mean;
climo_stdev = {
file_name = [];
}
//
+// Climatology distribution settings
// May be set separately in each "obs.field" entry
//
climo_cdf = {
@@ -299,8 +307,10 @@ output_flag = {
////////////////////////////////////////////////////////////////////////////////
-tmp_dir = "/tmp";
-output_prefix = "";
-version = "V12.0.0";
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/data/config/SeriesAnalysisConfig_default b/data/config/SeriesAnalysisConfig_default
index 2b0cdfa53e..8f76139011 100644
--- a/data/config/SeriesAnalysisConfig_default
+++ b/data/config/SeriesAnalysisConfig_default
@@ -61,7 +61,8 @@ obs = fcst;
////////////////////////////////////////////////////////////////////////////////
//
-// Climatology data
+// Climatology mean data
+// May be set separately in the "fcst" and "obs" dictionaries
//
climo_mean = {
@@ -80,11 +81,19 @@ climo_mean = {
hour_interval = 6;
}
+//
+// Climatology standard deviation data
+// May be set separately in the "fcst" and "obs" dictionaries
+//
climo_stdev = climo_mean;
climo_stdev = {
file_name = [];
}
+//
+// Climatology distribution settings
+// May be set separately in each "obs.field" entry
+//
climo_cdf = {
cdf_bins = 1;
center_bins = FALSE;
diff --git a/data/map/Makefile.in b/data/map/Makefile.in
index a34c9c189f..12e4540ca0 100644
--- a/data/map/Makefile.in
+++ b/data/map/Makefile.in
@@ -260,6 +260,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/data/map/admin_by_country/Makefile.in b/data/map/admin_by_country/Makefile.in
index 3f36ae61fb..825f9576c6 100644
--- a/data/map/admin_by_country/Makefile.in
+++ b/data/map/admin_by_country/Makefile.in
@@ -202,6 +202,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/data/poly/HMT_masks/Makefile.in b/data/poly/HMT_masks/Makefile.in
index 7284d8de7d..305405cc2a 100644
--- a/data/poly/HMT_masks/Makefile.in
+++ b/data/poly/HMT_masks/Makefile.in
@@ -202,6 +202,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/data/poly/Makefile.in b/data/poly/Makefile.in
index 36890cca0a..04906070f5 100644
--- a/data/poly/Makefile.in
+++ b/data/poly/Makefile.in
@@ -260,6 +260,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/data/poly/NCEP_masks/Makefile.in b/data/poly/NCEP_masks/Makefile.in
index acda936d43..4ecea4b0d0 100644
--- a/data/poly/NCEP_masks/Makefile.in
+++ b/data/poly/NCEP_masks/Makefile.in
@@ -202,6 +202,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/data/ps/Makefile.in b/data/ps/Makefile.in
index c017420485..2677c7fb04 100644
--- a/data/ps/Makefile.in
+++ b/data/ps/Makefile.in
@@ -202,6 +202,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/data/table_files/Makefile.in b/data/table_files/Makefile.in
index 08d91b866e..5f82cc573e 100644
--- a/data/table_files/Makefile.in
+++ b/data/table_files/Makefile.in
@@ -202,6 +202,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/data/table_files/met_header_columns_V12.0.txt b/data/table_files/met_header_columns_V12.0.txt
index 299e6cb4d6..3f4785edf5 100644
--- a/data/table_files/met_header_columns_V12.0.txt
+++ b/data/table_files/met_header_columns_V12.0.txt
@@ -5,15 +5,15 @@ 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 : 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 : 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 ODFL ODFH OLFD OLFH OHFD OHFL 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
V12.0 : 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
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]*
@@ -27,9 +27,9 @@ V12.0 : STAT : RELP : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID
V12.0 : 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
V12.0 : 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
V12.0 : 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
-V12.0 : 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 FA_SPEED_BAR OA_SPEED_BAR DIRA_ME DIRA_MAE DIRA_MSE
-V12.0 : 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 DIR_ME DIR_MAE DIR_MSE
-V12.0 : 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 ANOM_CORR ANOM_CORR_NCL ANOM_CORR_NCU ANOM_CORR_BCL ANOM_CORR_BCU ANOM_CORR_UNCNTR ANOM_CORR_UNCNTR_BCL ANOM_CORR_UNCNTR_BCU DIR_ME DIR_ME_BCL DIR_ME_BCU DIR_MAE DIR_MAE_BCL DIR_MAE_BCU DIR_MSE DIR_MSE_BCL DIR_MSE_BCU DIR_RMSE DIR_RMSE_BCL DIR_RMSE_BCU
+V12.0 : 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 FA_SPEED_BAR OA_SPEED_BAR TOTAL_DIR DIRA_ME DIRA_MAE DIRA_MSE
+V12.0 : 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 TOTAL_DIR DIR_ME DIR_MAE DIR_MSE
+V12.0 : 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 ANOM_CORR ANOM_CORR_NCL ANOM_CORR_NCU ANOM_CORR_BCL ANOM_CORR_BCU ANOM_CORR_UNCNTR ANOM_CORR_UNCNTR_BCL ANOM_CORR_UNCNTR_BCU TOTAL_DIR DIR_ME DIR_ME_BCL DIR_ME_BCU DIR_MAE DIR_MAE_BCL DIR_MAE_BCU DIR_MSE DIR_MSE_BCL DIR_MSE_BCU DIR_RMSE DIR_RMSE_BCL DIR_RMSE_BCU
V12.0 : 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 PROB_LEAD PROB_VAL 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
V12.0 : STAT : SSIDX : 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 FCST_MODEL REF_MODEL N_INIT N_TERM N_VLD SS_INDEX
diff --git a/data/tc_data/Makefile.in b/data/tc_data/Makefile.in
index 9ef1261884..eee63e1885 100644
--- a/data/tc_data/Makefile.in
+++ b/data/tc_data/Makefile.in
@@ -202,6 +202,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/docs/Users_Guide/appendixA.rst b/docs/Users_Guide/appendixA.rst
index 83b10c2c32..384422af1f 100644
--- a/docs/Users_Guide/appendixA.rst
+++ b/docs/Users_Guide/appendixA.rst
@@ -121,6 +121,11 @@ Q. How can I understand the number of matched pairs?
in the configuration file. So all of the 1166 observations are rejected
for the same reason.
+ In addition, running point_stat with at least verbosity level 9 (-v 9)
+ will result in a log message being printed to explain why each
+ observation is skipped or retained for each verification task.
+ This level of detail is intended only for debugging purposes.
+
Q. What types of NetCDF files can MET read?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -510,7 +515,7 @@ Q. What is an example of using Grid-Stat with regridding and masking turned on?
This tells Grid-Stat to do verification on the "observation" grid.
Grid-Stat reads the GFS and Stage4 data and then automatically regrids
the GFS data to the Stage4 domain using budget interpolation.
- Use "FCST" to verify the forecast domain. And use either a named
+ Use FCST to verify the forecast domain. And use either a named
grid or a grid specification string to regrid both the forecast and
observation to a common grid. For example, to_grid = "G212"; will
regrid both to NCEP Grid 212 before comparing them.
@@ -1796,8 +1801,11 @@ Q. What are MET's conventions for latitude, longitude, azimuth and bearing angle
.. dropdown:: Answer
- MET considers north latitude and east longitude positive. Latitudes
- have range from :math:`-90^\circ` to :math:`+90^\circ`. Longitudes have
+ MET considers north latitude and east longitude positive. However,
+ internally MET considers east longitude negative so users may encounter
+ DEBUG statements with longitude of a different sign than they provided
+ (e.g. for observation locations or grid metadata). Latitudes have
+ range from :math:`-90^\circ` to :math:`+90^\circ`. Longitudes have
range from :math:`-180^\circ` to :math:`+180^\circ`. Plane angles such
as azimuths and bearing (example: horizontal wind direction) have
range :math:`0^\circ` to :math:`360^\circ` and are measured clockwise
diff --git a/docs/Users_Guide/appendixC.rst b/docs/Users_Guide/appendixC.rst
index 15c3ab5c2d..a6bbb0fe51 100644
--- a/docs/Users_Guide/appendixC.rst
+++ b/docs/Users_Guide/appendixC.rst
@@ -616,23 +616,23 @@ Anomaly Correlation Coefficient
Called "ANOM_CORR" and "ANOM_CORR_UNCNTR" for centered and uncentered versions in CNT output :numref:`table_PS_format_info_CNT`
-The anomaly correlation coefficient is equivalent to the Pearson correlation coefficient, except that both the forecasts and observations are first adjusted according to a climatology value. The anomaly is the difference between the individual forecast or observation and the typical situation, as measured by a climatology (**c**) of some variety. It measures the strength of linear association between the forecast anomalies and observed anomalies. The anomaly correlation coefficient is defined as:
+The anomaly correlation coefficient is equivalent to the Pearson correlation coefficient, except that both the forecasts and observations are first adjusted by subtracting their corresponding climatology value. The anomaly is the difference between the individual forecast or observation and the typical situation, as measured by a forecast climatology (:math:`c_f`) and observation climatology (:math:`c_o`). It measures the strength of linear association between the forecast anomalies and observed anomalies. The anomaly correlation coefficient is defined as:
-.. math:: \text{Anomaly Correlation} = \frac{\sum(f_i - c)(o_i - c)}{\sqrt{\sum(f_i - c)^2} \sqrt{\sum(o_i -c)^2}} .
+.. math:: \text{Anomaly Correlation} = \frac{\sum(f_i - {c_f}_i)(o_i - {c_o}_i)}{\sqrt{\sum(f_i - {c_f}_i)^2} \sqrt{\sum(o_i - {c_o}_i)^2}} .
The centered anomaly correlation coefficient (ANOM_CORR) which includes the mean error is defined as:
.. only:: latex
- .. math:: \text{ANOM\_CORR } = \frac{ \overline{[(f - c) - \overline{(f - c)}][(a - c) - \overline{(a - c)}]}}{ \sqrt{ \overline{( (f - c) - \overline{(f - c)})^2} \overline{( (a - c) - \overline{(a - c)})^2}}}
+ .. math:: \text{ANOM\_CORR } = \frac{ \overline{[(f - c_f) - \overline{(f - c_f)}][(o - c_o) - \overline{(o - c_o)}]}}{ \sqrt{ \overline{( (f - c_f) - \overline{(f - c_f)})^2} \overline{( (o - c_o) - \overline{(o - c_o)})^2}}}
.. only:: html
- .. math:: \text{ANOM_CORR } = \frac{ \overline{[(f - c) - \overline{(f - c)}][(a - c) - \overline{(a - c)}]}}{ \sqrt{ \overline{( (f - c) - \overline{(f - c)})^2} \overline{( (a - c) - \overline{(a - c)})^2}}}
+ .. math:: \text{ANOM_CORR } = \frac{ \overline{[(f - c_f) - \overline{(f - c_f)}][(o - c_o) - \overline{(o - c_o)}]}}{ \sqrt{ \overline{( (f - c_f) - \overline{(f - c_f)})^2} \overline{( (o - c_o) - \overline{(o - c_o)})^2}}}
The uncentered anomaly correlation coefficient (ANOM_CORR_UNCNTR) which does not include the mean errors is defined as:
-.. math:: \text{Anomaly Correlation Raw } = \frac{ \overline{(f - c)(a - c)}}{ \sqrt{\overline{(f - c)^2} \overline{(a - c)^2}}}
+.. math:: \text{Anomaly Correlation Raw } = \frac{ \overline{(f - c_f)(o - c_o)}}{ \sqrt{\overline{(f - c_f)^2} \overline{(o - c_o)^2}}}
Anomaly correlation can range between -1 and 1; a value of 1 indicates perfect correlation and a value of -1 indicates perfect negative correlation. A value of 0 indicates that the forecast and observed anomalies are not correlated.
@@ -650,56 +650,60 @@ The partial sums can be accumulated over individual cases to produce statistics
Scalar L1 and L2 Values
-----------------------
-Called "FBAR", "OBAR", "FOBAR", "FFBAR", and "OOBAR" in SL1L2 output :numref:`table_PS_format_info_SL1L2`
+Called "FBAR", "OBAR", "FOBAR", "FFBAR", "OOBAR", and "MAE" in SL1L2 output :numref:`table_PS_format_info_SL1L2`
These statistics are simply the 1st and 2nd moments of the forecasts, observations and errors:
.. math::
- \text{FBAR} = \text{Mean}(f) = \bar{f} = \frac{1}{n} \sum_{i=1}^n f_i
+ \text{FBAR} = \text{Mean}(f) = \frac{1}{n} \sum_{i=1}^n f_i
- \text{OBAR} = \text{Mean}(o) = \bar{o} = \frac{1}{n} \sum_{i=1}^n o_i
+ \text{OBAR} = \text{Mean}(o) = \frac{1}{n} \sum_{i=1}^n o_i
- \text{FOBAR} = \text{Mean}(fo) = \bar{fo} = \frac{1}{n} \sum_{i=1}^n f_i o_i
+ \text{FOBAR} = \text{Mean}(fo) = \frac{1}{n} \sum_{i=1}^n f_i o_i
- \text{FFBAR} = \text{Mean}(f^2) = \bar{f}^2 = \frac{1}{n} \sum_{i=1}^n f_i^2
+ \text{FFBAR} = \text{Mean}(f^2) = \frac{1}{n} \sum_{i=1}^n f_i^2
- \text{OOBAR} = \text{Mean}(o^2) = \bar{o}^2 = \frac{1}{n} \sum_{i=1}^n o_i^2
+ \text{OOBAR} = \text{Mean}(o^2) = \frac{1}{n} \sum_{i=1}^n o_i^2
+
+ \text{MAE} = \text{Mean}(|f - o|) = \frac{1}{n} \sum_{i=1}^n |f_i - o_i|
Some of the other statistics for continuous forecasts (e.g., RMSE) can be derived from these moments.
Scalar Anomaly L1 and L2 Values
-------------------------------
-Called "FABAR", "OABAR", "FOABAR", "FFABAR", "OOABAR" in SAL1L2 output :numref:`table_PS_format_info_SAL1L2`
+Called "FABAR", "OABAR", "FOABAR", "FFABAR", "OOABAR", and "MAE" in SAL1L2 output :numref:`table_PS_format_info_SAL1L2`
-Computation of these statistics requires a climatological value, c. These statistics are the 1st and 2nd moments of the scalar anomalies. The moments are defined as:
+Computation of these statistics requires climatological values, where :math:`c_f` is the forecast climatology value and :math:`c_o` is the observation climatology value. These statistics are the 1st and 2nd moments of the scalar anomalies. The moments are defined as:
.. math::
- \text{FABAR} = \text{Mean}(f - c) = \bar{f - c} = \frac{1}{n} \sum_{i=1}^n (f_i - c)
+ \text{FABAR} = \text{Mean}(f - c_f) = \frac{1}{n} \sum_{i=1}^n (f_i - {c_f}_i)
+
+ \text{OABAR} = \text{Mean}(o - c_o) = \frac{1}{n} \sum_{i=1}^n (o_i - {c_o}_i)
- \text{OABAR} = \text{Mean}(o - c) = \bar{o - c} = \frac{1}{n} \sum_{i=1}^n (o_i - c)
+ \text{FOABAR} = \text{Mean}[(f - c_f)(o - c_o)] = \frac{1}{n} \sum_{i=1}^n (f_i - {c_f}_i)(o_i - {c_o}_i)
- \text{FOABAR} = \text{Mean}[(f - c)(o - c)] = \bar{(f - c)(o - c)} = \frac{1}{n} \sum_{i=1}^n (f_i - c)(o_i - c)
+ \text{FFABAR} = \text{Mean}[(f - c_f)^2] = \frac{1}{n} \sum_{i=1}^n (f_i - {c_f}_i)^2
- \text{FFABAR} = \text{Mean}[(f - c)^2] = \bar{(f - c)}^2 = \frac{1}{n} \sum_{i=1}^n (f_i - c)^2
+ \text{OOABAR} = \text{Mean}[(o - c_o)^2] = \frac{1}{n} \sum_{i=1}^n (o_i - {c_o}_i)^2
- \text{OOABAR} = \text{Mean}[(o - c)^2] = \bar{(o - c)}^2 = \frac{1}{n} \sum_{i=1}^n (o_i - c)^2
+ \text{MAE} = \text{Mean}(|(f - c_f) - (o - c_o)|) = \frac{1}{n} \sum_{i=1}^n |(f_i - {c_f}_i) - (o_i - {c_o}_i)|
Vector L1 and L2 Values
-----------------------
-Called "UFBAR", "VFBAR", "UOBAR", "VOBAR", "UVFOBAR", "UVFFBAR", "UVOOBAR" in VL1L2 output :numref:`table_PS_format_info_VL1L2`
+Called "UFBAR", "VFBAR", "UOBAR", "VOBAR", "UVFOBAR", "UVFFBAR", and "UVOOBAR" in VL1L2 output :numref:`table_PS_format_info_VL1L2`
-These statistics are the moments for wind vector values, where **u** is the E-W wind component and **v** is the N-S wind component ( :math:`u_f` is the forecast E-W wind component; :math:`u_o` is the observed E-W wind component; :math:`v_f` is the forecast N-S wind component; and :math:`v_o` is the observed N-S wind component). The following measures are computed:
+These statistics are the moments for wind vector values, where :math:`u` is the E-W wind component and :math:`v` is the N-S wind component ( :math:`u_f` is the forecast E-W wind component; :math:`u_o` is the observed E-W wind component; :math:`v_f` is the forecast N-S wind component; and :math:`v_o` is the observed N-S wind component). The following measures are computed:
.. math::
- \text{UFBAR} = \text{Mean}(u_f) = \bar{u}_f = \frac{1}{n} \sum_{i=1}^n u_{fi}
+ \text{UFBAR} = \text{Mean}(u_f) = \frac{1}{n} \sum_{i=1}^n u_{fi}
- \text{VFBAR} = \text{Mean}(v_f) = \bar{v}_f = \frac{1}{n} \sum_{i=1}^n v_{fi}
+ \text{VFBAR} = \text{Mean}(v_f) = \frac{1}{n} \sum_{i=1}^n v_{fi}
- \text{UOBAR} = \text{Mean}(u_o) = \bar{u}_o = \frac{1}{n} \sum_{i=1}^n u_{oi}
+ \text{UOBAR} = \text{Mean}(u_o) = \frac{1}{n} \sum_{i=1}^n u_{oi}
- \text{VOBAR} = \text{Mean}(v_o) = \bar{v}_o = \frac{1}{n} \sum_{i=1}^n v_{oi}
+ \text{VOBAR} = \text{Mean}(v_o) = \frac{1}{n} \sum_{i=1}^n v_{oi}
\text{UVFOBAR} = \text{Mean}(u_f u_o + v_f v_o) = \frac{1}{n} \sum_{i=1}^n (u_{fi} u_{oi} + v_{fi} v_{oi})
@@ -710,25 +714,27 @@ These statistics are the moments for wind vector values, where **u** is the E-W
Vector Anomaly L1 and L2 Values
-------------------------------
-Called "UFABAR", "VFABAR", "UOABAR", "VOABAR", "UVFOABAR", "UVFFABAR", "UVOOABAR" in VAL1L2 output :numref:`table_PS_format_info_VAL1L2`
+Called "UFABAR", "VFABAR", "UOABAR", "VOABAR", "UVFOABAR", "UVFFABAR", and "UVOOABAR" in VAL1L2 output :numref:`table_PS_format_info_VAL1L2`
-These statistics require climatological values for the wind vector components, :math:`u_c \text{ and } v_c`. The measures are defined below:
+These statistics require climatological values for the wind vector components, where :math:`{u_c}_f` and :math:`{v_c}_f` are the forecast climatology vectors and :math:`{u_c}_o` and :math:`{v_c}_o` are the observation climatology vectors. The measures are defined below:
.. math::
- \text{UFABAR} = \text{Mean}(u_f - u_c) = \frac{1}{n} \sum_{i=1}^n (u_{fi} - u_c)
+ \text{UFABAR} = \text{Mean}(u_f - {u_c}_f) = \frac{1}{n} \sum_{i=1}^n ({u_f}_i - {{u_c}_f}_i)
- \text{VFBAR} = \text{Mean}(v_f - v_c) = \frac{1}{n} \sum_{i=1}^n (v_{fi} - v_c)
+ \text{VFBAR} = \text{Mean}(v_f - {v_c}_f) = \frac{1}{n} \sum_{i=1}^n ({v_f}_i - {{v_c}_f}_i)
- \text{UOABAR} = \text{Mean}(u_o - u_c) = \frac{1}{n} \sum_{i=1}^n (u_{oi} - u_c)
+ \text{UOABAR} = \text{Mean}(u_o - {u_c}_o) = \frac{1}{n} \sum_{i=1}^n ({u_o}_i - {{u_c}_o}_i)
- \text{VOABAR} = \text{Mean}(v_o - v_c) = \frac{1}{n} \sum_{i=1}^n (v_{oi} - v_c)
+ \text{VOABAR} = \text{Mean}(v_o - {v_c}_o) = \frac{1}{n} \sum_{i=1}^n ({v_o}_i - {{v_c}_o}_i)
- \text{UVFOABAR} &= \text{Mean}[(u_f - u_c)(u_o - u_c) + (v_f - v_c)(v_o - v_c)] \\
- &= \frac{1}{n} \sum_{i=1}^n (u_{fi} - u_c) + (u_{oi} - u_c) + (v_{fi} - v_c)(v_{oi} - v_c)
+ \text{UVFOABAR} &= \text{Mean}[(u_f - {u_c}_f)(u_o - {u_c}_o) + (v_f - {v_c}_f)(v_o - {v_c}_o)] \\
+ &= \frac{1}{n} \sum_{i=1}^n ({u_f}_i - {{u_c}_f}_i) + ({u_o}_i - {{u_c}_o}_i) + ({v_f}_i - {{v_c}_f}_i)({v_o}_i - {{v_c}_o}_i)
- \text{UVFFABAR} = \text{Mean}[(u_f - u_c)^2 + (v_f - v_c)^2] = \frac{1}{n} \sum_{i=1}^n ((u_{fi} - u_c)^2 + (v_{fi} - v_c)^2)
+ \text{UVFFABAR} &= \text{Mean}[(u_f - {u_c}_f)^2 + (v_f - {v_c}_f)^2] \\
+ &= \frac{1}{n} \sum_{i=1}^n (({u_f}_i - {{u_c}_f}_i)^2 + ({v_f}_i - {{v_c}_f}_i)^2)
- \text{UVOOABAR} = \text{Mean}[(u_o - u_c)^2 + (v_o - v_c)^2] = \frac{1}{n} \sum_{i=1}^n ((u_{oi} - u_c)^2 + (v_{oi} - v_c)^2)
+ \text{UVOOABAR} &= \text{Mean}[(u_o - {u_c}_o)^2 + (v_o - {v_c}_o)^2] \\
+ &= \frac{1}{n} \sum_{i=1}^n (({u_o}_i - {{u_c}_o}_i)^2 + ({v_o}_i - {{v_c}_o}_i)^2)
Gradient Values
---------------
diff --git a/docs/Users_Guide/appendixF.rst b/docs/Users_Guide/appendixF.rst
index dc81f0cd96..17628c7ee5 100644
--- a/docs/Users_Guide/appendixF.rst
+++ b/docs/Users_Guide/appendixF.rst
@@ -355,7 +355,7 @@ The first argument for the Plot-Data-Plane tool is the gridded data file to be r
'level': 'Surface', 'units': 'None',
'init': '20050807_000000', 'valid': '20050807_120000',
'lead': '120000', 'accum': '120000'
- 'grid': {...} }
+ 'grid': { ... } }
DEBUG 1: Creating postscript file: fcst.ps
Special Case for Ensemble-Stat, Series-Analysis, and MTD
@@ -368,7 +368,7 @@ The Ensemble-Stat, Series-Analysis, MTD and Gen-Ens-Prod tools all have the abil
gen_ens_prod ens1.nc ens2.nc ens3.nc ens4.nc -out ens_prod.nc -config GenEnsProd_config
-In this case, a user is passing 4 ensemble members to Gen-Ens-Prod to be evaluated, and each member is in a separate file. If a user wishes to use Python embedding to process the ensemble input files, then the same exact command is used however special modifications inside the GenEnsProd_config file are needed. In the config file dictionary, the user must set the **file_type** entry to either **PYTHON_NUMPY** or **PYTHON_XARRAY** to activate the Python embedding for these tools. Then, in the **name** entry of the config file dictionaries for the forecast or observation data, the user must list the **full path** to the Python script to be run. However, in the Python command, replace the name of the input gridded data file to the Python script with the constant string **MET_PYTHON_INPUT_ARG**. When looping over all of the input files, the MET tools will replace that constant **MET_PYTHON_INPUT_ARG** with the path to the input file currently being processed and optionally, any command line arguments for the Python script. Here is what this looks like in the GenEnsProd_config file for the above example:
+In this case, a user is passing 4 ensemble members to Gen-Ens-Prod to be evaluated, and each member is in a separate file. If a user wishes to use Python embedding to process the ensemble input files, then the same exact command is used; however special modifications inside the GenEnsProd_config file are needed. In the config file dictionary, the user must set the **file_type** entry to either **PYTHON_NUMPY** or **PYTHON_XARRAY** to activate the Python embedding for these tools. Then, in the **name** entry of the config file dictionaries for the forecast or observation data, the user must list the **full path** to the Python script to be run. However, in the Python command, replace the name of the input gridded data file to the Python script with the constant string **MET_PYTHON_INPUT_ARG**. When looping over all of the input files, the MET tools will replace that constant **MET_PYTHON_INPUT_ARG** with the path to the input file currently being processed and optionally, any command line arguments for the Python script. Here is what this looks like in the GenEnsProd_config file for the above example:
.. code-block::
:caption: Gen-Ens-Prod MET_PYTHON_INPUT_ARG Config
diff --git a/docs/Users_Guide/config_options.rst b/docs/Users_Guide/config_options.rst
index fb6e4f47eb..b85b2d233b 100644
--- a/docs/Users_Guide/config_options.rst
+++ b/docs/Users_Guide/config_options.rst
@@ -21,86 +21,92 @@ which are dictionaries themselves.
The configuration file language supports the following data types:
* Dictionary:
-
+
* Grouping of one or more entries enclosed by curly braces {}.
* Array:
-
+
* List of one or more entries enclosed by square braces [].
-
+
* Array elements are separated by commas.
* String:
-
+
* A character string enclosed by double quotation marks "".
-
+
* Integer:
-
+
* A numeric integer value.
-
+
* Float:
-
+
* A numeric float value.
-
+
* Boolean:
-
+
* A boolean value (TRUE or FALSE).
-
+
* Threshold:
-
+
* A threshold type (<, <=, ==, !-, >=, or >) followed by a numeric value.
-
+
* The threshold type may also be specified using two letter abbreviations
(lt, le, eq, ne, ge, gt).
-
+
* Multiple thresholds may be combined by specifying the logic type of AND
(&&) or OR (||). For example, ">=5&&<=10" defines the numbers between 5
and 10 and "==1||==2" defines numbers exactly equal to 1 or 2.
-
+
* Percentile Thresholds:
* A threshold type (<, <=, ==, !=, >=, or >), followed by a percentile
- type description (SFP, SOP, SCP, USP, CDP, or FBIAS), followed by a
- numeric value, typically between 0 and 100.
+ type description (SFP, SOP, SFCP, SOCP, USP, FCDP, OCDP, or FBIAS),
+ followed by a numeric value, typically between 0 and 100.
* Note that the two letter threshold type abbreviations (lt, le, eq, ne,
ge, gt) are not supported for percentile thresholds.
-
+
* Thresholds may be defined as percentiles of the data being processed in
several places:
-
+
* In Point-Stat and Grid-Stat when setting "cat_thresh", "wind_thresh"
and "cnt_thresh".
-
+
* In Wavelet-Stat when setting "cat_thresh".
-
+
* In MODE when setting "conv_thresh" and "merge_thresh".
-
+
* In Ensemble-Stat when setting "obs_thresh".
-
+
* When using the "censor_thresh" config option.
-
+
* In the Stat-Analysis "-out_fcst_thresh" and "-out_obs_thresh" job
command options.
-
+
* In the Gen-Vx-Mask "-thresh" command line option.
-
+
* The following percentile threshold types are supported:
-
- * "SFP" for a percentile of the sample forecast values.
+
+ * SFP for a percentile of the sample forecast values.
e.g. ">SFP33.3" means greater than the 33.3-rd forecast percentile.
-
- * "SOP" for a percentile of the sample observation values.
+
+ * SOP for a percentile of the sample observation values.
e.g. ">SOP75" means greater than the 75-th observation percentile.
-
- * "SCP" for a percentile of the sample climatology values.
- e.g. ">SCP90" means greater than the 90-th climatology percentile.
-
- * "USP" for a user-specified percentile threshold.
+
+ * SFCP for a percentile of the sample forecast climatology values.
+ e.g. ">SFCP90" means greater than the 90-th forecast climatology
+ percentile.
+
+ * SOCP for a percentile of the sample observation climatology values.
+ e.g. ">SOCP90" means greater than the 90-th observation climatology
+ percentile. For backward compatibility, the "SCP" threshold type
+ is processed the same as "SOCP".
+
+ * USP for a user-specified percentile threshold.
e.g. "5.0 threshold to
the observations and then chooses a forecast threshold which results in
a frequency bias of 1. The frequency bias can be any float value > 0.0.
-
- * "CDP" for climatological distribution percentile thresholds.
- These thresholds require that the climatological mean and standard
- deviation be defined using the climo_mean and climo_stdev config file
- options, respectively. The categorical (cat_thresh), conditional
- (cnt_thresh), or wind speed (wind_thresh) thresholds are defined
- relative to the climatological distribution at each point. Therefore,
- the actual numeric threshold applied can change for each point.
- e.g. ">CDP50" means greater than the 50-th percentile of the
+
+ * FCDP for forecast climatological distribution percentile thresholds.
+ These thresholds require that the forecast climatological mean and
+ standard deviation be defined using the "climo_mean" and "climo_stdev"
+ config file options, respectively. The categorical (cat_thresh),
+ conditional (cnt_thresh), or wind speed (wind_thresh) thresholds can
+ be defined relative to the climatological distribution at each point.
+ Therefore, the actual numeric threshold applied can change for each point.
+ e.g. ">FCDP50" means greater than the 50-th percentile of the
climatological distribution for each point.
-
- * When percentile thresholds of type SFP, SOP, SCP, or CDP are requested
- for continuous filtering thresholds (cnt_thresh), wind speed thresholds
- (wind_thresh), or observation filtering thresholds (obs_thresh in
- ensemble_stat), the following special logic is applied. Percentile
+
+ * OCDP for observation climatological distribution percentile thresholds.
+ The "OCDP" threshold logic matches the "FCDP" logic described above.
+ However these thresholds are defined using the observation climatological
+ mean and standard deviation rather than the forecast climatological data.
+ For backward compatibility, the "CDP" threshold type is processed the
+ same as "OCDP".
+
+ * When percentile thresholds of type SFP, SOP, SFCP, SOCP, FCDP, or OCDP are
+ requested for continuous filtering thresholds (cnt_thresh), wind speed
+ thresholds (wind_thresh), or observation filtering thresholds (obs_thresh
+ in ensemble_stat), the following special logic is applied. Percentile
thresholds of type equality are automatically converted to percentile
bins which span the values from 0 to 100.
- For example, "==CDP25" is automatically expanded to 4 percentile bins:
- >=CDP0&&=CDP25&&=CDP50&&=CDP75&&<=CDP100
-
- * When sample percentile thresholds of type SFP, SOP, SCP, or FBIAS are
- requested, MET recomputes the actual percentile that the threshold
+ For example, ==OCDP25 is automatically expanded to 4 percentile bins:
+ >=OCDP0&&=OCDP25&&=OCDP50&&=OCDP75&&<=OCDP100
+
+ * When sample percentile thresholds of type SFP, SOP, SFCP, SOCP, or FBIAS
+ are requested, MET recomputes the actual percentile that the threshold
represents. If the requested percentile and actual percentile differ by
more than 5%, a warning message is printed. This may occur when the
sample size is small or the data values are not truly continuous.
-
- * When percentile thresholds of type SFP, SOP, SCP, or USP are used, the
- actual threshold value is appended to the FCST_THRESH and OBS_THRESH
+
+ * When percentile thresholds of type SFP, SOP, SFCP, SOCP, or USP are used,
+ the actual threshold value is appended to the FCST_THRESH and OBS_THRESH
output columns. For example, if the 90-th percentile of the current set
of forecast values is 3.5, then the requested threshold "<=SFP90" is
written to the output as "<=SFP90(3.5)".
-
+
* When parsing FCST_THRESH and OBS_THRESH columns, the Stat-Analysis tool
ignores the actual percentile values listed in parentheses.
-
+
+.. 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.
+
+ 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.
+
* Piecewise-Linear Function (currently used only by MODE):
-
+
* A list of (x, y) points enclosed in parenthesis ().
-
+
* The (x, y) points are *NOT* separated by commas.
-
+
* User-defined function of a single variable:
-
+
* Left side is a function name followed by variable name in parenthesis.
-
+
* Right side is an equation which includes basic math functions (+,-,*,/),
built-in functions (listed below), or other user-defined functions.
-
+
* Built-in functions include:
sin, cos, tan, sind, cosd, tand, asin, acos, atan, asind, acosd, atand,
atan2, atan2d, arg, argd, log, exp, log10, exp10, sqrt, abs, min, max,
@@ -299,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
--------
@@ -324,14 +351,14 @@ values and/or define observation bias corrections.
When processing point and gridded observations, Ensemble-Stat searches the table
to find the entry defining the observation error information. The table
consists of 15 columns and includes a header row defining each column. The
-special string "ALL" is interpreted as a wildcard in these files. The first 6
+special string ALL is interpreted as a wildcard in these files. The first 6
columns (OBS_VAR, MESSAGE_TYPE, PB_REPORT_TYPE, IN_REPORT_TYPE, INSTRUMENT_TYPE,
and STATION_ID) may be set to a comma-separated list of strings to be matched.
In addition, the strings in the OBS_VAR column are interpreted as regular
expressions when searching for a match. For example, setting the OBS_VAR column
to 'APCP_[0-9]+' would match observations for both APCP_03 and APCP_24. The
-HGT_RANGE, VAL_RANGE, and PRS_RANGE columns should either be set to "ALL" or
-"BEG,END" where BEG and END specify the range of values to be used. The
+HGT_RANGE, VAL_RANGE, and PRS_RANGE columns should either be set to ALL or
+BEG,END where BEG and END specify the range of values to be used. The
INST_BIAS_SCALE and INST_BIAS_OFFSET columns define instrument bias adjustments
which are applied to the observation values. The DIST_TYPE and DIST_PARM
columns define the distribution from which random perturbations should be drawn
@@ -339,7 +366,7 @@ and applied to the ensemble member values. See the obs_error description below
for details on the supported error distributions. The last two columns, MIN and
MAX, define the bounds for the valid range of the bias-corrected observation
values and randomly perturbed ensemble member values. Values less than MIN are
-reset to the mimimum value and values greater than MAX are reset to the maximum
+reset to the minimum value and values greater than MAX are reset to the maximum
value. A value of NA indicates that the variable is unbounded.
MET_GRIB_TABLES
@@ -357,7 +384,7 @@ At runtime, the MET tools read default GRIB tables from the installed
*share/met/table_files* directory, and their file formats are described below:
GRIB1 table files begin with "grib1" prefix and end with a ".txt" suffix.
-The first line of the file must contain "GRIB1".
+The first line of the file must contain GRIB1.
The following lines consist of 4 integers followed by 3 strings:
| Column 1: GRIB code (e.g. 11 for temperature)
@@ -374,10 +401,10 @@ References:
| `Office Note 388 GRIB1 `_
| `A Guide to the Code Form FM 92-IX Ext. GRIB Edition 1 `_
-|
+|
GRIB2 table files begin with "grib2" prefix and end with a ".txt" suffix.
-The first line of the file must contain "GRIB2".
+The first line of the file must contain GRIB2.
The following lines consist of 8 integers followed by 3 strings.
| Column 1: Section 0 Discipline
@@ -391,7 +418,7 @@ The following lines consist of 8 integers followed by 3 strings.
| Column 9: variable name
| Column 10: variable description
| Column 11: units
-|
+|
References:
@@ -475,7 +502,7 @@ parallelization:
* :code:`grid_ens_prod`
* :code:`mode`
-**Thread Binding**
+**Thread Binding**
It is normally beneficial to bind threads to particular cores, sometimes called
*affinitization*. There are a few reasons for this, but at the very least it
@@ -591,7 +618,7 @@ writing of NetCDF files within MET significantly.
output_precision
----------------
-
+
The "output_precision" entry in ConfigConstants defines the precision
(number of significant decimal places) to be written to the ASCII output
files. Setting this option in the config file of one of the tools will
@@ -605,7 +632,7 @@ override the default value set in ConfigConstants.
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.
@@ -633,16 +660,35 @@ used.
.. code-block:: none
- mesage_type_group_map = [
+ 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"; }
];
+obtype_as_group_val_flag
+------------------------
+
+The "obtype_as_group_val_flag" entry is a boolean that controls how the
+OBTYPE header column is populated for message type groups defined in
+"message_type_group_map". If set to TRUE and when writing matched pair
+line types (MPR, SEEPS_MPR, and ORANK), write OBTYPE as the group map
+*value*, i.e. the input message type for each individual observation.
+If set to FALSE (default) and for all other line types, write OBTYPE
+as the group map key, i.e. the name of the message type group.
+
+For example, if FALSE, write the OBTYPE column in the MPR line type
+as the "ANYAIR" message type group name. If TRUE, write OBTYPE as "AIRCAR"
+or "AIRCFT", based on the input message type of each point observation.
+
+.. code-block:: none
+
+ obtyp_as_group_val_flag = FALSE;
+
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
to output message types. This mapping is applied in ASCII2NC when
@@ -666,7 +712,7 @@ types.
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
@@ -679,7 +725,7 @@ e.g. model = "GFS";
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
@@ -709,10 +755,10 @@ the configuration file obtype value is written.
obtype = "ANALYS";
.. _regrid:
-
+
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:
@@ -720,17 +766,17 @@ using the following entries:
* The "to_grid" entry may be set to NONE, FCST, OBS, a named grid, the path
to a gridded data file defining the grid, or an explicit grid specification
string.
-
+
* to_grid = NONE; To disable regridding.
-
+
* to_grid = FCST; To regrid observations to the forecast grid.
-
+
* to_grid = OBS; To regrid forecasts to the observation grid.
-
+
* to_grid = "G218"; To regrid both to a named grid.
-
+
* to_grid = "path"; To regrid both to a grid defined by a file.
-
+
* to_grid = "spec"; To define a grid specification string, as
described in :ref:`appendixB`.
@@ -741,42 +787,53 @@ using the following entries:
write bad data for the current point.
* The "method" entry defines the regridding method to be used.
-
+
* Valid regridding methods:
-
+
* MIN for the minimum value
-
+
* MAX for the maximum value
-
+
* MEDIAN for the median value
-
+
* UW_MEAN for the unweighted average value
-
+
* DW_MEAN for the distance-weighted average value (weight =
distance^-2)
-
+
* AW_MEAN for an area-weighted mean when regridding from
high to low resolution grids (width = 1)
-
+
* LS_FIT for a least-squares fit
-
+
* BILIN for bilinear interpolation (width = 2)
-
+
* NEAREST for the nearest grid point (width = 1)
-
+
* BUDGET for the mass-conserving budget interpolation
-
+
+ * The budget interpolation method is often used for precipitation
+ in order to roughly conserve global averages. However it is
+ computationally intensive and relatively slow. To compute the
+ interpolated value for each point of the target grid, a higher
+ resolution 5x5 mesh with 0.2 grid box spacing is centered on
+ the point and bilinear interpolation is performed for each
+ of those 25 lat/lon locations. The budget interpolation value
+ is computed as the average of those 25 bilinear interpolation
+ values, assuming enough valid data is present to meet the
+ "vld_thresh" threshold.
+
* FORCE to compare gridded data directly with no interpolation
as long as the grid x and y dimensions match.
-
+
* UPPER_LEFT for the upper left grid point (width = 1)
-
+
* UPPER_RIGHT for the upper right grid point (width = 1)
-
+
* LOWER_RIGHT for the lower right grid point (width = 1)
-
+
* LOWER_LEFT for the lower left grid point (width = 1)
-
+
* MAXGAUSS to compute the maximum value in the neighborhood
and apply a Gaussian smoother to the result
@@ -786,7 +843,7 @@ using the following entries:
- width = 4; To regrid using a 4x4 box or circle with diameter 4.
* The "shape" entry defines the shape of the neighborhood.
- Valid values are "SQUARE" or "CIRCLE"
+ Valid values are SQUARE or CIRCLE
* The "gaussian_dx" entry specifies a delta distance for Gaussian
smoothing. The default is 81.271. Ignored if not Gaussian method.
@@ -804,7 +861,7 @@ using the following entries:
regridding step. The conversion operation is applied first, followed by
the censoring operation. Note that these operations are limited in scope.
They are only applied if defined within the regrid dictionary itself.
- Settings defined at higher levels of config file context are not applied.
+ Settings defined at higher levels of config file context are not applied.
.. code-block:: none
@@ -823,7 +880,7 @@ using the following entries:
fcst
----
-
+
The "fcst" entry is a dictionary containing information about the field(s)
to be verified. This dictionary may include the following entries:
@@ -999,16 +1056,16 @@ to be verified. This dictionary may include the following entries:
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 "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)" ];
@@ -1106,103 +1163,103 @@ File-format specific settings for the "field" entry:
* `GRIB1 Product Definition Section `_
* `GRIB2 Product Definition Section `_
-
+
* The "level" entry specifies a level type and value:
-
+
* ANNN for accumulation interval NNN
-
+
* ZNNN for vertical level NNN
-
+
* ZNNN-NNN for a range of vertical levels
-
+
* PNNN for pressure level NNN in hPa
-
+
* PNNN-NNN for a range of pressure levels in hPa
-
+
* LNNN for a generic level type
-
+
* RNNN for a specific GRIB record number
-
+
* The "GRIB_lvl_typ" entry is an integer specifying the level type.
-
+
* The "GRIB_lvl_val1" and "GRIB_lvl_val2" entries are floats specifying
the first and second level values.
-
+
* The "GRIB_ens" entry is a string specifying NCEP's usage of the
extended PDS for ensembles. Set to "hi_res_ctl", "low_res_ctl",
"+n", or "-n", for the n-th ensemble member.
-
- * The "GRIB1_ptv" entry is an integer specifying the GRIB1 parameter
+
+ * The GRIB1_ptv entry is an integer specifying the GRIB1 parameter
table version number.
-
- * The "GRIB1_code" entry is an integer specifying the GRIB1 code (wgrib
+
+ * The GRIB1_code entry is an integer specifying the GRIB1 code (wgrib
kpds5 value).
-
- * The "GRIB1_center" is an integer specifying the originating center.
-
- * The "GRIB1_subcenter" is an integer specifying the originating
+
+ * The GRIB1_center is an integer specifying the originating center.
+
+ * The GRIB1_subcenter is an integer specifying the originating
subcenter.
-
- * The "GRIB1_tri" is an integer specifying the time range indicator.
-
- * The "GRIB2_mtab" is an integer specifying the master table number.
-
- * The "GRIB2_ltab" is an integer specifying the local table number.
-
- * The "GRIB2_disc" is an integer specifying the GRIB2 discipline code.
-
- * The "GRIB2_parm_cat" is an integer specifying the parameter category
+
+ * The GRIB1_tri is an integer specifying the time range indicator.
+
+ * The GRIB2_mtab is an integer specifying the master table number.
+
+ * The GRIB2_ltab is an integer specifying the local table number.
+
+ * The GRIB2_disc is an integer specifying the GRIB2 discipline code.
+
+ * The GRIB2_parm_cat is an integer specifying the parameter category
code.
-
- * The "GRIB2_parm" is an integer specifying the parameter code.
-
- * The "GRIB2_pdt" is an integer specifying the product definition
+
+ * The GRIB2_parm is an integer specifying the parameter code.
+
+ * The GRIB2_pdt is an integer specifying the product definition
template (Table 4.0).
-
- * The "GRIB2_process" is an integer specifying the generating process
+
+ * The GRIB2_process is an integer specifying the generating process
(Table 4.3).
-
- * The "GRIB2_cntr" is an integer specifying the originating center.
-
- * The "GRIB2_ens_type" is an integer specifying the ensemble type
+
+ * The GRIB2_cntr is an integer specifying the originating center.
+
+ * The GRIB2_ens_type is an integer specifying the ensemble type
(Table 4.6).
-
- * The "GRIB2_der_type" is an integer specifying the derived product
+
+ * The GRIB2_der_type is an integer specifying the derived product
type (Table 4.7).
-
- * The "GRIB2_stat_type" is an integer specifying the statistical
+
+ * The GRIB2_stat_type is an integer specifying the statistical
processing type (Table 4.10).
- * The "GRIB2_perc_val" is an integer specifying the requested percentile
+ * The GRIB2_perc_val is an integer specifying the requested percentile
value (0 to 100) to be used. This applies only to GRIB2 product
definition templates 4.6 and 4.10.
- * The "GRIB2_aerosol_type" is an integer specifying the aerosol type
- (Table 4.233). This applies only to GRIB2 product defintion templates
+ * The GRIB2_aerosol_type is an integer specifying the aerosol type
+ (Table 4.233). This applies only to GRIB2 product definition templates
4.46 and 4.48.
- * The "GRIB2_aerosol_interval_type" is an integer specifying the aerosol
- size interval (Table 4.91). This applies only to GRIB2 product defintion
+ * The GRIB2_aerosol_interval_type is an integer specifying the aerosol
+ size interval (Table 4.91). This applies only to GRIB2 product definition
templates 4.46 and 4.48.
- * The "GRIB2_aerosol_size_lower" and "GRIB2_aerosol_size_upper" are doubles
+ * The GRIB2_aerosol_size_lower and "GRIB2_aerosol_size_upper" are doubles
specifying the endpoints of the aerosol size interval. These applies only
to GRIB2 product defintion templates 4.46 and 4.48.
- * The "GRIB2_ipdtmpl_index" and "GRIB2_ipdtmpl_val" entries are arrays
+ * The GRIB2_ipdtmpl_index and GRIB2_ipdtmpl_val entries are arrays
of integers which specify the product description template values to
be used. The indices are 0-based. For example, use the following to
request a GRIB2 record whose 9-th and 27-th product description
template values are 1 and 2, respectively:
GRIB2_ipdtmpl_index=[8, 26]; GRIB2_ipdtmpl_val=[1, 2];
-
+
* NetCDF (from MET tools, CF-compliant, p_interp, and wrf_interp):
-
+
* The "name" entry specifies the NetCDF variable name.
-
+
* The "level" entry specifies the dimensions to be used:
-
+
* (i,...,j,*,*) for a single field, where i,...,j specifies fixed
dimension values and *,* specifies the two dimensions for the
gridded field. @ specifies the vertical level value or time value
@@ -1233,10 +1290,10 @@ File-format specific settings for the "field" entry:
];
* Python (using PYTHON_NUMPY or PYTHON_XARRAY):
-
+
* The Python interface for MET is described in Appendix F of the MET
User's Guide.
-
+
* Two methods for specifying the Python command and input file name
are supported. For tools which read a single gridded forecast and/or
observation file, both options work. However, only the second option
@@ -1244,13 +1301,13 @@ File-format specific settings for the "field" entry:
as Ensemble-Stat, Series-Analysis, and MTD.
Option 1:
-
+
* On the command line, replace the path to the input gridded data
file with the constant string PYTHON_NUMPY or PYTHON_XARRAY.
-
+
* Specify the configuration "name" entry as the Python command to be
executed to read the data.
-
+
* The "level" entry is not required for Python.
For example:
@@ -1265,14 +1322,14 @@ File-format specific settings for the "field" entry:
* On the command line, leave the path to the input gridded data
as is.
-
+
* Set the configuration "file_type" entry to the constant
PYTHON_NUMPY or PYTHON_XARRAY.
-
+
* Specify the configuration "name" entry as the Python command to be
executed to read the data, but replace the input gridded data file
with the constant MET_PYTHON_INPUT_ARG.
-
+
* The "level" entry is not required for Python.
For example:
@@ -1299,7 +1356,7 @@ File-format specific settings for the "field" entry:
init_time = "20120619_12";
valid_time = "20120620_00";
lead_time = "12";
-
+
field = [
{
name = "APCP";
@@ -1415,16 +1472,16 @@ or
that filtering by station ID may also be accomplished using the "mask.sid"
option. However, when using the "sid_inc" option, statistics are reported
separately for each masking region.
-
+
* The "sid_exc" entry is an array of station ID groups indicating which
station ID's should be excluded from the verification task.
-
+
* Each element in the "sid_inc" and "sid_exc" arrays is either the name of
a single station ID or the full path to a station ID group file name.
A station ID group file consists of a name for the group followed by a
list of station ID's. All of the station ID's indicated will be concatenated
into one long list of station ID's to be included or excluded.
-
+
* As with "message_type" above, the "sid_inc" and "sid_exc" settings can be
placed in the in the "field" array element to control which station ID's
are included or excluded for each verification task.
@@ -1435,10 +1492,13 @@ or
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.
+Grid-Stat, Point-Stat, Ensemble-Stat, and Series-Analysis tools. It can be
+set inside the "fcst" and "obs" dictionaries to specify separate forecast and
+observation climatology data or once at the top-level configuration file
+context to use the same data for both. It consists of several entries defining
+the climatology file names and fields to be used.
* The "file_names" entry specifies one or more file names containing
the gridded climatology data to be used.
@@ -1455,7 +1515,7 @@ of several entires defining the climatology file names and fields to be used.
* The "time_interp_method" entry specifies how the climatology data should
be interpolated in time to the forecast valid time:
-
+
* NEAREST for data closest in time
* UW_MEAN for average of data before and after
* DW_MEAN for linear interpolation in time of data before and after
@@ -1469,22 +1529,25 @@ of several entires defining 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
climo_mean = {
-
+
file_name = [ "/path/to/climatological/mean/files" ];
field = [];
-
+
regrid = {
method = NEAREST;
width = 1;
vld_thresh = 0.5;
}
-
+
time_interp_method = DW_MEAN;
day_interval = 31;
hour_interval = 6;
@@ -1492,22 +1555,25 @@ of several entires defining the climatology file names and fields to be used.
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
-distribution for each grid point, assuming normality. These climatological
-distributions are used in two ways:
+tools. It can be set inside the "fcst" and "obs" dictionaries to specify
+separate forecast and observation climatology data or once at the top-level
+configuration file context to use the same data for both. The "climo_mean" and
+"climo_stdev" data define the climatological distribution for each grid point,
+assuming normality. These climatological distributions are used in two ways:
(1)
- To define climatological distribution percentile (CDP) thresholds which
- can be used as categorical (cat_thresh), continuous (cnt_thresh), or wind
- speed (wind_thresh) thresholds.
+ To define climatological distribution percentiles thresholds (FCDP and
+ OCDP) which can be used as categorical (cat_thresh), continuous (cnt_thresh),
+ or wind speed (wind_thresh) thresholds.
(2)
To subset matched pairs into climatological bins based on where the
- observation value falls within the climatological distribution. See the
- "climo_cdf" dictionary.
+ observation value falls within the observation climatological distribution.
+ See the "climo_cdf" dictionary. Note that only the observation climatology
+ data is used for this purpose, not the forecast climatology data.
This dictionary is identical to the "climo_mean" dictionary described above
but points to files containing climatological standard deviation values
@@ -1521,14 +1587,36 @@ 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
---------
-
-The "climo_cdf" dictionary specifies how the the climatological mean
-("climo_mean") and standard deviation ("climo_stdev") data are used to
+
+The "climo_cdf" dictionary specifies how the the observation climatological
+mean ("climo_mean") and standard deviation ("climo_stdev") data are used to
evaluate model performance relative to where the observation value falls
-within the climatological distribution. This dictionary consists of the
-following entries:
+within the observation climatological distribution. It can be set inside the
+"obs" dictionary or at the top-level configuration file context. This
+dictionary consists of the following entries:
(1)
The "cdf_bins" entry defines the climatological bins either as an integer
@@ -1542,11 +1630,11 @@ following entries:
(4) The "direct_prob" entry may be set to TRUE or FALSE.
-MET uses the climatological mean and standard deviation to construct a normal
-PDF at each observation location. The total area under the PDF is 1, and the
-climatological CDF value is computed as the area of the PDF to the left of
-the observation value. Since the CDF is a value between 0 and 1, the CDF
-bins must span that same range.
+MET uses the observation climatological mean and standard deviation to
+construct a normal PDF at each observation location. The total area under the
+PDF is 1, and the climatological CDF value is computed as the area of the PDF
+to the left of the observation value. Since the CDF is a value between 0 and 1,
+the CDF bins must span that same range.
When "cdf_bins" is set to an array of floats, they explicitly define the
climatological bins. The array must begin with 0.0 and end with 1.0.
@@ -1590,20 +1678,21 @@ all pairs into a single climatological bin.
climate_data
------------
-
-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
-probabilities should be derived.
-When "climo_mean" is set to a probability field with a range of [0, 1] and
-"climo_stdev" is unset, the MET tools use the "climo_mean" probability values
-directly to compute Brier Skill Score (BSS).
+When specifying observation climatology data to evaluate probability
+forecasts, either supply a probabilistic observation "climo_mean" field or
+non-probabilistic "climo_mean" and "climo_stdev" fields from which a normal
+approximation of the observation climatological probabilities should be
+derived.
-When "climo_mean" and "climo_stdev" are both set to non-probability fields,
-the MET tools use the mean, standard deviation, and observation event
-threshold to derive a normal approximation of the climatological
-probabilities.
+When the observation "climo_mean" is set to a probability field with a range
+of [0, 1] and "climo_stdev" is unset, the MET tools use the "climo_mean"
+probability values directly to compute Brier Skill Score (BSS).
+
+When the observation "climo_mean" and "climo_stdev" are both set to
+non-probability fields, the MET tools use the mean, standard deviation, and
+observation event threshold to derive a normal approximation of the
+observation climatological probabilities.
The "direct_prob" option controls the derivation logic. When "direct_prob" is
true, the climatological probability is computed directly from the
@@ -1626,19 +1715,39 @@ The default setting is >=0.1&&<=0.85.
seeps_p1_thresh = >=0.1&&<=0.85;
+seeps_grid_climo_name
+---------------------
+
+The "seeps_grid_climo_name" option sets the location and the filename of the SEEPS climo file for the gridded data.
+The default setting is the empty string. It should be configured by the user. It can be overridden by the environment variable, MET_SEEPS_GRID_CLIMO_NAME.
+
+.. code-block:: none
+
+ seeps_grid_climo_name = "";
+
+seeps_point_climo_name
+----------------------
+
+The "seeps_point_climo_name" option controls the location and the filename of the SEEPS climo file for the point data.
+The default setting is the empty string which does not override the default location and name. It can be overridden by the environment variable, MET_SEEPS_POINT_CLIMO_NAME.
+
+.. code-block:: none
+
+ seeps_point_climo_name = "";
+
mask_missing_flag
-----------------
The "mask_missing_flag" entry specifies how missing data should be handled
in the Wavelet-Stat and MODE tools:
- * "NONE" to perform no masking of missing data
-
- * "FCST" to mask the forecast field with missing observation data
-
- * "OBS" to mask the observation field with missing forecast data
-
- * "BOTH" to mask both fields with missing data from the other
+ * NONE to perform no masking of missing data
+
+ * FCST to mask the forecast field with missing observation data
+
+ * OBS to mask the observation field with missing forecast data
+
+ * BOTH to mask both fields with missing data from the other
.. code-block:: none
@@ -1665,8 +1774,8 @@ Point-Stat and Ensemble-Stat, the reference time is the forecast valid time.
.. _config_options-mask:
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
@@ -1680,16 +1789,23 @@ in the following ways:
three digit grid number. Supplying a value of "FULL" indicates that the
verification should be performed over the entire grid on which the data
resides.
- See: `ON388 - TABLE B, GRID IDENTIFICATION (PDS Octet 7), MASTER LIST OF NCEP STORAGE GRIDS, GRIB Edition 1 (FM92) `_.
+ See: `ON388 - TABLE B, GRID IDENTIFICATION (PDS Octet 7), MASTER LIST OF NCEP STORAGE GRIDS, GRIB Edition 1 (FM92) `_.
The "grid" entry can be the gridded data file defining grid.
* The "poly" entry contains a comma-separated list of files that define
verification masking regions. These masking regions may be specified in
- two ways: in an ASCII file containing lat/lon points defining the mask polygon,
- or using a gridded data file such as the NetCDF output of the Gen-Vx-Mask tool.
- Some details for each of these options are described below:
+ three ways:
+
+ 1. An ASCII polyline file containing lat/lon points defining the mask polygon.
+ 2. The NetCDF output of the Gen-Vx-Mask tool.
+ 3. Any gridded data file followed by a configuration string describing the
+ data to be read and an optional threshold to be applied to that data.
+
+ These three options are described below:
- * If providing an ASCII file containing the lat/lon points defining the mask
+ * Option 1 - ASCII polyline file:
+
+ If providing an ASCII file containing the lat/lon points defining the mask
polygon, the file must contain a name for the region followed by the latitude
(degrees north) and longitude (degrees east) for each vertex of the polygon.
The values are separated by whitespace (e.g. spaces or newlines), and the
@@ -1717,27 +1833,51 @@ in the following ways:
observation point falls within the polygon defined is done in x/y
grid space.
- * The NetCDF output of the gen_vx_mask tool. Please see :numref:`masking`
+ .. code-block:: none
+
+ mask = { poly = [ "share/met/poly/CONUS.poly" ]; }
+
+ * Option 2 - Gen-Vx-Mask output:
+
+ The NetCDF output of the gen_vx_mask tool. Please see :numref:`masking`
for more details.
- * Any gridded data file that MET can read may be used to define a
+ .. code-block:: none
+
+ mask = { poly = [ "/path/to/gen_vx_mask_output.nc" ]; }
+
+ * Option 3 - Any gridded data file:
+
+ Any gridded data file that MET can read may be used to define a
verification masking region. Users must specify a description of the
field to be used from the input file and, optionally, may specify a
threshold to be applied to that field. Once this threshold is
applied, any grid point where the resulting field is 0, the mask is
turned off. Any grid point where it is non-zero, the mask is turned
on.
- For example, "sample.grib {name = \"TMP\"; level = \"Z2\";} >273"
-
-* The "sid" entry is an array of strings which define groups of
- observation station ID's over which to compute statistics. Each entry
- in the array is either a filename of a comma-separated list.
-
- * For a filename, the strings are whitespace-separated. The first
- string is the mask "name" and the remaining strings are the station
+
+ .. code-block:: none
+
+ mask = { poly = [ "/path/to/sample.grib {name = \"TMP\"; level = \"Z2\";} >273" ]; }
+
+ .. note::
+
+ The syntax for the Option 3 is complicated since it includes quotes
+ embedded within another quoted string. Any such embedded quotes must
+ be escaped using a preceeding backslash character.
+
+* The "sid" entry is an array of strings which define groups of observation station
+ ID's over which to compute statistics. Each station ID string can be followed by an
+ optional numeric weight enclosed in parenethesis and used by the "point_weight_flag"
+ configuration option. Each entry in the "sid" "array is either a filename or a
+ comma-separated list.
+
+ * For an ASCII filename, the strings contained within it are whitespace-separated.
+ The first string is the mask "name" and the remaining strings are the station
ID's to be used.
* For a comma-separated list, optionally use a colon to specify a name.
- For "MY_LIST:SID1,SID2", name = MY_LIST and values = SID1 and SID2.
+ For "MY_LIST:SID1(WGT1),SID2(WGT2)", name = MY_LIST which consists of
+ two station ID's (SID1 and SID2) and optional numeric weights (WGT1 and WGT2).
* For a comma-separated list of length one with no name specified, the
mask "name" and value are both set to the single station ID string.
For "SID1", name = SID1 and value = SID1.
@@ -1747,6 +1887,7 @@ in the following ways:
For "SID1,SID2", name = MASK_SID and values = SID1 and SID2.
* The "name" of the station ID mask is written to the VX_MASK column
of the MET output files.
+
* The "llpnt" entry is either a single dictionary or an array of
dictionaries. Each dictionary contains three entries, the "name" for
the masking region, "lat_thresh", and "lon_thresh". The latitude and
@@ -1811,11 +1952,11 @@ bootstrap confidence intervals. The interval variable indicates what method
should be used for computing bootstrap confidence intervals:
* The "interval" entry specifies the confidence interval method:
-
- * "BCA" for the BCa (bias-corrected percentile) interval method is
+
+ * BCA for the BCa (bias-corrected percentile) interval method is
highly accurate but computationally intensive.
-
- * "PCTILE" uses the percentile method which is somewhat less accurate
+
+ * PCTILE uses the percentile method which is somewhat less accurate
but more efficient.
* The "rep_prop" entry specifies a proportion between 0 and 1 to define
@@ -1847,7 +1988,7 @@ should be used for computing bootstrap confidence intervals:
documentation of the
`GNU Scientific Library `_
for a listing of the random number generators available for use.
-
+
* The "seed" entry may be set to a specific value to make the computation
of bootstrap confidence intervals fully repeatable. When left empty
the random number generator seed is chosen automatically which will lead
@@ -1876,12 +2017,12 @@ This dictionary may include the following entries:
* The "field" entry specifies to which field(s) the interpolation method
should be applied. This does not apply when doing point verification
with the Point-Stat or Ensemble-Stat tools:
-
- * "FCST" to interpolate/smooth the forecast field.
-
- * "OBS" to interpolate/smooth the observation field.
-
- * "BOTH" to interpolate/smooth both the forecast and the observation.
+
+ * FCST to interpolate/smooth the forecast field.
+
+ * OBS to interpolate/smooth the observation field.
+
+ * BOTH to interpolate/smooth both the forecast and the observation.
* The "vld_thresh" entry specifies a number between 0 and 1. When
performing interpolation over some neighborhood of points the ratio of
@@ -1915,38 +2056,38 @@ This dictionary may include the following entries:
* The "method" entry is an array of interpolation procedures to be
applied to the points in the box:
-
+
* MIN for the minimum value
-
+
* MAX for the maximum value
-
+
* MEDIAN for the median value
-
+
* UW_MEAN for the unweighted average value
-
+
* DW_MEAN for the distance-weighted average value
where weight = distance^-2
* LS_FIT for a least-squares fit
-
+
* BILIN for bilinear interpolation (width = 2)
-
+
* NEAREST for the nearest grid point (width = 1)
-
+
* BEST for the value closest to the observation
-
+
* UPPER_LEFT for the upper left grid point (width = 1)
* UPPER_RIGHT for the upper right grid point (width = 1)
-
+
* LOWER_RIGHT for the lower right grid point (width = 1)
-
+
* LOWER_LEFT for the lower left grid point (width = 1)
* GAUSSIAN for the Gaussian kernel
* MAXGAUSS for the maximum value followed by a Gaussian smoother
-
+
* GEOG_MATCH for the nearest grid point where the land/sea mask
and geography criteria are satisfied
@@ -1978,7 +2119,7 @@ This dictionary may include the following entries:
land_mask
---------
-
+
The "land_mask" dictionary defines the land/sea mask field used when
verifying at the surface. The "flag" entry enables/disables this logic.
When enabled, the "message_type_group_map" dictionary must contain entries
@@ -2006,7 +2147,7 @@ The "land_mask.flag" entry may be set separately in each "obs.field" entry.
topo_mask
---------
-
+
The "topo_mask" dictionary defines the model topography field used when
verifying at the surface. The flag entry enables/disables this logic.
When enabled, the "message_type_group_map" dictionary must contain an entry
@@ -2036,7 +2177,7 @@ The "topo_mask.flag" entry may be set separately in each "obs.field" entry.
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
@@ -2068,7 +2209,7 @@ This dictionary may include the following entries:
output line and used for computing probabilistic statistics.
* The "shape" entry defines the shape of the neighborhood.
- Valid values are "SQUARE" or "CIRCLE"
+ Valid values are SQUARE or CIRCLE
* The "prob_cat_thresh" entry defines the thresholds which define ensemble
probabilities from which to compute the ranked probability score output.
@@ -2089,16 +2230,16 @@ This dictionary may include the following entries:
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:
-* "NONE" to skip the corresponding verification method
-
-* "STAT" to write the verification output only to the ".stat" output file
-
-* "BOTH" to write to the ".stat" output file as well the optional
+* NONE to skip the corresponding verification method
+
+* STAT to write the verification output only to the ".stat" output file
+
+* BOTH to write to the ".stat" output file as well the optional
"_type.txt" file, a more readable ASCII file sorted by line type.
.. code-block:: none
@@ -2171,7 +2312,7 @@ netcdf output will be generated.
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
and is used to construct variable names for the NetCDF matched pairs output
@@ -2184,14 +2325,14 @@ For example:
| nc_pairs_var_name = "TMP";
|
-
+
.. code-block:: none
nc_pairs_var_name = "";
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.
@@ -2205,8 +2346,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
@@ -2214,7 +2357,7 @@ now deprecated.
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.
@@ -2225,28 +2368,74 @@ the verification.
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
-Lat/Lon grids. It is only applied for grid-to-grid verification in Grid-Stat
-and Ensemble-Stat and is not applied for grid-to-point verification.
+during the computation of contingency tables (CTC, MCTC, PCT, and
+NBRCTC), partial sums (SL1L2, SAL1L2, VL1L2, and VAL1L2), and statistics
+(CNT, CTS, MCTS, PSTD, PRC, PJC, ECLV, NBRCNT, and NBRCTS).
+It is meant to account for grid box area distortion and is often applied
+to global Lat/Lon grids. It is only applied for grid-to-grid verification
+in Grid-Stat and Ensemble-Stat and is not applied for grid-to-point
+verification, which is controlled by the "point_weight_flag" option.
+It can only be defined once at the highest level of config file context
+and applies to all verification tasks for that run.
+
Three grid weighting options are currently supported:
-* "NONE" to disable grid weighting using a constant weight (default).
-
-* "COS_LAT" to define the weight as the cosine of the grid point latitude.
+* NONE to disable grid weighting using a constant weight of 1.0 (default).
+
+* COS_LAT to define the weight as the cosine of the grid point latitude.
This an approximation for grid box area used by NCEP and WMO.
-
-* "AREA" to define the weight as the true area of the grid box (km^2).
-The weights are ultimately computed as the weight at each grid point divided
-by the sum of the weights for the current masking region.
+* AREA to define the weight as the true area of the grid box (km^2).
+
+If requested in the config file, the raw grid weights can be written to
+the NetCDF output from Grid-Stat and Ensemble-Stat.
+
+When computing partial sums and continuous statistics, the weights are
+first normalized by dividing by the sum of the weights for the current
+masking region. When computing contingency tables and deriving statistics,
+each contingency table cell contains the sum of the weights of the matching
+grid points rather than the integer count of those grid points. Statistics
+are derived using these sums of weights rather than the raw counts.
+
+When no grid weighting is requested (**NONE**), contingency tables are
+populated using a default constant weight of 1.0 and the corresponding cells
+are written to the output as integer counts for consistency with earlier
+versions of MET.
+
+.. note::
+
+ The FHO line type is not compatible with grid weighting. If requested
+ with grid weighting enabled, Grid-Stat prints a warning message and
+ automatically disables the FHO line type. Users are advised to request the
+ CTC line type instead.
.. code-block:: none
grid_weight_flag = NONE;
+point_weight_flag
+-----------------
+
+The "point_weight_flag" is similar to the "grid_weight_flag", described above,
+but applies to grid-to-point verification in Point-Stat and Ensemble-Stat.
+It is not applied for grid-to-grid verification which is controlled by the
+"grid_weight_flag" option. It can only be defined once at the highest level
+of config file context and applies to all verification tasks for that run.
+
+While only one point weighting option is currently supported, additional
+methods are planned for future versions:
+
+* NONE to disable point weighting using a constant weight of 1.0 (default).
+
+* SID to use the weights defined by the station ID masking configuration option,
+ "mask.sid".
+
+.. code-block:: none
+
+ point_weight_flag = NONE;
+
hss_ec_value
------------
@@ -2283,9 +2472,9 @@ duplicate_flag
The "duplicate_flag" entry specifies how to handle duplicate point
observations in Point-Stat and Ensemble-Stat:
-* "NONE" to use all point observations (legacy behavior)
-
-* "UNIQUE" only use a single observation if two or more observations
+* NONE to use all point observations (legacy behavior)
+
+* UNIQUE only use a single observation if two or more observations
match. Matching observations are determined if they contain identical
latitude, longitude, level, elevation, and time information.
They may contain different observation values or station IDs
@@ -2307,23 +2496,23 @@ observations that appear at a single location (lat,lon,level,elev)
in Point-Stat and Ensemble-Stat. Eight techniques are
currently supported:
-* "NONE" to use all point observations (legacy behavior)
-
-* "NEAREST" use only the observation that has the valid
+* NONE to use all point observations (legacy behavior)
+
+* NEAREST use only the observation that has the valid
time closest to the forecast valid time
-
-* "MIN" use only the observation that has the lowest value
-
-* "MAX" use only the observation that has the highest value
-
-* "UW_MEAN" compute an unweighted mean of the observations
-
-* "DW_MEAN" compute a weighted mean of the observations based
+
+* MIN use only the observation that has the lowest value
+
+* MAX use only the observation that has the highest value
+
+* UW_MEAN compute an unweighted mean of the observations
+
+* DW_MEAN compute a weighted mean of the observations based
on the time of the observation
-
-* "MEDIAN" use the median observation
-
-* "PERC" use the Nth percentile observation where N = obs_perc_value
+
+* MEDIAN use the median observation
+
+* PERC use the Nth percentile observation where N = obs_perc_value
The reporting mechanism for this feature can be activated by specifying
a verbosity level of three or higher. The report will show information
@@ -2337,14 +2526,14 @@ in those cases.
obs_perc_value
--------------
-
+
Percentile value to use when obs_summary = PERC
.. code-block:: none
obs_perc_value = 50;
-
+
obs_quality_inc
---------------
@@ -2360,7 +2549,7 @@ Note "obs_quality_inc" replaces the older option "obs_quality".
obs_quality_inc = [ "1", "2", "3", "9" ];
-
+
obs_quality_exc
---------------
@@ -2375,7 +2564,7 @@ an array of strings, even if the values themselves are numeric.
obs_quality_exc = [ "1", "2", "3", "9" ];
-
+
met_data_dir
------------
@@ -2565,7 +2754,7 @@ entries. This dictionary may include the following entries:
censor_val = [];
ens_thresh = 1.0;
vld_thresh = 1.0;
-
+
field = [
{
name = "APCP";
@@ -2626,37 +2815,37 @@ combination of the categorical threshold (cat_thresh), neighborhood width
ensemble_flag
^^^^^^^^^^^^^
-
+
The "ensemble_flag" entry is a dictionary of boolean value indicating
which ensemble products should be generated:
* "latlon" for a grid of the Latitude and Longitude fields
* "mean" for the simple ensemble mean
-
+
* "stdev" for the ensemble standard deviation
-
+
* "minus" for the mean minus one standard deviation
-
+
* "plus" for the mean plus one standard deviation
-
+
* "min" for the ensemble minimum
-
+
* "max" for the ensemble maximum
-
+
* "range" for the range of ensemble values
-
+
* "vld_count" for the number of valid ensemble members
-
+
* "frequency" for the ensemble relative frequency meeting a threshold
-
+
* "nep" for the neighborhood ensemble probability
-
+
* "nmep" for the neighborhood maximum ensemble probability
-
+
* "rank" to write the rank for the gridded observation field to separate
NetCDF output file.
-
+
* "weight" to write the grid weights specified in grid_weight_flag to the
rank NetCDF output file.
@@ -2678,7 +2867,7 @@ which ensemble products should be generated:
rank = TRUE;
weight = FALSE;
}
-
+
EnsembleStatConfig_default
--------------------------
@@ -2711,7 +2900,7 @@ data is provided, the climo_cdf thresholds will be used instead.
ens_ssvar_bin_size = 1;
ens_phist_bin_size = 0.05;
prob_cat_thresh = [];
-
+
field = [
{
name = "APCP";
@@ -2796,7 +2985,7 @@ CHISQUARED distributions are defined by a single parameter. The GAMMA,
UNIFORM, and BETA distributions are defined by two parameters. See the
`GNU Scientific Library Reference Manual `_
for more information on these distributions.
-
+
The inst_bias_scale and inst_bias_offset entries specify bias scale and
offset values that should be applied to observation values prior to
@@ -3084,92 +3273,92 @@ Floating-point max/min options: Setting limits on various floating-point
attributes. One may specify these as integers (i.e., without a decimal
point), if desired. The following pairs of options indicate minimum and
maximum values for each MODE attribute that can be described as a floating-
-point number. Please refer to "The MODE Tool" section on attributes in the
+point number. Please refer to :ref:`mode-attributes` in the
MET User's Guide for a description of these attributes.
.. code-block:: none
// centroid_x_min = 0.0;
// centroid_x_max = 0.0;
-
+
// centroid_y_min = 0.0;
// centroid_y_max = 0.0;
-
+
// centroid_lat_min = 0.0;
// centroid_lat_max = 0.0;
-
+
// centroid_lon_min = 0.0;
// centroid_lon_max = 0.0;
-
+
// axis_ang_min = 0.0;
// axis_ang_max = 0.0;
-
+
// length_min = 0.0;
// length_max = 0.0;
-
+
// width_min = 0.0;
// width_max = 0.0;
-
+
// aspect_ratio_min = 0.0;
// aspect_ratio_max = 0.0;
-
+
// curvature_min = 0.0;
// curvature_max = 0.0;
-
+
// curvature_x_min = 0.0;
// curvature_x_max = 0.0;
-
+
// curvature_y_min = 0.0;
// curvature_y_max = 0.0;
-
+
// complexity_min = 0.0;
// complexity_max = 0.0;
-
+
// intensity_10_min = 0.0;
// intensity_10_max = 0.0;
-
+
// intensity_25_min = 0.0;
// intensity_25_max = 0.0;
// intensity_50_min = 0.0;
// intensity_50_max = 0.0;
-
+
// intensity_75_min = 0.0;
// intensity_75_max = 0.0;
-
+
// intensity_90_min = 0.0;
// intensity_90_max = 0.0;
-
+
// intensity_user_min = 0.0;
// intensity_user_max = 0.0;
-
+
// intensity_sum_min = 0.0;
// intensity_sum_max = 0.0;
-
+
// centroid_dist_min = 0.0;
// centroid_dist_max = 0.0;
-
+
// boundary_dist_min = 0.0;
// boundary_dist_max = 0.0;
-
+
// convex_hull_dist_min = 0.0;
// convex_hull_dist_max = 0.0;
-
+
// angle_diff_min = 0.0;
// angle_diff_max = 0.0;
-
+
// area_ratio_min = 0.0;
// area_ratio_max = 0.0;
-
+
// intersection_over_area_min = 0.0;
// intersection_over_area_max = 0.0;
-
+
// complexity_ratio_min = 0.0;
// complexity_ratio_max = 0.0;
-
+
// percentile_intensity_ratio_min = 0.0;
// percentile_intensity_ratio_max = 0.0;
-
+
// interest_min = 0.0;
// interest_max = 0.0;
@@ -3250,15 +3439,15 @@ The object definition settings for MODE are contained within the "fcst" and
merge_thresh = [ >=1.0, >=2.0, >=3.0 ];
* The "merge_flag" entry specifies the merging methods to be applied:
-
- * "NONE" for no merging
-
- * "THRESH" for the double-threshold merging method. Merge objects
+
+ * NONE for no merging
+
+ * THRESH for the double-threshold merging method. Merge objects
that would be part of the same object at the lower threshold.
-
- * "ENGINE" for the fuzzy logic approach comparing the field to itself
-
- * "BOTH" for both the double-threshold and engine merging methods
+
+ * ENGINE for the fuzzy logic approach comparing the field to itself
+
+ * BOTH for both the double-threshold and engine merging methods
.. code-block:: none
@@ -3267,7 +3456,7 @@ The object definition settings for MODE are contained within the "fcst" and
name = "APCP";
level = "A03";
}
-
+
censor_thresh = [];
censor_val = [];
conv_radius = 60.0/grid_res; in grid squares
@@ -3297,15 +3486,15 @@ match_flag
The "match_flag" entry specifies the matching method to be applied:
-* "NONE" for no matching between forecast and observation objects
-
-* "MERGE_BOTH" for matching allowing additional merging in both fields.
+* NONE for no matching between forecast and observation objects
+
+* MERGE_BOTH for matching allowing additional merging in both fields.
If two objects in one field match the same object in the other field,
those two objects are merged.
-
-* "MERGE_FCST" for matching allowing only additional forecast merging
-
-* "NO_MERGE" for matching with no additional merging in either field
+
+* MERGE_FCST for matching allowing only additional forecast merging
+
+* NO_MERGE for matching with no additional merging in either field
.. code-block:: none
@@ -3325,7 +3514,7 @@ skip unreasonable object comparisons.
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
@@ -3359,23 +3548,23 @@ mathematical functions.
.. code-block:: none
interest_function = {
-
+
centroid_dist = (
( 0.0, 1.0 )
( 60.0/grid_res, 1.0 )
( 600.0/grid_res, 0.0 )
);
-
+
boundary_dist = (
( 0.0, 1.0 )
( 400.0/grid_res, 0.0 )
);
-
+
convex_hull_dist = (
( 0.0, 1.0 )
( 400.0/grid_res, 0.0 )
);
-
+
angle_diff = (
( 0.0, 1.0 )
( 30.0, 1.0 )
@@ -3388,24 +3577,24 @@ mathematical functions.
( corner, 1.0 )
( 1.0, 1.0 )
);
-
+
area_ratio = ratio_if;
-
+
int_area_ratio = (
( 0.00, 0.00 )
( 0.10, 0.50 )
( 0.25, 1.00 )
( 1.00, 1.00 )
);
-
+
complexity_ratio = ratio_if;
-
+
inten_perc_ratio = ratio_if;
}
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
objects and is used in determining matches.
@@ -3454,7 +3643,7 @@ lines in the grid.
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.
@@ -3484,16 +3673,16 @@ The PB2NC tool filters out observations from PREPBUFR or BUFR files using the
following criteria:
(1) by message type: supply a list of PREPBUFR message types to retain
-
+
(2) by station id: supply a list of observation stations to retain
-
+
(3) by valid time: supply the beginning and ending time offset values
in the obs_window entry described above.
(4) by location: use the "mask" entry described below to supply either
an NCEP masking grid, a masking lat/lon polygon or a file to a
mask lat/lon polygon
-
+
(5) by elevation: supply min/max elevation values
(6) by report type: supply a list of report types to retain using
@@ -3501,15 +3690,15 @@ following criteria:
(7) by instrument type: supply a list of instrument type to
retain
-
+
(8) by vertical level: supply beg/end vertical levels using the
level_range entry described below
-
+
(9) by variable type: supply a list of observation variable types to
retain using the obs_bufr_var entry described below
-
+
(10) by quality mark: supply a quality mark threshold
-
+
(11) Flag to retain values for all quality marks, or just the first
quality mark (highest): use the event_stack_flag described below
@@ -3517,24 +3706,24 @@ following criteria:
retain.
0 - Surface level (mass reports only)
-
+
1 - Mandatory level (upper-air profile reports)
-
+
2 - Significant temperature level (upper-air profile reports)
-
+
2 - Significant temperature and winds-by-pressure level
(future combined mass and wind upper-air reports)
-
+
3 - Winds-by-pressure level (upper-air profile reports)
-
+
4 - Winds-by-height level (upper-air profile reports)
-
+
5 - Tropopause level (upper-air profile reports)
-
+
6 - Reports on a single level
(e.g., aircraft, satellite-wind, surface wind,
precipitable water retrievals, etc.)
-
+
7 - Auxiliary levels generated via interpolation from spanning levels
(upper-air profile reports)
@@ -3545,14 +3734,14 @@ 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.
| List of valid message types:
-| ADPUPA AIRCAR AIRCFT ADPSFC ERS1DA GOESND GPSIPW
-| MSONET PROFLR QKSWND RASSDA SATEMP SATWND SFCBOG
-| SFCSHP SPSSMI SYNDAT VADWND
+| “ADPUPA”, “AIRCAR”, “AIRCFT”, “ADPSFC”, “ERS1DA”, “GOESND”, “GPSIPW”,
+| “MSONET”, “PROFLR”, “QKSWND”, “RASSDA”, “SATEMP”,
+| “SATWND”, “SFCBOG”, “SFCSHP”, “SPSSMI”, “SYNDAT”, “VADWND”
For example:
| message_type[] = [ "ADPUPA", "AIRCAR" ];
-|
+|
`Current Table A Entries in PREPBUFR mnemonic table `_
@@ -3662,12 +3851,12 @@ categories should be retained:
| 1 = Mandatory level (upper-air profile reports)
-| 2 = Significant temperature level (upper-air profile reports)
+| 2 = Significant temperature level (upper-air profile reports)
| 2 = Significant temperature and winds-by-pressure level (future combined mass
-| and wind upper-air reports)
+| and wind upper-air reports)
-| 3 = Winds-by-pressure level (upper-air profile reports)
+| 3 = Winds-by-pressure level (upper-air profile reports)
| 4 = Winds-by-height level (upper-air profile reports)
@@ -3679,7 +3868,7 @@ categories should be retained:
| 7 = Auxiliary levels generated via interpolation from spanning levels
| (upper-air profile reports)
-|
+|
An empty list indicates that all should be retained.
@@ -3728,7 +3917,7 @@ obs_prepbufr_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
-backward-compatibility for earlier versions of MET which wrote GRIB
+backward compatibility for earlier versions of MET which wrote GRIB
abbreviations to the output.
.. code-block:: none
@@ -3750,7 +3939,7 @@ abbreviations to the output.
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
@@ -3765,7 +3954,7 @@ See `Code table for observation quality markers `_
* Valid combinations of the two are listed below:
-
- * "HAAR" for Haar wavelet (member = 2)
-
- * "HAAR_CNTR" for Centered-Haar wavelet (member = 2)
- * "DAUB" for Daubechies wavelet (member = 4, 6, 8, 10, 12, 14, 16,
+ * HAAR for Haar wavelet (member = 2)
+
+ * HAAR_CNTR for Centered-Haar wavelet (member = 2)
+
+ * DAUB for Daubechies wavelet (member = 4, 6, 8, 10, 12, 14, 16,
18, 20)
-
- * "DAUB_CNTR" for Centered-Daubechies wavelet (member = 4, 6, 8, 10,
+
+ * DAUB_CNTR for Centered-Daubechies wavelet (member = 4, 6, 8, 10,
12, 14, 16, 18, 20)
-
- * "BSPLINE" for Bspline wavelet (member = 103, 105, 202, 204, 206,
+
+ * BSPLINE for Bspline wavelet (member = 103, 105, 202, 204, 206,
208, 301, 303, 305, 307, 309)
- * "BSPLINE_CNTR" for Centered-Bspline wavelet (member = 103, 105, 202,
+ * BSPLINE_CNTR for Centered-Bspline wavelet (member = 103, 105, 202,
204, 206, 208, 301, 303, 305, 307, 309)
.. code-block:: none
diff --git a/docs/Users_Guide/config_options_tc.rst b/docs/Users_Guide/config_options_tc.rst
index 1aa1e31f7a..cd3a69e96d 100644
--- a/docs/Users_Guide/config_options_tc.rst
+++ b/docs/Users_Guide/config_options_tc.rst
@@ -36,7 +36,7 @@ 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.
-| Valid basins: WP, IO, SH, CP, EP, AL, SL
+| Valid basins: "WP", "IO", "SH", "CP", "EP", "AL", "SL"
|
For example:
@@ -235,12 +235,12 @@ 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:
-* "NONE" to do nothing.
+* NONE to do nothing.
-* "FILL" to create a copy of '2' track and rename it as 'I' only when the
+* FILL to create a copy of '2' track and rename it as 'I' only when the
'I' track does not already exist.
-* "REPLACE" to create a copy of the '2' track and rename it as 'I' in all
+* REPLACE to create a copy of the '2' track and rename it as 'I' in all
cases, replacing any 'I' tracks that may already exist.
.. code-block:: none
@@ -394,16 +394,16 @@ replaced with "val". This map can be used to modify basin names to make them
consistent across the ATCF input files.
Many global modeling centers use ATCF basin identifiers based on region
-(e.g., 'SP' for South Pacific Ocean, etc.), however the best track data
+(e.g., "SP" for South Pacific Ocean, etc.), however the best track data
provided by the Joint Typhoon Warning Center (JTWC) use just one basin
-identifier 'SH' for all of the Southern Hemisphere basins. Additionally,
+identifier "SH" for all of the Southern Hemisphere basins. Additionally,
some modeling centers may report basin identifiers separately for the Bay
-of Bengal (BB) and Arabian Sea (AB) whereas JTWC uses 'IO'.
+of Bengal (BB) and Arabian Sea (AB) whereas JTWC uses "IO".
The basin mapping allows MET to map the basin identifiers to the expected
values without having to modify your data. For example, the first entry
-in the list below indicates that any data entries for 'SI' will be matched
-as if they were 'SH'. In this manner, all verification results for the
+in the list below indicates that any data entries for "SI" will be matched
+as if they were "SH". In this manner, all verification results for the
Southern Hemisphere basins will be reported together as one basin.
An empty list indicates that no basin mapping should be used. Use this if
@@ -854,11 +854,11 @@ Where "job_name" is set to one of the following:
specified using the "-line_type" and "-column" arguments.
For TCStat, the "-column" argument may be set to:
- * "TRACK" for track, along-track, and cross-track errors.
- * "WIND" for all wind radius errors.
- * "TI" for track and maximum wind intensity errors.
- * "AC" for along-track and cross-track errors.
- * "XY" for x-track and y-track errors.
+ * TRACK for track, along-track, and cross-track errors.
+ * WIND for all wind radius errors.
+ * TI for track and maximum wind intensity errors.
+ * AC for along-track and cross-track errors.
+ * XY for x-track and y-track errors.
* "col" for a specific column name.
* "col1-col2" for a difference of two columns.
* "ABS(col or col1-col2)" for the absolute value.
diff --git a/docs/Users_Guide/ensemble-stat.rst b/docs/Users_Guide/ensemble-stat.rst
index dd221dd1d2..1680164d70 100644
--- a/docs/Users_Guide/ensemble-stat.rst
+++ b/docs/Users_Guide/ensemble-stat.rst
@@ -50,7 +50,7 @@ The relative position (RELP) is a count of the number of times each ensemble mem
The ranked probability score (RPS) is included in the Ranked Probability Score (RPS) line type. It is the mean of the Brier scores computed from ensemble probabilities derived for each probability category threshold (prob_cat_thresh) specified in the configuration file. The continuous ranked probability score (CRPS) is the average the distance between the forecast (ensemble) cumulative distribution function and the observation cumulative distribution function. It is an analog of the Brier score, but for continuous forecast and observation fields. The CRPS statistic is computed using two methods: assuming a normal distribution defined by the ensemble mean and spread (:ref:`Gneiting et al., 2004 `) and using the empirical ensemble distribution (:ref:`Hersbach, 2000 `). The CRPS statistic using the empirical ensemble distribution can be adjusted (bias corrected) by subtracting 1/(2*m) times the mean absolute difference of the ensemble members, where m is the ensemble size. This is reported as a separate statistic called CRPS_EMP_FAIR. The empirical CRPS and its fair version are included in the Ensemble Continuous Statistics (ECNT) line type, along with other statistics quantifying the ensemble spread and ensemble mean skill.
-The Ensemble-Stat tool can derive ensemble relative frequencies and verify them as probability forecasts all in the same run. Note however that these simple ensemble relative frequencies are not actually calibrated probability forecasts. If probabilistic line types are requested (output_flag), this logic is applied to each pair of fields listed in the forecast (fcst) and observation (obs) dictionaries of the configuration file. Each probability category threshold (prob_cat_thresh) listed for the forecast field is applied to the input ensemble members to derive a relative frequency forecast. The probability category threshold (prob_cat_thresh) parsed from the corresponding observation entry is applied to the (gridded or point) observations to determine whether or not the event actually occurred. The paired ensemble relative freqencies and observation events are used to populate an Nx2 probabilistic contingency table. The dimension of that table is determined by the probability PCT threshold (prob_pct_thresh) configuration file option parsed from the forecast dictionary. All probabilistic output types requested are derived from the this Nx2 table and written to the ascii output files. Note that the FCST_VAR name header column is automatically reset as "PROB({FCST_VAR}{THRESH})" where {FCST_VAR} is the current field being evaluated and {THRESH} is the threshold that was applied.
+The Ensemble-Stat tool can derive ensemble relative frequencies and verify them as probability forecasts all in the same run. Note however that these simple ensemble relative frequencies are not actually calibrated probability forecasts. If probabilistic line types are requested (output_flag), this logic is applied to each pair of fields listed in the forecast (fcst) and observation (obs) dictionaries of the configuration file. Each probability category threshold (prob_cat_thresh) listed for the forecast field is applied to the input ensemble members to derive a relative frequency forecast. The probability category threshold (prob_cat_thresh) parsed from the corresponding observation entry is applied to the (gridded or point) observations to determine whether or not the event actually occurred. The paired ensemble relative frequencies and observation events are used to populate an Nx2 probabilistic contingency table. The dimension of that table is determined by the probability PCT threshold (prob_pct_thresh) configuration file option parsed from the forecast dictionary. All probabilistic output types requested are derived from this Nx2 table and written to the ascii output files. Note that the FCST_VAR name header column is automatically reset as "PROB({FCST_VAR}{THRESH})" where {FCST_VAR} is the current field being evaluated and {THRESH} is the threshold that was applied.
Note that if no probability category thresholds (prob_cat_thresh) are defined, but climatological mean and standard deviation data is provided along with climatological bins, climatological distribution percentile thresholds are automatically derived and used to compute probabilistic outputs.
@@ -160,34 +160,48 @@ ____________________
.. code-block:: none
- model = "FCST";
- desc = "NA";
- obtype = "ANALYS";
- regrid = { ... }
- climo_mean = { ... }
- climo_stdev = { ... }
- climo_cdf = { ... }
- obs_window = { beg = -5400; end = 5400; }
- mask = { grid = [ "FULL" ]; poly = []; sid = []; }
- ci_alpha = [ 0.05 ];
- interp = { field = BOTH; vld_thresh = 1.0; shape = SQUARE;
- type = [ { method = NEAREST; width = 1; } ]; }
- eclv_points = [];
- sid_inc = [];
- sid_exc = [];
- duplicate_flag = NONE;
+ model = "FCST";
+ desc = "NA";
+ obtype = "ANALYS";
+ regrid = { ... }
+ climo_mean = { ... }
+ climo_stdev = { ... }
+ climo_cdf = { ... }
+ obs_window = { beg = -5400; end = 5400; }
+ mask = { grid = [ "FULL" ]; poly = []; sid = []; }
+ ci_alpha = [ 0.05 ];
+ interp = { field = BOTH; vld_thresh = 1.0; shape = SQUARE;
+ type = [ { method = NEAREST; width = 1; } ]; }
+ eclv_points = [];
+ sid_inc = [];
+ sid_exc = [];
+ duplicate_flag = NONE;
obs_quality_inc = [];
obs_quality_exc = [];
- obs_summary = NONE;
- obs_perc_value = 50;
+ obs_summary = NONE;
+ obs_perc_value = 50;
message_type_group_map = [...];
- output_prefix = "";
- version = "VN.N";
+ obtype_as_group_val_flag = FALSE;
+ grid_weight_flag = NONE;
+ point_weight_flag = NONE;
+ output_prefix = "";
+ version = "VN.N";
The configuration options listed above are common to many MET tools and are described in :numref:`config_options`.
-Note that the **HIRA** interpolation method is only supported in Ensemble-Stat.
+.. note::
+
+ The **HIRA** interpolation method is only supported in Ensemble-Stat.
+
+.. note::
+
+ The "grid_weight_flag" and "point_weight_flag" options described in
+ :numref:`config_options` define how matched pairs are weighted for
+ grid-to-grid and grid-to-point verification in Ensemble-Stat. These
+ weights currently only apply to the computation of probabilistic
+ outputs (PCT, PSTD, PJC, and PRC) but no other Ensemble-Stat output
+ line types.
_____________________
@@ -856,30 +870,36 @@ The format of the STAT and ASCII output of the Ensemble-Stat tool are described
* - 37
- ENS_i
- Value of the ith ensemble member (repeated)
- * - Last-7
+ * - Last-9
- OBS_QC
- Quality control string for the observation
- * - Last-6
+ * - Last-8
- ENS_MEAN
- The unperturbed ensemble mean value
- * - Last-5
- - CLIMO_MEAN
- - Climatological mean value (named CLIMO prior to met-10.0.0)
- * - Last-4
+ * - Last-7
+ - OBS_CLIMO_MEAN
+ - Observation climatological mean value (named CLIMO_MEAN prior to met-12.0.0)
+ * - Last-6
- SPREAD
- The spread (standard deviation) of the unperturbed ensemble member values
- * - Last-3
+ * - Last-5
- ENS_MEAN _OERR
- The PERTURBED ensemble mean (e.g. with Observation Error).
- * - Last-2
+ * - Last-4
- SPREAD_OERR
- The spread (standard deviation) of the PERTURBED ensemble member values (e.g. with Observation Error).
- * - Last-1
+ * - Last-3
- SPREAD_PLUS_OERR
- The square root of the sum of the unperturbed ensemble variance and the observation error variance.
+ * - Last-2
+ - OBS_CLIMO_STDEV
+ - Observation climatological standard deviation value (named CLIMO_STDEV prior to met-12.0.0)
+ * - Last-1
+ - FCST_CLIMO_MEAN
+ - Forecast climatological mean value
* - Last
- - CLIMO_STDEV
- - Climatological standard deviation value
+ - FCST_CLIMO_STDEV
+ - Forecast climatological standard deviation value
.. role:: raw-html(raw)
:format: html
diff --git a/docs/Users_Guide/figure/installation_dir.png b/docs/Users_Guide/figure/installation_dir.png
deleted file mode 100644
index 40f1b48231..0000000000
Binary files a/docs/Users_Guide/figure/installation_dir.png and /dev/null differ
diff --git a/docs/Users_Guide/figure/installation_dir_after.png b/docs/Users_Guide/figure/installation_dir_after.png
deleted file mode 100644
index e87a14e595..0000000000
Binary files a/docs/Users_Guide/figure/installation_dir_after.png and /dev/null differ
diff --git a/docs/Users_Guide/gen-ens-prod.rst b/docs/Users_Guide/gen-ens-prod.rst
index 57da0849cb..7f6d68c6c7 100644
--- a/docs/Users_Guide/gen-ens-prod.rst
+++ b/docs/Users_Guide/gen-ens-prod.rst
@@ -30,7 +30,9 @@ The Gen-Ens-Prod tool writes the gridded relative frequencies, NEP, and NMEP fie
Climatology Data
----------------
-The ensemble relative frequencies derived by Gen-Ens-Prod are computed by applying threshold(s) to the input ensemble member data. Those thresholds can be simple and remain constant over the entire domain (e.g. >0) or can be defined relative to the climatological distribution at each grid point (e.g. >CDP90, for exceeding the 90-th percentile of climatology). When using climatological distribution percentile (CDP) thresholds, the climatological mean and standard deviation must be provided in the configuration file.
+The ensemble relative frequencies derived by Gen-Ens-Prod are computed by applying threshold(s) to the input ensemble member data. Those thresholds can be simple and remain constant over the entire domain (e.g. >0) or can be defined relative to the climatological distribution at each grid point (e.g. >OCDP90, for exceeding the 90-th percentile of the observation climatology data provided).
+
+To use climatological distribution percentile thresholds, users must specify the climatological mean ("climo_mean") and standard deviation ("climo_stdev") entries in the configuration file. With forecast climatology inputs, use forecast climatology distribution percentile thresholds (e.g. >FCDP90). With observation climatology inputs, use observation climatological distribution percentile thresholds instead (e.g. >OCDP90). However, Gen-Ens-Prod cannot actually determine the input climatology data source and both "FCDP" and "OCDP" threshold types will work.
Practical Information
=====================
@@ -295,7 +297,7 @@ The **ensemble_flag** specifies which derived ensemble fields should be calculat
13. Climatology mean (**climo_mean**) and standard deviation (**climo_stdev**) data regridded to the model domain
-14. Climatological Distribution Percentile field for each CDP threshold specified
+14. Climatological Distribution Percentile field for each FCDP or OCDP threshold specified
gen_ens_prod Output
-------------------
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/grid-stat.rst b/docs/Users_Guide/grid-stat.rst
index c09df58d54..631afbdaf2 100644
--- a/docs/Users_Guide/grid-stat.rst
+++ b/docs/Users_Guide/grid-stat.rst
@@ -80,6 +80,8 @@ The Stable Equitable Error in Probability Space (SEEPS) was devised for monitori
The capability to calculate the SEEPS has also been added to Grid-Stat. This follows the method described in :ref:`North et al, 2022 `, which uses the TRMM 3B42 v7 gridded satellite product for the climatological values and interpolates the forecast and observed products onto this grid for evaluation. A 24-hour TRMM climatology (valid at 00 UTC) constructed from data over the time period 1998-2015 is supplied with the release. Expansion of the capability to other fields will occur as well vetted examples and funding allow.
+The gridded climatology required to compute SEEPS is not distributed as part of the code release and can be downloaded from `Zenodo `. The path to the file needs to be specified using MET_SEEPS_GRID_CLIMO_NAME.
+
Fourier Decomposition
---------------------
@@ -239,31 +241,32 @@ __________________________
.. code-block:: none
- model = "FCST";
- desc = "NA";
- obtype = "ANALYS";
- fcst = { ... }
- obs = { ... }
- regrid = { ... }
- climo_mean = { ... }
- climo_stdev = { ... }
- climo_cdf = { ... }
- mask = { grid = [ "FULL" ]; poly = []; }
- ci_alpha = [ 0.05 ];
- boot = { interval = PCTILE; rep_prop = 1.0; n_rep = 1000;
- rng = "mt19937"; seed = ""; }
- interp = { field = BOTH; vld_thresh = 1.0; shape = SQUARE;
- type = [ { method = NEAREST; width = 1; } ]; }
- censor_thresh = [];
- censor_val = [];
- mpr_column = [];
- mpr_thresh = [];
- eclv_points = 0.05;
- hss_ec_value = NA;
- rank_corr_flag = TRUE;
- tmp_dir = "/tmp";
- output_prefix = "";
- version = "VN.N";
+ model = "FCST";
+ desc = "NA";
+ obtype = "ANALYS";
+ fcst = { ... }
+ obs = { ... }
+ regrid = { ... }
+ climo_mean = { ... }
+ climo_stdev = { ... }
+ climo_cdf = { ... }
+ mask = { grid = [ "FULL" ]; poly = []; }
+ ci_alpha = [ 0.05 ];
+ boot = { interval = PCTILE; rep_prop = 1.0; n_rep = 1000;
+ rng = "mt19937"; seed = ""; }
+ interp = { field = BOTH; vld_thresh = 1.0; shape = SQUARE;
+ type = [ { method = NEAREST; width = 1; } ]; }
+ censor_thresh = [];
+ censor_val = [];
+ mpr_column = [];
+ mpr_thresh = [];
+ eclv_points = 0.05;
+ hss_ec_value = NA;
+ rank_corr_flag = TRUE;
+ grid_weight_flag = NONE;
+ tmp_dir = "/tmp";
+ output_prefix = "";
+ version = "VN.N";
The configuration options listed above are common to multiple MET tools and are described in :numref:`config_options`.
@@ -428,7 +431,7 @@ The **output_flag** array controls the type of output that the Grid-Stat tool ge
Note that the first two line types are easily derived from one another. The user is free to choose which measure is most desired. The output line types are described in more detail in :numref:`grid_stat-output`.
-The SEEPS climo file is not distributed with MET tools because of the file size. It should be configured by using the environment variable, MET_SEEPS_GRID_CLIMO_NAME.
+The SEEPS climo file is not distributed with MET tools because of the file size. It should be configured by using the configuration file (seeps_grid_climo_name). It can be overridden by the environment variable, MET_SEEPS_GRID_CLIMO_NAME.
_____________________
@@ -451,7 +454,7 @@ _____________________
The **nc_pairs_flag** entry may either be set to a boolean value or a dictionary specifying which fields should be written. Setting it to TRUE indicates the output NetCDF matched pairs file should be created with all available output fields, while setting all to FALSE disables its creation. This is done regardless of if **output_flag** dictionary indicates any statistics should be computed. The **latlon, raw**, and **diff** entries control the creation of output variables for the latitude and longitude, the forecast and observed fields after they have been modified by any user-defined regridding, censoring, and conversion, and the forecast minus observation difference fields, respectively. The **climo, weight**, and **nbrhd** entries control the creation of output variables for the climatological mean and standard deviation fields, the grid area weights applied, and the fractional coverage fields computed for neighborhood verification methods. Setting these entries to TRUE indicates that they should be written, while setting them to FALSE disables their creation.
-Setting the **climo_cdp** entry to TRUE enables the creation of an output variable for each climatological distribution percentile (CDP) threshold requested in the configuration file. Note that enabling **nbrhd** output may lead to very large output files. The **gradient** entry controls the creation of output variables for the FCST and OBS gradients in the grid-x and grid-y directions. The **distance_map** entry controls the creation of output variables for the FCST and OBS distance maps for each categorical threshold. The **apply_mask** entry controls whether to create the FCST, OBS, and DIFF output variables for all defined masking regions. Setting this to TRUE will create the FCST, OBS, and DIFF output variables for all defined masking regions. Setting this to FALSE will create the FCST, OBS, and DIFF output variables for only the FULL verification domain.
+Setting the **climo_cdp** entry to TRUE enables the creation of an output variable for each climatological distribution percentile (FCDP or OCDP) threshold requested in the configuration file. Note that enabling **nbrhd** output may lead to very large output files. The **gradient** entry controls the creation of output variables for the FCST and OBS gradients in the grid-x and grid-y directions. The **distance_map** entry controls the creation of output variables for the FCST and OBS distance maps for each categorical threshold. The **apply_mask** entry controls whether to create the FCST, OBS, and DIFF output variables for all defined masking regions. Setting this to TRUE will create the FCST, OBS, and DIFF output variables for all defined masking regions. Setting this to FALSE will create the FCST, OBS, and DIFF output variables for only the FULL verification domain.
______________________
diff --git a/docs/Users_Guide/installation.rst b/docs/Users_Guide/installation.rst
index 4540d341b4..5e5d1469db 100644
--- a/docs/Users_Guide/installation.rst
+++ b/docs/Users_Guide/installation.rst
@@ -162,18 +162,34 @@ Environment Variables to Run Script
Before running the compilation script, there are five environment variables
that are required:
**TEST_BASE**, **COMPILER**, **MET_SUBDIR**, **MET_TARBALL**, and **USE_MODULES**.
+
If compiling support for Python embedding, the script will need the following
additional environment variables: **MET_PYTHON**, **MET_PYTHON_CC**, and
-**MET_PYTHON_LD**. All of these environment variables are discussed
-in further detail in the Environment Variable Descriptions section below.
-An easy way to set these environment variables is in an environment
-configuration file (for example, **install_met_env.**). An
-example environment configuration file to start from (**install_met_env.generic_gnu**),
-as well as environment configuration files used on HPCs at NCAR and NOAA,
+**MET_PYTHON_LD**.
+
+All of these environment variables are discussed in further detail in the
+Environment Variable Descriptions section below. An easy way to set these
+environment variables is in an environment configuration file
+(for example, **install_met_env.**). An example environment
+configuration file to start with (**install_met_env.generic_gnu**),
+as well as the environment configuration files used on HPCs at NCAR and NOAA,
can be found in the `MET GitHub repository `_ in the
`scripts/installation/config `_
directory.
+.. note:: Starting with MET-12.0.0, C++17 is the default C++ standard for MET due to the requirements of its dependent libraries. However, MET itself only makes use of C++11 features.
+
+ The ATLAS library (conditionally required for MET, if support for
+ unstructured grids is desired)
+ `versions 0.33.0 `_
+ and later requires compiler support for the C++17 standard.
+
+ At this time, users with systems that do not yet support the C++17
+ standard, can still compile MET with an older C++ standard, using an
+ older version of ATLAS, by adding the MET_CXX_STANDARD variable to
+ the environment configuration file as described in the **OPTIONAL**
+ section below.
+
Environment Variable Descriptions
---------------------------------
@@ -198,7 +214,7 @@ Environment Variable Descriptions
subdirectory will
be installed and is often set equivalent to **TEST_BASE** (e.g. ${TEST_BASE}).
- **MET_TARBALL** – Format is *v12.0.0tar.gz*. This is the name of the downloaded MET tarball.
+ **MET_TARBALL** – Format is *v12.0.0.tar.gz*. This is the name of the downloaded MET tarball.
**USE_MODULES** – Format is *TRUE* or *FALSE*. Set to FALSE if using a machine that does not use
modulefiles; set to TRUE if using a machine that does use modulefiles. For more information on
@@ -218,6 +234,7 @@ Environment Variable Descriptions
following environment variables if using the Intel compilers:
| For non-oneAPI Intel compilers:
+ |
| export FC=ifort
| export F77=ifort
| export F90=ifort
@@ -226,6 +243,7 @@ Environment Variable Descriptions
| For oneAPI Intel compilers:
+ |
| export FC=ifx
| export F77=ifx
| export F90=ifx
@@ -239,7 +257,6 @@ Environment Variable Descriptions
configuration file, and users with a oneAPI Intel compiler should use the
install_met_env.generic_intel_oneapi configuration file.
-
.. dropdown:: REQUIRED, IF COMPILING PYTHON EMBEDDING
**MET_PYTHON** – Format is */usr/local/python3*.
@@ -247,7 +264,7 @@ Environment Variable Descriptions
containing the bin, include, lib, and share directories for Python.
**MET_PYTHON_CC** - Format is -I followed by the directory containing
- the Python include files (ex. -I/usr/local/python3/include/python3.10).
+ the Python include files (e.g. -I/usr/local/python3/include/python3.10).
This information may be obtained by
running :code:`python3-config --cflags`;
however, this command can, on certain systems,
@@ -257,7 +274,7 @@ Environment Variable Descriptions
the Python library
files then a space, then -l followed by the necessary Python
libraries to link to
- (ex. -L/usr/local/python3/lib/\\ -lpython3.10\\
+ (e.g. -L/usr/local/python3/lib/\\ -lpython3.10\\
-lpthread\\ -ldl\\ -lutil\\ -lm).
The backslashes are necessary in the example shown because of
the spaces, which will be
@@ -285,13 +302,17 @@ Environment Variable Descriptions
without a specified value of cores to use. The automated MET
testing scripts in the
Docker environment have been successful with a value of
- 5 (ex. export MAKE_ARGS=”-j 5”).
+ 5 (e.g. export MAKE_ARGS=”-j 5”).
+
+ **export MET_CXX_STANDARD** - Specify the version of the supported
+ C++ standard. Values may be 11, 14, or 17. The default value is 17.
+ (e.g. export MET_CXX_STANDARD=11)
External Library Handling in compile_MET_all.sh
-----------------------------------------------
-.. dropdown:: IF THE USER WANTS TO HAVE THE COMPILATION SCRIPT DOWNLOAD THE LIBRARY DEPENDENCIES
+.. dropdown:: IF THE USER WANTS TO HAVE THE COMPILATION SCRIPT COMPILE THE LIBRARY DEPENDENCIES
The **compile_MET_all.sh** script will compile and install MET and its
:ref:`required_external_libraries_to_build_MET`, if needed.
@@ -395,7 +416,21 @@ particular system’s needs, MET is ready for installation. The screenshot below
contents of the installation directory followed by the tar_files subdirectory at
this step on the machine ‘hera’.
-.. image:: figure/installation_dir.png
+.. code-block:: ini
+
+ /contrib/met/12.0.0$ ls
+ compile_MET_all.sh install_met_env.hera tar_files
+
+ /contrib/met/12.0.0$ ls tar_files
+ HDF-EOS2.16v1.00.tar.Z eckit-1.24.4.tar.gz netcdf-4.7.4.tar.gz
+ HDF4.2r3.tar.gz freetype-2.11.0.tar.gz netcdf-cxx4-4.3.1.tar.gz
+ atlas-0.30.0.tar.gz g2clib-1.6.4.tar.gz pixman-0.40.0.tar.gz
+ atlas-0.35.0.tar.gz gsl-1.11.tar.gz proj-7.1.0.tar.gz
+ bufr_v11.6.0.tar.gz gsl-2.7.1.tar.gz sqlite-autoconf-3430100.tar.gz
+ cairo-1.16.0.tar.xz hdf5-1.12.2.tar.gz tiff-4.6.0.tar.gz
+ ecbuild-3.5.0.tar.gz jasper-2.0.25.tar.gz zlib-1.2.11.tar.gz
+ ecbuild-3.7.0.tar.gz jpegsrc.v9e.tar.gz
+ eckit-1.20.2.tar.gz libpng-1.6.37.tar.gz
Simply enter the following into the terminal to execute the script:
@@ -405,14 +440,17 @@ Simply enter the following into the terminal to execute the script:
The screenshot below shows the contents of the installation directory after installation:
-.. image:: figure/installation_dir_after.png
+.. code-block:: ini
+
+ /contrib/met/12.0.0$ ls
+ MET-12.0.0 bin compile_MET_all.sh external_libs install_met_env.hera share tar_files
To confirm that MET was installed successfully, run the following command from the installation directory to check for errors in the test file:
.. code-block:: ini
-
- grep -i error MET12.0.0/met.make_test.log
-
+
+ grep -i error MET-12.0.0/met.make_test.log
+
If no errors are returned, the installation was successful.
Due to the highly variable nature of hardware systems, users may encounter issues during
the installation process that result in MET not being installed. If this occurs please
@@ -459,7 +497,6 @@ version. If a different version is required, select the correct
version from the dropdown option. Follow Docker’s instructions
for a successful installation.
-
Loading the Latest Docker Image of MET
--------------------------------------
@@ -477,7 +514,6 @@ version number will result in an error due to Docker’s behavior
of attempting to retrieve an image with the “latest” tag, which
MET no longer uses.
-
Running the Docker version of MET
---------------------------------
@@ -498,7 +534,7 @@ the same way the latest image of MET was pulled:
.. code-block:: ini
docker run -it --rm dtcenter/met:12.0.0 /bin/bash
-
+
If the usage MET via Docker images was successful, it is highly
recommended to move on
to using the METplus wrappers of the tools, which have their own
@@ -548,7 +584,6 @@ to make the container:
singularity build met-12.0.0.sif docker://dtcenter/met:12.0.0
-
Running the MET Container
-------------------------
@@ -569,7 +604,7 @@ be used otherwise the instance will continue to run in the background:
.. code-block:: ini
- singularity instance stop /path/to/container/met-12.0.0.sif met-12.0.0
+ singularity instance stop /path/to/container/met-12.0.0.sif met-12.0.0
Now that MET is successfully installed, it is highly recommended to
next install the METplus wrappers to take full advantage of
@@ -579,5 +614,3 @@ Users can also proceed to the
and run through the examples that only utilize the MET processes
(METplus wrapper applications and commands will not work unless
METplus wrappers are also installed).
-
-
diff --git a/docs/Users_Guide/masking.rst b/docs/Users_Guide/masking.rst
index 0d705ac06e..5dd8fe72d8 100644
--- a/docs/Users_Guide/masking.rst
+++ b/docs/Users_Guide/masking.rst
@@ -178,4 +178,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 `_.
diff --git a/docs/Users_Guide/mode-td.rst b/docs/Users_Guide/mode-td.rst
index c8c07c1117..f7dd558a7c 100644
--- a/docs/Users_Guide/mode-td.rst
+++ b/docs/Users_Guide/mode-td.rst
@@ -217,7 +217,9 @@ Required Arguments for mtd
Optional Arguments for mtd
^^^^^^^^^^^^^^^^^^^^^^^^^^
-4. **-single file\_list** may be used instead of **-fcst** and **-obs** to define objects in a single field.
+4. **-single file\_list** command line option may be used instead of the **-fcst** and **-obs** command line options to define objects in a single field.
+
+.. note:: When the **-single** command line option is used, data specified in the **fcst** configuration file entry is read from those input files.
5. **-log file** gives the name of a file where a log of this MTD run will be written. All output that appears on the screen during a MTD run will be duplicated in the log file.
diff --git a/docs/Users_Guide/mode.rst b/docs/Users_Guide/mode.rst
index 491b452002..2dc4bc3e96 100644
--- a/docs/Users_Guide/mode.rst
+++ b/docs/Users_Guide/mode.rst
@@ -57,6 +57,7 @@ An example of the steps involved in resolving objects is shown in :numref:`mode-
Example of an application of the MODE object identification process to a model precipitation field.
+.. _mode-attributes:
Attributes
----------
@@ -913,7 +914,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/docs/Users_Guide/overview.rst b/docs/Users_Guide/overview.rst
index 37cf16b404..1e0d362bb4 100644
--- a/docs/Users_Guide/overview.rst
+++ b/docs/Users_Guide/overview.rst
@@ -62,7 +62,7 @@ The Grid-Diag tool produces multivariate probability density functions (PDFs) th
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.
-Results from the statistical analysis stage are output in ASCII, NetCDF and Postscript formats. The Point-Stat, Grid-Stat, Wavelet-Stat, and Ensemble-Stat tools create STAT (statistics) files which are tabular ASCII files ending with a ".stat" suffix. The STAT output files consist of multiple line types, each containing a different set of related statistics. The columns preceeding the LINE_TYPE column are common to all lines. However, the number and contents of the remaining columns vary by line type.
+Results from the statistical analysis stage are output in ASCII, NetCDF and Postscript formats. The Point-Stat, Grid-Stat, Wavelet-Stat, and Ensemble-Stat tools create STAT (statistics) files which are tabular ASCII files ending with a ".stat" suffix. The STAT output files consist of multiple line types, each containing a different set of related statistics. The columns preceding the LINE_TYPE column are common to all lines. However, the number and contents of the remaining columns vary by line type.
The Stat-Analysis and MODE-Analysis tools aggregate the output statistics from the previous steps across multiple cases. The Stat-Analysis tool reads the STAT output of Point-Stat, Grid-Stat, Ensemble-Stat, and Wavelet-Stat and can be used to filter the STAT data and produce aggregated continuous and categorical statistics. Stat-Analysis also reads matched pair data (i.e. MPR line type) via python embedding. The MODE-Analysis tool reads the ASCII output of the MODE tool and can be used to produce summary information about object location, size, and intensity (as well as other object characteristics) across one or more cases.
diff --git a/docs/Users_Guide/point-stat.rst b/docs/Users_Guide/point-stat.rst
index 6c32537146..41e154ac8c 100644
--- a/docs/Users_Guide/point-stat.rst
+++ b/docs/Users_Guide/point-stat.rst
@@ -23,7 +23,7 @@ Interpolation/Matching Methods
This section provides information about the various methods available in MET to match gridded model output to point observations. Matching in the vertical and horizontal are completed separately using different methods.
-In the vertical, if forecasts and observations are at the same vertical level, then they are paired as-is. If any discrepancy exists between the vertical levels, then the forecasts are interpolated to the level of the observation. The vertical interpolation is done in the natural log of pressure coordinates, except for specific humidity, which is interpolated using the natural log of specific humidity in the natural log of pressure coordinates. Vertical interpolation for heights above ground are done linear in height coordinates. When forecasts are for the surface, no interpolation is done. They are matched to observations with message types that are mapped to **SURFACE** in the **message_type_group_map** configuration option. By default, the surface message types include ADPSFC, SFCSHP, and MSONET. The regular expression is applied to the message type list at the message_type_group_map. The derived message types from the time summary ("ADPSFC_MIN_hhmmss" and "ADPSFC_MAX_hhmmss") are accepted as "ADPSFC".
+In the vertical, if forecasts and observations are at the same vertical level, then they are paired as-is. If any discrepancy exists between the vertical levels, then the forecasts are interpolated to the level of the observation. The vertical interpolation is done in the natural log of pressure coordinates, except for specific humidity, which is interpolated using the natural log of specific humidity in the natural log of pressure coordinates. Vertical interpolation for heights above ground are done linear in height coordinates. When forecasts are for the surface, no interpolation is done. They are matched to observations with message types that are mapped to "SURFACE" in the **message_type_group_map** configuration option. By default, the surface message types include ADPSFC, SFCSHP, and MSONET. The regular expression is applied to the message type list at the message_type_group_map. The derived message types from the time summary ("ADPSFC_MIN_hhmmss" and "ADPSFC_MAX_hhmmss") are accepted as "ADPSFC".
To match forecasts and observations in the horizontal plane, the user can select from a number of methods described below. Many of these methods require the user to define the width of the forecast grid W, around each observation point P, that should be considered. In addition, the user can select the interpolation shape, either a SQUARE or a CIRCLE. For example, a square of width 2 defines the 2 x 2 set of grid points enclosing P, or simply the 4 grid points closest to P. A square of width of 3 defines a 3 x 3 square consisting of 9 grid points centered on the grid point closest to P. :numref:`point_stat_fig1` provides illustration. The point P denotes the observation location where the interpolated value is calculated. The interpolation width W, shown is five.
@@ -264,7 +264,7 @@ Practical Information
The Point-Stat tool is used to perform verification of a gridded model field using point observations. The gridded model field to be verified must be in one of the supported file formats. The point observations must be formatted as the NetCDF output of the point reformatting tools described in :numref:`reformat_point`. The Point-Stat tool provides the capability of interpolating the gridded forecast data to the observation points using a variety of methods as described in :numref:`matching-methods`. The Point-Stat tool computes a number of continuous statistics on the matched pair data as well as discrete statistics once the matched pair data have been thresholded.
-If no matched pairs are found for a particular verification task, a report listing counts for reasons why the observations were not used is written to the log output at the default verbosity level of 2. If matched pairs are found, this report is written at verbosity level 3. Inspecting these rejection reason counts is the first step in determining why Point-Stat found no matched pairs. The order of the log messages matches the order in which the processing logic is applied. Start from the last log message and work your way up, considering each of the non-zero rejection reason counts.
+If no matched pairs are found for a particular verification task, a report listing counts for reasons why the observations were not used is written to the log output at the default verbosity level of 2. If matched pairs are found, this report is written at verbosity level 3. Inspecting these rejection reason counts is the first step in determining why Point-Stat found no matched pairs. The order of the log messages matches the order in which the processing logic is applied. Start from the last log message and work your way up, considering each of the non-zero rejection reason counts. Verbosity level 9 prints a very detailed explanation about why each observation is used or skipped for each verification task.
point_stat Usage
----------------
@@ -362,6 +362,8 @@ ________________________
obs_summary = NONE;
obs_perc_value = 50;
message_type_group_map = [...];
+ obtype_as_group_val_flag = FALSE;
+ point_weight_flag = NONE;
tmp_dir = "/tmp";
output_prefix = "";
version = "VN.N";
@@ -501,7 +503,7 @@ Note that writing out matched pair data (MPR lines) for a large number of cases
If all line types corresponding to a particular verification method are set to NONE, the computation of those statistics will be skipped in the code and thus make the Point-Stat tool run more efficiently. For example, if FHO, CTC, and CTS are all set to NONE, the Point-Stat tool will skip the categorical verification step.
-The default SEEPS climo file exists at MET_BASE/climo/seeps/PPT24_seepsweights.nc. It can be overridden by using the environment variable, MET_SEEPS_POINT_CLIMO_NAME.
+The default SEEPS climo file exists at MET_BASE/climo/seeps/PPT24_seepsweights.nc. It is configurable by using the configuration file (seeps_point_climo_name). It can be overridden by the environment variable, MET_SEEPS_POINT_CLIMO_NAME.
.. _point_stat-output:
@@ -1204,7 +1206,7 @@ The first set of header columns are common to all of the output files generated
- Mean(o²)
* - 31
- MAE
- - Mean Absolute Error
+ - Mean(\|f-o\|)
.. _table_PS_format_info_SAL1L2:
@@ -1223,25 +1225,25 @@ The first set of header columns are common to all of the output files generated
- Scalar Anomaly L1L2 line type
* - 25
- TOTAL
- - Total number of matched triplets of forecast (f), observation (o), and climatological value (c)
+ - Total number of matched pairs of forecast (f), observation (o), forecast climatology (cf), and observation climatology (co)
* - 26
- FABAR
- - Mean(f-c)
+ - Mean(f-cf)
* - 27
- OABAR
- - Mean(o-c)
+ - Mean(o-co)
* - 28
- FOABAR
- - Mean((f-c)*(o-c))
+ - Mean((f-cf)*(o-co))
* - 29
- FFABAR
- - Mean((f-c)²)
+ - Mean((f-cf)²)
* - 30
- OOABAR
- - Mean((o-c)²)
+ - Mean((o-co)²)
* - 31
- MAE
- - Mean Absolute Error
+ - Mean(\|(f-cf)-(o-co)\|)
.. _table_PS_format_info_VL1L2:
@@ -1289,12 +1291,15 @@ The first set of header columns are common to all of the output files generated
- O_SPEED_BAR
- Mean observed wind speed
* - 35
+ - TOTAL_DIR
+ - Total number of matched pairs for which both the forecast and observation wind directions are well-defined (i.e. non-zero vectors)
+ * - 36
- DIR_ME
- Mean wind direction difference, from -180 to 180 degrees
- * - 36
+ * - 37
- DIR_MAE
- Mean absolute wind direction difference
- * - 37
+ * - 38
- DIR_MSE
- Mean squared wind direction difference
@@ -1315,28 +1320,28 @@ The first set of header columns are common to all of the output files generated
- Vector Anomaly L1L2 line type
* - 25
- TOTAL
- - Total number of matched triplets of forecast winds (uf, vf), observation winds (uo, vo), and climatological winds (uc, vc)
+ - Total number of matched pairs of forecast winds (uf, vf), observation winds (uo, vo), forecast climatology winds (ucf, vcf), and observation climatology winds (uco, vco)
* - 26
- UFABAR
- - Mean(uf-uc)
+ - Mean(uf-ucf)
* - 27
- VFABAR
- - Mean(vf-vc)
+ - Mean(vf-vcf)
* - 28
- UOABAR
- - Mean(uo-uc)
+ - Mean(uo-uco)
* - 29
- VOABAR
- - Mean(vo-vc)
+ - Mean(vo-vco)
* - 30
- UVFOABAR
- - Mean((uf-uc)*(uo-uc)+(vf-vc)*(vo-vc))
+ - Mean((uf-ucf)*(uo-uco)+(vf-vcf)*(vo-vco))
* - 31
- UVFFABAR
- - Mean((uf-uc)²+(vf-vc)²)
+ - Mean((uf-ucf)²+(vf-vcf)²)
* - 32
- UVOOABAR
- - Mean((uo-uc)²+(vo-vc)²)
+ - Mean((uo-uco)²+(vo-vco)²)
* - 33
- FA_SPEED_BAR
- Mean forecast wind speed anomaly
@@ -1344,12 +1349,15 @@ The first set of header columns are common to all of the output files generated
- OA_SPEED_BAR
- Mean observed wind speed anomaly
* - 35
+ - TOTAL_DIR
+ - Total number of matched pairs for which the forecast, observation, forecast climatology, and observation climatology wind directions are well-defined (i.e. non-zero vectors)
+ * - 36
- DIRA_ME
- Mean wind direction anomaly difference, from -180 to 180 degrees
- * - 36
+ * - 37
- DIRA_MAE
- Mean absolute wind direction anomaly difference
- * - 37
+ * - 38
- DIRA_MSE
- Mean squared wind direction anomaly difference
@@ -1431,16 +1439,19 @@ The first set of header columns are common to all of the output files generated
* - 85-87
- ANOM_CORR_UNCNTR, :raw-html:`
` ANOM_CORR_UNCNTR_BCL, :raw-html:`
` ANOM_CORR_UNCNTR_BCU
- Uncentered vector Anomaly Correlation excluding mean error including bootstrap upper and lower confidence limits
- * - 88-90
+ * - 88
+ - TOTAL_DIR
+ - Total number of matched pairs for which both the forecast and observation wind directions are well-defined (i.e. non-zero vectors)
+ * - 89-91
- DIR_ME, :raw-html:`
` DIR_ME_BCL, :raw-html:`
` DIR_ME_BCU
- Mean direction difference, from -180 to 180 degrees, including bootstrap upper and lower confidence limits
- * - 91-93
+ * - 92-94
- DIR_MAE, :raw-html:`
` DIR_MAE_BCL, :raw-html:`
` DIR_MAE_BCU
- Mean absolute direction difference including bootstrap upper and lower confidence limits
- * - 94-96
+ * - 95-97
- DIR_MSE, :raw-html:`
` DIR_MSE_BCL, :raw-html:`
` DIR_MSE_BCU
- Mean squared direction difference including bootstrap upper and lower confidence limits
- * - 97-99
+ * - 98-100
- DIR_RMSE, :raw-html:`
` DIR_RMSE_BCL, :raw-html:`
` DIR_RMSE_BCU
- Root mean squared direction difference including bootstrap upper and lower confidence limits
@@ -1490,14 +1501,20 @@ The first set of header columns are common to all of the output files generated
- OBS_QC
- Quality control flag for observation
* - 35
- - CLIMO_MEAN
- - Climatological mean value
+ - OBS_CLIMO_MEAN
+ - Observation climatological mean value (named CLIMO_MEAN prior to met-12.0.0)
* - 36
- - CLIMO_STDEV
- - Climatological standard deviation value
+ - OBS_CLIMO_STDEV
+ - Observation climatological standard deviation value (named CLIMO_STDEV prior to met-12.0.0)
* - 37
- - CLIMO_CDF
- - Climatological cumulative distribution function value
+ - OBS_CLIMO_CDF
+ - Observation climatological cumulative distribution function value (named CLIMO_CDF prior to met-12.0.0)
+ * - 38
+ - FCST_CLIMO_MEAN
+ - Forecast climatological mean value
+ * - 39
+ - FCST_CLIMO_STDEV
+ - Forecast climatological standard deviation value
.. _table_PS_format_info_SEEPS_MPR:
@@ -1534,10 +1551,10 @@ The first set of header columns are common to all of the output files generated
- Quality control flag for observation
* - 31
- FCST_CAT
- - Forecast category to 3 by 3 matrix
+ - Forecast category (dry, light, or heavy)
* - 32
- OBS_CAT
- - Observationtegory to 3 by 3 matrix
+ - Observation category (dry, light, or heavy)
* - 33
- P1
- Climo-derived probability value for this station (dry)
@@ -1546,10 +1563,10 @@ The first set of header columns are common to all of the output files generated
- Climo-derived probability value for this station (dry + light)
* - 35
- T1
- - Threshold 1 for p1
+ - Threshold 1 for P1 (dry)
* - 36
- T2
- - Threshold 2 for p2
+ - Threshold 2 for P2 (dry + light)
* - 37
- SEEPS
- SEEPS (Stable Equitable Error in Probability Space) score
@@ -1574,41 +1591,41 @@ The first set of header columns are common to all of the output files generated
- TOTAL
- Total number of SEEPS matched pairs
* - 26
- - S12
- - Counts multiplied by the weights for FCST_CAT 1 and OBS_CAT 2
+ - ODFL
+ - Counts multiplied by the weights for the observation dry, forecast light category
* - 27
- - S13
- - Counts multiplied by the weights for FCST_CAT 1 and OBS_CAT 3
+ - ODFH
+ - Counts multiplied by the weights for the observation dry, forecast heavy category
* - 28
- - S21
- - Counts multiplied by the weights for FCST_CAT 2 and OBS_CAT 1
+ - OLFD
+ - Counts multiplied by the weights for the observation light, forecast dry category
* - 29
- - S23
- - Counts multiplied by the weights for FCST_CAT 2 and OBS_CAT 3
+ - OLFH
+ - Counts multiplied by the weights for the observation light, forecast heavy category
* - 30
- - S31
- - Counts multiplied by the weights for FCST_CAT 3 and OBS_CAT 1
+ - OHFD
+ - Counts multiplied by the weights for the observation heavy, forecast dry category
* - 31
- - S32
- - Counts multiplied by the weights for FCST_CAT 3 and OBS_CAT 2
+ - OHFL
+ - Counts multiplied by the weights for the observation heavy, forecast light category
* - 32
- PF1
- - marginal probabilities of the forecast values (FCST_CAT 1)
+ - Marginal probabilities of the forecast dry (FCST_CAT 0)
* - 33
- PF2
- - marginal probabilities of the forecast values (FCST_CAT 2)
+ - Marginal probabilities of the forecast light (FCST_CAT 1)
* - 34
- PF3
- - marginal probabilities of the forecast values (FCST_CAT 3)
+ - Marginal probabilities of the forecast heavy (FCST_CAT 2)
* - 35
- PV1
- - marginal probabilities of the observed values (OBS_CAT 1)
+ - Marginal probabilities of the observed dry (OBS_CAT 0)
* - 36
- PV2
- - marginal probabilities of the observed values (OBS_CAT 2)
+ - Marginal probabilities of the observed light (OBS_CAT 1)
* - 37
- PV3
- - marginal probabilities of the observed values (OBS_CAT 3)
+ - Marginal probabilities of the observed heavy (OBS_CAT 2)
* - 38
- SEEPS
- Averaged SEEPS (Stable Equitable Error in Probability Space) score
diff --git a/docs/Users_Guide/reformat_grid.rst b/docs/Users_Guide/reformat_grid.rst
index afee78a7c6..d1bc065073 100644
--- a/docs/Users_Guide/reformat_grid.rst
+++ b/docs/Users_Guide/reformat_grid.rst
@@ -38,6 +38,7 @@ The usage statement for the Pcp-Combine tool is shown below:
out_file
[-field string]
[-name list]
+ [-input_thresh n]
[-vld_thresh n]
[-log file]
[-v level]
@@ -79,13 +80,15 @@ Optional Arguments for pcp_combine
4. The **-name list** option is a comma-separated list of output variable names which override the default choices. If specified, the number of names must match the number of variables to be written to the output file.
-5. The **-vld_thresh n** option overrides the default required ratio of valid data for at each grid point for an output value to be written. The default is 1.0.
+5. The **-input_thresh n** option overrides the default required ratio of valid input files. This option does not apply to the -subtract command where exactly two valid inputs are required. The default is 1.0.
-6. 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.
+6. The **-vld_thresh n** option overrides the default required ratio of valid data at each grid point for an output value to be written. The default is 1.0.
-7. The **-v level** option indicates the desired level of verbosity. The contents 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.
+7. 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.
-8. 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.
+8. The **-v level** option indicates the desired level of verbosity. The contents 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.
+
+9. 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.
Required Arguments for the pcp_combine Sum Command
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/docs/Users_Guide/reformat_point.rst b/docs/Users_Guide/reformat_point.rst
index ec09fa3f83..9be547fad1 100644
--- a/docs/Users_Guide/reformat_point.rst
+++ b/docs/Users_Guide/reformat_point.rst
@@ -41,51 +41,39 @@ pb2nc has both required and optional arguments.
Required Arguments for pb2nc
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-1.
-The **prepbufr_file** argument is the input PrepBUFR file to be processed.
+1. The **prepbufr_file** argument is the input PrepBUFR file to be processed.
-2.
-The **netcdf_file** argument is the output NetCDF file to be written.
+2. The **netcdf_file** argument is the output NetCDF file to be written.
-3.
-The **config_file** argument is the configuration file to be used. The contents of the configuration file are discussed below.
+3. The **config_file** argument is the configuration file to be used. The contents of the configuration file are discussed below.
Optional Arguments for pb2nc
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-1.
-The **-pbfile prepbufr_file** option is used to pass additional input PrepBUFR files.
+1. The **-pbfile prepbufr_file** option is used to pass additional input PrepBUFR files.
-2.
-The **-valid_beg** time option in YYYYMMDD[_HH[MMSS]] format sets the beginning of the retention time window.
+2. The **-valid_beg** time option in YYYYMMDD[_HH[MMSS]] format sets the beginning of the retention time window.
-3.
-The **-valid_end** time option in YYYYMMDD[_HH[MMSS]] format sets the end of the retention time window.
+3. The **-valid_end** time option in YYYYMMDD[_HH[MMSS]] format sets the end of the retention time window.
-4.
-The **-nmsg num_messages** option may be used for testing purposes. This argument indicates that only the first "num_messages" PrepBUFR messages should be processed rather than the whole file. This option is provided to speed up testing because running the PB2NC tool can take a few minutes for each file. Most users will not need this option.
+4. The **-nmsg num_messages** option may be used for testing purposes. This argument indicates that only the first "num_messages" PrepBUFR messages should be processed rather than the whole file. This option is provided to speed up testing because running the PB2NC tool can take a few minutes for each file. Most users will not need this option.
-5.
-The **-dump path** option may be used to dump the entire contents of the PrepBUFR file to several ASCII files written to the directory specified by "path". The user may use this option to view a human-readable version of the input PrepBUFR file, although writing the contents to ASCII files can be slow.
+5. The **-dump path** option may be used to dump the entire contents of the PrepBUFR file to several ASCII files written to the directory specified by "path". The user may use this option to view a human-readable version of the input PrepBUFR file, although writing the contents to ASCII files can be slow.
-6.
-The **-index** option shows the available variables with valid data from the BUFR input. It collects the available variable list from BUFR input and checks the existence of valid data and directs the variable names with valid data to the screen. The NetCDF output won't be generated.
+6. The **-index** option shows the available variables with valid data from the BUFR input. It collects the available variable list from BUFR input and checks the existence of valid data and directs the variable names with valid data to the screen. The NetCDF output won't be generated.
-7.
-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.
+7. 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.
-8.
-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.
+8. 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.
-9.
-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.
+9. 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 pb2nc calling sequence is shown below:
.. code-block:: none
-
- pb2nc sample_pb.blk \
- sample_pb.nc \
- PB2NCConfig
+
+ pb2nc sample_pb.blk \
+ sample_pb.nc \
+ PB2NCConfig
In this example, the PB2NC tool will process the input **sample_pb.blk** file applying the configuration specified in the **PB2NCConfig** file and write the output to a file named **sample_pb.nc**.
@@ -101,11 +89,11 @@ Note that environment variables may be used when editing configuration files, as
____________________
.. code-block:: none
-
- obs_window = { beg = -5400; end = 5400; }
- mask = { grid = ""; poly = ""; }
- tmp_dir = "/tmp";
- version = "VN.N";
+
+ 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`.
The use of temporary files in PB2NC is described in :numref:`Contributor's Guide Section %s `.
@@ -113,47 +101,45 @@ The use of temporary files in PB2NC is described in :numref:`Contributor's Guide
_____________________
.. code-block:: none
-
- message_type = [];
+
+ message_type = [];
Each PrepBUFR message is tagged with one of eighteen message types as listed in the :numref:`config_options` file. The **message_type** refers to the type of observation from which the observation value (or 'report') was derived. The user may specify a comma-separated list of message types to be retained. Providing an empty list indicates that all message types should be retained.
_____________________
-.. code-block:: none
+.. code-block:: none
- message_type_map = [ { key = "AIRCAR"; val = "AIRCAR_PROFILES"; } ];
+ message_type_map = [ { key = "AIRCAR"; val = "AIRCAR_PROFILES"; } ];
The **message_type_map** entry is an array of dictionaries, each containing a **key** string and **val** string. This defines a mapping of input PrepBUFR message types to output message types. This provides a method for renaming input PrepBUFR message types.
_____________________
.. code-block:: none
-
- 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"; }
- ];
+ 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"; }
+ ];
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 defined in the config files for PB2NC, Point-Stat, or Ensemble-Stat. Modify this map to define sets of message types that should be processed together as a group. The **SURFACE** entry must be present to define message types for which surface verification logic should be applied.
_____________________
.. code-block:: none
-
- station_id = [];
+
+ station_id = [];
Each PrepBUFR message has a station identification string associated with it. The user may specify a comma-separated list of station IDs to be retained. Providing an empty list indicates that messages from all station IDs will be retained. It can be a file name containing a list of stations.
_____________________
.. code-block:: none
-
- elevation_range = { beg = -1000; end = 100000; }
+ elevation_range = { beg = -1000; end = 100000; }
The **beg** and **end** variables are used to stratify the elevation (in meters) of the observations to be retained. The range shown above is set to -1000 to 100000 meters, which essentially retains every observation.
@@ -161,11 +147,10 @@ _____________________
.. code-block:: none
- pb_report_type = [];
- in_report_type = [];
- instrument_type = [];
+ pb_report_type = [];
+ in_report_type = [];
+ instrument_type = [];
-
The **pb_report_type, in_report_type**, and **instrument_type** variables are used to specify comma-separated lists of PrepBUFR report types, input report types, and instrument types to be retained, respectively. If left empty, all PrepBUFR report types, input report types, and instrument types will be retained. See the following for more details:
`Code table for PrepBUFR report types used by Regional NAM GSI analyses. `_
@@ -175,19 +160,16 @@ The **pb_report_type, in_report_type**, and **instrument_type** variables are us
_____________________
.. code-block:: none
-
- level_range = { beg = 1; end = 255; }
- level_category = [];
+ level_range = { beg = 1; end = 255; }
+ level_category = [];
The **beg** and **end** variables are used to stratify the model level of observations to be retained. The range shown above is 1 to 255.
-
The **level_category** variable is used to specify a comma-separated list of PrepBUFR data level categories to retain. An empty string indicates that all level categories should be retained. Accepted values and their meanings are described in :numref:`table_reformat-point_pb2nc_level_category`. See the following for more details:
`PrepBUFR mnemonic table. `_
-
.. _table_reformat-point_pb2nc_level_category:
.. list-table:: Values for the level_category option.
@@ -212,17 +194,15 @@ The **level_category** variable is used to specify a comma-separated list of Pre
- Reports on a single level
* - 7
- Auxiliary levels generated via interpolation from spanning levels
-
+
_____________________
.. code-block:: none
-
- obs_bufr_var = [ 'QOB', 'TOB', 'ZOB', 'UOB', 'VOB' ];
+ obs_bufr_var = [ 'QOB', 'TOB', 'ZOB', 'UOB', 'VOB' ];
Each PrepBUFR message will likely contain multiple observation variables. The **obs_bufr_var** variable is used to specify which observation variables should be retained or derived. The observation variable names are retrieved from the BUFR table embedded within the file. Users can run PB2NC with the **-index** command line argument to list out the variable names present in the file, and those names can be listed in this setting. If the list is empty, all BUFR variables present in the file are retained. This setting replaces the deprecated **obs_grib_code**.
-
The example **obs_bufr_var** setting above retains observations of QOB, TOB, ZOB, UOB, and VOB for specific humidity, temperature, height, and the u and v components of winds. Observations of those types are reported at the corresponding POB pressure level. In addition, PB2NC can derive several other variables from these observations. By convention, all observations that are derivable are named with a **D_** prefix:
• **D_DPT** for dew point (from POB and QOB)
@@ -243,39 +223,37 @@ The example **obs_bufr_var** setting above retains observations of QOB, TOB, ZOB
• **D_MLCAPE** for mixed layer convective available potential energy (from POB, QOB, and TOB)
-
In BUFR, lower quality mark values indicate higher quality observations. The quality marks for derived observations are computed as the maximum of the quality marks for its components. For example, **D_DPT** derived from **POB** with quality mark 1 and **QOB** with quality mark 2 is assigned a quality mark value of 2. **D_PBL**, **D_CAPE**, and **D_MLCAPE** are derived using data from multiple vertical levels. Their quality marks are computed as the maximum of their components over all vertical levels.
_____________________
.. code-block:: none
-
- obs_bufr_map = [
- { key = 'POB'; val = 'PRES'; },
- { key = 'QOB'; val = 'SPFH'; },
- { key = 'TOB'; val = 'TMP'; },
- { key = 'ZOB'; val = 'HGT'; },
- { 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_PRMSL'; val = 'PRMSL'; },
- { key = 'D_PBL'; val = 'PBL'; },
- { key = 'D_CAPE'; val = 'CAPE'; }
- { key = 'D_MLCAPE'; val = 'MLCAPE'; }
- ];
+ obs_bufr_map = [
+ { key = 'POB'; val = 'PRES'; },
+ { key = 'QOB'; val = 'SPFH'; },
+ { key = 'TOB'; val = 'TMP'; },
+ { key = 'ZOB'; val = 'HGT'; },
+ { 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_PRMSL'; val = 'PRMSL'; },
+ { key = 'D_PBL'; val = 'PBL'; },
+ { key = 'D_CAPE'; val = 'CAPE'; }
+ { key = 'D_MLCAPE'; val = 'MLCAPE'; }
+ ];
The BUFR variable names are not shared with other forecast data. This map is used to convert the BUFR name to the common name, like GRIB2. It allows to share the configuration for forecast data with PB2NC observation data. If there is no mapping, the BUFR variable name will be saved to output NetCDF file.
_____________________
.. code-block:: none
-
- quality_mark_thresh = 2;
+
+ quality_mark_thresh = 2;
Each observation has a quality mark value associated with it. The **quality_mark_thresh** is used to stratify out which quality marks will be retained. The value shown above indicates that only observations with quality marks less than or equal to 2 will be retained.
@@ -283,51 +261,45 @@ Each observation has a quality mark value associated with it. The **quality_mark
_____________________
.. code-block:: none
-
- event_stack_flag = TOP;
+ event_stack_flag = TOP;
A PrepBUFR message may contain duplicate observations with different quality mark values. The **event_stack_flag** indicates whether to use the observations at the top of the event stack (observation values have had more quality control processing applied) or the bottom of the event stack (observation values have had no quality control processing applied). The flag value of **TOP** listed above indicates the observations with the most amount of quality control processing should be used, the **BOTTOM** option uses the data closest to raw values.
_____________________
.. code-block:: none
-
- time_summary = {
- flag = FALSE;
- raw_data = FALSE;
- beg = "000000";
- end = "235959";
- step = 300;
- width = 600;
- // width = { beg = -300; end = 300; }
- grib_code = [];
- obs_var = [ "TMP", "WDIR", "RH" ];
- type = [ "min", "max", "range", "mean", "stdev", "median", "p80" ];
- vld_freq = 0;
- vld_thresh = 0.0;
- }
+ time_summary = {
+ flag = FALSE;
+ raw_data = FALSE;
+ beg = "000000";
+ end = "235959";
+ step = 300;
+ width = 600;
+ // width = { beg = -300; end = 300; }
+ grib_code = [];
+ obs_var = [ "TMP", "WDIR", "RH" ];
+ type = [ "min", "max", "range", "mean", "stdev", "median", "p80" ];
+ vld_freq = 0;
+ vld_thresh = 0.0;
+ }
The **time_summary** dictionary enables additional processing for observations with high temporal resolution. The **flag** entry toggles the **time_summary** on (**TRUE**) and off (**FALSE**). If the **raw_data** flag is set to TRUE, then both the individual observation values and the derived time summary value will be written to the output. If FALSE, only the summary values are written. Observations may be summarized across the user specified time period defined by the **beg** and **end** entries in HHMMSS format. The **step** entry defines the time between intervals in seconds. The **width** entry specifies the summary interval in seconds. It may either be set as an integer number of seconds for a centered time interval or a dictionary with beginning and ending time offsets in seconds.
-
This example listed above does a 10-minute time summary (width = 600;) every 5 minutes (step = 300;) throughout the day (beg = "000000"; end = 235959";). The first interval will be from 23:55:00 the previous day through 00:04:59 of the current day. The second interval will be from 0:00:00 through 00:09:59. And so on.
-
The two **width** settings listed above are equivalent. Both define a centered 10-minute time interval. Use the **beg** and **end** entries to define uncentered time intervals. The following example requests observations for one hour prior:
.. code-block:: none
-
- width = { beg = -3600; end = 0; }
+ width = { beg = -3600; end = 0; }
-The summaries will only be calculated for the observations specified in the **grib_code** or **obs_var** entries. The **grib_code** entry is an array of integers while the **obs_var** entries is an array of strings. The supported summaries are **min** (minimum), **max** (maximum), **range, mean, stdev** (standard deviation), **median** and **p##** (percentile, with the desired percentile value specified in place of ##). If multiple summaries are selected in a single run, a string indicating the summary method applied will be appended to the output message type.
+The summaries will only be calculated for the observations specified in the **grib_code** or **obs_var** entries. The **grib_code** entry is an array of integers while the **obs_var** entries is an array of strings. The supported summaries are **min** (minimum), **max** (maximum), **range, mean, stdev** (standard deviation), **median** and **p##** (percentile, with the desired percentile value specified in place of ##). If multiple summaries are selected in a single run, a string indicating the summary method applied will be appended to the output message type.
The **vld_freq** and **vld_thresh** entries specify the required ratio of valid data for an output time summary value to be computed. This option is only applied when these entries are set to non-zero values. The **vld_freq** entry specifies the expected frequency of observations in seconds. The width of the time window is divided by this frequency to compute the expected number of observations for the time window. The actual number of valid observations is divided by the expected number to compute the ratio of valid data. An output time summary value will only be written if that ratio is greater than or equal to the **vld_thresh** entry. Detailed information about which observations are excluded is provided at debug level 4.
-
The quality mark for time summaries is always reported by PB2NC as bad data. Time summaries are computed by several MET point pre-processing tools using common library code. While BUFR quality marks are integers, the quality flags for other point data formats (MADIS NetCDF, for example) are stored as strings. MET does not currently contain logic to determine which quality flag strings are better or worse. Note however that any point observation whose quality mark does not meet the **quality_mark_thresh** criteria is not used in the computation of time summaries.
.. _pb2nc output:
@@ -358,14 +330,14 @@ Each NetCDF file generated by the PB2NC tool contains the dimensions and variabl
* - nobs_qty
- Number of unique quality control strings (variable)
* - obs_var_num
- - Number of unique observation variable types (variable)
+ - Number of unique observation variable types (variable)
.. _table_reformat-point_pb2nc_output_vars:
.. list-table:: NetCDF variables in pb2nc output
:widths: auto
:header-rows: 2
-
+
* - pb2nc NetCDF VARIABLES
-
-
@@ -436,7 +408,6 @@ Each NetCDF file generated by the PB2NC tool contains the dimensions and variabl
- obs_var_num, mxstr3
- Lookup table containing a description string for the unique observation variable names in obs_var.
-
ASCII2NC Tool
=============
@@ -454,7 +425,7 @@ While initial versions of the ASCII2NC tool only supported a simple 11 column AS
• `AirNow DailyData_v2, AirNow HourlyData, and AirNow HourlyAQObs formats `_. See the :ref:`MET_AIRNOW_STATIONS` environment variable.
-• `National Data Buoy (NDBC) Standard Meteorlogical Data format `_. See the :ref:`MET_NDBC_STATIONS` environment variable.
+• `National Data Buoy (NDBC) Standard Meteorological Data format `_. See the :ref:`MET_NDBC_STATIONS` environment variable.
• `International Soil Moisture Network (ISMN) Data format `_.
@@ -518,7 +489,7 @@ ascii2nc Usage
Once the ASCII point observations have been formatted as expected, the ASCII file is ready to be processed by the ASCII2NC tool. The usage statement for ASCII2NC tool is shown below:
.. code-block:: none
-
+
Usage: ascii2nc
ascii_file1 [ascii_file2 ... ascii_filen]
netcdf_file
@@ -568,9 +539,9 @@ Optional Arguments for ascii2nc
An example of the ascii2nc calling sequence is shown below:
.. code-block:: none
-
- ascii2nc sample_ascii_obs.txt \
- sample_ascii_obs.nc
+
+ ascii2nc sample_ascii_obs.txt \
+ sample_ascii_obs.nc
In this example, the ASCII2NC tool will reformat the input **sample_ascii_obs.txt file** into NetCDF format and write the output to a file named **sample_ascii_obs.nc**.
@@ -587,7 +558,7 @@ _____________________
.. code-block:: none
- version = "VN.N";
+ version = "VN.N";
The configuration options listed above are common to many MET tools and are described in :numref:`config_options`.
@@ -595,31 +566,28 @@ _____________________
.. code-block:: none
- time_summary = { ... }
-
+ time_summary = { ... }
The **time_summary** feature was implemented to allow additional processing of observations with high temporal resolution, such as SURFRAD data every 5 minutes. This option is described in :numref:`pb2nc configuration file`.
_____________________
.. code-block:: none
-
- message_type_map = [
- { key = "FM-12 SYNOP"; val = "ADPSFC"; },
- { key = "FM-13 SHIP"; val = "SFCSHP"; },
- { key = "FM-15 METAR"; val = "ADPSFC"; },
- { key = "FM-18 BUOY"; val = "SFCSHP"; },
- { key = "FM-281 QSCAT"; val = "ASCATW"; },
- { key = "FM-32 PILOT"; val = "ADPUPA"; },
- { key = "FM-35 TEMP"; val = "ADPUPA"; },
- { key = "FM-88 SATOB"; val = "SATWND"; },
- { key = "FM-97 ACARS"; val = "AIRCFT"; }
- ];
+ message_type_map = [
+ { key = "FM-12 SYNOP"; val = "ADPSFC"; },
+ { key = "FM-13 SHIP"; val = "SFCSHP"; },
+ { key = "FM-15 METAR"; val = "ADPSFC"; },
+ { key = "FM-18 BUOY"; val = "SFCSHP"; },
+ { key = "FM-281 QSCAT"; val = "ASCATW"; },
+ { key = "FM-32 PILOT"; val = "ADPUPA"; },
+ { key = "FM-35 TEMP"; val = "ADPUPA"; },
+ { key = "FM-88 SATOB"; val = "SATWND"; },
+ { key = "FM-97 ACARS"; val = "AIRCFT"; }
+ ];
This entry is an array of dictionaries, each containing a **key** string and **val** string which define a mapping of input strings to output message types. This mapping is currently only applied when converting input little_r report types to output message types.
-
ascii2nc Output
---------------
@@ -627,21 +595,18 @@ The NetCDF output of the ASCII2NC tool is structured in the same way as the outp
"obs_vid" variable is replaced with "obs_gc" when the GRIB code is given instead of the variable names. In this case, the global variable "use_var_id" does not exist or set to false (use_var_id = "false" ;). Three variables (obs_var, obs_units, and obs_desc) related with variable names are not added.
-
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. 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 the MADIS2NC tool is shown below:
.. code-block:: none
-
+
Usage: madis2nc
madis_file [madis_file2 ... madis_filen]
out_file
@@ -658,81 +623,61 @@ The usage statement for the MADIS2NC tool is shown below:
[-v level]
[-compress level]
-
madis2nc has required arguments and can also take optional ones.
-
Required Arguments for madis2nc
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1. The **madis_file** argument is one or more input MADIS point observation files to be processed.
-
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).
-
Optional Arguments for madis2nc
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4. The **-config file** option specifies the configuration file to generate summaries of the fields in the ASCII files.
-
5. The **-qc_dd list** option specifies a comma-separated list of QC flag values to be accepted(Z,C,S,V,X,Q,K,G,B).
-
6. The **-lvl_dim list** option specifies a comma-separated list of vertical level dimensions to be processed.
-
7. To specify the exact records to be processed, the **-rec_beg n** specifies the index of the first MADIS record to process and **-rec_end n** specifies the index of the last MADIS record to process. Both are zero-based.
-
8. The **-mask_grid string** option specifies a named grid or a gridded data file for filtering the point observations spatially.
-
9. The **-mask_poly file** option defines a polyline masking file for filtering the point observations spatially.
-
10. The **-mask_sid file|list** option is a station ID masking file or a comma-separated list of station ID's for filtering the point observations spatially. See the description of the "sid" entry in :numref:`config_options`.
-
11. 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.
-
12. 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 will increase the amount of logging.
-
13. The **-compress level** option specifies the desired level of compression (deflate level) for NetCDF variables. The valid level is between 0 and 9. 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 madis2nc calling sequence is shown below:
.. code-block:: none
-
- madis2nc sample_madis_obs.nc \
- sample_madis_obs_met.nc -log madis.log -v 3
+ madis2nc sample_madis_obs.nc \
+ sample_madis_obs_met.nc -log madis.log -v 3
In this example, the MADIS2NC tool will reformat the input sample_madis_obs.nc file into NetCDF format and write the output to a file named sample_madis_obs_met.nc. Warnings and error messages will be written to the madis.log file, and the verbosity level of logging is three.
-
madis2nc Configuration File
---------------------------
-
The default configuration file for the MADIS2NC tool named **Madis2NcConfig_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 MADIS2NC configuration file is optional and only necessary when defining time summaries. The contents of the default MADIS2NC configuration file are described below.
_____________________
.. code-block:: none
- version = "VN.N";
-
+ version = "VN.N";
The configuration options listed above are common to many MET tools and are described in :numref:`config_options`.
@@ -740,12 +685,10 @@ _____________________
.. code-block:: none
- time_summary = { ... }
-
+ time_summary = { ... }
The **time_summary** dictionary is described in :numref:`pb2nc configuration file`.
-
madis2nc Output
---------------
@@ -753,14 +696,11 @@ The NetCDF output of the MADIS2NC tool is structured in the same way as the outp
"obs_vid" variable is replaced with "obs_gc" when the GRIB code is given instead of the variable names. In this case, the global variable "use_var_id" does not exist or set to false (use_var_id = "false" ;). Three variables (obs_var, obs_units, and obs_desc) related with variable names are not added.
-
LIDAR2NC Tool
=============
-
The LIDAR2NC tool creates a NetCDF point observation file from a CALIPSO HDF data file. Not all of the data present in the CALIPSO file is reproduced in the output, however. Instead, the output focuses mostly on information about clouds (as opposed to aerosols) as seen by the satellite along its ground track.
-
lidar2nc Usage
--------------
@@ -775,19 +715,16 @@ The usage statement for LIDAR2NC tool is shown below:
[-v level]
[-compress level]
-
-Unlike most of the MET tools, lidar2nc does not use a config file. Currently, the options needed to run lidar2nc are not complex enough to require one.
+Unlike most of the MET tools, lidar2nc does not use a config file. Currently, the options needed to run lidar2nc are not complex enough to require one.
Required Arguments for lidar2nc
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1. The **lidar_file** argument is the input HDF lidar data file to be processed. Currently, CALIPSO files are supported but support for additional file types will be added in future releases.
-
2. The **out_file** argument is the NetCDF output file to be written.
-
Optional Arguments for lidar2nc
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -802,13 +739,10 @@ lidar2nc Output
Each observation type in the lidar2nc output is assigned a GRIB code. These are outlined in :numref:`lidar2nc_grib_code_table`. GRIB codes were assigned to these fields arbitrarily, with GRIB codes in the 600s denoting individual bit fields taken from the feature classification flag field in the CALIPSO file.
-
We will not give a detailed description of each CALIPSO data product that lidar2nc reads. Users should refer to existing CALIPSO documentation for this information. We will, however, give some explanation of how the cloud layer base and top information is encoded in the lidar2nc NetCDF output file.
-
**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
@@ -868,21 +802,18 @@ We will not give a detailed description of each CALIPSO data product that lidar2
- 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
@@ -928,12 +859,11 @@ 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 \
+ 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
--------------------------
@@ -946,10 +876,10 @@ _____________________
.. code-block:: none
- obs_window = { beg = -5400; end = 5400; }
- mask = { grid = ""; poly = ""; }
- tmp_dir = "/tmp";
- version = "VN.N";
+ 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`.
@@ -957,15 +887,15 @@ _____________________
.. 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 = { ... }
+ 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`.
@@ -973,22 +903,22 @@ _____________________
.. code-block:: none
- obs_name_map = [];
+ 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,station_ob"; },
- { key = "station_id"; val = "station_id,report_identifier"; },
- { key = "pressure"; val = "air_pressure,pressure"; },
- { key = "height"; val = "height,height_above_mean_sea_level"; },
- { key = "elevation"; val = "elevation,station_elevation"; },
- { key = "nlocs"; val = "Location"; }
- ];
+
+ metadata_map = [
+ { key = "message_type"; val = "msg_type,station_ob"; },
+ { key = "station_id"; val = "station_id,report_identifier"; },
+ { key = "pressure"; val = "air_pressure,pressure"; },
+ { key = "height"; val = "height,height_above_mean_sea_level"; },
+ { key = "elevation"; val = "elevation,station_elevation"; },
+ { key = "nlocs"; val = "Location"; }
+ ];
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.
The "nlocs" is for the dimension name of the locations. The following key can be added: "nstring", "latitude" and "longitude".
@@ -996,11 +926,11 @@ The "nlocs" is for the dimension name of the locations. The following key can be
_____________________
.. code-block:: none
-
- obs_to_qc_map = [
- { key = "wind_from_direction"; val = "eastward_wind,northward_wind"; },
- { key = "wind_speed"; val = "eastward_wind,northward_wind"; }
- ];
+
+ obs_to_qc_map = [
+ { key = "wind_from_direction"; val = "eastward_wind,northward_wind"; },
+ { key = "wind_speed"; val = "eastward_wind,northward_wind"; }
+ ];
This entry is an array of dictionaries, each containing a **key** string and **val** string which define a mapping of QC variable name for IODA data files.
@@ -1008,17 +938,15 @@ _____________________
.. code-block:: none
- missing_thresh = [ <=-1e9, >=1e9, ==-9999 ];
+ 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
===============
@@ -1030,15 +958,15 @@ point2grid Usage
The usage statement for the Point2Grid tool is shown below:
.. code-block:: none
-
+
Usage: point2grid
input_filename
to_grid
output_filename
-field string
[-config file]
- [-qc flags]
- [-adp adp_file_name]
+ [-goes_qc flags]
+ [-adp adp_filename]
[-method type]
[-gaussian_dx n]
[-gaussian_radius n]
@@ -1049,7 +977,6 @@ The usage statement for the Point2Grid tool is shown below:
[-v level]
[-compress level]
-
Required Arguments for point2grid
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -1063,21 +990,20 @@ The MET point observation NetCDF file name as **input_filename** argument is equ
4. The **-field** string argument is a string that defines the data to be regridded. It may be used multiple times. If **-adp** option is given (for AOD data from GOES16/17), the name consists with the variable name from the input data file and the variable name from ADP data file (for example, "AOD_Smoke" or "AOD_Dust": getting AOD variable from the input data and applying smoke or dust variable from ADP data file).
-
Optional Arguments for point2grid
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
5. The **-config** file option is the configuration file to be used.
-6. The **-qc** flags option specifies a comma-separated list of quality control (QC) flags, for example "0,1". This should only be applied if grid_mapping is set to "goes_imager_projection" and the QC variable exists.
+6. The **-goes_qc** flags option specifies a comma-separated list of quality control (QC) flags, for example "0,1". Only used if grid_mapping is set to "goes_imager_projection" and the QC variable exists. Note that the older **-qc** option name is also supported.
-7. The **-adp adp_file_name** option provides an additional Aerosol Detection Product (ADP) information on aerosols, dust, and smoke. This option is ignored if the requested variable is not AOD ("AOD_Dust" or "AOD_Smoke") from GOES16/17. The gridded data is filtered by the presence of dust/smoke. If -qc options are given, it's applied to QC of dust/smoke, too (First filtering with AOD QC values and the second filtering with dust/smoke QC values).
+7. The **-adp adp_filename** option provides an additional Aerosol Detection Product (ADP) information on aerosols, dust, and smoke. This option is ignored if the requested variable is not AOD ("AOD_Dust" or "AOD_Smoke") from GOES16/17. The gridded data is filtered by the presence of dust/smoke. If -goes_qc options are given, it's applied to QC of dust/smoke, too (First filtering with AOD QC values and the second filtering with dust/smoke QC values).
8. The **-method type** option specifies the regridding method. The default method is UW_MEAN.
-9. The **-gaussian_dx n** option defines the distance interval for Gaussian smoothing. The default is 81.271 km. Ignored if the method is not GAUSSIAN or MAXGAUSS.
+9. The **-gaussian_dx n** option specifies the distance interval for Gaussian smoothing. The default is 81.271 km. Only used if the method is GAUSSIAN or MAXGAUSS.
-10. The **-gaussian_radius** n option defines the radius of influence for Gaussian interpolation. The default is 120. Ignored if the method is not GAUSSIAN or MAXGAUSS.
+10. The **-gaussian_radius** n option specifies the radius of influence for Gaussian interpolation. The default is 120. Only used if the method is GAUSSIAN or MAXGAUSS.
11. The **-prob_cat_thresh string** option sets the threshold to compute the probability of occurrence. The default is set to disabled. This option is relevant when calculating practically perfect forecasts.
@@ -1092,30 +1018,43 @@ Optional Arguments for point2grid
16. 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.
Only 4 interpolation methods are applied to the field variables; MIN/MAX/MEDIAN/UW_MEAN. The GAUSSIAN method is applied to the probability variable only. Unlike regrad_data_plane, MAX method is applied to the file variable and Gaussian method to the probability variable with the MAXGAUSS method. If the probability variable is not requested, MAXGAUSS method is the same as MAX method.
-
+
For the GOES-16 and GOES-17 data, the computing lat/long is time consuming. The computed coordinate (lat/long) is saved to a temporary NetCDF file, as described in :numref:`Contributor's Guide Section %s `. The computing lat/long step can be skipped if the coordinate file is given through the environment variable MET_GEOSTATIONARY_DATA. The grid mapping to the target grid is saved to MET_TMP_DIR to save the execution time. Once this file is created, the MET_GEOSTATIONARY_DATA is ignored. The grid mapping file should be deleted manually in order to apply a new MET_GEOSTATIONARY_DATA environment variable or to re-generate the grid mapping file. An example of call point2grid to process GOES-16 AOD data is shown below:
+
+The grid name or the grid definition can be given with the -field option when the grid information is missing from the input NetCDF file for the latitude_longitude projection. The latitude and longitude variable names should be defined by the user, and the grid information from the set_attr_grid is ignored in this case except nx and ny.
+
.. code-block:: none
point2grid \
- OR_ABI-L2-AODC-M3_G16_s20181341702215_e20181341704588_c20181341711418.nc \
- G212 \
- regrid_data_plane_GOES-16_AOD_TO_G212.nc \
- -field 'name="AOD"; level="(*,*)";' \
- -qc 0,1,2
- -method MAX -v 1
+ iceh.2018-01-03.c00.tlat_tlon.nc \
+ G231 \
+ point2grid_cice_to_G231.nc \
+ -config Point2GridConfig_tlat_tlon \
+ -field 'name="hi_d"; level="(0,*,*)"; set_attr_grid="latlon 1440 1080 -79.80672 60.28144 0.04 0.04";' \
+ -v 1
+.. code-block:: none
-When processing GOES-16 data, the **-qc** option may also be used to specify the acceptable quality control flag values. The example above regrids the GOES-16 AOD values to NCEP Grid number 212 (which QC flags are high, medium, and low), writing to the output the maximum AOD value falling inside each grid box.
+ point2grid \
+ OR_ABI-L2-AODC-M3_G16_s20181341702215_e20181341704588_c20181341711418.nc \
+ G212 \
+ regrid_data_plane_GOES-16_AOD_TO_G212.nc \
+ -field 'name="AOD"; level="(*,*)";' \
+ -goes_qc 0,1,2
+ -method MAX -v 1
+
+
+When processing GOES-16 data, the **-goes_qc** option may also be used to specify the acceptable quality control flag values. The example above regrids the GOES-16 AOD values to NCEP Grid number 212 (which QC flags are high, medium, and low), writing to the output the maximum AOD value falling inside each grid box.
Listed below is an example of processing the same set of observations but using Python embedding instead:
.. code-block:: none
-
- point2grid \
- 'PYTHON_NUMPY=MET_BASE/python/examples/read_met_point_obs.py ascii2nc_edr_hourly.20130827.nc' \
- G212 python_gridded_ascii_python.nc -config Point2GridConfig_edr \
- -field 'name="200"; level="*"; valid_time="20130827_205959";' -method MAX -v 1
+
+ point2grid \
+ 'PYTHON_NUMPY=MET_BASE/python/examples/read_met_point_obs.py ascii2nc_edr_hourly.20130827.nc' \
+ G212 python_gridded_ascii_python.nc -config Point2GridConfig_edr \
+ -field 'name="200"; level="*"; valid_time="20130827_205959";' -method MAX -v 1
Please refer to :numref:`Appendix F, Section %s ` for more details about Python embedding in MET.
@@ -1124,25 +1063,18 @@ point2grid Output
The point2grid tool will output a gridded NetCDF file containing the following:
-
1. Latitude
-
2. Longitude
-
3. The variable specified in the -field string regridded to the grid defined in the **to_grid** argument.
-
4. The count field which represents the number of point observations that were included calculating the value of the variable at that grid cell.
-
5. The mask field which is a binary field representing the presence or lack thereof of point observations at that grid cell. A value of "1" indicates that there was at least one point observation within the bounds of that grid cell and a value of "0" indicates the lack of point observations at that grid cell.
-
6. The probability field which is the probability of the event defined by the **-prob_cat_thresh** command line option. The output variable name includes the threshold used to define the probability. Ranges from 0 to 1.
-
7. The probability mask field which is a binary field that represents whether or not there is probability data at that grid point. Can be either "0" or "1" with "0" meaning the probability value does not exist and a value of "1" meaning that the probability value does exist.
For MET observation input and CF complaint NetCDF input with 2D time variable: The latest observation time within the target grid is saved as the observation time. If the "valid_time" is configured at the configuration file, the valid_time from the configuration file is saved into the output file.
@@ -1150,36 +1082,31 @@ For MET observation input and CF complaint NetCDF input with 2D time variable: T
point2grid Configuration File
-----------------------------
-
The default configuration file for the point2grid tool named **Point2GridConfig_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 point2grid configuration file is optional and only necessary when defining the variable name instead of GRIB code or filtering by time. The contents of the default MADIS2NC configuration file are described below.
+The point2grid configuration file is optional and only necessary when defining the variable name instead of GRIB code or filtering by time. The contents of the default point2grid configuration file are described below.
_____________________
.. code-block:: none
- version = "VN.N";
-
+ obs_window = { beg = -5400; end = 5400; }
+ message_type = [];
+ obs_quality_inc = [];
+ obs_quality_exc = [];
+ version = "VN.N";
The configuration options listed above are common to many MET tools and are described in :numref:`config_options`.
_____________________
.. code-block:: none
-
+
valid_time = "YYYYMMDD_HHMMSS";
-This entry is a string to override the obseration time into the output and to filter observation data by time.
+This entry is a string to override the observation time into the output and to filter observation data by time.
-.. code-block:: none
-
- obs_window = {
- beg = -5400;
- end = 5400;
- }
-
-The configuration option listed above is common to many MET tools and are described in :numref:`config_options`.
+_____________________
.. code-block:: none
@@ -1189,11 +1116,14 @@ The configuration option listed above is common to many MET tools and are descri
{ key = "7"; val = "HGT"; }, // GRIB: Geopotential height
{ key = "11"; val = "TMP"; }, // GRIB: Temperature
{ key = "15"; val = "TMAX"; }, // GRIB: Max Temperature
- ...
+ ...
+ { key = "lat_vname"; val = "NLAT"; }, // NetCDF latitude variable name
+ { key = "lon_vname"; val = "NLON"; }, // NetCDF longitude varialbe name
+ ...
]
-
-This entry is an array of dictionaries, each containing a **GRIB code** string and mathcing **variable name** string which define a mapping of GRIB code to the output variable names.
+This entry is an array of dictionaries, each containing a **GRIB code** string and matching **variable name** string which define a mapping of GRIB code to the output variable names.
+The latitude and longitude variables for NetCDF input can be overridden by the configurations. There are two special keys, **lat_vname** and **lon_vname**, are applied to the NetCDF input, not for a GRIB code.
Point NetCDF to ASCII Python Utility
====================================
diff --git a/docs/Users_Guide/release-notes.rst b/docs/Users_Guide/release-notes.rst
index c8f2fb0f2c..19e635afbe 100644
--- a/docs/Users_Guide/release-notes.rst
+++ b/docs/Users_Guide/release-notes.rst
@@ -9,6 +9,76 @@ When applicable, release notes are followed by the GitHub issue number which des
enhancement, or new feature (`MET GitHub issues `_).
Important issues are listed **in bold** for emphasis.
+MET Version 12.0.0-beta6 Release Notes (20241018)
+-------------------------------------------------
+
+ .. dropdown:: Repository, build, and test
+
+ * Update METbaseimage to use newer versions of Atlas and ecKit (`METbaseimage#27 `_).
+ * MET: Enhance the MET testing framework to provide a mechanism for expected failure (`METplus-Internal#23 `_).
+ * Fix the SonarQube findings for MET version 12.0.0 (`#2673 `_).
+ * Enhance the `unit.py` MET testing script to allow for expected failures (`#2937 `_).
+ * Modify configure.ac to define C++17 as the default compilation standard (`#2948 `_).
+
+ .. dropdown:: Bugfixes
+
+ * Bugfix: Fix Point2Grid processing of GFS Ocean data input (`#2936 `_).
+ * **Bugfix: Fix contingency table statistic bugs in the CTS and NBRCTS line types for BAGSS, SEDI CI's, ORSS, and ORSS CI's** (`#2958 `_).
+ * Bugfix: Fix the grid dimensions used for `point2grid_cice_set_attr_grid` unit test (`#2968 `_).
+ * Bugfix: Fix MTD to run on any MET-supported grid projection (`#2979 `_).
+
+ .. dropdown:: Enhancements
+
+ * **Enhance Series-Analysis to read its own output and incrementally update output statistics over time** (`#1371 `_).
+ * Enhance the `set_attr_grid` processing logic to support input files lacking a grid definition (`#1729 `_).
+ * **Add support for new point_weight_flag to the Point-Stat and Ensemble-Stat tools** (`#2279 `_).
+ * Allow observation anomaly replacement in Anomaly Correlation Coefficient (ACC) calculation (`#2308 `_).
+ * Enhance Point2Grid to filter quality control strings with config file options (`#2880 `_).
+ * Refine SEEPS processing logic and output naming conventions (`#2882 `_).
+ * **Enhance MET to calculate weighted contingency table counts and statistics** (`#2887 `_).
+ * Enhance the OBTYPE header column for MPR and ORANK line types (`#2893 `_).
+ * **Enhance MET to support separate climatology datasets for both the forecast and observation inputs** (`#2924 `_).
+ * Refine PB2NC warning messages about changing Bufr center times (`#2938 `_).
+
+ .. dropdown:: Documentation
+
+ * Remove the double-quotes around keywords (`#2023 `_).
+ * Documentation: Provide instructions for compiling MET with the C++11 standard (`#2949 `_).
+
+MET Version 12.0.0-beta5 Release Notes (20240710)
+-------------------------------------------------
+
+ .. dropdown:: Repository, build, and test
+
+ * Reimplement and enhance the Perl-based (unit.pl) unit test control script in Python (`#2717 `_).
+ * Update compilation script and configuration files as needed for supported platforms (`#2753 `_).
+ * Update tag used for the release checksum action (`#2929 `_).
+
+ .. dropdown:: Bugfixes
+
+ * Bugfix (METbaseimage): Fix the environment to correct the ncdump runtime linker error (`METbaseimage#24 `_).
+ * Bugfix: Fix the Grid-Stat configuration file to support the MET_SEEPS_GRID_CLIMO_NAME option (`#2601 `_).
+ * **Bugfix: Fix TC-RMW to correct the tangential and radial wind computations** (`#2841 `_).
+ * Bugfix: Fix Ensemble-Stat's handling of climo data when verifying ensemble-derived probabilities (`#2856 `_).
+ * **Bugfix: Fix Point2Grid's handling of the -qc option for ADP input files** (`#2867 `_).
+ * Bugfix: Fix Stat-Analysis errors for jobs using the -dump_row option and the -line_type option with VCNT, RPS, DMAP, or SSIDX (`#2888 `_).
+ * Bugfix: Fix inconsistent handling of point observation valid times processed through Python embedding (`#2897 `_).
+
+ .. dropdown:: Enhancements
+
+ * **Add new wind direction verification statistics for RMSE, Bias, and MAE** (`#2395 `_).
+ * Document UGRID configuration options added to Point-Stat and Grid-Stat (`#2748 `_
+ * Refine Point-Stat Warning message about fcst/obs level mismatch (`#2795 `_).
+ * **Add new -ugrid_config command line option for unstructured grid inputs to Grid-Stat and Point-Stat** (`#2842 `_).
+ * Enhance Point2Grid to support modified quality control settings for smoke/dust AOD data in GOES-16/17 as of April 16, 2024 (`#2853 `_).
+ * **Enhance Point2Grid to support a wider variety of input tripolar datasets** (`#2857 `_).
+ * Test NOAA Unstructured grids in MET-12.0.0 (`#2860 `_).
+ * Enhance Ensemble-Stat and Gen-Ens-Prod to omit warning messages for the MISSING keyword (`#2870 `_).
+ * Add new Python functionality to convert MET NetCDF observation data to a Pandas DataFrame (`#2781 `_).
+ * Enhance PCP-Combine to allow missing data (`#2883 `_).
+ * Enhance TC-Stat to support the -set_hdr job command option (`#2911 `_).
+ * Refine ERROR messages written by PB2NC (`#2912 `_).
+
MET Version 12.0.0-beta4 Release Notes (20240417)
-------------------------------------------------
diff --git a/docs/Users_Guide/series-analysis.rst b/docs/Users_Guide/series-analysis.rst
index 0be681585f..ed9f5578ab 100644
--- a/docs/Users_Guide/series-analysis.rst
+++ b/docs/Users_Guide/series-analysis.rst
@@ -33,6 +33,7 @@ The usage statement for the Series-Analysis tool is shown below:
-fcst file_1 ... file_n | fcst_file_list
-obs file_1 ... file_n | obs_file_list
[-both file_1 ... file_n | both_file_list]
+ [-aggr file]
[-paired]
-out file
-config file
@@ -58,13 +59,17 @@ Optional Arguments for series_analysis
5. To set both the forecast and observations to the same set of files, use the optional -both file_1 ... file_n | both_file_list option to the same set of files. This is useful when reading the NetCDF matched pair output of the Grid-Stat tool which contains both forecast and observation data.
-6. The -paired option indicates that the -fcst and -obs file lists are already paired, meaning there is a one-to-one correspondence between the files in those lists. This option affects how missing data is handled. When -paired is not used, missing or incomplete files result in a runtime error with no output file being created. When -paired is used, missing or incomplete files result in a warning with output being created using the available data.
+6. The -aggr option specifies the path to an existing Series-Analysis output file. When computing statistics for the input forecast and observation data, Series-Analysis aggregates the partial sums (SL1L2, SAL1L2 line types) and contingency table counts (CTC, MCTC, and PCT line types) with data provided in the aggregate file. This option enables Series-Analysis to run iteratively and update existing partial sums, counts, and statistics with new data.
-7. The -log file outputs log messages to the specified file.
+.. note:: When the -aggr option is used, only statistics that are derivable from partial sums and contingency table counts can be requested. Runtimes are generally much slower when aggregating data since it requires many additional NetCDF variables containing the scalar partial sums and contingency table counts to be read and written.
-8. The -v level overrides the default level of logging (2).
+7. The -paired option indicates that the -fcst and -obs file lists are already paired, meaning there is a one-to-one correspondence between the files in those lists. This option affects how missing data is handled. When -paired is not used, missing or incomplete files result in a runtime error with no output file being created. When -paired is used, missing or incomplete files result in a warning with output being created using the available data.
-9. 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.
+8. The -log file outputs log messages to the specified file.
+
+9. The -v level overrides the default level of logging (2).
+
+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 series_analysis calling sequence is shown below:
@@ -179,3 +184,5 @@ The output_stats array controls the type of output that the Series-Analysis tool
11. PJC for Joint and Conditional factorization for Probabilistic forecasts (See :numref:`table_PS_format_info_PJC`)
12. PRC for Receiver Operating Characteristic for Probabilistic forecasts (See :numref:`table_PS_format_info_PRC`)
+
+.. note:: When the -input option is used, all partial sum and contingency table count columns are required to aggregate statistics across multiple runs. To facilitate this, the output_stats entries for the CTC, SL1L2, SAL1L2, and PCT line types can be set to "ALL" to indicate that all available columns for those line types should be written.
diff --git a/docs/Users_Guide/stat-analysis.rst b/docs/Users_Guide/stat-analysis.rst
index 92672edc26..0b87586d09 100644
--- a/docs/Users_Guide/stat-analysis.rst
+++ b/docs/Users_Guide/stat-analysis.rst
@@ -324,7 +324,7 @@ The configuration file for the Stat-Analysis tool is optional. Users may find it
Most of the user-specified parameters listed in the Stat-Analysis configuration file are used to filter the ASCII statistical output from the MET statistics tools down to a desired subset of lines over which statistics are to be computed. Only output that meets all of the parameters specified in the Stat-Analysis configuration file will be retained.
-The Stat-Analysis tool actually performs a two step process when reading input data. First, it stores the filtering information defined top section of the configuration file. It applies that filtering criteria when reading the input STAT data and writes the filtered data out to a temporary file, as described in :numref:`Contributor's Guide Section %s `. Second, each job defined in the **jobs** entry reads data from that temporary file and performs the task defined for the job. After all jobs have run, the Stat-Analysis tool deletes the temporary file.
+The Stat-Analysis tool actually performs a two step process when reading input data. First, it stores the filtering information in the defined top section of the configuration file. It applies that filtering criteria when reading the input STAT data and writes the filtered data out to a temporary file, as described in :numref:`Contributor's Guide Section %s `. Second, each job defined in the **jobs** entry reads data from that temporary file and performs the task defined for the job. After all jobs have run, the Stat-Analysis tool deletes the temporary file.
This two step process enables the Stat-Analysis tool to run more efficiently when many jobs are defined in the configuration file. If only operating on a small subset of the input data, the common filtering criteria can be applied once rather than re-applying it for each job. In general, filtering criteria common to all tasks defined in the **jobs** entry should be moved to the top section of the configuration file.
diff --git a/docs/Users_Guide/tc-diag.rst b/docs/Users_Guide/tc-diag.rst
index 4f1d4630ee..edcafa62dd 100644
--- a/docs/Users_Guide/tc-diag.rst
+++ b/docs/Users_Guide/tc-diag.rst
@@ -15,7 +15,7 @@ Originally developed for the Statistical Hurricane Intensity Prediction Scheme (
TC-Diag is run once for each initialization time to produce diagnostics for each user-specified combination of TC tracks and model fields. The user provides track data (such as one or more ATCF a-deck track files), along with track filtering criteria as needed, to select one or more tracks to be processed. The user also provides gridded model data from which diagnostics should be computed. Gridded data can be provided for multiple concurrent storms, multiple models, and/or multiple domains (i.e. parent and nest) in a single run.
-TC-Diag first determines the list of valid times that appear in any one of the tracks. For each valid time, it processes all track points for that time. For each track point, it reads the gridded model fields requested in the configuration file and transforms the gridded data to a range-azimuth cylindrical coordinates grid. For each domain, it writes the range-azimuth data to a temporary NetCDF file, as described in :numref:`Contributor's Guide Section %s `.
+TC-Diag first determines the list of valid times that appear in any one of the tracks. For each valid time, it processes all track points for that time. For each track point, it reads the gridded model fields requested in the configuration file and transforms the gridded data to a range-azimuth cylindrical coordinates grid, as described for the TC-RMW tool in :numref:`tc-rmw`. For each domain, it writes the range-azimuth data to a temporary NetCDF file, as described in :numref:`Contributor's Guide Section %s `.
Once the input data have been processed into the temporary NetCDF files, TC-Diag then calls one or more Python diagnostics scripts, as specified in the configuration file, to compute tropical cyclone diagnostic values. The computed diagnostics values are retrieved from the Python script and stored in memory.
diff --git a/docs/Users_Guide/tc-pairs.rst b/docs/Users_Guide/tc-pairs.rst
index c7a56a05ff..cc1c7dc2cd 100644
--- a/docs/Users_Guide/tc-pairs.rst
+++ b/docs/Users_Guide/tc-pairs.rst
@@ -211,7 +211,7 @@ The **consensus** array allows users to derive consensus forecasts from any numb
- The **members** field is a comma-separated array of model ID stings which define the members of the consensus.
- The **required** field is a comma-separated array of true/false values associated with each consensus member. If a member is designated as true, that member must be present in order for the consensus to be generated. If a member is false, the consensus will be generated regardless of whether or not the member is present. The required array can either be empty or have the same length as the members array. If empty, it defaults to all false.
- 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.
-- Tropical cyclone diagnostics, if provided on the command line, are included in the computation of consensus tracks. The consensus diagnostics are computed as the mean of the diagnostics for the members. The **diag_required** and **min_diag_req** entries apply the same logic described above, but to the computation of each consensus diagnostic value rather than the consensus track location and intensity. If **diag_required** is missing or an empty list, it defaults to all false. If **min_diag_req** is missing, it default to 0.
+- Tropical cyclone diagnostics, if provided on the command line, are included in the computation of consensus tracks. The consensus diagnostics are computed as the mean of the diagnostics for the members. The **diag_required** and **min_diag_req** entries apply the same logic described above, but to the computation of each consensus diagnostic value rather than the consensus track location and intensity. If **diag_required** is missing or an empty list, it defaults to all false. If **min_diag_req** is missing, it defaults to 0.
- The **write_members** field is a boolean that indicates whether or not to write track output for the individual consensus members. If set to true, standard output will show up for all members. If set to false, output for the consensus members is excluded from the output, even if they are used to define other consensus tracks in the configuration file.
Users should take care to avoid filtering out track data for the consensus members with the **model** field, described above. Either set **model** to an empty list to process all input track data or include all of the consensus members in the **model** list. Use the **write_members** field, not the **model** field, to suppress track output for consensus members.
diff --git a/docs/Users_Guide/tc-rmw.rst b/docs/Users_Guide/tc-rmw.rst
index 82628c087c..5f226cc76a 100644
--- a/docs/Users_Guide/tc-rmw.rst
+++ b/docs/Users_Guide/tc-rmw.rst
@@ -7,7 +7,7 @@ TC-RMW Tool
Introduction
============
-The TC-RMW tool regrids tropical cyclone model data onto a moving range-azimuth grid centered on points along the storm track provided in ATCF format, most likely the adeck generated from the file. The radial grid spacing may be set as a factor of the radius of maximum winds (RMW). If wind fields are specified in the configuration file the radial and tangential wind components will be computed. Any regridding method available in MET can be used to interpolate data on the model output grid to the specified range-azimuth grid. The regridding will be done separately on each vertical level. The model data files must coincide with track points in a user provided ATCF formatted track file.
+The TC-RMW tool regrids tropical cyclone model data onto a moving range-azimuth grid centered on points along the storm track provided in ATCF format, most likely the adeck generated from the file. The radial grid spacing can be defined in kilometers or as a factor of the radius of maximum winds (RMW). The azimuthal grid spacing is defined in degrees clockwise from due east. If wind vector fields are specified in the configuration file, the radial and tangential wind components will be computed. Any regridding method available in MET can be used to interpolate data on the model output grid to the specified range-azimuth grid. The regridding will be done separately on each vertical level. The model data files must coincide with track points in a user provided ATCF formatted track file.
Practical Information
=====================
diff --git a/docs/Users_Guide/tc-stat.rst b/docs/Users_Guide/tc-stat.rst
index bdcbc35327..3cddda63f2 100644
--- a/docs/Users_Guide/tc-stat.rst
+++ b/docs/Users_Guide/tc-stat.rst
@@ -400,6 +400,8 @@ The output generated from the TC-Stat tool contains statistics produced by the a
This job command finds and filters TCST lines down to those meeting the criteria selected by the filter's options. The filtered TCST lines are written to a file specified by the **-dump_row** option. The TCST output from this job follows the TCST output description in :numref:`tc-dland` and :numref:`tc-pairs`.
+ The "-set_hdr" job command option can be used to override any of the output header strings (e.g. "-set_hdr DESC EVENT_EQUAL" sets the output DESC column to "EVENT_EQUAL").
+
**Job: Summary**
This job produces summary statistics for the column name specified by the **-column** option. The output of the summary job consists of three rows:
@@ -475,6 +477,18 @@ Users may also specify the **-out_alpha** option to define the alpha value for t
Users may also specify the **-out_stat** option to write the contingency table counts and statistics (for the CTC and CTS output line types) to an output STAT file. Information about the RIRW timing information and filtering criteria are written to the STAT header columns while the contingency table counts and/or statistics are written to the CTC and/or CTS output columns.
+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.
+
+.. code-block:: none
+
+ -job rirw -line_type TCMPR -by CYCLONE -out_stat ctc.stat -set_hdr DESC CYCLONE
+
+When using multiple "-by" options, use "CASE" to reference the full case information string.
+
+.. code-block:: none
+
+ -job rirw -line_type TCMPR -by CYCLONE,LEAD -out_stat ctc.stat -set_hdr DESC CASE
+
**Job: PROBRIRW**
The PROBRIRW job produces probabilistic contingency table counts and statistics defined by placing forecast probabilities and BEST track rapid intensification events into an Nx2 contingency table. Users may specify several job command options to configure the behavior of this job:
diff --git a/docs/conf.py b/docs/conf.py
index 3a135308ab..659a095b96 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -20,11 +20,11 @@
project = 'MET'
author = 'UCAR/NCAR, NOAA, CSU/CIRA, and CU/CIRES'
author_list = 'Prestopnik, J., H. Soh, L. Goodrich, B. Brown, R. Bullock, J. Halley Gotway, K. Newman, J. Opatz, T. Jensen'
-version = '12.0.0-beta4'
+version = '12.0.0-beta6'
verinfo = version
release = f'{version}'
release_year = '2024'
-release_date = f'{release_year}-04-17'
+release_date = f'{release_year}-10-18'
copyright = f'{release_year}, {author}'
# -- General configuration ---------------------------------------------------
diff --git a/internal/scripts/docker/Dockerfile b/internal/scripts/docker/Dockerfile
index c5daf58492..c7a2ca5bdd 100644
--- a/internal/scripts/docker/Dockerfile
+++ b/internal/scripts/docker/Dockerfile
@@ -1,5 +1,5 @@
ARG MET_BASE_REPO=met-base
-ARG MET_BASE_TAG=v3.2
+ARG MET_BASE_TAG=v3.3
FROM dtcenter/${MET_BASE_REPO}:${MET_BASE_TAG}
MAINTAINER John Halley Gotway
diff --git a/internal/scripts/docker/Dockerfile.copy b/internal/scripts/docker/Dockerfile.copy
index 4d3d9476cd..51ae55ec3a 100644
--- a/internal/scripts/docker/Dockerfile.copy
+++ b/internal/scripts/docker/Dockerfile.copy
@@ -1,5 +1,5 @@
ARG MET_BASE_REPO=met-base-unit-test
-ARG MET_BASE_TAG=v3.2
+ARG MET_BASE_TAG=v3.3
FROM dtcenter/${MET_BASE_REPO}:${MET_BASE_TAG}
MAINTAINER John Halley Gotway
diff --git a/internal/scripts/docker/Dockerfile.sonarqube b/internal/scripts/docker/Dockerfile.sonarqube
index 75dc3c952c..7a6a7114f5 100644
--- a/internal/scripts/docker/Dockerfile.sonarqube
+++ b/internal/scripts/docker/Dockerfile.sonarqube
@@ -1,5 +1,5 @@
ARG MET_BASE_REPO=met-base
-ARG MET_BASE_TAG=v3.2
+ARG MET_BASE_TAG=v3.3
FROM dtcenter/${MET_BASE_REPO}:${MET_BASE_TAG}
MAINTAINER John Halley Gotway
@@ -9,7 +9,7 @@ MAINTAINER John Halley Gotway
# SonarQube static code analysis on the specified branch or tag.
# https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/
#
-ARG SONAR_SCANNER_VERSION=5.0.1.3006
+ARG SONAR_SCANNER_VERSION=6.1.0.4477
ARG SONAR_HOST_URL
ARG SONAR_TOKEN
ARG SOURCE_BRANCH
diff --git a/internal/scripts/docker/build_met_sonarqube.sh b/internal/scripts/docker/build_met_sonarqube.sh
index 2eea05654e..78163b5379 100755
--- a/internal/scripts/docker/build_met_sonarqube.sh
+++ b/internal/scripts/docker/build_met_sonarqube.sh
@@ -100,6 +100,7 @@ time_command ./configure \
BUFRLIB_NAME=${BUFRLIB_NAME} \
GRIB2CLIB_NAME=${GRIB2CLIB_NAME} \
--enable-all \
+ MET_CXX_STANDARD=11 \
CPPFLAGS="-I/usr/local/include -I/usr/local/include/freetype2 -I/usr/local/include/cairo" \
LIBS="-ltirpc"
diff --git a/internal/scripts/environment/development.seneca b/internal/scripts/environment/development.seneca
index 7007241362..4f15f6ff73 100644
--- a/internal/scripts/environment/development.seneca
+++ b/internal/scripts/environment/development.seneca
@@ -46,7 +46,7 @@ export MET_TEST_INPUT=${MET_PROJ_DIR}/MET_test_data/unit_test
export MET_FONT_DIR=${MET_TEST_INPUT}/fonts
# Define Rscript to use a version with the ncdf4 package 1.17 or later
-export MET_TEST_RSCRIPT=/nrit/ral/R-4.3.1/bin/Rscript
+export MET_TEST_RSCRIPT=/nrit/ral/R-4.4.0/bin/Rscript
# Define runtime Python version
export MET_TEST_MET_PYTHON_EXE=${MET_PYTHON_BIN_EXE}
diff --git a/internal/scripts/installation/compile_MET_all.sh b/internal/scripts/installation/compile_MET_all.sh
index 6524aa8563..2497e582a8 100755
--- a/internal/scripts/installation/compile_MET_all.sh
+++ b/internal/scripts/installation/compile_MET_all.sh
@@ -640,7 +640,11 @@ if [ $COMPILE_ECKIT -eq 1 ]; then
# Need to obtain ecbuild before installing eckit
- vrs="3.5.0"
+ if [[ ! -z ${MET_CXX_STANDARD} && ${MET_CXX_STANDARD} -le 14 ]]; then
+ vrs="3.5.0"
+ elif [[ -z ${MET_CXX_STANDARD} ]]; then
+ vrs="3.7.0"
+ fi
echo
echo "Compiling ECBUILD at `date`"
@@ -652,9 +656,13 @@ if [ $COMPILE_ECKIT -eq 1 ]; then
run_cmd "mkdir build; cd build"
run_cmd "cmake ../ -DCMAKE_INSTALL_PREFIX=${LIB_DIR} > $(pwd)/ecbuild.cmake.log 2>&1"
run_cmd "make ${MAKE_ARGS} install > $(pwd)/ecbuild.make_install.log 2>&1"
-
- vrs="1.20.2"
+ if [[ ! -z ${MET_CXX_STANDARD} && ${MET_CXX_STANDARD} -le 14 ]]; then
+ vrs="1.20.2"
+ elif [[ -z ${MET_CXX_STANDARD} ]]; then
+ vrs="1.24.4"
+ fi
+
echo
echo "Compiling ECKIT at `date`"
mkdir -p ${LIB_DIR}/eckit
@@ -671,7 +679,11 @@ fi
# Compile ATLAS
if [ $COMPILE_ATLAS -eq 1 ]; then
- vrs="0.30.0"
+ if [[ ! -z ${MET_CXX_STANDARD} && ${MET_CXX_STANDARD} -le 14 ]]; then
+ vrs="0.30.0"
+ elif [[ -z ${MET_CXX_STANDARD} ]]; then
+ vrs="0.35.0"
+ fi
echo
echo "Compiling ATLAS at `date`"
@@ -862,9 +874,11 @@ if [ -z ${MET_PROJ} ]; then
export MET_PROJ=${LIB_DIR}
fi
-export MET_PYTHON_BIN_EXE=${MET_PYTHON_BIN_EXE:=${MET_PYTHON}/bin/python3}
-export MET_PYTHON_LD
-export MET_PYTHON_CC
+if [[ ! -z ${MET_PYTHON_CC} || ! -z ${MET_PYTHON_LD} ]]; then
+ export MET_PYTHON_BIN_EXE=${MET_PYTHON_BIN_EXE:=${MET_PYTHON}/bin/python3}
+ export MET_PYTHON_LD
+ export MET_PYTHON_CC
+fi
# add flags to user-defined LDFLAGS for MacOS
if [[ $machine != "Mac" ]]; then
diff --git a/internal/scripts/installation/compile_MET_all.wcoss_beta5.sh b/internal/scripts/installation/compile_MET_all.wcoss_beta5.sh
new file mode 100755
index 0000000000..5065643c84
--- /dev/null
+++ b/internal/scripts/installation/compile_MET_all.wcoss_beta5.sh
@@ -0,0 +1,959 @@
+#!/bin/bash
+#
+# Compile and install MET
+# (Model Evaluation Tools)
+#================================================
+#
+# This compile_MET_all.sh script expects certain environment
+# variables to be set:
+# TEST_BASE, COMPILER (or COMPILER_FAMILY and COMPILER_VERSION),
+# MET_SUBDIR, MET_TARBALL, and USE_MODULES.
+#
+# If compiling support for Python embedding, users will need to
+# set MET_PYTHON, MET_PYTHON_BIN_EXE, MET_PYTHON_CC, and MET_PYTHON_LD.
+# Users can directly set the python module to be loaded by setting
+# either PYTHON_MODULE or by setting PYTHON_NAME and PYTHON_VERSION:
+# - PYTHON_MODULE (only used if USE_MODULES=TRUE) - format is the name
+# of the Python module to load followed by an underscore and then the
+# version number (e.g. python_3.10.4, The script will then run "module
+# load python/3.10.4")
+# - PYTHON_NAME = python (or e.g. python3, etc.)
+# - PYTHON_VERSION = 3.10.4
+#
+# For a description of these and other variables, visit the MET
+# downloads page under "Sample Script For Compiling External
+# Libraries And MET":
+# https://dtcenter.org/community-code/model-evaluation-tools-met/download
+#
+# An easy way to set these necessary environment variables is
+# in an environment configuration file (for example,
+# install_met_env.). This script and example
+# environment config files for various machines can be found in
+# the MET GitHub repository in the scripts/installation directory:
+# https://github.com/dtcenter/MET
+#
+# USAGE: compile_MET_all.sh install_met_env.
+#
+# The compile_MET_all.sh script will compile and install MET and its
+# external library dependencies, if needed, including:
+# PROJ (with dependency SQLITE >= 3.11), GSL, BUFRLIB,
+# GRIB2C (with dependencies Z, PNG, JASPER, JPEG), HDF5, NETCDF (C and CXX),
+# HDF4 (optional for MODIS-Regrid and lidar2nc), HDFEOS (optional for
+# MODIS-Regrid and lidar2nc), FREETYPE (optional for MODE Graphics),
+# and CAIRO (optional for MODE Graphics).
+#
+# If these libraries have already been installed and don't need to be
+# reinstalled or if you are compiling on a machine that uses modulefiles
+# and you'd like to make use of the existing dependent libraries on
+# your machine, there are more environment variables that you will
+# need to set to let MET know where the library and header files are.
+# Please supply values for the following environment variables
+# in the input environment configuration file (install_met_env.:
+# MET_GRIB2CLIB, MET_GRIB2CINC, GRIB2CLIB_NAME, MET_BUFRLIB, BUFRLIB_NAME,
+# MET_HDF5, MET_NETCDF, MET_PROJ, MET_GSL, LIB_JASPER, LIB_LIBPNG, LIB_Z,
+# LIB_JPEG, SQLITE_INCLUDE_DIR, SQLITE_LIB_DIR, TIFF_INCLUDE_DIR, TIFF_LIB_DIR.
+#
+# The optional libraries ecKit and atlas offer support for unstructured
+# grids. The optional libraries HDF4, HDFEOS, FREETYPE, and CAIRO are
+# used for the following, not widely used tools, MODIS-Regrid,
+# lidar2nc, and MODE Graphics. To enable building of these libraries,
+# set the compile flags for the library (e.g. COMPILE_ECKIT, COMPILE_ATLAS,
+# COMPILE_HDF, COMPILE_HDFEOS) to any value in the environment config
+# file. If these libraries have already been installed and don't need
+# to be reinstalled, please supply values for the following environment
+# variables in the input environment configuration file
+# (install_met_env.): MET_ECKIT, MET_ATLAS, MET_HDF,
+# MET_HDFEOS, MET_FREETYPEINC, MET_FREETYPELIB, MET_CAIROINC,
+# MET_CAIROLIB.
+#
+# Users can speed up the compilation of MET and its dependent libraries
+# by adding the following to their environment configuration file:
+# export MAKE_ARGS=-j #
+# replacing the # with the number of cores to use (integer) or simply
+# specifying:
+# export MAKE_ARGS=-j
+# with no integer argument to start as many processes in parallel as
+# possible.
+#================================================
+
+# print command, run it, then error and exit if non-zero value is returned
+function run_cmd {
+ echo $*
+ eval "$@"
+ ret=$?
+ if [ $ret != 0 ]; then
+ echo "ERROR: Command returned with non-zero ($ret) status: $*"
+ exit $ret
+ fi
+}
+
+if [ -z $1 ]; then
+ echo
+ echo "No environment configuration file provided (e.g. install_met_env.). Starting compilation with current environment."
+else
+ if [ ! -f "$1" ]; then
+ echo "The file \"$1\" does not exist!"
+ exit 1
+ fi
+
+ source $1
+fi
+
+echo
+echo "TEST_BASE = ${TEST_BASE? "ERROR: TEST_BASE must be set"}"
+echo "MET_SUBDIR = ${MET_SUBDIR? "ERROR: MET_SUBDIR must be set"}"
+echo "MET_TARBALL = ${MET_TARBALL? "ERROR: MET_TARBALL must be set"}"
+echo "USE_MODULES = ${USE_MODULES? "ERROR: USE_MODULES must be set to TRUE if using modules or FALSE otherwise"}"
+if [[ -z "$COMPILER" ]] && [[ -z "$COMPILER_FAMILY" && -z "$COMPILER_VERSION" ]]; then
+ echo "ERROR: COMPILER or COMPILER_FAMILY and COMPILER_VERSION must be set"
+ exit 1
+fi
+echo ${MAKE_ARGS:+MAKE_ARGS = $MAKE_ARGS}
+
+
+LIB_DIR=${TEST_BASE}/external_libs
+MET_DIR=${MET_SUBDIR}
+
+if [ -z "${BIN_DIR_PATH}" ]; then
+ if [ -z "${MET_INSTALL_DIR}" ]; then
+ BIN_DIR_PATH=${TEST_BASE}/bin
+ else
+ BIN_DIR_PATH=${MET_INSTALL_DIR}/bin
+ fi
+fi
+
+if [ -z "${MET_INSTALL_DIR}" ]; then
+ MET_INSTALL_DIR=${MET_DIR}
+else
+ LIB_DIR=${MET_INSTALL_DIR}
+fi
+
+TAR_DIR=${TEST_BASE}/tar_files
+MET_TARBALL=${TAR_DIR}/${MET_TARBALL}
+
+# Create directory for libraries
+mkdir -p ${LIB_DIR}
+
+# Check that tar files exist
+if [ ! -e $TAR_DIR ]; then
+ echo "TAR File directory doesn't exist: ${TAR_DIR}"
+ exit 1
+fi
+
+# If MET_PYTHON_LIB is not set in the environment file, set it to the
+# lib directory so it can be use to install MET with Python Embedding
+# support
+if [[ -z "$MET_PYTHON_LIB" ]]; then
+ MET_PYTHON_LIB=${MET_PYTHON}/lib
+fi
+
+
+# Print library linker path
+echo "LD_LIBRARY_PATH = ${LD_LIBRARY_PATH}"
+
+# if LIB_Z is not set in the environment file, set it to the
+# lib directory so it can be used to install HDF5 with zlib support
+if [[ -z "$LIB_Z" ]]; then
+ LIB_Z=${LIB_DIR}/lib
+fi
+
+# if TIFF is not defined in the environment file, enable its compilation
+if [[ -z ${TIFF_INCLUDE_DIR} ]] && [[ -z ${TIFF_LIB_DIR} ]]; then
+ COMPILE_TIFF=1
+else
+ COMPILE_TIFF=0
+fi
+
+# if SQLITE is not defined in the environment file, enable its compilation
+if [[ -z ${SQLITE_INCLUDE_DIR} ]] && [[ -z ${SQLITE_LIB_DIR} ]]; then
+ COMPILE_SQLITE=1
+else
+ COMPILE_SQLITE=0
+fi
+
+# Constants
+if [[ -z ${MET_GRIB2CLIB} ]] && [[ -z ${MET_GRIB2C} ]]; then
+ COMPILE_ZLIB=1
+ COMPILE_LIBPNG=1
+ COMPILE_JASPER=1
+ COMPILE_JPEG=1
+ COMPILE_G2CLIB=1
+else
+ COMPILE_ZLIB=0
+ COMPILE_LIBPNG=0
+ COMPILE_JASPER=0
+ COMPILE_JPEG=0
+ COMPILE_G2CLIB=0
+fi
+
+if [ -z ${MET_BUFRLIB} ]; then COMPILE_BUFRLIB=1; else COMPILE_BUFRLIB=0; fi
+
+if [ -z ${MET_NETCDF} ]; then COMPILE_NETCDF=1; else COMPILE_NETCDF=0; fi
+
+if [ -z ${MET_PROJ} ]; then COMPILE_PROJ=1; else COMPILE_PROJ=0; fi
+
+if [ -z ${MET_GSL} ]; then COMPILE_GSL=1; else COMPILE_GSL=0; fi
+
+# Only set COMPILE_ECKIT and COMPILE_ATLAS if you want to compile and enable support for unstructued grids
+if [ ! -z "${COMPILE_ECKIT}" ]; then COMPILE_ECKIT=1; else COMPILE_ECKIT=0; fi
+if [ ! -z "${COMPILE_ATLAS}" ]; then COMPILE_ATLAS=1; else COMPILE_ATLAS=0; fi
+
+if [[ -z ${MET_ECKIT} ]] && [[ -z ${MET_ATLAS} ]]; then
+ if [[ $COMPILE_ECKIT -eq 1 && $COMPILE_ATLAS -eq 1 ]]; then
+ export MET_ECKIT=${LIB_DIR}
+ export MET_ATLAS=${LIB_DIR}
+ fi
+else
+ # Only set COMPILE_ECKIT and COMPILE_ATLAS to 1 if you have already compiled ECKIT and ATLAS,
+ # have set MET_ECKIT and MET_ATLAS in your configuration file, and want to enable
+ # unstructured grids
+ COMPILE_ECKIT=0
+ COMPILE_ATLAS=0
+fi
+
+# Only set COMPILE_HDF and COMPILE_HDFEOS if you want to compile and enable MODIS-Regrid (not widely used)
+if [ ! -z "${COMPILE_HDF}" ]; then COMPILE_HDF=1; else COMPILE_HDF=0; fi
+if [ ! -z "${COMPILE_HDFEOS}" ]; then COMPILE_HDFEOS=1; else COMPILE_HDFEOS=0; fi
+
+if [[ -z ${MET_HDF} ]] && [[ -z ${MET_HDFEOS} ]]; then
+ if [[ $COMPILE_HDF -eq 1 && $COMPILE_HDFEOS -eq 1 ]]; then
+ export MET_HDF=${LIB_DIR}
+ export MET_HDFEOS=${LIB_DIR}
+ fi
+else
+ # Only set COMPILE_HDF and COMPILE_HDFEOS to 1 if you have already compiled HDF4 and HDFEOS,
+ # have set MET_HDF and MET_HDFEOS in your configuration file, and want to enable
+ # MODIS-Regrid (not widely used)
+ COMPILE_HDF=0
+ COMPILE_HDFEOS=0
+fi
+
+# Only set COMPILE_FREETYPE and COMPILE_CAIRO if you want to compile and enable MODE Graphics (not widely used)
+if [ ! -z "${COMPILE_FREETYPE}" ]; then COMPILE_FREETYPE=1; else COMPILE_FREETYPE=0; fi
+if [ ! -z "${COMPILE_CAIRO}" ]; then COMPILE_CAIRO=1; else COMPILE_CAIRO=0; fi
+
+
+if [[ ! -z ${MET_FREETYPE} ]]; then
+ echo "ERROR: MET_FREETYPEINC and MET_FREETYPELIB must be set instead of MET_FREETYPE"
+ exit 1
+fi
+
+if [[ ! -z ${MET_CAIRO} ]]; then
+ echo "ERROR: MET_CAIROINC and MET_CAIROLIB must be set instead of MET_CAIRO"
+ exit 1
+fi
+
+if [[ -z ${MET_FREETYPEINC} && -z ${MET_FREETYPELIB} && -z ${MET_CAIROINC} && -z ${MET_CAIROLIB} ]]; then
+ if [[ $COMPILE_CAIRO -eq 1 && $COMPILE_FREETYPE -eq 1 ]]; then
+ export MET_CAIROINC=${LIB_DIR}/include/cairo
+ export MET_CAIROLIB=${LIB_DIR}/lib
+ export MET_FREETYPEINC=${LIB_DIR}/include/freetype2
+ export MET_FREETYPELIB=${LIB_DIR}/lib
+ fi
+else
+ # Only set COMPILE_FREETYPE and COMPILE_CAIRO to 1 if you have compiled FREETYPE and CAIRO,
+ # have set MET_FREETYPEINC, MET_FREETYPELIB, MET_CAIROINC, and MET_CAIROLIB in your
+ # configuration file, and want to enable MODE Graphics (not widely used)
+ COMPILE_FREETYPE=0
+ COMPILE_CAIRO=0
+fi
+
+COMPILE_MET=1
+
+# skip compilation of MET if SKIP_MET is set
+if [ ! -z "${SKIP_MET}" ]; then COMPILE_MET=0; fi
+
+# skip compilation of external libraries if SKIP_LIBS is set
+if [ ! -z "${SKIP_LIBS}" ]; then
+ COMPILE_PROJ=0
+ COMPILE_GSL=0
+ COMPILE_BUFRLIB=0
+ COMPILE_ZLIB=0
+ COMPILE_LIBPNG=0
+ COMPILE_JASPER=0
+ COMPILE_JPEG=0
+ COMPILE_G2CLIB=0
+ COMPILE_ECKIT=0
+ COMPILE_ATLAS=0
+ COMPILE_HDF=0
+ COMPILE_HDFEOS=0
+ COMPILE_NETCDF=0
+ COMPILE_FREETYPE=0
+ COMPILE_CAIRO=0
+fi
+
+if [ -z ${BIN_DIR_PATH} ]; then
+ BIN_DIR_PATH=${TEST_BASE}/bin
+fi
+
+if [ -z ${USE_MET_TAR_FILE} ]; then
+ export USE_MET_TAR_FILE=TRUE
+fi
+
+echo
+echo "Compiling libraries into: ${LIB_DIR}"
+
+if [ ! -e ${LIB_DIR}/include ]; then
+ mkdir ${LIB_DIR}/include
+fi
+
+if [ ! -e ${LIB_DIR}/lib ]; then
+ mkdir ${LIB_DIR}/lib
+fi
+
+# Load compiler version
+if [ -z ${COMPILER_FAMILY} ]; then
+ COMPILER_FAMILY=` echo $COMPILER | cut -d'_' -f1`
+fi
+
+# Check for "oneapi" in compiler family name
+#if echo ${COMPILER_FAMILY} | grep -E "^intel"; then
+if [[ ${COMPILER_FAMILY} == *intel* ]]; then
+ COMPILER_FAMILY_SUFFIX=` echo $COMPILER_FAMILY | cut -d'-' -f2`
+fi
+
+if [ -z ${COMPILER_VERSION} ]; then
+ COMPILER_VERSION=`echo $COMPILER | cut -d'_' -f2`
+fi
+
+echo "COMPILER = $COMPILER"
+echo "COMPILER_FAMILY = $COMPILER_FAMILY"
+echo "COMPILER_FAMILY_SUFFIX = $COMPILER_FAMILY_SUFFIX"
+echo "COMPILER_VERSION = $COMPILER_VERSION"
+COMPILER_MAJOR_VERSION=`echo $COMPILER_VERSION | cut -d'.' -f1`
+COMPILER_MINOR_VERSION=`echo $COMPILER_VERSION | cut -d'.' -f2`
+
+echo
+echo "USE_MODULES = ${USE_MODULES}"
+echo
+
+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
+ module load craype
+ module switch craype craype-sandybridge
+ fi
+fi
+
+# After loading the compiler module, strip any extra
+# characters off of "gnu" (e.g. "gnu9")
+if [[ ${COMPILER_FAMILY} == *gnu* ]]; then
+ export COMPILER_FAMILY="gnu"
+fi
+
+if [ ${COMPILER_FAMILY} = "gnu" ]; then
+ if [ -z ${CC} ]; then export CC=`which gcc`; fi
+ if [ -z ${CXX} ]; then export CXX=`which g++`; fi
+ if [ -z ${FC} ]; then export FC=`which gfortran`; fi
+ if [ -z ${F77} ]; then export F77=`which gfortran`; fi
+ if [ -z ${F90} ]; then export F90=`which gfortran`; fi
+elif [ ${COMPILER_FAMILY} = "pgi" ]; then
+ if [ -z ${CC} ]; then export CC=`which pgcc`; fi
+ if [ -z ${CXX} ]; then export CXX=`which pgc++`; fi
+ if [ -z ${FC} ]; then export FC=`which pgf90`; fi
+ if [ -z ${F77} ]; then export F77=`which pgf90`; fi
+ if [ -z ${F90} ]; then export F90=`which pgf90`; fi
+elif [[ ${COMPILER_FAMILY} == *intel* && ${CC} == "icc" ]] || \
+ [[ ${COMPILER_FAMILY} == "ics" ]] || \
+ [[ ${COMPILER_FAMILY} == "ips" ]] || \
+ [[ ${COMPILER_FAMILY} == "intel-classic" ]] || \
+ [[ ${COMPILER_FAMILY} == "PrgEnv-intel" ]]; then
+ if [ -z ${CC} ]; then export CC=`which icc`; fi
+ if [ -z ${CXX} ]; then export CXX=`which icpc`; fi
+ if [ -z ${FC} ]; then export FC=`which ifort`; fi
+ if [ -z ${F77} ]; then export F77=`which ifort`; fi
+ if [ -z ${F90} ]; then export F90=`which ifort`; fi
+elif [[ ${COMPILER_FAMILY} == *intel* ]] && [[ ${CC} == *icx* ]]; then
+ export CXX=`which icpx`
+ export FC=`which ifx`
+ export F77=`which ifx`
+ export F90=`which ifx`
+elif [[ ${COMPILER_FAMILY_SUFFIX} == oneapi ]]; then
+ export CC=`which icx`
+ export CXX=`which icpx`
+ export FC=`which ifx`
+ export F77=`which ifx`
+ export F90=`which ifx`
+else
+ echo "ERROR: \${COMPILER} must start with gnu, intel, ics, ips, intel-classic, PrgEnv-intel, or pgi"
+ exit
+fi
+
+echo "export CC=${CC}"
+echo "export CXX=${CXX}"
+echo "export FC=${FC}"
+echo "export F77=${F77}"
+echo "export F90=${F90}"
+echo
+
+# Figure out what kind of OS is being used
+unameOut="$(uname -s)"
+case "${unameOut}" in
+ Linux*) machine=Linux;;
+ Darwin*) machine=Mac;;
+ CYGWIN*) machine=Cygwin;;
+ MINGW*) machine=MinGw;;
+ *) machine="UNKNOWN:${unameOut}"
+esac
+
+# change sed command and extension for dynamic library files
+if [[ $machine == "Mac" ]]; then
+ sed_inline="sed -i ''"
+else
+ sed_inline="sed -i''"
+fi
+
+if [[ "$(uname -m)" == "arm64" ]]; then
+ dynamic_lib_ext="dylib"
+else
+ dynamic_lib_ext="so"
+fi
+
+# Load Python module
+
+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`
+ echo "module load ${PYTHON_NAME}/${PYTHON_VERSION_NUM}"
+ echo ${PYTHON_NAME}/${PYTHON_VERSION_NUM}
+ module load ${PYTHON_NAME}/${PYTHON_VERSION_NUM}
+ # Allow the user to specify the name and version of the module to load
+ elif [[ ! -z ${PYTHON_NAME} && ! -z ${PYTHON_VERSION_NUM} ]]; then
+ echo "module load ${PYTHON_NAME}/${PYTHON_VERSION_NUM}"
+ echo ${PYTHON_NAME}/${PYTHON_VERSION_NUM}
+ module load ${PYTHON_NAME}/${PYTHON_VERSION_NUM}
+ fi
+fi
+
+if [[ ${MET_PYTHON}/bin/python3 ]]; then
+ echo "Using python version: "
+ ${MET_PYTHON}/bin/python3 --version
+fi
+
+# Compile Proj
+if [ $COMPILE_PROJ -eq 1 ]; then
+
+
+ if [ $COMPILE_TIFF -eq 1 ]; then
+ echo
+ echo "Compiling TIFF at `date`"
+ mkdir -p ${LIB_DIR}/tiff
+ rm -rf ${LIB_DIR}/tiff/tiff*
+ tar -xzf ${TAR_DIR}/tiff*.tar.gz -C ${LIB_DIR}/tiff
+ cd ${LIB_DIR}/tiff/tiff*
+ echo "cd `pwd`"
+ run_cmd "./configure --prefix=${LIB_DIR} > $(pwd)/tiff.configure.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} > $(pwd)/tiff.make.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/tiff.make_install.log 2>&1"
+ export TIFF_INCLUDE_DIR=${LIB_DIR}/include
+ export TIFF_LIB_DIR=${LIB_DIR}/lib
+ fi
+
+ if [ $COMPILE_SQLITE -eq 1 ]; then
+ echo
+ echo "Compiling SQLITE at `date`"
+ mkdir -p ${LIB_DIR}/sqlite
+ rm -rf ${LIB_DIR}/sqlite/sqlite*
+ tar -xf ${TAR_DIR}/sqlite*.tar.gz -C ${LIB_DIR}/sqlite > /dev/null 2>&1
+ cd ${LIB_DIR}/sqlite/sqlite*
+ echo "cd `pwd`"
+ run_cmd "./configure --enable-shared --prefix=${LIB_DIR} > $(pwd)/sqlite.configure.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} > $(pwd)/sqlite.make.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/sqlite.make_install.log 2>&1"
+ export SQLITE_INCLUDE_DIR=${LIB_DIR}/include
+ export SQLITE_LIB_DIR=${LIB_DIR}/lib
+ fi
+
+ vrs="7.1.0"
+
+ echo
+ echo "Compiling PROJ_${vrs} at `date`"
+ echo "cmake version `cmake --version`"
+ mkdir -p ${LIB_DIR}/proj
+ rm -rf ${LIB_DIR}/proj/proj*
+ tar -xf ${TAR_DIR}/proj-${vrs}.tar.gz -C ${LIB_DIR}/proj
+ cd ${LIB_DIR}/proj/proj*
+ echo "cd `pwd`"
+ export PATH=${LIB_DIR}/bin:${PATH}
+ run_cmd "mkdir build; cd build"
+
+ tiff_arg=""
+ # add tiff library and include arguments if necessary
+ if [[ ! -z "$TIFF_LIB_DIR" ]]; then
+ tiff_arg+="-DTIFF_LIBRARY_RELEASE=${TIFF_LIB_DIR}/libtiff.${dynamic_lib_ext}"
+ fi
+ if [[ ! -z "$TIFF_INCLUDE_DIR" ]]; then
+ tiff_arg+=" -DTIFF_INCLUDE_DIR=${TIFF_INCLUDE_DIR}"
+ fi
+
+ cmd="cmake -DCMAKE_INSTALL_PREFIX=${LIB_DIR} -DSQLITE3_INCLUDE_DIR=${SQLITE_INCLUDE_DIR} -DSQLITE3_LIBRARY=${SQLITE_LIB_DIR}/libsqlite3.${dynamic_lib_ext} ${tiff_arg} .. > $(pwd)/proj.cmake.log 2>&1"
+ run_cmd ${cmd}
+ run_cmd "cmake --build . > $(pwd)/proj.cmake_build.log 2>&1"
+ run_cmd "cmake --build . --target install > $(pwd)/proj.cmake_install.log 2>&1"
+
+fi
+
+# Compile GSL
+if [ $COMPILE_GSL -eq 1 ]; then
+
+ if [ ${COMPILER_FAMILY} = "pgi" ]; then
+ vrs="1.11"
+ else
+ vrs="2.7.1"
+ fi
+
+ echo
+ echo "Compiling GSL_${vrs} at `date`"
+ mkdir -p ${LIB_DIR}/gsl
+ rm -rf ${LIB_DIR}/gsl/gsl*
+ tar -xf ${TAR_DIR}/gsl-${vrs}.tar.gz -C ${LIB_DIR}/gsl
+ cd ${LIB_DIR}/gsl/gsl*
+ echo "cd `pwd`"
+ run_cmd "./configure --prefix=${LIB_DIR} > $(pwd)/gsl.configure.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} > $(pwd)/gsl.make.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/gsl.make_install.log 2>&1"
+fi
+
+# Compile BUFRLIB
+if [ $COMPILE_BUFRLIB -eq 1 ]; then
+
+ vrs="v11.6.0"
+
+ echo
+ echo "Compiling bufr_${vrs} at `date`"
+ mkdir -p ${LIB_DIR}/bufrlib
+ rm -rf ${LIB_DIR}/bufrlib/NCEPLIBS-bufr-bufr_${vrs}
+ tar -xf ${TAR_DIR}/bufr_${vrs}.tar.gz -C ${LIB_DIR}/bufrlib
+ export SOURCE_DIR=${LIB_DIR}/bufrlib/NCEPLIBS-bufr-bufr_${vrs}
+ cd $SOURCE_DIR
+ echo "cd `pwd`"
+ run_cmd "mkdir build"
+ export BUILD_DIR=${SOURCE_DIR}/build
+ run_cmd "cmake -H${SOURCE_DIR} -B${BUILD_DIR} -DCMAKE_INSTALL_PREFIX=${LIB_DIR} -DCMAKE_BUILD_TYPE=Debug > $(pwd)/bufr.cmake.log 2>&1"
+ run_cmd "cd ${BUILD_DIR}"
+ run_cmd "make ${MAKE_ARGS} > $(pwd)/bufr.make.log 2>&1"
+ run_cmd "ctest > $(pwd)/bufr.ctest.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/bufr.make_install.log 2>&1"
+fi
+
+
+# Compile ZLIB
+if [ $COMPILE_ZLIB -eq 1 ]; then
+ echo
+ echo "Compiling ZLIB at `date`"
+ mkdir -p ${LIB_DIR}/zlib
+ rm -rf ${LIB_DIR}/zlib/zlib*
+ tar -xzf ${TAR_DIR}/zlib*.tar.gz -C ${LIB_DIR}/zlib
+ cd ${LIB_DIR}/zlib/zlib*
+ echo "cd `pwd`"
+ run_cmd "./configure --prefix=${LIB_DIR} > $(pwd)/zlib.configure.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} > $(pwd)/zlib.make.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/zlib.make_install.log 2>&1"
+
+ # GPM: why is this removed? Could we add a comment to
+ # describe why this is needed?
+ run_cmd "rm ${LIB_DIR}/lib/libz.a"
+fi
+
+# Compile LIBPNG
+if [[ $COMPILE_LIBPNG -eq 1 && $HOST != ys* ]]; then
+ echo
+ echo "Compiling LIBPNG at `date`"
+ mkdir -p ${LIB_DIR}/libpng
+ rm -rf ${LIB_DIR}/libpng/libpng*
+ tar -xzf ${TAR_DIR}/libpng*.tar.gz -C ${LIB_DIR}/libpng
+ cd ${LIB_DIR}/libpng/libpng*
+ echo "cd `pwd`"
+ run_cmd "./configure --prefix=${LIB_DIR} LDFLAGS=-L${LIB_DIR}/lib CPPFLAGS=-I${LIB_DIR}/include > $(pwd)/libpng.configure.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} > $(pwd)/libpng.make.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/libpng.make_install.log 2>&1"
+fi
+
+
+# Compile JASPER
+if [ $COMPILE_JASPER -eq 1 ]; then
+
+ vrs="2.0.25"
+
+ echo
+ echo "Compiling JASPER at `date`"
+ mkdir -p ${LIB_DIR}/jasper
+ rm -rf ${LIB_DIR}/jasper/jasper*
+ tar -xf ${TAR_DIR}/jasper-${vrs}.tar.gz -C ${LIB_DIR}/jasper
+ cd ${LIB_DIR}/jasper/jasper-version-${vrs}
+ export CPPFLAGS="-I${LIB_DIR}/include"
+ export SOURCE_DIR=${LIB_DIR}/jasper/jasper-version-${vrs}
+ echo "cd `pwd`"
+ export BUILD_DIR=${LIB_DIR}/jasper/jasper-version-${vrs}/build
+ run_cmd "cmake -G \"Unix Makefiles\" -H${SOURCE_DIR} -B${BUILD_DIR} -DCMAKE_INSTALL_PREFIX=${LIB_DIR} -DJAS_ENABLE_DOC=false > $(pwd)/jasper.cmake.log 2>&1"
+ run_cmd "cd ${BUILD_DIR}"
+ run_cmd "make clean all > $(pwd)/jasper.make.log 2>&1"
+ # Commented out due to “which: no opj2_compress in …” error, which causes one of four tests to fail
+ # This is a known problem, so skipping tests for now: https://github.com/AAROC/CODE-RADE/issues/36#issuecomment-359744351
+ #run_cmd "make ${MAKE_ARGS} test > $(pwd)/jasper.make_test.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/jasper.make_install.log 2>&1"
+fi
+
+# Compile JPEG
+if [ $COMPILE_JPEG -eq 1 ]; then
+
+ vrs="9e"
+
+ echo
+ echo "Compiling JPEG at `date`"
+ mkdir -p ${LIB_DIR}/jpeg
+ rm -rf ${LIB_DIR}/jpeg/jpeg*
+ tar -xf ${TAR_DIR}/jpegsrc.v${vrs}.tar.gz -C ${LIB_DIR}/jpeg
+ cd ${LIB_DIR}/jpeg/jpeg-${vrs}
+ echo "cd `pwd`"
+ run_cmd "./configure --prefix=${LIB_DIR} LDFLAGS=-L${LIB_DIR}/lib CPPFLAGS=-I${LIB_DIR}/include > $(pwd)/libjpeg.configure.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} > $(pwd)/libjpeg.make.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/libjpeg.make_install.log 2>&1"
+fi
+
+
+# Compile G2CLIB
+if [ $COMPILE_G2CLIB -eq 1 ]; then
+
+ vrs="1.6.4"
+
+ echo
+ echo "Compiling G2CLIB at `date`"
+ mkdir -p ${LIB_DIR}/g2clib
+ rm -rf ${LIB_DIR}/g2clib/NCEP*
+ tar -xf ${TAR_DIR}/g2clib-${vrs}.tar.gz -C ${LIB_DIR}/g2clib
+ cd ${LIB_DIR}/g2clib/NCEP*
+ echo "cd `pwd`"
+ run_cmd "mkdir build; cd build"
+ run_cmd "cmake -DCMAKE_INSTALL_PREFIX=${LIB_DIR} -DCMAKE_PREFIX_PATH=${LIB_DIR} .. > $(pwd)/g2c.cmake.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} > $(pwd)/g2c.make.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} test > $(pwd)/g2c.make_test.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/g2c.make_install.log 2>&1"
+fi
+
+# Compile ECKIT
+if [ $COMPILE_ECKIT -eq 1 ]; then
+
+ # Need to obtain ecbuild before installing eckit
+
+ vrs="3.5.0"
+
+ echo
+ echo "Compiling ECBUILD at `date`"
+ mkdir -p ${LIB_DIR}/ecbuild
+ rm -rf ${LIB_DIR}/ecbuild/ecbuild*
+ tar -xf ${TAR_DIR}/ecbuild-${vrs}.tar.gz -C ${LIB_DIR}/ecbuild
+ cd ${LIB_DIR}/ecbuild/ecbuild*
+ echo "cd `pwd`"
+ run_cmd "mkdir build; cd build"
+ run_cmd "cmake ../ -DCMAKE_INSTALL_PREFIX=${LIB_DIR} > $(pwd)/ecbuild.cmake.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/ecbuild.make_install.log 2>&1"
+
+ vrs="1.20.2"
+
+ echo
+ echo "Compiling ECKIT at `date`"
+ mkdir -p ${LIB_DIR}/eckit
+ rm -rf ${LIB_DIR}/eckit/eckit*
+ tar -xf ${TAR_DIR}/eckit-${vrs}.tar.gz -C ${LIB_DIR}/eckit
+ cd ${LIB_DIR}/eckit/eckit*
+ echo "cd `pwd`"
+ run_cmd "mkdir build; cd build"
+ run_cmd "cmake ../ -DCMAKE_INSTALL_PREFIX=${LIB_DIR} -DCMAKE_PREFIX_PATH=${LIB_DIR} > $(pwd)/eckit.cmake.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/eckit.make_install.log 2>&1"
+
+fi
+
+# Compile ATLAS
+if [ $COMPILE_ATLAS -eq 1 ]; then
+
+ vrs="0.30.0"
+
+ echo
+ echo "Compiling ATLAS at `date`"
+ mkdir -p ${LIB_DIR}/atlas
+ rm -rf ${LIB_DIR}/atlas/atlas*
+ tar -xf ${TAR_DIR}/atlas-${vrs}.tar.gz -C ${LIB_DIR}/atlas
+ cd ${LIB_DIR}/atlas/atlas*
+ echo "cd `pwd`"
+ run_cmd "mkdir build; cd build"
+ run_cmd "cmake ../ -DCMAKE_INSTALL_PREFIX=${LIB_DIR} -DCMAKE_PREFIX_PATH=${LIB_DIR} > $(pwd)/atlas.cmake.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} > $(pwd)/atlas.make.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/atlas.make_install.log 2>&1"
+
+fi
+
+# Compile HDF
+# Depends on jpeg
+# Edit 'mfhdf/hdiff/Makefile' as follows:
+# From: LIBS = -ljpeg -lz
+# To: LIBS = -ljpeg -lz -lm
+if [ $COMPILE_HDF -eq 1 ]; then
+ echo
+ echo "Compiling HDF at `date`"
+ mkdir -p ${LIB_DIR}/hdf
+ rm -rf ${LIB_DIR}/hdf/HDF*
+ tar -xf ${TAR_DIR}/HDF4.2*.tar.gz -C ${LIB_DIR}/hdf
+ cd ${LIB_DIR}/hdf/HDF*
+ echo "cd `pwd`"
+ run_cmd "./configure --prefix=${LIB_DIR} --disable-netcdf --with-jpeg=${LIB_DIR} --with-zlib=${LIB_DIR} CPPFLAGS=-I/usr/include/tirpc LIBS='-lm -ltirpc' > $(pwd)/hdf4.configure.log 2>&1"
+ if [[ ${COMPILER_MAJOR_VERSION} -ge 10 ]]; then
+ cat hdf/src/Makefile | \
+ sed 's/FFLAGS = -O2/FFLAGS = -w -fallow-argument-mismatch -O2/g' \
+ > Makefile_new
+ elif [[ ${COMPILER_MAJOR_VERSION} -lt 10 ]]; then
+ cat hdf/src/Makefile | \
+ sed 's/FFLAGS = -O2/FFLAGS = -w -Wno-argument-mismatch -O2/g' \
+ > Makefile_new
+ fi
+ mv Makefile_new hdf/src/Makefile
+ run_cmd "make ${MAKE_ARGS} > $(pwd)/hdf4.make.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/hdf4.make_install.log 2>&1"
+fi
+
+# Compile HDFEOS
+# Depends on HDF
+if [ $COMPILE_HDFEOS -eq 1 ]; then
+ echo
+ echo "Compiling HDFEOS at `date`"
+ mkdir -p ${LIB_DIR}/hdfeos
+ rm -rf ${LIB_DIR}/hdfeos/HDF-EOS*
+ tar -xzf ${TAR_DIR}/HDF-EOS*.tar.* -C ${LIB_DIR}/hdfeos
+ cd ${LIB_DIR}/hdfeos/hdfeos
+ echo "cd `pwd`"
+ run_cmd "./configure --prefix=${LIB_DIR} --with-hdf4=${LIB_DIR} --with-jpeg=${LIB_DIR} > $(pwd)/hdf-eos.configure.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} > $(pwd)/hed-eos.make.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/hsf-eos.make_install.log 2>&1"
+
+ cp include/*.h ${LIB_DIR}/include/
+fi
+
+# Compile NetCDF
+if [ $COMPILE_NETCDF -eq 1 ]; then
+
+ echo
+ echo "Compiling HDF5 at `date`"
+ mkdir -p ${LIB_DIR}/hdf5
+ rm -rf ${LIB_DIR}/hdf5/hdf5*
+ tar -xzf ${TAR_DIR}/hdf5*.tar.gz -C ${LIB_DIR}/hdf5
+ cd ${LIB_DIR}/hdf5/hdf5*
+ echo "cd `pwd`"
+ run_cmd "./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 > $(pwd)/hdf5.configure.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/hdf5.make_install.log 2>&1"
+
+ echo
+ echo "Compiling NetCDF-C at `date`"
+ mkdir -p ${LIB_DIR}/netcdf
+ rm -rf ${LIB_DIR}/netcdf/netcdf*
+ tar -xzf ${TAR_DIR}/netcdf-4*.tar.gz -C ${LIB_DIR}/netcdf > /dev/null 2>&1 || unzip ${TAR_DIR}/netcdf-4*.zip -d ${LIB_DIR}/netcdf
+ cd ${LIB_DIR}/netcdf/netcdf-*
+ export FC=''
+ export F90=''
+ echo "cd `pwd`"
+ run_cmd "./configure --prefix=${LIB_DIR} CFLAGS=-fPIC CXXFLAGS=-fPIC LDFLAGS=-L${LIB_DIR}/lib CPPFLAGS=-I${LIB_DIR}/include > $(pwd)/netcdf-c.configure.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/netcdf-c.make_install.log 2>&1"
+
+ echo
+ echo "Compiling NetCDF-CXX at `date`"
+ tar -xzf ${TAR_DIR}/netcdf-cxx*.tar.gz -C ${LIB_DIR}/netcdf
+ cd ${LIB_DIR}/netcdf/netcdf-cxx*
+ echo "cd `pwd`"
+ configure_lib_args=""
+ if [[ $machine == "Mac" ]]; then
+ configure_lib_args="-lnetcdf -lhdf5_hl -lhdf5 -lz"
+ fi
+ run_cmd "./configure --prefix=${LIB_DIR} LDFLAGS=-L${LIB_DIR}/lib CPPFLAGS=-I${LIB_DIR}/include LIBS=\"${LIBS} ${configure_lib_args}\" > $(pwd)/netcdf-cxx.configure.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/netcdf-cxx.make_install.log 2>&1"
+fi
+
+# Compile FREETYPE
+if [ $COMPILE_FREETYPE -eq 1 ]; then
+ echo
+ echo "Compiling FREETYPE at `date`"
+ mkdir -p ${LIB_DIR}/freetype
+ rm -rf ${LIB_DIR}/freetype/freetype*
+ tar -xzf ${TAR_DIR}/freetype*.tar.gz -C ${LIB_DIR}/freetype
+ cd ${LIB_DIR}/freetype/freetype*
+ echo "cd `pwd`"
+ run_cmd "./configure --prefix=${LIB_DIR} --with-png=yes > $(pwd)/freetype.configure.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} > $(pwd)/freetype.make.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/freetype.make_install.log 2>&1"
+fi
+
+
+# Compile CAIRO
+if [ $COMPILE_CAIRO -eq 1 ]; then
+
+ # If on Cray, compile PIXMAN
+ if [ ${COMPILER_FAMILY} = "PrgEnv-intel" ]; then
+ echo
+ echo "Compiling pixman at `date`"
+ mkdir -p ${LIB_DIR}/pixman
+ rm -rf ${LIB_DIR}/pixman/pixman*
+ tar -xzf ${TAR_DIR}/pixman*.tar.gz -C ${LIB_DIR}/pixman
+ cd ${LIB_DIR}/pixman/pixman*
+ echo "cd `pwd`"
+ run_cmd "./configure --prefix=${LIB_DIR} > $(pwd)/pixman.configure.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} > $(pwd)/pixman.make.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/pixman.make_install.log 2>&1"
+ fi
+
+ echo
+ echo "Compiling CAIRO at `date`"
+ mkdir -p ${LIB_DIR}/cairo
+ rm -rf ${LIB_DIR}/cairo/cairo*
+ tar -xf ${TAR_DIR}/cairo*.tar* -C ${LIB_DIR}/cairo
+ cd ${LIB_DIR}/cairo/cairo*
+ export PKG_CONFIG=`which pkg-config`
+ if [ ${COMPILER_FAMILY} = "PrgEnv-intel" ]; then
+ export PKG_CONFIG_PATH=${LIB_DIR}/lib/pkgconfig/
+ fi
+ echo "cd `pwd`"
+ run_cmd "./configure --prefix=${LIB_DIR} ax_cv_c_float_words_bigendian=no LDFLAGS=-L${LIB_DIR}/lib CPPFLAGS=-I${LIB_DIR}/include > $(pwd)/cairo.configure.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} > $(pwd)/cairo.make.log 2>&1"
+ run_cmd "make ${MAKE_ARGS} install > $(pwd)/cairo.make_install.log 2>&1"
+fi
+
+# Compile MET
+if [ $COMPILE_MET -eq 0 ]; then
+ echo Skipping MET compilation
+ echo "Finished compiling at `date`"
+ exit 0
+fi
+
+echo
+echo "Compiling MET at `date`"
+# 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
+ rm -rf ${MET_DIR}/MET*
+ tar -xzf ${MET_TARBALL} -C ${MET_DIR}
+fi
+cd ${MET_DIR}/MET*
+
+echo "Modifying configure"
+cat configure | \
+ sed 's/C11/C17/g' | \
+ sed 's/c11/c17/g' | \
+ sed 's/cxx11/cxx17/g' | \
+ sed 's/c++11/c++17/g' | \
+ sed 's/gnu11/gnu17/g' \
+ > configure_new
+
+mv configure_new configure
+chmod 755 configure
+
+if [ -z ${MET_BUFRLIB} ]; then
+ export MET_BUFRLIB=${LIB_DIR}/lib
+ export BUFRLIB_NAME=-lbufr_4
+fi
+
+if [ -z ${MET_GRIB2CLIB} ]; then
+ 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
+ export GRIB2CLIB_NAME=-lg2c
+fi
+
+if [ -z ${MET_NETCDF} ]; then
+ export MET_NETCDF=${LIB_DIR}
+ export MET_HDF5=${LIB_DIR}
+fi
+
+if [ -z ${MET_GSL} ]; then
+ export MET_GSL=${LIB_DIR}
+fi
+
+if [ -z ${MET_PROJ} ]; then
+ export MET_PROJ=${LIB_DIR}
+fi
+
+export MET_PYTHON_BIN_EXE=${MET_PYTHON_BIN_EXE:=${MET_PYTHON}/bin/python3}
+export MET_PYTHON_LD
+export MET_PYTHON_CC
+
+# add flags to user-defined LDFLAGS for MacOS
+if [[ $machine != "Mac" ]]; then
+ LDFLAGS="${LDFLAGS} -Wl,--disable-new-dtags"
+fi
+
+# 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.
+
+# add LIB_DIR/lib and LIB_DIR/lib64 to rpath and -L
+LDFLAGS="${LDFLAGS} -Wl,-rpath,${LIB_DIR}/lib -L${LIB_DIR}/lib -Wl,-rpath,${LIB_DIR}/lib64 -L${LIB_DIR}/lib64"
+
+# if variables are set, add /lib to rpath and -L
+for x in $MET_CAIRO $MET_FREETYPE $MET_GSL $MET_HDF $MET_HDF5 $MET_NETCDF; do
+ arg="${x:+-Wl,-rpath,$x/lib -L$x/lib}"
+ if [[ "$LDFLAGS" != *"$arg"* ]]; then
+ LDFLAGS+=" $arg"
+ fi
+done
+
+# if variables are set, add /lib64 to rpath and -L
+for x in $MET_ATLAS $MET_BUFR $MET_ECKIT $MET_GRIB2C $MET_PROJ $LIB_JASPER; do
+ arg="${x:+-Wl,-rpath,$x/lib64 -L$x/lib64}"
+ if [[ "$LDFLAGS" != *"$arg"* ]]; then
+ LDFLAGS+=" $arg"
+ fi
+done
+
+# if variables are set, add to rpath and -L
+for x in $MET_ATLASLIB $MET_BUFRLIB $MET_CAIROLIB $MET_ECKITLIB $MET_FREETYPELIB $MET_GRIB2CLIB $MET_GSLLIB $MET_HDF5LIB $MET_HDFLIB $MET_NETCDFLIB $MET_PROJLIB $MET_PYTHON_LIB $LIB_JASPER $LIB_LIBPNG $LIB_Z $ADDTL_DIR; do
+ arg="${x:+-Wl,-rpath,$x -L$x}"
+ if [[ "$LDFLAGS" != *"$arg"* ]]; then
+ LDFLAGS+=" $arg"
+ fi
+done
+
+export LDFLAGS
+
+export LIBS="${LIBS} -lhdf5_hl -lhdf5 -lz"
+export MET_FONT_DIR=${TEST_BASE}/fonts
+
+
+echo "MET Configuration settings..."
+printenv | egrep "^MET_" | sed -r 's/^/export /g'
+echo "LDFLAGS = ${LDFLAGS}"
+export OPT_ARGS=''
+if [[ $COMPILER_FAMILY == "pgi" ]]; then
+ export OPT_ARGS="${OPT_ARGS} FFLAGS=-lpgf90"
+fi
+
+configure_cmd="./configure --prefix=${MET_INSTALL_DIR} --bindir=${BIN_DIR_PATH}"
+configure_cmd="${configure_cmd} BUFRLIB_NAME=${BUFRLIB_NAME}"
+configure_cmd="${configure_cmd} GRIB2CLIB_NAME=${GRIB2CLIB_NAME} --enable-grib2"
+if [[ ! -z ${MET_FREETYPEINC} && ! -z ${MET_FREETYPELIB} && \
+ ! -z ${MET_CAIROINC} && ! -z ${MET_CAIROLIB} ]]; then
+ configure_cmd="${configure_cmd} --enable-mode_graphics"
+fi
+
+if [[ ! -z $MET_ECKIT && ! -z $MET_ATLAS ]]; then
+ configure_cmd="${configure_cmd} --enable-ugrid"
+fi
+
+if [[ ! -z $MET_HDF && ! -z $MET_HDFEOS ]]; then
+ configure_cmd="${configure_cmd} --enable-modis --enable-lidar2nc"
+fi
+
+if [[ ! -z ${MET_PYTHON_CC} || ! -z ${MET_PYTHON_LD} ]]; then
+ configure_cmd="${configure_cmd} --enable-python"
+fi
+
+configure_cmd="${configure_cmd} ${OPT_ARGS}"
+
+echo "cd `pwd`"
+run_cmd "${configure_cmd} > $(pwd)/configure.log 2>&1"
+run_cmd "make ${MAKE_ARGS} > $(pwd)/met.make.log 2>&1"
+run_cmd "make install > $(pwd)/met.make_install.log 2>&1"
+run_cmd "make test > $(pwd)/met.make_test.log 2>&1"
+
+echo "Finished compiling at `date`"
diff --git a/internal/scripts/installation/config/install_met_env.cactus b/internal/scripts/installation/config/install_met_env.cactus
new file mode 100644
index 0000000000..63ac85192a
--- /dev/null
+++ b/internal/scripts/installation/config/install_met_env.cactus
@@ -0,0 +1,50 @@
+module reset
+module use /apps/dev/modulefiles/
+module load ve/evs/2.0
+module use /apps/ops/para/libs/modulefiles/compiler/intel/19.1.3.304
+module load netcdf/4.7.4
+module load hdf5/1.10.6
+module load bufr/11.5.0
+module load zlib/1.2.11
+module load jasper/2.0.25
+module load libpng/1.6.37
+module load gsl/2.7
+module load g2c/1.6.4
+module load proj/7.1.0
+module use /apps/dev/modulefiles
+module load fckit/0.11.0
+module load atlas/0.35.0
+module load eckit/1.24.4
+
+export FC=ifort
+export F77=ifort
+export F90=ifort
+export CC=icc
+export CXX=icpc
+export TEST_BASE=/lfs/h2/users/julie.prestopnik/12.0.0-beta5
+export LIB_DIR=${TEST_BASE}/external_libs
+export COMPILER=intel_19.1.3.304
+export MET_SUBDIR=${TEST_BASE}
+export MET_TARBALL=v12.0.0-beta5.tar.gz
+export USE_MODULES=TRUE
+export ADDTL_DIR=/apps/spack/gettext/0.21/intel/19.1.3.304/at2kdo4edvuhyzrt5g6zhwrdb7bdui4s/lib64/
+export PYTHON_MODULE=python_3.10.4
+export MET_PYTHON=/apps/spack/python/3.10.4/intel/19.1.3.304/xqft4d45h4dp4xnbz2ue3nbxv65i6bgp/
+export MET_PYTHON_LIB=/apps/spack/python/3.10.4/intel/19.1.3.304/xqft4d45h4dp4xnbz2ue3nbxv65i6bgp/lib64
+export MET_PYTHON_CC=-I/apps/spack/python/3.10.4/intel/19.1.3.304/xqft4d45h4dp4xnbz2ue3nbxv65i6bgp/include/python3.10
+export MET_PYTHON_LD=-L/apps/spack/python/3.10.4/intel/19.1.3.304/xqft4d45h4dp4xnbz2ue3nbxv65i6bgp/lib64\ -lpython3.10\ -lintl\ -lcrypt\ -ldl\ -lutil\ -lm\ -lm
+export MET_NETCDF=/apps/prod/hpc-stack/intel-19.1.3.304/netcdf/4.7.4
+export MET_HDF5=/apps/prod/hpc-stack/intel-19.1.3.304/hdf5/1.10.6
+export MET_BUFRLIB=/apps/ops/prod/libs/intel/19.1.3.304/bufr/11.5.0/lib64
+export MET_GRIB2CLIB=/apps/ops/prod/libs/intel/19.1.3.304/g2c/1.6.4/lib64
+export MET_GRIB2CINC=/apps/ops/prod/libs/intel/19.1.3.304/g2c/1.6.4/include
+export MET_GSL=/apps/spack/gsl/2.7/intel/19.1.3.304/xks7dxbowrdxhjck5zxc4rompopocevb
+export MET_PROJ=/apps/spack/proj/7.1.0/intel/19.1.3.304/cjbmc7tacv5qcfatslqmcrzo5kb4raaq
+export MET_ATLAS=/apps/dev/atlas/install-0.35.0
+export MET_ECKIT=/apps/dev/eckit/install-1.24.4
+export BUFRLIB_NAME=-lbufr_4
+export GRIB2CLIB_NAME=-lg2c
+export LIB_JASPER=/apps/spack/jasper/2.0.25/intel/19.1.3.304/sjib74krrorkyczqpqah4tvewmlnqdx4/lib64
+export LIB_LIBPNG=/apps/spack/libpng/1.6.37/intel/19.1.3.304/4ohkronuhlyherusoszzrmur5ewvlwzh/lib
+export LIB_Z=/apps/spack/zlib/1.2.11/intel/19.1.3.304/hjotqkckeoyt6j6tibalwzrlfljcjtdh/lib
+export MAKE_ARGS=-j
diff --git a/internal/scripts/installation/config/install_met_env.wcoss2 b/internal/scripts/installation/config/install_met_env.wcoss2
index 86b73e0064..68e7ef2872 100644
--- a/internal/scripts/installation/config/install_met_env.wcoss2
+++ b/internal/scripts/installation/config/install_met_env.wcoss2
@@ -1,8 +1,7 @@
module reset
-module use /apps/ops/para/libs/modulefiles/compiler/intel/19.1.3.304
-export HPC_OPT=/apps/ops/para/libs
module use /apps/dev/modulefiles/
module load ve/evs/2.0
+module use /apps/ops/para/libs/modulefiles/compiler/intel/19.1.3.304
module load netcdf/4.7.4
module load hdf5/1.10.6
module load bufr/11.6.0
@@ -12,22 +11,22 @@ module load libpng/1.6.37
module load gsl/2.7
module load g2c/1.6.4
module load proj/7.1.0
-module use /apps/dev/lmodules/intel/19.1.3.304/
-module load atlas/0.30.0
-module load eckit/1.20.2
+module use /apps/dev/modulefiles
+module load fckit/0.11.0
+module load atlas/0.35.0
+module load eckit/1.24.4
export FC=ifort
export F77=ifort
export F90=ifort
export CC=icc
export CXX=icpc
-#export TEST_BASE=/apps/ops/para/libs/intel/19.1.3.304/met/12.0.0-beta3
export TEST_BASE=$(pwd)
export LIB_DIR=${TEST_BASE}/external_libs
export BIN_DIR_PATH=${TEST_BASE}/bin
export COMPILER=intel_19.1.3.304
export MET_SUBDIR=${TEST_BASE}
-export MET_TARBALL=v12.0.0-beta3.tar.gz
+export MET_TARBALL=v12.0.0-beta5.tar.gz
export USE_MODULES=TRUE
export ADDTL_DIR=/apps/spack/gettext/0.21/intel/19.1.3.304/at2kdo4edvuhyzrt5g6zhwrdb7bdui4s/lib64
export PYTHON_MODULE=python_3.10.4
@@ -45,10 +44,10 @@ export MET_GRIB2CLIB=${g2c_ROOT}/lib64
export MET_GRIB2CINC=${G2C_INC}
export MET_GSL=/apps/spack/gsl/2.7/intel/19.1.3.304/xks7dxbowrdxhjck5zxc4rompopocevb
export MET_PROJ=/apps/spack/proj/7.1.0/intel/19.1.3.304/cjbmc7tacv5qcfatslqmcrzo5kb4raaq
-export MET_ATLASLIB=/apps/dev/intel-19.1.3.304/cray-mpich-8.1.9/atlas/0.30.0/lib64
-export MET_ATLASINC=/apps/dev/intel-19.1.3.304/cray-mpich-8.1.9/atlas/0.30.0/include/atlas
-export MET_ECKITLIB=/apps/dev/intel-19.1.3.304/cray-mpich-8.1.9/eckit/1.20.2/lib64
-export MET_ECKITINC=/apps/dev/intel-19.1.3.304/cray-mpich-8.1.9/eckit/1.20.2/include/eckit
+export MET_ATLASLIB=/apps/dev/atlas/install-0.35.0/lib64
+export MET_ATLASINC=/apps/dev/atlas/install-0.35.0/include/atlas
+export MET_ECKITLIB=/apps/dev/eckit/install-1.24.4/lib64
+export MET_ECKITINC=/apps/dev/eckit/install-1.24.4/include/eckit
export BUFRLIB_NAME=-lbufr_4
export GRIB2CLIB_NAME=-lg2c
# JY export LIB_JASPER=/apps/spack/jasper/2.0.25/intel/19.1.3.304/sjib74krrorkyczqpqah4tvewmlnqdx4/lib64
@@ -58,4 +57,3 @@ export LIB_LIBPNG=${LIBPNG_LIBDIR}
# JY export LIB_Z=/apps/spack/zlib/1.2.11/intel/19.1.3.304/hjotqkckeoyt6j6tibalwzrlfljcjtdh/lib
export LIB_Z=${ZLIB_LIBDIR}
export MAKE_ARGS=-j
-export CXXFLAGS="-std=c++11"
diff --git a/internal/scripts/sonarqube/run_sonarqube.sh b/internal/scripts/sonarqube/run_sonarqube.sh
index ac439b8a11..9b3557581a 100755
--- a/internal/scripts/sonarqube/run_sonarqube.sh
+++ b/internal/scripts/sonarqube/run_sonarqube.sh
@@ -109,8 +109,9 @@ run_command "git checkout ${1}"
# Otherwise, the SonarQube logic does not work.
export MET_DEVELOPMENT=true
-# Run the configure script
-run_command "./configure --prefix=`pwd` --enable-all"
+# Run the configure script.
+# Specify the C++ standard to limit the scope of the findings.
+run_command "./configure --prefix=`pwd` --enable-all MET_CXX_STANDARD=11"
# Define the version string
SONAR_PROJECT_VERSION=$(grep "^version" docs/conf.py | cut -d'=' -f2 | tr -d "\'\" ")
diff --git a/internal/test_unit/R_test/comp_dir.R b/internal/test_unit/R_test/comp_dir.R
index a4453459c3..c94d8bae38 100644
--- a/internal/test_unit/R_test/comp_dir.R
+++ b/internal/test_unit/R_test/comp_dir.R
@@ -51,9 +51,9 @@ strDir1 = gsub("/$", "", listArgs[1]);
strDir2 = gsub("/$", "", listArgs[2]);
# build a list of files in each stat folder
-listTest1 = system(paste("find", strDir1, "| egrep '\\.stat$|\\.txt$|\\.tcst|\\.nc$|\\.out$|\\.ps$|\\.png$' | sort"), intern=T);
+listTest1 = system(paste("find", strDir1, "| egrep '\\.stat$|\\.txt$|\\.tcst|\\.nc$|\\.out$|\\.ps$|\\.png$|\\.dat$' | sort"), intern=T);
listTest1Files = gsub(paste(strDir1, "/", sep=""), "", listTest1);
-listTest2 = system(paste("find", strDir2, "| egrep '\\.stat$|\\.txt$|\\.tcst|\\.nc$|\\.out$|\\.ps$|\\.png$' | sort"), intern=T);
+listTest2 = system(paste("find", strDir2, "| egrep '\\.stat$|\\.txt$|\\.tcst|\\.nc$|\\.out$|\\.ps$|\\.png$|\\.dat$' | sort"), intern=T);
listTest2Files = gsub(paste(strDir2, "/", sep=""), "", listTest2);
if( 1 <= verb ){ cat("dir1:", strDir1, "contains", length(listTest1Files), "files\n");
@@ -103,10 +103,11 @@ for(strFile in listTest1Files[ listTest1Files %in% listTest2Files ]){
compareNc(strFile1, strFile2, verb, strict, file_size_delta, compare_nc_var);
}
- # if the files are PostScript, PNG, or end in .out, compare accordingly
+ # if the files are PostScript, PNG, or end in .out or .dat, compare accordingly
else if( TRUE == grepl("\\.out$", strFile1, perl=T) ||
TRUE == grepl("\\.ps$", strFile1, perl=T) ||
- TRUE == grepl("\\.png$", strFile1, perl=T) ){
+ TRUE == grepl("\\.png$", strFile1, perl=T) ||
+ TRUE == grepl("\\.dat$", strFile1, perl=T) ){
if( 1 <= verb ){ cat("file1: ", strFile1, "\nfile2: ", strFile2, "\n", sep=""); }
compareDiff(strFile1, strFile2, verb);
}
diff --git a/internal/test_unit/bin/unit_test.sh b/internal/test_unit/bin/unit_test.sh
index 0f0493720f..e3bc29e181 100755
--- a/internal/test_unit/bin/unit_test.sh
+++ b/internal/test_unit/bin/unit_test.sh
@@ -24,14 +24,14 @@ if [[ -z "${MET_TEST_MET_PYTHON_EXE}" ]] ; then
export MET_TEST_MET_PYTHON_EXE=/usr/local/python3/bin/python3
fi
-PERL_UNIT_OPTS=""
+UNIT_OPTS=""
for arg in $@; do
- [ $arg == "-memchk" -o $arg == "memchk" ] && PERL_UNIT_OPTS="$PERL_UNIT_OPTS -memchk"
- [ $arg == "-callchk" -o $arg == "callchk" ] && PERL_UNIT_OPTS="$PERL_UNIT_OPTS -callchk"
+ [ $arg == "-memchk" -o $arg == "memchk" ] && UNIT_OPTS="$UNIT_OPTS -memchk"
+ [ $arg == "-callchk" -o $arg == "callchk" ] && UNIT_OPTS="$UNIT_OPTS -callchk"
done
# Unit test script
-PERL_UNIT=${MET_TEST_BASE}/perl/unit.pl
+UNIT=${MET_TEST_BASE}/python/unit.py
# Unit test XML
UNIT_XML="unit_ascii2nc.xml \
@@ -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 \
@@ -107,15 +108,15 @@ UNIT_XML="${UNIT_XML} unit_ugrid.xml"
for CUR_XML in ${UNIT_XML}; do
echo
- echo "CALLING: ${PERL_UNIT} $PERL_UNIT_OPTS ${MET_TEST_BASE}/xml/${CUR_XML}"
+ echo "CALLING: ${UNIT} $UNIT_OPTS ${MET_TEST_BASE}/xml/${CUR_XML}"
echo
- ${PERL_UNIT} $PERL_UNIT_OPTS ${MET_TEST_BASE}/xml/${CUR_XML}
+ ${UNIT} $UNIT_OPTS ${MET_TEST_BASE}/xml/${CUR_XML}
RET_VAL=$?
# Fail on non-zero return status
if [ ${RET_VAL} != 0 ]; then
echo
- echo "ERROR: ${PERL_UNIT} ${CUR_XML} failed."
+ echo "ERROR: ${UNIT} ${CUR_XML} failed."
echo
echo "*** UNIT TESTS FAILED ***"
echo
diff --git a/internal/test_unit/config/EnsembleStatConfig b/internal/test_unit/config/EnsembleStatConfig
index 80157bed0c..59661a5fe2 100644
--- a/internal/test_unit/config/EnsembleStatConfig
+++ b/internal/test_unit/config/EnsembleStatConfig
@@ -226,8 +226,10 @@ rng = {
////////////////////////////////////////////////////////////////////////////////
-grid_weight_flag = NONE;
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+grid_weight_flag = NONE;
+point_weight_flag = NONE;
+
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/EnsembleStatConfig_MASK_SID b/internal/test_unit/config/EnsembleStatConfig_MASK_SID
index 96128cb148..28bd9899b3 100644
--- a/internal/test_unit/config/EnsembleStatConfig_MASK_SID
+++ b/internal/test_unit/config/EnsembleStatConfig_MASK_SID
@@ -218,8 +218,10 @@ rng = {
////////////////////////////////////////////////////////////////////////////////
-grid_weight_flag = NONE;
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+grid_weight_flag = NONE;
+point_weight_flag = NONE;
+
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/EnsembleStatConfig_climo b/internal/test_unit/config/EnsembleStatConfig_climo
index 633ab775f9..89abf95dd8 100644
--- a/internal/test_unit/config/EnsembleStatConfig_climo
+++ b/internal/test_unit/config/EnsembleStatConfig_climo
@@ -71,6 +71,7 @@ fcst = {
field = [
{ name = "TMP"; level = "Z2"; message_type = [ "ADPSFC" ]; },
+ { name = "TMP"; level = "Z2"; message_type = [ "ADPSFC" ]; prob_cat_thresh = [ >275, >280, >285 ]; },
{ name = "TMP"; level = "P850"; message_type = [ "ADPUPA" ]; }
];
}
@@ -247,8 +248,10 @@ rng = {
////////////////////////////////////////////////////////////////////////////////
-grid_weight_flag = NONE;
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+grid_weight_flag = NONE;
+point_weight_flag = NONE;
+
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/EnsembleStatConfig_grid_weight b/internal/test_unit/config/EnsembleStatConfig_grid_weight
index 9915c3fa37..67da4d825f 100644
--- a/internal/test_unit/config/EnsembleStatConfig_grid_weight
+++ b/internal/test_unit/config/EnsembleStatConfig_grid_weight
@@ -15,7 +15,7 @@ model = "FCST";
// Output description to be written
// May be set separately in each "obs.field" entry
//
-desc = "NA";
+desc = "${DESC}";
//
// Output observation type to be written
@@ -62,7 +62,7 @@ prob_pct_thresh = [ ==0.25 ];
nc_var_str = "";
eclv_points = 0.05;
-tmp_field = [ { name = "TMP"; level = [ "Z2" ]; } ];
+tmp_field = [ { name = "TMP"; level = [ "Z2" ]; prob_cat_thresh = [ <=273, >273 ]; } ];
//
// Forecast and observation fields to be verified
@@ -139,6 +139,11 @@ climo_mean = {
hour_interval = 6;
}
+climo_stdev = climo_mean;
+climo_stdev = {
+ file_name = [ "${CLIMO_STDEV_FILE}" ];
+}
+
////////////////////////////////////////////////////////////////////////////////
//
@@ -200,11 +205,11 @@ output_flag = {
orank = NONE;
ssvar = STAT;
relp = STAT;
- pct = NONE;
- pstd = NONE;
- pjc = NONE;
- prc = NONE;
- eclv = NONE;
+ pct = STAT;
+ pstd = STAT;
+ pjc = STAT;
+ prc = STAT;
+ eclv = STAT;
}
////////////////////////////////////////////////////////////////////////////////
@@ -235,8 +240,10 @@ rng = {
////////////////////////////////////////////////////////////////////////////////
-grid_weight_flag = ${GRID_WEIGHT};
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+grid_weight_flag = ${GRID_WEIGHT};
+point_weight_flag = NONE;
+
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/EnsembleStatConfig_one_cdf_bin b/internal/test_unit/config/EnsembleStatConfig_one_cdf_bin
index 013763c74d..3828b386e5 100644
--- a/internal/test_unit/config/EnsembleStatConfig_one_cdf_bin
+++ b/internal/test_unit/config/EnsembleStatConfig_one_cdf_bin
@@ -232,8 +232,10 @@ rng = {
////////////////////////////////////////////////////////////////////////////////
-grid_weight_flag = NONE;
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+grid_weight_flag = NONE;
+point_weight_flag = NONE;
+
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/EnsembleStatConfig_point_weight b/internal/test_unit/config/EnsembleStatConfig_point_weight
new file mode 100644
index 0000000000..2e9ad158b8
--- /dev/null
+++ b/internal/test_unit/config/EnsembleStatConfig_point_weight
@@ -0,0 +1,214 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Ensemble-Stat configuration file.
+//
+// For additional information, please see the MET User's Guide.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+//
+// Output model name to be written
+//
+model = "FCST";
+
+//
+// Output description to be written
+// May be set separately in each "obs.field" entry
+//
+desc = "${DESC}";
+
+//
+// Output observation type to be written
+//
+obtype = "ANALYS";
+
+////////////////////////////////////////////////////////////////////////////////
+
+//
+// Verification grid
+//
+regrid = {
+ to_grid = NONE;
+ method = NEAREST;
+ width = 1;
+ vld_thresh = 0.5;
+ shape = SQUARE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+//
+// IDs for ensemble members
+// Only set if processing a single file with all ensembles
+//
+ens_member_ids = [];
+control_id = "";
+
+//
+// May be set separately in each "fcst.field" and "obs.field" entry
+//
+censor_thresh = [];
+censor_val = [];
+prob_cat_thresh = [];
+
+//
+// May be set separately in each "fcst.field" entry
+//
+prob_pct_thresh = [ ==0.25 ];
+
+//
+// May be set separately in each "obs.field" entry
+//
+nc_var_str = "";
+eclv_points = 0.05;
+
+//
+// Forecast and observation fields to be verified
+//
+fcst = {
+ ens_thresh = 0.75;
+ vld_thresh = 1.0;
+ message_type = [ "ADPSFC" ];
+ obs_quality_inc = [];
+ obs_quality_exc = [];
+
+ field = [
+ { name = "APCP"; level = "A24"; prob_cat_thresh = [ >=2.54 ]; }
+ ];
+}
+obs = fcst;
+
+////////////////////////////////////////////////////////////////////////////////
+
+//
+// Point observation filtering options
+// May be set separately in each "obs.field" entry
+//
+message_type = [];
+sid_inc = [];
+sid_exc = [];
+obs_thresh = [ NA ];
+obs_quality_inc = [];
+obs_quality_exc = [];
+duplicate_flag = NONE;
+obs_summary = NONE;
+obs_perc_value = 50;
+skip_const = FALSE;
+
+//
+// Observation error options
+// Set dist_type to NONE to use the observation error table instead
+// May be set separately in each "obs.field" entry
+//
+obs_error = {
+ flag = FALSE;
+ dist_type = NONE;
+ dist_parm = [];
+ inst_bias_scale = 1.0;
+ inst_bias_offset = 0.0;
+ min = NA;
+ max = NA;
+}
+
+//
+// Ensemble bin sizes
+// May be set separately in each "obs.field" entry
+//
+ens_ssvar_bin_size = 1.0;
+ens_phist_bin_size = 0.05;
+
+////////////////////////////////////////////////////////////////////////////////
+
+//
+// Point observation time window
+//
+obs_window = {
+ beg = -5400;
+ end = 5400;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+//
+// Verification masking regions
+//
+mask = {
+ grid = [];
+ poly = [];
+ sid = [ "${CONFIG_DIR}/SID_CONUS_ADPSFC_ELEV.txt" ];
+ llpnt = [];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+//
+// Confidence interval settings
+//
+ci_alpha = [ 0.05 ];
+
+////////////////////////////////////////////////////////////////////////////////
+
+//
+// Interpolation methods
+//
+interp = {
+ field = BOTH;
+ vld_thresh = 1.0;
+ shape = SQUARE;
+
+ type = [
+ {
+ method = NEAREST;
+ width = 1;
+ }
+ ];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+//
+// Statistical output types
+// May be set separately in each "obs.field" entry
+//
+output_flag = {
+ ecnt = NONE;
+ rps = NONE;
+ rhist = NONE;
+ phist = NONE;
+ orank = NONE;
+ ssvar = NONE;
+ relp = NONE;
+ pct = STAT;
+ pstd = STAT;
+ pjc = STAT;
+ prc = STAT;
+ eclv = STAT;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+//
+// Gridded verification output types
+// May be set separately in each "obs.field" entry
+//
+nc_orank_flag = FALSE;
+
+////////////////////////////////////////////////////////////////////////////////
+
+//
+// Random number generator
+//
+rng = {
+ type = "mt19937";
+ seed = "1";
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+grid_weight_flag = NONE;
+point_weight_flag = ${POINT_WEIGHT};
+
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
+
+////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/EnsembleStatConfig_python b/internal/test_unit/config/EnsembleStatConfig_python
index 4de2045664..1b32091705 100644
--- a/internal/test_unit/config/EnsembleStatConfig_python
+++ b/internal/test_unit/config/EnsembleStatConfig_python
@@ -119,6 +119,8 @@ message_type_group_map = [
{ key = "ONLYSF"; val = "ADPSFC,SFCSHP"; }
];
+obtype_as_group_val_flag = FALSE;
+
//
// Ensemble bin sizes
// May be set separately in each "obs.field" entry
@@ -222,8 +224,10 @@ rng = {
////////////////////////////////////////////////////////////////////////////////
-grid_weight_flag = NONE;
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+grid_weight_flag = NONE;
+point_weight_flag = NONE;
+
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/EnsembleStatConfig_qty_inc_exc b/internal/test_unit/config/EnsembleStatConfig_qty_inc_exc
index 0881ff3b8d..0a0bf9b074 100644
--- a/internal/test_unit/config/EnsembleStatConfig_qty_inc_exc
+++ b/internal/test_unit/config/EnsembleStatConfig_qty_inc_exc
@@ -235,8 +235,10 @@ rng = {
////////////////////////////////////////////////////////////////////////////////
-grid_weight_flag = NONE;
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+grid_weight_flag = NONE;
+point_weight_flag = NONE;
+
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/EnsembleStatConfig_rps_climo_bin_prob b/internal/test_unit/config/EnsembleStatConfig_rps_climo_bin_prob
index af4354bfea..ea1023dc36 100644
--- a/internal/test_unit/config/EnsembleStatConfig_rps_climo_bin_prob
+++ b/internal/test_unit/config/EnsembleStatConfig_rps_climo_bin_prob
@@ -216,8 +216,10 @@ rng = {
////////////////////////////////////////////////////////////////////////////////
-grid_weight_flag = NONE;
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+grid_weight_flag = NONE;
+point_weight_flag = NONE;
+
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/EnsembleStatConfig_single_file_grib b/internal/test_unit/config/EnsembleStatConfig_single_file_grib
index 20220f82b5..ba1ec381a2 100644
--- a/internal/test_unit/config/EnsembleStatConfig_single_file_grib
+++ b/internal/test_unit/config/EnsembleStatConfig_single_file_grib
@@ -131,6 +131,8 @@ message_type_group_map = [
{ key = "ONLYSF"; val = "ADPSFC,SFCSHP"; }
];
+obtype_as_group_val_flag = FALSE;
+
//
// Ensemble bin sizes
// May be set separately in each "obs.field" entry
@@ -271,8 +273,10 @@ rng = {
////////////////////////////////////////////////////////////////////////////////
-grid_weight_flag = NONE;
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+grid_weight_flag = NONE;
+point_weight_flag = NONE;
+
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/EnsembleStatConfig_single_file_nc b/internal/test_unit/config/EnsembleStatConfig_single_file_nc
index b3faf78d95..f9d18a2129 100644
--- a/internal/test_unit/config/EnsembleStatConfig_single_file_nc
+++ b/internal/test_unit/config/EnsembleStatConfig_single_file_nc
@@ -137,6 +137,8 @@ message_type_group_map = [
{ key = "ONLYSF"; val = "ADPSFC,SFCSHP"; }
];
+obtype_as_group_val_flag = FALSE;
+
//
// Ensemble bin sizes
// May be set separately in each "obs.field" entry
@@ -277,8 +279,10 @@ rng = {
////////////////////////////////////////////////////////////////////////////////
-grid_weight_flag = NONE;
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+grid_weight_flag = NONE;
+point_weight_flag = NONE;
+
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GenEnsProdConfig b/internal/test_unit/config/GenEnsProdConfig
index 9a565c2fb4..9841006614 100644
--- a/internal/test_unit/config/GenEnsProdConfig
+++ b/internal/test_unit/config/GenEnsProdConfig
@@ -13,7 +13,6 @@ model = "FCST";
//
// Output description to be written
-// May be set separately in each "obs.field" entry
//
desc = "NA";
@@ -60,17 +59,17 @@ ens = {
{
name = "UGRD";
level = [ "Z10" ];
- cat_thresh = [ CDP75 ];
+ cat_thresh = [ >OCDP75 ];
},
{
name = "WIND";
level = [ "Z10" ];
- cat_thresh = [ >=CDP25&&<=CDP75 ];
+ cat_thresh = [ >=OCDP25&&<=OCDP75 ];
}
];
}
diff --git a/internal/test_unit/config/GenEnsProdConfig_climo_anom_ens_member_id b/internal/test_unit/config/GenEnsProdConfig_climo_anom_ens_member_id
index adebdb2528..440b528326 100644
--- a/internal/test_unit/config/GenEnsProdConfig_climo_anom_ens_member_id
+++ b/internal/test_unit/config/GenEnsProdConfig_climo_anom_ens_member_id
@@ -13,7 +13,6 @@ model = "CFSv2";
//
// Output description to be written
-// May be set separately in each "obs.field" entry
//
desc = "NA";
diff --git a/internal/test_unit/config/GenEnsProdConfig_normalize b/internal/test_unit/config/GenEnsProdConfig_normalize
index b23708ab46..192c75cb5b 100644
--- a/internal/test_unit/config/GenEnsProdConfig_normalize
+++ b/internal/test_unit/config/GenEnsProdConfig_normalize
@@ -13,7 +13,6 @@ model = "FCST";
//
// Output description to be written
-// May be set separately in each "obs.field" entry
//
desc = "NA";
diff --git a/internal/test_unit/config/GenEnsProdConfig_single_file_grib b/internal/test_unit/config/GenEnsProdConfig_single_file_grib
index b1f2bb3315..82f31da619 100644
--- a/internal/test_unit/config/GenEnsProdConfig_single_file_grib
+++ b/internal/test_unit/config/GenEnsProdConfig_single_file_grib
@@ -13,7 +13,6 @@ model = "GEFS";
//
// Output description to be written
-// May be set separately in each "obs.field" entry
//
desc = "NA";
diff --git a/internal/test_unit/config/GenEnsProdConfig_single_file_nc b/internal/test_unit/config/GenEnsProdConfig_single_file_nc
index 2b4be6e12b..9d84b2bcbc 100644
--- a/internal/test_unit/config/GenEnsProdConfig_single_file_nc
+++ b/internal/test_unit/config/GenEnsProdConfig_single_file_nc
@@ -13,7 +13,6 @@ model = "CFSv2";
//
// Output description to be written
-// May be set separately in each "obs.field" entry
//
desc = "NA";
diff --git a/internal/test_unit/config/GridStatConfig_APCP_regrid b/internal/test_unit/config/GridStatConfig_APCP_regrid
index 74bbba5b4d..aea9adeaef 100644
--- a/internal/test_unit/config/GridStatConfig_APCP_regrid
+++ b/internal/test_unit/config/GridStatConfig_APCP_regrid
@@ -208,8 +208,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_GRIB_lvl_typ_val b/internal/test_unit/config/GridStatConfig_GRIB_lvl_typ_val
index 64381023a8..ecce9ddfdf 100644
--- a/internal/test_unit/config/GridStatConfig_GRIB_lvl_typ_val
+++ b/internal/test_unit/config/GridStatConfig_GRIB_lvl_typ_val
@@ -305,8 +305,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "GRIB_lvl_typ_val";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "GRIB_lvl_typ_val";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_GRIB_set_attr b/internal/test_unit/config/GridStatConfig_GRIB_set_attr
index cb2f86984c..36ab040a33 100644
--- a/internal/test_unit/config/GridStatConfig_GRIB_set_attr
+++ b/internal/test_unit/config/GridStatConfig_GRIB_set_attr
@@ -237,8 +237,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "GRIB_set_attr";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "GRIB_set_attr";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_GTG_latlon b/internal/test_unit/config/GridStatConfig_GTG_latlon
index 90be6f2172..77edd743db 100644
--- a/internal/test_unit/config/GridStatConfig_GTG_latlon
+++ b/internal/test_unit/config/GridStatConfig_GTG_latlon
@@ -216,8 +216,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_GTG_lc b/internal/test_unit/config/GridStatConfig_GTG_lc
index ddd8321fdd..0385bfda9e 100644
--- a/internal/test_unit/config/GridStatConfig_GTG_lc
+++ b/internal/test_unit/config/GridStatConfig_GTG_lc
@@ -216,8 +216,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_SEEPS b/internal/test_unit/config/GridStatConfig_SEEPS
index 8a23c76c45..808e5a10f3 100644
--- a/internal/test_unit/config/GridStatConfig_SEEPS
+++ b/internal/test_unit/config/GridStatConfig_SEEPS
@@ -210,12 +210,14 @@ nc_pairs_flag = {
// Threshold for SEEPS p1 (Probability of being dry)
seeps_p1_thresh = ${SEEPS_P1_THRESH};
+seeps_grid_climo_name = "${SEEPS_GRID_CLIMO_NAME}";
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_WRF_pres b/internal/test_unit/config/GridStatConfig_WRF_pres
index 10d46e8f94..98851dfa7b 100644
--- a/internal/test_unit/config/GridStatConfig_WRF_pres
+++ b/internal/test_unit/config/GridStatConfig_WRF_pres
@@ -281,8 +281,9 @@ ugrid_coordinates_file = "";
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_apply_mask b/internal/test_unit/config/GridStatConfig_apply_mask
index 77af6251c0..041cae792d 100644
--- a/internal/test_unit/config/GridStatConfig_apply_mask
+++ b/internal/test_unit/config/GridStatConfig_apply_mask
@@ -217,8 +217,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
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..8eab6dccb0
--- /dev/null
+++ b/internal/test_unit/config/GridStatConfig_climo_FCST_NCEP_1.0DEG_OBS_WMO_1.5DEG
@@ -0,0 +1,292 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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" ];
+
+ regrid = {
+ method = BILIN;
+ width = 2;
+ vld_thresh = 0.5;
+ shape = SQUARE;
+ }
+
+ time_interp_method = DW_MEAN;
+ day_interval = 1;
+ hour_interval = 6;
+ };
+
+ climo_stdev = climo_mean;
+ climo_stdev = {
+ file_name = [ "${FCST_CLIMO_DIR}/cstdv_1d.19590410" ];
+ };
+
+}
+
+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" ];
+ regrid = {
+ method = BILIN;
+ width = 2;
+ vld_thresh = 0.5;
+ shape = SQUARE;
+ }
+
+ time_interp_method = DW_MEAN;
+ day_interval = 1;
+ hour_interval = 12;
+ };
+
+ climo_stdev = climo_mean;
+ climo_stdev = {
+ file_name = [ "${OBS_CLIMO_DIR}/t850hPa_stdev.grib",
+ "${OBS_CLIMO_DIR}/u850hPa_stdev.grib",
+ "${OBS_CLIMO_DIR}/v850hPa_stdev.grib" ];
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+//
+// 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_climo_WMO b/internal/test_unit/config/GridStatConfig_climo_WMO
index 58f184cde0..5e37820412 100644
--- a/internal/test_unit/config/GridStatConfig_climo_WMO
+++ b/internal/test_unit/config/GridStatConfig_climo_WMO
@@ -64,25 +64,25 @@ fcst = {
{ name = "UGRD"; level = [ "P500" ]; },
{ name = "VGRD"; level = [ "P500" ]; },
{ name = "WIND"; level = [ "P500" ]; },
- { name = "TMP"; level = [ "P850" ]; cat_thresh = [ >CDP90 ]; },
- { name = "UGRD"; level = [ "P850" ]; cat_thresh = [ >CDP90 ]; },
- { name = "VGRD"; level = [ "P850" ]; cat_thresh = [ >CDP90 ]; },
- { name = "WIND"; level = [ "P850" ]; cat_thresh = [ >CDP90 ]; }
+ { name = "TMP"; level = [ "P850" ]; cat_thresh = [ >OCDP90 ]; },
+ { name = "UGRD"; level = [ "P850" ]; cat_thresh = [ >OCDP90 ]; },
+ { name = "VGRD"; level = [ "P850" ]; cat_thresh = [ >OCDP90 ]; },
+ { name = "WIND"; level = [ "P850" ]; cat_thresh = [ >OCDP90 ]; }
];
}
obs = {
- cnt_thresh = [ NA, =CDP50, ==CDP25 ];
+ cnt_thresh = [ NA, =OCDP50, ==OCDP25 ];
field = [
{ name = "TMP"; level = [ "P500" ]; cnt_thresh = [ NA ]; wind_thresh = [ NA ]; },
{ name = "UGRD"; level = [ "P500" ]; cnt_thresh = [ NA ]; wind_thresh = [ NA ]; },
{ name = "VGRD"; level = [ "P500" ]; cnt_thresh = [ NA ]; wind_thresh = [ NA ]; },
{ name = "WIND"; level = [ "P500" ]; cnt_thresh = [ NA ]; wind_thresh = [ NA ]; },
- { name = "TMP"; level = [ "P850" ]; cat_thresh = [ >CDP90 ]; },
- { name = "UGRD"; level = [ "P850" ]; cat_thresh = [ >CDP90 ]; },
- { name = "VGRD"; level = [ "P850" ]; cat_thresh = [ >CDP90 ]; },
- { name = "WIND"; level = [ "P850" ]; cat_thresh = [ >CDP90 ]; }
+ { name = "TMP"; level = [ "P850" ]; cat_thresh = [ >OCDP90 ]; },
+ { name = "UGRD"; level = [ "P850" ]; cat_thresh = [ >OCDP90 ]; },
+ { name = "VGRD"; level = [ "P850" ]; cat_thresh = [ >OCDP90 ]; },
+ { name = "WIND"; level = [ "P850" ]; cat_thresh = [ >OCDP90 ]; }
];
}
@@ -278,8 +278,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = COS_LAT;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_climo_prob b/internal/test_unit/config/GridStatConfig_climo_prob
index 3f00164d86..a1d35ed9e2 100644
--- a/internal/test_unit/config/GridStatConfig_climo_prob
+++ b/internal/test_unit/config/GridStatConfig_climo_prob
@@ -288,8 +288,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = COS_LAT;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_climo_wrap_year b/internal/test_unit/config/GridStatConfig_climo_wrap_year
index beacc6825d..d0a6296ac8 100644
--- a/internal/test_unit/config/GridStatConfig_climo_wrap_year
+++ b/internal/test_unit/config/GridStatConfig_climo_wrap_year
@@ -259,8 +259,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_fbias_perc_thresh b/internal/test_unit/config/GridStatConfig_fbias_perc_thresh
index 9d9d544afb..cb8c1ba195 100644
--- a/internal/test_unit/config/GridStatConfig_fbias_perc_thresh
+++ b/internal/test_unit/config/GridStatConfig_fbias_perc_thresh
@@ -203,8 +203,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_fourier b/internal/test_unit/config/GridStatConfig_fourier
index 3ec891b8dd..c1ae46bb99 100644
--- a/internal/test_unit/config/GridStatConfig_fourier
+++ b/internal/test_unit/config/GridStatConfig_fourier
@@ -243,8 +243,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_gen_ens_prod b/internal/test_unit/config/GridStatConfig_gen_ens_prod
index 8893c2d5ff..653f178a52 100644
--- a/internal/test_unit/config/GridStatConfig_gen_ens_prod
+++ b/internal/test_unit/config/GridStatConfig_gen_ens_prod
@@ -66,9 +66,9 @@ fcst = {
prob = TRUE;
field = [
- { name = "UGRD_Z10_ENS_FREQ_ltCDP25"; },
- { name = "UGRD_Z10_ENS_NEP_ltCDP25_NBRHD25"; },
- { name = "UGRD_Z10_ENS_NMEP_ltCDP25_NBRHD25_GAUSSIAN1"; }
+ { name = "UGRD_Z10_ENS_FREQ_ltOCDP25"; },
+ { name = "UGRD_Z10_ENS_NEP_ltOCDP25_NBRHD25"; },
+ { name = "UGRD_Z10_ENS_NMEP_ltOCDP25_NBRHD25_GAUSSIAN1"; }
];
}
@@ -76,7 +76,7 @@ obs = {
name = "UGRD";
level = "Z10";
- cat_thresh = 245, >255 ]; } ];
//
// Forecast and observation fields to be verified
@@ -179,11 +179,11 @@ distance_map = {
// Statistical output types
//
output_flag = {
- fho = NONE;
- ctc = NONE;
- cts = NONE;
- mctc = NONE;
- mcts = NONE;
+ fho = NONE;
+ ctc = STAT;
+ cts = STAT;
+ mctc = STAT;
+ mcts = STAT;
cnt = STAT;
sl1l2 = STAT;
sal1l2 = STAT;
@@ -228,8 +228,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = ${GRID_WEIGHT};
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_interp_shape b/internal/test_unit/config/GridStatConfig_interp_shape
index ad250e9802..ac3179cf94 100644
--- a/internal/test_unit/config/GridStatConfig_interp_shape
+++ b/internal/test_unit/config/GridStatConfig_interp_shape
@@ -211,8 +211,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+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 da1edb7870..54ea06965f 100644
--- a/internal/test_unit/config/GridStatConfig_mpr_thresh
+++ b/internal/test_unit/config/GridStatConfig_mpr_thresh
@@ -80,15 +80,15 @@ fcst = {
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;
}
];
@@ -276,8 +276,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = COS_LAT;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_no_leap b/internal/test_unit/config/GridStatConfig_no_leap
index 32d05b0862..f22c8e3008 100644
--- a/internal/test_unit/config/GridStatConfig_no_leap
+++ b/internal/test_unit/config/GridStatConfig_no_leap
@@ -217,8 +217,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_prob_as_scalar b/internal/test_unit/config/GridStatConfig_prob_as_scalar
index 0d5bdd25cb..2b8b91a0c4 100644
--- a/internal/test_unit/config/GridStatConfig_prob_as_scalar
+++ b/internal/test_unit/config/GridStatConfig_prob_as_scalar
@@ -238,8 +238,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_python b/internal/test_unit/config/GridStatConfig_python
index 7ca801748e..14021bd14d 100644
--- a/internal/test_unit/config/GridStatConfig_python
+++ b/internal/test_unit/config/GridStatConfig_python
@@ -218,8 +218,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "python";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "python";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_python_mixed b/internal/test_unit/config/GridStatConfig_python_mixed
index 9a39bc9533..b4c9feff07 100644
--- a/internal/test_unit/config/GridStatConfig_python_mixed
+++ b/internal/test_unit/config/GridStatConfig_python_mixed
@@ -222,8 +222,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "python_mixed";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "python_mixed";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_rtma b/internal/test_unit/config/GridStatConfig_rtma
index ddef797d2e..fea47945db 100644
--- a/internal/test_unit/config/GridStatConfig_rtma
+++ b/internal/test_unit/config/GridStatConfig_rtma
@@ -218,8 +218,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_rtma_perc_thresh b/internal/test_unit/config/GridStatConfig_rtma_perc_thresh
index 44ed5f564f..f468a9d1ba 100644
--- a/internal/test_unit/config/GridStatConfig_rtma_perc_thresh
+++ b/internal/test_unit/config/GridStatConfig_rtma_perc_thresh
@@ -221,8 +221,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_st4 b/internal/test_unit/config/GridStatConfig_st4
index 71d165e98a..1a55fc2cca 100644
--- a/internal/test_unit/config/GridStatConfig_st4
+++ b/internal/test_unit/config/GridStatConfig_st4
@@ -222,8 +222,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_st4_censor b/internal/test_unit/config/GridStatConfig_st4_censor
index e1e9adb1df..bfc90cad92 100644
--- a/internal/test_unit/config/GridStatConfig_st4_censor
+++ b/internal/test_unit/config/GridStatConfig_st4_censor
@@ -231,8 +231,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_ugrid_mpas b/internal/test_unit/config/GridStatConfig_ugrid_mpas
index d54b25de53..e61b0c2611 100644
--- a/internal/test_unit/config/GridStatConfig_ugrid_mpas
+++ b/internal/test_unit/config/GridStatConfig_ugrid_mpas
@@ -255,8 +255,9 @@ ugrid_coordinates_file = "${MET_TEST_INPUT}/ugrid_data/mpas/static.40962_reduced
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/GridStatConfig_ugrid_mpas_diag b/internal/test_unit/config/GridStatConfig_ugrid_mpas_diag
index 9e479d0302..0655fd1aa9 100644
--- a/internal/test_unit/config/GridStatConfig_ugrid_mpas_diag
+++ b/internal/test_unit/config/GridStatConfig_ugrid_mpas_diag
@@ -256,8 +256,9 @@ ugrid_coordinates_file = "${MET_TEST_INPUT}/ugrid_data/mpas/static.40962_reduced
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/Point2GridConfig_SST b/internal/test_unit/config/Point2GridConfig_SST
new file mode 100644
index 0000000000..d9a658780c
--- /dev/null
+++ b/internal/test_unit/config/Point2GridConfig_SST
@@ -0,0 +1,7 @@
+file_type = NETCDF_NCCF;
+
+var_name_map = [
+ { key = "lat_vname"; val = "yh"; },
+ { key = "lon_vname"; val = "xh"; }
+];
+
diff --git a/internal/test_unit/config/Point2GridConfig_WINDS b/internal/test_unit/config/Point2GridConfig_WINDS
new file mode 100644
index 0000000000..d39221adbe
--- /dev/null
+++ b/internal/test_unit/config/Point2GridConfig_WINDS
@@ -0,0 +1,2 @@
+obs_quality_inc = [ "2" ];
+obs_quality_exc = [ "1" ];
diff --git a/internal/test_unit/config/Point2GridConfig_lat_lon b/internal/test_unit/config/Point2GridConfig_lat_lon
new file mode 100644
index 0000000000..80eee8fef6
--- /dev/null
+++ b/internal/test_unit/config/Point2GridConfig_lat_lon
@@ -0,0 +1,4 @@
+var_name_map = [
+ { key = "lat_vname"; val = "NLAT"; },
+ { key = "lon_vname"; val = "NLON"; }
+];
diff --git a/internal/test_unit/config/Point2GridConfig_tlat_tlon b/internal/test_unit/config/Point2GridConfig_tlat_tlon
new file mode 100644
index 0000000000..66f2f854b4
--- /dev/null
+++ b/internal/test_unit/config/Point2GridConfig_tlat_tlon
@@ -0,0 +1,6 @@
+file_type = NETCDF_NCCF;
+
+var_name_map = [
+ { key = "lat_vname"; val = "TLAT"; },
+ { key = "lon_vname"; val = "TLON"; }
+];
diff --git a/internal/test_unit/config/Point2GridConfig_valid_time b/internal/test_unit/config/Point2GridConfig_valid_time
index 748da58b4f..a2a1a69a0a 100644
--- a/internal/test_unit/config/Point2GridConfig_valid_time
+++ b/internal/test_unit/config/Point2GridConfig_valid_time
@@ -22,11 +22,12 @@ valid_time = "20201022_173000";
////////////////////////////////////////////////////////////////////////////////
-
//
-// Observation message type
+// Point observation filtering options
//
-//message_type = [];
+message_type = [];
+obs_quality_inc = [];
+obs_quality_exc = [];
////////////////////////////////////////////////////////////////////////////////
@@ -72,10 +73,6 @@ valid_time = "20201022_173000";
////////////////////////////////////////////////////////////////////////////////
-//quality_mark_thresh = 2;
-
-////////////////////////////////////////////////////////////////////////////////
-
tmp_dir = "/tmp";
version = "V12.0.0";
diff --git a/internal/test_unit/config/PointStatConfig_APCP b/internal/test_unit/config/PointStatConfig_APCP
index a6a6f06d64..ca381a89d4 100644
--- a/internal/test_unit/config/PointStatConfig_APCP
+++ b/internal/test_unit/config/PointStatConfig_APCP
@@ -127,21 +127,19 @@ output_flag = {
rps = NONE;
eclv = BOTH;
mpr = NONE;
- seeps = ${SEEPS_FLAG};
- seeps_mpr = ${SEEPS_FLAG};
+ seeps = NONE;
+ seeps_mpr = NONE;
}
-////////////////////////////////////////////////////////////////////////////////
-// Threshold for SEEPS p1 (Probability of being dry)
-
-seeps_p1_thresh = ${SEEPS_P1_THRESH};
-
////////////////////////////////////////////////////////////////////////////////
duplicate_flag = NONE;
rank_corr_flag = FALSE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_APCP_HIRA b/internal/test_unit/config/PointStatConfig_APCP_HIRA
index 3dc823a50b..4e965bd716 100644
--- a/internal/test_unit/config/PointStatConfig_APCP_HIRA
+++ b/internal/test_unit/config/PointStatConfig_APCP_HIRA
@@ -142,8 +142,11 @@ seeps_p1_thresh = NA;
duplicate_flag = NONE;
rank_corr_flag = FALSE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_GTG_latlon b/internal/test_unit/config/PointStatConfig_GTG_latlon
index 17aba08c1f..ae84d237fd 100644
--- a/internal/test_unit/config/PointStatConfig_GTG_latlon
+++ b/internal/test_unit/config/PointStatConfig_GTG_latlon
@@ -161,8 +161,11 @@ seeps_p1_thresh = NA;
duplicate_flag = NONE;
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_GTG_lc b/internal/test_unit/config/PointStatConfig_GTG_lc
index d45c47f618..198a40dc2f 100644
--- a/internal/test_unit/config/PointStatConfig_GTG_lc
+++ b/internal/test_unit/config/PointStatConfig_GTG_lc
@@ -169,8 +169,11 @@ seeps_p1_thresh = NA;
duplicate_flag = NONE;
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_INTERP_OPTS b/internal/test_unit/config/PointStatConfig_INTERP_OPTS
index 43eb1f0708..e0e75a5b9b 100644
--- a/internal/test_unit/config/PointStatConfig_INTERP_OPTS
+++ b/internal/test_unit/config/PointStatConfig_INTERP_OPTS
@@ -152,8 +152,11 @@ seeps_p1_thresh = NA;
duplicate_flag = NONE;
rank_corr_flag = FALSE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_LAND_TOPO_MASK b/internal/test_unit/config/PointStatConfig_LAND_TOPO_MASK
index 48a04ed227..49cbf781dd 100644
--- a/internal/test_unit/config/PointStatConfig_LAND_TOPO_MASK
+++ b/internal/test_unit/config/PointStatConfig_LAND_TOPO_MASK
@@ -81,6 +81,8 @@ message_type_group_map = [
{ key = "WATERSF"; val = "SFCSHP"; }
];
+obtype_as_group_val_flag = FALSE;
+
////////////////////////////////////////////////////////////////////////////////
climo_mean = fcst;
@@ -192,8 +194,11 @@ seeps_p1_thresh = NA;
duplicate_flag = NONE;
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_MASK_SID b/internal/test_unit/config/PointStatConfig_MASK_SID
index a77a8f9008..253f7320a1 100644
--- a/internal/test_unit/config/PointStatConfig_MASK_SID
+++ b/internal/test_unit/config/PointStatConfig_MASK_SID
@@ -147,8 +147,11 @@ seeps_p1_thresh = NA;
duplicate_flag = NONE;
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_MPR_OBTYPE b/internal/test_unit/config/PointStatConfig_MPR_OBTYPE
new file mode 100644
index 0000000000..6aa68e9842
--- /dev/null
+++ b/internal/test_unit/config/PointStatConfig_MPR_OBTYPE
@@ -0,0 +1,166 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Point-Stat configuration file.
+//
+// For additional information, please see the MET User's Guide.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+model = "FCST";
+
+//
+// Output description to be written
+// May be set separately in each "obs.field" entry
+//
+desc = "NA";
+
+////////////////////////////////////////////////////////////////////////////////
+
+regrid = {
+ to_grid = NONE;
+ method = NEAREST;
+ width = 1;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+obs_window = {
+ beg = ${BEG_DS};
+ end = ${END_DS};
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+mpr_column = [];
+mpr_thresh = [];
+cnt_thresh = [ NA ];
+cnt_logic = UNION;
+wind_thresh = [ NA ];
+wind_logic = UNION;
+eclv_points = 0.05;
+
+//
+// Mapping of message type group name to comma-separated list of values.
+//
+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"; },
+ { key = "LANDSF"; val = "ADPSFC,MSONET"; },
+ { key = "WATERSF"; val = "SFCSHP"; }
+];
+
+obtype_as_group_val_flag = TRUE;
+
+fcst = {
+ sid_inc = [];
+ sid_exc = [];
+ obs_quality_inc = [];
+ obs_quality_exc = [];
+
+ message_type = [ "SURFACE" ];
+
+ field = [
+ { name = "TMP"; level = "Z2"; }
+ ];
+
+}
+obs = fcst;
+
+////////////////////////////////////////////////////////////////////////////////
+
+climo_mean = fcst;
+climo_mean = {
+ file_name = [ ${CLIMO_FILE} ];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+mask = {
+ grid = [ "FULL" ];
+ poly = [];
+ sid = [];
+ llpnt = [];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+ci_alpha = [ 0.05 ];
+
+boot = {
+ interval = PCTILE;
+ rep_prop = 1.0;
+ n_rep = 200;
+ rng = "mt19937";
+ seed = "1";
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+interp = {
+ vld_thresh = 1.0;
+
+ type = [
+ {
+ method = NEAREST;
+ width = 1;
+ }
+ ];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+hira = {
+ flag = TRUE;
+ width = [ 3 ];
+ vld_thresh = 1.0;
+ cov_thresh = [ ==0.25 ];
+ shape = SQUARE;
+ prob_cat_thresh = [ >273 ];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+output_flag = {
+ fho = NONE;
+ ctc = NONE;
+ cts = NONE;
+ mctc = NONE;
+ mcts = NONE;
+ cnt = STAT;
+ sl1l2 = STAT;
+ sal1l2 = STAT;
+ vl1l2 = NONE;
+ val1l2 = NONE;
+ vcnt = NONE;
+ pct = STAT;
+ pstd = NONE;
+ pjc = NONE;
+ prc = NONE;
+ ecnt = STAT;
+ rps = NONE;
+ orank = STAT;
+ eclv = NONE;
+ mpr = STAT;
+ seeps = NONE;
+ seeps_mpr = NONE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Threshold for SEEPS p1 (Probability of being dry)
+
+seeps_p1_thresh = NA;
+
+////////////////////////////////////////////////////////////////////////////////
+
+duplicate_flag = NONE;
+rank_corr_flag = TRUE;
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
+
+////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_PHYS b/internal/test_unit/config/PointStatConfig_PHYS
index 3c13262a71..6f3308f785 100644
--- a/internal/test_unit/config/PointStatConfig_PHYS
+++ b/internal/test_unit/config/PointStatConfig_PHYS
@@ -148,8 +148,11 @@ seeps_p1_thresh = NA;
duplicate_flag = NONE;
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_PHYS_pint b/internal/test_unit/config/PointStatConfig_PHYS_pint
index e246c570b3..f98f2e4102 100644
--- a/internal/test_unit/config/PointStatConfig_PHYS_pint
+++ b/internal/test_unit/config/PointStatConfig_PHYS_pint
@@ -143,8 +143,11 @@ seeps_p1_thresh = NA;
duplicate_flag = NONE;
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_SEEPS b/internal/test_unit/config/PointStatConfig_SEEPS
new file mode 100644
index 0000000000..cb7244311f
--- /dev/null
+++ b/internal/test_unit/config/PointStatConfig_SEEPS
@@ -0,0 +1,152 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Point-Stat configuration file.
+//
+// For additional information, please see the MET User's Guide.
+// Copied from PointStatConfig_APCP
+//
+////////////////////////////////////////////////////////////////////////////////
+
+model = "FCST";
+
+//
+// Output description to be written
+// May be set separately in each "obs.field" entry
+//
+desc = "NA";
+
+////////////////////////////////////////////////////////////////////////////////
+
+regrid = {
+ to_grid = NONE;
+ method = NEAREST;
+ width = 1;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+obs_window = {
+ beg = ${BEG_DS};
+ end = ${END_DS};
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+mpr_column = [];
+mpr_thresh = [];
+cnt_thresh = [ NA ];
+cnt_logic = UNION;
+wind_thresh = [ NA ];
+wind_logic = UNION;
+eclv_points = 0.05;
+
+cat_thresh = [ >0.254, >0.635, >1.270, >2.540 ];
+message_type = "ADPSFC";
+
+fcst = {
+ sid_inc = [];
+ sid_exc = [];
+ obs_quality_inc = [];
+ obs_quality_exc = [];
+
+ field = [
+ {
+ name = "${FCST_FIELD_NAME}";
+ level = "${FCST_FIELD_LEVEL}";
+ }
+ ];
+
+}
+obs = ${OBS_DICT};
+
+////////////////////////////////////////////////////////////////////////////////
+
+mask = {
+ grid = [ "FULL" ];
+ poly = [];
+ sid = [];
+ llpnt = [];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+ci_alpha = [ 0.05 ];
+
+boot = {
+ interval = PCTILE;
+ rep_prop = 1.0;
+ n_rep = 0;
+ rng = "mt19937";
+ seed = "1";
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+interp = {
+ vld_thresh = 1.0;
+
+ type = [
+ { method = MEDIAN; width = 3; },
+ { method = NEAREST; width = 1; },
+ { method = DW_MEAN; width = [ 3, 5 ]; },
+ { method = LS_FIT; width = [ 3, 5 ]; },
+ { method = BILIN; width = 2; }
+ ];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+hira = {
+ flag = FALSE;
+ width = [ 2, 3, 4, 5 ];
+ vld_thresh = 1.0;
+ cov_thresh = [ ==0.25 ];
+ shape = SQUARE;
+ prob_cat_thresh = [];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+output_flag = {
+ fho = BOTH;
+ ctc = BOTH;
+ cts = BOTH;
+ mctc = NONE;
+ mcts = NONE;
+ cnt = BOTH;
+ sl1l2 = BOTH;
+ sal1l2 = NONE;
+ vl1l2 = NONE;
+ val1l2 = NONE;
+ vcnt = NONE;
+ pct = NONE;
+ pstd = NONE;
+ pjc = NONE;
+ prc = NONE;
+ ecnt = NONE;
+ orank = NONE;
+ rps = NONE;
+ eclv = BOTH;
+ mpr = NONE;
+ seeps = BOTH;
+ seeps_mpr = BOTH;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Threshold for SEEPS p1 (Probability of being dry)
+
+seeps_p1_thresh = ${SEEPS_P1_THRESH};
+seeps_point_climo_name = "${SEEPS_POINT_CLIMO_NAME}";
+
+////////////////////////////////////////////////////////////////////////////////
+
+duplicate_flag = NONE;
+rank_corr_flag = FALSE;
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
+
+////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_WINDS b/internal/test_unit/config/PointStatConfig_WINDS
index 1c87273e89..4dac7fe51e 100644
--- a/internal/test_unit/config/PointStatConfig_WINDS
+++ b/internal/test_unit/config/PointStatConfig_WINDS
@@ -52,6 +52,8 @@ message_type_group_map = [
{ key = "USERSF"; val = "ADPSFC,SFCSHP"; }
];
+obtype_as_group_val_flag = FALSE;
+
fcst = {
sid_inc = [];
sid_exc = [];
@@ -163,8 +165,11 @@ seeps_p1_thresh = NA;
duplicate_flag = NONE;
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_aeronet b/internal/test_unit/config/PointStatConfig_aeronet
index fef6c9bb42..387a3c54a2 100644
--- a/internal/test_unit/config/PointStatConfig_aeronet
+++ b/internal/test_unit/config/PointStatConfig_aeronet
@@ -212,8 +212,11 @@ seeps_p1_thresh = NA;
duplicate_flag = NONE;
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_airnow b/internal/test_unit/config/PointStatConfig_airnow
index 4223455902..4e7cfe79ba 100644
--- a/internal/test_unit/config/PointStatConfig_airnow
+++ b/internal/test_unit/config/PointStatConfig_airnow
@@ -92,6 +92,8 @@ message_type_group_map = [
{ key = "WATERSF"; val = "SFCSHP"; }
];
+obtype_as_group_val_flag = FALSE;
+
////////////////////////////////////////////////////////////////////////////////
//
@@ -240,8 +242,10 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
-tmp_dir = "/tmp";
-output_prefix = "";
-version = "V12.0.0";
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_climo b/internal/test_unit/config/PointStatConfig_climo
index d7f89b3cb0..d87ff87ca5 100644
--- a/internal/test_unit/config/PointStatConfig_climo
+++ b/internal/test_unit/config/PointStatConfig_climo
@@ -285,8 +285,11 @@ seeps_p1_thresh = NA;
duplicate_flag = NONE;
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_climo_WMO b/internal/test_unit/config/PointStatConfig_climo_WMO
index 1ddc8deb1e..c34dc0989e 100644
--- a/internal/test_unit/config/PointStatConfig_climo_WMO
+++ b/internal/test_unit/config/PointStatConfig_climo_WMO
@@ -55,25 +55,25 @@ fcst = {
{ name = "UGRD"; level = [ "P500" ]; },
{ name = "VGRD"; level = [ "P500" ]; },
{ name = "WIND"; level = [ "P500" ]; },
- { name = "TMP"; level = [ "P850" ]; cat_thresh = [ >CDP90 ]; },
- { name = "UGRD"; level = [ "P850" ]; cat_thresh = [ >CDP90 ]; },
- { name = "VGRD"; level = [ "P850" ]; cat_thresh = [ >CDP90 ]; },
- { name = "WIND"; level = [ "P850" ]; cat_thresh = [ >CDP90 ]; }
+ { name = "TMP"; level = [ "P850" ]; cat_thresh = [ >OCDP90 ]; },
+ { name = "UGRD"; level = [ "P850" ]; cat_thresh = [ >OCDP90 ]; },
+ { name = "VGRD"; level = [ "P850" ]; cat_thresh = [ >OCDP90 ]; },
+ { name = "WIND"; level = [ "P850" ]; cat_thresh = [ >OCDP90 ]; }
];
}
obs = {
- cnt_thresh = [ NA, =CDP50, ==CDP25 ];
+ cnt_thresh = [ NA, =OCDP50, ==OCDP25 ];
field = [
{ name = "TMP"; level = [ "P500" ]; cnt_thresh = [ NA ]; wind_thresh = [ NA ]; },
{ name = "UGRD"; level = [ "P500" ]; cnt_thresh = [ NA ]; wind_thresh = [ NA ]; },
{ name = "VGRD"; level = [ "P500" ]; cnt_thresh = [ NA ]; wind_thresh = [ NA ]; },
{ name = "WIND"; level = [ "P500" ]; cnt_thresh = [ NA ]; wind_thresh = [ NA ]; },
- { name = "TMP"; level = [ "P850" ]; cat_thresh = [ >CDP90 ]; },
- { name = "UGRD"; level = [ "P850" ]; cat_thresh = [ >CDP90 ]; },
- { name = "VGRD"; level = [ "P850" ]; cat_thresh = [ >CDP90 ]; },
- { name = "WIND"; level = [ "P850" ]; cat_thresh = [ >CDP90 ]; }
+ { name = "TMP"; level = [ "P850" ]; cat_thresh = [ >OCDP90 ]; },
+ { name = "UGRD"; level = [ "P850" ]; cat_thresh = [ >OCDP90 ]; },
+ { name = "VGRD"; level = [ "P850" ]; cat_thresh = [ >OCDP90 ]; },
+ { name = "WIND"; level = [ "P850" ]; cat_thresh = [ >OCDP90 ]; }
];
}
@@ -230,8 +230,11 @@ seeps_p1_thresh = NA;
duplicate_flag = NONE;
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_climo_prob b/internal/test_unit/config/PointStatConfig_climo_prob
index 364c1bfe73..b69812fae5 100644
--- a/internal/test_unit/config/PointStatConfig_climo_prob
+++ b/internal/test_unit/config/PointStatConfig_climo_prob
@@ -232,8 +232,11 @@ seeps_p1_thresh = NA;
duplicate_flag = NONE;
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_dup b/internal/test_unit/config/PointStatConfig_dup
index 8fad74b0e5..ff42a31eab 100644
--- a/internal/test_unit/config/PointStatConfig_dup
+++ b/internal/test_unit/config/PointStatConfig_dup
@@ -165,8 +165,11 @@ seeps_p1_thresh = NA;
duplicate_flag = ${DUPLICATE_FLAG};
rank_corr_flag = FALSE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_mpr_thresh b/internal/test_unit/config/PointStatConfig_mpr_thresh
index 5740d4907a..6b62a8df4f 100644
--- a/internal/test_unit/config/PointStatConfig_mpr_thresh
+++ b/internal/test_unit/config/PointStatConfig_mpr_thresh
@@ -69,14 +69,14 @@ fcst = {
desc = "ABS_OBS_FCST_DIFF";
},
{
- 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";
}
];
}
@@ -224,8 +224,11 @@ seeps_p1_thresh = NA;
duplicate_flag = NONE;
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_obs_summary b/internal/test_unit/config/PointStatConfig_obs_summary
index a931ba6b21..dc5b55a67e 100644
--- a/internal/test_unit/config/PointStatConfig_obs_summary
+++ b/internal/test_unit/config/PointStatConfig_obs_summary
@@ -153,8 +153,11 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
rank_corr_flag = FALSE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_obs_summary_all b/internal/test_unit/config/PointStatConfig_obs_summary_all
index 384e4ada19..e5bc4dcd7a 100644
--- a/internal/test_unit/config/PointStatConfig_obs_summary_all
+++ b/internal/test_unit/config/PointStatConfig_obs_summary_all
@@ -222,8 +222,11 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
rank_corr_flag = FALSE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_point_weight b/internal/test_unit/config/PointStatConfig_point_weight
new file mode 100644
index 0000000000..4f9528e26e
--- /dev/null
+++ b/internal/test_unit/config/PointStatConfig_point_weight
@@ -0,0 +1,145 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Point-Stat configuration file.
+//
+// For additional information, please see the MET User's Guide.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+model = "SREF";
+
+//
+// Output description to be written
+// May be set separately in each "obs.field" entry
+//
+desc = "${DESC}";
+
+////////////////////////////////////////////////////////////////////////////////
+
+regrid = {
+ to_grid = NONE;
+ method = NEAREST;
+ width = 1;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+obs_window = {
+ beg = -1800;
+ end = 1800;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+mpr_column = [];
+mpr_thresh = [];
+cnt_thresh = [ NA ];
+cnt_logic = UNION;
+wind_thresh = [ NA ];
+wind_logic = UNION;
+eclv_points = 0.05;
+
+fcst = {
+ sid_inc = [];
+ sid_exc = [];
+ obs_quality_inc = [];
+ obs_quality_exc = [];
+
+ field = [
+ { name = "TMP"; level = "P850"; message_type = "ADPUPA"; cat_thresh = [ >273, >283 ]; },
+ { name = "UGRD"; level = "P850"; message_type = "ADPUPA"; cat_thresh = [ >5 ]; },
+ { name = "VGRD"; level = "P850"; message_type = "ADPUPA"; cat_thresh = [ >5 ]; }
+ ];
+
+}
+obs = fcst;
+
+////////////////////////////////////////////////////////////////////////////////
+
+mask = {
+ grid = [];
+ poly = [];
+ sid = [ "${CONFIG_DIR}/SID_CONUS_ADPUPA_ELEV.txt" ];
+ llpnt = [];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+ci_alpha = [ 0.05 ];
+
+boot = {
+ interval = PCTILE;
+ rep_prop = 1.0;
+ n_rep = 200;
+ rng = "mt19937";
+ seed = "1";
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+interp = {
+ vld_thresh = 1.0;
+
+ type = [
+ {
+ method = NEAREST;
+ width = 1;
+ }
+ ];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+hira = {
+ flag = FALSE;
+ width = [ 2, 3, 4, 5 ];
+ vld_thresh = 1.0;
+ cov_thresh = [ ==0.25 ];
+ shape = SQUARE;
+ prob_cat_thresh = [];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+output_flag = {
+ fho = NONE;
+ ctc = STAT;
+ cts = STAT;
+ mctc = STAT;
+ mcts = STAT;
+ cnt = STAT;
+ sl1l2 = STAT;
+ sal1l2 = NONE;
+ vl1l2 = STAT;
+ val1l2 = NONE;
+ vcnt = STAT;
+ pct = NONE;
+ pstd = NONE;
+ pjc = NONE;
+ prc = NONE;
+ ecnt = NONE;
+ orank = NONE;
+ rps = NONE;
+ eclv = STAT;
+ mpr = STAT;
+ seeps = NONE;
+ seeps_mpr = NONE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Threshold for SEEPS p1 (Probability of being dry)
+
+seeps_p1_thresh = NA;
+
+////////////////////////////////////////////////////////////////////////////////
+
+duplicate_flag = NONE;
+rank_corr_flag = TRUE;
+
+point_weight_flag = ${POINT_WEIGHT};
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
+
+////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_prob b/internal/test_unit/config/PointStatConfig_prob
index ab8067a79e..e4149c7eff 100644
--- a/internal/test_unit/config/PointStatConfig_prob
+++ b/internal/test_unit/config/PointStatConfig_prob
@@ -150,8 +150,11 @@ seeps_p1_thresh = NA;
duplicate_flag = NONE;
rank_corr_flag = FALSE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_prob_point_weight b/internal/test_unit/config/PointStatConfig_prob_point_weight
new file mode 100644
index 0000000000..f083cb8807
--- /dev/null
+++ b/internal/test_unit/config/PointStatConfig_prob_point_weight
@@ -0,0 +1,151 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Point-Stat configuration file.
+//
+// For additional information, please see the MET User's Guide.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+model = "SREF";
+
+//
+// Output description to be written
+// May be set separately in each "obs.field" entry
+//
+desc = "${DESC}";
+
+////////////////////////////////////////////////////////////////////////////////
+
+regrid = {
+ to_grid = NONE;
+ method = NEAREST;
+ width = 1;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+obs_window = {
+ beg = -1800;
+ end = 1800;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+mpr_column = [];
+mpr_thresh = [];
+cnt_thresh = [ NA ];
+cnt_logic = UNION;
+wind_thresh = [ NA ];
+wind_logic = UNION;
+eclv_points = 0.05;
+
+fcst = {
+ sid_inc = [];
+ sid_exc = [];
+ obs_quality_inc = [];
+ obs_quality_exc = [];
+
+ field = [
+ { name = "PROB"; level = "P850";
+ prob = { name = "TMP"; thresh_hi = 273; };
+ cat_thresh = ==0.25; }
+ ];
+
+}
+obs = {
+ message_type = "ADPUPA";
+
+ field = [
+ { name = "TMP"; level = "P850"; cat_thresh = <273; }
+ ];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+mask = {
+ grid = [ "FULL" ];
+ poly = [];
+ sid = [ "${CONFIG_DIR}/SID_CONUS_ADPUPA_ELEV.txt" ];
+ llpnt = [];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+ci_alpha = [ 0.05 ];
+
+boot = {
+ interval = PCTILE;
+ rep_prop = 1.0;
+ n_rep = 200;
+ rng = "mt19937";
+ seed = "1";
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+interp = {
+ vld_thresh = 1.0;
+
+ type = [
+ {
+ method = NEAREST;
+ width = 1;
+ }
+ ];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+hira = {
+ flag = FALSE;
+ width = [ 2, 3, 4, 5 ];
+ vld_thresh = 1.0;
+ cov_thresh = [ ==0.25 ];
+ shape = SQUARE;
+ prob_cat_thresh = [];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+output_flag = {
+ fho = NONE;
+ ctc = NONE;
+ cts = NONE;
+ mctc = NONE;
+ mcts = NONE;
+ cnt = NONE;
+ sl1l2 = NONE;
+ sal1l2 = NONE;
+ vl1l2 = NONE;
+ val1l2 = NONE;
+ vcnt = NONE;
+ pct = STAT;
+ pstd = STAT;
+ pjc = STAT;
+ prc = STAT;
+ ecnt = NONE;
+ orank = NONE;
+ rps = NONE;
+ eclv = STAT;
+ mpr = STAT;
+ seeps = NONE;
+ seeps_mpr = NONE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Threshold for SEEPS p1 (Probability of being dry)
+
+seeps_p1_thresh = NA;
+
+////////////////////////////////////////////////////////////////////////////////
+
+duplicate_flag = NONE;
+rank_corr_flag = TRUE;
+
+point_weight_flag = ${POINT_WEIGHT};
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
+
+////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_python b/internal/test_unit/config/PointStatConfig_python
index 5116179451..3f56423d96 100644
--- a/internal/test_unit/config/PointStatConfig_python
+++ b/internal/test_unit/config/PointStatConfig_python
@@ -219,9 +219,12 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
rank_corr_flag = FALSE;
-tmp_dir = "/tmp";
-output_prefix = "";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_qty_inc_exc b/internal/test_unit/config/PointStatConfig_qty_inc_exc
index 1eab2b184c..2345684e7a 100644
--- a/internal/test_unit/config/PointStatConfig_qty_inc_exc
+++ b/internal/test_unit/config/PointStatConfig_qty_inc_exc
@@ -209,8 +209,11 @@ seeps_p1_thresh = NA;
duplicate_flag = NONE;
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_sid_inc_exc b/internal/test_unit/config/PointStatConfig_sid_inc_exc
index a586064f53..9ab93b7417 100644
--- a/internal/test_unit/config/PointStatConfig_sid_inc_exc
+++ b/internal/test_unit/config/PointStatConfig_sid_inc_exc
@@ -156,8 +156,11 @@ seeps_p1_thresh = NA;
duplicate_flag = NONE;
obs_summary = NEAREST;
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_ugrid_mpas_diag b/internal/test_unit/config/PointStatConfig_ugrid_mpas_diag
index 886c6bb301..3c1a4054a6 100644
--- a/internal/test_unit/config/PointStatConfig_ugrid_mpas_diag
+++ b/internal/test_unit/config/PointStatConfig_ugrid_mpas_diag
@@ -160,8 +160,11 @@ ugrid_coordinates_file = "${MET_TEST_INPUT}/ugrid_data/mpas/static.40962_reduced
duplicate_flag = NONE;
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_ugrid_mpas_out b/internal/test_unit/config/PointStatConfig_ugrid_mpas_out
index c16deb0f7d..dcb7afe613 100644
--- a/internal/test_unit/config/PointStatConfig_ugrid_mpas_out
+++ b/internal/test_unit/config/PointStatConfig_ugrid_mpas_out
@@ -160,8 +160,11 @@ ugrid_coordinates_file = "${MET_TEST_INPUT}/ugrid_data/mpas/static.40962_reduced
duplicate_flag = NONE;
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/PointStatConfig_ugrid_no_dataset b/internal/test_unit/config/PointStatConfig_ugrid_no_dataset
index 9c7c7f5b3a..2cc3296b6e 100644
--- a/internal/test_unit/config/PointStatConfig_ugrid_no_dataset
+++ b/internal/test_unit/config/PointStatConfig_ugrid_no_dataset
@@ -160,8 +160,11 @@ ugrid_coordinates_file = "${MET_TEST_INPUT}/ugrid_data/mpas/static.40962_reduced
duplicate_flag = NONE;
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "${OUTPUT_PREFIX}";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${OUTPUT_PREFIX}";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/SID_CONUS_ADPSFC_ELEV.txt b/internal/test_unit/config/SID_CONUS_ADPSFC_ELEV.txt
new file mode 100644
index 0000000000..03da3d6060
--- /dev/null
+++ b/internal/test_unit/config/SID_CONUS_ADPSFC_ELEV.txt
@@ -0,0 +1,2109 @@
+SID_CONUS_ADPSFC_ELEV
+1L2(47.07002)
+3CLO3(2.57002)
+AAT(1492.32002)
+AATC1(318.82002)
+ABCC1(1419.32002)
+ABEW1(182.57002)
+ABMC1(1426.07002)
+ABNW1(281.32002)
+ABRC1(1455.82002)
+ABTM8(1348.82002)
+ACLN2(1838.32002)
+ACMC1(43.07002)
+ACRI1(1771.07002)
+ACRU1(2216.82002)
+ACV(72.57002)
+ADRC1(307.07002)
+AFHA3(1553.32002)
+AFMA3(1278.57002)
+AFRA3(901.07002)
+AFRC1(2086.07002)
+AFRI1(1386.32002)
+AFSC1(1455.82002)
+AFSN2(2029.82002)
+AGDO3(672.82002)
+AGKO3(1514.82002)
+AGPC1(2767.82002)
+AGTQ1(910.82002)
+AGWC1(638.57002)
+AIDC1(0.57002)
+AJGW1(193.32002)
+AJO(306.57002)
+AKEC1(1041.07002)
+ALDC1(553.57002)
+ALFO3(1569.32002)
+ALKN2(1922.32002)
+ALLN2(2004.57002)
+ALMA3(563.07002)
+ALPC1(671.32002)
+ALRN2(1626.57002)
+ALW(501.57002)
+AMBC1(2004.07002)
+ANAC1(106.82002)
+ANDC1(494.82002)
+ANEC1(654.07002)
+ANIC1(0.070023)
+ANRO3(1916.07002)
+ANSO3(1711.57002)
+APC(73.82002)
+APDN2(926.07002)
+APIC1(1453.57002)
+APKC1(1460.07002)
+APLC1(941.07002)
+APSW1(457.32002)
+APYC1(1361.82002)
+ARAO3(55.07002)
+ARAU1(1446.82002)
+ARAW1(675.82002)
+ARFO3(1248.07002)
+ARGC1(384.82002)
+ARKI1(1354.82002)
+ASFA3(1807.57002)
+ASHW1(944.82002)
+ASMC1(354.32002)
+ASRC1(655.07002)
+AST(11.82002)
+ASYU1(2478.82002)
+ATAI1(2067.57002)
+ATFO3(1461.07002)
+ATHC1(1339.82002)
+ATLC1(254.07002)
+ATLI1(2289.32002)
+ATNC1(1160.57002)
+ATRC1(1088.57002)
+ATSC1(1496.57002)
+AUBW1(95.82002)
+AURO3(67.07002)
+AVLC1(1727.57002)
+AVNC1(0.57002)
+AVX(23.57002)
+AZRQ1(1107.82002)
+BAB(104.07002)
+BABC1(1253.57002)
+BADM8(1806.57002)
+BADU1(1144.32002)
+BAEI1(2204.57002)
+BAFO3(1320.57002)
+BAGA3(1147.82002)
+BAJC1(600.82002)
+BALO3(1239.32002)
+BAMC1(456.57002)
+BANM8(1254.32002)
+BANO3(34.57002)
+BARQ1(964.07002)
+BARQ2(1466.57002)
+BASC1(1137.82002)
+BASI1(2203.57002)
+BASQ1(829.32002)
+BATN2(1573.32002)
+BBBC1(1706.57002)
+BBFO3(1239.57002)
+BBRA3(1741.82002)
+BBYC1(3.57002)
+BCDO3(1545.82002)
+BCDW1(145.07002)
+BCFO3(1313.82002)
+BCNC1(1598.32002)
+BCRQ1(1161.32002)
+BCYC1(1381.82002)
+BDDA3(1294.07002)
+BDFO3(319.82002)
+BDMC1(1065.07002)
+BDOC1(1834.82002)
+BDYC1(733.32002)
+BEAM8(2414.82002)
+BEBC1(133.32002)
+BEDO3(1542.32002)
+BEFM8(1915.07002)
+BENC1(242.07002)
+BERN2(2213.82002)
+BETC1(2246.57002)
+BEUO3(1317.32002)
+BEWO3(1178.07002)
+BFL(183.07002)
+BFRI1(1574.57002)
+BFYI1(1079.32002)
+BGBC1(981.32002)
+BGCO3(1128.07002)
+BGFO3(1380.57002)
+BGRM8(1342.32002)
+BGVC1(744.07002)
+BHAU1(1401.07002)
+BHNC1(270.32002)
+BIEQ1(903.82002)
+BIGN2(2094.82002)
+BIH(1884.57002)
+BIIC1(795.07002)
+BIRQ2(1121.82002)
+BISM8(1311.07002)
+BKBW1(135.82002)
+BKCU1(1996.82002)
+BKE(1193.57002)
+BKFN2(2023.82002)
+BKFO3(612.32002)
+BKGC1(1070.32002)
+BKLC1(1314.82002)
+BKRC1(2257.82002)
+BKRN2(2023.82002)
+BKSI1(1887.32002)
+BKVN2(763.07002)
+BLAO3(1066.32002)
+BLBC1(80.32002)
+BLBO3(551.07002)
+BLCC1(2231.32002)
+BLCN2(1699.57002)
+BLDQ1(1185.07002)
+BLEN2(1710.07002)
+BLH(131.57002)
+BLI(61.07002)
+BLKM8(1868.32002)
+BLKO3(1159.07002)
+BLMC1(2163.07002)
+BLOM8(2219.07002)
+BLPO3(1740.57002)
+BLRC1(284.07002)
+BLSC1(1622.32002)
+BLTM8(1135.32002)
+BLTQ1(952.57002)
+BLU(1381.82002)
+BLUN2(1525.82002)
+BMEC1(864.07002)
+BMFW1(1183.82002)
+BMOC1(1081.07002)
+BMTC1(534.82002)
+BMUC1(1538.57002)
+BNCC1(186.57002)
+BNCN2(1573.57002)
+BNDC1(284.07002)
+BNDO3(1178.07002)
+BNDW1(615.07002)
+BNFO3(421.32002)
+BNGC1(211.57002)
+BNKC1(1359.82002)
+BNO(1369.82002)
+BNRI1(2203.57002)
+BNTC1(1001.07002)
+BNVC1(422.32002)
+BOCC1(2054.82002)
+BOFO3(1183.07002)
+BOGC1(1867.07002)
+BOI(970.57002)
+BOKO3(110.57002)
+BOLC1(1569.82002)
+BONO3(566.07002)
+BOOM8(1316.82002)
+BORO3(1760.32002)
+BOUN2(609.57002)
+BOWC1(1768.32002)
+BPAW1(1158.32002)
+BPFC1(1638.32002)
+BPKC1(1700.32002)
+BPKN2(2249.82002)
+BPMC1(1700.32002)
+BPNC1(1378.82002)
+BPOC1(2480.07002)
+BQFO3(1635.57002)
+BRAQ2(1663.07002)
+BRBI1(1671.57002)
+BRCN2(2287.57002)
+BRCQ1(2131.82002)
+BRDC1(335.82002)
+BRHC1(711.32002)
+BRLM8(2082.57002)
+BRLN2(1719.82002)
+BRMO3(1136.32002)
+BRNQ1(820.32002)
+BROC1(846.82002)
+BROQ1(1142.57002)
+BRRC1(643.32002)
+BRRI1(1818.57002)
+BRRM8(2132.82002)
+BRUO3(331.82002)
+BRWC1(85.57002)
+BSCM8(1981.57002)
+BSCN2(1305.07002)
+BSDI1(1268.82002)
+BSNC1(1460.07002)
+BSPM8(1931.32002)
+BSTU1(1783.57002)
+BTFO3(1261.82002)
+BTM(1918.32002)
+BTRC1(1249.82002)
+BTRI1(1875.57002)
+BTTC1(54.32002)
+BTYO3(1454.82002)
+BUBC1(186.57002)
+BUCO3(1200.57002)
+BUCW1(409.32002)
+BUFC1(1499.32002)
+BUFN2(1468.32002)
+BUFO3(856.07002)
+BUGC1(1181.07002)
+BULI1(1830.82002)
+BULO3(890.32002)
+BULQ1(1326.82002)
+BULQ2(1297.07002)
+BUMC1(1001.07002)
+BUO(1001.07002)
+BUPC1(1314.82002)
+BUR(400.32002)
+BUSW1(695.82002)
+BVAQ1(852.82002)
+BVDC1(1053.82002)
+BVLQ1(1408.32002)
+BVRC1(167.32002)
+BVRO3(1345.32002)
+BWFO3(1433.32002)
+BWSO3(1555.82002)
+BWSQ1(2318.82002)
+BYCU1(2325.07002)
+BYFO3(1374.57002)
+BYI(1307.82002)
+BZRC1(941.57002)
+CAEC1(379.32002)
+CAFO3(1428.07002)
+CAHC1(611.32002)
+CALU1(1709.82002)
+CAMI1(1163.32002)
+CANO3(129.07002)
+CAPC1(352.57002)
+CAPN2(1838.32002)
+CASN2(1044.32002)
+CATN2(1799.82002)
+CAWN2(615.57002)
+CAZC1(779.32002)
+CBFI1(2468.07002)
+CBRA3(206.57002)
+CBUC1(1715.57002)
+CCCC1(794.57002)
+CCCQ1(1301.57002)
+CCDI1(1551.82002)
+CCEC1(804.07002)
+CCEN2(637.82002)
+CCHC1(402.07002)
+CCR(86.07002)
+CCRN2(1826.32002)
+CCRO3(180.57002)
+CCUN2(1877.57002)
+CCZC1(123.32002)
+CDAW1(717.32002)
+CDCU1(2042.07002)
+CDEC1(1110.57002)
+CDGC1(561.32002)
+CDLC1(463.32002)
+CDMU1(1612.57002)
+CEC(62.82002)
+CECU1(2011.82002)
+CEDN2(2100.57002)
+CEDW1(575.82002)
+CEEC1(295.07002)
+CEFO3(1330.32002)
+CEKC1(856.57002)
+CENW1(145.07002)
+CESC1(1699.82002)
+CFCC1(1585.82002)
+CFRC1(1483.32002)
+CFWC1(85.57002)
+CGDN2(1001.82002)
+CGFO3(1276.82002)
+CGFW1(859.57002)
+CGVC1(2744.57002)
+CGWO3(843.57002)
+CHAC1(1432.82002)
+CHEA3(1392.82002)
+CHFQ1(1614.82002)
+CHMC1(1823.82002)
+CHMQ1(979.32002)
+CHMQ2(824.82002)
+CHOC1(1318.57002)
+CHPQ1(1568.32002)
+CHRI1(2024.07002)
+CHRO3(208.32002)
+CHSN2(2178.57002)
+CHTC1(396.07002)
+CHUM8(1922.32002)
+CHWC1(611.32002)
+CICC1(88.07002)
+CIFO3(1533.82002)
+CINW1(473.07002)
+CISC1(1050.07002)
+CJAW1(596.82002)
+CLBC1(1135.82002)
+CLFC1(568.07002)
+CLFO3(1475.07002)
+CLFU1(1752.82002)
+CLHC1(380.82002)
+CLKI1(1165.32002)
+CLKO3(1197.07002)
+CLLC1(153.07002)
+CLLO3(1136.57002)
+CLM(432.57002)
+CLNC1(1473.32002)
+CLSC1(-0.42998)
+CLSW1(152.82002)
+CLVM8(2188.07002)
+CMA(58.32002)
+CMAC1(69.82002)
+CMBM8(1785.32002)
+CMFW1(1133.07002)
+CMNC1(1096.07002)
+CMOC1(1000.82002)
+CMPQ1(1745.82002)
+CMVC1(1215.57002)
+CNAC1(353.57002)
+CNFC1(1453.82002)
+CNFO3(262.32002)
+CNGC1(488.82002)
+CNIC1(605.07002)
+CNJC1(153.07002)
+CNO(269.82002)
+CNSC1(1094.32002)
+CNYC1(1463.32002)
+COCC1(244.57002)
+CODC1(494.82002)
+COE(828.07002)
+COEC1(494.82002)
+COGC1(581.07002)
+COIN2(2005.82002)
+COKC1(1728.32002)
+COLO3(1365.82002)
+COMN2(2082.82002)
+CONM8(1755.32002)
+COPM8(1864.32002)
+COVC1(989.32002)
+COWC1(548.07002)
+COXQ1(1930.57002)
+COYN2(1868.07002)
+COZI1(1938.32002)
+CPCM8(1809.32002)
+CPFO3(1733.57002)
+CPLC1(2317.32002)
+CPPW1(1380.57002)
+CPWA3(1660.57002)
+CQFO3(1421.57002)
+CQLQ2(504.07002)
+CQT(87.82002)
+CRAQ1(842.07002)
+CRCA3(1752.32002)
+CRCW1(958.32002)
+CRGC1(53.57002)
+CRIC1(217.07002)
+CRKI1(990.82002)
+CRLC1(2654.82002)
+CRLO3(1711.57002)
+CRMI1(1867.82002)
+CROQ1(1719.07002)
+CRQ(29.32002)
+CRSN2(1843.32002)
+CRTI1(1867.82002)
+CRVC1(2594.82002)
+CRVO3(95.57002)
+CRWA3(308.32002)
+CRWC1(1561.07002)
+CRWW1(145.07002)
+CRXC1(99.07002)
+CRYN2(653.57002)
+CRZC1(1197.82002)
+CSCI1(1635.57002)
+CSCO3(1553.07002)
+CSDI1(1635.57002)
+CSFO3(1464.32002)
+CSHW1(236.32002)
+CSMC1(538.32002)
+CSTC1(583.57002)
+CSTO3(1574.82002)
+CSUC1(446.57002)
+CSVC1(410.07002)
+CSWC1(1238.32002)
+CSXC1(783.32002)
+CSZC1(1587.82002)
+CTB(1155.57002)
+CTLN2(2114.07002)
+CTNC1(879.32002)
+CTOC1(149.32002)
+CUGW1(699.82002)
+CUMW1(674.32002)
+CUTQ1(2228.57002)
+CUUC1(1457.57002)
+CVAC1(38.32002)
+CVBC1(335.07002)
+CVFO3(671.82002)
+CVSC1(1020.32002)
+CVSO3(161.57002)
+CWFO3(1326.07002)
+CWSN2(587.32002)
+CWXW1(575.82002)
+CXCC1(67.57002)
+CYAC1(988.32002)
+CYFI1(1494.07002)
+CYFW1(555.57002)
+CYMC1(875.32002)
+CYOC1(410.07002)
+CYVC1(1786.82002)
+CZFO3(1790.57002)
+CZZ(971.07002)
+DACC1(559.07002)
+DAG(774.07002)
+DALM8(1921.32002)
+DANO3(1310.82002)
+DARW1(786.57002)
+DBCQ2(1799.57002)
+DBLC1(572.32002)
+DCCW1(817.32002)
+DCEN2(692.07002)
+DCKN2(587.32002)
+DCRM8(1575.07002)
+DCUC1(303.07002)
+DCWC1(85.57002)
+DDWC1(462.57002)
+DEAI1(977.07002)
+DECC1(1031.07002)
+DEDN2(1336.82002)
+DEEM8(1716.82002)
+DEFO3(828.32002)
+DEHI1(1377.57002)
+DEIC1(683.07002)
+DEMC1(1070.32002)
+DENC1(1013.07002)
+DERM8(1780.07002)
+DESC1(734.07002)
+DESN2(1602.57002)
+DEVC1(539.32002)
+DEW(710.32002)
+DGFC1(1118.82002)
+DGRC1(291.82002)
+DHDI1(2190.07002)
+DHLM8(2060.57002)
+DIAO3(1643.32002)
+DIDN2(926.07002)
+DIVM8(2339.57002)
+DIXO3(126.07002)
+DKFC1(1050.07002)
+DKYC1(2509.57002)
+DLBQ1(1262.82002)
+DLCC1(1732.57002)
+DLN(1711.07002)
+DLS(362.07002)
+DLTU1(1439.82002)
+DLVC1(476.57002)
+DMLC1(1737.07002)
+DMRA3(1642.32002)
+DNPC1(1544.57002)
+DNRC1(2091.32002)
+DNVC1(1511.57002)
+DOGC1(1949.07002)
+DOGQ1(1956.32002)
+DOTW1(284.57002)
+DOUW1(740.82002)
+DPHC1(1381.82002)
+DPKI1(1763.82002)
+DPSA3(1472.07002)
+DPYM8(1611.07002)
+DRBM8(1755.57002)
+DRBN2(2007.57002)
+DRCN2(2111.07002)
+DRYN2(1809.07002)
+DRYW1(987.57002)
+DSNC1(117.32002)
+DUCC1(1508.57002)
+DUCN2(692.07002)
+DUDC1(864.07002)
+DUIC1(1047.07002)
+DUNO3(119.32002)
+DVLO3(246.82002)
+DVOC1(984.07002)
+DVRC1(159.07002)
+DVSC1(1766.07002)
+DVT(476.32002)
+DWAI1(818.82002)
+DWRN2(1586.57002)
+DYCN2(1777.32002)
+DYLC1(1555.82002)
+DYNN2(2159.32002)
+EACQ2(1800.57002)
+EAT(754.32002)
+EBTC1(2394.32002)
+ECHO3(209.32002)
+ECKC1(832.82002)
+ECSC1(556.82002)
+EDOC1(433.32002)
+EDW(732.32002)
+EED(351.57002)
+EELC1(989.32002)
+EEPC1(1286.82002)
+EGCC1(1578.82002)
+EGKO3(213.32002)
+EGLC1(520.07002)
+EIMO3(1608.07002)
+EKA(127.82002)
+EKAN2(2042.07002)
+EKO(1704.82002)
+EKRI1(945.07002)
+ELBI1(1045.57002)
+ELCC1(-20.17998)
+ELDA3(726.82002)
+ELEW1(714.57002)
+ELJC1(176.82002)
+ELKC1(879.57002)
+ELKQ2(858.32002)
+ELN(835.07002)
+ELRN2(2205.07002)
+ELRQ1(1547.82002)
+ELSQ2(659.07002)
+ELXC1(43.32002)
+ELY(2205.07002)
+EMCM8(1324.32002)
+EMFO3(1388.57002)
+EMIO3(1200.57002)
+EMRC1(897.32002)
+EMTI1(945.32002)
+ENCQ1(829.07002)
+ENCW1(409.32002)
+ENFO3(1243.32002)
+ENMW1(259.07002)
+ENTU1(1798.57002)
+ENUW1(409.32002)
+ENV(1440.82002)
+ENVI1(1047.82002)
+EORC1(552.82002)
+EPH(429.82002)
+EPKC1(628.32002)
+ERAW1(740.57002)
+ERCC1(422.07002)
+ESCC1(258.32002)
+ESEC1(514.57002)
+ESOC1(258.32002)
+ESPC1(822.07002)
+ESRC1(348.07002)
+EUG(165.07002)
+EUL(728.57002)
+EURM8(1327.32002)
+EVAQ1(2190.32002)
+EVFO3(699.57002)
+EXQC1(242.82002)
+EZRI1(2087.07002)
+FADO3(378.07002)
+FAFI1(1604.07002)
+FAFO3(1193.57002)
+FALN2(1196.82002)
+FALQ1(1641.57002)
+FAT(74.32002)
+FBOC1(450.82002)
+FBSC1(814.82002)
+FCHC1(311.57002)
+FCKO3(1761.57002)
+FCRM8(2060.07002)
+FEFO3(964.57002)
+FERI1(1202.57002)
+FFFO3(1454.82002)
+FFXW1(695.82002)
+FGFO3(1512.32002)
+FGMC1(514.32002)
+FGRC1(781.07002)
+FHCC1(117.57002)
+FHDC1(1733.32002)
+FHFI1(1408.07002)
+FHLC1(448.82002)
+FHR(6.07002)
+FIFW1(567.82002)
+FINQ1(820.57002)
+FISN2(1825.82002)
+FISO3(1361.07002)
+FISW1(1437.07002)
+FKFO3(1401.57002)
+FLAC1(1773.82002)
+FLEI1(2262.57002)
+FLFC1(2136.07002)
+FLFI1(1594.57002)
+FLFO3(1524.32002)
+FMFO3(1386.82002)
+FMLQR(968.57002)
+FMNQ1(1929.57002)
+FMOC1(1062.82002)
+FMRC1(1406.57002)
+FNWC1(1011.57002)
+FNWO3(161.57002)
+FNXA3(374.82002)
+FOGO3(258.07002)
+FOIC1(2086.07002)
+FOSO3(385.57002)
+FOXN2(1742.32002)
+FPRO3(178.07002)
+FPWU1(1060.82002)
+FRAW1(281.07002)
+FRCC1(216.07002)
+FRCW1(1004.32002)
+FRGC1(47.57002)
+FRHM8(1917.32002)
+FRIC1(238.32002)
+FRIW1(259.07002)
+FRKW1(197.07002)
+FRLO3(1545.82002)
+FRMM8(1202.57002)
+FRSO3(145.82002)
+FRTC1(1140.57002)
+FSHC1(1180.82002)
+FSLC1(140.82002)
+FSNC1(56.82002)
+FSSO3(238.07002)
+FTAW1(817.82002)
+FTDC1(204.32002)
+FTFW1(961.32002)
+FTMM8(1759.57002)
+FTNC1(581.82002)
+FTSC1(607.57002)
+FUL(27.07002)
+FVVN2(1477.82002)
+FWFW1(1071.32002)
+FWNN2(653.57002)
+FWSC1(1706.57002)
+FWSN2(653.57002)
+FZWA3(1881.82002)
+GAAM8(1989.57002)
+GALN2(2015.32002)
+GARI1(2175.07002)
+GARW1(817.82002)
+GASC1(486.57002)
+GASO3(190.82002)
+GAVI1(1554.57002)
+GBDA3(282.57002)
+GBRC1(870.32002)
+GCAW1(668.57002)
+GCDC1(493.82002)
+GCHA3(1354.82002)
+GCKQ1(1783.82002)
+GCN(1863.82002)
+GCRA3(1672.57002)
+GDFO3(1022.82002)
+GDLC1(1788.82002)
+GDPN2(1100.07002)
+GDRO3(356.07002)
+GDRQ2(730.82002)
+GDTA3(143.32002)
+GDTC1(142.57002)
+GECU1(1945.57002)
+GEG(700.82002)
+GEOC1(810.32002)
+GERW1(349.32002)
+GGDA3(300.07002)
+GGRC1(418.07002)
+GHDQ1(1684.07002)
+GHFW1(883.57002)
+GILO3(1089.82002)
+GISC1(960.07002)
+GKSC1(1508.57002)
+GLAW1(930.32002)
+GLDO3(1668.32002)
+GLEQ1(898.82002)
+GLFM8(1308.82002)
+GLNI1(2600.32002)
+GLSI1(2600.32002)
+GMFW1(906.57002)
+GMTC1(880.82002)
+GNFC1(2143.82002)
+GNLC1(2143.57002)
+GNLW1(768.07002)
+GNNC1(1126.07002)
+GNSC1(265.82002)
+GNTC1(1113.07002)
+GODW1(1157.57002)
+GOLW1(483.07002)
+GOSC1(760.57002)
+GOYC1(241.57002)
+GPEN2(2015.32002)
+GPFO3(212.57002)
+GPI(1061.32002)
+GPRM8(1772.82002)
+GQEC1(486.57002)
+GRBO3(1554.32002)
+GRCA3(1672.57002)
+GRCM8(1621.32002)
+GRCW1(1108.07002)
+GRFW1(734.07002)
+GRHC1(348.07002)
+GRMO3(140.57002)
+GRNQ2(1708.57002)
+GRNW1(1081.57002)
+GROQ2(1410.57002)
+GRRC1(1461.82002)
+GRSC1(1757.32002)
+GRSI1(2191.32002)
+GRVN2(2024.07002)
+GRWA3(1651.32002)
+GRZO3(1067.32002)
+GSFO3(1336.07002)
+GSGN2(1310.82002)
+GSKI1(1861.57002)
+GSNM8(1719.07002)
+GSPC1(745.82002)
+GSTC1(36.07002)
+GSTO3(1554.32002)
+GSVC1(770.07002)
+GTCC1(167.32002)
+GTMC1(1137.82002)
+GTOC1(475.32002)
+GTOM8(1825.82002)
+GVPC1(1070.32002)
+GVYC1(2090.07002)
+GWFW1(1146.57002)
+GWWW1(349.32002)
+GZFC1(1009.07002)
+HABC1(1530.57002)
+HAIC1(607.07002)
+HAMA3(639.82002)
+HANM8(1377.82002)
+HATC1(1158.32002)
+HAWM8(1442.32002)
+HAYI1(828.07002)
+HBFI1(1452.32002)
+HBRC1(1777.82002)
+HCNC1(1646.57002)
+HCPC1(442.57002)
+HCTC1(349.32002)
+HDLC1(944.32002)
+HDLI1(1332.32002)
+HDZC1(740.07002)
+HEMI1(1238.32002)
+HESC1(1060.07002)
+HFLC1(1041.07002)
+HGFW1(1036.82002)
+HHAI1(1963.07002)
+HHDW1(674.32002)
+HHFO3(975.07002)
+HHR(13.32002)
+HIBW1(791.07002)
+HIDC1(187.07002)
+HIMN2(2010.07002)
+HIO(145.82002)
+HIRO3(1172.07002)
+HJO(58.82002)
+HKFW1(284.57002)
+HLCC1(1023.07002)
+HLKC1(1656.32002)
+HLLC1(1773.07002)
+HLMO3(879.57002)
+HLTI1(2393.82002)
+HMGC1(1545.57002)
+HMS(255.82002)
+HNAO3(677.82002)
+HNBO3(898.32002)
+HNDO3(898.32002)
+HNEO3(734.32002)
+HNFO3(968.32002)
+HNGC1(856.57002)
+HNGO3(734.32002)
+HNHO3(968.32002)
+HNIO3(968.32002)
+HNJO3(1185.82002)
+HNSW1(259.07002)
+HNTC1(1770.07002)
+HNYM8(1181.07002)
+HOAC1(830.57002)
+HODO3(485.82002)
+HOHU1(1687.57002)
+HOMI1(758.07002)
+HONC1(357.57002)
+HOOM8(1596.32002)
+HOTM8(1151.32002)
+HOTN2(1305.57002)
+HOWO3(1421.07002)
+HOXO3(485.82002)
+HPDC1(524.57002)
+HPEC1(220.07002)
+HPFI1(2544.07002)
+HPRC1(803.32002)
+HPRO3(898.32002)
+HPWO3(1365.07002)
+HQM(44.57002)
+HQSI1(1016.57002)
+HRHW1(351.32002)
+HRI(212.57002)
+HRLO3(1512.82002)
+HRWM8(1348.32002)
+HRZC1(664.57002)
+HSEC1(331.07002)
+HSFO3(763.82002)
+HSGC1(819.07002)
+HSKO3(341.57002)
+HSPC1(67.57002)
+HSQC1(2740.07002)
+HTRC1(1377.07002)
+HTSC1(1022.32002)
+HUFW1(300.07002)
+HUGI1(1369.57002)
+HUSQ1(896.82002)
+HUZI1(1748.57002)
+HVSA3(312.32002)
+HWCI1(1637.57002)
+HWD(103.32002)
+HWKC1(377.07002)
+HWRW1(389.07002)
+HYFC1(1034.57002)
+HYFO3(900.82002)
+HYNI1(2486.07002)
+HYSC1(1879.57002)
+ICKC1(2047.32002)
+ICPC1(2047.32002)
+IDA(1494.82002)
+IDAC1(818.57002)
+IDKC1(1357.82002)
+IDOC1(338.32002)
+IDPC1(2203.32002)
+IDWC1(1406.82002)
+IGM(1229.82002)
+ILLQ2(1445.32002)
+IMHO3(1278.07002)
+IMTW1(1231.07002)
+IMWN2(1889.82002)
+INDI1(1864.32002)
+INTC1(1166.57002)
+IPL(-25.67998)
+IPLC1(38.32002)
+IRFO3(1380.82002)
+ISPQ1(896.57002)
+ISWC1(484.82002)
+IWLC1(1068.57002)
+IZA(402.07002)
+JAPN2(2033.32002)
+JBGC1(508.57002)
+JBLC1(434.57002)
+JCUN2(2033.32002)
+JEAN2(1075.07002)
+JER(1144.57002)
+JESN2(1130.32002)
+JETM8(1021.82002)
+JKPI1(1925.07002)
+JLNQ2(826.07002)
+JNLC1(661.32002)
+JOJO3(961.57002)
+JPRC1(1704.82002)
+JRFO3(1395.32002)
+JRHQ1(1699.32002)
+JRMA3(1379.07002)
+JRMI1(1081.32002)
+JSDC1(810.32002)
+JSNC1(1564.32002)
+JSPN2(1723.57002)
+JSPU1(1827.07002)
+JTAC1(1461.07002)
+JUFW1(205.57002)
+JULC1(1065.82002)
+JUMQ2(654.32002)
+JWBC1(1297.32002)
+KADW1(1063.82002)
+KBFO3(1309.07002)
+KBNC1(1290.82002)
+KCFW1(640.32002)
+KCPC1(701.57002)
+KCYC1(286.57002)
+KEDW1(1140.82002)
+KEEO3(1425.57002)
+KELC1(575.07002)
+KESC1(363.57002)
+KFAW1(840.82002)
+KFLW1(840.82002)
+KIMO3(733.57002)
+KLS(195.57002)
+KMFW1(632.32002)
+KMRO3(1515.32002)
+KNNC1(454.82002)
+KNSN2(1484.32002)
+KNWC1(1179.32002)
+KOSW1(645.07002)
+KRCI1(1881.07002)
+KRCM8(1661.07002)
+KRKC1(1640.57002)
+KRNC1(1508.07002)
+KRTC1(1457.57002)
+KSPC1(2283.07002)
+KTLC1(230.07002)
+KTLW1(840.82002)
+KTTC1(109.57002)
+KUSW1(770.82002)
+KYCN2(1758.32002)
+L13(11.32002)
+LADN2(2014.07002)
+LAFC1(1670.07002)
+LAFN2(552.32002)
+LAGC1(25.07002)
+LAGO3(1095.32002)
+LAHC1(179.82002)
+LALN2(552.32002)
+LAS(692.07002)
+LAX(47.07002)
+LAYC1(596.32002)
+LBBM8(1124.32002)
+LBCO3(935.57002)
+LBDC1(129.82002)
+LBFO3(1413.07002)
+LBIC1(8.07002)
+LBRW1(470.32002)
+LCBC1(35.82002)
+LCFW1(1113.57002)
+LCHN2(1818.57002)
+LDOI1(2287.57002)
+LDRC1(1432.07002)
+LDWM8(1151.82002)
+LEBC1(1355.07002)
+LECW1(954.82002)
+LEFW1(946.07002)
+LEGC1(459.07002)
+LEGW1(201.32002)
+LENN2(2023.82002)
+LESQ1(2054.32002)
+LEXC1(313.57002)
+LFDQ1(892.07002)
+LFRM8(1132.57002)
+LGB(2.32002)
+LGD(1105.82002)
+LGFO3(698.32002)
+LGRC1(207.32002)
+LGWN2(535.07002)
+LHCA3(428.57002)
+LIBM8(1118.57002)
+LICC1(72.32002)
+LIDW1(446.32002)
+LIMQ1(1592.32002)
+LINM8(1754.82002)
+LINQR(919.57002)
+LKCC1(410.07002)
+LKCO3(1706.32002)
+LKN(1704.82002)
+LKNC1(1292.07002)
+LKSO3(615.07002)
+LKTI1(1369.57002)
+LKWA3(1426.57002)
+LLEC1(931.32002)
+LLFW1(1055.82002)
+LLJ(2024.07002)
+LMCN2(1746.57002)
+LMCO3(1680.82002)
+LMDN2(1001.82002)
+LMDO3(996.07002)
+LMHM8(2112.32002)
+LMLN2(2125.57002)
+LMRM8(2148.82002)
+LMRN2(1001.82002)
+LMT(1346.82002)
+LNBW1(353.82002)
+LNCM8(1754.82002)
+LOAC1(201.07002)
+LOBC1(2497.82002)
+LOFO3(259.07002)
+LOIN2(1958.82002)
+LOKC1(1494.57002)
+LOL(1286.07002)
+LONN2(1940.82002)
+LOSC1(129.82002)
+LOSO3(865.32002)
+LPAC1(153.07002)
+LPC(152.07002)
+LPDC1(981.07002)
+LPFI1(1852.57002)
+LPOC1(624.82002)
+LPOW1(865.32002)
+LPRC1(620.32002)
+LPRU1(1974.32002)
+LPSI1(1735.57002)
+LPSW1(1075.32002)
+LPTC1(1507.82002)
+LPWO3(509.32002)
+LPZC1(639.07002)
+LRCM8(1755.57002)
+LRLC1(889.32002)
+LRRM8(2199.82002)
+LSFW1(954.82002)
+LSGC1(312.82002)
+LSHC1(735.07002)
+LSLC1(327.57002)
+LSNC1(1249.82002)
+LSPC1(1715.57002)
+LSRC1(150.07002)
+LSTC1(1126.07002)
+LSV(704.82002)
+LTAI1(1554.57002)
+LTHC1(1029.07002)
+LTJC1(605.07002)
+LTLC1(984.07002)
+LTRC1(205.82002)
+LUBM8(1436.32002)
+LUFI1(1109.57002)
+LUKO3(1197.57002)
+LUNN2(2077.82002)
+LVGQ1(1881.07002)
+LVK(246.82002)
+LVMC1(165.32002)
+LVPN2(587.32002)
+LVTC1(2722.57002)
+LVYN2(1973.32002)
+LWDC1(422.07002)
+LWDI1(2604.32002)
+LWNW1(1214.07002)
+LWS(597.82002)
+MADC1(1039.57002)
+MAE(86.57002)
+MAEC1(487.57002)
+MAFC1(236.57002)
+MAMC1(2671.82002)
+MANM8(1812.57002)
+MANW1(809.32002)
+MAPC1(603.57002)
+MARW1(824.32002)
+MAYI1(1925.32002)
+MBBC1(951.57002)
+MBCA3(628.07002)
+MBCC1(123.32002)
+MBMW1(824.32002)
+MBUC1(129.07002)
+MCCC1(1347.07002)
+MCDO3(1538.82002)
+MCDW1(261.82002)
+MCE(40.57002)
+MCFC1(1017.57002)
+MCGC1(274.32002)
+MCGN2(2217.32002)
+MCKI1(1136.07002)
+MCPA3(1150.57002)
+MCUC1(1081.57002)
+MDAC1(222.57002)
+MDDC1(939.57002)
+MDFI1(1785.07002)
+MDFO3(636.82002)
+MDHC1(1317.82002)
+MDLA3(1073.32002)
+MDLI1(2400.07002)
+MDMI1(1306.57002)
+MDRW1(709.07002)
+MEAA3(1087.32002)
+MEEC1(71.82002)
+MEFO3(1123.32002)
+MEFW1(1219.82002)
+MFDU1(1857.07002)
+MFDW1(222.32002)
+MFLC1(1031.07002)
+MFR(531.82002)
+MGCA3(628.07002)
+MGFO3(1204.32002)
+MGMI1(1857.82002)
+MGSW1(872.07002)
+MHBC1(93.32002)
+MHEC1(502.32002)
+MHLA3(1162.57002)
+MHMC1(589.82002)
+MHS(1579.32002)
+MHSI1(1858.32002)
+MHSW1(1033.07002)
+MHV(854.07002)
+MHWO3(1816.07002)
+MHYC1(2135.57002)
+MIAC1(1017.57002)
+MIDI1(2081.82002)
+MIDW1(709.07002)
+MIGC1(157.57002)
+MILW1(799.07002)
+MIPW1(148.07002)
+MISI1(966.07002)
+MITW1(730.57002)
+MJBN2(1472.57002)
+MJCC1(875.07002)
+MKBI1(2332.07002)
+MKEC1(2179.57002)
+MKZO3(1345.32002)
+MLCC1(1154.32002)
+MLFO3(565.57002)
+MLGC1(1052.82002)
+MLHN2(776.32002)
+MLKI1(2356.57002)
+MLLO3(256.57002)
+MLNC1(1052.82002)
+MLP(1392.82002)
+MMCW1(824.32002)
+MMFO3(708.57002)
+MMIA3(402.07002)
+MMKC1(1335.32002)
+MMRO3(708.82002)
+MMTA3(1073.32002)
+MMTC1(2246.82002)
+MMV(79.82002)
+MMWA3(572.82002)
+MNAC1(1603.32002)
+MNCC1(1230.07002)
+MNCN2(2014.07002)
+MNGC1(1483.32002)
+MNHC1(1819.57002)
+MNLC1(1124.07002)
+MNNA3(1347.82002)
+MNRN2(2015.32002)
+MNSI1(2367.32002)
+MNTN2(1659.07002)
+MOAN2(703.07002)
+MOD(14.07002)
+MOFI1(1656.57002)
+MOGN2(1805.82002)
+MOIC1(377.82002)
+MOKI1(2017.07002)
+MOLC1(541.32002)
+MOMN2(2123.57002)
+MORN2(1633.07002)
+MORQ1(846.32002)
+MOSI1(866.32002)
+MOSO3(1423.32002)
+MOUC1(903.32002)
+MOWC1(1625.32002)
+MPEC1(76.82002)
+MPLO3(203.57002)
+MPOC1(535.82002)
+MPSW1(1021.32002)
+MRDC1(1483.32002)
+MRFO3(1228.32002)
+MRGI1(2231.57002)
+MRIC1(535.82002)
+MRKI1(1647.32002)
+MRLN2(1973.32002)
+MRNC1(422.07002)
+MRSC1(452.57002)
+MRSO3(747.07002)
+MRWA3(470.07002)
+MRY(19.57002)
+MRYM8(1764.57002)
+MRYN2(1185.82002)
+MSAC1(1579.32002)
+MSCI1(878.82002)
+MSEC1(244.07002)
+MSFO3(1358.07002)
+MSJC1(1107.32002)
+MSLQ1(1013.07002)
+MSO(1372.82002)
+MSPM8(1311.07002)
+MSQN2(855.07002)
+MSRC1(1579.32002)
+MSRU1(1816.32002)
+MSVA3(572.82002)
+MSYC1(1090.82002)
+MTAW1(874.07002)
+MTCW1(897.57002)
+MTHI1(833.07002)
+MTHN2(2139.82002)
+MTHO3(1177.57002)
+MTIC1(377.82002)
+MTKM8(1922.32002)
+MTMC1(188.07002)
+MTMI1(1739.32002)
+MTQC1(840.57002)
+MTR(19.57002)
+MTRO3(1187.32002)
+MTSC1(2103.32002)
+MTSN2(1341.82002)
+MTTC1(2090.07002)
+MTZC1(600.32002)
+MUDC1(981.32002)
+MUDW1(171.82002)
+MULM8(2247.82002)
+MUO(833.07002)
+MVDC1(1233.07002)
+MVDN2(1712.82002)
+MVEW1(100.32002)
+MVLC1(1376.82002)
+MWH(392.82002)
+MWSA3(783.07002)
+MYF(76.82002)
+MYL(1746.07002)
+MYMA3(321.07002)
+MYRC1(2228.07002)
+MYRI1(1217.57002)
+MYV(22.32002)
+MZTC1(1625.32002)
+NADC1(168.82002)
+NAPC1(254.07002)
+NBKO3(318.32002)
+NBRC1(75.07002)
+NCKC1(1016.07002)
+NCLO3(1594.32002)
+NCSW1(1115.07002)
+NEFW1(766.57002)
+NEIQ1(1161.57002)
+NFEM8(1524.82002)
+NFFI1(2566.57002)
+NFFW1(213.82002)
+NFJM8(1673.32002)
+NFKC1(1544.57002)
+NFL(1250.57002)
+NFRC1(854.57002)
+NFRO3(698.32002)
+NHPC1(446.57002)
+NHRU1(1995.32002)
+NID(850.07002)
+NINM8(1348.82002)
+NIPC1(384.82002)
+NISW1(944.82002)
+NKSW1(61.07002)
+NKX(76.82002)
+NLC(50.57002)
+NLSC1(791.57002)
+NLSN2(575.82002)
+NMPI1(809.82002)
+NMSC1(342.57002)
+NOIM8(1320.82002)
+NPFO3(798.07002)
+NPXC1(1180.57002)
+NRAC1(100.82002)
+NRDC1(1031.82002)
+NRKW1(173.57002)
+NTCC1(562.82002)
+NTDN2(1618.82002)
+NTPO3(1709.57002)
+NTRC1(1861.82002)
+NUCI1(1300.32002)
+NUQ(157.07002)
+NUW(0.82002)
+NVRM8(1714.07002)
+NWRA3(901.07002)
+NWRC1(27.82002)
+NXP(715.57002)
+NYAN2(1873.57002)
+NYL(166.07002)
+NYSO3(717.32002)
+NZAC1(1279.32002)
+NZCM8(1965.32002)
+OAGW1(718.07002)
+OAK(29.07002)
+OAMC1(31.57002)
+OASN2(1923.82002)
+OBRC1(532.57002)
+OCFW1(1255.32002)
+OCHO3(1167.32002)
+OCMO3(1415.07002)
+OCNC1(63.07002)
+OCTC1(259.07002)
+OCWO3(1408.57002)
+ODBN2(926.07002)
+ODLC1(28.82002)
+ODSW1(502.82002)
+OGD(1454.82002)
+OGDC1(949.07002)
+OGOC1(616.07002)
+OGVC1(1180.57002)
+OHOI1(2151.32002)
+OICC1(1010.07002)
+OITC1(417.57002)
+OJAC1(561.32002)
+OJIC1(561.32002)
+OKB(63.07002)
+OKFO3(1515.57002)
+OKNC1(1194.82002)
+OKPC1(354.32002)
+OLDQ1(1015.82002)
+OLNM8(1374.32002)
+OMFO3(613.07002)
+OMFW1(1016.82002)
+OMK(792.57002)
+OMTC1(828.82002)
+OMWW1(1021.32002)
+ONCC1(2046.07002)
+ONO(708.57002)
+ONOC1(120.82002)
+ONSC1(823.57002)
+ONT(559.07002)
+ONYC1(1312.32002)
+OOFO3(1648.57002)
+OORC1(1651.57002)
+OPCA3(532.57002)
+OPLC1(875.07002)
+ORCO3(72.82002)
+ORDC1(266.82002)
+ORIC1(96.07002)
+ORWN2(1356.57002)
+OTOW1(313.82002)
+OTTC1(119.07002)
+OURC1(830.82002)
+OVE(96.82002)
+OVNM8(1549.07002)
+OVRC1(2064.07002)
+OWDC1(133.32002)
+OWFO3(1061.07002)
+OWNC1(2132.07002)
+OWYN2(1817.07002)
+OXR(58.32002)
+OXSI1(1699.82002)
+OYFO3(1607.57002)
+P68(1960.07002)
+P69(1202.57002)
+PACW1(1036.82002)
+PAE(39.82002)
+PAFO3(594.32002)
+PAHN2(1302.82002)
+PALW1(446.57002)
+PAMC1(937.32002)
+PANN2(1759.32002)
+PASQ1(1977.32002)
+PBCC1(1310.32002)
+PBFW1(100.32002)
+PBUI1(1571.32002)
+PCEC1(434.82002)
+PCIC1(476.57002)
+PCKC1(1277.57002)
+PCKI1(1751.82002)
+PCLC1(410.07002)
+PCON2(1698.57002)
+PCQC1(671.82002)
+PCRW1(1591.82002)
+PCYO3(1535.82002)
+PDEC1(508.57002)
+PDGC1(457.07002)
+PDT(411.07002)
+PDX(87.57002)
+PEAC1(348.57002)
+PEFO3(291.57002)
+PEFW1(974.07002)
+PELQR(1600.32002)
+PEOW1(976.82002)
+PEPC1(2030.57002)
+PESW1(961.57002)
+PFHC1(1397.57002)
+PFRC1(278.07002)
+PFTC1(414.57002)
+PGRC1(600.32002)
+PHGM8(1989.32002)
+PHRC1(955.32002)
+PHX(368.32002)
+PIBC1(162.57002)
+PIBN2(587.32002)
+PICM8(1771.07002)
+PIDC1(1031.82002)
+PIEC1(1624.32002)
+PIEI1(1096.57002)
+PIFC1(1362.82002)
+PIFW1(977.82002)
+PIH(1370.57002)
+PIHC1(982.57002)
+PION2(1798.82002)
+PIPA3(1543.82002)
+PIRI1(1096.57002)
+PISC1(80.57002)
+PITC1(789.82002)
+PIVC1(1426.07002)
+PKCC1(680.07002)
+PKFC1(537.07002)
+PKFO3(819.32002)
+PKSQ1(1594.57002)
+PLAM8(1179.32002)
+PLCC1(433.32002)
+PLEC1(165.07002)
+PLFI1(1057.32002)
+PLIC1(877.07002)
+PLKI1(1151.57002)
+PLLC1(1530.57002)
+PLMC1(29.32002)
+PLRC1(924.82002)
+PLTC1(307.07002)
+PLVM8(1337.07002)
+PMD(950.57002)
+PMFW1(966.07002)
+PMNM8(1294.57002)
+PNCC1(2143.57002)
+PNCQR(1110.32002)
+PNFI1(1419.82002)
+PNGO3(485.82002)
+PNKW1(935.32002)
+PNRI1(1034.07002)
+PNTM8(1515.32002)
+POEM8(1519.32002)
+POLM8(1514.57002)
+POMC1(389.57002)
+PORQ1(1387.57002)
+POSC1(1823.82002)
+POTC1(762.32002)
+POTI1(874.32002)
+POWC1(213.82002)
+POWO3(502.07002)
+PPDN2(692.07002)
+PPHC1(1055.32002)
+PPPC1(842.82002)
+PPRC1(442.57002)
+PPRW1(1356.07002)
+PPSC1(307.57002)
+PRAI1(1557.82002)
+PRB(350.82002)
+PRBC1(350.82002)
+PRBQ1(1576.07002)
+PRC(1651.32002)
+PRCI1(1175.07002)
+PRCO3(1473.32002)
+PRDM8(1302.82002)
+PRFO3(741.07002)
+PRGC1(1675.32002)
+PRHC1(461.07002)
+PRIQ1(1259.07002)
+PRKA3(230.32002)
+PRLI1(1820.32002)
+PRMC1(937.32002)
+PROO3(875.32002)
+PRPC1(828.82002)
+PRSN2(2211.57002)
+PSAC1(291.82002)
+PSC(182.07002)
+PSCC1(2163.07002)
+PSP(794.57002)
+PSPC1(1721.57002)
+PSQC1(258.32002)
+PSRC1(2097.82002)
+PSTA3(1651.32002)
+PSTC1(1748.32002)
+PSTM8(1481.07002)
+PTEC1(231.57002)
+PTFO3(1498.32002)
+PTHC1(1095.07002)
+PTHW1(1409.82002)
+PTNM8(2195.32002)
+PTPC1(19.57002)
+PTV(193.82002)
+PUGC1(119.07002)
+PUW(835.82002)
+PVRO3(1027.82002)
+PWYC1(213.82002)
+PYFO3(1003.32002)
+PYLC1(1131.07002)
+PYNC1(1193.32002)
+PYPC1(566.32002)
+PYTI1(729.32002)
+QBAA3(1828.07002)
+QBMA3(1816.82002)
+QBRA3(1443.82002)
+QBYQ2(1429.57002)
+QCAC1(58.32002)
+QCCO3(737.32002)
+QCKA3(1214.57002)
+QCNW1(289.07002)
+QDPA3(2360.07002)
+QFSA3(1933.57002)
+QGDA3(1326.57002)
+QGSA3(1711.57002)
+QHAA3(351.57002)
+QHBA3(1070.07002)
+QHQA3(726.57002)
+QHUA3(1535.57002)
+QISA3(1651.32002)
+QLGA3(1715.07002)
+QMBA3(1292.32002)
+QMLA3(1715.07002)
+QMMA3(1291.57002)
+QNFA3(1715.07002)
+QNYC1(1504.57002)
+QOKA3(1282.82002)
+QPFO3(569.07002)
+QRMO3(1703.32002)
+QRTA3(1572.32002)
+QSPA3(1214.57002)
+QSTA3(1042.57002)
+QTCW1(566.07002)
+QTUA3(1863.82002)
+QTWA3(1466.32002)
+QTZC1(1234.57002)
+QUEQ1(925.07002)
+QUPA3(628.07002)
+QWSA3(2150.82002)
+QYJA3(1641.32002)
+QYRC1(1504.57002)
+RAL(309.57002)
+RAWN2(1395.07002)
+RAYQ1(956.82002)
+RBG(319.32002)
+RBL(108.82002)
+RBTN2(1664.82002)
+RBVN2(2048.57002)
+RBYC1(370.07002)
+RBYM8(1907.82002)
+RCCW1(193.32002)
+RCEC1(2297.32002)
+RCFC1(47.57002)
+RCHC1(846.82002)
+RCPC1(1286.82002)
+RCRO3(1587.57002)
+RCSO3(1590.57002)
+RDD(155.82002)
+RDKI1(2303.32002)
+RDLO3(478.07002)
+RDM(929.07002)
+RDOC1(0.32002)
+RDVC1(667.32002)
+REDO3(1123.07002)
+REEO3(83.82002)
+RENI1(1220.57002)
+REO(1261.57002)
+RFCN2(653.57002)
+RFSC1(363.57002)
+RFTI1(1347.82002)
+RGTC1(984.07002)
+RIV(457.07002)
+RJSC1(395.32002)
+RKBC1(277.07002)
+RKHO3(287.32002)
+RKPM8(1992.07002)
+RLFO3(1389.57002)
+RLGW1(1181.57002)
+RLKC1(990.07002)
+RLKN2(2027.57002)
+RLYO3(1393.32002)
+RMFO3(110.57002)
+RMNC1(475.32002)
+RMTC1(1179.32002)
+RNDC1(1477.07002)
+RNDN2(1723.32002)
+RNFO3(1485.82002)
+RNM(475.32002)
+RNO(1777.32002)
+RNT(54.82002)
+ROCI1(1315.82002)
+ROLC1(712.07002)
+RONM8(1080.32002)
+RORO3(1281.07002)
+ROSQ1(762.57002)
+ROVC1(1031.82002)
+RPSA3(171.32002)
+RRAC1(155.82002)
+RRFI1(1704.57002)
+RRKN2(1305.07002)
+RRMC1(1592.32002)
+RROO3(1333.82002)
+RRRC1(520.57002)
+RSBU1(1657.32002)
+RSCN2(1826.57002)
+RSFW1(159.82002)
+RSHC1(1497.07002)
+RSPC1(508.07002)
+RTFO3(1374.57002)
+RTHN2(2138.57002)
+RTLC1(1440.07002)
+RUBC1(2136.07002)
+RUSC1(1113.32002)
+RVDC1(1716.82002)
+RVYC1(324.32002)
+RWCC1(111.32002)
+RWDN2(575.82002)
+RXFO3(1092.07002)
+RYNC1(549.07002)
+RZVW1(562.82002)
+SABC1(2896.07002)
+SAC(-4.42998)
+SAFO3(1148.32002)
+SAHN2(575.82002)
+SAN(56.82002)
+SAPC1(-5.92998)
+SARC1(75.07002)
+SAUC1(558.32002)
+SAYC1(410.07002)
+SBA(142.57002)
+SBFO3(880.32002)
+SBIC1(0.070023)
+SBKW1(76.82002)
+SBMW1(677.57002)
+SBP(318.82002)
+SBPC1(318.82002)
+SBTC1(1166.82002)
+SBVC1(244.07002)
+SBYC1(745.82002)
+SCAQ1(2022.82002)
+SCCN2(575.82002)
+SCCQ1(2190.07002)
+SCDO3(190.82002)
+SCFI1(1328.57002)
+SCFO3(1481.32002)
+SCHC1(313.57002)
+SCHI1(2118.82002)
+SCHO3(1417.32002)
+SCK(-4.17998)
+SCKC1(0.32002)
+SCOO3(190.82002)
+SCRN2(1851.57002)
+SCSC1(508.32002)
+SCTI1(1774.82002)
+SCWW1(278.07002)
+SDB(1131.07002)
+SDDC1(363.82002)
+SDFO3(1570.82002)
+SDLC1(796.82002)
+SDM(179.82002)
+SDMM8(1981.57002)
+SDMO3(393.07002)
+SDMW1(315.07002)
+SDOC1(416.07002)
+SDRC1(1128.82002)
+SEA(76.82002)
+SENW1(1094.82002)
+SERC1(1940.57002)
+SETC1(973.07002)
+SEW(37.82002)
+SEXC1(208.57002)
+SEYC1(1762.32002)
+SFBC1(1748.32002)
+SFBO3(495.57002)
+SFF(705.32002)
+SFKC1(532.57002)
+SFKO3(477.32002)
+SFNW1(205.82002)
+SFO(24.07002)
+SFOC1(2.82002)
+SFXC1(64.82002)
+SGEC1(438.07002)
+SGFO3(879.57002)
+SGGU1(1359.32002)
+SGHQ1(1781.82002)
+SGNW1(1145.07002)
+SGPC1(1180.82002)
+SGQC1(396.07002)
+SGRU1(1101.82002)
+SGUU1(1050.07002)
+SGX(258.32002)
+SGYC1(962.32002)
+SHDC1(364.82002)
+SHFO3(1392.82002)
+SHHC1(653.57002)
+SHIC1(801.57002)
+SHLQ2(1300.57002)
+SHMC1(1483.32002)
+SHN(70.57002)
+SHNC1(669.82002)
+SHPW1(817.57002)
+SHQC1(746.82002)
+SHRO3(1182.82002)
+SHRQ1(1725.82002)
+SHVC1(1642.82002)
+SHWI1(1061.57002)
+SIAN2(1673.32002)
+SIDW1(638.57002)
+SIGU1(2386.57002)
+SIY(970.32002)
+SJBC1(207.07002)
+SJC(198.57002)
+SKAM8(1843.07002)
+SKFI1(1924.82002)
+SKKW1(1143.82002)
+SKLA3(1611.07002)
+SKMW1(200.07002)
+SKNC1(551.82002)
+SKOQ1(2292.82002)
+SKOW1(663.82002)
+SKYW1(982.82002)
+SLAC1(739.32002)
+SLE(66.57002)
+SLFC1(735.07002)
+SLFO3(1415.07002)
+SLKO3(1701.57002)
+SLMC1(2231.32002)
+SLON2(704.82002)
+SLPC1(1020.82002)
+SLRC1(175.82002)
+SLTC1(1247.07002)
+SLTO3(1370.32002)
+SLVO3(1715.32002)
+SLWC1(23.07002)
+SMBA3(691.32002)
+SMBC1(1007.32002)
+SMDC1(1949.07002)
+SMF(-5.92998)
+SMFO3(1762.07002)
+SMGC1(318.82002)
+SMIO3(263.57002)
+SMLO3(1565.07002)
+SMN(1853.32002)
+SMNN2(1422.07002)
+SMNQ2(540.82002)
+SMO(47.07002)
+SMOC1(23.07002)
+SMPC1(307.32002)
+SMPN2(926.07002)
+SMPW1(1063.82002)
+SMRC1(364.82002)
+SMRO3(1701.57002)
+SMRQ1(1080.32002)
+SMSC1(1148.32002)
+SMTC1(10.57002)
+SMTI1(1695.07002)
+SMTM8(1580.82002)
+SMVC1(354.32002)
+SMWN2(1422.07002)
+SMX(103.57002)
+SMYI1(1853.32002)
+SNA(100.82002)
+SNFW1(516.07002)
+SNS(168.82002)
+SNSI1(1309.82002)
+SNT(2352.07002)
+SNWC1(1140.32002)
+SOAC1(904.07002)
+SOAO3(898.32002)
+SOBO3(898.32002)
+SOCO3(898.32002)
+SODO3(898.32002)
+SOEO3(898.32002)
+SOFO3(898.32002)
+SOGO3(898.32002)
+SOUI1(1054.57002)
+SOX(306.57002)
+SPAI1(1559.57002)
+SPB(127.57002)
+SPCC1(2179.57002)
+SPCW1(668.57002)
+SPEW1(246.57002)
+SPGC1(1728.32002)
+SPGN2(1616.07002)
+SPGW1(1299.57002)
+SPLW1(1121.32002)
+SPMN2(1956.82002)
+SPMW1(1071.57002)
+SPNQ1(1798.82002)
+SPSO3(1200.57002)
+SPWC1(1020.32002)
+SPXC1(142.57002)
+SQFO3(1127.32002)
+SQLW1(473.07002)
+SQPM8(1356.57002)
+SQPW1(1036.32002)
+SQSC1(932.32002)
+SRAC1(2722.57002)
+SRBN2(1001.82002)
+SRBW1(476.07002)
+SRCQ1(1787.32002)
+SRFI1(1497.57002)
+SRGM8(1348.07002)
+SRIC1(24.32002)
+SRMO3(631.07002)
+SRTC1(712.32002)
+SRUC1(398.32002)
+SRXC1(607.07002)
+SRYM8(1764.57002)
+SSCN2(2178.57002)
+SSPW1(927.07002)
+STAC1(100.82002)
+STAM8(1480.57002)
+STAN2(2028.32002)
+STCQ1(1379.32002)
+STDQ1(882.82002)
+STEC1(176.82002)
+STFC1(624.07002)
+STFO3(1623.82002)
+STGM8(1348.07002)
+STHC1(275.32002)
+STKM8(1499.57002)
+STMN2(1994.07002)
+STMQR(1764.57002)
+STNI1(2352.07002)
+STPC1(1949.07002)
+STQC1(1651.57002)
+STRO3(1525.07002)
+STRQ1(932.32002)
+STRW1(1555.32002)
+STS(206.57002)
+STSM8(1263.07002)
+STTM8(1454.07002)
+STUC1(1748.32002)
+STVM8(1521.32002)
+STWO3(1598.57002)
+STYC1(1105.32002)
+SUAM8(1931.32002)
+SUMM8(1771.07002)
+SUNN2(1812.57002)
+SUNQ1(2034.07002)
+SVCO3(1629.57002)
+SVFI1(1654.07002)
+SVFO3(584.32002)
+SVMO3(1556.57002)
+SVNW1(1236.32002)
+SVPI1(1787.57002)
+SVRQ2(1122.82002)
+SWAC1(697.82002)
+SWBC1(1342.82002)
+SWCW1(920.32002)
+SWDC1(11.32002)
+SWIC1(161.32002)
+SWLC1(118.07002)
+SWNN2(653.57002)
+SWPI1(2391.82002)
+SXT(599.07002)
+SYDC1(354.32002)
+SYNO3(229.32002)
+SYSC1(999.82002)
+SZKQ2(947.32002)
+TABC1(351.57002)
+TACA3(131.32002)
+TACN2(1975.57002)
+TANC1(841.32002)
+TAPC1(1359.82002)
+TAYI1(2006.32002)
+TBRC1(1455.07002)
+TBSU1(2418.32002)
+TCAC1(944.32002)
+TCFI1(1440.07002)
+TCFO3(583.57002)
+TCFW1(1023.07002)
+TCKC1(628.32002)
+TCLC1(671.82002)
+TCM(36.07002)
+TCMO3(1430.82002)
+TCNC1(442.57002)
+TCRA3(1343.57002)
+TEKC1(924.82002)
+TEKW1(834.07002)
+TENQR(1728.82002)
+TEPM8(2006.82002)
+TERC1(261.07002)
+TEXN2(1613.07002)
+TFRU1(1778.07002)
+TGCC1(2091.82002)
+TGFI1(1741.57002)
+THAM8(1298.57002)
+THBW1(1494.32002)
+THDC1(267.32002)
+THFI1(2051.07002)
+THLN2(1777.32002)
+THMI1(1956.57002)
+THRQ1(875.07002)
+TIGC1(973.32002)
+TIJC1(37.82002)
+TILO3(711.32002)
+TILQ1(2241.57002)
+TILW1(473.07002)
+TIW(28.82002)
+TIXC1(38.32002)
+TLHC1(903.32002)
+TLMO3(300.07002)
+TLRW1(297.82002)
+TLYO3(1027.82002)
+TMCM8(1866.07002)
+TMFO3(1600.57002)
+TMKO3(300.07002)
+TMNC1(1306.57002)
+TMRO3(1355.07002)
+TNRC1(203.82002)
+TOFO3(1349.82002)
+TOHW1(1222.57002)
+TOPI1(1758.57002)
+TORC1(295.82002)
+TPEO3(1482.07002)
+TPFW1(973.07002)
+TPGC1(311.07002)
+TPH(1745.07002)
+TPHC1(1306.57002)
+TQIN2(2066.82002)
+TRCM8(1184.82002)
+TRFO3(513.57002)
+TRFW1(1121.32002)
+TRGW1(1060.82002)
+TRHC1(944.32002)
+TRII1(1680.07002)
+TRM(238.32002)
+TRMC1(590.07002)
+TRMI1(1784.82002)
+TRNW1(720.82002)
+TROM8(1218.07002)
+TRON2(926.32002)
+TRTC1(2086.07002)
+TRUC1(2108.32002)
+TRVQ1(919.07002)
+TSCC1(502.32002)
+TSDC1(1357.82002)
+TSHC1(1238.32002)
+TSOW1(1088.07002)
+TSP(1359.82002)
+TTD(138.82002)
+TTRC1(338.57002)
+TUFO3(1224.32002)
+TUSN2(1975.57002)
+TVL(2128.57002)
+TVWU1(1660.32002)
+TWBI1(1064.82002)
+TWCC1(1359.82002)
+TWDC1(402.07002)
+TWDN2(855.07002)
+TWF(1307.57002)
+TWLM8(1864.57002)
+TWMC1(485.57002)
+TWRW1(720.82002)
+TYBO3(1545.07002)
+TYEC1(940.57002)
+TYLO3(1457.82002)
+U24(1439.82002)
+UAO(55.07002)
+UCCC1(1048.57002)
+UCLC1(167.32002)
+UCRC1(363.32002)
+UDWC1(930.32002)
+UFDN2(926.32002)
+UHLC1(1564.32002)
+UIL(79.82002)
+UKIO3(1290.57002)
+ULVN2(1044.32002)
+UMCQ2(1488.57002)
+UMNC1(312.82002)
+UMTO3(175.07002)
+UNYO3(1447.82002)
+UPSO3(780.82002)
+UPWW1(1060.82002)
+USEA3(906.57002)
+VABC1(1653.57002)
+VAMA3(609.07002)
+VAQC1(231.57002)
+VBPC1(1949.07002)
+VCB(67.82002)
+VCFO3(283.57002)
+VDBC1(131.07002)
+VDBN2(755.82002)
+VDCA3(1423.32002)
+VDPA3(1438.57002)
+VENO3(373.57002)
+VENU1(1796.57002)
+VGAC1(2548.07002)
+VGRC1(1054.07002)
+VGT(755.82002)
+VICC1(463.82002)
+VICQ1(1745.82002)
+VIOC1(1624.57002)
+VIS(61.07002)
+VKOC1(2950.57002)
+VLCC1(563.32002)
+VLKC1(588.07002)
+VLYC1(1235.57002)
+VNCU1(1903.32002)
+VNNI1(2462.82002)
+VNOC1(240.57002)
+VNY(312.82002)
+VOFN2(597.82002)
+VSTC1(167.07002)
+VTUC1(208.57002)
+VUO(87.57002)
+VVDN2(575.82002)
+WAGI1(1912.32002)
+WAHI1(850.57002)
+WALC1(2288.07002)
+WARO3(1291.32002)
+WASC1(82.57002)
+WATC1(1306.57002)
+WATQ1(1796.07002)
+WBA(1973.82002)
+WBRI1(1641.57002)
+WCGU1(1657.07002)
+WCLN2(1851.57002)
+WCWO3(898.32002)
+WDEC1(311.07002)
+WEAC1(975.07002)
+WEDC1(96.07002)
+WEEC1(1230.32002)
+WEFI1(1396.07002)
+WEHC1(561.32002)
+WEIN2(718.07002)
+WESC1(304.82002)
+WFHC1(1379.82002)
+WFSW1(162.32002)
+WGRM8(1333.82002)
+WGVN2(1532.82002)
+WGWC1(1031.82002)
+WHDI1(1700.82002)
+WHHM8(1656.57002)
+WHLA3(2070.82002)
+WHSW1(872.57002)
+WHTW1(1465.07002)
+WIKA3(983.57002)
+WIMQ1(946.07002)
+WIWO3(1423.07002)
+WJF(753.32002)
+WKFO3(320.57002)
+WKPA3(735.07002)
+WLBC1(1010.07002)
+WLCI1(2005.57002)
+WLDN2(896.82002)
+WLFQ2(990.32002)
+WLKC1(-0.67998)
+WLLM8(1381.32002)
+WLLO3(959.57002)
+WLMO3(741.07002)
+WLYC1(442.57002)
+WMC(1532.82002)
+WMFO3(1044.32002)
+WMSC1(856.82002)
+WNDN2(831.07002)
+WODI1(1614.07002)
+WODM8(1915.07002)
+WPKO3(770.32002)
+WPOC1(344.57002)
+WPRW1(680.82002)
+WRIC1(1347.82002)
+WRKC1(1359.82002)
+WRMM8(2064.07002)
+WRNQ1(936.32002)
+WRPM8(1427.57002)
+WRRC1(320.07002)
+WRRU1(1359.32002)
+WRSC1(450.82002)
+WRSM8(2222.07002)
+WRTN2(994.57002)
+WSBO3(539.57002)
+WSDC1(377.07002)
+WSFM8(1925.32002)
+WSFO3(1102.57002)
+WSHC1(2118.57002)
+WSJN2(926.32002)
+WSPC1(512.57002)
+WSRO3(737.57002)
+WSTQ1(1803.32002)
+WTFO3(1462.57002)
+WTHC1(145.82002)
+WTPC1(898.82002)
+WTRC1(124.82002)
+WTSO3(300.07002)
+WUPA3(983.57002)
+WVAA3(1488.82002)
+WVI(149.32002)
+WVTC1(2063.57002)
+WWAC1(1016.07002)
+WWDC1(1636.07002)
+WWNC1(1729.32002)
+WWRC1(1995.07002)
+WYDW1(389.07002)
+WYTC1(733.32002)
+XXXC1(2379.07002)
+YALW1(434.07002)
+YBCA3(1672.57002)
+YBGA3(1672.57002)
+YBLC1(216.07002)
+YCGN2(1345.57002)
+YCPA3(1379.07002)
+YCPC1(1335.32002)
+YCVA3(1535.07002)
+YCWA3(1659.07002)
+YEFO3(695.32002)
+YFCA3(1672.57002)
+YFFI1(2410.82002)
+YKA(844.07002)
+YKAM8(1409.57002)
+YKM(409.82002)
+YLCA3(1659.07002)
+YLPO3(1514.57002)
+YMNA3(1403.57002)
+YNFO3(273.32002)
+YOBC1(1198.07002)
+YPWA3(1651.32002)
+YRKC1(404.07002)
+YRV(1352.82002)
+YSAC1(999.82002)
+YSMA3(1672.57002)
+YSUA3(1897.32002)
+YTBA3(1672.57002)
+YTPA3(1672.57002)
+YUCA3(879.57002)
+YUGA3(1672.57002)
+YVR(1.82002)
+YVVC1(1453.82002)
+YWAC1(1729.32002)
+YWPA3(1640.82002)
+YWSA3(1672.57002)
+YXC(1142.07002)
+YXX(60.07002)
+YYC(1065.07002)
+YYF(1119.82002)
+YYVC1(2450.32002)
+ZBHA3(806.07002)
+ZENC1(753.82002)
+ZFWA3(744.82002)
+ZIOU1(1600.57002)
+ZONM8(1151.82002)
diff --git a/internal/test_unit/config/SID_CONUS_ADPUPA_ELEV.txt b/internal/test_unit/config/SID_CONUS_ADPUPA_ELEV.txt
new file mode 100644
index 0000000000..42eb4fd1fb
--- /dev/null
+++ b/internal/test_unit/config/SID_CONUS_ADPUPA_ELEV.txt
@@ -0,0 +1,98 @@
+SID_CONUS_ADPUPA_ELEV
+72206(4.07002)
+72520(316.07002)
+72597(531.82002)
+72518(137.82002)
+71600(0.070023)
+71722(214.57002)
+72764(541.57002)
+71836(14.82002)
+71908(729.57002)
+71867(261.32002)
+71913(0.070023)
+71945(374.82002)
+72250(4.82002)
+72208(6.07002)
+72632(307.07002)
+74001(204.32002)
+72403(115.82002)
+72572(1486.57002)
+72662(1025.82002)
+72712(182.82002)
+71845(355.57002)
+76644(8.82002)
+76595(2.32002)
+72201(0.070023)
+76225(1572.07002)
+72230(169.57002)
+72388(926.32002)
+72318(640.32002)
+72440(374.32002)
+72528(201.82002)
+72645(222.57002)
+72776(1057.82002)
+71934(220.07002)
+72393(57.32002)
+72305(2.82002)
+72493(131.32002)
+72456(300.32002)
+72476(1638.57002)
+72426(308.57002)
+72501(17.57002)
+72649(277.57002)
+72786(670.57002)
+72261(324.32002)
+72364(1244.82002)
+72340(103.57002)
+72317(251.07002)
+72451(770.32002)
+74002(12.32002)
+72562(887.82002)
+72681(970.57002)
+72694(66.57002)
+72634(400.57002)
+76743(12.82002)
+72558(363.07002)
+72797(79.82002)
+71203(868.57002)
+70398(22.57002)
+78073(0.070023)
+72210(3.82002)
+72251(12.57002)
+72240(2.07002)
+72265(855.82002)
+72327(169.82002)
+72768(688.07002)
+74455(210.82002)
+71603(11.57002)
+72659(395.82002)
+71811(3.07002)
+71816(74.82002)
+76458(12.82002)
+72202(1.57002)
+72274(883.32002)
+72235(103.07002)
+78016(0.070023)
+72402(3.32002)
+71815(38.57002)
+72747(346.82002)
+71119(718.57002)
+78526(42.07002)
+72248(60.82002)
+72215(263.32002)
+72357(359.82002)
+74560(189.07002)
+74494(1.82002)
+74389(77.32002)
+71906(62.82002)
+ASDE04(0.070023)
+76394(433.07002)
+72233(7.07002)
+72214(25.82002)
+72249(190.57002)
+72293(76.82002)
+74004(136.07002)
+72363(1078.82002)
+71109(97.82002)
+71823(334.57002)
+71907(5.32002)
diff --git a/internal/test_unit/config/STATAnalysisConfig_point_stat b/internal/test_unit/config/STATAnalysisConfig_point_stat
index 4f751b32dc..db7ab415a6 100644
--- a/internal/test_unit/config/STATAnalysisConfig_point_stat
+++ b/internal/test_unit/config/STATAnalysisConfig_point_stat
@@ -103,7 +103,11 @@ jobs = [
-dump_row ${OUTPUT_DIR}/CONFIG_POINT_STAT_filter_mpr_sid.stat",
"-job filter -fcst_var TMP -fcst_lev Z2 \
-line_type MPR -column_thresh abs(fcst-obs) >5 \
- -dump_row ${OUTPUT_DIR}/CONFIG_POINT_STAT_filter_mpr_fcst_minus_obs.stat"
+ -dump_row ${OUTPUT_DIR}/CONFIG_POINT_STAT_filter_mpr_fcst_minus_obs.stat",
+ "-job aggregate -line_type VL1L2 -by FCST_LEV \
+ -out_stat ${OUTPUT_DIR}/CONFIG_POINT_STAT_agg_vl1l2.stat",
+ "-job aggregate_stat -line_type VL1L2 -out_line_type VCNT -by FCST_LEV \
+ -out_stat ${OUTPUT_DIR}/CONFIG_POINT_STAT_agg_stat_vl1l2_to_vcnt.stat"
];
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/SeriesAnalysisConfig_climo b/internal/test_unit/config/SeriesAnalysisConfig_climo
index 196c38dafa..f19bac7a20 100644
--- a/internal/test_unit/config/SeriesAnalysisConfig_climo
+++ b/internal/test_unit/config/SeriesAnalysisConfig_climo
@@ -37,7 +37,7 @@ regrid = {
censor_thresh = [];
censor_val = [];
-cat_thresh = [ >CDP25, >CDP50, >CDP75 ];
+cat_thresh = [ >OCDP25, >OCDP50, >OCDP75 ];
cnt_thresh = [ NA ];
cnt_logic = UNION;
@@ -50,7 +50,7 @@ fcst = {
];
}
obs = {
- cnt_thresh = [ NA, >CDP25&&OCDP25&&=30 -rirw_exact FALSE -dump_row ${MET_TEST_OUTPUT}/tc_stat/ALAL2010_AHWI_ri.tcst",
- "-job filter -amodel AHWI -rirw_track BDECK -rirw_thresh <=-30 -rirw_exact TRUE -dump_row ${MET_TEST_OUTPUT}/tc_stat/ALAL2010_AHWI_rw.tcst",
+ "-job filter -amodel AHWI -rirw_track BDECK -rirw_thresh >=30 -rirw_exact FALSE -set_hdr DESC RI -dump_row ${MET_TEST_OUTPUT}/tc_stat/ALAL2010_AHWI_ri.tcst",
+ "-job filter -amodel AHWI -rirw_track BDECK -rirw_thresh <=-30 -rirw_exact TRUE -set_hdr DESC RW -dump_row ${MET_TEST_OUTPUT}/tc_stat/ALAL2010_AHWI_rw.tcst",
"-job rirw -rirw_window 00 -rirw_thresh <=-15 -out_line_type CTC,CTS,MPR",
"-job rirw -rirw_window 12 -rirw_thresh <=-15 -out_line_type CTC,CTS,MPR",
- "-job rirw -rirw_window 12 -rirw_thresh <=-15 -out_line_type CTC,CTS -by amodel -out_stat ${MET_TEST_OUTPUT}/tc_stat/ALAL2010_rirw.stat"
+ "-job rirw -rirw_window 12 -rirw_thresh <=-15 -out_line_type CTC,CTS -by amodel -set_hdr DESC AMODEL -out_stat ${MET_TEST_OUTPUT}/tc_stat/ALAL2010_rirw.stat"
];
//
diff --git a/internal/test_unit/config/TCStatConfig_PROBRIRW b/internal/test_unit/config/TCStatConfig_PROBRIRW
index f8645a1e1e..679b681e59 100644
--- a/internal/test_unit/config/TCStatConfig_PROBRIRW
+++ b/internal/test_unit/config/TCStatConfig_PROBRIRW
@@ -205,7 +205,7 @@ out_valid_mask = "";
// Array of TCStat analysis jobs to be performed on the filtered data
//
jobs = [
- "-job filter -dump_row ${MET_TEST_OUTPUT}/tc_stat/PROBRIRW_filter_ee.tcst",
+ "-job filter -set_hdr DESC EVENT_EQUAL -dump_row ${MET_TEST_OUTPUT}/tc_stat/PROBRIRW_filter_ee.tcst",
"-job summary -column TK_ERR -by AMODEL -probrirw_thresh 30 -column_thresh PROBRIRW_PROB >0 -dump_row ${MET_TEST_OUTPUT}/tc_stat/PROBRIRW_summary_tk_err.tcst",
"-job probrirw -column_thresh RIRW_WINDOW ==24 -by AMODEL -probrirw_thresh 30 -probrirw_bdelta_thresh >=30 -out_line_type PCT,PSTD,PRC,PJC -dump_row ${MET_TEST_OUTPUT}/tc_stat/PROBRIRW_probrirw.tcst",
"-job summary -column TK_ERR -by AMODEL,LEAD -amodel GPMI,GPMN -event_equal TRUE",
diff --git a/internal/test_unit/config/ref_config/GridStatConfig_03h b/internal/test_unit/config/ref_config/GridStatConfig_03h
index 0a3daba7a1..278acf3be0 100644
--- a/internal/test_unit/config/ref_config/GridStatConfig_03h
+++ b/internal/test_unit/config/ref_config/GridStatConfig_03h
@@ -198,8 +198,9 @@ nc_pairs_flag = FALSE;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${MODEL}_F${FCST_TIME}_03h";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${MODEL}_F${FCST_TIME}_03h";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/ref_config/GridStatConfig_24h b/internal/test_unit/config/ref_config/GridStatConfig_24h
index 8804e2d708..2d0c263303 100644
--- a/internal/test_unit/config/ref_config/GridStatConfig_24h
+++ b/internal/test_unit/config/ref_config/GridStatConfig_24h
@@ -198,8 +198,9 @@ nc_pairs_flag = FALSE;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "${MODEL}_F${FCST_TIME}_24h";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "${MODEL}_F${FCST_TIME}_24h";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/ref_config/PointStatConfig_ADPUPA b/internal/test_unit/config/ref_config/PointStatConfig_ADPUPA
index 226be944df..2d98af4d87 100644
--- a/internal/test_unit/config/ref_config/PointStatConfig_ADPUPA
+++ b/internal/test_unit/config/ref_config/PointStatConfig_ADPUPA
@@ -182,8 +182,11 @@ output_flag = {
duplicate_flag = NONE;
rank_corr_flag = FALSE;
-tmp_dir = "/tmp";
-output_prefix = "${MODEL}_F${FCST_TIME}_ADPUPA";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${MODEL}_F${FCST_TIME}_ADPUPA";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/ref_config/PointStatConfig_ONLYSF b/internal/test_unit/config/ref_config/PointStatConfig_ONLYSF
index 9667c95b10..3f8a2a6367 100644
--- a/internal/test_unit/config/ref_config/PointStatConfig_ONLYSF
+++ b/internal/test_unit/config/ref_config/PointStatConfig_ONLYSF
@@ -192,8 +192,11 @@ output_flag = {
duplicate_flag = NONE;
rank_corr_flag = FALSE;
-tmp_dir = "/tmp";
-output_prefix = "${MODEL}_F${FCST_TIME}_ONLYSF";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${MODEL}_F${FCST_TIME}_ONLYSF";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/config/ref_config/PointStatConfig_WINDS b/internal/test_unit/config/ref_config/PointStatConfig_WINDS
index 87fe9c01bd..ffb0a2f06f 100644
--- a/internal/test_unit/config/ref_config/PointStatConfig_WINDS
+++ b/internal/test_unit/config/ref_config/PointStatConfig_WINDS
@@ -175,8 +175,11 @@ output_flag = {
duplicate_flag = NONE;
rank_corr_flag = FALSE;
-tmp_dir = "/tmp";
-output_prefix = "${MODEL}_F${FCST_TIME}_WINDS";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "${MODEL}_F${FCST_TIME}_WINDS";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/internal/test_unit/hdr/met_12_0.hdr b/internal/test_unit/hdr/met_12_0.hdr
index a1113d5102..f8655a4a47 100644
--- a/internal/test_unit/hdr/met_12_0.hdr
+++ b/internal/test_unit/hdr/met_12_0.hdr
@@ -5,8 +5,8 @@ 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_VAR_
-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
+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 ODFL ODFH OLFD OLFH OHFD OHFL 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
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
@@ -27,9 +27,9 @@ RELP : VERSION MODEL DESC FCST_LEAD FCST_VALID_BEG FCST_VALID_END OBS_L
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 DIR_ME DIR_MAE DIR_MSE
-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 FA_SPEED_BAR OA_SPEED_BAR DIRA_ME DIRA_MAE DIRA_MSE
-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 ANOM_CORR ANOM_CORR_NCL ANOM_CORR_NCU ANOM_CORR_BCL ANOM_CORR_BCU ANOM_CORR_UNCNTR ANOM_CORR_UNCNTR_BCL ANOM_CORR_UNCNTR_BCU DIR_ME DIR_ME_BCL DIR_ME_BCU DIR_MAE DIR_MAE_BCL DIR_MAE_BCU DIR_MSE DIR_MSE_BCL DIR_MSE_BCU DIR_RMSE DIR_RMSE_BCL DIR_RMSE_BCU
+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 TOTAL_DIR DIR_ME DIR_MAE DIR_MSE
+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 FA_SPEED_BAR OA_SPEED_BAR TOTAL_DIR DIRA_ME DIRA_MAE DIRA_MSE
+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 ANOM_CORR ANOM_CORR_NCL ANOM_CORR_NCU ANOM_CORR_BCL ANOM_CORR_BCU ANOM_CORR_UNCNTR ANOM_CORR_UNCNTR_BCL ANOM_CORR_UNCNTR_BCU TOTAL_DIR DIR_ME DIR_ME_BCL DIR_ME_BCU DIR_MAE DIR_MAE_BCL DIR_MAE_BCU DIR_MSE DIR_MSE_BCL DIR_MSE_BCU DIR_RMSE DIR_RMSE_BCL DIR_RMSE_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 PROB_LEAD PROB_VAL 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
SSIDX : 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 FCST_MODEL REF_MODEL N_INIT N_TERM N_VLD SS_INDEX
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
diff --git a/internal/test_unit/python/unit.py b/internal/test_unit/python/unit.py
new file mode 100755
index 0000000000..1fc3bf681a
--- /dev/null
+++ b/internal/test_unit/python/unit.py
@@ -0,0 +1,396 @@
+#! /usr/bin/env python3
+
+from datetime import datetime as dt
+import logging
+import os
+from pathlib import Path
+import re
+import subprocess
+import sys
+import xml.etree.ElementTree as ET
+
+def unit(test_xml, file_log=None, cmd_only=False, noexit=False, memchk=False, callchk=False, log_overwrite=True):
+ """
+ Parse a unit test xml file, run the associated tests, and display test results.
+
+ Parameters
+ -----------
+ test_xml : pathlike
+ path to file containing the unit test(s) to perform
+ file_log : pathlike, default None
+ if present, write output from each test to the specified file
+ cmd_only : bool, default False
+ if true, print the test commands but do not run them (overrides file_log)
+ noexit : bool, default False
+ if true, the unit tester will continue executing subsequent
+ tests when a test fails
+ memchk : bool, default False
+ if true, activate valgrind with memcheck
+ callchk : bool, default False
+ if true, activate valgrind with callcheck
+ log_overwrite : bool, default True
+ when true, if file_log points to an existing file, that file will be overwritten.
+ when false, new log records will be appended to the existing file.
+ """
+
+ # initialize logger
+ logger = logging.getLogger(__name__)
+ logger.setLevel(logging.DEBUG)
+
+ # create/add console handler
+ ch = logging.StreamHandler()
+ ch.setLevel(logging.INFO)
+ logger.addHandler(ch)
+
+ # create/add file handler
+ if file_log and not cmd_only:
+ if log_overwrite:
+ file_mode = 'w'
+ else:
+ file_mode = 'a'
+ fh = logging.FileHandler(file_log, mode=file_mode)
+ fh.setLevel(logging.DEBUG)
+ logger.addHandler(fh)
+
+ # parse xml file
+ try:
+ test_root = ET.parse(test_xml)
+ except Exception as e:
+ logger.exception(f"ERROR: Unable to parse xml from {test_xml}")
+ raise
+
+ # parse the children of the met_test element
+ if test_root.getroot().tag != 'met_test':
+ logger.error(f"ERROR: unexpected top-level element. Expected 'met_test', got '{test_root.tag}'")
+ sys.exit(1)
+ # read test_dir
+ try:
+ test_dir = test_root.find('test_dir').text
+ mgnc = repl_env(test_dir + '/bin/mgnc.sh')
+ mpnc = repl_env(test_dir + '/bin/mpnc.sh')
+ except Exception as e:
+ logger.warning(f"WARNING: unable to read test_dir from {test_xml}")
+ pass
+
+ tests = build_tests(test_root)
+
+ # determine the max length of the test names
+ # not used, unless format of test result display is changed
+ name_wid = max([len(test['name']) for test in tests])
+
+ VALGRIND_OPT_MEM ="--leak-check=full --show-leak-kinds=all --error-limit=no -v"
+ VALGRIND_OPT_CALL ="--tool=callgrind --dump-instr=yes --simulate-cache=yes --collect-jumps=yes"
+
+ # run each test
+ for test in tests:
+ # # print the test name ... may want to change this to only if cmd_only=False
+ logger.debug("\n")
+ logger.info(f"TEST: {test['name']}")
+
+ # # prepare the output space
+ output_keys = [key for key in test.keys() if key.startswith('out_')]
+ outputs = [output for key in output_keys for output in test[key]]
+ for output in outputs:
+ try:
+ Path(output).unlink()
+ except FileNotFoundError:
+ pass
+ except Exception as e:
+ logger.exception()
+ raise
+ output_dir = Path(output).parent
+ output_dir.mkdir(parents=True, exist_ok=True) #should error/warning be raised if dir already exists?
+
+ # # set the test environment variables
+ set_envs = []
+ if 'env' in test.keys():
+ for key, val in sorted(test['env'].items()):
+ os.environ[key] = val
+ set_cmd = f"export {key}={val}"
+ logger.debug(set_cmd)
+ set_envs.append(set_cmd)
+
+ # # build the text command
+ cmd = (test['exec'] + test['param']).strip()
+
+ if memchk:
+ cmd = f"valgrind {VALGRIND_OPT_MEM} {cmd}"
+ elif callchk:
+ cmd = f"valgrind {VALGRIND_OPT_CALL} {cmd}"
+
+
+ # # if writing a command file, print the environment and command, then loop
+ # consider tying this into logging...
+ if cmd_only:
+ if 'env' in test.keys():
+ for key, val in sorted(test['env'].items()):
+ print(f"export '{key}={val}'")
+ print(f"{cmd}")
+ if 'env' in test.keys():
+ for key, val in sorted(test['env'].items()):
+ print(f"unset {key}")
+ print("\n")
+
+ # # run and time the test command
+ else:
+ logger.debug(f"{cmd}")
+ t_start = dt.now()
+ cmd_return = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, shell=True)
+ t_elaps = dt.now() - t_start
+
+ cmd_outs = cmd_return.stdout
+ logger.debug(f"{cmd_outs}")
+ logger.debug(f"Return code: {cmd_return.returncode}")
+
+ # # check the return status and output files
+ ret_ok = (cmd_return.returncode == test['retval'])
+ if ret_ok:
+ out_ok = True
+
+ for filepath in test['out_pnc']:
+ result = subprocess.run([mpnc, '-v', filepath],
+ stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
+ cmd_outs += ("\n"+result.stdout)
+ logger.debug(result.stdout)
+ if result.returncode:
+ out_ok = False
+
+ for filepath in test['out_gnc']:
+ result = subprocess.run([mgnc, '-v', filepath],
+ stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
+ cmd_outs += ("\n"+result.stdout)
+ logger.debug(result.stdout)
+ if result.returncode:
+ out_ok = False
+
+ for filepath in test['out_stat']:
+ # check stat file exists and is nonzero size
+ try:
+ filesize = os.stat(filepath).st_size
+ if filesize==0:
+ cmd_outs += (f"\nERROR: stat file empty {filepath}\n")
+ out_ok = False
+ break
+ except FileNotFoundError:
+ cmd_outs += (f"\nERROR: stat file missing {filepath}\n")
+ logger.debug(result.stdout)
+ out_ok = False
+ break
+ # check stat file has non-header lines
+ with open(filepath) as f:
+ numlines = len([l for l in f.readlines() if not l.startswith('VERSION')])
+ if numlines==0:
+ cmd_outs += (f"\nERROR: stat data missing from file {filepath}\n")
+ out_ok = False
+
+ for filepath in test['out_ps']:
+ # check postscript file exists and is nonzero size
+ try:
+ filesize = os.stat(filepath).st_size
+ if filesize==0:
+ cmd_outs += (f"\nERROR: postscript file empty {filepath}\n")
+ out_ok = False
+ break
+ except FileNotFoundError:
+ cmd_outs += (f"\nERROR: postscript file missing {filepath}\n")
+ out_ok = False
+ break
+ # check for ghostscript errors
+ result = subprocess.run(['gs', '-sDEVICE=nullpage', '-dQUIET', '-dNOPAUSE', '-dBATCH', filepath])
+ if result.returncode:
+ cmd_outs += (f"\nERROR: ghostscript error for postscript file {filepath}")
+ out_ok = False
+
+ for filepath in test['out_exist']:
+ # check output file exists and is nonzero size
+ try:
+ filesize = os.stat(filepath).st_size
+ if filesize==0:
+ cmd_outs += (f"\nERROR: file empty {filepath}\n")
+ out_ok = False
+ break
+ except FileNotFoundError:
+ cmd_outs += (f"\nERROR: file missing when it should exist {filepath}\n")
+ out_ok = False
+
+ for filepath in test['out_not_exist']:
+ # check output file doesn't exist
+ if os.path.isfile(filepath):
+ cmd_outs += (f"\nERROR: file exists when it should be missing {filepath}\n")
+ out_ok = False
+
+ # # unset the test environment variables
+ unset_envs = []
+ if 'env' in test.keys():
+ for key, val in sorted(test['env'].items()):
+ del os.environ[key]
+ unset_cmd = f"unset {key}"
+ logger.debug(unset_cmd)
+ unset_envs.append(unset_cmd)
+
+ # # print the test result
+ test_result = "pass" if (ret_ok and out_ok) else "FAIL"
+ logger.info(f"\t- {test_result} - \t{round(t_elaps.total_seconds(),3)} sec")
+
+ # # on failure, print the problematic test and exit, if requested
+ if not (ret_ok and out_ok):
+ logger.info("\n".join(set_envs) + "\n" + cmd + "\n" + cmd_outs + "\n".join(unset_envs) + "\n")
+ if not noexit:
+ sys.exit(1)
+
+ # clean up logger/handlers (to avoid duplicate logging when this function is looped)
+ logger.removeHandler(ch)
+ try:
+ logger.removeHandler(fh)
+ except NameError:
+ pass
+
+
+def build_tests(test_root):
+ """
+ Parse the test components.
+
+ Take an ElementTree element extracted from a unit test xml file.
+ Return a list of all tests, where each test is represented as a dictionary,
+ with its keys representing each test component.
+
+ Parameters
+ ----------
+ test_root : ElementTree element
+ parsed from XML file containing the unit test(s) to perform
+
+ Returns
+ -------
+ test_list:
+ list of test dicts, containing test attributes parsed from xml object
+
+ """
+
+ # define logger
+ logger = logging.getLogger(__name__)
+
+ # find all tests in test_xml, and create a dictionary of attributes for each test
+ test_list = []
+ for test_el in test_root.iter('test'):
+ test = {}
+ try:
+ test['name'] = test_el.attrib['name']
+ except KeyError:
+ logger.error("ERROR: name attribute not found for test")
+ raise
+
+ test['retval'] = 0
+ for el in test_el:
+ if (el.tag=='exec' or el.tag=='param'):
+ test[el.tag] = repl_env(el.text)
+ elif el.tag=='retval':
+ try:
+ test['retval'] = int(el.text)
+ except ValueError:
+ logger.error("ERROR: retval must be an integer value")
+ raise
+ elif el.tag=='output':
+ test['out_pnc'] = []
+ test['out_gnc'] = []
+ test['out_stat'] = []
+ test['out_ps'] = []
+ test['out_exist'] = []
+ test['out_not_exist'] = []
+ output_names = {
+ 'point_nc' : 'out_pnc',
+ 'grid_nc' : 'out_gnc',
+ 'stat' : 'out_stat',
+ 'ps' : 'out_ps',
+ 'exist' : 'out_exist',
+ 'not_exist' : 'out_not_exist',
+ }
+ for output_el in el:
+ test[output_names[output_el.tag]].append(repl_env(output_el.text))
+
+ elif el.tag=='env':
+ env_dict = {}
+ for env_el in el:
+ try:
+ env_name = env_el.find('name').text
+ env_dict[env_name] = env_el.find('value').text
+ if not env_dict[env_name]:
+ env_dict[env_name] = ''
+ except AttributeError:
+ logger.error(f"ERROR: env pair in test \\{test['name']}\\ missing name or value")
+ raise
+
+ test['env'] = env_dict
+
+ # validate test format/details
+ expected_keys = ['exec', 'param', 'out_pnc', 'out_gnc', 'out_stat', 'out_ps',
+ 'out_exist', 'out_not_exist']
+ for key in expected_keys:
+ if key not in test.keys():
+ logger.error(f"ERROR: test {test['name']} missing {key} element")
+ sys.exit(1)
+
+ test_list.append(test)
+
+ return test_list
+
+
+def repl_env(string_with_ref):
+ """
+ Take a string with a placeholder for environment variable with syntax
+ ${ENV_NAME} and replace placeholder with corresponding value of environment
+ variable.
+
+ Parameters
+ ----------
+ string_with_ref : str
+ A string, generally path-like, that includes substring ${ENV_NAME}
+
+ Returns
+ -------
+ string_with_ref : str
+ The provided string with ${ENV_NAME} replaced by corresponding environment variable
+ """
+ # define logger
+ logger = logging.getLogger(__name__)
+
+ envar_ref_list = re.findall('\$\{\w+}', string_with_ref)
+ envar_ref_unique = [
+ envar_ref_list[i] for i in list(range(len(envar_ref_list))) if (
+ envar_ref_list[i] not in envar_ref_list[:i])]
+
+ if len(envar_ref_unique)>0:
+ for envar_ref in envar_ref_unique:
+ envar_name = envar_ref[2:-1]
+ envar = os.getenv(envar_name)
+ if not envar:
+ logger.error(f"ERROR: environment variable {envar_name} not found")
+ string_with_ref = string_with_ref.replace(envar_ref, envar)
+
+ return string_with_ref
+
+if __name__ == "__main__":
+ import argparse
+
+ parser = argparse.ArgumentParser(description="Run a unit test.")
+ parser.add_argument('test_xml', nargs='+')
+ parser.add_argument('-log', metavar='log_file',
+ help='if present, write output from each test to log_file')
+ parser.add_argument('-cmd', action='store_true',
+ help='if present, print the test commands but do not run them, overrides -log')
+ parser.add_argument('-memchk', action='store_true',
+ help='if present, activate valgrind with memcheck')
+ parser.add_argument('-callchk', action='store_true',
+ help='if present, activate valgrind with callcheck')
+ parser.add_argument('-noexit', action='store_true',
+ help='if present, the unit tester will continue executing subsequent tests when a test fails')
+ args = parser.parse_args()
+
+ for i, xml in enumerate(args.test_xml):
+ if i==0:
+ new_log = True
+ else:
+ new_log = False
+ unit(test_xml=xml, file_log=args.log, cmd_only=args.cmd, noexit=args.noexit, memchk=args.memchk, callchk=args.callchk,
+ log_overwrite=new_log)
+
+
diff --git a/internal/test_unit/unit_test.log b/internal/test_unit/unit_test.log
new file mode 100644
index 0000000000..ef1c7b19b5
--- /dev/null
+++ b/internal/test_unit/unit_test.log
@@ -0,0 +1,1225 @@
+export MET_BASE=/d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/../../share/met
+export MET_BUILD_BASE=/d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/../..
+export MET_TEST_BASE=/d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit
+export MET_TEST_INPUT=/d1/projects/MET/MET_test_data/unit_test
+export MET_TEST_OUTPUT=/d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/../../test_output
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_ascii2nc.xml
+
+TEST: ascii2nc_TRMM_3hr
+ - pass - 17.767 sec
+TEST: ascii2nc_GAGE_24hr
+ - pass - 1.165 sec
+TEST: ascii2nc_GAGE_24hr_badfile
+ - pass - 0.53 sec
+TEST: ascii2nc_duplicates
+ - pass - 0.532 sec
+TEST: ascii2nc_SURFRAD1
+ - pass - 0.975 sec
+TEST: ascii2nc_insitu_turb
+ - pass - 3.119 sec
+TEST: ascii2nc_by_var_name_PB
+ - pass - 146.208 sec
+TEST: ascii2nc_rain_01H_sum
+ - pass - 0.582 sec
+TEST: ascii2nc_airnow_daily_v2
+ - pass - 0.799 sec
+TEST: ascii2nc_airnow_hourly_aqobs
+ - pass - 0.886 sec
+TEST: ascii2nc_airnow_hourly
+ - pass - 3.847 sec
+TEST: ascii2nc_ndbc
+ - pass - 8.243 sec
+TEST: ascii2nc_ismn_SNOTEL
+ - pass - 14.834 sec
+TEST: ascii2nc_iabp
+ - pass - 0.542 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_ascii2nc_indy.xml
+
+TEST: ascii2nc_TRMM_12hr
+ - pass - 20.969 sec
+TEST: ascii2nc_LITTLE_R
+ - pass - 0.605 sec
+TEST: ascii2nc_LITTLE_R_BAD_RECORD
+ - pass - 0.551 sec
+TEST: ascii2nc_SURFRAD
+ - pass - 0.976 sec
+TEST: ascii2nc_SURFRAD_summary1
+ - pass - 2.007 sec
+TEST: ascii2nc_SURFRAD_summary2
+ - pass - 1.483 sec
+TEST: ascii2nc_SURFRAD_summary3
+ - pass - 1.224 sec
+TEST: ascii2nc_SURFRAD_summary4
+ - pass - 1.205 sec
+TEST: ascii2nc_insitu_turb_mask_sid
+ - pass - 1.241 sec
+TEST: ascii2nc_insitu_turb_mask_grid_data
+ - pass - 2.994 sec
+TEST: ascii2nc_insitu_turb_mask_named_grid
+ - pass - 2.963 sec
+TEST: ascii2nc_MASK_GRID
+ - pass - 3.539 sec
+TEST: ascii2nc_MASK_POLY
+ - pass - 1.298 sec
+TEST: ascii2nc_WWSIS_clear_pvwatts_one_min
+ - pass - 18.383 sec
+TEST: ascii2nc_WWSIS_clear_pvwatts_five_min
+ - pass - 2.641 sec
+TEST: ascii2nc_WWSIS_clear_pvwatts_ten_min
+ - pass - 1.509 sec
+TEST: ascii2nc_WWSIS_clear_pvwatts_sixty_min
+ - pass - 0.694 sec
+TEST: ascii2nc_WWSIS_HA_pvwatts_sixty_min
+ - pass - 0.735 sec
+TEST: ascii2nc_WWSIS_pvwatts_one_min
+ - pass - 18.646 sec
+TEST: ascii2nc_WWSIS_pvwatts_sixty_min
+ - pass - 0.7 sec
+TEST: ascii2nc_by_var_name
+ - pass - 0.534 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_madis2nc.xml
+
+TEST: madis2nc_METAR
+ - pass - 12.385 sec
+TEST: madis2nc_METAR_time_summary
+ - pass - 16.391 sec
+TEST: madis2nc_METAR_mask_sid
+ - pass - 0.608 sec
+TEST: madis2nc_METAR_mask_grid
+ - pass - 1.052 sec
+TEST: madis2nc_RAOB
+ - pass - 3.295 sec
+TEST: madis2nc_PROFILER_MASK_POLY
+ - pass - 0.57 sec
+TEST: madis2nc_MARITIME
+ - pass - 0.811 sec
+TEST: madis2nc_MESONET_MASK_GRID
+ - pass - 6.653 sec
+TEST: madis2nc_MESONET_optional_vars
+ - pass - 4.856 sec
+TEST: madis2nc_ACARS_PROFILES
+ - pass - 2.095 sec
+TEST: madis2nc_buf_handle
+ - pass - 2.626 sec
+TEST: madis2nc_multiple_inputs
+ - pass - 2.167 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_trmm2nc.xml
+
+TEST: trmm2nc_3hr
+ - pass - 0.334 sec
+TEST: trmm2nc_12hr
+ - pass - 0.331 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_pb2nc.xml
+
+TEST: pb2nc_GDAS_mask_grid_G212
+ - pass - 8.247 sec
+TEST: pb2nc_NDAS_no_mask
+ - pass - 9.265 sec
+TEST: pb2nc_NDAS_mask_poly_conus
+ - pass - 3.676 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_pb2nc_indy.xml
+
+TEST: pb2nc_NDAS_mask_sid_list
+ - pass - 1.602 sec
+TEST: pb2nc_NDAS_mask_sid_file
+ - pass - 1.765 sec
+TEST: pb2nc_NDAS_mask_grid_data_cfg
+ - pass - 4.469 sec
+TEST: pb2nc_compute_pbl_cape
+ - pass - 13.715 sec
+TEST: pb2nc_NDAS_var_all
+ - pass - 19.439 sec
+TEST: pb2nc_vertical_level_500
+ - pass - 1.392 sec
+TEST: pb2nc_NDAS_summary
+ - pass - 6.866 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_gen_vx_mask.xml
+
+TEST: gen_vx_mask_POLY_GFS_LATLON
+ - pass - 11.973 sec
+TEST: gen_vx_mask_POLY_GFS_MERCATOR
+ - pass - 0.607 sec
+TEST: gen_vx_mask_POLY_NAM_LAMBERT
+ - pass - 4.092 sec
+TEST: gen_vx_mask_POLY_HMT_STEREO
+ - pass - 1.026 sec
+TEST: gen_vx_mask_POLY_GFS_LATLON_NAK
+ - pass - 1.476 sec
+TEST: gen_vx_mask_POLY_LATLON_RECTANGLE
+ - pass - 0.552 sec
+TEST: gen_vx_mask_POLY_XY_RECTANGLE
+ - pass - 0.544 sec
+TEST: gen_vx_mask_GRID_NAM_HMT_STEREO
+ - pass - 0.732 sec
+TEST: gen_vx_mask_GRID_NAMED_GRIDS
+ - pass - 0.618 sec
+TEST: gen_vx_mask_GRID_SPEC_STRINGS
+ - pass - 0.598 sec
+TEST: gen_vx_mask_CIRCLE
+ - pass - 0.685 sec
+TEST: gen_vx_mask_CIRCLE_MASK
+ - pass - 0.642 sec
+TEST: gen_vx_mask_CIRCLE_COMPLEMENT
+ - pass - 0.649 sec
+TEST: gen_vx_mask_TRACK
+ - pass - 1.096 sec
+TEST: gen_vx_mask_TRACK_MASK
+ - pass - 1.098 sec
+TEST: gen_vx_mask_DATA_APCP_24
+ - pass - 1.067 sec
+TEST: gen_vx_mask_POLY_PASS_THRU
+ - pass - 0.633 sec
+TEST: gen_vx_mask_POLY_INTERSECTION
+ - pass - 0.633 sec
+TEST: gen_vx_mask_POLY_UNION
+ - pass - 0.634 sec
+TEST: gen_vx_mask_POLY_SYMDIFF
+ - pass - 0.627 sec
+TEST: gen_vx_mask_DATA_INPUT_FIELD
+ - pass - 1.211 sec
+TEST: gen_vx_mask_BOX
+ - pass - 0.536 sec
+TEST: gen_vx_mask_SOLAR_ALT
+ - pass - 0.557 sec
+TEST: gen_vx_mask_SOLAR_AZI
+ - pass - 0.673 sec
+TEST: gen_vx_mask_LAT
+ - pass - 0.543 sec
+TEST: gen_vx_mask_LON
+ - pass - 0.548 sec
+TEST: gen_vx_mask_SHAPE
+ - pass - 0.549 sec
+TEST: gen_vx_mask_SHAPE_STR
+ - pass - 0.695 sec
+TEST: gen_vx_mask_SHAPE_STR_MULTI
+ - pass - 0.605 sec
+TEST: gen_vx_mask_PYTHON
+ - pass - 1.605 sec
+TEST: gen_vx_mask_DATA_TWO_FILE_TYPES
+ - pass - 1.22 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_gen_ens_prod.xml
+
+TEST: gen_ens_prod_NO_CTRL
+ - pass - 9.428 sec
+TEST: gen_ens_prod_WITH_CTRL
+ - pass - 8.858 sec
+TEST: gen_ens_prod_SINGLE_FILE_NC_NO_CTRL
+ - pass - 1.23 sec
+TEST: gen_ens_prod_SINGLE_FILE_NC_WITH_CTRL
+ - pass - 1.144 sec
+TEST: gen_ens_prod_SINGLE_FILE_GRIB_NO_CTRL
+ - pass - 1.206 sec
+TEST: gen_ens_prod_SINGLE_FILE_GRIB_WITH_CTRL
+ - pass - 1.213 sec
+TEST: gen_ens_prod_NORMALIZE
+ - pass - 6.058 sec
+TEST: gen_ens_prod_CLIMO_ANOM_ENS_MEMBER_ID
+ - pass - 0.88 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_pcp_combine.xml
+
+TEST: pcp_combine_sum_GRIB1
+ - pass - 28.664 sec
+TEST: pcp_combine_sum_GRIB1_MISSING
+ - pass - 14.362 sec
+TEST: pcp_combine_sum_GRIB1_MULTIPLE_FIELDS
+ - pass - 42.993 sec
+TEST: pcp_combine_sum_GRIB2
+ - pass - 1.445 sec
+TEST: pcp_combine_add_GRIB1
+ - pass - 1.686 sec
+TEST: pcp_combine_add_GRIB2
+ - pass - 0.601 sec
+TEST: pcp_combine_add_STAGEIV
+ - pass - 1.207 sec
+TEST: pcp_combine_add_ACCUMS
+ - pass - 1.414 sec
+TEST: pcp_combine_sub_GRIB1
+ - pass - 1.089 sec
+TEST: pcp_combine_sub_GRIB1_run2
+ - pass - 0.675 sec
+TEST: pcp_combine_sub_GRIB2
+ - pass - 0.553 sec
+TEST: pcp_combine_sub_NC_MET_06
+ - pass - 0.631 sec
+TEST: pcp_combine_sub_P_INTERP
+ - pass - 0.811 sec
+TEST: pcp_combine_add_VARNAME
+ - pass - 0.891 sec
+TEST: pcp_combine_sub_DIFFERENT_INIT
+ - pass - 0.669 sec
+TEST: pcp_combine_sub_NEGATIVE_ACCUM
+ - pass - 0.694 sec
+TEST: pcp_combine_sub_SUBTRACT_MULTIPLE_FIELDS
+ - pass - 1.045 sec
+TEST: pcp_combine_derive_LIST_OF_FILES
+ - pass - 1.104 sec
+TEST: pcp_combine_derive_MULTIPLE_FIELDS
+ - pass - 3.137 sec
+TEST: pcp_combine_derive_VLD_THRESH
+ - pass - 1.208 sec
+TEST: pcp_combine_derive_CUSTOM_NAMES
+ - pass - 0.747 sec
+TEST: pcp_combine_sub_ROT_LL
+ - pass - 1.096 sec
+TEST: pcp_combine_LAEA_GRIB2
+ - pass - 1.428 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_wwmca_regrid.xml
+
+TEST: wwmca_regrid_G003_NO_AGE
+ - pass - 2.472 sec
+TEST: wwmca_regrid_G003_AGE_60
+ - pass - 1.532 sec
+TEST: wwmca_regrid_G003_AGE_120
+ - pass - 1.531 sec
+TEST: wwmca_regrid_G003_AGE_240
+ - pass - 1.575 sec
+TEST: wwmca_regrid_G003_WRITE_PIXEL_AGE
+ - pass - 1.547 sec
+TEST: wwmca_regrid_GFS_LATLON
+ - pass - 4.694 sec
+TEST: wwmca_regrid_GFS_MERCATOR
+ - pass - 0.699 sec
+TEST: wwmca_regrid_NAM_LAMBERT
+ - pass - 5.288 sec
+TEST: wwmca_regrid_HMT_STEREO
+ - pass - 0.963 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_point_stat.xml
+
+TEST: point_stat_GRIB1_NAM_GDAS
+ - pass - 49.029 sec
+TEST: point_stat_GRIB1_NAM_GDAS_WINDS
+ - pass - 11.773 sec
+TEST: point_stat_GRIB1_NAM_GDAS_MASK_SID
+ - pass - 43.827 sec
+TEST: point_stat_GRIB2_NAM_NDAS
+ - pass - 36.403 sec
+TEST: point_stat_GRIB2_SREF_GDAS
+ - pass - 28.574 sec
+TEST: point_stat_GRIB1_NAM_TRMM
+ - pass - 15.594 sec
+TEST: point_stat_GRIB2_SREF_TRMM
+ - pass - 15.265 sec
+TEST: point_stat_NCMET_NAM_HMTGAGE
+ - pass - 1.756 sec
+TEST: point_stat_NCMET_NAM_NDAS_SEEPS
+ - pass - 9.972 sec
+TEST: point_stat_NCPINT_TRMM
+ - pass - 15.005 sec
+TEST: point_stat_NCPINT_NDAS
+ - pass - 7.636 sec
+TEST: point_stat_GRIB2_SREF_TRMM_prob
+ - pass - 2.426 sec
+TEST: point_stat_GTG_lc
+ - pass - 60.144 sec
+TEST: point_stat_GTG_latlon
+ - pass - 43.921 sec
+TEST: point_stat_SID_INC_EXC
+ - pass - 6.573 sec
+TEST: point_stat_SID_INC_EXC_CENSOR
+ - pass - 7.393 sec
+TEST: point_stat_GRIB1_NAM_GDAS_INTERP_OPTS
+ - pass - 5.202 sec
+TEST: point_stat_GRIB1_NAM_GDAS_INTERP_OPTS_name
+ - pass - 20.228 sec
+TEST: point_stat_LAND_TOPO_MASK
+ - pass - 36.319 sec
+TEST: point_stat_MPR_THRESH
+ - pass - 57.575 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_stat_analysis_ps.xml
+
+TEST: stat_analysis_CONFIG_POINT_STAT
+ - pass - 44.426 sec
+TEST: stat_analysis_POINT_STAT_SUMMARY
+ - pass - 34.47 sec
+TEST: stat_analysis_POINT_STAT_SUMMARY_UNION
+ - pass - 19.293 sec
+TEST: stat_analysis_POINT_STAT_FILTER_OBS_SID
+ - pass - 1.695 sec
+TEST: stat_analysis_POINT_STAT_FILTER_TIMES
+ - pass - 8.536 sec
+TEST: stat_analysis_POINT_STAT_SEEPS
+ - pass - 3.168 sec
+TEST: stat_analysis_RAMPS
+ - pass - 3.089 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_duplicate_flag.xml
+
+TEST: point_stat_DUP_NONE
+ - pass - 0.694 sec
+TEST: point_stat_DUP_UNIQUE
+ - pass - 0.679 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_obs_summary.xml
+
+TEST: ascii2nc_obs_summary
+ - pass - 0.571 sec
+TEST: point_stat_OS_NONE
+ - pass - 0.684 sec
+TEST: point_stat_OS_NEAREST
+ - pass - 0.728 sec
+TEST: point_stat_OS_MIN
+ - pass - 0.676 sec
+TEST: point_stat_OS_MAX
+ - pass - 0.686 sec
+TEST: point_stat_OS_UW_MEAN
+ - pass - 0.681 sec
+TEST: point_stat_OS_DW_MEAN
+ - pass - 0.676 sec
+TEST: point_stat_OS_MEDIAN
+ - pass - 0.677 sec
+TEST: point_stat_OS_PERC
+ - pass - 0.682 sec
+TEST: point_stat_OS_UNIQUE_ALL
+ - pass - 1.406 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_grid_stat.xml
+
+TEST: grid_stat_GRIB_lvl_typ_val
+ - pass - 102.432 sec
+TEST: grid_stat_GRIB_set_attr
+ - pass - 26.404 sec
+TEST: grid_stat_GRIB2_NAM_RTMA
+ - pass - 21.167 sec
+TEST: grid_stat_GRIB2_NAM_RTMA_NP2
+ - pass - 19.316 sec
+TEST: grid_stat_GRIB1_NAM_STAGE4
+ - pass - 35.211 sec
+TEST: grid_stat_GRIB1_NAM_STAGE4_CENSOR
+ - pass - 3.779 sec
+TEST: grid_stat_GTG_lc
+ - pass - 2.261 sec
+TEST: grid_stat_GTG_latlon
+ - pass - 3.405 sec
+TEST: grid_stat_GRIB2_SREF_STAGE4_prob_as_scalar
+ - pass - 2.357 sec
+TEST: grid_stat_APPLY_MASK_TRUE
+ - pass - 5.515 sec
+TEST: grid_stat_APPLY_MASK_FALSE
+ - pass - 5.392 sec
+TEST: grid_stat_GFS_FOURIER
+ - pass - 8.642 sec
+TEST: grid_stat_MPR_THRESH
+ - pass - 59.558 sec
+TEST: grid_stat_UK_SEEPS
+ - pass - 4.344 sec
+TEST: grid_stat_WRF_pres
+ - pass - 1.113 sec
+TEST: grid_stat_GEN_ENS_PROD
+ - pass - 3.09 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_stat_analysis_gs.xml
+
+TEST: stat_analysis_CONFIG_GRID_STAT
+ - pass - 0.878 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_wavelet_stat.xml
+
+TEST: wavelet_stat_GRIB1_NAM_STAGE4
+ - pass - 27.062 sec
+TEST: wavelet_stat_GRIB1_NAM_STAGE4_NO_THRESH
+ - pass - 15.383 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_stat_analysis_ws.xml
+
+TEST: stat_analysis_AGG_ISC
+ - pass - 0.64 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_ensemble_stat.xml
+
+TEST: ensemble_stat_CMD_LINE
+ - pass - 5.766 sec
+TEST: ensemble_stat_FILE_LIST
+ - pass - 5.425 sec
+TEST: ensemble_stat_MASK_SID
+ - pass - 1.392 sec
+TEST: ensemble_stat_MASK_SID_CTRL
+ - pass - 1.345 sec
+TEST: ensemble_stat_MASK_SID_CENSOR
+ - pass - 1.732 sec
+TEST: ensemble_stat_SKIP_CONST
+ - pass - 5.18 sec
+TEST: ensemble_stat_OBSERR
+ - pass - 13.099 sec
+TEST: ensemble_stat_SINGLE_FILE_NC_NO_CTRL
+ - pass - 3.044 sec
+TEST: ensemble_stat_SINGLE_FILE_NC_WITH_CTRL
+ - pass - 3.158 sec
+TEST: ensemble_stat_SINGLE_FILE_GRIB_NO_CTRL
+ - pass - 2.072 sec
+TEST: ensemble_stat_SINGLE_FILE_GRIB_WITH_CTRL
+ - pass - 2.109 sec
+TEST: ensemble_stat_RPS_CLIMO_BIN_PROB
+ - pass - 0.581 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_stat_analysis_es.xml
+
+TEST: stat_analysis_AGG_RHIST
+ - pass - 0.843 sec
+TEST: stat_analysis_AGG_PHIST
+ - pass - 0.843 sec
+TEST: stat_analysis_AGG_RELP
+ - pass - 1.007 sec
+TEST: stat_analysis_AGG_ECNT
+ - pass - 1.031 sec
+TEST: stat_analysis_AGG_STAT_ORANK_RHIST_PHIST
+ - pass - 5.348 sec
+TEST: stat_analysis_AGG_STAT_ORANK_RELP
+ - pass - 4.691 sec
+TEST: stat_analysis_AGG_STAT_ORANK_SSVAR
+ - pass - 5.3 sec
+TEST: stat_analysis_AGG_STAT_ORANK_ECNT
+ - pass - 11.662 sec
+TEST: stat_analysis_AGG_SSVAR
+ - pass - 1.132 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_mode.xml
+
+TEST: mode_NO_MATCH_MERGE
+ - pass - 2.319 sec
+TEST: mode_NO_MERGE
+ - pass - 1.94 sec
+TEST: mode_MERGE_BOTH
+ - pass - 3.724 sec
+TEST: mode_MASK_POLY
+ - pass - 1.96 sec
+TEST: mode_QUILT
+ - pass - 5.595 sec
+TEST: mode_CONFIG_MERGE
+ - pass - 3.549 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_mode_multivar.xml
+
+TEST: mode_multivar_snow
+ - pass - 36.544 sec
+TEST: mode_multivar_snow_3_2
+ - pass - 19.229 sec
+TEST: mode_multivar_snow_super
+ - pass - 31.774 sec
+TEST: mode_multivar_FAKE_DATA
+ - pass - 4.152 sec
+TEST: mode_multivar_FAKE_DATA_with_intensities
+ - pass - 6.589 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_mode_analysis.xml
+
+TEST: mode_analysis_BYCASE_SIMPLE
+ - pass - 0.758 sec
+TEST: mode_analysis_BYCASE_CLUSTER
+ - pass - 0.55 sec
+TEST: mode_analysis_MET-644_LOOKIN_BY_DIR
+ - pass - 0.593 sec
+TEST: mode_analysis_MET-644_LOOKIN_BY_FILE
+ - pass - 0.553 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_plot_point_obs.xml
+
+TEST: plot_point_obs_G218
+ - pass - 4.803 sec
+TEST: plot_point_obs_TMP_ADPUPA
+ - pass - 4.345 sec
+TEST: plot_point_obs_CONFIG
+ - pass - 4.309 sec
+TEST: plot_point_obs_CONFIG_REGRID
+ - pass - 4.069 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_plot_data_plane.xml
+
+TEST: plot_data_plane_GRIB1
+ - pass - 1.385 sec
+TEST: plot_data_plane_GRIB1_REC
+ - pass - 0.934 sec
+TEST: plot_data_plane_GRIB1_CODE
+ - pass - 0.916 sec
+TEST: plot_data_plane_GRIB1_ENS
+ - pass - 0.825 sec
+TEST: plot_data_plane_GRIB1_ENS_HI
+ - pass - 0.793 sec
+TEST: plot_data_plane_GRIB1_rotlatlon
+ - pass - 0.721 sec
+TEST: plot_data_plane_GRIB2
+ - pass - 0.858 sec
+TEST: plot_data_plane_GRIB2_ENS
+ - pass - 0.715 sec
+TEST: plot_data_plane_GRIB2_ENS_LOW
+ - pass - 0.725 sec
+TEST: plot_data_plane_GRIB2_PROB
+ - pass - 0.645 sec
+TEST: plot_data_plane_NC_PINTERP
+ - pass - 0.755 sec
+TEST: plot_data_plane_NC_MET
+ - pass - 0.804 sec
+TEST: plot_data_plane_NCCF_lc_0
+ - pass - 0.746 sec
+TEST: plot_data_plane_NCCF_lc_25
+ - pass - 0.815 sec
+TEST: plot_data_plane_NCCF_lc_50
+ - pass - 0.802 sec
+TEST: plot_data_plane_NCCF_latlon_0
+ - pass - 1.003 sec
+TEST: plot_data_plane_NCCF_latlon_12
+ - pass - 0.976 sec
+TEST: plot_data_plane_NCCF_latlon_25
+ - pass - 0.976 sec
+TEST: plot_data_plane_NCCF_latlon_by_value
+ - pass - 0.956 sec
+TEST: plot_data_plane_NCCF_north_to_south
+ - pass - 4.35 sec
+TEST: plot_data_plane_NCCF_time
+ - pass - 0.681 sec
+TEST: plot_data_plane_NCCF_time_int64
+ - pass - 0.73 sec
+TEST: plot_data_plane_NCCF_rotlatlon
+ - pass - 0.934 sec
+TEST: plot_data_plane_TRMM_3B42_3hourly_nc
+ - pass - 1.041 sec
+TEST: plot_data_plane_TRMM_3B42_daily_nc
+ - pass - 1.233 sec
+TEST: plot_data_plane_TRMM_3B42_daily_packed
+ - pass - 1.209 sec
+TEST: plot_data_plane_TRMM_3B42_daily_packed_CONVERT
+ - pass - 1.71 sec
+TEST: plot_data_plane_EaSM_CMIP5_rcp85
+ - pass - 0.752 sec
+TEST: plot_data_plane_EaSM_CMIP5_rcp85_time_slice
+ - pass - 0.76 sec
+TEST: plot_data_plane_EaSM_CESM
+ - pass - 0.771 sec
+TEST: plot_data_plane_GRIB2_NBM_CWASP_L0
+ - pass - 3.072 sec
+TEST: plot_data_plane_GRIB2_NBM_CWASP_PERC_5
+ - pass - 3.146 sec
+TEST: plot_data_plane_GRIB2_NBM_CWASP_PROB_50
+ - pass - 2.262 sec
+TEST: plot_data_plane_GRIB2_NBM_WETBT_MIXED_LEVELS
+ - pass - 3.377 sec
+TEST: plot_data_plane_GRIB2_NBM_FICEAC_A48_PERC_10
+ - pass - 2.102 sec
+TEST: plot_data_plane_LAEA_GRIB2
+ - pass - 1.631 sec
+TEST: plot_data_plane_LAEA_NCCF
+ - pass - 1.595 sec
+TEST: plot_data_plane_LAEA_MET_NC
+ - pass - 1.634 sec
+TEST: plot_data_plane_NCCF_POLAR_STEREO
+ - pass - 1.747 sec
+TEST: plot_data_plane_NCCF_POLAR_ELLIPSOIDAL
+ - pass - 0.719 sec
+TEST: plot_data_plane_GRIB2_TABLE_4.48
+ - pass - 1.514 sec
+TEST: plot_data_plane_WRF_west_east_stag
+ - pass - 0.864 sec
+TEST: plot_data_plane_WRF_south_north_stag
+ - pass - 0.863 sec
+TEST: plot_data_plane_WRF_num_press_levels_stag
+ - pass - 0.761 sec
+TEST: plot_data_plane_WRF_num_z_levels_stag
+ - pass - 0.741 sec
+TEST: plot_data_plane_WRF_bottom_top
+ - pass - 0.866 sec
+TEST: plot_data_plane_WRF_bottom_top_stag
+ - pass - 0.852 sec
+TEST: plot_data_plane_set_attr_grid
+ - pass - 14.222 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_wwmca_plot.xml
+
+TEST: wwmca_plot_NH_SH_AGE_240
+ - pass - 2.607 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_series_analysis.xml
+
+TEST: series_analysis_CMD_LINE
+ - pass - 8.969 sec
+TEST: series_analysis_AGGR_CMD_LINE
+ - pass - 10.585 sec
+TEST: series_analysis_FILE_LIST
+ - pass - 6.317 sec
+TEST: series_analysis_AGGR_FILE_LIST
+ - pass - 7.913 sec
+TEST: series_analysis_UPPER_AIR
+ - pass - 3.876 sec
+TEST: series_analysis_CONDITIONAL
+ - pass - 3.963 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_tc_dland.xml
+
+TEST: tc_dland_ONE_DEG
+ - pass - 17.215 sec
+TEST: tc_dland_HALF_DEG
+ - pass - 65.738 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_tc_pairs.xml
+
+TEST: tc_pairs_ALAL2010
+ - pass - 2.412 sec
+TEST: tc_pairs_CONSENSUS
+ - pass - 5.688 sec
+TEST: tc_pairs_INTERP12_FILL
+ - pass - 0.923 sec
+TEST: tc_pairs_INTERP12_REPLACE
+ - pass - 0.938 sec
+TEST: tc_pairs_PROBRIRW
+ - pass - 2.656 sec
+TEST: tc_pairs_BASIN_MAP
+ - pass - 2.661 sec
+TEST: tc_pairs_LEAD_REQ
+ - pass - 1.023 sec
+TEST: tc_pairs_WRITE_VALID
+ - pass - 0.741 sec
+TEST: tc_pairs_WRITE_VALID_PROBRIRW
+ - pass - 2.105 sec
+TEST: tc_pairs_DIAGNOSTICS
+ - pass - 0.932 sec
+TEST: tc_pairs_DIAGNOSTICS_CONSENSUS
+ - pass - 5.124 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_tc_stat.xml
+
+TEST: tc_stat_ALAL2010
+ - pass - 24.263 sec
+TEST: tc_stat_FILTER_STRINGS
+ - pass - 2.475 sec
+TEST: tc_stat_PROBRIRW
+ - pass - 40.831 sec
+TEST: tc_stat_LEAD_REQ
+ - pass - 1.483 sec
+TEST: tc_stat_FALSE_ALARMS
+ - pass - 2.438 sec
+TEST: tc_stat_DIAGNOSTICS
+ - pass - 7.112 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_plot_tc.xml
+
+TEST: plot_tc_TCMPR
+ - pass - 9.155 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_tc_rmw.xml
+
+TEST: tc_rmw_PRESSURE_LEV_OUT
+ - pass - 39.751 sec
+TEST: tc_rmw_GONZALO
+ - pass - 9.403 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_rmw_analysis.xml
+
+TEST: rmw_analysis
+ - pass - 1.61 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_tc_diag.xml
+
+TEST: tc_diag_IAN
+ - pass - 117.499 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_tc_gen.xml
+
+TEST: tc_gen_2016
+ - pass - 94.491 sec
+TEST: tc_gen_prob
+ - pass - 1.05 sec
+TEST: tc_gen_2021_shape
+ - pass - 9.322 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_met_test_scripts.xml
+
+TEST: test_all_gen_vx_mask_1
+ - pass - 1.263 sec
+TEST: test_all_gen_vx_mask_2
+ - pass - 1.054 sec
+TEST: test_all_gen_ens_prod
+ - pass - 1.72 sec
+TEST: test_all_pcp_combine_1
+ - pass - 1.855 sec
+TEST: test_all_pcp_combine_2
+ - pass - 3.97 sec
+TEST: test_all_pcp_combine_3
+ - pass - 5.307 sec
+TEST: test_all_pcp_combine_4
+ - pass - 1.066 sec
+TEST: test_all_pcp_combine_5
+ - pass - 1.075 sec
+TEST: test_all_pcp_combine_6
+ - pass - 1.563 sec
+TEST: test_all_mode_1
+ - pass - 2.505 sec
+TEST: test_all_mode_2
+ - pass - 2.463 sec
+TEST: test_all_mode_3
+ - pass - 3.169 sec
+TEST: test_all_grid_stat_1
+ - pass - 2.189 sec
+TEST: test_all_grid_stat_2
+ - pass - 0.646 sec
+TEST: test_all_grid_stat_3
+ - pass - 1.26 sec
+TEST: test_all_grid_stat_4
+ - pass - 8.559 sec
+TEST: test_all_pb2nc
+ - pass - 3.645 sec
+TEST: test_all_plot_point_obs
+ - pass - 5.294 sec
+TEST: test_all_ascii2nc_1
+ - pass - 0.599 sec
+TEST: test_all_ascii2nc_2
+ - pass - 0.715 sec
+TEST: test_all_madis2nc
+ - pass - 1.521 sec
+TEST: test_all_point_stat
+ - pass - 72.135 sec
+TEST: test_all_wavelet_stat_1
+ - pass - 4.892 sec
+TEST: test_all_wavelet_stat_2
+ - pass - 2.751 sec
+TEST: test_all_ensemble_stat
+ - pass - 9.129 sec
+TEST: test_all_stat_analysis
+ - pass - 15.05 sec
+TEST: test_all_mode_analysis_1
+ - pass - 0.713 sec
+TEST: test_all_mode_analysis_2
+ - pass - 0.561 sec
+TEST: test_all_mode_analysis_3
+ - pass - 0.574 sec
+TEST: test_all_plot_data_plane_1
+ - pass - 1.109 sec
+TEST: test_all_plot_data_plane_2
+ - pass - 0.662 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_modis.xml
+
+TEST: modis_regrid_SURFACE_TEMPERATURE
+ - pass - 3.171 sec
+TEST: modis_regrid_CLOUD_FRACTION
+ - pass - 2.371 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_ref_config_lead_00.xml
+
+TEST: gen_vx_mask
+ - pass - 2.464 sec
+TEST: pb2nc_ndas_lead_00
+ - pass - 8.045 sec
+TEST: point_stat_lead_00_upper_air_AFWAv3.4_Noahv2.7.1
+ - pass - 48.708 sec
+TEST: point_stat_lead_00_surface_AFWAv3.4_Noahv2.7.1
+ - pass - 24.294 sec
+TEST: point_stat_lead_00_winds_AFWAv3.4_Noahv2.7.1
+ - pass - 56.158 sec
+TEST: point_stat_lead_00_upper_air_AFWAv3.4_Noahv3.3
+ - pass - 48.776 sec
+TEST: point_stat_lead_00_surface_AFWAv3.4_Noahv3.3
+ - pass - 24.526 sec
+TEST: point_stat_lead_00_winds_AFWAv3.4_Noahv3.3
+ - pass - 56.448 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_ref_config_lead_12.xml
+
+TEST: gen_vx_mask
+ - pass - 2.225 sec
+TEST: pb2nc_ndas_lead_12
+ - pass - 8.146 sec
+TEST: pcp_combine_ST2ml_3hr_09_12
+ - pass - 0.909 sec
+TEST: pcp_combine_wrf_3hr_09_12
+ - pass - 1.143 sec
+TEST: point_stat_lead_12_upper_air_AFWAv3.4_Noahv2.7.1
+ - pass - 48.863 sec
+TEST: point_stat_lead_12_surface_AFWAv3.4_Noahv2.7.1
+ - pass - 25.401 sec
+TEST: point_stat_lead_12_winds_AFWAv3.4_Noahv2.7.1
+ - pass - 55.69 sec
+TEST: point_stat_lead_12_upper_air_AFWAv3.4_Noahv3.3
+ - pass - 48.919 sec
+TEST: point_stat_lead_12_surface_AFWAv3.4_Noahv3.3
+ - pass - 25.006 sec
+TEST: point_stat_lead_12_winds_AFWAv3.4_Noahv3.3
+ - pass - 55.808 sec
+TEST: grid_stat_3hr_accum_time_12
+ - pass - 0.883 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_ref_config_lead_24.xml
+
+TEST: gen_vx_mask
+ - pass - 2.181 sec
+TEST: pb2nc_ndas_lead_24
+ - pass - 7.926 sec
+TEST: pcp_combine_ST2ml_3hr_21_24
+ - pass - 0.76 sec
+TEST: pcp_combine_wrf_3hr_21_24
+ - pass - 1.115 sec
+TEST: point_stat_lead_24_upper_air_AFWAv3.4_Noahv2.7.1
+ - pass - 47.982 sec
+TEST: point_stat_lead_24_surface_AFWAv3.4_Noahv2.7.1
+ - pass - 23.972 sec
+TEST: point_stat_lead_24_winds_AFWAv3.4_Noahv2.7.1
+ - pass - 54.219 sec
+TEST: point_stat_lead_24_upper_air_AFWAv3.4_Noahv3.3
+ - pass - 48.24 sec
+TEST: point_stat_lead_24_surface_AFWAv3.4_Noahv3.3
+ - pass - 24.114 sec
+TEST: point_stat_lead_24_winds_AFWAv3.4_Noahv3.3
+ - pass - 54.602 sec
+TEST: grid_stat_3hr_accum_time_24
+ - pass - 0.892 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_ref_config_lead_36.xml
+
+TEST: gen_vx_mask
+ - pass - 2.186 sec
+TEST: pb2nc_ndas_lead_36
+ - pass - 8.025 sec
+TEST: pcp_combine_ST2ml_3hr_33_36
+ - pass - 0.697 sec
+TEST: pcp_combine_ST2ml_24hr_12_36
+ - pass - 0.596 sec
+TEST: pcp_combine_wrf_3hr_33_36
+ - pass - 1.092 sec
+TEST: pcp_combine_wrf_24hr_12_36
+ - pass - 1.108 sec
+TEST: point_stat_lead_36_upper_air_AFWAv3.4_Noahv2.7.1
+ - pass - 48.391 sec
+TEST: point_stat_lead_36_surface_AFWAv3.4_Noahv2.7.1
+ - pass - 24.7 sec
+TEST: point_stat_lead_36_winds_AFWAv3.4_Noahv2.7.1
+ - pass - 54.79 sec
+TEST: point_stat_lead_36_upper_air_AFWAv3.4_Noahv3.3
+ - pass - 48.341 sec
+TEST: point_stat_lead_36_surface_AFWAv3.4_Noahv3.3
+ - pass - 24.723 sec
+TEST: point_stat_lead_36_winds_AFWAv3.4_Noahv3.3
+ - pass - 54.725 sec
+TEST: grid_stat_3hr_accum_time_36
+ - pass - 0.917 sec
+TEST: grid_stat_24hr_accum_time_36
+ - pass - 0.896 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_ref_config_lead_48.xml
+
+TEST: gen_vx_mask
+ - pass - 2.193 sec
+TEST: pb2nc_ndas_lead_48
+ - pass - 8.014 sec
+TEST: pcp_combine_ST2ml_3hr_45_48
+ - pass - 0.72 sec
+TEST: pcp_combine_wrf_3hr_45_48
+ - pass - 1.101 sec
+TEST: point_stat_lead_48_upper_air_AFWAv3.4_Noahv2.7.1
+ - pass - 48.027 sec
+TEST: point_stat_lead_48_surface_AFWAv3.4_Noahv2.7.1
+ - pass - 24.714 sec
+TEST: point_stat_lead_48_winds_AFWAv3.4_Noahv2.7.1
+ - pass - 54.824 sec
+TEST: point_stat_lead_48_upper_air_AFWAv3.4_Noahv3.3
+ - pass - 48.048 sec
+TEST: point_stat_lead_48_surface_AFWAv3.4_Noahv3.3
+ - pass - 24.41 sec
+TEST: point_stat_lead_48_winds_AFWAv3.4_Noahv3.3
+ - pass - 55.39 sec
+TEST: grid_stat_3hr_accum_time_48
+ - pass - 0.893 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_ref_config.xml
+
+TEST: stat_analysis_GO_Index
+ - pass - 1.468 sec
+TEST: stat_analysis_GO_Index_out_stat
+ - pass - 1.179 sec
+TEST: stat_analysis_SFC_SS_Index_out
+ - pass - 0.874 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_mode_graphics.xml
+
+TEST: mode_graphics_PLOT_MULTIPLE
+ - pass - 63.828 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_regrid.xml
+
+TEST: regrid_grid_stat_ST4_TO_HMT
+ - pass - 1.052 sec
+TEST: regrid_grid_stat_HMT_TO_ST4
+ - pass - 8.112 sec
+TEST: regrid_grid_stat_BOTH_TO_DTC165
+ - pass - 1.594 sec
+TEST: regrid_grid_stat_BOTH_TO_NAM
+ - pass - 5.106 sec
+TEST: regrid_grid_stat_BOTH_TO_HMT_D02
+ - pass - 1.577 sec
+TEST: regrid_data_plane_GFS_TO_HMT_NEAREST
+ - pass - 2.858 sec
+TEST: regrid_data_plane_GFS_ROTLATLON_GRID_SPEC
+ - pass - 2.465 sec
+TEST: regrid_data_plane_GFS_TO_HMT_BILIN
+ - pass - 2.782 sec
+TEST: regrid_data_plane_GFS_TO_HMT_BUDGET
+ - pass - 2.539 sec
+TEST: regrid_data_plane_GFS_TO_HMT_MIN_3
+ - pass - 3.824 sec
+TEST: regrid_data_plane_GFS_TO_HMT_MAX_3
+ - pass - 3.887 sec
+TEST: regrid_data_plane_GFS_TO_HMT_UW_MEAN_3
+ - pass - 3.837 sec
+TEST: regrid_data_plane_GFS_TO_HMT_UW_MEAN_9
+ - pass - 19.083 sec
+TEST: regrid_data_plane_GFS_TO_HMT_DW_MEAN_3
+ - pass - 3.94 sec
+TEST: regrid_data_plane_HRRR_MAXGAUSS
+ - pass - 4.686 sec
+TEST: regrid_data_plane_GFS_TO_HMT_MEDIAN_3
+ - pass - 3.921 sec
+TEST: regrid_data_plane_GFS_TO_HMT_LS_FIT_3
+ - pass - 3.982 sec
+TEST: regrid_data_plane_GFS_TO_HMT_MAX_5_SQUARE
+ - pass - 1.92 sec
+TEST: regrid_data_plane_GFS_TO_G212_CONVERT_CENSOR
+ - pass - 0.893 sec
+TEST: regrid_data_plane_WRAP_LON
+ - pass - 1.438 sec
+TEST: regrid_data_plane_NC_ROT_LAT_LON
+ - pass - 2.385 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_gsi_tools.xml
+
+TEST: gsid2mpr_CONV
+ - pass - 2.161 sec
+TEST: gsid2mpr_DUP
+ - pass - 1.27 sec
+TEST: gsid2mpr_RAD
+ - pass - 2.469 sec
+TEST: gsidens2orank_CONV_NO_MEAN
+ - pass - 5.607 sec
+TEST: gsidens2orank_CONV_ENS_MEAN
+ - pass - 4.809 sec
+TEST: gsidens2orank_RAD
+ - pass - 4.108 sec
+TEST: gsidens2orank_RAD_CHANNEL
+ - pass - 1.14 sec
+TEST: stat_analysis_MPR_TO_CNT
+ - pass - 2.631 sec
+TEST: stat_analysis_ORANK_TO_RHIST
+ - pass - 23.803 sec
+TEST: stat_analysis_ORANK_TO_SSVAR
+ - pass - 23.779 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_aeronet.xml
+
+TEST: ascii2nc_AERONET_daily
+ - pass - 0.814 sec
+TEST: ascii2nc_AERONET_v3_daily
+ - pass - 0.537 sec
+TEST: ascii2nc_AERONET_v3_concat
+ - pass - 0.574 sec
+TEST: ascii2nc_AERONET_vld_thresh
+ - pass - 0.545 sec
+TEST: ascii2nc_AERONET_monthly
+ - pass - 0.698 sec
+TEST: point_stat_GRIB2_f18_NGAC_AERONET_daily
+ - pass - 0.59 sec
+TEST: point_stat_GRIB2_f18_NGAC_AERONET_monthly
+ - pass - 0.639 sec
+TEST: point_stat_GRIB2_f21_NGAC_AERONET_daily
+ - pass - 0.595 sec
+TEST: point_stat_GRIB2_f21_NGAC_AERONET_monthly
+ - pass - 0.639 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_shift_data_plane.xml
+
+TEST: shift_data_plane_GRIB1
+ - pass - 4.387 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_mtd.xml
+
+TEST: mtd_basic
+ - pass - 45.285 sec
+TEST: mtd_conv_time
+ - pass - 47.593 sec
+TEST: mtd_single
+ - pass - 11.058 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_climatology_1.0deg.xml
+
+TEST: climatology_POINT_STAT_GFS_1.0DEG
+ - pass - 128.342 sec
+TEST: climatology_POINT_STAT_GFS_1.0DEG_CLIMO_PREV_MONTH
+ - pass - 127.347 sec
+TEST: climatology_POINT_STAT_PROB_GFS_1.0DEG
+ - pass - 11.152 sec
+TEST: climatology_GRID_STAT_PROB_GFS_1.0DEG
+ - pass - 8.402 sec
+TEST: climatology_STAT_ANALYSIS_1.0DEG
+ - pass - 3.124 sec
+TEST: climatology_SERIES_ANALYSIS_1.0DEG
+ - pass - 168.005 sec
+TEST: climatology_SERIES_ANALYSIS_1.0DEG_CONST_CLIMO
+ - pass - 49.084 sec
+TEST: climatology_SERIES_ANALYSIS_1.0DEG_AGGR
+ - pass - 215.56 sec
+TEST: climatology_SERIES_ANALYSIS_PROB_1.0DEG
+ - pass - 20.95 sec
+TEST: climatology_SERIES_ANALYSIS_PROB_1.0DEG_AGGR
+ - pass - 24.843 sec
+TEST: climatology_ENSEMBLE_STAT_1.0DEG
+ - pass - 31.429 sec
+TEST: climatology_ENSEMBLE_STAT_1.0DEG_ONE_CDF_BIN
+ - pass - 11.051 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_climatology_1.5deg.xml
+
+TEST: climatology_POINT_STAT_WMO_1.5DEG
+ - pass - 245.695 sec
+TEST: climatology_STAT_ANALYSIS_WMO_1.5DEG_MPR_AGG_STAT
+ - pass - 0.741 sec
+TEST: climatology_STAT_ANALYSIS_WMO_1.5DEG_VAL1L2_AGG_STAT
+ - pass - 0.607 sec
+TEST: climatology_STAT_ANALYSIS_WMO_1.5DEG_FILTER
+ - pass - 0.758 sec
+TEST: climatology_GRID_STAT_WMO_1.5DEG
+ - pass - 253.773 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_climatology_2.5deg.xml
+
+TEST: climatology_POINT_STAT_GFS_2.5DEG
+ - pass - 207.139 sec
+TEST: climatology_GRID_STAT_WRAP_YEAR_2.5DEG
+ - pass - 126.605 sec
+TEST: climatology_GRID_STAT_SINGLE_MONTH_2.5DEG
+ - pass - 64.927 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_climatology_mixed.xml
+
+TEST: climatology_GRID_STAT_FCST_NCEP_1.0DEG_OBS_WMO_1.5DEG
+ - pass - 72.612 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_grib_tables.xml
+
+TEST: GRIB1_um_dcf
+ - pass - 2.76 sec
+TEST: GRIB2_um_raw
+ - pass - 2.366 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_grid_weight.xml
+
+TEST: grid_weight_GRID_STAT_NONE
+ - pass - 6.082 sec
+TEST: grid_weight_GRID_STAT_COS_LAT
+ - pass - 6.075 sec
+TEST: grid_weight_GRID_STAT_AREA
+ - pass - 6.081 sec
+TEST: grid_weight_ENSEMBLE_STAT_NONE
+ - pass - 2.327 sec
+TEST: grid_weight_ENSEMBLE_STAT_COS_LAT
+ - pass - 2.287 sec
+TEST: grid_weight_ENSEMBLE_STAT_AREA
+ - pass - 2.291 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_netcdf.xml
+
+TEST: ascii2nc_no_compression
+ - pass - 16.393 sec
+TEST: ascii2nc_compression2_by_config
+ - pass - 16.728 sec
+TEST: ascii2nc_compression3_by_env
+ - pass - 16.411 sec
+TEST: ascii2nc_compression4_by_argument
+ - pass - 16.483 sec
+TEST: 365_days
+ - pass - 1.913 sec
+TEST: netcdf_1byte_time
+ - pass - 0.934 sec
+TEST: netcdf_months_units
+ - pass - 0.653 sec
+TEST: netcdf_months_units_from_day2
+ - pass - 0.535 sec
+TEST: netcdf_months_units_to_next_month
+ - pass - 0.537 sec
+TEST: netcdf_years_units
+ - pass - 0.535 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_hira.xml
+
+WARNING: unable to read test_dir from /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_hira.xml
+TEST: point_stat_NCMET_NAM_HMTGAGE_HIRA
+ - pass - 10.392 sec
+TEST: point_stat_HIRA_EMPTY_PROB_CAT_THRESH
+ - pass - 9.472 sec
+TEST: stat_analysis_CONFIG_HIRA
+ - pass - 4.317 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_interp_shape.xml
+
+TEST: grid_stat_INTERP_SQUARE
+ - pass - 6.366 sec
+TEST: grid_stat_INTERP_CIRCLE
+ - pass - 5.351 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_lidar2nc.xml
+
+TEST: lidar2nc_CALIPSO
+ - pass - 1.126 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_ioda2nc.xml
+
+TEST: ioda2nc_mask_sid_list
+ - pass - 1.612 sec
+TEST: ioda2nc_var_all
+ - pass - 0.549 sec
+TEST: ioda2nc_summary
+ - pass - 0.566 sec
+TEST: ioda2nc_same_input
+ - pass - 0.565 sec
+TEST: ioda2nc_int_datetime
+ - pass - 0.575 sec
+TEST: ioda2nc_v2_string_sid
+ - pass - 0.576 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_airnow.xml
+
+TEST: pb2nc_AIRNOW
+ - pass - 16.993 sec
+TEST: point_stat_GRIB2_AIRNOW
+ - pass - 2.994 sec
+
+CALLING: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/xml/unit_python.xml
+
+TEST: python_numpy_grid_name
+ - pass - 1.728 sec
+TEST: python_numpy_grid_string
+ - pass - 1.147 sec
+TEST: python_numpy_grid_data_file
+ - pass - 1.163 sec
+TEST: python_numpy_plot_data_plane
+ - pass - 1.221 sec
+TEST: python_xarray_plot_data_plane
+ - pass - 1.193 sec
+TEST: python_numpy_plot_data_plane_missing
+ - FAIL - 0.533 sec
+export MET_PYTHON_EXE=${MET_TEST_MET_PYTHON_EXE}
+/d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/../../share/met/../../bin/plot_data_plane \
+ PYTHON_NUMPY \
+ /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/../../test_output/python/letter_numpy_0_to_missing.ps \
+ 'name = "/d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/../../share/met/python/examples/read_ascii_numpy.py /d1/projects/MET/MET_test_data/unit_test/python/letter.txt LETTER 0.0";' \
+ -plot_range 0.0 255.0 \
+ -title "Python enabled numpy plot_data_plane" \
+ -v 1
+DEBUG 1: Start plot_data_plane by johnhg(6088) at 2024-10-07 17:45:28Z cmd: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/../../share/met/../../bin/plot_data_plane PYTHON_NUMPY /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/../../test_output/python/letter_numpy_0_to_missing.ps name = "/d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/../../share/met/python/examples/read_ascii_numpy.py /d1/projects/MET/MET_test_data/unit_test/python/letter.txt LETTER 0.0"; -plot_range 0.0 255.0 -title Python enabled numpy plot_data_plane -v 1
+DEBUG 1: Opening data file: PYTHON_NUMPY
+sh: 1: /usr/local/python3/bin/python3: not found
+ERROR :
+ERROR : tmp_nc_dataplane() -> command "${MET_TEST_MET_PYTHON_EXE} /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/../../share/met/python/pyembed/write_tmp_dataplane.py /tmp/tmp_met_data_386958_0 /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/../../share/met/python/examples/read_ascii_numpy /d1/projects/MET/MET_test_data/unit_test/python/letter.txt LETTER 0.0" failed ... status = 32512
+ERROR :
+unset MET_PYTHON_EXE
+
+
+ERROR: /d1/personal/johnhg/MET/MET_development/MET-feature_2887_categorical_weights/internal/test_unit/python/unit.py unit_python.xml failed.
+
+*** UNIT TESTS FAILED ***
+
diff --git a/internal/test_unit/xml/unit_ascii2nc.xml b/internal/test_unit/xml/unit_ascii2nc.xml
index 4424fd0e33..0b2d242ef7 100644
--- a/internal/test_unit/xml/unit_ascii2nc.xml
+++ b/internal/test_unit/xml/unit_ascii2nc.xml
@@ -44,6 +44,18 @@
+
+ &MET_BIN;/ascii2nc
+ 1
+ \
+ &DATA_DIR_OBS;/gauge/2012041012.badfile.ascii \
+ &OUTPUT_DIR;/ascii2nc/gauge_2012041012_24hr.nc \
+ -v 1
+
+
+
+
&MET_BIN;/ascii2nc
\
diff --git a/internal/test_unit/xml/unit_climatology_1.0deg.xml b/internal/test_unit/xml/unit_climatology_1.0deg.xml
index a07d47ff6e..699026825e 100644
--- a/internal/test_unit/xml/unit_climatology_1.0deg.xml
+++ b/internal/test_unit/xml/unit_climatology_1.0deg.xml
@@ -154,20 +154,18 @@
&OUTPUT_DIR;/climatology_1.0deg/stat_analysis_MPR_to_PSTD.stat
-
+--!>
&MET_BIN;/series_analysis
CLIMO_MEAN_FILE_LIST
"&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cmean_1d.19590409",
- "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cmean_1d.19590410",
- "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cmean_1d.19590411"
+ "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cmean_1d.19590410"
CLIMO_STDEV_FILE_LIST
"&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cstdv_1d.19590409",
- "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cstdv_1d.19590410",
- "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cstdv_1d.19590411"
+ "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cstdv_1d.19590410"
@@ -175,11 +173,9 @@
-fcst &DATA_DIR_MODEL;/grib2/gfs/gfs_2012040900_F012.grib2 \
&DATA_DIR_MODEL;/grib2/gfs/gfs_2012040900_F024.grib2 \
&DATA_DIR_MODEL;/grib2/gfs/gfs_2012040900_F036.grib2 \
- &DATA_DIR_MODEL;/grib2/gfs/gfs_2012040900_F048.grib2 \
-obs &DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120409_1200_000.grb2 \
&DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120410_0000_000.grb2 \
&DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120410_1200_000.grb2 \
- &DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120411_0000_000.grb2 \
-paired \
-out &OUTPUT_DIR;/climatology_1.0deg/series_analysis_GFS_CLIMO_1.0DEG.nc \
-config &CONFIG_DIR;/SeriesAnalysisConfig_climo \
@@ -190,25 +186,112 @@
+
+ &MET_BIN;/series_analysis
+
+ 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"
+
+
+
+ \
+ -fcst &DATA_DIR_MODEL;/grib2/gfs/gfs_2012040900_F012.grib2 \
+ &DATA_DIR_MODEL;/grib2/gfs/gfs_2012040900_F024.grib2 \
+ &DATA_DIR_MODEL;/grib2/gfs/gfs_2012040900_F036.grib2 \
+ -obs &DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120409_1200_000.grb2 \
+ &DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120410_0000_000.grb2 \
+ &DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120410_1200_000.grb2 \
+ -out &OUTPUT_DIR;/climatology_1.0deg/series_analysis_GFS_CLIMO_1.0DEG_CONST_CLIMO.nc \
+ -config &CONFIG_DIR;/SeriesAnalysisConfig_const_climo \
+ -v 3
+
+
+
+
+
+ &MET_BIN;/series_analysis
+
+ CLIMO_MEAN_FILE_LIST
+ "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cmean_1d.19590411"
+
+
+ CLIMO_STDEV_FILE_LIST
+ "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cstdv_1d.19590411"
+
+
+
+ \
+ -fcst &DATA_DIR_MODEL;/grib2/gfs/gfs_2012040900_F048.grib2 \
+ -obs &DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120411_0000_000.grb2 \
+ -paired \
+ -aggr &OUTPUT_DIR;/climatology_1.0deg/series_analysis_GFS_CLIMO_1.0DEG.nc \
+ -out &OUTPUT_DIR;/climatology_1.0deg/series_analysis_GFS_CLIMO_1.0DEG_AGGR.nc \
+ -config &CONFIG_DIR;/SeriesAnalysisConfig_climo \
+ -v 2
+
+
+
+
echo "&DATA_DIR_MODEL;/grib2/sref_pr/sref_prob_2012040821_F003.grib2 \
&DATA_DIR_MODEL;/grib2/sref_pr/sref_prob_2012040821_F009.grib2 \
&DATA_DIR_MODEL;/grib2/sref_pr/sref_prob_2012040821_F015.grib2 \
- &DATA_DIR_MODEL;/grib2/sref_pr/sref_prob_2012040821_F021.grib2 \
- &DATA_DIR_MODEL;/grib2/sref_pr/sref_prob_2012040821_F027.grib2 \
- &DATA_DIR_MODEL;/grib2/sref_pr/sref_prob_2012040821_F033.grib2 \
- &DATA_DIR_MODEL;/grib2/sref_pr/sref_prob_2012040821_F039.grib2 \
- &DATA_DIR_MODEL;/grib2/sref_pr/sref_prob_2012040821_F045.grib2" \
- > &OUTPUT_DIR;/climatology_1.0deg/input_fcst_file_list; \
+ &DATA_DIR_MODEL;/grib2/sref_pr/sref_prob_2012040821_F021.grib2" \
+ > &OUTPUT_DIR;/climatology_1.0deg/20120409_fcst_file_list; \
echo "&DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120409_0000_000.grb2 \
&DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120409_0600_000.grb2 \
&DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120409_1200_000.grb2 \
- &DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120409_1800_000.grb2 \
- &DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120410_0000_000.grb2 \
+ &DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120409_1800_000.grb2" \
+ > &OUTPUT_DIR;/climatology_1.0deg/20120409_obs_file_list; \
+ &MET_BIN;/series_analysis
+
+ DAY_INTERVAL 1
+ HOUR_INTERVAL 6
+ CLIMO_MEAN_FILE_LIST
+ "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cmean_1d.19590409",
+ "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cmean_1d.19590410",
+ "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cmean_1d.19590411"
+
+
+ CLIMO_STDEV_FILE_LIST
+ "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cstdv_1d.19590409",
+ "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cstdv_1d.19590410",
+ "&DATA_DIR_CLIMO;/NCEP_NCAR_40YR_1.0deg/cstdv_1d.19590411"
+
+
+
+ \
+ -fcst &OUTPUT_DIR;/climatology_1.0deg/20120409_fcst_file_list \
+ -obs &OUTPUT_DIR;/climatology_1.0deg/20120409_obs_file_list \
+ -paired \
+ -out &OUTPUT_DIR;/climatology_1.0deg/series_analysis_PROB_CLIMO_1.0DEG.nc \
+ -config &CONFIG_DIR;/SeriesAnalysisConfig_climo_prob \
+ -v 2
+
+
+
+
+
+ echo "&DATA_DIR_MODEL;/grib2/sref_pr/sref_prob_2012040821_F027.grib2 \
+ &DATA_DIR_MODEL;/grib2/sref_pr/sref_prob_2012040821_F033.grib2 \
+ &DATA_DIR_MODEL;/grib2/sref_pr/sref_prob_2012040821_F039.grib2 \
+ &DATA_DIR_MODEL;/grib2/sref_pr/sref_prob_2012040821_F045.grib2" \
+ > &OUTPUT_DIR;/climatology_1.0deg/20120410_fcst_file_list; \
+ echo "&DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120410_0000_000.grb2 \
&DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120410_0600_000.grb2 \
&DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120410_1200_000.grb2 \
&DATA_DIR_MODEL;/grib2/gfsanl/gfsanl_4_20120410_1800_000.grb2" \
- > &OUTPUT_DIR;/climatology_1.0deg/input_obs_file_list; \
+ > &OUTPUT_DIR;/climatology_1.0deg/20120410_obs_file_list; \
&MET_BIN;/series_analysis
DAY_INTERVAL 1
@@ -227,15 +310,16 @@
\
- -fcst &OUTPUT_DIR;/climatology_1.0deg/input_fcst_file_list \
- -obs &OUTPUT_DIR;/climatology_1.0deg/input_obs_file_list \
+ -fcst &OUTPUT_DIR;/climatology_1.0deg/20120410_fcst_file_list \
+ -obs &OUTPUT_DIR;/climatology_1.0deg/20120410_obs_file_list \
-paired \
- -out &OUTPUT_DIR;/climatology_1.0deg/series_analysis_PROB_CLIMO_1.0DEG.nc \
+ -aggr &OUTPUT_DIR;/climatology_1.0deg/series_analysis_PROB_CLIMO_1.0DEG.nc \
+ -out &OUTPUT_DIR;/climatology_1.0deg/series_analysis_PROB_CLIMO_1.0DEG_AGGR.nc \
-config &CONFIG_DIR;/SeriesAnalysisConfig_climo_prob \
-v 2
diff --git a/internal/test_unit/xml/unit_climatology_1.5deg.xml b/internal/test_unit/xml/unit_climatology_1.5deg.xml
index cd1a86b353..de22d95673 100644
--- a/internal/test_unit/xml/unit_climatology_1.5deg.xml
+++ b/internal/test_unit/xml/unit_climatology_1.5deg.xml
@@ -54,7 +54,7 @@
\
-lookin &OUTPUT_DIR;/climatology_1.5deg/point_stat_WMO_CLIMO_1.5DEG_120000L_20120409_120000V.stat \
- -job aggregate_stat -line_type MPR -out_line_type CTC -fcst_lev P850 -interp_mthd NEAREST -by FCST_VAR -out_thresh '>CDP90' \
+ -job aggregate_stat -line_type MPR -out_line_type CTC -fcst_lev P850 -interp_mthd NEAREST -by FCST_VAR -out_thresh '>OCDP90' \
-out_stat &OUTPUT_DIR;/climatology_1.5deg/stat_analysis_WMO_1.5DEG_MPR_to_CTC_out.stat
+
+ &MET_BIN;/point2grid
+ \
+ &OUTPUT_DIR;/pb2nc/ndas.20120409.t12z.prepbufr.tm00.nc \
+ G212 \
+ &OUTPUT_DIR;/point2grid/pb2nc_WINDS.nc \
+ -field 'name="UGRD"; level="*";' \
+ -field 'name="VGRD"; level="*";' \
+ -name UWIND,VWIND \
+ -config &CONFIG_DIR;/Point2GridConfig_WINDS \
+ -v 3
+
+
+ &OUTPUT_DIR;/point2grid/pb2nc_WINDS.nc
+
+
+
&MET_BIN;/point2grid
\
@@ -130,14 +147,14 @@
G212 \
&OUTPUT_DIR;/point2grid/point2grid_GOES_16_AOD_TO_G212_compute.nc \
-field 'name="AOD"; level="(*,*)";' \
- -qc 1,2,3 -method MAX \
+ -goes_qc 0,1 -method MAX \
-v 1
&OUTPUT_DIR;/point2grid/point2grid_GOES_16_AOD_TO_G212_compute.nc
-
+
&MET_BIN;/point2grid
@@ -155,7 +172,7 @@
&OUTPUT_DIR;/point2grid/point2grid_GOES_16_AOD_TO_G212_gaussian.nc
-
+
&MET_BIN;/point2grid
@@ -167,14 +184,14 @@
&OUTPUT_DIR;/point2grid/point2grid_GOES_16_ADP.nc \
-field 'name="AOD_Smoke"; level="(*,*)";' \
-adp &DATA_DIR_MODEL;/goes_16/OR_ABI-L2-ADPC-M6_G16_s20192662141196_e20192662143569_c20192662144526.nc \
- -qc 1,2 -method MAX \
+ -goes_qc 0,1 -method MAX \
-v 1
&OUTPUT_DIR;/point2grid/point2grid_GOES_16_ADP.nc
-
+
&MET_BIN;/point2grid
@@ -185,7 +202,7 @@
G212 \
&OUTPUT_DIR;/point2grid/point2grid_GOES_16_AOD_TO_G212_grid_map.nc \
-field 'name="AOD"; level="(*,*)";' \
- -qc 1,2,3 -method MAX \
+ -goes_qc 0,1,2 -method MAX \
-v 1
@@ -205,7 +222,7 @@
G212 \
&OUTPUT_DIR;/point2grid/point2grid_GOES_16_AOD_TO_G212.nc \
-field 'name="AOD"; level="(*,*)";' \
- -qc 1,2,3 -method MAX \
+ -goes_qc 0,1,2 -method MAX \
-v 1
@@ -213,6 +230,25 @@
+
+ &MET_BIN;/point2grid
+
+ MET_TMP_DIR &OUTPUT_DIR;/point2grid
+
+ \
+ &DATA_DIR_MODEL;/goes_16/OR_ABI-L2-AODC-M6_G16_s20241100001171_e20241100003544_c20241100006242.nc \
+ G212 \
+ &OUTPUT_DIR;/point2grid/point2grid_GOES_16_ADP_Enterprise_high.nc \
+ -field 'name="AOD_Smoke"; level="(*,*)";' \
+ -adp &DATA_DIR_MODEL;/goes_16/OR_ABI-L2-ADPC-M6_G16_s20241100001171_e20241100003544_c20241100006361.nc \
+ -goes_qc 0,1 -method MAX \
+ -v 1
+
+
+ &OUTPUT_DIR;/point2grid/point2grid_GOES_16_ADP_Enterprise_high.nc
+
+
+
&MET_BIN;/point2grid
@@ -230,6 +266,77 @@
+
+ &MET_BIN;/point2grid
+
+ MET_TMP_DIR &OUTPUT_DIR;/point2grid
+
+ \
+ &DATA_DIR_OBS;/point_obs/iceh.2018-01-03.c00.small.nc \
+ G171 \
+ &OUTPUT_DIR;/point2grid/point2grid_sea_ice.nc \
+ -field 'name="uvel_d"; level="(0,*,*)";' -field 'name="hi_d"; level="(0,*,*)";' \
+ -v 1
+
+
+ &OUTPUT_DIR;/point2grid/point2grid_sea_ice.nc
+
+
+
+
+ &MET_BIN;/point2grid
+
+ MET_TMP_DIR &OUTPUT_DIR;/point2grid
+
+ \
+ &DATA_DIR_OBS;/point_obs/iceh.2018-01-03.c00.small.nc \
+ G171 \
+ &OUTPUT_DIR;/point2grid/point2grid_sea_ice_snow.nc \
+ -config &CONFIG_DIR;/Point2GridConfig_lat_lon \
+ -field 'name="hs_d_without_att"; level="(0,*,*)";' \
+ -v 1
+
+
+ &OUTPUT_DIR;/point2grid/point2grid_sea_ice_snow.nc
+
+
+
+
+ &MET_BIN;/point2grid
+
+ MET_TMP_DIR &OUTPUT_DIR;/point2grid
+
+ \
+ &DATA_DIR_OBS;/point_obs/rtofs_glo_2ds_f006_ice_coverage.nc \
+ "latlon 720 360 -80. -60. 0.5 0.5" \
+ &OUTPUT_DIR;/point2grid/point2grid_rtofs_ice_coverage.nc \
+ -field 'name="ice_coverage"; level="(0,*,*)";' \
+ -v 1
+
+
+ &OUTPUT_DIR;/point2grid/point2grid_rtofs_ice_coverage.nc
+
+
+
+
+ &MET_BIN;/point2grid
+
+ MET_TMP_DIR &OUTPUT_DIR;/point2grid
+
+ \
+ &DATA_DIR_OBS;/point_obs/gfs.ocean.t00z.6hr_avg.f006_SST.nc \
+ G231 \
+ &OUTPUT_DIR;/point2grid/point2grid_gfs.ocean.SST.nc \
+ -config &CONFIG_DIR;/Point2GridConfig_SST \
+ -field 'name="SST"; level="(0,*,*)";' \
+ -v 1
+
+
+ &OUTPUT_DIR;/point2grid/point2grid_gfs.ocean.SST.nc
+
+
+
+
&MET_BIN;/point2grid
@@ -240,7 +347,7 @@
G212 \
&OUTPUT_DIR;/point2grid/point2grid_GOES_16_AOD_TO_G212_unsigned.nc \
-field 'name="AOD"; level="(*,*)";' \
- -qc 1,2,3 -method MAX \
+ -qc 0,1,2 -method MAX \
-v 1
@@ -264,4 +371,24 @@
&OUTPUT_DIR;/point2grid/point2grid_2D_time_west_bering_sea.nc
+
+
+ &MET_BIN;/point2grid
+
+ MET_TMP_DIR &OUTPUT_DIR;/point2grid
+
+ \
+ &DATA_DIR_MODEL;/cice/iceh.2018-01-03.c00.tlat_tlon.nc \
+ G231 \
+ &OUTPUT_DIR;/point2grid/point2grid_cice_to_G231.nc \
+ -config &CONFIG_DIR;/Point2GridConfig_tlat_tlon \
+ -field 'name="hi_d"; level="(0,*,*)"; set_attr_grid="latlon 1440 1080 -80 -180 0.1 0.1";' \
+ -v 1
+
+
+ &OUTPUT_DIR;/point2grid/point2grid_cice_to_G231.nc
+
+
+
+
diff --git a/internal/test_unit/xml/unit_point_stat.xml b/internal/test_unit/xml/unit_point_stat.xml
index b57d756a14..8e798e03ec 100644
--- a/internal/test_unit/xml/unit_point_stat.xml
+++ b/internal/test_unit/xml/unit_point_stat.xml
@@ -18,6 +18,8 @@
+ &TEST_DIR;
+ true
&MET_BIN;/point_stat
@@ -70,6 +72,26 @@
+
+ &MET_BIN;/point_stat
+
+ BEG_DS -300
+ END_DS 300
+ OUTPUT_PREFIX GRIB1_NAM_GDAS_MPR_OBTYPE
+ CONFIG_DIR &CONFIG_DIR;
+ CLIMO_FILE "&DATA_DIR_MODEL;/grib1/gfs/gfs_2012040900_F012_gNam.grib"
+
+ \
+ &DATA_DIR_MODEL;/grib1/nam/nam_2012040900_F012.grib \
+ &OUTPUT_DIR;/pb2nc/gdas1.20120409.t12z.prepbufr.nc \
+ &CONFIG_DIR;/PointStatConfig_MPR_OBTYPE \
+ -outdir &OUTPUT_DIR;/point_stat -v 1
+
+
+ &OUTPUT_DIR;/point_stat/point_stat_GRIB1_NAM_GDAS_MPR_OBTYPE_120000L_20120409_120000V.stat
+
+
+
&MET_BIN;/point_stat
@@ -166,8 +188,6 @@
FCST_FIELD_NAME APCP
FCST_FIELD_LEVEL A3
OBS_DICT fcst
- SEEPS_FLAG NONE
- SEEPS_P1_THRESH NA
OUTPUT_PREFIX GRIB1_NAM_TRMM
\
@@ -194,8 +214,6 @@
FCST_FIELD_NAME APCP
FCST_FIELD_LEVEL A3
OBS_DICT fcst
- SEEPS_FLAG NONE
- SEEPS_P1_THRESH NA
OUTPUT_PREFIX GRIB2_SREF_TRMM
\
@@ -222,8 +240,6 @@
FCST_FIELD_NAME APCP_24
FCST_FIELD_LEVEL (*,*)
OBS_DICT { field = [ { name = "APCP"; level = "A24"; } ]; }
- SEEPS_FLAG NONE
- SEEPS_P1_THRESH NA
OUTPUT_PREFIX NCMET_NAM_HMTGAGE
\
@@ -250,14 +266,14 @@
FCST_FIELD_NAME APCP_24
FCST_FIELD_LEVEL (*,*)
OBS_DICT { field = [ { name = "TP24"; level = "L0"; is_precipitation = TRUE; } ]; }
- SEEPS_FLAG BOTH
SEEPS_P1_THRESH ge0.1&&le0.85
+ SEEPS_POINT_CLIMO_NAME
OUTPUT_PREFIX NCMET_NAM_NDAS_SEEPS
\
&DATA_DIR_MODEL;/met_nc/nam/nam_2012040900_F036_APCP24.nc \
&OUTPUT_DIR;/pb2nc/ndas.20120410.t12z.prepbufr.tm00.nc \
- &CONFIG_DIR;/PointStatConfig_APCP \
+ &CONFIG_DIR;/PointStatConfig_SEEPS \
-outdir &OUTPUT_DIR;/point_stat -v 1
diff --git a/internal/test_unit/xml/unit_point_weight.xml b/internal/test_unit/xml/unit_point_weight.xml
new file mode 100644
index 0000000000..b034b54a3a
--- /dev/null
+++ b/internal/test_unit/xml/unit_point_weight.xml
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+]>
+
+
+
+
+
+ &TEST_DIR;
+ true
+
+
+ &MET_BIN;/point_stat
+
+ OUTPUT_PREFIX NO_WEIGHT
+ DESC NO_WEIGHT
+ POINT_WEIGHT NONE
+ CONFIG_DIR &CONFIG_DIR;
+
+ \
+ &DATA_DIR_MODEL;/grib2/sref_mn/sref_mean_2012040821_F015.grib2 \
+ &OUTPUT_DIR;/pb2nc/gdas1.20120409.t12z.prepbufr.nc \
+ &CONFIG_DIR;/PointStatConfig_point_weight \
+ -outdir &OUTPUT_DIR;/point_weight -v 1
+
+
+ &OUTPUT_DIR;/point_weight/point_stat_NO_WEIGHT_150000L_20120409_120000V.stat
+
+
+
+
+ &MET_BIN;/point_stat
+
+ OUTPUT_PREFIX SID_WEIGHT
+ DESC SID_WEIGHT
+ POINT_WEIGHT SID
+ CONFIG_DIR &CONFIG_DIR;
+
+ \
+ &DATA_DIR_MODEL;/grib2/sref_mn/sref_mean_2012040821_F015.grib2 \
+ &OUTPUT_DIR;/pb2nc/gdas1.20120409.t12z.prepbufr.nc \
+ &CONFIG_DIR;/PointStatConfig_point_weight \
+ -outdir &OUTPUT_DIR;/point_weight -v 1
+
+
+ &OUTPUT_DIR;/point_weight/point_stat_SID_WEIGHT_150000L_20120409_120000V.stat
+
+
+
+
+ &MET_BIN;/point_stat
+
+ OUTPUT_PREFIX PROB_NO_WEIGHT
+ DESC NO_WEIGHT
+ POINT_WEIGHT NONE
+ CONFIG_DIR &CONFIG_DIR;
+
+ \
+ &DATA_DIR_MODEL;/grib2/sref_pr/sref_prob_2012040821_F015.grib2 \
+ &OUTPUT_DIR;/pb2nc/gdas1.20120409.t12z.prepbufr.nc \
+ &CONFIG_DIR;/PointStatConfig_prob_point_weight \
+ -outdir &OUTPUT_DIR;/point_weight -v 1
+
+
+ &OUTPUT_DIR;/point_weight/point_stat_PROB_NO_WEIGHT_150000L_20120409_120000V.stat
+
+
+
+
+ &MET_BIN;/point_stat
+
+ OUTPUT_PREFIX PROB_SID_WEIGHT
+ DESC SID_WEIGHT
+ POINT_WEIGHT SID
+ CONFIG_DIR &CONFIG_DIR;
+
+ \
+ &DATA_DIR_MODEL;/grib2/sref_pr/sref_prob_2012040821_F015.grib2 \
+ &OUTPUT_DIR;/pb2nc/gdas1.20120409.t12z.prepbufr.nc \
+ &CONFIG_DIR;/PointStatConfig_prob_point_weight \
+ -outdir &OUTPUT_DIR;/point_weight -v 1
+
+
+ &OUTPUT_DIR;/point_weight/point_stat_PROB_SID_WEIGHT_150000L_20120409_120000V.stat
+
+
+
+
+ &MET_BIN;/ensemble_stat
+
+ OUTPUT_PREFIX NO_WEIGHT
+ DESC NO_WEIGHT
+ POINT_WEIGHT NONE
+ CONFIG_DIR &CONFIG_DIR;
+
+ \
+ 6 \
+ &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 \
+ &CONFIG_DIR;/EnsembleStatConfig_point_weight \
+ -point_obs &OUTPUT_DIR;/ascii2nc/gauge_2012041012_24hr.nc \
+ -outdir &OUTPUT_DIR;/point_weight -v 1
+
+
+ &OUTPUT_DIR;/point_weight/ensemble_stat_NO_WEIGHT_20120410_120000V.stat
+
+
+
+
+ &MET_BIN;/ensemble_stat
+
+ OUTPUT_PREFIX SID_WEIGHT
+ DESC SID_WEIGHT
+ POINT_WEIGHT SID
+ CONFIG_DIR &CONFIG_DIR;
+
+ \
+ 6 \
+ &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 \
+ &CONFIG_DIR;/EnsembleStatConfig_point_weight \
+ -point_obs &OUTPUT_DIR;/ascii2nc/gauge_2012041012_24hr.nc \
+ -outdir &OUTPUT_DIR;/point_weight -v 1
+
+
+ &OUTPUT_DIR;/point_weight/ensemble_stat_SID_WEIGHT_20120410_120000V.stat
+
+
+
+
+
diff --git a/internal/test_unit/xml/unit_python.xml b/internal/test_unit/xml/unit_python.xml
index af782db022..3bf4c6521f 100644
--- a/internal/test_unit/xml/unit_python.xml
+++ b/internal/test_unit/xml/unit_python.xml
@@ -162,9 +162,9 @@
&OUTPUT_DIR;/python/mode_python_mixed_300000L_20120410_180000V_060000A.ps
- &OUTPUT_DIR;/python/mode_python_mixed_300000L_20120410_180000V_060000A_cts.txt
- &OUTPUT_DIR;/python/mode_python_mixed_300000L_20120410_180000V_060000A_obj.txt
- &OUTPUT_DIR;/python/mode_python_mixed_300000L_20120410_180000V_060000A_obj.nc
+ &OUTPUT_DIR;/python/mode_python_mixed_300000L_20120410_180000V_060000A_cts.txt
+ &OUTPUT_DIR;/python/mode_python_mixed_300000L_20120410_180000V_060000A_obj.txt
+ &OUTPUT_DIR;/python/mode_python_mixed_300000L_20120410_180000V_060000A_obj.nc
@@ -182,9 +182,9 @@
&OUTPUT_DIR;/python/mode_python_120000L_20050807_120000V_120000A.ps
- &OUTPUT_DIR;/python/mode_python_120000L_20050807_120000V_120000A_obj.txt
- &OUTPUT_DIR;/python/mode_python_120000L_20050807_120000V_120000A_cts.txt
- &OUTPUT_DIR;/python/mode_python_120000L_20050807_120000V_120000A_obj.nc
+ &OUTPUT_DIR;/python/mode_python_120000L_20050807_120000V_120000A_obj.txt
+ &OUTPUT_DIR;/python/mode_python_120000L_20050807_120000V_120000A_cts.txt
+ &OUTPUT_DIR;/python/mode_python_120000L_20050807_120000V_120000A_obj.nc
@@ -200,8 +200,7 @@
-outdir &OUTPUT_DIR;/python -v 1
- &OUTPUT_DIR;/python/grid_stat_python_mixed_120000L_20120409_120000V.stat
- &OUTPUT_DIR;/python/grid_stat_python_mixed_120000L_20120409_120000V_pairs.nc
+ &OUTPUT_DIR;/python/grid_stat_python_mixed_120000L_20120409_120000V_pairs.nc
@@ -218,7 +217,7 @@
-outdir &OUTPUT_DIR;/python -v 1
- &OUTPUT_DIR;/python/grid_stat_python_120000L_20050807_120000V_pairs.nc
+ &OUTPUT_DIR;/python/grid_stat_python_120000L_20050807_120000V_pairs.nc
@@ -237,7 +236,7 @@
-outdir &OUTPUT_DIR;/python -v 1
- &OUTPUT_DIR;/python/point_stat_python_120000L_20120409_120000V.stat
+ &OUTPUT_DIR;/python/point_stat_120000L_20050807_120000V.stat
@@ -255,7 +254,7 @@
&OUTPUT_DIR;/python/wavelet_stat_python_120000L_20050807_120000V.stat
- &OUTPUT_DIR;/python/wavelet_stat_python_120000L_20050807_120000V_isc.txt
+ &OUTPUT_DIR;/python/wavelet_stat_python_120000L_20050807_120000V_isc.txt
&OUTPUT_DIR;/python/wavelet_stat_python_120000L_20050807_120000V.nc
&OUTPUT_DIR;/python/wavelet_stat_python_120000L_20050807_120000V.ps
@@ -274,7 +273,7 @@
&OUTPUT_DIR;/python/wavelet_stat_python_mixed_120000L_20050807_120000V.stat
- &OUTPUT_DIR;/python/wavelet_stat_python_mixed_120000L_20050807_120000V_isc.txt
+ &OUTPUT_DIR;/python/wavelet_stat_python_mixed_120000L_20050807_120000V_isc.txt
&OUTPUT_DIR;/python/wavelet_stat_python_mixed_120000L_20050807_120000V.nc
&OUTPUT_DIR;/python/wavelet_stat_python_mixed_120000L_20050807_120000V.ps
@@ -557,6 +556,20 @@
+
+ &MET_BIN;/plot_point_obs
+ \
+ 'PYTHON_NUMPY=&MET_BASE;/python/examples/read_met_point_obs_pandas.py &OUTPUT_DIR;/pb2nc/ndas.20120409.t12z.prepbufr.tm00.nc' \
+ &OUTPUT_DIR;/python/ndas.20120409.t12z.prepbufr.tm00.nr_met_nc_to_pandas.ps \
+ -data_file &DATA_DIR_MODEL;/grib2/nam/nam_2012040900_F012.grib2 \
+ -dotsize 2.0 \
+ -v 1
+
+
+ &OUTPUT_DIR;/python/ndas.20120409.t12z.prepbufr.tm00.nr_met_nc_to_pandas.ps
+
+
+
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 \
diff --git a/internal/test_unit/xml/unit_ref_config_lead_12.xml b/internal/test_unit/xml/unit_ref_config_lead_12.xml
index 989e548da5..5945ff2fdc 100644
--- a/internal/test_unit/xml/unit_ref_config_lead_12.xml
+++ b/internal/test_unit/xml/unit_ref_config_lead_12.xml
@@ -79,7 +79,7 @@
\
-subtract \
&DATA_DIR_MODEL;/grib1/ref_config/2011090200/AFWAv3.4_Noahv3.3/postprd/wrfprs_012.tm00 12 \
- &DATA_DIR_MODEL;/grib1/ref_config/2011090200/AFWAv3.4_Noahv3.3/postprd/wrfprs_009.tm00 9 \
+ &DATA_DIR_MODEL;/grib1/ref_config/2011090200/AFWAv3.4_Noahv3.3/postprd/wrfprs_009.tm00 9 \
&OUTPUT_DIR;/ref_config_lead_12/pcp_combine/wrf/wrfpcp03_012.nc
diff --git a/internal/test_unit/xml/unit_series_analysis.xml b/internal/test_unit/xml/unit_series_analysis.xml
index c1e64416b3..96cda729dd 100644
--- a/internal/test_unit/xml/unit_series_analysis.xml
+++ b/internal/test_unit/xml/unit_series_analysis.xml
@@ -29,12 +29,12 @@
OBS_FIELD { name = "APCP"; level = [ "A06" ]; }
MASK_POLY
FHO_STATS "F_RATE", "O_RATE"
- CTC_STATS "FY_OY", "FN_ON"
+ CTC_STATS "ALL"
CTS_STATS "CSI", "GSS"
- MCTC_STATS "F1_O1", "F2_O2", "F3_O3"
+ MCTC_STATS "ALL"
MCTS_STATS "ACC", "ACC_NCL", "ACC_NCU"
CNT_STATS "TOTAL", "ME", "ME_NCL", "ME_NCU"
- SL1L2_STATS "FBAR", "OBAR"
+ SL1L2_STATS "ALL"
SAL1L2_STATS
PCT_STATS
PSTD_STATS
@@ -46,22 +46,56 @@
&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 \
-obs &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 \
+ -out &OUTPUT_DIR;/series_analysis/series_analysis_CMD_LINE_APCP_06_2012040900_to_2012041000.nc \
+ -config &CONFIG_DIR;/SeriesAnalysisConfig \
+ -v 1
+
+
+ &OUTPUT_DIR;/series_analysis/series_analysis_CMD_LINE_APCP_06_2012040900_to_2012041000.nc
+
+
+
+
+ &MET_BIN;/series_analysis
+
+ MODEL GFS
+ OBTYPE STAGE4
+ FCST_CAT_THRESH >0.0, >5.0
+ FCST_FIELD { name = "APCP"; level = [ "A06" ]; }
+ OBS_CAT_THRESH >0.0, >5.0
+ OBS_FIELD { name = "APCP"; level = [ "A06" ]; }
+ MASK_POLY
+ FHO_STATS "F_RATE", "O_RATE"
+ CTC_STATS "ALL"
+ CTS_STATS "CSI", "GSS"
+ MCTC_STATS "ALL"
+ MCTS_STATS "ACC", "ACC_NCL", "ACC_NCU"
+ CNT_STATS "TOTAL", "ME", "ME_NCL", "ME_NCU"
+ SL1L2_STATS "ALL"
+ SAL1L2_STATS
+ PCT_STATS
+ PSTD_STATS
+ PJC_STATS
+ PRC_STATS
+
+ \
+ -fcst &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 \
+ -obs &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 \
- -out &OUTPUT_DIR;/series_analysis/series_analysis_CMD_LINE_APCP_06_2012040900_to_2012041100.nc \
+ -aggr &OUTPUT_DIR;/series_analysis/series_analysis_CMD_LINE_APCP_06_2012040900_to_2012041000.nc \
+ -out &OUTPUT_DIR;/series_analysis/series_analysis_AGGR_CMD_LINE_APCP_06_2012040900_to_2012041018.nc \
-config &CONFIG_DIR;/SeriesAnalysisConfig \
-v 1
- &OUTPUT_DIR;/series_analysis/series_analysis_CMD_LINE_APCP_06_2012040900_to_2012041100.nc
+ &OUTPUT_DIR;/series_analysis/series_analysis_AGGR_CMD_LINE_APCP_06_2012040900_to_2012041018.nc
@@ -69,18 +103,12 @@
echo "&DATA_DIR_MODEL;/grib1/sref/sref_2012040821_F009.grib \
&DATA_DIR_MODEL;/grib1/sref/sref_2012040821_F015.grib \
&DATA_DIR_MODEL;/grib1/sref/sref_2012040821_F021.grib \
- &DATA_DIR_MODEL;/grib1/sref/sref_2012040821_F027.grib \
- &DATA_DIR_MODEL;/grib1/sref/sref_2012040821_F033.grib \
- &DATA_DIR_MODEL;/grib1/sref/sref_2012040821_F039.grib \
- &DATA_DIR_MODEL;/grib1/sref/sref_2012040821_F045.grib" \
+ &DATA_DIR_MODEL;/grib1/sref/sref_2012040821_F027.grib" \
> &OUTPUT_DIR;/series_analysis/input_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" \
+ &DATA_DIR_OBS;/stage4_hmt/stage4_2012041000_06h.grib" \
> &OUTPUT_DIR;/series_analysis/input_obs_file_list; \
&MET_BIN;/series_analysis
@@ -99,7 +127,7 @@
CNT_STATS
SL1L2_STATS
SAL1L2_STATS
- PCT_STATS "OY_1", "ON_1"
+ PCT_STATS "ALL"
PSTD_STATS "TOTAL", "ROC_AUC", "BRIER", "BRIER_NCL", "BRIER_NCU"
PJC_STATS "CALIBRATION_1", "REFINEMENT_1"
PRC_STATS "PODY_1", "POFD_1"
@@ -107,12 +135,56 @@
\
-fcst &OUTPUT_DIR;/series_analysis/input_fcst_file_list \
-obs &OUTPUT_DIR;/series_analysis/input_obs_file_list \
- -out &OUTPUT_DIR;/series_analysis/series_analysis_FILE_LIST_PROB_APCP_06_2012040900_to_2012041100.nc \
+ -out &OUTPUT_DIR;/series_analysis/series_analysis_FILE_LIST_PROB_APCP_06_2012040900_to_2012041000.nc \
+ -config &CONFIG_DIR;/SeriesAnalysisConfig \
+ -v 1
+
+
+ &OUTPUT_DIR;/series_analysis/series_analysis_FILE_LIST_PROB_APCP_06_2012040900_to_2012041000.nc
+
+
+
+
+ echo "&DATA_DIR_MODEL;/grib1/sref/sref_2012040821_F033.grib \
+ &DATA_DIR_MODEL;/grib1/sref/sref_2012040821_F039.grib \
+ &DATA_DIR_MODEL;/grib1/sref/sref_2012040821_F045.grib" \
+ > &OUTPUT_DIR;/series_analysis/aggregate_fcst_file_list; \
+ echo "&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;/series_analysis/aggregate_obs_file_list; \
+ &MET_BIN;/series_analysis
+
+ MODEL SREF
+ OBTYPE STAGE4
+ FCST_CAT_THRESH >=0.00, >=0.25, >=0.50, >=0.75, >=1.00
+ FCST_FIELD { name = "PROB"; level = "A06"; prob = { name = "APCP"; thresh_lo = 0.25; }; }
+ OBS_CAT_THRESH >0.25
+ OBS_FIELD { name = "APCP"; level = "A06"; }
+ MASK_POLY
+ FHO_STATS
+ CTC_STATS
+ CTS_STATS
+ MCTC_STATS
+ MCTS_STATS
+ CNT_STATS
+ SL1L2_STATS
+ SAL1L2_STATS
+ PCT_STATS "ALL"
+ PSTD_STATS "TOTAL", "ROC_AUC", "BRIER", "BRIER_NCL", "BRIER_NCU"
+ PJC_STATS "CALIBRATION_1", "REFINEMENT_1"
+ PRC_STATS "PODY_1", "POFD_1"
+
+ \
+ -fcst &OUTPUT_DIR;/series_analysis/aggregate_fcst_file_list \
+ -obs &OUTPUT_DIR;/series_analysis/aggregate_obs_file_list \
+ -aggr &OUTPUT_DIR;/series_analysis/series_analysis_FILE_LIST_PROB_APCP_06_2012040900_to_2012041000.nc \
+ -out &OUTPUT_DIR;/series_analysis/series_analysis_AGGR_FILE_LIST_PROB_APCP_06_2012040900_to_2012041018.nc \
-config &CONFIG_DIR;/SeriesAnalysisConfig \
-v 1
- &OUTPUT_DIR;/series_analysis/series_analysis_FILE_LIST_PROB_APCP_06_2012040900_to_2012041100.nc
+ &OUTPUT_DIR;/series_analysis/series_analysis_AGGR_FILE_LIST_PROB_APCP_06_2012040900_to_2012041018.nc
diff --git a/internal/test_unit/xml/unit_stat_analysis_ps.xml b/internal/test_unit/xml/unit_stat_analysis_ps.xml
index 9fd50dcb2a..1ea5e2e19a 100644
--- a/internal/test_unit/xml/unit_stat_analysis_ps.xml
+++ b/internal/test_unit/xml/unit_stat_analysis_ps.xml
@@ -38,6 +38,8 @@
&OUTPUT_DIR;/stat_analysis_ps/CONFIG_POINT_STAT_agg_stat_mpr_to_wdir_dump.stat
&OUTPUT_DIR;/stat_analysis_ps/CONFIG_POINT_STAT_filter_mpr_sid.stat
&OUTPUT_DIR;/stat_analysis_ps/CONFIG_POINT_STAT_filter_mpr_fcst_minus_obs.stat
+ &OUTPUT_DIR;/stat_analysis_ps/CONFIG_POINT_STAT_agg_vl1l2.stat
+ &OUTPUT_DIR;/stat_analysis_ps/CONFIG_POINT_STAT_agg_stat_vl1l2_to_vcnt.stat
diff --git a/internal/test_unit/xml/unit_tc_diag.xml b/internal/test_unit/xml/unit_tc_diag.xml
index e0e1686718..1f75454ac0 100644
--- a/internal/test_unit/xml/unit_tc_diag.xml
+++ b/internal/test_unit/xml/unit_tc_diag.xml
@@ -33,9 +33,9 @@
-v 2
- &OUTPUT_DIR;/tc_diag/sal092022_gfso_doper_2022092400_cyl_grid_parent.nc
- &OUTPUT_DIR;/tc_diag/sal092022_gfso_doper_2022092400_diag.nc
- &OUTPUT_DIR;/tc_diag/sal092022_gfso_doper_2022092400_diag.dat
+ &OUTPUT_DIR;/tc_diag/sal092022_gfso_doper_2022092400_cyl_grid_parent.nc
+ &OUTPUT_DIR;/tc_diag/sal092022_gfso_doper_2022092400_diag.nc
+ &OUTPUT_DIR;/tc_diag/sal092022_gfso_doper_2022092400_diag.dat
diff --git a/internal/test_unit/xml/unit_ugrid.xml b/internal/test_unit/xml/unit_ugrid.xml
index 80a6a53360..5f6e517a7c 100644
--- a/internal/test_unit/xml/unit_ugrid.xml
+++ b/internal/test_unit/xml/unit_ugrid.xml
@@ -20,6 +20,9 @@
+ &TEST_DIR;
+ true
+
&MET_BIN;/grid_stat
@@ -33,7 +36,7 @@
&OUTPUT_DIR;/grid_stat_ugrid/grid_stat_UGRID_MPAS_OUT_TO_GRID_000000L_20120409_120000V.stat
- &OUTPUT_DIR;/grid_stat_ugrid/grid_stat_UGRID_MPAS_OUT_TO_GRID_000000L_20120409_120000V_pairs.nc
+ &OUTPUT_DIR;/grid_stat_ugrid/grid_stat_UGRID_MPAS_OUT_TO_GRID_000000L_20120409_120000V_pairs.nc
@@ -51,7 +54,7 @@
&OUTPUT_DIR;/grid_stat_ugrid/grid_stat_UGRID_MPAS_DIAG_000000L_20120409_120000V.stat
- &OUTPUT_DIR;/grid_stat_ugrid/grid_stat_UGRID_MPAS_DIAG_000000L_20120409_120000V_pairs.nc
+ &OUTPUT_DIR;/grid_stat_ugrid/grid_stat_UGRID_MPAS_DIAG_000000L_20120409_120000V_pairs.nc
diff --git a/internal/test_util/Makefile.in b/internal/test_util/Makefile.in
index 91fbb38a04..32c2b09cef 100644
--- a/internal/test_util/Makefile.in
+++ b/internal/test_util/Makefile.in
@@ -230,6 +230,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/basic/Makefile.in b/internal/test_util/basic/Makefile.in
index 8f7a6ae5f5..eacf3b24c2 100644
--- a/internal/test_util/basic/Makefile.in
+++ b/internal/test_util/basic/Makefile.in
@@ -230,6 +230,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/basic/vx_config/Makefile.in b/internal/test_util/basic/vx_config/Makefile.in
index 259d6dae5e..11f8c27d32 100644
--- a/internal/test_util/basic/vx_config/Makefile.in
+++ b/internal/test_util/basic/vx_config/Makefile.in
@@ -255,6 +255,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/basic/vx_log/Makefile.in b/internal/test_util/basic/vx_log/Makefile.in
index 0913f22a00..bc602758e2 100644
--- a/internal/test_util/basic/vx_log/Makefile.in
+++ b/internal/test_util/basic/vx_log/Makefile.in
@@ -224,6 +224,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/basic/vx_util/Makefile.in b/internal/test_util/basic/vx_util/Makefile.in
index ebbef0522c..7c4663e135 100644
--- a/internal/test_util/basic/vx_util/Makefile.in
+++ b/internal/test_util/basic/vx_util/Makefile.in
@@ -262,6 +262,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/libcode/Makefile.in b/internal/test_util/libcode/Makefile.in
index 4d4f244b34..38acababa3 100644
--- a/internal/test_util/libcode/Makefile.in
+++ b/internal/test_util/libcode/Makefile.in
@@ -234,6 +234,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/libcode/vx_data2d/Makefile.in b/internal/test_util/libcode/vx_data2d/Makefile.in
index f659f7c81a..25f644ed86 100644
--- a/internal/test_util/libcode/vx_data2d/Makefile.in
+++ b/internal/test_util/libcode/vx_data2d/Makefile.in
@@ -230,6 +230,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/libcode/vx_data2d_factory/Makefile.in b/internal/test_util/libcode/vx_data2d_factory/Makefile.in
index 1d93387de5..31ea2c180b 100644
--- a/internal/test_util/libcode/vx_data2d_factory/Makefile.in
+++ b/internal/test_util/libcode/vx_data2d_factory/Makefile.in
@@ -228,6 +228,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/libcode/vx_data2d_grib/Makefile.in b/internal/test_util/libcode/vx_data2d_grib/Makefile.in
index 5591f6439b..892f5eca9e 100644
--- a/internal/test_util/libcode/vx_data2d_grib/Makefile.in
+++ b/internal/test_util/libcode/vx_data2d_grib/Makefile.in
@@ -221,6 +221,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/libcode/vx_data2d_nc_cf/Makefile.in b/internal/test_util/libcode/vx_data2d_nc_cf/Makefile.in
index 52429cc106..749c25c8c9 100644
--- a/internal/test_util/libcode/vx_data2d_nc_cf/Makefile.in
+++ b/internal/test_util/libcode/vx_data2d_nc_cf/Makefile.in
@@ -220,6 +220,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/libcode/vx_data2d_nc_met/Makefile.in b/internal/test_util/libcode/vx_data2d_nc_met/Makefile.in
index 25fc3da12e..b02eb106d7 100644
--- a/internal/test_util/libcode/vx_data2d_nc_met/Makefile.in
+++ b/internal/test_util/libcode/vx_data2d_nc_met/Makefile.in
@@ -222,6 +222,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/libcode/vx_geodesy/Makefile.in b/internal/test_util/libcode/vx_geodesy/Makefile.in
index 63e759c489..f196c88c92 100644
--- a/internal/test_util/libcode/vx_geodesy/Makefile.in
+++ b/internal/test_util/libcode/vx_geodesy/Makefile.in
@@ -218,6 +218,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/libcode/vx_grid/Makefile.in b/internal/test_util/libcode/vx_grid/Makefile.in
index 05203d024a..9f7c65ed86 100644
--- a/internal/test_util/libcode/vx_grid/Makefile.in
+++ b/internal/test_util/libcode/vx_grid/Makefile.in
@@ -220,6 +220,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/libcode/vx_nc_util/Makefile.in b/internal/test_util/libcode/vx_nc_util/Makefile.in
index ad865d558f..af0e249f7b 100644
--- a/internal/test_util/libcode/vx_nc_util/Makefile.in
+++ b/internal/test_util/libcode/vx_nc_util/Makefile.in
@@ -225,6 +225,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/libcode/vx_physics/Makefile.in b/internal/test_util/libcode/vx_physics/Makefile.in
index 02f6ef57ae..20b0102618 100644
--- a/internal/test_util/libcode/vx_physics/Makefile.in
+++ b/internal/test_util/libcode/vx_physics/Makefile.in
@@ -218,6 +218,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/libcode/vx_plot_util/Makefile.in b/internal/test_util/libcode/vx_plot_util/Makefile.in
index 6a950df3aa..7f6bdd6dbc 100644
--- a/internal/test_util/libcode/vx_plot_util/Makefile.in
+++ b/internal/test_util/libcode/vx_plot_util/Makefile.in
@@ -219,6 +219,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/libcode/vx_ps/Makefile.in b/internal/test_util/libcode/vx_ps/Makefile.in
index d288997194..78db014c97 100644
--- a/internal/test_util/libcode/vx_ps/Makefile.in
+++ b/internal/test_util/libcode/vx_ps/Makefile.in
@@ -218,6 +218,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/libcode/vx_python3_utils/Makefile.in b/internal/test_util/libcode/vx_python3_utils/Makefile.in
index 3d3d12cefb..b416b84940 100644
--- a/internal/test_util/libcode/vx_python3_utils/Makefile.in
+++ b/internal/test_util/libcode/vx_python3_utils/Makefile.in
@@ -225,6 +225,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/libcode/vx_series_data/Makefile.in b/internal/test_util/libcode/vx_series_data/Makefile.in
index 94871489e0..ff1dd2b402 100644
--- a/internal/test_util/libcode/vx_series_data/Makefile.in
+++ b/internal/test_util/libcode/vx_series_data/Makefile.in
@@ -220,6 +220,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/libcode/vx_solar/Makefile.in b/internal/test_util/libcode/vx_solar/Makefile.in
index a7026539c3..9912971dc5 100644
--- a/internal/test_util/libcode/vx_solar/Makefile.in
+++ b/internal/test_util/libcode/vx_solar/Makefile.in
@@ -218,6 +218,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/libcode/vx_tc_util/Makefile.in b/internal/test_util/libcode/vx_tc_util/Makefile.in
index daf8dce673..a7d3c13818 100644
--- a/internal/test_util/libcode/vx_tc_util/Makefile.in
+++ b/internal/test_util/libcode/vx_tc_util/Makefile.in
@@ -243,6 +243,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/tools/Makefile.in b/internal/test_util/tools/Makefile.in
index e84bca7acf..c22646fb06 100644
--- a/internal/test_util/tools/Makefile.in
+++ b/internal/test_util/tools/Makefile.in
@@ -230,6 +230,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/tools/other/Makefile.in b/internal/test_util/tools/other/Makefile.in
index c054cf412f..8e6a1799bd 100644
--- a/internal/test_util/tools/other/Makefile.in
+++ b/internal/test_util/tools/other/Makefile.in
@@ -230,6 +230,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/internal/test_util/tools/other/mode_time_domain/Makefile.am b/internal/test_util/tools/other/mode_time_domain/Makefile.am
index 5bbe02612e..1f9be23d82 100644
--- a/internal/test_util/tools/other/mode_time_domain/Makefile.am
+++ b/internal/test_util/tools/other/mode_time_domain/Makefile.am
@@ -38,8 +38,6 @@ test_velocity_LDADD = \
${top_builddir}/src/tools/other/mode_time_domain/mtd-mtd_partition.o \
${top_builddir}/src/tools/other/mode_time_domain/mtd-mtd_read_data.o \
${top_builddir}/src/tools/other/mode_time_domain/mtd-mtd_txt_output.o \
- ${top_builddir}/src/tools/other/mode_time_domain/mtd-nc_grid.o \
- ${top_builddir}/src/tools/other/mode_time_domain/mtd-nc_utils_local.o \
-lvx_pxm \
-lvx_plot_util \
-lvx_nav \
diff --git a/internal/test_util/tools/other/mode_time_domain/Makefile.in b/internal/test_util/tools/other/mode_time_domain/Makefile.in
index 3e70894414..b1b08361df 100644
--- a/internal/test_util/tools/other/mode_time_domain/Makefile.in
+++ b/internal/test_util/tools/other/mode_time_domain/Makefile.in
@@ -125,8 +125,6 @@ test_velocity_DEPENDENCIES = ${top_builddir}/src/tools/other/mode_time_domain/mt
${top_builddir}/src/tools/other/mode_time_domain/mtd-mtd_partition.o \
${top_builddir}/src/tools/other/mode_time_domain/mtd-mtd_read_data.o \
${top_builddir}/src/tools/other/mode_time_domain/mtd-mtd_txt_output.o \
- ${top_builddir}/src/tools/other/mode_time_domain/mtd-nc_grid.o \
- ${top_builddir}/src/tools/other/mode_time_domain/mtd-nc_utils_local.o \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
@@ -245,6 +243,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
@@ -377,8 +376,6 @@ test_velocity_LDADD = \
${top_builddir}/src/tools/other/mode_time_domain/mtd-mtd_partition.o \
${top_builddir}/src/tools/other/mode_time_domain/mtd-mtd_read_data.o \
${top_builddir}/src/tools/other/mode_time_domain/mtd-mtd_txt_output.o \
- ${top_builddir}/src/tools/other/mode_time_domain/mtd-nc_grid.o \
- ${top_builddir}/src/tools/other/mode_time_domain/mtd-nc_utils_local.o \
-lvx_pxm \
-lvx_plot_util \
-lvx_nav \
diff --git a/scripts/Rscripts/Makefile.in b/scripts/Rscripts/Makefile.in
index fa8e805787..e53f9fe2df 100644
--- a/scripts/Rscripts/Makefile.in
+++ b/scripts/Rscripts/Makefile.in
@@ -260,6 +260,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/scripts/Rscripts/include/Makefile.in b/scripts/Rscripts/include/Makefile.in
index 5d625c4e28..d62ae95412 100644
--- a/scripts/Rscripts/include/Makefile.in
+++ b/scripts/Rscripts/include/Makefile.in
@@ -202,6 +202,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/scripts/config/EnsembleStatConfig b/scripts/config/EnsembleStatConfig
index bc84b81d8e..5353c92579 100644
--- a/scripts/config/EnsembleStatConfig
+++ b/scripts/config/EnsembleStatConfig
@@ -124,6 +124,8 @@ message_type_group_map = [
{ key = "ONLYSF"; val = "ADPSFC,SFCSHP"; }
];
+obtype_as_group_val_flag = FALSE;
+
//
// Ensemble bin sizes
// May be set separately in each "obs.field" entry
@@ -272,8 +274,10 @@ rng = {
////////////////////////////////////////////////////////////////////////////////
-grid_weight_flag = NONE;
-output_prefix = "";
-version = "V12.0.0";
+grid_weight_flag = NONE;
+point_weight_flag = NONE;
+
+output_prefix = "";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/scripts/config/GenEnsProdConfig b/scripts/config/GenEnsProdConfig
index 74350a328d..65d13aadbd 100644
--- a/scripts/config/GenEnsProdConfig
+++ b/scripts/config/GenEnsProdConfig
@@ -13,7 +13,6 @@ model = "FCST";
//
// Output description to be written
-// May be set separately in each "obs.field" entry
//
desc = "NA";
diff --git a/scripts/config/GridStatConfig_APCP_12 b/scripts/config/GridStatConfig_APCP_12
index 2358000a81..3cbc179064 100644
--- a/scripts/config/GridStatConfig_APCP_12
+++ b/scripts/config/GridStatConfig_APCP_12
@@ -217,8 +217,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "APCP_12";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "APCP_12";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/scripts/config/GridStatConfig_APCP_24 b/scripts/config/GridStatConfig_APCP_24
index 39eaa7d220..383efc78c5 100644
--- a/scripts/config/GridStatConfig_APCP_24
+++ b/scripts/config/GridStatConfig_APCP_24
@@ -227,8 +227,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "APCP_24";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "APCP_24";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/scripts/config/GridStatConfig_POP_12 b/scripts/config/GridStatConfig_POP_12
index 6fb4775939..974a3a79b7 100644
--- a/scripts/config/GridStatConfig_POP_12
+++ b/scripts/config/GridStatConfig_POP_12
@@ -226,8 +226,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "POP_12";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "POP_12";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/scripts/config/GridStatConfig_all b/scripts/config/GridStatConfig_all
index a165ef836d..f39e7e90cf 100644
--- a/scripts/config/GridStatConfig_all
+++ b/scripts/config/GridStatConfig_all
@@ -257,8 +257,9 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
grid_weight_flag = NONE;
-tmp_dir = "/tmp";
-output_prefix = "";
-version = "V12.0.0";
+
+tmp_dir = "/tmp";
+output_prefix = "";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/scripts/config/PointStatConfig b/scripts/config/PointStatConfig
index 3c79f15262..1f4140de1e 100644
--- a/scripts/config/PointStatConfig
+++ b/scripts/config/PointStatConfig
@@ -216,8 +216,11 @@ seeps_p1_thresh = NA;
////////////////////////////////////////////////////////////////////////////////
rank_corr_flag = TRUE;
-tmp_dir = "/tmp";
-output_prefix = "";
-version = "V12.0.0";
+
+point_weight_flag = NONE;
+
+tmp_dir = "/tmp";
+output_prefix = "";
+version = "V12.0.0";
////////////////////////////////////////////////////////////////////////////////
diff --git a/scripts/python/Makefile.in b/scripts/python/Makefile.in
index e45eb05cd4..670db075a0 100644
--- a/scripts/python/Makefile.in
+++ b/scripts/python/Makefile.in
@@ -232,6 +232,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/scripts/python/examples/Makefile.am b/scripts/python/examples/Makefile.am
index e0461a3564..f1712318a6 100644
--- a/scripts/python/examples/Makefile.am
+++ b/scripts/python/examples/Makefile.am
@@ -32,7 +32,8 @@ pythonexamples_DATA = \
read_ascii_numpy.py \
read_ascii_point.py \
read_ascii_xarray.py \
- read_met_point_obs.py
+ read_met_point_obs.py \
+ read_met_point_obs_pandas.py
EXTRA_DIST = ${pythonexamples_DATA}
diff --git a/scripts/python/examples/Makefile.in b/scripts/python/examples/Makefile.in
index 1d4a58cadf..cdf8f0feb4 100644
--- a/scripts/python/examples/Makefile.in
+++ b/scripts/python/examples/Makefile.in
@@ -204,6 +204,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
@@ -317,7 +318,8 @@ pythonexamples_DATA = \
read_ascii_numpy.py \
read_ascii_point.py \
read_ascii_xarray.py \
- read_met_point_obs.py
+ read_met_point_obs.py \
+ read_met_point_obs_pandas.py
EXTRA_DIST = ${pythonexamples_DATA}
MAINTAINERCLEANFILES = Makefile.in
diff --git a/scripts/python/examples/read_ascii_numpy.py b/scripts/python/examples/read_ascii_numpy.py
index 342121f2ff..061e1aa250 100644
--- a/scripts/python/examples/read_ascii_numpy.py
+++ b/scripts/python/examples/read_ascii_numpy.py
@@ -85,7 +85,6 @@ def set_dataplane_attrs():
user_fill_value = float(sys.argv[3])
except:
log(f"{SCRIPT_NAME} Ignored argument {sys.argv[3]}")
- pass
log(f"{SCRIPT_NAME} Input File:\t{repr(input_file)}")
log(f"{SCRIPT_NAME} Data Name:\t{repr(data_name)}")
diff --git a/scripts/python/examples/read_met_point_obs_pandas.py b/scripts/python/examples/read_met_point_obs_pandas.py
new file mode 100644
index 0000000000..bf7bb5527b
--- /dev/null
+++ b/scripts/python/examples/read_met_point_obs_pandas.py
@@ -0,0 +1,52 @@
+import os
+import sys
+
+from met.point_nc import nc_point_obs
+
+# Description: Reads a point observation NetCDF file created by MET and passes
+# the data to another MET tool via Python Embedding. This script can be copied
+# to perform modifications to the data before it is passed to MET.
+# Example: plot_point_obs "PYTHON_NUMPY=pyembed_met_point_nc.py in.nc" out.ps
+# Contact: George McCabe
+
+# Read and format the input 11-column observations:
+# (1) string: Message_Type
+# (2) string: Station_ID
+# (3) string: Valid_Time(YYYYMMDD_HHMMSS)
+# (4) numeric: Lat(Deg North)
+# (5) numeric: Lon(Deg East)
+# (6) numeric: Elevation(msl)
+# (7) string: Var_Name(or GRIB_Code)
+# (8) numeric: Level
+# (9) numeric: Height(msl or agl)
+# (10) string: QC_String
+# (11) numeric: Observation_Value
+
+print(f"Python Script:\t{sys.argv[0]}")
+
+if len(sys.argv) != 2:
+ print("ERROR: pyembed_met_point_nc.py -> Specify only 1 input file")
+ sys.exit(1)
+
+# Read the input file as the first argument
+input_file = os.path.expandvars(sys.argv[1])
+print("Input File:\t" + repr(input_file))
+
+# Read MET point observation NetCDF file
+try:
+ point_obs = nc_point_obs(input_file)
+except TypeError:
+ print(f"ERROR: Could not read MET point data file {input_file}")
+ sys.exit(1)
+
+# convert point observation data to a pandas DataFrame
+df = point_obs.to_pandas()
+
+##################################################
+# perform any modifications to the data here #
+##################################################
+
+# convert pandas DataFrame to list format that is expected by MET
+point_data = df.values.tolist()
+print(f" point_data: Data Length:\t{len(point_data)}")
+print(f" point_data: Data Type:\t{type(point_data)}")
diff --git a/scripts/python/met/Makefile.in b/scripts/python/met/Makefile.in
index 6a7570efa2..d8541387db 100644
--- a/scripts/python/met/Makefile.in
+++ b/scripts/python/met/Makefile.in
@@ -204,6 +204,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/scripts/python/met/dataplane.py b/scripts/python/met/dataplane.py
index a28661b365..4d94c0e712 100644
--- a/scripts/python/met/dataplane.py
+++ b/scripts/python/met/dataplane.py
@@ -25,6 +25,9 @@ def call_python(argv):
sys.exit(1)
met_base.log_message(f"User python command:\t{repr(' '.join(argv[1:]))}")
+ if not argv[1] or not argv[1].strip():
+ met_base.quit_msg(f"User python command is empty")
+ sys.exit(1)
# argv[1] contains the user defined python script
pyembed_module_name = argv[1]
@@ -178,7 +181,11 @@ def validate_met_data(met_data, fill_value=None):
met_base.quit(f"{method_name} The met_data is None")
sys.exit(1)
- nx, ny = met_data.shape
+ if hasattr(met_data, 'shape'):
+ nx, ny = met_data.shape
+ else:
+ met_base.quit(f"{method_name} The met_data does not have the shape property")
+ sys.exit(1)
met_fill_value = met_base.MET_FILL_VALUE
if dataplane.is_xarray_dataarray(met_data):
diff --git a/scripts/python/met/logger.py b/scripts/python/met/logger.py
index a85de36d1f..1e7b30a798 100644
--- a/scripts/python/met/logger.py
+++ b/scripts/python/met/logger.py
@@ -25,10 +25,6 @@ def error_message(msg):
for a_msg in msgs:
logger.log_message(logger.append_error_prompt(a_msg))
- #@staticmethod
- #def get_met_fill_value():
- # return logger.MET_FILL_VALUE
-
@staticmethod
def info_message(msg):
print(f'{logger.PROMPT} {logger.INFO_P} {msg}')
@@ -78,8 +74,8 @@ def log_msg(self, msg):
@staticmethod
def get_numpy_filename(tmp_filename):
- return logger.replace_extension(tmp_filename, "json", "npy") if tmp_filename.endswith(".json") else \
- logger.replace_extension(tmp_filename, "nc", "npy") if tmp_filename.endswith(".nc") else f'{tmp_filename}.npy'
+ file_ext = os.path.splitext(tmp_filename)[1]
+ return logger.replace_extension(tmp_filename, file_ext, ".npy") if file_ext else f'{tmp_filename}.npy'
def is_debug_enabled(self, component_name=""):
return met_base_tools.is_debug_enabled(component_name)
@@ -99,22 +95,27 @@ class met_base_tools(object):
ENV_MET_PYTHON_DEBUG = "MET_PYTHON_DEBUG"
ENV_MET_PYTHON_TMP_FORMAT = "MET_PYTHON_TMP_FORMAT"
+ @staticmethod
+ def convert_byte_type_to_array(ndarray_data):
+ array_data = []
+ if isinstance(ndarray_data[0], (np.ma.MaskedArray, np.ma.core.MaskedArray)):
+ for byte_data in ndarray_data:
+ array_data.append(byte_data.tobytes(fill_value=' ').decode('utf-8').rstrip())
+ else:
+ for byte_data in ndarray_data:
+ array_data.append(byte_data.decode("utf-8").rstrip())
+ return array_data
+
@staticmethod
def convert_to_array(ndarray_data):
is_byte_type = False
if 0 < len(ndarray_data):
is_byte_type = isinstance(ndarray_data[0], (bytes, np.bytes_))
- if isinstance(ndarray_data[0], np.ndarray):
- if 0 < len(ndarray_data[0]):
- is_byte_type = isinstance(ndarray_data[0][0], (bytes, np.bytes_))
+ if not is_byte_type and isinstance(ndarray_data[0], np.ndarray) \
+ and 0 < len(ndarray_data[0]):
+ is_byte_type = isinstance(ndarray_data[0][0], (bytes, np.bytes_))
if is_byte_type:
- array_data = []
- if isinstance(ndarray_data[0], (np.ma.MaskedArray, np.ma.core.MaskedArray)):
- for byte_data in ndarray_data:
- array_data.append(byte_data.tobytes(fill_value=' ').decode('utf-8').rstrip())
- else:
- for byte_data in ndarray_data:
- array_data.append(byte_data.decode("utf-8").rstrip())
+ array_data = met_base_tools.convert_byte_type_to_array(ndarray_data)
elif isinstance(ndarray_data, (np.ma.MaskedArray, np.ma.core.MaskedArray)):
array_data = ndarray_data.filled(fill_value=-9999).tolist()
elif isinstance(ndarray_data, np.ndarray):
diff --git a/scripts/python/met/mprbase.py b/scripts/python/met/mprbase.py
index 0615171313..40cc36f7fb 100644
--- a/scripts/python/met/mprbase.py
+++ b/scripts/python/met/mprbase.py
@@ -6,6 +6,7 @@ class mpr_data():
# Read a text file with N columns and returns the list of N column data
# Skip first "col_start" columns if col_start is not 0.
+ @staticmethod
def read_mpr(input_file, col_last, col_start = 0, header=None,
delim_whitespace=True, keep_default_na=False,
skiprows=1, dtype='string'):
diff --git a/scripts/python/met/point.py b/scripts/python/met/point.py
index eb85c3711d..46576c8e59 100644
--- a/scripts/python/met/point.py
+++ b/scripts/python/met/point.py
@@ -181,11 +181,8 @@ def check_point_data(self):
if self.use_var_id:
self.check_data_member_string(self.obs_var_table,'obs_var_table')
- #def convert_to_numpy(self, value_list):
- # return met_point_tools.convert_to_ndarray(value_list)
-
def dump(self):
- met_base_point.print_point_data(self.get_point_data())
+ met_point_tools.print_point_data(self.get_point_data())
def get_count_string(self):
return f' nobs={self.nobs} nhdr={self.nhdr} ntyp={self.nhdr_typ} nsid={self.nhdr_sid} nvld={self.nhdr_vld} nqty={self.nobs_qty} nvar={self.nobs_var}'
@@ -346,7 +343,7 @@ def write_point_data(self, tmp_filename):
nc_point_obs.write_nc_file(tmp_filename, self)
if met_base_tools.is_debug_enabled("point"):
- met_base.log_message(f"Save to a temporary NetCDF file (point)")
+ met_base.log_message("Save to a temporary NetCDF file (point)")
else:
self.write_point_data_json_numpy(tmp_filename)
@@ -417,8 +414,8 @@ def __init__(self, point_data):
def check_csv_record(self, csv_point_data, index):
method_name = f"{self.__class__.__name__}.check_csv_record()"
error_msgs = []
- # names=['typ', 'sid', 'vld', 'lat', 'lon', 'elv', 'var', 'lvl', 'hgt', 'qc', 'obs']
- # dtype={'typ':'str', 'sid':'str', 'vld':'str', 'var':'str', 'qc':'str'}
+ # names: ['typ', 'sid', 'vld', 'lat', 'lon', 'elv', 'var', 'lvl', 'hgt', 'qc', 'obs']
+ # dtype: {'typ':'str', 'sid':'str', 'vld':'str', 'var':'str', 'qc':'str'}
if 11 > len(csv_point_data):
error_msgs.append(f"{method_name} {index}-th data: missing columns. should be 11 columns, not {len(csv_point_data)} columns")
elif 11 < len(csv_point_data):
@@ -488,7 +485,7 @@ def convert_point_data(self):
self.use_var_id = not self.is_grib_code()
index = 0
- #names=['typ', 'sid', 'vld', 'lat', 'lon', 'elv', 'var', 'lvl', 'hgt', 'qc', 'obs']
+ #name: ['typ', 'sid', 'vld', 'lat', 'lon', 'elv', 'var', 'lvl', 'hgt', 'qc', 'obs']
for csv_point_record in self.point_data:
# Build header map.
hdr_typ_str = csv_point_record[0]
@@ -539,7 +536,7 @@ def convert_point_data(self):
obs_qty_map[qc_str] = qc_id
qc_cnt += 1
- # names=['typ', 'sid', 'vld', 'lat', 'lon', 'elv', 'var', 'lvl', 'hgt', 'qc', 'obs']
+ # names: ['typ', 'sid', 'vld', 'lat', 'lon', 'elv', 'var', 'lvl', 'hgt', 'qc', 'obs']
self.obs_vid[index] = var_id
self.obs_hid[index] = hdr_idx
self.obs_lvl[index] = self.get_num_value(csv_point_record[7])
@@ -627,21 +624,21 @@ def read_data(self, args):
# - set self.input_name
#
# Here is a template
- '''
- if isinstance(args, dict):
- in_filename = args.get('in_name',None)
- elif isinstance(args, list):
- in_filename = args[0]
- else:
- in_filename = args
- self.input_name = in_filename
- '''
+ #
+ # if isinstance(args, dict):
+ # in_filename = args.get('in_name',None)
+ # elif isinstance(args, list):
+ # in_filename = args[0]
+ # else:
+ # in_filename = args
+ # self.input_name = in_filename
pass
class dummy_point_obs(met_point_obs):
def read_data(self, args):
+ # Do nothing to return an empty point_obs
pass
@@ -689,7 +686,7 @@ def print_data(key, data_array, show_count=COUNT_SHOW):
@staticmethod
def print_point_data(met_point_data, print_subset=True):
- method_name = f"met_point_tools.print_point_data()"
+ method_name = "met_point_tools.print_point_data()"
print(' === MET point data by python embedding ===')
if print_subset:
met_point_tools.print_data('nhdr',met_point_data['nhdr'])
@@ -714,26 +711,26 @@ def print_point_data(met_point_data, print_subset=True):
met_point_tools.print_data('obs_val',met_point_data['obs_val'])
else:
print(f'{method_name} All',met_point_data)
- print(f" nhdr: met_point_data['nhdr']")
- print(f" nobs: met_point_data['nobs']")
- print(f" use_var_id: met_point_data['use_var_id']")
- print(f" hdr_typ: met_point_data['hdr_typ']")
- print(f"hdr_typ_table: met_point_data['hdr_typ_table']")
- print(f" hdr_sid: met_point_data['hdr_sid']")
- print(f"hdr_sid_table: met_point_data['hdr_sid_table']")
- print(f" hdr_vld: met_point_data['hdr_vld']")
- print(f"hdr_vld_table: met_point_data['hdr_vld_table']")
- print(f" hdr_lat: met_point_data['hdr_lat']")
- print(f" hdr_lon: met_point_data['hdr_lon']")
- print(f" hdr_elv: met_point_data['hdr_elv']")
- print(f" obs_hid: met_point_data['obs_hid']")
- print(f" obs_vid: met_point_data['obs_vid']")
- print(f"obs_var_table: met_point_data['obs_var_table']")
- print(f" obs_qty: met_point_data['obs_qty']")
- print(f"obs_qty_table: met_point_data['obs_qty_table']")
- print(f" obs_lvl: met_point_data['obs_lvl']")
- print(f" obs_hgt: met_point_data['obs_hgt']")
- print(f" obs_val: met_point_data['obs_val']")
+ print(" nhdr: met_point_data['nhdr']")
+ print(" nobs: met_point_data['nobs']")
+ print(" use_var_id: met_point_data['use_var_id']")
+ print(" hdr_typ: met_point_data['hdr_typ']")
+ print("hdr_typ_table: met_point_data['hdr_typ_table']")
+ print(" hdr_sid: met_point_data['hdr_sid']")
+ print("hdr_sid_table: met_point_data['hdr_sid_table']")
+ print(" hdr_vld: met_point_data['hdr_vld']")
+ print("hdr_vld_table: met_point_data['hdr_vld_table']")
+ print(" hdr_lat: met_point_data['hdr_lat']")
+ print(" hdr_lon: met_point_data['hdr_lon']")
+ print(" hdr_elv: met_point_data['hdr_elv']")
+ print(" obs_hid: met_point_data['obs_hid']")
+ print(" obs_vid: met_point_data['obs_vid']")
+ print("obs_var_table: met_point_data['obs_var_table']")
+ print(" obs_qty: met_point_data['obs_qty']")
+ print("obs_qty_table: met_point_data['obs_qty_table']")
+ print(" obs_lvl: met_point_data['obs_lvl']")
+ print(" obs_hgt: met_point_data['obs_hgt']")
+ print(" obs_val: met_point_data['obs_val']")
print(' === MET point data by python embedding ===')
diff --git a/scripts/python/met/point_nc.py b/scripts/python/met/point_nc.py
index 37063bdb0d..db73d8fae4 100644
--- a/scripts/python/met/point_nc.py
+++ b/scripts/python/met/point_nc.py
@@ -8,10 +8,12 @@
'''
+import sys
import os
import numpy as np
import netCDF4 as nc
+import pandas as pd
from met.point import met_point_obs, met_point_tools
@@ -53,6 +55,11 @@ def get_string_array(nc_group, var_name):
class nc_point_obs(met_point_obs):
+ def __init__(self, nc_filename=None):
+ super().__init__()
+ if nc_filename:
+ self.read_data(nc_filename)
+
# args should be string, list, or dictionary
def get_nc_filename(self, args):
nc_filename = None
@@ -67,62 +74,65 @@ def get_nc_filename(self, args):
def read_data(self, nc_filename):
method_name = f"{self.__class__.__name__}.read_data()"
- if nc_filename is None:
- self.log_error_msg(f"{method_name} The input NetCDF filename is missing")
- elif not os.path.exists(nc_filename):
- self.log_error_msg(f"{method_name} input NetCDF file ({nc_filename}) does not exist")
- else:
+ if not nc_filename:
+ raise TypeError(f"{method_name} The input NetCDF filename is missing")
+ if not os.path.exists(nc_filename):
+ raise TypeError(f"{method_name} input NetCDF file ({nc_filename}) does not exist")
+
+ try:
dataset = nc.Dataset(nc_filename, 'r')
+ except OSError:
+ raise TypeError(f"{method_name} Could not open NetCDF file ({nc_filename}")
+
+ attr_name = 'use_var_id'
+ use_var_id_str = dataset.getncattr(attr_name) if attr_name in dataset.ncattrs() else "false"
+ self.use_var_id = use_var_id_str.lower() == 'true'
+
+ # Header
+ self.hdr_typ = dataset['hdr_typ'][:]
+ self.hdr_sid = dataset['hdr_sid'][:]
+ self.hdr_vld = dataset['hdr_vld'][:]
+ self.hdr_lat = dataset['hdr_lat'][:]
+ self.hdr_lon = dataset['hdr_lon'][:]
+ self.hdr_elv = dataset['hdr_elv'][:]
+ self.hdr_typ_table = met_point_nc_tools.get_string_array(dataset, 'hdr_typ_table')
+ self.hdr_sid_table = met_point_nc_tools.get_string_array(dataset, 'hdr_sid_table')
+ self.hdr_vld_table = met_point_nc_tools.get_string_array(dataset, 'hdr_vld_table')
+
+ nc_var = dataset.variables.get('obs_unit', None)
+ if nc_var:
+ self.obs_var_unit = nc_var[:]
+ nc_var = dataset.variables.get('obs_desc', None)
+ if nc_var:
+ self.obs_var_desc = nc_var[:]
+
+ nc_var = dataset.variables.get('hdr_prpt_typ', None)
+ if nc_var:
+ self.hdr_prpt_typ = nc_var[:]
+ nc_var = dataset.variables.get('hdr_irpt_typ', None)
+ if nc_var:
+ self.hdr_irpt_typ = nc_var[:]
+ nc_var = dataset.variables.get('hdr_inst_typ', None)
+ if nc_var:
+ self.hdr_inst_typ =nc_var[:]
+
+ #Observation data
+ self.hdr_sid = dataset['hdr_sid'][:]
+ self.obs_qty = np.array(dataset['obs_qty'][:])
+ self.obs_hid = np.array(dataset['obs_hid'][:])
+ self.obs_lvl = np.array(dataset['obs_lvl'][:])
+ self.obs_hgt = np.array(dataset['obs_hgt'][:])
+ self.obs_val = np.array(dataset['obs_val'][:])
+ nc_var = dataset.variables.get('obs_vid', None)
+ if nc_var is None:
+ self.use_var_id = False
+ nc_var = dataset.variables.get('obs_gc', None)
+ else:
+ self.obs_var_table = met_point_nc_tools.get_string_array(dataset, 'obs_var')
+ if nc_var:
+ self.obs_vid = np.array(nc_var[:])
- attr_name = 'use_var_id'
- use_var_id_str = dataset.getncattr(attr_name) if attr_name in dataset.ncattrs() else "false"
- self.use_var_id = use_var_id_str.lower() == 'true'
-
- # Header
- self.hdr_typ = dataset['hdr_typ'][:]
- self.hdr_sid = dataset['hdr_sid'][:]
- self.hdr_vld = dataset['hdr_vld'][:]
- self.hdr_lat = dataset['hdr_lat'][:]
- self.hdr_lon = dataset['hdr_lon'][:]
- self.hdr_elv = dataset['hdr_elv'][:]
- self.hdr_typ_table = met_point_nc_tools.get_string_array(dataset, 'hdr_typ_table')
- self.hdr_sid_table = met_point_nc_tools.get_string_array(dataset, 'hdr_sid_table')
- self.hdr_vld_table = met_point_nc_tools.get_string_array(dataset, 'hdr_vld_table')
-
- nc_var = dataset.variables.get('obs_unit', None)
- if nc_var:
- self.obs_var_unit = nc_var[:]
- nc_var = dataset.variables.get('obs_desc', None)
- if nc_var:
- self.obs_var_desc = nc_var[:]
-
- nc_var = dataset.variables.get('hdr_prpt_typ', None)
- if nc_var:
- self.hdr_prpt_typ = nc_var[:]
- nc_var = dataset.variables.get('hdr_irpt_typ', None)
- if nc_var:
- self.hdr_irpt_typ = nc_var[:]
- nc_var = dataset.variables.get('hdr_inst_typ', None)
- if nc_var:
- self.hdr_inst_typ =nc_var[:]
-
- #Observation data
- self.hdr_sid = dataset['hdr_sid'][:]
- self.obs_qty = np.array(dataset['obs_qty'][:])
- self.obs_hid = np.array(dataset['obs_hid'][:])
- self.obs_lvl = np.array(dataset['obs_lvl'][:])
- self.obs_hgt = np.array(dataset['obs_hgt'][:])
- self.obs_val = np.array(dataset['obs_val'][:])
- nc_var = dataset.variables.get('obs_vid', None)
- if nc_var is None:
- self.use_var_id = False
- nc_var = dataset.variables.get('obs_gc', None)
- else:
- self.obs_var_table = met_point_nc_tools.get_string_array(dataset, 'obs_var')
- if nc_var:
- self.obs_vid = np.array(nc_var[:])
-
- self.obs_qty_table = met_point_nc_tools.get_string_array(dataset, 'obs_qty_table')
+ self.obs_qty_table = met_point_nc_tools.get_string_array(dataset, 'obs_qty_table')
def save_ncfile(self, nc_filename):
met_data = self.get_point_data()
@@ -274,6 +284,22 @@ def write_nc_data(nc_dataset, point_obs):
print(f' === ERROR at {method_name} type(nc_dataset)={type(nc_dataset)} type(point_obs)={type(point_obs)}')
raise
+ def to_pandas(self):
+ return pd.DataFrame({
+ 'typ': [self.hdr_typ_table[self.hdr_typ[i]] for i in self.obs_hid],
+ 'sid': [self.hdr_sid_table[self.hdr_sid[i]] for i in self.obs_hid],
+ 'vld': [self.hdr_vld_table[self.hdr_vld[i]] for i in self.obs_hid],
+ 'lat': [self.hdr_lat[i] for i in self.obs_hid],
+ 'lon': [self.hdr_lon[i] for i in self.obs_hid],
+ 'elv': [self.hdr_elv[i] for i in self.obs_hid],
+ 'var': [self.obs_var_table[i] if self.use_var_id else f'{i}'
+ for i in self.obs_vid],
+ 'lvl': self.obs_lvl,
+ 'hgt': self.obs_hgt,
+ 'qc': [np.nan if np.ma.is_masked(i) else self.obs_qty_table[i]
+ for i in self.obs_qty],
+ 'obs': self.obs_val,
+ })
def main(argv):
if len(argv) != 1 and argv[1] != ARG_PRINT_DATA:
@@ -289,5 +315,5 @@ def main(argv):
point_obs_data.print_point_data(met_point_data)
if __name__ == '__main__':
- main()
+ main(sys.argv)
print('Done python script')
diff --git a/scripts/python/pyembed/Makefile.in b/scripts/python/pyembed/Makefile.in
index b8fef31f8b..1ffd7a4eb5 100644
--- a/scripts/python/pyembed/Makefile.in
+++ b/scripts/python/pyembed/Makefile.in
@@ -260,6 +260,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/scripts/python/tc_diag/Makefile.in b/scripts/python/tc_diag/Makefile.in
index 9d098740ad..6cda357496 100644
--- a/scripts/python/tc_diag/Makefile.in
+++ b/scripts/python/tc_diag/Makefile.in
@@ -262,6 +262,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/scripts/python/tc_diag/atcf_tools/Makefile.in b/scripts/python/tc_diag/atcf_tools/Makefile.in
index fec6217c14..67b691d180 100644
--- a/scripts/python/tc_diag/atcf_tools/Makefile.in
+++ b/scripts/python/tc_diag/atcf_tools/Makefile.in
@@ -204,6 +204,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/scripts/python/tc_diag/config/Makefile.in b/scripts/python/tc_diag/config/Makefile.in
index cc4019b28f..df494ac1c5 100644
--- a/scripts/python/tc_diag/config/Makefile.in
+++ b/scripts/python/tc_diag/config/Makefile.in
@@ -204,6 +204,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/scripts/python/tc_diag/diag_lib/Makefile.in b/scripts/python/tc_diag/diag_lib/Makefile.in
index aa48ed0c5f..64b9c40add 100644
--- a/scripts/python/tc_diag/diag_lib/Makefile.in
+++ b/scripts/python/tc_diag/diag_lib/Makefile.in
@@ -204,6 +204,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/scripts/python/tc_diag/tc_diag_driver/Makefile.in b/scripts/python/tc_diag/tc_diag_driver/Makefile.in
index b4468d4bb2..41d0c24e56 100644
--- a/scripts/python/tc_diag/tc_diag_driver/Makefile.in
+++ b/scripts/python/tc_diag/tc_diag_driver/Makefile.in
@@ -204,6 +204,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/scripts/python/utility/Makefile.in b/scripts/python/utility/Makefile.in
index 0b977854db..bb8de463d2 100644
--- a/scripts/python/utility/Makefile.in
+++ b/scripts/python/utility/Makefile.in
@@ -204,6 +204,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/src/Makefile.in b/src/Makefile.in
index 175bb0381a..05916e66b0 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -230,6 +230,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/src/basic/Makefile.in b/src/basic/Makefile.in
index 1df9e615ba..a5e04f07e1 100644
--- a/src/basic/Makefile.in
+++ b/src/basic/Makefile.in
@@ -232,6 +232,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/src/basic/enum_to_string/Makefile.in b/src/basic/enum_to_string/Makefile.in
index 6c1a9607bf..69c57f75cf 100644
--- a/src/basic/enum_to_string/Makefile.in
+++ b/src/basic/enum_to_string/Makefile.in
@@ -249,6 +249,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/src/basic/vx_cal/Makefile.in b/src/basic/vx_cal/Makefile.in
index a80d944f0a..bf9c15aa6c 100644
--- a/src/basic/vx_cal/Makefile.in
+++ b/src/basic/vx_cal/Makefile.in
@@ -256,6 +256,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/src/basic/vx_cal/is_leap_year.cc b/src/basic/vx_cal/is_leap_year.cc
index d37854d690..a383041475 100644
--- a/src/basic/vx_cal/is_leap_year.cc
+++ b/src/basic/vx_cal/is_leap_year.cc
@@ -102,7 +102,7 @@ void adjuste_day_for_month_year_units(int &day, int &month, int &year, double mo
// Compute remaining days from the month fraction
bool day_adjusted = false;
const int day_offset = (int)(month_fraction * DAYS_PER_MONTH + 0.5);
- const char *method_name = "adjuste_day() --> ";
+ const char *method_name = "adjuste_day_for_month_year_units() -> ";
day += day_offset;
if (day == 1 && abs(month_fraction-0.5) < DAY_EPSILON) {
@@ -162,7 +162,7 @@ unixtime add_to_unixtime(unixtime base_unixtime, int sec_per_unit,
unixtime ut;
auto time_value_ut = (unixtime)time_value;
double time_fraction = time_value - (double)time_value_ut;
- const char *method_name = "add_to_unixtime() -->";
+ const char *method_name = "add_to_unixtime() -> ";
if (sec_per_unit == SEC_MONTH || sec_per_unit == SEC_YEAR) {
if (time_value < 0) {
diff --git a/src/basic/vx_config/Makefile.in b/src/basic/vx_config/Makefile.in
index 5fddc64397..61940aed88 100644
--- a/src/basic/vx_config/Makefile.in
+++ b/src/basic/vx_config/Makefile.in
@@ -304,6 +304,7 @@ MET_BUFRLIB = @MET_BUFRLIB@
MET_CAIRO = @MET_CAIRO@
MET_CAIROINC = @MET_CAIROINC@
MET_CAIROLIB = @MET_CAIROLIB@
+MET_CXX_STANDARD = @MET_CXX_STANDARD@
MET_ECKIT = @MET_ECKIT@
MET_ECKITINC = @MET_ECKITINC@
MET_ECKITLIB = @MET_ECKITLIB@
diff --git a/src/basic/vx_config/config.tab.cc b/src/basic/vx_config/config.tab.cc
index 61513c670b..69427413b0 100644
--- a/src/basic/vx_config/config.tab.cc
+++ b/src/basic/vx_config/config.tab.cc
@@ -3229,11 +3229,10 @@ Simple_Node * s = new Simple_Node;
s->op = op;
-if ( (info.perc_index < 0) || (info.perc_index >= n_perc_thresh_infos) ) {
+if ( info.ptype == no_perc_thresh_type ) {
- mlog << Error
- << "\ndo_simple_perc_thresh() -> bad perc_index ... "
- << (info.perc_index) << "\n\n";
+ mlog << Error << "\ndo_simple_perc_thresh() -> "
+ << "bad percentile threshold type\n\n";
exit ( 1 );
@@ -3243,7 +3242,7 @@ s->T = bad_data_double;
s->PT = info.value;
-s->Ptype = perc_thresh_info[info.perc_index].type;
+s->Ptype = info.ptype;
//
// sanity check
@@ -3274,7 +3273,7 @@ if ( s->Ptype == perc_thresh_freq_bias && s->PT <= 0 ) {
if ( op >= 0 ) {
ConcatString cs;
- cs << perc_thresh_info[info.perc_index].short_name;
+ cs << perc_thresh_info_map.at(info.ptype).short_name;
cs << info.value;
fix_float(cs);
@@ -3303,11 +3302,10 @@ Simple_Node * s = new Simple_Node;
s->op = op;
-if ( (info.perc_index < 0) || (info.perc_index >= n_perc_thresh_infos) ) {
+if ( info.ptype == no_perc_thresh_type ) {
- mlog << Error
- << "\ndo_compound_perc_thresh() -> bad perc_index ... "
- << (info.perc_index) << "\n\n";
+ mlog << Error << "\ndo_compound_perc_thresh() -> "
+ << "bad percentile threshold type\n\n";
exit ( 1 );
@@ -3318,7 +3316,7 @@ else s->T = num.d;
s->PT = info.value;
-s->Ptype = perc_thresh_info[info.perc_index].type;
+s->Ptype = info.ptype;
//
// sanity check
@@ -3349,7 +3347,7 @@ if ( s->Ptype == perc_thresh_freq_bias && !is_eq(s->PT, 1.0) ) {
if ( op >= 0 ) {
ConcatString cs;
- cs << perc_thresh_info[info.perc_index].short_name;
+ cs << perc_thresh_info_map.at(info.ptype).short_name;
cs << info.value;
fix_float(cs);
cs << "(" << number_string << ")";
diff --git a/src/basic/vx_config/config.tab.yy b/src/basic/vx_config/config.tab.yy
index dabe56d786..cab56d64af 100644
--- a/src/basic/vx_config/config.tab.yy
+++ b/src/basic/vx_config/config.tab.yy
@@ -1623,11 +1623,10 @@ Simple_Node * s = new Simple_Node;
s->op = op;
-if ( (info.perc_index < 0) || (info.perc_index >= n_perc_thresh_infos) ) {
+if ( info.ptype == no_perc_thresh_type ) {
- mlog << Error
- << "\ndo_simple_perc_thresh() -> bad perc_index ... "
- << (info.perc_index) << "\n\n";
+ mlog << Error << "\ndo_simple_perc_thresh() -> "
+ << "bad percentile threshold type\n\n";
exit ( 1 );
@@ -1637,7 +1636,7 @@ s->T = bad_data_double;
s->PT = info.value;
-s->Ptype = perc_thresh_info[info.perc_index].type;
+s->Ptype = info.ptype;
//
// sanity check
@@ -1668,7 +1667,7 @@ if ( s->Ptype == perc_thresh_freq_bias && s->PT <= 0 ) {
if ( op >= 0 ) {
ConcatString cs;
- cs << perc_thresh_info[info.perc_index].short_name;
+ cs << perc_thresh_info_map.at(info.ptype).short_name;
cs << info.value;
fix_float(cs);
@@ -1697,11 +1696,10 @@ Simple_Node * s = new Simple_Node;
s->op = op;
-if ( (info.perc_index < 0) || (info.perc_index >= n_perc_thresh_infos) ) {
+if ( info.ptype == no_perc_thresh_type ) {
- mlog << Error
- << "\ndo_compound_perc_thresh() -> bad perc_index ... "
- << (info.perc_index) << "\n\n";
+ mlog << Error << "\ndo_compound_perc_thresh() -> "
+ << "bad percentile threshold type\n\n";
exit ( 1 );
@@ -1712,7 +1710,7 @@ else s->T = num.d;
s->PT = info.value;
-s->Ptype = perc_thresh_info[info.perc_index].type;
+s->Ptype = info.ptype;
//
// sanity check
@@ -1743,7 +1741,7 @@ if ( s->Ptype == perc_thresh_freq_bias && !is_eq(s->PT, 1.0) ) {
if ( op >= 0 ) {
ConcatString cs;
- cs << perc_thresh_info[info.perc_index].short_name;
+ cs << perc_thresh_info_map.at(info.ptype).short_name;
cs << info.value;
fix_float(cs);
cs << "(" << number_string << ")";
diff --git a/src/basic/vx_config/config_constants.h b/src/basic/vx_config/config_constants.h
index deb9a425fe..9f1366a681 100644
--- a/src/basic/vx_config/config_constants.h
+++ b/src/basic/vx_config/config_constants.h
@@ -297,7 +297,7 @@ struct InterpInfo {
void clear();
void validate(); // Ensure that width and method are accordant
bool operator==(const InterpInfo &) const;
- InterpInfo &operator=(const InterpInfo &a) noexcept; // SoanrQube findings
+ InterpInfo &operator=(const InterpInfo &a) noexcept; // SonarQube findings
};
////////////////////////////////////////////////////////////////////////
@@ -329,6 +329,7 @@ struct RegridInfo {
void validate(); // ensure that width and method are accordant
void validate_point(); // ensure that width and method are accordant
RegridInfo &operator=(const RegridInfo &a) noexcept; // SoanrQube findings
+ ConcatString get_str() const;
};
////////////////////////////////////////////////////////////////////////
@@ -461,6 +462,17 @@ enum class GridWeightType {
////////////////////////////////////////////////////////////////////////
+//
+// Enumeration for point_weight_flag configuration parameter
+//
+
+enum class PointWeightType {
+ None, // Apply no point weighting
+ SID // Apply station ID weighting
+};
+
+////////////////////////////////////////////////////////////////////////
+
//
// Enumeration for grid_decomp_flag configuration parameter
//
@@ -537,6 +549,7 @@ static const char conf_key_model[] = "model";
static const char conf_key_desc[] = "desc";
static const char conf_key_obtype[] = "obtype";
static const char conf_key_output_flag[] = "output_flag";
+static const char conf_key_obtype_as_group_val_flag[] = "obtype_as_group_val_flag";
static const char conf_key_obs_window[] = "obs_window";
static const char conf_key_beg[] = "beg";
static const char conf_key_end[] = "end";
@@ -612,6 +625,8 @@ static const char conf_key_mask_sid[] = "mask.sid";
static const char conf_key_mask_llpnt[] = "mask.llpnt";
static const char conf_key_lat_thresh[] = "lat_thresh";
static const char conf_key_lon_thresh[] = "lon_thresh";
+static const char conf_key_lat_vname[] = "lat_vname";
+static const char conf_key_lon_vname[] = "lon_vname";
static const char conf_key_ci_alpha[] = "ci_alpha";
static const char conf_key_time_summary[] = "time_summary";
static const char conf_key_flag[] = "flag";
@@ -690,7 +705,9 @@ static const char conf_key_obs_to_qc_map[] = "obs_to_qc_map";
static const char conf_key_missing_thresh[] = "missing_thresh";
static const char conf_key_control_id[] = "control_id";
static const char conf_key_ens_member_ids[] = "ens_member_ids";
-static const char conf_key_seeps_p1_thresh[] = "seeps_p1_thresh";
+static const char conf_key_seeps_grid_climo_name[] = "seeps_grid_climo_name";
+static const char conf_key_seeps_point_climo_name[] = "seeps_point_climo_name";
+static const char conf_key_seeps_p1_thresh[] = "seeps_p1_thresh";
static const char conf_key_ugrid_coordinates_file[] = "ugrid_coordinates_file";
static const char conf_key_ugrid_dataset[] = "ugrid_dataset";
static const char conf_key_ugrid_map_config[] = "ugrid_map_config";
@@ -719,10 +736,16 @@ static const char conf_key_is_wind_direction[] = "is_wind_direction";
static const char conf_key_is_prob[] = "is_prob";
//
-// Climatology parameter key names
+// Climatology data parameter key names
+//
+static const char conf_key_climo_mean[] = "climo_mean";
+static const char conf_key_climo_mean_field[] = "climo_mean.field";
+static const char conf_key_climo_stdev[] = "climo_stdev";
+static const char conf_key_climo_stdev_field[] = "climo_stdev.field";
+
+//
+// Climatology distribution parameter key names
//
-static const char conf_key_climo_mean_field[] = "climo_mean.field";
-static const char conf_key_climo_stdev_field[] = "climo_stdev.field";
static const char conf_key_climo_cdf[] = "climo_cdf";
static const char conf_key_cdf_bins[] = "cdf_bins";
static const char conf_key_center_bins[] = "center_bins";
@@ -742,6 +765,7 @@ static const char conf_key_topo_mask[] = "topo_mask";
static const char conf_key_topo_mask_flag[] = "topo_mask.flag";
static const char conf_key_use_obs_thresh[] = "use_obs_thresh";
static const char conf_key_interp_fcst_thresh[] = "interp_fcst_thresh";
+static const char conf_key_point_weight_flag[] = "point_weight_flag";
//
// Grid-Stat specific parameter key names
@@ -1289,6 +1313,9 @@ static const char conf_val_bca[] = "BCA";
static const char conf_val_cos_lat[] = "COS_LAT";
static const char conf_val_area[] = "AREA";
+// Point weight flag values
+static const char conf_val_sid[] = "SID";
+
// Duplicate flag values
static const char conf_val_unique[] = "UNIQUE";
diff --git a/src/basic/vx_config/config_util.cc b/src/basic/vx_config/config_util.cc
index 344f997bea..a4323a23b1 100644
--- a/src/basic/vx_config/config_util.cc
+++ b/src/basic/vx_config/config_util.cc
@@ -14,6 +14,7 @@
#include "config_util.h"
#include "enum_as_int.hpp"
+#include "configobjecttype_to_string.h"
#include "vx_math.h"
#include "vx_util.h"
@@ -265,6 +266,13 @@ RegridInfo &RegridInfo::operator=(const RegridInfo &a) noexcept {
return *this;
}
+///////////////////////////////////////////////////////////////////////////////
+
+ConcatString RegridInfo::get_str() const {
+ ConcatString cs(interpmthd_to_string(method));
+ cs << "(" << width << ")";
+ return cs;
+}
///////////////////////////////////////////////////////////////////////////////
@@ -592,16 +600,14 @@ StringArray parse_conf_message_type(Dictionary *dict, bool error_out) {
///////////////////////////////////////////////////////////////////////////////
StringArray parse_conf_sid_list(Dictionary *dict, const char *conf_key) {
- StringArray sa, cur, sid_sa;
- ConcatString mask_name;
+ StringArray sid_sa;
const char *method_name = "parse_conf_sid_list() -> ";
- sa = parse_conf_string_array(dict, conf_key, method_name);
+ StringArray sa(parse_conf_string_array(dict, conf_key, method_name));
- // Parse station ID's to exclude from each entry
+ // Append to the list of station ID's
for(int i=0; i ";
// Check for an empty length string
- if(mask_sid_str.empty()) return;
+ if(mask_sid_str.empty()) return mask_sid;
// Replace any instances of MET_BASE with it's expanded value
- tmp_file = replace_path(mask_sid_str.c_str());
+ ConcatString tmp_file(replace_path(mask_sid_str.c_str()));
// Process file name
if(file_exists(tmp_file.c_str())) {
- mlog << Debug(4) << "parse_sid_mask() -> "
+ mlog << Debug(4) << method_name
<< "parsing station ID masking file \"" << tmp_file << "\"\n";
// Open the mask station id file specified
+ ifstream in;
in.open(tmp_file.c_str());
if(!in) {
- mlog << Error << "\nparse_sid_mask() -> "
+ mlog << Error << "\n" << method_name
<< "Can't open the station ID masking file \""
<< tmp_file << "\".\n\n";
exit(1);
@@ -657,7 +659,7 @@ void parse_sid_mask(const ConcatString &mask_sid_str,
// Store the first entry as the name of the mask
in >> sid_str;
- mask_name = sid_str;
+ mask_sid.set_name(sid_str);
// Store the rest of the entries as masking station ID's
while(in >> sid_str) mask_sid.add(sid_str.c_str());
@@ -665,9 +667,9 @@ void parse_sid_mask(const ConcatString &mask_sid_str,
// Close the input file
in.close();
- mlog << Debug(4) << "parse_sid_mask() -> "
+ mlog << Debug(4) << method_name
<< "parsed " << mask_sid.n() << " station ID's for the \""
- << mask_name << "\" mask from file \"" << tmp_file << "\"\n";
+ << mask_sid.name() << "\" mask from file \"" << tmp_file << "\"\n";
}
// Process list of strings
else {
@@ -675,19 +677,19 @@ void parse_sid_mask(const ConcatString &mask_sid_str,
// Print a warning if the string contains a dot which suggests
// the user was trying to specify a file name.
if(check_reg_exp("[.]", mask_sid_str.c_str())) {
- mlog << Warning << "\nparse_sid_mask() -> "
+ mlog << Warning << "\n" << method_name
<< "unable to process \"" << mask_sid_str
<< "\" as a file name and processing it as a single "
<< "station ID mask instead.\n\n";
}
- mlog << Debug(4) << "parse_sid_mask() -> "
+ mlog << Debug(4) << method_name
<< "storing single station ID mask \"" << mask_sid_str << "\"\n";
// Check for embedded whitespace or slashes
if(check_reg_exp(ws_reg_exp, mask_sid_str.c_str()) ||
check_reg_exp("[/]", mask_sid_str.c_str())) {
- mlog << Error << "\nparse_sid_mask() -> "
+ mlog << Error << "\n" << method_name
<< "masking station ID string can't contain whitespace or "
<< "slashes \"" << mask_sid_str << "\".\n\n";
exit(1);
@@ -700,15 +702,16 @@ void parse_sid_mask(const ConcatString &mask_sid_str,
// One elements means no colon was specified
if(sa.n() == 1) {
mask_sid.add_css(sa[0]);
- mask_name = ( mask_sid.n() == 1 ? mask_sid[0] : "MASK_SID" );
+ mask_sid.set_name((mask_sid.n() == 1 ?
+ mask_sid.sid_map().begin()->first : "MASK_SID"));
}
// Two elements means one colon was specified
else if(sa.n() == 2) {
- mask_name = sa[0];
mask_sid.add_css(sa[1]);
+ mask_sid.set_name(sa[0]);
}
else {
- mlog << Error << "\nparse_sid_mask() -> "
+ mlog << Error << "\n" << method_name
<< "masking station ID string may contain at most one colon to "
<< "specify the mask name \"" << mask_sid_str << "\".\n\n";
exit(1);
@@ -716,14 +719,26 @@ void parse_sid_mask(const ConcatString &mask_sid_str,
}
- // Sort the mask_sid's
- mask_sid.sort();
-
- return;
+ return mask_sid;
}
///////////////////////////////////////////////////////////////////////////////
+StringArray parse_sid_mask_as_list(const ConcatString &mask_sid_str) {
+
+ MaskSID ms = parse_sid_mask(mask_sid_str);
+
+ StringArray sa;
+ for(const auto &pair : ms.sid_map()) sa.add(pair.first);
+
+ return sa;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Code for MaskLatLon struct
+//
+///////////////////////////////////////////////////////////////////////////////
void MaskLatLon::clear() {
name.clear();
@@ -756,7 +771,6 @@ MaskLatLon &MaskLatLon::operator=(const MaskLatLon &a) noexcept {
return *this;
}
-
///////////////////////////////////////////////////////////////////////////////
vector parse_conf_llpnt_mask(Dictionary *dict) {
@@ -1331,13 +1345,10 @@ BootInfo parse_conf_boot(Dictionary *dict) {
return info;
}
-
///////////////////////////////////////////////////////////////////////////////
-RegridInfo parse_conf_regrid(Dictionary *dict, bool error_out) {
- Dictionary *regrid_dict = (Dictionary *) nullptr;
+RegridInfo parse_conf_regrid(Dictionary *dict, RegridInfo *default_info, bool error_out) {
RegridInfo info;
- int v;
if(!dict) {
mlog << Error << "\nparse_conf_regrid() -> "
@@ -1346,10 +1357,10 @@ RegridInfo parse_conf_regrid(Dictionary *dict, bool error_out) {
}
// Conf: regrid
- regrid_dict = dict->lookup_dictionary(conf_key_regrid, false);
+ Dictionary *regrid_dict = dict->lookup_dictionary(conf_key_regrid, false);
// Check that the regrid dictionary is present
- if(!regrid_dict) {
+ if(!regrid_dict && !default_info) {
if(error_out) {
mlog << Error << "\nparse_conf_regrid() -> "
<< "can't find the \"regrid\" dictionary!\n\n";
@@ -1360,61 +1371,164 @@ RegridInfo parse_conf_regrid(Dictionary *dict, bool error_out) {
}
}
- // Parse to_grid as an integer
- v = regrid_dict->lookup_int(conf_key_to_grid, false, false);
+ // Conf: to_grid (optional) as an integer or string
+ const DictionaryEntry * entry = nullptr;
+
+ if(regrid_dict) entry = regrid_dict->lookup(conf_key_to_grid, false);
- // If integer lookup successful, convert to FieldType.
- if(regrid_dict->last_lookup_status()) {
- info.field = int_to_fieldtype(v);
- info.enable = (info.field == FieldType::Fcst ||
- info.field == FieldType::Obs);
+ // to_grid found
+ if(entry) {
+
+ // Convert integer to FieldType
+ if(entry->type() == IntegerType) {
+ info.field = int_to_fieldtype(entry->i_value());
+ info.enable = (info.field == FieldType::Fcst ||
+ info.field == FieldType::Obs);
+ }
+ // Store grid name string
+ else if(entry->type() == StringType) {
+ info.name = entry->string_value();
+ info.enable = true;
+ }
+ else {
+ mlog << Error << "\nparse_conf_regrid() -> "
+ << "Unexpected type ("
+ << configobjecttype_to_string(entry->type())
+ << ") for \"" << conf_key_to_grid
+ << "\" configuration entry.\n\n";
+ exit(1);
+ }
+ }
+ // Use default RegridInfo
+ else if(default_info){
+ info.name = default_info->name;
+ info.enable = default_info->enable;
}
- // If integer lookup unsuccessful, parse vx_grid as a string.
- // Do not error out since to_grid isn't specified for climo.regrid.
+ // Use global default
else {
- info.name = regrid_dict->lookup_string(conf_key_to_grid, false);
+ info.name = "";
info.enable = true;
}
- // Conf: vld_thresh
- double thr = regrid_dict->lookup_double(conf_key_vld_thresh, false);
- info.vld_thresh = (is_bad_data(thr) ? default_vld_thresh : thr);
+ // Conf: vld_thresh (required)
+ if(regrid_dict && regrid_dict->lookup(conf_key_vld_thresh, false)) {
+ info.vld_thresh = regrid_dict->lookup_double(conf_key_vld_thresh);
+ }
+ // Use default RegridInfo
+ else if(default_info) {
+ info.vld_thresh = default_info->vld_thresh;
+ }
+ // Use global default
+ else {
+ info.vld_thresh = default_vld_thresh;
+ }
- // Parse the method and width
- info.method = int_to_interpmthd(regrid_dict->lookup_int(conf_key_method));
- info.width = regrid_dict->lookup_int(conf_key_width);
+ // Conf: method (required)
+ if(regrid_dict && regrid_dict->lookup(conf_key_method, false)) {
+ info.method = int_to_interpmthd(regrid_dict->lookup_int(conf_key_method));
+ }
+ // Use default RegridInfo
+ else if(default_info) {
+ info.method = default_info->method;
+ }
- // Conf: shape
- v = regrid_dict->lookup_int(conf_key_shape, false);
- if (regrid_dict->last_lookup_status()) {
- info.shape = int_to_gridtemplate(v);
+ // Conf: width (required)
+ if(regrid_dict && regrid_dict->lookup(conf_key_width, false)) {
+ info.width = regrid_dict->lookup_int(conf_key_width);
+ }
+ // Use default RegridInfo
+ else if(default_info) {
+ info.width = default_info->width;
+ }
+
+ // Conf: shape (optional)
+ if(regrid_dict && regrid_dict->lookup(conf_key_shape, false)) {
+ info.shape = int_to_gridtemplate(regrid_dict->lookup_int(conf_key_shape));
+ }
+ // Use default RegridInfo
+ else if(default_info) {
+ info.shape = default_info->shape;
}
+ // Use global default
else {
- // If not specified, use the default square shape
info.shape = GridTemplateFactory::GridTemplates::Square;
}
- // Conf: gaussian dx and radius
- double conf_value = regrid_dict->lookup_double(conf_key_gaussian_dx, false);
- info.gaussian.dx = (is_bad_data(conf_value) ? default_gaussian_dx : conf_value);
- conf_value = regrid_dict->lookup_double(conf_key_gaussian_radius, false);
- info.gaussian.radius = (is_bad_data(conf_value) ? default_gaussian_radius : conf_value);
- conf_value = regrid_dict->lookup_double(conf_key_trunc_factor, false);
- info.gaussian.trunc_factor = (is_bad_data(conf_value) ? default_trunc_factor : conf_value);
- if (info.method == InterpMthd::Gaussian || info.method == InterpMthd::MaxGauss) info.gaussian.compute();
+ // Conf: gaussian_dx (optional)
+ if(regrid_dict && regrid_dict->lookup(conf_key_gaussian_dx, false)) {
+ info.gaussian.dx = regrid_dict->lookup_double(conf_key_gaussian_dx);
+ }
+ // Use default RegridInfo
+ else if(default_info) {
+ info.gaussian.dx = default_info->gaussian.dx;
+ }
+ // Use global default
+ else {
+ info.gaussian.dx = default_gaussian_dx;
+ }
+
+ // Conf: gaussian_radius (optional)
+ if(regrid_dict && regrid_dict->lookup(conf_key_gaussian_radius, false)) {
+ info.gaussian.radius = regrid_dict->lookup_double(conf_key_gaussian_radius);
+ }
+ // Use default RegridInfo
+ else if(default_info) {
+ info.gaussian.radius = default_info->gaussian.radius;
+ }
+ // Use global default
+ else {
+ info.gaussian.radius = default_gaussian_radius;
+ }
+
+ // Conf: gaussian_trunc_factor (optional)
+ if(regrid_dict && regrid_dict->lookup(conf_key_trunc_factor, false)) {
+ info.gaussian.trunc_factor = regrid_dict->lookup_double(conf_key_trunc_factor);
+ }
+ // Use default RegridInfo
+ else if(default_info) {
+ info.gaussian.trunc_factor = default_info->gaussian.trunc_factor;
+ }
+ // Use global default
+ else {
+ info.gaussian.trunc_factor = default_trunc_factor;
+ }
+
+ // Compute Guassian parameters
+ if(info.method == InterpMthd::Gaussian ||
+ info.method == InterpMthd::MaxGauss) {
+ info.gaussian.compute();
+ }
// MET#2437 Do not search the higher levels of config file context for convert,
// censor_thresh, and censor_val. They must be specified within the
// regrid dictionary itself.
- // Conf: convert
- info.convert_fx.set(regrid_dict->lookup(conf_key_convert, false));
+ // Conf: convert (optional)
+ if(regrid_dict && regrid_dict->lookup(conf_key_convert, false)) {
+ info.convert_fx.set(regrid_dict->lookup(conf_key_convert));
+ }
+ // Use default RegridInfo
+ else if(default_info) {
+ info.convert_fx = default_info->convert_fx;
+ }
- // Conf: censor_thresh
- info.censor_thresh = regrid_dict->lookup_thresh_array(conf_key_censor_thresh, false, true, false);
+ // Conf: censor_thresh (optional)
+ if(regrid_dict && regrid_dict->lookup(conf_key_censor_thresh, false)) {
+ info.censor_thresh = regrid_dict->lookup_thresh_array(conf_key_censor_thresh);
+ }
+ // Use default RegridInfo
+ else if(default_info) {
+ info.censor_thresh = default_info->censor_thresh;
+ }
- // Conf: censor_val
- info.censor_val = regrid_dict->lookup_num_array(conf_key_censor_val, false, true, false);
+ // Conf: censor_val (optional)
+ if(regrid_dict && regrid_dict->lookup(conf_key_censor_val, false)) {
+ info.censor_val = regrid_dict->lookup_num_array(conf_key_censor_val);
+ }
+ // Use default RegridInfo
+ else if(default_info) {
+ info.censor_val = default_info->censor_val;
+ }
// Validate the settings
info.validate();
@@ -2081,9 +2195,10 @@ HiRAInfo parse_conf_hira(Dictionary *dict) {
GridWeightType parse_conf_grid_weight_flag(Dictionary *dict) {
GridWeightType t = GridWeightType::None;
int v;
+ const char *method_name = "parse_conf_grid_weight_flag() -> ";
if(!dict) {
- mlog << Error << "\nparse_conf_grid_weight_flag() -> "
+ mlog << Error << "\n" << method_name
<< "empty dictionary!\n\n";
exit(1);
}
@@ -2096,7 +2211,7 @@ GridWeightType parse_conf_grid_weight_flag(Dictionary *dict) {
else if(v == conf_const.lookup_int(conf_val_cos_lat)) t = GridWeightType::Cos_Lat;
else if(v == conf_const.lookup_int(conf_val_area)) t = GridWeightType::Area;
else {
- mlog << Error << "\nparse_conf_grid_weight_flag() -> "
+ mlog << Error << "\n" << method_name
<< "Unexpected config file value of " << v << " for \""
<< conf_key_grid_weight_flag << "\".\n\n";
exit(1);
@@ -2107,6 +2222,35 @@ GridWeightType parse_conf_grid_weight_flag(Dictionary *dict) {
///////////////////////////////////////////////////////////////////////////////
+PointWeightType parse_conf_point_weight_flag(Dictionary *dict) {
+ PointWeightType t = PointWeightType::None;
+ int v;
+ const char *method_name = "parse_conf_point_weight_flag() -> ";
+
+ if(!dict) {
+ mlog << Error << "\n" << method_name
+ << "empty dictionary!\n\n";
+ exit(1);
+ }
+
+ // Get the integer flag value for the current entry
+ v = dict->lookup_int(conf_key_point_weight_flag);
+
+ // Convert integer to enumerated GridWeightType
+ if(v == conf_const.lookup_int(conf_val_none)) t = PointWeightType::None;
+ else if(v == conf_const.lookup_int(conf_val_sid)) t = PointWeightType::SID;
+ else {
+ mlog << Error << "\n" << method_name
+ << "Unexpected config file value of " << v << " for \""
+ << conf_key_point_weight_flag << "\".\n\n";
+ exit(1);
+ }
+
+ return t;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
DuplicateType parse_conf_duplicate_flag(Dictionary *dict) {
DuplicateType t = DuplicateType::None;
int v;
@@ -2514,28 +2658,28 @@ void check_mask_names(const StringArray &sa) {
///////////////////////////////////////////////////////////////////////////////
-void check_climo_n_vx(Dictionary *dict, const int n_vx) {
- int n;
+void check_climo_n_vx(Dictionary *dict, const int n_input) {
+ int n_climo;
// Check for a valid number of climatology mean fields
- n = parse_conf_n_vx(dict->lookup_array(conf_key_climo_mean_field, false));
- if(n != 0 && n != n_vx) {
+ n_climo = parse_conf_n_vx(dict->lookup_array(conf_key_climo_mean_field, false));
+ if(n_climo != 0 && n_climo != 1 && n_climo != n_input) {
mlog << Error << "\ncheck_climo_n_vx() -> "
<< "The number of climatology mean fields in \""
- << conf_key_climo_mean_field
- << "\" must be zero or match the number (" << n_vx
- << ") in \"" << conf_key_fcst_field << "\".\n\n";
+ << conf_key_climo_mean_field << "\" (" << n_climo
+ << ") must be 0, 1, or match the number of input fields ("
+ << n_input << ").\n\n";
exit(1);
}
// Check for a valid number of climatology standard deviation fields
- n = parse_conf_n_vx(dict->lookup_array(conf_key_climo_stdev_field, false));
- if(n != 0 && n != n_vx) {
+ n_climo = parse_conf_n_vx(dict->lookup_array(conf_key_climo_stdev_field, false));
+ if(n_climo != 0 && n_climo != 1 && n_climo != n_input) {
mlog << Error << "\ncheck_climo_n_vx() -> "
<< "The number of climatology standard deviation fields in \""
- << conf_key_climo_stdev_field
- << "\" must be zero or match the number ("
- << n_vx << ") in \"" << conf_key_fcst_field << "\".\n\n";
+ << conf_key_climo_stdev_field << "\" (" << n_climo
+ << ") must be 0, 1, or match the number of input fields ("
+ << n_input << ").\n\n";
exit(1);
}
diff --git a/src/basic/vx_config/config_util.h b/src/basic/vx_config/config_util.h
index 3dae869b2b..885fa6fb2e 100644
--- a/src/basic/vx_config/config_util.h
+++ b/src/basic/vx_config/config_util.h
@@ -31,18 +31,32 @@ static const char conf_key_old_prepbufr_map[] = "obs_prefbufr_map"; // for ba
////////////////////////////////////////////////////////////////////////
extern ConcatString parse_conf_version(Dictionary *dict);
-extern ConcatString parse_conf_string(Dictionary *dict, const char *, bool check_empty = true);
+extern ConcatString parse_conf_string(
+ Dictionary *dict,
+ const char *,
+ bool check_empty=true);
extern GrdFileType parse_conf_file_type(Dictionary *dict);
extern std::map
- parse_conf_output_flag(Dictionary *dict, const STATLineType *, int);
+ parse_conf_output_flag(
+ Dictionary *dict,
+ const STATLineType *, int);
extern std::map
parse_conf_output_stats(Dictionary *dict);
extern int parse_conf_n_vx(Dictionary *dict);
-extern Dictionary parse_conf_i_vx_dict(Dictionary *dict, int index);
-extern StringArray parse_conf_tc_model(Dictionary *dict, bool error_out = default_dictionary_error_out);
-extern StringArray parse_conf_message_type(Dictionary *dict, bool error_out = default_dictionary_error_out);
-extern StringArray parse_conf_sid_list(Dictionary *dict, const char *);
-extern void parse_sid_mask(const ConcatString &, StringArray &, ConcatString &);
+extern Dictionary parse_conf_i_vx_dict(
+ Dictionary *dict,
+ int index);
+extern StringArray parse_conf_tc_model(
+ Dictionary *dict,
+ bool error_out=default_dictionary_error_out);
+extern StringArray parse_conf_message_type(
+ Dictionary *dict,
+ bool error_out=default_dictionary_error_out);
+extern StringArray parse_conf_sid_list(
+ Dictionary *dict,
+ const char *);
+extern MaskSID parse_sid_mask(const ConcatString &);
+extern StringArray parse_sid_mask_as_list(const ConcatString &);
extern std::vector
parse_conf_llpnt_mask(Dictionary *dict);
extern StringArray parse_conf_obs_qty_inc(Dictionary *dict);
@@ -51,31 +65,45 @@ extern NumArray parse_conf_ci_alpha(Dictionary *dict);
extern NumArray parse_conf_eclv_points(Dictionary *dict);
extern ClimoCDFInfo parse_conf_climo_cdf(Dictionary *dict);
extern TimeSummaryInfo parse_conf_time_summary(Dictionary *dict);
-extern std::map parse_conf_key_value_map(
- Dictionary *dict, const char *conf_key_map_name, const char *caller=nullptr);
+extern std::map
+ parse_conf_key_value_map(
+ Dictionary *dict,
+ const char *conf_key_map_name,
+ const char *caller=nullptr);
extern void parse_add_conf_key_value_map(
- Dictionary *dict, const char *conf_key_map_name, std::map *m);
+ Dictionary *dict,
+ const char *conf_key_map_name,
+ std::map *m);
extern void parse_add_conf_key_values_map(
- Dictionary *dict, const char *conf_key_map_name,
- std::map *m, const char *caller=nullptr);
+ Dictionary *dict,
+ const char *conf_key_map_name,
+ std::map *m,
+ const char *caller=nullptr);
extern std::map
parse_conf_message_type_map(Dictionary *dict);
extern std::map
parse_conf_message_type_group_map(Dictionary *dict);
-extern std::map parse_conf_metadata_map(Dictionary *dict);
+extern std::map
+ parse_conf_metadata_map(Dictionary *dict);
extern std::map
parse_conf_obs_name_map(Dictionary *dict);
extern std::map
parse_conf_obs_to_qc_map(Dictionary *dict);
extern std::map
parse_conf_key_convert_map(
- Dictionary *dict, const char *conf_key_map_name, const char *caller=nullptr);
+ Dictionary *dict,
+ const char *conf_key_map_name,
+ const char *caller=nullptr);
extern BootInfo parse_conf_boot(Dictionary *dict);
-extern RegridInfo parse_conf_regrid(Dictionary *dict, bool error_out = default_dictionary_error_out);
+extern RegridInfo parse_conf_regrid(
+ Dictionary *dict,
+ RegridInfo *default_info=nullptr,
+ bool error_out=default_dictionary_error_out);
extern InterpInfo parse_conf_interp(Dictionary *dict, const char *);
extern NbrhdInfo parse_conf_nbrhd(Dictionary *dict, const char *);
extern HiRAInfo parse_conf_hira(Dictionary *dict);
extern GridWeightType parse_conf_grid_weight_flag(Dictionary *dict);
+extern PointWeightType parse_conf_point_weight_flag(Dictionary *dict);
extern DuplicateType parse_conf_duplicate_flag(Dictionary *dict);
extern ObsSummary parse_conf_obs_summary(Dictionary *dict);
extern ConcatString parse_conf_tmp_dir(Dictionary *dict);
@@ -92,7 +120,9 @@ extern ConcatString parse_conf_ugrid_coordinates_file(Dictionary *dict);
extern ConcatString parse_conf_ugrid_dataset(Dictionary *dict);
extern ConcatString parse_conf_ugrid_map_config(Dictionary *dict);
extern double parse_conf_ugrid_max_distance_km(Dictionary *dict);
-extern void parse_add_conf_ugrid_metadata_map(Dictionary *dict, std::map *m);
+extern void parse_add_conf_ugrid_metadata_map(
+ Dictionary *dict,
+ std::map *m);
extern void check_mask_names(const StringArray &);
diff --git a/src/basic/vx_config/dictionary.h b/src/basic/vx_config/dictionary.h
index 742789000b..bcb4a7f34b 100644
--- a/src/basic/vx_config/dictionary.h
+++ b/src/basic/vx_config/dictionary.h
@@ -154,9 +154,9 @@ class DictionaryEntry {
////////////////////////////////////////////////////////////////////////
-inline ConfigObjectType DictionaryEntry::type() const { return ( Type ); }
+inline ConfigObjectType DictionaryEntry::type() const { return Type; }
-inline ConcatString DictionaryEntry::name() const { return ( Name ); }
+inline ConcatString DictionaryEntry::name() const { return Name; }
inline bool DictionaryEntry::is_number() const { return ( (Type == IntegerType) || (Type == FloatType) ); }
@@ -164,11 +164,11 @@ inline bool DictionaryEntry::is_dictionary() const { return ( Type == Dictionary
inline bool DictionaryEntry::is_array() const { return ( Type == ArrayType ); }
-inline int DictionaryEntry::n_args() const { return ( Nargs ); }
+inline int DictionaryEntry::n_args() const { return Nargs; }
-inline const IcodeVector * DictionaryEntry::icv() const { return ( v ); }
+inline const IcodeVector * DictionaryEntry::icv() const { return v; }
-inline Dictionary * DictionaryEntry::dict() const { return ( Dict ); }
+inline Dictionary * DictionaryEntry::dict() const { return Dict; }
////////////////////////////////////////////////////////////////////////
@@ -243,7 +243,7 @@ class Dictionary {
virtual const DictionaryEntry * operator[](int) const;
- virtual const Dictionary * parent() const;
+ virtual Dictionary * parent() const;
virtual bool is_array() const;
@@ -344,15 +344,15 @@ class Dictionary {
////////////////////////////////////////////////////////////////////////
-inline int Dictionary::n_entries() const { return ( Nentries ); }
+inline int Dictionary::n_entries() const { return Nentries; }
-inline const Dictionary * Dictionary::parent() const { return ( Parent ); }
+inline Dictionary * Dictionary::parent() const { return Parent; }
inline void Dictionary::set_is_array(bool __tf) { IsArray = __tf; return; }
-inline bool Dictionary::is_array() const { return ( IsArray ); }
+inline bool Dictionary::is_array() const { return IsArray; }
-inline bool Dictionary::last_lookup_status() const { return ( LastLookupStatus ); }
+inline bool Dictionary::last_lookup_status() const { return LastLookupStatus; }
////////////////////////////////////////////////////////////////////////
@@ -434,7 +434,7 @@ class DictionaryStack {
////////////////////////////////////////////////////////////////////////
-inline int DictionaryStack::n_elements () const { return ( Nelements ); }
+inline int DictionaryStack::n_elements () const { return Nelements; }
////////////////////////////////////////////////////////////////////////
diff --git a/src/basic/vx_config/icode.h b/src/basic/vx_config/icode.h
index d344b797dd..6e99455933 100644
--- a/src/basic/vx_config/icode.h
+++ b/src/basic/vx_config/icode.h
@@ -216,7 +216,7 @@ class IcodeVector {
////////////////////////////////////////////////////////////////////////
-inline int IcodeVector::length() const { return ( Ncells ); }
+inline int IcodeVector::length() const { return Ncells; }
////////////////////////////////////////////////////////////////////////
@@ -267,7 +267,7 @@ class CellStack {
////////////////////////////////////////////////////////////////////////
-inline int CellStack::depth() const { return ( Depth ); }
+inline int CellStack::depth() const { return Depth; }
////////////////////////////////////////////////////////////////////////
@@ -319,7 +319,7 @@ class ICVStack {
////////////////////////////////////////////////////////////////////////
-inline int ICVStack::depth() const { return ( Depth ); }
+inline int ICVStack::depth() const { return Depth; }
////////////////////////////////////////////////////////////////////////
@@ -358,7 +358,7 @@ class ICVQueue {
////////////////////////////////////////////////////////////////////////
-inline int ICVQueue::n_elements() const { return ( Nelements ); }
+inline int ICVQueue::n_elements() const { return Nelements; }
////////////////////////////////////////////////////////////////////////
@@ -402,7 +402,7 @@ class ICVArray {
////////////////////////////////////////////////////////////////////////
-inline int ICVArray::n_elements() const { return ( Nelements ); }
+inline int ICVArray::n_elements() const { return Nelements; }
////////////////////////////////////////////////////////////////////////
diff --git a/src/basic/vx_config/idstack.h b/src/basic/vx_config/idstack.h
index 7c274744d4..ab45105b1c 100644
--- a/src/basic/vx_config/idstack.h
+++ b/src/basic/vx_config/idstack.h
@@ -101,7 +101,7 @@ class IdentifierQueue {
////////////////////////////////////////////////////////////////////////
-inline int IdentifierQueue::n_elements() const { return ( Nelements ); }
+inline int IdentifierQueue::n_elements() const { return Nelements; }
////////////////////////////////////////////////////////////////////////
@@ -153,7 +153,7 @@ class IdentifierArray {
////////////////////////////////////////////////////////////////////////
-inline int IdentifierArray::n_elements() const { return ( Nelements ); }
+inline int IdentifierArray::n_elements() const { return Nelements; }
////////////////////////////////////////////////////////////////////////
diff --git a/src/basic/vx_config/my_config_scanner.cc b/src/basic/vx_config/my_config_scanner.cc
index 13e41a196c..25a5cec234 100644
--- a/src/basic/vx_config/my_config_scanner.cc
+++ b/src/basic/vx_config/my_config_scanner.cc
@@ -514,7 +514,7 @@ int do_id()
{
-int j, k;
+int j;
const char *method_name = "do_id() -> ";
Column += m_strlen(configtext);
@@ -618,15 +618,7 @@ for (j=0; j "
<< "unable to parse string \"" << configtext << "\"\n\n";
@@ -1475,10 +1436,6 @@ if ( index < 0 ) {
}
-configlval.pc_info.perc_index = index;
-configlval.pc_info.value = value;
-
-
return SIMPLE_PERC_THRESH;
}
diff --git a/src/basic/vx_config/number_stack.h b/src/basic/vx_config/number_stack.h
index 298a1b73ca..0a64f7323b 100644
--- a/src/basic/vx_config/number_stack.h
+++ b/src/basic/vx_config/number_stack.h
@@ -95,7 +95,7 @@ class NumberStack {
////////////////////////////////////////////////////////////////////////
-inline int NumberStack::depth() const { return ( Nelements ); }
+inline int NumberStack::depth() const { return Nelements; }
////////////////////////////////////////////////////////////////////////
diff --git a/src/basic/vx_config/threshold.cc b/src/basic/vx_config/threshold.cc
index 2bf216e084..ef650ef2c0 100644
--- a/src/basic/vx_config/threshold.cc
+++ b/src/basic/vx_config/threshold.cc
@@ -36,6 +36,12 @@ extern ThreshNode * result;
extern bool test_mode;
+extern const std::string scp_perc_thresh_type_str("SCP");
+
+extern const std::string cdp_perc_thresh_type_str("CDP");
+
+static bool print_climo_perc_thresh_log_message = true;
+
////////////////////////////////////////////////////////////////////////
@@ -49,6 +55,91 @@ return ( t == thresh_le || t == thresh_ge || t == thresh_eq );
}
+////////////////////////////////////////////////////////////////////////
+
+
+bool is_climo_dist_type(PercThreshType t)
+
+{
+
+return ( t == perc_thresh_fcst_climo_dist ||
+ t == perc_thresh_obs_climo_dist );
+
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+
+bool parse_perc_thresh(const char *str, PC_info *info)
+
+{
+
+bool match = false;
+
+if ( perc_thresh_info_map.empty() ) return false;
+
+ConcatString search_cs(str);
+
+for (auto const& x : perc_thresh_info_map) {
+
+ if ( search_cs.startswith(x.second.short_name.c_str()) &&
+ is_number(str + x.second.short_name.size()) ) {
+
+ if ( info ) {
+
+ info->ptype = x.first;
+
+ info->value = atof(str + x.second.short_name.size());
+
+ }
+
+ match = true;
+
+ break;
+
+ }
+
+}
+
+ //
+ // MET #2924 Backward compatible support for SCP and CDP types
+ //
+
+if ( !match &&
+ (search_cs.startswith(scp_perc_thresh_type_str.c_str()) ||
+ search_cs.startswith(cdp_perc_thresh_type_str.c_str())) ) {
+
+ if ( print_climo_perc_thresh_log_message ) {
+
+ mlog << Debug(2) << R"(Please replace the deprecated "SCP" and "CDP" )"
+ << R"(threshold types with "SOCP" and "OCDP", respectively, in the ")"
+ << str << R"(" threshold string.)" << "\n";
+
+ print_climo_perc_thresh_log_message = false;
+
+ }
+
+ ConcatString cs;
+
+ if ( search_cs.startswith(scp_perc_thresh_type_str.c_str()) ) {
+ cs << perc_thresh_info_map.at(perc_thresh_sample_obs_climo).short_name;
+ cs << str + scp_perc_thresh_type_str.size();
+ }
+ else {
+ cs << perc_thresh_info_map.at(perc_thresh_obs_climo_dist).short_name;
+ cs << str + cdp_perc_thresh_type_str.size();
+ }
+
+ return parse_perc_thresh(cs.c_str(), info);
+
+}
+
+return match;
+
+}
+
+
////////////////////////////////////////////////////////////////////////
@@ -119,27 +210,15 @@ if ( right_child ) { delete right_child; right_child = nullptr; }
////////////////////////////////////////////////////////////////////////
-bool Or_Node::check(double x) const
-
-{
-
-return check(x, bad_data_double, bad_data_double);
-
-}
-
-
-////////////////////////////////////////////////////////////////////////
-
-
-bool Or_Node::check(double x, double cmn, double csd) const
+bool Or_Node::check(double x, const ClimoPntInfo *cpi) const
{
-const bool tf_left = left_child->check(x, cmn, csd);
+const bool tf_left = left_child->check(x, cpi);
if ( tf_left ) return true;
-const bool tf_right = right_child->check(x, cmn, csd);
+const bool tf_right = right_child->check(x, cpi);
return tf_right;
@@ -168,13 +247,13 @@ return n;
////////////////////////////////////////////////////////////////////////
-double Or_Node::climo_prob() const
+double Or_Node::obs_climo_prob() const
{
if ( !left_child || !right_child ) {
- mlog << Error << "\nOr_Node::climo_prob() -> "
+ mlog << Error << "\nOr_Node::obs_climo_prob() -> "
<< "node not populated!\n\n";
exit ( 1 );
@@ -182,8 +261,8 @@ if ( !left_child || !right_child ) {
}
double prob = bad_data_double;
-double prob_left = left_child->climo_prob();
-double prob_right = right_child->climo_prob();
+double prob_left = left_child->obs_climo_prob();
+double prob_right = right_child->obs_climo_prob();
if ( !is_bad_data(prob_left) && !is_bad_data(prob_right) ) {
@@ -220,21 +299,8 @@ return ( left_child->need_perc() || right_child->need_perc() );
////////////////////////////////////////////////////////////////////////
-void Or_Node::set_perc(const NumArray *fptr, const NumArray *optr, const NumArray *cptr)
-
-{
-
-set_perc(fptr, optr, cptr, 0, 0);
-
-return;
-
-}
-
-
-////////////////////////////////////////////////////////////////////////
-
-
-void Or_Node::set_perc(const NumArray *fptr, const NumArray *optr, const NumArray *cptr,
+void Or_Node::set_perc(const NumArray *fptr, const NumArray *optr,
+ const NumArray *fcptr, const NumArray *ocptr,
const SingleThresh *fthr, const SingleThresh *othr)
{
@@ -248,8 +314,8 @@ if ( !left_child || !right_child ) {
}
- left_child->set_perc(fptr, optr, cptr, fthr, othr);
-right_child->set_perc(fptr, optr, cptr, fthr, othr);
+ left_child->set_perc(fptr, optr, fcptr, ocptr, fthr, othr);
+right_child->set_perc(fptr, optr, fcptr, ocptr, fthr, othr);
return;
@@ -340,27 +406,15 @@ if ( right_child ) { delete right_child; right_child = nullptr; }
////////////////////////////////////////////////////////////////////////
-bool And_Node::check(double x) const
-
-{
-
-return check(x, bad_data_double, bad_data_double);
-
-}
-
-
-////////////////////////////////////////////////////////////////////////
-
-
-bool And_Node::check(double x, double cmn, double csd) const
+bool And_Node::check(double x, const ClimoPntInfo *cpi) const
{
-const bool tf_left = left_child->check(x, cmn, csd);
+const bool tf_left = left_child->check(x, cpi);
if ( ! tf_left ) return false;
-const bool tf_right = right_child->check(x, cmn, csd);
+const bool tf_right = right_child->check(x, cpi);
return ( tf_left && tf_right );
@@ -389,13 +443,13 @@ return n;
////////////////////////////////////////////////////////////////////////
-double And_Node::climo_prob() const
+double And_Node::obs_climo_prob() const
{
if ( !left_child || !right_child ) {
- mlog << Error << "\nAnd_Node::climo_prob() -> "
+ mlog << Error << "\nAnd_Node::obs_climo_prob() -> "
<< "node not populated!\n\n";
exit ( 1 );
@@ -403,8 +457,8 @@ if ( !left_child || !right_child ) {
}
double prob = bad_data_double;
-double prob_left = left_child->climo_prob();
-double prob_right = right_child->climo_prob();
+double prob_left = left_child->obs_climo_prob();
+double prob_right = right_child->obs_climo_prob();
//
// For opposing inequalities, compute the difference in percentiles
@@ -459,21 +513,8 @@ return ( left_child->need_perc() || right_child->need_perc() );
////////////////////////////////////////////////////////////////////////
-void And_Node::set_perc(const NumArray *fptr, const NumArray *optr, const NumArray *cptr)
-
-{
-
-set_perc(fptr, optr, cptr, 0, 0);
-
-return;
-
-}
-
-
-////////////////////////////////////////////////////////////////////////
-
-
-void And_Node::set_perc(const NumArray *fptr, const NumArray *optr, const NumArray *cptr,
+void And_Node::set_perc(const NumArray *fptr, const NumArray *optr,
+ const NumArray *fcptr, const NumArray *ocptr,
const SingleThresh *fthr, const SingleThresh *othr)
{
@@ -487,8 +528,8 @@ if ( !left_child || !right_child ) {
}
- left_child->set_perc(fptr, optr, cptr, fthr, othr);
-right_child->set_perc(fptr, optr, cptr, fthr, othr);
+ left_child->set_perc(fptr, optr, fcptr, ocptr, fthr, othr);
+right_child->set_perc(fptr, optr, fcptr, ocptr, fthr, othr);
return;
@@ -578,23 +619,11 @@ if ( child ) { delete child; child = nullptr; }
////////////////////////////////////////////////////////////////////////
-bool Not_Node::check(double x) const
-
-{
-
-return check(x, bad_data_double, bad_data_double);
-
-}
-
-
-////////////////////////////////////////////////////////////////////////
-
-
-bool Not_Node::check(double x, double cmn, double csd) const
+bool Not_Node::check(double x, const ClimoPntInfo *cpi) const
{
-const bool tf = child->check(x, cmn, csd);
+const bool tf = child->check(x, cpi);
return !tf;
@@ -622,12 +651,12 @@ return n;
////////////////////////////////////////////////////////////////////////
-double Not_Node::climo_prob() const
+double Not_Node::obs_climo_prob() const
{
double prob = bad_data_double;
-double prob_child = child->climo_prob();
+double prob_child = child->obs_climo_prob();
if ( !is_bad_data(prob_child) ) prob = 1.0 - prob_child;
@@ -660,23 +689,11 @@ return child->need_perc();
////////////////////////////////////////////////////////////////////////
-void Not_Node::set_perc(const NumArray *fptr, const NumArray *optr, const NumArray *cptr)
-
-{
-
-set_perc(fptr, optr, cptr, 0, 0);
-
-return;
-
-}
-
-
-////////////////////////////////////////////////////////////////////////
-
-
-void Not_Node::set_perc(const NumArray *fptr, const NumArray *optr, const NumArray *cptr,
+void Not_Node::set_perc(const NumArray *fptr, const NumArray *optr,
+ const NumArray *fcptr, const NumArray *ocptr,
const SingleThresh *fthr, const SingleThresh *othr)
+
{
if ( !child ) {
@@ -688,7 +705,7 @@ if ( !child ) {
}
-child->set_perc(fptr, optr, cptr, fthr, othr);
+child->set_perc(fptr, optr, fcptr, ocptr, fthr, othr);
return;
@@ -780,35 +797,44 @@ Simple_Node::~Simple_Node()
////////////////////////////////////////////////////////////////////////
-bool Simple_Node::check(double x) const
+bool Simple_Node::check(double x, const ClimoPntInfo *cpi) const
{
-return check(x, bad_data_double, bad_data_double);
+if ( op == thresh_na ) return true;
-}
+double tval;
+ //
+ // check climo distribution percentile thresholds
+ //
-////////////////////////////////////////////////////////////////////////
+if ( is_climo_dist_type(Ptype) ) {
+ //
+ // check the pointer
+ //
-bool Simple_Node::check(double x, double cmn, double csd) const
+ if(!cpi) {
-{
+ mlog << Error << "\nSimple_Node::check(double, const ClimoPntInfo *) const -> "
+ << "climatological distribution percentile threshold type requested "
+ << "with no ClimoPntInfo provided!\n\n";
-if ( op == thresh_na ) return true;
+ exit ( 1 );
-double tval;
+ }
+
+ double cmn = (Ptype == perc_thresh_fcst_climo_dist ? cpi->fcmn : cpi->ocmn);
+ double csd = (Ptype == perc_thresh_fcst_climo_dist ? cpi->fcsd : cpi->ocsd);
//
- // check climo distribution percentile thresholds
+ // check the climo data
//
-if ( Ptype == perc_thresh_climo_dist ) {
-
if(is_bad_data(cmn) || is_bad_data(csd)) {
- mlog << Error << "\nSimple_Node::check(double, double, double) const -> "
+ mlog << Error << "\nSimple_Node::check(double, const ClimoPntInfo *) const -> "
<< "climatological distribution percentile threshold \"" << s
<< "\" requested with invalid mean (" << cmn
<< ") or standard deviation (" << csd << ").\n\n";
@@ -832,7 +858,7 @@ else {
if ( Ptype != no_perc_thresh_type && is_bad_data(tval) ) {
- mlog << Error << "\nSimple_Node::check(double, double, double) const -> "
+ mlog << Error << "\nSimple_Node::check(double, const ClimoPntInfo *) const -> "
<< "percentile threshold \"" << s
<< "\" used before it was set.\n\n";
@@ -856,7 +882,7 @@ switch ( op ) {
case thresh_ne: tf = !eq; break;
default:
- mlog << Error << "\nSimple_Node::check(double, double, double) const -> "
+ mlog << Error << "\nSimple_Node::check(double, const ClimoPntInfo *) const -> "
<< "bad op ... " << op << "\n\n";
exit ( 1 );
@@ -914,24 +940,12 @@ return;
}
-////////////////////////////////////////////////////////////////////////
-
-
-void Simple_Node::set_perc(const NumArray *fptr, const NumArray *optr, const NumArray *cptr)
-
-{
-
-set_perc(fptr, optr, cptr, 0, 0);
-
-return;
-
-}
-
////////////////////////////////////////////////////////////////////////
-void Simple_Node::set_perc(const NumArray *fptr, const NumArray *optr, const NumArray *cptr,
+void Simple_Node::set_perc(const NumArray *fptr, const NumArray *optr,
+ const NumArray *fcptr, const NumArray *ocptr,
const SingleThresh *fthr, const SingleThresh *othr)
{
@@ -946,9 +960,10 @@ bool fbias_fcst = false;
// handle sample percentile types
//
- if ( Ptype == perc_thresh_sample_fcst ) ptr = fptr;
-else if ( Ptype == perc_thresh_sample_obs ) ptr = optr;
-else if ( Ptype == perc_thresh_sample_climo ) ptr = cptr;
+ if ( Ptype == perc_thresh_sample_fcst ) ptr = fptr;
+else if ( Ptype == perc_thresh_sample_obs ) ptr = optr;
+else if ( Ptype == perc_thresh_sample_fcst_climo ) ptr = fcptr;
+else if ( Ptype == perc_thresh_sample_obs_climo ) ptr = ocptr;
//
// handle bias-correction type
@@ -960,7 +975,7 @@ else if ( Ptype == perc_thresh_freq_bias ) {
mlog << Error << "\nSimple_Node::set_perc() -> "
<< "not enough information provided to define the "
- << perc_thresh_info[Ptype].long_name
+ << perc_thresh_info_map.at(Ptype).long_name
<< " threshold \"" << s << "\".\n\n";
exit ( 1 );
@@ -1013,7 +1028,7 @@ else if ( Ptype == perc_thresh_freq_bias ) {
mlog << Error << "\nSimple_Node::set_perc() -> "
<< "unsupported options for computing the "
- << perc_thresh_info[Ptype].long_name
+ << perc_thresh_info_map.at(Ptype).long_name
<< " threshold \"" << s << "\".\n\n";
exit ( 1 );
@@ -1028,7 +1043,7 @@ else if ( Ptype == perc_thresh_freq_bias ) {
mlog << Error << "\nSimple_Node::set_perc() -> "
<< "unable to compute the percentile for the "
- << perc_thresh_info[Ptype].long_name
+ << perc_thresh_info_map.at(Ptype).long_name
<< " threshold \"" << s << "\".\n\n";
exit ( 1 );
@@ -1051,7 +1066,7 @@ else {
if ( !ptr ) {
mlog << Error << "\nSimple_Node::set_perc() -> "
- << perc_thresh_info[Ptype].long_name
+ << perc_thresh_info_map.at(Ptype).long_name
<< " threshold \"" << s
<< "\" requested but no data provided.\n\n";
@@ -1086,7 +1101,7 @@ else {
if ( data.n() == 0 ) {
mlog << Error << "\nSimple_Node::set_perc() -> "
- << "can't compute " << perc_thresh_info[Ptype].long_name
+ << "can't compute " << perc_thresh_info_map.at(Ptype).long_name
<< " threshold \"" << s
<< "\" because no valid data was provided.\n\n";
@@ -1216,15 +1231,15 @@ return;
////////////////////////////////////////////////////////////////////////
-double Simple_Node::climo_prob() const
+double Simple_Node::obs_climo_prob() const
{
double prob = bad_data_double;
-if ( Ptype == perc_thresh_climo_dist ) {
+if ( Ptype == perc_thresh_obs_climo_dist ) {
- // Climo probability varies based on the threshold type
+ // Observation climo probability varies based on the threshold type
switch ( op ) {
case thresh_lt:
@@ -1251,9 +1266,9 @@ if ( Ptype == perc_thresh_climo_dist ) {
default:
- mlog << Error << "\nSimple_Node::climo_prob() -> "
- << "cannot convert climatological distribution percentile "
- << "threshold to a probability!\n\n";
+ mlog << Error << "\nSimple_Node::obs_climo_prob() -> "
+ << "cannot convert observation climatological distribution "
+ << "percentile threshold to a probability!\n\n";
exit ( 1 );
@@ -1272,9 +1287,10 @@ bool Simple_Node::need_perc() const
{
-return ( Ptype == perc_thresh_sample_fcst ||
- Ptype == perc_thresh_sample_obs ||
- Ptype == perc_thresh_sample_climo ||
+return ( Ptype == perc_thresh_sample_fcst ||
+ Ptype == perc_thresh_sample_obs ||
+ Ptype == perc_thresh_sample_fcst_climo ||
+ Ptype == perc_thresh_sample_obs_climo ||
Ptype == perc_thresh_freq_bias );
}
@@ -1496,17 +1512,16 @@ return;
////////////////////////////////////////////////////////////////////////
-void SingleThresh::set(double pt, ThreshType ind, int perc_index, double t)
+void SingleThresh::set(double pt, ThreshType ind, PercThreshType ptype, double t)
{
clear();
-if ( (perc_index < 0) || (perc_index >= n_perc_thresh_infos) ) {
+if ( ptype == no_perc_thresh_type ) {
- mlog << Error
- << "\nSingleThresh::set(double pt, ThreshType ind, int perc_index, double t) -> "
- << "bad perc_index ... " << perc_index << "\n\n";
+ mlog << Error << "\nSingleThresh::set(double, ThreshType, PercThreshType, double) -> "
+ << "bad percentile threshold type\n\n";
exit ( 1 );
@@ -1515,12 +1530,12 @@ if ( (perc_index < 0) || (perc_index >= n_perc_thresh_infos) ) {
Simple_Node * a = new Simple_Node;
ConcatString cs;
-cs << perc_thresh_info[perc_index].short_name << pt;
+cs << perc_thresh_info_map.at(ptype).short_name << pt;
if( !is_bad_data(t) ) cs << "(" << t << ")";
a->T = t;
a->op = ind;
-a->Ptype = perc_thresh_info[perc_index].type;
+a->Ptype = ptype;
a->PT = pt;
a->s << thresh_type_str[ind] << cs;
a->abbr_s << thresh_abbr_str[ind] << cs;
@@ -1656,27 +1671,15 @@ return false;
////////////////////////////////////////////////////////////////////////
-void SingleThresh::set_perc(const NumArray *fptr, const NumArray *optr, const NumArray *cptr)
-
-{
-
-set_perc(fptr, optr, cptr, 0, 0);
-
-return;
-
-}
-
-
-////////////////////////////////////////////////////////////////////////
-
-
-void SingleThresh::set_perc(const NumArray *fptr, const NumArray *optr, const NumArray *cptr,
+void SingleThresh::set_perc(const NumArray *fptr, const NumArray *optr,
+ const NumArray *fcptr, const NumArray *ocptr,
const SingleThresh *fthr, const SingleThresh *othr)
+
{
if ( node ) {
- node->set_perc(fptr, optr, cptr, fthr, othr);
+ node->set_perc(fptr, optr, fcptr, ocptr, fthr, othr);
}
@@ -1796,23 +1799,11 @@ return;
////////////////////////////////////////////////////////////////////////
-bool SingleThresh::check(double x) const
-
-{
-
-return check(x, bad_data_double, bad_data_double);
-
-}
-
-
-////////////////////////////////////////////////////////////////////////
-
-
-bool SingleThresh::check(double x, double cmn, double csd) const
+bool SingleThresh::check(double x, const ClimoPntInfo *cpi) const
{
-return ( node ? node->check(x, cmn, csd) : true );
+return ( node ? node->check(x, cpi) : true );
}
diff --git a/src/basic/vx_config/threshold.h b/src/basic/vx_config/threshold.h
index 3eb74b5a0b..c879cfe3c7 100644
--- a/src/basic/vx_config/threshold.h
+++ b/src/basic/vx_config/threshold.h
@@ -13,6 +13,7 @@
////////////////////////////////////////////////////////////////////////
#include
+#include