diff --git a/env/CONTAINER.env b/env/CONTAINER.env index 48014ab313d..378b046944e 100755 --- a/env/CONTAINER.env +++ b/env/CONTAINER.env @@ -4,8 +4,7 @@ if [[ $# -ne 1 ]]; then echo "Must specify an input argument to set runtime environment variables!" echo "argument can be any one of the following:" - echo "atmanalrun atmensanalrun" - echo "aeroanlrun" + echo "atmanlrun atmensanlrun aeroanlrun" echo "anal sfcanl fcst post vrfy metp" echo "eobs eupd ecen efcs epos" echo "postsnd awips gempak" diff --git a/env/HERA.env b/env/HERA.env index f2be166dced..d9024b9e5e3 100755 --- a/env/HERA.env +++ b/env/HERA.env @@ -4,8 +4,7 @@ if [[ $# -ne 1 ]]; then echo "Must specify an input argument to set runtime environment variables!" echo "argument can be any one of the following:" - echo "atmanalrun atmensanalrun" - echo "aeroanlrun" + echo "atmanlrun atmensanlrun aeroanlrun" echo "anal sfcanl fcst post vrfy metp" echo "eobs eupd ecen efcs epos" echo "postsnd awips gempak" @@ -49,29 +48,25 @@ elif [[ "${step}" = "waveinit" ]] || [[ "${step}" = "waveprep" ]] || [[ "${step} export wavempexec=${launcher} export wave_mpmd=${mpmd_opt} -elif [[ "${step}" = "atmanalrun" ]]; then +elif [[ "${step}" = "atmanlrun" ]]; then - export CFP_MP=${CFP_MP:-"YES"} - export USE_CFP=${USE_CFP:-"YES"} export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" - nth_max=$((npe_node_max / npe_node_atmanalrun)) + nth_max=$((npe_node_max / npe_node_atmanlrun)) - export NTHREADS_ATMANAL=${nth_atmanalrun:-${nth_max}} - [[ ${NTHREADS_ATMANAL} -gt ${nth_max} ]] && export NTHREADS_ATMANAL=${nth_max} - export APRUN_ATMANAL="${launcher} -n ${npe_atmanalrun}" + export NTHREADS_ATMANL=${nth_atmanlrun:-${nth_max}} + [[ ${NTHREADS_ATMANL} -gt ${nth_max} ]] && export NTHREADS_ATMANL=${nth_max} + export APRUN_ATMANL="${launcher} -n ${npe_atmanlrun}" -elif [[ "${step}" = "atmensanalrun" ]]; then +elif [[ "${step}" = "atmensanlrun" ]]; then - export CFP_MP=${CFP_MP:-"YES"} - export USE_CFP=${USE_CFP:-"YES"} export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" - nth_max=$((npe_node_max / npe_node_atmensanalrun)) + nth_max=$((npe_node_max / npe_node_atmensanlrun)) - export NTHREADS_ATMENSANAL=${nth_atmensanalrun:-${nth_max}} - [[ ${NTHREADS_ATMENSANAL} -gt ${nth_max} ]] && export NTHREADS_ATMENSANAL=${nth_max} - export APRUN_ATMENSANAL="${launcher} -n ${npe_atmensanalrun}" + export NTHREADS_ATMENSANL=${nth_atmensanlrun:-${nth_max}} + [[ ${NTHREADS_ATMENSANL} -gt ${nth_max} ]] && export NTHREADS_ATMENSANL=${nth_max} + export APRUN_ATMENSANL="${launcher} -n ${npe_atmensanlrun}" elif [[ "${step}" = "aeroanlrun" ]]; then diff --git a/env/JET.env b/env/JET.env index c04535dad7e..a63a57f7152 100755 --- a/env/JET.env +++ b/env/JET.env @@ -4,7 +4,7 @@ if [[ $# -ne 1 ]]; then echo "Must specify an input argument to set runtime environment variables!" echo "argument can be any one of the following:" - echo "atmanalrun atmensanalrun" + echo "atmanlrun atmensanlrun aeroanlrun" echo "anal sfcanl fcst post vrfy metp" echo "eobs eupd ecen efcs epos" echo "postsnd awips gempak" @@ -43,21 +43,29 @@ elif [[ "${step}" = "waveinit" ]] || [[ "${step}" = "waveprep" ]] || [[ "${step} export wavempexec=${launcher} export wave_mpmd=${mpmd_opt} -elif [[ "${step}" = "atmanalrun" ]]; then +elif [[ "${step}" = "atmanlrun" ]]; then - nth_max=$((npe_node_max / npe_node_atmanalrun)) + nth_max=$((npe_node_max / npe_node_atmanlrun)) - export NTHREADS_ATMANAL=${nth_atmanalrun:-${nth_max}} - [[ ${NTHREADS_ATMANAL} -gt ${nth_max} ]] && export NTHREADS_ATMANAL=${nth_max} - export APRUN_ATMANAL="${launcher} ${npe_atmanalrun}" + export NTHREADS_ATMANL=${nth_atmanlrun:-${nth_max}} + [[ ${NTHREADS_ATMANL} -gt ${nth_max} ]] && export NTHREADS_ATMANL=${nth_max} + export APRUN_ATMANL="${launcher} ${npe_atmanlrun}" -elif [[ "${step}" = "atmensanalrun" ]]; then +elif [[ "${step}" = "atmensanlrun" ]]; then - nth_max=$((npe_node_max / npe_node_atmensanalrun)) + nth_max=$((npe_node_max / npe_node_atmensanlrun)) - export NTHREADS_ATMENSANAL=${nth_atmensanalrun:-${nth_max}} - [[ ${NTHREADS_ATMENSANAL} -gt ${nth_max} ]] && export NTHREADS_ATMENSANAL=${nth_max} - export APRUN_ATMENSANAL="${launcher} ${npe_atmensanalrun}" + export NTHREADS_ATMENSANL=${nth_atmensanlrun:-${nth_max}} + [[ ${NTHREADS_ATMENSANL} -gt ${nth_max} ]] && export NTHREADS_ATMENSANL=${nth_max} + export APRUN_ATMENSANL="${launcher} ${npe_atmensanlrun}" + +elif [[ "${step}" = "aeroanlrun" ]]; then + + nth_max=$((npe_node_max / npe_node_aeroanlrun)) + + export NTHREADS_AEROANL=${nth_aeroanlrun:-${nth_max}} + [[ ${NTHREADS_AEROANL} -gt ${nth_max} ]] && export NTHREADS_AEROANL=${nth_max} + export APRUN_AEROANL="${launcher} ${npe_aeroanlrun}" elif [[ "${step}" = "anal" ]]; then diff --git a/env/ORION.env b/env/ORION.env index 918748fda37..1738f325323 100755 --- a/env/ORION.env +++ b/env/ORION.env @@ -4,8 +4,7 @@ if [[ $# -ne 1 ]]; then echo "Must specify an input argument to set runtime environment variables!" echo "argument can be any one of the following:" - echo "atmanalrun atmensanalrun" - echo "aeroanlrun" + echo "atmanlrun atmensanlrun aeroanlrun" echo "anal sfcanl fcst post vrfy metp" echo "eobs eupd ecen efcs epos" echo "postsnd awips gempak" @@ -49,29 +48,29 @@ elif [[ "${step}" = "waveinit" ]] || [[ "${step}" = "waveprep" ]] || [[ "${step} export wavempexec=${launcher} export wave_mpmd=${mpmd_opt} -elif [[ "${step}" = "atmanalrun" ]]; then +elif [[ "${step}" = "atmanlrun" ]]; then export CFP_MP=${CFP_MP:-"YES"} export USE_CFP=${USE_CFP:-"YES"} export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" - nth_max=$((npe_node_max / npe_node_atmanalrun)) + nth_max=$((npe_node_max / npe_node_atmanlrun)) - export NTHREADS_ATMANAL=${nth_atmanalrun:-${nth_max}} - [[ ${NTHREADS_ATMANAL} -gt ${nth_max} ]] && export NTHREADS_ATMANAL=${nth_max} - export APRUN_ATMANAL="${launcher} -n ${npe_atmanalrun}" + export NTHREADS_ATMANL=${nth_atmanlrun:-${nth_max}} + [[ ${NTHREADS_ATMANL} -gt ${nth_max} ]] && export NTHREADS_ATMANL=${nth_max} + export APRUN_ATMANL="${launcher} -n ${npe_atmanlrun}" -elif [[ "${step}" = "atmensanalrun" ]]; then +elif [[ "${step}" = "atmensanlrun" ]]; then export CFP_MP=${CFP_MP:-"YES"} export USE_CFP=${USE_CFP:-"YES"} export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" - nth_max=$((npe_node_max / npe_node_atmensanalrun)) + nth_max=$((npe_node_max / npe_node_atmensanlrun)) - export NTHREADS_ATMENSANAL=${nth_atmensanalrun:-${nth_max}} - [[ ${NTHREADS_ATMENSANAL} -gt ${nth_max} ]] && export NTHREADS_ATMENSANAL=${nth_max} - export APRUN_ATMENSANAL="${launcher} -n ${npe_atmensanalrun}" + export NTHREADS_ATMENSANL=${nth_atmensanlrun:-${nth_max}} + [[ ${NTHREADS_ATMENSANL} -gt ${nth_max} ]] && export NTHREADS_ATMENSANL=${nth_max} + export APRUN_ATMENSANL="${launcher} -n ${npe_atmensanlrun}" elif [[ "${step}" = "aeroanlrun" ]]; then diff --git a/env/S4.env b/env/S4.env index 0d11cea02e6..8c8716c51a6 100755 --- a/env/S4.env +++ b/env/S4.env @@ -4,8 +4,7 @@ if [[ $# -ne 1 ]]; then echo "Must specify an input argument to set runtime environment variables!" echo "argument can be any one of the following:" - echo "atmanalrun atmensanalrun" - echo "aeroanlrun" + echo "atmanlrun atmensanlrun aeroanlrun" echo "anal sfcanl fcst post vrfy metp" echo "eobs eupd ecen efcs epos" echo "postsnd awips gempak" @@ -47,29 +46,29 @@ elif [[ "${step}" = "waveinit" ]] || [[ "${step}" = "waveprep" ]] || [[ "${step} export wavempexec=${launcher} export wave_mpmd=${mpmd_opt} -elif [[ "${step}" = "atmanalrun" ]]; then +elif [[ "${step}" = "atmanlrun" ]]; then export CFP_MP=${CFP_MP:-"YES"} export USE_CFP=${USE_CFP:-"YES"} export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" - nth_max=$((npe_node_max / npe_node_atmanalrun)) + nth_max=$((npe_node_max / npe_node_atmanlrun)) - export NTHREADS_ATMANAL=${nth_atmanalrun:-${nth_max}} - [[ ${NTHREADS_ATMANAL} -gt ${nth_max} ]] && export NTHREADS_ATMANAL=${nth_max} - export APRUN_ATMANAL="${launcher} -n ${npe_atmanalrun}" + export NTHREADS_ATMANL=${nth_atmanlrun:-${nth_max}} + [[ ${NTHREADS_ATMANL} -gt ${nth_max} ]] && export NTHREADS_ATMANL=${nth_max} + export APRUN_ATMANL="${launcher} -n ${npe_atmanlrun}" -elif [[ "${step}" = "atmensanalrun" ]]; then +elif [[ "${step}" = "atmensanlrun" ]]; then export CFP_MP=${CFP_MP:-"YES"} export USE_CFP=${USE_CFP:-"YES"} export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" - nth_max=$((npe_node_max / npe_node_atmensanalrun)) + nth_max=$((npe_node_max / npe_node_atmensanlrun)) - export NTHREADS_ATMENSANAL=${nth_atmensanalrun:-${nth_max}} - [[ ${NTHREADS_ATMENSANAL} -gt ${nth_max} ]] && export NTHREADS_ATMENSANAL=${nth_max} - export APRUN_ATMENSANAL="${launcher} -n ${npe_atmensanalrun}" + export NTHREADS_ATMENSANL=${nth_atmensanlrun:-${nth_max}} + [[ ${NTHREADS_ATMENSANL} -gt ${nth_max} ]] && export NTHREADS_ATMENSANL=${nth_max} + export APRUN_ATMENSANL="${launcher} -n ${npe_atmensanlrun}" elif [[ "${step}" = "aeroanlrun" ]]; then diff --git a/env/WCOSS2.env b/env/WCOSS2.env index 138f8c38838..64f4dcbc4d2 100755 --- a/env/WCOSS2.env +++ b/env/WCOSS2.env @@ -4,8 +4,7 @@ if [[ $# -ne 1 ]]; then echo "Must specify an input argument to set runtime environment variables!" echo "argument can be any one of the following:" - echo "atmanalrun atmensanalrun" - echo "aeroanlrun" + echo "atmanlrun atmensanlrun aeroanlrun" echo "anal sfcanl fcst post vrfy metp" echo "eobs eupd ecen esfc efcs epos" echo "postsnd awips gempak" @@ -36,29 +35,29 @@ elif [[ "${step}" = "waveinit" ]] || [[ "${step}" = "waveprep" ]] || [[ "${step} export wavempexec="${launcher} -np" export wave_mpmd=${mpmd_opt} -elif [[ "${step}" = "atmanalrun" ]]; then +elif [[ "${step}" = "atmanlrun" ]]; then export CFP_MP=${CFP_MP:-"YES"} export USE_CFP=${USE_CFP:-"YES"} export APRUNCFP="${launcher} -np \$ncmd ${mpmd_opt}" - nth_max=$((npe_node_max / npe_node_atmanalrun)) + nth_max=$((npe_node_max / npe_node_atmanlrun)) - export NTHREADS_ATMANAL=${nth_atmanalrun:-${nth_max}} - [[ ${NTHREADS_ATMANAL} -gt ${nth_max} ]] && export NTHREADS_ATMANAL=${nth_max} - export APRUN_ATMANAL="${launcher} -n ${npe_atmanalrun}" + export NTHREADS_ATMANL=${nth_atmanlrun:-${nth_max}} + [[ ${NTHREADS_ATMANL} -gt ${nth_max} ]] && export NTHREADS_ATMANL=${nth_max} + export APRUN_ATMANL="${launcher} -n ${npe_atmanlrun}" -elif [[ "${step}" = "atmensanalrun" ]]; then +elif [[ "${step}" = "atmensanlrun" ]]; then export CFP_MP=${CFP_MP:-"YES"} export USE_CFP=${USE_CFP:-"YES"} export APRUNCFP="${launcher} -np \$ncmd ${mpmd_opt}" - nth_max=$((npe_node_max / npe_node_atmensanalrun)) + nth_max=$((npe_node_max / npe_node_atmensanlrun)) - export NTHREADS_ATMENSANAL=${nth_atmensanalrun:-${nth_max}} - [[ ${NTHREADS_ATMENSANAL} -gt ${nth_max} ]] && export NTHREADS_ATMENSANAL=${nth_max} - export APRUN_ATMENSANAL="${launcher} -n ${npe_atmensanalrun}" + export NTHREADS_ATMENSANL=${nth_atmensanlrun:-${nth_max}} + [[ ${NTHREADS_ATMENSANL} -gt ${nth_max} ]] && export NTHREADS_ATMENSANL=${nth_max} + export APRUN_ATMENSANL="${launcher} -n ${npe_atmensanlrun}" elif [[ "${step}" = "aeroanlrun" ]]; then diff --git a/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_POST b/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_POST deleted file mode 100755 index e1d53b552ec..00000000000 --- a/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_POST +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash - -source "${HOMEgfs}/ush/preamble.sh" -source "${HOMEgfs}/ush/jjob_header.sh" -e "atmensanalpost" -c "base atmensanal atmensanalpost" - - -############################################## -# Set variables used in the script -############################################## -export CDATE=${CDATE:-${PDY}${cyc}} -export CDUMP=${CDUMP:-${RUN:-"gfs"}} -export 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 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}" - -# Add UFSDA to PYTHONPATH -export PYTHONPATH=${HOMEgfs}/sorc/gdas.cd/ush/:${PYTHONPATH} - -############################################################### -# Run relevant script - -EXSCRIPT=${GDASPOSTPY:-${HOMEgfs}/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} - -exit 0 diff --git a/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_PREP b/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_PREP deleted file mode 100755 index 7b3ecee7cad..00000000000 --- a/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_PREP +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash - -source "${HOMEgfs}/ush/preamble.sh" -source "${HOMEgfs}/ush/jjob_header.sh" -e "atmensanalprep" -c "base atmensanal atmensanalprep" - - -############################################## -# Set variables used in the script -############################################## -export CDATE=${CDATE:-${PDY}${cyc}} -export CDUMP=${CDUMP:-${RUN:-"gfs"}} -export 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 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}" - -# Add UFSDA to PYTHONPATH -export PYTHONPATH=${HOMEgfs}/sorc/gdas.cd/ush/:${PYTHONPATH} - -############################################################### -# Run relevant script - -EXSCRIPT=${GDASPREPPY:-${HOMEgfs}/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} - -exit 0 diff --git a/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_RUN b/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_RUN deleted file mode 100755 index 45368d51ff6..00000000000 --- a/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_RUN +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash - -source "${HOMEgfs}/ush/preamble.sh" -source "${HOMEgfs}/ush/jjob_header.sh" -e "atmensanalrun" -c "base atmensanal atmensanalrun" - - -############################################## -# Set variables used in the script -############################################## -export CDATE=${CDATE:-${PDY}${cyc}} -export CDUMP=${CDUMP:-${RUN:-"gfs"}} -export 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 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}" - -# Add UFSDA to PYTHONPATH -export PYTHONPATH=${HOMEgfs}/sorc/gdas.cd/ush/:${PYTHONPATH} - -############################################################### -# Run relevant script - -EXSCRIPT=${GDASRUNSH:-${HOMEgfs}/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} - -exit 0 diff --git a/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_RUN b/jobs/JGLOBAL_ATMENS_ANALYSIS_FINALIZE similarity index 59% rename from jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_RUN rename to jobs/JGLOBAL_ATMENS_ANALYSIS_FINALIZE index 876598ff7ee..bb7288ca369 100755 --- a/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_RUN +++ b/jobs/JGLOBAL_ATMENS_ANALYSIS_FINALIZE @@ -1,21 +1,23 @@ -#!/bin/bash +#! /usr/bin/env bash source "${HOMEgfs}/ush/preamble.sh" -source "${HOMEgfs}/ush/jjob_header.sh" -e "atmanalrun" -c "base atmanal atmanalrun" - +export WIPE_DATA="NO" +export DATA=${DATA:-${DATAROOT}/${RUN}atmensanl_${cyc}} +source "${HOMEgfs}/ush/jjob_header.sh" -e "atmensanlfinal" -c "base atmensanl atmensanlfinal" ############################################## # Set variables used in the script ############################################## export CDATE=${CDATE:-${PDY}${cyc}} export CDUMP=${CDUMP:-${RUN:-"gfs"}} -export COMPONENT="atmos" + ############################################## # Begin JOB SPECIFIC work ############################################## -export GDATE=$(date +%Y%m%d%H -d "${CDATE:0:8} ${CDATE:8:2} - ${assim_freq} hours") +GDATE=$(date +%Y%m%d%H -d "${CDATE:0:8} ${CDATE:8:2} - ${assim_freq} hours") +export GDATE gPDY=${GDATE:0:8} export gcyc=${GDATE:8:2} export GDUMP=${GDUMP:-"gdas"} @@ -24,24 +26,21 @@ export OPREFIX="${CDUMP}.t${cyc}z." export GPREFIX="${GDUMP}.t${gcyc}z." export APREFIX="${CDUMP}.t${cyc}z." -export COMOUT=${COMOUT:-${ROTDIR}/${CDUMP}.${PDY}/${cyc}/${COMPONENT}} +export COMOUT=${COMOUT:-${ROTDIR}/${CDUMP}.${PDY}/${cyc}} -mkdir -p ${COMOUT} +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}" - -# Add UFSDA to PYTHONPATH -export PYTHONPATH=${HOMEgfs}/sorc/gdas.cd/ush/:${PYTHONPATH} +export COMIN_GES="${ROTDIR}/${GDUMP}.${gPDY}/${gcyc}/atmos" +export COMIN_GES_ENS="${ROTDIR}/enkf${GDUMP}.${gPDY}/${gcyc}/atmos" ############################################################### # Run relevant script -EXSCRIPT=${GDASRUNSH:-${HOMEgfs}/scripts/exgdas_global_atmos_analysis_run.sh} +EXSCRIPT=${GDASATMENSFINALPY:-${HOMEgfs}/scripts/exglobal_atmens_analysis_finalize.py} ${EXSCRIPT} status=$? -[[ ${status} -ne 0 ]] && exit ${status} +[[ ${status} -ne 0 ]] && exit "${status}" ############################################## # End JOB SPECIFIC work @@ -50,14 +49,14 @@ status=$? ############################################## # Final processing ############################################## -if [ -e "${pgmout}" ] ; then - cat ${pgmout} +if [[ -e "${pgmout}" ]] ; then + cat "${pgmout}" fi ########################################## # Remove the Temporary working directory ########################################## -cd ${DATAROOT} -[[ ${KEEPDATA} = "NO" ]] && rm -rf ${DATA} +cd "${DATAROOT}" || exit 1 +[[ ${KEEPDATA} = "NO" ]] && rm -rf "${DATA}" exit 0 diff --git a/jobs/JGLOBAL_ATMENS_ANALYSIS_INITIALIZE b/jobs/JGLOBAL_ATMENS_ANALYSIS_INITIALIZE new file mode 100755 index 00000000000..8dcd0e9fb91 --- /dev/null +++ b/jobs/JGLOBAL_ATMENS_ANALYSIS_INITIALIZE @@ -0,0 +1,55 @@ +#! /usr/bin/env bash + +source "${HOMEgfs}/ush/preamble.sh" +export DATA=${DATA:-${DATAROOT}/${RUN}atmensanl_${cyc}} +source "${HOMEgfs}/ush/jjob_header.sh" -e "atmensanlinit" -c "base atmensanl atmensanlinit" + +############################################## +# Set variables used in the script +############################################## +export CDATE=${CDATE:-${PDY}${cyc}} +export CDUMP=${CDUMP:-${RUN:-"gfs"}} + + +############################################## +# Begin JOB SPECIFIC work +############################################## + +GDATE=$(date +%Y%m%d%H -d "${CDATE:0:8} ${CDATE:8:2} - ${assim_freq} hours") +export GDATE +export gPDY=${GDATE:0:8} +export gcyc=${GDATE:8:2} +export GDUMP=${GDUMP:-"gdas"} + +export OPREFIX="${CDUMP_OBS}.t${cyc}z." +export GPREFIX="${GDUMP}.t${gcyc}z." +export APREFIX="${CDUMP}.t${cyc}z." + +export COMOUT=${COMOUT:-${ROTDIR}/${CDUMP}.${PDY}/${cyc}/atmos} + +mkdir -p "${COMOUT}" + +# COMIN_GES and COMIN_GES_ENS are used in script +export COMIN_GES="${ROTDIR}/${GDUMP}.${gPDY}/${gcyc}/atmos" +export COMIN_GES_ENS="${ROTDIR}/enkf${GDUMP}.${gPDY}/${gcyc}" + +############################################################### +# Run relevant script + +EXSCRIPT=${GDASATMENSINITPY:-${HOMEgfs}/scripts/exglobal_atmens_analysis_initialize.py} +${EXSCRIPT} +status=$? +[[ ${status} -ne 0 ]] && exit "${status}" + +############################################## +# End JOB SPECIFIC work +############################################## + +############################################## +# Final processing +############################################## +if [[ -e "${pgmout}" ]] ; then + cat "${pgmout}" +fi + +exit 0 diff --git a/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_POST b/jobs/JGLOBAL_ATMENS_ANALYSIS_RUN similarity index 52% rename from jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_POST rename to jobs/JGLOBAL_ATMENS_ANALYSIS_RUN index e44e6075819..a8dbf4aeb41 100755 --- a/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_POST +++ b/jobs/JGLOBAL_ATMENS_ANALYSIS_RUN @@ -1,21 +1,23 @@ -#!/bin/bash +#! /usr/bin/env bash source "${HOMEgfs}/ush/preamble.sh" -source "${HOMEgfs}/ush/jjob_header.sh" -e "atmanalpost" -c "base atmanal atmanalpost" - +export WIPE_DATA="NO" +export DATA=${DATA:-${DATAROOT}/${RUN}atmensanl_${cyc}} +source "${HOMEgfs}/ush/jjob_header.sh" -e "atmensanlrun" -c "base atmensanl atmensanlrun" ############################################## # Set variables used in the script ############################################## export CDATE=${CDATE:-${PDY}${cyc}} export CDUMP=${CDUMP:-${RUN:-"gfs"}} -export COMPONENT="atmos" + ############################################## # Begin JOB SPECIFIC work ############################################## -export GDATE=$(date +%Y%m%d%H -d "${CDATE:0:8} ${CDATE:8:2} - ${assim_freq} hours") +GDATE=$(date +%Y%m%d%H -d "${CDATE:0:8} ${CDATE:8:2} - ${assim_freq} hours") +export GDATE gPDY=${GDATE:0:8} export gcyc=${GDATE:8:2} export GDUMP=${GDUMP:-"gdas"} @@ -24,24 +26,21 @@ export OPREFIX="${CDUMP}.t${cyc}z." export GPREFIX="${GDUMP}.t${gcyc}z." export APREFIX="${CDUMP}.t${cyc}z." -export COMOUT=${COMOUT:-${ROTDIR}/${CDUMP}.${PDY}/${cyc}/${COMPONENT}} +export COMOUT=${COMOUT:-${ROTDIR}/${CDUMP}.${PDY}/${cyc}/atmos} -mkdir -p ${COMOUT} +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}" - -# Add UFSDA to PYTHONPATH -export PYTHONPATH=${HOMEgfs}/sorc/gdas.cd/ush/:${PYTHONPATH} +export COMIN_GES="${ROTDIR}/${GDUMP}.${gPDY}/${gcyc}/atmos" +export COMIN_GES_ENS="${ROTDIR}/enkf${GDUMP}.${gPDY}/${gcyc}/atmos" ############################################################### # Run relevant script -EXSCRIPT=${GDASPOSTPY:-${HOMEgfs}/scripts/exgdas_global_atmos_analysis_post.py} +EXSCRIPT=${GDASATMENSRUNSH:-${HOMEgfs}/scripts/exglobal_atmens_analysis_run.sh} ${EXSCRIPT} status=$? -[[ ${status} -ne 0 ]] && exit ${status} +[[ ${status} -ne 0 ]] && exit "${status}" ############################################## # End JOB SPECIFIC work @@ -50,14 +49,8 @@ status=$? ############################################## # Final processing ############################################## -if [ -e "${pgmout}" ] ; then - cat ${pgmout} +if [[ -e "${pgmout}" ]] ; then + cat "${pgmout}" fi -########################################## -# Remove the Temporary working directory -########################################## -cd ${DATAROOT} -[[ ${KEEPDATA} = "NO" ]] && rm -rf ${DATA} - exit 0 diff --git a/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_PREP b/jobs/JGLOBAL_ATM_ANALYSIS_FINALIZE similarity index 59% rename from jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_PREP rename to jobs/JGLOBAL_ATM_ANALYSIS_FINALIZE index 093fccdd5ab..76b3b30c416 100755 --- a/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_PREP +++ b/jobs/JGLOBAL_ATM_ANALYSIS_FINALIZE @@ -1,21 +1,23 @@ -#!/bin/bash +#! /usr/bin/env bash source "${HOMEgfs}/ush/preamble.sh" -source "${HOMEgfs}/ush/jjob_header.sh" -e "atmanalprep" -c "base atmanal atmanalprep" - +export WIPE_DATA="NO" +export DATA=${DATA:-${DATAROOT}/${RUN}atmanl_${cyc}} +source "${HOMEgfs}/ush/jjob_header.sh" -e "atmanlfinal" -c "base atmanl atmanlfinal" ############################################## # Set variables used in the script ############################################## export CDATE=${CDATE:-${PDY}${cyc}} export CDUMP=${CDUMP:-${RUN:-"gfs"}} -export COMPONENT="atmos" + ############################################## # Begin JOB SPECIFIC work ############################################## -export GDATE=$(date +%Y%m%d%H -d "${CDATE:0:8} ${CDATE:8:2} - ${assim_freq} hours") +GDATE=$(date +%Y%m%d%H -d "${CDATE:0:8} ${CDATE:8:2} - ${assim_freq} hours") +export GDATE gPDY=${GDATE:0:8} export gcyc=${GDATE:8:2} export GDUMP=${GDUMP:-"gdas"} @@ -24,23 +26,21 @@ export OPREFIX="${CDUMP}.t${cyc}z." export GPREFIX="${GDUMP}.t${gcyc}z." export APREFIX="${CDUMP}.t${cyc}z." -export COMOUT=${COMOUT:-${ROTDIR}/${CDUMP}.${PDY}/${cyc}/${COMPONENT}} +export COMOUT=${COMOUT:-${ROTDIR}/${CDUMP}.${PDY}/${cyc}/atmos} -mkdir -p ${COMOUT} +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}" - -# Add UFSDA to PYTHONPATH -export PYTHONPATH=${HOMEgfs}/sorc/gdas.cd/ush/:${PYTHONPATH} +export COMIN_GES="${ROTDIR}/${GDUMP}.${gPDY}/${gcyc}/atmos" +export COMIN_GES_ENS="${ROTDIR}/enkf${GDUMP}.${gPDY}/${gcyc}/atmos" ############################################################### # Run relevant script -EXSCRIPT=${GDASPREPPY:-${HOMEgfs}/scripts/exgdas_global_atmos_analysis_prep.py} + +EXSCRIPT=${GDASATMFINALPY:-${HOMEgfs}/scripts/exglobal_atm_analysis_finalize.py} ${EXSCRIPT} status=$? -[[ ${status} -ne 0 ]] && exit ${status} +[[ ${status} -ne 0 ]] && exit "${status}" ############################################## # End JOB SPECIFIC work @@ -49,14 +49,14 @@ status=$? ############################################## # Final processing ############################################## -if [ -e "${pgmout}" ] ; then - cat ${pgmout} +if [[ -e "${pgmout}" ]] ; then + cat "${pgmout}" fi ########################################## # Remove the Temporary working directory ########################################## -cd ${DATAROOT} -[[ ${KEEPDATA} = "NO" ]] && rm -rf ${DATA} +cd "${DATAROOT}" || exit 1 +[[ ${KEEPDATA} = "NO" ]] && rm -rf "${DATA}" exit 0 diff --git a/jobs/JGLOBAL_ATM_ANALYSIS_INITIALIZE b/jobs/JGLOBAL_ATM_ANALYSIS_INITIALIZE new file mode 100755 index 00000000000..6b404c8d9c8 --- /dev/null +++ b/jobs/JGLOBAL_ATM_ANALYSIS_INITIALIZE @@ -0,0 +1,55 @@ +#! /usr/bin/env bash + +source "${HOMEgfs}/ush/preamble.sh" +export DATA=${DATA:-${DATAROOT}/${RUN}atmanl_${cyc}} +source "${HOMEgfs}/ush/jjob_header.sh" -e "atmanlinit" -c "base atmanl atmanlinit" + +############################################## +# Set variables used in the script +############################################## +export CDATE=${CDATE:-${PDY}${cyc}} +export CDUMP=${CDUMP:-${RUN:-"gfs"}} + + +############################################## +# Begin JOB SPECIFIC work +############################################## + +GDATE=$(date +%Y%m%d%H -d "${CDATE:0:8} ${CDATE:8:2} - ${assim_freq} hours") +export GDATE +export 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 COMOUT=${COMOUT:-${ROTDIR}/${CDUMP}.${PDY}/${cyc}/atmos} + +mkdir -p "${COMOUT}" + +# COMIN_GES and COMIN_GES_ENS are used in script +export COMIN_GES="${ROTDIR}/${GDUMP}.${gPDY}/${gcyc}/atmos" +export COMIN_GES_ENS="${ROTDIR}/enkf${GDUMP}.${gPDY}/${gcyc}/atmos" + +############################################################### +# Run relevant script + +EXSCRIPT=${GDASATMINITPY:-${HOMEgfs}/scripts/exglobal_atm_analysis_initialize.py} +${EXSCRIPT} +status=$? +[[ ${status} -ne 0 ]] && exit "${status}" + +############################################## +# End JOB SPECIFIC work +############################################## + +############################################## +# Final processing +############################################## +if [[ -e "${pgmout}" ]] ; then + cat "${pgmout}" +fi + +exit 0 diff --git a/jobs/JGLOBAL_ATM_ANALYSIS_RUN b/jobs/JGLOBAL_ATM_ANALYSIS_RUN new file mode 100755 index 00000000000..29b857d9533 --- /dev/null +++ b/jobs/JGLOBAL_ATM_ANALYSIS_RUN @@ -0,0 +1,56 @@ +#! /usr/bin/env bash + +source "${HOMEgfs}/ush/preamble.sh" +export WIPE_DATA="NO" +export DATA=${DATA:-${DATAROOT}/${RUN}atmanl_${cyc}} +source "${HOMEgfs}/ush/jjob_header.sh" -e "atmanlrun" -c "base atmanl atmanlrun" + +############################################## +# Set variables used in the script +############################################## +export CDATE=${CDATE:-${PDY}${cyc}} +export CDUMP=${CDUMP:-${RUN:-"gfs"}} + + +############################################## +# Begin JOB SPECIFIC work +############################################## + +GDATE=$(date +%Y%m%d%H -d "${CDATE:0:8} ${CDATE:8:2} - ${assim_freq} hours") +export GDATE +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 COMOUT=${COMOUT:-${ROTDIR}/${CDUMP}.${PDY}/${cyc}/atmos} + +mkdir -p "${COMOUT}" + +# COMIN_GES and COMIN_GES_ENS are used in script +export COMIN_GES="${ROTDIR}/${GDUMP}.${gPDY}/${gcyc}/atmos" +export COMIN_GES_ENS="${ROTDIR}/enkf${GDUMP}.${gPDY}/${gcyc}/atmos" + +############################################################### +# Run relevant script + +EXSCRIPT=${GDASATMRUNSH:-${HOMEgfs}/scripts/exglobal_atm_analysis_run.sh} +${EXSCRIPT} +status=$? +[[ ${status} -ne 0 ]] && exit "${status}" + +############################################## +# End JOB SPECIFIC work +############################################## + +############################################## +# Final processing +############################################## +if [[ -e "${pgmout}" ]] ; then + cat "${pgmout}" +fi + +exit 0 diff --git a/jobs/rocoto/atmanalprep.sh b/jobs/rocoto/atmanalprep.sh deleted file mode 100755 index d5b729194a8..00000000000 --- a/jobs/rocoto/atmanalprep.sh +++ /dev/null @@ -1,20 +0,0 @@ -#! /usr/bin/env bash - -export STRICT="NO" -source "${HOMEgfs}/ush/preamble.sh" -export STRICT="YES" - -############################################################### -# Source UFSDA workflow modules -. ${HOMEgfs}/ush/load_ufsda_modules.sh -status=$? -[[ ${status} -ne 0 ]] && exit ${status} - -export job="atmanalprep" -export jobid="${job}.$$" - -############################################################### -# Execute the JJOB -${HOMEgfs}/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_PREP -status=$? -exit ${status} diff --git a/jobs/rocoto/atmanlfinal.sh b/jobs/rocoto/atmanlfinal.sh new file mode 100755 index 00000000000..3c75c52cb08 --- /dev/null +++ b/jobs/rocoto/atmanlfinal.sh @@ -0,0 +1,23 @@ +#! /usr/bin/env bash + +source "${HOMEgfs}/ush/preamble.sh" + +############################################################### +# Source UFSDA workflow modules +. "${HOMEgfs}/ush/load_ufsda_modules.sh" +status=$? +[[ ${status} -ne 0 ]] && exit "${status}" + +export job="atmanlfinal" +export jobid="${job}.$$" + +############################################################### +# setup python path for workflow utilities and tasks +pygwPATH="${HOMEgfs}/ush/python:${HOMEgfs}/ush/python/pygw/src" +PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${pygwPATH}" +export PYTHONPATH +############################################################### +# Execute the JJOB +"${HOMEgfs}/jobs/JGLOBAL_ATM_ANALYSIS_FINALIZE" +status=$? +exit "${status}" diff --git a/jobs/rocoto/atmanlinit.sh b/jobs/rocoto/atmanlinit.sh new file mode 100755 index 00000000000..7bb2587f0ba --- /dev/null +++ b/jobs/rocoto/atmanlinit.sh @@ -0,0 +1,24 @@ +#! /usr/bin/env bash + +source "${HOMEgfs}/ush/preamble.sh" + +############################################################### +# Source UFSDA workflow modules +. "${HOMEgfs}/ush/load_ufsda_modules.sh" +status=$? +[[ ${status} -ne 0 ]] && exit "${status}" + +export job="atmanlinit" +export jobid="${job}.$$" + +############################################################### +# setup python path for workflow utilities and tasks +pygwPATH="${HOMEgfs}/ush/python:${HOMEgfs}/ush/python/pygw/src" +PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${pygwPATH}" +export PYTHONPATH + +############################################################### +# Execute the JJOB +"${HOMEgfs}/jobs/JGLOBAL_ATM_ANALYSIS_INITIALIZE" +status=$? +exit "${status}" diff --git a/jobs/rocoto/atmanalrun.sh b/jobs/rocoto/atmanlrun.sh similarity index 58% rename from jobs/rocoto/atmanalrun.sh rename to jobs/rocoto/atmanlrun.sh index 63aa08c184b..ca918d4e0dc 100755 --- a/jobs/rocoto/atmanalrun.sh +++ b/jobs/rocoto/atmanlrun.sh @@ -1,20 +1,18 @@ #! /usr/bin/env bash -export STRICT="NO" source "${HOMEgfs}/ush/preamble.sh" -export STRICT="YES" ############################################################### # Source UFSDA workflow modules -. ${HOMEgfs}/ush/load_ufsda_modules.sh +. "${HOMEgfs}/ush/load_ufsda_modules.sh" status=$? -[[ ${status} -ne 0 ]] && exit ${status} +[[ ${status} -ne 0 ]] && exit "${status}" -export job="atmanalrun" +export job="atmanlrun" export jobid="${job}.$$" ############################################################### # Execute the JJOB -${HOMEgfs}/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_RUN +"${HOMEgfs}/jobs/JGLOBAL_ATM_ANALYSIS_RUN" status=$? -exit ${status} +exit "${status}" diff --git a/jobs/rocoto/atmensanalpost.sh b/jobs/rocoto/atmensanalpost.sh deleted file mode 100755 index 91ac2d62123..00000000000 --- a/jobs/rocoto/atmensanalpost.sh +++ /dev/null @@ -1,20 +0,0 @@ -#! /usr/bin/env bash - -export STRICT="NO" -source "${HOMEgfs}/ush/preamble.sh" -export STRICT="YES" - -############################################################### -# Source UFSDA workflow modules -. ${HOMEgfs}/ush/load_ufsda_modules.sh -status=$? -[[ ${status} -ne 0 ]] && exit ${status} - -export job="atmensanalpost" -export jobid="${job}.$$" - -############################################################### -# Execute the JJOB -${HOMEgfs}/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_POST -status=$? -exit ${status} diff --git a/jobs/rocoto/atmensanalprep.sh b/jobs/rocoto/atmensanalprep.sh deleted file mode 100755 index b54a1b464ed..00000000000 --- a/jobs/rocoto/atmensanalprep.sh +++ /dev/null @@ -1,20 +0,0 @@ -#! /usr/bin/env bash - -export STRICT="NO" -source "${HOMEgfs}/ush/preamble.sh" -export STRICT="YES" - -############################################################### -# Source UFSDA workflow modules -. ${HOMEgfs}/ush/load_ufsda_modules.sh -status=$? -[[ ${status} -ne 0 ]] && exit ${status} - -export job="atmensanalprep" -export jobid="${job}.$$" - -############################################################### -# Execute the JJOB -${HOMEgfs}/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_PREP -status=$? -exit ${status} diff --git a/jobs/rocoto/atmensanalrun.sh b/jobs/rocoto/atmensanalrun.sh deleted file mode 100755 index a2509a310ea..00000000000 --- a/jobs/rocoto/atmensanalrun.sh +++ /dev/null @@ -1,20 +0,0 @@ -#! /usr/bin/env bash - -export STRICT="NO" -source "${HOMEgfs}/ush/preamble.sh" -export STRICT="YES" - -############################################################### -# Source UFSDA workflow modules -. ${HOMEgfs}/ush/load_ufsda_modules.sh -status=$? -[[ ${status} -ne 0 ]] && exit ${status} - -export job="atmensanalrun" -export jobid="${job}.$$" - -############################################################### -# Execute the JJOB -${HOMEgfs}/jobs/JGDAS_GLOBAL_ATMOS_ENSANAL_RUN -status=$? -exit ${status} diff --git a/jobs/rocoto/atmensanlfinal.sh b/jobs/rocoto/atmensanlfinal.sh new file mode 100755 index 00000000000..838e9712f87 --- /dev/null +++ b/jobs/rocoto/atmensanlfinal.sh @@ -0,0 +1,23 @@ +#! /usr/bin/env bash + +source "${HOMEgfs}/ush/preamble.sh" + +############################################################### +# Source UFSDA workflow modules +. "${HOMEgfs}/ush/load_ufsda_modules.sh" +status=$? +[[ ${status} -ne 0 ]] && exit "${status}" + +export job="atmensanlfinal" +export jobid="${job}.$$" + +############################################################### +# setup python path for workflow utilities and tasks +pygwPATH="${HOMEgfs}/ush/python:${HOMEgfs}/ush/python/pygw/src" +PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${pygwPATH}" +export PYTHONPATH +############################################################### +# Execute the JJOB +"${HOMEgfs}/jobs/JGLOBAL_ATMENS_ANALYSIS_FINALIZE" +status=$? +exit "${status}" diff --git a/jobs/rocoto/atmensanlinit.sh b/jobs/rocoto/atmensanlinit.sh new file mode 100755 index 00000000000..0ab78a1083a --- /dev/null +++ b/jobs/rocoto/atmensanlinit.sh @@ -0,0 +1,24 @@ +#! /usr/bin/env bash + +source "${HOMEgfs}/ush/preamble.sh" + +############################################################### +# Source UFSDA workflow modules +. "${HOMEgfs}/ush/load_ufsda_modules.sh" +status=$? +[[ ${status} -ne 0 ]] && exit "${status}" + +export job="atmensanlinit" +export jobid="${job}.$$" + +############################################################### +# setup python path for workflow utilities and tasks +pygwPATH="${HOMEgfs}/ush/python:${HOMEgfs}/ush/python/pygw/src" +PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${pygwPATH}" +export PYTHONPATH + +############################################################### +# Execute the JJOB +"${HOMEgfs}/jobs/JGLOBAL_ATMENS_ANALYSIS_INITIALIZE" +status=$? +exit "${status}" diff --git a/jobs/rocoto/atmanalpost.sh b/jobs/rocoto/atmensanlrun.sh similarity index 57% rename from jobs/rocoto/atmanalpost.sh rename to jobs/rocoto/atmensanlrun.sh index 71ace70c8ba..8bfbc7f6629 100755 --- a/jobs/rocoto/atmanalpost.sh +++ b/jobs/rocoto/atmensanlrun.sh @@ -1,20 +1,18 @@ #! /usr/bin/env bash -export STRICT="NO" source "${HOMEgfs}/ush/preamble.sh" -export STRICT="YES" ############################################################### # Source UFSDA workflow modules -. ${HOMEgfs}/ush/load_ufsda_modules.sh +. "${HOMEgfs}/ush/load_ufsda_modules.sh" status=$? -[[ ${status} -ne 0 ]] && exit ${status} +[[ ${status} -ne 0 ]] && exit "${status}" -export job="atmanalpost" +export job="atmensanlrun" export jobid="${job}.$$" ############################################################### # Execute the JJOB -${HOMEgfs}/jobs/JGDAS_GLOBAL_ATMOS_ANALYSIS_POST +"${HOMEgfs}/jobs/JGLOBAL_ATMENS_ANALYSIS_RUN" status=$? -exit ${status} +exit "${status}" diff --git a/parm/config/config.aeroanl b/parm/config/config.aeroanl index 8607a0ae8f8..07209dd2c4c 100644 --- a/parm/config/config.aeroanl +++ b/parm/config/config.aeroanl @@ -19,6 +19,5 @@ export io_layout_x=@IO_LAYOUT_X@ export io_layout_y=@IO_LAYOUT_Y@ export JEDIVAREXE=${HOMEgfs}/exec/fv3jedi_var.x -export CRTM_VER="2.3.0" echo "END: config.aeroanl" diff --git a/parm/config/config.atmanalpost b/parm/config/config.atmanalpost deleted file mode 100644 index fd5f3bbbcc1..00000000000 --- a/parm/config/config.atmanalpost +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -x - -########## config.atmanalpost ########## -# Post Atm Analysis specific - -echo "BEGIN: config.atmanalpost" - -# Get task specific resources -. $EXPDIR/config.resources atmanalpost -echo "END: config.atmanalpost" diff --git a/parm/config/config.atmanalprep b/parm/config/config.atmanalprep deleted file mode 100644 index 0014520f5f2..00000000000 --- a/parm/config/config.atmanalprep +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -x - -########## config.atmanalprep ########## -# Pre Atm Analysis specific - -echo "BEGIN: config.atmanalprep" - -# Get task specific resources -. $EXPDIR/config.resources atmanalprep -echo "END: config.atmanalprep" diff --git a/parm/config/config.atmanalrun b/parm/config/config.atmanalrun deleted file mode 100644 index 5aaac6a01d3..00000000000 --- a/parm/config/config.atmanalrun +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -x - -########## config.atmanalrun ########## -# Atm Analysis specific - -echo "BEGIN: config.atmanalrun" - -# Get task specific resources -. $EXPDIR/config.resources atmanalrun - -# Task specific variables -export JEDIVAREXE=$HOMEgfs/exec/fv3jedi_var.x - -echo "END: config.atmanalrun" diff --git a/parm/config/config.atmanal b/parm/config/config.atmanl old mode 100644 new mode 100755 similarity index 58% rename from parm/config/config.atmanal rename to parm/config/config.atmanl index 2e36ffa6037..65759a0ca7c --- a/parm/config/config.atmanal +++ b/parm/config/config.atmanl @@ -1,25 +1,25 @@ #!/bin/bash -x -########## config.atmanal ########## -# configuration common to all atm analysis tasks +########## config.atmanl ########## +# configuration common to all atm var analysis tasks -echo "BEGIN: config.atmanal" +echo "BEGIN: config.atmanl" export OBS_YAML_DIR=${HOMEgfs}/sorc/gdas.cd/parm/atm/obs/config/ -export OBS_LIST=${HOMEgfs}/sorc/gdas.cd/parm/atm/obs/lists/gdas_prototype.yaml +export OBS_LIST=${HOMEgfs}/sorc/gdas.cd/parm/atm/obs/lists/gdas_prototype_3d.yaml export ATMVARYAML=${HOMEgfs}/sorc/gdas.cd/parm/atm/variational/3dvar_dripcg.yaml export STATICB_TYPE="identity" export BERROR_YAML=${HOMEgfs}/sorc/gdas.cd/parm/atm/berror/staticb_${STATICB_TYPE}.yaml export FV3JEDI_FIX=${HOMEgfs}/fix/gdas -export R2D2_OBS_DB='ufsda_test' -export R2D2_OBS_DUMP='oper_gdas' -export R2D2_OBS_SRC='ncdiag' -export R2D2_BC_SRC='gsi' -export R2D2_BC_DUMP='oper_gdas' -export R2D2_ARCH_DB='local' export INTERP_METHOD='barycentric' +export layout_x=1 +export layout_y=1 + export io_layout_x=1 export io_layout_y=1 -echo "END: config.atmanal" +export JEDIVAREXE=${HOMEgfs}/exec/fv3jedi_var.x +export crtm_VERSION="2.3.0" + +echo "END: config.atmanl" diff --git a/parm/config/config.atmanlfinal b/parm/config/config.atmanlfinal new file mode 100755 index 00000000000..1e683e4178e --- /dev/null +++ b/parm/config/config.atmanlfinal @@ -0,0 +1,10 @@ +#!/bin/bash -x + +########## config.atmanlfinal ########## +# Post Atm Var Analysis specific + +echo "BEGIN: config.atmanlfinal" + +# Get task specific resources +. "${EXPDIR}/config.resources" atmanlfinal +echo "END: config.atmanlfinal" diff --git a/parm/config/config.atmanlinit b/parm/config/config.atmanlinit new file mode 100755 index 00000000000..9f4d7defc1e --- /dev/null +++ b/parm/config/config.atmanlinit @@ -0,0 +1,10 @@ +#!/bin/bash -x + +########## config.atmanlinit ########## +# Pre Atm Var Analysis specific + +echo "BEGIN: config.atmanlinit" + +# Get task specific resources +. "${EXPDIR}/config.resources" atmanlinit +echo "END: config.atmanlinit" diff --git a/parm/config/config.atmanlrun b/parm/config/config.atmanlrun new file mode 100755 index 00000000000..b66adef40f4 --- /dev/null +++ b/parm/config/config.atmanlrun @@ -0,0 +1,11 @@ +#!/bin/bash -x + +########## config.atmanlrun ########## +# Atm Var Analysis specific + +echo "BEGIN: config.atmanlrun" + +# Get task specific resources +. "${EXPDIR}/config.resources" atmanlrun + +echo "END: config.atmanlrun" diff --git a/parm/config/config.atmensanal b/parm/config/config.atmensanal deleted file mode 100644 index 2c939f0d84e..00000000000 --- a/parm/config/config.atmensanal +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -x - -########## config.atmensanal ########## -# configuration common to all atm atmensanal analysis tasks - -echo "BEGIN: config.atmensanal" - -export OBS_YAML_DIR=$HOMEgfs/sorc/gdas.cd/parm/atm/obs/config/ -export OBS_LIST=$HOMEgfs/sorc/gdas.cd/parm/atm/obs/lists/lgetkf_prototype.yaml -export BERROR_YAML=$HOMEgfs/sorc/gdas.cd/parm/atm/berror/hybvar_bump.yaml -export ATMENSYAML=$HOMEgfs/sorc/gdas.cd/parm/atm/lgetkf/lgetkf.yaml -export FV3JEDI_FIX=$HOMEgfs/fix/gdas -export R2D2_OBS_DB='ufsda_test' -export R2D2_OBS_DUMP='oper_gdas' -export R2D2_OBS_SRC='ncdiag' -export R2D2_BC_SRC='gsi' -export R2D2_BC_DUMP='oper_gdas' -export R2D2_ARCH_DB='local' -export INTERP_METHOD='barycentric' - -export io_layout_x=1 # hardwired to 1,1 in yamltools.py -export io_layout_y=1 - -echo "END: config.atmensanal" diff --git a/parm/config/config.atmensanalpost b/parm/config/config.atmensanalpost deleted file mode 100644 index f79ee5b5078..00000000000 --- a/parm/config/config.atmensanalpost +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -x - -########## config.atmensanalpost ########## -# Post Atm Analysis specific - -echo "BEGIN: config.atmensanalpost" - -# Get task specific resources -. $EXPDIR/config.resources atmensanalpost -echo "END: config.atmensanalpost" diff --git a/parm/config/config.atmensanalprep b/parm/config/config.atmensanalprep deleted file mode 100644 index b719b9ac6cd..00000000000 --- a/parm/config/config.atmensanalprep +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -x - -########## config.atmensanalprep ########## -# Pre Atm Analysis specific - -echo "BEGIN: config.atmensanalprep" - -# Get task specific resources -. $EXPDIR/config.resources atmensanalprep -echo "END: config.atmensanalprep" diff --git a/parm/config/config.atmensanalrun b/parm/config/config.atmensanalrun deleted file mode 100644 index aeb59d18059..00000000000 --- a/parm/config/config.atmensanalrun +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -x - -########## config.atmensanalrun ########## -# Atm LETKFs specific - -echo "BEGIN: config.atmensanalrun" - -# Get task specific resources -. $EXPDIR/config.resources atmensanalrun - -# Task specific variables -export JEDIENSEXE=$HOMEgfs/exec/fv3jedi_letkf.x - -echo "END: config.atmensanalrun" diff --git a/parm/config/config.atmensanl b/parm/config/config.atmensanl new file mode 100755 index 00000000000..59454db4b08 --- /dev/null +++ b/parm/config/config.atmensanl @@ -0,0 +1,23 @@ +#!/bin/bash -x + +########## config.atmensanl ########## +# configuration common to all atm ens analysis tasks + +echo "BEGIN: config.atmensanl" + +export OBS_YAML_DIR=${HOMEgfs}/sorc/gdas.cd/parm/atm/obs/config/ +export OBS_LIST=${HOMEgfs}/sorc/gdas.cd/parm/atm/obs/lists/lgetkf_prototype.yaml +export ATMENSYAML=${HOMEgfs}/sorc/gdas.cd/parm/atm/lgetkf/lgetkf.yaml +export FV3JEDI_FIX=${HOMEgfs}/fix/gdas +export INTERP_METHOD='barycentric' + +export layout_x=1 +export layout_y=1 + +export io_layout_x=1 +export io_layout_y=1 + +export JEDIENSEXE=${HOMEgfs}/exec/fv3jedi_letkf.x +export crtm_VERSION="2.3.0" + +echo "END: config.atmensanl" diff --git a/parm/config/config.atmensanlfinal b/parm/config/config.atmensanlfinal new file mode 100755 index 00000000000..db3b8b69c97 --- /dev/null +++ b/parm/config/config.atmensanlfinal @@ -0,0 +1,10 @@ +#!/bin/bash -x + +########## config.atmensanlfinal ########## +# Post Atm Ens Analysis specific + +echo "BEGIN: config.atmensanlfinal" + +# Get task specific resources +. "${EXPDIR}/config.resources" atmensanlfinal +echo "END: config.atmensanlfinal" diff --git a/parm/config/config.atmensanlinit b/parm/config/config.atmensanlinit new file mode 100755 index 00000000000..a9cd4c968df --- /dev/null +++ b/parm/config/config.atmensanlinit @@ -0,0 +1,10 @@ +#!/bin/bash -x + +########## config.atmensanlinit ########## +# Pre Atm Ens Analysis specific + +echo "BEGIN: config.atmensanlinit" + +# Get task specific resources +. "${EXPDIR}/config.resources" atmensanlinit +echo "END: config.atmensanlinit" diff --git a/parm/config/config.atmensanlrun b/parm/config/config.atmensanlrun new file mode 100755 index 00000000000..aec8e04ec03 --- /dev/null +++ b/parm/config/config.atmensanlrun @@ -0,0 +1,11 @@ +#!/bin/bash -x + +########## config.atmensanlrun ########## +# Atm Ens Analysis specific + +echo "BEGIN: config.atmensanlrun" + +# Get task specific resources +. "${EXPDIR}/config.resources" atmensanlrun + +echo "END: config.atmensanlrun" diff --git a/parm/config/config.resources b/parm/config/config.resources index e821a148cb3..ae5eedfdd60 100644 --- a/parm/config/config.resources +++ b/parm/config/config.resources @@ -4,13 +4,13 @@ # Set resource information for job tasks # e.g. walltime, node, cores per node, memory etc. -if [ $# -ne 1 ]; then +if [[ $# -ne 1 ]]; then echo "Must specify an input task argument to set resource variables!" echo "argument can be any one of the following:" echo "getic init coupled_ic aerosol_init" - echo "atmanalprep atmanalrun atmanalpost" - echo "atmensanalprep atmensanalrun atmensanalpost" + echo "atmanlinit atmanlrun atmanlfinal" + echo "atmensanlinit atmensanlrun atmensanlfinal" echo "aeroanlinit aeroanlrun aeroanlfinal" echo "anal sfcanl analcalc analdiag gldas fcst post vrfy metp arch echgres" echo "eobs ediag eomg eupd ecen esfc efcs epos earc" @@ -49,7 +49,7 @@ elif [[ ${machine} = "ORION" ]]; then export npe_node_max=40 fi -if [ ${step} = "prep" ]; then +if [[ "${step}" = "prep" ]]; then export wtime_prep='00:30:00' export npe_prep=4 export npe_node_prep=2 @@ -60,135 +60,181 @@ if [ ${step} = "prep" ]; then export memory_prep="40G" fi -elif [ ${step} = "aerosol_init" ]; then +elif [[ "${step}" = "aerosol_init" ]]; then export wtime_aerosol_init="00:05:00" export npe_aerosol_init=1 export nth_aerosol_init=1 - export npe_node_aerosol_init=$(echo "${npe_node_max} / ${nth_aerosol_init}" | bc) + npe_node_aerosol_init=$(echo "${npe_node_max} / ${nth_aerosol_init}" | bc) + export npe_node_aerosol_init export NTASKS=${npe_aerosol_init} export memory_aerosol_init="6G" -elif [ ${step} = "waveinit" ]; then +elif [[ "${step}" = "waveinit" ]]; then export wtime_waveinit="00:10:00" export npe_waveinit=12 export nth_waveinit=1 - export npe_node_waveinit=$(echo "${npe_node_max} / ${nth_waveinit}" | bc) + npe_node_waveinit=$(echo "${npe_node_max} / ${nth_waveinit}" | bc) + export npe_node_waveinit export NTASKS=${npe_waveinit} export memory_waveinit="2GB" -elif [ ${step} = "waveprep" ]; then +elif [[ "${step}" = "waveprep" ]]; then export wtime_waveprep="00:10:00" export npe_waveprep=5 export npe_waveprep_gfs=65 export nth_waveprep=1 export nth_waveprep_gfs=1 - export npe_node_waveprep=$(echo "${npe_node_max} / ${nth_waveprep}" | bc) - export npe_node_waveprep_gfs=$(echo "${npe_node_max} / ${nth_waveprep_gfs}" | bc) + npe_node_waveprep=$(echo "${npe_node_max} / ${nth_waveprep}" | bc) + export npe_node_waveprep + npe_node_waveprep_gfs=$(echo "${npe_node_max} / ${nth_waveprep_gfs}" | bc) + export npe_node_waveprep_gfs export NTASKS=${npe_waveprep} export NTASKS_gfs=${npe_waveprep_gfs} export memory_waveprep="100GB" export memory_waveprep_gfs="150GB" -elif [ ${step} = "wavepostsbs" ]; then +elif [[ "${step}" = "wavepostsbs" ]]; then export wtime_wavepostsbs="00:20:00" export wtime_wavepostsbs_gfs="03:00:00" export npe_wavepostsbs=8 export nth_wavepostsbs=1 - export npe_node_wavepostsbs=$(echo "${npe_node_max} / ${nth_wavepostsbs}" | bc) + npe_node_wavepostsbs=$(echo "${npe_node_max} / ${nth_wavepostsbs}" | bc) + export npe_node_wavepostsbs export NTASKS=${npe_wavepostsbs} export memory_wavepostsbs="10GB" export memory_wavepostsbs_gfs="10GB" -elif [ ${step} = "wavepostbndpnt" ]; then +elif [[ "${step}" = "wavepostbndpnt" ]]; then export wtime_wavepostbndpnt="01:00:00" export npe_wavepostbndpnt=240 export nth_wavepostbndpnt=1 - export npe_node_wavepostbndpnt=$(echo "${npe_node_max} / ${nth_wavepostbndpnt}" | bc) + npe_node_wavepostbndpnt=$(echo "${npe_node_max} / ${nth_wavepostbndpnt}" | bc) + export npe_node_wavepostbndpnt export NTASKS=${npe_wavepostbndpnt} export is_exclusive=True -elif [ ${step} = "wavepostbndpntbll" ]; then +elif [[ "${step}" = "wavepostbndpntbll" ]]; then export wtime_wavepostbndpntbll="01:00:00" export npe_wavepostbndpntbll=448 export nth_wavepostbndpntbll=1 - export npe_node_wavepostbndpntbll=$(echo "${npe_node_max} / ${nth_wavepostbndpntbll}" | bc) + npe_node_wavepostbndpntbll=$(echo "${npe_node_max} / ${nth_wavepostbndpntbll}" | bc) + export npe_node_wavepostbndpntbll export NTASKS=${npe_wavepostbndpntbll} export is_exclusive=True -elif [ ${step} = "wavepostpnt" ]; then +elif [[ "${step}" = "wavepostpnt" ]]; then export wtime_wavepostpnt="01:30:00" export npe_wavepostpnt=200 export nth_wavepostpnt=1 - export npe_node_wavepostpnt=$(echo "${npe_node_max} / ${nth_wavepostpnt}" | bc) + npe_node_wavepostpnt=$(echo "${npe_node_max} / ${nth_wavepostpnt}" | bc) + export npe_node_wavepostpnt export NTASKS=${npe_wavepostpnt} export is_exclusive=True -elif [ ${step} = "wavegempak" ]; then +elif [[ "${step}" = "wavegempak" ]]; then export wtime_wavegempak="02:00:00" export npe_wavegempak=1 export nth_wavegempak=1 - export npe_node_wavegempak=$(echo "${npe_node_max} / ${nth_wavegempak}" | bc) + npe_node_wavegempak=$(echo "${npe_node_max} / ${nth_wavegempak}" | bc) + export npe_node_wavegempak export NTASKS=${npe_wavegempak} export memory_wavegempak="1GB" -elif [ ${step} = "waveawipsbulls" ]; then +elif [[ "${step}" = "waveawipsbulls" ]]; then export wtime_waveawipsbulls="00:20:00" export npe_waveawipsbulls=1 export nth_waveawipsbulls=1 - export npe_node_waveawipsbulls=$(echo "${npe_node_max} / ${nth_waveawipsbulls}" | bc) + npe_node_waveawipsbulls=$(echo "${npe_node_max} / ${nth_waveawipsbulls}" | bc) + export npe_node_waveawipsbulls export NTASKS=${npe_waveawipsbulls} export is_exclusive=True -elif [ ${step} = "waveawipsgridded" ]; then +elif [[ "${step}" = "waveawipsgridded" ]]; then export wtime_waveawipsgridded="02:00:00" export npe_waveawipsgridded=1 export nth_waveawipsgridded=1 - export npe_node_waveawipsgridded=$(echo "${npe_node_max} / ${nth_waveawipsgridded}" | bc) + npe_node_waveawipsgridded=$(echo "${npe_node_max} / ${nth_waveawipsgridded}" | bc) + export npe_node_waveawipsgridded export NTASKS=${npe_waveawipsgridded} export memory_waveawipsgridded_gfs="1GB" -elif [[ "${step}" = "atmanalprep" ]]; then +elif [[ "${step}" = "atmanlinit" ]]; then - export wtime_atmanalprep="00:10:00" - export npe_atmanalprep=1 - export nth_atmanalprep=1 - npe_node_atmanalprep=$(echo "${npe_node_max} / ${nth_atmanalprep}" | bc) - export npe_node_atmanalprep - export memory_atmanalprep="3072M" + export wtime_atmanlinit="00:10:00" + export npe_atmanlinit=1 + export nth_atmanlinit=1 + npe_node_atmanlinit=$(echo "${npe_node_max} / ${nth_atmanlinit}" | bc) + export npe_node_atmanlinit + export memory_atmanlinit="3072M" -elif [[ "${step}" = "atmanalrun" ]]; then +elif [[ "${step}" = "atmanlrun" ]]; then # make below case dependent later export layout_x=1 export layout_y=1 - export wtime_atmanalrun="00:30:00" - npe_atmanalrun=$(echo "${layout_x} * ${layout_y} * 6" | bc) - export npe_atmanalrun - npe_atmanalrun_gfs=$(echo "${layout_x} * ${layout_y} * 6" | bc) - export npe_atmanalrun_gfs - export nth_atmanalrun=1 - export nth_atmanalrun_gfs=${nth_atmanalrun} - npe_node_atmanalrun=$(echo "${npe_node_max} / ${nth_atmanalrun}" | bc) - export npe_node_atmanalrun + export wtime_atmanlrun="00:30:00" + npe_atmanlrun=$(echo "${layout_x} * ${layout_y} * 6" | bc) + export npe_atmanlrun + npe_atmanlrun_gfs=$(echo "${layout_x} * ${layout_y} * 6" | bc) + export npe_atmanlrun_gfs + export nth_atmanlrun=1 + export nth_atmanlrun_gfs=${nth_atmanlrun} + npe_node_atmanlrun=$(echo "${npe_node_max} / ${nth_atmanlrun}" | bc) + export npe_node_atmanlrun export is_exclusive=True -elif [[ "${step}" = "atmanalpost" ]]; then +elif [[ "${step}" = "atmanlfinal" ]]; then - export wtime_atmanalpost="00:30:00" - export npe_atmanalpost=${npe_node_max} - export nth_atmanalpost=1 - npe_node_atmanalpost=$(echo "${npe_node_max} / ${nth_atmanalpost}" | bc) - export npe_node_atmanalpost + export wtime_atmanlfinal="00:30:00" + export npe_atmanlfinal=${npe_node_max} + export nth_atmanlfinal=1 + npe_node_atmanlfinal=$(echo "${npe_node_max} / ${nth_atmanlfinal}" | bc) + export npe_node_atmanlfinal + export is_exclusive=True + +elif [[ "${step}" = "atmensanlinit" ]]; then + + export wtime_atmensanlinit="00:10:00" + export npe_atmensanlinit=1 + export nth_atmensanlinit=1 + npe_node_atmensanlinit=$(echo "${npe_node_max} / ${nth_atmensanlinit}" | bc) + export npe_node_atmensanlinit + export memory_atmensanlinit="3072M" + +elif [[ "${step}" = "atmensanlrun" ]]; then + + # make below case dependent later + export layout_x=1 + export layout_y=1 + + export wtime_atmensanlrun="00:30:00" + npe_atmensanlrun=$(echo "${layout_x} * ${layout_y} * 6" | bc) + export npe_atmensanlrun + npe_atmensanlrun_gfs=$(echo "${layout_x} * ${layout_y} * 6" | bc) + export npe_atmensanlrun_gfs + export nth_atmensanlrun=1 + export nth_atmensanlrun_gfs=${nth_atmensanlrun} + npe_node_atmensanlrun=$(echo "${npe_node_max} / ${nth_atmensanlrun}" | bc) + export npe_node_atmensanlrun + export is_exclusive=True + +elif [[ "${step}" = "atmensanlfinal" ]]; then + + export wtime_atmensanlfinal="00:30:00" + export npe_atmensanlfinal=${npe_node_max} + export nth_atmensanlfinal=1 + npe_node_atmensanlfinal=$(echo "${npe_node_max} / ${nth_atmensanlfinal}" | bc) + export npe_node_atmensanlfinal export is_exclusive=True elif [[ "${step}" = "aeroanlinit" ]]; then @@ -324,7 +370,7 @@ elif [[ "${step}" = "ocnanalpost" ]]; then npe_node_ocnanalpost=$(echo "${npe_node_max} / ${nth_ocnanalpost}" | bc) export npe_node_ocnanalpost -elif [ ${step} = "anal" ]; then +elif [[ "${step}" = "anal" ]]; then export wtime_anal="00:50:00" export wtime_anal_gfs="00:40:00" @@ -336,7 +382,7 @@ elif [ ${step} = "anal" ]; then export nth_anal=8 export nth_anal_gfs=8 fi - if [ ${CASE} = "C384" ]; then + if [[ "${CASE}" = "C384" ]]; then export npe_anal=160 export npe_anal_gfs=160 export nth_anal=10 @@ -371,12 +417,14 @@ elif [ ${step} = "anal" ]; then fi fi fi - export npe_node_anal=$(echo "${npe_node_max} / ${nth_anal}" | bc) + npe_node_anal=$(echo "${npe_node_max} / ${nth_anal}" | bc) + export npe_node_anal export nth_cycle=${nth_anal} - export npe_node_cycle=$(echo "${npe_node_max} / ${nth_cycle}" | bc) + npe_node_cycle=$(echo "${npe_node_max} / ${nth_cycle}" | bc) + export npe_node_cycle export is_exclusive=True -elif [ ${step} = "analcalc" ]; then +elif [[ "${step}" = "analcalc" ]]; then export wtime_analcalc="00:10:00" export npe_analcalc=127 @@ -384,34 +432,39 @@ elif [ ${step} = "analcalc" ]; then export nth_analcalc=1 export nth_echgres=4 export nth_echgres_gfs=12 - export npe_node_analcalc=$(echo "${npe_node_max} / ${nth_analcalc}" | bc) + npe_node_analcalc=$(echo "${npe_node_max} / ${nth_analcalc}" | bc) + export npe_node_analcalc export is_exclusive=True -elif [ ${step} = "analdiag" ]; then +elif [[ "${step}" = "analdiag" ]]; then export wtime_analdiag="00:15:00" export npe_analdiag=96 # Should be at least twice npe_ediag export nth_analdiag=1 - export npe_node_analdiag=$(echo "${npe_node_max} / ${nth_analdiag}" | bc) + npe_node_analdiag=$(echo "${npe_node_max} / ${nth_analdiag}" | bc) + export npe_node_analdiag export memory_analdiag="48GB" -elif [ ${step} = "sfcanl" ]; then +elif [[ "${step}" = "sfcanl" ]]; then export wtime_sfcanl="00:10:00" export npe_sfcanl=6 export nth_sfcanl=1 - export npe_node_sfcanl=$(echo "${npe_node_max} / ${nth_sfcanl}" | bc) + npe_node_sfcanl=$(echo "${npe_node_max} / ${nth_sfcanl}" | bc) + export npe_node_sfcanl export is_exclusive=True -elif [ ${step} = "gldas" ]; then +elif [[ "${step}" = "gldas" ]]; then export wtime_gldas="00:10:00" export npe_gldas=112 export nth_gldas=1 - export npe_node_gldas=$(echo "${npe_node_max} / ${nth_gldas}" | bc) + npe_node_gldas=$(echo "${npe_node_max} / ${nth_gldas}" | bc) + export npe_node_gldas export npe_gaussian=96 export nth_gaussian=1 - export npe_node_gaussian=$(echo "${npe_node_max} / ${nth_gaussian}" | bc) + npe_node_gaussian=$(echo "${npe_node_max} / ${nth_gaussian}" | bc) + export npe_node_gaussian export is_exclusive=True elif [[ ${step} = "fcst" || ${step} = "efcs" ]]; then @@ -521,12 +574,12 @@ elif [ ${step} = "ocnpost" ]; then export nth_ocnpost=1 export memory_ocnpost="96G" -elif [ ${step} = "post" ]; then +elif [[ "${step}" = "post" ]]; then export wtime_post="00:12:00" export wtime_post_gfs="01:00:00" export npe_post=126 - res=$(echo ${CASE} | cut -c2-) + res=$(echo "${CASE}" | cut -c2-) if (( npe_post > res )); then export npe_post=${res} fi @@ -538,7 +591,7 @@ elif [ ${step} = "post" ]; then if [[ "${npe_node_post_gfs}" -gt "${npe_node_max}" ]]; then export npe_node_post_gfs=${npe_node_max} ; fi export is_exclusive=True -elif [ ${step} = "wafs" ]; then +elif [[ "${step}" = "wafs" ]]; then export wtime_wafs="00:30:00" export npe_wafs=1 @@ -546,7 +599,7 @@ elif [ ${step} = "wafs" ]; then export nth_wafs=1 export memory_wafs="1GB" -elif [ ${step} = "wafsgcip" ]; then +elif [[ "${step}" = "wafsgcip" ]]; then export wtime_wafsgcip="00:30:00" export npe_wafsgcip=2 @@ -554,39 +607,43 @@ elif [ ${step} = "wafsgcip" ]; then export npe_node_wafsgcip=1 export memory_wafsgcip="50GB" -elif [ ${step} = "wafsgrib2" ]; then +elif [[ "${step}" = "wafsgrib2" ]]; then export wtime_wafsgrib2="00:30:00" export npe_wafsgrib2=18 export nth_wafsgrib2=1 - export npe_node_wafsgrib2=$(echo "${npe_node_max} / ${nth_wafsgrib2}" | bc) + npe_node_wafsgrib2=$(echo "${npe_node_max} / ${nth_wafsgrib2}" | bc) + export npe_node_wafsgrib2 export memory_wafsgrib2="80GB" -elif [ ${step} = "wafsblending" ]; then +elif [[ "${step}" = "wafsblending" ]]; then export wtime_wafsblending="00:30:00" export npe_wafsblending=1 export nth_wafsblending=1 - export npe_node_wafsblending=$(echo "${npe_node_max} / ${nth_wafsblending}" | bc) + npe_node_wafsblending=$(echo "${npe_node_max} / ${nth_wafsblending}" | bc) + export npe_node_wafsblending export memory_wafsblending="15GB" -elif [ ${step} = "wafsgrib20p25" ]; then +elif [[ "${step}" = "wafsgrib20p25" ]]; then export wtime_wafsgrib20p25="00:30:00" export npe_wafsgrib20p25=11 export nth_wafsgrib20p25=1 - export npe_node_wafsgrib20p25=$(echo "${npe_node_max} / ${nth_wafsgrib20p25}" | bc) + npe_node_wafsgrib20p25=$(echo "${npe_node_max} / ${nth_wafsgrib20p25}" | bc) + export npe_node_wafsgrib20p25 export memory_wafsgrib20p25="80GB" -elif [ ${step} = "wafsblending0p25" ]; then +elif [[ "${step}" = "wafsblending0p25" ]]; then export wtime_wafsblending0p25="00:30:00" export npe_wafsblending0p25=1 export nth_wafsblending0p25=1 - export npe_node_wafsblending0p25=$(echo "${npe_node_max} / ${nth_wafsblending0p25}" | bc) + npe_node_wafsblending0p25=$(echo "${npe_node_max} / ${nth_wafsblending0p25}" | bc) + export npe_node_wafsblending0p25 export memory_wafsblending0p25="15GB" -elif [ ${step} = "vrfy" ]; then +elif [[ "${step}" = "vrfy" ]]; then export wtime_vrfy="03:00:00" export wtime_vrfy_gfs="06:00:00" @@ -600,7 +657,7 @@ elif [ ${step} = "vrfy" ]; then fi export is_exclusive=True -elif [ ${step} = "metp" ]; then +elif [[ "${step}" = "metp" ]]; then export nth_metp=1 export wtime_metp="03:00:00" @@ -611,7 +668,7 @@ elif [ ${step} = "metp" ]; then export npe_node_metp_gfs=4 export is_exclusive=True -elif [ ${step} = "echgres" ]; then +elif [[ "${step}" = "echgres" ]]; then export wtime_echgres="00:10:00" export npe_echgres=3 @@ -621,7 +678,7 @@ elif [ ${step} = "echgres" ]; then export memory_echgres="200GB" fi -elif [ ${step} = "init" ]; then +elif [[ "${step}" = "init" ]]; then export wtime_init="00:30:00" export npe_init=24 @@ -629,14 +686,14 @@ elif [ ${step} = "init" ]; then export npe_node_init=6 export memory_init="70G" -elif [ ${step} = "init_chem" ]; then +elif [[ "${step}" = "init_chem" ]]; then export wtime_init_chem="00:30:00" export npe_init_chem=1 export npe_node_init_chem=1 export is_exclusive=True -elif [ ${step} = "mom6ic" ]; then +elif [[ "${step}" = "mom6ic" ]]; then export wtime_mom6ic="00:30:00" export npe_mom6ic=24 @@ -654,7 +711,7 @@ elif [[ ${step} = "arch" || ${step} = "earc" || ${step} = "getic" ]]; then eval "export memory_${step}=50GB" fi -elif [ ${step} = "coupled_ic" ]; then +elif [[ "${step}" = "coupled_ic" ]]; then export wtime_coupled_ic="00:15:00" export npe_coupled_ic=1 @@ -662,36 +719,6 @@ elif [ ${step} = "coupled_ic" ]; then export nth_coupled_ic=1 export is_exclusive=True -elif [ ${step} = "atmensanalprep" ]; then - - export wtime_atmensanalprep="00:10:00" - export npe_atmensanalprep=1 - export nth_atmensanalprep=1 - export npe_node_atmensanalprep=$(echo "${npe_node_max} / ${nth_atmensanalprep}" | bc) - export is_exclusive=True - -elif [ ${step} = "atmensanalrun" ]; then - - # make below case dependent later - export layout_x=2 - export layout_y=3 - - export wtime_atmensanalrun="00:30:00" - export npe_atmensanalrun=$(echo "${layout_x} * ${layout_y} * 6" | bc) - export npe_atmensanalrun_gfs=$(echo "${layout_x} * ${layout_y} * 6" | bc) - export nth_atmensanalrun=1 - export nth_atmensanalrun_gfs=${nth_atmensanalrun} - export is_exclusive=True - export npe_node_atmensanalrun=$(echo "${npe_node_max} / ${nth_atmensanalrun}" | bc) - -elif [ ${step} = "atmensanalpost" ]; then - - export wtime_atmensanalpost="00:30:00" - export npe_atmensanalpost=${npe_node_max} - export nth_atmensanalpost=1 - export npe_node_atmensanalpost=$(echo "${npe_node_max} / ${nth_atmensanalpost}" | bc) - export is_exclusive=True - elif [[ ${step} = "eobs" || ${step} = "eomg" ]]; then export wtime_eobs="00:15:00" @@ -706,7 +733,8 @@ elif [[ ${step} = "eobs" || ${step} = "eomg" ]]; then export npe_eomg=${npe_eobs} export nth_eobs=2 export nth_eomg=${nth_eobs} - export npe_node_eobs=$(echo "${npe_node_max} / ${nth_eobs}" | bc) + npe_node_eobs=$(echo "${npe_node_max} / ${nth_eobs}" | bc) + export npe_node_eobs export npe_node_eomg=${npe_node_eobs} export is_exclusive=True #The number of tasks and cores used must be the same for eobs @@ -715,26 +743,27 @@ elif [[ ${step} = "eobs" || ${step} = "eomg" ]]; then export npe_node_eobs=10 fi -elif [ ${step} = "ediag" ]; then +elif [[ "${step}" = "ediag" ]]; then export wtime_ediag="00:15:00" export npe_ediag=48 export nth_ediag=1 - export npe_node_ediag=$(echo "${npe_node_max} / ${nth_ediag}" | bc) + npe_node_ediag=$(echo "${npe_node_max} / ${nth_ediag}" | bc) + export npe_node_ediag export memory_ediag="30GB" -elif [ ${step} = "eupd" ]; then +elif [[ "${step}" = "eupd" ]]; then export wtime_eupd="00:30:00" - if [ ${CASE} = "C768" ]; then + if [[ "${CASE}" = "C768" ]]; then export npe_eupd=480 export nth_eupd=6 if [[ "${machine}" = "WCOSS2" ]]; then export npe_eupd=315 export nth_eupd=14 fi - elif [ ${CASE} = "C384" ]; then - export npe_eupd=270 + elif [[ "${CASE}" = "C384" ]]; then + export npe_eupd=270 export nth_eupd=2 if [[ "${machine}" = "WCOSS2" ]]; then export npe_eupd=315 @@ -753,32 +782,37 @@ elif [ ${step} = "eupd" ]; then export nth_eupd=4 fi fi - export npe_node_eupd=$(echo "${npe_node_max} / ${nth_eupd}" | bc) + npe_node_eupd=$(echo "${npe_node_max} / ${nth_eupd}" | bc) + export npe_node_eupd export is_exclusive=True -elif [ ${step} = "ecen" ]; then +elif [[ "${step}" = "ecen" ]]; then export wtime_ecen="00:10:00" export npe_ecen=80 export nth_ecen=4 if [[ "${machine}" = "HERA" ]]; then export nth_ecen=6; fi if [[ ${CASE} = "C384" || ${CASE} = "C192" || ${CASE} = "C96" || ${CASE} = "C48" ]]; then export nth_ecen=2; fi - export npe_node_ecen=$(echo "${npe_node_max} / ${nth_ecen}" | bc) + npe_node_ecen=$(echo "${npe_node_max} / ${nth_ecen}" | bc) + export npe_node_ecen export nth_cycle=${nth_ecen} - export npe_node_cycle=$(echo "${npe_node_max} / ${nth_cycle}" | bc) + npe_node_cycle=$(echo "${npe_node_max} / ${nth_cycle}" | bc) + export npe_node_cycle export is_exclusive=True -elif [ ${step} = "esfc" ]; then +elif [[ "${step}" = "esfc" ]]; then export wtime_esfc="00:06:00" export npe_esfc=80 export nth_esfc=1 - export npe_node_esfc=$(echo "${npe_node_max} / ${nth_esfc}" | bc) + npe_node_esfc=$(echo "${npe_node_max} / ${nth_esfc}" | bc) + export npe_node_esfc export nth_cycle=${nth_esfc} - export npe_node_cycle=$(echo "${npe_node_max} / ${nth_cycle}" | bc) + npe_node_cycle=$(echo "${npe_node_max} / ${nth_cycle}" | bc) + export npe_node_cycle export memory_esfc="80GB" -elif [ ${step} = "epos" ]; then +elif [[ "${step}" = "epos" ]]; then export wtime_epos="00:15:00" export npe_epos=80 @@ -786,10 +820,11 @@ elif [ ${step} = "epos" ]; then if [[ "${machine}" == "HERA" ]]; then export nth_epos=6 fi - export npe_node_epos=$(echo "${npe_node_max} / ${nth_epos}" | bc) + npe_node_epos=$(echo "${npe_node_max} / ${nth_epos}" | bc) + export npe_node_epos export is_exclusive=True -elif [ ${step} = "postsnd" ]; then +elif [[ "${step}" = "postsnd" ]]; then export wtime_postsnd="02:00:00" export npe_postsnd=40 @@ -797,12 +832,14 @@ elif [ ${step} = "postsnd" ]; then export npe_node_postsnd=10 export npe_postsndcfp=9 export npe_node_postsndcfp=1 - if [[ "$(echo "${npe_node_postsnd} * ${nth_postsnd}" | bc)" -gt "${npe_node_max}" ]]; then - export npe_node_postsnd=$(echo "${npe_node_max} / ${nth_postsnd}" | bc) + postsnd_node_nth=$(echo "${npe_node_postsnd} * ${nth_postsnd}" | bc) + if [[ "${postsnd_node_nth}" -gt "${npe_node_max}" ]]; then + npe_node_postsnd=$(echo "${npe_node_max} / ${nth_postsnd}" | bc) + export npe_node_postsnd fi export is_exclusive=True -elif [ ${step} = "awips" ]; then +elif [[ "${step}" = "awips" ]]; then export wtime_awips="03:30:00" export npe_awips=1 @@ -810,7 +847,7 @@ elif [ ${step} = "awips" ]; then export nth_awips=1 export memory_awips="3GB" -elif [ ${step} = "gempak" ]; then +elif [[ "${step}" = "gempak" ]]; then export wtime_gempak="03:00:00" export npe_gempak=2 diff --git a/parm/parm_gdas/aero_crtm_coeff.yaml b/parm/parm_gdas/aero_crtm_coeff.yaml index 350eb93f619..b8bf579b33f 100644 --- a/parm/parm_gdas/aero_crtm_coeff.yaml +++ b/parm/parm_gdas/aero_crtm_coeff.yaml @@ -1,23 +1,23 @@ mkdir: - !ENV ${DATA}/crtm/ copy: -- - !ENV ${FV3JEDI_FIX}/crtm/${CRTM_VER}/AerosolCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/AerosolCoeff.bin - !ENV ${DATA}/crtm/AerosolCoeff.bin -- - !ENV ${FV3JEDI_FIX}/crtm/${CRTM_VER}/CloudCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/CloudCoeff.bin - !ENV ${DATA}/crtm/CloudCoeff.bin -- - !ENV ${FV3JEDI_FIX}/crtm/${CRTM_VER}/v.viirs-m_npp.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/v.viirs-m_npp.SpcCoeff.bin - !ENV ${DATA}/crtm/v.viirs-m_npp.SpcCoeff.bin -- - !ENV ${FV3JEDI_FIX}/crtm/${CRTM_VER}/v.viirs-m_npp.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/v.viirs-m_npp.TauCoeff.bin - !ENV ${DATA}/crtm/v.viirs-m_npp.TauCoeff.bin -- - !ENV ${FV3JEDI_FIX}/crtm/${CRTM_VER}/v.viirs-m_j1.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/v.viirs-m_j1.SpcCoeff.bin - !ENV ${DATA}/crtm/v.viirs-m_j1.SpcCoeff.bin -- - !ENV ${FV3JEDI_FIX}/crtm/${CRTM_VER}/v.viirs-m_j1.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/v.viirs-m_j1.TauCoeff.bin - !ENV ${DATA}/crtm/v.viirs-m_j1.TauCoeff.bin -- - !ENV ${FV3JEDI_FIX}/crtm/${CRTM_VER}/NPOESS.VISice.EmisCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/NPOESS.VISice.EmisCoeff.bin - !ENV ${DATA}/crtm/NPOESS.VISice.EmisCoeff.bin -- - !ENV ${FV3JEDI_FIX}/crtm/${CRTM_VER}/NPOESS.VISland.EmisCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/NPOESS.VISland.EmisCoeff.bin - !ENV ${DATA}/crtm/NPOESS.VISland.EmisCoeff.bin -- - !ENV ${FV3JEDI_FIX}/crtm/${CRTM_VER}/NPOESS.VISsnow.EmisCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/NPOESS.VISsnow.EmisCoeff.bin - !ENV ${DATA}/crtm/NPOESS.VISsnow.EmisCoeff.bin -- - !ENV ${FV3JEDI_FIX}/crtm/${CRTM_VER}/NPOESS.VISwater.EmisCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/NPOESS.VISwater.EmisCoeff.bin - !ENV ${DATA}/crtm/NPOESS.VISwater.EmisCoeff.bin diff --git a/parm/parm_gdas/atm_crtm_coeff.yaml b/parm/parm_gdas/atm_crtm_coeff.yaml new file mode 100644 index 00000000000..8c1b1ed25c2 --- /dev/null +++ b/parm/parm_gdas/atm_crtm_coeff.yaml @@ -0,0 +1,350 @@ +mkdir: +- !ENV ${DATA}/crtm/ +copy: +# Emissivity files +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/NPOESS.VISice.EmisCoeff.bin + - !ENV ${DATA}/crtm/NPOESS.VISice.EmisCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/NPOESS.VISland.EmisCoeff.bin + - !ENV ${DATA}/crtm/NPOESS.VISland.EmisCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/NPOESS.VISsnow.EmisCoeff.bin + - !ENV ${DATA}/crtm/NPOESS.VISsnow.EmisCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/NPOESS.VISwater.EmisCoeff.bin + - !ENV ${DATA}/crtm/NPOESS.VISwater.EmisCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/NPOESS.IRice.EmisCoeff.bin + - !ENV ${DATA}/crtm/NPOESS.IRice.EmisCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/NPOESS.IRland.EmisCoeff.bin + - !ENV ${DATA}/crtm/NPOESS.IRland.EmisCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/NPOESS.IRsnow.EmisCoeff.bin + - !ENV ${DATA}/crtm/NPOESS.IRsnow.EmisCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/Nalli.IRwater.EmisCoeff.bin + - !ENV ${DATA}/crtm/Nalli.IRwater.EmisCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/FASTEM6.MWwater.EmisCoeff.bin + - !ENV ${DATA}/crtm/FASTEM6.MWwater.EmisCoeff.bin +# Aerosol and Cloud files +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/AerosolCoeff.bin + - !ENV ${DATA}/crtm/AerosolCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/CloudCoeff.bin + - !ENV ${DATA}/crtm/CloudCoeff.bin +##- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/CloudCoeff.GFDLFV3.-109z-1.bin +## - !ENV ${DATA}/crtm/CloudCoeff.bin +# Satellite_Sensor specific Tau and Spc coefficient files +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/abi_g16.SpcCoeff.bin + - !ENV ${DATA}/crtm/abi_g16.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/abi_g16.TauCoeff.bin + - !ENV ${DATA}/crtm/abi_g16.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/abi_g17.SpcCoeff.bin + - !ENV ${DATA}/crtm/abi_g17.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/abi_g17.TauCoeff.bin + - !ENV ${DATA}/crtm/abi_g17.TauCoeff.bin +##- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/abi_g18.SpcCoeff.bin +## - !ENV ${DATA}/crtm/abi_g18.SpcCoeff.bin +##- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/abi_g18.TauCoeff.bin +## - !ENV ${DATA}/crtm/abi_g18.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/ahi_himawari8.SpcCoeff.bin + - !ENV ${DATA}/crtm/ahi_himawari8.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/ahi_himawari8.TauCoeff.bin + - !ENV ${DATA}/crtm/ahi_himawari8.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/ahi_himawari9.SpcCoeff.bin + - !ENV ${DATA}/crtm/ahi_himawari9.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/ahi_himawari9.TauCoeff.bin + - !ENV ${DATA}/crtm/ahi_himawari9.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/airs_aqua.SpcCoeff.bin + - !ENV ${DATA}/crtm/airs_aqua.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/airs_aqua.TauCoeff.bin + - !ENV ${DATA}/crtm/airs_aqua.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsr2_gcom-w1.SpcCoeff.bin + - !ENV ${DATA}/crtm/amsr2_gcom-w1.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsr2_gcom-w1.TauCoeff.bin + - !ENV ${DATA}/crtm/amsr2_gcom-w1.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsre_aqua.SpcCoeff.bin + - !ENV ${DATA}/crtm/amsre_aqua.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsre_aqua.TauCoeff.bin + - !ENV ${DATA}/crtm/amsre_aqua.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsua_aqua.SpcCoeff.bin + - !ENV ${DATA}/crtm/amsua_aqua.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsua_aqua.TauCoeff.bin + - !ENV ${DATA}/crtm/amsua_aqua.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsua_metop-a.SpcCoeff.bin + - !ENV ${DATA}/crtm/amsua_metop-a.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsua_metop-a.TauCoeff.bin + - !ENV ${DATA}/crtm/amsua_metop-a.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsua_metop-b.SpcCoeff.bin + - !ENV ${DATA}/crtm/amsua_metop-b.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsua_metop-b.TauCoeff.bin + - !ENV ${DATA}/crtm/amsua_metop-b.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsua_metop-c.SpcCoeff.bin + - !ENV ${DATA}/crtm/amsua_metop-c.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsua_metop-c.TauCoeff.bin + - !ENV ${DATA}/crtm/amsua_metop-c.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsua_n15.SpcCoeff.bin + - !ENV ${DATA}/crtm/amsua_n15.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsua_n15.TauCoeff.bin + - !ENV ${DATA}/crtm/amsua_n15.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsua_n18.SpcCoeff.bin + - !ENV ${DATA}/crtm/amsua_n18.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsua_n18.TauCoeff.bin + - !ENV ${DATA}/crtm/amsua_n18.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsua_n19.SpcCoeff.bin + - !ENV ${DATA}/crtm/amsua_n19.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsua_n19.TauCoeff.bin + - !ENV ${DATA}/crtm/amsua_n19.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsub_n17.SpcCoeff.bin + - !ENV ${DATA}/crtm/amsub_n17.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsub_n17.TauCoeff.bin + - !ENV ${DATA}/crtm/amsub_n17.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/atms_n20.SpcCoeff.bin + - !ENV ${DATA}/crtm/atms_n20.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/atms_n20.TauCoeff.bin + - !ENV ${DATA}/crtm/atms_n20.TauCoeff.bin +##- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/atms_n21.SpcCoeff.bin +## - !ENV ${DATA}/crtm/atms_n21.SpcCoeff.bin +##- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/atms_n21.TauCoeff.bin +## - !ENV ${DATA}/crtm/atms_n21.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/atms_npp.SpcCoeff.bin + - !ENV ${DATA}/crtm/atms_npp.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/atms_npp.TauCoeff.bin + - !ENV ${DATA}/crtm/atms_npp.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/avhrr3_metop-a.SpcCoeff.bin + - !ENV ${DATA}/crtm/avhrr3_metop-a.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/avhrr3_metop-a.TauCoeff.bin + - !ENV ${DATA}/crtm/avhrr3_metop-a.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/avhrr3_metop-b.SpcCoeff.bin + - !ENV ${DATA}/crtm/avhrr3_metop-b.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/avhrr3_metop-b.TauCoeff.bin + - !ENV ${DATA}/crtm/avhrr3_metop-b.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/avhrr3_metop-c.SpcCoeff.bin + - !ENV ${DATA}/crtm/avhrr3_metop-c.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/avhrr3_metop-c.TauCoeff.bin + - !ENV ${DATA}/crtm/avhrr3_metop-c.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/avhrr3_n18.SpcCoeff.bin + - !ENV ${DATA}/crtm/avhrr3_n18.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/avhrr3_n18.TauCoeff.bin + - !ENV ${DATA}/crtm/avhrr3_n18.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/avhrr3_n19.SpcCoeff.bin + - !ENV ${DATA}/crtm/avhrr3_n19.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/avhrr3_n19.TauCoeff.bin + - !ENV ${DATA}/crtm/avhrr3_n19.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/cris-fsr_n20.SpcCoeff.bin + - !ENV ${DATA}/crtm/cris-fsr_n20.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/cris-fsr_n20.TauCoeff.bin + - !ENV ${DATA}/crtm/cris-fsr_n20.TauCoeff.bin +##- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/cris-fsr_n21.SpcCoeff.bin +## - !ENV ${DATA}/crtm/cris-fsr_n21.SpcCoeff.bin +##- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/cris-fsr_n21.TauCoeff.bin +## - !ENV ${DATA}/crtm/cris-fsr_n21.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/cris-fsr_npp.SpcCoeff.bin + - !ENV ${DATA}/crtm/cris-fsr_npp.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/cris-fsr_npp.TauCoeff.bin + - !ENV ${DATA}/crtm/cris-fsr_npp.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/gmi_gpm.SpcCoeff.bin + - !ENV ${DATA}/crtm/gmi_gpm.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/gmi_gpm.TauCoeff.bin + - !ENV ${DATA}/crtm/gmi_gpm.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/hirs3_n17.SpcCoeff.bin + - !ENV ${DATA}/crtm/hirs3_n17.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/hirs3_n17.TauCoeff.bin + - !ENV ${DATA}/crtm/hirs3_n17.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/hirs4_metop-a.SpcCoeff.bin + - !ENV ${DATA}/crtm/hirs4_metop-a.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/hirs4_metop-a.TauCoeff.bin + - !ENV ${DATA}/crtm/hirs4_metop-a.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/hirs4_metop-b.SpcCoeff.bin + - !ENV ${DATA}/crtm/hirs4_metop-b.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/hirs4_metop-b.TauCoeff.bin + - !ENV ${DATA}/crtm/hirs4_metop-b.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/hirs4_n19.SpcCoeff.bin + - !ENV ${DATA}/crtm/hirs4_n19.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/hirs4_n19.TauCoeff.bin + - !ENV ${DATA}/crtm/hirs4_n19.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/iasi_metop-a.SpcCoeff.bin + - !ENV ${DATA}/crtm/iasi_metop-a.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/iasi_metop-a.TauCoeff.bin + - !ENV ${DATA}/crtm/iasi_metop-a.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/iasi_metop-b.SpcCoeff.bin + - !ENV ${DATA}/crtm/iasi_metop-b.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/iasi_metop-b.TauCoeff.bin + - !ENV ${DATA}/crtm/iasi_metop-b.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/iasi_metop-c.SpcCoeff.bin + - !ENV ${DATA}/crtm/iasi_metop-c.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/iasi_metop-c.TauCoeff.bin + - !ENV ${DATA}/crtm/iasi_metop-c.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/imgr_g11.SpcCoeff.bin + - !ENV ${DATA}/crtm/imgr_g11.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/imgr_g11.TauCoeff.bin + - !ENV ${DATA}/crtm/imgr_g11.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/imgr_g12.SpcCoeff.bin + - !ENV ${DATA}/crtm/imgr_g12.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/imgr_g12.TauCoeff.bin + - !ENV ${DATA}/crtm/imgr_g12.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/imgr_g13.SpcCoeff.bin + - !ENV ${DATA}/crtm/imgr_g13.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/imgr_g13.TauCoeff.bin + - !ENV ${DATA}/crtm/imgr_g13.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/imgr_g14.SpcCoeff.bin + - !ENV ${DATA}/crtm/imgr_g14.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/imgr_g14.TauCoeff.bin + - !ENV ${DATA}/crtm/imgr_g14.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/imgr_g15.SpcCoeff.bin + - !ENV ${DATA}/crtm/imgr_g15.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/imgr_g15.TauCoeff.bin + - !ENV ${DATA}/crtm/imgr_g15.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/mhs_metop-a.SpcCoeff.bin + - !ENV ${DATA}/crtm/mhs_metop-a.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/mhs_metop-a.TauCoeff.bin + - !ENV ${DATA}/crtm/mhs_metop-a.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/mhs_metop-b.SpcCoeff.bin + - !ENV ${DATA}/crtm/mhs_metop-b.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/mhs_metop-b.TauCoeff.bin + - !ENV ${DATA}/crtm/mhs_metop-b.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/mhs_metop-c.SpcCoeff.bin + - !ENV ${DATA}/crtm/mhs_metop-c.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/mhs_metop-c.TauCoeff.bin + - !ENV ${DATA}/crtm/mhs_metop-c.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/mhs_n18.SpcCoeff.bin + - !ENV ${DATA}/crtm/mhs_n18.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/mhs_n18.TauCoeff.bin + - !ENV ${DATA}/crtm/mhs_n18.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/mhs_n19.SpcCoeff.bin + - !ENV ${DATA}/crtm/mhs_n19.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/mhs_n19.TauCoeff.bin + - !ENV ${DATA}/crtm/mhs_n19.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/saphir_meghat.SpcCoeff.bin + - !ENV ${DATA}/crtm/saphir_meghat.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/saphir_meghat.TauCoeff.bin + - !ENV ${DATA}/crtm/saphir_meghat.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/seviri_m08.SpcCoeff.bin + - !ENV ${DATA}/crtm/seviri_m08.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/seviri_m08.TauCoeff.bin + - !ENV ${DATA}/crtm/seviri_m08.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/seviri_m09.SpcCoeff.bin + - !ENV ${DATA}/crtm/seviri_m09.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/seviri_m09.TauCoeff.bin + - !ENV ${DATA}/crtm/seviri_m09.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/seviri_m10.SpcCoeff.bin + - !ENV ${DATA}/crtm/seviri_m10.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/seviri_m10.TauCoeff.bin + - !ENV ${DATA}/crtm/seviri_m10.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/seviri_m11.SpcCoeff.bin + - !ENV ${DATA}/crtm/seviri_m11.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/seviri_m11.TauCoeff.bin + - !ENV ${DATA}/crtm/seviri_m11.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD1_g11.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD1_g11.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD1_g11.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD1_g11.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD1_g12.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD1_g12.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD1_g12.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD1_g12.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD1_g13.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD1_g13.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD1_g13.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD1_g13.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD1_g14.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD1_g14.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD1_g14.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD1_g14.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD1_g15.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD1_g15.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD1_g15.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD1_g15.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD2_g11.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD2_g11.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD2_g11.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD2_g11.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD2_g12.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD2_g12.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD2_g12.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD2_g12.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD2_g13.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD2_g13.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD2_g13.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD2_g13.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD2_g14.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD2_g14.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD2_g14.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD2_g14.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD2_g15.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD2_g15.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD2_g15.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD2_g15.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD3_g11.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD3_g11.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD3_g11.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD3_g11.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD3_g12.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD3_g12.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD3_g12.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD3_g12.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD3_g13.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD3_g13.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD3_g13.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD3_g13.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD3_g14.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD3_g14.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD3_g14.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD3_g14.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD3_g15.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD3_g15.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD3_g15.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD3_g15.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD4_g11.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD4_g11.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD4_g11.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD4_g11.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD4_g12.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD4_g12.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD4_g12.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD4_g12.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD4_g13.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD4_g13.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD4_g13.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD4_g13.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD4_g14.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD4_g14.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD4_g14.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD4_g14.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD4_g15.SpcCoeff.bin + - !ENV ${DATA}/crtm/sndrD4_g15.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/sndrD4_g15.TauCoeff.bin + - !ENV ${DATA}/crtm/sndrD4_g15.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/ssmi_f15.SpcCoeff.bin + - !ENV ${DATA}/crtm/ssmi_f15.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/ssmi_f15.TauCoeff.bin + - !ENV ${DATA}/crtm/ssmi_f15.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/ssmis_f16.SpcCoeff.bin + - !ENV ${DATA}/crtm/ssmis_f16.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/ssmis_f16.TauCoeff.bin + - !ENV ${DATA}/crtm/ssmis_f16.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/ssmis_f17.SpcCoeff.bin + - !ENV ${DATA}/crtm/ssmis_f17.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/ssmis_f17.TauCoeff.bin + - !ENV ${DATA}/crtm/ssmis_f17.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/ssmis_f18.SpcCoeff.bin + - !ENV ${DATA}/crtm/ssmis_f18.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/ssmis_f18.TauCoeff.bin + - !ENV ${DATA}/crtm/ssmis_f18.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/ssmis_f19.SpcCoeff.bin + - !ENV ${DATA}/crtm/ssmis_f19.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/ssmis_f19.TauCoeff.bin + - !ENV ${DATA}/crtm/ssmis_f19.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/ssmis_f20.SpcCoeff.bin + - !ENV ${DATA}/crtm/ssmis_f20.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/ssmis_f20.TauCoeff.bin + - !ENV ${DATA}/crtm/ssmis_f20.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/viirs-m_j1.SpcCoeff.bin + - !ENV ${DATA}/crtm/viirs-m_j1.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/viirs-m_j1.TauCoeff.bin + - !ENV ${DATA}/crtm/viirs-m_j1.TauCoeff.bin +##- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/viirs-m_j2.SpcCoeff.bin +## - !ENV ${DATA}/crtm/viirs-m_j2.SpcCoeff.bin +##- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/viirs-m_j2.TauCoeff.bin +## - !ENV ${DATA}/crtm/viirs-m_j2.TauCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/viirs-m_npp.SpcCoeff.bin + - !ENV ${DATA}/crtm/viirs-m_npp.SpcCoeff.bin +- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/viirs-m_npp.TauCoeff.bin + - !ENV ${DATA}/crtm/viirs-m_npp.TauCoeff.bin +# Special Spc files +##- - !ENV ${FV3JEDI_FIX}/crtm/${crtm_VERSION}/amsua_metop-a_v2.SpcCoeff.bin +## - !ENV ${DATA}/crtm/amsua_metop-a_v2.SpcCoeff.bin + diff --git a/parm/parm_gdas/atm_jedi_fix.yaml b/parm/parm_gdas/atm_jedi_fix.yaml new file mode 100644 index 00000000000..42bec3d888f --- /dev/null +++ b/parm/parm_gdas/atm_jedi_fix.yaml @@ -0,0 +1,11 @@ +mkdir: +- !ENV ${DATA}/fv3jedi +copy: +- - !ENV ${FV3JEDI_FIX}/fv3jedi/fv3files/akbk$(npz).nc4 + - !ENV ${DATA}/fv3jedi/akbk.nc4 +- - !ENV ${FV3JEDI_FIX}/fv3jedi/fv3files/fmsmpp.nml + - !ENV ${DATA}/fv3jedi/fmsmpp.nml +- - !ENV ${FV3JEDI_FIX}/fv3jedi/fv3files/field_table_gfdl + - !ENV ${DATA}/fv3jedi/field_table +- - !ENV ${FV3JEDI_FIX}/fv3jedi/fieldmetadata/gfs-restart.yaml + - !ENV ${DATA}/fv3jedi/gfs-restart.yaml diff --git a/parm/parm_gdas/atmanl_inc_vars.yaml b/parm/parm_gdas/atmanl_inc_vars.yaml new file mode 100644 index 00000000000..cb6718ce9f4 --- /dev/null +++ b/parm/parm_gdas/atmanl_inc_vars.yaml @@ -0,0 +1 @@ +incvars: ['ua', 'va', 't', 'sphum', 'liq_wat', 'ice_wat', 'o3mr'] diff --git a/scripts/exgdas_global_atmos_analysis_post.py b/scripts/exgdas_global_atmos_analysis_post.py deleted file mode 100755 index 2f17ee4aea2..00000000000 --- a/scripts/exgdas_global_atmos_analysis_post.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/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 deleted file mode 100755 index 65c77cd9036..00000000000 --- a/scripts/exgdas_global_atmos_analysis_prep.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/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 -from ufsda.stage import atm_obs, bias_obs - -# 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 deleted file mode 100755 index 45ccdf525b6..00000000000 --- a/scripts/exgdas_global_atmos_analysis_run.sh +++ /dev/null @@ -1,182 +0,0 @@ -#!/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. -source "$HOMEgfs/ush/preamble.sh" - -# 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/atmos/RESTART $DATA/ens/$memchar - done - done - -fi - -################################################################################ -# link fix files to $DATA -# static B -CASE_BERROR=${CASE_BERROR:-${CASE_ANL:-${CASE}}} -if [[ (${STATICB_TYPE} = "bump") || (${STATICB_TYPE} = "gsibec") ]] ; then - ${NLN} "${FV3JEDI_FIX}/${STATICB_TYPE}/${CASE_BERROR}/" "${DATA}/berror" -fi - -# 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" "${DATA}/crtm" - -# Link executable to $DATA -$NLN $JEDIVAREXE $DATA/fv3jedi_var.x - -################################################################################ -# run executable -export OMP_NUM_THREADS=$NTHREADS_ATMANAL -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 -if [[ "${CASE_BERROR}" = "${CASE}" ]]; then - atmges_fv3=${COMIN_GES}/${GPREFIX}atmf006.nc -else - atmges_fv3=${COMIN_GES}/${GPREFIX}atmf006.ensres.nc -fi -atminc_jedi=${DATA}/anl/atminc.${PDY}_${cyc}0000z.nc4 -atminc_fv3=${COMOUT}/${CDUMP}.${cycle}.atminc.nc -if [ -s $atminc_jedi ]; then - $INCPY $atmges_fv3 $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 - -################################################################################ - -exit ${err} - -################################################################################ diff --git a/scripts/exgdas_global_atmos_ensanal_post.py b/scripts/exgdas_global_atmos_ensanal_post.py deleted file mode 100755 index 6c5384953f7..00000000000 --- a/scripts/exgdas_global_atmos_ensanal_post.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/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 deleted file mode 100755 index 2e87573eda1..00000000000 --- a/scripts/exgdas_global_atmos_ensanal_run.sh +++ /dev/null @@ -1,167 +0,0 @@ -#!/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. -source "$HOMEgfs/ush/preamble.sh" - -# 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" "${DATA}/crtm" - -# Link executable to $DATA -$NLN $JEDIENSEXE $DATA/fv3jedi_ens.x - -################################################################################ -# run executable -export OMP_NUM_THREADS=$NTHREADS_ATMENSANAL -export pgm=$JEDIENSEXE -. 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) - atmges_fv3=$COMIN_GES_ENS/$memchar/${GPREFIX}atmf006.nc - 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 $atmges_fv3 $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}/" - - -################################################################################ - -exit ${err} - -################################################################################ diff --git a/scripts/exglobal_atm_analysis_finalize.py b/scripts/exglobal_atm_analysis_finalize.py new file mode 100755 index 00000000000..05507477540 --- /dev/null +++ b/scripts/exglobal_atm_analysis_finalize.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 +# exgdas_global_atm_analysis_finalize.py +# This script creates an AtmAnalysis class +# and runs the finalize method +# which perform post-processing and clean up activities +# for a global atm variational analysis +import os + +from pygw.logger import Logger, logit +from pygw.configuration import cast_strdict_as_dtypedict +from pygfs.task.atm_analysis import AtmAnalysis + + +# Initialize root logger +logger = Logger(level='DEBUG', colored_log=True) + + +if __name__ == '__main__': + + # Take configuration from environment and cast it as python dictionary + config = cast_strdict_as_dtypedict(os.environ) + + # Instantiate the atm analysis task + AtmAnl = AtmAnalysis(config) + AtmAnl.finalize() diff --git a/scripts/exglobal_atm_analysis_initialize.py b/scripts/exglobal_atm_analysis_initialize.py new file mode 100755 index 00000000000..b003d98c005 --- /dev/null +++ b/scripts/exglobal_atm_analysis_initialize.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 +# exgdas_global_atm_analysis_initialize.py +# This script creates an AtmAnalysis class +# and runs the initialize method +# which create and stage the runtime directory +# and create the YAML configuration +# for a global atm variational analysis +import os + +from pygw.logger import Logger +from pygw.configuration import cast_strdict_as_dtypedict +from pygfs.task.atm_analysis import AtmAnalysis + +# Initialize root logger +logger = Logger(level='DEBUG', colored_log=True) + + +if __name__ == '__main__': + + # Take configuration from environment and cast it as python dictionary + config = cast_strdict_as_dtypedict(os.environ) + + # Instantiate the atm analysis task + AtmAnl = AtmAnalysis(config) + AtmAnl.initialize() diff --git a/scripts/exglobal_atm_analysis_run.sh b/scripts/exglobal_atm_analysis_run.sh new file mode 100755 index 00000000000..74322fc4d41 --- /dev/null +++ b/scripts/exglobal_atm_analysis_run.sh @@ -0,0 +1,16 @@ +#!/bin/bash +################################################################################ +# exgdas_global_atm_analysis_run.sh +# +# This script runs a global atm variational analysis with FV3-JEDI. +# It assumes the runtime directory has already been staged with the appropriate +# input files and YAML configuration (by the initialize script) before execution. +# +################################################################################ +# run executable +set -x +export pgm=${JEDIVAREXE} +. prep_step +${APRUN_ATMANL} "${DATA}/fv3jedi_var.x" "${DATA}/${CDUMP}.t${cyc}z.atmvar.yaml" 1>&1 2>&2 +export err=$?; err_chk +exit "${err}" diff --git a/scripts/exglobal_atmens_analysis_finalize.py b/scripts/exglobal_atmens_analysis_finalize.py new file mode 100755 index 00000000000..eb41b180711 --- /dev/null +++ b/scripts/exglobal_atmens_analysis_finalize.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 +# exgdas_global_atmens_analysis_finalize.py +# This script creates an AtmEnsAnalysis class +# and runs the finalize method +# which perform post-processing and clean up activities +# for a global atmens variational analysis +import os + +from pygw.logger import Logger, logit +from pygw.configuration import cast_strdict_as_dtypedict +from pygfs.task.atmens_analysis import AtmEnsAnalysis + + +# Initialize root logger +logger = Logger(level='DEBUG', colored_log=True) + + +if __name__ == '__main__': + + # Take configuration from environment and cast it as python dictionary + config = cast_strdict_as_dtypedict(os.environ) + + # Instantiate the atmens analysis task + AtmEnsAnl = AtmEnsAnalysis(config) + AtmEnsAnl.finalize() diff --git a/scripts/exglobal_atmens_analysis_initialize.py b/scripts/exglobal_atmens_analysis_initialize.py new file mode 100755 index 00000000000..f2776190c03 --- /dev/null +++ b/scripts/exglobal_atmens_analysis_initialize.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 +# exgdas_global_atmens_analysis_initialize.py +# This script creates an AtmEnsAnalysis class +# and runs the initialize method +# which create and stage the runtime directory +# and create the YAML configuration +# for a global atmens variational analysis +import os + +from pygw.logger import Logger +from pygw.configuration import cast_strdict_as_dtypedict +from pygfs.task.atmens_analysis import AtmEnsAnalysis + +# Initialize root logger +logger = Logger(level='DEBUG', colored_log=True) + + +if __name__ == '__main__': + + # Take configuration from environment and cast it as python dictionary + config = cast_strdict_as_dtypedict(os.environ) + + # Instantiate the atmens analysis task + AtmEnsAnl = AtmEnsAnalysis(config) + AtmEnsAnl.initialize() diff --git a/scripts/exglobal_atmens_analysis_run.sh b/scripts/exglobal_atmens_analysis_run.sh new file mode 100755 index 00000000000..19ce9017102 --- /dev/null +++ b/scripts/exglobal_atmens_analysis_run.sh @@ -0,0 +1,16 @@ +#!/bin/bash +################################################################################ +# exgdas_global_atmens_analysis_run.sh +# +# This script runs a global atmens variational analysis with FV3-JEDI. +# It assumes the runtime directory has already been staged with the appropriate +# input files and YAML configuration (by the initialize script) before execution. +# +################################################################################ +# run executable +set -x +export pgm=${JEDIVAREXE} +. prep_step +${APRUN_ATMENSANL} "${DATA}/fv3jedi_letkf.x" "${DATA}/${CDUMP}.t${cyc}z.atmens.yaml" 1>&1 2>&2 +export err=$?; err_chk +exit "${err}" diff --git a/ush/python/pygfs/task/aero_analysis.py b/ush/python/pygfs/task/aero_analysis.py index bfb10f43af0..e7dafce7d53 100644 --- a/ush/python/pygfs/task/aero_analysis.py +++ b/ush/python/pygfs/task/aero_analysis.py @@ -72,16 +72,10 @@ def initialize(self: Analysis) -> None: super().initialize() # stage CRTM fix files - crtm_fix_list_path = os.path.join(self.task_config['HOMEgfs'], 'parm', 'parm_gdas', 'aero_crtm_coeff.yaml') - crtm_fix_list = YAMLFile(path=crtm_fix_list_path) - crtm_fix_list = Template.substitute_structure(crtm_fix_list, TemplateConstants.DOLLAR_PARENTHESES, self.task_config.get) - FileHandler(crtm_fix_list).sync() + super().stage_fix('aero_crtm_coeff.yaml') # stage fix files - jedi_fix_list_path = os.path.join(self.task_config['HOMEgfs'], 'parm', 'parm_gdas', 'aero_jedi_fix.yaml') - jedi_fix_list = YAMLFile(path=jedi_fix_list_path) - jedi_fix_list = Template.substitute_structure(jedi_fix_list, TemplateConstants.DOLLAR_PARENTHESES, self.task_config.get) - FileHandler(jedi_fix_list).sync() + super().stage_fix('aero_jedi_fix.yaml') # stage berror files # copy BUMP files, otherwise it will assume ID matrix diff --git a/ush/python/pygfs/task/analysis.py b/ush/python/pygfs/task/analysis.py index 357cf0c47e4..ce9d87e91b8 100644 --- a/ush/python/pygfs/task/analysis.py +++ b/ush/python/pygfs/task/analysis.py @@ -9,6 +9,7 @@ from pygw.file_utils import FileHandler from pygw.logger import logit from pygw.task import Task +from pygw.template import Template, TemplateConstants logger = getLogger(__name__.split('.')[-1]) @@ -31,6 +32,10 @@ def initialize(self) -> None: obs_dict = self.get_obs_dict() FileHandler(obs_dict).sync() + # some analyses need to stage bias corrections + bias_dict = self.get_bias_dict() + FileHandler(bias_dict).sync() + @logit(logger) def get_obs_dict(self: Task) -> Dict[str, Any]: """Compile a dictionary of observation files to copy @@ -48,6 +53,7 @@ def get_obs_dict(self: Task) -> Dict[str, Any]: a dictionary containing the list of observation files to copy for FileHandler """ obs_list_config = YAMLFile(path=self.config['OBS_LIST']) + # get observers from master dictionary observers = obs_list_config['observers'] copylist = [] @@ -61,6 +67,47 @@ def get_obs_dict(self: Task) -> Dict[str, Any]: } return obs_dict + @logit(logger) + def get_bias_dict(self: Task) -> Dict[str, Any]: + """Compile a dictionary of observation files to copy + + This method uses the OBS_LIST configuration variable to generate a dictionary + from a list of YAML files that specify what observation bias correction files + are to be copied to the run directory from the observation input directory + + Parameters + ---------- + + Returns + ---------- + obs_dict: Dict + a dictionary containing the list of observation files to copy for FileHandler + """ + obs_list_config = YAMLFile(path=self.config['OBS_LIST']) + # get observers from master dictionary + observers = obs_list_config['observers'] + copylist = [] + for ob in observers: + if 'obs bias' in ob.keys(): + obfile = ob['obs bias']['input file'] + basename = os.path.basename(obfile) + copylist.append([os.path.join(self.task_config.comin_ges_atm, basename), obfile]) + + obfile2 = obfile.replace('satbias', 'satbias_cov') + basename = os.path.basename(obfile2) + copylist.append([os.path.join(self.task_config.comin_ges_atm, basename), obfile2]) + + obfile2 = obfile.replace('satbias', 'tlapse') + obfile2 = obfile2.replace('nc4', 'txt') + basename = os.path.basename(obfile2) + copylist.append([os.path.join(self.task_config.comin_ges_atm, basename), obfile2]) + + obs_dict = { + 'mkdir': [os.path.join(self.runtime_config['DATA'], 'bc')], + 'copy': copylist + } + return obs_dict + @logit(logger) def add_fv3_increments(self, inc_file_tmpl: str, bkg_file_tmpl: str, incvars: List) -> None: """Add cubed-sphere increments to cubed-sphere backgrounds @@ -126,3 +173,19 @@ def get_berror_dict(self, config: Dict[str, Any]) -> Dict[str, List[str]]: """ berror_dict = {'foo': 'bar'} return berror_dict + + @logit(logger) + def stage_fix(self, fix_yaml: str) -> None: + """Stage fix files + + This method is a placeholder for now... will be possibly made generic at a later date + + Parameters + ---------- + fix_yaml : str + tamplate of fix files to copy + """ + fix_list_path = os.path.join(self.config['HOMEgfs'], 'parm', 'parm_gdas', fix_yaml) + fix_list = YAMLFile(path=fix_list_path) + fix_list = Template.substitute_structure(fix_list, TemplateConstants.DOLLAR_PARENTHESES, self.task_config.get) + FileHandler(fix_list).sync() diff --git a/ush/python/pygfs/task/atm_analysis.py b/ush/python/pygfs/task/atm_analysis.py new file mode 100644 index 00000000000..a3f0c14b2da --- /dev/null +++ b/ush/python/pygfs/task/atm_analysis.py @@ -0,0 +1,308 @@ +#!/usr/bin/env python3 + +import os +import glob +import gzip +import tarfile +from netCDF4 import Dataset +from logging import getLogger +from typing import Dict, List, Any + +from pygw.attrdict import AttrDict +from pygw.file_utils import FileHandler +from pygw.timetools import to_isotime, to_fv3time, to_timedelta +from pygw.fsutils import rm_p +from pygw.template import Template, TemplateConstants +from pygw.yaml_file import YAMLFile +from pygw.logger import logit +from pygfs.task.analysis import Analysis + +logger = getLogger(__name__.split('.')[-1]) + + +class AtmAnalysis(Analysis): + """ + Class for global atm analysis tasks + """ + @logit(logger, name="AtmAnalysis") + def __init__(self, config): + super().__init__(config) + + _res = int(self.config['CASE'][1:]) + _res_enkf = int(self.config['CASE_ENKF'][1:]) + _window_begin = self.runtime_config.current_cycle - to_timedelta(f"{self.config['assim_freq']}H") / 2 + + # Create a local dictionary that is repeatedly used across this class + local_dict = AttrDict( + { + 'npx_ges': _res + 1, + 'npy_ges': _res + 1, + 'npz_ges': self.config.LEVS - 1, + 'npz': self.config.LEVS - 1, + 'npx_anl': _res_enkf + 1, + 'npy_anl': _res_enkf + 1, + 'npz_anl': self.config['LEVS'] - 1, + 'ATM_WINDOW_BEGIN': to_isotime(_window_begin), + 'ATM_WINDOW_LENGTH': f"PT{self.config['assim_freq']}H", + 'BKG_ISOTIME': to_isotime(self.runtime_config.current_cycle), + 'BKG_YYYYmmddHHMMSS': to_fv3time(self.runtime_config.current_cycle), + 'cdate_fv3': to_fv3time(self.runtime_config.current_cycle), + 'comin_ges_atm': self.config.COMIN_GES, + } + ) + + # task_config is everything that this task should need + self.task_config = AttrDict(**self.config, **self.runtime_config, **local_dict) + + @logit(logger) + def initialize(self: Analysis) -> None: + """Initialize a global atm analysis + + This method will initialize a global atm analysis using JEDI. + This includes: + - staging CRTM fix files + - staging FV3-JEDI fix files + - staging B error files + - staging model backgrounds + - generating a YAML file for the JEDI executable + - linking the JEDI executable (TODO make it copyable, requires JEDI fix) + - creating output directories + """ + + # stage observations and bias corrections + super().initialize() + + # stage CRTM fix files + super().stage_fix('atm_crtm_coeff.yaml') + + # stage fix files + super().stage_fix('atm_jedi_fix.yaml') + + # stage berror files + # copy BUMP files, otherwise it will assume ID matrix + if self.task_config.get('STATICB_TYPE', 'identity') in ['bump']: + FileHandler(AtmAnalysis.get_berror_dict(self.task_config)).sync() + + # stage backgrounds + FileHandler(self.get_bkg_dict(AttrDict(self.task_config, **self.task_config))).sync() + + # generate variational YAML file + yaml_out = os.path.join(self.task_config['DATA'], f"{self.task_config['CDUMP']}.t{self.runtime_config['cyc']:02d}z.atmvar.yaml") + varda_yaml = YAMLFile(path=self.task_config['ATMVARYAML']) + varda_yaml = Template.substitute_structure(varda_yaml, TemplateConstants.DOUBLE_CURLY_BRACES, self.task_config.get) + varda_yaml = Template.substitute_structure(varda_yaml, TemplateConstants.DOLLAR_PARENTHESES, self.task_config.get) + varda_yaml.save(yaml_out) + logger.info(f"Wrote YAML to {yaml_out}") + + # link var executable + exe_src = self.task_config['JEDIVAREXE'] + exe_dest = os.path.join(self.task_config['DATA'], os.path.basename(exe_src)) + if os.path.exists(exe_dest): + rm_p(exe_dest) + os.symlink(exe_src, exe_dest) + + # need output dir for diags and anl + newdirs = [ + os.path.join(self.task_config['DATA'], 'anl'), + os.path.join(self.task_config['DATA'], 'diags'), + ] + FileHandler({'mkdir': newdirs}).sync() + + @logit(logger) + def finalize(self: Analysis) -> None: + """Finalize a global atm analysis + + This method will finalize a global atm analysis using JEDI. + This includes: + - tarring up output diag files and place in ROTDIR + - copying the generated YAML file from initialize to the ROTDIR + - copying the guess files to the ROTDIR + - applying the increments to the original RESTART files + - moving the increment files to the ROTDIR + + Please note that some of these steps are temporary and will be modified + once the model is able to read atm tracer increments. + """ + # ---- tar up diags + # path of output tar statfile + atmstat = os.path.join(self.task_config['COMOUTatmos'], f"{self.task_config['APREFIX']}atmstat") + + # get list of diag files to put in tarball + diags = glob.glob(os.path.join(self.task_config['DATA'], 'diags', 'diag*nc4')) + + # gzip the files first + for diagfile in diags: + with open(diagfile, 'rb') as f_in, gzip.open(f"{diagfile}.gz", 'wb') as f_out: + f_out.writelines(f_in) + + # open tar file for writing + with tarfile.open(atmstat, "w") as archive: + for diagfile in diags: + archive.add(f"{diagfile}.gz") + + # copy full YAML from executable to ROTDIR + src = os.path.join(self.task_config['DATA'], f"{self.task_config['CDUMP']}.t{self.runtime_config['cyc']:02d}z.atmvar.yaml") + dest = os.path.join(self.task_config['COMOUTatmos'], f"{self.task_config['CDUMP']}.t{self.runtime_config['cyc']:02d}z.atmvar.yaml") + yaml_copy = { + 'mkdir': [self.task_config['COMOUTatmos']], + 'copy': [[src, dest]] + } + FileHandler(yaml_copy).sync() + + # ---- NOTE below is 'temporary', eventually we will not be using FMS RESTART formatted files + # ---- all of the rest of this method will need to be changed but requires model and JEDI changes + # ---- copy RESTART fv_tracer files for future reference + # fms_bkg_file_template = os.path.join(self.task_config.comin_ges_atm, 'RESTART', f'{self.task_config.cdate_fv3}.fv_tracer.res.tileX.nc') + # bkglist = [] + # for itile in range(1, self.task_config.ntiles + 1): + # bkg_path = fms_bkg_file_template.replace('tileX', f'tile{itile}') + # dest = os.path.join(self.task_config['COMOUTatmos'], f'atmges.{os.path.basename(bkg_path)}') + # bkglist.append([bkg_path, dest]) + # FileHandler({'copy': bkglist}).sync() + + # ---- add increments to RESTART files + # logger.info('Adding increments to RESTART files') + # self._add_fms_cube_sphere_increments() + + # ---- move increments to ROTDIR + # logger.info('Moving increments to ROTDIR') + # fms_inc_file_template = os.path.join(self.task_config['DATA'], 'anl', f'atminc.{self.task_config.cdate_fv3}.fv_tracer.res.tileX.nc') + # inclist = [] + # for itile in range(1, self.task_config.ntiles + 1): + # inc_path = fms_inc_file_template.replace('tileX', f'tile{itile}') + # dest = os.path.join(self.task_config['COMOUTatmos'], os.path.basename(inc_path)) + # inclist.append([inc_path, dest]) + # FileHandler({'copy': inclist}).sync() + + # ---- copy increments to ROTDIR + cdate_inc = self.task_config.cdate_fv3.replace('.', '_') + src = os.path.join(self.task_config['DATA'], 'anl', f'atminc.{cdate_inc}z.nc4') + dest = os.path.join(self.task_config['COMOUTatmos'], f"{self.task_config['CDUMP']}.t{self.runtime_config['cyc']:02d}z.atminc.nc") + inclist = [] + inclist = { + 'mkdir': [self.task_config['COMOUTatmos']], + 'copy': [[src, dest]] + } + FileHandler(inclist).sync() + + def clean(self): + super().clean() + + @logit(logger) + def _add_fms_cube_sphere_increments(self: Analysis) -> None: + """This method adds increments to RESTART files to get an analysis + NOTE this is only needed for now because the model cannot read atm increments. + This method will be assumed to be deprecated before this is implemented operationally + """ + # only need the fv_tracer files + fms_inc_file_template = os.path.join(self.task_config['DATA'], 'anl', f'atminc.{self.task_config.cdate_fv3}.fv_tracer.res.tileX.nc') + fms_bkg_file_template = os.path.join(self.task_config.comin_ges_atm, 'RESTART', f'{self.task_config.cdate_fv3}.fv_tracer.res.tileX.nc') + # get list of increment vars + incvars_list_path = os.path.join(self.task_config['HOMEgfs'], 'parm', 'parm_gdas', 'atmanl_inc_vars.yaml') + incvars = YAMLFile(path=incvars_list_path) + super().add_fv3_increments(fms_inc_file_template, fms_bkg_file_template, incvars) + + @logit(logger) + def get_bkg_dict(self, task_config: Dict[str, Any]) -> Dict[str, List[str]]: + """Compile a dictionary of model background files to copy + + This method constructs a dictionary of FV3 RESTART files (coupler, core, tracer) + that are needed for global atm DA and returns said dictionary for use by the FileHandler class. + + Parameters + ---------- + task_config: Dict + a dictionary containing all of the configuration needed for the task + + Returns + ---------- + bkg_dict: Dict + a dictionary containing the list of model background files to copy for FileHandler + """ + super().get_bkg_dict(task_config) + # NOTE for now this is FV3 RESTART files and just assumed to be fh006 + + # get FV3 RESTART files, this will be a lot simpler when using history files + rst_dir = os.path.join(task_config.comin_ges_atm, 'RESTART') # for now, option later? + + # atm DA only needs core/tracer + bkglist = [] + basename = f'{task_config.cdate_fv3}.coupler.res' + bkglist.append([os.path.join(rst_dir, basename), os.path.join(task_config['DATA'], 'bkg', basename)]) + basename = f'{task_config.cdate_fv3}.fv_core.res.nc' + bkglist.append([os.path.join(rst_dir, basename), os.path.join(task_config['DATA'], 'bkg', basename)]) + basename_cadat = f'{task_config.cdate_fv3}.ca_data.tileX.nc' + basename_core = f'{task_config.cdate_fv3}.fv_core.res.tileX.nc' + basename_srfwnd = f'{task_config.cdate_fv3}.fv_srf_wnd.res.tileX.nc' + basename_tracer = f'{task_config.cdate_fv3}.fv_tracer.res.tileX.nc' + basename_phydat = f'{task_config.cdate_fv3}.phy_data.tileX.nc' + basename_sfcdat = f'{task_config.cdate_fv3}.sfc_data.tileX.nc' + for itile in range(1, task_config.ntiles + 1): + basename = basename_cadat.replace('tileX', f'tile{itile}') + bkglist.append([os.path.join(rst_dir, basename), os.path.join(task_config['DATA'], 'bkg', basename)]) + basename = basename_core.replace('tileX', f'tile{itile}') + bkglist.append([os.path.join(rst_dir, basename), os.path.join(task_config['DATA'], 'bkg', basename)]) + basename = basename_srfwnd.replace('tileX', f'tile{itile}') + bkglist.append([os.path.join(rst_dir, basename), os.path.join(task_config['DATA'], 'bkg', basename)]) + basename = basename_tracer.replace('tileX', f'tile{itile}') + bkglist.append([os.path.join(rst_dir, basename), os.path.join(task_config['DATA'], 'bkg', basename)]) + basename = basename_phydat.replace('tileX', f'tile{itile}') + bkglist.append([os.path.join(rst_dir, basename), os.path.join(task_config['DATA'], 'bkg', basename)]) + basename = basename_sfcdat.replace('tileX', f'tile{itile}') + bkglist.append([os.path.join(rst_dir, basename), os.path.join(task_config['DATA'], 'bkg', basename)]) + bkg_dict = { + 'mkdir': [os.path.join(task_config['DATA'], 'bkg')], + 'copy': bkglist, + } + return bkg_dict + + @logit(logger) + def get_berror_dict(self, config: Dict[str, Any]) -> Dict[str, List[str]]: + """Compile a dictionary of background error files to copy + + This method will construct a dictionary of BUMP background error files + for global atm DA and return said dictionary for use by the FileHandler class. + This dictionary contains coupler and fv_tracer files + for correlation and standard deviation as well as NICAS localization. + + Parameters + ---------- + config: Dict + a dictionary containing all of the configuration needed + + Returns + ---------- + berror_dict: Dict + a dictionary containing the list of background error files to copy for FileHandler + """ + super.get_berror_dict(config) + # atm static-B needs nicas, cor_rh, cor_rv and stddev files. + b_dir = config['BERROR_DATA_DIR'] + b_datestr = config['BERROR_DATE'] + berror_list = [] + + for ftype in ['cor_rh', 'cor_rv', 'stddev']: + template_bump_coupler = f'{b_datestr}.{ftype}.coupler.res' + template_bump_tracer = f'{b_datestr}.{ftype}.fv_tracer.res.tileX.nc' + berror_list.append([ + os.path.join(b_dir, template_bump_coupler), + os.path.join(config['DATA'], 'berror', template_bump_coupler) + ]) + for itile in range(1, config.ntiles + 1): + bump_tracer = template_bump_tracer.replace('tileX', f'tile{itile}') + berror_list.append([ + os.path.join(b_dir, bump_tracer), + os.path.join(config['DATA'], 'berror', bump_tracer) + ]) + + nproc = config.ntiles * config['layout_x'] * config['layout_y'] + for nn in range(1, nproc + 1): + berror_list.append([ + os.path.join(b_dir, f'nicas_atm_nicas_local_{nproc:06}-{nn:06}.nc'), + os.path.join(config['DATA'], 'berror', f'nicas_atm_nicas_local_{nproc:06}-{nn:06}.nc') + ]) + berror_dict = { + 'mkdir': [os.path.join(config['DATA'], 'berror')], + 'copy': berror_list, + } + return berror_dict diff --git a/ush/python/pygfs/task/atmens_analysis.py b/ush/python/pygfs/task/atmens_analysis.py new file mode 100644 index 00000000000..a261bd3543a --- /dev/null +++ b/ush/python/pygfs/task/atmens_analysis.py @@ -0,0 +1,286 @@ +#!/usr/bin/env python3 + +import os +import glob +import gzip +import tarfile +from netCDF4 import Dataset +from logging import getLogger +from typing import Dict, List, Any + +from pygw.attrdict import AttrDict +from pygw.file_utils import FileHandler +from pygw.timetools import to_isotime, to_fv3time, to_timedelta +from pygw.fsutils import rm_p +from pygw.template import Template, TemplateConstants +from pygw.yaml_file import YAMLFile +from pygw.logger import logit +from pygfs.task.analysis import Analysis + +logger = getLogger(__name__.split('.')[-1]) + + +class AtmEnsAnalysis(Analysis): + """ + Class for global atmens analysis tasks + """ + @logit(logger, name="AtmEnsAnalysis") + def __init__(self, config): + super().__init__(config) + + _res = int(self.config['CASE_ANL'][1:]) + _res_enkf = int(self.config['CASE_ENKF'][1:]) + _window_begin = self.runtime_config.current_cycle - to_timedelta(f"{self.config['assim_freq']}H") / 2 + + # Create a local dictionary that is repeatedly used across this class + local_dict = AttrDict( + { + 'npx_ges': _res + 1, + 'npy_ges': _res + 1, + 'npz_ges': self.config.LEVS - 1, + 'npz': self.config.LEVS - 1, + 'npx_anl': _res_enkf + 1, + 'npy_anl': _res_enkf + 1, + 'npz_anl': self.config['LEVS'] - 1, + 'ATM_WINDOW_BEGIN': to_isotime(_window_begin), + 'ATM_WINDOW_LENGTH': f"PT{self.config['assim_freq']}H", + 'BKG_ISOTIME': to_isotime(self.runtime_config.current_cycle), + 'BKG_YYYYmmddHHMMSS': to_fv3time(self.runtime_config.current_cycle), + 'cdate_fv3': to_fv3time(self.runtime_config.current_cycle), + 'comin_ges_atm': self.config.COMIN_GES, + 'comin_ges_atmens': self.config.COMIN_GES_ENS, + } + ) + + # task_config is everything that this task should need + self.task_config = AttrDict(**self.config, **self.runtime_config, **local_dict) + + @logit(logger) + def initialize(self: Analysis) -> None: + """Initialize a global atmens analysis + + This method will initialize a global atmens analysis using JEDI. + This includes: + - staging CRTM fix files + - staging FV3-JEDI fix files + - staging B error files + - staging model backgrounds + - generating a YAML file for the JEDI executable + - linking the JEDI executable (TODO make it copyable, requires JEDI fix) + - creating output directories + """ + + # stage observations and bias corrections + super().initialize() + + # stage CRTM fix files + super().stage_fix('atm_crtm_coeff.yaml') + + # stage fix files + super().stage_fix('atm_jedi_fix.yaml') + + # stage backgrounds + FileHandler(self.get_bkg_dict(AttrDict(self.task_config, **self.task_config))).sync() + + # generate variational YAML file + yaml_out = os.path.join(self.task_config['DATA'], f"{self.task_config['CDUMP']}.t{self.runtime_config['cyc']:02d}z.atmens.yaml") + varda_yaml = YAMLFile(path=self.task_config['ATMENSYAML']) + varda_yaml = Template.substitute_structure(varda_yaml, TemplateConstants.DOUBLE_CURLY_BRACES, self.task_config.get) + varda_yaml = Template.substitute_structure(varda_yaml, TemplateConstants.DOLLAR_PARENTHESES, self.task_config.get) + varda_yaml.save(yaml_out) + logger.info(f"Wrote YAML to {yaml_out}") + + # link var executable + exe_src = self.task_config['JEDIENSEXE'] + exe_dest = os.path.join(self.task_config['DATA'], os.path.basename(exe_src)) + if os.path.exists(exe_dest): + rm_p(exe_dest) + os.symlink(exe_src, exe_dest) + + # need output dir for diags and anl + newdirs = [ + os.path.join(self.task_config['DATA'], 'anl'), + os.path.join(self.task_config['DATA'], 'diags'), + ] + FileHandler({'mkdir': newdirs}).sync() + + # Make directories for member analsis files + for imem in range(1, self.task_config['NMEM_ENKF'] + 1): + memchar = f"mem{imem:03d}" + anldir = [ + os.path.join(self.task_config['DATA'], 'anl', memchar) + ] + FileHandler({'mkdir': anldir}).sync() + + @logit(logger) + def finalize(self: Analysis) -> None: + """Finalize a global atmens analysis + + This method will finalize a global atmens analysis using JEDI. + This includes: + - tarring up output diag files and place in ROTDIR + - copying the generated YAML file from initialize to the ROTDIR + - copying the guess files to the ROTDIR + - applying the increments to the original RESTART files + - moving the increment files to the ROTDIR + + Please note that some of these steps are temporary and will be modified + once the model is able to read atmens tracer increments. + """ + # ---- tar up diags + # path of output tar statfile + atmensstat = os.path.join(self.task_config['COMOUT'], f"{self.task_config['APREFIX']}atmensstat") + + # get list of diag files to put in tarball + diags = glob.glob(os.path.join(self.task_config['DATA'], 'diags', 'diag*nc4')) + + # gzip the files first + for diagfile in diags: + with open(diagfile, 'rb') as f_in, gzip.open(f"{diagfile}.gz", 'wb') as f_out: + f_out.writelines(f_in) + + # open tar file for writing + with tarfile.open(atmensstat, "w") as archive: + for diagfile in diags: + archive.add(f"{diagfile}.gz") + + # copy full YAML from executable to ROTDIR + src = os.path.join(self.task_config['DATA'], f"{self.task_config['CDUMP']}.t{self.runtime_config['cyc']:02d}z.atmens.yaml") + dest = os.path.join(self.task_config['COMOUT'], f"{self.task_config['CDUMP']}.t{self.runtime_config['cyc']:02d}z.atmens.yaml") + yaml_copy = { + 'mkdir': [self.task_config['COMOUT']], + 'copy': [[src, dest]] + } + FileHandler(yaml_copy).sync() + + # ---- NOTE below is 'temporary', eventually we will not be using FMS RESTART formatted files + # ---- all of the rest of this method will need to be changed but requires model and JEDI changes + # ---- copy RESTART fv_tracer files for future reference + # fms_bkg_file_template = os.path.join(self.task_config.comin_ges_atmens, 'RESTART', f'{self.task_config.cdate_fv3}.fv_tracer.res.tileX.nc') + # bkglist = [] + # for itile in range(1, self.task_config.ntiles + 1): + # bkg_path = fms_bkg_file_template.replace('tileX', f'tile{itile}') + # dest = os.path.join(self.task_config['COMOUT'], f'atmges.{os.path.basename(bkg_path)}') + # bkglist.append([bkg_path, dest]) + # FileHandler({'copy': bkglist}).sync() + + # ---- add increments to RESTART files + # logger.info('Adding increments to RESTART files') + # self._add_fms_cube_sphere_increments() + + # ---- move increments to ROTDIR + # logger.info('Moving increments to ROTDIR') + # fms_inc_file_template = os.path.join(self.task_config['DATA'], 'anl', f'atminc.{self.task_config.cdate_fv3}.fv_tracer.res.tileX.nc') + # inclist = [] + # for itile in range(1, self.task_config.ntiles + 1): + # inc_path = fms_inc_file_template.replace('tileX', f'tile{itile}') + # dest = os.path.join(self.task_config['COMOUT'], os.path.basename(inc_path)) + # inclist.append([inc_path, dest]) + # FileHandler({'copy': inclist}).sync() + + # ---- copy member increments to ROTDIR + cdate_inc = self.task_config.cdate_fv3.replace('.', '_') + inclist = [] + for imem in range(1, self.task_config['NMEM_ENKF'] + 1): + memchar = f"mem{imem:03d}" + + # make directory for member incrfement + incdir = [ + os.path.join(self.task_config['COMOUT'], memchar, 'atmos') + ] + FileHandler({'mkdir': incdir}).sync() + + src = os.path.join(self.task_config['DATA'], 'anl', memchar, f'atminc.{cdate_inc}z.nc4') + dest = os.path.join(self.task_config['COMOUT'], memchar, 'atmos', f"{self.task_config['CDUMP']}.t{self.runtime_config['cyc']:02d}z.atminc.nc") + cdate_inc = self.task_config.cdate_fv3.replace('.', '_') + inclist.append([src, dest]) + + inc_dict = { + 'copy': inclist, + } + FileHandler(inc_dict).sync() + + def clean(self): + super().clean() + + @logit(logger) + def _add_fms_cube_sphere_increments(self: Analysis) -> None: + """This method adds increments to RESTART files to get an analysis + NOTE this is only needed for now because the model cannot read atmens increments. + This method will be assumed to be deprecated before this is implemented operationally + """ + # only need the fv_tracer files + fms_inc_file_template = os.path.join(self.task_config['DATA'], 'anl', f'atminc.{self.task_config.cdate_fv3}.fv_tracer.res.tileX.nc') + fms_bkg_file_template = os.path.join(self.task_config.comin_ges_atm, 'RESTART', f'{self.task_config.cdate_fv3}.fv_tracer.res.tileX.nc') + # get list of increment vars + incvars_list_path = os.path.join(self.task_config['HOMEgfs'], 'parm', 'parm_gdas', 'atmensanl_inc_vars.yaml') + incvars = YAMLFile(path=incvars_list_path) + super().add_fv3_increments(fms_inc_file_template, fms_bkg_file_template, incvars) + + @logit(logger) + def get_bkg_dict(self, task_config: Dict[str, Any]) -> Dict[str, List[str]]: + """Compile a dictionary of model background files to copy + + This method constructs a dictionary of FV3 RESTART files (coupler, core, tracer) + that are needed for global atmens DA and returns said dictionary for use by the FileHandler class. + + Parameters + ---------- + task_config: Dict + a dictionary containing all of the configuration needed for the task + + Returns + ---------- + bkg_dict: Dict + a dictionary containing the list of model background files to copy for FileHandler + """ + super().get_bkg_dict(task_config) + # NOTE for now this is FV3 RESTART files and just assumed to be fh006 + + bkgdir = [ + os.path.join(task_config['DATA'], 'bkg'), + ] + FileHandler({'mkdir': bkgdir}).sync() + + # loop over ensemble members + bkglist = [] + for imem in range(1, task_config['NMEM_ENKF'] + 1): + memchar = f"mem{imem:03d}" + + # make run directory for member restart files + bkgdir = [ + os.path.join(task_config['DATA'], 'bkg', memchar, 'RESTART') + ] + FileHandler({'mkdir': bkgdir}).sync() + + # get FV3 RESTART files, this will be a lot simpler when using history files + rst_dir = os.path.join(task_config.comin_ges_atmens, memchar, 'atmos/RESTART') + + basename = f'{task_config.cdate_fv3}.coupler.res' + bkglist.append([os.path.join(rst_dir, basename), os.path.join(task_config['DATA'], 'bkg', memchar, 'RESTART', basename)]) + basename = f'{task_config.cdate_fv3}.fv_core.res.nc' + bkglist.append([os.path.join(rst_dir, basename), os.path.join(task_config['DATA'], 'bkg', memchar, 'RESTART', basename)]) + basename_cadat = f'{task_config.cdate_fv3}.ca_data.tileX.nc' + basename_core = f'{task_config.cdate_fv3}.fv_core.res.tileX.nc' + basename_srfwnd = f'{task_config.cdate_fv3}.fv_srf_wnd.res.tileX.nc' + basename_tracer = f'{task_config.cdate_fv3}.fv_tracer.res.tileX.nc' + basename_phydat = f'{task_config.cdate_fv3}.phy_data.tileX.nc' + basename_sfcdat = f'{task_config.cdate_fv3}.sfc_data.tileX.nc' + for itile in range(1, task_config.ntiles + 1): + basename = basename_cadat.replace('tileX', f'tile{itile}') + bkglist.append([os.path.join(rst_dir, basename), os.path.join(task_config['DATA'], 'bkg', memchar, 'RESTART', basename)]) + basename = basename_core.replace('tileX', f'tile{itile}') + bkglist.append([os.path.join(rst_dir, basename), os.path.join(task_config['DATA'], 'bkg', memchar, 'RESTART', basename)]) + basename = basename_srfwnd.replace('tileX', f'tile{itile}') + bkglist.append([os.path.join(rst_dir, basename), os.path.join(task_config['DATA'], 'bkg', memchar, 'RESTART', basename)]) + basename = basename_tracer.replace('tileX', f'tile{itile}') + bkglist.append([os.path.join(rst_dir, basename), os.path.join(task_config['DATA'], 'bkg', memchar, 'RESTART', basename)]) + basename = basename_phydat.replace('tileX', f'tile{itile}') + bkglist.append([os.path.join(rst_dir, basename), os.path.join(task_config['DATA'], 'bkg', memchar, 'RESTART', basename)]) + basename = basename_sfcdat.replace('tileX', f'tile{itile}') + bkglist.append([os.path.join(rst_dir, basename), os.path.join(task_config['DATA'], 'bkg', memchar, 'RESTART', basename)]) + + bkg_dict = { + 'copy': bkglist, + } + return bkg_dict diff --git a/workflow/applications.py b/workflow/applications.py index 717940a1bda..2b220b48878 100644 --- a/workflow/applications.py +++ b/workflow/applications.py @@ -106,8 +106,8 @@ def __init__(self, conf: Configuration) -> None: self.do_wafs = _base.get('WAFSF', False) self.do_vrfy = _base.get('DO_VRFY', True) self.do_metp = _base.get('DO_METP', False) - self.do_jedivar = _base.get('DO_JEDIVAR', False) - self.do_jediens = _base.get('DO_JEDIENS', False) + self.do_jediatmvar = _base.get('DO_JEDIVAR', False) + self.do_jediatmens = _base.get('DO_JEDIENS', False) self.do_jediocnvar = _base.get('DO_JEDIOCNVAR', False) self.do_hpssarch = _base.get('HPSSARCH', False) @@ -176,8 +176,8 @@ def _cycled_configs(self): configs = ['prep'] - if self.do_jedivar: - configs += ['atmanalprep', 'atmanalrun', 'atmanalpost'] + if self.do_jediatmvar: + configs += ['atmanlinit', 'atmanlrun', 'atmanlfinal'] else: configs += ['anal', 'analdiag'] @@ -192,8 +192,8 @@ def _cycled_configs(self): configs += ['gldas'] if self.do_hybvar: - if self.do_jediens: - configs += ['atmensanalprep', 'atmensanalrun', 'atmensanalpost'] + if self.do_jediatmens: + configs += ['atmensanlinit', 'atmensanlrun', 'atmensanlfinal'] else: configs += ['eobs', 'eomg', 'ediag', 'eupd'] configs += ['ecen', 'esfc', 'efcs', 'echgres', 'epos', 'earc'] @@ -353,8 +353,8 @@ def _get_cycled_task_names(self): gdas_gfs_common_cleanup_tasks = ['arch'] - if self.do_jedivar: - gdas_gfs_common_tasks_before_fcst += ['atmanalprep', 'atmanalrun', 'atmanalpost'] + if self.do_jediatmvar: + gdas_gfs_common_tasks_before_fcst += ['atmanlinit', 'atmanlrun', 'atmanlfinal'] else: gdas_gfs_common_tasks_before_fcst += ['anal'] @@ -374,8 +374,8 @@ def _get_cycled_task_names(self): hybrid_tasks = [] hybrid_after_eupd_tasks = [] if self.do_hybvar: - if self.do_jediens: - hybrid_tasks += ['atmensanalprep', 'atmensanalrun', 'atmensanalpost', 'echgres'] + if self.do_jediatmens: + hybrid_tasks += ['atmensanlinit', 'atmensanlrun', 'atmensanlfinal', 'echgres'] else: hybrid_tasks += ['eobs', 'eupd', 'echgres'] hybrid_tasks += ['ediag'] if self.lobsdiag_forenkf else ['eomg'] @@ -383,7 +383,7 @@ def _get_cycled_task_names(self): # Collect all "gdas" cycle tasks gdas_tasks = gdas_gfs_common_tasks_before_fcst.copy() - if not self.do_jedivar: + if not self.do_jediatmvar: gdas_tasks += ['analdiag'] if self.do_gldas: diff --git a/workflow/rocoto/workflow_tasks.py b/workflow/rocoto/workflow_tasks.py index 48b03254763..ee1d178e1a7 100644 --- a/workflow/rocoto/workflow_tasks.py +++ b/workflow/rocoto/workflow_tasks.py @@ -12,11 +12,11 @@ class Tasks: SERVICE_TASKS = ['arch', 'earc', 'getic'] VALID_TASKS = ['aerosol_init', 'coupled_ic', 'getic', 'init', 'prep', 'anal', 'sfcanl', 'analcalc', 'analdiag', 'gldas', 'arch', - 'atmanalprep', 'atmanalrun', 'atmanalpost', 'ocnanalprep', 'ocnanalbmat', 'ocnanalrun', 'ocnanalpost', 'earc', 'ecen', 'echgres', 'ediag', 'efcs', 'eobs', 'eomg', 'epos', 'esfc', 'eupd', - 'atmensanalprep', 'atmensanalrun', 'atmensanalpost', + 'atmanlinit', 'atmanlrun', 'atmanlfinal', + 'atmensanlinit', 'atmensanlrun', 'atmensanlfinal', 'aeroanlinit', 'aeroanlrun', 'aeroanlfinal', 'fcst', 'post', 'ocnpost', 'vrfy', 'metp', 'postsnd', 'awips', 'gempak', @@ -352,8 +352,8 @@ def anal(self): def sfcanl(self): deps = [] - if self.app_config.do_jedivar: - dep_dict = {'type': 'task', 'name': f'{self.cdump}atmanalrun'} + if self.app_config.do_jediatmvar: + dep_dict = {'type': 'task', 'name': f'{self.cdump}atmanlrun'} else: dep_dict = {'type': 'task', 'name': f'{self.cdump}anal'} deps.append(rocoto.add_dependency(dep_dict)) @@ -367,8 +367,8 @@ def sfcanl(self): def analcalc(self): deps = [] - if self.app_config.do_jedivar: - dep_dict = {'type': 'task', 'name': f'{self.cdump}atmanalrun'} + if self.app_config.do_jediatmvar: + dep_dict = {'type': 'task', 'name': f'{self.cdump}atmanlrun'} else: dep_dict = {'type': 'task', 'name': f'{self.cdump}anal'} deps.append(rocoto.add_dependency(dep_dict)) @@ -396,59 +396,45 @@ def analdiag(self): return task - def atmanalprep(self): - - dump_suffix = self._base["DUMP_SUFFIX"] - gfs_cyc = self._base["gfs_cyc"] - dmpdir = self._base["DMPDIR"] - do_gfs_enkf = True if self.app_config.do_hybvar and 'gfs' in self.app_config.eupd_cdumps else False - + def atmanlinit(self): deps = [] - dep_dict = {'type': 'metatask', 'name': 'gdaspost', 'offset': '-06:00:00'} - deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/gdas.@Y@m@d/@H/atmos/gdas.t@Hz.atmf009.nc' - dep_dict = {'type': 'data', 'data': data, 'offset': '-06:00:00'} - deps.append(rocoto.add_dependency(dep_dict)) - data = f'{dmpdir}/{self.cdump}{dump_suffix}.@Y@m@d/@H/atmos/{self.cdump}.t@Hz.updated.status.tm00.bufr_d' - dep_dict = {'type': 'data', 'data': data} + dep_dict = {'type': 'task', 'name': f'{self.cdump}prep'} deps.append(rocoto.add_dependency(dep_dict)) - dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) - - cycledef = self.cdump - if self.cdump in ['gfs'] and do_gfs_enkf and gfs_cyc != 4: - cycledef = 'gdas' + if self.app_config.do_hybvar: + dep_dict = {'type': 'metatask', 'name': 'enkfgdasepmn', 'offset': '-06:00:00'} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) + else: + dependencies = rocoto.create_dependency(dep=deps) - resources = self.get_resource('atmanalprep') - task = create_wf_task('atmanalprep', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies, + cycledef = "gdas" + resources = self.get_resource('atmanlinit') + task = create_wf_task('atmanlinit', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies, cycledef=cycledef) + return task - def atmanalrun(self): + def atmanlrun(self): deps = [] - dep_dict = {'type': 'task', 'name': f'{self.cdump}atmanalprep'} + dep_dict = {'type': 'task', 'name': f'{self.cdump}atmanlinit'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_hybvar: - dep_dict = {'type': 'metatask', 'name': 'enkfgdasepmn', 'offset': '-06:00:00'} - deps.append(rocoto.add_dependency(dep_dict)) - dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) - else: - dependencies = rocoto.create_dependency(dep=deps) + dependencies = rocoto.create_dependency(dep=deps) - resources = self.get_resource('atmanalrun') - task = create_wf_task('atmanalrun', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies) + resources = self.get_resource('atmanlrun') + task = create_wf_task('atmanlrun', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies) return task - def atmanalpost(self): + def atmanlfinal(self): deps = [] - dep_dict = {'type': 'task', 'name': f'{self.cdump}atmanalrun'} + dep_dict = {'type': 'task', 'name': f'{self.cdump}atmanlrun'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) - resources = self.get_resource('atmanalpost') - task = create_wf_task('atmanalpost', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies) + resources = self.get_resource('atmanlfinal') + task = create_wf_task('atmanlfinal', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies) return task @@ -1101,57 +1087,44 @@ def eupd(self): return task - def atmensanalprep(self): - - dump_suffix = self._base["DUMP_SUFFIX"] - gfs_cyc = self._base["gfs_cyc"] - dmpdir = self._base["DMPDIR"] - do_gfs_enkf = True if self.app_config.do_hybvar and 'gfs' in self.app_config.eupd_cdumps else False - + def atmensanlinit(self): deps = [] - dep_dict = {'type': 'metatask', 'name': 'gdaspost', 'offset': '-06:00:00'} - deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/gdas.@Y@m@d/@H/atmos/gdas.t@Hz.atmf009.nc' - dep_dict = {'type': 'data', 'data': data, 'offset': '-06:00:00'} + dep_dict = {'type': 'task', 'name': f'{self.cdump.replace("enkf","")}prep'} deps.append(rocoto.add_dependency(dep_dict)) - data = f'{dmpdir}/{self.cdump}{dump_suffix}.@Y@m@d/@H/atmos/{self.cdump}.t@Hz.updated.status.tm00.bufr_d' - dep_dict = {'type': 'data', 'data': data} + dep_dict = {'type': 'metatask', 'name': 'enkfgdasepmn', 'offset': '-06:00:00'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) - cycledef = self.cdump - if self.cdump in ['gfs'] and do_gfs_enkf and gfs_cyc != 4: - cycledef = 'gdas' - - resources = self.get_resource('atmensanalprep') - task = create_wf_task('atmensanalprep', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies, + cycledef = "gdas" + resources = self.get_resource('atmensanlinit') + task = create_wf_task('atmensanlinit', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies, cycledef=cycledef) return task - def atmensanalrun(self): + def atmensanlrun(self): deps = [] - dep_dict = {'type': 'task', 'name': f'{self.cdump}atmensanalprep'} + dep_dict = {'type': 'task', 'name': f'{self.cdump}atmensanlinit'} deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'metatask', 'name': 'enkfgdasepmn', 'offset': '-06:00:00'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) - resources = self.get_resource('atmensanalrun') - task = create_wf_task('atmensanalrun', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies) + resources = self.get_resource('atmensanlrun') + task = create_wf_task('atmensanlrun', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies) return task - def atmensanalpost(self): + def atmensanlfinal(self): deps = [] - dep_dict = {'type': 'task', 'name': f'{self.cdump}atmensanalrun'} + dep_dict = {'type': 'task', 'name': f'{self.cdump}atmensanlrun'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) - resources = self.get_resource('atmensanalpost') - task = create_wf_task('atmensanalpost', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies) + resources = self.get_resource('atmensanlfinal') + task = create_wf_task('atmensanlfinal', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies) return task @@ -1183,8 +1156,8 @@ def _get_ecengroups(): deps = [] dep_dict = {'type': 'task', 'name': f'{self.cdump.replace("enkf","")}analcalc'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_jediens: - dep_dict = {'type': 'task', 'name': f'{self.cdump}atmensanalrun'} + if self.app_config.do_jediatmens: + dep_dict = {'type': 'task', 'name': f'{self.cdump}atmensanlrun'} else: dep_dict = {'type': 'task', 'name': f'{self.cdump}eupd'} deps.append(rocoto.add_dependency(dep_dict)) @@ -1212,8 +1185,8 @@ def esfc(self): deps = [] dep_dict = {'type': 'task', 'name': f'{self.cdump.replace("enkf","")}analcalc'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_jediens: - dep_dict = {'type': 'task', 'name': f'{self.cdump}atmensanalrun'} + if self.app_config.do_jediatmens: + dep_dict = {'type': 'task', 'name': f'{self.cdump}atmensanlrun'} else: dep_dict = {'type': 'task', 'name': f'{self.cdump}eupd'} deps.append(rocoto.add_dependency(dep_dict))