Skip to content

Commit 91b9308

Browse files
extend stage_ic to gdas for cycled parallels (NOAA-EMC#2294)
1 parent 87eb1ad commit 91b9308

File tree

7 files changed

+88
-15
lines changed

7 files changed

+88
-15
lines changed

ci/cases/pr/C48C48_ufs_hybatmDA.yaml

-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ arguments:
99
resensatmos: 48
1010
comroot: {{ 'RUNTESTS' | getenv }}/COMROOT
1111
expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR
12-
icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C48C48
1312
idate: 2021032312
1413
edate: 2021032400
1514
nens: 2

parm/config/gfs/config.base.emc.dyn

+1-1
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ export FHMAX_FITS=132
397397
[[ "${FHMAX_FITS}" -gt "${FHMAX_GFS}" ]] && export FHMAX_FITS=${FHMAX_GFS}
398398

399399
# The monitor jobs are not yet supported for JEDIATMVAR
400-
if [[ ${DO_JEDIATMVAR} = "NO" ]]; then
400+
if [[ ${DO_JEDIATMVAR} = "YES" ]]; then
401401
export DO_VERFOZN="NO" # Ozone data assimilation monitoring
402402
export DO_VERFRAD="NO" # Radiance data assimilation monitoring
403403
export DO_VMINMON="NO" # GSI minimization monitoring

parm/config/gfs/config.stage_ic

+9
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ echo "BEGIN: config.stage_ic"
77
# Get task specific resources
88
source "${EXPDIR}/config.resources" stage_ic
99

10+
# Stage ICs for coupled system
11+
if [[ "${DO_COUPLED}" = "YES" ]]; then
1012
case "${CASE}" in
1113
"C48" | "C96")
1214
export CPL_ATMIC="workflow_${CASE}_refactored"
@@ -37,5 +39,12 @@ case "${CASE}" in
3739
exit 1
3840
;;
3941
esac
42+
fi # End block for coupled ICs
43+
44+
# Stage ICs for cycled runs
45+
if [[ "$MODE" = "cycled" ]]; then
46+
export CPL_ATMIC="C48C48"
47+
export CPL_ATMDAIC="C48C48"
48+
fi
4049

4150
echo "END: config.stage_ic"

scripts/exglobal_stage_ic.sh

+55
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ error_message() {
2525
echo "FATAL ERROR: Unable to copy ${1} to ${2} (Error code ${3})"
2626
}
2727

28+
if [[ "${MODE}" == "forecast-only" ]]; then
29+
2830
###############################################################
2931
for MEMDIR in "${MEMDIR_ARRAY[@]}"; do
3032

@@ -152,6 +154,59 @@ for MEMDIR in "${MEMDIR_ARRAY[@]}"; do
152154

153155
done # for MEMDIR in "${MEMDIR_ARRAY[@]}"; do
154156

