[Git][debian-gis-team/nco][upstream] New upstream version 5.2.2

Bas Couwenberg (@sebastic) gitlab at salsa.debian.org
Sat Mar 23 06:43:09 GMT 2024



Bas Couwenberg pushed to branch upstream at Debian GIS Project / nco


Commits:
bd579124 by Bas Couwenberg at 2024-03-23T07:34:07+01:00
New upstream version 5.2.2
- - - - -


30 changed files:

- CMakeLists.txt
- bld/Makefile
- bld/nco.spec
- bld/nco_dst.pl
- configure
- configure.ac
- configure.eg
- data/Makefile.am
- data/Makefile.in
- + data/ncchecker
- data/ncclimo
- data/ncremap
- debian/changelog
- doc/ANNOUNCE
- doc/ChangeLog
- doc/VERSION
- doc/debian.txt
- doc/index.shtml
- doc/nco.texi
- man/Makefile.am
- man/Makefile.in
- + man/ncchecker.1
- man/ncremap.1
- src/nco++/Makefile.old
- src/nco/nco.h
- src/nco/nco_ctl.c
- src/nco/nco_grp_utl.c
- src/nco/nco_mss_val.c
- src/nco/nco_rgr.c
- src/nco/nco_scm.c


Changes:

=====================================
CMakeLists.txt
=====================================
@@ -914,8 +914,8 @@ endif()
 set(PERMISSIONS_DEFAULT OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
 message("-- Building ${nco_targets}")
 install(TARGETS ${nco_targets} RUNTIME DESTINATION . PERMISSIONS ${PERMISSIONS_DEFAULT})
-install(FILES data/ncremap data/ncclimo data/ncz2psx DESTINATION . PERMISSIONS ${PERMISSIONS_DEFAULT})
-message("-- Installing data/ncremap, data/ncclimo, data/ncz2psx to: " ${CMAKE_INSTALL_PREFIX})
+install(FILES data/ncremap data/ncclimo data/ncz2psx data/ncchecker DESTINATION . PERMISSIONS ${PERMISSIONS_DEFAULT})
+message("-- Installing data/ncremap, data/ncclimo, data/ncz2psx, data/ncchecker to: " ${CMAKE_INSTALL_PREFIX})
 
 #//////////////////////////
 # ncea->ncra


=====================================
bld/Makefile
=====================================
@@ -442,7 +442,7 @@ else
  GSL_INC_FLG := $(shell ${GSL_CONFIG} --cflags)
 endif # endif GSL_INC
 ifdef GSL_LIB
- GSL_LIB_FLG := -L${GSL_LIB} -lgsl
+ GSL_LIB_FLG := -L${GSL_LIB} -lgsl -lgslcblas
 else
  GSL_LIB_FLG := $(shell ${GSL_CONFIG} --libs)
 endif # endif GSL_LIB
@@ -551,7 +551,7 @@ CPP_PTH := $(foreach dir,${MDL_PTH},-I${dir})
 # Variables having to do with binary executables created by module
 MDL_BIN_TRG := ncap ncatted ncbo ncecat ncflint ncks ncpdq ncra ncrename ncwa # NCO binary targets
 MDL_BIN_SYM_LNK := ncdiff ncea nces ncrcat # Symbolic links
-MDL_BIN_SPT := ncclimo ncremap ncz2psx # Scripts
+MDL_BIN_SPT := ncclimo ncremap ncz2psx ncchecker # Scripts
 ifeq (${MPI},Y)
 # MDL_MPI_TRG := mpncbo mpncecat mpncflint mpncpdq mpncra mpncwa # MPI binary targets
  MDL_MPI_TRG := # MPI binary targets
@@ -1772,6 +1772,9 @@ endif
 ncz2psx:   ${MY_BIN_DIR}/ncz2psx
 ${MY_BIN_DIR}/ncz2psx:	${MY_DAT_DIR}/ncz2psx
 	/bin/cp -f ${MY_DAT_DIR}/ncz2psx ${MY_BIN_DIR}
+ncchecker:   ${MY_BIN_DIR}/ncchecker
+${MY_BIN_DIR}/ncchecker:	${MY_DAT_DIR}/ncchecker
+	/bin/cp -f ${MY_DAT_DIR}/ncchecker ${MY_BIN_DIR}
 bin: ${MDL_BIN_TRG} ${MDL_BIN_SPT}
 binclean: bin_cln
 bin_cln: 


=====================================
bld/nco.spec
=====================================
@@ -2,17 +2,17 @@
 # http://cvs.fedoraproject.org/viewvc/devel/nco/nco.spec?view=co
 
 Name:           nco
-Version:        5.2.0
+Version:        5.2.2
 Release:        1%{?dist}
 Summary:        Programs that manipulate netCDF files
 Group:          Applications/Engineering
 License:        BSD
 URL:            http://nco.sf.net/
 
-# Obtain NCO version 5.2.0-1 tar.gz from Sourceforge using CVS:
+# Obtain NCO version 5.2.2-1 tar.gz from Sourceforge using CVS:
 # cvs -d:pserver:anonymous at nco.cvs.sf.net:/cvsroot/nco login
-# cvs -z3 -d:pserver:anonymous at nco.cvs.sf.net:/cvsroot/nco co -r nco-5.2.0-1 -d nco-%{version} nco
-# tar czf nco-%{version}.tar.gz --exclude='nco-5.2.0/debian*' --exclude='.cvsignore' --exclude=ncap_lex.c --exclude='ncap_yacc.[ch]' ./nco-%{version}
+# cvs -z3 -d:pserver:anonymous at nco.cvs.sf.net:/cvsroot/nco co -r nco-5.2.2-1 -d nco-%{version} nco
+# tar czf nco-%{version}.tar.gz --exclude='nco-5.2.2/debian*' --exclude='.cvsignore' --exclude=ncap_lex.c --exclude='ncap_yacc.[ch]' ./nco-%{version}
 Source0:        nco-%{version}.tar.gz
 #Patch0:		nco_install_C_headers.patch
 #Patch1:         nco_find_udunits-dat.patch
@@ -108,6 +108,9 @@ fi
 # %{_libdir}/libnco++.so
 
 %changelog
+* Fri Mar 22 2024 Charlie Zender <zender at uci.edu> - 5.2.2-1
+- new upstream 5.2.2
+
 * Sun Feb 18 2024 Charlie Zender <zender at uci.edu> - 5.2.1-1
 - new upstream 5.2.1
 


=====================================
bld/nco_dst.pl
=====================================
@@ -5,20 +5,20 @@
 
 # Usage:
 # Export tagged, public versions
-# /usr/bin/scp ${DATA}/nco-5.2.1.tar.gz zender,nco at web.sf.net:/home/project-web/nco/htdocs/src
-
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln nco-5.2.1 # Build, do not release on SF
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln --sf nco-5.2.1 # Build, release on SF
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --nst_all nco-5.2.1 # Install, do not build
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln --nst_all nco-5.2.1 # Build and install
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --acd_cnt nco-5.2.1
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --acd_prs nco-5.2.1
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --cgd_cnt nco-5.2.1
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --cray_prs nco-5.2.1
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --bbl_cnt nco-5.2.1
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --blk_cnt nco-5.2.1
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --dat_cnt nco-5.2.1
-# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --ute_prs nco-5.2.1
+# /usr/bin/scp ${DATA}/nco-5.2.2.tar.gz zender,nco at web.sf.net:/home/project-web/nco/htdocs/src
+
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln nco-5.2.2 # Build, do not release on SF
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln --sf nco-5.2.2 # Build, release on SF
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --nst_all nco-5.2.2 # Install, do not build
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln --nst_all nco-5.2.2 # Build and install
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --acd_cnt nco-5.2.2
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --acd_prs nco-5.2.2
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --cgd_cnt nco-5.2.2
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --cray_prs nco-5.2.2
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --bbl_cnt nco-5.2.2
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --blk_cnt nco-5.2.2
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --dat_cnt nco-5.2.2
+# ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --ute_prs nco-5.2.2
 
 # Export daily snapshot
 # ${HOME}/nco/bld/nco_dst.pl --dbg=2 
@@ -256,7 +256,7 @@ if($bld){
 # Set up FTP server
     chdir $dst_pth_pfx or die "$prg_nm: ERROR unable to chdir to $dst_pth_pfx: $!\n"; # $! is system error string
     cmd_prc("$cp_cmd $doc_fl ./$dst_vrs/doc"); # Copy derived documentation to source directory
-    cmd_prc("$tar_cmd cvzf $dst_fl --exclude='nco-5.2.1/debian*' --exclude='.cvsignore' --exclude=ncap_lex.c --exclude=ncap_yacc.[ch] ./$dst_vrs"); # Create gzipped tarfile
+    cmd_prc("$tar_cmd cvzf $dst_fl --exclude='nco-5.2.2/debian*' --exclude='.cvsignore' --exclude=ncap_lex.c --exclude=ncap_yacc.[ch] ./$dst_vrs"); # Create gzipped tarfile
     cmd_prc("$rsh_cmd $www_mch $rm_cmd $www_drc/src/$dst_fl"); # Remove any distribution with same name
     if($dly_snp){cmd_prc("$rsh_cmd $www_mch $rm_cmd -r $www_drc/src/nco-????????.tar.gz");} # Remove previous daily snapshots from WWW server
     cmd_prc("$rcp_cmd $dst_fl $www_mch:$www_drc/src"); # Copy local tarfile to WWW server


=====================================
configure
=====================================
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.72 for NCO netCDF Operators 5.2.1.
+# Generated by GNU Autoconf 2.72 for NCO netCDF Operators 5.2.2.
 #
 # Report bugs to <nco-bugs at lists.sourceforge.net>.
 #
@@ -616,8 +616,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='NCO netCDF Operators'
 PACKAGE_TARNAME='nco'
-PACKAGE_VERSION='5.2.1'
-PACKAGE_STRING='NCO netCDF Operators 5.2.1'
+PACKAGE_VERSION='5.2.2'
+PACKAGE_STRING='NCO netCDF Operators 5.2.2'
 PACKAGE_BUGREPORT='nco-bugs at lists.sourceforge.net'
 PACKAGE_URL=''
 
@@ -1424,7 +1424,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-'configure' configures NCO netCDF Operators 5.2.1 to adapt to many kinds of systems.
+'configure' configures NCO netCDF Operators 5.2.2 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1496,7 +1496,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of NCO netCDF Operators 5.2.1:";;
+     short | recursive ) echo "Configuration of NCO netCDF Operators 5.2.2:";;
    esac
   cat <<\_ACEOF
 
@@ -1668,7 +1668,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-NCO netCDF Operators configure 5.2.1
+NCO netCDF Operators configure 5.2.2
 generated by GNU Autoconf 2.72
 
 Copyright (C) 2023 Free Software Foundation, Inc.
@@ -2447,7 +2447,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by NCO netCDF Operators $as_me 5.2.1, which was
+It was created by NCO netCDF Operators $as_me 5.2.2, which was
 generated by GNU Autoconf 2.72.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -4366,7 +4366,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='nco'
- VERSION='5.2.1'
+ VERSION='5.2.2'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -22890,7 +22890,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by NCO netCDF Operators $as_me 5.2.1, which was
+This file was extended by NCO netCDF Operators $as_me 5.2.2, which was
 generated by GNU Autoconf 2.72.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -22958,7 +22958,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-NCO netCDF Operators config.status 5.2.1
+NCO netCDF Operators config.status 5.2.2
 configured by $0, generated by GNU Autoconf 2.72,
   with options \\"\$ac_cs_config\\"
 


=====================================
configure.ac
=====================================
@@ -56,7 +56,7 @@
 # 20170808: Choose between traditional version and Git-based version
 # If Git, consider that Linux dynamic libraries will have full messy name, MacOS will not
 # https://stackoverflow.com/questions/43526939/how-to-insert-git-based-version-in-autoconf-managed-project
-AC_INIT([NCO netCDF Operators],[5.2.1],[nco-bugs at lists.sourceforge.net],[nco])
+AC_INIT([NCO netCDF Operators],[5.2.2],[nco-bugs at lists.sourceforge.net],[nco])
 
 # Print GNU copyright in configure script
 AC_COPYRIGHT


=====================================
configure.eg
=====================================
@@ -313,7 +313,7 @@ make install
 # Latest sysadmin-compiled module usage: 
 # Personal recipe last modified: 20231026 (Use ~/anaconda rather than E3SMU)
 # Personal recipe last borken: 20231026
-# Personal recipe last successful: 20231026
+# Personal recipe last successful: 20240221
 # Current build error: 20231019 "configure: error: cannot find netCDF library"
 # NB: aims4 and acme1 only accept connections from whitelisted domains (e.g., uci.edu)
 cd ~/nco;/bin/rm -f *.foo;make distclean
@@ -331,18 +331,18 @@ scp nco.configure.foo nco.config.log.foo nco.libtool.foo nco.make.foo dust.ess.u
 # Sysadmin upgrade request: https://www.olcf.ornl.gov/support/submit-ticket
 # Latest ticket to build NCO: 381695 on 20180413
 # Latest sysadmin-compiled module usage: module load netcdf-c/4.7.4 nco/4.9.3 # 20201208
-# Personal recipe last modified: 20221019 (link -lantlr from MY_LIB_DIR not HOME/lib)
+# Personal recipe last modified: 20240221 (fix E3SMU paths, use anaconda, not bld/Makefile)
 # Personal recipe last borken: 20231129 /gpfs/alpine/cli115/proj-shared/e3sm-unified/base/envs/e3sm_unified_1.9.1_login/lib/libnetcdf.so: undefined reference to `H5Pset_dxpl_mpio'
-# ../src/nco/nco_flt.c: In function ‘nco_qnt_mtd’: error: too many decimal points in number in expansion of macro ‘NCO_VERSION’
-# Personal recipe last successful: 20230512
+# Personal recipe last successful: 20240220
 export LINUX_CC='gcc -std=c99 -pedantic -D_DEFAULT_SOURCE'
 export LINUX_CXX='g++ -std=c++11'
 export LINUX_FC='gfortran'
-export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lustre/orion/cli115/world-shared/e3sm-unified/base/envs/e3sm_unified_latest/lib
-export NETCDF_ROOT=/lustre/orion/cli115/world-shared/e3sm-unified/base/envs/e3sm_unified_latest
-export PATH=${PATH}:/lustre/orion/cli115/world-shared/e3sm-unified/base/envs/e3sm_unified_latest/bin
+export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/ccs/proj/cli115/software/e3sm-unified/base/envs/e3sm_unified_latest/lib
+export NETCDF_ROOT=/ccs/proj/cli115/software/e3sm-unified/base/envs/e3sm_unified_latest
+export PATH=${PATH}:/ccs/proj/cli115/software/e3sm-unified/base/envs/e3sm_unified_latest/bin
 cd ~/nco;git reset --hard origin/master
-cd ~/nco/bld;make ANTLR_ROOT=${HOME} ANTLR_LIB=${MY_LIB_DIR} NETCDF_ROOT='/lustre/orion/cli115/world-shared/e3sm-unified/base/envs/e3sm_unified_latest' OPTS=D OMP=Y allinone;cd -
+cd ~/nco;CC=${LINUX_CC} CXX=${LINUX_CXX} NETCDF_ROOT=${HOME}/anaconda ./configure --disable-ccr --prefix=${HOME} --bindir=${MY_BIN_DIR} --datadir=${HOME}/nco/data --libdir=${MY_LIB_DIR} --mandir=${HOME}/nco/man > nco.configure.foo 2>&1
+# cd ~/nco/bld;make ANTLR_ROOT=${HOME} ANTLR_LIB=${MY_LIB_DIR} NETCDF_ROOT=${NETCDF_ROOT} OPTS=D OMP=Y allinone;cd -
 # !Andes
 
 # gcc/g++ Zender uses this to develop/install/update netCDF4-enabled NCO in personal directories on blues/anvil
@@ -416,10 +416,10 @@ scp nco.configure.foo nco.config.log.foo nco.libtool.foo nco.make.foo dust.ess.u
 # Latest ticket to build NCO: 20190525 ICS-40n99 (closed in 1 day!)
 # Latest sysadmin-compiled module usage: module add nco # 20190524 default version is 4.7.9
 # Personal recipe last modified: 20230917 (use conda gcc/g++ compilers so new libnetcdf links to C++ to resolve libicuuc dependencies)
-# Personal recipe last borken: 20231031 unable to link to conda libnetcdf due to GLIBC_PRIVATE errors. Seems to use /usr/bin/ld instead of conda?
+# Personal recipe last borken: 20231031 unable to link to conda libnetcdf due to GLIBC_PRIVATE errors. Seems to use /usr/bin/ld instead of conda? 20240221 error: cannot find netCDF library
 # Personal recipe last successful: 20230917
 module purge
-cd ~/nco;ANTLR_ROOT=${HOME} CC='gcc' CXX='g++' NETCDF_ROOT="${HOME}/anaconda" ./configure --prefix=${HOME} --bindir=${MY_BIN_DIR} --datadir=${HOME}/nco/data --libdir=${MY_LIB_DIR} --mandir=${HOME}/nco/man > nco.configure.foo 2>&1
+cd ~/nco;CC=${LINUX_CC} CXX=${LINUX_CXX} NETCDF_ROOT=${HOME}/anaconda ./configure --prefix=${HOME} --bindir=${MY_BIN_DIR} --datadir=${HOME}/nco/data --libdir=${MY_LIB_DIR} --mandir=${HOME}/nco/man > nco.configure.foo 2>&1
 cd ~/nco;ANTLR_ROOT=${HOME} CC='gcc' CXX='g++' ./configure --prefix=${HOME} --bindir=${MY_BIN_DIR} --datadir=${HOME}/nco/data --libdir=${MY_LIB_DIR} --mandir=${HOME}/nco/man > nco.configure.foo 2>&1
 /bin/cp -f config.log nco.config.log.foo
 /bin/cp -f libtool nco.libtool.foo
@@ -453,8 +453,8 @@ make install >> nco.make.foo 2>&1
 # Sysadmin upgrade request: cislhelp at ucar.edu # NCAR Maintainer = Pat Nichols
 # Latest ticket to build NCO: 216373 on 20180413
 # Latest sysadmin-compiled module usage: module load netcdf/4.9.2 module load nco/5.1.6 # 20240107
-# Personal recipe last modified: 20240107
-# Personal recipe last borken: 20240107 (unable to compile antlr)
+# Personal recipe last modified: 20240107 (add -lgslcblas to bld/Makefile)
+# Personal recipe last borken: 20240107 (NCO base works, ncap2 unable to link to antlr)
 # Personal recipe last successful: 20231103
 # Derecho GNU:
 module purge
@@ -484,12 +484,12 @@ export LINUX_FC='gfortran'
 export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${HOME}/anaconda/lib
 export NETCDF_ROOT=${HOME}/anaconda
 export PATH=${PATH}:${HOME}/anaconda/bin
-#export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lustre/orion/cli115/world-shared/e3sm-unified/base/envs/e3sm_unified_latest/lib
-#export NETCDF_ROOT=/lustre/orion/cli115/world-shared/e3sm-unified/base/envs/e3sm_unified_latest
-#export PATH=${PATH}:/lustre/orion/cli115/world-shared/e3sm-unified/base/envs/e3sm_unified_latest/bin
+#export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/ccs/proj/cli115/software/e3sm-unified/base/envs/e3sm_unified_latest/lib
+#export NETCDF_ROOT=/ccs/proj/cli115/software/e3sm-unified/base/envs/e3sm_unified_latest
+#export PATH=${PATH}:/ccs/proj/cli115/software/e3sm-unified/base/envs/e3sm_unified_latest/bin
 cd ~/nco;git reset --hard origin/master
 cd ~/nco/bld;make ANTLR_ROOT=${HOME}/anaconda ANTLR_LIB=${HOME}/anaconda NETCDF_ROOT=${HOME}/anaconda OPTS=D OMP=Y allinone;cd -
-cd ~/nco/bld;make ANTLR_ROOT=${HOME} ANTLR_LIB=${MY_LIB_DIR} NETCDF_ROOT='/lustre/orion/cli115/world-shared/e3sm-unified/base/envs/e3sm_unified_latest' OPTS=D OMP=Y allinone;cd -
+cd ~/nco/bld;make ANTLR_ROOT=${HOME} ANTLR_LIB=${MY_LIB_DIR} NETCDF_ROOT='/ccs/proj/cli115/software/e3sm-unified/base/envs/e3sm_unified_latest' OPTS=D OMP=Y allinone;cd -
 # !Frontier
 
 # gcc/g++ Zender uses this to develop/install/update netCDF4-enabled NCO in personal directories on Perlmutter with GNU:


=====================================
data/Makefile.am
=====================================
@@ -117,7 +117,7 @@ all: ${test_data} ${test_symlink} ${test_data_netCDF4} ${test_zarr_data} ${test_
 
 # Autoconf/automake instructions for scripts:
 # https://www.gnu.org/software/automake/manual/html_node/Scripts.html
-dist_bin_SCRIPTS = ncclimo ncremap ncz2psx
+dist_bin_SCRIPTS = ncclimo ncremap ncz2psx ncchecker
 
 EXTRA_DIST = big.cdl dsm.cdl hdn.cdl mrd.cdl in.cdl in_grp.cdl in_grp_1.cdl in_grp_2.cdl in_grp_3.cdl in_grp_4.cdl in_grp_5.cdl in_grp_6.cdl in_grp_7.cdl in_grp_8.cdl in_1.cdl in_2.cdl cmip5.cdl obs.cdl mdl_1.cdl split.cdl buggy.cdl in_rec_zero.cdl ncap.in ncap.in2 ncap2.in tst.nco
 


=====================================
data/Makefile.in
=====================================
@@ -313,7 +313,7 @@ test_zarr_symlink = h0001 h0002 h0003
 
 # Autoconf/automake instructions for scripts:
 # https://www.gnu.org/software/automake/manual/html_node/Scripts.html
-dist_bin_SCRIPTS = ncclimo ncremap ncz2psx
+dist_bin_SCRIPTS = ncclimo ncremap ncz2psx ncchecker
 EXTRA_DIST = big.cdl dsm.cdl hdn.cdl mrd.cdl in.cdl in_grp.cdl in_grp_1.cdl in_grp_2.cdl in_grp_3.cdl in_grp_4.cdl in_grp_5.cdl in_grp_6.cdl in_grp_7.cdl in_grp_8.cdl in_1.cdl in_2.cdl cmip5.cdl obs.cdl mdl_1.cdl split.cdl buggy.cdl in_rec_zero.cdl ncap.in ncap.in2 ncap2.in tst.nco
 
 # Automake manual section 14:


=====================================
data/ncchecker
=====================================
@@ -0,0 +1,528 @@
+#!/usr/bin/env bash
+
+# Purpose: Check data file against DIWG (and, eventually, other) recommendations
+
+# Copyright (C) 2023--present Charlie Zender, ... (Contribuing DIWG members---Add your names!)
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+# See the 3-Clause BSD License for more details.
+
+# Prerequisites: Bash, NCO
+# Script could use other shells, e.g., dash (Debian default) after rewriting function definitions and loops
+# Debug with 'bash -x ncchecker --dbg=dbg_lvl' where 0 <= dbg_lvl <= 5
+
+# Insta-install:
+# scp ~/diwg/ncchecker dust.ess.uci.edu:bin
+# scp dust.ess.uci.edu:bin/ncchecker ${MY_BIN_DIR}
+
+# Set script name, directory, PID, run directory
+drc_pwd=${PWD}
+# Security: Explicitly unset IFS before wordsplitting, so Bash uses default IFS=<space><tab><newline>
+unset IFS
+# Set these before 'module' command which can overwrite ${BASH_SOURCE[0]}
+# NB: dash supports $0 syntax, not ${BASH_SOURCE[0]} syntax
+# http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in
+spt_src="${BASH_SOURCE[0]}"
+[[ -z "${spt_src}" ]] && spt_src="${0}" # Use ${0} when BASH_SOURCE is unavailable (e.g., dash)
+while [ -h "${spt_src}" ]; do # Recursively resolve ${spt_src} until file is no longer a symlink
+  drc_spt="$( cd -P "$( dirname "${spt_src}" )" && pwd )"
+  spt_src="$(readlink "${spt_src}")"
+  [[ ${spt_src} != /* ]] && spt_src="${drc_spt}/${spt_src}" # If ${spt_src} was relative symlink, resolve it relative to path where symlink file was located
+done
+cmd_ln="${spt_src} ${@}"
+drc_spt="$( cd -P "$( dirname "${spt_src}" )" && pwd )"
+spt_nm=$(basename ${spt_src}) # [sng] Script name (unlike $0, ${BASH_SOURCE[0]} works well with 'source <script>')
+spt_pid=$$ # [nbr] Script PID (process ID)
+
+# Original Setup (prior to merger with NCO):
+# git clone git at github.com:diwg/diwg ~/diwg
+# ln -s ~/diwg/diwg_chk ~/bin/diwg_chk
+# ln -s ~/diwg/diwg_chk ~/sh/diwg_chk
+
+# Debugging and Benchmarking:
+# ncchecker ~/nco/data/in.nc ~/nco/data/in_4.nc 
+# ncchecker ~/data/bm/elmv2_ne30pg2l15.nc
+# ncchecker ~/data/hdf/MODIS_L2N_20140304T1120.nc > ~/diwg.txt 2>&1 &
+# ncchecker ~/data/hdf/OMI-Aura_L2-OMAERUV_2013m1004t2338-o49057_v003-2013m1005t053932.nc
+
+# Production usage:
+# ncchecker --dbg=1 ~/nco/data/in_4.nc > ~/diwg.txt 2>&1 &
+# screen # Start screen
+# ncchecker --dbg=1 ~/nco/data/in_4.nc > ~/diwg.txt 2>&1 &
+# Ctl-A D # Detach screen
+# tail ~/diwg.txt # Monitor progress
+# screen -ls # List screens
+# screen -r <ID> # Re-attach screen
+
+# Configure paths at High-Performance Computer Centers (HPCCs) based on ${HOSTNAME}
+if [ -z "${HOSTNAME}" ]; then
+    if [ -f /bin/hostname ] && [ -x /bin/hostname ]; then
+	export HOSTNAME=`/bin/hostname`
+    elif [ -f /usr/bin/hostname ] && [ -x /usr/bin/hostname ]; then
+	export HOSTNAME=`/usr/bin/hostname`
+    fi # !hostname
+fi # HOSTNAME
+
+# Set NCO version and directory
+nco_exe=`which ncks`
+if [ -z "${nco_exe}" ]; then
+    echo "${spt_nm}: ERROR Unable to find NCO, \${nco_exe} = ${nco_exe}"
+    echo "${spt_nm}: HINT Carefully examine your environment setup (e.g., .bashrc) to avoid inadvertently overriding (with, e.g., conda-initialization) paths intended to be provided by an analysis-package environment (e.g., Anaconda)"
+    exit 1
+fi # !nco_exe
+# StackOverflow method finds NCO directory
+while [ -h "${nco_exe}" ]; do
+  drc_nco="$( cd -P "$( dirname "${nco_exe}" )" && pwd )"
+  nco_exe="$(readlink "${nco_exe}")"
+  [[ ${nco_exe} != /* ]] && nco_exe="${drc_nco}/${nco_exe}"
+done
+drc_nco="$( cd -P "$( dirname "${nco_exe}" )" && pwd )"
+nco_vrs=$(ncks --version 2>&1 > /dev/null | grep NCO | awk '{print $5}')
+nco_sng=$(ncks --version 2>&1 > /dev/null | grep NCO | awk -F '"' '{print $2}')
+
+# 20190218: Die quickly when NCO is found yet cannot run, e.g., due to linker errors
+if [ -z "${nco_vrs}" ]; then
+    echo "${spt_nm}: ERROR ${nco_exe} dies with error message on next line:"
+    $(ncks --version)
+    exit 1
+fi # !nco_vrs
+lbr_vrs=$(ncks --library 2>&1 > /dev/null | awk '{print $6}')
+
+# When running in a terminal window (not in an non-interactive batch queue)...
+if [ -n "${TERM}" ]; then
+    # Set fonts for legibility
+    if [ -x /usr/bin/tput ] && tput setaf 1 &> /dev/null; then
+	fnt_bld=`tput bold` # Bold
+	fnt_nrm=`tput sgr0` # Normal
+	fnt_rvr=`tput smso` # Reverse
+	fnt_tlc=`tput sitm` # Italic
+    else
+	fnt_bld="\e[1m" # Bold
+	fnt_nrm="\e[0m" # Normal
+	fnt_rvr="\e[07m" # Reverse
+	fnt_tlc="\e[3m" # Italic
+    fi # !tput
+fi # !TERM
+    
+# Defaults for command-line options and some derived variables
+# Modify these defaults to save typing later
+caseid='elmforc.ERA5.c2018.0.25d' # [sng] Case ID
+dbg_lvl=0 # [nbr] Debugging level
+drc_in='' # [sng] Input file directory
+drc_in_xmp="${DATA}/era5/data_raw/1979" # [sng] Input file directory for examples
+drc_out='' # [sng] Output file directory
+drc_out_xmp="${DATA}/era5/data_out" # [sng] Output file directory for examples
+inp_aut='No' # [sng] Input file list automatically generated
+inp_glb='No' # [sng] Input file list from globbing directory 
+inp_psn='No' # [sng] Input file list from positional arguments
+inp_std='No' # [sng] Input file list from stdin
+nco_opt='' # [sng] NCO options (e.g., '-6 -t 1')
+tst_flg='Yes' # [flg] Trigger test-selection code
+tst_lst='bnd,chr,mss,nan,tm,xtn' # [sng] Tests to conduct (subset of bnd,chr,mss,nan,tm,xtn)
+vrs_prn='No' # [sng] Print version information
+
+# NCO filters documented in http://nco.sf.net/nco.html#filter
+function ncvarlst { ncks --trd -m ${1} | grep -E ': type' | cut -f 1 -d ' ' | sed 's/://' | sort ; }
+function ncdmnlst { ncks --cdl -m ${1} | cut -d ':' -f 1 | cut -d '=' -s -f 1 ; }
+
+function fnc_usg_prn { # NB: dash supports fnc_nm (){} syntax, not function fnc_nm{} syntax
+    # Print usage
+    printf "${fnt_rvr}Basic usage:\n${fnt_nrm}${fnt_bld}${spt_nm} in.nc${fnt_nrm} # Default settings\n"
+    printf "${fnt_bld}${spt_nm} -t bnd,nan${fnt_nrm} # Short option syntax with explicit tests\n"
+    printf "${fnt_bld}${spt_nm} --tst=bnd,nan${fnt_nrm} # Long options with with explicit tests\n"
+    echo "Command-line options [long-option synonyms in ${fnt_tlc}italics${fnt_nrm}]:"
+#    echo "${fnt_rvr}-3${fnt_nrm}          Output file format CLASSIC (netCDF3 classic CDF1) [${fnt_tlc}fl_fmt, file_format=classic${fnt_nrm}]"
+#    echo "${fnt_rvr}-4${fnt_nrm}          Output file format NETCDF4 (netCDF4 extended HDF5) [${fnt_tlc}fl_fmt, file_format=netcdf4${fnt_nrm}]"
+#    echo "${fnt_rvr}-5${fnt_nrm}          Output file format 64BIT_DATA (netCDF3/PnetCDF CDF5) [${fnt_tlc}fl_fmt, file_format=64bit_data${fnt_nrm}]"
+#    echo "${fnt_rvr}-6${fnt_nrm}          Output file format 64BIT_OFFSET (netCDF3 64bit CDF2) [${fnt_tlc}fl_fmt, file_format=64bit_offset${fnt_nrm}]"
+#    echo "${fnt_rvr}-7${fnt_nrm}          Output file format NETCDF4_CLASSIC (netCDF4 classic HDF5) [${fnt_tlc}fl_fmt, file_format=netcdf4_classic${fnt_nrm}]"
+#    echo "${fnt_rvr}-c${fnt_nrm} ${fnt_bld}caseid${fnt_nrm}   Case ID string to generate output filenames (default ${fnt_bld}${caseid}${fnt_nrm}) [${fnt_tlc}caseid, case_id, case${fnt_nrm}]"
+    echo "${fnt_rvr}-d${fnt_nrm} ${fnt_bld}dbg_lvl${fnt_nrm}  Debug level (default ${fnt_bld}${dbg_lvl}${fnt_nrm}) [${fnt_tlc}dbg_lvl, dbg, debug, debug_level${fnt_nrm}]"
+    echo "${fnt_rvr}-i${fnt_nrm} ${fnt_bld}drc_in${fnt_nrm}   Input directory (default ${fnt_bld}${drc_in}${fnt_nrm}) [${fnt_tlc}drc_in, in_drc, dir_in, in_dir, input${fnt_nrm}]"
+#    echo "${fnt_rvr}-j${fnt_nrm} ${fnt_bld}job_nbr${fnt_nrm}  Job simultaneity for parallelism (default ${fnt_bld}${job_nbr}${fnt_nrm}) [${fnt_tlc}job_nbr, job_number, jobs${fnt_nrm}]"
+#    echo "${fnt_rvr}-o${fnt_nrm} ${fnt_bld}drc_out${fnt_nrm}  Output directory (default ${fnt_bld}${drc_out}${fnt_nrm}) [${fnt_tlc}drc_out, out_drc, dir_out, out_dir, output${fnt_nrm}]"
+    echo "${fnt_rvr}-p${fnt_nrm} ${fnt_bld}par_typ${fnt_nrm}  Parallelism type (default ${fnt_bld}${par_typ}${fnt_nrm}) [${fnt_tlc}par_typ, par_md, parallel_type, parallel_mode, parallel${fnt_nrm}] [${fnt_tlc}serial | background | mpi${fnt_nrm}]"
+#    echo " ${fnt_bld}--tpd_out${fnt_nrm}  Timesteps-per-day in output (default ${fnt_bld}${tpd_out}${fnt_nrm}) [${fnt_tlc}tpd_out, tpd, timesteps_per_day${fnt_nrm}]"
+    echo " ${fnt_bld}--tests${fnt_nrm}    Tests to conduct ('none' means none) (default ${fnt_bld}${tst_lst}${fnt_nrm} [${fnt_tlc}tst_lst, tst, test_list${fnt_nrm}]"
+    echo "${fnt_rvr}-v${fnt_nrm} ${fnt_bld}var_lst${fnt_nrm}  Variable list (empty means all) (default ${fnt_bld}${var_lst}${fnt_nrm}) [${fnt_tlc}var_lst, variable_list, var, vars, variable, variables${fnt_nrm}]"
+    echo " ${fnt_bld}--version${fnt_nrm}  Version and configuration information [${fnt_tlc}version, vrs, config, configuration, cnf${fnt_nrm}]"
+    echo "${fnt_rvr}-x${fnt_nrm} ${fnt_bld}--xcl_var${fnt_nrm}  Exclude rather than extract var_lst [${fnt_tlc}xcl_var, xcl, exclude, exclude_variables${fnt_nrm}]"
+    printf "\n"
+    printf "${fnt_rvr}Examples:${fnt_nrm}\n"
+    printf "${fnt_bld}${spt_nm} in1.nc in2.nc${fnt_nrm} # Run all tests on two files\n"
+    printf "${fnt_bld}${spt_nm} -v var1,var2 in1.nc # Check only two variables\n"
+    printf "${fnt_bld}${spt_nm} *.nc${fnt_nrm} # Glob input files via wildcard\n"
+    printf "${fnt_bld}ls *.nc | ${spt_nm}${fnt_nrm} # Input files via stdin\n"
+    printf "${fnt_bld}${spt_nm} --dbg=2 *.nc${fnt_nrm} # Debug ${spt_nm}\n"
+    printf "${fnt_bld}${spt_nm} --tests=nan,mss *.nc # Select only two tests\n"
+    printf "${fnt_bld}${spt_nm} --tests=xtn,tm,nan,mss,chr,bnd *.nc${fnt_nrm} # Change test ordering\n"
+    printf "${fnt_bld}${spt_nm} "file://${HOME}/in_zarr4#mode=nczarr,file"${fnt_nrm} # Check Zarr object(s)\n"
+    printf "\nComplete documentation at http://nco.sf.net/nco.html#${spt_nm}\n\n"
+    exit 1
+} # !fnc_usg_prn()
+
+# Check argument number and complain accordingly
+arg_nbr=$#
+#printf "\ndbg: Number of arguments: ${arg_nbr}"
+if [ ${arg_nbr} -eq 0 ]; then
+  fnc_usg_prn
+fi # !arg_nbr
+
+# Parse command-line options:
+# http://stackoverflow.com/questions/402377/using-getopts-in-bash-shell-script-to-get-long-and-short-command-line-options (see method by Adam Katz)
+# http://tuxtweaks.com/2014/05/bash-getopts
+while getopts :34567c:d:f:i:o:p:s:v:x-: OPT; do
+    case ${OPT} in
+	3) fl_fmt='3' ;; # File format
+	4) fl_fmt='4' ;; # File format
+	5) fl_fmt='5' ;; # File format
+	6) fl_fmt='6' ;; # File format
+	7) fl_fmt='7' ;; # File format
+	c) caseid="${OPTARG}" ;; # CASEID
+	d) dbg_lvl="${OPTARG}" ;; # Debugging level
+	f) fml_nm_usr="${OPTARG}" ;; # Family name
+	i) drc_in="${OPTARG}" ;; # Input directory
+	o) drc_out_usr="${OPTARG}" ;; # Output directory
+	p) par_typ="${OPTARG}" ;; # Parallelism type
+	v) var_lst="${OPTARG}" ;; # Variables
+	x) xcl_flg='Yes' ;; # Exclude variable list
+	-) LONG_OPTARG="${OPTARG#*=}"
+	   case ${OPTARG} in
+	       # Hereafter ${OPTARG} is long argument key, and ${LONG_OPTARG}, if any, is long argument value
+	       # Long options with no argument, no short option counterpart
+	       # Long options with argument, no short option counterpart
+	       # Long options with short counterparts, ordered by short option key
+	       caseid=?* | case_id=?* | case=?* ) caseid="${LONG_OPTARG}" ;; # -c # CASEID
+	       dbg_lvl=?* | dbg=?* | debug=?* | debug_level=?* ) dbg_lvl="${LONG_OPTARG}" ;; # -d # Debugging level
+	       drc_in=?* | in_drc=?* | dir_in=?* | in_dir=?* | input=?* ) drc_in="${LONG_OPTARG}" ;; # -i # Input directory
+	       drc_out=?* | out_drc=?* | dir_out=?* | out_dir=?* | output=?* ) drc_out_usr="${LONG_OPTARG}" ;; # -o # Output directory
+	       fl_fmt=?* | fmt_out=?* | file_format=?* | format_out=?* ) fl_fmt="${LONG_OPTARG}" ;; # # Output file format
+	       fml_nm=?* | fml=?* | family_name=?* | family=?* ) fml_nm_usr="${LONG_OPTARG}" ;; # -f # Family name
+	       hrd_pth | hard_path | npo | nco_path_override ) hrd_pth='Yes' ;; # # Use hard-coded paths on known machines (intentional no-op because already handled prior to getopt())
+	       hrd_pth=?* | hard_path=?* | npo=?* | nco_path_override=?* ) echo "No argument allowed for --${OPTARG switch}" >&2; exit 1 ;; # # Use hard-coded paths on known machines
+	       job_nbr=?* | job_number=?* | jobs=?* ) job_usr="${LONG_OPTARG}" ;; # -j # Job simultaneity
+	       par_typ=?* | par_md=?* | parallel_type=?* | parallel_mode=?* | parallel=?* ) par_typ="${LONG_OPTARG}" ;; # -p # Parallelism type
+	       tests=?* | tst_lst=?* | tst=?* | test_list=?* ) tst_lst="${LONG_OPTARG}" ;; # # Tests to conduct
+	       tpd_out=?* | tpd=?* | timesteps_per_day=?* ) tpd_usr="${LONG_OPTARG}" ;; # # Timesteps-per-day in output
+	       var_lst=?* | variable_list=?* | var=?* | vars=?* | variable=?* | variables=?* ) var_lst="${LONG_OPTARG}" ;; # -v # Variables
+	       version | vrs | config | configuration | cnf ) vrs_prn='Yes' ;; # # Print version information
+	       version=?* | vrs=?* | config=?* | configuration=?* | cnf=?* ) echo "No argument allowed for --${OPTARG switch}" >&2; exit 1 ;; # # Print version information
+	       xcl_var | xcl | exclude | exclude_variables ) xcl_flg='Yes' ;; # # Exclude rather than extract variable list
+	       xcl_var=?* | xcl=?* | exclude=?* | exclude_variables=?* ) echo "No argument allowed for --${OPTARG switch}" >&2; exit 1 ;; # # Exclude rather than extract variable list
+               '' ) break ;; # "--" terminates argument processing
+               * ) printf "\nERROR: Unrecognized option ${fnt_bld}--${OPTARG}${fnt_nrm}\n" >&2; fnc_usg_prn ;;
+	   esac ;; # !OPTARG
+	\?) # Unrecognized option
+	    printf "\nERROR: Option ${fnt_bld}-${OPTARG}${fnt_nrm} not recognized\n" >&2
+	    fnc_usg_prn ;;
+    esac # !OPT
+done # !getopts
+shift $((OPTIND-1)) # Advance one argument
+psn_nbr=$#
+if [ ${psn_nbr} -ge 1 ]; then
+    inp_psn='Yes'
+    # 20200430 Input files on command-line mean we need not check standard-input
+    std_chk='No'
+fi # !psn_nbr
+
+if [ ${vrs_prn} = 'Yes' ]; then
+    printf "${spt_nm}, runs DIWG recommendation compliance checks, version ${nco_vrs} \"${nco_sng}\"\n"
+    printf "Authors: \n"
+    printf "Config: ${spt_nm} script located in directory ${drc_spt}\n"
+    printf "Config: NCO binaries located in directory ${drc_nco}, linked to netCDF library version ${lbr_vrs}\n"
+    if [ "${hrd_pth_fnd}" = 'Yes' ]; then
+	printf "Config: Employ NCO machine-dependent hardcoded paths/modules for ${HOSTNAME}. (If desired, turn-off NCO hardcoded paths with \"export NCO_PATH_OVERRIDE=No\").\n"
+    else
+	printf "Config: No hardcoded machine-dependent path/module overrides. (If desired, turn-on NCO hardcoded paths at supported national labs with \"export NCO_PATH_OVERRIDE=Yes\").\n"
+    fi # !hrd_pth_fnd
+    exit 0
+fi # !vrs_prn
+
+# Determine mode first (this helps determine other defaults)
+if [ ${tst_lst} = 'none' ]; then
+    tst_nbr=0
+    tst_flg='No'
+fi # !tst_lst
+
+if [ -z "${drc_in}" ]; then
+    drc_in="${drc_pwd}"
+else # !drc_in
+    if [ ! -d "${drc_in}" ]; then
+	echo "${spt_nm}: ERROR specified input directory \"${drc_in}\" does not exist"
+	exit 1
+    fi # !drc_in
+    drc_in_usr='Yes'
+fi # !drc_in
+
+# 20170807 Custom tests (code borrowed from ncremap seasons (csn) treatment)
+if [ "${tst_flg}" = 'Yes' ]; then
+
+    # Standard test enumeration
+    # Index into test definition table
+    tst_idx_srt=0 # [idx] Starting index for test enumeration
+    tst_bnd=0
+    tst_chr=1
+    tst_mss=2
+    tst_nan=3
+    tst_tm=4
+    tst_xtn=5
+    tst_nbr_max=6 # [nbr] Maximum number of tests in definitions database
+
+    # Test abbreviations, uppercase
+    tst_abb[${tst_bnd}]='BND'
+    tst_abb[${tst_chr}]='CHR'
+    tst_abb[${tst_mss}]='MSS'
+    tst_abb[${tst_nan}]='NAN'
+    tst_abb[${tst_tm}]='TM'
+    tst_abb[${tst_xtn}]='XTN'
+
+    # Test abbreviations, lowercase
+    tst_abb_lc[${tst_bnd}]='bnd'
+    tst_abb_lc[${tst_chr}]='chr'
+    tst_abb_lc[${tst_mss}]='mss'
+    tst_abb_lc[${tst_nan}]='nan'
+    tst_abb_lc[${tst_tm}]='tm'
+    tst_abb_lc[${tst_xtn}]='xtn'
+
+    # Recommendation (i.e., short exhortation) in ESDS RFC Title
+    tst_rcm[${tst_bnd}]='Use CF Bounds Attributes'
+    tst_rcm[${tst_chr}]='Identifier names shall comply with this regular expression: [A-Za-z][A-Za-z0-9_]*'
+    tst_rcm[${tst_mss}]='Avoid use of the missing_value attribute in new Earth Science data products'
+    tst_rcm[${tst_nan}]='Earth Science data products should avoid using Not-a-Number (NaN) in any field values or as an indicator of missing or invalid data'
+    tst_rcm[${tst_tm}]='Use Double Precision When Archiving Time in Seconds Since a Specific Epoch'
+    tst_rcm[${tst_xtn}]='Files created with the HDF5, HDF-EOS5, or netCDF APIs should have filename extensions \"h5\", \"he5\", or \"nc\", respectively'
+    
+    # ESDS RFC Recommendation Number
+    tst_rfc[${tst_bnd}]='2.3'
+    tst_rfc[${tst_chr}]='3.1'
+    tst_rfc[${tst_mss}]='4.2'
+    tst_rfc[${tst_nan}]='3.7'
+    tst_rfc[${tst_tm}]='4.11'
+    tst_rfc[${tst_xtn}]='3.8'
+    
+    # ESDS RFC Recommendation URL
+    tst_url[${tst_bnd}]='https://wiki.earthdata.nasa.gov/pages/viewpage.action?pageId=182296291'
+    tst_url[${tst_chr}]='https://wiki.earthdata.nasa.gov/display/ESDSWG/Character+Set+for+User-Defined+Group%2C+Variable%2C+and+Attribute+names'
+    tst_url[${tst_mss}]='https://wiki.earthdata.nasa.gov/display/ESDSWG/Avoid+Use+of+the+missing_value+Attribute'
+    tst_url[${tst_nan}]='https://wiki.earthdata.nasa.gov/display/ESDSWG/Not-a-Number+%28NaN%29+Value'
+    tst_url[${tst_tm}]='https://wiki.earthdata.nasa.gov/display/ESDSWG/Use+Double+Precision+When+Archiving+Time+in+Seconds+Since+a+Specific+Epoch'
+    tst_url[${tst_xtn}]='https://wiki.earthdata.nasa.gov/pages/viewpage.action?pageId=182297715'
+    
+    # Test names "in English" (complete phrase "Test checks that ___")
+    tst_ngl[${tst_bnd}]='coordinates have bounds attributes'
+    tst_ngl[${tst_chr}]='identifier names comprised of legal characters'
+    tst_ngl[${tst_mss}]='variables do not have missing_value attributes'
+    tst_ngl[${tst_nan}]='data values do not contain NaN (or NaNf)'
+    tst_ngl[${tst_tm}]='time variables are stored in double precision'
+    tst_ngl[${tst_xtn}]='filename extension matches recommended list'
+
+    # Test short names (complete phrase "___ check passed/failed")
+    tst_sht[${tst_bnd}]='coordinate bounds'
+    tst_sht[${tst_chr}]='character-set'
+    tst_sht[${tst_mss}]='missing_value'
+    tst_sht[${tst_nan}]='NaN'
+    tst_sht[${tst_tm}]='precision of time variables'
+    tst_sht[${tst_xtn}]='filename extension'
+    
+    # Test invocation options to ncks
+    tst_opt[${tst_bnd}]='--chk_bnd'
+    tst_opt[${tst_chr}]='--chk_chr'
+    tst_opt[${tst_mss}]='--chk_mss'
+    tst_opt[${tst_nan}]='--chk_nan'
+    tst_opt[${tst_tm}]='--chk_tm'
+    tst_opt[${tst_xtn}]='--chk_xtn'
+
+    # Which tests are requested?
+    # http://stackoverflow.com/questions/27702452/loop-through-a-comma-separated-shell-variable
+    tst_nbr=0 # [sng] Number of tests to conduct
+    for tst in ${tst_lst//,/ }; do
+	tst_rqs[${tst_nbr}]=${tst}
+	# NB: Requested seasons are 0-based, defined seasons are 0-based
+	for ((tst_dfn_idx=${tst_idx_srt};tst_dfn_idx<${tst_nbr_max};tst_dfn_idx++)); do
+	    if [[ "${tst}" =~ "${tst_abb[${tst_dfn_idx}]}" ]] || [[ "${tst}" =~ "${tst_abb_lc[${tst_dfn_idx}]}" ]]; then
+		# Map requested to defined (r2d) tests and inverse (d2r)
+		# map_r2d[0]=3 means first test that user requested (i.e., in tst_lst) is fourth defined in table
+		# map_d2r[3]=0 means fourth defined test is first requested
+		map_r2d[${tst_nbr}]=${tst_dfn_idx}
+		map_d2r[${tst_dfn_idx}]=${tst_nbr}
+		let tst_nbr=${tst_nbr}+1
+		break
+	    fi # !match
+	done # !tst_dfn_idx
+	if [ "${tst_dfn_idx}" -eq "${tst_nbr_max}" ]; then
+	    printf "${spt_nm}: ERROR Requested test ${tst} not defined\n"
+	    exit 1
+	fi # !match
+    done # !tst_lst
+
+fi # !tst_flg
+
+# Read files from stdin pipe, positional arguments, or directory glob
+#printf "dbg: inp_aut  = ${inp_aut}\n"
+#printf "dbg: inp_glb  = ${inp_glb}\n"
+#printf "dbg: inp_psn  = ${inp_psn}\n"
+#printf "dbg: inp_std  = ${inp_std}\n"
+
+# Derived variables
+if [ -n "${drc_out_usr}" ]; then
+    chr_fst=${drc_out_usr:0:1}
+    if [ "${chr_fst}" = '-' ]; then
+	printf "${spt_nm}: WARNING first character of user-specified output directory drc_out is \"${chr_fst}\", which looks like an option itself. Be sure the ${spt_nm} '-O' option is followed by an argument that specifies the output directory for processed files. The '-O' option requires a pathname argument, and should not be confused with the '-O' flag (which takes no argument) used in the rest of NCO to force overwriting files (${spt_nm} automatically overwrites existing output files).\n"
+    fi # !chr_fst
+    # Fancy %/ syntax removes trailing slash (e.g., from $TMPDIR)
+    drc_out="${drc_out_usr%/}"
+fi # !drc_out_usr
+
+# Doubly-derived variables
+
+if [ ${inp_glb} = 'Yes' ]; then 
+    for fl in "${drc_in}"/*.nc "${drc_in}"/*.nc3 "${drc_in}"/*.nc4 "${drc_in}"/*.nc5 "${drc_in}"/*.nc6 "${drc_in}"/*.nc7 "${drc_in}"/*.cdf "${drc_in}"/*.hdf "${drc_in}"/*.he5 "${drc_in}"/*.h5 ; do
+	if [ -f "${fl}" ]; then
+	    fl_in[${fl_nbr}]=${fl}
+	    let fl_nbr=${fl_nbr}+1
+	fi # !file
+    done
+fi # !inp_glb
+if [ ${inp_psn} = 'Yes' ]; then
+    # Read any positional arguments
+    for ((psn_idx=1;psn_idx<=psn_nbr;psn_idx++)); do
+	fl_in[(${psn_idx}-1)]=${!psn_idx}
+	fl_nbr=${psn_nbr}
+    done # !psn_idx
+fi # !inp_psn
+if [ ${inp_std} = 'Yes' ]; then
+    # Input awaits on unit 0, i.e., on stdin
+    while read -r line; do # NeR05 p. 179
+	fl_in[${fl_nbr}]=${line}
+	let fl_nbr=${fl_nbr}+1
+    done < /dev/stdin
+fi # !inp_std
+
+# Create output directory
+if [ -n "${drc_out}" ] && [ ! -d "${drc_out}" ]; then 
+    chr_fst=${drc_out:0:1}
+    if [ "${chr_fst}" = '-' ]; then
+	echo "${spt_nm}: ERROR Attempting to mkdir user-specified output directory \"${drc_out}\" will fail because directory name begins with '-' which is an option indicator"
+	echo "${spt_nm}: HINT Specify an output directory name that does not begin with '-'"
+	exit 1
+    fi # !chr_fst
+    cmd_mkd="mkdir -p ${drc_out}"
+    eval ${cmd_mkd}
+    if [ "$?" -ne 0 ]; then
+	printf "${spt_nm}: ERROR Failed to create output directory. Debug this:\n${cmd_mkd}\n"
+	printf "${spt_nm}: HINT Creating a directory requires proper write permissions\n"
+	exit 1
+    fi # !err
+fi # !drc_out
+
+# Print initial state
+if [ ${dbg_lvl} -ge 2 ]; then
+    printf "dbg: dbg_lvl = ${dbg_lvl}\n"
+    printf "dbg: drc_in  = ${drc_in}\n"
+    printf "dbg: drc_out = ${drc_out}\n"
+    printf "dbg: hrd_pth = ${hrd_pth}\n"
+    printf "dbg: job_nbr = ${job_nbr}\n"
+    printf "dbg: mpi_flg = ${mpi_flg}\n"
+    printf "dbg: mpi_nbr = ${mpi_nbr}\n"
+    printf "dbg: nco_opt = ${nco_opt}\n"
+    printf "dbg: tst_lst = ${tst_lst}\n"
+    printf "dbg: tst_nbr = ${tst_nbr}\n"
+    printf "dbg: var_lst = ${var_lst}\n"
+    printf "dbg: xcl_flg = ${xcl_flg}\n"
+fi # !dbg
+if [ ${dbg_lvl} -ge 2 ]; then
+    psn_nbr=$#
+    if [ ${psn_nbr} -ge 1 ]; then
+	printf "dbg: Found ${psn_nbr} positional parameters (besides \$0):\n"
+	for ((psn_idx=1;psn_idx<=psn_nbr;psn_idx++)); do
+	    printf "dbg: psn_arg[${psn_idx}] = ${!psn_idx}\n"
+	done # !psn_idx
+    fi # !psn_nbr
+    if [ "${fl_nbr}" -ge 1 ]; then
+	printf "dbg: Processing ${fl_nbr} raw input files:\n"
+	for ((fl_idx=0;fl_idx<fl_nbr;fl_idx++)); do
+	    printf "dbg: fl_in[${fl_idx}] = ${fl_in[${fl_idx}]}\n"
+	done # !fl_idx
+    fi # !fl_nbr
+fi # !dbg
+
+# Human-readable summary
+date_srt=$(date +"%s")
+if [ ${dbg_lvl} -ge 0 ]; then
+    printf "ncchecker, a DIWG recommendation compliance checker, invoked with command:\n"
+    echo "${cmd_ln}"
+    printf "Started DIWG checker at `date`\n"
+    printf "# of recommendations that will be checked: ${tst_nbr}/${tst_nbr_max}\n"
+    printf "Recommendations that will be checked: "
+    for ((tst_idx=0;tst_idx<tst_nbr;tst_idx++)); do
+	idx_dfn=${map_r2d[${tst_idx}]}
+	printf "${tst_rfc[${idx_dfn}]} (${tst_sht[${idx_dfn}]}) "
+    done # !tst_idx
+    printf "\n"
+fi # !dbg
+
+if [ "${fl_nbr}" -lt 1 ]; then
+    echo "${spt_nm}: ERROR Checker did not receive any input files, fl_nbr = ${fl_nbr}"
+    exit 1
+fi # fl_nbr
+
+# Main Loop
+
+# Prepend input directory string to filename
+for ((fl_idx=0;fl_idx<fl_nbr;fl_idx++)); do
+    fl_out[${fl_idx}]="${drc_out}/$(basename ${fl_in[${fl_idx}]})"
+    #printf "fl_in[${fl_idx}]  = ${fl_in[${fl_idx}]}\n"
+    #printf "fl_out[${fl_idx}] = ${fl_out[${fl_idx}]}\n"
+    
+    printf "\nChecking file #${fl_idx}: ${fl_in[${fl_idx}]} ...\n"
+    
+    for ((tst_idx=0;tst_idx<tst_nbr;tst_idx++)); do
+
+	let tst_idxp1=${tst_idx}+1
+	# Index of test in definition table
+	idx_dfn=${map_r2d[${tst_idx}]}
+	
+	printf "\nTest ${tst_idxp1}: Check that ${tst_ngl[${idx_dfn}]} ...\n"
+	printf "Recommendation ${tst_rfc[${idx_dfn}]}: ${tst_rcm[${idx_dfn}]}\n"
+	echo "URL: ${tst_url[${idx_dfn}]}"
+	[[ ${dbg_lvl} -ge 0 ]] && date_chr=$(date +"%s")
+	
+	cmd_tst[${fl_idx}]="ncks --dbg_lvl=${dbg_lvl} ${tst_opt[${idx_dfn}]} ${fl_in[${fl_idx}]}"
+	
+	if [ ${dbg_lvl} -ge 2 ]; then
+	    echo ${cmd_tst[${fl_idx}]}
+	fi # !dbg
+	if [ ${dbg_lvl} -le 1 ]; then
+	    if [ -z "${par_opt}" ]; then
+		eval ${cmd_tst[${fl_idx}]}
+		if [ "$?" -ne 0 ]; then
+		    printf "Result: FAILURE ${tst_sht[${idx_dfn}]} check failed. Reproduce this single check with:\n${cmd_tst[${fl_idx}]}\n"
+		else # !err
+		    printf "Result: SUCCESS ${tst_sht[${idx_dfn}]} check passed.\n"
+		fi # !err
+	    else # !par_opt
+		eval ${cmd_bnd[${fl_idx}]} ${par_opt} # eval always returns 0 on backgrounded processes
+		bnd_pid[${fl_idx}]=$!
+	    fi # !par_opt
+	fi # !dbg
+	
+	if [ ${dbg_lvl} -ge 1 ]; then
+	    date_crr=$(date +"%s")
+	    date_dff=$((date_crr-date_chr))
+	    echo "Elapsed time for ${tst_sht[${idx_dfn}]} check = $((date_dff/60))m$((date_dff % 60))s"
+	fi # !dbg
+	
+    done # !tst_idx
+    
+done # !fl_idx
+
+date_end=$(date +"%s")
+if [ ${dbg_lvl} -ge 0 ]; then
+    printf "\nCompleted DIWG Compliance Checker at `date`\n"
+    date_dff=$((date_end-date_srt))
+    echo "Elapsed time $((date_dff/60))m$((date_dff % 60))s"
+fi # !dbg
+
+exit 0


=====================================
data/ncclimo
=====================================
@@ -146,7 +146,7 @@ if [ "${hrd_pth}" = 'Yes' ] && [ "${NCO_PATH_OVERRIDE}" = 'Yes' ]; then
 		module load esmf
 	    fi # !ncremap
             export PATH='/ccs/home/zender/bin_andes'\:${PATH}
-	    export LD_LIBRARY_PATH='/ccs/home/zender/lib_andes:/gpfs/alpine/proj-shared/cli115/e3sm-unified/base/envs/e3sm_unified_latest/lib'\:${LD_LIBRARY_PATH} ; ;;
+	    export LD_LIBRARY_PATH='/ccs/home/zender/lib_andes:/ccs/proj/cli115/software/e3sm-unified/base/envs/e3sm_unified_latest/lib'\:${LD_LIBRARY_PATH} ; ;;
 	blues* | blogin* | b[0123456789][0123456789][0123456789] )
 	    if [ ${spt_nm} = 'ncremap' ]; then
 		E3SMU_ROOT='/lcrc/soft/climate/e3sm-unified/base/envs/e3sm_unified_latest'
@@ -656,7 +656,7 @@ function fnc_usg_prn { # NB: dash supports fnc_nm (){} syntax, not function fnc_
     echo "${fnt_rvr}-v${fnt_nrm} ${fnt_bld}var_lst${fnt_nrm}  Variable list (empty means all) (default ${fnt_bld}${var_lst}${fnt_nrm}) [${fnt_tlc}var_lst, variable_list, var, vars, variable, variables${fnt_nrm}]"
     echo " ${fnt_bld}--var_xtr${fnt_nrm}  Extra variables for splitter timeseries (empty means none) (default ${fnt_bld}${var_xtr}${fnt_nrm}) [${fnt_tlc}var_xtr, var_extra, variables_extra, extra_variables${fnt_nrm}]"
     echo " ${fnt_bld}--version${fnt_nrm}  Version and configuration information [${fnt_tlc}version, vrs, config, configuration, cnf${fnt_nrm}]"
-    echo " ${fnt_bld}--vrt_out${fnt_nrm}   Vertical grid file for output (empty means none) (default ${fnt_bld}${vrt_out}${fnt_nrm}) [${fnt_tlc}vrt_out, vrt_fl, vrt, vrt_crd, vrt_grd_out${fnt_nrm}]"
+    echo " ${fnt_bld}--vrt_out${fnt_nrm}  Vertical grid file for output (empty means none) (default ${fnt_bld}${vrt_out}${fnt_nrm}) [${fnt_tlc}vrt_out, vrt_fl, vrt, vrt_crd, vrt_grd_out${fnt_nrm}]"
     echo " ${fnt_bld}--vrt_xtr${fnt_nrm}  Vertical extrapolation type (empty means none) (default ${fnt_bld}${vrt_xtr}${fnt_nrm}) [${fnt_tlc}vrt_xtr, xtr_mth, extrapolation_type, extrapolation_method${fnt_nrm}] (mss_val|nrs_ngh)"
     echo "${fnt_rvr}-X${fnt_nrm} ${fnt_bld}drc_xtn${fnt_nrm}  Extended climo directory (default ${fnt_bld}${drc_xtn}${fnt_nrm}) [${fnt_tlc}drc_xtn, xtn_drc, extended_dir, extended_climo, extended${fnt_nrm}]"
     echo "${fnt_rvr}-x${fnt_nrm} ${fnt_bld}drc_prv${fnt_nrm}  Previous climo directory (default ${fnt_bld}${drc_prv}${fnt_nrm}) [${fnt_tlc}drc_prv, prv_drc, previous_dir, previous_climo, previous${fnt_nrm}]"
@@ -2793,7 +2793,7 @@ if [ "${tms_flg}" = 'Yes' ]; then
 	    
 	    if [ "${rgn_avg}" = 'Yes' ]; then 
 		for ((var_idx=var_idx_srt;var_idx<=var_idx_end;var_idx++)); do
-		    cmd_rgn="*rgn_nbr=3;defdim(\"rgn\",rgn_nbr);*${var_sbs[${var_idx}]}_tmp=0.0f*${var_sbs[${var_idx}]}.avg(\$${hrz_dmn});*${var_sbs[${var_idx}]}_rgn[time,rgn]=${var_sbs[${var_idx}]}_tmp;${var_sbs[${var_idx}]}_rgn at coordinates=\"region_name\";*${lat_nm}_area=${lat_nm}+0.0*${area_nm};*msk_sth=0*${lat_nm}_area.int();*msk_nrt=0*${lat_nm}_area.int();*idx_glb=0;*idx_nrt=1;*idx_sth=2;*rgn_len=19;defdim(\"rgn_len\",rgn_len);region_name[rgn,rgn_len]=\" \";region_name(idx_glb,0:5)=\"Global\";region_name(idx_nrt,:)=\"Northern Hemisphere\";region_name(idx_sth,:)=\"Southern Hemisphere\";region_name at long_name=\"${var_sbs[${var_idx}]} timeseries array contains area-weighted averages over these regions\";where(${lat_nm}_area < 0.0) msk_sth=1; elsewhere msk_nrt=1;${var_sbs[${var_idx}]}_rgn(:,idx_nrt)=((${var_sbs[${var_idx}]}*${area_wgt}*msk_nrt).avg(\$${hrz_dmn})/(${area_wgt}*msk_nrt).avg(\$${hrz_dmn})).float();${var_sbs[${var_idx}]}_rgn(:,idx_sth)=((${var_sbs[${var_idx}]}*${area_wgt}*msk_sth).avg(\$${hrz_dmn})/(${area_wgt}*msk_sth).avg(\$${hrz_dmn})).float();${var_sbs[${var_idx}]}_rgn(:,idx_glb)=((${var_sbs[${var_idx}]}*${area_wgt}).avg(\$${hrz_dmn})/${area_wgt}.avg(\$${hrz_dmn})).float();${var_sbs[${var_idx}]}=${var_sbs[${var_idx}]}_rgn;push(&${var_sbs[${var_idx}]}@cell_methods,\" area: mean\");if(exists(time_bnds)) time_bnds=time_bnds;"
+		    cmd_rgn="*rgn_nbr=3;defdim(\"rgn\",rgn_nbr);*${var_sbs[${var_idx}]}_tmp=0.0f*${var_sbs[${var_idx}]}.avg(\$${hrz_dmn});*${var_sbs[${var_idx}]}_rgn[time,rgn]=${var_sbs[${var_idx}]}_tmp;${var_sbs[${var_idx}]}_rgn at coordinates=\"region_name\";*${lat_nm}_area=${lat_nm}+0.0*${area_nm};*msk_sth=0*${lat_nm}_area.int();*msk_nrt=0*${lat_nm}_area.int();*idx_glb=0;*idx_nrt=1;*idx_sth=2;*rgn_len=19;defdim(\"rgn_len\",rgn_len);region_name[rgn,rgn_len]=\" \";region_name(idx_glb,0:5)=\"Global\";region_name(idx_nrt,:)=\"Northern Hemisphere\";region_name(idx_sth,:)=\"Southern Hemisphere\";region_name at long_name=\"${var_sbs[${var_idx}]} timeseries array contains area-weighted averages over these regions\";where(${lat_nm}_area < 0.0) msk_sth=1; elsewhere msk_nrt=1;${var_sbs[${var_idx}]}_rgn(:,idx_nrt)=((${var_sbs[${var_idx}]}*${area_wgt}*msk_nrt).avg(\$${hrz_dmn})/(${area_wgt}*msk_nrt).avg(\$${hrz_dmn})).float();${var_sbs[${var_idx}]}_rgn(:,idx_sth)=((${var_sbs[${var_idx}]}*${area_wgt}*msk_sth).avg(\$${hrz_dmn})/(${area_wgt}*msk_sth).avg(\$${hrz_dmn})).float();${var_sbs[${var_idx}]}_rgn(:,idx_glb)=((${var_sbs[${var_idx}]}*${area_wgt}).avg(\$${hrz_dmn})/${area_wgt}.avg(\$${hrz_dmn})).float();${var_sbs[${var_idx}]}=${var_sbs[${var_idx}]}_rgn;push(&${var_sbs[${var_idx}]}@cell_methods,\" area: mean\");if(exists(time_bnds)) time_bnds=time_bnds;if(exists(time_bounds)) time_bounds=time_bounds;"
 		    cmd_avg[${var_idx}]="${cmd_mpi[${var_idx}]} OMP_PROC_BIND=false ncap2 -O -v -s '${cmd_rgn}' ${fl_out[${var_idx}]} ${fl_out[${var_idx}]}"
 		    # 20220817: Prior to today, --glb_avg used ncwa for global average
 		    # As of NCO 5.1.1, --glb_avg is a deprecated synonym for --rgn_avg


=====================================
data/ncremap
=====================================
@@ -162,7 +162,7 @@ if [ "${hrd_pth}" = 'Yes' ] && [ "${NCO_PATH_OVERRIDE}" = 'Yes' ]; then
 	    # 20190827: Must guarantee finding mpirun
 	    source ${MODULESHOME}/init/sh # 20150607: PMC Ensures find module commands will be found
 	    if [ ${spt_nm} = 'ncremap' ]; then
-		E3SMU_ROOT='/gpfs/alpine/proj-shared/cli115/e3sm-unified/base/envs/e3sm_unified_latest'
+		E3SMU_ROOT='/ccs/proj/cli115/software/e3sm-unified/base/envs/e3sm_unified_latest'
 	    fi # !ncremap
             export PATH='/ccs/home/zender/bin_andes'\:${PATH}
 	    export LD_LIBRARY_PATH='/ccs/home/zender/lib_andes'\:${LD_LIBRARY_PATH} ; ;;
@@ -751,7 +751,7 @@ function fnc_usg_prn { # NB: dash supports fnc_nm (){} syntax, not function fnc_
     echo " ${fnt_bld}--vrt_in${fnt_nrm}   Vertical grid file for input (empty means none) (default ${fnt_bld}${vrt_in}${fnt_nrm}) [${fnt_tlc}vrt_in, vrt_grd_in${fnt_nrm}]"
     echo " ${fnt_bld}--vrt_nm${fnt_nrm}   Vertical coordinate name (empty means \"plev\") (default ${fnt_bld}${vrt_nm}${fnt_nrm}) [${fnt_tlc}vrt_nm, plev_nm, vertical_coordinate_name${fnt_nrm}]"
     echo " ${fnt_bld}--vrt_ntp${fnt_nrm}  Vertical interpolation type (empty means none) (default ${fnt_bld}${vrt_ntp}${fnt_nrm}) [${fnt_tlc}vrt_ntp, ntp_mth, interpolation_type, interpolation_method${fnt_nrm}] (lin|log)"
-    echo " ${fnt_bld}--vrt_out${fnt_nrm}   Vertical grid file for output (empty means none) (default ${fnt_bld}${vrt_out}${fnt_nrm}) [${fnt_tlc}vrt_out, vrt_fl, vrt, vrt_crd, vrt_grd_out${fnt_nrm}]"
+    echo " ${fnt_bld}--vrt_out${fnt_nrm}  Vertical grid file for output (empty means none) (default ${fnt_bld}${vrt_out}${fnt_nrm}) [${fnt_tlc}vrt_out, vrt_fl, vrt, vrt_crd, vrt_grd_out${fnt_nrm}]"
     echo " ${fnt_bld}--vrt_xtr${fnt_nrm}  Vertical extrapolation type (empty means none) (default ${fnt_bld}nrs_ngh${fnt_nrm}) [${fnt_tlc}vrt_xtr, xtr_mth, extrapolation_type, extrapolation_method${fnt_nrm}] (linear|mss_val|nrs_ngh|zero)"
     echo "${fnt_rvr}-W${fnt_nrm} ${fnt_bld}wgt_opt${fnt_nrm}  Weight-generator options (default ${fnt_bld}${wgt_opt_esmf}${fnt_nrm}) [${fnt_tlc}wgt_opt, esmf_opt, esmf_options, tempest_opt, tps_opt${fnt_nrm}]"
     echo "${fnt_rvr}-w${fnt_nrm} ${fnt_bld}wgt_cmd${fnt_nrm}  Weight-generator command (default ${fnt_bld}${wgt_exe_esmf}${fnt_nrm}) [${fnt_tlc}wgt_cmd, wgt_gnr, weight_command, weight_generator${fnt_nrm}]"
@@ -1246,7 +1246,7 @@ elif [ ${alg_typ} = 'se2fv_flx' ] || [ ${alg_typ} = 'mono_se2fv' ] || [ ${alg_ty
 # NB: 20220922 TempestRemap began replacing the --mono* options with --method mono*
     cnv_opt_src="-B -i GLOBAL_DOFS -r ${se_np_nbr}"
     cnv_opt_dst="-B"
-    wgt_opt_mbt="--method cgll --order ${se_np_nbr} --global_id GLOBAL_DOFS --method fv --monotonic 1 --global_id GLOBAL_ID"
+    wgt_opt_mbt="--method cgll --order ${se_np_nbr} --global_id GLOBAL_DOFS --method fv --monotonicity 1 --global_id GLOBAL_ID"
     wgt_opt_tps="--in_type cgll --in_np ${se_np_nbr} --out_type fv --mono"
     alg_opt='se2fv_flx'
     wgt_typ='tempest'
@@ -1260,7 +1260,7 @@ elif [ ${alg_typ} = 'se2fv_stt' ] || [ ${alg_typ} = 'highorder_se2fv' ] || [ ${a
 elif [ ${alg_typ} = 'se2fv_alt' ] || [ ${alg_typ} = 'intbilin_se2fv' ] || [ ${alg_typ} = 'accurate_monotone_nonconservative_se2fv' ]; then # alg_sng='intbilin'
     cnv_opt_src="-B -i GLOBAL_DOFS -r ${se_np_nbr}"
     cnv_opt_dst="-B"
-    wgt_opt_mbt="--method cgll --order ${se_np_nbr} --method fv --monotonic 3 --noconserve"
+    wgt_opt_mbt="--method cgll --order ${se_np_nbr} --method fv --monotonicity 3 --noconserve"
     wgt_opt_tps="--in_type cgll --in_np ${se_np_nbr} --out_type fv --mono3 --noconserve"
     alg_opt='se2fv_alt'
     wgt_typ='tempest'
@@ -1268,7 +1268,7 @@ elif [ ${alg_typ} = 'se2se' ] || [ ${alg_typ} = 'cs2cs' ] || [ ${alg_typ} = 'con
     cnv_opt_src="-B -i GLOBAL_DOFS -r ${se_np_nbr}"
     cnv_opt_dst="-B -i GLOBAL_DOFS -r ${se_np_nbr}"
     # 20190227: Add mono for se2se per recommendation of Mark Taylor
-    wgt_opt_mbt="--method cgll --order ${se_np_nbr} --method cgll --order ${se_np_nbr} --monotonic 1"
+    wgt_opt_mbt="--method cgll --order ${se_np_nbr} --method cgll --order ${se_np_nbr} --monotonicity 1"
     wgt_opt_tps="--in_type cgll --in_np ${se_np_nbr} --out_type cgll --out_np ${se_np_nbr} --mono"
     alg_opt='se2se'
     wgt_typ='tempest'
@@ -1276,7 +1276,7 @@ elif [ ${alg_typ} = 'fv2se_flx' ] || [ ${alg_typ} = 'monotr_fv2se' ] || [ ${alg_
     # NB: Generate mono map for opposite direction regridding (i.e., reverse switches and grids), then transpose
     cnv_opt_src="-B"
     cnv_opt_dst="-B -i GLOBAL_DOFS -r ${se_np_nbr}"
-    wgt_opt_mbt="--method cgll --order ${se_np_nbr} --method fv --monotonic 1"
+    wgt_opt_mbt="--method cgll --order ${se_np_nbr} --method fv --monotonicity 1"
     wgt_opt_tps="--in_type cgll --in_np ${se_np_nbr} --out_type fv --mono"
     alg_opt='fv2se_flx'
     wgt_typ='tempest'
@@ -1293,7 +1293,7 @@ elif [ ${alg_typ} = 'fv2se_alt' ] || [ ${alg_typ} = 'mono_fv2se' ] || [ ${alg_ty
     cnv_opt_src="-B"
     cnv_opt_dst="-B -i GLOBAL_DOFS -r ${se_np_nbr}"
     # 20200525: Remove "--volumetric" from fv2se_mono per Mark Taylor modifying Confluence instructions
-    wgt_opt_mbt="--method fv --order 1 --method cgll --order ${se_np_nbr} --monotonic 1"
+    wgt_opt_mbt="--method fv --order 1 --method cgll --order ${se_np_nbr} --monotonicity 1"
     wgt_opt_tps="--in_type fv --in_np 1 --out_type cgll --out_np ${se_np_nbr} --mono"
     alg_opt='fv2se_alt'
     wgt_typ='tempest'


=====================================
debian/changelog
=====================================
@@ -1,8 +1,14 @@
+nco (5.2.2-1) unstable; urgency=low
+
+  * new upstream version Bambino: ncchecker; ncclimo: elm rgn_avg time_bounds; ncremap: xcl level, mbtr --monotonicity
+
+ -- Charlie Zender <zender at uci.edu> Fri, 22 March 2024 12:26:09 -0700
+
 nco (5.2.1-1) unstable; urgency=low
 
   * new upstream version Shabu Shabu: ncclimo/ncremap MPI script fix, nco_qnt_mtd() pedantic fix
 
- -- Charlie Zender <zender at uci.edu> Fri, 16 April 2024 12:26:08 -0700
+ -- Charlie Zender <zender at uci.edu> Sun, 18 February 2024 12:26:08 -0700
 
 nco (5.2.0-1) unstable; urgency=low
 


=====================================
doc/ANNOUNCE
=====================================
@@ -1,131 +1,60 @@
 $Header$ -*-text-*-
 
-netCDF Operators NCO version 5.2.1 sheepishly steps forward
+netCDF Operators NCO version 5.2.2 kangeroo forward
 
 http://nco.sf.net (Homepage, Mailing lists, Help)
 http://github.com/nco/nco (Source Code, Issues, Releases)
 
 What's new?
-Version 5.2.1 fixes an issue with ncremap and ncclimo in MPI mode.
-Another small fix to enables GCC compilation in pedantic mode.
-No new features are implemented, but it was too late to recall 5.2.0.
-My apologies and thanks to the package maintainers.
+Version 5.2.2 introduces a new operator, ncchecker, that checks
+dataset compliance with a small yet growing number of
+recommendations. ncclimo no longer omits time_bounds from ELM/CLM
+regional averages. No new features are implemented.
+Skip this release if these changes are not important to you.
 
-Work on NCO 5.2.2 has commenced and aims to add support for Zarr S3 
-stores, and to polish support for new codecs..
+Work on NCO 5.2.3 has commenced and aims to add support for Zarr S3 
+stores, and to enhance the vertical regridder.
 
 Enjoy,
 Charlie
 
 NEW FEATURES (full details always in ChangeLog):
 
-[These just repeat the changes in 5.2.0 since most peopld never used it]
-
-A. ncks can now help analyze initial condition and restart datasets
-produced by the E3SM ELM and CESM CLM/CTSM land-surface models.
-Whereas gridded history datasets from these ESMs use a standard
-gridded data format, these land-surface "restart files" employ a
-custom packing format that unwinds multi-dimensional data into
-sparse, 1-D (S1D) arrays that are not easily visualized. ncks can
-now convert these S1D files into gridded datasets where all dimensions
-are explicitly declared (rather than unrolled or "packed"). 
-Invoke this conversion feature with the --s1d option and point
-ncks to a file that contains the horizontal coordinates (which
-restart files do not explicitly contain) and the restart file.
-The output file is the fully gridded input file, with no loss
-of information:
-ncks --s1d --hrz=elmv3_history.nc elmv3_restart.nc out.nc
-The output file contains all input variables placed on a lat-lon or 
-unstructured grid, with new dimensions for Plant Funtional Type (PFT)
-and multiple elevation class (MEC).
-http://nco.sf.net/nco.html#s1d
-
-B. ncclimo timeseries mode now supports all input methods (including
-automatic filename generation) long-supported by climo mode. Previously
-ncclimo (in timeseries mode) had to receive explicit lists of input
-files, either from stdin or from the command line. Now ncclimo will
-automatically generate the input file list for files that adhere to
-common CESM/E3SM naming conventions (usually for monthly average
-files). The syntax is identical to that long used in climo mode:
-% ncclimo --split -c $caseid -s 2000 -e 2024 -i $drc_in -o $drc_out
-http://nco.sf.net/nco.html#ncclimo
-
-C. ncremap supports --alg_lst=alg_lst, a comma-separated list of the
-algorithms that MWF-mode uses to create map-files. This option can
-be used to shorten or alter the default list, which is 
-'esmfaave,esmfbilin,ncoaave,ncoidw,traave,trbilin,trfv2,trintbilin'.
-Each name in the list should be the primary name of an algorithm,
-not a synonym. For example, use 'esmfaave,traave' not
-'aave,fv2fv_flx' (the latter are backward-compatible synonyms
-for the former). The algorithm list must be consistent with grid-types
-supplied: ESMF algorithms work with meshes in ESMF, SCRIP, or UGRID
-formats. NCO algorithms only work with meshes in SCRIP format.
-TempestRemap algorithms work with meshes in ESMF, Exodus, SCRIP, or
-UGRID formats. On output, ncremap inserts each algorithm name into the 
-output map-file name in this format: map_src_to_dst_alg.date.nc.
-For example,
-% ncremap -P mwf --alg_lst=esmfnstod,ncoaave,ncoidw,traave,trbilin \
-  -s ocean.QU.240km.scrip.181106.nc -g ne11pg2.nc --nm_src=QU240 \
-  --nm_dst=ne11pg2 --dt_sng=20240201
-...
-% ls map*
-map_QU240_to_ne11pg2_esmfnstod.20240201.nc
-map_QU240_to_ne11pg2_ncoaave.20240201.nc
-map_QU240_to_ne11pg2_ncoidw.20240201.nc
-map_QU240_to_ne11pg2_traave.20240201.nc
-map_QU240_to_ne11pg2_trbilin.20240201.nc
-map_ne11pg2_to_QU240_esmfnstod.20240201.nc
-map_ne11pg2_to_QU240_ncoaave.20240201.nc
-map_ne11pg2_to_QU240_ncoidw.20240201.nc
-map_ne11pg2_to_QU240_traave.20240201.nc
-map_ne11pg2_to_QU240_trbilin.20240201.nc
-
-http://nco.sf.net/nco.html#alg_lst
-http://nco.sf.net/nco.html#ncremap
-
-D. All NCO operators now support the draft CF Convention on encoding
-metadata that describes lossy compression applied to the dataset.
-See https://github.com/cf-convention/cf-conventions/issues/403.
-For example, all variables quantized by NCO now receive attributes
-that contain the level of quantization and that point to a
-container variable that describes the algorithm:
-
-% ncks -O -7 --cmp='btr|shf|zst' in.nc foo.nc
-% ncks -m -v ts foo.nc
- char compression_info ;
-   char compression_info ;
-   compression_info:family = "quantize" ;
-   compression_info:algorithm = "BitRound" ;
-   compression_info:implementation = "libnetcdf version 4.9.3-development" ;
- float ts(time,lat,lon) ;
-      ts:standard_name = "surface_temperature" ;
-      ts:lossy_compression = "compression_info" ;
-      ts:lossy_compression_nsb = 9 ;
-
-http://nco.sf.net/nco.html#qnt
-
-E. ncks supports a new flag, --chk_bnd, that reports whether all
-coordinate variables in a file contain associated "bounds" variables. 
-This check complies with CF Conventions and with NASA's Dataset
-Interoperability Working Group (DIWG) recommendations:
-$ ncks --chk_bnd ~/nco/data/in.nc
-ncks: WARNING nco_chk_bnd() reports coordinate Lat does not contain "bounds" attribute
-ncks: WARNING nco_chk_bnd() reports coordinate Lon does not contain "bounds" attribute
-ncks: INFO nco_chk_bnd() reports total number of coordinates without "bounds" attribute is 2
-http://nco.sf.net/nco.htlm/chk_bnd
-
-F. ncremap supports the TempestRemap trfv2 algorithm, a 2nd order FV
-reconstruction, that is cell-integrated on the target grid.
-ncremap --alg_typ=trfv2 -s grd_src.nc -g grd_dst.nc --map=map.nc
-http://nco.sf.net/nco.htlm/trfv2
+A. The new ncchecker command checks netCDF files for compliance with
+select best practices rules and recommendations from various data and
+metadata standards bodies. These include the Climate & Forecast (CF)
+Metadata Conventions and the NASA Dataset Interoperability Working Group
+(DIWG) recommendations. Only a small subset (six tests) of CF and
+DIWG recommendations are currently supported. The number of tests
+implemented, or, equivalently, of recommendations checked, is expected
+to grow. 
+
+ncchecker in1.nc in2.nc # Run all tests on two files
+ncchecker -v var1,var2 in1.nc # Check only two variables
+ncchecker *.nc # Glob input files via wildcard
+ls *.nc | ncchecker # Input files via stdin
+ncchecker --dbg=2 *.nc # Debug ncchecker
+ncchecker --tests=nan,mss *.nc # Select only two tests
+ncchecker --tests=xtn,tm,nan,mss,chr,bnd *.nc # Change test ordering
+ncchecker file:///Users/zender/in_zarr4#mode=nczarr,file # Check Zarr object(s)
+
+The output contains counts of the location and number of failed tests,
+or prints "SUCCESS" for tests with no failures.
+http://nco.sf.net/nco.html#ncchecker
 
 BUG FIXES:
    
-A. ncclimo fixes an error in the climatology_bounds variable
-output for the climatological December file in DJF-winter mode
-climos. JFD-winter mode climos (used by most people) are unaffected.
-There is no workaround. The solution is to upgrade. 
-ncclimo --wnt_md=djf -c $caseid -s 2000 -e 2024 ...
+A. ncclimo fixes an error where it omitted the time_bounds variable
+from regional averages of ELM/CLM timeseries. The workaround is to
+manually append the variable. The solution is to upgrade. 
+ncclimo --split --rgn_avg -c $caseid -s 2000 -e 2024 ...
+
+B. ncremap fixes an error where it used the wrong option to
+mbtempest to invoke monotonicity. Instead of "--monotonicity"
+it used "--monotonic", which is unknown to mbtempest.
+The workaround is to supply the correct option with ncremap
+--wgt_opt. The solution is to upgrade. Thanks to Walter Hannah of
+LLNL for reporting this mistake.
 
 Full release statement at http://nco.sf.net/ANNOUNCE
     


=====================================
doc/ChangeLog
=====================================
@@ -1,3 +1,61 @@
+2024-03-22  Charlie Zender  <zender at uci.edu>
+
+	* NCO 5.2.2 release procedure:
+	cd ~/nco;git commit -a -m 'Version 5.2.2: Bambino';git push
+	git tag -a 5.2.2 -m 'ncchecker; ncclimo: elm rgn_avg time_bounds; ncremap: xcl level, mbtr --monotonicity';git push --tags
+
+	* ncchecker tidy manpage, add to homepage, add to nco.texi
+
+2024-03-21  Charlie Zender  <zender at uci.edu>
+
+	* NCO 5.2.2-alpha03 release procedure:
+	cd ~/nco;git commit -a -m 'Version 5.2.2-alpha03: Monkeybaut IPA';git push
+	git tag -a 5.2.2-alpha03 -m 'ncchecker RFC #s, tst_lst; ncclimo: elm rgn_avg time_bounds; ncremap: xcl level';git push --tags
+
+	* ncclimo: add "time_bounds" to ELM regional timeseries generated with --rgn_avg
+
+2024-03-20  Charlie Zender  <zender at uci.edu>
+
+	* ncremap: add "level" to exclusion list for vertical interpolation
+
+2024-03-15  Charlie Zender  <zender at uci.edu>
+
+	* Clarify use of $caseid in ncclimo for non-standard filenames
+
+2024-03-07  Charlie Zender  <zender at uci.edu>
+
+	* ncchecker abstract all tests into template that uses info from test definition table
+
+	* ncchecker implement flexible test selection logic
+
+	* Rename diwg_chk to ncchecker
+
+2024-03-05  Charlie Zender  <zender at uci.edu>
+
+	* diwg_chk: Add RFC recommendation numbers, sort tests in that order
+
+	* NCO 5.2.2-alpha02 release procedure:
+	cd ~/nco;git commit -a -m 'Version 5.2.2-alpha02: Broken Molar';git push
+	git tag -a 5.2.2-alpha02 -m 'diwg_chk; ncremap: --monotonicity';git push --tags
+
+	* Let it be known that ncap2 started linking correctly with MacOS again today
+
+	* Add diwg_chk, support distribution in autotools and CMake
+
+2024-02-27  Charlie Zender  <zender at uci.edu>
+
+	* ncremap: Walter Hannah changed mbtempest argument name from "monotonic" to "monotonicity"
+
+2024-02-21  Charlie Zender  <zender at uci.edu>
+
+	* NCO 5.2.2-alpha01 release procedure:
+	cd ~/nco;git commit -a -m 'Version 5.2.2-alpha01: IRS 1040';git push
+	git tag -a 5.2.2-alpha01 -m 'Functionally identical to 5.2.1 (adds -lgslcblas, fix andes paths)';git push --tags
+
+	* ncremap/ncclimo/configure.eg change Andes E3SMU paths to /ccs/proj/cli115/software/e3sm-unified
+
+	* bld/Makefile, nco++/Makefile add -lgslcblas for Derecho
+
 2024-02-18  Charlie Zender  <zender at uci.edu>
 
 	* NCO 5.2.1 release procedure:


=====================================
doc/VERSION
=====================================
@@ -1 +1 @@
-5.2.1
+5.2.2


=====================================
doc/debian.txt
=====================================
@@ -29,18 +29,18 @@ apt-get install dh-make debhelper devscripts fakeroot gnupg debian-policy develo
 
 2. Debian build procedure recommends placing entire package source in
    subdirectory of main package. 
-   For starters, we wish to create .debs of tagged releases, e.g., nco-5.2.1
-   First we create a clean source distribution of nco and place it in nco-5.2.1
+   For starters, we wish to create .debs of tagged releases, e.g., nco-5.2.2
+   First we create a clean source distribution of nco and place it in nco-5.2.2
    Until we know what is necessary, however, we just copy a snapshot
    
    2.1 Clean all build files from development directory
 
 cd ~/nco;make distclean;cd bld;make clean;cd ~
 tar cvzf ./nco/nco.tar.gz ./nco/*
-cd ~/nco;tar xvzf nco.tar.gz;mv nco nco-5.2.1
-/bin/rm nco.tar.gz;tar cvzf nco-5.2.1.tar.gz ./nco-5.2.1/*
-cd ~/nco/nco-5.2.1
-dh_make -e zender at uci.edu -f ../nco-5.2.1.tar.gz
+cd ~/nco;tar xvzf nco.tar.gz;mv nco nco-5.2.2
+/bin/rm nco.tar.gz;tar cvzf nco-5.2.2.tar.gz ./nco-5.2.2/*
+cd ~/nco/nco-5.2.2
+dh_make -e zender at uci.edu -f ../nco-5.2.2.tar.gz
 
     2.2 The preceding steps created template debian files for a .deb,
     Those files now reside in ~/nco/debian.
@@ -55,7 +55,7 @@ dh_make -e zender at uci.edu -f ../nco-5.2.1.tar.gz
    from previous build
 
    cd ~/nco;/bin/rm *.gz
-   cd ~/nco/nco-5.2.1
+   cd ~/nco/nco-5.2.2
    dpkg-buildpackage -rfakeroot > foo 2>&1
    dpkg-buildpackage -rsudo > foo 2>&1
 
@@ -84,33 +84,33 @@ patch -p0 < nco_X.Y.Z-3.diff   # Patch destination with Debian diff
    make tags
 # Put cute version-specific string in nco_ctl.c:nco_nmn_get()
 # Install correct version numbers before updating Debian
-# tags-query replace 5.2.1 with X.Y.Z+1
+# tags-query replace 5.2.2 with X.Y.Z+1
 # If tags-query replace does not work, be sure to manually change
 # versions in configure.ac, debian/files, doc/ANNOUNCE, doc/debian.txt,
 # doc/index.shtml, doc/nco.texi, bld/nco_dst.pl, doc/VERSION
 # 20141201: Change NCO_VERSION_PATCH in src/nco.h!!!!!!!!!!!!!!!!!!!!!!
-   cd ~/nco/debian;dch -b --force-distribution --distribution=unstable -v 5.2.1-1 # Update changelog (-b forces this version number)
+   cd ~/nco/debian;dch -b --force-distribution --distribution=unstable -v 5.2.2-1 # Update changelog (-b forces this version number)
    emacs ~/nco/bld/nco.spec # Update changelog
 # For unknown reason rules file may lose its executable bit
    chmod a+x ~/nco/debian/rules
 # Rebuild autotools so new version # propagates
    cd ~/nco;aclocal;autoheader;automake --foreign;autoconf
 # Save all files in emacs before tagging
-   ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln nco-5.2.1
+   ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln nco-5.2.2
 # Upload tarball to SF https://sourceforge.net/projects/nco/files 
-   cd;scp dust.ess.uci.edu:/var/www/html/nco/src/nco-5.2.1.tar.gz .
+   cd;scp dust.ess.uci.edu:/var/www/html/nco/src/nco-5.2.2.tar.gz .
 
 7. Ubuntu PPA
 https://help.launchpad.net/Packaging/PPA
-dput NCO nco_5.2.1-2~ppa1_source.changes
+dput NCO nco_5.2.2-2~ppa1_source.changes
 sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com
 
 # Location of build diagnostics for mentors to help 
-http://dust.ess.uci.edu/nco/src/nco_5.2.1-1.dpkg-buildpackage.txt
-http://dust.ess.uci.edu/nco/src/nco_5.2.1-1.dsc
-http://dust.ess.uci.edu/nco/src/nco_5.2.1-1_i386.changes
-http://dust.ess.uci.edu/nco/src/nco_5.2.1-1_i386.deb
-http://dust.ess.uci.edu/nco/src/nco_5.2.1.orig.tar.gz
+http://dust.ess.uci.edu/nco/src/nco_5.2.2-1.dpkg-buildpackage.txt
+http://dust.ess.uci.edu/nco/src/nco_5.2.2-1.dsc
+http://dust.ess.uci.edu/nco/src/nco_5.2.2-1_i386.changes
+http://dust.ess.uci.edu/nco/src/nco_5.2.2-1_i386.deb
+http://dust.ess.uci.edu/nco/src/nco_5.2.2.orig.tar.gz
 
 # Becoming a Debian developer
 http://www.debian.org/devel/join/newmaint
@@ -164,31 +164,31 @@ Matej Vela <vela at debian.org>, Daniel Baumann <daniel at debian.org>, Warren Turkal
 # export LD_LIBRARY_PATH=/usr/lib:/lib:/usr/X11R6/lib
 # sudo aptitude install antlr bison flex gsl-bin libgsl0-dev libantlr-dev netcdf-bin libnetcdfc7 libnetcdf-dev texinfo libcurl4-gnutls-dev libexpat1-dev libxml2-dev udunits-bin libudunits2-0 libudunits2-dev
 cd ~/nco;cvc
-sudo /bin/rm -rf ${DATA}/nco-5.2.1 ${DATA}/nco_5.2.1* ${DATA}/debian # Cleanup last build. sudo necessary for removal because dpkg-buildpackage uses sudo?
-# cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -r nco-5.2.1-1 -d nco-5.2.1 nco # Export based on tag
-cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -D "1 second ago" -d nco-5.2.1 nco # Export most recent
-tar cvzf ./nco_5.2.1.orig.tar.gz --exclude='nco-5.2.1/debian*' --exclude='.cvsignore' --exclude='ncap_lex.c' --exclude='ncap_yacc.[ch]' ./nco-5.2.1 
-/bin/rm -rf ${DATA}/nco-5.2.1 # Remove cvs-exported directory
-tar xvzf ./nco_5.2.1.orig.tar.gz # Untar to get directory without excluded files
-mkdir -p ${DATA}/nco-5.2.1/debian/source;cd ~/nco/debian;/bin/cp changelog compat control convert copyright doc-base files info rules ${DATA}/nco-5.2.1/debian;cd ~/nco/debian/source;/bin/cp format ${DATA}/nco-5.2.1/debian/source # Replace debian directory with _CURRENT_ (main trunk) settings
+sudo /bin/rm -rf ${DATA}/nco-5.2.2 ${DATA}/nco_5.2.2* ${DATA}/debian # Cleanup last build. sudo necessary for removal because dpkg-buildpackage uses sudo?
+# cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -r nco-5.2.2-1 -d nco-5.2.2 nco # Export based on tag
+cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -D "1 second ago" -d nco-5.2.2 nco # Export most recent
+tar cvzf ./nco_5.2.2.orig.tar.gz --exclude='nco-5.2.2/debian*' --exclude='.cvsignore' --exclude='ncap_lex.c' --exclude='ncap_yacc.[ch]' ./nco-5.2.2 
+/bin/rm -rf ${DATA}/nco-5.2.2 # Remove cvs-exported directory
+tar xvzf ./nco_5.2.2.orig.tar.gz # Untar to get directory without excluded files
+mkdir -p ${DATA}/nco-5.2.2/debian/source;cd ~/nco/debian;/bin/cp changelog compat control convert copyright doc-base files info rules ${DATA}/nco-5.2.2/debian;cd ~/nco/debian/source;/bin/cp format ${DATA}/nco-5.2.2/debian/source # Replace debian directory with _CURRENT_ (main trunk) settings
 #export DEB_BUILD_OPTIONS='disable-dap-netcdf disable-netcdf4 disable-udunits2'; # Disable optional packages based on available Debian support
-#cd ${DATA}/nco-5.2.1;dpkg-buildpackage -rsudo -uc -us > ~/foo.nco 2>&1 # -uc -us: Do not sign changes or source files
-#cd ${DATA}/nco-5.2.1;dpkg-buildpackage -rsudo -sa > ~/foo.nco 2>&1 # -sa: Include _orig.tar.gz in .changes 
-cd ${DATA}/nco-5.2.1;dpkg-buildpackage -rsudo > ~/foo.nco 2>&1
+#cd ${DATA}/nco-5.2.2;dpkg-buildpackage -rsudo -uc -us > ~/foo.nco 2>&1 # -uc -us: Do not sign changes or source files
+#cd ${DATA}/nco-5.2.2;dpkg-buildpackage -rsudo -sa > ~/foo.nco 2>&1 # -sa: Include _orig.tar.gz in .changes 
+cd ${DATA}/nco-5.2.2;dpkg-buildpackage -rsudo > ~/foo.nco 2>&1
 sudo dpkg --remove nco
-sudo dpkg --install ${DATA}/nco_5.2.1-1_*.deb
+sudo dpkg --install ${DATA}/nco_5.2.2-1_*.deb
 cd ~/nco/bld;MY_BIN_DIR=/usr/bin ../bm/nco_bm.pl --regress
 # http://lintian.debian.org/full/zender@uci.edu.html
-lintian ${DATA}/nco_5.2.1-1_*.deb
-ls -l ${DATA}/nco_5.2.1*
+lintian ${DATA}/nco_5.2.2-1_*.deb
+ls -l ${DATA}/nco_5.2.2*
 m ~/foo.nco
 # Upload Ubuntu (rather than Debian) packages to websites
-scp ${DATA}/nco_5.2.1* dust.ess.uci.edu:/var/www/html/nco/src
-scp ${DATA}/nco_5.2.1* zender,nco at web.sf.net:/home/project-web/nco/htdocs/src
+scp ${DATA}/nco_5.2.2* dust.ess.uci.edu:/var/www/html/nco/src
+scp ${DATA}/nco_5.2.2* zender,nco at web.sf.net:/home/project-web/nco/htdocs/src
 # NB: Make sure RPMs build before uploading to debian, since changing
 # Debian versions is a PITA
 # NB: Only upload pbuilder Debian Sid (not personal Ubuntu) .deb builds to Debian mentors
-# cd ${DATA};dupload -t mentors nco_5.2.1-1_*.changes
+# cd ${DATA};dupload -t mentors nco_5.2.2-1_*.changes
 bsrc # Reset shell environment for regular development
 
 # New build system #2
@@ -202,52 +202,52 @@ DIST=sid sudo pbuilder update # Update chroot before building package in it
 # dget http://ftp.debian.org/debian/pool/main/n/nco/nco_3.9.0-1.dsc
 # dget http://ftp.debian.org/debian/pool/main/n/netcdf/netcdf_3.6.1-1.dsc
 # apt-get source nco # Get package source
-sudo /bin/rm /var/cache/pbuilder/result/nco_5.2.1* # Cleanup prior build
+sudo /bin/rm /var/cache/pbuilder/result/nco_5.2.2* # Cleanup prior build
 # To pass DEB_BUILD_OPTIONS to pbuilder while using sudo, one must first
 # modify sudoers with visudo to prevent sudo from resetting environment
 #export DEB_BUILD_OPTIONS='disable-dap-netcdf disable-netcdf4 disable-udunits2'; # Disable optional packages based on available Debian support
-cd ${DATA};DIST=sid sudo pbuilder build nco_5.2.1-1.dsc > ~/foo.nco.pbuilder 2>&1
-cd /var/cache/pbuilder/result;debsign -k6F635D10 nco_5.2.1-1_*.changes
-lintian /var/cache/pbuilder/result/nco_5.2.1-1_*.deb
+cd ${DATA};DIST=sid sudo pbuilder build nco_5.2.2-1.dsc > ~/foo.nco.pbuilder 2>&1
+cd /var/cache/pbuilder/result;debsign -k6F635D10 nco_5.2.2-1_*.changes
+lintian /var/cache/pbuilder/result/nco_5.2.2-1_*.deb
 sudo dpkg --remove nco
-sudo dpkg --install /var/cache/pbuilder/result/nco_5.2.1-1_*.deb
+sudo dpkg --install /var/cache/pbuilder/result/nco_5.2.2-1_*.deb
 cd ~/nco/bld;MY_BIN_DIR=/usr/bin ../bm/nco_bm.pl --regress
 # NB: Upload pbuilder Debian Sid packages to Debian mentors, but not
 # to personal or NCO websites since most people use Ubuntu not Debian
 # NB: Debian versions are a PITA, ensure RPMs build before uploading to Debian
-cd /var/cache/pbuilder/result;dupload -t mentors nco_5.2.1-1_*.changes
+cd /var/cache/pbuilder/result;dupload -t mentors nco_5.2.2-1_*.changes
 
 # RPM builds as root
 export rpm_root='/usr/src/redhat'
 # export sudo_sng='' # sudo not-necessary when builing in user directories
 export sudo_sng='sudo' # sudo necessary when building in system directories
 cd ~/nco;cvc;cvu
-/bin/rm -rf ${DATA}/nco-5.2.1 ${DATA}/nco-5.2.1* # Cleanup last build
+/bin/rm -rf ${DATA}/nco-5.2.2 ${DATA}/nco-5.2.2* # Cleanup last build
 ${sudo_sng} /bin/rm -r -f \
-${rpm_root}/BUILD/nco-5.2.1 \
-${rpm_root}/RPMS/i386/nco-5.2.1-?.i386.rpm \
-${rpm_root}/RPMS/i386/nco-debuginfo-5.2.1-?.i386.rpm \
-${rpm_root}/RPMS/i386/nco-devel-5.2.1-?.i386.rpm \
-${rpm_root}/SOURCES/nco-5.2.1.tar.gz \
-${rpm_root}/SPECS/nco-5.2.1.spec \
-${rpm_root}/SRPMS/nco-5.2.1-?.src.rpm
-cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -r nco-5.2.1-1 -d nco-5.2.1 nco # Export based on tag
-${sudo_sng} ln -s ${HOME}/nco/bld/nco.spec ${rpm_root}/SPECS/nco-5.2.1.spec
-tar cvzf ./nco-5.2.1.tar.gz --exclude='nco-5.2.1/debian*' --exclude='.cvsignore' --exclude='ncap_lex.c' --exclude='ncap_yacc.[ch]' ./nco-5.2.1 
-${sudo_sng} /bin/cp ${DATA}/nco-5.2.1.tar.gz ${rpm_root}/SOURCES
+${rpm_root}/BUILD/nco-5.2.2 \
+${rpm_root}/RPMS/i386/nco-5.2.2-?.i386.rpm \
+${rpm_root}/RPMS/i386/nco-debuginfo-5.2.2-?.i386.rpm \
+${rpm_root}/RPMS/i386/nco-devel-5.2.2-?.i386.rpm \
+${rpm_root}/SOURCES/nco-5.2.2.tar.gz \
+${rpm_root}/SPECS/nco-5.2.2.spec \
+${rpm_root}/SRPMS/nco-5.2.2-?.src.rpm
+cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -r nco-5.2.2-1 -d nco-5.2.2 nco # Export based on tag
+${sudo_sng} ln -s ${HOME}/nco/bld/nco.spec ${rpm_root}/SPECS/nco-5.2.2.spec
+tar cvzf ./nco-5.2.2.tar.gz --exclude='nco-5.2.2/debian*' --exclude='.cvsignore' --exclude='ncap_lex.c' --exclude='ncap_yacc.[ch]' ./nco-5.2.2 
+${sudo_sng} /bin/cp ${DATA}/nco-5.2.2.tar.gz ${rpm_root}/SOURCES
 cd ${rpm_root}/SPECS
-${sudo_sng} rpmbuild -ba --sign nco-5.2.1.spec > ~/foo.nco 2>&1
+${sudo_sng} rpmbuild -ba --sign nco-5.2.2.spec > ~/foo.nco 2>&1
 scp \
-${rpm_root}/RPMS/i386/nco-5.2.1-?.i386.rpm \
-${rpm_root}/RPMS/i386/nco-debuginfo-5.2.1-?.i386.rpm \
-${rpm_root}/RPMS/i386/nco-devel-5.2.1-?.i386.rpm \
-${rpm_root}/SRPMS/nco-5.2.1-?.src.rpm \
+${rpm_root}/RPMS/i386/nco-5.2.2-?.i386.rpm \
+${rpm_root}/RPMS/i386/nco-debuginfo-5.2.2-?.i386.rpm \
+${rpm_root}/RPMS/i386/nco-devel-5.2.2-?.i386.rpm \
+${rpm_root}/SRPMS/nco-5.2.2-?.src.rpm \
 dust.ess.uci.edu:/var/www/html/nco/src
 scp \
-${rpm_root}/RPMS/i386/nco-5.2.1-?.i386.rpm \
-${rpm_root}/RPMS/i386/nco-debuginfo-5.2.1-?.i386.rpm \
-${rpm_root}/RPMS/i386/nco-devel-5.2.1-?.i386.rpm \
-${rpm_root}/SRPMS/nco-5.2.1-?.src.rpm \
+${rpm_root}/RPMS/i386/nco-5.2.2-?.i386.rpm \
+${rpm_root}/RPMS/i386/nco-debuginfo-5.2.2-?.i386.rpm \
+${rpm_root}/RPMS/i386/nco-devel-5.2.2-?.i386.rpm \
+${rpm_root}/SRPMS/nco-5.2.2-?.src.rpm \
 zender,nco at web.sf.net:/home/project-web/nco/htdocs/src
 
 # RPM builds as user
@@ -256,33 +256,33 @@ zender,nco at web.sf.net:/home/project-web/nco/htdocs/src
 export rpm_root="${DATA}/rpm/nco"
 #cd ~/nco;cvc;cvu # This risks committing unwanted *.[ch]pp files
 mkdir -p ${DATA}/rpm/nco/TMP ${DATA}/rpm/nco/BUILD
-/bin/rm -rf ${DATA}/nco-5.2.1 ${DATA}/nco-5.2.1* # Cleanup last build
+/bin/rm -rf ${DATA}/nco-5.2.2 ${DATA}/nco-5.2.2* # Cleanup last build
 /bin/rm -r -f \
-${rpm_root}/nco-5.2.1-?.src.rpm \
-${rpm_root}/nco-5.2.1.spec \
-${rpm_root}/nco-5.2.1.tar.gz \
-${rpm_root}/*/nco-5.2.1-?.*.rpm \
-${rpm_root}/*/nco-debuginfo-5.2.1-?.*.rpm \
-${rpm_root}/*/nco-devel-5.2.1-?.*.rpm
-# cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -r nco-5.2.1-1 -d nco-5.2.1 nco # Export based on tag
-cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -D "1 second ago" -dnco-5.2.1 nco # Export most recent and build as 5.2.1-1
-tar cvzf ./nco-5.2.1.tar.gz --exclude='nco-5.2.1/debian*' --exclude='.cvsignore' --exclude='ncap_lex.c' --exclude='ncap_yacc.[ch]' ./nco-5.2.1 
-/bin/cp ${DATA}/nco-5.2.1.tar.gz ${rpm_root}
+${rpm_root}/nco-5.2.2-?.src.rpm \
+${rpm_root}/nco-5.2.2.spec \
+${rpm_root}/nco-5.2.2.tar.gz \
+${rpm_root}/*/nco-5.2.2-?.*.rpm \
+${rpm_root}/*/nco-debuginfo-5.2.2-?.*.rpm \
+${rpm_root}/*/nco-devel-5.2.2-?.*.rpm
+# cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -r nco-5.2.2-1 -d nco-5.2.2 nco # Export based on tag
+cd ${DATA};cvs -d zender at nco.cvs.sf.net:/cvsroot/nco export -kkv -D "1 second ago" -dnco-5.2.2 nco # Export most recent and build as 5.2.2-1
+tar cvzf ./nco-5.2.2.tar.gz --exclude='nco-5.2.2/debian*' --exclude='.cvsignore' --exclude='ncap_lex.c' --exclude='ncap_yacc.[ch]' ./nco-5.2.2 
+/bin/cp ${DATA}/nco-5.2.2.tar.gz ${rpm_root}
 ln -s ${HOME}/nco/bld/nco.spec ${rpm_root}/nco.spec
 cd ${rpm_root}
 rpmbuild -ba --sign nco.spec > ~/foo.nco 2>&1
-rpmlint ${rpm_root}/*/nco-5.2.1-?.*.rpm
+rpmlint ${rpm_root}/*/nco-5.2.2-?.*.rpm
 sudo yum remove nco
-sudo yum install ${rpm_root}/*/nco-5.2.1-?.*.rpm
+sudo yum install ${rpm_root}/*/nco-5.2.2-?.*.rpm
 scp \
-${rpm_root}/*/nco-5.2.1-?.*.rpm \
-${rpm_root}/*/nco-debuginfo-5.2.1-?.*.rpm \
-${rpm_root}/*/nco-devel-5.2.1-?.*.rpm \
-${rpm_root}/nco-5.2.1-?.*.src.rpm \
+${rpm_root}/*/nco-5.2.2-?.*.rpm \
+${rpm_root}/*/nco-debuginfo-5.2.2-?.*.rpm \
+${rpm_root}/*/nco-devel-5.2.2-?.*.rpm \
+${rpm_root}/nco-5.2.2-?.*.src.rpm \
 dust.ess.uci.edu:/var/www/html/nco/src
 scp \
-${rpm_root}/*/nco-5.2.1-?.*.rpm \
-${rpm_root}/*/nco-debuginfo-5.2.1-?.*.rpm \
-${rpm_root}/*/nco-devel-5.2.1-?.*.rpm \
-${rpm_root}/nco-5.2.1-?.*.src.rpm \
+${rpm_root}/*/nco-5.2.2-?.*.rpm \
+${rpm_root}/*/nco-debuginfo-5.2.2-?.*.rpm \
+${rpm_root}/*/nco-devel-5.2.2-?.*.rpm \
+${rpm_root}/nco-5.2.2-?.*.src.rpm \
 zender,nco at web.sf.net:/home/project-web/nco/htdocs/src


=====================================
doc/index.shtml
=====================================
@@ -71,7 +71,7 @@ Try to disable Spammers' machines:
 <p><h1 align="center">Bienvenue sur le netCDF Operator (NCO) site</h1>
 
 <p><h2>
-Current stable NCO version is 5.2.1 released <!--#flastmod file="src/nco-5.2.1.tar.gz"-->
+Current stable NCO version is 5.2.2 released <!--#flastmod file="src/nco-5.2.2.tar.gz"-->
 </h2>
 
 <table border=0 width=100%>
@@ -155,7 +155,8 @@ and
 <h2>Recent Releases & Milestones</h2>
 
 <ul>
-<li>2024 Apr ??: 5.2.2 <i>In Progress...</i>
+<li>2024 Apr ??: 5.2.3 <i>In Progress...</i>
+<li>2024 Mar 22: 5.2.2 ncchecker
 <li>2024 Feb 18: 5.2.1 Quick fix to 5.2.0
 <li>2024 Feb 16: 5.2.0 S1D ELM restart unpacking
 <li>2023 Nov 07: 5.1.9 ncremap updates
@@ -230,6 +231,7 @@ techniques for climate data analysis:
 <li><a href="./nco.html#ncap2"><tt>ncap2</tt></a> netCDF Arithmetic Processor (<a href="./nco.html#xmp_ncap">examples</a>)</li>
 <li><a href="./nco.html#ncatted"><tt>ncatted</tt></a> netCDF ATTribute EDitor (<a href="./nco.html#xmp_ncatted">examples</a>)</li>
 <li><a href="./nco.html#ncbo"><tt>ncbo</tt></a> netCDF Binary Operator (addition, multiplication...) (<a href="./nco.html#xmp_ncbo">examples</a>)</li>
+<li><a href="./nco.html#ncchecker"><tt>ncchecker</tt></a> netCDF Compliance CHECKER (<a href="./nco.html#xmp_ncchecker">examples</a>)</li>
 <li><a href="./nco.html#ncclimo"><tt>ncclimo</tt></a> netCDF CLIMatOlogy Generator (<a href="./nco.html#xmp_ncclimo">examples</a>)</li>
 <li><a href="./nco.html#nces"><tt>nces</tt></a> netCDF Ensemble Statistics (<a href="./nco.html#xmp_nces">examples</a>)</li>
 <li><a href="./nco.html#ncecat"><tt>ncecat</tt></a> netCDF Ensemble conCATenator (<a href="./nco.html#xmp_ncecat">examples</a>)</li>
@@ -651,15 +653,19 @@ Identical copies of those tarballs are also stored
 <a href="http://nco.sf.net/src">here</a> on SourceForge for historical
 continuity.
 You may retrieve the source of tagged versions directly with, e.g.,
-<tt>git clone -b 5.2.1 http://github.com/nco/nco.git nco-5.2.1</tt></a>.
+<tt>git clone -b 5.2.2 http://github.com/nco/nco.git nco-5.2.2</tt></a>.
 <ul>
-<li><b>NCO 5.2.3</b>: (<i>Future</i>)
+<li><b>NCO 5.2.4</b>: (<i>Future</i>)
 netCDF4 user-defined types support;
 <tt>ncks --xtn</tt> better extensive variable treatment?;
 <tt>ncks --bsa</tt> Byte-swap algoritm;
 <tt>ncremap</tt> small-circle weights;</li>
-<li><b>NCO 5.2.2</b>: (<i>In Progress, features in-progress or complete include</i>)
+<li><b>NCO 5.2.3</b>: (<i>In Progress, features in-progress or complete include</i>)
 <tt>ncremap</tt> CF Convention for longitude vertices in map-files</li>
+<li><b>NCO 5.2.2</b>: (<i>Current Stable Release</i>)
+<tt>ncchecker</tt> debuts;
+<tt>ncclimo --rgn_avg</tt> includes <tt>time_bounds</tt> in ELM/CLM;
+<tt>ncremap</tt> MBTR <tt>--monotonicity</tt></li>
 <li><b>NCO 5.2.1</b>: (<i>Current Stable Release</i>)
 <tt>ncclimo/ncremap</tt> MPI fix</li>
 <li><b>NCO 5.2.0</b>: 
@@ -808,7 +814,7 @@ Or, alternatively, permanently add conda-forge (which teems with goodies besides
 ‘<tt>conda config --add channels conda-forge</tt>’, then
 install NCO with ‘<tt>conda install nco</tt>’.
 The default NCO installed by <tt>conda</tt> is generally within a month of the latest release. 
-<li><a href="https://github.com/conda-forge/nco-feedstock">nco-5.2.1</a> Executables Anaconda-compatible. Maintained by Filipe Fernandes.</li>
+<li><a href="https://github.com/conda-forge/nco-feedstock">nco-5.2.2</a> Executables Anaconda-compatible. Maintained by Filipe Fernandes.</li>
 Thanks to Rich Signell, Filipe Fernandes, Pedro Vicente, Xylar Asay-Davis and others for developing and maintaining the NCO package for conda.
 </ul>
 
@@ -817,7 +823,7 @@ Thanks to Rich Signell, Filipe Fernandes, Pedro Vicente, Xylar Asay-Davis and ot
 <h3><a href="http://www.debian.org">Debian</a> and <a href="http://www.ubuntu.com">Ubuntu</a> GNU/Linux</a></h3>
 <ul>
 <!--
-<li><a href="http://www.debian.org">Debian</a> and <a href="http://www.ubuntu.com">Ubuntu</a> GNU/Linux-compatible Intel systems, prebuilt binary executable <a href="http://www.debian.org">deb</a>: <a href="http://packages.debian.org/testing/math/nco.html">nco-5.2.1</a></li>
+<li><a href="http://www.debian.org">Debian</a> and <a href="http://www.ubuntu.com">Ubuntu</a> GNU/Linux-compatible Intel systems, prebuilt binary executable <a href="http://www.debian.org">deb</a>: <a href="http://packages.debian.org/testing/math/nco.html">nco-5.2.2</a></li>
 -->
 <a href="http://packages.debian.org/unstable/science/nco">Debian NCO</a> and 
 <a href="https://launchpad.net/ubuntu/+source/nco">Ubuntu NCO</a> homepages.
@@ -825,8 +831,8 @@ Thanks to Rich Signell, Filipe Fernandes, Pedro Vicente, Xylar Asay-Davis and ot
 NCO packages in the Debian/Ubuntu repositories (e.g., Sid and Raring) generally lag the packages distributed here by 6–12 months.
 <a name="beta"></a><a name="prerelease"> <!-- http://nco.sf.net#beta -->
 Newer (beta- or pre-release) packages are often available for intrepid Debian/Ubuntu users as described <a href="https://github.com/nco/nco/tree/master/doc/beta.txt">here</a>.
-<dt>Debian package for most recent NCO release (install with, e.g., ‘<tt>dpkg --install nco_5.2.1-1_i386.deb</tt>’):</dt>
-<li><a href="https://launchpad.net/ubuntu/+source/nco/5.2.1-1">nco_5.2.1-1_amd64.deb</a> : Executables AMD64-compatible</li>
+<dt>Debian package for most recent NCO release (install with, e.g., ‘<tt>dpkg --install nco_5.2.2-1_i386.deb</tt>’):</dt>
+<li><a href="https://launchpad.net/ubuntu/+source/nco/5.2.2-1">nco_5.2.2-1_amd64.deb</a> : Executables AMD64-compatible</li>
 Thanks to Daniel Baumann, Sebastian Couwenberg, Barry deFreese, Francesco Lovergine, 
 Brian Mays, Rorik Peterson, and Matej Vela for their help packaging
 NCO for Debian over the years. 
@@ -868,12 +874,12 @@ Thanks to Gavin Burris and Kyle Wilcox for documenting build procedures for RHEL
 <h3><a href="http://www.apple.com/macosx/">MacOS Darwin</a></h3>
 <ul>
 <!-- 
-# MacOS 14.2.1 (Ventura) systems (firn, sastrugi, spectral):
+# MacOS 14.3.1 (Ventura) systems (firn, sastrugi, spectral):
 /usr/bin/scp ~/nco/doc/index.shtml zender,nco at web.sf.net:/home/project-web/nco/htdocs
-cd ~/bin;tar cvzf ${DATA}/nco-5.2.1.macos.14.2.tar.gz nc*;scp ${DATA}/nco-5.2.1.macos.14.2.tar.gz zender,nco at web.sf.net:/home/project-web/nco/htdocs/src
+cd ~/bin;tar cvzf ${DATA}/nco-5.2.2.macos.14.3.tar.gz nc*;scp ${DATA}/nco-5.2.2.macos.14.3.tar.gz zender,nco at web.sf.net:/home/project-web/nco/htdocs/src
 -->
 The most up-to-date executables are probably those in the tarball below. Those unfamiliar with installing executables from tarballs may try the (older) <a href="http://en.wikipedia.org/wiki/Apple_Disk_Image">DMG</a> files (you may need to add <tt>/opt/local/bin</tt> to your executable path to access those operators).
-<li><a href="src/nco-5.2.1.macos.14.2.tar.gz">nco-5.2.1.macos.14.2.tar.gz</a> (<!--#fsize file="src/nco-5.2.1.macos.14.2.tar.gz"-->): Executables MacOS 14.2-compatible (last updated <!--#flastmod file="src/nco-5.2.1.macos.14.2.tar.gz"-->). Maintained by NCO Project.</li>
+<li><a href="src/nco-5.2.2.macos.14.3.tar.gz">nco-5.2.2.macos.14.3.tar.gz</a> (<!--#fsize file="src/nco-5.2.2.macos.14.3.tar.gz"-->): Executables MacOS 14.3-compatible (last updated <!--#flastmod file="src/nco-5.2.2.macos.14.3.tar.gz"-->). Maintained by NCO Project.</li>
 <li><a href="http://fink.sf.net">Fink</a> packages for <a href="http://fink.sf.net/pdb/package.php/nco">NCO</a>: Currently NCO 4.9.5. Maintained by Alexander Hansen.</li> 
 <li><a href="http://brew.sh">Homebrew</a> packages for <a href="https://formulae.brew.sh/formula/nco">NCO</a>: Currently NCO 5.1.5. Install with ‘<tt>brew install nco</tt>’. Maintained by Carlo Cabrera, Ian Lancaster, Alejandro Soto, and others over the years.</li> 
 <li><a href="http://trac.macosforge.org/projects/macports/wiki">MacPorts</a> infrastructure for <a href="https://ports.macports.org/port/nco">NCO</a>: <a href="https://ports.macports.org/port/nco">Portfile</a>: Currently NCO 5.1.1. Install with ‘<tt>sudo port install nco</tt>’. Maintained by Takeshi Enomoto.</li>
@@ -1076,12 +1082,12 @@ On the <a href="https://sourceforge.net/p/nco/bugs">Bug Tickets</a> site.</li>
 The simplest way to acquire the source is to download the compressed tarball:
 <ul>
 <li>
-<!-- scp ${DATA}/nco-5.2.1.tar.gz zender,nco at web.sf.net:/home/project-web/nco/htdocs/src -->
-<a href="https://github.com/nco/nco/archive/5.2.1.tar.gz">nco-5.2.1.tar.gz</a> 
-(<!--#fsize file="src/nco-5.2.1.tar.gz"--> compressed tar-file)<br>
-<!--#exec cmd="openssl dgst -md5 src/nco-5.2.1.tar.gz"--><br>
-<!--#exec cmd="openssl dgst -sha1 src/nco-5.2.1.tar.gz"--><br>
-<!--#exec cmd="openssl dgst -sha256 src/nco-5.2.1.tar.gz"--> 
+<!-- scp ${DATA}/nco-5.2.2.tar.gz zender,nco at web.sf.net:/home/project-web/nco/htdocs/src -->
+<a href="https://github.com/nco/nco/archive/5.2.2.tar.gz">nco-5.2.2.tar.gz</a> 
+(<!--#fsize file="src/nco-5.2.2.tar.gz"--> compressed tar-file)<br>
+<!--#exec cmd="openssl dgst -md5 src/nco-5.2.2.tar.gz"--><br>
+<!--#exec cmd="openssl dgst -sha1 src/nco-5.2.2.tar.gz"--><br>
+<!--#exec cmd="openssl dgst -sha256 src/nco-5.2.2.tar.gz"--> 
 </li>
 </ul>
 
@@ -1102,8 +1108,8 @@ To avoid the churn that comes with using the latest snapshot,
 potential contributors may wish to retrieve a recent tagged (i.e.,
 stable and released) version, 
 This command retrieves the entire NCO repository (< 20 MB) and
-then checks out NCO version <tt>5.2.1</tt>:
-<p><tt>git clone https://github.com/nco/nco.git;cd nco;git checkout 5.2.1</tt></p>
+then checks out NCO version <tt>5.2.2</tt>:
+<p><tt>git clone https://github.com/nco/nco.git;cd nco;git checkout 5.2.2</tt></p>
 However, the most efficient way to actively track and develop NCO is to
 retrieve the current (“bleeding edge”) NCO snapshot.
 This command retrieves the latest NCO master branch into a local
@@ -1113,12 +1119,12 @@ directory named <tt>nco</tt>:
 Track changes to the development version using
 <p><tt>cd nco;git pull</tt></p>
 One difference between running a "tagged" release 
-(e.g., <tt>5.2.1</tt>) and the development version is that the
+(e.g., <tt>5.2.2</tt>) and the development version is that the
 tagged release operators will print a valid version number (e.g.,
-<tt>5.2.1</tt>) when asked to do so with the <tt>-r</tt> flag
+<tt>5.2.2</tt>) when asked to do so with the <tt>-r</tt> flag
 (e.g., <tt>ncks -r</tt>).
 Snapshots will include the sub-version and patch-level in the version
-information (e.g., <tt>5.2.1-alpha06</tt>). 
+information (e.g., <tt>5.2.2-alpha06</tt>). 
 
 <!--
 <a name="doxy"></a>
@@ -1301,9 +1307,9 @@ As of 20131101 there is no Cygwin package for ANTLR, and the Cygwin netCDF packa
 
 <li>Once you have installed the pre-requisites as shown above, you may then build the latest stable NCO and install it in, e.g., <tt>/usr/local</tt> with: 
 <tt>
-<dt>wget https://github.com/nco/nco/archive/5.2.1.tar.gz</dt>
-<dt>tar xvzf 5.2.1.tar.gz</dt>
-<dt>cd nco-5.2.1</dt>
+<dt>wget https://github.com/nco/nco/archive/5.2.2.tar.gz</dt>
+<dt>tar xvzf 5.2.2.tar.gz</dt>
+<dt>cd nco-5.2.2</dt>
 <dt>./configure --prefix=/usr/local</dt>
 <dt>make</dt>
 <dt>sudo make install</dt>


=====================================
doc/nco.texi
=====================================
@@ -38,8 +38,8 @@ M-x texinfo-multiple-files-update
 Usage:
 export TEX='tex --src-specials'
 cd ~/nco/doc;texi2dvi nco.texi;makeinfo --html --ifinfo --no-split --output=nco.html nco.texi;makeinfo nco.texi;dvips -o nco.ps nco.dvi;texi2dvi --pdf nco.texi;makeinfo --xml --ifinfo --no-split --output=nco.xml nco.texi;makeinfo --no-headers --output=nco.txt nco.texi
-cd ~/nco/doc;/usr/bin/scp index.shtml nco_news.shtml ChangeLog TODO VERSION nco.dvi nco.html nco.info* nco.pdf nco.ps nco.texi nco.txt nco.xml nco_rfr_crd.pdf ../README ../data/ncap.in ../data/ncap2.in zender,nco at web.sf.net:/home/project-web/nco/htdocs;cd -
-cd ~/nco/doc;/usr/bin/scp index.shtml nco_news.shtml ChangeLog TODO VERSION nco.dvi nco.html nco.info* nco.pdf nco.ps nco.texi nco.txt nco.xml nco_rfr_crd.pdf ../README ../data/ncap.in ../data/ncap2.in dust.ess.uci.edu:Sites/nco;cd -
+cd ~/nco/doc;/usr/bin/scp index.shtml nco_news.shtml ChangeLog TODO VERSION nco.dvi nco.html nco.info* nco.pdf nco.ps nco.texi nco.txt nco.xml ../README ../data/ncap.in ../data/ncap2.in zender,nco at web.sf.net:/home/project-web/nco/htdocs;cd -
+cd ~/nco/doc;/usr/bin/scp index.shtml nco_news.shtml ChangeLog TODO VERSION nco.dvi nco.html nco.info* nco.pdf nco.ps nco.texi nco.txt nco.xml ../README ../data/ncap.in ../data/ncap2.in dust.ess.uci.edu:Sites/nco;cd -
 dvips -o nco.ps nco.dvi 
 dvips -Ppdf -G0 -o nco.ps nco.dvi
 makeinfo --html --ifinfo --no-split --output=nco.html nco.texi
@@ -128,12 +128,12 @@ Octave TeXInfo manual shows clean TeXInfo structure
 @setfilename nco.info
 
 @c Define edition, date, ...
- at set nco-edition 5.2.1
- at set doc-edition 5.2.1
+ at set nco-edition 5.2.2
+ at set doc-edition 5.2.2
 @set copyright-years 1995--2024
 @set update-year 2024
- at set update-date 18 February 2024
- at set update-month February 2024
+ at set update-date 22 March 2024
+ at set update-month March 2024
 
 @settitle @acronym{NCO} @value{nco-edition} User Guide
 
@@ -318,7 +318,7 @@ notice identical to this one except for the removal of this paragraph
 @html
 <meta name="Author" content="Charlie Zender">
 <meta name="Keywords" content="NCO documentation, NCO User Guide,
-netCDF, operator, GCM, CCM, scientific data, ncbo, ncclimo, ncfe, ncecat,
+netCDF, operator, GCM, CCM, scientific data, ncbo, ncchecker, ncclimo, ncfe, ncecat,
 ncflint, ncks, ncra, ncrcat, ncremap, ncrename, ncwa">
 @end html
 @html
@@ -13700,6 +13700,7 @@ described in any detail in the sections below.
 * ncap2 netCDF Arithmetic Processor::
 * ncatted netCDF Attribute Editor::
 * ncbo netCDF Binary Operator::
+* ncchecker netCDF Compliance Checker::
 * ncclimo netCDF Climatology Generator::
 * ncecat netCDF Ensemble Concatenator::
 * nces netCDF Ensemble Statistics::
@@ -16064,7 +16065,7 @@ print(timeNew);
 // -25, -1, 23, 47, 71, 95, 119, 143, 167, 191 ;
 
 tOld=time;
-// nb in this calendar NO Leap year
+// NB: Calendar=365_day has NO Leap year
 tOld at calendar="365_day";
 tOld at units="minutes since 2012-02-28 23:58:00.00";
 
@@ -18905,7 +18906,7 @@ pre-processing using other tools such as Awk, Perl, or Python.
 <a name="ncmultiply"></a> <!-- http://nco.sf.net/nco.html#ncmultiply -->
 <a name="ncdivide"></a> <!-- http://nco.sf.net/nco.html#ncdivide -->
 @end html
- at node ncbo netCDF Binary Operator, ncclimo netCDF Climatology Generator, ncatted netCDF Attribute Editor, Reference Manual
+ at node ncbo netCDF Binary Operator, ncchecker netCDF Compliance Checker, ncatted netCDF Attribute Editor, Reference Manual
 @section @command{ncbo} netCDF Binary Operator
 @findex ncbo
 @findex ncdiff
@@ -19341,13 +19342,83 @@ ncrcat t_anm_8589_??.nc t_anm_8589_0112.nc
 @end example
 @noindent
 
+ at page
+ at html
+<a name="ncchecker"></a> <!-- http://nco.sf.net/nco.html#ncchecker -->
+ at end html
+ at node ncchecker netCDF Compliance Checker, ncclimo netCDF Climatology Generator, ncbo netCDF Binary Operator, Reference Manual
+ at section @command{ncchecker} netCDF Compliance Checker
+ at cindex @acronym{CF}
+ at findex ncchecker
+
+ at noindent
+SYNTAX
+ at example
+ncchecker 
+[-D @var{dbg}] [-i @var{drc_in}]
+[--tests=@var{tst_lst}]
+[-x] [-v @var{var}[, at dots{}]] [--version]
+[@var{input-files}]
+ at end example
+
+ at noindent
+DESCRIPTION
+
+ at html
+<a name="DIWG"></a> <!-- http://nco.sf.net/nco.html#DIWG -->
+ at end html
+ at cindex @acronym{DIWG}
+As of version 5.2.2 (March, 2024), @acronym{NCO} comes with the
+ at command{ncchecker} script.
+This command checks files for compliance with best practices rules and 
+recommendations from various data and metadata standards bodies.
+These include the Climate & Forecast (@acronym{CF}) Metadata
+Conventions and the NASA Dataset Interoperability Working Group
+(@acronym{DIWG}) recommendations.
+Only a small subset (six tests) of @acronym{CF} or
+ at acronym{DIWG} recommendations are currently supported.
+The number of tests implemented, or, equivalently, of recommendations
+checked, is expected to grow.
+
+ at command{ncchecker} reads each data file in @var{input-files}, in
+ at var{drc_in}, or piped through standard input.
+It performs the checks requested in the @samp{--tests=@var{tst_lst}}
+option, if any (otherwise it performs all tests), and writes the
+results to @code{stdout}.
+The command supports some standard @acronym{NCO} options, including
+increasing the verbosity level with @samp{-D @var{dbg_lvl}},
+excluding variables with @samp{-x -v @var{var_lst}}, variable
+subsetting with @samp{-v @var{var_lst}}, and printing the 
+version with @samp{--version}. 
+The output contains counts of the location and number of failed tests,
+or prints ``SUCCESS'' for tests with no failures.
+
+ at noindent
+ at html
+<a name="xmp_ncchecker"></a> <!-- http://nco.sf.net/nco.html#xmp_ncchecker -->
+ at end html
+EXAMPLES
+
+ at example
+ at verbatim
+ncchecker in1.nc in2.nc # Run all tests on two files
+ncchecker -v var1,var2 in1.nc # Check only two variables
+ncchecker *.nc # Glob input files via wildcard
+ls *.nc | ncchecker # Input files via stdin
+ncchecker --dbg=2 *.nc # Debug ncchecker
+ncchecker --tests=nan,mss *.nc # Select only two tests
+ncchecker --tests=xtn,tm,nan,mss,chr,bnd *.nc # Change test ordering
+ncchecker file:///Users/zender/in_zarr4#mode=nczarr,file # Check Zarr object(s)
+ at end verbatim
+ at end example
+
 @page
 @html
 <a name="ncclimo"></a> <!-- http://nco.sf.net/nco.html#ncclimo -->
 <a name="ncsplit"></a> <!-- http://nco.sf.net/nco.html#ncsplit -->
 <a name="ncsplit"></a> <!-- http://nco.sf.net/nco.html#splitter -->
 @end html
- at node ncclimo netCDF Climatology Generator, ncecat netCDF Ensemble Concatenator, ncbo netCDF Binary Operator, Reference Manual
+ at node ncclimo netCDF Climatology Generator, ncecat netCDF Ensemble Concatenator, ncchecker netCDF Compliance Checker, Reference Manual
 @section @command{ncclimo} netCDF Climatology Generator
 @cindex climo
 @cindex climatology
@@ -19370,6 +19441,7 @@ ncclimo [-3] [-4] [-5] [-6] [-7]
 [--vrt_out=@var{vrt_fl}] [--vrt_xtr=@var{vrt_xtr}]
 [-X @var{drc_xtn}] [-x @var{drc_prv}] [--xcl_var]
 [-Y @var{rgr_xtn}] [-y @var{rgr_prv}] [--ypf=@var{ypf_max}]
+[@var{input-files}]
 @end example
 
 @noindent
@@ -19605,6 +19677,7 @@ The @samp{.cam.} and @samp{.h0.} bits are added internally to produce
 the input filenames.
 Modify these via the @option{-m @var{mdl_nm}} and @option{-h
 @var{hst_nm}} options if needed.   
+
 For input files named slightly differently than standard
 @acronym{CESM}'ish names, supply the filename (excluding the path
 component) as the @var{caseid} and then @command{ncclimo} will attempt
@@ -19624,7 +19697,14 @@ digits that precede the suffix are @var{YYYYMM}-format), specify
 @samp{-c merra2_198001.nc} and the prefix (@code{merra2}) will be
 automatically abstracted and used to template and generate all the
 filenames based on the specified @var{yr_srt} and @var{yr_end}. 
-Please tell us any dataset filename regular expressions that you would
+ at example
+ at verbatim
+ncclimo --c merra2_198001.nc --start=1980 --end=1999 
+ncclimo --c cesm_1980-01.nc --start=1980 --end=1999 
+ncclimo --c eamxx_1980-01-00000.nc --start=1980 --end=1999 
+ at end verbatim
+ at end example
+Please tell us any common dataset filename regular expressions that you would
 like added to @command{ncclimo}'s internal database.
 
 The @samp{--caseid=@var{caseid}} option is not mandatory in
@@ -25668,7 +25748,7 @@ ncremap [-3] [-4] [-5] [-6] [-7]
 [--skl=@var{skl-file}] [--stdin] [-T @var{drc_tmp}] [-t @var{thr_nbr}]
 [-U] [-u @var{unq_sfx}] [--ugrid=@var{ugrid-file}] [--uio]
 [-V @var{rgr_var}] [-v @var{var_lst}[, at dots{}]] [--version] [--vrb=@var{vrb_lvl}] 
-[--vrt_in=@var{vrt_fl}] [--vrt_out=@var{vrt_fl}] [--vrt_ntp=@var{vrt_ntp}] [--vrt_xtr=@var{vrt_xtr}]
+[--vrt_in=@var{vrt_fl}] [--vrt_out=@var{vrt_fl}] [--vrt_nm=@var{vrt_nm}] [--vrt_ntp=@var{vrt_ntp}] [--vrt_xtr=@var{vrt_xtr}]
 [-W @var{wgt_opt}] [-w @var{wgt_cmd}] [-x @var{xtn_lst}[, at dots{}]] [--xcl_var]
 [--xtr_nsp=@var{xtr_nsp}] [--xtr_xpn=@var{xtr_xpn}]
 [@var{input-files}] [@var{output-file}]
@@ -30657,9 +30737,10 @@ RHEL and CentOS build scripts and bug reports.
 @cindex Andrea Cimatoribus
 @item Andrea Cimatoribus
 @acronym{NCO} Spiral Logo
+ at cindex Walter Hannah
 @cindex Martin Otte
 @cindex Etienne Tourigny
- at item Martin Otte, Etienne Tourigny
+ at item Walter Hannah, Martin Otte, Etienne Tourigny
 Single bug reports and fixes
 @cindex Wenshan Wang
 @item Wenshan Wang


=====================================
man/Makefile.am
=====================================
@@ -1,4 +1,4 @@
 # $Header$ -*-makefile-*-
 
-man_MANS = ncap2.1 ncatted.1 ncbo.1 ncclimo.1 nces.1 ncecat.1 ncflint.1 ncks.1 nco.1 ncpdq.1 ncra.1 ncrcat.1 ncremap.1 ncrename.1 ncwa.1 ncz2psx.1
+man_MANS = ncap2.1 ncatted.1 ncbo.1 ncclimo.1 nces.1 ncecat.1 ncflint.1 ncks.1 nco.1 ncpdq.1 ncra.1 ncrcat.1 ncremap.1 ncrename.1 ncwa.1 ncz2psx.1 ncchecker.1
 EXTRA_DIST = $(man_MANS)


=====================================
man/Makefile.in
=====================================
@@ -305,7 +305,7 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-man_MANS = ncap2.1 ncatted.1 ncbo.1 ncclimo.1 nces.1 ncecat.1 ncflint.1 ncks.1 nco.1 ncpdq.1 ncra.1 ncrcat.1 ncremap.1 ncrename.1 ncwa.1 ncz2psx.1
+man_MANS = ncap2.1 ncatted.1 ncbo.1 ncclimo.1 nces.1 ncecat.1 ncflint.1 ncks.1 nco.1 ncpdq.1 ncra.1 ncrcat.1 ncremap.1 ncrename.1 ncwa.1 ncz2psx.1 ncchecker.1
 EXTRA_DIST = $(man_MANS)
 all: all-am
 


=====================================
man/ncchecker.1
=====================================
@@ -0,0 +1,123 @@
+.\" $Header$ -*-nroff-*-
+.\" Purpose: ROFF man page for ncchecker
+.\" Usage:
+.\" nroff -man ~/nco/man/ncchecker.1 | less
+.TH NCCHECKER 1
+.SH NAME
+ncchecker \- netCDF Compliance Checker
+.SH SYNTAX
+ncchecker
+[\-d
+.IR dbg_lvl ] 
+[\-i
+.IR drc_in ] 
+[\--tests=
+.IR tst_lst ]
+[\-x] [\-v
+.IR var_lst ] 
+[\--version ]
+.I input-files
+
+.SH DESCRIPTION
+.PP
+.B ncchecker
+checks files for compliance with best practices rules and
+recommendations from various data and metadata standards bodies.
+These include the Climate & Forecast (CF) Metadata Conventions
+and the NASA Dataset Interoperability Working Group (DIWG)
+recommendations. 
+It reads 
+.I input-files
+from
+.B stdin,
+or the command, performs checks requested in the
+.IR tests
+option, if any (otherwise it performs all tests), and writes the
+results to 
+.B stdout.
+Some standard
+.B NCO
+options are supported, including
+increasing the verbosity level with
+[\-D
+.IR dbg_lvl ],
+excluding variables with
+[\-x]
+variable subsetting with
+[\-v
+.IR var_lst ],
+and printing the version with 
+[\--version].
+The output contains counts of the location and number of failed tests,
+or prints "SUCCESS" for tests with no failures.
+
+.\" NB: Append man_end.txt here
+.\" $Header$ -*-nroff-*-
+.\" Purpose: Trailer file for common ending to NCO man pages
+.\" Usage: 
+.\" Append this file to end of NCO man pages immediately after marker
+.\" that says "Append man_end.txt here"
+.SH AUTHOR
+.B NCO
+manual pages written by Charlie Zender.
+
+.SH "REPORTING BUGS"
+Report bugs to <http://sf.net/bugs/?group_id=3331>.
+
+.SH COPYRIGHT
+Copyright \(co 2023-present Charlie Zender
+.br
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+.SH "SEE ALSO"
+The full documentation for
+.B NCO
+is maintained as a Texinfo manual called the 
+.B NCO Users Guide.
+Because 
+.B NCO
+is mathematical in nature, the documentation includes TeX-intensive
+portions not viewable on character-based displays. 
+Hence the only complete and authoritative versions of the 
+.B NCO Users Guide 
+are the PDF (recommended), DVI, and Postscript versions at
+<http://nco.sf.net/nco.pdf>, <http://nco.sf.net/nco.dvi>,
+and <http://nco.sf.net/nco.ps>, respectively.
+HTML and XML versions
+are available at <http://nco.sf.net/nco.html> and
+<http://nco.sf.net/nco.xml>, respectively.
+
+If the
+.B info
+and
+.B NCO
+programs are properly installed at your site, the command
+.IP
+.B info nco
+.PP
+should give you access to the complete manual, except for the
+TeX-intensive portions.
+
+.BR ncap (1), 
+.BR ncap2 (1), 
+.BR ncatted (1), 
+.BR ncbo (1), 
+.BR ncclimo (1), 
+.BR nces (1), 
+.BR ncecat (1), 
+.BR ncflint (1), 
+.BR ncz2psx (1), 
+.BR ncks (1), 
+.BR nco (1), 
+.BR ncpdq (1), 
+.BR ncra (1), 
+.BR ncrcat (1), 
+.BR ncremap (1), 
+.BR ncrename (1), 
+.BR ncwa (1) 
+
+.SH HOMEPAGE
+The 
+.B NCO
+homepage at <http://nco.sf.net> contains more information.


=====================================
man/ncremap.1
=====================================
@@ -139,6 +139,8 @@ ncremap
 .IR vrt.nc ]
 [\--vrt_out
 .IR vrt.nc ]
+[\--vrt_nm
+.IR vrt_nm ]
 [\--vrt_ntp=
 .IR vrt_ntp ]
 [\--vrt_xtr=


=====================================
src/nco++/Makefile.old
=====================================
@@ -339,7 +339,7 @@ else
  GSL_INC_FLG := $(shell ${GSL_CONFIG} --cflags)
 endif # endif GSL_INC
 ifdef GSL_LIB
- GSL_LIB_FLG := -L${GSL_LIB} -lgsl
+ GSL_LIB_FLG := -L${GSL_LIB} -lgsl -lgslcblas
 else
  GSL_LIB_FLG := $(shell ${GSL_CONFIG} --libs)
 endif # endif GSL_LIB


=====================================
src/nco/nco.h
=====================================
@@ -373,17 +373,17 @@ extern "C" {
 # define NCO_VERSION_MINOR 2
 #endif /* !NCO_VERSION_MINOR */
 #ifndef NCO_VERSION_PATCH
-# define NCO_VERSION_PATCH 1
+# define NCO_VERSION_PATCH 2
 #endif /* !NCO_VERSION_PATCH */
 #ifndef NCO_VERSION_NOTE
-# define NCO_VERSION_NOTE "" /* Blank for final versions, non-blank (e.g., "-beta37") for pre-release versions */
+# define NCO_VERSION_NOTE "" /* Blank for final versions, non-blank (e.g., "-beta73") for pre-release versions */
 #endif /* !NCO_VERSION_NOTE */
 #ifndef NCO_LIB_VERSION
   /* Define NC_LIB_VERSION as three-digit number for arithmetic comparisons by CPP */
 # define NCO_LIB_VERSION ( NCO_VERSION_MAJOR * 100 + NCO_VERSION_MINOR * 10 + NCO_VERSION_PATCH )
 #endif /* !NCO_LIB_VERSION */
 #ifndef NCO_VERSION
-# define NCO_VERSION "5.2.1"
+# define NCO_VERSION "5.2.2"
 #endif /* !NCO_VERSION */
 
 /* Compatibility tokens new to netCDF4 netcdf.h: */


=====================================
src/nco/nco_ctl.c
=====================================
@@ -1172,7 +1172,7 @@ nco_usg_prn(void)
     if(prg_lcl == ncatted) (void)fprintf(stdout,"-t, --typ_mch, type_match \tType-match attribute edits\n");
     if(prg_lcl != ncatted) (void)fprintf(stdout,"-t, --thr_nbr, threads, omp_num_threads thr_nbr\tThread number for OpenMP\n");
   } /* end if */
-  if(strstr(opt_sng,"[-U]")) (void)fprintf(stdout,"-U, --unpack\tUnpack input file\n");
+  if(strstr(opt_sng,"[-U]")) (void)fprintf(stdout,"-U, --unpack\t\tUnpack input file\n");
   if(strstr(opt_sng,"[-u")){
     if(prg_lcl == ncks) (void)fprintf(stdout,"-u, --units\t\tToggle printing units of variables, if any\n");
     if(prg_lcl == ncecat) (void)fprintf(stdout,"-u, --ulm_nm, rcd_nm\tNew unlimited (record) dimension name\n");


=====================================
src/nco/nco_grp_utl.c
=====================================
@@ -848,7 +848,7 @@ nco_xtr_mk                            /* [fnc] Check -v and -g input names and c
       } /* !tbl_idx */
       
       if(!flg_usr_mch_obj && !EXCLUDE_INPUT_LIST){
-	(void)fprintf(stderr,"%s: ERROR %s reports user-supplied %s name or regular expression \'%s\' is not in and/or does not match contents of input file\n",nco_prg_nm_get(),fnc_nm,(obj_typ == nco_obj_typ_grp) ? "group" : "variable",usr_sng);
+	(void)fprintf(stderr,"%s: ERROR %s reports user-supplied %s name (or regular expression) \'%s\' is not in (or rx does not match any) contents of input file\n",nco_prg_nm_get(),fnc_nm,(obj_typ == nco_obj_typ_grp) ? "group" : "variable",usr_sng);
 	nco_exit(EXIT_FAILURE);
       } /* !flg_usr_mch_obj */
       /* Free dynamic memory */
@@ -2238,14 +2238,14 @@ nco_chk_bnd /* [fnc] Check coordinates for bounds attributes */
       } /* !att_idx */
       /* Is this a naughty coordinate? */
       if(att_idx == att_nbr){
-	(void)fprintf(stdout,"%s: WARNING %s reports coordinate %s lacks \"%s\" attribute\n",nco_prg_nm_get(),fnc_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,att_bnd);
+	(void)fprintf(stdout,"%s: WARNING %s coordinate %s lacks \"%s\" attribute\n",nco_prg_nm_get(),fnc_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,att_bnd);
 	brk_nbr++;
       } /* !nm_cf_chk */
     } /* !nco_obj_typ_var */
   } /* !idx_tbl */
 
   if(brk_nbr > 0){
-    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: INFO %s reports total number of coordinates without \"%s\" attribute is %d\n",nco_prg_nm_get(),fnc_nm,att_bnd,brk_nbr);
+    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: INFO %s total number of coordinates without \"%s\" attribute is %d\n",nco_prg_nm_get(),fnc_nm,att_bnd,brk_nbr);
     //nco_exit(EXIT_FAILURE);
   } /* !brk_nbr */
 
