From 47954ecb59e44268fc5efd7bf5f2df22c5001d5b Mon Sep 17 00:00:00 2001 From: Rahul Mahajan Date: Thu, 28 Jul 2022 14:03:09 -0400 Subject: [PATCH] bring GDASApp jjobs and exscripts to global-workflow --- .gitignore | 6 - jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_POST | 123 +++++++++++++ jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_PREP | 123 +++++++++++++ jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_RUN | 123 +++++++++++++ jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_POST | 126 +++++++++++++ jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_PREP | 126 +++++++++++++ jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_RUN | 126 +++++++++++++ scripts/exgdas_global_atmos_analysis_post.py | 45 +++++ scripts/exgdas_global_atmos_analysis_prep.py | 44 +++++ scripts/exgdas_global_atmos_analysis_run.sh | 181 +++++++++++++++++++ scripts/exgdas_global_atmos_ensanal_post.py | 44 +++++ scripts/exgdas_global_atmos_ensanal_run.sh | 172 ++++++++++++++++++ sorc/link_workflow.sh | 7 - 13 files changed, 1233 insertions(+), 13 deletions(-) create mode 100755 jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_POST create mode 100755 jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_PREP create mode 100755 jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_RUN create mode 100755 jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_POST create mode 100755 jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_PREP create mode 100755 jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_RUN create mode 100755 scripts/exgdas_global_atmos_analysis_post.py create mode 100755 scripts/exgdas_global_atmos_analysis_prep.py create mode 100755 scripts/exgdas_global_atmos_analysis_run.sh create mode 100755 scripts/exgdas_global_atmos_ensanal_post.py create mode 100755 scripts/exgdas_global_atmos_ensanal_run.sh diff --git a/.gitignore b/.gitignore index 6f5a7da9c58..60151e3ab07 100644 --- a/.gitignore +++ b/.gitignore @@ -146,12 +146,6 @@ jobs/JGFS_ATMOS_WAFS_BLENDING_0P25 jobs/JGFS_ATMOS_WAFS_GCIP jobs/JGFS_ATMOS_WAFS_GRIB2 jobs/JGFS_ATMOS_WAFS_GRIB2_0P25 -jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_POST -jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_PREP -jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_RUN -jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_POST -jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_PREP -jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_RUN # scripts symlinks scripts/exemcsfc_global_sfc_prep.sh scripts/exgdas_atmos_gldas.sh diff --git a/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_POST b/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_POST new file mode 100755 index 00000000000..77846954453 --- /dev/null +++ b/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_POST @@ -0,0 +1,123 @@ +#!/bin/bash +##set -ex +set -x +set -u + +export PS4='$SECONDS + ' +date + + +############################# +# Source relevant config files +############################# +export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} +configs="base atmanal atmanalpost" +config_path=${EXPDIR:-$NWROOT/gfs.${gfs_ver}/parm/config} +for config in $configs; do + . $config_path/config.$config + status=$? + [[ $status -ne 0 ]] && exit $status +done + + +########################################## +# Source machine runtime environment +########################################## +. $HOMEgfs/env/${machine}.env atmanalpost +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 || (echo "$DATA does not exist. ABORT!"; exit 1) + + +############################################## +# 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 +############################################## + +export GDATE=$(date +%Y%m%d%H -d "${CDATE:0:8} ${CDATE:8:2} - ${assim_freq} hours") +gPDY=${GDATE:0:8} +export gcyc=${GDATE:8:2} +export GDUMP=${GDUMP:-"gdas"} + +export OPREFIX="${CDUMP}.t${cyc}z." +export GPREFIX="${GDUMP}.t${gcyc}z." +export APREFIX="${CDUMP}.t${cyc}z." +export GSUFFIX=${GSUFFIX:-$SUFFIX} +export ASUFFIX=${ASUFFIX:-$SUFFIX} + +export COMOUT=${COMOUT:-$ROTDIR/$CDUMP.$PDY/$cyc/$COMPONENT} + +mkdir -p $COMOUT + +# COMIN_GES and COMIN_GES_ENS are used in script +export COMIN_GES="$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT" +export COMIN_GES_ENS="$ROTDIR/enkf$GDUMP.$gPDY/$gcyc/$COMPONENT" + +# NOTE BELOW IS A HACK FOR TESTING +# PLEASE FIX THIS LATER +# ASK @aerorahul +# HOW TO HANDLE DIFFERENT COMPILERS/ETC. FOR MODEL VS DA +# PROD_UTIL, ETC. DO NOT EXIST FOR JEDI MODULE VERSIONS +module purge +module use $HOMEgfs/sorc/gdas.cd/modulefiles +module load GDAS/orion +export PYTHONPATH=$HOMEgfs/sorc/gdas.cd/ush/:$PYTHONPATH + +############################################################### +# Run relevant script + +EXSCRIPT=${GDASPOSTPY:-$HOMEgfs/sorc/gdas.cd/scripts/exgdas_global_atmos_analysis_post.py} +$EXSCRIPT +status=$? +[[ $status -ne 0 ]] && exit $status + +############################################## +# End JOB SPECIFIC work +############################################## + +############################################## +# Final processing +############################################## +if [ -e "$pgmout" ] ; then + cat $pgmout +fi + +########################################## +# Remove the Temporary working directory +########################################## +cd $DATAROOT +[[ $KEEPDATA = "NO" ]] && rm -rf $DATA + +date +exit 0 diff --git a/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_PREP b/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_PREP new file mode 100755 index 00000000000..cde886e36b3 --- /dev/null +++ b/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_PREP @@ -0,0 +1,123 @@ +#!/bin/bash +##set -ex +set -x +set -u + +export PS4='$SECONDS + ' +date + + +############################# +# Source relevant config files +############################# +export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} +configs="base atmanal atmanalprep" +config_path=${EXPDIR:-$NWROOT/gfs.${gfs_ver}/parm/config} +for config in $configs; do + . $config_path/config.$config + status=$? + [[ $status -ne 0 ]] && exit $status +done + + +########################################## +# Source machine runtime environment +########################################## +. $HOMEgfs/env/${machine}.env atmanalprep +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 || (echo "$DATA does not exist. ABORT!"; exit 1) + + +############################################## +# 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 +############################################## + +export GDATE=$(date +%Y%m%d%H -d "${CDATE:0:8} ${CDATE:8:2} - ${assim_freq} hours") +gPDY=${GDATE:0:8} +export gcyc=${GDATE:8:2} +export GDUMP=${GDUMP:-"gdas"} + +export OPREFIX="${CDUMP}.t${cyc}z." +export GPREFIX="${GDUMP}.t${gcyc}z." +export APREFIX="${CDUMP}.t${cyc}z." +export GSUFFIX=${GSUFFIX:-$SUFFIX} +export ASUFFIX=${ASUFFIX:-$SUFFIX} + +export COMOUT=${COMOUT:-$ROTDIR/$CDUMP.$PDY/$cyc/$COMPONENT} + +mkdir -p $COMOUT + +# COMIN_GES and COMIN_GES_ENS are used in script +export COMIN_GES="$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT" +export COMIN_GES_ENS="$ROTDIR/enkf$GDUMP.$gPDY/$gcyc/$COMPONENT" + +# NOTE BELOW IS A HACK FOR TESTING +# PLEASE FIX THIS LATER +# ASK @aerorahul +# HOW TO HANDLE DIFFERENT COMPILERS/ETC. FOR MODEL VS DA +# PROD_UTIL, ETC. DO NOT EXIST FOR JEDI MODULE VERSIONS +module purge +module use $HOMEgfs/sorc/gdas.cd/modulefiles +module load GDAS/orion +export PYTHONPATH=$HOMEgfs/sorc/gdas.cd/ush/:$PYTHONPATH + +############################################################### +# Run relevant script + +EXSCRIPT=${GDASPREPPY:-$HOMEgfs/sorc/gdas.cd/scripts/exgdas_global_atmos_analysis_prep.py} +$EXSCRIPT +status=$? +[[ $status -ne 0 ]] && exit $status + +############################################## +# End JOB SPECIFIC work +############################################## + +############################################## +# Final processing +############################################## +if [ -e "$pgmout" ] ; then + cat $pgmout +fi + +########################################## +# Remove the Temporary working directory +########################################## +cd $DATAROOT +[[ $KEEPDATA = "NO" ]] && rm -rf $DATA + +date +exit 0 diff --git a/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_RUN b/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_RUN new file mode 100755 index 00000000000..aadf4d7a420 --- /dev/null +++ b/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_RUN @@ -0,0 +1,123 @@ +#!/bin/bash +##set -ex +set -x +set -u + +export PS4='$SECONDS + ' +date + + +############################# +# Source relevant config files +############################# +export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} +configs="base atmanal atmanalrun" +config_path=${EXPDIR:-$NWROOT/gfs.${gfs_ver}/parm/config} +for config in $configs; do + . $config_path/config.$config + status=$? + [[ $status -ne 0 ]] && exit $status +done + + +########################################## +# Source machine runtime environment +########################################## +. $HOMEgfs/env/${machine}.env atmanalrun +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 || (echo "$DATA does not exist. ABORT!"; exit 1) + + +############################################## +# 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 +############################################## + +export GDATE=$(date +%Y%m%d%H -d "${CDATE:0:8} ${CDATE:8:2} - ${assim_freq} hours") +gPDY=${GDATE:0:8} +export gcyc=${GDATE:8:2} +export GDUMP=${GDUMP:-"gdas"} + +export OPREFIX="${CDUMP}.t${cyc}z." +export GPREFIX="${GDUMP}.t${gcyc}z." +export APREFIX="${CDUMP}.t${cyc}z." +export GSUFFIX=${GSUFFIX:-$SUFFIX} +export ASUFFIX=${ASUFFIX:-$SUFFIX} + +export COMOUT=${COMOUT:-$ROTDIR/$CDUMP.$PDY/$cyc/$COMPONENT} + +mkdir -p $COMOUT + +# COMIN_GES and COMIN_GES_ENS are used in script +export COMIN_GES="$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT" +export COMIN_GES_ENS="$ROTDIR/enkf$GDUMP.$gPDY/$gcyc/$COMPONENT" + +# NOTE BELOW IS A HACK FOR TESTING +# PLEASE FIX THIS LATER +# ASK @aerorahul +# HOW TO HANDLE DIFFERENT COMPILERS/ETC. FOR MODEL VS DA +# PROD_UTIL, ETC. DO NOT EXIST FOR JEDI MODULE VERSIONS +module purge +module use $HOMEgfs/sorc/gdas.cd/modulefiles +module load GDAS/orion +export PYTHONPATH=$HOMEgfs/sorc/gdas.cd/ush/:$PYTHONPATH + +############################################################### +# Run relevant script + +EXSCRIPT=${GDASRUNSH:-$HOMEgfs/sorc/gdas.cd/scripts/exgdas_global_atmos_analysis_run.sh} +$EXSCRIPT +status=$? +[[ $status -ne 0 ]] && exit $status + +############################################## +# End JOB SPECIFIC work +############################################## + +############################################## +# Final processing +############################################## +if [ -e "$pgmout" ] ; then + cat $pgmout +fi + +########################################## +# Remove the Temporary working directory +########################################## +cd $DATAROOT +[[ $KEEPDATA = "NO" ]] && rm -rf $DATA + +date +exit 0 diff --git a/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_POST b/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_POST new file mode 100755 index 00000000000..f1e85447d25 --- /dev/null +++ b/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_POST @@ -0,0 +1,126 @@ +#!/bin/bash +##set -ex +set -x +set -u + +export PS4='$SECONDS + ' +date + + +############################# +# Source relevant config files +############################# +export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} +configs="base atmensanal atmensanalpost" +config_path=${EXPDIR:-$NWROOT/gfs.${gfs_ver}/parm/config} +for config in $configs; do + . $config_path/config.$config + status=$? + [[ $status -ne 0 ]] && exit $status +done + + +########################################## +# Source machine runtime environment +########################################## +. $HOMEgfs/env/${machine}.env atmensanalpost +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 || (echo "$DATA does not exist. ABORT!"; exit 1) + + +############################################## +# 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 +############################################## + +export GDATE=$(date +%Y%m%d%H -d "${CDATE:0:8} ${CDATE:8:2} - ${assim_freq} hours") +gPDY=${GDATE:0:8} +export gcyc=${GDATE:8:2} +export GDUMP=${GDUMP:-"gdas"} + +export OPREFIX="${CDUMP}.t${cyc}z." +export GPREFIX="${GDUMP}.t${gcyc}z." +export APREFIX="${CDUMP}.t${cyc}z." +export GSUFFIX=${GSUFFIX:-$SUFFIX} +export ASUFFIX=${ASUFFIX:-$SUFFIX} + +export COMOUT=${COMOUT:-$ROTDIR/$CDUMP.$PDY/$cyc/$COMPONENT} +export COMOUT_ENS=${COMOUT_ENS:-$ROTDIR/enkf$CDUMP.$PDY/$cyc/$COMPONENT} + +mkdir -p $COMOUT +mkdir -p $COMOUT_ENS + +# COMIN_GES and COMIN_GES_ENS are used in script +export COMIN="$ROTDIR/$CDUMP.$PDY/$cyc/$COMPONENT" +export COMIN_GES="$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT" +export COMIN_GES_ENS="$ROTDIR/enkf$GDUMP.$gPDY/$gcyc/$COMPONENT" + +# NOTE BELOW IS A HACK FOR TESTING +# PLEASE FIX THIS LATER +# ASK @aerorahul +# HOW TO HANDLE DIFFERENT COMPILERS/ETC. FOR MODEL VS DA +# PROD_UTIL, ETC. DO NOT EXIST FOR JEDI MODULE VERSIONS +module purge +module use $HOMEgfs/sorc/gdas.cd/modulefiles +module load GDAS/orion +export PYTHONPATH=$HOMEgfs/sorc/gdas.cd/ush/:$PYTHONPATH + +############################################################### +# Run relevant script + +EXSCRIPT=${GDASPOSTPY:-$HOMEgfs/sorc/gdas.cd/scripts/exgdas_global_atmos_ensanal_post.py} +$EXSCRIPT +status=$? +[[ $status -ne 0 ]] && exit $status + +############################################## +# End JOB SPECIFIC work +############################################## + +############################################## +# Final processing +############################################## +if [ -e "$pgmout" ] ; then + cat $pgmout +fi + +########################################## +# Remove the Temporary working directory +########################################## +cd $DATAROOT +[[ $KEEPDATA = "NO" ]] && rm -rf $DATA + +date +exit 0 diff --git a/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_PREP b/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_PREP new file mode 100755 index 00000000000..618984bcab1 --- /dev/null +++ b/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_PREP @@ -0,0 +1,126 @@ +#!/bin/bash +##set -ex +set -x +set -u + +export PS4='$SECONDS + ' +date + + +############################# +# Source relevant config files +############################# +export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} +configs="base atmensanal atmensanalprep" +config_path=${EXPDIR:-$NWROOT/gfs.${gfs_ver}/parm/config} +for config in $configs; do + . $config_path/config.$config + status=$? + [[ $status -ne 0 ]] && exit $status +done + + +########################################## +# Source machine runtime environment +########################################## +. $HOMEgfs/env/${machine}.env atmensanalprep +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 || (echo "$DATA does not exist. ABORT!"; exit 1) + + +############################################## +# 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 +############################################## + +export GDATE=$(date +%Y%m%d%H -d "${CDATE:0:8} ${CDATE:8:2} - ${assim_freq} hours") +gPDY=${GDATE:0:8} +export gcyc=${GDATE:8:2} +export GDUMP=${GDUMP:-"gdas"} + +export OPREFIX="${CDUMP}.t${cyc}z." +export GPREFIX="${GDUMP}.t${gcyc}z." +export APREFIX="${CDUMP}.t${cyc}z." +export GSUFFIX=${GSUFFIX:-$SUFFIX} +export ASUFFIX=${ASUFFIX:-$SUFFIX} + +export COMOUT=${COMOUT:-$ROTDIR/$CDUMP.$PDY/$cyc/$COMPONENT} +export COMOUT_ENS=${COMOUT_ENS:-$ROTDIR/enkf$CDUMP.$PDY/$cyc/$COMPONENT} + +mkdir -p $COMOUT +mkdir -p $COMOUT_ENS + +# COMIN_GES and COMIN_GES_ENS are used in script +export COMIN="$ROTDIR/$CDUMP.$PDY/$cyc/$COMPONENT" +export COMIN_GES="$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT" +export COMIN_GES_ENS="$ROTDIR/enkf$GDUMP.$gPDY/$gcyc/$COMPONENT" + +# NOTE BELOW IS A HACK FOR TESTING +# PLEASE FIX THIS LATER +# ASK @aerorahul +# HOW TO HANDLE DIFFERENT COMPILERS/ETC. FOR MODEL VS DA +# PROD_UTIL, ETC. DO NOT EXIST FOR JEDI MODULE VERSIONS +module purge +module use $HOMEgfs/sorc/gdas.cd/modulefiles +module load GDAS/orion +export PYTHONPATH=$HOMEgfs/sorc/gdas.cd/ush/:$PYTHONPATH + +############################################################### +# Run relevant script + +EXSCRIPT=${GDASPREPPY:-$HOMEgfs/sorc/gdas.cd/scripts/exgdas_global_atmos_analysis_prep.py} +$EXSCRIPT +status=$? +[[ $status -ne 0 ]] && exit $status + +############################################## +# End JOB SPECIFIC work +############################################## + +############################################## +# Final processing +############################################## +if [ -e "$pgmout" ] ; then + cat $pgmout +fi + +########################################## +# Remove the Temporary working directory +########################################## +cd $DATAROOT +[[ $KEEPDATA = "NO" ]] && rm -rf $DATA + +date +exit 0 diff --git a/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_RUN b/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_RUN new file mode 100755 index 00000000000..d3b2c7f90ea --- /dev/null +++ b/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_RUN @@ -0,0 +1,126 @@ +#!/bin/bash +##set -ex +set -x +set -u + +export PS4='$SECONDS + ' +date + + +############################# +# Source relevant config files +############################# +export EXPDIR=${EXPDIR:-$HOMEgfs/parm/config} +configs="base atmensanal atmensanalrun" +config_path=${EXPDIR:-$NWROOT/gfs.${gfs_ver}/parm/config} +for config in $configs; do + . $config_path/config.$config + status=$? + [[ $status -ne 0 ]] && exit $status +done + + +########################################## +# Source machine runtime environment +########################################## +. $HOMEgfs/env/${machine}.env atmensanalrun +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 || (echo "$DATA does not exist. ABORT!"; exit 1) + + +############################################## +# 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 +############################################## + +export GDATE=$(date +%Y%m%d%H -d "${CDATE:0:8} ${CDATE:8:2} - ${assim_freq} hours") +gPDY=${GDATE:0:8} +export gcyc=${GDATE:8:2} +export GDUMP=${GDUMP:-"gdas"} + +export OPREFIX="${CDUMP}.t${cyc}z." +export GPREFIX="${GDUMP}.t${gcyc}z." +export APREFIX="${CDUMP}.t${cyc}z." +export GSUFFIX=${GSUFFIX:-$SUFFIX} +export ASUFFIX=${ASUFFIX:-$SUFFIX} + +export COMOUT=${COMOUT:-$ROTDIR/$CDUMP.$PDY/$cyc/$COMPONENT} +export COMOUT_ENS=${COMOUT_ENS:-$ROTDIR/enkf$CDUMP.$PDY/$cyc/$COMPONENT} + +mkdir -p $COMOUT +mkdir -p $COMOUT_ENS + +# COMIN_GES and COMIN_GES_ENS are used in script +export COMIN="$ROTDIR/$CDUMP.$PDY/$cyc/$COMPONENT" +export COMIN_GES="$ROTDIR/$GDUMP.$gPDY/$gcyc/$COMPONENT" +export COMIN_GES_ENS="$ROTDIR/enkf$GDUMP.$gPDY/$gcyc/$COMPONENT" + +# NOTE BELOW IS A HACK FOR TESTING +# PLEASE FIX THIS LATER +# ASK @aerorahul +# HOW TO HANDLE DIFFERENT COMPILERS/ETC. FOR MODEL VS DA +# PROD_UTIL, ETC. DO NOT EXIST FOR JEDI MODULE VERSIONS +module purge +module use $HOMEgfs/sorc/gdas.cd/modulefiles +module load GDAS/orion +export PYTHONPATH=$HOMEgfs/sorc/gdas.cd/ush/:$PYTHONPATH + +############################################################### +# Run relevant script + +EXSCRIPT=${GDASRUNSH:-$HOMEgfs/sorc/gdas.cd/scripts/exgdas_global_atmos_ensanal_run.sh} +$EXSCRIPT +status=$? +[[ $status -ne 0 ]] && exit $status + +############################################## +# End JOB SPECIFIC work +############################################## + +############################################## +# Final processing +############################################## +if [ -e "$pgmout" ] ; then + cat $pgmout +fi + +########################################## +# Remove the Temporary working directory +########################################## +cd $DATAROOT +[[ $KEEPDATA = "NO" ]] && rm -rf $DATA + +date +exit 0 diff --git a/scripts/exgdas_global_atmos_analysis_post.py b/scripts/exgdas_global_atmos_analysis_post.py new file mode 100755 index 00000000000..2f17ee4aea2 --- /dev/null +++ b/scripts/exgdas_global_atmos_analysis_post.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +################################################################################ +# UNIX Script Documentation Block +# . . +# Script name: exgdas_global_atmos_analysis_post.py +# Script description: Post atmospheric analysis script. +# +# Author: Cory Martin Org: NCEP/EMC Date: 2021-12-29 +# +# Abstract: This script runs after the atmospheric analysis and +# archives each diagnostic file into the R2D2 local user database. +# +# $Id$ +# +# Attributes: +# Language: Python3 +# +################################################################################ + +# import os and sys to add ush to path +import logging +import os +import sys + +# set up logger +logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S') + +# get absolute path of ush/ directory either from env or relative to this file +my_dir = os.path.dirname(__file__) +my_home = os.path.dirname(os.path.dirname(my_dir)) +gdas_home = os.path.join(os.environ['HOMEgfs'], 'sorc', 'gdas.cd') +sys.path.append(os.path.join(os.getenv('HOMEgfs', my_home), 'ush')) +logging.info(f"sys.path={sys.path}") + +# import UFSDA utilities +import ufsda + +# get configuration based on environment variables +config = ufsda.misc_utils.get_env_config(component='atm') +config['DIAG_DIR'] = os.path.join(os.environ['COMOUT'], 'diags') +config['BIAS_OUT_DIR'] = os.path.join(os.environ['COMOUT'], 'bc') +config['provider'] = 'ncdiag' + +# use R2D2 to archive diags and bias correction coefficient files +ufsda.archive.atm_diags(config) diff --git a/scripts/exgdas_global_atmos_analysis_prep.py b/scripts/exgdas_global_atmos_analysis_prep.py new file mode 100755 index 00000000000..fc48c5d0600 --- /dev/null +++ b/scripts/exgdas_global_atmos_analysis_prep.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 +################################################################################ +# UNIX Script Documentation Block +# . . +# Script name: exgdas_global_atmos_analysis_prep.py +# Script description: Stages files and generates YAML for Global Atmosphere Analysis +# +# Author: Cory Martin Org: NCEP/EMC Date: 2021-12-21 +# +# Abstract: This script stages necessary input files and produces YAML +# configuration input file for FV3-JEDI executable(s) needed +# to produce a UFS Global Atmospheric Analysis. +# +# $Id$ +# +# Attributes: +# Language: Python3 +# +################################################################################ + +# import os and sys to add ush to path +import logging +import os +import sys + +# set up logger +logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S') + +# get absolute path of ush/ directory either from env or relative to this file +my_dir = os.path.dirname(__file__) +my_home = os.path.dirname(os.path.dirname(my_dir)) +gdas_home = os.path.join(os.environ['HOMEgfs'], 'sorc', 'gdas.cd') +sys.path.append(os.path.join(os.getenv('HOMEgfs', my_home), 'ush')) +logging.info(f"sys.path={sys.path}") + +# import UFSDA utilities +import ufsda + +# get configuration based on environment variables +config = ufsda.misc_utils.get_env_config(component='atm') + +# use R2D2 to stage obs and bias correction coefficient files +ufsda.stage.atm_obs(config) +ufsda.stage.bias_obs(config) diff --git a/scripts/exgdas_global_atmos_analysis_run.sh b/scripts/exgdas_global_atmos_analysis_run.sh new file mode 100755 index 00000000000..b5aaf24cbc2 --- /dev/null +++ b/scripts/exgdas_global_atmos_analysis_run.sh @@ -0,0 +1,181 @@ +#!/bin/bash +################################################################################ +#### UNIX Script Documentation Block +# . . +# Script name: exgdas_global_atmos_analysis_run.sh +# Script description: Runs the global atmospheric analysis with FV3-JEDI +# +# Author: Cory Martin Org: NCEP/EMC Date: 2021-12-28 +# +# Abstract: This script makes a global model atmospheric analysis using FV3-JEDI +# and also (for now) updates increment files using a python ush utility +# +# $Id$ +# +# Attributes: +# Language: POSIX shell +# Machine: Orion +# +################################################################################ + +# Set environment. +export VERBOSE=${VERBOSE:-"YES"} +if [ $VERBOSE = "YES" ]; then + echo $(date) EXECUTING $0 $* >&2 + set -x +fi + +# Directories +pwd=$(pwd) + +# Utilities +export NLN=${NLN:-"/bin/ln -sf"} +export INCPY=${INCPY:-"$HOMEgfs/sorc/gdas.cd/ush/jediinc2fv3.py"} +export GENYAML=${GENYAML:-"$HOMEgfs/sorc/gdas.cd/ush/genYAML"} +export GETOBSYAML=${GETOBSYAML:-"$HOMEgfs/sorc/gdas.cd/ush/get_obs_list.py"} + +################################################################################ +# make subdirectories +mkdir -p $DATA/fv3jedi +mkdir -p $DATA/obs +mkdir -p $DATA/diags +mkdir -p $DATA/bc +mkdir -p $DATA/anl + +################################################################################ +# generate YAML file +cat > $DATA/temp.yaml << EOF +template: ${ATMVARYAML} +output: $DATA/fv3jedi_var.yaml +config: + atm: true + BERROR_YAML: $BERROR_YAML + OBS_DIR: obs + DIAG_DIR: diags + CRTM_COEFF_DIR: crtm + BIAS_IN_DIR: obs + BIAS_OUT_DIR: bc + OBS_PREFIX: $OPREFIX + BIAS_PREFIX: $GPREFIX + OBS_LIST: $OBS_LIST + OBS_YAML_DIR: $OBS_YAML_DIR + BKG_DIR: bkg + fv3jedi_staticb_dir: berror + fv3jedi_fix_dir: fv3jedi + fv3jedi_fieldset_dir: fv3jedi + fv3jedi_fieldmetadata_dir: fv3jedi + OBS_DATE: '$CDATE' + BIAS_DATE: '$GDATE' + ANL_DIR: anl/ + NMEM_ENKF: '$NMEM_ENKF' + INTERP_METHOD: '$INTERP_METHOD' +EOF +$GENYAML --config $DATA/temp.yaml + +################################################################################ +# link observations to $DATA +$GETOBSYAML --config $DATA/fv3jedi_var.yaml --output $DATA/${OPREFIX}obsspace_list +files=$(cat $DATA/${OPREFIX}obsspace_list) +for file in $files; do + basefile=$(basename $file) + $NLN $COMOUT/$basefile $DATA/obs/$basefile +done + +# link backgrounds to $DATA +# linking FMS RESTART files for now +# change to (or make optional) for cube sphere history later +$NLN ${COMIN_GES}/RESTART $DATA/bkg + + +# optionally link ensemble backgrounds to $DATA +if [ $DOHYBVAR = "YES" ]; then + mkdir -p $DATA/ens + fhrs="06" + if [ $l4densvar = ".true." ]; then + fhrs="03 04 05 06 07 08 09" + fi + + for imem in $(seq 1 $NMEM_ENKF); do + memchar="mem"$(printf %03i $imem) + for fhr in $fhrs; do + $NLN ${COMIN_GES_ENS}/$memchar/RESTART $DATA/ens/$memchar + done + done + +fi + +################################################################################ +# link fix files to $DATA +# static B +CASE_BERROR=${CASE_BERROR:-${CASE_ANL:-$CASE}} +$NLN $FV3JEDI_FIX/bump/$CASE_BERROR/ $DATA/berror + +# vertical coordinate +LAYERS=$(expr $LEVS - 1) +$NLN $FV3JEDI_FIX/fv3jedi/fv3files/akbk${LAYERS}.nc4 $DATA/fv3jedi/akbk.nc4 + +# other FV3-JEDI fix files +$NLN $FV3JEDI_FIX/fv3jedi/fv3files/fmsmpp.nml $DATA/fv3jedi/fmsmpp.nml +$NLN $FV3JEDI_FIX/fv3jedi/fv3files/field_table_gfdl $DATA/fv3jedi/field_table + +# fieldmetadata +$NLN $FV3JEDI_FIX/fv3jedi/fieldmetadata/gfs-restart.yaml $DATA/fv3jedi/gfs-restart.yaml + +# fieldsets +fieldsets="dynamics.yaml ufo.yaml" +for fieldset in $fieldsets; do + $NLN $FV3JEDI_FIX/fv3jedi/fieldsets/$fieldset $DATA/fv3jedi/$fieldset +done + +# CRTM coeffs +$NLN $FV3JEDI_FIX/crtm/2.3.0_jedi $DATA/crtm + +# Link executable to $DATA +$NLN $JEDIVAREXE $DATA/fv3jedi_var.x + +################################################################################ +# run executable +export pgm=$JEDIVAREXE +. prep_step +$APRUN_ATMANAL $DATA/fv3jedi_var.x $DATA/fv3jedi_var.yaml 1>&1 2>&2 +export err=$?; err_chk + +################################################################################ +# translate FV3-JEDI increment to FV3 readable format +atminc_jedi=$DATA/anl/atminc.${PDY}_${cyc}0000z.nc4 +atminc_fv3=$COMOUT/${CDUMP}.${cycle}.atminc.nc +if [ -s $atminc_jedi ]; then + $INCPY $atminc_jedi $atminc_fv3 + export err=$? +else + echo "***WARNING*** missing $atminc_jedi ABORT" + export err=99 +fi +err_chk + +################################################################################ +# Create log file noting creating of analysis increment file +echo "$CDUMP $CDATE atminc and tiled sfcanl done at `date`" > $COMOUT/${CDUMP}.${cycle}.loginc.txt + +################################################################################ +# Copy diags and YAML to $COMOUT +cp -r $DATA/fv3jedi_var.yaml $COMOUT/${CDUMP}.${cycle}.fv3jedi_var.yaml +cp -rf $DATA/diags $COMOUT/ +cp -rf $DATA/bc $COMOUT/ + +# ***WARNING*** PATCH +# Copy abias, abias_pc, and abias_air from previous cycle to current cycle +# Deterministic abias used in enkf cycle +alist="abias abias_air abias_int abias_pc" +for abias in $alist; do + cp $COMIN_GES/${GPREFIX}${abias} $COMOUT/${APREFIX}${abias} +done + +################################################################################ +set +x +if [ $VERBOSE = "YES" ]; then + echo $(date) EXITING $0 with return code $err >&2 +fi +exit $err + +################################################################################ diff --git a/scripts/exgdas_global_atmos_ensanal_post.py b/scripts/exgdas_global_atmos_ensanal_post.py new file mode 100755 index 00000000000..6c5384953f7 --- /dev/null +++ b/scripts/exgdas_global_atmos_ensanal_post.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 +################################################################################ +# UNIX Script Documentation Block +# . . +# Script name: exgdas_global_atmos_analysis_post.py +# Script description: Post atmospheric analysis script. +# +# Author: Cory Martin Org: NCEP/EMC Date: 2021-12-29 +# +# Abstract: This script runs after the atmospheric analysis and +# archives each diagnostic file into the R2D2 local user database. +# +# $Id$ +# +# Attributes: +# Language: Python3 +# +################################################################################ + +# import os and sys to add ush to path +import logging +import os +import sys + +# set up logger +logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S') + +# get absolute path of ush/ directory either from env or relative to this file +my_dir = os.path.dirname(__file__) +my_home = os.path.dirname(os.path.dirname(my_dir)) +gdas_home = os.path.join(os.environ['HOMEgfs'], 'sorc', 'gdas.cd') +sys.path.append(os.path.join(os.getenv('HOMEgfs', my_home), 'ush')) +logging.info(f"sys.path={sys.path}") + +# import UFSDA utilities +import ufsda + +# get configuration based on environment variables +config = ufsda.misc_utils.get_env_config(component='atm') +config['DIAG_DIR'] = os.path.join(os.environ['COMOUT_ENS'], 'diags') +config['provider'] = 'ncdiag_lgetkf' + +# use R2D2 to archive hofx files +ufsda.archive.atm_diags(config) diff --git a/scripts/exgdas_global_atmos_ensanal_run.sh b/scripts/exgdas_global_atmos_ensanal_run.sh new file mode 100755 index 00000000000..27f3339b588 --- /dev/null +++ b/scripts/exgdas_global_atmos_ensanal_run.sh @@ -0,0 +1,172 @@ +#!/bin/bash +################################################################################ +#### UNIX Script Documentation Block +# . . +# Script name: exgdas_global_atmos_analysis_run.sh +# Script description: Runs the global atmospheric analysis with FV3-JEDI +# +# Author: Cory Martin Org: NCEP/EMC Date: 2021-12-28 +# +# Abstract: This script makes a global model atmospheric analysis using FV3-JEDI +# and also (for now) updates increment files using a python ush utility +# +# $Id$ +# +# Attributes: +# Language: POSIX shell +# Machine: Orion +# +################################################################################ + +# Set environment. +export VERBOSE=${VERBOSE:-"YES"} +if [ $VERBOSE = "YES" ]; then + echo $(date) EXECUTING $0 $* >&2 + set -x +fi + +# Directories +pwd=$(pwd) + +# Utilities +export NLN=${NLN:-"/bin/ln -sf"} +export INCPY=${INCPY:-"$HOMEgfs/sorc/gdas.cd/ush/jediinc2fv3.py"} +export GENYAML=${GENYAML:-"$HOMEgfs/sorc/gdas.cd/ush/genYAML"} +export GETOBSYAML=${GETOBSYAML:-"$HOMEgfs/sorc/gdas.cd/ush/get_obs_list.py"} + +################################################################################ +# make subdirectories +mkdir -p $DATA/fv3jedi +mkdir -p $DATA/obs +mkdir -p $DATA/diags +mkdir -p $DATA/bc +mkdir -p $DATA/anl + +################################################################################ +# generate YAML file +cat > $DATA/temp.yaml << EOF +template: ${ATMENSYAML} +output: $DATA/fv3jedi_ens.yaml +config: + atm: true + BERROR_YAML: $BERROR_YAML + OBS_DIR: obs + DIAG_DIR: diags + CRTM_COEFF_DIR: crtm + BIAS_IN_DIR: obs + BIAS_OUT_DIR: bc + OBS_PREFIX: $OPREFIX + BIAS_PREFIX: $GPREFIX + OBS_LIST: $OBS_LIST + OBS_YAML_DIR: $OBS_YAML_DIR + BKG_DIR: bkg + fv3jedi_staticb_dir: berror + fv3jedi_fix_dir: fv3jedi + fv3jedi_fieldset_dir: fv3jedi + fv3jedi_fieldmetadata_dir: fv3jedi + OBS_DATE: '$CDATE' + BIAS_DATE: '$GDATE' + ANL_DIR: anl/ + NMEM_ENKF: '$NMEM_ENKF' + INTERP_METHOD: '$INTERP_METHOD' +EOF +$GENYAML --config $DATA/temp.yaml + +################################################################################ +# link observations to $DATA +$GETOBSYAML --config $DATA/fv3jedi_ens.yaml --output $DATA/${OPREFIX}obsspace_list +files=$(cat $DATA/${OPREFIX}obsspace_list) +for file in $files; do + basefile=$(basename $file) + $NLN $COMIN/$basefile $DATA/obs/$basefile +done + +# link backgrounds to $DATA +# linking FMS RESTART files for now +# change to (or make optional) for cube sphere history later +##$NLN ${COMIN_GES}/RESTART $DATA/bkg + + +# Link ensemble backgrounds to $DATA. Make directories +# for ensemble output +if [ $DOHYBVAR = "YES" -o $DO_JEDIENS = "YES" ]; then + mkdir -p $DATA/bkg + for imem in $(seq 1 $NMEM_ENKF); do + memchar="mem"$(printf %03i $imem) + mkdir -p $DATA/bkg/$memchar + $NLN ${COMIN_GES_ENS}/$memchar/RESTART $DATA/bkg/$memchar + mkdir -p $DATA/anl/$memchar + done +fi + +################################################################################ +# link fix files to $DATA +# static B +##CASE_BERROR=${CASE_BERROR:-${CASE_ANL:-$CASE}} +##$NLN $FV3JEDI_FIX/bump/$CASE_BERROR/ $DATA/berror + +# vertical coordinate +LAYERS=$(expr $LEVS - 1) +$NLN $FV3JEDI_FIX/fv3jedi/fv3files/akbk${LAYERS}.nc4 $DATA/fv3jedi/akbk.nc4 + +# other FV3-JEDI fix files +$NLN $FV3JEDI_FIX/fv3jedi/fv3files/fmsmpp.nml $DATA/fv3jedi/fmsmpp.nml +$NLN $FV3JEDI_FIX/fv3jedi/fv3files/field_table_gfdl $DATA/fv3jedi/field_table + +# fieldmetadata +$NLN $FV3JEDI_FIX/fv3jedi/fieldmetadata/gfs-restart.yaml $DATA/fv3jedi/gfs-restart.yaml + +# fieldsets +fieldsets="dynamics.yaml ufo.yaml" +for fieldset in $fieldsets; do + $NLN $FV3JEDI_FIX/fv3jedi/fieldsets/$fieldset $DATA/fv3jedi/$fieldset +done + +# CRTM coeffs +$NLN $FV3JEDI_FIX/crtm/2.3.0_jedi $DATA/crtm + +# Link executable to $DATA +$NLN $JEDIENSEXE $DATA/fv3jedi_ens.x + +################################################################################ +# run executable +export pgm=$JEDIVAREXE +. prep_step +$APRUN_ATMENSANAL $DATA/fv3jedi_ens.x $DATA/fv3jedi_ens.yaml 1>&1 2>&2 +export err=$?; err_chk + +################################################################################ +# translate FV3-JEDI increment to FV3 readable format +for imem in $(seq 1 $NMEM_ENKF); do + memchar="mem"$(printf %03i $imem) + atminc_jedi=$DATA/anl/$memchar/atminc.${PDY}_${cyc}0000z.nc4 + atminc_fv3=$COMOUT_ENS/$memchar/${CDUMP}.${cycle}.atminc.nc + mkdir -p $COMOUT_ENS/$memchar + if [ -s $atminc_jedi ]; then + $INCPY $atminc_jedi $atminc_fv3 + export err=$? + else + echo "***WARNING*** missing $atminc_jedi ABORT" + export err=99 + fi + err_chk +done + +################################################################################ +# Create log file noting creating of analysis increment file +echo "$CDUMP $CDATE atminc done at `date`" > $COMOUT_ENS/${CDUMP}.${cycle}.loginc.txt + +################################################################################ +# Copy diags and YAML to $COMOUT +cp -r $DATA/fv3jedi_ens.yaml $COMOUT_ENS/${CDUMP}.${cycle}.fv3jedi_ens.yaml +cp -rf $DATA/diags $COMOUT_ENS/ + + +################################################################################ +set +x +if [ $VERBOSE = "YES" ]; then + echo $(date) EXITING $0 with return code $err >&2 +fi +exit $err + +################################################################################ diff --git a/sorc/link_workflow.sh b/sorc/link_workflow.sh index df44202afe1..8eb45859224 100755 --- a/sorc/link_workflow.sh +++ b/sorc/link_workflow.sh @@ -160,13 +160,6 @@ fi #--add GDASApp files #------------------------------ if [ -d ../sorc/gdas.cd ]; then - cd ${pwd}/../jobs ||exit 8 - $LINK ../sorc/gdas.cd/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_PREP . - $LINK ../sorc/gdas.cd/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_RUN . - $LINK ../sorc/gdas.cd/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_POST . - $LINK ../sorc/gdas.cd/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_PREP . - $LINK ../sorc/gdas.cd/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_RUN . - $LINK ../sorc/gdas.cd/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_POST . cd ${pwd}/../ush ||exit 8 $LINK ../sorc/gdas.cd/ush/ufsda . fi