157+
# Stage files for MODE="cycled"
158+
else
159+
# Stage deterministic ICs from previous cycle
160+
RUN=${rCDUMP} YMD=${gPDY} HH=${gcyc} generate_com COM_TOP:COM_TOP_TMPL
161+
COM_TOP_BASE=$(dirname $COM_TOP)
162+
[[ ! -d "${COM_TOP_BASE}" ]] && mkdir -p "${COM_TOP_BASE}"
163+
[[ -d "${COM_TOP_BASE}/${gcyc}" ]] && rm -rf "${COM_TOP_BASE}/${gcyc}"
164+
src="${BASE_CPLIC}/${CPL_ATMIC:-}/${RUN}.${gPDY}/${gcyc}"
165+
tgt="${COM_TOP_BASE}/"
166+
${NLN} "${src}" "${tgt}"
167+
rc=$?
168+
((rc != 0)) && error_message "${src}" "${tgt}" "${rc}"
169+
err=$((err + rc))
170+
171+
# Stage ensemble ICs from previous cycle
172+
if [[ "${DOHYBVAR}" == "YES" ]]; then
173+
RUN=enkf${rCDUMP} YMD=${gPDY} HH=${gcyc} generate_com COM_TOP:COM_TOP_TMPL
174+
COM_TOP_BASE=$(dirname $COM_TOP)
175+
[[ ! -d "${COM_TOP_BASE}" ]] && mkdir -p "${COM_TOP_BASE}"
176+
[[ -d "${COM_TOP_BASE}/${gcyc}" ]] && rm -rf "${COM_TOP_BASE}/${gcyc}"
177+
src="${BASE_CPLIC}/${CPL_ATMIC:-}/enkf${RUN}.${gPDY}/${gcyc}"
178+
tgt="${COM_TOP_BASE}/"
179+
${NLN} "${src}" "${tgt}"
180+
rc=$?
181+
((rc != 0)) && error_message "${src}" "${tgt}" "${rc}"
182+
err=$((err + rc))
183+
fi
184+
185+
# Stage bias correction files
186+
RUN=${rCDUMP} YMD=${PDY} HH=${cyc} generate_com COM_ATMOS_ANALYSIS:COM_ATMOS_ANALYSIS_TMPL
187+
[[ ! -d "${COM_ATMOS_ANALYSIS}" ]] && mkdir -p "${COM_ATMOS_ANALYSIS}"
188+
src="${BASE_CPLIC}/${CPL_ATMIC:-}/${RUN}.${PDY}/${cyc}/analysis/atmos"
189+
tgt="${COM_ATMOS_ANALYSIS}/"
190+
if [[ "${DO_JEDIATMVAR}" == "YES" || "${DO_JEDIATMENS}" == "YES" ]]; then
191+
flist="radbcor"
192+
else
193+
flist="abias abias_air abias_pc radstat"
194+
fi
195+
for ftype in $flist; do
196+
file=${rCDUMP}.t${cyc}z.$ftype
197+
${NCP} "${src}/$file" "${tgt}"
198+
rc=$?
199+
((rc != 0)) && error_message "${src}" "${tgt}" "${rc}"
200+
err=$((err + rc))
201+
done
202+
if [[ "${DO_JEDIATMVAR}" == "YES" || "${DO_JEDIATMENS}" == "YES" ]]; then
203+
cd ${tgt}
204+
tar -xvf ${rCDUMP}.t${cyc}z.radbcor
205+
cd ${DATA}
206+
fi
207+
208+
fi
209+
155210
###############################################################
156211
# Check for errors and exit if any of the above failed
157212
if [[ "${err}" -ne 0 ]]; then

ush/python/pygfs/task/atm_analysis.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def initialize(self: Analysis) -> None:
9494
'NMEM_ENS', 'DATA', 'current_cycle', 'ntiles']
9595
for key in keys:
9696
localconf[key] = self.task_config[key]
97-
localconf.RUN = 'enkf' + self.task_config.RUN
97+
localconf.RUN = 'enkfgdas'
9898
localconf.dirname = 'ens'
9999
FileHandler(self.get_fv3ens_dict(localconf)).sync()
100100