@@ -2285,7 +2285,7 @@ nco_chk_chr /* [fnc] Check identifiers for NUG-non-compliant characters */
       nm=var_trv.nm;
       /* Is variable name CF-compliant? */
       if(!nm_cf_chk(nm)){
-	(void)fprintf(stdout,"%s: WARNING %s reports variable name \"%s\" is not CF-compliant\n",nco_prg_nm_get(),fnc_nm,nm);
+	(void)fprintf(stdout,"%s: WARNING %s variable name \"%s\" is not CF-compliant\n",nco_prg_nm_get(),fnc_nm,nm);
 	brk_nbr++;
       } /* !nm_cf_chk */
 	
@@ -2297,7 +2297,7 @@ nco_chk_chr /* [fnc] Check identifiers for NUG-non-compliant characters */
 	nm=att_nm;
 	/* Is attribute name CF-compliant? */
 	if(!nm_cf_chk(nm)){
-	  (void)fprintf(stdout,"%s: WARNING %s reports variable %s attribute name \"%s\" is not CF-compliant\n",nco_prg_nm_get(),fnc_nm,var_trv.nm,nm);
+	  (void)fprintf(stdout,"%s: WARNING %s variable %s attribute name \"%s\" is not CF-compliant\n",nco_prg_nm_get(),fnc_nm,var_trv.nm,nm);
 	  brk_nbr++;
 	} /* !nm_cf_chk */
       } /* !att_idx */
