From 313a461e13ab0baf843c831d526226ac9df64716 Mon Sep 17 00:00:00 2001 From: Walter Kolczynski - NOAA Date: Fri, 22 Nov 2024 09:07:18 -0500 Subject: [PATCH 1/3] Make aerosol output frequency variable (#2982) # Description The `AERO_HISTORY.rc` file that controls the GOCART output is turned into a template usint `@[ ]` syntax to allow for variable output times. A new "parsing" script is created for GOCART that handles parsing the `AERO_HISTORY.rc` file through `atparse`. Other manip- ulation of these files is also moved to the new parsing script to be consistent with other components. A new variable, `FHOUT_AERO` is introduced to control the output frequency of the GOCART output. This is initially set to 3 to match other components (this is a change from the current value of 6). Since some aerosol fields are also included as part of the atmos output, it may be desirable to meld this back into `FHOUT` later. However, the atmos output has two frequencies (`FHOUT_HF` and `FHOUT`), a feature not supported by other components. The RUN lists for aero fcst, aero analysis, and waves is simplified to avoid confusion, since there is no need for them to only be set if the components are on. Resolves #2072 --- parm/archive/gdas.yaml.j2 | 2 +- parm/archive/gfs_arcdir.yaml.j2 | 2 +- parm/archive/gfsa.yaml.j2 | 2 +- parm/archive/master_gfs.yaml.j2 | 2 +- parm/config/gefs/config.base | 12 ++----- parm/config/gefs/yaml/defaults.yaml | 4 ++- parm/config/gfs/config.base | 13 +++----- parm/ufs/gocart/AERO_HISTORY.rc | 32 +++++++++--------- ush/forecast_postdet.sh | 37 ++++++++++---------- ush/forecast_predet.sh | 6 ++-- ush/parsing_namelists_GOCART.sh | 52 +++++++++++++++++++++++++++++ 11 files changed, 103 insertions(+), 61 deletions(-) create mode 100644 ush/parsing_namelists_GOCART.sh diff --git a/parm/archive/gdas.yaml.j2 b/parm/archive/gdas.yaml.j2 index 1e9597ba1c..7a9e402138 100644 --- a/parm/archive/gdas.yaml.j2 +++ b/parm/archive/gdas.yaml.j2 @@ -67,7 +67,7 @@ gdas: - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}oznstat" - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}radstat" {% endif %} - {% if AERO_ANL_RUN == "gdas" or AERO_ANL_RUN == "both" %} + {% if DO_AERO and (AERO_ANL_RUN == "gdas" or AERO_ANL_RUN == "both") %} - "{{ COMIN_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" {% endif %} {% if DO_PREP_OBS_AERO %} diff --git a/parm/archive/gfs_arcdir.yaml.j2 b/parm/archive/gfs_arcdir.yaml.j2 index 57dbc78885..58e2cdc699 100644 --- a/parm/archive/gfs_arcdir.yaml.j2 +++ b/parm/archive/gfs_arcdir.yaml.j2 @@ -50,7 +50,7 @@ ARCDIR ~ "/snowstat." ~ RUN ~ "." ~ cycle_YMDH ~ ".tgz"]) %} {% endif %} - {% if AERO_ANL_RUN == RUN or AERO_ANL_RUN == "both" %} + {% if DO_AERO and (AERO_ANL_RUN == RUN or AERO_ANL_RUN == "both") %} {% do det_anl_files.append([COMIN_CHEM_ANALYSIS ~ "/" ~ head ~ "aerostat", ARCDIR ~ "/aerostat." ~ RUN ~ "." ~ cycle_YMDH ]) %} {% endif %} diff --git a/parm/archive/gfsa.yaml.j2 b/parm/archive/gfsa.yaml.j2 index dcf059d871..7cb3c770fd 100644 --- a/parm/archive/gfsa.yaml.j2 +++ b/parm/archive/gfsa.yaml.j2 @@ -38,7 +38,7 @@ gfsa: {% else %} - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}gsistat" {% endif %} - {% if AERO_ANL_RUN == "gfs" or AERO_ANL_RUN == "both" %} + {% if DO_AERO and (AERO_ANL_RUN == "gfs" or AERO_ANL_RUN == "both") %} - "{{ COMIN_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" {% endif %} {% if DO_PREP_OBS_AERO %} diff --git a/parm/archive/master_gfs.yaml.j2 b/parm/archive/master_gfs.yaml.j2 index ab9a00c95e..3f7c2e9d14 100644 --- a/parm/archive/master_gfs.yaml.j2 +++ b/parm/archive/master_gfs.yaml.j2 @@ -33,7 +33,7 @@ datasets: {% endfilter %} {% endif %} -{% if AERO_FCST_RUN == "gfs" or AERO_FCST_RUN == "both" %} +{% if DO_AERO and (AERO_FCST_RUN == "gfs" or AERO_FCST_RUN == "both") %} # Aerosol forecasts {% filter indent(width=4) %} {% include "chem.yaml.j2" %} diff --git a/parm/config/gefs/config.base b/parm/config/gefs/config.base index 13f286c494..bf34504f09 100644 --- a/parm/config/gefs/config.base +++ b/parm/config/gefs/config.base @@ -136,9 +136,8 @@ export DO_OCN="NO" export DO_ICE="NO" export DO_AERO="NO" export DO_EXTRACTVARS="@DO_EXTRACTVARS@" # Option to process and extract a subset of products to save on disk -export AERO_FCST_RUN="" # When to run aerosol forecast: gdas, gfs, or both -export AERO_ANL_RUN="" # When to run aerosol analysis: gdas, gfs, or both -export WAVE_RUN="" # When to include wave suite: gdas, gfs, or both +export AERO_FCST_RUN="gefs" # When to run aerosol forecast: gdas, gfs, or both +export WAVE_RUN="gefs" # When to include wave suite: gdas, gfs, or both export DOBNDPNT_WAVE="NO" # The GEFS buoys file does not currently have any boundary points export DOIBP_WAV="NO" # Option to create point outputs from input boundary points export FRAC_GRID=".true." @@ -184,13 +183,10 @@ case "${APP}" in ;; ATMA) export DO_AERO="YES" - export AERO_ANL_RUN="both" - export AERO_FCST_RUN="gdas" ;; ATMW) export DO_COUPLED="YES" export DO_WAVE="YES" - export WAVE_RUN="both" ;; NG-GODAS) export DO_ATM="NO" @@ -204,13 +200,10 @@ case "${APP}" in if [[ "${APP}" =~ A$ ]]; then export DO_AERO="YES" - export AERO_ANL_RUN="both" - export AERO_FCST_RUN="gdas" fi if [[ "${APP}" =~ ^S2SW ]]; then export DO_WAVE="YES" - export WAVE_RUN="both" fi ;; *) @@ -225,6 +218,7 @@ export FHMAX=9 export FHOUT=3 # Will be changed to 1 in config.base if (DOHYBVAR set to NO and l4densvar set to false) export FHOUT_OCN=3 export FHOUT_ICE=3 +export FHOUT_AERO=3 # GFS cycle info export INTERVAL_GFS=@INTERVAL_GFS@ # Frequency of GFS forecast diff --git a/parm/config/gefs/yaml/defaults.yaml b/parm/config/gefs/yaml/defaults.yaml index f0e8772b67..cda90c5485 100644 --- a/parm/config/gefs/yaml/defaults.yaml +++ b/parm/config/gefs/yaml/defaults.yaml @@ -31,4 +31,6 @@ stage_ic: USE_ATM_ENS_PERTURB_FILES: "NO" ocn: MOM6_INTERP_ICS: "NO" - +# config.aero has just a system-specific path to add. +# This is handled by the setup_expt.py, but it has to be told to write to it. +aero: {} diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base index 4f702f9668..b0d4fbf42a 100644 --- a/parm/config/gfs/config.base +++ b/parm/config/gfs/config.base @@ -176,9 +176,9 @@ export DO_OCN="NO" export DO_ICE="NO" export DO_AERO="NO" export DO_PREP_OBS_AERO="NO" -export AERO_FCST_RUN="" # When to run aerosol forecast: gdas, gfs, or both -export AERO_ANL_RUN="" # When to run aerosol analysis: gdas, gfs, or both -export WAVE_RUN="" # When to include wave suite: gdas, gfs, or both +export AERO_FCST_RUN="gdas" # When to run aerosol forecast: gdas, gfs, or both +export AERO_ANL_RUN="both" # When to run aerosol analysis: gdas, gfs, or both +export WAVE_RUN="both" # When to include wave suite: gdas, gfs, or both export DOBNDPNT_WAVE="NO" export DOIBP_WAV="NO" # Option to create point outputs from input boundary points export FRAC_GRID=".true." @@ -229,13 +229,10 @@ case "${APP}" in ;; ATMA) export DO_AERO="YES" - export AERO_ANL_RUN="both" - export AERO_FCST_RUN="gdas" ;; ATMW) export DO_COUPLED="YES" export DO_WAVE="YES" - export WAVE_RUN="both" ;; NG-GODAS) export DO_ATM="NO" @@ -249,13 +246,10 @@ case "${APP}" in if [[ "${APP}" =~ A$ ]]; then export DO_AERO="YES" - export AERO_ANL_RUN="both" - export AERO_FCST_RUN="gdas" fi if [[ "${APP}" =~ ^S2SW ]]; then export DO_WAVE="YES" - export WAVE_RUN="both" fi ;; *) @@ -278,6 +272,7 @@ export FHMAX=9 export FHOUT=3 # Will be changed to 1 in config.base if (DOHYBVAR set to NO and l4densvar set to false) export FHOUT_OCN=3 export FHOUT_ICE=3 +export FHOUT_AERO=3 # Cycle to run EnKF (set to BOTH for both gfs and gdas) export EUPD_CYC="@EUPD_CYC@" diff --git a/parm/ufs/gocart/AERO_HISTORY.rc b/parm/ufs/gocart/AERO_HISTORY.rc index 4c7df15b2a..db1b934f5f 100644 --- a/parm/ufs/gocart/AERO_HISTORY.rc +++ b/parm/ufs/gocart/AERO_HISTORY.rc @@ -58,7 +58,7 @@ PC720x361-DC.LM: 72 inst_du_ss.mode: 'instantaneous', inst_du_ss.grid_label: PC720x361-DC , inst_du_ss.splitField: 1, - inst_du_ss.frequency: 120000 , + inst_du_ss.frequency: @[inst_du_ss_freq] , inst_du_ss.duration: 010000 , inst_du_ss.ref_time: 000000 , inst_du_ss.nbits: 10, @@ -72,7 +72,7 @@ PC720x361-DC.LM: 72 tavg_du_ss.mode: 'time-averaged', tavg_du_ss.grid_label: PC720x361-DC , tavg_du_ss.splitField: 1, - tavg_du_ss.frequency: 120000 , + tavg_du_ss.frequency: @[tavg_du_ss_freq] , tavg_du_ss.duration: 010000 , tavg_du_ss.ref_time: 000000 , tavg_du_ss.nbits: 10, @@ -85,7 +85,7 @@ PC720x361-DC.LM: 72 inst_ca.template: '%y4%m2%d2_%h2%n2z.nc4', inst_ca.mode: 'instantaneous', inst_ca.grid_label: PC720x361-DC , - inst_ca.frequency: 120000 , + inst_ca.frequency: @[inst_ca_freq] , inst_ca.duration: 010000 , inst_ca.ref_time: 000000 , inst_ca.nbits: 10, @@ -100,7 +100,7 @@ PC720x361-DC.LM: 72 inst_ni.template: '%y4%m2%d2_%h2%n2z.nc4', inst_ni.mode: 'instantaneous', inst_ni.grid_label: PC720x361-DC , - inst_ni.frequency: 120000 , + inst_ni.frequency: @[inst_ni_freq] , inst_ni.duration: 010000 , inst_ni.ref_time: 000000 , inst_ni.nbits: 10, @@ -116,7 +116,7 @@ PC720x361-DC.LM: 72 inst_su.template: '%y4%m2%d2_%h2%n2z.nc4', inst_su.mode: 'instantaneous', inst_su.grid_label: PC720x361-DC , - inst_su.frequency: 120000 , + inst_su.frequency: @[inst_su_freq] , inst_su.duration: 010000 , inst_su.ref_time: 000000 , inst_su.nbits: 10, @@ -135,7 +135,7 @@ PC720x361-DC.LM: 72 inst_du_bin.mode: 'instantaneous' inst_du_bin.grid_label: PC720x361-DC , inst_du_bin.splitField: 1, - inst_du_bin.frequency: 010000 , + inst_du_bin.frequency: @[inst_du_bin_freq] , inst_du_bin.duration: 010000 , inst_du_bin.ref_time: 000000 , inst_du_bin.nbits: 10, @@ -152,7 +152,7 @@ PC720x361-DC.LM: 72 tavg_du_bin.mode: 'time-averaged' tavg_du_bin.grid_label: PC720x361-DC , tavg_du_bin.splitField: 1, - tavg_du_bin.frequency: 030000 , + tavg_du_bin.frequency: @[tavg_du_bin_freq] , tavg_du_bin.duration: 010000 , tavg_du_bin.ref_time: 000000 , tavg_du_bin.nbits: 10, @@ -169,7 +169,7 @@ PC720x361-DC.LM: 72 inst_ss_bin.mode: 'instantaneous' inst_ss_bin.grid_label: PC720x361-DC , inst_ss_bin.splitField: 1, - inst_ss_bin.frequency: 060000 , + inst_ss_bin.frequency: @[inst_ss_bin_freq] , inst_ss_bin.duration: 010000 , inst_ss_bin.ref_time: 000000 , inst_ss_bin.nbits: 10, @@ -186,7 +186,7 @@ PC720x361-DC.LM: 72 inst_ca_bin.mode: 'instantaneous' inst_ca_bin.grid_label: PC720x361-DC , inst_ca_bin.splitField: 1, - inst_ca_bin.frequency: 120000 , + inst_ca_bin.frequency: @[inst_ca_bin_freq] , inst_ca_bin.duration: 010000 , inst_ca_bin.ref_time: 000000 , inst_ca_bin.nbits: 10, @@ -208,7 +208,7 @@ PC720x361-DC.LM: 72 inst_ni_bin.mode: 'instantaneous', inst_ni_bin.grid_label: PC720x361-DC , inst_ni_bin.splitField: 1, - inst_ni_bin.frequency: 120000 , + inst_ni_bin.frequency: @[inst_ni_bin_freq] , inst_ni_bin.duration: 010000 , inst_ni_bin.ref_time: 000000 , inst_ni_bin.nbits: 10, @@ -225,7 +225,7 @@ PC720x361-DC.LM: 72 inst_su_bin.mode: 'instantaneous', inst_su_bin.grid_label: PC720x361-DC , inst_su_bin.splitField: 1, - inst_su_bin.frequency: 120000 , + inst_su_bin.frequency: @[inst_su_bin_freq] , inst_su_bin.duration: 010000 , inst_su_bin.ref_time: 000000 , inst_su_bin.nbits: 10, @@ -244,7 +244,7 @@ PC720x361-DC.LM: 72 inst_2d.template: '%y4%m2%d2_%h2%n2z.nc4', inst_2d.archive: '%c/Y%y4', inst_2d.mode: 'instantaneous' - inst_2d.frequency: 030000, + inst_2d.frequency: @[inst_2d_freq], inst_2d.duration: 030000, inst_2d.ref_time: 000000, inst_2d.grid_label: PC720x361-DC @@ -343,7 +343,7 @@ PC720x361-DC.LM: 72 inst_3d.template: '%y4%m2%d2_%h2%n2z.nc4' , inst_3d.archive: '%c/Y%y4' , inst_3d.mode: 'instantaneous' - inst_3d.frequency: 060000, + inst_3d.frequency: @[inst_3d_freq], inst_3d.duration: 010000, inst_3d.ref_time: 000000, inst_3d.grid_label: PC720x361-DC @@ -381,7 +381,7 @@ PC720x361-DC.LM: 72 inst_aod.template: '%y4%m2%d2_%h2%n2z.nc4' , inst_aod.archive: '%c/Y%y4' , inst_aod.mode: 'instantaneous' - inst_aod.frequency: 060000, + inst_aod.frequency: @[inst_aod_freq], inst_aod.duration: 010000, inst_aod.ref_time: 000000, inst_aod.grid_label: PC720x361-DC @@ -398,7 +398,7 @@ PC720x361-DC.LM: 72 tavg_2d_rad.template: '%y4%m2%d2_%h2%n2z.nc4', tavg_2d_rad.archive: '%c/Y%y4', tavg_2d_rad.mode: 'time-averaged', - tavg_2d_rad.frequency: 120000, + tavg_2d_rad.frequency: @[tavg_2d_rad_freq], tavg_2d_rad.duration: 120000, tavg_2d_rad.ref_time: 000000, tavg_2d_rad.grid_label: PC720x361-DC @@ -432,7 +432,7 @@ PC720x361-DC.LM: 72 tavg_3d_rad.template: '%y4%m2%d2_%h2%n2z.nc4', tavg_3d_rad.archive: '%c/Y%y4', tavg_3d_rad.mode: 'time-averaged', - tavg_3d_rad.frequency: 120000, + tavg_3d_rad.frequency: @[tavg_3d_rad_freq], tavg_3d_rad.duration: 120000, tavg_3d_rad.ref_time: 000000, tavg_3d_rad.grid_label: PC720x361-DC diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh index 25b2e28d75..310fcf0afa 100755 --- a/ush/forecast_postdet.sh +++ b/ush/forecast_postdet.sh @@ -689,30 +689,15 @@ GOCART_rc() { [[ ${status} -ne 0 ]] && exit "${status}" fi - # copying GOCART configuration files - if [[ -n "${AERO_CONFIG_DIR}" ]]; then - ${NCP} "${AERO_CONFIG_DIR}"/*.rc "${DATA}" - status=$? - [[ ${status} -ne 0 ]] && exit "${status}" - # attempt to generate ExtData configuration file if not provided - if [[ ! -f "${DATA}/AERO_ExtData.rc" ]]; then - { \ - echo "PrimaryExports%%" ; \ - cat "${AERO_CONFIG_DIR}/ExtData.other" ; \ - cat "${AERO_CONFIG_DIR}/ExtData.${AERO_EMIS_FIRE:-none}" ; \ - echo "%%" ; \ - } > "${DATA}/AERO_ExtData.rc" - status=$? - if (( status != 0 )); then exit "${status}"; fi - fi - fi + source "${USHgfs}/parsing_namelists_GOCART.sh" + GOCART_namelists } GOCART_postdet() { echo "SUB ${FUNCNAME[0]}: Linking output data for GOCART" local vdate - for fhr in ${GOCART_OUTPUT_FH}; do + for fhr in $(GOCART_output_fh); do vdate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${fhr} hours" +%Y%m%d%H) # Temporarily delete existing files due to noclobber in GOCART @@ -726,6 +711,18 @@ GOCART_postdet() { done } +GOCART_output_fh() { + # This has to be called during postdet after FHROT has been set + local aero_min + local gocart_output_fh + # GOCART produces no AOD files at the initial forecast time, so start the time + # after the forecast start (accounting for FHROT) + aero_min=$(( ${IAU_FHROT:-0} > FHMIN ? IAU_FHROT + FHOUT_AERO : FHMIN + FHOUT_AERO )) + gocart_output_fh=$(seq -s ' ' "$(( aero_min ))" "${FHOUT_AERO}" "${GOCART_MAX}") + + echo "${gocart_output_fh}" +} + GOCART_out() { echo "SUB ${FUNCNAME[0]}: Copying output data for GOCART" @@ -733,8 +730,8 @@ GOCART_out() { # TODO: this should be linked but there are issues where gocart crashing if it is linked local fhr local vdate - for fhr in ${GOCART_OUTPUT_FH}; do - if (( fhr == 0 )); then continue; fi + + for fhr in $(GOCART_output_fh); do vdate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${fhr} hours" +%Y%m%d%H) ${NCP} "${DATA}/gocart.inst_aod.${vdate:0:8}_${vdate:8:2}00z.nc4" \ "${COMOUT_CHEM_HISTORY}/gocart.inst_aod.${vdate:0:8}_${vdate:8:2}00z.nc4" diff --git a/ush/forecast_predet.sh b/ush/forecast_predet.sh index 43c9eb968f..3c3dd719ef 100755 --- a/ush/forecast_predet.sh +++ b/ush/forecast_predet.sh @@ -724,6 +724,8 @@ GOCART_predet(){ if [[ ! -d "${COMOUT_CHEM_HISTORY}" ]]; then mkdir -p "${COMOUT_CHEM_HISTORY}"; fi - GOCART_OUTPUT_FH=$(seq -s ' ' "${FHMIN}" "6" "${FHMAX}") - # TODO: AERO_HISTORY.rc has hardwired output frequency to 6 hours + # FHMAX gets modified when IAU is on, so keep origianl value for GOCART output + GOCART_MAX=${FHMAX} + + # GOCART output times can't be computed here because they may depend on FHROT } diff --git a/ush/parsing_namelists_GOCART.sh b/ush/parsing_namelists_GOCART.sh new file mode 100644 index 0000000000..e39f0808ab --- /dev/null +++ b/ush/parsing_namelists_GOCART.sh @@ -0,0 +1,52 @@ +#! /usr/bin/env bash + +# Disable variable not used warnings +# shellcheck disable=SC2034 +GOCART_namelists() { + # copying GOCART configuration files + if [[ -n "${AERO_CONFIG_DIR}" ]]; then + + local base_in + local fhout_aero_padded + fhout_aero_padded=$(printf "%02d" "${FHOUT_AERO}") + # Only instantaneous AOD is output right now + local inst_aod_freq="${fhout_aero_padded}0000" + + # Other gocart fields not currently used + local inst_du_ss_freq="120000" + local tavg_du_ss_freq="120000" + local inst_ca_freq="120000" + local inst_ni_freq="120000" + local inst_su_freq="120000" + local inst_du_bin_freq="010000" + local tavg_du_bin_freq="030000" + local inst_ss_bin_freq="060000" + local inst_ca_bin_freq="120000" + local inst_ni_bin_freq="120000" + local inst_su_bin_freq="120000" + local inst_2d_freq="030000" + local inst_3d_freq="060000" + local tavg_2d_rad_freq="120000" + local tavg_3d_rad_freq="120000" + + for template_in in "${AERO_CONFIG_DIR}/"*.rc; do + base_in="$(basename "${template_in}")" + atparse < "${template_in}" >> "${DATA}/${base_in}" + status=$? + [[ ${status} -ne 0 ]] && exit "${status}" + done + + # attempt to generate ExtData configuration file if not provided + if [[ ! -f "${DATA}/AERO_ExtData.rc" ]]; then + { \ + echo "PrimaryExports%%" ; \ + cat "${AERO_CONFIG_DIR}/ExtData.other" ; \ + cat "${AERO_CONFIG_DIR}/ExtData.${AERO_EMIS_FIRE:-none}" ; \ + echo "%%" ; \ + } > "${DATA}/AERO_ExtData.rc" + # shellcheck disable=SC2320 + status=$? + if (( status != 0 )); then exit "${status}"; fi + fi + fi +} From efc25be5d82889bb9d4ec6f290d6c69f418768e0 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Sat, 23 Nov 2024 11:29:18 -0500 Subject: [PATCH 2/3] Speed up GSI analysis jobs in CI testing (#3115) This PR adds `DO_TEST_MODE`, which can be used for other things in the future but for now sets the GSI to run just 5 iterations per outer loop to reduce runtime for CI testing. Resolves #3114 --- ci/cases/gfsv17/ocnanal.yaml | 1 + ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml | 1 + ci/cases/yamls/gfs_defaults_ci.yaml | 1 + ci/cases/yamls/gfs_extended_ci.yaml | 1 + ci/cases/yamls/soca_gfs_defaults_ci.yaml | 1 + parm/config/gefs/config.base | 1 + parm/config/gefs/yaml/defaults.yaml | 1 + parm/config/gfs/config.anal | 5 +++++ parm/config/gfs/config.base | 1 + parm/config/gfs/yaml/defaults.yaml | 1 + 10 files changed, 14 insertions(+) diff --git a/ci/cases/gfsv17/ocnanal.yaml b/ci/cases/gfsv17/ocnanal.yaml index d559f544e4..b0605c9c16 100644 --- a/ci/cases/gfsv17/ocnanal.yaml +++ b/ci/cases/gfsv17/ocnanal.yaml @@ -15,6 +15,7 @@ base: DO_VRFY_OCEANDA: "NO" FHMAX_GFS: 240 ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} + DO_TEST_MODE: "YES" marineanl: SOCA_INPUT_FIX_DIR: {{ HOMEgfs }}/fix/gdas/soca/1440x1080x75/soca diff --git a/ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml b/ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml index 6d978e25ef..24f629128a 100644 --- a/ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml +++ b/ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml @@ -3,3 +3,4 @@ defaults: base: DO_JEDISNOWDA: "YES" ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} + DO_TEST_MODE: "YES" diff --git a/ci/cases/yamls/gfs_defaults_ci.yaml b/ci/cases/yamls/gfs_defaults_ci.yaml index d09f78b8b8..65d440ac93 100644 --- a/ci/cases/yamls/gfs_defaults_ci.yaml +++ b/ci/cases/yamls/gfs_defaults_ci.yaml @@ -2,3 +2,4 @@ defaults: !INC {{ HOMEgfs }}/parm/config/gfs/yaml/defaults.yaml base: ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} + DO_TEST_MODE: "YES" diff --git a/ci/cases/yamls/gfs_extended_ci.yaml b/ci/cases/yamls/gfs_extended_ci.yaml index 8caa942eed..e60350ad8a 100644 --- a/ci/cases/yamls/gfs_extended_ci.yaml +++ b/ci/cases/yamls/gfs_extended_ci.yaml @@ -12,3 +12,4 @@ base: FCST_BREAKPOINTS: 192 FHMAX_GFS: 384 FHMAX_HF_GFS: 120 + DO_TEST_MODE: "YES" diff --git a/ci/cases/yamls/soca_gfs_defaults_ci.yaml b/ci/cases/yamls/soca_gfs_defaults_ci.yaml index 3d75cc911a..38d55e3574 100644 --- a/ci/cases/yamls/soca_gfs_defaults_ci.yaml +++ b/ci/cases/yamls/soca_gfs_defaults_ci.yaml @@ -3,3 +3,4 @@ defaults: base: ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} DO_JEDIOCNVAR: "YES" + DO_TEST_MODE: "YES" diff --git a/parm/config/gefs/config.base b/parm/config/gefs/config.base index bf34504f09..848cdcfbda 100644 --- a/parm/config/gefs/config.base +++ b/parm/config/gefs/config.base @@ -65,6 +65,7 @@ export REALTIME="YES" # Experiment mode (cycled or forecast-only) export MODE="@MODE@" # cycled/forecast-only export SFS_POST="@SFS_POST@" # TODO, place holder until RUN=SFS is developed +export DO_TEST_MODE="@DO_TEST_MODE@" # option to change configuration for automated testing #################################################### # DO NOT ADD MACHINE DEPENDENT STUFF BELOW THIS LINE diff --git a/parm/config/gefs/yaml/defaults.yaml b/parm/config/gefs/yaml/defaults.yaml index cda90c5485..48cf912dcb 100644 --- a/parm/config/gefs/yaml/defaults.yaml +++ b/parm/config/gefs/yaml/defaults.yaml @@ -21,6 +21,7 @@ base: HPSSARCH: "NO" LOCALARCH: "NO" SFS_POST: "NO" + DO_TEST_MODE: "NO" fcst: reforecast: "NO" FHZER: 6 diff --git a/parm/config/gfs/config.anal b/parm/config/gfs/config.anal index 27ff8742e4..123bd6decd 100644 --- a/parm/config/gfs/config.anal +++ b/parm/config/gfs/config.anal @@ -29,6 +29,11 @@ fi export lobsdiag_forenkf=".false." # anal does not need to write out jacobians # set to .true. in config.eobs and config.eupd +# Reduce number of iterations for testing mode +if [[ ${DO_TEST_MODE} = "YES" ]]; then + export SETUP="${SETUP:-}niter(1)=5,niter(2)=5," +fi + # Do not process the following datasets export GSNDBF=${GSNDBF:-/dev/null} export AMSREBF=${AMSREBF:-/dev/null} diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base index b0d4fbf42a..8150d2e39c 100644 --- a/parm/config/gfs/config.base +++ b/parm/config/gfs/config.base @@ -88,6 +88,7 @@ export REALTIME="YES" # Experiment mode (cycled or forecast-only) export MODE="@MODE@" # cycled/forecast-only +export DO_TEST_MODE="@DO_TEST_MODE@" # option to change configuration for automated testing #################################################### # DO NOT ADD MACHINE DEPENDENT STUFF BELOW THIS LINE diff --git a/parm/config/gfs/yaml/defaults.yaml b/parm/config/gfs/yaml/defaults.yaml index d8cf76a47b..05dfc90332 100644 --- a/parm/config/gfs/yaml/defaults.yaml +++ b/parm/config/gfs/yaml/defaults.yaml @@ -21,6 +21,7 @@ base: GSI_SOILANAL: "NO" EUPD_CYC: "gdas" FHMAX_ENKF_GFS: 12 + DO_TEST_MODE: "NO" atmanl: JCB_ALGO_YAML_VAR: "${PARMgfs}/gdas/atm/jcb-prototype_3dvar.yaml.j2" From 1ba8985c0bb731488663e519b51dfe3ba3f756a1 Mon Sep 17 00:00:00 2001 From: Anna Shlyaeva Date: Sat, 23 Nov 2024 13:20:57 -0700 Subject: [PATCH 3/3] Run one executable for soca2cice (instead of two) (#3118) Run a single executable to add soca increments to cice restart files, processing arctic and antarctic simultaneously to save on runtime and I/O. Resolves NOAA-EMC/GDASApp#1367 --------- Co-authored-by: shlyaeva Co-authored-by: RussTreadon-NOAA <26926959+RussTreadon-NOAA@users.noreply.github.com> Co-authored-by: RussTreadon-NOAA --- scripts/exglobal_marine_analysis_checkpoint.py | 5 ++--- sorc/gdas.cd | 2 +- ush/python/pygfs/task/marine_analysis.py | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/scripts/exglobal_marine_analysis_checkpoint.py b/scripts/exglobal_marine_analysis_checkpoint.py index 84b180b287..c47a2e3a0e 100755 --- a/scripts/exglobal_marine_analysis_checkpoint.py +++ b/scripts/exglobal_marine_analysis_checkpoint.py @@ -24,6 +24,5 @@ # Prepare the SOCA increment for MOM6 IAU MarineAnl.checkpoint_mom6_iau('socaincr2mom6.yaml') - # Insert the seaice analysis into the CICE6 restarts in 2 sequential stages - MarineAnl.checkpoint_cice6('soca_2cice_arctic.yaml') - MarineAnl.checkpoint_cice6('soca_2cice_antarctic.yaml') + # Insert the seaice analysis into the CICE6 restart + MarineAnl.checkpoint_cice6('soca_2cice_global.yaml') diff --git a/sorc/gdas.cd b/sorc/gdas.cd index e514b92656..9ab7994a0c 160000 --- a/sorc/gdas.cd +++ b/sorc/gdas.cd @@ -1 +1 @@ -Subproject commit e514b926561bfc8fa3de741876505aff74255c95 +Subproject commit 9ab7994a0caf6b201613dd7e7ceae482ffa600e0 diff --git a/ush/python/pygfs/task/marine_analysis.py b/ush/python/pygfs/task/marine_analysis.py index 75cc28c7b3..4f8fa760c0 100644 --- a/ush/python/pygfs/task/marine_analysis.py +++ b/ush/python/pygfs/task/marine_analysis.py @@ -284,7 +284,7 @@ def _prep_checkpoint(self: Task) -> None: # render the SOCA to CICE YAML file for the Arctic and Antarctic logger.info("render the SOCA to CICE YAML file for the Arctic and Antarctic") - varchgyamls = ['soca_2cice_arctic.yaml', 'soca_2cice_antarctic.yaml'] + varchgyamls = ['soca_2cice_global.yaml'] for varchgyaml in varchgyamls: soca2cice_config = parse_j2yaml(path=os.path.join(self.task_config.MARINE_JCB_GDAS_ALGO, f'{varchgyaml}.j2'), data=soca2cice_param)