From 77e9aeb225672d3a35c88d468f9aa31cfc63e0f8 Mon Sep 17 00:00:00 2001 From: "Lin.Gan" Date: Fri, 7 Oct 2022 16:36:48 +0000 Subject: [PATCH 01/21] GFS archive jobs designed to increase GFS workflow stability. Include script, JJob, and utility for GDAS, ENKFGDAS, and GFS archive jobs Detailed information can be found in github issue #1051 https://github.com/NOAA-EMC/global-workflow/issues/1051 --- .../enkfgdas/jenkfgdas_emc_earc_master.ecf | 66 ++++ .../cycled/gdas/jgdas_emc_arch.ecf | 60 +++ .../cycled/gfs/jgfs_emc_arch.ecf | 59 +++ .../jobs/JENKFGDAS_OFFLINE_ARCHIVE | 189 ++++++++++ .../jobs/JGLOBAL_OFFLINE_ARCHIVE | 345 ++++++++++++++++++ .../scripts/hpss_global_archive.py | 80 ++++ .../scripts/hpss_global_archive_driver.sh | 11 + ecf/setup_ecf_links.sh | 8 + 8 files changed, 818 insertions(+) create mode 100644 ecf/scripts/workflow_manager/cycled/enkfgdas/jenkfgdas_emc_earc_master.ecf create mode 100644 ecf/scripts/workflow_manager/cycled/gdas/jgdas_emc_arch.ecf create mode 100644 ecf/scripts/workflow_manager/cycled/gfs/jgfs_emc_arch.ecf create mode 100755 ecf/scripts/workflow_manager/jobs/JENKFGDAS_OFFLINE_ARCHIVE create mode 100755 ecf/scripts/workflow_manager/jobs/JGLOBAL_OFFLINE_ARCHIVE create mode 100644 ecf/scripts/workflow_manager/scripts/hpss_global_archive.py create mode 100755 ecf/scripts/workflow_manager/scripts/hpss_global_archive_driver.sh diff --git a/ecf/scripts/workflow_manager/cycled/enkfgdas/jenkfgdas_emc_earc_master.ecf b/ecf/scripts/workflow_manager/cycled/enkfgdas/jenkfgdas_emc_earc_master.ecf new file mode 100644 index 00000000000..e1bdf5a4d68 --- /dev/null +++ b/ecf/scripts/workflow_manager/cycled/enkfgdas/jenkfgdas_emc_earc_master.ecf @@ -0,0 +1,66 @@ +#PBS -S /bin/bash +#PBS -N enkfgdas_emc_earc_%ENSGRP%_%CYC% +#PBS -j oe +#PBS -q %QUEUE% +#PBS -A %PROJ%-%PROJENVIR% +#PBS -l walltime=00:30:00 +#PBS -l place=vscatter,select=1:ncpus=1:mem=10GB +#PBS -l debug=true + +model=gfs +%include +%include + +set -x + +export NET=%NET:gfs% +export RUN=gdas +export CDUMP=gdas +export ENSGRP=%ENSGRP% + +############################################################ +# Load modules +############################################################ + +module list + +############################################################# +# WCOSS environment settings +############################################################# +export cyc=%CYC% +export cycle=t%CYC%z +export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} +export CDATE="$PDY$cyc" + +############################################################# +# Tag up log files for transfer +############################################################# +if [ $ENSGRP -eq 0 ] +then + archive_log_dir=${ROTDIR}/logs/${CDATE} + mkdir -p $archive_log_dir + ecf_log_dir=$PBS_O_WORKDIR + cd $ecf_log_dir + [[ -s enkfgdas_${CDATE}_archive_list.sh ]] && rm -f enkfgdas_${CDATE}_archive_list.sh + grep "export CDATE=$CDATE" enkfgdas_*|grep -v "Binary file" | awk -F ":" -v target_n=$archive_log_dir '{print "cp -p",$1,target_n"/"$1".log"}' &> enkfgdas_${CDATE}_archive_list.sh + sh enkfgdas_${CDATE}_archive_list.sh +fi + +############################################################# +# CALL executable job script here +############################################################# +${HOME_emc_ecf_wm}/jobs/JENKFGDAS_OFFLINE_ARCHIVE + +if [ $? -ne 0 ]; then + ecflow_client --msg="***JOB ${ECF_NAME} ERROR RUNNING J-SCRIPT ***" + ecflow_client --abort + exit +fi + +%include +%manual + +%end +~ +~ + diff --git a/ecf/scripts/workflow_manager/cycled/gdas/jgdas_emc_arch.ecf b/ecf/scripts/workflow_manager/cycled/gdas/jgdas_emc_arch.ecf new file mode 100644 index 00000000000..1f7c5d12fff --- /dev/null +++ b/ecf/scripts/workflow_manager/cycled/gdas/jgdas_emc_arch.ecf @@ -0,0 +1,60 @@ +#PBS -S /bin/bash +#PBS -N %RUN%_emc_arch_%CYC% +#PBS -j oe +#PBS -q %QUEUE% +#PBS -A %PROJ%-%PROJENVIR% +#PBS -l walltime=00:30:00 +#PBS -l place=vscatter,select=1:ncpus=1:mem=2GB +#PBS -l debug=true + +model=gfs +%include +%include + +set -x + +export NET=%NET:gfs% +export RUN=%RUN% +export CDUMP=%RUN% + +############################################################ +# Load modules +############################################################ + +module list + +############################################################# +# WCOSS environment settings +############################################################# +export cyc=%CYC% +export cycle=t%CYC%z +export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} +export CDATE="$PDY$cyc" + +############################################################# +# Tag up log files for transfer +############################################################# +archive_log_dir=${ROTDIR}/logs/${CDATE} +mkdir -p $archive_log_dir +ecf_log_dir=$PBS_O_WORKDIR +cd $ecf_log_dir +[[ -s gdas_${CDATE}_archive_list.sh ]] && rm -f gdas_${CDATE}_archive_list.sh +grep "export CDATE=$CDATE" gdas_*|grep -v "Binary file"|grep -v "_atmos_post"| awk -F ":" -v target_n=$archive_log_dir '{print "cp -p",$1,target_n"/"$1".log"}' &> gdas_${CDATE}_archive_list.sh +grep "export CDATE=$CDATE" gdas_atmos_post*|grep -v "Binary file"| awk -F ":" -v target_n=$archive_log_dir '{print "cp -p",$1,target_n"/gdaspost_"$1".log"}' &>> gdas_${CDATE}_archive_list.sh +sh gdas_${CDATE}_archive_list.sh + +############################################################ +# CALL executable job script here +############################################################ +${HOME_emc_ecf_wm}/jobs/JGLOBAL_OFFLINE_ARCHIVE + +if [ $? -ne 0 ]; then + ecflow_client --msg="***JOB ${ECF_NAME} ERROR RUNNING J-SCRIPT ***" + ecflow_client --abort + exit +fi + +%include +%manual + +%end diff --git a/ecf/scripts/workflow_manager/cycled/gfs/jgfs_emc_arch.ecf b/ecf/scripts/workflow_manager/cycled/gfs/jgfs_emc_arch.ecf new file mode 100644 index 00000000000..66becb4bec5 --- /dev/null +++ b/ecf/scripts/workflow_manager/cycled/gfs/jgfs_emc_arch.ecf @@ -0,0 +1,59 @@ +#PBS -S /bin/bash +#PBS -N %RUN%_emc_arch_%CYC% +#PBS -j oe +#PBS -q %QUEUE% +#PBS -A %PROJ%-%PROJENVIR% +#PBS -l walltime=00:30:00 +#PBS -l place=vscatter,select=1:ncpus=1:mem=60GB +#PBS -l debug=true + +model=gfs +%include +%include + +set -x + +export NET=%NET:gfs% +export RUN=%RUN% +export CDUMP=%RUN% + +############################################################ +# Load modules +############################################################ + +module list + +############################################################# +# WCOSS environment settings +############################################################# +export cyc=%CYC% +export cycle=t%CYC%z +export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} +export CDATE="$PDY$cyc" + +############################################################# +# Tag up log files for transfer +############################################################# +archive_log_dir=${ROTDIR}/logs/${CDATE} +mkdir -p $archive_log_dir +ecf_log_dir=$PBS_O_WORKDIR +cd $ecf_log_dir +[[ -s gfs_${CDATE}_archive_list.sh ]] && rm -f gfs_${CDATE}_archive_list.sh +grep "export CDATE=$CDATE" gfs_*|grep -v "Binary file" | awk -F ":" -v target_n=$archive_log_dir '{print "cp -p",$1,target_n"/"$1".log"}' &> gfs_${CDATE}_archive_list.sh +sh gfs_${CDATE}_archive_list.sh + +############################################################ +# CALL executable job script here +############################################################ +${HOME_emc_ecf_wm}/jobs/JGLOBAL_OFFLINE_ARCHIVE + +if [ $? -ne 0 ]; then + ecflow_client --msg="***JOB ${ECF_NAME} ERROR RUNNING J-SCRIPT ***" + ecflow_client --abort + exit +fi + +%include +%manual + +%end diff --git a/ecf/scripts/workflow_manager/jobs/JENKFGDAS_OFFLINE_ARCHIVE b/ecf/scripts/workflow_manager/jobs/JENKFGDAS_OFFLINE_ARCHIVE new file mode 100755 index 00000000000..25fba21db6a --- /dev/null +++ b/ecf/scripts/workflow_manager/jobs/JENKFGDAS_OFFLINE_ARCHIVE @@ -0,0 +1,189 @@ +#!/bin/ksh -x + +export RUN_ENVIR=${RUN_ENVIR:-"nco"} +export PS4='$SECONDS + ' +date + + +############################# +# Source relevant config files +############################# +export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} +configs="base earc" +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 + + +############################################## +# 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} +n=$((ENSGRP)) + +############################################## +# Begin JOB SPECIFIC work +############################################## + +# ICS are restarts and always lag INC by $assim_freq hours. +EARCINC_CYC=$ARCH_CYC +EARCICS_CYC=$((ARCH_CYC-assim_freq)) +if [ $EARCICS_CYC -lt 0 ]; then + EARCICS_CYC=$((EARCICS_CYC+24)) +fi + +# EnKF update in GFS, GDAS or both +CDUMP_ENKF=$(echo ${EUPD_CYC:-"gdas"} | tr a-z A-Z) + +export ARCH_LIST="$ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/earc$ENSGRP" +[[ -d $ARCH_LIST ]] && rm -rf $ARCH_LIST +mkdir -p $ARCH_LIST +cd $ARCH_LIST + +$HOMEgfs/ush/hpssarch_gen.sh enkf${CDUMP} +status=$? +if [ $status -ne 0 ]; then + echo "$HOMEgfs/ush/hpssarch_gen.sh enkf${CDUMP} failed, ABORT!" + exit $status +fi + +cd $ROTDIR + +############################################## +# ENSGRP > 0 archives a group of ensemble members +############################################## +firstday=$($NDATE +24 $SDATE) +if [[ $ENSGRP -gt 0 ]] && [[ $HPSSARCH = "YES" ]]; then + +#--display status and location info +echo "Archive file is running offline to increase parallel performance" +export ATARDIR=$ATARDIR +export JOB_LOG_DIR=$PBS_O_WORKDIR + +#--determine when to save ICs for warm start + SAVEWARMICA="NO" + SAVEWARMICB="NO" + mm=`echo $CDATE|cut -c 5-6` + dd=`echo $CDATE|cut -c 7-8` + nday=$(( (mm-1)*30+dd )) + mod=$(($nday % $ARCH_WARMICFREQ)) + if [ $CDATE -eq $firstday -a $cyc -eq $EARCINC_CYC ]; then SAVEWARMICA="YES" ; fi + if [ $CDATE -eq $firstday -a $cyc -eq $EARCICS_CYC ]; then SAVEWARMICB="YES" ; fi + if [ $mod -eq 0 -a $cyc -eq $EARCINC_CYC ]; then SAVEWARMICA="YES" ; fi + if [ $mod -eq 0 -a $cyc -eq $EARCICS_CYC ]; then SAVEWARMICB="YES" ; fi + + if [ $EARCICS_CYC -eq 18 ]; then + nday1=$((nday+1)) + mod1=$(($nday1 % $ARCH_WARMICFREQ)) + if [ $mod1 -eq 0 -a $cyc -eq $EARCICS_CYC ] ; then SAVEWARMICB="YES" ; fi + if [ $mod1 -ne 0 -a $cyc -eq $EARCICS_CYC ] ; then SAVEWARMICB="NO" ; fi + if [ $CDATE -eq $SDATE -a $cyc -eq $EARCICS_CYC ] ; then SAVEWARMICB="YES" ; fi + fi + + if [ $CDATE -gt $SDATE ]; then # Don't run for first half cycle + + export TRANSFER_TARGET_FILE=enkf${CDUMP}_grp${n} + export TRANSFER_TARGET_FILE_2D=enkf${CDUMP}_grp${ENSGRP} + ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh + status=$? + if [ $status -ne 0 -a $CDATE -ge $firstday ]; then + echo "OFFLINE TAR $CDATE enkf${CDUMP}_grp${ENSGRP}.tar failed" + exit $status + fi + + if [ $SAVEWARMICA = "YES" -a $cyc -eq $EARCINC_CYC ]; then + export TRANSFER_TARGET_FILE=enkf${CDUMP}_restarta_grp${n} + export TRANSFER_TARGET_FILE_2D=enkf${CDUMP}_restarta_grp${ENSGRP} + ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh + status=$? + if [ $status -ne 0 ]; then + echo "OFFLINE TAR $CDATE enkf${CDUMP}_restarta_grp${ENSGRP}.tar failed" + exit $status + fi + fi + + if [ $SAVEWARMICB = "YES" -a $cyc -eq $EARCICS_CYC ]; then + export TRANSFER_TARGET_FILE=enkf${CDUMP}_restartb_grp${n} + export TRANSFER_TARGET_FILE_2D=enkf${CDUMP}_restartb_grp${ENSGRP} + ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh + status=$? + if [ $status -ne 0 ]; then + echo "OFFLINE TAR $CDATE enkf${CDUMP}_restartb_grp${ENSGRP}.tar failed" + exit $status + fi + fi + + fi # CDATE>SDATE + +fi + + +################################################################### +# ENSGRP 0 archives ensemble means and copy data to online archive +if [ $ENSGRP -eq 0 ]; then + + if [ $HPSSARCH = "YES" ]; then + export TRANSFER_TARGET_FILE=enkf${CDUMP} + ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh + status=$? + if [ $status -ne 0 -a $CDATE -ge $firstday ]; then + echo "OFFLINE TAR $CDATE enkf${CDUMP}.tar failed" + exit $status + fi + fi + + #-- Archive online for verification and diagnostics + [[ ! -d $ARCDIR ]] && mkdir -p $ARCDIR + cd $ARCDIR + + $NCP $ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.enkfstat enkfstat.${CDUMP}.$CDATE + $NCP $ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.${CDUMP}.${CDATE}.ensmean + + if [ $CDUMP_ENKF != "GDAS" ]; then + $NCP $ROTDIR/enkfgfs.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.enkfstat enkfstat.gfs.$CDATE + $NCP $ROTDIR/enkfgfs.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.gfs.${CDATE}.ensmean + fi + +fi + +echo "ENDED NORMALLY." + +########################################## +# Remove the Temporary working directory +########################################## +cd $DATAROOT +[[ $KEEPDATA = "NO" ]] && rm -rf $DATA + +date +exit 0 diff --git a/ecf/scripts/workflow_manager/jobs/JGLOBAL_OFFLINE_ARCHIVE b/ecf/scripts/workflow_manager/jobs/JGLOBAL_OFFLINE_ARCHIVE new file mode 100755 index 00000000000..644091f3a52 --- /dev/null +++ b/ecf/scripts/workflow_manager/jobs/JGLOBAL_OFFLINE_ARCHIVE @@ -0,0 +1,345 @@ +#!/bin/ksh -x + +export RUN_ENVIR=${RUN_ENVIR:-"nco"} +export PS4='$SECONDS + ' +date + + +############################# +# Source relevant config files +############################# +export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} +configs="base arch" +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 + + +############################################## +# 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} + + +############################################## +# Begin JOB SPECIFIC work +############################################## +COMIN_OBS=${COMIN_OBS:-$(compath.py prod/obsproc/${obsproc_ver})/$RUN.$PDY/$cyc/atmos} +COMIN=${COMIN:-$ROTDIR/$RUN.$PDY/$cyc/atmos} +cd $COMIN + +# ICS are restarts and always lag INC by $assim_freq hours +ARCHINC_CYC=$ARCH_CYC +ARCHICS_CYC=$((ARCH_CYC-assim_freq)) +if [ $ARCHICS_CYC -lt 0 ]; then + ARCHICS_CYC=$((ARCHICS_CYC+24)) +fi + +# CURRENT CYCLE +APREFIX="${CDUMP}.t${cyc}z." +ASUFFIX=${ASUFFIX:-$SUFFIX} + +if [ $ASUFFIX = ".nc" ]; then + format="netcdf" +else + format="nemsio" +fi + +############################################################### +# Archive online for verification and diagnostics +############################################################### + +COMIN=${COMINatmos:-"$ROTDIR/$CDUMP.$PDY/$cyc/atmos"} +cd $COMIN + +[[ ! -d $ARCDIR ]] && mkdir -p $ARCDIR +$NCP ${APREFIX}gsistat $ARCDIR/gsistat.${CDUMP}.${CDATE} +$NCP ${APREFIX}pgrb2.1p00.anl $ARCDIR/pgbanl.${CDUMP}.${CDATE}.grib2 + +# Archive 1 degree forecast GRIB2 files for verification +if [ $CDUMP = "gfs" ]; then + fhmax=$FHMAX_GFS + fhr=0 + while [ $fhr -le $fhmax ]; do + fhr2=$(printf %02i $fhr) + fhr3=$(printf %03i $fhr) + $NCP ${APREFIX}pgrb2.1p00.f$fhr3 $ARCDIR/pgbf${fhr2}.${CDUMP}.${CDATE}.grib2 + (( fhr = $fhr + $FHOUT_GFS )) + done +fi +if [ $CDUMP = "gdas" ]; then + flist="000 003 006 009" + for fhr in $flist; do + fname=${APREFIX}pgrb2.1p00.f${fhr} + fhr2=$(printf %02i $fhr) + $NCP $fname $ARCDIR/pgbf${fhr2}.${CDUMP}.${CDATE}.grib2 + done +fi + +if [ -s avno.t${cyc}z.cyclone.trackatcfunix ]; then + PLSOT4=`echo $PSLOT|cut -c 1-4 |tr '[a-z]' '[A-Z]'` + cat avno.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunix.${CDUMP}.$CDATE + cat avnop.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunixp.${CDUMP}.$CDATE +fi + +if [ $CDUMP = "gdas" -a -s gdas.t${cyc}z.cyclone.trackatcfunix ]; then + PLSOT4=`echo $PSLOT|cut -c 1-4 |tr '[a-z]' '[A-Z]'` + cat gdas.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunix.${CDUMP}.$CDATE + cat gdasp.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunixp.${CDUMP}.$CDATE +fi + +if [ $CDUMP = "gfs" ]; then + $NCP storms.gfso.atcf_gen.$CDATE ${ARCDIR}/. + $NCP storms.gfso.atcf_gen.altg.$CDATE ${ARCDIR}/. + $NCP trak.gfso.atcfunix.$CDATE ${ARCDIR}/. + $NCP trak.gfso.atcfunix.altg.$CDATE ${ARCDIR}/. + + mkdir -p ${ARCDIR}/tracker.$CDATE/$CDUMP + blist="epac natl" + for basin in $blist; do + cp -rp $basin ${ARCDIR}/tracker.$CDATE/$CDUMP + done +fi + +# Archive required gaussian gfs forecast files for Fit2Obs +if [ $CDUMP = "gfs" -a $FITSARC = "YES" ]; then + VFYARC=${VFYARC:-$ROTDIR/vrfyarch} + [[ ! -d $VFYARC ]] && mkdir -p $VFYARC + mkdir -p $VFYARC/${CDUMP}.$PDY/$cyc + prefix=${CDUMP}.t${cyc}z + fhmax=${FHMAX_FITS:-$FHMAX_GFS} + fhr=0 + while [[ $fhr -le $fhmax ]]; do + fhr3=$(printf %03i $fhr) + sfcfile=${prefix}.sfcf${fhr3}${ASUFFIX} + sigfile=${prefix}.atmf${fhr3}${ASUFFIX} + $NCP $sfcfile $VFYARC/${CDUMP}.$PDY/$cyc/ + $NCP $sigfile $VFYARC/${CDUMP}.$PDY/$cyc/ + (( fhr = $fhr + 6 )) + done +fi + + +############################################################### +# Archive data to OFFLINE SAVE +if [ $HPSSARCH = "YES" ]; then +############################################################### + +#--display status and location info +echo "Archive is running offline to increase parallel performance" +export ATARDIR=$ATARDIR +export JOB_LOG_DIR=$PBS_O_WORKDIR + +#--determine when to save ICs for warm start and forecast-only runs +SAVEWARMICA="NO" +SAVEWARMICB="NO" +SAVEFCSTIC="NO" +firstday=$($NDATE +24 $SDATE) +mm=`echo $CDATE|cut -c 5-6` +dd=`echo $CDATE|cut -c 7-8` +nday=$(( (mm-1)*30+dd )) +mod=$(($nday % $ARCH_WARMICFREQ)) +if [ $CDATE -eq $firstday -a $cyc -eq $ARCHINC_CYC ]; then SAVEWARMICA="YES" ; fi +if [ $CDATE -eq $firstday -a $cyc -eq $ARCHICS_CYC ]; then SAVEWARMICB="YES" ; fi +if [ $mod -eq 0 -a $cyc -eq $ARCHINC_CYC ]; then SAVEWARMICA="YES" ; fi +if [ $mod -eq 0 -a $cyc -eq $ARCHICS_CYC ]; then SAVEWARMICB="YES" ; fi + +if [ $ARCHICS_CYC -eq 18 ]; then + nday1=$((nday+1)) + mod1=$(($nday1 % $ARCH_WARMICFREQ)) + if [ $mod1 -eq 0 -a $cyc -eq $ARCHICS_CYC ] ; then SAVEWARMICB="YES" ; fi + if [ $mod1 -ne 0 -a $cyc -eq $ARCHICS_CYC ] ; then SAVEWARMICB="NO" ; fi + if [ $CDATE -eq $SDATE -a $cyc -eq $ARCHICS_CYC ] ; then SAVEWARMICB="YES" ; fi +fi + +mod=$(($nday % $ARCH_FCSTICFREQ)) +if [ $mod -eq 0 -o $CDATE -eq $firstday ]; then SAVEFCSTIC="YES" ; fi + + +export ARCH_LIST="$COMIN/archlist" +[[ -d $ARCH_LIST ]] && rm -rf $ARCH_LIST +mkdir -p $ARCH_LIST +cd $ARCH_LIST + +$HOMEgfs/ush/hpssarch_gen.sh $CDUMP +status=$? +if [ $status -ne 0 ]; then + echo "$HOMEgfs/ush/hpssarch_gen.sh $CDUMP failed, ABORT!" + exit $status +fi + +cd $ROTDIR + +if [ $CDUMP = "gfs" ]; then + + #for targrp in gfsa gfsb - NOTE - do not check htar error status + for targrp in gfsa gfsb; do + export TRANSFER_TARGET_FILE=$targrp + ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh + done + + if [ ${SAVEFCSTNEMSIO:-"YES"} = "YES" ]; then + for targrp in gfs_flux gfs_${format}a gfs_${format}b gfs_pgrb2b; do + export TRANSFER_TARGET_FILE=$targrp + ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh + status=$? + if [ $status -ne 0 -a $CDATE -ge $firstday ]; then + echo "OFFLINE TAR $CDATE ${targrp}.tar failed" + exit $status + fi + done + fi + + #for targrp in gfswave + if [ $DO_WAVE = "YES" -a "$WAVE_CDUMP" != "gdas" ]; then + for targrp in gfswave; do + export TRANSFER_TARGET_FILE=$targrp + ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh + status=$? + if [ $status -ne 0 -a $CDATE -ge $firstday ]; then + echo "OFFLINE TAR $CDATE ${targrp}.tar failed" + exit $status + fi + done + fi + + #for restarts + if [ $SAVEFCSTIC = "YES" ]; then + export TRANSFER_TARGET_FILE=gfs_restarta + ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh + status=$? + if [ $status -ne 0 -a $CDATE -ge $firstday ]; then + echo "OFFLINE TAR $CDATE gfs_restarta.tar failed" + exit $status + fi + fi + + #for downstream products + if [ $DO_BUFRSND = "YES" -o $WAFSF = "YES" ]; then + #### htar -P -cvf $ATARDIR/$CDATE/gfs_downstream.tar `cat $ARCH_LIST/gfs_downstream.txt` + #### tar -P -cvf $COM_ARCHOFFLINE/$CDATE/gfs_downstream.tar `cat $ARCH_LIST/gfs_downstream.txt` + export TRANSFER_TARGET_FILE=gfs_downstream + ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh + status=$? + if [ $status -ne 0 -a $CDATE -ge $firstday ]; then + echo "OFFLINE TAR $CDATE gfs_downstream.tar failed" + exit $status + fi + fi + +fi + + +if [ $CDUMP = "gdas" ]; then + + export TRANSFER_TARGET_FILE=gdas + ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh + status=$? + if [ $status -ne 0 -a $CDATE -ge $firstday ]; then + echo "OFFLINE TAR $CDATE gdas.tar failed" + exit $status + fi + + #gdaswave + if [ $DO_WAVE = "YES" ]; then + export TRANSFER_TARGET_FILE=gdaswave + ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh + status=$? + if [ $status -ne 0 -a $CDATE -ge $firstday ]; then + echo "OFFLINE TAR $CDATE gdaswave.tar failed" + exit $status + fi + fi + + if [ $SAVEWARMICA = "YES" -o $SAVEFCSTIC = "YES" ]; then + export TRANSFER_TARGET_FILE=gdas_restarta + ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh + status=$? + if [ $status -ne 0 -a $CDATE -ge $firstday ]; then + echo "OFFLINE TAR $CDATE gdas_restarta.tar failed" + exit $status + fi + if [ $DO_WAVE = "YES" ]; then + export TRANSFER_TARGET_FILE=gdaswave_restart + ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh + status=$? + if [ $status -ne 0 -a $CDATE -ge $firstday ]; then + echo "OFFLINE TAR $CDATE gdaswave_restart.tar failed" + exit $status + fi + fi + fi + + if [ $SAVEWARMICB = "YES" -o $SAVEFCSTIC = "YES" ]; then + export TRANSFER_TARGET_FILE=gdas_restartb + ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh + status=$? + if [ $status -ne 0 -a $CDATE -ge $firstday ]; then + echo "OFFLINE TAR $CDATE gdas_restartb.tar failed" + exit $status + fi + fi + +fi + +############################################################### +fi ##end of HPSS archive +############################################################### + + + +############################################################### +# Clean up previous cycles; various depths +# PRIOR CYCLE: Leave the prior cycle alone +GDATE=$($NDATE -$assim_freq $CDATE) + +# PREVIOUS to the PRIOR CYCLE +GDATE=$($NDATE -$assim_freq $GDATE) +gPDY=$(echo $GDATE | cut -c1-8) +gcyc=$(echo $GDATE | cut -c9-10) + +# Remove the TMPDIR directory +COMIN="$RUNDIR/$GDATE" +[[ -d $COMIN ]] && rm -rf $COMIN + +echo "ENDED NORMALLY." + +########################################## +# Remove the Temporary working directory +########################################## +cd $DATAROOT +[[ $KEEPDATA = "NO" ]] && rm -rf $DATA + +date +exit 0 diff --git a/ecf/scripts/workflow_manager/scripts/hpss_global_archive.py b/ecf/scripts/workflow_manager/scripts/hpss_global_archive.py new file mode 100644 index 00000000000..a52aa488c63 --- /dev/null +++ b/ecf/scripts/workflow_manager/scripts/hpss_global_archive.py @@ -0,0 +1,80 @@ +''' +Program Name: hpss_global_archive.py +Developer: Lin Gan +Description: This python script dynamically create a transfer job, submit, and upload file to hpss +Input Environment Variable: + machine - Currently support WCOSS2 + NET - parallel env + RUN - parallel env + HOMEgfs - parallel env + EXPDIR - parallel env + QUEUE - parallel env + ACCOUNT - parallel env + nproc - wcoss2 default +''' + +import os + +print("BEGIN: "+os.path.basename(__file__)) + +# Read in environment variables +machine = os.environ['machine'] +NET = os.environ['NET'] +RUN = os.environ['RUN'] +JOB_LOG_DIR = os.environ['JOB_LOG_DIR'] +QUEUE_ARCH = os.environ['QUEUE_ARCH'] +ACCOUNT = os.environ['ACCOUNT'] +ARCH_LIST = os.environ['ARCH_LIST'] +SOURCE_DIR = os.environ['SOURCE_DIR'] +HPSS_TARGET_DIR = os.environ['HPSS_TARGET_DIR'] +TRANSFER_TARGET_FILE = os.environ['TRANSFER_TARGET_FILE'] +PDY = os.environ['PDY'] +CYC = os.environ['cyc'] + +# Create job card directory and file name +if not 'TRANSFER_TARGET_FILE_2D' in os.environ: + TRANSFER_TARGET_FILE_2D = TRANSFER_TARGET_FILE +else: + TRANSFER_TARGET_FILE_2D = os.environ['TRANSFER_TARGET_FILE_2D'] +if not os.path.exists(JOB_LOG_DIR): + os.makedirs(JOB_LOG_DIR) +job_name = RUN+'_HPSS_ARCHIVE_'+TRANSFER_TARGET_FILE+'_'+PDY+CYC +job_card_filename = os.path.join(JOB_LOG_DIR,job_name+'.sh') +job_output_filename = os.path.join(JOB_LOG_DIR,job_name+'.out') +if os.path.exists(job_output_filename): + os.remove(job_output_filename) + +# Create job card +print("Writing job card to "+job_card_filename) +with open(job_card_filename, 'w') as job_card: + if machine == 'WCOSS2': + job_card.write('#!/bin/sh\n') + job_card.write('#PBS -q '+QUEUE_ARCH+'\n') + job_card.write('#PBS -A '+ACCOUNT+'\n') + job_card.write('#PBS -V \n') + job_card.write('#PBS -N '+job_name+'\n') + job_card.write('#PBS -o '+job_output_filename+'\n') + job_card.write('#PBS -e '+job_output_filename+'\n') + job_card.write('#PBS -l walltime=05:55:00\n') + job_card.write('#PBS -l debug=true\n') + job_card.write('#PBS -l place=vscatter,select=1:ncpus=1:mem=30GB') + job_card.write('\n') + job_card.write('set -x \n') + job_card.write('\n') + job_card.write('#### '+HPSS_TARGET_DIR+'/'+TRANSFER_TARGET_FILE_2D+'.tar '+ARCH_LIST+'/'+TRANSFER_TARGET_FILE+'.txt' ' \n') + job_card.write('cd '+SOURCE_DIR+'\n') + job_card.write('\n') + job_card.write('htar -P -cvf '+HPSS_TARGET_DIR+'/'+TRANSFER_TARGET_FILE_2D+'.tar `cat '+ARCH_LIST+'/'+TRANSFER_TARGET_FILE+'.txt`') + job_card.write('\n') + job_card.write('status=$? \n') + job_card.write('if [ $status -ne 0 ]; then \n') + job_card.write(' exit $status \n') + job_card.write('fi \n') + +# Submit job card +print("Submitting "+job_card_filename+" to "+QUEUE_ARCH) +print("Output sent to "+job_output_filename) +if machine == 'WCOSS2': + os.system('qsub '+job_card_filename) + +print("END: "+os.path.basename(__file__)) diff --git a/ecf/scripts/workflow_manager/scripts/hpss_global_archive_driver.sh b/ecf/scripts/workflow_manager/scripts/hpss_global_archive_driver.sh new file mode 100755 index 00000000000..432c0384368 --- /dev/null +++ b/ecf/scripts/workflow_manager/scripts/hpss_global_archive_driver.sh @@ -0,0 +1,11 @@ +set -x + +pslot=${PSLOT:-""} +export JOB_LOG_DIR=${JOB_LOG_DIR:-""} +export SOURCE_DIR=${ROTDIR:-""} +export ARCH_LIST=${ARCH_LIST:-""} +export HPSS_TARGET_DIR=${ATARDIR:-""} + +echo "Dynamically create an archive job to archive files in $TRANSFER_TARGET_FILE" + +python ${HOME_emc_ecf_wm}/scripts/hpss_global_archive.py diff --git a/ecf/setup_ecf_links.sh b/ecf/setup_ecf_links.sh index b0dce50cc5c..2cc655bcc03 100755 --- a/ecf/setup_ecf_links.sh +++ b/ecf/setup_ecf_links.sh @@ -57,3 +57,11 @@ cd $ECF_DIR/scripts/gfs/atmos/post_processing/grib_wafs echo "Linking gfs/atmos/post_processing/grib_wafs ..." fhrs=($(seq 0 6 120)) link_master_to_fhr "jgfs_atmos_wafs" "$fhrs" + +# EnKF GDAS earc files +if [ $RUN_ENVIR == "emc" ]; then + cd $ECF_DIR/scripts/workflow_manager/cycled/enkfgdas + echo "Linking enkfgdas/earc ..." + grps=($(seq 0 8)) + link_master_to_grp "jenkfgdas_emc_earc" "$grps" +fi From 5dfb5e09237c16df1f9063ac9088b678f3e4dc18 Mon Sep 17 00:00:00 2001 From: "Lin.Gan" Date: Fri, 7 Oct 2022 17:30:44 +0000 Subject: [PATCH 02/21] Remove ecflow components Move JJob and scripts into HOMEgfs level --- .../enkfgdas/jenkfgdas_emc_earc_master.ecf | 66 ------------------ .../cycled/gdas/jgdas_emc_arch.ecf | 60 ----------------- .../cycled/gfs/jgfs_emc_arch.ecf | 59 ---------------- ecf/setup_ecf_links.sh | 67 ------------------- .../jobs => jobs}/JENKFGDAS_OFFLINE_ARCHIVE | 0 .../jobs => jobs}/JGLOBAL_OFFLINE_ARCHIVE | 0 .../hpss_global_archive_driver.sh | 0 .../scripts => ush}/hpss_global_archive.py | 0 8 files changed, 252 deletions(-) delete mode 100644 ecf/scripts/workflow_manager/cycled/enkfgdas/jenkfgdas_emc_earc_master.ecf delete mode 100644 ecf/scripts/workflow_manager/cycled/gdas/jgdas_emc_arch.ecf delete mode 100644 ecf/scripts/workflow_manager/cycled/gfs/jgfs_emc_arch.ecf delete mode 100755 ecf/setup_ecf_links.sh rename {ecf/scripts/workflow_manager/jobs => jobs}/JENKFGDAS_OFFLINE_ARCHIVE (100%) rename {ecf/scripts/workflow_manager/jobs => jobs}/JGLOBAL_OFFLINE_ARCHIVE (100%) rename {ecf/scripts/workflow_manager/scripts => scripts}/hpss_global_archive_driver.sh (100%) rename {ecf/scripts/workflow_manager/scripts => ush}/hpss_global_archive.py (100%) diff --git a/ecf/scripts/workflow_manager/cycled/enkfgdas/jenkfgdas_emc_earc_master.ecf b/ecf/scripts/workflow_manager/cycled/enkfgdas/jenkfgdas_emc_earc_master.ecf deleted file mode 100644 index e1bdf5a4d68..00000000000 --- a/ecf/scripts/workflow_manager/cycled/enkfgdas/jenkfgdas_emc_earc_master.ecf +++ /dev/null @@ -1,66 +0,0 @@ -#PBS -S /bin/bash -#PBS -N enkfgdas_emc_earc_%ENSGRP%_%CYC% -#PBS -j oe -#PBS -q %QUEUE% -#PBS -A %PROJ%-%PROJENVIR% -#PBS -l walltime=00:30:00 -#PBS -l place=vscatter,select=1:ncpus=1:mem=10GB -#PBS -l debug=true - -model=gfs -%include -%include - -set -x - -export NET=%NET:gfs% -export RUN=gdas -export CDUMP=gdas -export ENSGRP=%ENSGRP% - -############################################################ -# Load modules -############################################################ - -module list - -############################################################# -# WCOSS environment settings -############################################################# -export cyc=%CYC% -export cycle=t%CYC%z -export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} -export CDATE="$PDY$cyc" - -############################################################# -# Tag up log files for transfer -############################################################# -if [ $ENSGRP -eq 0 ] -then - archive_log_dir=${ROTDIR}/logs/${CDATE} - mkdir -p $archive_log_dir - ecf_log_dir=$PBS_O_WORKDIR - cd $ecf_log_dir - [[ -s enkfgdas_${CDATE}_archive_list.sh ]] && rm -f enkfgdas_${CDATE}_archive_list.sh - grep "export CDATE=$CDATE" enkfgdas_*|grep -v "Binary file" | awk -F ":" -v target_n=$archive_log_dir '{print "cp -p",$1,target_n"/"$1".log"}' &> enkfgdas_${CDATE}_archive_list.sh - sh enkfgdas_${CDATE}_archive_list.sh -fi - -############################################################# -# CALL executable job script here -############################################################# -${HOME_emc_ecf_wm}/jobs/JENKFGDAS_OFFLINE_ARCHIVE - -if [ $? -ne 0 ]; then - ecflow_client --msg="***JOB ${ECF_NAME} ERROR RUNNING J-SCRIPT ***" - ecflow_client --abort - exit -fi - -%include -%manual - -%end -~ -~ - diff --git a/ecf/scripts/workflow_manager/cycled/gdas/jgdas_emc_arch.ecf b/ecf/scripts/workflow_manager/cycled/gdas/jgdas_emc_arch.ecf deleted file mode 100644 index 1f7c5d12fff..00000000000 --- a/ecf/scripts/workflow_manager/cycled/gdas/jgdas_emc_arch.ecf +++ /dev/null @@ -1,60 +0,0 @@ -#PBS -S /bin/bash -#PBS -N %RUN%_emc_arch_%CYC% -#PBS -j oe -#PBS -q %QUEUE% -#PBS -A %PROJ%-%PROJENVIR% -#PBS -l walltime=00:30:00 -#PBS -l place=vscatter,select=1:ncpus=1:mem=2GB -#PBS -l debug=true - -model=gfs -%include -%include - -set -x - -export NET=%NET:gfs% -export RUN=%RUN% -export CDUMP=%RUN% - -############################################################ -# Load modules -############################################################ - -module list - -############################################################# -# WCOSS environment settings -############################################################# -export cyc=%CYC% -export cycle=t%CYC%z -export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} -export CDATE="$PDY$cyc" - -############################################################# -# Tag up log files for transfer -############################################################# -archive_log_dir=${ROTDIR}/logs/${CDATE} -mkdir -p $archive_log_dir -ecf_log_dir=$PBS_O_WORKDIR -cd $ecf_log_dir -[[ -s gdas_${CDATE}_archive_list.sh ]] && rm -f gdas_${CDATE}_archive_list.sh -grep "export CDATE=$CDATE" gdas_*|grep -v "Binary file"|grep -v "_atmos_post"| awk -F ":" -v target_n=$archive_log_dir '{print "cp -p",$1,target_n"/"$1".log"}' &> gdas_${CDATE}_archive_list.sh -grep "export CDATE=$CDATE" gdas_atmos_post*|grep -v "Binary file"| awk -F ":" -v target_n=$archive_log_dir '{print "cp -p",$1,target_n"/gdaspost_"$1".log"}' &>> gdas_${CDATE}_archive_list.sh -sh gdas_${CDATE}_archive_list.sh - -############################################################ -# CALL executable job script here -############################################################ -${HOME_emc_ecf_wm}/jobs/JGLOBAL_OFFLINE_ARCHIVE - -if [ $? -ne 0 ]; then - ecflow_client --msg="***JOB ${ECF_NAME} ERROR RUNNING J-SCRIPT ***" - ecflow_client --abort - exit -fi - -%include -%manual - -%end diff --git a/ecf/scripts/workflow_manager/cycled/gfs/jgfs_emc_arch.ecf b/ecf/scripts/workflow_manager/cycled/gfs/jgfs_emc_arch.ecf deleted file mode 100644 index 66becb4bec5..00000000000 --- a/ecf/scripts/workflow_manager/cycled/gfs/jgfs_emc_arch.ecf +++ /dev/null @@ -1,59 +0,0 @@ -#PBS -S /bin/bash -#PBS -N %RUN%_emc_arch_%CYC% -#PBS -j oe -#PBS -q %QUEUE% -#PBS -A %PROJ%-%PROJENVIR% -#PBS -l walltime=00:30:00 -#PBS -l place=vscatter,select=1:ncpus=1:mem=60GB -#PBS -l debug=true - -model=gfs -%include -%include - -set -x - -export NET=%NET:gfs% -export RUN=%RUN% -export CDUMP=%RUN% - -############################################################ -# Load modules -############################################################ - -module list - -############################################################# -# WCOSS environment settings -############################################################# -export cyc=%CYC% -export cycle=t%CYC%z -export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} -export CDATE="$PDY$cyc" - -############################################################# -# Tag up log files for transfer -############################################################# -archive_log_dir=${ROTDIR}/logs/${CDATE} -mkdir -p $archive_log_dir -ecf_log_dir=$PBS_O_WORKDIR -cd $ecf_log_dir -[[ -s gfs_${CDATE}_archive_list.sh ]] && rm -f gfs_${CDATE}_archive_list.sh -grep "export CDATE=$CDATE" gfs_*|grep -v "Binary file" | awk -F ":" -v target_n=$archive_log_dir '{print "cp -p",$1,target_n"/"$1".log"}' &> gfs_${CDATE}_archive_list.sh -sh gfs_${CDATE}_archive_list.sh - -############################################################ -# CALL executable job script here -############################################################ -${HOME_emc_ecf_wm}/jobs/JGLOBAL_OFFLINE_ARCHIVE - -if [ $? -ne 0 ]; then - ecflow_client --msg="***JOB ${ECF_NAME} ERROR RUNNING J-SCRIPT ***" - ecflow_client --abort - exit -fi - -%include -%manual - -%end diff --git a/ecf/setup_ecf_links.sh b/ecf/setup_ecf_links.sh deleted file mode 100755 index 2cc655bcc03..00000000000 --- a/ecf/setup_ecf_links.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash - -set -eu - -ECF_DIR=$(pwd) - -# Function that loops over forecast hours and -# creates link between the master and target -function link_master_to_fhr(){ - tmpl=$1 # Name of the master template - fhrs=$2 # Array of forecast hours - for fhr in ${fhrs[@]}; do - fhrchar=$(printf %03d $fhr) - master=${tmpl}_master.ecf - target=${tmpl}_f${fhrchar}.ecf - rm -f $target - ln -sf $master $target - done -} - -# EnKF GDAS post files -cd $ECF_DIR/scripts/enkfgdas/post -echo "Linking enkfgdas/post ..." -fhrs=($(seq 3 9)) -link_master_to_fhr "jenkfgdas_post" "$fhrs" - -# GDAS post files -cd $ECF_DIR/scripts/gdas/atmos/post -echo "Linking gdas/atmos/post ..." -rm -f jgdas_atmos_post_anl.ecf -ln -sf jgdas_atmos_post_master.ecf jgdas_atmos_post_anl.ecf -fhrs=($(seq 0 9)) -link_master_to_fhr "jgdas_atmos_post" "$fhrs" - -# GFS post files -cd $ECF_DIR/scripts/gfs/atmos/post -echo "Linking gfs/atmos/post ..." -rm -f jgfs_atmos_post_anl.ecf -ln -sf jgfs_atmos_post_master.ecf jgfs_atmos_post_anl.ecf -fhrs=($(seq 0 1 120) $(seq 123 3 384)) -link_master_to_fhr "jgfs_atmos_post" "$fhrs" - -# GFS awips 20km 1p0 files -cd $ECF_DIR/scripts/gfs/atmos/post_processing/awips_20km_1p0 -echo "Linking gfs/atmos/post_processing/awips_20km_1p0 ..." -fhrs=($(seq 0 3 84) $(seq 90 6 240)) -link_master_to_fhr "jgfs_atmos_awips" "$fhrs" - -# GFS awips g2 files -cd $ECF_DIR/scripts/gfs/atmos/post_processing/awips_g2 -echo "Linking gfs/atmos/post_processing/awips_g2 ..." -fhrs=($(seq 0 3 84) $(seq 90 6 240)) -link_master_to_fhr "jgfs_atmos_awips_g2" "$fhrs" - -# GFS atmos wafs files -cd $ECF_DIR/scripts/gfs/atmos/post_processing/grib_wafs -echo "Linking gfs/atmos/post_processing/grib_wafs ..." -fhrs=($(seq 0 6 120)) -link_master_to_fhr "jgfs_atmos_wafs" "$fhrs" - -# EnKF GDAS earc files -if [ $RUN_ENVIR == "emc" ]; then - cd $ECF_DIR/scripts/workflow_manager/cycled/enkfgdas - echo "Linking enkfgdas/earc ..." - grps=($(seq 0 8)) - link_master_to_grp "jenkfgdas_emc_earc" "$grps" -fi diff --git a/ecf/scripts/workflow_manager/jobs/JENKFGDAS_OFFLINE_ARCHIVE b/jobs/JENKFGDAS_OFFLINE_ARCHIVE similarity index 100% rename from ecf/scripts/workflow_manager/jobs/JENKFGDAS_OFFLINE_ARCHIVE rename to jobs/JENKFGDAS_OFFLINE_ARCHIVE diff --git a/ecf/scripts/workflow_manager/jobs/JGLOBAL_OFFLINE_ARCHIVE b/jobs/JGLOBAL_OFFLINE_ARCHIVE similarity index 100% rename from ecf/scripts/workflow_manager/jobs/JGLOBAL_OFFLINE_ARCHIVE rename to jobs/JGLOBAL_OFFLINE_ARCHIVE diff --git a/ecf/scripts/workflow_manager/scripts/hpss_global_archive_driver.sh b/scripts/hpss_global_archive_driver.sh similarity index 100% rename from ecf/scripts/workflow_manager/scripts/hpss_global_archive_driver.sh rename to scripts/hpss_global_archive_driver.sh diff --git a/ecf/scripts/workflow_manager/scripts/hpss_global_archive.py b/ush/hpss_global_archive.py similarity index 100% rename from ecf/scripts/workflow_manager/scripts/hpss_global_archive.py rename to ush/hpss_global_archive.py From f80ee7202a7583a71eaa2cce46e588816013c48e Mon Sep 17 00:00:00 2001 From: "Lin.Gan" Date: Thu, 20 Oct 2022 17:35:16 +0000 Subject: [PATCH 03/21] Init commit --- workflow/hosts/wcoss2.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/workflow/hosts/wcoss2.yaml b/workflow/hosts/wcoss2.yaml index e715ed3e9b3..78d2a67dc6b 100644 --- a/workflow/hosts/wcoss2.yaml +++ b/workflow/hosts/wcoss2.yaml @@ -12,9 +12,12 @@ scheduler: pbspro queue: 'dev' queue_service: 'dev_transfer' partition_batch: '' +partition_service: 'dev_transfer' chgrp_rstprod: 'YES' chgrp_cmd: 'chgrp rstprod' hpssarch: 'YES' localarch: 'NO' atardir: '/NCEPDEV/$HPSS_PROJECT/1year/$USER/$machine/scratch/$PSLOT' +make_nsstbufr: 'YES' +make_acftbufr: 'YES' supported_resolutions: ['C768', 'C384', 'C192', 'C96', 'C48'] From 838ecd73ffd8c509177b7e18c5c4fa3681858c10 Mon Sep 17 00:00:00 2001 From: "Lin.Gan" Date: Tue, 1 Nov 2022 14:57:34 +0000 Subject: [PATCH 04/21] Add J-Job and ex script for archive job development --- ...GDAS_OFFLINE_ARCHIVE => JENKFGDAS_ARCHIVE} | 71 ++- jobs/JGLOBAL_ARCHIVE | 99 ++++ jobs/JGLOBAL_OFFLINE_ARCHIVE | 345 -------------- jobs/rocoto/arch.sh | 400 +--------------- jobs/rocoto/earc.sh | 218 +-------- scripts/exglobal_archive.sh | 448 ++++++++++++++++++ .../hpss_global_archive_driver.sh | 4 +- 7 files changed, 621 insertions(+), 964 deletions(-) rename jobs/{JENKFGDAS_OFFLINE_ARCHIVE => JENKFGDAS_ARCHIVE} (73%) create mode 100755 jobs/JGLOBAL_ARCHIVE delete mode 100755 jobs/JGLOBAL_OFFLINE_ARCHIVE create mode 100644 scripts/exglobal_archive.sh rename {scripts => ush}/hpss_global_archive_driver.sh (69%) diff --git a/jobs/JENKFGDAS_OFFLINE_ARCHIVE b/jobs/JENKFGDAS_ARCHIVE similarity index 73% rename from jobs/JENKFGDAS_OFFLINE_ARCHIVE rename to jobs/JENKFGDAS_ARCHIVE index 25fba21db6a..67814d6dbba 100755 --- a/jobs/JENKFGDAS_OFFLINE_ARCHIVE +++ b/jobs/JENKFGDAS_ARCHIVE @@ -86,11 +86,6 @@ cd $ROTDIR firstday=$($NDATE +24 $SDATE) if [[ $ENSGRP -gt 0 ]] && [[ $HPSSARCH = "YES" ]]; then -#--display status and location info -echo "Archive file is running offline to increase parallel performance" -export ATARDIR=$ATARDIR -export JOB_LOG_DIR=$PBS_O_WORKDIR - #--determine when to save ICs for warm start SAVEWARMICA="NO" SAVEWARMICB="NO" @@ -177,6 +172,72 @@ if [ $ENSGRP -eq 0 ]; then fi +############################################################### +# Clean up COM +############################################################### +if [[ "${DELETE_COM_IN_ARCHIVE_JOB:-YES}" == NO -o "${ROCOTO_WORKFLOW:-YES}" == NO ]] ; then + exit 0 +fi + +############################################################### +# ENSGRP 0 also does clean-up +if [ $ENSGRP -eq 0 ]; then + + # Start start and end dates to remove + GDATEEND=$($NDATE -${RMOLDEND_ENKF:-24} $CDATE) + GDATE=$($NDATE -${RMOLDSTD_ENKF:-120} $CDATE) + while [ $GDATE -le $GDATEEND ]; do + + gPDY=$(echo $GDATE | cut -c1-8) + gcyc=$(echo $GDATE | cut -c9-10) + + # Loop over GDAS and GFS EnKF directories separately. + clist="gdas gfs" + for ctype in $clist; do + COMIN_ENS="$ROTDIR/enkf$ctype.$gPDY/$gcyc/$COMPONENT" + if [ -d $COMIN_ENS ]; then + rocotolog="$EXPDIR/logs/${GDATE}.log" + if [ -f $rocotolog ]; then + testend=$(tail -n 1 $rocotolog | grep "This cycle is complete: Success") + rc=$? + if [ $rc -eq 0 ]; then + # Retain f006.ens files. Remove everything else + for file in $(ls $COMIN_ENS | grep -v f006.ens); do + rm -rf $COMIN_ENS/$file + done + fi + fi + fi + + # Remove empty directories + if [ -d $COMIN_ENS ] ; then + [[ ! "$(ls -A $COMIN_ENS)" ]] && rm -rf $COMIN_ENS + fi + done + + # Advance to next cycle + GDATE=$($NDATE +$assim_freq $GDATE) + + done + +fi + +# Remove enkf*.$rPDY for the older of GDATE or RDATE +GDATE=$($NDATE -${RMOLDSTD_ENKF:-120} $CDATE) +fhmax=$FHMAX_GFS +RDATE=$($NDATE -$fhmax $CDATE) +if [ $GDATE -lt $RDATE ]; then + RDATE=$GDATE +fi +rPDY=$(echo $RDATE | cut -c1-8) +clist="gdas gfs" +for ctype in $clist; do + COMIN="$ROTDIR/enkf$ctype.$rPDY" + [[ -d $COMIN ]] && rm -rf $COMIN +done + +############################################################### + echo "ENDED NORMALLY." ########################################## diff --git a/jobs/JGLOBAL_ARCHIVE b/jobs/JGLOBAL_ARCHIVE new file mode 100755 index 00000000000..83449c21994 --- /dev/null +++ b/jobs/JGLOBAL_ARCHIVE @@ -0,0 +1,99 @@ +#! /usr/bin/env bash + +source "$HOMEgfs/ush/preamble.sh" + +export RUN_ENVIR=${RUN_ENVIR:-"nco"} + +############################################# +# Source relevant config files +############################################# +export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} +configs="base arch" +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 workflow level common utilities +############################################# +#### This utility is under development as of 20221020 +#### will not use it at this time +#### source "${HOMEgfs}/ush/file_utils.sh" + +############################################## +# 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} + + +############################################## +# Begin JOB SPECIFIC work +############################################## + +# ICS are restarts and always lag INC by $assim_freq hours +ARCHINC_CYC=$ARCH_CYC +ARCHICS_CYC=$((ARCH_CYC-assim_freq)) +if [ $ARCHICS_CYC -lt 0 ]; then + ARCHICS_CYC=$((ARCHICS_CYC+24)) +fi + +# CURRENT CYCLE +APREFIX="${CDUMP}.t${cyc}z." +ASUFFIX=${ASUFFIX:-$SUFFIX} + +if [ $ASUFFIX = ".nc" ]; then + format="netcdf" +else + format="nemsio" +fi + +############################################################### +# Run archive script +############################################################### + +${GLOBALARCHIVESH:-$SCRgfs/exglobal_archive.sh} +status=$? +[[ $status -ne 0 ]] && exit $status + +############################################################### + +echo "ENDED NORMALLY." + +########################################## +# Remove the Temporary working directory +########################################## +cd $DATAROOT +[[ $KEEPDATA = "NO" ]] && rm -rf $DATA + +date +exit 0 diff --git a/jobs/JGLOBAL_OFFLINE_ARCHIVE b/jobs/JGLOBAL_OFFLINE_ARCHIVE deleted file mode 100755 index 644091f3a52..00000000000 --- a/jobs/JGLOBAL_OFFLINE_ARCHIVE +++ /dev/null @@ -1,345 +0,0 @@ -#!/bin/ksh -x - -export RUN_ENVIR=${RUN_ENVIR:-"nco"} -export PS4='$SECONDS + ' -date - - -############################# -# Source relevant config files -############################# -export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} -configs="base arch" -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 - - -############################################## -# 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} - - -############################################## -# Begin JOB SPECIFIC work -############################################## -COMIN_OBS=${COMIN_OBS:-$(compath.py prod/obsproc/${obsproc_ver})/$RUN.$PDY/$cyc/atmos} -COMIN=${COMIN:-$ROTDIR/$RUN.$PDY/$cyc/atmos} -cd $COMIN - -# ICS are restarts and always lag INC by $assim_freq hours -ARCHINC_CYC=$ARCH_CYC -ARCHICS_CYC=$((ARCH_CYC-assim_freq)) -if [ $ARCHICS_CYC -lt 0 ]; then - ARCHICS_CYC=$((ARCHICS_CYC+24)) -fi - -# CURRENT CYCLE -APREFIX="${CDUMP}.t${cyc}z." -ASUFFIX=${ASUFFIX:-$SUFFIX} - -if [ $ASUFFIX = ".nc" ]; then - format="netcdf" -else - format="nemsio" -fi - -############################################################### -# Archive online for verification and diagnostics -############################################################### - -COMIN=${COMINatmos:-"$ROTDIR/$CDUMP.$PDY/$cyc/atmos"} -cd $COMIN - -[[ ! -d $ARCDIR ]] && mkdir -p $ARCDIR -$NCP ${APREFIX}gsistat $ARCDIR/gsistat.${CDUMP}.${CDATE} -$NCP ${APREFIX}pgrb2.1p00.anl $ARCDIR/pgbanl.${CDUMP}.${CDATE}.grib2 - -# Archive 1 degree forecast GRIB2 files for verification -if [ $CDUMP = "gfs" ]; then - fhmax=$FHMAX_GFS - fhr=0 - while [ $fhr -le $fhmax ]; do - fhr2=$(printf %02i $fhr) - fhr3=$(printf %03i $fhr) - $NCP ${APREFIX}pgrb2.1p00.f$fhr3 $ARCDIR/pgbf${fhr2}.${CDUMP}.${CDATE}.grib2 - (( fhr = $fhr + $FHOUT_GFS )) - done -fi -if [ $CDUMP = "gdas" ]; then - flist="000 003 006 009" - for fhr in $flist; do - fname=${APREFIX}pgrb2.1p00.f${fhr} - fhr2=$(printf %02i $fhr) - $NCP $fname $ARCDIR/pgbf${fhr2}.${CDUMP}.${CDATE}.grib2 - done -fi - -if [ -s avno.t${cyc}z.cyclone.trackatcfunix ]; then - PLSOT4=`echo $PSLOT|cut -c 1-4 |tr '[a-z]' '[A-Z]'` - cat avno.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunix.${CDUMP}.$CDATE - cat avnop.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunixp.${CDUMP}.$CDATE -fi - -if [ $CDUMP = "gdas" -a -s gdas.t${cyc}z.cyclone.trackatcfunix ]; then - PLSOT4=`echo $PSLOT|cut -c 1-4 |tr '[a-z]' '[A-Z]'` - cat gdas.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunix.${CDUMP}.$CDATE - cat gdasp.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunixp.${CDUMP}.$CDATE -fi - -if [ $CDUMP = "gfs" ]; then - $NCP storms.gfso.atcf_gen.$CDATE ${ARCDIR}/. - $NCP storms.gfso.atcf_gen.altg.$CDATE ${ARCDIR}/. - $NCP trak.gfso.atcfunix.$CDATE ${ARCDIR}/. - $NCP trak.gfso.atcfunix.altg.$CDATE ${ARCDIR}/. - - mkdir -p ${ARCDIR}/tracker.$CDATE/$CDUMP - blist="epac natl" - for basin in $blist; do - cp -rp $basin ${ARCDIR}/tracker.$CDATE/$CDUMP - done -fi - -# Archive required gaussian gfs forecast files for Fit2Obs -if [ $CDUMP = "gfs" -a $FITSARC = "YES" ]; then - VFYARC=${VFYARC:-$ROTDIR/vrfyarch} - [[ ! -d $VFYARC ]] && mkdir -p $VFYARC - mkdir -p $VFYARC/${CDUMP}.$PDY/$cyc - prefix=${CDUMP}.t${cyc}z - fhmax=${FHMAX_FITS:-$FHMAX_GFS} - fhr=0 - while [[ $fhr -le $fhmax ]]; do - fhr3=$(printf %03i $fhr) - sfcfile=${prefix}.sfcf${fhr3}${ASUFFIX} - sigfile=${prefix}.atmf${fhr3}${ASUFFIX} - $NCP $sfcfile $VFYARC/${CDUMP}.$PDY/$cyc/ - $NCP $sigfile $VFYARC/${CDUMP}.$PDY/$cyc/ - (( fhr = $fhr + 6 )) - done -fi - - -############################################################### -# Archive data to OFFLINE SAVE -if [ $HPSSARCH = "YES" ]; then -############################################################### - -#--display status and location info -echo "Archive is running offline to increase parallel performance" -export ATARDIR=$ATARDIR -export JOB_LOG_DIR=$PBS_O_WORKDIR - -#--determine when to save ICs for warm start and forecast-only runs -SAVEWARMICA="NO" -SAVEWARMICB="NO" -SAVEFCSTIC="NO" -firstday=$($NDATE +24 $SDATE) -mm=`echo $CDATE|cut -c 5-6` -dd=`echo $CDATE|cut -c 7-8` -nday=$(( (mm-1)*30+dd )) -mod=$(($nday % $ARCH_WARMICFREQ)) -if [ $CDATE -eq $firstday -a $cyc -eq $ARCHINC_CYC ]; then SAVEWARMICA="YES" ; fi -if [ $CDATE -eq $firstday -a $cyc -eq $ARCHICS_CYC ]; then SAVEWARMICB="YES" ; fi -if [ $mod -eq 0 -a $cyc -eq $ARCHINC_CYC ]; then SAVEWARMICA="YES" ; fi -if [ $mod -eq 0 -a $cyc -eq $ARCHICS_CYC ]; then SAVEWARMICB="YES" ; fi - -if [ $ARCHICS_CYC -eq 18 ]; then - nday1=$((nday+1)) - mod1=$(($nday1 % $ARCH_WARMICFREQ)) - if [ $mod1 -eq 0 -a $cyc -eq $ARCHICS_CYC ] ; then SAVEWARMICB="YES" ; fi - if [ $mod1 -ne 0 -a $cyc -eq $ARCHICS_CYC ] ; then SAVEWARMICB="NO" ; fi - if [ $CDATE -eq $SDATE -a $cyc -eq $ARCHICS_CYC ] ; then SAVEWARMICB="YES" ; fi -fi - -mod=$(($nday % $ARCH_FCSTICFREQ)) -if [ $mod -eq 0 -o $CDATE -eq $firstday ]; then SAVEFCSTIC="YES" ; fi - - -export ARCH_LIST="$COMIN/archlist" -[[ -d $ARCH_LIST ]] && rm -rf $ARCH_LIST -mkdir -p $ARCH_LIST -cd $ARCH_LIST - -$HOMEgfs/ush/hpssarch_gen.sh $CDUMP -status=$? -if [ $status -ne 0 ]; then - echo "$HOMEgfs/ush/hpssarch_gen.sh $CDUMP failed, ABORT!" - exit $status -fi - -cd $ROTDIR - -if [ $CDUMP = "gfs" ]; then - - #for targrp in gfsa gfsb - NOTE - do not check htar error status - for targrp in gfsa gfsb; do - export TRANSFER_TARGET_FILE=$targrp - ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh - done - - if [ ${SAVEFCSTNEMSIO:-"YES"} = "YES" ]; then - for targrp in gfs_flux gfs_${format}a gfs_${format}b gfs_pgrb2b; do - export TRANSFER_TARGET_FILE=$targrp - ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh - status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "OFFLINE TAR $CDATE ${targrp}.tar failed" - exit $status - fi - done - fi - - #for targrp in gfswave - if [ $DO_WAVE = "YES" -a "$WAVE_CDUMP" != "gdas" ]; then - for targrp in gfswave; do - export TRANSFER_TARGET_FILE=$targrp - ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh - status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "OFFLINE TAR $CDATE ${targrp}.tar failed" - exit $status - fi - done - fi - - #for restarts - if [ $SAVEFCSTIC = "YES" ]; then - export TRANSFER_TARGET_FILE=gfs_restarta - ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh - status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "OFFLINE TAR $CDATE gfs_restarta.tar failed" - exit $status - fi - fi - - #for downstream products - if [ $DO_BUFRSND = "YES" -o $WAFSF = "YES" ]; then - #### htar -P -cvf $ATARDIR/$CDATE/gfs_downstream.tar `cat $ARCH_LIST/gfs_downstream.txt` - #### tar -P -cvf $COM_ARCHOFFLINE/$CDATE/gfs_downstream.tar `cat $ARCH_LIST/gfs_downstream.txt` - export TRANSFER_TARGET_FILE=gfs_downstream - ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh - status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "OFFLINE TAR $CDATE gfs_downstream.tar failed" - exit $status - fi - fi - -fi - - -if [ $CDUMP = "gdas" ]; then - - export TRANSFER_TARGET_FILE=gdas - ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh - status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "OFFLINE TAR $CDATE gdas.tar failed" - exit $status - fi - - #gdaswave - if [ $DO_WAVE = "YES" ]; then - export TRANSFER_TARGET_FILE=gdaswave - ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh - status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "OFFLINE TAR $CDATE gdaswave.tar failed" - exit $status - fi - fi - - if [ $SAVEWARMICA = "YES" -o $SAVEFCSTIC = "YES" ]; then - export TRANSFER_TARGET_FILE=gdas_restarta - ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh - status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "OFFLINE TAR $CDATE gdas_restarta.tar failed" - exit $status - fi - if [ $DO_WAVE = "YES" ]; then - export TRANSFER_TARGET_FILE=gdaswave_restart - ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh - status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "OFFLINE TAR $CDATE gdaswave_restart.tar failed" - exit $status - fi - fi - fi - - if [ $SAVEWARMICB = "YES" -o $SAVEFCSTIC = "YES" ]; then - export TRANSFER_TARGET_FILE=gdas_restartb - ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh - status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "OFFLINE TAR $CDATE gdas_restartb.tar failed" - exit $status - fi - fi - -fi - -############################################################### -fi ##end of HPSS archive -############################################################### - - - -############################################################### -# Clean up previous cycles; various depths -# PRIOR CYCLE: Leave the prior cycle alone -GDATE=$($NDATE -$assim_freq $CDATE) - -# PREVIOUS to the PRIOR CYCLE -GDATE=$($NDATE -$assim_freq $GDATE) -gPDY=$(echo $GDATE | cut -c1-8) -gcyc=$(echo $GDATE | cut -c9-10) - -# Remove the TMPDIR directory -COMIN="$RUNDIR/$GDATE" -[[ -d $COMIN ]] && rm -rf $COMIN - -echo "ENDED NORMALLY." - -########################################## -# Remove the Temporary working directory -########################################## -cd $DATAROOT -[[ $KEEPDATA = "NO" ]] && rm -rf $DATA - -date -exit 0 diff --git a/jobs/rocoto/arch.sh b/jobs/rocoto/arch.sh index 66621769cda..6d8b03d395b 100755 --- a/jobs/rocoto/arch.sh +++ b/jobs/rocoto/arch.sh @@ -2,18 +2,6 @@ source "$HOMEgfs/ush/preamble.sh" -############################################################### -## Abstract: -## Archive driver script -## RUN_ENVIR : runtime environment (emc | nco) -## HOMEgfs : /full/path/to/workflow -## EXPDIR : /full/path/to/config/files -## CDATE : current analysis date (YYYYMMDDHH) -## CDUMP : cycle name (gdas / gfs) -## PDY : current date (YYYYMMDD) -## cyc : current cycle (HH) -############################################################### - ############################################################### # Source FV3GFS workflow modules . $HOMEgfs/ush/load_fv3gfs_modules.sh @@ -21,391 +9,9 @@ status=$? [[ $status -ne 0 ]] && exit $status ############################################################### -# Source relevant configs -configs="base arch" -for config in $configs; do - . $EXPDIR/config.${config} - status=$? - [[ $status -ne 0 ]] && exit $status -done - -# ICS are restarts and always lag INC by $assim_freq hours -ARCHINC_CYC=$ARCH_CYC -ARCHICS_CYC=$((ARCH_CYC-assim_freq)) -if [ $ARCHICS_CYC -lt 0 ]; then - ARCHICS_CYC=$((ARCHICS_CYC+24)) -fi - -# CURRENT CYCLE -APREFIX="${CDUMP}.t${cyc}z." -ASUFFIX=${ASUFFIX:-$SUFFIX} - -if [ $ASUFFIX = ".nc" ]; then - format="netcdf" -else - format="nemsio" -fi - - -# Realtime parallels run GFS MOS on 1 day delay -# If realtime parallel, back up CDATE_MOS one day -CDATE_MOS=$CDATE -if [ $REALTIME = "YES" ]; then - CDATE_MOS=$($NDATE -24 $CDATE) -fi -PDY_MOS=$(echo $CDATE_MOS | cut -c1-8) - -############################################################### -# Archive online for verification and diagnostics -############################################################### - -COMIN=${COMINatmos:-"$ROTDIR/$CDUMP.$PDY/$cyc/atmos"} -cd $COMIN - -source "${HOMEgfs}/ush/file_utils.sh" - -[[ ! -d $ARCDIR ]] && mkdir -p $ARCDIR -nb_copy ${APREFIX}gsistat $ARCDIR/gsistat.${CDUMP}.${CDATE} -nb_copy ${APREFIX}pgrb2.1p00.anl $ARCDIR/pgbanl.${CDUMP}.${CDATE}.grib2 - -# Archive 1 degree forecast GRIB2 files for verification -if [ $CDUMP = "gfs" ]; then - fhmax=$FHMAX_GFS - fhr=0 - while [ $fhr -le $fhmax ]; do - fhr2=$(printf %02i $fhr) - fhr3=$(printf %03i $fhr) - nb_copy ${APREFIX}pgrb2.1p00.f$fhr3 $ARCDIR/pgbf${fhr2}.${CDUMP}.${CDATE}.grib2 - fhr=$((10#$fhr + 10#$FHOUT_GFS )) - done -fi -if [ $CDUMP = "gdas" ]; then - flist="000 003 006 009" - for fhr in $flist; do - fname=${APREFIX}pgrb2.1p00.f${fhr} - fhr2=$(printf %02i $((10#$fhr))) - nb_copy $fname $ARCDIR/pgbf${fhr2}.${CDUMP}.${CDATE}.grib2 - done -fi - -if [ -s avno.t${cyc}z.cyclone.trackatcfunix ]; then - PLSOT4=$(echo $PSLOT|cut -c 1-4 |tr '[a-z]' '[A-Z]') - cat avno.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunix.${CDUMP}.$CDATE - cat avnop.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunixp.${CDUMP}.$CDATE -fi - -if [ $CDUMP = "gdas" -a -s gdas.t${cyc}z.cyclone.trackatcfunix ]; then - PLSOT4=$(echo $PSLOT|cut -c 1-4 |tr '[a-z]' '[A-Z]') - cat gdas.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunix.${CDUMP}.$CDATE - cat gdasp.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunixp.${CDUMP}.$CDATE -fi - -if [ $CDUMP = "gfs" ]; then - nb_copy storms.gfso.atcf_gen.$CDATE ${ARCDIR}/. - nb_copy storms.gfso.atcf_gen.altg.$CDATE ${ARCDIR}/. - nb_copy trak.gfso.atcfunix.$CDATE ${ARCDIR}/. - nb_copy trak.gfso.atcfunix.altg.$CDATE ${ARCDIR}/. - - mkdir -p ${ARCDIR}/tracker.$CDATE/$CDUMP - blist="epac natl" - for basin in $blist; do - if [[ -f $basin ]]; then - cp -rp $basin ${ARCDIR}/tracker.$CDATE/$CDUMP - fi - done -fi - -# Archive required gaussian gfs forecast files for Fit2Obs -if [ $CDUMP = "gfs" -a $FITSARC = "YES" ]; then - VFYARC=${VFYARC:-$ROTDIR/vrfyarch} - [[ ! -d $VFYARC ]] && mkdir -p $VFYARC - mkdir -p $VFYARC/${CDUMP}.$PDY/$cyc - prefix=${CDUMP}.t${cyc}z - fhmax=${FHMAX_FITS:-$FHMAX_GFS} - fhr=0 - while [[ $fhr -le $fhmax ]]; do - fhr3=$(printf %03i $fhr) - sfcfile=${prefix}.sfcf${fhr3}${ASUFFIX} - sigfile=${prefix}.atmf${fhr3}${ASUFFIX} - nb_copy $sfcfile $VFYARC/${CDUMP}.$PDY/$cyc/ - nb_copy $sigfile $VFYARC/${CDUMP}.$PDY/$cyc/ - (( fhr = 10#$fhr + 6 )) - done -fi - - -############################################################### -# Archive data either to HPSS or locally -if [[ $HPSSARCH = "YES" || $LOCALARCH = "YES" ]]; then -############################################################### - -# --set the archiving command and create local directories, if necessary -TARCMD="htar" -if [[ $LOCALARCH = "YES" ]]; then - TARCMD="tar" - [ ! -d $ATARDIR/$CDATE ] && mkdir -p $ATARDIR/$CDATE - [ ! -d $ATARDIR/$CDATE_MOS -a -d $ROTDIR/gfsmos.$PDY_MOS -a $cyc -eq 18 ] && mkdir -p $ATARDIR/$CDATE_MOS -fi - -#--determine when to save ICs for warm start and forecast-only runs -SAVEWARMICA="NO" -SAVEWARMICB="NO" -SAVEFCSTIC="NO" -firstday=$($NDATE +24 $SDATE) -mm=$(echo $CDATE|cut -c 5-6) -dd=$(echo $CDATE|cut -c 7-8) -nday=$(( (10#$mm-1)*30+10#$dd )) -mod=$(($nday % $ARCH_WARMICFREQ)) -if [ $CDATE -eq $firstday -a $cyc -eq $ARCHINC_CYC ]; then SAVEWARMICA="YES" ; fi -if [ $CDATE -eq $firstday -a $cyc -eq $ARCHICS_CYC ]; then SAVEWARMICB="YES" ; fi -if [ $mod -eq 0 -a $cyc -eq $ARCHINC_CYC ]; then SAVEWARMICA="YES" ; fi -if [ $mod -eq 0 -a $cyc -eq $ARCHICS_CYC ]; then SAVEWARMICB="YES" ; fi - -if [ $ARCHICS_CYC -eq 18 ]; then - nday1=$((nday+1)) - mod1=$(($nday1 % $ARCH_WARMICFREQ)) - if [ $mod1 -eq 0 -a $cyc -eq $ARCHICS_CYC ] ; then SAVEWARMICB="YES" ; fi - if [ $mod1 -ne 0 -a $cyc -eq $ARCHICS_CYC ] ; then SAVEWARMICB="NO" ; fi - if [ $CDATE -eq $SDATE -a $cyc -eq $ARCHICS_CYC ] ; then SAVEWARMICB="YES" ; fi -fi - -mod=$(($nday % $ARCH_FCSTICFREQ)) -if [ $mod -eq 0 -o $CDATE -eq $firstday ]; then SAVEFCSTIC="YES" ; fi - - -ARCH_LIST="$COMIN/archlist" -[[ -d $ARCH_LIST ]] && rm -rf $ARCH_LIST -mkdir -p $ARCH_LIST -cd $ARCH_LIST - -$HOMEgfs/ush/hpssarch_gen.sh $CDUMP +# Execute the JJOB +$HOMEgfs/jobs/JGLOBAL_ARCHIVE status=$? -if [ $status -ne 0 ]; then - echo "$HOMEgfs/ush/hpssarch_gen.sh $CDUMP failed, ABORT!" - exit $status -fi - -cd $ROTDIR - -if [ $CDUMP = "gfs" ]; then - - targrp_list="gfsa gfsb" - - if [ ${ARCH_GAUSSIAN:-"NO"} = "YES" ]; then - targrp_list="$targrp_list gfs_flux gfs_${format}b gfs_pgrb2b" - if [ $MODE = "cycled" ]; then - targrp_list="$targrp_list gfs_${format}a" - fi - fi - - if [ $DO_WAVE = "YES" -a "$WAVE_CDUMP" != "gdas" ]; then - targrp_list="$targrp_list gfswave" - fi - - if [ $DO_OCN = "YES" ]; then - targrp_list="$targrp_list ocn_ice_grib2_0p5 ocn_ice_grib2_0p25 ocn_2D ocn_3D ocn_xsect ocn_daily gfs_flux_1p00" - fi - - if [ $DO_ICE = "YES" ]; then - targrp_list="$targrp_list ice" - fi - - # Aerosols - if [ $DO_AERO = "YES" ]; then - for targrp in chem; do - $TARCMD -P -cvf $ATARDIR/$CDATE/${targrp}.tar $(cat $ARCH_LIST/${targrp}.txt) - status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "HTAR $CDATE ${targrp}.tar failed" - exit $status - fi - done - fi - - #for restarts - if [ $SAVEFCSTIC = "YES" ]; then - targrp_list="$targrp_list gfs_restarta" - fi - - #for downstream products - if [ $DO_BUFRSND = "YES" -o $WAFSF = "YES" ]; then - targrp_list="$targrp_list gfs_downstream" - fi - - #--save mdl gfsmos output from all cycles in the 18Z archive directory - if [ -d gfsmos.$PDY_MOS -a $cyc -eq 18 ]; then - set +e - $TARCMD -P -cvf $ATARDIR/$CDATE_MOS/gfsmos.tar ./gfsmos.$PDY_MOS - status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE gfsmos.tar failed" - exit $status - fi - set_strict - fi -elif [ $CDUMP = "gdas" ]; then - - targrp_list="gdas" - - #gdaswave - if [ $DO_WAVE = "YES" ]; then - targrp_list="$targrp_list gdaswave" - fi - - if [ $SAVEWARMICA = "YES" -o $SAVEFCSTIC = "YES" ]; then - targrp_list="$targrp_list gdas_restarta" - - if [ $DO_WAVE = "YES" ]; then - targrp_list="$targrp_list gdaswave_restart" - fi - fi - - if [ $SAVEWARMICB = "YES" -o $SAVEFCSTIC = "YES" ]; then - targrp_list="$targrp_list gdas_restartb" - fi -fi - -# Turn on extended globbing options -shopt -s extglob -for targrp in $targrp_list; do - set +e - $TARCMD -P -cvf $ATARDIR/$CDATE/${targrp}.tar $(cat $ARCH_LIST/${targrp}.txt) - status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE ${targrp}.tar failed" - exit $status - fi - set_strict -done -# Turn extended globbing back off -shopt -u extglob - -############################################################### -fi ##end of HPSS archive -############################################################### - - - -############################################################### -# Clean up previous cycles; various depths -# PRIOR CYCLE: Leave the prior cycle alone -GDATE=$($NDATE -$assim_freq $CDATE) - -# PREVIOUS to the PRIOR CYCLE -GDATE=$($NDATE -$assim_freq $GDATE) -gPDY=$(echo $GDATE | cut -c1-8) -gcyc=$(echo $GDATE | cut -c9-10) - -# Remove the TMPDIR directory -COMIN="$RUNDIR/$GDATE" -[[ -d $COMIN ]] && rm -rf $COMIN - -if [[ "${DELETE_COM_IN_ARCHIVE_JOB:-YES}" == NO ]] ; then - exit 0 -fi - -# Step back every assim_freq hours and remove old rotating directories -# for successful cycles (defaults from 24h to 120h). If GLDAS is -# active, retain files needed by GLDAS update. Independent of GLDAS, -# retain files needed by Fit2Obs -DO_GLDAS=${DO_GLDAS:-"NO"} -GDATEEND=$($NDATE -${RMOLDEND:-24} $CDATE) -GDATE=$($NDATE -${RMOLDSTD:-120} $CDATE) -GLDAS_DATE=$($NDATE -96 $CDATE) -RTOFS_DATE=$($NDATE -48 $CDATE) -while [ $GDATE -le $GDATEEND ]; do - gPDY=$(echo $GDATE | cut -c1-8) - gcyc=$(echo $GDATE | cut -c9-10) - COMIN="$ROTDIR/${CDUMP}.$gPDY/$gcyc/atmos" - COMINwave="$ROTDIR/${CDUMP}.$gPDY/$gcyc/wave" - COMINrtofs="$ROTDIR/rtofs.$gPDY" - if [ -d $COMIN ]; then - rocotolog="$EXPDIR/logs/${GDATE}.log" - if [ -f $rocotolog ]; then - testend=$(tail -n 1 $rocotolog | grep "This cycle is complete: Success") - rc=$? - if [ $rc -eq 0 ]; then - if [ -d $COMINwave ]; then rm -rf $COMINwave ; fi - if [ -d $COMINrtofs -a $GDATE -lt $RTOFS_DATE ]; then rm -rf $COMINrtofs ; fi - if [ $CDUMP != "gdas" -o $DO_GLDAS = "NO" -o $GDATE -lt $GLDAS_DATE ]; then - if [ $CDUMP = "gdas" ]; then - for file in $(ls $COMIN |grep -v prepbufr |grep -v cnvstat |grep -v atmanl.nc); do - rm -rf $COMIN/$file - done - else - rm -rf $COMIN - fi - else - if [ $DO_GLDAS = "YES" ]; then - for file in $(ls $COMIN |grep -v sflux |grep -v RESTART |grep -v prepbufr |grep -v cnvstat |grep -v atmanl.nc); do - rm -rf $COMIN/$file - done - for file in $(ls $COMIN/RESTART |grep -v sfcanl ); do - rm -rf $COMIN/RESTART/$file - done - else - for file in $(ls $COMIN |grep -v prepbufr |grep -v cnvstat |grep -v atmanl.nc); do - rm -rf $COMIN/$file - done - fi - fi - fi - fi - fi - - # Remove any empty directories - if [ -d $COMIN ]; then - [[ ! "$(ls -A $COMIN)" ]] && rm -rf $COMIN - fi - - if [ -d $COMINwave ]; then - [[ ! "$(ls -A $COMINwave)" ]] && rm -rf $COMINwave - fi - - # Remove mdl gfsmos directory - if [ $CDUMP = "gfs" ]; then - COMIN="$ROTDIR/gfsmos.$gPDY" - if [ -d $COMIN -a $GDATE -lt $CDATE_MOS ]; then rm -rf $COMIN ; fi - fi - - GDATE=$($NDATE +$assim_freq $GDATE) -done - -# Remove archived gaussian files used for Fit2Obs in $VFYARC that are -# $FHMAX_FITS plus a delta before $CDATE. Touch existing archived -# gaussian files to prevent the files from being removed by automatic -# scrubber present on some machines. - -if [ $CDUMP = "gfs" ]; then - fhmax=$((FHMAX_FITS+36)) - RDATE=$($NDATE -$fhmax $CDATE) - rPDY=$(echo $RDATE | cut -c1-8) - COMIN="$VFYARC/$CDUMP.$rPDY" - [[ -d $COMIN ]] && rm -rf $COMIN - - TDATE=$($NDATE -$FHMAX_FITS $CDATE) - while [ $TDATE -lt $CDATE ]; do - tPDY=$(echo $TDATE | cut -c1-8) - tcyc=$(echo $TDATE | cut -c9-10) - TDIR=$VFYARC/$CDUMP.$tPDY/$tcyc - [[ -d $TDIR ]] && touch $TDIR/* - TDATE=$($NDATE +6 $TDATE) - done -fi - -# Remove $CDUMP.$rPDY for the older of GDATE or RDATE -GDATE=$($NDATE -${RMOLDSTD:-120} $CDATE) -fhmax=$FHMAX_GFS -RDATE=$($NDATE -$fhmax $CDATE) -if [ $GDATE -lt $RDATE ]; then - RDATE=$GDATE -fi -rPDY=$(echo $RDATE | cut -c1-8) -COMIN="$ROTDIR/$CDUMP.$rPDY" -[[ -d $COMIN ]] && rm -rf $COMIN - - -############################################################### -exit 0 +exit ${status} diff --git a/jobs/rocoto/earc.sh b/jobs/rocoto/earc.sh index 77f517fde79..0dc02125866 100755 --- a/jobs/rocoto/earc.sh +++ b/jobs/rocoto/earc.sh @@ -2,19 +2,6 @@ source "$HOMEgfs/ush/preamble.sh" -############################################################### -## Abstract: -## Ensemble archive driver script -## RUN_ENVIR : runtime environment (emc | nco) -## HOMEgfs : /full/path/to/workflow -## EXPDIR : /full/path/to/config/files -## CDATE : current analysis date (YYYYMMDDHH) -## PDY : current date (YYYYMMDD) -## cyc : current cycle (HH) -## CDUMP : cycle name (gdas / gfs) -## ENSGRP : ensemble sub-group to archive (0, 1, 2, ...) -############################################################### - ############################################################### # Source FV3GFS workflow modules . $HOMEgfs/ush/load_fv3gfs_modules.sh @@ -22,208 +9,9 @@ status=$? [[ $status -ne 0 ]] && exit $status ############################################################### -# Source relevant configs -configs="base earc" -for config in $configs; do - . $EXPDIR/config.${config} - status=$? - [[ $status -ne 0 ]] && exit $status -done - -export COMPONENT=${COMPONENT:-atmos} - -n=$((10#${ENSGRP})) - -# ICS are restarts and always lag INC by $assim_freq hours. -EARCINC_CYC=$ARCH_CYC -EARCICS_CYC=$((ARCH_CYC-assim_freq)) -if [ $EARCICS_CYC -lt 0 ]; then - EARCICS_CYC=$((EARCICS_CYC+24)) -fi - -# EnKF update in GFS, GDAS or both -CDUMP_ENKF=$(echo ${EUPD_CYC:-"gdas"} | tr a-z A-Z) - -ARCH_LIST="$ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/earc$ENSGRP" -[[ -d $ARCH_LIST ]] && rm -rf $ARCH_LIST -mkdir -p $ARCH_LIST -cd $ARCH_LIST - -$HOMEgfs/ush/hpssarch_gen.sh enkf${CDUMP} +# Execute the JJOB +$HOMEgfs/jobs/JENKFGDAS_ARCHIVE status=$? -if [ $status -ne 0 ]; then - echo "$HOMEgfs/ush/hpssarch_gen.sh enkf${CDUMP} failed, ABORT!" - exit $status -fi - -cd $ROTDIR - -source "${HOMEgfs}/ush/file_utils.sh" - -################################################################### -# ENSGRP > 0 archives a group of ensemble members -firstday=$($NDATE +24 $SDATE) -if (( 10#${ENSGRP} > 0 )) && [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; then - -#--set the archiving command and create local directories, if necessary - TARCMD="htar" - if [[ $LOCALARCH = "YES" ]]; then - TARCMD="tar" - [ ! -d $ATARDIR/$CDATE ] && mkdir -p $ATARDIR/$CDATE - fi - -#--determine when to save ICs for warm start - SAVEWARMICA="NO" - SAVEWARMICB="NO" - mm=$(echo $CDATE|cut -c 5-6) - dd=$(echo $CDATE|cut -c 7-8) - nday=$(( (mm-1)*30+dd )) - mod=$(($nday % $ARCH_WARMICFREQ)) - if [ $CDATE -eq $firstday -a $cyc -eq $EARCINC_CYC ]; then SAVEWARMICA="YES" ; fi - if [ $CDATE -eq $firstday -a $cyc -eq $EARCICS_CYC ]; then SAVEWARMICB="YES" ; fi - if [ $mod -eq 0 -a $cyc -eq $EARCINC_CYC ]; then SAVEWARMICA="YES" ; fi - if [ $mod -eq 0 -a $cyc -eq $EARCICS_CYC ]; then SAVEWARMICB="YES" ; fi - - if [ $EARCICS_CYC -eq 18 ]; then - nday1=$((nday+1)) - mod1=$(($nday1 % $ARCH_WARMICFREQ)) - if [ $mod1 -eq 0 -a $cyc -eq $EARCICS_CYC ] ; then SAVEWARMICB="YES" ; fi - if [ $mod1 -ne 0 -a $cyc -eq $EARCICS_CYC ] ; then SAVEWARMICB="NO" ; fi - if [ $CDATE -eq $SDATE -a $cyc -eq $EARCICS_CYC ] ; then SAVEWARMICB="YES" ; fi - fi - - if [ $CDATE -gt $SDATE ]; then # Don't run for first half cycle - - $TARCMD -P -cvf $ATARDIR/$CDATE/enkf${CDUMP}_grp${ENSGRP}.tar $(cat $ARCH_LIST/enkf${CDUMP}_grp${n}.txt) - status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE enkf${CDUMP}_grp${ENSGRP}.tar failed" - exit $status - fi - - if [ $SAVEWARMICA = "YES" -a $cyc -eq $EARCINC_CYC ]; then - $TARCMD -P -cvf $ATARDIR/$CDATE/enkf${CDUMP}_restarta_grp${ENSGRP}.tar $(cat $ARCH_LIST/enkf${CDUMP}_restarta_grp${n}.txt) - status=$? - if [ $status -ne 0 ]; then - echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE enkf${CDUMP}_restarta_grp${ENSGRP}.tar failed" - exit $status - fi - fi - - if [ $SAVEWARMICB = "YES" -a $cyc -eq $EARCICS_CYC ]; then - $TARCMD -P -cvf $ATARDIR/$CDATE/enkf${CDUMP}_restartb_grp${ENSGRP}.tar $(cat $ARCH_LIST/enkf${CDUMP}_restartb_grp${n}.txt) - status=$? - if [ $status -ne 0 ]; then - echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE enkf${CDUMP}_restartb_grp${ENSGRP}.tar failed" - exit $status - fi - fi - - fi # CDATE>SDATE - -fi - - -################################################################### -# ENSGRP 0 archives ensemble means and copy data to online archive -if [ $ENSGRP -eq 0 ]; then - - if [[ $HPSSARCH = "YES" || $LOCALARCH = "YES" ]]; then - -#--set the archiving command and create local directories, if necessary - TARCMD="htar" - if [[ $LOCALARCH = "YES" ]]; then - TARCMD="tar" - [ ! -d $ATARDIR/$CDATE ] && mkdir -p $ATARDIR/$CDATE - fi - - set +e - $TARCMD -P -cvf $ATARDIR/$CDATE/enkf${CDUMP}.tar $(cat $ARCH_LIST/enkf${CDUMP}.txt) - status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE enkf${CDUMP}.tar failed" - exit $status - fi - set_strict - fi - - #-- Archive online for verification and diagnostics - [[ ! -d $ARCDIR ]] && mkdir -p $ARCDIR - cd $ARCDIR - - nb_copy $ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.enkfstat enkfstat.${CDUMP}.$CDATE - nb_copy $ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.${CDUMP}.${CDATE}.ensmean - - if [ $CDUMP_ENKF != "GDAS" ]; then - nb_copy $ROTDIR/enkfgfs.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.enkfstat enkfstat.gfs.$CDATE - nb_copy $ROTDIR/enkfgfs.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.gfs.${CDATE}.ensmean - fi - -fi - - -if [[ "${DELETE_COM_IN_ARCHIVE_JOB:-YES}" == NO ]] ; then - exit 0 -fi - -############################################################### -# ENSGRP 0 also does clean-up -if [ $ENSGRP -eq 0 ]; then - - # Start start and end dates to remove - GDATEEND=$($NDATE -${RMOLDEND_ENKF:-24} $CDATE) - GDATE=$($NDATE -${RMOLDSTD_ENKF:-120} $CDATE) - while [ $GDATE -le $GDATEEND ]; do - - gPDY=$(echo $GDATE | cut -c1-8) - gcyc=$(echo $GDATE | cut -c9-10) - - # Loop over GDAS and GFS EnKF directories separately. - clist="gdas gfs" - for ctype in $clist; do - COMIN_ENS="$ROTDIR/enkf$ctype.$gPDY/$gcyc/$COMPONENT" - if [ -d $COMIN_ENS ]; then - rocotolog="$EXPDIR/logs/${GDATE}.log" - if [ -f $rocotolog ]; then - testend=$(tail -n 1 $rocotolog | grep "This cycle is complete: Success") - rc=$? - if [ $rc -eq 0 ]; then - # Retain f006.ens files. Remove everything else - for file in $(ls $COMIN_ENS | grep -v f006.ens); do - rm -rf $COMIN_ENS/$file - done - fi - fi - fi - - # Remove empty directories - if [ -d $COMIN_ENS ] ; then - [[ ! "$(ls -A $COMIN_ENS)" ]] && rm -rf $COMIN_ENS - fi - done - - # Advance to next cycle - GDATE=$($NDATE +$assim_freq $GDATE) - - done - -fi - -# Remove enkf*.$rPDY for the older of GDATE or RDATE -GDATE=$($NDATE -${RMOLDSTD_ENKF:-120} $CDATE) -fhmax=$FHMAX_GFS -RDATE=$($NDATE -$fhmax $CDATE) -if [ $GDATE -lt $RDATE ]; then - RDATE=$GDATE -fi -rPDY=$(echo $RDATE | cut -c1-8) -clist="gdas gfs" -for ctype in $clist; do - COMIN="$ROTDIR/enkf$ctype.$rPDY" - [[ -d $COMIN ]] && rm -rf $COMIN -done - -############################################################### -exit 0 +exit ${status} diff --git a/scripts/exglobal_archive.sh b/scripts/exglobal_archive.sh new file mode 100644 index 00000000000..9cc29e61116 --- /dev/null +++ b/scripts/exglobal_archive.sh @@ -0,0 +1,448 @@ +#! /usr/bin/env bash + +################################################################################ +#### UNIX Script Documentation Block +# . . +# Script name: exglobal_archive.sh +# Script description: Run GDAS/GFS EMC archive +# +# Author: Lin Gan Org: NCEP/EMC Date: 2022-10-24 +# +# Abstract: This script configure archive and rapid submit thread of archive jobs +# +# Required module: prod_util, python +# +#### +################################################################################ + +source "$HOMEgfs/ush/preamble.sh" + +# Directories. +pwd=$(pwd) +COMIN_OBS=${COMIN_OBS:-$(compath.py prod/obsproc/${obsproc_ver})/$RUN.$PDY/$cyc/atmos} +COMIN=${COMINatmos:-"$ROTDIR/$CDUMP.$PDY/$cyc/atmos"} +cd $COMIN + +# Utilities +export NCP=${NCP:-"/bin/cp -p"} +export NMV=${NMV:-"/bin/mv"} +export NLN=${NLN:-"/bin/ln -sf"} + +# Initial exception handling +err=0 +err_inc=0 + +############################################################### +# Perform on-line archiving +############################################################### + +[[ ! -d $ARCDIR ]] && mkdir -p $ARCDIR +$NCP ${APREFIX}gsistat $ARCDIR/gsistat.${CDUMP}.${CDATE} +((errs + $?)) +$NCP ${APREFIX}pgrb2.1p00.anl $ARCDIR/pgbanl.${CDUMP}.${CDATE}.grib2 +((errs + $?)) + +# Archive 1 degree forecast GRIB2 files for verification +if [ $CDUMP = "gfs" ]; then + fhmax=$FHMAX_GFS + fhr=0 + while [ $fhr -le $fhmax ]; do + fhr2=$(printf %02i $fhr) + fhr3=$(printf %03i $fhr) + $NCP ${APREFIX}pgrb2.1p00.f$fhr3 $ARCDIR/pgbf${fhr2}.${CDUMP}.${CDATE}.grib2 + ((errs + $?)) + (( fhr = $fhr + $FHOUT_GFS )) + done +fi +if [ $CDUMP = "gdas" ]; then + flist="000 003 006 009" + for fhr in $flist; do + fname=${APREFIX}pgrb2.1p00.f${fhr} + fhr2=$(printf %02i $fhr) + $NCP $fname $ARCDIR/pgbf${fhr2}.${CDUMP}.${CDATE}.grib2 + ((errs + $?)) + done +fi + +if [ -s avno.t${cyc}z.cyclone.trackatcfunix ]; then + PLSOT4=`echo $PSLOT|cut -c 1-4 |tr '[a-z]' '[A-Z]'` + cat avno.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunix.${CDUMP}.$CDATE + cat avnop.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunixp.${CDUMP}.$CDATE +fi + +if [ $CDUMP = "gdas" -a -s gdas.t${cyc}z.cyclone.trackatcfunix ]; then + PLSOT4=`echo $PSLOT|cut -c 1-4 |tr '[a-z]' '[A-Z]'` + cat gdas.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunix.${CDUMP}.$CDATE + cat gdasp.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunixp.${CDUMP}.$CDATE +fi + +if [ $CDUMP = "gfs" ]; then + $NCP storms.gfso.atcf_gen.$CDATE ${ARCDIR}/. + $NCP storms.gfso.atcf_gen.altg.$CDATE ${ARCDIR}/. + $NCP trak.gfso.atcfunix.$CDATE ${ARCDIR}/. + $NCP trak.gfso.atcfunix.altg.$CDATE ${ARCDIR}/. + + mkdir -p ${ARCDIR}/tracker.$CDATE/$CDUMP + blist="epac natl" + for basin in $blist; do + cp -rp $basin ${ARCDIR}/tracker.$CDATE/$CDUMP + done +fi + +# Archive required gaussian gfs forecast files for Fit2Obs +if [ $CDUMP = "gfs" -a $FITSARC = "YES" ]; then + VFYARC=${VFYARC:-$ROTDIR/vrfyarch} + [[ ! -d $VFYARC ]] && mkdir -p $VFYARC + mkdir -p $VFYARC/${CDUMP}.$PDY/$cyc + prefix=${CDUMP}.t${cyc}z + fhmax=${FHMAX_FITS:-$FHMAX_GFS} + fhr=0 + while [[ $fhr -le $fhmax ]]; do + fhr3=$(printf %03i $fhr) + sfcfile=${prefix}.sfcf${fhr3}${ASUFFIX} + sigfile=${prefix}.atmf${fhr3}${ASUFFIX} + $NCP $sfcfile $VFYARC/${CDUMP}.$PDY/$cyc/ + ((errs + $?)) + $NCP $sigfile $VFYARC/${CDUMP}.$PDY/$cyc/ + ((errs + $?)) + (( fhr = $fhr + 6 )) + done +fi + +err_chk + +############################################################### +# Archive data to HPSS +if [ $HPSSARCH = "YES" ]; then +############################################################### + +#--determine when to save ICs for warm start and forecast-only runs +SAVEWARMICA="NO" +SAVEWARMICB="NO" +SAVEFCSTIC="NO" +firstday=$($NDATE +24 $SDATE) +mm=`echo $CDATE|cut -c 5-6` +dd=`echo $CDATE|cut -c 7-8` +nday=$(( (mm-1)*30+dd )) +mod=$(($nday % $ARCH_WARMICFREQ)) +if [ $CDATE -eq $firstday -a $cyc -eq $ARCHINC_CYC ]; then SAVEWARMICA="YES" ; fi +if [ $CDATE -eq $firstday -a $cyc -eq $ARCHICS_CYC ]; then SAVEWARMICB="YES" ; fi +if [ $mod -eq 0 -a $cyc -eq $ARCHINC_CYC ]; then SAVEWARMICA="YES" ; fi +if [ $mod -eq 0 -a $cyc -eq $ARCHICS_CYC ]; then SAVEWARMICB="YES" ; fi + +if [ $ARCHICS_CYC -eq 18 ]; then + nday1=$((nday+1)) + mod1=$(($nday1 % $ARCH_WARMICFREQ)) + if [ $mod1 -eq 0 -a $cyc -eq $ARCHICS_CYC ] ; then SAVEWARMICB="YES" ; fi + if [ $mod1 -ne 0 -a $cyc -eq $ARCHICS_CYC ] ; then SAVEWARMICB="NO" ; fi + if [ $CDATE -eq $SDATE -a $cyc -eq $ARCHICS_CYC ] ; then SAVEWARMICB="YES" ; fi +fi + +mod=$(($nday % $ARCH_FCSTICFREQ)) +if [ $mod -eq 0 -o $CDATE -eq $firstday ]; then SAVEFCSTIC="YES" ; fi + + +export ARCH_LIST="$COMIN/archlist" +[[ -d $ARCH_LIST ]] && rm -rf $ARCH_LIST +mkdir -p $ARCH_LIST +cd $ARCH_LIST + +$HOMEgfs/ush/hpssarch_gen.sh $CDUMP +err=$? +if [ $err -ne 0 ]; then + echo "$HOMEgfs/ush/hpssarch_gen.sh $CDUMP failed, ABORT!" + err_chk +fi + +cd $ROTDIR + +if [ $CDUMP = "gfs" ]; then + + #Common gfsa gfsb - NOTE - do not check htar error status + # Some files not found can be acceptable + for targrp in gfsa gfsb; do + export TRANSFER_TARGET_FILE=$targrp + $HOMEgfs/ush/hpss_global_archive_driver.sh + done + + if [ ${ARCH_GAUSSIAN:-"NO"} = "YES" ]; then + # Both cycled and fcst only + for targrp in gfs_flux gfs_${format}b gfs_pgrb2b; do + export TRANSFER_TARGET_FILE=$targrp + $HOMEgfs/ush/hpss_global_archive_driver.sh + err=$? + if [ $err -ne 0 -a $CDATE -ge $firstday ]; then + echo "Fail to create $CDATE ${targrp}.tar" + err_chk + fi + done + # Only cycled + if [ $MODE = "cycled" ]; then + targrp="$targrp_list gfs_${format}a" + export TRANSFER_TARGET_FILE=$targrp + $HOMEgfs/ush/hpss_global_archive_driver.sh + err=$? + if [ $err -ne 0 -a $CDATE -ge $firstday ]; then + echo "Fail to create $CDATE ${targrp}.tar" + err_chk + fi + fi + fi + + # gfs wave + if [ $DO_WAVE = "YES" -a "$WAVE_CDUMP" != "gdas" ]; then + for targrp in gfswave; do + export TRANSFER_TARGET_FILE=$targrp + $HOMEgfs/ush/hpss_global_archive_driver.sh + err=$? + if [ $err -ne 0 -a $CDATE -ge $firstday ]; then + echo "Fail to create $CDATE ${targrp}.tar" + err_chk + fi + done + fi + + # gfs ocean + if [ $DO_OCN = "YES" ]; then + for targrp in ocn_ice_grib2_0p5 ocn_ice_grib2_0p25 ocn_2D ocn_3D ocn_xsect ocn_daily gfs_flux_1p00; do + export TRANSFER_TARGET_FILE=$targrp + $HOMEgfs/ush/hpss_global_archive_driver.sh + err=$? + if [ $err -ne 0 -a $CDATE -ge $firstday ]; then + echo "Fail to create $CDATE ${targrp}.tar" + err_chk + fi + done + fi + + # gfs ice + if [ $DO_ICE = "YES" ]; then + for targrp in ice; do + export TRANSFER_TARGET_FILE=$targrp + $HOMEgfs/ush/hpss_global_archive_driver.sh + err=$? + if [ $err -ne 0 -a $CDATE -ge $firstday ]; then + echo "Fail to create $CDATE ${targrp}.tar" + err_chk + fi + done + fi + + # gfs aerosol + if [ $DO_AERO = "YES" ]; then + for targrp in chem; do + export TRANSFER_TARGET_FILE=$targrp + $HOMEgfs/ush/hpss_global_archive_driver.sh + err=$? + if [ $err -ne 0 -a $CDATE -ge $firstday ]; then + echo "Fail to create $CDATE ${targrp}.tar" + err_chk + fi + done + fi + + # restarts + if [ $SAVEFCSTIC = "YES" ]; then + export TRANSFER_TARGET_FILE=gfs_restarta + $HOMEgfs/ush/hpss_global_archive_driver.sh + err=$? + if [ $err -ne 0 -a $CDATE -ge $firstday ]; then + echo "Fail to create $CDATE gfs_restarta.tar" + err_chk + fi + fi + + # downstream products + if [ $DO_BUFRSND = "YES" -o $WAFSF = "YES" ]; then + export TRANSFER_TARGET_FILE=gfs_downstream + $HOMEgfs/ush/hpss_global_archive_driver.sh + err=$? + if [ $err -ne 0 -a $CDATE -ge $firstday ]; then + echo "Fail to create $CDATE gfs_downstream.tar" + err_chk + fi + fi + +fi + + +if [ $CDUMP = "gdas" ]; then + + #Common file + export TRANSFER_TARGET_FILE=gdas + $HOMEgfs/ush/hpss_global_archive_driver.sh + err=$? + if [ $err -ne 0 -a $CDATE -ge $firstday ]; then + echo "Fail to create $CDATE gdas.tar" + err_chk + fi + + #gdas wave + if [ $DO_WAVE = "YES" ]; then + export TRANSFER_TARGET_FILE=gdaswave + $HOMEgfs/ush/hpss_global_archive_driver.sh + err=$? + if [ $err -ne 0 -a $CDATE -ge $firstday ]; then + echo "Fail to create $CDATE gdaswave.tar" + err_chk + fi + fi + + # restart A + if [ $SAVEWARMICA = "YES" -o $SAVEFCSTIC = "YES" ]; then + export TRANSFER_TARGET_FILE=gdas_restarta + $HOMEgfs/ush/hpss_global_archive_driver.sh + err=$? + if [ $err -ne 0 -a $CDATE -ge $firstday ]; then + echo "Fail to create $CDATE gdas_restarta.tar" + err_chk + fi + if [ $DO_WAVE = "YES" ]; then + export TRANSFER_TARGET_FILE=gdaswave_restart + $HOMEgfs/ush/hpss_global_archive_driver.sh + err=$? + if [ $err -ne 0 -a $CDATE -ge $firstday ]; then + echo "Fail to create $CDATE gdaswave_restart.tar" + err_chk + fi + fi + fi + + # restart B + if [ $SAVEWARMICB = "YES" -o $SAVEFCSTIC = "YES" ]; then + export TRANSFER_TARGET_FILE=gdas_restartb + $HOMEgfs/ush/hpss_global_archive_driver.sh + err=$? + if [ $err -ne 0 -a $CDATE -ge $firstday ]; then + echo "Fail to create $CDATE gdas_restartb.tar" + err_chk + fi + fi + +fi + +############################################################### +fi ##end of HPSS archive +############################################################### + +############################################################### +# Clean up previous cycles; various depths +# PRIOR CYCLE: Leave the prior cycle alone +GDATE=$($NDATE -$assim_freq $CDATE) + +# PREVIOUS to the PRIOR CYCLE +GDATE=$($NDATE -$assim_freq $GDATE) +gPDY=$(echo $GDATE | cut -c1-8) +gcyc=$(echo $GDATE | cut -c9-10) + +# Remove the TMPDIR directory +COMIN="$RUNDIR/$GDATE" +[[ -d $COMIN ]] && rm -rf $COMIN + +############################################################### +# Clean up COM +############################################################### +if [[ "${DELETE_COM_IN_ARCHIVE_JOB:-YES}" == NO -o "${ROCOTO_WORKFLOW:-YES}" == NO ]] ; then + exit 0 +fi + +# Step back every assim_freq hours and remove old rotating directories +# for successful cycles (defaults from 24h to 120h). If GLDAS is +# active, retain files needed by GLDAS update. Independent of GLDAS, +# retain files needed by Fit2Obs +DO_GLDAS=${DO_GLDAS:-"NO"} +GDATEEND=$($NDATE -${RMOLDEND:-24} $CDATE) +GDATE=$($NDATE -${RMOLDSTD:-120} $CDATE) +GLDAS_DATE=$($NDATE -96 $CDATE) +RTOFS_DATE=$($NDATE -48 $CDATE) +while [ $GDATE -le $GDATEEND ]; do + gPDY=$(echo $GDATE | cut -c1-8) + gcyc=$(echo $GDATE | cut -c9-10) + COMIN="$ROTDIR/${CDUMP}.$gPDY/$gcyc/atmos" + COMINwave="$ROTDIR/${CDUMP}.$gPDY/$gcyc/wave" + COMINrtofs="$ROTDIR/rtofs.$gPDY" + if [ -d $COMIN ]; then + rocotolog="$EXPDIR/logs/${GDATE}.log" + if [ -f $rocotolog ]; then + testend=$(tail -n 1 $rocotolog | grep "This cycle is complete: Success") + rc=$? + if [ $rc -eq 0 ]; then + if [ -d $COMINwave ]; then rm -rf $COMINwave ; fi + if [ -d $COMINrtofs -a $GDATE -lt $RTOFS_DATE ]; then rm -rf $COMINrtofs ; fi + if [ $CDUMP != "gdas" -o $DO_GLDAS = "NO" -o $GDATE -lt $GLDAS_DATE ]; then + if [ $CDUMP = "gdas" ]; then + for file in $(ls $COMIN |grep -v prepbufr |grep -v cnvstat |grep -v atmanl.nc); do + rm -rf $COMIN/$file + done + else + rm -rf $COMIN + fi + else + if [ $DO_GLDAS = "YES" ]; then + for file in $(ls $COMIN |grep -v sflux |grep -v RESTART |grep -v prepbufr |grep -v cnvstat |grep -v atmanl.nc); do + rm -rf $COMIN/$file + done + for file in $(ls $COMIN/RESTART |grep -v sfcanl ); do + rm -rf $COMIN/RESTART/$file + done + else + for file in $(ls $COMIN |grep -v prepbufr |grep -v cnvstat |grep -v atmanl.nc); do + rm -rf $COMIN/$file + done + fi + fi + fi + fi + fi + + # Remove any empty directories + if [ -d $COMIN ]; then + [[ ! "$(ls -A $COMIN)" ]] && rm -rf $COMIN + fi + + if [ -d $COMINwave ]; then + [[ ! "$(ls -A $COMINwave)" ]] && rm -rf $COMINwave + fi + + GDATE=$($NDATE +$assim_freq $GDATE) +done + +# Remove archived gaussian files used for Fit2Obs in $VFYARC that are +# $FHMAX_FITS plus a delta before $CDATE. Touch existing archived +# gaussian files to prevent the files from being removed by automatic +# scrubber present on some machines. + +if [ $CDUMP = "gfs" ]; then + fhmax=$((FHMAX_FITS+36)) + RDATE=$($NDATE -$fhmax $CDATE) + rPDY=$(echo $RDATE | cut -c1-8) + COMIN="$VFYARC/$CDUMP.$rPDY" + [[ -d $COMIN ]] && rm -rf $COMIN + + TDATE=$($NDATE -$FHMAX_FITS $CDATE) + while [ $TDATE -lt $CDATE ]; do + tPDY=$(echo $TDATE | cut -c1-8) + tcyc=$(echo $TDATE | cut -c9-10) + TDIR=$VFYARC/$CDUMP.$tPDY/$tcyc + [[ -d $TDIR ]] && touch $TDIR/* + TDATE=$($NDATE +6 $TDATE) + done +fi + +# Remove $CDUMP.$rPDY for the older of GDATE or RDATE +GDATE=$($NDATE -${RMOLDSTD:-120} $CDATE) +fhmax=$FHMAX_GFS +RDATE=$($NDATE -$fhmax $CDATE) +if [ $GDATE -lt $RDATE ]; then + RDATE=$GDATE +fi +rPDY=$(echo $RDATE | cut -c1-8) +COMIN="$ROTDIR/$CDUMP.$rPDY" +[[ -d $COMIN ]] && rm -rf $COMIN + +############################################################### + +echo "ENDED NORMALLY." + +########################################## + diff --git a/scripts/hpss_global_archive_driver.sh b/ush/hpss_global_archive_driver.sh similarity index 69% rename from scripts/hpss_global_archive_driver.sh rename to ush/hpss_global_archive_driver.sh index 432c0384368..e11a4108c5d 100755 --- a/scripts/hpss_global_archive_driver.sh +++ b/ush/hpss_global_archive_driver.sh @@ -1,11 +1,11 @@ set -x pslot=${PSLOT:-""} -export JOB_LOG_DIR=${JOB_LOG_DIR:-""} +export JOB_LOG_DIR=${ARCH_LIST:-""} export SOURCE_DIR=${ROTDIR:-""} export ARCH_LIST=${ARCH_LIST:-""} export HPSS_TARGET_DIR=${ATARDIR:-""} echo "Dynamically create an archive job to archive files in $TRANSFER_TARGET_FILE" -python ${HOME_emc_ecf_wm}/scripts/hpss_global_archive.py +python $HOMEgfs/ush/hpss_global_archive.py From 7a6b62de1b179ed9bdcd05b8ec1afe09a1e5f804 Mon Sep 17 00:00:00 2001 From: "Lin.Gan" Date: Fri, 4 Nov 2022 17:04:51 +0000 Subject: [PATCH 05/21] Enable GDAS and GFS archive. Jobs tested on Cactus with cycled C192/C96. Github issue #1051 --- jobs/JGLOBAL_ARCHIVE | 16 +++++++++++----- scripts/exglobal_archive.sh | 34 ++++++++++++++++++++-------------- sorc/gfs_build.cfg | 1 + ush/hpss_global_archive.py | 11 +++++++---- 4 files changed, 39 insertions(+), 23 deletions(-) mode change 100644 => 100755 scripts/exglobal_archive.sh diff --git a/jobs/JGLOBAL_ARCHIVE b/jobs/JGLOBAL_ARCHIVE index 83449c21994..3d292d5e39f 100755 --- a/jobs/JGLOBAL_ARCHIVE +++ b/jobs/JGLOBAL_ARCHIVE @@ -16,6 +16,13 @@ for config in $configs; do [[ $status -ne 0 ]] && exit $status done +########################################## +# Source machine runtime environment +########################################## +. $HOMEgfs/env/${machine}.env arch +status=$? +[[ $status -ne 0 ]] && exit $status + ############################################# # Source workflow level common utilities ############################################# @@ -27,7 +34,6 @@ done # 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 @@ -61,15 +67,15 @@ export COMPONENT=${COMPONENT:-atmos} ############################################## # ICS are restarts and always lag INC by $assim_freq hours -ARCHINC_CYC=$ARCH_CYC -ARCHICS_CYC=$((ARCH_CYC-assim_freq)) +export ARCHINC_CYC=$ARCH_CYC +export ARCHICS_CYC=$((ARCH_CYC-assim_freq)) if [ $ARCHICS_CYC -lt 0 ]; then ARCHICS_CYC=$((ARCHICS_CYC+24)) fi # CURRENT CYCLE -APREFIX="${CDUMP}.t${cyc}z." -ASUFFIX=${ASUFFIX:-$SUFFIX} +export APREFIX="${CDUMP}.t${cyc}z." +export ASUFFIX=${ASUFFIX:-$SUFFIX} if [ $ASUFFIX = ".nc" ]; then format="netcdf" diff --git a/scripts/exglobal_archive.sh b/scripts/exglobal_archive.sh old mode 100644 new mode 100755 index 9cc29e61116..e7e3965b78a --- a/scripts/exglobal_archive.sh +++ b/scripts/exglobal_archive.sh @@ -30,17 +30,22 @@ export NLN=${NLN:-"/bin/ln -sf"} # Initial exception handling err=0 -err_inc=0 +# errs=0 + ############################################################### # Perform on-line archiving ############################################################### [[ ! -d $ARCDIR ]] && mkdir -p $ARCDIR -$NCP ${APREFIX}gsistat $ARCDIR/gsistat.${CDUMP}.${CDATE} -((errs + $?)) -$NCP ${APREFIX}pgrb2.1p00.anl $ARCDIR/pgbanl.${CDUMP}.${CDATE}.grib2 -((errs + $?)) + +# This file is not available in first half cycle +if [[ ! $SDATE = $CDATE ]]; then + $NCP ${APREFIX}gsistat $ARCDIR/gsistat.${CDUMP}.${CDATE} + # ((errs + $?)) + $NCP ${APREFIX}pgrb2.1p00.anl $ARCDIR/pgbanl.${CDUMP}.${CDATE}.grib2 + # ((errs + $?)) +fi # Archive 1 degree forecast GRIB2 files for verification if [ $CDUMP = "gfs" ]; then @@ -50,7 +55,7 @@ if [ $CDUMP = "gfs" ]; then fhr2=$(printf %02i $fhr) fhr3=$(printf %03i $fhr) $NCP ${APREFIX}pgrb2.1p00.f$fhr3 $ARCDIR/pgbf${fhr2}.${CDUMP}.${CDATE}.grib2 - ((errs + $?)) +# ((errs + $?)) (( fhr = $fhr + $FHOUT_GFS )) done fi @@ -58,9 +63,10 @@ if [ $CDUMP = "gdas" ]; then flist="000 003 006 009" for fhr in $flist; do fname=${APREFIX}pgrb2.1p00.f${fhr} - fhr2=$(printf %02i $fhr) +# fhr2=$(printf %02i $fhr) $(printf %02i $((10#$a))) + fhr2=$(printf %02i $((10#$fhr))) $NCP $fname $ARCDIR/pgbf${fhr2}.${CDUMP}.${CDATE}.grib2 - ((errs + $?)) +# ((errs + $?)) done fi @@ -76,7 +82,7 @@ if [ $CDUMP = "gdas" -a -s gdas.t${cyc}z.cyclone.trackatcfunix ]; then cat gdasp.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunixp.${CDUMP}.$CDATE fi -if [ $CDUMP = "gfs" ]; then +if [ $CDUMP = "gfs" -a $DO_VRFY = "YES" ]; then $NCP storms.gfso.atcf_gen.$CDATE ${ARCDIR}/. $NCP storms.gfso.atcf_gen.altg.$CDATE ${ARCDIR}/. $NCP trak.gfso.atcfunix.$CDATE ${ARCDIR}/. @@ -102,20 +108,20 @@ if [ $CDUMP = "gfs" -a $FITSARC = "YES" ]; then sfcfile=${prefix}.sfcf${fhr3}${ASUFFIX} sigfile=${prefix}.atmf${fhr3}${ASUFFIX} $NCP $sfcfile $VFYARC/${CDUMP}.$PDY/$cyc/ - ((errs + $?)) +# ((errs + $?)) $NCP $sigfile $VFYARC/${CDUMP}.$PDY/$cyc/ - ((errs + $?)) +# ((errs + $?)) (( fhr = $fhr + 6 )) done fi -err_chk +# err_chk ############################################################### # Archive data to HPSS if [ $HPSSARCH = "YES" ]; then ############################################################### - +export QUEUE_ARCH=${QUEUE_ARCH:-${QUEUE_SERVICE}} #--determine when to save ICs for warm start and forecast-only runs SAVEWARMICA="NO" SAVEWARMICB="NO" @@ -342,7 +348,7 @@ COMIN="$RUNDIR/$GDATE" ############################################################### # Clean up COM ############################################################### -if [[ "${DELETE_COM_IN_ARCHIVE_JOB:-YES}" == NO -o "${ROCOTO_WORKFLOW:-YES}" == NO ]] ; then +if [ $DELETE_COM_IN_ARCHIVE_JOB = "NO" -o $ROCOTO_WORKFLOW = "NO" ]; then exit 0 fi diff --git a/sorc/gfs_build.cfg b/sorc/gfs_build.cfg index c56db1f71fe..cd7bc22167f 100644 --- a/sorc/gfs_build.cfg +++ b/sorc/gfs_build.cfg @@ -12,6 +12,7 @@ Building ufs_utils (ufs_utils) ........................ yes Building gfs_wafs (gfs_wafs) .......................... yes Building gfs_utils (gfs_utils) ........................ yes + Building reg2grb2 (reg2grb2) .......................... no # -- END -- diff --git a/ush/hpss_global_archive.py b/ush/hpss_global_archive.py index a52aa488c63..926d0fe117a 100644 --- a/ush/hpss_global_archive.py +++ b/ush/hpss_global_archive.py @@ -48,18 +48,21 @@ print("Writing job card to "+job_card_filename) with open(job_card_filename, 'w') as job_card: if machine == 'WCOSS2': - job_card.write('#!/bin/sh\n') + job_card.write('#!/bin/bash \n') job_card.write('#PBS -q '+QUEUE_ARCH+'\n') job_card.write('#PBS -A '+ACCOUNT+'\n') - job_card.write('#PBS -V \n') job_card.write('#PBS -N '+job_name+'\n') job_card.write('#PBS -o '+job_output_filename+'\n') job_card.write('#PBS -e '+job_output_filename+'\n') - job_card.write('#PBS -l walltime=05:55:00\n') + job_card.write('#PBS -l walltime=00:20:00\n') job_card.write('#PBS -l debug=true\n') - job_card.write('#PBS -l place=vscatter,select=1:ncpus=1:mem=30GB') + job_card.write('#PBS -l place=vscatter,select=1:ncpus=1:mem=1GB') job_card.write('\n') + job_card.write('set +x \n') + job_card.write('source /usr/share/lmod/lmod/init/bash \n') + job_card.write('module reset \n') job_card.write('set -x \n') + job_card.write('module list \n') job_card.write('\n') job_card.write('#### '+HPSS_TARGET_DIR+'/'+TRANSFER_TARGET_FILE_2D+'.tar '+ARCH_LIST+'/'+TRANSFER_TARGET_FILE+'.txt' ' \n') job_card.write('cd '+SOURCE_DIR+'\n') From 103b6a2d150af3f9c8343f9f954dea439d2829c9 Mon Sep 17 00:00:00 2001 From: "Lin.Gan" Date: Wed, 9 Nov 2022 15:30:30 +0000 Subject: [PATCH 06/21] Create a version of ecflow archive jobs in rocoto workflow --- jobs/JENKFGDAS_ARCHIVE | 49 ++++++--- scripts/exgdas_enkf_earc.sh | 210 ++++++++++++++++++++++++++++++++++++ scripts/exglobal_archive.sh | 58 +++++++++- ush/hpss_global_archive.py | 2 +- 4 files changed, 303 insertions(+), 16 deletions(-) create mode 100755 scripts/exgdas_enkf_earc.sh diff --git a/jobs/JENKFGDAS_ARCHIVE b/jobs/JENKFGDAS_ARCHIVE index 67814d6dbba..72176abc353 100755 --- a/jobs/JENKFGDAS_ARCHIVE +++ b/jobs/JENKFGDAS_ARCHIVE @@ -1,9 +1,6 @@ -#!/bin/ksh -x - -export RUN_ENVIR=${RUN_ENVIR:-"nco"} -export PS4='$SECONDS + ' -date +#! /usr/bin/env bash +source "$HOMEgfs/ush/preamble.sh" ############################# # Source relevant config files @@ -17,13 +14,17 @@ for config in $configs; do [[ $status -ne 0 ]] && exit $status done +########################################## +# Source machine runtime environment +########################################## +. $HOMEgfs/env/${machine}.env earc +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 @@ -50,23 +51,47 @@ export pgmerr=errfile export CDATE=${CDATE:-${PDY}${cyc}} export CDUMP=${CDUMP:-${RUN:-"gfs"}} export COMPONENT=${COMPONENT:-atmos} -n=$((ENSGRP)) +export n=$((ENSGRP)) ############################################## # Begin JOB SPECIFIC work ############################################## # ICS are restarts and always lag INC by $assim_freq hours. -EARCINC_CYC=$ARCH_CYC -EARCICS_CYC=$((ARCH_CYC-assim_freq)) +export EARCINC_CYC=$ARCH_CYC +export EARCICS_CYC=$((ARCH_CYC-assim_freq)) if [ $EARCICS_CYC -lt 0 ]; then - EARCICS_CYC=$((EARCICS_CYC+24)) + export EARCICS_CYC=$((EARCICS_CYC+24)) fi # EnKF update in GFS, GDAS or both -CDUMP_ENKF=$(echo ${EUPD_CYC:-"gdas"} | tr a-z A-Z) +export CDUMP_ENKF=$(echo ${EUPD_CYC:-"gdas"} | tr a-z A-Z) export ARCH_LIST="$ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/earc$ENSGRP" + +############################################################### +# Run archive script +############################################################### + +$SCRgfs/exgdas_enkf_earc.sh +status=$? +[[ $status -ne 0 ]] && exit $status + +############################################################### + +echo "ENDED NORMALLY." + +########################################## +# Remove the Temporary working directory +########################################## +cd $DATAROOT +[[ $KEEPDATA = "NO" ]] && rm -rf $DATA + +date +exit 0 + + + [[ -d $ARCH_LIST ]] && rm -rf $ARCH_LIST mkdir -p $ARCH_LIST cd $ARCH_LIST diff --git a/scripts/exgdas_enkf_earc.sh b/scripts/exgdas_enkf_earc.sh new file mode 100755 index 00000000000..d1dbfe0dfd6 --- /dev/null +++ b/scripts/exgdas_enkf_earc.sh @@ -0,0 +1,210 @@ +#! /usr/bin/env bash + +################################################################################ +#### UNIX Script Documentation Block +# . . +# Script name: exgdas_enkf_earc.sh +# Script description: Run ENKFGDAS EMC archive +# +# Author: Lin Gan Org: NCEP/EMC Date: 2022-11-04 +# +# Abstract: This script configure archive and rapid submit thread of archive jobs +# +# Required module: prod_util, python +# +#### +################################################################################ + +source "$HOMEgfs/ush/preamble.sh" + +# Directories. +pwd=$(pwd) + +export QUEUE_ARCH=${QUEUE_ARCH:-${QUEUE_SERVICE}} +export ARCH_LIST=${ARCH_LIST:-$ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/earc$ENSGRP} +[[ -d $ARCH_LIST ]] && rm -rf $ARCH_LIST +mkdir -p $ARCH_LIST +cd $ARCH_LIST +$HOMEgfs/ush/hpssarch_gen.sh enkf${CDUMP} +status=$? +if [ $status -ne 0 ]; then + echo "$HOMEgfs/ush/hpssarch_gen.sh enkf${CDUMP} failed, ABORT!" + exit $status +fi + +cd $ROTDIR + +############################################## +# ENSGRP > 0 archives a group of ensemble members +############################################## +firstday=$($NDATE +24 $SDATE) +if [[ $ENSGRP -gt 0 ]] && [[ $HPSSARCH = "YES" ]]; then + +#--determine when to save ICs for warm start + SAVEWARMICA="NO" + SAVEWARMICB="NO" + mm=`echo $CDATE|cut -c 5-6` + dd=`echo $CDATE|cut -c 7-8` + nday=$(( (mm-1)*30+dd )) + mod=$(($nday % $ARCH_WARMICFREQ)) + if [ $CDATE -eq $firstday -a $cyc -eq $EARCINC_CYC ]; then SAVEWARMICA="YES" ; fi + if [ $CDATE -eq $firstday -a $cyc -eq $EARCICS_CYC ]; then SAVEWARMICB="YES" ; fi + if [ $mod -eq 0 -a $cyc -eq $EARCINC_CYC ]; then SAVEWARMICA="YES" ; fi + if [ $mod -eq 0 -a $cyc -eq $EARCICS_CYC ]; then SAVEWARMICB="YES" ; fi + + if [ $EARCICS_CYC -eq 18 ]; then + nday1=$((nday+1)) + mod1=$(($nday1 % $ARCH_WARMICFREQ)) + if [ $mod1 -eq 0 -a $cyc -eq $EARCICS_CYC ] ; then SAVEWARMICB="YES" ; fi + if [ $mod1 -ne 0 -a $cyc -eq $EARCICS_CYC ] ; then SAVEWARMICB="NO" ; fi + if [ $CDATE -eq $SDATE -a $cyc -eq $EARCICS_CYC ] ; then SAVEWARMICB="YES" ; fi + fi + + if [ $CDATE -gt $SDATE ]; then # Don't run for first half cycle + + export TRANSFER_TARGET_FILE=enkf${CDUMP}_grp${n} + export TRANSFER_TARGET_FILE_2D=enkf${CDUMP}_grp${ENSGRP} + $HOMEgfs/ush/hpss_global_archive_driver.sh + status=$? + if [ $status -ne 0 -a $CDATE -ge $firstday ]; then + echo "OFFLINE TAR $CDATE enkf${CDUMP}_grp${ENSGRP}.tar failed" + exit $status + fi + + if [ $SAVEWARMICA = "YES" -a $cyc -eq $EARCINC_CYC ]; then + export TRANSFER_TARGET_FILE=enkf${CDUMP}_restarta_grp${n} + export TRANSFER_TARGET_FILE_2D=enkf${CDUMP}_restarta_grp${ENSGRP} + $HOMEgfs/ush/hpss_global_archive_driver.sh + status=$? + if [ $status -ne 0 ]; then + echo "OFFLINE TAR $CDATE enkf${CDUMP}_restarta_grp${ENSGRP}.tar failed" + exit $status + fi + fi + + if [ $SAVEWARMICB = "YES" -a $cyc -eq $EARCICS_CYC ]; then + export TRANSFER_TARGET_FILE=enkf${CDUMP}_restartb_grp${n} + export TRANSFER_TARGET_FILE_2D=enkf${CDUMP}_restartb_grp${ENSGRP} + $HOMEgfs/ush/hpss_global_archive_driver.sh + status=$? + if [ $status -ne 0 ]; then + echo "OFFLINE TAR $CDATE enkf${CDUMP}_restartb_grp${ENSGRP}.tar failed" + exit $status + fi + fi + + fi # CDATE>SDATE + +fi + + +################################################################### +# ENSGRP 0 archives ensemble means and copy data to online archive +################################################################### +if [ $ENSGRP -eq 0 ]; then + + if [ $HPSSARCH = "YES" ]; then + export TRANSFER_TARGET_FILE=enkf${CDUMP} + $HOMEgfs/ush/hpss_global_archive_driver.sh + status=$? + if [ $status -ne 0 -a $CDATE -ge $firstday ]; then + echo "OFFLINE TAR $CDATE enkf${CDUMP}.tar failed" + exit $status + fi + fi + + #-- Archive online for verification and diagnostics + [[ ! -d $ARCDIR ]] && mkdir -p $ARCDIR + cd $ARCDIR + + if [[ ! $SDATE = $CDATE ]]; then + $NCP $ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.enkfstat enkfstat.${CDUMP}.$CDATE + $NCP $ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.${CDUMP}.${CDATE}.ensmean + fi + + if [ $CDUMP_ENKF != "GDAS" ]; then + $NCP $ROTDIR/enkfgfs.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.enkfstat enkfstat.gfs.$CDATE + $NCP $ROTDIR/enkfgfs.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.gfs.${CDATE}.ensmean + fi + +fi + +############################################################## +# ENSGRP 0 also does clean-up +############################################################### +if [ $ENSGRP -eq 0 -a $DELETE_COM_IN_ARCHIVE_JOB = "YES" -a $ROCOTO_WORKFLOW = "YES" ]; then + + # Start start and end dates to remove + GDATEEND=$($NDATE -${RMOLDEND_ENKF:-24} $CDATE) + GDATE=$($NDATE -${RMOLDSTD_ENKF:-120} $CDATE) + while [ $GDATE -le $GDATEEND ]; do + + gPDY=$(echo $GDATE | cut -c1-8) + gcyc=$(echo $GDATE | cut -c9-10) + + # Loop over GDAS and GFS EnKF directories separately. + clist="gdas gfs" + for ctype in $clist; do + COMIN_ENS="$ROTDIR/enkf$ctype.$gPDY/$gcyc/$COMPONENT" + if [ -d $COMIN_ENS ]; then + rocotolog="$EXPDIR/logs/${GDATE}.log" + if [ -f $rocotolog ]; then + testend=$(tail -n 1 $rocotolog | grep "This cycle is complete: Success") + cycle_completed=$? + cycle_clean_up=0 + if [ $HPSSARCH = "YES" ]; then + cd ${ROTDIR}/logs/${GDATE} + hpss_archive_files=`grep "Output sent to" *arc*.log|grep ${CDUMP}earc|awk '{print $4}'` + for file in $hpss_archive_files; do + hst=`grep "HTAR: HTAR SUCCESSFUL" $file|wc -l` + [[ $hst -eq 0 ]] && cycle_clean_up=1 + done + fi + if [ $cycle_completed -eq 0 -a $cycle_clean_up -eq 0 ]; then + # Retain f006.ens files. Remove everything else + for file in $(ls $COMIN_ENS | grep -v f006.ens); do + rm -rf $COMIN_ENS/$file + done + fi + fi + fi + + # Remove empty directories + if [ -d $COMIN_ENS ] ; then + [[ ! "$(ls -A $COMIN_ENS)" ]] && rm -rf $COMIN_ENS + fi + done + + # Advance to next cycle + GDATE=$($NDATE +$assim_freq $GDATE) + + done + +fi + +# Remove enkf*.$rPDY for the older of GDATE or RDATE +GDATE=$($NDATE -${RMOLDSTD_ENKF:-120} $CDATE) +fhmax=$FHMAX_GFS +RDATE=$($NDATE -$fhmax $CDATE) +if [ $GDATE -lt $RDATE ]; then + RDATE=$GDATE +fi +rPDY=$(echo $RDATE | cut -c1-8) +clist="gdas gfs" +for ctype in $clist; do + COMIN="$ROTDIR/enkf$ctype.$rPDY" + [[ -d $COMIN ]] && rm -rf $COMIN +done + +############################################################### + +echo "ENDED NORMALLY." + +########################################## +# Remove the Temporary working directory +########################################## +cd $DATAROOT +[[ $KEEPDATA = "NO" ]] && rm -rf $DATA + +date +exit 0 diff --git a/scripts/exglobal_archive.sh b/scripts/exglobal_archive.sh index e7e3965b78a..f75f06fa8ce 100755 --- a/scripts/exglobal_archive.sh +++ b/scripts/exglobal_archive.sh @@ -327,6 +327,45 @@ if [ $CDUMP = "gdas" ]; then fi +############################################################### +# Rerun failed HPSS Archive jobs +############################################################### +if [ $machine = "WCOSS2" ]; then + mkdir -p ${DATA}/archive_rerun + cd $ROTDIR + find . -name "*_HPSS_ARCHIVE_*.sh" &> ${DATA}/archive_rerun/found_arch_sc_list.dat + find . -name "*_HPSS_ARCHIVE_*.out" &> ${DATA}/archive_rerun/found_arch_jobout_list.dat +# current_running_archive_jobs_list=`qstat -u ${USER} -T -w -f |grep Name|grep "_HPSS_ARCHIVE_"|sed 's/ Job_Name =//'` +# current_running_archive_jobs_list=$(qstat -u lin.gan -s -xu lin.gan|grep " Q \| R "|grep "dev_tra"|awk "{print $1}") + current_running_archive_jobs_id_list=$(qstat -u lin.gan -s -xu lin.gan|grep " Q \| R "|grep "dev_tra"|awk '{print $1}') + for jid_arch in $current_running_archive_jobs_id_list; do + `qstat -f $jid_arch| grep "Job_Name"|awk '{print $3}' &>> ${DATA}/archive_rerun/current_running_archive_jobs_name.dat` + done + current_running_archive_jobs_name_list=$(uniq ${DATA}/archive_rerun/current_running_archive_jobs_name.dat) +# found_arch_sc_list_ct=`cat ${DATA}/archive_rerun/found_arch_sc_list.dat|wc -l` +# found_arch_jobout_list_ct=`cat ${DATA}/archive_rerun/found_arch_jobout_list.dat|wc -l` +# [[ ! $found_arch_sc_list_ct -eq $found_arch_jobout_list_ct ]] && exit 6 + found_arch_jobout_list=`cat ${DATA}/archive_rerun/found_arch_jobout_list.dat` + for file in $found_arch_jobout_list; do + stat=`grep "HTAR: HTAR SUCCESSFUL" ${ROTDIR}/${file}|wc -l` + if [ $stat -eq 0 ]; then + # dir_name=`readlink -f $file | xargs dirname` + dir_name=$(echo $(dirname $file)) + cd ${ROTDIR}/${dir_name} + # sc_name=`readlink -f $file |sed 's#.*/##'|sed 's/.out/.sh/'` + sc_name=$(echo $(echo $(basename $file))|sed 's/.out/.sh/') + # sc_name=$(echo $(basename $file))|sed 's/.out/.sh/' + jb_name=$(echo $sc_name | sed 's/.sh//') + # q_exist=grep $jb_name $current_running_archive_jobs_list | wc -l + q_exist=$(echo $current_running_archive_jobs_name_list |grep $jb_name| wc -l) + if [ $q_exist -eq 0 ]; then + echo "HPSS_ARCHIVE job $file did not complete - rerun in progress" + qsub < $sc_name + fi + fi + done +fi + ############################################################### fi ##end of HPSS archive ############################################################### @@ -334,6 +373,7 @@ fi ##end of HPSS archive ############################################################### # Clean up previous cycles; various depths # PRIOR CYCLE: Leave the prior cycle alone +############################################################### GDATE=$($NDATE -$assim_freq $CDATE) # PREVIOUS to the PRIOR CYCLE @@ -352,10 +392,12 @@ if [ $DELETE_COM_IN_ARCHIVE_JOB = "NO" -o $ROCOTO_WORKFLOW = "NO" ]; then exit 0 fi +############################################################### # Step back every assim_freq hours and remove old rotating directories # for successful cycles (defaults from 24h to 120h). If GLDAS is # active, retain files needed by GLDAS update. Independent of GLDAS, # retain files needed by Fit2Obs +############################################################### DO_GLDAS=${DO_GLDAS:-"NO"} GDATEEND=$($NDATE -${RMOLDEND:-24} $CDATE) GDATE=$($NDATE -${RMOLDSTD:-120} $CDATE) @@ -369,10 +411,20 @@ while [ $GDATE -le $GDATEEND ]; do COMINrtofs="$ROTDIR/rtofs.$gPDY" if [ -d $COMIN ]; then rocotolog="$EXPDIR/logs/${GDATE}.log" - if [ -f $rocotolog ]; then + if [ -f $rocotolog ]; then testend=$(tail -n 1 $rocotolog | grep "This cycle is complete: Success") - rc=$? - if [ $rc -eq 0 ]; then + cycle_completed=$? + cycle_clean_up=0 + if [ $HPSSARCH = "YES" ]; then + cd ${ROTDIR}/logs/${GDATE} + hpss_archive_files=`grep "Output sent to" *arc*.log|grep ${CDUMP}arch|awk '{print $4}'` + for file in $hpss_archive_files; do + hst=`grep "HTAR: HTAR SUCCESSFUL" $file|wc -l` + [[ $hst -eq 0 ]] && cycle_clean_up=1 + done + fi + #### exit 5 + if [ $cycle_completed -eq 0 -a $cycle_clean_up -eq 0 ]; then if [ -d $COMINwave ]; then rm -rf $COMINwave ; fi if [ -d $COMINrtofs -a $GDATE -lt $RTOFS_DATE ]; then rm -rf $COMINrtofs ; fi if [ $CDUMP != "gdas" -o $DO_GLDAS = "NO" -o $GDATE -lt $GLDAS_DATE ]; then diff --git a/ush/hpss_global_archive.py b/ush/hpss_global_archive.py index 926d0fe117a..1393d4ecef5 100644 --- a/ush/hpss_global_archive.py +++ b/ush/hpss_global_archive.py @@ -54,7 +54,7 @@ job_card.write('#PBS -N '+job_name+'\n') job_card.write('#PBS -o '+job_output_filename+'\n') job_card.write('#PBS -e '+job_output_filename+'\n') - job_card.write('#PBS -l walltime=00:20:00\n') + job_card.write('#PBS -l walltime=00:40:00\n') job_card.write('#PBS -l debug=true\n') job_card.write('#PBS -l place=vscatter,select=1:ncpus=1:mem=1GB') job_card.write('\n') From c29bca3809aa470aa3a1a4f96937c98c8fb7573f Mon Sep 17 00:00:00 2001 From: "Lin.Gan" Date: Wed, 9 Nov 2022 16:38:58 +0000 Subject: [PATCH 07/21] Code clean up for PR preparation --- jobs/JENKFGDAS_ARCHIVE | 184 ------------------------------------ scripts/exglobal_archive.sh | 14 --- 2 files changed, 198 deletions(-) diff --git a/jobs/JENKFGDAS_ARCHIVE b/jobs/JENKFGDAS_ARCHIVE index 72176abc353..87dafe5cfac 100755 --- a/jobs/JENKFGDAS_ARCHIVE +++ b/jobs/JENKFGDAS_ARCHIVE @@ -89,187 +89,3 @@ cd $DATAROOT date exit 0 - - - -[[ -d $ARCH_LIST ]] && rm -rf $ARCH_LIST -mkdir -p $ARCH_LIST -cd $ARCH_LIST - -$HOMEgfs/ush/hpssarch_gen.sh enkf${CDUMP} -status=$? -if [ $status -ne 0 ]; then - echo "$HOMEgfs/ush/hpssarch_gen.sh enkf${CDUMP} failed, ABORT!" - exit $status -fi - -cd $ROTDIR - -############################################## -# ENSGRP > 0 archives a group of ensemble members -############################################## -firstday=$($NDATE +24 $SDATE) -if [[ $ENSGRP -gt 0 ]] && [[ $HPSSARCH = "YES" ]]; then - -#--determine when to save ICs for warm start - SAVEWARMICA="NO" - SAVEWARMICB="NO" - mm=`echo $CDATE|cut -c 5-6` - dd=`echo $CDATE|cut -c 7-8` - nday=$(( (mm-1)*30+dd )) - mod=$(($nday % $ARCH_WARMICFREQ)) - if [ $CDATE -eq $firstday -a $cyc -eq $EARCINC_CYC ]; then SAVEWARMICA="YES" ; fi - if [ $CDATE -eq $firstday -a $cyc -eq $EARCICS_CYC ]; then SAVEWARMICB="YES" ; fi - if [ $mod -eq 0 -a $cyc -eq $EARCINC_CYC ]; then SAVEWARMICA="YES" ; fi - if [ $mod -eq 0 -a $cyc -eq $EARCICS_CYC ]; then SAVEWARMICB="YES" ; fi - - if [ $EARCICS_CYC -eq 18 ]; then - nday1=$((nday+1)) - mod1=$(($nday1 % $ARCH_WARMICFREQ)) - if [ $mod1 -eq 0 -a $cyc -eq $EARCICS_CYC ] ; then SAVEWARMICB="YES" ; fi - if [ $mod1 -ne 0 -a $cyc -eq $EARCICS_CYC ] ; then SAVEWARMICB="NO" ; fi - if [ $CDATE -eq $SDATE -a $cyc -eq $EARCICS_CYC ] ; then SAVEWARMICB="YES" ; fi - fi - - if [ $CDATE -gt $SDATE ]; then # Don't run for first half cycle - - export TRANSFER_TARGET_FILE=enkf${CDUMP}_grp${n} - export TRANSFER_TARGET_FILE_2D=enkf${CDUMP}_grp${ENSGRP} - ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh - status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "OFFLINE TAR $CDATE enkf${CDUMP}_grp${ENSGRP}.tar failed" - exit $status - fi - - if [ $SAVEWARMICA = "YES" -a $cyc -eq $EARCINC_CYC ]; then - export TRANSFER_TARGET_FILE=enkf${CDUMP}_restarta_grp${n} - export TRANSFER_TARGET_FILE_2D=enkf${CDUMP}_restarta_grp${ENSGRP} - ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh - status=$? - if [ $status -ne 0 ]; then - echo "OFFLINE TAR $CDATE enkf${CDUMP}_restarta_grp${ENSGRP}.tar failed" - exit $status - fi - fi - - if [ $SAVEWARMICB = "YES" -a $cyc -eq $EARCICS_CYC ]; then - export TRANSFER_TARGET_FILE=enkf${CDUMP}_restartb_grp${n} - export TRANSFER_TARGET_FILE_2D=enkf${CDUMP}_restartb_grp${ENSGRP} - ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh - status=$? - if [ $status -ne 0 ]; then - echo "OFFLINE TAR $CDATE enkf${CDUMP}_restartb_grp${ENSGRP}.tar failed" - exit $status - fi - fi - - fi # CDATE>SDATE - -fi - - -################################################################### -# ENSGRP 0 archives ensemble means and copy data to online archive -if [ $ENSGRP -eq 0 ]; then - - if [ $HPSSARCH = "YES" ]; then - export TRANSFER_TARGET_FILE=enkf${CDUMP} - ${HOME_emc_ecf_wm}/scripts/hpss_global_archive_driver.sh - status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "OFFLINE TAR $CDATE enkf${CDUMP}.tar failed" - exit $status - fi - fi - - #-- Archive online for verification and diagnostics - [[ ! -d $ARCDIR ]] && mkdir -p $ARCDIR - cd $ARCDIR - - $NCP $ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.enkfstat enkfstat.${CDUMP}.$CDATE - $NCP $ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.${CDUMP}.${CDATE}.ensmean - - if [ $CDUMP_ENKF != "GDAS" ]; then - $NCP $ROTDIR/enkfgfs.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.enkfstat enkfstat.gfs.$CDATE - $NCP $ROTDIR/enkfgfs.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.gfs.${CDATE}.ensmean - fi - -fi - -############################################################### -# Clean up COM -############################################################### -if [[ "${DELETE_COM_IN_ARCHIVE_JOB:-YES}" == NO -o "${ROCOTO_WORKFLOW:-YES}" == NO ]] ; then - exit 0 -fi - -############################################################### -# ENSGRP 0 also does clean-up -if [ $ENSGRP -eq 0 ]; then - - # Start start and end dates to remove - GDATEEND=$($NDATE -${RMOLDEND_ENKF:-24} $CDATE) - GDATE=$($NDATE -${RMOLDSTD_ENKF:-120} $CDATE) - while [ $GDATE -le $GDATEEND ]; do - - gPDY=$(echo $GDATE | cut -c1-8) - gcyc=$(echo $GDATE | cut -c9-10) - - # Loop over GDAS and GFS EnKF directories separately. - clist="gdas gfs" - for ctype in $clist; do - COMIN_ENS="$ROTDIR/enkf$ctype.$gPDY/$gcyc/$COMPONENT" - if [ -d $COMIN_ENS ]; then - rocotolog="$EXPDIR/logs/${GDATE}.log" - if [ -f $rocotolog ]; then - testend=$(tail -n 1 $rocotolog | grep "This cycle is complete: Success") - rc=$? - if [ $rc -eq 0 ]; then - # Retain f006.ens files. Remove everything else - for file in $(ls $COMIN_ENS | grep -v f006.ens); do - rm -rf $COMIN_ENS/$file - done - fi - fi - fi - - # Remove empty directories - if [ -d $COMIN_ENS ] ; then - [[ ! "$(ls -A $COMIN_ENS)" ]] && rm -rf $COMIN_ENS - fi - done - - # Advance to next cycle - GDATE=$($NDATE +$assim_freq $GDATE) - - done - -fi - -# Remove enkf*.$rPDY for the older of GDATE or RDATE -GDATE=$($NDATE -${RMOLDSTD_ENKF:-120} $CDATE) -fhmax=$FHMAX_GFS -RDATE=$($NDATE -$fhmax $CDATE) -if [ $GDATE -lt $RDATE ]; then - RDATE=$GDATE -fi -rPDY=$(echo $RDATE | cut -c1-8) -clist="gdas gfs" -for ctype in $clist; do - COMIN="$ROTDIR/enkf$ctype.$rPDY" - [[ -d $COMIN ]] && rm -rf $COMIN -done - -############################################################### - -echo "ENDED NORMALLY." - -########################################## -# Remove the Temporary working directory -########################################## -cd $DATAROOT -[[ $KEEPDATA = "NO" ]] && rm -rf $DATA - -date -exit 0 diff --git a/scripts/exglobal_archive.sh b/scripts/exglobal_archive.sh index f75f06fa8ce..657139d6bca 100755 --- a/scripts/exglobal_archive.sh +++ b/scripts/exglobal_archive.sh @@ -108,15 +108,11 @@ if [ $CDUMP = "gfs" -a $FITSARC = "YES" ]; then sfcfile=${prefix}.sfcf${fhr3}${ASUFFIX} sigfile=${prefix}.atmf${fhr3}${ASUFFIX} $NCP $sfcfile $VFYARC/${CDUMP}.$PDY/$cyc/ -# ((errs + $?)) $NCP $sigfile $VFYARC/${CDUMP}.$PDY/$cyc/ -# ((errs + $?)) (( fhr = $fhr + 6 )) done fi -# err_chk - ############################################################### # Archive data to HPSS if [ $HPSSARCH = "YES" ]; then @@ -335,28 +331,19 @@ if [ $machine = "WCOSS2" ]; then cd $ROTDIR find . -name "*_HPSS_ARCHIVE_*.sh" &> ${DATA}/archive_rerun/found_arch_sc_list.dat find . -name "*_HPSS_ARCHIVE_*.out" &> ${DATA}/archive_rerun/found_arch_jobout_list.dat -# current_running_archive_jobs_list=`qstat -u ${USER} -T -w -f |grep Name|grep "_HPSS_ARCHIVE_"|sed 's/ Job_Name =//'` -# current_running_archive_jobs_list=$(qstat -u lin.gan -s -xu lin.gan|grep " Q \| R "|grep "dev_tra"|awk "{print $1}") current_running_archive_jobs_id_list=$(qstat -u lin.gan -s -xu lin.gan|grep " Q \| R "|grep "dev_tra"|awk '{print $1}') for jid_arch in $current_running_archive_jobs_id_list; do `qstat -f $jid_arch| grep "Job_Name"|awk '{print $3}' &>> ${DATA}/archive_rerun/current_running_archive_jobs_name.dat` done current_running_archive_jobs_name_list=$(uniq ${DATA}/archive_rerun/current_running_archive_jobs_name.dat) -# found_arch_sc_list_ct=`cat ${DATA}/archive_rerun/found_arch_sc_list.dat|wc -l` -# found_arch_jobout_list_ct=`cat ${DATA}/archive_rerun/found_arch_jobout_list.dat|wc -l` -# [[ ! $found_arch_sc_list_ct -eq $found_arch_jobout_list_ct ]] && exit 6 found_arch_jobout_list=`cat ${DATA}/archive_rerun/found_arch_jobout_list.dat` for file in $found_arch_jobout_list; do stat=`grep "HTAR: HTAR SUCCESSFUL" ${ROTDIR}/${file}|wc -l` if [ $stat -eq 0 ]; then - # dir_name=`readlink -f $file | xargs dirname` dir_name=$(echo $(dirname $file)) cd ${ROTDIR}/${dir_name} - # sc_name=`readlink -f $file |sed 's#.*/##'|sed 's/.out/.sh/'` sc_name=$(echo $(echo $(basename $file))|sed 's/.out/.sh/') - # sc_name=$(echo $(basename $file))|sed 's/.out/.sh/' jb_name=$(echo $sc_name | sed 's/.sh//') - # q_exist=grep $jb_name $current_running_archive_jobs_list | wc -l q_exist=$(echo $current_running_archive_jobs_name_list |grep $jb_name| wc -l) if [ $q_exist -eq 0 ]; then echo "HPSS_ARCHIVE job $file did not complete - rerun in progress" @@ -423,7 +410,6 @@ while [ $GDATE -le $GDATEEND ]; do [[ $hst -eq 0 ]] && cycle_clean_up=1 done fi - #### exit 5 if [ $cycle_completed -eq 0 -a $cycle_clean_up -eq 0 ]; then if [ -d $COMINwave ]; then rm -rf $COMINwave ; fi if [ -d $COMINrtofs -a $GDATE -lt $RTOFS_DATE ]; then rm -rf $COMINrtofs ; fi From 9fc35a900aba01962304fbdedf9f72941a7433e5 Mon Sep 17 00:00:00 2001 From: "Lin.Gan" Date: Wed, 9 Nov 2022 16:56:55 +0000 Subject: [PATCH 08/21] Restore a missing file from develop --- ecf/setup_ecf_links.sh | 59 +++++++++++++++++++++++++++++++ ush/hpss_global_archive_driver.sh | 1 + 2 files changed, 60 insertions(+) create mode 100755 ecf/setup_ecf_links.sh diff --git a/ecf/setup_ecf_links.sh b/ecf/setup_ecf_links.sh new file mode 100755 index 00000000000..b0dce50cc5c --- /dev/null +++ b/ecf/setup_ecf_links.sh @@ -0,0 +1,59 @@ +#!/bin/bash + +set -eu + +ECF_DIR=$(pwd) + +# Function that loops over forecast hours and +# creates link between the master and target +function link_master_to_fhr(){ + tmpl=$1 # Name of the master template + fhrs=$2 # Array of forecast hours + for fhr in ${fhrs[@]}; do + fhrchar=$(printf %03d $fhr) + master=${tmpl}_master.ecf + target=${tmpl}_f${fhrchar}.ecf + rm -f $target + ln -sf $master $target + done +} + +# EnKF GDAS post files +cd $ECF_DIR/scripts/enkfgdas/post +echo "Linking enkfgdas/post ..." +fhrs=($(seq 3 9)) +link_master_to_fhr "jenkfgdas_post" "$fhrs" + +# GDAS post files +cd $ECF_DIR/scripts/gdas/atmos/post +echo "Linking gdas/atmos/post ..." +rm -f jgdas_atmos_post_anl.ecf +ln -sf jgdas_atmos_post_master.ecf jgdas_atmos_post_anl.ecf +fhrs=($(seq 0 9)) +link_master_to_fhr "jgdas_atmos_post" "$fhrs" + +# GFS post files +cd $ECF_DIR/scripts/gfs/atmos/post +echo "Linking gfs/atmos/post ..." +rm -f jgfs_atmos_post_anl.ecf +ln -sf jgfs_atmos_post_master.ecf jgfs_atmos_post_anl.ecf +fhrs=($(seq 0 1 120) $(seq 123 3 384)) +link_master_to_fhr "jgfs_atmos_post" "$fhrs" + +# GFS awips 20km 1p0 files +cd $ECF_DIR/scripts/gfs/atmos/post_processing/awips_20km_1p0 +echo "Linking gfs/atmos/post_processing/awips_20km_1p0 ..." +fhrs=($(seq 0 3 84) $(seq 90 6 240)) +link_master_to_fhr "jgfs_atmos_awips" "$fhrs" + +# GFS awips g2 files +cd $ECF_DIR/scripts/gfs/atmos/post_processing/awips_g2 +echo "Linking gfs/atmos/post_processing/awips_g2 ..." +fhrs=($(seq 0 3 84) $(seq 90 6 240)) +link_master_to_fhr "jgfs_atmos_awips_g2" "$fhrs" + +# GFS atmos wafs files +cd $ECF_DIR/scripts/gfs/atmos/post_processing/grib_wafs +echo "Linking gfs/atmos/post_processing/grib_wafs ..." +fhrs=($(seq 0 6 120)) +link_master_to_fhr "jgfs_atmos_wafs" "$fhrs" diff --git a/ush/hpss_global_archive_driver.sh b/ush/hpss_global_archive_driver.sh index e11a4108c5d..d7a7595f0b3 100755 --- a/ush/hpss_global_archive_driver.sh +++ b/ush/hpss_global_archive_driver.sh @@ -1,3 +1,4 @@ +#!/bin/bash set -x pslot=${PSLOT:-""} From bfe11c68fbf5d688d95a103d0a71b38d812175f0 Mon Sep 17 00:00:00 2001 From: "Lin.Gan" Date: Thu, 10 Nov 2022 14:54:21 +0000 Subject: [PATCH 09/21] Create a version that only have jjob and ex-script updates --- jobs/rocoto/vrfy.sh | 1 + scripts/exgdas_enkf_earc.sh | 130 +++++------ scripts/exglobal_archive.sh | 361 ++++++++++-------------------- ush/hpss_global_archive.py | 83 ------- ush/hpss_global_archive_driver.sh | 12 - 5 files changed, 186 insertions(+), 401 deletions(-) delete mode 100644 ush/hpss_global_archive.py delete mode 100755 ush/hpss_global_archive_driver.sh diff --git a/jobs/rocoto/vrfy.sh b/jobs/rocoto/vrfy.sh index 50750a94ecc..eb76309744d 100755 --- a/jobs/rocoto/vrfy.sh +++ b/jobs/rocoto/vrfy.sh @@ -90,6 +90,7 @@ fi ############################################################### echo echo "=============== START TO RUN FIT2OBS VERIFICATION ===============" +VRFYFITS=NO if [ $VRFYFITS = "YES" -a $CDUMP = $CDFNL -a $CDATE != $SDATE ]; then export CDUMPFCST=$VDUMP diff --git a/scripts/exgdas_enkf_earc.sh b/scripts/exgdas_enkf_earc.sh index d1dbfe0dfd6..abe3dab3e15 100755 --- a/scripts/exgdas_enkf_earc.sh +++ b/scripts/exgdas_enkf_earc.sh @@ -1,30 +1,25 @@ #! /usr/bin/env bash -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: exgdas_enkf_earc.sh -# Script description: Run ENKFGDAS EMC archive -# -# Author: Lin Gan Org: NCEP/EMC Date: 2022-11-04 -# -# Abstract: This script configure archive and rapid submit thread of archive jobs -# -# Required module: prod_util, python -# -#### -################################################################################ - source "$HOMEgfs/ush/preamble.sh" -# Directories. -pwd=$(pwd) +############################################################### +## Abstract: +## Ensemble archive driver script +## RUN_ENVIR : runtime environment (emc | nco) +## HOMEgfs : /full/path/to/workflow +## EXPDIR : /full/path/to/config/files +## CDATE : current analysis date (YYYYMMDDHH) +## PDY : current date (YYYYMMDD) +## cyc : current cycle (HH) +## CDUMP : cycle name (gdas / gfs) +## ENSGRP : ensemble sub-group to archive (0, 1, 2, ...) +############################################################### -export QUEUE_ARCH=${QUEUE_ARCH:-${QUEUE_SERVICE}} export ARCH_LIST=${ARCH_LIST:-$ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/earc$ENSGRP} [[ -d $ARCH_LIST ]] && rm -rf $ARCH_LIST mkdir -p $ARCH_LIST cd $ARCH_LIST + $HOMEgfs/ush/hpssarch_gen.sh enkf${CDUMP} status=$? if [ $status -ne 0 ]; then @@ -34,17 +29,25 @@ fi cd $ROTDIR -############################################## +source "${HOMEgfs}/ush/file_utils.sh" + +################################################################### # ENSGRP > 0 archives a group of ensemble members -############################################## firstday=$($NDATE +24 $SDATE) -if [[ $ENSGRP -gt 0 ]] && [[ $HPSSARCH = "YES" ]]; then +if (( 10#${ENSGRP} > 0 )) && [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; then + +#--set the archiving command and create local directories, if necessary + TARCMD="htar" + if [[ $LOCALARCH = "YES" ]]; then + TARCMD="tar" + [ ! -d $ATARDIR/$CDATE ] && mkdir -p $ATARDIR/$CDATE + fi #--determine when to save ICs for warm start SAVEWARMICA="NO" SAVEWARMICB="NO" - mm=`echo $CDATE|cut -c 5-6` - dd=`echo $CDATE|cut -c 7-8` + mm=$(echo $CDATE|cut -c 5-6) + dd=$(echo $CDATE|cut -c 7-8) nday=$(( (mm-1)*30+dd )) mod=$(($nday % $ARCH_WARMICFREQ)) if [ $CDATE -eq $firstday -a $cyc -eq $EARCINC_CYC ]; then SAVEWARMICA="YES" ; fi @@ -62,33 +65,27 @@ if [[ $ENSGRP -gt 0 ]] && [[ $HPSSARCH = "YES" ]]; then if [ $CDATE -gt $SDATE ]; then # Don't run for first half cycle - export TRANSFER_TARGET_FILE=enkf${CDUMP}_grp${n} - export TRANSFER_TARGET_FILE_2D=enkf${CDUMP}_grp${ENSGRP} - $HOMEgfs/ush/hpss_global_archive_driver.sh + $TARCMD -P -cvf $ATARDIR/$CDATE/enkf${CDUMP}_grp${ENSGRP}.tar $(cat $ARCH_LIST/enkf${CDUMP}_grp${n}.txt) status=$? if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "OFFLINE TAR $CDATE enkf${CDUMP}_grp${ENSGRP}.tar failed" + echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE enkf${CDUMP}_grp${ENSGRP}.tar failed" exit $status fi if [ $SAVEWARMICA = "YES" -a $cyc -eq $EARCINC_CYC ]; then - export TRANSFER_TARGET_FILE=enkf${CDUMP}_restarta_grp${n} - export TRANSFER_TARGET_FILE_2D=enkf${CDUMP}_restarta_grp${ENSGRP} - $HOMEgfs/ush/hpss_global_archive_driver.sh + $TARCMD -P -cvf $ATARDIR/$CDATE/enkf${CDUMP}_restarta_grp${ENSGRP}.tar $(cat $ARCH_LIST/enkf${CDUMP}_restarta_grp${n}.txt) status=$? if [ $status -ne 0 ]; then - echo "OFFLINE TAR $CDATE enkf${CDUMP}_restarta_grp${ENSGRP}.tar failed" + echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE enkf${CDUMP}_restarta_grp${ENSGRP}.tar failed" exit $status fi fi if [ $SAVEWARMICB = "YES" -a $cyc -eq $EARCICS_CYC ]; then - export TRANSFER_TARGET_FILE=enkf${CDUMP}_restartb_grp${n} - export TRANSFER_TARGET_FILE_2D=enkf${CDUMP}_restartb_grp${ENSGRP} - $HOMEgfs/ush/hpss_global_archive_driver.sh + $TARCMD -P -cvf $ATARDIR/$CDATE/enkf${CDUMP}_restartb_grp${ENSGRP}.tar $(cat $ARCH_LIST/enkf${CDUMP}_restartb_grp${n}.txt) status=$? if [ $status -ne 0 ]; then - echo "OFFLINE TAR $CDATE enkf${CDUMP}_restartb_grp${ENSGRP}.tar failed" + echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE enkf${CDUMP}_restartb_grp${ENSGRP}.tar failed" exit $status fi fi @@ -100,39 +97,49 @@ fi ################################################################### # ENSGRP 0 archives ensemble means and copy data to online archive -################################################################### if [ $ENSGRP -eq 0 ]; then - if [ $HPSSARCH = "YES" ]; then - export TRANSFER_TARGET_FILE=enkf${CDUMP} - $HOMEgfs/ush/hpss_global_archive_driver.sh + if [[ $HPSSARCH = "YES" || $LOCALARCH = "YES" ]]; then + +#--set the archiving command and create local directories, if necessary + TARCMD="htar" + if [[ $LOCALARCH = "YES" ]]; then + TARCMD="tar" + [ ! -d $ATARDIR/$CDATE ] && mkdir -p $ATARDIR/$CDATE + fi + + set +e + $TARCMD -P -cvf $ATARDIR/$CDATE/enkf${CDUMP}.tar $(cat $ARCH_LIST/enkf${CDUMP}.txt) status=$? if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "OFFLINE TAR $CDATE enkf${CDUMP}.tar failed" + echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE enkf${CDUMP}.tar failed" exit $status fi + set_strict fi #-- Archive online for verification and diagnostics [[ ! -d $ARCDIR ]] && mkdir -p $ARCDIR cd $ARCDIR - if [[ ! $SDATE = $CDATE ]]; then - $NCP $ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.enkfstat enkfstat.${CDUMP}.$CDATE - $NCP $ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.${CDUMP}.${CDATE}.ensmean - fi + nb_copy $ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.enkfstat enkfstat.${CDUMP}.$CDATE + nb_copy $ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.${CDUMP}.${CDATE}.ensmean if [ $CDUMP_ENKF != "GDAS" ]; then - $NCP $ROTDIR/enkfgfs.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.enkfstat enkfstat.gfs.$CDATE - $NCP $ROTDIR/enkfgfs.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.gfs.${CDATE}.ensmean - fi + nb_copy $ROTDIR/enkfgfs.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.enkfstat enkfstat.gfs.$CDATE + nb_copy $ROTDIR/enkfgfs.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.gfs.${CDATE}.ensmean + fi fi -############################################################## -# ENSGRP 0 also does clean-up + +if [[ "${DELETE_COM_IN_ARCHIVE_JOB:-YES}" == NO ]] ; then + exit 0 +fi + ############################################################### -if [ $ENSGRP -eq 0 -a $DELETE_COM_IN_ARCHIVE_JOB = "YES" -a $ROCOTO_WORKFLOW = "YES" ]; then +# ENSGRP 0 also does clean-up +if [ $ENSGRP -eq 0 ]; then # Start start and end dates to remove GDATEEND=$($NDATE -${RMOLDEND_ENKF:-24} $CDATE) @@ -149,18 +156,11 @@ if [ $ENSGRP -eq 0 -a $DELETE_COM_IN_ARCHIVE_JOB = "YES" -a $ROCOTO_WORKFLOW = " if [ -d $COMIN_ENS ]; then rocotolog="$EXPDIR/logs/${GDATE}.log" if [ -f $rocotolog ]; then + set +e testend=$(tail -n 1 $rocotolog | grep "This cycle is complete: Success") - cycle_completed=$? - cycle_clean_up=0 - if [ $HPSSARCH = "YES" ]; then - cd ${ROTDIR}/logs/${GDATE} - hpss_archive_files=`grep "Output sent to" *arc*.log|grep ${CDUMP}earc|awk '{print $4}'` - for file in $hpss_archive_files; do - hst=`grep "HTAR: HTAR SUCCESSFUL" $file|wc -l` - [[ $hst -eq 0 ]] && cycle_clean_up=1 - done - fi - if [ $cycle_completed -eq 0 -a $cycle_clean_up -eq 0 ]; then + rc=$? + set_strict + if [ $rc -eq 0 ]; then # Retain f006.ens files. Remove everything else for file in $(ls $COMIN_ENS | grep -v f006.ens); do rm -rf $COMIN_ENS/$file @@ -198,13 +198,5 @@ done ############################################################### -echo "ENDED NORMALLY." - -########################################## -# Remove the Temporary working directory -########################################## -cd $DATAROOT -[[ $KEEPDATA = "NO" ]] && rm -rf $DATA -date exit 0 diff --git a/scripts/exglobal_archive.sh b/scripts/exglobal_archive.sh index 657139d6bca..d3343ffab66 100755 --- a/scripts/exglobal_archive.sh +++ b/scripts/exglobal_archive.sh @@ -1,51 +1,38 @@ #! /usr/bin/env bash -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: exglobal_archive.sh -# Script description: Run GDAS/GFS EMC archive -# -# Author: Lin Gan Org: NCEP/EMC Date: 2022-10-24 -# -# Abstract: This script configure archive and rapid submit thread of archive jobs -# -# Required module: prod_util, python -# -#### -################################################################################ - source "$HOMEgfs/ush/preamble.sh" -# Directories. -pwd=$(pwd) -COMIN_OBS=${COMIN_OBS:-$(compath.py prod/obsproc/${obsproc_ver})/$RUN.$PDY/$cyc/atmos} -COMIN=${COMINatmos:-"$ROTDIR/$CDUMP.$PDY/$cyc/atmos"} -cd $COMIN - -# Utilities -export NCP=${NCP:-"/bin/cp -p"} -export NMV=${NMV:-"/bin/mv"} -export NLN=${NLN:-"/bin/ln -sf"} - -# Initial exception handling -err=0 -# errs=0 +############################################################### +## Abstract: +## Archive driver script +## RUN_ENVIR : runtime environment (emc | nco) +## HOMEgfs : /full/path/to/workflow +## EXPDIR : /full/path/to/config/files +## CDATE : current analysis date (YYYYMMDDHH) +## CDUMP : cycle name (gdas / gfs) +## PDY : current date (YYYYMMDD) +## cyc : current cycle (HH) +############################################################### +# Realtime parallels run GFS MOS on 1 day delay +# If realtime parallel, back up CDATE_MOS one day +CDATE_MOS=$CDATE +if [ $REALTIME = "YES" ]; then + CDATE_MOS=$($NDATE -24 $CDATE) +fi +PDY_MOS=$(echo $CDATE_MOS | cut -c1-8) ############################################################### -# Perform on-line archiving +# Archive online for verification and diagnostics ############################################################### +COMIN=${COMINatmos:-"$ROTDIR/$CDUMP.$PDY/$cyc/atmos"} +cd $COMIN -[[ ! -d $ARCDIR ]] && mkdir -p $ARCDIR +source "${HOMEgfs}/ush/file_utils.sh" -# This file is not available in first half cycle -if [[ ! $SDATE = $CDATE ]]; then - $NCP ${APREFIX}gsistat $ARCDIR/gsistat.${CDUMP}.${CDATE} - # ((errs + $?)) - $NCP ${APREFIX}pgrb2.1p00.anl $ARCDIR/pgbanl.${CDUMP}.${CDATE}.grib2 - # ((errs + $?)) -fi +[[ ! -d $ARCDIR ]] && mkdir -p $ARCDIR +nb_copy ${APREFIX}gsistat $ARCDIR/gsistat.${CDUMP}.${CDATE} +nb_copy ${APREFIX}pgrb2.1p00.anl $ARCDIR/pgbanl.${CDUMP}.${CDATE}.grib2 # Archive 1 degree forecast GRIB2 files for verification if [ $CDUMP = "gfs" ]; then @@ -54,44 +41,43 @@ if [ $CDUMP = "gfs" ]; then while [ $fhr -le $fhmax ]; do fhr2=$(printf %02i $fhr) fhr3=$(printf %03i $fhr) - $NCP ${APREFIX}pgrb2.1p00.f$fhr3 $ARCDIR/pgbf${fhr2}.${CDUMP}.${CDATE}.grib2 -# ((errs + $?)) - (( fhr = $fhr + $FHOUT_GFS )) + nb_copy ${APREFIX}pgrb2.1p00.f$fhr3 $ARCDIR/pgbf${fhr2}.${CDUMP}.${CDATE}.grib2 + fhr=$((10#$fhr + 10#$FHOUT_GFS )) done fi if [ $CDUMP = "gdas" ]; then flist="000 003 006 009" for fhr in $flist; do fname=${APREFIX}pgrb2.1p00.f${fhr} -# fhr2=$(printf %02i $fhr) $(printf %02i $((10#$a))) fhr2=$(printf %02i $((10#$fhr))) - $NCP $fname $ARCDIR/pgbf${fhr2}.${CDUMP}.${CDATE}.grib2 -# ((errs + $?)) + nb_copy $fname $ARCDIR/pgbf${fhr2}.${CDUMP}.${CDATE}.grib2 done fi if [ -s avno.t${cyc}z.cyclone.trackatcfunix ]; then - PLSOT4=`echo $PSLOT|cut -c 1-4 |tr '[a-z]' '[A-Z]'` + PLSOT4=$(echo $PSLOT|cut -c 1-4 |tr '[a-z]' '[A-Z]') cat avno.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunix.${CDUMP}.$CDATE cat avnop.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunixp.${CDUMP}.$CDATE fi if [ $CDUMP = "gdas" -a -s gdas.t${cyc}z.cyclone.trackatcfunix ]; then - PLSOT4=`echo $PSLOT|cut -c 1-4 |tr '[a-z]' '[A-Z]'` + PLSOT4=$(echo $PSLOT|cut -c 1-4 |tr '[a-z]' '[A-Z]') cat gdas.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunix.${CDUMP}.$CDATE cat gdasp.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunixp.${CDUMP}.$CDATE fi -if [ $CDUMP = "gfs" -a $DO_VRFY = "YES" ]; then - $NCP storms.gfso.atcf_gen.$CDATE ${ARCDIR}/. - $NCP storms.gfso.atcf_gen.altg.$CDATE ${ARCDIR}/. - $NCP trak.gfso.atcfunix.$CDATE ${ARCDIR}/. - $NCP trak.gfso.atcfunix.altg.$CDATE ${ARCDIR}/. +if [ $CDUMP = "gfs" ]; then + nb_copy storms.gfso.atcf_gen.$CDATE ${ARCDIR}/. + nb_copy storms.gfso.atcf_gen.altg.$CDATE ${ARCDIR}/. + nb_copy trak.gfso.atcfunix.$CDATE ${ARCDIR}/. + nb_copy trak.gfso.atcfunix.altg.$CDATE ${ARCDIR}/. mkdir -p ${ARCDIR}/tracker.$CDATE/$CDUMP blist="epac natl" for basin in $blist; do - cp -rp $basin ${ARCDIR}/tracker.$CDATE/$CDUMP + if [[ -f $basin ]]; then + cp -rp $basin ${ARCDIR}/tracker.$CDATE/$CDUMP + fi done fi @@ -107,25 +93,34 @@ if [ $CDUMP = "gfs" -a $FITSARC = "YES" ]; then fhr3=$(printf %03i $fhr) sfcfile=${prefix}.sfcf${fhr3}${ASUFFIX} sigfile=${prefix}.atmf${fhr3}${ASUFFIX} - $NCP $sfcfile $VFYARC/${CDUMP}.$PDY/$cyc/ - $NCP $sigfile $VFYARC/${CDUMP}.$PDY/$cyc/ - (( fhr = $fhr + 6 )) + nb_copy $sfcfile $VFYARC/${CDUMP}.$PDY/$cyc/ + nb_copy $sigfile $VFYARC/${CDUMP}.$PDY/$cyc/ + (( fhr = 10#$fhr + 6 )) done fi + ############################################################### -# Archive data to HPSS -if [ $HPSSARCH = "YES" ]; then +# Archive data either to HPSS or locally +if [[ $HPSSARCH = "YES" || $LOCALARCH = "YES" ]]; then ############################################################### -export QUEUE_ARCH=${QUEUE_ARCH:-${QUEUE_SERVICE}} + +# --set the archiving command and create local directories, if necessary +TARCMD="htar" +if [[ $LOCALARCH = "YES" ]]; then + TARCMD="tar" + [ ! -d $ATARDIR/$CDATE ] && mkdir -p $ATARDIR/$CDATE + [ ! -d $ATARDIR/$CDATE_MOS -a -d $ROTDIR/gfsmos.$PDY_MOS -a $cyc -eq 18 ] && mkdir -p $ATARDIR/$CDATE_MOS +fi + #--determine when to save ICs for warm start and forecast-only runs SAVEWARMICA="NO" SAVEWARMICB="NO" SAVEFCSTIC="NO" firstday=$($NDATE +24 $SDATE) -mm=`echo $CDATE|cut -c 5-6` -dd=`echo $CDATE|cut -c 7-8` -nday=$(( (mm-1)*30+dd )) +mm=$(echo $CDATE|cut -c 5-6) +dd=$(echo $CDATE|cut -c 7-8) +nday=$(( (10#$mm-1)*30+10#$dd )) mod=$(($nday % $ARCH_WARMICFREQ)) if [ $CDATE -eq $firstday -a $cyc -eq $ARCHINC_CYC ]; then SAVEWARMICA="YES" ; fi if [ $CDATE -eq $firstday -a $cyc -eq $ARCHICS_CYC ]; then SAVEWARMICB="YES" ; fi @@ -144,223 +139,122 @@ mod=$(($nday % $ARCH_FCSTICFREQ)) if [ $mod -eq 0 -o $CDATE -eq $firstday ]; then SAVEFCSTIC="YES" ; fi -export ARCH_LIST="$COMIN/archlist" +ARCH_LIST="$COMIN/archlist" [[ -d $ARCH_LIST ]] && rm -rf $ARCH_LIST mkdir -p $ARCH_LIST cd $ARCH_LIST $HOMEgfs/ush/hpssarch_gen.sh $CDUMP -err=$? -if [ $err -ne 0 ]; then +status=$? +if [ $status -ne 0 ]; then echo "$HOMEgfs/ush/hpssarch_gen.sh $CDUMP failed, ABORT!" - err_chk + exit $status fi cd $ROTDIR if [ $CDUMP = "gfs" ]; then - #Common gfsa gfsb - NOTE - do not check htar error status - # Some files not found can be acceptable - for targrp in gfsa gfsb; do - export TRANSFER_TARGET_FILE=$targrp - $HOMEgfs/ush/hpss_global_archive_driver.sh - done + targrp_list="gfsa gfsb" if [ ${ARCH_GAUSSIAN:-"NO"} = "YES" ]; then - # Both cycled and fcst only - for targrp in gfs_flux gfs_${format}b gfs_pgrb2b; do - export TRANSFER_TARGET_FILE=$targrp - $HOMEgfs/ush/hpss_global_archive_driver.sh - err=$? - if [ $err -ne 0 -a $CDATE -ge $firstday ]; then - echo "Fail to create $CDATE ${targrp}.tar" - err_chk - fi - done - # Only cycled + targrp_list="$targrp_list gfs_flux gfs_${format}b gfs_pgrb2b" if [ $MODE = "cycled" ]; then - targrp="$targrp_list gfs_${format}a" - export TRANSFER_TARGET_FILE=$targrp - $HOMEgfs/ush/hpss_global_archive_driver.sh - err=$? - if [ $err -ne 0 -a $CDATE -ge $firstday ]; then - echo "Fail to create $CDATE ${targrp}.tar" - err_chk - fi + targrp_list="$targrp_list gfs_${format}a" fi fi - # gfs wave if [ $DO_WAVE = "YES" -a "$WAVE_CDUMP" != "gdas" ]; then - for targrp in gfswave; do - export TRANSFER_TARGET_FILE=$targrp - $HOMEgfs/ush/hpss_global_archive_driver.sh - err=$? - if [ $err -ne 0 -a $CDATE -ge $firstday ]; then - echo "Fail to create $CDATE ${targrp}.tar" - err_chk - fi - done + targrp_list="$targrp_list gfswave" fi - # gfs ocean if [ $DO_OCN = "YES" ]; then - for targrp in ocn_ice_grib2_0p5 ocn_ice_grib2_0p25 ocn_2D ocn_3D ocn_xsect ocn_daily gfs_flux_1p00; do - export TRANSFER_TARGET_FILE=$targrp - $HOMEgfs/ush/hpss_global_archive_driver.sh - err=$? - if [ $err -ne 0 -a $CDATE -ge $firstday ]; then - echo "Fail to create $CDATE ${targrp}.tar" - err_chk - fi - done + targrp_list="$targrp_list ocn_ice_grib2_0p5 ocn_ice_grib2_0p25 ocn_2D ocn_3D ocn_xsect ocn_daily gfs_flux_1p00" fi - # gfs ice if [ $DO_ICE = "YES" ]; then - for targrp in ice; do - export TRANSFER_TARGET_FILE=$targrp - $HOMEgfs/ush/hpss_global_archive_driver.sh - err=$? - if [ $err -ne 0 -a $CDATE -ge $firstday ]; then - echo "Fail to create $CDATE ${targrp}.tar" - err_chk - fi - done + targrp_list="$targrp_list ice" fi - # gfs aerosol + # Aerosols if [ $DO_AERO = "YES" ]; then for targrp in chem; do - export TRANSFER_TARGET_FILE=$targrp - $HOMEgfs/ush/hpss_global_archive_driver.sh - err=$? - if [ $err -ne 0 -a $CDATE -ge $firstday ]; then - echo "Fail to create $CDATE ${targrp}.tar" - err_chk + $TARCMD -P -cvf $ATARDIR/$CDATE/${targrp}.tar $(cat $ARCH_LIST/${targrp}.txt) + status=$? + if [ $status -ne 0 -a $CDATE -ge $firstday ]; then + echo "HTAR $CDATE ${targrp}.tar failed" + exit $status fi done fi - # restarts + #for restarts if [ $SAVEFCSTIC = "YES" ]; then - export TRANSFER_TARGET_FILE=gfs_restarta - $HOMEgfs/ush/hpss_global_archive_driver.sh - err=$? - if [ $err -ne 0 -a $CDATE -ge $firstday ]; then - echo "Fail to create $CDATE gfs_restarta.tar" - err_chk - fi + targrp_list="$targrp_list gfs_restarta" fi - # downstream products + #for downstream products if [ $DO_BUFRSND = "YES" -o $WAFSF = "YES" ]; then - export TRANSFER_TARGET_FILE=gfs_downstream - $HOMEgfs/ush/hpss_global_archive_driver.sh - err=$? - if [ $err -ne 0 -a $CDATE -ge $firstday ]; then - echo "Fail to create $CDATE gfs_downstream.tar" - err_chk - fi + targrp_list="$targrp_list gfs_downstream" fi -fi - - -if [ $CDUMP = "gdas" ]; then - - #Common file - export TRANSFER_TARGET_FILE=gdas - $HOMEgfs/ush/hpss_global_archive_driver.sh - err=$? - if [ $err -ne 0 -a $CDATE -ge $firstday ]; then - echo "Fail to create $CDATE gdas.tar" - err_chk + #--save mdl gfsmos output from all cycles in the 18Z archive directory + if [ -d gfsmos.$PDY_MOS -a $cyc -eq 18 ]; then + set +e + $TARCMD -P -cvf $ATARDIR/$CDATE_MOS/gfsmos.tar ./gfsmos.$PDY_MOS + status=$? + if [ $status -ne 0 -a $CDATE -ge $firstday ]; then + echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE gfsmos.tar failed" + exit $status + fi + set_strict fi +elif [ $CDUMP = "gdas" ]; then + + targrp_list="gdas" - #gdas wave + #gdaswave if [ $DO_WAVE = "YES" ]; then - export TRANSFER_TARGET_FILE=gdaswave - $HOMEgfs/ush/hpss_global_archive_driver.sh - err=$? - if [ $err -ne 0 -a $CDATE -ge $firstday ]; then - echo "Fail to create $CDATE gdaswave.tar" - err_chk - fi + targrp_list="$targrp_list gdaswave" fi - # restart A if [ $SAVEWARMICA = "YES" -o $SAVEFCSTIC = "YES" ]; then - export TRANSFER_TARGET_FILE=gdas_restarta - $HOMEgfs/ush/hpss_global_archive_driver.sh - err=$? - if [ $err -ne 0 -a $CDATE -ge $firstday ]; then - echo "Fail to create $CDATE gdas_restarta.tar" - err_chk - fi + targrp_list="$targrp_list gdas_restarta" + if [ $DO_WAVE = "YES" ]; then - export TRANSFER_TARGET_FILE=gdaswave_restart - $HOMEgfs/ush/hpss_global_archive_driver.sh - err=$? - if [ $err -ne 0 -a $CDATE -ge $firstday ]; then - echo "Fail to create $CDATE gdaswave_restart.tar" - err_chk - fi + targrp_list="$targrp_list gdaswave_restart" fi fi - # restart B if [ $SAVEWARMICB = "YES" -o $SAVEFCSTIC = "YES" ]; then - export TRANSFER_TARGET_FILE=gdas_restartb - $HOMEgfs/ush/hpss_global_archive_driver.sh - err=$? - if [ $err -ne 0 -a $CDATE -ge $firstday ]; then - echo "Fail to create $CDATE gdas_restartb.tar" - err_chk - fi + targrp_list="$targrp_list gdas_restartb" fi - fi -############################################################### -# Rerun failed HPSS Archive jobs -############################################################### -if [ $machine = "WCOSS2" ]; then - mkdir -p ${DATA}/archive_rerun - cd $ROTDIR - find . -name "*_HPSS_ARCHIVE_*.sh" &> ${DATA}/archive_rerun/found_arch_sc_list.dat - find . -name "*_HPSS_ARCHIVE_*.out" &> ${DATA}/archive_rerun/found_arch_jobout_list.dat - current_running_archive_jobs_id_list=$(qstat -u lin.gan -s -xu lin.gan|grep " Q \| R "|grep "dev_tra"|awk '{print $1}') - for jid_arch in $current_running_archive_jobs_id_list; do - `qstat -f $jid_arch| grep "Job_Name"|awk '{print $3}' &>> ${DATA}/archive_rerun/current_running_archive_jobs_name.dat` - done - current_running_archive_jobs_name_list=$(uniq ${DATA}/archive_rerun/current_running_archive_jobs_name.dat) - found_arch_jobout_list=`cat ${DATA}/archive_rerun/found_arch_jobout_list.dat` - for file in $found_arch_jobout_list; do - stat=`grep "HTAR: HTAR SUCCESSFUL" ${ROTDIR}/${file}|wc -l` - if [ $stat -eq 0 ]; then - dir_name=$(echo $(dirname $file)) - cd ${ROTDIR}/${dir_name} - sc_name=$(echo $(echo $(basename $file))|sed 's/.out/.sh/') - jb_name=$(echo $sc_name | sed 's/.sh//') - q_exist=$(echo $current_running_archive_jobs_name_list |grep $jb_name| wc -l) - if [ $q_exist -eq 0 ]; then - echo "HPSS_ARCHIVE job $file did not complete - rerun in progress" - qsub < $sc_name - fi +# Turn on extended globbing options +shopt -s extglob +for targrp in $targrp_list; do + set +e + $TARCMD -P -cvf $ATARDIR/$CDATE/${targrp}.tar $(cat $ARCH_LIST/${targrp}.txt) + status=$? + if [ $status -ne 0 -a $CDATE -ge $firstday ]; then + echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE ${targrp}.tar failed" + exit $status fi - done -fi + set_strict +done +# Turn extended globbing back off +shopt -u extglob ############################################################### fi ##end of HPSS archive ############################################################### + + ############################################################### # Clean up previous cycles; various depths # PRIOR CYCLE: Leave the prior cycle alone -############################################################### GDATE=$($NDATE -$assim_freq $CDATE) # PREVIOUS to the PRIOR CYCLE @@ -372,19 +266,14 @@ gcyc=$(echo $GDATE | cut -c9-10) COMIN="$RUNDIR/$GDATE" [[ -d $COMIN ]] && rm -rf $COMIN -############################################################### -# Clean up COM -############################################################### -if [ $DELETE_COM_IN_ARCHIVE_JOB = "NO" -o $ROCOTO_WORKFLOW = "NO" ]; then +if [[ "${DELETE_COM_IN_ARCHIVE_JOB:-YES}" == NO ]] ; then exit 0 fi -############################################################### # Step back every assim_freq hours and remove old rotating directories # for successful cycles (defaults from 24h to 120h). If GLDAS is # active, retain files needed by GLDAS update. Independent of GLDAS, # retain files needed by Fit2Obs -############################################################### DO_GLDAS=${DO_GLDAS:-"NO"} GDATEEND=$($NDATE -${RMOLDEND:-24} $CDATE) GDATE=$($NDATE -${RMOLDSTD:-120} $CDATE) @@ -398,19 +287,12 @@ while [ $GDATE -le $GDATEEND ]; do COMINrtofs="$ROTDIR/rtofs.$gPDY" if [ -d $COMIN ]; then rocotolog="$EXPDIR/logs/${GDATE}.log" - if [ -f $rocotolog ]; then + if [ -f $rocotolog ]; then + set +e testend=$(tail -n 1 $rocotolog | grep "This cycle is complete: Success") - cycle_completed=$? - cycle_clean_up=0 - if [ $HPSSARCH = "YES" ]; then - cd ${ROTDIR}/logs/${GDATE} - hpss_archive_files=`grep "Output sent to" *arc*.log|grep ${CDUMP}arch|awk '{print $4}'` - for file in $hpss_archive_files; do - hst=`grep "HTAR: HTAR SUCCESSFUL" $file|wc -l` - [[ $hst -eq 0 ]] && cycle_clean_up=1 - done - fi - if [ $cycle_completed -eq 0 -a $cycle_clean_up -eq 0 ]; then + rc=$? + set_strict + if [ $rc -eq 0 ]; then if [ -d $COMINwave ]; then rm -rf $COMINwave ; fi if [ -d $COMINrtofs -a $GDATE -lt $RTOFS_DATE ]; then rm -rf $COMINrtofs ; fi if [ $CDUMP != "gdas" -o $DO_GLDAS = "NO" -o $GDATE -lt $GLDAS_DATE ]; then @@ -448,6 +330,12 @@ while [ $GDATE -le $GDATEEND ]; do [[ ! "$(ls -A $COMINwave)" ]] && rm -rf $COMINwave fi + # Remove mdl gfsmos directory + if [ $CDUMP = "gfs" ]; then + COMIN="$ROTDIR/gfsmos.$gPDY" + if [ -d $COMIN -a $GDATE -lt $CDATE_MOS ]; then rm -rf $COMIN ; fi + fi + GDATE=$($NDATE +$assim_freq $GDATE) done @@ -484,9 +372,8 @@ rPDY=$(echo $RDATE | cut -c1-8) COMIN="$ROTDIR/$CDUMP.$rPDY" [[ -d $COMIN ]] && rm -rf $COMIN -############################################################### -echo "ENDED NORMALLY." +############################################################### -########################################## +exit 0 diff --git a/ush/hpss_global_archive.py b/ush/hpss_global_archive.py deleted file mode 100644 index 1393d4ecef5..00000000000 --- a/ush/hpss_global_archive.py +++ /dev/null @@ -1,83 +0,0 @@ -''' -Program Name: hpss_global_archive.py -Developer: Lin Gan -Description: This python script dynamically create a transfer job, submit, and upload file to hpss -Input Environment Variable: - machine - Currently support WCOSS2 - NET - parallel env - RUN - parallel env - HOMEgfs - parallel env - EXPDIR - parallel env - QUEUE - parallel env - ACCOUNT - parallel env - nproc - wcoss2 default -''' - -import os - -print("BEGIN: "+os.path.basename(__file__)) - -# Read in environment variables -machine = os.environ['machine'] -NET = os.environ['NET'] -RUN = os.environ['RUN'] -JOB_LOG_DIR = os.environ['JOB_LOG_DIR'] -QUEUE_ARCH = os.environ['QUEUE_ARCH'] -ACCOUNT = os.environ['ACCOUNT'] -ARCH_LIST = os.environ['ARCH_LIST'] -SOURCE_DIR = os.environ['SOURCE_DIR'] -HPSS_TARGET_DIR = os.environ['HPSS_TARGET_DIR'] -TRANSFER_TARGET_FILE = os.environ['TRANSFER_TARGET_FILE'] -PDY = os.environ['PDY'] -CYC = os.environ['cyc'] - -# Create job card directory and file name -if not 'TRANSFER_TARGET_FILE_2D' in os.environ: - TRANSFER_TARGET_FILE_2D = TRANSFER_TARGET_FILE -else: - TRANSFER_TARGET_FILE_2D = os.environ['TRANSFER_TARGET_FILE_2D'] -if not os.path.exists(JOB_LOG_DIR): - os.makedirs(JOB_LOG_DIR) -job_name = RUN+'_HPSS_ARCHIVE_'+TRANSFER_TARGET_FILE+'_'+PDY+CYC -job_card_filename = os.path.join(JOB_LOG_DIR,job_name+'.sh') -job_output_filename = os.path.join(JOB_LOG_DIR,job_name+'.out') -if os.path.exists(job_output_filename): - os.remove(job_output_filename) - -# Create job card -print("Writing job card to "+job_card_filename) -with open(job_card_filename, 'w') as job_card: - if machine == 'WCOSS2': - job_card.write('#!/bin/bash \n') - job_card.write('#PBS -q '+QUEUE_ARCH+'\n') - job_card.write('#PBS -A '+ACCOUNT+'\n') - job_card.write('#PBS -N '+job_name+'\n') - job_card.write('#PBS -o '+job_output_filename+'\n') - job_card.write('#PBS -e '+job_output_filename+'\n') - job_card.write('#PBS -l walltime=00:40:00\n') - job_card.write('#PBS -l debug=true\n') - job_card.write('#PBS -l place=vscatter,select=1:ncpus=1:mem=1GB') - job_card.write('\n') - job_card.write('set +x \n') - job_card.write('source /usr/share/lmod/lmod/init/bash \n') - job_card.write('module reset \n') - job_card.write('set -x \n') - job_card.write('module list \n') - job_card.write('\n') - job_card.write('#### '+HPSS_TARGET_DIR+'/'+TRANSFER_TARGET_FILE_2D+'.tar '+ARCH_LIST+'/'+TRANSFER_TARGET_FILE+'.txt' ' \n') - job_card.write('cd '+SOURCE_DIR+'\n') - job_card.write('\n') - job_card.write('htar -P -cvf '+HPSS_TARGET_DIR+'/'+TRANSFER_TARGET_FILE_2D+'.tar `cat '+ARCH_LIST+'/'+TRANSFER_TARGET_FILE+'.txt`') - job_card.write('\n') - job_card.write('status=$? \n') - job_card.write('if [ $status -ne 0 ]; then \n') - job_card.write(' exit $status \n') - job_card.write('fi \n') - -# Submit job card -print("Submitting "+job_card_filename+" to "+QUEUE_ARCH) -print("Output sent to "+job_output_filename) -if machine == 'WCOSS2': - os.system('qsub '+job_card_filename) - -print("END: "+os.path.basename(__file__)) diff --git a/ush/hpss_global_archive_driver.sh b/ush/hpss_global_archive_driver.sh deleted file mode 100755 index d7a7595f0b3..00000000000 --- a/ush/hpss_global_archive_driver.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -set -x - -pslot=${PSLOT:-""} -export JOB_LOG_DIR=${ARCH_LIST:-""} -export SOURCE_DIR=${ROTDIR:-""} -export ARCH_LIST=${ARCH_LIST:-""} -export HPSS_TARGET_DIR=${ATARDIR:-""} - -echo "Dynamically create an archive job to archive files in $TRANSFER_TARGET_FILE" - -python $HOMEgfs/ush/hpss_global_archive.py From 99305209a51385643e36aad0ce4323064a7002b0 Mon Sep 17 00:00:00 2001 From: "Lin.Gan" Date: Thu, 10 Nov 2022 15:05:56 +0000 Subject: [PATCH 10/21] Revert local change on vrfy script --- jobs/rocoto/vrfy.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/jobs/rocoto/vrfy.sh b/jobs/rocoto/vrfy.sh index eb76309744d..50750a94ecc 100755 --- a/jobs/rocoto/vrfy.sh +++ b/jobs/rocoto/vrfy.sh @@ -90,7 +90,6 @@ fi ############################################################### echo echo "=============== START TO RUN FIT2OBS VERIFICATION ===============" -VRFYFITS=NO if [ $VRFYFITS = "YES" -a $CDUMP = $CDFNL -a $CDATE != $SDATE ]; then export CDUMPFCST=$VDUMP From 8c045ce6e31372a3a99b653e9020afe9963a0fb7 Mon Sep 17 00:00:00 2001 From: "Lin.Gan" Date: Thu, 10 Nov 2022 15:09:09 +0000 Subject: [PATCH 11/21] Revert local fix to build issue --- sorc/gfs_build.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/sorc/gfs_build.cfg b/sorc/gfs_build.cfg index cd7bc22167f..c56db1f71fe 100644 --- a/sorc/gfs_build.cfg +++ b/sorc/gfs_build.cfg @@ -12,7 +12,6 @@ Building ufs_utils (ufs_utils) ........................ yes Building gfs_wafs (gfs_wafs) .......................... yes Building gfs_utils (gfs_utils) ........................ yes - Building reg2grb2 (reg2grb2) .......................... no # -- END -- From ed8bd671580da15b30aba91a01712ece25f905ad Mon Sep 17 00:00:00 2001 From: "Lin.Gan" Date: Thu, 10 Nov 2022 19:11:33 +0000 Subject: [PATCH 12/21] JENKFGDAS_ARCHIVE apply filter --- jobs/JENKFGDAS_ARCHIVE | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/jobs/JENKFGDAS_ARCHIVE b/jobs/JENKFGDAS_ARCHIVE index 87dafe5cfac..cf17a3e8d4a 100755 --- a/jobs/JENKFGDAS_ARCHIVE +++ b/jobs/JENKFGDAS_ARCHIVE @@ -5,21 +5,21 @@ source "$HOMEgfs/ush/preamble.sh" ############################# # Source relevant config files ############################# -export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} +export EXPDIR=${EXPDIR:-${HOMEgfs}/parm/config} configs="base earc" -config_path=${EXPDIR:-$NWROOT/gfs.${gfs_ver}/parm/config} -for config in $configs; do - . $config_path/config.$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 + [[ ${status} -ne 0 ]] && exit ${status} done ########################################## # Source machine runtime environment ########################################## -. $HOMEgfs/env/${machine}.env earc +. ${HOMEgfs}/env/${machine}.env earc status=$? -[[ $status -ne 0 ]] && exit $status +[[ ${status} -ne 0 ]] && exit $status ############################################## # Obtain unique process id (pid) and make temp directory @@ -58,16 +58,16 @@ export n=$((ENSGRP)) ############################################## # ICS are restarts and always lag INC by $assim_freq hours. -export EARCINC_CYC=$ARCH_CYC +export EARCINC_CYC=${ARCH_CYC} export EARCICS_CYC=$((ARCH_CYC-assim_freq)) -if [ $EARCICS_CYC -lt 0 ]; then +if [ ${EARCICS_CYC} -lt 0 ]; then export EARCICS_CYC=$((EARCICS_CYC+24)) fi # EnKF update in GFS, GDAS or both export CDUMP_ENKF=$(echo ${EUPD_CYC:-"gdas"} | tr a-z A-Z) -export ARCH_LIST="$ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/earc$ENSGRP" +export ARCH_LIST="${ROTDIR}/enkf${CDUMP}.${PDY}/${cyc}/${COMPONENT}/earc${ENSGRP}" ############################################################### # Run archive script @@ -85,7 +85,7 @@ echo "ENDED NORMALLY." # Remove the Temporary working directory ########################################## cd $DATAROOT -[[ $KEEPDATA = "NO" ]] && rm -rf $DATA +[[ ${KEEPDATA} = "NO" ]] && rm -rf $DATA date exit 0 From 9715c7821d613274df4a6c25b93f45e6ddcb74e9 Mon Sep 17 00:00:00 2001 From: "Lin.Gan" Date: Mon, 14 Nov 2022 16:25:06 +0000 Subject: [PATCH 13/21] Rearrange some script statement between jjob and ex-script --- jobs/JENKFGDAS_ARCHIVE | 25 +++-------- jobs/JGLOBAL_ARCHIVE | 41 +++++++---------- scripts/exgdas_enkf_earc.sh | 88 ++++++++++++++++++------------------- scripts/exglobal_archive.sh | 20 +++++++++ 4 files changed, 87 insertions(+), 87 deletions(-) diff --git a/jobs/JENKFGDAS_ARCHIVE b/jobs/JENKFGDAS_ARCHIVE index cf17a3e8d4a..72afa94cb93 100755 --- a/jobs/JENKFGDAS_ARCHIVE +++ b/jobs/JENKFGDAS_ARCHIVE @@ -7,7 +7,7 @@ source "$HOMEgfs/ush/preamble.sh" ############################# export EXPDIR=${EXPDIR:-${HOMEgfs}/parm/config} configs="base earc" -config_path=${EXPDIR:-${NWROOT}/gfs.${gfs_ver}/parm/config} +config_path=${EXPDIR:-${PACKAGEROOT}/gfs.${gfs_ver}/parm/config} for config in ${configs}; do . ${config_path}/config.${config} status=$? @@ -26,8 +26,8 @@ status=$? ############################################## export pid=${pid:-$$} export DATA=${DATA:-${DATAROOT}/${jobid:?}} -mkdir -p $DATA -cd $DATA +mkdir -p ${DATA} +cd ${DATA} ############################################## @@ -49,31 +49,18 @@ export pgmerr=errfile # Set variables used in the script ############################################## export CDATE=${CDATE:-${PDY}${cyc}} -export CDUMP=${CDUMP:-${RUN:-"gfs"}} +export CDUMP=${CDUMP:-${RUN:-"gdas"}} export COMPONENT=${COMPONENT:-atmos} -export n=$((ENSGRP)) - -############################################## -# Begin JOB SPECIFIC work -############################################## - -# ICS are restarts and always lag INC by $assim_freq hours. -export EARCINC_CYC=${ARCH_CYC} -export EARCICS_CYC=$((ARCH_CYC-assim_freq)) -if [ ${EARCICS_CYC} -lt 0 ]; then - export EARCICS_CYC=$((EARCICS_CYC+24)) -fi # EnKF update in GFS, GDAS or both export CDUMP_ENKF=$(echo ${EUPD_CYC:-"gdas"} | tr a-z A-Z) - export ARCH_LIST="${ROTDIR}/enkf${CDUMP}.${PDY}/${cyc}/${COMPONENT}/earc${ENSGRP}" ############################################################### # Run archive script ############################################################### -$SCRgfs/exgdas_enkf_earc.sh +${SCRgfs}/exgdas_enkf_earc.sh status=$? [[ $status -ne 0 ]] && exit $status @@ -84,7 +71,7 @@ echo "ENDED NORMALLY." ########################################## # Remove the Temporary working directory ########################################## -cd $DATAROOT +cd ${DATAROOT} [[ ${KEEPDATA} = "NO" ]] && rm -rf $DATA date diff --git a/jobs/JGLOBAL_ARCHIVE b/jobs/JGLOBAL_ARCHIVE index 3d292d5e39f..966225269a4 100755 --- a/jobs/JGLOBAL_ARCHIVE +++ b/jobs/JGLOBAL_ARCHIVE @@ -1,42 +1,35 @@ #! /usr/bin/env bash -source "$HOMEgfs/ush/preamble.sh" +source "${HOMEgfs}/ush/preamble.sh" export RUN_ENVIR=${RUN_ENVIR:-"nco"} ############################################# # Source relevant config files ############################################# -export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} +export EXPDIR=${EXPDIR:-${HOMEgfs}/parm/config} configs="base arch" -config_path=${EXPDIR:-$NWROOT/gfs.${gfs_ver}/parm/config} +config_path=${EXPDIR:-${PACKAGEROOT}/gfs.${gfs_ver}/parm/config} for config in $configs; do - . $config_path/config.$config + . ${config_path}/config.${config} status=$? - [[ $status -ne 0 ]] && exit $status + [[ ${status} -ne 0 ]] && exit $status done ########################################## # Source machine runtime environment ########################################## -. $HOMEgfs/env/${machine}.env arch +. ${HOMEgfs}/env/${machine}.env arch status=$? -[[ $status -ne 0 ]] && exit $status - -############################################# -# Source workflow level common utilities -############################################# -#### This utility is under development as of 20221020 -#### will not use it at this time -#### source "${HOMEgfs}/ush/file_utils.sh" +[[ ${status} -ne 0 ]] && exit $status ############################################## # Obtain unique process id (pid) and make temp directory ############################################## export pid=${pid:-$$} export DATA=${DATA:-${DATAROOT}/${jobid:?}} -mkdir -p $DATA -cd $DATA +mkdir -p ${DATA} +cd ${DATA} ############################################## @@ -67,17 +60,17 @@ export COMPONENT=${COMPONENT:-atmos} ############################################## # ICS are restarts and always lag INC by $assim_freq hours -export ARCHINC_CYC=$ARCH_CYC +export ARCHINC_CYC=${ARCH_CYC} export ARCHICS_CYC=$((ARCH_CYC-assim_freq)) -if [ $ARCHICS_CYC -lt 0 ]; then +if [ ${ARCHICS_CYC} -lt 0 ]; then ARCHICS_CYC=$((ARCHICS_CYC+24)) fi # CURRENT CYCLE export APREFIX="${CDUMP}.t${cyc}z." -export ASUFFIX=${ASUFFIX:-$SUFFIX} +export ASUFFIX=${ASUFFIX:-${SUFFIX}} -if [ $ASUFFIX = ".nc" ]; then +if [ ${ASUFFIX} = ".nc" ]; then format="netcdf" else format="nemsio" @@ -87,9 +80,9 @@ fi # Run archive script ############################################################### -${GLOBALARCHIVESH:-$SCRgfs/exglobal_archive.sh} +${GLOBALARCHIVESH:-${SCRgfs}/exglobal_archive.sh} status=$? -[[ $status -ne 0 ]] && exit $status +[[ ${status} -ne 0 ]] && exit $status ############################################################### @@ -98,8 +91,8 @@ echo "ENDED NORMALLY." ########################################## # Remove the Temporary working directory ########################################## -cd $DATAROOT -[[ $KEEPDATA = "NO" ]] && rm -rf $DATA +cd ${DATAROOT} +[[ ${KEEPDATA} = "NO" ]] && rm -rf $DATA date exit 0 diff --git a/scripts/exgdas_enkf_earc.sh b/scripts/exgdas_enkf_earc.sh index abe3dab3e15..80033b2a3c5 100755 --- a/scripts/exgdas_enkf_earc.sh +++ b/scripts/exgdas_enkf_earc.sh @@ -1,33 +1,33 @@ #! /usr/bin/env bash -source "$HOMEgfs/ush/preamble.sh" - -############################################################### -## Abstract: -## Ensemble archive driver script -## RUN_ENVIR : runtime environment (emc | nco) -## HOMEgfs : /full/path/to/workflow -## EXPDIR : /full/path/to/config/files -## CDATE : current analysis date (YYYYMMDDHH) -## PDY : current date (YYYYMMDD) -## cyc : current cycle (HH) -## CDUMP : cycle name (gdas / gfs) -## ENSGRP : ensemble sub-group to archive (0, 1, 2, ...) -############################################################### +source "${HOMEgfs}/ush/preamble.sh" + +############################################## +# Begin JOB SPECIFIC work +############################################## +export n=$((10#${ENSGRP})) +export CDUMP_ENKF=$(echo ${EUPD_CYC:-"gdas"} | tr a-z A-Z) +export ARCH_LIST="${ROTDIR}/enkf${CDUMP}.${PDY}/${cyc}/${COMPONENT}/earc${ENSGRP}" + +# ICS are restarts and always lag INC by $assim_freq hours. +EARCINC_CYC=${ARCH_CYC} +EARCICS_CYC=$((ARCH_CYC-assim_freq)) +if [ ${EARCICS_CYC} -lt 0 ]; then + EARCICS_CYC=$((EARCICS_CYC+24)) +fi -export ARCH_LIST=${ARCH_LIST:-$ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/earc$ENSGRP} -[[ -d $ARCH_LIST ]] && rm -rf $ARCH_LIST +[[ -d ${ARCH_LIST} ]] && rm -rf $ARCH_LIST mkdir -p $ARCH_LIST cd $ARCH_LIST -$HOMEgfs/ush/hpssarch_gen.sh enkf${CDUMP} +${HOMEgfs}/ush/hpssarch_gen.sh enkf${CDUMP} status=$? -if [ $status -ne 0 ]; then - echo "$HOMEgfs/ush/hpssarch_gen.sh enkf${CDUMP} failed, ABORT!" +if [ ${status} -ne 0 ]; then + echo "${HOMEgfs}/ush/hpssarch_gen.sh enkf${CDUMP} failed, ABORT!" exit $status fi -cd $ROTDIR +cd ${ROTDIR} source "${HOMEgfs}/ush/file_utils.sh" @@ -38,9 +38,9 @@ if (( 10#${ENSGRP} > 0 )) && [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; #--set the archiving command and create local directories, if necessary TARCMD="htar" - if [[ $LOCALARCH = "YES" ]]; then + if [[ ${LOCALARCH} = "YES" ]]; then TARCMD="tar" - [ ! -d $ATARDIR/$CDATE ] && mkdir -p $ATARDIR/$CDATE + [ ! -d ${ATARDIR}/${CDATE} ] && mkdir -p ${ATARDIR}/${CDATE} fi #--determine when to save ICs for warm start @@ -55,7 +55,7 @@ if (( 10#${ENSGRP} > 0 )) && [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; if [ $mod -eq 0 -a $cyc -eq $EARCINC_CYC ]; then SAVEWARMICA="YES" ; fi if [ $mod -eq 0 -a $cyc -eq $EARCICS_CYC ]; then SAVEWARMICB="YES" ; fi - if [ $EARCICS_CYC -eq 18 ]; then + if [ ${EARCICS_CYC} -eq 18 ]; then nday1=$((nday+1)) mod1=$(($nday1 % $ARCH_WARMICFREQ)) if [ $mod1 -eq 0 -a $cyc -eq $EARCICS_CYC ] ; then SAVEWARMICB="YES" ; fi @@ -65,7 +65,7 @@ if (( 10#${ENSGRP} > 0 )) && [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; if [ $CDATE -gt $SDATE ]; then # Don't run for first half cycle - $TARCMD -P -cvf $ATARDIR/$CDATE/enkf${CDUMP}_grp${ENSGRP}.tar $(cat $ARCH_LIST/enkf${CDUMP}_grp${n}.txt) + $TARCMD -P -cvf ${ATARDIR}/${CDATE}/enkf${CDUMP}_grp${ENSGRP}.tar $(cat ${ARCH_LIST}/enkf${CDUMP}_grp${n}.txt) status=$? if [ $status -ne 0 -a $CDATE -ge $firstday ]; then echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE enkf${CDUMP}_grp${ENSGRP}.tar failed" @@ -73,16 +73,16 @@ if (( 10#${ENSGRP} > 0 )) && [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; fi if [ $SAVEWARMICA = "YES" -a $cyc -eq $EARCINC_CYC ]; then - $TARCMD -P -cvf $ATARDIR/$CDATE/enkf${CDUMP}_restarta_grp${ENSGRP}.tar $(cat $ARCH_LIST/enkf${CDUMP}_restarta_grp${n}.txt) + $TARCMD -P -cvf ${ATARDIR}/${CDATE}/enkf${CDUMP}_restarta_grp${ENSGRP}.tar $(cat ${ARCH_LIST}/enkf${CDUMP}_restarta_grp${n}.txt) status=$? - if [ $status -ne 0 ]; then + if [ ${status} -ne 0 ]; then echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE enkf${CDUMP}_restarta_grp${ENSGRP}.tar failed" exit $status fi fi if [ $SAVEWARMICB = "YES" -a $cyc -eq $EARCICS_CYC ]; then - $TARCMD -P -cvf $ATARDIR/$CDATE/enkf${CDUMP}_restartb_grp${ENSGRP}.tar $(cat $ARCH_LIST/enkf${CDUMP}_restartb_grp${n}.txt) + $TARCMD -P -cvf ${ATARDIR}/${CDATE}/enkf${CDUMP}_restartb_grp${ENSGRP}.tar $(cat ${ARCH_LIST}/enkf${CDUMP}_restartb_grp${n}.txt) status=$? if [ $status -ne 0 ]; then echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE enkf${CDUMP}_restartb_grp${ENSGRP}.tar failed" @@ -97,19 +97,19 @@ fi ################################################################### # ENSGRP 0 archives ensemble means and copy data to online archive -if [ $ENSGRP -eq 0 ]; then +if [ ${ENSGRP} -eq 0 ]; then if [[ $HPSSARCH = "YES" || $LOCALARCH = "YES" ]]; then #--set the archiving command and create local directories, if necessary TARCMD="htar" - if [[ $LOCALARCH = "YES" ]]; then + if [[ ${LOCALARCH} = "YES" ]]; then TARCMD="tar" - [ ! -d $ATARDIR/$CDATE ] && mkdir -p $ATARDIR/$CDATE + [ ! -d ${ATARDIR}/${CDATE} ] && mkdir -p $ATARDIR/$CDATE fi set +e - $TARCMD -P -cvf $ATARDIR/$CDATE/enkf${CDUMP}.tar $(cat $ARCH_LIST/enkf${CDUMP}.txt) + $TARCMD -P -cvf ${ATARDIR}/${CDATE}/enkf${CDUMP}.tar $(cat ${ARCH_LIST}/enkf${CDUMP}.txt) status=$? if [ $status -ne 0 -a $CDATE -ge $firstday ]; then echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE enkf${CDUMP}.tar failed" @@ -119,15 +119,15 @@ if [ $ENSGRP -eq 0 ]; then fi #-- Archive online for verification and diagnostics - [[ ! -d $ARCDIR ]] && mkdir -p $ARCDIR + [[ ! -d ${ARCDIR} ]] && mkdir -p $ARCDIR cd $ARCDIR - nb_copy $ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.enkfstat enkfstat.${CDUMP}.$CDATE - nb_copy $ROTDIR/enkf${CDUMP}.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.${CDUMP}.${CDATE}.ensmean + nb_copy ${ROTDIR}/enkf${CDUMP}.${PDY}/${cyc}/${COMPONENT}/${CDUMP}.t${cyc}z.enkfstat enkfstat.${CDUMP}.$CDATE + nb_copy ${ROTDIR}/enkf${CDUMP}.${PDY}/${cyc}/${COMPONENT}/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.${CDUMP}.${CDATE}.ensmean - if [ $CDUMP_ENKF != "GDAS" ]; then - nb_copy $ROTDIR/enkfgfs.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.enkfstat enkfstat.gfs.$CDATE - nb_copy $ROTDIR/enkfgfs.$PDY/$cyc/$COMPONENT/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.gfs.${CDATE}.ensmean + if [ ${CDUMP_ENKF} != "GDAS" ]; then + nb_copy ${ROTDIR}/enkfgfs.${PDY}/${cyc}/${COMPONENT}/${CDUMP}.t${cyc}z.enkfstat enkfstat.gfs.${CDATE} + nb_copy ${ROTDIR}/enkfgfs.${PDY}/${cyc}/${COMPONENT}/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.gfs.${CDATE}.ensmean fi fi @@ -139,7 +139,7 @@ fi ############################################################### # ENSGRP 0 also does clean-up -if [ $ENSGRP -eq 0 ]; then +if [ ${ENSGRP} -eq 0 ]; then # Start start and end dates to remove GDATEEND=$($NDATE -${RMOLDEND_ENKF:-24} $CDATE) @@ -152,10 +152,10 @@ if [ $ENSGRP -eq 0 ]; then # Loop over GDAS and GFS EnKF directories separately. clist="gdas gfs" for ctype in $clist; do - COMIN_ENS="$ROTDIR/enkf$ctype.$gPDY/$gcyc/$COMPONENT" - if [ -d $COMIN_ENS ]; then - rocotolog="$EXPDIR/logs/${GDATE}.log" - if [ -f $rocotolog ]; then + COMIN_ENS="${ROTDIR}/enkf${ctype}.${gPDY}/${gcyc}/${COMPONENT}" + if [ -d ${COMIN_ENS} ]; then + rocotolog="${EXPDIR}/logs/${GDATE}.log" + if [ -f ${rocotolog} ]; then set +e testend=$(tail -n 1 $rocotolog | grep "This cycle is complete: Success") rc=$? @@ -163,7 +163,7 @@ if [ $ENSGRP -eq 0 ]; then if [ $rc -eq 0 ]; then # Retain f006.ens files. Remove everything else for file in $(ls $COMIN_ENS | grep -v f006.ens); do - rm -rf $COMIN_ENS/$file + rm -rf ${COMIN_ENS}/${file} done fi fi @@ -192,7 +192,7 @@ fi rPDY=$(echo $RDATE | cut -c1-8) clist="gdas gfs" for ctype in $clist; do - COMIN="$ROTDIR/enkf$ctype.$rPDY" + COMIN="${ROTDIR}/enkf${ctype}.${rPDY}" [[ -d $COMIN ]] && rm -rf $COMIN done diff --git a/scripts/exglobal_archive.sh b/scripts/exglobal_archive.sh index d3343ffab66..ae1013adeda 100755 --- a/scripts/exglobal_archive.sh +++ b/scripts/exglobal_archive.sh @@ -13,6 +13,26 @@ source "$HOMEgfs/ush/preamble.sh" ## PDY : current date (YYYYMMDD) ## cyc : current cycle (HH) ############################################################### +############################################## +# Begin JOB SPECIFIC work +############################################## + +# ICS are restarts and always lag INC by $assim_freq hours +ARCHINC_CYC=${ARCH_CYC} +ARCHICS_CYC=$((ARCH_CYC-assim_freq)) +if [ ${ARCHICS_CYC} -lt 0 ]; then + ARCHICS_CYC=$((ARCHICS_CYC+24)) +fi + +# CURRENT CYCLE +APREFIX="${CDUMP}.t${cyc}z." +ASUFFIX=${ASUFFIX:-${SUFFIX}} + +if [ ${ASUFFIX} = ".nc" ]; then + format="netcdf" +else + format="nemsio" +fi # Realtime parallels run GFS MOS on 1 day delay # If realtime parallel, back up CDATE_MOS one day From b97d453e3a99523be964244ec709ebf57de27dd3 Mon Sep 17 00:00:00 2001 From: "Lin.Gan" Date: Mon, 14 Nov 2022 16:28:30 +0000 Subject: [PATCH 14/21] Remove extra statement in JENKFGDAS_ARCHIVE --- jobs/JENKFGDAS_ARCHIVE | 4 ---- 1 file changed, 4 deletions(-) diff --git a/jobs/JENKFGDAS_ARCHIVE b/jobs/JENKFGDAS_ARCHIVE index 72afa94cb93..116ae32b627 100755 --- a/jobs/JENKFGDAS_ARCHIVE +++ b/jobs/JENKFGDAS_ARCHIVE @@ -52,10 +52,6 @@ export CDATE=${CDATE:-${PDY}${cyc}} export CDUMP=${CDUMP:-${RUN:-"gdas"}} export COMPONENT=${COMPONENT:-atmos} -# EnKF update in GFS, GDAS or both -export CDUMP_ENKF=$(echo ${EUPD_CYC:-"gdas"} | tr a-z A-Z) -export ARCH_LIST="${ROTDIR}/enkf${CDUMP}.${PDY}/${cyc}/${COMPONENT}/earc${ENSGRP}" - ############################################################### # Run archive script ############################################################### From 686a63d72ab02cfe81ba39d66ffb044f5118d116 Mon Sep 17 00:00:00 2001 From: "Lin.Gan" Date: Mon, 14 Nov 2022 20:17:21 +0000 Subject: [PATCH 15/21] Putting braces around variable --- jobs/JENKFGDAS_ARCHIVE | 2 +- jobs/JGLOBAL_ARCHIVE | 24 +----------------------- scripts/exgdas_enkf_earc.sh | 6 +++--- 3 files changed, 5 insertions(+), 27 deletions(-) diff --git a/jobs/JENKFGDAS_ARCHIVE b/jobs/JENKFGDAS_ARCHIVE index 116ae32b627..2c5610cd614 100755 --- a/jobs/JENKFGDAS_ARCHIVE +++ b/jobs/JENKFGDAS_ARCHIVE @@ -58,7 +58,7 @@ export COMPONENT=${COMPONENT:-atmos} ${SCRgfs}/exgdas_enkf_earc.sh status=$? -[[ $status -ne 0 ]] && exit $status +[[ ${status} -ne 0 ]] && exit $status ############################################################### diff --git a/jobs/JGLOBAL_ARCHIVE b/jobs/JGLOBAL_ARCHIVE index 966225269a4..7b4bd2bbddf 100755 --- a/jobs/JGLOBAL_ARCHIVE +++ b/jobs/JGLOBAL_ARCHIVE @@ -10,7 +10,7 @@ export RUN_ENVIR=${RUN_ENVIR:-"nco"} export EXPDIR=${EXPDIR:-${HOMEgfs}/parm/config} configs="base arch" config_path=${EXPDIR:-${PACKAGEROOT}/gfs.${gfs_ver}/parm/config} -for config in $configs; do +for config in ${configs}; do . ${config_path}/config.${config} status=$? [[ ${status} -ne 0 ]] && exit $status @@ -54,28 +54,6 @@ export CDATE=${CDATE:-${PDY}${cyc}} export CDUMP=${CDUMP:-${RUN:-"gfs"}} export COMPONENT=${COMPONENT:-atmos} - -############################################## -# Begin JOB SPECIFIC work -############################################## - -# ICS are restarts and always lag INC by $assim_freq hours -export ARCHINC_CYC=${ARCH_CYC} -export ARCHICS_CYC=$((ARCH_CYC-assim_freq)) -if [ ${ARCHICS_CYC} -lt 0 ]; then - ARCHICS_CYC=$((ARCHICS_CYC+24)) -fi - -# CURRENT CYCLE -export APREFIX="${CDUMP}.t${cyc}z." -export ASUFFIX=${ASUFFIX:-${SUFFIX}} - -if [ ${ASUFFIX} = ".nc" ]; then - format="netcdf" -else - format="nemsio" -fi - ############################################################### # Run archive script ############################################################### diff --git a/scripts/exgdas_enkf_earc.sh b/scripts/exgdas_enkf_earc.sh index 80033b2a3c5..20ed409e876 100755 --- a/scripts/exgdas_enkf_earc.sh +++ b/scripts/exgdas_enkf_earc.sh @@ -17,14 +17,14 @@ if [ ${EARCICS_CYC} -lt 0 ]; then fi [[ -d ${ARCH_LIST} ]] && rm -rf $ARCH_LIST -mkdir -p $ARCH_LIST -cd $ARCH_LIST +mkdir -p ${ARCH_LIST} +cd ${ARCH_LIST} ${HOMEgfs}/ush/hpssarch_gen.sh enkf${CDUMP} status=$? if [ ${status} -ne 0 ]; then echo "${HOMEgfs}/ush/hpssarch_gen.sh enkf${CDUMP} failed, ABORT!" - exit $status + exit ${status} fi cd ${ROTDIR} From e802183e8fa9531e0597304e994a4ea931f4eba2 Mon Sep 17 00:00:00 2001 From: "Lin.Gan" Date: Mon, 14 Nov 2022 21:12:48 +0000 Subject: [PATCH 16/21] remove date statement from jjobs --- jobs/JENKFGDAS_ARCHIVE | 1 - jobs/JGLOBAL_ARCHIVE | 1 - 2 files changed, 2 deletions(-) diff --git a/jobs/JENKFGDAS_ARCHIVE b/jobs/JENKFGDAS_ARCHIVE index 2c5610cd614..a72c929e138 100755 --- a/jobs/JENKFGDAS_ARCHIVE +++ b/jobs/JENKFGDAS_ARCHIVE @@ -70,5 +70,4 @@ echo "ENDED NORMALLY." cd ${DATAROOT} [[ ${KEEPDATA} = "NO" ]] && rm -rf $DATA -date exit 0 diff --git a/jobs/JGLOBAL_ARCHIVE b/jobs/JGLOBAL_ARCHIVE index 7b4bd2bbddf..25c955e869f 100755 --- a/jobs/JGLOBAL_ARCHIVE +++ b/jobs/JGLOBAL_ARCHIVE @@ -72,5 +72,4 @@ echo "ENDED NORMALLY." cd ${DATAROOT} [[ ${KEEPDATA} = "NO" ]] && rm -rf $DATA -date exit 0 From d286dce9b5270776623b2f3abcf70740afc827b3 Mon Sep 17 00:00:00 2001 From: "lin.gan" Date: Wed, 16 Nov 2022 19:57:52 +0000 Subject: [PATCH 17/21] Apply shellcheck 2004,2086,2166,2248,2250 --- jobs/JENKFGDAS_ARCHIVE | 22 +-- jobs/JGLOBAL_ARCHIVE | 18 +- scripts/exgdas_enkf_earc.sh | 152 +++++++-------- scripts/exglobal_archive.sh | 366 ++++++++++++++++++------------------ 4 files changed, 279 insertions(+), 279 deletions(-) diff --git a/jobs/JENKFGDAS_ARCHIVE b/jobs/JENKFGDAS_ARCHIVE index a72c929e138..cf38ede54f5 100755 --- a/jobs/JENKFGDAS_ARCHIVE +++ b/jobs/JENKFGDAS_ARCHIVE @@ -1,6 +1,6 @@ #! /usr/bin/env bash -source "$HOMEgfs/ush/preamble.sh" +source "${HOMEgfs}/ush/preamble.sh" ############################# # Source relevant config files @@ -9,25 +9,25 @@ export EXPDIR=${EXPDIR:-${HOMEgfs}/parm/config} configs="base earc" config_path=${EXPDIR:-${PACKAGEROOT}/gfs.${gfs_ver}/parm/config} for config in ${configs}; do - . ${config_path}/config.${config} + . "${config_path}"/config."${config}" status=$? - [[ ${status} -ne 0 ]] && exit ${status} + [[ ${status} -ne 0 ]] && exit "${status}" done ########################################## # Source machine runtime environment ########################################## -. ${HOMEgfs}/env/${machine}.env earc +. "${HOMEgfs}"/env/"${machine}".env earc status=$? -[[ ${status} -ne 0 ]] && exit $status +[[ ${status} -ne 0 ]] && exit "${status}" ############################################## # Obtain unique process id (pid) and make temp directory ############################################## export pid=${pid:-$$} export DATA=${DATA:-${DATAROOT}/${jobid:?}} -mkdir -p ${DATA} -cd ${DATA} +mkdir -p "${DATA}" +cd "${DATA}" ############################################## @@ -56,9 +56,9 @@ export COMPONENT=${COMPONENT:-atmos} # Run archive script ############################################################### -${SCRgfs}/exgdas_enkf_earc.sh +"${SCRgfs}"/exgdas_enkf_earc.sh status=$? -[[ ${status} -ne 0 ]] && exit $status +[[ ${status} -ne 0 ]] && exit "${status}" ############################################################### @@ -67,7 +67,7 @@ echo "ENDED NORMALLY." ########################################## # Remove the Temporary working directory ########################################## -cd ${DATAROOT} -[[ ${KEEPDATA} = "NO" ]] && rm -rf $DATA +cd "${DATAROOT}" +[[ ${KEEPDATA} = "NO" ]] && rm -rf "${DATA}" exit 0 diff --git a/jobs/JGLOBAL_ARCHIVE b/jobs/JGLOBAL_ARCHIVE index 25c955e869f..9d7dbb7436f 100755 --- a/jobs/JGLOBAL_ARCHIVE +++ b/jobs/JGLOBAL_ARCHIVE @@ -11,25 +11,25 @@ export EXPDIR=${EXPDIR:-${HOMEgfs}/parm/config} configs="base arch" config_path=${EXPDIR:-${PACKAGEROOT}/gfs.${gfs_ver}/parm/config} for config in ${configs}; do - . ${config_path}/config.${config} + . "${config_path}"/config."${config}" status=$? - [[ ${status} -ne 0 ]] && exit $status + [[ ${status} -ne 0 ]] && exit "${status}" done ########################################## # Source machine runtime environment ########################################## -. ${HOMEgfs}/env/${machine}.env arch +. "${HOMEgfs}"/env/"${machine}".env arch status=$? -[[ ${status} -ne 0 ]] && exit $status +[[ ${status} -ne 0 ]] && exit "${status}" ############################################## # Obtain unique process id (pid) and make temp directory ############################################## export pid=${pid:-$$} export DATA=${DATA:-${DATAROOT}/${jobid:?}} -mkdir -p ${DATA} -cd ${DATA} +mkdir -p "${DATA}" +cd "${DATA}" ############################################## @@ -60,7 +60,7 @@ export COMPONENT=${COMPONENT:-atmos} ${GLOBALARCHIVESH:-${SCRgfs}/exglobal_archive.sh} status=$? -[[ ${status} -ne 0 ]] && exit $status +[[ ${status} -ne 0 ]] && exit "${status}" ############################################################### @@ -69,7 +69,7 @@ echo "ENDED NORMALLY." ########################################## # Remove the Temporary working directory ########################################## -cd ${DATAROOT} -[[ ${KEEPDATA} = "NO" ]] && rm -rf $DATA +cd "${DATAROOT}" +[[ ${KEEPDATA} = "NO" ]] && rm -rf "${DATA}" exit 0 diff --git a/scripts/exgdas_enkf_earc.sh b/scripts/exgdas_enkf_earc.sh index 20ed409e876..6cb5da7db7a 100755 --- a/scripts/exgdas_enkf_earc.sh +++ b/scripts/exgdas_enkf_earc.sh @@ -6,87 +6,87 @@ source "${HOMEgfs}/ush/preamble.sh" # Begin JOB SPECIFIC work ############################################## export n=$((10#${ENSGRP})) -export CDUMP_ENKF=$(echo ${EUPD_CYC:-"gdas"} | tr a-z A-Z) +export CDUMP_ENKF=$(echo "${EUPD_CYC:-"gdas"}" | tr a-z A-Z) export ARCH_LIST="${ROTDIR}/enkf${CDUMP}.${PDY}/${cyc}/${COMPONENT}/earc${ENSGRP}" # ICS are restarts and always lag INC by $assim_freq hours. EARCINC_CYC=${ARCH_CYC} EARCICS_CYC=$((ARCH_CYC-assim_freq)) -if [ ${EARCICS_CYC} -lt 0 ]; then +if [ "${EARCICS_CYC}" -lt 0 ]; then EARCICS_CYC=$((EARCICS_CYC+24)) fi -[[ -d ${ARCH_LIST} ]] && rm -rf $ARCH_LIST -mkdir -p ${ARCH_LIST} -cd ${ARCH_LIST} +[[ -d ${ARCH_LIST} ]] && rm -rf "${ARCH_LIST}" +mkdir -p "${ARCH_LIST}" +cd "${ARCH_LIST}" -${HOMEgfs}/ush/hpssarch_gen.sh enkf${CDUMP} +"${HOMEgfs}"/ush/hpssarch_gen.sh enkf"${CDUMP}" status=$? -if [ ${status} -ne 0 ]; then +if [ "${status}" -ne 0 ]; then echo "${HOMEgfs}/ush/hpssarch_gen.sh enkf${CDUMP} failed, ABORT!" - exit ${status} + exit "${status}" fi -cd ${ROTDIR} +cd "${ROTDIR}" source "${HOMEgfs}/ush/file_utils.sh" ################################################################### # ENSGRP > 0 archives a group of ensemble members -firstday=$($NDATE +24 $SDATE) +firstday=$(${NDATE} +24 "${SDATE}") if (( 10#${ENSGRP} > 0 )) && [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; then #--set the archiving command and create local directories, if necessary TARCMD="htar" if [[ ${LOCALARCH} = "YES" ]]; then TARCMD="tar" - [ ! -d ${ATARDIR}/${CDATE} ] && mkdir -p ${ATARDIR}/${CDATE} + [ ! -d "${ATARDIR}"/"${CDATE}" ] && mkdir -p "${ATARDIR}"/"${CDATE}" fi #--determine when to save ICs for warm start SAVEWARMICA="NO" SAVEWARMICB="NO" - mm=$(echo $CDATE|cut -c 5-6) - dd=$(echo $CDATE|cut -c 7-8) + mm=$(echo "${CDATE}"|cut -c 5-6) + dd=$(echo "${CDATE}"|cut -c 7-8) nday=$(( (mm-1)*30+dd )) - mod=$(($nday % $ARCH_WARMICFREQ)) - if [ $CDATE -eq $firstday -a $cyc -eq $EARCINC_CYC ]; then SAVEWARMICA="YES" ; fi - if [ $CDATE -eq $firstday -a $cyc -eq $EARCICS_CYC ]; then SAVEWARMICB="YES" ; fi - if [ $mod -eq 0 -a $cyc -eq $EARCINC_CYC ]; then SAVEWARMICA="YES" ; fi - if [ $mod -eq 0 -a $cyc -eq $EARCICS_CYC ]; then SAVEWARMICB="YES" ; fi + mod=$((nday % ${ARCH_WARMICFREQ})) + if [ "${CDATE}" -eq "${firstday}" ] && [ "${cyc}" -eq "${EARCINC_CYC}" ]; then SAVEWARMICA="YES" ; fi + if [ "${CDATE}" -eq "${firstday}" } && { "${cyc}" -eq "${EARCICS_CYC}" ]; then SAVEWARMICB="YES" ; fi + if [ "${mod}" -eq 0 -a "${cyc}" ] && [ "${EARCINC_CYC}" ]; then SAVEWARMICA="YES" ; fi + if [ "${mod}" -eq 0 -a "${cyc}" ] && [ "${EARCICS_CYC}" ]; then SAVEWARMICB="YES" ; fi - if [ ${EARCICS_CYC} -eq 18 ]; then + if [ "${EARCICS_CYC}" -eq 18 ]; then nday1=$((nday+1)) - mod1=$(($nday1 % $ARCH_WARMICFREQ)) - if [ $mod1 -eq 0 -a $cyc -eq $EARCICS_CYC ] ; then SAVEWARMICB="YES" ; fi - if [ $mod1 -ne 0 -a $cyc -eq $EARCICS_CYC ] ; then SAVEWARMICB="NO" ; fi - if [ $CDATE -eq $SDATE -a $cyc -eq $EARCICS_CYC ] ; then SAVEWARMICB="YES" ; fi + mod1=$((nday1 % ${ARCH_WARMICFREQ})) + if [ "${mod1}" -eq 0 ] && [ "${cyc}" -eq "${EARCICS_CYC}" ] ; then SAVEWARMICB="YES" ; fi + if [ "${mod1}" -ne 0 ] && [ "${cyc}" -eq "${EARCICS_CYC}" ] ; then SAVEWARMICB="NO" ; fi + if [ "${CDATE}" -eq "${SDATE}" ] && [ "${cyc}" -eq "${EARCICS_CYC}" ] ; then SAVEWARMICB="YES" ; fi fi - if [ $CDATE -gt $SDATE ]; then # Don't run for first half cycle + if [ "${CDATE}" -gt "${SDATE}" ]; then # Don't run for first half cycle - $TARCMD -P -cvf ${ATARDIR}/${CDATE}/enkf${CDUMP}_grp${ENSGRP}.tar $(cat ${ARCH_LIST}/enkf${CDUMP}_grp${n}.txt) + ${TARCMD} -P -cvf "${ATARDIR}"/"${CDATE}"/enkf"${CDUMP}"_grp"${ENSGRP}".tar $(cat "${ARCH_LIST}"/enkf"${CDUMP}"_grp"${n}".txt) status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE enkf${CDUMP}_grp${ENSGRP}.tar failed" - exit $status + if [ "${status}" -ne 0 ] && [ "${CDATE}" -ge "${firstday}" ]; then + echo "$(echo "${TARCMD}" | tr 'a-z' 'A-Z') ${CDATE} enkf${CDUMP}_grp${ENSGRP}.tar failed" + exit "${status}" fi - if [ $SAVEWARMICA = "YES" -a $cyc -eq $EARCINC_CYC ]; then - $TARCMD -P -cvf ${ATARDIR}/${CDATE}/enkf${CDUMP}_restarta_grp${ENSGRP}.tar $(cat ${ARCH_LIST}/enkf${CDUMP}_restarta_grp${n}.txt) + if [ "${SAVEWARMICA}" = "YES" ] && [ "${cyc}" -eq "${EARCINC_CYC}" ]; then + ${TARCMD} -P -cvf "${ATARDIR}"/"${CDATE}"/enkf"${CDUMP}"_restarta_grp"${ENSGRP}".tar $(cat "${ARCH_LIST}"/enkf"${CDUMP}"_restarta_grp"${n}".txt) status=$? - if [ ${status} -ne 0 ]; then - echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE enkf${CDUMP}_restarta_grp${ENSGRP}.tar failed" - exit $status + if [ "${status}" -ne 0 ]; then + echo "$(echo "${TARCMD}" | tr 'a-z' 'A-Z') ${CDATE} enkf${CDUMP}_restarta_grp${ENSGRP}.tar failed" + exit "${status}" fi fi - if [ $SAVEWARMICB = "YES" -a $cyc -eq $EARCICS_CYC ]; then - $TARCMD -P -cvf ${ATARDIR}/${CDATE}/enkf${CDUMP}_restartb_grp${ENSGRP}.tar $(cat ${ARCH_LIST}/enkf${CDUMP}_restartb_grp${n}.txt) + if [ "${SAVEWARMICB}" = "YES" ] && [ "${cyc}" -eq "${EARCICS_CYC}" ]; then + ${TARCMD} -P -cvf "${ATARDIR}"/"${CDATE}"/enkf"${CDUMP}"_restartb_grp"${ENSGRP}".tar $(cat "${ARCH_LIST}"/enkf"${CDUMP}"_restartb_grp"${n}".txt) status=$? - if [ $status -ne 0 ]; then - echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE enkf${CDUMP}_restartb_grp${ENSGRP}.tar failed" - exit $status + if [ "${status}" -ne 0 ]; then + echo "$(echo "${TARCMD}" | tr 'a-z' 'A-Z') ${CDATE} enkf${CDUMP}_restartb_grp${ENSGRP}.tar failed" + exit "${status}" fi fi @@ -97,37 +97,37 @@ fi ################################################################### # ENSGRP 0 archives ensemble means and copy data to online archive -if [ ${ENSGRP} -eq 0 ]; then +if [ "${ENSGRP}" -eq 0 ]; then - if [[ $HPSSARCH = "YES" || $LOCALARCH = "YES" ]]; then + if [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; then #--set the archiving command and create local directories, if necessary TARCMD="htar" if [[ ${LOCALARCH} = "YES" ]]; then TARCMD="tar" - [ ! -d ${ATARDIR}/${CDATE} ] && mkdir -p $ATARDIR/$CDATE + [ ! -d "${ATARDIR}"/"${CDATE}" ] && mkdir -p "${ATARDIR}"/"${CDATE}" fi set +e - $TARCMD -P -cvf ${ATARDIR}/${CDATE}/enkf${CDUMP}.tar $(cat ${ARCH_LIST}/enkf${CDUMP}.txt) + ${TARCMD} -P -cvf "${ATARDIR}"/"${CDATE}"/enkf"${CDUMP}".tar $(cat "${ARCH_LIST}"/enkf"${CDUMP}".txt) status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE enkf${CDUMP}.tar failed" - exit $status + if [ "${status}" -ne 0 ] && [ "${CDATE}" -ge "${firstday}" ]; then + echo "$(echo "${TARCMD}" | tr 'a-z' 'A-Z') ${CDATE} enkf${CDUMP}.tar failed" + exit "${status}" fi set_strict fi #-- Archive online for verification and diagnostics - [[ ! -d ${ARCDIR} ]] && mkdir -p $ARCDIR - cd $ARCDIR + [[ ! -d ${ARCDIR} ]] && mkdir -p "${ARCDIR}" + cd "${ARCDIR}" - nb_copy ${ROTDIR}/enkf${CDUMP}.${PDY}/${cyc}/${COMPONENT}/${CDUMP}.t${cyc}z.enkfstat enkfstat.${CDUMP}.$CDATE - nb_copy ${ROTDIR}/enkf${CDUMP}.${PDY}/${cyc}/${COMPONENT}/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.${CDUMP}.${CDATE}.ensmean + nb_copy "${ROTDIR}"/enkf"${CDUMP}"."${PDY}"/"${cyc}"/"${COMPONENT}"/"${CDUMP}".t"${cyc}"z.enkfstat enkfstat."${CDUMP}"."${CDATE}" + nb_copy "${ROTDIR}"/enkf"${CDUMP}"."${PDY}"/"${cyc}"/"${COMPONENT}"/"${CDUMP}".t"${cyc}"z.gsistat.ensmean gsistat."${CDUMP}"."${CDATE}".ensmean - if [ ${CDUMP_ENKF} != "GDAS" ]; then - nb_copy ${ROTDIR}/enkfgfs.${PDY}/${cyc}/${COMPONENT}/${CDUMP}.t${cyc}z.enkfstat enkfstat.gfs.${CDATE} - nb_copy ${ROTDIR}/enkfgfs.${PDY}/${cyc}/${COMPONENT}/${CDUMP}.t${cyc}z.gsistat.ensmean gsistat.gfs.${CDATE}.ensmean + if [ "${CDUMP_ENKF}" != "GDAS" ]; then + nb_copy "${ROTDIR}"/enkfgfs."${PDY}"/"${cyc}"/"${COMPONENT}"/"${CDUMP}".t"${cyc}"z.enkfstat enkfstat.gfs."${CDATE}" + nb_copy "${ROTDIR}"/enkfgfs."${PDY}"/"${cyc}"/"${COMPONENT}"/"${CDUMP}".t"${cyc}"z.gsistat.ensmean gsistat.gfs."${CDATE}".ensmean fi fi @@ -139,61 +139,61 @@ fi ############################################################### # ENSGRP 0 also does clean-up -if [ ${ENSGRP} -eq 0 ]; then +if [ "${ENSGRP}" -eq 0 ]; then # Start start and end dates to remove - GDATEEND=$($NDATE -${RMOLDEND_ENKF:-24} $CDATE) - GDATE=$($NDATE -${RMOLDSTD_ENKF:-120} $CDATE) - while [ $GDATE -le $GDATEEND ]; do + GDATEEND=$(${NDATE} -"${RMOLDEND_ENKF:-24}" "${CDATE}") + GDATE=$(${NDATE} -"${RMOLDSTD_ENKF:-120}" "${CDATE}") + while [ "${GDATE}" -le "${GDATEEND}" ]; do - gPDY=$(echo $GDATE | cut -c1-8) - gcyc=$(echo $GDATE | cut -c9-10) + gPDY=$(echo "${GDATE}" | cut -c1-8) + gcyc=$(echo "${GDATE}" | cut -c9-10) # Loop over GDAS and GFS EnKF directories separately. clist="gdas gfs" - for ctype in $clist; do + for ctype in ${clist}; do COMIN_ENS="${ROTDIR}/enkf${ctype}.${gPDY}/${gcyc}/${COMPONENT}" - if [ -d ${COMIN_ENS} ]; then + if [ -d "${COMIN_ENS}" ]; then rocotolog="${EXPDIR}/logs/${GDATE}.log" - if [ -f ${rocotolog} ]; then + if [ -f "${rocotolog}" ]; then set +e - testend=$(tail -n 1 $rocotolog | grep "This cycle is complete: Success") + testend=$(tail -n 1 "${rocotolog}" | grep "This cycle is complete: Success") rc=$? set_strict - if [ $rc -eq 0 ]; then + if [ "${rc}" -eq 0 ]; then # Retain f006.ens files. Remove everything else - for file in $(ls $COMIN_ENS | grep -v f006.ens); do - rm -rf ${COMIN_ENS}/${file} + for file in $(ls "${COMIN_ENS}" | grep -v f006.ens); do + rm -rf "${COMIN_ENS}"/"${file}" done fi fi fi # Remove empty directories - if [ -d $COMIN_ENS ] ; then - [[ ! "$(ls -A $COMIN_ENS)" ]] && rm -rf $COMIN_ENS + if [ -d "${COMIN_ENS}" ] ; then + [[ ! "$(ls -A "${COMIN_ENS}")" ]] && rm -rf "${COMIN_ENS}" fi done # Advance to next cycle - GDATE=$($NDATE +$assim_freq $GDATE) + GDATE=$(${NDATE} +"${assim_freq}" "${GDATE}") done fi # Remove enkf*.$rPDY for the older of GDATE or RDATE -GDATE=$($NDATE -${RMOLDSTD_ENKF:-120} $CDATE) -fhmax=$FHMAX_GFS -RDATE=$($NDATE -$fhmax $CDATE) -if [ $GDATE -lt $RDATE ]; then - RDATE=$GDATE +GDATE=$(${NDATE} -"${RMOLDSTD_ENKF:-120}" "${CDATE}") +fhmax=${FHMAX_GFS} +RDATE=$(${NDATE} -"${fhmax}" "${CDATE}") +if [ "${GDATE}" -lt "${RDATE}" ]; then + RDATE=${GDATE} fi -rPDY=$(echo $RDATE | cut -c1-8) +rPDY=$(echo "${RDATE}" | cut -c1-8) clist="gdas gfs" -for ctype in $clist; do +for ctype in ${clist}; do COMIN="${ROTDIR}/enkf${ctype}.${rPDY}" - [[ -d $COMIN ]] && rm -rf $COMIN + [[ -d ${COMIN} ]] && rm -rf "${COMIN}" done ############################################################### diff --git a/scripts/exglobal_archive.sh b/scripts/exglobal_archive.sh index ae1013adeda..7bf5e2be7d1 100755 --- a/scripts/exglobal_archive.sh +++ b/scripts/exglobal_archive.sh @@ -1,6 +1,6 @@ #! /usr/bin/env bash -source "$HOMEgfs/ush/preamble.sh" +source "${HOMEgfs}/ush/preamble.sh" ############################################################### ## Abstract: @@ -20,7 +20,7 @@ source "$HOMEgfs/ush/preamble.sh" # ICS are restarts and always lag INC by $assim_freq hours ARCHINC_CYC=${ARCH_CYC} ARCHICS_CYC=$((ARCH_CYC-assim_freq)) -if [ ${ARCHICS_CYC} -lt 0 ]; then +if [ "${ARCHICS_CYC}" -lt 0 ]; then ARCHICS_CYC=$((ARCHICS_CYC+24)) fi @@ -28,7 +28,7 @@ fi APREFIX="${CDUMP}.t${cyc}z." ASUFFIX=${ASUFFIX:-${SUFFIX}} -if [ ${ASUFFIX} = ".nc" ]; then +if [ "${ASUFFIX}" = ".nc" ]; then format="netcdf" else format="nemsio" @@ -36,230 +36,230 @@ fi # Realtime parallels run GFS MOS on 1 day delay # If realtime parallel, back up CDATE_MOS one day -CDATE_MOS=$CDATE -if [ $REALTIME = "YES" ]; then - CDATE_MOS=$($NDATE -24 $CDATE) +CDATE_MOS=${CDATE} +if [ "${REALTIME}" = "YES" ]; then + CDATE_MOS=$(${NDATE} -24 "${CDATE}") fi -PDY_MOS=$(echo $CDATE_MOS | cut -c1-8) +PDY_MOS=$(echo "${CDATE_MOS}" | cut -c1-8) ############################################################### # Archive online for verification and diagnostics ############################################################### -COMIN=${COMINatmos:-"$ROTDIR/$CDUMP.$PDY/$cyc/atmos"} -cd $COMIN +COMIN=${COMINatmos:-"${ROTDIR}/${CDUMP}.${PDY}/${cyc}/atmos"} +cd "${COMIN}" source "${HOMEgfs}/ush/file_utils.sh" -[[ ! -d $ARCDIR ]] && mkdir -p $ARCDIR -nb_copy ${APREFIX}gsistat $ARCDIR/gsistat.${CDUMP}.${CDATE} -nb_copy ${APREFIX}pgrb2.1p00.anl $ARCDIR/pgbanl.${CDUMP}.${CDATE}.grib2 +[[ ! -d ${ARCDIR} ]] && mkdir -p "${ARCDIR}" +nb_copy "${APREFIX}"gsistat "${ARCDIR}"/gsistat."${CDUMP}"."${CDATE}" +nb_copy "${APREFIX}"pgrb2.1p00.anl "${ARCDIR}"/pgbanl."${CDUMP}"."${CDATE}".grib2 # Archive 1 degree forecast GRIB2 files for verification -if [ $CDUMP = "gfs" ]; then - fhmax=$FHMAX_GFS +if [ "${CDUMP}" = "gfs" ]; then + fhmax=${FHMAX_GFS} fhr=0 - while [ $fhr -le $fhmax ]; do - fhr2=$(printf %02i $fhr) - fhr3=$(printf %03i $fhr) - nb_copy ${APREFIX}pgrb2.1p00.f$fhr3 $ARCDIR/pgbf${fhr2}.${CDUMP}.${CDATE}.grib2 - fhr=$((10#$fhr + 10#$FHOUT_GFS )) + while [ "${fhr}" -le "${fhmax}" ]; do + fhr2=$(printf %02i "${fhr}") + fhr3=$(printf %03i "${fhr}") + nb_copy "${APREFIX}"pgrb2.1p00.f"${fhr3}" "${ARCDIR}"/pgbf"${fhr2}"."${CDUMP}"."${CDATE}".grib2 + fhr=$((10#${fhr} + 10#${FHOUT_GFS} )) done fi -if [ $CDUMP = "gdas" ]; then +if [ "${CDUMP}" = "gdas" ]; then flist="000 003 006 009" - for fhr in $flist; do + for fhr in ${flist}; do fname=${APREFIX}pgrb2.1p00.f${fhr} - fhr2=$(printf %02i $((10#$fhr))) - nb_copy $fname $ARCDIR/pgbf${fhr2}.${CDUMP}.${CDATE}.grib2 + fhr2=$(printf %02i $((10#${fhr}))) + nb_copy "${fname}" "${ARCDIR}"/pgbf"${fhr2}"."${CDUMP}"."${CDATE}".grib2 done fi -if [ -s avno.t${cyc}z.cyclone.trackatcfunix ]; then - PLSOT4=$(echo $PSLOT|cut -c 1-4 |tr '[a-z]' '[A-Z]') - cat avno.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunix.${CDUMP}.$CDATE - cat avnop.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunixp.${CDUMP}.$CDATE +if [ -s avno.t"${cyc}"z.cyclone.trackatcfunix ]; then + PLSOT4=$(echo "${PSLOT}"|cut -c 1-4 |tr '[a-z]' '[A-Z]') + cat avno.t"${cyc}"z.cyclone.trackatcfunix | sed s:AVNO:"${PLSOT4}":g > "${ARCDIR}"/atcfunix."${CDUMP}"."${CDATE}" + cat avnop.t"${cyc}"z.cyclone.trackatcfunix | sed s:AVNO:"${PLSOT4}":g > "${ARCDIR}"/atcfunixp."${CDUMP}"."${CDATE}" fi -if [ $CDUMP = "gdas" -a -s gdas.t${cyc}z.cyclone.trackatcfunix ]; then - PLSOT4=$(echo $PSLOT|cut -c 1-4 |tr '[a-z]' '[A-Z]') - cat gdas.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunix.${CDUMP}.$CDATE - cat gdasp.t${cyc}z.cyclone.trackatcfunix | sed s:AVNO:${PLSOT4}:g > ${ARCDIR}/atcfunixp.${CDUMP}.$CDATE +if [ "${CDUMP}" = "gdas" ] && [ -s gdas.t"${cyc}"z.cyclone.trackatcfunix ]; then + PLSOT4=$(echo "${PSLOT}"|cut -c 1-4 |tr '[a-z]' '[A-Z]') + cat gdas.t"${cyc}"z.cyclone.trackatcfunix | sed s:AVNO:"${PLSOT4}":g > "${ARCDIR}"/atcfunix."${CDUMP}"."${CDATE}" + cat gdasp.t"${cyc}"z.cyclone.trackatcfunix | sed s:AVNO:"${PLSOT4}":g > "${ARCDIR}"/atcfunixp."${CDUMP}"."${CDATE}" fi -if [ $CDUMP = "gfs" ]; then - nb_copy storms.gfso.atcf_gen.$CDATE ${ARCDIR}/. - nb_copy storms.gfso.atcf_gen.altg.$CDATE ${ARCDIR}/. - nb_copy trak.gfso.atcfunix.$CDATE ${ARCDIR}/. - nb_copy trak.gfso.atcfunix.altg.$CDATE ${ARCDIR}/. +if [ "${CDUMP}" = "gfs" ]; then + nb_copy storms.gfso.atcf_gen."${CDATE}" "${ARCDIR}"/. + nb_copy storms.gfso.atcf_gen.altg."${CDATE}" "${ARCDIR}"/. + nb_copy trak.gfso.atcfunix."${CDATE}" "${ARCDIR}"/. + nb_copy trak.gfso.atcfunix.altg."${CDATE}" "${ARCDIR}"/. - mkdir -p ${ARCDIR}/tracker.$CDATE/$CDUMP + mkdir -p "${ARCDIR}"/tracker."${CDATE}"/"${CDUMP}" blist="epac natl" - for basin in $blist; do - if [[ -f $basin ]]; then - cp -rp $basin ${ARCDIR}/tracker.$CDATE/$CDUMP + for basin in ${blist}; do + if [[ -f ${basin} ]]; then + cp -rp "${basin}" "${ARCDIR}"/tracker."${CDATE}"/"${CDUMP}" fi done fi # Archive required gaussian gfs forecast files for Fit2Obs -if [ $CDUMP = "gfs" -a $FITSARC = "YES" ]; then - VFYARC=${VFYARC:-$ROTDIR/vrfyarch} - [[ ! -d $VFYARC ]] && mkdir -p $VFYARC - mkdir -p $VFYARC/${CDUMP}.$PDY/$cyc +if [ "${CDUMP}" = "gfs" ] && [ "${FITSARC}" = "YES" ]; then + VFYARC=${VFYARC:-${ROTDIR}/vrfyarch} + [[ ! -d ${VFYARC} ]] && mkdir -p "${VFYARC}" + mkdir -p "${VFYARC}"/"${CDUMP}"."${PDY}"/"${cyc}" prefix=${CDUMP}.t${cyc}z - fhmax=${FHMAX_FITS:-$FHMAX_GFS} + fhmax=${FHMAX_FITS:-${FHMAX_GFS}} fhr=0 - while [[ $fhr -le $fhmax ]]; do - fhr3=$(printf %03i $fhr) + while [[ ${fhr} -le ${fhmax} ]]; do + fhr3=$(printf %03i "${fhr}") sfcfile=${prefix}.sfcf${fhr3}${ASUFFIX} sigfile=${prefix}.atmf${fhr3}${ASUFFIX} - nb_copy $sfcfile $VFYARC/${CDUMP}.$PDY/$cyc/ - nb_copy $sigfile $VFYARC/${CDUMP}.$PDY/$cyc/ - (( fhr = 10#$fhr + 6 )) + nb_copy "${sfcfile}" "${VFYARC}"/"${CDUMP}"."${PDY}"/"${cyc}"/ + nb_copy "${sigfile}" "${VFYARC}"/"${CDUMP}"."${PDY}"/"${cyc}"/ + (( fhr = 10#${fhr} + 6 )) done fi ############################################################### # Archive data either to HPSS or locally -if [[ $HPSSARCH = "YES" || $LOCALARCH = "YES" ]]; then +if [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; then ############################################################### # --set the archiving command and create local directories, if necessary TARCMD="htar" -if [[ $LOCALARCH = "YES" ]]; then +if [[ ${LOCALARCH} = "YES" ]]; then TARCMD="tar" - [ ! -d $ATARDIR/$CDATE ] && mkdir -p $ATARDIR/$CDATE - [ ! -d $ATARDIR/$CDATE_MOS -a -d $ROTDIR/gfsmos.$PDY_MOS -a $cyc -eq 18 ] && mkdir -p $ATARDIR/$CDATE_MOS + [ ! -d "${ATARDIR}"/"${CDATE}" ] && mkdir -p "${ATARDIR}"/"${CDATE}" + [ ! -d "${ATARDIR}"/"${CDATE_MOS}" ] && [ -d "${ROTDIR}"/gfsmos."${PDY_MOS}" ] && [ "${cyc}" -eq 18 ] && mkdir -p "${ATARDIR}"/"${CDATE_MOS}" fi #--determine when to save ICs for warm start and forecast-only runs SAVEWARMICA="NO" SAVEWARMICB="NO" SAVEFCSTIC="NO" -firstday=$($NDATE +24 $SDATE) -mm=$(echo $CDATE|cut -c 5-6) -dd=$(echo $CDATE|cut -c 7-8) -nday=$(( (10#$mm-1)*30+10#$dd )) -mod=$(($nday % $ARCH_WARMICFREQ)) -if [ $CDATE -eq $firstday -a $cyc -eq $ARCHINC_CYC ]; then SAVEWARMICA="YES" ; fi -if [ $CDATE -eq $firstday -a $cyc -eq $ARCHICS_CYC ]; then SAVEWARMICB="YES" ; fi -if [ $mod -eq 0 -a $cyc -eq $ARCHINC_CYC ]; then SAVEWARMICA="YES" ; fi -if [ $mod -eq 0 -a $cyc -eq $ARCHICS_CYC ]; then SAVEWARMICB="YES" ; fi - -if [ $ARCHICS_CYC -eq 18 ]; then +firstday=$(${NDATE} +24 "${SDATE}") +mm=$(echo "${CDATE}"|cut -c 5-6) +dd=$(echo "${CDATE}"|cut -c 7-8) +nday=$(( (10#${mm}-1)*30+10#${dd} )) +mod=$((nday % ${ARCH_WARMICFREQ})) +if [ "${CDATE}" -eq "${firstday}" ] && [ "${cyc}" -eq "${ARCHINC_CYC}" ]; then SAVEWARMICA="YES" ; fi +if [ "${CDATE}" -eq "${firstday}" ] && [ "${cyc}" -eq "${ARCHICS_CYC}" ]; then SAVEWARMICB="YES" ; fi +if [ "${mod}" -eq 0 ] && [ "${cyc}" -eq "${ARCHINC_CYC}" ]; then SAVEWARMICA="YES" ; fi +if [ "${mod}" -eq 0 ] && [ "${cyc}" -eq "${ARCHICS_CYC}" ]; then SAVEWARMICB="YES" ; fi + +if [ "${ARCHICS_CYC}" -eq 18 ]; then nday1=$((nday+1)) - mod1=$(($nday1 % $ARCH_WARMICFREQ)) - if [ $mod1 -eq 0 -a $cyc -eq $ARCHICS_CYC ] ; then SAVEWARMICB="YES" ; fi - if [ $mod1 -ne 0 -a $cyc -eq $ARCHICS_CYC ] ; then SAVEWARMICB="NO" ; fi - if [ $CDATE -eq $SDATE -a $cyc -eq $ARCHICS_CYC ] ; then SAVEWARMICB="YES" ; fi + mod1=$((nday1 % ${ARCH_WARMICFREQ})) + if [ "${mod1}" -eq 0 ] && [ "${cyc}" -eq "${ARCHICS_CYC}" ] ; then SAVEWARMICB="YES" ; fi + if [ "${mod1}" -ne 0 ] && [ "${cyc}" -eq "${ARCHICS_CYC}" ] ; then SAVEWARMICB="NO" ; fi + if [ "${CDATE}" -eq "${SDATE}" ] && [ "${cyc}" -eq "${ARCHICS_CYC}" ] ; then SAVEWARMICB="YES" ; fi fi -mod=$(($nday % $ARCH_FCSTICFREQ)) -if [ $mod -eq 0 -o $CDATE -eq $firstday ]; then SAVEFCSTIC="YES" ; fi +mod=$((nday % ${ARCH_FCSTICFREQ})) +if [ "${mod}" -eq 0 ] || [ "${CDATE}" -eq "${firstday}" ]; then SAVEFCSTIC="YES" ; fi -ARCH_LIST="$COMIN/archlist" -[[ -d $ARCH_LIST ]] && rm -rf $ARCH_LIST -mkdir -p $ARCH_LIST -cd $ARCH_LIST +ARCH_LIST="${COMIN}/archlist" +[[ -d ${ARCH_LIST} ]] && rm -rf "${ARCH_LIST}" +mkdir -p "${ARCH_LIST}" +cd "${ARCH_LIST}" -$HOMEgfs/ush/hpssarch_gen.sh $CDUMP +"${HOMEgfs}"/ush/hpssarch_gen.sh "${CDUMP}" status=$? -if [ $status -ne 0 ]; then - echo "$HOMEgfs/ush/hpssarch_gen.sh $CDUMP failed, ABORT!" - exit $status +if [ "${status}" -ne 0 ]; then + echo "${HOMEgfs}/ush/hpssarch_gen.sh ${CDUMP} failed, ABORT!" + exit "${status}" fi -cd $ROTDIR +cd "${ROTDIR}" -if [ $CDUMP = "gfs" ]; then +if [ "${CDUMP}" = "gfs" ]; then targrp_list="gfsa gfsb" - if [ ${ARCH_GAUSSIAN:-"NO"} = "YES" ]; then - targrp_list="$targrp_list gfs_flux gfs_${format}b gfs_pgrb2b" - if [ $MODE = "cycled" ]; then - targrp_list="$targrp_list gfs_${format}a" + if [ "${ARCH_GAUSSIAN:-"NO"}" = "YES" ]; then + targrp_list="${targrp_list} gfs_flux gfs_${format}b gfs_pgrb2b" + if [ "${MODE}" = "cycled" ]; then + targrp_list="${targrp_list} gfs_${format}a" fi fi - if [ $DO_WAVE = "YES" -a "$WAVE_CDUMP" != "gdas" ]; then - targrp_list="$targrp_list gfswave" + if [ "${DO_WAVE}" = "YES" ] && [ "${WAVE_CDUMP}" != "gdas" ]; then + targrp_list="${targrp_list} gfswave" fi - if [ $DO_OCN = "YES" ]; then - targrp_list="$targrp_list ocn_ice_grib2_0p5 ocn_ice_grib2_0p25 ocn_2D ocn_3D ocn_xsect ocn_daily gfs_flux_1p00" + if [ "${DO_OCN}" = "YES" ]; then + targrp_list="${targrp_list} ocn_ice_grib2_0p5 ocn_ice_grib2_0p25 ocn_2D ocn_3D ocn_xsect ocn_daily gfs_flux_1p00" fi - if [ $DO_ICE = "YES" ]; then - targrp_list="$targrp_list ice" + if [ "${DO_ICE}" = "YES" ]; then + targrp_list="${targrp_list} ice" fi # Aerosols - if [ $DO_AERO = "YES" ]; then + if [ "${DO_AERO}" = "YES" ]; then for targrp in chem; do - $TARCMD -P -cvf $ATARDIR/$CDATE/${targrp}.tar $(cat $ARCH_LIST/${targrp}.txt) + ${TARCMD} -P -cvf "${ATARDIR}"/"${CDATE}"/"${targrp}".tar $(cat "${ARCH_LIST}"/"${targrp}".txt) status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "HTAR $CDATE ${targrp}.tar failed" - exit $status + if [ "${status}" -ne 0 ] && [ "${CDATE}" -ge "${firstday}" ]; then + echo "HTAR ${CDATE} ${targrp}.tar failed" + exit "${status}" fi done fi #for restarts - if [ $SAVEFCSTIC = "YES" ]; then - targrp_list="$targrp_list gfs_restarta" + if [ "${SAVEFCSTIC}" = "YES" ]; then + targrp_list="${targrp_list} gfs_restarta" fi #for downstream products - if [ $DO_BUFRSND = "YES" -o $WAFSF = "YES" ]; then - targrp_list="$targrp_list gfs_downstream" + if [ "${DO_BUFRSND}" = "YES" ] || [ "${WAFSF}" = "YES" ]; then + targrp_list="${targrp_list} gfs_downstream" fi #--save mdl gfsmos output from all cycles in the 18Z archive directory - if [ -d gfsmos.$PDY_MOS -a $cyc -eq 18 ]; then + if [ -d gfsmos."${PDY_MOS}" ] && [ "${cyc}" -eq 18 ]; then set +e - $TARCMD -P -cvf $ATARDIR/$CDATE_MOS/gfsmos.tar ./gfsmos.$PDY_MOS + ${TARCMD} -P -cvf "${ATARDIR}"/"${CDATE_MOS}"/gfsmos.tar ./gfsmos."${PDY_MOS}" status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE gfsmos.tar failed" - exit $status + if [ "${status}" -ne 0 ] && [ "${CDATE}" -ge "${firstday}" ]; then + echo "$(echo "${TARCMD}" | tr 'a-z' 'A-Z') ${CDATE} gfsmos.tar failed" + exit "${status}" fi set_strict fi -elif [ $CDUMP = "gdas" ]; then +elif [ "${CDUMP}" = "gdas" ]; then targrp_list="gdas" #gdaswave - if [ $DO_WAVE = "YES" ]; then - targrp_list="$targrp_list gdaswave" + if [ "${DO_WAVE}" = "YES" ]; then + targrp_list="${targrp_list} gdaswave" fi - if [ $SAVEWARMICA = "YES" -o $SAVEFCSTIC = "YES" ]; then - targrp_list="$targrp_list gdas_restarta" + if [ "${SAVEWARMICA}" = "YES" ] || [ "${SAVEFCSTIC}" = "YES" ]; then + targrp_list="${targrp_list} gdas_restarta" - if [ $DO_WAVE = "YES" ]; then - targrp_list="$targrp_list gdaswave_restart" + if [ "${DO_WAVE}" = "YES" ]; then + targrp_list="${targrp_list} gdaswave_restart" fi fi - if [ $SAVEWARMICB = "YES" -o $SAVEFCSTIC = "YES" ]; then - targrp_list="$targrp_list gdas_restartb" + if [ "${SAVEWARMICB}" = "YES" ] || [ "${SAVEFCSTIC}" = "YES" ]; then + targrp_list="${targrp_list} gdas_restartb" fi fi # Turn on extended globbing options shopt -s extglob -for targrp in $targrp_list; do +for targrp in ${targrp_list}; do set +e - $TARCMD -P -cvf $ATARDIR/$CDATE/${targrp}.tar $(cat $ARCH_LIST/${targrp}.txt) + ${TARCMD} -P -cvf "${ATARDIR}"/"${CDATE}"/"${targrp}".tar $(cat "${ARCH_LIST}"/"${targrp}".txt) status=$? - if [ $status -ne 0 -a $CDATE -ge $firstday ]; then - echo "$(echo $TARCMD | tr 'a-z' 'A-Z') $CDATE ${targrp}.tar failed" - exit $status + if [ "${status}" -ne 0 ] && [ "${CDATE}" -ge "${firstday}" ]; then + echo "$(echo "${TARCMD}" | tr 'a-z' 'A-Z') ${CDATE} ${targrp}.tar failed" + exit "${status}" fi set_strict done @@ -275,16 +275,16 @@ fi ##end of HPSS archive ############################################################### # Clean up previous cycles; various depths # PRIOR CYCLE: Leave the prior cycle alone -GDATE=$($NDATE -$assim_freq $CDATE) +GDATE=$(${NDATE} -"${assim_freq}" "${CDATE}") # PREVIOUS to the PRIOR CYCLE -GDATE=$($NDATE -$assim_freq $GDATE) -gPDY=$(echo $GDATE | cut -c1-8) -gcyc=$(echo $GDATE | cut -c9-10) +GDATE=$(${NDATE} -"${assim_freq}" "${GDATE}") +gPDY=$(echo "${GDATE}" | cut -c1-8) +gcyc=$(echo "${GDATE}" | cut -c9-10) # Remove the TMPDIR directory -COMIN="$RUNDIR/$GDATE" -[[ -d $COMIN ]] && rm -rf $COMIN +COMIN="${RUNDIR}/${GDATE}" +[[ -d ${COMIN} ]] && rm -rf "${COMIN}" if [[ "${DELETE_COM_IN_ARCHIVE_JOB:-YES}" == NO ]] ; then exit 0 @@ -295,45 +295,45 @@ fi # active, retain files needed by GLDAS update. Independent of GLDAS, # retain files needed by Fit2Obs DO_GLDAS=${DO_GLDAS:-"NO"} -GDATEEND=$($NDATE -${RMOLDEND:-24} $CDATE) -GDATE=$($NDATE -${RMOLDSTD:-120} $CDATE) -GLDAS_DATE=$($NDATE -96 $CDATE) -RTOFS_DATE=$($NDATE -48 $CDATE) -while [ $GDATE -le $GDATEEND ]; do - gPDY=$(echo $GDATE | cut -c1-8) - gcyc=$(echo $GDATE | cut -c9-10) - COMIN="$ROTDIR/${CDUMP}.$gPDY/$gcyc/atmos" - COMINwave="$ROTDIR/${CDUMP}.$gPDY/$gcyc/wave" - COMINrtofs="$ROTDIR/rtofs.$gPDY" - if [ -d $COMIN ]; then - rocotolog="$EXPDIR/logs/${GDATE}.log" - if [ -f $rocotolog ]; then +GDATEEND=$(${NDATE} -"${RMOLDEND:-24}" "${CDATE}") +GDATE=$(${NDATE} -"${RMOLDSTD:-120}" "${CDATE}") +GLDAS_DATE=$(${NDATE} -96 "${CDATE}") +RTOFS_DATE=$(${NDATE} -48 "${CDATE}") +while [ "${GDATE}" -le "${GDATEEND}" ]; do + gPDY=$(echo "${GDATE}" | cut -c1-8) + gcyc=$(echo "${GDATE}" | cut -c9-10) + COMIN="${ROTDIR}/${CDUMP}.${gPDY}/${gcyc}/atmos" + COMINwave="${ROTDIR}/${CDUMP}.${gPDY}/${gcyc}/wave" + COMINrtofs="${ROTDIR}/rtofs.${gPDY}" + if [ -d "${COMIN}" ]; then + rocotolog="${EXPDIR}/logs/${GDATE}.log" + if [ -f "${rocotolog}" ]; then set +e - testend=$(tail -n 1 $rocotolog | grep "This cycle is complete: Success") + testend=$(tail -n 1 "${rocotolog}" | grep "This cycle is complete: Success") rc=$? set_strict - if [ $rc -eq 0 ]; then - if [ -d $COMINwave ]; then rm -rf $COMINwave ; fi - if [ -d $COMINrtofs -a $GDATE -lt $RTOFS_DATE ]; then rm -rf $COMINrtofs ; fi - if [ $CDUMP != "gdas" -o $DO_GLDAS = "NO" -o $GDATE -lt $GLDAS_DATE ]; then - if [ $CDUMP = "gdas" ]; then - for file in $(ls $COMIN |grep -v prepbufr |grep -v cnvstat |grep -v atmanl.nc); do - rm -rf $COMIN/$file + if [ "${rc}" -eq 0 ]; then + if [ -d "${COMINwave}" ]; then rm -rf "${COMINwave}" ; fi + if [ -d "${COMINrtofs}" ] && [ "${GDATE}" -lt "${RTOFS_DATE}" ]; then rm -rf "${COMINrtofs}" ; fi + if [ "${CDUMP}" != "gdas" ] || [ "${DO_GLDAS}" = "NO" ] || [ "${GDATE}" -lt "${GLDAS_DATE}" ]; then + if [ "${CDUMP}" = "gdas" ]; then + for file in $(ls "${COMIN}" |grep -v prepbufr |grep -v cnvstat |grep -v atmanl.nc); do + rm -rf "${COMIN}"/"${file}" done else - rm -rf $COMIN + rm -rf "${COMIN}" fi else - if [ $DO_GLDAS = "YES" ]; then - for file in $(ls $COMIN |grep -v sflux |grep -v RESTART |grep -v prepbufr |grep -v cnvstat |grep -v atmanl.nc); do - rm -rf $COMIN/$file + if [ "${DO_GLDAS}" = "YES" ]; then + for file in $(ls "${COMIN}" |grep -v sflux |grep -v RESTART |grep -v prepbufr |grep -v cnvstat |grep -v atmanl.nc); do + rm -rf "${COMIN}"/"${file}" done - for file in $(ls $COMIN/RESTART |grep -v sfcanl ); do - rm -rf $COMIN/RESTART/$file + for file in $(ls "${COMIN}"/RESTART |grep -v sfcanl ); do + rm -rf "${COMIN}"/RESTART/"${file}" done else - for file in $(ls $COMIN |grep -v prepbufr |grep -v cnvstat |grep -v atmanl.nc); do - rm -rf $COMIN/$file + for file in $(ls "${COMIN}" |grep -v prepbufr |grep -v cnvstat |grep -v atmanl.nc); do + rm -rf "${COMIN}"/"${file}" done fi fi @@ -342,21 +342,21 @@ while [ $GDATE -le $GDATEEND ]; do fi # Remove any empty directories - if [ -d $COMIN ]; then - [[ ! "$(ls -A $COMIN)" ]] && rm -rf $COMIN + if [ -d "${COMIN}" ]; then + [[ ! "$(ls -A "${COMIN}")" ]] && rm -rf "${COMIN}" fi - if [ -d $COMINwave ]; then - [[ ! "$(ls -A $COMINwave)" ]] && rm -rf $COMINwave + if [ -d "${COMINwave}" ]; then + [[ ! "$(ls -A "${COMINwave}")" ]] && rm -rf "${COMINwave}" fi # Remove mdl gfsmos directory - if [ $CDUMP = "gfs" ]; then - COMIN="$ROTDIR/gfsmos.$gPDY" - if [ -d $COMIN -a $GDATE -lt $CDATE_MOS ]; then rm -rf $COMIN ; fi + if [ "${CDUMP}" = "gfs" ]; then + COMIN="${ROTDIR}/gfsmos.${gPDY}" + if [ -d "${COMIN}" ] && [ "${GDATE}" -lt "${CDATE_MOS}" ]; then rm -rf "${COMIN}" ; fi fi - GDATE=$($NDATE +$assim_freq $GDATE) + GDATE=$(${NDATE} +"${assim_freq}" "${GDATE}") done # Remove archived gaussian files used for Fit2Obs in $VFYARC that are @@ -364,33 +364,33 @@ done # gaussian files to prevent the files from being removed by automatic # scrubber present on some machines. -if [ $CDUMP = "gfs" ]; then +if [ "${CDUMP}" = "gfs" ]; then fhmax=$((FHMAX_FITS+36)) - RDATE=$($NDATE -$fhmax $CDATE) - rPDY=$(echo $RDATE | cut -c1-8) - COMIN="$VFYARC/$CDUMP.$rPDY" - [[ -d $COMIN ]] && rm -rf $COMIN - - TDATE=$($NDATE -$FHMAX_FITS $CDATE) - while [ $TDATE -lt $CDATE ]; do - tPDY=$(echo $TDATE | cut -c1-8) - tcyc=$(echo $TDATE | cut -c9-10) - TDIR=$VFYARC/$CDUMP.$tPDY/$tcyc - [[ -d $TDIR ]] && touch $TDIR/* - TDATE=$($NDATE +6 $TDATE) + RDATE=$(${NDATE} -"${fhmax}" "${CDATE}") + rPDY=$(echo "${RDATE}" | cut -c1-8) + COMIN="${VFYARC}/${CDUMP}.${rPDY}" + [[ -d ${COMIN} ]] && rm -rf "${COMIN}" + + TDATE=$(${NDATE} -"${FHMAX_FITS}" "${CDATE}") + while [ "${TDATE}" -lt "${CDATE}" ]; do + tPDY=$(echo "${TDATE}" | cut -c1-8) + tcyc=$(echo "${TDATE}" | cut -c9-10) + TDIR=${VFYARC}/${CDUMP}.${tPDY}/${tcyc} + [[ -d ${TDIR} ]] && touch "${TDIR}"/* + TDATE=$(${NDATE} +6 "${TDATE}") done fi # Remove $CDUMP.$rPDY for the older of GDATE or RDATE -GDATE=$($NDATE -${RMOLDSTD:-120} $CDATE) -fhmax=$FHMAX_GFS -RDATE=$($NDATE -$fhmax $CDATE) -if [ $GDATE -lt $RDATE ]; then - RDATE=$GDATE +GDATE=$(${NDATE} -"${RMOLDSTD:-120}" "${CDATE}") +fhmax=${FHMAX_GFS} +RDATE=$(${NDATE} -"${fhmax}" "${CDATE}") +if [ "${GDATE}" -lt "${RDATE}" ]; then + RDATE=${GDATE} fi -rPDY=$(echo $RDATE | cut -c1-8) -COMIN="$ROTDIR/$CDUMP.$rPDY" -[[ -d $COMIN ]] && rm -rf $COMIN +rPDY=$(echo "${RDATE}" | cut -c1-8) +COMIN="${ROTDIR}/${CDUMP}.${rPDY}" +[[ -d ${COMIN} ]] && rm -rf "${COMIN}" ############################################################### From 9d54a7019b84a0d0a4e8682aac6abe2f57abeca4 Mon Sep 17 00:00:00 2001 From: "lin.gan" Date: Wed, 16 Nov 2022 20:06:14 +0000 Subject: [PATCH 18/21] Apply shellcheck 2004,2086,2166,2248,2250 to rocoto jobs --- jobs/rocoto/arch.sh | 10 +++++----- jobs/rocoto/earc.sh | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/jobs/rocoto/arch.sh b/jobs/rocoto/arch.sh index 6d8b03d395b..378b900b196 100755 --- a/jobs/rocoto/arch.sh +++ b/jobs/rocoto/arch.sh @@ -1,17 +1,17 @@ #! /usr/bin/env bash -source "$HOMEgfs/ush/preamble.sh" +source "${HOMEgfs}/ush/preamble.sh" ############################################################### # Source FV3GFS workflow modules -. $HOMEgfs/ush/load_fv3gfs_modules.sh +. "${HOMEgfs}"/ush/load_fv3gfs_modules.sh status=$? -[[ $status -ne 0 ]] && exit $status +[[ ${status} -ne 0 ]] && exit "${status}" ############################################################### # Execute the JJOB -$HOMEgfs/jobs/JGLOBAL_ARCHIVE +"${HOMEgfs}"/jobs/JGLOBAL_ARCHIVE status=$? -exit ${status} +exit "${status}" diff --git a/jobs/rocoto/earc.sh b/jobs/rocoto/earc.sh index 0dc02125866..9e3614377d7 100755 --- a/jobs/rocoto/earc.sh +++ b/jobs/rocoto/earc.sh @@ -1,17 +1,17 @@ #! /usr/bin/env bash -source "$HOMEgfs/ush/preamble.sh" +source "${HOMEgfs}/ush/preamble.sh" ############################################################### # Source FV3GFS workflow modules -. $HOMEgfs/ush/load_fv3gfs_modules.sh +. "${HOMEgfs}"/ush/load_fv3gfs_modules.sh status=$? -[[ $status -ne 0 ]] && exit $status +[[ ${status} -ne 0 ]] && exit "${status}" ############################################################### # Execute the JJOB -$HOMEgfs/jobs/JENKFGDAS_ARCHIVE +"${HOMEgfs}"/jobs/JENKFGDAS_ARCHIVE status=$? -exit ${status} +exit "${status}" From de26d30d7bd375d580d1a341478d0bb657a60eb1 Mon Sep 17 00:00:00 2001 From: "lin.gan" Date: Wed, 16 Nov 2022 20:19:30 +0000 Subject: [PATCH 19/21] Apply shell check sc2004 to exgdas_enkf_earc.sh and exglobal_archive.sh --- scripts/exgdas_enkf_earc.sh | 2 +- scripts/exglobal_archive.sh | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/exgdas_enkf_earc.sh b/scripts/exgdas_enkf_earc.sh index 6cb5da7db7a..ba1b44186f4 100755 --- a/scripts/exgdas_enkf_earc.sh +++ b/scripts/exgdas_enkf_earc.sh @@ -51,7 +51,7 @@ if (( 10#${ENSGRP} > 0 )) && [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; nday=$(( (mm-1)*30+dd )) mod=$((nday % ${ARCH_WARMICFREQ})) if [ "${CDATE}" -eq "${firstday}" ] && [ "${cyc}" -eq "${EARCINC_CYC}" ]; then SAVEWARMICA="YES" ; fi - if [ "${CDATE}" -eq "${firstday}" } && { "${cyc}" -eq "${EARCICS_CYC}" ]; then SAVEWARMICB="YES" ; fi + if [ "${CDATE}" -eq "${firstday}" ] && { "${cyc}" -eq "${EARCICS_CYC}" ]; then SAVEWARMICB="YES" ; fi if [ "${mod}" -eq 0 -a "${cyc}" ] && [ "${EARCINC_CYC}" ]; then SAVEWARMICA="YES" ; fi if [ "${mod}" -eq 0 -a "${cyc}" ] && [ "${EARCICS_CYC}" ]; then SAVEWARMICB="YES" ; fi diff --git a/scripts/exglobal_archive.sh b/scripts/exglobal_archive.sh index 7bf5e2be7d1..e57f257bedb 100755 --- a/scripts/exglobal_archive.sh +++ b/scripts/exglobal_archive.sh @@ -141,7 +141,7 @@ firstday=$(${NDATE} +24 "${SDATE}") mm=$(echo "${CDATE}"|cut -c 5-6) dd=$(echo "${CDATE}"|cut -c 7-8) nday=$(( (10#${mm}-1)*30+10#${dd} )) -mod=$((nday % ${ARCH_WARMICFREQ})) +mod=$((nday % ARCH_WARMICFREQ)) if [ "${CDATE}" -eq "${firstday}" ] && [ "${cyc}" -eq "${ARCHINC_CYC}" ]; then SAVEWARMICA="YES" ; fi if [ "${CDATE}" -eq "${firstday}" ] && [ "${cyc}" -eq "${ARCHICS_CYC}" ]; then SAVEWARMICB="YES" ; fi if [ "${mod}" -eq 0 ] && [ "${cyc}" -eq "${ARCHINC_CYC}" ]; then SAVEWARMICA="YES" ; fi @@ -149,13 +149,13 @@ if [ "${mod}" -eq 0 ] && [ "${cyc}" -eq "${ARCHICS_CYC}" ]; then SAVEWARMICB="YE if [ "${ARCHICS_CYC}" -eq 18 ]; then nday1=$((nday+1)) - mod1=$((nday1 % ${ARCH_WARMICFREQ})) + mod1=$((nday1 % ARCH_WARMICFREQ)) if [ "${mod1}" -eq 0 ] && [ "${cyc}" -eq "${ARCHICS_CYC}" ] ; then SAVEWARMICB="YES" ; fi if [ "${mod1}" -ne 0 ] && [ "${cyc}" -eq "${ARCHICS_CYC}" ] ; then SAVEWARMICB="NO" ; fi if [ "${CDATE}" -eq "${SDATE}" ] && [ "${cyc}" -eq "${ARCHICS_CYC}" ] ; then SAVEWARMICB="YES" ; fi fi -mod=$((nday % ${ARCH_FCSTICFREQ})) +mod=$((nday % ARCH_FCSTICFREQ)) if [ "${mod}" -eq 0 ] || [ "${CDATE}" -eq "${firstday}" ]; then SAVEFCSTIC="YES" ; fi From 11b1718bb6fc444353effa90bcc3cda287b80241 Mon Sep 17 00:00:00 2001 From: "lin.gan" Date: Wed, 16 Nov 2022 20:26:02 +0000 Subject: [PATCH 20/21] Update syntex --- scripts/exgdas_enkf_earc.sh | 2 +- scripts/exglobal_archive.sh | 11 ----------- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/scripts/exgdas_enkf_earc.sh b/scripts/exgdas_enkf_earc.sh index ba1b44186f4..b447cf27b60 100755 --- a/scripts/exgdas_enkf_earc.sh +++ b/scripts/exgdas_enkf_earc.sh @@ -51,7 +51,7 @@ if (( 10#${ENSGRP} > 0 )) && [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; nday=$(( (mm-1)*30+dd )) mod=$((nday % ${ARCH_WARMICFREQ})) if [ "${CDATE}" -eq "${firstday}" ] && [ "${cyc}" -eq "${EARCINC_CYC}" ]; then SAVEWARMICA="YES" ; fi - if [ "${CDATE}" -eq "${firstday}" ] && { "${cyc}" -eq "${EARCICS_CYC}" ]; then SAVEWARMICB="YES" ; fi + if [ "${CDATE}" -eq "${firstday}" ] && [ "${cyc}" -eq "${EARCICS_CYC}" ]; then SAVEWARMICB="YES" ; fi if [ "${mod}" -eq 0 -a "${cyc}" ] && [ "${EARCINC_CYC}" ]; then SAVEWARMICA="YES" ; fi if [ "${mod}" -eq 0 -a "${cyc}" ] && [ "${EARCICS_CYC}" ]; then SAVEWARMICB="YES" ; fi diff --git a/scripts/exglobal_archive.sh b/scripts/exglobal_archive.sh index e57f257bedb..9376186a2a1 100755 --- a/scripts/exglobal_archive.sh +++ b/scripts/exglobal_archive.sh @@ -2,17 +2,6 @@ source "${HOMEgfs}/ush/preamble.sh" -############################################################### -## Abstract: -## Archive driver script -## RUN_ENVIR : runtime environment (emc | nco) -## HOMEgfs : /full/path/to/workflow -## EXPDIR : /full/path/to/config/files -## CDATE : current analysis date (YYYYMMDDHH) -## CDUMP : cycle name (gdas / gfs) -## PDY : current date (YYYYMMDD) -## cyc : current cycle (HH) -############################################################### ############################################## # Begin JOB SPECIFIC work ############################################## From 823f5f6cbed2a982901e57d5703a19512d67f9d4 Mon Sep 17 00:00:00 2001 From: "lin.gan" Date: Wed, 16 Nov 2022 20:36:25 +0000 Subject: [PATCH 21/21] If statement update for exgdas_enkf_earc --- scripts/exgdas_enkf_earc.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/exgdas_enkf_earc.sh b/scripts/exgdas_enkf_earc.sh index b447cf27b60..ce0d4166636 100755 --- a/scripts/exgdas_enkf_earc.sh +++ b/scripts/exgdas_enkf_earc.sh @@ -49,15 +49,15 @@ if (( 10#${ENSGRP} > 0 )) && [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; mm=$(echo "${CDATE}"|cut -c 5-6) dd=$(echo "${CDATE}"|cut -c 7-8) nday=$(( (mm-1)*30+dd )) - mod=$((nday % ${ARCH_WARMICFREQ})) + mod=$((nday % ARCH_WARMICFREQ)) if [ "${CDATE}" -eq "${firstday}" ] && [ "${cyc}" -eq "${EARCINC_CYC}" ]; then SAVEWARMICA="YES" ; fi if [ "${CDATE}" -eq "${firstday}" ] && [ "${cyc}" -eq "${EARCICS_CYC}" ]; then SAVEWARMICB="YES" ; fi - if [ "${mod}" -eq 0 -a "${cyc}" ] && [ "${EARCINC_CYC}" ]; then SAVEWARMICA="YES" ; fi - if [ "${mod}" -eq 0 -a "${cyc}" ] && [ "${EARCICS_CYC}" ]; then SAVEWARMICB="YES" ; fi + if [ "${mod}" -eq 0 ] && [ "${cyc}" ] && [ "${EARCINC_CYC}" ]; then SAVEWARMICA="YES" ; fi + if [ "${mod}" -eq 0 ] && [ "${cyc}" ] && [ "${EARCICS_CYC}" ]; then SAVEWARMICB="YES" ; fi if [ "${EARCICS_CYC}" -eq 18 ]; then nday1=$((nday+1)) - mod1=$((nday1 % ${ARCH_WARMICFREQ})) + mod1=$((nday1 % ARCH_WARMICFREQ)) if [ "${mod1}" -eq 0 ] && [ "${cyc}" -eq "${EARCICS_CYC}" ] ; then SAVEWARMICB="YES" ; fi if [ "${mod1}" -ne 0 ] && [ "${cyc}" -eq "${EARCICS_CYC}" ] ; then SAVEWARMICB="NO" ; fi if [ "${CDATE}" -eq "${SDATE}" ] && [ "${cyc}" -eq "${EARCICS_CYC}" ] ; then SAVEWARMICB="YES" ; fi