@@ -2309,7 +2309,7 @@ nco_chk_chr /* [fnc] Check identifiers for NUG-non-compliant characters */
       if(strcmp(var_trv.nm_fll,"/")){
 	/* Is group name CF-compliant? */
 	if(!nm_cf_chk(nm)){
-	  (void)fprintf(stdout,"%s: WARNING %s reports group name \"%s\" is not CF-compliant\n",nco_prg_nm_get(),fnc_nm,nm);
+	  (void)fprintf(stdout,"%s: WARNING %s group name \"%s\" is not CF-compliant\n",nco_prg_nm_get(),fnc_nm,nm);
 	  brk_nbr++;
 	} /* !nm_cf_chk */
       } /* !root group */
@@ -2320,7 +2320,7 @@ nco_chk_chr /* [fnc] Check identifiers for NUG-non-compliant characters */
 	nm=att_nm;
 	/* Is global or group attribute name CF-compliant? */
 	if(!nm_cf_chk(nm)){
-	  (void)fprintf(stdout,"%s: WARNING %s reports group %s attribute name \"%s\" is not CF-compliant\n",nco_prg_nm_get(),fnc_nm,var_trv.nm_fll,nm);
+	  (void)fprintf(stdout,"%s: WARNING %s group %s attribute name \"%s\" is not CF-compliant\n",nco_prg_nm_get(),fnc_nm,var_trv.nm_fll,nm);
 	  brk_nbr++;
 	} /* !nm_cf_chk */
       } /* !att_idx */
