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',