From eb5f650a0fe28ca9a3f581e001fb1cb8e957207e Mon Sep 17 00:00:00 2001 From: "Walter.Kolczynski" Date: Tue, 19 Nov 2024 14:06:22 -0600 Subject: [PATCH 1/5] Fix wave restart for cold start The stage job was incorrectly putting wave restarts into the gfs directory. The forecast job looks for them in the gdas directory, so this is updated. Additionally, the restarts were also not being copied from the staged directory to `$DATA`, so now they are. The process is identical to that of non-RERUN warm starts, so the code is re- factored a bit to avoid duplication. Resolves #3109 --- parm/stage/master_gfs.yaml.j2 | 2 +- ush/forecast_postdet.sh | 50 +++++++++++++++-------------------- 2 files changed, 23 insertions(+), 29 deletions(-) diff --git a/parm/stage/master_gfs.yaml.j2 b/parm/stage/master_gfs.yaml.j2 index 5204221c9bd..6be24c3c25b 100644 --- a/parm/stage/master_gfs.yaml.j2 +++ b/parm/stage/master_gfs.yaml.j2 @@ -108,7 +108,7 @@ {% set COMOUT_OCEAN_RESTART_PREV_MEM = COM_OCEAN_RESTART_TMPL | replace_tmpl(previous_cycle_dict) %} {% set COMOUT_OCEAN_ANALYSIS_MEM = COM_OCEAN_ANALYSIS_TMPL | replace_tmpl(current_cycle_dict) %} {% set COMOUT_MED_RESTART_PREV_MEM = COM_MED_RESTART_TMPL | replace_tmpl(previous_cycle_dict) %} - {% set COMOUT_WAVE_RESTART_PREV_MEM = COM_WAVE_RESTART_TMPL | replace_tmpl(previous_cycle_and_run_dict) %} + {% set COMOUT_WAVE_RESTART_PREV_MEM = COM_WAVE_RESTART_TMPL | replace_tmpl(previous_cycle_dict) %} # Append the member COM directories {% do COMOUT_ATMOS_INPUT_MEM_list.append(COMOUT_ATMOS_INPUT_MEM)%} diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh index 25b2e28d754..55ef9230f58 100755 --- a/ush/forecast_postdet.sh +++ b/ush/forecast_postdet.sh @@ -328,39 +328,33 @@ WW3_postdet() { local ww3_grid first_ww3_restart_out ww3_restart_file # Copy initial condition files: - if [[ "${warm_start}" == ".true." ]]; then - local restart_date restart_dir - if [[ "${RERUN}" == "YES" ]]; then - restart_date="${RERUN_DATE}" - restart_dir="${DATArestart}/WW3_RESTART" - else - restart_date="${model_start_date_current_cycle}" - restart_dir="${COMIN_WAVE_RESTART_PREV}" - fi - echo "Copying WW3 restarts for 'RUN=${RUN}' at '${restart_date}' from '${restart_dir}'" - ww3_restart_file="${restart_dir}/${restart_date:0:8}.${restart_date:8:2}0000.restart.ww3" - if [[ -f "${ww3_restart_file}" ]]; then - ${NCP} "${ww3_restart_file}" "${DATA}/restart.ww3" \ + local restart_date restart_dir + if [[ "${RERUN}" == "YES" ]]; then + restart_date="${RERUN_DATE}" + restart_dir="${DATArestart}/WW3_RESTART" + else + restart_date="${model_start_date_current_cycle}" + restart_dir="${COMIN_WAVE_RESTART_PREV}" + fi + + echo "Copying WW3 restarts for 'RUN=${RUN}' at '${restart_date}' from '${restart_dir}'" + ww3_restart_file="${restart_dir}/${restart_date:0:8}.${restart_date:8:2}0000.restart.ww3" + if [[ -s "${ww3_restart_file}" ]]; then + ${NCP} "${ww3_restart_file}" "${DATA}/restart.ww3" \ || ( echo "FATAL ERROR: Unable to copy WW3 IC, ABORT!"; exit 1 ) + first_ww3_restart_out=$(date --utc -d "${restart_date:0:8} ${restart_date:8:2} + ${restart_interval} hours" +%Y%m%d%H) + else + if [[ "${RERUN}" == "YES" ]]; then + # In the case of a RERUN, the WW3 restart file is required + echo "FATAL ERROR: WW3 restart file '${ww3_restart_file}' not found for RERUN='${RERUN}', ABORT!" + exit 1 else - if [[ "${RERUN}" == "YES" ]]; then - # In the case of a RERUN, the WW3 restart file is required - echo "FATAL ERROR: WW3 restart file '${ww3_restart_file}' not found for RERUN='${RERUN}', ABORT!" - exit 1 - else - echo "WARNING: WW3 restart file '${ww3_restart_file}' not found for warm_start='${warm_start}', will start from rest!" - fi + echo "WARNING: WW3 restart file '${ww3_restart_file}' not found for warm_start='${warm_start}', will start from rest!" + first_ww3_restart_out=${model_start_date_current_cycle} fi - - first_ww3_restart_out=$(date --utc -d "${restart_date:0:8} ${restart_date:8:2} + ${restart_interval} hours" +%Y%m%d%H) - else # cold start - echo "WW3 will start from rest!" - first_ww3_restart_out="${model_start_date_current_cycle}" - fi # [[ "${warm_start}" == ".true." ]] + fi # Link restart files - local ww3_restart_file - # Use restart_date if it was determined above, otherwise use initialization date for (( vdate = first_ww3_restart_out; vdate <= forecast_end_cycle; vdate = $(date --utc -d "${vdate:0:8} ${vdate:8:2} + ${restart_interval} hours" +%Y%m%d%H) )); do ww3_restart_file="${vdate:0:8}.${vdate:8:2}0000.restart.ww3" From 215a2181b6a7a6da5c0834db07094df0b27292e9 Mon Sep 17 00:00:00 2001 From: "Walter.Kolczynski" Date: Wed, 20 Nov 2024 07:47:51 -0600 Subject: [PATCH 2/5] Remove unneeded dict in gfs staging --- parm/stage/master_gfs.yaml.j2 | 5 ----- 1 file changed, 5 deletions(-) diff --git a/parm/stage/master_gfs.yaml.j2 b/parm/stage/master_gfs.yaml.j2 index 6be24c3c25b..e8620050947 100644 --- a/parm/stage/master_gfs.yaml.j2 +++ b/parm/stage/master_gfs.yaml.j2 @@ -94,11 +94,6 @@ '${YMD}':previous_cycle_YMD, '${HH}':previous_cycle_HH, '${MEMDIR}': mem_char }) %} - {% set previous_cycle_and_run_dict = ({ '${ROTDIR}':ROTDIR, - '${RUN}':RUN, - '${YMD}':previous_cycle_YMD, - '${HH}':previous_cycle_HH, - '${MEMDIR}': mem_char }) %} {% set COMOUT_ATMOS_INPUT_MEM = COM_ATMOS_INPUT_TMPL | replace_tmpl(current_cycle_dict) %} {% set COMOUT_ATMOS_RESTART_PREV_MEM = COM_ATMOS_RESTART_TMPL | replace_tmpl(previous_cycle_dict) %} From 78cdbc466366b433bb91728a94a6b711cad98fbf Mon Sep 17 00:00:00 2001 From: "Walter.Kolczynski" Date: Wed, 20 Nov 2024 12:14:23 -0600 Subject: [PATCH 3/5] Add stage ic version file, update versions Adds a new vesion file for IC directories. Unlike other version files, this one uses an associative array instead of different variables. With the version file in place, the versions are updated on most of the directories to switch to the relocated wave restarts. Refs: #3109 --- parm/config/gefs/config.stage_ic | 10 ++++++---- parm/config/gfs/config.stage_ic | 9 ++++++--- versions/ic.ver | 22 ++++++++++++++++++++++ 3 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 versions/ic.ver diff --git a/parm/config/gefs/config.stage_ic b/parm/config/gefs/config.stage_ic index 92c6bb2a9b2..5822f2e7946 100644 --- a/parm/config/gefs/config.stage_ic +++ b/parm/config/gefs/config.stage_ic @@ -12,12 +12,11 @@ export BASE_IC="@BASE_IC@" # Platform home for staged ICs export STAGE_IC_YAML_TMPL="${PARMgfs}/stage/master_gefs.yaml.j2" -# Set ICSDIR +source "${HOMEgfs}/versions/ic.ver" +# Set ICSDIR (if not defined) if [[ -z "${ICSDIR}" ]] ; then - ic_ver="20240610" - if (( NMEM_ENS > 0 )) ; then ensic="${CASE_ENS}" fi @@ -26,7 +25,10 @@ if [[ -z "${ICSDIR}" ]] ; then ocnic="mx${OCNRES}" fi - export ICSDIR="${BASE_IC}/${CASE}${ensic:-}${ocnic:-}/${ic_ver}" + dir_name="${CASE}${ensic:-}${ocnic:-}" + ic_ver="${ic_versions[${dir_name}]}" + + export ICSDIR="${BASE_IC}/${dir_name}/${ic_ver}" fi diff --git a/parm/config/gfs/config.stage_ic b/parm/config/gfs/config.stage_ic index d0113fac634..f30e402c938 100644 --- a/parm/config/gfs/config.stage_ic +++ b/parm/config/gfs/config.stage_ic @@ -12,11 +12,11 @@ export BASE_IC="@BASE_IC@" # Platform home for staged ICs export STAGE_IC_YAML_TMPL="${PARMgfs}/stage/master_gfs.yaml.j2" +source "${HOMEgfs}/versions/ic.ver" + # Set ICSDIR (if not defined) if [[ -z "${ICSDIR}" ]] ; then - ic_ver="20240610" - if (( NMEM_ENS > 0 )) ; then ensic="${CASE_ENS}" fi @@ -25,7 +25,10 @@ if [[ -z "${ICSDIR}" ]] ; then ocnic="mx${OCNRES}" fi - export ICSDIR="${BASE_IC}/${CASE}${ensic:-}${ocnic:-}/${ic_ver}" + dir_name="${CASE}${ensic:-}${ocnic:-}" + ic_ver="${ic_versions[${dir_name}]}" + + export ICSDIR="${BASE_IC}/${dir_name}/${ic_ver}" fi diff --git a/versions/ic.ver b/versions/ic.ver new file mode 100644 index 00000000000..c18f69f51da --- /dev/null +++ b/versions/ic.ver @@ -0,0 +1,22 @@ +#!/bin/bash +# Fix file subfolder versions + +#shellcheck disable=SC2034 +declare -A ic_versions + +ic_versions['C48']=20241120 +ic_versions['C48mx500']=20241120 +ic_versions['C48C48mx500']=20241120 + +ic_versions['C96']=20241120 +ic_versions['C96C48']=20241120 +ic_versions['C96mx100']=20240610 + +ic_versions['C384C192']=20240610 +ic_versions['C384mx025']=20241120 + +ic_versions['C768']=20241120 +ic_versions['C768mx025']=20241120 + +ic_versions['C1152']=20241120 +ic_versions['C1152mx025']=20241120 From ae93389a2cc2dabb98f72e229c412704d924d58b Mon Sep 17 00:00:00 2001 From: "Walter.Kolczynski" Date: Wed, 20 Nov 2024 12:14:23 -0600 Subject: [PATCH 4/5] Add stage ic version file, update versions Adds a new vesion file for IC directories. Unlike other version files, this one uses an associative array instead of different variables. With the version file in place, the versions are updated on most of the directories to switch to the relocated wave restarts. Refs: #3109 --- parm/config/gefs/config.stage_ic | 10 ++++++---- parm/config/gfs/config.stage_ic | 9 ++++++--- versions/ic.ver | 22 ++++++++++++++++++++++ 3 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 versions/ic.ver diff --git a/parm/config/gefs/config.stage_ic b/parm/config/gefs/config.stage_ic index 92c6bb2a9b2..5822f2e7946 100644 --- a/parm/config/gefs/config.stage_ic +++ b/parm/config/gefs/config.stage_ic @@ -12,12 +12,11 @@ export BASE_IC="@BASE_IC@" # Platform home for staged ICs export STAGE_IC_YAML_TMPL="${PARMgfs}/stage/master_gefs.yaml.j2" -# Set ICSDIR +source "${HOMEgfs}/versions/ic.ver" +# Set ICSDIR (if not defined) if [[ -z "${ICSDIR}" ]] ; then - ic_ver="20240610" - if (( NMEM_ENS > 0 )) ; then ensic="${CASE_ENS}" fi @@ -26,7 +25,10 @@ if [[ -z "${ICSDIR}" ]] ; then ocnic="mx${OCNRES}" fi - export ICSDIR="${BASE_IC}/${CASE}${ensic:-}${ocnic:-}/${ic_ver}" + dir_name="${CASE}${ensic:-}${ocnic:-}" + ic_ver="${ic_versions[${dir_name}]}" + + export ICSDIR="${BASE_IC}/${dir_name}/${ic_ver}" fi diff --git a/parm/config/gfs/config.stage_ic b/parm/config/gfs/config.stage_ic index d0113fac634..f30e402c938 100644 --- a/parm/config/gfs/config.stage_ic +++ b/parm/config/gfs/config.stage_ic @@ -12,11 +12,11 @@ export BASE_IC="@BASE_IC@" # Platform home for staged ICs export STAGE_IC_YAML_TMPL="${PARMgfs}/stage/master_gfs.yaml.j2" +source "${HOMEgfs}/versions/ic.ver" + # Set ICSDIR (if not defined) if [[ -z "${ICSDIR}" ]] ; then - ic_ver="20240610" - if (( NMEM_ENS > 0 )) ; then ensic="${CASE_ENS}" fi @@ -25,7 +25,10 @@ if [[ -z "${ICSDIR}" ]] ; then ocnic="mx${OCNRES}" fi - export ICSDIR="${BASE_IC}/${CASE}${ensic:-}${ocnic:-}/${ic_ver}" + dir_name="${CASE}${ensic:-}${ocnic:-}" + ic_ver="${ic_versions[${dir_name}]}" + + export ICSDIR="${BASE_IC}/${dir_name}/${ic_ver}" fi diff --git a/versions/ic.ver b/versions/ic.ver new file mode 100644 index 00000000000..e7bd8358ef9 --- /dev/null +++ b/versions/ic.ver @@ -0,0 +1,22 @@ +#!/bin/bash +# Initial condition subfolder versions + +#shellcheck disable=SC2034 +declare -A ic_versions + +ic_versions['C48']=20241120 +ic_versions['C48mx500']=20241120 +ic_versions['C48C48mx500']=20241120 + +ic_versions['C96']=20241120 +ic_versions['C96C48']=20241120 +ic_versions['C96mx100']=20240610 + +ic_versions['C384C192']=20240610 +ic_versions['C384mx025']=20241120 + +ic_versions['C768']=20241120 +ic_versions['C768mx025']=20241120 + +ic_versions['C1152']=20241120 +ic_versions['C1152mx025']=20241120 From c242b28a02743b7c329f8d2e574fec392701ee90 Mon Sep 17 00:00:00 2001 From: "Walter.Kolczynski" Date: Fri, 22 Nov 2024 00:47:18 -0600 Subject: [PATCH 5/5] Update case files with new IC versions --- ci/cases/pr/C48mx500_3DVarAOWCDA.yaml | 2 +- ci/cases/pr/C48mx500_hybAOWCDA.yaml | 2 +- ci/cases/pr/C96C48_hybatmDA.yaml | 2 +- ci/cases/pr/C96C48_hybatmaerosnowDA.yaml | 2 +- ci/cases/pr/C96C48_ufs_hybatmDA.yaml | 2 +- ci/cases/pr/C96_atm3DVar.yaml | 2 +- ci/cases/pr/C96_atm3DVar_extended.yaml | 2 +- ci/cases/weekly/C384C192_hybatmda.yaml | 2 +- ci/cases/weekly/C384_atm3DVar.yaml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ci/cases/pr/C48mx500_3DVarAOWCDA.yaml b/ci/cases/pr/C48mx500_3DVarAOWCDA.yaml index 2de5fea7fff..762d2c3fbeb 100644 --- a/ci/cases/pr/C48mx500_3DVarAOWCDA.yaml +++ b/ci/cases/pr/C48mx500_3DVarAOWCDA.yaml @@ -9,7 +9,7 @@ arguments: resdetocean: 5.0 comroot: {{ 'RUNTESTS' | getenv }}/COMROOT expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR - icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C48mx500/20240610 + icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C48mx500/20241120 idate: 2021032412 edate: 2021032418 nens: 0 diff --git a/ci/cases/pr/C48mx500_hybAOWCDA.yaml b/ci/cases/pr/C48mx500_hybAOWCDA.yaml index 036aa8ca603..ca477b5fbad 100644 --- a/ci/cases/pr/C48mx500_hybAOWCDA.yaml +++ b/ci/cases/pr/C48mx500_hybAOWCDA.yaml @@ -10,7 +10,7 @@ arguments: resensatmos: 48 comroot: {{ 'RUNTESTS' | getenv }}/COMROOT expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR - icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C48mx500/20240610 + icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C48mx500/20241120 idate: 2021032412 edate: 2021032418 nens: 3 diff --git a/ci/cases/pr/C96C48_hybatmDA.yaml b/ci/cases/pr/C96C48_hybatmDA.yaml index b527903d697..c0833acf141 100644 --- a/ci/cases/pr/C96C48_hybatmDA.yaml +++ b/ci/cases/pr/C96C48_hybatmDA.yaml @@ -10,7 +10,7 @@ arguments: resensatmos: 48 comroot: {{ 'RUNTESTS' | getenv }}/COMROOT expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR - icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C96C48/20240610 + icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C96C48/20241120 idate: 2021122018 edate: 2021122106 nens: 2 diff --git a/ci/cases/pr/C96C48_hybatmaerosnowDA.yaml b/ci/cases/pr/C96C48_hybatmaerosnowDA.yaml index 57d0989ae3a..93abda95e58 100644 --- a/ci/cases/pr/C96C48_hybatmaerosnowDA.yaml +++ b/ci/cases/pr/C96C48_hybatmaerosnowDA.yaml @@ -9,7 +9,7 @@ arguments: resensatmos: 48 comroot: {{ 'RUNTESTS' | getenv }}/COMROOT expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR - icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C96C48/20240610 + icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C96C48/20241120 idate: 2021122012 edate: 2021122100 nens: 2 diff --git a/ci/cases/pr/C96C48_ufs_hybatmDA.yaml b/ci/cases/pr/C96C48_ufs_hybatmDA.yaml index 031054079a9..240f04c0909 100644 --- a/ci/cases/pr/C96C48_ufs_hybatmDA.yaml +++ b/ci/cases/pr/C96C48_ufs_hybatmDA.yaml @@ -9,7 +9,7 @@ arguments: resensatmos: 48 comroot: {{ 'RUNTESTS' | getenv }}/COMROOT expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR - icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C96C48/20240610 + icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C96C48/20241120 idate: 2024022318 edate: 2024022406 nens: 2 diff --git a/ci/cases/pr/C96_atm3DVar.yaml b/ci/cases/pr/C96_atm3DVar.yaml index fc09beeacf6..6286d74dc47 100644 --- a/ci/cases/pr/C96_atm3DVar.yaml +++ b/ci/cases/pr/C96_atm3DVar.yaml @@ -8,7 +8,7 @@ arguments: resdetatmos: 96 comroot: {{ 'RUNTESTS' | getenv }}/COMROOT expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR - icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C96C48/20240610 + icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C96C48/20241120 idate: 2021122018 edate: 2021122106 nens: 0 diff --git a/ci/cases/pr/C96_atm3DVar_extended.yaml b/ci/cases/pr/C96_atm3DVar_extended.yaml index 8ab67a750ed..45a0cdd6d26 100644 --- a/ci/cases/pr/C96_atm3DVar_extended.yaml +++ b/ci/cases/pr/C96_atm3DVar_extended.yaml @@ -8,7 +8,7 @@ arguments: resdetatmos: 96 comroot: {{ 'RUNTESTS' | getenv }}/COMROOT expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR - icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C96C48/20240610 + icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C96C48/20241120 idate: 2021122018 edate: 2021122118 nens: 0 diff --git a/ci/cases/weekly/C384C192_hybatmda.yaml b/ci/cases/weekly/C384C192_hybatmda.yaml index 6053f731249..ecaea3757f6 100644 --- a/ci/cases/weekly/C384C192_hybatmda.yaml +++ b/ci/cases/weekly/C384C192_hybatmda.yaml @@ -10,7 +10,7 @@ arguments: resensatmos: 192 comroot: {{ 'RUNTESTS' | getenv }}/COMROOT expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR - icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C384C192 + icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C384C192/20240610 idate: 2023040118 edate: 2023040200 nens: 2 diff --git a/ci/cases/weekly/C384_atm3DVar.yaml b/ci/cases/weekly/C384_atm3DVar.yaml index 1a14059ab1a..4409a73ac11 100644 --- a/ci/cases/weekly/C384_atm3DVar.yaml +++ b/ci/cases/weekly/C384_atm3DVar.yaml @@ -10,7 +10,7 @@ arguments: resensatmos: 192 comroot: {{ 'RUNTESTS' | getenv }}/COMROOT expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR - icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C384C192 + icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C384C192/20240610 idate: 2023040118 edate: 2023040200 nens: 0