@@ -2332,13 +2332,13 @@ nco_chk_chr /* [fnc] Check identifiers for NUG-non-compliant characters */
     nm=trv_tbl->lst_dmn[idx_tbl].nm;
     /* Is dimension name CF-compliant? */
     if(!nm_cf_chk(nm)){
-      (void)fprintf(stdout,"%s: WARNING %s reports dimension name \"%s\" is not CF-compliant\n",nco_prg_nm_get(),fnc_nm,nm);
+      (void)fprintf(stdout,"%s: WARNING %s dimension name \"%s\" is not CF-compliant\n",nco_prg_nm_get(),fnc_nm,nm);
       brk_nbr++;
     } /* !nm_cf_chk */
   } /* !idx_tbl */
 
   if(brk_nbr > 0){
-    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: INFO %s reports total number of identifiers with CF non-compliant names is %d\n",nco_prg_nm_get(),fnc_nm,brk_nbr);
+    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: INFO %s total number of identifiers with CF non-compliant names is %d\n",nco_prg_nm_get(),fnc_nm,brk_nbr);
     //nco_exit(EXIT_FAILURE);
   } /* !brk_nbr */
 
@@ -2396,7 +2396,7 @@ nco_chk_mss /* [fnc] Check variables+groups for missing_value attribute */
 	nm=att_nm;
 	/* Is this a naughty attribute? */
 	if(!strcmp(nm,att_ngt)){
-	  (void)fprintf(stdout,"%s: WARNING %s reports variable %s contains \"%s\" attribute\n",nco_prg_nm_get(),fnc_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,nm);
+	  (void)fprintf(stdout,"%s: WARNING %s variable %s contains \"%s\" attribute\n",nco_prg_nm_get(),fnc_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,nm);
 	  brk_nbr++;
 	} /* !nm_cf_chk */
       } /* !att_idx */
