diff --git a/docs/source/index.rst b/docs/source/index.rst index 1b8dc5e952..2eb786199a 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -10,7 +10,7 @@ Status ====== * State of develop (HEAD) branch: GFSv17+ development -* State of operations (dev/gfs.v16 branch): GFS v16.3.11 `tag: [gfs.v16.3.11] `_ +* State of operations (dev/gfs.v16 branch): GFS v16.3.12 `tag: [gfs.v16.3.12] `_ ============= Code managers diff --git a/jobs/JGLOBAL_PREP_OCEAN_OBS b/jobs/JGLOBAL_PREP_OCEAN_OBS index 44cbbf1c08..a100aca89c 100755 --- a/jobs/JGLOBAL_PREP_OCEAN_OBS +++ b/jobs/JGLOBAL_PREP_OCEAN_OBS @@ -8,6 +8,7 @@ source "${HOMEgfs}/ush/jjob_header.sh" -e "prepoceanobs" -c "base prepoceanobs" ############################################## export COMIN_OBS="${DATA}" +YMD=${PDY} HH=${cyc} generate_com -rx COMOUT_OBS:COM_OBS_TMPL ############################################## # Begin JOB SPECIFIC work diff --git a/jobs/rocoto/atmos_products.sh b/jobs/rocoto/atmos_products.sh index fbc10cadbd..472f202de8 100755 --- a/jobs/rocoto/atmos_products.sh +++ b/jobs/rocoto/atmos_products.sh @@ -22,7 +22,11 @@ IFS='_' read -ra fhrs <<< "${FHRLST//f}" # strip off the 'f's and convert to arr #--------------------------------------------------------------- # Execute the JJOB for fhr in "${fhrs[@]}"; do - export FORECAST_HOUR=$(( 10#${fhr} )) + # The analysis fhr is -001. Performing math on negative, leading 0 integers is tricky. + # The negative needs to be in front of "10#", so do some regex magic to make it happen. + fhr="10#${fhr}" + fhr=${fhr//10\#-/-10\#} + export FORECAST_HOUR=$(( fhr )) "${HOMEgfs}/jobs/JGLOBAL_ATMOS_PRODUCTS" status=$? if (( status != 0 )); then exit "${status}"; fi diff --git a/parm/ufs/ufs.configure.atm.IN b/parm/ufs/ufs.configure.atm.IN index c74fe38128..3457d8cf53 100644 --- a/parm/ufs/ufs.configure.atm.IN +++ b/parm/ufs/ufs.configure.atm.IN @@ -3,10 +3,20 @@ logKindFlag: @[esmf_logkind] globalResourceControl: true EARTH_component_list: ATM +EARTH_attributes:: + Verbosity = 0 +:: + +# ATM # ATM_model: @[atm_model] ATM_petlist_bounds: @[atm_petlist_bounds] ATM_omp_num_threads: @[atm_omp_num_threads] +ATM_attributes:: + Verbosity = 0 + Diagnostic = 0 +:: +# Run Sequence # runSeq:: ATM :: diff --git a/parm/ufs/ufs.configure.atm_aero.IN b/parm/ufs/ufs.configure.atm_aero.IN index a83a4f9cad..629cc156ce 100644 --- a/parm/ufs/ufs.configure.atm_aero.IN +++ b/parm/ufs/ufs.configure.atm_aero.IN @@ -9,7 +9,7 @@ globalResourceControl: true # EARTH # EARTH_component_list: ATM CHM EARTH_attributes:: - Verbosity = max + Verbosity = 0 :: # ATM # @@ -17,7 +17,7 @@ ATM_model: @[atm_model] ATM_petlist_bounds: @[atm_petlist_bounds] ATM_omp_num_threads: @[atm_omp_num_threads] ATM_attributes:: - Verbosity = max + Verbosity = 0 :: # CHM # @@ -25,7 +25,7 @@ CHM_model: @[chm_model] CHM_petlist_bounds: @[chm_petlist_bounds] CHM_omp_num_threads: @[chm_omp_num_threads] CHM_attributes:: - Verbosity = max + Verbosity = 0 :: # Run Sequence # @@ -38,13 +38,3 @@ runSeq:: ATM phase2 @ :: - -# CMEPS variables - -DRIVER_attributes:: - mediator_read_restart = .false. -:: - -ALLCOMP_attributes:: - start_type = startup -:: diff --git a/parm/ufs/ufs.configure.cpld.IN b/parm/ufs/ufs.configure.cpld.IN index 5265e7f13b..e473fb2a03 100644 --- a/parm/ufs/ufs.configure.cpld.IN +++ b/parm/ufs/ufs.configure.cpld.IN @@ -39,6 +39,8 @@ OCN_attributes:: ProfileMemory = false OverwriteSlice = true mesh_ocn = @[MESH_OCN_ICE] + use_coldstart = @[use_coldstart] + use_mommesh = @[use_mommesh] :: # ICE # @@ -51,6 +53,7 @@ ICE_attributes:: ProfileMemory = false OverwriteSlice = true mesh_ice = @[MESH_OCN_ICE] + eps_imesh = @[eps_imesh] stop_n = @[RESTART_N] stop_option = nhours stop_ymd = -999 @@ -107,9 +110,6 @@ ALLCOMP_attributes:: restart_option = nhours restart_ymd = -999 dbug_flag = @[cap_dbug_flag] - use_coldstart = @[use_coldstart] - use_mommesh = @[use_mommesh] - eps_imesh = @[eps_imesh] stop_n = @[FHMAX] stop_option = nhours stop_ymd = -999 diff --git a/parm/ufs/ufs.configure.cpld_aero.IN b/parm/ufs/ufs.configure.cpld_aero.IN index d998338583..d90d377006 100644 --- a/parm/ufs/ufs.configure.cpld_aero.IN +++ b/parm/ufs/ufs.configure.cpld_aero.IN @@ -47,6 +47,8 @@ OCN_attributes:: ProfileMemory = false OverwriteSlice = true mesh_ocn = @[MESH_OCN_ICE] + use_coldstart = @[use_coldstart] + use_mommesh = @[use_mommesh] :: # ICE # @@ -59,6 +61,7 @@ ICE_attributes:: ProfileMemory = false OverwriteSlice = true mesh_ice = @[MESH_OCN_ICE] + eps_imesh = @[eps_imesh] stop_n = @[RESTART_N] stop_option = nhours stop_ymd = -999 @@ -119,9 +122,6 @@ ALLCOMP_attributes:: restart_option = nhours restart_ymd = -999 dbug_flag = @[cap_dbug_flag] - use_coldstart = @[use_coldstart] - use_mommesh = @[use_mommesh] - eps_imesh = @[eps_imesh] stop_n = @[FHMAX] stop_option = nhours stop_ymd = -999 diff --git a/parm/ufs/ufs.configure.cpld_aero_outerwave.IN b/parm/ufs/ufs.configure.cpld_aero_outerwave.IN index f95f5d9b8e..23e7751112 100644 --- a/parm/ufs/ufs.configure.cpld_aero_outerwave.IN +++ b/parm/ufs/ufs.configure.cpld_aero_outerwave.IN @@ -47,6 +47,8 @@ OCN_attributes:: ProfileMemory = false OverwriteSlice = true mesh_ocn = @[MESH_OCN_ICE] + use_coldstart = @[use_coldstart] + use_mommesh = @[use_mommesh] :: # ICE # @@ -59,6 +61,7 @@ ICE_attributes:: ProfileMemory = false OverwriteSlice = true mesh_ice = @[MESH_OCN_ICE] + eps_imesh = @[eps_imesh] stop_n = @[RESTART_N] stop_option = nhours stop_ymd = -999 @@ -71,10 +74,7 @@ WAV_omp_num_threads: @[wav_omp_num_threads] WAV_attributes:: Verbosity = 0 OverwriteSlice = false - diro = "." - logfile = wav.log mesh_wav = @[MESH_WAV] - multigrid = @[MULTIGRID] :: # CMEPS warm run sequence @@ -139,9 +139,6 @@ ALLCOMP_attributes:: restart_option = nhours restart_ymd = -999 dbug_flag = @[cap_dbug_flag] - use_coldstart = @[use_coldstart] - use_mommesh = @[use_mommesh] - eps_imesh = @[eps_imesh] stop_n = @[FHMAX] stop_option = nhours stop_ymd = -999 diff --git a/parm/ufs/ufs.configure.cpld_aero_wave.IN b/parm/ufs/ufs.configure.cpld_aero_wave.IN index 38ca37de72..ab0f6a9f8d 100644 --- a/parm/ufs/ufs.configure.cpld_aero_wave.IN +++ b/parm/ufs/ufs.configure.cpld_aero_wave.IN @@ -47,6 +47,8 @@ OCN_attributes:: ProfileMemory = false OverwriteSlice = true mesh_ocn = @[MESH_OCN_ICE] + use_coldstart = @[use_coldstart] + use_mommesh = @[use_mommesh] :: # ICE # @@ -59,6 +61,7 @@ ICE_attributes:: ProfileMemory = false OverwriteSlice = true mesh_ice = @[MESH_OCN_ICE] + eps_imesh = @[eps_imesh] stop_n = @[RESTART_N] stop_option = nhours stop_ymd = -999 @@ -71,10 +74,7 @@ WAV_omp_num_threads: @[wav_omp_num_threads] WAV_attributes:: Verbosity = 0 OverwriteSlice = false - diro = "." - logfile = wav.log mesh_wav = @[MESH_WAV] - multigrid = @[MULTIGRID] :: # CMEPS warm run sequence @@ -139,9 +139,6 @@ ALLCOMP_attributes:: restart_option = nhours restart_ymd = -999 dbug_flag = @[cap_dbug_flag] - use_coldstart = @[use_coldstart] - use_mommesh = @[use_mommesh] - eps_imesh = @[eps_imesh] stop_n = @[FHMAX] stop_option = nhours stop_ymd = -999 diff --git a/parm/ufs/ufs.configure.cpld_outerwave.IN b/parm/ufs/ufs.configure.cpld_outerwave.IN index a2c6c34777..9a45d5ff9a 100644 --- a/parm/ufs/ufs.configure.cpld_outerwave.IN +++ b/parm/ufs/ufs.configure.cpld_outerwave.IN @@ -39,6 +39,8 @@ OCN_attributes:: ProfileMemory = false OverwriteSlice = true mesh_ocn = @[MESH_OCN_ICE] + use_coldstart = @[use_coldstart] + use_mommesh = @[use_mommesh] :: # ICE # @@ -51,6 +53,7 @@ ICE_attributes:: ProfileMemory = false OverwriteSlice = true mesh_ice = @[MESH_OCN_ICE] + eps_imesh = @[eps_imesh] stop_n = @[RESTART_N] stop_option = nhours stop_ymd = -999 @@ -63,10 +66,7 @@ WAV_omp_num_threads: @[wav_omp_num_threads] WAV_attributes:: Verbosity = 0 OverwriteSlice = false - diro = "." - logfile = wav.log mesh_wav = @[MESH_WAV] - multigrid = @[MULTIGRID] :: # CMEPS warm run sequence @@ -127,9 +127,6 @@ ALLCOMP_attributes:: restart_option = nhours restart_ymd = -999 dbug_flag = @[cap_dbug_flag] - use_coldstart = @[use_coldstart] - use_mommesh = @[use_mommesh] - eps_imesh = @[eps_imesh] stop_n = @[FHMAX] stop_option = nhours stop_ymd = -999 diff --git a/parm/ufs/ufs.configure.cpld_wave.IN b/parm/ufs/ufs.configure.cpld_wave.IN index 96c83501d1..37a462a5d4 100644 --- a/parm/ufs/ufs.configure.cpld_wave.IN +++ b/parm/ufs/ufs.configure.cpld_wave.IN @@ -39,6 +39,8 @@ OCN_attributes:: ProfileMemory = false OverwriteSlice = true mesh_ocn = @[MESH_OCN_ICE] + use_coldstart = @[use_coldstart] + use_mommesh = @[use_mommesh] :: # ICE # @@ -51,6 +53,7 @@ ICE_attributes:: ProfileMemory = false OverwriteSlice = true mesh_ice = @[MESH_OCN_ICE] + eps_imesh = @[eps_imesh] stop_n = @[RESTART_N] stop_option = nhours stop_ymd = -999 @@ -63,10 +66,7 @@ WAV_omp_num_threads: @[wav_omp_num_threads] WAV_attributes:: Verbosity = 0 OverwriteSlice = false - diro = "." - logfile = wav.log mesh_wav = @[MESH_WAV] - multigrid = @[MULTIGRID] :: # CMEPS warm run sequence @@ -127,9 +127,6 @@ ALLCOMP_attributes:: restart_option = nhours restart_ymd = -999 dbug_flag = @[cap_dbug_flag] - use_coldstart = @[use_coldstart] - use_mommesh = @[use_mommesh] - eps_imesh = @[eps_imesh] stop_n = @[FHMAX] stop_option = nhours stop_ymd = -999 diff --git a/scripts/exgfs_aero_init_aerosol.py b/scripts/exgfs_aero_init_aerosol.py index db5e462f64..1c81880ca9 100755 --- a/scripts/exgfs_aero_init_aerosol.py +++ b/scripts/exgfs_aero_init_aerosol.py @@ -41,14 +41,14 @@ from functools import partial # Constants -atm_base_pattern = "{rot_dir}/{cdump}.%Y%m%d/%H/atmos/INPUT" # Location of atmosphere ICs +atm_base_pattern = "{rot_dir}/{cdump}.%Y%m%d/%H/model_data/atmos/input" # Location of atmosphere ICs atm_file_pattern = "{path}/gfs_data.{tile}.nc" # Atm IC file names atm_ctrl_pattern = "{path}/gfs_ctrl.nc" # Atm IC control file name -restart_base_pattern = "{rot_dir}/{cdump}.%Y%m%d/%H/atmos/RERUN_RESTART" # Location of restart files (time of previous run) +restart_base_pattern = "{rot_dir}/{cdump}.%Y%m%d/%H/model_data/atmos/restart" # Location of restart files (time of previous run) restart_file_pattern = "{file_base}/{timestamp}fv_core.res.{tile}.nc" # Name of restart data files (time when restart is valid) tracer_file_pattern = "{file_base}/{timestamp}fv_tracer.res.{tile}.nc" # Name of restart tracer files (time when restart is valid) dycore_file_pattern = "{file_base}/{timestamp}fv_core.res.nc" # Name of restart dycore file (time when restart is valid) -tracer_list_file_pattern = "{parm_gfs}/chem/gocart_tracer.list" # Text list of tracer names to copy +tracer_list_file_pattern = "{parm_gfs}/ufs/gocart/gocart_tracer.list" # Text list of tracer names to copy merge_script_pattern = "{ush_gfs}/merge_fv3_aerosol_tile.py" n_tiles = 6 max_lookback = 4 # Maximum number of past cycles to look for for tracer data diff --git a/sorc/build_all.sh b/sorc/build_all.sh index e65c50e8de..ccc088acd9 100755 --- a/sorc/build_all.sh +++ b/sorc/build_all.sh @@ -98,9 +98,9 @@ fi #------------------------------------ # Disable shellcheck warning about single quotes not being substituted. # shellcheck disable=SC2016 -ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} +ERRSCRIPT=${ERRSCRIPT:-'eval [[ $errs = 0 ]]'} # shellcheck disable= -err=0 +errs=0 declare -A build_jobs declare -A build_opts @@ -219,7 +219,6 @@ while [[ ${builds_started} -lt ${#build_jobs[@]} ]]; do done # Wait for all jobs to complete and check return statuses -errs=0 while [[ ${#build_jobs[@]} -gt 0 ]]; do for build in "${!build_jobs[@]}"; do # Test if each job is complete and if so, notify and remove from the array @@ -252,7 +251,7 @@ if (( errs != 0 )); then BUILD ERROR: One or more components failed to build Check the associated build log(s) for details. EOF - ${ERRSCRIPT} || exit "${err}" + ${ERRSCRIPT} || exit "${errs}" fi echo;echo " .... Build system finished .... " diff --git a/sorc/link_workflow.sh b/sorc/link_workflow.sh index 1bdb4dd492..3311eb9c3d 100755 --- a/sorc/link_workflow.sh +++ b/sorc/link_workflow.sh @@ -122,12 +122,6 @@ do done -if [[ -d "${HOMEgfs}/sorc/ufs_utils.fd" ]]; then - cd "${HOMEgfs}/sorc/ufs_utils.fd/fix" || exit 1 - ./link_fixdirs.sh "${RUN_ENVIR}" "${machine}" 2> /dev/null -fi - - #--------------------------------------- #--add files from external repositories #--------------------------------------- diff --git a/sorc/ufs_model.fd b/sorc/ufs_model.fd index 3ba8dff29a..991d6527da 160000 --- a/sorc/ufs_model.fd +++ b/sorc/ufs_model.fd @@ -1 +1 @@ -Subproject commit 3ba8dff29a7395445ce5da8c9b48cfe0ff8a668a +Subproject commit 991d6527da22d11016df035998ec1352d0449875 diff --git a/ush/merge_fv3_aerosol_tile.py b/ush/merge_fv3_aerosol_tile.py index decf6e9cba..58afa2fc8b 100755 --- a/ush/merge_fv3_aerosol_tile.py +++ b/ush/merge_fv3_aerosol_tile.py @@ -88,14 +88,6 @@ def merge_tile(base_file_name: str, ctrl_file_name: str, core_file_name: str, re print("FATAL ERROR: Inconsistent size of B(k) arrays: src=", bk.size, ", dst=", bi.size) sys.exit(108) - if not np.array_equal(ak, ai): - print("FATAL ERROR: A(k) coefficients must be identical") - sys.exit(109) - - if not np.array_equal(bk, bi): - print("FATAL ERROR: B(k) coefficients must be identical") - sys.exit(110) - dp = np.zeros(delp.shape) for k in range(0, dp.shape[0]): dp[k, :, :] = ak[k + 1] - ak[k] + psfc * (bk[k + 1] - bk[k]) diff --git a/ush/parsing_model_configure_FV3.sh b/ush/parsing_model_configure_FV3.sh index f01b596a16..e08a4a2b17 100755 --- a/ush/parsing_model_configure_FV3.sh +++ b/ush/parsing_model_configure_FV3.sh @@ -41,6 +41,7 @@ write_groups: ${WRITE_GROUP:-1} write_tasks_per_group: ${WRTTASK_PER_GROUP:-24} itasks: 1 output_history: ${OUTPUT_HISTORY:-".true."} +history_file_on_native_grid: .false. write_dopost: ${WRITE_DOPOST:-".false."} write_nsflip: ${WRITE_NSFLIP:-".false."} num_files: ${NUM_FILES:-2} @@ -54,7 +55,8 @@ ichunk3d: ${ichunk3d:-0} jchunk3d: ${jchunk3d:-0} kchunk3d: ${kchunk3d:-0} ideflate: ${ideflate:-1} -nbits: ${nbits:-14} +quantize_mode: 'quantize_bitround' +quantize_nsd: ${QUANTIZE_NSD:-0} imo: ${LONB_IMO} jmo: ${LATB_JMO} output_fh: ${FV3_OUTPUT_FH} diff --git a/workflow/create_experiment.py b/workflow/create_experiment.py index cfa49e0d38..7e0f350c0f 100755 --- a/workflow/create_experiment.py +++ b/workflow/create_experiment.py @@ -79,7 +79,7 @@ def input_args(): if 'skip_ci_on_hosts' in testconf: host = Host() - if host.machine.lower() in testconf.skip_ci_on_hosts.lower(): + if host.machine.lower() in [machine.lower() for machine in testconf.skip_ci_on_hosts]: logger.info(f'Skipping creation of case: {testconf.arguments.pslot} on {host.machine.capitalize()}') sys.exit(0) diff --git a/workflow/rocoto/gfs_tasks.py b/workflow/rocoto/gfs_tasks.py index 2e58e63184..18208983b8 100644 --- a/workflow/rocoto/gfs_tasks.py +++ b/workflow/rocoto/gfs_tasks.py @@ -164,7 +164,7 @@ def aerosol_init(self): [f'@Y@m@d.@H0000.fv_tracer.res.tile{tile}.nc' for tile in range(1, self.n_tiles + 1)] for file in files: - data = [f'{restart_path}', file] + data = [f'{restart_path}/', file] dep_dict = {'type': 'data', 'data': data, 'offset': [offset, None]} deps.append(rocoto.add_dependency(dep_dict))