Skip to content

Commit

Permalink
Updates for cold start half cycle, then continuing with IAU for WCDA (#…
Browse files Browse the repository at this point in the history
…2560)

This PR allows us to run C384 S2S with IAU, but starting with the first
half-cycle as a cold-start. This will be necessary for cycled testing as
we build towards the full system for GFSv17. This updates the copying of
the restarts for RUN=gdas for both ocean and ice copying what the atm
model is doing. It also reduced the amount of restart files from 4 to 3.

Other updates: 
* Add DOJEDI ocean triggers for archiving certain files update from:
@CatherineThomas-NOAA
* Adds COPY_FINAL_RESTARTS option to turn on/off copying the last
restart file to COM. Defaults to off...
* Defines model_start_date_current_cycle & model_start_date_next_cycle
to help with knowing which IC to grab.

Refs #2546

Co-authored-by: Rahul Mahajan <aerorahul@users.noreply.github.com>
  • Loading branch information
JessicaMeixner-NOAA and aerorahul committed May 9, 2024
1 parent b405b7d commit c7b3973
Show file tree
Hide file tree
Showing 8 changed files with 85 additions and 103 deletions.
2 changes: 1 addition & 1 deletion jobs/JGLOBAL_FORECAST
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,6 @@ fi
# Remove the Temporary working directory
##########################################
cd "${DATAROOT}" || true
[[ "${KEEPDATA}" == "NO" ]] && rm -rf "${DATA} ${DATArestart}" # do not remove DATAjob. It contains DATAoutput
[[ "${KEEPDATA}" == "NO" ]] && rm -rf "${DATA}" "${DATArestart}" # do not remove DATAjob. It contains DATAoutput

exit 0
1 change: 1 addition & 0 deletions parm/config/gefs/config.fcst
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
echo "BEGIN: config.fcst"

export USE_ESMF_THREADING="YES" # Toggle to use ESMF-managed threading or traditional threading in UFSWM
export COPY_FINAL_RESTARTS="NO" # Toggle to copy restarts from the end of GFS/GEFS Run (GDAS is handled seperately)

# Turn off waves if not used for this CDUMP
case ${WAVE_CDUMP} in
Expand Down
1 change: 1 addition & 0 deletions parm/config/gfs/config.fcst
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
echo "BEGIN: config.fcst"

export USE_ESMF_THREADING="YES" # Toggle to use ESMF-managed threading or traditional threading in UFSWM
export COPY_FINAL_RESTARTS="NO" # Toggle to copy restarts from the end of GFS/GEFS Run (GDAS is handled seperately)