@@ -2411,7 +2411,7 @@ nco_chk_mss /* [fnc] Check variables+groups for missing_value attribute */
 	nm=att_nm;
 	/* Is this a naughty attribute? */
 	if(!strcmp(nm,att_ngt)){
-	  (void)fprintf(stdout,"%s: WARNING %s reports group %s contains \"%s\" attribute\n",nco_prg_nm_get(),fnc_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,nm);
+	  (void)fprintf(stdout,"%s: WARNING %s group %s contains \"%s\" attribute\n",nco_prg_nm_get(),fnc_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,nm);
 	  brk_nbr++;
 	} /* !nm_cf_chk */
       } /* !att_idx */
@@ -2419,7 +2419,7 @@ nco_chk_mss /* [fnc] Check variables+groups for missing_value attribute */
   } /* !idx_tbl */
 
   if(brk_nbr > 0){
-    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: INFO %s reports total number of variables and/or groups with \"%s\" attribute is %d\n",nco_prg_nm_get(),fnc_nm,att_ngt,brk_nbr);
+    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: INFO %s total number of variables and/or groups with \"%s\" attribute is %d\n",nco_prg_nm_get(),fnc_nm,att_ngt,brk_nbr);
     //nco_exit(EXIT_FAILURE);
   } /* !brk_nbr */
 
