diff --git a/env/HERA.env b/env/HERA.env
index 09743967b55..a7270aaa5e7 100755
--- a/env/HERA.env
+++ b/env/HERA.env
@@ -52,7 +52,7 @@ if [[ "${step}" = "prep" ]] || [[ "${step}" = "prepbufr" ]]; then
export sys_tp="HERA"
export launcher_PREP="srun"
-elif [[ "${step}" = "prepsnowobs" ]]; then
+elif [[ "${step}" = "prepsnowcover" ]]; then
export APRUN_CALCFIMS="${APRUN_default}"
diff --git a/env/HERCULES.env b/env/HERCULES.env
index 9ec112c6992..809b82d1e91 100755
--- a/env/HERCULES.env
+++ b/env/HERCULES.env
@@ -50,7 +50,7 @@ case ${step} in
export sys_tp="HERCULES"
export launcher_PREP="srun"
;;
- "prepsnowobs")
+ "prepsnowcover")
export APRUN_CALCFIMS="${APRUN_default}"
;;
diff --git a/env/JET.env b/env/JET.env
index dbc249d4d6e..dc7a5688355 100755
--- a/env/JET.env
+++ b/env/JET.env
@@ -40,7 +40,7 @@ if [[ "${step}" = "prep" ]] || [[ "${step}" = "prepbufr" ]]; then
export sys_tp="JET"
export launcher_PREP="srun"
-elif [[ "${step}" = "prepsnowobs" ]]; then
+elif [[ "${step}" = "prepsnowcover" ]]; then
export APRUN_CALCFIMS="${launcher} -n 1"
diff --git a/env/ORION.env b/env/ORION.env
index 3b8053d060f..d5853fe5ad5 100755
--- a/env/ORION.env
+++ b/env/ORION.env
@@ -47,7 +47,7 @@ if [[ "${step}" = "prep" ]] || [[ "${step}" = "prepbufr" ]]; then
export sys_tp="ORION"
export launcher_PREP="srun"
-elif [[ "${step}" = "prepsnowobs" ]]; then
+elif [[ "${step}" = "prepsnowcover" ]]; then
export APRUN_CALCFIMS="${launcher} -n 1"
diff --git a/env/S4.env b/env/S4.env
index 5d5ffd23b1b..d17e3bf452d 100755
--- a/env/S4.env
+++ b/env/S4.env
@@ -40,7 +40,7 @@ if [[ "${step}" = "prep" ]] || [[ "${step}" = "prepbufr" ]]; then
export sys_tp="S4"
export launcher_PREP="srun"
-elif [[ "${step}" = "prepsnowobs" ]]; then
+elif [[ "${step}" = "prepsnowcover" ]]; then
export APRUN_CALCFIMS="${APRUN_default}"
diff --git a/env/WCOSS2.env b/env/WCOSS2.env
index cea24fb26bd..bafcb0b8c80 100755
--- a/env/WCOSS2.env
+++ b/env/WCOSS2.env
@@ -34,7 +34,7 @@ if [[ "${step}" = "prep" ]] || [[ "${step}" = "prepbufr" ]]; then
export sys_tp="wcoss2"
export launcher_PREP="mpiexec"
-elif [[ "${step}" = "prepsnowobs" ]]; then
+elif [[ "${step}" = "prepsnowcover" ]]; then
export APRUN_CALCFIMS="${APRUN_default}"
diff --git a/jobs/JGLOBAL_PREP_SNOW_OBS b/jobs/JGLOBAL_PREP_SNOWCOVER
similarity index 90%
rename from jobs/JGLOBAL_PREP_SNOW_OBS
rename to jobs/JGLOBAL_PREP_SNOWCOVER
index 0e3557697dd..e208cd0362c 100755
--- a/jobs/JGLOBAL_PREP_SNOW_OBS
+++ b/jobs/JGLOBAL_PREP_SNOWCOVER
@@ -2,7 +2,7 @@
source "${HOMEgfs}/ush/preamble.sh"
export DATA=${DATA:-${DATAROOT}/${RUN}snowanl_${cyc}}
-source "${HOMEgfs}/ush/jjob_header.sh" -e "prepsnowobs" -c "base prepsnowobs"
+source "${HOMEgfs}/ush/jjob_header.sh" -e "prepsnowcover" -c "base prepsnowcover"
##############################################
# Set variables used in the script
@@ -25,7 +25,7 @@ RUN=${GDUMP} YMD=${gPDY} HH=${gcyc} declare_from_tmpl -rx \
###############################################################
# Run relevant script
-EXSCRIPT=${GDASSNOWPREPPY:-${SCRgfs}/exglobal_prep_snow_obs.py}
+EXSCRIPT=${GDASSNOWPREPPY:-${SCRgfs}/exglobal_prep_snowcover.py}
${EXSCRIPT}
status=$?
[[ ${status} -ne 0 ]] && (echo "FATAL ERROR: Error executing ${EXSCRIPT}, ABORT!"; exit "${status}")
diff --git a/jobs/rocoto/prepsnowobs.sh b/jobs/rocoto/prepsnowcover.sh
similarity index 91%
rename from jobs/rocoto/prepsnowobs.sh
rename to jobs/rocoto/prepsnowcover.sh
index 3f23bc16a55..6f4bf51a5f1 100755
--- a/jobs/rocoto/prepsnowobs.sh
+++ b/jobs/rocoto/prepsnowcover.sh
@@ -8,7 +8,7 @@ source "${HOMEgfs}/ush/preamble.sh"
status=$?
[[ ${status} -ne 0 ]] && exit "${status}"
-export job="prepsnowobs"
+export job="prepsnowcover"
export jobid="${job}.$$"
###############################################################
@@ -21,6 +21,6 @@ export PYTHONPATH
###############################################################
# Execute the JJOB
-"${HOMEgfs}/jobs/JGLOBAL_PREP_SNOW_OBS"
+"${HOMEgfs}/jobs/JGLOBAL_PREP_SNOWCOVER"
status=$?
exit "${status}"
diff --git a/parm/config/gfs/config.prepsnowobs b/parm/config/gfs/config.prepsnowcover
similarity index 66%
rename from parm/config/gfs/config.prepsnowobs
rename to parm/config/gfs/config.prepsnowcover
index 20bdd89ddfb..12b97ca4705 100644
--- a/parm/config/gfs/config.prepsnowobs
+++ b/parm/config/gfs/config.prepsnowcover
@@ -1,12 +1,12 @@
#! /usr/bin/env bash
-########## config.prepsnowobs ##########
+########## config.prepsnowcover ##########
# Snow Obs Prep specific
-echo "BEGIN: config.prepsnowobs"
+echo "BEGIN: config.prepsnowcover"
# Get task specific resources
-. "${EXPDIR}/config.resources" prepsnowobs
+. "${EXPDIR}/config.resources" prepsnowcover
export IMS_OBS_LIST="${PARMgfs}/gdas/snow/prep/prep_ims.yaml.j2"
@@ -15,4 +15,4 @@ export FIMS_NML_TMPL="${PARMgfs}/gdas/snow/prep/fims.nml.j2"
export IMS2IODACONV="${USHgfs}/imsfv3_scf2ioda.py"
-echo "END: config.prepsnowobs"
+echo "END: config.prepsnowcover"
diff --git a/parm/config/gfs/config.resources b/parm/config/gfs/config.resources
index 79dbb487db3..e2769b1b283 100644
--- a/parm/config/gfs/config.resources
+++ b/parm/config/gfs/config.resources
@@ -12,7 +12,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 "prep prepsnowobs prepatmiodaobs"
+ echo "prep prepsnowcover prepatmiodaobs"
echo "atmanlinit atmanlvar atmanlfv3inc atmanlfinal"
echo "atmensanlinit atmensanlobs atmensanlsol atmensanlletkf atmensanlfv3inc atmensanlfinal"
echo "snowanl esnowrecen"
@@ -152,7 +152,7 @@ case ${step} in
memory="${mem_node_max}"
;;
- "prepsnowobs")
+ "prepsnowcover")
walltime="00:05:00"
ntasks=1
threads_per_task=1
diff --git a/scripts/exglobal_prep_snow_obs.py b/scripts/exglobal_prep_snowcover.py
similarity index 81%
rename from scripts/exglobal_prep_snow_obs.py
rename to scripts/exglobal_prep_snowcover.py
index aa1eb1bb7de..2637546e7c3 100755
--- a/scripts/exglobal_prep_snow_obs.py
+++ b/scripts/exglobal_prep_snowcover.py
@@ -1,8 +1,8 @@
#!/usr/bin/env python3
-# exglobal_prep_snow_obs.py
+# exglobal_prep_snowcover.py
# This script creates a SnowAnalysis object
-# and runs the prepare_GTS and prepare_IMS method
-# which perform the pre-processing for GTS and IMS data
+# and runs the prepare_IMS method which perform
+# the pre-processing for IMS data
import os
from wxflow import Logger, cast_strdict_as_dtypedict
diff --git a/workflow/applications/gfs_cycled.py b/workflow/applications/gfs_cycled.py
index da78166ede5..b515bf7eb69 100644
--- a/workflow/applications/gfs_cycled.py
+++ b/workflow/applications/gfs_cycled.py
@@ -113,7 +113,7 @@ def _get_app_configs(self):
configs += ['prepobsaero']
if self.do_jedisnowda:
- configs += ['prepsnowobs', 'snowanl']
+ configs += ['prepsnowcover', 'snowanl']
if self.do_hybvar:
configs += ['esnowrecen']
@@ -156,7 +156,7 @@ def get_task_names(self):
gdas_gfs_common_tasks_before_fcst += ['sfcanl', 'analcalc']
if self.do_jedisnowda:
- gdas_gfs_common_tasks_before_fcst += ['prepsnowobs', 'snowanl']
+ gdas_gfs_common_tasks_before_fcst += ['prepsnowcover', 'snowanl']
wave_prep_tasks = ['waveinit', 'waveprep']
wave_bndpnt_tasks = ['wavepostbndpnt', 'wavepostbndpntbll']
diff --git a/workflow/rocoto/gfs_cycled_xml.py b/workflow/rocoto/gfs_cycled_xml.py
index eef77ba7fcc..1fb59c81e5d 100644
--- a/workflow/rocoto/gfs_cycled_xml.py
+++ b/workflow/rocoto/gfs_cycled_xml.py
@@ -24,6 +24,24 @@ def get_cycledefs(self):
sdate_str = sdate.strftime("%Y%m%d%H%M")
strings.append(f'\t{sdate_str} {edate_str} {interval_str}')
+ if self._app_config.do_jedisnowda:
+ sdate = self._base['SDATE']
+ edate_snocvr = self._base['EDATE'].replace(hour=0, minute=0, second=0)
+ interval_snocvr = to_timedelta('24H')
+ assim_freq = to_timedelta("{self._base['assim_freq']}H")
+
+ is_warm_start = self._base.get('EXP_WARM_START', False)
+ first_full_cycle = sdate if is_warm_start else sdate + assim_freq
+ sdate_snocvr = (first_full_cycle if first_full_cycle.hour == 0 else
+ (first_full_cycle + interval_snocvr).replace(hour=0, minute=0, second=0))
+
+ sdate_snocvr_str = sdate_snocvr.strftime("%Y%m%d%H%M")
+ edate_snocvr_str = edate_snocvr.strftime("%Y%m%d%H%M")
+ interval_str = timedelta_to_HMS(interval_snocvr)
+
+ if sdate_snocvr <= edate_snocvr:
+ strings.append(f'\t{sdate_snocvr_str} {edate_snocvr_str} {interval_str}')
+
interval_gfs = self._app_config.interval_gfs
if interval_gfs > to_timedelta("0H"):
diff --git a/workflow/rocoto/gfs_tasks.py b/workflow/rocoto/gfs_tasks.py
index 82dfb9f1d48..78582dc3241 100644
--- a/workflow/rocoto/gfs_tasks.py
+++ b/workflow/rocoto/gfs_tasks.py
@@ -563,21 +563,25 @@ def aeroanlfinal(self):
return task
- def prepsnowobs(self):
+ def prepsnowcover(self):
deps = []
dep_dict = {'type': 'task', 'name': f'{self.run}_prep'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
- resources = self.get_resource('prepsnowobs')
- task_name = f'{self.run}_prepsnowobs'
+ cycledef = 'gdas_prep_snocvr'
+ if self.run in ['gfs']:
+ cycledef = self.run
+
+ resources = self.get_resource('prepsnowcover')
+ task_name = f'{self.run}_prepsnowcover'
task_dict = {'task_name': task_name,
'resources': resources,
'dependency': dependencies,
'envars': self.envars,
- 'cycledef': self.run.replace('enkf', ''),
- 'command': f'{self.HOMEgfs}/jobs/rocoto/prepsnowobs.sh',
+ 'cycledef': cycledef,
+ 'command': f'{self.HOMEgfs}/jobs/rocoto/prepsnowcover.sh',
'job_name': f'{self.pslot}_{task_name}_@H',
'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log',
'maxtries': '&MAXTRIES;'
@@ -590,9 +594,17 @@ def prepsnowobs(self):
def snowanl(self):
deps = []
- dep_dict = {'type': 'task', 'name': f'{self.run}_prepsnowobs'}
+ dep_dict = {'type': 'task', 'name': f'{self.run}_prepsnowcover'}
deps.append(rocoto.add_dependency(dep_dict))
- dependencies = rocoto.create_dependency(dep=deps)
+
+ deps2 = []
+ dep_dict = {'type': 'taskvalid', 'name': f'{self.run}_prepsnowcover', 'condition': 'not'}
+ deps2.append(rocoto.add_dependency(dep_dict))
+ dep_dict = {'type': 'task', 'name': f'{self.run}_prep'}
+ deps2.append(rocoto.add_dependency(dep_dict))
+ deps.append(rocoto.create_dependency(dep_condition='and', dep=deps2))
+
+ dependencies = rocoto.create_dependency(dep_condition='or', dep=deps)
resources = self.get_resource('snowanl')
task_name = f'{self.run}_snowanl'
@@ -613,8 +625,6 @@ def snowanl(self):
def esnowrecen(self):
deps = []
- dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf","")}_prepsnowobs'}
- deps.append(rocoto.add_dependency(dep_dict))
dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf","")}_snowanl'}
deps.append(rocoto.add_dependency(dep_dict))
dep_dict = {'type': 'metatask', 'name': f'{self.run}_epmn', 'offset': f"-{timedelta_to_HMS(self._base['interval_gdas'])}"}
diff --git a/workflow/rocoto/tasks.py b/workflow/rocoto/tasks.py
index 92ceea73aa9..0408b3ea009 100644
--- a/workflow/rocoto/tasks.py
+++ b/workflow/rocoto/tasks.py
@@ -20,7 +20,7 @@ class Tasks:
'eobs', 'eomg', 'epos', 'esfc', 'eupd',
'atmensanlinit', 'atmensanlobs', 'atmensanlsol', 'atmensanlletkf', 'atmensanlfv3inc', 'atmensanlfinal',
'aeroanlinit', 'aeroanlvar', 'aeroanlfinal', 'aeroanlgenb',
- 'prepsnowobs', 'snowanl', 'esnowrecen',
+ 'prepsnowcover', 'snowanl', 'esnowrecen',
'fcst',
'atmanlupp', 'atmanlprod', 'atmupp', 'goesupp',
'atmos_prod', 'ocean_prod', 'ice_prod',