workflow/applications/gfs_cycled.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def _get_app_configs(self):
3535
Returns the config_files that are involved in the cycled app
3636
"""
3737

38-
configs = ['prep']
38+
configs = ['stage_ic', 'prep']
3939

4040
if self.do_jediatmvar:
4141
configs += ['prepatmiodaobs', 'atmanlinit', 'atmanlrun', 'atmanlfinal']
@@ -166,7 +166,8 @@ def get_task_names(self):
166166
hybrid_after_eupd_tasks += ['ecen', 'esfc', 'efcs', 'epos', 'earc', 'cleanup']
167167

168168
# Collect all "gdas" cycle tasks
169-
gdas_tasks = gdas_gfs_common_tasks_before_fcst.copy()
169+
gdas_tasks = ['stage_ic']
170+
gdas_tasks += gdas_gfs_common_tasks_before_fcst.copy()
170171

171172
if not self.do_jediatmvar:
172173
gdas_tasks += ['analdiag']

workflow/rocoto/gfs_tasks.py

+19-10
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,22 @@ def stage_ic(self):
2424

2525
# Atm ICs
2626
if self.app_config.do_atm:
27-
prefix = f"{cpl_ic['BASE_CPLIC']}/{cpl_ic['CPL_ATMIC']}/@Y@m@d@H/atmos"
28-
for file in ['gfs_ctrl.nc'] + \
29-
[f'{datatype}_data.tile{tile}.nc'
30-
for datatype in ['gfs', 'sfc']
31-
for tile in range(1, self.n_tiles + 1)]:
27+
if self.cdump in 'gdas':
28+
prefix = f"{cpl_ic['BASE_CPLIC']}/{cpl_ic['CPL_ATMIC']}/gdas.@Y@m@d/@H/model_data/atmos/restart"
29+
PDY = self._base.get('SDATE').strftime("%Y%m%d%H")[0:8]
30+
cyc = self._base.get('SDATE').strftime("%Y%m%d%H")[8:10]
31+
file = PDY + '.' + cyc + '0000.fv_core.res.nc'
3232
data = f"{prefix}/{file}"
33-
dep_dict = {'type': 'data', 'data': data}
34-
deps.append(rocoto.add_dependency(dep_dict))
33+
dep_dict = {'type': 'data', 'data': data, 'offset': f"-{timedelta_to_HMS(self._base['cycle_interval'])}"}
34+
else:
35+
prefix = f"{cpl_ic['BASE_CPLIC']}/{cpl_ic['CPL_ATMIC']}/@Y@m@d@H/atmos"
36+
for file in ['gfs_ctrl.nc'] + \
37+
[f'{datatype}_data.tile{tile}.nc'
38+
for datatype in ['gfs', 'sfc']
39+
for tile in range(1, self.n_tiles + 1)]:
40+
data = f"{prefix}/{file}"
41+
dep_dict = {'type': 'data', 'data': data}
42+
deps.append(rocoto.add_dependency(dep_dict))
3543
else: # data-atmosphere
3644
# TODO - need more information about how these forcings are stored
3745
prefix = f"{cpl_ic['BASE_CPLIC']}/{cpl_ic['CPL_DATM']}/@Y@m@d@H"
@@ -70,13 +78,14 @@ def stage_ic(self):
7078

7179
dependencies = rocoto.create_dependency(dep_condition='and', dep=deps)
7280

81+
cycledef = 'gdas_half' if self.cdump in ['gdas'] else self.cdump
7382
resources = self.get_resource('stage_ic')
7483
task_name = f'{self.cdump}stage_ic'
7584
task_dict = {'task_name': task_name,
7685
'resources': resources,
7786
'dependency': dependencies,
7887
'envars': self.envars,
79-
'cycledef': self.cdump,
88+
'cycledef': cycledef,
8089
'command': f'{self.HOMEgfs}/jobs/rocoto/stage_ic.sh',
8190
'job_name': f'{self.pslot}_{task_name}_@H',
8291
'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log',
@@ -833,7 +842,7 @@ def _fcst_cycled(self):
833842
dependencies = rocoto.create_dependency(dep_condition='and', dep=dependencies)
834843

835844
if self.cdump in ['gdas']:
836-
dep_dict = {'type': 'cycleexist', 'condition': 'not', 'offset': f"-{timedelta_to_HMS(self._base['cycle_interval'])}"}
845+
dep_dict = {'type': 'task', 'name': f'{self.cdump}stage_ic'}
837846
dependencies.append(rocoto.add_dependency(dep_dict))
838847
dependencies = rocoto.create_dependency(dep_condition='or', dep=dependencies)
839848

@@ -2535,7 +2544,7 @@ def efcs(self):
25352544
dep_dict = {'type': 'task', 'name': f'{self.cdump}esfc'}
25362545
deps.append(rocoto.add_dependency(dep_dict))
25372546
dependencies = rocoto.create_dependency(dep_condition='and', dep=deps)
2538-
dep_dict = {'type': 'cycleexist', 'condition': 'not', 'offset': f"-{timedelta_to_HMS(self._base['cycle_interval'])}"}
2547+
dep_dict = {'type': 'task', 'name': f'gdasstage_ic'}
25392548
dependencies.append(rocoto.add_dependency(dep_dict))
25402549
dependencies = rocoto.create_dependency(dep_condition='or', dep=dependencies)
25412550

0 commit comments

Comments
 (0)