@@ -2512,13 +2512,13 @@ nco_chk_nan /* [fnc] Check file for NaNs */
 	  case FP_INFINITE: if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stdout,"%s[%ld]=%g is positive or negative infinity\n",var->nm,lmn,var->val.fp[lmn]); break; /* x is either positive infinity or negative infinity */
 	  case FP_SUBNORMAL: if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stdout,"%s[%ld]=%g is subnormal\n",var->nm,lmn,var->val.fp[lmn]); break; /* x is too small to be represented in normalized format */
 	  default:
-	    (void)fprintf(stdout,"%s: ERROR %s reports invalid return code for fpclassify() on variable %s element %ld\n",nco_prg_nm_get(),fnc_nm,var_trv.nm,lmn);
+	    (void)fprintf(stdout,"%s: ERROR %s invalid return code for fpclassify() on variable %s element %ld\n",nco_prg_nm_get(),fnc_nm,var_trv.nm,lmn);
 	    nco_exit(EXIT_FAILURE);
 	    break;
 	  } /* !rcd */
 	  if(isnan(var->val.fp[lmn])){
 	    flg_crr_var_has_nan=True;
-	    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: WARNING %s reports variable %s has first NaNf at hyperslab element %ld\n",nco_prg_nm_get(),fnc_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,lmn);
+	    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: WARNING %s variable %s has first NaNf at hyperslab element %ld\n",nco_prg_nm_get(),fnc_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,lmn);
 	    //nco_exit(EXIT_FAILURE);
 	    /* Quit loop over elements, move on to next variable... */
 	    break; 
@@ -2536,13 +2536,13 @@ nco_chk_nan /* [fnc] Check file for NaNs */
 	  case FP_INFINITE: if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stdout,"%s[%ld]=%g is positive or negative infinity\n",var->nm,lmn,var->val.dp[lmn]); break; /* x is either positive infinity or negative infinity */
 	  case FP_SUBNORMAL: if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stdout,"%s[%ld]=%g is subnormal\n",var->nm,lmn,var->val.dp[lmn]); break; /* x is too small to be represented in normalized format */
 	  default:
