diff --git a/.gitignore b/.gitignore index c2d9c9db45..9b38ce52f1 100644 --- a/.gitignore +++ b/.gitignore @@ -82,7 +82,6 @@ parm/ufs/ice_in.IN parm/ufs/ufs.configure.*.IN parm/ufs/post_itag_gfs parm/ufs/ww3_shel.nml.IN -parm/wafs # Ignore sorc and logs folders from externals #-------------------------------------------- diff --git a/ci/cases/pr/C48mx500_3DVarAOWCDA.yaml b/ci/cases/pr/C48mx500_3DVarAOWCDA.yaml index 9cc3d3c03a..11a13f0bc3 100644 --- a/ci/cases/pr/C48mx500_3DVarAOWCDA.yaml +++ b/ci/cases/pr/C48mx500_3DVarAOWCDA.yaml @@ -4,7 +4,7 @@ experiment: arguments: pslot: {{ 'pslot' | getenv }} - app: S2S + app: S2SW resdetatmos: 48 resdetocean: 5.0 comroot: {{ 'RUNTESTS' | getenv }}/COMROOT @@ -13,7 +13,7 @@ arguments: idate: 2021032418 edate: 2021032500 nens: 0 - interval: 0 + interval: 6 start: warm yaml: {{ HOMEgfs }}/ci/cases/yamls/soca_gfs_defaults_ci.yaml diff --git a/ci/cases/pr/C96_atm3DVar.yaml b/ci/cases/pr/C96_atm3DVar.yaml index 6286d74dc4..0b242fbfd3 100644 --- a/ci/cases/pr/C96_atm3DVar.yaml +++ b/ci/cases/pr/C96_atm3DVar.yaml @@ -14,7 +14,7 @@ arguments: nens: 0 interval: 24 start: cold - yaml: {{ HOMEgfs }}/ci/cases/yamls/gfs_defaults_ci.yaml + yaml: {{ HOMEgfs }}/ci/cases/yamls/gfs_metp_ci.yaml skip_ci_on_hosts: - wcoss2 diff --git a/ci/cases/yamls/gfs_defaults_ci.yaml b/ci/cases/yamls/gfs_defaults_ci.yaml index d3dacfb271..9fcfa7d604 100644 --- a/ci/cases/yamls/gfs_defaults_ci.yaml +++ b/ci/cases/yamls/gfs_defaults_ci.yaml @@ -2,4 +2,7 @@ defaults: !INC {{ HOMEgfs }}/parm/config/gfs/yaml/defaults.yaml base: ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} - DO_TEST_MODE: "NO" + DO_TEST_MODE: "YES" + FETCHDIR: "/NCEPDEV/emc-global/1year/David.Grumm/test_data" + DO_METP: "NO" + diff --git a/ci/cases/yamls/gfs_extended_ci.yaml b/ci/cases/yamls/gfs_extended_ci.yaml index 12ccda6bbd..76c19f9742 100644 --- a/ci/cases/yamls/gfs_extended_ci.yaml +++ b/ci/cases/yamls/gfs_extended_ci.yaml @@ -8,6 +8,7 @@ base: DO_GEMPAK: "YES" DO_AWIPS: "YES" DO_NPOESS: "YES" + DO_METP: "YES" DO_GENESIS_FSU: "NO" FCST_BREAKPOINTS: 192 FHMAX_GFS: 384 diff --git a/ci/cases/yamls/gfs_metp_ci.yaml b/ci/cases/yamls/gfs_metp_ci.yaml new file mode 100644 index 0000000000..2ba5f9f8f5 --- /dev/null +++ b/ci/cases/yamls/gfs_metp_ci.yaml @@ -0,0 +1,6 @@ +defaults: + !INC {{ HOMEgfs }}/parm/config/gfs/yaml/defaults.yaml +base: + ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} + DO_TEST_MODE: "NO" + DO_METP: "YES" diff --git a/ci/cases/yamls/soca_gfs_defaults_ci.yaml b/ci/cases/yamls/soca_gfs_defaults_ci.yaml index dbddcf23bb..3f5b5c0824 100644 --- a/ci/cases/yamls/soca_gfs_defaults_ci.yaml +++ b/ci/cases/yamls/soca_gfs_defaults_ci.yaml @@ -3,6 +3,7 @@ defaults: base: ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} DO_JEDIOCNVAR: "YES" + DO_METP: "NO" marineanl: SOCA_NINNER: 1 diff --git a/env/GAEA.env b/env/GAEA.env deleted file mode 100755 index 7736e0f1ea..0000000000 --- a/env/GAEA.env +++ /dev/null @@ -1,101 +0,0 @@ -#! /usr/bin/env bash - -if [[ $# -ne 1 ]]; then - - echo "Must specify an input argument to set runtime environment variables!" - exit 1 - -fi - -step=$1 - -export launcher="srun -l --export=ALL" -export mpmd_opt="--multi-prog --output=mpmd.%j.%t.out" - -export OMP_STACKSIZE=2048000 -export NTHSTACK=1024000000 - -ulimit -s unlimited -ulimit -a - -# Calculate common variables -# Check first if the dependent variables are set -if [[ -n "${ntasks:-}" && -n "${max_tasks_per_node:-}" && -n "${tasks_per_node:-}" ]]; then - max_threads_per_task=$((max_tasks_per_node / tasks_per_node)) - NTHREADSmax=${threads_per_task:-${max_threads_per_task}} - NTHREADS1=${threads_per_task:-1} - [[ ${NTHREADSmax} -gt ${max_threads_per_task} ]] && NTHREADSmax=${max_threads_per_task} - [[ ${NTHREADS1} -gt ${max_threads_per_task} ]] && NTHREADS1=${max_threads_per_task} - # This may be useful when Gaea is fully ported, so ignore SC warning - # shellcheck disable=SC2034 - APRUN_default="${launcher} -n ${ntasks}" -else - echo "ERROR config.resources must be sourced before sourcing GAEA.env" - exit 2 -fi - -if [[ "${step}" = "prep" ]]; then - - export POE="NO" - export BACK="NO" - export sys_tp="GAEA" - export launcher_PREP="srun" - -elif [[ "${step}" = "anal" ]] || [[ "${step}" = "analcalc" ]]; then - - export MKL_NUM_THREADS=4 - export MKL_CBWR=AUTO - - export CFP_MP=${CFP_MP:-"YES"} - export USE_CFP=${USE_CFP:-"YES"} - export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" - - export NTHREADS_GSI=${NTHREADSmax} - export APRUN_GSI="${APRUN_default} --cpus-per-task=${NTHREADS_GSI}" - - export NTHREADS_CALCINC=${threads_per_task_calcinc:-1} - [[ ${NTHREADS_CALCINC} -gt ${max_threads_per_task} ]] && export NTHREADS_CALCINC=${max_threads_per_task} - export APRUN_CALCINC="${launcher} \$ncmd --cpus-per-task=${NTHREADS_CALCINC}" - - export NTHREADS_CYCLE=${threads_per_task_cycle:-12} - [[ ${NTHREADS_CYCLE} -gt ${max_tasks_per_node} ]] && export NTHREADS_CYCLE=${max_tasks_per_node} - ntasks_cycle=${ntiles:-6} - export APRUN_CYCLE="${launcher} -n ${ntasks_cycle} --cpus-per-task=${NTHREADS_CYCLE}" - - export NTHREADS_GAUSFCANL=1 - ntasks_gausfcanl=${ntasks_gausfcanl:-1} - export APRUN_GAUSFCANL="${launcher} -n ${ntasks_gausfcanl} --cpus-per-task=${NTHREADS_GAUSFCANL}" - -elif [[ "${step}" = "sfcanl" ]]; then - - export NTHREADS_CYCLE=${threads_per_task:-14} - export APRUN_CYCLE="${APRUN_default} --cpus-per-task=${NTHREADS_CYCLE}" - -elif [[ "${step}" = "fcst" ]]; then - - (( nnodes = (ntasks+tasks_per_node-1)/tasks_per_node )) - (( ufs_ntasks = nnodes*tasks_per_node )) - # With ESMF threading, the model wants to use the full node - export APRUN_UFS="${launcher} -n ${ufs_ntasks}" - unset nnodes ufs_ntasks - -elif [[ "${step}" = "upp" ]]; then - - export NTHREADS_UPP=${NTHREADS1} - export APRUN_UPP="${APRUN_default} --cpus-per-task=${NTHREADS_UPP}" - -elif [[ "${step}" = "atmos_products" ]]; then - - export USE_CFP="YES" # Use MPMD for downstream product generation on Gaea - -elif [[ "${step}" = "oceanice_products" ]]; then - - export NTHREADS_OCNICEPOST=${NTHREADS1} - export APRUN_OCNICEPOST="${launcher} -n 1 --cpus-per-task=${NTHREADS_OCNICEPOST}" - -elif [[ "${step}" = "fit2obs" ]]; then - - export NTHREADS_FIT2OBS=${NTHREADS1} - export MPIRUN="${APRUN_default} --cpus-per-task=${NTHREADS_FIT2OBS}" - -fi diff --git a/env/GAEAC5.env b/env/GAEAC5.env new file mode 100755 index 0000000000..8af8003dff --- /dev/null +++ b/env/GAEAC5.env @@ -0,0 +1,295 @@ +#! /usr/bin/env bash + +if [[ $# -ne 1 ]]; then + + echo "Must specify an input argument to set runtime environment variables!" + exit 1 + +fi + +step=$1 + +export launcher="srun -l --export=ALL" +export mpmd_opt="--multi-prog --output=mpmd.%j.%t.out" + +export OMP_STACKSIZE=2048000 +export NTHSTACK=1024000000 + +ulimit -s unlimited +ulimit -a + +# Calculate common variables +# Check first if the dependent variables are set +if [[ -n "${ntasks:-}" && -n "${max_tasks_per_node:-}" && -n "${tasks_per_node:-}" ]]; then + max_threads_per_task=$((max_tasks_per_node / tasks_per_node)) + NTHREADSmax=${threads_per_task:-${max_threads_per_task}} + NTHREADS1=${threads_per_task:-1} + [[ ${NTHREADSmax} -gt ${max_threads_per_task} ]] && NTHREADSmax=${max_threads_per_task} + [[ ${NTHREADS1} -gt ${max_threads_per_task} ]] && NTHREADS1=${max_threads_per_task} + # This may be useful when GaeaC5 is fully ported, so ignore SC warning + # shellcheck disable=SC2034 + APRUN_default="${launcher} -n ${ntasks}" +else + echo "ERROR config.resources must be sourced before sourcing GAEAC5.env" + exit 2 +fi + +case ${step} in + "prep" | "prepbufr") + + export POE="NO" + export BACK=${BACK:-"YES"} + export sys_tp="GAEAC5" + export launcher_PREP="srun" + ;; + "prep_emissions") + + export APRUN="${APRUN_default}" + ;; + "waveinit" | "waveprep" | "wavepostsbs" | "wavepostbndpnt" | "wavepostpnt" | "wavepostbndpntbll") + + export CFP_MP="YES" + [[ "${step}" = "waveprep" ]] && export MP_PULSE=0 + export wavempexec=${launcher} + export wave_mpmd=${mpmd_opt} + + ;; + "atmanlvar") + + export NTHREADS_ATMANLVAR=${NTHREADSmax} + export APRUN_ATMANLVAR="${APRUN_default} --cpus-per-task=${NTHREADS_ATMANLVAR}" + ;; + "atmanlfv3inc") + + export NTHREADS_ATMANLFV3INC=${NTHREADSmax} + export APRUN_ATMANLFV3INC="${APRUN_default} --cpus-per-task=${NTHREADS_ATMANLFV3INC}" + ;; + "atmensanlobs") + + export NTHREADS_ATMENSANLOBS=${NTHREADSmax} + export APRUN_ATMENSANLOBS="${APRUN_default} --cpus-per-task=${NTHREADS_ATMENSANLOBS}" + ;; + "atmensanlsol") + + export NTHREADS_ATMENSANLSOL=${NTHREADSmax} + export APRUN_ATMENSANLSOL="${APRUN_default} --cpus-per-task=${NTHREADS_ATMENSANLSOL}" + ;; + "atmensanlletkf") + + export NTHREADS_ATMENSANLLETKF=${NTHREADSmax} + export APRUN_ATMENSANLLETKF="${APRUN_default} --cpus-per-task=${NTHREADS_ATMENSANLLETKF}" + ;; + "atmensanlfv3inc") + + export NTHREADS_ATMENSANLFV3INC=${NTHREADSmax} + export APRUN_ATMENSANLFV3INC="${APRUN_default} --cpus-per-task=${NTHREADS_ATMENSANLFV3INC}" + ;; + "aeroanlvar") + + export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" + + export NTHREADS_AEROANL=${NTHREADSmax} + export APRUN_AEROANL="${APRUN_default} --cpus-per-task=${NTHREADS_AEROANL}" + ;; + "aeroanlgenb") + + export NTHREADS_AEROANLGENB=${NTHREADSmax} + export APRUN_AEROANLGENB="${APRUN_default} --cpus-per-task=${NTHREADS_AEROANLGENB}" + ;; + "prepobsaero") + + export NTHREADS_PREPOBSAERO=${NTHREADS1} + export APRUN_PREPOBSAERO="${APRUN_default} --cpus-per-task=${NTHREADS_PREPOBSAERO}" +;; + "snowanl") + + export APRUN_CALCFIMS="${launcher} -n 1" + + export NTHREADS_SNOWANL=${NTHREADSmax} + export APRUN_SNOWANL="${APRUN_default} --cpus-per-task=${NTHREADS_SNOWANL}" + + export APRUN_APPLY_INCR="${launcher} -n 6" + ;; + "esnowrecen") + + export NTHREADS_ESNOWRECEN=${NTHREADSmax} + export APRUN_ESNOWRECEN="${APRUN_default} --cpus-per-task=${NTHREADS_ESNOWRECEN}" + + export APRUN_APPLY_INCR="${launcher} -n 6" + ;; + + "marinebmat") + + export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" + export APRUN_MARINEBMAT="${APRUN_default}" + ;; + "marineanlvar") + + export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" + export APRUN_MARINEANLVAR="${APRUN_default}" + ;; +"ocnanalecen") + + export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" + + max_threads_per_task=$((max_tasks_per_node / tasks_per_node_ocnanalecen)) + + export NTHREADS_OCNANALECEN=${threads_per_task_ocnanalecen:-${max_threads_per_task}} + [[ ${NTHREADS_OCNANALECEN} -gt ${max_threads_per_task} ]] && export NTHREADS_OCNANALECEN=${max_threads_per_task} + export APRUN_OCNANALECEN="${launcher} -n ${ntasks_ocnanalecen} --cpus-per-task=${NTHREADS_OCNANALECEN}" +;; + "marineanlchkpt") + + export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" + + export NTHREADS_OCNANAL=${NTHREADSmax} + export APRUN_MARINEANLCHKPT="${APRUN_default} --cpus-per-task=${NTHREADS_OCNANAL}" + ;; + "anal" | "analcalc") + + export MKL_NUM_THREADS=4 + export MKL_CBWR=AUTO + + export CFP_MP=${CFP_MP:-"YES"} + export USE_CFP=${USE_CFP:-"YES"} + export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" + + export NTHREADS_GSI=${threads_per_task_anal:-${max_threads_per_task}} + export APRUN_GSI="${APRUN_default} --cpus-per-task=${NTHREADS_GSI}" + + export NTHREADS_CALCINC=${threads_per_task_calcinc:-1} + [[ ${NTHREADS_CALCINC} -gt ${max_threads_per_task} ]] && export NTHREADS_CALCINC=${max_threads_per_task} + export APRUN_CALCINC="${launcher} \$ncmd --cpus-per-task=${NTHREADS_CALCINC}" + + export NTHREADS_CYCLE=${threads_per_task_cycle:-12} + [[ ${NTHREADS_CYCLE} -gt ${max_tasks_per_node} ]] && export NTHREADS_CYCLE=${max_tasks_per_node} + ntasks_cycle=${ntiles:-6} + export APRUN_CYCLE="${launcher} -n ${ntasks_cycle} --cpus-per-task=${NTHREADS_CYCLE}" + + export NTHREADS_GAUSFCANL=1 + ntasks_gausfcanl=${ntasks_gausfcanl:-1} + export APRUN_GAUSFCANL="${launcher} -n ${ntasks_gausfcanl} --cpus-per-task=${NTHREADS_GAUSFCANL}" + ;; + "sfcanl") + + export NTHREADS_CYCLE=${threads_per_task:-14} + [[ ${NTHREADS_CYCLE} -gt ${max_tasks_per_node} ]] && export NTHREADS_CYCLE=${max_tasks_per_node} + export APRUN_CYCLE="${APRUN_default} --cpus-per-task=${NTHREADS_CYCLE}" + ;; + "eobs") + + export MKL_NUM_THREADS=4 + export MKL_CBWR=AUTO + + export CFP_MP=${CFP_MP:-"YES"} + export USE_CFP=${USE_CFP:-"YES"} + export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" + + + export NTHREADS_GSI=${NTHREADSmax} + [[ ${NTHREADS_GSI} -gt ${max_threads_per_task} ]] && export NTHREADS_GSI=${max_threads_per_task} + export APRUN_GSI="${APRUN_default} --cpus-per-task=${NTHREADS_GSI}" + ;; + "eupd") + + export CFP_MP=${CFP_MP:-"YES"} + export USE_CFP=${USE_CFP:-"YES"} + export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" + + + export NTHREADS_ENKF=${NTHREADSmax} + export APRUN_ENKF="${launcher} -n ${ntasks_enkf:-${ntasks}} --cpus-per-task=${NTHREADS_ENKF}" + ;; + "fcst" | "efcs") + + export OMP_STACKSIZE=512M + + (( nnodes = (ntasks+tasks_per_node-1)/tasks_per_node )) + (( ufs_ntasks = nnodes*tasks_per_node )) + # With ESMF threading, the model wants to use the full node + export APRUN_UFS="${launcher} -n ${ufs_ntasks}" + unset nnodes ufs_ntasks + ;; + + "upp") + + export NTHREADS_UPP=${NTHREADS1} + export APRUN_UPP="${APRUN_default} --cpus-per-task=${NTHREADS_UPP}" + ;; + + "atmos_products") + + export USE_CFP="YES" # Use MPMD for downstream product generation + ;; + +"oceanice_products") + + export NTHREADS_OCNICEPOST=${NTHREADS1} + export APRUN_OCNICEPOST="${launcher} -n 1 --cpus-per-task=${NTHREADS_OCNICEPOST}" +;; + + "ecen") + + export NTHREADS_ECEN=${NTHREADSmax} + export APRUN_ECEN="${APRUN_default} --cpus-per-task=${NTHREADS_ECEN}" + + export NTHREADS_CHGRES=${threads_per_task_chgres:-12} + [[ ${NTHREADS_CHGRES} -gt ${max_tasks_per_node} ]] && export NTHREADS_CHGRES=${max_tasks_per_node} + export APRUN_CHGRES="time" + + export NTHREADS_CALCINC=${threads_per_task_calcinc:-1} + [[ ${NTHREADS_CALCINC} -gt ${max_threads_per_task} ]] && export NTHREADS_CALCINC=${max_threads_per_task} + export APRUN_CALCINC="${APRUN_default} --cpus-per-task=${NTHREADS_CALCINC}" + + ;; + "esfc") + + export NTHREADS_ESFC=${NTHREADSmax} + export APRUN_ESFC="${APRUN_default} --cpus-per-task=${NTHREADS_ESFC}" + + export NTHREADS_CYCLE=${threads_per_task_cycle:-14} + [[ ${NTHREADS_CYCLE} -gt ${max_tasks_per_node} ]] && export NTHREADS_CYCLE=${max_tasks_per_node} + export APRUN_CYCLE="${APRUN_default} --cpus-per-task=${NTHREADS_CYCLE}" + + ;; + "epos") + + export NTHREADS_EPOS=${NTHREADSmax} + export APRUN_EPOS="${APRUN_default} --cpus-per-task=${NTHREADS_EPOS}" + + ;; + "postsnd") + + export CFP_MP="YES" + + export NTHREADS_POSTSND=${NTHREADS1} + export APRUN_POSTSND="${APRUN_default} --cpus-per-task=${NTHREADS_POSTSND}" + + export NTHREADS_POSTSNDCFP=${threads_per_task_postsndcfp:-1} + [[ ${NTHREADS_POSTSNDCFP} -gt ${max_threads_per_task} ]] && export NTHREADS_POSTSNDCFP=${max_threads_per_task} + export APRUN_POSTSNDCFP="${launcher} -n ${ntasks_postsndcfp} ${mpmd_opt}" + + ;; + "awips") + + export NTHREADS_AWIPS=${NTHREADS1} + export APRUN_AWIPSCFP="${APRUN_default} ${mpmd_opt}" + + ;; + "gempak") + + echo "WARNING: ${step} is not enabled on ${machine}!" + + ;; + "fit2obs") + + export NTHREADS_FIT2OBS=${NTHREADS1} + export MPIRUN="${APRUN_default} --cpus-per-task=${NTHREADS_FIT2OBS}" + + ;; + *) + # Some other job not yet defined here + echo "WARNING: The job step ${step} does not specify GAEAC5-specific resources" + ;; +esac + diff --git a/env/GAEAC6.env b/env/GAEAC6.env new file mode 100755 index 0000000000..90150948e3 --- /dev/null +++ b/env/GAEAC6.env @@ -0,0 +1,293 @@ +#! /usr/bin/env bash + +if [[ $# -ne 1 ]]; then + + echo "Must specify an input argument to set runtime environment variables!" + exit 1 + +fi + +step=$1 + +export launcher="srun -l --export=ALL" +export mpmd_opt="--multi-prog --output=mpmd.%j.%t.out" + +export OMP_STACKSIZE=2048000 +export NTHSTACK=1024000000 + +ulimit -s unlimited +ulimit -a + +# Calculate common variables +# Check first if the dependent variables are set +if [[ -n "${ntasks:-}" && -n "${max_tasks_per_node:-}" && -n "${tasks_per_node:-}" ]]; then + max_threads_per_task=$((max_tasks_per_node / tasks_per_node)) + NTHREADSmax=${threads_per_task:-${max_threads_per_task}} + NTHREADS1=${threads_per_task:-1} + [[ ${NTHREADSmax} -gt ${max_threads_per_task} ]] && NTHREADSmax=${max_threads_per_task} + [[ ${NTHREADS1} -gt ${max_threads_per_task} ]] && NTHREADS1=${max_threads_per_task} + # This may be useful when GaeaC6 is fully ported, so ignore SC warning + # shellcheck disable=SC2034 + APRUN_default="${launcher} -n ${ntasks}" +else + echo "ERROR config.resources must be sourced before sourcing GAEAC6.env" + exit 2 +fi + +case ${step} in + "prep" | "prepbufr") + + export POE="NO" + export BACK=${BACK:-"YES"} + export sys_tp="GAEAC6" + export launcher_PREP="srun" + ;; + "prep_emissions") + + export APRUN="${APRUN_default}" + ;; + "waveinit" | "waveprep" | "wavepostsbs" | "wavepostbndpnt" | "wavepostpnt" | "wavepostbndpntbll") + + export CFP_MP="YES" + [[ "${step}" = "waveprep" ]] && export MP_PULSE=0 + export wavempexec=${launcher} + export wave_mpmd=${mpmd_opt} + + ;; + "atmanlvar") + + export NTHREADS_ATMANLVAR=${NTHREADSmax} + export APRUN_ATMANLVAR="${APRUN_default} --cpus-per-task=${NTHREADS_ATMANLVAR}" + ;; + "atmanlfv3inc") + + export NTHREADS_ATMANLFV3INC=${NTHREADSmax} + export APRUN_ATMANLFV3INC="${APRUN_default} --cpus-per-task=${NTHREADS_ATMANLFV3INC}" + ;; + "atmensanlobs") + + export NTHREADS_ATMENSANLOBS=${NTHREADSmax} + export APRUN_ATMENSANLOBS="${APRUN_default} --cpus-per-task=${NTHREADS_ATMENSANLOBS}" + ;; + "atmensanlsol") + + export NTHREADS_ATMENSANLSOL=${NTHREADSmax} + export APRUN_ATMENSANLSOL="${APRUN_default} --cpus-per-task=${NTHREADS_ATMENSANLSOL}" + ;; + "atmensanlletkf") + + export NTHREADS_ATMENSANLLETKF=${NTHREADSmax} + export APRUN_ATMENSANLLETKF="${APRUN_default} --cpus-per-task=${NTHREADS_ATMENSANLLETKF}" + ;; + "atmensanlfv3inc") + + export NTHREADS_ATMENSANLFV3INC=${NTHREADSmax} + export APRUN_ATMENSANLFV3INC="${APRUN_default} --cpus-per-task=${NTHREADS_ATMENSANLFV3INC}" + ;; + "aeroanlvar") + + export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" + + export NTHREADS_AEROANL=${NTHREADSmax} + export APRUN_AEROANL="${APRUN_default} --cpus-per-task=${NTHREADS_AEROANL}" + ;; + "aeroanlgenb") + + export NTHREADS_AEROANLGENB=${NTHREADSmax} + export APRUN_AEROANLGENB="${APRUN_default} --cpus-per-task=${NTHREADS_AEROANLGENB}" + ;; + "prepobsaero") + + export NTHREADS_PREPOBSAERO=${NTHREADS1} + export APRUN_PREPOBSAERO="${APRUN_default} --cpus-per-task=${NTHREADS_PREPOBSAERO}" +;; + "snowanl") + + export APRUN_CALCFIMS="${launcher} -n 1" + + export NTHREADS_SNOWANL=${NTHREADSmax} + export APRUN_SNOWANL="${APRUN_default} --cpus-per-task=${NTHREADS_SNOWANL}" + + export APRUN_APPLY_INCR="${launcher} -n 6" + ;; + "esnowrecen") + + export NTHREADS_ESNOWRECEN=${NTHREADSmax} + export APRUN_ESNOWRECEN="${APRUN_default} --cpus-per-task=${NTHREADS_ESNOWRECEN}" + + export APRUN_APPLY_INCR="${launcher} -n 6" + ;; + + "marinebmat") + + export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" + export APRUN_MARINEBMAT="${APRUN_default}" + ;; + "marineanlvar") + + export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" + export APRUN_MARINEANLVAR="${APRUN_default}" + ;; +"ocnanalecen") + + export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" + + max_threads_per_task=$((max_tasks_per_node / tasks_per_node_ocnanalecen)) + + export NTHREADS_OCNANALECEN=${threads_per_task_ocnanalecen:-${max_threads_per_task}} + [[ ${NTHREADS_OCNANALECEN} -gt ${max_threads_per_task} ]] && export NTHREADS_OCNANALECEN=${max_threads_per_task} + export APRUN_OCNANALECEN="${launcher} -n ${ntasks_ocnanalecen} --cpus-per-task=${NTHREADS_OCNANALECEN}" +;; + "marineanlchkpt") + + export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" + + export NTHREADS_OCNANAL=${NTHREADSmax} + export APRUN_MARINEANLCHKPT="${APRUN_default} --cpus-per-task=${NTHREADS_OCNANAL}" + ;; + "anal" | "analcalc") + + export MKL_NUM_THREADS=4 + export MKL_CBWR=AUTO + + export CFP_MP=${CFP_MP:-"YES"} + export USE_CFP=${USE_CFP:-"YES"} + export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" + + export NTHREADS_GSI=${threads_per_task_anal:-${max_threads_per_task}} + export APRUN_GSI="${APRUN_default} --cpus-per-task=${NTHREADS_GSI}" + + export NTHREADS_CALCINC=${threads_per_task_calcinc:-1} + [[ ${NTHREADS_CALCINC} -gt ${max_threads_per_task} ]] && export NTHREADS_CALCINC=${max_threads_per_task} + export APRUN_CALCINC="${launcher} \$ncmd --cpus-per-task=${NTHREADS_CALCINC}" + + export NTHREADS_CYCLE=${threads_per_task_cycle:-12} + [[ ${NTHREADS_CYCLE} -gt ${max_tasks_per_node} ]] && export NTHREADS_CYCLE=${max_tasks_per_node} + ntasks_cycle=${ntiles:-6} + export APRUN_CYCLE="${launcher} -n ${ntasks_cycle} --cpus-per-task=${NTHREADS_CYCLE}" + + export NTHREADS_GAUSFCANL=1 + ntasks_gausfcanl=${ntasks_gausfcanl:-1} + export APRUN_GAUSFCANL="${launcher} -n ${ntasks_gausfcanl} --cpus-per-task=${NTHREADS_GAUSFCANL}" + ;; + "sfcanl") + + export NTHREADS_CYCLE=${threads_per_task:-14} + [[ ${NTHREADS_CYCLE} -gt ${max_tasks_per_node} ]] && export NTHREADS_CYCLE=${max_tasks_per_node} + export APRUN_CYCLE="${APRUN_default} --cpus-per-task=${NTHREADS_CYCLE}" + ;; + "eobs") + + export MKL_NUM_THREADS=4 + export MKL_CBWR=AUTO + + export CFP_MP=${CFP_MP:-"YES"} + export USE_CFP=${USE_CFP:-"YES"} + export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" + + + export NTHREADS_GSI=${NTHREADSmax} + [[ ${NTHREADS_GSI} -gt ${max_threads_per_task} ]] && export NTHREADS_GSI=${max_threads_per_task} + export APRUN_GSI="${APRUN_default} --cpus-per-task=${NTHREADS_GSI}" + ;; + "eupd") + + export CFP_MP=${CFP_MP:-"YES"} + export USE_CFP=${USE_CFP:-"YES"} + export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" + + + export NTHREADS_ENKF=${NTHREADSmax} + export APRUN_ENKF="${launcher} -n ${ntasks_enkf:-${ntasks}} --cpus-per-task=${NTHREADS_ENKF}" + ;; + "fcst" | "efcs") + + export OMP_STACKSIZE=512M + + (( nnodes = (ntasks+tasks_per_node-1)/tasks_per_node )) + (( ufs_ntasks = nnodes*tasks_per_node )) + # With ESMF threading, the model wants to use the full node + export APRUN_UFS="${launcher} -n ${ufs_ntasks}" + unset nnodes ufs_ntasks + ;; + + "upp") + + export NTHREADS_UPP=${NTHREADS1} + export APRUN_UPP="${APRUN_default} --cpus-per-task=${NTHREADS_UPP}" + ;; + + "atmos_products") + + export USE_CFP="YES" # Use MPMD for downstream product generation + ;; + +"oceanice_products") + + export NTHREADS_OCNICEPOST=${NTHREADS1} + export APRUN_OCNICEPOST="${launcher} -n 1 --cpus-per-task=${NTHREADS_OCNICEPOST}" +;; + + "ecen") + + export NTHREADS_ECEN=${NTHREADSmax} + export APRUN_ECEN="${APRUN_default} --cpus-per-task=${NTHREADS_ECEN}" + + export NTHREADS_CHGRES=${threads_per_task_chgres:-12} + [[ ${NTHREADS_CHGRES} -gt ${max_tasks_per_node} ]] && export NTHREADS_CHGRES=${max_tasks_per_node} + export APRUN_CHGRES="time" + + export NTHREADS_CALCINC=${threads_per_task_calcinc:-1} + [[ ${NTHREADS_CALCINC} -gt ${max_threads_per_task} ]] && export NTHREADS_CALCINC=${max_threads_per_task} + export APRUN_CALCINC="${APRUN_default} --cpus-per-task=${NTHREADS_CALCINC}" + + ;; + "esfc") + + export NTHREADS_ESFC=${NTHREADSmax} + export APRUN_ESFC="${APRUN_default} --cpus-per-task=${NTHREADS_ESFC}" + + export NTHREADS_CYCLE=${threads_per_task_cycle:-14} + [[ ${NTHREADS_CYCLE} -gt ${max_tasks_per_node} ]] && export NTHREADS_CYCLE=${max_tasks_per_node} + export APRUN_CYCLE="${APRUN_default} --cpus-per-task=${NTHREADS_CYCLE}" + + ;; + "epos") + + export NTHREADS_EPOS=${NTHREADSmax} + export APRUN_EPOS="${APRUN_default} --cpus-per-task=${NTHREADS_EPOS}" + + ;; + "postsnd") + + export CFP_MP="YES" + + export NTHREADS_POSTSND=${NTHREADS1} + export APRUN_POSTSND="${APRUN_default} --cpus-per-task=${NTHREADS_POSTSND}" + + export NTHREADS_POSTSNDCFP=${threads_per_task_postsndcfp:-1} + [[ ${NTHREADS_POSTSNDCFP} -gt ${max_threads_per_task} ]] && export NTHREADS_POSTSNDCFP=${max_threads_per_task} + export APRUN_POSTSNDCFP="${launcher} -n ${ntasks_postsndcfp} ${mpmd_opt}" + + ;; + "awips") + + export NTHREADS_AWIPS=${NTHREADS1} + export APRUN_AWIPSCFP="${APRUN_default} ${mpmd_opt}" + + ;; + "gempak") + + echo "WARNING: ${step} is not enabled on ${machine}!" + + ;; + "fit2obs") + + export NTHREADS_FIT2OBS=${NTHREADS1} + export MPIRUN="${APRUN_default} --cpus-per-task=${NTHREADS_FIT2OBS}" + ;; + *) + # Some other job not yet defined here + echo "WARNING: The job step ${step} does not specify GAEAC6-specific resources" + ;; +esac diff --git a/jobs/JGFS_ATMOS_WAFS b/jobs/JGFS_ATMOS_WAFS deleted file mode 100755 index 35a916bf1a..0000000000 --- a/jobs/JGFS_ATMOS_WAFS +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/sh - -######################################## -# GFS AWIPS PRODUCT GENERATION -######################################## -date -export PS4='$SECONDS + ' -set -xa - -export KEEPDATA=${KEEPDATA:-NO} - -############################################ -# Working Directory -############################################ -export DATA=${DATA:-${DATAROOT}/${jobid:?}} -mkdir -p $DATA -cd $DATA - -############################################ -# Output for executables -############################################ -export pgmout=OUTPUT.$$ - -############################################ -# Load the UTILITIES module -############################################ -#### module load prod_util -#### module load grib_util - -########################################### -# Run setpdy and initialize PDY variables -########################################### -export cycle=t${cyc}z -setpdy.sh -. ./PDY - -export RERUN=${RERUN:-NO} - -############################################ -# Set up the NET and RUN -############################################ -export NET=${NET:-gfs} -export RUN=${RUN:-gfs} -export COMPONENT=${COMPONENT:-atmos} - -############################################ -# Specify HOME Directory -############################################ -export gfs_ver=${gfs_ver:-v16.3.0} -export HOMEgfs=${HOMEgfs:-${NWROOT}/gfs.${gfs_ver}} -export EXECgfs=$HOMEgfs/exec -export FIXgfs=$HOMEgfs/fix/wafs -export PARMgfs=$HOMEgfs/parm/wafs -export USHgfs=$HOMEgfs/ush -export SCRIPTSgfs=$HOMEgfs/scripts - -################################################ -# Set up the input/output directory -################################################ -export COMIN=${COMIN:-$(compath.py ${envir}/${NET}/${gfs_ver})/${RUN}.${PDY}/${cyc}/$COMPONENT} -export COMOUT=${COMOUT:-$(compath.py -o $NET/$gfs_ver)/$RUN.$PDY/$cyc/$COMPONENT} -export PCOM=${PCOM:-$COMOUT/wmo} - -if [ $SENDCOM = YES ] ; then - mkdir -p $COMOUT $PCOM -fi - -############################################ -# print current environment -############################################ -env - -############################################ -# Execute the script. -############################################ - -${SCRIPTSgfs}/exgfs_atmos_wafs_grib.sh $fcsthrs -export err=$?; err_chk - -echo "JOB $job HAS COMPLETED NORMALLY!" - -############################################ -# print exec output -############################################ -if [ -e "$pgmout" ] ; then - cat $pgmout -fi - -############################################ -# remove temporary working directory -############################################ -if [ $KEEPDATA != YES ] ; then - rm -rf $DATA -fi - -date diff --git a/jobs/JGFS_ATMOS_WAFS_BLENDING_0P25 b/jobs/JGFS_ATMOS_WAFS_BLENDING_0P25 deleted file mode 100755 index 7367ce5a2c..0000000000 --- a/jobs/JGFS_ATMOS_WAFS_BLENDING_0P25 +++ /dev/null @@ -1,153 +0,0 @@ -#!/bin/sh -######################################################## -# This job runs the code to blend US's and UK's WAFS products at 0.25 deg -######################################################## - -date -export PS4='$SECONDS + ' -set -x - -# keep the working directory or not -export KEEPDATA=${KEEPDATA:-NO} - -############################################ -# Working Directory -############################################ -export DATA=${DATA:-${DATAROOT}/${jobid:?}} -mkdir -p $DATA -cd $DATA - -############################################ -# Output for executables -############################################ -export pgmout=OUTPUT.$$ - -########################################### -# Run setpdy and initialize PDY variables -########################################### -export cycle=t${cyc}z -setpdy.sh -. ./PDY - -export RERUN=${RERUN:-NO} - -############################################ -# Set up the NET and RUN -############################################ -export NET=${NET:-gfs} -export RUN=${RUN:-gfs} -export COMPONENT=${COMPONENT:-atmos} - -############################################ -# Specify HOME Directory -############################################ -export gfs_ver=${gfs_ver:-v16.3.0} -export HOMEgfs=${HOMEgfs:-${NWROOT}/gfs.${gfs_ver}} -export EXECgfs=$HOMEgfs/exec -export FIXgfs=$HOMEgfs/fix/wafs -export PARMgfs=$HOMEgfs/parm/wafs -export USHgfs=$HOMEgfs/ush -export SCRIPTSgfs=$HOMEgfs/scripts - -################################################ -# Set up the INPUT and OUTPUT directories -################################################ -export COMIN=${COMIN:-$(compath.py ${envir}/${NET}/${gfs_ver})/${RUN}.${PDY}/${cyc}/$COMPONENT} -export COMOUT=${COMOUT:-$(compath.py -o $NET/$gfs_ver)/$RUN.$PDY/$cyc/$COMPONENT} -export PCOM=${PCOM:-$COMOUT/wmo} - -if [ $SENDCOM = YES ] ; then - mkdir -p $COMOUT $PCOM -fi - -export COMINus=${COMINus:-$COMIN} -export COMINuk=${COMINuk:-$DCOMROOT/$PDY/wgrbbul/ukmet_wafs} - -############################################ -# print current environment -############################################ -env - -############################################## -# Set up the forecast hours -############################################## -export SHOUR=${SHOUR:-06} -export EHOUR=${EHOUR:-48} -export FHOUT_GFS=${FHOUT_GFS:-1} - -############################################### -# Specify Timeout Behavior of WAFS blending -# -# SLEEP_TIME - Amount of time to wait for -# a input file before exiting -# SLEEP_INT - Amount of time to wait between -# checking for input files -############################################### -# export SLEEP_TIME=300 # changed to 60 to avoid hitting wall_clock when miss umket wafs files ... -# JY -0129: export SLEEP_TIME=600 -export SLEEP_TIME=900 -export SLEEP_INT=10 - -#################################### -# Check if this is a restart -#################################### -if test -f $COMOUT/$RUN.t${cyc}z.control.wafsblending_0p25 -then - modelrecvy=`cat < $COMOUT/${RUN}.t${cyc}z.control.wafsblending_0p25` - recvy_pdy=`echo $modelrecvy | cut -c1-8` - recvy_cyc=`echo $modelrecvy | cut -c9-10` - recvy_shour=`echo $modelrecvy | cut -c11-` - - if [ $FHOUT_GFS -eq 3 ] ; then - FHINC=03 - else - if [ $recvy_shour -lt 24 ] ; then - FHINC=01 - else - FHINC=03 - fi - fi - - if test $RERUN = "NO" - then - if [ $recvy_shour -lt $EHOUR ] - then - new_shour=`expr $recvy_shour + $FHINC` - fi - if test $new_shour -ge $SHOUR - then - export SHOUR=$new_shour - if [ $SHOUR -lt 10 ]; then SHOUR=0$SHOUR; fi - fi - if test $recvy_shour -ge $EHOUR - then - echo "WAFS blending Already Completed to $EHOUR" - else - echo "Starting: PDY=$PDY cycle=t${recvy_cyc}z SHOUR=$SHOUR ." - fi - fi -fi - -############################################ -# Execute the script. -############################################ -${SCRIPTSgfs}/exgfs_atmos_wafs_blending_0p25.sh -export err=$?; err_chk - -echo "JOB $job HAS COMPLETED NORMALLY." - -############################################ -# print exec output -############################################ -if [ -e "$pgmout" ] ; then - cat $pgmout -fi - -############################################ -# remove temporary working directory -############################################ -if [ $KEEPDATA != YES ] ; then - rm -rf $DATA -fi - -date diff --git a/jobs/JGFS_ATMOS_WAFS_GCIP b/jobs/JGFS_ATMOS_WAFS_GCIP deleted file mode 100755 index d4e1a4529f..0000000000 --- a/jobs/JGFS_ATMOS_WAFS_GCIP +++ /dev/null @@ -1,140 +0,0 @@ -#!/bin/sh - -############################################ -# GFS GCIP PRODUCT GENERATION -############################################ - -date -export PS4='$SECONDS + ' -set -xa - -# keep the working directory or not -export KEEPDATA=${KEEPDATA:-NO} - -############################################ -# Working Directory -############################################ -export DATA=${DATA:-${DATAROOT}/${jobid:?}} -mkdir -p $DATA -cd $DATA - -############################################ -# Output for executables -############################################ -export pgmout=OUTPUT.$$ - -############################################ -# Load the UTILITIES module -############################################ -#### module load prod_util -#### module load grib_util - -############################################ -# Run setpdy and initialize PDY variables -############################################ -export cycle=t${cyc}z -setpdy.sh -. ./PDY - -############################################ -# Set up the NET and RUN -############################################ -export NET=${NET:-gfs} -export RUN=${RUN:-gfs} -export COMPONENT=${COMPONENT:-atmos} - -############################################ -# Specify HOME Directory -############################################ -export gfs_ver=${gfs_ver:-v16.3.0} -export HOMEgfs=${HOMEgfs:-${NWROOT}/gfs.${gfs_ver}} -export EXECgfs=$HOMEgfs/exec -export FIXgfs=$HOMEgfs/fix/wafs -export PARMgfs=$HOMEgfs/parm/wafs -export USHgfs=$HOMEgfs/ush -export SCRIPTSgfs=$HOMEgfs/scripts - -# For BUFR dump, TMPDIR must be defined -export TMPDIR=$DATA # will be overwritten in exgfs script for parallel runs on ffhr -# For BUFR dump, these two environment variables are defined by module load -# HOMEobsproc_shared_bufr_dumplist <= module load bufr_dumplist/1.5.0 -# HOMEobsproc_dump <= module load dumpjb/4.0.0 - - -################################################ -# Set up the input/output directory -################################################ -# model data -export COMINgfs=${COMINgfs:-$(compath.py ${envir}/${NET}/${gfs_ver})/${RUN}.${PDY}/${cyc}/$COMPONENT} - -# satellite data -#ftp://satepsanone.nesdis.noaa.gov/2day/gmosaic/ -# Have to change IP address to digital ones, which BSUB can identify -#export COMINsat=${COMINsat:-ftp://140.90.213.161/2day/gmosaic} -export COMINsat=${COMINsat:-$DCOMROOT/$PDY/mcidas} - -# radar data -export radarl2_ver=${radarl2_ver:-v1.2} -export COMINradar=${COMINradar:-$(compath.py ${envir}/radarl2/$radarl2_ver)/radar.$PDY} - -# metar/ships/lightning/pireps -# data are dumped by $USHobsproc_dump/dumpjb -# - -# COMOUT -export COMOUT=${COMOUT:-$(compath.py -o $NET/$gfs_ver)/$RUN.$PDY/$cyc/$COMPONENT} - -mkdir -p $COMOUT - -############################################### -# Specify Timeout Behavior of WAFS GCIP -# -# SLEEP_TIME - how long to wait for inputs before exiting -# SLEEP_INT - time interval for checking for inputs -############################################### -# JY export SLEEP_TIME=300 -export SLEEP_TIME=600 -export SLEEP_INT=10 - -############################################ -# Execute the script, parallel run for 000 003 -############################################ -export MPIRUN=${MPIRUN:-"mpiexec -l -np 2 --cpu-bind verbose,core cfp"} - -# GCIP runs f000 f003 for each cycle, 4 times/day, -# to make the output valid every 3 hours -if [ `echo $MPIRUN | cut -d " " -f1` = 'srun' ] ; then - echo 0 ${SCRIPTSgfs}/exgfs_atmos_wafs_gcip.sh 000 >> gcip.cmdfile - echo 1 ${SCRIPTSgfs}/exgfs_atmos_wafs_gcip.sh 003 >> gcip.cmdfile -else - echo ${SCRIPTSgfs}/exgfs_atmos_wafs_gcip.sh 000 >> gcip.cmdfile - echo ${SCRIPTSgfs}/exgfs_atmos_wafs_gcip.sh 003 >> gcip.cmdfile - export MP_PGMMODEL=mpmd -fi - -$MPIRUN gcip.cmdfile - -export err=$? -if [ $err -eq 0 ] ; then - echo "JOB $job HAS COMPLETED NORMALLY!" -elif [ $err -eq 1 ] ; then - echo "WARNING!!! JOB $job incomplete. Missing satellite data." -else - echo "JOB $job FAILED!!!!" -fi - -############################################ -# print exec output -############################################ -if [ -e "$pgmout" ] ; then - cat $pgmout -fi - -############################################ -# remove temporary working directory -############################################ -if [ $KEEPDATA != YES ] ; then - rm -rf $DATA -fi - -date diff --git a/jobs/JGFS_ATMOS_WAFS_GRIB2 b/jobs/JGFS_ATMOS_WAFS_GRIB2 deleted file mode 100755 index ed4c92979e..0000000000 --- a/jobs/JGFS_ATMOS_WAFS_GRIB2 +++ /dev/null @@ -1,124 +0,0 @@ -#!/bin/sh - -######################################## -# GFS AWIPS PRODUCT GENERATION -######################################## - -date -export PS4='$SECONDS + ' -set -x - -# keep the working directory or not -export KEEPDATA=${KEEPDATA:-NO} - -############################################ -# Working Directory -############################################ -export DATA=${DATA:-${DATAROOT}/${jobid:?}} -mkdir -p $DATA -cd $DATA - -############################################ -# Output for executables -############################################ -export pgmout=OUTPUT.$$ - -############################################ -# Load the UTILITIES module -############################################ -#### module load prod_util -#### module load grib_util - -########################################### -# Run setpdy and initialize PDY variables -########################################### -export cycle=t${cyc}z -setpdy.sh -. ./PDY - -############################################ -# Set up the NET and RUN -############################################ -export NET=${NET:-gfs} -export RUN=${RUN:-gfs} -export COMPONENT=${COMPONENT:-atmos} - -############################################ -# Specify HOME Directory -############################################ -export gfs_ver=${gfs_ver:-v16.3.0} -export HOMEgfs=${HOMEgfs:-${NWROOT}/gfs.${gfs_ver}} -export EXECgfs=$HOMEgfs/exec -export FIXgfs=$HOMEgfs/fix/wafs -export PARMgfs=$HOMEgfs/parm/wafs -export USHgfs=$HOMEgfs/ush -export SCRIPTSgfs=$HOMEgfs/scripts - -################################################ -# Set up the input/output directory -################################################ -#### if [ $envir = "prod" ] || [ $envir = "para" ] ; then -#### export COMIN=${COMIN:-$COMROOT/${NET}/${envir}/$RUN.$PDY} -#### else -#### export COMIN=${COMIN:-$COMROOT/${NET}/prod/$RUN.$PDY} -#### fi - -export COMIN=${COMIN:-$(compath.py ${envir}/${NET}/${gfs_ver})/${RUN}.${PDY}/${cyc}/$COMPONENT} -export COMOUT=${COMOUT:-$(compath.py -o $NET/$gfs_ver)/$RUN.$PDY/$cyc/$COMPONENT} -export PCOM=${PCOM:-$COMOUT/wmo} - -if [ $SENDCOM = YES ] ; then - mkdir -p $COMOUT $PCOM -fi - -############################################ -# print current environment -############################################ -env - -############################################## -# Set up the forecast hours -############################################## -export FHOURS=${FHOURS:-"00 06 09 12 15 18 21 24 27 30 33 36 42 48 54 60 66 72"} - -############################################ -# Execute the script. -############################################ - -NP=`echo $FHOURS | wc -w` -export MPIRUN=${MPIRUN:-"mpiexec -np $NP -cpu-bind verbose,core cfp"} - -rm wafsgrib2.cmdfile -ic=0 -for fcsthrs in $FHOURS ; do - if [ `echo $MPIRUN | cut -d " " -f1` = 'srun' ] ; then - echo $ic ${SCRIPTSgfs}/exgfs_atmos_wafs_grib2.sh $fcsthrs >> wafsgrib2.cmdfile - else - echo ${SCRIPTSgfs}/exgfs_atmos_wafs_grib2.sh $fcsthrs >> wafsgrib2.cmdfile - export MP_PGMMODEL=mpmd - fi - ic=`expr $ic + 1` -done - -$MPIRUN wafsgrib2.cmdfile - -export err=$?; err_chk - -echo "JOB $job HAS COMPLETED NORMALLY!" - -############################################ -# print exec output -############################################ -if [ -e "$pgmout" ] ; then - cat $pgmout -fi - -############################################ -# remove temporary working directory -############################################ -if [ $KEEPDATA != YES ] ; then - rm -rf $DATA -fi - -date - diff --git a/jobs/JGFS_ATMOS_WAFS_GRIB2_0P25 b/jobs/JGFS_ATMOS_WAFS_GRIB2_0P25 deleted file mode 100755 index 64570bbf5d..0000000000 --- a/jobs/JGFS_ATMOS_WAFS_GRIB2_0P25 +++ /dev/null @@ -1,133 +0,0 @@ -#!/bin/sh - -######################################## -# GFS WAFS GRIB 0P25 PRODUCT GENERATION -######################################## - -date -export PS4='$SECONDS + ' -set -x - -# keep the working directory or not -export KEEPDATA=${KEEPDATA:-NO} - -############################################ -# Working Directory -############################################ -export DATA=${DATA:-${DATAROOT}/${jobid:?}} -mkdir -p $DATA -cd $DATA - -############################################ -# Output for executables -############################################ -export pgmout=OUTPUT.$$ - -########################################### -# Run setpdy and initialize PDY variables -########################################### -export cycle=t${cyc}z -setpdy.sh -. ./PDY - -############################################ -# Set up the NET and RUN -############################################ -export NET=${NET:-gfs} -export RUN=${RUN:-gfs} -export COMPONENT=${COMPONENT:-atmos} - -############################################ -# Specify HOME Directory -############################################ -export gfs_ver=${gfs_ver:-v16.3.0} -export HOMEgfs=${HOMEgfs:-${NWROOT}/gfs.${gfs_ver}} -export EXECgfs=$HOMEgfs/exec -export FIXgfs=$HOMEgfs/fix/wafs -export PARMgfs=$HOMEgfs/parm/wafs -export USHgfs=$HOMEgfs/ush -export SCRIPTSgfs=$HOMEgfs/scripts - -################################################ -# Set up the input/output directory -################################################ -export COMIN=${COMIN:-$(compath.py ${envir}/${NET}/${gfs_ver})/${RUN}.${PDY}/${cyc}/$COMPONENT} -export COMOUT=${COMOUT:-$(compath.py -o $NET/$gfs_ver)/$RUN.$PDY/$cyc/$COMPONENT} -export PCOM=${PCOM:-$COMOUT/wmo} - -if [ $SENDCOM = YES ] ; then - mkdir -p $COMOUT $PCOM -fi - -############################################ -# print current environment -############################################ -env - -############################################## -# Set up the forecast hours -############################################## -#export SHOUR=${SHOUR:-06} -# Will change to 120 for 2023 ICAO standard -#export EHOUR=${EHOUR:-120} -#export EHOUR=${EHOUR:-36} - -export FHOUT_GFS=${FHOUT_GFS:-1} -if [ $FHOUT_GFS -eq 3 ] ; then #27 - export FHOURS=${FHOURS:-"6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 54 60 66 72 78 84 90 96 102 108 114 120"} -else #39 - export FHOURS=${FHOURS:-"6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 27 30 33 36 39 42 45 48 54 60 66 72 78 84 90 96 102 108 114 120"} -fi - -############################################### -# Specify Timeout Behavior of WAFS blending -# -# SLEEP_TIME - Amount of time to wait for -# a input file before exiting -# SLEEP_INT - Amount of time to wait between -# checking for input files -############################################### -# export SLEEP_TIME=300 # changed to 60 to avoid hitting wall_clock when miss umket wafs files ... -export SLEEP_TIME=600 -export SLEEP_INT=10 - -############################################ -# Execute the script. -############################################ -NP=`echo $FHOURS | wc -w` -export MPIRUN=${MPIRUN:-"mpiexec -np $NP -cpu-bind verbose,core cfp"} - -rm wafsgrib2_0p25.cmdfile -ic=0 -for fcsthrs in $FHOURS ; do - if [ `echo $MPIRUN | cut -d " " -f1` = 'srun' ] ; then - echo $ic ${SCRIPTSgfs}/exgfs_atmos_wafs_grib2_0p25.sh $fcsthrs >> wafsgrib2_0p25.cmdfile - else - echo ${SCRIPTSgfs}/exgfs_atmos_wafs_grib2_0p25.sh $fcsthrs >> wafsgrib2_0p25.cmdfile - export MP_PGMMODEL=mpmd - fi - ic=`expr $ic + 1` -done - -$MPIRUN wafsgrib2_0p25.cmdfile - -export err=$?; err_chk - -echo "JOB $job HAS COMPLETED NORMALLY!" - -############################################ -# print exec output -############################################ -if [ -e "$pgmout" ] ; then - cat $pgmout -fi - -############################################ -# remove temporary working directory -############################################ -if [ $KEEPDATA != YES ] ; then - rm -rf $DATA -fi - -date - diff --git a/jobs/JGLOBAL_ARCHIVE b/jobs/JGLOBAL_ARCHIVE index 401feba35f..f62386cdd9 100755 --- a/jobs/JGLOBAL_ARCHIVE +++ b/jobs/JGLOBAL_ARCHIVE @@ -1,9 +1,8 @@ #! /usr/bin/env bash source "${HOMEgfs}/ush/preamble.sh" -source "${HOMEgfs}/ush/jjob_header.sh" -e "arch" -c "base arch" - - +source "${HOMEgfs}/ush/jjob_header.sh" -e "arch" -c "base arch wave" +source "${USHgfs}/wave_domain_grid.sh" ############################################## # Set variables used in the script ############################################## @@ -50,6 +49,23 @@ for grid in "0p25" "0p50" "1p00"; do "COMIN_ATMOS_GRIB_${grid}:COM_ATMOS_GRIB_GRID_TMPL" done +############################################################### +# Create an array of output wave grids to process +if [[ "${DO_WAVE}" == "YES" ]]; then + # Create a variable for output wave grids to process + if [[ -n "${wavepostGRD}" || -n "${waveinterpGRD}" ]]; then + for grdID in ${wavepostGRD} ${waveinterpGRD}; do + process_grdID "${grdID}" + YMD=${PDY} HH=${cyc} GRDRESNAME=${grdNAME} declare_from_tmpl -rx \ + "COMIN_WAVE_GRID_${GRDREGION}_${GRDRES}:COM_WAVE_GRID_RES_TMPL" + grids_arr+=("${GRDREGION}.${GRDRES}") + done + export WAVE_OUT_GRIDS="${grids_arr[*]}" + else + echo "Both wavepostGRD and waveinterpGRD are empty. No grids to process." + export WAVE_OUT_GRIDS="" + fi +fi ############################################################### # Run archive script ############################################################### @@ -69,7 +85,6 @@ if [[ -e "${pgmout}" ]] ; then cat "${pgmout}" fi - ########################################## # Remove the Temporary working directory ########################################## diff --git a/jobs/JGLOBAL_EXTRACTVARS b/jobs/JGLOBAL_EXTRACTVARS index 3478ca3976..1c1a763a03 100755 --- a/jobs/JGLOBAL_EXTRACTVARS +++ b/jobs/JGLOBAL_EXTRACTVARS @@ -2,6 +2,7 @@ source "${HOMEgfs}/ush/preamble.sh" source "${HOMEgfs}/ush/jjob_header.sh" -e "extractvars" -c "base extractvars" +source "${USHgfs}/wave_domain_grid.sh" # Set COM Paths for grid in '0p25' '0p50' '1p00'; do @@ -19,6 +20,10 @@ YMD="${PDY}" HH="${cyc}" declare_from_tmpl -rx \ "COMIN_ICE_NETCDF:COM_ICE_NETCDF_TMPL" \ "COMIN_WAVE_GRID:COM_WAVE_GRID_TMPL" +process_grdID "${waveGRD}" +YMD=${PDY} HH=${cyc} GRDRESNAME=${grdNAME} declare_from_tmpl -rx \ + "COMIN_WAVE_GRID_${GRDREGION}_${GRDRES}:COM_WAVE_GRID_RES_TMPL" + if [[ "${DO_ATM}" == "YES" ]]; then if [[ ! -d "${ARC_RFCST_PROD_ATMOS_F2D}" ]]; then mkdir -p "${ARC_RFCST_PROD_ATMOS_F2D}"; fi if [[ ! -d "${ARC_RFCST_PROD_ATMOS_F3D}" ]]; then mkdir -p "${ARC_RFCST_PROD_ATMOS_F3D}"; fi diff --git a/jobs/JGLOBAL_FETCH b/jobs/JGLOBAL_FETCH new file mode 100755 index 0000000000..e10049169a --- /dev/null +++ b/jobs/JGLOBAL_FETCH @@ -0,0 +1,23 @@ +#! /usr/bin/env bash + +source "${HOMEgfs}/ush/preamble.sh" +source "${HOMEgfs}/ush/jjob_header.sh" -e "fetch" -c "base fetch" + +# Execute fetching +"${SCRgfs}/exglobal_fetch.py" +err=$? + +############################################################### +# Check for errors and exit if any of the above failed +if [[ "${err}" -ne 0 ]]; then + echo "FATAL ERROR: Unable to fetch ICs to ${ROTDIR}; ABORT!" + exit "${err}" +fi + +########################################## +# Remove the Temporary working directory +########################################## +cd "${DATAROOT}" || (echo "${DATAROOT} does not exist. ABORT!"; exit 1) +[[ ${KEEPDATA} = "NO" ]] && rm -rf "${DATA}" + +exit 0 diff --git a/jobs/JGLOBAL_WAVE_GEMPAK b/jobs/JGLOBAL_WAVE_GEMPAK index c7b615c560..1c01b0cf64 100755 --- a/jobs/JGLOBAL_WAVE_GEMPAK +++ b/jobs/JGLOBAL_WAVE_GEMPAK @@ -17,6 +17,16 @@ YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \ COMIN_WAVE_GRID:COM_WAVE_GRID_TMPL \ COMOUT_WAVE_GEMPAK:COM_WAVE_GEMPAK_TMPL +if [[ -n "${GEMPAK_GRIDS}" ]]; then + for grdID in ${GEMPAK_GRIDS}; do + process_grdID "${grdID}" + YMD=${PDY} HH=${cyc} GRDRESNAME=${grdNAME} declare_from_tmpl -rx \ + "COMIN_WAVE_GRID_${GRDREGION}_${GRDRES}:COM_WAVE_GRID_RES_TMPL" + done +else + echo "waveinterpGRD is empty. No grids to process." +fi + if [[ ! -d ${COMOUT_WAVE_GEMPAK} ]]; then mkdir -p "${COMOUT_WAVE_GEMPAK}"; fi ######################################################## diff --git a/jobs/JGLOBAL_WAVE_POST_SBS b/jobs/JGLOBAL_WAVE_POST_SBS index 53ac4b2083..171d160515 100755 --- a/jobs/JGLOBAL_WAVE_POST_SBS +++ b/jobs/JGLOBAL_WAVE_POST_SBS @@ -2,6 +2,7 @@ source "${HOMEgfs}/ush/preamble.sh" source "${HOMEgfs}/ush/jjob_header.sh" -e "wavepostsbs" -c "base wave wavepostsbs" +source "${USHgfs}/wave_domain_grid.sh" # Add default errchk = err_chk export errchk=${errchk:-err_chk} @@ -19,7 +20,18 @@ for out_dir in "${COMOUT_WAVE_PREP}" "${COMOUT_WAVE_GRID}"; do if [[ ! -d "${out_dir}" ]]; then mkdir -p "${out_dir}"; fi done - +if [[ -n "${wavepostGRD}" || -n "${waveinterpGRD}" ]]; then + for grdID in ${wavepostGRD} ${waveinterpGRD}; do + process_grdID "${grdID}" + YMD=${PDY} HH=${cyc} GRDRESNAME=${grdNAME} declare_from_tmpl -rx \ + "COMOUT_WAVE_GRID_${GRDREGION}_${GRDRES}:COM_WAVE_GRID_RES_TMPL" + out_dir_varname="COMOUT_WAVE_GRID_${GRDREGION}_${GRDRES}" + out_dir=${!out_dir_varname} + if [[ ! -d "${out_dir}" ]]; then mkdir -p "${out_dir}"; fi + done +else + echo "Both wavepostGRD and waveinterpGRD are empty. No grids to process." +fi # Set wave model ID tag to include member number # if ensemble; waveMEMB var empty in deterministic # Set wave model ID tag to include member number diff --git a/jobs/JGLOBAL_WAVE_PRDGEN_GRIDDED b/jobs/JGLOBAL_WAVE_PRDGEN_GRIDDED index 208b36c535..f84c5abc01 100755 --- a/jobs/JGLOBAL_WAVE_PRDGEN_GRIDDED +++ b/jobs/JGLOBAL_WAVE_PRDGEN_GRIDDED @@ -2,6 +2,7 @@ source "${HOMEgfs}/ush/preamble.sh" source "${HOMEgfs}/ush/jjob_header.sh" -e "waveawipsgridded" -c "base wave waveawipsgridded" +source "${USHgfs}/wave_domain_grid.sh" # Add default errchk = err_chk export errchk=${errchk:-err_chk} @@ -19,6 +20,15 @@ YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \ if [[ ! -d ${COMOUT_WAVE_WMO} ]]; then mkdir -p "${COMOUT_WAVE_WMO}"; fi +if [[ -n "${GEMPAK_GRIDS}" ]]; then + for grdID in ${GEMPAK_GRIDS}; do + process_grdID "${grdID}" + YMD=${PDY} HH=${cyc} GRDRESNAME=${grdNAME} declare_from_tmpl -rx \ + "COMIN_WAVE_GRID_${GRDREGION}_${GRDRES}:COM_WAVE_GRID_RES_TMPL" + done +else + echo "GEMPAK_GRIDS are empty. No grids to process." +fi ################################### # Execute the Script @@ -35,6 +45,4 @@ if [ "${KEEPDATA}" != "YES" ]; then rm -rf ${DATA} fi - exit 0 - diff --git a/jobs/rocoto/fetch.sh b/jobs/rocoto/fetch.sh new file mode 100755 index 0000000000..ee34f6bd92 --- /dev/null +++ b/jobs/rocoto/fetch.sh @@ -0,0 +1,18 @@ +#! /usr/bin/env bash + +source "${HOMEgfs}/ush/preamble.sh" + +# Source FV3GFS workflow modules +. "${HOMEgfs}/ush/load_fv3gfs_modules.sh" +status=$? +[[ "${status}" -ne 0 ]] && exit "${status}" + +export job="fetch" +export jobid="${job}.$$" + +# Execute the JJOB +"${HOMEgfs}/jobs/JGLOBAL_FETCH" +status=$? + + +exit "${status}" diff --git a/jobs/rocoto/upp.sh b/jobs/rocoto/upp.sh index c3f128ab02..a4133608d1 100755 --- a/jobs/rocoto/upp.sh +++ b/jobs/rocoto/upp.sh @@ -4,7 +4,7 @@ source "${HOMEgfs}/ush/preamble.sh" ############################################################### ## Offline UPP driver script -## UPP_RUN: analysis, forecast, goes, wafs. See upp.yaml for valid options +## UPP_RUN: analysis, forecast, goes. See upp.yaml for valid options ## FHRLST : forecast hourlist to be post-process (e.g. f000, f000_f001_f002, ...) ############################################################### diff --git a/modulefiles/module_base.gaea.lua b/modulefiles/module_base.gaeac5.lua similarity index 98% rename from modulefiles/module_base.gaea.lua rename to modulefiles/module_base.gaeac5.lua index f379225380..e7a05fd095 100644 --- a/modulefiles/module_base.gaea.lua +++ b/modulefiles/module_base.gaeac5.lua @@ -1,5 +1,5 @@ help([[ -Load environment to run GFS on Gaea +Load environment to run GFS on Gaea C5 ]]) local spack_mod_path=(os.getenv("spack_mod_path") or "None") diff --git a/modulefiles/module_base.gaeac6.lua b/modulefiles/module_base.gaeac6.lua new file mode 100644 index 0000000000..e0388ac84b --- /dev/null +++ b/modulefiles/module_base.gaeac6.lua @@ -0,0 +1,47 @@ +help([[ +Load environment to run GFS on Gaea C6 +]]) + +local spack_mod_path=(os.getenv("spack_mod_path") or "None") +prepend_path("MODULEPATH", spack_mod_path) + +load(pathJoin("stack-intel", (os.getenv("stack_intel_ver") or "None"))) +load(pathJoin("stack-cray-mpich", (os.getenv("stack_cray_mpich_ver") or "None"))) +load(pathJoin("python", (os.getenv("python_ver") or "None"))) + +load(pathJoin("jasper", (os.getenv("jasper_ver") or "None"))) +load(pathJoin("libpng", (os.getenv("libpng_ver") or "None"))) +load(pathJoin("cdo", (os.getenv("cdo_ver") or "None"))) +load(pathJoin("hdf5", (os.getenv("hdf5_ver") or "None"))) +load(pathJoin("netcdf-c", (os.getenv("netcdf_c_ver") or "None"))) +load(pathJoin("netcdf-fortran", (os.getenv("netcdf_fortran_ver") or "None"))) +load(pathJoin("perlbrew", (os.getenv("perl_ver") or "None"))) + +load(pathJoin("nco", (os.getenv("nco_ver") or "None"))) +load(pathJoin("prod_util", (os.getenv("prod_util_ver") or "None"))) +load(pathJoin("grib-util", (os.getenv("grib_util_ver") or "None"))) +load(pathJoin("g2tmpl", (os.getenv("g2tmpl_ver") or "None"))) +load(pathJoin("gsi-ncdiag", (os.getenv("gsi_ncdiag_ver") or "None"))) +load(pathJoin("crtm", (os.getenv("crtm_ver") or "None"))) +load(pathJoin("bufr", (os.getenv("bufr_ver") or "None"))) +load(pathJoin("wgrib2", (os.getenv("wgrib2_ver") or "None"))) +load(pathJoin("py-netcdf4", (os.getenv("py_netcdf4_ver") or "None"))) +load(pathJoin("py-f90nml", (os.getenv("py_f90nml_ver") or "None"))) +load(pathJoin("py-pyyaml", (os.getenv("py_pyyaml_ver") or "None"))) +load(pathJoin("py-jinja2", (os.getenv("py_jinja2_ver") or "None"))) +load(pathJoin("py-pandas", (os.getenv("py_pandas_ver") or "None"))) +load(pathJoin("py-python-dateutil", (os.getenv("py_python_dateutil_ver") or "None"))) +load(pathJoin("met", (os.getenv("met_ver") or "None"))) +load(pathJoin("metplus", (os.getenv("metplus_ver") or "None"))) +load(pathJoin("py-xarray", (os.getenv("py_xarray_ver") or "None"))) + +setenv("WGRIB2","wgrib2") +setenv("UTILROOT",(os.getenv("prod_util_ROOT") or "None")) + +prepend_path("MODULEPATH", pathJoin("/gpfs/f6/bil-fire8/world-shared/global/glopara/git/prepobs/v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles")) +load(pathJoin("prepobs", (os.getenv("prepobs_run_ver") or "None"))) + +prepend_path("MODULEPATH", pathJoin("/gpfs/f6/bil-fire8/world-shared/global/glopara/git/Fit2Obs/v" .. (os.getenv("fit2obs_ver") or "None"), "modulefiles")) +load(pathJoin("fit2obs", (os.getenv("fit2obs_ver") or "None"))) + +whatis("Description: GFS run setup environment") diff --git a/modulefiles/module_gwsetup.gaea.lua b/modulefiles/module_gwsetup.gaeac5.lua similarity index 79% rename from modulefiles/module_gwsetup.gaea.lua rename to modulefiles/module_gwsetup.gaeac5.lua index 0bcc689bad..0c1691d30b 100644 --- a/modulefiles/module_gwsetup.gaea.lua +++ b/modulefiles/module_gwsetup.gaeac5.lua @@ -1,5 +1,5 @@ help([[ -Load environment to run GFS workflow setup scripts on Gaea +Load environment to run GFS workflow setup scripts on Gaea C5 ]]) prepend_path("MODULEPATH", "/ncrc/proj/epic/rocoto/modulefiles") @@ -7,7 +7,7 @@ load(pathJoin("rocoto")) prepend_path("MODULEPATH", "/ncrc/proj/epic/spack-stack/spack-stack-1.6.0/envs/unified-env/install/modulefiles/Core") -local stack_intel_ver=os.getenv("stack_intel_ver") or "2023.1.0" +local stack_intel_ver=os.getenv("stack_intel_ver") or "2023.2.0" local python_ver=os.getenv("python_ver") or "3.10.13" load(pathJoin("stack-intel", stack_intel_ver)) diff --git a/modulefiles/module_gwsetup.gaeac6.lua b/modulefiles/module_gwsetup.gaeac6.lua new file mode 100644 index 0000000000..1623e6f1a2 --- /dev/null +++ b/modulefiles/module_gwsetup.gaeac6.lua @@ -0,0 +1,20 @@ +help([[ +Load environment to run GFS workflow setup scripts on Gaea C6 +]]) + +prepend_path("MODULEPATH", "/ncrc/proj/epic/rocoto/modulefiles") +load(pathJoin("rocoto")) + +prepend_path("MODULEPATH", "/ncrc/proj/epic/spack-stack/c6/spack-stack-1.6.0/envs/unified-env/install/modulefiles/Core") + +local stack_intel_ver=os.getenv("stack_intel_ver") or "2023.2.0" +local python_ver=os.getenv("python_ver") or "3.10.13" + +load(pathJoin("stack-intel", stack_intel_ver)) +load(pathJoin("python", python_ver)) +load("py-jinja2") +load("py-pyyaml") +load("py-numpy") +load("git-lfs") + +whatis("Description: GFS run setup environment") diff --git a/parm/archive/gdaswave.yaml.j2 b/parm/archive/gdaswave.yaml.j2 index 109c70c181..3f140c7062 100644 --- a/parm/archive/gdaswave.yaml.j2 +++ b/parm/archive/gdaswave.yaml.j2 @@ -4,5 +4,15 @@ gdaswave: target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdaswave.tar" required: # TODO explicitly name the wave grid/station files to archive - - "{{ COMIN_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*" + {% set WAVE_OUT_GRIDS_list = WAVE_OUT_GRIDS.split(' ') %} + {% for grd in WAVE_OUT_GRIDS_list %} + {% set tmpl_dict = ({ '${ROTDIR}':ROTDIR, + '${RUN}':RUN, + '${YMD}':cycle_YMD, + '${HH}':cycle_HH, + '${MEMDIR}':'', + '${GRDRESNAME}':grd}) %} + {% set file_path = COM_WAVE_GRID_RES_TMPL | replace_tmpl(tmpl_dict) %} + - "{{ file_path | relpath(ROTDIR) }}/{{ head }}*" + {% endfor %} - "{{ COMIN_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}*" diff --git a/parm/archive/gfswave.yaml.j2 b/parm/archive/gfswave.yaml.j2 index 6909421757..8d02d28dec 100644 --- a/parm/archive/gfswave.yaml.j2 +++ b/parm/archive/gfswave.yaml.j2 @@ -1,20 +1,31 @@ gfswave: {% set head = "gfswave.t" + cycle_HH + "z." %} + name: "GFSWAVE" target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfswave.tar" required: # Wave GRIB2 regional forecast products + {% set WAVE_OUT_GRIDS_list = WAVE_OUT_GRIDS.split(' ') %} + {% for grd in WAVE_OUT_GRIDS_list %} + {% set tmpl_dict = ({ '${ROTDIR}':ROTDIR, + '${RUN}':RUN, + '${YMD}':cycle_YMD, + '${HH}':cycle_HH, + '${MEMDIR}':'', + '${GRDRESNAME}':grd}) %} + {% set file_path = COM_WAVE_GRID_RES_TMPL | replace_tmpl(tmpl_dict) %} + {% for fh in range(0, FHMAX_HF_WAV + FHOUT_HF_WAV, FHOUT_HF_WAV) %} # NOTE This is as explicit as possible without major logic to parse wavepostGRD. # Matches files of the form "gfswave.tCCz...fHHH.grib2". - - "{{ COMIN_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2" - - "{{ COMIN_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2.idx" + - "{{ file_path | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2" + - "{{ file_path | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2.idx" {% endfor %} # Global wave GRIB2 forecast products {% for fh in range(FHMAX_HF_WAV + FHOUT_WAV, FHMAX_WAV_GFS + FHOUT_WAV, FHOUT_WAV) %} - - "{{ COMIN_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2" - - "{{ COMIN_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2.idx" + - "{{ file_path | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2" + - "{{ file_path | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2.idx" {% endfor %} # Wave bulletins @@ -28,3 +39,4 @@ gfswave: - "{{ COMIN_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}ibpcbull_tar" - "{{ COMIN_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}ibp_tar" {% endif %} + {% endfor %} diff --git a/parm/config/gefs/config.base b/parm/config/gefs/config.base index fc641fef6b..400be7eb17 100644 --- a/parm/config/gefs/config.base +++ b/parm/config/gefs/config.base @@ -103,6 +103,7 @@ export ROTDIR="@COMROOT@/${PSLOT}" export ARCDIR="${NOSCRUB}/archive/${PSLOT}" export ATARDIR="@ATARDIR@" +export FETCHDIR="@FETCHDIR@" # HPSS or local directory where IC tarball(s) can be found. # Commonly defined parameters in JJOBS export envir=${envir:-"prod"} diff --git a/parm/config/gefs/config.fetch b/parm/config/gefs/config.fetch new file mode 120000 index 0000000000..21e571a2fd --- /dev/null +++ b/parm/config/gefs/config.fetch @@ -0,0 +1 @@ +../gfs/config.fetch \ No newline at end of file diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base index fbbe5c782f..96954b4acb 100644 --- a/parm/config/gfs/config.base +++ b/parm/config/gfs/config.base @@ -132,6 +132,7 @@ if [[ "${PDY}${cyc}" -ge "2019092100" && "${PDY}${cyc}" -le "2019110700" ]]; the fi export ARCDIR="${NOSCRUB}/archive/${PSLOT}" export ATARDIR="@ATARDIR@" +export FETCHDIR="@FETCHDIR@" # Commonly defined parameters in JJOBS export envir=${envir:-"prod"} @@ -474,6 +475,10 @@ export DO_VRFY_OCEANDA="@DO_VRFY_OCEANDA@" # Run SOCA Ocean and Seaice DA verif export FHMAX_FITS=132 [[ "${FHMAX_FITS}" -gt "${FHMAX_GFS}" ]] && export FHMAX_FITS=${FHMAX_GFS} +# User may choose to reset these at experiment setup time +export DO_FETCH_HPSS="NO" # Copy from HPSS (on HPSS-accessible machines) onto COM +export DO_FETCH_LOCAL="NO" # Copy from local disk onto COM + # Archiving options export HPSSARCH="@HPSSARCH@" # save data to HPSS archive export LOCALARCH="@LOCALARCH@" # save data to local archive diff --git a/parm/config/gfs/config.com b/parm/config/gfs/config.com index d949edb33a..8b6da376f3 100644 --- a/parm/config/gfs/config.com +++ b/parm/config/gfs/config.com @@ -74,6 +74,7 @@ declare -rx COM_WAVE_RESTART_TMPL=${COM_BASE}'/model/wave/restart' declare -rx COM_WAVE_PREP_TMPL=${COM_BASE}'/model/wave/prep' declare -rx COM_WAVE_HISTORY_TMPL=${COM_BASE}'/model/wave/history' declare -rx COM_WAVE_GRID_TMPL=${COM_BASE}'/products/wave/gridded' +declare -rx COM_WAVE_GRID_RES_TMPL=${COM_BASE}'/products/wave/gridded/${GRDRESNAME}' declare -rx COM_WAVE_STATION_TMPL=${COM_BASE}'/products/wave/station' declare -rx COM_WAVE_GEMPAK_TMPL=${COM_BASE}'/products/wave/gempak' declare -rx COM_WAVE_WMO_TMPL=${COM_BASE}'/products/wave/wmo' diff --git a/parm/config/gfs/config.fetch b/parm/config/gfs/config.fetch new file mode 100644 index 0000000000..86ab5e3e2f --- /dev/null +++ b/parm/config/gfs/config.fetch @@ -0,0 +1,19 @@ +#! /usr/bin/env bash + +########## config.fetch ########## + +echo "BEGIN: config.fetch" + +# Get task specific resources +source "${EXPDIR}/config.resources" fetch + +# Determine start type +if [[ "${EXP_WARM_START}" == ".false." ]]; then + ic_type="cold" +else + ic_type="warm" +fi + +export FETCH_YAML_TMPL="${PARMgfs}/fetch/${NET}_${APP}_${ic_type}_${MODE}.yaml.j2" + +echo "END: config.fetch" diff --git a/parm/config/gfs/config.resources b/parm/config/gfs/config.resources index aac06ff03c..06acc4e36e 100644 --- a/parm/config/gfs/config.resources +++ b/parm/config/gfs/config.resources @@ -11,7 +11,7 @@ if (( $# != 1 )); then echo "Must specify an input task argument to set resource variables!" echo "argument can be any one of the following:" - echo "stage_ic aerosol_init" + echo "stage_ic aerosol_init fetch" echo "prep prepatmiodaobs" echo "atmanlinit atmanlvar atmanlfv3inc atmanlfinal" echo "atmensanlinit atmensanlobs atmensanlsol atmensanlletkf atmensanlfv3inc atmensanlfinal" @@ -47,11 +47,16 @@ case ${machine} in # shellcheck disable=SC2034 mem_node_max="96GB" ;; - "GAEA") + "GAEAC5") max_tasks_per_node=128 # shellcheck disable=SC2034 mem_node_max="251GB" ;; + "GAEAC6") + max_tasks_per_node=192 + # shellcheck disable=SC2034 + mem_node_max="384GB" + ;; "ORION") max_tasks_per_node=40 # shellcheck disable=SC2034 @@ -1054,7 +1059,7 @@ case ${step} in export is_exclusive=True ;; - "arch" | "earc" | "getic") + "arch" | "earc" | "getic" | "fetch") walltime="06:00:00" ntasks=1 tasks_per_node=1 diff --git a/parm/config/gfs/config.resources.GAEA b/parm/config/gfs/config.resources.GAEA deleted file mode 100644 index aa353b9302..0000000000 --- a/parm/config/gfs/config.resources.GAEA +++ /dev/null @@ -1,33 +0,0 @@ -#! /usr/bin/env bash - -# Gaea-specific job resources - -case ${step} in - "prep") - # Run on two nodes (requires ~400GB total) - tasks_per_node=7 - ;; - - "eobs") - # The number of tasks and cores used must be the same for eobs - # See https://github.com/NOAA-EMC/global-workflow/issues/2092 for details - case ${CASE} in - "C1152" | "C768" | "C384") - export tasks_per_node=50 - ;; - *) - export tasks_per_node=40 - ;; - esac - ;; - - *) - ;; - -esac - -unset memory -# shellcheck disable=SC2312 -for mem_var in $(env | grep '^memory_' | cut -d= -f1); do - unset "${mem_var}" -done diff --git a/parm/config/gfs/config.resources.GAEAC5 b/parm/config/gfs/config.resources.GAEAC5 new file mode 100644 index 0000000000..525773f036 --- /dev/null +++ b/parm/config/gfs/config.resources.GAEAC5 @@ -0,0 +1,11 @@ +#! /usr/bin/env bash + +# GaeaC5-specific job resources + +export FI_VERBS_PREFER_XRC=0 + +unset memory +# shellcheck disable=SC2312 +for mem_var in $(env | grep '^memory_' | cut -d= -f1); do + unset "${mem_var}" +done diff --git a/parm/config/gfs/config.resources.GAEAC6 b/parm/config/gfs/config.resources.GAEAC6 new file mode 100644 index 0000000000..7fc6388159 --- /dev/null +++ b/parm/config/gfs/config.resources.GAEAC6 @@ -0,0 +1,9 @@ +#! /usr/bin/env bash + +# GaeaC6-specific job resources + +unset memory +# shellcheck disable=SC2312 +for mem_var in $(env | grep '^memory_' | cut -d= -f1); do + unset "${mem_var}" +done diff --git a/parm/config/gfs/config.stage_ic b/parm/config/gfs/config.stage_ic index bb12cd3ba1..3fb0663cb7 100644 --- a/parm/config/gfs/config.stage_ic +++ b/parm/config/gfs/config.stage_ic @@ -7,7 +7,12 @@ echo "BEGIN: config.stage_ic" # Get task specific resources source "${EXPDIR}/config.resources" stage_ic -export ICSDIR="@ICSDIR@" # User provided ICSDIR; blank if not provided +if [[ "${DO_FETCH_HPSS^^}" =~ "Y" || "${DO_FETCH_LOCAL^^}" =~ "Y" ]]; then + export ICSDIR="${DATAROOT}" # fetch untars data into DATAROOT +else + export ICSDIR="@ICSDIR@" # User provided ICSDIR; blank if not provided +fi + export BASE_IC="@BASE_IC@" # Platform home for staged ICs export STAGE_IC_YAML_TMPL="${PARMgfs}/stage/master_gfs.yaml.j2" diff --git a/parm/config/gfs/config.waveawipsgridded b/parm/config/gfs/config.waveawipsgridded index 48cbfda6a7..a752c659af 100644 --- a/parm/config/gfs/config.waveawipsgridded +++ b/parm/config/gfs/config.waveawipsgridded @@ -8,6 +8,8 @@ echo "BEGIN: config.waveawipsgridded" # Get task specific resources . $EXPDIR/config.resources waveawipsgridded +export GEMPAK_GRIDS=${GEMPAK_GRIDS:-ak_10m at_10m ep_10m wc_10m glo_30m} +# export GEMPAK_GRIDS=${GEMPAK_GRIDS:-ao_9km at_10m ep_10m wc_10m glo_30m} # AWIPS output frequency export FHMAX_HF_WAV_WMO=72 export FHMAX_WAV_WMO=180 diff --git a/parm/config/gfs/config.wavegempak b/parm/config/gfs/config.wavegempak index bcbec91f07..c0f53eb1b0 100644 --- a/parm/config/gfs/config.wavegempak +++ b/parm/config/gfs/config.wavegempak @@ -8,5 +8,7 @@ echo "BEGIN: config.wavegempak" # Get task specific resources . $EXPDIR/config.resources wavegempak +#export GEMPAK_GRIDS=${GEMPAK_GRIDS:-'glo_30m at_10m ep_10m wc_10m ao_9km'} #Interpolated grids +export GEMPAK_GRIDS=${GEMPAK_GRIDS:-${waveinterpGRD:-'glo_30m'}} echo "END: config.wavegempak" diff --git a/parm/fetch/gfs_ATM_cold_forecast-only.yaml.j2 b/parm/fetch/gfs_ATM_cold_forecast-only.yaml.j2 new file mode 100755 index 0000000000..927527c760 --- /dev/null +++ b/parm/fetch/gfs_ATM_cold_forecast-only.yaml.j2 @@ -0,0 +1,16 @@ +{% set cycle_YMDH = current_cycle | to_YMDH %} +{% set cycle_YMD = current_cycle | to_YMD %} +{% set cycle_HH = current_cycle | strftime("%H") %} +{% set atm_dir = RUN + "." ~ cycle_YMD ~ "/" ~ cycle_HH ~ "/model/atmos/input" %} +target: + tarball : "{{ FETCHDIR }}/{{ cycle_YMDH }}/atm_cold.tar" + on_hpss: True + contents: + # ATM + - {{atm_dir}}/gfs_ctrl.nc + {% for ftype in ["gfs_data", "sfc_data"] %} + {% for ntile in range(1, ntiles + 1) %} + - {{atm_dir}}/{{ ftype }}.tile{{ ntile }}.nc + {% endfor %} # ntile + {% endfor %} # ftype + destination: "{{ DATAROOT }}" diff --git a/parm/fetch/gfs_S2SW_cold_forecast-only.yaml.j2 b/parm/fetch/gfs_S2SW_cold_forecast-only.yaml.j2 new file mode 100755 index 0000000000..2588b85117 --- /dev/null +++ b/parm/fetch/gfs_S2SW_cold_forecast-only.yaml.j2 @@ -0,0 +1,37 @@ +{% set cycle_YMDH = current_cycle | to_YMDH %} +{% set cycle_YMD = current_cycle | to_YMD %} +{% set cycle_HH = current_cycle | strftime("%H") %} +{% set prev_cycle_YMD = previous_cycle | to_YMD %} +{% set prev_cycle_HH = previous_cycle | strftime("%H") %} +# For cold starts, the ATM component is in the current cycle RUN.YYYYMMDD/HH +# For ocean/ice, some files are in the current cyle, some in the previous +# For waves, all files are in the previous cycle +# Previous cycles are always gdas (gdas.YYYYMMDD/HH) +{% set atm_dir = RUN + "." ~ cycle_YMD ~ "/" ~ cycle_HH ~ "/model/atmos/input" %} +{% set ocean_dir = RUN + "." ~ cycle_YMD ~ "/" ~ cycle_HH ~ "/model/ocean/restart" %} +{% set ice_dir = RUN + "." ~ cycle_YMD ~ "/" ~ cycle_HH ~ "/model/ice/restart" %} +{% set prev_ocean_dir = "gdas." ~ prev_cycle_YMD ~ "/" ~ prev_cycle_HH ~ "/model/ocean/restart" %} +{% set prev_ice_dir = "gdas." ~ prev_cycle_YMD ~ "/" ~ prev_cycle_HH ~ "/model/ice/restart" %} +{% set prev_wave_dir = "gdas." ~ prev_cycle_YMD ~ "/" ~ prev_cycle_HH ~ "/model/wave/restart" %} +{% set restart_prefix = cycle_YMD ~ "." ~ cycle_HH ~ "0000" %} +untar: + tarball : "{{ FETCHDIR }}/{{ cycle_YMDH }}/s2sw_cold.tar" + on_hpss: True + contents: + # ATM + - {{atm_dir}}/gfs_ctrl.nc + {% for ftype in ["gfs_data", "sfc_data"] %} + {% for ntile in range(1, ntiles + 1) %} + - {{atm_dir}}/{{ ftype }}.tile{{ ntile }}.nc + {% endfor %} # ntile + {% endfor %} # ftype + # Ocean + - {{ocean_dir}}/{{restart_prefix}}.MOM.res.nc + - {{prev_ocean_dir}}/{{restart_prefix}}.MOM.res.nc + # Ice + - {{ice_dir}}/{{restart_prefix}}.cice_model.res.nc + - {{prev_ice_dir}}/{{restart_prefix}}.cice_model.res.nc + # Wave + - {{prev_wave_dir}}/{{restart_prefix}}.restart.ww3 + - {{prev_wave_dir}}/{{restart_prefix}}.restart.{{waveGRD}} + destination: "{{ DATAROOT }}" diff --git a/scripts/exgfs_atmos_wafs_blending_0p25.sh b/scripts/exgfs_atmos_wafs_blending_0p25.sh deleted file mode 100755 index 293325185e..0000000000 --- a/scripts/exgfs_atmos_wafs_blending_0p25.sh +++ /dev/null @@ -1,298 +0,0 @@ -#!/bin/ksh -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: exgfs_atmos_wafs_blending_0p25.sh (copied from exgfs_atmos_wafs_blending.sh) -# Script description: This scripts looks for US and UK WAFS Grib2 products at 1/4 deg, -# wait for specified period of time, and then run $USHgfs/wafs_blending_0p25.sh -# if both WAFS data are available. Otherwise, the job aborts with error massage -# -# Author: Y Mao Org: EMC Date: 2020-04-02 -# -# -# Script history log: -# 2020-04-02 Y Mao -# Oct 2021 - Remove jlogfile -# 2022-05-25 | Y Mao | Add ICAO new milestone Nov 2023 - -set -x -echo "JOB $job HAS BEGUN" -export SEND_AWC_US_ALERT=NO -export SEND_AWC_UK_ALERT=NO -export SEND_US_WAFS=NO -export SEND_UK_WAFS=NO - -cd $DATA -export SLEEP_LOOP_MAX=`expr $SLEEP_TIME / $SLEEP_INT` - -echo "start blending US and UK WAFS products at 1/4 degree for " $cyc " z cycle" -export ffhr=$SHOUR - -export ic_uk=1 - -while test $ffhr -le $EHOUR -do - -########################## -# look for US WAFS data -########################## - - export ic=1 - while [ $ic -le $SLEEP_LOOP_MAX ] - do - if [ -s ${COMINus}/gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr}.grib2 ] ; then - break - fi - if [ $ic -eq $SLEEP_LOOP_MAX ] ; then - echo "US WAFS GRIB2 file $COMINus/gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr}.grib2 not found after waiting over $SLEEP_TIME seconds" - echo "US WAFS GRIB2 file " $COMINus/gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr}.grib2 "not found after waiting ",$SLEEP_TIME, "exitting" - SEND_UK_WAFS=YES - break - else - ic=`expr $ic + 1` - sleep $SLEEP_INT - fi - done - -########################## -# look for UK WAFS data. -########################## - - SLEEP_LOOP_MAX_UK=$SLEEP_LOOP_MAX - - # export ic=1 - while [ $ic_uk -le $SLEEP_LOOP_MAX_UK ] - do - # Three(3) unblended UK files for each cycle+fhour: icing, turb, cb - ukfiles=`ls $COMINuk/EGRR_WAFS_0p25_*_unblended_${PDY}_${cyc}z_t${ffhr}.grib2 | wc -l` - if [ $ukfiles -ge 3 ] ; then - break - fi - - if [ $ic_uk -eq $SLEEP_LOOP_MAX_UK ] ; then - echo "UK WAFS GRIB2 file $COMINuk/EGRR_WAFS_0p25_*_unblended_${PDY}_${cyc}z_t${ffhr}.grib2 not found" - echo "UK WAFS GRIB2 file " $COMINuk/EGRR_WAFS_0p25_*_unblended_${PDY}_${cyc}z_t${ffhr}.grib2 " not found" - export SEND_US_WAFS=YES - break - else - ic_uk=`expr $ic_uk + 1` - sleep $SLEEP_INT - fi - done - -########################## -# If both UK and US data are missing. -########################## - - if [ $SEND_UK_WAFS = 'YES' -a $SEND_US_WAFS = 'YES' ] ; then - SEND_US_WAFS=NO - SEND_UK_WAFS=NO - echo "BOTH UK and US data are missing, no blended for $PDY$cyc$ffhr" - export err=1; err_chk - continue - fi - -########################## -# Blending or unblended -########################## - - if [ $SEND_US_WAFS = 'YES' ] ; then - echo "turning back on dbn alert for unblended US WAFS product" - elif [ $SEND_UK_WAFS = 'YES' ] ; then - echo "turning back on dbn alert for unblended UK WAFS product" - # retrieve UK products - # Three(3) unblended UK files for each cycle+fhour: icing, turb, cb - cat $COMINuk/EGRR_WAFS_0p25_*_unblended_${PDY}_${cyc}z_t${ffhr}.grib2 > EGRR_WAFS_0p25_unblended_${PDY}_${cyc}z_t${ffhr}.grib2 - else # elif [ $SEND_US_WAFS = "NO" -a $SEND_UK_WAFS = "NO" ] ; then - # retrieve UK products - # Three(3) unblended UK files for each cycle+fhour: icing, turb, cb - cat $COMINuk/EGRR_WAFS_0p25_*_unblended_${PDY}_${cyc}z_t${ffhr}.grib2 > EGRR_WAFS_0p25_unblended_${PDY}_${cyc}z_t${ffhr}.grib2 - - # pick up US data - cp ${COMINus}/gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr}.grib2 . - - # run blending code - export pgm=wafs_blending_0p25.x - . prep_step - - startmsg - $EXECgfs/$pgm gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr}.grib2 \ - EGRR_WAFS_0p25_unblended_${PDY}_${cyc}z_t${ffhr}.grib2 \ - 0p25_blended_${PDY}${cyc}f${ffhr}.grib2 > f${ffhr}.out - - err1=$? - if test "$err1" -ne 0 - then - echo "WAFS blending 0p25 program failed at " ${PDY}${cyc}F${ffhr} " turning back on dbn alert for unblended US WAFS product" - SEND_US_WAFS=YES - fi - fi - -########################## -# Date dissemination -########################## - - if [ $SEND_US_WAFS = "YES" ] ; then - - ############################################################################################## - # - # checking any US WAFS product was sent due to No UK WAFS GRIB2 file or WAFS blending program - # (Alert once for all forecast hours) - # - if [ $SEND_AWC_US_ALERT = "NO" ] ; then - echo "WARNING! No UK WAFS GRIB2 0P25 file for WAFS blending. Send alert message to AWC ......" - make_NTC_file.pl NOXX10 KKCI $PDY$cyc NONE $FIXgfs/wafs_blending_0p25_admin_msg $PCOM/wifs_0p25_admin_msg - make_NTC_file.pl NOXX10 KWBC $PDY$cyc NONE $FIXgfs/wafs_blending_0p25_admin_msg $PCOM/iscs_0p25_admin_msg - if [ $SENDDBN_NTC = "YES" ] ; then - $DBNROOT/bin/dbn_alert NTC_LOW WAFS $job $PCOM/wifs_0p25_admin_msg - $DBNROOT/bin/dbn_alert NTC_LOW WAFS $job $PCOM/iscs_0p25_admin_msg - fi - - if [ $envir != prod ]; then - export maillist='nco.spa@noaa.gov' - fi - export maillist=${maillist:-'nco.spa@noaa.gov,ncep.sos@noaa.gov'} - export subject="WARNING! No UK WAFS GRIB2 0P25 file for WAFS blending, $PDY t${cyc}z $job" - echo "*************************************************************" > mailmsg - echo "*** WARNING! No UK WAFS GRIB2 0P25 file for WAFS blending ***" >> mailmsg - echo "*************************************************************" >> mailmsg - echo >> mailmsg - echo "Send alert message to AWC ...... " >> mailmsg - echo >> mailmsg - cat mailmsg > $COMOUT/${RUN}.t${cyc}z.wafs_blend_0p25_usonly.emailbody - cat $COMOUT/${RUN}.t${cyc}z.wafs_blend_0p25_usonly.emailbody | mail.py -s "$subject" $maillist -v - - export SEND_AWC_US_ALERT=YES - fi - ############################################################################################## - # - # Distribute US WAFS unblend Data to NCEP FTP Server (WOC) and TOC - # - echo "altering the unblended US WAFS products - $COMINus/gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr}.grib2 " - echo "and $COMINus/gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr}.grib2.idx " - - if [ $SENDDBN = "YES" ] ; then - $DBNROOT/bin/dbn_alert MODEL GFS_WAFS_0P25_UBL_GB2 $job $COMINus/gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr}.grib2 - $DBNROOT/bin/dbn_alert MODEL GFS_WAFS_0P25_UBL_GB2_WIDX $job $COMINus/gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr}.grib2.idx - fi - -# if [ $SENDDBN_NTC = "YES" ] ; then -# $DBNROOT/bin/dbn_alert NTC_LOW $NET $job $COMOUT/gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr}.grib2 -# fi - - - export SEND_US_WAFS=NO - - elif [ $SEND_UK_WAFS = "YES" ] ; then - ############################################################################################## - # - # checking any UK WAFS product was sent due to No US WAFS GRIB2 file - # (Alert once for all forecast hours) - # - if [ $SEND_AWC_UK_ALERT = "NO" ] ; then - echo "WARNING: No US WAFS GRIB2 0P25 file for WAFS blending. Send alert message to AWC ......" - make_NTC_file.pl NOXX10 KKCI $PDY$cyc NONE $FIXgfs/wafs_blending_0p25_admin_msg $PCOM/wifs_0p25_admin_msg - make_NTC_file.pl NOXX10 KWBC $PDY$cyc NONE $FIXgfs/wafs_blending_0p25_admin_msg $PCOM/iscs_0p25_admin_msg - if [ $SENDDBN_NTC = "YES" ] ; then - $DBNROOT/bin/dbn_alert NTC_LOW WAFS $job $PCOM/wifs_0p25_admin_msg - $DBNROOT/bin/dbn_alert NTC_LOW WAFS $job $PCOM/iscs_0p25_admin_msg - fi - - if [ $envir != prod ]; then - export maillist='nco.spa@noaa.gov' - fi - export maillist=${maillist:-'nco.spa@noaa.gov,ncep.sos@noaa.gov'} - export subject="WARNING! No US WAFS GRIB2 0P25 file for WAFS blending, $PDY t${cyc}z $job" - echo "*************************************************************" > mailmsg - echo "*** WARNING! No US WAFS GRIB2 0P25 file for WAFS blending ***" >> mailmsg - echo "*************************************************************" >> mailmsg - echo >> mailmsg - echo "Send alert message to AWC ...... " >> mailmsg - echo >> mailmsg - cat mailmsg > $COMOUT/${RUN}.t${cyc}z.wafs_blend_0p25_ukonly.emailbody - cat $COMOUT/${RUN}.t${cyc}z.wafs_blend_0p25_ukonly.emailbody | mail.py -s "$subject" $maillist -v - - export SEND_AWC_UK_ALERT=YES - fi - ############################################################################################## - # - # Distribute UK WAFS unblend Data to NCEP FTP Server (WOC) and TOC - # - echo "altering the unblended UK WAFS products - EGRR_WAFS_0p25_unblended_${PDY}_${cyc}z_t${ffhr}.grib2" - - if [ $SENDDBN = "YES" ] ; then - $DBNROOT/bin/dbn_alert MODEL GFS_WAFS_UKMET_0P25_UBL_GB2 $job EGRR_WAFS_0p25_unblended_${PDY}_${cyc}z_t${ffhr}.grib2 - fi - -# if [ $SENDDBN_NTC = "YES" ] ; then -# $DBNROOT/bin/dbn_alert NTC_LOW $NET $job EGRR_WAFS_0p25_unblended_${PDY}_${cyc}z_t${ffhr}.grib2 -# fi - export SEND_UK_WAFS=NO - - - else - ############################################################################################## - # - # TOCGRIB2 Processing WAFS Blending GRIB2 (Icing, CB, GTG) - - # As in August 2020, no WMO header is needed for WAFS data at 1/4 deg - ## . prep_step - ## export pgm=$TOCGRIB2 - ## startmsg - - ## export FORT11=0p25_blended_${PDY}${cyc}f${ffhr}.grib2 - ## export FORT31=" " - ## export FORT51=grib2.t${cyc}z.WAFS_0p25_blended_f${ffhr} - - ## $TOCGRIB2 < $FIXgfs/grib2_blended_wafs_wifs_f${ffhr}.0p25 >> $pgmout 2> errfile - - ## err=$?;export err ;err_chk - ## echo " error from tocgrib=",$err - - ############################################################################################## - # - # Distribute US WAFS unblend Data to NCEP FTP Server (WOC) and TOC - # - if [ $SENDCOM = YES ]; then - cp 0p25_blended_${PDY}${cyc}f${ffhr}.grib2 $COMOUT/WAFS_0p25_blended_${PDY}${cyc}f${ffhr}.grib2 - ## cp grib2.t${cyc}z.WAFS_0p25_blended_f${ffhr} $PCOM/grib2.t${cyc}z.WAFS_0p25_blended_f${ffhr} - fi - - if [ $SENDDBN_NTC = "YES" ] ; then - # Distribute Data to NCEP FTP Server (WOC) and TOC - echo "No WMO header yet" - ## $DBNROOT/bin/dbn_alert NTC_LOW $NET $job $PCOM/grib2.t${cyc}z.WAFS_0p25_blended_f${ffhr} - fi - - if [ $SENDDBN = "YES" ] ; then - $DBNROOT/bin/dbn_alert MODEL GFS_WAFS_0P25_BL_GB2 $job $COMOUT/WAFS_0p25_blended_${PDY}${cyc}f${ffhr}.grib2 - fi - fi - -########################## -# Next loop -########################## - - echo "$PDY$cyc$ffhr" > $COMOUT/${RUN}.t${cyc}z.control.wafsblending_0p25 - - if [ $FHOUT_GFS -eq 3 ] ; then - FHINC=03 - else - if [ $ffhr -lt 24 ] ; then - FHINC=01 - else - FHINC=03 - fi - fi - - ffhr=`expr $ffhr + $FHINC` - if test $ffhr -lt 10 - then - ffhr=0${ffhr} - fi - -done -################################################################################ - -exit 0 -# diff --git a/scripts/exgfs_atmos_wafs_gcip.sh b/scripts/exgfs_atmos_wafs_gcip.sh deleted file mode 100755 index 98e367e5f9..0000000000 --- a/scripts/exgfs_atmos_wafs_gcip.sh +++ /dev/null @@ -1,242 +0,0 @@ -#!/bin/ksh -###################################################################### -# UTILITY SCRIPT NAME : exgfs_atmos_wafs_gcip.sh -# DATE WRITTEN : 01/28/2015 -# -# Abstract: This utility script produces the WAFS GCIP. -# -# GCIP runs f00 f03 for each cycle, 4 times/day, -# to make the output valid every 3 hours -# -# History: 01/28/2015 -# - GFS post master file as first guess -# /com/prod/gfs.YYYYMMDD -# - Nesdis composite global satellite data -# /dcom (ftp?) -# - Metar/ships/lightning/pireps -# ksh /nwprod/ush/dumpjb YYYYMMDDHH hours output >/dev/null -# - Radar data over CONUS -# /com/hourly/prod/radar.YYYYMMDD/refd3d.tHHz.grbf00 -# - output of current icing potential -##################################################################### -echo "-----------------------------------------------------" -echo "JGFS_ATMOS_WAFS_GCIP at 00Z/06Z/12Z/18Z GFS postprocessing" -echo "-----------------------------------------------------" -echo "History: 2015 - First implementation of this new script." -echo "Oct 2021 - Remove jlogfile" -echo " " -##################################################################### - -set -xa - -# Set up working dir for parallel runs based on ffhr -ffhr=$1 -DATA=$DATA/$ffhr -mkdir -p $DATA -cd $DATA -# Overwrite TMPDIR for dumpjb -export TMPDIR=$DATA - -SLEEP_LOOP_MAX=`expr $SLEEP_TIME / $SLEEP_INT` - -configFile=gcip.config - -echo 'before preparing data' `date` - -# valid time. no worry, it won't be across to another date -vhour=$(( $ffhr + $cyc )) -vhour="$(printf "%02d" $(( 10#$vhour )) )" - -######################################################## -# Preparing data - -if [ $RUN = "gfs" ] ; then - - # model data - masterFile=$COMINgfs/gfs.t${cyc}z.master.grb2f$ffhr - - # check the availability of model file - icnt=1 - while [ $icnt -lt $SLEEP_LOOP_MAX ] ; do - if [ -s $masterFile ] ; then - break - fi - sleep $SLEEP_INT - icnt=$((icnt + 1)) - if [ $icnt -ge $SLEEP_LOOP_MAX ] ; then - msg="ABORTING after $SLEEP_TIME seconds of waiting for gfs master file!" - err_exit $msg - fi - done - - cpreq $PARMgfs/wafs_gcip_gfs.cfg $configFile - - modelFile=modelfile.grb -# ${NLN} $masterFile $modelFile - $WGRIB2 $masterFile | egrep ":HGT:|:VVEL:|:CLMR:|:TMP:|:SPFH:|:RWMR:|:SNMR:|:GRLE:|:ICMR:|:RH:" | egrep "00 mb:|25 mb:|50 mb:|75 mb:|:HGT:surface" | $WGRIB2 -i $masterFile -grib $modelFile - - # metar / ships / lightning / pireps - # dumped data files' suffix is ".ibm" - obsfiles="metar ships ltngsr pirep" - for obsfile in $obsfiles ; do -# ksh $USHobsproc_dump/dumpjb ${PDY}${vhour} 1.5 $obsfile >/dev/null - ksh $DUMPJB ${PDY}${vhour} 1.5 $obsfile - done - metarFile=metar.ibm - shipFile=ships.ibm - lightningFile=ltngsr.ibm - pirepFile=pirep.ibm - - satFiles="" - channels="VIS SIR LIR SSR" - # If one channel is missing, satFiles will be empty - for channel in $channels ; do - satFile=GLOBCOMP$channel.${PDY}${vhour} - if [[ $COMINsat == *ftp:* ]] ; then - curl -O $COMINsat/$satFile - else - - # check the availability of satellite data file - icnt=1 - while [ $icnt -lt $SLEEP_LOOP_MAX ] ; do - if [ -s $COMINsat/$satFile ] ; then - break - fi - sleep $SLEEP_INT - icnt=$((icnt + 1)) - if [ $icnt -ge $SLEEP_LOOP_MAX ] ; then - msg="GCIP at ${vhour}z ABORTING after $SLEEP_TIME seconds of waiting for satellite $channel file!" - echo "$msg" - rc=1 - echo $msg >> $COMOUT/${RUN}.gcip.log - - if [ $envir != prod ]; then - export maillist='nco.spa@noaa.gov' - fi - export maillist=${maillist:-'nco.spa@noaa.gov,ncep.sos@noaa.gov'} - - export subject="Missing GLOBCOMPVIS Satellite Data for $PDY t${cyc}z $job" - echo "*************************************************************" > mailmsg - echo "*** WARNING !! COULD NOT FIND GLOBCOMPVIS Satellite Data *** " >> mailmsg - echo "*************************************************************" >> mailmsg - echo >> mailmsg - echo "One or more GLOBCOMPVIS Satellite Data files are missing, including " >> mailmsg - echo " $COMINsat/$satFile " >> mailmsg - echo >> mailmsg - echo "$job will gracfully exited" >> mailmsg - cat mailmsg > $COMOUT/${RUN}.t${cyc}z.gcip.emailbody - cat $COMOUT/${RUN}.t${cyc}z.gcip.emailbody | mail.py -s "$subject" $maillist -v - - exit $rc - fi - done - - cp $COMINsat/$satFile . - fi - if [[ -s $satFile ]] ; then - satFiles="$satFiles $satFile" - else - satFiles="" - break - fi - done - - # radar data - sourceRadar=$COMINradar/refd3d.t${vhour}z.grb2f00 - - # check the availability of radar data file - icnt=1 - while [ $icnt -lt $SLEEP_LOOP_MAX ] ; do - if [ -s $sourceRadar ] ; then - break - fi - sleep $SLEEP_INT - icnt=$((icnt + 1)) - if [ $icnt -ge $SLEEP_LOOP_MAX ] ; then - echo "WARNING: radar data is not available after $SLEEP_TIME seconds of waiting!" - fi - done - - radarFile=radarFile.grb - if [ -s $sourceRadar ] ; then - cp $sourceRadar $radarFile - fi - - fi # RUN model name - -######################################################## -# Composite gcip command options - -outputfile=gfs.t${vhour}z.gcip.f00.grib2 - -cmdoptions="-t ${PDY}${vhour} -c $configFile -model $modelFile" -if [[ -s $metarFile ]] ; then - cmdoptions="$cmdoptions -metar $metarFile" -else - err_exit "There are no METAR observations." -fi -if [[ -s $shipFile ]] ; then - cmdoptions="$cmdoptions -ship $shipFile" -fi -# empty if a channel data is missing -if [[ -n $satFiles ]] ; then - cmdoptions="$cmdoptions -sat $satFiles" -else - err_exit "Satellite data are not available or completed." -fi -if [[ -s $lightningFile ]] ; then - cmdoptions="$cmdoptions -lightning $lightningFile" -fi -if [[ -s $pirepFile ]] ; then - cmdoptions="$cmdoptions -pirep $pirepFile" -fi -if [[ -s $radarFile ]] ; then - cmdoptions="$cmdoptions -radar $radarFile" -fi -cmdoptions="$cmdoptions -o $outputfile" - -####################################################### -# Run GCIP - -echo 'after preparing data' `date` - -export pgm=wafs_gcip.x - -cpreq $FIXgfs/gcip_near_ir_refl.table near_ir_refl.table - -startmsg -$EXECgfs/$pgm >> $pgmout $cmdoptions 2> errfile & -wait -export err=$?; err_chk - - -if [[ -s $outputfile ]] ; then - ############################## - # Post Files to COM - ############################## - if [ $SENDCOM = "YES" ] ; then - cp $outputfile $COMOUT/$outputfile - if [ $SENDDBN = "YES" ] ; then - # $DBNROOT/bin/dbn_alert GFS_WAFS GCIP $job $COMOUT/$outputfile -#alert removed in v15.0 $DBNROOT/bin/dbn_alert MODEL GFS_WAFS_GCIP $job $COMOUT/$outputfile - : - fi - fi -else - err_exit "Output $outputfile was not generated" -fi - - -################################################################################ -# GOOD RUN -set +x -echo "**************JOB EXGFS_ATMOS_WAFS_GCIP.SH COMPLETED NORMALLY ON THE IBM" -echo "**************JOB EXGFS_ATMOS_WAFS_GCIP.SH COMPLETED NORMALLY ON THE IBM" -echo "**************JOB EXGFS_ATMOS_WAFS_GCIP.SH COMPLETED NORMALLY ON THE IBM" -set -x -################################################################################ - -exit 0 - -############## END OF SCRIPT ####################### - diff --git a/scripts/exgfs_atmos_wafs_grib.sh b/scripts/exgfs_atmos_wafs_grib.sh deleted file mode 100755 index e81f0e99da..0000000000 --- a/scripts/exgfs_atmos_wafs_grib.sh +++ /dev/null @@ -1,146 +0,0 @@ -#!/bin/sh -###################################################################### -# UTILITY SCRIPT NAME : exgfs_atmos_wafs_grib.sh -# DATE WRITTEN : 10/04/2004 -# -# Abstract: This utility script produces the WAFS GRIB -# -# Input: 1 arguments are passed to this script. -# 1st argument - Forecast Hour - format of 2I -# -# Logic: If we are processing fcsthrss 12-30, we have the -# added variable of the a or b in the process accordingly. -# The other fcsthrss, the a or b is dropped. -# -##################################################################### -echo "------------------------------------------------" -echo "JWAFS_00/06/12/18 GFS postprocessing" -echo "------------------------------------------------" -echo "History: OCT 2004 - First implementation of this new script." -echo " Aug 2015 - Modified for Phase II" -echo " Dec 2015 - Modified for input model data in Grib2" -echo " Oct 2021 - Remove jlogfile" -echo " " -##################################################################### -set +x -fcsthrs_list="$1" -num=$# - -if test "$num" -ge 1 -then - echo " Appropriate number of arguments were passed" - set -x - export DBNALERT_TYPE=${DBNALERT_TYPE:-GRIB} -# export job=${job:-interactive} -else - echo "" - echo "Usage: exgfs_atmos_wafs_grib.sh \$fcsthrs " - echo "" - exit 16 -fi - -cd $DATA - -set -x - -# To fix bugzilla 628 ( removing 'j' ahead of $job ) -export jobsuffix=gfs_atmos_wafs_f${fcsthrs}_$cyc - -############################################### -# Wait for the availability of the pgrib file -############################################### -# file name and forecast hour of GFS model data in Grib2 are 3 digits -export fcsthrs000="$(printf "%03d" $(( 10#$fcsthrs )) )" -icnt=1 -while [ $icnt -lt 1000 ] -do -# if [ -s $COMIN/${RUN}.${cycle}.pgrbf$fcsthrs ] - if [ -s $COMIN/${RUN}.${cycle}.pgrb2.1p00.f$fcsthrs000 ] - then - break - fi - - sleep 10 - icnt=$((icnt + 1)) - if [ $icnt -ge 180 ] - then - msg="ABORTING after 30 min of waiting for the pgrib filei!" - err_exit $msg - fi -done - -######################################## -echo "HAS BEGUN!" -######################################## - -echo " ------------------------------------------" -echo " BEGIN MAKING GFS WAFS PRODUCTS" -echo " ------------------------------------------" - -#################################################### -# -# GFS WAFS PRODUCTS MUST RUN IN CERTAIN ORDER -# BY REQUIREMENT FROM FAA. -# PLEASE DO NOT ALTER ORDER OF PROCESSING WAFS -# PRODUCTS CONSULTING WITH MR. BRENT GORDON. -# -#################################################### - -set +x -echo " " -echo "#####################################" -echo " Process GRIB WAFS PRODUCTS (mkwafs)" -echo " FORECAST HOURS 00 - 72." -echo "#####################################" -echo " " -set -x - -if test $fcsthrs -eq 0 -then - echo " " -fi - -# If we are processing fcsthrss 12-30, we have the -# added variable of the a or b in the process. -# The other fcsthrss, the a or b is dropped. - -if test $fcsthrs -ge 12 -a $fcsthrs -le 24 -then - sh $USHgfs/wafs_mkgbl.sh ${fcsthrs} a -fi - -if test $fcsthrs -eq 30 -then - sh $USHgfs/wafs_mkgbl.sh ${fcsthrs} a - for fcsthrs in 12 18 24 30 - do - sh $USHgfs/wafs_mkgbl.sh ${fcsthrs} b - done - sh $USHgfs/wafs_mkgbl.sh 00 x - sh $USHgfs/wafs_mkgbl.sh 06 x -fi - -if test $fcsthrs -gt 30 -a $fcsthrs -le 48 -then - sh $USHgfs/wafs_mkgbl.sh ${fcsthrs} x -fi - -if test $fcsthrs -eq 60 -o $fcsthrs -eq 72 -then - sh $USHgfs/wafs_mkgbl.sh ${fcsthrs} x -fi - -################################################################################ -# GOOD RUN -set +x -echo "**************JOB EXGFS_ATMOS_WAFS_GRIB.SH COMPLETED NORMALLY ON THE IBM" -echo "**************JOB EXGFS_ATMOS_WAFS_GRIB.SH COMPLETED NORMALLY ON THE IBM" -echo "**************JOB EXGFS_ATMOS_WAFS_GRIB.SH COMPLETED NORMALLY ON THE IBM" -set -x -################################################################################ - -echo "HAS COMPLETED NORMALLY!" - -exit 0 - -############## END OF SCRIPT ####################### diff --git a/scripts/exgfs_atmos_wafs_grib2.sh b/scripts/exgfs_atmos_wafs_grib2.sh deleted file mode 100755 index 4631a10d8c..0000000000 --- a/scripts/exgfs_atmos_wafs_grib2.sh +++ /dev/null @@ -1,227 +0,0 @@ -#!/bin/sh -###################################################################### -# UTILITY SCRIPT NAME : exgfs_atmos_wafs_grib2.sh -# DATE WRITTEN : 07/15/2009 -# -# Abstract: This utility script produces the WAFS GRIB2. The output -# GRIB files are posted on NCEP ftp server and the grib2 files -# are pushed via dbnet to TOC to WAFS (ICSC). -# This is a joint project of WAFC London and WAFC Washington. -# -# We are processing WAFS grib2 for fcsthrs from 06 - 36 -# with 3-hour time increment. -# -# History: 08/20/2014 -# - ingest master file in grib2 (or grib1 if grib2 fails) -# - output of icng tcld cat cb are in grib2 -# 02/21/2020 -# - Prepare unblended icing severity and GTG tubulence -# for blending at 0.25 degree -# 02/22/2022 -# - Add grib2 data requested by FAA -# - Stop generating grib1 data for WAFS -##################################################################### -echo "-----------------------------------------------------" -echo "JGFS_ATMOS_WAFS_GRIB2 at 00Z/06Z/12Z/18Z GFS postprocessing" -echo "-----------------------------------------------------" -echo "History: AUGUST 2009 - First implementation of this new script." -echo "Oct 2021 - Remove jlogfile" -echo "Feb 2022 - Add FAA data, stop grib1 data" -echo " " -##################################################################### - -set -x - -fcsthrs=$1 - -DATA=$DATA/$fcsthrs -mkdir -p $DATA -cd $DATA - -########################################################## -# Wait for the availability of the gfs master pgrib file -########################################################## -# file name and forecast hour of GFS model data in Grib2 are 3 digits -export fcsthrs000="$(printf "%03d" $(( 10#$fcsthrs )) )" - -# 2D data -master2=$COMIN/${RUN}.${cycle}.master.grb2f${fcsthrs000} -master2i=$COMIN/${RUN}.${cycle}.master.grb2if${fcsthrs000} -# 3D data -wafs2=$COMIN/${RUN}.${cycle}.wafs.grb2f${fcsthrs000} -wafs2i=$COMIN/${RUN}.${cycle}.wafs.grb2f${fcsthrs000}.idx -# 3D data (on ICAO standard level) -icao2=$COMIN/${RUN}.${cycle}.wafs_icao.grb2f${fcsthrs000} -icao2i=$COMIN/${RUN}.${cycle}.wafs_icao.grb2f${fcsthrs000}.idx - -icnt=1 -while [ $icnt -lt 1000 ] -do - if [[ -s $master2i && -s $wafs2i ]] ; then - break - fi - - sleep 10 - icnt=$((icnt + 1)) - if [ $icnt -ge 180 ] ; then - msg="ABORTING after 30 min of waiting for the gfs master and wafs file!" - err_exit $msg - fi -done - -######################################## -echo "HAS BEGUN!" -######################################## - -echo " ------------------------------------------" -echo " BEGIN MAKING GFS WAFS GRIB2 PRODUCTS" -echo " ------------------------------------------" - -set +x -echo " " -echo "#####################################" -echo " Process GRIB WAFS PRODUCTS " -echo " FORECAST HOURS 06 - 36." -echo "#####################################" -echo " " -set -x - - -if [ $fcsthrs -le 36 -a $fcsthrs -gt 0 ] ; then - wafs_timewindow=yes -else - wafs_timewindow=no -fi - -#--------------------------- -# 1) Grib2 data for FAA -#--------------------------- -$WGRIB2 $master2 | grep -F -f $FIXgfs/grib2_gfs_awf_master.list | $WGRIB2 -i $master2 -grib tmpfile_gfsf${fcsthrs} -# F006 master file has two records of 0-6 hour APCP and ACPCP each, keep only one -# FAA APCP ACPCP: included every 6 forecast hour (0, 48], every 12 forest hour [48, 72] (controlled by $FIXgfs/grib2_gfs_awf_master3d.list) -if [ $fcsthrs -eq 6 ] ; then - $WGRIB2 tmpfile_gfsf${fcsthrs} -not "(APCP|ACPCP)" -grib tmp.grb2 - $WGRIB2 tmpfile_gfsf${fcsthrs} -match APCP -append -grib tmp.grb2 -quit - $WGRIB2 tmpfile_gfsf${fcsthrs} -match ACPCP -append -grib tmp.grb2 -quit - mv tmp.grb2 tmpfile_gfsf${fcsthrs} -fi -# U V will have the same grid message number by using -ncep_uv. -# U V will have the different grid message number without -ncep_uv. -$WGRIB2 tmpfile_gfsf${fcsthrs} \ - -set master_table 6 \ - -new_grid_winds earth -set_grib_type jpeg \ - -new_grid_interpolation bilinear -if ":(UGRD|VGRD):max wind" -new_grid_interpolation neighbor -fi \ - -new_grid latlon 0:288:1.25 90:145:-1.25 gfs.t${cyc}z.awf_grb45f${fcsthrs}.grib2 -$WGRIB2 -s gfs.t${cyc}z.awf_grb45f${fcsthrs}.grib2 > gfs.t${cyc}z.awf_grb45f${fcsthrs}.grib2.idx - -# For FAA, add WMO header. The header is different from WAFS -export pgm=$TOCGRIB2 -. prep_step -startmsg -export FORT11=gfs.t${cyc}z.awf_grb45f${fcsthrs}.grib2 -export FORT31=" " -export FORT51=grib2.t${cyc}z.awf_grbf${fcsthrs}.45 -$TOCGRIB2 < $FIXgfs/grib2_gfs_awff${fcsthrs}.45 >> $pgmout 2> errfile -err=$?;export err ;err_chk -echo " error from tocgrib=",$err - -if [ $wafs_timewindow = 'yes' ] ; then -#--------------------------- -# 2) traditional WAFS fields -#--------------------------- - # 3D data from $wafs2, on exact model pressure levels - $WGRIB2 $wafs2 | grep -F -f $FIXgfs/grib2_gfs_wafs_wafsmaster.list | $WGRIB2 -i $wafs2 -grib tmpfile_gfsf${fcsthrs} - # 2D data from $master2 - tail -5 $FIXgfs/grib2_gfs_wafs_wafsmaster.list > grib2_gfs_wafs_wafsmaster.list.2D - $WGRIB2 $master2 | grep -F -f grib2_gfs_wafs_wafsmaster.list.2D | $WGRIB2 -i $master2 -grib tmpfile_gfsf${fcsthrs}.2D - # Complete list of WAFS data - cat tmpfile_gfsf${fcsthrs}.2D >> tmpfile_gfsf${fcsthrs} - # WMO header - cp $FIXgfs/grib2_gfs_wafsf${fcsthrs}.45 wafs_wmo_header45 - # U V will have the same grid message number by using -ncep_uv. - # U V will have the different grid message number without -ncep_uv. - $WGRIB2 tmpfile_gfsf${fcsthrs} \ - -set master_table 6 \ - -new_grid_winds earth -set_grib_type jpeg \ - -new_grid_interpolation bilinear -if ":(UGRD|VGRD):max wind" -new_grid_interpolation neighbor -fi \ - -new_grid latlon 0:288:1.25 90:145:-1.25 gfs.t${cyc}z.wafs_grb45f${fcsthrs}.grib2 - $WGRIB2 -s gfs.t${cyc}z.wafs_grb45f${fcsthrs}.grib2 > gfs.t${cyc}z.wafs_grb45f${fcsthrs}.grib2.idx - - # For WAFS, add WMO header. Processing WAFS GRIB2 grid 45 for ISCS and WIFS - export pgm=$TOCGRIB2 - . prep_step - startmsg - export FORT11=gfs.t${cyc}z.wafs_grb45f${fcsthrs}.grib2 - export FORT31=" " - export FORT51=grib2.t${cyc}z.wafs_grbf${fcsthrs}.45 - $TOCGRIB2 < wafs_wmo_header45 >> $pgmout 2> errfile - err=$?;export err ;err_chk - echo " error from tocgrib=",$err - -fi # wafs_timewindow - -if [ $SENDCOM = "YES" ] ; then - - ############################## - # Post Files to COM - ############################## - - # FAA data - mv gfs.t${cyc}z.awf_grb45f${fcsthrs}.grib2 $COMOUT/gfs.t${cyc}z.awf_grb45f${fcsthrs}.grib2 - mv gfs.t${cyc}z.awf_grb45f${fcsthrs}.grib2.idx $COMOUT/gfs.t${cyc}z.awf_grb45f${fcsthrs}.grib2.idx - - # WAFS data - if [ $wafs_timewindow = 'yes' ] ; then - mv gfs.t${cyc}z.wafs_grb45f${fcsthrs}.grib2 $COMOUT/gfs.t${cyc}z.wafs_grb45f${fcsthrs}.grib2 - mv gfs.t${cyc}z.wafs_grb45f${fcsthrs}.grib2.idx $COMOUT/gfs.t${cyc}z.wafs_grb45f${fcsthrs}.grib2.idx - fi - - ############################## - # Post Files to PCOM - ############################## - - mv grib2.t${cyc}z.awf_grbf${fcsthrs}.45 $PCOM/grib2.t${cyc}z.awf_grbf${fcsthrs}.45 - - if [ $wafs_timewindow = 'yes' ] ; then - mv grib2.t${cyc}z.wafs_grbf${fcsthrs}.45 $PCOM/grib2.t${cyc}z.wafs_grbf${fcsthrs}.45 - fi -fi - -###################### -# Distribute Data -###################### - -if [ $SENDDBN = "YES" ] ; then - -# -# Distribute Data to WOC -# - if [ $wafs_timewindow = 'yes' ] ; then - $DBNROOT/bin/dbn_alert MODEL GFS_WAFS_1P25_GB2 $job $COMOUT/gfs.t${cyc}z.wafs_grb45f${fcsthrs}.grib2 -# -# Distribute Data to TOC TO WIFS FTP SERVER (AWC) -# - $DBNROOT/bin/dbn_alert NTC_LOW $NET $job $PCOM/grib2.t${cyc}z.wafs_grbf${fcsthrs}.45 - fi -# -# Distribute data to FAA -# - $DBNROOT/bin/dbn_alert NTC_LOW $NET $job $PCOM/grib2.t${cyc}z.awf_grbf${fcsthrs}.45 - - -fi - -################################################################################ -# GOOD RUN -set +x -echo "**************JOB EXGFS_ATMOS_WAFS_GRIB2.SH COMPLETED NORMALLY ON THE IBM" -echo "**************JOB EXGFS_ATMOS_WAFS_GRIB2.SH COMPLETED NORMALLY ON THE IBM" -echo "**************JOB EXGFS_ATMOS_WAFS_GRIB2.SH COMPLETED NORMALLY ON THE IBM" -set -x -################################################################################ - -echo "HAS COMPLETED NORMALLY!" - -exit 0 - -############## END OF SCRIPT ####################### diff --git a/scripts/exgfs_atmos_wafs_grib2_0p25.sh b/scripts/exgfs_atmos_wafs_grib2_0p25.sh deleted file mode 100755 index ec53966430..0000000000 --- a/scripts/exgfs_atmos_wafs_grib2_0p25.sh +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/sh -###################################################################### -# UTILITY SCRIPT NAME : exgfs_atmos_wafs_grib2_0p25.sh -# DATE WRITTEN : 03/20/2020 -# -# Abstract: This utility script produces the WAFS GRIB2 at 0.25 degree. -# The output GRIB files are posted on NCEP ftp server and the -# grib2 files are pushed via dbnet to TOC to WAFS (ICSC). -# This is a joint project of WAFC London and WAFC Washington. -# -# We are processing WAFS grib2 for ffhr: -# hourly: 006 - 024 -# 3 hour: 027 - 048 -# 6 hour: 054 - 120 (for U/V/T/RH, not for turbulence/icing/CB) -# -# History: -##################################################################### -echo "-----------------------------------------------------" -echo "JGFS_ATMOS_WAFS_GRIB2_0P25 at 00Z/06Z/12Z/18Z GFS postprocessing" -echo "-----------------------------------------------------" -echo "History: MARCH 2020 - First implementation of this new script." -echo "Oct 2021 - Remove jlogfile" -echo "Aug 2022 - ffhr expanded from 36 to 120" -echo " " -##################################################################### - -cd $DATA - -set -x - - -ffhr=$1 -export ffhr="$(printf "%03d" $(( 10#$ffhr )) )" -export ffhr2="$(printf "%02d" $(( 10#$ffhr )) )" - -DATA=$DATA/$ffhr -mkdir -p $DATA -cd $DATA - - -if [ $ffhr -le 48 ] ; then - hazard_timewindow=yes -else - hazard_timewindow=no -fi - - -########################################################## -# Wait for the availability of the gfs WAFS file -########################################################## - -# 3D data (on new ICAO model pressure levels) and 2D data (CB) -wafs2=$COMIN/${RUN}.${cycle}.wafs.grb2f${ffhr} -wafs2i=$COMIN/${RUN}.${cycle}.wafs.grb2f${ffhr}.idx - -# 2D data from master file (U/V/H on max wind level, T/H at tropopause) -master2=$COMIN/${RUN}.${cycle}.master.grb2f${ffhr} - -# 3D data (on standard atmospheric pressure levels) -# Up to fhour=48 -# Will be removed in GFS.v17 -icao2=$COMIN/${RUN}.${cycle}.wafs_icao.grb2f${ffhr} - -icnt=1 -while [ $icnt -lt 1000 ] -do - if [[ -s $wafs2i ]] ; then - break - fi - - sleep 10 - icnt=$((icnt + 1)) - if [ $icnt -ge 180 ] ; then - msg="ABORTING after 30 min of waiting for the gfs wafs file!" - err_exit $msg - fi -done - - -######################################## -echo "HAS BEGUN!" -######################################## - -echo " ------------------------------------------" -echo " BEGIN MAKING GFS WAFS GRIB2 0.25 DEG PRODUCTS" -echo " ------------------------------------------" - -set +x -echo " " -echo "#####################################" -echo " Process GRIB2 WAFS 0.25 DEG PRODUCTS " -echo "#####################################" -echo " " -set -x - -opt1=' -set_grib_type same -new_grid_winds earth ' -opt21=' -new_grid_interpolation bilinear -if ' -opt22="(:ICESEV|parm=37):" -opt23=' -new_grid_interpolation neighbor -fi ' -opt24=' -set_bitmap 1 -set_grib_max_bits 16 ' -opt25=":(UGRD|VGRD):max wind" -newgrid="latlon 0:1440:0.25 90:721:-0.25" - -# WAFS 3D data -$WGRIB2 $wafs2 $opt1 $opt21 $opt22 $opt23 $opt24 -new_grid $newgrid tmp_wafs_0p25.grb2 -# Master 2D data -$WGRIB2 $master2 | grep -F -f $FIXgfs/grib2_0p25_gfs_master2d.list \ - | $WGRIB2 -i $master2 -set master_table 25 -grib tmp_master.grb2 -$WGRIB2 tmp_master.grb2 $opt1 $opt21 ":(UGRD|VGRD):max wind" $opt23 $opt24 -new_grid $newgrid tmp_master_0p25.grb2 - -#--------------------------- -# Product 1: WAFS u/v/t/rh gfs.tHHz.wafs_0p25.fFFF.grib2 -#--------------------------- -$WGRIB2 tmp_wafs_0p25.grb2 | egrep "UGRD|VGRD|TMP|HGT|RH" \ - | $WGRIB2 -i tmp_wafs_0p25.grb2 -set master_table 25 -grib tmp.gfs.t${cyc}z.wafs_0p25.f${ffhr}.grib2 -cat tmp_master_0p25.grb2 >> tmp.gfs.t${cyc}z.wafs_0p25.f${ffhr}.grib2 -# Convert template 5 to 5.40 -#$WGRIB2 tmp.gfs.t${cyc}z.wafs_0p25.f${ffhr}.grib2 -set_grib_type jpeg -grib_out gfs.t${cyc}z.wafs_0p25.f${ffhr}.grib2 -mv tmp.gfs.t${cyc}z.wafs_0p25.f${ffhr}.grib2 gfs.t${cyc}z.wafs_0p25.f${ffhr}.grib2 -$WGRIB2 -s gfs.t${cyc}z.wafs_0p25.f${ffhr}.grib2 > gfs.t${cyc}z.wafs_0p25.f${ffhr}.grib2.idx - -if [ $hazard_timewindow = 'yes' ] ; then -#--------------------------- -# Product 2: For AWC and Delta airline: EDPARM CAT MWT ICESEV CB gfs.tHHz.awf_0p25.fFFF.grib2 -#--------------------------- - criteria1=":EDPARM:|:ICESEV:|parm=37:" - criteria2=":CATEDR:|:MWTURB:" - criteria3=":CBHE:|:ICAHT:" - $WGRIB2 tmp_wafs_0p25.grb2 | egrep "${criteria1}|$criteria2|$criteria3" \ - | $WGRIB2 -i tmp_wafs_0p25.grb2 -grib gfs.t${cyc}z.awf_0p25.f${ffhr}.grib2 - $WGRIB2 -s gfs.t${cyc}z.awf_0p25.f${ffhr}.grib2 > gfs.t${cyc}z.awf_0p25.f${ffhr}.grib2.idx - -#--------------------------- -# Product 3: WAFS unblended EDPARM, ICESEV, CB (No CAT MWT) gfs.tHHz.wafs_0p25_unblended.fFF.grib2 -#--------------------------- - $WGRIB2 tmp_wafs_0p25.grb2 | grep -F -f $FIXgfs/grib2_0p25_gfs_hazard.list \ - | $WGRIB2 -i tmp_wafs_0p25.grb2 -set master_table 25 -grib tmp_wafs_0p25.grb2.forblend - - # Convert template 5 to 5.40 - #$WGRIB2 tmp_wafs_0p25.grb2.forblend -set_grib_type jpeg -grib_out gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr2}.grib2 - mv tmp_wafs_0p25.grb2.forblend gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr2}.grib2 - $WGRIB2 -s gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr2}.grib2 > gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr2}.grib2.idx -fi - -if [ $SENDCOM = "YES" ] ; then - - ############################## - # Post Files to COM - ############################## - - mv gfs.t${cyc}z.wafs_0p25.f${ffhr}.grib2 $COMOUT/gfs.t${cyc}z.wafs_0p25.f${ffhr}.grib2 - mv gfs.t${cyc}z.wafs_0p25.f${ffhr}.grib2.idx $COMOUT/gfs.t${cyc}z.wafs_0p25.f${ffhr}.grib2.idx - - if [ $hazard_timewindow = 'yes' ] ; then - mv gfs.t${cyc}z.awf_0p25.f${ffhr}.grib2 $COMOUT/gfs.t${cyc}z.awf_0p25.f${ffhr}.grib2 - mv gfs.t${cyc}z.awf_0p25.f${ffhr}.grib2.idx $COMOUT/gfs.t${cyc}z.awf_0p25.f${ffhr}.grib2.idx - - mv gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr2}.grib2 $COMOUT/gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr2}.grib2 - mv gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr2}.grib2.idx $COMOUT/gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr2}.grib2.idx - fi - - ############################# - # Post Files to PCOM - ############################## - ## mv gfs.t${cyc}z.wafs_0p25_unblended_wifs.f${ffhr2}.grib2 $PCOM/gfs.t${cyc}z.wafs_0p25_unblended_wifs.f${ffhr2}.grib2 -fi - - -if [ $SENDDBN = "YES" ] ; then - ###################### - # Distribute Data - ###################### - - if [ $hazard_timewindow = 'yes' ] ; then - # Hazard WAFS data (ICESEV EDR CAT MWT on 100mb to 1000mb or on new ICAO 2023 levels) sent to AWC and to NOMADS for US stakeholders - $DBNROOT/bin/dbn_alert MODEL GFS_AWF_0P25_GB2 $job $COMOUT/gfs.t${cyc}z.awf_0p25.f${ffhr}.grib2 - - # Unblended US WAFS data sent to UK for blending, to the same server as 1.25 deg unblended data: wmo/grib2.tCCz.wafs_grb_wifsfFF.45 - $DBNROOT/bin/dbn_alert MODEL GFS_WAFS_0P25_UBL_GB2 $job $COMOUT/gfs.t${cyc}z.wafs_0p25_unblended.f${ffhr2}.grib2 - fi - - # WAFS U/V/T/RH data sent to the same server as the unblended data as above - $DBNROOT/bin/dbn_alert MODEL GFS_WAFS_0P25_GB2 $job $COMOUT/gfs.t${cyc}z.wafs_0p25.f${ffhr}.grib2 - -fi - -################################################################################ -# GOOD RUN -set +x -echo "**************JOB EXGFS_ATMOS_WAFS_GRIB2_0P25.SH COMPLETED NORMALLY ON THE IBM" -echo "**************JOB EXGFS_ATMOS_WAFS_GRIB2_0P25.SH COMPLETED NORMALLY ON THE IBM" -echo "**************JOB EXGFS_ATMOS_WAFS_GRIB2_0P25.SH COMPLETED NORMALLY ON THE IBM" -set -x -################################################################################ - -echo "HAS COMPLETED NORMALLY!" - -exit 0 - -############## END OF SCRIPT ####################### diff --git a/scripts/exgfs_wave_nawips.sh b/scripts/exgfs_wave_nawips.sh index 68ebfc90c7..f8f65a800a 100755 --- a/scripts/exgfs_wave_nawips.sh +++ b/scripts/exgfs_wave_nawips.sh @@ -12,9 +12,10 @@ ##################################################################### source "${USHgfs}/preamble.sh" +source "${USHgfs}/wave_domain_grid.sh" -#export grids=${grids:-'glo_30m at_10m ep_10m wc_10m ao_9km'} #Interpolated grids -export grids=${grids:-${waveinterpGRD:-'glo_30m'}} #Native grids +#export grids=${GEMPAK_GRIDS:-'glo_30m at_10m ep_10m wc_10m ao_9km'} #Interpolated grids +export grids=${GEMPAK_GRIDS:-${waveinterpGRD:-'glo_30m'}} #Native grids export RUNwave=${RUNwave:-${RUN}wave} export fstart=${fstart:-0} export FHMAX_WAV=${FHMAX_WAV:-180} #180 Total of hours to process @@ -73,7 +74,10 @@ while [ ${fhcnt} -le ${FHMAX_WAV} ]; do *) grdIDin= grdIDout= ;; esac - GRIBIN="${COMIN_WAVE_GRID}/${RUNwave}.${cycle}.${grdIDin}.f${fhr}.grib2" + process_grdID "${grid}" + com_varname="COMIN_WAVE_GRID_${GRDREGION}_${GRDRES}" + com_dir=${!com_varname} + GRIBIN="${com_dir}/${RUNwave}.${cycle}.${grdIDin}.f${fhr}.grib2" GRIBIN_chk=${GRIBIN}.idx if ! wait_for_file "${GRIBIN_chk}" "${sleep_interval}" "${maxtries}"; then echo "FATAL ERROR: ${GRIBIN_chk} not found after waiting $((sleep_interval * ( maxtries - 1))) secs" diff --git a/scripts/exgfs_wave_post_gridded_sbs.sh b/scripts/exgfs_wave_post_gridded_sbs.sh index 423d6af694..83584e7a5d 100755 --- a/scripts/exgfs_wave_post_gridded_sbs.sh +++ b/scripts/exgfs_wave_post_gridded_sbs.sh @@ -33,6 +33,7 @@ # 0. Preparations source "${USHgfs}/preamble.sh" +source "${USHgfs}/wave_domain_grid.sh" # 0.a Basic modes of operation @@ -218,7 +219,6 @@ source "${USHgfs}/preamble.sh" echo ' Making command file for sbs grib2 and GRID Interpolation ' set_trace fhr=$(( 10#${FHR3} )) - fhrg=$fhr ymdh=$($NDATE $fhr ${PDY}${cyc}) YMD=$(echo $ymdh | cut -c1-8) HMS="$(echo $ymdh | cut -c9-10)0000" @@ -238,75 +238,41 @@ source "${USHgfs}/preamble.sh" export GRDIDATA=${DATA}/output_$YMDHMS # Gridded data (main part, need to be run side-by-side with forecast + gfile="${COMIN_WAVE_HISTORY}/${WAV_MOD_TAG}.out_grd.${waveGRD}.${YMD}.${HMS}" + if [[ ! -s "${gfile}" ]]; then + echo " FATAL ERROR : NO RAW FIELD OUTPUT FILE ${gfile}" + err=3; export err; "${errchk}" + exit "${err}" + fi + ${NLN} "${gfile}" "./out_grd.${waveGRD}" - if [ $fhr = $fhrg ] + if [ "$DOGRI_WAV" = 'YES' ] then - gfile="${COMIN_WAVE_HISTORY}/${WAV_MOD_TAG}.out_grd.${waveGRD}.${YMD}.${HMS}" - if [[ ! -s "${gfile}" ]]; then - echo " FATAL ERROR : NO RAW FIELD OUTPUT FILE ${gfile}" - err=3; export err; "${errchk}" - exit "${err}" - fi - ${NLN} "${gfile}" "./out_grd.${waveGRD}" - - if [ "$DOGRI_WAV" = 'YES' ] - then - nigrd=1 - for grdID in $waveinterpGRD - do - ymdh_int=$($NDATE -${WAVHINDH} $ymdh); dt_int=3600.; n_int=9999 ; - echo "${USHgfs}/wave_grid_interp_sbs.sh $grdID $ymdh_int $dt_int $n_int > grint_$grdID.out 2>&1" >> ${fcmdigrd}.${nigrd} - if [ "$DOGRB_WAV" = 'YES' ] - then - gribFL=\'$(echo ${OUTPARS_WAV})\' - case $grdID in - glo_15mxt) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; - reg025) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; - glo_025) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; - glo_100) GRDNAME='global' ; GRDRES=1p00 ; GRIDNR=255 ; MODNR=11 ;; - glo_200) GRDNAME='global' ; GRDRES=2p00 ; GRIDNR=255 ; MODNR=11 ;; - glo_500) GRDNAME='global' ; GRDRES=5p00 ; GRIDNR=255 ; MODNR=11 ;; - glo_30mxt) GRDNAME='global' ; GRDRES=0p50 ; GRIDNR=255 ; MODNR=11 ;; - glo_30m) GRDNAME='global' ; GRDRES=0p50 ; GRIDNR=255 ; MODNR=11 ;; - at_10m) GRDNAME='atlocn' ; GRDRES=0p16 ; GRIDNR=255 ; MODNR=11 ;; - ep_10m) GRDNAME='epacif' ; GRDRES=0p16 ; GRIDNR=255 ; MODNR=11 ;; - wc_10m) GRDNAME='wcoast' ; GRDRES=0p16 ; GRIDNR=255 ; MODNR=11 ;; - ak_10m) GRDNAME='alaska' ; GRDRES=0p16 ; GRIDNR=255 ; MODNR=11 ;; - esac - echo "${USHgfs}/wave_grib2_sbs.sh $grdID $GRIDNR $MODNR $ymdh $fhr $GRDNAME $GRDRES $gribFL > grib_$grdID.out 2>&1" >> ${fcmdigrd}.${nigrd} - fi - echo "${GRIBDATA}/${fcmdigrd}.${nigrd}" >> ${fcmdnow} - chmod 744 ${fcmdigrd}.${nigrd} - nigrd=$((nigrd+1)) - done - fi - - if [ "$DOGRB_WAV" = 'YES' ] - then - for grdID in ${wavepostGRD} # First concatenate grib files for sbs grids - do + nigrd=1 + for grdID in $waveinterpGRD + do + ymdh_int=$($NDATE -${WAVHINDH} $ymdh); dt_int=3600.; n_int=9999 ; + echo "${USHgfs}/wave_grid_interp_sbs.sh $grdID $ymdh_int $dt_int $n_int > grint_$grdID.out 2>&1" >> ${fcmdigrd}.${nigrd} + if [ "$DOGRB_WAV" = 'YES' ] + then gribFL=\'$(echo ${OUTPARS_WAV})\' - case $grdID in - aoc_9km) GRDNAME='arctic' ; GRDRES=9km ; GRIDNR=255 ; MODNR=11 ;; - ant_9km) GRDNAME='antarc' ; GRDRES=9km ; GRIDNR=255 ; MODNR=11 ;; - glo_10m) GRDNAME='global' ; GRDRES=0p16 ; GRIDNR=255 ; MODNR=11 ;; - gnh_10m) GRDNAME='global' ; GRDRES=0p16 ; GRIDNR=255 ; MODNR=11 ;; - gsh_15m) GRDNAME='gsouth' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; - glo_15m) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; - ao_20m) GRDNAME='arctic' ; GRDRES=0p33 ; GRIDNR=255 ; MODNR=11 ;; - so_20m) GRDNAME='antarc' ; GRDRES=0p33 ; GRIDNR=255 ; MODNR=11 ;; - glo_15mxt) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; - reg025) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; - glo_025) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; - glo_100) GRDNAME='global' ; GRDRES=1p00 ; GRIDNR=255 ; MODNR=11 ;; - glo_200) GRDNAME='global' ; GRDRES=2p00 ; GRIDNR=255 ; MODNR=11 ;; - glo_500) GRDNAME='global' ; GRDRES=5p00 ; GRIDNR=255 ; MODNR=11 ;; - gwes_30m) GRDNAME='global' ; GRDRES=0p50 ; GRIDNR=255 ; MODNR=10 ;; - esac - echo "${USHgfs}/wave_grib2_sbs.sh $grdID $GRIDNR $MODNR $ymdh $fhr $GRDNAME $GRDRES $gribFL > grib_$grdID.out 2>&1" >> ${fcmdnow} - done - fi + process_grdID "${grdID}" + echo "${USHgfs}/wave_grib2_sbs.sh $grdID $GRIDNR $MODNR $ymdh $fhr $GRDREGION $GRDRES $gribFL > grib_$grdID.out 2>&1" >> ${fcmdigrd}.${nigrd} + fi + echo "${GRIBDATA}/${fcmdigrd}.${nigrd}" >> ${fcmdnow} + chmod 744 ${fcmdigrd}.${nigrd} + nigrd=$((nigrd+1)) + done + fi + if [ "$DOGRB_WAV" = 'YES' ] + then + for grdID in ${wavepostGRD} # First concatenate grib files for sbs grids + do + gribFL=\'$(echo ${OUTPARS_WAV})\' + process_grdID "${grdID}" + echo "${USHgfs}/wave_grib2_sbs.sh $grdID $GRIDNR $MODNR $ymdh $fhr $GRDREGION $GRDRES $gribFL > grib_$grdID.out 2>&1" >> ${fcmdnow} + done fi if [ ${CFP_MP:-"NO"} = "YES" ]; then @@ -377,15 +343,14 @@ source "${USHgfs}/preamble.sh" rm -f out_grd.* # Remove large binary grid output files cd $DATA - - - if [ "$fhr" = "$fhrg" ] - then + # Check if grib2 file created ENSTAG="" + com_varname="COMOUT_WAVE_GRID_${GRDREGION}_${GRDRES}" + com_dir=${!com_varname} if [ ${waveMEMB} ]; then ENSTAG=".${membTAG}${waveMEMB}" ; fi - gribchk="${RUN}wave.${cycle}${ENSTAG}.${GRDNAME}.${GRDRES}.f${FH3}.grib2" - if [ ! -s ${COMOUT_WAVE_GRID}/${gribchk} ]; then + gribchk="${RUN}wave.${cycle}${ENSTAG}.${GRDREGION}.${GRDRES}.f${FH3}.grib2" + if [ ! -s ${com_dir}/${gribchk} ]; then set +x echo ' ' echo '********************************************' @@ -397,7 +362,6 @@ source "${USHgfs}/preamble.sh" err=5; export err;${errchk} exit "$err" fi - fi # --------------------------------------------------------------------------- # # 7. Ending output diff --git a/scripts/exgfs_wave_prdgen_gridded.sh b/scripts/exgfs_wave_prdgen_gridded.sh index 8fd6b5cc76..4e74d08e79 100755 --- a/scripts/exgfs_wave_prdgen_gridded.sh +++ b/scripts/exgfs_wave_prdgen_gridded.sh @@ -25,6 +25,7 @@ # 0. Preparations source "${USHgfs}/preamble.sh" +source "${USHgfs}/wave_domain_grid.sh" # 0.a Basic modes of operation @@ -48,7 +49,7 @@ source "${USHgfs}/preamble.sh" # Input grid grid_in="${waveinterpGRD:-glo_15mxt}" # Output grids -grids=${grids:-ao_9km at_10m ep_10m wc_10m glo_30m} +grids=${GEMPAK_GRIDS:-ak_10m at_10m ep_10m wc_10m glo_30m} # export grids=${wavepostGRD} maxtries=${maxtries:-720} # 0.b Date and time stuff @@ -88,33 +89,19 @@ grids=${grids:-ao_9km at_10m ep_10m wc_10m glo_30m} # 1.a Grib file (AWIPS and FAX charts) # Get input grid # TODO flesh this out with additional input grids if needed - case ${grid_in} in - glo_200) - grdIDin='global.2p00' ;; - glo_15mxt) - grdIDin='global.0p25' ;; - *) - echo "FATAL ERROR Unrecognized input grid ${grid_in}" - exit 2;; - esac + process_grdID "${grid_in}" + grdIDin=${grdNAME} fhcnt=${fstart} while [[ "${fhcnt}" -le "${FHMAX_WAV}" ]]; do fhr=$(printf "%03d" "${fhcnt}") for grdOut in ${grids}; do - case ${grdOut} in - ao_9km) grdID='arctic.9km' ;; - at_10m) grdID='atlocn.0p16' ;; - ep_10m) grdID='epacif.0p16' ;; - wc_10m) grdID='wcoast.0p16' ;; -# glo_30m) grdID='global.0p25' ;; - glo_30m) grdID='global.0p50' ;; - ak_10m) grdID='alaska.0p16' ;; - *) grdID= ;; - esac - # + process_grdID "${grdout}" + grdIDin=${grdNAME} + com_varname="${COMIN_WAVE_GRID}_${GRDREGION}_${GRDRES}" + com_dir="${!com_varname}" - GRIBIN="${COMIN_WAVE_GRID}/${RUNwave}.${cycle}.${grdIDin}.f${fhr}.grib2" + GRIBIN="${com_dir}/${RUNwave}.${cycle}.${grdIDin}.f${fhr}.grib2" GRIBIN_chk="${GRIBIN}.idx" sleep_interval=5 max_tries=1000 diff --git a/scripts/exglobal_archive.py b/scripts/exglobal_archive.py index df49704e06..f64db172ac 100755 --- a/scripts/exglobal_archive.py +++ b/scripts/exglobal_archive.py @@ -40,7 +40,7 @@ def main(): 'NMEM_ENS', 'DO_JEDIATMVAR', 'DO_VRFY_OCEANDA', 'FHMAX_FITS', 'waveGRD', 'IAUFHRS', 'DO_FIT2OBS', 'NET', 'FHOUT_HF_GFS', 'FHMAX_HF_GFS', 'REPLAY_ICS', 'OFFSET_START_HOUR', 'ARCH_EXPDIR', 'EXPDIR', 'ARCH_EXPDIR_FREQ', 'ARCH_HASHES', - 'ARCH_DIFFS', 'SDATE', 'EDATE', 'HOMEgfs', 'DO_GEMPAK'] + 'ARCH_DIFFS', 'SDATE', 'EDATE', 'HOMEgfs', 'DO_GEMPAK', 'WAVE_OUT_GRIDS'] archive_dict = AttrDict() for key in keys: diff --git a/scripts/exglobal_fetch.py b/scripts/exglobal_fetch.py new file mode 100755 index 0000000000..d9efe24d7f --- /dev/null +++ b/scripts/exglobal_fetch.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +import os + +from pygfs.task.fetch import Fetch +from wxflow import AttrDict, Logger, cast_strdict_as_dtypedict, logit + +# initialize root logger +logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=True) + + +@logit(logger) +def main(): + + config = cast_strdict_as_dtypedict(os.environ) + + # Instantiate the Fetch object + fetch = Fetch(config) + + # Pull out all the configuration keys needed to run the fetch step + keys = ['current_cycle', 'previous_cycle', 'RUN', 'PDY', 'PARMgfs', 'PSLOT', 'ROTDIR', + 'FETCH_YAML_TMPL', 'FETCHDIR', 'ntiles', 'DATAROOT', 'waveGRD'] + + fetch_dict = AttrDict() + for key in keys: + fetch_dict[key] = fetch.task_config.get(key) + if fetch_dict[key] is None: + print(f"Warning: key ({key}) not found in task_config!") + + # Determine which archives to retrieve from HPSS + # Read the input YAML file to get the list of tarballs on tape + fetchdir_set = fetch.configure(fetch_dict) + + # Pull the data from tape or locally and store the specified destination + fetch.execute_pull_data(fetchdir_set) + + +if __name__ == '__main__': + main() diff --git a/sorc/gdas.cd b/sorc/gdas.cd index 15113adfdb..417ed5e686 160000 --- a/sorc/gdas.cd +++ b/sorc/gdas.cd @@ -1 +1 @@ -Subproject commit 15113adfdbf2500ec2d5099fc9b62b21fbfcc9b8 +Subproject commit 417ed5e686ae73af7be65350fda20037c5934242 diff --git a/sorc/gsi_monitor.fd b/sorc/gsi_monitor.fd index 278ee629e8..879f5900d9 160000 --- a/sorc/gsi_monitor.fd +++ b/sorc/gsi_monitor.fd @@ -1 +1 @@ -Subproject commit 278ee629e87558822e8d13b3fb3b0e16006aa856 +Subproject commit 879f5900d9236e144a18cba8e804618fa6c449e3 diff --git a/sorc/link_workflow.sh b/sorc/link_workflow.sh index 95067ca4b4..a57f5660cc 100755 --- a/sorc/link_workflow.sh +++ b/sorc/link_workflow.sh @@ -76,7 +76,8 @@ case "${machine}" in "hercules") FIX_DIR="/work/noaa/global/glopara/fix" ;; "jet") FIX_DIR="/lfs5/HFIP/hfv3gfs/glopara/FIX/fix" ;; "s4") FIX_DIR="/data/prod/glopara/fix" ;; -"gaea") FIX_DIR="/gpfs/f5/ufs-ard/world-shared/global/glopara/data/fix" ;; +"gaeac5") FIX_DIR="/gpfs/f5/ufs-ard/world-shared/global/glopara/data/fix" ;; +"gaeac6") FIX_DIR="/gpfs/f6/bil-fire8/world-shared/global/glopara/fix" ;; "noaacloud") FIX_DIR="/contrib/global-workflow-shared-data/fix" ;; *) echo "FATAL: Unknown target machine ${machine}, couldn't set FIX_DIR" diff --git a/sorc/ufs_utils.fd b/sorc/ufs_utils.fd index 2323761084..5b2bfa39a5 160000 --- a/sorc/ufs_utils.fd +++ b/sorc/ufs_utils.fd @@ -1 +1 @@ -Subproject commit 23237610845c3a4438b21b25e9b3dc25c4c15b73 +Subproject commit 5b2bfa39a5b1fbe6bb1d247102679885685c9336 diff --git a/ush/detect_machine.sh b/ush/detect_machine.sh index 8ad217140a..9301c8492f 100755 --- a/ush/detect_machine.sh +++ b/ush/detect_machine.sh @@ -21,8 +21,11 @@ case $(hostname -f) in dlogin0[1-9].dogwood.wcoss2.ncep.noaa.gov) MACHINE_ID=wcoss2 ;; ### dogwood01-9 dlogin10.dogwood.wcoss2.ncep.noaa.gov) MACHINE_ID=wcoss2 ;; ### dogwood10 - gaea5[1-8]) MACHINE_ID=gaea ;; ### gaea51-58 - gaea5[1-8].ncrc.gov) MACHINE_ID=gaea ;; ### gaea51-58 + gaea5[1-8]) MACHINE_ID=gaeac5 ;; ### gaea51-58 + gaea5[1-8].ncrc.gov) MACHINE_ID=gaeac5 ;; ### gaea51-58 + + gaea6[1-8]) MACHINE_ID=gaeac6 ;; ### gaea61-68 + gaea6[1-8].ncrc.gov) MACHINE_ID=gaeac6 ;; ### gaea61-68 hfe0[1-9]) MACHINE_ID=hera ;; ### hera01-09 hfe1[0-2]) MACHINE_ID=hera ;; ### hera10-12 @@ -81,9 +84,12 @@ elif [[ -d /work ]]; then else MACHINE_ID=orion fi -elif [[ -d /gpfs && -d /ncrc ]]; then - # We are on GAEA. - MACHINE_ID=gaea +elif [[ -d /gpfs/f5 ]]; then + # We are on GAEAC5. + MACHINE_ID=gaeac5 +elif [[ -d /gpfs/f6 ]]; then + # We are on GAEAC6. + MACHINE_ID=gaeac6 elif [[ -d /data/prod ]]; then # We are on SSEC's S4 MACHINE_ID=s4 diff --git a/ush/load_fv3gfs_modules.sh b/ush/load_fv3gfs_modules.sh index ff6f64cece..93098322c4 100755 --- a/ush/load_fv3gfs_modules.sh +++ b/ush/load_fv3gfs_modules.sh @@ -20,7 +20,7 @@ source "${HOMEgfs}/versions/run.ver" module use "${HOMEgfs}/modulefiles" case "${MACHINE_ID}" in - "wcoss2" | "hera" | "orion" | "hercules" | "gaea" | "jet" | "s4" | "noaacloud") + "wcoss2" | "hera" | "orion" | "hercules" | "gaeac5" | "gaeac6" | "jet" | "s4" | "noaacloud") module load "module_base.${MACHINE_ID}" ;; *) diff --git a/ush/load_ufsda_modules.sh b/ush/load_ufsda_modules.sh index 9c7c57c330..3af843f8fe 100755 --- a/ush/load_ufsda_modules.sh +++ b/ush/load_ufsda_modules.sh @@ -34,7 +34,7 @@ source "${HOMEgfs}/ush/module-setup.sh" module use "${HOMEgfs}/sorc/gdas.cd/modulefiles" case "${MACHINE_ID}" in - ("hera" | "orion" | "hercules" | "wcoss2") + ("hera" | "orion" | "hercules" | "wcoss2" | "gaeac5" | "gaeac6") #TODO: Remove LMOD_TMOD_FIND_FIRST line when spack-stack on WCOSS2 if [[ "${MACHINE_ID}" == "wcoss2" ]]; then export LMOD_TMOD_FIND_FIRST=yes @@ -48,7 +48,7 @@ case "${MACHINE_ID}" in NETCDF=$( echo "${ncdump}" | cut -d " " -f 3 ) export NETCDF ;; - ("jet" | "gaea" | "s4" | "acorn") + ("jet" | "s4" | "acorn") echo WARNING: UFSDA NOT SUPPORTED ON THIS PLATFORM ;; *) diff --git a/ush/python/pygfs/__init__.py b/ush/python/pygfs/__init__.py index 6b7b7eb4c9..caa3929f3e 100644 --- a/ush/python/pygfs/__init__.py +++ b/ush/python/pygfs/__init__.py @@ -14,6 +14,7 @@ from .task.oceanice_products import OceanIceProducts from .task.gfs_forecast import GFSForecast from .utils import marine_da_utils +from .task.fetch import Fetch __docformat__ = "restructuredtext" __version__ = "0.1.0" diff --git a/ush/python/pygfs/task/fetch.py b/ush/python/pygfs/task/fetch.py new file mode 100755 index 0000000000..19db8746c1 --- /dev/null +++ b/ush/python/pygfs/task/fetch.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python3 + +import os +from logging import getLogger +from typing import Any, Dict + +from wxflow import (Hsi, Task, htar, + logit, parse_j2yaml, chdir) +# import tarfile + + +logger = getLogger(__name__.split('.')[-1]) + + +class Fetch(Task): + """Task to pull ROTDIR data from HPSS (or locally) + """ + + @logit(logger, name="Fetch") + def __init__(self, config: Dict[str, Any]) -> None: + """Constructor for the Fetch task + The constructor is responsible for collecting necessary yamls based on + the runtime options and RUN. + + Parameters + ---------- + config : Dict[str, Any] + Incoming configuration for the task from the environment + + Returns + ------- + None + """ + super().__init__(config) + + @logit(logger) + def configure(self, fetch_dict: Dict[str, Any]): + """Determine which tarballs will need to be extracted + + Parameters + ---------- + fetch_dict : Dict[str, Any] + Task specific keys, e.g. COM directories, etc + + Return + ------ + parsed_fetch: Dict[str, Any] + Dictionary derived from the yaml file with necessary HPSS info. + """ + self.hsi = Hsi() + + fetch_yaml = fetch_dict.FETCH_YAML_TMPL + fetch_parm = os.path.join(fetch_dict.PARMgfs, "fetch") + + parsed_fetch = parse_j2yaml(os.path.join(fetch_parm, fetch_yaml), + fetch_dict) + return parsed_fetch + + @logit(logger) + def execute_pull_data(self, fetchdir_set: Dict[str, Any]) -> None: + """Pull data from HPSS based on a yaml dictionary and store at the + specified destination. + + Parameters + ---------- + fetchdir_set: Dict[str, Any], + Dict defining set of tarballs to pull and where to put them. + + Return + None + """ + + f_names = fetchdir_set.target.contents + if len(f_names) <= 0: # Abort if no files + raise FileNotFoundError("FATAL ERROR: The tar ball has no files") + + on_hpss = fetchdir_set.target.on_hpss + dest = fetchdir_set.target.destination + tarball = fetchdir_set.targettarball + + # Select action whether no_hpss is True or not, and pull these + # data from tape or locally and place where it needs to go + # DG - these need testing + with chdir(dest): + logger.info(f"Changed working directory to {dest}") + if on_hpss is True: # htar all files in fnames + htar_obj = htar.Htar() + htar_obj.xvf(tarball, f_names) + else: # tar all files in fnames + raise NotImplementedError("The fetch job does not yet support pulling from local archives") + +# with tarfile.open(dest, "w") as tar: +# for filename in f_names: +# tar.add(filename) + # Verify all data files were extracted + missing_files = [] + for f in f_names: + if not os.path.exists(f): + missing_files.append(f) + if len(missing_files) > 0: + message = "Failed to extract all required files. Missing files:\n" + for f in missing_files: + message += f"{f}\n" + + raise FileNotFoundError(message) diff --git a/ush/python/pygfs/task/marine_analysis.py b/ush/python/pygfs/task/marine_analysis.py index dd48c9f80f..d4ee08ba32 100644 --- a/ush/python/pygfs/task/marine_analysis.py +++ b/ush/python/pygfs/task/marine_analysis.py @@ -281,6 +281,8 @@ def _prep_checkpoint(self: Task) -> None: soca2cice_param = AttrDict({ "ocn_ana": f"./Data/ocn.3dvarfgat_pseudo.an.{self.task_config.MARINE_WINDOW_MIDDLE_ISO}.nc", "ice_ana": f"./Data/ice.3dvarfgat_pseudo.an.{self.task_config.MARINE_WINDOW_MIDDLE_ISO}.nc", + "ocn_inc": f"./Data/ocn.3dvarfgat_pseudo.incr.{self.task_config.MARINE_WINDOW_MIDDLE_ISO}.nc", + "ice_inc": f"./Data/ice.3dvarfgat_pseudo.incr.{self.task_config.MARINE_WINDOW_MIDDLE_ISO}.nc", "ice_rst": ice_rst_ana, "fcst_begin": fcst_begin }) @@ -288,11 +290,10 @@ def _prep_checkpoint(self: Task) -> None: # render the SOCA to CICE YAML file for the Arctic and Antarctic logger.info("render the SOCA to CICE YAML file for the Arctic and Antarctic") - varchgyamls = ['soca_2cice_global.yaml'] - for varchgyaml in varchgyamls: - soca2cice_config = parse_j2yaml(path=os.path.join(self.task_config.MARINE_JCB_GDAS_ALGO, f'{varchgyaml}.j2'), - data=soca2cice_param) - soca2cice_config.save(os.path.join(self.task_config.DATA, varchgyaml)) + varchgyaml = 'soca_2cice_global.yaml' + soca2cice_config = parse_j2yaml(path=os.path.join(self.task_config.MARINE_JCB_GDAS_ALGO, f'{varchgyaml}.j2'), + data=soca2cice_param) + soca2cice_config.save(os.path.join(self.task_config.DATA, varchgyaml)) @logit(logger) def variational(self: Task) -> None: @@ -388,6 +389,10 @@ def list_all_files(dir_in, dir_out, wc='*', fh_list=[]): post_file_list.append([os.path.join(anl_dir, 'Data', f'{domain}.3dvarfgat_pseudo.an.{mdate}.nc'), os.path.join(com_ocean_analysis, f'{RUN}.t{cyc}z.{domain}ana.nc')]) + # Copy soca2cice ice increment + post_file_list.append([os.path.join(anl_dir, 'Data', f'ice.soca2cice.incr.{bdate}.nc'), + os.path.join(com_ocean_analysis, f'{RUN}.t{cyc}z.ice.incr.postproc.nc')]) + # Copy of the ssh diagnostics if nmem_ens > 2: for string in ['ssh_steric_stddev', 'ssh_unbal_stddev', 'ssh_total_stddev', 'steric_explained_variance']: diff --git a/ush/python/pygfs/task/upp.py b/ush/python/pygfs/task/upp.py index 70955a7276..82ce4a0daf 100644 --- a/ush/python/pygfs/task/upp.py +++ b/ush/python/pygfs/task/upp.py @@ -22,7 +22,7 @@ class UPP(Task): """Unified Post Processor Task """ - VALID_UPP_RUN = ['analysis', 'forecast', 'goes', 'wafs'] + VALID_UPP_RUN = ['analysis', 'forecast', 'goes'] @logit(logger, name="UPP") def __init__(self, config: Dict[str, Any]) -> None: @@ -33,7 +33,6 @@ def __init__(self, config: Dict[str, Any]) -> None: analysis: process analysis output forecast: process UFS-weather-model forecast output goes: process UFS-weather-model forecast output for simulated satellite imagery - wafs: process UFS-weather-model forecast output for WAFS products Parameters ---------- diff --git a/ush/wafs_mkgbl.sh b/ush/wafs_mkgbl.sh deleted file mode 100755 index e6139bc9d3..0000000000 --- a/ush/wafs_mkgbl.sh +++ /dev/null @@ -1,152 +0,0 @@ -# UTILITY SCRIPT NAME : wafs_mkgbl.sh -# AUTHOR : Mary Jacobs -# DATE WRITTEN : 11/06/96 -# -# Abstract: This utility script produces the GFS WAFS -# bulletins. -# -# Input: 2 arguments are passed to this script. -# 1st argument - Forecast Hour - format of 2I -# 2nd argument - In hours 12-30, the designator of -# a or b. -# -# Logic: If we are processing hours 12-30, we have the -# added variable of the a or b, and process -# accordingly. The other hours, the a or b is dropped. -# -echo "History: SEPT 1996 - First implementation of this utility script" -echo "History: AUG 1999 - Modified for implementation on IBM SP" -echo " - Allows users to run interactively" -# - -set -x -hour_list="$1" -sets_key=$2 -num=$# - -if test $num -ge 2 -then - echo " Appropriate number of arguments were passed" - set -x - if [ -z "$DATA" ] - then - export DATA=`pwd` - cd $DATA - setpdy.sh - . PDY - fi -else - echo "" - echo "Usage: wafs_mkgbl.sh \$hour [a|b]" - echo "" - exit 16 -fi - -echo " ------------------------------------------" -echo " BEGIN MAKING ${NET} WAFS PRODUCTS" -echo " ------------------------------------------" - -echo "Enter Make WAFS utility." - -for hour in $hour_list -do - ############################## - # Copy Input Field to $DATA - ############################## - - if test ! -f pgrbf${hour} - then -# cp $COMIN/${RUN}.${cycle}.pgrbf${hour} pgrbf${hour} - -# file name and forecast hour of GFS model data in Grib2 are 3 digits -# export fhr3=$hour -# if test $fhr3 -lt 100 -# then -# export fhr3="0$fhr3" -# fi - fhr3="$(printf "%03d" $(( 10#$hour )) )" - -# To solve Bugzilla #408: remove the dependency of grib1 files in gfs wafs job in next GFS upgrade -# Reason: It's not efficent if simply converting from grib2 to grib1 (costs 6 seconds with 415 records) -# Solution: Need to grep 'selected fields on selected levels' before CNVGRIB (costs 1 second with 92 records) - ${NLN} $COMIN/${RUN}.${cycle}.pgrb2.1p00.f$fhr3 pgrb2f${hour} - $WGRIB2 pgrb2f${hour} | grep -F -f $FIXgfs/grib_wafs.grb2to1.list | $WGRIB2 -i pgrb2f${hour} -grib pgrb2f${hour}.tmp -# on Cray, IOBUF_PARAMS has to used to speed up CNVGRIB -# export IOBUF_PARAMS='*:size=32M:count=4:verbose' - $CNVGRIB -g21 pgrb2f${hour}.tmp pgrbf${hour} -# unset IOBUF_PARAMS - fi - - # - # BAG - Put in fix on 20070925 to force the percision of U and V winds - # to default to 1 through the use of the grib_wafs.namelist file. - # - $COPYGB -g3 -i0 -N$FIXgfs/grib_wafs.namelist -x pgrbf${hour} tmp - mv tmp pgrbf${hour} - $GRBINDEX pgrbf${hour} pgrbif${hour} - - ############################## - # Process WAFS - ############################## - - if test $hour -ge '12' -a $hour -le '30' - then - sets=$sets_key - set +x - echo "We are processing the primary and secondary sets of hours." - echo "These sets are the a and b of hours 12-30." - set -x - else - # This is for hours 00/06 and 36-72. - unset sets - fi - - export pgm=wafs_makewafs - . prep_step - - export FORT11="pgrbf${hour}" - export FORT31="pgrbif${hour}" - export FORT51="xtrn.wfs${NET}${hour}${sets}" - export FORT53="com.wafs${hour}${sets}" - - startmsg - $EXECgfs/wafs_makewafs.x < $FIXgfs/grib_wfs${NET}${hour}${sets} >>$pgmout 2>errfile - export err=$?;err_chk - - - ############################## - # Post Files to PCOM - ############################## - - if test "$SENDCOM" = 'YES' - then - cp xtrn.wfs${NET}${hour}${sets} $PCOM/xtrn.wfs${NET}${cyc}${hour}${sets}.$jobsuffix -# cp com.wafs${hour}${sets} $PCOM/com.wafs${cyc}${hour}${sets}.$jobsuffix - -# if test "$SENDDBN_NTC" = 'YES' -# then -# if test "$NET" = 'gfs' -# then -# $DBNROOT/bin/dbn_alert MODEL GFS_WAFS $job \ -# $PCOM/com.wafs${cyc}${hour}${sets}.$jobsuffix -# $DBNROOT/bin/dbn_alert MODEL GFS_XWAFS $job \ -# $PCOM/xtrn.wfs${NET}${cyc}${hour}${sets}.$jobsuffix -# fi -# fi - fi - - ############################## - # Distribute Data - ############################## - - if [ "$SENDDBN_NTC" = 'YES' ] ; then - $DBNROOT/bin/dbn_alert GRIB_LOW $NET $job $PCOM/xtrn.wfs${NET}${cyc}${hour}${sets}.$jobsuffix - else - echo "xtrn.wfs${NET}${cyc}${hour}${sets}.$job file not posted to db_net." - fi - - echo "Wafs Processing $hour hour completed normally" - -done - -exit diff --git a/ush/wave_domain_grid.sh b/ush/wave_domain_grid.sh new file mode 100644 index 0000000000..bf393c5513 --- /dev/null +++ b/ush/wave_domain_grid.sh @@ -0,0 +1,43 @@ +#! /usr/bin/env bash + +################################################################################ +## UNIX Script Documentation Block +## Script name: wave_domain_grid.sh +## Script description: provides the wave grid specific values that +## are needed for the wave related jobs +####################### +# Main body starts here +####################### + +process_grdID() { + grdID=$1 + case ${grdID} in + glo_10m) GRDREGION='global' ; GRDRES=0p16 ; GRIDNR=255 ; MODNR=11 ;; + glo_15mxt) GRDREGION='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; + glo_30mxt) GRDREGION='global' ; GRDRES=0p50 ; GRIDNR=255 ; MODNR=11 ;; + glo_30m) GRDREGION='global' ; GRDRES=0p50 ; GRIDNR=255 ; MODNR=11 ;; + glo_025) GRDREGION='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; + glo_100) GRDREGION='global' ; GRDRES=1p00 ; GRIDNR=255 ; MODNR=11 ;; + glo_200) GRDREGION='global' ; GRDRES=2p00 ; GRIDNR=255 ; MODNR=11 ;; + glo_500) GRDREGION='global' ; GRDRES=5p00 ; GRIDNR=255 ; MODNR=11 ;; + at_10m) GRDREGION='atlocn' ; GRDRES=0p16 ; GRIDNR=255 ; MODNR=11 ;; + ep_10m) GRDREGION='epacif' ; GRDRES=0p16 ; GRIDNR=255 ; MODNR=11 ;; + wc_10m) GRDREGION='wcoast' ; GRDRES=0p16 ; GRIDNR=255 ; MODNR=11 ;; + ak_10m) GRDREGION='alaska' ; GRDRES=0p16 ; GRIDNR=255 ; MODNR=11 ;; + aoc_9km) GRDREGION='arctic' ; GRDRES=9km ; GRIDNR=255 ; MODNR=11 ;; + ant_9km) GRDREGION='antarc' ; GRDRES=9km ; GRIDNR=255 ; MODNR=11 ;; + gnh_10m) GRDREGION='global' ; GRDRES=0p16 ; GRIDNR=255 ; MODNR=11 ;; + gsh_15m) GRDREGION='gsouth' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; + ao_20m) GRDREGION='arctic' ; GRDRES=0p33 ; GRIDNR=255 ; MODNR=11 ;; + so_20m) GRDREGION='antarc' ; GRDRES=0p33 ; GRIDNR=255 ; MODNR=11 ;; + reg025) GRDREGION='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; + gwes_30m) GRDREGION='global' ; GRDRES=0p50 ; GRIDNR=255 ; MODNR=10 ;; + *) + echo "FATAL ERROR: No grid specific wave config values exist for ${grdID}. Aborting." + exit 1 ;; + esac + grdNAME="${GRDREGION}.${GRDRES}" + echo "grdNAME=${grdNAME}" + echo "GRIDNR=${GRIDNR}" + echo "MODNR=${MODNR}" +} diff --git a/ush/wave_extractvars.sh b/ush/wave_extractvars.sh index 32ee44986b..cad65f777d 100755 --- a/ush/wave_extractvars.sh +++ b/ush/wave_extractvars.sh @@ -10,6 +10,11 @@ ####################### source "${USHgfs}/preamble.sh" +source "${USHgfs}/wave_domain_grid.sh" + +process_grdID "${waveGRD}" +com_varname="COMIN_WAVE_GRID_${GRDREGION}_${GRDRES}" +com_dir=${!com_varname} subdata=${1} @@ -18,7 +23,7 @@ subdata=${1} for (( nh = FHOUT_WAV_EXTRACT; nh <= FHMAX_WAV; nh = nh + FHOUT_WAV_EXTRACT )); do fnh=$(printf "%3.3d" "${nh}") - infile=${COMIN_WAVE_GRID}/${RUN}wave.t${cyc}z.global.${wavres}.f${fnh}.grib2 + infile=${com_dir}/${RUN}wave.t${cyc}z.global.${wavres}.f${fnh}.grib2 outfile=${subdata}/${RUN}wave.t${cyc}z.global.${wavres}.f${fnh}.grib2 rm -f "${outfile}" # Remove outfile if it already exists before extraction diff --git a/ush/wave_grib2_sbs.sh b/ush/wave_grib2_sbs.sh index 22eb361a0d..60e8d2a337 100755 --- a/ush/wave_grib2_sbs.sh +++ b/ush/wave_grib2_sbs.sh @@ -71,8 +71,19 @@ ENSTAG="" if [[ -n ${waveMEMB} ]]; then ENSTAG=".${membTAG}${waveMEMB}" ; fi outfile="${WAV_MOD_TAG}.${cycle}${ENSTAG}.${grdnam}.${grdres}.f${FH3}.grib2" +#create the COM directory var +com_varname="COMOUT_WAVE_GRID_${grdnam}_${grdres}" +com_dir="${!com_varname}" + +# Check if the COM directory exists, create it if necessary +if [[ ! -d "${com_dir}" ]]; then + mkdir -p -m "${com_dir}" + echo "Directory ${com_dir} created." +else + echo "Directory ${com_dir} already exists." +fi # Only create file if not present in COM -if [[ ! -s "${COMOUT_WAVE_GRID}/${outfile}.idx" ]]; then +if [[ ! -s "${com_dir}/${outfile}.idx" ]]; then set +x echo ' ' @@ -83,7 +94,7 @@ if [[ ! -s "${COMOUT_WAVE_GRID}/${outfile}.idx" ]]; then set_trace if [[ -z "${PDY}" ]] || [[ -z ${cyc} ]] || [[ -z "${cycle}" ]] || [[ -z "${EXECgfs}" ]] || \ - [[ -z "${COMOUT_WAVE_GRID}" ]] || [[ -z "${WAV_MOD_TAG}" ]] || [[ -z "${gribflags}" ]] || \ + [[ -z "${com_dir}" ]] || [[ -z "${WAV_MOD_TAG}" ]] || [[ -z "${gribflags}" ]] || \ [[ -z "${GRIDNR}" ]] || [[ -z "${MODNR}" ]] || \ [[ -z "${SENDDBN}" ]]; then set +x @@ -158,11 +169,11 @@ if [[ ! -s "${COMOUT_WAVE_GRID}/${outfile}.idx" ]]; then fi if (( fhr > 0 )); then - ${WGRIB2} gribfile -set_date "${PDY}${cyc}" -set_ftime "${fhr} hour fcst" -grib "${COMOUT_WAVE_GRID}/${outfile}" + ${WGRIB2} gribfile -set_date "${PDY}${cyc}" -set_ftime "${fhr} hour fcst" -grib "${com_dir}/${outfile}" err=$? else ${WGRIB2} gribfile -set_date "${PDY}${cyc}" -set_ftime "${fhr} hour fcst" \ - -set table_1.4 1 -set table_1.2 1 -grib "${COMOUT_WAVE_GRID}/${outfile}" + -set table_1.4 1 -set table_1.2 1 -grib "${com_dir}/${outfile}" err=$? fi @@ -178,7 +189,7 @@ if [[ ! -s "${COMOUT_WAVE_GRID}/${outfile}.idx" ]]; then fi # Create index - ${WGRIB2} -s "${COMOUT_WAVE_GRID}/${outfile}" > "${COMOUT_WAVE_GRID}/${outfile}.idx" + ${WGRIB2} -s "${com_dir}/${outfile}" > "${com_dir}/${outfile}.idx" # Create grib2 subgrid is this is the source grid if [[ "${grdID}" = "${WAV_SUBGRBSRC}" ]]; then @@ -187,14 +198,14 @@ if [[ ! -s "${COMOUT_WAVE_GRID}/${outfile}.idx" ]]; then subgrbnam=$(echo ${!subgrb} | cut -d " " -f 21) subgrbres=$(echo ${!subgrb} | cut -d " " -f 22) subfnam="${WAV_MOD_TAG}.${cycle}${ENSTAG}.${subgrbnam}.${subgrbres}.f${FH3}.grib2" - ${COPYGB2} -g "${subgrbref}" -i0 -x "${COMOUT_WAVE_GRID}/${outfile}" "${COMOUT_WAVE_GRID}/${subfnam}" - ${WGRIB2} -s "${COMOUT_WAVE_GRID}/${subfnam}" > "${COMOUT_WAVE_GRID}/${subfnam}.idx" + ${COPYGB2} -g "${subgrbref}" -i0 -x "${com_dir}/${outfile}" "${com_dir}/${subfnam}" + ${WGRIB2} -s "${com_dir}/${subfnam}" > "${com_dir}/${subfnam}.idx" done fi # 1.e Save in /com - if [[ ! -s "${COMOUT_WAVE_GRID}/${outfile}" ]]; then + if [[ ! -s "${com_dir}/${outfile}" ]]; then set +x echo ' ' echo '********************************************* ' @@ -206,7 +217,7 @@ if [[ ! -s "${COMOUT_WAVE_GRID}/${outfile}.idx" ]]; then set_trace exit 4 fi - if [[ ! -s "${COMOUT_WAVE_GRID}/${outfile}.idx" ]]; then + if [[ ! -s "${com_dir}/${outfile}.idx" ]]; then set +x echo ' ' echo '*************************************************** ' @@ -221,11 +232,11 @@ if [[ ! -s "${COMOUT_WAVE_GRID}/${outfile}.idx" ]]; then if [[ "${SENDDBN}" = 'YES' ]] && [[ ${outfile} != *global.0p50* ]]; then set +x - echo " Alerting GRIB file as ${COMOUT_WAVE_GRID}/${outfile}" - echo " Alerting GRIB index file as ${COMOUT_WAVE_GRID}/${outfile}.idx" + echo " Alerting GRIB file as ${com_dir}/${outfile}" + echo " Alerting GRIB index file as ${com_dir}/${outfile}.idx" set_trace - "${DBNROOT}/bin/dbn_alert" MODEL "${alertName}_WAVE_GB2" "${job}" "${COMOUT_WAVE_GRID}/${outfile}" - "${DBNROOT}/bin/dbn_alert" MODEL "${alertName}_WAVE_GB2_WIDX" "${job}" "${COMOUT_WAVE_GRID}/${outfile}.idx" + "${DBNROOT}/bin/dbn_alert" MODEL "${alertName}_WAVE_GB2" "${job}" "${com_dir}/${outfile}" + "${DBNROOT}/bin/dbn_alert" MODEL "${alertName}_WAVE_GB2_WIDX" "${job}" "${com_dir}/${outfile}.idx" else echo "${outfile} is global.0p50 or SENDDBN is NO, no alert sent" fi @@ -246,7 +257,7 @@ if [[ ! -s "${COMOUT_WAVE_GRID}/${outfile}.idx" ]]; then else set +x echo ' ' - echo " File ${COMOUT_WAVE_GRID}/${outfile} found, skipping generation process" + echo " File ${com_dir}/${outfile} found, skipping generation process" echo ' ' set_trace fi diff --git a/versions/build.gaea.ver b/versions/build.gaeac5.ver similarity index 74% rename from versions/build.gaea.ver rename to versions/build.gaeac5.ver index 8b6e641eb6..1b473aa297 100644 --- a/versions/build.gaea.ver +++ b/versions/build.gaeac5.ver @@ -1,5 +1,5 @@ -export stack_intel_ver=2023.1.0 -export stack_cray_mpich_ver=8.1.25 +export stack_intel_ver=2023.2.0 +export stack_cray_mpich_ver=8.1.28 export spack_env=gsi-addon-dev source "${HOMEgfs:-}/versions/spack.ver" export spack_mod_path="/ncrc/proj/epic/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core" diff --git a/versions/build.gaeac6.ver b/versions/build.gaeac6.ver new file mode 100644 index 0000000000..33f8f3f756 --- /dev/null +++ b/versions/build.gaeac6.ver @@ -0,0 +1,5 @@ +export stack_intel_ver=2023.2.0 +export stack_cray_mpich_ver=8.1.29 +export spack_env=gsi-addon-dev +source "${HOMEgfs:-}/versions/spack.ver" +export spack_mod_path="/ncrc/proj/epic/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core" diff --git a/versions/run.gaea.ver b/versions/run.gaeac5.ver similarity index 76% rename from versions/run.gaea.ver rename to versions/run.gaeac5.ver index 81aa70df57..9d4075f334 100644 --- a/versions/run.gaea.ver +++ b/versions/run.gaeac5.ver @@ -1,5 +1,5 @@ -export stack_intel_ver=2023.1.0 -export stack_cray_mpich_ver=8.1.25 +export stack_intel_ver=2023.2.0 +export stack_cray_mpich_ver=8.1.28 export spack_env=gsi-addon-dev export perl_ver=5.38.2 diff --git a/versions/run.gaeac6.ver b/versions/run.gaeac6.ver new file mode 100644 index 0000000000..4162cc63e3 --- /dev/null +++ b/versions/run.gaeac6.ver @@ -0,0 +1,8 @@ +export stack_intel_ver=2023.2.0 +export stack_cray_mpich_ver=8.1.29 +export spack_env=gsi-addon + +export perl_ver=5.38.2 + +source "${HOMEgfs:-}/versions/spack.ver" +export spack_mod_path="/ncrc/proj/epic/spack-stack/c6/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core" diff --git a/workflow/applications/applications.py b/workflow/applications/applications.py index 22e299df20..88be488b47 100644 --- a/workflow/applications/applications.py +++ b/workflow/applications/applications.py @@ -102,6 +102,9 @@ def _get_run_options(self, conf: Configuration) -> Dict[str, Any]: run_options[run]['do_hpssarch'] = run_base.get('HPSSARCH', False) run_options[run]['fcst_segments'] = run_base.get('FCST_SEGMENTS', None) + run_options[run]['do_fetch_hpss'] = run_base.get('DO_FETCH_HPSS', False) + run_options[run]['do_fetch_local'] = run_base.get('DO_FETCH_LOCAL', False) + if not AppConfig.is_monotonic(run_options[run]['fcst_segments']): raise ValueError(f'Forecast segments do not increase monotonically: {",".join(self.fcst_segments)}') diff --git a/workflow/applications/gfs_forecast_only.py b/workflow/applications/gfs_forecast_only.py index de1c8cef27..7409d4adec 100644 --- a/workflow/applications/gfs_forecast_only.py +++ b/workflow/applications/gfs_forecast_only.py @@ -28,8 +28,12 @@ def _get_app_configs(self, run): Returns the config_files that are involved in the forecast-only app """ + configs = [] options = self.run_options[run] - configs = ['stage_ic', 'fcst', 'arch', 'cleanup'] + if options['do_fetch_hpss'] or options['do_fetch_local']: + configs += ['fetch'] + + configs += ['stage_ic', 'fcst', 'arch', 'cleanup'] if options['do_atm']: @@ -98,15 +102,22 @@ def get_task_names(self): This is the place where that order is set. """ - tasks = ['stage_ic'] options = self.run_options[self.run] + tasks = [] + + if options['do_fetch_hpss'] or options['do_fetch_local']: + tasks += ['fetch'] + + tasks += ['stage_ic'] + if options['do_aero_fcst'] and not options['exp_warm_start']: tasks += ['aerosol_init'] if options['do_wave']: tasks += ['waveinit'] - # tasks += ['waveprep'] # TODO - verify if waveprep is executed in forecast-only mode when APP=ATMW|S2SW + # tasks += ['waveprep'] # TODO - verify if waveprep is executed in ... + # ... forecast-only mode when APP=ATMW|S2SW tasks += ['fcst'] diff --git a/workflow/hosts.py b/workflow/hosts.py index 7bde58f95f..37a7e53066 100644 --- a/workflow/hosts.py +++ b/workflow/hosts.py @@ -16,8 +16,8 @@ class Host: """ SUPPORTED_HOSTS = ['HERA', 'ORION', 'JET', 'HERCULES', - 'WCOSS2', 'S4', 'CONTAINER', 'GAEA', - 'AWSPW', 'AZUREPW', 'GOOGLEPW'] + 'WCOSS2', 'S4', 'CONTAINER', 'GAEAC5', + 'GAEAC6', 'AWSPW', 'AZUREPW', 'GOOGLEPW'] def __init__(self, host=None): @@ -49,7 +49,9 @@ def detect(cls): elif os.path.exists('/data/prod'): machine = 'S4' elif os.path.exists('/gpfs/f5'): - machine = 'GAEA' + machine = 'GAEAC5' + elif os.path.exists('/gpfs/f6'): + machine = 'GAEAC6' elif container is not None: machine = 'CONTAINER' elif pw_csp is not None: diff --git a/workflow/hosts/azurepw.yaml b/workflow/hosts/azurepw.yaml index d7c064dc60..abab09b414 100644 --- a/workflow/hosts/azurepw.yaml +++ b/workflow/hosts/azurepw.yaml @@ -26,5 +26,6 @@ MAKE_NSSTBUFR: 'NO' MAKE_ACFTBUFR: 'NO' DO_TRACKER: 'NO' DO_GENESIS: 'NO' -DO_METP: 'NO' +DO_METP: 'NO' SUPPORTED_RESOLUTIONS: ['C48', 'C96', 'C384', 'C768'] # TODO: Test and support all cubed-sphere resolutions. + diff --git a/workflow/hosts/gaea.yaml b/workflow/hosts/gaeac5.yaml similarity index 76% rename from workflow/hosts/gaea.yaml rename to workflow/hosts/gaeac5.yaml index 23ac75ca03..8131a8642b 100644 --- a/workflow/hosts/gaea.yaml +++ b/workflow/hosts/gaeac5.yaml @@ -3,8 +3,7 @@ DMPDIR: '/gpfs/f5/ufs-ard/world-shared/global/glopara/data/dump' BASE_DATA: '/gpfs/f5/ufs-ard/world-shared/global/glopara/data' BASE_IC: '/gpfs/f5/ufs-ard/world-shared/global/glopara/data/ICSDIR' PACKAGEROOT: '/gpfs/f5/ufs-ard/world-shared/global/glopara/data/nwpara' -COMROOT: '/gpfs/f5/ufs-ard/world-shared/global/glopara/data/com' -COMINsyn: '${COMROOT}/gfs/prod/syndat' +COMINsyn: '/gpfs/f5/ufs-ard/world-shared/global/glopara/data/com/gfs/prod/syndat' HOMEDIR: '/gpfs/f5/ufs-ard/scratch/${USER}' STMP: '/gpfs/f5/ufs-ard/scratch/${USER}' PTMP: '/gpfs/f5/ufs-ard/scratch/${USER}' @@ -25,5 +24,5 @@ LOCALARCH: 'NO' ATARDIR: '${NOSCRUB}/archive_rotdir/${PSLOT}' MAKE_NSSTBUFR: 'NO' MAKE_ACFTBUFR: 'NO' -SUPPORTED_RESOLUTIONS: ['C1152', 'C768', 'C384', 'C192', 'C96', 'C48'] -AERO_INPUTS_DIR: /gpfs/f5/epic/proj-shared/global/glopara/data/gocart_emissions +SUPPORTED_RESOLUTIONS: ['C384', 'C192', 'C96', 'C48'] +AERO_INPUTS_DIR: '/gpfs/f5/ufs-ard/world-shared/global/glopara/data/gocart_emissions' diff --git a/workflow/hosts/gaeac6.yaml b/workflow/hosts/gaeac6.yaml new file mode 100644 index 0000000000..fed31634bf --- /dev/null +++ b/workflow/hosts/gaeac6.yaml @@ -0,0 +1,27 @@ +BASE_GIT: '/gpfs/f6/bil-fire8/world-shared/global/glopara/git' +DMPDIR: '/gpfs/f6/bil-fire8/world-shared/global/glopara/dump' +BASE_DATA: '/gpfs/f6/bil-fire8/world-shared/global/glopara' +BASE_IC: '/gpfs/f6/bil-fire8/world-shared/global/glopara/data/ICSDIR' +PACKAGEROOT: '/gpfs/f6/bil-fire8/world-shared/global/glopara/nwpara' +COMINsyn: '/gpfs/f6/bil-fire8/world-shared/global/glopara/com/syndat' +HOMEDIR: '/gpfs/f6/bil-fire8/scratch/${USER}' +STMP: '/gpfs/f6/bil-fire8/scratch/${USER}' +PTMP: '/gpfs/f6/bil-fire8/scratch/${USER}' +NOSCRUB: $HOMEDIR +ACCOUNT: bil-fire8 +SCHEDULER: slurm +QUEUE: normal +QUEUE_SERVICE: normal +PARTITION_BATCH: batch +PARTITION_SERVICE: batch +RESERVATION: '' +CLUSTERS: 'c6' +CHGRP_RSTPROD: 'NO' +CHGRP_CMD: 'chgrp rstprod' +HPSSARCH: 'NO' +HPSS_PROJECT: emc-global +LOCALARCH: 'NO' +ATARDIR: '${NOSCRUB}/archive_rotdir/${PSLOT}' +MAKE_NSSTBUFR: 'NO' +MAKE_ACFTBUFR: 'NO' +SUPPORTED_RESOLUTIONS: ['C384', 'C192', 'C96', 'C48'] diff --git a/workflow/hosts/s4.yaml b/workflow/hosts/s4.yaml index 2e77c112b1..bd7f7d0b5f 100644 --- a/workflow/hosts/s4.yaml +++ b/workflow/hosts/s4.yaml @@ -26,3 +26,4 @@ MAKE_NSSTBUFR: 'YES' MAKE_ACFTBUFR: 'YES' SUPPORTED_RESOLUTIONS: ['C384', 'C192', 'C96', 'C48'] AERO_INPUTS_DIR: /data/prod/glopara/gocart_emissions + diff --git a/workflow/rocoto/gfs_tasks.py b/workflow/rocoto/gfs_tasks.py index 768512ba39..389d157df2 100644 --- a/workflow/rocoto/gfs_tasks.py +++ b/workflow/rocoto/gfs_tasks.py @@ -16,8 +16,37 @@ def _is_this_a_gdas_task(run, task_name): raise TypeError(f'{task_name} must be part of the "enkfgdas" cycle and not {run}') # Specific Tasks begin here + def fetch(self): + + cycledef = 'gdas_half' if self.run in ['gdas', 'enkfgdas'] else self.run + + resources = self.get_resource('fetch') + task_name = f'{self.run}_fetch' + task_dict = {'task_name': task_name, + 'resources': resources, + 'envars': self.envars, + 'cycledef': cycledef, + 'command': f'{self.HOMEgfs}/jobs/rocoto/fetch.sh', + 'job_name': f'{self.pslot}_{task_name}_@H', + 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log', + 'maxtries': '&MAXTRIES;' + } + + task = rocoto.create_task(task_dict) + + return task + def stage_ic(self): + dependencies = None + if self.options['do_fetch_hpss'] or self.options['do_fetch_local']: + deps = [] + dep_dict = { + 'type': 'task', 'name': f'{self.run}_fetch', + } + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep=deps) + cycledef = 'gdas_half' if self.run in ['gdas', 'enkfgdas'] else self.run resources = self.get_resource('stage_ic') @@ -29,7 +58,8 @@ def stage_ic(self): 'command': f'{self.HOMEgfs}/jobs/rocoto/stage_ic.sh', 'job_name': f'{self.pslot}_{task_name}_@H', 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log', - 'maxtries': '&MAXTRIES;' + 'maxtries': '&MAXTRIES;', + 'dependency': dependencies } task = rocoto.create_task(task_dict) @@ -1064,7 +1094,7 @@ def goesupp(self): def _upptask(self, upp_run="forecast", task_id="atmupp"): - VALID_UPP_RUN = ["forecast", "goes", "wafs"] + VALID_UPP_RUN = ["forecast", "goes"] if upp_run not in VALID_UPP_RUN: raise KeyError(f"{upp_run} is invalid; UPP_RUN options are: {('|').join(VALID_UPP_RUN)}") @@ -1203,7 +1233,7 @@ def wavepostsbs(self): deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps, dep_condition='or') - fhrs = self._get_forecast_hours('gfs', self._configs['wavepostsbs'], 'wave') + fhrs = self._get_forecast_hours(self.run, self._configs['wavepostsbs'], 'wave') max_tasks = self._configs['wavepostsbs']['MAX_TASKS'] fhr_var_dict = self.get_grouped_fhr_dict(fhrs=fhrs, ngroups=max_tasks) @@ -2919,12 +2949,14 @@ def earc(self): deps = [] if 'enkfgdas' in self.run: dep_dict = {'type': 'metatask', 'name': f'{self.run}_epmn'} - else: + deps.append(rocoto.add_dependency(dep_dict)) + dep_dict = {'type': 'task', 'name': f'{self.run}_echgres'} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) + else: # early cycle enkf run (enkfgfs) dep_dict = {'type': 'task', 'name': f'{self.run}_esfc'} - deps.append(rocoto.add_dependency(dep_dict)) - dep_dict = {'type': 'task', 'name': f'{self.run}_echgres'} - deps.append(rocoto.add_dependency(dep_dict)) - dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep=deps) earcenvars = self.envars.copy() earcenvars.append(rocoto.create_envar(name='ENSGRP', value='#grp#')) diff --git a/workflow/rocoto/tasks.py b/workflow/rocoto/tasks.py index 3c215414b5..c491f26800 100644 --- a/workflow/rocoto/tasks.py +++ b/workflow/rocoto/tasks.py @@ -11,8 +11,8 @@ class Tasks: - SERVICE_TASKS = ['arch', 'earc', 'stage_ic', 'cleanup'] - VALID_TASKS = ['aerosol_init', 'stage_ic', + SERVICE_TASKS = ['arch', 'earc', 'stage_ic', 'fetch', 'cleanup'] + VALID_TASKS = ['aerosol_init', 'stage_ic', 'fetch', 'prep', 'anal', 'sfcanl', 'analcalc', 'analdiag', 'arch', "cleanup", 'prepatmiodaobs', 'atmanlinit', 'atmanlvar', 'atmanlfv3inc', 'atmanlfinal', 'prepoceanobs',