diff --git a/env/HERA.env b/env/HERA.env index 6031433fd9..e0502e9fd8 100755 --- a/env/HERA.env +++ b/env/HERA.env @@ -38,12 +38,12 @@ if [ $step = "prep" -o $step = "prepbufr" ]; then export BACK="NO" export sys_tp="HERA" -elif [ $step = "waveinit" -o $step = "waveprep" -o $step = "wavepostsbs" ]; then - +elif [ $step = "waveinit" -o $step = "waveprep" -o $step = "wavepostsbs" -o $step = "wavepostbndpnt" -o $step = "wavepostpnt"]; then export mpmd="--multi-prog" export CFP_MP="YES" if [ $step = "waveprep" ]; then export MP_PULSE=0 ; fi - + export wavempexec=${launcher} + export wave_mpmd=${mpmd} elif [ $step = "anal" ]; then diff --git a/env/JET.env b/env/JET.env index 2dea123612..3a24c71b7e 100755 --- a/env/JET.env +++ b/env/JET.env @@ -37,9 +37,11 @@ if [ $step = "prep" -o $step = "prepbufr" ]; then export BACK=${BACK:-"YES"} export sys_tp="Cray-CS400" -elif [ $step = "waveprep" ]; then +elif [ $step = "waveinit" -o $step = "waveprep" -o $step = "wavepostsbs" -o $step = "wavepostbndpnt" -o $step = "wavepostpnt"]; then - export MP_PULSE=0 + if [ $step = "waveprep" ]; then export MP_PULSE=0 ; fi + export wavempexec=${launcher} + export wave_mpmd=${mpmd} elif [ $step = "anal" ]; then diff --git a/env/WCOSS_C.env b/env/WCOSS_C.env index 93bd98ab60..b0343ffda9 100755 --- a/env/WCOSS_C.env +++ b/env/WCOSS_C.env @@ -37,9 +37,10 @@ if [ $step = "prep" -o $step = "prepbufr" ]; then export POE=${POE:-"YES"} export sys_tp="Cray-XC40" -elif [ $step = "waveprep" ]; then - - export MP_PULSE=0 +elif [ $step = "waveinit" -o $step = "waveprep" -o $step = "wavepostsbs" -o $step = "wavepostbndpnt" -o $step = "wavepostpnt"]; then + if [ $step = "waveprep" ]; then export MP_PULSE=0 ; fi + export wavempexec=${launcher} + export wave_mpmd=${mpmd} elif [ $step = "anal" ]; then diff --git a/env/WCOSS_DELL_P3.env b/env/WCOSS_DELL_P3.env index ef891347d6..80622a2e56 100755 --- a/env/WCOSS_DELL_P3.env +++ b/env/WCOSS_DELL_P3.env @@ -45,9 +45,11 @@ if [ $step = "prep" -o $step = "prepbufr" ]; then export BACK=${BACK:-"YES"} export sys_tp="Dell-p3" -elif [ $step = "waveprep" ]; then +elif [ $step = "waveinit" -o $step = "waveprep" -o $step = "wavepostsbs" -o $step = "wavepostbndpnt" -o $step = "wavepostpnt"]; then - export MP_PULSE=0 + if [ $step = "waveprep" ]; then export MP_PULSE=0 ; fi + export wavempexec=${launcher} + export wave_mpmd=${mpmd} elif [ $step = "anal" ]; then diff --git a/jobs/JGLOBAL_WAVE_POST_BNDPNT b/jobs/JGLOBAL_WAVE_POST_BNDPNT new file mode 100755 index 0000000000..b908079e49 --- /dev/null +++ b/jobs/JGLOBAL_WAVE_POST_BNDPNT @@ -0,0 +1,103 @@ +#!/bin/bash + +date +export RUN_ENVIR=${RUN_ENVIR:-"nco"} +export PS4=' $SECONDS + ' +set -x -e + +############################# +# Source relevant config files +############################# +configs="base wave wavepostsbs wavepostbndpnt" +export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} +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 wavepostbndpnt +status=$? +[[ $status -ne 0 ]] && exit $status + +# PATH for working directory +export NET=${NET:-gfs} +export RUN=${RUN:-gfs} +export COMPONENT=${COMPONENT:-wave} + +export HOMEgefs=${HOMEgefs:-$NWROOT/$NET.${gefs_ver}} +export HOMEgfs=${HOMEgfs:-$NWROOT/$NET.${gfs_ver}} + +# Add default errchk = err_chk +export errchk=${errchk:-err_chk} + +# Create and go to DATA directory +export DATA=${DATA:-${DATAROOT:?}/${jobid}} +mkdir -p $DATA +cd $DATA + +export cyc=${cyc:-00} +export cycle=${cycle:-t${cyc}z} + +# Set PDY +setpdy.sh +sh ./PDY + +export pgmout=OUTPUT.$$ + +export MP_PULSE=0 + +# Path to HOME Directory +export FIXwave=${FIXwave:-$HOMEgfs/fix/fix_wave_${NET}} +export PARMwave=${PARMwave:-$HOMEgfs/parm/wave} +export USHwave=${USHwave:-$HOMEgfs/ush} +export EXECwave=${EXECwave:-$HOMEgfs/exec} + +# Set COM Paths and GETGES environment +if [ $RUN_ENVIR = "nco" ]; then + export ROTDIR=${COMROOT:?}/$NET/$envir +fi +export COMIN=${COMIN:-${ROTDIR}/${CDUMP}.${PDY}/${cyc}/$COMPONENT} +export COMOUT=${COMOUT:-${ROTDIR}/${CDUMP}.${PDY}/${cyc}/$COMPONENT} + +export COMINice=${COMINice:-${COMROOTp2}/omb/prod} +export COMINwnd=${COMINwnd:-${COMROOT}/gfs/prod} +export COMIN_WAV_CUR=${COMIN_WAV_CUR:-${COMROOTp2}/rtofs/prod} + +mkdir -p $COMOUT/station + +env | sort + +# Set wave model ID tag to include member number +# if ensemble; waveMEMB var empty in deterministic +# Set wave model ID tag to include member number +# if ensemble; waveMEMB var empty in deterministic +membTAG='p' +if [ "${waveMEMB}" == "00" ]; then membTAG='c'; fi +export membTAG +export WAV_MOD_TAG=${CDUMP}wave${waveMEMB} + +export CFP_VERBOSE=1 + +# Execute the Script +$HOMEgfs/scripts/exgfs_wave_post_bndpnt.sh +err=$? +if [ $err -ne 0 ]; then + msg="FATAL ERROR: ex-script of GWES_POST failed!" +else + msg="$job completed normally!" +fi +postmsg "$jlogfile" "$msg" + +########################################## +# Remove the Temporary working directory +########################################## +cd $DATAROOT +[[ $KEEPDATA = "NO" ]] && rm -rf $DATA + +date +exit 0 diff --git a/jobs/JGLOBAL_WAVE_POST_PNT b/jobs/JGLOBAL_WAVE_POST_PNT new file mode 100755 index 0000000000..c3e113eed1 --- /dev/null +++ b/jobs/JGLOBAL_WAVE_POST_PNT @@ -0,0 +1,103 @@ +#!/bin/bash + +date +export RUN_ENVIR=${RUN_ENVIR:-"nco"} +export PS4=' $SECONDS + ' +set -x -e + +############################# +# Source relevant config files +############################# +configs="base wave wavepostsbs wavepostpnt" +export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} +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 wavepostpnt +status=$? +[[ $status -ne 0 ]] && exit $status + +# PATH for working directory +export NET=${NET:-gfs} +export RUN=${RUN:-gfs} +export COMPONENT=${COMPONENT:-wave} + +export HOMEgefs=${HOMEgefs:-$NWROOT/$NET.${gefs_ver}} +export HOMEgfs=${HOMEgfs:-$NWROOT/$NET.${gfs_ver}} + +# Add default errchk = err_chk +export errchk=${errchk:-err_chk} + +# Create and go to DATA directory +export DATA=${DATA:-${DATAROOT:?}/${jobid}} +mkdir -p $DATA +cd $DATA + +export cyc=${cyc:-00} +export cycle=${cycle:-t${cyc}z} + +# Set PDY +setpdy.sh +sh ./PDY + +export pgmout=OUTPUT.$$ + +export MP_PULSE=0 + +# Path to HOME Directory +export FIXwave=${FIXwave:-$HOMEgfs/fix/fix_wave_${NET}} +export PARMwave=${PARMwave:-$HOMEgfs/parm/wave} +export USHwave=${USHwave:-$HOMEgfs/ush} +export EXECwave=${EXECwave:-$HOMEgfs/exec} + +# Set COM Paths and GETGES environment +if [ $RUN_ENVIR = "nco" ]; then + export ROTDIR=${COMROOT:?}/$NET/$envir +fi +export COMIN=${COMIN:-${ROTDIR}/${CDUMP}.${PDY}/${cyc}/$COMPONENT} +export COMOUT=${COMOUT:-${ROTDIR}/${CDUMP}.${PDY}/${cyc}/$COMPONENT} + +export COMINice=${COMINice:-${COMROOTp2}/omb/prod} +export COMINwnd=${COMINwnd:-${COMROOT}/gfs/prod} +export COMIN_WAV_CUR=${COMIN_WAV_CUR:-${COMROOTp2}/rtofs/prod} + +mkdir -p $COMOUT/station + +env | sort + +# Set wave model ID tag to include member number +# if ensemble; waveMEMB var empty in deterministic +# Set wave model ID tag to include member number +# if ensemble; waveMEMB var empty in deterministic +membTAG='p' +if [ "${waveMEMB}" == "00" ]; then membTAG='c'; fi +export membTAG +export WAV_MOD_TAG=${CDUMP}wave${waveMEMB} + +export CFP_VERBOSE=1 + +# Execute the Script +$HOMEgfs/scripts/exgfs_wave_post_pnt.sh +err=$? +if [ $err -ne 0 ]; then + msg="FATAL ERROR: ex-script of GWES_POST failed!" +else + msg="$job completed normally!" +fi +postmsg "$jlogfile" "$msg" + +########################################## +# Remove the Temporary working directory +########################################## +cd $DATAROOT +[[ $KEEPDATA = "NO" ]] && rm -rf $DATA + +date +exit 0 diff --git a/jobs/JGLOBAL_WAVE_POST_SBS b/jobs/JGLOBAL_WAVE_POST_SBS index 87cf5e074e..6a88f4d24a 100755 --- a/jobs/JGLOBAL_WAVE_POST_SBS +++ b/jobs/JGLOBAL_WAVE_POST_SBS @@ -69,12 +69,6 @@ export COMINwnd=${COMINwnd:-${COMROOT}/gfs/prod} export COMIN_WAV_CUR=${COMIN_WAV_CUR:-${COMROOTp2}/rtofs/prod} mkdir -p $COMOUT/gridded -mkdir -p $COMOUT/station -mkdir -p $COMOUT/stats - -# Set mpi serial command -export wavempexec=${launcher:-"mpirun -n"} -export wave_mpmd=${mpmd:-"cfp"} env | sort @@ -90,7 +84,7 @@ export WAV_MOD_TAG=${CDUMP}wave${waveMEMB} export CFP_VERBOSE=1 # Execute the Script -$HOMEgfs/scripts/exgfs_wave_post_sbs.sh +$HOMEgfs/scripts/exgfs_wave_post_gridded_sbs.sh err=$? if [ $err -ne 0 ]; then msg="FATAL ERROR: ex-script of GWES_POST failed!" diff --git a/jobs/JGLOBAL_WAVE_PREP b/jobs/JGLOBAL_WAVE_PREP index 59e2932ca9..9c6c8a625f 100755 --- a/jobs/JGLOBAL_WAVE_PREP +++ b/jobs/JGLOBAL_WAVE_PREP @@ -71,30 +71,22 @@ export COMOUT=${COMOUT:-${ROTDIR}/${CDUMP}.${PDY}/${cyc}/$COMPONENT} if [ $RUN_ENVIR = "nco" ]; then export COMIN_WAV_ICE=${COMIN_WAV_ICE:-$(compath.py gfs/prod)}/${CDUMP}.${PDY}/${cyc}/atmos - export COMIN_WAV_WND=${COMIN_WAV_WND:-$(compath.py gfs/prod)}/${CDUMP}.${PDY}/${cyc}/atmos export COMIN_WAV_CUR=${COMIN_WAV_CUR:-$(compath.py ${WAVECUR_DID}/prod)}/${WAVECUR_DID}.${RPDY} if [ ! -d $COMIN_WAV_CUR ]; then export RPDY=`$NDATE -24 ${PDY}00 | cut -c1-8` export COMIN_WAV_CUR=$(compath.py ${WAVECUR_DID}/prod)/${WAVECUR_DID}.${RPDY} fi else - if [ ! -d $DMPDIR/${WAVECUR_DID}.${RPDY} ]; then export RPDY=`$NDATE -24 ${PDY}00 | cut -c1-8`; fi if [ ! -L $ROTDIR/${WAVECUR_DID}.${RPDY} ]; then # Check if symlink already exists in ROTDIR $NLN $DMPDIR/${WAVECUR_DID}.${RPDY} $ROTDIR/${WAVECUR_DID}.${RPDY} fi if [ ! -L $ROTDIR/${CDUMP}.${PDY}/${cyc}/atmos/${WAVICEFILE} ]; then # Check if symlink already exists in ROTDIR $NLN $DMPDIR/$CDUMP.${PDY}/$cyc/${WAVICEFILE} $ROTDIR/$CDUMP.${PDY}/$cyc/atmos/${WAVICEFILE} fi - export COMIN_OBS=${COMIN_OBS:-$ROTDIR/$RUN.$PDY/$cyc/atmos} - export COMIN_WAV_ICE=${COMIN_OBS} - export COMIN_WAV_WND=${COMIN_OBS} + export COMIN_WAV_ICE=${COMIN_WAV_ICE:-$ROTDIR/$RUN.$PDY/$cyc/atmos} export COMIN_WAV_CUR=${ROTDIR}/${WAVECUR_DID}.${RPDY} fi -# Set mpi serial command -export wavempexec=${launcher:-"mpirun -n"} -export wave_mpmd=${mpmd:-"cfp"} - # Execute the Script $HOMEgfs/scripts/exgfs_wave_prep.sh diff --git a/jobs/rocoto/wavepostbndpnt.sh b/jobs/rocoto/wavepostbndpnt.sh new file mode 100755 index 0000000000..f1781db82f --- /dev/null +++ b/jobs/rocoto/wavepostbndpnt.sh @@ -0,0 +1,21 @@ +#!/bin/ksh -x + +############################################################### +echo +echo "=============== START TO SOURCE FV3GFS WORKFLOW MODULES ===============" +. $HOMEgfs/ush/load_fv3gfs_modules.sh +status=$? +[[ $status -ne 0 ]] && exit $status + +############################################################### +echo +echo "=============== START TO RUN WAVE_POST_BNDPNT ===============" +# Execute the JJOB +$HOMEgfs/jobs/JGLOBAL_WAVE_POST_BNDPNT +status=$? +exit $status + +############################################################### +# Force Exit out cleanly +if [ ${KEEPDATA:-"NO"} = "NO" ] ; then rm -rf $DATAROOT ; fi +exit 0 diff --git a/jobs/rocoto/wavepostpnt.sh b/jobs/rocoto/wavepostpnt.sh new file mode 100755 index 0000000000..a8ff035644 --- /dev/null +++ b/jobs/rocoto/wavepostpnt.sh @@ -0,0 +1,21 @@ +#!/bin/ksh -x + +############################################################### +echo +echo "=============== START TO SOURCE FV3GFS WORKFLOW MODULES ===============" +. $HOMEgfs/ush/load_fv3gfs_modules.sh +status=$? +[[ $status -ne 0 ]] && exit $status + +############################################################### +echo +echo "=============== START TO RUN WAVE_POST_PNT ===============" +# Execute the JJOB +$HOMEgfs/jobs/JGLOBAL_WAVE_POST_PNT +status=$? +exit $status + +############################################################### +# Force Exit out cleanly +if [ ${KEEPDATA:-"NO"} = "NO" ] ; then rm -rf $DATAROOT ; fi +exit 0 diff --git a/modulefiles/module_base.wcoss_dell_p3 b/modulefiles/module_base.wcoss_dell_p3 index 7a3689669f..13e329b0b5 100644 --- a/modulefiles/module_base.wcoss_dell_p3 +++ b/modulefiles/module_base.wcoss_dell_p3 @@ -43,3 +43,6 @@ module load g2tmpl/1.6.0 # Load FSU Genesis module module use -a /gpfs/dell2/emc/modeling/noscrub/emc.glopara/git/tracker/ens_tracker.v1.1.15.3/ush/FSUgenesisPY/modulefiles module load tclogg + +# waveprep +module load cdo/1.9.8 diff --git a/parm/config/config.resources b/parm/config/config.resources index 73b0ce77e3..c3101e4721 100755 --- a/parm/config/config.resources +++ b/parm/config/config.resources @@ -10,7 +10,7 @@ if [ $# -ne 1 ]; then echo "argument can be any one of the following:" echo "anal analcalc analdiag gldas fcst post vrfy metp arch echgres" echo "eobs ediag eomg eupd ecen esfc efcs epos earc" - echo "waveinit waveprep wavepostsbs" + echo "waveinit waveprep wavepostsbs wavepostbndpnt wavepostpnt" echo "wavegempak waveawipsbulls waveawipsgridded" echo "postsnd awips gempak" echo "wafs wafsgrib2 wafsblending wafsgrib20p25 wafsblending0p25 wafsgcip" @@ -53,7 +53,7 @@ elif [ $step = "waveinit" ]; then elif [ $step = "waveprep" ]; then export wtime_waveprep="00:30:00" - export npe_waveprep=115 + export npe_waveprep=65 export nth_waveprep=1 export npe_node_waveprep=$(echo "$npe_node_max / $nth_waveprep" | bc) export NTASKS=${npe_waveprep} @@ -61,11 +61,27 @@ elif [ $step = "waveprep" ]; then elif [ $step = "wavepostsbs" ]; then export wtime_wavepostsbs="06:00:00" - export npe_wavepostsbs=280 + export npe_wavepostsbs=10 export nth_wavepostsbs=1 export npe_node_wavepostsbs=$(echo "$npe_node_max / $nth_wavepostsbs" | bc) export NTASKS=${npe_wavepostsbs} +elif [ $step = "wavepostbndpnt" ]; then + + export wtime_wavepostbndpnt="02:00:00" + export npe_wavepostbndpnt=56 + export nth_wavepostbndpnt=1 + export npe_node_wavepostbndpnt=$(echo "$npe_node_max / $nth_wavepostbndpnt" | bc) + export NTASKS=${npe_wavepostbndpnt} + +elif [ $step = "wavepostpnt" ]; then + + export wtime_wavepostpnt="02:00:00" + export npe_wavepostpnt=56 + export nth_wavepostpnt=1 + export npe_node_wavepostpnt=$(echo "$npe_node_max / $nth_wavepostpnt" | bc) + export NTASKS=${npe_wavepostpnt} + elif [ $step = "wavegempak" ]; then export wtime_wavegempak="01:00:00" diff --git a/parm/config/config.wavepostbndpnt b/parm/config/config.wavepostbndpnt new file mode 100755 index 0000000000..5ec96a697f --- /dev/null +++ b/parm/config/config.wavepostbndpnt @@ -0,0 +1,11 @@ +#!/bin/ksh -x + +########## config.wavepostbndpnt ########## +# Wave steps specific + +echo "BEGIN: config.wavepostbndpnt" + +# Get task specific resources +. $EXPDIR/config.resources wavepostbndpnt + +echo "END: config.wavepostbndpnt" diff --git a/parm/config/config.wavepostpnt b/parm/config/config.wavepostpnt new file mode 100755 index 0000000000..276ca230a6 --- /dev/null +++ b/parm/config/config.wavepostpnt @@ -0,0 +1,11 @@ +#!/bin/ksh -x + +########## config.wavepostpnt ########## +# Wave steps specific + +echo "BEGIN: config.wavepostpnt" + +# Get task specific resources +. $EXPDIR/config.resources wavepostpnt + +echo "END: config.wavepostpnt" diff --git a/parm/config/config.waveprep b/parm/config/config.waveprep index f400a7f934..aaf8675283 100755 --- a/parm/config/config.waveprep +++ b/parm/config/config.waveprep @@ -37,7 +37,7 @@ export WAV_CUR_HF_FH=${WAV_CUR_HF_FH:-0} # Constant DT for GFSv16 from getgo export WAV_CUR_CDO_SMOOTH="NO" # Location of CDO module -export CDO_ROOT=${CDO_ROOT:-/gpfs/dell1/nco/ops/nwprod/rtofs_shared/rtofs_cdo.v1.6.0} +export CDO_ROOT=${CDO_ROOT:-/usrx/local/dev/packages/cdo/1.9.8} if [ "${WW3ICEINP}" = "YES" ]; then export WAVICEFILE=${CDUMP}.t${cyc}z.seaice.5min.grib2 diff --git a/scripts/exgfs_wave_post_bndpnt.sh b/scripts/exgfs_wave_post_bndpnt.sh new file mode 100755 index 0000000000..8f5b9c6e05 --- /dev/null +++ b/scripts/exgfs_wave_post_bndpnt.sh @@ -0,0 +1,552 @@ +#!/bin/bash +# +################################################################################ +# +# UNIX Script Documentation Block +# Script name: exgfs_wave_post_bndpnt.sh +# Script description: Creates output products from binary WW3 data +# +# Author: Jose-Henrique Alves Org: NCEP/EMC Date: 2019-12-06 +# Abstract: This script is the postprocessor for the wave component in GFS. +# This version runs side-by-side with the GFS fcst step. +# It executes several scripts forpreparing and creating output data +# as follows: +# +# wave_outp_spec.sh : generates spectral data for output locations. +# wave_tar.sh : tars the spectral and bulletin multiple files +# +# Script history log: +# 2019-12-06 J-Henrique Alves: First Version adapted from HTolman post.sh 2007 +# 2020-06-10 J-Henrique Alves: Porting to R&D machine Hera +# 2020-07-30 Jessica Meixner: Points only - no gridded data +# +# $Id$ +# +# Attributes: +# Language: Bourne-again (Bash) Shell +# Machine: WCOSS-DELL-P3 +# +############################################################################### +# +# --------------------------------------------------------------------------- # +# 0. Preparations +# 0.a Basic modes of operation + + set -x + # Use LOUD variable to turn on/off trace. Defaults to YES (on). + export LOUD=${LOUD:-YES}; [[ $LOUD = yes ]] && export LOUD=YES + [[ "$LOUD" != YES ]] && set +x + + cd $DATA + + # Set wave model ID tag to include member number + # if ensemble; waveMEMB var empty in deterministic + export WAV_MOD_TAG=${CDUMP}wave${waveMEMB} + FHMAX_WAV_IBP=192 + + postmsg "$jlogfile" "HAS BEGUN on `hostname`" + + msg="Starting WAVE POSTPROCESSOR SCRIPT for $WAV_MOD_TAG" + postmsg "$jlogfile" "$msg" + + set +x + echo ' ' + echo ' *********************************' + echo ' *** WAVE POSTPROCESSOR SCRIPT ***' + echo ' *********************************' + echo ' ' + echo "Starting at : `date`" + echo '-------------' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + +# Script will run only if pre-defined NTASKS +# The actual work is distributed over these tasks. + if [ -z ${NTASKS} ] + then + echo "FATAL ERROR: requires NTASKS to be set " + err=1; export err;${errchk} + exit $err + fi + +# 0.c Defining model grids + + waveuoutpGRD=${waveuoutpGRD:?buoyNotSet} + +# 0.c.4 Define a temporary directory for storing ascii point output files +# and flush it + + export STA_DIR=$DATA/station_ascii_files + if [ -d $STA_DIR ] + then + rm -rf ${STA_DIR} + fi + mkdir -p ${STA_DIR} + mkdir -p ${STA_DIR}/spec + mkdir -p ${STA_DIR}/ibp + + set +x + echo ' ' + echo 'Grid information :' + echo '-------------------' + echo " Output points : $waveuoutpGRD" + echo ' ' + [[ "$LOUD" = YES ]] && set -x + +# --------------------------------------------------------------------------- # +# 1. Get files that are used by most child scripts + + export DOIBP_WAV='YES' # Input boundary points + export DOPNT_WAV='YES' # Station data + export DOSPC_WAV='NO' # Spectral post + + exit_code=0 + + set +x + echo ' ' + echo 'Preparing input files :' + echo '-----------------------' + [[ "$LOUD" = YES ]] && set -x + +# 1.a Model definition files and output files (set up using poe) + +# 1.a.1 Set up the parallel command tasks + + rm -f cmdfile + touch cmdfile + chmod 744 cmdfile + + [[ "$LOUD" = YES ]] && set -x + +# Copy model definition files + for grdID in $waveuoutpGRD + do + if [ -f "$COMIN/rundata/${CDUMP}wave.mod_def.${grdID}" ] + then + set +x + echo " Mod def file for $grdID found in ${COMIN}/rundata. copying ...." + [[ "$LOUD" = YES ]] && set -x + + cp -f $COMIN/rundata/${CDUMP}wave.mod_def.${grdID} mod_def.$grdID + iloop=`expr $iloop + 1` + fi + done + + for grdID in $waveuoutpGRD + do + if [ ! -f mod_def.$grdID ] + then + set +x + echo ' ' + echo '*************************************************** ' + echo " FATAL ERROR : NO MOD_DEF FILE mod_def.$grdID " + echo '*************************************************** ' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + postmsg "$jlogfile" "FATAL ERROR : NO MOD_DEF file mod_def.$grdID" + err=2; export err;${errchk} + exit $err + else + set +x + echo "File mod_def.$grdID found. Syncing to all nodes ..." + [[ "$LOUD" = YES ]] && set -x + fi + done + +# 1.c Output locations file + + rm -f buoy.loc + + if [ -f $FIXwave/wave_${NET}.buoys ] + then + cp -f $FIXwave/wave_${NET}.buoys buoy.loc.temp +# Reverse grep to exclude IBP points + sed -n '/^\$.*/!p' buoy.loc.temp | grep -v IBP > buoy.loc + fi + + if [ -s buoy.loc ] + then + set +x + echo " buoy.loc and buoy.ibp copied and processed ($FIXwave/wave_${NET}.buoys)." + [[ "$LOUD" = YES ]] && set -x + else + set +x + echo ' ' + echo '************************************* ' + echo ' FATAL ERROR : NO BUOY LOCATION FILE ' + echo '************************************* ' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + postmsg "$jlogfile" "FATAL ERROR : NO BUOY LOCATION FILE" + err=3; export err;${errchk} + exit $err + DOPNT_WAV='NO' + DOSPC_WAV='NO' + fi + + if [ "$DOIBP_WAV" = 'YES' ] + then + sed -n '/^\$.*/!p' buoy.loc.temp | grep IBP > buoy.ibp + if [ -s buoy.ibp ]; then + set +x + echo " buoy.loc and buoy.ibp copied and processed ($FIXwave/wave_${NET}.buoys)." + [[ "$LOUD" = YES ]] && set -x + else + set +x + echo ' ' + echo '***************************************** ' + echo ' FATAL ERROR : NO IBP BUOY LOCATION FILE ' + echo '***************************************** ' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + postmsg "$jlogfile" "FATAL ERROR : NO IBP BUOY LOCATION FILE" + err=4; export err;${errchk} + exit $err + DOIBP_WAV='NO' + fi + fi + +# 1.d Input template files + + if [ -f $FIXwave/ww3_outp_spec.inp.tmpl ] + then + cp -f $FIXwave/ww3_outp_spec.inp.tmpl ww3_outp_spec.inp.tmpl + fi + + if [ -f ww3_outp_spec.inp.tmpl ] + then + set +x + echo " ww3_outp_spec.inp.tmpl copied. Syncing to all grids ..." + [[ "$LOUD" = YES ]] && set -x + else + set +x + echo ' ' + echo '*********************************************** ' + echo '*** ERROR : NO TEMPLATE FOR SPEC INPUT FILE *** ' + echo '*********************************************** ' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + postmsg "$jlogfile" "NON-FATAL ERROR : NO TEMPLATE FOR SPEC INPUT FILE" + exit_code=3 + fi + + +# 1.e Getting buoy information for points + + ymdh=`$NDATE -${WAVHINDH} $CDATE` + tstart="`echo $ymdh | cut -c1-8` `echo $ymdh | cut -c9-10`0000" + dtspec=3600. # default time step (not used here) + sed -e "s/TIME/$tstart/g" \ + -e "s/DT/$dtspec/g" \ + -e "s/POINT/1/g" \ + -e "s/ITYPE/0/g" \ + -e "s/FORMAT/F/g" \ + ww3_outp_spec.inp.tmpl > ww3_outp.inp + + ln -s mod_def.$waveuoutpGRD mod_def.ww3 + YMD=$(echo $CDATE | cut -c1-8) + HMS="$(echo $CDATE | cut -c9-10)0000" + if [ -f $COMIN/rundata/${WAV_MOD_TAG}.out_pnt.${waveuoutpGRD}.${YMD}.${HMS} ] + then + ln -s $COMIN/rundata/${WAV_MOD_TAG}.out_pnt.${waveuoutpGRD}.${YMD}.${HMS} ./out_pnt.${waveuoutpGRD} + else + echo '*************************************************** ' + echo " FATAL ERROR : NO RAW POINT OUTPUT FILE out_pnt.${waveuoutpGRD}.${YMD}.${HMS} " + echo '*************************************************** ' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + echo "$WAV_MOD_TAG post $waveuoutpGRD $CDATE $cycle : field output missing." + postmsg "$jlogfile" "FATAL ERROR : NO RAW POINT OUTPUT FILE out_pnt.${waveuoutpGRD}.${YMD}.${HMS}" + err=5; export err;${errchk} + fi + + rm -f buoy_tmp.loc buoy_log.ww3 ww3_oup.inp + ln -fs ./out_pnt.${waveuoutpGRD} ./out_pnt.ww3 + ln -fs ./mod_def.${waveuoutpGRD} ./mod_def.ww3 + $EXECwave/ww3_outp > buoy_lst.loc 2>&1 + err=$? + + if [ "$err" != '0' ] && [ ! -f buoy_log.ww3 ] + then + pgm=wave_post + msg="ABNORMAL EXIT: ERROR IN ww3_outp" + postmsg "$jlogfile" "$msg" + set +x + echo ' ' + echo '******************************************** ' + echo '*** FATAL ERROR : ERROR IN ww3_outp *** ' + echo '******************************************** ' + echo ' ' + cat buoy_tmp.loc + echo "$WAV_MOD_TAG post $date $cycle : buoy log file failed to be created." + echo $msg + [[ "$LOUD" = YES ]] && set -x + err=6;export err;${errchk} + exit $err + fi + + +# Create new buoy_log.ww3 including all IBP files + cat buoy.ibp | awk '{print $3}' | sed 's/'\''//g' > ibp_tags + grep -F -f ibp_tags buoy_log.ww3 > buoy_log.tmp + rm -f buoy_log.ibp + mv buoy_log.tmp buoy_log.ibp + + grep -F -f ibp_tags buoy_lst.loc > buoy_tmp1.loc + sed '$d' buoy_tmp1.loc > buoy_tmp2.loc + ibpoints=`awk '{ print $1 }' buoy_tmp2.loc` + Nibp=`wc buoy_tmp2.loc | awk '{ print $1 }'` + rm -f buoy_tmp1.loc buoy_tmp2.loc + if [ -s buoy_log.ibp ] + then + set +x + echo 'IBP log file created. Syncing to all nodes ...' + [[ "$LOUD" = YES ]] && set -x + else + set +x + echo ' ' + echo '********************************************** ' + echo '*** FATAL ERROR : NO IBP LOG FILE CREATED *** ' + echo '********************************************** ' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + echo "$WAV_MOD_TAG post $date $cycle : ibp log file missing." + postmsg "$jlogfile" "FATAL ERROR : NO IBP LOG FILE GENERATED FOR SPEC AND BULLETIN FILES" + err=8;export err;${errchk} + exit $err + fi + +# 1.f Data summary + + set +x + echo ' ' + echo " Input files read and processed at : `date`" + echo ' ' + echo ' Data summary : ' + echo ' ---------------------------------------------' + echo " Sufficient data for Input Boundary Points : $DOIBP_WAV ($Nibp points)" + echo ' ' + [[ "$LOUD" = YES ]] && set -x + +# --------------------------------------------------------------------------- # +# 2. Make consolidated grib2 file for side-by-side grids and interpolate +# onto extended grids +# +# 2.a Command file set-up + + set +x + echo ' Making command file for wave boundary points ' + [[ "$LOUD" = YES ]] && set -x + + rm -f cmdfile + touch cmdfile + chmod 744 cmdfile + +# 1.a.2 Loop over forecast time to generate post files +# When executed side-by-side, serial mode (cfp when run after the fcst step) + fhr=$FHMIN_WAV + fhrp=$fhr + while [ $fhr -le $FHMAX_WAV_IBP ]; do + + echo " Starting processing wave boundary points for FHR=$fhr at: `date`" + + ymdh=`$NDATE $fhr $CDATE` + YMD=$(echo $ymdh | cut -c1-8) + HMS="$(echo $ymdh | cut -c9-10)0000" + YMDHMS=${YMD}${HMS} + FH3=$(printf %03i $fhr) + + fcmdnow=cmdfile.${FH3} + fcmdigrd=icmdfile.${FH3} + if [ "${DOPNT_WAV}" = "YES" ]; then + fcmdpnt=pcmdfile.${FH3} + fcmdibp=ibpcmdfile.${FH3} + fi + rm -f ${fcmdnow} ${fcmdigrd} ${fcmdpnt} ${fcmdibp} + touch ${fcmdnow} ${fcmdigrd} ${fcmdpnt} ${fcmdibp} + mkdir output_$YMDHMS + cd output_$YMDHMS + +# Create instances of directories for spec and gridded output + export SPECDATA=${DATA}/output_$YMDHMS + ln -fs $DATA/mod_def.${waveuoutpGRD} mod_def.ww3 + +# Point output part (can be split or become meta-task to reduce resource usage) + if [ $fhr = $fhrp ] + then + pfile=$COMIN/rundata/${WAV_MOD_TAG}.out_pnt.${waveuoutpGRD}.${YMD}.${HMS} + if [ -f ${pfile} ] + then + ln -fs ${pfile} ./out_pnt.${waveuoutpGRD} + else + echo " FATAL ERROR : NO RAW POINT OUTPUT FILE out_pnt.$waveuoutpGRD.${YMD}.${HMS} + echo ' ' + [[ "$LOUD" = YES ]] && set -x + postmsg "$jlogfile" "FATAL ERROR : NO RAW POINT OUTPUT FILE out_pnt.$waveuoutpGRD.${YMD}.${HMS} + err=9; export err;${errchk} + exit $err + fi + + export dtspec=3600. + for buoy in $ibpoints + do + echo "$USHwave/wave_outp_spec.sh $buoy $ymdh ibp > ibp_$buoy.out 2>&1" >> ${fcmdnow} + done + + fi + + if [ ${CFP_MP:-"NO"} = "YES" ]; then + nfile=0 + ifile=0 + iline=1 + ifirst='yes' + nlines=$( wc -l ${fcmdnow} | awk '{print $1}' ) + while [ $iline -le $nlines ]; do + line=$( sed -n ''$iline'p' ${fcmdnow} ) + if [ -z "$line" ]; then + break + else + if [ "$ifirst" = 'yes' ]; then + echo "#!/bin/sh" > cmdmfile.$nfile + echo "$nfile cmdmfile.$nfile" >> cmdmprog + chmod 744 cmdmfile.$nfile + fi + echo $line >> cmdmfile.$nfile + nfile=$(( nfile + 1 )) + if [ $nfile -eq $NTASKS ]; then + nfile=0 + ifirst='no' + fi + iline=$(( iline + 1 )) + fi + done + fi + + wavenproc=`wc -l ${fcmdnow} | awk '{print $1}'` + wavenproc=`echo $((${wavenproc}<${NTASKS}?${wavenproc}:${NTASKS}))` + + set +x + echo ' ' + echo " Executing the boundary point scripts at : `date`" + echo ' ------------------------------------' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + + if [ "$wavenproc" -gt '1' ] + then + if [ ${CFP_MP:-"NO"} = "YES" ]; then + ${wavempexec} -n ${wavenproc} ${wave_mpmd} cmdmprog + else + ${wavempexec} ${wavenproc} ${wave_mpmd} ${fcmdnow} + fi + exit=$? + else + chmod 744 ${fcmdnow} + ./${fcmdnow} + exit=$? + fi + + if [ "$exit" != '0' ] + then + set +x + echo ' ' + echo '*************************************' + echo '*** FATAL ERROR: CMDFILE FAILED ***' + echo '*************************************' + echo ' See Details Below ' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + err=10; export err;${errchk} + exit $err + fi + + rm -f out_grd.* # Remove large binary grid output files + + cd $DATA + + FHINCP=$(( DTPNT_WAV / 3600 )) + if [ $fhr = $fhrp ] + then + fhrp=$((fhr+FHINCP)) + fi + echo $fhrp + + fhr=$fhrp # no gridded output, loop with out_pnt stride + + done + +# --------------------------------------------------------------------------- # +# 3. Compress point output data into tar files + +# 3.a Set up cmdfile + + rm -f cmdtarfile + touch cmdtarfile + chmod 744 cmdtarfile + + set +x + echo ' ' + echo ' Making command file for taring all point output files.' + + [[ "$LOUD" = YES ]] && set -x + +# 6.b Spectral data files + + echo "$USHwave/wave_tar.sh $WAV_MOD_TAG ibp $Nibp > ${WAV_MOD_TAG}_ibp_tar.out 2>&1 " >> cmdtarfile + + wavenproc=`wc -l cmdtarfile | awk '{print $1}'` + wavenproc=`echo $((${wavenproc}<${NTASKS}?${wavenproc}:${NTASKS}))` + + set +x + echo ' ' + echo " Executing the wave_tar scripts at : `date`" + echo ' ------------------------------------' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + + chmod 744 cmdtarfile + ./cmdtarfile + exit=$? + + if [ "$exit" != '0' ] + then + set +x + echo ' ' + echo '*************************************' + echo '*** FATAL ERROR: CMDFILE FAILED ***' + echo '*************************************' + echo ' See Details Below ' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + err=11; export err;${errchk} + exit $err + fi + +# --------------------------------------------------------------------------- # +# 7. Ending output + + set +x + echo ' ' + echo "Ending at : `date`" + echo '-----------' + echo ' ' + echo ' *** End of MWW3 postprocessor ***' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + + if [ "$exit_code" -ne '0' ] + then + echo " FATAL ERROR: Problem in MWW3 POST" + msg="ABNORMAL EXIT: Problem in MWW3 POST" + postmsg "$jlogfile" "$msg" + echo $msg + err=12; export err;${errchk} + exit $err + else + echo " Side-by-Side Wave Post Completed Normally " + msg="$job completed normally" + postmsg "$jlogfile" "$msg" + exit 0 + fi + +# End of MWW3 prostprocessor script ---------------------------------------- # diff --git a/scripts/exgfs_wave_post_gridded_sbs.sh b/scripts/exgfs_wave_post_gridded_sbs.sh new file mode 100755 index 0000000000..448d3ff267 --- /dev/null +++ b/scripts/exgfs_wave_post_gridded_sbs.sh @@ -0,0 +1,479 @@ +#!/bin/bash +# +################################################################################ +# +# UNIX Script Documentation Block +# Script name: exgfs_wave_post_gridded_sbs.sh +# Script description: Creates output products from binary WW3 data +# +# Author: Jose-Henrique Alves Org: NCEP/EMC Date: 2019-12-06 +# Abstract: This script is the postprocessor for the wave component in GFS. +# This version runs side-by-side with the GFS fcst step. +# It executes several scripts forpreparing and creating output data +# as follows: +# +# wave_grib2_sbs.sh : generates GRIB2 files. +# wave_grid_interp_ush.sh : interpolates data from new grids to old grids +# +# Script history log: +# 2019-12-06 J-Henrique Alves: First Version adapted from HTolman post.sh 2007 +# 2020-06-10 J-Henrique Alves: Porting to R&D machine Hera +# 2020-07-31 Jessica Meixner: Removing points, now gridded data only +# +# $Id$ +# +# Attributes: +# Language: Bourne-again (Bash) Shell +# Machine: WCOSS-DELL-P3 +# +############################################################################### +# +# --------------------------------------------------------------------------- # +# 0. Preparations +# 0.a Basic modes of operation + + set -x + # Use LOUD variable to turn on/off trace. Defaults to YES (on). + export LOUD=${LOUD:-YES}; [[ $LOUD = yes ]] && export LOUD=YES + [[ "$LOUD" != YES ]] && set +x + + # Set wave model ID tag to include member number + # if ensemble; waveMEMB var empty in deterministic + export WAV_MOD_TAG=${CDUMP}wave${waveMEMB} + + cd $DATA + + postmsg "$jlogfile" "HAS BEGUN on `hostname`" + + msg="Starting WAVE POSTPROCESSOR SCRIPT for $WAV_MOD_TAG" + postmsg "$jlogfile" "$msg" + + set +x + echo ' ' + echo ' *********************************' + echo ' *** WAVE POSTPROCESSOR SCRIPT ***' + echo ' *********************************' + echo ' ' + echo "Starting at : `date`" + echo '-------------' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + +# Script will run only if pre-defined NTASKS +# The actual work is distributed over these tasks. + if [ -z ${NTASKS} ] + then + echo "FATAL ERROR: requires NTASKS to be set " + err=1; export err;${errchk} + exit $err + fi + +# 0.c Defining model grids + +# 0.c.1 Grids + + export waveGRD=${waveGRD?Var waveGRD Not Set} + export wavesbsGRD=${wavesbsGRD?Var wavesbsGRD Not Set} + +# 0.c.2 extended global grid and rtma transfer grid + export waveinterpGRD=${waveinterpGRD?Var wavepostGRD Not Set} + export wavepostGRD=${wavepostGRD?Var wavepostGRD Not Set} + + + set +x + echo ' ' + echo 'Grid information :' + echo '-------------------' + echo " Native wave grids : $waveGRD" + echo " Side-by-side grids : $wavesbsGRD" + echo " Interpolated grids : $waveinterpGRD" + echo " Post-process grids : $wavepostGRD" + echo ' ' + [[ "$LOUD" = YES ]] && set -x + + +# 0.c.3 Define CDATE_POST as a function of RERUN variable setting + if [ "${RERUN}" = "YES" ]; then + export CDATE_POST=${CDATE_RST} + export FHRUN=`$NHOUR ${CDATE_RST} ${CDATE}` + else # regular run + export CDATE_POST=${CDATE} + export FHRUN=0 + fi + +# --------------------------------------------------------------------------- # +# 1. Get files that are used by most child scripts + + export DOGRB_WAV='YES' #Create grib2 files + export DOGRI_WAV='YES' #Create interpolated grids + + exit_code=0 + + set +x + echo ' ' + echo 'Preparing input files :' + echo '-----------------------' + [[ "$LOUD" = YES ]] && set -x + +# 1.a Model definition files and output files (set up using poe) + +# 1.a.1 Copy model definition files + for grdID in $waveGRD $wavesbsGRD $wavepostGRD $waveinterpGRD + do + if [ -f "$COMIN/rundata/${CDUMP}wave.mod_def.${grdID}" ] + then + set +x + echo " Mod def file for $grdID found in ${COMIN}/rundata. copying ...." + [[ "$LOUD" = YES ]] && set -x + + cp -f $COMIN/rundata/${CDUMP}wave.mod_def.${grdID} mod_def.$grdID + fi + done + +# 1.a.2 Check that model definition files exist + for grdID in $waveGRD $wavesbsGRD $wavepostGRD $waveinterpGRD + do + if [ ! -f mod_def.$grdID ] + then + set +x + echo ' ' + echo '*************************************************** ' + echo " FATAL ERROR : NO MOD_DEF FILE mod_def.$grdID " + echo '*************************************************** ' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + postmsg "$jlogfile" "FATAL ERROR : NO MOD_DEF file mod_def.$grdID" + err=2; export err;${errchk} + exit $err + DOGRB_WAV='NO' + else + set +x + echo "File mod_def.$grdID found. Syncing to all nodes ..." + [[ "$LOUD" = YES ]] && set -x + fi + done + + +# 1.b Input template files + + if [ "$DOGRI_WAV" = 'YES' ] + then + for intGRD in $waveinterpGRD + do + if [ -f $FIXwave/${intGRD}_interp.inp.tmpl ] + then + cp -f $FIXwave/${intGRD}_interp.inp.tmpl ${intGRD}_interp.inp.tmpl + fi + + if [ -f ${intGRD}_interp.inp.tmpl ] + then + set +x + echo " ${intGRD}_interp.inp.tmpl copied. Syncing to all nodes ..." + [[ "$LOUD" = YES ]] && set -x + else + set +x + echo ' ' + echo '*********************************************** ' + echo '*** ERROR : NO TEMPLATE FOR GRINT INPUT FILE *** ' + echo '*********************************************** ' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + echo "$WAV_MOD_TAG post $date $cycle : GRINT template file missing." + postmsg "$jlogfile" "NON-FATAL ERROR : NO TEMPLATE FOR GRINT INPUT FILE" + exit_code=1 + DOGRI_WAV='NO' + fi + done + fi + + if [ "$DOGRB_WAV" = 'YES' ] + then + for grbGRD in $waveinterpGRD $wavepostGRD + do + if [ -f $FIXwave/ww3_grib2.${grbGRD}.inp.tmpl ] + then + cp -f $FIXwave/ww3_grib2.${grbGRD}.inp.tmpl ww3_grib2.${grbGRD}.inp.tmpl + fi + + if [ -f ww3_grib2.${grbGRD}.inp.tmpl ] + then + set +x + echo " ww3_grib2.${grbGRD}.inp.tmpl copied. Syncing to all nodes ..." + [[ "$LOUD" = YES ]] && set -x + else + set +x + echo ' ' + echo '*********************************************** ' + echo "*** ERROR : NO TEMPLATE FOR ${grbGRD} GRIB INPUT FILE *** " + echo '*********************************************** ' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + postmsg "$jlogfile" "NON-FATAL ERROR : NO TEMPLATE FOR GRIB2 INPUT FILE" + exit_code=2 + DOGRB_WAV='NO' + fi + done + fi + + +# 1.c Data summary + + set +x + echo ' ' + echo " Input files read and processed at : `date`" + echo ' ' + echo ' Data summary : ' + echo ' ---------------------------------------------' + echo " Sufficient data for GRID interpolation : $DOGRI_WAV" + echo " Sufficient data for GRIB files : $DOGRB_WAV" + echo ' ' + [[ "$LOUD" = YES ]] && set -x + +# --------------------------------------------------------------------------- # +# 2. Make consolidated grib2 file for side-by-side grids and interpolate +# onto extended grids +# +# 2.a Command file set-up + + set +x + echo ' Making command file for sbs grib2 and GRID Interpolation ' + [[ "$LOUD" = YES ]] && set -x + + rm -f cmdfile + touch cmdfile + chmod 744 cmdfile + +# 1.a.2 Loop over forecast time to generate post files +# When executed side-by-side, serial mode (cfp when run after the fcst step) +# Contingency for RERUN=YES + if [ "${RERUN}" = "YES" ]; then + fhr=$((FHRUN + FHMIN_WAV)) + if [ $FHMAX_HF_WAV -gt 0 ] && [ $FHOUT_HF_WAV -gt 0 ] && [ $fhr -lt $FHMAX_HF_WAV ]; then + FHINCG=$FHOUT_HF_WAV + else + FHINCG=$FHOUT_WAV + fi + fhr=$((fhr + FHINCG)) + else + fhr=$FHMIN_WAV + fi + fhrg=$fhr + iwaitmax=120 # Maximum loop cycles for waiting until wave component output file is ready (fails after max) + while [ $fhr -le $FHMAX_WAV ]; do + + ymdh=`$NDATE $fhr $CDATE` + YMD=$(echo $ymdh | cut -c1-8) + HMS="$(echo $ymdh | cut -c9-10)0000" + YMDHMS=${YMD}${HMS} + FH3=$(printf %03i $fhr) + + fcmdnow=cmdfile.${FH3} + fcmdigrd=icmdfile.${FH3} + rm -f ${fcmdnow} ${fcmdigrd} + touch ${fcmdnow} ${fcmdigrd} + mkdir output_$YMDHMS + cd output_$YMDHMS + +# Create instances of directories for gridded output + export GRIBDATA=${DATA}/output_$YMDHMS + export GRDIDATA=${DATA}/output_$YMDHMS + +# Gridded data (main part, need to be run side-by-side with forecast + + if [ $fhr = $fhrg ] + then + iwait=0 + for wavGRD in ${waveGRD} ; do + gfile=$COMIN/rundata/${WAV_MOD_TAG}.out_grd.${wavGRD}.${YMD}.${HMS} + while [ ! -s ${gfile} ]; do sleep 10; done + if [ $iwait -eq $iwaitmax ]; then + echo '*************************************************** ' + echo " FATAL ERROR : NO RAW FIELD OUTPUT FILE out_grd.$grdID " + echo '*************************************************** ' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + echo "$WAV_MOD_TAG post $grdID $date $cycle : field output missing." + postmsg "$jlogfile" "NON-FATAL ERROR : NO RAW FIELD OUTPUT FILE out_grd.$grdID" + err=3; export err;${errchk} + exit $err + fi + ln -s ${gfile} ./out_grd.${wavGRD} + done + + if [ "$DOGRI_WAV" = 'YES' ] + then + nigrd=1 + for grdID in $waveinterpGRD + do + case $grdID in + glo_15mxt) ymdh_int=`$NDATE -${WAVHINDH} $ymdh`; dt_int=3600.; n_int=9999 ;; + glo_30mxt) ymdh_int=`$NDATE -${WAVHINDH} $ymdh`; dt_int=3600.; n_int=9999 ;; + esac + echo "$USHwave/wave_grid_interp_sbs.sh $grdID $ymdh_int $dt_int $n_int > grint_$grdID.out 2>&1" >> ${fcmdigrd}.${nigrd} + if [ "$DOGRB_WAV" = 'YES' ] + then + gribFL=\'`echo ${OUTPARS_WAV}`\' + case $grdID in + glo_15mxt) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; + glo_30mxt) GRDNAME='global' ; GRDRES=0p50 ; GRIDNR=255 ; MODNR=11 ;; + esac + echo "$USHwave/wave_grib2_sbs.sh $grdID $GRIDNR $MODNR $ymdh $fhr $GRDNAME $GRDRES $gribFL > grib_$grdID.out 2>&1" >> ${fcmdigrd}.${nigrd} + fi + echo "pwd" >> ${fcmdnow} + echo "${GRIBDATA}/${fcmdigrd}.${nigrd}" >> ${fcmdnow} + chmod 744 ${fcmdigrd}.${nigrd} + nigrd=$((nigrd+1)) + done + fi + + if [ "$DOGRB_WAV" = 'YES' ] + then + for grdID in ${wavepostGRD} # First concatenate grib files for sbs grids + do + gribFL=\'`echo ${OUTPARS_WAV}`\' + case $grdID in + aoc_9km) GRDNAME='arctic' ; GRDRES=9km ; GRIDNR=255 ; MODNR=11 ;; + ant_9km) GRDNAME='antarc' ; GRDRES=9km ; GRIDNR=255 ; MODNR=11 ;; + glo_10m) GRDNAME='global' ; GRDRES=0p16 ; GRIDNR=255 ; MODNR=11 ;; + gnh_10m) GRDNAME='global' ; GRDRES=0p16 ; GRIDNR=255 ; MODNR=11 ;; + gsh_15m) GRDNAME='gsouth' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; + glo_15m) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; + ao_20m) GRDNAME='arctic' ; GRDRES=0p33 ; GRIDNR=255 ; MODNR=11 ;; + so_20m) GRDNAME='antarc' ; GRDRES=0p33 ; GRIDNR=255 ; MODNR=11 ;; + glo_15mxt) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; + esac + echo "$USHwave/wave_grib2_sbs.sh $grdID $GRIDNR $MODNR $ymdh $fhr $GRDNAME $GRDRES $gribFL > grib_$grdID.out 2>&1" >> ${fcmdnow} + done + fi + + fi + + if [ ${CFP_MP:-"NO"} = "YES" ]; then + nfile=0 + ifile=0 + iline=1 + ifirst='yes' + nlines=$( wc -l ${fcmdnow} | awk '{print $1}' ) + while [ $iline -le $nlines ]; do + line=$( sed -n ''$iline'p' ${fcmdnow} ) + if [ -z "$line" ]; then + break + else + if [ "$ifirst" = 'yes' ]; then + echo "#!/bin/sh" > cmdmfile.$nfile + echo "$nfile cmdmfile.$nfile" >> cmdmprog + chmod 744 cmdmfile.$nfile + fi + echo $line >> cmdmfile.$nfile + nfile=$(( nfile + 1 )) + if [ $nfile -eq $NTASKS ]; then + nfile=0 + ifirst='no' + fi + iline=$(( iline + 1 )) + fi + done + fi + + wavenproc=`wc -l ${fcmdnow} | awk '{print $1}'` + wavenproc=`echo $((${wavenproc}<${NTASKS}?${wavenproc}:${NTASKS}))` + + set +x + echo ' ' + echo " Executing the grib2_sbs scripts at : `date`" + echo ' ------------------------------------' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + + if [ "$wavenproc" -gt '1' ] + then + if [ ${CFP_MP:-"NO"} = "YES" ]; then + ${wavempexec} -n ${wavenproc} ${wave_mpmd} cmdmprog + else + ${wavempexec} ${wavenproc} ${wave_mpmd} ${fcmdnow} + fi + exit=$? + else + chmod 744 ${fcmdnow} + ./${fcmdnow} + exit=$? + fi + + if [ "$exit" != '0' ] + then + set +x + echo ' ' + echo '*************************************' + echo '*** FATAL ERROR: CMDFILE FAILED ***' + echo '*************************************' + echo ' See Details Below ' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + err=4; export err;${errchk} + exit $err + fi + + rm -f out_grd.* # Remove large binary grid output files + + cd $DATA + + FHINCG=$(( DTFLD_WAV / 3600 )) + if [ $fhr = $fhrg ] + then +# Check if grib2 file created + ENSTAG="" + if [ ${waveMEMB} ]; then ENSTAG=".${membTAG}${waveMEMB}" ; fi + gribchk=${CDUMP}wave.${cycle}${ENSTAG}.${GRDNAME}.${GRDRES}.f${FH3}.grib2 + if [ ! -s ${COMOUT}/gridded/${gribchk} ]; then + set +x + echo ' ' + echo '********************************************' + echo "*** FATAL ERROR: $gribchk not generated " + echo '********************************************' + echo ' See Details Below ' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + err=5; export err;${errchk} + exit $err + fi + if [ $FHMAX_HF_WAV -gt 0 ] && [ $FHOUT_HF_WAV -gt 0 ] && [ $fhr -lt $FHMAX_HF_WAV ]; then + FHINCG=$FHOUT_HF_WAV + else + FHINCG=$FHOUT_WAV + fi + fhrg=$((fhr+FHINCG)) + fi + echo $fhrg + + fhr=$fhrg #loop with out_grd stride + + done + +# --------------------------------------------------------------------------- # +# 7. Ending output + + set +x + echo ' ' + echo "Ending at : `date`" + echo '-----------' + echo ' ' + echo ' *** End of MWW3 postprocessor ***' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + + if [ "$exit_code" -ne '0' ] + then + echo " FATAL ERROR: Problem in MWW3 POST" + msg="ABNORMAL EXIT: Problem in MWW3 POST" + postmsg "$jlogfile" "$msg" + echo $msg + err=6; export err;${errchk} + exit $err + else + echo " Side-by-Side Wave Post Completed Normally " + msg="$job completed normally" + postmsg "$jlogfile" "$msg" + exit 0 + fi + +# End of MWW3 prostprocessor script ---------------------------------------- # diff --git a/scripts/exgfs_wave_post_sbs.sh b/scripts/exgfs_wave_post_pnt.sh similarity index 66% rename from scripts/exgfs_wave_post_sbs.sh rename to scripts/exgfs_wave_post_pnt.sh index fe37a689bf..a66ed69215 100755 --- a/scripts/exgfs_wave_post_sbs.sh +++ b/scripts/exgfs_wave_post_pnt.sh @@ -3,8 +3,8 @@ ################################################################################ # # UNIX Script Documentation Block -# Script name: exwave_post_sbs.sh -# Script description: Creates output products from binary WW3 data +# Script name: exgfs_wave_post_pnt.sh +# Script description: Creates point output products from binary WW3 data # # Author: Jose-Henrique Alves Org: NCEP/EMC Date: 2019-12-06 # Abstract: This script is the postprocessor for the wave component in GFS. @@ -12,15 +12,14 @@ # It executes several scripts forpreparing and creating output data # as follows: # -# wave_grib2_sbs.sh : generates GRIB2 files. # wave_outp_spec.sh : generates spectral data for output locations. # wave_outp_bull.sh : generates bulletins for output locations. -# wave_grid_interp_ush.sh : interpolates data from new grids to old grids # wave_tar.sh : tars the spectral and bulletin multiple files # # Script history log: # 2019-12-06 J-Henrique Alves: First Version adapted from HTolman post.sh 2007 # 2020-06-10 J-Henrique Alves: Porting to R&D machine Hera +# 2020-07-30 Jessica Meixner: Points only - no gridded data # # $Id$ # @@ -39,12 +38,12 @@ export LOUD=${LOUD:-YES}; [[ $LOUD = yes ]] && export LOUD=YES [[ "$LOUD" != YES ]] && set +x + cd $DATA + # Set wave model ID tag to include member number # if ensemble; waveMEMB var empty in deterministic export WAV_MOD_TAG=${CDUMP}wave${waveMEMB} - cd $DATA - postmsg "$jlogfile" "HAS BEGUN on `hostname`" msg="Starting WAVE POSTPROCESSOR SCRIPT for $WAV_MOD_TAG" @@ -74,15 +73,6 @@ waveuoutpGRD=${waveuoutpGRD:?buoyNotSet} -# 0.c.1 Grids - - export waveGRD=${waveGRD?Var waveGRD Not Set} - export wavesbsGRD=${wavesbsGRD?Var wavesbsGRD Not Set} - -# 0.c.3 extended global grid and rtma transfer grid - export waveinterpGRD=${waveinterpGRD?Var wavepostGRD Not Set} - export wavepostGRD=${wavepostGRD?Var wavepostGRD Not Set} - # 0.c.4 Define a temporary directory for storing ascii point output files # and flush it @@ -101,25 +91,17 @@ echo ' ' echo 'Grid information :' echo '-------------------' - echo " Native wave grids : $waveGRD" - echo " Side-by-side grids : $wavesbsGRD" - echo " Interpolated grids : $waveinterpGRD" - echo " Post-process grids : $wavepostGRD" echo " Output points : $waveuoutpGRD" echo ' ' [[ "$LOUD" = YES ]] && set -x - # --------------------------------------------------------------------------- # # 1. Get files that are used by most child scripts - export DOIBP_WAV='NO' - export DOFLD_WAV='YES' - export DOPNT_WAV='YES' - export DOGRB_WAV='YES' - export DOGRI_WAV='YES' - export DOSPC_WAV='YES' - export DOBLL_WAV='YES' + export DOIBP_WAV='NO' # Input boundary points + export DOPNT_WAV='YES' # Station data + export DOSPC_WAV='YES' # Spectral post + export DOBLL_WAV='YES' # Bulletin post exit_code=0 @@ -140,7 +122,7 @@ [[ "$LOUD" = YES ]] && set -x # Copy model definition files - for grdID in $waveGRD $wavesbsGRD $wavepostGRD $waveinterpGRD $waveuoutpGRD + for grdID in $waveuoutpGRD do if [ -f "$COMIN/rundata/${CDUMP}wave.mod_def.${grdID}" ] then @@ -153,7 +135,7 @@ fi done - for grdID in $waveGRD $wavesbsGRD $wavepostGRD $waveinterpGRD $waveuoutpGRD + for grdID in $waveuoutpGRD do if [ ! -f mod_def.$grdID ] then @@ -165,10 +147,8 @@ echo ' ' [[ "$LOUD" = YES ]] && set -x postmsg "$jlogfile" "FATAL ERROR : NO MOD_DEF file mod_def.$grdID" - DOFLD_WAV='NO' err=2; export err;${errchk} exit $err - DOGRB_WAV='NO' else set +x echo "File mod_def.$grdID found. Syncing to all nodes ..." @@ -218,80 +198,20 @@ else set +x echo ' ' - echo '************************************* ' - echo ' FATAL ERROR : NO BUOY LOCATION FILE ' - echo '************************************* ' + echo '***************************************** ' + echo ' FATAL ERROR : NO IBP BUOY LOCATION FILE ' + echo '***************************************** ' echo ' ' [[ "$LOUD" = YES ]] && set -x - postmsg "$jlogfile" "FATAL ERROR : NO BUOY LOCATION FILE" - err=3; export err;${errchk} + postmsg "$jlogfile" "FATAL ERROR : NO IBP BUOY LOCATION FILE" + err=4; export err;${errchk} exit $err - DOPNT_WAV='NO' - DOSPC_WAV='NO' - DOBLL_WAV='NO' + DOIBP_WAV='NO' fi fi # 1.d Input template files - if [ "$DOGRI_WAV" = 'YES' ] - then - for intGRD in $waveinterpGRD - do - if [ -f $FIXwave/${intGRD}_interp.inp.tmpl ] - then - cp -f $FIXwave/${intGRD}_interp.inp.tmpl ${intGRD}_interp.inp.tmpl - fi - - if [ -f ${intGRD}_interp.inp.tmpl ] - then - set +x - echo " ${intGRD}_interp.inp.tmpl copied. Syncing to all nodes ..." - [[ "$LOUD" = YES ]] && set -x - else - set +x - echo ' ' - echo '*********************************************** ' - echo '*** ERROR : NO TEMPLATE FOR GRINT INPUT FILE *** ' - echo '*********************************************** ' - echo ' ' - [[ "$LOUD" = YES ]] && set -x - postmsg "$jlogfile" "NON-FATAL ERROR : NO TEMPLATE FOR GRINT INPUT FILE" - exit_code=1 - DOGRI_WAV='NO' - fi - done - fi - - if [ "$DOGRB_WAV" = 'YES' ] - then - for grbGRD in $waveinterpGRD $wavepostGRD - do - if [ -f $FIXwave/ww3_grib2.${grbGRD}.inp.tmpl ] - then - cp -f $FIXwave/ww3_grib2.${grbGRD}.inp.tmpl ww3_grib2.${grbGRD}.inp.tmpl - fi - - if [ -f ww3_grib2.${grbGRD}.inp.tmpl ] - then - set +x - echo " ww3_grib2.${grbGRD}.inp.tmpl copied. Syncing to all nodes ..." - [[ "$LOUD" = YES ]] && set -x - else - set +x - echo ' ' - echo '*********************************************** ' - echo "*** ERROR : NO TEMPLATE FOR ${grbGRD} GRIB INPUT FILE *** " - echo '*********************************************** ' - echo ' ' - [[ "$LOUD" = YES ]] && set -x - postmsg "$jlogfile" "NON-FATAL ERROR : NO TEMPLATE FOR GRIB2 INPUT FILE" - exit_code=2 - DOGRB_WAV='NO' - fi - done - fi - if [ -f $FIXwave/ww3_outp_spec.inp.tmpl ] then cp -f $FIXwave/ww3_outp_spec.inp.tmpl ww3_outp_spec.inp.tmpl @@ -354,23 +274,21 @@ ww3_outp_spec.inp.tmpl > ww3_outp.inp ln -s mod_def.$waveuoutpGRD mod_def.ww3 - fhr=$FHMIN_WAV YMD=$(echo $CDATE | cut -c1-8) HMS="$(echo $CDATE | cut -c9-10)0000" - tloop=0 - tloopmax=600 - tsleep=10 - while [ ${tloop} -le ${tloopmax} ] - do - if [ -f $COMIN/rundata/${WAV_MOD_TAG}.out_pnt.${waveuoutpGRD}.${YMD}.${HMS} ] - then - ln -s $COMIN/rundata/${WAV_MOD_TAG}.out_pnt.${waveuoutpGRD}.${YMD}.${HMS} ./out_pnt.${waveuoutpGRD} - break - else - sleep ${tsleep} - tloop=$(($tloop + $tsleep)) - fi - done + if [ -f $COMIN/rundata/${WAV_MOD_TAG}.out_pnt.${waveuoutpGRD}.${YMD}.${HMS} ] + then + ln -s $COMIN/rundata/${WAV_MOD_TAG}.out_pnt.${waveuoutpGRD}.${YMD}.${HMS} ./out_pnt.${waveuoutpGRD} + else + echo '*************************************************** ' + echo " FATAL ERROR : NO RAW POINT OUTPUT FILE out_pnt.${waveuoutpGRD}.${YMD}.${HMS} " + echo '*************************************************** ' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + echo "$WAV_MOD_TAG post $waveuoutpGRD $CDATE $cycle : field output missing." + postmsg "$jlogfile" "FATAL ERROR : NO RAW POINT OUTPUT FILE out_pnt.${waveuoutpGRD}.${YMD}.${HMS}" + err=5; export err;${errchk} + fi rm -f buoy_tmp.loc buoy_log.ww3 ww3_oup.inp ln -fs ./out_pnt.${waveuoutpGRD} ./out_pnt.ww3 @@ -389,10 +307,11 @@ echo '*** FATAL ERROR : ERROR IN ww3_outp *** ' echo '******************************************** ' echo ' ' - cat buoy_tmp.loc + cat buoy_tmp.loc + echo "$WAV_MOD_TAG post $date $cycle : buoy log file failed to be created." echo $msg [[ "$LOUD" = YES ]] && set -x - err=4;export err;${errchk} + err=6;export err;${errchk} DOSPC_WAV='NO' DOBLL_WAV='NO' exit $err @@ -424,7 +343,7 @@ echo ' ' [[ "$LOUD" = YES ]] && set -x postmsg "$jlogfile" "FATAL ERROR : NO BUOY LOG FILE GENERATED FOR SPEC AND BULLETIN FILES" - err=5;export err;${errchk} + err=7;export err;${errchk} DOSPC_WAV='NO' DOBLL_WAV='NO' fi @@ -449,13 +368,15 @@ else set +x echo ' ' - echo '**************************************** ' - echo '*** ERROR : NO IBP LOG FILE CREATED *** ' - echo '**************************************** ' + echo '********************************************** ' + echo '*** FATAL ERROR : NO IBP LOG FILE CREATED *** ' + echo '********************************************** ' echo ' ' [[ "$LOUD" = YES ]] && set -x + echo "$WAV_MOD_TAG post $date $cycle : ibp log file missing." postmsg "$jlogfile" "FATAL ERROR : NO IBP LOG FILE GENERATED FOR SPEC AND BULLETIN FILES" - err=6;export err;${errchk} + err=8;export err;${errchk} + exit $err DOIBP_WAV='NO' fi fi @@ -469,8 +390,6 @@ echo ' ' echo ' Data summary : ' echo ' ---------------------------------------------' - echo " Sufficient data for GRID interpolation : $DOGRI_WAV" - echo " Sufficient data for GRIB files : $DOGRB_WAV" echo " Sufficient data for spectral files : $DOSPC_WAV ($Nb points)" echo " Sufficient data for bulletins : $DOBLL_WAV ($Nb points)" echo " Sufficient data for Input Boundary Points : $DOIBP_WAV ($Nibp points)" @@ -484,7 +403,7 @@ # 2.a Command file set-up set +x - echo ' Making command file for sbs grib2 and GRID Interpolation ' + echo ' Making command file for wave post points ' [[ "$LOUD" = YES ]] && set -x rm -f cmdfile @@ -492,13 +411,11 @@ chmod 744 cmdfile # 1.a.2 Loop over forecast time to generate post files -# When executed side-by-side, serial mode (cfp when run after the fcst step) fhr=$FHMIN_WAV fhrp=$fhr - fhrg=$fhr - iwaitmax=120 # Maximum loop cycles for waiting until wave component output file is ready (fails after max) while [ $fhr -le $FHMAX_WAV ]; do + echo " Creating the wave point scripts at : `date`" ymdh=`$NDATE $fhr $CDATE` YMD=$(echo $ymdh | cut -c1-8) HMS="$(echo $ymdh | cut -c9-10)0000" @@ -507,8 +424,10 @@ fcmdnow=cmdfile.${FH3} fcmdigrd=icmdfile.${FH3} - fcmdpnt=pcmdfile.${FH3} - fcmdibp=ibpcmdfile.${FH3} + if [ "${DOPNT_WAV}" = "YES" ]; then + fcmdpnt=pcmdfile.${FH3} + fcmdibp=ibpcmdfile.${FH3} + fi rm -f ${fcmdnow} ${fcmdigrd} ${fcmdpnt} ${fcmdibp} touch ${fcmdnow} ${fcmdigrd} ${fcmdpnt} ${fcmdibp} mkdir output_$YMDHMS @@ -517,94 +436,23 @@ # Create instances of directories for spec and gridded output export SPECDATA=${DATA}/output_$YMDHMS export BULLDATA=${DATA}/output_$YMDHMS - export GRIBDATA=${DATA}/output_$YMDHMS - export GRDIDATA=${DATA}/output_$YMDHMS ln -fs $DATA/mod_def.${waveuoutpGRD} mod_def.ww3 -# Gridded data (main part, need to be run side-by-side with forecast - - if [ $fhr = $fhrg ] - then - for wavGRD in ${waveGRD} ; do - gfile=$COMIN/rundata/${WAV_MOD_TAG}.out_grd.${wavGRD}.${YMD}.${HMS} - while [ ! -s ${gfile} ]; do sleep 10; done - if [ $iwait -eq $iwaitmax ]; then - echo '*************************************************** ' - echo " FATAL ERROR : NO RAW FIELD OUTPUT FILE out_grd.$grdID " - echo '*************************************************** ' - echo ' ' - [[ "$LOUD" = YES ]] && set -x - postmsg "$jlogfile" "NON-FATAL ERROR : NO RAW FIELD OUTPUT FILE out_grd.$grdID" - DOFLD_WAVE='NO' - err=7; export err;${errchk} - exit $err - fi - ln -s ${gfile} ./out_grd.${wavGRD} - done - - if [ "$DOGRI_WAV" = 'YES' ] - then - nigrd=1 - for grdID in $waveinterpGRD - do - case $grdID in - glo_15mxt) ymdh_int=`$NDATE -${WAVHINDH} $ymdh`; dt_int=3600.; n_int=9999 ;; - glo_30mxt) ymdh_int=`$NDATE -${WAVHINDH} $ymdh`; dt_int=3600.; n_int=9999 ;; - esac - echo "$USHwave/wave_grid_interp_sbs.sh $grdID $ymdh_int $dt_int $n_int > grint_$grdID.out 2>&1" >> ${fcmdigrd}.${nigrd} - if [ "$DOGRB_WAV" = 'YES' ] - then - gribFL=\'`echo ${OUTPARS_WAV}`\' - case $grdID in - glo_15mxt) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; - glo_30mxt) GRDNAME='global' ; GRDRES=0p50 ; GRIDNR=255 ; MODNR=11 ;; - esac - echo "$USHwave/wave_grib2_sbs.sh $grdID $GRIDNR $MODNR $ymdh $fhr $GRDNAME $GRDRES $gribFL > grib_$grdID.out 2>&1" >> ${fcmdigrd}.${nigrd} - fi - echo "pwd" >> ${fcmdnow} - echo "${GRIBDATA}/${fcmdigrd}.${nigrd}" >> ${fcmdnow} - chmod 744 ${fcmdigrd}.${nigrd} - nigrd=$((nigrd+1)) - done - fi - - if [ "$DOGRB_WAV" = 'YES' ] - then - for grdID in ${wavepostGRD} # First concatenate grib files for sbs grids - do - gribFL=\'`echo ${OUTPARS_WAV}`\' - case $grdID in - aoc_9km) GRDNAME='arctic' ; GRDRES=9km ; GRIDNR=255 ; MODNR=11 ;; - ant_9km) GRDNAME='antarc' ; GRDRES=9km ; GRIDNR=255 ; MODNR=11 ;; - glo_10m) GRDNAME='global' ; GRDRES=0p16 ; GRIDNR=255 ; MODNR=11 ;; - gnh_10m) GRDNAME='global' ; GRDRES=0p16 ; GRIDNR=255 ; MODNR=11 ;; - gsh_15m) GRDNAME='gsouth' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; - glo_15m) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; - ao_20m) GRDNAME='arctic' ; GRDRES=0p33 ; GRIDNR=255 ; MODNR=11 ;; - so_20m) GRDNAME='antarc' ; GRDRES=0p33 ; GRIDNR=255 ; MODNR=11 ;; - glo_15mxt) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; - esac - echo "$USHwave/wave_grib2_sbs.sh $grdID $GRIDNR $MODNR $ymdh $fhr $GRDNAME $GRDRES $gribFL > grib_$grdID.out 2>&1" >> ${fcmdnow} - done - fi - - fi - # Point output part (can be split or become meta-task to reduce resource usage) if [ $fhr = $fhrp ] then - iwait=0 pfile=$COMIN/rundata/${WAV_MOD_TAG}.out_pnt.${waveuoutpGRD}.${YMD}.${HMS} - while [ ! -s ${pfile} ]; do sleep 10; ((iwait++)) && ((iwait==$iwaitmax)) && break ; echo $iwait; done - if [ $iwait -eq $iwaitmax ]; then - echo " FATAL ERROR : NO RAW POINT OUTPUT FILE out_pnt.$waveuoutpGRD + if [ -f ${pfile} ] + then + ln -fs ${pfile} ./out_pnt.${waveuoutpGRD} + else + echo " FATAL ERROR : NO RAW POINT OUTPUT FILE out_pnt.$waveuoutpGRD.${YMD}.${HMS} echo ' ' [[ "$LOUD" = YES ]] && set -x - postmsg "$jlogfile" "FATAL ERROR : NO RAW POINT OUTPUT FILE out_pnt.$waveuoutpGRD - err=6; export err;${errchk} + postmsg "$jlogfile" "FATAL ERROR : NO RAW POINT OUTPUT FILE out_pnt.$waveuoutpGRD.${YMD}.${HMS} + err=9; export err;${errchk} exit $err fi - ln -fs ${pfile} ./out_pnt.${waveuoutpGRD} if [ "$DOSPC_WAV" = 'YES' ] then @@ -667,7 +515,7 @@ set +x echo ' ' - echo " Executing the grib2_sbs scripts at : `date`" + echo " Executing the wave point scripts at : `date`" echo ' ------------------------------------' echo ' ' [[ "$LOUD" = YES ]] && set -x @@ -690,13 +538,13 @@ then set +x echo ' ' - echo '********************************************' - echo '*** CMDFILE FAILED ***' - echo '********************************************' + echo '*************************************' + echo '*** FATAL ERROR: CMDFILE FAILED ***' + echo '*************************************' echo ' See Details Below ' echo ' ' [[ "$LOUD" = YES ]] && set -x - err=8; export err;${errchk} + err=10; export err;${errchk} exit $err fi @@ -705,24 +553,17 @@ cd $DATA FHINCP=$(( DTPNT_WAV / 3600 )) - FHINCG=$(( DTFLD_WAV / 3600 )) - if [ $fhr = $fhrg ] - then - if [ $FHMAX_HF_WAV -gt 0 ] && [ $FHOUT_HF_WAV -gt 0 ] && [ $fhr -lt $FHMAX_HF_WAV ]; then - FHINCG=$FHOUT_HF_WAV - else - FHINCG=$FHOUT_WAV - fi - fhrg=$((fhr+FHINCG)) - fi if [ $fhr = $fhrp ] then fhrp=$((fhr+FHINCP)) fi - echo $fhrg $fhrp - fhr=$([ $fhrg -le $fhrp ] && echo "$fhrg" || echo "$fhrp") # reference fhr is the least between grid and point stride + echo $fhrp + + fhr=$fhrp # no gridded output, loop with out_pnt stride + done + # --------------------------------------------------------------------------- # # 3. Compress point output data into tar files @@ -795,13 +636,13 @@ then set +x echo ' ' - echo '********************************************' - echo '*** CMDFILE FAILED ***' - echo '********************************************' + echo '*************************************' + echo '*** FATAL ERROR: CMDFILE FAILED ***' + echo '*************************************' echo ' See Details Below ' echo ' ' [[ "$LOUD" = YES ]] && set -x - err=8; export err;${errchk} + err=11; export err;${errchk} exit $err fi @@ -819,10 +660,11 @@ if [ "$exit_code" -ne '0' ] then + echo " FATAL ERROR: Problem in MWW3 POST" msg="ABNORMAL EXIT: Problem in MWW3 POST" postmsg "$jlogfile" "$msg" echo $msg - err=16; export err;${errchk} + err=12; export err;${errchk} exit $err else echo " Side-by-Side Wave Post Completed Normally " diff --git a/scripts/exgfs_wave_prep.sh b/scripts/exgfs_wave_prep.sh index 256bdfd146..016c06ab7d 100755 --- a/scripts/exgfs_wave_prep.sh +++ b/scripts/exgfs_wave_prep.sh @@ -622,7 +622,7 @@ fi #------------------------------------------------------------------- -# CURR processing (not functional, TBD for uncoupled and GFSv16 cases) +# CURR processing if [ "${WW3CURINP}" = 'YES' ]; then @@ -667,6 +667,11 @@ FLGHF='F' else echo ' ' + if [ "${FLGHF}" = "T" ] ; then + curfile=${curfile1h} + else + curfile=${curfile3h} + fi set $setoff echo ' ' echo '************************************** ' @@ -676,7 +681,7 @@ set $seton postmsg "$jlogfile" "FATAL ERROR - NO CURRENT FILE (RTOFS)" err=11;export err;${errchk} - exit 0 + exit $err echo ' ' fi diff --git a/ush/rocoto/setup_workflow.py b/ush/rocoto/setup_workflow.py index 7d3b184be7..1f9d5b057d 100755 --- a/ush/rocoto/setup_workflow.py +++ b/ush/rocoto/setup_workflow.py @@ -48,9 +48,8 @@ def main(): gfs_steps_wafs = ['wafs', 'wafsgrib2', 'wafsblending', 'wafsgcip', 'wafsgrib20p25', 'wafsblending0p25'] #hyb_steps = ['eobs', 'eomg', 'eupd', 'ecen', 'efcs', 'epos', 'earc'] metp_steps = ['metp'] - wav_steps = ['waveinit', 'waveprep', 'wavepostsbs'] + wav_steps = ['waveinit', 'waveprep', 'wavepostsbs', 'wavepostbndpnt', 'wavepostpnt'] #Implement additional wave jobs at later date - #wav_steps = ['waveinit', 'waveprep', 'wavepostsbs', 'wavepost', 'wavestat'] wav_steps_gempak = ['wavegempak'] wav_steps_awips = ['waveawipsbulls', 'waveawipsgridded'] # From gfsv16b latest @@ -251,14 +250,14 @@ def get_gdasgfs_resources(dict_configs, cdump='gdas'): if cdump in ['gdas'] and do_gldas in ['Y', 'YES']: tasks += ['gldas'] if cdump in ['gdas'] and do_wave in ['Y', 'YES'] and do_wave_cdump in ['GDAS', 'BOTH']: - #tasks += ['waveinit', 'waveprep', 'wavepostsbs', 'wavepost', 'wavestat'] - tasks += ['waveinit', 'waveprep', 'wavepostsbs'] + #tasks += ['waveinit', 'waveprep', 'wavepostsbs', 'wavepostbndpnt', 'wavepostpnt', 'wavestat'] + tasks += ['waveinit', 'waveprep', 'wavepostsbs', 'wavepostbndpnt', 'wavepostpnt'] tasks += ['fcst', 'post', 'vrfy', 'arch'] if cdump in ['gfs'] and do_wave in ['Y', 'YES'] and do_wave_cdump in ['GFS', 'BOTH']: - #tasks += ['waveinit', 'waveprep', 'wavepostsbs', 'wavepost', 'wavestat'] - tasks += ['waveinit', 'waveprep', 'wavepostsbs'] + #tasks += ['waveinit', 'waveprep', 'wavepostsbs', 'wavepostbndpnt', 'wavepostpnt', 'wavestat'] + tasks += ['waveinit', 'waveprep', 'wavepostsbs', 'wavepostbndpnt', 'wavepostpnt'] if cdump in ['gfs'] and do_bufrsnd in ['Y', 'YES']: tasks += ['postsnd'] if cdump in ['gfs'] and do_gempak in ['Y', 'YES']: @@ -578,6 +577,25 @@ def get_gdasgfs_tasks(dict_configs, cdump='gdas'): task = wfu.create_wf_task('wavepostsbs', cdump=cdump, envar=envars, dependency=dependencies) dict_tasks['%swavepostsbs' % cdump] = task + # wavepostbndpnt + if do_wave in ['Y', 'YES'] and cdump in ['gfs']: + deps = [] + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.logf192.txt' % (cdump,cdump) + dep_dict = {'type': 'data', 'data': data} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep=deps) + task = wfu.create_wf_task('wavepostbndpnt', cdump=cdump, envar=envars, dependency=dependencies) + dict_tasks['%swavepostbndpnt' % cdump] = task + + # wavepostpnt + if do_wave in ['Y', 'YES'] and cdump in cdumps: + deps = [] + dep_dict = {'type':'task', 'name':'%sfcst' % cdump} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep=deps) + task = wfu.create_wf_task('wavepostpnt', cdump=cdump, envar=envars, dependency=dependencies) + dict_tasks['%swavepostpnt' % cdump] = task + # wavegempak if do_wave in ['Y', 'YES'] and do_gempak in ['Y', 'YES'] and cdump in ['gfs']: deps = [] diff --git a/ush/rocoto/setup_workflow_fcstonly.py b/ush/rocoto/setup_workflow_fcstonly.py index 1b3c91b5c7..d151185a5d 100755 --- a/ush/rocoto/setup_workflow_fcstonly.py +++ b/ush/rocoto/setup_workflow_fcstonly.py @@ -28,7 +28,7 @@ import workflow_utils as wfu #taskplan = ['getic', 'fv3ic', 'waveinit', 'waveprep', 'fcst', 'post', 'wavepostsbs', 'wavegempak', 'waveawipsbulls', 'waveawipsgridded', 'wavepost', 'wavestat', 'wafs', 'wafsgrib2', 'wafsblending', 'wafsgcip', 'wafsgrib20p25', 'wafsblending0p25', 'vrfy', 'metp', 'arch'] -taskplan = ['getic', 'fv3ic', 'waveinit', 'waveprep', 'fcst', 'post', 'wavepostsbs', 'wavegempak', 'waveawipsbulls', 'waveawipsgridded', 'wafs', 'wafsgrib2', 'wafsblending', 'wafsgcip', 'wafsgrib20p25', 'wafsblending0p25', 'vrfy', 'metp', 'arch'] +taskplan = ['getic', 'fv3ic', 'waveinit', 'waveprep', 'fcst', 'post', 'wavepostsbs', 'wavepostbndpnt', 'wavepostpnt', 'wavegempak', 'waveawipsbulls', 'waveawipsgridded', 'wafs', 'wafsgrib2', 'wafsblending', 'wafsgcip', 'wafsgrib20p25', 'wafsblending0p25', 'vrfy', 'metp', 'arch'] def main(): parser = ArgumentParser(description='Setup XML workflow and CRONTAB for a forecast only experiment.', formatter_class=ArgumentDefaultsHelpFormatter) @@ -361,17 +361,26 @@ def get_workflow(dict_configs, cdump='gdas'): tasks.append(task) tasks.append('\n') - # wavepost - #if do_wave in ['Y', 'YES']: - # deps = [] - # dep_dict = {'type':'task', 'name':'%sfcst' % cdump} - # deps.append(rocoto.add_dependency(dep_dict)) - # dep_dict = {'type':'task', 'name':'%swavepostsbs' % cdump} - # deps.append(rocoto.add_dependency(dep_dict)) - # dependencies = rocoto.create_dependency(dep=deps) - # task = wfu.create_wf_task('wavepost', cdump=cdump, envar=envars, dependency=dependencies) - # tasks.append(task) - # tasks.append('\n') + # wavepostbndpnt + if do_wave in ['Y', 'YES']: + deps = [] + data = '&ROTDIR;/%s.@Y@m@d/@H/atmos/%s.t@Hz.logf192.txt' % (cdump,cdump) + dep_dict = {'type': 'data', 'data': data} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep=deps) + task = wfu.create_wf_task('wavepostbndpnt', cdump=cdump, envar=envars, dependency=dependencies) + tasks.append(task) + tasks.append('\n') + + # wavepostpnt + if do_wave in ['Y', 'YES']: + deps = [] + dep_dict = {'type':'task', 'name':'%sfcst' % cdump} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep=deps) + task = wfu.create_wf_task('wavepostpnt', cdump=cdump, envar=envars, dependency=dependencies) + tasks.append(task) + tasks.append('\n') # wavestat #if do_wave in ['Y', 'YES']: diff --git a/ush/wave_grib2_sbs.sh b/ush/wave_grib2_sbs.sh index 0c04f0fcb2..a95556fe68 100755 --- a/ush/wave_grib2_sbs.sh +++ b/ush/wave_grib2_sbs.sh @@ -73,6 +73,14 @@ # SBS one time slice per file FH3=$(printf %03i $fhr) +# Verify if grib2 file exists from interrupted run + ENSTAG="" + if [ ${waveMEMB} ]; then ENSTAG=".${membTAG}${waveMEMB}" ; fi + outfile=${WAV_MOD_TAG}.${cycle}${ENSTAG}.${grdnam}.${grdres}.f${FH3}.grib2 + +# Only create file if not present in COM + if [ ! -s ${COMOUT}/gridded/${outfile}.idx ]; then + set +x echo ' ' echo '+--------------------------------+' @@ -137,10 +145,20 @@ echo " Run ww3_grib2" echo " Executing $EXECwave/ww3_grib" [[ "$LOUD" = YES ]] && set -x - ENSTAG="" - if [ ${waveMEMB} ]; then ENSTAG=".${membTAG}${waveMEMB}" ; fi - outfile=${WAV_MOD_TAG}.${cycle}${ENSTAG}.${grdnam}.${grdres}.f${FH3}.grib2 $EXECwave/ww3_grib > grib2_${grdnam}_${FH3}.out 2>&1 + + if [ ! -s gribfile ]; then + set +x + echo ' ' + echo '************************************************ ' + echo '*** FATAL ERROR : ERROR IN ww3_grib encoding *** ' + echo '************************************************ ' + echo ' ' + [[ "$LOUD" = YES ]] && set -x + postmsg "$jlogfile" "FATAL ERROR : ERROR IN ww3_grib2" + exit 3 + fi + $WGRIB2 gribfile -set_date $CDATE -set_ftime "$fhr hour fcst" -grib ${COMOUT}/gridded/${outfile} err=$? @@ -226,6 +244,14 @@ cd ../ mv -f ${gribDIR} done.${gribDIR} + else + set +x + echo ' ' + echo " File ${COMOUT}/gridded/${outfile} found, skipping generation process" + echo ' ' + [[ "$LOUD" = YES ]] && set -x + fi + set +x echo ' ' echo "End of ww3_grib2.sh at" diff --git a/ush/wave_prnc_cur.sh b/ush/wave_prnc_cur.sh index 4c731e5ddd..a0fe7cec53 100755 --- a/ush/wave_prnc_cur.sh +++ b/ush/wave_prnc_cur.sh @@ -37,8 +37,7 @@ cd rtofs_${ymdh_rtofs} ncks -x -v sst,sss,layer_density $curfile cur_uv_${PDY}_${fext}${fh3}.nc ncks -O -a -h -x -v Layer cur_uv_${PDY}_${fext}${fh3}.nc cur_temp1.nc ncwa -h -O -a Layer cur_temp1.nc cur_temp2.nc -ncrename -h -O -v MT,time cur_temp2.nc -ncrename -h -O -d MT,time cur_temp2.nc +ncrename -h -O -v MT,time -d MT,time cur_temp2.nc ncks -v u_velocity,v_velocity cur_temp2.nc cur_temp3.nc mv -f cur_temp3.nc cur_uv_${PDY}_${fext}${fh3}_flat.nc diff --git a/ush/wave_prnc_ice.sh b/ush/wave_prnc_ice.sh index 254edc8b03..7181819d02 100755 --- a/ush/wave_prnc_ice.sh +++ b/ush/wave_prnc_ice.sh @@ -64,7 +64,7 @@ echo '*** EXPORTED VARIABLES IN preprocessor NOT SET ***' echo '**************************************************' echo ' ' - exit 0 + exit 1 set $seton postmsg "$jlogfile" "NON-FATAL ERROR - EXPORTED VARIABLES IN preprocessor NOT SET" fi @@ -98,7 +98,7 @@ echo ' ' set $seton postmsg "$jlogfile" "FATAL ERROR - NO ICE FILE (GFS GRIB)" - exit 0 + exit 2 fi # --------------------------------------------------------------------------- # @@ -125,7 +125,7 @@ echo ' ' set $seton postmsg "$jlogfile" "ERROR IN UNPACKING GRIB ICE FILE." - exit 0 + exit 3 fi rm -f wgrib.out @@ -156,7 +156,7 @@ echo ' ' set $seton postmsg "$jlogfile" "NON-FATAL ERROR IN waveprep." - exit 0 + exit 4 fi rm -f wave_prep.out ww3_prep.inp ice.raw mod_def.ww3