-	    (void)fprintf(stdout,"%s: ERROR %s reports invalid return code for fpclassify() on variable %s element %ld\n",nco_prg_nm_get(),fnc_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,lmn);
+	    (void)fprintf(stdout,"%s: ERROR %s invalid return code for fpclassify() on variable %s element %ld\n",nco_prg_nm_get(),fnc_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,lmn);
 	    nco_exit(EXIT_FAILURE);
 	    break;
 	  } /* !rcd */
 	  if(isnan(var->val.dp[lmn])){
 	    flg_crr_var_has_nan=True;
-	    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: WARNING %s reports variable %s has first NaN at hyperslab element %ld\n",nco_prg_nm_get(),fnc_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,lmn);
+	    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: WARNING %s variable %s has first NaN at hyperslab element %ld\n",nco_prg_nm_get(),fnc_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,lmn);
 	    //nco_exit(EXIT_FAILURE);
 	    /* Quit loop over elements, move on to next variable... */
 	    break; 
@@ -2556,7 +2556,7 @@ nco_chk_nan /* [fnc] Check file for NaNs */
   } /* !idx_tbl */
 
   if(brk_nbr > 0){
-    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: INFO %s reports total number of floating-point variables with NaN elements is %d\n",nco_prg_nm_get(),fnc_nm,brk_nbr);
+    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: INFO %s total number of floating-point variables with NaN elements is %d\n",nco_prg_nm_get(),fnc_nm,brk_nbr);
     //nco_exit(EXIT_FAILURE);
   } /* !brk_nbr */
 