# Turn off waves if not used for this CDUMP
case ${WAVE_CDUMP} in
Expand Down
5 changes: 4 additions & 1 deletion scripts/exglobal_archive.sh
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,10 @@ if [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; then

#gdasocean
if [ "${DO_OCN}" = "YES" ]; then
targrp_list="${targrp_list} gdasocean gdasocean_analysis"
targrp_list="${targrp_list} gdasocean"
if [[ "${DO_JEDIOCNVAR}" == "YES" ]]; then
targrp_list="${targrp_list} gdasocean_analysis"
fi
fi

#gdasice
Expand Down
13 changes: 4 additions & 9 deletions ush/forecast_det.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,9 @@ UFS_det(){
echo "SUB ${FUNCNAME[0]}: Run type determination for UFS"

# Determine if the current cycle is a warm start (based on the availability of restarts)
if [[ "${DOIAU:-}" == "YES" ]]; then
if [[ -f "${COM_ATMOS_RESTART_PREV}/${current_cycle_begin:0:8}.${current_cycle_begin:8:2}0000.coupler.res" ]]; then
warm_start=".true."
fi
else
if [[ -f "${COM_ATMOS_RESTART_PREV}/${current_cycle:0:8}.${current_cycle:8:2}0000.coupler.res" ]]; then
warm_start=".true."
fi
fi
if [[ -f "${COM_ATMOS_RESTART_PREV}/${model_start_date_current_cycle:0:8}.${model_start_date_current_cycle:8:2}0000.coupler.res" ]]; then
warm_start=".true."
fi

# If restarts were not available, this is likely a cold start
if [[ "${warm_start}" == ".false." ]]; then
Expand All @@ -30,6 +24,7 @@ UFS_det(){
# Since warm start is false, we cannot do IAU
DOIAU="NO"
IAU_OFFSET=0
model_start_date_current_cycle=${current_cycle}

# It is still possible that a restart is available from a previous forecast attempt
# So we have to continue checking for restarts
Expand Down
142 changes: 58 additions & 84 deletions ush/forecast_postdet.sh
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,7 @@ FV3_postdet() {
restart_date="${RERUN_DATE}"
restart_dir="${DATArestart}/FV3_RESTART"
else # "${RERUN}" == "NO"
if [[ "${DOIAU}" == "YES" ]]; then
restart_date="${current_cycle_begin}"
else
restart_date="${current_cycle}"
fi
restart_date="${model_start_date_current_cycle}"
restart_dir="${COM_ATMOS_RESTART_PREV}"
fi

Expand Down Expand Up @@ -92,11 +88,10 @@ FV3_postdet() {
# Need a coupler.res that is consistent with the model start time
if [[ "${DOIAU}" == "YES" ]]; then
local model_start_time="${previous_cycle}"
local model_current_time="${current_cycle_begin}"
else
local model_start_time="${current_cycle}"
local model_current_time="${current_cycle}"
fi
local model_current_time="${model_start_date_current_cycle}"
rm -f "${DATA}/INPUT/coupler.res"
cat >> "${DATA}/INPUT/coupler.res" << EOF
3 (Calendar: no_calendar=0, thirty_day_months=1, julian=2, gregorian=3, noleap=4)
Expand Down Expand Up @@ -258,13 +253,15 @@ FV3_out() {
# Copy the final restart files at the end of the forecast segment
# The final restart written at the end of the forecast does not include the valid date
# TODO: verify the above statement since RM found that it did!
echo "Copying FV3 restarts for 'RUN=${RUN}' at the end of the forecast segment: ${forecast_end_cycle}"
for fv3_restart_file in "${fv3_restart_files[@]}"; do
restart_file="${forecast_end_cycle:0:8}.${forecast_end_cycle:8:2}0000.${fv3_restart_file}"
${NCP} "${DATArestart}/FV3_RESTART/${restart_file}" \
"${COM_ATMOS_RESTART}/${restart_file}"
done

# TODO: For other components, this is only for gfs/gefs - check to see if this should also have this
if [[ "${COPY_FINAL_RESTARTS}" == "YES" ]]; then
echo "Copying FV3 restarts for 'RUN=${RUN}' at the end of the forecast segment: ${forecast_end_cycle}"
for fv3_restart_file in "${fv3_restart_files[@]}"; do
restart_file="${forecast_end_cycle:0:8}.${forecast_end_cycle:8:2}0000.${fv3_restart_file}"
${NCP} "${DATArestart}/FV3_RESTART/${restart_file}" \
"${COM_ATMOS_RESTART}/${restart_file}"
done
fi
echo "SUB ${FUNCNAME[0]}: Output data for FV3 copied"
}

Expand All @@ -281,11 +278,7 @@ WW3_postdet() {
restart_date="${RERUN_DATE}"
restart_dir="${DATArestart}/WW3_RESTART"
else
if [[ "${DOIAU}" == "YES" ]]; then
restart_date="${current_cycle_begin}"
else
restart_date="${current_cycle}"
fi
restart_date="${model_start_date_current_cycle}"
restart_dir="${COM_WAVE_RESTART_PREV}"
fi
echo "Copying WW3 restarts for 'RUN=${RUN}' at '${restart_date}' from '${restart_dir}'"
Expand Down Expand Up @@ -384,11 +377,7 @@ MOM6_postdet() {
restart_date="${RERUN_DATE}"
else # "${RERUN}" == "NO"
restart_dir="${COM_OCEAN_RESTART_PREV}"
if [[ "${DOIAU}" == "YES" ]]; then
restart_date="${current_cycle_begin}"
else
restart_date="${current_cycle}"
fi
restart_date="${model_start_date_current_cycle}"
fi

# Copy MOM6 ICs
Expand Down Expand Up @@ -489,44 +478,41 @@ MOM6_out() {
# Coarser than 1/2 degree has a single MOM restart
local mom6_restart_files mom6_restart_file restart_file
mom6_restart_files=(MOM.res.nc)
# 1/4 degree resolution has 4 additional restarts
# 1/4 degree resolution has 3 additional restarts
case "${OCNRES}" in
"025")
local nn
for (( nn = 1; nn <= 4; nn++ )); do
for (( nn = 1; nn <= 3; nn++ )); do
mom6_restart_files+=("MOM.res_${nn}.nc")
done
;;
*) ;;
esac

# Copy MOM6 restarts at the end of the forecast segment to COM for RUN=gfs|gefs
local restart_file
if [[ "${RUN}" == "gfs" || "${RUN}" == "gefs" ]]; then
echo "Copying MOM6 restarts for 'RUN=${RUN}' at ${forecast_end_cycle}"
for mom6_restart_file in "${mom6_restart_files[@]}"; do
restart_file="${forecast_end_cycle:0:8}.${forecast_end_cycle:8:2}0000.${mom6_restart_file}"
${NCP} "${DATArestart}/MOM6_RESTART/${restart_file}" \
"${COM_OCEAN_RESTART}/${restart_file}"
done
if [[ "${COPY_FINAL_RESTARTS}" == "YES" ]]; then
local restart_file
if [[ "${RUN}" == "gfs" || "${RUN}" == "gefs" ]]; then
echo "Copying MOM6 restarts for 'RUN=${RUN}' at ${forecast_end_cycle}"
for mom6_restart_file in "${mom6_restart_files[@]}"; do
restart_file="${forecast_end_cycle:0:8}.${forecast_end_cycle:8:2}0000.${mom6_restart_file}"
${NCP} "${DATArestart}/MOM6_RESTART/${restart_file}" \
"${COM_OCEAN_RESTART}/${restart_file}"
done
fi
fi

# Copy restarts at the beginning/middle of the next assimilation cycle to COM for RUN=gdas|enkfgdas|enkfgfs
# Copy restarts for the next cycle for RUN=gdas|enkfgdas|enkfgfs
if [[ "${RUN}" =~ "gdas" || "${RUN}" == "enkfgfs" ]]; then
local restart_date
if [[ "${DOIAU}" == "YES" ]]; then # Copy restarts at the beginning of the next cycle from DATA to COM
restart_date="${next_cycle_begin}"
else # Copy restarts at the middle of the next cycle from DATA to COM
restart_date="${next_cycle}"
fi
restart_date="${model_start_date_next_cycle}"
echo "Copying MOM6 restarts for 'RUN=${RUN}' at ${restart_date}"
for mom6_restart_file in "${mom6_restart_files[@]}"; do
restart_file="${restart_date:0:8}.${restart_date:8:2}0000.${mom6_restart_file}"
${NCP} "${DATArestart}/MOM6_RESTART/${restart_file}" \
"${COM_OCEAN_RESTART}/${restart_file}"
done
fi

}

CICE_postdet() {
Expand All @@ -539,11 +525,7 @@ CICE_postdet() {
seconds=$(to_seconds "${restart_date:8:2}0000") # convert HHMMSS to seconds
cice_restart_file="${DATArestart}/CICE_RESTART/cice_model.res.${restart_date:0:4}-${restart_date:4:2}-${restart_date:6:2}-${seconds}.nc"
else # "${RERUN}" == "NO"
if [[ "${DOIAU}" == "YES" ]]; then
restart_date="${current_cycle_begin}"
else
restart_date="${current_cycle}"
fi
restart_date="${model_start_date_current_cycle}"
cice_restart_file="${COM_ICE_RESTART_PREV}/${restart_date:0:8}.${restart_date:8:2}0000.cice_model.res.nc"
fi

Expand All @@ -554,8 +536,8 @@ CICE_postdet() {
# Link iceh_ic file to COM. This is the initial condition file from CICE (f000)
# TODO: Is this file needed in COM? Is this going to be used for generating any products?
local vdate seconds vdatestr fhr fhr3 interval last_fhr
seconds=$(to_seconds "${current_cycle:8:2}0000") # convert HHMMSS to seconds
vdatestr="${current_cycle:0:4}-${current_cycle:4:2}-${current_cycle:6:2}-${seconds}"
seconds=$(to_seconds "${model_start_date_current_cycle:8:2}0000") # convert HHMMSS to seconds
vdatestr="${model_start_date_current_cycle:0:4}-${model_start_date_current_cycle:4:2}-${model_start_date_current_cycle:6:2}-${seconds}"
${NLN} "${COM_ICE_HISTORY}/${RUN}.ice.t${cyc}z.ic.nc" "${DATA}/CICE_OUTPUT/iceh_ic.${vdatestr}.nc"

# Link CICE forecast output files from DATA/CICE_OUTPUT to COM
Expand Down Expand Up @@ -601,24 +583,22 @@ CICE_out() {
${NCP} "${DATA}/ice_in" "${COM_CONF}/ufs.ice_in"

# Copy CICE restarts at the end of the forecast segment to COM for RUN=gfs|gefs
local seconds source_file target_file
if [[ "${RUN}" == "gfs" || "${RUN}" == "gefs" ]]; then
echo "Copying CICE restarts for 'RUN=${RUN}' at ${forecast_end_cycle}"
seconds=$(to_seconds "${forecast_end_cycle:8:2}0000") # convert HHMMSS to seconds
source_file="cice_model.res.${forecast_end_cycle:0:4}-${forecast_end_cycle:4:2}-${forecast_end_cycle:6:2}-${seconds}.nc"
target_file="${forecast_end_cycle:0:8}.${forecast_end_cycle:8:2}0000.cice_model.res.nc"
${NCP} "${DATArestart}/CICE_RESTART/${source_file}" \
"${COM_ICE_RESTART}/${target_file}"
if [[ "${COPY_FINAL_RESTARTS}" == "YES" ]]; then
local seconds source_file target_file
if [[ "${RUN}" == "gfs" || "${RUN}" == "gefs" ]]; then
echo "Copying CICE restarts for 'RUN=${RUN}' at ${forecast_end_cycle}"
seconds=$(to_seconds "${forecast_end_cycle:8:2}0000") # convert HHMMSS to seconds
source_file="cice_model.res.${forecast_end_cycle:0:4}-${forecast_end_cycle:4:2}-${forecast_end_cycle:6:2}-${seconds}.nc"
target_file="${forecast_end_cycle:0:8}.${forecast_end_cycle:8:2}0000.cice_model.res.nc"
${NCP} "${DATArestart}/CICE_RESTART/${source_file}" \
"${COM_ICE_RESTART}/${target_file}"
fi
fi

# Copy restarts at the beginning/middle of the next assimilation cycle to COM for RUN=gdas|enkfgdas|enkfgfs
# Copy restarts for next cycle for RUN=gdas|enkfgdas|enkfgfs
if [[ "${RUN}" =~ "gdas" || "${RUN}" == "enkfgfs" ]]; then
local restart_date
if [[ "${DOIAU}" == "YES" ]]; then # Copy restarts at the beginning of the next cycle from DATA to COM
restart_date="${next_cycle_begin}"
else # Copy restarts at the middle of the next cycle from DATA to COM
restart_date="${next_cycle}"
fi
restart_date="${model_start_date_next_cycle}"
echo "Copying CICE restarts for 'RUN=${RUN}' at ${restart_date}"
seconds=$(to_seconds "${restart_date:8:2}0000") # convert HHMMSS to seconds
source_file="cice_model.res.${restart_date:0:4}-${restart_date:4:2}-${restart_date:6:2}-${seconds}.nc"
Expand Down Expand Up @@ -706,11 +686,7 @@ CMEPS_postdet() {
seconds=$(to_seconds "${restart_date:8:2}0000") # convert HHMMSS to seconds
cmeps_restart_file="${DATArestart}/CMEPS_RESTART/ufs.cpld.cpl.r.${restart_date:0:4}-${restart_date:4:2}-${restart_date:6:2}-${seconds}.nc"
else # "${RERUN}" == "NO"
if [[ "${DOIAU}" == "YES" ]]; then
restart_date="${current_cycle_begin}"
else
restart_date="${current_cycle}"
fi
restart_date="${model_start_date_current_cycle}"
cmeps_restart_file="${COM_MED_RESTART_PREV}/${restart_date:0:8}.${restart_date:8:2}0000.ufs.cpld.cpl.r.nc"
fi

Expand Down Expand Up @@ -740,26 +716,24 @@ CMEPS_out() {
echo "SUB ${FUNCNAME[0]}: Copying output data for CMEPS mediator"

# Copy mediator restarts at the end of the forecast segment to COM for RUN=gfs|gefs
echo "Copying mediator restarts for 'RUN=${RUN}' at ${forecast_end_cycle}"
local seconds source_file target_file
seconds=$(to_seconds "${forecast_end_cycle:8:2}"0000)
source_file="ufs.cpld.cpl.r.${forecast_end_cycle:0:4}-${forecast_end_cycle:4:2}-${forecast_end_cycle:6:2}-${seconds}.nc"
target_file="${forecast_end_cycle:0:8}.${forecast_end_cycle:8:2}0000.ufs.cpld.cpl.r.nc"
if [[ -f "${DATArestart}/CMEPS_RESTART/${source_file}" ]]; then
${NCP} "${DATArestart}/CMEPS_RESTART/${source_file}" \
"${COM_MED_RESTART}/${target_file}"
else
echo "Mediator restart '${DATArestart}/CMEPS_RESTART/${source_file}' not found."
fi
if [[ "${COPY_FINAL_RESTARTS}" == "YES" ]]; then
echo "Copying mediator restarts for 'RUN=${RUN}' at ${forecast_end_cycle}"
local seconds source_file target_file
seconds=$(to_seconds "${forecast_end_cycle:8:2}"0000)
source_file="ufs.cpld.cpl.r.${forecast_end_cycle:0:4}-${forecast_end_cycle:4:2}-${forecast_end_cycle:6:2}-${seconds}.nc"
target_file="${forecast_end_cycle:0:8}.${forecast_end_cycle:8:2}0000.ufs.cpld.cpl.r.nc"
if [[ -f "${DATArestart}/CMEPS_RESTART/${source_file}" ]]; then
${NCP} "${DATArestart}/CMEPS_RESTART/${source_file}" \
"${COM_MED_RESTART}/${target_file}"
else
echo "Mediator restart '${DATArestart}/CMEPS_RESTART/${source_file}' not found."
fi
fi

# Copy restarts at the beginning/middle of the next assimilation cycle to COM for RUN=gdas|enkfgdas|enkfgfs
# Copy restarts for the next cycle to COM for RUN=gdas|enkfgdas|enkfgfs
if [[ "${RUN}" =~ "gdas" || "${RUN}" == "enkfgfs" ]]; then
local restart_date
if [[ "${DOIAU}" == "YES" ]]; then # Copy restarts at the beginning of the next cycle from DATA to COM
restart_date="${next_cycle_begin}"
else # Copy restarts at the middle of the next cycle from DATA to COM
restart_date="${next_cycle}"
fi
restart_date="${model_start_date_next_cycle}"
echo "Copying mediator restarts for 'RUN=${RUN}' at ${restart_date}"
seconds=$(to_seconds "${restart_date:8:2}"0000)
source_file="ufs.cpld.cpl.r.${restart_date:0:4}-${restart_date:4:2}-${restart_date:6:2}-${seconds}.nc"
Expand Down
9 changes: 8 additions & 1 deletion ush/forecast_predet.sh
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,14 @@ common_predet(){
current_cycle_begin=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} - ${half_window} hours" +%Y%m%d%H)
current_cycle_end=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${half_window} hours" +%Y%m%d%H)
next_cycle_begin=$(date --utc -d "${next_cycle:0:8} ${next_cycle:8:2} - ${half_window} hours" +%Y%m%d%H)
next_cycle_end=$(date --utc -d "${next_cycle:0:8} ${next_cycle:8:2} + ${half_window} hours" +%Y%m%d%H)
#Define model start date for current_cycle and next_cycle as the time the forecast will start
if [[ "${DOIAU:-}" == "YES" ]]; then
model_start_date_current_cycle="${current_cycle_begin}"
model_start_date_next_cycle="${next_cycle_begin}"
else
model_start_date_current_cycle=${current_cycle}
model_start_date_next_cycle=${next_cycle}
fi
forecast_end_cycle=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${FHMAX} hours" +%Y%m%d%H)

FHMIN=${FHMIN:-0}
Expand Down
15 changes: 8 additions & 7 deletions ush/hpssarch_gen.sh
Original file line number Diff line number Diff line change
Expand Up @@ -560,13 +560,14 @@ if [[ ${type} == "gdas" ]]; then
echo "${COM_MED_RESTART/${ROTDIR}\//}/*"
} >> "${DATA}/gdasocean_restart.txt"

{
echo "${COM_OCEAN_ANALYSIS/${ROTDIR}\//}/${head}*"
echo "${COM_OCEAN_ANALYSIS/${ROTDIR}\//}/gdas.t??z.ocngrid.nc"
echo "${COM_OCEAN_ANALYSIS/${ROTDIR}\//}/diags"
echo "${COM_OCEAN_ANALYSIS/${ROTDIR}\//}/yaml"
} >> "${DATA}/gdasocean_analysis.txt"

if [[ ${DO_JEDIOCNVAR} = "YES" ]]; then
{
echo "${COM_OCEAN_ANALYSIS/${ROTDIR}\//}/${head}*"
echo "${COM_OCEAN_ANALYSIS/${ROTDIR}\//}/gdas.t??z.ocngrid.nc"
echo "${COM_OCEAN_ANALYSIS/${ROTDIR}\//}/diags"
echo "${COM_OCEAN_ANALYSIS/${ROTDIR}\//}/yaml"
} >> "${DATA}/gdasocean_analysis.txt"
fi
fi

if [[ ${DO_ICE} = "YES" ]]; then
Expand Down

0 comments on commit c7b3973

Please sign in to comment.