diff --git a/.gitmodules b/.gitmodules index fc87e5f3655..eef6d0fc780 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,7 +10,8 @@ url = https://github.com/NOAA-EMC/gfs-utils [submodule "sorc/ufs_utils.fd"] path = sorc/ufs_utils.fd - url = https://github.com/ufs-community/UFS_UTILS.git + url = https://github.com/ClaraDraper-NOAA/UFS_UTILS.git + branch = feature/speedup_sfcanl [submodule "sorc/verif-global.fd"] path = sorc/verif-global.fd url = https://github.com/NOAA-EMC/EMC_verif-global.git diff --git a/dev/job_cards/rocoto/sfcanl.sh b/dev/job_cards/rocoto/sfcanl_gcycle.sh similarity index 84% rename from dev/job_cards/rocoto/sfcanl.sh rename to dev/job_cards/rocoto/sfcanl_gcycle.sh index d6738fe3a11..0bb64ecf959 100755 --- a/dev/job_cards/rocoto/sfcanl.sh +++ b/dev/job_cards/rocoto/sfcanl_gcycle.sh @@ -10,12 +10,12 @@ if [[ ${status} -ne 0 ]]; then exit "${status}" fi -export job="sfcanl" +export job="sfcanlg" export jobid="${job}.$$" ############################################################### # Execute the JJOB -"${HOMEgfs}/dev/jobs/JGLOBAL_ATMOS_SFCANL" +"${HOMEgfs}/dev/jobs/JGLOBAL_ATMOS_SFCANL_GCYCLE" status=$? exit "${status}" diff --git a/dev/job_cards/rocoto/sfcanl_regrid.sh b/dev/job_cards/rocoto/sfcanl_regrid.sh new file mode 100755 index 00000000000..5738b13df90 --- /dev/null +++ b/dev/job_cards/rocoto/sfcanl_regrid.sh @@ -0,0 +1,21 @@ +#! /usr/bin/env bash + +set -x + +############################################################### +# Source FV3GFS workflow modules +source "${HOMEgfs}/dev/ush/load_modules.sh" run +status=$? +if [[ ${status} -ne 0 ]]; then + exit "${status}" +fi + +export job="sfcanlr" +export jobid="${job}.$$" + +############################################################### +# Execute the JJOB +"${HOMEgfs}/dev/jobs/JGLOBAL_ATMOS_SFCANL_REGRID" +status=$? + +exit "${status}" diff --git a/dev/jobs/JGLOBAL_ATMOS_SFCANL_GCYCLE b/dev/jobs/JGLOBAL_ATMOS_SFCANL_GCYCLE new file mode 100755 index 00000000000..5f1ffdda3df --- /dev/null +++ b/dev/jobs/JGLOBAL_ATMOS_SFCANL_GCYCLE @@ -0,0 +1,67 @@ +#! /usr/bin/env bash + +# for now, leave environment and config files un-changed. +source "${HOMEgfs}/ush/jjob_header.sh" -e "sfcanl" -c "base sfcanl" + +############################################## +# Begin JOB SPECIFIC work +############################################## +# Ignore possible spelling error (nothing is misspelled) +# shellcheck disable=SC2153 +GDATE=$(date --utc -d "${PDY} ${cyc} - ${assim_freq} hours" +%Y%m%d%H) +export GDATE + +BKG_RUN="gdas" +if [[ "${RUN}" == "gcafs" || "${RUN}" == "gcdas" ]]; then + BKG_RUN="gcdas" +fi + +RUN=${BKG_RUN} YMD=${GDATE:0:8} HH=${GDATE:8:2} declare_from_tmpl -rx \ + COMIN_OBS_PREV:COM_OBS_TMPL \ + COMIN_ATMOS_RESTART_PREV:COM_ATMOS_RESTART_TMPL + +YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \ + COMIN_OBS:COM_OBS_TMPL \ + COMIN_ATMOS_ANALYSIS:COM_ATMOS_ANALYSIS_TMPL \ + COMIN_SNOW_ANALYSIS:COM_SNOW_ANALYSIS_TMPL + +YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \ + COMOUT_ATMOS_RESTART:COM_ATMOS_RESTART_TMPL + +RUN="enkfgdas" MEMDIR="ensstat" YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \ + COMIN_ATMOS_ENKF_ANALYSIS_STAT:COM_ATMOS_ANALYSIS_TMPL + +mkdir -p "${COMOUT_ATMOS_RESTART}" + +# Use CFP to stage and save files in parallel +export USE_CFP=YES + +############################################################### +# Run relevant script + +${SFCANALSH:-${SCRgfs}/exglobal_atmos_sfcanl_gcycle.sh} && true +export err=$? +if [[ ${err} -ne 0 ]]; then + err_exit +fi + +############################################## +# End JOB SPECIFIC work +############################################## + +############################################## +# Final processing +############################################## +if [[ -e "${pgmout}" ]]; then + cat "${pgmout}" +fi + +########################################## +# Remove the Temporary working directory +########################################## +cd "${DATAROOT}" || true +if [[ "${KEEPDATA}" == "NO" ]]; then + rm -rf "${DATA}" +fi + +exit 0 diff --git a/dev/jobs/JGLOBAL_ATMOS_SFCANL b/dev/jobs/JGLOBAL_ATMOS_SFCANL_REGRID similarity index 96% rename from dev/jobs/JGLOBAL_ATMOS_SFCANL rename to dev/jobs/JGLOBAL_ATMOS_SFCANL_REGRID index 59f542b729d..33b7f6ff4d4 100755 --- a/dev/jobs/JGLOBAL_ATMOS_SFCANL +++ b/dev/jobs/JGLOBAL_ATMOS_SFCANL_REGRID @@ -38,7 +38,7 @@ export USE_CFP=YES ############################################################### # Run relevant script -${SFCANALSH:-${SCRgfs}/exglobal_atmos_sfcanl.sh} && true +${SFCANALSH:-${SCRgfs}/exglobal_atmos_sfcanl_regrid.sh} && true export err=$? if [[ ${err} -ne 0 ]]; then err_exit diff --git a/dev/parm/config/gfs/config.esfc b/dev/parm/config/gfs/config.esfc index 0c35240dc31..68a055597ef 100644 --- a/dev/parm/config/gfs/config.esfc +++ b/dev/parm/config/gfs/config.esfc @@ -26,11 +26,6 @@ if [[ "${DO_JEDIATMENS}" == "YES" || "${DO_JEDIATMVAR}" == "YES" ]]; then export DONST="NO" fi -if [[ "${RUN/enkf}" == "gfs" ]]; then - echo "turning off gsi soilda for gfs run" - DO_GSISOILDA="NO" -fi - # set up soil analysis if [[ ${DO_GSISOILDA} == "YES" ]]; then if [[ "${DO_LAND_IAU}" = ".true." ]]; then @@ -38,7 +33,6 @@ if [[ ${DO_GSISOILDA} == "YES" ]]; then else export GCYCLE_DO_SOILINCR=".true." fi - export GCYCLE_INTERP_LANDINCR=".false." export REGRID_EXEC="${HOMEgfs}/exec/regridStates.x" fi diff --git a/dev/parm/config/gfs/config.sfcanl b/dev/parm/config/gfs/config.sfcanl index 563804500ac..ddfa69c4eee 100644 --- a/dev/parm/config/gfs/config.sfcanl +++ b/dev/parm/config/gfs/config.sfcanl @@ -18,18 +18,12 @@ if [[ "${DO_JEDIATMVAR}" == "YES" ]]; then export DONST="NO" fi -if [[ "${RUN/enkf}" == "gfs" ]]; then - echo "turning off gsi soilda for gfs run" - DO_GSISOILDA="NO" -fi - if [[ "${DO_GSISOILDA}" == "YES" ]]; then if [[ ${DO_LAND_IAU} = ".true." ]]; then export GCYCLE_DO_SOILINCR=".false." else export GCYCLE_DO_SOILINCR=".true." fi - export GCYCLE_INTERP_LANDINCR=".false." export REGRID_EXEC="${HOMEgfs}/exec/regridStates.x" fi diff --git a/dev/scripts/exglobal_atmos_sfcanl.sh b/dev/scripts/exglobal_atmos_sfcanl_gcycle.sh similarity index 78% rename from dev/scripts/exglobal_atmos_sfcanl.sh rename to dev/scripts/exglobal_atmos_sfcanl_gcycle.sh index 3516f4f0018..33d896b5122 100755 --- a/dev/scripts/exglobal_atmos_sfcanl.sh +++ b/dev/scripts/exglobal_atmos_sfcanl_gcycle.sh @@ -3,12 +3,14 @@ ################################################################################ #### UNIX Script Documentation Block # . . -# Script name: exglobal_atmos_sfcanl.sh -# Script description: Makes global model surface analysis files +# Script name: exglobal_atmos_sfcanl_gcycle.sh +# Script description: Updates global surface analysis files +# with global_cycle program # # Author: Russ Treadon Org: NCEP/EMC Date: 2021-12-13 # -# Abstract: This script makes global model surface analysis files +# Abstract: This script updates global model surface analysis files +# using global_cycle # # $Id$ # @@ -17,13 +19,8 @@ # ################################################################################ -# Set environment. - -# Derived base variables - # Dependent Scripts and Executables CYCLESH=${CYCLESH:-"${USHgfs}/global_cycle.sh"} -REGRIDSH=${REGRIDSH:-"${USHgfs}/regrid_gsiSfcIncr_to_tile.sh"} export CYCLEXEC=${CYCLEXEC:-"${EXECgfs}/global_cycle"} NTHREADS_CYCLE=${NTHREADS_CYCLE:-24} APRUN_CYCLE=${APRUN_CYCLE:-${APRUN:-""}} @@ -125,54 +122,23 @@ fi # Collect the dates in the window to update surface restarts gcycle_dates=("${PDY}${cyc}") # Always update surface restarts at middle of window -soilinc_fhrs=("${assim_freq}") # increment file at middle of window -LFHR="${assim_freq}" if [[ "${DOIAU:-}" == "YES" ]]; then # Update surface restarts at beginning of window half_window=$((assim_freq / 2)) - soilinc_fhrs+=("${half_window}") - LFHR=-1 BDATE=$(date --utc -d "${PDY} ${cyc} - ${half_window} hours" +%Y%m%d%H) gcycle_dates+=("${BDATE}") fi -# if doing GSI soil anaysis, copy increment file and re-grid it to native model resolution -if [[ "${DO_GSISOILDA}" == "YES" ]]; then - - export COMIN_SOIL_ANALYSIS_MEM="${COMIN_ATMOS_ENKF_ANALYSIS_STAT}" - export COMOUT_ATMOS_ANALYSIS_MEM="${COMIN_ATMOS_ANALYSIS}" - export CASE_IN="${CASE_ENS}" - export CASE_OUT="${CASE}" - export OCNRES_OUT="${OCNRES}" - export LFHR - - "${REGRIDSH}" - export err=$? - if [[ ${err} -ne 0 ]]; then - err_exit "Soil increment file was not regridded correctly!" - fi - -fi - # Loop over the dates in the window to update the surface restarts for hr in "${!gcycle_dates[@]}"; do gcycle_date="${gcycle_dates[hr]}" - FHR="${soilinc_fhrs[hr]}" echo "Updating surface restarts for ${gcycle_date} ..." datestr="${gcycle_date:0:8}.${gcycle_date:8:2}0000" - if [[ "${DO_GSISOILDA}" == "YES" ]] && [[ "${GCYCLE_DO_SOILINCR}" == ".true." ]]; then - for ((nn = 1; nn <= ntiles; nn++)); do - cpreq "${COMIN_ATMOS_ANALYSIS}/increment.sfc.i00${FHR}.tile${nn}.nc" \ - "${DATA}/soil_xainc.00${nn}" - done - fi - # Copy inputs from COMIN to DATA for ((nn = 1; nn <= ntiles; nn++)); do - cpreq "${sfcdata_dir}/${datestr}.${snow_prefix}sfc_data.tile${nn}.nc" "${DATA}/fnbgsi.00${nn}" - cpreq "${DATA}/fnbgsi.00${nn}" "${DATA}/fnbgso.00${nn}" + cpreq "${sfcdata_dir}/${datestr}.${snow_prefix}sfc_data.tile${nn}.nc" "${DATA}/sfc_data_cycle.00${nn}" done "${CYCLESH}" && true @@ -183,7 +149,7 @@ for hr in "${!gcycle_dates[@]}"; do # Copy outputs from DATA to COMOUT for ((nn = 1; nn <= ntiles; nn++)); do - cpfs "${DATA}/fnbgso.00${nn}" "${COMOUT_ATMOS_RESTART}/${datestr}.sfcanl_data.tile${nn}.nc" + cpfs "${DATA}/sfc_data_cycle.00${nn}" "${COMOUT_ATMOS_RESTART}/${datestr}.sfcanl_data.tile${nn}.nc" done done diff --git a/dev/scripts/exglobal_atmos_sfcanl_regrid.sh b/dev/scripts/exglobal_atmos_sfcanl_regrid.sh new file mode 100755 index 00000000000..820ae24fe81 --- /dev/null +++ b/dev/scripts/exglobal_atmos_sfcanl_regrid.sh @@ -0,0 +1,53 @@ +#! /usr/bin/env bash + +################################################################################ +#### UNIX Script Documentation Block +# . . +# Script name: exglobal_atmos_sfcanl_regrid.sh +# Script description: Regrids land increments generated by GSI +# +# Author: Russ Treadon Org: NCEP/EMC Date: 2021-12-13 +# +# Abstract: Regrids land increments generated by GSI +# +# $Id$ +# +# Attributes: +# Language: POSIX shell +# +################################################################################ + +# Dependent Scripts and Executables +REGRIDSH=${REGRIDSH:-"${USHgfs}/regrid_gsiSfcIncr_to_tile.sh"} + +if [[ "${DO_GSISOILDA}" == "YES" ]]; then + +# Collect the dates in the window to update surface restarts + soilinc_fhrs=("${assim_freq}") # increment file at middle of window + LFHR="${assim_freq}" + if [[ "${DOIAU:-}" == "YES" ]]; then # Update surface restarts at beginning of window + half_window=$((assim_freq / 2)) + soilinc_fhrs+=("${half_window}") + LFHR=-1 + fi + + export COMIN_SOIL_ANALYSIS_MEM="${COMIN_ATMOS_ENKF_ANALYSIS_STAT}" + export COMOUT_ATMOS_ANALYSIS_MEM="${COMIN_ATMOS_ANALYSIS}" + export CASE_IN="${CASE_ENS}" + export CASE_OUT="${CASE}" + export OCNRES_OUT="${OCNRES}" + export LFHR + + "${REGRIDSH}" + export err=$? + if [[ ${err} -ne 0 ]]; then + err_exit "Soil increment file was not regridded correctly!" + fi + +fi + +################################################################################ + +exit "${err}" + +################################################################################ diff --git a/dev/scripts/exglobal_enkf_sfc.sh b/dev/scripts/exglobal_enkf_sfc.sh index f386f53e9d5..678cb720486 100755 --- a/dev/scripts/exglobal_enkf_sfc.sh +++ b/dev/scripts/exglobal_enkf_sfc.sh @@ -200,8 +200,7 @@ if [[ "${DOIAU}" == "YES" ]]; then mkdir -p "${COMOUT_ATMOS_RESTART_MEM}" fi cpreq "${sfcdata_dir}/${bPDY}.${bcyc}0000.${snow_prefix}sfc_data.tile${n}.nc" \ - "${DATA}/fnbgsi.${cmem}" - cpreq "${DATA}/fnbgsi.${cmem}" "${DATA}/fnbgso.${cmem}" + "${DATA}/sfc_data_cycle.${cmem}" cpreq "${FIXgfs}/orog/${CASE}/${CASE}_grid.tile${n}.nc" "${DATA}/fngrid.${cmem}" cpreq "${FIXgfs}/orog/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile${n}.nc" "${DATA}/fnorog.${cmem}" @@ -235,7 +234,7 @@ if [[ "${DOIAU}" == "YES" ]]; then mkdir -p "${COMOUT_ATMOS_RESTART_MEM}" fi - cpfs "${DATA}/fnbgso.${cmem}" "${COMOUT_ATMOS_RESTART_MEM}/${bPDY}.${bcyc}0000.sfcanl_data.tile${n}.nc" + cpfs "${DATA}/sfc_data_cycle.${cmem}" "${COMOUT_ATMOS_RESTART_MEM}/${bPDY}.${bcyc}0000.sfcanl_data.tile${n}.nc" done # ensembles @@ -277,8 +276,7 @@ if [[ "${DOSFCANL_ENKF}" == "YES" ]]; then fi cpreq "${sfcdata_dir}/${PDY}.${cyc}0000.${snow_prefix}sfc_data.tile${n}.nc" \ - "${DATA}/fnbgsi.${cmem}" - cpreq "${DATA}/fnbgsi.${cmem}" "${DATA}/fnbgso.${cmem}" + "${DATA}/sfc_data_cycle.${cmem}" cpreq "${FIXgfs}/orog/${CASE}/${CASE}_grid.tile${n}.nc" "${DATA}/fngrid.${cmem}" cpreq "${FIXgfs}/orog/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile${n}.nc" "${DATA}/fnorog.${cmem}" @@ -311,7 +309,7 @@ if [[ "${DOSFCANL_ENKF}" == "YES" ]]; then mkdir -p "${COMOUT_ATMOS_RESTART_MEM}" fi - cpfs "${DATA}/fnbgso.${cmem}" "${COMOUT_ATMOS_RESTART_MEM}/${PDY}.${cyc}0000.sfcanl_data.tile${n}.nc" + cpfs "${DATA}/sfc_data_cycle.${cmem}" "${COMOUT_ATMOS_RESTART_MEM}/${PDY}.${cyc}0000.sfcanl_data.tile${n}.nc" done diff --git a/dev/workflow/applications/gfs_cycled.py b/dev/workflow/applications/gfs_cycled.py index 0d51aed74b4..2bc4595f3f7 100644 --- a/dev/workflow/applications/gfs_cycled.py +++ b/dev/workflow/applications/gfs_cycled.py @@ -84,6 +84,7 @@ def _get_run_options(self, conf: Configuration) -> Dict[str, Any]: run_options[run]['do_jediocnvar'] = base.get('DO_JEDIOCNVAR', False) run_options[run]['do_jedisnowda'] = base.get('DO_JEDISNOWDA', False) run_options[run]['do_gsisoilda'] = base.get('DO_GSISOILDA', False) + run_options[run]['do_gsiliau'] = base.get('DO_LAND_IAU', run_options[run]['do_gsisoilda']) run_options[run]['do_mergensst'] = base.get('DO_MERGENSST', False) return run_options @@ -261,7 +262,7 @@ def get_task_names(self): if options['do_jediocnvar']: task_names[run] += ['prepoceanobs', 'marinebmatinit', 'marinebmat', 'marineanlinit', 'marineanlvar', 'marineanlchkpt', 'marineanlfinal'] - task_names[run] += ['sfcanl'] + task_names[run] += ['sfcanl_gcycle'] if options['do_jedisnowda']: task_names[run] += ['snowanl'] @@ -280,6 +281,8 @@ def get_task_names(self): if options['do_aero_anl']: task_names[run] += ['aeroanlgenb'] + if options['do_gsisoilda']: + task_names[run] += ['sfcanl_regrid'] else: if options['do_wave']: task_names[run] += wave_prep_tasks diff --git a/dev/workflow/rocoto/gcafs_tasks.py b/dev/workflow/rocoto/gcafs_tasks.py index 4aaf7f21d43..4fc89b610fd 100644 --- a/dev/workflow/rocoto/gcafs_tasks.py +++ b/dev/workflow/rocoto/gcafs_tasks.py @@ -218,9 +218,9 @@ def offlineanl(self): return task - def sfcanl(self): + def sfcanl_gcycle(self): """ - Create a task for surface analysis (sfcanl). + Create a task for surface analysis (sfcanl_gcycle). This task performs the surface analysis step in the workflow, depending on whether JEDI atmospheric variational analysis is enabled. @@ -238,13 +238,13 @@ def sfcanl(self): dependencies = rocoto.create_dependency(dep=deps) resources = self.get_resource('sfcanl') - task_name = f'{self.run}_sfcanl' + task_name = f'{self.run}_sfcanl_gcycle' task_dict = {'task_name': task_name, 'resources': resources, 'dependency': dependencies, 'envars': self.envars, 'cycledef': 'gcdas', - 'command': f'{self.HOMEgfs}/dev/job_cards/rocoto/sfcanl.sh', + 'command': f'{self.HOMEgfs}/dev/job_cards/rocoto/sfcanl_gcycle.sh', 'job_name': f'{self.pslot}_{task_name}_@H', 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log', 'maxtries': '&MAXTRIES;' @@ -689,7 +689,7 @@ def _fcst_cycled(self): # Always group sfcanl and aeroanlfinal together with AND sfcanl_aero_deps = [] - dep_dict = {'type': 'task', 'name': f'{anldep}_sfcanl'} + dep_dict = {'type': 'task', 'name': f'{anldep}_sfcanl_gcycle'} sfcanl_aero_deps.append(rocoto.add_dependency(dep_dict)) if self.options['use_aero_anl']: dep_dict = {'type': 'task', 'name': f'{anldep}_aeroanlfinal'} diff --git a/dev/workflow/rocoto/gfs_tasks.py b/dev/workflow/rocoto/gfs_tasks.py index b7be23d5119..2d356bb4ae4 100644 --- a/dev/workflow/rocoto/gfs_tasks.py +++ b/dev/workflow/rocoto/gfs_tasks.py @@ -292,7 +292,7 @@ def anal(self): return task - def sfcanl(self): + def sfcanl_gcycle(self): deps = [] if self.options['do_jediatmvar']: @@ -303,22 +303,47 @@ def sfcanl(self): if self.options['do_jedisnowda']: dep_dict = {'type': 'task', 'name': f'{self.run}_snowanl'} deps.append(rocoto.add_dependency(dep_dict)) - if self.options['do_gsisoilda'] and self.run in ['gdas']: - dep_dict = {'type': 'task', 'name': 'enkfgdas_eupd'} + if self.options['do_gsisoilda'] and self.run in ['gdas'] and not self.options['do_gsiliau']: + dep_dict = {'type': 'task', 'name': f'{self.run}_sfcanl_regrid'} deps.append(rocoto.add_dependency(dep_dict)) - if self.options['do_jedisnowda'] or (self.options['do_gsisoilda'] and self.run in ['gdas']): + + if self.options['do_jedisnowda'] or (self.options['do_gsisoilda'] and self.run in ['gdas'] and not self.options['do_gsiliau']): dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) else: dependencies = rocoto.create_dependency(dep=deps) resources = self.get_resource('sfcanl') - task_name = f'{self.run}_sfcanl' + task_name = f'{self.run}_sfcanl_gcycle' + task_dict = {'task_name': task_name, + 'resources': resources, + 'dependency': dependencies, + 'envars': self.envars, + 'cycledef': self.run.replace('enkf', ''), + 'command': f'{self.HOMEgfs}/dev/job_cards/rocoto/sfcanl_gcycle.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 sfcanl_regrid(self): + + deps = [] + dep_dict = {'type': 'task', 'name': 'enkfgdas_eupd'} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep=deps) + + resources = self.get_resource('sfcanl') + task_name = f'{self.run}_sfcanl_regrid' task_dict = {'task_name': task_name, 'resources': resources, 'dependency': dependencies, 'envars': self.envars, 'cycledef': self.run.replace('enkf', ''), - 'command': f'{self.HOMEgfs}/dev/job_cards/rocoto/sfcanl.sh', + 'command': f'{self.HOMEgfs}/dev/job_cards/rocoto/sfcanl_regrid.sh', 'job_name': f'{self.pslot}_{task_name}_@H', 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log', 'maxtries': '&MAXTRIES;' @@ -336,8 +361,11 @@ def analcalc(self): else: dep_dict = {'type': 'task', 'name': f'{self.run}_anal'} deps.append(rocoto.add_dependency(dep_dict)) - dep_dict = {'type': 'task', 'name': f'{self.run}_sfcanl'} + dep_dict = {'type': 'task', 'name': f'{self.run}_sfcanl_gcycle'} deps.append(rocoto.add_dependency(dep_dict)) + if self.options['do_gsisoilda'] and self.run in ['gdas']: + dep_dict = {'type': 'task', 'name': f'{self.run}_sfcanl_regrid'} + deps.append(rocoto.add_dependency(dep_dict)) if self.options['do_hybvar'] and self.run in ['gdas']: dep_dict = {'type': 'task', 'name': 'enkfgdas_echgres', 'offset': f"-{timedelta_to_HMS(self._base['interval_gdas'])}"} deps.append(rocoto.add_dependency(dep_dict)) @@ -975,8 +1003,11 @@ def _fcst_forecast_only(self): def _fcst_cycled(self): deps = [] - dep_dict = {'type': 'task', 'name': f'{self.run}_sfcanl'} + dep_dict = {'type': 'task', 'name': f'{self.run}_sfcanl_gcycle'} deps.append(rocoto.add_dependency(dep_dict)) + if self.options['do_gsisoilda'] and self.run in ['gdas']: + dep_dict = {'type': 'task', 'name': f'{self.run}_sfcanl_regrid'} + deps.append(rocoto.add_dependency(dep_dict)) if self.options['do_wave']: wave_job = 'waveprep' if self.options['app'] in ['ATMW'] else 'waveinit' @@ -2909,7 +2940,7 @@ def esfc(self): dep_dict = {'type': 'task', 'name': f'{self.run}_atmensanlfinal'} deps.append(rocoto.add_dependency(dep_dict)) else: - dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf", "")}_analcalc'} + dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf", "")}_anal'} deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'task', 'name': f'{self.run}_eupd'} deps.append(rocoto.add_dependency(dep_dict)) diff --git a/dev/workflow/rocoto/tasks.py b/dev/workflow/rocoto/tasks.py index b5d48e994bb..8d9bd3332ce 100644 --- a/dev/workflow/rocoto/tasks.py +++ b/dev/workflow/rocoto/tasks.py @@ -14,7 +14,7 @@ class Tasks: SERVICE_TASKS = ['arch_vrfy', 'earc_vrfy', 'stage_ic', 'globus', 'ens_globus'] DTN_TASKS = ['arch_tars', 'earc_tars', 'fetch'] VALID_TASKS = ['aerosol_init', 'stage_ic', 'gen_control_ic', 'fetch', 'globus', 'ens_globus', - 'prep_sfc', 'prep', 'anal', 'sfcanl', 'analcalc', 'analdiag', 'arch_vrfy', 'arch_tars', 'cleanup', + 'prep_sfc', 'prep', 'anal', 'sfcanl','sfcanl', 'analcalc', 'analdiag', 'arch_vrfy', 'arch_tars', 'ecen_fv3jedi', 'analcalc_fv3jedi', 'cleanup', 'atmanlinit', 'atmanlvar', 'atmanlfv3inc', 'atmanlfinal', 'prep_emissions', 'prepoceanobs', diff --git a/parm/archive/gdas.yaml.j2 b/parm/archive/gdas.yaml.j2 index c0be51bad2a..7600134d358 100644 --- a/parm/archive/gdas.yaml.j2 +++ b/parm/archive/gdas.yaml.j2 @@ -37,8 +37,9 @@ gdas: - "logs/{{ cycle_YMDH }}/{{ RUN }}_snowanl.log" {% endif %} {% if DO_GSISOILDA %} - - "logs/{{ cycle_YMDH }}/{{ RUN }}_sfcanl.log" + - "logs/{{ cycle_YMDH }}/{{ RUN }}_sfcanlb.log" {% endif %} + - "logs/{{ cycle_YMDH }}/{{ RUN }}_sfcanla.log" # Analysis Master GRIB2 data - "{{ COMIN_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}master.analysis.grib2" diff --git a/sorc/ufs_utils.fd b/sorc/ufs_utils.fd index 0e94c23a3ac..1636b79c22f 160000 --- a/sorc/ufs_utils.fd +++ b/sorc/ufs_utils.fd @@ -1 +1 @@ -Subproject commit 0e94c23a3ac523fbfb31913b737a9d5f00dfdd21 +Subproject commit 1636b79c22f5688aeb2771c0cdea9b1736df43c5 diff --git a/ush/global_cycle.sh b/ush/global_cycle.sh index ec614f4edbc..6c349bf1c38 100755 --- a/ush/global_cycle.sh +++ b/ush/global_cycle.sh @@ -127,8 +127,6 @@ # DO_SFCCYCLE Call sfcsub routine # GCYCLE_DO_SOILINCR Call routine to add soil increments # GCYCLE_DO_SNOWINCR Call routine to add snow inrcements -# GCYCLE_INTERP_LANDINCR Flag to regrid input land increment from Gaus to native model -# grid inside gcycle # # zsea1/zsea2 When running with NST model, this is the lower/upper bound # of depth of sea temperature. In whole mm. @@ -230,7 +228,6 @@ if [[ "${GCYCLE_DO_SOILINCR}" == ".true." ]] || [[ "${GCYCLE_DO_SNOWINCR}" == ". else DO_LANDINCR=".false." fi -GCYCLE_INTERP_LANDINCR=${GCYCLE_INTERP_LANDINCR:-.false.} zsea1=${zsea1:-0} zsea2=${zsea2:-0} MAX_TASKS_CY=${MAX_TASKS_CY:-99999} @@ -335,7 +332,6 @@ cat << EOF > fort.37 NST_FILE="${NST_FILE}", DO_SOILINCR=${GCYCLE_DO_SOILINCR}, DO_SNOWINCR=${GCYCLE_DO_SNOWINCR}, - INTERP_LANDINCR=${GCYCLE_INTERP_LANDINCR}, lsoil_incr=${LSOIL_INCR}, / EOF