diff --git a/cmake/Modules/setHOST.cmake b/cmake/Modules/setHOST.cmake index 1d0a3b534..bdf358c33 100644 --- a/cmake/Modules/setHOST.cmake +++ b/cmake/Modules/setHOST.cmake @@ -17,8 +17,14 @@ macro( setHOST ) string(REGEX MATCH "t[0-9][0-9]a" HOST-WCOSS ${HOSTNAME} ) endif() string(REGEX MATCH "v[0-9][0-9]a" HOST-WCOSS_D ${HOSTNAME} ) - if( NOT HOST-WCOSS_D )# don't overwrite if we are on venus + if( NOT HOST-WCOSS_D )# don't overwrite if we are on venus Phase 3 + string(REGEX MATCH "v[0-9][0-9][0-9]a" HOST-WCOSS_D ${HOSTNAME} ) + endif() + if( NOT HOST-WCOSS_D )# don't overwrite if we are on venus/Phase 3.5 string(REGEX MATCH "m[0-9][0-9]a" HOST-WCOSS_D ${HOSTNAME} ) + if( NOT HOST-WCOSS_D )# don't overwrite if we are on mars Phase 3 + string(REGEX MATCH "m[0-9][0-9][0-9]a" HOST-WCOSS_D ${HOSTNAME} ) + endif() endif() string(REGEX MATCH "llogin" HOST-WCOSS_C ${HOSTNAME} ) if( NOT HOST-WCOSS_C )# don't overwrite if we are on luna diff --git a/doc/Release_Notes.gfsda.v16.0.0.txt b/doc/Release_Notes.gfsda.v16.0.0.txt new file mode 100644 index 000000000..3858f2b64 --- /dev/null +++ b/doc/Release_Notes.gfsda.v16.0.0.txt @@ -0,0 +1,378 @@ +GFSDA.v16.0.0 RELEASE NOTES + +GIT TAG + * GFS DA v16.0.0 is in github repository NOAA-EMC/GSI. GFS DA v16 is intended to be installed + as part of the entire GFS v16 package. Please see GFS v16 release notes for the name and + location of the GFS tag in github. The GFS tag contains a script which checks out the + appropriate GFS DA v16 tag. + + + + +DOC CHANGES + * Rename Release_Notes.fv3gfs_da.v15.0.0.txt as Release_Notes.gfsda.v16.0.0 and update contents to + relect GFS DA v16 development. + + + + +CODE CHANGES + * Data assimilation changes + * Use a Local Ensemble Kalman Filter (LETKF) with model space localization and + linearized observation operator to replace the Ensemble Square Root Filter (EnSRF). + * Apply a new 4-Dimensional Incremental Analysis Update (4D-IAU) technique. + * Turn on Stochastic Kinetic Energy Backscatter (SKEB) scheme in GDAS ensemble forecasts. + * Update variational Quality Control (QC). + * Apply Hilbert curve to aircraft data. + * Update aircraft bias correction with safeguards. + * Assimilate additional COSMIC-2 GNSS-RO data (COSMIC-2 E1 and E2) + * Apply correlated observation error for CrIS over sea surfaces and IASI over sea and land. + * Assimilate AMSU-A channel 14 and ATMS channel 15 without bias correction. + * Assimilate CSR data from ABI_G16, AHI_Himawari8, and SEVIRI_M08. + * Assimilate AVHRR from NOAA-19 and Metop-B for near sea-surface temperature (NSST). + * Assimilate high-density flight-level wind, temperature, and moisture observations in tropical storm environment + * Upgrade to Community Radiative Transfer Model (CRTM) v2.3.0. + * New GFS DA v16 codes + * calc_analysis.fd - compute analysis by combining guess and increment + * calc_increment_ens_ncio.fd - compute ensemble increment using netcdf io + * interp_inc.fd - horizontally interpolate analysis increment to specified output grid + * ncdiag_cat.fd - concatenate netcdf diagnostic files created by GSI + + + + +JOB CHANGES + * Update jobs to run within GFS workflow + * Rename the following jobs + * JGDAS_ENKF_RECENTER - rename as JGDAS_ENKF_ECEN + * JGDAS_VERFOZN - rename as JGDAS_ATMOS_VERFOZN + * JGDAS_VERFRAD - rename as JGDAS_ATMOS_VERFRAD + * JGDAS_VMINMON - rename as JGDAS_ATMOS_VMINMON + * JGFS_VMINMON - rename as JGFS_ATMOS_VMINMON + * JGLOBAL_ANALYSIS - rename as JGLOBAL_ATMOS_ANALYSIS + * JGLOBAL_ENKF_SELECT_OBS - rename as JGDAS_ENKF_SELECT_OBS + * JGLOBAL_ENKF_UPDATE - rename as JGDAS_ENKF_UPDATE + * Remove the following job + * JGDAS_ENKF_INNOVATE_OBS - this job is no longer used + * Add the following new jobs + * JGDAS_ATMOS_ANALYSIS_DIAG - create GSI diagnostic files for deterministic analysis + * JGDAS_ATMOS_CHGRES_FORENKF - chgres deterministic forecast to EnKF resolution + * JGDAS_ENKF_DIAG - create GSI diagnosic files for EnKF members + * JGDAS_ENKF_SFC - create surface analysis files for EnKF members + * JGLOBAL_ATMOS_ANALYSIS_CALC - create gaussian grid atmospheric and surface analysis files + + + + +SCRIPT CHANGES + * Update scripts to run within GFS workflow. + * Remove ".ecf" suffix from script names + * Rename the following scripts + * exgdas_vrfminmon.sh.ecf - rename as exgdas_atmos_vminmon.sh + * exgdas_vrfyozn.sh.ecf - rename as exgdas_atmos_verfozn.sh + * exgdas_vrfyrad.sh.ecf - rename as exgdas_atmos_verfrad.sh + * exgfs_vrfminmon.sh.ecf - rename as exgfs_atmos_vminmon.sh + * exglobal_analysis_fv3gfs.sh.ecf - rename as exglobal_atmos_analysis.sh + * exglobal_enkf_fcst_fv3gfs.sh.ecf - rename as exgdas_enkf_fcst.sh + * exglobal_enkf_post_fv3gfs.sh.ecf - rename as exgdas_enkf_post.sh + * exglobal_enkf_recenter_fv3gfs.sh.ecf - rename as exgdas_enkf_ecen.sh + * exglobal_enkf_update_fv3gfs.sh.ecf - rename as exgdas_enkf_update.sh + * Remove the following job + * exglobal_enkf_innovate_obs_fv3gfs.sh.ecf - this script is no longer used + * Add the following new scripts + * exgdas_atmos_chgres_forenkf.sh - chgres deterministic forecast to EnKF resolution + * exgdas_enkf_sfc.sh - create surface analysis files for EnKF members + * exglobal_atmos_analysis_calc.sh - create gaussian grid atmospheric and surface analysis files + * exglobal_diag.sh - create GSI diagnostic files + + + + +PARM CHANGES + * Update to run within GFS workflow. Parm or configuration files for GFS components reside in + parm/config. Below are the parm (config) files used by each GFS DA v16 job. Note: the + config file prefix "config." is omitted below for the sake of readability. + * JGDAS_ATMOS_ANALYSIS_DIAG - base, anal, analdiag + * JGDAS_ATMOS_CHGRES_FORENKF - base, anal, echgres + * JGDAS_ENKF_DIAG - base, anal, eobs, analdiag, ediag + * JGDAS_ENKF_ECEN - base, ecen + * JGDAS_ENKF_FCST - base, fcst, efcs + * JGDAS_ENKF_POST - base, epos + * JGDAS_ENKF_SELECT_OBS - base, anal, eobs + * JGDAS_ENKF_SFC - base, esfc + * JGDAS_ENKF_UPDATE - base, anal, eupd + * JGLOBAL_ATMOS_ANALYSIS - base, anal + * JGLOBAL_ATMOS_ANALYSIS_CALC - base, anal, analcalc + Parameters common to all jobs are in config.base. Analysis jobs share config.anal. + This avoids duplication of identical parameters across multiple parameter files. + + + + +FIX CHANGES + * Updates to run GFS DA v16 + * New files and directory + * Big_Endian + * global_berror.l127y*.f77 - L127 static background error files for various resolutions + * global_berror.l64y194.f77, global_berror.l64y98.f77 - L64 static background error files + for additional resolutions + * global_anavinfo.l127.txt - change vertical resolution to 127, add correlated error section + * global_hybens_info.l127.txt - GSI localization parameters for L127 + * global_hybens_smoothinfo.l127.txt - smoothing parameters for L127 + * global_lightinfo.txt - lightning data info file + * Rcov_* - correlated observation error for CrIS and IASI + * vlocal_eig_l*.dat - LETKF model space localization parameters for L127 + * vqctp001.dat - variational quality control parameters + * Big_Endian/global_berror.l127y770.f77 - L127 static background error file for C768 + * gfsv16_historical/ - contain historical fix files + * Modify existing files + * global_convinfo.txt - updates for new variational quality control; adjust gross checks + limits for ps and sst; adjust gps error limits; assimilate + additional gps data; assimilate t 136, q 136, and uv 236; + remove sst 200, 201 and 202; assmilate sst 198; add uv 255 + (monitor); assimilate uv 260_225 + * global_ozinfo.txt - add ompslp_npp (monitor mode) + * global_satinfo.txt - assimilate the following: amsua channel 14 and atms channel 15 + (without bias correction), avhrr3_n19 channels 3-5, seviri_m08 + channels 5-6, ahi_himawari8 channels 8-10, abi_g16 channel 8 + * prepobs_errtable.global - update observation errors for ps types 120, 180, 181, 187; + type 136 t, q, and ps; uv 236, 245, 246, 247, 260, 290 + + + + +RESOURCE INFORMATION + * Frequency of run + * 6 hourly cycle (00, 06, 12, 18Z) - no change from current operations + + + * All versions of libraries, compiler, and modules used by GFS DA v16 are specified in + modulefiles/modulefile.ProdGSI.wcoss_d + + + * Data retention for files in $COMROOTp3 are the same as those specified for + the overall GFS v16 package + + + * Disk space. Please see disk usage estimates for entire GFS v16 package + + + * Computational resources and run times + * JGLOBAL_ATMOS_ANALYSIS (GFS) + * 250 nodes, 1000 tasks, ptile=4, 7 threads/task + * Runtime: 28.1 - 29.4 minutes + + * JGLOBAL_ATMOS_ANALYSIS_CALC (GFS) + * 5 nodes, 140 tasks, ptile=28, 1 thread/task + * Runtime: 2.4 - 2.7 minutes + + * JGLOBAL_ATMOS_ANALYSIS (GDAS) + * 250 nodes, 1000 tasks, ptile=4, 7 threads/task + * Runtime: 38.2 - 39.3 minutes + + * JGLOBAL_ATMOS_ANALYSIS_CALC (GDAS) + * 5 nodes, 140 tasks, ptile=28, 1 thread/task + * Runtime: 3.5 - 4.5 minutes + + * JGDAS_ATMOS_ANALYSIS_DIAG (GDAS) + * 4 nodes, 112 tasks, ptile=28, 1 thread/task + * Runtime: 3.0 - 3.3 minutes + + * JGDAS_ENKF_SELECT_OBS + * 120 nodes, 480 tasks, ptile=4, 7 threads/task + * Runtime: 4.1 - 4.8 minutes + + * JGDAS_ENKF_DIAG + * 2 nodes, 56 tasks, ptile=28, 1 thread/task + * Runtime: 2.9 - 3.2 minutes + + * JGDAS_ENKF_UPDATE + * 240 nodes, 960 tasks, ptile=4, 7 threads/task + * Runtime: 25.6 - 26.7 minutes + + * JGDAS_ENKF_ECEN (3x) + * 60 nodes, 240 tasks, ptile=4, 7 threads/task + * Concurrently run 3 realizations of JGDAS_ENKF_RECENTER. Each job + processes an IAU analysis time. Each job uses 20 nodes, 80 tasks, + ptile=4, 7 threads/task. + * Runtime: 4.1 - 4.8 minutes + + * JGDAS_ENKF_SFC + * 3 nodes, 84 tasks, ptile=28, 1 thread/task + * Runtime: 2.2 - 2.6 minutes + + * JGDAS_ENKF_FCST (40x) + * 600 nodes, 16800 tasks, ptile=28, 1 thread/task + * Concurrently run 40 realizations of JGDAS_ENKF_FCST. Each job + sequentially processes 2 EnKF members. Each job uses 15 nodes, + 420 tasks, ptile=28, 1 thread/task. + * Runtime: 28.5 - 31.6 minutes + + * JGDAS_ENKF_POST (7x) + * 140 nodes, 560 tasks, ptile=4, 7 threads/task + * Concurrently run 7 realizations of JGDAS_ENKF_POST. Each job + prcoesses one forecast hour. Each job uses 20 nodes, 80 tasks, + ptile=4, 7 threads/task. + * Runtime: 10.6 - 11.3 minutes + + + + +PRE-IMPLEMENTATION TESTING REQUIREMENTS + * Which production jobs should be tested as part of this implementation? + * The GFS DA package needs to tested with the entire GFS v16 suite. + + + * Does this change require a 30-day evaluation? + * Yes, the entire GFS v16 package requires a 30-day evaluation + + + * Suggested evaluators + * Same as those for entire GFS v16 package + + + +DISSEMINATION INFORMATION + * Where should this output be sent? + * same as current operations + + + * Who are the users? + * same as current operations + + + * Which output files should be transferred from PROD WCOSS to DEV WCOSS? + * Please refer to release notes for GFS v16 package + + + * Directory changes + * Add atmos and wave to gfs, gdas, and enkfgdas paths. GFS v16 paths are + - $COMROOTp3/gfs/prod/gfs.$PDY/$cyc/{atmos, wave} + - $COMROOTp3/gfs/prod/gdas.$PDY/$cyc/{atmos, wave} + - $COMROOTp3/gfs/prod/enkfgdas.$PDY/$cyc/atmos EnKF does not run with waves + * Write GSI subdomain specific diagnostic files to new directory, gsidiags, in + gdas.$PDY/$cyc/atmos and enkfgdas.$PDY/$cyc/atmos + + + * File changes. Only GFS DA v16.0.0 file changes are listed below. + + * $COMROOTp3/gfs/prod/gfs.$PDY/$cyc/atmos + * Rename + * replace ".nemsio" suffix with ".nc" for atm* and sfc* files + * Add + * gfs.t${cyc}z.atmi003.nc and gfs.t${cyc}z.atmi009.nc - analysis increment files + valid at the start and end of the IAU analysis window + * gfs.t${cyc}z.loganl.txt - text file indicating creation of GFS atmanl and sfcanl files + * gfs.t${cyc}z.loginc.txt - text file indicating creation of GFS IAU increment files + + + * $COMROOTp3/gfs/prod/gdas.$PDY/$cyc/atmos + * Rename + * replace ".nemsio" suffix with ".nc" for atm* and sfc* files + * Add + * gdas.t${cyc}z.atma003.ensres.nc, gdas.t${cyc}z.atma009.ensres.nc - analyses valid + at the start and end of the IAU analysis window interpolated to EnKF resolution + * gdas.t${cyc}z.atmf003.ensres.nc, gdas.t${cyc}z.atmf006.ensres.nc, + gdas.t${cyc}z.atmf009.ensres.nc - 3, 6, and 9 hour forecasts interpolated to + EnKF resolution + * gdas.t${cyc}z.atmi003.nc, gdas.t${cyc}z.atmi009.nc - IAU analysis increment files + at the start and end of the IAU analysis window + * gdas.t${cyc}z.loganl.txt - text file indicating creation of GDAS atmanl and sfcanl files + * gdas.t${cyc}z.loginc.txt - text file indicating creation of GDAS IAU increment files + * gsidiags - directory containing sub-domain GDAS GSI diagnostic files + + * $COMROOTp3/gfs/prod/enkfgdas.$PDY/$cyc/atmos + * Rename + * replace ".nemsio" suffix with ".nc" for atm* and sfc* files + * replace ".nc4" suffix with ".nc" for ensmean and ensspread files + * Add + * efcs.grpXX for XX=21 to 40 - efcs txt files for EnKF forecast groups 21 to 40 + * gdas.t${cyc}z.atmi003.ensmean.nc - ensemble mean analysis increment valid at start of IAU window + * gdas.t${cyc}z.atminc.ensmean.nc - ensemble mean analysis increment valid at center of IAU window + * gdas.t${cyc}z.atmi009.ensmean.nc - ensemble mean analysis increment valid at end of IAU window + * gdas.t${cyc}z.loginc.txt - text file indicating creation of EnKF IAU increment files + * gsidiags - directory containing sub-domain EnKF GSI diagnostic files + * memXXX/gdas.t${cyc}z.ratmi003.nc - recentered analysis increment valid at start of IAU window + for EnKF member memXXX + * memXXX/gdas.t${cyc}z.ratminc.nc - recentered analysis increment valid at center of IAU window + for EnKF member memXXX + * memXXX/gdas.t${cyc}z.ratmi009.nc - recentered analysis increment valid at end of IAU window + for EnKF member memXXX + * Remove + * remove eomg.grpXX - job creating these files is not run in GFS v16 + * gdas.t00z.atmanl.ensmean.nemsio + * memXXX/gdas.t${cyc}z.abias, abias_air, abias_pc, atmanl, cnvstat, gsistat, oznstat, ratmanl, + radstat - these files are not created in GFS v16 + + + + +HPSS ARCHIVE + * Retention length? + * Please refer to release notes for GFS v16 package + + + * List which output files should be archived + * Please refer to release notes for GFS v16 package + + + + +IMPLEMENTATION INSTRUCTIONS + * Please note that the GFS DA v16 components must be installed in conjunction with the entire GFS v16 package. + Thus, the implementation instructions below extract the entire GFS v16 package. The GFS package is + tagged in github as tag gfs.v16.0.0. Implementation instructions for this tag follow: + + 1) cd $NWROOTp3 + + 2) mkdir $NWROOTp3/gfs.v16.0.0 + + 3) cd $NWROOTp3/gfs.v16.0.0 + + 4) git clone https://github.com/NOAA-EMC/global-workflow.git . + * Notes: + * The "." after global-workflow.git is important. It tells git to clone the repository + fv3gfs into the local working directory, $NWROOTp3/gfs.v16.0.0. + * The SPA(s) handling the GFS v16 implementation may encounter "permission denied" messages when + attempting to clone github repositories. Code managers need to grant access the SPA(s). Please + contact Kate.Friedman@noaa.gov for assistance. + + 5) git checkout gfs.v16.0.0 + + 6) cd sorc + + 7) ./checkout.sh + * This script extracts the GFS v16 components from github + + 8) ./build_all.sh + * Script build_all.sh compiles GFS v16 components. Runtime output from the build for each + package is written to log files in directory logs. Specifically, GFS DA v16 build information + is written to logs/build_gsi.log. Script build_gsi.sh invokes gsi.fd/ush/build_all_cmke.sh. + This script uses cmake to build GFS DA v16 executables. Script build_all_cmake.sh accepts two + command line options: build type and directory path to package. Two build types are + supported - PRODUCTION (default) and DEBUG. + + 9) ./link_fv3gfs.sh nco dell + + + +JOB DEPENDENCIES & FLOW DIAGRAM + * GFS DA v16 adds several DA jobs to the GFS. Below are dependencies for + new jobs + * JGDAS_ATMOS_ANALYSIS_DIAG - trigger upon completion of JGLOBAL_ATMOS_ANALYSIS + * JGDAS_ATMOS_CHGRES_FORENKF - trigger upon completion of GDAS JGLOBAL_FORECAST and all JGDAS_ENKF_FCST + * JGDAS_ENKF_DIAG - trigger upon completion of JGDAS_ENKF_SELECT_OBS + * JGDAS_ENKF_SFC - trigger upon completion of JGDAS_ENKF_UPDATE + * JGLOBAL_ATMOS_ANALYSIS_CALC - trigger upon completion of JGLOBAL_ATMOS_ANALYSIS + * Dependencenies also change due to the renaming of existing jobs. These + dependencies are given below + * JGDAS_ENKF_ECEN - trigger upon completion of JGDAS_ENKF_UPDATE and JGLOBAL_ATMOS_ANALYSIS + * JGDAS_ATMOS_VERFOZN - trigger upon completion of JGDAS_ATMOS_ANALYSIS_DIAG + * JGDAS_ATMOS_VERFRAD - trigger upon completion of JGDAS_ATMOS_ANALYSIS_DIAG + * JGDAS_ATMOS_VMINMON - trigger upon completion of JGLOBAL_ATMOS_ANALYSIS + * JGFS_ATMOS_VMINMON - trigger upon completion of JGLOBAL_ATMOS_ANALYSIS + * JGLOBAL_ATMOS_ANALYSIS - trigger upcon completion of JGLOBAL_PREP + * JGDAS_ENKF_SELECT_OBS - trigger upon completion of JGLOBAL_PREP + * JGDAS_ENKF_UPDATE - tigger upon completion of JGDAS_ENKF_DIAG + + diff --git a/fix b/fix index e47bcf18c..82c9a46fa 160000 --- a/fix +++ b/fix @@ -1 +1 @@ -Subproject commit e47bcf18cc9cab37a1f3ccc198b8e6bab578c9b9 +Subproject commit 82c9a46fabd8d04686589241c36381ab17810cfd diff --git a/jobs/JGLOBAL_ANALDIAG b/jobs/JGDAS_ATMOS_ANALYSIS_DIAG similarity index 86% rename from jobs/JGLOBAL_ANALDIAG rename to jobs/JGDAS_ATMOS_ANALYSIS_DIAG index 0dc227616..8ab157dc7 100755 --- a/jobs/JGLOBAL_ANALDIAG +++ b/jobs/JGDAS_ATMOS_ANALYSIS_DIAG @@ -54,10 +54,11 @@ export pgmerr=errfile ############################################## -# Set variables used in the exglobal script +# Set variables used in the script ############################################## export CDATE=${CDATE:-${PDY}${cyc}} export CDUMP=${CDUMP:-${RUN:-"gfs"}} +export COMPONENT=${COMPONENT:-atmos} if [ $RUN_ENVIR = "nco" ]; then export ROTDIR=${COMROOT:?}/$NET/$envir fi @@ -81,20 +82,19 @@ export ASUFFIX=${ASUFFIX:-$SUFFIX} if [ $RUN_ENVIR = "nco" -o ${ROTDIR_DUMP:-NO} = "YES" ]; then - export COMIN=${COMIN:-$ROTDIR/$RUN.$PDY/$cyc} - export COMOUT=${COMOUT:-$ROTDIR/$RUN.$PDY/$cyc} - export COMIN_OBS=${COMIN_OBS:-$ROTDIR/$RUN.$PDY/$cyc} - export COMIN_GES_OBS=${COMIN_GES_OBS:-$ROTDIR/$GDUMP.$gPDY/$gcyc} + export COMIN=${COMIN:-$ROTDIR/$RUN.$PDY/$cyc/$COMPONENT} + export COMOUT=${COMOUT:-$ROTDIR/$RUN.$PDY/$cyc/$COMPONENT} + export COMIN_OBS=${COMIN_OBS:-$ROTDIR/$RUN.$PDY/$cyc/$COMPONENT} + export COMIN_GES_OBS=${COMIN_GES_OBS:-$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT} else - export COMOUT="$ROTDIR/$CDUMP.$PDY/$cyc" + export COMOUT="$ROTDIR/$CDUMP.$PDY/$cyc/$COMPONENT" export COMIN_OBS="$DMPDIR/$CDATE/$CDUMP" export COMIN_GES_OBS="$DMPDIR/$GDATE/$GDUMP" fi mkdir -m 775 -p $COMOUT -# COMIN_GES and COMIN_GES_ENS are used in exglobal script -# TO DO: Map NCO's directory into these variables -export COMIN_GES="$ROTDIR/$GDUMP.$gPDY/$gcyc" -export COMIN_GES_ENS="$ROTDIR/enkfgdas.$gPDY/$gcyc" +# COMIN_GES and COMIN_GES_ENS are used in script +export COMIN_GES="$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT" +export COMIN_GES_ENS="$ROTDIR/enkfgdas.$gPDY/$gcyc/$COMPONENT" export ATMGES="$COMIN_GES/${GPREFIX}atmf006${GSUFFIX}" @@ -134,14 +134,14 @@ export DOGAUSFCANL=${DOGAUSFCANL:-"YES"} ############################################################### -# Run relevant exglobal script +# Run relevant script env msg="HAS BEGUN on `hostname`" postmsg "$jlogfile" "$msg" $LOGSCRIPT -${ANALDIAGSH:-$HOMEgsi/scripts/exglobal_analdiag_fv3gfs.sh.ecf} +${ANALDIAGSH:-$SCRgfs/exglobal_diag.sh} status=$? [[ $status -ne 0 ]] && exit $status diff --git a/jobs/JGDAS_ATMOS_CHGRES_FORENKF b/jobs/JGDAS_ATMOS_CHGRES_FORENKF new file mode 100755 index 000000000..78a1d384b --- /dev/null +++ b/jobs/JGDAS_ATMOS_CHGRES_FORENKF @@ -0,0 +1,137 @@ +#!/bin/ksh +set -x + +export RUN_ENVIR=${RUN_ENVIR:-"nco"} +export PS4='$SECONDS + ' +date + + +############################# +# Source relevant config files +############################# +export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} +configs="base anal echgres" +config_path=${EXPDIR:-$NWROOT/gfs.${gfs_ver}/parm/config} +for config in $configs; do + . $config_path/config.$config + status=$? + [[ $status -ne 0 ]] && exit $status +done + + +########################################## +# Source machine runtime environment +########################################## +. $HOMEgfs/env/${machine}.env anal +status=$? +[[ $status -ne 0 ]] && exit $status + + +############################################## +# Obtain unique process id (pid) and make temp directory +############################################## +export pid=${pid:-$$} +export outid=${outid:-"LL$job"} + +export DATA=${DATA:-${DATAROOT}/${jobid:?}} +mkdir -p $DATA +cd $DATA + + +############################################## +# Run setpdy and initialize PDY variables +############################################## +export cycle="t${cyc}z" +setpdy.sh +. ./PDY + + +############################################## +# Determine Job Output Name on System +############################################## +export pgmout="OUTPUT.${pid}" +export pgmerr=errfile + + +############################################## +# Set variables used in the script +############################################## +export CDATE=${CDATE:-${PDY}${cyc}} +export CDUMP=${CDUMP:-${RUN:-"gfs"}} +export COMPONENT=${COMPONENT:-atmos} +if [ $RUN_ENVIR = "nco" ]; then + export ROTDIR=${COMROOT:?}/$NET/$envir +fi +export DO_CALC_ANALYSIS=${DO_CALC_ANALYSIS:-"YES"} + + +############################################## +# Begin JOB SPECIFIC work +############################################## + +GDATE=$($NDATE -$assim_freq $CDATE) +gPDY=$(echo $GDATE | cut -c1-8) +gcyc=$(echo $GDATE | cut -c9-10) +GDUMP=${GDUMP:-"gdas"} + +export OPREFIX="${CDUMP}.t${cyc}z." +export GPREFIX="${GDUMP}.t${gcyc}z." +export APREFIX="${CDUMP}.t${cyc}z." +export GSUFFIX=${GSUFFIX:-$SUFFIX} +export ASUFFIX=${ASUFFIX:-$SUFFIX} + + +if [ $RUN_ENVIR = "nco" -o ${ROTDIR_DUMP:-NO} = "YES" ]; then + export COMIN=${COMIN:-$ROTDIR/$RUN.$PDY/$cyc/$COMPONENT} + export COMOUT=${COMOUT:-$ROTDIR/$RUN.$PDY/$cyc/$COMPONENT} + export COMOUT_ENS=${COMOUT_ENS:-$ROTDIR/enkfgdas.$PDY/$cyc/$COMPONENT} + export COMIN_OBS=${COMIN_OBS:-$ROTDIR/$RUN.$PDY/$cyc/$COMPONENT} + export COMIN_GES_OBS=${COMIN_GES_OBS:-$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT} +else + export COMOUT="$ROTDIR/$CDUMP.$PDY/$cyc/$COMPONENT" + export COMOUT_ENS="$ROTDIR/enkfgdas.$PDY/$cyc/$COMPONENT" + export COMIN_OBS="$DMPDIR/$CDATE/$CDUMP" + export COMIN_GES_OBS="$DMPDIR/$GDATE/$GDUMP" +fi +mkdir -m 775 -p $COMOUT +# COMIN_GES and COMIN_GES_ENS are used in script +export COMIN_GES="$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT" +export COMIN_GES_ENS="$ROTDIR/enkfgdas.$gPDY/$gcyc/$COMPONENT" + +############################################################### +# Run relevant script +env +msg="HAS BEGUN on `hostname`" +postmsg "$jlogfile" "$msg" +$LOGSCRIPT + + +${CHGRESFCSTSH:-$SCRgfs/exgdas_atmos_chgres_forenkf.sh} +status=$? +[[ $status -ne 0 ]] && exit $status + + +############################################## +# End JOB SPECIFIC work +############################################## + +############################################## +# Final processing +############################################## +if [ -e "$pgmout" ] ; then + cat $pgmout +fi + + +msg="ENDED NORMALLY." +postmsg "$jlogfile" "$msg" + + +########################################## +# Remove the Temporary working directory +########################################## +cd $DATAROOT +[[ $KEEPDATA = "NO" ]] && rm -rf $DATA + +date +exit 0 diff --git a/jobs/JGLOBAL_ENKF_ANALDIAG b/jobs/JGDAS_ENKF_DIAG similarity index 87% rename from jobs/JGLOBAL_ENKF_ANALDIAG rename to jobs/JGDAS_ENKF_DIAG index 6e08ea2f4..ff227c567 100755 --- a/jobs/JGLOBAL_ENKF_ANALDIAG +++ b/jobs/JGDAS_ENKF_DIAG @@ -10,7 +10,7 @@ date # Source relevant config files ############################# export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} -configs="base anal eobs ediag" +configs="base anal eobs analdiag ediag" config_path=${EXPDIR:-$NWROOT/gfs.${gfs_ver}/parm/config} for config in $configs; do . $config_path/config.$config @@ -53,10 +53,11 @@ export pgmerr=errfile ############################################## -# Set variables used in the exglobal script +# Set variables used in the script ############################################## export CDATE=${CDATE:-${PDY}${cyc}} export CDUMP=${CDUMP:-${RUN:-"gdas"}} +export COMPONENT=${COMPONENT:-atmos} if [ $RUN_ENVIR = "nco" ]; then export ROTDIR=${COMROOT:?}/$NET/$envir fi @@ -81,20 +82,19 @@ export GSUFFIX="${GSUFFIX:-".ensmean${SUFFIX}"}" export ASUFFIX="${ASUFFIX:-"${SUFFIX}"}" if [ $RUN_ENVIR = "nco" -o ${ROTDIR_DUMP:-NO} = "YES" ]; then - export COMIN_OBS=${COMIN_OBS:-$ROTDIR/$RUN.$PDY/$cyc} - export COMIN_GES_OBS=${COMIN_GES_OBS:-$ROTDIR/$GDUMP.$gPDY/$gcyc} + export COMIN_OBS=${COMIN_OBS:-$ROTDIR/$RUN.$PDY/$cyc/$COMPONENT} + export COMIN_GES_OBS=${COMIN_GES_OBS:-$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT} else export COMIN_OBS="$DMPDIR/$CDATE/$CDUMP" export COMIN_GES_OBS="$DMPDIR/$GDATE/$GDUMP" fi -# COMIN_GES, COMIN_ANL COMIN_GES_ENS, and COMOUT are used in exglobal script -# TO DO: Map NCO's directory into these variables -COMIN_GES_CTL="$ROTDIR/gdas.$gPDY/$gcyc" -export COMIN_ANL="$ROTDIR/$CDUMP.$PDY/$cyc" -export COMIN_GES_ENS="$ROTDIR/enkfgdas.$gPDY/$gcyc" +# COMIN_GES, COMIN_ANL COMIN_GES_ENS, and COMOUT are used in script +COMIN_GES_CTL="$ROTDIR/gdas.$gPDY/$gcyc/$COMPONENT" +export COMIN_ANL="$ROTDIR/$CDUMP.$PDY/$cyc/$COMPONENT" +export COMIN_GES_ENS="$ROTDIR/enkfgdas.$gPDY/$gcyc/$COMPONENT" export COMIN_GES=$COMIN_GES_ENS -export COMOUT="$ROTDIR/enkf$CDUMP.$PDY/$cyc" +export COMOUT="$ROTDIR/enkf$CDUMP.$PDY/$cyc/$COMPONENT" export ATMGES_ENSMEAN="$COMIN_GES_ENS/${GPREFIX}atmf006$GSUFFIX" @@ -154,26 +154,18 @@ done ############################################################### -# Run relevant exglobal script +# Run relevant script env msg="HAS BEGUN on `hostname`" postmsg "$jlogfile" "$msg" $LOGSCRIPT -${ANALDIAGSH:-$SCRgsi/exglobal_analdiag_fv3gfs.sh.ecf} +${ANALDIAGSH:-$SCRgfs/exglobal_diag.sh} status=$? [[ $status -ne 0 ]] && exit $status -############################################## -# Send Alerts -############################################## -if [ $SENDDBN = YES ] ; then - $DBNROOT/bin/dbn_alert MODEL ENKF1_MSC_gsistat $job $GSISTAT -fi - - ############################################## # End JOB SPECIFIC work ############################################## diff --git a/jobs/JGDAS_ENKF_RECENTER b/jobs/JGDAS_ENKF_ECEN similarity index 85% rename from jobs/JGDAS_ENKF_RECENTER rename to jobs/JGDAS_ENKF_ECEN index 01c2b9cbd..c185ed7c3 100755 --- a/jobs/JGDAS_ENKF_RECENTER +++ b/jobs/JGDAS_ENKF_ECEN @@ -53,10 +53,11 @@ export pgmerr=errfile ############################################## -# Set variables used in the exglobal script +# Set variables used in the script ############################################## export CDATE=${CDATE:-${PDY}${cyc}} export CDUMP=${CDUMP:-${RUN:-"gdas"}} +export COMPONENT=${COMPONENT:-atmos} if [ $RUN_ENVIR = "nco" ]; then export ROTDIR=${COMROOT:?}/$NET/$envir fi @@ -89,30 +90,29 @@ export GSUFFIX=${GSUFFIX:-$SUFFIX} export ASUFFIX=${ASUFFIX:-$SUFFIX} if [ $RUN_ENVIR = "nco" -o ${ROTDIR_DUMP:-NO} = "YES" ]; then - export COMIN_OBS=${COMIN_OBS:-$ROTDIR/$RUN.$PDY/$cyc} - export COMIN_GES_OBS=${COMIN_GES_OBS:-$ROTDIR/$GDUMP.$gPDY/$gcyc} + export COMIN_OBS=${COMIN_OBS:-$ROTDIR/$RUN.$PDY/$cyc/$COMPONENT} + export COMIN_GES_OBS=${COMIN_GES_OBS:-$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT} else export COMIN_OBS="$DMPDIR/$CDATE/$CDUMP" export COMIN_GES_OBS="$DMPDIR/$GDATE/$GDUMP" fi -# COMIN, COMIN_ENS and COMIN_GES_ENS are used in exglobal script -# TO DO: Map NCO's directory into these variables -export COMIN="$ROTDIR/$CDUMP.$PDY/$cyc" -export COMIN_ENS="$ROTDIR/enkf$CDUMP_ENKF.$PDY/$cyc" -export COMOUT_ENS="$ROTDIR/enkf$CDUMP.$PDY/$cyc" -export COMIN_GES_ENS="$ROTDIR/enkf$CDUMP.$gPDY/$gcyc" +# COMIN, COMIN_ENS and COMIN_GES_ENS are used in script +export COMIN="$ROTDIR/$CDUMP.$PDY/$cyc/$COMPONENT" +export COMIN_ENS="$ROTDIR/enkf$CDUMP_ENKF.$PDY/$cyc/$COMPONENT" +export COMOUT_ENS="$ROTDIR/enkf$CDUMP.$PDY/$cyc/$COMPONENT" +export COMIN_GES_ENS="$ROTDIR/enkf$CDUMP.$gPDY/$gcyc/$COMPONENT" ############################################################### -# Run relevant exglobal script +# Run relevant script env msg="HAS BEGUN on `hostname`" postmsg "$jlogfile" "$msg" $LOGSCRIPT -${ENKFRECENSH:-$SCRgsi/exglobal_enkf_recenter_fv3gfs.sh.ecf} +${ENKFRECENSH:-$SCRgfs/exgdas_enkf_ecen.sh} status=$? [[ $status -ne 0 ]] && exit $status diff --git a/jobs/JGDAS_ENKF_FCST b/jobs/JGDAS_ENKF_FCST index 67bc685d7..60da5e706 100755 --- a/jobs/JGDAS_ENKF_FCST +++ b/jobs/JGDAS_ENKF_FCST @@ -53,10 +53,11 @@ export pgmerr=errfile ############################################## -# Set variables used in the exglobal script +# Set variables used in the script ############################################## export CDATE=${CDATE:-${PDY}${cyc}} export CDUMP=${CDUMP:-${RUN:-"gdas"}} +export COMPONENT=${COMPONENT:-atmos} if [ $RUN_ENVIR = "nco" ]; then export ROTDIR=${COMROOT:?}/$NET/$envir fi @@ -68,9 +69,8 @@ fi export CASE=$CASE_ENKF -# COMOUT is used in exglobal script -# TO DO: Map NCO's directory into these variables -export COMOUT="$ROTDIR/enkf$CDUMP.$PDY/$cyc" +# COMOUT is used in script +export COMOUT="$ROTDIR/enkf$CDUMP.$PDY/$cyc/$COMPONENT" # Forecast length for EnKF forecast @@ -85,14 +85,14 @@ export ENSBEG=$((ENSEND - NMEM_EFCSGRP + 1)) ############################################################### -# Run relevant exglobal script +# Run relevant script env msg="HAS BEGUN on `hostname`" postmsg "$jlogfile" "$msg" $LOGSCRIPT -${ENKFFCSTSH:-$SCRgsi/exglobal_enkf_fcst_fv3gfs.sh.ecf} +${ENKFFCSTSH:-$SCRgfs/exgdas_enkf_fcst.sh} status=$? [[ $status -ne 0 ]] && exit $status diff --git a/jobs/JGDAS_ENKF_POST b/jobs/JGDAS_ENKF_POST index 55bb97ee1..0aaac99af 100755 --- a/jobs/JGDAS_ENKF_POST +++ b/jobs/JGDAS_ENKF_POST @@ -53,10 +53,11 @@ export pgmerr=errfile ############################################## -# Set variables used in the exglobal script +# Set variables used in the script ############################################## export CDATE=${CDATE:-${PDY}${cyc}} export CDUMP=${CDUMP:-${RUN:-"gdas"}} +export COMPONENT=${COMPONENT:-atmos} if [ $RUN_ENVIR = "nco" ]; then export ROTDIR=${COMROOT:?}/$NET/$envir fi @@ -69,24 +70,23 @@ export GFS_NCIO=${GFS_NCIO:-"YES"} export PREFIX="${CDUMP}.t${cyc}z." -# COMIN, COMOUT are used in exglobal script -# TO DO: Map NCO's directory into these variables -export COMIN="$ROTDIR/enkf$CDUMP.$PDY/$cyc" -export COMOUT="$ROTDIR/enkf$CDUMP.$PDY/$cyc" +# COMIN, COMOUT are used in script +export COMIN="$ROTDIR/enkf$CDUMP.$PDY/$cyc/$COMPONENT" +export COMOUT="$ROTDIR/enkf$CDUMP.$PDY/$cyc/$COMPONENT" export LEVS=$((LEVS-1)) ############################################################### -# Run relevant exglobal script +# Run relevant script env msg="HAS BEGUN on `hostname`" postmsg "$jlogfile" "$msg" $LOGSCRIPT -${ENKFPOSTSH:-$SCRgsi/exglobal_enkf_post_fv3gfs.sh.ecf} +${ENKFPOSTSH:-$SCRgfs/exgdas_enkf_post.sh} status=$? [[ $status -ne 0 ]] && exit $status diff --git a/jobs/JGLOBAL_ENKF_SELECT_OBS b/jobs/JGDAS_ENKF_SELECT_OBS similarity index 90% rename from jobs/JGLOBAL_ENKF_SELECT_OBS rename to jobs/JGDAS_ENKF_SELECT_OBS index de69dd94b..4dc794822 100755 --- a/jobs/JGLOBAL_ENKF_SELECT_OBS +++ b/jobs/JGDAS_ENKF_SELECT_OBS @@ -53,10 +53,11 @@ export pgmerr=errfile ############################################## -# Set variables used in the exglobal script +# Set variables used in the script ############################################## export CDATE=${CDATE:-${PDY}${cyc}} export CDUMP=${CDUMP:-${RUN:-"gdas"}} +export COMPONENT=${COMPONENT:-atmos} if [ $RUN_ENVIR = "nco" ]; then export ROTDIR=${COMROOT:?}/$NET/$envir fi @@ -81,20 +82,19 @@ export GSUFFIX="${GSUFFIX:-".ensmean${SUFFIX}"}" export ASUFFIX="${ASUFFIX:-"${SUFFIX}"}" if [ $RUN_ENVIR = "nco" -o ${ROTDIR_DUMP:-NO} = "YES" ]; then - export COMIN_OBS=${COMIN_OBS:-$ROTDIR/$RUN.$PDY/$cyc} - export COMIN_GES_OBS=${COMIN_GES_OBS:-$ROTDIR/$GDUMP.$gPDY/$gcyc} + export COMIN_OBS=${COMIN_OBS:-$ROTDIR/$RUN.$PDY/$cyc/$COMPONENT} + export COMIN_GES_OBS=${COMIN_GES_OBS:-$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT} else export COMIN_OBS="$DMPDIR/$CDATE/$CDUMP" export COMIN_GES_OBS="$DMPDIR/$GDATE/$GDUMP" fi -# COMIN_GES, COMIN_ANL COMIN_GES_ENS, and COMOUT are used in exglobal script -# TO DO: Map NCO's directory into these variables -COMIN_GES_CTL="$ROTDIR/gdas.$gPDY/$gcyc" -export COMIN_ANL="$ROTDIR/$CDUMP.$PDY/$cyc" -export COMIN_GES_ENS="$ROTDIR/enkfgdas.$gPDY/$gcyc" +# COMIN_GES, COMIN_ANL COMIN_GES_ENS, and COMOUT are used in script +COMIN_GES_CTL="$ROTDIR/gdas.$gPDY/$gcyc/$COMPONENT" +export COMIN_ANL="$ROTDIR/$CDUMP.$PDY/$cyc/$COMPONENT" +export COMIN_GES_ENS="$ROTDIR/enkfgdas.$gPDY/$gcyc/$COMPONENT" export COMIN_GES=$COMIN_GES_ENS -export COMOUT="$ROTDIR/enkf$CDUMP.$PDY/$cyc" +export COMOUT="$ROTDIR/enkf$CDUMP.$PDY/$cyc/$COMPONENT" export ATMGES_ENSMEAN="$COMIN_GES_ENS/${GPREFIX}atmf006$GSUFFIX" @@ -153,14 +153,14 @@ done ############################################################### -# Run relevant exglobal script +# Run relevant script env msg="HAS BEGUN on `hostname`" postmsg "$jlogfile" "$msg" $LOGSCRIPT -${INVOBSSH:-$SCRgsi/exglobal_innovate_obs_fv3gfs.sh.ecf} +${INVOBSSH:-$SCRgfs/exgdas_enkf_select_obs.sh} status=$? [[ $status -ne 0 ]] && exit $status diff --git a/jobs/JGDAS_ENKF_SURFACE b/jobs/JGDAS_ENKF_SFC similarity index 85% rename from jobs/JGDAS_ENKF_SURFACE rename to jobs/JGDAS_ENKF_SFC index 1fe82bead..a143b829d 100755 --- a/jobs/JGDAS_ENKF_SURFACE +++ b/jobs/JGDAS_ENKF_SFC @@ -53,10 +53,11 @@ export pgmerr=errfile ############################################## -# Set variables used in the exglobal script +# Set variables used in the script ############################################## export CDATE=${CDATE:-${PDY}${cyc}} export CDUMP=${CDUMP:-${RUN:-"gdas"}} +export COMPONENT=${COMPONENT:-atmos} if [ $RUN_ENVIR = "nco" ]; then export ROTDIR=${COMROOT:?}/$NET/$envir fi @@ -89,30 +90,29 @@ export GSUFFIX=${GSUFFIX:-$SUFFIX} export ASUFFIX=${ASUFFIX:-$SUFFIX} if [ $RUN_ENVIR = "nco" -o ${ROTDIR_DUMP:-NO} = "YES" ]; then - export COMIN_OBS=${COMIN_OBS:-$ROTDIR/$RUN.$PDY/$cyc} - export COMIN_GES_OBS=${COMIN_GES_OBS:-$ROTDIR/$GDUMP.$gPDY/$gcyc} + export COMIN_OBS=${COMIN_OBS:-$ROTDIR/$RUN.$PDY/$cyc/$COMPONENT} + export COMIN_GES_OBS=${COMIN_GES_OBS:-$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT} else export COMIN_OBS="$DMPDIR/$CDATE/$CDUMP" export COMIN_GES_OBS="$DMPDIR/$GDATE/$GDUMP" fi -# COMIN, COMIN_ENS and COMIN_GES_ENS are used in exglobal script -# TO DO: Map NCO's directory into these variables -export COMIN="$ROTDIR/$CDUMP.$PDY/$cyc" -export COMIN_ENS="$ROTDIR/enkf$CDUMP_ENKF.$PDY/$cyc" -export COMOUT_ENS="$ROTDIR/enkf$CDUMP.$PDY/$cyc" -export COMIN_GES_ENS="$ROTDIR/enkf$CDUMP.$gPDY/$gcyc" +# COMIN, COMIN_ENS and COMIN_GES_ENS are used in script +export COMIN="$ROTDIR/$CDUMP.$PDY/$cyc/$COMPONENT" +export COMIN_ENS="$ROTDIR/enkf$CDUMP_ENKF.$PDY/$cyc/$COMPONENT" +export COMOUT_ENS="$ROTDIR/enkf$CDUMP.$PDY/$cyc/$COMPONENT" +export COMIN_GES_ENS="$ROTDIR/enkf$CDUMP.$gPDY/$gcyc/$COMPONENT" ############################################################### -# Run relevant exglobal script +# Run relevant script env msg="HAS BEGUN on `hostname`" postmsg "$jlogfile" "$msg" $LOGSCRIPT -${ENKFRESFCSH:-$SCRgsi/exglobal_enkf_surface_fv3gfs.sh.ecf} +${ENKFRESFCSH:-$SCRgfs/exgdas_enkf_sfc.sh} status=$? [[ $status -ne 0 ]] && exit $status diff --git a/jobs/JGLOBAL_ENKF_UPDATE b/jobs/JGDAS_ENKF_UPDATE similarity index 88% rename from jobs/JGLOBAL_ENKF_UPDATE rename to jobs/JGDAS_ENKF_UPDATE index b66b7e287..56c4c6027 100755 --- a/jobs/JGLOBAL_ENKF_UPDATE +++ b/jobs/JGDAS_ENKF_UPDATE @@ -53,10 +53,11 @@ export pgmerr=errfile ############################################## -# Set variables used in the exglobal script +# Set variables used in the script ############################################## export CDATE=${CDATE:-${PDY}${cyc}} export CDUMP=${CDUMP:-${RUN:-"gdas"}} +export COMPONENT=${COMPONENT:-atmos} if [ $RUN_ENVIR = "nco" ]; then export ROTDIR=${COMROOT:?}/$NET/$envir fi @@ -76,20 +77,19 @@ export ASUFFIX=${ASUFFIX:-$SUFFIX} export GSUFFIX=${GSUFFIX:-$SUFFIX} -# COMIN_GES_ENS and COMOUT_ANL_ENS are used in exglobal script -# TO DO: Map NCO's directory into these variables -export COMIN_GES_ENS="$ROTDIR/enkfgdas.$gPDY/$gcyc" -export COMOUT_ANL_ENS="$ROTDIR/enkf$CDUMP.$PDY/$cyc" +# COMIN_GES_ENS and COMOUT_ANL_ENS are used in script +export COMIN_GES_ENS="$ROTDIR/enkfgdas.$gPDY/$gcyc/$COMPONENT" +export COMOUT_ANL_ENS="$ROTDIR/enkf$CDUMP.$PDY/$cyc/$COMPONENT" ############################################################### -# Run relevant exglobal script +# Run relevant script env msg="HAS BEGUN on `hostname`" postmsg "$jlogfile" "$msg" $LOGSCRIPT -${ENKFUPDSH:-$SCRgsi/exglobal_enkf_update_fv3gfs.sh.ecf} +${ENKFUPDSH:-$SCRgfs/exgdas_enkf_update.sh} status=$? [[ $status -ne 0 ]] && exit $status diff --git a/jobs/JGLOBAL_ANALYSIS b/jobs/JGLOBAL_ATMOS_ANALYSIS similarity index 88% rename from jobs/JGLOBAL_ANALYSIS rename to jobs/JGLOBAL_ATMOS_ANALYSIS index 2933109c9..5644c7530 100755 --- a/jobs/JGLOBAL_ANALYSIS +++ b/jobs/JGLOBAL_ATMOS_ANALYSIS @@ -54,10 +54,11 @@ export pgmerr=errfile ############################################## -# Set variables used in the exglobal script +# Set variables used in the script ############################################## export CDATE=${CDATE:-${PDY}${cyc}} export CDUMP=${CDUMP:-${RUN:-"gfs"}} +export COMPONENT=${COMPONENT:-atmos} if [ $RUN_ENVIR = "nco" ]; then export ROTDIR=${COMROOT:?}/$NET/$envir fi @@ -81,20 +82,19 @@ export ASUFFIX=${ASUFFIX:-$SUFFIX} if [ $RUN_ENVIR = "nco" -o ${ROTDIR_DUMP:-NO} = "YES" ]; then - export COMIN=${COMIN:-$ROTDIR/$RUN.$PDY/$cyc} - export COMOUT=${COMOUT:-$ROTDIR/$RUN.$PDY/$cyc} - export COMIN_OBS=${COMIN_OBS:-$ROTDIR/$RUN.$PDY/$cyc} - export COMIN_GES_OBS=${COMIN_GES_OBS:-$ROTDIR/$GDUMP.$gPDY/$gcyc} + export COMIN=${COMIN:-$ROTDIR/$RUN.$PDY/$cyc/$COMPONENT} + export COMOUT=${COMOUT:-$ROTDIR/$RUN.$PDY/$cyc/$COMPONENT} + export COMIN_OBS=${COMIN_OBS:-$ROTDIR/$RUN.$PDY/$cyc/$COMPONENT} + export COMIN_GES_OBS=${COMIN_GES_OBS:-$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT} else - export COMOUT="$ROTDIR/$CDUMP.$PDY/$cyc" + export COMOUT="$ROTDIR/$CDUMP.$PDY/$cyc/$COMPONENT" export COMIN_OBS="$DMPDIR/$CDATE/$CDUMP" export COMIN_GES_OBS="$DMPDIR/$GDATE/$GDUMP" fi mkdir -m 775 -p $COMOUT -# COMIN_GES and COMIN_GES_ENS are used in exglobal script -# TO DO: Map NCO's directory into these variables -export COMIN_GES="$ROTDIR/$GDUMP.$gPDY/$gcyc" -export COMIN_GES_ENS="$ROTDIR/enkfgdas.$gPDY/$gcyc" +# COMIN_GES and COMIN_GES_ENS are used in script +export COMIN_GES="$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT" +export COMIN_GES_ENS="$ROTDIR/enkfgdas.$gPDY/$gcyc/$COMPONENT" export ATMGES="$COMIN_GES/${GPREFIX}atmf006${GSUFFIX}" @@ -145,14 +145,14 @@ export DOGAUSFCANL=${DOGAUSFCANL:-"YES"} ############################################################### -# Run relevant exglobal script +# Run relevant script env msg="HAS BEGUN on `hostname`" postmsg "$jlogfile" "$msg" $LOGSCRIPT -${ANALYSISSH:-$SCRgsi/exglobal_analysis_fv3gfs.sh.ecf} +${ANALYSISSH:-$SCRgfs/exglobal_atmos_analysis.sh} status=$? [[ $status -ne 0 ]] && exit $status diff --git a/jobs/JGLOBAL_ANALCALC b/jobs/JGLOBAL_ATMOS_ANALYSIS_CALC similarity index 86% rename from jobs/JGLOBAL_ANALCALC rename to jobs/JGLOBAL_ATMOS_ANALYSIS_CALC index 94e524a0e..7233684cc 100755 --- a/jobs/JGLOBAL_ANALCALC +++ b/jobs/JGLOBAL_ATMOS_ANALYSIS_CALC @@ -54,10 +54,11 @@ export pgmerr=errfile ############################################## -# Set variables used in the exglobal script +# Set variables used in the script ############################################## export CDATE=${CDATE:-${PDY}${cyc}} export CDUMP=${CDUMP:-${RUN:-"gfs"}} +export COMPONENT=${COMPONENT:-atmos} if [ $RUN_ENVIR = "nco" ]; then export ROTDIR=${COMROOT:?}/$NET/$envir fi @@ -81,20 +82,19 @@ export ASUFFIX=${ASUFFIX:-$SUFFIX} if [ $RUN_ENVIR = "nco" -o ${ROTDIR_DUMP:-NO} = "YES" ]; then - export COMIN=${COMIN:-$ROTDIR/$RUN.$PDY/$cyc} - export COMOUT=${COMOUT:-$ROTDIR/$RUN.$PDY/$cyc} - export COMIN_OBS=${COMIN_OBS:-$ROTDIR/$RUN.$PDY/$cyc} - export COMIN_GES_OBS=${COMIN_GES_OBS:-$ROTDIR/$GDUMP.$gPDY/$gcyc} + export COMIN=${COMIN:-$ROTDIR/$RUN.$PDY/$cyc/$COMPONENT} + export COMOUT=${COMOUT:-$ROTDIR/$RUN.$PDY/$cyc/$COMPONENT} + export COMIN_OBS=${COMIN_OBS:-$ROTDIR/$RUN.$PDY/$cyc/$COMPONENT} + export COMIN_GES_OBS=${COMIN_GES_OBS:-$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT} else - export COMOUT="$ROTDIR/$CDUMP.$PDY/$cyc" + export COMOUT="$ROTDIR/$CDUMP.$PDY/$cyc/$COMPONENT" export COMIN_OBS="$DMPDIR/$CDATE/$CDUMP" export COMIN_GES_OBS="$DMPDIR/$GDATE/$GDUMP" fi mkdir -m 775 -p $COMOUT -# COMIN_GES and COMIN_GES_ENS are used in exglobal script -# TO DO: Map NCO's directory into these variables -export COMIN_GES="$ROTDIR/$GDUMP.$gPDY/$gcyc" -export COMIN_GES_ENS="$ROTDIR/enkfgdas.$gPDY/$gcyc" +# COMIN_GES and COMIN_GES_ENS are used in script +export COMIN_GES="$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT" +export COMIN_GES_ENS="$ROTDIR/enkfgdas.$gPDY/$gcyc/$COMPONENT" export ATMGES="$COMIN_GES/${GPREFIX}atmf006${GSUFFIX}" @@ -134,14 +134,14 @@ export DOGAUSFCANL=${DOGAUSFCANL:-"YES"} ############################################################### -# Run relevant exglobal script +# Run relevant script env msg="HAS BEGUN on `hostname`" postmsg "$jlogfile" "$msg" $LOGSCRIPT -${ANALCALCSH:-$HOMEgsi/scripts/exglobal_analcalc_fv3gfs.sh.ecf} +${ANALCALCSH:-$SCRgfs/exglobal_atmos_analysis_calc.sh} status=$? [[ $status -ne 0 ]] && exit $status diff --git a/jobs/JGLOBAL_ENKF_INNOVATE_OBS b/jobs/JGLOBAL_ENKF_INNOVATE_OBS deleted file mode 100755 index 19ce53398..000000000 --- a/jobs/JGLOBAL_ENKF_INNOVATE_OBS +++ /dev/null @@ -1,171 +0,0 @@ -#!/bin/ksh -set -x - -export RUN_ENVIR=${RUN_ENVIR:-"nco"} -export PS4='$SECONDS + ' -date - - -############################# -# Source relevant config files -############################# -export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} -configs="base anal eobs" -config_path=${EXPDIR:-$NWROOT/gfs.${gfs_ver}/parm/config} -for config in $configs; do - . $config_path/config.$config - status=$? - [[ $status -ne 0 ]] && exit $status -done - - -########################################## -# Source machine runtime environment -########################################## -. $HOMEgfs/env/${machine}.env eobs -status=$? -[[ $status -ne 0 ]] && exit $status - - -############################################## -# Obtain unique process id (pid) and make temp directory -############################################## -export pid=${pid:-$$} -export outid=${outid:-"LL$job"} -export DATA=${DATA:-${DATAROOT}/${jobid:?}} -mkdir -p $DATA -cd $DATA - - -############################################## -# Run setpdy and initialize PDY variables -############################################## -export cycle="t${cyc}z" -setpdy.sh -. ./PDY - - -############################################## -# Determine Job Output Name on System -############################################## -export pgmout="OUTPUT.${pid}" -export pgmerr=errfile - - -############################################## -# Set variables used in the exglobal script -############################################## -export CDATE=${CDATE:-${PDY}${cyc}} -export CDUMP=${CDUMP:-${RUN:-"gdas"}} -if [ $RUN_ENVIR = "nco" ]; then - export ROTDIR=${COMROOT:?}/$NET/$envir -fi - - -############################################## -# Begin JOB SPECIFIC work -############################################## - -GDATE=$($NDATE -$assim_freq $CDATE) -gPDY=$(echo $GDATE | cut -c1-8) -gcyc=$(echo $GDATE | cut -c9-10) - - -export CASE=$CASE_ENKF - -export OPREFIX="${CDUMP}.t${cyc}z." -export APREFIX="${CDUMP}.t${cyc}z." -export GPREFIX="gdas.t${gcyc}z." -export GSUFFIX="${GSUFFIX:-$SUFFIX}" -export ASUFFIX="${ASUFFIX:-$SUFFIX}" - - -# COMIN_GES, COMIN_GES_ENS and COMOUT are used in exglobal script -# TO DO: Map NCO's directory into these variables -COMIN_GES_CTL="$ROTDIR/gdas.$gPDY/$gcyc" -export COMIN_GES_ENS="$ROTDIR/enkfgdas.$gPDY/$gcyc" -export COMIN_GES=$COMIN_GES_ENS -export COMOUT="$ROTDIR/enkf$CDUMP.$PDY/$cyc" - - -export ATMGES_ENSMEAN="$COMIN_GES_ENS/${GPREFIX}atmf006.ensmean$GSUFFIX" -if [ ! -f $ATMGES_ENSMEAN ]; then - echo "FATAL ERROR: FILE MISSING: ATMGES_ENSMEAN = $ATMGES_ENSMEAN" - exit 1 -fi - - -export LEVS=$($NCDUMP -h $ATMGES_ENSMEAN | grep -i "pfull" | head -1 | awk -F" = " '{print $2}' | awk -F" " '{print $1}') # get LEVS -status=$? -[[ $status -ne 0 ]] && exit $status - - -# Guess Bias correction coefficients related to control -export GBIAS=${COMIN_GES_CTL}/${GPREFIX}abias -export GBIASPC=${COMIN_GES_CTL}/${GPREFIX}abias_pc -export GBIASAIR=${COMIN_GES_CTL}/${GPREFIX}abias_air -export GRADSTAT=${COMIN_GES_CTL}/${GPREFIX}radstat - - -# Use the selected observations from ensemble mean -export RUN_SELECT="NO" -export USE_SELECT="YES" -export SELECT_OBS="$COMOUT/${APREFIX}obsinput.ensmean" - - -# Get ENSBEG/ENSEND from ENSGRP and NMEM_EOMGGRP -export ENSEND=$((NMEM_EOMGGRP * ENSGRP)) -export ENSBEG=$((ENSEND - NMEM_EOMGGRP + 1)) - - -############################################################### -# Run relevant exglobal script -env -msg="HAS BEGUN on `hostname`" -postmsg "$jlogfile" "$msg" -$LOGSCRIPT - - -${ENKFINVOBSSH:-$SCRgsi/exglobal_enkf_innovate_obs_fv3gfs.sh.ecf} -status=$? -[[ $status -ne 0 ]] && exit $status - - -# Double check the status of members in ENSGRP -EOMGGRP=$ROTDIR/enkf${CDUMP}.$PDY/$cyc/eomg.grp${ENSGRP} -npass=0 -if [ -f $EOMGGRP ]; then - npass=$(grep "PASS" $EOMGGRP | wc -l) -fi -echo "$npass/$NMEM_EOMGGRP members successfull in eomg.grp$ENSGRP" -if [ $npass -ne $NMEM_EOMGGRP ]; then - echo "FATAL ERROR: Failed members in $ENSGRP, ABORT!" - cat $EOMGGRP - exit 99 -fi - - -############################################## -# End JOB SPECIFIC work -############################################## - -############################################## -# Final processing -############################################## -if [ -e "$pgmout" ] ; then - cat $pgmout -fi - - -msg="ENDED NORMALLY." -postmsg "$jlogfile" "$msg" - - -########################################## -# Remove the Temporary working directory -########################################## -cd $DATAROOT -[[ $KEEPDATA = "NO" ]] && rm -rf $DATA - -date -exit 0 diff --git a/modulefiles/modulefile.ProdGSI.cheyenne b/modulefiles/modulefile.ProdGSI.cheyenne index 589ee214d..211b681ad 100644 --- a/modulefiles/modulefile.ProdGSI.cheyenne +++ b/modulefiles/modulefile.ProdGSI.cheyenne @@ -1,7 +1,7 @@ #%Module###################################################################### ## Mark.Potts@noaa.gov ## NOAA/NWS/NCEP/EMC -## ProdGSI +## NOAA-EMC/GSI ##_____________________________________________________ module purge diff --git a/modulefiles/modulefile.ProdGSI.discover b/modulefiles/modulefile.ProdGSI.discover index 1d843b843..2c6d32b66 100644 --- a/modulefiles/modulefile.ProdGSI.discover +++ b/modulefiles/modulefile.ProdGSI.discover @@ -1,10 +1,10 @@ #%Module###################################################################### proc ModulesHelp { } { - puts stderr "Set environment veriables for GSI" + puts stderr "Set environment variables for NOAA-EMC/GSI" puts stderr "This module initializes the environment " - puts stderr "for building and testing GSI on NCCS Discover\n" + puts stderr "for building and testing NOAA-EMC/GSI on NCCS Discover\n" } -module-whatis "Initialize GSI build/test environment" +module-whatis "Initialize NOAA-EMC/GSI build/test environment" module load comp/intel-18.0.3.222 module load lib/mkl-18.0.3.222 diff --git a/modulefiles/modulefile.ProdGSI.gaea b/modulefiles/modulefile.ProdGSI.gaea index d71bafc74..15c823ab0 100644 --- a/modulefiles/modulefile.ProdGSI.gaea +++ b/modulefiles/modulefile.ProdGSI.gaea @@ -1,17 +1,13 @@ #%Module1.0 ###################################################################### -## Russ.Treadon@noaa.gov -## NOAA/NWS/NCEP/EMC -## GDAS_ENKF v6.2.3 +## NOAA-EMC/GSI ##_____________________________________________________ proc ModulesHelp { } { -puts stderr "Set environment veriables for GDAS_ENKF" +puts stderr "Set environment variables for NOAA-EMC/GSI" puts stderr "This module initializes the environment " puts stderr "for the Intel Compiler Suite $version\n" } -module-whatis " GDAS_ENKF whatis description" - -set ver v6.2.3 +module-whatis " NOAA-EMC/GSI whatis description" setenv COMP ftn setenv COMP_MP ftn diff --git a/modulefiles/modulefile.ProdGSI.hera b/modulefiles/modulefile.ProdGSI.hera index b2ac092ce..449f6fc8d 100644 --- a/modulefiles/modulefile.ProdGSI.hera +++ b/modulefiles/modulefile.ProdGSI.hera @@ -1,9 +1,6 @@ #%Module###################################################################### -## Russ.Treadon@noaa.gov -## NOAA/NWS/NCEP/EMC -## GDAS_ENKF v6.2.3 +## NOAA-EMC/GSI ##_____________________________________________________ -#set ver v6.2.3 set COMP ifort set COMP_MP mpfort @@ -17,13 +14,14 @@ set C_COMP_MP mpcc # Load compiler, mpi, cmake, and hdf5/netcdf module load intel/18.0.5.274 + # python -module use -a /contrib/modulefiles +module use -a /contrib/anaconda/modulefiles module load anaconda/2.3.0 module load impi/2018.0.4 -module load contrib +module use -a /contrib/cmake/modulefiles module load cmake/3.9.0 # Load libraries @@ -37,10 +35,12 @@ module load prod_util/1.1.0 module load sfcio/1.1.1 module load sigio/2.1.1 module load sp/2.0.3 -module load w3emc/2.3.1 -module load w3nco/2.0.7 -module load hdf5_parallel/1.10.6 -module load netcdf_parallel/4.7.4 +module load w3emc/2.4.0 +module load w3nco/2.2.0 + +module use /scratch1/NCEPDEV/nems/emc.nemspara/soft/modulefiles +module load hdf5_parallel/1.10.6.release +module load netcdf_parallel/4.7.4.release # Set environmental variables to allow correlated error to reproduce on Hera export MKL_NUM_THREADS=4 diff --git a/modulefiles/modulefile.ProdGSI.jet b/modulefiles/modulefile.ProdGSI.jet index c5ec8fbef..b6b3d647f 100644 --- a/modulefiles/modulefile.ProdGSI.jet +++ b/modulefiles/modulefile.ProdGSI.jet @@ -1,14 +1,12 @@ #%Module###################################################################### -## Russ.Treadon@noaa.gov -## NOAA/NWS/NCEP/EMC -## GDAS_ENKF v6.2.3 +## NOAA-EMC/GSI ##_____________________________________________________ #proc ModulesHelp { } { -#puts stderr "Set environment veriables for GSI build with CMake" +#puts stderr "Set environment variables for NOAA-EMC/GSI" #puts stderr "This module initializes the environment " #puts stderr "for the Intel Compiler Suite $version\n" #} -#module-whatis " GDAS_ENKF whatis description" +#module-whatis " NOAA-EMC/GSI whatis description" # # diff --git a/modulefiles/modulefile.ProdGSI.orion b/modulefiles/modulefile.ProdGSI.orion index db8a9f4c7..bd7741254 100644 --- a/modulefiles/modulefile.ProdGSI.orion +++ b/modulefiles/modulefile.ProdGSI.orion @@ -1,9 +1,6 @@ #%Module###################################################################### -## Russ.Treadon@noaa.gov -## NOAA/NWS/NCEP/EMC -## GDAS_ENKF v6.2.3 +## NOAA-EMC/GSI ##_____________________________________________________ -#set ver v6.2.3 set COMP ifort set COMP_MP mpfort @@ -27,18 +24,19 @@ module load python/3.7.5 # Load libraries module use /apps/contrib/NCEPLIBS/orion/modulefiles module load bacio/2.0.3 +module load bufr/11.3.0 module load crtm/2.3.0 -module load ip/3.1.0 -module load nemsio/2.3.0 +module load ip/3.0.2 +module load nemsio/2.2.4 module load prod_util/1.2.0 -module load sfcio/1.2.0 -module load sigio/2.2.0 -module load sp/2.1.0 -module load w3emc/2.5.0 -module load w3nco/2.1.0 -module load bufr/11.3.0 -module load netcdf_parallel/4.7.4 -module load hdf5_parallel/1.10.6 +module load sfcio/1.1.1 +module load sigio/2.1.1 +module load sp/2.0.3 +module load w3emc/2.4.0 +module load w3nco/2.0.7 + +module use /apps/contrib/NCEPLIBS/lib/modulefiles +module load netcdfp/4.7.4.release # Fix MKL threads for reproducible global_gsi.x with correlated obs error #export MKL_NUM_THREADS=4 diff --git a/modulefiles/modulefile.ProdGSI.s4 b/modulefiles/modulefile.ProdGSI.s4 index 3db2ec137..8d79798e5 100644 --- a/modulefiles/modulefile.ProdGSI.s4 +++ b/modulefiles/modulefile.ProdGSI.s4 @@ -1,9 +1,6 @@ #%Module###################################################################### -## Russ.Treadon@noaa.gov -## NOAA/NWS/NCEP/EMC -## GDAS_ENKF v6.2.3 +## NOAA-EMC/GSI ##_____________________________________________________ -#set ver v6.2.3 set COMP ifort set COMP_MP mpfort diff --git a/modulefiles/modulefile.ProdGSI.wcoss b/modulefiles/modulefile.ProdGSI.wcoss deleted file mode 100644 index 88467187c..000000000 --- a/modulefiles/modulefile.ProdGSI.wcoss +++ /dev/null @@ -1,51 +0,0 @@ -#%Module###################################################################### -## Russ.Treadon@noaa.gov -## NOAA/NWS/NCEP/EMC -## GDAS_ENKF v6.2.3 -##_____________________________________________________ -proc ModulesHelp { } { -puts stderr "Set environment veriables for GDAS_ENKF" -puts stderr "This module initializes the environment " -puts stderr "for the Intel Compiler Suite $version\n" -} -module-whatis " GDAS_ENKF whatis description" - -set ver v6.2.3 - -setenv COMP ifort -setenv COMP_MP mpfort -setenv COMP_MPI mpiifort - -setenv C_COMP icc -setenv C_COMP_MP mpcc - -setenv FFLAGS_COM "-fp-model source" -setenv LDFLAGS_COM "-mkl" - -set WRF_SHARED_VER v1.1.0 -set WRF_SHARED_ROOT /nwprod/sorc/wrf_shared.fd -setenv WRF_SHARED_PATH ${WRF_SHARED_ROOT} - -# Known conflicts - -# Loading Intel Compiler Suite -module load ics/15.0.3 - -# Loading ibmpe -module load ibmpe -module load lsf - -# Loading nceplibs modules -module load NetCDF/4.2 -module load bufr/v11.0.0 -module load nemsio/v2.2.1 -module load sfcio/v1.0.0 -module load sigio/v2.1.0 -module load sp/v2.0.2 -module load w3nco/v2.0.6 -module load w3emc/v2.2.0 -module load crtm/v2.2.3 -module load bacio/v2.0.2 - -module use /usrx/local/dev/modulefiles -module load cmake diff --git a/modulefiles/modulefile.ProdGSI.wcoss_c b/modulefiles/modulefile.ProdGSI.wcoss_c index 8f901f02b..f175a7bc8 100644 --- a/modulefiles/modulefile.ProdGSI.wcoss_c +++ b/modulefiles/modulefile.ProdGSI.wcoss_c @@ -1,16 +1,12 @@ #%Module###################################################################### -## Russ.Treadon@noaa.gov -## NOAA/NWS/NCEP/EMC -## GDAS_ENKF v6.2.3 +## NOAA-EMC/GSI ##_____________________________________________________ proc ModulesHelp { } { -puts stderr "Set environment veriables for GDAS_ENKF" +puts stderr "Set environment variables for NOAA-EMC/GSI" puts stderr "This module initializes the environment " puts stderr "for the Intel Compiler Suite $version\n" } -module-whatis " GDAS_ENKF whatis description" - -set ver v6.2.3 +module-whatis " NOAA-EMC/GSI whatis description" setenv COMP ftn setenv COMP_MP ftn @@ -32,10 +28,10 @@ setenv WRF_SHARED_PATH ${WRF_SHARED_ROOT}.${WRF_SHARED_VER}-${COMPILER} # Loading ncep environment module load ncep/1.0 -module load prod_util/1.0.29 +module load prod_util/1.1.2 # Loading Intel Compiler Suite -module load PrgEnv-intel/5.2.56 +module load PrgEnv-intel/5.2.82 module unload intel/15.0.3.187 module load intel/18.1.163 @@ -43,31 +39,23 @@ module load intel/18.1.163 module load craype-sandybridge module load cray-mpich/7.2.0 -module use /usrx/local/dev/modulefiles module load cmake/3.6.2 -module unuse /usrx/local/dev/modulefiles # Loading netcdf modules -module use /usrx/local/dev/modulefiles -module load NetCDF-intel-sandybridge/4.7.4 module load HDF5-parallel-intel-sandybridge/1.10.6 +module load NetCDF-intel-sandybridge/4.7.4 # Loading nceplibs modules -module use /gpfs/hps/nco/ops/nwprod/lib/modulefiles -module load bufr-intel/11.0.1 -module load ip-intel/3.0.0 -module load nemsio-intel/2.2.2 +module load bufr-intel/11.3.0 +module load ip-intel/3.0.2 +module load nemsio-intel/2.2.4 module load sfcio-intel/1.0.0 module load sigio-intel/2.1.0 -module load sp-intel/2.0.2 -module load w3nco-intel/2.0.6 -module load w3emc-intel/2.2.0 - -module use /usrx/local/nceplibs/modulefiles -module load bacio-intel/2.0.2 - -module use -a /usrx/local/nceplibs/NCEPLIBS/modulefiles -module load crtm/2.3.0 +module load sp-intel/2.0.3 +module load w3nco-intel/2.2.0 +module load w3emc-intel/2.4.0 +module load bacio-intel/2.0.3 +module load crtm-intel/2.3.0 # Loading python module load python/3.6.3 diff --git a/modulefiles/modulefile.ProdGSI.wcoss_d b/modulefiles/modulefile.ProdGSI.wcoss_d index 69fe0a410..bd2ce7009 100644 --- a/modulefiles/modulefile.ProdGSI.wcoss_d +++ b/modulefiles/modulefile.ProdGSI.wcoss_d @@ -1,16 +1,12 @@ #%Module###################################################################### -# Russ.Treadon@noaa.gov -# NOAA/NWS/NCEP/EMC -# GDAS_ENKF v6.2.3 +# NOAA-EMC/GSI #_____________________________________________________ #proc ModulesHelp { } { -#puts stderr "Set environment veriables for GDAS_ENKF" +#puts stderr "Set environment variables for NOAA-EMC/GSI" #puts stderr "This module initializes the environment " #puts stderr "for the Intel Compiler Suite $version\n" ##} -#module-whatis " GDAS_ENKF whatis description" - -#set ver v6.2.3 +#module-whatis " NOAA-EMC/GSI whatis description" set COMP ifort set COMP_MPI mpiifort @@ -19,38 +15,37 @@ set C_COMP icc # Known conflicts -# Loading pe environment +# Load pe environment module load lsf/10.1 -# Loading Intel Compiler Suite +# Load Intel Compiler Suite module load ips/18.0.1.163 -# Loading intel mpi +# Load Intel mpi module load impi/18.0.1 -# Loading production utilities (ndate) -module load prod_util/1.1.0 +# Load production utilities +module load prod_util/1.1.5 -# Loading nceplibs modules +# Load nceplibs modules module load bufr/11.3.0 -module load ip/3.0.1 -module load nemsio/2.2.3 +module load ip/3.0.2 +module load nemsio/2.2.4 module load sfcio/1.0.0 module load sigio/2.1.0 -module load sp/2.0.2 -module load w3nco/2.0.6 -module load w3emc/2.3.0 -module load bacio/2.0.2 +module load sp/2.0.3 +module load w3nco/2.2.0 +module load w3emc/2.4.0 +module load bacio/2.0.3 +module load crtm/2.3.0 -# Loading cmake +# Load cmake module load cmake/3.10.0 -# Loading python +# Load python module load python/3.6.3 -# Load modules from nceplibs (until installed by NCO) -module use -a /usrx/local/nceplibs/dev/NCEPLIBS/modulefiles -module load crtm/2.3.0 -module load hdf5_parallel/1.10.6 -module load netcdf_parallel/4.7.4 +# Load netcdf and hdf +module load NetCDF-parallel/4.7.4 +module load HDF5-parallel/1.10.6 diff --git a/regression/regression_namelists_db.sh b/regression/regression_namelists_db.sh index 2b0d3fb39..9eed1bbd5 100755 --- a/regression/regression_namelists_db.sh +++ b/regression/regression_namelists_db.sh @@ -288,8 +288,6 @@ OBS_INPUT:: amsuabufr amsua n19 amsua_n19 0.0 1 1 mhsbufr mhs n19 mhs_n19 0.0 1 1 tcvitl tcp null tcp 0.0 0 0 - modisbufr modis aqua modis_aqua 0.0 1 0 - modisbufr modis terra modis_terra 0.0 1 0 mlsbufr mls30 aura mls30_aura 1.0 0 0 seviribufr seviri m08 seviri_m08 0.0 5 0 seviribufr seviri m09 seviri_m09 0.0 5 0 diff --git a/regression/regression_param.sh b/regression/regression_param.sh index 37f54cda2..488b4f469 100755 --- a/regression/regression_param.sh +++ b/regression/regression_param.sh @@ -647,8 +647,8 @@ case $regtest in topts[1]="0:15:00" ; popts[1]="36/4/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" topts[2]="0:15:00" ; popts[2]="72/8/" ; ropts[2]="1024/2" elif [[ "$machine" = "WCOSS_D" ]]; then - topts[1]="0:15:00" ; popts[1]="28/2/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="28/4/" ; ropts[2]="/2" + topts[1]="0:30:00" ; popts[1]="28/2/" ; ropts[1]="/1" + topts[2]="0:30:00" ; popts[2]="28/4/" ; ropts[2]="/2" elif [[ "$machine" = "Discover" ]]; then topts[1]="0:30:00" ; popts[1]="20/4" ; ropts[1]="/1" topts[2]="0:30:00" ; popts[2]="40/2" ; ropts[2]="/2" diff --git a/scripts/exgdas_atmos_chgres_forenkf.sh b/scripts/exgdas_atmos_chgres_forenkf.sh new file mode 100755 index 000000000..bb131c427 --- /dev/null +++ b/scripts/exgdas_atmos_chgres_forenkf.sh @@ -0,0 +1,217 @@ +#!/bin/ksh +################################################################################ +#### UNIX Script Documentation Block +# . . +# Script name: exgdas_atmos_chgres_forenkf.sh +# Script description: Runs chgres on full-resolution forecast for EnKF recentering +# +# Author: Cory Martin Org: NCEP/EMC Date: 2020-06-08 +# +# Abstract: This script runs chgres on full-resolution forecast for later +# use in the EnKF recentering step +# +# $Id$ +# +# Attributes: +# Language: POSIX shell +# Machine: WCOSS-Dell / Hera +# +################################################################################ + +# Set environment. +export VERBOSE=${VERBOSE:-"YES"} +if [ $VERBOSE = "YES" ]; then + echo $(date) EXECUTING $0 $* >&2 + set -x +fi + +# Directories. +pwd=$(pwd) +export FIXgsm=${FIXgsm:-$HOMEgfs/fix/fix_am} + +# Base variables +CDATE=${CDATE:-"2001010100"} +CDUMP=${CDUMP:-"gdas"} +GDUMP=${GDUMP:-"gdas"} + +# Derived base variables +GDATE=$($NDATE -$assim_freq $CDATE) +BDATE=$($NDATE -3 $CDATE) +PDY=$(echo $CDATE | cut -c1-8) +cyc=$(echo $CDATE | cut -c9-10) +bPDY=$(echo $BDATE | cut -c1-8) +bcyc=$(echo $BDATE | cut -c9-10) + +# Utilities +export NCP=${NCP:-"/bin/cp"} +export NMV=${NMV:-"/bin/mv"} +export NLN=${NLN:-"/bin/ln -sf"} +export CHGRP_CMD=${CHGRP_CMD:-"chgrp ${group_name:-rstprod}"} +export NCLEN=${NCLEN:-$HOMEgfs/ush/getncdimlen} +export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} + +# IAU +DOIAU=${DOIAU:-"NO"} +export IAUFHRS=${IAUFHRS:-"6"} + +# Dependent Scripts and Executables +export APRUN_CHGRES=${APRUN_CHGRES:-${APRUN:-""}} +export CHGRESNCEXEC=${CHGRESNCEXEC:-$HOMEgfs/exec/enkf_chgres_recenter_nc.x} +export NTHREADS_CHGRES=${NTHREADS_CHGRES:-1} +APRUNCFP=${APRUNCFP:-""} + +# OPS flags +RUN=${RUN:-""} +SENDECF=${SENDECF:-"NO"} +SENDDBN=${SENDDBN:-"NO"} + +# level info file +SIGLEVEL=${SIGLEVEL:-${FIXgsm}/global_hyblev.l${LEVS}.txt} + +# forecast files +APREFIX=${APREFIX:-""} +ASUFFIX=${ASUFFIX:-$SUFFIX} +# at full resolution +ATMF03=${ATMF03:-${COMOUT}/${APREFIX}atmf003${ASUFFIX}} +ATMF04=${ATMF04:-${COMOUT}/${APREFIX}atmf004${ASUFFIX}} +ATMF05=${ATMF05:-${COMOUT}/${APREFIX}atmf005${ASUFFIX}} +ATMF06=${ATMF06:-${COMOUT}/${APREFIX}atmf006${ASUFFIX}} +ATMF07=${ATMF07:-${COMOUT}/${APREFIX}atmf007${ASUFFIX}} +ATMF08=${ATMF08:-${COMOUT}/${APREFIX}atmf008${ASUFFIX}} +ATMF09=${ATMF09:-${COMOUT}/${APREFIX}atmf009${ASUFFIX}} +# at ensemble resolution +ATMF03ENS=${ATMF03ENS:-${COMOUT}/${APREFIX}atmf003.ensres${ASUFFIX}} +ATMF04ENS=${ATMF04ENS:-${COMOUT}/${APREFIX}atmf004.ensres${ASUFFIX}} +ATMF05ENS=${ATMF05ENS:-${COMOUT}/${APREFIX}atmf005.ensres${ASUFFIX}} +ATMF06ENS=${ATMF06ENS:-${COMOUT}/${APREFIX}atmf006.ensres${ASUFFIX}} +ATMF07ENS=${ATMF07ENS:-${COMOUT}/${APREFIX}atmf007.ensres${ASUFFIX}} +ATMF08ENS=${ATMF08ENS:-${COMOUT}/${APREFIX}atmf008.ensres${ASUFFIX}} +ATMF09ENS=${ATMF09ENS:-${COMOUT}/${APREFIX}atmf009.ensres${ASUFFIX}} +ATMFCST_ENSRES=${ATMFCST_ENSRES:-${COMOUT_ENS}/mem001/${APREFIX}atmf006${ASUFFIX}} + +# Set script / GSI control parameters +DOHYBVAR=${DOHYBVAR:-"NO"} +lrun_subdirs=${lrun_subdirs:-".true."} +USE_CFP=${USE_CFP:-"NO"} +CFP_MP=${CFP_MP:-"NO"} +nm="" +if [ $CFP_MP = "YES" ]; then + nm=0 +fi +if [ $DOHYBVAR = "YES" ]; then + l_hyb_ens=.true. + export l4densvar=${l4densvar:-".false."} + export lwrite4danl=${lwrite4danl:-".false."} +else + echo "DOHYBVAR != YES, this script will exit without regridding deterministic forecast" + exit 0 +fi + +################################################################################ +################################################################################ +# Preprocessing +mkdata=NO +if [ ! -d $DATA ]; then + mkdata=YES + mkdir -p $DATA +fi + +cd $DATA || exit 99 + +############################################################## +# get resolution information +LONB_ENKF=${LONB_ENKF:-$($NCLEN $ATMFCST_ENSRES grid_xt)} # get LONB_ENKF +LATB_ENKF=${LATB_ENKF:-$($NCLEN $ATMFCST_ENSRES grid_yt)} # get LATB_ENFK +LEVS_ENKF=${LEVS_ENKF:-$($NCLEN $ATMFCST_ENSRES pfull)} # get LATB_ENFK + +############################################################## +# If analysis increment is written by GSI, regrid forecasts to increment resolution +if [ $DO_CALC_ANALYSIS == "YES" ]; then + $NLN $ATMF06 fcst.06 + $NLN $ATMF06ENS fcst.ensres.06 + $NLN $ATMFCST_ENSRES atmens_fcst + if [ $DOHYBVAR = "YES" -a $l4densvar = ".true." -a $lwrite4danl = ".true." ]; then + $NLN $ATMF03 fcst.03 + $NLN $ATMF03ENS fcst.ensres.03 + $NLN $ATMF04 fcst.04 + $NLN $ATMF04ENS fcst.ensres.04 + $NLN $ATMF05 fcst.05 + $NLN $ATMF05ENS fcst.ensres.05 + $NLN $ATMF07 fcst.07 + $NLN $ATMF07ENS fcst.ensres.07 + $NLN $ATMF08 fcst.08 + $NLN $ATMF08ENS fcst.ensres.08 + $NLN $ATMF09 fcst.09 + $NLN $ATMF09ENS fcst.ensres.09 + fi + export OMP_NUM_THREADS=$NTHREADS_CHGRES + SIGLEVEL=${SIGLEVEL:-${FIXgsm}/global_hyblev.l${LEVS_ENKF}.txt} + + if [ $USE_CFP = "YES" ]; then + [[ -f $DATA/mp_chgres.sh ]] && rm $DATA/mp_chgres.sh + fi + + nfhrs=`echo $IAUFHRS_ENKF | sed 's/,/ /g'` + for FHR in $nfhrs; do + echo "Regridding deterministic forecast for forecast hour $FHR" + rm -f chgres_nc_gauss0$FHR.nml +cat > chgres_nc_gauss0$FHR.nml << EOF +&chgres_setup +i_output=$LONB_ENKF +j_output=$LATB_ENKF +input_file="fcst.0$FHR" +output_file="fcst.ensres.0$FHR" +terrain_file="atmens_fcst" +ref_file="atmens_fcst" +/ +EOF + if [ $USE_CFP = "YES" ]; then + echo "$nm $APRUN_CHGRES $CHGRESNCEXEC chgres_nc_gauss0$FHR.nml" | tee -a $DATA/mp_chgres.sh + if [ ${CFP_MP:-"NO"} = "YES" ]; then + nm=$((nm+1)) + fi + else + + export pgm=$CHGRESNCEXEC + . prep_step + + $APRUN_CHGRES $CHGRESNCEXEC chgres_nc_gauss0$FHR.nml + rc=$? + export ERR=$rc + export err=$ERR + $ERRSCRIPT || exit 1 + fi + done + + if [ $USE_CFP = "YES" ]; then + chmod 755 $DATA/mp_chgres.sh + ncmd=$(cat $DATA/mp_chgres.sh | wc -l) + if [ $ncmd -gt 0 ]; then + ncmd_max=$((ncmd < npe_node_max ? ncmd : npe_node_max)) + APRUNCFP_CHGRES=$(eval echo $APRUNCFP) + + export pgm=$CHGRESNCEXEC + . prep_step + + $APRUNCFP_CHGRES $DATA/mp_chgres.sh + export ERR=$? + export err=$ERR + $ERRSCRIPT || exit 3 + fi + fi + +else + echo "DO_CALC_ANALYSIS != YES, doing nothing" +fi + + +################################################################################ +# Postprocessing +cd $pwd +[[ $mkdata = "YES" ]] && rm -rf $DATA + +set +x +if [ $VERBOSE = "YES" ]; then + echo $(date) EXITING $0 with return code $err >&2 +fi +exit $err diff --git a/scripts/exglobal_enkf_recenter_fv3gfs.sh.ecf b/scripts/exgdas_enkf_ecen.sh similarity index 88% rename from scripts/exglobal_enkf_recenter_fv3gfs.sh.ecf rename to scripts/exgdas_enkf_ecen.sh index 707fcc314..645baa3f7 100755 --- a/scripts/exglobal_enkf_recenter_fv3gfs.sh.ecf +++ b/scripts/exgdas_enkf_ecen.sh @@ -2,7 +2,7 @@ ################################################################################ #### UNIX Script Documentation Block # . . -# Script name: exglobal_enkf_recenter_fv3gfs.sh.ecf +# Script name: exgdas_enkf_ecen.sh # Script description: recenter ensemble around hi-res deterministic analysis # # Author: Rahul Mahajan Org: NCEP/EMC Date: 2017-03-02 @@ -26,22 +26,10 @@ fi # Directories. pwd=$(pwd) -export NWPROD=${NWPROD:-$pwd} -export HOMEgfs=${HOMEgfs:-$NWPROD} -HOMEgsi=${HOMEgsi:-$NWPROD} -export DATA=${DATA:-$pwd} -COMIN=${COMIN:-$pwd} -COMIN_ENS=${COMIN_ENS:-$COMIN} -COMIN_OBS=${COMIN_OBS:-$COMIN} -COMIN_GES=${COMIN_GES:-$COMIN} -COMIN_GES_ENS=${COMIN_GES_ENS:-$COMIN_ENS} -COMIN_GES_OBS=${COMIN_GES_OBS:-$COMIN_GES} -COMOUT=${COMOUT:-$COMIN} -COMOUT_ENS=${COMOUT_ENS:-$COMIN_ENS} +# Base variables CDATE=${CDATE:-"2010010100"} DONST=${DONST:-"NO"} - export CASE=${CASE:-384} ntiles=${ntiles:-6} @@ -55,11 +43,11 @@ NCLEN=${NCLEN:-$HOMEgfs/ush/getncdimlen} # Scripts # Executables. -GETATMENSMEANEXEC=${GETATMENSMEANEXEC:-$HOMEgsi/exec/getsigensmeanp_smooth.x} -GETSFCENSMEANEXEC=${GETSFCENSMEANEXEC:-$HOMEgsi/exec/getsfcensmeanp.x} -RECENATMEXEC=${RECENATMEXEC:-$HOMEgsi/exec/recentersigp.x} -CALCINCNEMSEXEC=${CALCINCNEMSEXEC:-$HOMEgsi/exec/calc_increment_ens.x} -CALCINCNCEXEC=${CALCINCEXEC:-$HOMEgsi/exec/calc_increment_ens_ncio.x} +GETATMENSMEANEXEC=${GETATMENSMEANEXEC:-$HOMEgfs/exec/getsigensmeanp_smooth.x} +GETSFCENSMEANEXEC=${GETSFCENSMEANEXEC:-$HOMEgfs/exec/getsfcensmeanp.x} +RECENATMEXEC=${RECENATMEXEC:-$HOMEgfs/exec/recentersigp.x} +CALCINCNEMSEXEC=${CALCINCNEMSEXEC:-$HOMEgfs/exec/calc_increment_ens.x} +CALCINCNCEXEC=${CALCINCEXEC:-$HOMEgfs/exec/calc_increment_ens_ncio.x} # Files. OPREFIX=${OPREFIX:-""} @@ -83,8 +71,8 @@ DO_CALC_INCREMENT=${DO_CALC_INCREMENT:-"NO"} # global_chgres stuff -CHGRESNEMS=${CHGRESNEMS:-$HOMEgfs/exec/chgres_recenter.exe} -CHGRESNC=${CHGRESNC:-$HOMEgfs/exec/chgres_recenter_ncio.exe} +CHGRESNEMS=${CHGRESNEMS:-$HOMEgfs/exec/enkf_chgres_recenter.x} +CHGRESNC=${CHGRESNC:-$HOMEgfs/exec/enkf_chgres_recenter_nc.x} NTHREADS_CHGRES=${NTHREADS_CHGRES:-24} APRUN_CHGRES=${APRUN_CHGRES:-""} @@ -171,6 +159,8 @@ if [ $DO_CALC_INCREMENT = "YES" ]; then ATMANLMEANNAME="atmanl_ensmean" export OMP_NUM_THREADS=$NTHREADS_ECEN + export pgm=$GETATMENSMEANEXEC + . prep_step $NCP $GETATMENSMEANEXEC $DATA $APRUN_ECEN ${DATA}/$(basename $GETATMENSMEANEXEC) $DATAPATH $ATMANLMEANNAME $ATMANLNAME $NMEM_ENKF @@ -193,6 +183,8 @@ else ATMINCMEANNAME="atminc_ensmean" export OMP_NUM_THREADS=$NTHREADS_ECEN + export pgm=$GETATMENSMEANEXEC + . prep_step $NCP $GETATMENSMEANEXEC $DATA $APRUN_ECEN ${DATA}/$(basename $GETATMENSMEANEXEC) $DATAPATH $ATMINCMEANNAME $ATMINCNAME $NMEM_ENKF @@ -211,6 +203,8 @@ else ATMGESMEANNAME="atmges_ensmean" export OMP_NUM_THREADS=$NTHREADS_ECEN + export pgm=$GETATMENSMEANEXEC + . prep_step $NCP $GETATMENSMEANEXEC $DATA $APRUN_ECEN ${DATA}/$(basename $GETATMENSMEANEXEC) $DATAPATH $ATMGESMEANNAME $ATMGESNAME $NMEM_ENKF @@ -277,7 +271,7 @@ if [ $RECENTER_ENKF = "YES" ]; then export OMP_NUM_THREADS=$NTHREADS_CHGRES - rm -f $chgresnml + [[ -f $chgresnml ]] && rm -f $chgresnml cat > $chgresnml << EOF &${nmltitle}_setup i_output=$LONB_ENKF @@ -308,6 +302,8 @@ EOF FILENAMEOUT="ratmanl" export OMP_NUM_THREADS=$NTHREADS_ECEN + export pgm=$RECENATMEXEC + . prep_step $NCP $RECENATMEXEC $DATA $APRUN_ECEN ${DATA}/$(basename $RECENATMEXEC) $FILENAMEIN $FILENAME_MEANIN $FILENAME_MEANOUT $FILENAMEOUT $NMEM_ENKF @@ -317,13 +313,6 @@ EOF export err=$ERR $ERRSCRIPT || exit 2 - # Optionally alert recentered files - if [ ${SENDDBN:-"NO"} = "YES" ]; then - for imem in $(seq 1 $NMEM_ENKF); do - memchar="mem"$(printf %03i $imem) - $DBNROOT/bin/dbn_alert MODEL GFS_ENKF $job $COMOUT_ENS/$memchar/${APREFIX}ratmanl$ASUFFIX - done - fi else ################################################################################ # Recenter ensemble member atmospheric increments about hires analysis @@ -338,7 +327,7 @@ EOF # make the small namelist file for incvars_to_zero - rm recenter.nml + [[ -f recenter.nml ]] && rm recenter.nml cat > recenter.nml << EOF &recenter incvars_to_zero = $INCREMENTS_TO_ZERO @@ -346,6 +335,9 @@ EOF EOF cat recenter.nml + export pgm=$RECENATMEXEC + . prep_step + $NCP $RECENATMEXEC $DATA $APRUN_ECEN ${DATA}/$(basename $RECENATMEXEC) $FILENAMEIN $FILENAME_INCMEANIN $FILENAME_GSIDET $FILENAMEOUT $NMEM_ENKF $FILENAME_GESMEANIN rc=$? @@ -354,13 +346,6 @@ cat recenter.nml export err=$ERR $ERRSCRIPT || exit 2 - # Optionally alert recentered files - if [ ${SENDDBN:-"NO"} = "YES" ]; then - for imem in $(seq 1 $NMEM_ENKF); do - memchar="mem"$(printf %03i $imem) - $DBNROOT/bin/dbn_alert MODEL GFS_ENKF $job $COMOUT_ENS/$memchar/${APREFIX}ratminc$ASUFFIX - done - fi fi fi @@ -375,11 +360,14 @@ if [ $DO_CALC_INCREMENT = "YES" ]; then export OMP_NUM_THREADS=$NTHREADS_CALCINC if [ ${SUFFIX} = ".nc" ]; then - CALCINCEXEC=$CALCINCNCEXEC else CALCINCEXEC=$CALCINCNEMSEXEC fi + + export pgm=$CALCINCEXEC + . prep_step + $NCP $CALCINCEXEC $DATA rm calc_increment.nml diff --git a/scripts/exglobal_enkf_fcst_fv3gfs.sh.ecf b/scripts/exgdas_enkf_fcst.sh similarity index 93% rename from scripts/exglobal_enkf_fcst_fv3gfs.sh.ecf rename to scripts/exgdas_enkf_fcst.sh index 11b7a0a5b..45da2d4e7 100755 --- a/scripts/exglobal_enkf_fcst_fv3gfs.sh.ecf +++ b/scripts/exgdas_enkf_fcst.sh @@ -2,7 +2,7 @@ ################################################################################ #### UNIX Script Documentation Block # . . -# Script name: exglobal_enkf_fcst_fv3gfs.sh.ecf +# Script name: exgdas_enkf_fcst.sh # Script description: Run ensemble forecasts # # Author: Rahul Mahajan Org: NCEP/EMC Date: 2017-03-02 @@ -27,15 +27,8 @@ fi # Directories. pwd=$(pwd) -export NWPROD=${NWPROD:-$pwd} -export HOMEgfs=${HOMEgfs:-$NWPROD} export FIX_DIR=${FIX_DIR:-$HOMEgfs/fix} export FIX_AM=${FIX_AM:-$FIX_DIR/fix_am} -export DATA=${DATA:-$pwd/enkf_fcst.$$} -export COMIN=${COMIN:-$pwd} -export COMOUT=${COMOUT:-$COMIN} - -GSUFFIX=${GSUFFIX:-$SUFFIX} # Utilities export NCP=${NCP:-"/bin/cp -p"} @@ -45,7 +38,7 @@ export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} export NDATE=${NDATE:-/$NWPROD/util/exec/ndate} # Scripts. -FORECASTSH=${FORECASTSH:-$HOMEgfs/scripts/exglobal_fcst_nemsfv3gfs.sh.ecf} +FORECASTSH=${FORECASTSH:-$HOMEgfs/scripts/exglobal_forecast.sh} # Enemble group, begin and end ENSGRP=${ENSGRP:-1} @@ -74,6 +67,7 @@ export PREFIX_ATMINC=${PREFIX_ATMINC:-""} # Ops related stuff SENDECF=${SENDECF:-"NO"} SENDDBN=${SENDDBN:-"NO"} +GSUFFIX=${GSUFFIX:-$SUFFIX} ################################################################################ # Preprocessing @@ -196,7 +190,7 @@ for imem in $(seq $ENSBEG $ENSEND); do while [ $fhr -le $FHMAX ]; do FH3=$(printf %03i $fhr) if [ $(expr $fhr % 3) -eq 0 ]; then - $DBNROOT/bin/dbn_alert MODEL GFS_ENKF $job $COMOUT/$memchar/${CDUMP}.t${cyc}z.sfcf${FH3}.${GSUFFIX} + $DBNROOT/bin/dbn_alert MODEL GFS_ENKF $job $COMOUT/$memchar/${CDUMP}.t${cyc}z.sfcf${FH3}${GSUFFIX} fi fhr=$((fhr+FHOUT)) done @@ -204,14 +198,21 @@ for imem in $(seq $ENSBEG $ENSEND); do cd $DATATOP - $NCP $EFCSGRP log_old - rm log log_new + if [ -s $EFCSGRP ]; then + $NCP $EFCSGRP log_old + fi + [[ -f log ]] && rm log + [[ -f log_new ]] && rm log_new if [ $ra -ne 0 ]; then echo "MEMBER $cmem : FAIL" > log else echo "MEMBER $cmem : PASS" > log fi - cat log_old log > log_new + if [ -s log_old ] ; then + cat log_old log > log_new + else + cat log > log_new + fi $NCP log_new $EFCSGRP done @@ -221,7 +222,7 @@ done cd $DATATOP echo "Status of ensemble members in group $ENSGRP:" cat $EFCSGRP -rm ${EFCSGRP}.fail +[[ -f ${EFCSGRP}.fail ]] && rm ${EFCSGRP}.fail ################################################################################ # If any members failed, error out diff --git a/scripts/exglobal_enkf_post_fv3gfs.sh.ecf b/scripts/exgdas_enkf_post.sh similarity index 87% rename from scripts/exglobal_enkf_post_fv3gfs.sh.ecf rename to scripts/exgdas_enkf_post.sh index b46f46ff8..32e709dc2 100755 --- a/scripts/exglobal_enkf_post_fv3gfs.sh.ecf +++ b/scripts/exgdas_enkf_post.sh @@ -2,7 +2,7 @@ ################################################################################ #### UNIX Script Documentation Block # . . -# Script name: exglobal_enkf_post_fv3gfs.sh.ecf +# Script name: exgdas_enkf_post.sh # Script description: Global ensemble forecast post processing # # Author: Rahul Mahajan Org: NCEP/EMC Date: 2017-03-02 @@ -26,12 +26,6 @@ fi # Directories. pwd=$(pwd) -NWPROD=${NWPROD:-$pwd} -HOMEgsi=${HOMEgsi:-$NWPROD} -FIXgsi=${FIXgsi:-$HOMEgsi/fix} -DATA=${DATA:-$pwd} -COMIN=${COMIN:-$pwd} -COMOUT=${COMOUT:-$COMIN} # Utilities ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} @@ -49,8 +43,8 @@ LEVS=${LEVS:-64} HYBENSMOOTH=${HYBENSMOOTH:-$FIXgsi/global_hybens_smoothinfo.l${LEVS}.txt} # Executables. -GETATMENSMEANEXEC=${GETATMENSMEANEXEC:-$HOMEgsi/exec/getsigensmeanp_smooth.x} -GETSFCENSMEANEXEC=${GETSFCENSMEANEXEC:-$HOMEgsi/exec/getsfcensmeanp.x} +GETATMENSMEANEXEC=${GETATMENSMEANEXEC:-$HOMEgfs/exec/getsigensmeanp_smooth.x} +GETSFCENSMEANEXEC=${GETSFCENSMEANEXEC:-$HOMEgfs/exec/getsfcensmeanp.x} # Other variables. PREFIX=${PREFIX:-""} @@ -109,15 +103,22 @@ done ################################################################################ # Generate ensemble mean surface and atmospheric files -rm ./hybens_smoothinfo [[ $SMOOTH_ENKF = "YES" ]] && $NCP $HYBENSMOOTH ./hybens_smoothinfo rc=0 for fhr in $(seq $FHMIN $FHOUT $FHMAX); do fhrchar=$(printf %03i $fhr) + + export pgm=$GETSFCENSMEANEXEC + . prep_step + $APRUN_EPOS ${DATA}/$(basename $GETSFCENSMEANEXEC) ./ sfcf${fhrchar}.ensmean sfcf${fhrchar} $NMEM_ENKF ra=$? ((rc+=ra)) + + export_pgm=$GETATMENSMEANEXEC + . prep_step + if [ $ENKF_SPREAD = "YES" ]; then $APRUN_EPOS ${DATA}/$(basename $GETATMENSMEANEXEC) ./ atmf${fhrchar}.ensmean atmf${fhrchar} $NMEM_ENKF atmf${fhrchar}.ensspread else @@ -159,15 +160,6 @@ if [ $SENDDBN = "YES" ]; then fi done -# Maintain gfs.v14 dbn_alerts of 6 and 9 hour EnKF forecasts - if [ $FHMIN -eq 6 -o $FHMIN -eq 9 ]; then - fhrchar=$(printf %03i $FHMIN) - for imem in $(seq 1 $NMEM_ENKF); do - memchar="mem"$(printf %03i $imem) - $DBNROOT/bin/dbn_alert MODEL GFS_ENKF $job $COMOUT/$memchar/${PREFIX}atmf${fhrchar}${ENKF_SUFFIX}${SUFFIX} - done - fi - fi ################################################################################ diff --git a/scripts/exglobal_innovate_obs_fv3gfs.sh.ecf b/scripts/exgdas_enkf_select_obs.sh similarity index 92% rename from scripts/exglobal_innovate_obs_fv3gfs.sh.ecf rename to scripts/exgdas_enkf_select_obs.sh index e7e888c38..5298398e4 100755 --- a/scripts/exglobal_innovate_obs_fv3gfs.sh.ecf +++ b/scripts/exgdas_enkf_select_obs.sh @@ -2,7 +2,7 @@ ################################################################################ #### UNIX Script Documentation Block # . . -# Script name: exglobal_innovate_obs_fv3gfs.sh.ecf +# Script name: exgdas_enkf_select_obs.sh # Script description: Compute global_gsi innovations # # Author: Rahul Mahajan Org: NCEP/EMC Date: 2017-03-02 @@ -26,19 +26,13 @@ fi # Directories. pwd=$(pwd) -export NWPROD=${NWPROD:-$pwd} -export HOMEgsi=${HOMEgsi:-$NWPROD} -export DATA=${DATA:-$pwd/innovate_obs.$$} -export COMIN=${COMIN:-$pwd} -export COMIN_GES=${COMIN_GES:-$COMIN} -export COMOUT=${COMOUT:-$COMIN} # Utilities export NLN=${NLN:-"/bin/ln -sf"} export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} # Scripts. -ANALYSISSH=${ANALYSISSH:-$HOMEgsi/scripts/exglobal_analysis_fv3gfs.sh.ecf} +ANALYSISSH=${ANALYSISSH:-$HOMEgfs/scripts/exglobal_atmos_analysis.sh} # Prefix and Suffix Variables. export APREFIX=${APREFIX:-""} diff --git a/scripts/exglobal_enkf_surface_fv3gfs.sh.ecf b/scripts/exgdas_enkf_sfc.sh similarity index 93% rename from scripts/exglobal_enkf_surface_fv3gfs.sh.ecf rename to scripts/exgdas_enkf_sfc.sh index f4dd0a1e1..f5ff74a82 100755 --- a/scripts/exglobal_enkf_surface_fv3gfs.sh.ecf +++ b/scripts/exgdas_enkf_sfc.sh @@ -2,7 +2,7 @@ ################################################################################ #### UNIX Script Documentation Block # . . -# Script name: exglobal_enkf_surface_fv3gfs.sh.ecf +# Script name: exgdas_enkf_sfc.sh # Script description: generate ensemble surface analyses on tiles # # Author: Rahul Mahajan Org: NCEP/EMC Date: 2017-03-02 @@ -26,23 +26,11 @@ fi # Directories. pwd=$(pwd) -export NWPROD=${NWPROD:-$pwd} -export HOMEgfs=${HOMEgfs:-$NWPROD} -HOMEgsi=${HOMEgsi:-$NWPROD} -export DATA=${DATA:-$pwd} -COMIN=${COMIN:-$pwd} -COMIN_ENS=${COMIN_ENS:-$COMIN} -COMIN_OBS=${COMIN_OBS:-$COMIN} -COMIN_GES=${COMIN_GES:-$COMIN} -COMIN_GES_ENS=${COMIN_GES_ENS:-$COMIN_ENS} -COMIN_GES_OBS=${COMIN_GES_OBS:-$COMIN_GES} -COMOUT=${COMOUT:-$COMIN} -COMOUT_ENS=${COMOUT_ENS:-$COMIN_ENS} +# Base variables CDATE=${CDATE:-"2010010100"} DONST=${DONST:-"NO"} DOSFCANL_ENKF=${DOSFCANL_ENKF:-"YES"} - export CASE=${CASE:-384} ntiles=${ntiles:-6} diff --git a/scripts/exglobal_enkf_update_fv3gfs.sh.ecf b/scripts/exgdas_enkf_update.sh similarity index 94% rename from scripts/exglobal_enkf_update_fv3gfs.sh.ecf rename to scripts/exgdas_enkf_update.sh index 24d273813..6e8186a55 100755 --- a/scripts/exglobal_enkf_update_fv3gfs.sh.ecf +++ b/scripts/exgdas_enkf_update.sh @@ -2,7 +2,7 @@ ################################################################################ #### UNIX Script Documentation Block # . . -# Script name: exglobal_enkf_update_fv3gfs.sh.ecf +# Script name: exgdas_enkf_update.sh # Script description: Make global_enkf update # # Author: Rahul Mahajan Org: NCEP/EMC Date: 2017-03-02 @@ -26,14 +26,6 @@ fi # Directories. pwd=$(pwd) -NWPROD=${NWPROD:-$pwd} -HOMEgsi=${HOMEgsi:-$NWPROD} -FIXgsi=${FIXgsi:-$HOMEgsi/fix} -DATA=${DATA:-$pwd/enkf_update.$$} -COMIN=${COMIN:-$pwd} -COMIN_GES_ENS=${COMIN_GES_ENS:-$COMIN} -COMOUT=${COMOUT:-$COMIN} -COMOUT_ANL_ENS=${COMOUT_ANL_ENS:-$COMOUT} # Utilities NCP=${NCP:-"/bin/cp -p"} @@ -42,12 +34,17 @@ ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} NEMSIOGET=${NEMSIOGET:-$NWPROD/utils/exec/nemsio_get} NCLEN=${NCLEN:-$HOMEgfs/ush/getncdimlen} USE_CFP=${USE_CFP:-"NO"} +CFP_MP=${CFP_MP:-"NO"} +nm="" +if [ $CFP_MP = "YES" ]; then + nm=0 +fi APRUNCFP=${APRUNCFP:-""} APRUN_ENKF=${APRUN_ENKF:-${APRUN:-""}} NTHREADS_ENKF=${NTHREADS_ENKF:-${NTHREADS:-1}} # Executables -ENKFEXEC=${ENKFEXEC:-$HOMEgsi/exec/global_enkf.x} +ENKFEXEC=${ENKFEXEC:-$HOMEgfs/exec/global_enkf.x} # Cycling and forecast hour specific parameters CDATE=${CDATE:-"2001010100"} @@ -143,13 +140,6 @@ if [ ! -d $DATA ]; then fi cd $DATA || exit 99 -################################################################################ -# Clean up the run directory -rm convinfo satinfo ozinfo hybens_info anavinfo -rm satbias_angle satbias_in -rm enkf.nml -rm sanl* - ################################################################################ # Fixed files $NLN $SATANGL satbias_angle @@ -167,7 +157,8 @@ $NLN $COMOUT_ANL_ENS/$GBIASe satbias_in ################################################################################ if [ $USE_CFP = "YES" ]; then - rm $DATA/untar.sh $DATA/mp_untar.sh + [[ -f $DATA/untar.sh ]] && rm $DATA/untar.sh + [[ -f $DATA/mp_untar.sh ]] && rm $DATA/mp_untar.sh set +x cat > $DATA/untar.sh << EOFuntar #!/bin/sh @@ -191,7 +182,10 @@ fi flist="$CNVSTAT $OZNSTAT $RADSTAT" if [ $USE_CFP = "YES" ]; then - echo "$DATA/untar.sh ensmean" | tee -a $DATA/mp_untar.sh + echo "$nm $DATA/untar.sh ensmean" | tee -a $DATA/mp_untar.sh + if [ ${CFP_MP:-"NO"} = "YES" ]; then + nm=$((nm+1)) + fi else for ftype in $flist; do fname=$COMOUT_ANL_ENS/${ftype}.ensmean @@ -203,7 +197,10 @@ for imem in $(seq 1 $NMEM_ENKF); do memchar="mem"$(printf %03i $imem) if [ $lobsdiag_forenkf = ".false." ]; then if [ $USE_CFP = "YES" ]; then - echo "$DATA/untar.sh $memchar" | tee -a $DATA/mp_untar.sh + echo "$nm $DATA/untar.sh $memchar" | tee -a $DATA/mp_untar.sh + if [ ${CFP_MP:-"NO"} = "YES" ]; then + nm=$((nm+1)) + fi else for ftype in $flist; do fname=$COMOUT_ANL_ENS/$memchar/$ftype @@ -248,10 +245,9 @@ if [ $USE_CFP = "YES" ]; then ncmd_max=$((ncmd < npe_node_max ? ncmd : npe_node_max)) APRUNCFP=$(eval echo $APRUNCFP) $APRUNCFP $DATA/mp_untar.sh - rc=$? - export ERR=$rc + export ERR=$? export err=$ERR - $ERRSCRIPT || exit 2 + $ERRSCRIPT || exit 3 fi fi @@ -375,13 +371,13 @@ EOFnml ################################################################################ # Run enkf update -export OMP_NUM_THREADS=$NTHREADS_ENKF -PGM=$DATA/enkf.x -$NCP $ENKFEXEC $PGM +export OMP_NUM_THREADS=$NTHREADS_ENKF +export pgm=$ENKFEXEC +. prep_step -# Execute EnKF using same number of mpi tasks on all nodes -$APRUN_ENKF $PGM 1>stdout 2>stderr +$NCP $ENKFEXEC $DATA +$APRUN_ENKF ${DATA}/$(basename $ENKFEXEC) 1>stdout 2>stderr rc=$? export ERR=$rc diff --git a/scripts/exglobal_analysis.sh.ecf b/scripts/exglobal_analysis.sh.ecf deleted file mode 100755 index 97566ebbc..000000000 --- a/scripts/exglobal_analysis.sh.ecf +++ /dev/null @@ -1,1700 +0,0 @@ -#!/bin/ksh -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: global_analysis.sh -# Script description: Makes a global spectral model analysis -# -# Author: Mark Iredell Org: NP23 Date: 1999-07-15 -# -# Abstract: This script makes a global spectral model analysis. -# Both the surface analysis and the upper-air analysis are performed. -# -# Script history log: -# 1999-05-01 Mark Iredell -# 2002-04-26 Russ Treadon add global_angupdate processing -# 2003-08-05 Russ Treadon add processing of hourly sigma and surface guess -# 2004-03-26 Russ Treadon remove reference to IEEE TOVS-1b files, fix sfcg bug -# 2005-01-03 Cheng-Hsuan Lu :set FSMCL(2:4) = FSMCL2 -# add FNVMNC,FNVMXC,FNSLPC,FNABSC -# 2005-07-22 Russ Treadon add processing of NOAA-18 hirs4, amsua, and mhs data -# 2006-11-29 Russ Treadon update for global_gsi -# 2007-10-18 Russ Treadon add new options (not activated) to GSI namelist; -# update CRTM related pieces for use with CRTM_GFS -# (revision 799); modify SBUVBF variable and -# sbuvbufr OBS_INPUT "dsis" variable to process -# version 8 (sbuv8_*) sbuv/2 ozone data. -# 2007-10-18 Diane Stokes clean up processing of diagnostic files -# 2008-04-04 Russ Treadon remove global_chgres -# 2008-09-29 Russ Treadon add IASI, update to crtm_gfsgsi (rev1855), -# turn on varqc and bkgv_flowdep, tsfc_sdv=3 -# 2009-02-05 Russ Treadon add unique thread / stack variables for GSIEXEC -# and ANGUPDATEXEC; add OMIBF, TCVITL; add dsfcalc -# 2009-03-19 Russ Treadon add JCAP_A,NLAT_A,NLON_A,JCAP_B -# 2010-04-28 Russ Treadon remove global_angupdate -# 2010-05-05 George Gayno add ANAVINFO file -# 2011-05-10 EMC/SPA update RTMFIX defaults to ${FIXGLOBAL}/crtm_2.0.2, instead of crtm_gfsgsi -# 2012-01-16 Treadon add hooks for hybrid ensemble -# 2012-02-14 S. Moorthi Edited for Zeus and Gaea -# 2013-10-31 R. Todling Revisit OBS_INPUT (add table) -# 2014-03-13 X. Li Add NSST -# 2016-05-01 Yanqiu Zhu Add RADCLOUDINFO and use satinfo with icloud & iaerosol -# 2016-05-10 J. Jung Added RARS and direct broadcast data -# 2016-08-28 X. Li Introduce USE_READIN_ANL_SFCMASK for surface mask consistency between analysis and ensemble grids -# 2018-10-24 Karina Apodaca add processing of GOES-GLM light -# -# Usage: global_analysis.sh SFCGES SIGGES NSTGES GBIAS GBIASPC GRADSTAT GBIASAIR -# SFCANL SIGANL NSTANL ABIAS ABIASPC ABIASAIR IGEN -# -# Input script positional parameters: -# 1 Input surface guess -# defaults to $SFCGES; required -# 2 Input sigma guess -# defaults to $SIGGES; required -# 3 Input NSST guess -# defaults to $NSTGES; required -# 4 Input guess time dependent bias correction coefficients -# defaults to $GBIAS; required -# 5 Input guess radiance bias correction pre-conditioning -# defaults to $GBIASPC; required -# 6 Input guess radiance diagnostic file -# defaults to $GRADSTAT; required -# 7 Input guess aircraft bias correction coefficients -# defaults to $GBIASAIR; required -# 8 Output surface analysis -# defaults to $SFCANL, then to ${COMOUT}/sfcanl -# 9 Output sigma analysis -# defaults to $SIGANL, then to ${COMOUT}/siganl -# 10 Output NSST analysis -# defaults to $NSTANL, then to ${COMOUT}/nstanl -# 11 Output bias correction -# defaults to $ABIAS, then to ${COMOUT}/abias -# 12 Output bias correction pre-conditioning -# defaults to $ABIASPC, then to ${COMOUT}/abias_pc -# 13 Output aircraft bias correction coefficients -# defaults to $ABIASAIR, then to ${COMOUT}/abias_air -# 14 Output generating code -# defaults to $IGEN, then to 0 -# -# Imported Shell Variables: -# SFCGES Input surface guess -# overridden by $1; required -# SIGGES Input sigma guess -# overridden by $2; required -# GBIAS Input guess bias correction -# overridden by $3; required -# GBIASPC Input guess radiance bias correction pre-conditioning -# overridden by $4; required -# GRADSTAT Input guess angle dependent bias correction -# overridden by $5; required -# GBIASAIR Input guess aircraft bias correction -# overridden by $6; required -# SFCANL Output surface analysis -# overridden by $7; defaults to ${COMOUT}/sfcanl -# SIGANL Output sigma analysis -# overridden by $8; defaults to ${COMOUT}/siganl -# ABIAS Output bias correction -# overridden by $9; defaults to ${COMOUT}/abias -# ABIASPC Output bias correction pre-conditioning -# overridden by $10; defaults to ${COMOUT}/abias_pc -# ABIASAIR Output aircraft bias correction -# overridden by $11; defaults to ${COMOUT}/abias_air -# NSTGES Input NSST guess -# overridden by $10; required -# NSTANL Output NSST analysis -# overridden by $11; defaults to ${COMOUT}/nstanl -# IGEN Output generating code -# overridden by $12; defaults to 0 -# SFCG03 Surface guess valid at -03 hour -# defaults to ${COMOUT}/sfcf03; optional input -# SFCG04 Surface guess valid at -04 hour -# defaults to ${COMOUT}/sfcf04; optional input -# SFCG05 Surface guess valid at -05 hour -# defaults to ${COMOUT}/sfcf05; optional input -# SFCG07 Surface guess valid at -07 hour -# defaults to ${COMOUT}/sfcf07; optional input -# SFCG08 Surface guess valid at -08 hour -# defaults to ${COMOUT}/sfcf08; optional input -# SFCG09 Surface guess valid at -09 hour -# defaults to ${COMOUT}/sfcf09; optional input -# NSTG03 NSST guess valid at -03 hour -# defaults to ${COMOUT}/nstf03; optional input -# NSTG04 NSST guess valid at -04 hour -# defaults to ${COMOUT}/nstf04; optional input -# NSTG05 NSST guess valid at -05 hour -# defaults to ${COMOUT}/nstf05; optional input -# NSTG07 NSST guess valid at -07 hour -# defaults to ${COMOUT}/nstf07; optional input -# NSTG08 NSST guess valid at -08 hour -# defaults to ${COMOUT}/nstf08; optional input -# NSTG09 NSST guess valid at -09 hour -# defaults to ${COMOUT}/nstf09; optional input -# SIGG03 Sigma guess valid at -03 hour -# defaults to ${COMOUT}/sigf03; optional input -# SIGG04 Sigma guess valid at -04 hour -# defaults to ${COMOUT}/sigf04; optional input -# SIGG05 Sigma guess valid at -05 hour -# defaults to ${COMOUT}/sigf05; optional input -# SIGG07 Sigma guess valid at -07 hour -# defaults to ${COMOUT}/sigf07; optional input -# SIGG08 Sigma guess valid at -08 hour -# defaults to ${COMOUT}/sigf08; optional input -# SIGG09 Sigma guess valid at -09 hour -# defaults to ${COMOUT}/sigf09; optional input -# SIGGESENS template for ensemble member sigma guess -# defaults to ${COMOUT}/sigf06_ens; optional input -# DOHYBVAR flag (YES or NO) for hybrid ensemble variational option -# defaults to NO -# NMEM_ENS number of ensemble members included in analysis -# defauls to 0 -# GINCIN Input increment to guess -# defaults to ${COMOUT}/gesfile_in; optional -# BIASIN Input bias correction to guess -# defaults to ${COMOUT}/biascor_in; optional -# USE_NEWRADBC Flag to use new radiance bias correction scheme (YES or NO) -# defaults to NO -# USE_RADSTAT Flag to use guess radstat file for bias correction -# initialization (YES or NO). defaults to NO -# RADSTAT Output radiance assimilation statistics -# defaults to ${COMIN}/${PREINP}radstat -# GSISTAT Output gsi (obs-ges), qc, and iteration statistics -# defaults to ${COMIN}/${PREINP}gsistat -# PCPSTAT Output precipitation assimilation statistics -# defaults to ${COMIN}/${PREINP}pcpstat -# CNVSTAT Output conventional observation assimilation statistics -# defaults to ${COMIN}/${PREINP}cnvstat -# OZNSTAT Output ozone observation assimilation statistics -# defaults to ${COMIN}/${PREINP}oznstat -# LIGSTAT Output lightning observation assimilation statistics -# defaults to ${COMIN}/${PREINP}ligstat -# GINCOUT Output increment to guess -# defaults to ${COMIN}/${PREINP}gesfile_out -# BIASOUT Output bias correction to guess -# defaults to ${COMIN}/${PREINP}biascor_out -# RUN_SELECT Flag to only select data (YES or NO) -# defaults to NO -# USE_SELECT Flag to use selected data (YES or NO) -# defaults to NO -# SELECT_OBS Tarball containing selected data -# defaults to ${COMIN}/${PREINP}obsinput -# DIAG_SUFFIX optional suffix for diagnostics files -# defaults to empty string -# DIAG_COMPRESS flag to compress (YES) diagnostics files -# defaults to YES -# DIAG_TARBALL flag to collect (YES) diagnostic files in tarballs -# defaults to YES -# FIXgsm Directory for global fixed files -# defaults to /nwprod/fix -# EXECgsm Directory for global executables -# defaults to /nwprod/exec -# USHgsm Directory for global ush scripts -# defaults to /nwprod/ush -# DATA working directory -# (if nonexistent will be made, used and deleted) -# defaults to current working directory -# COMIN input directory -# defaults to current working directory -# COMOUT output directory -# (if nonexistent will be made) -# defaults to current working directory -# XC Suffix to add to executables -# defaults to none -# PREINP Prefix to add to input observation files -# defaults to none -# SUFINP Suffix to add to input observation files -# defaults to none -# NCP Copy command -# defaults to cp -# SIGHDR Command to read sigma header -# defaults to ${EXECgsm}/global_sighdr$XC -# SFCHDR Command to read surface header -# defaults to ${EXECgsm}/global_sfchdr$XC -# CYCLEXEC Surface cycle executable -# defaults to ${EXECgsm}/global_cycle$XC -# GSIEXEC Spectral analysis executable -# defaults to ${EXECgsm}/global_gsi$XC -# CYCLESH Surface cycle script -# defaults to ${USHgsm}/global_cycle.sh -# BERROR Input background error file -# defaults to ${FIXgsm}/global_berror.l${LEVS}y${NLAT_A}.sig.f77 -# SATANGL Input satellite angle bias file -# defaults to ${FIXgsm}/global_satangbias.txt -# SATINFO Input satellite information file -# defaults to ${FIXgsm}/global_satinfo.txt -# RADCLOUDINFO Input cloud-related usage for satellite intrument -# defaults to ${FIXgsm}/cloudy_radiance_info.txt -# ATMSFILTER Path to file describing how ATMS is spatially filtered -# defaults to ${FIXgsm}/atms_beamwidth.txt -# RTMFIX Input directory containing CRTM coefficients -# defaults to ${FIXgsm}/crtm_v2.2.3 -# ANAVINFO Input analysis variable file -# defaults to ${FIXgsm}/global_anavinfo.l${LEVS}.txt -# CONVINFO Input conventional observation information file -# defaults to ${FIXgsm}/global_convinfo.txt -# INSITUINFO Input nsst insitu information file -# defaults to ${FIXgsm}/global_insituinfo.txt -# OZINFO Input ozone information file -# defaults to ${FIXgsm}/global_ozone.txt -# PCPINFO Input precipitation information file -# defaults to ${FIXgsm}/global_pcpinfo.txt -# AEROINFO Input aerosol information file -# defaults to ${FIXgsm}/global_aeroinfo.txt -# SCANINFO Input satellite scan information file -# defaults to ${FIXgsm}/global_scaninfo.txt -# HYBENSINFO Input hybrid ensemble localization information file -# defaults to ${FIXgsm}/global_hybens_locinfo.l${LEVS}.txt -# LIGHTINFO Input lightning information file -# defaults to ${FIXgsm}/global_lightinfo.txt -# PREPQC Input QC-ed observation BUFR file -# defaults to ${COMIN}/${PREINP}prepbufr${SUFINP} -# PREPQCPF Input QC-ed observation profile BUFR file -# defaults to ${COMIN}/${PREINP}prepbufr.acft_profiles${SUFINP} -# SATWND Input satellite wind file (bufr format) -# defaults to ${COMIN}/${PREINP}satwnd.tm00.bufr_d${SUFINP} -# OSCATBF Input OSCAT wind file (bufr format) -# defaults to ${COMIN}/${PREINP}oscatw.tm00.bufr_d${SUFINP} -# RAPIDSCATBF Input RAPIDSCAT wind file (bufr format) -# defaults to ${COMIN}/${PREINP}rapidscatw.tm00.bufr_d${SUFINP} -# GSNDBF Input GOES sounder radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}goesnd.tm00.bufr_d${SUFINP} -# GSNDBF1 Input GOES 1x1 sounder radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}goesfv.tm00.bufr_d${SUFINP} -# GLMBF Input GOES-16/GLM lightning flash rate file -# defaults to ${COMIN}/${PREINP}glm.tm00.bufr_d${SUFINP} -# B1HRS2 Input HIRS/2 radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}1bhrs2.tm00.bufr_d${SUFINP} -# B1MSU Input MSU radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}1bmsu.tm00.bufr_d${SUFINP} -# B1HRS3 Input HIRS/3 radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}1bhrs3.tm00.bufr_d${SUFINP} -# B1HRS4 Input HIRS/4 radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}1bhrs4.tm00.bufr_d${SUFINP} -# B1AMUA Input AMSU/A radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}1bamua.tm00.bufr_d${SUFINP} -# B1AMUB Input AMSU/B radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}1bamub.tm00.bufr_d${SUFINP} -# B1MHS Input MHS radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}1bmhs.tm00.bufr_d${SUFINP} -# ESHRS3 Input EARS HIRS/3 radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}eshrs3.tm00.bufr_d${SUFINP} -# ESAMUA Input EARS AMSU/A radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}esamua.tm00.bufr_d${SUFINP} -# ESAMUB Input EARS AMSU/B radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}esamub.tm00.bufr_d${SUFINP} -# HRS3DB Input direct broadcast HIRS/3 radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}hrs3db.tm00.bufr_d${SUFINP} -# AMUADB Input direct broadcast AMSU/A radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}amuadb.tm00.bufr_d${SUFINP} -# AMUBDB Input direct broadcast AMSU/B radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}amubdb.tm00.bufr_d${SUFINP} -# AIRSBF Input AIRS radiace file (bufr format) -# defaults to ${COMIN}/${PREINP}airs.tm00.bufr_d${SUFINP} -# IASIBF Input IASI radiace file (bufr format) -# defaults to ${COMIN}/${PREINP}mtiasi.tm00.bufr_d${SUFINP} -# ESIASI Input EARS/RARS IASI radiace file (bufr format) -# defaults to ${COMIN}/${PREINP}esiasi.tm00.bufr_d${SUFINP} -# IASIDB Input direct broadcast IASI radiace file (bufr format) -# defaults to ${COMIN}/${PREINP}iasidb.tm00.bufr_d${SUFINP} -# AMSREBF Input AMSRE radiace file (bufr format) -# defaults to ${COMIN}/${PREINP}amsre.tm00.bufr_d${SUFINP} -# SEVIRIBF Input SEVIRI radiace file (bufr format) -# defaults to ${COMIN}/${PREINP}sevcsr.tm00.bufr_d${SUFINP} -# AHIBF Input AHI radiace file (bufr format) -# defaults to ${COMIN}/${PREINP}ahi.tm00.bufr_d${SUFINP} -# CRISBF Input CRIS radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}cris.tm00.bufr_d${SUFINP} -# ESCRIS Input EARS/RARS CRIS radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}escris.tm00.bufr_d${SUFINP} -# CRISDB Input direct broadcast CRIS radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}crisdb.tm00.bufr_d${SUFINP} -# CRISFSBF Input CRIS radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}crisf4.tm00.bufr_d${SUFINP} -# ESCRISFS Input EARS/RARS CRIS-FSR radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}escrisf4.tm00.bufr_d${SUFINP} -# CRISFSDB Input direct broadcast CRIS-FSR radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}crisf4db.tm00.bufr_d${SUFINP} -# ATMSBF Input ATMS radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}atms.tm00.bufr_d${SUFINP} -# ESATMS Input EARS/RARS ATMS radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}esatms.tm00.bufr_d${SUFINP} -# ATMSDB Input direct broadcast ATMS radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}atmsdb.tm00.bufr_d${SUFINP} -# SAPHIRBF Input SAPHIR radiance file (bufr format) -# defaults to ${COMIN}/${PREINP}saphir.tm00.bufr_d${SUFINP} -# AMSR2BF Input AMSR2 L1B brightness temperature files -# defaults to ${COMIN}/${PREINP}amsr2.tm00.bufr_d${SUFINP} -# GMI1CRBF Input GMI L1CR brightness temperature files -# defaults to ${COMIN}/${PREINP}gmi1cr.tm00.bufr_d${SUFINP} -# SSMITBF Input SSMI radiace file (bufr format) -# defaults to ${COMIN}/${PREINP}ssmit.tm00.bufr_d${SUFINP} -# SSMISBF Input SSMIS radiace file (bufr format) -# defaults to ${COMIN}/${PREINP}ssmisu.tm00.bufr_d${SUFINP} -# SBUVBF Input NOAA POES SBUV ozone retrieval file -# defaults to ${COMIN}/${PREINP}osbuv8.tm00.bufr_d${SUFINP} -# GOMEBF Input GOME ozone retrieval file -# defaults to ${COMIN}/${PREINP}gome.tm00.bufr_d${SUFINP} -# OMIBF Input OMI ozone retrieval file -# defaults to ${COMIN}/${PREINP}omi.tm00.bufr_d${SUFINP} -# MLSBF Input MLS ozone retrieval file -# defaults to ${COMIN}/${PREINP}mls.tm00.bufr_d${SUFINP} -# SMIPCP Input SSM/I precipitation rate file -# defaults to ${COMIN}/${PREINP}spssmip.tm00.bufr_d${SUFINP} -# TMIPCP Input TMI precipitation rate file -# defaults to ${COMIN}/${PREINP}sptrmm.tm00.bufr_d${SUFINP} -# GPSROBF Input GPS radio occultation data -# defaults to ${COMIN}/${PREINP}gpsro.tm00.bufr_d${SUFINP} -# TCVITL Input tcvitals file -# defaults to ${COMIN}/${PREINP}syndata.tcvitals.tm00 -# NSSTBF Input in situ sea temperature file -# defaults to ${COMIN}/${PREINP}nsstbufr.tm00.bufr_d${SUFINP} -# B1AVHAM Input AVHRR GAC (AM) file -# defaults to ${COMIN}/${PREINP}avcsam.tm00.bufr_d${SUFINP} -# B1AVHPM Input AVHRR GAC (PM) file -# defaults to ${COMIN}/${PREINP}avcspm.tm00.bufr_d${SUFINP} -# INISCRIPT Preprocessing script -# defaults to none -# LOGSCRIPT Log posting script -# defaults to none -# ERRSCRIPT Error processing script -# defaults to 'eval [[ $err = 0 ]]' -# ENDSCRIPT Postprocessing script -# defaults to none -# JCAP_A Spectral truncation for analysis -# defaults to the value in the input sigma file header -# JCAP Spectral truncation for background -# defaults to the value in the input sigma file header -# LEVS Number of levels -# DELTIM Timestep in seconds -# defaults to 3600/($JCAP_A/20) -# CDATE Current analysis date in yyyymmddhh format -# defaults to the value in the input surface file header -# LATB Number of latitudes in surface cycling -# defaults to the value in the input surface file header -# LONB Number of longitudes in surface cycling -# defaults to the value in the input surface file header -# LSOIL Number of soil layers -# defaults to 2 -# FSMCL2 Scale in days to relax to soil moisture climatology -# defaults to 60 -# DELTSFC Cycling frequency in hours -# defaults to forecast hour of $SFCGES -# LATA Number of latitudes in spectral analysis -# defaults to $LATB -# LONA Number of longitudes in spectral analysis -# defaults to $LONB -# NSIG1 Number of levels per MPI task -# (Important: number of MPI tasks must be 5*$LEVS/$NSIG1+2) -# defaults to 1 -# CYCLVARS Other namelist inputs to the cycle executable -# defaults to none set -# GSIVARS Other namelist inputs to the analysis executable -# defaults to none set -# SATVARS Other namelist input to analysis data usage namelist -# defaults to none set -# NTHREADS Number of threads -# defaults to 1 -# NTHSTACK Size of stack per thread -# defaults to 1024000000 -# NTHREADS_GSI Number of threads for GSIEXEC -# defaults to 1 -# NTHSTACK_GSI Size of stack per thread for GSIEXEC -# defaults to 1024000000 -# FILESTYLE File management style flag -# ('C' to copy to/from $DATA, 'L' for symbolic links in $DATA, -# 'X' to use XLFUNIT or symbolic links where appropriate) -# defaults to 'X' -# PGMOUT Executable standard output -# defaults to $pgmout, then to '&1' -# PGMERR Executable standard error -# defaults to $pgmerr, then to '&1' -# pgmout Executable standard output default -# pgmerr Executable standard error default -# REDOUT standard output redirect ('1>' or '1>>') -# defaults to '1>', or to '1>>' to append if $PGMOUT is a file -# REDERR standard error redirect ('2>' or '2>>') -# defaults to '2>', or to '2>>' to append if $PGMERR is a file -# VERBOSE Verbose flag (YES or NO) -# defaults to NO -# lrun_subdirs logical to toggle use of subdirectories at runtime for -# pe-specific files -# defaults to .true. -# l4densvar logical to toggle 4D-EnsVar option -# defaults to .false. -# lwrite4danl logical to toggle write 4D analysis files -# defaults to .false. -# -# Exported Shell Variables: -# PGM Current program name -# pgm -# ERR Last return code -# err -# -# Modules and files referenced: -# scripts : $INISCRIPT -# $LOGSCRIPT -# $ERRSCRIPT -# $ENDSCRIPT -# -# programs : $CYCLEXEC -# $GSIEXEC -# -# fixed data : $BERROR -# $SATANGL -# $SATINFO -# $RADCLOUDINFO -# $ATMSFILTER -# $RTMFIX -# $ANAVINFO -# $CONVINFO -# $INSITUINFO -# $OZINFO -# $PCPINFO -# $AEROINFO -# $SCANINFO -# $HYBENSINFO -# -# input data : $SFCGES -# $SIGGES -# $GBIAS -# $GBIASPC -# $GRADSTAT -# $GBIASAIR -# $SFCG03 -# $SFCG04 -# $SFCG05 -# $SFCG07 -# $SFCG08 -# $SFCG09 -# $NSTG03 -# $NSTG04 -# $NSTG05 -# $NSTG07 -# $NSTG08 -# $NSTG09 -# $SIGG03 -# $SIGG04 -# $SIGG05 -# $SIGG07 -# $SIGG08 -# $SIGG09 -# $GINCIN -# $BIASIN -# $FNTSFA -# $FNACNA -# $FNSNOA -# $PREPQC -# $PREPQCPF -# $SATWND -# $OSCATBF -# $GSNDBF -# $GSNDBF1 -# $B1HRS2 -# $B1MSU -# $B1HRS3 -# $B1HRS4 -# $B1AMUA -# $B1AMUB -# $B1MHS -# $ESHRS3 -# $ESAMUA -# $ESAMUB -# $AIRSBF -# $IASIBF -# $AMSREBF -# $SEVIRIBF -# $CRISBF -# $ATMSBF -# $SSMITBF -# $SSMISBF -# $SBUVBF -# $GOMEBF -# $OMIBF -# $MLSBF -# $SMIPCP -# $TMIPCP -# $GPSROBF -# $G16GLMBF -# $TCVITL -# $NSSTBF -# $B1AVHAM -# $B1AVHPM -# -# output data: $SFCANL -# $NSTANL -# $SIGANL -# $ABIAS -# $ABIASPC -# $ABIASAIR -# $RADSTAT -# $GSISTAT -# $PCPSTAT -# $CNVSTAT -# $OZNSTAT -# $LIGSTAT -# $GINCOUT -# $BIASOUT -# $PGMOUT -# $PGMERR -# -# Remarks: -# -# Condition codes -# 0 - no problem encountered -# >0 - some problem encountered -# -# Control variable resolution priority -# 1 Command line argument. -# 2 Environment variable. -# 3 Inline default. -# -# Attributes: -# Language: POSIX shell -# Machine: IBM SP / Zeus / Gaea -# -################################################################################ -# Set environment. -export VERBOSE=${VERBOSE:-"NO"} -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXECUTING $0 $* >&2 - set -x -fi -export machine=${machine:-IBMP6} -export machine=$(echo $machine|tr '[a-z]' '[A-Z]') - -# Command line arguments. -export SFCGES=${1:-${SFCGES:?}} -export SIGGES=${2:-${SIGGES:?}} -export NSTGES=${3:-${NSTGES:?}} -export GBIAS=${4:-${GBIAS:?}} -export GBIASPC=${5:-${GBIASPC:?}} -export GRADSTAT=${6:-${GRADSTAT:?}} -export GBIASAIR=${7:-${GBIASAIR:?}} -export SFCANL=${8:-${SFCANL}} -export SIGANL=${9:-${SIGANL}} -export NSTANL=${10:-${NSTANL:?}} -export ABIAS=${11:-${ABIAS}} -export ABIASPC=${12:-${ABIASPC}} -export ABIASAIR=${13:-${ABIASAIR}} -export IGEN=${14:-${IGEN:-0}} -export ABIASe=${15:-${ABIASe:-satbias_int.out}} -# Directories. -export HOMEDIR=${HOMEDIR:-$NWROOT} -export NWPROD=${NWPROD:-$HOMEDIR} -export FIXSUBDA=${FIXSUBDA:-fix/fix_am} -export FIXgsm=${FIXgsm:-$NWPROD/global_shared.${global_shared_ver}/fix/fix_am} -export EXECgsm=${EXECgsm:-$NWPROD/global_shared.${global_shared_ver}/exec} -export USHgsm=${USHgsm:-$NWPROD/global_shared.${global_shared_ver}/ush} -export FIXgsi=${FIXgsi:-$NWPROD/global_shared.${global_shared_ver}/fix} -export EXECgsi=${EXECgsi:-$NWPROD/global_shared.${global_shared_ver}/exec} -export DATA=${DATA:-$(pwd)} -export COMIN=${COMIN:-$(pwd)} -export COMOUT=${COMOUT:-$(pwd)} -# Set script / GSI control parameters -NST_GSI=${NST_GSI:-0} -NSTINFO=${NSTINFO:-0} -ZSEA1=${ZSEA1:-0} -ZSEA2=${ZSEA2:-0} -FAC_DTL=${FAC_DTL:-0} -FAC_TSL=${FAC_TSL:-0} -TZR_QC=${TZR_QC:-0} - -export use_gfs_nemsio=${use_gfs_nemsio:-".false."} # run GSI with NEMSIO input/output -export l4densvar=${l4densvar:-".false."} # run GSI in hybrid 4D ensemble-variational mode -export lwrite4danl=${lwrite4danl:-".false."} # .false. = write single analysis at center time -export DOIAU=${DOIAU:-"NO"} # run global_cycle for IAU -export lrun_subdirs=${lrun_subdirs:-".true."} # run GSI with scratch files in sub-directories -# Filenames. -export XC=${XC} -export PREINP=${PREINP} -export SUFINP=${SUFINP} -export SIGHDR=${SIGHDR:-${EXECgsm}/global_sighdr$XC} -export SFCHDR=${SFCHDR:-${EXECgsm}/global_sfchdr$XC} -if [ $use_gfs_nemsio = .true. ]; then - export JCAP=${JCAP:-$($SIGHDR $SIGGES jcap |grep -i "jcap" |awk -F"= " '{print $2}' |awk -F" " '{print $1}')} - export JCAP_A=${JCAP_A:-$($SIGHDR $SIGGES jcap |grep -i "jcap" |awk -F"= " '{print $2}' |awk -F" " '{print $1}')} - export LATB=${LATB:-$($SFCHDR $SFCGES latr |grep -i "latr" |awk -F"= " '{print $2}' |awk -F" " '{print $1}')} - export LONB=${LONB:-$($SFCHDR $SFCGES lonr |grep -i "lonr" |awk -F"= " '{print $2}' |awk -F" " '{print $1}')} - export LEVS=${LEVS:-$($SIGHDR $SIGGES levs |grep -i "levs" |awk -F"= " '{print $2}' |awk -F" " '{print $1}')} -else - export JCAP=${JCAP:-$($SIGHDR $SIGGES JCAP||echo 0)} - export JCAP_A=${JCAP_A:-$($SIGHDR $SIGGES JCAP||echo 0)} - export LATB=${LATB:-$($SFCHDR $SFCGES LATB||echo 0)} - export LONB=${LONB:-$($SFCHDR $SFCGES LONB||echo 0)} - export LEVS=${LEVS:-$($SIGHDR $SIGGES LEVS||echo 0)} -fi -export LATA=${LATA:-$LATB} -export LONA=${LONA:-$LONB} -export NLAT_A=${NLAT_A:-$(($LATA+2))} -export NLON_A=${NLON_A:-$LONA} -export DELTIM=${DELTIM:-$((3600/($JCAP_A/20)))} -export CYCLEXEC=${CYCLEXEC:-${EXECgsm}/global_cycle$XC} -export GSIEXEC=${GSIEXEC:-${EXECgsi}/global_gsi$XC} -export CYCLESH=${CYCLESH:-${USHgsm}/global_cycle.sh} -export BERROR=${BERROR:-${FIXgsi}/global_berror.l${LEVS}y${NLAT_A}.f77} -export SATANGL=${SATANGL:-${FIXgsi}/global_satangbias.txt} -export SATINFO=${SATINFO:-${FIXgsi}/global_satinfo.txt} -export RADCLOUDINFO=${RADCLOUDINFO:-${FIXgsi}/cloudy_radiance_info.txt} -export ATMSFILTER=${ATMSFILTER:-${FIXgsi}/atms_beamwidth.txt} -export RTMFIX=${RTMFIX:-$NWROOT/lib/crtm/${crtm_ver}/fix} -export ANAVINFO=${ANAVINFO:-${FIXgsi}/global_anavinfo.l${LEVS}.txt} -export CONVINFO=${CONVINFO:-${FIXgsi}/global_convinfo.txt} -export INSITUINFO=${INSITUINFO:-${FIXgsi}/global_insituinfo.txt} -export OZINFO=${OZINFO:-${FIXgsi}/global_ozinfo.txt} -export PCPINFO=${PCPINFO:-${FIXgsi}/global_pcpinfo.txt} -export AEROINFO=${AEROINFO:-${FIXgsi}/global_aeroinfo.txt} -export SCANINFO=${SCANINFO:-${FIXgsi}/global_scaninfo.txt} -export HYBENSINFO=${HYBENSINFO:-${FIXgsi}/global_hybens_locinfo.l${LEVS}.txt} -export LIGHTINFO=${LIGHTINFO:-${FIXgsi}/global_lightinfo.txt} -export OBERROR=${OBERROR:-${FIXgsi}/prepobs_errtable.global} -export PREPQC=${PREPQC:-${COMIN}/${PREINP}prepbufr${SUFINP}} -export PREPQCPF=${PREPQCPF:-${COMIN}/${PREINP}prepbufr.acft_profiles${SUFINP}} -export SATWND=${SATWND:-${COMIN}/${PREINP}satwnd.tm00.bufr_d${SUFINP}} -export OSCATBF=${OSCATBF:-${COMIN}/${PREINP}oscatw.tm00.bufr_d${SUFINP}} -export RAPIDSCATBF=${RAPIDSCATBF:-${COMIN}/${PREINP}rapidscatw.tm00.bufr_d${SUFINP}} -export GSNDBF=${GSNDBF:-${COMIN}/${PREINP}goesnd.tm00.bufr_d${SUFINP}} -export GSNDBF1=${GSNDBF1:-${COMIN}/${PREINP}goesfv.tm00.bufr_d${SUFINP}} -export B1HRS2=${B1HRS2:-${COMIN}/${PREINP}1bhrs2.tm00.bufr_d${SUFINP}} -export B1MSU=${B1MSU:-${COMIN}/${PREINP}1bmsu.tm00.bufr_d${SUFINP}} -export B1HRS3=${B1HRS3:-${COMIN}/${PREINP}1bhrs3.tm00.bufr_d${SUFINP}} -export B1HRS4=${B1HRS4:-${COMIN}/${PREINP}1bhrs4.tm00.bufr_d${SUFINP}} -export B1AMUA=${B1AMUA:-${COMIN}/${PREINP}1bamua.tm00.bufr_d${SUFINP}} -export B1AMUB=${B1AMUB:-${COMIN}/${PREINP}1bamub.tm00.bufr_d${SUFINP}} -export B1MHS=${B1MHS:-${COMIN}/${PREINP}1bmhs.tm00.bufr_d${SUFINP}} -export ESHRS3=${ESHRS3:-${COMIN}/${PREINP}eshrs3.tm00.bufr_d${SUFINP}} -export ESAMUA=${ESAMUA:-${COMIN}/${PREINP}esamua.tm00.bufr_d${SUFINP}} -export ESAMUB=${ESAMUB:-${COMIN}/${PREINP}esamub.tm00.bufr_d${SUFINP}} -export ESMHS=${ESMHS:-${COMIN}/${PREINP}esmhs.tm00.bufr_d${SUFINP}} -export HRS3DB=${HRS3DB:-${COMIN}/${PREINP}hrs3db.tm00.bufr_d${SUFINP}} -export AMUADB=${AMUADB:-${COMIN}/${PREINP}amuadb.tm00.bufr_d${SUFINP}} -export AMUBDB=${AMUBDB:-${COMIN}/${PREINP}amubdb.tm00.bufr_d${SUFINP}} -export MHSDB=${MHSDB:-${COMIN}/${PREINP}mhsdb.tm00.bufr_d${SUFINP}} -export AIRSBF=${AIRSBF:-${COMIN}/${PREINP}airsev.tm00.bufr_d${SUFINP}} -export IASIBF=${IASIBF:-${COMIN}/${PREINP}mtiasi.tm00.bufr_d${SUFINP}} -export ESIASI=${ESIASI:-${COMIN}/${PREINP}esiasi.tm00.bufr_d${SUFINP}} -export IASIDB=${IASIDB:-${COMIN}/${PREINP}iasidb.tm00.bufr_d${SUFINP}} -export AMSREBF=${AMSREBF:-${COMIN}/${PREINP}amsre.tm00.bufr_d${SUFINP}} -export AMSR2BF=${AMSR2BF:-${COMIN}/${PREINP}amsr2.tm00.bufr_d${SUFINP}} -export GMI1CRBF=${GMI1CRBF:-${COMIN}/${PREINP}gmi1cr.tm00.bufr_d${SUFINP}} -export SAPHIRBF=${SAPHIRBF:-${COMIN}/${PREINP}saphir.tm00.bufr_d${SUFINP}} -export SEVIRIBF=${SEVIRIBF:-${COMIN}/${PREINP}sevcsr.tm00.bufr_d${SUFINP}} -export AHIBF=${AHIBF:-${COMIN}/${PREINP}ahi.tm00.bufr_d${SUFINP}} -export CRISBF=${CRISBF:-${COMIN}/${PREINP}cris.tm00.bufr_d${SUFINP}} -export ESCRIS=${ESCRIS:-${COMIN}/${PREINP}escris.tm00.bufr_d${SUFINP}} -export CRISDB=${CRISDB:-${COMIN}/${PREINP}crisdb.tm00.bufr_d${SUFINP}} -export CRISFSBF=${CRISFSBF:-${COMIN}/${PREINP}crisf4.tm00.bufr_d${SUFINP}} -export ESCRISFS=${ESCRISFS:-${COMIN}/${PREINP}escrisf4.tm00.bufr_d${SUFINP}} -export CRISFSDB=${CRISFSDB:-${COMIN}/${PREINP}crisf4db.tm00.bufr_d${SUFINP}} -export ATMSBF=${ATMSBF:-${COMIN}/${PREINP}atms.tm00.bufr_d${SUFINP}} -export ESATMS=${ESATMS:-${COMIN}/${PREINP}esatms.tm00.bufr_d${SUFINP}} -export ATMSDB=${ATMSDB:-${COMIN}/${PREINP}atmsdb.tm00.bufr_d${SUFINP}} -export SSMITBF=${SSMITBF:-${COMIN}/${PREINP}ssmit.tm00.bufr_d${SUFINP}} -export SSMISBF=${SSMISBF:-${COMIN}/${PREINP}ssmisu.tm00.bufr_d${SUFINP}} -export SBUVBF=${SBUVBF:-${COMIN}/${PREINP}osbuv8.tm00.bufr_d${SUFINP}} -export GOMEBF=${GOMEBF:-${COMIN}/${PREINP}gome.tm00.bufr_d${SUFINP}} -export OMIBF=${OMIBF:-${COMIN}/${PREINP}omi.tm00.bufr_d${SUFINP}} -export MLSBF=${MLSBF:-${COMIN}/${PREINP}mls.tm00.bufr_d${SUFINP}} -export SMIPCP=${SMIPCP:-${COMIN}/${PREINP}spssmi.tm00.bufr_d${SUFINP}} -export TMIPCP=${TMIPCP:-${COMIN}/${PREINP}sptrmm.tm00.bufr_d${SUFINP}} -export GPSROBF=${GPSROBF:-${COMIN}/${PREINP}gpsro.tm00.bufr_d${SUFINP}} -export TCVITL=${TCVITL:-${COMIN}/${PREINP}syndata.tcvitals.tm00} -export NSSTBF=${NSSTBF:-${COMIN}/${PREINP}nsstbufr.tm00.bufr_d${SUFINP}} -export B1AVHAM=${B1AVHAM:-${COMIN}/${PREINP}avcsam.tm00.bufr_d${SUFINP}} -export B1AVHPM=${B1AVHPM:-${COMIN}/${PREINP}avcspm.tm00.bufr_d${SUFINP}} -export GINCIN=${GINCIN:-${COMOUT}/gesfile_in} -export BIASIN=${BIASIN:-${COMOUT}/biascor_in} -export SFCG03=${SFCG03:-${COMOUT}/sfcf03} -export SFCG04=${SFCG04:-${COMOUT}/sfcf04} -export SFCG05=${SFCG05:-${COMOUT}/sfcf05} -export SFCG07=${SFCG07:-${COMOUT}/sfcf07} -export SFCG08=${SFCG08:-${COMOUT}/sfcf08} -export SFCG09=${SFCG09:-${COMOUT}/sfcf09} -export NSTG03=${NSTG03:-${COMOUT}/nstf03} -export NSTG04=${NSTG04:-${COMOUT}/nstf04} -export NSTG05=${NSTG05:-${COMOUT}/nstf05} -export NSTG07=${NSTG07:-${COMOUT}/nstf07} -export NSTG08=${NSTG08:-${COMOUT}/nstf08} -export NSTG09=${NSTG09:-${COMOUT}/nstf09} -export USE_NEWRADBC=${USE_NEWRADBC:-"NO"} -export USE_RADSTAT=${USE_RADSTAT:-"NO"} -export SIGG03=${SIGG03:-${COMOUT}/sigf03} -export SIGG04=${SIGG04:-${COMOUT}/sigf04} -export SIGG05=${SIGG05:-${COMOUT}/sigf05} -export SIGG07=${SIGG07:-${COMOUT}/sigf07} -export SIGG08=${SIGG08:-${COMOUT}/sigf08} -export SIGG09=${SIGG09:-${COMOUT}/sigf09} -export SIGGESENS=${SIGGESENS:-${COMOUT}/sigf06_ens} -export NSTGESENS=${NSTGESENS:-${COMOUT}/nstf06_ens} -export SFCGESENS=${SFCGESENS:-${COMOUT}/sfcf06_ens} -export SFCGCYENS=${SFCGCYENS:-${COMOUT}/sfcgcy_ens} -export NSTGESENS_MEAN=${NSTGESENS_MEAN:-${COMOUT}/nstf06_ensmean} -export SFCGESENS_MEAN=${SFCGESENS_MEAN:-${COMOUT}/sfcf06_ensmean} -export SFCGCYENS_MEAN=${SFCGCYENS_MEAN:-${COMOUT}/sfcgcy_ensmean} -export SFCANLENS_MEAN=${SFCANLENS_MEAN:-${COMOUT}/sfcanl_ensmean} -export DOHYBVAR=${DOHYBVAR:-"NO"} -export USE_READIN_ANL_SFCMASK=${USE_READIN_ANL_SFCMASK:-.false.} -export NMEM_ENS=${NMEM_ENS:-0} -export SFCANL=${SFCANL:-${COMOUT}/${PREINP}sfcanl} -export DTFANL=${DTFANL:-${COMOUT}/${PREINP}dtfanl} -export SFCGCY=${SFCGCY:-${COMOUT}/${PREINP}sfcgcy} -export SFCTSK=${SFCTSK:-${COMOUT}/${PREINP}sfctsk} -export NSTANL=${NSTANL:-${COMOUT}/${PREINP}nstanl} -export SIGANL=${SIGANL:-${COMOUT}/${PREINP}sanl} -export ABIAS=${ABIAS:-${COMOUT}/${PREINP}abias} -export ABIASPC=${ABIASPC:-${COMOUT}/${PREINP}abias_pc} -export ABIASAIR=${ABIASAIR:-${COMOUT}/${PREINP}abias_air} -export GINCOUT=${GINCOUT:-${COMOUT}/${PREINP}gesfile_out} -export BIASOUT=${BIASOUT:-${COMOUT}/${PREINP}biascor_out} -export RADSTAT=${RADSTAT:-${COMOUT}/${PREINP}radstat} -export GSISTAT=${GSISTAT:-${COMOUT}/${PREINP}gsistat} -export PCPSTAT=${PCPSTAT:-${COMOUT}/${PREINP}pcpstat} -export CNVSTAT=${CNVSTAT:-${COMOUT}/${PREINP}cnvstat} -export OZNSTAT=${OZNSTAT:-${COMOUT}/${PREINP}oznstat} -export LIGSTAT=${LIGSTAT:-${COMOUT}/${PREINP}ligstat} -export RUN_SELECT=${RUN_SELECT:-"NO"} -export USE_SELECT=${USE_SELECT:-"NO"} -export SELECT_OBS=${SELECT_OBS:-${COMOUT}/${PREINP}obsinput} -export DIAG_SUFFIX=${DIAG_SUFFIX:-""} -export DIAG_COMPRESS=${DIAG_COMPRESS:-"YES"} -export DIAG_TARBALL=${DIAG_TARBALL:-"YES"} -export INISCRIPT=${INISCRIPT} -export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} -export LOGSCRIPT=${LOGSCRIPT} -export ENDSCRIPT=${ENDSCRIPT} -# Other variables. -export LSOIL=${LSOIL:-2} -export FSMCL2=${FSMCL2:-60} -if [ $use_gfs_nemsio = .true. ]; then - export CDATE=${CDATE:-$($SFCHDR $SFCGES fcstdate | grep -i "fcstdate_ymdh" |awk -F= '{print $2}')} - export DELTSFC=${DELTSFC:-`$SFCHDR $SFCGES nfhour |awk -F" " '{print $2}'`} -else - export CDATE=${CDATE:-$($SFCHDR $SFCGES VDATE||echo 0)} - export DELTSFC=${DELTSFC:-$($SFCHDR $SFCGES FHOUR||echo 0)} -fi -export CYCLVARS=${CYCLVARS} -export SETUP=${SETUP:-""} -export GRIDOPTS=${GRIDOPTS:-""} -export BKGVERR=${BKGVERR:-""} -export ANBKGERR=${ANBKGERR:-""} -export JCOPTS=${JCOPTS:-""} -export STRONGOPTS=${STRONGOPTS:-""} -export OBSQC=${OBSQC:-""} -export OBSINPUT=${OBSINPUT:-""} -export SUPERRAD=${SUPERRAD:-""} -export SINGLEOB=${SINGLEOB:-""} -export LAGDATA=${LAGDATA:-""} -export HYBRID_ENSEMBLE=${HYBRID_ENSEMBLE:-""} -export RAPIDREFRESH_CLDSURF=${RAPIDREFRESH_CLDSURF:-""} -export CHEM=${CHEM:-""} -export NST=${NST:-""} -export FILESTYLE=${FILESTYLE:-'X'} -export PGMOUT=${PGMOUT:-${pgmout:-'&1'}} -export PGMERR=${PGMERR:-${pgmerr:-'&2'}} -export OBERRFLAG=${OBERRFLAG:-.false.} -export NCP=${NCP:-cp} -export CHGRP_CMD=${CHGRP_CMD:-"chgrp ${group_name:-rstprod}"} -export NTHREADS=${NTHREADS:-1} -export NTHREADS_GSI=${NTHREADS_GSI:-1} -if [ $machine = IBMP6 ] ; then - export NTHSTACK=${NTHSTACK:-1024000000} - export NTHSTACK_GSI=${NTHSTACK_GSI:-1024000000} - typeset -L1 l=$PGMOUT - [[ $l = '&' ]]&&a=''||a='>' - export REDOUT=${REDOUT:-'1>'$a} - typeset -L1 l=$PGMERR - [[ $l = '&' ]]&&a=''||a='>' - export REDERR=${REDERR:-'2>'$a} - COMPRESS=compress - UNCOMPRESS=uncompress -else - typeset -L1 l=$PGMOUT - [[ $l = '&' ]]&&a=''||a='>' - export REDOUT=${REDOUT:-'1>'$a} - typeset -L1 l=$PGMERR - [[ $l = '&' ]]&&a=''||a='>' - export REDERR=${REDERR:-'2>'$a} - COMPRESS=${COMPRESS:-gzip} - UNCOMPRESS=${UNCOMPRESS:-gunzip} -fi -export wc=${wc:-/usr/bin/wc} -export APRUN=${APRUN:-""} -export APRUNCFP=${APRUNCFP:-""} -export USE_CFP=${USE_CFP:-"NO"} - -# Set 4D-EnVar specific variables -if [ $l4densvar = .true. ]; then - export SIGA03=${SIGA03:-${COMOUT}/siga03} - export SIGA04=${SIGA04:-${COMOUT}/siga04} - export SIGA05=${SIGA05:-${COMOUT}/siga05} - export SIGA07=${SIGA07:-${COMOUT}/siga07} - export SIGA08=${SIGA08:-${COMOUT}/siga08} - export SIGA09=${SIGA09:-${COMOUT}/siga09} - export SIGF03ENS=${SIGF03ENS:-${COMROT}/sigf03_ens} - export SIGF04ENS=${SIGF04ENS:-${COMROT}/sigf04_ens} - export SIGF05ENS=${SIGF05ENS:-${COMROT}/sigf05_ens} - export SIGF06ENS=${SIGF06ENS:-${COMROT}/sigf06_ens} - export SIGF07ENS=${SIGF07ENS:-${COMROT}/sigf07_ens} - export SIGF08ENS=${SIGF08ENS:-${COMROT}/sigf08_ens} - export SIGF09ENS=${SIGF09ENS:-${COMROT}/sigf09_ens} -fi - -################################################################################ -# Preprocessing -$INISCRIPT -pwd=$(pwd) -if [[ -d $DATA ]] -then - mkdata=NO -else - mkdir -p $DATA - mkdata=YES -fi -cd $DATA||exit 99 - -################################################################################ -# Update surface guess file to produce surface analysis -rc=0 -if [ $NST_GSI -eq 3 ] ; then - $CYCLESH $SFCGES $SFCGCY - ra=$? - ((rc+=ra)) -else - $CYCLESH $SFCGES $SFCANL - ra=$? - ((rc+=ra)) - if [ $DOIAU = YES ]; then - export CDATE_SAVE=$CDATE - export CDATE=$($NDATE -3 $CDATE_SAVE) - $CYCLESH $SFCG03 $SFCA03 - ra=$? - ((rc+=ra)) - export CDATE=$CDATE_SAVE - fi -fi - -export ERR=$rc -export err=$ERR -$ERRSCRIPT||exit 11 - - -################################################################################ -# Make atmospheric analysis -if [ $machine = IBMP6 ] ; then - export XLSMPOPTS="parthds=$NTHREADS_GSI:stack=$NTHSTACK_GSI" -fi -export OMP_NUM_THREADS=$NTHREADS_GSI -export PGM='$APRUN $DATA/$(basename $GSIEXEC)' -export pgm=$PGM -$LOGSCRIPT - -rm berror_stats satbias_angle satinfo *SpcCoeff.bin *TauCoeff.bin EmisCoeff.bin -rm AerosolCoeff.bin CloudCoeff.bin anavinfo convinfo ozinfo pcpinfo aeroinfo scaninfo -rm errtable prepbufr prepbufr_profl gsndrbufr gsnd1bufr hirs2bufr msubufr hirs3bufr hirs4bufr -rm amsuabufr amsubbufr mhsbufr sbuvbufr gomebufr omibufr mlsbufr ssmirrbufr tmirrbufr ahibufr -rm airsbufr iasibufr iasibufrears iasibufr_db amsrebufr amsr2bufr gmibufr saphirbufr ssmitbufr -rm ssmisbufr gpsrobufr tcvitl hybens_locinfo atms_beamwidth.txt -rm hirs3bufr_db hirs3bufrears amsuabufr_db amsuabufrears -rm amsubbufr_db amsubbufrears mhsbufr_db mhsbufrears seviribufr -rm crisbufr crisbufr_db crisbufrears crisfsbufr crisfsbufrears crisfsbufr_db -rm atmsbufr atmsbufr_db atmsbufrears -rm satbias_in satbias_ang.in satbias_out gsiparm.anl satbias_pc satbias_pc.out satbias_out.int -rm aircftbias_in aircftbias_out -rm sfcf03 sfcf04 sfcf05 sfcf06 sfcf07 sfcf08 sfcf09 -rm sigf03 sigf04 sigf05 sigf06 sigf07 sigf08 sigf09 -rm siga03 siga04 siga05 siganl siga07 siga08 siga09 -rm nstf03 nstf04 nstf05 nstf06 nstf07 nstf08 nstf09 -rm nstanl -rm gesfile_in gesfiles_out -rm -rf dir* - -$NCP $GSIEXEC $DATA - -if [[ $FILESTYLE = 'C' ]]; then - export FCPLN=$NCP -else - export FCPLN="ln -fs" -fi - -# Fixed fields -$FCPLN $BERROR berror_stats -$FCPLN $SATANGL satbias_angle -$FCPLN $SATINFO satinfo -$FCPLN $RADCLOUDINFO cloudy_radiance_info.txt -$FCPLN $ATMSFILTER atms_beamwidth.txt -$FCPLN $ANAVINFO anavinfo -$FCPLN $CONVINFO convinfo -$FCPLN $INSITUINFO insituinfo -$FCPLN $OZINFO ozinfo -$FCPLN $PCPINFO pcpinfo -$FCPLN $AEROINFO aeroinfo -$FCPLN $SCANINFO scaninfo -$FCPLN $HYBENSINFO hybens_info -$FCPLN $LIGHTINFO lightinfo -$FCPLN $OBERROR errtable - -#If using correlated error, link to the covariance files -if grep -q "Rcov" $ANAVINFO ; -then - if ls ${FIXgsi}/Rcov* 1> /dev/null 2>&1; - then - $NLN ${FIXgsi}/Rcov* $DATA - else - echo "Warning: Satellite error covariance files are missing." - echo "Check for the required files in " $ANAVINFO - exit 1 - fi -fi - - -# CRTM Spectral and Transmittance coefficients -mkdir -p crtm_coeffs -for file in `awk '{if($1!~"!"){print $1}}' satinfo | sort | uniq` ;do - $FCPLN $RTMFIX/${file}.SpcCoeff.bin ./crtm_coeffs/ - $FCPLN $RTMFIX/${file}.TauCoeff.bin ./crtm_coeffs/ -done - -$FCPLN $RTMFIX/Nalli.IRwater.EmisCoeff.bin ./crtm_coeffs/Nalli.IRwater.EmisCoeff.bin -$FCPLN $RTMFIX/NPOESS.IRice.EmisCoeff.bin ./crtm_coeffs/NPOESS.IRice.EmisCoeff.bin -$FCPLN $RTMFIX/NPOESS.IRland.EmisCoeff.bin ./crtm_coeffs/NPOESS.IRland.EmisCoeff.bin -$FCPLN $RTMFIX/NPOESS.IRsnow.EmisCoeff.bin ./crtm_coeffs/NPOESS.IRsnow.EmisCoeff.bin -$FCPLN $RTMFIX/NPOESS.VISice.EmisCoeff.bin ./crtm_coeffs/NPOESS.VISice.EmisCoeff.bin -$FCPLN $RTMFIX/NPOESS.VISland.EmisCoeff.bin ./crtm_coeffs/NPOESS.VISland.EmisCoeff.bin -$FCPLN $RTMFIX/NPOESS.VISsnow.EmisCoeff.bin ./crtm_coeffs/NPOESS.VISsnow.EmisCoeff.bin -$FCPLN $RTMFIX/NPOESS.VISwater.EmisCoeff.bin ./crtm_coeffs/NPOESS.VISwater.EmisCoeff.bin -$FCPLN $RTMFIX/FASTEM6.MWwater.EmisCoeff.bin ./crtm_coeffs/FASTEM6.MWwater.EmisCoeff.bin -$FCPLN $RTMFIX/AerosolCoeff.bin ./crtm_coeffs/AerosolCoeff.bin -$FCPLN $RTMFIX/CloudCoeff.bin ./crtm_coeffs/CloudCoeff.bin - -# Observational data -$FCPLN $PREPQC prepbufr -$FCPLN $PREPQCPF prepbufr_profl -$FCPLN $SATWND satwndbufr -$FCPLN $OSCATBF oscatbufr -$FCPLN $RAPIDSCATBF rapidscatbufr -$FCPLN $GSNDBF gsndrbufr -$FCPLN $GSNDBF1 gsnd1bufr -$FCPLN $B1HRS2 hirs2bufr -$FCPLN $B1MSU msubufr -$FCPLN $B1HRS3 hirs3bufr -$FCPLN $B1HRS4 hirs4bufr -$FCPLN $B1AMUA amsuabufr -$FCPLN $B1AMUB amsubbufr -$FCPLN $B1MHS mhsbufr -$FCPLN $ESHRS3 hirs3bufrears -$FCPLN $ESAMUA amsuabufrears -$FCPLN $ESAMUB amsubbufrears -#$FCPLN $ESMHS mhsbufrears -$FCPLN $HRS3DB hirs3bufr_db -$FCPLN $AMUADB amsuabufr_db -$FCPLN $AMUBDB amsubbufr_db -#$FCPLN $MHSDB mhsbufr_db -$FCPLN $SBUVBF sbuvbufr -$FCPLN $GOMEBF gomebufr -$FCPLN $OMIBF omibufr -$FCPLN $MLSBF mlsbufr -$FCPLN $SMIPCP ssmirrbufr -$FCPLN $TMIPCP tmirrbufr -$FCPLN $AIRSBF airsbufr -$FCPLN $IASIBF iasibufr -$FCPLN $ESIASI iasibufrears -$FCPLN $IASIDB iasibufr_db -$FCPLN $AMSREBF amsrebufr -$FCPLN $AMSR2BF amsr2bufr -$FCPLN $GMI1CRBF gmibufr -$FCPLN $SAPHIRBF saphirbufr -$FCPLN $SEVIRIBF seviribufr -$FCPLN $CRISBF crisbufr -$FCPLN $ESCRIS crisbufrears -$FCPLN $CRISDB crisbufr_db -$FCPLN $CRISFSBF crisfsbufr -#$FCPLN $ESCRISFS crisfsbufrears -#$FCPLN $CRISFSDB crisfsbufr_db -$FCPLN $ATMSBF atmsbufr -$FCPLN $ESATMS atmsbufrears -$FCPLN $ATMSDB atmsbufr_db -$FCPLN $SSMITBF ssmitbufr -$FCPLN $SSMISBF ssmisbufr -$FCPLN $GPSROBF gpsrobufr -$FCPLN $GLMBF glmbufr -$FCPLN $TCVITL tcvitl -$FCPLN $NSSTBF nsstbufr -$FCPLN $B1AVHAM avhambufr -$FCPLN $B1AVHPM avhpmbufr -$FCPLN $AHIBF ahibufr - -# Required guess fields -$FCPLN $GBIAS satbias_in -$FCPLN $GBIASPC satbias_pc -$FCPLN $GRADSTAT radstat.gdas -$FCPLN $GBIASAIR aircftbias_in - -$FCPLN $SIGG03 sigf03 -$FCPLN $SIGGES sigf06 -$FCPLN $SIGG09 sigf09 -$FCPLN $SFCG03 sfcf03 -$FCPLN $SFCGES sfcf06 -$FCPLN $SFCG09 sfcf09 -$FCPLN $NSTG03 nstf03 -$FCPLN $NSTGES nstf06 -$FCPLN $NSTG09 nstf09 - -if [[ "$DOHYBVAR" = "YES" && $JCAP != JCAP_A && $JCAP_A = $JCAP_ENKF ]]; then - if [[ -e $SFCGESENS_MEAN ]]; then - USE_READIN_ANL_SFCMASK=.true. - $FCPLN $SFCGESENS_MEAN sfcf06_anlgrid - else - echo "Warning: Inconsistent sfc mask between analysis and ensemble grids used in hybrid EnKF" - fi -fi - -if [[ $NST_GSI -gt 0 ]]; then - if [[ $NST_GSI -eq 3 ]]; then - $FCPLN $SFCGCY sfcgcy - else - $FCPLN $SFCANL sfcgcy - fi -fi - -if [[ "$DOHYBVAR" = "YES" ]]; then - mkdir -p ensemble_data - imem=1 - while [[ $imem -le $NMEM_ENS ]]; do - member="_mem"`printf %03i $imem` - if [ $l4densvar = .true. ]; then - sigens3=${SIGF03ENS}${member} - sigens4=${SIGF04ENS}${member} - sigens5=${SIGF05ENS}${member} - sigens6=${SIGF06ENS}${member} - sigens7=${SIGF07ENS}${member} - sigens8=${SIGF08ENS}${member} - sigens9=${SIGF09ENS}${member} - $FCPLN $sigens3 ./ensemble_data/sigf03_ens${member} - $FCPLN $sigens4 ./ensemble_data/sigf04_ens${member} - $FCPLN $sigens5 ./ensemble_data/sigf05_ens${member} - $FCPLN $sigens6 ./ensemble_data/sigf06_ens${member} - $FCPLN $sigens7 ./ensemble_data/sigf07_ens${member} - $FCPLN $sigens8 ./ensemble_data/sigf08_ens${member} - $FCPLN $sigens9 ./ensemble_data/sigf09_ens${member} - else - sigens=${SIGGESENS}${member} - $FCPLN $sigens ./ensemble_data/sigf06_ens${member} - fi - (( imem = $imem + 1 )) - done -fi - - -## NOTE: 10/01/2003, r.treadon -## (1) While the global_gsi can handle hourly forecast -## files, we do not currently utilize hourly input. -## To prevent misleading error messages in operations, -## test for file existence before cp -## -## (2) File gesfile_in is not currently used in the global_gsi -## To prevent misleading error messages in operations, -## test for file existence before cp -## -## (3) File biascor_in is not currently used in the global_gsi -## To prevent misleading error messages in operations, -## test for file existence before cp - - -if [[ -s $SIGG04 ]]; then - $FCPLN $SIGG04 sigf04 -fi -if [[ -s $SIGG05 ]]; then - $FCPLN $SIGG05 sigf05 -fi -if [[ -s $SIGG07 ]]; then - $FCPLN $SIGG07 sigf07 -fi -if [[ -s $SIGG08 ]]; then - $FCPLN $SIGG08 sigf08 -fi - -if [[ -s $SFCG04 ]]; then - $FCPLN $SFCG04 sfcf04 -fi -if [[ -s $SFCG05 ]]; then - $FCPLN $SFCG05 sfcf05 -fi -if [[ -s $SFCG07 ]]; then - $FCPLN $SFCG07 sfcf07 -fi -if [[ -s $SFCG08 ]]; then - $FCPLN $SFCG08 sfcf08 -fi - -if [[ -s $NSTG04 ]]; then - $FCPLN $NSTG04 nstf04 -fi -if [[ -s $NSTG05 ]]; then - $FCPLN $NSTG05 nstf05 -fi -if [[ -s $NSTG07 ]]; then - $FCPLN $NSTG07 nstf07 -fi -if [[ -s $NSTG08 ]]; then - $FCPLN $NSTG08 nstf08 -fi - -if [[ -s $GINCIN ]]; then - $FCPLN $GINCIN gesfile_in -fi -if [[ -s $BIASIN ]]; then - $FCPLN $BIASIN biascor_in -fi - -## NOTE: 10/01/2003, r.treadon -## Do not add above file existence tests since -## we do not link to files in operations - -if [ $FILESTYLE != 'C' ]; then - - # Output files - ln -fs $SIGANL siganl - if [ $l4densvar = .true. -a $lwrite4danl = .true. ]; then - ln -fs $SIGA03 siga03 - ln -fs $SIGA04 siga04 - ln -fs $SIGA05 siga05 - ln -fs $SIGA07 siga07 - ln -fs $SIGA08 siga08 - ln -fs $SIGA09 siga09 - fi - ln -fs $ABIAS satbias_out - ln -fs $ABIASPC satbias_pc.out - ln -fs $GINCOUT gesfile_out - ln -fs $BIASOUT biascor_out - ln -fs $ABIASAIR aircftbias_out - - if [ $NST_GSI -gt 0 ] ; then - ln -fs $NSTANL nstanl - ln -fs $SFCTSK sfctsk - if [[ "$DOHYBVAR" = "YES" ]]; then - ln -fs $DTFANL dtfanl - fi - if [ $NST_GSI -eq 3 ] ; then - ln -fs $SFCANL sfcanl - fi - fi -# If requested, create obs_input tarball - if [[ "$RUN_SELECT" = "YES" ]]; then - ln -fs $SELECT_OBS obs_input.tar - fi - -fi - -# If requested, copy and de-tar obs_input -if [[ "$USE_SELECT" = "YES" ]]; then - rm obs_input* - $FCPLN $SELECT_OBS ./obs_input.tar - tar -xvf obs_input.tar -fi - - -# If requested, copy and de-tar guess radstat file -if [ $USE_NEWRADBC = YES -a $USE_RADSTAT = YES ]; then - - if [[ $USE_CFP = YES ]]; then - rm $DATA/unzip.sh - rm $DATA/mp_unzip.sh - set +x -cat <<\EOFunzip > unzip.sh -#!/bin/ksh -{ echo - set -aux - diag_file=$1 - fname=`echo $diag_file | cut -d'.' -f1` - date=`echo $diag_file | cut -d'.' -f2` - $UNCOMPRESS $diag_file - fnameges=$(echo $fname|sed 's/_ges//g') - mv $fname.$date $fnameges -} -EOFunzip - set -x - chmod 755 $DATA/unzip.sh - fi - - listdiag=`tar xvf radstat.gdas | cut -d' ' -f2 | grep _ges` - for type in $listdiag; do - diag_file=`echo $type | cut -d',' -f1` - if [[ $USE_CFP = YES ]] ; then - echo "$DATA/unzip.sh $diag_file" | tee -a $DATA/mp_unzip.sh - else - fname=`echo $diag_file | cut -d'.' -f1` - date=`echo $diag_file | cut -d'.' -f2` - $UNCOMPRESS $diag_file - fnameges=$(echo $fname|sed 's/_ges//g') - mv $fname.$date $fnameges - fi - done -fi -if [ $USE_CFP = YES -a $USE_RADSTAT = YES ] ; then - chmod 755 $DATA/mp_unzip.sh - ncmd=`cat $DATA/mp_unzip.sh | wc -l` - if [ $ncmd -gt 0 ]; then - export APRUNCFP_UNZIP=$(eval echo $APRUNCFP) - $APRUNCFP_UNZIP $DATA/mp_unzip.sh - fi -fi - - -# Create global_gsi namelist -cat < gsiparm.anl - &SETUP - miter=2,niter(1)=50,niter(2)=150, - niter_no_qc(1)=25,niter_no_qc(2)=0, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - qoption=2, - gencode=$IGEN,factqmin=5.0,factqmax=0.005,deltim=$DELTIM, - iguess=-1, - tzr_qc=$TZR_QC, - oneobtest=.false.,retrieval=.false.,l_foto=.false., - use_pbl=.false.,use_compress=.true.,nsig_ext=12,gpstop=50., - use_gfs_nemsio=${use_gfs_nemsio},use_readin_anl_sfcmask=${USE_READIN_ANL_SFCMASK},lrun_subdirs=${lrun_subdirs}, - crtm_coeffs_path='./crtm_coeffs/', - newpc4pred=.true.,adp_anglebc=.true.,angord=4,passive_bc=.true.,use_edges=.false., - diag_precon=.true.,step_start=1.e-3,emiss_bc=.true.,thin4d=.true.,cwoption=3, - $SETUP - / - &GRIDOPTS - JCAP_B=$JCAP,JCAP=$JCAP_A,NLAT=$NLAT_A,NLON=$NLON_A,nsig=$LEVS, - regional=.false.,nlayers(63)=3,nlayers(64)=6, - $GRIDOPTS - / - &BKGERR - vs=0.7, - hzscl=1.7,0.8,0.5, - hswgt=0.45,0.3,0.25, - bw=0.0,norsp=4, - bkgv_flowdep=.true.,bkgv_rewgtfct=1.5, - bkgv_write=.false., - cwcoveqqcov=.false., - $BKGVERR - / - &ANBKGERR - anisotropic=.false., - $ANBKGERR - / - &JCOPTS - ljcdfi=.false.,alphajc=0.0,ljcpdry=.true.,bamp_jcpdry=5.0e7, - $JCOPTS - / - &STRONGOPTS - tlnmc_option=2,nstrong=1,nvmodes_keep=8,period_max=6.,period_width=1.5, - $STRONGOPTS - / - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,oberrflg=.false.,c_varqc=0.04, - use_poq7=.true.,qc_noirjaco3_pole=.true.,vqc=.true., - aircraft_t_bc=.true.,biaspredt=1000.0,upd_aircraft=.true.,cleanup_tail=.true., - $OBSQC - / - &OBS_INPUT - dmesh(1)=145.0,dmesh(2)=150.0,dmesh(3)=100.0,time_window_max=3.0, - $OBSINPUT - / -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 0.0 0 0 - prepbufr t null t 0.0 0 0 - prepbufr_profl t null t 0.0 0 0 - prepbufr q null q 0.0 0 0 - prepbufr_profl q null q 0.0 0 0 - prepbufr pw null pw 0.0 0 0 - prepbufr uv null uv 0.0 0 0 - prepbufr_profl uv null uv 0.0 0 0 - satwndbufr uv null uv 0.0 0 0 - prepbufr spd null spd 0.0 0 0 - prepbufr dw null dw 0.0 0 0 - radarbufr rw null rw 0.0 0 0 - nsstbufr sst nsst sst 0.0 0 0 - gpsrobufr gps_bnd null gps 0.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 - sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 - hirs3bufr hirs3 n17 hirs3_n17 0.0 1 0 - hirs4bufr hirs4 metop-a hirs4_metop-a 0.0 1 1 - gimgrbufr goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs_aqua 0.0 1 1 - amsuabufr amsua n15 amsua_n15 0.0 1 1 - amsuabufr amsua n18 amsua_n18 0.0 1 1 - amsuabufr amsua metop-a amsua_metop-a 0.0 1 1 - airsbufr amsua aqua amsua_aqua 0.0 1 1 - amsubbufr amsub n17 amsub_n17 0.0 1 1 - mhsbufr mhs n18 mhs_n18 0.0 1 1 - mhsbufr mhs metop-a mhs_metop-a 0.0 1 1 - ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 - amsrebufr amsre_low aqua amsre_aqua 0.0 1 0 - amsrebufr amsre_mid aqua amsre_aqua 0.0 1 0 - amsrebufr amsre_hig aqua amsre_aqua 0.0 1 0 - ssmisbufr ssmis f16 ssmis_f16 0.0 1 0 - ssmisbufr ssmis f17 ssmis_f17 0.0 1 0 - ssmisbufr ssmis f18 ssmis_f18 0.0 1 0 - ssmisbufr ssmis f19 ssmis_f19 0.0 1 0 - gsnd1bufr sndrd1 g12 sndrD1_g12 0.0 1 0 - gsnd1bufr sndrd2 g12 sndrD2_g12 0.0 1 0 - gsnd1bufr sndrd3 g12 sndrD3_g12 0.0 1 0 - gsnd1bufr sndrd4 g12 sndrD4_g12 0.0 1 0 - gsnd1bufr sndrd1 g11 sndrD1_g11 0.0 1 0 - gsnd1bufr sndrd2 g11 sndrD2_g11 0.0 1 0 - gsnd1bufr sndrd3 g11 sndrD3_g11 0.0 1 0 - gsnd1bufr sndrd4 g11 sndrD4_g11 0.0 1 0 - gsnd1bufr sndrd1 g13 sndrD1_g13 0.0 1 0 - gsnd1bufr sndrd2 g13 sndrD2_g13 0.0 1 0 - gsnd1bufr sndrd3 g13 sndrD3_g13 0.0 1 0 - gsnd1bufr sndrd4 g13 sndrD4_g13 0.0 1 0 - iasibufr iasi metop-a iasi_metop-a 0.0 1 1 - gomebufr gome metop-a gome_metop-a 0.0 2 0 - omibufr omi aura omi_aura 0.0 2 0 - sbuvbufr sbuv2 n19 sbuv8_n19 0.0 0 0 - hirs4bufr hirs4 n19 hirs4_n19 0.0 1 1 - amsuabufr amsua n19 amsua_n19 0.0 1 1 - mhsbufr mhs n19 mhs_n19 0.0 1 1 - tcvitl tcp null tcp 0.0 0 0 - seviribufr seviri m08 seviri_m08 0.0 1 0 - seviribufr seviri m09 seviri_m09 0.0 1 0 - seviribufr seviri m10 seviri_m10 0.0 1 0 - hirs4bufr hirs4 metop-b hirs4_metop-b 0.0 1 1 - amsuabufr amsua metop-b amsua_metop-b 0.0 1 1 - mhsbufr mhs metop-b mhs_metop-b 0.0 1 1 - iasibufr iasi metop-b iasi_metop-b 0.0 1 1 - gomebufr gome metop-b gome_metop-b 0.0 2 0 - atmsbufr atms npp atms_npp 0.0 1 1 - atmsbufr atms n20 atms_n20 0.0 1 1 - crisbufr cris npp cris_npp 0.0 1 0 - crisfsbufr cris-fsr npp cris-fsr_npp 0.0 1 0 - crisfsbufr cris-fsr n20 cris-fsr_n20 0.0 1 0 - gsnd1bufr sndrd1 g14 sndrD1_g14 0.0 1 0 - gsnd1bufr sndrd2 g14 sndrD2_g14 0.0 1 0 - gsnd1bufr sndrd3 g14 sndrD3_g14 0.0 1 0 - gsnd1bufr sndrd4 g14 sndrD4_g14 0.0 1 0 - gsnd1bufr sndrd1 g15 sndrD1_g15 0.0 1 0 - gsnd1bufr sndrd2 g15 sndrD2_g15 0.0 1 0 - gsnd1bufr sndrd3 g15 sndrD3_g15 0.0 1 0 - gsnd1bufr sndrd4 g15 sndrD4_g15 0.0 1 0 - oscatbufr uv null uv 0.0 0 0 - mlsbufr mls30 aura mls30_aura 0.0 0 0 - avhambufr avhrr metop-a avhrr3_metop-a 0.0 1 0 - avhpmbufr avhrr n18 avhrr3_n18 0.0 1 0 - amsr2bufr amsr2 gcom-w1 amsr2_gcom-w1 0.0 3 0 - gmibufr gmi gpm gmi_gpm 0.0 3 0 - saphirbufr saphir meghat saphir_meghat 0.0 3 0 - ahibufr ahi himawari8 ahi_himawari8 0.0 3 0 - rapidscatbufr uv null uv 0.0 0 0 - glmbufr light g16 light 0.0 0 0 -:: - &SUPEROB_RADAR - $SUPERRAD - / - &LAG_DATA - $LAGDATA - / - &HYBRID_ENSEMBLE - ensemble_path='./ensemble_data/', - $HYBRID_ENSEMBLE - / - &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, - $RAPIDREFRESH_CLDSURF - / - &CHEM - $CHEM - / - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=180.,obpres=1000.,obdattim=${CDATE}, - obhourset=0., - $SINGLEOB - / - &NST - nst_gsi=$NST_GSI,nstinfo=$NSTINFO,fac_dtl=$FAC_DTL,fac_tsl=$FAC_TSL, - zsea1=$ZSEA1,zsea2=$ZSEA2, - $NST -/ -EOF - - -# Run global_gsi -eval $PGM < gsiparm.anl $REDOUT$PGMOUT $REDERR$PGMERR -rc=$? - -export ERR=$rc -export err=$ERR -$ERRSCRIPT||exit 2 - - -if [[ $FILESTYLE = 'C' ]]; then - # Output files - $NCP siganl $SIGANL - if [ $l4densvar = .true. -a $lwrite4danl = .true. ]; then - $NCP siga03 $SIGA03 - $NCP siga04 $SIGA04 - $NCP siga05 $SIGA05 - $NCP siga07 $SIGA07 - $NCP siga08 $SIGA08 - $NCP siga09 $SIGA09 - fi - $NCP satbias_out $ABIAS - $NCP satbias_pc.out $ABIASPC - $NCP aircftbias_out $ABIASAIR - if [[ -s gesfile_out ]]; then - $NCP gesfile_out $GINCOUT - fi - if [[ -s biascor_out ]]; then - $NCP biascor_out $BIASOUT - fi - if [ $NST_GSI -gt 0 ] ; then - $NCP nstanl $NSTANL - if [[ "$DOHYBVAR" = "YES" ]]; then - $NCP dtfanl $DTFANL - fi - if [ $NST_GSI -eq 3 ] ; then - $NCP sfcanl $SFCANL - fi - fi -fi - -# For eobs, eomn and eupd -if [[ -s satbias_out.int ]]; then - $NCP satbias_out.int $ABIASe -else - $NCP satbias_in $ABIASe -fi - -if test "$SAVEGES" = "YES" -then - cp $SFCANL $GESOUT/${PREINP}sfcanl - if [ $NST_GSI -gt 0 ] ; then - cp $NSTANL $GESOUT/${PREINP}nstanl - fi - cp $SIGANL $GESOUT/${PREINP}sanl - cp $ABIAS $GESOUT/${PREINP}abias - cp $ABIASPC $GESOUT/${PREINP}abias_pc - cp $ABIASAIR $GESOUT/${PREINP}abias_air -fi -if test "$SENDCOM" = "YES" -then - cp $SFCANL $COMOUT/${PREINP}sfcanl - cp $SIGANL $COMOUT/${PREINP}sanl - cp $ABIAS $COMOUT/${PREINP}abias - cp $ABIASPC $COMOUT/${PREINP}abias_pc - cp $ABIASAIR $COMOUT/${PREINP}abias_air - if [ $NST_GSI -gt 0 ] ; then - cp $NSTANL $COMOUT/${PREINP}nstanl - fi -fi - -############################################################## -# Add this statement to release the forecast job once the GSI -# step is completed. Do not release forecast when RUN=enkf -############################################################## -if [ "$SENDECF" = YES -a "$RUN" != enkf ] -then - ecflow_client --event release_fcst -fi - -# Cat runtime output files. -cat fort.2* > $GSISTAT -cat fort.2* - -# If requested, create obs_input tarball -if [[ "$RUN_SELECT" = "YES" ]]; then - echo $(date) START tar obs_input >&2 - rm obs_input.tar - if [[ $FILESTYLE = 'L' ]]; then - ln -fs $SELECT_OBS ./obs_input.tar - fi - tar -cvf obs_input.tar obs_input* - if [[ $FILESTYLE = 'C' ]]; then - $NCP obs_input.tar $SELECT_OBS - fi - chmod 750 $SELECT_OBS - ${CHGRP_CMD} $SELECT_OBS - echo $(date) END tar obs_input >&2 -fi - -# Loop over first and last outer loops to generate innovation -# diagnostic files for indicated observation types (groups) -# -# NOTE: Since we set miter=2 in GSI namelist SETUP, outer -# loop 03 will contain innovations with respect to -# the analysis. Creation of o-a innovation files -# is triggered by write_diag(3)=.true. The setting -# write_diag(1)=.true. turns on creation of o-g -# innovation files. -# - -cd $DATA # we should already be in $DATA, but extra cd to be sure. - -# Set up lists and variables for various types of diagnostic files. -ntype=3 - -diagtype[0]="conv" -diagtype[1]="pcp_ssmi_dmsp pcp_tmi_trmm" -diagtype[2]="sbuv2_n16 sbuv2_n17 sbuv2_n18 sbuv2_n19 gome_metop-a gome_metop-b omi_aura mls30_aura" -diagtype[3]="hirs2_n14 msu_n14 sndr_g08 sndr_g11 sndr_g12 sndr_g13 sndr_g08_prep sndr_g11_prep sndr_g12_prep sndr_g13_prep sndrd1_g11 sndrd2_g11 sndrd3_g11 sndrd4_g11 sndrd1_g12 sndrd2_g12 sndrd3_g12 sndrd4_g12 sndrd1_g13 sndrd2_g13 sndrd3_g13 sndrd4_g13 sndrd1_g14 sndrd2_g14 sndrd3_g14 sndrd4_g14 sndrd1_g15 sndrd2_g15 sndrd3_g15 sndrd4_g15 hirs3_n15 hirs3_n16 hirs3_n17 amsua_n15 amsua_n16 amsua_n17 amsub_n15 amsub_n16 amsub_n17 hsb_aqua airs_aqua amsua_aqua imgr_g08 imgr_g11 imgr_g12 imgr_g14 imgr_g15 ssmi_f13 ssmi_f15 hirs4_n18 hirs4_metop-a amsua_n18 amsua_metop-a mhs_n18 mhs_metop-a amsre_low_aqua amsre_mid_aqua amsre_hig_aqua ssmis_f16 ssmis_f17 ssmis_f18 ssmis_f19 ssmis_f20 iasi_metop-a hirs4_n19 amsua_n19 mhs_n19 seviri_m08 seviri_m09 seviri_m10 seviri_m11 cris_npp cris-fsr_npp cris-fsr_n20 atms_npp atms_n20 hirs4_metop-b amsua_metop-b mhs_metop-b iasi_metop-b avhrr_n18 avhrr_metop-a amsr2_gcom-w1 gmi_gpm saphir_meghat ahi_himawari8" -diagtype[4]="light" - -diaglist[0]=listcnv -diaglist[1]=listpcp -diaglist[2]=listozn -diaglist[3]=listrad -diaglist[4]=listlig - -diagfile[0]=$CNVSTAT -diagfile[1]=$PCPSTAT -diagfile[2]=$OZNSTAT -diagfile[3]=$RADSTAT -diagfile[4]=$LIGSTAT - -numfile[0]=0 -numfile[1]=0 -numfile[2]=0 -numfile[3]=0 - - -# Set diagnostic file prefix based on lrun_subdirs variable -if [ $lrun_subdirs = ".true." ]; then - prefix=" dir.*/" -else - prefix="pe*" -fi - -if [[ $USE_CFP = YES ]]; then - rm $DATA/diag.sh - rm $DATA/mp_diag.sh - set +x -cat <<\EOFdiag > $DATA/diag.sh -#!/bin/ksh -{ echo - set -aux - lrun_subdirs=$1 - type=$2 - loop=$3 - string=$4 - CDATE=$5 - DIAG_COMPRESS=$6 - DIAG_SUFFIX=$7 - if [ $lrun_subdirs = ".true." ]; then - prefix=" dir.*/" - else - prefix="pe*" - fi - file=diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} - cat ${prefix}${type}_${loop}* > $file - if [[ $DIAG_COMPRESS = YES ]]; then - $COMPRESS $file - fi -} -EOFdiag - set -x - chmod 755 $DATA/diag.sh -fi - -# Collect diagnostic files as a function of loop and type. -loops="01 03" -for loop in $loops; do - case $loop in - 01) string=ges;; - 03) string=anl;; - *) string=$loop;; - esac - echo $(date) START loop $string >&2 - n=-1 - while [ $((n+=1)) -le $ntype ] ;do - for type in `echo ${diagtype[n]}`; do - count=`ls ${prefix}${type}_${loop}* | $wc -l` - if [ $count -gt 0 ]; then - if [[ $USE_CFP = YES ]]; then - echo "$DATA/diag.sh $lrun_subdirs $type $loop $string $CDATE $DIAG_COMPRESS $DIAG_SUFFIX" | tee -a $DATA/mp_diag.sh - else - cat ${prefix}${type}_${loop}* > diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} - fi - echo "diag_${type}_${string}.${CDATE}*" >> ${diaglist[n]} - numfile[n]=`expr ${numfile[n]} + 1` - fi - done - done - echo $(date) END loop $string >&2 -done - -cd $DATA # we should already be in $DATA, but extra cd to be sure. - -# If requested, compress diagnostic files -if [ $DIAG_COMPRESS = YES -a $USE_CFP = NO ]; then - echo $(date) START $COMPRESS diagnostic files >&2 - for file in `ls diag_*${CDATE}${DIAG_SUFFIX}`; do - $COMPRESS $file - done - echo $(date) END $COMPRESS diagnostic files >&2 -fi - -if [[ $USE_CFP = YES ]] ; then - chmod 755 $DATA/mp_diag.sh - ncmd=`cat $DATA/mp_diag.sh | wc -l` - if [ $ncmd -gt 0 ]; then - export APRUNCFP_DIAG=$(eval echo $APRUNCFP) - $APRUNCFP_DIAG $DATA/mp_diag.sh - fi -fi - -# If requested, create diagnostic file tarballs -if [[ $DIAG_TARBALL = YES ]]; then - echo $(date) START tar diagnostic files >&2 - n=-1 - while [ $((n+=1)) -le $ntype ] ;do - TAROPTS="-uvf" - if [ ! -s ${diagfile[n]} ]; then - TAROPTS="-cvf" - fi - if [ ${numfile[n]} -gt 0 ]; then - tar $TAROPTS ${diagfile[n]} `cat ${diaglist[n]}` - fi - done - -# Restrict CNVSTAT - chmod 750 $CNVSTAT - ${CHGRP_CMD} $CNVSTAT - -# Restrict RADSTAT - chmod 750 $RADSTAT - ${CHGRP_CMD} $RADSTAT - - echo $(date) END tar diagnostic files >&2 -fi - - -################################################################################ - -if test "$RUN" = 'gdas' -then - if test "$SENDDBN" = 'YES' - then - $DBNROOT/bin/dbn_alert MODEL GDAS1RADSTAT $job $RADSTAT - fi -fi - -if test "$RUN" = 'gfs' -then - if test "$SENDDBN" = 'YES' - then - $DBNROOT/bin/dbn_alert MODEL GFS_abias $job $COMOUT/${PREINP}abias - fi -fi - -################################################################################ -# Postprocessing -cd $pwd -[[ $mkdata = YES ]]&&rmdir $DATA -$ENDSCRIPT - -set +x -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXITING $0 with return code $err >&2 -fi -exit $err diff --git a/scripts/exglobal_analysis_fv3gfs.sh.ecf b/scripts/exglobal_atmos_analysis.sh similarity index 94% rename from scripts/exglobal_analysis_fv3gfs.sh.ecf rename to scripts/exglobal_atmos_analysis.sh index ac1805feb..ebca996f3 100755 --- a/scripts/exglobal_analysis_fv3gfs.sh.ecf +++ b/scripts/exglobal_atmos_analysis.sh @@ -2,7 +2,7 @@ ################################################################################ #### UNIX Script Documentation Block # . . -# Script name: exglobal_analysis_fv3gfs.sh.ecf.sh +# Script name: exglobal_atmos_analysis.sh # Script description: Makes a global model upper air analysis with GSI # # Author: Rahul Mahajan Org: NCEP/EMC Date: 2017-03-02 @@ -26,18 +26,6 @@ fi # Directories. pwd=$(pwd) -export NWPROD=${NWPROD:-$pwd} -export HOMEgfs=${HOMEgfs:-$NWPROD} -export HOMEgsi=${HOMEgsi:-$NWPROD} -FIXgsi=${FIXgsi:-$HOMEgsi/fix} -GSIEXEC=${GSIEXEC:-$HOMEgsi/exec/global_gsi.x} -export DATA=${DATA:-$pwd/analysis.$$} -export COMIN=${COMIN:-$pwd} -export COMIN_OBS=${COMIN_OBS:-$COMIN} -export COMIN_GES=${COMIN_GES:-$COMIN} -export COMIN_GES_ENS=${COMIN_GES_ENS:-$COMIN_GES} -export COMIN_GES_OBS=${COMIN_GES_OBS:-$COMIN_GES} -export COMOUT=${COMOUT:-$COMIN} # Base variables CDATE=${CDATE:-"2001010100"} @@ -59,7 +47,6 @@ export NLN=${NLN:-"/bin/ln -sf"} export CHGRP_CMD=${CHGRP_CMD:-"chgrp ${group_name:-rstprod}"} export NEMSIOGET=${NEMSIOGET:-${NWPROD}/exec/nemsio_get} export NCLEN=${NCLEN:-$HOMEgfs/ush/getncdimlen} -export CATEXEC=${CATEXEC:-$HOMEgsi/exec/nc_diag_cat_serial.x} export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} COMPRESS=${COMPRESS:-gzip} UNCOMPRESS=${UNCOMPRESS:-gunzip} @@ -105,19 +92,20 @@ DOIAU=${DOIAU:-"NO"} export IAUFHRS=${IAUFHRS:-"6"} # Dependent Scripts and Executables +GSIEXEC=${GSIEXEC:-$HOMEgfs/exec/global_gsi.x} export NTHREADS_CALCINC=${NTHREADS_CALCINC:-1} export APRUN_CALCINC=${APRUN_CALCINC:-${APRUN:-""}} export APRUN_CALCANL=${APRUN_CALCANL:-${APRUN:-""}} export APRUN_CHGRES=${APRUN_CALCANL:-${APRUN:-""}} -export CALCINCEXEC=${CALCINCEXEC:-$HOMEgsi/exec/calc_increment_ens.x} -export CALCINCNCEXEC=${CALCINCNCEXEC:-$HOMEgsi/exec/calc_increment_ens_ncio.x} -export CALCANLEXEC=${CALCANLEXEC:-$HOMEgsi/exec/calc_analysis.x} -export CHGRESNCEXEC=${CHGRESNCEXEC:-$HOMEgfs/exec/chgres_recenter_ncio.exe} -export CHGRESINCEXEC=${CHGRESINCEXEC:-$HOMEgsi/exec/interp_inc.x} -CHGRESEXEC=${CHGRESEXEC:-$HOMEgfs/exec/chgres_recenter.exe} +export CALCINCEXEC=${CALCINCEXEC:-$HOMEgfs/exec/calc_increment_ens.x} +export CALCINCNCEXEC=${CALCINCNCEXEC:-$HOMEgfs/exec/calc_increment_ens_ncio.x} +export CALCANLEXEC=${CALCANLEXEC:-$HOMEgfs/exec/calc_analysis.x} +export CHGRESNCEXEC=${CHGRESNCEXEC:-$HOMEgfs/exec/enkf_chgres_recenter_nc.x} +export CHGRESINCEXEC=${CHGRESINCEXEC:-$HOMEgfs/exec/interp_inc.x} +CHGRESEXEC=${CHGRESEXEC:-$HOMEgfs/exec/enkf_chgres_recenter.x} export NTHREADS_CHGRES=${NTHREADS_CHGRES:-24} -CALCINCPY=${CALCINCPY:-$HOMEgsi/ush/calcinc_gfs.py} -CALCANLPY=${CALCANLPY:-$HOMEgsi/ush/calcanl_gfs.py} +CALCINCPY=${CALCINCPY:-$HOMEgfs/ush/calcinc_gfs.py} +CALCANLPY=${CALCANLPY:-$HOMEgfs/ush/calcanl_gfs.py} # OPS flags RUN=${RUN:-""} @@ -188,6 +176,7 @@ GPSROBF=${GPSROBF:-${COMIN_OBS}/${OPREFIX}gpsro.tm00.bufr_d${OSUFFIX}} TCVITL=${TCVITL:-${COMIN_OBS}/${OPREFIX}syndata.tcvitals.tm00} B1AVHAM=${B1AVHAM:-${COMIN_OBS}/${OPREFIX}avcsam.tm00.bufr_d${OSUFFIX}} B1AVHPM=${B1AVHPM:-${COMIN_OBS}/${OPREFIX}avcspm.tm00.bufr_d${OSUFFIX}} +HDOB=${HDOB:-${COMIN_OBS}/${OPREFIX}hdob.tm00.bufr_d${OSUFFIX}} # Guess files GPREFIX=${GPREFIX:-""} @@ -243,7 +232,12 @@ fi DIAG_COMPRESS=${DIAG_COMPRESS:-"YES"} DIAG_TARBALL=${DIAG_TARBALL:-"YES"} USE_CFP=${USE_CFP:-"NO"} -DIAG_DIR=${COMOUT}/${APREFIX}gsidiags +CFP_MP=${CFP_MP:-"NO"} +nm="" +if [ $CFP_MP = "YES" ]; then + nm=0 +fi +DIAG_DIR=${DIAG_DIR:-${COMOUT}/gsidiags} # Set script / GSI control parameters DOHYBVAR=${DOHYBVAR:-"NO"} @@ -417,45 +411,6 @@ fi cd $DATA || exit 99 -################################################################################ -# Clean the run-directory -rm berror_stats hybens_info -rm scaninfo satbias_angle satinfo -rm anavinfo convinfo ozinfo pcpinfo aeroinfo vqctp001.dat -rm errtable atms_beamwidth.txt -rm cloudy_radiance_info.txt - -rm prepbufr prepbufr_profl -rm gpsrobufr -rm tcvitl -rm gsndrbufr gsnd1bufr -rm ssmisbufr ssmitbufr ssmirrbufr tmirrbufr -rm sbuvbufr gomebufr omibufr mlsbufr msubufr ompsnpbufr ompstcbufr -rm airsbufr -rm iasibufr iasibufrears iasibufr_db -rm amsrebufr amsr2bufr -rm gmibufr saphirbufr -rm hirs2bufr hirs3bufr hirs4bufr hirs3bufr_db hirs3bufrears -rm amsuabufr amsuabufr_db amsuabufrears -rm amsubbufr amsubbufr_db amsubbufrears -rm mhsbufr mhsbufr_db mhsbufrears -rm seviribufr ahibufr abibufr -rm crisbufr crisbufrears crisbufr_db crisfsbufr crisfsbufrears crisfsbufr_db -rm atmsbufr atmsbufr_db atmsbufrears - -rm satbias_in satbias_ang.in satbias_out satbias_pc satbias_pc.out satbias_out.int -rm aircftbias_in aircftbias_out - -rm sfcf* sigf* nstf* -rm sfca* siga* nsta* -rm sigi* - -rm gsiparm.anl - -rm -rf dir* -rm -rf crtm_coeffs -rm -rf ensemble_data - ############################################################## # Fixed files $NLN $BERROR berror_stats @@ -481,12 +436,12 @@ if [ $USE_CORRELATED_OBERRS == "YES" ]; then $NLN ${FIXgsi}/Rcov* $DATA echo "using correlated obs error" else - echo "Error: Satellite error covariance files are missing." + echo "FATAL ERROR: Satellite error covariance files (Rcov) are missing." echo "Check for the required Rcov files in " $ANAVINFO exit 1 fi else - echo "Error: Satellite error covariance info missing in " $ANAVINFO + echo "FATAL ERROR: Satellite error covariance info missing in " $ANAVINFO exit 1 fi @@ -577,6 +532,7 @@ $NLN $B1AVHAM avhambufr $NLN $B1AVHPM avhpmbufr $NLN $AHIBF ahibufr $NLN $ABIBF abibufr +$NLN $HDOB hdobbufr [[ $DONST = "YES" ]] && $NLN $NSSTBF nsstbufr @@ -668,7 +624,7 @@ if [ $GENDIAG = "YES" ] ; then $NLN $DIAG_DIR/$pedir $pedir done else - echo "lrun_subdirs must be true; exit with error" + echo "FATAL ERROR: lrun_subdirs must be true. lrun_subdirs=$lrun_subdirs" $ERRSCRIPT || exit 2 fi fi @@ -721,7 +677,8 @@ fi # If requested, copy and de-tar guess radstat file if [ $USE_RADSTAT = "YES" ]; then if [ $USE_CFP = "YES" ]; then - rm $DATA/unzip.sh $DATA/mp_unzip.sh + [[ -f $DATA/unzip.sh ]] && rm $DATA/unzip.sh + [[ -f $DATA/mp_unzip.sh ]] && rm $DATA/mp_unzip.sh cat > $DATA/unzip.sh << EOFunzip #!/bin/sh diag_file=\$1 @@ -739,7 +696,10 @@ EOFunzip for type in $listdiag; do diag_file=$(echo $type | cut -d',' -f1) if [ $USE_CFP = "YES" ] ; then - echo "$DATA/unzip.sh $diag_file $DIAG_SUFFIX" | tee -a $DATA/mp_unzip.sh + echo "$nm $DATA/unzip.sh $diag_file $DIAG_SUFFIX" | tee -a $DATA/mp_unzip.sh + if [ ${CFP_MP:-"NO"} = "YES" ]; then + nm=$((nm+1)) + fi else fname=$(echo $diag_file | cut -d'.' -f1) date=$(echo $diag_file | cut -d'.' -f2) @@ -756,6 +716,9 @@ EOFunzip ncmd_max=$((ncmd < npe_node_max ? ncmd : npe_node_max)) APRUNCFP_UNZIP=$(eval echo $APRUNCFP) $APRUNCFP_UNZIP $DATA/mp_unzip.sh + export ERR=$? + export err=$ERR + $ERRSCRIPT || exit 3 fi fi fi # if [ $USE_RADSTAT = "YES" ] @@ -850,13 +813,17 @@ OBS_INPUT:: prepbufr ps null ps 0.0 0 0 prepbufr t null t 0.0 0 0 prepbufr_profl t null t 0.0 0 0 + hdobbufr t null t 0.0 0 0 prepbufr q null q 0.0 0 0 prepbufr_profl q null q 0.0 0 0 + hdobbufr q null q 0.0 0 0 prepbufr pw null pw 0.0 0 0 prepbufr uv null uv 0.0 0 0 prepbufr_profl uv null uv 0.0 0 0 satwndbufr uv null uv 0.0 0 0 + hdobbufr uv null uv 0.0 0 0 prepbufr spd null spd 0.0 0 0 + hdobbufr spd null spd 0.0 0 0 prepbufr dw null dw 0.0 0 0 radarbufr rw null rw 0.0 0 0 nsstbufr sst nsst sst 0.0 0 0 @@ -983,14 +950,19 @@ EOF cat gsiparm.anl ############################################################## -# Make atmospheric analysis -$NCP $GSIEXEC $DATA/gsi.x +# Run gsi analysis + export OMP_NUM_THREADS=$NTHREADS_GSI -$APRUN_GSI ${DATA}/gsi.x 1>&1 2>&2 +export pgm=$GSIEXEC +. prep_step + +$NCP $GSIEXEC $DATA +$APRUN_GSI ${DATA}/$(basename $GSIEXEC) 1>&1 2>&2 +rc=$? -export ERR=$? +export ERR=$rc export err=$ERR -$ERRSCRIPT || exit 2 +$ERRSCRIPT || exit 4 ############################################################## @@ -1002,7 +974,7 @@ if [ $DO_CALC_INCREMENT = "YES" ]; then export ERR=$rc export err=$ERR - $ERRSCRIPT || exit 3 + $ERRSCRIPT || exit 5 fi ############################################################## @@ -1098,7 +1070,7 @@ cat fort.2* > $GSISTAT # If requested, create obsinput tarball from obs_input.* files if [ $RUN_SELECT = "YES" ]; then echo $(date) START tar obs_input >&2 - rm obsinput.tar + [[ -s obsinput.tar ]] && rm obsinput.tar $NLN $SELECT_OBS obsinput.tar tar -cvf obsinput.tar obs_input.* chmod 750 $SELECT_OBS @@ -1107,6 +1079,14 @@ if [ $RUN_SELECT = "YES" ]; then echo $(date) END tar obs_input >&2 fi +################################################################################ +# Send alerts +if [ $SENDDBN = "YES" ]; then + if [ $RUN = "gfs" ]; then + $DBNROOT/bin/dbn_alert MODEL GFS_abias $job $ABIAS + fi +fi + ################################################################################ # Postprocessing cd $pwd diff --git a/scripts/exglobal_analcalc_fv3gfs.sh.ecf b/scripts/exglobal_atmos_analysis_calc.sh similarity index 84% rename from scripts/exglobal_analcalc_fv3gfs.sh.ecf rename to scripts/exglobal_atmos_analysis_calc.sh index c40b7c978..7204af81f 100755 --- a/scripts/exglobal_analcalc_fv3gfs.sh.ecf +++ b/scripts/exglobal_atmos_analysis_calc.sh @@ -2,7 +2,7 @@ ################################################################################ #### UNIX Script Documentation Block # . . -# Script name: exglobal_anlcalc_fv3gfs.sh.ecf.sh +# Script name: exglobal_atmos_analysis_calc.sh # Script description: Runs non-diagnostic file tasks after GSI analysis is performed # # Author: Cory Martin Org: NCEP/EMC Date: 2020-03-03 @@ -26,17 +26,7 @@ fi # Directories. pwd=$(pwd) -export NWPROD=${NWPROD:-$pwd} -export HOMEgfs=${HOMEgfs:-$NWPROD} -export HOMEgsi=${HOMEgsi:-$NWPROD} export FIXgsm=${FIXgsm:-$HOMEgfs/fix/fix_am} -export DATA=${DATA:-$pwd/anlcalc.$$} -export COMIN=${COMIN:-$pwd} -export COMIN_OBS=${COMIN_OBS:-$COMIN} -export COMIN_GES=${COMIN_GES:-$COMIN} -export COMIN_GES_ENS=${COMIN_GES_ENS:-$COMIN_GES} -export COMIN_GES_OBS=${COMIN_GES_OBS:-$COMIN_GES} -export COMOUT=${COMOUT:-$COMIN} # Base variables CDATE=${CDATE:-"2001010100"} @@ -58,7 +48,6 @@ export NLN=${NLN:-"/bin/ln -sf"} export CHGRP_CMD=${CHGRP_CMD:-"chgrp ${group_name:-rstprod}"} export NEMSIOGET=${NEMSIOGET:-${NWPROD}/exec/nemsio_get} export NCLEN=${NCLEN:-$HOMEgfs/ush/getncdimlen} -export CATEXEC=${CATEXEC:-$HOMEgsi/exec/nc_diag_cat_serial.x} export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} COMPRESS=${COMPRESS:-gzip} UNCOMPRESS=${UNCOMPRESS:-gunzip} @@ -78,12 +67,12 @@ export APRUN_CALCINC=${APRUN_CALCINC:-${APRUN:-""}} export APRUN_CALCANL=${APRUN_CALCANL:-${APRUN:-""}} export APRUN_CHGRES=${APRUN_CALCANL:-${APRUN:-""}} -export CALCANLEXEC=${CALCANLEXEC:-$HOMEgsi/exec/calc_analysis.x} -export CHGRESNCEXEC=${CHGRESNCEXEC:-$HOMEgfs/exec/chgres_recenter_ncio.exe} -export CHGRESINCEXEC=${CHGRESINCEXEC:-$HOMEgsi/exec/interp_inc.x} +export CALCANLEXEC=${CALCANLEXEC:-$HOMEgfs/exec/calc_analysis.x} +export CHGRESNCEXEC=${CHGRESNCEXEC:-$HOMEgfs/exec/enkf_chgres_recenter_nc.x} +export CHGRESINCEXEC=${CHGRESINCEXEC:-$HOMEgfs/exec/interp_inc.x} export NTHREADS_CHGRES=${NTHREADS_CHGRES:-1} -CALCINCPY=${CALCINCPY:-$HOMEgsi/ush/calcinc_gfs.py} -CALCANLPY=${CALCANLPY:-$HOMEgsi/ush/calcanl_gfs.py} +CALCINCPY=${CALCINCPY:-$HOMEgfs/ush/calcinc_gfs.py} +CALCANLPY=${CALCANLPY:-$HOMEgfs/ush/calcanl_gfs.py} DOGAUSFCANL=${DOGAUSFCANL-"NO"} GAUSFCANLSH=${GAUSFCANLSH:-$HOMEgfs/ush/gaussian_sfcanl.sh} @@ -106,9 +95,6 @@ ATMGES=${ATMGES:-${COMIN_GES}/${GPREFIX}atmf006${GSUFFIX}} ATMG07=${ATMG07:-${COMIN_GES}/${GPREFIX}atmf007${GSUFFIX}} ATMG08=${ATMG08:-${COMIN_GES}/${GPREFIX}atmf008${GSUFFIX}} ATMG09=${ATMG09:-${COMIN_GES}/${GPREFIX}atmf009${GSUFFIX}} -GBIAS=${GBIAS:-${COMIN_GES}/${GPREFIX}abias} -GBIASPC=${GBIASPC:-${COMIN_GES}/${GPREFIX}abias_pc} -GBIASAIR=${GBIASAIR:-${COMIN_GES}/${GPREFIX}abias_air} # Analysis files export APREFIX=${APREFIX:-""} @@ -224,14 +210,6 @@ fi echo "$CDUMP $CDATE atmanl and sfcanl done at `date`" > $COMOUT/${APREFIX}loganl.txt -################################################################################ -# Send alerts -if [ $SENDDBN = "YES" ]; then - if [ $RUN = "gfs" ]; then - $DBNROOT/bin/dbn_alert MODEL GFS_abias $job $ABIAS - fi -fi - ################################################################################ # Postprocessing cd $pwd diff --git a/scripts/exglobal_analdiag_fv3gfs.sh.ecf b/scripts/exglobal_diag.sh similarity index 81% rename from scripts/exglobal_analdiag_fv3gfs.sh.ecf rename to scripts/exglobal_diag.sh index ad07327f2..1afc49f24 100755 --- a/scripts/exglobal_analdiag_fv3gfs.sh.ecf +++ b/scripts/exglobal_diag.sh @@ -2,7 +2,7 @@ ################################################################################ #### UNIX Script Documentation Block # . . -# Script name: exglobal_analdiag_fv3gfs.sh.ecf.sh +# Script name: exglobal_diag.sh # Script description: Creates diagnostic files after GSI analysis is performed # # Author: Cory Martin Org: NCEP/EMC Date: 2020-03-03 @@ -19,24 +19,13 @@ # Set environment. export VERBOSE=${VERBOSE:-"YES"} -if [ $VERBOSE = "YES" ]; then +if [[ "$VERBOSE" = "YES" ]]; then echo $(date) EXECUTING $0 $* >&2 set -x fi # Directories. pwd=$(pwd) -export NWPROD=${NWPROD:-$pwd} -export HOMEgfs=${HOMEgfs:-$NWPROD} -export HOMEgsi=${HOMEgsi:-$NWPROD} -export FIXgsm=${FIXgsm:-$HOMEgfs/fix/fix_am} -export DATA=${DATA:-$pwd/analdiag.$$} -export COMIN=${COMIN:-$pwd} -export COMIN_OBS=${COMIN_OBS:-$COMIN} -export COMIN_GES=${COMIN_GES:-$COMIN} -export COMIN_GES_ENS=${COMIN_GES_ENS:-$COMIN_GES} -export COMIN_GES_OBS=${COMIN_GES_OBS:-$COMIN_GES} -export COMOUT=${COMOUT:-$COMIN} # Base variables CDATE=${CDATE:-"2001010100"} @@ -58,7 +47,7 @@ export NLN=${NLN:-"/bin/ln -sf"} export CHGRP_CMD=${CHGRP_CMD:-"chgrp ${group_name:-rstprod}"} export NEMSIOGET=${NEMSIOGET:-${NWPROD}/exec/nemsio_get} export NCLEN=${NCLEN:-$HOMEgfs/ush/getncdimlen} -export CATEXEC=${CATEXEC:-$HOMEgsi/exec/nc_diag_cat_serial.x} +export CATEXEC=${CATEXEC:-$HOMEgfs/exec/ncdiag_cat.x} export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} COMPRESS=${COMPRESS:-gzip} UNCOMPRESS=${UNCOMPRESS:-gunzip} @@ -84,10 +73,10 @@ CNVSTAT=${CNVSTAT:-${COMOUT}/${APREFIX}cnvstat} OZNSTAT=${OZNSTAT:-${COMOUT}/${APREFIX}oznstat} # Remove stat file if file already exists -if [ -s $RADSTAT ]; then rm -f $RADSTAT; fi -if [ -s $PCPSTAT ]; then rm -f $PCPSTAT; fi -if [ -s $CNVSTAT ]; then rm -f $CNVSTAT; fi -if [ -s $OZNSTAT ]; then rm -f $OZNSTAT; fi +[[ -s $RADSTAT ]] && rm -f $RADSTAT +[[ -s $PCPSTAT ]] && rm -f $PCPSTAT +[[ -s $CNVSTAT ]] && rm -f $CNVSTAT +[[ -s $OZNSTAT ]] && rm -f $OZNSTAT # Obs diag GENDIAG=${GENDIAG:-"YES"} @@ -98,7 +87,13 @@ fi DIAG_COMPRESS=${DIAG_COMPRESS:-"YES"} DIAG_TARBALL=${DIAG_TARBALL:-"YES"} USE_CFP=${USE_CFP:-"NO"} -DIAG_DIR=${COMOUT}/${APREFIX}gsidiags/ +CFP_MP=${CFP_MP:-"NO"} +nm="" +if [ $CFP_MP = "YES" ]; then + nm=0 +fi +DIAG_DIR=${DIAG_DIR:-${COMOUT}/gsidiags} +REMOVE_DIAG_DIR=${REMOVE_DIAG_DIR:-"NO"} # Set script / GSI control parameters lrun_subdirs=${lrun_subdirs:-".true."} @@ -114,13 +109,15 @@ if [ $GENDIAG = "YES" ] ; then done else echo "lrun_subdirs must be true; exit with error" + export ERR=$? + export err=$ERR $ERRSCRIPT || exit 2 fi # Set up lists and variables for various types of diagnostic files. ntype=3 - diagtype[0]="conv conv_gps conv_ps conv_pw conv_q conv_sst conv_t conv_tcp conv_uv" + diagtype[0]="conv conv_gps conv_ps conv_pw conv_q conv_sst conv_t conv_tcp conv_uv conv_spd" diagtype[1]="pcp_ssmi_dmsp pcp_tmi_trmm" diagtype[2]="sbuv2_n16 sbuv2_n17 sbuv2_n18 sbuv2_n19 gome_metop-a gome_metop-b omi_aura mls30_aura ompsnp_npp ompstc8_npp gome_metop-c" diagtype[3]="hirs2_n14 msu_n14 sndr_g08 sndr_g11 sndr_g12 sndr_g13 sndr_g08_prep sndr_g11_prep sndr_g12_prep sndr_g13_prep sndrd1_g11 sndrd2_g11 sndrd3_g11 sndrd4_g11 sndrd1_g12 sndrd2_g12 sndrd3_g12 sndrd4_g12 sndrd1_g13 sndrd2_g13 sndrd3_g13 sndrd4_g13 sndrd1_g14 sndrd2_g14 sndrd3_g14 sndrd4_g14 sndrd1_g15 sndrd2_g15 sndrd3_g15 sndrd4_g15 hirs3_n15 hirs3_n16 hirs3_n17 amsua_n15 amsua_n16 amsua_n17 amsub_n15 amsub_n16 amsub_n17 hsb_aqua airs_aqua amsua_aqua imgr_g08 imgr_g11 imgr_g12 imgr_g14 imgr_g15 ssmi_f13 ssmi_f15 hirs4_n18 hirs4_metop-a amsua_n18 amsua_metop-a mhs_n18 mhs_metop-a amsre_low_aqua amsre_mid_aqua amsre_hig_aqua ssmis_f16 ssmis_f17 ssmis_f18 ssmis_f19 ssmis_f20 iasi_metop-a hirs4_n19 amsua_n19 mhs_n19 seviri_m08 seviri_m09 seviri_m10 seviri_m11 cris_npp cris-fsr_npp cris-fsr_n20 atms_npp atms_n20 hirs4_metop-b amsua_metop-b mhs_metop-b iasi_metop-b avhrr_metop-b avhrr_n18 avhrr_n19 avhrr_metop-a amsr2_gcom-w1 gmi_gpm saphir_meghat ahi_himawari8 abi_g16 abi_g17 amsua_metop-c mhs_metop-c iasi_metop-c avhrr_metop-c" @@ -148,7 +145,8 @@ if [ $GENDIAG = "YES" ] ; then fi if [ $USE_CFP = "YES" ]; then - rm $DATA/diag.sh $DATA/mp_diag.sh + [[ -f $DATA/diag.sh ]] && rm $DATA/diag.sh + [[ -f $DATA/mp_diag.sh ]] && rm $DATA/mp_diag.sh cat > $DATA/diag.sh << EOFdiag #!/bin/sh lrun_subdirs=\$1 @@ -199,10 +197,13 @@ EOFdiag n=-1 while [ $((n+=1)) -le $ntype ] ;do for type in $(echo ${diagtype[n]}); do - count=$(ls ${prefix}${type}_${loop}* | wc -l) - if [ $count -gt 0 ]; then + count=$(ls ${prefix}${type}_${loop}* 2>/dev/null | wc -l) + if [ $count -gt 1 ]; then if [ $USE_CFP = "YES" ]; then - echo "$DATA/diag.sh $lrun_subdirs $binary_diag $type $loop $string $CDATE $DIAG_COMPRESS $DIAG_SUFFIX" | tee -a $DATA/mp_diag.sh + echo "$nm $DATA/diag.sh $lrun_subdirs $binary_diag $type $loop $string $CDATE $DIAG_COMPRESS $DIAG_SUFFIX" | tee -a $DATA/mp_diag.sh + if [ ${CFP_MP:-"NO"} = "YES" ]; then + nm=$((nm+1)) + fi else if [ $binary_diag = ".true." ]; then cat ${prefix}${type}_${loop}* > diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} @@ -212,6 +213,13 @@ EOFdiag fi echo "diag_${type}_${string}.${CDATE}*" >> ${diaglist[n]} numfile[n]=$(expr ${numfile[n]} + 1) + elif [ $count -eq 1 ]; then + cat ${prefix}${type}_${loop}* > diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} + if [ $DIAG_COMPRESS = "YES" ]; then + $COMPRESS diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} + fi + echo "diag_${type}_${string}.${CDATE}*" >> ${diaglist[n]} + numfile[n]=$(expr ${numfile[n]} + 1) fi done done @@ -236,18 +244,10 @@ EOFdiag if [ $ncmd -gt 0 ]; then ncmd_max=$((ncmd < npe_node_max ? ncmd : npe_node_max)) APRUNCFP_DIAG=$(eval echo $APRUNCFP) - if [ ${CFP_MP:-"NO"} = "YES" ]; then - if [ -s $DATA/mp_diag_srun.sh ]; then rm -f $DATA/mp_diag_srun.sh; fi - touch $DATA/mp_diag_srun.sh - nm=0 - cat $DATA/mp_diag.sh | while read line; do - echo "$nm $line" >> $DATA/mp_diag_srun.sh - nm=$((nm+1)) - done - $APRUNCFP_DIAG -n $nm --multi-prog $DATA/mp_diag_srun.sh - else - $APRUNCFP_DIAG $DATA/mp_diag.sh - fi + $APRUNCFP_DIAG $DATA/mp_diag.sh + export ERR=$? + export err=$ERR + $ERRSCRIPT || exit 3 fi fi @@ -262,6 +262,9 @@ EOFdiag fi if [ ${numfile[n]} -gt 0 ]; then tar $TAROPTS ${diagfile[n]} $(cat ${diaglist[n]}) + export ERR=$? + export err=$ERR + $ERRSCRIPT || exit 4 fi done @@ -278,20 +281,17 @@ EOFdiag fi # End diagnostic file generation block - if [ $GENDIAG = "YES" ] ################################################################################ -# Send alerts -if [ $SENDDBN = "YES" ]; then - if [ $RUN = "gdas" ]; then - $DBNROOT/bin/dbn_alert MODEL GDASRADSTAT $job $RADSTAT - fi +# Postprocessing +# If no processing error, remove $DIAG_DIR +if [[ "$REMOVE_DIAG_DIR" = "YES" && "$err" = "0" ]]; then + rm -rf $DIAG_DIR fi -################################################################################ -# Postprocessing cd $pwd [[ $mkdata = "YES" ]] && rm -rf $DATA set +x -if [ $VERBOSE = "YES" ]; then +if [[ "$VERBOSE" = "YES" ]]; then echo $(date) EXITING $0 with return code $err >&2 fi exit $err diff --git a/scripts/exglobal_enkf_fcst.sh.ecf b/scripts/exglobal_enkf_fcst.sh.ecf deleted file mode 100755 index 2de38101a..000000000 --- a/scripts/exglobal_enkf_fcst.sh.ecf +++ /dev/null @@ -1,464 +0,0 @@ -#!/bin/ksh -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: exglobal_enkffcs.sh.sms -# Script description: Run global_enkf ensemble forecasts -# -# Author: Russ Treadon Org: NP23 Date: 2011-12-16 -# -# Abstract: This script runs global_enkf ensemble forecasts -# -# Script history log: -# 2011-12-16 Russ Treadon based on GCWMB parallel script efcs.sh -# other upgrades related to model changes -# 2014-05-16 Xu Li Add NSST -# -# Input script positional parameters: -# -# Imported Shell Variables: -# FIXgsm Directory for global fixed files -# defaults to /nwprod/fix -# EXECgsm Directory for global executables -# defaults to /nwprod/exec -# DATA working directory -# (if nonexistent will be made, used and deleted) -# defaults to current working directory -# COMIN Path to input sigma and surface analysis files -# defalts to pwd -# COMOUT output directory -# (if nonexistent will be made) -# defaults to current working directory -# SUFOUT Suffix to add to output filenames -# defaults to unique ensemble member -# NCP Copy command -# defaults to cp -# JCAP Spectral truncation -# defaults to 254 -# LEVS Number of levels -# defaults to 64 -# FCSTEXEC Forecast executable -# defaults to ${EXECgsm}/global_fcst$XC -# OROGRAPHY Input orography GRIB file (horiz resolution dependent) -# defaults to ${FIXgsm}/global_orography.t$JCAP.grb -# OROGRAPHY_UF Input unfiltered orography GRIB file (resolution dependent) -# defaults to ${FIXgsm}/global_orography_uf.t$JCAP.grb -# LONSPERLAT Input txt file containing reduced grid information -# defaults to ${FIXgsm}/global_lonsperlat.t$MTNRSL.txt} -# FNMSKH Input high resolution land mask GRIB file -# defaults to ${FIXgsm}/seaice_newland.grb -# INISCRIPT Preprocessing script -# defaults to none -# LOGSCRIPT Log posting script -# defaults to none -# ERRSCRIPT Error processing script -# defaults to 'eval [[ $err = 0 ]]' -# ENDSCRIPT Postprocessing script -# defaults to none -# FHDFI_ENKF Half number of hours of digital filter initialization -# defaults to 0 -# FHCYC_ENKF Surface cycling frequency in hours -# defaults to 0 for no cycling -# FCSTVARS Other namelist inputs to the forecast executable -# defaults to none set -# FSMCL2 Scale in days to relax to soil moisture climatology -# defaults to 99999 for no relaxation -# NTHREADS Number of threads -# defaults to 2 -# NTHSTACK Size of stack per thread -# defaults to 1024000000 -# FILESTYLE File management style flag -# ('C' to copy to/from $DATA, 'L' for symbolic links in $DATA, -# 'X' to use XLFUNIT or symbolic links where appropriate) -# defaults to 'X' -# PGMOUT Executable standard output -# defaults to $pgmout, then to '&1' -# PGMERR Executable standard error -# defaults to $pgmerr, then to '&1' -# pgmout Executable standard output default -# pgmerr Executable standard error default -# REDOUT standard output redirect ('1>' or '1>>') -# defaults to '1>', or to '1>>' to append if $PGMOUT is a file -# REDERR standard error redirect ('2>' or '2>>') -# defaults to '2>', or to '2>>' to append if $PGMERR is a file -# VERBOSE Verbose flag (YES or NO) -# defaults to YES -# -# Exported Shell Variables: -# PGM Current program name -# pgm -# ERR Last return code -# err -# -# Modules and files referenced: -# scripts : $INISCRIPT -# $LOGSCRIPT -# $ERRSCRIPT -# $ENDSCRIPT -# -# programs : $FCSTEXEC -# -# input data : -# -# fixed data : $FNOROG -# $FNMASK -# $OROGRAPHY -# $OROGRAPHY_UF -# $LONSPERLAT -# $SLMASK -# -# output data: -# $PGMOUT -# $PGMERR -# -# scratch : -# -# Remarks: -# -# Condition codes -# 0 - no problem encountered -# >0 - some problem encountered -# -# Control variable resolution priority -# 1 Command line argument. -# 2 Environment variable. -# 3 Inline default. -# -# Attributes: -# Language: POSIX shell -# Machine: IBM SP -# -#### -################################################################################ -# Set environment. -export VERBOSE=${VERBOSE:-"NO"} -if [[ "$VERBOSE" = "YES" ]] ; then - echo $(date) EXECUTING $0 $* >&2 - set -x -fi -export machine=${machine:-WCOSS} -export machine=$(echo $machine|tr '[a-z]' '[A-Z]') - -# Command line arguments. -# *** currently none *** - -# Directories. -#-------------- -export HOMEDIR=${HOMEDIR:-$NWROOT} -export NWPROD=${NWPROD:-$HOMEDIR} -export FIXSUBDA=${FIXSUBDA:-fix/fix_am} -export FIXgsm=${FIXgsm:-$NWPROD/global_shared.${global_shared_ver}/fix/fix_am} -export EXECgsm=${EXECgsm:-$NWPROD/global_shared.${global_shared_ver}/exec} -export USHgsm=${USHgsm:-$NWPROD/global_shared.${global_shared_ver}/ush} -export SCRgsm=${SCRgsm:-$NWPROD/global_shared.${global_shared_ver}/scripts} - -export DATA=${DATA:-$(pwd)} -export COMIN=${COMIN:-$(pwd)} -export COMOUT=${COMOUT:-$(pwd)} - -# Filenames. -#------------ -export FORECASTSH=${FORECASTSH:-$SCRgsm/exglobal_fcst.sh.sms} -[[ -n ${AMEXECTMP:-""} ]]&&eval export AM_EXEC=$AMEXECTMP -export FCSTEXEC=${FCSTEXEC:-$AM_EXEC} -export JCAP=${JCAP_ENKF:-254} -export JCAP_A=$JCAP -export LEVS=${LEVS_ENKF:-64} -export LONB=${LONB_ENKF:-768} -export LATB=${LATB_ENKF:-384} -export LONA=${LONA_ENKF:-512} -export LATA=${LATA_ENKF:-256} -export NLON_A=$LONA -export NLAT_A=$(($LATA+2)) -export DELTIM=${DELTIM_ENKF:-900} -export DTPHYS=${DTPHYS_ENKF:-300} -export SET_STP_SEED=${SET_STP_SEED:-"NO"} -export FSMCL2=99999 -export FNOROG=${FNOROG_ENKF:-$FIXgsm/global_orography.t$JCAP.grb} -export FNMASK=${FNMASK_ENKF:-$FIXgsm/global_slmask.t$JCAP.grb} -export OROGRAPHY=${OROGRAPHY_ENKF:-$FIXgsm/global_orography.t$JCAP.grb} -export OROGRAPHY_UF=${OROGRAPHY_UF_ENKF:-$FIXgsm/global_orography_uf.t$JCAP.$LONB.$LATB.grb} -export LONSPERLAT=${LONSPERLAT_ENKF:-${FIXgsm}/global_lonsperlat.t$MTNRSL.txt} -export SLMASK=${SLMASK_ENKF:-$FIXgsm/global_slmask.t$JCAP.grb} -export MTNVAR=${MTNVAR_ENKF:-$FIXgsm/global_mtnvar.t$JCAP.f77} -export DOIAU=${DOIAU_ENKF:-"NO"} -export INISCRIPT=${INISCRIPT} -export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} -export LOGSCRIPT=${LOGSCRIPT} -export ENDSCRIPT=${ENDSCRIPT} - -# Other variables. -#------------------ -export NTHREADS=${NTHREADS_EFCS:-2} -export NTHSTACK=${NTHSTACK_EFCS:-1024000000} -export FILESTYLE=${FILESTYLE:-'L'} - -if [ $machine = IBMP6 ] ; then - export MP_BINDPROC=${MP_BINDPROC:-yes} - export MEMORY_AFFINIY=${MEMORY_AFFINIY:-MCM} - export MP_SYNC_QP=${MP_SYNC_QP:-yes} - export MP_SHARED_MEMORY=${MP_SHARED_MEMORY:-"NO"} - export MP_COREFILE_FORMAT=${MP_COREFILE_FORMAT:-"lite"} - export MP_EAGER_LIMIT=32768 -elif [ $machine = ZEUS ] ; then - export MPI_BUFS_PER_PROC=${MPI_BUFS_PER_PROC:-1024} - export MPI_BUFS_PER_HOST=${MPI_BUFS_PER_HOST:-1024} -elif [ $machine = WCOSS ] ; then - export MP_EUIDEVICE=${MP_EUIDEVICE:-min} - export MPICH_ALLTOALL_THROTTLE=${MPICH_ALLTOALL_THROTTLE:-0} - export MP_SINGLE_THREAD=${MP_SINGLE_THREAD:-yes} - export MP_COREFILE_FORMAT=${MP_COREFILE_FORMAT:-lite} - export MP_EUIDEVELOP=${MP_EUIDEVELOP:-min} - export MP_MPILIB=${MP_MPILIB:-mpich2} - export MP_LABELIO=${MP_LABELIO:-yes} - export MP_SINGLE_THREAD=${MP_SINGLE_THREAD:-yes} - export MP_USE_BULK_XFER=${MP_USE_BULK_XFER:-yes} - export MP_SHARED_MEMORY=${MP_SHARED_MEMORY:-yes} - export MP_COLLECTIVE_OFFLOAD=${MP_COLLECTIVE_OFFLOAD:-no} - export KMP_STACKSIZE=${KMP_STACKSIZE:-1024m} -# export MP_EAGER_LIMIT=${MP_EAGER_LIMIT:-32768} -# export MP_EUILIB=${MP_EUILIB:-us} -# export MP_EUIDEVICE=${MP_EUIDEVICE:-sn_all} - export NTHREADS_EFCS=${NTHREADS_EFCS:-1} -fi - -export NST_GSI=${NST_GSI:-0} -export PGMOUT=${PGMOUT:-${pgmout:-'&1'}} -export PGMERR=${PGMERR:-${pgmerr:-'&2'}} -export NCP=${NCP:-/bin/cp} -export SIGOSUF=${SIGOSUF:-'sig'} -export SFCOSUF=${SFCOSUF:-'sfc'} -export FLXOSUF=${FLXOSUF:-'flx'} -export NSTOSUF=${NSTOSUF:-'nst'} - -if [ $machine = IBMP6 ] ; then - typeset -L1 l=$PGMOUT - [[ $l = '&' ]]&&a=''||a='>' - export REDOUT=${REDOUT:-'1>'$a} - typeset -L1 l=$PGMERR - [[ $l = '&' ]]&&a=''||a='>' - export REDERR=${REDERR:-'2>'$a} -else - export REDOUT=${REDOUT:-'1>'} - export REDERR=${REDERR:-'2>'} -fi - - -################################################################################ -# Preprocessing -#---------------- -$INISCRIPT -pwd=$(pwd) -if [[ -d $DATA ]] ; then - mkdata=NO -else - mkdir -p $DATA - mkdata=YES -fi -cd $DATA||exit 99 -[[ -d $COMOUT ]]||mkdir -p $COMOUT -export DATATOP=$DATA - - -################################################################################ -# Set output data -#---------------- - -EFCSGRP=$COMOUT/fcsstat_${CDATE}_grp${ENSGRP} -rm -f $EFCSGRP - - -################################################################################ -# Run forecast for ensemble member -#--------------------------------- -rc=0 -imem=$ENSBEG -while [[ $imem -le $ENSEND ]]; do - - export member="mem"`printf %03i $imem` - export DATA=$DATATOP/$member - export pgmoutm=$DATA/${pgmout:-pgmout.$member} - - export SUFOUT="_${member}" - - export COMOUTSAVE=$COMOUT - export COMOUT=$DATATOP - - export FHROT=${FHROT_ENKF:-0} - export FHOUT=${FHOUT_ENKF:-3} - export FHMAX=${FHMAX_ENKF:-9} - export FHZER=${FHZER_ENKF:-6} - export FHCYC=${FHCYC_ENKF:-24} - export FHDFI=${FHDFI_ENKF:-3} - export FHLWR=${FHLWR_ENKF:-1} - export FHSWR=${FHSWR_ENKF:-1} - export IEMS=${IEMS_ENKF:-0} - export ISOL=${ISOL_ENKF:-0} - export IAER=${IAER_ENKF:-111} - export ICO2=${ICO2_ENKF:-1} - export ICTM=${ICTM_ENKF:-1} - - export FHOUT_HF=${FHOUTHF_ENKF:-3} - export FHMAX_HF=${FHMAXHF_ENKF:-9} - - export FHGOC3D=${FHGOC3D_ENKF:-0} - export LGOC3D=${LGOC3D_ENKF:-.false.} - - export IALB=${IALB_ENKF:-0} - export IOVR_SW=${IOVR_SW_ENKF:-1} - export FCSTVARS_TMP=${FCSTVARS_ENKF:-" "} - - if [[ "$SET_STP_SEED" = "YES" ]] ; then - ISEED_SPPT=$((CDATE*1000 + imem*10 + 1)) - ISEED_SKEB=$((CDATE*1000 + imem*10 + 2)) - ISEED_VC=$((CDATE*1000 + imem*10 + 3)) - ISEED_SHUM=$((CDATE*1000 + imem*10 + 4)) - export FCSTVARS_TMP="ISEED_SPPT=$ISEED_SPPT,ISEED_SKEB=$ISEED_SKEB,ISEED_VC=$ISEED_VC,ISEED_SHUM=$ISEED_SHUM,$FCSTVARS_TMP" - fi - - if [ $DOIAU = YES ]; then - export FHROT=3 - export FHDFI=0 - export FHBAK=3 - export FHINI=3 - export FHMAX=$((FHMAX + 6)) - export FHMAX_HF=$((FHMAX_HF + 6)) - export GDATE=$($NDATE -$FHBAK $CDATE) - export GDATE=$($NDATE -$FHBAK $GDATE) - [[ $FHBAK -lt 10 ]]&&FHBAK=0$FHBAK - export SIGI=$COMIN/sfg_${GDATE}_fhr$FHBAK$SUFOUT - export GRDI=$SIGI - export SFCI=$COMIN/sfca${FHBAK}_$CDATE$SUFOUT - export NSTI=$COMIN/nsta${FHBAK}_$CDATE$SUFOUT - iaufiles_fg=\'$COMIN/sfg_${GDATE}_fhr06$SUFOUT\' - iaufiles_anl=\'$COMIN/siganl_$CDATE$SUFOUT\' - export FCSTVARS_TMP="iau=.true.,iau_delthrs=6,iaufhrs=6,iaufiles_fg=$iaufiles_fg,iaufiles_anl=$iaufiles_anl,$FCSTVARS_TMP" - FHSTART=`expr 6 + $FHOUT` - else - export SIGI=$COMIN/siganl_$CDATE$SUFOUT - export GRDI=$SIGI - export SFCI=$COMIN/sfcanl_$CDATE$SUFOUT - export NSTI=$COMIN/nstanl_$CDATE$SUFOUT - export FHINI=0 - FHSTART=$FHOUT - fi - [[ $FHINI -lt 10 ]]&&FHINI=0$FHINI - - export FCSTVARS=${FCSTVARS_TMP:-" "} - - if [[ $FILESTYLE = 'L' ]]; then - FH=$FHSTART - while [[ $FH -le $FHMAX ]]; do - if [ $DOIAU = YES ]; then - if [ $FH -ge 9 ]; then - FHIAU=$((FH - 6)) - [[ $FHIAU -lt 10 ]]&&FHIAU=0$FHIAU - fi - else - FHIAU=$FH - [[ $FHIAU -lt 10 ]]&&FHIAU=0$FHIAU - fi - [[ $FH -lt 10 ]]&&FH=0$FH - ln -fs $COMOUTSAVE/sfg_${CDATE}_fhr$FHIAU$SUFOUT ${SIGOSUF}f$FH$SUFOUT - ln -fs $COMOUTSAVE/bfg_${CDATE}_fhr$FHIAU$SUFOUT ${SFCOSUF}f$FH$SUFOUT - ln -fs $COMOUTSAVE/flg_${CDATE}_fhr$FHIAU$SUFOUT ${FLXOSUF}f$FH$SUFOUT - if [ $NST_GSI -gt 0 ]; then - ln -fs $COMOUTSAVE/nfg_${CDATE}_fhr$FHIAU$SUFOUT ${NSTOSUF}f$FH$SUFOUT - fi - FH=$((10#$FH)) - FH=`expr $FH + $FHOUT` - done - fi - - $FORECASTSH - ra=$? - ((rc+=ra)) - - ############################################################## - # Add this statement to notify a member forecast failed to - # complete. Continue ahead with other members, but freeze epos - ############################################################## - if [ "$SENDECF" = YES -a $ra -ne 0 ]; then - ecflow_client --abort="forecast of member $imem FAILED" - fi - - cat $pgmoutm - - export COMOUT=$COMOUTSAVE - - if [[ $FILESTYLE = 'C' ]]; then - FH=$FHSTART - while [[ $FH -le $FHMAX ]]; do - if [ $DOIAU = YES ]; then - if [ $FH -ge 9 ]; then - FHIAU=$((FH - 6)) - [[ $FHIAU -lt 10 ]]&&FHIAU=0$FHIAU - fi - else - FHIAU=$FH - [[ $FHIAU -lt 10 ]]&&FHIAU=0$FHIAU - fi - [[ $FH -lt 10 ]]&&FH=0$FH - $NCP ${SIGOSUF}f$FH$SUFOUT $COMOUT/sfg_${CDATE}_fhr$FHIAU$SUFOUT - $NCP ${SFCOSUF}f$FH$SUFOUT $COMOUT/bfg_${CDATE}_fhr$FHIAU$SUFOUT - $NCP ${FLXOSUF}f$FH$SUFOUT $COMOUT/flg_${CDATE}_fhr$FHIAU$SUFOUT - if [ $NST_GSI -gt 0 ]; then - $NCP ${NSTOSUF}f$FH$SUFOUT $COMOUT/nfg_${CDATE}_fhr$FHIAU$SUFOUT - fi - FH=$((10#$FH)) - FH=`expr $FH + $FHOUT` - done - fi - - if [ $SENDDBN = YES ]; then - FH=$FHOUT - while [[ $FH -le $FHMAX ]]; do - [[ $FH -lt 10 ]]&&FH=0$FH - if [[ `expr $FH % 3` -eq 0 ]] - then - $DBNROOT/bin/dbn_alert MODEL GFS_ENKF $job $COMOUT/bfg_${CDATE}_fhr$FH$SUFOUT - fi - FH=$((FH+FHOUT)) - done - fi - - rm log - $NCP $DATATOP/log_all ./log_old - if [ $ra -ne 0 ]; then - echo "MEMBER $imem : FAIL" > log - else - echo "MEMBER $imem : PASS" > log - fi - cat log_old log > log_new - $NCP log_new $DATATOP/log_all - - (( imem = $imem + 1 )) - -done - -################################################################################ -# Save log -#--------- - -cd $DATATOP -$NCP log_all $EFCSGRP - -################################################################################ -# If any members failed, error out -#--------------------------------- - -export ERR=$rc -export err=$ERR -$ERRSCRIPT||exit 2 - -################################################################################ -# Postprocessing -#---------------- -cd $pwd -[[ $mkdata = YES ]]&&rmdir $DATA -$ENDSCRIPT -set +x -if [[ $VERBOSE = YES ]] ; then - echo $(date) EXITING $0 with return code $err >&2 -fi -exit $err diff --git a/scripts/exglobal_enkf_fcst_nems.sh.ecf b/scripts/exglobal_enkf_fcst_nems.sh.ecf deleted file mode 100755 index 4f5bb1026..000000000 --- a/scripts/exglobal_enkf_fcst_nems.sh.ecf +++ /dev/null @@ -1,468 +0,0 @@ -#!/bin/ksh -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: exglobal_enkffcs.sh.sms -# Script description: Run global_enkf ensemble forecasts -# -# Author: Russ Treadon Org: NP23 Date: 2011-12-16 -# -# Abstract: This script runs global_enkf ensemble forecasts -# -# Script history log: -# 2011-12-16 Russ Treadon based on GCWMB parallel script efcs.sh -# other upgrades related to model changes -# 2014-05-16 Xu Li Add NSST -# -# Input script positional parameters: -# -# Imported Shell Variables: -# FIXgsm Directory for global fixed files -# defaults to /nwprod/fix -# EXECgsm Directory for global executables -# defaults to /nwprod/exec -# DATA working directory -# (if nonexistent will be made, used and deleted) -# defaults to current working directory -# COMIN Path to input sigma and surface analysis files -# defalts to pwd -# COMOUT output directory -# (if nonexistent will be made) -# defaults to current working directory -# SUFOUT Suffix to add to output filenames -# defaults to unique ensemble member -# NCP Copy command -# defaults to cp -# JCAP Spectral truncation -# defaults to 254 -# LEVS Number of levels -# defaults to 64 -# FCSTEXEC Forecast executable -# defaults to ${EXECgsm}/global_fcst$XC -# OROGRAPHY Input orography GRIB file (horiz resolution dependent) -# defaults to ${FIXgsm}/global_orography.t$JCAP.grb -# OROGRAPHY_UF Input unfiltered orography GRIB file (resolution dependent) -# defaults to ${FIXgsm}/global_orography_uf.t$JCAP.grb -# LONSPERLAT Input txt file containing reduced grid information -# defaults to ${FIXgsm}/global_lonsperlat.t$MTNRSL.txt} -# FNMSKH Input high resolution land mask GRIB file -# defaults to ${FIXgsm}/seaice_newland.grb -# INISCRIPT Preprocessing script -# defaults to none -# LOGSCRIPT Log posting script -# defaults to none -# ERRSCRIPT Error processing script -# defaults to 'eval [[ $err = 0 ]]' -# ENDSCRIPT Postprocessing script -# defaults to none -# FHDFI_ENKF Half number of hours of digital filter initialization -# defaults to 0 -# FHCYC_ENKF Surface cycling frequency in hours -# defaults to 0 for no cycling -# DYNVARS_ENKF Other namelist inputs to the dynamics executable -# defaults to none set -# PHYVARS_ENKF Other namelist inputs to the physics executable -# defaults to none set -# FSMCL2 Scale in days to relax to soil moisture climatology -# defaults to 99999 for no relaxation -# NTHREADS Number of threads -# defaults to 2 -# NTHSTACK Size of stack per thread -# defaults to 1024000000 -# FILESTYLE File management style flag -# ('C' to copy to/from $DATA, 'L' for symbolic links in $DATA, -# 'X' to use XLFUNIT or symbolic links where appropriate) -# defaults to 'X' -# PGMOUT Executable standard output -# defaults to $pgmout, then to '&1' -# PGMERR Executable standard error -# defaults to $pgmerr, then to '&1' -# pgmout Executable standard output default -# pgmerr Executable standard error default -# REDOUT standard output redirect ('1>' or '1>>') -# defaults to '1>', or to '1>>' to append if $PGMOUT is a file -# REDERR standard error redirect ('2>' or '2>>') -# defaults to '2>', or to '2>>' to append if $PGMERR is a file -# VERBOSE Verbose flag (YES or NO) -# defaults to YES -# -# Exported Shell Variables: -# PGM Current program name -# pgm -# ERR Last return code -# err -# -# Modules and files referenced: -# scripts : $INISCRIPT -# $LOGSCRIPT -# $ERRSCRIPT -# $ENDSCRIPT -# -# programs : $FCSTEXEC -# -# input data : -# -# fixed data : $FNOROG -# $FNMASK -# $OROGRAPHY -# $OROGRAPHY_UF -# $LONSPERLAT -# $SLMASK -# -# output data: -# $PGMOUT -# $PGMERR -# -# scratch : -# -# Remarks: -# -# Condition codes -# 0 - no problem encountered -# >0 - some problem encountered -# -# Control variable resolution priority -# 1 Command line argument. -# 2 Environment variable. -# 3 Inline default. -# -# Attributes: -# Language: POSIX shell -# Machine: IBM SP -# -#### -################################################################################ -# Set environment. -export VERBOSE=${VERBOSE:-"NO"} -if [[ "$VERBOSE" = "YES" ]] ; then - echo $(date) EXECUTING $0 $* >&2 - set -x -fi -export machine=${machine:-WCOSS} -export machine=$(echo $machine|tr '[a-z]' '[A-Z]') - -# Command line arguments. -# *** currently none *** - -# Directories. -#-------------- -export HOMEDIR=${HOMEDIR:-$NWROOT} -export NWPROD=${NWPROD:-$HOMEDIR} -export FIXSUBDA=${FIXSUBDA:-fix/fix_am} -export FIXgsm=${FIXgsm:-$NWPROD/global_shared.${global_shared_ver}/fix/fix_am} -export EXECgsm=${EXECgsm:-$NWPROD/global_shared.${global_shared_ver}/exec} -export USHgsm=${USHgsm:-$NWPROD/global_shared.${global_shared_ver}/ush} -export SCRgsm=${SCRgsm:-$NWPROD/global_shared.${global_shared_ver}/scripts} - -export DATA=${DATA:-$(pwd)} -export COMIN=${COMIN:-$(pwd)} -export COMOUT=${COMOUT:-$(pwd)} - -# Filenames. -#------------ -export FORECASTSH=${FORECASTSH:-$SCRgsm/exglobal_fcst.sh.sms} -[[ -n ${AMEXECTMP:-""} ]]&&eval export AM_EXEC=$AMEXECTMP -export FCSTEXEC=${FCSTEXEC:-$AM_EXEC} -export JCAP=${JCAP_ENKF:-254} -export JCAP_A=$JCAP -export LEVS=${LEVS_ENKF:-64} -export LONB=${LONB_ENKF:-768} -export LATB=${LATB_ENKF:-384} -export LONA=${LONA_ENKF:-512} -export LATA=${LATA_ENKF:-256} -export NLON_A=$LONA -export NLAT_A=$(($LATA+2)) -export DELTIM=${DELTIM_ENKF:-900} -export DTPHYS=${DTPHYS_ENKF:-300} -export SET_STP_SEED=${SET_STP_SEED:-"NO"} -export FSMCL2=99999 -export FNOROG=${FNOROG_ENKF:-$FIXgsm/global_orography.t$JCAP.grb} -export FNMASK=${FNMASK_ENKF:-$FIXgsm/global_slmask.t$JCAP.grb} -export OROGRAPHY=${OROGRAPHY_ENKF:-$FIXgsm/global_orography.t$JCAP.grb} -export OROGRAPHY_UF=${OROGRAPHY_UF_ENKF:-$FIXgsm/global_orography_uf.t$JCAP.$LONB.$LATB.grb} -export LONSPERLAT=${LONSPERLAT_ENKF:-${FIXgsm}/global_lonsperlat.t$MTNRSL.txt} -export SLMASK=${SLMASK_ENKF:-$FIXgsm/global_slmask.t$JCAP.grb} -export MTNVAR=${MTNVAR_ENKF:-$FIXgsm/global_mtnvar.t$JCAP.f77} -export DOIAU=${DOIAU_ENKF:-"NO"} -export INISCRIPT=${INISCRIPT} -export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} -export LOGSCRIPT=${LOGSCRIPT} -export ENDSCRIPT=${ENDSCRIPT} - -# Other variables. -#------------------ -export NTHREADS=${NTHREADS_EFCS:-2} -export NTHSTACK=${NTHSTACK_EFCS:-1024000000} -export FILESTYLE=${FILESTYLE:-'L'} - -if [ $machine = IBMP6 ] ; then - export MP_BINDPROC=${MP_BINDPROC:-yes} - export MEMORY_AFFINIY=${MEMORY_AFFINIY:-MCM} - export MP_SYNC_QP=${MP_SYNC_QP:-yes} - export MP_SHARED_MEMORY=${MP_SHARED_MEMORY:-"NO"} - export MP_COREFILE_FORMAT=${MP_COREFILE_FORMAT:-"lite"} - export MP_EAGER_LIMIT=32768 -elif [ $machine = ZEUS ] ; then - export MPI_BUFS_PER_PROC=${MPI_BUFS_PER_PROC:-1024} - export MPI_BUFS_PER_HOST=${MPI_BUFS_PER_HOST:-1024} -elif [ $machine = WCOSS ] ; then - export MP_EUIDEVICE=${MP_EUIDEVICE:-min} - export MPICH_ALLTOALL_THROTTLE=${MPICH_ALLTOALL_THROTTLE:-0} - export MP_SINGLE_THREAD=${MP_SINGLE_THREAD:-yes} - export MP_COREFILE_FORMAT=${MP_COREFILE_FORMAT:-lite} - export MP_EUIDEVELOP=${MP_EUIDEVELOP:-min} - export MP_MPILIB=${MP_MPILIB:-mpich2} - export MP_LABELIO=${MP_LABELIO:-yes} - export MP_SINGLE_THREAD=${MP_SINGLE_THREAD:-yes} - export MP_USE_BULK_XFER=${MP_USE_BULK_XFER:-yes} - export MP_SHARED_MEMORY=${MP_SHARED_MEMORY:-yes} - export MP_COLLECTIVE_OFFLOAD=${MP_COLLECTIVE_OFFLOAD:-no} - export KMP_STACKSIZE=${KMP_STACKSIZE:-1024m} -# export MP_EAGER_LIMIT=${MP_EAGER_LIMIT:-32768} -# export MP_EUILIB=${MP_EUILIB:-us} -# export MP_EUIDEVICE=${MP_EUIDEVICE:-sn_all} - export NTHREADS_EFCS=${NTHREADS_EFCS:-1} -fi - -export NST_GSI=${NST_GSI:-0} -export PGMOUT=${PGMOUT:-${pgmout:-'&1'}} -export PGMERR=${PGMERR:-${pgmerr:-'&2'}} -export NCP=${NCP:-/bin/cp} -export SIGOSUF=${SIGOSUF:-'sig'} -export SFCOSUF=${SFCOSUF:-'sfc'} -export FLXOSUF=${FLXOSUF:-'flx'} -export NSTOSUF=${NSTOSUF:-'nst'} - -if [ $machine = IBMP6 ] ; then - typeset -L1 l=$PGMOUT - [[ $l = '&' ]]&&a=''||a='>' - export REDOUT=${REDOUT:-'1>'$a} - typeset -L1 l=$PGMERR - [[ $l = '&' ]]&&a=''||a='>' - export REDERR=${REDERR:-'2>'$a} -else - export REDOUT=${REDOUT:-'1>'} - export REDERR=${REDERR:-'2>'} -fi - - -################################################################################ -# Preprocessing -#---------------- -$INISCRIPT -pwd=$(pwd) -if [[ -d $DATA ]] ; then - mkdata=NO -else - mkdir -p $DATA - mkdata=YES -fi -cd $DATA||exit 99 -[[ -d $COMOUT ]]||mkdir -p $COMOUT -export DATATOP=$DATA - - -################################################################################ -# Set output data -#---------------- - -EFCSGRP=$COMOUT/fcsstat_${CDATE}_grp${ENSGRP} -rm -f $EFCSGRP - - -################################################################################ -# Run forecast for ensemble member -#--------------------------------- -rc=0 -imem=$ENSBEG -while [[ $imem -le $ENSEND ]]; do - - export member="mem"`printf %03i $imem` - export DATA=$DATATOP/$member - export pgmoutm=$DATA/${pgmout:-pgmout.$member} - - export SUFOUT="_${member}" - - export COMOUTSAVE=$COMOUT - export COMOUT=$DATATOP - - export FHROT=${FHROT_ENKF:-0} - export FHOUT=${FHOUT_ENKF:-3} - export FHMAX=${FHMAX_ENKF:-9} - export FHZER=${FHZER_ENKF:-6} - export FHCYC=${FHCYC_ENKF:-24} - export FHDFI=${FHDFI_ENKF:-3} - export FHLWR=${FHLWR_ENKF:-1} - export FHSWR=${FHSWR_ENKF:-1} - export IEMS=${IEMS_ENKF:-0} - export ISOL=${ISOL_ENKF:-0} - export IAER=${IAER_ENKF:-111} - export ICO2=${ICO2_ENKF:-1} - export ICTM=${ICTM_ENKF:-1} - - export FHOUT_HF=${FHOUTHF_ENKF:-3} - export FHMAX_HF=${FHMAXHF_ENKF:-9} - - export FHGOC3D=${FHGOC3D_ENKF:-0} - export LGOC3D=${LGOC3D_ENKF:-.false.} - - export IALB=${IALB_ENKF:-0} - export IOVR_SW=${IOVR_SW_ENKF:-1} - export DYNVARS_TMP=${DYNVARS_ENKF:-" "} - export PHYVARS_TMP=${PHYVARS_ENKF:-" "} - - if [[ "$SET_STP_SEED" = "YES" ]] ; then - ISEED_SPPT=$((CDATE*1000 + imem*10 + 1)) - ISEED_SKEB=$((CDATE*1000 + imem*10 + 2)) - ISEED_VC=$((CDATE*1000 + imem*10 + 3)) - ISEED_SHUM=$((CDATE*1000 + imem*10 + 4)) - export DYNVARS_TMP="ISEED_SPPT=$ISEED_SPPT,ISEED_SKEB=$ISEED_SKEB,ISEED_VC=$ISEED_VC,ISEED_SHUM=$ISEED_SHUM,$DYNVARS_TMP" - fi - - if [ $DOIAU = YES ]; then - export FHROT=3 - export FHDFI=0 - export FHBAK=3 - export FHINI=3 - export FHMAX=$((FHMAX + 6)) - export FHMAX_HF=$((FHMAX_HF + 6)) - export GDATE=$($NDATE -$FHBAK $CDATE) - export GDATE=$($NDATE -$FHBAK $GDATE) - [[ $FHBAK -lt 10 ]]&&FHBAK=0$FHBAK - export SIGI=$COMIN/sfg_${GDATE}_fhr$FHBAK$SUFOUT - export GRDI=$SIGI - export SFCI=$COMIN/sfca${FHBAK}_$CDATE$SUFOUT - export NSTI=$COMIN/nsta${FHBAK}_$CDATE$SUFOUT - iaufiles_fg=\'$COMIN/sfg_${GDATE}_fhr06$SUFOUT\' - iaufiles_anl=\'$COMIN/siganl_$CDATE$SUFOUT\' - export PHYVARS_TMP="iau=.true.,iau_delthrs=6,iaufhrs=6,iaufiles_fg=$iaufiles_fg,iaufiles_anl=$iaufiles_anl,$PHYVARS_TMP" - FHSTART=`expr 6 + $FHOUT` - else - export SIGI=$COMIN/siganl_$CDATE$SUFOUT - export GRDI=$SIGI - export SFCI=$COMIN/sfcanl_$CDATE$SUFOUT - export NSTI=$COMIN/nstanl_$CDATE$SUFOUT - export FHINI=0 - FHSTART=$FHOUT - fi - [[ $FHINI -lt 10 ]]&&FHINI=0$FHINI - - export DYNVARS=${DYNVARS_TMP:-" "} - export PHYVARS=${PHYVARS_TMP:-" "} - - if [[ $FILESTYLE = 'L' ]]; then - FH=$FHSTART - while [[ $FH -le $FHMAX ]]; do - if [ $DOIAU = YES ]; then - if [ $FH -ge 9 ]; then - FHIAU=$((FH - 6)) - [[ $FHIAU -lt 10 ]]&&FHIAU=0$FHIAU - fi - else - FHIAU=$FH - [[ $FHIAU -lt 10 ]]&&FHIAU=0$FHIAU - fi - [[ $FH -lt 10 ]]&&FH=0$FH - ln -fs $COMOUTSAVE/sfg_${CDATE}_fhr$FHIAU$SUFOUT ${SIGOSUF}f$FH$SUFOUT - ln -fs $COMOUTSAVE/bfg_${CDATE}_fhr$FHIAU$SUFOUT ${SFCOSUF}f$FH$SUFOUT - ln -fs $COMOUTSAVE/flg_${CDATE}_fhr$FHIAU$SUFOUT ${FLXOSUF}f$FH$SUFOUT - if [ $NST_GSI -gt 0 ]; then - ln -fs $COMOUTSAVE/nfg_${CDATE}_fhr$FHIAU$SUFOUT ${NSTOSUF}f$FH$SUFOUT - fi - FH=$((10#$FH)) - FH=`expr $FH + $FHOUT` - done - fi - - $FORECASTSH - ra=$? - ((rc+=ra)) - - ############################################################## - # Add this statement to notify a member forecast failed to - # complete. Continue ahead with other members, but freeze epos - ############################################################## - if [ "$SENDECF" = YES -a $ra -ne 0 ]; then - ecflow_client --abort="forecast of member $imem FAILED" - fi - - cat $pgmoutm - - export COMOUT=$COMOUTSAVE - - if [[ $FILESTYLE = 'C' ]]; then - FH=$FHSTART - while [[ $FH -le $FHMAX ]]; do - if [ $DOIAU = YES ]; then - if [ $FH -ge 9 ]; then - FHIAU=$((FH - 6)) - [[ $FHIAU -lt 10 ]]&&FHIAU=0$FHIAU - fi - else - FHIAU=$FH - [[ $FHIAU -lt 10 ]]&&FHIAU=0$FHIAU - fi - [[ $FH -lt 10 ]]&&FH=0$FH - $NCP ${SIGOSUF}f$FH$SUFOUT $COMOUT/sfg_${CDATE}_fhr$FHIAU$SUFOUT - $NCP ${SFCOSUF}f$FH$SUFOUT $COMOUT/bfg_${CDATE}_fhr$FHIAU$SUFOUT - $NCP ${FLXOSUF}f$FH$SUFOUT $COMOUT/flg_${CDATE}_fhr$FHIAU$SUFOUT - if [ $NST_GSI -gt 0 ]; then - $NCP ${NSTOSUF}f$FH$SUFOUT $COMOUT/nfg_${CDATE}_fhr$FHIAU$SUFOUT - fi - FH=$((10#$FH)) - FH=`expr $FH + $FHOUT` - done - fi - - if [ $SENDDBN = YES ]; then - FH=$FHOUT - while [[ $FH -le $FHMAX ]]; do - [[ $FH -lt 10 ]]&&FH=0$FH - if [[ `expr $FH % 3` -eq 0 ]] - then - $DBNROOT/bin/dbn_alert MODEL GFS_ENKF $job $COMOUT/bfg_${CDATE}_fhr$FH$SUFOUT - fi - FH=$((FH+FHOUT)) - done - fi - - rm log - $NCP $DATATOP/log_all ./log_old - if [ $ra -ne 0 ]; then - echo "MEMBER $imem : FAIL" > log - else - echo "MEMBER $imem : PASS" > log - fi - cat log_old log > log_new - $NCP log_new $DATATOP/log_all - - (( imem = $imem + 1 )) - -done - -################################################################################ -# Save log -#--------- - -cd $DATATOP -$NCP log_all $EFCSGRP - -################################################################################ -# If any members failed, error out -#--------------------------------- - -export ERR=$rc -export err=$ERR -$ERRSCRIPT||exit 2 - -################################################################################ -# Postprocessing -#---------------- -cd $pwd -[[ $mkdata = YES ]]&&rmdir $DATA -$ENDSCRIPT -set +x -if [[ $VERBOSE = YES ]] ; then - echo $(date) EXITING $0 with return code $err >&2 -fi -exit $err diff --git a/scripts/exglobal_enkf_inflate_recenter.sh.ecf b/scripts/exglobal_enkf_inflate_recenter.sh.ecf deleted file mode 100755 index 32dae4f19..000000000 --- a/scripts/exglobal_enkf_inflate_recenter.sh.ecf +++ /dev/null @@ -1,555 +0,0 @@ -#!/bin/ksh -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: exglobal_enkfcen.sh.sms -# Script description: Make global_enkf additive error and recenter -# -# Author: Russ Treadon Org: NP23 Date: 2011-12-16 -# -# Abstract: This script performs the global_enkf additive error and recenter -# -# Script history log: -# 2011-12-16 Russ Treadon based on GCWMB parallel script ecen.sh -# 2014-05-16 Xu Li Add NSST -# -# Usage: exglobal_enkfcen.sh.sms -# -# Input script positional parameters: -# -# Imported Shell Variables: -# FIXgsm Directory for global fixed files -# defaults to /nwprod/fix -# PERTURBDIR Directory for global enkf perturbation database -# defaults to /nwprod/fix/enkf_gfs -# EXECgsm Directory for global executables -# defaults to /nwprod/exec -# USHgsm Directory for global scripts -# defaults to /nwprod/ush -# DATA working directory -# (if nonexistent will be made, used and deleted) -# defaults to current working directory -# COMIN input directory -# defaults to current working directory -# COMOUT output directory -# (if nonexistent will be made) -# defaults to current working directory -# XC Suffix to add to executables -# defaults to none -# PREINP Prefix to add to input observation files -# defaults to none -# SUFINP Suffix to add to input observation files -# defaults to none -# NCP Copy command -# defaults to cp -# GETATMENSMEANEXEC Compute ensemble mean sigma (optonally smoothed) -# defaults to ${EXECgsm}/getsigensmean_smooth$XC -# ADDERRSPECEXEC Perturb sigma files -# defaults to ${EXECgsm}/adderrspec_nmcmeth_spec$XC -# RECENATMPEXEC Recenter sigma files -# defaults to ${EXECgsm}/recentersigp$XC -# INISCRIPT Preprocessing script -# defaults to none -# LOGSCRIPT Log posting script -# defaults to none -# ERRSCRIPT Error processing script -# defaults to 'eval [[ $err = 0 ]]' -# ENDSCRIPT Postprocessing script -# defaults to none -# JCAP_ENKF Spectral truncation for background -# defaults to 254 -# LEVS_ENKF Number of levels -# defaults to 64 -# CDATE Current analysis date in yyyymmddhh format -# defaults to the value in the input surface file header -# LATB_ENKF Number of latitudes -# defaults to the value in the input surface file header -# LONB_ENKF Number of longitudes -# defaults to the value in the input surface file header -# NTHREADS Number of threads -# defaults to 1 -# NTHSTACK Size of stack per thread -# defaults to 1024000000 -# NTHREADS_ENKF Number of threads for ENKFUPDEXEC -# defaults to 1 -# NTHSTACK_ENKF Size of stack per thread for ENKFUPDEXEC -# defaults to 1024000000 -# FILESTYLE File management style flag -# ('C' to copy to/from $DATA, 'L' for symbolic links in $DATA, -# 'X' to use XLFUNIT or symbolic links where appropriate) -# defaults to 'X' -# PGMOUT Executable standard output -# defaults to $pgmout, then to '&1' -# PGMERR Executable standard error -# defaults to $pgmerr, then to '&1' -# pgmout Executable standard output default -# pgmerr Executable standard error default -# REDOUT standard output redirect ('1>' or '1>>') -# defaults to '1>', or to '1>>' to append if $PGMOUT is a file -# REDERR standard error redirect ('2>' or '2>>') -# defaults to '2>', or to '2>>' to append if $PGMERR is a file -# VERBOSE Verbose flag (YES or NO) -# defaults to NO -# -# Exported Shell Variables: -# PGM Current program name -# pgm -# ERR Last return code -# err -# -# Modules and files referenced: -# scripts : $INISCRIPT -# $LOGSCRIPT -# $ERRSCRIPT -# $ENDSCRIPT -# -# programs : $GETATMENSMEANEXEC -# $ADDERRSPECEXEC -# $RECENATMPEXEC -# -# fixed data : -# -# input data : $SIGANL_HI -# $SFCANL_HI -# $SIGGES -# $SIGANLENS_IN -# -# output data: $SANLENSMEAN -# $PERTDATES -# $SIGANLENS_OUT -# -# Remarks: -# -# Condition codes -# 0 - no problem encountered -# >0 - some problem encountered -# -# Control variable resolution priority -# 1 Command line argument. -# 2 Environment variable. -# 3 Inline default. -# -# Attributes: -# Language: POSIX shell -# Machine: IBM SP -# -################################################################################ -# Set environment. -export VERBOSE=${VERBOSE:-"NO"} -if [[ "$VERBOSE" = "YES" ]]; then - echo $(date) EXECUTING $0 $* >&2 - set -x -fi -export machine=${machine:-IBMP6} -export machine=$(echo $machine|tr '[a-z]' '[A-Z]') - -# Command line arguments. - -# Directories. -export HOMEDIR=${HOMEDIR:-$NWROOT} -export NWPROD=${NWPROD:-$HOMEDIR} -export FIXgsm=${FIXgsm:-$NWPROD/global_shared.${global_shared_ver}/fix/fix_am} -export EXECgsm=${EXECgsm:-$NWPROD/global_shared.${global_shared_ver}/exec} -export USHgsm=${USHgsm:-$NWPROD/global_shared.${global_shared_ver}/ush} -export PERTURBDIR=${PERTURBDIR:-$NWPROD/fix/enkf_gfs} -export EXECGDAS=${EXECGDAS:-$NWPROD/gdas.${gdas_ver}/exec} - -export utilscript=${utilscript:-$NWPROD/util/ush} -export DATA=${DATA:-$(pwd)} -export COMIN=${COMIN:-$(pwd)} -export COMOUT=${COMOUT:-$(pwd)} -# Set script control parameters -export use_gfs_nemsio=${use_gfs_nemsio:-".false."} # run script with NEMSIO input/output -# Filenames. -export XC=${XC} -export PREINP=${PREINP} -export SUFINP=${SUFINP} -export JCAP_ENKF=${JCAP_ENKF:-254} -export LEVS_ENKF=${LEVS_ENKF:-64} -export LONB_ENKF=${LONB_ENKF:-768} -export LATB_ENKF=${LATB_ENKF:-384} -export SFCHDR=${SFCHDR:-${EXECgsm}/global_sfchdr$XC} -export GETATMENSMEANEXEC=${GETATMENSMEANEXEC:-${EXECgdas}/getsigensmean_smooth$XC} -export ADDERRSPECEXEC=${ADDERRSPECEXEC:-${EXECgdas}/adderrspec_nmcmeth_spec$XC} -export RECENATMPEXEC=${RECENATMPEXEC:-${EXECgdas}/recentersigp$XC} -export CHGRESSH=${CHGRESSH:-${USHgsm}/global_chgres.sh} -export CHGRESEXEC=${CHGRESEXEC-${EXECgsm}/global_chgres} -export CHGRESVARS_ENKF=${CHGRESVARS_ENKF:-""} -export NMEM_ENKF=${NMEM_ENKF:-0} -export SCALEFACT=${SCALEFACT:-00} -export INISCRIPT=${INISCRIPT} -export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} -export LOGSCRIPT=${LOGSCRIPT} -export ENDSCRIPT=${ENDSCRIPT} -# Other variables. -if [ $use_gfs_nemsio = .true. ]; then - export CDATE=${CDATE:-$($SFCHDR $SFCGES fcstdate | grep -i "fcstdate_ymdh" |awk -F= '{print $2}')} -else - export CDATE=${CDATE:-$($SFCHDR $SFCGES VDATE||echo 0)} -fi -export NDATE=${NDATE:-$NWPROD/util/exec/ndate} -export GDATE=${GDATE:-($NDATE -06 $CDATE)} -export NDAYS=${NDAYS:-60} -export NHOURS=$((NDAYS*24)) -export PBDATE=${PBDATE:-2010050100} -export PEDATE=${PEDATE:-2011043018} -export SWITCH=${SWITCH:-043018} -export NTHREADS=${NTHREADS:-1} -export NTHSTACK=${NTHSTACK:-1024000000} -export NTHREADS_ENKF=${NTHREADS_ENKF:-1} -export NTHSTACK_ENKF=${NTHSTACK_ENKF:-1024000000} -export CHGRESTHREAD=${CHGRESTHREAD:-32} -export LATCH=${LATCH:-8} -export IDSL=${IDSL:-1} -export IDVT=${IDVT:-21} -export IDVM=${IDVM:-0} -export IALB=${IALB:-0} -export IDVC=${IDVC:-2} -export LSOIL=${LSOIL:-4} -export FILESTYLE=${FILESTYLE:-'X'} -export PGMOUT=${PGMOUT:-${pgmout:-'&1'}} -export PGMERR=${PGMERR:-${pgmerr:-'&2'}} -export OBERRFLAG=${OBERRFLAG:-.false.} -export NCP=${NCP:-cp} -export POE=${POE:-NO} -export APRUN=${APRUN:-""} -export NST_GSI=${NST_GSI:-0} -export SIGISUF=${SIGISUF:-'siganl'} -export SFCISUF=${SFCISUF:-'sfcanl'} - -if [ $machine = IBMP6 ] ; then - typeset -L1 l=$PGMOUT - [[ $l = '&' ]]&&a=''||a='>' - export REDOUT=${REDOUT:-'1>'$a} - typeset -L1 l=$PGMERR - [[ $l = '&' ]]&&a=''||a='>' - export REDERR=${REDERR:-'2>'$a} -else - export REDOUT=${REDOUT:-'1>'} - export REDERR=${REDERR:-'2>'} -fi - -################################################################################ -# Preprocessing -$INISCRIPT -pwd=$(pwd) -if [[ -d $DATA ]]; then - mkdata=NO -else - mkdir -p $DATA - mkdata=YES -fi -cd $DATA||exit 99 - -################################################################################ - -################################################################################ -# Copy input files - -export SIGANL_HI=${SIGANL_HI:-$SIGISUF.$CDUMP.$CDATE} -export SFCANL_HI=${SFCANL_HI:-$SFCISUF.$CDUMP.$CDATE} -export SIGGES=${SIGGES:-sfg_${GDATE}_fhr06_ensmean} - -if [[ $FILESTYLE = 'C' ]]; then - export FCPLN=$NCP -else - export FCPLN="ln -sf" -fi - -imem=1 -while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - $FCPLN ${SIGANLENS_IN}${member} ./sanl_${CDATE}${member} - (( imem = $imem + 1 )) -done - - -################################################################################ -# Compute mean for enkf ensemble analysis members -export DATAPATH2=./ -export FILENAMEOUT=sanl_${CDATE}_ensmean -export FILEPREFIX=sanl_${CDATE} -export NANALS=$NMEM_ENKF - -if [[ $FILESTYLE = 'L' ]]; then - ln -fs $SANLENSMEAN ./sanl_${CDATE}_ensmean -fi - -rm stdout.sanl_ensmean -if [[ "$POE" = "YES" ]]; then - poe $GETATMENSMEANEXEC $DATAPATH2 $FILENAMEOUT $FILEPREFIX $NANALS > stdout.sanl_ensmean - rc=$? -else - eval "$APRUN $GETATMENSMEANEXEC $DATAPATH2 $FILENAMEOUT $FILEPREFIX $NANALS > stdout.sanl_ensmean" - rc=$? -fi - -export ERR=$rc -export err=$ERR -$ERRSCRIPT||exit 2 - -cat stdout.sanl_ensmean -if [[ $FILESTYLE = 'C' ]]; then - $NCP sanl_${CDATE}_ensmean $SANLENSMEAN -fi - - -################################################################################ -# If requested, perturb and recenter ensemble analysis members -if [[ $SCALEFACT -gt 0 ]]; then - -# Generate sequential list of perturbation dates - BDATE=`$NDATE -$NHOURS $CDATE` - EDATE=`$NDATE +$NHOURS $CDATE` - - rm temp_all temp_dat temp_new - npert=0 - SDATE=$BDATE - while [[ $SDATE -le $EDATE ]]; do - MMDDHH=`echo $SDATE | cut -c5-10` - YYYY=2010 - if [[ "$MMDDHH" -le "$SWITCH" ]]; then - YYYY=2011 - fi - PDATE=${YYYY}${MMDDHH} - echo $PDATE > temp_dat - cat temp_all temp_dat > temp_new - mv temp_new temp_all - IDATE=`$NDATE +06 $SDATE` - SDATE=$IDATE - npert=$((npert+1)) - done - mv temp_all dates_seq.dat - rm temp_dat temp_new - - export NPERTURB_PAIRS=$npert - -# Perturb and recenter ensemble analysis members - export LONB=$LONB_ENKF - export LATB=$LATB_ENKF - export ADDPERTPATH=$PERTURBDIR/ - rm dates_ran.dat stdout.adderr - - ln -fs $SIGGES sfg_${CDATE}_fhr06_ensmean - if [[ $FILESTYLE = 'L' ]]; then - ln -fs $PERTDATES dates_ran.dat - fi - - if [[ "$POE" = "YES" ]]; then - poe $ADDERRSPECEXEC $NANALS $CDATE $SCALEFACT $ADDPERTPATH $NPERTURB_PAIRS > stdout.adderr - rc=$? - else - eval "$APRUN $ADDERRSPECEXEC $NANALS $CDATE $SCALEFACT $ADDPERTPATH $NPERTURB_PAIRS > stdout.adderr" - rc=$? - fi - - export ERR=$rc - export err=$ERR - $ERRSCRIPT||exit 2 - - cat stdout.adderr - if [[ $FILESTYLE = 'C' ]]; then - $NCP dates_ran.dat $PERTDATES - fi - -# Compute mean for perturbed and recentered ensemble analysis members - export DATAPATH2=./ - export FILENAMEOUT=sanlpr_${CDATE}_ensmean - export FILEPREFIX=sanlpr_${CDATE} - export NANALS=$NMEM_ENKF - rm stdout.sanlpr_ensmean - eval "$APRUN $GETATMENSMEANEXEC $DATAPATH2 $FILENAMEOUT $FILEPREFIX $NANALS > stdout.sanlpr_ensmean" - rc=$? - - export ERR=$rc - export err=$ERR - $ERRSCRIPT||exit 2 - - cat stdout.sanlpr_ensmean - -fi - - -################################################################################ -# Chgres high resolution analysis to ensemble resolution -$FCPLN $SIGANL_HI sanl_${CDATE}_highres -$FCPLN $SFCANL_HI sfcanl_${CDATE}_highres -export SIGI=sanl_${CDATE}_highres -export SFCI=sfcanl_${CDATE}_highres -export SIGO=sanl_${CDATE}_hybrid_lores -export SFCO=sfcanl_${CDATE}_hybrid_lores -if [ $use_gfs_nemsio = .true. ]; then - export GFSOUT=$SIGO -fi -rm -f $SIGO -rm -f $SFCO - -export JCAP_ens=$JCAP_ENKF -export LEVS_ens=$LEVS_ENKF -export LONB_ens=$LONB_ENKF -export LATB_ens=$LATB_ENKF -export OUTTYP=${OUTTYP:-2} -export PGMOUT=stdout.chgres -export PGMERR=stderr.chgres - -# specify threads for running chgres -if [ $machine = IBMP6 ]; then - export OMP_NUM_THREADS=$CHGRESTHREAD - export NTHREADS=$OMP_NUM_THREADS -else - export OMP_NUM_THREADS=1 - export NTHREADS=1 -fi -export OROGRAPHY=$OROGRAPHY_ENKF -export OROGRAPHY_UF=$OROGRAPHY_UF_ENKF -export SLMASK=$SLMASK_ENKF -export LONSPERLAT=$LONSPERLAT_ENKF - -export CHGRESVARS=$CHGRESVARS_ENKF - -eval "$CHGRESSH $SIGI $SFCI $SIGO $SFCO $JCAP_ens $LEVS_ens $LONB_ens $LATB_ens" -rc=$? - -export ERR=$rc -export err=$ERR -$ERRSCRIPT||exit 2 - -# reduce thread to 1 since post runs with mpi -export OMP_NUM_THREADS=1 -export NTHREADS=$OMP_NUM_THREADS - -cat stderr.chgres -cat stdout.chgres - - -################################################################################ -# Recenter ensemble member atmospheric analyses about hires analysis -if [[ $SCALEFACT -gt 0 ]]; then - export FILENAME_MEANIN=sanlpr_${CDATE}_ensmean # current mean (perturbed & recentered) - export FILENAMEIN=sanlpr_${CDATE} -else - export FILENAME_MEANIN=sanl_${CDATE}_ensmean # current mean (unperturbed & recentered) - export FILENAMEIN=sanl_${CDATE} -fi -export FILENAME_MEANOUT=sanl_${CDATE}_hybrid_lores # recenter around this mean (hires analysis) -export FILENAMEOUT=sanlprc_${CDATE} - -if [[ $FILESTYLE = 'L' ]]; then - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - ln -fs ${SIGANLENS_OUT}${member} sanlprc_${CDATE}${member} - (( imem = $imem + 1 )) - done -fi - -rm stdout_recenter_hires -if [[ "$POE" = "YES" ]]; then - poe $RECENATMPEXEC $FILENAMEIN $FILENAME_MEANIN $FILENAME_MEANOUT $FILENAMEOUT $NANALS > stdout_recenter_hires - rc=$? -else - eval "$APRUN $RECENATMPEXEC $FILENAMEIN $FILENAME_MEANIN $FILENAME_MEANOUT $FILENAMEOUT $NANALS > stdout_recenter_hires" - rc=$? -fi - -export ERR=$rc -export err=$ERR -$ERRSCRIPT||exit 2 - -cat stdout_recenter_hires - -if [[ $FILESTYLE = 'C' ]]; then - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - $NCP sanlprc_${CDATE}${member} ${SIGANLENS_OUT}${member} - (( imem = $imem + 1 )) - done -fi - -# Optionally alert $SIGANLENS_OUT files -if [ $SENDDBN = YES ]; then - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - if [ $SENDDBN = YES ]; then - $DBNROOT/bin/dbn_alert MODEL GFS_ENKF $job ${SIGANLENS_OUT}${member} - fi - (( imem = $imem + 1 )) - done -fi - -################################################################################ -# Update ensemble member surface and nst analyses -################################################################################ -if [ $NST_GSI -gt 0 ]; then - - export DTFANL=${DTFANL:-${COMIN}/${PREINP}dtfanl} - export NSTGES_ENS=${NSTGES_ENS:-${COMIN}/nfg_${GDATE}_fhr06} - export SFCGES_ENS=${SFCGES_ENS:-${COMIN}/bfg_${GDATE}_fhr06} - export SFCGCY_ENS=${SFCGCY_ENS:-${COMIN}/sfcgcy_${CDATE}} - export NSTANL_ENS=${NSTANL_ENS:-${COMOUT}/nstanl_${CDATE}} - export SFCANL_ENS=${SFCANL_ENS:-${COMOUT}/sfcanl_${CDATE}} - - - $FCPLN $DTFANL dtfanl - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - $FCPLN ${NSTGES_ENS}${member} nstf06${member} - $FCPLN ${SFCGES_ENS}${member} sfcf06${member} - if [ $NST_GSI -eq 3 ]; then - $FCPLN ${SFCGCY_ENS}${member} sfcgcy${member} - else - $FCPLN ${SFCANL_ENS}${member} sfcgcy${member} - fi - (( imem = $imem + 1 )) - done - - if [[ $FILESTYLE = 'L' ]]; then - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - ln -fs ${NSTANL_ENS}${member} nstanl${member} - if [ $NST_GSI -eq 3 ]; then - ln -fs ${SFCANL_ENS}${member} sfcanl${member} - fi - (( imem = $imem + 1 )) - done - fi - - rm stdout_recenter_sfcnstupd - if [[ "$POE" = "YES" ]]; then - poe $GETSFCNSTENSUPDEXEC $NANALS $NST_GSI $ZSEA1 $ZSEA2 > stdout_recenter_sfcnstupd - rc=$? - else - eval "$APRUN $GETSFCNSTENSUPDEXEC $NANALS $NST_GSI $ZSEA1 $ZSEA2 > stdout_recenter_sfcnstupd" - rc=$? - fi - - export ERR=$rc - export err=$ERR - $ERRSCRIPT||exit 2 - - if [[ $FILESTYLE = 'C' ]]; then - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - $NCP nstanl${member} ${NSTANL_ENS}${member} - $NCP sfcanl${member} ${SFCANL_ENS}${member} - (( imem = $imem + 1 )) - done - fi - - cat stdout_recenter_sfcnstupd -fi -################################################################################ -# Postprocessing -cd $pwd -[[ $mkdata = YES ]]&&rmdir $DATA -$ENDSCRIPT -set +x -if [[ "$VERBOSE" = "YES" ]]; then - echo $(date) EXITING $0 with return code $err >&2 -fi -exit $err diff --git a/scripts/exglobal_enkf_innovate_obs.sh.ecf b/scripts/exglobal_enkf_innovate_obs.sh.ecf deleted file mode 100755 index 18d5146d2..000000000 --- a/scripts/exglobal_enkf_innovate_obs.sh.ecf +++ /dev/null @@ -1,632 +0,0 @@ -#!/bin/ksh -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: global_enkfomg.sh -# Script description: Compute global_enkf innovations -# -# Author: Russ Treadonl Org: NP23 Date: 2011-12-16 -# -# Abstract: This script computes global_enkf innovations -# -# Script history log: -# 2011-12-16 Russ Treadon based on GCWMB parallel script eomg.sh -# 2014-02-16 Xu Li add NSST related variables -# -# Usage: exglobal_enkfomg.sh.sms SFCGESMEAN SIGGESMEAN -# -# Input script positional parameters: -# 1 Input surface guess -# defaults to $SFCGESMEAN; required -# 2 Input sigma guess -# defaults to $SIGGESMEAN; required -# -# Imported Shell Variables: -# SFCGESMEAN Input ensemble mean surface guess -# overridden by $1; required -# SIGGESMEAN Input ensemble mean sigma guess -# overridden by $2; required -# SELECT_OBS Tarball containing selected data -# defaults to ${COMIN}/${PREINP}obsinput -# SFCANL Output surface analysis -# defaults to ${COMOUT}/sfcanl -# SFCGCY Output intermideate surface analysis -# defaults to ${COMOUT}/sfcgcy -# SFCG03 Surface guess valid at -03 hour -# defaults to ${COMOUT}/sfcf03 -# SFCG04 Surface guess valid at -04 hour -# defaults to ${COMOUT}/sfcf04 -# SFCG05 Surface guess valid at -05 hour -# defaults to ${COMOUT}/sfcf05 -# SFCG07 Surface guess valid at -07 hour -# defaults to ${COMOUT}/sfcf07 -# SFCG08 Surface guess valid at -08 hour -# defaults to ${COMOUT}/sfcf08 -# SFCG09 Surface guess valid at -09 hour -# defaults to ${COMOUT}/sfcf09 -# NSTG03 NSST guess valid at -03 hour -# defaults to ${COMOUT}/sfcf03 -# NSTG04 NSST guess valid at -04 hour -# defaults to ${COMOUT}/sfcf04 -# NSTG05 NSST guess valid at -05 hour -# defaults to ${COMOUT}/sfcf05 -# NSTG07 NSST guess valid at -07 hour -# defaults to ${COMOUT}/sfcf07 -# NSTG08 NSST guess valid at -08 hour -# defaults to ${COMOUT}/sfcf08 -# NSTG09 NSST guess valid at -09 hour -# defaults to ${COMOUT}/sfcf09 -# SIGG03 Sigma guess valid at -03 hour -# defaults to ${COMOUT}/sigf03 -# SIGG04 Sigma guess valid at -04 hour -# defaults to ${COMOUT}/sigf04 -# SIGG05 Sigma guess valid at -05 hour -# defaults to ${COMOUT}/sigf05 -# SIGG07 Sigma guess valid at -07 hour -# defaults to ${COMOUT}/sigf07 -# SIGG08 Sigma guess valid at -08 hour -# defaults to ${COMOUT}/sigf08 -# SIGG09 Sigma guess valid at -09 hour -# defaults to ${COMOUT}/sigf09 -# DOHYBVAR flag (YES or N) for hybrid ensemble variational option -# defaults to NO -# USE_NEWRADBC Flag to use new radiance bias correction scheme (YES or NO) -# defaults to NO -# RADSTAT Output radiance assimilation statistics -# defaults to ${COMIN}/${PREINP}radstat -# GSISTAT Output gsi (obs-ges), qc, and iteration statistics -# defaults to ${COMIN}/${PREINP}gsistat -# PCPSTAT Output precipitation assimilation statistics -# defaults to ${COMIN}/${PREINP}pcpstat -# CNVSTAT Output conventional observation assimilation statistics -# defaults to ${COMIN}/${PREINP}cnvstat -# OZNSTAT Output ozone observation assimilation statistics -# defaults to ${COMIN}/${PREINP}oznstat -# RUN_SELECT Flag to only select data (YES or NO) -# defaults to NO -# USE_SELECT Flag to use selected data (YES or NO) -# defaults to NO -# DIAG_SUFFIX optional suffix for diagnostics files -# defaults to empty string -# DIAG_COMPRESS flag to compress (YES) diagnostics files -# defaults to YES -# DIAG_TARBALL flag to collect (YES) diagnostic files in tarballs -# defaults to YES -# FIXgsm Directory for global fixed files -# defaults to /nwprod/fix -# EXECgsm Directory for global executables -# defaults to /nwprod/exec -# USHgsm Directory for global ush scripts -# defaults to /nwprod/ush -# DATA working directory -# (if nonexistent will be made, used and deleted) -# defaults to current working directory -# COMIN input directory -# defaults to current working directory -# COMOUT output directory -# (if nonexistent will be made) -# defaults to current working directory -# XC Suffix to add to executables -# defaults to none -# PREINP Prefix to add to input observation files -# defaults to none -# SUFINP Suffix to add to input observation files -# defaults to none -# NCP Copy command -# defaults to cp -# SIGHDR Command to read sigma header -# defaults to ${EXECgsm}/global_sighdr$XC -# SFCHDR Command to read surface header -# defaults to ${EXECgsm}/global_sfchdr$XC -# NSTHDR Command to read NSST header -# defaults to ${EXECgsm}/global_nsthdr$XC -# CYCLEXEC Surface cycle executable -# defaults to ${EXECgsm}/global_cycle$XC -# GSIEXEC Spectral analysis executable -# defaults to ${EXECgsm}/global_gsi$XC -# CYCLESH Surface cycle script -# defaults to ${USHgsm}/global_cycle.sh -# BERROR Input background error file -# defaults to ${FIXgsm}/global_berror.l${LEVS}y${NLAT_A}.sig.f77 -# SATANGL Input satellite angle bias file -# defaults to ${FIXgsm}/global_satangbias.txt -# SATINFO Input satellite information file -# defaults to ${FIXgsm}/global_satinfo.txt -# RTMFIX Input directory containing CRTM coefficients -# defaults to ${FIXgsm}/crtm_v2.2.3 -# ANAVINFO Input analysis variable file -# defaults to ${FIXgsm}/global_anavinfo.l${LEVS}.txt -# CONVINFO Input conventional observation information file -# defaults to ${FIXgsm}/global_convinfo.txt -# INSITUINFO Input In Situ sea water temperature observation information file -# defaults to ${FIXgsm}/global_insituinfo.txt -# OZINFO Input ozone information file -# defaults to ${FIXgsm}/global_ozone.txt -# PCPINFO Input precipitation information file -# defaults to ${FIXgsm}/global_pcpinfo.txt -# AEROINFO Input aerosol information file -# defaults to ${FIXgsm}/global_aeroinfo.txt -# SCANINFO Input satellite scan information file -# defaults to ${FIXgsm}/global_scaninfo.txt -# HYBENSINFO Input hybrid ensemble localization information file -# defaults to ${FIXgsm}/global_hybens_locinfo.l${LEVS}.txt -# defaults to ${COMIN}/${PREINP}syndata.tcvitals.tm00 -# INISCRIPT Preprocessing script -# defaults to none -# LOGSCRIPT Log posting script -# defaults to none -# ERRSCRIPT Error processing script -# defaults to 'eval [[ $err = 0 ]]' -# ENDSCRIPT Postprocessing script -# defaults to none -# JCAP_A Spectral truncation for analysis -# defaults to the value in the input sigma file header -# JCAP Spectral truncation for background -# defaults to the value in the input sigma file header -# LEVS Number of levels -# DELTIM Timestep in seconds -# defaults to 3600/($JCAP_A/20) -# CDATE Current analysis date in yyyymmddhh format -# defaults to the value in the input surface file header -# LATB Number of latitudes in surface cycling -# defaults to the value in the input surface file header -# LONB Number of longitudes in surface cycling -# defaults to the value in the input surface file header -# LSOIL Number of soil layers -# defaults to 2 -# FSMCL2 Scale in days to relax to soil moisture climatology -# defaults to 60 -# DELTSFC Cycling frequency in hours -# defaults to forecast hour of $SFCGESMEAN -# LATA Number of latitudes in spectral analysis -# defaults to $LATB -# LONA Number of longitudes in spectral analysis -# defaults to $LONB -# CYCLVARS Other namelist inputs to the cycle executable -# defaults to none set -# NTHREADS Number of threads -# defaults to 1 -# NTHSTACK Size of stack per thread -# defaults to 1024000000 -# NTHREADS_GSI Number of threads for GSIEXEC -# defaults to 1 -# NTHSTACK_GSI Size of stack per thread for GSIEXEC -# defaults to 1024000000 -# FILESTYLE File management style flag -# ('C' to copy to/from $DATA, 'L' for symbolic links in $DATA, -# 'X' to use XLFUNIT or symbolic links where appropriate) -# defaults to 'X' -# PGMOUT Executable standard output -# defaults to $pgmout, then to '&1' -# PGMERR Executable standard error -# defaults to $pgmerr, then to '&1' -# pgmout Executable standard output default -# pgmerr Executable standard error default -# REDOUT standard output redirect ('1>' or '1>>') -# defaults to '1>', or to '1>>' to append if $PGMOUT is a file -# REDERR standard error redirect ('2>' or '2>>') -# defaults to '2>', or to '2>>' to append if $PGMERR is a file -# VERBOSE Verbose flag (YES or NO) -# defaults to NO -# -# Exported Shell Variables: -# PGM Current program name -# pgm -# ERR Last return code -# err -# -# Modules and files referenced: -# scripts : $INISCRIPT -# $LOGSCRIPT -# $ERRSCRIPT -# $ENDSCRIPT -# -# programs : $CYCLEXEC -# $GSIEXEC -# -# fixed data : $BERROR -# $SATANGL -# $SATINFO -# $RTMFIX -# $ANAVINFO -# $CONVINFO -# $INSITUINFO -# $OZINFO -# $PCPINFO -# $AEROINFO -# $SCANINFO -# $HYBENSINFO -# -# input data : $SFCGESMEAN -# $SIGGESMEAN -# $SELECT_OBS -# $SFCG03 -# $SFCG04 -# $SFCG05 -# $SFCG07 -# $SFCG08 -# $SFCG09 -# $NSTG03 -# $NSTG04 -# $NSTG05 -# $NSTG07 -# $NSTG08 -# $NSTG09 -# $SIGG03 -# $SIGG04 -# $SIGG05 -# $SIGG07 -# $SIGG08 -# $SIGG09 -# $FNTSFA -# $FNACNA -# $FNSNOA -# -# output data: $SFCANL -# $SFCGCY -# $RADSTAT -# $GSISTAT -# $PCPSTAT -# $CNVSTAT -# $OZNSTAT -# $PGMOUT -# $PGMERR -# -# Remarks: -# -# Condition codes -# 0 - no problem encountered -# >0 - some problem encountered -# -# Control variable resolution priority -# 1 Command line argument. -# 2 Environment variable. -# 3 Inline default. -# -# Attributes: -# Language: POSIX shell -# Machine: IBM SP -# -################################################################################ -# Set environment. -export VERBOSE=${VERBOSE:-"NO"} -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXECUTING $0 $* >&2 - set -x -fi -export machine=${machine:-IBMP6} -export machine=$(echo $machine|tr '[a-z]' '[A-Z]') - -# Command line arguments. -export SFCGESMEAN=${1:-${SFCGESMEAN:?}} -export SIGGESMEAN=${2:-${SIGGESMEAN:?}} -export NSTGESMEAN=${3:-${NSTGESMEAN:?}} -# Directories. -export HOMEDIR=${HOMEDIR:-$NWROOT} -export NWPROD=${NWPROD:-$HOMEDIR} -export FIXSUBDA=${FIXSUBDA:-fix/fix_am} -export FIXgsm=${FIXgsm:-$NWPROD/global_shared.${global_shared_ver}/fix/fix_am} -export EXECgsm=${EXECgsm:-$NWPROD/global_shared.${global_shared_ver}/exec} -export USHgsm=${USHgsm:-$NWPROD/global_shared.${global_shared_ver}/ush} -export FIXgsi=${FIXgsi:-$NWPROD/global_shared.${global_shared_ver}/fix} -export EXECgsi=${EXECgsi:-$NWPROD/global_shared.${global_shared_ver}/exec} -export utilscript=${utilscript:-$NWPROD/util/ush} -export DATA=${DATA:-$(pwd)} -export COMIN=${COMIN:-$(pwd)} -export COMOUT=${COMOUT:-$(pwd)} - -# Set script / GSI control parameters -export use_gfs_nemsio=${use_gfs_nemsio:-".false."} # run GSI with NEMSIO input/output - -# Scripts. -export ANALYSISSH=${ANALYSISSH:-$SCRGSI/exglobal_analysis.sh.sms} - -# Variables. -export XC=${XC} -export PREINP=${PREINP} -export SUFINP=${SUFINP} -export SIGHDR=${SIGHDR:-${EXECgsm}/global_sighdr$XC} -export SFCHDR=${SFCHDR:-${EXECgsm}/global_sfchdr$XC} -if [ $use_gfs_nemsio = .true. ]; then - export JCAP=${JCAP:-$($SIGHDR $SIGGESMEAN jcap |grep -i "jcap" |awk -F"= " '{print $2}' |awk -F" " '{print $1}')} - export JCAP_A=${JCAP_A:-$($SIGHDR $SIGGESMEAN jcap |grep -i "jcap" |awk -F"= " '{print $2}' |awk -F" " '{print $1}')} - export LATB=${LATB:-$($SFCHDR $SFCGESMEAN latr |grep -i "latr" |awk -F"= " '{print $2}' |awk -F" " '{print $1}')} - export LONB=${LONB:-$($SFCHDR $SFCGESMEAN lonr |grep -i "lonr" |awk -F"= " '{print $2}' |awk -F" " '{print $1}')} - export LEVS=${LEVS:-$($SIGHDR $SIGGESMEAN levs |grep -i "levs" |awk -F"= " '{print $2}' |awk -F" " '{print $1}')} -else - export JCAP=${JCAP:-$($SIGHDR $SIGGESMEAN JCAP||echo 0)} - export JCAP_A=${JCAP_A:-$($SIGHDR $SIGGESMEAN JCAP||echo 0)} - export LATB=${LATB:-$($SFCHDR $SFCGESMEAN LATB||echo 0)} - export LONB=${LONB:-$($SFCHDR $SFCGESMEAN LONB||echo 0)} - export LEVS=${LEVS:-$($SIGHDR $SIGGESMEAN LEVS||echo 0)} -fi -export LATA=${LATA:-$LATB} -export LONA=${LONA:-$LONB} -export NLAT_A=${NLAT_A:-$(($LATA+2))} -export NLON_A=${NLON_A:-$LONA} -export DELTIM=${DELTIM:-$((3600/($JCAP_A/20)))} -export USE_NEWRADBC=${USE_NEWRADBC:-"NO"} -export DOHYBVAR=${DOHYBVAR:-"NO"} -export DOIAU=${DOIAU:-"NO"} - -# Files. -export CYCLEXEC=${CYCLEXEC:-${EXECgsm}/global_cycle$XC} -export GSIEXEC=${GSIEXEC:-${EXECgsi}/global_gsi$XC} -export CYCLESH=${CYCLESH:-${USHgsm}/global_cycle.sh} -export BERROR=${BERROR:-${FIXgsi}/global_berror.l${LEVS}y${NLAT_A}.f77} -export SATANGL=${SATANGL:-${FIXgsi}/global_satangbias.txt} -export SATINFO=${SATINFO:-${FIXgsi}/global_satinfo.txt} -export RADCLOUDINFO=${RADCLOUDINFO:-${FIXgsi}/cloudy_radiance_info.txt} -export RTMFIX=${RTMFIX:-$NWROOT/lib/crtm/${crtm_ver}/fix} -export ANAVINFO=${ANAVINFO:-${FIXgsi}/global_anavinfo.l${LEVS}.txt} -export CONVINFO=${CONVINFO:-${FIXgsi}/global_convinfo.txt} -export INSITUINFO=${INSITUINFO:-${FIXgsi}/global_insituinfo.txt} -export OZINFO=${OZINFO:-${FIXgsi}/global_ozinfo.txt} -export PCPINFO=${PCPINFO:-${FIXgsi}/global_pcpinfo.txt} -export AEROINFO=${AEROINFO:-${FIXgsi}/global_aeroinfo.txt} -export SCANINFO=${SCANINFO:-${FIXgsi}/global_scaninfo.txt} -export HYBENSINFO=${HYBENSINFO:-${FIXgsi}/global_hybens_locinfo.l${LEVS}.txt} -export OBERROR=${OBERROR:-${FIXgsi}/prepobs_errtable.global} -export SELECT_OBS=${SELECT_OBS:-${COMIN}/obsinput_${CDATE}_ensmean} -export SFCG03=${SFCG03:-${COMOUT}/sfcf03} -export SFCG04=${SFCG04:-${COMOUT}/sfcf04} -export SFCG05=${SFCG05:-${COMOUT}/sfcf05} -export SFCG07=${SFCG07:-${COMOUT}/sfcf07} -export SFCG08=${SFCG08:-${COMOUT}/sfcf08} -export SFCG09=${SFCG09:-${COMOUT}/sfcf09} -export NSTG03=${NSTG03:-${COMOUT}/nstf03} -export NSTG04=${NSTG04:-${COMOUT}/nstf04} -export NSTG05=${NSTG05:-${COMOUT}/nstf05} -export NSTG07=${NSTG07:-${COMOUT}/nstf07} -export NSTG08=${NSTG08:-${COMOUT}/nstf08} -export NSTG09=${NSTG09:-${COMOUT}/nstf09} -export SIGG03=${SIGG03:-${COMOUT}/sigf03} -export SIGG04=${SIGG04:-${COMOUT}/sigf04} -export SIGG05=${SIGG05:-${COMOUT}/sigf05} -export SIGG07=${SIGG07:-${COMOUT}/sigf07} -export SIGG08=${SIGG08:-${COMOUT}/sigf08} -export SIGG09=${SIGG09:-${COMOUT}/sigf09} -export RADSTAT=${RADSTAT:-${COMOUT}/${PREINP}radstat} -export GSISTAT=${GSISTAT:-${COMOUT}/${PREINP}gsistat} -export PCPSTAT=${PCPSTAT:-${COMOUT}/${PREINP}pcpstat} -export CNVSTAT=${CNVSTAT:-${COMOUT}/${PREINP}cnvstat} -export OZNSTAT=${OZNSTAT:-${COMOUT}/${PREINP}oznstat} -export RUN_SELECT=${RUN_SELECT:-"NO"} -export USE_SELECT=${USE_SELECT:-"NO"} -export DIAG_SUFFIX=${DIAG_SUFFIX:-""} -export DIAG_COMPRESS=${DIAG_COMPRESS:-"YES"} -export DIAG_TARBALL=${DIAG_TARBALL:-"YES"} -export INISCRIPT=${INISCRIPT} -export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} -export LOGSCRIPT=${LOGSCRIPT} -export ENDSCRIPT=${ENDSCRIPT} -# Other variables. -export LSOIL=${LSOIL:-2} -export FSMCL2=${FSMCL2:-60} -if [ $use_gfs_nemsio = .true. ]; then - export CDATE=${CDATE:-$($SFCHDR $SFCGESMEAN fcstdate | grep -i "fcstdate_ymdh" |awk -F= '{print $2}')} - export DELTSFC=${DELTSFC:-`$SFCHDR $SFCGESMEAN nfhour |awk -F" " '{print $2}'`} -else - export CDATE=${CDATE:-$($SFCHDR $SFCGESMEAN VDATE||echo 0)} - export DELTSFC=${DELTSFC:-$($SFCHDR $SFCGESMEAN FHOUR||echo 0)} -fi -export CYCLVARS=${CYCLVARS} -export SETUP_ENKF=${SETUP_ENKF:-""} -export GRIDOPTS_ENKF=${GRIDOPTS_ENKF:-""} -export BKGVERR_ENKF=${BKGVERR_ENKF:-""} -export ANBKGERR_ENKF=${ANBKGERR_ENKF:-""} -export JCOPTS_ENKF=${JCOPTS_ENKF:-""} -export STRONGOPTS_ENKF=${STRONGOPTS_ENKF:-""} -export OBSQC_ENKF=${OBSQC_ENKF:-""} -export OBSINPUT_ENKF=${OBSINPUT_ENKF:-""} -export SUPERRAD_ENKF=${SUPERRAD_ENKF:-""} -export SINGLEOB_ENKF=${SINGLEOB_ENKF:-""} -export LAGDATA_ENKF=${LAGDATA_ENKF:-""} -export HYBRID_ENSEMBLE_ENKF=${HYBRID_ENSEMBLE_ENKF:-""} -export RAPIDREFRESH_CLDSURF_ENKF=${RAPIDREFRESH_CLDSURF_ENKF:-""} -export CHEM_ENKF=${CHEM_ENKF:-""} -export SMOOTH_ENKF=${SMOOTH_ENKF:-"NO"} -export NTHREADS=${NTHREADS:-1} -export NTHSTACK=${NTHSTACK:-1024000000} -export NTHREADS_GSI=${NTHREADS_GSI:-1} -export NTHSTACK_GSI=${NTHSTACK_GSI:-1024000000} -export FILESTYLE=${FILESTYLE:-'X'} -export PGMOUT=${PGMOUT:-${pgmout:-'&1'}} -export PGMERR=${PGMERR:-${pgmerr:-'&2'}} -export OBERRFLAG=${OBERRFLAG:-.false.} -export NCP=${NCP:-cp} -if [ $machine = IBMP6 ] ; then - typeset -L1 l=$PGMOUT - [[ $l = '&' ]]&&a=''||a='>' - export REDOUT=${REDOUT:-'1>'$a} - typeset -L1 l=$PGMERR - [[ $l = '&' ]]&&a=''||a='>' - export REDERR=${REDERR:-'2>'$a} -else -##export REDOUT=${REDOUT:-'1>'} -##export REDERR=${REDERR:-'2>'} - typeset -L1 l=$PGMOUT - [[ $l = '&' ]]&&a=''||a='>' - export REDOUT=${REDOUT:-'1>'$a} - typeset -L1 l=$PGMERR - [[ $l = '&' ]]&&a=''||a='>' - export REDERR=${REDERR:-'2>'$a} -fi - -################################################################################ -# Preprocessing -$INISCRIPT -pwd=$(pwd) -if [[ -d $DATA ]] -then - mkdata=NO -else - mkdir -p $DATA - mkdata=YES -fi -cd $DATA||exit 99 -export DATATOP=$DATA - - -################################################################################ -# Copy or link input data -if [[ $FILESTYLE = 'C' ]] -then - $NCP $SELECT_OBS ./ -else - ln -fs $SELECT_OBS obs_input.tar -fi - - -################################################################################ -# Set output data - -EOMGGRP=$COMOUT/omgstat_${CDATE}_grp${ENSGRP} -rm -f $EOMGGRP - -################################################################################ -# Generate ensemble innovations -imem=$ENSBEG -while [[ $imem -le $ENSEND ]]; do - export RUN_SELECT=NO - export USE_SELECT=YES - export SELECT_OBS=${SELECT_OBS:-$DATATOP/obsinput_${CDATE}_ensmean} - export SETUP="miter=0,niter=1,lread_obs_save=.false.,lread_obs_skip=.true.,lwrite_predterms=.true.,lwrite_peakwt=.true.,reduce_diag=.true.,$SETUP_ENKF" - export GRIDOPTS="$GRIDOPTS $GRIDOPTS_ENKF" - export BKGVERR="bkgv_flowdep=.false.,$BKGVERR_ENKF" - export ANBKGERR="$ANBKGERR $ANBKGERR_ENKF" - export JCOPTS="$JCOPTS $JCOPTS_ENKF" - export STRONGOPTS="tlnmc_option=0,nstrong=0,nvmodes_keep=0,baldiag_full=.false.,baldiag_inc=.false.,$STRONGOPTS_ENKF" - export OBSQC="tcp_width=60.0,tcp_ermin=2.0,tcp_ermax=12.0,$OBSQC_ENKF" - export OBSINPUT="dmesh(1)=225.0,dmesh(2)=225.0,$OBSINPUT_ENKF" - export SUPERRAD="$SUPERRAD $SUPERRAD_ENKF" - export SINGLEOB="$SINGLEOB $SINGLEOB_ENKF" - export LAGDATA="$LAGDATA $LAGDATA_ENKF" - export HYBRID_ENSEMBLE="$HYBRID_ENSEMBLE $HYBRID_ENSEMBLE_ENKF" - export RAPIDREFRESH_CLDSURF="$RAPIDREFRESH_CLDSURF $RAPIDREFRESH_CLDSURF_ENKF" - export CHEM="$CHEM $CHEM_ENKF" - - export member="mem"`printf %03i $imem` - export DATA=$DATATOP/$member - export pgmoutm=$DATA/${pgmout:-pgmout.$member} - - export SFCG03=$COMINGES/bfg_${GDATE}_fhr03_${member} - export SFCG04=$COMINGES/bfg_${GDATE}_fhr04_${member} - export SFCG05=$COMINGES/bfg_${GDATE}_fhr05_${member} - export SFCG06=$COMINGES/bfg_${GDATE}_fhr06_${member} - export SFCG07=$COMINGES/bfg_${GDATE}_fhr07_${member} - export SFCG08=$COMINGES/bfg_${GDATE}_fhr08_${member} - export SFCG09=$COMINGES/bfg_${GDATE}_fhr09_${member} - export SFCGES=$COMINGES/bfg_${GDATE}_fhr06_${member} - - export NSTG03=$COMINGES/nfg_${GDATE}_fhr03_${member} - export NSTG04=$COMINGES/nfg_${GDATE}_fhr04_${member} - export NSTG05=$COMINGES/nfg_${GDATE}_fhr05_${member} - export NSTG06=$COMINGES/nfg_${GDATE}_fhr06_${member} - export NSTG07=$COMINGES/nfg_${GDATE}_fhr07_${member} - export NSTG08=$COMINGES/nfg_${GDATE}_fhr08_${member} - export NSTG09=$COMINGES/nfg_${GDATE}_fhr09_${member} - export NSTGES=$COMINGES/nfg_${GDATE}_fhr06_${member} - - ENKF_SUFFIX="" - if [[ "$SMOOTH_ENKF" = "YES" ]]; then - ENKF_SUFFIX="s" - fi - export SIGG03=$COMINGES/sfg_${GDATE}_fhr03${ENKF_SUFFIX}_${member} - export SIGG04=$COMINGES/sfg_${GDATE}_fhr04${ENKF_SUFFIX}_${member} - export SIGG05=$COMINGES/sfg_${GDATE}_fhr05${ENKF_SUFFIX}_${member} - export SIGG06=$COMINGES/sfg_${GDATE}_fhr06${ENKF_SUFFIX}_${member} - export SIGG07=$COMINGES/sfg_${GDATE}_fhr07${ENKF_SUFFIX}_${member} - export SIGG08=$COMINGES/sfg_${GDATE}_fhr08${ENKF_SUFFIX}_${member} - export SIGG09=$COMINGES/sfg_${GDATE}_fhr09${ENKF_SUFFIX}_${member} - export SIGGES=$COMINGES/sfg_${GDATE}_fhr06${ENKF_SUFFIX}_${member} - - export SIGANL=$DATA/sanl - export ABIAS=$DATA/abias - export ABIASPC=$DATA/abias_pc - export ABIASAIR=$DATA/abias_air - - export SFCGCY=$COMOUT/sfcgcy_${CDATE}_${member} - export SFCANL=$COMOUT/sfcanl_${CDATE}_${member} - export NSTANL=$COMOUT/nstanl_${CDATE}_${member} - export GSISTAT=$COMOUT/gsistat_${CDATE}_${member} - export RADSTAT=$COMOUT/radstat_${CDATE}_${member} - export OZNSTAT=$COMOUT/oznstat_${CDATE}_${member} - export PCPSTAT=$COMOUT/pcpstat_${CDATE}_${member} - export CNVSTAT=$COMOUT/cnvstat_${CDATE}_${member} - if [ $DOIAU = YES ]; then - export SFCA03=$COMOUT/sfca03_${CDATE}_${member} - fi - - export DIAG_SUFFIX="_${member}" - export DIAG_COMPRESS=NO - export DIAG_TARBALL=YES - export DOHYBVAR=NO - export HYBRID_ENSEMBLE=" " - - if [ -s $SFCANL ] ; then - rm -f $SFCANL - fi - if [ $DOIAU = YES && -s $SFCA03 ] ; then - rm -f $SFCA03 - fi - if [ -s $GSISTAT ] ; then - rm -f $GSISTAT - fi - if [ -s $RADSTAT ] ; then - rm -f $RADSTAT - fi - if [ -s $OZNSTAT ] ; then - rm -f $OZNSTAT - fi - if [ -s $PCPSTAT ] ; then - rm -f $PCPSTAT - fi - if [ -s $CNVSTAT ] ; then - rm -f $CNVSTAT - fi - - - $ANALYSISSH - rc=$? - - cat $pgmoutm - - export ERR=$rc - export err=$ERR - $ERRSCRIPT||exit 2 - - rm log - cp $DATATOP/log_all ./log_old - echo "Process member $imem" > log - cat log_old log > log_new - cp log_new $DATATOP/log_all - - if [ $SENDDBN = YES ]; then - $DBNROOT/bin/dbn_alert MODEL GFS_ENKF $job $SFCANL - fi - - (( imem = $imem + 1 )) - -done - - -################################################################################ -# Save log - -cd $DATATOP -cp log_all $EOMGGRP - - -################################################################################ -# Postprocessing -cd $pwd -[[ $mkdata = YES ]]&&rmdir $DATA -$ENDSCRIPT -set +x -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXITING $0 with return code $err >&2 -fi -exit $err diff --git a/scripts/exglobal_enkf_innovate_obs_fv3gfs.sh.ecf b/scripts/exglobal_enkf_innovate_obs_fv3gfs.sh.ecf deleted file mode 100755 index bd8781154..000000000 --- a/scripts/exglobal_enkf_innovate_obs_fv3gfs.sh.ecf +++ /dev/null @@ -1,197 +0,0 @@ -#!/bin/ksh -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: exglobal_enkf_innovate_obs_fv3gfs.sh.ecf -# Script description: Compute ensemble innovations -# -# Author: Rahul Mahajan Org: NCEP/EMC Date: 2017-03-02 -# -# Abstract: This script runs the innovation calculation script serially over ensemble members -# -# $Id$ -# -# Attributes: -# Language: POSIX shell -# Machine: WCOSS-Cray/Theia -# -################################################################################ - -# Set environment. -export VERBOSE=${VERBOSE:-"YES"} -if [ $VERBOSE = "YES" ] ; then - echo $(date) EXECUTING $0 $* >&2 - set -x -fi - -# Directories. -pwd=$(pwd) -export NWPROD=${NWPROD:-$pwd} -export HOMEgsi=${HOMEgsi:-$NWPROD} -export COMIN=${COMIN:-$pwd} -export COMIN_GES_ENS=${COMIN_GES_ENS:-$COMIN} -export COMOUT=${COMOUT:-$COMIN} -DATA=${DATA:-$pwd/enkf_innovate_obs.$$} - -# Utilities -export NCP=${NCP:-"/bin/cp -p"} -export NMV=${NMV:-"/bin/mv"} -export NLN=${NLN:-"/bin/ln -sf"} -export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} - -# Scripts. -INVOBSSH=${INVOBSSH:-$HOMEgsi/scripts/exglobal_innovate_obs_fv3gfs.sh.ecf} -export ANALYSISSH=${ANALYSISSH:-$HOMEgsi/scripts/exglobal_analysis_fv3gfs.sh.ecf} - -# Enemble group, begin and end -ENSGRP=${ENSGRP:-1} -ENSBEG=${ENSBEG:-1} -ENSEND=${ENSEND:-1} - -# Cycling and forecast hour specific parameters -export CDATE=${CDATE:-"2001010100"} -export CDUMP=${CDUMP:-"gdas"} - -# Re-run failed members, or entire group -RERUN_EOMGGRP=${RERUN_EOMGGRP:-"YES"} - -# Ops related stuff -SENDECF=${SENDECF:-"NO"} - -export SMOOTH_ENKF=${SMOOTH_ENKF:-"YES"} -export USE_SELECT=${USE_SELECT:-"NO"} -export SELECT_OBS=${SELECT_OBS:-${COMOUT}/${APREFIX}obsinput} - -################################################################################ -# Preprocessing -mkdata=NO -if [ ! -d $DATA ]; then - mkdata=YES - mkdir -p $DATA -fi -cd $DATA || exit 99 -DATATOP=$DATA - -ENKF_SUFFIX="s" -[[ $SMOOTH_ENKF = "NO" ]] && ENKF_SUFFIX="" - -################################################################################ -# Set output data -EOMGGRP=$COMOUT/eomg.grp${ENSGRP} -if [ -f $EOMGGRP ]; then - if [ $RERUN_EOMGGRP = "YES" ]; then - rm -f $EOMGGRP - else - echo "RERUN_EOMGGRP = $RERUN_EOMGGRP, will re-run FAILED members only!" - $NMV $EOMGGRP ${EOMGGRP}.fail - fi -fi - -################################################################################ -# Save variables from over-writing -COMOUT_SAVE=$COMOUT - -################################################################################ -# If requested, link and de-tar obs_input -if [ $USE_SELECT = "YES" ]; then - rm -rf obsinput ; mkdir -p obsinput ; cd obsinput - $NLN $SELECT_OBS obsinput.tar - tar -xvf obsinput.tar - rm obsinput.tar - export SELECT_OBS=$DATA/obsinput - cd $DATA -fi - -################################################################################ -# Run innovation script for ensemble member -rc=0 -for imem in $(seq $ENSBEG $ENSEND); do - - cd $DATATOP - - cmem=$(printf %03i $imem) - memchar="mem$cmem" - - echo "Processing MEMBER: $cmem" - - ra=0 - - skip_mem="NO" - if [ -f ${EOMGGRP}.fail ]; then - memstat=$(cat ${EOMGGRP}.fail | grep "MEMBER $cmem" | grep "PASS" | wc -l) - [[ $memstat -eq 1 ]] && skip_mem="YES" - fi - - if [ $skip_mem = "NO" ]; then - - export DATA=$DATATOP/$memchar - [[ -d $DATA ]] && rm -rf $DATA - - export DIAG_SUFFIX="_$memchar" - export COMIN_GES=$COMIN_GES_ENS/$memchar - export COMOUT=$COMOUT_SAVE/$memchar - [[ ! -d $COMOUT ]] && mkdir -p $COMOUT - - export ATMG03="$COMIN_GES/${GPREFIX}atmf003${ENKF_SUFFIX}${GSUFFIX}" - export ATMG04="$COMIN_GES/${GPREFIX}atmf004${ENKF_SUFFIX}${GSUFFIX}" - export ATMG05="$COMIN_GES/${GPREFIX}atmf005${ENKF_SUFFIX}${GSUFFIX}" - export ATMGES="$COMIN_GES/${GPREFIX}atmf006${ENKF_SUFFIX}${GSUFFIX}" - export ATMG07="$COMIN_GES/${GPREFIX}atmf007${ENKF_SUFFIX}${GSUFFIX}" - export ATMG08="$COMIN_GES/${GPREFIX}atmf008${ENKF_SUFFIX}${GSUFFIX}" - export ATMG09="$COMIN_GES/${GPREFIX}atmf009${ENKF_SUFFIX}${GSUFFIX}" - - # Ensure clean tarballs for ensemble member - for ftype in cnvstat oznstat radstat; do - fstat=$COMOUT/${APREFIX}$ftype - [[ -f $fstat ]] && rm -f $fstat - done - - $INVOBSSH - ra=$? - ((rc+=ra)) - - # Notify a member observation innovation failed, freeze eupd, but continue on to next member - if [ $ra -ne 0 ]; then - msg="observation innovation of member $cmem FAILED" - echo $msg - [[ $SENDECF = "YES" ]] && ecflow_client --abort=$msg - fi - - fi - - cd $DATATOP - - $NCP $EOMGGRP log_old - rm log log_new - if [ $ra -ne 0 ]; then - echo "MEMBER $cmem : FAIL" > log - else - echo "MEMBER $cmem : PASS" > log - fi - cat log_old log > log_new - $NCP log_new $EOMGGRP - -done - -################################################################################ -# Echo status of ensemble group -cd $DATATOP -echo "Status of ensemble members in group $ENSGRP:" -cat $EOMGGRP -rm ${EOMGGRP}.fail - -################################################################################ -# If any members failed, error out -export ERR=$rc -export err=$ERR -$ERRSCRIPT || exit 2 - -################################################################################ -# Postprocessing -cd $pwd -[[ $mkdata = "YES" ]]&& rm -rf $DATATOP -set +x -if [ $VERBOSE = "YES" ] ; then - echo $(date) EXITING $0 with return code $err >&2 -fi -exit $err diff --git a/scripts/exglobal_enkf_post.sh.ecf b/scripts/exglobal_enkf_post.sh.ecf deleted file mode 100755 index 2b5675f8c..000000000 --- a/scripts/exglobal_enkf_post.sh.ecf +++ /dev/null @@ -1,599 +0,0 @@ -#!/bin/ksh -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: exglobal_enkfpos.sh.sms -# Script description: global_enkf forecast post processing -# -# Author: Russ Treadon Org: NP23 Date: 2011-12-16 -# -# Abstract: This script runs the global_enkf forecast post processing -# -# Script history log: -# 2011-12-16 Russ Treadon based on GCWMB parallel script epos.sh -# 2014-05-16 Xu Li Add NSST -# -# Usage: exglobal_enkfpos.sh.sms -# -# Input script positional parameters: -# defaults to $IGEN, then to 0 -# -# Imported Shell Variables: -# FIXgsm Directory for global fixed files -# defaults to /nwprod/fix -# EXECgsm Directory for global executables -# defaults to /nwprod/exec -# USHgsm Directory for global scripts -# defaults to /nwprod/ush -# DATA working directory -# (if nonexistent will be made, used and deleted) -# defaults to current working directory -# COMIN input directory -# defaults to current working directory -# COMOUT output directory -# (if nonexistent will be made) -# defaults to current working directory -# XC Suffix to add to executables -# defaults to none -# NCP Copy command -# defaults to cp -# GETATMENSMEANEXEC Compute ensemble mean sigma (optonally smoothed) -# defaults to ${EXECgsm}/getsigensmeanp_smooth$XC -# GETSFCENSMEANEXEC Compute ensemble mean surface file -# defaults to ${EXECgsm}/getsfcensmeanp$XC -# GETNSTENSMEANEXEC Compute ensemble mean NSST file -# defaults to ${EXECgsm}/getnstensmeanp$XC -# HYBENSMOOTH Input level dependent smoothing paramters for sigma file -# defaults to ${FIXgsm}/global_hybens_smoothinfo.l${LEVS}.txt -# INISCRIPT Preprocessing script -# defaults to none -# LOGSCRIPT Log posting script -# defaults to none -# ERRSCRIPT Error processing script -# defaults to 'eval [[ $err = 0 ]]' -# ENDSCRIPT Postprocessing script -# defaults to none -# LEVS Number of levels -# defaults to 64 -# CDATE Current analysis date in yyyymmddhh format -# defaults to the value in the input surface file header -# NTHREADS Number of threads -# defaults to 1 -# NTHSTACK Size of stack per thread -# defaults to 1024000000 -# FILESTYLE File management style flag -# ('C' to copy to/from $DATA, 'L' for symbolic links in $DATA, -# 'X' to use XLFUNIT or symbolic links where appropriate) -# defaults to 'X' -# PGMOUT Executable standard output -# defaults to $pgmout, then to '&1' -# PGMERR Executable standard error -# defaults to $pgmerr, then to '&1' -# pgmout Executable standard output default -# pgmerr Executable standard error default -# REDOUT standard output redirect ('1>' or '1>>') -# defaults to '1>', or to '1>>' to append if $PGMOUT is a file -# REDERR standard error redirect ('2>' or '2>>') -# defaults to '2>', or to '2>>' to append if $PGMERR is a file -# VERBOSE Verbose flag (YES or NO) -# defaults to NO -# -# Exported Shell Variables: -# PGM Current program name -# pgm -# ERR Last return code -# err -# -# Modules and files referenced: -# scripts : $INISCRIPT -# $LOGSCRIPT -# $ERRSCRIPT -# $ENDSCRIPT -# -# programs : $GETATMENSMEANEXEC -# $GETATMENSMEANEXEC -# -# fixed data : $HYBENSMOOTH -# -# input data : -# -# output data: -# -# Remarks: -# -# Condition codes -# 0 - no problem encountered -# >0 - some problem encountered -# -# Control variable resolution priority -# 1 Command line argument. -# 2 Environment variable. -# 3 Inline default. -# -# Attributes: -# Language: POSIX shell -# Machine: IBM SP -# -################################################################################ -# Set environment. -export VERBOSE=${VERBOSE:-"NO"} -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXECUTING $0 $* >&2 - set -x -fi -export machine=${machine:-IBMP6} -export machine=$(echo $machine|tr '[a-z]' '[A-Z]') - -# Command line arguments. -# none -# Directories. -export HOMEDIR=${HOMEDIR:-$NWROOT} -export NWPROD=${NWPROD:-$HOMEDIR} -export FIXgsm=${FIXgsm:-$NWPROD/global_shared.${global_shared_ver}/fix/fix_am} -export EXECgsm=${EXECgsm:-$NWPROD/global_shared.${global_shared_ver}/exec} -export USHgsm=${USHgsm:-$NWPROD/global_shared.${global_shared_ver}/ush} -export FIXgsi=${FIXgsi:-$NWPROD/global_shared.${global_shared_ver}/fix} -export EXECgdas=${EXECgdas:-$NWPROD/gdas.${gdas_ver}/exec} -export USHgdas=${USHgdas:-$NWPROD/gdas.${gdas_ver}/ush} -export DATA=${DATA:-$(pwd)} -export COMIN=${COMIN:-$(pwd)} -export COMOUT=${COMOUT:-$(pwd)} -# Set script / EnKF update control parameters -export use_gfs_nemsio=${use_gfs_nemsio:-".false."} # run script with NEMSIO input/output -# Filenames. -export XC=${XC:-".x"} -export LEVS=${LEVS:-64} -export INISCRIPT=${INISCRIPT} -export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} -export LOGSCRIPT=${LOGSCRIPT} -export ENDSCRIPT=${ENDSCRIPT} -export HYBENSMOOTH=${HYBENSMOOTH:-$FIXgsi/global_hybens_smoothinfo.l${LEVS}.txt} -export SFCHDR=${SFCHDR:-${EXECgsm}/global_sfchdr$XC} -# I/O filenames. -if [ $use_gfs_nemsio = .true. ]; then - export CDATE=${CDATE:-$($SFCHDR $SFCGES fcstdate | grep -i "fcstdate_ymdh" |awk -F= '{print $2}')} -else - export CDATE=${CDATE:-$($SFCHDR $SFCGES VDATE||echo 0)} -fi -export SIGENS_IN=${SIGENS_IN:-$COMIN/sfg_${CDATE}_fhr} -export SFCENS=${SFCENS:-$COMIN/bfg_${CDATE}_fhr} -export ENSSTAT=${ENSSTAT:-$COMOUT/ensstat_${CDATE}_all} -export SIGENSMEAN=${SIGENSMEAN:-$COMOUT/sfg_${CDATE}_fhr} -export SFCENSMEAN=${SFCENSMEAN:-$COMOUT/bfg_${CDATE}_fhr} -export SIGENS_OUT=${SIGENS_OUT:-${COMOUT}/sfg_${CDATE}_fhr} -# Executables. -export GETATMENSMEANEXEC=${GETATMENSMEANEXEC:-$EXECgdas/getsigensmean_smoothp$XC} -export GETSFCENSMEANEXEC=${GETSFCENSMEANEXEC:-$EXECgdas/getsfcensmeanp$XC} -export GETATMENSSTATEXEC=${GETATMENSSTATEXEC:-$EXECgdas/getsigensstatp$XC} -export NSTENS=${NSTENS:-$COMIN/nfg_${CDATE}_fhr} -export NSTENSMEAN=${NSTENSMEAN:-$COMOUT/nfg_${CDATE}_fhr} -export GETNSTENSMEANEXEC=${GETNSTENSMEANEXEC:-$EXECgdas/getnstensmeanp$XC} -# Other variables. -export FHOUTEFCS=${FHOUT_ENKF:-3} -export FHMINEFCS=${FHMIN_ENKF:-3} -export FHMAXEFCS=${FHMAX_ENKF:-9} -export NMEM_ENKF=${NMEM_ENKF:-80} -export SMOOTH_ENKF=${SMOOTH_ENKF:-"NO"} -export MPMD=${MPMD:-NO} -export MPMD_OPTS=${MPMD_OPTS:-"-pgmmodel mpmd -ilevel 2 -labelio yes -stdoutmode ordered"} -export NTHREADS_EPOS=${NTHREADS_EPOS:-1} -export NTHSTACK=${NTHSTACK:-1024000000} -export FILESTYLE=${FILESTYLE:-'X'} -export PGMOUT=${PGMOUT:-${pgmout:-'&1'}} -export PGMERR=${PGMERR:-${pgmerr:-'&2'}} -export NCP=${NCP:-cp} -export APRUN=${APRUN:-""} -export NST_GSI=${NST_GSI:-0} - -if [ $machine = IBMP6 ] ; then - typeset -L1 l=$PGMOUT - [[ $l = '&' ]]&&a=''||a='>' - export REDOUT=${REDOUT:-'1>'$a} - typeset -L1 l=$PGMERR - [[ $l = '&' ]]&&a=''||a='>' - export REDERR=${REDERR:-'2>'$a} -else - export REDOUT=${REDOUT:-'1>'} - export REDERR=${REDERR:-'2>'} -fi -export l4densvar=${l4densvar:-".false."} - -ENKF_SUFFIX="" -if [[ "$SMOOTH_ENKF" = "YES" ]]; then - ENKF_SUFFIX="s" -fi - - -################################################################################ -# Preprocessing -$INISCRIPT -pwd=$(pwd) -if [[ -d $DATA ]] -then - mkdata=NO -else - mkdir -p $DATA - mkdata=YES -fi -cd $DATA||exit 99 - - -################################################################################ -# Copy or link files -if [ $machine = IBMP6 ] ; then - export XLSMPOPTS="parthds=$NTHREADS_EPOS:stack=$NTHSTACK" -fi -export OMP_NUM_THREADS=$NTHREADS_EPOS - -export XLSMPOPTS="stack=$NTHSTACK" -$LOGSCRIPT - -rm getsigensmean_smooth.x getsfcensmean_smooth.x hybens_smoothinfo -rm sfg*fhr03* sfg*fhr04* sfg*fhr05* sfg*fhr06* sfg*fhr07* sfg*fhr08* sfg*fhr09* -rm bfg*fhr03* bfg*fhr04* bfg*fhr05* bfg*fhr06* bfg*fhr07* bfg*fhr08* bfg*fhr09* -rm nfg*fhr03* nfg*fhr04* nfg*fhr05* nfg*fhr06* nfg*fhr07* nfg*fhr08* nfg*fhr09* - - -$NCP $GETSFCENSMEANEXEC $DATA -$NCP $GETATMENSMEANEXEC $DATA -$NCP $GETATMENSSTATEXEC $DATA -if [ $NST_GSI -gt 0 ]; then - $NCP $GETNSTENSMEANEXEC $DATA -fi - -if [[ $FILESTYLE = 'C' ]] -then - # Forecast fields - - FHOUT=$FHOUTEFCS - FHMIN=$FHMINEFCS - FHMAX=$FHMAXEFCS - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - FHBEG=$FHMIN - FHEND=$FHMAX - FH=$FHBEG - until [[ $FH -gt $FHEND ]];do - [[ $FH -lt 10 ]]&&FH=0$FH - $NCP ${SFCENS}${FH}${member} bfg_${CDATE}_fhr${FH}$member - $NCP ${SIGENS_IN}${FH}${member} sfg_${CDATE}_fhr${FH}$member - if [ $NST_GSI -gt 0 ]; then - $NCP ${NSTENS}${FH}${member} nfg_${CDATE}_fhr${FH}$member - fi - FH=`expr $FH + $FHOUT` - done - (( imem = $imem + 1 )) - done - -else - # Forecast fields - FHOUT=$FHOUTEFCS - FHMIN=$FHMINEFCS - FHMAX=$FHMAXEFCS - - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - FHBEG=$FHMIN - FHEND=$FHMAX - FH=$FHBEG - until [[ $FH -gt $FHEND ]];do - [[ $FH -lt 10 ]]&&FH=0$FH - ln -fs ${SFCENS}${FH}${member} bfg_${CDATE}_fhr${FH}$member - ln -fs ${SIGENS_IN}${FH}${member} sfg_${CDATE}_fhr${FH}$member - if [ $NST_GSI -gt 0 ]; then - ln -fs ${NSTENS}${FH}${member} nfg_${CDATE}_fhr${FH}$member - fi - FH=`expr $FH + $FHOUT` - done - (( imem = $imem + 1 )) - done - - # Output files - FHBEG=$FHMIN - FHEND=$FHMAX - FH=$FHBEG - until [[ $FH -gt $FHEND ]];do - [[ $FH -lt 10 ]]&&FH=0$FH - ln -fs ${SIGENSMEAN}${FH}_ensmean sfg_${CDATE}_fhr${FH}_ensmean - ln -fs ${SFCENSMEAN}${FH}_ensmean bfg_${CDATE}_fhr${FH}_ensmean - ln -fs ${SIGENSMEAN}${FH}_ensmean.nc4 sfg_${CDATE}_fhr${FH}_ensmean.nc4 - ln -fs ${SIGENSMEAN}${FH}_ensspread.nc4 sfg_${CDATE}_fhr${FH}_ensspread.nc4 - if [ $NST_GSI -gt 0 ]; then - ln -fs ${NSTENSMEAN}${FH}_ensmean nfg_${CDATE}_fhr${FH}_ensmean - fi - FH=`expr $FH + $FHOUT` - done - if [[ "$SMOOTH_ENKF" = "YES" ]]; then - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - FHBEG=$FHMIN - FHEND=$FHMAX - FH=$FHBEG - until [[ $FH -gt $FHEND ]];do - [[ $FH -lt 10 ]]&&FH=0$FH - ln -fs ${SIGENS_OUT}${FH}${ENKF_SUFFIX}${member} sfg_${CDATE}_fhr${FH}${ENKF_SUFFIX}$member - FH=`expr $FH + $FHOUT` - done - (( imem = $imem + 1 )) - done - fi -fi - -################################################################################ -# Set output data -ENSSTAT=$COMOUT/ensstat_${CDATE}_all -rm -f $ENSSTAT - - -################################################################################ -# Generate ensemble mean surface and atmospheric files -analdate=$CDATE -datapath=. -FHBEG=$FHMIN -FHEND=$FHMAX -FH=$FHBEG - -if [[ "$SMOOTH_ENKF" = "YES" ]]; then - cp $HYBENSMOOTH ./hybens_smoothinfo -fi - -if [[ "$MPMD" = "YES" ]]; then - if [ $machine = IBMP6 ] ; then - nprocs=$(echo $LOADL_PROCESSOR_LIST|wc -w) - elif [ $machine = WCOSS ] ; then - nprocs=$LSB_DJOB_NUMPROC - fi - FHBEG=$FHMINEFCS - FHEND=$FHMAXEFCS - FHOUT=$FHOUTEFCS - FH=$FHMIN - cnt=0 - ncnt=-1 - until [[ $FH -gt $FHEND ]];do - [[ $FH -lt 10 ]]&&FH=0$FH - cmd[$cnt]="$GETSFCENSMEANEXEC ${datapath}/ bfg_${analdate}_fhr${FH}_ensmean bfg_${analdate}_fhr${FH} $NMEM_ENKF" - cmd[$cnt]="$GETATMENSMEANEXEC ${datapath}/ sfg_${analdate}_fhr${FH}_ensmean sfg_${analdate}_fhr${FH} $NMEM_ENKF" - cmd[$cnt]="$GETATMENSSTATEXEC ${datapath}/ sfg_${analdate}_fhr${FH} $NMEM_ENKF" - if [ $NST_GSI -gt 0 ]; then - cmd[$cnt]="$GETNSTENSMEANEXEC ${datapath}/ nfg_${analdate}_fhr${FH}_ensmean nfg_${analdate}_fhr${FH} $NMEM_ENKF" - fi - ((cnt+=1)) - ((ncnt+=1)) - FH=`expr $FH + $FHOUT` - done - - rm $DATA/cmdfile - m=-1 - n=0 - while [ $((n+=1)) -le $nprocs ] ;do - while [ $((m+=1)) -le $ncnt ] ;do - echo "${cmd[m]}" >> $DATA/cmdfile - ((n+=1)) - done - if [ $n -le $nprocs ] ; then - echo "echo do-nothing" >> $DATA/cmdfile - fi - done - if [ $machine = IBMP6 ] ; then - /usr/bin/poe -cmdfile $DATA/cmdfile $MPMD_OPTS - rc=$? - elif [ $machine = WCOSS ]; then - export MP_PGMMODEL=${MP_PGMMODEL:-mpmd} - export MP_CMDFILE=$DATA/cmdfile - $APRUN - rc=$? - fi -else -# Run serially instead - - FHBEG=$FHMINEFCS - FHEND=$FHMAXEFCS - FHOUT=$FHOUTEFCS - FH=$FHMIN - rc=0 - until [[ $FH -gt $FHEND ]];do - [[ $FH -lt 10 ]]&&FH=0$FH - eval "$APRUN $GETSFCENSMEANEXEC ${datapath}/ bfg_${analdate}_fhr${FH}_ensmean bfg_${analdate}_fhr${FH} $NMEM_ENKF" - eval "$APRUN $GETATMENSMEANEXEC ${datapath}/ sfg_${analdate}_fhr${FH}_ensmean sfg_${analdate}_fhr${FH} $NMEM_ENKF" - eval "$APRUN $GETATMENSSTATEXEC ${datapath}/ sfg_${analdate}_fhr${FH} $NMEM_ENKF" - if [ $NST_GSI -gt 0 ]; then - eval "$APRUN $GETNSTENSMEANEXEC ${datapath}/ nfg_${analdate}_fhr${FH}_ensmean nfg_${analdate}_fhr${FH} $NMEM_ENKF" - fi - ra=$? - ((rc+=ra)) - FH=`expr $FH + $FHOUT` - done -fi -export ERR=$rc -export err=$ERR -$ERRSCRIPT||exit 2 - -################################################################################ -# If smoothing on but no smoothing output, copy smoothed enkf atmospheric files -if [[ "$SMOOTH_ENKF" = "YES" ]]; then - if [[ ! -s sfg_${CDATE}_fhr06s_mem001 ]]; then - FILEPREFIX=sfg_${CDATE}_fhr - if [[ $FILESTYLE = 'L' ]] then - FILEPREFIX=${SIGENS_OUT} - fi - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - FHBEG=$FHMIN - FHEND=$FHMAX - FH=$FHBEG - until [[ $FH -gt $FHEND ]];do - [[ $FH -lt 10 ]]&&FH=0$FH - cp sfg_${CDATE}_fhr${FH}$member ${FILEPREFIX}${FH}${ENKF_SUFFIX}$member - FH=`expr $FH + $FHOUT` - done - (( imem = $imem + 1 )) - done - fi -fi - -################################################################################ -# Copy output files -if [[ $FILESTYLE = 'C' ]] -then - FHBEG=$FHMIN - FHEND=$FHMAX - FH=$FHBEG - until [[ $FH -gt $FHEND ]];do - [[ $FH -lt 10 ]]&&FH=0$FH - cp sfg_${CDATE}_fhr${FH}_ensmean ${SIGENSMEAN}${FH}_ensmean - cp bfg_${CDATE}_fhr${FH}_ensmean ${SFCENSMEAN}${FH}_ensmean - cp sfg_${CDATE}_fhr${FH}_ensmean.nc4 ${SIGENSMEAN}${FH}_ensmean.nc4 - cp sfg_${CDATE}_fhr${FH}_ensspread.nc4 ${SIGENSMEAN}${FH}_ensspread.nc4 - if [ $NST_GSI -gt 0 ]; then - cp nfg_${CDATE}_fhr${FH}_ensmean ${NSTENSMEAN}${FH}_ensmean - fi - FH=`expr $FH + $FHOUT` - done - - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - FHBEG=$FHMIN - FHEND=$FHMAX - FH=$FHBEG - until [[ $FH -gt $FHEND ]];do - [[ $FH -lt 10 ]]&&FH=0$FH - cp sfg_${CDATE}_fhr${FH}${ENKF_SUFFIX}$member ${SIGENS_OUT}${FH}${ENKF_SUFFIX}${member} - FH=`expr $FH + $FHOUT` - done - (( imem = $imem + 1 )) - done -fi - -################################################################################ -# If requested, generate low resolution fhr06 ensemble mean and ensemble member -# files - -export JCAP_ENKF=${JCAP_ENKF:-574} -export JCAP_LORES=${JCAP_LORES:-254} -export LATB_LORES=${LATB_LORES:-384} -export LONB_LORES=${LONB_LORES:-768} -export LEVS_LORES=${LEVS_LORES:-64} - -export OROGRAPHY_LORES=$FIXgsm/global_orography.t$JCAP_LORES.$LONB_LORES.$LATB_LORES.grb -export OROGRAPHY_UF_LORES=$FIXgsm/global_orography_uf.t$JCAP_LORES.$LONB_LORES.$LATB_LORES.grb -export LONSPERLAT_LORES=$FIXgsm/global_lonsperlat.t${JCAP_LORES}.$LONB_LORES.$LATB_LORES.txt -export SLMASK_LORES=$FIXgsm/global_slmask.t$JCAP_LORES.$LONB_LORES.$LATB_LORES.grb -export MTNVAR_LORES=$FIXgsm/global_mtnvar.t$JCAP_LORES.$LONB_LORES.$LATB_LORES.f77 -export SIGLEVEL_LORES=$FIXgsm/global_hyblev.l${LEVS_LORES}.txt - - -if [[ "$JCAP_LORES" -lt "$JCAP_ENKF" ]]; then - fhrlist="06" - if [ $l4densvar = .true. ]; then - fhrlist="03 06 09" - fi - for fhr in $fhrlist; do - rm -rf $DATA/poescript.$fhr - member="ensmean" - export SIGINP=${SIGENS_OUT}${fhr}_${member} - export SIGOUT=${SIGENS_OUT}${fhr}_${member}_t${JCAP_LORES} - echo "$USHgdas/gfs_truncate_enkf.sh $member $SIGINP $SIGOUT $JCAP_LORES $LATB_LORES $LONB_LORES" >> $DATA/poescript.$fhr - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="mem"`printf %03i $imem` - export SIGINP=${SIGENS_OUT}${fhr}${ENKF_SUFFIX}_${member} - export SIGOUT=${SIGENS_OUT}${fhr}${ENKF_SUFFIX}_${member}_t${JCAP_LORES} - echo "$USHgdas/gfs_truncate_enkf.sh $member $SIGINP $SIGOUT $JCAP_LORES $LATB_LORES $LONB_LORES" >> $DATA/poescript.$fhr - (( imem = $imem + 1 )) - done - chmod 755 poescript.$fhr - if [ $machine = WCOSS ] ; then - export MP_PGMMODEL=mpmd - export MP_CMDFILE=$DATA/poescript.$fhr - mpirun.lsf - export err=$?; err_chk - else - $DATA/poescript.$fhr - export err=$? - fi - done -fi - - - -################################################################################ -# Generate status log -rm log_allsfc -rm log_allatm - -FHBEG=$FHMIN -FHEND=$FHMAX -FH=$FHBEG -until [[ $FH -gt $FHEND ]];do - [[ $FH -lt 10 ]]&&FH=0$FH - if [[ `expr $FH % 3` -eq 0 ]]; then - - if [[ -s ${datapath}/bfg_${analdate}_fhr${FH}_ensmean ]]; then - if [ $SENDDBN = YES ]; then - $DBNROOT/bin/dbn_alert MODEL GFS_ENKF $job ${SFCENSMEAN}${FH}_ensmean - fi - string="DONE bfg fhr $FH" - else - string="MISS bfg fhr $FH" - fi - fi - rm log log_old log_new - cp log_allsfc ./log_old - echo $string > log - cat log_old log > log_new - cp log_new log_allsfc - - if [[ -s ${datapath}/sfg_${analdate}_fhr${FH}_ensmean ]]; then - string="DONE sfg fhr $FH" - else - string="MISS sfg fhr $FH" - fi - rm log log_old log_new - cp log_allatm ./log_old - echo $string > log - cat log_old log > log_new - cp log_new log_allatm - - FH=`expr $FH + $FHOUT` -done - -rm log_all -cat log_allsfc log_allatm > log_all -cp log_all $ENSSTAT - -if [ $SENDDBN = YES ] ; then -imem=1 -while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - #FHBEG=$FHMIN - FHEND=$FHMAX - FH=6 - until [[ $FH -gt $FHEND ]];do - [[ $FH -lt 10 ]]&&FH=0$FH - if [[ `expr $FH % 3` -eq 0 ]] - then - $DBNROOT/bin/dbn_alert MODEL GFS_ENKF $job ${SIGENS_OUT}${FH}${ENKF_SUFFIX}${member} - fi - FH=`expr $FH + $FHOUT` - done - (( imem = $imem + 1 )) -done -fi - -################################################################################ -# Postprocessing -cd $pwd -[[ $mkdata = YES ]]&&rmdir $DATA -$ENDSCRIPT -set +x -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXITING $0 with return code $err >&2 -fi -exit $err diff --git a/scripts/exglobal_enkf_update.sh.ecf b/scripts/exglobal_enkf_update.sh.ecf deleted file mode 100755 index 0e98b8c6d..000000000 --- a/scripts/exglobal_enkf_update.sh.ecf +++ /dev/null @@ -1,607 +0,0 @@ -#!/bin/ksh -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: exglobal_enkfupdat.sh.sms -# Script description: Make global_enkf update -# -# Author: Daryl Kleist Org: NP23 Date: 2011-03-24 -# -# Abstract: This script runs the global_enkf update -# -# Script history log: -# 2011-03-24 Russ Treadon copy from enkf/trunk/scripts_ncep -# -# Usage: exglobal_enkfupdat.sh.sms SFCGES SIGGES GBIAS GBIASE -# -# Input script positional parameters: -# 1 Input surface guess -# defaults to $SFCGES; required -# 2 Input sigma guess -# defaults to $SIGGES; required -# 3 Input guess time dependent bias correction coefficients -# defaults to $GBIAS; required -# 4 Input guess angle dependent bias correction -# defaults to $GBIASE; required -# -# Imported Shell Variables: -# SFCGES Input ensemble mean surface guess -# overridden by $1; required -# SIGGES Input ensemble mean sigma guess -# overridden by $2; required -# GBIAS Input guess bias correction -# overridden by $3; required -# GBIASE Input guess angle dependent bias correction -# overridden by $4; required -# ENKFSTAT Output enkf update statistics -# defaults to ${COMIN}/${PREINP}enkfstat -# FIXGSM Directory for global fixed files -# defaults to /nwprod/fix -# EXECgsm Directory for global executables -# defaults to /nwprod/exec -# DATA working directory -# (if nonexistent will be made, used and deleted) -# defaults to current working directory -# COMIN input directory -# defaults to current working directory -# COMOUT output directory -# (if nonexistent will be made) -# defaults to current working directory -# XC Suffix to add to executables -# defaults to none -# PREINP Prefix to add to input observation files -# defaults to none -# SUFINP Suffix to add to input observation files -# defaults to none -# NCP Copy command -# defaults to cp -# SIGHDR Command to read sigma header -# defaults to ${EXECgsm}/global_sighdr$XC -# SFCHDR Command to read surface header -# defaults to ${EXECgsm}/global_sfchdr$XC -# ENKFUPDEXEC Spectral analysis executable -# defaults to ${EXECgsm}/global_enkf$XC -# SATINFO Input satellite information file -# defaults to ${FIXgsi}/global_satinfo.txt -# CONVINFO Input conventional observation information file -# defaults to ${FIXgsi}/global_convinfo.txt -# OZINFO Input ozone information file -# defaults to ${FIXgsi}/global_ozone.txt -# SCANINFO Input satellite scan information file -# defaults to ${FIXgsi}/global_scaninfo.txt -# HYBENSINFO Input hybrid ensemble localization information file -# defaults to ${FIXgsi}/global_hybens_locinfo.l${LEVS}.txt -# ANAVINFO Input control vector information file -# defaults to ${FIXgsi}/global_anavinfo.l64.txt -# TCVITL Input tcvitals file -# defaults to ${COMIN}/${PREINP}syndata.tcvitals.tm00 -# INISCRIPT Preprocessing script -# defaults to none -# LOGSCRIPT Log posting script -# defaults to none -# ERRSCRIPT Error processing script -# defaults to 'eval [[ $err = 0 ]]' -# ENDSCRIPT Postprocessing script -# defaults to none -# LEVS Number of levels -# CDATE Current analysis date in yyyymmddhh format -# defaults to the value in the input surface file header -# LATB Number of latitudes in surface cycling -# defaults to the value in the input surface file header -# LONB Number of longitudes in surface cycling -# defaults to the value in the input surface file header -# LATA Number of latitudes in spectral analysis -# defaults to $LATB -# LONA Number of longitudes in spectral analysis -# defaults to $LONB -# NTHREADS Number of threads -# defaults to 1 -# NTHSTACK Size of stack per thread -# defaults to 1024000000 -# NTHREADS_ENKF Number of threads for ENKFUPDEXEC -# defaults to 1 -# NTHSTACK_ENKF Size of stack per thread for ENKFUPDEXEC -# defaults to 1024000000 -# FILESTYLE File management style flag -# ('C' to copy to/from $DATA, 'L' for symbolic links in $DATA, -# 'X' to use XLFUNIT or symbolic links where appropriate) -# defaults to 'X' -# PGMOUT Executable standard output -# defaults to $pgmout, then to '&1' -# PGMERR Executable standard error -# defaults to $pgmerr, then to '&1' -# pgmout Executable standard output default -# pgmerr Executable standard error default -# REDOUT standard output redirect ('1>' or '1>>') -# defaults to '1>', or to '1>>' to append if $PGMOUT is a file -# REDERR standard error redirect ('2>' or '2>>') -# defaults to '2>', or to '2>>' to append if $PGMERR is a file -# VERBOSE Verbose flag (YES or NO) -# defaults to NO -# -# Exported Shell Variables: -# PGM Current program name -# pgm -# ERR Last return code -# err -# -# Modules and files referenced: -# scripts : $INISCRIPT -# $LOGSCRIPT -# $ERRSCRIPT -# $ENDSCRIPT -# -# programs : $CYCLEXEC -# $ENKFUPDEXEC -# -# fixed data : $BERROR -# $SATANGL -# $SATINFO -# $RTMFIX -# $RTMEMIS -# $RTMAERO -# $RTMCLDS -# $CONVINFO -# $OZINFO -# $PCPINFO -# $AEROINFO -# $SCANINFO -# $HYBENSINFO -# $ANAVINFO -# -# input data : $SFCGES -# $SIGGES -# $SIGGESENS -# $GBIAS -# $GBIASE -# $CNVSTAT -# $OZNSTAT -# $RADSTAT -# -# output data: -# $SIGANLENS -# $OSENSE -# $ENKFSTAT -# $PGMOUT -# $PGMERR -# -# Remarks: -# -# Condition codes -# 0 - no problem encountered -# >0 - some problem encountered -# -# Control variable resolution priority -# 1 Command line argument. -# 2 Environment variable. -# 3 Inline default. -# -# Attributes: -# Language: POSIX shell -# Machine: IBM SP -# -################################################################################ -# Set environment. -export VERBOSE=${VERBOSE:-"NO"} -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXECUTING $0 $* >&2 - set -x -fi -export machine=${machine:-IBMP6} -export machine=$(echo $machine|tr '[a-z]' '[A-Z]') -if [ $machine = ZEUS ] ; then - export MPI_BUFS_PER_PROC=512 - export MPI_BUFS_PER_HOST=512 - export MPI_GROUP_MAX=512 -fi -# Command line arguments. -export SFCGES=${1:-${SFCGES:?}} -export SIGGES=${2:-${SIGGES:?}} -export GBIAS=${3:-${GBIAS:?}} -export GBIASE=${4:-${GBIASE:?}} -# Directories. -export HOMEDIR=${HOMEDIR:-$NWROOT} -export NWPROD=${NWPROD:-$HOMEDIR} -export FIXgsi=${FIXgsi:-$NWPROD/global_shared.${global_shared_ver}/fix} -export EXECgsm=${EXECgsm:-$NWPROD/global_shared.${global_shared_ver}/exec} -export EXECgdas=${EXECgdas:-$NWPROD/gdas.${gdas_ver}/exec} - -export utilscript=${utilscript:-$NWPROD/util/ush} -export DATA=${DATA:-$(pwd)} -export COMIN=${COMIN:-$(pwd)} -export COMOUT=${COMOUT:-$(pwd)} -# Set script / EnKF update control parameters -export use_gfs_nemsio=${use_gfs_nemsio:-".false."} # run EnKF update with NEMSIO input/output -export fso_cycling=${fso_cycling:-".false."} # write additional files needed for EFSOI calculations -# Filenames. -export XC=${XC} -export PREINP=${PREINP} -export SUFINP=${SUFINP} -export SIGHDR=${SIGHDR:-${EXECgsm}/global_sighdr$XC} -export SFCHDR=${SFCHDR:-${EXECgsm}/global_sfchdr$XC} -if [ $use_gfs_nemsio = .true. ]; then - export LATB=${LATB:-$($SFCHDR $SFCGES latr |grep -i "latr" |awk -F"= " '{print $2}' |awk -F" " '{print $1}')} - export LONB=${LONB:-$($SFCHDR $SFCGES lonr |grep -i "lonr" |awk -F"= " '{print $2}' |awk -F" " '{print $1}')} - export LEVS=${LEVS:-$($SIGHDR $SIGGES levs |grep -i "levs" |awk -F"= " '{print $2}' |awk -F" " '{print $1}')} - export CDATE=${CDATE:-$($SFCHDR $SFCGES fcstdate | grep -i "fcstdate_ymdh" |awk -F= '{print $2}')} -else - export LATB=${LATB:-$($SFCHDR $SFCGES LATB||echo 0)} - export LONB=${LONB:-$($SFCHDR $SFCGES LONB||echo 0)} - export LEVS=${LEVS:-$($SIGHDR $SIGGES LEVS||echo 0)} - export CDATE=${CDATE:-$($SFCHDR $SFCGES VDATE||echo 0)} -fi -export LATA=${LATA:-$LATB} -export LONA=${LONA:-$LONB} -export NPTS=`expr \( $LONA \) \* \( $LATA \)` -export ENKFUPDEXEC=${ENKFUPDEXEC:-${EXECgdas}/global_enkf$XC} -export SATANGL=${SATANGL:-${FIXgsi}/global_satangbias.txt} -export SATINFO=${SATINFO:-${FIXgsi}/global_satinfo.txt} -export CONVINFO=${CONVINFO:-${FIXgsi}/global_convinfo.txt} -export OZINFO=${OZINFO:-${FIXgsi}/global_ozinfo.txt} -export SCANINFO=${SCANINFO:-${FIXgsi}/global_scaninfo.txt} -export HYBENSINFO=${HYBENSINFO:-${FIXgsi}/global_hybens_locinfo.l${LEVS}.txt} -export ANAVINFO=${ANAVINFO:-${FIXgsi}/global_anavinfo.l${LEVS}.txt} -export SIGGESENS=${SIGGESENS:-${COMIN}/sigf06_ens} -if [ $fso_cycling = .true. ]; then - export OSENSE=${OSENSE:-${COMOUT}/osense_} -fi -export SIGANLENS=${SIGANLENS:-${COMOUT}/sanl} -export USE_NEWRADBC=${USE_NEWRADBC:-"NO"} -export NMEM_ENKF=${NMEM_ENKF:-0} -export ENKFSTAT=${ENKFSTAT:-${COMOUT}/${PREINP}enkfstat} -export CNVSTAT=${CNVSTAT:-${COMIN}/${PREINP}cnvstat} -export OZNSTAT=${OZNSTAT:-${COMIN}/${PREINP}oznstat} -export RADSTAT=${RADSTAT:-${COMIN}/${PREINP}radstat} -export INISCRIPT=${INISCRIPT} -export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} -export LOGSCRIPT=${LOGSCRIPT} -export ENDSCRIPT=${ENDSCRIPT} -# Other variables. -export NDATE=${NDATE:-/$NWPROD/util/exec/ndate} -export GDATE=${GDATE:-($NDATE -06 $CDATE)} -export NANALS=${NANALS:-80} -export SMOOTHINF=${SMOOTHINF:-24} -export NTRAC=${NTRAC:-3} -export NAM_ENKF=${NAM_ENKF:-""} -export SATOBS_ENKF=${SATOBS_ENKF:-""} -export OZOBS_ENKF=${OZOBS_ENKF:-""} -export NTHREADS=${NTHREADS:-1} -export NTHSTACK=${NTHSTACK:-1024000000} -export NTHREADS_ENKF=${NTHREADS_ENKF:-1} -export NTHSTACK_ENKF=${NTHSTACK_ENKF:-1024000000} -export FILESTYLE=${FILESTYLE:-'X'} -export PGMOUT=${PGMOUT:-${pgmout:-'&1'}} -export PGMERR=${PGMERR:-${pgmerr:-'&2'}} -export OBERRFLAG=${OBERRFLAG:-.false.} -export NCP=${NCP:-cp} -if [ $machine = IBMP6 ] ; then - typeset -L1 l=$PGMOUT - [[ $l = '&' ]]&&a=''||a='>' - export REDOUT=${REDOUT:-'1>'$a} - typeset -L1 l=$PGMERR - [[ $l = '&' ]]&&a=''||a='>' - export REDERR=${REDERR:-'2>'$a} -else - export REDOUT=${REDOUT:-'1>'} - export REDERR=${REDERR:-'2>'} -fi -export APRUN=${APRUN:-""} -export APRUNCFP=${APRUNCFP:-""} -export USE_CFP=${USE_CFP:-"NO"} - - -################################################################################ -# Preprocessing -$INISCRIPT -pwd=$(pwd) -if [[ -d $DATA ]] -then - mkdata=NO -else - mkdir -p $DATA - mkdata=YES -fi -cd $DATA||exit 99 - -################################################################################ - - -################################################################################ -# Run enkf update -if [ $machine = IBMP6 ] ; then - export XLSMPOPTS="parthds=$NTHREADS_ENKF:stack=$NTHSTACK_ENKF" -fi -export OMP_NUM_THREADS=$NTHREADS_ENKF -export PGM='$APRUN $DATA/$(basename $ENKFUPDEXEC)' -export pgm=$PGM -$LOGSCRIPT - -rm convinfo satinfo ozinfo satbias_angle satbias_in enkf.nml -rm hybens_info -rm sanl* - -if [[ $USE_CFP = YES ]]; then - rm $DATA/untar.sh $DATA/mp_untar.sh - set +x -cat <<\EOFuntar > $DATA/untar.sh -#!/bin/ksh -{ echo - member=$1 - list="$CNVSTAT $OZNSTAT $RADSTAT" - for type in $list; do - if [[ $FILESTYLE = 'C' ]]; then - $NCP ${type}${member} ./ - fi - tar -xvf ${type}${member} - done -} -EOFuntar - set -x - chmod 755 $DATA/untar.sh -fi - -$NCP $ENKFUPDEXEC $DATA -if [[ $FILESTYLE = 'C' ]] -then - # Fixed fields - $NCP $SATANGL satbias_angle - $NCP $SATINFO satinfo - $NCP $SCANINFO scaninfo - $NCP $CONVINFO convinfo - $NCP $OZINFO ozinfo - $NCP $HYBENSINFO hybens_info - $NCP $ANAVINFO anavinfo - - # Ensemble observational and guess data - if [[ $USE_CFP = YES ]]; then - echo "$DATA/untar.sh _ensmean" | tee -a $DATA/mp_untar.sh - else - list="$CNVSTAT $OZNSTAT $RADSTAT" - for type in $list; do - $NCP ${type}_ensmean ./ - tar -xvf ${type}_ensmean - done - fi - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - if [[ $USE_CFP = YES ]]; then - echo "$DATA/untar.sh $member" | tee -a $DATA/mp_untar.sh - else - list="$CNVSTAT $OZNSTAT $RADSTAT" - for type in $list; do - $NCP ${type}${member} ./ - tar -xvf ${type}${member} - done - fi - sigens=${SIGGESENS}${member} - $NCP $sigens sfg_${CDATE}_fhr06${member} - (( imem = $imem + 1 )) - done - - # Guess fields - $NCP $GBIAS satbias_in - if [[ "$USE_NEWRADBC" = "YES" ]]; then - rm satbias_in - $NCP $GBIASE satbias_in - fi - - $NCP $SIGGES sfg_${CDATE}_fhr06_ensmean - $NCP $SFCGES bfg_${CDATE}_fhr06_ensmean - -else - # Fixed fields - ln -fs $SATANGL satbias_angle - ln -fs $SATINFO satinfo - ln -fs $SCANINFO scaninfo - ln -fs $CONVINFO convinfo - ln -fs $OZINFO ozinfo - ln -fs $HYBENSINFO hybens_info - ln -fs $ANAVINFO anavinfo - - # Ensemble observational and guess data - if [[ $USE_CFP = YES ]]; then - echo "$DATA/untar.sh _ensmean" | tee -a $DATA/mp_untar.sh - else - list="$CNVSTAT $OZNSTAT $RADSTAT" - for type in $list; do - tar -xvf ${type}_ensmean - done - fi - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - if [[ $USE_CFP = YES ]]; then - echo "$DATA/untar.sh $member" | tee -a $DATA/mp_untar.sh - else - list="$CNVSTAT $OZNSTAT $RADSTAT" - for type in $list; do - tar -xvf ${type}${member} - done - fi - sigens=${SIGGESENS}${member} - ln -fs $sigens sfg_${CDATE}_fhr06${member} - (( imem = $imem + 1 )) - done - - # Guess fields - ln -fs $GBIAS satbias_in - if [[ "$USE_NEWRADBC" = "YES" ]]; then - rm satbias_in - ln -fs $GBIASE satbias_in - fi - - ln -fs $SIGGES sfg_${CDATE}_fhr06_ensmean - ln -fs $SFCGES bfg_${CDATE}_fhr06_ensmean - - # Output files - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - ln -fs ${SIGANLENS}${member} sanl_${CDATE}_fhr06${member} - if [ $fso_cycling = .true. ]; then - memberni="_nimem"`printf %03i $imem` - ln -fs ${SIGANLENS}${memberni} sanl_${CDATE}_fhr06${memberni} - fi - (( imem = $imem + 1 )) - done - - if [ $fso_cycling = .true. ]; then - ln -fs ${OSENSE}${CDATE}.dat osense_${CDATE}.dat - fi - -fi - -if [[ $USE_CFP = YES ]]; then - chmod 755 $DATA/mp_untar.sh - ncmd=`cat $DATA/mp_untar.sh | wc -l` - if [ $ncmd -gt 0 ]; then - export APRUNCFP=$(eval echo $APRUNCFP) - $APRUNCFP $DATA/mp_untar.sh - fi -fi - -# Create global_enkf namelist -cat < enkf.nml - &nam_enkf - datestring="$CDATE",datapath="$DATA/", - analpertwtnh=0.85,analpertwtsh=0.85,analpertwttr=0.85, - covinflatemax=1.e2,covinflatemin=1,pseudo_rh=.true.,iassim_order=0, - corrlengthnh=2000,corrlengthsh=2000,corrlengthtr=2000, - lnsigcutoffnh=2.0,lnsigcutoffsh=2.0,lnsigcutofftr=2.0, - lnsigcutoffpsnh=2.0,lnsigcutoffpssh=2.0,lnsigcutoffpstr=2.0, - lnsigcutoffsatnh=2.0,lnsigcutoffsatsh=2.0,lnsigcutoffsattr=2.0, - obtimelnh=1.e30,obtimelsh=1.e30,obtimeltr=1.e30, - saterrfact=1.0,numiter=1, - sprd_tol=1.e30,paoverpb_thresh=0.98, - nlons=$LONA,nlats=$LATA,nlevs=$LEVS,nanals=$NMEM_ENKF, - deterministic=.true.,sortinc=.true.,lupd_satbiasc=.false., - reducedgrid=.true.,readin_localization=.true., - use_gfs_nemsio=${use_gfs_nemsio}, - univaroz=.false.,adp_anglebc=.true.,angord=4,use_edges=.false.,emiss_bc=.true., - fso_cycling=${fso_cycling}, - $NAM_ENKF - / - &END - &satobs_enkf - sattypes_rad(1) = 'amsua_n15', dsis(1) = 'amsua_n15', - sattypes_rad(2) = 'amsua_n18', dsis(2) = 'amsua_n18', - sattypes_rad(3) = 'amsua_n19', dsis(3) = 'amsua_n19', - sattypes_rad(4) = 'amsub_n16', dsis(4) = 'amsub_n16', - sattypes_rad(5) = 'amsub_n17', dsis(5) = 'amsub_n17', - sattypes_rad(6) = 'amsua_aqua', dsis(6) = 'amsua_aqua', - sattypes_rad(7) = 'amsua_metop-a', dsis(7) = 'amsua_metop-a', - sattypes_rad(8) = 'airs_aqua', dsis(8) = 'airs_aqua', - sattypes_rad(9) = 'hirs3_n17', dsis(9) = 'hirs3_n17', - sattypes_rad(10)= 'hirs4_n19', dsis(10)= 'hirs4_n19', - sattypes_rad(11)= 'hirs4_metop-a', dsis(11)= 'hirs4_metop-a', - sattypes_rad(12)= 'mhs_n18', dsis(12)= 'mhs_n18', - sattypes_rad(13)= 'mhs_n19', dsis(13)= 'mhs_n19', - sattypes_rad(14)= 'mhs_metop-a', dsis(14)= 'mhs_metop-a', - sattypes_rad(15)= 'goes_img_g11', dsis(15)= 'imgr_g11', - sattypes_rad(16)= 'goes_img_g12', dsis(16)= 'imgr_g12', - sattypes_rad(17)= 'goes_img_g13', dsis(17)= 'imgr_g13', - sattypes_rad(18)= 'goes_img_g14', dsis(18)= 'imgr_g14', - sattypes_rad(19)= 'goes_img_g15', dsis(19)= 'imgr_g15', - sattypes_rad(20)= 'avhrr_n18', dsis(20)= 'avhrr3_n18', - sattypes_rad(21)= 'avhrr_metop-a', dsis(21)= 'avhrr3_metop-a', - sattypes_rad(22)= 'avhrr_n19', dsis(22)= 'avhrr3_n19', - sattypes_rad(23)= 'amsre_aqua', dsis(23)= 'amsre_aqua', - sattypes_rad(24)= 'ssmis_f16', dsis(24)= 'ssmis_f16', - sattypes_rad(25)= 'ssmis_f17', dsis(25)= 'ssmis_f17', - sattypes_rad(26)= 'ssmis_f18', dsis(26)= 'ssmis_f18', - sattypes_rad(27)= 'ssmis_f19', dsis(27)= 'ssmis_f19', - sattypes_rad(28)= 'ssmis_f20', dsis(28)= 'ssmis_f20', - sattypes_rad(29)= 'sndrd1_g11', dsis(29)= 'sndrD1_g11', - sattypes_rad(30)= 'sndrd2_g11', dsis(30)= 'sndrD2_g11', - sattypes_rad(31)= 'sndrd3_g11', dsis(31)= 'sndrD3_g11', - sattypes_rad(32)= 'sndrd4_g11', dsis(32)= 'sndrD4_g11', - sattypes_rad(33)= 'sndrd1_g12', dsis(33)= 'sndrD1_g12', - sattypes_rad(34)= 'sndrd2_g12', dsis(34)= 'sndrD2_g12', - sattypes_rad(35)= 'sndrd3_g12', dsis(35)= 'sndrD3_g12', - sattypes_rad(36)= 'sndrd4_g12', dsis(36)= 'sndrD4_g12', - sattypes_rad(37)= 'sndrd1_g13', dsis(37)= 'sndrD1_g13', - sattypes_rad(38)= 'sndrd2_g13', dsis(38)= 'sndrD2_g13', - sattypes_rad(39)= 'sndrd3_g13', dsis(39)= 'sndrD3_g13', - sattypes_rad(40)= 'sndrd4_g13', dsis(40)= 'sndrD4_g13', - sattypes_rad(41)= 'sndrd1_g14', dsis(41)= 'sndrD1_g14', - sattypes_rad(42)= 'sndrd2_g14', dsis(42)= 'sndrD2_g14', - sattypes_rad(43)= 'sndrd3_g14', dsis(43)= 'sndrD3_g14', - sattypes_rad(44)= 'sndrd4_g14', dsis(44)= 'sndrD4_g14', - sattypes_rad(45)= 'sndrd1_g15', dsis(45)= 'sndrD1_g15', - sattypes_rad(46)= 'sndrd2_g15', dsis(46)= 'sndrD2_g15', - sattypes_rad(47)= 'sndrd3_g15', dsis(47)= 'sndrD3_g15', - sattypes_rad(48)= 'sndrd4_g15', dsis(48)= 'sndrD4_g15', - sattypes_rad(49)= 'iasi_metop-a', dsis(49)= 'iasi_metop-a', - sattypes_rad(50)= 'seviri_m08', dsis(50)= 'seviri_m08', - sattypes_rad(51)= 'seviri_m09', dsis(51)= 'seviri_m09', - sattypes_rad(52)= 'seviri_m10', dsis(52)= 'seviri_m10', - sattypes_rad(53)= 'amsua_metop-b', dsis(53)= 'amsua_metop-b', - sattypes_rad(54)= 'hirs4_metop-b', dsis(54)= 'hirs4_metop-b', - sattypes_rad(55)= 'mhs_metop-b', dsis(55)= 'mhs_metop-b', - sattypes_rad(56)= 'iasi_metop-b', dsis(56)= 'iasi_metop-b', - sattypes_rad(57)= 'avhrr_metop-b', dsis(57)= 'avhrr3_metop-b', - sattypes_rad(58)= 'atms_npp', dsis(58)= 'atms_npp', - sattypes_rad(59)= 'atms_n20', dsis(59)= 'atms_n20', - sattypes_rad(60)= 'cris_npp', dsis(60)= 'cris_npp', - sattypes_rad(61)= 'cris-fsr_npp', dsis(61)= 'cris-fsr_npp', - sattypes_rad(62)= 'cris-fsr_n20', dsis(62)= 'cris-fsr_n20', - sattypes_rad(63)= 'gmi_gpm', dsis(63)= 'gmi_gpm', - sattypes_rad(64)= 'saphir_meghat', dsis(64)= 'saphir_meghat', - $SATOBS_ENKF - / - &END - &ozobs_enkf - sattypes_oz(1) = 'sbuv2_n16', - sattypes_oz(2) = 'sbuv2_n17', - sattypes_oz(3) = 'sbuv2_n18', - sattypes_oz(4) = 'sbuv2_n19', - sattypes_oz(5) = 'omi_aura', - sattypes_oz(6) = 'gome_metop-a', - sattypes_oz(7) = 'gome_metop-b', - sattypes_oz(8) = 'mls30_aura', - $OZOBS_ENKF - / - &END -EOF - -# Run global_enkf -eval $PGM < enkf.nml $REDOUT$PGMOUT $REDERR$PGMERR -rc=$? - -export ERR=$rc -export err=$ERR -$ERRSCRIPT||exit 2 - -if [[ $FILESTYLE = 'C' ]] -then - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - $NCP sanl_${CDATE}${member} ${SIGANLENS}${member} - if [ $fso_cycling = .true. ]; then - memberni="_nimem"`printf %03i $imem` - $NCP sanl_${CDATE}${memberni} ${SIGANLENS}${memberni} - fi - (( imem = $imem + 1 )) - done - if [ $fso_cycling = .true. ]; then - $NCP osense_${CDATE}.dat ${OSENSE}${CDATE}.dat - fi -fi - -# Cat runtime output files. -cat $PGMOUT $PGMERR fort.2* > $ENKFSTAT - -################################################################################ -# Postprocessing -cd $pwd -[[ $mkdata = YES ]]&&rmdir $DATA -$ENDSCRIPT -set +x -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXITING $0 with return code $err >&2 -fi -exit $err diff --git a/scripts/exurma2p5_gsianl.sh.ecf b/scripts/exurma2p5_gsianl.sh similarity index 99% rename from scripts/exurma2p5_gsianl.sh.ecf rename to scripts/exurma2p5_gsianl.sh index 7a89821c6..d867e752f 100755 --- a/scripts/exurma2p5_gsianl.sh.ecf +++ b/scripts/exurma2p5_gsianl.sh @@ -3,7 +3,7 @@ ################################################################################ #### UNIX Script Documentation Block # . . -# Script name: exuma2p5_gsianl.sh.sms +# Script name: exuma2p5_gsianl.sh # Script description: Runs regional GSI variational analysis # # Author: Manuel Pondeca Org: NP22 Date: 2006-06-23 diff --git a/src/enkf/gridio_gfs.f90 b/src/enkf/gridio_gfs.f90 index 0d5216bc0..f245afdf3 100644 --- a/src/enkf/gridio_gfs.f90 +++ b/src/enkf/gridio_gfs.f90 @@ -164,6 +164,7 @@ subroutine readgriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, & kap = rd/cp kapr = cp/rd kap1 = kap+one + clip = tiny(vg(1)) u_ind = getindex(vars3d, 'u') !< indices in the state or control var arrays v_ind = getindex(vars3d, 'v') ! U and V (3D) diff --git a/src/enkf/mpi_readobs.f90 b/src/enkf/mpi_readobs.f90 index 4d9353a6e..bca5d7c71 100644 --- a/src/enkf/mpi_readobs.f90 +++ b/src/enkf/mpi_readobs.f90 @@ -273,41 +273,31 @@ subroutine mpi_getobs(obspath, datestring, nobs_conv, nobs_oz, nobs_sat, nobs_to ! make anal_ob contain ob prior ensemble *perturbations* analsi=1._r_single/float(nanals) analsim1=1._r_single/float(nanals-1) -!$omp parallel do private(nob) do nob=1,nobs_tot ensmean_obbc(nob) = sum(anal_ob(:,nob))*analsi enddo -!$omp end parallel do if (nproc_shm == 0) then -!$omp parallel do private(nob) do nob=1,nobs_tot ! remove ensemble mean from each member. ! ensmean_obbc is biascorrected ensemble mean (anal_ob is ens pert) anal_ob(:,nob) = anal_ob(:,nob)-ensmean_obbc(nob) enddo -!$omp end parallel do if (neigv > 0) then -!$omp parallel do private(nob) do nob=1,nobs_tot anal_ob_modens(:,nob) = anal_ob_modens(:,nob)-ensmean_obbc(nob) enddo -!$omp end parallel do endif endif call mpi_barrier(mpi_comm_world,ierr) -!$omp parallel do private(nob) do nob=1,nobs_tot ! compute sprd sprd_ob(nob) = sum(anal_ob(:,nob)**2)*analsim1 enddo -!$omp end parallel do ! modulated ensemble. if (neigv > 0) then -!$omp parallel do private(nob) do nob=1,nobs_tot sprd_ob(nob) = sum(anal_ob_modens(:,nob)**2)*analsim1 enddo -!$omp end parallel do endif if (nproc == 0) then print *, 'prior spread conv: ', minval(sprd_ob(1:nobs_conv)), maxval(sprd_ob(1:nobs_conv)) diff --git a/src/enkf/readconvobs.f90 b/src/enkf/readconvobs.f90 index 5b734e848..17ffc63c7 100644 --- a/src/enkf/readconvobs.f90 +++ b/src/enkf/readconvobs.f90 @@ -334,7 +334,9 @@ subroutine get_num_convobs_nc(obspath,datestring,num_obs_tot,num_obs_totdiag,id) errorlimit2=errorlimit2_obs - if (obtype == 'gps' .and. GPS_Type(i)==1) errorlimit2=errorlimit2_bnd + if (obtype == 'gps' ) then + if (GPS_Type(i)==1) errorlimit2=errorlimit2_bnd + endif ! for q, normalize by qsatges if (obtype == ' q') then @@ -661,7 +663,9 @@ subroutine get_convobs_data_nc(obspath, datestring, nobs_max, nobs_maxdiag, & do i = 1, nobs nobdiag = nobdiag + 1 ! special handling for error limits for GPS bend angle - if (obtype == 'gps' .and. GPS_Type(i)==1) errorlimit2=errorlimit2_bnd + if (obtype == 'gps' ) then + if (GPS_Type(i)==1) errorlimit2=errorlimit2_bnd + endif ! for q, normalize by qsatges if (obtype == ' q') then diff --git a/src/gsi/correlated_obsmod.F90 b/src/gsi/correlated_obsmod.F90 index c56c1e176..287c39bb0 100644 --- a/src/gsi/correlated_obsmod.F90 +++ b/src/gsi/correlated_obsmod.F90 @@ -432,7 +432,7 @@ subroutine set_(instrument,fname,mask,method,kreq,kmut,ErrorCov) ! Done reading file close(lu) else - write(6,*) 'No Rcov files found. Turning off Correlated Error' + if (iamroot_) write(6,*) 'No Rcov files found. Turning off Correlated Error' return end if diff --git a/src/gsi/dtast.f90 b/src/gsi/dtast.f90 index baa1c5af1..2b6c4ab5f 100644 --- a/src/gsi/dtast.f90 +++ b/src/gsi/dtast.f90 @@ -65,7 +65,7 @@ subroutine dtast(work1,nlev,pbot,ptop,mesage,jiter,iout,pflag) ! First, print message and level information imsg=max(1,index(mesage,'$')-1) - ilin=max(imsg,min(nlev*9+34,240)) + ilin=max(imsg,min(nlev*11+34,240)) write(iout,'(a)') mesage(1:imsg) if (nlev > 1) then write(iout,800) '', '', '', '', '', 'ptop',(ptop(k),k=1,nlev) @@ -206,16 +206,16 @@ subroutine dtast(work1,nlev,pbot,ptop,mesage,jiter,iout,pflag) endif ! if ( nlev == 1 ) 600 format(1x,'pressure levels (hPa)=',f6.1,1x,f6.1) -700 format(1x,'o-g',1x,a2, 1x,a7,1x,a3,1x,a3, 1x,a4, 1x,a9, 1x,4(a9, 1x)) -701 format(1x,'o-g',1x,i2.2,1x,a7,1x,a3,1x,i3.3,1x,i4.4,1x,i9,1x, 4(f9.4,1x)) -702 format(1x,'o-g',1x,i2.2,1x,a7,1x,a3,1x,a3, 1x,a4, 1x,i9,1x, 4(f9.4,1x)) -800 format(1x,'o-g',1x,a2, 1x,a7,1x,a3,1x,a3, 1x,a4, 1x,a5,1x,12(f8.1,1x)) -801 format(1x,'o-g',1x,i2.2,1x,a7,1x,a3,1x,i3.3,1x,i4.4,1x,a5,1x,12(i8, 1x)) -802 format(1x,'o-g',1x,i2.2,1x,a7,1x,a3,1x,i3.3,1x,i4.4,1x,a5,1x,12(f8.2,1x)) -803 format(1x,'o-g',1x,i2.2,1x,a7,1x,a3,1x,a3, 1x,a4, 1x,a5,1x,12(i8, 1x)) -804 format(1x,'o-g',1x,i2.2,1x,a7,1x,a3,1x,a3, 1x,a4, 1x,a5,1x,12(f8.2,1x)) -901 format(1x,'o-g',1x,i2.2,1x,a7,1x,a3,1x,i3.3,1x,i4.4,1x,i9,1x, 2(f12.4,1x),2(f9.4,1x)) -902 format(1x,'o-g',1x,i2.2,1x,a7,1x,a3,1x,a3, 1x,a4, 1x,i9,1x, 2(f12.4,1x),2(f9.4,1x)) +700 format(1x,'o-g',1x,a2, 1x,a7,1x,a3,1x,a3, 1x,a4, 1x,a9,1x, 4(a10, 1x)) +701 format(1x,'o-g',1x,i2.2,1x,a7,1x,a3,1x,i3.3,1x,i4.4,1x,i9,1x, 4(e10.3,1x)) +702 format(1x,'o-g',1x,i2.2,1x,a7,1x,a3,1x,a3, 1x,a4, 1x,i9,1x, 4(e10.3,1x)) +800 format(1x,'o-g',1x,a2, 1x,a7,1x,a3,1x,a3, 1x,a4, 1x,a5,1x,12(e10.3,1x)) +801 format(1x,'o-g',1x,i2.2,1x,a7,1x,a3,1x,i3.3,1x,i4.4,1x,a5,1x,12(i10, 1x)) +802 format(1x,'o-g',1x,i2.2,1x,a7,1x,a3,1x,i3.3,1x,i4.4,1x,a5,1x,12(e10.3,1x)) +803 format(1x,'o-g',1x,i2.2,1x,a7,1x,a3,1x,a3, 1x,a4, 1x,a5,1x,12(i10, 1x)) +804 format(1x,'o-g',1x,i2.2,1x,a7,1x,a3,1x,a3, 1x,a4, 1x,a5,1x,12(e10.3,1x)) +901 format(1x,'o-g',1x,i2.2,1x,a7,1x,a3,1x,i3.3,1x,i4.4,1x,i9,1x, 2(e10.3,1x),2(e10.3,1x)) +902 format(1x,'o-g',1x,i2.2,1x,a7,1x,a3,1x,a3, 1x,a4, 1x,i9,1x, 2(e10.3,1x),2(e10.3,1x)) return end subroutine dtast diff --git a/src/gsi/genstats_gps.f90 b/src/gsi/genstats_gps.f90 index 4db3965c4..ce90d06f5 100644 --- a/src/gsi/genstats_gps.f90 +++ b/src/gsi/genstats_gps.f90 @@ -562,6 +562,7 @@ subroutine genstats_gps(bwork,awork,toss_gps_sub,conv_diagsave,mype) end if endif endif + if (gps_allptr%rdiag(10) == six) muse =.false. endif diff --git a/src/gsi/gesinfo.F90 b/src/gsi/gesinfo.F90 index 136271aae..48757c213 100644 --- a/src/gsi/gesinfo.F90 +++ b/src/gsi/gesinfo.F90 @@ -453,7 +453,7 @@ subroutine gesinfo ! FV3GFS write component does not write JCAP to the NEMSIO file if ( mype == mype_out ) then write(6,*)'GESINFO: ***WARNING*** guess jcap inconsistent with namelist' - write(6,*)'GESINFO: ***WARNING*** this is a FV3GFS NEMSIO file' + write(6,*)'GESINFO: ***WARNING*** this is a FV3GFS NEMSIO/NetCDF file' endif fatal = .false. else @@ -481,7 +481,7 @@ subroutine gesinfo else write(6,200) gfshead%jcap,gfshead%levs,gfshead%latb,gfshead%lonb,& gfshead%ntrac,gfshead%ncldt,idvc5,gfshead%nvcoord,idsl5 -200 format('GESINFO: jcap_b=',i4,', levs=',i3,', latb=',i5,& +200 format('GESINFO: jcap_b=',i5,', levs=',i3,', latb=',i5,& ', lonb=',i5,', ntrac=',i3,', ncldt=',i3,', idvc=',i3,& ', nvcoord=',i3,', idsl=',i3) end if diff --git a/src/gsi/gsimod.F90 b/src/gsi/gsimod.F90 index d13c2e733..74ec83945 100644 --- a/src/gsi/gsimod.F90 +++ b/src/gsi/gsimod.F90 @@ -27,7 +27,7 @@ module gsimod rmesh_vr,zmesh_dbz,zmesh_vr,if_vterminal, if_model_dbz,if_vrobs_raw,& minobrangedbz,maxobrangedbz,maxobrangevr,maxtiltvr,missing_to_nopcp,& ntilt_radarfiles,whichradar,& - minobrangevr,maxtiltdbz,mintiltvr,mintiltdbz + minobrangevr,maxtiltdbz,mintiltvr,mintiltdbz,l2rwthin,hurricane_radar use obsmod, only: lwrite_predterms, & lwrite_peakwt,use_limit,lrun_subdirs,l_foreaft_thin,lobsdiag_forenkf,& @@ -47,8 +47,8 @@ module gsimod q_doe_a_136,q_doe_a_137,q_doe_b_136,q_doe_b_137, & t_doe_a_136,t_doe_a_137,t_doe_b_136,t_doe_b_137, & - uv_doe_a_236,uv_doe_a_237,uv_doe_a_292,uv_doe_b_236,uv_doe_b_237,& - uv_doe_b_292 + uv_doe_a_236,uv_doe_a_237,uv_doe_a_213,uv_doe_b_236,uv_doe_b_237,& + uv_doe_b_213 use aircraftinfo, only: init_aircraft,hdist_aircraft,aircraft_t_bc_pof,aircraft_t_bc, & aircraft_t_bc_ext,biaspredt,upd_aircraft,cleanup_tail @@ -131,7 +131,7 @@ module gsimod use fgrid2agrid_mod, only: nord_f2a,init_fgrid2agrid,final_fgrid2agrid,set_fgrid2agrid use smooth_polcarf, only: norsp,init_smooth_polcas use read_l2bufr_mod, only: minnum,del_azimuth,del_elev,del_range,del_time,& - range_max,elev_angle_max,initialize_superob_radar,l2superob_only + range_max,elev_angle_max,initialize_superob_radar,l2superob_only,radar_sites,radar_box,radar_rmesh,radar_zmesh use m_berror_stats,only : berror_stats ! filename if other than "berror_stats" use lag_fields,only : infile_lag,lag_nmax_bal,& &lag_vorcore_stderr_a,lag_vorcore_stderr_b,lag_modini @@ -686,7 +686,7 @@ module gsimod minobrangevr, maxtiltdbz, mintiltvr,mintiltdbz,if_vterminal,if_vrobs_raw,& if_model_dbz,imp_physics,lupp,netcdf_diag,binary_diag,l_wcp_cwm,aircraft_recon,diag_version,& write_fv3_incr,incvars_to_zero,incvars_zero_strat,incvars_efold,diag_version,& - cao_check,lcalc_gfdl_cfrac,tau_fcst,efsoi_order,lupdqc,lqcoef,cnvw_option + cao_check,lcalc_gfdl_cfrac,tau_fcst,efsoi_order,lupdqc,lqcoef,cnvw_option,l2rwthin,hurricane_radar ! GRIDOPTS (grid setup variables,including regional specific variables): ! jcap - spectral resolution @@ -908,7 +908,7 @@ module gsimod ! 1/237: Dropsonde observations. -! 292: SFMR observations. +! 213: SFMR observations. ! The following correspond to the specific humidity (q) observations: @@ -928,12 +928,12 @@ module gsimod ! 'b' coefficients for temperature ! observations. -! uv_doe_a_236, uv_doe_a_237, uv_doe_a_292 - wind linear +! uv_doe_a_236, uv_doe_a_237, uv_doe_a_213 - wind linear ! regression derived ! 'a' coefficients for ! wind observations. -! uv_doe_b_236, uv_doe_b_237, uv_doe_b_292 - wind linear +! uv_doe_b_236, uv_doe_b_237, uv_doe_b_213 - wind linear ! regression derived ! 'b' coefficients for ! wind observations. @@ -947,7 +947,7 @@ module gsimod pvis,pcldch,scale_cv,estvisoe,estcldchoe,vis_thres,cldch_thres,cld_det_dec2bin, & q_doe_a_136,q_doe_a_137,q_doe_b_136,q_doe_b_137, & t_doe_a_136,t_doe_a_137,t_doe_b_136,t_doe_b_137, & - uv_doe_a_236,uv_doe_a_237,uv_doe_a_292,uv_doe_b_236,uv_doe_b_237,uv_doe_b_292 + uv_doe_a_236,uv_doe_a_237,uv_doe_a_213,uv_doe_b_236,uv_doe_b_237,uv_doe_b_213 ! OBS_INPUT (controls input data): ! dmesh(max(dthin))- thinning mesh for each group @@ -990,7 +990,7 @@ module gsimod ! files are very large and hard to work with) namelist/superob_radar/del_azimuth,del_elev,del_range,del_time,& - elev_angle_max,minnum,range_max,l2superob_only + elev_angle_max,minnum,range_max,l2superob_only,radar_sites,radar_box,radar_rmesh,radar_zmesh ! LAG_DATA (lagrangian data assimilation related variables): ! lag_accur - Accuracy used to decide whether or not a balloon is on the grid diff --git a/src/gsi/gsisub.F90 b/src/gsi/gsisub.F90 index f66a261f0..6aef101f5 100644 --- a/src/gsi/gsisub.F90 +++ b/src/gsi/gsisub.F90 @@ -75,7 +75,7 @@ subroutine gsisub(init_pass,last_pass) ! !$$$ use kinds, only: i_kind - use obsmod, only: iadate,lobserver + use obsmod, only: iadate,lobserver,l2rwthin use observermod, only: observer_init,observer_run,observer_finalize use gridmod, only: twodvar_regional,create_grid_vars,destroy_grid_vars,fv3_regional use gridmod, only: wrf_mass_regional,wrf_nmm_regional,nems_nmmb_regional,cmaq_regional @@ -145,9 +145,8 @@ subroutine gsisub(init_pass,last_pass) ! Process any level 2 bufr format land doppler radar winds and create radar wind superob file if(wrf_nmm_regional.or.wrf_mass_regional.or.nems_nmmb_regional .or. cmaq_regional & .or. fv3_regional) then - if(.not. oneobtest) call radar_bufr_read_all(npe,mype) + if(.not. oneobtest .and. (.not. l2rwthin)) call radar_bufr_read_all(npe,mype) end if -!at some point cmaq will become also an online met/chem model (?) ! Read info files for assimilation of various obs if (init_pass) then diff --git a/src/gsi/m_gpsrhs.F90 b/src/gsi/m_gpsrhs.F90 index a90a15685..80f0b5b83 100644 --- a/src/gsi/m_gpsrhs.F90 +++ b/src/gsi/m_gpsrhs.F90 @@ -13,6 +13,7 @@ module m_gpsrhs ! 2010-05-27 j guo - derived from m_rhs.f90 ! 2011-01-04 l cucurull - add nsig_ext in gpsrhs_alloc ! 2012-12-17 l cucurull - remove qcfail_stats_1 and qcfail_stats_2 +! 2020-08-26 H Shao/K Bathmann - add jac_qc for jacobian QC ! ! input argument list: see Fortran 90 style document below ! @@ -70,6 +71,7 @@ module m_gpsrhs public:: qcfail_loc public:: qcfail_high public:: qcfail_gross + public:: qcfail_jac public:: data_ier public:: data_igps @@ -118,6 +120,7 @@ module m_gpsrhs real(r_single ), pointer, dimension( :):: qcfail_loc => null() real(r_single ), pointer, dimension( :):: qcfail_high => null() real(r_single ), pointer, dimension( :):: qcfail_gross=> null() + real(r_single ), pointer, dimension( :):: qcfail_jac=> null() real(r_kind ), pointer, dimension( :):: data_ier => null() real(r_kind ), pointer, dimension( :):: data_igps => null() @@ -149,7 +152,7 @@ module m_gpsrhs character(len=8), pointer, dimension( :), save:: cdiagbuf logical , pointer, dimension( :), save:: qcfail - real(r_single ), pointer, dimension( :), save:: qcfail_loc,qcfail_high,qcfail_gross + real(r_single ), pointer, dimension( :), save:: qcfail_loc,qcfail_high,qcfail_gross,qcfail_jac real(r_kind ), pointer, dimension( :), save:: data_ier real(r_kind ), pointer, dimension( :), save:: data_igps @@ -264,11 +267,13 @@ subroutine gpsrhs_alloc(is,class,nobs,nsig,nreal,grids_dim,nsig_ext) allocate(b%qcfail_loc (nobs)) allocate(b%qcfail_high (nobs)) allocate(b%qcfail_gross (nobs)) + allocate(b%qcfail_jac (nobs)) b%qcfail=.false. b%qcfail_loc =zero b%qcfail_high =zero b%qcfail_gross =zero + b%qcfail_jac =zero allocate(b%data_ier (nobs)) allocate(b%data_igps(nobs)) @@ -345,6 +350,7 @@ subroutine gpsrhs_dealloc(is) deallocate(b%qcfail_loc ) deallocate(b%qcfail_high ) deallocate(b%qcfail_gross ) + deallocate(b%qcfail_jac ) deallocate(b%data_ier ) deallocate(b%data_igps) @@ -402,6 +408,7 @@ subroutine gpsrhs_aliases(is) qcfail_loc => b%qcfail_loc qcfail_high => b%qcfail_high qcfail_gross => b%qcfail_gross + qcfail_jac => b%qcfail_jac data_ier => b%data_ier data_igps => b%data_igps @@ -435,7 +442,7 @@ subroutine gpsrhs_unaliases(is) nullify(rges,gp2gm,prsltmp_o,tges_o) nullify(error,error_adjst,ratio_errors) nullify(rdiagbuf,cdiagbuf) - nullify(qcfail,qcfail_loc,qcfail_gross) + nullify(qcfail,qcfail_loc,qcfail_gross,qcfail_jac) nullify(qcfail_high) nullify(data_ier,data_igps,data_ihgt) _EXIT_(myname_) diff --git a/src/gsi/mod_vtrans.f90 b/src/gsi/mod_vtrans.f90 index 7f72fb858..3c7d8af8f 100644 --- a/src/gsi/mod_vtrans.f90 +++ b/src/gsi/mod_vtrans.f90 @@ -243,8 +243,6 @@ subroutine create_vtrans(mype) ! get work pe: - print_verbose=.false. - if(verbose .and. g1%mype==workpe) print_verbose=.true. allocate(numlevs(0:g1%npe-1)) numlevs(0:g1%npe-1)=g1%kend(0:g1%npe-1)-g1%kbegin(0:g1%npe-1)+1 if(g1%mype==0) then @@ -258,6 +256,10 @@ subroutine create_vtrans(mype) call mpi_bcast(workpe,1,mpi_integer,0,mpi_comm_world,ierror) !write(6,*)' mype,workpe=',mype,workpe + print_verbose=.false. + if(verbose .and. g1%mype==workpe) print_verbose=.true. + + ! obtain vertical coordinate constants ahat,bhat,chat if(mype==workpe) call getabc(ahat,bhat,chat) diff --git a/src/gsi/obsmod.F90 b/src/gsi/obsmod.F90 index c60eabfab..67427ddd2 100644 --- a/src/gsi/obsmod.F90 +++ b/src/gsi/obsmod.F90 @@ -460,7 +460,7 @@ module obsmod ! ==== DBZ DA === public :: ntilt_radarfiles public :: whichradar - public :: vr_dealisingopt, if_vterminal, if_model_dbz, inflate_obserr, if_vrobs_raw + public :: vr_dealisingopt, if_vterminal, if_model_dbz, inflate_obserr, if_vrobs_raw, l2rwthin public :: doradaroneob,oneoblat,oneoblon public :: oneobddiff,oneobvalue,oneobheight,oneobradid @@ -482,6 +482,7 @@ module obsmod public :: l_wcp_cwm public :: aircraft_recon + public :: hurricane_radar ! The following public variables are the coefficients that describe ! the linear regression fits that are used to define the dynamic @@ -496,7 +497,7 @@ module obsmod ! 1/237: Dropsonde observations. - ! 292: SFMR observations. + ! 213: SFMR observations. ! The following correspond to the specific humidity (q) ! observations: @@ -517,10 +518,10 @@ module obsmod public :: uv_doe_a_236 public :: uv_doe_a_237 - public :: uv_doe_a_292 + public :: uv_doe_a_213 public :: uv_doe_b_236 public :: uv_doe_b_237 - public :: uv_doe_b_292 + public :: uv_doe_b_213 interface obsmod_init_instr_table @@ -598,7 +599,7 @@ module obsmod integer(i_kind) ntilt_radarfiles logical :: doradaroneob - logical :: vr_dealisingopt, if_vterminal, if_model_dbz, inflate_obserr, if_vrobs_raw + logical :: vr_dealisingopt, if_vterminal, if_model_dbz, inflate_obserr, if_vrobs_raw, l2rwthin character(4) :: whichradar,oneobradid real(r_kind) :: oneoblat,oneoblon,oneobddiff,oneobvalue,oneobheight logical :: radar_no_thinning @@ -634,6 +635,7 @@ module obsmod logical l_wcp_cwm logical aircraft_recon + logical hurricane_radar character(len=*),parameter:: myname='obsmod' @@ -650,7 +652,7 @@ module obsmod ! 1/237: Dropsonde observations. - ! 292: SFMR observations. + ! 213: SFMR observations. ! The following correspond to the specific humidity (q) ! observations: @@ -667,7 +669,7 @@ module obsmod real(r_kind) :: uv_doe_a_236, uv_doe_b_236 real(r_kind) :: uv_doe_a_237, uv_doe_b_237 - real(r_kind) :: uv_doe_a_292, uv_doe_b_292 + real(r_kind) :: uv_doe_a_213, uv_doe_b_213 contains @@ -718,6 +720,7 @@ subroutine init_obsmod_dflts ntilt_radarfiles=1 vr_dealisingopt=.false. if_vterminal=.false. + l2rwthin =.false. if_vrobs_raw=.false. if_model_dbz=.true. inflate_obserr=.false. @@ -892,6 +895,7 @@ subroutine init_obsmod_dflts l_wcp_cwm = .false. ! .true. = use operator that involves cwm aircraft_recon = .false. ! .true. = use DOE for aircraft data + hurricane_radar = .false. ! .true. = use radar data for hurricane application ! The following variable initializations pertain to the ! coefficients that describe the linear regression fits that are @@ -907,7 +911,7 @@ subroutine init_obsmod_dflts ! 1/237: Dropsonde observations. - ! 292: SFMR observations. + ! 213: SFMR observations. ! The following correspond to the specific humidity (q) ! observations: @@ -930,8 +934,8 @@ subroutine init_obsmod_dflts uv_doe_b_236 = 0.0_r_kind uv_doe_a_237 = 1.0_r_kind uv_doe_b_237 = 0.0_r_kind - uv_doe_a_292 = 1.0_r_kind - uv_doe_b_292 = 0.0_r_kind + uv_doe_a_213 = 1.0_r_kind + uv_doe_b_213 = 0.0_r_kind return end subroutine init_obsmod_dflts @@ -971,7 +975,7 @@ subroutine init_directories(mype) if (lrun_subdirs) then write(pe_name,'(i4.4)') mype dirname = 'dir.'//trim(pe_name)//'/' - command = 'mkdir -m 755 ' // trim(dirname) + command = 'mkdir -p -m 755 ' // trim(dirname) call system(command) else write(pe_name,100) mype diff --git a/src/gsi/read_abi.f90 b/src/gsi/read_abi.f90 index 3a50f65b5..46c18a851 100644 --- a/src/gsi/read_abi.f90 +++ b/src/gsi/read_abi.f90 @@ -323,6 +323,7 @@ subroutine read_abi(mype,val_abi,ithin,rmesh,jsatid,& nread=nread+nchanl + rcldfrc=bmiss if(clrsky) then call ufbrep(lnbufr,dataabi1,1,ncld,iret,'NCLDMNT') rclrsky=bmiss @@ -338,7 +339,9 @@ subroutine read_abi(mype,val_abi,ithin,rmesh,jsatid,& rclrsky=dataabi1(1,1) !clear-sky percentage ! rclrsky=dataabi1(1,2) !clear-sky percentage over sea call ufbrep(lnbufr,dataabi,1,4,iret,'CLDMNT') - rcldfrc=dataabi(1,1) !total cloud + if (dataabi(1,1)>= zero .and. dataabi(1,1) <= 100.0_r_kind ) then + rcldfrc=dataabi(1,1) !total cloud + end if end if call ufbrep(lnbufr,dataabi2,1,nbrst,iret,'TMBRST') diff --git a/src/gsi/read_fl_hdob.f90 b/src/gsi/read_fl_hdob.f90 index a7c275174..bd2e9929c 100644 --- a/src/gsi/read_fl_hdob.f90 +++ b/src/gsi/read_fl_hdob.f90 @@ -57,6 +57,7 @@ subroutine read_fl_hdob(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,si ithin_conv,rmesh_conv,pmesh_conv use obsmod, only: perturb_obs,perturb_fact,ran01dom use obsmod, only: bmiss + use aircraftinfo, only: aircraft_t_bc,aircraft_t_bc_pof,aircraft_t_bc_ext use converr,only: etabl use converr_ps,only: etabl_ps,isuble_ps,maxsub_ps use converr_q,only: etabl_q,isuble_q,maxsub_q @@ -239,6 +240,7 @@ subroutine read_fl_hdob(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,si iecol=0 if (ltob) then nreal = 25 + if (aircraft_t_bc_pof .or. aircraft_t_bc .or.aircraft_t_bc_ext) nreal=nreal+3 iecol = 2 errmin = half ! set lower bound of ob error for T or Tv else if (luvob) then @@ -303,7 +305,7 @@ subroutine read_fl_hdob(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,si do nc = 1, nconvtype if (trim(ioctype(nc)) == trim(obstype))then if (trim(ioctype(nc)) == 'uv' .and. ictype(nc) == 236 .or. & - trim(ioctype(nc)) == 'spd' .and. ictype(nc) == 292 .or. & + trim(ioctype(nc)) == 'spd' .and. ictype(nc) == 213 .or. & trim(ioctype(nc)) == 't' .and. ictype(nc) == 136 .or. & trim(ioctype(nc)) == 'q' .and. ictype(nc) == 136 .or. & trim(ioctype(nc)) == 'ps' .and. ictype(nc) == 136 ) then @@ -534,6 +536,7 @@ subroutine read_fl_hdob(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,si write(6,*) 'READ_FL_HDOB: bad lat/lon values: ', obsloc(1,1),obsloc(2,1) cycle loop_readsb2 endif + if (obsloc(2,1) < 0.0_r_kind) obsloc(2,1) = obsloc(2,1) + 360.0_r_kind dlon_earth_deg = obsloc(2,1) dlat_earth_deg = obsloc(1,1) dlon_earth = obsloc(2,1)*deg2rad ! degree to radian diff --git a/src/gsi/read_gps.f90 b/src/gsi/read_gps.f90 index 860b3e3cf..fc3888dcf 100644 --- a/src/gsi/read_gps.f90 +++ b/src/gsi/read_gps.f90 @@ -59,6 +59,8 @@ subroutine read_gps(nread,ndata,nodata,infile,lunout,obstype,twind, & ! 2015-02-23 Rancic/Thomas - add l4densvar to time window logical ! 2015-10-01 guo - consolidate use of ob location (in deg) ! 2017-11-16 dutta - addition of profile quality flags for KOMPSAT5 GPSRO. +! 2019-08-21 Shao - add qc flags input for METOP-C, COSMIC-2 and PAZ +! 2020-05-21 Shao - add qc flags input for commercial GNSSRO data ! ! input argument list: ! infile - unit from which to read BUFR data @@ -256,8 +258,10 @@ subroutine read_gps(nread,ndata,nodata,infile,lunout,obstype,twind, & endif ! Check profile quality flags - if ( ((said > 739).and.(said < 746)).or.(said == 820).or.(said == 786).or.& - ((said > 749).and.(said < 756)).or.(said == 825).or.(said == 44) ) then !CDAAC processing + if ( ((said > 739).and.(said < 746)).or.(said == 820).or.(said == 786).or. & + ((said > 749).and.(said < 756)).or.(said == 825).or.(said == 44) .or. & + (said == 265).or.(said == 266).or.(said == 267).or.(said == 268).or. & + (said == 269)) then !CDAAC processing if(pcc==zero) then ! write(6,*)'READ_GPS: bad profile said=',said,'ptid=',ptid,& ! ' SKIP this report' diff --git a/src/gsi/read_l2bufr_mod.f90 b/src/gsi/read_l2bufr_mod.f90 index 83fec1491..57a102b20 100644 --- a/src/gsi/read_l2bufr_mod.f90 +++ b/src/gsi/read_l2bufr_mod.f90 @@ -20,6 +20,7 @@ module read_l2bufr_mod ! 2009-11-24 parrish change time variable from regional_time (passed from gridmod) to ! iadate (passed from obsmod), to prevent all radar data being tossed. ! 2011-07-04 todling - fixes to run either single or double precision +! 2020-10-14 xu/sippel - Add options to superob the GRO ! ! subroutines included: ! sub initialize_superob_radar - initialize superob parameters to defaults @@ -52,11 +53,11 @@ module read_l2bufr_mod public :: range_max,del_time,l2superob_only,elev_angle_max,del_azimuth public :: minnum,del_range,del_elev - public :: invtllv + public :: invtllv,radar_sites,radar_box,radar_rmesh,radar_zmesh integer(i_kind) minnum - real(r_kind) del_azimuth,del_elev,del_range,del_time,elev_angle_max,range_max - logical l2superob_only + real(r_kind) del_azimuth,del_elev,del_range,del_time,elev_angle_max,range_max,radar_rmesh,radar_zmesh + logical l2superob_only,radar_sites,radar_box contains @@ -92,7 +93,10 @@ subroutine initialize_superob_radar minnum=50 range_max=100000._r_kind ! (100km) l2superob_only=.false. - + radar_sites=.false. + radar_box=.false. + radar_rmesh=10._r_kind + radar_zmesh=500._r_kind end subroutine initialize_superob_radar subroutine radar_bufr_read_all(npe,mype) @@ -133,12 +137,17 @@ subroutine radar_bufr_read_all(npe,mype) use qcmod, only: vadwnd_l2rw_qc use oneobmod, only: lsingleradar,singleradar use mpeu_util, only: IndexSet, IndexSort + use file_utility, only : get_lun + use constants, only: pi,rearth_equator + use mpeu_util, only: gettablesize,gettable + use gridmod, only: txy2ll use gsi_io, only: verbose implicit none integer(i_kind),intent(in):: npe,mype integer(i_kind),parameter:: max_num_radars=150 + integer(i_kind),parameter:: maxobs=2e8 integer(i_kind),parameter:: n_gates_max=4000 real(r_kind),parameter:: four_thirds = 4.0_r_kind / 3.0_r_kind real(r_kind),parameter:: r8 = 8.0_r_kind @@ -163,12 +172,15 @@ subroutine radar_bufr_read_all(npe,mype) integer(i_kind) nsuper,nsuperall integer(i_kind) nthisrad,nthisbins integer(i_kind) idups,idups0 + integer(i_kind) radar_count,radar_true,ntot,nlevz + real(r_kind) dx,dy + real(r_kind) halfpi,twopi,rkm2dg,delat,dgv,rlat_min,rlon_min,dlat_grid,dlon_grid + integer(i_kind) mlat,mlonx,ilev,ilat,ilon integer(i_kind) nradials_in,nradials_fail_angmax,nradials_fail_time,nradials_fail_elb integer(i_kind) nradials_in1,nradials_fail_angmax1,nradials_fail_time1,nradials_fail_elb1 integer(i_kind) nobs_in,nobs_badvr,nobs_badsr,nobs_lrbin,nobs_hrbin,nrange_max,irad integer(i_kind) nobs_in1,nobs_badvr1,nobs_badsr1,nobs_lrbin1,nobs_hrbin1,nrange_max1 integer(i_kind) num_radars_max,num_radars_min - integer(i_kind):: histo_el integer(i_kind) idate5(5) integer(i_kind),allocatable,dimension(:) :: indx,icount integer(i_kind),allocatable,dimension(:,:) :: ibins,ibins2 @@ -227,13 +239,26 @@ subroutine radar_bufr_read_all(npe,mype) equivalence(master_stn_table(1),cmaster_stn_table) equivalence (chdr,hdr(1)) equivalence (chdr2,hdr2(1)) + character(len=*),parameter:: tbname='SUPEROB_RADAR::' logical rite,print_verbose - logical lradar - + logical lradar + character(len=256),allocatable,dimension(:):: rtable + character(4),allocatable,dimension(:):: rsite + integer(i_kind),allocatable,dimension(:):: ruse + print_verbose=.false. if(verbose) print_verbose=.true. - + if (radar_sites) then + open(666,file=trim('gsiparm.anl'),form='formatted') + call gettablesize(tbname,666,ntot,radar_count) + allocate(rtable(radar_count),rsite(radar_count),ruse(radar_count)) + call gettable(tbname,666,ntot,radar_count,rtable) + do i=1,radar_count + read(rtable(i),*) rsite(i),ruse(i) + if (mype==0) write(*,'(A10,X,A4,X,I)'),"Radar sites usage: ",rsite(i),ruse(i) + end do + end if ! define infile if using either option for radial winds. do i=1,ndat if(trim(dtype(i))=='rw'.and.trim(dsis(i))=='l2rw'.and.vadwnd_l2rw_qc)then @@ -263,7 +288,6 @@ subroutine radar_bufr_read_all(npe,mype) rdelaz=one/delaz rdelr =one/delr rdelel=one/delel - num_radars=0 do i=1,max_num_radars stn_id_table(i)='ZZZZ' @@ -345,6 +369,13 @@ subroutine radar_bufr_read_all(npe,mype) if(abs(t)>del_time) cycle nobs_in=nobs_in+n_gates stn_id=chdr2 + radar_true=0 + if (radar_sites) then + do i=1,radar_count + if (trim(stn_id) .eq. trim(rsite(i)) .and. ruse(i) == 1 ) radar_true=1 + end do + if (radar_true == 0) cycle + end if ibyte=index(cstn_id_table,stn_id) if(ibyte==0) then num_radars=num_radars+1 @@ -385,7 +416,6 @@ subroutine radar_bufr_read_all(npe,mype) stn_lon_table_all,max_num_radars,mpi_real8,mpi_comm_world,ierror) call mpi_allgather(stn_hgt_table,max_num_radars,mpi_real8, & stn_hgt_table_all,max_num_radars,mpi_real8,mpi_comm_world,ierror) - ! Create unique master list of all radar names,lats,lons jj=0 do j=1,max_num_radars*npe @@ -452,13 +482,27 @@ subroutine radar_bufr_read_all(npe,mype) nrange_max=0 nthisrad=nrbin*nazbin*nelbin nthisbins=6*nthisrad - + if (radar_box) then + twopi = two*pi + rkm2dg = 360.0_r_kind/(twopi*rearth_equator)*1.e3_r_kind + dlat_grid = 5.0_r_kind + dlon_grid = 5.0_r_kind + halfpi = half*pi + dx=radar_rmesh*rkm2dg + dy=dx + mlat=dlat_grid/dy+half + mlonx=dlon_grid/dx+half + delat=dlat_grid/mlat + dgv=delat*half + mlat=max(2,mlat);mlonx=max(2,mlonx) + nlevz=nint(15000.0_r_kind/radar_zmesh) + nthisrad=(nlevz+1)*mlat*mlonx + nthisbins=6*nthisrad + end if ! reopen and reread the file for data this time - call closbf(inbufr) open(inbufr,file=infile,form='unformatted') call openbf(inbufr,'IN',inbufr) - allocate(bins(6,nthisrad,num_radars_0),ibins(nthisrad,num_radars_0)) bins=zero_quad ibins=0 @@ -508,6 +552,15 @@ subroutine radar_bufr_read_all(npe,mype) end if stn_id=chdr ibyte=index(cmaster_stn_table,stn_id) + if (radar_sites) then + radar_true=0 + do i=1,radar_count + if (trim(stn_id) == trim(rsite(i)) .and. ruse(i) == 1) radar_true=1 + end do + if (radar_true == 0) then + cycle + end if + end if if(ibyte==0) then write(6,*) ' index error in radar_bufr_read_all -- program stops -- ',ibyte,stn_id call stop2(99) @@ -539,21 +592,106 @@ subroutine radar_bufr_read_all(npe,mype) nobs_hrbin=nobs_hrbin+1 cycle end if - iloc=nrbin*(nazbin*(ielbin-1)+(iazbin-1))+irbin - bins(1,iloc,krad)=bins(1,iloc,krad)+range - bins(2,iloc,krad)=bins(2,iloc,krad)+stn_az - bins(3,iloc,krad)=bins(3,iloc,krad)+stn_el - bins(4,iloc,krad)=bins(4,iloc,krad)+rwnd(2,i) - bins(5,iloc,krad)=bins(5,iloc,krad)+rwnd(2,i)**2 - bins(6,iloc,krad)=bins(6,iloc,krad)+t - ibins(iloc,krad)=ibins(iloc,krad)+1 + + if (.not.radar_box) then + iloc=nrbin*(nazbin*(ielbin-1)+(iazbin-1))+irbin + bins(1,iloc,krad)=bins(1,iloc,krad)+range + bins(2,iloc,krad)=bins(2,iloc,krad)+stn_az + bins(3,iloc,krad)=bins(3,iloc,krad)+stn_el + bins(4,iloc,krad)=bins(4,iloc,krad)+rwnd(2,i) + bins(5,iloc,krad)=bins(5,iloc,krad)+rwnd(2,i)**2 + bins(6,iloc,krad)=bins(6,iloc,krad)+t + ibins(iloc,krad)=ibins(iloc,krad)+1 + else + this_stalat=master_lat_table(krad) + if(abs(this_stalat)>r89_5) cycle + this_stalon=master_lon_table(krad) + rlon0=deg2rad*this_stalon + this_stalatr=this_stalat*deg2rad + clat0=cos(this_stalatr) ; slat0=sin(this_stalatr) + this_staid=master_stn_table(krad) + this_stahgt=master_hgt_table(krad) + thisrange= range + thisazimuth=stn_az + thistilt=stn_el + thisvr=rwnd(2,i) + + + vrmax = tiny(1.0_r_kind) + vrmin = huge(1.0_r_kind) + + vrmax=max(vrmax,thisvr) + vrmin=min(vrmin,thisvr) + thisvr2=rwnd(2,i)**2 + thiserr=sqrt(abs(thisvr2-thisvr**2)) + + + errmax = tiny(1.0_r_kind) + errmin = huge(1.0_r_kind) + + errmax=max(errmax,thiserr) + errmin=min(errmin,thiserr) + thistime=t + aactual=erad+this_stahgt + a43=four_thirds*aactual + thistiltr=thistilt*deg2rad + selev0=sin(thistiltr) + celev0=cos(thistiltr) + b=thisrange*(thisrange+two*aactual*selev0) + c=sqrt(aactual*aactual+b) + ha=b/(aactual+c) + epsh=(thisrange*thisrange-ha*ha)/(r8*aactual) + h=ha-epsh + thishgt=this_stahgt+h + celev=celev0 + selev=selev0 + + if(thisrange>=one) then + celev=a43*celev0/(a43+h) + selev=(thisrange*thisrange+h*h+two*a43*h)/(two*thisrange*(a43+h)) + end if + + corrected_tilt=atan2(selev,celev)*rad2deg + gamma=half*thisrange*(celev0+celev) +! Get earth lat lon of superob + thisazimuthr=thisazimuth*deg2rad + rlonloc=rad_per_meter*gamma*cos(thisazimuthr) + rlatloc=rad_per_meter*gamma*sin(thisazimuthr) + call invtllv(rlonloc,rlatloc,rlon0,clat0,slat0,rlonglob,rlatglob) + thislat=rlatglob*rad2deg + thislon=rlonglob*rad2deg + + if(abs(thislat)>r89_5) cycle + clat1=cos(rlatglob) + caz0=cos(thisazimuthr) + saz0=sin(thisazimuthr) + cdlon=cos(rlonglob-rlon0) + sdlon=sin(rlonglob-rlon0) + caz1=clat0*caz0/clat1 + saz1=saz0*cdlon-caz0*sdlon*slat0 + corrected_azimuth=atan2(saz1,caz1)*rad2deg + rlat_min=this_stalat-2.5_r_kind + rlon_min=this_stalon-2.5_r_kind + ilev=ceiling(thishgt/radar_zmesh) + ilat=ceiling((thislat-rlat_min)/delat) + ilon=ceiling((thislon-rlon_min)/(dlon_grid/mlonx)) + iloc=mlat*(mlonx*(ilev-1)+ilon)+ilat + bins(1,iloc,krad)=bins(1,iloc,krad)+range + bins(2,iloc,krad)=bins(2,iloc,krad)+stn_az + bins(3,iloc,krad)=bins(3,iloc,krad)+stn_el + bins(4,iloc,krad)=bins(4,iloc,krad)+rwnd(2,i) + bins(5,iloc,krad)=bins(5,iloc,krad)+rwnd(2,i)**2 + bins(6,iloc,krad)=bins(6,iloc,krad)+t + ibins(iloc,krad)=ibins(iloc,krad)+1 + + end if !radar_box end end do - end do ! end do while end do ! loop over blocks call closbf(inbufr) + if (.not. allocated(ibins2)) allocate(ibins2(nthisrad,num_radars_0)) - allocate(ibins2(nthisrad,num_radars_0)) + ibins2=0 call mpi_allreduce(ibins,ibins2,nthisrad*num_radars_0,mpi_integer4,mpi_sum,mpi_comm_world,ierror) deallocate(ibins) @@ -604,20 +742,6 @@ subroutine radar_bufr_read_all(npe,mype) write(6,*)' nrange_max=',nrange_max1 end if -! Print out histogram of counts by ielbin to see where angles are - do ielbin=1,nelbin - histo_el=0 - do krad=1,num_radars_0 - do iazbin=1,nazbin - do irbin=1,nrbin - iloc=nrbin*(nazbin*(ielbin-1)+(iazbin-1))+irbin - histo_el=histo_el+ibins2(iloc,krad) - end do - end do - end do - if(rite)write(6,'(" ielbin,histo_el=",i6,i20)')ielbin,histo_el - end do - ! Prepare to create superobs and write out. open(inbufr,file='radar_supobs_from_level2',form='unformatted',iostat=iret) rewind inbufr @@ -669,33 +793,60 @@ subroutine radar_bufr_read_all(npe,mype) if(lsingleradar) then if(this_staid /= singleradar) lradar=.false. end if - if(lradar) then ! Logical for when running single radar exp. if(ibins2(iii,krad) < minnum) cycle thiscount=one_quad/real(ibins2(iii,krad),r_quad) + if (radar_box) then + do i=1,6 + binsx(i)=bins_work(i,iii,1) + end do + do k=2,npe do i=1,6 - binsx(i)=bins_work(i,iii,1) - end do - do k=2,npe - do i=1,6 - binsx(i)=binsx(i)+bins_work(i,iii,k) - end do + binsx(i)=binsx(i)+bins_work(i,iii,k) end do + end do + do i=1,6 + binsx(i)=binsx(i)*thiscount + end do + + thisrange= binsx(1) + thisazimuth=binsx(2) + thistilt=binsx(3) + thisvr=binsx(4) + vrmax=max(vrmax,thisvr) + vrmin=min(vrmin,thisvr) + thisvr2=binsx(5) + thiserr=sqrt(abs(thisvr2-thisvr**2)) + errmax=max(errmax,thiserr) + errmin=min(errmin,thiserr) + thistime=binsx(6) + + else + do i=1,6 + binsx(i)=bins_work(i,iii,1) + end do + do k=2,npe do i=1,6 - binsx(i)=binsx(i)*thiscount + binsx(i)=binsx(i)+bins_work(i,iii,k) end do - thisrange= binsx(1) - thisazimuth=binsx(2) - thistilt=binsx(3) - thisvr=binsx(4) - vrmax=max(vrmax,thisvr) - vrmin=min(vrmin,thisvr) - thisvr2=binsx(5) - thiserr=sqrt(abs(thisvr2-thisvr**2)) - errmax=max(errmax,thiserr) - errmin=min(errmin,thiserr) - thistime=binsx(6) + end do + do i=1,6 + binsx(i)=binsx(i)*thiscount + end do + + thisrange= binsx(1) + thisazimuth=binsx(2) + thistilt=binsx(3) + thisvr=binsx(4) + vrmax=max(vrmax,thisvr) + vrmin=min(vrmin,thisvr) + thisvr2=binsx(5) + thiserr=sqrt(abs(thisvr2-thisvr**2)) + errmax=max(errmax,thiserr) + errmin=min(errmin,thiserr) + thistime=binsx(6) + end if ! Compute obs height here ! Use 4/3rds rule to get elevation of radar beam @@ -735,7 +886,6 @@ subroutine radar_bufr_read_all(npe,mype) call invtllv(rlonloc,rlatloc,rlon0,clat0,slat0,rlonglob,rlatglob) thislat=rlatglob*rad2deg thislon=rlonglob*rad2deg - ! Keep away from poles, rather than properly deal with polar singularity if(abs(thislat)>r89_5) cycle @@ -753,7 +903,6 @@ subroutine radar_bufr_read_all(npe,mype) abs(corrected_azimuth-thisazimuth ),& abs(corrected_azimuth-thisazimuth+r360),& abs(corrected_azimuth-thisazimuth+r720)),delazmmax) - write(inbufr) this_staid,this_stalat,this_stalon,this_stahgt, & thistime,thislat,thislon,thishgt,thisvr,corrected_azimuth,& thiserr,corrected_tilt,gamma @@ -761,7 +910,7 @@ subroutine radar_bufr_read_all(npe,mype) end if end do if(nsuper > 0)then - write(6,*)' for radar ',this_staid,' nsuper=',nsuper,' delazmmax=',delazmmax + write(6,*)' for radar ',this_staid,' nsuper=',nsuper,' delazmmax=',delazmmax,lradar write(6,*)' vrmin,max=',vrmin,vrmax,' errmin,max=',errmin,errmax write(6,*)' deltiltmin,max=',deltiltmin,deltiltmax,' deldistmin,max=',deldistmin,deldistmax vrminall=min(vrminall,vrmin) @@ -793,6 +942,7 @@ subroutine radar_bufr_read_all(npe,mype) call mpi_finalize(ierror) stop end if + if (radar_sites) deallocate(rtable,rsite,ruse) end subroutine radar_bufr_read_all @@ -895,6 +1045,6 @@ SUBROUTINE invtllv(ALM,APH,TLMO,CTPH0,STPH0,TLM,TPH) DENOM=CTPH0*CC-STPH0*SPH TLM=tlmo+ATAN2(ANUM,DENOM) TPH=ASIN(CTPH0*SPH+STPH0*CC) - + return END SUBROUTINE invtllv end module read_l2bufr_mod diff --git a/src/gsi/read_obs.F90 b/src/gsi/read_obs.F90 index 48a0e6ad0..2c485a3ee 100644 --- a/src/gsi/read_obs.F90 +++ b/src/gsi/read_obs.F90 @@ -134,7 +134,8 @@ subroutine read_obs_check (lexist,filename,jsatid,dtype,minuse,nread) ! 2017-11-16 dutta - adding KOMPSAT5 bufr i.d for reading the data. ! 2019-03-27 h. liu - add abi ! 2019-09-20 X.Su -add read new variational qc table -! +! 2019-08-21 H. Shao - add METOPC-C, COSMIC-2 and PAZ to the GPS check list +! 2020-05-21 H. Shao - add commercial GNSSRO (Spire, PlanetIQ, GeoOptics) and other existing missions to the check list ! ! input argument list: ! lexist - file status @@ -379,12 +380,14 @@ subroutine read_obs_check (lexist,filename,jsatid,dtype,minuse,nread) end if said=nint(satid) - if(((said > 739) .and.(said < 746)).or.(said == 820).or. & - (said == 825).or. (said == 786).or.(said == 4) .or. & - (said == 3) .or. (said == 421).or.(said == 440).or. & - (said == 821).or. ((said > 749) .and.(said < 756)).or. & - (said == 44) .or. (said == 5) .or. & - ( GMAO_READ .and. said == 5) ) then + if(((said > 739) .and.(said < 746)).or. (said == 820) .or. & + (said == 825).or. (said == 786).or. (said == 4) .or. & + (said == 3) .or. (said == 421).or. (said == 440) .or. & + (said == 821).or. ((said > 749).and.(said < 756)) .or. & + (said == 44) .or. (said == 5) .or. (said == 41) .or. & + (said == 42) .or. (said == 43) .or. (said == 722) .or. & + (said == 723).or. (said == 265).or. (said == 266) .or. & + (said == 267).or. (said == 268).or. (said == 269)) then lexist=.true. exit gpsloop end if @@ -435,6 +438,8 @@ subroutine read_obs_check (lexist,filename,jsatid,dtype,minuse,nread) trim(subset) == 'NC005032' .or. trim(subset) == 'NC005034' .or.& trim(subset) == 'NC005039' .or. & trim(subset) == 'NC005090' .or. trim(subset) == 'NC005091' .or.& + trim(subset) == 'NC005067' .or. trim(subset) == 'NC005068' .or. trim(subset) == 'NC005069' .or.& + trim(subset) == 'NC005081' .or. & trim(subset) == 'NC005072' ) then lexist = .true. exit loop @@ -696,7 +701,7 @@ subroutine read_obs(ndata,mype) use obsmod, only: iadate,ndat,time_window,dplat,dsfcalc,dfile,dthin, & dtype,dval,dmesh,obsfile_all,ref_obs,nprof_gps,dsis,ditype,& perturb_obs,lobserver,lread_obs_save,obs_input_common, & - reduce_diag,nobs_sub,dval_use + reduce_diag,nobs_sub,dval_use,hurricane_radar,l2rwthin use gsi_nstcouplermod, only: nst_gsi ! use gsi_nstcouplermod, only: gsi_nstcoupler_set use qcmod, only: njqc,vadwnd_l2rw_qc,nvqc @@ -1525,20 +1530,35 @@ subroutine read_obs(ndata,mype) if( trim(infile) == 'vr_vol' )then call read_radar_wind_ascii(nread,npuse,nouse,infile,lunout,obstype,sis,& hgtl_full,nobs_sub1(1,i)) + string='READ_RADAR_WIND' + else if (hurricane_radar) then + if (sis == 'rw' ) then + write(6,*)'READ_OBS: radial wind,read_radar,dfile=',infile,',dsis=',sis + call read_radar(nread,npuse,nouse,infile,lunout,obstype,twind,sis,& + hgtl_full,nobs_sub1(1,i)) + string='READ_RADAR' + else if (sis == 'l2rw') then + if (l2rwthin)then + call read_radar_l2rw(npuse,nouse,lunout,obstype,sis,nobs_sub1(1,i),hgtl_full) + string='READ_RADAR_L2RW_NOVADQC' + else + write(6,*)'READ_OBS: radial wind,read_radar_l2rw_novadqc,dfile=',infile,',dsis=',sis + call read_radar_l2rw_novadqc(npuse,nouse,lunout,obstype,sis,nobs_sub1(1,i)) + string='READ_RADAR_L2RW_NOVADQC' + end if + end if else - if (vadwnd_l2rw_qc) then + if (vadwnd_l2rw_qc) then write(6,*)'READ_OBS: radial wind,read_radar,dfile=',infile,',dsis=',sis call read_radar(nread,npuse,nouse,infile,lunout,obstype,twind,sis,& hgtl_full,nobs_sub1(1,i)) string='READ_RADAR' - else if (sis == 'l2rw') then + else if (sis == 'l2rw') then write(6,*)'READ_OBS: radial wind,read_radar_l2rw_novadqc,dfile=',infile,',dsis=',sis call read_radar_l2rw_novadqc(npuse,nouse,lunout,obstype,sis,nobs_sub1(1,i)) string='READ_RADAR_L2RW_NOVADQC' - end if + end if end if - string='READ_RADAR_WIND' - ! Process radar reflectivity from MRMS else if (obstype == 'dbz' ) then print *, "calling read_dbz" @@ -1835,12 +1855,9 @@ subroutine read_obs(ndata,mype) call warn('read_obs',' string =',trim(string)) endif - write(6,8000) adjustl(string),infile,obstype,sis,nread,ithin,& - rmesh,isfcalc,nouse,npe_sub(i) -8000 format(1x,a22,': file=',a15,& - ' type=',a10, ' sis=',a20, ' nread=',i10,& - ' ithin=',i2, ' rmesh=',f11.6,' isfcalc=',i2,& - ' nkeep=',i10,' ntask=',i3) + write(6, '(a,'': file='',a,'' type='',a,'' sis='',a,'' nread='',i10,& + '' ithin='',i2,'' rmesh='',f11.6,'' isfcalc='',i2,'' nkeep='',i10,& + '' ntask='',i3)') endif endif task_belongs diff --git a/src/gsi/read_radar.f90 b/src/gsi/read_radar.f90 index 9b62951d2..7493e5d71 100644 --- a/src/gsi/read_radar.f90 +++ b/src/gsi/read_radar.f90 @@ -262,7 +262,7 @@ subroutine read_radar(nread,ndata,nodata,infile,lunout,obstype,twind,sis,hgtl_fu if (.not.lexist1 .and. .not.lexist2) return eradkm=rearth*0.001_r_kind - maxobs=2e6 + maxobs=2e8 nreal=maxdat nchanl=0 ilon=2 @@ -2507,7 +2507,7 @@ subroutine read_radar_l2rw_novadqc(ndata,nodata,lunout,obstype,sis,nobs) ! Initialize variables xscale=1000._r_kind xscalei=one/xscale - max_rrr=nint(100000.0_r_kind*xscalei) + max_rrr=nint(200000.0_r_kind*xscalei) nboxmax=1 kx0=22500 @@ -2770,3 +2770,608 @@ subroutine read_radar_l2rw_novadqc(ndata,nodata,lunout,obstype,sis,nobs) end subroutine read_radar_l2rw_novadqc +!!!!!!!!!!!!!!! Added for l2rw thinning !!!!!!!!!!!!!!! +subroutine read_radar_l2rw(ndata,nodata,lunout,obstype,sis,nobs,hgtl_full) + use kinds, only: r_kind,r_single,r_double,i_kind,i_byte + use constants, only: zero,half,one,two,deg2rad,rearth,rad2deg,r1000,r100,r400 + use qcmod, only: erradar_inflate + use oneobmod, only: oneobtest,learthrel_rw + use gsi_4dvar, only: l4dvar,l4densvar,winlen,time_4dvar + use gridmod, only: regional,nlat,nlon,tll2xy,rlats,rlons,rotate_wind_ll2xy,nsig + use obsmod, only: doradaroneob,oneobradid,time_offset + use mpeu_util, only: gettablesize,gettable + use convinfo, only: nconvtype,icuse,ioctype + use deter_sfc_mod, only: deter_sfc2 + use mpimod, only: npe + use read_l2bufr_mod, only: radar_sites,radar_rmesh,radar_zmesh,elev_angle_max,del_time,range_max + use constants, only: eccentricity,somigliana,grav_ratio,grav,semi_major_axis,flattening,grav_equator + use obsmod,only: radar_no_thinning,iadate + use convthin, only: make3grids,map3grids + + implicit none + +! Declare passed variables + character(len=*),intent(in ) :: obstype + character(len=20),intent(in ) :: sis + integer(i_kind) ,intent(in ) :: lunout + integer(i_kind) ,intent(inout) :: ndata,nodata + integer(i_kind),dimension(npe) ,intent(inout) :: nobs + real(r_kind),dimension(nlat,nlon,nsig),intent(in):: hgtl_full + +! Declare local parameters + integer(i_kind),parameter:: maxlevs=1500 + integer(i_kind),parameter:: maxdat=22 + real(r_kind),parameter:: r4_r_kind = 4.0_r_kind + + + real(r_kind),parameter:: r6 = 6.0_r_kind + real(r_kind),parameter:: r8 = 8.0_r_kind + real(r_kind),parameter:: r90 = 90.0_r_kind + real(r_kind),parameter:: r200 = 200.0_r_kind + real(r_kind),parameter:: r150 = 150.0_r_kind + real(r_kind),parameter:: r360 = 360.0_r_kind + real(r_kind),parameter:: r50000 = 50000.0_r_kind + real(r_kind),parameter:: r89_5 = 89.5_r_kind + real(r_kind),parameter:: four_thirds = 4.0_r_kind / 3.0_r_kind + integer(i_kind),parameter:: n_gates_max=4000 + real(r_double),parameter:: r1e5_double = 1.0e5_r_double + real(r_kind),parameter:: rinv60 = 1.0_r_kind/60.0_r_kind + logical good,outside,good0 + + character(30) outmessage + integer(i_kind) lnbufr,i,k,maxobs + integer(i_kind) nmrecs,ibadazm,ibadwnd,ibaddist,ibadheight,kthin + integer(i_kind) ibadstaheight,ibaderror,notgood,iheightbelowsta,ibadfit + integer(i_kind) notgood0 + integer(i_kind) iret,kx0 + integer(i_kind) nreal,nchanl,ilat,ilon,ikx + integer(i_kind) idomsfc + real(r_kind) usage,ff10,sfcr,skint,t4dvo,toff + real(r_kind) eradkm,dlat_earth,dlon_earth + real(r_kind) dlat,dlon,staheight,tiltangle,clon,slon,clat,slat + real(r_kind) timeo,clonh,slonh,clath,slath,cdist,dist + real(r_kind) rwnd,azm,height,error + real(r_kind) azm_earth,cosazm_earth,sinazm_earth,cosazm,sinazm + real(r_kind):: zsges + + real(r_kind),dimension(maxdat):: cdata + real(r_kind),allocatable,dimension(:,:):: cdata_all + + real(r_double) rstation_id + character(8) cstaid + character(4) this_staid + equivalence (this_staid,cstaid) + equivalence (cstaid,rstation_id) + + + integer(i_kind) loop + real(r_kind) timemax,timemin,errmax,errmin + real(r_kind) dlatmax,dlonmax,dlatmin,dlonmin + real(r_kind) xscale,xscalei + integer(i_kind) max_rrr,nboxmax + integer(i_kind) irrr,iaaa,iaaamax,iaaamin + real(r_kind) this_stalat,this_stalon,this_stahgt,thistime,thislat,thislon + real(r_kind) thishgt,thisvr,corrected_azimuth,thiserr,corrected_tilt + integer(i_kind) nsuper2_in,nsuper2_kept + real(r_kind) errzmax + character(len=*),parameter:: tbname='SUPEROB_RADAR::' + integer(i_kind) ntot,radar_true,radar_count,inbufr,lundx,idups,idate,n_gates,levs + integer(i_kind) idate5(5) + integer(i_kind) nminref,nminthis,nrange_max + integer(i_kind) nobs_in,nradials_in,nradials_fail_angmax,nradials_fail_time,nradials_fail_elb,ireadmg,ireadsb + + integer(i_kind) nobs_badvr,nobs_badsr,j + real(r_kind) rlon0,clat0,slat0,this_stalatr,thisrange,thisazimuth,thistilt,thisvr2 + real(r_kind) rad_per_meter,erad,ddiffmin,distfact + character(len=256),allocatable,dimension(:):: rtable + character(4),allocatable,dimension(:):: rsite + integer(i_kind),allocatable,dimension(:):: ruse + character(8) chdr2,subset + real(r_double) rdisttest(n_gates_max),hdr(10),hdr2(12),rwnd0(3,n_gates_max) + character(4) stn_id + equivalence (chdr2,hdr2(1)) + real(r_kind) stn_lat,stn_lon,stn_hgt,stn_az,stn_el,t,range,vrmax,vrmin,aactual,a43,b,c,selev0,celev0,thistiltr,epsh,h,ha,rlonloc,rlatloc + + real(r_kind) celev,selev,gamma,thisazimuthr,rlonglob,rlatglob,clat1,caz0,saz0,cdlon,sdlon,caz1,saz1 + real(r_kind):: relm,srlm,crlm,sph,cph,cc,anum,denom + real(r_kind) :: rmesh,xmesh,zmesh,dx,dy,dx1,dy1,w00,w01,w10,w11 + real(r_kind), allocatable, dimension(:) :: zl_thin + integer(i_kind) :: ithin,zflag,nlevz,icntpnt,klon1,klat1,kk,klatp1,klonp1 + real(r_kind),dimension(nsig):: hges,zges + real(r_kind) sin2,termg,termr,termrg,zobs + integer(i_kind) ntmp,iout,iiout,ntdrvr_thin2 + real(r_kind) crit1,timedif + integer(i_kind) maxout,maxdata + logical :: luse + integer(i_kind) iyref,imref,idref,ihref,nout + + integer(i_kind),allocatable,dimension(:):: isort + +! following variables are for fore/aft separation + integer(i_kind) irec + + data lnbufr/10/ + if (radar_sites) then + open(666,file=trim('gsiparm.anl'),form='formatted') + call gettablesize(tbname,666,ntot,radar_count) + allocate(rtable(radar_count),rsite(radar_count),ruse(radar_count)) + call gettable(tbname,666,ntot,radar_count,rtable) + do i=1,radar_count + read(rtable(i),*) rsite(i),ruse(i) + write(*,'(A10,X,A4,X,I)'),"Radar Sites: ",rsite(i),ruse(i) + end do + end if + rad_per_meter= one/rearth + erad = rearth + + eradkm=rearth*0.001_r_kind + maxobs=2e7 + nreal=maxdat + nchanl=0 + ilon=2 + ilat=3 + ikx=0 + do j=1,nconvtype + if(trim(ioctype(j)) == trim(obstype))ikx = j + end do + iaaamax=-huge(iaaamax) + iaaamin=huge(iaaamin) + dlatmax=-huge(dlatmax) + dlonmax=-huge(dlonmax) + dlatmin=huge(dlatmin) + dlonmin=huge(dlonmin) + allocate(cdata_all(maxdat,maxobs),isort(maxobs)) + + isort = 0 + cdata_all=zero + xscale=1000._r_kind + xscalei=one/xscale + max_rrr=nint(1000000.0_r_kind*xscalei) + nboxmax=1 + kx0=22500 + nmrecs=0 + irec=0 + errzmax=zero + + timemax=-huge(timemax) + timemin=huge(timemin) + errmax=-huge(errmax) + errmin=huge(errmin) + loop=0 + + ibadazm=0 + ibadwnd=0 + ibaddist=0 + ibadheight=0 + ibadstaheight=0 + iheightbelowsta=0 + iheightbelowsta=0 + ibaderror=0 + ibadfit=0 + kthin=0 + notgood=0 + notgood0=0 + nsuper2_in=0 + nsuper2_kept=0 + ntdrvr_thin2=0 + maxout=0 + maxdata=0 + isort=0 + icntpnt=0 + nout=0 + if(loop==0) outmessage='level 2 superobs:' + rmesh=radar_rmesh + zmesh=radar_zmesh + nlevz=nint(16000._r_kind/zmesh) + xmesh=rmesh + call make3grids(xmesh,nlevz) + allocate(zl_thin(nlevz)) + zflag=1 + if (zflag == 1) then + do k=1,nlevz + zl_thin(k)=k*zmesh + enddo + endif + inbufr=10 + open(inbufr,file="l2rwbufr",form='unformatted') + rewind inbufr + lundx=inbufr + call openbf(inbufr,'IN',lundx) + call datelen(10) + iyref=iadate(1) + imref=iadate(2) + idref=iadate(3) + ihref=iadate(4) + idate5(1)=iyref + idate5(2)=imref + idate5(3)=idref + idate5(4)=ihref + idate5(5)=0 ! minutes + call w3fs21(idate5,nminref) + idups=0 + nobs_in=0 + nradials_in=0 + nradials_fail_angmax=0 + nradials_fail_time=0 + nradials_fail_elb=0 + ddiffmin=huge(ddiffmin) + do while(ireadmg(inbufr,subset,idate)>=0) + do while (ireadsb(inbufr)==0) + call ufbint(inbufr,rdisttest,1,n_gates_max,n_gates,'DIST125M') + if(n_gates>1) then + do i=1,n_gates-1 + if(nint(abs(rdisttest(i+1)-rdisttest(i)))==0) then + idups=idups+1 + else + ddiffmin=min(abs(rdisttest(i+1)-rdisttest(i)),ddiffmin) + end if + end do + end if + distfact=zero + if(nint(ddiffmin)==1) distfact=250._r_kind + if(nint(ddiffmin)==2) distfact=125._r_kind + if(distfact==zero) then + write(6,*)'RADAR_BUFR_READ_ALL: problem with level 2 bufr file, gate distance scale factor undetermined, going with 125' + distfact=125._r_kind + end if + call ufbint(inbufr,hdr2,12,1,levs,'SSTN CLAT CLON HSMSL HSALG ANEL YEAR MNTH DAYS HOUR MINU SECO') + if(hdr2(6)>elev_angle_max) then + nradials_fail_angmax=nradials_fail_angmax+1 + cycle + end if + idate5(1)=nint(hdr2(7)) ; idate5(2)=nint(hdr2(8)) ; idate5(3)=nint(hdr2(9)) + idate5(4)=nint(hdr2(10)) ; idate5(5)=nint(hdr2(11)) + call w3fs21(idate5,nminthis) + t=(real(nminthis-nminref,r_kind)+real(nint(hdr2(12)),r_kind)*rinv60)*rinv60 + timemax=max(t,timemax) + timemin=min(t,timemin) + if(abs(t)>del_time) then + nradials_fail_time=nradials_fail_time+1 + cycle + end if + nobs_in=nobs_in+n_gates + stn_id=chdr2 + radar_true=0 + if (radar_sites) then + do i=1,radar_count + if (trim(stn_id) .eq. trim(rsite(i)) .and. ruse(i) .eq. 1 ) radar_true=1 + end do + if (radar_true .eq. 0) cycle + end if + stn_lat=hdr2(2) + stn_lon=hdr2(3) + stn_hgt=hdr2(4)+hdr2(5) + call ufbint(inbufr,hdr,10,1,levs, & + 'SSTN YEAR MNTH DAYS HOUR MINU SECO ANAZ ANEL QCRW') + nradials_in=nradials_in+1 + stn_az=r90-hdr(8) + stn_el=hdr(9) + call ufbint(inbufr,rwnd0,3,n_gates_max,n_gates,'DIST125M DMVR DVSW') + do i=1,n_gates + range=distfact*rwnd0(1,i) + if(range>range_max) then + nrange_max=nrange_max+1 + cycle + end if + if(rwnd0(2,i)>r1e5_double) then + nobs_badvr=nobs_badvr+1 + cycle + end if + if(rwnd0(3,i)>r1e5_double) then + nobs_badsr=nobs_badsr+1 + cycle + end if + this_stalat=stn_lat + if(abs(this_stalat)>r89_5) cycle + this_stalon=stn_lon + rlon0=deg2rad*this_stalon + this_stalatr=this_stalat*deg2rad + clat0=cos(this_stalatr) ; slat0=sin(this_stalatr) + this_staid=stn_id + this_stahgt=stn_hgt + thisrange= range + thisazimuth=stn_az + thistilt=stn_el + thisvr=rwnd0(2,i) + vrmax=max(vrmax,thisvr) + vrmin=min(vrmin,thisvr) + thisvr2=rwnd0(2,i)**2 + thiserr=5.0_r_kind + errmax=max(errmax,thiserr) + errmin=min(errmin,thiserr) + thistime=t + aactual=erad+this_stahgt + a43=four_thirds*aactual + thistiltr=thistilt*deg2rad + selev0=sin(thistiltr) + celev0=cos(thistiltr) + b=thisrange*(thisrange+two*aactual*selev0) + c=sqrt(aactual*aactual+b) + ha=b/(aactual+c) + epsh=(thisrange*thisrange-ha*ha)/(r8*aactual) + h=ha-epsh + thishgt=this_stahgt+h + celev=celev0 + selev=selev0 + if(thisrange>=one) then + celev=a43*celev0/(a43+h) + selev=(thisrange*thisrange+h*h+two*a43*h)/(two*thisrange*(a43+h)) + end if + corrected_tilt=atan2(selev,celev)*rad2deg + gamma=half*thisrange*(celev0+celev) +! Get earth lat lon of superob + thisazimuthr=thisazimuth*deg2rad + rlonloc=rad_per_meter*gamma*cos(thisazimuthr) + rlatloc=rad_per_meter*gamma*sin(thisazimuthr) + RELM=rlonloc + SRLM=SIN(RELM) + CRLM=COS(RELM) + SPH=SIN(rlatloc) + CPH=COS(rlatloc) + CC=CPH*CRLM + ANUM=CPH*SRLM + DENOM=clat0*CC-slat0*SPH + rlonglob=rlon0+ATAN2(ANUM,DENOM) + rlatglob=ASIN(clat0*SPH+slat0*CC) + thislat=rlatglob*rad2deg + thislon=rlonglob*rad2deg + if(abs(thislat)>r89_5) cycle + clat1=cos(rlatglob) + caz0=cos(thisazimuthr) + saz0=sin(thisazimuthr) + cdlon=cos(rlonglob-rlon0) + sdlon=sin(rlonglob-rlon0) + caz1=clat0*caz0/clat1 + saz1=saz0*cdlon-caz0*sdlon*slat0 + corrected_azimuth=atan2(saz1,caz1)*rad2deg + + if (doradaroneob .and. (oneobradid /= this_staid)) cycle + if(iret/=0) exit + nsuper2_in=nsuper2_in+1 + dlat_earth=this_stalat !station lat (degrees) + dlon_earth=this_stalon !station lon (degrees) + if (dlon_earth>=r360) dlon_earth=dlon_earth-r360 + if (dlon_earthwinlen) cycle + else + timeo=thistime + if(abs(timeo)>half ) cycle + endif +! Get observation (lon,lat). Compute distance from radar. + dlat_earth=thislat + dlon_earth=thislon + if(dlon_earth>=r360) dlon_earth=dlon_earth-r360 + if(dlon_earthmax_rrr) cycle + end if +! Extract radial wind data + height= thishgt + rwnd = thisvr + azm_earth = corrected_azimuth + if(regional) then + if(oneobtest .and. learthrel_rw) then ! for non rotated winds!!! + cosazm=cos(azm_earth*deg2rad) + sinazm=sin(azm_earth*deg2rad) + azm=atan2(sinazm,cosazm)*rad2deg + else + cosazm_earth=cos(azm_earth*deg2rad) + sinazm_earth=sin(azm_earth*deg2rad) + call rotate_wind_ll2xy(cosazm_earth,sinazm_earth,cosazm,sinazm,dlon_earth,dlon,dlat) + azm=atan2(sinazm,cosazm)*rad2deg + end if + else + azm=azm_earth + end if +!#################### Data thinning ################### + icntpnt=icntpnt+1 + ithin=1 !number of obs to keep per grid box + if(radar_no_thinning) then + ithin=-1 + endif + if(ithin > 0)then + if(zflag == 0)then + klon1= int(dlon); klat1= int(dlat) + dx = dlon-klon1; dy = dlat-klat1 + dx1 = one-dx; dy1 = one-dy + w00=dx1*dy1; w10=dx1*dy; w01=dx*dy1; w11=dx*dy + + klat1=min(max(1,klat1),nlat); klon1=min(max(0,klon1),nlon) + if (klon1==0) klon1=nlon + klatp1=min(nlat,klat1+1); klonp1=klon1+1 + if (klonp1==nlon+1) klonp1=1 + do kk=1,nsig + hges(kk)=w00*hgtl_full(klat1 ,klon1 ,kk) + & + w10*hgtl_full(klatp1,klon1 ,kk) + & + w01*hgtl_full(klat1 ,klonp1,kk) + & + w11*hgtl_full(klatp1,klonp1,kk) + end do + sin2 = sin(thislat)*sin(thislat) + termg = grav_equator * & + ((one+somigliana*sin2)/sqrt(one-eccentricity*eccentricity*sin2)) + termr = semi_major_axis /(one + flattening + grav_ratio - & + two*flattening*sin2) + termrg = (termg/grav)*termr + do kk=1,nsig + zges(kk) = (termr*hges(kk)) / (termrg-hges(kk)) + zl_thin(kk)=zges(kk) + end do + endif + zobs = height + ntmp=ndata ! counting moved to map3gridS + if (l4dvar) then + timedif = zero + else + timedif=abs(t4dvo-toff) + endif + crit1 = timedif/r6+half + call map3grids(1,zflag,zl_thin,nlevz,dlat_earth,dlon_earth,& + zobs,crit1,ndata,iout,icntpnt,iiout,luse, .false., .false.) + maxout=max(maxout,iout) + maxdata=max(maxdata,ndata) + if (.not. luse) then + ntdrvr_thin2=ntdrvr_thin2+1 + cycle + endif + if(iiout > 0) isort(iiout)=0 + if (ndata > ntmp) then + nodata=nodata+1 + endif + isort(icntpnt)=iout + else + ndata =ndata+1 + nodata=nodata+1 + iout=ndata + isort(icntpnt)=iout + endif +!#################### Data thinning ################### + if(.not. oneobtest) then + iaaa=azm/(r360/(r8*irrr)) + iaaa=mod(iaaa,8*irrr) + if(iaaa<0) iaaa=iaaa+8*irrr + iaaa=iaaa+1 + iaaamax=max(iaaamax,iaaa) + iaaamin=min(iaaamin,iaaa) + end if + error = erradar_inflate*thiserr + errmax=max(error,errmax) + if(thiserr>zero) errmin=min(error,errmin) +! Perform limited qc based on azimuth angle, radial wind +! speed, distance from radar site, elevation of radar, +! height of observation, and observation error + good0=.true. + if(abs(azm)>r400) then + ibadazm=ibadazm+1; good0=.false. + end if + if(abs(rwnd)>r200) then + ibadwnd=ibadwnd+1; good0=.false. + end if + if(dist>r400) then + ibaddist=ibaddist+1; good0=.false. + end if + if(staheight<-r1000.or.staheight>r50000) then + ibadstaheight=ibadstaheight+1; good0=.false. + end if + if(height<-r1000.or.height>r50000) then + ibadheight=ibadheight+1; good0=.false. + end if + if(heightr6 .or. thiserr<=zero) then + ibaderror=ibaderror+1; good0=.false. + end if + good=.true. + if(.not.good0) then + notgood0=notgood0+1 + cycle + end if + +! If data is good, load into output array + if(good) then + + usage = zero + if(icuse(ikx) < 0)usage=r100 + + nsuper2_kept=nsuper2_kept+1 + cdata(1) = error ! wind obs error (m/s) + cdata(2) = dlon ! grid relative longitude + cdata(3) = dlat ! grid relative latitude + cdata(4) = height ! obs absolute height (m) + cdata(5) = rwnd ! wind obs (m/s) + cdata(6) = azm*deg2rad ! azimuth angle (radians) + cdata(7) = t4dvo+time_offset ! obs time (hour) + cdata(8) = ikx ! type + cdata(9) = tiltangle ! tilt angle (radians) + cdata(10)= staheight ! station elevation (m) + cdata(11)= rstation_id ! station id + cdata(12)= usage ! usage parameter + cdata(13)= idomsfc ! dominate surface type + cdata(14)= skint ! skin temperature + cdata(15)= ff10 ! 10 meter wind factor + cdata(16)= sfcr ! surface roughness + cdata(17)=dlon_earth*rad2deg ! earth relative longitude (degrees) + cdata(18)=dlat_earth*rad2deg ! earth relative latitude (degrees) + cdata(19)=dist ! range from radar in km (used to estimatebeam spread) + cdata(20)=zsges ! model elevation at radar site + cdata(21)=thiserr + cdata(22)=two + do j=1,maxdat + cdata_all(j,iout)=cdata(j) + end do + else + notgood = notgood + 1 + end if + end do + end do + end do + close(lnbufr) ! A simple unformatted fortran file should not be mixed with bufr I/O + write(6,*)'READ_RADAR_L2RW_NOVADQC: ',trim(outmessage),' reached eof on 2 superob radar file' + write(6,*)'READ_RADAR_L2RW_NOVADQC: nsuper2_in,nsuper2_kept=',nsuper2_in,nsuper2_kept + write(6,*)'READ_RADAR_L2RW_NOVADQC: # bad winds =',ibadwnd,nobs_badvr,nobs_badsr + write(6,*)'READ_RADAR_L2RW_NOVADQC: # num thinned =',kthin,ntdrvr_thin2 + write(6,*)'READ_RADAR_L2RW_NOVADQC: timemin,max =',timemin,timemax + write(6,*)'READ_RADAR_L2RW_NOVADQC: errmin,max =',errmin,errmax + write(6,*)'READ_RADAR_L2RW_NOVADQC: dlatmin,max,dlonmin,max=',dlatmin,dlatmax,dlonmin,dlonmax + +! Write observation to scratch file + call count_obs(ndata,maxdat,ilat,ilon,cdata_all,nobs) + write(lunout) obstype,sis,nreal,nchanl,ilat,ilon + write(6,*) shape(cdata_all) + write(lunout) ((cdata_all(k,i),k=1,maxdat),i=1,ndata) + deallocate(cdata_all) + if (radar_sites) deallocate(rtable,rsite,ruse) + deallocate(zl_thin) + deallocate(isort) + return + +end subroutine read_radar_l2rw +!!!!!!!!!!!!!!! End added for l2rw thinning !!!!!!!!!!!!!!! + diff --git a/src/gsi/read_satwnd.f90 b/src/gsi/read_satwnd.f90 index 1669e3aeb..1bc4f1b8d 100644 --- a/src/gsi/read_satwnd.f90 +++ b/src/gsi/read_satwnd.f90 @@ -329,7 +329,7 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis endif - call ufbint(lunin,hdrdat,13,1,iret,hdrtr_v1) + call ufbint(lunin,hdrdat,13,1,iret,hdrtr_v1) ! SWQM doesn't exist for GOES-R/new BUFR/ hence hdrdat(13)=MISSING. ! qm=2, instead of using hdrdat(13)(2015-07-16, Genkova) @@ -346,7 +346,20 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis else if(hdrdat(9) == three) then ! WV cloud top itype=254 else if(hdrdat(9) >= four) then ! WV deep layer, monitored - itype=254 + itype=254 + endif + endif + else if(trim(subset) == 'NC005067' .or. trim(subset) == 'NC005068' .or.& + trim(subset) == 'NC005069') then ! read new EUM BURF + if( hdrdat(1) = r50) then !the range of EUMETSAT satellite IDS + if(hdrdat(9) == one) then ! IR winds + itype=253 + else if(hdrdat(9) == two) then ! visible winds + itype=243 + else if(hdrdat(9) == three) then ! WV cloud top + itype=254 + else if(hdrdat(9) >= four) then ! WV deep layer, monitored + itype=254 endif endif else if(trim(subset) == 'NC005044' .or. trim(subset) == 'NC005045' .or. & @@ -398,6 +411,15 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis write(6,*) 'READ_SATWND: wrong derived method value' endif endif + else if( trim(subset) == 'NC005081') then + if( hdrdat(1) <10.0_r_kind .or. (hdrdat(1) >= 200.0_r_kind .and. & + hdrdat(1) <=223.0_r_kind) ) then ! the range of EUMETSAT and NOAA polar orbit satellite IDs + if(hdrdat(9) == one) then ! IR winds + itype=244 + else + write(6,*) 'READ_SATWND: wrong derived method value' + endif + endif else if( trim(subset) == 'NC005019') then ! GOES shortwave winds if(hdrdat(1) >=r250 .and. hdrdat(1) <=r299 ) then ! The range of NESDIS satellite IDS if(hdrdat(9) == one) then ! short wave IR winds @@ -425,9 +447,9 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis ! itype=260 ! endif !Temporary solution replacing the commented code above - if(trim(subset) == 'NC005091') then ! IR LW winds - itype=260 - endif + if(trim(subset) == 'NC005091') then ! IR LW winds + itype=260 + endif !GOES-R section of the 'if' statement over 'subsets' @@ -450,19 +472,22 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis ! endif !Temporary solution replacing the commented code above - if(trim(subset) == 'NC005030') then ! IR LW winds - itype=245 - else if(trim(subset) == 'NC005039') then ! IR SW winds - itype=240 - else if(trim(subset) == 'NC005032') then ! VIS winds - itype=251 - else if(trim(subset) == 'NC005034') then ! WV cloud top - itype=246 - else if(trim(subset) == 'NC005031') then ! WV clear sky/deep layer - itype=247 - endif + if(trim(subset) == 'NC005030') then ! IR LW winds + itype=245 + else if(trim(subset) == 'NC005039') then ! IR SW winds + itype=240 + else if(trim(subset) == 'NC005032') then ! VIS winds + itype=251 + else if(trim(subset) == 'NC005034') then ! WV cloud top + itype=246 + else if(trim(subset) == 'NC005031') then ! WV clear sky/deep layer + itype=247 + endif + else ! wind is not recognised and itype is not assigned + cycle loop_report + endif - endif + if ( itype == -1 ) cycle loop_report ! unassigned itype ! Match ob to proper convinfo type ncsave=0 @@ -600,13 +625,13 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis ! Test for BUFR version using lat/lon mnemonics call ufbint(lunin,hdrdat_test,2,1,iret, 'CLAT CLON') - if ( hdrdat_test(1) > 100000000.0_r_kind .and. hdrdat_test(2) > 100000000.0_r_kind ) then - call ufbint(lunin,hdrdat,13,1,iret,hdrtr_v2) - call ufbint(lunin,obsdat,4,1,iret,obstr_v2) - else - call ufbint(lunin,hdrdat,13,1,iret,hdrtr_v1) - call ufbint(lunin,obsdat,4,1,iret,obstr_v1) - endif + if ( hdrdat_test(1) > 100000000.0_r_kind .and. hdrdat_test(2) > 100000000.0_r_kind ) then + call ufbint(lunin,hdrdat,13,1,iret,hdrtr_v2) + call ufbint(lunin,obsdat,4,1,iret,obstr_v2) + else + call ufbint(lunin,hdrdat,13,1,iret,hdrtr_v1) + call ufbint(lunin,obsdat,4,1,iret,obstr_v1) + endif ppb=obsdat(2) if (ppb > 100000000.0_r_kind .or. & @@ -684,7 +709,7 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis enddo if(qifn <85.0_r_kind ) then ! qifn, QI without forecast qm=15 - endif + endif endif else if(trim(subset) == 'NC005044' .or. trim(subset) == 'NC005045' .or. & ! JMA trim(subset) == 'NC005046') then @@ -720,13 +745,13 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis qifn=qcdat(3,j) else if(qcdat(2,j) == 103.0_r_kind .and. ee >r105) then ee=qcdat(3,j) - endif + endif endif - enddo - + enddo + if(qifn <85.0_r_kind ) then ! qifn: QI value without forecast qm=15 - endif + endif endif else if(trim(subset) == 'NC005010' .or. trim(subset) == 'NC005011' .or. & ! NESDIS GOES trim(subset) == 'NC005012' ) then @@ -752,7 +777,7 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis c_station_id='WV'//stationid c_sprvstg='WV' else if(hdrdat(9) >= four) then ! WV deep layer.mornitored set in convinfo file - itype=247 + itype=247 c_station_id='WV'//stationid c_sprvstg='WV' endif @@ -767,7 +792,7 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis qify=qcdat(3,j) else if( qcdat(2,j) == four .and. ee >r105) then ee=qcdat(3,j) - endif + endif endif enddo !QI not applied to CAWV for now - may in the future @@ -820,7 +845,7 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis qify=qcdat(3,j) else if( qcdat(2,j) == four .and. ee >r105 ) then ee=qcdat(3,j) - endif + endif endif enddo endif @@ -844,7 +869,7 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis qify=qcdat(3,j) else if( qcdat(2,j) == four .and. ee >r105) then ee=qcdat(3,j) - endif + endif endif enddo endif @@ -904,7 +929,7 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis !enddo endif else if( trim(subset) == 'NC005090') then ! VIIRS IR winds - if(hdrdat(1) >=r200 .and. hdrdat(1) <=r250 ) then ! The range of satellite IDS + if(hdrdat(1) >=r200 .and. hdrdat(1) <=r250 ) then ! The range of satellite IDS c_prvstg='VIIRS' if(hdrdat(9) == one) then ! VIIRS IR winds itype=260 @@ -925,10 +950,79 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis endif endif enddo - endif + endif +! Extra block for new EUMETSAT BUFR: Start + if(qifn <85.0_r_kind ) then ! qifn, QI without forecast + qm=15 + endif + else if(trim(subset) == 'NC005067' .or. trim(subset) == 'NC005068' .or. & + trim(subset) == 'NC005069') then ! read new EUM BURF + if( hdrdat(1) = r50 ) then ! The range of satellite IDs + c_prvstg='EUMETSAT' + if(hdrdat(10) >68.0_r_kind) cycle loop_readsb ! reject data zenith angle >68.0 degree + if(hdrdat(9) == one) then ! IR winds + itype=253 + c_station_id='IR'//stationid + c_sprvstg='IR' + else if(hdrdat(9) == two) then ! visible winds + itype=243 + c_station_id='VI'//stationid + c_sprvstg='VI' + else if(hdrdat(9) == three) then ! WV cloud top, try to assimilate + itype=254 + c_station_id='WV'//stationid + c_sprvstg='WV' + else if(hdrdat(9) >= four) then ! WV deep layer,monitoring + itype=254 + qm=9 ! quality mark as 9, means the observation error needed to be set + c_station_id='WV'//stationid + c_sprvstg='WV' + endif +! get quality information THIS SECTION NEEDS TO BE TESTED!!! + call ufbint(lunin,rep_array,1,1,iret, '{AMVIVR}') + irep_array = int(rep_array) + allocate( amvivr(2,irep_array)) + call ufbrep(lunin,amvivr,2,irep_array,iret, 'TCOV CVWD') + pct1 = amvivr(2,1) ! use of pct1 (a new variable in the BUFR) is introduced by Nebuda/Genkova + deallocate( amvivr ) + + call ufbseq(lunin,amvqic,2,4,iret, 'AMVQIC') ! AMVQIC:: GNAPS PCCF + qifn = amvqic(2,2) ! QI w/ fcst does not exist in this BUFR + ee = amvqic(2,4) ! NOTE: GOES-R's ee is in [m/s] + if(qifn <85.0_r_kind ) then ! qifn, QI without forecast + qm=15 + endif + endif +! Extra block for new EUMETSAT BUFR: End +! Extra block for new Metop/AVHRR BUFR: Start + else if(trim(subset) == 'NC005081') then ! Metop/AVHRR from NESDIS + if( hdrdat(1) <10.0_r_kind .or. (hdrdat(1) >= 200.0_r_kind .and. & + hdrdat(1) <=223.0_r_kind) ) then ! The range of satellite IDs + c_prvstg='AVHRR' + if(hdrdat(9) == one) then ! IRwinds + itype=244 + c_station_id='IR'//stationid + c_sprvstg='IR' + else + write(6,*) 'READ_SATWND: wrong derived method value' + endif + + call ufbint(lunin,rep_array,1,1,iret, '{AMVIVR}') + irep_array = int(rep_array) + allocate( amvivr(2,irep_array)) + call ufbrep(lunin,amvivr,2,irep_array,iret, 'TCOV CVWD') + pct1 = amvivr(2,1) ! use of pct1 is limited to GOES-16/17) as introduced by Nebuda/Genkova + deallocate( amvivr ) + + call ufbseq(lunin,amvqic,2,4,iret, 'AMVQIC') ! AMVQIC:: GNAPS PCCF + qifn = amvqic(2,2) ! QI w/ fcst does not exist in this BUFR + ee = amvqic(2,4) ! NOTE: GOES-R's ee is in [m/s] + endif +! Extra block for new Metop/AVHRR BUFR: End + ! Extra block for VIIRS NOAA-20: Start else if(trim(subset) == 'NC005091') then - if(hdrdat(1) >=r250 .and. hdrdat(1) <=r299 ) then ! The range of satellite IDs + if( hdrdat(1) >=r200 .and. hdrdat(1) <=r250 ) then ! Use this range in v16.* c_prvstg='VIIRS' if(trim(subset) == 'NC005091') then ! IR LW winds itype=260 @@ -1064,35 +1158,39 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis if(itype==240 .or. itype==245 .or. itype==246 .or. itype==251) then ! types 245 and 246 have been used to determine the acceptable pct1 range, but that pct1 range is applied to all GOES-R winds if (pct1 < 0.04_r_kind) qm=15 - if (pct1 > 0.50_r_kind) qm=15 - endif + if (pct1 > 0.50_r_kind) qm=15 + endif endif ! GOES-16 additional QC addopting ECMWF's approach(Katie Lean,14IWW)-start - if (EC_AMV_QC) then - if (qifn < 90_r_kind .or. qifn > r100 ) qm=15 ! stricter QI - if (ppb < 150.0_r_kind) qm=15 ! all high level - if (itype==251 .and. ppb < 700.0_r_kind) qm=15 ! VIS - if (itype==246 .and. ppb > 300.0_r_kind) qm=15 ! WVCA - dlon_earth=hdrdat(3)*deg2rad - dlat_earth=hdrdat(2)*deg2rad - call deter_sfc_type(dlat_earth,dlon_earth,t4dv,isflg,tsavg) - if (isflg == 1 .and. ppb > 850.0_r_kind) qm=15 ! low over land - endif - - ! winds rejected by qc dont get used - if (qm == 15) usage=r100 - if (qm == 3 .or. qm ==7) woe=woe*r1_2 - ! set strings for diagnostic output - if(itype==240 ) then; c_prvstg='GOESR' ; c_sprvstg='IRSW' ; endif - if(itype==245 ) then; c_prvstg='GOESR' ; c_sprvstg='IR' ; endif - if(itype==246 ) then; c_prvstg='GOESR' ; c_sprvstg='WVCT' ; endif - if(itype==247 ) then; c_prvstg='GOESR' ; c_sprvstg='WVCS' ; endif - if(itype==251 ) then; c_prvstg='GOESR' ; c_sprvstg='VIS' ; endif + if (EC_AMV_QC) then + if (qifn < 90_r_kind .or. qifn > r100 ) qm=15 ! stricter QI + if (ppb < 150.0_r_kind) qm=15 ! all high level + if (itype==251 .and. ppb < 700.0_r_kind) qm=15 ! VIS + if (itype==246 .and. ppb > 300.0_r_kind) qm=15 ! WVCA + dlon_earth=hdrdat(3)*deg2rad + dlat_earth=hdrdat(2)*deg2rad + call deter_sfc_type(dlat_earth,dlon_earth,t4dv,isflg,tsavg) + if (isflg == 1 .and. ppb > 850.0_r_kind) qm=15 ! low over land + endif + + ! winds rejected by qc dont get used + if (qm == 15) usage=r100 + if (qm == 3 .or. qm ==7) woe=woe*r1_2 + ! set strings for diagnostic output + if(itype==240 ) then; c_prvstg='GOESR' ; c_sprvstg='IRSW' ; endif + if(itype==245 ) then; c_prvstg='GOESR' ; c_sprvstg='IR' ; endif + if(itype==246 ) then; c_prvstg='GOESR' ; c_sprvstg='WVCT' ; endif + if(itype==247 ) then; c_prvstg='GOESR' ; c_sprvstg='WVCS' ; endif + if(itype==251 ) then; c_prvstg='GOESR' ; c_sprvstg='VIS' ; endif endif ! Extra block for GOES-R winds: End - + else ! wind is not recognised and itype is not assigned + cycle loop_readsb endif + + if ( itype == -1 ) cycle loop_readsb ! unassigned itype + ! assign types and get quality info : end if ( qify == zero) qify=r110 @@ -1142,7 +1240,7 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis endif endif endif - + !! convert from wind direction and speed to u,v component uob=-obsdat(4)*sin(obsdat(3)*deg2rad) vob=-obsdat(4)*cos(obsdat(3)*deg2rad) @@ -1182,7 +1280,7 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis endif enddo if (ncount ==1) then - write(6,*) 'READ_SATWND,WARNING cannot find subtyep in the error table,& + write(6,*) 'READ_SATWND,WARNING cannot find subtype in the error table,& itype,iobsub=',itypey,icsubtype(nc) write(6,*) 'read error table at colomn subtype as 0,error table column=',ierr endif @@ -1252,19 +1350,19 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis ree=0.2_r_kind endif if( ppb >= 800.0_r_kind .and. ree >0.55_r_kind) then - qm=15 + qm=15 else if (ree >0.8_r_kind) then - qm=15 + qm=15 endif endif ! Reduce OE for the GOES-R winds by half following Sharon Nebuda's work ! GOES-R wind are identified/recognised here by subset, but it could be done by itype or SAID ! After completing the evaluation of GOES-R winds, REVISE this section!!! - if(trim(subset) == 'NC005030' .or. trim(subset) == 'NC005031' .or. trim(subset) == 'NC005032' .or. & + if(trim(subset) == 'NC005030' .or. trim(subset) == 'NC005031' .or. trim(subset) == 'NC005032' .or. & trim(subset) == 'NC005034' .or. trim(subset) == 'NC005039' ) then - obserr=obserr/two - endif + obserr=obserr/two + endif ! Set usage variable usage = 0 @@ -1454,7 +1552,7 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis call del3grids endif if (.not.use_all_tm) then - deallocate(presl_thin) + deallocate(presl_thin) call del3grids_tm endif diff --git a/src/gsi/read_seviri.f90 b/src/gsi/read_seviri.f90 index 9b01d3df0..9b1eb6365 100644 --- a/src/gsi/read_seviri.f90 +++ b/src/gsi/read_seviri.f90 @@ -219,15 +219,13 @@ subroutine read_seviri(mype,val_sev,ithin,rmesh,jsatid,& call makegrids(rmesh,ithin,n_tbin=n_tbin) ! Set BUFR string based on seviri data set + hdrsevi='SAID YEAR MNTH DAYS HOUR MINU SECO CLATH CLONH SAZA SOZA' + nhdr=11 if (clrsky) then - hdrsevi='SAID YEAR MNTH DAYS HOUR MINU SECO CLATH CLONH SAZA SOZA' - nhdr=11 nchn=12 ncld=nchn nbrst=nchn else if (allsky) then - hdrsevi='SAID YEAR MNTH DAYS HOUR MINU SECO CLATH CLONH' - nhdr=9 nchn=11 ncld=2 nbrst=nchn*6 ! channel dependent: all, clear, cloudy, low, middle and high clouds @@ -255,7 +253,7 @@ subroutine read_seviri(mype,val_sev,ithin,rmesh,jsatid,& if(jsatid == 'm11') kidsat = 70 if( ithin_time == 5) then call read_subset_nnsb - endif + endif open(lnbufr,file=infile,form='unformatted') call openbf(lnbufr,'IN',lnbufr) @@ -286,10 +284,9 @@ subroutine read_seviri(mype,val_sev,ithin,rmesh,jsatid,& ! Read through each record call ufbint(lnbufr,hdr,nhdr,1,iret,hdrsevi) if(nint(hdr(1)) /= kidsat) cycle read_loop - if (clrsky) then ! asr bufr has no sza -! remove the obs whose satellite zenith angles larger than 65 degree - if ( hdr(ilzah) > r65 ) cycle read_loop - end if +! if (clrsky) then ! asr bufr has no sza, asr bufr has sza since 2017.07 + if ( hdr(ilzah) > r65 ) cycle read_loop +! end if ! Convert obs location from degrees to radians @@ -358,10 +355,10 @@ subroutine read_seviri(mype,val_sev,ithin,rmesh,jsatid,& nread=nread+nchanl - rcldfrc=zero + rcldfrc=bmiss if(clrsky) then - call ufbrep(lnbufr,datasev1,1,ncld,iret,'NCLDMNT') - rclrsky=bmiss + call ufbrep(lnbufr,datasev1,1,ncld,iret,'NCLDMNT') + rclrsky=bmiss ! datasev1(1,5) is high-peaking water vapor channel ! for SEVIRI CSR, clear-sky percentage are different between the high-peaking WV channel and other channels if(datasev1(1,5)>= zero .and. datasev1(1,5) <= 100.0_r_kind ) then @@ -380,22 +377,35 @@ subroutine read_seviri(mype,val_sev,ithin,rmesh,jsatid,& call ufbrep(lnbufr,datasev2,1,nbrst,iret,'TMBRST') call ufbrep(lnbufr,datasev3,1,nbrst,iret,'SDTB') - allchnmiss=.true. - do n=4,11 - if(datasev2(1,n)<500.) then - allchnmiss=.false. - end if - end do - if(allchnmiss) cycle read_loop - -! toss data if SDTB>1.3 - do i=4,11 - if(i==5 .or. i==6) then ! 2 water-vapor channels - if(datasev3(1,i)>1.3_r_kind) then - cycle read_loop + if(clrsky) then + allchnmiss=.true. + do n=4,11 + if( datasev2(1,n)>zero .and. datasev2(1,n)<500.0_r_kind) then + allchnmiss=.false. end if - end if - end do + end do + if(allchnmiss) cycle read_loop + +! toss data if SDTB>1.3 + do i=4,11 + if(i==5 .or. i==6) then ! 2 water-vapor channels + if(datasev3(1,i)>1.3_r_kind) then + cycle read_loop + end if + end if + end do + end if + + if(allsky) then + allchnmiss=.true. + do k=1,nchanl + jj=(k+2)*6+1 + if( datasev2(1,jj)>zero .and. datasev2(1,jj)<500._r_kind) then + allchnmiss=.false. + end if + end do + if(allchnmiss) cycle read_loop + end if ! Locate the observation on the analysis grid. Get sst and land/sea/ice ! mask. @@ -420,9 +430,9 @@ subroutine read_seviri(mype,val_sev,ithin,rmesh,jsatid,& if(clrsky) then ! use NCLDMNT from chn9 (10.8 micron) as a QC predictor ! add SDTB from chn9 as QC predictor - pred=10-datasev1(1,9)/10.0_r_kind+datasev3(1,9)*10.0_r_kind + pred=10-datasev1(1,9)/10.0_r_kind+datasev3(1,9)*10.0_r_kind else - pred=zero + pred=zero end if ! Compute "score" for observation. All scores>=0.0. Lowest score is "best" @@ -482,10 +492,10 @@ subroutine read_seviri(mype,val_sev,ithin,rmesh,jsatid,& data_all(32,itx) = rcldfrc ! total cloud fraction from SEVASR do k=1,nchanl if(clrsky) then - data_all(32+k,itx) = datasev3(1,k+3) ! BT standard deviation from SEVCSR + data_all(32+k,itx) = datasev3(1,k+3) ! BT standard deviation from SEVCSR else if(allsky) then - jj=(k+2)*6+1 - data_all(32+k,itx) = datasev3(1,jj) ! BT standard deviation from SEVASR + jj=(k+2)*6+1 + data_all(32+k,itx) = datasev3(1,jj) ! BT standard deviation from SEVASR end if end do @@ -524,24 +534,24 @@ subroutine read_seviri(mype,val_sev,ithin,rmesh,jsatid,& ! and write out data to scratch file for further processing. if (mype_sub==mype_root.and.ndata>0) then - do n=1,ndata - do k=1,nchanl - if(data_all(k+nreal,n) > tbmin .and. & - data_all(k+nreal,n) < tbmax)nodata=nodata+1 - end do - end do - if(dval_use .and. assim)then - do n=1,ndata - itt=nint(data_all(maxinfo,n)) - super_val(itt)=super_val(itt)+val_sev - end do - end if - -! Write retained data to local file - call count_obs(ndata,nele,ilat,ilon,data_all,nobs) - write(lunout) obstype,sis,nreal,nchanl,ilat,ilon - write(lunout) ((data_all(k,n),k=1,nele),n=1,ndata) - + do n=1,ndata + do k=1,nchanl + if(data_all(k+nreal,n) > tbmin .and. & + data_all(k+nreal,n) < tbmax)nodata=nodata+1 + end do + end do + if(dval_use .and. assim)then + do n=1,ndata + itt=nint(data_all(maxinfo,n)) + super_val(itt)=super_val(itt)+val_sev + end do + end if + +! Write retained data to local file + call count_obs(ndata,nele,ilat,ilon,data_all,nobs) + write(lunout) obstype,sis,nreal,nchanl,ilat,ilon + write(lunout) ((data_all(k,n),k=1,nele),n=1,ndata) + endif ! Deallocate local arrays diff --git a/src/gsi/setupbend.f90 b/src/gsi/setupbend.f90 index 9a8303442..2fe97bc07 100644 --- a/src/gsi/setupbend.f90 +++ b/src/gsi/setupbend.f90 @@ -97,6 +97,11 @@ subroutine setupbend(obsLL,odiagLL, & ! 2016-11-29 shlyaeva - save linearized H(x) for EnKF ! 2017-02-09 guo - Remove m_alloc, n_alloc. ! . Remove my_node with corrected typecast(). +! 2019-08-21 Shao - add COSMIC-2, metop-c and Paz +! 2020-03-18 Shao - update observation error for COSMIC-2 +! 2020-04-13 Shao - update the statistis QC for COSMIC-2 +! 2020-05-21 Shao - add comments to include commercial data ID information +! 2020-08-26 Shao/Bathmann - add Jacobian QC ! ! input argument list: ! lunin - unit from which to read observations @@ -156,7 +161,7 @@ subroutine setupbend(obsLL,odiagLL, & use m_gpsrhs, only: ratio_errors use m_gpsrhs, only: rdiagbuf,cdiagbuf use m_gpsrhs, only: qcfail - use m_gpsrhs, only: qcfail_loc,qcfail_high,qcfail_gross + use m_gpsrhs, only: qcfail_loc,qcfail_high,qcfail_gross,qcfail_jac use m_gpsrhs, only: data_ier,data_igps,data_ihgt use m_gpsrhs, only: gpsrhs_alloc use m_gpsrhs, only: gpsrhs_dealloc @@ -281,6 +286,11 @@ subroutine setupbend(obsLL,odiagLL, & !724-729 => COSMIC-2 Polar !825 => KOMPSAT-5 !5 => MetOpC +!265 => GeoOptics CICERO OP1 +!266 => GeoOptics CICERO OP2 +!267 => PlanetiQ GNOMES-A +!268 => PlanetiQ GNOMES-B +!269 => Spire Lemur 3U CubeSat ! Check to see if required guess fields are available call check_vars_(proceed) @@ -329,33 +339,33 @@ subroutine setupbend(obsLL,odiagLL, & nreal=mreal if (lobsdiagsave) nreal=nreal+4*miter+1 if (save_jacobian) then - nnz = nsig * 3 ! number of non-zero elements in dH(x)/dx profile - nind = 3 ! number of dense subarrays - call new(dhx_dx, nnz, nind) - nreal = nreal + size(dhx_dx) + nnz = nsig * 3 ! number of non-zero elements in dH(x)/dx profile + nind = 3 ! number of dense subarrays + call new(dhx_dx, nnz, nind) + nreal = nreal + size(dhx_dx) ! jacobian sparse array indices are the same for all obs and can be filled ! in once here: - t_ind = getindex(svars3d, 'tv') - if (t_ind < 0) then - print *, 'Error: no variable tv in state vector. Exiting.' - call stop2(1300) - endif - q_ind = getindex(svars3d, 'q') - if (q_ind < 0) then - print *, 'Error: no variable q in state vector. Exiting.' - call stop2(1300) - endif - p_ind = getindex(svars3d, 'prse') - if (p_ind < 0) then - print *, 'Error: no variable prse in state vector. Exiting.' - call stop2(1300) - endif - dhx_dx%st_ind(1) = sum(levels(1:t_ind-1)) + 1 - dhx_dx%end_ind(1) = sum(levels(1:t_ind-1)) + nsig - dhx_dx%st_ind(2) = sum(levels(1:q_ind-1)) + 1 - dhx_dx%end_ind(2) = sum(levels(1:q_ind-1)) + nsig - dhx_dx%st_ind(3) = sum(levels(1:p_ind-1)) + 1 - dhx_dx%end_ind(3) = sum(levels(1:p_ind-1)) + nsig + t_ind = getindex(svars3d, 'tv') + if (t_ind < 0) then + print *, 'Error: no variable tv in state vector. Exiting.' + call stop2(1300) + endif + q_ind = getindex(svars3d, 'q') + if (q_ind < 0) then + print *, 'Error: no variable q in state vector. Exiting.' + call stop2(1300) + endif + p_ind = getindex(svars3d, 'prse') + if (p_ind < 0) then + print *, 'Error: no variable prse in state vector. Exiting.' + call stop2(1300) + endif + dhx_dx%st_ind(1) = sum(levels(1:t_ind-1)) + 1 + dhx_dx%end_ind(1) = sum(levels(1:t_ind-1)) + nsig + dhx_dx%st_ind(2) = sum(levels(1:q_ind-1)) + 1 + dhx_dx%end_ind(2) = sum(levels(1:q_ind-1)) + nsig + dhx_dx%st_ind(3) = sum(levels(1:p_ind-1)) + 1 + dhx_dx%end_ind(3) = sum(levels(1:p_ind-1)) + nsig endif if(init_pass) call gpsrhs_alloc(is,'bend',nobs,nsig,nreal,grids_dim,nsig_ext) call gpsrhs_aliases(is) @@ -379,6 +389,7 @@ subroutine setupbend(obsLL,odiagLL, & qcfail=.false. qcfail_loc=zero;qcfail_gross=zero qcfail_high=zero + qcfail_jac=zero toss_gps_sub=zero dbend_loc=zero @@ -517,8 +528,8 @@ subroutine setupbend(obsLL,odiagLL, & bot_layer_SR=top_layer_SR endif endif - end do - endif + end do + endif ! locate observation in model vertical grid hob=tpdpres(i) @@ -568,253 +579,290 @@ subroutine setupbend(obsLL,odiagLL, & if(ratio_errors(i) > tiny_r_kind) then ! obs inside model grid - if (alt <= six) then - if (top_layer_SR >= 1) then ! SR exists for at least one layer. Check if obs is inside - if (tpdpres(i)==ref_rad(top_layer_SR+1)) then !obs inside model SR layer - qcfail(i)=.true. - elseif (tpdpres(i) < ref_rad(top_layer_SR+1)) then !obs below model close-to-SR layer - qcfail(i)=.true. - elseif (tpdpres(i) >= ref_rad(top_layer_SR+1) .and. tpdpres(i) <= ref_rad(top_layer_SR+2)) then !source too close - qcfail(i)=.true. - else !above - endif - endif - -! check for SR in obs, will be updated in genstats. - if ( data(igps,i) >= 0.03 .and. qc_layer_SR) then - kprof = data(iprof,i) - toss_gps_sub(kprof) = max (toss_gps_sub(kprof),data(igps,i)) - endif - endif - -! get pressure (in mb), temperature and moisture at obs location - call tintrp31(ges_lnprsi(:,:,1:nsig,:),dpressure,dlat,dlon,hob,& + if (alt <= six) then + if (top_layer_SR >= 1) then ! SR exists for at least one layer. Check if obs is inside + if (tpdpres(i)==ref_rad(top_layer_SR+1)) then !obs inside model SR layer + qcfail(i)=.true. + elseif (tpdpres(i) < ref_rad(top_layer_SR+1)) then !obs below model close-to-SR layer + qcfail(i)=.true. + elseif (tpdpres(i) >= ref_rad(top_layer_SR+1) .and. tpdpres(i) <= ref_rad(top_layer_SR+2)) then !source too close + qcfail(i)=.true. + else !above + endif + endif + +! check for SR in obs, will be updated in genstats. + if ( data(igps,i) >= 0.03 .and. qc_layer_SR) then + kprof = data(iprof,i) + toss_gps_sub(kprof) = max (toss_gps_sub(kprof),data(igps,i)) + endif + endif + +! get pressure (in mb), temperature and moisture at obs location + call tintrp31(ges_lnprsi(:,:,1:nsig,:),dpressure,dlat,dlon,hob,& dtime,hrdifsig,mype,nfldsig) - ihob=hob - k1=min(max(1,ihob),nsig) - k2=max(1,min(ihob+1,nsig)) - delz=hob-float(k1) - delz=max(zero,min(delz,one)) - trefges=tges_o(k1,i)*(one-delz)+tges_o(k2,i)*delz - qrefges=qges_o(k1)*(one-delz)+qges_o(k2)*delz !Lidia - - rdiagbuf( 6,i) = ten*exp(dpressure) ! pressure at obs location (hPa) if monotone grid - rdiagbuf(18,i) = trefges ! temperature at obs location (Kelvin) if monotone grid - rdiagbuf(21,i) = qrefges ! specific humidity at obs location (kg/kg) if monotone grid - - if (.not. qcfail(i)) then ! not SR - -! Modify error to account for representativeness error. - repe_gps=one - -! UKMET-type processing - if((data(isatid,i)==41) .or.(data(isatid,i)==722).or. & - (data(isatid,i)==723).or.(data(isatid,i)==4) .or. & - (data(isatid,i)==42) .or.(data(isatid,i)==3) .or. & - (data(isatid,i)==821).or.(data(isatid,i)==421).or. & - (data(isatid,i)==440).or.(data(isatid,i)==43) .or. & - (data(isatid,i)==5)) then + ihob=hob + k1=min(max(1,ihob),nsig) + k2=max(1,min(ihob+1,nsig)) + delz=hob-float(k1) + delz=max(zero,min(delz,one)) + trefges=tges_o(k1,i)*(one-delz)+tges_o(k2,i)*delz + qrefges=qges_o(k1)*(one-delz)+qges_o(k2)*delz !Lidia + + rdiagbuf( 6,i) = ten*exp(dpressure) ! pressure at obs location (hPa) if monotone grid + rdiagbuf(18,i) = trefges ! temperature at obs location (Kelvin) if monotone grid + rdiagbuf(21,i) = qrefges ! specific humidity at obs location (kg/kg) if monotone grid + + if (.not. qcfail(i)) then ! not SR + +! Modify error to account for representativeness error. + repe_gps=one + +! UKMET-type processing + if((data(isatid,i)==41) .or.(data(isatid,i)==722).or. & + (data(isatid,i)==723).or.(data(isatid,i)==4) .or. & + (data(isatid,i)==42) .or.(data(isatid,i)==3) .or. & + (data(isatid,i)==821).or.(data(isatid,i)==421).or. & + (data(isatid,i)==440).or.(data(isatid,i)==43) .or. & + (data(isatid,i)==5)) then - if((data(ilate,i)> r40).or.(data(ilate,i)< -r40)) then - if(alt>r12) then - repe_gps=0.19032_r_kind+0.287535_r_kind*alt-0.00260813_r_kind*alt**2 + if((data(ilate,i)> r40).or.(data(ilate,i)< -r40)) then + if(alt>r12) then + repe_gps=0.19032_r_kind+0.287535_r_kind*alt-0.00260813_r_kind*alt**2 + else + repe_gps=-3.20978_r_kind+1.26964_r_kind*alt-0.0622538_r_kind*alt**2 + endif else - repe_gps=-3.20978_r_kind+1.26964_r_kind*alt-0.0622538_r_kind*alt**2 + if(alt>r18) then + repe_gps=-1.87788_r_kind+0.354718_r_kind*alt-0.00313189_r_kind*alt**2 + else + repe_gps=-2.41024_r_kind+0.806594_r_kind*alt-0.027257_r_kind*alt**2 + endif endif - else - if(alt>r18) then - repe_gps=-1.87788_r_kind+0.354718_r_kind*alt-0.00313189_r_kind*alt**2 + else +! CDAAC-type processing + if ((data(isatid,i) > 749).and.(data(isatid,i) < 756)) then + if ((data(ilate,i)> r40).or.(data(ilate,i)< -r40)) then + if (alt <= 8.0_r_kind) then + repe_gps=-1.0304261_r_kind+0.3203316_r_kind*alt+0.0141337_r_kind*alt**2 + elseif (alt > 8.0_r_kind.and.alt <= r12) then + repe_gps=2.1750271_r_kind+0.0431177_r_kind*alt-0.0008567_r_kind*alt**2 + else + repe_gps=-0.3447429_r_kind+0.2829981_r_kind*alt-0.0028545_r_kind*alt**2 + endif + else + if (alt <= 4.0_r_kind) then + repe_gps=0.7285212_r_kind-1.1138755_r_kind*alt+0.2311123_r_kind*alt**2 + elseif (alt <= r18.and.alt > 4.0_r_kind) then + repe_gps=-3.3878629_r_kind+0.8691249_r_kind*alt-0.0297196_r_kind*alt**2 + else + repe_gps=-2.3875749_r_kind+0.3667211_r_kind*alt-0.0037542_r_kind*alt**2 + endif + endif else - repe_gps=-2.41024_r_kind+0.806594_r_kind*alt-0.027257_r_kind*alt**2 + if((data(ilate,i)> r40).or.(data(ilate,i)< -r40)) then + if(alt>r12) then + repe_gps=-0.685627_r_kind+0.377174_r_kind*alt-0.00421934_r_kind*alt**2 + else + repe_gps=-3.27737_r_kind+1.20003_r_kind*alt-0.0558024_r_kind*alt**2 + endif + else + if(alt>r18) then + repe_gps=-2.73867_r_kind+0.447663_r_kind*alt-0.00475603_r_kind*alt**2 + else + repe_gps=-3.45303_r_kind+0.908216_r_kind*alt-0.0293331_r_kind*alt**2 + endif + endif endif + endif - else -! CDAAC-type processing - if((data(ilate,i)> r40).or.(data(ilate,i)< -r40)) then - if(alt>r12) then - repe_gps=-0.685627_r_kind+0.377174_r_kind*alt-0.00421934_r_kind*alt**2 - else - repe_gps=-3.27737_r_kind+1.20003_r_kind*alt-0.0558024_r_kind*alt**2 - endif - else - if(alt>r18) then - repe_gps=-2.73867_r_kind+0.447663_r_kind*alt-0.00475603_r_kind*alt**2 + + repe_gps=exp(repe_gps) ! one/modified error in (rad-1*1E3) + repe_gps= r1em3*(one/abs(repe_gps)) ! modified error in rad + ratio_errors(i) = data(ier,i)/abs(repe_gps) + + error(i)=one/data(ier,i) ! one/original error + data(ier,i)=one/data(ier,i) ! one/original error + error_adjst(i)= ratio_errors(i)* data(ier,i) !one/adjusted error + +! Extending atmosphere above interface level nsig + d_ref_rad=ref_rad(nsig)-ref_rad(nsig-1) + do k=1,nsig_ext + ref_rad(nsig+k)=ref_rad(nsig)+ k*d_ref_rad ! extended x_i + nrefges(nsig+k,i)=nrefges(nsig+k-1,i)**2/nrefges(nsig+k-2,i) ! exended N_i + end do + +! Lagrange coefficients + ref_rad(0)=ref_rad(3) + ref_rad(nsig_up+1)=ref_rad(nsig_up-2) + do k=1,nsig_up + call setq(q_w(:,k),ref_rad(k-1:k+1),3) + enddo + + muse(i)=nint(data(iuse,i)) <= jiter + +! Get refractivity index-radius and [d(ln(n))/dx] in new grid. + intloop: do j=1,grids_dim + ref_rad_s(j)=sqrt(grid_s(j)*grid_s(j)+tpdpres(i)*tpdpres(i)) !x_j + xj(j,i)=ref_rad_s(j) + hob_s=ref_rad_s(j) + call grdcrd1(hob_s,ref_rad(1),nsig_up,1) + dbend_loc(j,i)=hob_s !location of x_j with respect to extended x_i + + + if (hob_s < rsig_up) then !obs inside the new grid + ihob=hob_s + +! Compute refractivity and derivative at target points +! using Lagrange interpolators + call slagdw(ref_rad(ihob-1:ihob+2),ref_rad_s(j),& + q_w(:,ihob),q_w(:,ihob+1),& + w4,dw4,4) + if(ihob==1) then + w4(4)=w4(4)+w4(1); w4(1:3)=w4(2:4);w4(4)=zero + dw4(4)=dw4(4)+dw4(1);dw4(1:3)=dw4(2:4);dw4(4)=zero + ihob=ihob+1 + endif + if(ihob==nsig_up-1) then + w4(1)=w4(1)+w4(4); w4(2:4)=w4(1:3);w4(1)=zero + dw4(1)=dw4(1)+dw4(4); dw4(2:4)=dw4(1:3);dw4(1)=zero + ihob=ihob-1 + endif + ddnj(j)=dot_product(dw4,nrefges(ihob-1:ihob+2,i))!derivative (dN/dx)_j + ddnj(j)=max(zero,abs(ddnj(j))) else - repe_gps=-3.45303_r_kind+0.908216_r_kind*alt-0.0293331_r_kind*alt**2 - endif - endif - endif + obs_check=.true. + if (obs_check) then ! only once per obs here + nobs_out=nobs_out+1 + d_ref_rad=ref_rad(nsig)-ref_rad(nsig-1) + do kk=1,20 + ref_rad_out(nsig_up+kk)=ref_rad(nsig_up)+ kk*d_ref_rad ! extended x_i + end do + do kk=1,nsig_up + ref_rad_out(kk)=ref_rad(kk) + enddo + endif + hob_s=ref_rad_s(j) + call grdcrd1(hob_s,ref_rad_out,nsig_up+20,1) + hob_s_top=max(hob_s,hob_s_top) + endif !obs in new grid + end do intloop + + if (obs_check) then ! reject observation + qcfail(i)=.true. + data(ier,i) = zero + ratio_errors(i) = zero + muse(i)=.false. + cycle loopoverobs1 + endif - repe_gps=exp(repe_gps) ! one/modified error in (rad-1*1E3) - repe_gps= r1em3*(one/abs(repe_gps)) ! modified error in rad - ratio_errors(i) = data(ier,i)/abs(repe_gps) - - error(i)=one/data(ier,i) ! one/original error - data(ier,i)=one/data(ier,i) ! one/original error - error_adjst(i)= ratio_errors(i)* data(ier,i) !one/adjusted error - -! Extending atmosphere above interface level nsig - d_ref_rad=ref_rad(nsig)-ref_rad(nsig-1) - do k=1,nsig_ext - ref_rad(nsig+k)=ref_rad(nsig)+ k*d_ref_rad ! extended x_i - nrefges(nsig+k,i)=nrefges(nsig+k-1,i)**2/nrefges(nsig+k-2,i) ! exended N_i - end do - -! Lagrange coefficients - ref_rad(0)=ref_rad(3) - ref_rad(nsig_up+1)=ref_rad(nsig_up-2) - do k=1,nsig_up - call setq(q_w(:,k),ref_rad(k-1:k+1),3) - enddo - - muse(i)=nint(data(iuse,i)) <= jiter - -! Get refractivity index-radius and [d(ln(n))/dx] in new grid. - intloop: do j=1,grids_dim - ref_rad_s(j)=sqrt(grid_s(j)*grid_s(j)+tpdpres(i)*tpdpres(i)) !x_j - xj(j,i)=ref_rad_s(j) - hob_s=ref_rad_s(j) - call grdcrd1(hob_s,ref_rad(1),nsig_up,1) - dbend_loc(j,i)=hob_s !location of x_j with respect to extended x_i - +! bending angle (radians) + dbend=ds*ddnj(1)/ref_rad_s(1) + do j=2,grids_dim + ddbend=ds*ddnj(j)/ref_rad_s(j) + dbend=dbend+two*ddbend + end do + dbend=r1em6*tpdpres(i)*dbend - if (hob_s < rsig_up) then !obs inside the new grid - ihob=hob_s - -! Compute refractivity and derivative at target points -! using Lagrange interpolators - call slagdw(ref_rad(ihob-1:ihob+2),ref_rad_s(j),& - q_w(:,ihob),q_w(:,ihob+1),& - w4,dw4,4) - if(ihob==1) then - w4(4)=w4(4)+w4(1); w4(1:3)=w4(2:4);w4(4)=zero - dw4(4)=dw4(4)+dw4(1);dw4(1:3)=dw4(2:4);dw4(4)=zero - ihob=ihob+1 - endif - if(ihob==nsig_up-1) then - w4(1)=w4(1)+w4(4); w4(2:4)=w4(1:3);w4(1)=zero - dw4(1)=dw4(1)+dw4(4); dw4(2:4)=dw4(1:3);dw4(1)=zero - ihob=ihob-1 - endif - ddnj(j)=dot_product(dw4,nrefges(ihob-1:ihob+2,i))!derivative (dN/dx)_j - ddnj(j)=max(zero,abs(ddnj(j))) - else - obs_check=.true. - if (obs_check) then ! only once per obs here - nobs_out=nobs_out+1 - d_ref_rad=ref_rad(nsig)-ref_rad(nsig-1) - do kk=1,20 - ref_rad_out(nsig_up+kk)=ref_rad(nsig_up)+ kk*d_ref_rad ! extended x_i - end do - do kk=1,nsig_up - ref_rad_out(kk)=ref_rad(kk) - enddo +! Accumulate diagnostic information + rdiagbuf( 5,i) = (data(igps,i)-dbend)/data(igps,i) ! incremental bending angle (x100 %) + + data(igps,i)=data(igps,i)-dbend !innovation vector + + if (alt <= gpstop) then ! go into qc checks + cgrossuse=cgross(ikx) + cermaxuse=cermax(ikx) + cerminuse=cermin(ikx) + if (alt > five) then + cgrossuse=cgrossuse*r400 + cermaxuse=cermaxuse*r400 + cerminuse=cerminuse*r100 endif - hob_s=ref_rad_s(j) - call grdcrd1(hob_s,ref_rad_out,nsig_up+20,1) - hob_s_top=max(hob_s,hob_s_top) - endif !obs in new grid - end do intloop - - if (obs_check) then ! reject observation - qcfail(i)=.true. - data(ier,i) = zero - ratio_errors(i) = zero - muse(i)=.false. - cycle loopoverobs1 - endif - -! bending angle (radians) - dbend=ds*ddnj(1)/ref_rad_s(1) - do j=2,grids_dim - ddbend=ds*ddnj(j)/ref_rad_s(j) - dbend=dbend+two*ddbend - end do - dbend=r1em6*tpdpres(i)*dbend - -! Accumulate diagnostic information - rdiagbuf( 5,i) = (data(igps,i)-dbend)/data(igps,i) ! incremental bending angle (x100 %) - - data(igps,i)=data(igps,i)-dbend !innovation vector - - if (alt <= gpstop) then ! go into qc checks - cgrossuse=cgross(ikx) - cermaxuse=cermax(ikx) - cerminuse=cermin(ikx) - if (alt > five) then - cgrossuse=cgrossuse*r400 - cermaxuse=cermaxuse*r400 - cerminuse=cerminuse*r100 - endif -! Gross error check - obserror = one/max(ratio_errors(i)*data(ier,i),tiny_r_kind) - obserrlm = max(cerminuse,min(cermaxuse,obserror)) - residual = abs(data(igps,i)) - ratio = residual/obserrlm - - if (ratio > cgrossuse) then - if (luse(i)) then - awork(4) = awork(4)+one - endif - qcfail_gross(i)=one - data(ier,i) = zero - ratio_errors(i) = zero - muse(i)=.false. - else -! Statistics QC check if obs passed gross error check - cutoff=zero - cutoff1=(-4.725_r_kind+0.045_r_kind*alt+0.005_r_kind*alt**2)*two/three - cutoff2=1.5_r_kind+one*cos(data(ilate,i)*deg2rad) - if(trefges<=r240) then - cutoff3=two - else - cutoff3=0.005_r_kind*trefges**2-2.3_r_kind*trefges+266_r_kind - endif - cutoff3=cutoff3*two/three - cutoff4=(four+eight*cos(data(ilate,i)*deg2rad))*two/three - cutoff12=((36_r_kind-alt)/two)*cutoff2+& - ((alt-34_r_kind)/two)*cutoff1 - cutoff23=((eleven-alt)/two)*cutoff3+& - ((alt-nine)/two)*cutoff2 - cutoff34=((six-alt)/two)*cutoff4+& - ((alt-four)/two)*cutoff3 - if(alt>36_r_kind) cutoff=cutoff1 - if((alt<=36_r_kind).and.(alt>34_r_kind)) cutoff=cutoff12 - if((alt<=34_r_kind).and.(alt>eleven)) cutoff=cutoff2 - if((alt<=eleven).and.(alt>nine)) cutoff=cutoff23 - if((alt<=nine).and.(alt>six)) cutoff=cutoff3 - if((alt<=six).and.(alt>four)) cutoff=cutoff34 - if(alt<=four) cutoff=cutoff4 - - cutoff=three*cutoff*r0_01 - - if(abs(rdiagbuf(5,i)) > cutoff) then - qcfail(i)=.true. - data(ier,i) = zero - ratio_errors(i) = zero - muse(i) = .false. - end if - end if ! gross qc check - end if ! qc checks (only below 50km) - -! Remove obs above 50 km - if(alt > gpstop) then - data(ier,i) = zero - ratio_errors(i) = zero - qcfail_high(i)=one - muse(i)=.false. - endif - -! Remove MetOP/GRAS data below 8 km - if( (alt <= eight) .and. & - ((data(isatid,i)==4).or.(data(isatid,i)==3).or.(data(isatid,i)==5))) then - qcfail(i)=.true. - data(ier,i) = zero - ratio_errors(i) = zero - muse(i)=.false. - endif +! Gross error check + obserror = one/max(ratio_errors(i)*data(ier,i),tiny_r_kind) + obserrlm = max(cerminuse,min(cermaxuse,obserror)) + residual = abs(data(igps,i)) + ratio = residual/obserrlm + + if (ratio > cgrossuse) then + if (luse(i)) then + awork(4) = awork(4)+one + endif + qcfail_gross(i)=one + data(ier,i) = zero + ratio_errors(i) = zero + muse(i)=.false. + else +! Statistics QC check if obs passed gross error check + cutoff=zero + if ((data(isatid,i) > 749).and.(data(isatid,i) < 756)) then + cutoff1=(-4.725_r_kind+0.045_r_kind*alt+0.005_r_kind*alt**2)*one/two + else + cutoff1=(-4.725_r_kind+0.045_r_kind*alt+0.005_r_kind*alt**2)*two/three + end if + cutoff2=1.5_r_kind+one*cos(data(ilate,i)*deg2rad) + if(trefges<=r240) then + cutoff3=two + else + cutoff3=0.005_r_kind*trefges**2-2.3_r_kind*trefges+266_r_kind + endif + if ((data(isatid,i) > 749).and.(data(isatid,i) < 756)) then + cutoff3=cutoff3*one/two + else + cutoff3=cutoff3*two/three + end if + if ((data(isatid,i) > 749).and.(data(isatid,i) < 756)) then + cutoff4=(four+eight*cos(data(ilate,i)*deg2rad))*one/two + else + cutoff4=(four+eight*cos(data(ilate,i)*deg2rad))*two/three + end if + cutoff12=((36_r_kind-alt)/two)*cutoff2+& + ((alt-34_r_kind)/two)*cutoff1 + cutoff23=((eleven-alt)/two)*cutoff3+& + ((alt-nine)/two)*cutoff2 + cutoff34=((six-alt)/two)*cutoff4+& + ((alt-four)/two)*cutoff3 + if(alt>36_r_kind) cutoff=cutoff1 + if((alt<=36_r_kind).and.(alt>34_r_kind)) cutoff=cutoff12 + if((alt<=34_r_kind).and.(alt>eleven)) cutoff=cutoff2 + if((alt<=eleven).and.(alt>nine)) cutoff=cutoff23 + if((alt<=nine).and.(alt>six)) cutoff=cutoff3 + if((alt<=six).and.(alt>four)) cutoff=cutoff34 + if(alt<=four) cutoff=cutoff4 + + if ((data(isatid,i) > 749).and.(data(isatid,i) < 756)) then + cutoff=two*cutoff*r0_01 + else + cutoff=three*cutoff*r0_01 + end if + + if(abs(rdiagbuf(5,i)) > cutoff) then + qcfail(i)=.true. + data(ier,i) = zero + ratio_errors(i) = zero + muse(i) = .false. + end if + end if ! gross qc check + end if ! qc checks (only below 50km) + +! Remove obs above 50 km + if(alt > gpstop) then + data(ier,i) = zero + ratio_errors(i) = zero + qcfail_high(i)=one + muse(i)=.false. + endif - end if ! obs above super-refraction and shadow layers +! Remove MetOP/GRAS data below 8 km + if( (alt <= eight) .and. & + ((data(isatid,i)==4).or.(data(isatid,i)==3).or.(data(isatid,i)==5))) then + qcfail(i)=.true. + data(ier,i) = zero + ratio_errors(i) = zero + muse(i)=.false. + endif + + end if ! obs above super-refraction and shadow layers end if ! obs inside the vertical grid end do loopoverobs1 ! end of loop over observations @@ -963,43 +1011,43 @@ subroutine setupbend(obsLL,odiagLL, & ! Fill obs diagnostics structure if (luse_obsdiag) then - call obsdiagNode_set(my_diag,wgtjo=(data(ier,i)*ratio_errors(i))**2, & + call obsdiagNode_set(my_diag,wgtjo=(data(ier,i)*ratio_errors(i))**2, & jiter=jiter,muse=muse(i),nldepart=data(igps,i) ) endif ! Load additional obs diagnostic structure ioff = mreal if (lobsdiagsave) then - associate(odiag => my_diag ) - do jj=1,miter - ioff=ioff+1 - if (odiag%muse(jj)) then - rdiagbuf(ioff,i) = one - else - rdiagbuf(ioff,i) = -one - endif - enddo - do jj=1,miter+1 - ioff=ioff+1 - rdiagbuf(ioff,i) = odiag%nldepart(jj) - enddo - do jj=1,miter - ioff=ioff+1 - rdiagbuf(ioff,i) = odiag%tldepart(jj) - enddo - do jj=1,miter - ioff=ioff+1 - rdiagbuf(ioff,i) = odiag%obssen(jj) - enddo - end associate ! odiag - endif + associate(odiag => my_diag ) + do jj=1,miter + ioff=ioff+1 + if (odiag%muse(jj)) then + rdiagbuf(ioff,i) = one + else + rdiagbuf(ioff,i) = -one + endif + enddo + do jj=1,miter+1 + ioff=ioff+1 + rdiagbuf(ioff,i) = odiag%nldepart(jj) + enddo + do jj=1,miter + ioff=ioff+1 + rdiagbuf(ioff,i) = odiag%tldepart(jj) + enddo + do jj=1,miter + ioff=ioff+1 + rdiagbuf(ioff,i) = odiag%obssen(jj) + enddo + end associate ! odiag + endif - ! if obs is not "acceptable" and jacobian is not computed, fill jacobian - ! with zeros - if (save_jacobian) then - dhx_dx%val = 0._r_kind - call writearray(dhx_dx, rdiagbuf(ioff+1:nreal,i)) - endif + ! if obs is not "acceptable" and jacobian is not computed, fill jacobian + ! with zeros + if (save_jacobian) then + dhx_dx%val = 0._r_kind + call writearray(dhx_dx, rdiagbuf(ioff+1:nreal,i)) + endif ! If obs is "acceptable", load array with obs info for use ! in inner loop minimization (int* and stp* routines) @@ -1132,9 +1180,27 @@ subroutine setupbend(obsLL,odiagLL, & my_head%jac_p(k)=my_head%jac_p(k)+dbenddxi(j)*dxidp(j,k)+ & dbenddn(j) * dndp(j,k) end do + + if ((abs(my_head%jac_t(k)) > 0.0016_r_kind).or.(abs(my_head%jac_q(k)) > 7.5_r_kind).or. & + (abs(my_head%jac_p(k)) > 0.004_r_kind)) then + qcfail_jac(i) = one + end if end do my_head%jac_p(nsig+1) = zero + + if (qcfail_jac(i) == one) then + do k=1,nsig + my_head%jac_t(k) = zero + my_head%jac_q(k) = zero + my_head%jac_p(k) = zero + end do + ratio_errors(i) = zero + data(ier,i) = zero + rdiagbuf(12,i) = -one + rdiagbuf(10,i) = six + end if + if (save_jacobian) then ! fill in the jacobian @@ -1167,6 +1233,10 @@ subroutine setupbend(obsLL,odiagLL, & do j=1,nreal gps_alltail(ibin)%head%rdiag(j)= rdiagbuf(j,i) end do + gps_alltail(ibin)%head%ratio_err= ratio_errors(i) + gps_alltail(ibin)%head%obserr = data(ier,i) + gps_alltail(ibin)%head%dataerr = data(ier,i)*data(igps,i) + gps_alltail(ibin)%head%muse = muse(i) ! logical endif ! (last_pass) end do ! i=1,nobs deallocate(ddnj,grid_s,ref_rad_s) @@ -1209,55 +1279,55 @@ subroutine init_vars_ varname='z' call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank2,istatus) if (istatus==0) then - if(allocated(ges_z))then - write(6,*) trim(myname), ': ', trim(varname), ' already incorrectly alloc ' - call stop2(999) - endif - allocate(ges_z(size(rank2,1),size(rank2,2),nfldsig)) - ges_z(:,:,1)=rank2 - do ifld=2,nfldsig - call gsi_bundlegetpointer(gsi_metguess_bundle(ifld),trim(varname),rank2,istatus) - ges_z(:,:,ifld)=rank2 - enddo + if(allocated(ges_z))then + write(6,*) trim(myname), ': ', trim(varname), ' already incorrectly alloc ' + call stop2(999) + endif + allocate(ges_z(size(rank2,1),size(rank2,2),nfldsig)) + ges_z(:,:,1)=rank2 + do ifld=2,nfldsig + call gsi_bundlegetpointer(gsi_metguess_bundle(ifld),trim(varname),rank2,istatus) + ges_z(:,:,ifld)=rank2 + enddo else - write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus - call stop2(999) + write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus + call stop2(999) endif ! get tv ... varname='tv' call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank3,istatus) if (istatus==0) then - if(allocated(ges_tv))then - write(6,*) trim(myname), ': ', trim(varname), ' already incorrectly alloc ' - call stop2(999) - endif - allocate(ges_tv(size(rank3,1),size(rank3,2),size(rank3,3),nfldsig)) - ges_tv(:,:,:,1)=rank3 - do ifld=2,nfldsig - call gsi_bundlegetpointer(gsi_metguess_bundle(ifld),trim(varname),rank3,istatus) - ges_tv(:,:,:,ifld)=rank3 - enddo + if(allocated(ges_tv))then + write(6,*) trim(myname), ': ', trim(varname), ' already incorrectly alloc ' + call stop2(999) + endif + allocate(ges_tv(size(rank3,1),size(rank3,2),size(rank3,3),nfldsig)) + ges_tv(:,:,:,1)=rank3 + do ifld=2,nfldsig + call gsi_bundlegetpointer(gsi_metguess_bundle(ifld),trim(varname),rank3,istatus) + ges_tv(:,:,:,ifld)=rank3 + enddo else - write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus - call stop2(999) + write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus + call stop2(999) endif ! get q ... varname='q' call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank3,istatus) if (istatus==0) then - if(allocated(ges_q))then - write(6,*) trim(myname), ': ', trim(varname), ' already incorrectly alloc ' - call stop2(999) - endif - allocate(ges_q(size(rank3,1),size(rank3,2),size(rank3,3),nfldsig)) - ges_q(:,:,:,1)=rank3 - do ifld=2,nfldsig - call gsi_bundlegetpointer(gsi_metguess_bundle(ifld),trim(varname),rank3,istatus) - ges_q(:,:,:,ifld)=rank3 - enddo + if(allocated(ges_q))then + write(6,*) trim(myname), ': ', trim(varname), ' already incorrectly alloc ' + call stop2(999) + endif + allocate(ges_q(size(rank3,1),size(rank3,2),size(rank3,3),nfldsig)) + ges_q(:,:,:,1)=rank3 + do ifld=2,nfldsig + call gsi_bundlegetpointer(gsi_metguess_bundle(ifld),trim(varname),rank3,istatus) + ges_q(:,:,:,ifld)=rank3 + enddo else - write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus - call stop2(999) + write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus + call stop2(999) endif else write(6,*) trim(myname), ': inconsistent vector sizes (nfldsig,size(metguess_bundle) ',& diff --git a/src/gsi/setuprw.f90 b/src/gsi/setuprw.f90 index 543e76771..7b00caea4 100644 --- a/src/gsi/setuprw.f90 +++ b/src/gsi/setuprw.f90 @@ -139,6 +139,7 @@ subroutine setuprw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa use gsi_metguess_mod, only : gsi_metguess_get,gsi_metguess_bundle use setupdbz_lib, only:hx_dart use sparsearr, only: sparr2, new, size, writearray, fullarray + implicit none ! Declare passed variables @@ -647,11 +648,20 @@ subroutine setuprw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa endif endif -! adjust obs error for TDR data - if(data(iobs_type,i) > three .and. ratio_errors*error > tiny_r_kind & +! adjust obs error for TDR data + if( ratio_errors*error > tiny_r_kind & .and. tdrerr_inflate) then - ratio_errors = data(ier2,i)/abs(data(ier,i) + 1.0e6_r_kind*rhgh + & - r8*rlow + min(max((abs(ddiff)-ten),zero)/ten,one)*data(ier,i)) + if(data(iobs_type,i) > three) then + ratio_errors = data(ier2,i)/abs(data(ier,i) + 1.0e6_r_kind*rhgh + & + r8*rlow + min(max((abs(ddiff)-ten),zero)/ten,one)*data(ier,i)) + end if +! apply same error adjustment for 88D data in HWRF with a 5 m/s +! minimum, which is also the same for TDR. This results in roughly +! 2.5 m/s RMS fit with 10-km thinning + if(data(iobs_type,i) <= three) then + ratio_errors = data(ier2,i)/(5.0_r_kind + abs( 1.0e6_r_kind*rhgh + & + r8*rlow + min(max((abs(ddiff)-ten),zero)/ten,one)*5.0_r_kind)) + end if end if ! Gross error checks diff --git a/src/gsi/setupspd.f90 b/src/gsi/setupspd.f90 index ff01bf5ac..1e740fdd2 100644 --- a/src/gsi/setupspd.f90 +++ b/src/gsi/setupspd.f90 @@ -141,7 +141,7 @@ subroutine setupspd(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diags ! apply only to the regional forecast models (e.g., HWRF); Henry ! R. Winterbottom (henry.winterbottom@noaa.gov). - use obsmod, only: uv_doe_a_292,uv_doe_b_292 + use obsmod, only: uv_doe_a_213,uv_doe_b_213 implicit none @@ -381,9 +381,9 @@ subroutine setupspd(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diags z_height = .false. ! if ( nty == 260 .or. nty == 261) z_height = .true. -! nty == 292 is temporarily assigned to SFMR retrieved wind speed from recon +! nty == 213 is temporarily assigned to SFMR retrieved wind speed from recon ! and is subjet to change in the future - if ( nty == 260 .or. nty == 261 .or. nty == 292) z_height = .true. + if ( nty == 260 .or. nty == 261 .or. nty == 213) z_height = .true. ! Process observations reported with height differently than those ! reported with pressure. Type 260=nacelle 261=tower wind spd are @@ -528,8 +528,8 @@ subroutine setupspd(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diags ddiff = spdob-spdges if (aircraft_recon) then - if ( nty == 292 ) then - ratio_errors=error/(uv_doe_a_292*abs(ddiff)+uv_doe_b_292) + if ( nty == 213 ) then + ratio_errors=error/(uv_doe_a_213*abs(ddiff)+uv_doe_b_213) if (spdob < 10._r_kind) ratio_errors=zero endif endif diff --git a/src/gsi/setupt.f90 b/src/gsi/setupt.f90 index 960b73897..f9a5de3b9 100644 --- a/src/gsi/setupt.f90 +++ b/src/gsi/setupt.f90 @@ -1620,6 +1620,7 @@ subroutine contents_netcdf_diag_(odiag) call nc_diag_metadata("Obs_Minus_Forecast_unadjusted", sngl(tob-tges) ) if (aircraft_t_bc_pof .or. aircraft_t_bc .or. aircraft_t_bc_ext) then call nc_diag_metadata("Data_Pof", sngl(data(ipof,i)) ) + call nc_diag_metadata("Data_Vertical_Velocity", sngl(data(ivvlc,i)) ) if (npredt .gt. one) then call nc_diag_data2d("Bias_Correction_Terms", sngl(predbias) ) else if (npredt .eq. one) then @@ -1627,6 +1628,7 @@ subroutine contents_netcdf_diag_(odiag) endif else call nc_diag_metadata("Data_Pof", missing ) + call nc_diag_metadata("Data_Vertical_Velocity", missing ) if (npredt .gt. one) then do j=1,npredt predbias(j) = missing diff --git a/src/gsi/tcv_mod.f90 b/src/gsi/tcv_mod.f90 index dfec6e05b..ab3e8c637 100644 --- a/src/gsi/tcv_mod.f90 +++ b/src/gsi/tcv_mod.f90 @@ -148,7 +148,7 @@ subroutine get_storminfo(lunin) iret = 0 return else - write(6,*)'GET_STORMINFO: ***ERROR*** num storms to be processed <= 0' + write(6,*)'GET_STORMINFO: ***WARNING*** num storms to be processed <= 0' write(6,*)'GET_STORMINFO: Check file assigned to unit lucard=',lucard iret = 99 return @@ -255,7 +255,7 @@ subroutine read_tcv_card(nums,storm,lucard,stswitch,slonfg,slatfg,centerid,stid, iret = 0 return else - write(6,*)'READ_TCV_CARD: ***ERROR*** num storms to be processed <=0 ' + write(6,*)'READ_TCV_CARD: ***WARNING*** num storms to be processed <=0 ' write(6,*)'READ_TCV_CARD: Check file assigned to unit lucard=',lucard iret = 99 return diff --git a/src/ncdiag/CMakeLists.txt b/src/ncdiag/CMakeLists.txt index a3166d7b0..117ebff84 100644 --- a/src/ncdiag/CMakeLists.txt +++ b/src/ncdiag/CMakeLists.txt @@ -16,11 +16,11 @@ if(BUILD_NCDIAG) LIST(REMOVE_ITEM NCDIAG_SRC ${CMAKE_CURRENT_SOURCE_DIR}/nc_diag_cat.F90 ) add_library(ncdiag STATIC ${NCDIAG_SRC}) add_executable(test_nc_unlimdims.x ${CMAKE_CURRENT_SOURCE_DIR}/test_nc_unlimdims.F90 ) - add_executable(nc_diag_cat.x ${CMAKE_CURRENT_SOURCE_DIR}/nc_diag_cat.F90 ) - target_link_libraries(nc_diag_cat.x ncdiag ${NETCDF_LIBRARIES} ${HDF5_HL_LIBRARIES} ${HDF5_LIBRARIES} ${ZLIB_LIBRARIES} ${MPI_Fortran_LIBRARIES}) + add_executable(ncdiag_cat_mpi.x ${CMAKE_CURRENT_SOURCE_DIR}/nc_diag_cat.F90 ) + target_link_libraries(ncdiag_cat_mpi.x ncdiag ${NETCDF_LIBRARIES} ${HDF5_HL_LIBRARIES} ${HDF5_LIBRARIES} ${ZLIB_LIBRARIES} ${MPI_Fortran_LIBRARIES}) target_link_libraries(test_nc_unlimdims.x ncdiag ${NETCDF_LIBRARIES} ${HDF5_HL_LIBRARIES} ${HDF5_LIBRARIES} ${ZLIB_LIBRARIES} ${MPI_Fortran_LIBRARIES}) # set_target_properties(test_nc_unlimdims.x PROPERTIES Fortran_MODULE_DIRECTORY ${NCDIAG_INCS} ) -# set_target_properties(nc_diag_cat.x PROPERTIES Fortran_MODULE_DIRECTORY ${NCDIAG_INCS} ${MPI_Fortran_INCLUDE_PATH}) +# set_target_properties(ncdiag_cat_mpi.x PROPERTIES Fortran_MODULE_DIRECTORY ${NCDIAG_INCS} ${MPI_Fortran_INCLUDE_PATH}) endif(BUILD_NCDIAG) diff --git a/src/ncdiag/ncdw_chaninfo.F90 b/src/ncdiag/ncdw_chaninfo.F90 index ec28f1d65..843a23162 100644 --- a/src/ncdiag/ncdw_chaninfo.F90 +++ b/src/ncdiag/ncdw_chaninfo.F90 @@ -706,7 +706,7 @@ subroutine nc_diag_chaninfo_load_def call nclayer_error("NetCDF4 type invalid!") end if - print *, trim(tmp_var_name), "rel index", rel_index +! print *, trim(tmp_var_name), "rel index", rel_index ! Now add a relative position... based on the next position! diff --git a/src/ncdiag/ncdw_data2d.F90 b/src/ncdiag/ncdw_data2d.F90 index 80aea4318..8e5efc458 100644 --- a/src/ncdiag/ncdw_data2d.F90 +++ b/src/ncdiag/ncdw_data2d.F90 @@ -365,7 +365,7 @@ subroutine nc_diag_data2d_load_def diag_data2d_store%max_lens(diag_data2d_store%total) = tmp_var_dim_sizes(1) end if - print *, trim(tmp_var_name), "rel index", rel_index +! print *, trim(tmp_var_name), "rel index", rel_index ! Now add a relative position... based on the next position! diff --git a/src/ncdiag/serial/CMakeLists.txt b/src/ncdiag/serial/CMakeLists.txt index 4cf5f386c..3c453abff 100644 --- a/src/ncdiag/serial/CMakeLists.txt +++ b/src/ncdiag/serial/CMakeLists.txt @@ -19,10 +19,10 @@ if(BUILD_NCDIAG) LIST(REMOVE_ITEM NCDIAG_SRC ${CMAKE_CURRENT_SOURCE_DIR}/nc_diag_cat.F90 ) add_library(ncdiag_serial STATIC ${NCDIAG_SRC}) set_target_properties( ncdiag_serial PROPERTIES Fortran_MODULE_DIRECTORY ${NCDIAG_SERIAL_MODULE_DIR} ) - add_executable(nc_diag_cat_serial.x ${CMAKE_CURRENT_SOURCE_DIR}/../nc_diag_cat.F90 ) - set_target_properties( nc_diag_cat_serial.x PROPERTIES COMPILE_FLAGS ${NCDIAG_Fortran_FLAGS} ) - set_target_properties( nc_diag_cat_serial.x PROPERTIES Fortran_MODULE_DIRECTORY ${NCDIAG_SERIAL_MODULE_DIR} ) - target_link_libraries(nc_diag_cat_serial.x ncdiag_serial ${NETCDF_LIBRARIES} ${HDF5_HL_LIBRARIES} ${HDF5_LIBRARIES} ${ZLIB_LIBRARIES} ${MPI_Fortran_LIBRARIES} ) + add_executable(ncdiag_cat.x ${CMAKE_CURRENT_SOURCE_DIR}/../nc_diag_cat.F90 ) + set_target_properties( ncdiag_cat.x PROPERTIES COMPILE_FLAGS ${NCDIAG_Fortran_FLAGS} ) + set_target_properties( ncdiag_cat.x PROPERTIES Fortran_MODULE_DIRECTORY ${NCDIAG_SERIAL_MODULE_DIR} ) + target_link_libraries(ncdiag_cat.x ncdiag_serial ${NETCDF_LIBRARIES} ${HDF5_HL_LIBRARIES} ${HDF5_LIBRARIES} ${ZLIB_LIBRARIES} ${MPI_Fortran_LIBRARIES} ) endif(BUILD_NCDIAG_SERIAL) endif( NOT USE_BASELIBS ) endif(BUILD_NCDIAG) diff --git a/ush/EnKF/drive_gfs b/ush/EnKF/drive_gfs index beb25ae25..27c934727 100755 --- a/ush/EnKF/drive_gfs +++ b/ush/EnKF/drive_gfs @@ -35,7 +35,7 @@ export NET=$RUN # SENDCOM - Copy Files From TMPDIR to $DATOUT # SENDDBN - Issue DBNet Client Calls # RERUN - Rerun fcst from beginning (default no) -# VERBOSE - Specify Verbose Output in exglobal_fcst.sh.sms +# VERBOSE - Specify Verbose Output in exglobal_fcst.sh #################################### export SENDSMS=YES export SENDCOM=YES diff --git a/ush/EnKF/drive_gsi b/ush/EnKF/drive_gsi index 8b83434c1..ade5ccff6 100755 --- a/ush/EnKF/drive_gsi +++ b/ush/EnKF/drive_gsi @@ -56,7 +56,7 @@ export pgmerr=$logdir/errfile # SENDSMS - Flag Events on SMS # SENDCOM - Copy Files From TMPDIR to $COMOUT # SENDDBN - Issue DBNet Client Calls -# VERBOSE - Specify Verbose Output in exglobal_fcst.sh.sms +# VERBOSE - Specify Verbose Output in exglobal_fcst.sh #################################### export SENDSMS=YES export SENDCOM=YES @@ -325,7 +325,7 @@ sh ${homedir}/run_gsi #poe rm /tmp/mplog* ########## -# NOTES: 1) script exglobal_analysis.sh.sms compresses the contents of +# NOTES: 1) script exglobal_analysis.sh compresses the contents of # RADSTAT, PCPSTAT, OZNSTAT, and CNVSTAT. These stat files # files are tarballs of compressed files. # 2) SFCANL, SIGANL are input to the GFS forecast following the analysis diff --git a/ush/build_all_cmake.sh b/ush/build_all_cmake.sh index a50ec1bb0..ceaf91d9c 100755 --- a/ush/build_all_cmake.sh +++ b/ush/build_all_cmake.sh @@ -80,7 +80,7 @@ else fi if [ $build_type = PRODUCTION -o $build_type = DEBUG ] ; then - cmake -DBUILD_UTIL=ON -DMPI3FLAG=-DMPI3 -DMPI3=ON -DBUILD_NCDIAG_SERIAL=ON -DCMAKE_BUILD_TYPE=$build_type -DBUILD_CORELIBS=OFF .. + cmake -DBUILD_UTIL=ON -DBUILD_NCDIAG_SERIAL=ON -DCMAKE_BUILD_TYPE=$build_type -DBUILD_CORELIBS=OFF .. else cmake .. fi diff --git a/ush/calcanl_gfs.py b/ush/calcanl_gfs.py index 2dac8928e..79c29efda 100755 --- a/ush/calcanl_gfs.py +++ b/ush/calcanl_gfs.py @@ -12,367 +12,340 @@ from collections import OrderedDict import datetime + # function to calculate analysis from a given increment file and background -def calcanl_gfs(DoIAU, l4DEnsVar, Write4Danl, ComOut, APrefix, ASuffix, - FixDir, atmges_ens_mean, RunDir, NThreads, NEMSGet, IAUHrs, - ExecCMD, ExecCMDMPI, ExecAnl, ExecChgresGes, ExecChgresInc, Cdump): - print('calcanl_gfs beginning at: ',datetime.datetime.utcnow()) +def calcanl_gfs(DoIAU, l4DEnsVar, Write4Danl, ComOut, APrefix, ASuffix, + ComIn_Ges, GPrefix, GSuffix, + FixDir, atmges_ens_mean, RunDir, NThreads, NEMSGet, IAUHrs, + ExecCMD, ExecCMDMPI, ExecAnl, ExecChgresInc, Cdump): + print('calcanl_gfs beginning at: ',datetime.datetime.utcnow()) - IAUHH = IAUHrs - if Cdump == "gfs": - IAUHH = list(map(int,'6')) - else: IAUHH = IAUHrs - - ######## copy and link files - if DoIAU and l4DEnsVar and Write4Danl: - for fh in IAUHH: - if fh == 6: + if Cdump == "gfs": + IAUHH = list(map(int,'6')) + else: + IAUHH = IAUHrs + + ######## copy and link files + if DoIAU and l4DEnsVar and Write4Danl: + for fh in IAUHH: + if fh == 6: + # for full res analysis + CalcAnlDir = RunDir+'/calcanl_'+format(fh, '02') + if not os.path.exists(CalcAnlDir): + gsi_utils.make_dir(CalcAnlDir) + gsi_utils.copy_file(ExecAnl, CalcAnlDir+'/calc_anl.x') + gsi_utils.link_file(RunDir+'/siginc.nc', CalcAnlDir+'/siginc.nc.06') + gsi_utils.link_file(RunDir+'/sigf06', CalcAnlDir+'/ges.06') + gsi_utils.link_file(RunDir+'/siganl', CalcAnlDir+'/anl.06') + gsi_utils.copy_file(ExecChgresInc, CalcAnlDir+'/chgres_inc.x') + # for ensemble res analysis + if Cdump == "gdas": + CalcAnlDir = RunDir+'/calcanl_ensres_'+format(fh, '02') + if not os.path.exists(CalcAnlDir): + gsi_utils.make_dir(CalcAnlDir) + gsi_utils.copy_file(ExecAnl, CalcAnlDir+'/calc_anl.x') + gsi_utils.link_file(RunDir+'/siginc.nc', CalcAnlDir+'/siginc.nc.06') + gsi_utils.link_file(ComOut+'/'+APrefix+'atmanl.ensres'+ASuffix, CalcAnlDir+'/anl.ensres.06') + gsi_utils.link_file(ComIn_Ges+'/'+GPrefix+'atmf006.ensres'+GSuffix, CalcAnlDir+'/ges.ensres.06') + gsi_utils.link_file(RunDir+'/sigf06', CalcAnlDir+'/ges.06') + else: + if os.path.isfile('sigi'+format(fh, '02')+'.nc'): + # for full res analysis + CalcAnlDir = RunDir+'/calcanl_'+format(fh, '02') + CalcAnlDir6 = RunDir+'/calcanl_'+format(6, '02') + if not os.path.exists(CalcAnlDir): + gsi_utils.make_dir(CalcAnlDir) + if not os.path.exists(CalcAnlDir6): + gsi_utils.make_dir(CalcAnlDir6) + gsi_utils.link_file(ComOut+'/'+APrefix+'atma'+format(fh, '03')+ASuffix, + CalcAnlDir6+'/anl.'+format(fh, '02')) + gsi_utils.link_file(RunDir+'/siga'+format(fh, '02'), + CalcAnlDir6+'/anl.'+format(fh, '02')) + gsi_utils.link_file(RunDir+'/sigi'+format(fh, '02')+'.nc', + CalcAnlDir+'/siginc.nc.'+format(fh, '02')) + gsi_utils.link_file(CalcAnlDir6+'/inc.fullres.'+format(fh, '02'), + CalcAnlDir+'/inc.fullres.'+format(fh, '02')) + gsi_utils.link_file(RunDir+'/sigf'+format(fh, '02'), + CalcAnlDir6+'/ges.'+format(fh, '02')) + gsi_utils.link_file(RunDir+'/sigf'+format(fh, '02'), + CalcAnlDir+'/ges.'+format(fh, '02')) + gsi_utils.copy_file(ExecChgresInc, CalcAnlDir+'/chgres_inc.x') + # for ensemble res analysis + CalcAnlDir = RunDir+'/calcanl_ensres_'+format(fh, '02') + CalcAnlDir6 = RunDir+'/calcanl_ensres_'+format(6, '02') + if not os.path.exists(CalcAnlDir): + gsi_utils.make_dir(CalcAnlDir) + if not os.path.exists(CalcAnlDir6): + gsi_utils.make_dir(CalcAnlDir6) + gsi_utils.link_file(ComOut+'/'+APrefix+'atma'+format(fh, '03')+'.ensres'+ASuffix, + CalcAnlDir6+'/anl.ensres.'+format(fh, '02')) + gsi_utils.link_file(RunDir+'/sigi'+format(fh, '02')+'.nc', + CalcAnlDir6+'/siginc.nc.'+format(fh, '02')) + gsi_utils.link_file(ComIn_Ges+'/'+GPrefix+'atmf'+format(fh, '03')+'.ensres'+GSuffix, + CalcAnlDir6+'/ges.ensres.'+format(fh, '02')) + + + else: # for full res analysis - CalcAnlDir = RunDir+'/calcanl_'+format(fh, '02') + CalcAnlDir = RunDir+'/calcanl_'+format(6, '02') if not os.path.exists(CalcAnlDir): - os.makedirs(CalcAnlDir) - shutil.copy(ExecAnl, CalcAnlDir+'/calc_anl.x') + gsi_utils.make_dir(CalcAnlDir) + gsi_utils.copy_file(ExecAnl, CalcAnlDir+'/calc_anl.x') gsi_utils.link_file(RunDir+'/siginc.nc', CalcAnlDir+'/siginc.nc.06') gsi_utils.link_file(RunDir+'/sigf06', CalcAnlDir+'/ges.06') gsi_utils.link_file(RunDir+'/siganl', CalcAnlDir+'/anl.06') - shutil.copy(ExecChgresInc, CalcAnlDir+'/chgres_inc.x') + gsi_utils.copy_file(ExecChgresInc, CalcAnlDir+'/chgres_inc.x') # for ensemble res analysis - CalcAnlDir = RunDir+'/calcanl_ensres_'+format(fh, '02') + CalcAnlDir = RunDir+'/calcanl_ensres_'+format(6, '02') if not os.path.exists(CalcAnlDir): - os.makedirs(CalcAnlDir) - shutil.copy(ExecAnl, CalcAnlDir+'/calc_anl.x') + gsi_utils.make_dir(CalcAnlDir) + gsi_utils.copy_file(ExecAnl, CalcAnlDir+'/calc_anl.x') gsi_utils.link_file(RunDir+'/siginc.nc', CalcAnlDir+'/siginc.nc.06') gsi_utils.link_file(ComOut+'/'+APrefix+'atmanl.ensres'+ASuffix, CalcAnlDir+'/anl.ensres.06') - gsi_utils.link_file(RunDir+'/sigf06', CalcAnlDir+'/ges.06') - shutil.copy(ExecChgresGes, CalcAnlDir+'/chgres_ges.x') - - else: - if os.path.isfile('sigi'+format(fh, '02')+'.nc'): - # for full res analysis - CalcAnlDir = RunDir+'/calcanl_'+format(fh, '02') - CalcAnlDir6 = RunDir+'/calcanl_'+format(6, '02') - if not os.path.exists(CalcAnlDir): - os.makedirs(CalcAnlDir) - if not os.path.exists(CalcAnlDir6): - os.makedirs(CalcAnlDir6) - gsi_utils.link_file(ComOut+'/'+APrefix+'atma'+format(fh, '03')+ASuffix, CalcAnlDir6+'/anl.'+format(fh, '02')) - gsi_utils.link_file(RunDir+'/siga'+format(fh, '02'), CalcAnlDir6+'/anl.'+format(fh, '02')) - gsi_utils.link_file(RunDir+'/sigi'+format(fh, '02')+'.nc', CalcAnlDir+'/siginc.nc.'+format(fh, '02')) - gsi_utils.link_file(CalcAnlDir6+'/inc.fullres.'+format(fh, '02'),CalcAnlDir+'/inc.fullres.'+format(fh, '02')) - gsi_utils.link_file(RunDir+'/sigf'+format(fh, '02'), CalcAnlDir6+'/ges.'+format(fh, '02')) - shutil.copy(ExecChgresInc, CalcAnlDir+'/chgres_inc.x') - # for ensemble res analysis - CalcAnlDir = RunDir+'/calcanl_ensres_'+format(fh, '02') - CalcAnlDir6 = RunDir+'/calcanl_ensres_'+format(6, '02') - if not os.path.exists(CalcAnlDir): - os.makedirs(CalcAnlDir) - if not os.path.exists(CalcAnlDir6): - os.makedirs(CalcAnlDir6) - gsi_utils.link_file(ComOut+'/'+APrefix+'atma'+format(fh, '03')+'.ensres'+ASuffix, CalcAnlDir6+'/anl.ensres.'+format(fh, '02')) - gsi_utils.link_file(RunDir+'/sigi'+format(fh, '02')+'.nc', CalcAnlDir6+'/siginc.nc.'+format(fh, '02')) - gsi_utils.link_file(RunDir+'/sigf'+format(fh, '02'), CalcAnlDir+'/ges.'+format(fh, '02')) - gsi_utils.link_file(CalcAnlDir6+'/ges.ensres.'+format(fh, '02'),CalcAnlDir+'/ges.ensres.'+format(fh, '02')) - shutil.copy(ExecChgresGes, CalcAnlDir+'/chgres_ges.x') - - - else: - # for full res analysis - CalcAnlDir = RunDir+'/calcanl_'+format(6, '02') - if not os.path.exists(CalcAnlDir): - os.makedirs(CalcAnlDir) - shutil.copy(ExecAnl, CalcAnlDir+'/calc_anl.x') - gsi_utils.link_file(RunDir+'/siginc.nc', CalcAnlDir+'/siginc.nc.06') - gsi_utils.link_file(RunDir+'/sigf06', CalcAnlDir+'/ges.06') - gsi_utils.link_file(RunDir+'/siganl', CalcAnlDir+'/anl.06') - shutil.copy(ExecChgresInc, CalcAnlDir+'/chgres_inc.x') - # for ensemble res analysis - CalcAnlDir = RunDir+'/calcanl_ensres_'+format(6, '02') - if not os.path.exists(CalcAnlDir): - os.makedirs(CalcAnlDir) - shutil.copy(ExecAnl, CalcAnlDir+'/calc_anl.x') - gsi_utils.link_file(RunDir+'/siginc.nc', CalcAnlDir+'/siginc.nc.06') - gsi_utils.link_file(ComOut+'/'+APrefix+'atmanl.ensres'+ASuffix, CalcAnlDir+'/anl.ensres.06') - gsi_utils.link_file(RunDir+'/sigf06', CalcAnlDir+'/ges.06') - shutil.copy(ExecChgresGes, CalcAnlDir+'/chgres_ges.x') + gsi_utils.link_file(ComIn_Ges+'/'+GPrefix+'atmf006.ensres'+GSuffix, CalcAnlDir+'/ges.ensres.06') - # determine if the analysis is to be written in netCDF or NEMSIO - if ASuffix == ".nc": - nemsanl = ".false." - else: - nemsanl = ".true." + ######## get dimension information from background and increment files + AnlDims = gsi_utils.get_ncdims('siginc.nc') + if ASuffix == ".nc": + GesDims = gsi_utils.get_ncdims('sigf06') + else: + GesDims = gsi_utils.get_nemsdims('sigf06',NEMSGet) - ######## get dimension information from background and increment files - AnlDims = gsi_utils.get_ncdims('siginc.nc') - if ASuffix == ".nc": - GesDims = gsi_utils.get_ncdims('sigf06') - else: - GesDims = gsi_utils.get_nemsdims('sigf06',NEMSGet) + levs = AnlDims['lev'] + LonA = AnlDims['lon'] + LatA = AnlDims['lat'] + LonB = GesDims['grid_xt'] + LatB = GesDims['grid_yt'] - levs = AnlDims['lev'] - LonA = AnlDims['lon'] - LatA = AnlDims['lat'] - LonB = GesDims['grid_xt'] - LatB = GesDims['grid_yt'] + # vertical coordinate info + levs2 = levs + 1 + siglevel = FixDir+'/global_hyblev.l'+str(levs2)+'.txt' - # vertical coordinate info - levs2 = levs + 1 - siglevel = FixDir+'/global_hyblev.l'+str(levs2)+'.txt' + ####### determine how many forecast hours to process + nFH=0 + for fh in IAUHH: + # first check to see if increment file exists + CalcAnlDir = RunDir+'/calcanl_'+format(fh, '02') + if (os.path.isfile(CalcAnlDir+'/siginc.nc.'+format(fh, '02'))): + print('will process increment file: '+CalcAnlDir+'/siginc.nc.'+format(fh, '02')) + nFH+=1 + else: + print('Increment file: '+CalcAnlDir+'/siginc.nc.'+format(fh, '02')+' does not exist. Skipping.') - ####### determine how many forecast hours to process - nFH=0 - for fh in IAUHH: - # first check to see if increment file exists - CalcAnlDir = RunDir+'/calcanl_'+format(fh, '02') - if (os.path.isfile(CalcAnlDir+'/siginc.nc.'+format(fh, '02'))): - print('will process increment file: '+CalcAnlDir+'/siginc.nc.'+format(fh, '02')) - nFH+=1 - else: - print('Increment file: '+CalcAnlDir+'/siginc.nc.'+format(fh, '02')+' does not exist. Skipping.') - - sys.stdout.flush() - ######## need to gather information about runtime environment - ExecCMD = ExecCMD.replace("$ncmd","1") - os.environ['OMP_NUM_THREADS'] = str(NThreads) - os.environ['ncmd'] = str(nFH) - ExecCMDMPI1 = ExecCMDMPI.replace("$ncmd",str(1)) - ExecCMDMPI = ExecCMDMPI.replace("$ncmd",str(nFH)) - ExecCMDLevs = ExecCMDMPI.replace("$ncmd",str(levs)) - ExecCMDMPI10 = ExecCMDMPI.replace("$ncmd",str(10)) + sys.stdout.flush() + ######## need to gather information about runtime environment + ExecCMD = ExecCMD.replace("$ncmd","1") + os.environ['OMP_NUM_THREADS'] = str(NThreads) + os.environ['ncmd'] = str(nFH) + ExecCMDMPI1 = ExecCMDMPI.replace("$ncmd",str(1)) + ExecCMDMPI = ExecCMDMPI.replace("$ncmd",str(nFH)) + ExecCMDLevs = ExecCMDMPI.replace("$ncmd",str(levs)) + ExecCMDMPI10 = ExecCMDMPI.replace("$ncmd",str(10)) - # are we using mpirun with lsf, srun, or aprun with Cray? - launcher = ExecCMDMPI.split(' ')[0] - if launcher == 'mpirun': - hostfile = os.getenv('LSB_DJOB_HOSTFILE','') - with open(hostfile) as f: - hosts_tmp = f.readlines() - hosts_tmp = [x.strip() for x in hosts_tmp] - hosts = [] - [hosts.append(x) for x in hosts_tmp if x not in hosts] - nhosts = len(hosts) - ExecCMDMPI_host = 'mpirun -np '+str(nFH)+' --hostfile hosts' - tasks = int(os.getenv('LSB_DJOB_NUMPROC',1)) - if levs > tasks: - ExecCMDMPILevs_host = 'mpirun -np '+str(tasks)+' --hostfile hosts' - ExecCMDMPILevs_nohost = 'mpirun -np '+str(tasks) - else: - ExecCMDMPILevs_host = 'mpirun -np '+str(levs)+' --hostfile hosts' - ExecCMDMPILevs_nohost = 'mpirun -np '+str(levs) - ExecCMDMPI1_host = 'mpirun -np 1 --hostfile hosts' - ExecCMDMPI10_host = 'mpirun -np 10 --hostfile hosts' - elif launcher == 'srun': - nodes = os.getenv('SLURM_JOB_NODELIST','') - hosts_tmp = subprocess.check_output('scontrol show hostnames '+nodes, shell=True) - if (sys.version_info > (3, 0)): - hosts_tmp = hosts_tmp.decode('utf-8') - hosts_tmp = str(hosts_tmp).splitlines() + # are we using mpirun with lsf, srun, or aprun with Cray? + launcher = ExecCMDMPI.split(' ')[0] + if launcher == 'mpirun': + hostfile = os.getenv('LSB_DJOB_HOSTFILE','') + with open(hostfile) as f: + hosts_tmp = f.readlines() hosts_tmp = [x.strip() for x in hosts_tmp] - else: - hosts_tmp = hosts_tmp.strip() - hosts_tmp = str(hosts_tmp).splitlines() + hosts = [] + [hosts.append(x) for x in hosts_tmp if x not in hosts] + nhosts = len(hosts) + ExecCMDMPI_host = 'mpirun -np '+str(nFH)+' --hostfile hosts' + tasks = int(os.getenv('LSB_DJOB_NUMPROC',1)) + if levs > tasks: + ExecCMDMPILevs_host = 'mpirun -np '+str(tasks)+' --hostfile hosts' + ExecCMDMPILevs_nohost = 'mpirun -np '+str(tasks) + else: + ExecCMDMPILevs_host = 'mpirun -np '+str(levs)+' --hostfile hosts' + ExecCMDMPILevs_nohost = 'mpirun -np '+str(levs) + ExecCMDMPI1_host = 'mpirun -np 1 --hostfile hosts' + ExecCMDMPI10_host = 'mpirun -np 10 --hostfile hosts' + elif launcher == 'srun': + nodes = os.getenv('SLURM_JOB_NODELIST','') + hosts_tmp = subprocess.check_output('scontrol show hostnames '+nodes, shell=True) + if (sys.version_info > (3, 0)): + hosts_tmp = hosts_tmp.decode('utf-8') + hosts_tmp = str(hosts_tmp).splitlines() + hosts_tmp = [x.strip() for x in hosts_tmp] + else: + hosts_tmp = hosts_tmp.strip() + hosts_tmp = str(hosts_tmp).splitlines() + hosts_tmp = [x.strip() for x in hosts_tmp] + hosts = [] + [hosts.append(x) for x in hosts_tmp if x not in hosts] + nhosts = len(hosts) + ExecCMDMPI_host = 'srun -n '+str(nFH)+' --verbose --export=ALL -c 1 --distribution=arbitrary --cpu-bind=cores' + # need to account for when fewer than LEVS tasks are available + tasks = int(os.getenv('SLURM_NPROCS',1)) + if levs > tasks: + ExecCMDMPILevs_host = 'srun -n '+str(tasks)+' --verbose --export=ALL -c 1 --distribution=arbitrary --cpu-bind=cores' + ExecCMDMPILevs_nohost = 'srun -n '+str(tasks)+' --verbose --export=ALL' + else: + ExecCMDMPILevs_host = 'srun -n '+str(levs)+' --verbose --export=ALL -c 1 --distribution=arbitrary --cpu-bind=cores' + ExecCMDMPILevs_nohost = 'srun -n '+str(levs)+' --verbose --export=ALL' + ExecCMDMPI1_host = 'srun -n 1 --verbose --export=ALL -c 1 --distribution=arbitrary --cpu-bind=cores' + ExecCMDMPI10_host = 'srun -n 10 --verbose --export=ALL -c 1 --distribution=arbitrary --cpu-bind=cores' + elif launcher == 'aprun': + hostfile = os.getenv('LSB_DJOB_HOSTFILE','') + with open(hostfile) as f: + hosts_tmp = f.readlines() hosts_tmp = [x.strip() for x in hosts_tmp] - hosts = [] - [hosts.append(x) for x in hosts_tmp if x not in hosts] - nhosts = len(hosts) - ExecCMDMPI_host = 'srun -n '+str(nFH)+' --verbose --export=ALL -c 1 --distribution=arbitrary --cpu-bind=cores' - # need to account for when fewer than LEVS tasks are available - tasks = int(os.getenv('SLURM_NPROCS',1)) - if levs > tasks: - ExecCMDMPILevs_host = 'srun -n '+str(tasks)+' --verbose --export=ALL -c 1 --distribution=arbitrary --cpu-bind=cores' - ExecCMDMPILevs_nohost = 'srun -n '+str(tasks)+' --verbose --export=ALL' + hosts = [] + [hosts.append(x) for x in hosts_tmp if x not in hosts] + nhosts = len(hosts) + ExecCMDMPI_host = 'aprun -l hosts -d '+str(NThreads)+' -n '+str(nFH) + ExecCMDMPILevs_host = 'aprun -l hosts -d '+str(NThreads)+' -n '+str(levs) + ExecCMDMPILevs_nohost = 'aprun -d '+str(NThreads)+' -n '+str(levs) + ExecCMDMPI1_host = 'aprun -l hosts -d '+str(NThreads)+' -n 1' + ExecCMDMPI10_host = 'aprun -l hosts -d '+str(NThreads)+' -n 10' else: - ExecCMDMPILevs_host = 'srun -n '+str(levs)+' --verbose --export=ALL -c 1 --distribution=arbitrary --cpu-bind=cores' - ExecCMDMPILevs_nohost = 'srun -n '+str(levs)+' --verbose --export=ALL' - ExecCMDMPI1_host = 'srun -n 1 --verbose --export=ALL -c 1 --distribution=arbitrary --cpu-bind=cores' - ExecCMDMPI10_host = 'srun -n 10 --verbose --export=ALL -c 1 --distribution=arbitrary --cpu-bind=cores' - elif launcher == 'aprun': - hostfile = os.getenv('LSB_DJOB_HOSTFILE','') - with open(hostfile) as f: - hosts_tmp = f.readlines() - hosts_tmp = [x.strip() for x in hosts_tmp] - hosts = [] - [hosts.append(x) for x in hosts_tmp if x not in hosts] - nhosts = len(hosts) - ExecCMDMPI_host = 'aprun -l hosts -d '+str(NThreads)+' -n '+str(nFH) - ExecCMDMPILevs_host = 'aprun -l hosts -d '+str(NThreads)+' -n '+str(levs) - ExecCMDMPILevs_nohost = 'aprun -d '+str(NThreads)+' -n '+str(levs) - ExecCMDMPI1_host = 'aprun -l hosts -d '+str(NThreads)+' -n 1' - ExecCMDMPI10_host = 'aprun -l hosts -d '+str(NThreads)+' -n 10' - else: - print('unknown MPI launcher. Failure.') - sys.exit(1) - - ####### generate the full resolution analysis - interp_jobs = [] - ihost = 0 - ### interpolate increment to full background resolution - for fh in IAUHH: - # first check to see if increment file exists - CalcAnlDir = RunDir+'/calcanl_'+format(fh, '02') - if (os.path.isfile(CalcAnlDir+'/siginc.nc.'+format(fh, '02'))): - # set up the namelist - namelist = OrderedDict() - namelist["setup"] = {"lon_out": LonB, - "lat_out": LatB, - "lev": levs, - "infile": "'siginc.nc."+format(fh, '02')+"'", - "outfile": "'inc.fullres."+format(fh, '02')+"'", - } - gsi_utils.write_nml(namelist, CalcAnlDir+'/fort.43') - - if ihost >= nhosts: - ihost = 0 - with open(CalcAnlDir+'/hosts', 'w') as hostfile: - hostfile.write(hosts[ihost]+'\n') - if launcher == 'srun': # need to write host per task not per node for slurm - for a in range(0,9): # need 9 more of the same host for the 10 tasks for chgres_inc - hostfile.write(hosts[ihost]+'\n') - if launcher == 'srun': - os.environ['SLURM_HOSTFILE'] = CalcAnlDir+'/hosts' - print('interp_inc', fh, namelist) - job = subprocess.Popen(ExecCMDMPI10_host+' '+CalcAnlDir+'/chgres_inc.x', shell=True, cwd=CalcAnlDir) - interp_jobs.append(job) - print(ExecCMDMPI10_host+' '+CalcAnlDir+'/chgres_inc.x submitted on '+hosts[ihost]) - ihost+=1 - - sys.stdout.flush() - exit_codes = [p.wait() for p in interp_jobs] - for ec in exit_codes: - if ec != 0: - print('Error with chgres_inc.x, exit code='+str(ec)) - print(locals()) - sys.exit(ec) + print('unknown MPI launcher. Failure.') + sys.exit(1) - #### generate analysis from interpolated increment - CalcAnlDir6 = RunDir+'/calcanl_'+format(6, '02') - # set up the namelist - namelist = OrderedDict() - namelist["setup"] = {"datapath": "'./'", - "analysis_filename": "'anl'", - "firstguess_filename": "'ges'", - "increment_filename": "'inc.fullres'", - "fhr": 6, - } - - gsi_utils.write_nml(namelist, CalcAnlDir6+'/calc_analysis.nml') - - # run the executable - if ihost >= nhosts-1: + ####### generate the full resolution analysis + interp_jobs = [] ihost = 0 - if launcher == 'srun': - del os.environ['SLURM_HOSTFILE'] - print('fullres_calc_anl', namelist) - fullres_anl_job = subprocess.Popen(ExecCMDMPILevs_nohost+' '+CalcAnlDir6+'/calc_anl.x', shell=True, cwd=CalcAnlDir6) - print(ExecCMDMPILevs_nohost+' '+CalcAnlDir6+'/calc_anl.x submitted') - - sys.stdout.flush() - exit_fullres = fullres_anl_job.wait() - sys.stdout.flush() - if exit_fullres != 0: - print('Error with calc_analysis.x for deterministic resolution, exit code='+str(exit_fullres)) - print(locals()) - sys.exit(exit_fullres) - - - ######## run chgres to get background on ensemble resolution - if Cdump == "gdas": - chgres_jobs = [] + ### interpolate increment to full background resolution for fh in IAUHH: - # first check to see if guess file exists - CalcAnlDir = RunDir+'/calcanl_ensres_'+format(fh, '02') - if (os.path.isfile(CalcAnlDir+'/ges.'+format(fh, '02'))): - # set up the namelist - namelist = OrderedDict() - namelist["chgres_setup"] = {"i_output": str(LonA), - "j_output": str(LatA), - "input_file": "'ges."+format(fh, '02')+"'", - "output_file": "'ges.ensres."+format(fh, '02')+"'", - "terrain_file": "'"+atmges_ens_mean+"'", - "vcoord_file": "'"+siglevel+"'", - } - - gsi_utils.write_nml(namelist, CalcAnlDir+'/chgres_nc_gauss.nml') - - # run the executable - if ihost >= nhosts-1: - ihost = 0 - with open(CalcAnlDir+'/hosts', 'w') as hostfile: - hostfile.write(hosts[ihost]+'\n') - if launcher == 'srun': - os.environ['SLURM_HOSTFILE'] = CalcAnlDir+'/hosts' - print('chgres_nc_gauss', fh, namelist) - job = subprocess.Popen(ExecCMDMPI1_host+' '+CalcAnlDir+'/chgres_ges.x', shell=True, cwd=CalcAnlDir) - chgres_jobs.append(job) - print(ExecCMDMPI1_host+' '+CalcAnlDir+'/chgres_ges.x submitted on '+hosts[ihost]) - ihost+=1 + # first check to see if increment file exists + CalcAnlDir = RunDir+'/calcanl_'+format(fh, '02') + if (os.path.isfile(CalcAnlDir+'/siginc.nc.'+format(fh, '02'))): + print('Interpolating increment for f'+format(fh, '03')) + # set up the namelist + namelist = OrderedDict() + namelist["setup"] = {"lon_out": LonB, + "lat_out": LatB, + "lev": levs, + "infile": "'siginc.nc."+format(fh, '02')+"'", + "outfile": "'inc.fullres."+format(fh, '02')+"'", + } + gsi_utils.write_nml(namelist, CalcAnlDir+'/fort.43') + if ihost >= nhosts: + ihost = 0 + with open(CalcAnlDir+'/hosts', 'w') as hostfile: + hostfile.write(hosts[ihost]+'\n') + if launcher == 'srun': # need to write host per task not per node for slurm + for a in range(0,9): # need 9 more of the same host for the 10 tasks for chgres_inc + hostfile.write(hosts[ihost]+'\n') + if launcher == 'srun': + os.environ['SLURM_HOSTFILE'] = CalcAnlDir+'/hosts' + print('interp_inc', fh, namelist) + job = subprocess.Popen(ExecCMDMPI10_host+' '+CalcAnlDir+'/chgres_inc.x', shell=True, cwd=CalcAnlDir) + interp_jobs.append(job) + print(ExecCMDMPI10_host+' '+CalcAnlDir+'/chgres_inc.x submitted on '+hosts[ihost]) + ihost+=1 + else: + print('f'+format(fh, '03')+' is in $IAUFHRS but increment file is missing. Skipping.') sys.stdout.flush() - exit_codes = [p.wait() for p in chgres_jobs] + exit_codes = [p.wait() for p in interp_jobs] for ec in exit_codes: - if ec != 0: - print('Error with chgres_ges.x, exit code='+str(ec)) - print(locals()) - sys.exit(ec) + if ec != 0: + print('Error with chgres_inc.x, exit code='+str(ec)) + print(locals()) + sys.exit(ec) - sys.stdout.flush() - ######## generate ensres analysis from interpolated background - if launcher == 'srun': - del os.environ['SLURM_HOSTFILE'] - for fh in IAUHH: - CalcAnlDir6 = RunDir+'/calcanl_ensres_'+format(6, '02') - # set up the namelist - namelist = OrderedDict() - namelist["setup"] = {"datapath": "'./'", - "analysis_filename": "'anl.ensres'", - "firstguess_filename": "'ges.ensres'", - "increment_filename": "'siginc.nc'", - "fhr": fh, + #### generate analysis from interpolated increment + CalcAnlDir6 = RunDir+'/calcanl_'+format(6, '02') + # set up the namelist + namelist = OrderedDict() + namelist["setup"] = {"datapath": "'./'", + "analysis_filename": "'anl'", + "firstguess_filename": "'ges'", + "increment_filename": "'inc.fullres'", + "fhr": 6, } - - gsi_utils.write_nml(namelist, CalcAnlDir6+'/calc_analysis.nml') + gsi_utils.write_nml(namelist, CalcAnlDir6+'/calc_analysis.nml') - # run the executable - if ihost > nhosts-1: + # run the executable + if ihost >= nhosts-1: ihost = 0 - print('ensres_calc_anl', namelist) - ensres_anl_job = subprocess.Popen(ExecCMDMPILevs_nohost+' '+CalcAnlDir6+'/calc_anl.x', shell=True, cwd=CalcAnlDir6) - print(ExecCMDMPILevs_nohost+' '+CalcAnlDir6+'/calc_anl.x submitted') + if launcher == 'srun': + del os.environ['SLURM_HOSTFILE'] + print('fullres_calc_anl', namelist) + fullres_anl_job = subprocess.Popen(ExecCMDMPILevs_nohost+' '+CalcAnlDir6+'/calc_anl.x', shell=True, cwd=CalcAnlDir6) + print(ExecCMDMPILevs_nohost+' '+CalcAnlDir6+'/calc_anl.x submitted') - sys.stdout.flush() - ####### check on analysis steps - exit_ensres = ensres_anl_job.wait() - if exit_ensres != 0: - print('Error with calc_analysis.x for ensemble resolution, exit code='+str(exit_ensres)) + sys.stdout.flush() + exit_fullres = fullres_anl_job.wait() + sys.stdout.flush() + if exit_fullres != 0: + print('Error with calc_analysis.x for deterministic resolution, exit code='+str(exit_fullres)) print(locals()) - sys.exit(exit_ensres) + sys.exit(exit_fullres) + + + ######## compute determinstic analysis on ensemble resolution + if Cdump == "gdas": + chgres_jobs = [] + for fh in IAUHH: + # first check to see if guess file exists + CalcAnlDir6 = RunDir+'/calcanl_ensres_06' + print(CalcAnlDir6+'/ges.ensres.'+format(fh, '02')) + if (os.path.isfile(CalcAnlDir6+'/ges.ensres.'+format(fh, '02'))): + print('Calculating analysis on ensemble resolution for f'+format(fh, '03')) + ######## generate ensres analysis from interpolated background + # set up the namelist + namelist = OrderedDict() + namelist["setup"] = {"datapath": "'./'", + "analysis_filename": "'anl.ensres'", + "firstguess_filename": "'ges.ensres'", + "increment_filename": "'siginc.nc'", + "fhr": fh, + } - print('calcanl_gfs successfully completed at: ',datetime.datetime.utcnow()) - print(locals()) + gsi_utils.write_nml(namelist, CalcAnlDir6+'/calc_analysis.nml') + + # run the executable + if ihost > nhosts-1: + ihost = 0 + print('ensres_calc_anl', namelist) + ensres_anl_job = subprocess.Popen(ExecCMDMPILevs_nohost+' '+CalcAnlDir6+'/calc_anl.x', shell=True, cwd=CalcAnlDir6) + print(ExecCMDMPILevs_nohost+' '+CalcAnlDir6+'/calc_anl.x submitted') + + sys.stdout.flush() + ####### check on analysis steps + exit_ensres = ensres_anl_job.wait() + if exit_ensres != 0: + print('Error with calc_analysis.x for ensemble resolution, exit code='+str(exit_ensres)) + print(locals()) + sys.exit(exit_ensres) + else: + print('f'+format(fh, '03')+' is in $IAUFHRS but ensemble resolution guess file is missing. Skipping.') + + print('calcanl_gfs successfully completed at: ',datetime.datetime.utcnow()) + print(locals()) # run the function if this script is called from the command line if __name__ == '__main__': - DoIAU = gsi_utils.isTrue(os.getenv('DOIAU', 'NO')) - l4DEnsVar = gsi_utils.isTrue(os.getenv('l4densvar', 'NO')) - Write4Danl = gsi_utils.isTrue(os.getenv('lwrite4danl', 'NO')) - ComOut = os.getenv('COMOUT', './') - APrefix = os.getenv('APREFIX', '') - ASuffix= os.getenv('ASUFFIX', '') - NThreads = os.getenv('NTHREADS_CHGRES', 1) - FixDir = os.getenv('FIXgsm', './') - atmges_ens_mean = os.getenv('ATMGES_ENSMEAN', './atmges_ensmean') - RunDir = os.getenv('DATA', './') - ExecCMD = os.getenv('APRUN_CALCANL', '') - ExecCMDMPI = os.getenv('APRUN_CALCINC', '') - ExecAnl = os.getenv('CALCANLEXEC', './calc_analysis.x') - ExecChgresGes = os.getenv('CHGRESNCEXEC', './chgres_nc_gauss.exe') - ExecChgresInc = os.getenv('CHGRESINCEXEC', './chgres_increment.exe') - NEMSGet = os.getenv('NEMSIOGET','nemsio_get') - IAUHrs = list(map(int,os.getenv('IAUFHRS','6').split(','))) - Cdump = os.getenv('CDUMP', 'gdas') + DoIAU = gsi_utils.isTrue(os.getenv('DOIAU', 'NO')) + l4DEnsVar = gsi_utils.isTrue(os.getenv('l4densvar', 'NO')) + Write4Danl = gsi_utils.isTrue(os.getenv('lwrite4danl', 'NO')) + ComIn_Ges = os.getenv('COMIN_GES', './') + GPrefix = os.getenv('GPREFIX', './') + GSuffix = os.getenv('GSUFFIX', './') + ComOut = os.getenv('COMOUT', './') + APrefix = os.getenv('APREFIX', '') + ASuffix= os.getenv('ASUFFIX', '') + NThreads = os.getenv('NTHREADS_CHGRES', 1) + FixDir = os.getenv('FIXgsm', './') + atmges_ens_mean = os.getenv('ATMGES_ENSMEAN', './atmges_ensmean') + RunDir = os.getenv('DATA', './') + ExecCMD = os.getenv('APRUN_CALCANL', '') + ExecCMDMPI = os.getenv('APRUN_CALCINC', '') + ExecAnl = os.getenv('CALCANLEXEC', './calc_analysis.x') + ExecChgresInc = os.getenv('CHGRESINCEXEC', './interp_inc.x') + NEMSGet = os.getenv('NEMSIOGET','nemsio_get') + IAUHrs = list(map(int,os.getenv('IAUFHRS','6').split(','))) + Cdump = os.getenv('CDUMP', 'gdas') - print(locals()) - calcanl_gfs(DoIAU, l4DEnsVar, Write4Danl, ComOut, APrefix, ASuffix, - FixDir, atmges_ens_mean, RunDir, NThreads, NEMSGet, IAUHrs, - ExecCMD, ExecCMDMPI, ExecAnl, ExecChgresGes, ExecChgresInc, - Cdump) + print(locals()) + calcanl_gfs(DoIAU, l4DEnsVar, Write4Danl, ComOut, APrefix, ASuffix, + ComIn_Ges, GPrefix, GSuffix, + FixDir, atmges_ens_mean, RunDir, NThreads, NEMSGet, IAUHrs, + ExecCMD, ExecCMDMPI, ExecAnl, ExecChgresInc, + Cdump) diff --git a/ush/gsi_utils.py b/ush/gsi_utils.py index 4916f1ed5..79c6e627e 100644 --- a/ush/gsi_utils.py +++ b/ush/gsi_utils.py @@ -1,123 +1,138 @@ ### gsi_utils.py ### a collection of functions, classes, etc. -### used for the GSI global analysis +### used for the GSI global analysis def isTrue(str_in): - """ isTrue(str_in) - - function to translate shell variables to python logical variables + """ isTrue(str_in) + - function to translate shell variables to python logical variables - input: str_in - string (should be like 'YES', 'TRUE', etc.) - returns: status (logical True or False) + input: str_in - string (should be like 'YES', 'TRUE', etc.) + returns: status (logical True or False) - """ - str_in = str_in.upper() - if str_in in ['YES','.TRUE.']: - status = True - else: - status = False - return status + """ + str_in = str_in.upper() + if str_in in ['YES','.TRUE.']: + status = True + else: + status = False + return status def link_file(from_file, to_file): - """ link_file(from_file, to_file) - - function to check if a path exists, and if not, make a symlink - input: from_file - string path - to_file - string path - """ - import os - if not os.path.exists(to_file): - if not os.path.islink(to_file): - os.symlink(from_file, to_file) + """ link_file(from_file, to_file) + - function to check if a path exists, and if not, make a symlink + input: from_file - string path + to_file - string path + """ + import os + if not os.path.exists(to_file): + if not os.path.islink(to_file): + os.symlink(from_file, to_file) + else: + print(to_file+" exists, unlinking.") + os.unlink(to_file) + os.symlink(from_file, to_file) + print("ln -s "+from_file+" "+to_file) + +def copy_file(from_file, to_file): + import shutil + shutil.copy(from_file, to_file) + print("cp "+from_file+" "+to_file) + +def make_dir(directory): + import os + os.makedirs(directory) + print("mkdir -p "+directory) def write_nml(nml_dict, nml_file): - """ write_nml(nml_dict, nml_file) - - function to write out namelist dictionary nml_dict to file nml_file - input: nml_dict - dictionary of dictionaries - first dictionary is &nml, second is nmlvar='value' - NOTE: this shoudl be an OrderedDict or else it might fail - nml_file - string path to write namelist file to - """ - nfile = open(nml_file, 'w') + """ write_nml(nml_dict, nml_file) + - function to write out namelist dictionary nml_dict to file nml_file + input: nml_dict - dictionary of dictionaries + first dictionary is &nml, second is nmlvar='value' + NOTE: this shoudl be an OrderedDict or else it might fail + nml_file - string path to write namelist file to + """ + nfile = open(nml_file, 'w') - for nml, nmlvars in nml_dict.items(): - nfile.write('&'+nml+'\n') - for var, val in nmlvars.items(): - nfile.write(' '+str(var)+' = '+str(val)+'\n') - nfile.write('/\n\n') - nfile.close() + for nml, nmlvars in nml_dict.items(): + nfile.write('&'+nml+'\n') + for var, val in nmlvars.items(): + nfile.write(' '+str(var)+' = '+str(val)+'\n') + nfile.write('/\n\n') + nfile.close() def get_ncdims(ncfile): - """ get_ncdims(ncfile) - - function to return dictionary of netCDF file dimensions and their lengths - input: ncfile - string to path to netCDF file - output: ncdims - dictionary where key is the name of a dimension and the - value is the length of that dimension + """ get_ncdims(ncfile) + - function to return dictionary of netCDF file dimensions and their lengths + input: ncfile - string to path to netCDF file + output: ncdims - dictionary where key is the name of a dimension and the + value is the length of that dimension + + ex: ncdims['pfull'] = 127 + """ + try: + import netCDF4 as nc + except ImportError: + print("Python Error!") + print("netCDF4 Python module not available. Do you have the proper Python available in your environment?") + print("Hera: module use -a /contrib/modulefiles && module load anaconda/2.3.0") + print("Dell: module load python/3.6.3") + print(" ") + ncf = nc.Dataset(ncfile) + ncdims = {} + for d in ncf.dimensions.keys(): + ncdims[d] = int(len(ncf.dimensions[d])) + ncf.close() - ex: ncdims['pfull'] = 127 - """ - try: - import netCDF4 as nc - except ImportError: - print("Python Error!") - print("netCDF4 Python module not available. Do you have the proper Python available in your environment?") - print("Hera: module use -a /contrib/modulefiles && module load anaconda/2.3.0") - print("Dell: module load python/3.6.3") - print(" ") - ncf = nc.Dataset(ncfile) - ncdims = {} - for d in ncf.dimensions.keys(): - ncdims[d] = int(len(ncf.dimensions[d])) - ncf.close() - - return ncdims + return ncdims def get_nemsdims(nemsfile,nemsexe): - """ get_nemsdims(nemsfile,nemsexe) - - function to return dictionary of NEMSIO file dimensions for use - input: nemsfile - string to path nemsio file - nemsexe - string to path nemsio_get executable - output: nemsdims - dictionary where key is the name of a dimension and the - value is the length of that dimension - ex: nemsdims['pfull'] = 127 - """ - import subprocess - ncdims = { - 'dimx': 'grid_xt', - 'dimy': 'grid_yt', - 'dimz': 'pfull', - } - nemsdims = {} - for dim in ['dimx','dimy','dimz']: - out = subprocess.Popen([nemsexe,nemsfile,dim],stdout=subprocess.PIPE,stderr=subprocess.STDOUT) - stdout, stderr = out.communicate() - nemsdims[ncdims[dim]] = int(stdout.split(' ')[-1].rstrip()) - return nemsdims + """ get_nemsdims(nemsfile,nemsexe) + - function to return dictionary of NEMSIO file dimensions for use + input: nemsfile - string to path nemsio file + nemsexe - string to path nemsio_get executable + output: nemsdims - dictionary where key is the name of a dimension and the + value is the length of that dimension + ex: nemsdims['pfull'] = 127 + """ + import subprocess + ncdims = { + 'dimx': 'grid_xt', + 'dimy': 'grid_yt', + 'dimz': 'pfull', + } + nemsdims = {} + for dim in ['dimx','dimy','dimz']: + out = subprocess.Popen([nemsexe,nemsfile,dim],stdout=subprocess.PIPE,stderr=subprocess.STDOUT) + stdout, stderr = out.communicate() + nemsdims[ncdims[dim]] = int(stdout.split(' ')[-1].rstrip()) + return nemsdims def get_timeinfo(ncfile): - """ get_timeinfo(ncfile) - - function to return datetime objects of initialized time and valid time - input: ncfile - string to path to netCDF file - returns: inittime, validtime - datetime objects - nfhour - integer forecast hour - """ - try: - import netCDF4 as nc - except ImportError: - print("Python Error!") - print("netCDF4 Python module not available. Do you have the proper Python available in your environment?") - print("Hera: module use -a /contrib/modulefiles && module load anaconda/2.3.0") - print("Dell: module load python/3.6.3") - print(" ") - import datetime as dt - import re - ncf = nc.Dataset(ncfile) - time_units = ncf['time'].units - date_str = time_units.split('since ')[1] - date_str = re.sub("[^0-9]", "", date_str) - initstr = date_str[0:10] - inittime = dt.datetime.strptime(initstr,"%Y%m%d%H") - nfhour = int(ncf['time'][0]) - validtime = inittime + dt.timedelta(hours=nfhour) - ncf.close() + """ get_timeinfo(ncfile) + - function to return datetime objects of initialized time and valid time + input: ncfile - string to path to netCDF file + returns: inittime, validtime - datetime objects + nfhour - integer forecast hour + """ + try: + import netCDF4 as nc + except ImportError: + print("Python Error!") + print("netCDF4 Python module not available. Do you have the proper Python available in your environment?") + print("Hera: module use -a /contrib/modulefiles && module load anaconda/2.3.0") + print("Dell: module load python/3.6.3") + print(" ") + import datetime as dt + import re + ncf = nc.Dataset(ncfile) + time_units = ncf['time'].units + date_str = time_units.split('since ')[1] + date_str = re.sub("[^0-9]", "", date_str) + initstr = date_str[0:10] + inittime = dt.datetime.strptime(initstr,"%Y%m%d%H") + nfhour = int(ncf['time'][0]) + validtime = inittime + dt.timedelta(hours=nfhour) + ncf.close() - return inittime, validtime, nfhour + return inittime, validtime, nfhour diff --git a/ush/refactor_4nco_global.sh b/ush/refactor_4nco_global.sh index e57e2eb23..90bf44dc8 100644 --- a/ush/refactor_4nco_global.sh +++ b/ush/refactor_4nco_global.sh @@ -78,11 +78,11 @@ done # Create and populate gdas scripts $svnmkdirp $target_gdas/scripts -flist="exglobal_enkf_innovate_obs.sh.ecf" +flist="exglobal_enkf_innovate_obs.sh" for file in $flist; do $svncopy $source_path/scripts/$file $target_gdas/scripts/ done -flist="exglobal_enkf_fcst.sh.ecf exglobal_enkf_inflate_recenter.sh.ecf exglobal_enkf_post.sh.ecf exglobal_enkf_update.sh.ecf" +flist="exglobal_enkf_fcst.sh exglobal_enkf_inflate_recenter.sh exglobal_enkf_post.sh exglobal_enkf_update.sh" for file in $flist; do $svncopy $source_path/scripts/EnKF/scripts_ncep/$file $target_gdas/scripts/ done @@ -138,7 +138,7 @@ done # Create and populate global_shared scripts $svnmkdirp $target_shared/scripts -flist="exglobal_analysis.sh.ecf" +flist="exglobal_analysis.sh" for file in $flist; do $svncopy $source_path/scripts/$file $target_shared/scripts/ done diff --git a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/jobs/JGDAS_VMINMON b/util/Minimization_Monitor/nwprod/gdas.v1.0.0/jobs/JGDAS_ATMOS_VMINMON similarity index 91% rename from util/Minimization_Monitor/nwprod/gdas.v1.0.0/jobs/JGDAS_VMINMON rename to util/Minimization_Monitor/nwprod/gdas.v1.0.0/jobs/JGDAS_ATMOS_VMINMON index 3c584893f..2e0ffac0f 100755 --- a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/jobs/JGDAS_VMINMON +++ b/util/Minimization_Monitor/nwprod/gdas.v1.0.0/jobs/JGDAS_ATMOS_VMINMON @@ -7,11 +7,11 @@ echo `date` $0 `date -u` begin export PS4='$SECONDS + ' ############################### -# Specify NET and RUN name +# Specify NET, RUN, and COMPONENT name ############################## export NET=${NET:-gfs} export RUN=${RUN:-gdas} - +export COMPONENT=${COMPONENT:-atmos} ########################################################### # obtain unique process id (pid) and make temp directories @@ -70,11 +70,11 @@ export p_cyc=`echo ${cdate} | cut -c9-10` export COM_IN=${COM_IN:-${COMROOT}/${NET}/${envir}} M_TANKverf=${M_TANKverf:-${COM_IN}} -M_TANKverfM0=${M_TANKverfM0:-${M_TANKverf}/${RUN}.${PDY}/${cyc}/minmon} -export M_TANKverfM1=${M_TANKverfM1:-${M_TANKverf}/${RUN}.${P_PDY}/${p_cyc}/minmon} +M_TANKverfM0=${M_TANKverfM0:-${M_TANKverf}/${RUN}.${PDY}/${cyc}/$COMPONENT/minmon} +export M_TANKverfM1=${M_TANKverfM1:-${M_TANKverf}/${RUN}.${P_PDY}/${p_cyc}/$COMPONENT/minmon} export M_TANKverf=$M_TANKverfM0 -export COMIN=${COMIN:-$COM_IN/${RUN}.${PDY}/${cyc}} +export COMIN=${COMIN:-$COM_IN/${RUN}.${PDY}/${cyc}/$COMPONENT} mkdir -p -m 775 $M_TANKverf @@ -89,7 +89,7 @@ export gsistat=${gsistat:-${COMIN}/gdas.t${cyc}z.gsistat} ######################################################## # Execute the script. -${GMONSH:-$SCRgfs/exgdas_vrfminmon.sh.ecf} ${PDY} ${cyc} +${GMONSH:-$SCRgfs/exgdas_atmos_vminmon.sh} ${PDY} ${cyc} err=$? [[ $err -ne 0 ]] && exit $err diff --git a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/scripts/exgdas_vrfminmon.sh.ecf b/util/Minimization_Monitor/nwprod/gdas.v1.0.0/scripts/exgdas_atmos_vminmon.sh similarity index 95% rename from util/Minimization_Monitor/nwprod/gdas.v1.0.0/scripts/exgdas_vrfminmon.sh.ecf rename to util/Minimization_Monitor/nwprod/gdas.v1.0.0/scripts/exgdas_atmos_vminmon.sh index f55d494fb..af3e33815 100755 --- a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/scripts/exgdas_vrfminmon.sh.ecf +++ b/util/Minimization_Monitor/nwprod/gdas.v1.0.0/scripts/exgdas_atmos_vminmon.sh @@ -2,7 +2,7 @@ ################################################################################ #### UNIX Script Documentation Block # . . -# Script name: exgdas_vrfminmon.sh.ecf +# Script name: exgdas_vrfminmon.sh # Script description: Runs data extract/validation for GSI normalization diag data # # Author: Ed Safford Org: NP23 Date: 2015-04-10 @@ -26,7 +26,7 @@ then set -x fi -export scr=exgdas_vrfyminmon.sh.ecf +export scr=exgdas_vrfyminmon.sh export RUN_ENVIR=${RUN_ENVIR:-nco} @@ -60,7 +60,7 @@ export MINMON_SUFFIX=${MINMON_SUFFIX:-GDAS} export PDATE=${PDY}${cyc} export NCP=${NCP:-/bin/cp} export NDATE=${NDATE:-/nwprod/util/exec/ndate} -export pgm=exgdas_vrfminmon.sh.ecf +export pgm=exgdas_vrfminmon.sh if [[ ! -d ${DATA} ]]; then mkdir $DATA @@ -118,7 +118,7 @@ elif [[ $rc_reduct -ne 0 ]]; then fi if [[ "$VERBOSE" = "YES" ]]; then - echo "end exgdas_vrfminmon.sh.ecf, exit value = ${err}" + echo "end exgdas_vrfminmon.sh, exit value = ${err}" fi diff --git a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/jobs/JGFS_VMINMON b/util/Minimization_Monitor/nwprod/gfs.v1.0.0/jobs/JGFS_ATMOS_VMINMON similarity index 93% rename from util/Minimization_Monitor/nwprod/gfs.v1.0.0/jobs/JGFS_VMINMON rename to util/Minimization_Monitor/nwprod/gfs.v1.0.0/jobs/JGFS_ATMOS_VMINMON index bdc78268c..a0d3503ef 100755 --- a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/jobs/JGFS_VMINMON +++ b/util/Minimization_Monitor/nwprod/gfs.v1.0.0/jobs/JGFS_ATMOS_VMINMON @@ -11,6 +11,7 @@ export PS4='$SECONDS + ' ############################## export NET=${NET:-gfs} export RUN=${RUN:-gfs} +export COMPONENT=${COMPONENT:-atmos} ########################################################### @@ -76,11 +77,11 @@ TANK_USE_RUN=${TANK_USE_RUN:-1} export COM_IN=${COM_IN:-${COMROOT}/${NET}/${envir}} M_TANKverf=${M_TANKverf:-${COM_IN}} -M_TANKverfM0=${M_TANKverfM0:-${M_TANKverf}/${RUN}.${PDY}/${cyc}/minmon} -export M_TANKverfM1=${M_TANKverfM1:-${M_TANKverf}/${RUN}.${P_PDY}/${p_cyc}/minmon} +M_TANKverfM0=${M_TANKverfM0:-${M_TANKverf}/${RUN}.${PDY}/${cyc}/$COMPONENT/minmon} +export M_TANKverfM1=${M_TANKverfM1:-${M_TANKverf}/${RUN}.${P_PDY}/${p_cyc}/$COMPONENT/minmon} export M_TANKverf=$M_TANKverfM0 -export COMIN=${COMIN:-$COM_IN/${RUN}.${PDY}/${cyc}} +export COMIN=${COMIN:-$COM_IN/${RUN}.${PDY}/${cyc}/$COMPONENT} mkdir -p -m 775 $M_TANKverf @@ -94,7 +95,7 @@ export gsistat=${gsistat:-${COMIN}/gfs.t${cyc}z.gsistat} ######################################################## # Execute the script. -${GMONSH:-$SCRgfs/exgfs_vrfminmon.sh.ecf} ${PDY} ${cyc} +${GMONSH:-$SCRgfs/exgfs_atmos_vminmon.sh} ${PDY} ${cyc} err=$? [[ $err -ne 0 ]] && exit $err diff --git a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/scripts/exgfs_vrfminmon.sh.ecf b/util/Minimization_Monitor/nwprod/gfs.v1.0.0/scripts/exgfs_atmos_vminmon.sh similarity index 95% rename from util/Minimization_Monitor/nwprod/gfs.v1.0.0/scripts/exgfs_vrfminmon.sh.ecf rename to util/Minimization_Monitor/nwprod/gfs.v1.0.0/scripts/exgfs_atmos_vminmon.sh index 1a182f9fc..98e33c708 100755 --- a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/scripts/exgfs_vrfminmon.sh.ecf +++ b/util/Minimization_Monitor/nwprod/gfs.v1.0.0/scripts/exgfs_atmos_vminmon.sh @@ -2,7 +2,7 @@ ################################################################################ #### UNIX Script Documentation Block # . . -# Script name: exgfs_vrfminmon.sh.ecf +# Script name: exgfs_vrfminmon.sh # Script description: Runs data extract/validation for GSI normalization diag data # # Author: Ed Safford Org: NP23 Date: 2015-04-10 @@ -26,7 +26,7 @@ then set -x fi -export scr=exgfs_vrfyminmon.sh.ecf +export scr=exgfs_vrfyminmon.sh export RUN_ENVIR=${RUN_ENVIR:-nco} export NET=${NET:-gfs} @@ -59,7 +59,7 @@ export MINMON_SUFFIX=${MINMON_SUFFIX:-GFS} export PDATE=${PDY}${cyc} export NCP=${NCP:-/bin/cp} export NDATE=${NDATE:-/nwprod/util/exec/ndate} -export pgm=exgfs_vrfminmon.sh.ecf +export pgm=exgfs_vrfminmon.sh @@ -119,7 +119,7 @@ elif [[ $rc_reduct -ne 0 ]]; then fi if [[ "$VERBOSE" = "YES" ]]; then - echo "end exgfs_vrfminmon.sh.ecf, exit value = ${err}" + echo "end exgfs_vrfminmon.sh, exit value = ${err}" fi diff --git a/util/Ozone_Monitor/CMakeLists.txt b/util/Ozone_Monitor/CMakeLists.txt index b8f928a61..03f5129cf 100644 --- a/util/Ozone_Monitor/CMakeLists.txt +++ b/util/Ozone_Monitor/CMakeLists.txt @@ -1,9 +1,9 @@ -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 2.8) if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) # I am top-level project. if( NOT DEFINED ENV{CC} ) find_path( crayComp "ftn" ) -# find_path( wcossIntel "mpfort" ) + find_path( wcossIntel "mpfort" ) find_path( intelComp "ifort" ) find_path( pgiComp "pgf90" ) if( crayComp ) @@ -22,7 +22,7 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) message("Setting env for wcoss intel") set(ENV{CC} "mpcc") set(ENV{CXX} "mpCC") -# set(ENV{FC} "mpfort") + set(ENV{FC} "mpfort") endif() if( pgiComp ) set(ENV{CC} "pgcc") @@ -32,8 +32,8 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) endif() project(COV_Calc) enable_language (Fortran) -# find_package(OpenMP) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/../../cmake/Modules/") + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib") include(${CMAKE_SOURCE_DIR}/../../cmake/Modules/setPlatformVariables.cmake) include(${CMAKE_SOURCE_DIR}/../../cmake/Modules/setIntelFlags.cmake) include(${CMAKE_SOURCE_DIR}/../../cmake/Modules/setGNUFlags.cmake) @@ -64,20 +64,40 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) message("Setting PGI flags") setPGI() endif() + + cmake_policy(SET CMP0009 NEW) + find_package(OpenMP) + message("found openmp with flag ${OPENMP_Fortran_FLAGS}") + +# Set Host specific flags and options setHOST() + + if(FIND_HDF5_HL) + find_package(HDF5 COMPONENTS C HL Fortran_HL ) + elseif(FIND_HDF5) + find_package(HDF5) + endif() + find_package(MPI REQUIRED) + message("MPI version is ${MPI_Fortran_VERSION}") + message("MPI f90 version is ${MPI_Fortran_HAVE_F90_MODULE}") + message("MPI f08 version is ${MPI_Fortran_HAVE_F08_MODULE}") + add_definitions(${MPI_Fortran_COMPILE_FLAGS}) include_directories(${MPI_Fortran_INCLUDE_DIRS} ${MPI_INCLUDE_PATH} "./" ${CMAKE_INCLUDE_OUTPUT_DIRECTORY}) link_directories(${MPI_Fortran_LIBRARIES} ${ARCHIVE_OUTPUT_PATH} ) find_package( NetCDF REQUIRED) - if(FIND_HDF5_HL) - find_package(HDF5 COMPONENTS C HL Fortran_HL ) - elseif(FIND_HDF5) - find_package(HDF5) + if(NETCDF4) + if(CMAKE_MAJOR_VERSION GREATER 2) + find_package( ZLIB ) + endif() + find_package( CURL ) endif() + find_package( W3NCO ) - set(NCDIAG_INCS "${PROJECT_BINARY_DIR}/libsrc/ncdiag") + set(BUILD_NCDIAG ON) + set(NCDIAG_INCS "${PROJECT_BINARY_DIR}/libsrc/ncdiag") add_subdirectory(${PROJECT_SOURCE_DIR}/../../src/ncdiag ${PROJECT_BINARY_DIR}/libsrc/ncdiag) set(NCDIAG_LIBRARIES ncdiag ) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) @@ -86,4 +106,3 @@ endif() add_subdirectory(nwprod/oznmon_shared.v2.0.0/sorc/oznmon_horiz.fd) add_subdirectory(nwprod/oznmon_shared.v2.0.0/sorc/oznmon_time.fd) add_subdirectory(data_xtrct/sorc/make_base.fd) - diff --git a/util/Ozone_Monitor/nwprod/gdas_oznmon.v2.0.0/fix/gdas_oznmon_base.tar b/util/Ozone_Monitor/nwprod/gdas_oznmon.v2.0.0/fix/gdas_oznmon_base.tar new file mode 100644 index 000000000..0526bd1b1 Binary files /dev/null and b/util/Ozone_Monitor/nwprod/gdas_oznmon.v2.0.0/fix/gdas_oznmon_base.tar differ diff --git a/util/Ozone_Monitor/nwprod/gdas_oznmon.v2.0.0/jobs/JGDAS_VERFOZN b/util/Ozone_Monitor/nwprod/gdas_oznmon.v2.0.0/jobs/JGDAS_ATMOS_VERFOZN similarity index 91% rename from util/Ozone_Monitor/nwprod/gdas_oznmon.v2.0.0/jobs/JGDAS_VERFOZN rename to util/Ozone_Monitor/nwprod/gdas_oznmon.v2.0.0/jobs/JGDAS_ATMOS_VERFOZN index cc0754954..13f71e21b 100755 --- a/util/Ozone_Monitor/nwprod/gdas_oznmon.v2.0.0/jobs/JGDAS_VERFOZN +++ b/util/Ozone_Monitor/nwprod/gdas_oznmon.v2.0.0/jobs/JGDAS_ATMOS_VERFOZN @@ -7,10 +7,11 @@ echo `date` $0 `date -u` begin export PS4='$SECONDS + ' ############################### -# Specify NET and RUN name +# Specify NET, RUN, and COMPONENT name ############################## export NET=${NET:-gfs} export RUN=${RUN:-gdas} +export COMPONENT=${COMPONENT:-atmos} ########################################################### # obtain unique process id (pid) and make temp directories @@ -75,10 +76,10 @@ export p_cyc=`echo ${cdate} | cut -c9-10` # OZN_TANKDIR - WHERE OUTPUT DATA WILL RESIDE # echo "pre-assignment, OZN_TANKDIR = $OZN_TANKDIR" -export TANKverf_ozn=${TANKverf_ozn:-${OZN_TANKDIR}/${RUN}.${PDY}/${cyc}/oznmon} -export TANKverf_oznM1=${TANKverf_oznM1:-${OZN_TANKDIR}/${RUN}.${P_PDY}/${p_cyc}/oznmon} +export TANKverf_ozn=${TANKverf_ozn:-${OZN_TANKDIR}/${RUN}.${PDY}/${cyc}/$COMPONENT/oznmon} +export TANKverf_oznM1=${TANKverf_oznM1:-${OZN_TANKDIR}/${RUN}.${P_PDY}/${p_cyc}/$COMPONENT/oznmon} export COM_IN=${COM_IN:-${COMROOT}/${NET}/${envir}} -export COMIN=${COMIN:-${COM_IN}/${RUN}.${PDY}/${cyc}} +export COMIN=${COMIN:-${COM_IN}/${RUN}.${PDY}/${cyc}/$COMPONENT} if [[ ! -d ${TANKverf_ozn} ]]; then mkdir -p -m 775 $TANKverf_ozn @@ -102,7 +103,7 @@ export oznstat=${oznstat:-$COMIN/gdas.t${cyc}z.oznstat} #------------------------------------------------------- # Execute the script. # -${OZNMONSH:-${SCRgdas_ozn}/exgdas_vrfyozn.sh.ecf} ${PDY} ${cyc} +${OZNMONSH:-${SCRgdas_ozn}/exgdas_atmos_verfozn.sh} ${PDY} ${cyc} err=$? [[ $err -ne 0 ]] && exit $err diff --git a/util/Ozone_Monitor/nwprod/gdas_oznmon.v2.0.0/scripts/exgdas_vrfyozn.sh.ecf b/util/Ozone_Monitor/nwprod/gdas_oznmon.v2.0.0/scripts/exgdas_atmos_verfozn.sh similarity index 93% rename from util/Ozone_Monitor/nwprod/gdas_oznmon.v2.0.0/scripts/exgdas_vrfyozn.sh.ecf rename to util/Ozone_Monitor/nwprod/gdas_oznmon.v2.0.0/scripts/exgdas_atmos_verfozn.sh index 8a937e1be..f28d91db4 100755 --- a/util/Ozone_Monitor/nwprod/gdas_oznmon.v2.0.0/scripts/exgdas_vrfyozn.sh.ecf +++ b/util/Ozone_Monitor/nwprod/gdas_oznmon.v2.0.0/scripts/exgdas_atmos_verfozn.sh @@ -5,7 +5,7 @@ set -ax ################################################################################ #### UNIX Script Documentation Block # . . -# Script name: exgdas_vrfyozn.sh.ecf +# Script name: exgdas_vrfyozn.sh # Script description: Runs data extract/validation for global ozone diag data # # Author: Ed Safford Org: NP23 Date: 2012-01-18 @@ -32,7 +32,7 @@ set -ax # >0 - some problem encountered # ################################################################################ -export scr=exgdas_vrfyozn.sh.ecf +export scr=exgdas_vrfyozn.sh err=0 @@ -43,6 +43,7 @@ export RUN_ENVIR=${RUN_ENVIR:-nco} export NET=${NET:-gfs} export RUN=${RUN:-gdas} export envir=${envir:-prod} +export COMPONENT=${COMPONENT:-atmos} # Command line arguments export PDY=${1:-${PDY:?}} @@ -51,7 +52,7 @@ export cyc=${2:-${cyc:?}} # Directories export OZN_WORK_DIR=${OZN_WORK_DIR:-$(pwd)} export COM_IN=${COM_IN:-${COMROOT}/${NET}/${envir}} -export COMIN=${COMIN:-$COM_IN/${RUN}.${PDY}} +export COMIN=${COMIN:-$COM_IN/${RUN}.${PDY}/${cyc}/$COMPONENT} export HOMEgdas_ozn=${HOMEgdas_ozn:-${NWROOT}/gdas.${gdas_oznmon_ver}} export FIXgdas_ozn=${FIXgdas_ozn:-$HOMEgdas/fix} @@ -128,7 +129,7 @@ fi if [[ "$VERBOSE" = "YES" ]]; then - echo "end exgdas_vrfyozn.sh.ecf, exit value = ${err}" + echo "end exgdas_vrfyozn.sh, exit value = ${err}" fi diff --git a/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_horiz.fd/horiz.f90 b/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_horiz.fd/horiz.f90 index 60744fdde..497fc1802 100644 --- a/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_horiz.fd/horiz.f90 +++ b/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_horiz.fd/horiz.f90 @@ -1,5 +1,5 @@ program horiz - use read_diag + use oznmon_read_diag implicit none integer ntype, mls2_levs,mls3_levs diff --git a/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_horiz.fd/read_diag.f90 b/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_horiz.fd/oznmon_read_diag.f90 similarity index 90% rename from util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_horiz.fd/read_diag.f90 rename to util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_horiz.fd/oznmon_read_diag.f90 index 7e592d3a5..b2c59e9bb 100644 --- a/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_horiz.fd/read_diag.f90 +++ b/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_horiz.fd/oznmon_read_diag.f90 @@ -1,27 +1,18 @@ !$$$ subprogram documentation block ! . . . . -! subprogram: read_diag read ozone diag file -! prgmmr: hliu org: np20 date: 2009-04-15 +! subprogram: oznmon_read_diag read ozone diag file ! ! abstract: This module contains code to process ozone ! diagnostic files. The module defines structures ! to contain information from the ozone ! diagnostic files and then provides two routines -! to access contents of the file. +! to access contents of the file. Both binary +! and NetCDF formats are supported. ! -! program history log: -! -! contains -! read_ozndiag_header - read ozone diagnostic file header -! read_ozndiag_data - read ozone diagnostic file data -! set_netcdf_read - call set_netcdf_read(.true.) to use nc4 hooks, -! otherwise read file as binary format -! open_ozndiag - open a diag file for reading -! close_ozndiag - close an open diag file !------------------------------------------------------------ -! -module read_diag + +module oznmon_read_diag !--- use ---! @@ -299,19 +290,19 @@ subroutine read_ozndiag_header( ftin, header_fix, header_nlev, new_hdr, istatus call read_ozndiag_header_bin( ftin, header_fix, header_nlev, new_hdr, istatus ) endif - print*, 'ftin = ', ftin - print*, 'header_fix%isis = ', header_fix%isis - print*, 'header_fix%id = ', header_fix%id - print*, 'header_fix%obstype = ', header_fix%obstype - print*, 'header_fix%jiter = ', header_fix%jiter - print*, 'header_fix%nlevs = ', header_fix%nlevs - print*, 'header_fix%ianldate = ', header_fix%ianldate - print*, 'header_fix%iint = ', header_fix%iint - print*, 'header_fix%ireal = ', header_fix%ireal - print*, 'header_fix%iextra = ', header_fix%iextra - - print*, 'istatus = ', istatus - print*, '' + write(6,*) 'ftin = ', ftin + write(6,*) 'header_fix%isis = ', header_fix%isis + write(6,*) 'header_fix%id = ', header_fix%id + write(6,*) 'header_fix%obstype = ', header_fix%obstype + write(6,*) 'header_fix%jiter = ', header_fix%jiter + write(6,*) 'header_fix%nlevs = ', header_fix%nlevs + write(6,*) 'header_fix%ianldate = ', header_fix%ianldate + write(6,*) 'header_fix%iint = ', header_fix%iint + write(6,*) 'header_fix%ireal = ', header_fix%ireal + write(6,*) 'header_fix%iextra = ', header_fix%iextra + + write(6,*) 'istatus = ', istatus + write(6,*) '' end subroutine read_ozndiag_header @@ -349,9 +340,9 @@ subroutine read_ozndiag_header_nc( ftin, header_fix, header_nlev, new_hdr, istat !--- get global attr ! ! This may look like overkill with a check on each variable - ! name, but due to the genius of the ncdiag library, a - ! failure on these read operations is fatal, because, reasons - ! I guess. Thus, this abundance of caution. + ! name, but a failure on these nc library read operations + ! is fatal. Thus, this abundance of caution verifying the + ! variable exists before attempting to retreive it. ! if( verify_var_name_nc( "date_time" ) ) then call nc_diag_read_get_global_attr(ftin, "date_time", idate) @@ -377,12 +368,6 @@ subroutine read_ozndiag_header_nc( ftin, header_fix, header_nlev, new_hdr, istat write(6,*) 'WARNING: unable to read global var Observation_type from file ' end if - if( verify_var_name_nc( "Number_of_state_vars" ) ) then - call nc_diag_read_get_global_attr(ftin, "Number_of_state_vars", nsdim ) - else - write(6,*) 'WARNING: unable to read global var Number_of_state_vars from file ' - end if - if( verify_var_name_nc( "pobs" ) ) then call nc_diag_read_get_global_attr(ftin, "pobs", pobs ) else @@ -401,7 +386,6 @@ subroutine read_ozndiag_header_nc( ftin, header_fix, header_nlev, new_hdr, istat write(6,*) 'WARNING: unable to read global var tnoise from file ' end if - !------------------------------------------------------------------- ! The Anaysis_Use_Flag in the netcdf file resides in the ! obs data rather than global (equivalent of binary file header @@ -438,6 +422,8 @@ subroutine read_ozndiag_header_nc( ftin, header_fix, header_nlev, new_hdr, istat !--- allocate if necessary + write(6,*) 'header_fix%nlevs, nlevs_last = ', header_fix%nlevs, nlevs_last + if( header_fix%nlevs /= nlevs_last )then if( nlevs_last > 0 )then deallocate( header_nlev ) @@ -455,8 +441,10 @@ subroutine read_ozndiag_header_nc( ftin, header_fix, header_nlev, new_hdr, istat header_nlev(k)%iouse = iuse_flag(k) end do - deallocate( pobs,gross,tnoise,iuse_flag ) - + if( allocated( pobs )) deallocate( pobs ) + if( allocated( gross )) deallocate( gross ) + if( allocated( tnoise )) deallocate( tnoise ) + if( allocated( iuse_flag )) deallocate( iuse_flag ) end subroutine read_ozndiag_header_nc @@ -511,8 +499,8 @@ subroutine read_ozndiag_header_bin( ftin, header_fix, header_nlev, new_hdr, ista if( header_fix%ireal /= IREAL_RESERVE ) then - print *, '### ERROR: UNEXPECTED DATA RECORD FORMAT' - print *, 'ireal =', header_fix%ireal + write(6,*) '### ERROR: UNEXPECTED DATA RECORD FORMAT' + write(6,*) 'ireal =', header_fix%ireal stop 99 endif @@ -524,6 +512,7 @@ subroutine read_ozndiag_header_bin( ftin, header_fix, header_nlev, new_hdr, ista !--- allocate if necessary + write(6,*) 'header_fix%nlevs, nlevs_last = ', header_fix%nlevs, nlevs_last if( header_fix%nlevs /= nlevs_last )then if( nlevs_last > 0 )then deallocate( header_nlev ) @@ -545,7 +534,11 @@ subroutine read_ozndiag_header_bin( ftin, header_fix, header_nlev, new_hdr, ista header_nlev(k)%err = err(k) header_nlev(k)%iouse = iouse(k) end do - deallocate (pob,grs,err,iouse) + + if( allocated( pob )) deallocate( pob ) + if( allocated( grs )) deallocate( grs ) + if( allocated( err )) deallocate( err ) + if( allocated( iouse )) deallocate( iouse ) end subroutine read_ozndiag_header_bin @@ -628,7 +621,7 @@ subroutine read_ozndiag_data_nc( ftin, header_fix, data_fix, data_nlev, data_ext logical :: test cur_idx = ncdiag_open_id( nopen_ncdiag ) - + !---------------------------------------------------------- ! The binary file read (the original version of the file ! read) is designed to be called in a loop, as it reads @@ -715,12 +708,13 @@ subroutine read_ozndiag_data_nc( ftin, header_fix, data_fix, data_nlev, data_ext data_fix(ii)%obstime = obstime(ii + ((ii-1)*nlevs) ) end do - deallocate( lat, lon, obstime ) + if( allocated( lat )) deallocate( lat ) + if( allocated( lon )) deallocate( lon ) + if( allocated( obstime )) deallocate( obstime ) !--------------------------------- ! load data_nlev structure ! - allocate( data_nlev( header_fix%nlevs,nrecords ) ) allocate( ozobs(nrecords) ) allocate( ozone_inv(nrecords) ) allocate( varinv(nrecords) ) @@ -769,23 +763,23 @@ subroutine read_ozndiag_data_nc( ftin, header_fix, data_fix, data_nlev, data_ext ! All vars used to read the file are dimensioned ! to nrecord, which is nobs * nlevs ! - do jj=0,ntobs-1 + do jj=1,ntobs-1 do ii=1,header_fix%nlevs - data_nlev(ii,jj)%ozobs = ozobs( ii + (jj * nlevs) ) - data_nlev(ii,jj)%ozone_inv = ozone_inv( ii + (jj * nlevs) ) - data_nlev(ii,jj)%varinv = varinv( ii + (jj * nlevs) ) - data_nlev(ii,jj)%sza = sza( ii + (jj * nlevs) ) - data_nlev(ii,jj)%fovn = fovn( ii + (jj * nlevs) ) - data_nlev(ii,jj)%toqf = toqf( ii + (jj * nlevs) ) + data_nlev(ii,jj)%ozobs = ozobs( ii + ((jj-1) * nlevs) ) + data_nlev(ii,jj)%ozone_inv = ozone_inv( ii + ((jj-1) * nlevs) ) + data_nlev(ii,jj)%varinv = varinv( ii + ((jj-1) * nlevs) ) + data_nlev(ii,jj)%sza = sza( ii + ((jj-1) * nlevs) ) + data_nlev(ii,jj)%fovn = fovn( ii + ((jj-1) * nlevs) ) + data_nlev(ii,jj)%toqf = toqf( ii + ((jj-1) * nlevs) ) end do end do - deallocate( ozobs ) - deallocate( ozone_inv ) - deallocate( varinv ) - deallocate( sza ) - deallocate( fovn ) - deallocate( toqf ) + if( allocated( ozobs )) deallocate( ozobs ) + if( allocated( ozone_inv )) deallocate( ozone_inv ) + if( allocated( varinv )) deallocate( varinv ) + if( allocated( sza )) deallocate( sza ) + if( allocated( fovn )) deallocate( fovn ) + if( allocated( toqf )) deallocate( toqf ) ncdiag_open_status(cur_idx)%nc_read = .true. @@ -831,6 +825,7 @@ subroutine read_ozndiag_data_bin( ftin, header_fix, data_fix, data_nlev, data_ex read(ftin,IOSTAT=iflag) ntobs write(6,*) ' READ 1, ntobs, iflag = ', ntobs, iflag + write(6,*) 'header_fix%nlevs, nlevs_last = ', header_fix%nlevs, nlevs_last if( header_fix%nlevs /= nlevs_last )then if( nlevs_last > 0 )then write(6,*) ' DEALLOCATING data_nlev, data_fix, data_mpi' @@ -845,8 +840,9 @@ subroutine read_ozndiag_data_bin( ftin, header_fix, data_fix, data_nlev, data_ex nlevs_last = header_fix%nlevs endif + write(6,*) 'iextra_last = ', iextra_last if (iextra_last > 0) then - deallocate (data_extra) + deallocate ( data_extra ) endif allocate( data_extra(header_fix%iextra,ntobs) ) @@ -869,7 +865,7 @@ subroutine read_ozndiag_data_bin( ftin, header_fix, data_fix, data_nlev, data_ex end do end do - deallocate(tmp_extra) + if( allocated( tmp_extra )) deallocate( tmp_extra ) endif do j=1,ntobs @@ -877,7 +873,7 @@ subroutine read_ozndiag_data_bin( ftin, header_fix, data_fix, data_nlev, data_ex data_fix(j)%lon = tmp_fix(2,j) data_fix(j)%obstime = tmp_fix(3,j) end do - deallocate(tmp_fix) + if( allocated( tmp_fix )) deallocate( tmp_fix ) do j=1,ntobs do i=1,header_fix%nlevs @@ -889,7 +885,7 @@ subroutine read_ozndiag_data_bin( ftin, header_fix, data_fix, data_nlev, data_ex data_nlev(i,j)%toqf = tmp_nlev(6,i,j) end do end do - deallocate(tmp_nlev) + if( allocated( tmp_nlev )) deallocate( tmp_nlev ) nlevs_last = -1 @@ -966,5 +962,5 @@ logical function verify_var_name_nc( test_name ) end function verify_var_name_nc -end module read_diag +end module oznmon_read_diag diff --git a/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_time.fd/read_diag.f90 b/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_time.fd/oznmon_read_diag.f90 similarity index 90% rename from util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_time.fd/read_diag.f90 rename to util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_time.fd/oznmon_read_diag.f90 index 7e592d3a5..b2c59e9bb 100644 --- a/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_time.fd/read_diag.f90 +++ b/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_time.fd/oznmon_read_diag.f90 @@ -1,27 +1,18 @@ !$$$ subprogram documentation block ! . . . . -! subprogram: read_diag read ozone diag file -! prgmmr: hliu org: np20 date: 2009-04-15 +! subprogram: oznmon_read_diag read ozone diag file ! ! abstract: This module contains code to process ozone ! diagnostic files. The module defines structures ! to contain information from the ozone ! diagnostic files and then provides two routines -! to access contents of the file. +! to access contents of the file. Both binary +! and NetCDF formats are supported. ! -! program history log: -! -! contains -! read_ozndiag_header - read ozone diagnostic file header -! read_ozndiag_data - read ozone diagnostic file data -! set_netcdf_read - call set_netcdf_read(.true.) to use nc4 hooks, -! otherwise read file as binary format -! open_ozndiag - open a diag file for reading -! close_ozndiag - close an open diag file !------------------------------------------------------------ -! -module read_diag + +module oznmon_read_diag !--- use ---! @@ -299,19 +290,19 @@ subroutine read_ozndiag_header( ftin, header_fix, header_nlev, new_hdr, istatus call read_ozndiag_header_bin( ftin, header_fix, header_nlev, new_hdr, istatus ) endif - print*, 'ftin = ', ftin - print*, 'header_fix%isis = ', header_fix%isis - print*, 'header_fix%id = ', header_fix%id - print*, 'header_fix%obstype = ', header_fix%obstype - print*, 'header_fix%jiter = ', header_fix%jiter - print*, 'header_fix%nlevs = ', header_fix%nlevs - print*, 'header_fix%ianldate = ', header_fix%ianldate - print*, 'header_fix%iint = ', header_fix%iint - print*, 'header_fix%ireal = ', header_fix%ireal - print*, 'header_fix%iextra = ', header_fix%iextra - - print*, 'istatus = ', istatus - print*, '' + write(6,*) 'ftin = ', ftin + write(6,*) 'header_fix%isis = ', header_fix%isis + write(6,*) 'header_fix%id = ', header_fix%id + write(6,*) 'header_fix%obstype = ', header_fix%obstype + write(6,*) 'header_fix%jiter = ', header_fix%jiter + write(6,*) 'header_fix%nlevs = ', header_fix%nlevs + write(6,*) 'header_fix%ianldate = ', header_fix%ianldate + write(6,*) 'header_fix%iint = ', header_fix%iint + write(6,*) 'header_fix%ireal = ', header_fix%ireal + write(6,*) 'header_fix%iextra = ', header_fix%iextra + + write(6,*) 'istatus = ', istatus + write(6,*) '' end subroutine read_ozndiag_header @@ -349,9 +340,9 @@ subroutine read_ozndiag_header_nc( ftin, header_fix, header_nlev, new_hdr, istat !--- get global attr ! ! This may look like overkill with a check on each variable - ! name, but due to the genius of the ncdiag library, a - ! failure on these read operations is fatal, because, reasons - ! I guess. Thus, this abundance of caution. + ! name, but a failure on these nc library read operations + ! is fatal. Thus, this abundance of caution verifying the + ! variable exists before attempting to retreive it. ! if( verify_var_name_nc( "date_time" ) ) then call nc_diag_read_get_global_attr(ftin, "date_time", idate) @@ -377,12 +368,6 @@ subroutine read_ozndiag_header_nc( ftin, header_fix, header_nlev, new_hdr, istat write(6,*) 'WARNING: unable to read global var Observation_type from file ' end if - if( verify_var_name_nc( "Number_of_state_vars" ) ) then - call nc_diag_read_get_global_attr(ftin, "Number_of_state_vars", nsdim ) - else - write(6,*) 'WARNING: unable to read global var Number_of_state_vars from file ' - end if - if( verify_var_name_nc( "pobs" ) ) then call nc_diag_read_get_global_attr(ftin, "pobs", pobs ) else @@ -401,7 +386,6 @@ subroutine read_ozndiag_header_nc( ftin, header_fix, header_nlev, new_hdr, istat write(6,*) 'WARNING: unable to read global var tnoise from file ' end if - !------------------------------------------------------------------- ! The Anaysis_Use_Flag in the netcdf file resides in the ! obs data rather than global (equivalent of binary file header @@ -438,6 +422,8 @@ subroutine read_ozndiag_header_nc( ftin, header_fix, header_nlev, new_hdr, istat !--- allocate if necessary + write(6,*) 'header_fix%nlevs, nlevs_last = ', header_fix%nlevs, nlevs_last + if( header_fix%nlevs /= nlevs_last )then if( nlevs_last > 0 )then deallocate( header_nlev ) @@ -455,8 +441,10 @@ subroutine read_ozndiag_header_nc( ftin, header_fix, header_nlev, new_hdr, istat header_nlev(k)%iouse = iuse_flag(k) end do - deallocate( pobs,gross,tnoise,iuse_flag ) - + if( allocated( pobs )) deallocate( pobs ) + if( allocated( gross )) deallocate( gross ) + if( allocated( tnoise )) deallocate( tnoise ) + if( allocated( iuse_flag )) deallocate( iuse_flag ) end subroutine read_ozndiag_header_nc @@ -511,8 +499,8 @@ subroutine read_ozndiag_header_bin( ftin, header_fix, header_nlev, new_hdr, ista if( header_fix%ireal /= IREAL_RESERVE ) then - print *, '### ERROR: UNEXPECTED DATA RECORD FORMAT' - print *, 'ireal =', header_fix%ireal + write(6,*) '### ERROR: UNEXPECTED DATA RECORD FORMAT' + write(6,*) 'ireal =', header_fix%ireal stop 99 endif @@ -524,6 +512,7 @@ subroutine read_ozndiag_header_bin( ftin, header_fix, header_nlev, new_hdr, ista !--- allocate if necessary + write(6,*) 'header_fix%nlevs, nlevs_last = ', header_fix%nlevs, nlevs_last if( header_fix%nlevs /= nlevs_last )then if( nlevs_last > 0 )then deallocate( header_nlev ) @@ -545,7 +534,11 @@ subroutine read_ozndiag_header_bin( ftin, header_fix, header_nlev, new_hdr, ista header_nlev(k)%err = err(k) header_nlev(k)%iouse = iouse(k) end do - deallocate (pob,grs,err,iouse) + + if( allocated( pob )) deallocate( pob ) + if( allocated( grs )) deallocate( grs ) + if( allocated( err )) deallocate( err ) + if( allocated( iouse )) deallocate( iouse ) end subroutine read_ozndiag_header_bin @@ -628,7 +621,7 @@ subroutine read_ozndiag_data_nc( ftin, header_fix, data_fix, data_nlev, data_ext logical :: test cur_idx = ncdiag_open_id( nopen_ncdiag ) - + !---------------------------------------------------------- ! The binary file read (the original version of the file ! read) is designed to be called in a loop, as it reads @@ -715,12 +708,13 @@ subroutine read_ozndiag_data_nc( ftin, header_fix, data_fix, data_nlev, data_ext data_fix(ii)%obstime = obstime(ii + ((ii-1)*nlevs) ) end do - deallocate( lat, lon, obstime ) + if( allocated( lat )) deallocate( lat ) + if( allocated( lon )) deallocate( lon ) + if( allocated( obstime )) deallocate( obstime ) !--------------------------------- ! load data_nlev structure ! - allocate( data_nlev( header_fix%nlevs,nrecords ) ) allocate( ozobs(nrecords) ) allocate( ozone_inv(nrecords) ) allocate( varinv(nrecords) ) @@ -769,23 +763,23 @@ subroutine read_ozndiag_data_nc( ftin, header_fix, data_fix, data_nlev, data_ext ! All vars used to read the file are dimensioned ! to nrecord, which is nobs * nlevs ! - do jj=0,ntobs-1 + do jj=1,ntobs-1 do ii=1,header_fix%nlevs - data_nlev(ii,jj)%ozobs = ozobs( ii + (jj * nlevs) ) - data_nlev(ii,jj)%ozone_inv = ozone_inv( ii + (jj * nlevs) ) - data_nlev(ii,jj)%varinv = varinv( ii + (jj * nlevs) ) - data_nlev(ii,jj)%sza = sza( ii + (jj * nlevs) ) - data_nlev(ii,jj)%fovn = fovn( ii + (jj * nlevs) ) - data_nlev(ii,jj)%toqf = toqf( ii + (jj * nlevs) ) + data_nlev(ii,jj)%ozobs = ozobs( ii + ((jj-1) * nlevs) ) + data_nlev(ii,jj)%ozone_inv = ozone_inv( ii + ((jj-1) * nlevs) ) + data_nlev(ii,jj)%varinv = varinv( ii + ((jj-1) * nlevs) ) + data_nlev(ii,jj)%sza = sza( ii + ((jj-1) * nlevs) ) + data_nlev(ii,jj)%fovn = fovn( ii + ((jj-1) * nlevs) ) + data_nlev(ii,jj)%toqf = toqf( ii + ((jj-1) * nlevs) ) end do end do - deallocate( ozobs ) - deallocate( ozone_inv ) - deallocate( varinv ) - deallocate( sza ) - deallocate( fovn ) - deallocate( toqf ) + if( allocated( ozobs )) deallocate( ozobs ) + if( allocated( ozone_inv )) deallocate( ozone_inv ) + if( allocated( varinv )) deallocate( varinv ) + if( allocated( sza )) deallocate( sza ) + if( allocated( fovn )) deallocate( fovn ) + if( allocated( toqf )) deallocate( toqf ) ncdiag_open_status(cur_idx)%nc_read = .true. @@ -831,6 +825,7 @@ subroutine read_ozndiag_data_bin( ftin, header_fix, data_fix, data_nlev, data_ex read(ftin,IOSTAT=iflag) ntobs write(6,*) ' READ 1, ntobs, iflag = ', ntobs, iflag + write(6,*) 'header_fix%nlevs, nlevs_last = ', header_fix%nlevs, nlevs_last if( header_fix%nlevs /= nlevs_last )then if( nlevs_last > 0 )then write(6,*) ' DEALLOCATING data_nlev, data_fix, data_mpi' @@ -845,8 +840,9 @@ subroutine read_ozndiag_data_bin( ftin, header_fix, data_fix, data_nlev, data_ex nlevs_last = header_fix%nlevs endif + write(6,*) 'iextra_last = ', iextra_last if (iextra_last > 0) then - deallocate (data_extra) + deallocate ( data_extra ) endif allocate( data_extra(header_fix%iextra,ntobs) ) @@ -869,7 +865,7 @@ subroutine read_ozndiag_data_bin( ftin, header_fix, data_fix, data_nlev, data_ex end do end do - deallocate(tmp_extra) + if( allocated( tmp_extra )) deallocate( tmp_extra ) endif do j=1,ntobs @@ -877,7 +873,7 @@ subroutine read_ozndiag_data_bin( ftin, header_fix, data_fix, data_nlev, data_ex data_fix(j)%lon = tmp_fix(2,j) data_fix(j)%obstime = tmp_fix(3,j) end do - deallocate(tmp_fix) + if( allocated( tmp_fix )) deallocate( tmp_fix ) do j=1,ntobs do i=1,header_fix%nlevs @@ -889,7 +885,7 @@ subroutine read_ozndiag_data_bin( ftin, header_fix, data_fix, data_nlev, data_ex data_nlev(i,j)%toqf = tmp_nlev(6,i,j) end do end do - deallocate(tmp_nlev) + if( allocated( tmp_nlev )) deallocate( tmp_nlev ) nlevs_last = -1 @@ -966,5 +962,5 @@ logical function verify_var_name_nc( test_name ) end function verify_var_name_nc -end module read_diag +end module oznmon_read_diag diff --git a/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_time.fd/time.f90 b/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_time.fd/time.f90 index d6402196a..d9010cdbd 100755 --- a/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_time.fd/time.f90 +++ b/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/sorc/oznmon_time.fd/time.f90 @@ -1,5 +1,5 @@ program main - use read_diag + use oznmon_read_diag use valid use kinds, only: i_kind diff --git a/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/ush/ozn_xtrct.sh b/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/ush/ozn_xtrct.sh index 5ee05253f..f05b0081b 100755 --- a/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/ush/ozn_xtrct.sh +++ b/util/Ozone_Monitor/nwprod/oznmon_shared.v2.0.0/ush/ozn_xtrct.sh @@ -75,7 +75,7 @@ fi # validate=".FALSE." if [[ $VALIDATE_DATA -eq 1 ]]; then - if [[ ! -e $ozn_val_file ]]; then + if [[ ! -e $ozn_val_file && ! -h $ozn_val_file ]]; then echo "WARNING: VALIDATE_DATA set to 1, but unable to locate $ozn_val_file" echo " Setting VALIDATE_DATA to 0/OFF" VALIDATE_DATA=0 @@ -153,8 +153,7 @@ else #--------------------------------------------------------------------------- - # NOTE: If ges && anl are to be processed then add an outer for loop on - # $ozn_ptype + # Outer loop over $ozn_ptype (default values 'ges', 'anl') # echo "ozn_ptype = $ozn_ptype" for ptype in ${ozn_ptype}; do diff --git a/util/Radiance_Monitor/nwprod/gdas_radmon.v3.0.0/jobs/JGDAS_VERFRAD b/util/Radiance_Monitor/nwprod/gdas_radmon.v3.0.0/jobs/JGDAS_ATMOS_VERFRAD similarity index 92% rename from util/Radiance_Monitor/nwprod/gdas_radmon.v3.0.0/jobs/JGDAS_VERFRAD rename to util/Radiance_Monitor/nwprod/gdas_radmon.v3.0.0/jobs/JGDAS_ATMOS_VERFRAD index c7f4cd45c..d73146f8c 100755 --- a/util/Radiance_Monitor/nwprod/gdas_radmon.v3.0.0/jobs/JGDAS_VERFRAD +++ b/util/Radiance_Monitor/nwprod/gdas_radmon.v3.0.0/jobs/JGDAS_ATMOS_VERFRAD @@ -7,10 +7,11 @@ echo `date` $0 `date -u` begin export PS4='$SECONDS + ' ############################### -# Specify NET and RUN name +# Specify NET, RUN, and COMPONENT name ############################## export NET=${NET:-gfs} export RUN=${RUN:-gdas} +export COMPONENT=${COMPONENT:-atmos} ########################################################### # obtain unique process id (pid) and make temp directories @@ -77,10 +78,10 @@ export p_cyc=`echo ${cdate} | cut -c9-10` # TANKverf - WHERE OUTPUT DATA WILL RESIDE ############################################# export TANKverf=${TANKverf:-${COMROOT}/${NET}/${envir}} -export TANKverf_rad=${TANKverf_rad:-${TANKverf}/${RUN}.${PDY}/${cyc}/radmon} -export TANKverf_radM1=${TANKverf_radM1:-${TANKverf}/${RUN}.${P_PDY}/${p_cyc}/radmon} +export TANKverf_rad=${TANKverf_rad:-${TANKverf}/${RUN}.${PDY}/${cyc}/$COMPONENT/radmon} +export TANKverf_radM1=${TANKverf_radM1:-${TANKverf}/${RUN}.${P_PDY}/${p_cyc}/$COMPONENT/radmon} export COM_IN=${COM_IN:-${COMROOT}/${NET}/${envir}} -export COMIN=${COMIN:-${COM_IN}/${RUN}.${PDY}/${cyc}} +export COMIN=${COMIN:-${COM_IN}/${RUN}.${PDY}/${cyc}/$COMPONENT} mkdir -p -m 775 $TANKverf_rad @@ -101,7 +102,7 @@ echo " " ######################################################## # Execute the script. -${RADMONSH:-${SCRgfs}/exgdas_vrfyrad.sh.ecf} ${PDY} ${cyc} +${RADMONSH:-${SCRgfs}/exgdas_atmos_verfrad.sh} ${PDY} ${cyc} err=$? if [[ $err -ne 0 ]] ; then diff --git a/util/Radiance_Monitor/nwprod/gdas_radmon.v3.0.0/scripts/exgdas_vrfyrad.sh.ecf b/util/Radiance_Monitor/nwprod/gdas_radmon.v3.0.0/scripts/exgdas_atmos_verfrad.sh similarity index 96% rename from util/Radiance_Monitor/nwprod/gdas_radmon.v3.0.0/scripts/exgdas_vrfyrad.sh.ecf rename to util/Radiance_Monitor/nwprod/gdas_radmon.v3.0.0/scripts/exgdas_atmos_verfrad.sh index 771a5a549..2afbc7e5d 100755 --- a/util/Radiance_Monitor/nwprod/gdas_radmon.v3.0.0/scripts/exgdas_vrfyrad.sh.ecf +++ b/util/Radiance_Monitor/nwprod/gdas_radmon.v3.0.0/scripts/exgdas_atmos_verfrad.sh @@ -2,7 +2,7 @@ ################################################################################ #### UNIX Script Documentation Block # . . -# Script name: exgdas_vrfyrad.sh.ecf +# Script name: exgdas_vrfyrad.sh # Script description: Runs data extract/validation for global radiance diag data # # Author: Ed Safford Org: NP23 Date: 2012-01-18 @@ -15,7 +15,7 @@ # >0 - some problem encountered # ################################################################################ -export scr=exgdas_vrfyrad.sh.ecf +export scr=exgdas_vrfyrad.sh msg="${scr} HAS STARTED" postmsg "$jlogfile" "$msg" @@ -34,6 +34,7 @@ export RUN_ENVIR=${RUN_ENVIR:-nco} export NET=${NET:-gfs} export RUN=${RUN:-gdas} export envir=${envir:-prod} +export COMPONENT=${COMPONENT:-atmos} # Command line arguments export PDY=${1:-${PDY:?}} @@ -42,7 +43,7 @@ export cyc=${2:-${cyc:?}} # Directories export DATA=${DATA:-$(pwd)} export COM_IN=${COMROOT}/${NET}/${envir} -export COMIN=${COMIN:-$COM_IN/${RUN}.${PDY}} +export COMIN=${COMIN:-$COM_IN/${RUN}.${PDY}/${cyc}/$COMPONENT} # Filenames @@ -232,7 +233,7 @@ elif [[ $rc_time -ne 0 ]]; then fi if [[ "$VERBOSE" = "YES" ]]; then - echo "end exgdas_vrfyrad.sh.ecf, exit value = ${err}" + echo "end exgdas_vrfyrad.sh, exit value = ${err}" fi echo "${scr} HAS ENDED"