@@ -2621,7 +2621,7 @@ nco_chk_tm /* [fnc] Check that time variables are double precision */
 	if(nco_dbg_lvl_get() >= nco_dbg_var) (void)fprintf(stdout,"%s: DEBUG %s type of variable %s is %s\n",nco_prg_nm_get(),fnc_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,nco_typ_sng(var_trv.var_typ));
 	/* Is this a naughty time variable? */
 	if(var_trv.var_typ != NC_DOUBLE){
-	  (void)fprintf(stdout,"%s: WARNING %s reports variable %s is type %s not %s\n",nco_prg_nm_get(),fnc_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,nco_typ_sng(var_trv.var_typ),"NC_DOUBLE");
+	  (void)fprintf(stdout,"%s: WARNING %s variable %s is type %s not %s\n",nco_prg_nm_get(),fnc_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,nco_typ_sng(var_trv.var_typ),"NC_DOUBLE");
 	  brk_nbr++;
 	} /* !var_trv.var_typ */
 	/* Avoid double-counting, jump to next variable */
@@ -2649,14 +2649,14 @@ nco_chk_tm /* [fnc] Check that time variables are double precision */
 	att_val[att_sz]='\0';
       }else if(att_typ == NC_STRING){
 	if(att_sz != 1L){
-	  (void)fprintf(stderr,"%s: WARNING %s reports \"%s\" attribute for variable %s is an %s array of size %ld. This violates the CF Conventions which requires a single string for this attribute. Will skip this variable.\n",nco_prg_nm_get(),fnc_nm,att_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,nco_typ_sng(att_typ),att_sz);
+	  (void)fprintf(stderr,"%s: WARNING %s \"%s\" attribute for variable %s is an %s array of size %ld. This violates the CF Conventions which requires a single string for this attribute. Will skip this variable.\n",nco_prg_nm_get(),fnc_nm,att_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,nco_typ_sng(att_typ),att_sz);
 	  continue;
 	} /* !att_sz */
 	rcd+=nco_get_att(grp_id,var_id,att_nm,(void *)att_val_sngp,att_typ);
 	/* De-reference the char ** NC_STRING array, a list now known to be of size one, into a normal char * string */
 	att_val=att_val_sngp[0];
       }else{
-	(void)fprintf(stderr,"%s: WARNING %s reports \"%s\" attribute for variable %s is type %s. This violates the CF Conventions which allow only datatypes %s and %s for attribute %s. NCO will skip this attribute.\n",nco_prg_nm_get(),fnc_nm,att_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,nco_typ_sng(att_typ),nco_typ_sng(NC_CHAR),nco_typ_sng(NC_STRING),att_nm);
+	(void)fprintf(stderr,"%s: WARNING %s \"%s\" attribute for variable %s is type %s. This violates the CF Conventions which allow only datatypes %s and %s for attribute %s. NCO will skip this attribute.\n",nco_prg_nm_get(),fnc_nm,att_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,nco_typ_sng(att_typ),nco_typ_sng(NC_CHAR),nco_typ_sng(NC_STRING),att_nm);
 	continue;
       } /* !att_typ */
       
@@ -2665,7 +2665,7 @@ nco_chk_tm /* [fnc] Check that time variables are double precision */
       
       /* Is this a naughty time variable? */
       if(var_trv.var_typ != NC_DOUBLE){
-	(void)fprintf(stdout,"%s: WARNING %s reports variable %s is type %s not %s\n",nco_prg_nm_get(),fnc_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,nco_typ_sng(var_trv.var_typ),"NC_DOUBLE");
+	(void)fprintf(stdout,"%s: WARNING %s variable %s is type %s not %s\n",nco_prg_nm_get(),fnc_nm,(var_trv.grp_dpt == 0) ? var_trv.nm : var_trv.nm_fll,nco_typ_sng(var_trv.var_typ),"NC_DOUBLE");
 	brk_nbr++;
       } /* !var_trv.var_typ */
       
@@ -2673,7 +2673,7 @@ nco_chk_tm /* [fnc] Check that time variables are double precision */
   } /* !idx_tbl */
   
   if(brk_nbr > 0){
-    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: INFO %s reports total number of time variables not stored in double precision is %d\n",nco_prg_nm_get(),fnc_nm,brk_nbr);
+    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: INFO %s total number of time variables not stored in double precision is %d\n",nco_prg_nm_get(),fnc_nm,brk_nbr);
     //nco_exit(EXIT_FAILURE);
   } /* !brk_nbr */
 
@@ -2753,11 +2753,11 @@ nco_chk_xtn /* [fnc] Check filename extension */
   if(flg_he5){
     rcd=nco_inq_grp_full_ncid_flg(nc_id,grp_he5,&grp_id);
     if(rcd == NC_ENOGRP){
-      (void)fprintf(stdout,"%s: WARNING %s reports file with extension \"%s\" lacks HDF-EOS5 standard group \"%s\"\n",nco_prg_nm_get(),fnc_nm,sfx_he5,grp_he5);
+      (void)fprintf(stdout,"%s: WARNING %s file with extension \"%s\" lacks HDF-EOS5 standard group \"%s\"\n",nco_prg_nm_get(),fnc_nm,sfx_he5,grp_he5);
     }else{ /* !rcd */
       att_xtn_val=nco_char_att_get(grp_id,NC_GLOBAL,att_sng_he5);
-      if(!att_xtn_val) (void)fprintf(stdout,"%s: WARNING %s reports file with extension \"%s\" lacks HDF-EOS5 standard global attribute \"%s\"\n",nco_prg_nm_get(),fnc_nm,sfx_he5,att_sng_he5);
-      if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stdout,"%s: INFO %s reports value of HDF-EOS5 standard global attribute \"%s\" is \"%s\"\n",nco_prg_nm_get(),fnc_nm,att_sng_he5,att_xtn_val);
+      if(!att_xtn_val) (void)fprintf(stdout,"%s: WARNING %s file with extension \"%s\" lacks HDF-EOS5 standard global attribute \"%s\"\n",nco_prg_nm_get(),fnc_nm,sfx_he5,att_sng_he5);
+      if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stdout,"%s: INFO %s value of HDF-EOS5 standard global attribute \"%s\" is \"%s\"\n",nco_prg_nm_get(),fnc_nm,att_sng_he5,att_xtn_val);
       if(att_xtn_val) att_xtn_val=(char *)nco_free(att_xtn_val);
     } /* !rcd */
   } /* !flg_he5 */
@@ -2766,24 +2766,24 @@ nco_chk_xtn /* [fnc] Check filename extension */
     if(fl_fmt == NC_FORMAT_NETCDF4 || fl_fmt == NC_FORMAT_NETCDF4_CLASSIC){
       att_xtn_val=nco_char_att_get(nc_id,NC_GLOBAL,att_sng_nc);
       if(!att_xtn_val){
-	(void)fprintf(stdout,"%s: WARNING %s reports %s file with extension \"%s\" lacks netCDF standard global attribute \"%s\"\n",nco_prg_nm_get(),fnc_nm,nco_fmt_sng(fl_fmt),sfx_nc,att_sng_nc);
+	(void)fprintf(stdout,"%s: WARNING %s %s file with extension \"%s\" lacks netCDF standard global attribute \"%s\"\n",nco_prg_nm_get(),fnc_nm,nco_fmt_sng(fl_fmt),sfx_nc,att_sng_nc);
 	rcd=nco_inq_grp_full_ncid_flg(nc_id,grp_he5,&grp_id);
 	if(rcd == NC_NOERR){
-	  (void)fprintf(stdout,"%s: WARNING %s reports file with extension \"%s\" contains HDF-EOS5 standard group \"%s\"\n",nco_prg_nm_get(),fnc_nm,sfx_he5,grp_he5);
+	  (void)fprintf(stdout,"%s: WARNING %s file with extension \"%s\" contains HDF-EOS5 standard group \"%s\"\n",nco_prg_nm_get(),fnc_nm,sfx_he5,grp_he5);
 	}else{ /* !rcd */
 	  rcd=NC_NOERR;
 	} /* !rcd */
       } /* !att_xtn_val */
-      if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stdout,"%s: INFO %s reports value of netCDF standard global attribute \"%s\" is \"%s\"\n",nco_prg_nm_get(),fnc_nm,att_sng_nc,att_xtn_val);
+      if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stdout,"%s: INFO %s value of netCDF standard global attribute \"%s\" is \"%s\"\n",nco_prg_nm_get(),fnc_nm,att_sng_nc,att_xtn_val);
       if(att_xtn_val) att_xtn_val=(char *)nco_free(att_xtn_val);
     }else{ /* !fl_fmt */
-      if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stdout,"%s: INFO %s reports input file format is %s. This format has no mandatory global attributes that can be checked.\n",nco_prg_nm_get(),fnc_nm,nco_fmt_sng(fl_fmt));
+      if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stdout,"%s: INFO %s input file format is %s. This format has no mandatory global attributes that can be checked.\n",nco_prg_nm_get(),fnc_nm,nco_fmt_sng(fl_fmt));
     } /* !fl_fmt */
   } /* !flg_nc */
 
   if(!flg_h5 && !flg_he5 && !flg_nc){
     brk_nbr++;
-    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: WARNING %s reports filename extension \"%s\" is non-compliant\n",nco_prg_nm_get(),fnc_nm,sfx_sng ? sfx_sng : "(null)");
+    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: WARNING %s filename extension \"%s\" is non-compliant\n",nco_prg_nm_get(),fnc_nm,sfx_sng ? sfx_sng : "(null)");
 
     if(flg_nc4){
       if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: HINT rename file with \"%s\" rather than \"%s\" extension\n",nco_prg_nm_get(),sfx_nc,sfx_sng);
@@ -2794,7 +2794,7 @@ nco_chk_xtn /* [fnc] Check filename extension */
   if(fl_nm_dpl) fl_nm_dpl=(char *)nco_free(fl_nm_dpl);
 
   if(brk_nbr > 0){
-    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: INFO %s reports total number of non-compliant filename extensions is %d\n",nco_prg_nm_get(),fnc_nm,brk_nbr);
+    if(nco_dbg_lvl_get() >= nco_dbg_quiet) (void)fprintf(stdout,"%s: INFO %s total number of non-compliant filename extensions is %d\n",nco_prg_nm_get(),fnc_nm,brk_nbr);
   } /* !brk_nbr */
 
   return brk_nbr;


=====================================
src/nco/nco_mss_val.c
=====================================
@@ -390,7 +390,7 @@ nco_mss_val_get /* [fnc] Update number of attributes, missing value of variable
   /* Warn when NCO looks for _FillValue and file has missing_value, and/or
      warn when NCO looks for missing_value and file has _FillValue.
      20101129: This is a long warning, only print when nco_dbg_lvl > 0 */
-  if(nco_dbg_lvl_get() >= nco_dbg_std && has_fll_val && !var->has_mss_val && WRN_FIRST){
+  if(nco_dbg_lvl_get() >= nco_dbg_fl && has_fll_val && !var->has_mss_val && WRN_FIRST){
     char sa[1000];
     char sa1[1000];
     char sa2[1000]; 
@@ -461,7 +461,7 @@ nco_mss_val_get_dbl /* [fnc] Return missing value of variable, if any, as double
   /* Warn when NCO looks for _FillValue but file has missing_value, and/or
      warn when NCO looks for missing_value but file has _FillValue.
      20101129: This is a long warning, only print when nco_dbg_lvl > 0 */
-  if(nco_dbg_lvl_get() >= nco_dbg_std && has_fll_val && !has_mss_val && WRN_FIRST){
+  if(nco_dbg_lvl_get() >= nco_dbg_fl && has_fll_val && !has_mss_val && WRN_FIRST){
     char sa[1000];
     char sa1[1000];
     char sa2[1000]; 
@@ -493,7 +493,7 @@ nco_mss_val_get_unn /* [fnc] Return missing value of variable, if any, as double
   int att_idx;
   int var_nbr_att;
   long att_sz;
-  nco_bool has_fll_val=False; /* [flg] Has _FillValue attribute */
+  //  nco_bool has_fll_val=False; /* [flg] Has _FillValue attribute */
   nco_bool has_mss_val=False; /* [flg] Has missing value attribute */
   nc_type att_typ;
   
@@ -503,7 +503,7 @@ nco_mss_val_get_unn /* [fnc] Return missing value of variable, if any, as double
   
   for(att_idx=0;att_idx<var_nbr_att;att_idx++){
     (void)nco_inq_attname(nc_id,var_id,att_idx,att_nm);
-    if(WRN_FIRST && !(int)strcasecmp(att_nm,nco_not_mss_val_sng_get())) has_fll_val=True;
+    //if(WRN_FIRST && !(int)strcasecmp(att_nm,nco_not_mss_val_sng_get())) has_fll_val=True;
     
     if((int)strcasecmp(att_nm,nco_mss_val_sng_get())) continue;
     (void)nco_inq_att(nc_id,var_id,att_nm,&att_typ,&att_sz);


=====================================
src/nco/nco_rgr.c
=====================================
@@ -1706,7 +1706,7 @@ nco_ntp_vrt /* [fnc] Interpolate vertically */
   if(flg_grd_in_prs){
     rcd=nco_inq_varid(vrt_in_id,plev_nm_in,&lev_id);
     if((rcd=nco_inq_varid_flg(in_id,ps_nm_in,&ps_id)) == NC_NOERR){ /* NB: Use in_id not vrt_in_id to search for PS in pure-pressure files since the surface pressure field is likely to be in the data file */
-      /* Output file creation procedure discriminates between input surface pressure dimensioned as CAM/EAM vs. ECMWF */
+      /* Output file-creation procedure discriminates between input surface pressure dimensioned as CAM/EAM vs. ECMWF */
       flg_grd_hyb_cameam=True;
       if(flg_grd_out_hyb && (ps_id_tpl == NC_MIN_INT)) (void)fprintf(stderr,"%s: INFO %s detects spatially varying surface pressure field %s in pure-pressure input data file. %s will be copied directly from pure-pressure grid input dataset to, and used to construct the pressures of, the output hybrid-coordinate data file, where it will be named %s.\n",nco_prg_nm_get(),fnc_nm,ps_nm_in,ps_nm_in,ps_nm_out);
       if(flg_grd_out_hyb && (ps_id_tpl != NC_MIN_INT)) (void)fprintf(stderr,"%s: INFO %s detects spatially varying surface pressure field in both vertical-grid file as %s, and in pure-pressure input data file as %s. The vertical grid-file takes precedence. %s will be copied directly from vertical-grid file to, and used to construct the pressures of, the output hybrid-coordinate data file, where it will be named %s. %s in input pure-pressure file will be ignored.\n",nco_prg_nm_get(),fnc_nm,ps_nm_tpl,ps_nm_in,ps_nm_tpl,ps_nm_out,ps_nm_in);
@@ -2628,6 +2628,7 @@ nco_ntp_vrt /* [fnc] Interpolate vertically */
      ARGO: PRESSURE
      CAM/EAM: hyai, hyam, hybi, hybm, ilev, lev, P0, PS
      ECMWF: hyai, hyam, hybi, hybm, lev, lnsp
+     ERA5: level
      MPAS-O: layerThickness, maxLevelCell, timeMonthly_avg_layerThickness, timeMonthly_avg_zMid, zMid
      MPAS-O: refBottomDepth, vertCoordMovementWeights (derived 1D-profiles, no horizontal dimensions) 
      NCEP: plev
@@ -2635,7 +2636,7 @@ nco_ntp_vrt /* [fnc] Interpolate vertically */
      SOSE: z
      WOA: depth, depth_bnds, volume, zBroadcast
      Run-time: dpt_nm_in, dpt_nm_out, plev_nm_in, plev_nm_out, ps_nm_in, ps_nm_tpl */
-  const char *var_xcl_lst_fix[]={"/depth","/depth_bnds","/hyai","/hyam","/hybi","/hybm","/ilev","/lev","/layerThickness","/lnsp","/maxLevelCell","/P0","/plev","/PRESSURE","/refBottomDepth","/timeMonthly_avg_layerThickness","/timeMonthly_avg_zMid","/vertCoordMovementWeights","/volume","/z","/zBroadcast","/zMid"};
+  const char *var_xcl_lst_fix[]={"/depth","/depth_bnds","/hyai","/hyam","/hybi","/hybm","/ilev","/layerThickness","/lev","/level","/lnsp","/maxLevelCell","/P0","/plev","/PRESSURE","/refBottomDepth","/timeMonthly_avg_layerThickness","/timeMonthly_avg_zMid","/vertCoordMovementWeights","/volume","/z","/zBroadcast","/zMid"};
   int var_xcl_fix_nbr=sizeof(var_xcl_lst_fix)/sizeof(char *); /* [nbr] Number of variables in fixed (compile-time) exclusion list */
   /* Create list to hold both compile- and run-time exclusion variables */
   char **var_xcl_lst=NULL; /* [sng] List of variables to exclude */


=====================================
src/nco/nco_scm.c
=====================================
@@ -210,7 +210,7 @@ nco_nmn_get(void) /* [fnc] Return mnemonic that describes current NCO version */
   /* Purpose: Return mnemonic describing current NCO version
      20191221: ncremap/ncclimo print left quote and first word of this string, so one-word strings look best
      20200117: fixed this limitation, multi-word versions work fine */
-  return "Shabu Shabu";
+  return "Bambino";
 } /* !nco_nmn_get() */
 
 void



View it on GitLab: https://salsa.debian.org/debian-gis-team/nco/-/commit/bd5791241d9f91acad1bee1892e701280cef8019

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/nco/-/commit/bd5791241d9f91acad1bee1892e701280cef8019
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20240323/d5d4024d/attachment-0001.htm>


More information about the Pkg-grass-devel mailing list