From 9aad86f27d37d19165b9a0b64cf70c7a4dd6362c Mon Sep 17 00:00:00 2001 From: TerrenceMcGuinness-NOAA Date: Fri, 17 May 2024 12:57:59 -0400 Subject: [PATCH 01/45] Add remove RUNDIRS step in CI before creating experements (#2607) As had been done in Bash CI we need to remove the RUNDIR in Jenkins before a creating an experiment in the event that case had beem previously ran. --- ci/scripts/utils/ci_utils.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ci/scripts/utils/ci_utils.sh b/ci/scripts/utils/ci_utils.sh index d49acb5762..2a51467d38 100755 --- a/ci/scripts/utils/ci_utils.sh +++ b/ci/scripts/utils/ci_utils.sh @@ -122,7 +122,8 @@ function create_experiment () { source "${HOMEgfs}/ci/platforms/config.${MACHINE_ID}" source "${HOMEgfs}/workflow/gw_setup.sh" - # system=$(grep "system:" "${yaml_config}" | cut -d":" -f2 | tr -d " ") || true + # Remove RUNDIRS dir incase this is a retry + rm -Rf "${STMP}/RUNDIRS/${pslot}" "${HOMEgfs}/${system}/workflow/create_experiment.py" --overwrite --yaml "${yaml_config}" From 5369a1ff3a3969149fcf32810fad0e50216752b7 Mon Sep 17 00:00:00 2001 From: David Huber <69919478+DavidHuber-NOAA@users.noreply.github.com> Date: Tue, 21 May 2024 22:12:29 +0000 Subject: [PATCH 02/45] Refactored archiving (#2491) This provides a new pygfs task, archive.py, that provides all of the tools necessary to archive data to the local (`ARCDIR`) and backup (`ATARDIR`) archive directories. YAML-Jinja2 templates are provided to define the file to be archived or tarred to replace the `hpssarch_gen.sh`, `exglobal_earc`, and `exglobal_archive.sh` scripts and make it easier to add new data and explicitly handle optional and required files. For `ATARDIR` archiving, a master jinja template is provided for each `RUN` (i.e. master_gdas.yaml.j2, master_gfs.yaml.j2, master_enkf.yaml.j2). The master_enkf.yaml.j2 template is used for both `enkfgdas` and `enkfgfs` `RUN`s. These templates then include the appropriate `RUN`-specific jinja templates (e.g. gdas.yaml.j2) based on experiment, cycle, and coupled parameters. Each of these templates corresponds to a single tarball to populate and are tabbed 4 spaces so they are defined within the master `datasets` dictionary. Future developers should not have to make modifications to archive.py unless archiving is being enabled for a new `RUN` (e.g. `gefs`) and then only a single `elif` needs to be added to the configure method to specify the master `ATARDIR` template to archive (e.g. `master_gefs.yaml.j2`). If a new component is coming online that needs to be archived to `ATARDIR` (e.g. SNOW), then create a new template for each `RUN` that it needs to be archived for (e.g. `gdassnow.yaml.j2`) and reference the template in the appropriate master templates, e.g. `master_gdas.yaml:` ```jinja {% if DO_SNOW %} {% include "gdassnow.yaml.j2" %} {% endif %} ``` A few other issues were addressed along the way: 1. Aerosols have been reenabled. Aerosol forecasts should only be performed during gdas cycles, but analyses can be performed for both gfs and gdas cycles. This was accomplished by setting separate `AERO__CDUMP` variables to parse on for both `ANL` and `FCST` jobs. 2. Fixed the name of the `cice6_rst_ok` variable in `forecast_det.sh`. This prevented restarts from being used for cice-enable experiments. This feature was not tested. 3. Create a temporary fix for the `wgrib` utility. For spack-stack 1.6.0, the `grib-util` module file does not declare `WGRIB`. An issue is open (https://github.com/JCSDA/spack-stack/issues/1097) to fix this in existing installations. Once complete, this temporary fix should be removed. 4. The number of `earc` jobs has been reduced for lower resolution experiments. Both C48 and C96 experiments will now only have two earc jobs (one for the non-member files to archive and another for the member files). C192 will have up to 3 earc jobs (one non-member, one for members 1-40 and another for members 41-80, if needed). Resolves #2345 Resolves #2318 --------- Co-authored-by: Walter Kolczynski - NOAA --- jobs/JGDAS_ENKF_ARCHIVE | 2 +- jobs/JGLOBAL_ARCHIVE | 6 +- jobs/rocoto/arch.sh | 5 + jobs/rocoto/earc.sh | 6 +- modulefiles/module_base.hera.lua | 4 + modulefiles/module_base.hercules.lua | 4 + modulefiles/module_base.jet.lua | 4 + modulefiles/module_base.orion.lua | 4 + modulefiles/module_base.s4.lua | 4 + parm/archive/arcdir.yaml.j2 | 85 +++ parm/archive/chem.yaml.j2 | 7 + parm/archive/enkf.yaml.j2 | 74 ++ parm/archive/enkf_grp.yaml.j2 | 29 + parm/archive/enkf_restarta_grp.yaml.j2 | 48 ++ parm/archive/enkf_restartb_grp.yaml.j2 | 37 + parm/archive/gdas.yaml.j2 | 128 ++++ parm/archive/gdas_restarta.yaml.j2 | 49 ++ parm/archive/gdas_restartb.yaml.j2 | 39 + parm/archive/gdasice.yaml.j2 | 10 + parm/archive/gdasice_restart.yaml.j2 | 7 + parm/archive/gdasocean.yaml.j2 | 9 + parm/archive/gdasocean_analysis.yaml.j2 | 27 + parm/archive/gdasocean_restart.yaml.j2 | 8 + parm/archive/gdaswave.yaml.j2 | 8 + parm/archive/gdaswave_restart.yaml.j2 | 6 + parm/archive/gfs_downstream.yaml.j2 | 12 + parm/archive/gfs_flux.yaml.j2 | 9 + parm/archive/gfs_flux_1p00.yaml.j2 | 9 + parm/archive/gfs_netcdfa.yaml.j2 | 16 + parm/archive/gfs_netcdfb.yaml.j2 | 9 + parm/archive/gfs_pgrb2b.yaml.j2 | 19 + parm/archive/gfs_restarta.yaml.j2 | 23 + parm/archive/gfsa.yaml.j2 | 62 ++ parm/archive/gfsb.yaml.j2 | 17 + parm/archive/gfswave.yaml.j2 | 23 + parm/archive/ice_6hravg.yaml.j2 | 9 + parm/archive/ice_grib2.yaml.j2 | 18 + parm/archive/master_enkf.yaml.j2 | 100 +++ parm/archive/master_enkfgdas.yaml.j2 | 6 + parm/archive/master_enkfgfs.yaml.j2 | 6 + parm/archive/master_gdas.yaml.j2 | 87 +++ parm/archive/master_gfs.yaml.j2 | 95 +++ parm/archive/ocean_6hravg.yaml.j2 | 8 + parm/archive/ocean_daily.yaml.j2 | 8 + parm/archive/ocean_grib2.yaml.j2 | 18 + parm/config/gefs/config.base | 16 + parm/config/gefs/config.efcs | 2 +- parm/config/gefs/config.fcst | 10 +- parm/config/gefs/config.wave | 5 - parm/config/gefs/config.wavepostsbs | 1 - parm/config/gfs/config.base | 39 +- parm/config/gfs/config.earc | 20 +- parm/config/gfs/config.efcs | 9 +- parm/config/gfs/config.epos | 3 - parm/config/gfs/config.fcst | 17 +- parm/config/gfs/config.wave | 14 +- parm/config/gfs/config.wavepostsbs | 1 - scripts/exgdas_enkf_earc.py | 60 ++ scripts/exgdas_enkf_earc.sh | 163 ----- scripts/exgfs_atmos_postsnd.sh | 2 +- scripts/exglobal_archive.py | 63 ++ scripts/exglobal_archive.sh | 321 --------- sorc/build_all.sh | 2 +- sorc/wxflow | 2 +- ush/check_netcdf.sh | 2 +- ush/forecast_det.sh | 2 +- ush/forecast_postdet.sh | 4 +- ush/hpssarch_gen.sh | 798 --------------------- ush/python/pygfs/task/analysis.py | 1 + ush/python/pygfs/task/archive.py | 381 ++++++++++ workflow/applications/applications.py | 8 + workflow/applications/gfs_cycled.py | 9 +- workflow/applications/gfs_forecast_only.py | 4 +- workflow/rocoto/gfs_tasks.py | 4 +- 74 files changed, 1788 insertions(+), 1339 deletions(-) create mode 100644 parm/archive/arcdir.yaml.j2 create mode 100644 parm/archive/chem.yaml.j2 create mode 100644 parm/archive/enkf.yaml.j2 create mode 100644 parm/archive/enkf_grp.yaml.j2 create mode 100644 parm/archive/enkf_restarta_grp.yaml.j2 create mode 100644 parm/archive/enkf_restartb_grp.yaml.j2 create mode 100644 parm/archive/gdas.yaml.j2 create mode 100644 parm/archive/gdas_restarta.yaml.j2 create mode 100644 parm/archive/gdas_restartb.yaml.j2 create mode 100644 parm/archive/gdasice.yaml.j2 create mode 100644 parm/archive/gdasice_restart.yaml.j2 create mode 100644 parm/archive/gdasocean.yaml.j2 create mode 100644 parm/archive/gdasocean_analysis.yaml.j2 create mode 100644 parm/archive/gdasocean_restart.yaml.j2 create mode 100644 parm/archive/gdaswave.yaml.j2 create mode 100644 parm/archive/gdaswave_restart.yaml.j2 create mode 100644 parm/archive/gfs_downstream.yaml.j2 create mode 100644 parm/archive/gfs_flux.yaml.j2 create mode 100644 parm/archive/gfs_flux_1p00.yaml.j2 create mode 100644 parm/archive/gfs_netcdfa.yaml.j2 create mode 100644 parm/archive/gfs_netcdfb.yaml.j2 create mode 100644 parm/archive/gfs_pgrb2b.yaml.j2 create mode 100644 parm/archive/gfs_restarta.yaml.j2 create mode 100644 parm/archive/gfsa.yaml.j2 create mode 100644 parm/archive/gfsb.yaml.j2 create mode 100644 parm/archive/gfswave.yaml.j2 create mode 100644 parm/archive/ice_6hravg.yaml.j2 create mode 100644 parm/archive/ice_grib2.yaml.j2 create mode 100644 parm/archive/master_enkf.yaml.j2 create mode 100644 parm/archive/master_enkfgdas.yaml.j2 create mode 100644 parm/archive/master_enkfgfs.yaml.j2 create mode 100644 parm/archive/master_gdas.yaml.j2 create mode 100644 parm/archive/master_gfs.yaml.j2 create mode 100644 parm/archive/ocean_6hravg.yaml.j2 create mode 100644 parm/archive/ocean_daily.yaml.j2 create mode 100644 parm/archive/ocean_grib2.yaml.j2 create mode 100755 scripts/exgdas_enkf_earc.py delete mode 100755 scripts/exgdas_enkf_earc.sh create mode 100755 scripts/exglobal_archive.py delete mode 100755 scripts/exglobal_archive.sh delete mode 100755 ush/hpssarch_gen.sh create mode 100644 ush/python/pygfs/task/archive.py diff --git a/jobs/JGDAS_ENKF_ARCHIVE b/jobs/JGDAS_ENKF_ARCHIVE index 07e171d668..5ac46a73e7 100755 --- a/jobs/JGDAS_ENKF_ARCHIVE +++ b/jobs/JGDAS_ENKF_ARCHIVE @@ -18,7 +18,7 @@ MEMDIR="ensstat" YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \ # Run archive script ############################################################### -"${SCRgfs}/exgdas_enkf_earc.sh" +"${SCRgfs}/exgdas_enkf_earc.py" status=$? [[ ${status} -ne 0 ]] && exit "${status}" diff --git a/jobs/JGLOBAL_ARCHIVE b/jobs/JGLOBAL_ARCHIVE index 2410b49732..cec3505000 100755 --- a/jobs/JGLOBAL_ARCHIVE +++ b/jobs/JGLOBAL_ARCHIVE @@ -17,9 +17,9 @@ YMD=${PDY} HH=${cyc} declare_from_tmpl -rx COM_ATMOS_ANALYSIS COM_ATMOS_BUFR COM COM_SNOW_ANALYSIS \ COM_ICE_HISTORY COM_ICE_INPUT COM_ICE_RESTART COM_ICE_GRIB \ COM_OBS COM_TOP \ - COM_OCEAN_HISTORY COM_OCEAN_INPUT COM_OCEAN_RESTART COM_OCEAN_GRIB COM_OCEAN_NETCDF \ + COM_OCEAN_HISTORY COM_OCEAN_RESTART COM_OCEAN_GRIB COM_OCEAN_NETCDF \ COM_OCEAN_ANALYSIS \ - COM_WAVE_GRID COM_WAVE_HISTORY COM_WAVE_STATION \ + COM_WAVE_GRID COM_WAVE_HISTORY COM_WAVE_STATION COM_WAVE_RESTART \ COM_ATMOS_OZNMON COM_ATMOS_RADMON COM_ATMOS_MINMON COM_CONF for grid in "0p25" "0p50" "1p00"; do @@ -30,7 +30,7 @@ done # Run archive script ############################################################### -${GLOBALARCHIVESH:-${SCRgfs}/exglobal_archive.sh} +${GLOBALARCHIVESH:-${SCRgfs}/exglobal_archive.py} status=$? [[ ${status} -ne 0 ]] && exit "${status}" diff --git a/jobs/rocoto/arch.sh b/jobs/rocoto/arch.sh index d949b7d76f..083e319bf5 100755 --- a/jobs/rocoto/arch.sh +++ b/jobs/rocoto/arch.sh @@ -8,6 +8,11 @@ source "${HOMEgfs}/ush/preamble.sh" status=$? [[ ${status} -ne 0 ]] && exit "${status}" +############################################################### +# setup python path for workflow utilities and tasks +PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${HOMEgfs}/ush/python" +export PYTHONPATH + export job="arch" export jobid="${job}.$$" diff --git a/jobs/rocoto/earc.sh b/jobs/rocoto/earc.sh index c4c7341698..4a9263b509 100755 --- a/jobs/rocoto/earc.sh +++ b/jobs/rocoto/earc.sh @@ -8,6 +8,11 @@ source "${HOMEgfs}/ush/preamble.sh" status=$? [[ ${status} -ne 0 ]] && exit "${status}" +############################################################### +# setup python path for workflow utilities and tasks +PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${HOMEgfs}/ush/python" +export PYTHONPATH + export job="earc" export jobid="${job}.$$" @@ -16,5 +21,4 @@ export jobid="${job}.$$" "${HOMEgfs}/jobs/JGDAS_ENKF_ARCHIVE" status=$? - exit "${status}" diff --git a/modulefiles/module_base.hera.lua b/modulefiles/module_base.hera.lua index c47a1bfd70..f75cf886e7 100644 --- a/modulefiles/module_base.hera.lua +++ b/modulefiles/module_base.hera.lua @@ -41,6 +41,10 @@ load(pathJoin("metplus", (os.getenv("metplus_ver") or "None"))) load(pathJoin("py-xarray", (os.getenv("py_xarray_ver") or "None"))) setenv("WGRIB2","wgrib2") + +-- Stop gap fix for wgrib with spack-stack 1.6.0 +-- TODO Remove this when spack-stack issue #1097 is resolved +setenv("WGRIB","wgrib") setenv("UTILROOT",(os.getenv("prod_util_ROOT") or "None")) --prepend_path("MODULEPATH", pathJoin("/scratch1/NCEPDEV/global/glopara/git/prepobs/v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles")) diff --git a/modulefiles/module_base.hercules.lua b/modulefiles/module_base.hercules.lua index 5835d013d7..998803f246 100644 --- a/modulefiles/module_base.hercules.lua +++ b/modulefiles/module_base.hercules.lua @@ -37,6 +37,10 @@ load(pathJoin("metplus", (os.getenv("metplus_ver") or "None"))) load(pathJoin("py-xarray", (os.getenv("py_xarray_ver") or "None"))) setenv("WGRIB2","wgrib2") + +-- Stop gap fix for wgrib with spack-stack 1.6.0 +-- TODO Remove this when spack-stack issue #1097 is resolved +setenv("WGRIB","wgrib") setenv("UTILROOT",(os.getenv("prod_util_ROOT") or "None")) prepend_path("MODULEPATH", pathJoin("/work/noaa/global/glopara/git/prepobs/feature-GFSv17_com_reorg_log_update/modulefiles")) diff --git a/modulefiles/module_base.jet.lua b/modulefiles/module_base.jet.lua index 31f8aa676d..e53132fd6a 100644 --- a/modulefiles/module_base.jet.lua +++ b/modulefiles/module_base.jet.lua @@ -43,6 +43,10 @@ load(pathJoin("py-xarray", (os.getenv("py_xarray_ver") or "None"))) load(pathJoin("perl", (os.getenv("perl_ver") or "None"))) setenv("WGRIB2","wgrib2") + +-- Stop gap fix for wgrib with spack-stack 1.6.0 +-- TODO Remove this when spack-stack issue #1097 is resolved +setenv("WGRIB","wgrib") setenv("UTILROOT",(os.getenv("prod_util_ROOT") or "None")) --prepend_path("MODULEPATH", pathJoin("/lfs4/HFIP/hfv3gfs/glopara/git/prepobs/v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles")) diff --git a/modulefiles/module_base.orion.lua b/modulefiles/module_base.orion.lua index 72a480a946..4d747512db 100644 --- a/modulefiles/module_base.orion.lua +++ b/modulefiles/module_base.orion.lua @@ -38,6 +38,10 @@ load(pathJoin("metplus", (os.getenv("metplus_ver") or "None"))) load(pathJoin("py-xarray", (os.getenv("py_xarray_ver") or "None"))) setenv("WGRIB2","wgrib2") + +-- Stop gap fix for wgrib with spack-stack 1.6.0 +-- TODO Remove this when spack-stack issue #1097 is resolved +setenv("WGRIB","wgrib") setenv("UTILROOT",(os.getenv("prod_util_ROOT") or "None")) --prepend_path("MODULEPATH", pathJoin("/work/noaa/global/glopara/git/prepobs/v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles")) diff --git a/modulefiles/module_base.s4.lua b/modulefiles/module_base.s4.lua index 6f0602c3eb..835249fb85 100644 --- a/modulefiles/module_base.s4.lua +++ b/modulefiles/module_base.s4.lua @@ -37,6 +37,10 @@ load(pathJoin("metplus", (os.getenv("metplus_ver") or "None"))) load(pathJoin("py-xarray", (os.getenv("py_xarray_ver") or "None"))) setenv("WGRIB2","wgrib2") + +-- Stop gap fix for wgrib with spack-stack 1.6.0 +-- TODO Remove this when spack-stack issue #1097 is resolved +setenv("WGRIB","wgrib") setenv("UTILROOT",(os.getenv("prod_util_ROOT") or "None")) --prepend_path("MODULEPATH", pathJoin("/data/prod/glopara/git/prepobs/v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles")) diff --git a/parm/archive/arcdir.yaml.j2 b/parm/archive/arcdir.yaml.j2 new file mode 100644 index 0000000000..6321f6fc41 --- /dev/null +++ b/parm/archive/arcdir.yaml.j2 @@ -0,0 +1,85 @@ +{% set cycle_HH = current_cycle | strftime("%H") %} +{% set cycle_YMDH = current_cycle | to_YMDH %} +{% set cycle_YMD = current_cycle | to_YMD %} +{% set head = RUN + ".t" + cycle_HH + "z." %} +{% if RUN == "gdas" or RUN == "gfs" %} +deterministic: + mkdir: + - "{{ ARCDIR }}" + {% if RUN == "gfs" %} + - "{{ ARCDIR }}/tracker.{{ cycle_YMDH }}/{{ RUN }}" + {% endif %} + {% if FITSARC %} + {% set VFYARC = ROTDIR + "/vrfyarch" %} + - "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}" + {% endif %} + copy: + {% if current_cycle != SDATE and MODE == "cycled" %} + {% if DO_JEDIATMVAR %} + - ["{{ COM_ATMOS_ANALYSIS }}/{{ head }}atmstat", "{{ ARCDIR }}/atmstat.{{ RUN }}.{{ cycle_YMDH }}"] + {% else %} + - ["{{ COM_ATMOS_ANALYSIS }}/{{ head }}gsistat", "{{ ARCDIR }}/gsistat.{{ RUN }}.{{ cycle_YMDH }}"] + {% endif %} + {% if DO_JEDISNOWDA %} + - ["{{ COM_SNOW_ANALYSIS }}/{{ head }}snowstat.tgz", "{{ ARCDIR }}/snowstat.{{ RUN }}.{{ cycle_YMDH }}.tgz"] + {% endif %} + {% if AERO_ANL_CDUMP == RUN or AERO_ANL_CDUMP == "both" %} + - ["{{ COM_CHEM_ANALYSIS }}/{{ head }}aerostat", "{{ ARCDIR }}/aerostat.{{ RUN }}.{{ cycle_YMDH }}"] + {% endif %} + - ["{{ COM_ATMOS_GRIB_1p00 }}/{{ head }}pgrb2.1p00.anl", "{{ ARCDIR }}/pgbanl.{{ RUN }}.{{ cycle_YMDH }}.grib2"] + {% endif %} # Full cycle + {% if RUN == "gfs" %} + {% set fhmax, fhout = FHMAX_GFS, FHOUT_GFS %} + {% elif RUN == "gdas" %} + {% set fhmax, fhout = FHMAX, FHOUT %} + {% endif %} + {% for fhr in range(0, fhmax + fhout, fhout) %} + - ["{{ COM_ATMOS_GRIB_1p00 }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}", "{{ ARCDIR }}/pgbf{{ '%02d' % fhr }}.{{ RUN }}.{{ cycle_YMDH }}.grib2"] + {% endfor %} + {% if RUN == "gfs" %} + {% if FITSARC %} + {% if FHMAX_FITS is defined %} + {% set fhmax = FHMAX_FITS %} + {% else %} + {% set fhmax = FHMAX_GFS %} + {% endif %} + {% for fhr in range(0, fhmax + 6, 6) %} + {% set sfcfile = "/" + head + "sfcf" + '%03d'|format(fhr) + ".nc" %} + {% set sigfile = "/" + head + "atmf" + '%03d'|format(fhr) + ".nc" %} + - ["{{COM_ATMOS_HISTORY}}/{{ sfcfile }}", "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}/{{ sfcfile }}"] + - ["{{COM_ATMOS_HISTORY}}/{{ sigfile }}", "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}/{{ sigfile }}"] + {% endfor %} + {% endif %} ## FITSARC + {% if path_exists(COM_ATMOS_GENESIS ~ "/storms.gfso.atcf_gen." ~ cycle_YMDH) %} + - ["{{ COM_ATMOS_GENESIS }}/storms.gfso.atcf_gen.{{ cycle_YMDH }}", "{{ ARCDIR }}/storms.gfso.atcf_gen.{{ cycle_YMDH }}"] + - ["{{ COM_ATMOS_GENESIS }}/storms.gfso.atcf_gen.altg.{{ cycle_YMDH }}", "{{ ARCDIR }}/storms.gfso.atcf_gen.altg.{{ cycle_YMDH }}"] + {% endif %} + {% if path_exists(COM_ATMOS_GENESIS ~ "/trak.gfso.atcfunix." ~ cycle_YMDH) %} + - ["{{ COM_ATMOS_GENESIS }}/trak.gfso.atcfunix.{{ cycle_YMDH }}", "{{ ARCDIR }}/trak.gfso.atcfunix.{{ cycle_YMDH }}"] + - ["{{ COM_ATMOS_GENESIS }}/trak.gfso.atcfunix.altg.{{ cycle_YMDH }}", "{{ ARCDIR }}/trak.gfso.atcfunix.altg.{{ cycle_YMDH }}"] + {% endif %} + ## Only created if tracking is on and there were systems to track + {% for basin in ["epac", "natl"] %} + {% if path_exists(COM_ATMOS_TRACK + "/" + basin) %} + - ["{{ COM_ATMOS_TRACK }}/{{ basin }}", "{{ ARCDIR }}/{{ basin }}"] + {% endif %} + {% endfor %} + {% endif %} ## RUN == "gfs" + {% if path_exists(COM_ATMOS_TRACK ~ "/atcfunix." ~ RUN ~ "." ~ cycle_YMDH) %} + - ["{{ COM_ATMOS_TRACK }}/atcfunix.{{ RUN }}.{{ cycle_YMDH }}", "{{ ARCDIR }}/atcfunix.{{ RUN }}.{{ cycle_YMDH }}"] + - ["{{ COM_ATMOS_TRACK }}/atcfunixp.{{ RUN }}.{{ cycle_YMDH }}", "{{ ARCDIR }}/atcfunixp.{{ RUN }}.{{ cycle_YMDH }}"] + {% endif %} +{% endif %} # gfs or gdas +{% if current_cycle != SDATE and (RUN == "enkfgdas" or RUN == "enkfgfs") %} +ensemble: + mkdir: + - "{{ ARCDIR }}" + copy: + {% if DO_JEDIATMENS %} + - ["{{ COM_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}atmensstat", "{{ ARCDIR }}/atmensstat.{{ RUN }}.{{ cycle_YMDH }}"] + - ["{{ COM_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}atminc.ensmean.nc", "{{ ARCDIR }}/atmensstat.{{ RUN }}.{{ cycle_YMDH }}.ensmean.nc"] + {% else %} + - ["{{ COM_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}enkfstat", "{{ ARCDIR }}/enkfstat.{{ RUN }}.{{ cycle_YMDH }}"] + - ["{{ COM_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}gsistat.ensmean", "{{ ARCDIR }}/gsistat.{{ RUN }}.{{ cycle_YMDH }}.ensmean"] + {% endif %} +{% endif %} # enkfgdas or enkfgfs diff --git a/parm/archive/chem.yaml.j2 b/parm/archive/chem.yaml.j2 new file mode 100644 index 0000000000..7796912b1a --- /dev/null +++ b/parm/archive/chem.yaml.j2 @@ -0,0 +1,7 @@ +chem: + {% set head = "gocart" %} + name: "CHEM" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/chem.tar" + required: + # TODO explicitize this set + - "{{ COM_CHEM_HISTORY | relpath(ROTDIR) }}/{{ head }}*" diff --git a/parm/archive/enkf.yaml.j2 b/parm/archive/enkf.yaml.j2 new file mode 100644 index 0000000000..10aee51a19 --- /dev/null +++ b/parm/archive/enkf.yaml.j2 @@ -0,0 +1,74 @@ +enkf: + name: "ENKF" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/{{ RUN }}.tar" + required: + {% for fhr in range(3, fhmax + 1, 3) %} + - "{{ COM_ATMOS_HISTORY_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmf{{ '%03d' % fhr }}.ensmean.nc" + - "{{ COM_ATMOS_HISTORY_ENSSTAT | relpath(ROTDIR) }}/{{ head }}sfcf{{ '%03d' % fhr }}.ensmean.nc" + {% if ENKF_SPREAD %} + - "{{ COM_ATMOS_HISTORY_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmf{{ '%03d' % fhr }}.ensspread.nc" + {% endif %} + {% endfor %} + {% for mem in range(1, nmem_ens + 1) %} + - "logs/{{ cycle_YMDH }}/{{ RUN }}fcst_mem{{ '%03d' % mem }}.log" + {% endfor %} + - "logs/{{ cycle_YMDH }}/{{ RUN }}epos*.log" + - "logs/{{ cycle_YMDH }}/{{ RUN }}echgres.log" + + {% if current_cycle != SDATE %} + # TODO archive ecen logs based on actual groups. Will need to emulate numpy.array_split to do so. + - "logs/{{ cycle_YMDH }}/{{ RUN }}ecen*.log" + - "logs/{{ cycle_YMDH }}/{{ RUN }}esfc.log" + + {% if not DO_JEDIATMENS %} + {% set da_files = ["enkfstat", + "gsistat.ensmean", + "cnvstat.ensmean", + "oznstat.ensmean", + "radstat.ensmean"] %} + {% else %} + {% set da_files = ["atmens.yaml", + "atminc.ensmean.nc", + "atmensstat"] %} + {% endif %} + {% for file in da_files %} + - "{{ COM_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}{{ file }}" + {% endfor %} + {% if DOIAU %} + {% for fhr in iaufhrs %} + {% if fhr == IAU_OFFSET %} + {% if do_calc_increment %} + - "{{ COM_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmanl.ensmean.nc" + {% endif %} # calc increment + {% else %} # fhr != IAU_OFFSET + - "{{ COM_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmi{{ '%03d' % fhr }}.ensmean.nc" + {% endif %} # fhr == IAU_OFFSET + {% endfor %} # IAUFHRS + {% endif %} # DOIAU + + {% if DO_JEDIATMENS %} + {% set steps = ["atmensanlinit", "atmensanlrun", "atmensanlfinal"] %} + {% else %} + {% set steps = ["eobs", "eupd"] %} + {% if lobsdiag_forenkf %} + {% do steps.append("ediag") %} + {% else %} + {% for mem in range(1, nmem_ens + 1) %} + {% do steps.append("eomg_mem{{ '%03d' % mem }}") %} + {% endfor %} + {% endif %} + {% endif %} + + {% for step in steps %} + - "logs/{{ cycle_YMDH }}/{{ RUN }}{{ step }}.log" + {% endfor %} + {% endif %} # not the first cycle + optional: + {% if current_cycle != SDATE and DOIAU %} + {% for fhr in iaufhrs %} + {% if fhr != IAU_OFFSET %} + - "{{ COM_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atma{{ '%03d' % fhr }}.ensmean.nc" + - "{{ COM_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmi{{ '%03d' % fhr }}.ensmean.nc" + {% endif %} # fhr == IAU_OFFSET + {% endfor %} # IAUFHRS + {% endif %} diff --git a/parm/archive/enkf_grp.yaml.j2 b/parm/archive/enkf_grp.yaml.j2 new file mode 100644 index 0000000000..cf7933ef0e --- /dev/null +++ b/parm/archive/enkf_grp.yaml.j2 @@ -0,0 +1,29 @@ +enkf_grp: + name: "ENKF_GRP" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/{{ RUN }}_grp{{ ENSGRP }}.tar" + required: + {% for mem in range(first_group_mem, last_group_mem + 1) %} + {% set imem = mem - first_group_mem %} + {% set COM_ATMOS_ANALYSIS_MEM = COM_ATMOS_ANALYSIS_MEM_list[imem] %} + {% set COM_ATMOS_HISTORY_MEM = COM_ATMOS_HISTORY_MEM_list[imem] %} + {% set COM_ATMOS_RESTART_MEM = COM_ATMOS_RESTART_MEM_list[imem] %} + + {% for iaufhr in iaufhrs_enkf %} + - "{{ COM_ATMOS_HISTORY_MEM | relpath(ROTDIR) }}/{{ head }}atmf{{ "%03d" % iaufhr }}.nc" + {% endfor %} + + {% if 6 in iaufhrs_enkf %} + - "{{ COM_ATMOS_HISTORY_MEM | relpath(ROTDIR) }}/{{ head }}sfcf006.nc" + {% endif %} + + {% if current_cycle != SDATE %} + {% if not lobsdiag_forenkf %} + - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}gsistat" + {% endif %} + {% if do_calc_increment %} + - "{{ COM_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}atmanl.nc" + {% else %} + - "{{ COM_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}ratminc.nc" + {% endif %} + {% endif %} + {% endfor %} # first_group_mem to last_group_mem diff --git a/parm/archive/enkf_restarta_grp.yaml.j2 b/parm/archive/enkf_restarta_grp.yaml.j2 new file mode 100644 index 0000000000..ee768a1f92 --- /dev/null +++ b/parm/archive/enkf_restarta_grp.yaml.j2 @@ -0,0 +1,48 @@ +enkf_restarta_grp: + name: "ENKF_RESTARTA_GRP" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/{{ RUN }}_restarta_grp{{ ENSGRP }}.tar" + required: + {% for mem in range(first_group_mem, last_group_mem + 1) %} + {% set imem = mem - first_group_mem %} + {% set COM_ATMOS_ANALYSIS_MEM = COM_ATMOS_ANALYSIS_MEM_list[imem] %} + {% set COM_ATMOS_HISTORY_MEM = COM_ATMOS_HISTORY_MEM_list[imem] %} + {% set COM_ATMOS_RESTART_MEM = COM_ATMOS_RESTART_MEM_list[imem] %} + + {% if not lobsdiag_forenkf %} + - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}abias" + - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}abias_air" + - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}abias_int" + - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}abias_pc" + {% endif %} + + {% if DOIAU_ENKF %} + {% set anl_delta = "-3H" | to_timedelta %} + {% else %} + {% set anl_delta = "0H" | to_timedelta %} + {% endif %} + {% set anl_time = current_cycle | add_to_datetime(anl_delta) %} + {% for itile in range(1, 7) %} + - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ anl_time | to_YMD }}.{{ anl_time | strftime("%H") }}0000.sfcanl_data.tile{{ itile }}.nc" + {% endfor %} + {% if do_calc_increment %} + - "{{ COM_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}atmanl.nc" + {% else %} + - "{{ COM_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}ratminc.nc" + {% endif %} + {% endfor %} # first_group_mem to last_group_mem + optional: + {% for mem in range(first_group_mem, last_group_mem + 1) %} + {% set imem = mem - first_group_mem %} + {% set COM_ATMOS_RESTART_MEM = COM_ATMOS_RESTART_MEM_list[imem] %} + {% set COM_ATMOS_ANALYSIS_MEM = COM_ATMOS_ANALYSIS_MEM_list[imem] %} + {% if not lobsdiag_forenkf and not DO_JEDIATMENS %} + - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}cnvstat" + {% endif %} + {% for iaufhr in iaufhrs if iaufhr != 6 %} + {% set iaufhr = iaufhr %} + {% if do_calc_increment %} + - "{{ COM_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}atma{{ '%03d' % iaufhr }}.nc" + - "{{ COM_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}ratmi{{ '%03d' % iaufhr }}.nc" + {% endif %} + {% endfor %} # iaufhr in iaufhrs + {% endfor %} diff --git a/parm/archive/enkf_restartb_grp.yaml.j2 b/parm/archive/enkf_restartb_grp.yaml.j2 new file mode 100644 index 0000000000..34fde9d7ca --- /dev/null +++ b/parm/archive/enkf_restartb_grp.yaml.j2 @@ -0,0 +1,37 @@ +enkf_restartb_grp: + name: "ENKF_RESTARTB_GRP" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/{{ RUN }}_restartb_grp{{ ENSGRP }}.tar" + required: + {% for mem in range(first_group_mem, last_group_mem + 1) %} + {% set imem = mem - first_group_mem %} + {% set COM_ATMOS_RESTART_MEM = COM_ATMOS_RESTART_MEM_list[imem] %} + + # Grab surface analysis data. + # If IAU is on, grab the beginning of the window, otherwise grab the center. + {% if DOIAU_ENKF %} + {% set offset_td = "-3H" | to_timedelta %} + {% else %} + {% set offset_td = "0H" | to_timedelta %} + {% endif %} + {% set offset_dt = current_cycle | add_to_datetime(offset_td) %} + {% set offset_YMD = offset_dt | to_YMD %} + {% set offset_HH = offset_dt | strftime("%H") %} + {% set prefix = offset_YMD + "." + offset_HH + "0000" %} + {% for itile in range(1, 7) %} + - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ prefix }}.sfcanl_data.tile{{ itile }}.nc" + {% endfor %} + + # Now get the restart files. + {% for r_time in range(restart_interval, fhmax + 1, restart_interval) %} + {% set r_timedelta = (r_time | string + "H") | to_timedelta %} + {% set r_dt = current_cycle | add_to_datetime(r_timedelta) %} + {% set r_prefix = r_dt | to_YMD + "." + r_dt | strftime("%H") + "0000" %} + {% for itile in range(1, 7) %} + {% for datatype in ["ca_data", "fv_core.res", "fv_srf_wnd.res", "fv_tracer.res", "phy_data", "sfc_data"] %} + - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ r_prefix }}.{{datatype}}.tile{{ itile }}.nc" + {% endfor %} + {% endfor %} + - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ r_prefix }}.coupler.res" + - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ r_prefix }}.fv_core.res.nc" + {% endfor %} + {% endfor %} diff --git a/parm/archive/gdas.yaml.j2 b/parm/archive/gdas.yaml.j2 new file mode 100644 index 0000000000..3c7709cfac --- /dev/null +++ b/parm/archive/gdas.yaml.j2 @@ -0,0 +1,128 @@ +gdas: + {% set head = "gdas.t" + cycle_HH + "z." %} + name: "GDAS" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdas.tar" + required: + {% if current_cycle != SDATE and MODE == "cycled" %} + - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl" + - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl.idx" + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl" + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl.idx" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmanl.nc" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}sfcanl.nc" + - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlprod.log" + - "logs/{{ cycle_YMDH }}/{{ RUN }}prep.log" + {% if DO_JEDIATMVAR %} + - "logs/{{ cycle_YMDH }}/{{ RUN }}prepatmiodaobs.log" + - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlinit.log" + - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlprod.log" + - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlfinal.log" + - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlfv3inc.log" + - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlvar.log" + {% else %} + - "logs/{{ cycle_YMDH }}/{{ RUN }}anal.log" + - "logs/{{ cycle_YMDH }}/{{ RUN }}analdiag.log" + {% endif %} + - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlupp.log" + {% if DO_JEDIOCNVAR %} + - "logs/{{ cycle_YMDH }}/{{ RUN }}prepoceanobs.log" + - "logs/{{ cycle_YMDH }}/{{ RUN }}ocnanalprep.log" + - "logs/{{ cycle_YMDH }}/{{ RUN }}ocnanalbmat.log" + - "logs/{{ cycle_YMDH }}/{{ RUN }}ocnanalrun.log" + - "logs/{{ cycle_YMDH }}/{{ RUN }}ocnanalpost.log" + - "logs/{{ cycle_YMDH }}/{{ RUN }}ocnanalchkpt.log" + {% if DOHYBVAR %} + - "logs/{{ cycle_YMDH }}/{{ RUN }}ocnanalecen.log" + {% endif %} + {% endif %} + {% if DO_VRFY_OCEANDA %} + - "logs/{{ cycle_YMDH }}/{{ RUN }}ocnanalvrfy.log" + {% endif %} + {% if DOHYBVAR %} + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmanl.ensres.nc" + {% endif %} + {% if DO_JEDIATMVAR %} + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmvar.yaml" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmstat" + {% else %} + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}gsistat" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}cnvstat" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}oznstat" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}radstat" + {% endif %} + {% if DO_VERFOZN %} + - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/time/bad_cnt.{{ cycle_YMDH }}" + - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/time/bad_diag.{{ cycle_YMDH }}" + - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/time/bad_pen.{{ cycle_YMDH }}" + - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/time/stdout.time.tar.gz" + - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/horiz/stdout.horiz.tar.gz" + - "logs/{{ cycle_YMDH }}/{{ RUN }}verfozn.log" + {% endif %} + {% if DO_VERFRAD %} + - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_angle.tar.gz" + - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_bcoef.tar.gz" + - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_bcor.tar.gz" + - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_time.tar.gz" + - "logs/{{ cycle_YMDH }}/{{ RUN }}verfrad.log" + {% endif %} + {% if DO_VMINMON %} + - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.costs.txt" + - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.cost_terms.txt" + - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.gnorms.ieee_d" + - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.reduction.ieee_d" + - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/gnorm_data.txt" + - "logs/{{ cycle_YMDH }}/{{ RUN }}vminmon.log" + {% endif %} + {% if AERO_ANL_CDUMP == "gdas" or AERO_ANL_CDUMP == "both" %} + - "{{ COM_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" + {% endif %} + {% if DO_JEDISNOWDA %} + - "{{ COM_SNOW_ANALYSIS | relpath(ROTDIR) }}/{{ head }}snowstat.tgz" + {% endif %} + {% endif %} # Full cycle + - "logs/{{ cycle_YMDH }}/{{ RUN }}fcst.log" + # TODO explicitly name the atmos_prod log files to archive + - "logs/{{ cycle_YMDH }}/{{ RUN }}atmos_prod_f*.log" + {% for fhr in range(0, FHMAX + 1, 3) %} + - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}" + - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}.idx" + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}" + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}.idx" + - "{{ COM_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atm.logf{{ '%03d' % fhr }}.txt" + - "{{ COM_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atmf{{ '%03d' % fhr }}.nc" + - "{{ COM_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}sfcf{{ '%03d' % fhr }}.nc" + - "{{ COM_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2" + - "{{ COM_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2.idx" + {% endfor %} + optional: + {% if current_cycle != SDATE and MODE == "cycled" %} + {% if DOHYBVAR %} + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atma003.ensres.nc" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atma009.ensres.nc" + {% endif %} + {% if DO_VERFRAD %} + - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/bad_diag.{{ cycle_YMDH }}" + - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/bad_pen.{{ cycle_YMDH }}" + - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/low_count.{{ cycle_YMDH }}" + - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/warning.{{ cycle_YMDH }}" + {% endif %} + {% if DO_VERFOZN %} + {% set oznmon_types = [ + "gome_metop-b", "omi_aura", "ompslp_npp", "ompsnp_n20", + "ompsnp_npp", "ompstc8_n20", "ompstc8_npp", "sbuv2_n19" + ] %} + {% for group in [ "horiz", "time" ] %} + {% if group == "horiz" %} {% set suffix = ".gz" %} {% else %} {% set suffix = "" %} {% endif %} + {% for type in oznmon_types %} + - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/{{ group }}/{{ type }}.anl.ctl" + - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/{{ group }}/{{ type }}.anl.{{ cycle_YMDH }}.ieee_d{{ suffix }}" + - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/{{ group }}/{{ type }}.ges.ctl" + - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/{{ group }}/{{ type }}.ges.{{ cycle_YMDH }}.ieee_d{{ suffix }}" + {% endfor %} + {% endfor %} + {% endif %} + {% endif %} + {% if not WRITE_DOPOST %} + # TODO set the forecast hours explicitly. This will require emulating numpy.array_split + - "logs/{{ cycle_YMDH }}/{{ RUN }}atmos_upp_f*.log" + {% endif %} ## not WRITE_DOPOST diff --git a/parm/archive/gdas_restarta.yaml.j2 b/parm/archive/gdas_restarta.yaml.j2 new file mode 100644 index 0000000000..9c4aa1244f --- /dev/null +++ b/parm/archive/gdas_restarta.yaml.j2 @@ -0,0 +1,49 @@ +gdas_restarta: + {% set head = "gdas.t" + cycle_HH + "z." %} + name: "GDAS_RESTARTA" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdas_restarta.tar" + required: + {% if current_cycle != SDATE and MODE == "cycled" %} + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atminc.nc" + {% for iaufhr in iaufhrs if iaufhr != 6 %} + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmi{{ "%03d" % iaufhr }}.nc" + {% endfor %} + {% if DOHYBVAR and DOIAU %} + {% set anl_offset = "-3H" %} + {% else %} + {% set anl_offset = "0H" %} + {% endif %} + {% set anl_timedelta = anl_offset | to_timedelta %} + {% set anl_time = current_cycle | add_to_datetime(anl_timedelta) %} + {% for itile in range(1,7) %} + - "{{ COM_ATMOS_RESTART | relpath(ROTDIR) }}/{{ anl_time | to_YMD }}.{{ anl_time | strftime("%H") }}0000.sfcanl_data.tile{{ itile }}.nc" + {% endfor %} + {% if not DO_JEDIATMVAR %} + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_air" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_pc" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}radstat" + {% endif %} + {% if DO_JEDISNOWDA %} + {% for itile in range(1,7) %} + # Snow analysis is 3dvar + - "{{ COM_SNOW_ANALYSIS | relpath(ROTDIR) }}/snowinc.{{ cycle_YMD }}.{{ cycle_HH }}0000.sfc_data.tile{{ itile }}.nc" + - "{{ COM_SNOW_ANALYSIS | relpath(ROTDIR) }}/{{ cycle_YMD }}.{{ cycle_HH }}0000.sfc_data.tile{{ itile }}.nc" + {% endfor %} + {% endif %} + {% endif %} + optional: + {% if current_cycle != SDATE and MODE == "cycled" %} + - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}nsstbufr" + - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr" + - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr.acft_profiles" + {% if not DO_JEDIATMVAR %} + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}cnvstat" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_int" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}dtfanl.nc" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}loginc.txt" + {% endif %} + {% if DO_JEDISNOWDA %} + - "{{ COM_CONF | relpath(ROTDIR) }}/{{ head }}letkfoi.yaml" + {% endif %} + {% endif %} diff --git a/parm/archive/gdas_restartb.yaml.j2 b/parm/archive/gdas_restartb.yaml.j2 new file mode 100644 index 0000000000..c5cb29329f --- /dev/null +++ b/parm/archive/gdas_restartb.yaml.j2 @@ -0,0 +1,39 @@ +gdas_restartb: + {% set head = "gdas.t" + cycle_HH + "z." %} + name: "GDAS_RESTARTB" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdas_restartb.tar" + required: + # Grab the surface analysis data. + # If IAU is on, grab the beginning of the window. + {% if DOIAU %} + {% set offset_td = "-3H" | to_timedelta %} + {% set offset_dt = current_cycle | add_to_datetime(offset_td) %} + {% set offset_YMD = offset_dt | to_YMD %} + {% set offset_HH = offset_dt | strftime("%H") %} + {% set prefix = offset_YMD + "." + offset_HH + "0000" %} + {% for itile in range(1, 7) %} + - "{{ COM_ATMOS_RESTART | relpath(ROTDIR) }}/{{ prefix }}.sfcanl_data.tile{{ itile }}.nc" + {% endfor %} + {% endif %} + + # Regardless, always grab the center surface analysis data. + {% set prefix = cycle_YMD + "." + cycle_HH + "0000" %} + {% for itile in range(1, 7) %} + - "{{ COM_ATMOS_RESTART | relpath(ROTDIR) }}/{{ prefix }}.sfcanl_data.tile{{ itile }}.nc" + {% endfor %} + + # Now get the restart files. + {% for r_time in range(restart_interval_gdas, FHMAX + 1, restart_interval_gdas) %} + {% set r_timedelta = (r_time | string + "H") | to_timedelta %} + {% set r_dt = current_cycle | add_to_datetime(r_timedelta) %} + {% set r_YMD = r_dt | to_YMD %} + {% set r_HH = r_dt | strftime("%H") %} + {% set r_prefix = r_YMD + "." + r_HH + "0000" %} + {% for itile in range(1, 7) %} + {% for datatype in ["ca_data", "fv_core.res", "fv_srf_wnd.res", "fv_tracer.res", "phy_data", "sfc_data"] %} + - "{{ COM_ATMOS_RESTART | relpath(ROTDIR) }}/{{ r_prefix }}.{{datatype}}.tile{{ itile }}.nc" + {% endfor %} + {% endfor %} + - "{{ COM_ATMOS_RESTART | relpath(ROTDIR) }}/{{ r_prefix }}.coupler.res" + - "{{ COM_ATMOS_RESTART | relpath(ROTDIR) }}/{{ r_prefix }}.fv_core.res.nc" + {% endfor %} diff --git a/parm/archive/gdasice.yaml.j2 b/parm/archive/gdasice.yaml.j2 new file mode 100644 index 0000000000..4cfa1eb9af --- /dev/null +++ b/parm/archive/gdasice.yaml.j2 @@ -0,0 +1,10 @@ +gdasice: + {% set head = "gdas.ice.t" + cycle_HH + "z." %} + name: "GDASICE" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdasice.tar" + required: + - "{{ COM_ICE_HISTORY | relpath(ROTDIR) }}/{{ head }}ic.nc" + {% for fhr in range(FHOUT_OCNICE, FHMAX+1, FHOUT_OCNICE) %} + - "{{ COM_ICE_HISTORY | relpath(ROTDIR) }}/{{ head }}inst.f{{ '%03d' % fhr }}.nc" + {% endfor %} + - '{{ COM_CONF | relpath(ROTDIR) }}/ufs.ice_in' diff --git a/parm/archive/gdasice_restart.yaml.j2 b/parm/archive/gdasice_restart.yaml.j2 new file mode 100644 index 0000000000..39877674fb --- /dev/null +++ b/parm/archive/gdasice_restart.yaml.j2 @@ -0,0 +1,7 @@ +gdasice_restart: + {% set head = "gdas.ice.t" + cycle_HH + "z." %} + name: "GDASICE_RESTART" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdasice_restart.tar" + required: + # TODO explicitly name the restart files to archive + - '{{ COM_ICE_RESTART | relpath(ROTDIR) }}/*' diff --git a/parm/archive/gdasocean.yaml.j2 b/parm/archive/gdasocean.yaml.j2 new file mode 100644 index 0000000000..9791709319 --- /dev/null +++ b/parm/archive/gdasocean.yaml.j2 @@ -0,0 +1,9 @@ +gdasocean: + {% set head = "gdas.ocean.t" + cycle_HH + "z." %} + name: "GDASOCEAN" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdasocean.tar" + required: + {% for fhr in range(FHMIN, FHMAX + 1, FHOUT_OCNICE) %} + - "{{ COM_OCEAN_HISTORY | relpath(ROTDIR) }}/{{ head }}inst.f{{ '%03d' % fhr }}.nc" + {% endfor %} + - '{{ COM_CONF | relpath(ROTDIR) }}/ufs.MOM_input' diff --git a/parm/archive/gdasocean_analysis.yaml.j2 b/parm/archive/gdasocean_analysis.yaml.j2 new file mode 100644 index 0000000000..0c43cd40ba --- /dev/null +++ b/parm/archive/gdasocean_analysis.yaml.j2 @@ -0,0 +1,27 @@ +gdasocean_analysis: + {% set head = "gdas.t" + cycle_HH + "z." %} + name: "GDASOCEAN_ANALYSIS" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdasocean_analysis.tar" + required: + - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocninc.nc' + {% set ocngrid_cycle = '%02d' % (((cycle_HH | int) - 3) % 24) %} + - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/gdas.t{{ ocngrid_cycle }}z.ocngrid.nc' + {% for domain in ["ocn", "ice"] %} + - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}{{domain}}.bkgerr_stddev.nc' + - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}{{domain}}.incr.nc' + - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}{{domain}}ana.nc' + {% if NMEM_ENS > 2 %} + - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}{{domain}}.recentering_error.nc' + {% endif %} + {% endfor %} + {% if NMEM_ENS > 2 %} + - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.ssh_steric_stddev.nc' + - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.ssh_unbal_stddev.nc' + - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.ssh_total_stddev.nc' + - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.steric_explained_variance.nc' + {% endif %} + - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.adt_rads_all.stats.csv' + - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.icec_amsr2_north.stats.csv' + - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.icec_amsr2_south.stats.csv' + - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/diags/*.nc4' + - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/yaml/*.yaml' diff --git a/parm/archive/gdasocean_restart.yaml.j2 b/parm/archive/gdasocean_restart.yaml.j2 new file mode 100644 index 0000000000..21bfc3955f --- /dev/null +++ b/parm/archive/gdasocean_restart.yaml.j2 @@ -0,0 +1,8 @@ +gdasocean_restart: + {% set head = "gdas.ocean.t" + cycle_HH + "z." %} + name: "GDASOCEAN_RESTART" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdasocean_restart.tar" + required: + # TODO explicitly name the restart files to archive + - '{{ COM_OCEAN_RESTART | relpath(ROTDIR) }}/*' + - '{{ COM_MED_RESTART | relpath(ROTDIR) }}/*' diff --git a/parm/archive/gdaswave.yaml.j2 b/parm/archive/gdaswave.yaml.j2 new file mode 100644 index 0000000000..74a5a64dbf --- /dev/null +++ b/parm/archive/gdaswave.yaml.j2 @@ -0,0 +1,8 @@ +gdaswave: + {% set head = "gdas.wave.t" + cycle_HH + "z." %} + name: "GDASWAVE" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdaswave.tar" + required: + # TODO explicitly name the wave grid/station files to archive + - "{{ COM_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*" + - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}*" diff --git a/parm/archive/gdaswave_restart.yaml.j2 b/parm/archive/gdaswave_restart.yaml.j2 new file mode 100644 index 0000000000..8387d48616 --- /dev/null +++ b/parm/archive/gdaswave_restart.yaml.j2 @@ -0,0 +1,6 @@ +gdaswave_restart: + name: "GDASWAVE_RESTART" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdaswave_restart.tar" + required: + # TODO explicitly name the wave restart files to archive + - "{{ COM_WAVE_RESTART | relpath(ROTDIR) }}/*" diff --git a/parm/archive/gfs_downstream.yaml.j2 b/parm/archive/gfs_downstream.yaml.j2 new file mode 100644 index 0000000000..23c9383d28 --- /dev/null +++ b/parm/archive/gfs_downstream.yaml.j2 @@ -0,0 +1,12 @@ +gfs_downstream: + {% set head = "gfs.t" + cycle_HH + "z." %} + name: "GFS_DOWNSTREAM" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfs_downstream.tar" + required: + - "{{ COM_ATMOS_GEMPAK | relpath(ROTDIR) }}/gfs_{{ cycle_YMDH }}.sfc" + - "{{ COM_ATMOS_GEMPAK | relpath(ROTDIR) }}/gfs_{{ cycle_YMDH }}.snd" + {% for i in range(1, NUM_SND_COLLECTIVES) %} + - "{{ COM_ATMOS_WMO | relpath(ROTDIR) }}/gfs_collective{{ i }}.postsnd_{{ cycle_HH }}" + {% endfor %} + - "{{ COM_ATMOS_BUFR | relpath(ROTDIR) }}/bufr.t{{ cycle_HH }}z" + - "{{ COM_ATMOS_BUFR | relpath(ROTDIR) }}/gfs.t{{ cycle_HH }}z.bufrsnd.tar.gz" diff --git a/parm/archive/gfs_flux.yaml.j2 b/parm/archive/gfs_flux.yaml.j2 new file mode 100644 index 0000000000..66c8221f60 --- /dev/null +++ b/parm/archive/gfs_flux.yaml.j2 @@ -0,0 +1,9 @@ +gfs_flux: + {% set head = "gfs.t" + cycle_HH + "z." %} + name: "GFS_FLUX" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfs_flux.tar" + required: + {% for fhr in range(FHMIN_GFS, FHMAX_GFS + FHOUT_GFS, FHOUT_GFS) %} + - "{{ COM_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2" + - "{{ COM_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2.idx" + {% endfor %} diff --git a/parm/archive/gfs_flux_1p00.yaml.j2 b/parm/archive/gfs_flux_1p00.yaml.j2 new file mode 100644 index 0000000000..2f5c9c8910 --- /dev/null +++ b/parm/archive/gfs_flux_1p00.yaml.j2 @@ -0,0 +1,9 @@ +gfs_flux_1p00: + {% set head = "gfs.t" + cycle_HH + "z." %} + name: "GFS_FLUX_1P00" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfs_flux_1p00.tar" + required: + {% for fhr in range(FHMIN_GFS, FHMAX_GFS + FHOUT_GFS, FHOUT_GFS) %} + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}flux.1p00.f{{ '%03d' % fhr }}" + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}flux.1p00.f{{ '%03d' % fhr }}.idx" + {% endfor %} diff --git a/parm/archive/gfs_netcdfa.yaml.j2 b/parm/archive/gfs_netcdfa.yaml.j2 new file mode 100644 index 0000000000..6bcafe1b89 --- /dev/null +++ b/parm/archive/gfs_netcdfa.yaml.j2 @@ -0,0 +1,16 @@ +gfs_netcdfa: + {% set head = "gfs.t" + cycle_HH + "z." %} + name: "GFS_NETCDFA" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfs_netcdfa.tar" + required: + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmanl.nc" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}sfcanl.nc" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atminc.nc" + {% for iauhr in iaufhrs if iauhr != 6 %} + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmi{{ "%03d" % iauhr }}.nc" + {% endfor %} + optional: + {% if not DO_JEDIATMVAR %} + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}dtfanl.nc" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}loginc.txt" + {% endif %} diff --git a/parm/archive/gfs_netcdfb.yaml.j2 b/parm/archive/gfs_netcdfb.yaml.j2 new file mode 100644 index 0000000000..b0393d63b6 --- /dev/null +++ b/parm/archive/gfs_netcdfb.yaml.j2 @@ -0,0 +1,9 @@ +gfs_netcdfb: + {% set head = "gfs.t" + cycle_HH + "z." %} + name: "GFS_NETCDFB" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfs_netcdfb.tar" + required: + {% for fhr in range(0, ARCH_GAUSSIAN_FHMAX + ARCH_GAUSSIAN_FHINC, ARCH_GAUSSIAN_FHINC) %} + - "{{ COM_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atmf{{ '%03d' % fhr }}.nc" + - "{{ COM_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}sfcf{{ '%03d' % fhr }}.nc" + {% endfor %} diff --git a/parm/archive/gfs_pgrb2b.yaml.j2 b/parm/archive/gfs_pgrb2b.yaml.j2 new file mode 100644 index 0000000000..b06dd14b73 --- /dev/null +++ b/parm/archive/gfs_pgrb2b.yaml.j2 @@ -0,0 +1,19 @@ +gfs_pgrb2b: + {% set head = "gfs.t" + cycle_HH + "z." %} + name: "GFS_PGRB2B" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfs_pgrb2b.tar" + required: + {% if MODE == "cycled" %} + - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2b.0p25.anl" + - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2b.0p25.anl.idx" + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2b.1p00.anl" + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2b.1p00.anl.idx" + {% endif %} + {% if ARCH_GAUSSIAN %} + {% for fhr in range(0, FHMAX_GFS + FHOUT_GFS, FHOUT_GFS) %} + - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2b.0p25.f{{ '%03d' % fhr }}" + - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2b.0p25.f{{ '%03d' % fhr }}.idx" + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2b.1p00.f{{ '%03d' % fhr }}" + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2b.1p00.f{{ '%03d' % fhr }}.idx" + {% endfor %} + {% endif %} diff --git a/parm/archive/gfs_restarta.yaml.j2 b/parm/archive/gfs_restarta.yaml.j2 new file mode 100644 index 0000000000..c2ad717484 --- /dev/null +++ b/parm/archive/gfs_restarta.yaml.j2 @@ -0,0 +1,23 @@ +gfs_restarta: + {% set head = "gfs.t" + cycle_HH + "z." %} + name: "GFS_RESTARTA" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfs_restarta.tar" + required: + {% if MODE == "cycled" %} + {% if DOHYBVAR and DOIAU %} + {% set anl_offset = "-3H" %} + {% else %} + {% set anl_offset = "0H" %} + {% endif %} + {% set anl_timedelta = anl_offset | to_timedelta %} + {% set anl_time = current_cycle | add_to_datetime(anl_timedelta) %} + {% for i_tile in range(1, 7) %} + - "{{ COM_ATMOS_RESTART | relpath(ROTDIR) }}/{{ anl_time | to_YMD }}.{{ anl_time | strftime("%H") }}0000.sfcanl_data.tile{{ i_tile }}.nc" + {% endfor %} + {% elif MODE == "forecast-only" %} + - "{{ COM_ATMOS_INPUT | relpath(ROTDIR) }}/gfs_ctrl.nc" + {% for i_tile in range(1, 7) %} + - "{{ COM_ATMOS_INPUT | relpath(ROTDIR) }}/gfs_data.tile{{ i_tile }}.nc" + - "{{ COM_ATMOS_INPUT | relpath(ROTDIR) }}/sfc_data.tile{{ i_tile }}.nc" + {% endfor %} + {% endif %} diff --git a/parm/archive/gfsa.yaml.j2 b/parm/archive/gfsa.yaml.j2 new file mode 100644 index 0000000000..7ed12819a0 --- /dev/null +++ b/parm/archive/gfsa.yaml.j2 @@ -0,0 +1,62 @@ +gfsa: + {% set head = "gfs.t" + cycle_HH + "z." %} + name: "GFSA" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfsa.tar" + required: + # TODO explicitly name all logs to include + {% for log in glob("logs/" ~ cycle_YMDH ~ "/gfs*.log") %} + {% if not "gfsarch.log" in log %} + - "{{ log }}" + {% endif %} + {% endfor %} + # - "logs/{{ cycle_YMDH }}/{{ RUN }}fcst.log" + # - "logs/{{ cycle_YMDH }}/{{ RUN }}atmos_prod_f*.log" + - "{{ COM_CONF | relpath(ROTDIR) }}/ufs.input.nml" + {% if MODE == "cycled" %} + - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl" + - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl.idx" + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl" + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl.idx" + # - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlprod.log" + # - "logs/{{ cycle_YMDH }}/{{ RUN }}prep.log" + # - "logs/{{ cycle_YMDH }}/{{ RUN }}anal.log" + # - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlupp.log" + {% if DO_VMINMON %} + - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.costs.txt" + - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.cost_terms.txt" + - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.gnorms.ieee_d" + - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.reduction.ieee_d" + - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/gnorm_data.txt" + # - "logs/{{ cycle_YMDH }}/{{ RUN }}vminmon.log" + {% endif %} + {% if AERO_ANL_CDUMP == "gfs" or AERO_ANL_CDUMP == "both" %} + - "{{ COM_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" + {% endif %} + {% if DO_JEDIATMVAR %} + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmvar.yaml" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmstat" + {% else %} + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}gsistat" + {% endif %} + {% endif %} # Full cycle + {% for fhr in range(FHMIN_GFS, FHMAX_GFS + FHOUT_GFS, FHOUT_GFS) %} + - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}" + - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}.idx" + - "{{ COM_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atm.logf{{ '%03d' % fhr }}.txt" + {% endfor %} + optional: + {% if MODE == "cycled" %} + - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}nsstbufr" + - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr" + - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr.acft_profiles" + {% endif %} # cycled + - "{{ COM_ATMOS_TRACK | relpath(ROTDIR) }}/avno.t{{ cycle_HH }}z.cyclone.trackatcfunix" + - "{{ COM_ATMOS_TRACK | relpath(ROTDIR) }}/avnop.t{{ cycle_HH }}z.cyclone.trackatcfunix" + - "{{ COM_ATMOS_GENESIS | relpath(ROTDIR) }}/trak.gfso.atcfunix.{{ cycle_YMDH }}" + - "{{ COM_ATMOS_GENESIS | relpath(ROTDIR) }}/trak.gfso.atcfunix.altg.{{ cycle_YMDH }}" + - "{{ COM_ATMOS_GENESIS | relpath(ROTDIR) }}/storms.gfso.atcf_gen.{{ cycle_YMDH }}" + - "{{ COM_ATMOS_GENESIS | relpath(ROTDIR) }}/storms.gfso.atcf_gen.altg.{{ cycle_YMDH }}" + # {% if not WRITE_DOPOST %} + # # TODO set the forecast hours explicitly. This will require emulating numpy.array_split + # - "logs/{{ cycle_YMDH }}/{{ RUN }}atmos_upp_f*.log" + # {% endif %} ## not WRITE_DOPOST diff --git a/parm/archive/gfsb.yaml.j2 b/parm/archive/gfsb.yaml.j2 new file mode 100644 index 0000000000..721b529278 --- /dev/null +++ b/parm/archive/gfsb.yaml.j2 @@ -0,0 +1,17 @@ +gfsb: + {% set head = "gfs.t" + cycle_HH + "z." %} + name: "GFSB" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfsb.tar" + required: + {% if MODE == "cycled" %} + - "{{ COM_ATMOS_GRIB_0p50 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p50.anl" + - "{{ COM_ATMOS_GRIB_0p50 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p50.anl.idx" + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl" + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl.idx" + {% endif %} + {% for fhr in range(FHMIN_GFS, FHMAX_GFS + FHOUT_GFS, FHOUT_GFS) %} + - "{{ COM_ATMOS_GRIB_0p50 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p50.f{{ '%03d' % fhr }}" + - "{{ COM_ATMOS_GRIB_0p50 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p50.f{{ '%03d' % fhr }}.idx" + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}" + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}.idx" + {% endfor %} diff --git a/parm/archive/gfswave.yaml.j2 b/parm/archive/gfswave.yaml.j2 new file mode 100644 index 0000000000..8542afac0c --- /dev/null +++ b/parm/archive/gfswave.yaml.j2 @@ -0,0 +1,23 @@ +gfswave: + {% set head = "gfswave.t" + cycle_HH + "z." %} + name: "GFSWAVE" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfswave.tar" + required: + {% for fh in range(0, FHMAX_HF_WAV + FHOUT_HF_WAV, FHOUT_HF_WAV) %} + # NOTE This is as explicit as possible without major logic to parse wavepostGRD. + # Matches files of the form "gfswave.tCCz...fHHH.grib2". + - "{{ COM_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2" + - "{{ COM_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2.idx" + {% endfor %} + {% for fh in range(FHMAX_HF_WAV + FHOUT_WAV, FHMAX_WAV_GFS + FHOUT_WAV, FHOUT_WAV) %} + - "{{ COM_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2" + - "{{ COM_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2.idx" + {% endfor %} + - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}bull_tar" + - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}cbull_tar" + - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}spec_tar.gz" + {% if DOIBP_WAV %} + - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}ibpbull_tar" + - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}ibpcbull_tar" + - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}ibp_tar" + {% endif %} diff --git a/parm/archive/ice_6hravg.yaml.j2 b/parm/archive/ice_6hravg.yaml.j2 new file mode 100644 index 0000000000..251e51b110 --- /dev/null +++ b/parm/archive/ice_6hravg.yaml.j2 @@ -0,0 +1,9 @@ +ice_6hravg: + {% set head = "gfs.ice.t" + cycle_HH + "z." %} + name: "ICE_6HRAVG" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/ice_6hravg.tar" + required: + - "{{ COM_ICE_HISTORY | relpath(ROTDIR) }}/{{ head }}ic.nc" + {% for fhr in range(6, FHMAX_GFS + 6, 6) %} + - "{{ COM_ICE_HISTORY | relpath(ROTDIR) }}/{{ head }}6hr_avg.f{{ '%03d' % fhr }}.nc" + {% endfor %} diff --git a/parm/archive/ice_grib2.yaml.j2 b/parm/archive/ice_grib2.yaml.j2 new file mode 100644 index 0000000000..42e6910a16 --- /dev/null +++ b/parm/archive/ice_grib2.yaml.j2 @@ -0,0 +1,18 @@ +ice_grib2: + {% set head = "gfs.ice.t" + cycle_HH + "z." %} + name: "ICE_GRIB2" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/ice_grib2.tar" + required: + {% for fhr in range(FHOUT_OCNICE_GFS, FHMAX_GFS + FHOUT_OCNICE_GFS, FHOUT_OCNICE_GFS) %} + {% set fhr3 = '%03d' % fhr %} + {% if ICERES == 500 %} + - "{{ COM_ICE_GRIB | relpath(ROTDIR) }}/5p00/{{ head }}5p00.f{{ fhr3 }}.grib2" + - "{{ COM_ICE_GRIB | relpath(ROTDIR) }}/5p00/{{ head }}5p00.f{{ fhr3 }}.grib2.idx" + {% elif ICERES == 100 %} + - "{{ COM_ICE_GRIB | relpath(ROTDIR) }}/1p00/{{ head }}1p00.f{{ fhr3 }}.grib2" + - "{{ COM_ICE_GRIB | relpath(ROTDIR) }}/1p00/{{ head }}1p00.f{{ fhr3 }}.grib2.idx" + {% elif ICERES == 25 or ICERES == "025" %} + - "{{ COM_ICE_GRIB | relpath(ROTDIR) }}/0p25/{{ head }}0p25.f{{ fhr3 }}.grib2" + - "{{ COM_ICE_GRIB | relpath(ROTDIR) }}/0p25/{{ head }}0p25.f{{ fhr3 }}.grib2.idx" + {% endif %} + {% endfor %} diff --git a/parm/archive/master_enkf.yaml.j2 b/parm/archive/master_enkf.yaml.j2 new file mode 100644 index 0000000000..7ab7f45e30 --- /dev/null +++ b/parm/archive/master_enkf.yaml.j2 @@ -0,0 +1,100 @@ +# Set variables/lists needed to parse the enkf templates +{% set cycle_HH = current_cycle | strftime("%H") %} +{% set cycle_YMD = current_cycle | to_YMD %} +{% set cycle_YMDH = current_cycle | to_YMDH %} +{% set head = RUN + ".t" + cycle_HH + "z." %} + +{% if IAUFHRS is string %} +{% set iaufhrs = [] %} +{% for iaufhr in IAUFHRS.split(",") %} +{% do iaufhrs.append(iaufhr | int) %} +{% endfor %} +{% else %} +{% set iaufhrs = [IAUFHRS] %} +{% endif %} + +{% if IAUFHRS_ENKF is string %} +{% set iaufhrs_enkf = [] %} +{% for iaufhr in IAUFHRS_ENKF.split(",") %} +{% do iaufhrs_enkf.append(iaufhr | int) %} +{% endfor %} +{% else %} +{% set iaufhrs_enkf = [IAUFHRS_ENKF] %} +{% endif %} + +datasets: +{% if ENSGRP == 0 %} +{% filter indent(width=4) %} +{% include "enkf.yaml.j2" %} +{% endfilter %} +{% else %} + +# Declare to-be-filled lists of member COM directories +{% set COM_ATMOS_ANALYSIS_MEM_list = [] %} +{% set COM_ATMOS_RESTART_MEM_list = [] %} +{% set COM_ATMOS_HISTORY_MEM_list = [] %} + +{% set first_group_mem = (ENSGRP - 1) * NMEM_EARCGRP + 1 %} +{% set last_group_mem = [ ENSGRP * NMEM_EARCGRP, nmem_ens ] | min %} + +# Construct member COM directories +{% for mem in range(first_group_mem, last_group_mem + 1) %} + +# Declare a dict of search and replace terms to run on each template +{% set tmpl_dict = {'ROTDIR':ROTDIR, + 'RUN':RUN, + 'YMD':cycle_YMD, + 'HH':cycle_HH, + 'MEMDIR':"mem" + '%03d' % mem} %} + +# Replace template variables with tmpl_dict, one key at a time +# This must be done in a namespace to overcome jinja scoping +# Variables set inside of a for loop are lost at the end of the loop +# unless they are part of a namespace +{% set com_ns = namespace(COM_ATMOS_ANALYSIS_MEM = COM_ATMOS_ANALYSIS_TMPL, + COM_ATMOS_HISTORY_MEM = COM_ATMOS_HISTORY_TMPL, + COM_ATMOS_RESTART_MEM = COM_ATMOS_RESTART_TMPL) %} + +{% for key in tmpl_dict.keys() %} +{% set search_term = '${' + key + '}' %} +{% set replace_term = tmpl_dict[key] %} +{% set com_ns.COM_ATMOS_ANALYSIS_MEM = com_ns.COM_ATMOS_ANALYSIS_MEM.replace(search_term, replace_term) %} +{% set com_ns.COM_ATMOS_HISTORY_MEM = com_ns.COM_ATMOS_HISTORY_MEM.replace(search_term, replace_term) %} +{% set com_ns.COM_ATMOS_RESTART_MEM = com_ns.COM_ATMOS_RESTART_MEM.replace(search_term, replace_term) %} +{% endfor %} + +{% do COM_ATMOS_ANALYSIS_MEM_list.append(com_ns.COM_ATMOS_ANALYSIS_MEM)%} +{% do COM_ATMOS_HISTORY_MEM_list.append(com_ns.COM_ATMOS_HISTORY_MEM)%} +{% do COM_ATMOS_RESTART_MEM_list.append(com_ns.COM_ATMOS_RESTART_MEM)%} + +{% endfor %} + +# Determine which members to archive +{% filter indent(width=4) %} +{% include "enkf_grp.yaml.j2" %} +{% endfilter %} + +# Determine if restarts should be saved +{% set save_warm_start_forecast, save_warm_start_cycled = ( False, False ) %} + +# Save the increments and restarts every ARCH_WARMICFREQ days +# The ensemble increments (group a) should be saved on the ARCH_CYC +{% if (current_cycle - SDATE).days % ARCH_WARMICFREQ == 0 %} +{% if ARCH_CYC == cycle_HH | int and current_cycle != SDATE %} +{% filter indent(width=4) %} +{% include "enkf_restarta_grp.yaml.j2" %} +{% endfilter %} +{% endif %} +{% endif %} + +# The ensemble ICs (group b) are restarts and always lag increments by assim_freq +{% set ics_offset = (assim_freq | string + "H") | to_timedelta %} +{% if (current_cycle | add_to_datetime(ics_offset) - SDATE).days % ARCH_WARMICFREQ == 0 %} +{% if (ARCH_CYC - assim_freq) % 24 == cycle_HH | int and current_cycle != SDATE %} +{% filter indent(width=4) %} +{% include "enkf_restartb_grp.yaml.j2" %} +{% endfilter %} +{% endif %} +{% endif %} + +{% endif %} # ENSGRP != 0 diff --git a/parm/archive/master_enkfgdas.yaml.j2 b/parm/archive/master_enkfgdas.yaml.j2 new file mode 100644 index 0000000000..e21f6a381b --- /dev/null +++ b/parm/archive/master_enkfgdas.yaml.j2 @@ -0,0 +1,6 @@ +# Set variables specific to gdasenkf runs then parse the master_enkf template +{% set (fhmin, fhmax, fhout) = (FHMIN_ENKF, FHMAX_ENKF, FHOUT_ENKF) %} +{% set do_calc_increment = DO_CALC_INCREMENT %} +{% set nmem_ens = NMEM_ENS %} +{% set restart_interval = restart_interval_enkfgdas %} +{% include "master_enkf.yaml.j2" %} diff --git a/parm/archive/master_enkfgfs.yaml.j2 b/parm/archive/master_enkfgfs.yaml.j2 new file mode 100644 index 0000000000..93ec38b660 --- /dev/null +++ b/parm/archive/master_enkfgfs.yaml.j2 @@ -0,0 +1,6 @@ +# Set variables specific to gfsenkf runs then parse the master_enkf template +{% set (fhmin, fhmax, fhout) = (FHMIN_ENKF, FHMAX_ENKF_GFS, FHOUT_ENKF_GFS) %} +{% set do_calc_increment = DO_CALC_INCREMENT_ENKF_GFS %} +{% set nmem_ens = NMEM_ENS_GFS %} +{% set restart_interval = restart_interval_enkfgfs %} +{% include "master_enkf.yaml.j2" %} diff --git a/parm/archive/master_gdas.yaml.j2 b/parm/archive/master_gdas.yaml.j2 new file mode 100644 index 0000000000..6813209e6a --- /dev/null +++ b/parm/archive/master_gdas.yaml.j2 @@ -0,0 +1,87 @@ +{% set cycle_HH = current_cycle | strftime("%H") %} +{% set cycle_YMD = current_cycle | to_YMD %} +{% set cycle_YMDH = current_cycle | to_YMDH %} +{% set head = "gdas.t" + cycle_HH + "z." %} + +{% if IAUFHRS is string %} +{% set iaufhrs = [] %} +{% for iaufhr in IAUFHRS.split(",") %} +{% do iaufhrs.append(iaufhr | int) %} +{% endfor %} +{% else %} +{% set iaufhrs = [IAUFHRS] %} +{% endif %} + +datasets: +{% filter indent(width=4) %} +{% include "gdas.yaml.j2" %} +{% endfilter %} + +{% if DO_ICE %} +{% filter indent(width=4) %} +{% include "gdasice.yaml.j2" %} +{% endfilter %} +{% endif %} + +{% if DO_OCN %} +{% filter indent(width=4) %} +{% include "gdasocean.yaml.j2" %} +{% endfilter %} +{% if DO_JEDIOCNVAR and current_cycle != SDATE and MODE == "cycled" %} +{% filter indent(width=4) %} +{% include "gdasocean_analysis.yaml.j2" %} +{% endfilter %} +{% endif %} +{% endif %} + +{% if DO_WAVE %} +{% filter indent(width=4) %} +{% include "gdaswave.yaml.j2" %} +{% endfilter %} +{% endif %} + +# Determine if we will save restart ICs or not +{% set save_warm_start_forecast, save_warm_start_cycled = ( False, False ) %} + +{% if ARCH_CYC == cycle_HH | int and current_cycle != SDATE%} +# Save the warm and forecast-only cycle ICs every ARCH_WARMICFREQ days +{% if (current_cycle - SDATE).days % ARCH_WARMICFREQ == 0 %} +{% set save_warm_start_forecast = True %} +{% set save_warm_start_cycled = True %} +# Save the forecast-only restarts every ARCH_FCSTICFREQ days +{% elif (current_cycle - SDATE).days % ARCH_FCSTICFREQ == 0 %} +{% set save_warm_start_forecast = True %} +{% endif %} +{% endif %} + +{% if save_warm_start_forecast %} +{% filter indent(width=4) %} +{% include "gdas_restarta.yaml.j2" %} +{% endfilter %} + +{% if DO_WAVE %} +{% filter indent(width=4) %} +{% include "gdaswave_restart.yaml.j2" %} +{% endfilter %} +{% endif %} + +{% if DO_OCN %} +{% filter indent(width=4) %} +{% include "gdasocean_restart.yaml.j2" %} +{% endfilter %} +{% endif %} + +{% if DO_ICE %} +{% filter indent(width=4) %} +{% include "gdasice_restart.yaml.j2" %} +{% endfilter %} +{% endif %} + +{% endif %} # Save forecast-only restarts + +# Save cycled restarts +{% if save_warm_start_cycled %} +{% filter indent(width=4) %} +{% include "gdas_restartb.yaml.j2" %} +{% endfilter %} +{% endif %} diff --git a/parm/archive/master_gfs.yaml.j2 b/parm/archive/master_gfs.yaml.j2 new file mode 100644 index 0000000000..5340ddb721 --- /dev/null +++ b/parm/archive/master_gfs.yaml.j2 @@ -0,0 +1,95 @@ +{% set cycle_HH = current_cycle | strftime("%H") %} +{% set cycle_YMD = current_cycle | to_YMD %} +{% set cycle_YMDH = current_cycle | to_YMDH %} + +{% if IAUFHRS is string %} +{% set iaufhrs = [] %} +{% for iaufhr in IAUFHRS.split(",") %} +{% do iaufhrs.append(iaufhr | int) %} +{% endfor %} +{% else %} +{% set iaufhrs = [IAUFHRS] %} +{% endif %} +datasets: +{% filter indent(width=4) %} +{% include "gfsa.yaml.j2" %} +{% include "gfsb.yaml.j2" %} +{% endfilter %} + +{% if ARCH_GAUSSIAN %} +{% filter indent(width=4) %} +{% include "gfs_flux.yaml.j2" %} +{% include "gfs_netcdfb.yaml.j2" %} +{% include "gfs_pgrb2b.yaml.j2" %} +{% endfilter %} +{% if MODE == "cycled" %} +{% filter indent(width=4) %} +{% include "gfs_netcdfa.yaml.j2" %} +{% endfilter %} +{% endif %} +{% endif %} + +{% if DO_WAVE %} +{% filter indent(width=4) %} +{% include "gfswave.yaml.j2" %} +{% endfilter %} +{% endif %} + +{% if AERO_FCST_CDUMP == "gfs" or AERO_FCST_CDUMP == "both" %} +{% filter indent(width=4) %} +{% include "chem.yaml.j2" %} +{% endfilter %} +{% endif %} + +{% if DO_BUFRSND %} +{% filter indent(width=4) %} +{% include "gfs_downstream.yaml.j2" %} +{% endfilter %} +{% endif %} + +{% if DO_OCN %} +{% filter indent(width=4) %} +{% include "ocean_6hravg.yaml.j2" %} +{% include "ocean_daily.yaml.j2" %} +{% include "ocean_grib2.yaml.j2" %} +{% include "gfs_flux_1p00.yaml.j2" %} +{% endfilter %} +{% endif %} + +{% if DO_ICE %} +{% filter indent(width=4) %} +{% include "ice_6hravg.yaml.j2" %} +{% include "ice_grib2.yaml.j2" %} +{% endfilter %} +{% endif %} + +# Determine whether to save the MOS tarball +{% if DO_MOS and cycle_HH == "18" %} +{% if not REALTIME %} +{% filter indent(width=4) %} +{% include "gfsmos.yaml.j2" %} +{% endfilter %} +{% else %} +{% set td_from_sdate = current_cycle - SDATE %} +{% set td_one_day = "+1D" | to_timedelta %} +{% if td_from_sdate > td_one_day %} +{% filter indent(width=4) %} +{% include "gfsmos.yaml.j2" %} +{% endfilter %} +{% endif %} +{% endif %} +{% endif %} + +# Determine if we will save restart ICs or not +{% if ARCH_CYC == cycle_HH | int and current_cycle != SDATE %} +# Save the forecast-only cycle ICs every ARCH_WARMICFREQ or ARCH_FCSTICFREQ days +{% if (current_cycle - SDATE).days % ARCH_WARMICFREQ == 0 %} +{% filter indent(width=4) %} +{% include "gfs_restarta.yaml.j2" %} +{% endfilter %} +{% elif (current_cycle - SDATE).days % ARCH_FCSTICFREQ == 0 %} +{% filter indent(width=4) %} +{% include "gfs_restarta.yaml.j2" %} +{% endfilter %} +{% endif %} +{% endif %} diff --git a/parm/archive/ocean_6hravg.yaml.j2 b/parm/archive/ocean_6hravg.yaml.j2 new file mode 100644 index 0000000000..dac3ce262a --- /dev/null +++ b/parm/archive/ocean_6hravg.yaml.j2 @@ -0,0 +1,8 @@ +ocean_6hravg: + {% set head = "gfs.ocean.t" + cycle_HH + "z." %} + name: "OCEAN_6HRAVG" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/ocean_6hravg.tar" + required: + {% for fhr in range(6, FHMAX_GFS + 6, 6) %} + - "{{ COM_OCEAN_HISTORY | relpath(ROTDIR) }}/{{ head }}6hr_avg.f{{ '%03d' % fhr }}.nc" + {% endfor %} diff --git a/parm/archive/ocean_daily.yaml.j2 b/parm/archive/ocean_daily.yaml.j2 new file mode 100644 index 0000000000..0f45264973 --- /dev/null +++ b/parm/archive/ocean_daily.yaml.j2 @@ -0,0 +1,8 @@ +ocean_daily: + {% set head = "gfs.ocean.t" + cycle_HH + "z." %} + name: "OCEAN_DAILY" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/ocean_daily.tar" + required: + {% for fhr in range(24, FHMAX_GFS + 24, 24) %} + - "{{ COM_OCEAN_HISTORY | relpath(ROTDIR) }}/{{ head }}daily.f{{ '%03d' % fhr }}.nc" + {% endfor %} diff --git a/parm/archive/ocean_grib2.yaml.j2 b/parm/archive/ocean_grib2.yaml.j2 new file mode 100644 index 0000000000..2e63c0ca98 --- /dev/null +++ b/parm/archive/ocean_grib2.yaml.j2 @@ -0,0 +1,18 @@ +ocean_grib2: + {% set head = "gfs.ocean.t" + cycle_HH + "z." %} + name: "OCEAN_GRIB2" + target: "{{ ATARDIR }}/{{ cycle_YMDH }}/ocean_grib2.tar" + required: + {% for fhr in range(FHOUT_OCNICE_GFS, FHMAX_GFS + FHOUT_OCNICE_GFS, FHOUT_OCNICE_GFS) %} + {% set fhr3 = '%03d' % fhr %} + {% if OCNRES == 500 %} + - "{{ COM_OCEAN_GRIB | relpath(ROTDIR) }}/5p00/{{ head }}5p00.f{{ fhr3 }}.grib2" + - "{{ COM_OCEAN_GRIB | relpath(ROTDIR) }}/5p00/{{ head }}5p00.f{{ fhr3 }}.grib2.idx" + {% elif OCNRES == 100 %} + - "{{ COM_OCEAN_GRIB | relpath(ROTDIR) }}/1p00/{{ head }}1p00.f{{ fhr3 }}.grib2" + - "{{ COM_OCEAN_GRIB | relpath(ROTDIR) }}/1p00/{{ head }}1p00.f{{ fhr3 }}.grib2.idx" + {% elif OCNRES == 25 or OCNRES == "025" %} + - "{{ COM_OCEAN_GRIB | relpath(ROTDIR) }}/0p25/{{ head }}0p25.f{{ fhr3 }}.grib2" + - "{{ COM_OCEAN_GRIB | relpath(ROTDIR) }}/0p25/{{ head }}0p25.f{{ fhr3 }}.grib2.idx" + {% endif %} + {% endfor %} diff --git a/parm/config/gefs/config.base b/parm/config/gefs/config.base index 90a75e3639..e98c942dcf 100644 --- a/parm/config/gefs/config.base +++ b/parm/config/gefs/config.base @@ -134,8 +134,11 @@ export DO_WAVE="NO" export DO_OCN="NO" export DO_ICE="NO" export DO_AERO="NO" +export AERO_FCST_CDUMP="" # When to run aerosol forecast: gdas, gfs, or both +export AERO_ANL_CDUMP="" # When to run aerosol analysis: gdas, gfs, or both export WAVE_CDUMP="" # 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." export DO_NEST="NO" # Whether to run a global-nested domain if [[ "${DO_NEST:-NO}" == "YES" ]] ; then @@ -179,6 +182,8 @@ case "${APP}" in ;; ATMA) export DO_AERO="YES" + export AERO_ANL_CDUMP="both" + export AERO_FCST_CDUMP="gdas" ;; ATMW) export DO_COUPLED="YES" @@ -197,6 +202,8 @@ case "${APP}" in if [[ "${APP}" =~ A$ ]]; then export DO_AERO="YES" + export AERO_ANL_CDUMP="both" + export AERO_FCST_CDUMP="gdas" fi if [[ "${APP}" =~ ^S2SW ]]; then @@ -222,6 +229,11 @@ export FHOUT_GFS=6 export FHMAX_HF_GFS=0 export FHOUT_HF_GFS=1 export FHOUT_OCNICE_GFS=6 +export FHMIN_WAV=0 +export FHOUT_WAV=3 +export FHMAX_HF_WAV=120 +export FHOUT_HF_WAV=1 +export FHMAX_WAV=${FHMAX_GFS} if (( gfs_cyc != 0 )); then export STEP_GFS=$(( 24 / gfs_cyc )) else @@ -235,6 +247,7 @@ export FHOUT_ENKF=${FHOUT_GFS} # GFS restart interval in hours export restart_interval_gfs=12 +export restart_interval_enkfgfs=12 # NOTE: Do not set this to zero. Instead set it to $FHMAX_GFS # TODO: Remove this variable from config.base and reference from config.fcst # TODO: rework logic in config.wave and push it to parsing_nameslist_WW3.sh where it is actually used @@ -313,4 +326,7 @@ export ARCH_FCSTICFREQ=1 # Archive frequency in days for gdas and gfs foreca export DELETE_COM_IN_ARCHIVE_JOB="YES" # NO=retain ROTDIR. YES default in arch.sh and earc.sh. +# Number of regional collectives to create soundings for +export NUM_SND_COLLECTIVES=${NUM_SND_COLLECTIVES:-9} + echo "END: config.base" diff --git a/parm/config/gefs/config.efcs b/parm/config/gefs/config.efcs index ad90fa864c..915726b974 100644 --- a/parm/config/gefs/config.efcs +++ b/parm/config/gefs/config.efcs @@ -78,6 +78,6 @@ if [[ "${USE_OCN_PERTURB_FILES:-false}" == "true" ]]; then else export ODA_INCUPD="False" fi -export restart_interval="${restart_interval_gfs}" +export restart_interval="${restart_interval_enkfgfs:-12}" echo "END: config.efcs" diff --git a/parm/config/gefs/config.fcst b/parm/config/gefs/config.fcst index f91316c7d2..12e461cef8 100644 --- a/parm/config/gefs/config.fcst +++ b/parm/config/gefs/config.fcst @@ -8,12 +8,18 @@ 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 +# Turn off waves if not used for this RUN case ${WAVE_CDUMP} in - both | "${CDUMP/enkf}" ) ;; # Don't change + both | "${RUN/enkf}" ) ;; # Don't change *) DO_WAVE="NO" ;; # Turn waves off esac +# Turn off aerosols if not used for this RUN +case ${AERO_FCST_CDUMP} in + both | "${RUN/enkf}" ) ;; # Don't change + *) DO_AERO="NO" ;; # Turn waves off +esac + # Source model specific information that is resolution dependent string="--fv3 ${CASE}" [[ "${DO_OCN}" == "YES" ]] && string="${string} --mom6 ${OCNRES}" diff --git a/parm/config/gefs/config.wave b/parm/config/gefs/config.wave index 38ad959eee..66f19296cb 100644 --- a/parm/config/gefs/config.wave +++ b/parm/config/gefs/config.wave @@ -79,12 +79,7 @@ export WAVEWND_DID= export WAVEWND_FID= # The start time reflects the number of hindcast hours prior to the cycle initial time -export FHMAX_WAV=${FHMAX_GFS} export WAVHINDH=0 -export FHMIN_WAV=0 -export FHOUT_WAV=3 -export FHMAX_HF_WAV=120 -export FHOUT_HF_WAV=1 export FHMAX_WAV_IBP=180 if (( FHMAX_WAV < FHMAX_WAV_IBP )); then export FHMAX_WAV_IBP=${FHMAX_GFS} ; fi diff --git a/parm/config/gefs/config.wavepostsbs b/parm/config/gefs/config.wavepostsbs index b3c5902e3c..82cec321da 100644 --- a/parm/config/gefs/config.wavepostsbs +++ b/parm/config/gefs/config.wavepostsbs @@ -13,7 +13,6 @@ export WAV_SUBGRBSRC="" export WAV_SUBGRB="" # Options for point output (switch on/off boundary point output) -export DOIBP_WAV='NO' # Input boundary points export DOFLD_WAV='YES' # Field data export DOPNT_WAV='YES' # Station data export DOGRB_WAV='YES' # Create grib2 files diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base index 8ee1a2c17e..f1e25750ef 100644 --- a/parm/config/gfs/config.base +++ b/parm/config/gfs/config.base @@ -163,9 +163,6 @@ export APP=@APP@ shopt -s extglob # Adjust APP based on RUN case "${RUN}" in - gfs) # Turn off aerosols - APP="${APP/%A}" - ;; enkf*) # Turn off aerosols and waves APP="${APP/%+([WA])}" ;; @@ -181,8 +178,11 @@ export DO_WAVE="NO" export DO_OCN="NO" export DO_ICE="NO" export DO_AERO="NO" +export AERO_FCST_CDUMP="" # When to run aerosol forecast: gdas, gfs, or both +export AERO_ANL_CDUMP="" # When to run aerosol analysis: gdas, gfs, or both export WAVE_CDUMP="" # 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." export DO_NEST="NO" # Whether to run a global-nested domain if [[ "${DO_NEST:-NO}" == "YES" ]] ; then @@ -227,6 +227,8 @@ case "${APP}" in ;; ATMA) export DO_AERO="YES" + export AERO_ANL_CDUMP="both" + export AERO_FCST_CDUMP="gdas" ;; ATMW) export DO_COUPLED="YES" @@ -245,6 +247,8 @@ case "${APP}" in if [[ "${APP}" =~ A$ ]]; then export DO_AERO="YES" + export AERO_ANL_CDUMP="both" + export AERO_FCST_CDUMP="gdas" fi if [[ "${APP}" =~ ^S2SW ]]; then @@ -285,6 +289,12 @@ export FHOUT_GFS=3 # Must be 6 for S2S until #1629 is addressed; 3 for ops export FHMAX_HF_GFS=0 export FHOUT_HF_GFS=1 export FHOUT_OCNICE_GFS=6 +export FHMIN_WAV=0 +export FHOUT_WAV=3 +export FHMAX_HF_WAV=120 +export FHOUT_HF_WAV=1 +export FHMAX_WAV=${FHMAX:-9} +export FHMAX_WAV_GFS=${FHMAX_GFS} if (( gfs_cyc != 0 )); then export STEP_GFS=$(( 24 / gfs_cyc )) else @@ -342,6 +352,7 @@ export NMEM_ENS=@NMEM_ENS@ export SMOOTH_ENKF="NO" export l4densvar=".true." export lwrite4danl=".true." +export DO_CALC_INCREMENT="NO" # Early-cycle EnKF parameters export NMEM_ENS_GFS=30 @@ -370,6 +381,9 @@ if [[ ${DOHYBVAR} == "NO" && ${DOIAU} == "YES" ]]; then export IAUFHRS_ENKF="6" fi +# Generate post-processing ensemble spread files +export ENKF_SPREAD="YES" + # Check if cycle is cold starting, DOIAU off, or free-forecast mode if [[ "${MODE}" = "cycled" && "${SDATE}" = "${PDY}${cyc}" && ${EXP_WARM_START} = ".false." ]] || [[ "${DOIAU}" = "NO" ]] || [[ "${MODE}" = "forecast-only" && ${EXP_WARM_START} = ".false." ]] ; then export IAU_OFFSET=0 @@ -379,6 +393,22 @@ fi if [[ "${DOIAU_ENKF}" = "NO" ]]; then export IAUFHRS_ENKF="6"; fi +# Determine restart intervals +# For IAU, write restarts at beginning of window also +if [[ "${DOIAU_ENKF:-}" == "YES" ]]; then + export restart_interval_enkfgdas="3" +else + export restart_interval_enkfgdas="6" +fi + +export restart_interval_enkfgfs=${restart_interval_enkfgdas} + +if [[ "${DOIAU}" == "YES" ]]; then + export restart_interval_gdas="3" +else + export restart_interval_gdas="6" +fi + export GSI_SOILANAL=@GSI_SOILANAL@ # turned on nsst in anal and/or fcst steps, and turn off rtgsst @@ -435,4 +465,7 @@ if [[ ${DO_JEDIATMVAR} = "YES" ]]; then export DO_VMINMON="NO" # GSI minimization monitoring fi +# Number of regional collectives to create soundings for +export NUM_SND_COLLECTIVES=${NUM_SND_COLLECTIVES:-9} + echo "END: config.base" diff --git a/parm/config/gfs/config.earc b/parm/config/gfs/config.earc index de73a93731..00a2fa95bd 100644 --- a/parm/config/gfs/config.earc +++ b/parm/config/gfs/config.earc @@ -8,7 +8,25 @@ echo "BEGIN: config.earc" # Get task specific resources . $EXPDIR/config.resources earc -export NMEM_EARCGRP=10 +# Set the number of ensemble members to archive per earc job +case "${CASE_ENS}" in + "C48" | "C96") + export NMEM_EARCGRP=80 + ;; + "C192") + export NMEM_EARCGRP=20 + ;; + "C384" | "C768") + export NMEM_EARCGRP=10 + ;; + "C1152") + export NMEM_EARCGRP=4 + ;; + *) + echo "FATAL ERROR: Unknown ensemble resolution ${CASE_ENS}, ABORT!" + exit 1 + ;; +esac #--starting and ending hours of previous cycles to be removed from rotating directory export RMOLDSTD_ENKF=144 diff --git a/parm/config/gfs/config.efcs b/parm/config/gfs/config.efcs index 402ba64087..1837cf0619 100644 --- a/parm/config/gfs/config.efcs +++ b/parm/config/gfs/config.efcs @@ -85,11 +85,10 @@ if [[ ${RECENTER_ENKF:-"YES"} == "YES" ]]; then export PREFIX_ATMINC="r" fi -# For IAU, write restarts at beginning of window also -if [[ "${DOIAU_ENKF:-}" == "YES" ]]; then - export restart_interval="3" -else - export restart_interval="6" +# Set restart interval to enable restarting forecasts after failures +export restart_interval=${restart_interval_enkfgdas:-6} +if [[ ${RUN} == "enkfgfs" ]]; then + export restart_interval=${restart_interval_enkfgfs:-12} fi echo "END: config.efcs" diff --git a/parm/config/gfs/config.epos b/parm/config/gfs/config.epos index 8026a2ba2e..f1da929b62 100644 --- a/parm/config/gfs/config.epos +++ b/parm/config/gfs/config.epos @@ -14,7 +14,4 @@ if [ $l4densvar = ".false." ]; then export NEPOSGRP=3 fi -# Generate ensemble spread files -export ENKF_SPREAD="YES" - echo "END: config.epos" diff --git a/parm/config/gfs/config.fcst b/parm/config/gfs/config.fcst index db7306d2e8..f45874a31a 100644 --- a/parm/config/gfs/config.fcst +++ b/parm/config/gfs/config.fcst @@ -8,12 +8,18 @@ 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 +# Turn off waves if not used for this RUN case ${WAVE_CDUMP} in - both | "${CDUMP/enkf}" ) ;; # Don't change + both | "${RUN/enkf}" ) ;; # Don't change *) DO_WAVE="NO" ;; # Turn waves off esac +# Turn off aerosols if not used for this RUN +case ${AERO_FCST_CDUMP} in + both | "${RUN/enkf}" ) ;; # Don't change + *) DO_AERO="NO" ;; # Turn aerosols off +esac + # Source model specific information that is resolution dependent string="--fv3 ${CASE}" [[ "${DO_OCN}" == "YES" ]] && string="${string} --mom6 ${OCNRES}" @@ -271,11 +277,8 @@ if [[ "${CDUMP}" =~ "gdas" ]] ; then # GDAS cycle specific parameters # Variables used in DA cycling export DIAG_TABLE="${PARMgfs}/ufs/fv3/diag_table_da" - if [[ "${DOIAU}" == "YES" ]]; then - export restart_interval="3" - else - export restart_interval="6" - fi + # Write gfs restart files to rerun fcst from any break point + export restart_interval=${restart_interval_gdas:-6} # Turn on dry mass adjustment in GDAS export adjust_dry_mass=".true." diff --git a/parm/config/gfs/config.wave b/parm/config/gfs/config.wave index 5efceeeacf..3c643c7996 100644 --- a/parm/config/gfs/config.wave +++ b/parm/config/gfs/config.wave @@ -91,16 +91,10 @@ export WAVEWND_DID= export WAVEWND_FID= # The start time reflects the number of hindcast hours prior to the cycle initial time -if [[ "${CDUMP}" = "gdas" ]]; then - export FHMAX_WAV=${FHMAX:-9} -else - export FHMAX_WAV=${FHMAX_GFS} +if [[ "${RUN}" == "gfs" ]]; then + export FHMAX_WAV=${FHMAX_WAV_GFS} fi export WAVHINDH=0 -export FHMIN_WAV=0 -export FHOUT_WAV=3 -export FHMAX_HF_WAV=120 -export FHOUT_HF_WAV=1 export FHMAX_WAV_IBP=180 if (( FHMAX_WAV < FHMAX_WAV_IBP )); then export FHMAX_WAV_IBP=${FHMAX_GFS} ; fi @@ -113,7 +107,7 @@ export FHINCP_WAV=$(( DTPNT_WAV / 3600 )) export OUTPARS_WAV="WND CUR ICE HS T01 T02 DIR FP DP PHS PTP PDIR CHA" # Restart file config -if [[ "${CDUMP}" = "gdas" ]]; then +if [[ "${RUN}" == "gdas" ]]; then export WAVNCYC=4 export WAVHCYC=${assim_freq:-6} export FHMAX_WAV_CUR=48 # RTOFS forecasts only out to 8 days @@ -128,7 +122,7 @@ fi # Restart timing business export RSTTYPE_WAV='T' # generate second tier of restart files -if [[ "${CDUMP}" != gfs ]]; then # Setting is valid for GDAS and GEFS +if [[ "${RUN}" != gfs ]]; then # Setting is valid for GDAS and GEFS export DT_1_RST_WAV=10800 # time between restart files, set to DTRST=1 for a single restart file export DT_2_RST_WAV=43200 # restart stride for checkpointing restart export RSTIOFF_WAV=0 # first restart file offset relative to model start diff --git a/parm/config/gfs/config.wavepostsbs b/parm/config/gfs/config.wavepostsbs index b3c5902e3c..82cec321da 100644 --- a/parm/config/gfs/config.wavepostsbs +++ b/parm/config/gfs/config.wavepostsbs @@ -13,7 +13,6 @@ export WAV_SUBGRBSRC="" export WAV_SUBGRB="" # Options for point output (switch on/off boundary point output) -export DOIBP_WAV='NO' # Input boundary points export DOFLD_WAV='YES' # Field data export DOPNT_WAV='YES' # Station data export DOGRB_WAV='YES' # Create grib2 files diff --git a/scripts/exgdas_enkf_earc.py b/scripts/exgdas_enkf_earc.py new file mode 100755 index 0000000000..2febbc27f5 --- /dev/null +++ b/scripts/exgdas_enkf_earc.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 + +import os + +from pygfs.task.archive import Archive +from wxflow import AttrDict, Logger, cast_strdict_as_dtypedict, chdir, logit + +# initialize root logger +logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=True) + + +@logit(logger) +def main(): + + config = cast_strdict_as_dtypedict(os.environ) + + # Instantiate the Archive object + archive = Archive(config) + + # Pull out all the configuration keys needed to run the rest of archive steps + keys = ['ATARDIR', 'current_cycle', 'IAUFHRS', 'RUN', 'PDY', + 'PSLOT', 'HPSSARCH', 'LOCALARCH', 'ROTDIR', 'PARMgfs', + 'ARCDIR', 'SDATE', 'MODE', 'ENSGRP', 'NMEM_EARCGRP', + 'NMEM_ENS', 'DO_CALC_INCREMENT_ENKF_GFS', 'DO_JEDIATMENS', + 'lobsdiag_forenkf', 'FHMIN_ENKF', 'FHMAX_ENKF_GFS', + 'FHOUT_ENKF_GFS', 'FHMAX_ENKF', 'FHOUT_ENKF', 'ENKF_SPREAD', + 'restart_interval_enkfgdas', 'restart_interval_enkfgfs', + 'DOHYBVAR', 'DOIAU_ENKF', 'IAU_OFFSET', 'DOIAU', + 'DO_CALC_INCREMENT', 'assim_freq', 'ARCH_CYC', + 'ARCH_WARMICFREQ', 'ARCH_FCSTICFREQ', + 'IAUFHRS_ENKF'] + + archive_dict = AttrDict() + for key in keys: + archive_dict[key] = archive.task_config[key] + + # Also import all COM* directory and template variables + for key in archive.task_config.keys(): + if key.startswith("COM"): + archive_dict[key] = archive.task_config[key] + + cwd = os.getcwd() + + os.chdir(config.ROTDIR) + + # Determine which archives to create + arcdir_set, atardir_sets = archive.configure(archive_dict) + + # Populate the product archive (ARCDIR) + archive.execute_store_products(arcdir_set) + + # Create the backup tarballs and store in ATARDIR + for atardir_set in atardir_sets: + archive.execute_backup_dataset(atardir_set) + + os.chdir(cwd) + + +if __name__ == '__main__': + main() diff --git a/scripts/exgdas_enkf_earc.sh b/scripts/exgdas_enkf_earc.sh deleted file mode 100755 index 3e54c658e9..0000000000 --- a/scripts/exgdas_enkf_earc.sh +++ /dev/null @@ -1,163 +0,0 @@ -#! /usr/bin/env bash - -source "${USHgfs}/preamble.sh" - -############################################## -# Begin JOB SPECIFIC work -############################################## -export n=$((10#${ENSGRP})) -export CDUMP_ENKF="${EUPD_CYC:-"gdas"}" - -# ICS are restarts and always lag INC by $assim_freq hours. -EARCINC_CYC=${ARCH_CYC} -EARCICS_CYC=$((ARCH_CYC-assim_freq)) -if [ "${EARCICS_CYC}" -lt 0 ]; then - EARCICS_CYC=$((EARCICS_CYC+24)) -fi - -"${USHgfs}/hpssarch_gen.sh" "${RUN}" -status=$? -if [ "${status}" -ne 0 ]; then - echo "${USHgfs}/hpssarch_gen.sh ${RUN} failed, ABORT!" - exit "${status}" -fi - -cd "${ROTDIR}" || exit 2 - -source "${USHgfs}/file_utils.sh" - -################################################################### -# ENSGRP > 0 archives a group of ensemble members -firstday=$(${NDATE} +24 "${SDATE}") -if (( 10#${ENSGRP} > 0 )) && [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; then - -#--set the archiving command and create local directories, if necessary - TARCMD="htar" - if [[ ${LOCALARCH} = "YES" ]]; then - TARCMD="tar" - if [[ ! -d "${ATARDIR}/${PDY}${cyc}" ]]; then mkdir -p "${ATARDIR}/${PDY}${cyc}"; fi - fi - -#--determine when to save ICs for warm start - SAVEWARMICA="NO" - SAVEWARMICB="NO" - mm="${PDY:4:2}" - dd="${PDY:6:2}" - nday=$(( (10#${mm}-1)*30+10#${dd} )) - mod=$((nday % ARCH_WARMICFREQ)) - if [ "${PDY}${cyc}" -eq "${firstday}" ] && [ "${cyc}" -eq "${EARCINC_CYC}" ]; then SAVEWARMICA="YES" ; fi - if [ "${PDY}${cyc}" -eq "${firstday}" ] && [ "${cyc}" -eq "${EARCICS_CYC}" ]; then SAVEWARMICB="YES" ; fi - if [ "${mod}" -eq 0 ] && [ "${cyc}" ] && [ "${EARCINC_CYC}" ]; then SAVEWARMICA="YES" ; fi - if [ "${mod}" -eq 0 ] && [ "${cyc}" ] && [ "${EARCICS_CYC}" ]; then SAVEWARMICB="YES" ; fi - - if [ "${EARCICS_CYC}" -eq 18 ]; then - nday1=$((nday+1)) - mod1=$((nday1 % ARCH_WARMICFREQ)) - if [ "${mod1}" -eq 0 ] && [ "${cyc}" -eq "${EARCICS_CYC}" ] ; then SAVEWARMICB="YES" ; fi - if [ "${mod1}" -ne 0 ] && [ "${cyc}" -eq "${EARCICS_CYC}" ] ; then SAVEWARMICB="NO" ; fi - if [ "${PDY}${cyc}" -eq "${SDATE}" ] && [ "${cyc}" -eq "${EARCICS_CYC}" ] ; then SAVEWARMICB="YES" ; fi - fi - - if [ "${PDY}${cyc}" -gt "${SDATE}" ]; then # Don't run for first half cycle - - ${TARCMD} -P -cvf "${ATARDIR}/${PDY}${cyc}/${RUN}_grp${ENSGRP}.tar" $(cat "${DATA}/${RUN}_grp${n}.txt") - status=$? - if [ "${status}" -ne 0 ] && [ "${PDY}${cyc}" -ge "${firstday}" ]; then - echo "FATAL ERROR: ${TARCMD} ${PDY}${cyc} ${RUN}_grp${ENSGRP}.tar failed" - exit "${status}" - fi - - if [ "${SAVEWARMICA}" = "YES" ] && [ "${cyc}" -eq "${EARCINC_CYC}" ]; then - ${TARCMD} -P -cvf "${ATARDIR}/${PDY}${cyc}/${RUN}_restarta_grp${ENSGRP}.tar" $(cat "${DATA}/${RUN}_restarta_grp${n}.txt") - status=$? - if [ "${status}" -ne 0 ]; then - echo "FATAL ERROR: ${TARCMD} ${PDY}${cyc} ${RUN}_restarta_grp${ENSGRP}.tar failed" - exit "${status}" - fi - fi - - if [ "${SAVEWARMICB}" = "YES" ] && [ "${cyc}" -eq "${EARCICS_CYC}" ]; then - ${TARCMD} -P -cvf "${ATARDIR}/${PDY}${cyc}/${RUN}_restartb_grp${ENSGRP}.tar" $(cat "${DATA}/${RUN}_restartb_grp${n}.txt") - status=$? - if [ "${status}" -ne 0 ]; then - echo "FATAL ERROR: ${TARCMD} ${PDY}${cyc} ${RUN}_restartb_grp${ENSGRP}.tar failed" - exit "${status}" - fi - fi - - fi # CDATE>SDATE - -fi - - -################################################################### -# ENSGRP 0 archives ensemble means and copy data to online archive -if [ "${ENSGRP}" -eq 0 ]; then - - if [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; then - - #--set the archiving command and create local directories, if necessary - TARCMD="htar" - HSICMD="hsi" - if [[ ${LOCALARCH} = "YES" ]]; then - TARCMD="tar" - HSICMD="" - if [[ ! -d "${ATARDIR}/${PDY}${cyc}" ]]; then mkdir -p "${ATARDIR}/${PDY}${cyc}"; fi - fi - - set +e - # Check if the tarball will have rstprod in it - has_rstprod="NO" - while IFS= read -r file; do - if [[ -f ${file} ]]; then - group=$( stat -c "%G" "${file}" ) - if [[ "${group}" == "rstprod" ]]; then - has_rstprod="YES" - break - fi - fi - done < "${DATA}/${RUN}.txt" - - # Create the tarball - tar_fl=${ATARDIR}/${PDY}${cyc}/${RUN}.tar - ${TARCMD} -P -cvf "${tar_fl}" $(cat "${DATA}/${RUN}.txt") - status=$? - if [[ "${status}" -ne 0 ]]; then - echo "FATAL ERROR: Tarring of ${tar_fl} failed" - exit "${status}" - fi - - # If rstprod was found, change the group of the tarball - if [[ "${has_rstprod}" == "YES" ]]; then - ${HSICMD} chgrp rstprod "${tar_fl}" - stat_chgrp=$? - ${HSICMD} chmod 640 "${tar_fl}" - stat_chgrp=$((stat_chgrp+$?)) - if [[ "${stat_chgrp}" -gt 0 ]]; then - echo "FATAL ERROR: Unable to properly restrict ${tar_fl}!" - echo "Attempting to delete ${tar_fl}" - ${HSICMD} rm "${tar_fl}" - echo "Please verify that ${tar_fl} was deleted!" - exit "${stat_chgrp}" - fi - fi - - # For safety, test if the htar/tar command failed only after changing groups - if (( status != 0 && ${PDY}${cyc} >= firstday )); then - echo "FATAL ERROR: ${TARCMD} ${tar_fl} failed" - exit "${status}" - fi - set_strict - fi - - #-- Archive online for verification and diagnostics - [[ ! -d ${ARCDIR} ]] && mkdir -p "${ARCDIR}" - cd "${ARCDIR}" || exit 2 - - nb_copy "${COM_ATMOS_ANALYSIS_ENSSTAT}/${RUN}.t${cyc}z.enkfstat" \ - "enkfstat.${RUN}.${PDY}${cyc}" - nb_copy "${COM_ATMOS_ANALYSIS_ENSSTAT}/${RUN}.t${cyc}z.gsistat.ensmean" \ - "gsistat.${RUN}.${PDY}${cyc}.ensmean" -fi - -exit 0 diff --git a/scripts/exgfs_atmos_postsnd.sh b/scripts/exgfs_atmos_postsnd.sh index 7aa97f3644..23c41157fe 100755 --- a/scripts/exgfs_atmos_postsnd.sh +++ b/scripts/exgfs_atmos_postsnd.sh @@ -113,7 +113,7 @@ fi # add appropriate WMO Headers. ######################################## rm -rf poe_col -for (( m = 1; m <10 ; m++ )); do +for (( m = 1; m <= NUM_SND_COLLECTIVES ; m++ )); do echo "sh ${USHgfs}/gfs_sndp.sh ${m} " >> poe_col done diff --git a/scripts/exglobal_archive.py b/scripts/exglobal_archive.py new file mode 100755 index 0000000000..31b5eb1186 --- /dev/null +++ b/scripts/exglobal_archive.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 + +import os + +from pygfs.task.archive import Archive +from wxflow import AttrDict, Logger, cast_strdict_as_dtypedict, chdir, logit + +# initialize root logger +logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=True) + + +@logit(logger) +def main(): + + config = cast_strdict_as_dtypedict(os.environ) + + # Instantiate the Archive object + archive = Archive(config) + + # Pull out all the configuration keys needed to run the rest of archive steps + keys = ['ATARDIR', 'current_cycle', 'FHMIN', 'FHMAX', 'FHOUT', 'RUN', 'PDY', + 'DO_VERFRAD', 'DO_VMINMON', 'DO_VERFOZN', 'DO_ICE', 'DO_AERO', 'PARMgfs', + 'DO_OCN', 'DO_WAVE', 'WRITE_DOPOST', 'PSLOT', 'HPSSARCH', 'DO_MOS', + 'DO_JEDISNOWDA', 'LOCALARCH', 'REALTIME', 'ROTDIR', 'ARCH_WARMICFREQ', + 'ARCH_FCSTICFREQ', 'ARCH_CYC', 'assim_freq', 'ARCDIR', 'SDATE', + 'FHMIN_GFS', 'FHMAX_GFS', 'FHOUT_GFS', 'ARCH_GAUSSIAN', 'MODE', + 'FHOUT_OCNICE', 'FHOUT_OCNICE_GFS', 'DO_BUFRSND', 'DOHYBVAR', + 'ARCH_GAUSSIAN_FHMAX', 'ARCH_GAUSSIAN_FHINC', 'ARCH_GAUSSIAN_FHINC', + 'DOIAU', 'OCNRES', 'ICERES', 'NUM_SND_COLLECTIVES', 'FHOUT_WAV', + 'FHOUT_HF_WAV', 'FHMAX_WAV', 'FHMAX_HF_WAV', 'FHMAX_WAV_GFS', + 'restart_interval_gdas', 'restart_interval_gfs', + 'AERO_ANL_CDUMP', 'AERO_FCST_CDUMP', 'DOIBP_WAV', 'DO_JEDIOCNVAR', + 'NMEM_ENS', 'DO_JEDIATMVAR', 'DO_VRFY_OCEANDA', 'FHMAX_FITS', + 'FITSARC', 'IAUFHRS'] + + archive_dict = AttrDict() + for key in keys: + archive_dict[key] = archive.task_config[key] + + # Also import all COM* directory and template variables + for key in archive.task_config.keys(): + if key.startswith("COM"): + archive_dict[key] = archive.task_config[key] + + cwd = os.getcwd() + + os.chdir(config.ROTDIR) + + # Determine which archives to create + arcdir_set, atardir_sets = archive.configure(archive_dict) + + # Populate the product archive (ARCDIR) + archive.execute_store_products(arcdir_set) + + # Create the backup tarballs and store in ATARDIR + for atardir_set in atardir_sets: + archive.execute_backup_dataset(atardir_set) + + os.chdir(cwd) + + +if __name__ == '__main__': + main() diff --git a/scripts/exglobal_archive.sh b/scripts/exglobal_archive.sh deleted file mode 100755 index acb926d0e6..0000000000 --- a/scripts/exglobal_archive.sh +++ /dev/null @@ -1,321 +0,0 @@ -#! /usr/bin/env bash - -source "${USHgfs}/preamble.sh" - -############################################## -# Begin JOB SPECIFIC work -############################################## - -# ICS are restarts and always lag INC by $assim_freq hours -ARCHINC_CYC=${ARCH_CYC} -ARCHICS_CYC=$((ARCH_CYC-assim_freq)) -if [ "${ARCHICS_CYC}" -lt 0 ]; then - ARCHICS_CYC=$((ARCHICS_CYC+24)) -fi - -# CURRENT CYCLE -APREFIX="${RUN}.t${cyc}z." - -# Realtime parallels run GFS MOS on 1 day delay -# If realtime parallel, back up CDATE_MOS one day -# Ignore possible spelling error (nothing is misspelled) -# shellcheck disable=SC2153 -CDATE_MOS=${PDY}${cyc} -if [ "${REALTIME}" = "YES" ]; then - CDATE_MOS=$(${NDATE} -24 "${PDY}${cyc}") -fi -PDY_MOS="${CDATE_MOS:0:8}" - -############################################################### -# Archive online for verification and diagnostics -############################################################### -source "${USHgfs}/file_utils.sh" - -[[ ! -d ${ARCDIR} ]] && mkdir -p "${ARCDIR}" -nb_copy "${COM_ATMOS_ANALYSIS}/${APREFIX}gsistat" "${ARCDIR}/gsistat.${RUN}.${PDY}${cyc}" -nb_copy "${COM_SNOW_ANALYSIS}/${APREFIX}snowstat" "${ARCDIR}/snowstat.${RUN}.${PDY}${cyc}" -if [[ ${DO_AERO} = "YES" ]]; then - nb_copy "${COM_CHEM_ANALYSIS}/${APREFIX}aerostat" "${ARCDIR}/aerostat.${RUN}.${PDY}${cyc}" -fi -nb_copy "${COM_ATMOS_GRIB_1p00}/${APREFIX}pgrb2.1p00.anl" "${ARCDIR}/pgbanl.${RUN}.${PDY}${cyc}.grib2" - -# Archive 1 degree forecast GRIB2 files for verification -if [[ "${RUN}" == "gfs" ]]; then - fhmax=${FHMAX_GFS} - fhr=0 - while [ "${fhr}" -le "${fhmax}" ]; do - fhr2=$(printf %02i "${fhr}") - fhr3=$(printf %03i "${fhr}") - nb_copy "${COM_ATMOS_GRIB_1p00}/${APREFIX}pgrb2.1p00.f${fhr3}" "${ARCDIR}/pgbf${fhr2}.${RUN}.${PDY}${cyc}.grib2" - fhr=$((10#${fhr} + 10#${FHOUT_GFS} )) - done -fi -if [[ "${RUN}" == "gdas" ]]; then - flist="000 003 006 009" - for fhr in ${flist}; do - fname="${COM_ATMOS_GRIB_1p00}/${APREFIX}pgrb2.1p00.f${fhr}" - # TODO Shouldn't the archived files also use three-digit tags? - fhr2=$(printf %02i $((10#${fhr}))) - nb_copy "${fname}" "${ARCDIR}/pgbf${fhr2}.${RUN}.${PDY}${cyc}.grib2" - done -fi - -if [[ -s "${COM_ATMOS_TRACK}/avno.t${cyc}z.cyclone.trackatcfunix" ]]; then - # shellcheck disable=2153 - PSLOT4=${PSLOT:0:4} - # shellcheck disable= - PSLOT4=${PSLOT4^^} - sed "s:AVNO:${PSLOT4}:g" < "${COM_ATMOS_TRACK}/avno.t${cyc}z.cyclone.trackatcfunix" \ - > "${ARCDIR}/atcfunix.${RUN}.${PDY}${cyc}" - sed "s:AVNO:${PSLOT4}:g" < "${COM_ATMOS_TRACK}/avnop.t${cyc}z.cyclone.trackatcfunix" \ - > "${ARCDIR}/atcfunixp.${RUN}.${PDY}${cyc}" -fi - -if [[ "${RUN}" == "gdas" ]] && [[ -s "${COM_ATMOS_TRACK}/gdas.t${cyc}z.cyclone.trackatcfunix" ]]; then - # shellcheck disable=2153 - PSLOT4=${PSLOT:0:4} - # shellcheck disable= - PSLOT4=${PSLOT4^^} - sed "s:AVNO:${PSLOT4}:g" < "${COM_ATMOS_TRACK}/gdas.t${cyc}z.cyclone.trackatcfunix" \ - > "${ARCDIR}/atcfunix.${RUN}.${PDY}${cyc}" - sed "s:AVNO:${PSLOT4}:g" < "${COM_ATMOS_TRACK}/gdasp.t${cyc}z.cyclone.trackatcfunix" \ - > "${ARCDIR}/atcfunixp.${RUN}.${PDY}${cyc}" -fi - -if [ "${RUN}" = "gfs" ]; then - nb_copy "${COM_ATMOS_GENESIS}/storms.gfso.atcf_gen.${PDY}${cyc}" "${ARCDIR}/." - nb_copy "${COM_ATMOS_GENESIS}/storms.gfso.atcf_gen.altg.${PDY}${cyc}" "${ARCDIR}/." - nb_copy "${COM_ATMOS_TRACK}/trak.gfso.atcfunix.${PDY}${cyc}" "${ARCDIR}/." - nb_copy "${COM_ATMOS_TRACK}/trak.gfso.atcfunix.altg.${PDY}${cyc}" "${ARCDIR}/." - - mkdir -p "${ARCDIR}/tracker.${PDY}${cyc}/${RUN}" - blist="epac natl" - for basin in ${blist}; do - if [[ -f ${basin} ]]; then - cp -rp "${COM_ATMOS_TRACK}/${basin}" "${ARCDIR}/tracker.${PDY}${cyc}/${RUN}" - fi - done -fi - -# Archive required gaussian gfs forecast files for Fit2Obs -if [[ "${RUN}" == "gfs" ]] && [[ "${FITSARC}" = "YES" ]]; then - VFYARC=${VFYARC:-${ROTDIR}/vrfyarch} - [[ ! -d ${VFYARC} ]] && mkdir -p "${VFYARC}" - mkdir -p "${VFYARC}/${RUN}.${PDY}/${cyc}" - prefix="${RUN}.t${cyc}z" - fhmax=${FHMAX_FITS:-${FHMAX_GFS}} - fhr=0 - while [[ ${fhr} -le ${fhmax} ]]; do - fhr3=$(printf %03i "${fhr}") - sfcfile="${COM_ATMOS_HISTORY}/${prefix}.sfcf${fhr3}.nc" - sigfile="${COM_ATMOS_HISTORY}/${prefix}.atmf${fhr3}.nc" - nb_copy "${sfcfile}" "${VFYARC}/${RUN}.${PDY}/${cyc}/" - nb_copy "${sigfile}" "${VFYARC}/${RUN}.${PDY}/${cyc}/" - (( fhr = 10#${fhr} + 6 )) - done -fi - - -############################################################### -# Archive data either to HPSS or locally -if [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; then -############################################################### - - # --set the archiving command and create local directories, if necessary - TARCMD="htar" - HSICMD="hsi" - if [[ ${LOCALARCH} = "YES" ]]; then - TARCMD="tar" - HSICMD='' - [[ ! -d "${ATARDIR}/${PDY}${cyc}" ]] && mkdir -p "${ATARDIR}/${PDY}${cyc}" - [[ ! -d "${ATARDIR}/${CDATE_MOS}" ]] && [[ -d "${ROTDIR}/gfsmos.${PDY_MOS}" ]] && [[ "${cyc}" -eq 18 ]] && mkdir -p "${ATARDIR}/${CDATE_MOS}" - fi - - #--determine when to save ICs for warm start and forecast-only runs - SAVEWARMICA="NO" - SAVEWARMICB="NO" - SAVEFCSTIC="NO" - firstday=$(${NDATE} +24 "${SDATE}") - mm="${PDY:2:2}" - dd="${PDY:4:2}" - # TODO: This math yields multiple dates sharing the same nday - nday=$(( (10#${mm}-1)*30+10#${dd} )) - mod=$((nday % ARCH_WARMICFREQ)) - if [[ "${PDY}${cyc}" -eq "${firstday}" ]] && [[ "${cyc}" -eq "${ARCHINC_CYC}" ]]; then SAVEWARMICA="YES" ; fi - if [[ "${PDY}${cyc}" -eq "${firstday}" ]] && [[ "${cyc}" -eq "${ARCHICS_CYC}" ]]; then SAVEWARMICB="YES" ; fi - if [[ "${mod}" -eq 0 ]] && [[ "${cyc}" -eq "${ARCHINC_CYC}" ]]; then SAVEWARMICA="YES" ; fi - if [[ "${mod}" -eq 0 ]] && [[ "${cyc}" -eq "${ARCHICS_CYC}" ]]; then SAVEWARMICB="YES" ; fi - - if [[ "${ARCHICS_CYC}" -eq 18 ]]; then - nday1=$((nday+1)) - mod1=$((nday1 % ARCH_WARMICFREQ)) - if [[ "${mod1}" -eq 0 ]] && [[ "${cyc}" -eq "${ARCHICS_CYC}" ]] ; then SAVEWARMICB="YES" ; fi - if [[ "${mod1}" -ne 0 ]] && [[ "${cyc}" -eq "${ARCHICS_CYC}" ]] ; then SAVEWARMICB="NO" ; fi - if [[ "${PDY}${cyc}" -eq "${SDATE}" ]] && [[ "${cyc}" -eq "${ARCHICS_CYC}" ]] ; then SAVEWARMICB="YES" ; fi - fi - - mod=$((nday % ARCH_FCSTICFREQ)) - if [[ "${mod}" -eq 0 ]] || [[ "${PDY}${cyc}" -eq "${firstday}" ]]; then SAVEFCSTIC="YES" ; fi - - cd "${DATA}" || exit 2 - - "${USHgfs}/hpssarch_gen.sh" "${RUN}" - status=$? - if [ "${status}" -ne 0 ]; then - echo "${USHgfs}/hpssarch_gen.sh ${RUN} failed, ABORT!" - exit "${status}" - fi - - cd "${ROTDIR}" || exit 2 - - if [[ "${RUN}" = "gfs" ]]; then - - targrp_list="gfsa gfsb" - - if [ "${ARCH_GAUSSIAN:-"NO"}" = "YES" ]; then - targrp_list="${targrp_list} gfs_flux gfs_netcdfb gfs_pgrb2b" - if [ "${MODE}" = "cycled" ]; then - targrp_list="${targrp_list} gfs_netcdfa" - fi - fi - - if [ "${DO_WAVE}" = "YES" ]; then - targrp_list="${targrp_list} gfswave" - fi - - if [[ "${DO_OCN}" == "YES" ]]; then - targrp_list="${targrp_list} ocean_6hravg ocean_daily ocean_grib2 gfs_flux_1p00" - fi - - if [[ "${DO_ICE}" == "YES" ]]; then - targrp_list="${targrp_list} ice_6hravg ice_grib2" - fi - - # Aerosols - if [ "${DO_AERO}" = "YES" ]; then - for targrp in chem; do - # TODO: Why is this tar being done here instead of being added to the list? - ${TARCMD} -P -cvf "${ATARDIR}/${PDY}${cyc}/${targrp}.tar" $(cat "${DATA}/${targrp}.txt") - status=$? - if [[ "${status}" -ne 0 ]] && [[ "${PDY}${cyc}" -ge "${firstday}" ]]; then - echo "HTAR ${PDY}${cyc} ${targrp}.tar failed" - exit "${status}" - fi - done - fi - - #for restarts - if [ "${SAVEFCSTIC}" = "YES" ]; then - targrp_list="${targrp_list} gfs_restarta" - fi - - #for downstream products - if [ "${DO_BUFRSND}" = "YES" ]; then - targrp_list="${targrp_list} gfs_downstream" - fi - - #--save mdl gfsmos output from all cycles in the 18Z archive directory - if [[ -d "gfsmos.${PDY_MOS}" ]] && [[ "${cyc}" -eq 18 ]]; then - set +e - # TODO: Why is this tar being done here instead of being added to the list? - ${TARCMD} -P -cvf "${ATARDIR}/${CDATE_MOS}/gfsmos.tar" "./gfsmos.${PDY_MOS}" - status=$? - if [[ "${status}" -ne 0 ]] && [[ "${PDY}${cyc}" -ge "${firstday}" ]]; then - echo "${TARCMD^^} ${PDY}${cyc} gfsmos.tar failed" - exit "${status}" - fi - set_strict - fi - elif [[ "${RUN}" = "gdas" ]]; then - - targrp_list="gdas" - - #gdaswave - if [ "${DO_WAVE}" = "YES" ]; then - targrp_list="${targrp_list} gdaswave" - fi - - #gdasocean - if [ "${DO_OCN}" = "YES" ]; then - targrp_list="${targrp_list} gdasocean" - if [[ "${DO_JEDIOCNVAR}" == "YES" ]]; then - targrp_list="${targrp_list} gdasocean_analysis" - fi - fi - - #gdasice - if [ "${DO_ICE}" = "YES" ]; then - targrp_list="${targrp_list} gdasice" - fi - - if [ "${SAVEWARMICA}" = "YES" ] || [ "${SAVEFCSTIC}" = "YES" ]; then - targrp_list="${targrp_list} gdas_restarta" - if [ "${DO_WAVE}" = "YES" ]; then targrp_list="${targrp_list} gdaswave_restart"; fi - if [ "${DO_OCN}" = "YES" ]; then targrp_list="${targrp_list} gdasocean_restart"; fi - if [ "${DO_ICE}" = "YES" ]; then targrp_list="${targrp_list} gdasice_restart"; fi - fi - - if [ "${SAVEWARMICB}" = "YES" ] || [ "${SAVEFCSTIC}" = "YES" ]; then - targrp_list="${targrp_list} gdas_restartb" - fi - fi - - # Turn on extended globbing options - shopt -s extglob - for targrp in ${targrp_list}; do - set +e - - # Test whether gdas.tar or gdas_restarta.tar will have rstprod data - has_rstprod="NO" - case ${targrp} in - 'gdas'|'gdas_restarta') - # Test for rstprod in each archived file - while IFS= read -r file; do - if [[ -f ${file} ]]; then - group=$( stat -c "%G" "${file}" ) - if [[ "${group}" == "rstprod" ]]; then - has_rstprod="YES" - break - fi - fi - done < "${DATA}/${targrp}.txt" - - ;; - *) ;; - esac - - # Create the tarball - tar_fl="${ATARDIR}/${PDY}${cyc}/${targrp}.tar" - ${TARCMD} -P -cvf "${tar_fl}" $(cat "${DATA}/${targrp}.txt") - status=$? - - # Change group to rstprod if it was found even if htar/tar failed in case of partial creation - if [[ "${has_rstprod}" == "YES" ]]; then - ${HSICMD} chgrp rstprod "${tar_fl}" - stat_chgrp=$? - ${HSICMD} chmod 640 "${tar_fl}" - stat_chgrp=$((stat_chgrp+$?)) - if [[ "${stat_chgrp}" -gt 0 ]]; then - echo "FATAL ERROR: Unable to properly restrict ${tar_fl}!" - echo "Attempting to delete ${tar_fl}" - ${HSICMD} rm "${tar_fl}" - echo "Please verify that ${tar_fl} was deleted!" - exit "${stat_chgrp}" - fi - fi - - # For safety, test if the htar/tar command failed after changing groups - if [[ "${status}" -ne 0 ]] && [[ "${PDY}${cyc}" -ge "${firstday}" ]]; then - echo "FATAL ERROR: ${TARCMD} ${tar_fl} failed" - exit "${status}" - fi - set_strict - done - # Turn extended globbing back off - shopt -u extglob - -############################################################### -fi ##end of HPSS archive -############################################################### - -exit 0 diff --git a/sorc/build_all.sh b/sorc/build_all.sh index 0797092a37..e3040fc0fa 100755 --- a/sorc/build_all.sh +++ b/sorc/build_all.sh @@ -183,7 +183,7 @@ echo "Building ${build_list}" # Go through all builds and adjust CPU counts up if possible if [[ ${requested_cpus} -lt ${_build_job_max} && ${big_jobs} -gt 0 ]]; then - # Add cores to the gdas, ufs, and gsi build jobs + # Add cores to the gdas and ufs build jobs extra_cores=$(( _build_job_max - requested_cpus )) extra_cores=$(( extra_cores / big_jobs )) for build in "${!build_jobs[@]}"; do diff --git a/sorc/wxflow b/sorc/wxflow index 942b90bfaa..71f6b10f76 160000 --- a/sorc/wxflow +++ b/sorc/wxflow @@ -1 +1 @@ -Subproject commit 942b90bfaa14f6b6d7374310dbdfd421ddb30548 +Subproject commit 71f6b10f76a440993580027ba1183d61277d1299 diff --git a/ush/check_netcdf.sh b/ush/check_netcdf.sh index e115ae8ae3..5f56a38aba 100755 --- a/ush/check_netcdf.sh +++ b/ush/check_netcdf.sh @@ -8,7 +8,7 @@ source "${HOMEgfs}/ush/load_fv3gfs_modules.sh" 1>/dev/null 2>&1 ncfile=${1?} -ncdump -h "${ncfile}" 1>/dev/null 2>&1 # redirect stdout and stderr to /dev/null to suppress output in cron +(( $(ncdump "${ncfile}" 2> /dev/null | grep -Po '(?<=time = UNLIMITED ; // \()\d+(?= currently)' || echo 0) > 0 )) # redirect stdout and stderr to /dev/null to suppress output in cron rc=$? # If there is no error, rc=0, else rc!=0 diff --git a/ush/forecast_det.sh b/ush/forecast_det.sh index e4b9ded3d3..5e2f277592 100755 --- a/ush/forecast_det.sh +++ b/ush/forecast_det.sh @@ -87,7 +87,7 @@ UFS_det(){ # Check for CICE6 restart availability if [[ "${cplice}" == ".true." ]]; then if [[ ! -f "${DATArestart}/CICE_RESTART/cice_model.res.${rdate:0:4}-${rdate:4:2}-${rdate:6:2}-${seconds}.nc" ]]; then - cice_rst_ok="NO" + cice6_rst_ok="NO" fi fi diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh index 9c8858ec3d..0257d17e23 100755 --- a/ush/forecast_postdet.sh +++ b/ush/forecast_postdet.sh @@ -239,7 +239,7 @@ FV3_out() { if [[ "${RUN}" =~ "gdas" || "${RUN}" == "enkfgfs" ]]; then local restart_date restart_date=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${restart_interval} hours" +%Y%m%d%H) - while (( restart_date < forecast_end_cycle )); do + while (( restart_date <= forecast_end_cycle )); do echo "Copying FV3 restarts for 'RUN=${RUN}' at ${restart_date}" for fv3_restart_file in "${fv3_restart_files[@]}"; do restart_file="${restart_date:0:8}.${restart_date:8:2}0000.${fv3_restart_file}" @@ -471,7 +471,7 @@ MOM6_nml() { MOM6_out() { echo "SUB ${FUNCNAME[0]}: Copying output data for MOM6" - # Copy MOM_input from DATA to COM_OCEAN_INPUT after the forecast is run (and successfull) + # Copy MOM_input from DATA to COM_CONF after the forecast is run (and successfull) ${NCP} "${DATA}/INPUT/MOM_input" "${COM_CONF}/ufs.MOM_input" # Create a list of MOM6 restart files diff --git a/ush/hpssarch_gen.sh b/ush/hpssarch_gen.sh deleted file mode 100755 index 101745da8e..0000000000 --- a/ush/hpssarch_gen.sh +++ /dev/null @@ -1,798 +0,0 @@ -#! /usr/bin/env bash - -################################################### -# Fanglin Yang, 20180318 -# --create bunches of files to be archived to HPSS -################################################### -source "${USHgfs}/preamble.sh" - -type=${1:-gfs} ##gfs, gdas, enkfgdas or enkfggfs - -ARCH_GAUSSIAN=${ARCH_GAUSSIAN:-"YES"} -ARCH_GAUSSIAN_FHMAX=${ARCH_GAUSSIAN_FHMAX:-36} -ARCH_GAUSSIAN_FHINC=${ARCH_GAUSSIAN_FHINC:-6} - -# Set whether to archive downstream products -DO_DOWN=${DO_DOWN:-"NO"} -if [[ ${DO_BUFRSND} = "YES" ]]; then - export DO_DOWN="YES" -fi - -#----------------------------------------------------- -if [[ ${type} = "gfs" ]]; then -#----------------------------------------------------- - FHMIN_GFS=${FHMIN_GFS:-0} - FHMAX_GFS=${FHMAX_GFS:-384} - FHOUT_GFS=${FHOUT_GFS:-3} - FHMAX_HF_GFS=${FHMAX_HF_GFS:-120} - FHOUT_HF_GFS=${FHOUT_HF_GFS:-1} - - rm -f "${DATA}/gfsa.txt" - rm -f "${DATA}/gfsb.txt" - rm -f "${DATA}/gfs_restarta.txt" - touch "${DATA}/gfsa.txt" - touch "${DATA}/gfsb.txt" - touch "${DATA}/gfs_restarta.txt" - - if [[ ${ARCH_GAUSSIAN} = "YES" ]]; then - rm -f "${DATA}/gfs_pgrb2b.txt" - rm -f "${DATA}/gfs_netcdfb.txt" - rm -f "${DATA}/gfs_flux.txt" - touch "${DATA}/gfs_pgrb2b.txt" - touch "${DATA}/gfs_netcdfb.txt" - touch "${DATA}/gfs_flux.txt" - - if [[ ${MODE} = "cycled" ]]; then - rm -f "${DATA}/gfs_netcdfa.txt" - touch "${DATA}/gfs_netcdfa.txt" - fi - fi - - if [[ ${DO_DOWN} = "YES" ]]; then - rm -f "${DATA}/gfs_downstream.txt" - touch "${DATA}/gfs_downstream.txt" - fi - - head="gfs.t${cyc}z." - - if [[ ${ARCH_GAUSSIAN} = "YES" ]]; then - { - echo "${COM_ATMOS_GRIB_0p25/${ROTDIR}\//}/${head}pgrb2b.0p25.anl" - echo "${COM_ATMOS_GRIB_0p25/${ROTDIR}\//}/${head}pgrb2b.0p25.anl.idx" - echo "${COM_ATMOS_GRIB_1p00/${ROTDIR}\//}/${head}pgrb2b.1p00.anl" - echo "${COM_ATMOS_GRIB_1p00/${ROTDIR}\//}/${head}pgrb2b.1p00.anl.idx" - } >> "${DATA}/gfs_pgrb2b.txt" - - if [[ ${MODE} = "cycled" ]]; then - { - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}atmanl.nc" - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}sfcanl.nc" - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}atmi*.nc" - gsida_files=("dtfanl.nc" - "loginc.txt") - for file in "${gsida_files[@]}"; do - [[ -s ${COM_ATMOS_ANALYSIS}/${head}${file} ]] && echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}${file}" - done - } >> "${DATA}/gfs_netcdfa.txt" - fi - - fh=0 - while (( fh <= ARCH_GAUSSIAN_FHMAX )); do - fhr=$(printf %03i "${fh}") - { - echo "${COM_ATMOS_HISTORY/${ROTDIR}\//}/${head}atmf${fhr}.nc" - echo "${COM_ATMOS_HISTORY/${ROTDIR}\//}/${head}sfcf${fhr}.nc" - } >> "${DATA}/gfs_netcdfb.txt" - fh=$((fh+ARCH_GAUSSIAN_FHINC)) - done - fi - - #.................. - # Exclude the gfsarch.log file, which will change during the tar operation - # This uses the bash extended globbing option - { - echo "./logs/${PDY}${cyc}/gfs!(arch).log" - echo "${COM_CONF/${ROTDIR}\//}/ufs.input.nml" - - if [[ ${MODE} = "cycled" ]]; then - if [[ -s "${COM_ATMOS_ANALYSIS}/${head}gsistat" ]]; then - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}gsistat" - fi - gsiob_files=("nsstbufr" - "prepbufr" - "prepbufr.acft_profiles") - for file in "${gsiob_files[@]}"; do - [[ -s ${COM_OBS}/${head}${file} ]] && echo "${COM_OBS/${ROTDIR}\//}/${head}${file}" - done - if [[ -s "${COM_ATMOS_ANALYSIS}/${head}atmvar.yaml" ]]; then - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}atmvar.yaml" - fi - if [[ -s "${COM_ATMOS_ANALYSIS}/${head}atmstat" ]]; then - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}atmstat" - fi - fi - - echo "${COM_ATMOS_GRIB_0p25/${ROTDIR}\//}/${head}pgrb2.0p25.anl" - echo "${COM_ATMOS_GRIB_0p25/${ROTDIR}\//}/${head}pgrb2.0p25.anl.idx" - - #Only generated if there are cyclones to track - cyclone_files=("avno.t${cyc}z.cyclone.trackatcfunix" - "avnop.t${cyc}z.cyclone.trackatcfunix" - "trak.gfso.atcfunix.${PDY}${cyc}" - "trak.gfso.atcfunix.altg.${PDY}${cyc}") - - for file in "${cyclone_files[@]}"; do - [[ -s ${COM_ATMOS_TRACK}/${file} ]] && echo "${COM_ATMOS_TRACK/${ROTDIR}\//}/${file}" - done - - genesis_files=("storms.gfso.atcf_gen.${PDY}${cyc}" - "storms.gfso.atcf_gen.altg.${PDY}${cyc}") - for file in "${genesis_files[@]}"; do - [[ -s ${COM_ATMOS_GENESIS}/${file} ]] && echo "${COM_ATMOS_GENESIS/${ROTDIR}\//}/${file}" - done - - # GSI Monitor job output - - if [[ ${DO_VMINMON} = "YES" ]]; then - echo "${COM_ATMOS_MINMON/${ROTDIR}\//}/${PDY}${cyc}.costs.txt" - echo "${COM_ATMOS_MINMON/${ROTDIR}\//}/${PDY}${cyc}.cost_terms.txt" - echo "${COM_ATMOS_MINMON/${ROTDIR}\//}/${PDY}${cyc}.gnorms.ieee_d" - echo "${COM_ATMOS_MINMON/${ROTDIR}\//}/${PDY}${cyc}.reduction.ieee_d" - echo "${COM_ATMOS_MINMON/${ROTDIR}\//}/gnorm_data.txt" - fi - - } >> "${DATA}/gfsa.txt" - - { - if [[ ${DO_DOWN} = "YES" ]]; then - if [[ ${DO_BUFRSND} = "YES" ]]; then - echo "${COM_ATMOS_GEMPAK/${ROTDIR}\//}/gfs_${PDY}${cyc}.sfc" - echo "${COM_ATMOS_GEMPAK/${ROTDIR}\//}/gfs_${PDY}${cyc}.snd" - echo "${COM_ATMOS_WMO/${ROTDIR}\//}/gfs_collective*.postsnd_${cyc}" - echo "${COM_ATMOS_BUFR/${ROTDIR}\//}/bufr.t${cyc}z" - echo "${COM_ATMOS_BUFR/${ROTDIR}\//}/gfs.t${cyc}z.bufrsnd.tar.gz" - fi - fi - } >> "${DATA}/gfs_downstream.txt" - - { - echo "${COM_ATMOS_GRIB_0p50/${ROTDIR}\//}/${head}pgrb2.0p50.anl" - echo "${COM_ATMOS_GRIB_0p50/${ROTDIR}\//}/${head}pgrb2.0p50.anl.idx" - echo "${COM_ATMOS_GRIB_1p00/${ROTDIR}\//}/${head}pgrb2.1p00.anl" - echo "${COM_ATMOS_GRIB_1p00/${ROTDIR}\//}/${head}pgrb2.1p00.anl.idx" - } >> "${DATA}/gfsb.txt" - - - fh=0 - while (( fh <= FHMAX_GFS )); do - fhr=$(printf %03i "${fh}") - if [[ ${ARCH_GAUSSIAN} = "YES" ]]; then - { - echo "${COM_ATMOS_MASTER/${ROTDIR}\//}/${head}sfluxgrbf${fhr}.grib2" - echo "${COM_ATMOS_MASTER/${ROTDIR}\//}/${head}sfluxgrbf${fhr}.grib2.idx" - } >> "${DATA}/gfs_flux.txt" - - { - echo "${COM_ATMOS_GRIB_0p25/${ROTDIR}\//}/${head}pgrb2b.0p25.f${fhr}" - echo "${COM_ATMOS_GRIB_0p25/${ROTDIR}\//}/${head}pgrb2b.0p25.f${fhr}.idx" - if [[ -s "${COM_ATMOS_GRIB_1p00}/${head}pgrb2b.1p00.f${fhr}" ]]; then - echo "${COM_ATMOS_GRIB_1p00/${ROTDIR}\//}/${head}pgrb2b.1p00.f${fhr}" - echo "${COM_ATMOS_GRIB_1p00/${ROTDIR}\//}/${head}pgrb2b.1p00.f${fhr}.idx" - fi - } >> "${DATA}/gfs_pgrb2b.txt" - fi - - { - echo "${COM_ATMOS_GRIB_0p25/${ROTDIR}\//}/${head}pgrb2.0p25.f${fhr}" - echo "${COM_ATMOS_GRIB_0p25/${ROTDIR}\//}/${head}pgrb2.0p25.f${fhr}.idx" - echo "${COM_ATMOS_HISTORY/${ROTDIR}\//}/${head}atm.logf${fhr}.txt" - } >> "${DATA}/gfsa.txt" - - - { - if [[ -s "${COM_ATMOS_GRIB_0p50}/${head}pgrb2.0p50.f${fhr}" ]]; then - echo "${COM_ATMOS_GRIB_0p50/${ROTDIR}\//}/${head}pgrb2.0p50.f${fhr}" - echo "${COM_ATMOS_GRIB_0p50/${ROTDIR}\//}/${head}pgrb2.0p50.f${fhr}.idx" - fi - if [[ -s "${COM_ATMOS_GRIB_1p00}/${head}pgrb2.1p00.f${fhr}" ]]; then - echo "${COM_ATMOS_GRIB_1p00/${ROTDIR}\//}/${head}pgrb2.1p00.f${fhr}" - echo "${COM_ATMOS_GRIB_1p00/${ROTDIR}\//}/${head}pgrb2.1p00.f${fhr}.idx" - fi - } >> "${DATA}/gfsb.txt" - - inc=${FHOUT_GFS} - if (( FHMAX_HF_GFS > 0 && FHOUT_HF_GFS > 0 && fh < FHMAX_HF_GFS )); then - inc=${FHOUT_HF_GFS} - fi - - fh=$((fh+inc)) - done - - #.................. - { - if [[ ${MODE} = "cycled" ]]; then - echo "${COM_ATMOS_RESTART/${ROTDIR}\//}/*0000.sfcanl_data.tile1.nc" - echo "${COM_ATMOS_RESTART/${ROTDIR}\//}/*0000.sfcanl_data.tile2.nc" - echo "${COM_ATMOS_RESTART/${ROTDIR}\//}/*0000.sfcanl_data.tile3.nc" - echo "${COM_ATMOS_RESTART/${ROTDIR}\//}/*0000.sfcanl_data.tile4.nc" - echo "${COM_ATMOS_RESTART/${ROTDIR}\//}/*0000.sfcanl_data.tile5.nc" - echo "${COM_ATMOS_RESTART/${ROTDIR}\//}/*0000.sfcanl_data.tile6.nc" - elif [[ ${MODE} = "forecast-only" ]]; then - echo "${COM_ATMOS_INPUT/${ROTDIR}\//}/gfs_ctrl.nc" - echo "${COM_ATMOS_INPUT/${ROTDIR}\//}/gfs_data.tile1.nc" - echo "${COM_ATMOS_INPUT/${ROTDIR}\//}/gfs_data.tile2.nc" - echo "${COM_ATMOS_INPUT/${ROTDIR}\//}/gfs_data.tile3.nc" - echo "${COM_ATMOS_INPUT/${ROTDIR}\//}/gfs_data.tile4.nc" - echo "${COM_ATMOS_INPUT/${ROTDIR}\//}/gfs_data.tile5.nc" - echo "${COM_ATMOS_INPUT/${ROTDIR}\//}/gfs_data.tile6.nc" - echo "${COM_ATMOS_INPUT/${ROTDIR}\//}/sfc_data.tile1.nc" - echo "${COM_ATMOS_INPUT/${ROTDIR}\//}/sfc_data.tile2.nc" - echo "${COM_ATMOS_INPUT/${ROTDIR}\//}/sfc_data.tile3.nc" - echo "${COM_ATMOS_INPUT/${ROTDIR}\//}/sfc_data.tile4.nc" - echo "${COM_ATMOS_INPUT/${ROTDIR}\//}/sfc_data.tile5.nc" - echo "${COM_ATMOS_INPUT/${ROTDIR}\//}/sfc_data.tile6.nc" - fi - } >> "${DATA}/gfs_restarta.txt" - - - #.................. - if [[ ${DO_WAVE} = "YES" ]]; then - - rm -rf "${DATA}/gfswave.txt" - touch "${DATA}/gfswave.txt" - - head="gfswave.t${cyc}z." - - #........................... - { - echo "${COM_WAVE_HISTORY/${ROTDIR}\//}/ww3_multi*" - echo "${COM_WAVE_GRID/${ROTDIR}\//}/${head}*" - echo "${COM_WAVE_STATION/${ROTDIR}\//}/${head}*" - } >> "${DATA}/gfswave.txt" - fi - - if [[ "${DO_OCN}" == "YES" ]]; then - - head="gfs.ocean.t${cyc}z." - rm -f "${DATA}/ocean_6hravg.txt"; touch "${DATA}/ocean_6hravg.txt" - rm -f "${DATA}/ocean_daily.txt"; touch "${DATA}/ocean_daily.txt" - rm -f "${DATA}/ocean_grib2.txt"; touch "${DATA}/ocean_grib2.txt" - - echo "${COM_OCEAN_HISTORY/${ROTDIR}\//}/${head}6hr_avg.f*.nc" >> "${DATA}/ocean_6hravg.txt" - echo "${COM_OCEAN_HISTORY/${ROTDIR}\//}/${head}daily.f*.nc" >> "${DATA}/ocean_daily.txt" - - { - if [[ -d "${COM_OCEAN_GRIB}/5p00" ]]; then - echo "${COM_OCEAN_GRIB/${ROTDIR}\//}/5p00/${head}5p00.f*.grib2" - echo "${COM_OCEAN_GRIB/${ROTDIR}\//}/5p00/${head}5p00.f*.grib2.idx" - fi - if [[ -d "${COM_OCEAN_GRIB}/1p00" ]]; then - echo "${COM_OCEAN_GRIB/${ROTDIR}\//}/1p00/${head}1p00.f*.grib2" - echo "${COM_OCEAN_GRIB/${ROTDIR}\//}/1p00/${head}1p00.f*.grib2.idx" - fi - if [[ -d "${COM_OCEAN_GRIB}/0p25" ]]; then - echo "${COM_OCEAN_GRIB/${ROTDIR}\//}/0p25/${head}0p25.f*.grib2" - echo "${COM_OCEAN_GRIB/${ROTDIR}\//}/0p25/${head}0p25.f*.grib2.idx" - fi - } >> "${DATA}/ocean_grib2.txt" - - # Also save fluxes from atmosphere - head="gfs.t${cyc}z." - rm -f "${DATA}/gfs_flux_1p00.txt"; touch "${DATA}/gfs_flux_1p00.txt" - { - echo "${COM_ATMOS_GRIB_1p00/${ROTDIR}\//}/${head}flux.1p00.f???" - echo "${COM_ATMOS_GRIB_1p00/${ROTDIR}\//}/${head}flux.1p00.f???.idx" - } >> "${DATA}/gfs_flux_1p00.txt" - fi - - if [[ "${DO_ICE}" == "YES" ]]; then - head="gfs.ice.t${cyc}z." - rm -f "${DATA}/ice_6hravg.txt"; touch "${DATA}/ice_6hravg.txt" - rm -f "${DATA}/ice_grib2.txt"; touch "${DATA}/ice_grib2.txt" - - { - echo "${COM_ICE_HISTORY/${ROTDIR}\//}/${head}ic.nc" - echo "${COM_ICE_HISTORY/${ROTDIR}\//}/${head}6hr_avg.f*.nc" - } >> "${DATA}/ice_6hravg.txt" - - { - if [[ -d "${COM_ICE_GRIB}/5p00" ]]; then - echo "${COM_ICE_GRIB/${ROTDIR}\//}/5p00/${head}5p00.f*.grib2" - echo "${COM_ICE_GRIB/${ROTDIR}\//}/5p00/${head}5p00.f*.grib2.idx" - fi - if [[ -d "${COM_ICE_GRIB}/1p00" ]]; then - echo "${COM_ICE_GRIB/${ROTDIR}\//}/1p00/${head}1p00.f*.grib2" - echo "${COM_ICE_GRIB/${ROTDIR}\//}/1p00/${head}1p00.f*.grib2.idx" - fi - if [[ -d "${COM_ICE_GRIB}/0p25" ]]; then - echo "${COM_ICE_GRIB/${ROTDIR}\//}/0p25/${head}0p25.f*.grib2" - echo "${COM_ICE_GRIB/${ROTDIR}\//}/0p25/${head}0p25.f*.grib2.idx" - fi - } >> "${DATA}/ice_grib2.txt" - fi - - if [[ ${DO_AERO} = "YES" ]]; then - head="gocart" - - rm -f "${DATA}/chem.txt" - touch "${DATA}/chem.txt" - - echo "${COM_CHEM_HISTORY/${ROTDIR}\//}/${head}*" >> "${DATA}/chem.txt" - fi - -#----------------------------------------------------- -fi ##end of gfs -#----------------------------------------------------- - - - -#----------------------------------------------------- -if [[ ${type} == "gdas" ]]; then -#----------------------------------------------------- - - rm -f "${DATA}/gdas.txt" - rm -f "${DATA}/gdas_restarta.txt" - rm -f "${DATA}/gdas_restartb.txt" - touch "${DATA}/gdas.txt" - touch "${DATA}/gdas_restarta.txt" - touch "${DATA}/gdas_restartb.txt" - - head="gdas.t${cyc}z." - - #.................. - { - echo "${COM_ATMOS_GRIB_0p25/${ROTDIR}\//}/${head}pgrb2.0p25.anl" - echo "${COM_ATMOS_GRIB_0p25/${ROTDIR}\//}/${head}pgrb2.0p25.anl.idx" - echo "${COM_ATMOS_GRIB_1p00/${ROTDIR}\//}/${head}pgrb2.1p00.anl" - echo "${COM_ATMOS_GRIB_1p00/${ROTDIR}\//}/${head}pgrb2.1p00.anl.idx" - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}atmanl.nc" - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}sfcanl.nc" - if [[ -s "${COM_ATMOS_ANALYSIS}/${head}atmvar.yaml" ]]; then - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}atmvar.yaml" - fi - if [[ -s "${COM_ATMOS_ANALYSIS}/${head}atmstat" ]]; then - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}atmstat" - fi - if [[ -s "${COM_ATMOS_ANALYSIS}/${head}gsistat" ]]; then - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}gsistat" - fi - if [[ -s "${COM_ATMOS_ANALYSIS}/${head}atmanl.ensres.nc" ]]; then - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}atmanl.ensres.nc" - fi - if [[ -s "${COM_ATMOS_ANALYSIS}/${head}atma003.ensres.nc" ]]; then - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}atma003.ensres.nc" - fi - if [[ -s "${COM_ATMOS_ANALYSIS}/${head}atma009.ensres.nc" ]]; then - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}atma009.ensres.nc" - fi - if [[ -s "${COM_ATMOS_ANALYSIS}/${head}cnvstat" ]]; then - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}cnvstat" - fi - if [[ -s "${COM_ATMOS_ANALYSIS}/${head}oznstat" ]]; then - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}oznstat" - fi - if [[ ${DO_AERO} = "YES" ]]; then - if [[ -s "${COM_CHEM_ANALYSIS}/${head}aerostat" ]]; then - echo "${COM_CHEM_ANALYSIS/${ROTDIR}\//}/${head}aerostat" - fi - fi - if [[ -s "${COM_SNOW_ANALYSIS}/${head}snowstat.tgz" ]]; then - echo "${COM_SNOW_ANALYSIS/${ROTDIR}\//}/${head}snowstat.tgz" - fi - if [[ -s "${COM_ATMOS_ANALYSIS}/${head}radstat" ]]; then - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}radstat" - fi - for fstep in prep anal fcst verfozn verfrad vminmon; do - if [[ -s "${ROTDIR}/logs/${PDY}${cyc}/gdas${fstep}.log" ]]; then - echo "./logs/${PDY}${cyc}/gdas${fstep}.log" - fi - done - echo "./logs/${PDY}${cyc}/gdas*prod*.log" - if [[ "${WRITE_DOPOST}" == ".false." ]]; then - echo "./logs/${PDY}${cyc}/gdas*upp*.log" - fi - - fh=0 - while [[ ${fh} -le 9 ]]; do - fhr=$(printf %03i "${fh}") - echo "${COM_ATMOS_MASTER/${ROTDIR}\//}/${head}sfluxgrbf${fhr}.grib2" - echo "${COM_ATMOS_MASTER/${ROTDIR}\//}/${head}sfluxgrbf${fhr}.grib2.idx" - echo "${COM_ATMOS_GRIB_0p25/${ROTDIR}\//}/${head}pgrb2.0p25.f${fhr}" - echo "${COM_ATMOS_GRIB_0p25/${ROTDIR}\//}/${head}pgrb2.0p25.f${fhr}.idx" - echo "${COM_ATMOS_GRIB_1p00/${ROTDIR}\//}/${head}pgrb2.1p00.f${fhr}" - echo "${COM_ATMOS_GRIB_1p00/${ROTDIR}\//}/${head}pgrb2.1p00.f${fhr}.idx" - echo "${COM_ATMOS_HISTORY/${ROTDIR}\//}/${head}atm.logf${fhr}.txt" - echo "${COM_ATMOS_HISTORY/${ROTDIR}\//}/${head}atmf${fhr}.nc" - echo "${COM_ATMOS_HISTORY/${ROTDIR}\//}/${head}sfcf${fhr}.nc" - fh=$((fh+3)) - done - flist="001 002 004 005 007 008" - for fhr in ${flist}; do - file="${COM_ATMOS_MASTER/${ROTDIR}\//}/${head}sfluxgrbf${fhr}.grib2" - if [[ -s "${file}" ]]; then - echo "${file}" - echo "${file}.idx" - fi - done - - # GSI Monitor jobs output - - if [[ ${DO_VERFOZN} = "YES" ]]; then - for type in horiz time; do - if [[ ${type} = "horiz" ]]; then - suffix=".gz" - elif [[ ${type} = "time" ]]; then - suffix="" - echo "${COM_ATMOS_OZNMON/${ROTDIR}\//}/${type}/bad_cnt.${PDY}${cyc}" - echo "${COM_ATMOS_OZNMON/${ROTDIR}\//}/${type}/bad_diag.${PDY}${cyc}" - echo "${COM_ATMOS_OZNMON/${ROTDIR}\//}/${type}/bad_pen.${PDY}${cyc}" - fi - subtyplist="gome_metop-b omi_aura ompslp_npp ompsnp_n20 ompsnp_npp ompstc8_n20 ompstc8_npp sbuv2_n19" - for subtype in ${subtyplist}; do - # On occassion, data is not available for some of these satellites. Check for existence. - if [[ -s "${COM_ATMOS_OZNMON/${ROTDIR}\//}/${type}/${subtype}.ges.${PDY}${cyc}.ieee_d${suffix}" ]]; then - echo "${COM_ATMOS_OZNMON/${ROTDIR}\//}/${type}/${subtype}.anl.${PDY}${cyc}.ieee_d${suffix}" - echo "${COM_ATMOS_OZNMON/${ROTDIR}\//}/${type}/${subtype}.anl.ctl" - echo "${COM_ATMOS_OZNMON/${ROTDIR}\//}/${type}/${subtype}.ges.${PDY}${cyc}.ieee_d${suffix}" - echo "${COM_ATMOS_OZNMON/${ROTDIR}\//}/${type}/${subtype}.ges.ctl" - fi - done - echo "${COM_ATMOS_OZNMON/${ROTDIR}\//}/${type}/stdout.${type}.tar.gz" - done - fi - - if [[ ${DO_VERFRAD} = "YES" ]]; then - echo "${COM_ATMOS_RADMON/${ROTDIR}\//}/bad_diag.${PDY}${cyc}" - echo "${COM_ATMOS_RADMON/${ROTDIR}\//}/bad_pen.${PDY}${cyc}" - echo "${COM_ATMOS_RADMON/${ROTDIR}\//}/low_count.${PDY}${cyc}" - echo "${COM_ATMOS_RADMON/${ROTDIR}\//}/radmon_angle.tar.gz" - echo "${COM_ATMOS_RADMON/${ROTDIR}\//}/radmon_bcoef.tar.gz" - echo "${COM_ATMOS_RADMON/${ROTDIR}\//}/radmon_bcor.tar.gz" - echo "${COM_ATMOS_RADMON/${ROTDIR}\//}/radmon_time.tar.gz" - echo "${COM_ATMOS_RADMON/${ROTDIR}\//}/warning.${PDY}${cyc}" - fi - - if [[ ${DO_VMINMON} = "YES" ]]; then - echo "${COM_ATMOS_MINMON/${ROTDIR}\//}/${PDY}${cyc}.costs.txt" - echo "${COM_ATMOS_MINMON/${ROTDIR}\//}/${PDY}${cyc}.cost_terms.txt" - echo "${COM_ATMOS_MINMON/${ROTDIR}\//}/${PDY}${cyc}.gnorms.ieee_d" - echo "${COM_ATMOS_MINMON/${ROTDIR}\//}/${PDY}${cyc}.reduction.ieee_d" - echo "${COM_ATMOS_MINMON/${ROTDIR}\//}/gnorm_data.txt" - fi - - } >> "${DATA}/gdas.txt" - - #.................. - if [[ -s "${COM_ATMOS_ANALYSIS}/${head}cnvstat" ]]; then - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}cnvstat" >> "${DATA}/gdas_restarta.txt" - fi - if [[ -s "${COM_ATMOS_ANALYSIS}/${head}radstat" ]]; then - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}radstat" >> "${DATA}/gdas_restarta.txt" - fi - - { - gsiob_files=("nsstbufr" - "prepbufr" - "prepbufr.acft_profiles") - for file in "${gsiob_files[@]}"; do - [[ -s ${COM_OBS}/${head}${file} ]] && echo "${COM_OBS/${ROTDIR}\//}/${head}${file}" - done - - gsida_files=("abias" - "abias_air" - "abias_int" - "abias_pc" - "dtfanl.nc" - "loginc.txt") - for file in "${gsida_files[@]}"; do - [[ -s ${COM_ATMOS_ANALYSIS}/${head}${file} ]] && echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}${file}" - done - - ufsda_files=("amsua_n19.satbias.nc4" - "amsua_n19.satbias_cov.nc4" - "amsua_n19.tlapse.txt") - for file in "${ufsda_files[@]}"; do - [[ -s ${COM_ATMOS_ANALYSIS}/${head}${file} ]] && echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}${file}" - done - - echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}atmi*nc" - - echo "${COM_ATMOS_RESTART/${ROTDIR}\//}/*0000.sfcanl_data.tile1.nc" - echo "${COM_ATMOS_RESTART/${ROTDIR}\//}/*0000.sfcanl_data.tile2.nc" - echo "${COM_ATMOS_RESTART/${ROTDIR}\//}/*0000.sfcanl_data.tile3.nc" - echo "${COM_ATMOS_RESTART/${ROTDIR}\//}/*0000.sfcanl_data.tile4.nc" - echo "${COM_ATMOS_RESTART/${ROTDIR}\//}/*0000.sfcanl_data.tile5.nc" - echo "${COM_ATMOS_RESTART/${ROTDIR}\//}/*0000.sfcanl_data.tile6.nc" - - [[ -s "${COM_CONF}/${head}letkfoi.yaml" ]] && echo "${COM_CONF/${ROTDIR}\//}/${head}letkfoi.yaml" - - if [[ "${DO_JEDISNOWDA:-}" == "YES" ]]; then - echo "${COM_SNOW_ANALYSIS/${ROTDIR}\//}/*0000.sfc_data.tile1.nc" - echo "${COM_SNOW_ANALYSIS/${ROTDIR}\//}/*0000.sfc_data.tile2.nc" - echo "${COM_SNOW_ANALYSIS/${ROTDIR}\//}/*0000.sfc_data.tile3.nc" - echo "${COM_SNOW_ANALYSIS/${ROTDIR}\//}/*0000.sfc_data.tile4.nc" - echo "${COM_SNOW_ANALYSIS/${ROTDIR}\//}/*0000.sfc_data.tile5.nc" - echo "${COM_SNOW_ANALYSIS/${ROTDIR}\//}/*0000.sfc_data.tile6.nc" - fi - } >> "${DATA}/gdas_restarta.txt" - - #.................. - echo "${COM_ATMOS_RESTART/${ROTDIR}\//}" >> "${DATA}/gdas_restartb.txt" - - #.................. - if [[ ${DO_WAVE} = "YES" ]]; then - - rm -rf "${DATA}/gdaswave.txt" - touch "${DATA}/gdaswave.txt" - rm -rf "${DATA}/gdaswave_restart.txt" - touch "${DATA}/gdaswave_restart.txt" - - head="gdaswave.t${cyc}z." - - #........................... - { - echo "${COM_WAVE_GRID/${ROTDIR}\//}/${head}*" - echo "${COM_WAVE_STATION/${ROTDIR}\//}/${head}*" - } >> "${DATA}/gdaswave.txt" - - echo "${COM_WAVE_RESTART/${ROTDIR}\//}/*" >> "${DATA}/gdaswave_restart.txt" - - fi - - #.................. - if [[ ${DO_OCN} = "YES" ]]; then - - rm -rf "${DATA}/gdasocean.txt" - touch "${DATA}/gdasocean.txt" - rm -rf "${DATA}/gdasocean_restart.txt" - touch "${DATA}/gdasocean_restart.txt" - - head="gdas.t${cyc}z." - - #........................... - { - echo "${COM_OCEAN_HISTORY/${ROTDIR}\//}/${head}*" - echo "${COM_OCEAN_INPUT/${ROTDIR}\//}" - } >> "${DATA}/gdasocean.txt" - - { - echo "${COM_OCEAN_RESTART/${ROTDIR}\//}/*" - echo "${COM_MED_RESTART/${ROTDIR}\//}/*" - } >> "${DATA}/gdasocean_restart.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 - - rm -rf "${DATA}/gdasice.txt" - touch "${DATA}/gdasice.txt" - rm -rf "${DATA}/gdasice_restart.txt" - touch "${DATA}/gdasice_restart.txt" - - head="gdas.ice.t${cyc}z." - - #........................... - { - echo "${COM_ICE_HISTORY/${ROTDIR}\//}/${head}*" - } >> "${DATA}/gdasice.txt" - - echo "${COM_ICE_RESTART/${ROTDIR}\//}/*" >> "${DATA}/gdasice_restart.txt" - - fi - - -#----------------------------------------------------- -fi ##end of gdas -#----------------------------------------------------- - - -#----------------------------------------------------- -if [[ ${type} == "enkfgdas" || ${type} == "enkfgfs" ]]; then -#----------------------------------------------------- - - IAUFHRS_ENKF=${IAUFHRS_ENKF:-6} - lobsdiag_forenkf=${lobsdiag_forenkf:-".false."} - IFS=',' read -ra nfhrs <<< ${IAUFHRS_ENKF} - NMEM_ENS=${NMEM_ENS:-80} - NMEM_EARCGRP=${NMEM_EARCGRP:-10} ##number of ens memebers included in each tarball - NTARS=$((NMEM_ENS/NMEM_EARCGRP)) - [[ ${NTARS} -eq 0 ]] && NTARS=1 - [[ $((NTARS*NMEM_EARCGRP)) -lt ${NMEM_ENS} ]] && NTARS=$((NTARS+1)) - ##NTARS2=$((NTARS/2)) # number of earc groups to include analysis/increments - NTARS2=${NTARS} - - head="${RUN}.t${cyc}z." - - #.................. - rm -f "${DATA}/${RUN}.txt" - touch "${DATA}/${RUN}.txt" - - { - gsida_files=("enkfstat" - "gsistat.ensmean" - "cnvstat.ensmean" - "oznstat.ensmean" - "radstat.ensmean") - for file in "${gsida_files[@]}"; do - [[ -s ${COM_ATMOS_ANALYSIS_ENSSTAT}/${head}${file} ]] && echo "${COM_ATMOS_ANALYSIS_ENSSTAT/${ROTDIR}\//}/${head}${file}" - done - - ufsda_files=("atmens.yaml" - "atmensstat") - for file in "${ufsda_files[@]}"; do - [[ -s ${COM_ATMOS_ANALYSIS_ENSSTAT}/${head}${file} ]] && echo "${COM_ATMOS_ANALYSIS_ENSSTAT/${ROTDIR}\//}/${head}${file}" - done - - for FHR in "${nfhrs[@]}"; do # loop over analysis times in window - if [[ ${FHR} -eq 6 ]]; then - if [[ -s "${COM_ATMOS_ANALYSIS_ENSSTAT}/${head}atmanl.ensmean.nc" ]]; then - echo "${COM_ATMOS_ANALYSIS_ENSSTAT/${ROTDIR}\//}/${head}atmanl.ensmean.nc" - fi - if [[ -s "${COM_ATMOS_ANALYSIS_ENSSTAT}/${head}atminc.ensmean.nc" ]]; then - echo "${COM_ATMOS_ANALYSIS_ENSSTAT/${ROTDIR}\//}/${head}atminc.ensmean.nc" - fi - else - if [[ -s "${COM_ATMOS_ANALYSIS_ENSSTAT}/${head}atma00${FHR}.ensmean.nc" ]]; then - echo "${COM_ATMOS_ANALYSIS_ENSSTAT/${ROTDIR}\//}/${head}atma00${FHR}.ensmean.nc" - fi - if [[ -s "${COM_ATMOS_ANALYSIS_ENSSTAT}/${head}atmi00${FHR}.ensmean.nc" ]]; then - echo "${COM_ATMOS_ANALYSIS_ENSSTAT/${ROTDIR}\//}/${head}atmi00${FHR}.ensmean.nc" - fi - fi - done # loop over FHR - for fstep in fcst epos ; do - echo "logs/${PDY}${cyc}/${RUN}${fstep}*.log" - done - - # eobs, ecen, esfc, and eupd are not run on the first cycle - for fstep in eobs ecen esfc eupd ; do - for log in "${ROTDIR}/logs/${PDY}${cyc}/${RUN}${fstep}"*".log"; do - if [[ -s "${log}" ]]; then - echo "logs/${PDY}${cyc}/${RUN}${fstep}*.log" - fi - done - done - - # eomg* are optional jobs - for log in "${ROTDIR}/logs/${PDY}${cyc}/${RUN}eomg"*".log"; do - if [[ -s "${log}" ]]; then - echo "logs/${PDY}${cyc}/${RUN}eomg*.log" - fi - break - done - - # Ensemble spread file only available with netcdf output - fh=3 - while [ $fh -le 9 ]; do - fhr=$(printf %03i $fh) - echo "${COM_ATMOS_HISTORY_ENSSTAT/${ROTDIR}\//}/${head}atmf${fhr}.ensmean.nc" - echo "${COM_ATMOS_HISTORY_ENSSTAT/${ROTDIR}\//}/${head}sfcf${fhr}.ensmean.nc" - if [[ -s "${COM_ATMOS_HISTORY_ENSSTAT}/${head}atmf${fhr}.ensspread.nc" ]]; then - echo "${COM_ATMOS_HISTORY_ENSSTAT/${ROTDIR}\//}/${head}atmf${fhr}.ensspread.nc" - fi - fh=$((fh+3)) - done - } >> "${DATA}/${RUN}.txt" - - #........................... - n=1 - while (( n <= NTARS )); do - #........................... - - rm -f "${DATA}/${RUN}_grp${n}.txt" - rm -f "${DATA}/${RUN}_restarta_grp${n}.txt" - rm -f "${DATA}/${RUN}_restartb_grp${n}.txt" - touch "${DATA}/${RUN}_grp${n}.txt" - touch "${DATA}/${RUN}_restarta_grp${n}.txt" - touch "${DATA}/${RUN}_restartb_grp${n}.txt" - - m=1 - while (( m <= NMEM_EARCGRP && (n-1)*NMEM_EARCGRP+m <= NMEM_ENS )); do - nm=$(((n-1)*NMEM_EARCGRP+m)) - mem=$(printf %03i ${nm}) - head="${RUN}.t${cyc}z." - - MEMDIR="mem${mem}" YMD=${PDY} HH=${cyc} declare_from_tmpl \ - COM_ATMOS_ANALYSIS_MEM:COM_ATMOS_ANALYSIS_TMPL \ - COM_ATMOS_RESTART_MEM:COM_ATMOS_RESTART_TMPL \ - COM_ATMOS_HISTORY_MEM:COM_ATMOS_HISTORY_TMPL - - #--- - for FHR in "${nfhrs[@]}"; do # loop over analysis times in window - if [ "${FHR}" -eq 6 ]; then - { - if (( n <= NTARS2 )); then - if [[ -s "${COM_ATMOS_ANALYSIS_MEM}/${head}atmanl.nc" ]] ; then - echo "${COM_ATMOS_ANALYSIS_MEM/${ROTDIR}\//}/${head}atmanl.nc" - fi - if [[ -s "${COM_ATMOS_ANALYSIS_MEM}/${head}ratminc.nc" ]] ; then - echo "${COM_ATMOS_ANALYSIS_MEM/${ROTDIR}\//}/${head}ratminc.nc" - fi - fi - } >> "${DATA}/${RUN}_grp${n}.txt" - - if [[ -s "${COM_ATMOS_ANALYSIS_MEM}/${head}ratminc.nc" ]] ; then - echo "${COM_ATMOS_ANALYSIS_MEM/${ROTDIR}\//}/${head}ratminc.nc" \ - >> "${DATA}/${RUN}_restarta_grp${n}.txt" - fi - - else - { - if (( n <= NTARS2 )); then - if [[ -s "${COM_ATMOS_ANALYSIS_MEM}/${head}atma00${FHR}.nc" ]] ; then - echo "${COM_ATMOS_ANALYSIS_MEM/${ROTDIR}\//}/${head}atma00${FHR}.nc" - fi - if [[ -s "${COM_ATMOS_ANALYSIS_MEM}/${head}ratmi00${FHR}.nc" ]] ; then - echo "${COM_ATMOS_ANALYSIS_MEM/${ROTDIR}\//}/${head}ratmi00${FHR}.nc" - fi - fi - } >> "${DATA}/${RUN}_grp${n}.txt" - if [[ -s "${COM_ATMOS_ANALYSIS_MEM}/${head}ratmi00${FHR}.nc" ]] ; then - echo "${COM_ATMOS_ANALYSIS_MEM/${ROTDIR}\//}/${head}ratmi00${FHR}.nc" \ - >> "${DATA}/${RUN}_restarta_grp${n}.txt" - fi - fi - { - echo "${COM_ATMOS_HISTORY_MEM/${ROTDIR}\//}/${head}atmf00${FHR}.nc" - if (( FHR == 6 )); then - echo "${COM_ATMOS_HISTORY_MEM/${ROTDIR}\//}/${head}sfcf00${FHR}.nc" - fi - } >> "${DATA}/${RUN}_grp${n}.txt" - done # loop over FHR - - if [[ ${lobsdiag_forenkf} == ".false." ]] ; then - { - echo "${COM_ATMOS_RESTART_MEM/${ROTDIR}\//}/${head}gsistat" - if [[ -s "${COM_ATMOS_RESTART_MEM}/${head}cnvstat" ]] ; then - echo "${COM_ATMOS_RESTART_MEM/${ROTDIR}\//}/${head}cnvstat" - fi - } >> "${DATA}/${RUN}_grp${n}.txt" - - { - if [[ -s "${COM_ATMOS_RESTART_MEM}/${head}radstat" ]]; then - echo "${COM_ATMOS_RESTART_MEM/${ROTDIR}\//}/${head}radstat" - fi - if [[ -s "${COM_ATMOS_RESTART_MEM}/${head}cnvstat" ]]; then - echo "${COM_ATMOS_RESTART_MEM/${ROTDIR}\//}/${head}cnvstat" - fi - echo "${COM_ATMOS_RESTART_MEM/${ROTDIR}\//}/${head}abias" - echo "${COM_ATMOS_RESTART_MEM/${ROTDIR}\//}/${head}abias_air" - echo "${COM_ATMOS_RESTART_MEM/${ROTDIR}\//}/${head}abias_int" - echo "${COM_ATMOS_RESTART_MEM/${ROTDIR}\//}/${head}abias_pc" - } >> "${DATA}/${RUN}_restarta_grp${n}.txt" - fi - #--- - { - echo "${COM_ATMOS_RESTART_MEM/${ROTDIR}\//}/*0000.sfcanl_data.tile1.nc" - echo "${COM_ATMOS_RESTART_MEM/${ROTDIR}\//}/*0000.sfcanl_data.tile2.nc" - echo "${COM_ATMOS_RESTART_MEM/${ROTDIR}\//}/*0000.sfcanl_data.tile3.nc" - echo "${COM_ATMOS_RESTART_MEM/${ROTDIR}\//}/*0000.sfcanl_data.tile4.nc" - echo "${COM_ATMOS_RESTART_MEM/${ROTDIR}\//}/*0000.sfcanl_data.tile5.nc" - echo "${COM_ATMOS_RESTART_MEM/${ROTDIR}\//}/*0000.sfcanl_data.tile6.nc" - } >> "${DATA}/${RUN}_restarta_grp${n}.txt" - #--- - echo "${COM_ATMOS_RESTART_MEM/${ROTDIR}\//}" >> "${DATA}/${RUN}_restartb_grp${n}.txt" - - m=$((m+1)) - done - - - #........................... - n=$((n+1)) - done - #........................... - - -#----------------------------------------------------- -fi ##end of enkfgdas or enkfgfs -#----------------------------------------------------- - -exit 0 diff --git a/ush/python/pygfs/task/analysis.py b/ush/python/pygfs/task/analysis.py index 5464c25370..b668ac3980 100644 --- a/ush/python/pygfs/task/analysis.py +++ b/ush/python/pygfs/task/analysis.py @@ -335,6 +335,7 @@ def tgz_diags(statfile: str, diagdir: str) -> None: # get list of diag files to put in tarball diags = glob.glob(os.path.join(diagdir, 'diags', 'diag*nc')) + diags.extend(glob.glob(os.path.join(diagdir, 'diags', 'diag*nc4'))) logger.info(f"Compressing {len(diags)} diag files to {statfile}") diff --git a/ush/python/pygfs/task/archive.py b/ush/python/pygfs/task/archive.py new file mode 100644 index 0000000000..d66b02d7bc --- /dev/null +++ b/ush/python/pygfs/task/archive.py @@ -0,0 +1,381 @@ +#!/usr/bin/env python3 + +import glob +import os +import shutil +import tarfile +from logging import getLogger +from typing import Any, Dict, List + +from wxflow import (AttrDict, FileHandler, Hsi, Htar, Task, cast_strdict_as_dtypedict, + chgrp, get_gid, logit, mkdir_p, parse_j2yaml, rm_p, strftime, + to_YMD, to_YMDH, Template, TemplateConstants) + +logger = getLogger(__name__.split('.')[-1]) + + +class Archive(Task): + """Task to archive ROTDIR data to HPSS (or locally) + """ + + @logit(logger, name="Archive") + def __init__(self, config: Dict[str, Any]) -> None: + """Constructor for the Archive task + The constructor is responsible for collecting necessary yamls based on + the runtime options and RUN. + + Parameters + ---------- + config : Dict[str, Any] + Incoming configuration for the task from the environment + + Returns + ------- + None + """ + super().__init__(config) + + rotdir = self.config.ROTDIR + os.sep + + # Find all absolute paths in the environment and get their relative paths from ${ROTDIR} + path_dict = self._gen_relative_paths(rotdir) + + self.task_config = AttrDict(**self.config, **self.runtime_config, **path_dict) + + @logit(logger) + def configure(self, arch_dict: Dict[str, Any]) -> (Dict[str, Any], List[Dict[str, Any]]): + """Determine which tarballs will need to be created. + + Parameters + ---------- + arch_dict : Dict[str, Any] + Task specific keys, e.g. runtime options (DO_AERO, DO_ICE, etc) + + Return + ------ + arcdir_set : Dict[str, Any] + Set of FileHandler instructions to copy files to the ARCDIR + atardir_sets : List[Dict[str, Any]] + List of tarballs and instructions for creating them via tar or htar + """ + + archive_parm = os.path.join(arch_dict.PARMgfs, "archive") + + # Collect the dataset to archive locally + arcdir_filename = os.path.join(archive_parm, "arcdir.yaml.j2") + + # Add the glob.glob function for capturing log filenames + # TODO remove this kludge once log filenames are explicit + arch_dict['glob'] = glob.glob + + # Add the os.path.exists function to the dict for yaml parsing + arch_dict['path_exists'] = os.path.exists + + # Parse the input jinja yaml template + arcdir_set = parse_j2yaml(arcdir_filename, arch_dict) + + # Collect datasets that need to be archived + # Each dataset represents one tarball + + if arch_dict.HPSSARCH: + self.tar_cmd = "htar" + self.hsi = Hsi() + self.htar = Htar() + self.cvf = self.htar.cvf + self.rm_cmd = self.hsi.rm + self.chgrp_cmd = self.hsi.chgrp + self.chmod_cmd = self.hsi.chmod + elif arch_dict.LOCALARCH: + self.tar_cmd = "tar" + self.cvf = Archive._create_tarball + self.chgrp_cmd = chgrp + self.chmod_cmd = os.chmod + self.rm_cmd = rm_p + else: # Only perform local archiving. Do not create tarballs. + self.tar_cmd = "" + return arcdir_set, [] + + if not os.path.isdir(arch_dict.ROTDIR): + raise FileNotFoundError(f"FATAL ERROR: The ROTDIR ({arch_dict.ROTDIR}) does not exist!") + + if arch_dict.RUN == "gdas" or arch_dict.RUN == "gfs": + + # Copy the cyclone track files and rename the experiments + Archive._rename_cyclone_expt(arch_dict) + + if arch_dict.RUN == "gefs": + raise NotImplementedError("FATAL ERROR: Archiving is not yet set up for GEFS runs") + + master_yaml = "master_" + arch_dict.RUN + ".yaml.j2" + + parsed_sets = parse_j2yaml(os.path.join(archive_parm, master_yaml), arch_dict) + + atardir_sets = [] + + for dataset in parsed_sets.datasets.values(): + + dataset["fileset"] = Archive._create_fileset(dataset) + dataset["has_rstprod"] = Archive._has_rstprod(dataset.fileset) + + atardir_sets.append(dataset) + + return arcdir_set, atardir_sets + + @logit(logger) + def execute_store_products(self, arcdir_set: Dict[str, Any]) -> None: + """Perform local archiving of data products to ARCDIR. + + Parameters + ---------- + arcdir_set : Dict[str, Any] + FileHandler instructions to populate ARCDIR with + + Return + ------ + None + """ + + # Copy files to the local ARCDIR + for key in arcdir_set.keys(): + FileHandler(arcdir_set[key]).sync() + + @logit(logger) + def execute_backup_dataset(self, atardir_set: Dict[str, Any]) -> None: + """Create a backup tarball from a yaml dict. + + Parameters + ---------- + atardir_set: Dict[str, Any] + Dict defining set of files to backup and the target tarball. + + Return + ------ + None + """ + + # Generate tarball + if len(atardir_set.fileset) == 0: + logger.warning(f"WARNING: skipping would-be empty archive {atardir_set.target}.") + return + + if atardir_set.has_rstprod: + + try: + self.cvf(atardir_set.target, atardir_set.fileset) + # Regardless of exception type, attempt to remove the target + except Exception: + self.rm_cmd(atardir_set.target) + raise RuntimeError(f"FATAL ERROR: Failed to create restricted archive {atardir_set.target}, deleting!") + + self._protect_rstprod(atardir_set) + + else: + self.cvf(atardir_set.target, atardir_set.fileset) + + @staticmethod + @logit(logger) + def _create_fileset(atardir_set: Dict[str, Any]) -> List: + """ + Collect the list of all available files from the parsed yaml dict. + Globs are expanded and if required files are missing, an error is + raised. + + TODO: expand all globs in the jinja yaml files instead of expanding + them here and issue errors here if globbing patterns (*, ?, []) + are found. + + Parameters + ---------- + atardir_set: Dict + Contains full paths for required and optional files to be archived. + """ + + fileset = [] + if "required" in atardir_set: + if atardir_set.required is not None: + for item in atardir_set.required: + glob_set = glob.glob(item) + if len(glob_set) == 0: + raise FileNotFoundError(f"FATAL ERROR: Required file, directory, or glob {item} not found!") + for entry in glob_set: + fileset.append(entry) + + if "optional" in atardir_set: + if atardir_set.optional is not None: + for item in atardir_set.optional: + glob_set = glob.glob(item) + if len(glob_set) == 0: + logger.warning(f"WARNING: optional file/glob {item} not found!") + else: + for entry in glob_set: + fileset.append(entry) + + return fileset + + @staticmethod + @logit(logger) + def _has_rstprod(fileset: List) -> bool: + """ + Checks if any files in the input fileset belongs to rstprod. + + Parameters + ---------- + fileset : List + List of filenames to check. + """ + + try: + rstprod_gid = get_gid("rstprod") + except KeyError: + # rstprod does not exist on this machine + return False + + # Expand globs and check each file for group ownership + for file_or_glob in fileset: + glob_set = glob.glob(file_or_glob) + for filename in glob_set: + if os.stat(filename).st_gid == rstprod_gid: + return True + + return False + + @logit(logger) + def _protect_rstprod(self, atardir_set: Dict[str, any]) -> None: + """ + Changes the group of the target tarball to rstprod and the permissions to + 640. If this fails for any reason, attempt to delete the file before exiting. + + """ + + try: + self.chgrp_cmd("rstprod", atardir_set.target) + if self.tar_cmd == "htar": + self.chmod_cmd("640", atardir_set.target) + else: + self.chmod_cmd(atardir_set.target, 0o640) + # Regardless of exception type, attempt to remove the target + except Exception: + try: + self.rm_cmd(atardir_set.target) + finally: + raise RuntimeError(f"FATAL ERROR: Failed to protect {atardir_set.target}!\n" + f"Please verify that it has been deleted!!") + + @staticmethod + @logit(logger) + def _create_tarball(target: str, fileset: List) -> None: + """Method to create a local tarball. + + Parameters + ---------- + target : str + Tarball to create + + file_list : List + List of files to add to an archive + """ + + # TODO create a set of tar helper functions in wxflow + # Attempt to create the parent directory if it does not exist + mkdir_p(os.path.dirname(os.path.realpath(target))) + + # Create the archive + with tarfile.open(target, "w") as tarball: + for filename in fileset: + tarball.add(filename) + + @logit(logger) + def _gen_relative_paths(self, root_path: str) -> Dict: + """Generate a dict of paths in self.config relative to root_path + + Parameters + ---------- + root_path : str + Path to base all relative paths off of + + Return + ------ + rel_path_dict : Dict + Dictionary of paths relative to root_path. Members will be named + based on the dict names in self.config. For COM paths, the names will + follow COM_ --> _dir. For all other directories, the + names will follow --> _dir. + """ + + rel_path_dict = {} + for key, value in self.config.items(): + if isinstance(value, str): + if root_path in value: + rel_path = value.replace(root_path, "") + rel_key = (key[4:] if key.startswith("COM_") else key).lower() + "_dir" + rel_path_dict[rel_key] = rel_path + + return rel_path_dict + + @staticmethod + @logit(logger) + def _rename_cyclone_expt(arch_dict) -> None: + + # Rename the experiment in the tracker files from "AVNO" to the + # first 4 letters of PSLOT. + pslot4 = arch_dict.PSLOT.upper() + if len(arch_dict.PSLOT) > 4: + pslot4 = arch_dict.PSLOT[0:4].upper() + + track_dir = arch_dict.COM_ATMOS_TRACK + run = arch_dict.RUN + cycle_HH = strftime(arch_dict.current_cycle, "%H") + + if run == "gfs": + in_track_file = (track_dir + "/avno.t" + + cycle_HH + "z.cycle.trackatcfunix") + in_track_p_file = (track_dir + "/avnop.t" + + cycle_HH + "z.cycle.trackatcfunixp") + elif run == "gdas": + in_track_file = (track_dir + "/gdas.t" + + cycle_HH + "z.cycle.trackatcfunix") + in_track_p_file = (track_dir + "/gdasp.t" + + cycle_HH + "z.cycle.trackatcfunixp") + + if not os.path.isfile(in_track_file): + # Do not attempt to archive the outputs + return + + out_track_file = track_dir + "/atcfunix." + run + "." + to_YMDH(arch_dict.current_cycle) + out_track_p_file = track_dir + "/atcfunixp." + run + "." + to_YMDH(arch_dict.current_cycle) + + def replace_string_from_to_file(filename_in, filename_out, search_str, replace_str): + + """Write a new file from the contents of an input file while searching + and replacing ASCII strings. To prevent partial file creation, a + temporary file is created and moved to the final location only + after the search/replace is finished. + + Parameters + ---------- + filename_in : str + Input filename + + filename_out : str + Output filename + + search_str : str + ASCII string to search for + + replace_str : str + ASCII string to replace the search_str with + """ + with open(filename_in) as old_file: + lines = old_file.readlines() + + out_lines = [line.replace(search, replace) for line in lines] + + with open("/tmp/track_file", "w") as new_file: + new_file.writelines(out_lines) + + shutil.move("tmp/track_file", filename_out) + + replace_string_from_to_file(in_track_file, out_track_file, "AVNO", pslot4) + replace_string_from_to_file(in_track_p_file, out_track_p_file, "AVNO", pslot4) + + return diff --git a/workflow/applications/applications.py b/workflow/applications/applications.py index 3a8d23f744..adfab16496 100644 --- a/workflow/applications/applications.py +++ b/workflow/applications/applications.py @@ -77,6 +77,14 @@ def __init__(self, conf: Configuration) -> None: elif wave_cdump in ['gfs', 'gdas']: self.wave_cdumps = [wave_cdump] + self.aero_anl_cdumps = None + if self.do_aero: + aero_anl_cdump = _base.get('AERO_ANL_CDUMP', 'BOTH').lower() + if aero_anl_cdump in ['both']: + self.aero_anl_cdumps = ['gfs', 'gdas'] + elif aero_anl_cdump in ['gfs', 'gdas']: + self.aero_anl_cdumps = [aero_anl_cdump] + def _init_finalize(self, conf: Configuration): print("Finalizing initialize") diff --git a/workflow/applications/gfs_cycled.py b/workflow/applications/gfs_cycled.py index 4d785bc4da..ad13876528 100644 --- a/workflow/applications/gfs_cycled.py +++ b/workflow/applications/gfs_cycled.py @@ -150,9 +150,6 @@ def get_task_names(self): gdas_gfs_common_tasks_before_fcst += ['sfcanl', 'analcalc'] - if self.do_aero: - gdas_gfs_common_tasks_before_fcst += ['aeroanlinit', 'aeroanlrun', 'aeroanlfinal'] - if self.do_jedisnowda: gdas_gfs_common_tasks_before_fcst += ['prepsnowobs', 'snowanl'] @@ -179,6 +176,9 @@ def get_task_names(self): if self.do_wave and 'gdas' in self.wave_cdumps: gdas_tasks += wave_prep_tasks + if self.do_aero and 'gdas' in self.aero_anl_cdumps: + gdas_tasks += ['aeroanlinit', 'aeroanlrun', 'aeroanlfinal'] + gdas_tasks += ['atmanlupp', 'atmanlprod', 'fcst'] if self.do_upp: @@ -213,6 +213,9 @@ def get_task_names(self): if self.do_wave and 'gfs' in self.wave_cdumps: gfs_tasks += wave_prep_tasks + if self.do_aero and 'gfs' in self.aero_anl_cdumps: + gfs_tasks += ['aeroanlinit', 'aeroanlrun', 'aeroanlfinal'] + gfs_tasks += ['atmanlupp', 'atmanlprod', 'fcst'] if self.do_ocean: diff --git a/workflow/applications/gfs_forecast_only.py b/workflow/applications/gfs_forecast_only.py index 89881af8c9..e219032551 100644 --- a/workflow/applications/gfs_forecast_only.py +++ b/workflow/applications/gfs_forecast_only.py @@ -87,7 +87,9 @@ def get_task_names(self): tasks = ['stage_ic'] if self.do_aero: - tasks += ['aerosol_init'] + aero_fcst_cdump = _base.get('AERO_FCST_CDUMP', 'BOTH').lower() + if self._base['CDUMP'] in aero_fcst_cdump or aero_fcst_cdump == "both": + tasks += ['aerosol_init'] if self.do_wave: tasks += ['waveinit'] diff --git a/workflow/rocoto/gfs_tasks.py b/workflow/rocoto/gfs_tasks.py index 6125a33dec..d61060a596 100644 --- a/workflow/rocoto/gfs_tasks.py +++ b/workflow/rocoto/gfs_tasks.py @@ -829,7 +829,7 @@ def _fcst_forecast_only(self): dep_dict = {'type': 'task', 'name': f'{self.cdump}{wave_job}'} dependencies.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_aero: + if self.app_config.do_aero and self.cdump in self.app_config.aero_fcst_cdumps: # Calculate offset based on CDUMP = gfs | gdas interval = None if self.cdump in ['gfs']: @@ -873,7 +873,7 @@ def _fcst_cycled(self): dep_dict = {'type': 'task', 'name': f'{self.cdump}ocnanalpost'} dependencies.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_aero: + if self.app_config.do_aero and self.cdump in self.app_config.aero_anl_cdumps: dep_dict = {'type': 'task', 'name': f'{self.cdump}aeroanlfinal'} dependencies.append(rocoto.add_dependency(dep_dict)) From 7d2c539f45194cd4e5b21bfd4b83a9480189cd0f Mon Sep 17 00:00:00 2001 From: Guillaume Vernieres Date: Tue, 21 May 2024 23:50:50 -0400 Subject: [PATCH 03/45] Sea-ice analysis insertion (#2584) Allows cycling and restarting CICE with the sea-ice analysis if the marine DA is switched on. Resolves #2568 Resolves NOAA-EMC/GDASApp#1103 --- jobs/JGDAS_GLOBAL_OCEAN_ANALYSIS_POST | 3 ++- jobs/JGLOBAL_FORECAST | 2 +- parm/config/gfs/config.com | 1 + sorc/gdas.cd | 2 +- ush/forecast_postdet.sh | 15 +++++++++------ workflow/setup_expt.py | 8 ++++++-- 6 files changed, 20 insertions(+), 11 deletions(-) diff --git a/jobs/JGDAS_GLOBAL_OCEAN_ANALYSIS_POST b/jobs/JGDAS_GLOBAL_OCEAN_ANALYSIS_POST index ef2f07cfe5..c87dc6b34f 100755 --- a/jobs/JGDAS_GLOBAL_OCEAN_ANALYSIS_POST +++ b/jobs/JGDAS_GLOBAL_OCEAN_ANALYSIS_POST @@ -13,9 +13,10 @@ export CDATE=${CDATE:-${PDY}${cyc}} export GDUMP=${GDUMP:-"gdas"} # Generate COM variables from templates -YMD=${PDY} HH=${cyc} declare_from_tmpl -rx COM_OCEAN_ANALYSIS COM_ICE_RESTART +YMD=${PDY} HH=${cyc} declare_from_tmpl -rx COM_OCEAN_ANALYSIS COM_ICE_ANALYSIS COM_ICE_RESTART mkdir -p "${COM_OCEAN_ANALYSIS}" +mkdir -p "${COM_ICE_ANALYSIS}" mkdir -p "${COM_ICE_RESTART}" ############################################## diff --git a/jobs/JGLOBAL_FORECAST b/jobs/JGLOBAL_FORECAST index 8d91be8a57..9ae247cdca 100755 --- a/jobs/JGLOBAL_FORECAST +++ b/jobs/JGLOBAL_FORECAST @@ -36,7 +36,7 @@ declare -rx gcyc="${GDATE:8:2}" # Construct COM variables from templates (see config.com) YMD="${PDY}" HH="${cyc}" declare_from_tmpl -rx COM_ATMOS_RESTART COM_ATMOS_INPUT COM_ATMOS_ANALYSIS \ - COM_ATMOS_HISTORY COM_ATMOS_MASTER COM_TOP COM_CONF + COM_ICE_ANALYSIS COM_ATMOS_HISTORY COM_ATMOS_MASTER COM_TOP COM_CONF RUN="${rCDUMP}" YMD="${gPDY}" HH="${gcyc}" declare_from_tmpl -rx \ COM_ATMOS_RESTART_PREV:COM_ATMOS_RESTART_TMPL diff --git a/parm/config/gfs/config.com b/parm/config/gfs/config.com index 5d63a499ed..004ca1affb 100644 --- a/parm/config/gfs/config.com +++ b/parm/config/gfs/config.com @@ -84,6 +84,7 @@ declare -rx COM_OCEAN_NETCDF_TMPL=${COM_BASE}'/products/ocean/netcdf' declare -rx COM_OCEAN_GRIB_TMPL=${COM_BASE}'/products/ocean/grib2' declare -rx COM_OCEAN_GRIB_GRID_TMPL=${COM_OCEAN_GRIB_TMPL}'/${GRID}' +declare -rx COM_ICE_ANALYSIS_TMPL=${COM_BASE}'/analysis/ice' declare -rx COM_ICE_INPUT_TMPL=${COM_BASE}'/model_data/ice/input' declare -rx COM_ICE_HISTORY_TMPL=${COM_BASE}'/model_data/ice/history' declare -rx COM_ICE_RESTART_TMPL=${COM_BASE}'/model_data/ice/restart' diff --git a/sorc/gdas.cd b/sorc/gdas.cd index 2b2d417a96..249e242e33 160000 --- a/sorc/gdas.cd +++ b/sorc/gdas.cd @@ -1 +1 @@ -Subproject commit 2b2d417a96528527d7d3e7eedaccf150dc075d92 +Subproject commit 249e242e33a33feeb1c81bedd51198309f669de0 diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh index 0257d17e23..f5a2bec07c 100755 --- a/ush/forecast_postdet.sh +++ b/ush/forecast_postdet.sh @@ -253,15 +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! - # 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 + # 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 + fi echo "SUB ${FUNCNAME[0]}: Output data for FV3 copied" } @@ -499,7 +499,7 @@ MOM6_out() { ${NCP} "${DATArestart}/MOM6_RESTART/${restart_file}" \ "${COM_OCEAN_RESTART}/${restart_file}" done - fi + fi fi # Copy restarts for the next cycle for RUN=gdas|enkfgdas|enkfgfs @@ -527,6 +527,9 @@ CICE_postdet() { else # "${RERUN}" == "NO" 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" + if [[ "${DO_JEDIOCNVAR:-NO}" == "YES" ]]; then + cice_restart_file="${COM_ICE_ANALYSIS}/${restart_date:0:8}.${restart_date:8:2}0000.cice_model_anl.res.nc" + fi fi # Copy CICE ICs @@ -592,7 +595,7 @@ CICE_out() { 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 fi # Copy restarts for next cycle for RUN=gdas|enkfgdas|enkfgfs @@ -728,7 +731,7 @@ CMEPS_out() { else echo "Mediator restart '${DATArestart}/CMEPS_RESTART/${source_file}' not found." fi - fi + fi # Copy restarts for the next cycle to COM for RUN=gdas|enkfgdas|enkfgfs if [[ "${RUN}" =~ "gdas" || "${RUN}" == "enkfgfs" ]]; then diff --git a/workflow/setup_expt.py b/workflow/setup_expt.py index 9602b66b60..97d25dc15a 100755 --- a/workflow/setup_expt.py +++ b/workflow/setup_expt.py @@ -96,6 +96,7 @@ def fill_ROTDIR_cycled(host, inputs): dst_ocn_rst_dir = os.path.join('model_data', 'ocean', 'restart') dst_ocn_anl_dir = os.path.join('analysis', 'ocean') dst_ice_rst_dir = os.path.join('model_data', 'ice', 'restart') + dst_ice_anl_dir = os.path.join('analysis', 'ice') dst_atm_anl_dir = os.path.join('analysis', 'atmos') if flat_structure: @@ -111,6 +112,7 @@ def fill_ROTDIR_cycled(host, inputs): src_ocn_rst_dir = os.path.join('ocean', 'RESTART') src_ocn_anl_dir = 'ocean' src_ice_rst_dir = os.path.join('ice', 'RESTART') + src_ice_anl_dir = dst_ice_anl_dir src_atm_anl_dir = 'atmos' else: src_atm_dir = dst_atm_dir @@ -118,6 +120,7 @@ def fill_ROTDIR_cycled(host, inputs): src_ocn_rst_dir = dst_ocn_rst_dir src_ocn_anl_dir = dst_ocn_anl_dir src_ice_rst_dir = dst_ice_rst_dir + src_ice_anl_dir = dst_ice_anl_dir src_atm_anl_dir = dst_atm_anl_dir def link_files_from_src_to_dst(src_dir, dst_dir): @@ -203,8 +206,9 @@ def link_files_from_src_to_dst(src_dir, dst_dir): # Link ice files if do_ice: - dst_dir = os.path.join(rotdir, previous_cycle_dir, dst_ice_rst_dir) - src_dir = os.path.join(inputs.icsdir, previous_cycle_dir, src_ice_rst_dir) + # First 1/2 cycle needs a CICE6 analysis restart + src_dir = os.path.join(inputs.icsdir, current_cycle_dir, src_ice_anl_dir) + dst_dir = os.path.join(rotdir, current_cycle_dir, src_ice_anl_dir) makedirs_if_missing(dst_dir) link_files_from_src_to_dst(src_dir, dst_dir) From b6ca771a0c584cbfcbbf9be739765d5f3815df97 Mon Sep 17 00:00:00 2001 From: TerrenceMcGuinness-NOAA Date: Fri, 24 May 2024 10:52:45 -0400 Subject: [PATCH 04/45] Update STMP and PTMP settings in host file for Orion and Hercules (#2614) - Updating STMP and PTMP settings in host file for Orion and Hercules because they are cross mounted. - Also took the opportunity to finally update **SLURM_ACCOUNT** to **HPC_ACCOUT** in CI over rides. - Added a refactor of the `rocotostat.py` tool that is more pythonic and as a execute retry feature because the `rocotostat` utility on Orion has been failing sometimes. --- ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml | 2 +- ci/cases/yamls/gefs_ci_defaults.yaml | 2 +- ci/cases/yamls/gfs_defaults_ci.yaml | 2 +- ci/cases/yamls/gfs_extended_ci.yaml | 2 +- ci/cases/yamls/soca_gfs_defaults_ci.yaml | 2 +- ci/cases/yamls/ufs_hybatmDA_defaults.ci.yaml | 2 +- ci/platforms/config.hera | 4 +- ci/platforms/config.hercules | 4 +- ci/platforms/config.orion | 4 +- ci/platforms/config.wcoss2 | 4 +- ci/scripts/run-check_ci.sh | 2 +- ci/scripts/utils/rocotostat.py | 156 ++++++++++++++---- workflow/hosts/hercules.yaml | 4 +- workflow/hosts/orion.yaml | 4 +- 14 files changed, 140 insertions(+), 54 deletions(-) diff --git a/ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml b/ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml index 417525742e..624af591fc 100644 --- a/ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml +++ b/ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml @@ -3,4 +3,4 @@ defaults: base: DOIAU: "NO" DO_JEDISNOWDA: "YES" - ACCOUNT: {{ 'SLURM_ACCOUNT' | getenv }} + ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} diff --git a/ci/cases/yamls/gefs_ci_defaults.yaml b/ci/cases/yamls/gefs_ci_defaults.yaml index dfb1626cdd..ceb36d4acb 100644 --- a/ci/cases/yamls/gefs_ci_defaults.yaml +++ b/ci/cases/yamls/gefs_ci_defaults.yaml @@ -1,4 +1,4 @@ defaults: !INC {{ HOMEgfs }}/parm/config/gefs/yaml/defaults.yaml base: - ACCOUNT: {{ 'SLURM_ACCOUNT' | getenv }} + HPC_ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} diff --git a/ci/cases/yamls/gfs_defaults_ci.yaml b/ci/cases/yamls/gfs_defaults_ci.yaml index b66be2a366..d09f78b8b8 100644 --- a/ci/cases/yamls/gfs_defaults_ci.yaml +++ b/ci/cases/yamls/gfs_defaults_ci.yaml @@ -1,4 +1,4 @@ defaults: !INC {{ HOMEgfs }}/parm/config/gfs/yaml/defaults.yaml base: - ACCOUNT: {{ 'SLURM_ACCOUNT' | getenv }} + ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} diff --git a/ci/cases/yamls/gfs_extended_ci.yaml b/ci/cases/yamls/gfs_extended_ci.yaml index 4d4f79e0e8..f3a84c8fde 100644 --- a/ci/cases/yamls/gfs_extended_ci.yaml +++ b/ci/cases/yamls/gfs_extended_ci.yaml @@ -2,7 +2,7 @@ defaults: !INC {{ HOMEgfs }}/parm/config/gfs/yaml/defaults.yaml base: - ACCOUNT: {{ 'SLURM_ACCOUNT' | getenv }} + ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} DO_GOES: "YES" DO_BUFRSND: "YES" DO_GEMPAK: "YES" diff --git a/ci/cases/yamls/soca_gfs_defaults_ci.yaml b/ci/cases/yamls/soca_gfs_defaults_ci.yaml index 126637cd86..3d75cc911a 100644 --- a/ci/cases/yamls/soca_gfs_defaults_ci.yaml +++ b/ci/cases/yamls/soca_gfs_defaults_ci.yaml @@ -1,5 +1,5 @@ defaults: !INC {{ HOMEgfs }}/parm/config/gfs/yaml/defaults.yaml base: - ACCOUNT: {{ 'SLURM_ACCOUNT' | getenv }} + ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} DO_JEDIOCNVAR: "YES" diff --git a/ci/cases/yamls/ufs_hybatmDA_defaults.ci.yaml b/ci/cases/yamls/ufs_hybatmDA_defaults.ci.yaml index 1075f55b63..c4fa54dcc8 100644 --- a/ci/cases/yamls/ufs_hybatmDA_defaults.ci.yaml +++ b/ci/cases/yamls/ufs_hybatmDA_defaults.ci.yaml @@ -4,7 +4,7 @@ base: DOIAU: "NO" DO_JEDIATMVAR: "YES" DO_JEDIATMENS: "YES" - ACCOUNT: {{ 'SLURM_ACCOUNT' | getenv }} + ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} atmanl: LAYOUT_X_ATMANL: 4 LAYOUT_Y_ATMANL: 4 diff --git a/ci/platforms/config.hera b/ci/platforms/config.hera index ae08293edf..7e85bb33da 100644 --- a/ci/platforms/config.hera +++ b/ci/platforms/config.hera @@ -2,8 +2,6 @@ export GFS_CI_ROOT=/scratch1/NCEPDEV/global/Terry.McGuinness/GFS_CI_ROOT export ICSDIR_ROOT=/scratch1/NCEPDEV/global/glopara/data/ICSDIR -export STMP="/scratch1/NCEPDEV/stmp2/${USER}" -export PTMP="/scratch1/NCEPDEV/stmp2/${USER}" -export SLURM_ACCOUNT=nems +export HPC_ACCOUNT=nems export max_concurrent_cases=5 export max_concurrent_pr=4 diff --git a/ci/platforms/config.hercules b/ci/platforms/config.hercules index 7e8db00b4c..12846c18a4 100644 --- a/ci/platforms/config.hercules +++ b/ci/platforms/config.hercules @@ -2,8 +2,6 @@ export GFS_CI_ROOT=/work2/noaa/stmp/GFS_CI_ROOT/HERCULES export ICSDIR_ROOT=/work/noaa/global/glopara/data/ICSDIR -export STMP="/work2/noaa/stmp/${USER}/HERCULES" -export PTMP="/work2/noaa/stmp/${USER}/HERCULES" -export SLURM_ACCOUNT=nems +export HPC_ACCOUNT=nems export max_concurrent_cases=5 export max_concurrent_pr=4 diff --git a/ci/platforms/config.orion b/ci/platforms/config.orion index b6438e8564..5a7596001b 100644 --- a/ci/platforms/config.orion +++ b/ci/platforms/config.orion @@ -2,8 +2,6 @@ export GFS_CI_ROOT=/work2/noaa/stmp/GFS_CI_ROOT/ORION export ICSDIR_ROOT=/work/noaa/global/glopara/data/ICSDIR -export STMP="/work2/noaa/stmp/${USER}/ORION" -export PTMP="/work2/noaa/stmp/${USER}/ORION" -export SLURM_ACCOUNT=nems +export HPC_ACCOUNT=nems export max_concurrent_cases=5 export max_concurrent_pr=4 diff --git a/ci/platforms/config.wcoss2 b/ci/platforms/config.wcoss2 index 44882f3f19..7a840ad2f8 100644 --- a/ci/platforms/config.wcoss2 +++ b/ci/platforms/config.wcoss2 @@ -2,8 +2,6 @@ export GFS_CI_ROOT=/lfs/h2/emc/global/noscrub/globalworkflow.ci/GFS_CI_ROOT export ICSDIR_ROOT=/lfs/h2/emc/global/noscrub/emc.global/data/ICSDIR -export STMP="/lfs/h2/emc/stmp/${USER}" -export PTMP="/lfs/h2/emc/ptmp/${USER}" -export SLURM_ACCOUNT=GFS-DEV +export HPC_ACCOUNT=GFS-DEV export max_concurrent_cases=5 export max_concurrent_pr=4 diff --git a/ci/scripts/run-check_ci.sh b/ci/scripts/run-check_ci.sh index ee089dadc2..5c891fc4bd 100755 --- a/ci/scripts/run-check_ci.sh +++ b/ci/scripts/run-check_ci.sh @@ -64,7 +64,7 @@ while true; do rocotorun -v "${ROCOTO_VERBOSE:-0}" -w "${xml}" -d "${db}" # Wait before running rocotostat - sleep 10 + sleep 60 # Get job statistics echo "Gather Rocoto statistics" diff --git a/ci/scripts/utils/rocotostat.py b/ci/scripts/utils/rocotostat.py index 884ff82e3d..9b1d8dcc3a 100755 --- a/ci/scripts/utils/rocotostat.py +++ b/ci/scripts/utils/rocotostat.py @@ -2,13 +2,31 @@ import sys import os +import copy +from time import sleep -from wxflow import Executable, which, Logger, CommandNotFoundError +from wxflow import which, Logger, CommandNotFoundError, ProcessError from argparse import ArgumentParser, FileType +from collections import Counter + logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=False) +def attempt_multiple_times(expression, max_attempts, sleep_duration=0, exception_class=Exception): + attempt = 0 + last_exception = None + while attempt < max_attempts: + try: + pass + return expression() + except exception_class as last_exception: + attempt += 1 + sleep(sleep_duration) + else: + raise last_exception + + def input_args(): """ Parse command-line arguments. @@ -39,52 +57,130 @@ def input_args(): return args -def rocoto_statcount(): - """ - Run rocotostat and process its output. +def rocotostat_summary(rocotostat): """ + rocoto_summary Run rocotostat and process its output. - args = input_args() + rocoto_summary(rocotostat) adds a default argument '--summary' to the rocotostat + command, runs it, and processes its output to return a dictionary with the total + number of cycles and the number of cycles marked as 'Done'. - try: - rocotostat = which("rocotostat") - except CommandNotFoundError: - logger.exception("rocotostat not found in PATH") - raise CommandNotFoundError("rocotostat not found in PATH") - - rocotostat_all = which("rocotostat") - rocotostat.add_default_arg(['-w', os.path.abspath(args.w.name), '-d', os.path.abspath(args.d.name), '-s']) - rocotostat_all.add_default_arg(['-w', os.path.abspath(args.w.name), '-d', os.path.abspath(args.d.name), '-a']) + Input: + rocotostat - The rocotostat command. - rocotostat_output = rocotostat(output=str) + Output: + rocoto_status - A dictionary with the total number of cycles and the number of cycles marked as 'Done'. + """ + rocotostat = copy.deepcopy(rocotostat) + rocotostat.add_default_arg('--summary') + rocotostat_output = attempt_multiple_times(lambda: rocotostat(output=str), 3, 90, ProcessError) rocotostat_output = rocotostat_output.splitlines()[1:] rocotostat_output = [line.split()[0:2] for line in rocotostat_output] - rocotostat_output_all = rocotostat_all(output=str) - rocotostat_output_all = rocotostat_output_all.splitlines()[1:] - rocotostat_output_all = [line.split()[0:4] for line in rocotostat_output_all] - rocotostat_output_all = [line for line in rocotostat_output_all if len(line) != 1] - rocoto_status = { 'CYCLES_TOTAL': len(rocotostat_output), 'CYCLES_DONE': sum([sublist.count('Done') for sublist in rocotostat_output]) } + return rocoto_status + + +def rocoto_statcount(rocotostat): + """ + rocoto_statcount Run rocotostat and process its output. + + rocoto_statcount(rocotostat) adds a default argument '--all' to the rocotostat + command, runs it, and processes its output to return a dictionary with the count + of each status case. + + Input: + rocotostat - The rocotostat command. + + Output: + rocoto_status - A dictionary with the count of each status case. + """ + + rocotostat = copy.deepcopy(rocotostat) + rocotostat.add_default_arg('--all') + + rocotostat_output = attempt_multiple_times(lambda: rocotostat(output=str), 4, 120, ProcessError) + rocotostat_output = rocotostat_output.splitlines()[1:] + rocotostat_output = [line.split()[0:4] for line in rocotostat_output] + rocotostat_output = [line for line in rocotostat_output if len(line) != 1] status_cases = ['SUCCEEDED', 'FAIL', 'DEAD', 'RUNNING', 'SUBMITTING', 'QUEUED'] + + rocoto_status = {} + status_counts = Counter(case for sublist in rocotostat_output for case in sublist) for case in status_cases: - rocoto_status[case] = sum([sublist.count(case) for sublist in rocotostat_output_all]) + rocoto_status[case] = status_counts[case] return rocoto_status +def is_done(rocoto_status): + """ + is_done Check if all cycles are done. + + is_done(rocoto_status) checks if the total number of cycles equals the number of + done cycles in the rocoto_status dictionary. + + Input: + rocoto_status - A dictionary with the count of each status case. + + Output: + boolean - True if all cycles are done, False otherwise. + """ + + if rocoto_status['CYCLES_TOTAL'] == rocoto_status['CYCLES_DONE']: + return True + else: + return False + + +def is_stalled(rocoto_status): + """ + is_stalled Check if all cycles are stalled. + + is_stalled(rocoto_status) checks if all cycles are stalled by verifying if + there are no jobs that are RUNNING, SUBMITTING, or QUEUED. + + Input: + rocoto_status - A dictionary with the count of each status case. + + Output: + boolean - True if all cycles are stalled, False otherwise. + """ + + if rocoto_status['RUNNING'] + rocoto_status['SUBMITTING'] + rocoto_status['QUEUED'] == 0: + return True + else: + return False + + if __name__ == '__main__': + """ + main Execute the script. + + main() parses the input arguments, checks if the rocotostat command is available, + adds default arguments to the rocotostat command, and runs it and reports + out to stdout spcific information of rocoto workflow. + """ args = input_args() - error_return = 0 - rocoto_status = rocoto_statcount() + try: + rocotostat = which("rocotostat") + except CommandNotFoundError: + logger.exception("rocotostat not found in PATH") + raise CommandNotFoundError("rocotostat not found in PATH") - if rocoto_status['CYCLES_TOTAL'] == rocoto_status['CYCLES_DONE']: + rocotostat.add_default_arg(['-w', os.path.abspath(args.w.name), '-d', os.path.abspath(args.d.name)]) + + rocoto_status = rocoto_statcount(rocotostat) + rocoto_status.update(rocotostat_summary(rocotostat)) + + error_return = 0 + if is_done(rocoto_status): rocoto_state = 'DONE' elif rocoto_status['DEAD'] > 0: error_return = rocoto_status['FAIL'] + rocoto_status['DEAD'] @@ -92,13 +188,11 @@ def rocoto_statcount(): elif 'UNKNOWN' in rocoto_status: error_return = rocoto_status['UNKNOWN'] rocoto_state = 'UNKNOWN' - elif rocoto_status['RUNNING'] + rocoto_status['SUBMITTING'] + rocoto_status['QUEUED'] == 0: - # - # TODO for now a STALLED state will be just a warning as it can - # produce a false negative if there is a timestamp on a file dependency. - # - # error_return = -3 - rocoto_state = 'STALLED' + elif is_stalled(rocoto_status): + rocoto_status = attempt_multiple_times(rocoto_statcount(rocotostat), 2, 120, ProcessError) + if is_stalled(rocoto_status): + error_return = 3 + rocoto_state = 'STALLED' else: rocoto_state = 'RUNNING' diff --git a/workflow/hosts/hercules.yaml b/workflow/hosts/hercules.yaml index 2623672709..a3c0733b8c 100644 --- a/workflow/hosts/hercules.yaml +++ b/workflow/hosts/hercules.yaml @@ -4,8 +4,8 @@ BASE_CPLIC: '/work/noaa/global/glopara/data/ICSDIR/prototype_ICs' PACKAGEROOT: '/work/noaa/global/glopara/nwpara' COMINsyn: '/work/noaa/global/glopara/com/gfs/prod/syndat' HOMEDIR: '/work/noaa/global/${USER}' -STMP: '/work/noaa/stmp/${USER}' -PTMP: '/work/noaa/stmp/${USER}' +STMP: '/work/noaa/stmp/${USER}/HERCULES' +PTMP: '/work/noaa/stmp/${USER}/HERCULES' NOSCRUB: $HOMEDIR SCHEDULER: slurm ACCOUNT: fv3-cpu diff --git a/workflow/hosts/orion.yaml b/workflow/hosts/orion.yaml index dd95def386..4f8f02b4c6 100644 --- a/workflow/hosts/orion.yaml +++ b/workflow/hosts/orion.yaml @@ -4,8 +4,8 @@ BASE_CPLIC: '/work/noaa/global/glopara/data/ICSDIR/prototype_ICs' PACKAGEROOT: '/work/noaa/global/glopara/nwpara' COMINsyn: '/work/noaa/global/glopara/com/gfs/prod/syndat' HOMEDIR: '/work/noaa/global/${USER}' -STMP: '/work/noaa/stmp/${USER}' -PTMP: '/work/noaa/stmp/${USER}' +STMP: '/work/noaa/stmp/${USER}/ORION' +PTMP: '/work/noaa/stmp/${USER}/ORION' NOSCRUB: $HOMEDIR SCHEDULER: slurm ACCOUNT: fv3-cpu From 50c2b8951b29a3c883a778becbf8582f9519eb48 Mon Sep 17 00:00:00 2001 From: Anil Kumar <108816337+AnilKumar-NOAA@users.noreply.github.com> Date: Tue, 28 May 2024 13:23:53 -0400 Subject: [PATCH 05/45] Global-workflow (AR) Generic updates for Gaea C5 (#2515) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Port global-workflow’s build and run capability to Gaea-C5 - Building global-workflow on Gaea-C5 - Setting up experiments with global-workflow on Gaea-C5 --------- Co-authored-by: AnilKumar-NOAA Co-authored-by: DavidBurrows-NCO <82525974+DavidBurrows-NCO@users.noreply.github.com> --- env/GAEA.env | 39 +++++++++++++++++++++++++++++ modulefiles/module_base.gaea.lua | 39 +++++++++++++++++++++++++++++ modulefiles/module_gwsetup.gaea.lua | 21 ++++++++++++++++ parm/config/gfs/config.aero | 3 +++ parm/config/gfs/config.resources | 1 + sorc/link_workflow.sh | 1 + ush/detect_machine.sh | 6 ++--- ush/module-setup.sh | 33 ++---------------------- versions/build.gaea.ver | 6 +++++ versions/run.gaea.ver | 6 +++++ workflow/hosts.py | 4 ++- workflow/hosts/gaea.yaml | 25 ++++++++++++++++++ 12 files changed, 148 insertions(+), 36 deletions(-) create mode 100755 env/GAEA.env create mode 100644 modulefiles/module_base.gaea.lua create mode 100644 modulefiles/module_gwsetup.gaea.lua create mode 100644 versions/build.gaea.ver create mode 100644 versions/run.gaea.ver create mode 100644 workflow/hosts/gaea.yaml diff --git a/env/GAEA.env b/env/GAEA.env new file mode 100755 index 0000000000..c19fecc934 --- /dev/null +++ b/env/GAEA.env @@ -0,0 +1,39 @@ +#! /usr/bin/env bash + +if [[ $# -ne 1 ]]; then + + echo "Must specify an input argument to set runtime environment variables!" + echo "argument can be any one of the following:" + echo "fcst atmos_products" + exit 1 + +fi + +step=$1 + +export launcher="srun -l --export=ALL" +export mpmd_opt="--multi-prog --output=mpmd.%j.%t.out" + +ulimit -s unlimited +ulimit -a + +if [[ "${step}" = "fcst" ]]; then + + if [[ "${CDUMP}" =~ "gfs" ]]; then + nprocs="npe_${step}_gfs" + ppn="npe_node_${step}_gfs" || ppn="npe_node_${step}" + else + nprocs="npe_${step}" + ppn="npe_node_${step}" + fi + (( nnodes = (${!nprocs}+${!ppn}-1)/${!ppn} )) + (( ntasks = nnodes*${!ppn} )) + # With ESMF threading, the model wants to use the full node + export APRUN_UFS="${launcher} -n ${ntasks}" + unset nprocs ppn nnodes ntasks + +elif [[ "${step}" = "atmos_products" ]]; then + + export USE_CFP="YES" # Use MPMD for downstream product generation + +fi diff --git a/modulefiles/module_base.gaea.lua b/modulefiles/module_base.gaea.lua new file mode 100644 index 0000000000..55ad6b0c34 --- /dev/null +++ b/modulefiles/module_base.gaea.lua @@ -0,0 +1,39 @@ +help([[ +Load environment to run GFS on Gaea +]]) + +local spack_mod_path=(os.getenv("spack_mod_path") or "None") +prepend_path("MODULEPATH", spack_mod_path) + +load(pathJoin("stack-intel", (os.getenv("stack_intel_ver") or "None"))) +load(pathJoin("stack-cray-mpich", (os.getenv("stack_cray_mpich_ver") or "None"))) +load(pathJoin("python", (os.getenv("python_ver") or "None"))) + +load(pathJoin("jasper", (os.getenv("jasper_ver") or "None"))) +load(pathJoin("libpng", (os.getenv("libpng_ver") or "None"))) +load(pathJoin("cdo", (os.getenv("cdo_ver") or "None"))) +load(pathJoin("hdf5", (os.getenv("hdf5_ver") or "None"))) +load(pathJoin("netcdf-c", (os.getenv("netcdf_c_ver") or "None"))) +load(pathJoin("netcdf-fortran", (os.getenv("netcdf_fortran_ver") or "None"))) + +load(pathJoin("nco", (os.getenv("nco_ver") or "None"))) +load(pathJoin("prod_util", (os.getenv("prod_util_ver") or "None"))) +load(pathJoin("grib-util", (os.getenv("grib_util_ver") or "None"))) +load(pathJoin("g2tmpl", (os.getenv("g2tmpl_ver") or "None"))) +load(pathJoin("gsi-ncdiag", (os.getenv("gsi_ncdiag_ver") or "None"))) +load(pathJoin("crtm", (os.getenv("crtm_ver") or "None"))) +load(pathJoin("bufr", (os.getenv("bufr_ver") or "None"))) +load(pathJoin("wgrib2", (os.getenv("wgrib2_ver") or "None"))) +load(pathJoin("py-netcdf4", (os.getenv("py_netcdf4_ver") or "None"))) +load(pathJoin("py-pyyaml", (os.getenv("py_pyyaml_ver") or "None"))) +load(pathJoin("py-jinja2", (os.getenv("py_jinja2_ver") or "None"))) +load(pathJoin("py-pandas", (os.getenv("py_pandas_ver") or "None"))) +load(pathJoin("py-python-dateutil", (os.getenv("py_python_dateutil_ver") or "None"))) +load(pathJoin("met", (os.getenv("met_ver") or "None"))) +load(pathJoin("metplus", (os.getenv("metplus_ver") or "None"))) +load(pathJoin("py-xarray", (os.getenv("py_xarray_ver") or "None"))) + +setenv("WGRIB2","wgrib2") +setenv("UTILROOT",(os.getenv("prod_util_ROOT") or "None")) + +whatis("Description: GFS run setup environment") diff --git a/modulefiles/module_gwsetup.gaea.lua b/modulefiles/module_gwsetup.gaea.lua new file mode 100644 index 0000000000..5a8b2379a9 --- /dev/null +++ b/modulefiles/module_gwsetup.gaea.lua @@ -0,0 +1,21 @@ +help([[ +Load environment to run GFS workflow setup scripts on Gaea +]]) + +prepend_path("MODULEPATH", "/ncrc/proj/epic/rocoto/modulefiles") +load(pathJoin("rocoto")) + +prepend_path("MODULEPATH", "/ncrc/proj/epic/spack-stack/spack-stack-1.6.0/envs/unified-env/install/modulefiles/Core") + +local stack_intel_ver=os.getenv("stack_intel_ver") or "2023.1.0" +local python_ver=os.getenv("python_ver") or "3.10.13" + +load(pathJoin("stack-intel", stack_intel_ver)) +load(pathJoin("python", python_ver)) +load("py-jinja2") +load("py-pyyaml") +load("py-numpy") +local git_ver=os.getenv("git_ver") or "2.35.2" +load(pathJoin("git", git_ver)) + +whatis("Description: GFS run setup environment") diff --git a/parm/config/gfs/config.aero b/parm/config/gfs/config.aero index c152fafd12..2fae019574 100644 --- a/parm/config/gfs/config.aero +++ b/parm/config/gfs/config.aero @@ -20,6 +20,9 @@ case ${machine} in "WCOSS2") AERO_INPUTS_DIR="/lfs/h2/emc/global/noscrub/emc.global/data/gocart_emissions" ;; + "GAEA") + AERO_INPUTS_DIR="/gpfs/f5/epic/proj-shared/global/glopara/data/gocart_emissions" + ;; "JET") AERO_INPUTS_DIR="/lfs4/HFIP/hfv3gfs/glopara/data/gocart_emissions" ;; diff --git a/parm/config/gfs/config.resources b/parm/config/gfs/config.resources index d58ecf85b2..c583e0c04e 100644 --- a/parm/config/gfs/config.resources +++ b/parm/config/gfs/config.resources @@ -35,6 +35,7 @@ echo "BEGIN: config.resources" case ${machine} in "WCOSS2") npe_node_max=128;; "HERA") npe_node_max=40;; + "GAEA") npe_node_max=128;; "ORION") npe_node_max=40;; "HERCULES") npe_node_max=80;; "JET") diff --git a/sorc/link_workflow.sh b/sorc/link_workflow.sh index c5d7243e8f..68873d0f1a 100755 --- a/sorc/link_workflow.sh +++ b/sorc/link_workflow.sh @@ -75,6 +75,7 @@ case "${machine}" in "hercules") FIX_DIR="/work/noaa/global/glopara/fix" ;; "jet") FIX_DIR="/lfs4/HFIP/hfv3gfs/glopara/git/fv3gfs/fix" ;; "s4") FIX_DIR="/data/prod/glopara/fix" ;; + "gaea") FIX_DIR="/gpfs/f5/epic/proj-shared/global/glopara/data/fix" ;; *) echo "FATAL: Unknown target machine ${machine}, couldn't set FIX_DIR" exit 1 diff --git a/ush/detect_machine.sh b/ush/detect_machine.sh index 8a719c10d9..683ee0db7f 100755 --- a/ush/detect_machine.sh +++ b/ush/detect_machine.sh @@ -21,10 +21,8 @@ case $(hostname -f) in dlogin0[1-9].dogwood.wcoss2.ncep.noaa.gov) MACHINE_ID=wcoss2 ;; ### dogwood01-9 dlogin10.dogwood.wcoss2.ncep.noaa.gov) MACHINE_ID=wcoss2 ;; ### dogwood10 - gaea9) MACHINE_ID=gaea ;; ### gaea9 - gaea1[0-6]) MACHINE_ID=gaea ;; ### gaea10-16 - gaea9.ncrc.gov) MACHINE_ID=gaea ;; ### gaea9 - gaea1[0-6].ncrc.gov) MACHINE_ID=gaea ;; ### gaea10-16 + gaea5[1-8]) MACHINE_ID=gaea ;; ### gaea51-58 + gaea5[1-8].ncrc.gov) MACHINE_ID=gaea ;; ### gaea51-58 hfe0[1-9]) MACHINE_ID=hera ;; ### hera01-09 hfe1[0-2]) MACHINE_ID=hera ;; ### hera10-12 diff --git a/ush/module-setup.sh b/ush/module-setup.sh index b66e3622d0..b4ec3edafa 100755 --- a/ush/module-setup.sh +++ b/ush/module-setup.sh @@ -70,39 +70,10 @@ elif [[ ${MACHINE_ID} = stampede* ]] ; then elif [[ ${MACHINE_ID} = gaea* ]] ; then # We are on GAEA. if ( ! eval module help > /dev/null 2>&1 ) ; then - # We cannot simply load the module command. The GAEA - # /etc/profile modifies a number of module-related variables - # before loading the module command. Without those variables, - # the module command fails. Hence we actually have to source - # /etc/profile here. - source /etc/profile - __ms_source_etc_profile=yes - else - __ms_source_etc_profile=no - fi - module purge - # clean up after purge - unset _LMFILES_ - unset _LMFILES_000 - unset _LMFILES_001 - unset LOADEDMODULES - module load modules - if [[ -d /opt/cray/ari/modulefiles ]] ; then - module use -a /opt/cray/ari/modulefiles - fi - if [[ -d /opt/cray/pe/ari/modulefiles ]] ; then - module use -a /opt/cray/pe/ari/modulefiles - fi - if [[ -d /opt/cray/pe/craype/default/modulefiles ]] ; then - module use -a /opt/cray/pe/craype/default/modulefiles - fi - if [[ -s /etc/opt/cray/pe/admin-pe/site-config ]] ; then - source /etc/opt/cray/pe/admin-pe/site-config - fi - if [[ "${__ms_source_etc_profile}" == yes ]] ; then + source /usr/share/lmod/lmod/init/bash source /etc/profile - unset __ms_source_etc_profile fi + module reset elif [[ ${MACHINE_ID} = expanse* ]]; then # We are on SDSC Expanse diff --git a/versions/build.gaea.ver b/versions/build.gaea.ver new file mode 100644 index 0000000000..b92fe8c1db --- /dev/null +++ b/versions/build.gaea.ver @@ -0,0 +1,6 @@ +export stack_intel_ver=2023.1.0 +export stack_cray_mpich_ver=8.1.25 +export spack_env=gsi-addon-dev + +source "${HOMEgfs:-}/versions/run.spack.ver" +export spack_mod_path="/ncrc/proj/epic/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core" diff --git a/versions/run.gaea.ver b/versions/run.gaea.ver new file mode 100644 index 0000000000..b92fe8c1db --- /dev/null +++ b/versions/run.gaea.ver @@ -0,0 +1,6 @@ +export stack_intel_ver=2023.1.0 +export stack_cray_mpich_ver=8.1.25 +export spack_env=gsi-addon-dev + +source "${HOMEgfs:-}/versions/run.spack.ver" +export spack_mod_path="/ncrc/proj/epic/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core" diff --git a/workflow/hosts.py b/workflow/hosts.py index a17cd3f4a8..2334a3ac35 100644 --- a/workflow/hosts.py +++ b/workflow/hosts.py @@ -15,7 +15,7 @@ class Host: """ SUPPORTED_HOSTS = ['HERA', 'ORION', 'JET', 'HERCULES', - 'WCOSS2', 'S4', 'CONTAINER', 'AWSPW'] + 'WCOSS2', 'S4', 'CONTAINER', 'AWSPW', 'GAEA'] def __init__(self, host=None): @@ -49,6 +49,8 @@ def detect(cls): machine = 'WCOSS2' elif os.path.exists('/data/prod'): machine = 'S4' + elif os.path.exists('/gpfs/f5'): + machine = 'GAEA' elif container is not None: machine = 'CONTAINER' elif pw_csp is not None: diff --git a/workflow/hosts/gaea.yaml b/workflow/hosts/gaea.yaml new file mode 100644 index 0000000000..7ca8420997 --- /dev/null +++ b/workflow/hosts/gaea.yaml @@ -0,0 +1,25 @@ +BASE_GIT: '/gpfs/f5/epic/proj-shared/global/glopara/data/git' +DMPDIR: '/gpfs/f5/epic/proj-shared/global/glopara/data/dump' +BASE_CPLIC: '/gpfs/f5/epic/proj-shared/global/glopara/data/ICSDIR/prototype_ICs' +PACKAGEROOT: '/gpfs/f5/epic/proj-shared/global/glopara/data/nwpara' +COMROOT: '/gpfs/f5/epic/proj-shared/global/glopara/data/com' +COMINsyn: '${COMROOT}/gfs/prod/syndat' +HOMEDIR: '/gpfs/f5/epic/scratch/${USER}' +STMP: '/gpfs/f5/epic/scratch/${USER}' +PTMP: '/gpfs/f5/epic/scratch/${USER}' +NOSCRUB: $HOMEDIR +ACCOUNT: epic +SCHEDULER: slurm +QUEUE: normal +QUEUE_SERVICE: normal +PARTITION_BATCH: batch +PARTITION_SERVICE: batch +CHGRP_RSTPROD: 'NO' +CHGRP_CMD: 'chgrp rstprod' +HPSSARCH: 'NO' +HPSS_PROJECT: emc-global +LOCALARCH: 'NO' +ATARDIR: '${NOSCRUB}/archive_rotdir/${PSLOT}' +MAKE_NSSTBUFR: 'NO' +MAKE_ACFTBUFR: 'NO' +SUPPORTED_RESOLUTIONS: ['C1152', 'C768', 'C384', 'C192', 'C96', 'C48'] From e53c5e8e0abbc0edf95970a71df0e6e8a2be9f31 Mon Sep 17 00:00:00 2001 From: DavidNew-NOAA <134300700+DavidNew-NOAA@users.noreply.github.com> Date: Tue, 28 May 2024 17:16:23 -0400 Subject: [PATCH 06/45] Add atmensanlfv3inc job (#2592) This PR creates the atmensanlfv3inc job, the ensemble version of atmanlfv3inc, created in GW PR #2420. Its GDASApp companion PR is #[1104](https://github.com/NOAA-EMC/GDASApp/pull/1104), and its JCB-GDAS companion PR is #[3](https://github.com/NOAA-EMC/jcb-gdas/pull/3). --- env/AWSPW.env | 2 +- env/CONTAINER.env | 2 +- env/HERA.env | 20 +++- env/HERCULES.env | 18 ++- env/JET.env | 20 +++- env/ORION.env | 20 +++- env/S4.env | 20 +++- env/WCOSS2.env | 20 +++- jobs/JGLOBAL_ATMENS_ANALYSIS_FV3_INCREMENT | 35 ++++++ ...YSIS_RUN => JGLOBAL_ATMENS_ANALYSIS_LETKF} | 4 +- jobs/rocoto/atmensanlfv3inc.sh | 24 ++++ .../{atmensanlrun.sh => atmensanlletkf.sh} | 4 +- parm/config/gfs/config.atmensanlfv3inc | 14 +++ parm/config/gfs/config.atmensanlletkf | 11 ++ parm/config/gfs/config.atmensanlrun | 11 -- parm/config/gfs/config.resources | 32 ++++-- .../exglobal_atm_analysis_fv3_increment.py | 4 +- .../exglobal_atmens_analysis_fv3_increment.py | 23 ++++ ...n.py => exglobal_atmens_analysis_letkf.py} | 6 +- sorc/gdas.cd | 2 +- sorc/gsi_utils.fd | 2 +- ush/python/pygfs/task/atmens_analysis.py | 105 +++++++----------- workflow/applications/applications.py | 2 +- workflow/applications/gfs_cycled.py | 4 +- workflow/rocoto/gfs_tasks.py | 36 +++++- workflow/rocoto/tasks.py | 2 +- 26 files changed, 304 insertions(+), 139 deletions(-) create mode 100755 jobs/JGLOBAL_ATMENS_ANALYSIS_FV3_INCREMENT rename jobs/{JGLOBAL_ATMENS_ANALYSIS_RUN => JGLOBAL_ATMENS_ANALYSIS_LETKF} (83%) create mode 100755 jobs/rocoto/atmensanlfv3inc.sh rename jobs/rocoto/{atmensanlrun.sh => atmensanlletkf.sh} (89%) create mode 100644 parm/config/gfs/config.atmensanlfv3inc create mode 100644 parm/config/gfs/config.atmensanlletkf delete mode 100644 parm/config/gfs/config.atmensanlrun create mode 100755 scripts/exglobal_atmens_analysis_fv3_increment.py rename scripts/{exglobal_atmens_analysis_run.py => exglobal_atmens_analysis_letkf.py} (86%) diff --git a/env/AWSPW.env b/env/AWSPW.env index 5cf819ba2b..7d81000f5c 100755 --- a/env/AWSPW.env +++ b/env/AWSPW.env @@ -4,7 +4,7 @@ if [[ $# -ne 1 ]]; then echo "Must specify an input argument to set runtime environment variables!" echo "argument can be any one of the following:" - echo "atmanlvar atmanlfv3inc atmensanlrun aeroanlrun snowanl" + echo "atmanlvar atmanlfv3inc atmensanlletkf atmensanlfv3inc aeroanlrun snowanl" echo "anal sfcanl fcst post metp" echo "eobs eupd ecen efcs epos" echo "postsnd awips gempak" diff --git a/env/CONTAINER.env b/env/CONTAINER.env index 700460b755..77768b485b 100755 --- a/env/CONTAINER.env +++ b/env/CONTAINER.env @@ -4,7 +4,7 @@ if [[ $# -ne 1 ]]; then echo "Must specify an input argument to set runtime environment variables!" echo "argument can be any one of the following:" - echo "atmanlvar atmanlfv3inc atmensanlrun aeroanlrun snowanl" + echo "atmanlvar atmanlfv3inc atmensanlletkf atmensanlfv3inc aeroanlrun snowanl" echo "anal sfcanl fcst post metp" echo "eobs eupd ecen efcs epos" echo "postsnd awips gempak" diff --git a/env/HERA.env b/env/HERA.env index fbfdb68e92..ccaaea32e7 100755 --- a/env/HERA.env +++ b/env/HERA.env @@ -4,7 +4,7 @@ if [[ $# -ne 1 ]]; then echo "Must specify an input argument to set runtime environment variables!" echo "argument can be any one of the following:" - echo "atmanlvar atmensanlrun aeroanlrun snowanl atmanlfv3inc" + echo "atmanlvar atmanlfv3inc atmensanlletkf atmensanlfv3inc aeroanlrun snowanl" echo "anal sfcanl fcst post metp" echo "eobs eupd ecen efcs epos" echo "postsnd awips gempak" @@ -68,13 +68,21 @@ elif [[ "${step}" = "atmanlvar" ]]; then [[ ${NTHREADS_ATMANLVAR} -gt ${nth_max} ]] && export NTHREADS_ATMANLVAR=${nth_max} export APRUN_ATMANLVAR="${launcher} -n ${npe_atmanlvar} --cpus-per-task=${NTHREADS_ATMANLVAR}" -elif [[ "${step}" = "atmensanlrun" ]]; then +elif [[ "${step}" = "atmensanlletkf" ]]; then - nth_max=$((npe_node_max / npe_node_atmensanlrun)) + nth_max=$((npe_node_max / npe_node_atmensanlletkf)) - export NTHREADS_ATMENSANL=${nth_atmensanlrun:-${nth_max}} - [[ ${NTHREADS_ATMENSANL} -gt ${nth_max} ]] && export NTHREADS_ATMENSANL=${nth_max} - export APRUN_ATMENSANL="${launcher} -n ${npe_atmensanlrun} --cpus-per-task=${NTHREADS_ATMENSANL}" + export NTHREADS_ATMENSANLLETKF=${nth_atmensanlletkf:-${nth_max}} + [[ ${NTHREADS_ATMENSANLLETKF} -gt ${nth_max} ]] && export NTHREADS_ATMENSANLLETKF=${nth_max} + export APRUN_ATMENSANLLETKF="${launcher} -n ${npe_atmensanlletkf} --cpus-per-task=${NTHREADS_ATMENSANLLETKF}" + +elif [[ "${step}" = "atmensanlfv3inc" ]]; then + + nth_max=$((npe_node_max / npe_node_atmensanlfv3inc)) + + export NTHREADS_ATMENSANLFV3INC=${nth_atmensanlfv3inc:-${nth_max}} + [[ ${NTHREADS_ATMENSANLFV3INC} -gt ${nth_max} ]] && export NTHREADS_ATMENSANLFV3INC=${nth_max} + export APRUN_ATMENSANLFV3INC="${launcher} -n ${npe_atmensanlfv3inc} --cpus-per-task=${NTHREADS_ATMENSANLFV3INC}" elif [[ "${step}" = "aeroanlrun" ]]; then diff --git a/env/HERCULES.env b/env/HERCULES.env index 0b62120536..0824ba913a 100755 --- a/env/HERCULES.env +++ b/env/HERCULES.env @@ -73,13 +73,21 @@ case ${step} in [[ ${NTHREADS_ATMANLFV3INC} -gt ${nth_max} ]] && export NTHREADS_ATMANLFV3INC=${nth_max} export APRUN_ATMANLFV3INC="${launcher} -n ${npe_atmanlfv3inc} --cpus-per-task=${NTHREADS_ATMANLFV3INC}" ;; - "atmensanlrun") + "atmensanlletkf") - nth_max=$((npe_node_max / npe_node_atmensanlrun)) + nth_max=$((npe_node_max / npe_node_atmensanlletkf)) - export NTHREADS_ATMENSANL=${nth_atmensanlrun:-${nth_max}} - [[ ${NTHREADS_ATMENSANL} -gt ${nth_max} ]] && export NTHREADS_ATMENSANL=${nth_max} - export APRUN_ATMENSANL="${launcher} -n ${npe_atmensanlrun} --cpus-per-task=${NTHREADS_ATMENSANL}" + export NTHREADS_ATMENSANLLETKF=${nth_atmensanlletkf:-${nth_max}} + [[ ${NTHREADS_ATMENSANLLETKF} -gt ${nth_max} ]] && export NTHREADS_ATMENSANLLETKF=${nth_max} + export APRUN_ATMENSANLLETKF="${launcher} -n ${npe_atmensanlletkf} --cpus-per-task=${NTHREADS_ATMENSANLLETKF}" + ;; + "atmensanlfv3inc") + + nth_max=$((npe_node_max / npe_node_atmensanlfv3inc)) + + export NTHREADS_ATMENSANLFV3INC=${nth_atmensanlfv3inc:-${nth_max}} + [[ ${NTHREADS_ATMENSANLFV3INC} -gt ${nth_max} ]] && export NTHREADS_ATMENSANLFV3INC=${nth_max} + export APRUN_ATMENSANLFV3INC="${launcher} -n ${npe_atmensanlfv3inc} --cpus-per-task=${NTHREADS_ATMENSANLFV3INC}" ;; "aeroanlrun") diff --git a/env/JET.env b/env/JET.env index 976e42a025..5bd88dc93a 100755 --- a/env/JET.env +++ b/env/JET.env @@ -4,7 +4,7 @@ if [[ $# -ne 1 ]]; then echo "Must specify an input argument to set runtime environment variables!" echo "argument can be any one of the following:" - echo "atmanlvar atmensanlrun aeroanlrun snowanl atmanlfv3inc" + echo "atmanlvar atmanlfv3inc atmensanlletkf atmensanlfv3inc aeroanlrun snowanl" echo "anal sfcanl fcst post metp" echo "eobs eupd ecen efcs epos" echo "postsnd awips gempak" @@ -56,13 +56,21 @@ elif [[ "${step}" = "atmanlvar" ]]; then [[ ${NTHREADS_ATMANLVAR} -gt ${nth_max} ]] && export NTHREADS_ATMANLVAR=${nth_max} export APRUN_ATMANLVAR="${launcher} -n ${npe_atmanlvar}" -elif [[ "${step}" = "atmensanlrun" ]]; then +elif [[ "${step}" = "atmensanlletkf" ]]; then - nth_max=$((npe_node_max / npe_node_atmensanlrun)) + nth_max=$((npe_node_max / npe_node_atmensanlletkf)) - export NTHREADS_ATMENSANL=${nth_atmensanlrun:-${nth_max}} - [[ ${NTHREADS_ATMENSANL} -gt ${nth_max} ]] && export NTHREADS_ATMENSANL=${nth_max} - export APRUN_ATMENSANL="${launcher} ${npe_atmensanlrun}" + export NTHREADS_ATMENSANLLETKF=${nth_atmensanlletkf:-${nth_max}} + [[ ${NTHREADS_ATMENSANLLETKF} -gt ${nth_max} ]] && export NTHREADS_ATMENSANLLETKF=${nth_max} + export APRUN_ATMENSANLLETKF="${launcher} ${npe_atmensanlletkf}" + +elif [[ "${step}" = "atmensanlfv3inc" ]]; then + + nth_max=$((npe_node_max / npe_node_atmensanlfv3inc)) + + export NTHREADS_ATMENSANLFV3INC=${nth_atmensanlfv3inc:-${nth_max}} + [[ ${NTHREADS_ATMENSANLFV3INC} -gt ${nth_max} ]] && export NTHREADS_ATMENSANLFV3INC=${nth_max} + export APRUN_ATMENSANLFV3INC="${launcher} ${npe_atmensanlfv3inc}" elif [[ "${step}" = "aeroanlrun" ]]; then diff --git a/env/ORION.env b/env/ORION.env index 1b66ca65c0..f701e55aa2 100755 --- a/env/ORION.env +++ b/env/ORION.env @@ -4,7 +4,7 @@ if [[ $# -ne 1 ]]; then echo "Must specify an input argument to set runtime environment variables!" echo "argument can be any one of the following:" - echo "atmanlvar atmensanlrun aeroanlrun snowanl atmanlfv3inc" + echo "atmanlvar atmanlfv3inc atmensanlletkf atmensanlfv3inc aeroanlrun snowanl" echo "anal sfcanl fcst post metp" echo "eobs eupd ecen efcs epos" echo "postsnd awips gempak" @@ -64,13 +64,21 @@ elif [[ "${step}" = "atmanlvar" ]]; then [[ ${NTHREADS_ATMANLVAR} -gt ${nth_max} ]] && export NTHREADS_ATMANLVAR=${nth_max} export APRUN_ATMANLVAR="${launcher} -n ${npe_atmanlvar} --cpus-per-task=${NTHREADS_ATMANLVAR}" -elif [[ "${step}" = "atmensanlrun" ]]; then +elif [[ "${step}" = "atmensanlletkf" ]]; then - nth_max=$((npe_node_max / npe_node_atmensanlrun)) + nth_max=$((npe_node_max / npe_node_atmensanlletkf)) - export NTHREADS_ATMENSANL=${nth_atmensanlrun:-${nth_max}} - [[ ${NTHREADS_ATMENSANL} -gt ${nth_max} ]] && export NTHREADS_ATMENSANL=${nth_max} - export APRUN_ATMENSANL="${launcher} -n ${npe_atmensanlrun} --cpus-per-task=${NTHREADS_ATMENSANL}" + export NTHREADS_ATMENSANLLETKF=${nth_atmensanlletkf:-${nth_max}} + [[ ${NTHREADS_ATMENSANLLETKF} -gt ${nth_max} ]] && export NTHREADS_ATMENSANLLETKF=${nth_max} + export APRUN_ATMENSANLLETKF="${launcher} -n ${npe_atmensanlletkf} --cpus-per-task=${NTHREADS_ATMENSANLLETKF}" + +elif [[ "${step}" = "atmensanlfv3inc" ]]; then + + nth_max=$((npe_node_max / npe_node_atmensanlfv3inc)) + + export NTHREADS_ATMENSANLFV3INC=${nth_atmensanlfv3inc:-${nth_max}} + [[ ${NTHREADS_ATMENSANLFV3INC} -gt ${nth_max} ]] && export NTHREADS_ATMENSANLFV3INC=${nth_max} + export APRUN_ATMENSANLFV3INC="${launcher} -n ${npe_atmensanlfv3inc} --cpus-per-task=${NTHREADS_ATMENSANLFV3INC}" elif [[ "${step}" = "aeroanlrun" ]]; then diff --git a/env/S4.env b/env/S4.env index ce68fddb89..9ba3a61b01 100755 --- a/env/S4.env +++ b/env/S4.env @@ -4,7 +4,7 @@ if [[ $# -ne 1 ]]; then echo "Must specify an input argument to set runtime environment variables!" echo "argument can be any one of the following:" - echo "atmanlvar atmensanlrun aeroanlrun snowanl atmanlfv3inc" + echo "atmanlvar atmanlfv3inc atmensanlletkf atmensanlfv3inc aeroanlrun snowanl" echo "anal sfcanl fcst post metp" echo "eobs eupd ecen efcs epos" echo "postsnd awips gempak" @@ -56,13 +56,21 @@ elif [[ "${step}" = "atmanlvar" ]]; then [[ ${NTHREADS_ATMANLVAR} -gt ${nth_max} ]] && export NTHREADS_ATMANLVAR=${nth_max} export APRUN_ATMANLVAR="${launcher} -n ${npe_atmanlvar}" -elif [[ "${step}" = "atmensanlrun" ]]; then +elif [[ "${step}" = "atmensanlletkf" ]]; then - nth_max=$((npe_node_max / npe_node_atmensanlrun)) + nth_max=$((npe_node_max / npe_node_atmensanlletkf)) - export NTHREADS_ATMENSANL=${nth_atmensanlrun:-${nth_max}} - [[ ${NTHREADS_ATMENSANL} -gt ${nth_max} ]] && export NTHREADS_ATMENSANL=${nth_max} - export APRUN_ATMENSANL="${launcher} -n ${npe_atmensanlrun}" + export NTHREADS_ATMENSANLLETKF=${nth_atmensanlletkf:-${nth_max}} + [[ ${NTHREADS_ATMENSANLLETKF} -gt ${nth_max} ]] && export NTHREADS_ATMENSANLLETKF=${nth_max} + export APRUN_ATMENSANLLETKF="${launcher} -n ${npe_atmensanlletkf}" + +elif [[ "${step}" = "atmensanlfv3inc" ]]; then + + nth_max=$((npe_node_max / npe_node_atmensanlfv3inc)) + + export NTHREADS_ATMENSANLFV3INC=${nth_atmensanlfv3inc:-${nth_max}} + [[ ${NTHREADS_ATMENSANLFV3INC} -gt ${nth_max} ]] && export NTHREADS_ATMENSANLFV3INC=${nth_max} + export APRUN_ATMENSANLFV3INC="${launcher} -n ${npe_atmensanlfv3inc}" elif [[ "${step}" = "aeroanlrun" ]]; then diff --git a/env/WCOSS2.env b/env/WCOSS2.env index ff0121e034..0876e4127d 100755 --- a/env/WCOSS2.env +++ b/env/WCOSS2.env @@ -4,7 +4,7 @@ if [[ $# -ne 1 ]]; then echo "Must specify an input argument to set runtime environment variables!" echo "argument can be any one of the following:" - echo "atmanlvar atmensanlrun aeroanlrun snowanl atmanlfv3inc" + echo "atmanlvar atmanlfv3inc atmensanlletkf atmensanlfv3inc aeroanlrun snowanl" echo "anal sfcanl fcst post metp" echo "eobs eupd ecen esfc efcs epos" echo "postsnd awips gempak" @@ -50,13 +50,21 @@ elif [[ "${step}" = "atmanlvar" ]]; then [[ ${NTHREADS_ATMANLVAR} -gt ${nth_max} ]] && export NTHREADS_ATMANLVAR=${nth_max} export APRUN_ATMANLVAR="${launcher} -n ${npe_atmanlvar}" -elif [[ "${step}" = "atmensanlrun" ]]; then +elif [[ "${step}" = "atmensanlletkf" ]]; then - nth_max=$((npe_node_max / npe_node_atmensanlrun)) + nth_max=$((npe_node_max / npe_node_atmensanlletkf)) - export NTHREADS_ATMENSANL=${nth_atmensanlrun:-${nth_max}} - [[ ${NTHREADS_ATMENSANL} -gt ${nth_max} ]] && export NTHREADS_ATMENSANL=${nth_max} - export APRUN_ATMENSANL="${launcher} -n ${npe_atmensanlrun}" + export NTHREADS_ATMENSANLLETKF=${nth_atmensanlletkf:-${nth_max}} + [[ ${NTHREADS_ATMENSANLLETKF} -gt ${nth_max} ]] && export NTHREADS_ATMENSANLLETKF=${nth_max} + export APRUN_ATMENSANLLETKF="${launcher} -n ${npe_atmensanlletkf}" + +elif [[ "${step}" = "atmensanlfv3inc" ]]; then + + nth_max=$((npe_node_max / npe_node_atmensanlfv3inc)) + + export NTHREADS_ATMENSANLFV3INC=${nth_atmensanlfv3inc:-${nth_max}} + [[ ${NTHREADS_ATMENSANLFV3INC} -gt ${nth_max} ]] && export NTHREADS_ATMENSANLFV3INC=${nth_max} + export APRUN_ATMENSANLFV3INC="${launcher} -n ${npe_atmensanlfv3inc}" elif [[ "${step}" = "aeroanlrun" ]]; then diff --git a/jobs/JGLOBAL_ATMENS_ANALYSIS_FV3_INCREMENT b/jobs/JGLOBAL_ATMENS_ANALYSIS_FV3_INCREMENT new file mode 100755 index 0000000000..7179ae0624 --- /dev/null +++ b/jobs/JGLOBAL_ATMENS_ANALYSIS_FV3_INCREMENT @@ -0,0 +1,35 @@ +#! /usr/bin/env bash + +source "${HOMEgfs}/ush/preamble.sh" +export WIPE_DATA="NO" +export DATA=${DATA:-${DATAROOT}/${RUN}atmensanl_${cyc}} +source "${HOMEgfs}/ush/jjob_header.sh" -e "atmensanlfv3inc" -c "base atmensanl atmensanlfv3inc" + +############################################## +# Set variables used in the script +############################################## + +############################################## +# Begin JOB SPECIFIC work +############################################## + +############################################################### +# Run relevant script + +EXSCRIPT=${GDASATMENSRUNSH:-${SCRgfs}/exglobal_atmens_analysis_fv3_increment.py} +${EXSCRIPT} +status=$? +[[ ${status} -ne 0 ]] && exit "${status}" + +############################################## +# End JOB SPECIFIC work +############################################## + +############################################## +# Final processing +############################################## +if [[ -e "${pgmout}" ]] ; then + cat "${pgmout}" +fi + +exit 0 diff --git a/jobs/JGLOBAL_ATMENS_ANALYSIS_RUN b/jobs/JGLOBAL_ATMENS_ANALYSIS_LETKF similarity index 83% rename from jobs/JGLOBAL_ATMENS_ANALYSIS_RUN rename to jobs/JGLOBAL_ATMENS_ANALYSIS_LETKF index 65eeb5e0d8..060b7abd06 100755 --- a/jobs/JGLOBAL_ATMENS_ANALYSIS_RUN +++ b/jobs/JGLOBAL_ATMENS_ANALYSIS_LETKF @@ -3,7 +3,7 @@ source "${HOMEgfs}/ush/preamble.sh" export WIPE_DATA="NO" export DATA=${DATA:-${DATAROOT}/${RUN}atmensanl_${cyc}} -source "${HOMEgfs}/ush/jjob_header.sh" -e "atmensanlrun" -c "base atmensanl atmensanlrun" +source "${HOMEgfs}/ush/jjob_header.sh" -e "atmensanlletkf" -c "base atmensanl atmensanlletkf" ############################################## # Set variables used in the script @@ -16,7 +16,7 @@ source "${HOMEgfs}/ush/jjob_header.sh" -e "atmensanlrun" -c "base atmensanl atme ############################################################### # Run relevant script -EXSCRIPT=${GDASATMENSRUNSH:-${SCRgfs}/exglobal_atmens_analysis_run.py} +EXSCRIPT=${GDASATMENSRUNSH:-${SCRgfs}/exglobal_atmens_analysis_letkf.py} ${EXSCRIPT} status=$? [[ ${status} -ne 0 ]] && exit "${status}" diff --git a/jobs/rocoto/atmensanlfv3inc.sh b/jobs/rocoto/atmensanlfv3inc.sh new file mode 100755 index 0000000000..bb44ddc3a0 --- /dev/null +++ b/jobs/rocoto/atmensanlfv3inc.sh @@ -0,0 +1,24 @@ +#! /usr/bin/env bash + +source "${HOMEgfs}/ush/preamble.sh" + +############################################################### +# Source UFSDA workflow modules +. "${HOMEgfs}/ush/load_ufsda_modules.sh" +status=$? +[[ ${status} -ne 0 ]] && exit "${status}" + +export job="atmensanlfv3inc" +export jobid="${job}.$$" + +############################################################### +# setup python path for workflow utilities and tasks +wxflowPATH="${HOMEgfs}/ush/python:${HOMEgfs}/ush/python/wxflow/src" +PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${wxflowPATH}" +export PYTHONPATH + +############################################################### +# Execute the JJOB +"${HOMEgfs}/jobs/JGLOBAL_ATMENS_ANALYSIS_FV3_INCREMENT" +status=$? +exit "${status}" diff --git a/jobs/rocoto/atmensanlrun.sh b/jobs/rocoto/atmensanlletkf.sh similarity index 89% rename from jobs/rocoto/atmensanlrun.sh rename to jobs/rocoto/atmensanlletkf.sh index d991e3eb82..b4a1a73a80 100755 --- a/jobs/rocoto/atmensanlrun.sh +++ b/jobs/rocoto/atmensanlletkf.sh @@ -8,7 +8,7 @@ source "${HOMEgfs}/ush/preamble.sh" status=$? [[ ${status} -ne 0 ]] && exit "${status}" -export job="atmensanlrun" +export job="atmensanlletkf" export jobid="${job}.$$" ############################################################### @@ -19,6 +19,6 @@ export PYTHONPATH ############################################################### # Execute the JJOB -"${HOMEgfs}/jobs/JGLOBAL_ATMENS_ANALYSIS_RUN" +"${HOMEgfs}/jobs/JGLOBAL_ATMENS_ANALYSIS_LETKF" status=$? exit "${status}" diff --git a/parm/config/gfs/config.atmensanlfv3inc b/parm/config/gfs/config.atmensanlfv3inc new file mode 100644 index 0000000000..2dc73f3f6e --- /dev/null +++ b/parm/config/gfs/config.atmensanlfv3inc @@ -0,0 +1,14 @@ +#! /usr/bin/env bash + +########## config.atmensanlfv3inc ########## +# Atm Var Analysis specific + +echo "BEGIN: config.atmensanlfv3inc" + +# Get task specific resources +. "${EXPDIR}/config.resources" atmensanlfv3inc + +export JCB_ALGO=fv3jedi_fv3inc_lgetkf +export JEDIEXE=${EXECgfs}/fv3jedi_fv3inc.x + +echo "END: config.atmensanlfv3inc" diff --git a/parm/config/gfs/config.atmensanlletkf b/parm/config/gfs/config.atmensanlletkf new file mode 100644 index 0000000000..1fdc57ae62 --- /dev/null +++ b/parm/config/gfs/config.atmensanlletkf @@ -0,0 +1,11 @@ +#! /usr/bin/env bash + +########## config.atmensanlletkf ########## +# Atm Ens Analysis specific + +echo "BEGIN: config.atmensanlletkf" + +# Get task specific resources +. "${EXPDIR}/config.resources" atmensanlletkf + +echo "END: config.atmensanlletkf" diff --git a/parm/config/gfs/config.atmensanlrun b/parm/config/gfs/config.atmensanlrun deleted file mode 100644 index 01f211a17a..0000000000 --- a/parm/config/gfs/config.atmensanlrun +++ /dev/null @@ -1,11 +0,0 @@ -#! /usr/bin/env bash - -########## config.atmensanlrun ########## -# Atm Ens Analysis specific - -echo "BEGIN: config.atmensanlrun" - -# Get task specific resources -. "${EXPDIR}/config.resources" atmensanlrun - -echo "END: config.atmensanlrun" diff --git a/parm/config/gfs/config.resources b/parm/config/gfs/config.resources index c583e0c04e..affb0da04f 100644 --- a/parm/config/gfs/config.resources +++ b/parm/config/gfs/config.resources @@ -11,7 +11,7 @@ if (( $# != 1 )); then echo "stage_ic aerosol_init" echo "prep prepsnowobs prepatmiodaobs" echo "atmanlinit atmanlvar atmanlfv3inc atmanlfinal" - echo "atmensanlinit atmensanlrun atmensanlfinal" + echo "atmensanlinit atmensanlletkf atmensanlfv3inc atmensanlfinal" echo "snowanl" echo "aeroanlinit aeroanlrun aeroanlfinal" echo "anal sfcanl analcalc analdiag fcst echgres" @@ -957,17 +957,31 @@ case ${step} in export memory_atmensanlinit="3072M" ;; - "atmensanlrun") + "atmensanlletkf") export layout_x=${layout_x_atmensanl} export layout_y=${layout_y_atmensanl} - export wtime_atmensanlrun="00:30:00" - export npe_atmensanlrun=$(( layout_x * layout_y * 6 )) - export npe_atmensanlrun_gfs=$(( layout_x * layout_y * 6 )) - export nth_atmensanlrun=1 - export nth_atmensanlrun_gfs=${nth_atmensanlrun} - export npe_node_atmensanlrun=$(( npe_node_max / nth_atmensanlrun )) - export memory_atmensanlrun="96GB" + export wtime_atmensanlletkf="00:30:00" + export npe_atmensanlletkf=$(( layout_x * layout_y * 6 )) + export npe_atmensanlletkf_gfs=$(( layout_x * layout_y * 6 )) + export nth_atmensanlletkf=1 + export nth_atmensanlletkf_gfs=${nth_atmensanlletkf} + export npe_node_atmensanlletkf=$(( npe_node_max / nth_atmensanlletkf )) + export memory_atmensanlletkf="96GB" + export is_exclusive=True + ;; + + "atmensanlfv3inc") + export layout_x=${layout_x_atmensanl} + export layout_y=${layout_y_atmensanl} + + export wtime_atmensanlfv3inc="00:30:00" + export npe_atmensanlfv3inc=$(( layout_x * layout_y * 6 )) + export npe_atmensanlfv3inc_gfs=$(( layout_x * layout_y * 6 )) + export nth_atmensanlfv3inc=1 + export nth_atmensanlfv3inc_gfs=${nth_atmensanlfv3inc} + export npe_node_atmensanlfv3inc=$(( npe_node_max / nth_atmensanlfv3inc )) + export memory_atmensanlfv3inc="96GB" export is_exclusive=True ;; diff --git a/scripts/exglobal_atm_analysis_fv3_increment.py b/scripts/exglobal_atm_analysis_fv3_increment.py index 57f2e7c9ee..66f6796343 100755 --- a/scripts/exglobal_atm_analysis_fv3_increment.py +++ b/scripts/exglobal_atm_analysis_fv3_increment.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 # exglobal_atm_analysis_fv3_increment.py # This script creates an AtmAnalysis object -# and runs the increment method -# which converts the JEDI increment into an FV3 increment +# and runs the init_fv3_increment and fv3_increment methods +# which convert the JEDI increment into an FV3 increment import os from wxflow import Logger, cast_strdict_as_dtypedict diff --git a/scripts/exglobal_atmens_analysis_fv3_increment.py b/scripts/exglobal_atmens_analysis_fv3_increment.py new file mode 100755 index 0000000000..c50b00548f --- /dev/null +++ b/scripts/exglobal_atmens_analysis_fv3_increment.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +# exglobal_atmens_analysis_fv3_increment.py +# This script creates an AtmEnsAnalysis object +# and runs the init_fv3_increment and fv3_increment methods +# which convert the JEDI increment into an FV3 increment +import os + +from wxflow import Logger, cast_strdict_as_dtypedict +from pygfs.task.atmens_analysis import AtmEnsAnalysis + +# Initialize root logger +logger = Logger(level='DEBUG', colored_log=True) + + +if __name__ == '__main__': + + # Take configuration from environment and cast it as python dictionary + config = cast_strdict_as_dtypedict(os.environ) + + # Instantiate the atmens analysis task + AtmEnsAnl = AtmEnsAnalysis(config) + AtmEnsAnl.init_fv3_increment() + AtmEnsAnl.fv3_increment() diff --git a/scripts/exglobal_atmens_analysis_run.py b/scripts/exglobal_atmens_analysis_letkf.py similarity index 86% rename from scripts/exglobal_atmens_analysis_run.py rename to scripts/exglobal_atmens_analysis_letkf.py index b2eb9fb2e4..30394537cd 100755 --- a/scripts/exglobal_atmens_analysis_run.py +++ b/scripts/exglobal_atmens_analysis_letkf.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 -# exglobal_atmens_analysis_run.py +# exglobal_atmens_analysis_letkf.py # This script creates an AtmEnsAnalysis object -# and runs the execute method +# and runs the letkf method # which executes the global atm local ensemble analysis import os @@ -19,4 +19,4 @@ # Instantiate the atmens analysis task AtmEnsAnl = AtmEnsAnalysis(config) - AtmEnsAnl.execute() + AtmEnsAnl.letkf() diff --git a/sorc/gdas.cd b/sorc/gdas.cd index 249e242e33..6742ec62a1 160000 --- a/sorc/gdas.cd +++ b/sorc/gdas.cd @@ -1 +1 @@ -Subproject commit 249e242e33a33feeb1c81bedd51198309f669de0 +Subproject commit 6742ec62a12d7d6f8129057bcf77cee0e2175022 diff --git a/sorc/gsi_utils.fd b/sorc/gsi_utils.fd index 0cdc3b4f7f..bb03e172e0 160000 --- a/sorc/gsi_utils.fd +++ b/sorc/gsi_utils.fd @@ -1 +1 @@ -Subproject commit 0cdc3b4f7ff8d4f0c54da3dab70ea2743bd68478 +Subproject commit bb03e172e0d0d9c56d6da7788ca033bfb5ef5119 diff --git a/ush/python/pygfs/task/atmens_analysis.py b/ush/python/pygfs/task/atmens_analysis.py index 5aaacc42e8..37ac613736 100644 --- a/ush/python/pygfs/task/atmens_analysis.py +++ b/ush/python/pygfs/task/atmens_analysis.py @@ -132,7 +132,7 @@ def initialize(self: Analysis) -> None: FileHandler({'mkdir': newdirs}).sync() @logit(logger) - def execute(self: Analysis) -> None: + def letkf(self: Analysis) -> None: """Execute a global atmens analysis This method will execute a global atmens analysis using JEDI. @@ -150,8 +150,9 @@ def execute(self: Analysis) -> None: """ chdir(self.task_config.DATA) - exec_cmd = Executable(self.task_config.APRUN_ATMENSANL) + exec_cmd = Executable(self.task_config.APRUN_ATMENSANLLETKF) exec_name = os.path.join(self.task_config.DATA, 'gdas.x') + exec_cmd.add_default_arg(exec_name) exec_cmd.add_default_arg('fv3jedi') exec_cmd.add_default_arg('localensembleda') @@ -167,6 +168,31 @@ def execute(self: Analysis) -> None: pass + @logit(logger) + def init_fv3_increment(self: Analysis) -> None: + # Setup JEDI YAML file + self.task_config.jedi_yaml = os.path.join(self.runtime_config.DATA, + f"{self.task_config.JCB_ALGO}.yaml") + save_as_yaml(self.get_jedi_config(self.task_config.JCB_ALGO), self.task_config.jedi_yaml) + + # Link JEDI executable to run directory + self.task_config.jedi_exe = self.link_jediexe() + + @logit(logger) + def fv3_increment(self: Analysis) -> None: + # Run executable + exec_cmd = Executable(self.task_config.APRUN_ATMENSANLFV3INC) + exec_cmd.add_default_arg(self.task_config.jedi_exe) + exec_cmd.add_default_arg(self.task_config.jedi_yaml) + + try: + logger.debug(f"Executing {exec_cmd}") + exec_cmd() + except OSError: + raise OSError(f"Failed to execute {exec_cmd}") + except Exception: + raise WorkflowException(f"An error occured during execution of {exec_cmd}") + @logit(logger) def finalize(self: Analysis) -> None: """Finalize a global atmens analysis @@ -218,42 +244,6 @@ def finalize(self: Analysis) -> None: } FileHandler(yaml_copy).sync() - # Create UFS model readable atm increment file from UFS-DA atm increment - logger.info("Create UFS model readable atm increment file from UFS-DA atm increment") - self.jedi2fv3inc() - - def clean(self): - super().clean() - - @logit(logger) - def jedi2fv3inc(self: Analysis) -> None: - """Generate UFS model readable analysis increment - - This method writes a UFS DA atm increment in UFS model readable format. - This includes: - - write UFS-DA atm increments using variable names expected by UFS model - - compute and write delp increment - - compute and write hydrostatic delz increment - - Please note that some of these steps are temporary and will be modified - once the modle is able to directly read atm increments. - - Parameters - ---------- - Analysis: parent class for GDAS task - - Returns - ---------- - None - """ - # Select the atm guess file based on the analysis and background resolutions - # Fields from the atm guess are used to compute the delp and delz increments - cdate = to_fv3time(self.task_config.current_cycle) - cdate_inc = cdate.replace('.', '_') - - # Reference the python script which does the actual work - incpy = os.path.join(self.task_config.HOMEgfs, 'ush/jediinc2fv3.py') - # create template dictionaries template_inc = self.task_config.COM_ATMOS_ANALYSIS_TMPL tmpl_inc_dict = { @@ -263,14 +253,10 @@ def jedi2fv3inc(self: Analysis) -> None: 'HH': self.task_config.current_cycle.strftime('%H') } - template_ges = self.task_config.COM_ATMOS_HISTORY_TMPL - tmpl_ges_dict = { - 'ROTDIR': self.task_config.ROTDIR, - 'RUN': self.task_config.RUN, - 'YMD': to_YMD(self.task_config.previous_cycle), - 'HH': self.task_config.previous_cycle.strftime('%H') - } - + # copy FV3 atm increment to comrot directory + logger.info("Copy UFS model readable atm increment file") + cdate = to_fv3time(self.task_config.current_cycle) + cdate_inc = cdate.replace('.', '_') # loop over ensemble members for imem in range(1, self.task_config.NMEM_ENS + 1): memchar = f"mem{imem:03d}" @@ -278,20 +264,15 @@ def jedi2fv3inc(self: Analysis) -> None: # create output path for member analysis increment tmpl_inc_dict['MEMDIR'] = memchar incdir = Template.substitute_structure(template_inc, TemplateConstants.DOLLAR_CURLY_BRACE, tmpl_inc_dict.get) + src = os.path.join(self.task_config.DATA, 'anl', memchar, f"atminc.{cdate_inc}z.nc4") + dest = os.path.join(incdir, f"{self.task_config.CDUMP}.t{self.task_config.cyc:02d}z.atminc.nc") + + # copy increment + logger.debug(f"Copying {src} to {dest}") + inc_copy = { + 'copy': [[src, dest]] + } + FileHandler(inc_copy).sync() - # rewrite UFS-DA atmens increments - tmpl_ges_dict['MEMDIR'] = memchar - gesdir = Template.substitute_structure(template_ges, TemplateConstants.DOLLAR_CURLY_BRACE, tmpl_ges_dict.get) - atmges_fv3 = os.path.join(gesdir, f"{self.task_config.CDUMP}.t{self.task_config.previous_cycle.hour:02d}z.atmf006.nc") - atminc_jedi = os.path.join(self.task_config.DATA, 'anl', memchar, f'atminc.{cdate_inc}z.nc4') - atminc_fv3 = os.path.join(incdir, f"{self.task_config.CDUMP}.t{self.task_config.cyc:02d}z.atminc.nc") - - # Execute incpy to create the UFS model atm increment file - # TODO: use MPMD or parallelize with mpi4py - # See https://github.com/NOAA-EMC/global-workflow/pull/1373#discussion_r1173060656 - cmd = Executable(incpy) - cmd.add_default_arg(atmges_fv3) - cmd.add_default_arg(atminc_jedi) - cmd.add_default_arg(atminc_fv3) - logger.debug(f"Executing {cmd}") - cmd(output='stdout', error='stderr') + def clean(self): + super().clean() diff --git a/workflow/applications/applications.py b/workflow/applications/applications.py index adfab16496..50a9a7cdd0 100644 --- a/workflow/applications/applications.py +++ b/workflow/applications/applications.py @@ -155,7 +155,7 @@ def _source_configs(self, conf: Configuration) -> Dict[str, Any]: files += ['config.fcst', 'config.efcs'] elif config in ['atmanlinit', 'atmanlvar', 'atmanlfv3inc']: files += ['config.atmanl', f'config.{config}'] - elif config in ['atmensanlinit', 'atmensanlrun']: + elif config in ['atmensanlinit', 'atmensanlletkf', 'atmensanlfv3inc']: files += ['config.atmensanl', f'config.{config}'] elif 'wave' in config: files += ['config.wave', f'config.{config}'] diff --git a/workflow/applications/gfs_cycled.py b/workflow/applications/gfs_cycled.py index ad13876528..f7f9b5b5e6 100644 --- a/workflow/applications/gfs_cycled.py +++ b/workflow/applications/gfs_cycled.py @@ -57,7 +57,7 @@ def _get_app_configs(self): if self.do_hybvar: if self.do_jediatmens: - configs += ['atmensanlinit', 'atmensanlrun', 'atmensanlfinal'] + configs += ['atmensanlinit', 'atmensanlletkf', 'atmensanlfv3inc', 'atmensanlfinal'] else: configs += ['eobs', 'eomg', 'ediag', 'eupd'] configs += ['ecen', 'esfc', 'efcs', 'echgres', 'epos', 'earc'] @@ -161,7 +161,7 @@ def get_task_names(self): hybrid_after_eupd_tasks = [] if self.do_hybvar: if self.do_jediatmens: - hybrid_tasks += ['atmensanlinit', 'atmensanlrun', 'atmensanlfinal', 'echgres'] + hybrid_tasks += ['atmensanlinit', 'atmensanlletkf', 'atmensanlfv3inc', 'atmensanlfinal', 'echgres'] else: hybrid_tasks += ['eobs', 'eupd', 'echgres'] hybrid_tasks += ['ediag'] if self.lobsdiag_forenkf else ['eomg'] diff --git a/workflow/rocoto/gfs_tasks.py b/workflow/rocoto/gfs_tasks.py index d61060a596..24da085bcc 100644 --- a/workflow/rocoto/gfs_tasks.py +++ b/workflow/rocoto/gfs_tasks.py @@ -2397,7 +2397,7 @@ def atmensanlinit(self): return task - def atmensanlrun(self): + def atmensanlletkf(self): deps = [] dep_dict = {'type': 'task', 'name': f'{self.cdump}atmensanlinit'} @@ -2406,14 +2406,40 @@ def atmensanlrun(self): deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) - resources = self.get_resource('atmensanlrun') - task_name = f'{self.cdump}atmensanlrun' + resources = self.get_resource('atmensanlletkf') + task_name = f'{self.cdump}atmensanlletkf' task_dict = {'task_name': task_name, 'resources': resources, 'dependency': dependencies, 'envars': self.envars, 'cycledef': self.cdump.replace('enkf', ''), - 'command': f'{self.HOMEgfs}/jobs/rocoto/atmensanlrun.sh', + 'command': f'{self.HOMEgfs}/jobs/rocoto/atmensanlletkf.sh', + 'job_name': f'{self.pslot}_{task_name}_@H', + 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log', + 'maxtries': '&MAXTRIES;' + } + + task = rocoto.create_task(task_dict) + + return task + + def atmensanlfv3inc(self): + + deps = [] + dep_dict = {'type': 'task', 'name': f'{self.cdump}atmensanlletkf'} + deps.append(rocoto.add_dependency(dep_dict)) + dep_dict = {'type': 'metatask', 'name': 'enkfgdasepmn', 'offset': f"-{timedelta_to_HMS(self._base['cycle_interval'])}"} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) + + resources = self.get_resource('atmensanlfv3inc') + task_name = f'{self.cdump}atmensanlfv3inc' + task_dict = {'task_name': task_name, + 'resources': resources, + 'dependency': dependencies, + 'envars': self.envars, + 'cycledef': self.cdump.replace('enkf', ''), + 'command': f'{self.HOMEgfs}/jobs/rocoto/atmensanlfv3inc.sh', 'job_name': f'{self.pslot}_{task_name}_@H', 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log', 'maxtries': '&MAXTRIES;' @@ -2426,7 +2452,7 @@ def atmensanlrun(self): def atmensanlfinal(self): deps = [] - dep_dict = {'type': 'task', 'name': f'{self.cdump}atmensanlrun'} + dep_dict = {'type': 'task', 'name': f'{self.cdump}atmensanlfv3inc'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) diff --git a/workflow/rocoto/tasks.py b/workflow/rocoto/tasks.py index a8b4eb9fac..eb13941002 100644 --- a/workflow/rocoto/tasks.py +++ b/workflow/rocoto/tasks.py @@ -18,7 +18,7 @@ class Tasks: 'ocnanalprep', 'ocnanalbmat', 'ocnanalrun', 'ocnanalecen', 'ocnanalchkpt', 'ocnanalpost', 'ocnanalvrfy', 'earc', 'ecen', 'echgres', 'ediag', 'efcs', 'eobs', 'eomg', 'epos', 'esfc', 'eupd', - 'atmensanlinit', 'atmensanlrun', 'atmensanlfinal', + 'atmensanlinit', 'atmensanlletkf', 'atmensanlfv3inc', 'atmensanlfinal', 'aeroanlinit', 'aeroanlrun', 'aeroanlfinal', 'prepsnowobs', 'snowanl', 'fcst', From bb58e064d8e82ce51802bd6064cfa84cae2cc4d5 Mon Sep 17 00:00:00 2001 From: GwenChen-NOAA <95313292+GwenChen-NOAA@users.noreply.github.com> Date: Tue, 28 May 2024 17:17:11 -0400 Subject: [PATCH 07/45] Change GRIB2 parameter names and vertical levels for ocean/ice post (#2611) Based on users' feedback, this PR do the following: 1. Change GRIB2 parameter names DLWRF -> NLWRF and DSWRF -> NSWRF 2. Change the vertical level of ocean 3D variables (WTMP, SALIN, UOGRD, and VOGRD) from "%g m below water surface" to "%g m below sea level" 3. Round up depth numbers to integer (e.g. 4481.0625 -> 4481 m) Co-authored-by: Rahul Mahajan --- parm/post/oceanice_products.yaml | 4 ++-- ush/oceanice_nc2grib2.sh | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/parm/post/oceanice_products.yaml b/parm/post/oceanice_products.yaml index 8d8bcd4b51..48e5a5f204 100644 --- a/parm/post/oceanice_products.yaml +++ b/parm/post/oceanice_products.yaml @@ -29,9 +29,9 @@ ocean: cosvar: "cos_rot" angvar: "" {% if model_grid == 'mx025' or model_grid == 'mx050' or model_grid == 'mx100' %} - ocean_levels: [5, 15, 25, 35, 45, 55, 65, 75, 85, 95, 105, 115, 125, 135, 145, 155, 165, 175, 185, 195, 205, 215, 225.86945, 241.06255, 266.5239, 308.7874, 373.9288, 467.3998, 593.87915, 757.1453, 959.97325, 1204.059, 1489.9735, 1817.1455, 2183.879, 2587.3995, 3023.9285, 3488.7875, 3976.524, 4481.0625] + ocean_levels: [5, 15, 25, 35, 45, 55, 65, 75, 85, 95, 105, 115, 125, 135, 145, 155, 165, 175, 185, 195, 205, 215, 226, 241, 267, 309, 374, 467, 594, 757, 960, 1204, 1490, 1817, 2184, 2587, 3024, 3489, 3977, 4481] {% elif model_grid == 'mx500' %} - ocean_levels: [5, 15, 25, 35, 45, 55, 65, 75, 85, 95, 105, 115, 125, 135, 145, 155, 165, 175, 185, 195, 205, 215, 225.86945, 241.06255, 266.5239] + ocean_levels: [5, 15, 25, 35, 45, 55, 65, 75, 85, 95, 105, 115, 125, 135, 145, 155, 165, 175, 185, 195, 205, 215, 226, 241, 267] {% endif %} subset: ['SSH', 'SST', 'SSS', 'speed', 'MLD_003', 'latent', 'sensible', 'SW', 'LW', 'LwLatSens', 'Heat_PmE', 'SSU', 'SSV', 'taux', 'tauy', 'temp', 'so', 'uo', 'vo'] data_in: diff --git a/ush/oceanice_nc2grib2.sh b/ush/oceanice_nc2grib2.sh index 2afd0e07f2..5781e06b36 100755 --- a/ush/oceanice_nc2grib2.sh +++ b/ush/oceanice_nc2grib2.sh @@ -45,23 +45,23 @@ function _ice_nc2grib2 { # tables in wgrib2 v2.0.8: # -import_netcdf "${infile}" "hs_h" "0:1:${latlon_dims}" \ -# -set_var ??? -set center 7 \ +# -set_var SNVOLSI -set center 7 \ # -set_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \ # -set_scaling same same -set_grib_type c1 -grib_out "${outfile}" \ # -import_netcdf "${infile}" "frzmlt_h" "0:1:${latlon_dims}" \ -# -set_var ??? -set center 7 \ +# -set_var FRZMLTPOT -set center 7 \ # -set_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \ # -set_scaling same same -set_grib_type c1 -grib_out "${outfile}" \ # -import_netcdf "${infile}" "albsni_h" "0:1:${latlon_dims}" \ -# -set_var ALBICE -set center 7 -rpn "100.0:/" \ +# -set_var ALBDOICE -set center 7 -rpn "100.0:/" \ # -set_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \ # -set_scaling same same -set_grib_type c1 -grib_out "${outfile}" \ # -import_netcdf "${infile}" "mlt_onset_h" "0:1:${latlon_dims}" \ -# -set_var ??? -set center 7 \ +# -set_var MLTDATE -set center 7 \ # -set_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \ # -set_scaling same same -set_grib_type c1 -grib_out "${outfile}" \ # -import_netcdf "${infile}" "frz_onset_h" "0:1:${latlon_dims}" \ -# -set_var ??? -set center 7 \ +# -set_var FRZDATE -set center 7 \ # -set_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \ # -set_scaling same same -set_grib_type c1 -grib_out "${outfile}" @@ -121,11 +121,11 @@ function _ocean2D_nc2grib2 { -set_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \ -set_scaling same same -set_grib_type c1 -grib_out "${outfile}" \ -import_netcdf "${infile}" "SW" "0:1:${latlon_dims}" \ - -set_var DSWRF -set center 7 \ + -set_var NSWRF -set center 7 \ -set_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \ -set_scaling same same -set_grib_type c1 -grib_out "${outfile}" \ -import_netcdf "${infile}" "LW" "0:1:${latlon_dims}" \ - -set_var DLWRF -set center 7 \ + -set_var NLWRF -set center 7 \ -set_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \ -set_scaling same same -set_grib_type c1 -grib_out "${outfile}" \ -import_netcdf "${infile}" "LwLatSens" "0:1:${latlon_dims}" \ @@ -187,22 +187,22 @@ function _ocean3D_nc2grib2 { ${WGRIB2} "${template}" \ -import_netcdf "${infile}" "temp" "0:1:${zl}:1:${latlon_dims}" \ -set_var WTMP -set center 7 -rpn "273.15:+" \ - -set_lev "${depth} m below water surface" \ + -set_lev "${depth} m below sea level" \ -set_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \ -set_scaling same same -set_grib_type c1 -grib_out tmp.gb2 \ -import_netcdf "${infile}" "so" "0:1:${zl}:1:${latlon_dims}" \ -set_var SALIN -set center 7 \ - -set_lev "${depth} m below water surface" \ + -set_lev "${depth} m below sea level" \ -set_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \ -set_scaling same same -set_grib_type c1 -grib_out tmp.gb2 \ -import_netcdf "${infile}" "uo" "0:1:${zl}:1:${latlon_dims}" \ -set_var UOGRD -set center 7 \ - -set_lev "${depth} m below water surface" \ + -set_lev "${depth} m below sea level" \ -set_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \ -set_scaling same same -set_grib_type c1 -grib_out tmp.gb2 \ -import_netcdf "${infile}" "vo" "0:1:${zl}:1:${latlon_dims}" \ -set_var VOGRD -set center 7 \ - -set_lev "${depth} m below water surface" \ + -set_lev "${depth} m below sea level" \ -set_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \ -set_scaling same same -set_grib_type c1 -grib_out tmp.gb2 From 2e885d05c64b947f00a3cf055a1277fbfac195c9 Mon Sep 17 00:00:00 2001 From: TerrenceMcGuinness-NOAA Date: Wed, 29 May 2024 13:00:51 -0400 Subject: [PATCH 08/45] Script to keep Jenkins Agent persistent from cron (#2634) This "persistent" Java Agent launch script can be ran from a cron job: - Uses Jenkins Remote API to check the status of the Node connection using curl for a given machine. - If it is not connected a new agent is launched for that node. Resolves #2633 --- ci/platforms/config.hera | 3 ++ ci/platforms/config.hercules | 3 ++ ci/platforms/config.orion | 3 ++ ci/scripts/utils/launch_java_agent.sh | 77 +++++++++++++++++++++++++++ 4 files changed, 86 insertions(+) create mode 100755 ci/scripts/utils/launch_java_agent.sh diff --git a/ci/platforms/config.hera b/ci/platforms/config.hera index 7e85bb33da..6d3e43c820 100644 --- a/ci/platforms/config.hera +++ b/ci/platforms/config.hera @@ -5,3 +5,6 @@ export ICSDIR_ROOT=/scratch1/NCEPDEV/global/glopara/data/ICSDIR export HPC_ACCOUNT=nems export max_concurrent_cases=5 export max_concurrent_pr=4 + +export JENKINS_AGENT_LANUCH_DIR=/scratch1/NCEPDEV/global/Terry.McGuinness/Jenkins +export JENKINS_WORK_DIR=/scratch1/NCEPDEV/global/Terry.McGuinness diff --git a/ci/platforms/config.hercules b/ci/platforms/config.hercules index 12846c18a4..5329adae49 100644 --- a/ci/platforms/config.hercules +++ b/ci/platforms/config.hercules @@ -5,3 +5,6 @@ export ICSDIR_ROOT=/work/noaa/global/glopara/data/ICSDIR export HPC_ACCOUNT=nems export max_concurrent_cases=5 export max_concurrent_pr=4 + +export JENKINS_AGENT_LANUCH_DIR=/home/role-nems/GFS_CI_ROOT_JENKINS/AGENT_mterry +export JENKINS_WORK_DIR=/home/role-nems/GFS_CI_ROOT_JENKINS diff --git a/ci/platforms/config.orion b/ci/platforms/config.orion index 5a7596001b..5171373127 100644 --- a/ci/platforms/config.orion +++ b/ci/platforms/config.orion @@ -5,3 +5,6 @@ export ICSDIR_ROOT=/work/noaa/global/glopara/data/ICSDIR export HPC_ACCOUNT=nems export max_concurrent_cases=5 export max_concurrent_pr=4 + +export JENKINS_AGENT_LANUCH_DIR=/home/role-nems/GFS_CI_ROOT_JENKINS/AGENT_mterry +export JENKINS_WORK_DIR=/home/role-nems/GFS_CI_ROOT_JENKINS diff --git a/ci/scripts/utils/launch_java_agent.sh b/ci/scripts/utils/launch_java_agent.sh new file mode 100755 index 0000000000..a4e664724b --- /dev/null +++ b/ci/scripts/utils/launch_java_agent.sh @@ -0,0 +1,77 @@ +#!/bin/env bash +set -e + +controller_url="https://jenkins.epic.oarcloud.noaa.gov" +controller_user="terry.mcguinness" +HOMEgfs="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." >/dev/null 2>&1 && pwd )" +host=$(hostname) + +######################################################################### +# Set up runtime environment varibles for accounts on supproted machines +######################################################################### + +source "${HOMEgfs}/ush/detect_machine.sh" +case ${MACHINE_ID} in + hera | orion | hercules | wcoss2) + echo "Launch Jenkins Java Controler on ${MACHINE_ID}" + ;; + *) + echo "Unsupported platform. Exiting with error." + exit 1 + ;; +esac + +LOG=lanuched_agent-$(date +%Y%m%d%M).log +rm -f "${LOG}" + +source "${HOMEgfs}/ush/module-setup.sh" +module use "${HOMEgfs}/modulefiles" +module load "module_gwsetup.${MACHINE_ID}" +source "${HOMEgfs}/ci/platforms/config.${MACHINE_ID}" + +JAVA_HOME="${JENKINS_AGENT_LANUCH_DIR}/JAVA/jdk-17.0.10" +if [[ ! -d "${JAVA_HOME}" ]]; then + JAVA_HOME=/usr/lib/jvm/jre-17 + if [[ ! -d "${JAVA_HOME}" ]]; then + echo "ERROR: JAVA_HOME not found. Exiting with error." + exit 1 + fi +fi + +JAVA="${JAVA_HOME}/bin/java" +echo "JAVA VERSION: " +${JAVA} -version + +export GH="${HOME}/bin/gh" +command -v "${GH}" +${GH} --version + +if [[ -d "${JENKINS_AGENT_LANUCH_DIR}" ]]; then + echo "Jenkins Agent Lanuch Directory: ${JENKINS_AGENT_LANUCH_DIR}" +else + echo "ERROR: Jenkins Agent Lanuch Directory not found. Exiting with error." + exit 1 +fi +cd "${JENKINS_AGENT_LANUCH_DIR}" + +if ! [[ -f agent.jar ]]; then + curl -sO "${controller_url}/jnlpJars/agent.jar" +fi + +JENKINS_TOKEN=$(cat jenkins_token) + +# +offline=$(curl --silent -u "${controller_user}:${JENKINS_TOKEN}" "${controller_url}/computer/${MACHINE_ID^}-EMC/api/json?pretty=true" | grep '\"offline\"' | awk '{gsub(/,/,"");print $3}') || true +echo "Jenkins Agent offline setting: ${offline}" + +if [[ "${offline}" == "true" ]]; then + echo "Jenkins Agent is offline. Lanuching Jenkins Agent on ${host}" + command="nohup ${JAVA} -jar agent.jar -jnlpUrl ${controller_url}/computer/${MACHINE_ID^}-EMC/jenkins-agent.jnlp -secret @jenkins-secret-file -workDir ${JENKINS_WORK_DIR}" + echo -e "Lanuching Jenkins Agent on ${host} with the command:\n${command}" >& "${LOG}" + ${command} >> "${LOG}" 2>&1 & + nohup_PID=$! + echo "Java agent running on PID: ${nohup_PID}" >> "${LOG}" 2>&1 + echo "Java agent running on PID: ${nohup_PID}" +else + echo "Jenkins Agent is online (nothing done)" +fi From 0b4670ecf83b99b72835c8380573b2bca7cf5324 Mon Sep 17 00:00:00 2001 From: Jessica Meixner Date: Wed, 29 May 2024 17:17:21 -0400 Subject: [PATCH 09/45] Add C384mx025_3DVarAOWCDA yamls (#2625) Adds the C384mx025_3DVarAOWCDA yaml files for one experiment into a new GFSv17 folder. --- ci/cases/gfsv17/C384mx025_3DVarAOWCDA.yaml | 18 +++++++++++++ ci/cases/gfsv17/ocnanal.yaml | 30 ++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 ci/cases/gfsv17/C384mx025_3DVarAOWCDA.yaml create mode 100644 ci/cases/gfsv17/ocnanal.yaml diff --git a/ci/cases/gfsv17/C384mx025_3DVarAOWCDA.yaml b/ci/cases/gfsv17/C384mx025_3DVarAOWCDA.yaml new file mode 100644 index 0000000000..d97c9567e9 --- /dev/null +++ b/ci/cases/gfsv17/C384mx025_3DVarAOWCDA.yaml @@ -0,0 +1,18 @@ +experiment: + system: gfs + mode: cycled + +arguments: + pslot: {{ 'pslot' | getenv }} + app: S2S + resdetatmos: 384 + resdetocean: 0.25 + nens: 0 + gfs_cyc: 4 + start: cold + comroot: {{ 'RUNTESTS' | getenv }}/COMROOT + expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR + idate: 2021063000 + edate: 2021070306 + icsdir: /scratch1/NCEPDEV/climate/Jessica.Meixner/cycling/IC_2021063000_V2 + yaml: {{ HOMEgfs }}/ci/cases/gfsv17/ocnanal.yaml diff --git a/ci/cases/gfsv17/ocnanal.yaml b/ci/cases/gfsv17/ocnanal.yaml new file mode 100644 index 0000000000..9024afcb31 --- /dev/null +++ b/ci/cases/gfsv17/ocnanal.yaml @@ -0,0 +1,30 @@ +defaults: + !INC {{ HOMEgfs }}/parm/config/gfs/yaml/defaults.yaml + +base: + DOIAU: "YES" + DO_JEDIATMVAR: "NO" + DO_JEDIATMENS: "NO" + DO_JEDIOCNVAR: "YES" + DO_JEDISNOWDA: "NO" + DO_MERGENSST: "NO" + DOHYBVAR: "NO" + DO_FIT2OBS: "YES" + DO_VERFOZN: "YES" + DO_VERFRAD: "YES" + DO_VRFY_OCEANDA: "NO" + FHMAX_GFS: 240 + +ocnanal: + SOCA_INPUT_FIX_DIR: /scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/1440x1080x75/soca + CASE_ANL: 'C24' + SOCA_OBS_LIST: {{ HOMEgfs }}/sorc/gdas.cd/parm/soca/obs/obs_list.yaml + SOCA_NINNER: 100 + SABER_BLOCKS_YAML: '' + NICAS_RESOL: 1 + NICAS_GRID_SIZE: 15000 + +prepoceanobs: + SOCA_OBS_LIST: {{ HOMEgfs }}/sorc/gdas.cd/parm/soca/obs/obs_list.yaml + OBSPREP_YAML: {{ HOMEgfs }}/sorc/gdas.cd/parm/soca/obsprep/obsprep_config.yaml + DMPDIR: /scratch1/NCEPDEV/da/common/ From d69a8af95d492982b918670322ed5c41ab074335 Mon Sep 17 00:00:00 2001 From: Jessica Meixner Date: Wed, 29 May 2024 21:29:03 -0400 Subject: [PATCH 10/45] Update to add 1-deg global wave grid (#2619) This PR adds options to use a global 1 deg grid, intended for testing with the SFS application. Requires new fix file changes NOAA-EMC/global-workflow#2618 --- parm/config/gefs/config.base | 2 +- parm/config/gefs/config.ufs | 6 +++++- parm/config/gefs/config.wave | 6 ++++++ parm/config/gfs/config.ufs | 6 +++++- parm/config/gfs/config.wave | 6 ++++++ parm/wave/ww3_grib2.glo_100.inp.tmpl | 9 +++++++++ scripts/exgfs_wave_post_gridded_sbs.sh | 4 +++- 7 files changed, 35 insertions(+), 4 deletions(-) create mode 100755 parm/wave/ww3_grib2.glo_100.inp.tmpl diff --git a/parm/config/gefs/config.base b/parm/config/gefs/config.base index e98c942dcf..477a04ddfb 100644 --- a/parm/config/gefs/config.base +++ b/parm/config/gefs/config.base @@ -163,7 +163,7 @@ case "${CASE}" in export waveGRD='glo_500' ;; "C96" | "C192") - export waveGRD='glo_200' + export waveGRD='glo_100' ;; "C384") export waveGRD='glo_025' diff --git a/parm/config/gefs/config.ufs b/parm/config/gefs/config.ufs index 9b42e4aa82..9c39bf06de 100644 --- a/parm/config/gefs/config.ufs +++ b/parm/config/gefs/config.ufs @@ -15,7 +15,7 @@ if (( $# <= 1 )); then echo "--fv3 C48|C96|C192|C384|C768|C1152|C3072" echo "--mom6 500|100|025" echo "--cice6 500|100|025" - echo "--ww3 gnh_10m;aoc_9km;gsh_15m|gwes_30m|glo_025|glo_200|glo_500|mx025" + echo "--ww3 gnh_10m;aoc_9km;gsh_15m|gwes_30m|glo_025|glo_200|glo_500|mx025|glo_100" echo "--gocart" exit 1 @@ -456,6 +456,10 @@ if [[ "${skip_ww3}" == "false" ]]; then "glo_025") ntasks_ww3=262 ;; + "glo_100") + ntasks_ww3=20 + nthreads_ww3=1 + ;; "glo_200") ntasks_ww3=30 nthreads_ww3=1 diff --git a/parm/config/gefs/config.wave b/parm/config/gefs/config.wave index 66f19296cb..b61a2f6e54 100644 --- a/parm/config/gefs/config.wave +++ b/parm/config/gefs/config.wave @@ -56,6 +56,12 @@ case "${waveGRD}" in export wavepostGRD='glo_025' export waveuoutpGRD=${waveGRD} ;; + "glo_100") + #Global regular lat/lon 1deg deg grid + export waveinterpGRD='' + export wavepostGRD='glo_100' + export waveuoutpGRD=${waveGRD} + ;; "glo_200") #Global regular lat/lon 2deg deg grid export waveinterpGRD='' diff --git a/parm/config/gfs/config.ufs b/parm/config/gfs/config.ufs index a7dabd3d0e..9f6c47ce72 100644 --- a/parm/config/gfs/config.ufs +++ b/parm/config/gfs/config.ufs @@ -15,7 +15,7 @@ if (( $# <= 1 )); then echo "--fv3 C48|C96|C192|C384|C768|C1152|C3072" echo "--mom6 500|100|025" echo "--cice6 500|100|025" - echo "--ww3 gnh_10m;aoc_9km;gsh_15m|gwes_30m|glo_025|glo_200|glo_500|mx025|uglo_100km|uglo_m1g16" + echo "--ww3 gnh_10m;aoc_9km;gsh_15m|gwes_30m|glo_025|glo_100|glo_200|glo_500|mx025|uglo_100km|uglo_m1g16" echo "--gocart" exit 1 @@ -561,6 +561,10 @@ if [[ "${skip_ww3}" == "false" ]]; then "glo_025") ntasks_ww3=262 ;; + "glo_100") + ntasks_ww3=20 + nthreads_ww3=1 + ;; "glo_200") ntasks_ww3=30 nthreads_ww3=1 diff --git a/parm/config/gfs/config.wave b/parm/config/gfs/config.wave index 3c643c7996..7253ef1396 100644 --- a/parm/config/gfs/config.wave +++ b/parm/config/gfs/config.wave @@ -56,6 +56,12 @@ case "${waveGRD}" in export wavepostGRD='glo_025' export waveuoutpGRD=${waveGRD} ;; + "glo_100") + #Global regular lat/lon 1deg deg grid + export waveinterpGRD='' + export wavepostGRD='glo_100' + export waveuoutpGRD=${waveGRD} + ;; "glo_200") #Global regular lat/lon 2deg deg grid export waveinterpGRD='' diff --git a/parm/wave/ww3_grib2.glo_100.inp.tmpl b/parm/wave/ww3_grib2.glo_100.inp.tmpl new file mode 100755 index 0000000000..ddfabdb13d --- /dev/null +++ b/parm/wave/ww3_grib2.glo_100.inp.tmpl @@ -0,0 +1,9 @@ +$ WAVEWATCH-III gridded output input file +$ ---------------------------------------- +TIME DT NT +N +FLAGS +$ +TIME 7 MODNR GRIDNR 0 0 +$ +$ end of input file diff --git a/scripts/exgfs_wave_post_gridded_sbs.sh b/scripts/exgfs_wave_post_gridded_sbs.sh index 3b103b8dd3..cee6d40b49 100755 --- a/scripts/exgfs_wave_post_gridded_sbs.sh +++ b/scripts/exgfs_wave_post_gridded_sbs.sh @@ -287,6 +287,7 @@ source "${USHgfs}/preamble.sh" glo_15mxt) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; reg025) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; glo_025) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; + glo_100) GRDNAME='global' ; GRDRES=1p00 ; GRIDNR=255 ; MODNR=11 ;; glo_200) GRDNAME='global' ; GRDRES=2p00 ; GRIDNR=255 ; MODNR=11 ;; glo_500) GRDNAME='global' ; GRDRES=5p00 ; GRIDNR=255 ; MODNR=11 ;; glo_30mxt) GRDNAME='global' ; GRDRES=0p50 ; GRIDNR=255 ; MODNR=11 ;; @@ -321,7 +322,8 @@ source "${USHgfs}/preamble.sh" glo_15mxt) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; reg025) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; glo_025) GRDNAME='global' ; GRDRES=0p25 ; GRIDNR=255 ; MODNR=11 ;; - glo_200) GRDNAME='global' ; GRDRES=2p00 ; GRIDNR=255 ; MODNR=11 ;; + glo_100) GRDNAME='global' ; GRDRES=1p00 ; GRIDNR=255 ; MODNR=11 ;; + glo_200) GRDNAME='global' ; GRDRES=2p00 ; GRIDNR=255 ; MODNR=11 ;; glo_500) GRDNAME='global' ; GRDRES=5p00 ; GRIDNR=255 ; MODNR=11 ;; gwes_30m) GRDNAME='global' ; GRDRES=0p50 ; GRIDNR=255 ; MODNR=10 ;; esac From a54153fd9d26126206bc07a1da4e80f50c0c5910 Mon Sep 17 00:00:00 2001 From: Walter Kolczynski - NOAA Date: Wed, 29 May 2024 23:24:07 -0400 Subject: [PATCH 11/45] Update forecast job to use COMIN/COMOUT (#2622) NCO has requested that each COM variable specify whether it is an input or an output. This completes that process for the forecast job. Refs #2451 --------- Co-authored-by: David Huber <69919478+DavidHuber-NOAA@users.noreply.github.com> --- jobs/JGLOBAL_FORECAST | 43 +++++++++----- ush/forecast_det.sh | 6 +- ush/forecast_postdet.sh | 120 ++++++++++++++++++++-------------------- ush/forecast_predet.sh | 40 +++++++------- 4 files changed, 113 insertions(+), 96 deletions(-) diff --git a/jobs/JGLOBAL_FORECAST b/jobs/JGLOBAL_FORECAST index 9ae247cdca..9998470618 100755 --- a/jobs/JGLOBAL_FORECAST +++ b/jobs/JGLOBAL_FORECAST @@ -35,34 +35,51 @@ declare -rx gPDY="${GDATE:0:8}" declare -rx gcyc="${GDATE:8:2}" # Construct COM variables from templates (see config.com) -YMD="${PDY}" HH="${cyc}" declare_from_tmpl -rx COM_ATMOS_RESTART COM_ATMOS_INPUT COM_ATMOS_ANALYSIS \ - COM_ICE_ANALYSIS COM_ATMOS_HISTORY COM_ATMOS_MASTER COM_TOP COM_CONF +YMD="${PDY}" HH="${cyc}" declare_from_tmpl -rx \ + COMIN_ATMOS_INPUT:COM_ATMOS_INPUT_TMPL \ + COMIN_ATMOS_ANALYSIS:COM_ATMOS_ANALYSIS_TMPL \ + COMOUT_CONF:COM_CONF_TMPL \ + COMOUT_ATMOS_RESTART:COM_ATMOS_RESTART_TMPL \ + COMOUT_ATMOS_HISTORY:COM_ATMOS_HISTORY_TMPL \ + COMOUT_ATMOS_MASTER:COM_ATMOS_MASTER_TMPL RUN="${rCDUMP}" YMD="${gPDY}" HH="${gcyc}" declare_from_tmpl -rx \ - COM_ATMOS_RESTART_PREV:COM_ATMOS_RESTART_TMPL + COMIN_ATMOS_RESTART_PREV:COM_ATMOS_RESTART_TMPL if [[ "${DO_WAVE}" == "YES" ]]; then - YMD="${PDY}" HH="${cyc}" declare_from_tmpl -rx COM_WAVE_RESTART COM_WAVE_PREP COM_WAVE_HISTORY + YMD="${PDY}" HH="${cyc}" declare_from_tmpl -rx \ + COMIN_WAVE_PREP:COM_WAVE_PREP_TMPL \ + COMOUT_WAVE_RESTART:COM_WAVE_RESTART_TMPL \ + COMOUT_WAVE_HISTORY:COM_WAVE_HISTORY_TMPL RUN="${rCDUMP}" YMD="${gPDY}" HH="${gcyc}" declare_from_tmpl -rx \ - COM_WAVE_RESTART_PREV:COM_WAVE_RESTART_TMPL + COMIN_WAVE_RESTART_PREV:COM_WAVE_RESTART_TMPL fi if [[ "${DO_OCN}" == "YES" ]]; then - YMD="${PDY}" HH="${cyc}" declare_from_tmpl -rx COM_MED_RESTART COM_OCEAN_RESTART COM_OCEAN_INPUT \ - COM_OCEAN_HISTORY COM_OCEAN_ANALYSIS + YMD="${PDY}" HH="${cyc}" declare_from_tmpl -rx \ + COMIN_OCEAN_ANALYSIS:COM_OCEAN_ANALYSIS_TMPL \ + COMIN_OCEAN_INPUT:COM_OCEAN_INPUT_TMPL \ + COMOUT_MED_RESTART:COM_MED_RESTART_TMPL \ + COMOUT_OCEAN_RESTART:COM_OCEAN_RESTART_TMPL \ + COMOUT_OCEAN_HISTORY:COM_OCEAN_HISTORY_TMPL RUN="${rCDUMP}" YMD="${gPDY}" HH="${gcyc}" declare_from_tmpl -rx \ - COM_OCEAN_RESTART_PREV:COM_OCEAN_RESTART_TMPL \ - COM_MED_RESTART_PREV:COM_MED_RESTART_TMPL + COMIN_OCEAN_RESTART_PREV:COM_OCEAN_RESTART_TMPL \ + COMIN_MED_RESTART_PREV:COM_MED_RESTART_TMPL fi if [[ "${DO_ICE}" == "YES" ]]; then - YMD="${PDY}" HH="${cyc}" declare_from_tmpl -rx COM_ICE_HISTORY COM_ICE_INPUT COM_ICE_RESTART + YMD="${PDY}" HH="${cyc}" declare_from_tmpl -rx \ + COMIN_ICE_INPUT:COM_ICE_INPUT_TMPL \ + COMIN_ICE_ANALYSIS:COM_ICE_ANALYSIS_TMPL \ + COMOUT_ICE_RESTART:COM_ICE_RESTART_TMPL \ + COMOUT_ICE_HISTORY:COM_ICE_HISTORY_TMPL RUN="${rCDUMP}" YMD="${gPDY}" HH="${gcyc}" declare_from_tmpl -rx \ - COM_ICE_RESTART_PREV:COM_ICE_RESTART_TMPL + COMIN_ICE_RESTART_PREV:COM_ICE_RESTART_TMPL fi if [[ "${DO_AERO}" == "YES" ]]; then - YMD="${PDY}" HH="${cyc}" declare_from_tmpl -rx COM_CHEM_HISTORY + YMD="${PDY}" HH="${cyc}" declare_from_tmpl -rx \ + COMOUT_CHEM_HISTORY:COM_CHEM_HISTORY_TMPL fi @@ -79,7 +96,7 @@ if [[ "${RUN}" =~ "enkf" ]] && [[ "${SENDDBN:-}" == YES ]]; then for (( fhr = FHOUT; fhr <= FHMAX; fhr + FHOUT )); do if (( fhr % 3 == 0 )); then fhr3=$(printf %03i "${fhr}") - "${DBNROOT}/bin/dbn_alert" MODEL GFS_ENKF "${job}" "${COM_ATMOS_HISTORY}/${RUN}.t${cyc}z.sfcf${fhr3}.nc" + "${DBNROOT}/bin/dbn_alert" MODEL GFS_ENKF "${job}" "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.sfcf${fhr3}.nc" fi done fi diff --git a/ush/forecast_det.sh b/ush/forecast_det.sh index 5e2f277592..603447f612 100755 --- a/ush/forecast_det.sh +++ b/ush/forecast_det.sh @@ -6,7 +6,7 @@ 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 [[ -f "${COM_ATMOS_RESTART_PREV}/${model_start_date_current_cycle:0:8}.${model_start_date_current_cycle:8:2}0000.coupler.res" ]]; then + if [[ -f "${COMIN_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 @@ -16,8 +16,8 @@ UFS_det(){ # Since restarts are not available from the previous cycle, this is likely a cold start # Ensure cold start ICs are present when warm start is not set # TODO: add checks for other cold start ICs as well - if [[ ! -f "${COM_ATMOS_INPUT}/gfs_ctrl.nc" ]]; then - echo "FATAL ERROR: Cold start ICs are missing from '${COM_ATMOS_INPUT}'" + if [[ ! -f "${COMIN_ATMOS_INPUT}/gfs_ctrl.nc" ]]; then + echo "FATAL ERROR: Cold start ICs are missing from '${COMIN_ATMOS_INPUT}'" exit 1 fi diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh index f5a2bec07c..d4d1d4ad6f 100755 --- a/ush/forecast_postdet.sh +++ b/ush/forecast_postdet.sh @@ -22,9 +22,9 @@ FV3_postdet() { done done - echo "Copying FV3 cold start files for 'RUN=${RUN}' at '${current_cycle}' from '${COM_ATMOS_INPUT}'" + echo "Copying FV3 cold start files for 'RUN=${RUN}' at '${current_cycle}' from '${COMIN_ATMOS_INPUT}'" for fv3_input_file in "${fv3_input_files[@]}"; do - ${NCP} "${COM_ATMOS_INPUT}/${fv3_input_file}" "${DATA}/INPUT/${fv3_input_file}" \ + ${NCP} "${COMIN_ATMOS_INPUT}/${fv3_input_file}" "${DATA}/INPUT/${fv3_input_file}" \ || ( echo "FATAL ERROR: Unable to copy FV3 IC, ABORT!"; exit 1 ) done @@ -49,7 +49,7 @@ FV3_postdet() { restart_dir="${DATArestart}/FV3_RESTART" else # "${RERUN}" == "NO" restart_date="${model_start_date_current_cycle}" - restart_dir="${COM_ATMOS_RESTART_PREV}" + restart_dir="${COMIN_ATMOS_RESTART_PREV}" fi echo "Copying FV3 restarts for 'RUN=${RUN}' at '${restart_date}' from '${restart_dir}'" @@ -75,12 +75,12 @@ FV3_postdet() { # Replace sfc_data with sfcanl_data restart files from current cycle (if found) local nn for (( nn = 1; nn <= ntiles; nn++ )); do - if [[ -f "${COM_ATMOS_RESTART}/${restart_date:0:8}.${restart_date:8:2}0000.sfcanl_data.tile${nn}.nc" ]]; then + if [[ -f "${COMOUT_ATMOS_RESTART}/${restart_date:0:8}.${restart_date:8:2}0000.sfcanl_data.tile${nn}.nc" ]]; then rm -f "${DATA}/INPUT/sfc_data.tile${nn}.nc" - ${NCP} "${COM_ATMOS_RESTART}/${restart_date:0:8}.${restart_date:8:2}0000.sfcanl_data.tile${nn}.nc" \ + ${NCP} "${COMOUT_ATMOS_RESTART}/${restart_date:0:8}.${restart_date:8:2}0000.sfcanl_data.tile${nn}.nc" \ "${DATA}/INPUT/sfc_data.tile${nn}.nc" else - echo "'sfcanl_data.tile1.nc' not found in '${COM_ATMOS_RESTART}', using 'sfc_data.tile1.nc'" + echo "'sfcanl_data.tile1.nc' not found in '${COMOUT_ATMOS_RESTART}', using 'sfc_data.tile1.nc'" break fi done @@ -125,7 +125,7 @@ EOF local increment_file for inc_file in "${inc_files[@]}"; do - increment_file="${COM_ATMOS_ANALYSIS}/${RUN}.t${cyc}z.${PREFIX_ATMINC}${inc_file}" + increment_file="${COMIN_ATMOS_ANALYSIS}/${RUN}.t${cyc}z.${PREFIX_ATMINC}${inc_file}" if [[ -f "${increment_file}" ]]; then ${NCP} "${increment_file}" "${DATA}/INPUT/${inc_file}" else @@ -169,26 +169,26 @@ EOF for fhr in ${FV3_OUTPUT_FH}; do FH3=$(printf %03i "${fhr}") FH2=$(printf %02i "${fhr}") - ${NLN} "${COM_ATMOS_HISTORY}/${RUN}.t${cyc}z.atmf${FH3}.nc" "atmf${FH3}.nc" - ${NLN} "${COM_ATMOS_HISTORY}/${RUN}.t${cyc}z.sfcf${FH3}.nc" "sfcf${FH3}.nc" - ${NLN} "${COM_ATMOS_HISTORY}/${RUN}.t${cyc}z.atm.logf${FH3}.txt" "log.atm.f${FH3}" + ${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.atmf${FH3}.nc" "atmf${FH3}.nc" + ${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.sfcf${FH3}.nc" "sfcf${FH3}.nc" + ${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.atm.logf${FH3}.txt" "log.atm.f${FH3}" if [[ "${WRITE_DOPOST}" == ".true." ]]; then - ${NLN} "${COM_ATMOS_MASTER}/${RUN}.t${cyc}z.master.grb2f${FH3}" "GFSPRS.GrbF${FH2}" - ${NLN} "${COM_ATMOS_MASTER}/${RUN}.t${cyc}z.sfluxgrbf${FH3}.grib2" "GFSFLX.GrbF${FH2}" + ${NLN} "${COMOUT_ATMOS_MASTER}/${RUN}.t${cyc}z.master.grb2f${FH3}" "GFSPRS.GrbF${FH2}" + ${NLN} "${COMOUT_ATMOS_MASTER}/${RUN}.t${cyc}z.sfluxgrbf${FH3}.grib2" "GFSFLX.GrbF${FH2}" if [[ "${DO_NEST:-NO}" == "YES" ]] ; then - ${NLN} "${COM_ATMOS_MASTER}/${RUN}.t${cyc}z.nest.grb2f${FH3}" "GFSPRS.GrbF${FH2}.nest02" - ${NLN} "${COM_ATMOS_MASTER}/${RUN}.t${cyc}z.nest.sfluxgrbf${FH3}.grib2" "GFSFLX.GrbF${FH2}.nest02" + ${NLN} "${COMOUT_ATMOS_MASTER}/${RUN}.t${cyc}z.nest.grb2f${FH3}" "GFSPRS.GrbF${FH2}.nest02" + ${NLN} "${COMOUT_ATMOS_MASTER}/${RUN}.t${cyc}z.nest.sfluxgrbf${FH3}.grib2" "GFSFLX.GrbF${FH2}.nest02" fi fi done else # TODO: Is this even valid anymore? local nn for (( nn = 1; nn <= ntiles; nn++ )); do - ${NLN} "nggps2d.tile${nn}.nc" "${COM_ATMOS_HISTORY}/nggps2d.tile${nn}.nc" - ${NLN} "nggps3d.tile${nn}.nc" "${COM_ATMOS_HISTORY}/nggps3d.tile${nn}.nc" - ${NLN} "grid_spec.tile${nn}.nc" "${COM_ATMOS_HISTORY}/grid_spec.tile${nn}.nc" - ${NLN} "atmos_static.tile${nn}.nc" "${COM_ATMOS_HISTORY}/atmos_static.tile${nn}.nc" - ${NLN} "atmos_4xdaily.tile${nn}.nc" "${COM_ATMOS_HISTORY}/atmos_4xdaily.tile${nn}.nc" + ${NLN} "nggps2d.tile${nn}.nc" "${COMOUT_ATMOS_HISTORY}/nggps2d.tile${nn}.nc" + ${NLN} "nggps3d.tile${nn}.nc" "${COMOUT_ATMOS_HISTORY}/nggps3d.tile${nn}.nc" + ${NLN} "grid_spec.tile${nn}.nc" "${COMOUT_ATMOS_HISTORY}/grid_spec.tile${nn}.nc" + ${NLN} "atmos_static.tile${nn}.nc" "${COMOUT_ATMOS_HISTORY}/atmos_static.tile${nn}.nc" + ${NLN} "atmos_4xdaily.tile${nn}.nc" "${COMOUT_ATMOS_HISTORY}/atmos_4xdaily.tile${nn}.nc" done fi } @@ -218,10 +218,10 @@ FV3_out() { # Copy configuration files if [[ "${RUN}" == "gfs" || "${RUN}" == "gefs" ]]; then - ${NCP} "${DATA}/input.nml" "${COM_CONF}/ufs.input.nml" - ${NCP} "${DATA}/model_configure" "${COM_CONF}/ufs.model_configure" - ${NCP} "${DATA}/ufs.configure" "${COM_CONF}/ufs.ufs.configure" - ${NCP} "${DATA}/diag_table" "${COM_CONF}/ufs.diag_table" + ${NCP} "${DATA}/input.nml" "${COMOUT_CONF}/ufs.input.nml" + ${NCP} "${DATA}/model_configure" "${COMOUT_CONF}/ufs.model_configure" + ${NCP} "${DATA}/ufs.configure" "${COMOUT_CONF}/ufs.ufs.configure" + ${NCP} "${DATA}/diag_table" "${COMOUT_CONF}/ufs.diag_table" fi # Create an array of fv3 restart files @@ -244,7 +244,7 @@ FV3_out() { for fv3_restart_file in "${fv3_restart_files[@]}"; do restart_file="${restart_date:0:8}.${restart_date:8:2}0000.${fv3_restart_file}" ${NCP} "${DATArestart}/FV3_RESTART/${restart_file}" \ - "${COM_ATMOS_RESTART}/${restart_file}" + "${COMOUT_ATMOS_RESTART}/${restart_file}" done restart_date=$(date --utc -d "${restart_date:0:8} ${restart_date:8:2} + ${restart_interval} hours" +%Y%m%d%H) done @@ -259,7 +259,7 @@ FV3_out() { 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}" + "${COMOUT_ATMOS_RESTART}/${restart_file}" done fi echo "SUB ${FUNCNAME[0]}: Output data for FV3 copied" @@ -279,7 +279,7 @@ WW3_postdet() { restart_dir="${DATArestart}/WW3_RESTART" else restart_date="${model_start_date_current_cycle}" - restart_dir="${COM_WAVE_RESTART_PREV}" + restart_dir="${COMIN_WAVE_RESTART_PREV}" fi echo "Copying WW3 restarts for 'RUN=${RUN}' at '${restart_date}' from '${restart_dir}'" local ww3_restart_file @@ -308,12 +308,12 @@ WW3_postdet() { # Link output files local wavprfx="${RUN}wave${WAV_MEMBER:-}" if [[ "${waveMULTIGRID}" == ".true." ]]; then - ${NLN} "${COM_WAVE_HISTORY}/${wavprfx}.log.mww3.${PDY}${cyc}" "log.mww3" + ${NLN} "${COMOUT_WAVE_HISTORY}/${wavprfx}.log.mww3.${PDY}${cyc}" "log.mww3" for ww3_grid in ${waveGRD}; do - ${NLN} "${COM_WAVE_HISTORY}/${wavprfx}.log.${ww3_grid}.${PDY}${cyc}" "log.${ww3_grid}" + ${NLN} "${COMOUT_WAVE_HISTORY}/${wavprfx}.log.${ww3_grid}.${PDY}${cyc}" "log.${ww3_grid}" done else - ${NLN} "${COM_WAVE_HISTORY}/${wavprfx}.log.${waveGRD}.${PDY}${cyc}" "log.ww3" + ${NLN} "${COMOUT_WAVE_HISTORY}/${wavprfx}.log.${waveGRD}.${PDY}${cyc}" "log.ww3" fi # Loop for gridded output (uses FHINC) @@ -324,10 +324,10 @@ WW3_postdet() { vdate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${fhr} hours" +%Y%m%d.%H0000) if [[ "${waveMULTIGRID}" == ".true." ]]; then for ww3_grid in ${waveGRD} ; do - ${NLN} "${COM_WAVE_HISTORY}/${wavprfx}.out_grd.${ww3_grid}.${vdate}" "${DATA}/${vdate}.out_grd.${ww3_grid}" + ${NLN} "${COMOUT_WAVE_HISTORY}/${wavprfx}.out_grd.${ww3_grid}.${vdate}" "${DATA}/${vdate}.out_grd.${ww3_grid}" done else - ${NLN} "${COM_WAVE_HISTORY}/${wavprfx}.out_grd.${waveGRD}.${vdate}" "${DATA}/${vdate}.out_grd.ww3" + ${NLN} "${COMOUT_WAVE_HISTORY}/${wavprfx}.out_grd.${waveGRD}.${vdate}" "${DATA}/${vdate}.out_grd.ww3" fi if (( FHMAX_HF_WAV > 0 && FHOUT_HF_WAV > 0 && fhr < FHMAX_HF_WAV )); then fhinc=${FHOUT_HF_WAV} @@ -341,9 +341,9 @@ WW3_postdet() { while (( fhr <= FHMAX_WAV )); do vdate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${fhr} hours" +%Y%m%d.%H0000) if [[ "${waveMULTIGRID}" == ".true." ]]; then - ${NLN} "${COM_WAVE_HISTORY}/${wavprfx}.out_pnt.${waveuoutpGRD}.${vdate}" "${DATA}/${vdate}.out_pnt.${waveuoutpGRD}" + ${NLN} "${COMOUT_WAVE_HISTORY}/${wavprfx}.out_pnt.${waveuoutpGRD}.${vdate}" "${DATA}/${vdate}.out_pnt.${waveuoutpGRD}" else - ${NLN} "${COM_WAVE_HISTORY}/${wavprfx}.out_pnt.${waveuoutpGRD}.${vdate}" "${DATA}/${vdate}.out_pnt.ww3" + ${NLN} "${COMOUT_WAVE_HISTORY}/${wavprfx}.out_pnt.${waveuoutpGRD}.${vdate}" "${DATA}/${vdate}.out_pnt.ww3" fi fhr=$((fhr + fhinc)) done @@ -357,14 +357,14 @@ WW3_nml() { WW3_out() { echo "SUB ${FUNCNAME[0]}: Copying output data for WW3" - # TODO: Need to add logic to copy restarts from DATArestart/WW3_RESTART to COM_WAVE_RESTART + # TODO: Need to add logic to copy restarts from DATArestart/WW3_RESTART to COMOUT_WAVE_RESTART } CPL_out() { echo "SUB ${FUNCNAME[0]}: Copying output data for general cpl fields" if [[ "${esmf_profile:-}" == ".true." ]]; then - ${NCP} "${DATA}/ESMF_Profile.summary" "${COM_ATMOS_HISTORY}/ESMF_Profile.summary" + ${NCP} "${DATA}/ESMF_Profile.summary" "${COMOUT_ATMOS_HISTORY}/ESMF_Profile.summary" fi } @@ -376,7 +376,7 @@ MOM6_postdet() { restart_dir="${DATArestart}/MOM6_RESTART" restart_date="${RERUN_DATE}" else # "${RERUN}" == "NO" - restart_dir="${COM_OCEAN_RESTART_PREV}" + restart_dir="${COMIN_OCEAN_RESTART_PREV}" restart_date="${model_start_date_current_cycle}" fi @@ -399,7 +399,7 @@ MOM6_postdet() { # Copy increment (only when RERUN=NO) if [[ "${RERUN}" == "NO" ]]; then if [[ "${DO_JEDIOCNVAR:-NO}" == "YES" ]]; then - ${NCP} "${COM_OCEAN_ANALYSIS}/${RUN}.t${cyc}z.ocninc.nc" "${DATA}/INPUT/mom6_increment.nc" \ + ${NCP} "${COMIN_OCEAN_ANALYSIS}/${RUN}.t${cyc}z.ocninc.nc" "${DATA}/INPUT/mom6_increment.nc" \ || ( echo "FATAL ERROR: Unable to copy MOM6 increment, ABORT!"; exit 1 ) fi @@ -407,7 +407,7 @@ MOM6_postdet() { # TODO if [[ $RUN} == "gefs" ]] block maybe be needed # to ensure it does not interfere with the GFS when ensemble is updated in the GFS if (( MEMBER > 0 )) && [[ "${ODA_INCUPD:-False}" == "True" ]]; then - ${NCP} "${COM_OCEAN_RESTART_PREV}/${restart_date:0:8}.${restart_date:0:8}0000.mom6_increment.nc" "${DATA}/INPUT/mom6_increment.nc" \ + ${NCP} "${COMIN_OCEAN_RESTART_PREV}/${restart_date:0:8}.${restart_date:0:8}0000.mom6_increment.nc" "${DATA}/INPUT/mom6_increment.nc" \ || ( echo "FATAL ERROR: Unable to copy ensemble MOM6 increment, ABORT!"; exit 1 ) fi fi # if [[ "${RERUN}" == "NO" ]]; then @@ -434,13 +434,13 @@ MOM6_postdet() { # Native model output uses window midpoint in the filename, but we are mapping that to the end of the period for COM source_file="ocn_${vdate_mid:0:4}_${vdate_mid:4:2}_${vdate_mid:6:2}_${vdate_mid:8:2}.nc" dest_file="${RUN}.ocean.t${cyc}z.${interval}hr_avg.f${fhr3}.nc" - ${NLN} "${COM_OCEAN_HISTORY}/${dest_file}" "${DATA}/MOM6_OUTPUT/${source_file}" + ${NLN} "${COMOUT_OCEAN_HISTORY}/${dest_file}" "${DATA}/MOM6_OUTPUT/${source_file}" # Daily output if (( fhr > 0 & fhr % 24 == 0 )); then source_file="ocn_daily_${vdate:0:4}_${vdate:4:2}_${vdate:6:2}.nc" dest_file="${RUN}.ocean.t${cyc}z.daily.f${fhr3}.nc" - ${NLN} "${COM_OCEAN_HISTORY}/${dest_file}" "${DATA}/MOM6_OUTPUT/${source_file}" + ${NLN} "${COMOUT_OCEAN_HISTORY}/${dest_file}" "${DATA}/MOM6_OUTPUT/${source_file}" fi last_fhr=${fhr} @@ -454,7 +454,7 @@ MOM6_postdet() { for fhr in ${MOM6_OUTPUT_FH}; do fhr3=$(printf %03i "${fhr}") vdatestr=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${fhr} hours" +%Y_%m_%d_%H) - ${NLN} "${COM_OCEAN_HISTORY}/${RUN}.ocean.t${cyc}z.inst.f${fhr3}.nc" "${DATA}/MOM6_OUTPUT/ocn_da_${vdatestr}.nc" + ${NLN} "${COMOUT_OCEAN_HISTORY}/${RUN}.ocean.t${cyc}z.inst.f${fhr3}.nc" "${DATA}/MOM6_OUTPUT/ocn_da_${vdatestr}.nc" done fi @@ -471,8 +471,8 @@ MOM6_nml() { MOM6_out() { echo "SUB ${FUNCNAME[0]}: Copying output data for MOM6" - # Copy MOM_input from DATA to COM_CONF after the forecast is run (and successfull) - ${NCP} "${DATA}/INPUT/MOM_input" "${COM_CONF}/ufs.MOM_input" + # Copy MOM_input from DATA to COMOUT_CONF after the forecast is run (and successfull) + ${NCP} "${DATA}/INPUT/MOM_input" "${COMOUT_CONF}/ufs.MOM_input" # Create a list of MOM6 restart files # Coarser than 1/2 degree has a single MOM restart @@ -497,7 +497,7 @@ MOM6_out() { 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}" + "${COMOUT_OCEAN_RESTART}/${restart_file}" done fi fi @@ -510,7 +510,7 @@ MOM6_out() { 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}" + "${COMOUT_OCEAN_RESTART}/${restart_file}" done fi } @@ -526,9 +526,9 @@ CICE_postdet() { 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" 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" + cice_restart_file="${COMIN_ICE_RESTART_PREV}/${restart_date:0:8}.${restart_date:8:2}0000.cice_model.res.nc" if [[ "${DO_JEDIOCNVAR:-NO}" == "YES" ]]; then - cice_restart_file="${COM_ICE_ANALYSIS}/${restart_date:0:8}.${restart_date:8:2}0000.cice_model_anl.res.nc" + cice_restart_file="${COMIN_ICE_ANALYSIS}/${restart_date:0:8}.${restart_date:8:2}0000.cice_model_anl.res.nc" fi fi @@ -541,7 +541,7 @@ CICE_postdet() { local vdate seconds vdatestr fhr fhr3 interval last_fhr 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" + ${NLN} "${COMOUT_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 local source_file dest_file @@ -566,7 +566,7 @@ CICE_postdet() { source_file="iceh_inst.${vdatestr}.nc" dest_file="${RUN}.ice.t${cyc}z.inst.f${fhr3}.nc" fi - ${NLN} "${COM_ICE_HISTORY}/${dest_file}" "${DATA}/CICE_OUTPUT/${source_file}" + ${NLN} "${COMOUT_ICE_HISTORY}/${dest_file}" "${DATA}/CICE_OUTPUT/${source_file}" last_fhr=${fhr} done @@ -582,8 +582,8 @@ CICE_nml() { CICE_out() { echo "SUB ${FUNCNAME[0]}: Copying output data for CICE" - # Copy ice_in namelist from DATA to COMOUTice after the forecast is run (and successfull) - ${NCP} "${DATA}/ice_in" "${COM_CONF}/ufs.ice_in" + # Copy ice_in namelist from DATA to COMOUT_CONF after the forecast is run (and successfull) + ${NCP} "${DATA}/ice_in" "${COMOUT_CONF}/ufs.ice_in" # Copy CICE restarts at the end of the forecast segment to COM for RUN=gfs|gefs if [[ "${COPY_FINAL_RESTARTS}" == "YES" ]]; then @@ -594,7 +594,7 @@ CICE_out() { 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}" + "${COMOUT_ICE_RESTART}/${target_file}" fi fi @@ -607,7 +607,7 @@ CICE_out() { source_file="cice_model.res.${restart_date:0:4}-${restart_date:4:2}-${restart_date:6:2}-${seconds}.nc" target_file="${restart_date:0:8}.${restart_date:8:2}0000.cice_model.res.nc" ${NCP} "${DATArestart}/CICE_RESTART/${source_file}" \ - "${COM_ICE_RESTART}/${target_file}" + "${COMOUT_ICE_RESTART}/${target_file}" fi } @@ -651,12 +651,12 @@ GOCART_postdet() { 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 - if [[ -e "${COM_CHEM_HISTORY}/gocart.inst_aod.${vdate:0:8}_${vdate:8:2}00z.nc4" ]]; then - rm -f "${COM_CHEM_HISTORY}/gocart.inst_aod.${vdate:0:8}_${vdate:8:2}00z.nc4" + if [[ -e "${COMOUT_CHEM_HISTORY}/gocart.inst_aod.${vdate:0:8}_${vdate:8:2}00z.nc4" ]]; then + rm -f "${COMOUT_CHEM_HISTORY}/gocart.inst_aod.${vdate:0:8}_${vdate:8:2}00z.nc4" fi #TODO: Temporarily removing this as this will crash gocart, adding copy statement at the end - #${NLN} "${COM_CHEM_HISTORY}/gocart.inst_aod.${vdate:0:8}_${vdate:8:2}00z.nc4" \ + #${NLN} "${COMOUT_CHEM_HISTORY}/gocart.inst_aod.${vdate:0:8}_${vdate:8:2}00z.nc4" \ # "${DATA}/gocart.inst_aod.${vdate:0:8}_${vdate:8:2}00z.nc4" done } @@ -672,7 +672,7 @@ GOCART_out() { if (( fhr == 0 )); then continue; fi 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" \ - "${COM_CHEM_HISTORY}/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" done } @@ -690,7 +690,7 @@ CMEPS_postdet() { 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" 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" + cmeps_restart_file="${COMIN_MED_RESTART_PREV}/${restart_date:0:8}.${restart_date:8:2}0000.ufs.cpld.cpl.r.nc" fi # Copy CMEPS restarts @@ -727,7 +727,7 @@ CMEPS_out() { 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}" + "${COMOUT_MED_RESTART}/${target_file}" else echo "Mediator restart '${DATArestart}/CMEPS_RESTART/${source_file}' not found." fi @@ -743,7 +743,7 @@ CMEPS_out() { target_file="${restart_date:0:8}.${restart_date: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}" + "${COMOUT_MED_RESTART}/${target_file}" else echo "Mediator restart '${DATArestart}/CMEPS_RESTART/${source_file}' not found." fi diff --git a/ush/forecast_predet.sh b/ush/forecast_predet.sh index de414437b1..c26b214fc9 100755 --- a/ush/forecast_predet.sh +++ b/ush/forecast_predet.sh @@ -70,7 +70,7 @@ common_predet(){ FHMAX_HF=${FHMAX_HF:-0} FHOUT_HF=${FHOUT_HF:-1} - if [[ ! -d "${COM_CONF}" ]]; then mkdir -p "${COM_CONF}"; fi + if [[ ! -d "${COMOUT_CONF}" ]]; then mkdir -p "${COMOUT_CONF}"; fi cd "${DATA}" || ( echo "FATAL ERROR: Unable to 'cd ${DATA}', ABORT!"; exit 8 ) @@ -83,9 +83,9 @@ common_predet(){ FV3_predet(){ echo "SUB ${FUNCNAME[0]}: Defining variables for FV3" - if [[ ! -d "${COM_ATMOS_HISTORY}" ]]; then mkdir -p "${COM_ATMOS_HISTORY}"; fi - if [[ ! -d "${COM_ATMOS_MASTER}" ]]; then mkdir -p "${COM_ATMOS_MASTER}"; fi - if [[ ! -d "${COM_ATMOS_RESTART}" ]]; then mkdir -p "${COM_ATMOS_RESTART}"; fi + if [[ ! -d "${COMOUT_ATMOS_HISTORY}" ]]; then mkdir -p "${COMOUT_ATMOS_HISTORY}"; fi + if [[ ! -d "${COMOUT_ATMOS_MASTER}" ]]; then mkdir -p "${COMOUT_ATMOS_MASTER}"; fi + if [[ ! -d "${COMOUT_ATMOS_RESTART}" ]]; then mkdir -p "${COMOUT_ATMOS_RESTART}"; fi if [[ ! -d "${DATArestart}/FV3_RESTART" ]]; then mkdir -p "${DATArestart}/FV3_RESTART"; fi ${NLN} "${DATArestart}/FV3_RESTART" "${DATA}/RESTART" @@ -482,8 +482,8 @@ FV3_predet(){ WW3_predet(){ echo "SUB ${FUNCNAME[0]}: WW3 before run type determination" - if [[ ! -d "${COM_WAVE_HISTORY}" ]]; then mkdir -p "${COM_WAVE_HISTORY}"; fi - if [[ ! -d "${COM_WAVE_RESTART}" ]]; then mkdir -p "${COM_WAVE_RESTART}" ; fi + if [[ ! -d "${COMOUT_WAVE_HISTORY}" ]]; then mkdir -p "${COMOUT_WAVE_HISTORY}"; fi + if [[ ! -d "${COMOUT_WAVE_RESTART}" ]]; then mkdir -p "${COMOUT_WAVE_RESTART}" ; fi if [[ ! -d "${DATArestart}/WAVE_RESTART" ]]; then mkdir -p "${DATArestart}/WAVE_RESTART"; fi ${NLN} "${DATArestart}/WAVE_RESTART" "${DATA}/restart_wave" @@ -499,17 +499,17 @@ WW3_predet(){ grdALL=$(printf "%s\n" "${array[@]}" | sort -u | tr '\n' ' ') for ww3_grid in ${grdALL}; do - ${NCP} "${COM_WAVE_PREP}/${RUN}wave.mod_def.${ww3_grid}" "${DATA}/mod_def.${ww3_grid}" \ - || ( echo "FATAL ERROR: Failed to copy '${RUN}wave.mod_def.${ww3_grid}' from '${COM_WAVE_PREP}'"; exit 1 ) + ${NCP} "${COMIN_WAVE_PREP}/${RUN}wave.mod_def.${ww3_grid}" "${DATA}/mod_def.${ww3_grid}" \ + || ( echo "FATAL ERROR: Failed to copy '${RUN}wave.mod_def.${ww3_grid}' from '${COMIN_WAVE_PREP}'"; exit 1 ) done else #if shel, only 1 waveGRD which is linked to mod_def.ww3 - ${NCP} "${COM_WAVE_PREP}/${RUN}wave.mod_def.${waveGRD}" "${DATA}/mod_def.ww3" \ - || ( echo "FATAL ERROR: Failed to copy '${RUN}wave.mod_def.${waveGRD}' from '${COM_WAVE_PREP}'"; exit 1 ) + ${NCP} "${COMIN_WAVE_PREP}/${RUN}wave.mod_def.${waveGRD}" "${DATA}/mod_def.ww3" \ + || ( echo "FATAL ERROR: Failed to copy '${RUN}wave.mod_def.${waveGRD}' from '${COMIN_WAVE_PREP}'"; exit 1 ) fi if [[ "${WW3ICEINP}" == "YES" ]]; then - local wavicefile="${COM_WAVE_PREP}/${RUN}wave.${WAVEICE_FID}.t${current_cycle:8:2}z.ice" + local wavicefile="${COMIN_WAVE_PREP}/${RUN}wave.${WAVEICE_FID}.t${current_cycle:8:2}z.ice" if [[ ! -f "${wavicefile}" ]]; then echo "FATAL ERROR: WW3ICEINP='${WW3ICEINP}', but missing ice file '${wavicefile}', ABORT!" exit 1 @@ -519,7 +519,7 @@ WW3_predet(){ fi if [[ "${WW3CURINP}" == "YES" ]]; then - local wavcurfile="${COM_WAVE_PREP}/${RUN}wave.${WAVECUR_FID}.t${current_cycle:8:2}z.cur" + local wavcurfile="${COMIN_WAVE_PREP}/${RUN}wave.${WAVECUR_FID}.t${current_cycle:8:2}z.cur" if [[ ! -f "${wavcurfile}" ]]; then echo "FATAL ERROR: WW3CURINP='${WW3CURINP}', but missing current file '${wavcurfile}', ABORT!" exit 1 @@ -558,9 +558,9 @@ WW3_predet(){ CICE_predet(){ echo "SUB ${FUNCNAME[0]}: CICE before run type determination" - if [[ ! -d "${COM_ICE_HISTORY}" ]]; then mkdir -p "${COM_ICE_HISTORY}"; fi - if [[ ! -d "${COM_ICE_RESTART}" ]]; then mkdir -p "${COM_ICE_RESTART}"; fi - if [[ ! -d "${COM_ICE_INPUT}" ]]; then mkdir -p "${COM_ICE_INPUT}"; fi + if [[ ! -d "${COMOUT_ICE_HISTORY}" ]]; then mkdir -p "${COMOUT_ICE_HISTORY}"; fi + if [[ ! -d "${COMOUT_ICE_RESTART}" ]]; then mkdir -p "${COMOUT_ICE_RESTART}"; fi + if [[ ! -d "${COMIN_ICE_INPUT}" ]]; then mkdir -p "${COMIN_ICE_INPUT}"; fi if [[ ! -d "${DATA}/CICE_OUTPUT" ]]; then mkdir -p "${DATA}/CICE_OUTPUT"; fi if [[ ! -d "${DATArestart}/CICE_RESTART" ]]; then mkdir -p "${DATArestart}/CICE_RESTART"; fi @@ -581,9 +581,9 @@ CICE_predet(){ MOM6_predet(){ echo "SUB ${FUNCNAME[0]}: MOM6 before run type determination" - if [[ ! -d "${COM_OCEAN_HISTORY}" ]]; then mkdir -p "${COM_OCEAN_HISTORY}"; fi - if [[ ! -d "${COM_OCEAN_RESTART}" ]]; then mkdir -p "${COM_OCEAN_RESTART}"; fi - if [[ ! -d "${COM_OCEAN_INPUT}" ]]; then mkdir -p "${COM_OCEAN_INPUT}"; fi + if [[ ! -d "${COMOUT_OCEAN_HISTORY}" ]]; then mkdir -p "${COMOUT_OCEAN_HISTORY}"; fi + if [[ ! -d "${COMOUT_OCEAN_RESTART}" ]]; then mkdir -p "${COMOUT_OCEAN_RESTART}"; fi + if [[ ! -d "${COMIN_OCEAN_INPUT}" ]]; then mkdir -p "${COMIN_OCEAN_INPUT}"; fi if [[ ! -d "${DATA}/MOM6_OUTPUT" ]]; then mkdir -p "${DATA}/MOM6_OUTPUT"; fi if [[ ! -d "${DATArestart}/MOM6_RESTART" ]]; then mkdir -p "${DATArestart}/MOM6_RESTART"; fi @@ -626,7 +626,7 @@ MOM6_predet(){ CMEPS_predet(){ echo "SUB ${FUNCNAME[0]}: CMEPS before run type determination" - if [[ ! -d "${COM_MED_RESTART}" ]]; then mkdir -p "${COM_MED_RESTART}"; fi + if [[ ! -d "${COMOUT_MED_RESTART}" ]]; then mkdir -p "${COMOUT_MED_RESTART}"; fi if [[ ! -d "${DATArestart}/CMEPS_RESTART" ]]; then mkdir -p "${DATArestart}/CMEPS_RESTART"; fi ${NLN} "${DATArestart}/CMEPS_RESTART" "${DATA}/CMEPS_RESTART" @@ -637,7 +637,7 @@ CMEPS_predet(){ GOCART_predet(){ echo "SUB ${FUNCNAME[0]}: GOCART before run type determination" - if [[ ! -d "${COM_CHEM_HISTORY}" ]]; then mkdir -p "${COM_CHEM_HISTORY}"; fi + 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 From 4422550c01c9214a2b3b8890bdcc898123ee216a Mon Sep 17 00:00:00 2001 From: Guoqing Ge Date: Thu, 30 May 2024 08:05:23 -0600 Subject: [PATCH 12/45] Add the capability to use slurm reservation nodes (#2627) Add the capability to use slurm reservation nodes Add "ACCOUNT_SERVICE" for jobs to run in PARTITION_SERVICE Resolves #2626 --- parm/config/gefs/config.base | 2 ++ parm/config/gfs/config.base | 2 ++ workflow/hosts/awspw.yaml | 2 ++ workflow/hosts/container.yaml | 2 ++ workflow/hosts/hera.yaml | 2 ++ workflow/hosts/hercules.yaml | 2 ++ workflow/hosts/jet.yaml | 2 ++ workflow/hosts/orion.yaml | 2 ++ workflow/hosts/s4.yaml | 2 ++ workflow/hosts/wcoss2.yaml | 2 ++ workflow/rocoto/tasks.py | 4 +++- 11 files changed, 23 insertions(+), 1 deletion(-) diff --git a/parm/config/gefs/config.base b/parm/config/gefs/config.base index 477a04ddfb..1b4f948349 100644 --- a/parm/config/gefs/config.base +++ b/parm/config/gefs/config.base @@ -13,10 +13,12 @@ export RUN_ENVIR="emc" # Account, queue, etc. export ACCOUNT="@ACCOUNT@" +export ACCOUNT_SERVICE="@ACCOUNT_SERVICE@" export QUEUE="@QUEUE@" export QUEUE_SERVICE="@QUEUE_SERVICE@" export PARTITION_BATCH="@PARTITION_BATCH@" export PARTITION_SERVICE="@PARTITION_SERVICE@" +export RESERVATION="@RESERVATION@" # Project to use in mass store: export HPSS_PROJECT="@HPSS_PROJECT@" diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base index f1e25750ef..50fcc168d7 100644 --- a/parm/config/gfs/config.base +++ b/parm/config/gfs/config.base @@ -13,10 +13,12 @@ export RUN_ENVIR="emc" # Account, queue, etc. export ACCOUNT="@ACCOUNT@" +export ACCOUNT_SERVICE="@ACCOUNT_SERVICE@" export QUEUE="@QUEUE@" export QUEUE_SERVICE="@QUEUE_SERVICE@" export PARTITION_BATCH="@PARTITION_BATCH@" export PARTITION_SERVICE="@PARTITION_SERVICE@" +export RESERVATION="@RESERVATION@" # Project to use in mass store: export HPSS_PROJECT="@HPSS_PROJECT@" diff --git a/workflow/hosts/awspw.yaml b/workflow/hosts/awspw.yaml index c683010e0e..d2223e799e 100644 --- a/workflow/hosts/awspw.yaml +++ b/workflow/hosts/awspw.yaml @@ -7,11 +7,13 @@ STMP: '/lustre/${USER}/stmp2/' PTMP: '/lustre/${USER}/stmp4/' NOSCRUB: ${HOMEDIR} ACCOUNT: hwufscpldcld +ACCOUNT_SERVICE: hwufscpldcld SCHEDULER: slurm QUEUE: batch QUEUE_SERVICE: batch PARTITION_BATCH: compute PARTITION_SERVICE: compute +RESERVATION: '' CHGRP_RSTPROD: 'YES' CHGRP_CMD: 'chgrp rstprod' # TODO: This is not yet supported. HPSSARCH: 'YES' diff --git a/workflow/hosts/container.yaml b/workflow/hosts/container.yaml index 3fd3856679..5f4a66ac1f 100644 --- a/workflow/hosts/container.yaml +++ b/workflow/hosts/container.yaml @@ -8,10 +8,12 @@ PTMP: '/home/${USER}' NOSCRUB: $HOMEDIR SCHEDULER: none ACCOUNT: '' +ACCOUNT_SERVICE: '' QUEUE: '' QUEUE_SERVICE: '' PARTITION_BATCH: '' PARTITION_SERVICE: '' +RESERVATION: '' CHGRP_RSTPROD: 'YES' CHGRP_CMD: 'chgrp rstprod' HPSSARCH: 'NO' diff --git a/workflow/hosts/hera.yaml b/workflow/hosts/hera.yaml index 1393694153..8cf7363605 100644 --- a/workflow/hosts/hera.yaml +++ b/workflow/hosts/hera.yaml @@ -8,11 +8,13 @@ STMP: '/scratch1/NCEPDEV/stmp2/${USER}' PTMP: '/scratch1/NCEPDEV/stmp4/${USER}' NOSCRUB: $HOMEDIR ACCOUNT: fv3-cpu +ACCOUNT_SERVICE: fv3-cpu SCHEDULER: slurm QUEUE: batch QUEUE_SERVICE: batch PARTITION_BATCH: hera PARTITION_SERVICE: service +RESERVATION: '' CHGRP_RSTPROD: 'YES' CHGRP_CMD: 'chgrp rstprod' HPSSARCH: 'YES' diff --git a/workflow/hosts/hercules.yaml b/workflow/hosts/hercules.yaml index a3c0733b8c..1b285221fd 100644 --- a/workflow/hosts/hercules.yaml +++ b/workflow/hosts/hercules.yaml @@ -9,10 +9,12 @@ PTMP: '/work/noaa/stmp/${USER}/HERCULES' NOSCRUB: $HOMEDIR SCHEDULER: slurm ACCOUNT: fv3-cpu +ACCOUNT_SERVICE: fv3-cpu QUEUE: batch QUEUE_SERVICE: batch PARTITION_BATCH: hercules PARTITION_SERVICE: service +RESERVATION: '' CHGRP_RSTPROD: 'YES' CHGRP_CMD: 'chgrp rstprod' HPSSARCH: 'NO' diff --git a/workflow/hosts/jet.yaml b/workflow/hosts/jet.yaml index 28b7571b32..fd556fadc7 100644 --- a/workflow/hosts/jet.yaml +++ b/workflow/hosts/jet.yaml @@ -8,11 +8,13 @@ STMP: '/lfs4/HFIP/hfv3gfs/${USER}/stmp' PTMP: '/lfs4/HFIP/hfv3gfs/${USER}/ptmp' NOSCRUB: $HOMEDIR ACCOUNT: hfv3gfs +ACCOUNT_SERVICE: hfv3gfs SCHEDULER: slurm QUEUE: batch QUEUE_SERVICE: batch PARTITION_BATCH: kjet PARTITION_SERVICE: service +RESERVATION: '' CHGRP_RSTPROD: 'YES' CHGRP_CMD: 'chgrp rstprod' HPSSARCH: 'YES' diff --git a/workflow/hosts/orion.yaml b/workflow/hosts/orion.yaml index 4f8f02b4c6..ba289df1e3 100644 --- a/workflow/hosts/orion.yaml +++ b/workflow/hosts/orion.yaml @@ -9,10 +9,12 @@ PTMP: '/work/noaa/stmp/${USER}/ORION' NOSCRUB: $HOMEDIR SCHEDULER: slurm ACCOUNT: fv3-cpu +ACCOUNT_SERVICE: fv3-cpu QUEUE: batch QUEUE_SERVICE: batch PARTITION_BATCH: orion PARTITION_SERVICE: service +RESERVATION: '' CHGRP_RSTPROD: 'YES' CHGRP_CMD: 'chgrp rstprod' HPSSARCH: 'NO' diff --git a/workflow/hosts/s4.yaml b/workflow/hosts/s4.yaml index 52a9f7a365..543912cf23 100644 --- a/workflow/hosts/s4.yaml +++ b/workflow/hosts/s4.yaml @@ -8,11 +8,13 @@ STMP: '/scratch/users/${USER}' PTMP: '/scratch/users/${USER}' NOSCRUB: ${HOMEDIR} ACCOUNT: star +ACCOUNT_SERVICE: star SCHEDULER: slurm QUEUE: s4 QUEUE_SERVICE: serial PARTITION_BATCH: s4 PARTITION_SERVICE: serial +RESERVATION: '' CHGRP_RSTPROD: 'NO' CHGRP_CMD: 'ls' HPSSARCH: 'NO' diff --git a/workflow/hosts/wcoss2.yaml b/workflow/hosts/wcoss2.yaml index ba203a8413..4943495289 100644 --- a/workflow/hosts/wcoss2.yaml +++ b/workflow/hosts/wcoss2.yaml @@ -8,11 +8,13 @@ STMP: '/lfs/h2/emc/stmp/${USER}' PTMP: '/lfs/h2/emc/ptmp/${USER}' NOSCRUB: $HOMEDIR ACCOUNT: 'GFS-DEV' +ACCOUNT_SERVICE: 'GFS-DEV' SCHEDULER: pbspro QUEUE: 'dev' QUEUE_SERVICE: 'dev_transfer' PARTITION_BATCH: '' PARTITION_SERVICE: '' +RESERVATION: '' CHGRP_RSTPROD: 'YES' CHGRP_CMD: 'chgrp rstprod' HPSSARCH: 'NO' diff --git a/workflow/rocoto/tasks.py b/workflow/rocoto/tasks.py index eb13941002..52d5466d10 100644 --- a/workflow/rocoto/tasks.py +++ b/workflow/rocoto/tasks.py @@ -169,7 +169,7 @@ def get_resource(self, task_name): task_config = self._configs[task_name] - account = task_config['ACCOUNT'] + account = task_config['ACCOUNT_SERVICE'] if task_name in Tasks.SERVICE_TASKS else task_config['ACCOUNT'] walltime = task_config[f'wtime_{task_name}'] if self.cdump in ['gfs'] and f'wtime_{task_name}_gfs' in task_config.keys(): @@ -208,6 +208,8 @@ def get_resource(self, task_name): native += ':shared' elif scheduler in ['slurm']: native = '--export=NONE' + if task_config['RESERVATION'] != "": + native += '' if task_name in Tasks.SERVICE_TASKS else ' --reservation=' + task_config['RESERVATION'] queue = task_config['QUEUE_SERVICE'] if task_name in Tasks.SERVICE_TASKS else task_config['QUEUE'] From 12aa1e9cd2d159e2b303d2b33d6c79c365688eec Mon Sep 17 00:00:00 2001 From: Walter Kolczynski - NOAA Date: Fri, 31 May 2024 04:57:08 -0400 Subject: [PATCH 13/45] Switch to Rocky 9 built external packages on Hercules (#2608) The workflow was updated to use modules built on Rocky 9, but the external packages (like prepobs) were still pointing to the versions built on CentOS (Orion). This transitions to packages built on Rocky 9. Updating of the tracker package has been deferred until later. As such, the tracker jobs have been disabled by returning immediately if they are on Hercules. Since these jobs are small, resource-wise, it should not meaningfully impact turnover time. --- jobs/JGFS_ATMOS_CYCLONE_GENESIS | 4 ++++ jobs/JGFS_ATMOS_CYCLONE_TRACKER | 4 ++++ jobs/JGFS_ATMOS_FSU_GENESIS | 5 +++++ workflow/hosts/hercules.yaml | 2 +- 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/jobs/JGFS_ATMOS_CYCLONE_GENESIS b/jobs/JGFS_ATMOS_CYCLONE_GENESIS index a0d1640d1b..de130bf9aa 100755 --- a/jobs/JGFS_ATMOS_CYCLONE_GENESIS +++ b/jobs/JGFS_ATMOS_CYCLONE_GENESIS @@ -3,6 +3,10 @@ source "${HOMEgfs}/ush/preamble.sh" source "${HOMEgfs}/ush/jjob_header.sh" -e "genesis" -c "base genesis" +# Hack to temporary skip this as the tracker has not been build +# on Hercules Rocky 9 yet +# TODO: Remove this after tracker has been built for Rocky 9 #2639 +if [[ "${machine}" == 'HERCULES' ]]; then exit 0; fi ############################################## # Set variables used in the exglobal script diff --git a/jobs/JGFS_ATMOS_CYCLONE_TRACKER b/jobs/JGFS_ATMOS_CYCLONE_TRACKER index 0ac06a7fe8..16a51d5c33 100755 --- a/jobs/JGFS_ATMOS_CYCLONE_TRACKER +++ b/jobs/JGFS_ATMOS_CYCLONE_TRACKER @@ -3,6 +3,10 @@ source "${HOMEgfs}/ush/preamble.sh" source "${HOMEgfs}/ush/jjob_header.sh" -e "tracker" -c "base tracker" +# Hack to temporary skip this as the tracker has not been build +# on Hercules Rocky 9 yet +# TODO: Remove this after tracker has been built for Rocky 9 #2639 +if [[ "${machine}" == 'HERCULES' ]]; then exit 0; fi export COMPONENT="atmos" diff --git a/jobs/JGFS_ATMOS_FSU_GENESIS b/jobs/JGFS_ATMOS_FSU_GENESIS index 374be2e1c5..89788e6d23 100755 --- a/jobs/JGFS_ATMOS_FSU_GENESIS +++ b/jobs/JGFS_ATMOS_FSU_GENESIS @@ -3,6 +3,11 @@ source "${HOMEgfs}/ush/preamble.sh" source "${HOMEgfs}/ush/jjob_header.sh" -e "genesis_fsu" -c "base genesis_fsu" +# Hack to temporary skip this as the tracker has not been build +# on Hercules Rocky 9 yet +# TODO: Remove this after tracker has been built for Rocky 9 #2639 +if [[ "${machine}" == 'HERCULES' ]]; then exit 0; fi + export COMPONENT="atmos" diff --git a/workflow/hosts/hercules.yaml b/workflow/hosts/hercules.yaml index 1b285221fd..adebdfe23d 100644 --- a/workflow/hosts/hercules.yaml +++ b/workflow/hosts/hercules.yaml @@ -1,4 +1,4 @@ -BASE_GIT: '/work/noaa/global/glopara/git' +BASE_GIT: '/work/noaa/global/glopara/git_rocky9' DMPDIR: '/work/noaa/rstprod/dump' BASE_CPLIC: '/work/noaa/global/glopara/data/ICSDIR/prototype_ICs' PACKAGEROOT: '/work/noaa/global/glopara/nwpara' From c92bf415060750127c9c05a62a1d2851c489551a Mon Sep 17 00:00:00 2001 From: David Huber <69919478+DavidHuber-NOAA@users.noreply.github.com> Date: Sat, 1 Jun 2024 05:11:07 +0000 Subject: [PATCH 14/45] Archiving cleanup (#2621) 1) Adds a lot of comments to the jinja templates for archiving 2) Rearranges the gdas and enkf templates to a more logical order 3) Fixes a couple of bugs in the enkf archiving of increments and analyses 4) Disables archiving for the half cycle 5) Removes the `FITSARC` key from `config.base` and `arcdir.yaml.j2`, instead relying on `DO_FIT2OBS` 6) Updates wxflow to add the option to not allow undefined variables when parsing jinja templates and invokes this feature when running archives Resolves #2612 --- parm/archive/arcdir.yaml.j2 | 196 ++++++++++++++---------- parm/archive/enkf.yaml.j2 | 88 ++++++----- parm/archive/enkf_grp.yaml.j2 | 12 +- parm/archive/enkf_restarta_grp.yaml.j2 | 25 +-- parm/archive/gdas.yaml.j2 | 78 +++++++--- parm/archive/gdas_restarta.yaml.j2 | 31 ++-- parm/archive/gdasocean_analysis.yaml.j2 | 4 +- parm/archive/gfsa.yaml.j2 | 40 ++--- parm/archive/gfsb.yaml.j2 | 3 + parm/archive/gfswave.yaml.j2 | 7 + parm/archive/ice_grib2.yaml.j2 | 1 + parm/archive/master_enkf.yaml.j2 | 23 ++- parm/archive/master_gdas.yaml.j2 | 26 +++- parm/archive/master_gfs.yaml.j2 | 32 +++- parm/config/gfs/config.base | 9 +- scripts/exglobal_archive.py | 2 +- sorc/wxflow | 2 +- ush/python/pygfs/task/archive.py | 84 ++++++++-- workflow/rocoto/gfs_tasks.py | 28 ++-- 19 files changed, 435 insertions(+), 256 deletions(-) diff --git a/parm/archive/arcdir.yaml.j2 b/parm/archive/arcdir.yaml.j2 index 6321f6fc41..fab93cc2a4 100644 --- a/parm/archive/arcdir.yaml.j2 +++ b/parm/archive/arcdir.yaml.j2 @@ -2,84 +2,118 @@ {% set cycle_YMDH = current_cycle | to_YMDH %} {% set cycle_YMD = current_cycle | to_YMD %} {% set head = RUN + ".t" + cycle_HH + "z." %} -{% if RUN == "gdas" or RUN == "gfs" %} -deterministic: - mkdir: - - "{{ ARCDIR }}" - {% if RUN == "gfs" %} - - "{{ ARCDIR }}/tracker.{{ cycle_YMDH }}/{{ RUN }}" - {% endif %} - {% if FITSARC %} - {% set VFYARC = ROTDIR + "/vrfyarch" %} - - "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}" - {% endif %} - copy: - {% if current_cycle != SDATE and MODE == "cycled" %} - {% if DO_JEDIATMVAR %} - - ["{{ COM_ATMOS_ANALYSIS }}/{{ head }}atmstat", "{{ ARCDIR }}/atmstat.{{ RUN }}.{{ cycle_YMDH }}"] - {% else %} - - ["{{ COM_ATMOS_ANALYSIS }}/{{ head }}gsistat", "{{ ARCDIR }}/gsistat.{{ RUN }}.{{ cycle_YMDH }}"] - {% endif %} - {% if DO_JEDISNOWDA %} - - ["{{ COM_SNOW_ANALYSIS }}/{{ head }}snowstat.tgz", "{{ ARCDIR }}/snowstat.{{ RUN }}.{{ cycle_YMDH }}.tgz"] - {% endif %} - {% if AERO_ANL_CDUMP == RUN or AERO_ANL_CDUMP == "both" %} - - ["{{ COM_CHEM_ANALYSIS }}/{{ head }}aerostat", "{{ ARCDIR }}/aerostat.{{ RUN }}.{{ cycle_YMDH }}"] - {% endif %} - - ["{{ COM_ATMOS_GRIB_1p00 }}/{{ head }}pgrb2.1p00.anl", "{{ ARCDIR }}/pgbanl.{{ RUN }}.{{ cycle_YMDH }}.grib2"] - {% endif %} # Full cycle - {% if RUN == "gfs" %} - {% set fhmax, fhout = FHMAX_GFS, FHOUT_GFS %} - {% elif RUN == "gdas" %} - {% set fhmax, fhout = FHMAX, FHOUT %} - {% endif %} - {% for fhr in range(0, fhmax + fhout, fhout) %} - - ["{{ COM_ATMOS_GRIB_1p00 }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}", "{{ ARCDIR }}/pgbf{{ '%02d' % fhr }}.{{ RUN }}.{{ cycle_YMDH }}.grib2"] - {% endfor %} - {% if RUN == "gfs" %} - {% if FITSARC %} - {% if FHMAX_FITS is defined %} - {% set fhmax = FHMAX_FITS %} - {% else %} - {% set fhmax = FHMAX_GFS %} - {% endif %} - {% for fhr in range(0, fhmax + 6, 6) %} - {% set sfcfile = "/" + head + "sfcf" + '%03d'|format(fhr) + ".nc" %} - {% set sigfile = "/" + head + "atmf" + '%03d'|format(fhr) + ".nc" %} - - ["{{COM_ATMOS_HISTORY}}/{{ sfcfile }}", "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}/{{ sfcfile }}"] - - ["{{COM_ATMOS_HISTORY}}/{{ sigfile }}", "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}/{{ sigfile }}"] - {% endfor %} - {% endif %} ## FITSARC - {% if path_exists(COM_ATMOS_GENESIS ~ "/storms.gfso.atcf_gen." ~ cycle_YMDH) %} - - ["{{ COM_ATMOS_GENESIS }}/storms.gfso.atcf_gen.{{ cycle_YMDH }}", "{{ ARCDIR }}/storms.gfso.atcf_gen.{{ cycle_YMDH }}"] - - ["{{ COM_ATMOS_GENESIS }}/storms.gfso.atcf_gen.altg.{{ cycle_YMDH }}", "{{ ARCDIR }}/storms.gfso.atcf_gen.altg.{{ cycle_YMDH }}"] - {% endif %} - {% if path_exists(COM_ATMOS_GENESIS ~ "/trak.gfso.atcfunix." ~ cycle_YMDH) %} - - ["{{ COM_ATMOS_GENESIS }}/trak.gfso.atcfunix.{{ cycle_YMDH }}", "{{ ARCDIR }}/trak.gfso.atcfunix.{{ cycle_YMDH }}"] - - ["{{ COM_ATMOS_GENESIS }}/trak.gfso.atcfunix.altg.{{ cycle_YMDH }}", "{{ ARCDIR }}/trak.gfso.atcfunix.altg.{{ cycle_YMDH }}"] - {% endif %} - ## Only created if tracking is on and there were systems to track - {% for basin in ["epac", "natl"] %} - {% if path_exists(COM_ATMOS_TRACK + "/" + basin) %} - - ["{{ COM_ATMOS_TRACK }}/{{ basin }}", "{{ ARCDIR }}/{{ basin }}"] - {% endif %} - {% endfor %} - {% endif %} ## RUN == "gfs" - {% if path_exists(COM_ATMOS_TRACK ~ "/atcfunix." ~ RUN ~ "." ~ cycle_YMDH) %} - - ["{{ COM_ATMOS_TRACK }}/atcfunix.{{ RUN }}.{{ cycle_YMDH }}", "{{ ARCDIR }}/atcfunix.{{ RUN }}.{{ cycle_YMDH }}"] - - ["{{ COM_ATMOS_TRACK }}/atcfunixp.{{ RUN }}.{{ cycle_YMDH }}", "{{ ARCDIR }}/atcfunixp.{{ RUN }}.{{ cycle_YMDH }}"] - {% endif %} -{% endif %} # gfs or gdas -{% if current_cycle != SDATE and (RUN == "enkfgdas" or RUN == "enkfgfs") %} -ensemble: - mkdir: - - "{{ ARCDIR }}" - copy: - {% if DO_JEDIATMENS %} - - ["{{ COM_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}atmensstat", "{{ ARCDIR }}/atmensstat.{{ RUN }}.{{ cycle_YMDH }}"] - - ["{{ COM_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}atminc.ensmean.nc", "{{ ARCDIR }}/atmensstat.{{ RUN }}.{{ cycle_YMDH }}.ensmean.nc"] - {% else %} - - ["{{ COM_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}enkfstat", "{{ ARCDIR }}/enkfstat.{{ RUN }}.{{ cycle_YMDH }}"] - - ["{{ COM_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}gsistat.ensmean", "{{ ARCDIR }}/gsistat.{{ RUN }}.{{ cycle_YMDH }}.ensmean"] - {% endif %} -{% endif %} # enkfgdas or enkfgfs + +# Select data to store in the ARCDIR and VFYARC from deterministic runs +Base: &base # GDAS, GFS, ENKFGDAS, or ENKFGFS + common: + mkdir: + - "{{ ARCDIR }}" + +# Common files to be added to both the gfs and gdas keys below +Deterministic: &deterministic + cyclone: + copy: + # Cyclone forecasts, produced for both gdas and gfs cycles + ## Only created if tracking is on and there were systems to track + {% if path_exists(COM_ATMOS_TRACK ~ "/atcfunix." ~ RUN ~ "." ~ cycle_YMDH) %} + - ["{{ COM_ATMOS_TRACK }}/atcfunix.{{ RUN }}.{{ cycle_YMDH }}", "{{ ARCDIR }}/atcfunix.{{ RUN }}.{{ cycle_YMDH }}"] + - ["{{ COM_ATMOS_TRACK }}/atcfunixp.{{ RUN }}.{{ cycle_YMDH }}", "{{ ARCDIR }}/atcfunixp.{{ RUN }}.{{ cycle_YMDH }}"] + {% endif %} + + # Cyclone tracking data + {% for basin in ["epac", "natl"] %} + {% if path_exists(COM_ATMOS_TRACK + "/" + basin) %} + - ["{{ COM_ATMOS_TRACK }}/{{ basin }}", "{{ ARCDIR }}/{{ basin }}"] + {% endif %} + {% endfor %} + + {% if MODE == "cycled" %} + analysis: + copy: + # Analysis data (if we are running in cycled mode) + - ["{{ COM_ATMOS_GRIB_1p00 }}/{{ head }}pgrb2.1p00.anl", "{{ ARCDIR }}/pgbanl.{{ RUN }}.{{ cycle_YMDH }}.grib2"] + + {% if DO_JEDIATMVAR %} + - ["{{ COM_ATMOS_ANALYSIS }}/{{ head }}atmstat", "{{ ARCDIR }}/atmstat.{{ RUN }}.{{ cycle_YMDH }}"] + {% else %} + - ["{{ COM_ATMOS_ANALYSIS }}/{{ head }}gsistat", "{{ ARCDIR }}/gsistat.{{ RUN }}.{{ cycle_YMDH }}"] + {% endif %} + + {% if DO_JEDISNOWDA %} + - ["{{ COM_SNOW_ANALYSIS }}/{{ head }}snowstat.tgz", "{{ ARCDIR }}/snowstat.{{ RUN }}.{{ cycle_YMDH }}.tgz"] + {% endif %} + + {% if AERO_ANL_CDUMP == RUN or AERO_ANL_CDUMP == "both" %} + - ["{{ COM_CHEM_ANALYSIS }}/{{ head }}aerostat", "{{ ARCDIR }}/aerostat.{{ RUN }}.{{ cycle_YMDH }}"] + {% endif %} + + {% endif %} + +{% if RUN == "gfs" %} +gfs: # GFS specific + <<: *base + <<: *deterministic + + gfs: + copy: + {% for fhr in range(0, FHMAX_GFS + 1, FHOUT_GFS) %} + - ["{{ COM_ATMOS_GRIB_1p00 }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}", "{{ ARCDIR }}/pgbf{{ '%02d' % fhr }}.{{ RUN }}.{{ cycle_YMDH }}.grib2"] + {% endfor %} + + # Cyclone genesis data (only present if there are storms) + {% if path_exists(COM_ATMOS_GENESIS ~ "/storms.gfso.atcf_gen." ~ cycle_YMDH) %} + - ["{{ COM_ATMOS_GENESIS }}/storms.gfso.atcf_gen.{{ cycle_YMDH }}", "{{ ARCDIR }}/storms.gfso.atcf_gen.{{ cycle_YMDH }}"] + - ["{{ COM_ATMOS_GENESIS }}/storms.gfso.atcf_gen.altg.{{ cycle_YMDH }}", "{{ ARCDIR }}/storms.gfso.atcf_gen.altg.{{ cycle_YMDH }}"] + {% endif %} + + {% if path_exists(COM_ATMOS_GENESIS ~ "/trak.gfso.atcfunix." ~ cycle_YMDH) %} + - ["{{ COM_ATMOS_GENESIS }}/trak.gfso.atcfunix.{{ cycle_YMDH }}", "{{ ARCDIR }}/trak.gfso.atcfunix.{{ cycle_YMDH }}"] + - ["{{ COM_ATMOS_GENESIS }}/trak.gfso.atcfunix.altg.{{ cycle_YMDH }}", "{{ ARCDIR }}/trak.gfso.atcfunix.altg.{{ cycle_YMDH }}"] + {% endif %} + + {% if DO_FIT2OBS %} + fit2obs: + + mkdir: + {% set VFYARC = ROTDIR + "/vrfyarch" %} + - "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}" + + copy: + {% for fhr in range(0, FHMAX_FITS + 1, 6) %} + {% set sfcfile = "/" + head + "sfcf" + '%03d'|format(fhr) + ".nc" %} + {% set sigfile = "/" + head + "atmf" + '%03d'|format(fhr) + ".nc" %} + - ["{{COM_ATMOS_HISTORY}}/{{ sfcfile }}", "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}/{{ sfcfile }}"] + - ["{{COM_ATMOS_HISTORY}}/{{ sigfile }}", "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}/{{ sigfile }}"] + {% endfor %} + + {% endif %} +{% endif %} + +{% if RUN == "gdas" %} +gdas: # GDAS specific + <<: *base + <<: *deterministic + gdas: + copy: + {% for fhr in range(0, FHMAX + 1, FHOUT) %} + - ["{{ COM_ATMOS_GRIB_1p00 }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}", "{{ ARCDIR }}/pgbf{{ '%02d' % fhr }}.{{ RUN }}.{{ cycle_YMDH }}.grib2"] + {% endfor %} +{% endif %} + +Ensemble: &ensemble # ENKFGDAS or ENKFGFS + analysis: + copy: + # Copy ensemble analyses + {% if DO_JEDIATMENS %} + - ["{{ COM_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}atmensstat", "{{ ARCDIR }}/atmensstat.{{ RUN }}.{{ cycle_YMDH }}"] + - ["{{ COM_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}atminc.ensmean.nc", "{{ ARCDIR }}/atmensstat.{{ RUN }}.{{ cycle_YMDH }}.ensmean.nc"] + {% else %} + - ["{{ COM_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}enkfstat", "{{ ARCDIR }}/enkfstat.{{ RUN }}.{{ cycle_YMDH }}"] + - ["{{ COM_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}gsistat.ensmean", "{{ ARCDIR }}/gsistat.{{ RUN }}.{{ cycle_YMDH }}.ensmean"] + {% endif %} + +{% if "enkf" in RUN %} +{{ RUN }}: + <<: *base + <<: *ensemble +{% endif %} diff --git a/parm/archive/enkf.yaml.j2 b/parm/archive/enkf.yaml.j2 index 10aee51a19..e05aca2981 100644 --- a/parm/archive/enkf.yaml.j2 +++ b/parm/archive/enkf.yaml.j2 @@ -2,6 +2,37 @@ enkf: name: "ENKF" target: "{{ ATARDIR }}/{{ cycle_YMDH }}/{{ RUN }}.tar" required: + # Logs + {% for mem in range(1, nmem_ens + 1) %} + - "logs/{{ cycle_YMDH }}/{{ RUN }}fcst_mem{{ '%03d' % mem }}.log" + {% endfor %} + {% for fhr in range(fhmin, fhmax + 1, fhout) %} + - "logs/{{ cycle_YMDH }}/{{ RUN }}epos{{ '%03d' % (fhr - fhmin) }}.log" + {% endfor %} + - "logs/{{ cycle_YMDH }}/{{ RUN }}echgres.log" + - "logs/{{ cycle_YMDH }}/{{ RUN }}esfc.log" + {% for grp in range(iaufhrs | length) %} + - "logs/{{ cycle_YMDH }}/{{ RUN }}ecen{{ '%03d' % grp }}.log" + {% endfor %} + + {% if DO_JEDIATMENS %} + {% set steps = ["atmensanlinit", "atmensanlrun", "atmensanlfinal"] %} + {% else %} + {% set steps = ["eobs", "eupd"] %} + {% if lobsdiag_forenkf %} + {% do steps.append("ediag") %} + {% else %} + {% for mem in range(1, nmem_ens + 1) %} + {% do steps.append("eomg_mem{{ '%03d' % mem }}") %} + {% endfor %} + {% endif %} + {% endif %} + + {% for step in steps %} + - "logs/{{ cycle_YMDH }}/{{ RUN }}{{ step }}.log" + {% endfor %} + + # Ensemble mean and spread {% for fhr in range(3, fhmax + 1, 3) %} - "{{ COM_ATMOS_HISTORY_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmf{{ '%03d' % fhr }}.ensmean.nc" - "{{ COM_ATMOS_HISTORY_ENSSTAT | relpath(ROTDIR) }}/{{ head }}sfcf{{ '%03d' % fhr }}.ensmean.nc" @@ -9,17 +40,8 @@ enkf: - "{{ COM_ATMOS_HISTORY_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmf{{ '%03d' % fhr }}.ensspread.nc" {% endif %} {% endfor %} - {% for mem in range(1, nmem_ens + 1) %} - - "logs/{{ cycle_YMDH }}/{{ RUN }}fcst_mem{{ '%03d' % mem }}.log" - {% endfor %} - - "logs/{{ cycle_YMDH }}/{{ RUN }}epos*.log" - - "logs/{{ cycle_YMDH }}/{{ RUN }}echgres.log" - - {% if current_cycle != SDATE %} - # TODO archive ecen logs based on actual groups. Will need to emulate numpy.array_split to do so. - - "logs/{{ cycle_YMDH }}/{{ RUN }}ecen*.log" - - "logs/{{ cycle_YMDH }}/{{ RUN }}esfc.log" + # Ensemble mean state {% if not DO_JEDIATMENS %} {% set da_files = ["enkfstat", "gsistat.ensmean", @@ -34,41 +56,27 @@ enkf: {% for file in da_files %} - "{{ COM_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}{{ file }}" {% endfor %} - {% if DOIAU %} - {% for fhr in iaufhrs %} - {% if fhr == IAU_OFFSET %} + + # Ensemble mean analyses/increments + # 6-hr analysis/increment {% if do_calc_increment %} - "{{ COM_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmanl.ensmean.nc" - {% endif %} # calc increment - {% else %} # fhr != IAU_OFFSET - - "{{ COM_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmi{{ '%03d' % fhr }}.ensmean.nc" - {% endif %} # fhr == IAU_OFFSET - {% endfor %} # IAUFHRS - {% endif %} # DOIAU - - {% if DO_JEDIATMENS %} - {% set steps = ["atmensanlinit", "atmensanlrun", "atmensanlfinal"] %} - {% else %} - {% set steps = ["eobs", "eupd"] %} - {% if lobsdiag_forenkf %} - {% do steps.append("ediag") %} {% else %} - {% for mem in range(1, nmem_ens + 1) %} - {% do steps.append("eomg_mem{{ '%03d' % mem }}") %} - {% endfor %} - {% endif %} + - "{{ COM_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atminc.ensmean.nc" {% endif %} - {% for step in steps %} - - "logs/{{ cycle_YMDH }}/{{ RUN }}{{ step }}.log" - {% endfor %} - {% endif %} # not the first cycle - optional: - {% if current_cycle != SDATE and DOIAU %} - {% for fhr in iaufhrs %} - {% if fhr != IAU_OFFSET %} + {% if DOIAU %} + # IAU increments/analyses + + {% for fhr in iaufhrs if fhr != 6 %} + {% if do_calc_increment %} + # Store analyses instead of increments - "{{ COM_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atma{{ '%03d' % fhr }}.ensmean.nc" + {% else %} + # Store increments - "{{ COM_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmi{{ '%03d' % fhr }}.ensmean.nc" - {% endif %} # fhr == IAU_OFFSET - {% endfor %} # IAUFHRS {% endif %} + {% endfor %} + + {% endif %} # End IAU + # End of analysis mean increments/analyses diff --git a/parm/archive/enkf_grp.yaml.j2 b/parm/archive/enkf_grp.yaml.j2 index cf7933ef0e..85d5854e3b 100644 --- a/parm/archive/enkf_grp.yaml.j2 +++ b/parm/archive/enkf_grp.yaml.j2 @@ -4,19 +4,20 @@ enkf_grp: required: {% for mem in range(first_group_mem, last_group_mem + 1) %} {% set imem = mem - first_group_mem %} + # Construct member COM directories {% set COM_ATMOS_ANALYSIS_MEM = COM_ATMOS_ANALYSIS_MEM_list[imem] %} {% set COM_ATMOS_HISTORY_MEM = COM_ATMOS_HISTORY_MEM_list[imem] %} {% set COM_ATMOS_RESTART_MEM = COM_ATMOS_RESTART_MEM_list[imem] %} - {% for iaufhr in iaufhrs_enkf %} - - "{{ COM_ATMOS_HISTORY_MEM | relpath(ROTDIR) }}/{{ head }}atmf{{ "%03d" % iaufhr }}.nc" + # Forecast data + {% for fhr in range(3, 10, 3) %} + - "{{ COM_ATMOS_HISTORY_MEM | relpath(ROTDIR) }}/{{ head }}atmf{{ "%03d" % fhr }}.nc" {% endfor %} - {% if 6 in iaufhrs_enkf %} + # Only store the 6-hour surface forecast - "{{ COM_ATMOS_HISTORY_MEM | relpath(ROTDIR) }}/{{ head }}sfcf006.nc" - {% endif %} - {% if current_cycle != SDATE %} + # Store the individual member analysis data {% if not lobsdiag_forenkf %} - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}gsistat" {% endif %} @@ -25,5 +26,4 @@ enkf_grp: {% else %} - "{{ COM_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}ratminc.nc" {% endif %} - {% endif %} {% endfor %} # first_group_mem to last_group_mem diff --git a/parm/archive/enkf_restarta_grp.yaml.j2 b/parm/archive/enkf_restarta_grp.yaml.j2 index ee768a1f92..8a4ea18bc1 100644 --- a/parm/archive/enkf_restarta_grp.yaml.j2 +++ b/parm/archive/enkf_restarta_grp.yaml.j2 @@ -4,10 +4,12 @@ enkf_restarta_grp: required: {% for mem in range(first_group_mem, last_group_mem + 1) %} {% set imem = mem - first_group_mem %} + # Construct the pertinent member COM directories {% set COM_ATMOS_ANALYSIS_MEM = COM_ATMOS_ANALYSIS_MEM_list[imem] %} {% set COM_ATMOS_HISTORY_MEM = COM_ATMOS_HISTORY_MEM_list[imem] %} {% set COM_ATMOS_RESTART_MEM = COM_ATMOS_RESTART_MEM_list[imem] %} + # Store bias data {% if not lobsdiag_forenkf %} - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}abias" - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}abias_air" @@ -15,6 +17,7 @@ enkf_restarta_grp: - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}abias_pc" {% endif %} + # Member surface analysis data {% if DOIAU_ENKF %} {% set anl_delta = "-3H" | to_timedelta %} {% else %} @@ -24,25 +27,27 @@ enkf_restarta_grp: {% for itile in range(1, 7) %} - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ anl_time | to_YMD }}.{{ anl_time | strftime("%H") }}0000.sfcanl_data.tile{{ itile }}.nc" {% endfor %} + + # Member atmospheric analysis data {% if do_calc_increment %} - "{{ COM_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}atmanl.nc" {% else %} - "{{ COM_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}ratminc.nc" {% endif %} - {% endfor %} # first_group_mem to last_group_mem - optional: - {% for mem in range(first_group_mem, last_group_mem + 1) %} - {% set imem = mem - first_group_mem %} - {% set COM_ATMOS_RESTART_MEM = COM_ATMOS_RESTART_MEM_list[imem] %} - {% set COM_ATMOS_ANALYSIS_MEM = COM_ATMOS_ANALYSIS_MEM_list[imem] %} - {% if not lobsdiag_forenkf and not DO_JEDIATMENS %} - - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}cnvstat" - {% endif %} + + # Member increments {% for iaufhr in iaufhrs if iaufhr != 6 %} {% set iaufhr = iaufhr %} {% if do_calc_increment %} - "{{ COM_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}atma{{ '%03d' % iaufhr }}.nc" + {% else %} - "{{ COM_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}ratmi{{ '%03d' % iaufhr }}.nc" {% endif %} {% endfor %} # iaufhr in iaufhrs - {% endfor %} + + # Conventional data + {% if not lobsdiag_forenkf and not DO_JEDIATMENS %} + - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}cnvstat" + {% endif %} + + {% endfor %} # first_group_mem to last_group_mem diff --git a/parm/archive/gdas.yaml.j2 b/parm/archive/gdas.yaml.j2 index 3c7709cfac..fd5e074111 100644 --- a/parm/archive/gdas.yaml.j2 +++ b/parm/archive/gdas.yaml.j2 @@ -3,13 +3,8 @@ gdas: name: "GDAS" target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdas.tar" required: - {% if current_cycle != SDATE and MODE == "cycled" %} - - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl" - - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl.idx" - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl" - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl.idx" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmanl.nc" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}sfcanl.nc" + {% if MODE == "cycled" %} + # Cycled logs - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlprod.log" - "logs/{{ cycle_YMDH }}/{{ RUN }}prep.log" {% if DO_JEDIATMVAR %} @@ -38,9 +33,30 @@ gdas: {% if DO_VRFY_OCEANDA %} - "logs/{{ cycle_YMDH }}/{{ RUN }}ocnanalvrfy.log" {% endif %} + + # Analysis GRIB2 (sub-sampled) data + - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl" + - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl.idx" + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl" + - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl.idx" + + # Analysis netCDF (raw) data + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmanl.nc" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}sfcanl.nc" + {% if DOHYBVAR %} + # Ensemble analysis residual - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmanl.ensres.nc" + {% if DOIAU %} + # Ensemble IAU analysis residuals + {% for fhr in iaufhrs if fhr != 6 %} + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atma{{ '%03d' % fhr }}.ensres.nc" + {% endfor %} {% endif %} + # End of ensemble analysis mean residuals + {% endif %} + + # Analysis state {% if DO_JEDIATMVAR %} - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmvar.yaml" - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmstat" @@ -50,6 +66,14 @@ gdas: - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}oznstat" - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}radstat" {% endif %} + {% if AERO_ANL_CDUMP == "gdas" or AERO_ANL_CDUMP == "both" %} + - "{{ COM_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" + {% endif %} + {% if DO_JEDISNOWDA %} + - "{{ COM_SNOW_ANALYSIS | relpath(ROTDIR) }}/{{ head }}snowstat.tgz" + {% endif %} + + # Ozone verification {% if DO_VERFOZN %} - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/time/bad_cnt.{{ cycle_YMDH }}" - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/time/bad_diag.{{ cycle_YMDH }}" @@ -58,6 +82,8 @@ gdas: - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/horiz/stdout.horiz.tar.gz" - "logs/{{ cycle_YMDH }}/{{ RUN }}verfozn.log" {% endif %} + + # Radiance verification {% if DO_VERFRAD %} - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_angle.tar.gz" - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_bcoef.tar.gz" @@ -65,6 +91,8 @@ gdas: - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_time.tar.gz" - "logs/{{ cycle_YMDH }}/{{ RUN }}verfrad.log" {% endif %} + + # Minimization monitor {% if DO_VMINMON %} - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.costs.txt" - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.cost_terms.txt" @@ -73,40 +101,44 @@ gdas: - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/gnorm_data.txt" - "logs/{{ cycle_YMDH }}/{{ RUN }}vminmon.log" {% endif %} - {% if AERO_ANL_CDUMP == "gdas" or AERO_ANL_CDUMP == "both" %} - - "{{ COM_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" - {% endif %} - {% if DO_JEDISNOWDA %} - - "{{ COM_SNOW_ANALYSIS | relpath(ROTDIR) }}/{{ head }}snowstat.tgz" - {% endif %} - {% endif %} # Full cycle + {% endif %} # End of cycled data + + # Forecast and post logs - "logs/{{ cycle_YMDH }}/{{ RUN }}fcst.log" # TODO explicitly name the atmos_prod log files to archive - "logs/{{ cycle_YMDH }}/{{ RUN }}atmos_prod_f*.log" + {% if not WRITE_DOPOST %} + # TODO set the forecast hours explicitly. This will require emulating numpy.array_split + - "logs/{{ cycle_YMDH }}/{{ RUN }}atmos_upp_f*.log" + {% endif %} ## not WRITE_DOPOST + {% for fhr in range(0, FHMAX + 1, 3) %} + # Forecast GRIB2 data - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}" - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}.idx" - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}" - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}.idx" + # Forecast GRIB2 fluxes + - "{{ COM_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2" + - "{{ COM_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2.idx" + # FV3 log - "{{ COM_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atm.logf{{ '%03d' % fhr }}.txt" + # Raw netCDF forecasts - "{{ COM_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atmf{{ '%03d' % fhr }}.nc" - "{{ COM_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}sfcf{{ '%03d' % fhr }}.nc" - - "{{ COM_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2" - - "{{ COM_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2.idx" {% endfor %} optional: - {% if current_cycle != SDATE and MODE == "cycled" %} - {% if DOHYBVAR %} - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atma003.ensres.nc" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atma009.ensres.nc" - {% endif %} + {% if MODE == "cycled" %} {% if DO_VERFRAD %} + # Radiance verification (only created if there are problems) - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/bad_diag.{{ cycle_YMDH }}" - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/bad_pen.{{ cycle_YMDH }}" - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/low_count.{{ cycle_YMDH }}" - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/warning.{{ cycle_YMDH }}" {% endif %} + {% if DO_VERFOZN %} + # Not all of these ozone instruments always produce data {% set oznmon_types = [ "gome_metop-b", "omi_aura", "ompslp_npp", "ompsnp_n20", "ompsnp_npp", "ompstc8_n20", "ompstc8_npp", "sbuv2_n19" @@ -122,7 +154,3 @@ gdas: {% endfor %} {% endif %} {% endif %} - {% if not WRITE_DOPOST %} - # TODO set the forecast hours explicitly. This will require emulating numpy.array_split - - "logs/{{ cycle_YMDH }}/{{ RUN }}atmos_upp_f*.log" - {% endif %} ## not WRITE_DOPOST diff --git a/parm/archive/gdas_restarta.yaml.j2 b/parm/archive/gdas_restarta.yaml.j2 index 9c4aa1244f..af1acbdbe7 100644 --- a/parm/archive/gdas_restarta.yaml.j2 +++ b/parm/archive/gdas_restarta.yaml.j2 @@ -3,11 +3,14 @@ gdas_restarta: name: "GDAS_RESTARTA" target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdas_restarta.tar" required: - {% if current_cycle != SDATE and MODE == "cycled" %} + # Deterministic analysis increments - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atminc.nc" + # IAU increments {% for iaufhr in iaufhrs if iaufhr != 6 %} - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmi{{ "%03d" % iaufhr }}.nc" {% endfor %} + + # Surface analysis tiles {% if DOHYBVAR and DOIAU %} {% set anl_offset = "-3H" %} {% else %} @@ -18,12 +21,20 @@ gdas_restarta: {% for itile in range(1,7) %} - "{{ COM_ATMOS_RESTART | relpath(ROTDIR) }}/{{ anl_time | to_YMD }}.{{ anl_time | strftime("%H") }}0000.sfcanl_data.tile{{ itile }}.nc" {% endfor %} + + # Initial biases {% if not DO_JEDIATMVAR %} - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias" - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_air" - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_pc" - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}radstat" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}cnvstat" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_int" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}dtfanl.nc" + - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}loginc.txt" {% endif %} + + # Snow surface data {% if DO_JEDISNOWDA %} {% for itile in range(1,7) %} # Snow analysis is 3dvar @@ -31,19 +42,13 @@ gdas_restarta: - "{{ COM_SNOW_ANALYSIS | relpath(ROTDIR) }}/{{ cycle_YMD }}.{{ cycle_HH }}0000.sfc_data.tile{{ itile }}.nc" {% endfor %} {% endif %} + + # Snow configuration yaml + {% if DO_JEDISNOWDA %} + - "{{ COM_CONF | relpath(ROTDIR) }}/{{ head }}letkfoi.yaml" {% endif %} - optional: - {% if current_cycle != SDATE and MODE == "cycled" %} + + # Input BUFR files - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}nsstbufr" - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr" - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr.acft_profiles" - {% if not DO_JEDIATMVAR %} - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}cnvstat" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_int" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}dtfanl.nc" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}loginc.txt" - {% endif %} - {% if DO_JEDISNOWDA %} - - "{{ COM_CONF | relpath(ROTDIR) }}/{{ head }}letkfoi.yaml" - {% endif %} - {% endif %} diff --git a/parm/archive/gdasocean_analysis.yaml.j2 b/parm/archive/gdasocean_analysis.yaml.j2 index 0c43cd40ba..2417ddf6e7 100644 --- a/parm/archive/gdasocean_analysis.yaml.j2 +++ b/parm/archive/gdasocean_analysis.yaml.j2 @@ -20,8 +20,6 @@ gdasocean_analysis: - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.ssh_total_stddev.nc' - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.steric_explained_variance.nc' {% endif %} - - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.adt_rads_all.stats.csv' - - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.icec_amsr2_north.stats.csv' - - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.icec_amsr2_south.stats.csv' + - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.*.stats.csv' - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/diags/*.nc4' - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/yaml/*.yaml' diff --git a/parm/archive/gfsa.yaml.j2 b/parm/archive/gfsa.yaml.j2 index 7ed12819a0..df90a1a71e 100644 --- a/parm/archive/gfsa.yaml.j2 +++ b/parm/archive/gfsa.yaml.j2 @@ -3,60 +3,62 @@ gfsa: name: "GFSA" target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfsa.tar" required: + # Logs # TODO explicitly name all logs to include {% for log in glob("logs/" ~ cycle_YMDH ~ "/gfs*.log") %} {% if not "gfsarch.log" in log %} - "{{ log }}" {% endif %} {% endfor %} - # - "logs/{{ cycle_YMDH }}/{{ RUN }}fcst.log" - # - "logs/{{ cycle_YMDH }}/{{ RUN }}atmos_prod_f*.log" + + # UFS configuration - "{{ COM_CONF | relpath(ROTDIR) }}/ufs.input.nml" + {% if MODE == "cycled" %} + # Analysis GRIB2 (gridded) data - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl" - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl.idx" - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl" - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl.idx" - # - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlprod.log" - # - "logs/{{ cycle_YMDH }}/{{ RUN }}prep.log" - # - "logs/{{ cycle_YMDH }}/{{ RUN }}anal.log" - # - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlupp.log" + {% if DO_VMINMON %} + # Minimization monitor - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.costs.txt" - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.cost_terms.txt" - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.gnorms.ieee_d" - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.reduction.ieee_d" - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/gnorm_data.txt" - # - "logs/{{ cycle_YMDH }}/{{ RUN }}vminmon.log" - {% endif %} - {% if AERO_ANL_CDUMP == "gfs" or AERO_ANL_CDUMP == "both" %} - - "{{ COM_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" {% endif %} + + # State data {% if DO_JEDIATMVAR %} - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmvar.yaml" - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmstat" {% else %} - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}gsistat" {% endif %} + {% if AERO_ANL_CDUMP == "gfs" or AERO_ANL_CDUMP == "both" %} + - "{{ COM_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" + {% endif %} + + # BUFR inputs + - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}nsstbufr" + - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr" + - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr.acft_profiles" {% endif %} # Full cycle + + # Forecast GRIB2 products {% for fhr in range(FHMIN_GFS, FHMAX_GFS + FHOUT_GFS, FHOUT_GFS) %} - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}" - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}.idx" - "{{ COM_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atm.logf{{ '%03d' % fhr }}.txt" {% endfor %} + optional: - {% if MODE == "cycled" %} - - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}nsstbufr" - - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr" - - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr.acft_profiles" - {% endif %} # cycled + # Cyclone tracking data; only present if there's something to track. - "{{ COM_ATMOS_TRACK | relpath(ROTDIR) }}/avno.t{{ cycle_HH }}z.cyclone.trackatcfunix" - "{{ COM_ATMOS_TRACK | relpath(ROTDIR) }}/avnop.t{{ cycle_HH }}z.cyclone.trackatcfunix" - "{{ COM_ATMOS_GENESIS | relpath(ROTDIR) }}/trak.gfso.atcfunix.{{ cycle_YMDH }}" - "{{ COM_ATMOS_GENESIS | relpath(ROTDIR) }}/trak.gfso.atcfunix.altg.{{ cycle_YMDH }}" - "{{ COM_ATMOS_GENESIS | relpath(ROTDIR) }}/storms.gfso.atcf_gen.{{ cycle_YMDH }}" - "{{ COM_ATMOS_GENESIS | relpath(ROTDIR) }}/storms.gfso.atcf_gen.altg.{{ cycle_YMDH }}" - # {% if not WRITE_DOPOST %} - # # TODO set the forecast hours explicitly. This will require emulating numpy.array_split - # - "logs/{{ cycle_YMDH }}/{{ RUN }}atmos_upp_f*.log" - # {% endif %} ## not WRITE_DOPOST diff --git a/parm/archive/gfsb.yaml.j2 b/parm/archive/gfsb.yaml.j2 index 721b529278..cbb4d4fad8 100644 --- a/parm/archive/gfsb.yaml.j2 +++ b/parm/archive/gfsb.yaml.j2 @@ -4,11 +4,14 @@ gfsb: target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfsb.tar" required: {% if MODE == "cycled" %} + # GRIB2 (subsampled) analysis data - "{{ COM_ATMOS_GRIB_0p50 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p50.anl" - "{{ COM_ATMOS_GRIB_0p50 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p50.anl.idx" - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl" - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl.idx" {% endif %} + + # GRIB2 orecast data {% for fhr in range(FHMIN_GFS, FHMAX_GFS + FHOUT_GFS, FHOUT_GFS) %} - "{{ COM_ATMOS_GRIB_0p50 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p50.f{{ '%03d' % fhr }}" - "{{ COM_ATMOS_GRIB_0p50 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p50.f{{ '%03d' % fhr }}.idx" diff --git a/parm/archive/gfswave.yaml.j2 b/parm/archive/gfswave.yaml.j2 index 8542afac0c..8422377b7a 100644 --- a/parm/archive/gfswave.yaml.j2 +++ b/parm/archive/gfswave.yaml.j2 @@ -3,19 +3,26 @@ gfswave: name: "GFSWAVE" target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfswave.tar" required: + # Wave GRIB2 regional forecast products {% for fh in range(0, FHMAX_HF_WAV + FHOUT_HF_WAV, FHOUT_HF_WAV) %} # NOTE This is as explicit as possible without major logic to parse wavepostGRD. # Matches files of the form "gfswave.tCCz...fHHH.grib2". - "{{ COM_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2" - "{{ COM_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2.idx" {% endfor %} + + # Global wave GRIB2 forecast products {% for fh in range(FHMAX_HF_WAV + FHOUT_WAV, FHMAX_WAV_GFS + FHOUT_WAV, FHOUT_WAV) %} - "{{ COM_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2" - "{{ COM_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2.idx" {% endfor %} + + # Wave bulletins - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}bull_tar" - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}cbull_tar" - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}spec_tar.gz" + + # Wave IBP bulletins {% if DOIBP_WAV %} - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}ibpbull_tar" - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}ibpcbull_tar" diff --git a/parm/archive/ice_grib2.yaml.j2 b/parm/archive/ice_grib2.yaml.j2 index 42e6910a16..83e0a30085 100644 --- a/parm/archive/ice_grib2.yaml.j2 +++ b/parm/archive/ice_grib2.yaml.j2 @@ -3,6 +3,7 @@ ice_grib2: name: "ICE_GRIB2" target: "{{ ATARDIR }}/{{ cycle_YMDH }}/ice_grib2.tar" required: + # Ice forecast GRIB2 products {% for fhr in range(FHOUT_OCNICE_GFS, FHMAX_GFS + FHOUT_OCNICE_GFS, FHOUT_OCNICE_GFS) %} {% set fhr3 = '%03d' % fhr %} {% if ICERES == 500 %} diff --git a/parm/archive/master_enkf.yaml.j2 b/parm/archive/master_enkf.yaml.j2 index 7ab7f45e30..fb6a3d30ac 100644 --- a/parm/archive/master_enkf.yaml.j2 +++ b/parm/archive/master_enkf.yaml.j2 @@ -4,15 +4,19 @@ {% set cycle_YMDH = current_cycle | to_YMDH %} {% set head = RUN + ".t" + cycle_HH + "z." %} +# Split IAUFHRS into a list; typically either "3,6,9" or 6 (integer) {% if IAUFHRS is string %} +# "3,6,9" {% set iaufhrs = [] %} {% for iaufhr in IAUFHRS.split(",") %} {% do iaufhrs.append(iaufhr | int) %} {% endfor %} {% else %} +# 6 (integer) {% set iaufhrs = [IAUFHRS] %} {% endif %} +# Repeat for IAUFHRS_ENKF {% if IAUFHRS_ENKF is string %} {% set iaufhrs_enkf = [] %} {% for iaufhr in IAUFHRS_ENKF.split(",") %} @@ -22,22 +26,29 @@ {% set iaufhrs_enkf = [IAUFHRS_ENKF] %} {% endif %} +# Determine which data to archive datasets: {% if ENSGRP == 0 %} {% filter indent(width=4) %} +# Archive the ensemble means and spreads {% include "enkf.yaml.j2" %} {% endfilter %} {% else %} +# Archive individual member data +# First, construct individual member directories from templates +# COM_ATMOS_ANALYSIS_MEM, COM_ATMOS_HISTORY_MEM, and COM_ATMOS_RESTART_MEM + # Declare to-be-filled lists of member COM directories {% set COM_ATMOS_ANALYSIS_MEM_list = [] %} {% set COM_ATMOS_RESTART_MEM_list = [] %} {% set COM_ATMOS_HISTORY_MEM_list = [] %} +# Determine which ensemble members belong to this group {% set first_group_mem = (ENSGRP - 1) * NMEM_EARCGRP + 1 %} {% set last_group_mem = [ ENSGRP * NMEM_EARCGRP, nmem_ens ] | min %} -# Construct member COM directories +# Construct member COM directories for the group {% for mem in range(first_group_mem, last_group_mem + 1) %} # Declare a dict of search and replace terms to run on each template @@ -63,13 +74,14 @@ datasets: {% set com_ns.COM_ATMOS_RESTART_MEM = com_ns.COM_ATMOS_RESTART_MEM.replace(search_term, replace_term) %} {% endfor %} +# Append the member COM directories {% do COM_ATMOS_ANALYSIS_MEM_list.append(com_ns.COM_ATMOS_ANALYSIS_MEM)%} {% do COM_ATMOS_HISTORY_MEM_list.append(com_ns.COM_ATMOS_HISTORY_MEM)%} {% do COM_ATMOS_RESTART_MEM_list.append(com_ns.COM_ATMOS_RESTART_MEM)%} {% endfor %} -# Determine which members to archive +# Archive member data {% filter indent(width=4) %} {% include "enkf_grp.yaml.j2" %} {% endfilter %} @@ -80,7 +92,7 @@ datasets: # Save the increments and restarts every ARCH_WARMICFREQ days # The ensemble increments (group a) should be saved on the ARCH_CYC {% if (current_cycle - SDATE).days % ARCH_WARMICFREQ == 0 %} -{% if ARCH_CYC == cycle_HH | int and current_cycle != SDATE %} +{% if ARCH_CYC == cycle_HH | int %} {% filter indent(width=4) %} {% include "enkf_restarta_grp.yaml.j2" %} {% endfilter %} @@ -90,11 +102,12 @@ datasets: # The ensemble ICs (group b) are restarts and always lag increments by assim_freq {% set ics_offset = (assim_freq | string + "H") | to_timedelta %} {% if (current_cycle | add_to_datetime(ics_offset) - SDATE).days % ARCH_WARMICFREQ == 0 %} -{% if (ARCH_CYC - assim_freq) % 24 == cycle_HH | int and current_cycle != SDATE %} +{% if (ARCH_CYC - assim_freq) % 24 == cycle_HH | int %} {% filter indent(width=4) %} {% include "enkf_restartb_grp.yaml.j2" %} {% endfilter %} {% endif %} {% endif %} -{% endif %} # ENSGRP != 0 +# End of individual member archiving +{% endif %} diff --git a/parm/archive/master_gdas.yaml.j2 b/parm/archive/master_gdas.yaml.j2 index 6813209e6a..f25fd9de40 100644 --- a/parm/archive/master_gdas.yaml.j2 +++ b/parm/archive/master_gdas.yaml.j2 @@ -3,6 +3,7 @@ {% set cycle_YMDH = current_cycle | to_YMDH %} {% set head = "gdas.t" + cycle_HH + "z." %} +# Split IAUFHRS into a list; typically either "3,6,9" or 6 (integer) {% if IAUFHRS is string %} {% set iaufhrs = [] %} {% for iaufhr in IAUFHRS.split(",") %} @@ -13,21 +14,25 @@ {% endif %} datasets: +# Always archive atmosphere forecast/analysis data {% filter indent(width=4) %} {% include "gdas.yaml.j2" %} {% endfilter %} {% if DO_ICE %} +# Ice data {% filter indent(width=4) %} {% include "gdasice.yaml.j2" %} {% endfilter %} {% endif %} {% if DO_OCN %} +# Ocean forecast products {% filter indent(width=4) %} {% include "gdasocean.yaml.j2" %} {% endfilter %} -{% if DO_JEDIOCNVAR and current_cycle != SDATE and MODE == "cycled" %} +{% if DO_JEDIOCNVAR and MODE == "cycled" %} +# Ocean analysis products {% filter indent(width=4) %} {% include "gdasocean_analysis.yaml.j2" %} {% endfilter %} @@ -35,15 +40,17 @@ datasets: {% endif %} {% if DO_WAVE %} +# Wave products {% filter indent(width=4) %} {% include "gdaswave.yaml.j2" %} {% endfilter %} {% endif %} -# Determine if we will save restart ICs or not +{% if MODE == "cycled" %} +# Determine if we will save restart ICs or not (only valid for cycled) {% set save_warm_start_forecast, save_warm_start_cycled = ( False, False ) %} -{% if ARCH_CYC == cycle_HH | int and current_cycle != SDATE%} +{% if ARCH_CYC == cycle_HH | int%} # Save the warm and forecast-only cycle ICs every ARCH_WARMICFREQ days {% if (current_cycle - SDATE).days % ARCH_WARMICFREQ == 0 %} {% set save_warm_start_forecast = True %} @@ -55,33 +62,42 @@ datasets: {% endif %} {% if save_warm_start_forecast %} +# Save warm start forecast-only data +# Atmosphere restarts {% filter indent(width=4) %} {% include "gdas_restarta.yaml.j2" %} {% endfilter %} {% if DO_WAVE %} +# Wave restarts {% filter indent(width=4) %} {% include "gdaswave_restart.yaml.j2" %} {% endfilter %} {% endif %} {% if DO_OCN %} +# Ocean restarts {% filter indent(width=4) %} {% include "gdasocean_restart.yaml.j2" %} {% endfilter %} {% endif %} {% if DO_ICE %} +# Ice restarts {% filter indent(width=4) %} {% include "gdasice_restart.yaml.j2" %} {% endfilter %} {% endif %} -{% endif %} # Save forecast-only restarts +# End of forecast-only restarts +{% endif %} -# Save cycled restarts {% if save_warm_start_cycled %} +# Save warm start cycled restarts {% filter indent(width=4) %} {% include "gdas_restartb.yaml.j2" %} {% endfilter %} {% endif %} + +# End of restart checking +{% endif %} diff --git a/parm/archive/master_gfs.yaml.j2 b/parm/archive/master_gfs.yaml.j2 index 5340ddb721..e96def7a03 100644 --- a/parm/archive/master_gfs.yaml.j2 +++ b/parm/archive/master_gfs.yaml.j2 @@ -1,28 +1,37 @@ +# Set variables/lists needed to parse the enkf templates {% set cycle_HH = current_cycle | strftime("%H") %} {% set cycle_YMD = current_cycle | to_YMD %} {% set cycle_YMDH = current_cycle | to_YMDH %} +# Split IAUFHRS into a list; typically either "3,6,9" or 6 (integer) {% if IAUFHRS is string %} +# "3,6,9" {% set iaufhrs = [] %} {% for iaufhr in IAUFHRS.split(",") %} {% do iaufhrs.append(iaufhr | int) %} {% endfor %} {% else %} +# 6 (integer) {% set iaufhrs = [IAUFHRS] %} {% endif %} + +# Determine which data to archive datasets: +# Always archive atmosphere forecast/analysis data {% filter indent(width=4) %} {% include "gfsa.yaml.j2" %} {% include "gfsb.yaml.j2" %} {% endfilter %} {% if ARCH_GAUSSIAN %} +# Archive Gaussian data {% filter indent(width=4) %} {% include "gfs_flux.yaml.j2" %} {% include "gfs_netcdfb.yaml.j2" %} {% include "gfs_pgrb2b.yaml.j2" %} {% endfilter %} {% if MODE == "cycled" %} +# Archive Gaussian analysis data {% filter indent(width=4) %} {% include "gfs_netcdfa.yaml.j2" %} {% endfilter %} @@ -30,24 +39,21 @@ datasets: {% endif %} {% if DO_WAVE %} +# Wave forecasts {% filter indent(width=4) %} {% include "gfswave.yaml.j2" %} {% endfilter %} {% endif %} {% if AERO_FCST_CDUMP == "gfs" or AERO_FCST_CDUMP == "both" %} +# Aerosol forecasts {% filter indent(width=4) %} {% include "chem.yaml.j2" %} {% endfilter %} {% endif %} -{% if DO_BUFRSND %} -{% filter indent(width=4) %} -{% include "gfs_downstream.yaml.j2" %} -{% endfilter %} -{% endif %} - {% if DO_OCN %} +# Ocean forecasts {% filter indent(width=4) %} {% include "ocean_6hravg.yaml.j2" %} {% include "ocean_daily.yaml.j2" %} @@ -57,19 +63,30 @@ datasets: {% endif %} {% if DO_ICE %} +# Ice forecasts {% filter indent(width=4) %} {% include "ice_6hravg.yaml.j2" %} {% include "ice_grib2.yaml.j2" %} {% endfilter %} {% endif %} +{% if DO_BUFRSND %} +# Downstream BUFR soundings +{% filter indent(width=4) %} +{% include "gfs_downstream.yaml.j2" %} +{% endfilter %} +{% endif %} + # Determine whether to save the MOS tarball {% if DO_MOS and cycle_HH == "18" %} + {% if not REALTIME %} {% filter indent(width=4) %} {% include "gfsmos.yaml.j2" %} {% endfilter %} + {% else %} + {% set td_from_sdate = current_cycle - SDATE %} {% set td_one_day = "+1D" | to_timedelta %} {% if td_from_sdate > td_one_day %} @@ -77,11 +94,12 @@ datasets: {% include "gfsmos.yaml.j2" %} {% endfilter %} {% endif %} + {% endif %} {% endif %} # Determine if we will save restart ICs or not -{% if ARCH_CYC == cycle_HH | int and current_cycle != SDATE %} +{% if ARCH_CYC == cycle_HH | int %} # Save the forecast-only cycle ICs every ARCH_WARMICFREQ or ARCH_FCSTICFREQ days {% if (current_cycle - SDATE).days % ARCH_WARMICFREQ == 0 %} {% filter indent(width=4) %} diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base index 50fcc168d7..d9f22f7049 100644 --- a/parm/config/gfs/config.base +++ b/parm/config/gfs/config.base @@ -444,6 +444,10 @@ export DO_METP="NO" # Run METPLUS jobs - set METPLUS settings in config export DO_FIT2OBS="YES" # Run fit to observations package export DO_VRFY_OCEANDA="@DO_VRFY_OCEANDA@" # Run SOCA Ocean and Seaice DA verification tasks +#--online archive of netcdf files for fit2obs verification +export FHMAX_FITS=132 +[[ "${FHMAX_FITS}" -gt "${FHMAX_GFS}" ]] && export FHMAX_FITS=${FHMAX_GFS} + # Archiving options export HPSSARCH="@HPSSARCH@" # save data to HPSS archive export LOCALARCH="@LOCALARCH@" # save data to local archive @@ -455,11 +459,6 @@ export ARCH_CYC=00 # Archive data at this cycle for warm_start capabil export ARCH_WARMICFREQ=4 # Archive frequency in days for warm_start capability export ARCH_FCSTICFREQ=1 # Archive frequency in days for gdas and gfs forecast-only capability -#--online archive of nemsio files for fit2obs verification -export FITSARC="YES" -export FHMAX_FITS=132 -[[ "${FHMAX_FITS}" -gt "${FHMAX_GFS}" ]] && export FHMAX_FITS=${FHMAX_GFS} - # The monitor jobs are not yet supported for JEDIATMVAR. if [[ ${DO_JEDIATMVAR} = "YES" ]]; then export DO_VERFOZN="NO" # Ozone data assimilation monitoring diff --git a/scripts/exglobal_archive.py b/scripts/exglobal_archive.py index 31b5eb1186..d700eebb5d 100755 --- a/scripts/exglobal_archive.py +++ b/scripts/exglobal_archive.py @@ -31,7 +31,7 @@ def main(): 'restart_interval_gdas', 'restart_interval_gfs', 'AERO_ANL_CDUMP', 'AERO_FCST_CDUMP', 'DOIBP_WAV', 'DO_JEDIOCNVAR', 'NMEM_ENS', 'DO_JEDIATMVAR', 'DO_VRFY_OCEANDA', 'FHMAX_FITS', - 'FITSARC', 'IAUFHRS'] + 'IAUFHRS', 'DO_FIT2OBS'] archive_dict = AttrDict() for key in keys: diff --git a/sorc/wxflow b/sorc/wxflow index 71f6b10f76..8406beeea4 160000 --- a/sorc/wxflow +++ b/sorc/wxflow @@ -1 +1 @@ -Subproject commit 71f6b10f76a440993580027ba1183d61277d1299 +Subproject commit 8406beeea410118cdfbd8300895b2b2878eadba6 diff --git a/ush/python/pygfs/task/archive.py b/ush/python/pygfs/task/archive.py index d66b02d7bc..66d94878e8 100644 --- a/ush/python/pygfs/task/archive.py +++ b/ush/python/pygfs/task/archive.py @@ -59,10 +59,22 @@ def configure(self, arch_dict: Dict[str, Any]) -> (Dict[str, Any], List[Dict[str List of tarballs and instructions for creating them via tar or htar """ + if not os.path.isdir(arch_dict.ROTDIR): + raise FileNotFoundError(f"FATAL ERROR: The ROTDIR ({arch_dict.ROTDIR}) does not exist!") + + if arch_dict.RUN == "gefs": + raise NotImplementedError("FATAL ERROR: Archiving is not yet set up for GEFS runs") + + if arch_dict.RUN in ["gdas", "gfs"]: + + # Copy the cyclone track files and rename the experiments + # TODO This really doesn't belong in archiving and should be moved elsewhere + Archive._rename_cyclone_expt(arch_dict) + archive_parm = os.path.join(arch_dict.PARMgfs, "archive") # Collect the dataset to archive locally - arcdir_filename = os.path.join(archive_parm, "arcdir.yaml.j2") + arcdir_j2yaml = os.path.join(archive_parm, "arcdir.yaml.j2") # Add the glob.glob function for capturing log filenames # TODO remove this kludge once log filenames are explicit @@ -72,7 +84,16 @@ def configure(self, arch_dict: Dict[str, Any]) -> (Dict[str, Any], List[Dict[str arch_dict['path_exists'] = os.path.exists # Parse the input jinja yaml template - arcdir_set = parse_j2yaml(arcdir_filename, arch_dict) + arcdir_set = Archive._construct_arcdir_set(arcdir_j2yaml, + arch_dict) + + if not os.path.isdir(arch_dict.ROTDIR): + raise FileNotFoundError(f"FATAL ERROR: The ROTDIR ({arch_dict.ROTDIR}) does not exist!") + + if arch_dict.RUN in ["gdas", "gfs"]: + + # Copy the cyclone track files and rename the experiments + Archive._rename_cyclone_expt(arch_dict) # Collect datasets that need to be archived # Each dataset represents one tarball @@ -95,20 +116,11 @@ def configure(self, arch_dict: Dict[str, Any]) -> (Dict[str, Any], List[Dict[str self.tar_cmd = "" return arcdir_set, [] - if not os.path.isdir(arch_dict.ROTDIR): - raise FileNotFoundError(f"FATAL ERROR: The ROTDIR ({arch_dict.ROTDIR}) does not exist!") - - if arch_dict.RUN == "gdas" or arch_dict.RUN == "gfs": - - # Copy the cyclone track files and rename the experiments - Archive._rename_cyclone_expt(arch_dict) - - if arch_dict.RUN == "gefs": - raise NotImplementedError("FATAL ERROR: Archiving is not yet set up for GEFS runs") - master_yaml = "master_" + arch_dict.RUN + ".yaml.j2" - parsed_sets = parse_j2yaml(os.path.join(archive_parm, master_yaml), arch_dict) + parsed_sets = parse_j2yaml(os.path.join(archive_parm, master_yaml), + arch_dict, + allow_missing=False) atardir_sets = [] @@ -136,8 +148,7 @@ def execute_store_products(self, arcdir_set: Dict[str, Any]) -> None: """ # Copy files to the local ARCDIR - for key in arcdir_set.keys(): - FileHandler(arcdir_set[key]).sync() + FileHandler(arcdir_set).sync() @logit(logger) def execute_backup_dataset(self, atardir_set: Dict[str, Any]) -> None: @@ -312,6 +323,47 @@ def _gen_relative_paths(self, root_path: str) -> Dict: return rel_path_dict + @staticmethod + @logit(logger) + def _construct_arcdir_set(arcdir_j2yaml, arch_dict) -> Dict: + """Construct the list of files to send to the ARCDIR and Fit2Obs + directories from a template. + + TODO Copying Fit2Obs data doesn't belong in archiving should be + moved elsewhere. + + Parameters + ---------- + arcdir_j2yaml: str + The filename of the ARCDIR jinja template to parse. + + arch_dict: Dict + The context dictionary to parse arcdir_j2yaml with. + + Return + ------ + arcdir_set : Dict + FileHandler dictionary (i.e. with top level "mkdir" and "copy" keys) + containing all directories that need to be created and what data + files need to be copied to the ARCDIR and the Fit2Obs directory. + """ + + # Parse the input jinja yaml template + arcdir_yaml = parse_j2yaml(arcdir_j2yaml, + arch_dict, + allow_missing=True) + + # Collect the needed FileHandler dicts and construct arcdir_set + arcdir_set = {} + for key, handler in arcdir_yaml[arch_dict.RUN].items(): + # Different RUNs can have different filesets that need to be copied. + # Each fileset is stored as a dictionary. Collect the contents of + # each (which should be 'mkdir' and/or 'copy') to produce singular + # mkdir and copy lists. + arcdir_set.update(handler) + + return arcdir_set + @staticmethod @logit(logger) def _rename_cyclone_expt(arch_dict) -> None: diff --git a/workflow/rocoto/gfs_tasks.py b/workflow/rocoto/gfs_tasks.py index 24da085bcc..fa218c6713 100644 --- a/workflow/rocoto/gfs_tasks.py +++ b/workflow/rocoto/gfs_tasks.py @@ -2129,7 +2129,6 @@ def mos_wx_ext_prdgen(self): def arch(self): deps = [] - dependencies = [] if self.app_config.mode in ['cycled']: if self.cdump in ['gfs']: dep_dict = {'type': 'task', 'name': f'{self.cdump}atmanlprod'} @@ -2137,26 +2136,21 @@ def arch(self): if self.app_config.do_vminmon: dep_dict = {'type': 'task', 'name': f'{self.cdump}vminmon'} deps.append(rocoto.add_dependency(dep_dict)) - elif self.cdump in ['gdas']: # Block for handling half cycle dependencies - deps2 = [] + elif self.cdump in ['gdas']: dep_dict = {'type': 'task', 'name': f'{self.cdump}atmanlprod'} - deps2.append(rocoto.add_dependency(dep_dict)) + deps.append(rocoto.add_dependency(dep_dict)) if self.app_config.do_fit2obs: dep_dict = {'type': 'task', 'name': f'{self.cdump}fit2obs'} - deps2.append(rocoto.add_dependency(dep_dict)) + deps.append(rocoto.add_dependency(dep_dict)) if self.app_config.do_verfozn: dep_dict = {'type': 'task', 'name': f'{self.cdump}verfozn'} - deps2.append(rocoto.add_dependency(dep_dict)) + deps.append(rocoto.add_dependency(dep_dict)) if self.app_config.do_verfrad: dep_dict = {'type': 'task', 'name': f'{self.cdump}verfrad'} - deps2.append(rocoto.add_dependency(dep_dict)) + deps.append(rocoto.add_dependency(dep_dict)) if self.app_config.do_vminmon: dep_dict = {'type': 'task', 'name': f'{self.cdump}vminmon'} - deps2.append(rocoto.add_dependency(dep_dict)) - dependencies = rocoto.create_dependency(dep_condition='and', dep=deps2) - dep_dict = {'type': 'cycleexist', 'condition': 'not', 'offset': f"-{timedelta_to_HMS(self._base['cycle_interval'])}"} - dependencies.append(rocoto.add_dependency(dep_dict)) - dependencies = rocoto.create_dependency(dep_condition='or', dep=dependencies) + deps.append(rocoto.add_dependency(dep_dict)) if self.cdump in ['gfs'] and self.app_config.do_tracker: dep_dict = {'type': 'task', 'name': f'{self.cdump}tracker'} deps.append(rocoto.add_dependency(dep_dict)) @@ -2195,9 +2189,7 @@ def arch(self): dep_dict = {'type': 'task', 'name': f'{self.cdump}mos_{job}'} deps.append(rocoto.add_dependency(dep_dict)) - dependencies = rocoto.create_dependency(dep_condition='and', dep=deps + dependencies) - - cycledef = 'gdas_half,gdas' if self.cdump in ['gdas'] else self.cdump + dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) resources = self.get_resource('arch') task_name = f'{self.cdump}arch' @@ -2205,7 +2197,7 @@ def arch(self): 'resources': resources, 'dependency': dependencies, 'envars': self.envars, - 'cycledef': cycledef, + 'cycledef': self.cdump.replace('enkf', ''), 'command': f'{self.HOMEgfs}/jobs/rocoto/arch.sh', 'job_name': f'{self.pslot}_{task_name}_@H', 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log', @@ -2723,8 +2715,6 @@ def earc(self): n_groups = -(self.nmem // -self._configs['earc']['NMEM_EARCGRP']) groups = ' '.join([f'{grp:02d}' for grp in range(0, n_groups + 1)]) - cycledef = 'gdas_half,gdas' if self.cdump in ['enkfgdas'] else self.cdump.replace('enkf', '') - resources = self.get_resource('earc') var_dict = {'grp': groups} @@ -2734,7 +2724,7 @@ def earc(self): 'resources': resources, 'dependency': dependencies, 'envars': earcenvars, - 'cycledef': cycledef, + 'cycledef': self.cdump.replace('enkf', ''), 'command': f'{self.HOMEgfs}/jobs/rocoto/earc.sh', 'job_name': f'{self.pslot}_{task_name}_@H', 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log', From 237d6dd213e8b1455d2f45dc5978fb2d3de93e60 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Tue, 4 Jun 2024 13:55:33 +0000 Subject: [PATCH 15/45] Add IAU to snow DA (and its test) (#2610) This PR enables IAU for the snow DA which is necessary for GFSv17. A snow analysis is created for the center of the window regardless, and an additional at the beginning of the window is added if IAU is on. The former is needed for UPP and the latter, to initialize the model. The increment is valid throughout the window for 3DVar, so the same increment is added to both forecasts. Additionally, the input file that goes into global_cycle has been updated to be the output of the JEDI snow analysis instead of the forecast (@jiaruidong2017 I recall discussing this, can you confirm this is right or am I mistaken) This PR also makes the CI test for snow DA (and aerosol DA) include IAU rather than without IAU,. --------- Co-authored-by: Rahul Mahajan Co-authored-by: Walter Kolczynski - NOAA --- ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml | 1 - jobs/JGLOBAL_ATMOS_SFCANL | 41 ++-- scripts/exglobal_atmos_sfcanl.sh | 223 ++++++------------ ush/python/pygfs/task/snow_analysis.py | 115 ++++++--- 4 files changed, 170 insertions(+), 210 deletions(-) diff --git a/ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml b/ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml index 624af591fc..6d978e25ef 100644 --- a/ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml +++ b/ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml @@ -1,6 +1,5 @@ defaults: !INC {{ HOMEgfs }}/parm/config/gfs/yaml/defaults.yaml base: - DOIAU: "NO" DO_JEDISNOWDA: "YES" ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} diff --git a/jobs/JGLOBAL_ATMOS_SFCANL b/jobs/JGLOBAL_ATMOS_SFCANL index e1716a6134..2822b1e94b 100755 --- a/jobs/JGLOBAL_ATMOS_SFCANL +++ b/jobs/JGLOBAL_ATMOS_SFCANL @@ -4,40 +4,35 @@ source "${HOMEgfs}/ush/preamble.sh" source "${HOMEgfs}/ush/jjob_header.sh" -e "sfcanl" -c "base sfcanl" -############################################## -# Set variables used in the script -############################################## -export CDUMP="${RUN/enkf}" - - ############################################## # Begin JOB SPECIFIC work ############################################## # Ignore possible spelling error (nothing is misspelled) # shellcheck disable=SC2153 -GDATE=$(${NDATE} -"${assim_freq}" "${PDY}${cyc}") -# shellcheck disable= -gPDY=${GDATE:0:8} -gcyc=${GDATE:8:2} -export GDUMP="gdas" +GDATE=$(date --utc -d "${PDY} ${cyc} - ${assim_freq} hours" +%Y%m%d%H) +export GDATE + +RUN="gdas" YMD=${GDATE:0:8} HH=${GDATE:8:2} declare_from_tmpl -rx \ + COMIN_OBS_PREV:COM_OBS_TMPL \ + COMIN_ATMOS_RESTART_PREV:COM_ATMOS_RESTART_TMPL + +YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \ + COMIN_OBS:COM_OBS_TMPL \ + COMIN_ATMOS_ANALYSIS:COM_ATMOS_ANALYSIS_TMPL \ + COMIN_SNOW_ANALYSIS:COM_SNOW_ANALYSIS_TMPL -export OPREFIX="${CDUMP}.t${cyc}z." -export GPREFIX="${GDUMP}.t${gcyc}z." -export APREFIX="${CDUMP}.t${cyc}z." +YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \ + COMOUT_ATMOS_RESTART:COM_ATMOS_RESTART_TMPL -YMD=${PDY} HH=${cyc} declare_from_tmpl -rx COM_OBS COM_ATMOS_ANALYSIS COM_ATMOS_RESTART \ - COM_SNOW_ANALYSIS +mkdir -p "${COMOUT_ATMOS_RESTART}" -RUN=${GDUMP} YMD=${gPDY} HH=${gcyc} declare_from_tmpl -rx \ - COM_OBS_PREV:COM_OBS_TMPL \ - COM_ATMOS_RESTART_PREV:COM_ATMOS_RESTART_TMPL ############################################################### # Run relevant script ${SFCANALSH:-${SCRgfs}/exglobal_atmos_sfcanl.sh} status=$? -[[ ${status} -ne 0 ]] && exit ${status} +(( status != 0 )) && exit "${status}" ############################################## @@ -48,14 +43,14 @@ status=$? # Final processing ############################################## if [[ -e "${pgmout}" ]] ; then - cat ${pgmout} + cat "${pgmout}" fi ########################################## # Remove the Temporary working directory ########################################## -cd ${DATAROOT} -[[ ${KEEPDATA} = "NO" ]] && rm -rf ${DATA} +cd "${DATAROOT}" +[[ "${KEEPDATA}" == "NO" ]] && rm -rf "${DATA}" exit 0 diff --git a/scripts/exglobal_atmos_sfcanl.sh b/scripts/exglobal_atmos_sfcanl.sh index 8ac3f285e5..cbc43b0979 100755 --- a/scripts/exglobal_atmos_sfcanl.sh +++ b/scripts/exglobal_atmos_sfcanl.sh @@ -22,198 +22,127 @@ source "${USHgfs}/preamble.sh" # Directories. -pwd=$(pwd) +cd "${DATA}" || exit 99 # Derived base variables -# Ignore possible spelling error (nothing is misspelled) -# shellcheck disable=SC2153 -GDATE=$(${NDATE} -"${assim_freq}" "${PDY}${cyc}") -BDATE=$(${NDATE} -3 "${PDY}${cyc}") -bPDY=${BDATE:0:8} -bcyc=${BDATE:8:2} - -# Utilities -export CHGRP_CMD=${CHGRP_CMD:-"chgrp ${group_name:-rstprod}"} -export NCLEN=${NCLEN:-${USHgfs}/getncdimlen} -COMPRESS=${COMPRESS:-gzip} -UNCOMPRESS=${UNCOMPRESS:-gunzip} -APRUNCFP=${APRUNCFP:-""} - -# IAU -DOIAU=${DOIAU:-"NO"} -export IAUFHRS=${IAUFHRS:-"6"} -# Surface cycle related parameters +# Dependent Scripts and Executables CYCLESH=${CYCLESH:-${USHgfs}/global_cycle.sh} export CYCLEXEC=${CYCLEXEC:-${EXECgfs}/global_cycle} NTHREADS_CYCLE=${NTHREADS_CYCLE:-24} APRUN_CYCLE=${APRUN_CYCLE:-${APRUN:-""}} + +# Surface cycle related parameters export SNOW_NUDGE_COEFF=${SNOW_NUDGE_COEFF:-'-2.'} export CYCLVARS=${CYCLVARS:-""} export FHOUR=${FHOUR:-0} export DELTSFC=${DELTSFC:-6} -# FV3 specific info (required for global_cycle) -export CASE=${CASE:-"C384"} -ntiles=${ntiles:-6} - -# IAU -DOIAU=${DOIAU:-"NO"} -export IAUFHRS=${IAUFHRS:-"6"} - -# Dependent Scripts and Executables -export NTHREADS_CALCINC=${NTHREADS_CALCINC:-1} -export APRUN_CALCINC=${APRUN_CALCINC:-${APRUN:-""}} -export APRUN_CALCANL=${APRUN_CALCANL:-${APRUN:-""}} -export APRUN_CHGRES=${APRUN_CALCANL:-${APRUN:-""}} - -export CALCANLEXEC=${CALCANLEXEC:-${EXECgfs}/calc_analysis.x} -export CHGRESNCEXEC=${CHGRESNCEXEC:-${EXECgfs}/enkf_chgres_recenter_nc.x} -export CHGRESINCEXEC=${CHGRESINCEXEC:-${EXECgfs}/interp_inc.x} -export NTHREADS_CHGRES=${NTHREADS_CHGRES:-1} -CALCINCPY=${CALCINCPY:-${USHgfs}/calcinc_gfs.py} -CALCANLPY=${CALCANLPY:-${USHgfs}/calcanl_gfs.py} - -export APRUN_CHGRES=${APRUN_CALCANL:-${APRUN:-""}} -CHGRESEXEC=${CHGRESEXEC:-${EXECgfs}/enkf_chgres_recenter.x} - -# OPS flags -RUN=${RUN:-""} -SENDECF=${SENDECF:-"NO"} -SENDDBN=${SENDDBN:-"NO"} +# Other info used in this script RUN_GETGES=${RUN_GETGES:-"NO"} GETGESSH=${GETGESSH:-"getges.sh"} export gesenvir=${gesenvir:-${envir}} +# Ignore possible spelling error (nothing is misspelled) +# shellcheck disable=SC2153 +GPREFIX="gdas.t${GDATE:8:2}z." +OPREFIX="${RUN/enkf}.t${cyc}z." +APREFIX="${RUN/enkf}.t${cyc}z." -# Observations -OPREFIX=${OPREFIX:-""} -OSUFFIX=${OSUFFIX:-""} - -# Guess files -GPREFIX=${GPREFIX:-""} +ntiles=6 -# Analysis files -export APREFIX=${APREFIX:-""} -DTFANL=${DTFANL:-${COM_ATMOS_ANALYSIS}/${APREFIX}dtfanl.nc} +############################################################## # Get dimension information based on CASE -res=$(echo ${CASE} | cut -c2-) +res="${CASE:1}" JCAP_CASE=$((res*2-2)) LATB_CASE=$((res*2)) LONB_CASE=$((res*4)) -################################################################################ -# Preprocessing -mkdata=NO -if [[ ! -d ${DATA} ]]; then - mkdata=YES - mkdir -p ${DATA} -fi - -cd ${DATA} || exit 99 - -if [[ ${DONST} = "YES" ]]; then - export NSSTBF="${COM_OBS}/${OPREFIX}nsstbufr" - ${NLN} ${NSSTBF} nsstbufr -fi - - -############################################################## -# Required model guess files - - -############################################################## -# Output files -if [[ ${DONST} = "YES" ]]; then - ${NLN} ${DTFANL} dtfanl -fi - - -############################################################## -# Update surface fields in the FV3 restart's using global_cycle -mkdir -p "${COM_ATMOS_RESTART}" - # Global cycle requires these files -export FNTSFA=${FNTSFA:-${COM_OBS}/${OPREFIX}rtgssthr.grb} -export FNACNA=${FNACNA:-${COM_OBS}/${OPREFIX}seaice.5min.blend.grb} -export FNSNOA=${FNSNOA:-${COM_OBS}/${OPREFIX}snogrb_t${JCAP_CASE}.${LONB_CASE}.${LATB_CASE}} -[[ ! -f ${FNSNOA} ]] && export FNSNOA="${COM_OBS}/${OPREFIX}snogrb_t1534.3072.1536" -FNSNOG=${FNSNOG:-${COM_OBS_PREV}/${GPREFIX}snogrb_t${JCAP_CASE}.${LONB_CASE}.${LATB_CASE}} -[[ ! -f ${FNSNOG} ]] && FNSNOG="${COM_OBS_PREV}/${GPREFIX}snogrb_t1534.3072.1536" +export FNTSFA=${FNTSFA:-${COMIN_OBS}/${OPREFIX}rtgssthr.grb} +export FNACNA=${FNACNA:-${COMIN_OBS}/${OPREFIX}seaice.5min.blend.grb} +export FNSNOA=${FNSNOA:-${COMIN_OBS}/${OPREFIX}snogrb_t${JCAP_CASE}.${LONB_CASE}.${LATB_CASE}} +[[ ! -f ${FNSNOA} ]] && export FNSNOA="${COMIN_OBS}/${OPREFIX}snogrb_t1534.3072.1536" +FNSNOG=${FNSNOG:-${COMIN_OBS_PREV}/${GPREFIX}snogrb_t${JCAP_CASE}.${LONB_CASE}.${LATB_CASE}} +[[ ! -f ${FNSNOG} ]] && FNSNOG="${COMIN_OBS_PREV}/${GPREFIX}snogrb_t1534.3072.1536" # Set CYCLVARS by checking grib date of current snogrb vs that of prev cycle if [[ ${RUN_GETGES} = "YES" ]]; then - snoprv=$(${GETGESSH} -q -t snogrb_${JCAP_CASE} -e ${gesenvir} -n ${GDUMP} -v ${GDATE}) + snoprv=$(${GETGESSH} -q -t "snogrb_${JCAP_CASE}" -e "${gesenvir}" -n "${GDUMP}" -v "${GDATE}") else - snoprv=${snoprv:-${FNSNOG}} + snoprv=${snoprv:-${FNSNOG}} fi -if [[ $(${WGRIB} -4yr ${FNSNOA} 2>/dev/null | grep -i snowc | awk -F: '{print $3}' | awk -F= '{print $2}') -le \ - $(${WGRIB} -4yr ${snoprv} 2>/dev/null | grep -i snowc | awk -F: '{print $3}' | awk -F= '{print $2}') ]] ; then - export FNSNOA=" " - export CYCLVARS="FSNOL=99999.,FSNOS=99999.," +if [[ $(${WGRIB} -4yr "${FNSNOA}" 2>/dev/null | grep -i snowc | awk -F: '{print $3}' | awk -F= '{print $2}') -le \ + $(${WGRIB} -4yr "${snoprv}" 2>/dev/null | grep -i snowc | awk -F: '{print $3}' | awk -F= '{print $2}') ]] ; then + export FNSNOA=" " + export CYCLVARS="FSNOL=99999.,FSNOS=99999.," else - export SNOW_NUDGE_COEFF=${SNOW_NUDGE_COEFF:-0.} - export CYCLVARS="FSNOL=${SNOW_NUDGE_COEFF},${CYCLVARS}" + export CYCLVARS="FSNOL=${SNOW_NUDGE_COEFF},${CYCLVARS}" fi -if [[ ${DONST} = "YES" ]]; then - export NST_FILE=${GSI_FILE:-${COM_ATMOS_ANALYSIS}/${APREFIX}dtfanl.nc} +# determine where the input snow restart files come from +if [[ "${DO_JEDISNOWDA:-}" == "YES" ]]; then + sfcdata_dir="${COMIN_SNOW_ANALYSIS}" else - export NST_FILE="NULL" + sfcdata_dir="${COMIN_ATMOS_RESTART_PREV}" fi -if [[ ${DOIAU} = "YES" ]]; then - # update surface restarts at the beginning of the window, if IAU - # For now assume/hold dtfanl.nc valid at beginning of window - for n in $(seq 1 ${ntiles}); do - ${NCP} "${COM_ATMOS_RESTART_PREV}/${bPDY}.${bcyc}0000.sfc_data.tile${n}.nc" \ - "${COM_ATMOS_RESTART}/${bPDY}.${bcyc}0000.sfcanl_data.tile${n}.nc" - ${NLN} "${COM_ATMOS_RESTART_PREV}/${bPDY}.${bcyc}0000.sfc_data.tile${n}.nc" "${DATA}/fnbgsi.00${n}" - ${NLN} "${COM_ATMOS_RESTART}/${bPDY}.${bcyc}0000.sfcanl_data.tile${n}.nc" "${DATA}/fnbgso.00${n}" - ${NLN} "${FIXgfs}/orog/${CASE}/${CASE}_grid.tile${n}.nc" "${DATA}/fngrid.00${n}" - ${NLN} "${FIXgfs}/orog/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile${n}.nc" "${DATA}/fnorog.00${n}" - done - - export APRUNCY=${APRUN_CYCLE} - export OMP_NUM_THREADS_CY=${NTHREADS_CYCLE} - export MAX_TASKS_CY=${ntiles} - - CDATE="${PDY}${cyc}" ${CYCLESH} - export err=$?; err_chk -fi - -# Update surface restarts at middle of window -for n in $(seq 1 ${ntiles}); do - if [[ ${DO_JEDISNOWDA:-"NO"} = "YES" ]]; then - ${NCP} "${COM_SNOW_ANALYSIS}/${PDY}.${cyc}0000.sfc_data.tile${n}.nc" \ - "${COM_ATMOS_RESTART}/${PDY}.${cyc}0000.sfcanl_data.tile${n}.nc" - else - ${NCP} "${COM_ATMOS_RESTART_PREV}/${PDY}.${cyc}0000.sfc_data.tile${n}.nc" \ - "${COM_ATMOS_RESTART}/${PDY}.${cyc}0000.sfcanl_data.tile${n}.nc" - fi - ${NLN} "${COM_ATMOS_RESTART_PREV}/${PDY}.${cyc}0000.sfc_data.tile${n}.nc" "${DATA}/fnbgsi.00${n}" - ${NLN} "${COM_ATMOS_RESTART}/${PDY}.${cyc}0000.sfcanl_data.tile${n}.nc" "${DATA}/fnbgso.00${n}" - ${NLN} "${FIXgfs}/orog/${CASE}/${CASE}_grid.tile${n}.nc" "${DATA}/fngrid.00${n}" - ${NLN} "${FIXgfs}/orog/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile${n}.nc" "${DATA}/fnorog.00${n}" -done - +# global_cycle executable specific variables export APRUNCY=${APRUN_CYCLE} export OMP_NUM_THREADS_CY=${NTHREADS_CYCLE} export MAX_TASKS_CY=${ntiles} -CDATE="${PDY}${cyc}" ${CYCLESH} -export err=$?; err_chk +# Copy fix files required by global_cycle to DATA just once +for (( nn=1; nn <= ntiles; nn++ )); do + ${NCP} "${FIXgfs}/orog/${CASE}/${CASE}_grid.tile${nn}.nc" "${DATA}/fngrid.00${nn}" + ${NCP} "${FIXgfs}/orog/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile${nn}.nc" "${DATA}/fnorog.00${nn}" +done +# Copy the NSST analysis file for global_cycle +# There is only a single NSST analysis at the middle of the window +# For now use/assume it is the same at the beginning of the window if doing IAU +if [[ "${DONST}" == "YES" ]]; then + ${NCP} "${COMIN_ATMOS_ANALYSIS}/${APREFIX}dtfanl.nc" "${DATA}/dtfanl" + export NST_FILE="dtfanl" +else + export NST_FILE="NULL" +fi -################################################################################ -# Postprocessing -cd ${pwd} -[[ ${mkdata} = "YES" ]] && rm -rf ${DATA} +# Collect the dates in the window to update surface restarts +gcycle_dates=("${PDY}${cyc}") # Always update surface restarts at middle of window +if [[ "${DOIAU:-}" == "YES" ]]; then # Update surface restarts at beginning of window + half_window=$(( assim_freq / 2 )) + BDATE=$(date --utc -d "${PDY} ${cyc} - ${half_window} hours" +%Y%m%d%H) + gcycle_dates+=("${BDATE}") +fi + +# Loop over the dates in the window to update the surface restarts +for gcycle_date in "${gcycle_dates[@]}"; do + + echo "Updating surface restarts for ${gcycle_date} ..." + + datestr="${gcycle_date:0:8}.${gcycle_date:8:2}0000" + + # Copy inputs from COMIN to DATA + for (( nn=1; nn <= ntiles; nn++ )); do + ${NCP} "${sfcdata_dir}/${datestr}.sfc_data.tile${nn}.nc" "${DATA}/fnbgsi.00${nn}" + ${NCP} "${DATA}/fnbgsi.00${nn}" "${DATA}/fnbgso.00${nn}" + done + + CDATE="${PDY}${cyc}" ${CYCLESH} + export err=$?; err_chk + + # Copy outputs from DATA to COMOUT + for (( nn=1; nn <= ntiles; nn++ )); do + ${NCP} "${DATA}/fnbgso.00${nn}" "${COMOUT_ATMOS_RESTART}/${datestr}.sfcanl_data.tile${nn}.nc" + done + +done ################################################################################ -exit ${err} +exit "${err}" ################################################################################ diff --git a/ush/python/pygfs/task/snow_analysis.py b/ush/python/pygfs/task/snow_analysis.py index fe21a67536..9a5c7fcab0 100644 --- a/ush/python/pygfs/task/snow_analysis.py +++ b/ush/python/pygfs/task/snow_analysis.py @@ -299,7 +299,7 @@ def execute(self) -> None: keys = ['HOMEgfs', 'DATA', 'current_cycle', 'COM_ATMOS_RESTART_PREV', 'COM_SNOW_ANALYSIS', 'APREFIX', 'SNOWDEPTHVAR', 'BESTDDEV', 'CASE', 'OCNRES', 'ntiles', - 'APRUN_SNOWANL', 'JEDIEXE', 'jedi_yaml', + 'APRUN_SNOWANL', 'JEDIEXE', 'jedi_yaml', 'DOIAU', 'SNOW_WINDOW_BEGIN', 'APPLY_INCR_NML_TMPL', 'APPLY_INCR_EXE', 'APRUN_APPLY_INCR'] for key in keys: localconf[key] = self.task_config[key] @@ -357,13 +357,19 @@ def finalize(self) -> None: FileHandler(yaml_copy).sync() logger.info("Copy analysis to COM") - template = f'{to_fv3time(self.task_config.current_cycle)}.sfc_data.tile{{tilenum}}.nc' + bkgtimes = [] + if self.task_config.DOIAU: + # need both beginning and middle of window + bkgtimes.append(self.task_config.SNOW_WINDOW_BEGIN) + bkgtimes.append(self.task_config.current_cycle) anllist = [] - for itile in range(1, self.task_config.ntiles + 1): - filename = template.format(tilenum=itile) - src = os.path.join(self.task_config.DATA, 'anl', filename) - dest = os.path.join(self.task_config.COM_SNOW_ANALYSIS, filename) - anllist.append([src, dest]) + for bkgtime in bkgtimes: + template = f'{to_fv3time(bkgtime)}.sfc_data.tile{{tilenum}}.nc' + for itile in range(1, self.task_config.ntiles + 1): + filename = template.format(tilenum=itile) + src = os.path.join(self.task_config.DATA, 'anl', filename) + dest = os.path.join(self.task_config.COM_SNOW_ANALYSIS, filename) + anllist.append([src, dest]) FileHandler({'copy': anllist}).sync() logger.info('Copy increments to COM') @@ -542,6 +548,8 @@ def add_increments(config: Dict) -> None: APPLY_INCR_NML_TMPL APPLY_INCR_EXE APRUN_APPLY_INCR + DOIAU + SNOW_WINDOW_BEGIN Raises ------ @@ -553,38 +561,67 @@ def add_increments(config: Dict) -> None: # need backgrounds to create analysis from increments after LETKF logger.info("Copy backgrounds into anl/ directory for creating analysis from increments") - template = f'{to_fv3time(config.current_cycle)}.sfc_data.tile{{tilenum}}.nc' + bkgtimes = [] + if config.DOIAU: + # want analysis at beginning and middle of window + bkgtimes.append(config.SNOW_WINDOW_BEGIN) + bkgtimes.append(config.current_cycle) anllist = [] - for itile in range(1, config.ntiles + 1): - filename = template.format(tilenum=itile) - src = os.path.join(config.COM_ATMOS_RESTART_PREV, filename) - dest = os.path.join(config.DATA, "anl", filename) - anllist.append([src, dest]) + for bkgtime in bkgtimes: + template = f'{to_fv3time(bkgtime)}.sfc_data.tile{{tilenum}}.nc' + for itile in range(1, config.ntiles + 1): + filename = template.format(tilenum=itile) + src = os.path.join(config.COM_ATMOS_RESTART_PREV, filename) + dest = os.path.join(config.DATA, "anl", filename) + anllist.append([src, dest]) FileHandler({'copy': anllist}).sync() - logger.info("Create namelist for APPLY_INCR_EXE") - nml_template = config.APPLY_INCR_NML_TMPL - nml_data = Jinja(nml_template, config).render - logger.debug(f"apply_incr_nml:\n{nml_data}") - - nml_file = os.path.join(config.DATA, "apply_incr_nml") - with open(nml_file, "w") as fho: - fho.write(nml_data) - - logger.info("Link APPLY_INCR_EXE into DATA/") - exe_src = config.APPLY_INCR_EXE - exe_dest = os.path.join(config.DATA, os.path.basename(exe_src)) - if os.path.exists(exe_dest): - rm_p(exe_dest) - os.symlink(exe_src, exe_dest) - - # execute APPLY_INCR_EXE to create analysis files - exe = Executable(config.APRUN_APPLY_INCR) - exe.add_default_arg(os.path.join(config.DATA, os.path.basename(exe_src))) - logger.info(f"Executing {exe}") - try: - exe() - except OSError: - raise OSError(f"Failed to execute {exe}") - except Exception: - raise WorkflowException(f"An error occured during execution of {exe}") + if config.DOIAU: + logger.info("Copying increments to beginning of window") + template_in = f'snowinc.{to_fv3time(config.current_cycle)}.sfc_data.tile{{tilenum}}.nc' + template_out = f'snowinc.{to_fv3time(config.SNOW_WINDOW_BEGIN)}.sfc_data.tile{{tilenum}}.nc' + inclist = [] + for itile in range(1, config.ntiles + 1): + filename_in = template_in.format(tilenum=itile) + filename_out = template_out.format(tilenum=itile) + src = os.path.join(config.DATA, 'anl', filename_in) + dest = os.path.join(config.DATA, 'anl', filename_out) + inclist.append([src, dest]) + FileHandler({'copy': inclist}).sync() + + # loop over times to apply increments + for bkgtime in bkgtimes: + logger.info("Processing analysis valid: {bkgtime}") + logger.info("Create namelist for APPLY_INCR_EXE") + nml_template = config.APPLY_INCR_NML_TMPL + nml_config = { + 'current_cycle': bkgtime, + 'CASE': config.CASE, + 'DATA': config.DATA, + 'HOMEgfs': config.HOMEgfs, + 'OCNRES': config.OCNRES, + } + nml_data = Jinja(nml_template, nml_config).render + logger.debug(f"apply_incr_nml:\n{nml_data}") + + nml_file = os.path.join(config.DATA, "apply_incr_nml") + with open(nml_file, "w") as fho: + fho.write(nml_data) + + logger.info("Link APPLY_INCR_EXE into DATA/") + exe_src = config.APPLY_INCR_EXE + exe_dest = os.path.join(config.DATA, os.path.basename(exe_src)) + if os.path.exists(exe_dest): + rm_p(exe_dest) + os.symlink(exe_src, exe_dest) + + # execute APPLY_INCR_EXE to create analysis files + exe = Executable(config.APRUN_APPLY_INCR) + exe.add_default_arg(os.path.join(config.DATA, os.path.basename(exe_src))) + logger.info(f"Executing {exe}") + try: + exe() + except OSError: + raise OSError(f"Failed to execute {exe}") + except Exception: + raise WorkflowException(f"An error occured during execution of {exe}") From c44d0ac86cfdf78eb87492431bf6d825e8bae637 Mon Sep 17 00:00:00 2001 From: GwenChen-NOAA <95313292+GwenChen-NOAA@users.noreply.github.com> Date: Tue, 4 Jun 2024 10:29:49 -0400 Subject: [PATCH 16/45] Update wmo parm files to fix WMO header (#2652) This PR updates wmo parm files to switch WMO header of precipitation type products (CRAIN, CFRZR, CICEP, and CSNOW) from time averaged to instantaneous. Resolves #2566 --- parm/wmo/grib2_awpgfs_20km_akf003 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf006 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf009 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf012 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf015 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf018 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf021 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf024 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf027 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf030 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf033 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf036 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf039 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf042 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf045 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf048 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf051 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf054 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf057 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf060 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf063 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf066 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf069 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf072 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf075 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf078 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf081 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf084 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf090 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf096 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf102 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf108 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf114 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf120 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf126 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf132 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf138 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf144 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf150 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf156 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf162 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf168 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf174 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf180 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf186 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf192 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf198 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf204 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf210 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf216 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf222 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf228 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf234 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_akf240 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf003 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf006 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf009 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf012 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf015 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf018 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf021 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf024 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf027 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf030 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf033 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf036 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf039 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf042 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf045 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf048 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf051 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf054 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf057 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf060 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf063 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf066 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf069 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf072 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf075 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf078 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf081 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf084 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf090 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf096 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf102 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf108 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf114 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf120 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf126 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf132 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf138 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf144 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf150 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf156 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf162 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf168 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf174 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf180 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf186 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf192 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf198 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf204 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf210 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf216 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf222 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf228 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf234 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_conusf240 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf003 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf006 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf009 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf012 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf015 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf018 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf021 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf024 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf027 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf030 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf033 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf036 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf039 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf042 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf045 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf048 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf051 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf054 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf057 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf060 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf063 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf066 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf069 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf072 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf075 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf078 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf081 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf084 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf090 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf096 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf102 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf108 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf114 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf120 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf126 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf132 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf138 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf144 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf150 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf156 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf162 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf168 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf174 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf180 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf186 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf192 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf198 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf204 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf210 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf216 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf222 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf228 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf234 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pacf240 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof003 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof006 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof009 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof012 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof015 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof018 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof021 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof024 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof027 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof030 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof033 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof036 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof039 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof042 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof045 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof048 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof051 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof054 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof057 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof060 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof063 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof066 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof069 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof072 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof075 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof078 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof081 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof084 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof090 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof096 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof102 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof108 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof114 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof120 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof126 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof132 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof138 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof144 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof150 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof156 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof162 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof168 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof174 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof180 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof186 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof192 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof198 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof204 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof210 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof216 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof222 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof228 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof234 | 8 ++++---- parm/wmo/grib2_awpgfs_20km_pricof240 | 8 ++++---- 216 files changed, 864 insertions(+), 864 deletions(-) diff --git a/parm/wmo/grib2_awpgfs_20km_akf003 b/parm/wmo/grib2_awpgfs_20km_akf003 index 7d2a37aa76..56ce2c0ecc 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf003 +++ b/parm/wmo/grib2_awpgfs_20km_akf003 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBB89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 3 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBB98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 0 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBB98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 0 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBB98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBB98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBB98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBB98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 0 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBB98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 3 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBB98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 3 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBB98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 3 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBB98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 3 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf006 b/parm/wmo/grib2_awpgfs_20km_akf006 index 1993f04065..c6ab3406fc 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf006 +++ b/parm/wmo/grib2_awpgfs_20km_akf006 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBB89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 6 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBB98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 0 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBB98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 0 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBB98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBB98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBB98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBB98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 0 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBB98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBB98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBB98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBB98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 6 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf009 b/parm/wmo/grib2_awpgfs_20km_akf009 index d0946fbb85..84dcce263e 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf009 +++ b/parm/wmo/grib2_awpgfs_20km_akf009 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBE89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 9 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBE98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 6 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBE98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 6 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBE98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBE98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBE98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBE98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBE98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 9 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBE98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 9 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBE98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 9 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBE98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 9 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf012 b/parm/wmo/grib2_awpgfs_20km_akf012 index 6902e22587..76d6e8ee83 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf012 +++ b/parm/wmo/grib2_awpgfs_20km_akf012 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBC89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 12 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBC98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 6 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBC98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 6 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBC98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBC98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBC98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBC98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBC98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBC98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBC98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBC98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 12 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf015 b/parm/wmo/grib2_awpgfs_20km_akf015 index 19b7a5e18b..09027a856b 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf015 +++ b/parm/wmo/grib2_awpgfs_20km_akf015 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBH89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 15 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBH98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 12 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBH98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 12 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBH98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBH98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBH98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBH98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBH98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 15 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBH98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 15 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBH98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 15 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBH98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 15 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf018 b/parm/wmo/grib2_awpgfs_20km_akf018 index f928b8aa9e..7c46b2592a 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf018 +++ b/parm/wmo/grib2_awpgfs_20km_akf018 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBD89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 18 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBD98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 12 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBD98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 12 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBD98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBD98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBD98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBD98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBD98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBD98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBD98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBD98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 18 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf021 b/parm/wmo/grib2_awpgfs_20km_akf021 index ab6e8ea698..7b576285a3 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf021 +++ b/parm/wmo/grib2_awpgfs_20km_akf021 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBK89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 21 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBK98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 18 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBK98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 18 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBK98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBK98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBK98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBK98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBK98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 21 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBK98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 21 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBK98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 21 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBK98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 21 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf024 b/parm/wmo/grib2_awpgfs_20km_akf024 index df3e24d111..36cb477a2f 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf024 +++ b/parm/wmo/grib2_awpgfs_20km_akf024 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBE89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 24 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBE98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 18 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBE98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 18 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBE98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBE98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBE98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBE98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBE98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBE98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBE98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBE98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 24 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf027 b/parm/wmo/grib2_awpgfs_20km_akf027 index 6cfaf1e208..2018c4d65b 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf027 +++ b/parm/wmo/grib2_awpgfs_20km_akf027 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBL89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 27 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBL98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 24 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBL98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 24 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBL98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBL98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBL98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBL98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBL98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 27 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBL98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 27 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBL98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 27 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBL98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 27 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf030 b/parm/wmo/grib2_awpgfs_20km_akf030 index c288012677..4ef755c47b 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf030 +++ b/parm/wmo/grib2_awpgfs_20km_akf030 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBF89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 30 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBF98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 24 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBF98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 24 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBF98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBF98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBF98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBF98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBF98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBF98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBF98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBF98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 30 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf033 b/parm/wmo/grib2_awpgfs_20km_akf033 index a2f05ef5de..8f615edefb 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf033 +++ b/parm/wmo/grib2_awpgfs_20km_akf033 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBO89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 33 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBO98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 30 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBO98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 30 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBO98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBO98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBO98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBO98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBO98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 33 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBO98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 33 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBO98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 33 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBO98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 33 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf036 b/parm/wmo/grib2_awpgfs_20km_akf036 index 429eb52a7d..6c86c6bbb2 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf036 +++ b/parm/wmo/grib2_awpgfs_20km_akf036 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBG89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 36 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBG98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 30 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBG98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 30 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBG98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBG98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBG98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBG98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBG98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBG98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBG98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBG98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 36 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf039 b/parm/wmo/grib2_awpgfs_20km_akf039 index 2c31136c6b..1eb2706d7d 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf039 +++ b/parm/wmo/grib2_awpgfs_20km_akf039 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBP89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 39 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBP98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 36 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBP98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 36 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBP98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBP98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBP98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBP98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBP98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 39 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBP98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 39 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBP98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 39 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBP98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 39 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf042 b/parm/wmo/grib2_awpgfs_20km_akf042 index 9f8cfef47f..8b922c49f1 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf042 +++ b/parm/wmo/grib2_awpgfs_20km_akf042 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBH89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 42 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBH98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 36 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBH98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 36 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBH98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBH98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBH98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBH98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBH98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBH98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBH98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBH98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 42 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf045 b/parm/wmo/grib2_awpgfs_20km_akf045 index ce3e6371ac..d90b3014e2 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf045 +++ b/parm/wmo/grib2_awpgfs_20km_akf045 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBQ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 45 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBQ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 42 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBQ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 42 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBQ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBQ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBQ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBQ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBQ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 45 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBQ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 45 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBQ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 45 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBQ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 45 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf048 b/parm/wmo/grib2_awpgfs_20km_akf048 index eaea4e4a9f..da98d5e1e4 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf048 +++ b/parm/wmo/grib2_awpgfs_20km_akf048 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBI89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 48 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBI98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 42 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBI98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 42 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBI98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBI98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBI98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBI98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBI98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBI98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBI98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBI98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 48 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf051 b/parm/wmo/grib2_awpgfs_20km_akf051 index 94b9fe357e..03cea730ff 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf051 +++ b/parm/wmo/grib2_awpgfs_20km_akf051 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBR89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 51 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBR98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 48 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBR98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 48 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBR98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBR98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBR98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBR98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBR98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 51 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBR98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 51 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBR98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 51 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBR98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 51 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf054 b/parm/wmo/grib2_awpgfs_20km_akf054 index 208576514c..73f7f44328 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf054 +++ b/parm/wmo/grib2_awpgfs_20km_akf054 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBI89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 54 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBI98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 48 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBI98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 48 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBM98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBM98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBM98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBM98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBM98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBM98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBM98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBM98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 54 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf057 b/parm/wmo/grib2_awpgfs_20km_akf057 index 61c72d8f36..8d3dd046fd 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf057 +++ b/parm/wmo/grib2_awpgfs_20km_akf057 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBS89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 57 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBS98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 54 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBS98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 54 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBS98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBS98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBS98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBS98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBS98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 57 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBS98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 57 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBS98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 57 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBS98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 57 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf060 b/parm/wmo/grib2_awpgfs_20km_akf060 index ac82af5142..b847a7031d 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf060 +++ b/parm/wmo/grib2_awpgfs_20km_akf060 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBJ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 60 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBJ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 54 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBJ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 54 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBJ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBJ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBJ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBJ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBJ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBJ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBJ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBJ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 60 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf063 b/parm/wmo/grib2_awpgfs_20km_akf063 index 50379cb03a..dc616fd4ac 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf063 +++ b/parm/wmo/grib2_awpgfs_20km_akf063 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 63 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 60 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 60 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 63 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 63 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 63 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 63 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf066 b/parm/wmo/grib2_awpgfs_20km_akf066 index 7458bf1bc8..ffa3ccc629 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf066 +++ b/parm/wmo/grib2_awpgfs_20km_akf066 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBN89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 66 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBN98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 60 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBN98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 60 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBN98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBN98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBN98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBN98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBN98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBN98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBN98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBN98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 66 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf069 b/parm/wmo/grib2_awpgfs_20km_akf069 index aa667ae355..6887880ae9 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf069 +++ b/parm/wmo/grib2_awpgfs_20km_akf069 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 69 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 66 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 66 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 69 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 69 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 69 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 69 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf072 b/parm/wmo/grib2_awpgfs_20km_akf072 index fbe43c4367..feaf433665 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf072 +++ b/parm/wmo/grib2_awpgfs_20km_akf072 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBK89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 72 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBK98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 66 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBK98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 66 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBK98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBK98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBK98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBK98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBK98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBK98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBK98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBK98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 72 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf075 b/parm/wmo/grib2_awpgfs_20km_akf075 index ddde3f2265..0109659a7f 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf075 +++ b/parm/wmo/grib2_awpgfs_20km_akf075 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 75 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 72 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 72 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 75 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 75 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 75 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 75 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf078 b/parm/wmo/grib2_awpgfs_20km_akf078 index b1290566a3..9a8349d176 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf078 +++ b/parm/wmo/grib2_awpgfs_20km_akf078 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBT89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 78 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBT98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 72 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBT98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 72 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBT98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBT98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBT98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBT98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBT98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBT98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBT98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBT98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 78 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf081 b/parm/wmo/grib2_awpgfs_20km_akf081 index e7c4913337..ce12dfebe1 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf081 +++ b/parm/wmo/grib2_awpgfs_20km_akf081 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 81 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 78 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 78 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 81 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 81 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 81 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 81 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf084 b/parm/wmo/grib2_awpgfs_20km_akf084 index bbeeb783da..57088ae6e2 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf084 +++ b/parm/wmo/grib2_awpgfs_20km_akf084 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBL89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 84 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBL98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 78 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBL98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 78 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBL98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBL98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBL98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBL98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBL98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 84 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBL98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 84 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBL98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 84 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBL98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 84 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf090 b/parm/wmo/grib2_awpgfs_20km_akf090 index c812e6c021..51da917072 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf090 +++ b/parm/wmo/grib2_awpgfs_20km_akf090 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBU89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 90 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBU98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 84 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBU98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 84 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBU98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 84 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBU98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 84 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBU98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 84 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBU98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 84 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBU98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 90 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBU98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 90 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBU98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 90 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBU98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 90 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf096 b/parm/wmo/grib2_awpgfs_20km_akf096 index ddfe7f3296..011dbfe3c1 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf096 +++ b/parm/wmo/grib2_awpgfs_20km_akf096 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBM89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 96 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBM98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 90 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBM98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 90 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBM98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 90 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBM98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 90 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBM98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 90 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBM98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 90 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBM98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 96 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBM98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 96 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBM98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 96 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBM98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 96 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf102 b/parm/wmo/grib2_awpgfs_20km_akf102 index 3d3945a4af..88533a4fab 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf102 +++ b/parm/wmo/grib2_awpgfs_20km_akf102 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBV89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 102 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBV98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 96 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBV98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 96 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBV98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 96 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBV98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 96 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBV98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 96 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBV98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 96 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBV98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 102 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBV98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 102 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBV98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 102 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBV98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 102 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf108 b/parm/wmo/grib2_awpgfs_20km_akf108 index 251316c1a3..b6c93e2f55 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf108 +++ b/parm/wmo/grib2_awpgfs_20km_akf108 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBN89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 108 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBN98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 102 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBN98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 102 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBN98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 102 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBN98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 102 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBN98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 102 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBN98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 102 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBN98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 108 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBN98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 108 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBN98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 108 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBN98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 108 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf114 b/parm/wmo/grib2_awpgfs_20km_akf114 index cddfcec776..5682a9bd04 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf114 +++ b/parm/wmo/grib2_awpgfs_20km_akf114 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBW89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 114 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBW98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 108 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBW98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 108 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBW98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 108 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBW98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 108 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBW98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 108 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBW98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 108 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBW98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 114 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBW98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 114 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBW98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 114 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBW98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 114 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf120 b/parm/wmo/grib2_awpgfs_20km_akf120 index bcf0df3313..f66c40ff3c 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf120 +++ b/parm/wmo/grib2_awpgfs_20km_akf120 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBO89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 120 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBO98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 114 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBO98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 114 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBO98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 114 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBO98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 114 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBO98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 114 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBO98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 114 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBO98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 120 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBO98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 120 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBO98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 120 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBO98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 120 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf126 b/parm/wmo/grib2_awpgfs_20km_akf126 index 3b662c3198..1fdd8cbea3 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf126 +++ b/parm/wmo/grib2_awpgfs_20km_akf126 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 126 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 120 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 120 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 120 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 120 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 120 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 120 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 126 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 126 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 126 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 126 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf132 b/parm/wmo/grib2_awpgfs_20km_akf132 index 55a5cbaa9f..4e7f0e9494 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf132 +++ b/parm/wmo/grib2_awpgfs_20km_akf132 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBP89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 132 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBP98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 126 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBP98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 126 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBP98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 126 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBP98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 126 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBP98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 126 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBP98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 126 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBP98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 132 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBP98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 132 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBP98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 132 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBP98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 132 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf138 b/parm/wmo/grib2_awpgfs_20km_akf138 index 106640aa68..b1412f6fbc 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf138 +++ b/parm/wmo/grib2_awpgfs_20km_akf138 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 138 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 132 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 132 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 132 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 132 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 132 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 132 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 138 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 138 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 138 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 138 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf144 b/parm/wmo/grib2_awpgfs_20km_akf144 index 8b3e500bde..14084fefd0 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf144 +++ b/parm/wmo/grib2_awpgfs_20km_akf144 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBQ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 144 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBQ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 138 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBQ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 138 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBQ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 138 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBQ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 138 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBQ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 138 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBQ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 138 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBQ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 144 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBQ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 144 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBQ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 144 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBQ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 144 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf150 b/parm/wmo/grib2_awpgfs_20km_akf150 index 7b0b9be0c8..19e07778f1 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf150 +++ b/parm/wmo/grib2_awpgfs_20km_akf150 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 150 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 144 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 144 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 144 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 144 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 144 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 144 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 150 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 150 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 150 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 150 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf156 b/parm/wmo/grib2_awpgfs_20km_akf156 index b12b79bc62..bc8350175f 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf156 +++ b/parm/wmo/grib2_awpgfs_20km_akf156 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBR89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 156 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBR98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 150 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBR98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 150 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBR98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 150 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBR98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 150 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBR98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 150 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBR98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 150 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBR98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 156 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBR98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 156 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBR98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 156 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBR98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 156 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf162 b/parm/wmo/grib2_awpgfs_20km_akf162 index efb71848af..774b5f5843 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf162 +++ b/parm/wmo/grib2_awpgfs_20km_akf162 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 162 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 156 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 156 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 156 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 156 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 156 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 156 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 162 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 162 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 162 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 162 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf168 b/parm/wmo/grib2_awpgfs_20km_akf168 index 8b3b0835ed..87a2cd982f 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf168 +++ b/parm/wmo/grib2_awpgfs_20km_akf168 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBS89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 168 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBS98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 162 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBS98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 162 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBS98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 162 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBS98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 162 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBS98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 162 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBS98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 162 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBS98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 168 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBS98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 168 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBS98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 168 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBS98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 168 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf174 b/parm/wmo/grib2_awpgfs_20km_akf174 index 4d9f6cbcd0..1b5d9ef757 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf174 +++ b/parm/wmo/grib2_awpgfs_20km_akf174 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 174 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 168 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 168 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 168 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 168 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 168 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 168 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 174 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 174 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 174 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 174 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf180 b/parm/wmo/grib2_awpgfs_20km_akf180 index e61a24b45e..f3f30070eb 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf180 +++ b/parm/wmo/grib2_awpgfs_20km_akf180 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBT89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 180 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBT98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 174 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBT98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 174 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBT98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 174 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBT98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 174 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBT98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 174 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBT98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 174 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBT98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 180 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBT98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 180 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBT98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 180 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBT98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 180 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf186 b/parm/wmo/grib2_awpgfs_20km_akf186 index 349d880d42..2890fe37e1 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf186 +++ b/parm/wmo/grib2_awpgfs_20km_akf186 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 186 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 180 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 180 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 180 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 180 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 180 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 180 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 186 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 186 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 186 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 186 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf192 b/parm/wmo/grib2_awpgfs_20km_akf192 index 4b75d8bc77..7108aa4edc 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf192 +++ b/parm/wmo/grib2_awpgfs_20km_akf192 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBU89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 192 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBU98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 186 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBU98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 186 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBU98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 186 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBU98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 186 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBU98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 186 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBU98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 186 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBU98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 192 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBU98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 192 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBU98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 192 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBU98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 192 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf198 b/parm/wmo/grib2_awpgfs_20km_akf198 index 079fde4b30..431deff860 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf198 +++ b/parm/wmo/grib2_awpgfs_20km_akf198 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 198 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 192 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 192 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 192 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 192 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 192 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 192 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 198 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 198 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 198 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 198 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf204 b/parm/wmo/grib2_awpgfs_20km_akf204 index c00a859972..de100ed71d 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf204 +++ b/parm/wmo/grib2_awpgfs_20km_akf204 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBV89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 204 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBV98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 198 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBV98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 198 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBV98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 198 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBV98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 198 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBV98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 198 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBV98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 198 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBV98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 204 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBV98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 204 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBV98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 204 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBV98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 204 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf210 b/parm/wmo/grib2_awpgfs_20km_akf210 index dd3ff19043..f2c3f6163d 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf210 +++ b/parm/wmo/grib2_awpgfs_20km_akf210 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 210 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 204 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 204 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 204 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 204 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 204 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 204 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 210 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 210 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 210 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 210 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf216 b/parm/wmo/grib2_awpgfs_20km_akf216 index 262191524d..d43c050d46 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf216 +++ b/parm/wmo/grib2_awpgfs_20km_akf216 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBW89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 216 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBW98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 210 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBW98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 210 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBW98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 210 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBW98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 210 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBW98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 210 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBW98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 210 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBW98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 216 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBW98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 216 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBW98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 216 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBW98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 216 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf222 b/parm/wmo/grib2_awpgfs_20km_akf222 index 1a578c63cd..39e561d826 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf222 +++ b/parm/wmo/grib2_awpgfs_20km_akf222 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 222 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 216 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 216 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 216 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 216 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 216 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 216 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 222 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 222 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 222 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 222 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf228 b/parm/wmo/grib2_awpgfs_20km_akf228 index 62e4393fe8..1e543abfa9 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf228 +++ b/parm/wmo/grib2_awpgfs_20km_akf228 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBX89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 228 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBX98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 222 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBX98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 222 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBX98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 222 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBX98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 222 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBX98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 222 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBX98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 222 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBX98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 228 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBX98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 228 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBX98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 228 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBX98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 228 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf234 b/parm/wmo/grib2_awpgfs_20km_akf234 index 2ba85d0e42..96bb89c666 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf234 +++ b/parm/wmo/grib2_awpgfs_20km_akf234 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPBZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 234 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 228 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTBZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 228 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 228 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 228 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 228 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 228 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 234 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 234 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 234 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMBZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 234 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_akf240 b/parm/wmo/grib2_awpgfs_20km_akf240 index 13c725200e..ec502a0da1 100644 --- a/parm/wmo/grib2_awpgfs_20km_akf240 +++ b/parm/wmo/grib2_awpgfs_20km_akf240 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPBY89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 240 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTBY98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 234 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTBY98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 234 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBY98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 234 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBY98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 234 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBY98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 234 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBY98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 234 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMBY98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 240 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMBY98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 240 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMBY98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 240 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMBY98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 240 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf003 b/parm/wmo/grib2_awpgfs_20km_conusf003 index 2dcb033211..63a9860aa0 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf003 +++ b/parm/wmo/grib2_awpgfs_20km_conusf003 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNB89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 3 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNB98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 0 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNB98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 0 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNB98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNB98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNB98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNB98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 0 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNB98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 3 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNB98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 3 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNB98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 3 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNB98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 3 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf006 b/parm/wmo/grib2_awpgfs_20km_conusf006 index 50a27c75b4..9d060567ea 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf006 +++ b/parm/wmo/grib2_awpgfs_20km_conusf006 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNB89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 6 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNB98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 0 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNB98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 0 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNB98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNB98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNB98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNB98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 0 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNB98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNB98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNB98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNB98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 6 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf009 b/parm/wmo/grib2_awpgfs_20km_conusf009 index 1039b7c333..740a0f26a4 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf009 +++ b/parm/wmo/grib2_awpgfs_20km_conusf009 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNE89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 9 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNE98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 6 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNE98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 6 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNE98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNE98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNE98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNE98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNE98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 9 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNE98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 9 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNE98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 9 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNE98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 9 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf012 b/parm/wmo/grib2_awpgfs_20km_conusf012 index ab4bb22471..4893c880ce 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf012 +++ b/parm/wmo/grib2_awpgfs_20km_conusf012 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNC89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 12 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNC98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 6 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNC98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 6 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNC98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNC98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNC98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNC98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNC98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNC98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNC98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNC98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 12 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf015 b/parm/wmo/grib2_awpgfs_20km_conusf015 index 05d58934e2..fe266fdb29 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf015 +++ b/parm/wmo/grib2_awpgfs_20km_conusf015 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNH89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 15 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNH98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 12 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNH98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 12 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNH98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNH98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNH98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNH98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNH98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 15 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNH98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 15 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNH98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 15 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNH98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 15 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf018 b/parm/wmo/grib2_awpgfs_20km_conusf018 index 5ceec0fe6e..1087409e91 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf018 +++ b/parm/wmo/grib2_awpgfs_20km_conusf018 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPND89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 18 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTND98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 12 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTND98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 12 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMND98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMND98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMND98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMND98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMND98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMND98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMND98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMND98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 18 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf021 b/parm/wmo/grib2_awpgfs_20km_conusf021 index 4d2a378832..f90fa2f0f6 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf021 +++ b/parm/wmo/grib2_awpgfs_20km_conusf021 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNK89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 21 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNK98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 18 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNK98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 18 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNK98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNK98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNK98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNK98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNK98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 21 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNK98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 21 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNK98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 21 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNK98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 21 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf024 b/parm/wmo/grib2_awpgfs_20km_conusf024 index 39a3405281..bbdde44c45 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf024 +++ b/parm/wmo/grib2_awpgfs_20km_conusf024 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNE89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 24 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNE98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 18 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNE98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 18 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNE98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNE98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNE98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNE98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNE98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNE98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNE98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNE98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 24 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf027 b/parm/wmo/grib2_awpgfs_20km_conusf027 index bb66a03391..fd99c83735 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf027 +++ b/parm/wmo/grib2_awpgfs_20km_conusf027 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNL89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 27 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNL98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 24 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNL98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 24 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNL98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNL98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNL98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNL98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNL98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 27 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNL98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 27 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNL98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 27 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNL98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 27 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf030 b/parm/wmo/grib2_awpgfs_20km_conusf030 index 1fa1ab2c89..c69a9e2189 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf030 +++ b/parm/wmo/grib2_awpgfs_20km_conusf030 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNF89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 30 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNF98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 24 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNF98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 24 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNF98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNF98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNF98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNF98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNF98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNF98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNF98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNF98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 30 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf033 b/parm/wmo/grib2_awpgfs_20km_conusf033 index be31353fb0..5e2d0190a3 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf033 +++ b/parm/wmo/grib2_awpgfs_20km_conusf033 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNO89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 33 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNO98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 30 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNO98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 30 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNO98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNO98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNO98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNO98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNO98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 33 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNO98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 33 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNO98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 33 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNO98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 33 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf036 b/parm/wmo/grib2_awpgfs_20km_conusf036 index aa1b5077eb..4f14417232 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf036 +++ b/parm/wmo/grib2_awpgfs_20km_conusf036 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNG89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 36 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNG98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 30 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNG98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 30 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNG98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNG98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNG98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNG98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNG98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNG98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNG98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNG98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 36 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf039 b/parm/wmo/grib2_awpgfs_20km_conusf039 index 4b194b44b5..0416f64876 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf039 +++ b/parm/wmo/grib2_awpgfs_20km_conusf039 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNP89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 39 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNP98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 36 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNP98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 36 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNP98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNP98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNP98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNP98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNP98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 39 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNP98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 39 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNP98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 39 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNP98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 39 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf042 b/parm/wmo/grib2_awpgfs_20km_conusf042 index c53e757fbd..bc7ea8b5ad 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf042 +++ b/parm/wmo/grib2_awpgfs_20km_conusf042 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNH89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 42 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNH98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 36 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNH98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 36 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNH98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNH98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNH98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNH98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNH98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNH98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNH98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNH98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 42 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf045 b/parm/wmo/grib2_awpgfs_20km_conusf045 index 971dd0d8f5..0c7f33b3df 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf045 +++ b/parm/wmo/grib2_awpgfs_20km_conusf045 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNQ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 45 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNQ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 42 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNQ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 42 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNQ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNQ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNQ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNQ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNQ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 45 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNQ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 45 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNQ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 45 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNQ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 45 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf048 b/parm/wmo/grib2_awpgfs_20km_conusf048 index 35eeb58996..655fa11ec7 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf048 +++ b/parm/wmo/grib2_awpgfs_20km_conusf048 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNI89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 48 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNI98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 42 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNI98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 42 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNI98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNI98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNI98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNI98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNI98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNI98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNI98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNI98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 48 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf051 b/parm/wmo/grib2_awpgfs_20km_conusf051 index 1d3c291e97..04e470e7b4 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf051 +++ b/parm/wmo/grib2_awpgfs_20km_conusf051 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNR89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 51 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNR98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 48 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNR98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 48 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNR98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNR98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNR98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNR98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNR98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 51 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNR98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 51 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNR98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 51 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNR98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 51 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf054 b/parm/wmo/grib2_awpgfs_20km_conusf054 index 3480dfdfe3..b3bd6e8163 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf054 +++ b/parm/wmo/grib2_awpgfs_20km_conusf054 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNI89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 54 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNI98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 48 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNI98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 48 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNM98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNM98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNM98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNM98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNM98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNM98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNM98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNM98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 54 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf057 b/parm/wmo/grib2_awpgfs_20km_conusf057 index 3fcfb4ddb0..e61f4e2f1c 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf057 +++ b/parm/wmo/grib2_awpgfs_20km_conusf057 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNS89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 57 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNS98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 54 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNS98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 54 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNS98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNS98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNS98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNS98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNS98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 57 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNS98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 57 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNS98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 57 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNS98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 57 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf060 b/parm/wmo/grib2_awpgfs_20km_conusf060 index 813f5433f3..d55773770a 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf060 +++ b/parm/wmo/grib2_awpgfs_20km_conusf060 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNJ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 60 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNJ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 54 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNJ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 54 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNJ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNJ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNJ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNJ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNJ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNJ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNJ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNJ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 60 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf063 b/parm/wmo/grib2_awpgfs_20km_conusf063 index 9d16be5eb9..ae7cd57e31 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf063 +++ b/parm/wmo/grib2_awpgfs_20km_conusf063 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 63 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 60 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 60 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 63 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 63 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 63 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 63 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf066 b/parm/wmo/grib2_awpgfs_20km_conusf066 index d6dd06f442..99ced1938c 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf066 +++ b/parm/wmo/grib2_awpgfs_20km_conusf066 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNN89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 66 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNN98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 60 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNN98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 60 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNN98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNN98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNN98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNN98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNN98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNN98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNN98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNN98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 66 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf069 b/parm/wmo/grib2_awpgfs_20km_conusf069 index 76e1e30aeb..616642f5df 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf069 +++ b/parm/wmo/grib2_awpgfs_20km_conusf069 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 69 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 66 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 66 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 69 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 69 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 69 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 69 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf072 b/parm/wmo/grib2_awpgfs_20km_conusf072 index 2ed6b61b68..acef56acc9 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf072 +++ b/parm/wmo/grib2_awpgfs_20km_conusf072 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNK89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 72 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNK98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 66 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNK98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 66 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNK98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNK98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNK98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNK98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNK98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNK98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNK98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNK98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 72 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf075 b/parm/wmo/grib2_awpgfs_20km_conusf075 index 2c051ae083..9ef7ff6b3b 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf075 +++ b/parm/wmo/grib2_awpgfs_20km_conusf075 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 75 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 72 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 72 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 75 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 75 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 75 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 75 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf078 b/parm/wmo/grib2_awpgfs_20km_conusf078 index 569f8c0bb6..eb0acbb2b1 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf078 +++ b/parm/wmo/grib2_awpgfs_20km_conusf078 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNT89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 78 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNT98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 72 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNT98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 72 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNT98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNT98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNT98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNT98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNT98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNT98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNT98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNT98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 78 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf081 b/parm/wmo/grib2_awpgfs_20km_conusf081 index 597f61acea..cb52a17792 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf081 +++ b/parm/wmo/grib2_awpgfs_20km_conusf081 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 81 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 78 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 78 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 81 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 81 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 81 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 81 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf084 b/parm/wmo/grib2_awpgfs_20km_conusf084 index 996b9626dd..e444f6c676 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf084 +++ b/parm/wmo/grib2_awpgfs_20km_conusf084 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNL89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 84 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNL98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 78 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNL98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 78 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNL98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNL98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNL98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNL98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNL98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 84 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNL98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 84 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNL98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 84 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNL98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 84 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf090 b/parm/wmo/grib2_awpgfs_20km_conusf090 index 5fe2520d2a..4a19d48912 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf090 +++ b/parm/wmo/grib2_awpgfs_20km_conusf090 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNU89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 90 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNU98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 84 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNU98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 84 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNU98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 84 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNU98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 84 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNU98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 84 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNU98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 84 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNU98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 90 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNU98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 90 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNU98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 90 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNU98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 90 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf096 b/parm/wmo/grib2_awpgfs_20km_conusf096 index 929273abc9..6244fe29f0 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf096 +++ b/parm/wmo/grib2_awpgfs_20km_conusf096 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNM89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 96 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNM98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 90 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNM98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 90 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNM98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 90 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNM98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 90 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNM98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 90 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNM98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 90 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNM98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 96 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNM98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 96 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNM98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 96 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNM98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 96 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf102 b/parm/wmo/grib2_awpgfs_20km_conusf102 index f19cc7f452..c942511624 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf102 +++ b/parm/wmo/grib2_awpgfs_20km_conusf102 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNV89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 102 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNV98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 96 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNV98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 96 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNV98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 96 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNV98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 96 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNV98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 96 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNV98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 96 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNV98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 102 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNV98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 102 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNV98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 102 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNV98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 102 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf108 b/parm/wmo/grib2_awpgfs_20km_conusf108 index 02064150e2..7f0d81fd9b 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf108 +++ b/parm/wmo/grib2_awpgfs_20km_conusf108 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNN89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 108 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNN98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 102 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNN98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 102 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNN98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 102 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNN98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 102 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNN98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 102 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNN98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 102 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNN98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 108 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNN98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 108 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNN98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 108 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNN98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 108 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf114 b/parm/wmo/grib2_awpgfs_20km_conusf114 index 27041b534e..e8ae453347 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf114 +++ b/parm/wmo/grib2_awpgfs_20km_conusf114 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNW89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 114 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNW98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 108 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNW98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 108 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNW98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 108 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNW98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 108 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNW98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 108 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNW98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 108 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNW98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 114 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNW98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 114 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNW98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 114 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNW98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 114 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf120 b/parm/wmo/grib2_awpgfs_20km_conusf120 index 7d84f7362a..7b3277130f 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf120 +++ b/parm/wmo/grib2_awpgfs_20km_conusf120 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNO89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 120 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNO98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 114 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNO98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 114 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNO98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 114 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNO98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 114 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNO98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 114 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNO98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 114 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNO98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 120 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNO98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 120 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNO98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 120 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNO98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 120 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf126 b/parm/wmo/grib2_awpgfs_20km_conusf126 index cf1c0150eb..0f1ec7e106 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf126 +++ b/parm/wmo/grib2_awpgfs_20km_conusf126 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 126 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 120 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 120 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 120 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 120 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 120 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 120 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 126 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 126 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 126 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 126 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf132 b/parm/wmo/grib2_awpgfs_20km_conusf132 index 4a3e914eea..ae675da0f1 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf132 +++ b/parm/wmo/grib2_awpgfs_20km_conusf132 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNP89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 132 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNP98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 126 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNP98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 126 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNP98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 126 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNP98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 126 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNP98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 126 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNP98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 126 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNP98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 132 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNP98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 132 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNP98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 132 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNP98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 132 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf138 b/parm/wmo/grib2_awpgfs_20km_conusf138 index 1d467bd4cb..9436aaae09 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf138 +++ b/parm/wmo/grib2_awpgfs_20km_conusf138 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 138 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 132 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 132 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 132 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 132 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 132 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 132 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 138 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 138 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 138 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 138 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf144 b/parm/wmo/grib2_awpgfs_20km_conusf144 index 40435975ba..fbfe462f25 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf144 +++ b/parm/wmo/grib2_awpgfs_20km_conusf144 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNQ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 144 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNQ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 138 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNQ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 138 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNQ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 138 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNQ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 138 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNQ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 138 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNQ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 138 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNQ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 144 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNQ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 144 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNQ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 144 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNQ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 144 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf150 b/parm/wmo/grib2_awpgfs_20km_conusf150 index 69fcd59ccb..1c936bcd0f 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf150 +++ b/parm/wmo/grib2_awpgfs_20km_conusf150 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 150 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 144 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 144 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 144 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 144 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 144 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 144 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 150 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 150 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 150 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 150 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf156 b/parm/wmo/grib2_awpgfs_20km_conusf156 index a480c29ebf..3e786a24dc 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf156 +++ b/parm/wmo/grib2_awpgfs_20km_conusf156 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNR89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 156 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNR98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 150 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNR98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 150 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNR98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 150 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNR98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 150 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNR98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 150 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNR98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 150 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNR98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 156 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNR98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 156 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNR98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 156 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNR98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 156 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf162 b/parm/wmo/grib2_awpgfs_20km_conusf162 index 698d228b38..39e766ccd0 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf162 +++ b/parm/wmo/grib2_awpgfs_20km_conusf162 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 162 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 156 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 156 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 156 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 156 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 156 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 156 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 162 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 162 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 162 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 162 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf168 b/parm/wmo/grib2_awpgfs_20km_conusf168 index 45c7612a6c..bf203a0a9e 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf168 +++ b/parm/wmo/grib2_awpgfs_20km_conusf168 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNS89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 168 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNS98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 162 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNS98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 162 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNS98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 162 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNS98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 162 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNS98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 162 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNS98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 162 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNS98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 168 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNS98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 168 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNS98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 168 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNS98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 168 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf174 b/parm/wmo/grib2_awpgfs_20km_conusf174 index b1a1450f81..48f1ee6ba8 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf174 +++ b/parm/wmo/grib2_awpgfs_20km_conusf174 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 174 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 168 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 168 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 168 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 168 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 168 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 168 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 174 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 174 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 174 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 174 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf180 b/parm/wmo/grib2_awpgfs_20km_conusf180 index 6dc9d02160..cae87de5f6 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf180 +++ b/parm/wmo/grib2_awpgfs_20km_conusf180 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNT89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 180 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNT98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 174 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNT98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 174 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNT98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 174 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNT98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 174 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNT98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 174 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNT98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 174 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNT98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 180 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNT98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 180 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNT98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 180 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNT98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 180 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf186 b/parm/wmo/grib2_awpgfs_20km_conusf186 index 0db98746e9..665cc249c9 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf186 +++ b/parm/wmo/grib2_awpgfs_20km_conusf186 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 186 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 180 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 180 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 180 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 180 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 180 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 180 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 186 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 186 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 186 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 186 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf192 b/parm/wmo/grib2_awpgfs_20km_conusf192 index 6ce1771f48..cc30c7d26d 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf192 +++ b/parm/wmo/grib2_awpgfs_20km_conusf192 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNU89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 192 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNU98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 186 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNU98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 186 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNU98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 186 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNU98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 186 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNU98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 186 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNU98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 186 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNU98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 192 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNU98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 192 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNU98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 192 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNU98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 192 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf198 b/parm/wmo/grib2_awpgfs_20km_conusf198 index 982195a2b7..626d46182f 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf198 +++ b/parm/wmo/grib2_awpgfs_20km_conusf198 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 198 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 192 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 192 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 192 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 192 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 192 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 192 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 198 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 198 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 198 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 198 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf204 b/parm/wmo/grib2_awpgfs_20km_conusf204 index 1d1a20f44b..16bef68a2e 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf204 +++ b/parm/wmo/grib2_awpgfs_20km_conusf204 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNV89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 204 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNV98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 198 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNV98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 198 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNV98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 198 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNV98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 198 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNV98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 198 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNV98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 198 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNV98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 204 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNV98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 204 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNV98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 204 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNV98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 204 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf210 b/parm/wmo/grib2_awpgfs_20km_conusf210 index c0c1760d15..aeb0ce7546 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf210 +++ b/parm/wmo/grib2_awpgfs_20km_conusf210 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 210 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 204 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 204 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 204 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 204 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 204 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 204 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 210 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 210 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 210 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 210 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf216 b/parm/wmo/grib2_awpgfs_20km_conusf216 index 6f467f23c3..9c26e9f1dd 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf216 +++ b/parm/wmo/grib2_awpgfs_20km_conusf216 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNW89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 216 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNW98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 210 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNW98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 210 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNW98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 210 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNW98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 210 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNW98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 210 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNW98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 210 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNW98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 216 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNW98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 216 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNW98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 216 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNW98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 216 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf222 b/parm/wmo/grib2_awpgfs_20km_conusf222 index 092999981f..530666b624 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf222 +++ b/parm/wmo/grib2_awpgfs_20km_conusf222 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 222 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 216 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 216 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 216 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 216 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 216 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 216 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 222 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 222 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 222 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 222 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf228 b/parm/wmo/grib2_awpgfs_20km_conusf228 index b27f934fdf..dab460f7b0 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf228 +++ b/parm/wmo/grib2_awpgfs_20km_conusf228 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNX89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 228 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNX98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 222 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNX98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 222 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNX98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 222 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNX98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 222 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNX98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 222 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNX98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 222 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNX98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 228 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNX98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 228 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNX98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 228 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNX98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 228 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf234 b/parm/wmo/grib2_awpgfs_20km_conusf234 index 988b92775e..7d9fa3848d 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf234 +++ b/parm/wmo/grib2_awpgfs_20km_conusf234 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPNZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 234 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 228 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTNZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 228 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 228 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 228 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 228 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 228 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 234 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 234 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 234 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMNZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 234 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_conusf240 b/parm/wmo/grib2_awpgfs_20km_conusf240 index bfa6d5b0af..88b4559b1b 100644 --- a/parm/wmo/grib2_awpgfs_20km_conusf240 +++ b/parm/wmo/grib2_awpgfs_20km_conusf240 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPNY89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 240 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTNY98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 234 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTNY98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 234 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNY98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 234 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNY98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 234 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNY98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 234 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNY98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 234 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMNY98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 240 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMNY98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 240 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMNY98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 240 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMNY98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 240 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf003 b/parm/wmo/grib2_awpgfs_20km_pacf003 index 615659755d..d37486a5f1 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf003 +++ b/parm/wmo/grib2_awpgfs_20km_pacf003 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEB89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 3 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEB98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 0 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEB98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 0 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEB98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEB98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEB98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEB98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 0 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEB98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 3 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEB98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 3 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEB98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 3 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEB98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 3 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf006 b/parm/wmo/grib2_awpgfs_20km_pacf006 index 42a0844227..dbd9ab490b 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf006 +++ b/parm/wmo/grib2_awpgfs_20km_pacf006 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEB89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 6 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEB98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 0 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEB98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 0 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEB98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEB98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEB98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEB98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 0 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEB98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEB98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEB98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEB98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 6 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf009 b/parm/wmo/grib2_awpgfs_20km_pacf009 index 499366cad5..76aac8a858 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf009 +++ b/parm/wmo/grib2_awpgfs_20km_pacf009 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEE89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 9 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEE98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 6 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEE98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 6 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEE98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEE98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEE98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEE98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEE98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 9 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEE98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 9 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEE98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 9 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEE98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 9 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf012 b/parm/wmo/grib2_awpgfs_20km_pacf012 index 22c707b26a..5f3c13f5ef 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf012 +++ b/parm/wmo/grib2_awpgfs_20km_pacf012 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEC89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 12 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEC98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 6 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEC98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 6 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEC98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEC98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEC98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEC98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEC98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEC98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEC98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEC98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 12 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf015 b/parm/wmo/grib2_awpgfs_20km_pacf015 index 6643f08f01..9985082514 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf015 +++ b/parm/wmo/grib2_awpgfs_20km_pacf015 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEH89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 15 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEH98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 12 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEH98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 12 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEH98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEH98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEH98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEH98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEH98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 15 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEH98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 15 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEH98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 15 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEH98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 15 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf018 b/parm/wmo/grib2_awpgfs_20km_pacf018 index e1bebef654..af486de289 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf018 +++ b/parm/wmo/grib2_awpgfs_20km_pacf018 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPED89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 18 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTED98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 12 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTED98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 12 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMED98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMED98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMED98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMED98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMED98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMED98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMED98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMED98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 18 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf021 b/parm/wmo/grib2_awpgfs_20km_pacf021 index 6aff6fd1f6..69c2c6cbaa 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf021 +++ b/parm/wmo/grib2_awpgfs_20km_pacf021 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEK89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 21 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEK98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 18 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEK98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 18 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEK98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEK98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEK98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEK98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEK98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 21 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEK98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 21 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEK98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 21 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEK98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 21 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf024 b/parm/wmo/grib2_awpgfs_20km_pacf024 index c43e1a933b..a52a32ce1a 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf024 +++ b/parm/wmo/grib2_awpgfs_20km_pacf024 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEE89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 24 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEE98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 18 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEE98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 18 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEE98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEE98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEE98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEE98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEE98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEE98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEE98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEE98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 24 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf027 b/parm/wmo/grib2_awpgfs_20km_pacf027 index 044f310d11..31746c4fda 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf027 +++ b/parm/wmo/grib2_awpgfs_20km_pacf027 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEL89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 27 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEL98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 24 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEL98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 24 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEL98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEL98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEL98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEL98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEL98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 27 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEL98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 27 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEL98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 27 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEL98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 27 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf030 b/parm/wmo/grib2_awpgfs_20km_pacf030 index a368aeeda4..beb9f83630 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf030 +++ b/parm/wmo/grib2_awpgfs_20km_pacf030 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEF89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 30 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEF98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 24 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEF98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 24 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEF98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEF98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEF98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEF98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEF98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEF98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEF98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEF98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 30 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf033 b/parm/wmo/grib2_awpgfs_20km_pacf033 index 22e28c1388..f2e293ab1e 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf033 +++ b/parm/wmo/grib2_awpgfs_20km_pacf033 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEO89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 33 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEO98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 30 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEO98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 30 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEO98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEO98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEO98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEO98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEO98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 33 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEO98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 33 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEO98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 33 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEO98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 33 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf036 b/parm/wmo/grib2_awpgfs_20km_pacf036 index 4887685aa1..12e1dadddc 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf036 +++ b/parm/wmo/grib2_awpgfs_20km_pacf036 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEG89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 36 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEG98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 30 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEG98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 30 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEG98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEG98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEG98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEG98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEG98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEG98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEG98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEG98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 36 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf039 b/parm/wmo/grib2_awpgfs_20km_pacf039 index 37ac606d55..0a19a167bd 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf039 +++ b/parm/wmo/grib2_awpgfs_20km_pacf039 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEP89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 39 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEP98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 36 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEP98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 36 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEP98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEP98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEP98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEP98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEP98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 39 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEP98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 39 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEP98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 39 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEP98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 39 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf042 b/parm/wmo/grib2_awpgfs_20km_pacf042 index 6f9ac0eb05..e3c459e644 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf042 +++ b/parm/wmo/grib2_awpgfs_20km_pacf042 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEH89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 42 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEH98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 36 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEH98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 36 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEH98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEH98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEH98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEH98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEH98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEH98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEH98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEH98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 42 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf045 b/parm/wmo/grib2_awpgfs_20km_pacf045 index 096d7bcb3b..ed44d87a3c 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf045 +++ b/parm/wmo/grib2_awpgfs_20km_pacf045 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEQ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 45 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEQ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 42 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEQ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 42 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEQ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEQ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEQ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEQ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEQ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 45 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEQ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 45 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEQ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 45 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEQ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 45 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf048 b/parm/wmo/grib2_awpgfs_20km_pacf048 index 942c67f5dc..09fee68368 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf048 +++ b/parm/wmo/grib2_awpgfs_20km_pacf048 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEI89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 48 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEI98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 42 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEI98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 42 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEI98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEI98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEI98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEI98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEI98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEI98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEI98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEI98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 48 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf051 b/parm/wmo/grib2_awpgfs_20km_pacf051 index b56c9aaa66..b64ce74110 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf051 +++ b/parm/wmo/grib2_awpgfs_20km_pacf051 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPER89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 51 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTER98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 48 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTER98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 48 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMER98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMER98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMER98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMER98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMER98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 51 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMER98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 51 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMER98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 51 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMER98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 51 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf054 b/parm/wmo/grib2_awpgfs_20km_pacf054 index 075f3f0bf6..1ab830e126 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf054 +++ b/parm/wmo/grib2_awpgfs_20km_pacf054 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEI89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 54 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEI98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 48 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEI98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 48 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEM98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEM98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEM98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEM98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEM98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEM98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEM98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEM98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 54 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf057 b/parm/wmo/grib2_awpgfs_20km_pacf057 index 163617c80b..877fdff2e0 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf057 +++ b/parm/wmo/grib2_awpgfs_20km_pacf057 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPES89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 57 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTES98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 54 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTES98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 54 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMES98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMES98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMES98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMES98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMES98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 57 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMES98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 57 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMES98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 57 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMES98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 57 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf060 b/parm/wmo/grib2_awpgfs_20km_pacf060 index 34cd787012..b06a04608c 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf060 +++ b/parm/wmo/grib2_awpgfs_20km_pacf060 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEJ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 60 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEJ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 54 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEJ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 54 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEJ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEJ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEJ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEJ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEJ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEJ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEJ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEJ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 60 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf063 b/parm/wmo/grib2_awpgfs_20km_pacf063 index d66c7f5cc6..e36fb1ce40 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf063 +++ b/parm/wmo/grib2_awpgfs_20km_pacf063 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 63 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 60 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 60 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 63 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 63 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 63 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 63 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf066 b/parm/wmo/grib2_awpgfs_20km_pacf066 index dd90c84ce4..fde4d9b7c8 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf066 +++ b/parm/wmo/grib2_awpgfs_20km_pacf066 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEN89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 66 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEN98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 60 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEN98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 60 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEN98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEN98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEN98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEN98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEN98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEN98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEN98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEN98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 66 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf069 b/parm/wmo/grib2_awpgfs_20km_pacf069 index 34f43a228c..6df5538ce5 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf069 +++ b/parm/wmo/grib2_awpgfs_20km_pacf069 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 69 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 66 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 66 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 69 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 69 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 69 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 69 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf072 b/parm/wmo/grib2_awpgfs_20km_pacf072 index 32b1d7f9b4..e0949621d4 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf072 +++ b/parm/wmo/grib2_awpgfs_20km_pacf072 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEK89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 72 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEK98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 66 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEK98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 66 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEK98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEK98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEK98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEK98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEK98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEK98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEK98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEK98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 72 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf075 b/parm/wmo/grib2_awpgfs_20km_pacf075 index 7d99a47b2c..98250fb1bc 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf075 +++ b/parm/wmo/grib2_awpgfs_20km_pacf075 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 75 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 72 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 72 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 75 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 75 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 75 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 75 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf078 b/parm/wmo/grib2_awpgfs_20km_pacf078 index 9a97afc2bb..4b38ba9af8 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf078 +++ b/parm/wmo/grib2_awpgfs_20km_pacf078 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPET89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 78 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTET98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 72 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTET98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 72 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMET98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMET98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMET98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMET98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMET98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMET98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMET98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMET98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 78 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf081 b/parm/wmo/grib2_awpgfs_20km_pacf081 index 7061a52bf6..10f309a934 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf081 +++ b/parm/wmo/grib2_awpgfs_20km_pacf081 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 81 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 78 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 78 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 81 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 81 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 81 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 81 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf084 b/parm/wmo/grib2_awpgfs_20km_pacf084 index 43cb6ea3ac..2c6e39854f 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf084 +++ b/parm/wmo/grib2_awpgfs_20km_pacf084 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEL89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 84 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEL98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 78 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEL98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 78 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEL98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEL98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEL98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEL98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEL98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 84 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEL98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 84 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEL98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 84 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEL98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 84 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf090 b/parm/wmo/grib2_awpgfs_20km_pacf090 index a0584a5db9..041ae171aa 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf090 +++ b/parm/wmo/grib2_awpgfs_20km_pacf090 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEU89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 90 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEU98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 84 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEU98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 84 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEU98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 84 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEU98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 84 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEU98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 84 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEU98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 84 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEU98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 90 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEU98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 90 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEU98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 90 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEU98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 90 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf096 b/parm/wmo/grib2_awpgfs_20km_pacf096 index a9a6f5c0e9..6ae396a1e2 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf096 +++ b/parm/wmo/grib2_awpgfs_20km_pacf096 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEM89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 96 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEM98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 90 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEM98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 90 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEM98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 90 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEM98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 90 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEM98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 90 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEM98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 90 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEM98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 96 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEM98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 96 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEM98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 96 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEM98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 96 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf102 b/parm/wmo/grib2_awpgfs_20km_pacf102 index 6d871b9cfe..5cb280196a 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf102 +++ b/parm/wmo/grib2_awpgfs_20km_pacf102 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEV89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 102 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEV98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 96 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEV98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 96 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEV98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 96 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEV98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 96 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEV98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 96 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEV98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 96 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEV98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 102 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEV98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 102 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEV98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 102 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEV98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 102 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf108 b/parm/wmo/grib2_awpgfs_20km_pacf108 index 9eb756fee2..5da58fecd7 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf108 +++ b/parm/wmo/grib2_awpgfs_20km_pacf108 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEN89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 108 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEN98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 102 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEN98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 102 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEN98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 102 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEN98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 102 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEN98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 102 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEN98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 102 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEN98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 108 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEN98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 108 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEN98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 108 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEN98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 108 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf114 b/parm/wmo/grib2_awpgfs_20km_pacf114 index 763a29101e..e6838e11ad 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf114 +++ b/parm/wmo/grib2_awpgfs_20km_pacf114 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEW89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 114 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEW98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 108 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEW98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 108 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEW98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 108 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEW98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 108 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEW98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 108 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEW98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 108 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEW98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 114 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEW98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 114 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEW98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 114 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEW98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 114 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf120 b/parm/wmo/grib2_awpgfs_20km_pacf120 index ba695651a1..4f94adf282 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf120 +++ b/parm/wmo/grib2_awpgfs_20km_pacf120 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEO89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 120 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEO98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 114 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEO98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 114 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEO98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 114 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEO98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 114 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEO98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 114 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEO98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 114 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEO98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 120 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEO98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 120 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEO98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 120 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEO98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 120 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf126 b/parm/wmo/grib2_awpgfs_20km_pacf126 index 1e6a0b00d9..0b3c56d926 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf126 +++ b/parm/wmo/grib2_awpgfs_20km_pacf126 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 126 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 120 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 120 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 120 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 120 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 120 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 120 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 126 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 126 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 126 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 126 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf132 b/parm/wmo/grib2_awpgfs_20km_pacf132 index 1a8d195e39..9a54278e33 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf132 +++ b/parm/wmo/grib2_awpgfs_20km_pacf132 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEP89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 132 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEP98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 126 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEP98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 126 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEP98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 126 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEP98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 126 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEP98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 126 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEP98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 126 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEP98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 132 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEP98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 132 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEP98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 132 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEP98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 132 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf138 b/parm/wmo/grib2_awpgfs_20km_pacf138 index bb45bf4e02..f1634fde0e 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf138 +++ b/parm/wmo/grib2_awpgfs_20km_pacf138 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 138 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 132 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 132 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 132 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 132 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 132 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 132 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 138 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 138 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 138 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 138 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf144 b/parm/wmo/grib2_awpgfs_20km_pacf144 index 8b477f37f6..7ea5f68078 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf144 +++ b/parm/wmo/grib2_awpgfs_20km_pacf144 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEQ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 144 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEQ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 138 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEQ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 138 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEQ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 138 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEQ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 138 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEQ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 138 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEQ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 138 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEQ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 144 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEQ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 144 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEQ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 144 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEQ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 144 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf150 b/parm/wmo/grib2_awpgfs_20km_pacf150 index 630530ef18..5ab99b3155 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf150 +++ b/parm/wmo/grib2_awpgfs_20km_pacf150 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 150 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 144 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 144 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 144 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 144 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 144 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 144 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 150 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 150 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 150 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 150 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf156 b/parm/wmo/grib2_awpgfs_20km_pacf156 index 6b35a3720e..f5d5475059 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf156 +++ b/parm/wmo/grib2_awpgfs_20km_pacf156 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPER89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 156 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTER98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 150 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTER98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 150 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMER98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 150 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMER98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 150 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMER98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 150 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMER98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 150 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMER98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 156 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMER98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 156 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMER98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 156 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMER98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 156 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf162 b/parm/wmo/grib2_awpgfs_20km_pacf162 index 5e73ef8a27..ba225f9103 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf162 +++ b/parm/wmo/grib2_awpgfs_20km_pacf162 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 162 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 156 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 156 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 156 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 156 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 156 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 156 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 162 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 162 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 162 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 162 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf168 b/parm/wmo/grib2_awpgfs_20km_pacf168 index 047dfff1ba..335be30724 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf168 +++ b/parm/wmo/grib2_awpgfs_20km_pacf168 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPES89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 168 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTES98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 162 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTES98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 162 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMES98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 162 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMES98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 162 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMES98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 162 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMES98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 162 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMES98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 168 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMES98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 168 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMES98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 168 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMES98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 168 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf174 b/parm/wmo/grib2_awpgfs_20km_pacf174 index 38c11de27d..7ff357a29a 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf174 +++ b/parm/wmo/grib2_awpgfs_20km_pacf174 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 174 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 168 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 168 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 168 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 168 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 168 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 168 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 174 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 174 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 174 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 174 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf180 b/parm/wmo/grib2_awpgfs_20km_pacf180 index 425f51af96..921c33b214 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf180 +++ b/parm/wmo/grib2_awpgfs_20km_pacf180 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPET89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 180 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTET98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 174 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTET98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 174 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMET98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 174 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMET98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 174 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMET98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 174 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMET98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 174 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMET98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 180 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMET98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 180 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMET98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 180 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMET98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 180 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf186 b/parm/wmo/grib2_awpgfs_20km_pacf186 index f583cb1c68..0467f24228 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf186 +++ b/parm/wmo/grib2_awpgfs_20km_pacf186 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 186 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 180 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 180 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 180 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 180 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 180 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 180 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 186 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 186 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 186 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 186 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf192 b/parm/wmo/grib2_awpgfs_20km_pacf192 index 222ac22555..5ab98bd8a0 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf192 +++ b/parm/wmo/grib2_awpgfs_20km_pacf192 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEU89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 192 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEU98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 186 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEU98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 186 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEU98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 186 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEU98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 186 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEU98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 186 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEU98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 186 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEU98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 192 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEU98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 192 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEU98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 192 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEU98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 192 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf198 b/parm/wmo/grib2_awpgfs_20km_pacf198 index f3d6a5993c..9ee35392b4 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf198 +++ b/parm/wmo/grib2_awpgfs_20km_pacf198 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 198 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 192 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 192 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 192 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 192 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 192 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 192 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 198 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 198 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 198 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 198 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf204 b/parm/wmo/grib2_awpgfs_20km_pacf204 index 8ba14d995c..e4a52e294b 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf204 +++ b/parm/wmo/grib2_awpgfs_20km_pacf204 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEV89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 204 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEV98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 198 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEV98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 198 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEV98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 198 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEV98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 198 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEV98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 198 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEV98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 198 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEV98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 204 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEV98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 204 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEV98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 204 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEV98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 204 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf210 b/parm/wmo/grib2_awpgfs_20km_pacf210 index bd16958c58..b7eacf8a2c 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf210 +++ b/parm/wmo/grib2_awpgfs_20km_pacf210 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 210 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 204 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 204 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 204 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 204 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 204 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 204 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 210 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 210 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 210 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 210 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf216 b/parm/wmo/grib2_awpgfs_20km_pacf216 index 2dbf7c239b..3e501ccd25 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf216 +++ b/parm/wmo/grib2_awpgfs_20km_pacf216 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEW89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 216 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEW98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 210 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEW98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 210 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEW98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 210 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEW98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 210 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEW98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 210 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEW98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 210 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEW98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 216 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEW98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 216 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEW98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 216 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEW98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 216 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf222 b/parm/wmo/grib2_awpgfs_20km_pacf222 index aa95af5bb2..60ab11be32 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf222 +++ b/parm/wmo/grib2_awpgfs_20km_pacf222 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 222 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 216 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 216 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 216 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 216 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 216 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 216 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 222 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 222 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 222 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 222 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf228 b/parm/wmo/grib2_awpgfs_20km_pacf228 index 96827f922e..0cd0becc77 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf228 +++ b/parm/wmo/grib2_awpgfs_20km_pacf228 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEX89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 228 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEX98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 222 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEX98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 222 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEX98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 222 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEX98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 222 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEX98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 222 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEX98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 222 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEX98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 228 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEX98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 228 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEX98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 228 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEX98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 228 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf234 b/parm/wmo/grib2_awpgfs_20km_pacf234 index 8a2952c88c..bd779e552c 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf234 +++ b/parm/wmo/grib2_awpgfs_20km_pacf234 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPEZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 234 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 228 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTEZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 228 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 228 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 228 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 228 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 228 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 234 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 234 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 234 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMEZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 234 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pacf240 b/parm/wmo/grib2_awpgfs_20km_pacf240 index 6e5585597e..1072f507e5 100644 --- a/parm/wmo/grib2_awpgfs_20km_pacf240 +++ b/parm/wmo/grib2_awpgfs_20km_pacf240 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPEY89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 240 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTEY98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 234 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTEY98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 234 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEY98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 234 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEY98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 234 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEY98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 234 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEY98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 234 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMEY98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 240 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMEY98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 240 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMEY98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 240 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMEY98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 240 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof003 b/parm/wmo/grib2_awpgfs_20km_pricof003 index a5e85cc253..9b5d15f73f 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof003 +++ b/parm/wmo/grib2_awpgfs_20km_pricof003 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFB89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 3 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFB98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 0 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFB98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 0 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFB98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFB98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFB98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFB98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 0 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFB98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 3 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFB98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 3 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFB98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 3 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFB98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 3 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof006 b/parm/wmo/grib2_awpgfs_20km_pricof006 index a39a57d385..f1094652d7 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof006 +++ b/parm/wmo/grib2_awpgfs_20km_pricof006 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFB89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 6 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFB98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 0 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFB98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 0 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFB98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFB98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFB98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 0 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFB98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 0 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFB98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFB98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFB98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFB98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 6 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof009 b/parm/wmo/grib2_awpgfs_20km_pricof009 index 2429e41cb9..3f036ae903 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof009 +++ b/parm/wmo/grib2_awpgfs_20km_pricof009 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFE89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 9 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFE98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 6 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFE98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 6 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFE98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFE98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFE98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFE98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFE98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 9 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFE98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 9 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFE98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 9 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFE98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 9 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof012 b/parm/wmo/grib2_awpgfs_20km_pricof012 index 5434a6d5df..db6eb8cde6 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof012 +++ b/parm/wmo/grib2_awpgfs_20km_pricof012 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFC89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 12 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFC98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 6 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFC98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 6 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFC98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFC98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFC98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 6 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFC98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 6 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFC98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFC98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFC98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFC98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 12 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof015 b/parm/wmo/grib2_awpgfs_20km_pricof015 index 7ae9210d5c..0fb1b7b098 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof015 +++ b/parm/wmo/grib2_awpgfs_20km_pricof015 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFH89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 15 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFH98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 12 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFH98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 12 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFH98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFH98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFH98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFH98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFH98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 15 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFH98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 15 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFH98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 15 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFH98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 15 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof018 b/parm/wmo/grib2_awpgfs_20km_pricof018 index dac0fc8e7a..d080ac0222 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof018 +++ b/parm/wmo/grib2_awpgfs_20km_pricof018 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFD89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 18 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFD98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 12 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFD98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 12 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFD98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFD98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFD98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 12 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFD98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 12 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFD98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFD98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFD98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFD98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 18 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof021 b/parm/wmo/grib2_awpgfs_20km_pricof021 index 3827769168..527a1c4a29 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof021 +++ b/parm/wmo/grib2_awpgfs_20km_pricof021 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFK89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 21 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFK98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 18 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFK98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 18 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFK98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFK98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFK98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFK98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFK98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 21 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFK98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 21 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFK98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 21 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFK98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 21 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof024 b/parm/wmo/grib2_awpgfs_20km_pricof024 index 7790a82dd6..1b0320f1a9 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof024 +++ b/parm/wmo/grib2_awpgfs_20km_pricof024 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFE89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 24 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFE98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 18 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFE98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 18 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFE98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFE98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFE98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 18 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFE98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 18 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFE98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFE98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFE98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFE98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 24 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof027 b/parm/wmo/grib2_awpgfs_20km_pricof027 index c4061b3cfb..e18b7c1530 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof027 +++ b/parm/wmo/grib2_awpgfs_20km_pricof027 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFL89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 27 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFL98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 24 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFL98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 24 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFL98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFL98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFL98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFL98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFL98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 27 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFL98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 27 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFL98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 27 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFL98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 27 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof030 b/parm/wmo/grib2_awpgfs_20km_pricof030 index ecd42983ea..739aa23a64 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof030 +++ b/parm/wmo/grib2_awpgfs_20km_pricof030 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFF89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 30 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFF98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 24 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFF98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 24 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFF98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFF98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFF98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 24 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFF98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 24 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFF98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFF98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFF98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFF98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 30 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof033 b/parm/wmo/grib2_awpgfs_20km_pricof033 index b52c822509..79278be454 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof033 +++ b/parm/wmo/grib2_awpgfs_20km_pricof033 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFO89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 33 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFO98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 30 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFO98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 30 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFO98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFO98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFO98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFO98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFO98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 33 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFO98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 33 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFO98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 33 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFO98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 33 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof036 b/parm/wmo/grib2_awpgfs_20km_pricof036 index f7a61e77a0..bfb23127d5 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof036 +++ b/parm/wmo/grib2_awpgfs_20km_pricof036 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFG89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 36 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFG98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 30 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFG98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 30 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFG98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFG98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFG98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 30 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFG98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 30 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFG98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFG98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFG98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFG98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 36 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof039 b/parm/wmo/grib2_awpgfs_20km_pricof039 index b9db65e3a6..c050ee66f0 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof039 +++ b/parm/wmo/grib2_awpgfs_20km_pricof039 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFP89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 39 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFP98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 36 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFP98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 36 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFP98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFP98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFP98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFP98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFP98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 39 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFP98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 39 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFP98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 39 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFP98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 39 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof042 b/parm/wmo/grib2_awpgfs_20km_pricof042 index 6a48338337..6f9a027648 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof042 +++ b/parm/wmo/grib2_awpgfs_20km_pricof042 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFH89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 42 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFH98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 36 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFH98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 36 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFH98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFH98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFH98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 36 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFH98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 36 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFH98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFH98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFH98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFH98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 42 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof045 b/parm/wmo/grib2_awpgfs_20km_pricof045 index 7c17dfb93b..6457ace251 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof045 +++ b/parm/wmo/grib2_awpgfs_20km_pricof045 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFQ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 45 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFQ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 42 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFQ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 42 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFQ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFQ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFQ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFQ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFQ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 45 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFQ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 45 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFQ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 45 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFQ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 45 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof048 b/parm/wmo/grib2_awpgfs_20km_pricof048 index 8314c7f4c2..f514269baf 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof048 +++ b/parm/wmo/grib2_awpgfs_20km_pricof048 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFI89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 48 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFI98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 42 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFI98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 42 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFI98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFI98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFI98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 42 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFI98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 42 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFI98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFI98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFI98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFI98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 48 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof051 b/parm/wmo/grib2_awpgfs_20km_pricof051 index 4d3c979ab9..d51ab115eb 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof051 +++ b/parm/wmo/grib2_awpgfs_20km_pricof051 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFR89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 51 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFR98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 48 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFR98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 48 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFR98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFR98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFR98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFR98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFR98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 51 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFR98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 51 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFR98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 51 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFR98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 51 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof054 b/parm/wmo/grib2_awpgfs_20km_pricof054 index 733651a581..6bd7cf6482 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof054 +++ b/parm/wmo/grib2_awpgfs_20km_pricof054 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFI89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 54 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFI98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 48 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFI98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 48 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFM98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFM98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFM98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 48 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFM98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 48 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFM98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFM98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFM98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFM98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 54 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof057 b/parm/wmo/grib2_awpgfs_20km_pricof057 index 69ab83ae93..e92a1d7d81 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof057 +++ b/parm/wmo/grib2_awpgfs_20km_pricof057 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFS89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 57 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFS98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 54 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFS98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 54 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFS98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFS98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFS98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFS98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFS98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 57 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFS98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 57 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFS98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 57 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFS98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 57 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof060 b/parm/wmo/grib2_awpgfs_20km_pricof060 index 8e6f93bf47..a7d9ef8d80 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof060 +++ b/parm/wmo/grib2_awpgfs_20km_pricof060 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFJ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 60 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFJ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 54 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFJ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 54 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFJ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFJ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFJ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 54 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFJ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 54 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFJ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFJ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFJ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFJ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 60 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof063 b/parm/wmo/grib2_awpgfs_20km_pricof063 index 7e476e243e..408daa4b81 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof063 +++ b/parm/wmo/grib2_awpgfs_20km_pricof063 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 63 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 60 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 60 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 63 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 63 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 63 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 63 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof066 b/parm/wmo/grib2_awpgfs_20km_pricof066 index 25e03e849b..9723019076 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof066 +++ b/parm/wmo/grib2_awpgfs_20km_pricof066 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFN89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 66 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFN98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 60 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFN98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 60 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFN98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFN98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFN98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 60 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFN98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 60 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFN98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFN98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFN98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFN98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 66 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof069 b/parm/wmo/grib2_awpgfs_20km_pricof069 index 4cb56bae36..6ac5c30fc6 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof069 +++ b/parm/wmo/grib2_awpgfs_20km_pricof069 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 69 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 66 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 66 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 69 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 69 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 69 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 69 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof072 b/parm/wmo/grib2_awpgfs_20km_pricof072 index 61ebff1404..c0c67aafe5 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof072 +++ b/parm/wmo/grib2_awpgfs_20km_pricof072 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFK89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 72 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFK98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 66 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFK98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 66 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFK98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFK98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFK98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 66 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFK98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 66 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFK98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFK98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFK98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFK98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 72 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof075 b/parm/wmo/grib2_awpgfs_20km_pricof075 index b53bec9eee..98060b6045 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof075 +++ b/parm/wmo/grib2_awpgfs_20km_pricof075 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 75 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 72 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 72 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 75 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 75 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 75 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 75 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof078 b/parm/wmo/grib2_awpgfs_20km_pricof078 index 568533f6ba..74770cce63 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof078 +++ b/parm/wmo/grib2_awpgfs_20km_pricof078 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFT89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 78 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFT98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 72 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFT98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 72 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFT98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFT98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFT98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 72 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFT98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 72 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFT98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFT98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFT98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFT98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 78 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof081 b/parm/wmo/grib2_awpgfs_20km_pricof081 index aa1ba8ce90..b5d61c8fed 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof081 +++ b/parm/wmo/grib2_awpgfs_20km_pricof081 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 81 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 78 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 78 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 81 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 81 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 81 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 81 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof084 b/parm/wmo/grib2_awpgfs_20km_pricof084 index 41fec436f0..01038a7d50 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof084 +++ b/parm/wmo/grib2_awpgfs_20km_pricof084 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFL89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 84 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFL98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 78 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFL98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 78 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFL98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFL98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFL98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 78 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFL98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 78 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFL98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 84 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFL98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 84 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFL98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 84 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFL98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 84 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof090 b/parm/wmo/grib2_awpgfs_20km_pricof090 index 1d09cfad2f..2615f7070c 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof090 +++ b/parm/wmo/grib2_awpgfs_20km_pricof090 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFU89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 90 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFU98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 84 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFU98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 84 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFU98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 84 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFU98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 84 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFU98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 84 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFU98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 84 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFU98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 90 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFU98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 90 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFU98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 90 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFU98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 90 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof096 b/parm/wmo/grib2_awpgfs_20km_pricof096 index fe587a6886..8cb1875cf8 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof096 +++ b/parm/wmo/grib2_awpgfs_20km_pricof096 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFM89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 96 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFM98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 90 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFM98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 90 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFM98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 90 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFM98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 90 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFM98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 90 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFM98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 90 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFM98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 96 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFM98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 96 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFM98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 96 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFM98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 96 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof102 b/parm/wmo/grib2_awpgfs_20km_pricof102 index bf931e2cf4..b1c5e27573 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof102 +++ b/parm/wmo/grib2_awpgfs_20km_pricof102 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFV89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 102 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFV98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 96 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFV98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 96 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFV98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 96 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFV98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 96 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFV98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 96 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFV98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 96 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFV98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 102 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFV98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 102 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFV98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 102 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFV98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 102 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof108 b/parm/wmo/grib2_awpgfs_20km_pricof108 index d250c49331..ca0669c405 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof108 +++ b/parm/wmo/grib2_awpgfs_20km_pricof108 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFN89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 108 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFN98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 102 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFN98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 102 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFN98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 102 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFN98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 102 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFN98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 102 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFN98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 102 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFN98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 108 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFN98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 108 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFN98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 108 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFN98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 108 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof114 b/parm/wmo/grib2_awpgfs_20km_pricof114 index 7c537d9b7e..7e8ecb2e62 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof114 +++ b/parm/wmo/grib2_awpgfs_20km_pricof114 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFW89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 114 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFW98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 108 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFW98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 108 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFW98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 108 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFW98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 108 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFW98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 108 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFW98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 108 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFW98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 114 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFW98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 114 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFW98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 114 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFW98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 114 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof120 b/parm/wmo/grib2_awpgfs_20km_pricof120 index c514b4356c..5217866af7 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof120 +++ b/parm/wmo/grib2_awpgfs_20km_pricof120 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFO89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 120 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFO98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 114 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFO98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 114 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFO98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 114 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFO98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 114 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFO98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 114 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFO98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 114 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFO98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 120 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFO98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 120 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFO98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 120 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFO98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 120 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof126 b/parm/wmo/grib2_awpgfs_20km_pricof126 index bfc5f89f69..2351bef63b 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof126 +++ b/parm/wmo/grib2_awpgfs_20km_pricof126 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 126 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 120 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 120 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 120 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 120 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 120 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 120 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 126 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 126 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 126 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 126 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof132 b/parm/wmo/grib2_awpgfs_20km_pricof132 index bfbfada303..2404bdb11b 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof132 +++ b/parm/wmo/grib2_awpgfs_20km_pricof132 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFP89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 132 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFP98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 126 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFP98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 126 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFP98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 126 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFP98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 126 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFP98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 126 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFP98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 126 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFP98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 132 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFP98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 132 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFP98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 132 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFP98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 132 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof138 b/parm/wmo/grib2_awpgfs_20km_pricof138 index 2143bcbadf..3b3a4e6115 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof138 +++ b/parm/wmo/grib2_awpgfs_20km_pricof138 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 138 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 132 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 132 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 132 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 132 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 132 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 132 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 138 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 138 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 138 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 138 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof144 b/parm/wmo/grib2_awpgfs_20km_pricof144 index cc62b63206..17c1fa2877 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof144 +++ b/parm/wmo/grib2_awpgfs_20km_pricof144 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFQ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 144 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFQ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 138 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFQ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 138 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFQ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 138 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFQ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 138 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFQ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 138 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFQ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 138 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFQ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 144 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFQ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 144 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFQ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 144 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFQ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 144 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof150 b/parm/wmo/grib2_awpgfs_20km_pricof150 index 6f4fe892ef..15854cc7f7 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof150 +++ b/parm/wmo/grib2_awpgfs_20km_pricof150 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 150 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 144 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 144 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 144 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 144 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 144 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 144 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 150 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 150 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 150 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 150 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof156 b/parm/wmo/grib2_awpgfs_20km_pricof156 index 6c9e1671b3..db29922c8e 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof156 +++ b/parm/wmo/grib2_awpgfs_20km_pricof156 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFR89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 156 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFR98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 150 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFR98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 150 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFR98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 150 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFR98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 150 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFR98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 150 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFR98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 150 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFR98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 156 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFR98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 156 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFR98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 156 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFR98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 156 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof162 b/parm/wmo/grib2_awpgfs_20km_pricof162 index fd055eaca8..d293e1cef0 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof162 +++ b/parm/wmo/grib2_awpgfs_20km_pricof162 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 162 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 156 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 156 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 156 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 156 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 156 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 156 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 162 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 162 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 162 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 162 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof168 b/parm/wmo/grib2_awpgfs_20km_pricof168 index 3f441ed4ae..74ee9cb83a 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof168 +++ b/parm/wmo/grib2_awpgfs_20km_pricof168 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFS89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 168 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFS98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 162 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFS98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 162 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFS98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 162 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFS98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 162 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFS98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 162 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFS98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 162 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFS98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 168 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFS98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 168 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFS98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 168 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFS98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 168 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof174 b/parm/wmo/grib2_awpgfs_20km_pricof174 index aee3d7ac21..21a2c3a9f2 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof174 +++ b/parm/wmo/grib2_awpgfs_20km_pricof174 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 174 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 168 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 168 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 168 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 168 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 168 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 168 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 174 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 174 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 174 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 174 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof180 b/parm/wmo/grib2_awpgfs_20km_pricof180 index 3ec98e42e0..7a9398a386 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof180 +++ b/parm/wmo/grib2_awpgfs_20km_pricof180 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFT89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 180 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFT98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 174 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFT98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 174 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFT98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 174 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFT98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 174 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFT98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 174 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFT98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 174 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFT98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 180 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFT98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 180 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFT98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 180 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFT98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 180 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof186 b/parm/wmo/grib2_awpgfs_20km_pricof186 index 2c7a8c2619..b044720a1d 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof186 +++ b/parm/wmo/grib2_awpgfs_20km_pricof186 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 186 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 180 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 180 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 180 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 180 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 180 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 180 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 186 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 186 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 186 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 186 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof192 b/parm/wmo/grib2_awpgfs_20km_pricof192 index 90c66e5767..8aa9176278 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof192 +++ b/parm/wmo/grib2_awpgfs_20km_pricof192 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFU89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 192 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFU98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 186 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFU98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 186 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFU98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 186 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFU98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 186 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFU98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 186 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFU98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 186 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFU98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 192 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFU98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 192 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFU98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 192 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFU98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 192 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof198 b/parm/wmo/grib2_awpgfs_20km_pricof198 index 50e04eb42a..4c29dc0013 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof198 +++ b/parm/wmo/grib2_awpgfs_20km_pricof198 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 198 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 192 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 192 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 192 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 192 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 192 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 192 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 198 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 198 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 198 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 198 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof204 b/parm/wmo/grib2_awpgfs_20km_pricof204 index f18f237151..4d7dd21709 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof204 +++ b/parm/wmo/grib2_awpgfs_20km_pricof204 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFV89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 204 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFV98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 198 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFV98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 198 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFV98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 198 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFV98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 198 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFV98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 198 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFV98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 198 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFV98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 204 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFV98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 204 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFV98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 204 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFV98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 204 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof210 b/parm/wmo/grib2_awpgfs_20km_pricof210 index 8d753952dd..96bb382bbd 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof210 +++ b/parm/wmo/grib2_awpgfs_20km_pricof210 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 210 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 204 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 204 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 204 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 204 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 204 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 204 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 210 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 210 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 210 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 210 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof216 b/parm/wmo/grib2_awpgfs_20km_pricof216 index af9bd58622..e732b7c7bc 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof216 +++ b/parm/wmo/grib2_awpgfs_20km_pricof216 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFW89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 216 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFW98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 210 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFW98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 210 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFW98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 210 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFW98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 210 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFW98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 210 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFW98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 210 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFW98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 216 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFW98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 216 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFW98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 216 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFW98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 216 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof222 b/parm/wmo/grib2_awpgfs_20km_pricof222 index 774c31319f..88ca3a3e6f 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof222 +++ b/parm/wmo/grib2_awpgfs_20km_pricof222 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 222 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 216 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 216 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 216 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 216 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 216 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 216 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 222 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 222 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 222 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 222 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof228 b/parm/wmo/grib2_awpgfs_20km_pricof228 index 6947978f81..17e669afa7 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof228 +++ b/parm/wmo/grib2_awpgfs_20km_pricof228 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFX89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 228 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFX98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 222 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFX98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 222 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFX98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 222 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFX98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 222 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFX98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 222 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFX98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 222 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFX98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 228 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFX98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 228 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFX98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 228 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFX98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 228 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof234 b/parm/wmo/grib2_awpgfs_20km_pricof234 index 0761e4dec3..f380eda313 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof234 +++ b/parm/wmo/grib2_awpgfs_20km_pricof234 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='ZPFZ89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 234 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 228 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='ZTFZ98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 228 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 228 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 228 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 228 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 228 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 234 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 234 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 234 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='ZMFZ98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 234 1 0 0 255 0 0 / diff --git a/parm/wmo/grib2_awpgfs_20km_pricof240 b/parm/wmo/grib2_awpgfs_20km_pricof240 index 438240e80a..d284837b9f 100644 --- a/parm/wmo/grib2_awpgfs_20km_pricof240 +++ b/parm/wmo/grib2_awpgfs_20km_pricof240 @@ -251,7 +251,7 @@ &GRIBIDS DESC=' MSLET Mean Sea Level ',WMOHEAD='YPFY89 KWBC',PDTN= 0 ,PDT= 3 192 2 0 96 0 0 1 240 101 0 0 255 0 0 / &GRIBIDS DESC=' TMIN 2 m above ground ',WMOHEAD='YTFY98 KWBC',PDTN= 8 ,PDT= 0 5 2 0 96 0 0 1 234 103 0 2 255 0 0 / &GRIBIDS DESC=' TMAX 2 m above ground ',WMOHEAD='YTFY98 KWBC',PDTN= 8 ,PDT= 0 4 2 0 96 0 0 1 234 103 0 2 255 0 0 / -&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFY98 KWBC',PDTN= 8 ,PDT= 1 192 2 0 96 0 0 1 234 1 0 0 255 0 0 / -&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFY98 KWBC',PDTN= 8 ,PDT= 1 193 2 0 96 0 0 1 234 1 0 0 255 0 0 / -&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFY98 KWBC',PDTN= 8 ,PDT= 1 194 2 0 96 0 0 1 234 1 0 0 255 0 0 / -&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFY98 KWBC',PDTN= 8 ,PDT= 1 195 2 0 96 0 0 1 234 1 0 0 255 0 0 / +&GRIBIDS DESC=' CRAIN Surface ',WMOHEAD='YMFY98 KWBC',PDTN= 0 ,PDT= 1 192 2 0 96 0 0 1 240 1 0 0 255 0 0 / +&GRIBIDS DESC=' CFRZR Surface ',WMOHEAD='YMFY98 KWBC',PDTN= 0 ,PDT= 1 193 2 0 96 0 0 1 240 1 0 0 255 0 0 / +&GRIBIDS DESC=' CICEP Surface ',WMOHEAD='YMFY98 KWBC',PDTN= 0 ,PDT= 1 194 2 0 96 0 0 1 240 1 0 0 255 0 0 / +&GRIBIDS DESC=' CSNOW Surface ',WMOHEAD='YMFY98 KWBC',PDTN= 0 ,PDT= 1 195 2 0 96 0 0 1 240 1 0 0 255 0 0 / From 67b833e0c7bc390865d453588b4609a1a7ede981 Mon Sep 17 00:00:00 2001 From: Jessica Meixner Date: Tue, 4 Jun 2024 13:33:43 -0400 Subject: [PATCH 17/45] Update ufs-weather-model (#2646) Updates UFS model to the commit https://github.com/ufs-community/ufs-weather-model/commit/5bec704243286421fc613838fc67a2129e96acd6 This should resolve the issue and allow C768 runs on Hera and allow for CICE to run on WCOSS2 (due to library updates to allow linking). From what I can tell, all updates needed were done by @HenryWinterbottom-NOAA which were updates for CICE Fixes #2490 --- sorc/ufs_model.fd | 2 +- ush/parsing_namelists_CICE.sh | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/sorc/ufs_model.fd b/sorc/ufs_model.fd index c54e98637e..5bec704243 160000 --- a/sorc/ufs_model.fd +++ b/sorc/ufs_model.fd @@ -1 +1 @@ -Subproject commit c54e98637ead81b1fc1e336bd0443c8bfb6faf01 +Subproject commit 5bec704243286421fc613838fc67a2129e96acd6 diff --git a/ush/parsing_namelists_CICE.sh b/ush/parsing_namelists_CICE.sh index dc67777af9..9aed59e214 100755 --- a/ush/parsing_namelists_CICE.sh +++ b/ush/parsing_namelists_CICE.sh @@ -59,6 +59,13 @@ local CICE_RUNID="unknown" local CICE_USE_RESTART_TIME=${use_restart_time} local CICE_RESTART_DIR="./CICE_RESTART/" local CICE_RESTART_FILE="cice_model.res" +local CICE_RESTART_DEFLATE=0 +local CICE_RESTART_CHUNK=0,0 +local CICE_RESTART_STRIDE=-99 +local CICE_RESTART_ROOT=-99 +local CICE_RESTART_REARR="box" +local CICE_RESTART_IOTASKS=-99 +local CICE_RESTART_FORMAT="pnetcdf2" local CICE_DUMPFREQ="y" # "h","d","m" or "y" for restarts at intervals of "hours", "days", "months" or "years" local CICE_DUMPFREQ_N=10000 # Set this to a really large value, as cice, mom6 and cmeps restart interval is controlled by ufs.configure local CICE_DIAGFREQ=$(( 86400 / DT_CICE )) # frequency of diagnostic output in timesteps, recommended for 1x per day @@ -68,8 +75,16 @@ if [[ "${RUN}" =~ "gdas" ]]; then else local CICE_HIST_AVG=".true., .true., .true., .true., .true." # GFS long forecaset wants averaged over CICE_HISTFREQ_N fi +local CICE_HISTORY_FORMAT="pnetcdf2" local CICE_HISTORY_DIR="./CICE_OUTPUT/" local CICE_INCOND_DIR="./CICE_OUTPUT/" +local CICE_HISTORY_IOTASKS=-99 +local CICE_HISTORY_REARR="box" +local CICE_HISTORY_ROOT=-99 +local CICE_HISTORY_STRIDE=-99 +local CICE_HISTORY_CHUNK=0,0 +local CICE_HISTORY_DEFLATE=0 +local CICE_HISTORY_PREC=4 # grid_nml section # CICE_GRID # CICE_MASK From aa23ccf1d0d229f9ff1398d84af1fa7ee5bed262 Mon Sep 17 00:00:00 2001 From: RussTreadon-NOAA <26926959+RussTreadon-NOAA@users.noreply.github.com> Date: Wed, 5 Jun 2024 12:50:14 -0400 Subject: [PATCH 18/45] Enable wcoss2 ufsda build and module load (#2620) This PR enables ufsda (`sorc/gdas.cd`) to be built and run on WCOSS2. Resolves #2602 Resolves #2579 --- ci/cases/pr/C96C48_ufs_hybatmDA.yaml | 1 - ci/scripts/clone-build_ci.sh | 2 +- sorc/build_all.sh | 2 +- sorc/gdas.cd | 2 +- sorc/gsi_utils.fd | 2 +- sorc/jcb | 2 +- ush/load_ufsda_modules.sh | 4 ++-- 7 files changed, 7 insertions(+), 8 deletions(-) diff --git a/ci/cases/pr/C96C48_ufs_hybatmDA.yaml b/ci/cases/pr/C96C48_ufs_hybatmDA.yaml index 1b57be63eb..d1556dc1d0 100644 --- a/ci/cases/pr/C96C48_ufs_hybatmDA.yaml +++ b/ci/cases/pr/C96C48_ufs_hybatmDA.yaml @@ -21,5 +21,4 @@ skip_ci_on_hosts: - hera - orion - hercules - - wcoss2 diff --git a/ci/scripts/clone-build_ci.sh b/ci/scripts/clone-build_ci.sh index 2b0ca5f072..3cef7fc230 100755 --- a/ci/scripts/clone-build_ci.sh +++ b/ci/scripts/clone-build_ci.sh @@ -74,7 +74,7 @@ set +e source "${HOMEgfs}/ush/module-setup.sh" export BUILD_JOBS=8 rm -rf log.build -./build_all.sh -gk >> log.build 2>&1 +./build_all.sh -guk >> log.build 2>&1 build_status=$? DATE=$(date +'%D %r') diff --git a/sorc/build_all.sh b/sorc/build_all.sh index e3040fc0fa..28f52fd306 100755 --- a/sorc/build_all.sh +++ b/sorc/build_all.sh @@ -145,7 +145,7 @@ build_opts["ww3prepost"]="${_wave_opt} ${_verbose_opt} ${_build_ufs_opt} ${_buil # Optional DA builds if [[ "${_build_ufsda}" == "YES" ]]; then - if [[ "${MACHINE_ID}" != "orion" && "${MACHINE_ID}" != "hera" && "${MACHINE_ID}" != "hercules" ]]; then + if [[ "${MACHINE_ID}" != "orion" && "${MACHINE_ID}" != "hera" && "${MACHINE_ID}" != "hercules" && "${MACHINE_ID}" != "wcoss2" ]]; then echo "NOTE: The GDAS App is not supported on ${MACHINE_ID}. Disabling build." else build_jobs["gdas"]=8 diff --git a/sorc/gdas.cd b/sorc/gdas.cd index 6742ec62a1..3e50a8fdcd 160000 --- a/sorc/gdas.cd +++ b/sorc/gdas.cd @@ -1 +1 @@ -Subproject commit 6742ec62a12d7d6f8129057bcf77cee0e2175022 +Subproject commit 3e50a8fdcd07305a3464a02e20eaf4b033179167 diff --git a/sorc/gsi_utils.fd b/sorc/gsi_utils.fd index bb03e172e0..d940406161 160000 --- a/sorc/gsi_utils.fd +++ b/sorc/gsi_utils.fd @@ -1 +1 @@ -Subproject commit bb03e172e0d0d9c56d6da7788ca033bfb5ef5119 +Subproject commit d9404061611553459394173c3ff33116db306326 diff --git a/sorc/jcb b/sorc/jcb index de75655d81..f62b9df37f 160000 --- a/sorc/jcb +++ b/sorc/jcb @@ -1 +1 @@ -Subproject commit de75655d81ec2ee668d8d47bf4a43625c81dde7c +Subproject commit f62b9df37f131c9ff68b62eb6e19c1109c314cf0 diff --git a/ush/load_ufsda_modules.sh b/ush/load_ufsda_modules.sh index e8e72b8fbe..d7aa08e1ae 100755 --- a/ush/load_ufsda_modules.sh +++ b/ush/load_ufsda_modules.sh @@ -34,13 +34,13 @@ source "${HOMEgfs}/ush/module-setup.sh" module use "${HOMEgfs}/sorc/gdas.cd/modulefiles" case "${MACHINE_ID}" in - ("hera" | "orion" | "hercules") + ("hera" | "orion" | "hercules" | "wcoss2") module load "${MODS}/${MACHINE_ID}" ncdump=$( command -v ncdump ) NETCDF=$( echo "${ncdump}" | cut -d " " -f 3 ) export NETCDF ;; - ("wcoss2" | "acorn" | "jet" | "gaea" | "s4") + ("jet" | "gaea" | "s4" | "acorn") echo WARNING: UFSDA NOT SUPPORTED ON THIS PLATFORM ;; *) From 205d0c2b13e2d7755cec75bf8c978ab20d453862 Mon Sep 17 00:00:00 2001 From: David Huber <69919478+DavidHuber-NOAA@users.noreply.github.com> Date: Wed, 5 Jun 2024 17:31:30 +0000 Subject: [PATCH 19/45] Update S4 point of contact in docs (#2660) Update the point of contact for global workflow issues on S4. --- docs/source/hpc.rst | 4 ++-- docs/source/init.rst | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/hpc.rst b/docs/source/hpc.rst index 508597781d..102455b822 100644 --- a/docs/source/hpc.rst +++ b/docs/source/hpc.rst @@ -22,7 +22,7 @@ HPC helpdesks * Hercules: rdhpcs.hercules.help@noaa.gov * HPSS: rdhpcs.hpss.help@noaa.gov * Gaea: oar.gfdl.help@noaa.gov -* S4: david.huber@noaa.gov +* S4: innocent.souopgui@noaa.gov * Jet: rdhpcs.jet.help@noaa.gov * Cloud: rdhpcs.cloud.help@noaa.gov @@ -48,7 +48,7 @@ https://aim.rdhpcs.noaa.gov/ Optimizing the global workflow on S4 ==================================== -The S4 cluster is relatively small and so optimizations are recommended to improve cycled runtimes. Please contact David Huber (david.huber@noaa.gov) if you are planning on running a cycled experiment on this system to obtain optimized configuration files. +The S4 cluster is relatively small and so optimizations are recommended to improve cycled runtimes. Please contact Innocent Souopgui (innocent.souopgui@noaa.gov) if you are planning on running a cycled experiment on this system to obtain optimized configuration files. ============ Git settings diff --git a/docs/source/init.rst b/docs/source/init.rst index f945494af8..ac900e1be2 100644 --- a/docs/source/init.rst +++ b/docs/source/init.rst @@ -315,7 +315,7 @@ Manual Generation ***************** .. note:: - Initial conditions cannot be generated on S4. These must be generated on another supported platform then pushed to S4. If you do not have access to a supported system or need assistance, please contact David Huber (david.huber@noaa.gov). + Initial conditions cannot be generated on S4. These must be generated on another supported platform then pushed to S4. If you do not have access to a supported system or need assistance, please contact Innocent Souopgui (innocent.souopgui@noaa.gov). .. _coldstarts: From 54ea0b73a07921be5fbb07fe41e976888bd3e549 Mon Sep 17 00:00:00 2001 From: Guillaume Vernieres Date: Thu, 6 Jun 2024 01:36:02 -0400 Subject: [PATCH 20/45] Add links to the ocean insitu obs processing tools (#2644) Add links to the marine bufr to ioda converters for the marine insitu observations. - fixes https://github.com/NOAA-EMC/GDASApp/issues/1106 - waiting for https://github.com/NOAA-EMC/GDASApp/pull/1135 --- sorc/link_workflow.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sorc/link_workflow.sh b/sorc/link_workflow.sh index 68873d0f1a..f338f2bad3 100755 --- a/sorc/link_workflow.sh +++ b/sorc/link_workflow.sh @@ -253,6 +253,14 @@ if [[ -d "${HOMEgfs}/sorc/gdas.cd/build" ]]; then ${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/ush/ioda/bufr2ioda/gen_bufr2ioda_yaml.py" . ${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/ush/ioda/bufr2ioda/run_bufr2ioda.py" . ${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/build/bin/imsfv3_scf2ioda.py" . + declare -a gdasapp_ocn_insitu_profile_platforms=("argo" "bathy" "glider" "marinemammal" "tesac" "xbtctd") + for platform in "${gdasapp_ocn_insitu_profile_platforms[@]}"; do + ${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/ush/ioda/bufr2ioda/marine/bufr2ioda_insitu_profile_${platform}.py" . + done + declare -a gdasapp_ocn_insitu_sfc_platforms=("altkob" "trkob") + for platform in "${gdasapp_ocn_insitu_sfc_platforms[@]}"; do + ${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/ush/ioda/bufr2ioda/marine/bufr2ioda_insitu_surface_${platform}.py" . + done fi From acf3aaa2b1d3e3024b0b5d2fe23eee8c317a980b Mon Sep 17 00:00:00 2001 From: DavidNew-NOAA <134300700+DavidNew-NOAA@users.noreply.github.com> Date: Thu, 6 Jun 2024 11:49:03 -0400 Subject: [PATCH 21/45] Parameterize some things in config.atmanl and config.atmensanl (#2661) This PR adds some parameters in config.atmanl and config.atmensanl that can be altered with the defaults.yaml. The motivation is to make these files match those in the GDASApp JJOB tests (example: https://github.com/NOAA-EMC/GDASApp/blob/develop/test/atm/global-workflow/config.atmanl), so we can just use the Global Workflow config.atmanl and config.atmensanl in the tests rather than custom ones in GDASApp that have to be separately updated every time the ones in the Global Workflow are updated. --- parm/config/gfs/config.atmanl | 4 ++-- parm/config/gfs/config.atmensanl | 2 +- parm/config/gfs/yaml/defaults.yaml | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/parm/config/gfs/config.atmanl b/parm/config/gfs/config.atmanl index dd8ca80b11..7879b8b683 100644 --- a/parm/config/gfs/config.atmanl +++ b/parm/config/gfs/config.atmanl @@ -6,9 +6,9 @@ echo "BEGIN: config.atmanl" export JCB_BASE_YAML="${PARMgfs}/gdas/atm/jcb-base.yaml.j2" -export JCB_ALGO_YAML="${PARMgfs}/gdas/atm/jcb-prototype_3dvar.yaml.j2" +export JCB_ALGO_YAML=@JCB_ALGO_YAML@ -export STATICB_TYPE="gsibec" +export STATICB_TYPE=@STATICB_TYPE@ export LOCALIZATION_TYPE="bump" export INTERP_METHOD='barycentric' diff --git a/parm/config/gfs/config.atmensanl b/parm/config/gfs/config.atmensanl index 3484cb670d..c03583659d 100644 --- a/parm/config/gfs/config.atmensanl +++ b/parm/config/gfs/config.atmensanl @@ -6,7 +6,7 @@ echo "BEGIN: config.atmensanl" export JCB_BASE_YAML="${PARMgfs}/gdas/atm/jcb-base.yaml.j2" -export JCB_ALGO_YAML="${PARMgfs}/gdas/atm/jcb-prototype_lgetkf.yaml.j2" +export JCB_ALGO_YAML=@JCB_ALGO_YAML@ export INTERP_METHOD='barycentric' diff --git a/parm/config/gfs/yaml/defaults.yaml b/parm/config/gfs/yaml/defaults.yaml index bdb5f47f04..d4a423f17e 100644 --- a/parm/config/gfs/yaml/defaults.yaml +++ b/parm/config/gfs/yaml/defaults.yaml @@ -20,12 +20,15 @@ base: FHMAX_ENKF_GFS: 12 atmanl: + JCB_ALGO_YAML: "${PARMgfs}/gdas/atm/jcb-prototype_3dvar.yaml.j2" + STATICB_TYPE: "gsibec" LAYOUT_X_ATMANL: 8 LAYOUT_Y_ATMANL: 8 IO_LAYOUT_X: 1 IO_LAYOUT_Y: 1 atmensanl: + JCB_ALGO_YAML: "${PARMgfs}/gdas/atm/jcb-prototype_lgetkf.yaml.j2" LAYOUT_X_ATMENSANL: 8 LAYOUT_Y_ATMENSANL: 8 IO_LAYOUT_X: 1 From 9caa51de8fb7be07d2e61775da01937d576964f6 Mon Sep 17 00:00:00 2001 From: "Henry R. Winterbottom" <49202169+HenryWinterbottom-NOAA@users.noreply.github.com> Date: Thu, 6 Jun 2024 22:15:23 -0600 Subject: [PATCH 22/45] Update RDHPCS Hera resource for `eupd` task (#2636) As per @wx20jjung, the resource for the `eupd` task have been updated for RDHPCS Hera to account for memory issues for C384 `gdaseupd` job fails. Resolves #2454 --------- Co-authored-by: Walter Kolczynski - NOAA --- parm/config/gfs/config.resources | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/parm/config/gfs/config.resources b/parm/config/gfs/config.resources index affb0da04f..0972f74f9c 100644 --- a/parm/config/gfs/config.resources +++ b/parm/config/gfs/config.resources @@ -1049,9 +1049,11 @@ case ${step} in if [[ "${machine}" == "WCOSS2" ]]; then export npe_eupd=315 export nth_eupd=14 - elif [[ ${machine} == "S4" ]]; then + elif [[ "${machine}" == "S4" ]]; then export npe_eupd=160 export nth_eupd=2 + elif [[ "${machine}" == "HERA" ]]; then + export npe_eupd=80 fi ;; "C192" | "C96" | "C48") From e7909af8d9e1f34140388a3f8556d8e582c58fe5 Mon Sep 17 00:00:00 2001 From: emilyhcliu <36091766+emilyhcliu@users.noreply.github.com> Date: Mon, 10 Jun 2024 15:11:27 -0400 Subject: [PATCH 23/45] Add handling to select CRTM cloud optical table based on cloud scheme and update calcanal_gfs.py (#2645) This PR proposes updates for the following two scripts: 1. In **scripts/exglobal_atmos_analysis.sh** --- Add handling to select CRTM cloud optical table based on cloud microphysical scheme indicated by `imp_physics' The default scheme in the GFS forecast model is Thompson scheme (imp_physics = 8). 2. In **/ush/calcanl_gfs.py** --- Increase the MPI number declared in the script due to increased variables to interplate increments and calculate analysis in the netcdf_io routines in GSI-utils. Here is the related [PR #46 for GSI-utils](https://github.com/NOAA-EMC/GSI-utils/pull/46). --------- Co-authored-by: Rahul Mahajan Co-authored-by: Walter Kolczynski - NOAA --- scripts/exglobal_atmos_analysis.sh | 13 ++++++++++++- ush/calcanl_gfs.py | 16 ++++++++-------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/scripts/exglobal_atmos_analysis.sh b/scripts/exglobal_atmos_analysis.sh index 3b3405f871..0e78bed2e0 100755 --- a/scripts/exglobal_atmos_analysis.sh +++ b/scripts/exglobal_atmos_analysis.sh @@ -430,7 +430,18 @@ ${NLN} ${CRTM_FIX}/NPOESS.VISsnow.EmisCoeff.bin ./crtm_coeffs/NPOESS.VISsnow.Em ${NLN} ${CRTM_FIX}/NPOESS.VISwater.EmisCoeff.bin ./crtm_coeffs/NPOESS.VISwater.EmisCoeff.bin ${NLN} ${CRTM_FIX}/FASTEM6.MWwater.EmisCoeff.bin ./crtm_coeffs/FASTEM6.MWwater.EmisCoeff.bin ${NLN} ${CRTM_FIX}/AerosolCoeff.bin ./crtm_coeffs/AerosolCoeff.bin -${NLN} ${CRTM_FIX}/CloudCoeff.GFDLFV3.-109z-1.bin ./crtm_coeffs/CloudCoeff.bin +if (( imp_physics == 8 )); then + echo "using CRTM Thompson cloud optical table" + ${NLN} "${CRTM_FIX}/CloudCoeff.Thompson08.-109z-1.bin" ./crtm_coeffs/CloudCoeff.bin +elif (( imp_physics == 11 )); then + echo "using CRTM GFDL cloud optical table" + ${NLN} "${CRTM_FIX}/CloudCoeff.GFDLFV3.-109z-1.bin" ./crtm_coeffs/CloudCoeff.bin +else + echo "INVALID imp_physics = ${imp_physics}" + echo "FATAL ERROR: No valid CRTM cloud optical table found for imp_physics = ${imp_physics}" + exit 1 +fi + ############################################################## # Observational data diff --git a/ush/calcanl_gfs.py b/ush/calcanl_gfs.py index 8c5c643417..ceb75104a2 100755 --- a/ush/calcanl_gfs.py +++ b/ush/calcanl_gfs.py @@ -135,7 +135,7 @@ def calcanl_gfs(DoIAU, l4DEnsVar, Write4Danl, ComOut, APrefix, ExecCMDMPI1 = ExecCMDMPI.replace("$ncmd", str(1)) ExecCMDMPI = ExecCMDMPI.replace("$ncmd", str(nFH)) ExecCMDLevs = ExecCMDMPI.replace("$ncmd", str(levs)) - ExecCMDMPI10 = ExecCMDMPI.replace("$ncmd", str(10)) + ExecCMDMPI13 = ExecCMDMPI.replace("$ncmd", str(13)) # are we using mpirun with lsf, srun, or aprun with Cray? launcher = ExecCMDMPI.split(' ')[0] @@ -156,7 +156,7 @@ def calcanl_gfs(DoIAU, l4DEnsVar, Write4Danl, ComOut, APrefix, ExecCMDMPILevs_host = 'mpirun -np ' + str(levs) + ' --hostfile hosts' ExecCMDMPILevs_nohost = 'mpirun -np ' + str(levs) ExecCMDMPI1_host = 'mpirun -np 1 --hostfile hosts' - ExecCMDMPI10_host = 'mpirun -np 10 --hostfile hosts' + ExecCMDMPI13_host = 'mpirun -np 13 --hostfile hosts' elif launcher == 'mpiexec': hostfile = os.getenv('PBS_NODEFILE', '') with open(hostfile) as f: @@ -175,7 +175,7 @@ def calcanl_gfs(DoIAU, l4DEnsVar, Write4Danl, ComOut, APrefix, ExecCMDMPILevs_host = 'mpiexec -l -n ' + str(levs) ExecCMDMPILevs_nohost = 'mpiexec -l -n ' + str(levs) ExecCMDMPI1_host = 'mpiexec -l -n 1 --cpu-bind depth --depth ' + str(NThreads) - ExecCMDMPI10_host = 'mpiexec -l -n 10 --cpu-bind depth --depth ' + str(NThreads) + ExecCMDMPI13_host = 'mpiexec -l -n 13 --cpu-bind depth --depth ' + str(NThreads) elif launcher == 'srun': nodes = os.getenv('SLURM_JOB_NODELIST', '') hosts_tmp = subprocess.check_output('scontrol show hostnames ' + nodes, shell=True) @@ -200,7 +200,7 @@ def calcanl_gfs(DoIAU, l4DEnsVar, Write4Danl, ComOut, APrefix, ExecCMDMPILevs_host = 'srun -n ' + str(levs) + ' --verbose --export=ALL -c 1 --distribution=arbitrary --cpu-bind=cores' ExecCMDMPILevs_nohost = 'srun -n ' + str(levs) + ' --verbose --export=ALL' ExecCMDMPI1_host = 'srun -n 1 --verbose --export=ALL -c 1 --distribution=arbitrary --cpu-bind=cores' - ExecCMDMPI10_host = 'srun -n 10 --verbose --export=ALL -c 1 --distribution=arbitrary --cpu-bind=cores' + ExecCMDMPI13_host = 'srun -n 13 --verbose --export=ALL -c 1 --distribution=arbitrary --cpu-bind=cores' elif launcher == 'aprun': hostfile = os.getenv('LSB_DJOB_HOSTFILE', '') with open(hostfile) as f: @@ -213,7 +213,7 @@ def calcanl_gfs(DoIAU, l4DEnsVar, Write4Danl, ComOut, APrefix, ExecCMDMPILevs_host = 'aprun -l hosts -d ' + str(NThreads) + ' -n ' + str(levs) ExecCMDMPILevs_nohost = 'aprun -d ' + str(NThreads) + ' -n ' + str(levs) ExecCMDMPI1_host = 'aprun -l hosts -d ' + str(NThreads) + ' -n 1' - ExecCMDMPI10_host = 'aprun -l hosts -d ' + str(NThreads) + ' -n 10' + ExecCMDMPI13_host = 'aprun -l hosts -d ' + str(NThreads) + ' -n 13' else: print('unknown MPI launcher. Failure.') sys.exit(1) @@ -248,13 +248,13 @@ def calcanl_gfs(DoIAU, l4DEnsVar, Write4Danl, ComOut, APrefix, ihost += 1 for a in range(0, 5): hostfile.write(hosts[ihost] + '\n') - for a in range(0, 9): # need 9 more of the same host for the 10 tasks for chgres_inc + for a in range(0, 12): # need 12 more of the same host for the 13 tasks for chgres_inc hostfile.write(hosts[ihost] + '\n') if launcher == 'srun': os.environ['SLURM_HOSTFILE'] = CalcAnlDir + '/hosts' print('interp_inc', fh, namelist) - job = subprocess.Popen(ExecCMDMPI10_host + ' ' + CalcAnlDir + '/chgres_inc.x', shell=True, cwd=CalcAnlDir) - print(ExecCMDMPI10_host + ' ' + CalcAnlDir + '/chgres_inc.x submitted on ' + hosts[ihost]) + job = subprocess.Popen(ExecCMDMPI13_host + ' ' + CalcAnlDir + '/chgres_inc.x', shell=True, cwd=CalcAnlDir) + print(ExecCMDMPI13_host + ' ' + CalcAnlDir + '/chgres_inc.x submitted on ' + hosts[ihost]) sys.stdout.flush() ec = job.wait() if ec != 0: From 23a8d8835dd4c5d69ca20f5ff23705f30f17b4b0 Mon Sep 17 00:00:00 2001 From: TerrenceMcGuinness-NOAA Date: Tue, 11 Jun 2024 16:17:25 -0400 Subject: [PATCH 24/45] Add overwrite to creat experiment in BASH CI (#2676) This is a quick hotfix to the CI BASH driver script adding `--overwrite` to create experiment script to avoid errors from restarting an experiment. --- ci/scripts/driver.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/scripts/driver.sh b/ci/scripts/driver.sh index ec7702251d..0f53ebff6f 100755 --- a/ci/scripts/driver.sh +++ b/ci/scripts/driver.sh @@ -228,7 +228,7 @@ for pr in ${pr_list}; do } >> "${output_ci}" continue fi - "${HOMEgfs}/workflow/create_experiment.py" --yaml "${HOMEgfs}/ci/cases/pr/${case}.yaml" > "${LOGFILE_PATH}" 2>&1 + "${HOMEgfs}/workflow/create_experiment.py" --yaml "${HOMEgfs}/ci/cases/pr/${case}.yaml" --overwrite > "${LOGFILE_PATH}" 2>&1 ci_status=$? set -e if [[ ${ci_status} -eq 0 ]]; then From 6691e7489650e0b738c176fbd096109288dc09b6 Mon Sep 17 00:00:00 2001 From: "Henry R. Winterbottom" <49202169+HenryWinterbottom-NOAA@users.noreply.github.com> Date: Tue, 11 Jun 2024 21:15:07 -0600 Subject: [PATCH 25/45] Update cleanup job to use COMIN/COMOUT (#2649) NCO has requested that each COM variable specify whether it is an input or an output. This completes that process for the global-workflow clean-up task. Refs #2451 --------- Co-authored-by: Walter Kolczynski - NOAA --- scripts/exglobal_cleanup.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/exglobal_cleanup.sh b/scripts/exglobal_cleanup.sh index cdc13c119b..c2b748f696 100755 --- a/scripts/exglobal_cleanup.sh +++ b/scripts/exglobal_cleanup.sh @@ -59,10 +59,11 @@ for (( current_date=first_date; current_date <= last_date; \ # TODO: This needs to be revamped to not look at the rocoto log. # shellcheck disable=SC2312 if [[ $(tail -n 1 "${rocotolog}") =~ "This cycle is complete: Success" ]]; then - YMD="${current_PDY}" HH="${current_cyc}" declare_from_tmpl COM_TOP - if [[ -d "${COM_TOP}" ]]; then + YMD="${current_PDY}" HH="${current_cyc}" declare_from_tmpl \ + COMOUT_TOP:COM_TOP_TMPL + if [[ -d "${COMOUT_TOP}" ]]; then IFS=", " read -r -a exclude_list <<< "${exclude_string:-}" - remove_files "${COM_TOP}" "${exclude_list[@]:-}" + remove_files "${COMOUT_TOP}" "${exclude_list[@]:-}" fi if [[ -d "${rtofs_dir}" ]] && (( current_date < last_rtofs )); then rm -rf "${rtofs_dir}" ; fi fi From 15eaf35fb13f361be400be38a5f7ca7b5461ab1d Mon Sep 17 00:00:00 2001 From: Eric Sinsky - NOAA <48259628+EricSinsky-NOAA@users.noreply.github.com> Date: Wed, 12 Jun 2024 01:15:37 -0400 Subject: [PATCH 26/45] Add ability to process ocean/ice products specific to GEFS (#2561) This PR begins to add the capability to produce GEFSv13 ocean and ice products in the global-workflow according to stakeholder requirements. The following features are added. - An oceanice prod yaml file has been added to address the ocean and ice products specific to GEFSv13. - The rocoto dependencies and config.base for GEFS have also been modified to allow for 24-hour averaged ocean and ice output. - Various scripts have been modified to allow for ocean and ice output frequencies of 24 hours. - `FHOUT_OCNICE` has been split into two variables called `FHOUT_OCN` and `FHOUT_ICE`. The same has been done for `FHOUT_OCNICE_GFS`. Refs #1878 --- parm/archive/gdasice.yaml.j2 | 2 +- parm/archive/gdasocean.yaml.j2 | 2 +- parm/archive/ice_grib2.yaml.j2 | 2 +- parm/archive/ocean_grib2.yaml.j2 | 2 +- parm/config/gefs/config.base | 10 ++- parm/config/gefs/config.fcst | 3 +- parm/config/gefs/config.oceanice_products | 16 ++++- parm/config/gfs/config.base | 6 +- parm/config/gfs/config.fcst | 3 +- parm/post/oceanice_products_gefs.yaml | 73 ++++++++++++++++++++++ parm/ufs/fv3/diag_table | 2 +- scripts/exglobal_archive.py | 2 +- ush/check_ice_netcdf.sh | 43 +++++++++++++ ush/forecast_postdet.sh | 6 +- ush/forecast_predet.sh | 12 +++- ush/parsing_namelists_CICE.sh | 2 +- ush/python/pygfs/task/oceanice_products.py | 24 ++++++- workflow/rocoto/gefs_tasks.py | 21 +++++-- workflow/rocoto/tasks.py | 17 +++-- 19 files changed, 216 insertions(+), 32 deletions(-) mode change 120000 => 100644 parm/config/gefs/config.oceanice_products create mode 100644 parm/post/oceanice_products_gefs.yaml create mode 100755 ush/check_ice_netcdf.sh diff --git a/parm/archive/gdasice.yaml.j2 b/parm/archive/gdasice.yaml.j2 index 4cfa1eb9af..23337a8856 100644 --- a/parm/archive/gdasice.yaml.j2 +++ b/parm/archive/gdasice.yaml.j2 @@ -4,7 +4,7 @@ gdasice: target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdasice.tar" required: - "{{ COM_ICE_HISTORY | relpath(ROTDIR) }}/{{ head }}ic.nc" - {% for fhr in range(FHOUT_OCNICE, FHMAX+1, FHOUT_OCNICE) %} + {% for fhr in range(FHOUT_ICE, FHMAX+1, FHOUT_ICE) %} - "{{ COM_ICE_HISTORY | relpath(ROTDIR) }}/{{ head }}inst.f{{ '%03d' % fhr }}.nc" {% endfor %} - '{{ COM_CONF | relpath(ROTDIR) }}/ufs.ice_in' diff --git a/parm/archive/gdasocean.yaml.j2 b/parm/archive/gdasocean.yaml.j2 index 9791709319..4e92bba1a0 100644 --- a/parm/archive/gdasocean.yaml.j2 +++ b/parm/archive/gdasocean.yaml.j2 @@ -3,7 +3,7 @@ gdasocean: name: "GDASOCEAN" target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdasocean.tar" required: - {% for fhr in range(FHMIN, FHMAX + 1, FHOUT_OCNICE) %} + {% for fhr in range(FHMIN, FHMAX + 1, FHOUT_OCN) %} - "{{ COM_OCEAN_HISTORY | relpath(ROTDIR) }}/{{ head }}inst.f{{ '%03d' % fhr }}.nc" {% endfor %} - '{{ COM_CONF | relpath(ROTDIR) }}/ufs.MOM_input' diff --git a/parm/archive/ice_grib2.yaml.j2 b/parm/archive/ice_grib2.yaml.j2 index 83e0a30085..9d52f174ab 100644 --- a/parm/archive/ice_grib2.yaml.j2 +++ b/parm/archive/ice_grib2.yaml.j2 @@ -4,7 +4,7 @@ ice_grib2: target: "{{ ATARDIR }}/{{ cycle_YMDH }}/ice_grib2.tar" required: # Ice forecast GRIB2 products - {% for fhr in range(FHOUT_OCNICE_GFS, FHMAX_GFS + FHOUT_OCNICE_GFS, FHOUT_OCNICE_GFS) %} + {% for fhr in range(FHOUT_ICE_GFS, FHMAX_GFS + FHOUT_ICE_GFS, FHOUT_ICE_GFS) %} {% set fhr3 = '%03d' % fhr %} {% if ICERES == 500 %} - "{{ COM_ICE_GRIB | relpath(ROTDIR) }}/5p00/{{ head }}5p00.f{{ fhr3 }}.grib2" diff --git a/parm/archive/ocean_grib2.yaml.j2 b/parm/archive/ocean_grib2.yaml.j2 index 2e63c0ca98..784e30021d 100644 --- a/parm/archive/ocean_grib2.yaml.j2 +++ b/parm/archive/ocean_grib2.yaml.j2 @@ -3,7 +3,7 @@ ocean_grib2: name: "OCEAN_GRIB2" target: "{{ ATARDIR }}/{{ cycle_YMDH }}/ocean_grib2.tar" required: - {% for fhr in range(FHOUT_OCNICE_GFS, FHMAX_GFS + FHOUT_OCNICE_GFS, FHOUT_OCNICE_GFS) %} + {% for fhr in range(FHOUT_OCN_GFS, FHMAX_GFS + FHOUT_OCN_GFS, FHOUT_OCN_GFS) %} {% set fhr3 = '%03d' % fhr %} {% if OCNRES == 500 %} - "{{ COM_OCEAN_GRIB | relpath(ROTDIR) }}/5p00/{{ head }}5p00.f{{ fhr3 }}.grib2" diff --git a/parm/config/gefs/config.base b/parm/config/gefs/config.base index 1b4f948349..b5eb8004b4 100644 --- a/parm/config/gefs/config.base +++ b/parm/config/gefs/config.base @@ -220,6 +220,13 @@ case "${APP}" in ;; esac +# Output frequency of the forecast model (for cycling) +export FHMIN=0 +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 + # GFS cycle info export gfs_cyc=@gfs_cyc@ # 0: no GFS cycle, 1: 00Z only, 2: 00Z and 12Z only, 4: all 4 cycles. @@ -230,7 +237,8 @@ export FHMAX_GFS=@FHMAX_GFS@ export FHOUT_GFS=6 export FHMAX_HF_GFS=0 export FHOUT_HF_GFS=1 -export FHOUT_OCNICE_GFS=6 +export FHOUT_OCN_GFS=6 +export FHOUT_ICE_GFS=6 export FHMIN_WAV=0 export FHOUT_WAV=3 export FHMAX_HF_WAV=120 diff --git a/parm/config/gefs/config.fcst b/parm/config/gefs/config.fcst index 12e461cef8..0009f4a868 100644 --- a/parm/config/gefs/config.fcst +++ b/parm/config/gefs/config.fcst @@ -36,7 +36,8 @@ export FHMAX=${FHMAX_GFS} export FHOUT=${FHOUT_GFS} export FHMAX_HF=${FHMAX_HF_GFS} export FHOUT_HF=${FHOUT_HF_GFS} -export FHOUT_OCNICE=${FHOUT_OCNICE_GFS} +export FHOUT_OCN=${FHOUT_OCN_GFS} +export FHOUT_ICE=${FHOUT_ICE_GFS} # Get task specific resources source "${EXPDIR}/config.resources" fcst diff --git a/parm/config/gefs/config.oceanice_products b/parm/config/gefs/config.oceanice_products deleted file mode 120000 index f6cf9cd60b..0000000000 --- a/parm/config/gefs/config.oceanice_products +++ /dev/null @@ -1 +0,0 @@ -../gfs/config.oceanice_products \ No newline at end of file diff --git a/parm/config/gefs/config.oceanice_products b/parm/config/gefs/config.oceanice_products new file mode 100644 index 0000000000..3b8b064947 --- /dev/null +++ b/parm/config/gefs/config.oceanice_products @@ -0,0 +1,15 @@ +#! /usr/bin/env bash + +########## config.oceanice_products ########## + +echo "BEGIN: config.oceanice_products" + +# Get task specific resources +source "${EXPDIR}/config.resources" oceanice_products + +export OCEANICEPRODUCTS_CONFIG="${PARMgfs}/post/oceanice_products_gefs.yaml" + +# No. of forecast hours to process in a single job +export NFHRS_PER_GROUP=3 + +echo "END: config.oceanice_products" diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base index d9f22f7049..c53ac908f2 100644 --- a/parm/config/gfs/config.base +++ b/parm/config/gfs/config.base @@ -276,7 +276,8 @@ fi export FHMIN=0 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_OCNICE=3 +export FHOUT_OCN=3 +export FHOUT_ICE=3 # Cycle to run EnKF (set to BOTH for both gfs and gdas) export EUPD_CYC="@EUPD_CYC@" @@ -290,7 +291,8 @@ export FHMAX_GFS=@FHMAX_GFS@ export FHOUT_GFS=3 # Must be 6 for S2S until #1629 is addressed; 3 for ops export FHMAX_HF_GFS=0 export FHOUT_HF_GFS=1 -export FHOUT_OCNICE_GFS=6 +export FHOUT_OCN_GFS=6 +export FHOUT_ICE_GFS=6 export FHMIN_WAV=0 export FHOUT_WAV=3 export FHMAX_HF_WAV=120 diff --git a/parm/config/gfs/config.fcst b/parm/config/gfs/config.fcst index f45874a31a..36064d5f2b 100644 --- a/parm/config/gfs/config.fcst +++ b/parm/config/gfs/config.fcst @@ -39,7 +39,8 @@ case ${RUN} in export FHOUT=${FHOUT_GFS} export FHMAX_HF=${FHMAX_HF_GFS} export FHOUT_HF=${FHOUT_HF_GFS} - export FHOUT_OCNICE=${FHOUT_OCNICE_GFS} + export FHOUT_OCN=${FHOUT_OCN_GFS} + export FHOUT_ICE=${FHOUT_ICE_GFS} ;; *gdas) export FHMAX_HF=0 diff --git a/parm/post/oceanice_products_gefs.yaml b/parm/post/oceanice_products_gefs.yaml new file mode 100644 index 0000000000..74c0f0653b --- /dev/null +++ b/parm/post/oceanice_products_gefs.yaml @@ -0,0 +1,73 @@ +ocnicepost: + executable: "ocnicepost.x" + namelist: + debug: False + fix_data: + mkdir: + - "{{ DATA }}" + copy: + - ["{{ EXECgfs }}/ocnicepost.x", "{{ DATA }}/"] + - ["{{ PARMgfs }}/post/ocnicepost.nml.jinja2", "{{ DATA }}/"] + - ["{{ PARMgfs }}/post/{{ component }}.csv", "{{ DATA }}/"] + - ["{{ FIXgfs }}/mom6/post/{{ model_grid }}/tripole.{{ model_grid }}.Bu.to.Ct.bilinear.nc", "{{ DATA }}/"] + - ["{{ FIXgfs }}/mom6/post/{{ model_grid }}/tripole.{{ model_grid }}.Cu.to.Ct.bilinear.nc", "{{ DATA }}/"] + - ["{{ FIXgfs }}/mom6/post/{{ model_grid }}/tripole.{{ model_grid }}.Cv.to.Ct.bilinear.nc", "{{ DATA }}/"] + {% for grid in product_grids %} + - ["{{ FIXgfs }}/mom6/post/{{ model_grid }}/tripole.{{ model_grid }}.Ct.to.rect.{{ grid }}.bilinear.nc", "{{ DATA }}/"] + - ["{{ FIXgfs }}/mom6/post/{{ model_grid }}/tripole.{{ model_grid }}.Ct.to.rect.{{ grid }}.conserve.nc", "{{ DATA }}/"] + - ["{{ FIXgfs }}/mom6/post/template.global.{{ grid }}.gb2", "{{ DATA }}/"] + {% endfor %} + +nc2grib2: + script: "{{ USHgfs }}/oceanice_nc2grib2.sh" + +ocean: + namelist: + ftype: "ocean" + maskvar: "temp" + sinvar: "sin_rot" + cosvar: "cos_rot" + angvar: "" + {% if model_grid == 'mx025' or model_grid == 'mx050' or model_grid == 'mx100' %} + ocean_levels: [5, 15, 25, 35, 45, 55, 65, 75, 85, 95, 105, 115, 125, 135, 145, 155, 165, 175, 185, 195, 205, 215, 226, 241, 267, 309, 374, 467, 594, 757, 960, 1204, 1490, 1817, 2184, 2587, 3024, 3489, 3977, 4481] + {% elif model_grid == 'mx500' %} + ocean_levels: [5, 15, 25, 35, 45, 55, 65, 75, 85, 95, 105, 115, 125, 135, 145, 155, 165, 175, 185, 195, 205, 215, 226, 241, 267] + {% endif %} + subset: ['SSH', 'SST', 'SSS', 'speed', 'MLD_003', 'latent', 'sensible', 'SW', 'LW', 'LwLatSens', 'Heat_PmE', 'SSU', 'SSV', 'taux', 'tauy', 'temp', 'so', 'uo', 'vo'] + data_in: + copy: + - ["{{ COM_OCEAN_HISTORY }}/{{ RUN }}.ocean.t{{ current_cycle | strftime('%H') }}z.{{ interval }}hr_avg.f{{ '%03d' % forecast_hour }}.nc", "{{ DATA }}/ocean.nc"] + data_out: + mkdir: + - "{{ COM_OCEAN_NETCDF }}" + {% for grid in product_grids %} + - "{{ COM_OCEAN_GRIB }}/{{ grid }}" + {% endfor %} + copy: + - ["{{ DATA }}/ocean_subset.nc", "{{ COM_OCEAN_NETCDF }}/{{ RUN }}.ocean.t{{ current_cycle | strftime('%H') }}z.native.f{{ '%03d' % forecast_hour }}.nc"] + {% for grid in product_grids %} + - ["{{ DATA }}/ocean.{{ grid }}.nc", "{{ COM_OCEAN_NETCDF }}/{{ RUN }}.ocean.t{{ current_cycle | strftime('%H') }}z.{{ grid }}.f{{ '%03d' % forecast_hour }}.nc"] + {% endfor %} + +ice: + namelist: + ftype: "ice" + maskvar: "tmask" + sinvar: "" + cosvar: "" + angvar: "ANGLET" + subset: ['hi_h', 'hs_h', 'aice_h', 'Tsfc_h', 'uvel_h', 'vvel_h', 'frzmlt_h', 'albsni_h', 'mlt_onset_h', 'frz_onset_h'] + data_in: + copy: + - ["{{ COM_ICE_HISTORY }}/{{ RUN }}.ice.t{{ current_cycle | strftime('%H') }}z.{{ interval }}hr_avg.f{{ '%03d' % forecast_hour }}.nc", "{{ DATA }}/ice.nc"] + data_out: + mkdir: + - "{{ COM_ICE_NETCDF }}" + {% for grid in product_grids %} + - "{{ COM_ICE_GRIB }}/{{ grid }}" + {% endfor %} + copy: + - ["{{ DATA }}/ice_subset.nc", "{{ COM_ICE_NETCDF }}/{{ RUN }}.ice.t{{ current_cycle | strftime('%H') }}z.native.f{{ '%03d' % forecast_hour }}.nc"] + {% for grid in product_grids %} + - ["{{ DATA }}/ice.{{ grid }}.nc", "{{ COM_ICE_NETCDF }}/{{ RUN }}.ice.t{{ current_cycle | strftime('%H') }}z.{{ grid }}.f{{ '%03d' % forecast_hour }}.nc"] + {% endfor %} diff --git a/parm/ufs/fv3/diag_table b/parm/ufs/fv3/diag_table index 9e26d80154..83991cb223 100644 --- a/parm/ufs/fv3/diag_table +++ b/parm/ufs/fv3/diag_table @@ -1,6 +1,6 @@ "fv3_history", 0, "hours", 1, "hours", "time" "fv3_history2d", 0, "hours", 1, "hours", "time" -"@[MOM6_OUTPUT_DIR]/ocn%4yr%2mo%2dy%2hr", @[FHOUT_OCNICE], "hours", 1, "hours", "time", @[FHOUT_OCNICE], "hours", "@[SYEAR] @[SMONTH] @[SDAY] @[CHOUR] 0 0" +"@[MOM6_OUTPUT_DIR]/ocn%4yr%2mo%2dy%2hr", @[FHOUT_OCN], "hours", 1, "hours", "time", @[FHOUT_OCN], "hours", "@[SYEAR] @[SMONTH] @[SDAY] @[CHOUR] 0 0" "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", 1, "days", 1, "days", "time", 1, "days", "@[SYEAR] @[SMONTH] @[SDAY] @[CHOUR] 0 0" ############## diff --git a/scripts/exglobal_archive.py b/scripts/exglobal_archive.py index d700eebb5d..e38d0abf72 100755 --- a/scripts/exglobal_archive.py +++ b/scripts/exglobal_archive.py @@ -24,7 +24,7 @@ def main(): 'DO_JEDISNOWDA', 'LOCALARCH', 'REALTIME', 'ROTDIR', 'ARCH_WARMICFREQ', 'ARCH_FCSTICFREQ', 'ARCH_CYC', 'assim_freq', 'ARCDIR', 'SDATE', 'FHMIN_GFS', 'FHMAX_GFS', 'FHOUT_GFS', 'ARCH_GAUSSIAN', 'MODE', - 'FHOUT_OCNICE', 'FHOUT_OCNICE_GFS', 'DO_BUFRSND', 'DOHYBVAR', + 'FHOUT_OCN', 'FHOUT_ICE', 'FHOUT_OCN_GFS', 'FHOUT_ICE_GFS', 'DO_BUFRSND', 'DOHYBVAR', 'ARCH_GAUSSIAN_FHMAX', 'ARCH_GAUSSIAN_FHINC', 'ARCH_GAUSSIAN_FHINC', 'DOIAU', 'OCNRES', 'ICERES', 'NUM_SND_COLLECTIVES', 'FHOUT_WAV', 'FHOUT_HF_WAV', 'FHMAX_WAV', 'FHMAX_HF_WAV', 'FHMAX_WAV_GFS', diff --git a/ush/check_ice_netcdf.sh b/ush/check_ice_netcdf.sh new file mode 100755 index 0000000000..02ca4dae80 --- /dev/null +++ b/ush/check_ice_netcdf.sh @@ -0,0 +1,43 @@ +#! /usr/bin/env bash + +yyyy=${1?} +mm=${2?} +dd=${3?} +cyc=${4?} +fhr=${5?} +ROTDIR=${6?} +member=${7?} +FHOUT_ICE_GFS=${8?} + +fhri=$((10#${fhr})) + +#Will need to consider fhmin in the future to calculate the offset if we are to stick with this approach. +((offset = ( cyc ) % FHOUT_ICE_GFS)) + +if (( offset != 0 )); then + (( fhri = fhri - cyc )) + fhr3=$(printf %03i "${fhri}") + if (( fhri <= FHOUT_ICE_GFS )); then + (( interval = FHOUT_ICE_GFS - cyc )) + ncfile=${ROTDIR}/gefs.${yyyy}${mm}${dd}/${cyc}/mem${member}/model_data/ice/history/gefs.ice.t${cyc}z.${interval}hr_avg.f${fhr3}.nc + else + ncfile=${ROTDIR}/gefs.${yyyy}${mm}${dd}/${cyc}/mem${member}/model_data/ice/history/gefs.ice.t${cyc}z.${FHOUT_ICE_GFS}hr_avg.f${fhr3}.nc + fi +else + ncfile=${ROTDIR}/gefs.${yyyy}${mm}${dd}/${cyc}/mem${member}/model_data/ice/history/gefs.ice.t${cyc}z.${FHOUT_ICE_GFS}hr_avg.f${fhr}.nc +fi + +#Check if netcdf file exists. +if [[ ! -f "${ncfile}" ]];then + rc=1 +else + #Check if netcdf file is older than 2 minutes. + ncage="$(find "${ncfile}" -mmin -2)" + if [[ -n "${ncage}" ]]; then + rc=1 + else + rc=0 + fi +fi + +exit "${rc}" diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh index d4d1d4ad6f..3f6ffcb8c2 100755 --- a/ush/forecast_postdet.sh +++ b/ush/forecast_postdet.sh @@ -545,14 +545,14 @@ CICE_postdet() { # Link CICE forecast output files from DATA/CICE_OUTPUT to COM local source_file dest_file - for fhr in ${CICE_OUTPUT_FH}; do - fhr3=$(printf %03i "${fhr}") + for fhr in "${CICE_OUTPUT_FH[@]}"; do if [[ -z ${last_fhr:-} ]]; then last_fhr=${fhr} continue fi + fhr3=$(printf %03i "${fhr}") (( interval = fhr - last_fhr )) vdate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${fhr} hours" +%Y%m%d%H) @@ -560,7 +560,7 @@ CICE_postdet() { vdatestr="${vdate:0:4}-${vdate:4:2}-${vdate:6:2}-${seconds}" if [[ "${RUN}" =~ "gfs" || "${RUN}" =~ "gefs" ]]; then - source_file="iceh_$(printf "%0.2d" "${interval}")h.${vdatestr}.nc" + source_file="iceh_$(printf "%0.2d" "${FHOUT_ICE}")h.${vdatestr}.nc" dest_file="${RUN}.ice.t${cyc}z.${interval}hr_avg.f${fhr3}.nc" elif [[ "${RUN}" =~ "gdas" ]]; then source_file="iceh_inst.${vdatestr}.nc" diff --git a/ush/forecast_predet.sh b/ush/forecast_predet.sh index c26b214fc9..2f19b2c28e 100755 --- a/ush/forecast_predet.sh +++ b/ush/forecast_predet.sh @@ -568,7 +568,15 @@ CICE_predet(){ # CICE does not have a concept of high frequency output like FV3 # Convert output settings into an explicit list for CICE - CICE_OUTPUT_FH=$(seq -s ' ' "${FHMIN}" "${FHOUT_OCNICE}" "${FHMAX}") + if (( $(( ( cyc + FHMIN ) % FHOUT_ICE )) == 0 )); then + # shellcheck disable=SC2312 + mapfile -t CICE_OUTPUT_FH < <(seq "${FHMIN}" "${FHOUT_ICE}" "${FHMAX}") || exit 10 + else + CICE_OUTPUT_FH=("${FHMIN}") + # shellcheck disable=SC2312 + mapfile -t -O "${#CICE_OUTPUT_FH[@]}" CICE_OUTPUT_FH < <(seq "$(( FHMIN + $(( ( cyc + FHMIN ) % FHOUT_ICE )) ))" "${FHOUT_ICE}" "${FHMAX}") || exit 10 + CICE_OUTPUT_FH+=("${FHMAX}") + fi # Fix files ${NCP} "${FIXgfs}/cice/${ICERES}/${CICE_GRID}" "${DATA}/" @@ -591,7 +599,7 @@ MOM6_predet(){ # MOM6 does not have a concept of high frequency output like FV3 # Convert output settings into an explicit list for MOM6 - MOM6_OUTPUT_FH=$(seq -s ' ' "${FHMIN}" "${FHOUT_OCNICE}" "${FHMAX}") + MOM6_OUTPUT_FH=$(seq -s ' ' "${FHMIN}" "${FHOUT_OCN}" "${FHMAX}") # If using stochastic parameterizations, create a seed that does not exceed the # largest signed integer diff --git a/ush/parsing_namelists_CICE.sh b/ush/parsing_namelists_CICE.sh index 9aed59e214..aa495d1864 100755 --- a/ush/parsing_namelists_CICE.sh +++ b/ush/parsing_namelists_CICE.sh @@ -69,7 +69,7 @@ local CICE_RESTART_FORMAT="pnetcdf2" local CICE_DUMPFREQ="y" # "h","d","m" or "y" for restarts at intervals of "hours", "days", "months" or "years" local CICE_DUMPFREQ_N=10000 # Set this to a really large value, as cice, mom6 and cmeps restart interval is controlled by ufs.configure local CICE_DIAGFREQ=$(( 86400 / DT_CICE )) # frequency of diagnostic output in timesteps, recommended for 1x per day -local CICE_HISTFREQ_N="0, 0, ${FHOUT_OCNICE}, 1, 1" +local CICE_HISTFREQ_N="0, 0, ${FHOUT_ICE}, 1, 1" if [[ "${RUN}" =~ "gdas" ]]; then local CICE_HIST_AVG=".false., .false., .false., .false., .false." # DA needs instantaneous else diff --git a/ush/python/pygfs/task/oceanice_products.py b/ush/python/pygfs/task/oceanice_products.py index c865a9f408..690aac9542 100644 --- a/ush/python/pygfs/task/oceanice_products.py +++ b/ush/python/pygfs/task/oceanice_products.py @@ -58,17 +58,35 @@ def __init__(self, config: Dict[str, Any]) -> None: valid_datetime = add_to_datetime(self.runtime_config.current_cycle, to_timedelta(f"{self.config.FORECAST_HOUR}H")) + if self.config.COMPONENT == 'ice': + offset = int(self.runtime_config.current_cycle.strftime("%H")) % self.config.FHOUT_ICE_GFS + # For CICE cases where offset is not 0, forecast_hour needs to be adjusted based on the offset. + # TODO: Consider FHMIN when calculating offset. + if offset != 0: + forecast_hour = self.config.FORECAST_HOUR - int(self.runtime_config.current_cycle.strftime("%H")) + # For the first forecast hour, the interval may be different from the intervals of subsequent forecast hours + if forecast_hour <= self.config.FHOUT_ICE_GFS: + interval = self.config.FHOUT_ICE_GFS - int(self.runtime_config.current_cycle.strftime("%H")) + else: + interval = self.config.FHOUT_ICE_GFS + else: + forecast_hour = self.config.FORECAST_HOUR + interval = self.config.FHOUT_ICE_GFS + if self.config.COMPONENT == 'ocean': + forecast_hour = self.config.FORECAST_HOUR + interval = self.config.FHOUT_OCN_GFS + # TODO: This is a bit of a hack, but it works for now # FIXME: find a better way to provide the averaging period - # This will be different for ocean and ice, so when they are made flexible, this will need to be addressed - avg_period = f"{self.config.FORECAST_HOUR-self.config.FHOUT_OCNICE_GFS:03d}-{self.config.FORECAST_HOUR:03d}" + avg_period = f"{forecast_hour-interval:03d}-{forecast_hour:03d}" localdict = AttrDict( {'component': self.config.COMPONENT, - 'forecast_hour': self.config.FORECAST_HOUR, + 'forecast_hour': forecast_hour, 'valid_datetime': valid_datetime, 'avg_period': avg_period, 'model_grid': model_grid, + 'interval': interval, 'product_grids': self.VALID_PRODUCT_GRIDS[model_grid]} ) self.task_config = AttrDict(**self.config, **self.runtime_config, **localdict) diff --git a/workflow/rocoto/gefs_tasks.py b/workflow/rocoto/gefs_tasks.py index 86be494549..99be535a55 100644 --- a/workflow/rocoto/gefs_tasks.py +++ b/workflow/rocoto/gefs_tasks.py @@ -198,15 +198,17 @@ def ice_prod(self): def _atmosoceaniceprod(self, component: str): + fhout_ocn_gfs = self._configs['base']['FHOUT_OCN_GFS'] + fhout_ice_gfs = self._configs['base']['FHOUT_ICE_GFS'] products_dict = {'atmos': {'config': 'atmos_products', 'history_path_tmpl': 'COM_ATMOS_MASTER_TMPL', 'history_file_tmpl': f'{self.cdump}.t@Hz.master.grb2f#fhr#'}, 'ocean': {'config': 'oceanice_products', 'history_path_tmpl': 'COM_OCEAN_HISTORY_TMPL', - 'history_file_tmpl': f'{self.cdump}.ocean.t@Hz.6hr_avg.f#fhr#.nc'}, + 'history_file_tmpl': f'{self.cdump}.ocean.t@Hz.{fhout_ocn_gfs}hr_avg.f#fhr#.nc'}, 'ice': {'config': 'oceanice_products', 'history_path_tmpl': 'COM_ICE_HISTORY_TMPL', - 'history_file_tmpl': f'{self.cdump}.ice.t@Hz.6hr_avg.f#fhr#.nc'}} + 'history_file_tmpl': f'{self.cdump}.ice.t@Hz.{fhout_ice_gfs}hr_avg.f#fhr#.nc'}} component_dict = products_dict[component] config = component_dict['config'] @@ -218,14 +220,21 @@ def _atmosoceaniceprod(self, component: str): history_path = self._template_to_rocoto_cycstring(self._base[history_path_tmpl], {'MEMDIR': 'mem#member#'}) deps = [] data = f'{history_path}/{history_file_tmpl}' - dep_dict = {'type': 'data', 'data': data, 'age': 120} - deps.append(rocoto.add_dependency(dep_dict)) if component in ['ocean']: + dep_dict = {'type': 'data', 'data': data, 'age': 120} + deps.append(rocoto.add_dependency(dep_dict)) command = f"{self.HOMEgfs}/ush/check_netcdf.sh {history_path}/{history_file_tmpl}" dep_dict = {'type': 'sh', 'command': command} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps, dep_condition='and') + elif component in ['ice']: + command = f"{self.HOMEgfs}/ush/check_ice_netcdf.sh @Y @m @d @H #fhr# &ROTDIR; #member# {fhout_ice_gfs}" + dep_dict = {'type': 'sh', 'command': command} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep=deps) else: + dep_dict = {'type': 'data', 'data': data, 'age': 120} + deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) postenvars = self.envars.copy() @@ -247,10 +256,10 @@ def _atmosoceaniceprod(self, component: str): 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log', 'maxtries': '&MAXTRIES;'} - fhrs = self._get_forecast_hours('gefs', self._configs[config]) + fhrs = self._get_forecast_hours('gefs', self._configs[config], component) # ocean/ice components do not have fhr 0 as they are averaged output - if component in ['ocean', 'ice']: + if component in ['ocean', 'ice'] and 0 in fhrs: fhrs.remove(0) fhr_var_dict = {'fhr': ' '.join([f"{fhr:03d}" for fhr in fhrs])} diff --git a/workflow/rocoto/tasks.py b/workflow/rocoto/tasks.py index 52d5466d10..ad135be713 100644 --- a/workflow/rocoto/tasks.py +++ b/workflow/rocoto/tasks.py @@ -130,10 +130,17 @@ def _get_forecast_hours(cdump, config, component='atmos') -> List[str]: # Ocean/Ice components do not have a HF output option like the atmosphere if component in ['ocean', 'ice']: - local_config['FHMAX_HF_GFS'] = config['FHMAX_GFS'] - local_config['FHOUT_HF_GFS'] = config['FHOUT_OCNICE_GFS'] - local_config['FHOUT_GFS'] = config['FHOUT_OCNICE_GFS'] - local_config['FHOUT'] = config['FHOUT_OCNICE'] + local_config['FHMAX_HF_GFS'] = 0 + + if component in ['ocean']: + local_config['FHOUT_HF_GFS'] = config['FHOUT_OCN_GFS'] + local_config['FHOUT_GFS'] = config['FHOUT_OCN_GFS'] + local_config['FHOUT'] = config['FHOUT_OCN'] + + if component in ['ice']: + local_config['FHOUT_HF_GFS'] = config['FHOUT_ICE_GFS'] + local_config['FHOUT_GFS'] = config['FHOUT_ICE_GFS'] + local_config['FHOUT'] = config['FHOUT_ICE'] fhmin = local_config['FHMIN'] @@ -152,7 +159,7 @@ def _get_forecast_hours(cdump, config, component='atmos') -> List[str]: fhrs = list(fhrs_hf) + list(range(fhrs_hf[-1] + fhout, fhmax + fhout, fhout)) # ocean/ice components do not have fhr 0 as they are averaged output - if component in ['ocean', 'ice']: + if component in ['ocean', 'ice'] and 0 in fhrs: fhrs.remove(0) return fhrs From 61de004d4f9e9edf8a31bb173f2719b46451a36a Mon Sep 17 00:00:00 2001 From: Jessica Meixner Date: Wed, 12 Jun 2024 11:03:13 -0400 Subject: [PATCH 27/45] Update ufs-weather-model (#2663) Updates ufs-weather-model, this updates RDHPCS to the newer spack-stack allowing some temporary fixes to be reverted. * removes upp submodule * uses upp from the ufs-weather-model * restores the build and link that were hacked during the Hera Rocky 8 transition to allow for UPP submodule * Removes forecast directories in clean-up Resolves #2617 Resolves #2437 --------- Co-authored-by: Rahul Mahajan --- .gitmodules | 4 ---- scripts/exglobal_cleanup.sh | 7 +++++++ sorc/build_upp.sh | 2 +- sorc/link_workflow.sh | 9 ++++----- sorc/ufs_model.fd | 2 +- sorc/upp.fd | 1 - ush/forecast_postdet.sh | 11 +++++------ 7 files changed, 18 insertions(+), 18 deletions(-) delete mode 160000 sorc/upp.fd diff --git a/.gitmodules b/.gitmodules index ea1b5c06af..1c3b7acfa5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -26,10 +26,6 @@ [submodule "sorc/gsi_monitor.fd"] path = sorc/gsi_monitor.fd url = https://github.com/NOAA-EMC/GSI-Monitor.git -[submodule "sorc/upp.fd"] - path = sorc/upp.fd - url = https://github.com/NOAA-EMC/UPP.git - ignore = dirty [submodule "sorc/jcb"] path = sorc/jcb url = https://github.com/noaa-emc/jcb diff --git a/scripts/exglobal_cleanup.sh b/scripts/exglobal_cleanup.sh index c2b748f696..7c3dfafbad 100755 --- a/scripts/exglobal_cleanup.sh +++ b/scripts/exglobal_cleanup.sh @@ -2,6 +2,13 @@ source "${USHgfs}/preamble.sh" +# Remove DATAoutput from the forecast model run +# TODO: Handle this better +DATAfcst="${DATAROOT}/${RUN}fcst.${PDY:-}${cyc}" +if [[ -d "${DATAfcst}" ]]; then rm -rf "${DATAfcst}"; fi +#DATAefcs="${DATAROOT}/${RUN}efcs???${PDY:-}${cyc}" +rm -rf "${DATAROOT}/${RUN}efcs"*"${PDY:-}${cyc}" + ############################################################### # Clean up previous cycles; various depths # PRIOR CYCLE: Leave the prior cycle alone diff --git a/sorc/build_upp.sh b/sorc/build_upp.sh index 1dca0035fd..e217e171db 100755 --- a/sorc/build_upp.sh +++ b/sorc/build_upp.sh @@ -26,6 +26,6 @@ if [[ ! -d "../exec" ]]; then mkdir -p ../exec fi -cd upp.fd/tests +cd ufs_model.fd/FV3/upp/tests # shellcheck disable=SC2086 BUILD_JOBS=${BUILD_JOBS:-8} ./compile_upp.sh ${_opts} diff --git a/sorc/link_workflow.sh b/sorc/link_workflow.sh index f338f2bad3..593a4694c1 100755 --- a/sorc/link_workflow.sh +++ b/sorc/link_workflow.sh @@ -370,11 +370,10 @@ fi #--link source code directories #------------------------------ cd "${HOMEgfs}/sorc" || exit 8 -# TODO: Commenting out until UPP is up-to-date with Rocky-8. -#if [[ -d ufs_model.fd ]]; then -# [[ -d upp.fd ]] && rm -rf upp.fd -# ${LINK} ufs_model.fd/FV3/upp upp.fd -#fi +if [[ -d ufs_model.fd ]]; then + [[ -d upp.fd ]] && rm -rf upp.fd + ${LINK} ufs_model.fd/FV3/upp upp.fd +fi if [[ -d gsi_enkf.fd ]]; then [[ -d gsi.fd ]] && rm -rf gsi.fd diff --git a/sorc/ufs_model.fd b/sorc/ufs_model.fd index 5bec704243..485ccdfc4a 160000 --- a/sorc/ufs_model.fd +++ b/sorc/ufs_model.fd @@ -1 +1 @@ -Subproject commit 5bec704243286421fc613838fc67a2129e96acd6 +Subproject commit 485ccdfc4a7ed6deeb02d82c2cebe51b37e892f5 diff --git a/sorc/upp.fd b/sorc/upp.fd deleted file mode 160000 index 83e83a938b..0000000000 --- a/sorc/upp.fd +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 83e83a938b5794a628d30e66a54902dabe58737d diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh index 3f6ffcb8c2..aff4f5a394 100755 --- a/ush/forecast_postdet.sh +++ b/ush/forecast_postdet.sh @@ -217,12 +217,11 @@ FV3_out() { echo "SUB ${FUNCNAME[0]}: copying output data for FV3" # Copy configuration files - if [[ "${RUN}" == "gfs" || "${RUN}" == "gefs" ]]; then - ${NCP} "${DATA}/input.nml" "${COMOUT_CONF}/ufs.input.nml" - ${NCP} "${DATA}/model_configure" "${COMOUT_CONF}/ufs.model_configure" - ${NCP} "${DATA}/ufs.configure" "${COMOUT_CONF}/ufs.ufs.configure" - ${NCP} "${DATA}/diag_table" "${COMOUT_CONF}/ufs.diag_table" - fi + ${NCP} "${DATA}/input.nml" "${COMOUT_CONF}/ufs.input.nml" + ${NCP} "${DATA}/model_configure" "${COMOUT_CONF}/ufs.model_configure" + ${NCP} "${DATA}/ufs.configure" "${COMOUT_CONF}/ufs.ufs.configure" + ${NCP} "${DATA}/diag_table" "${COMOUT_CONF}/ufs.diag_table" + # Create an array of fv3 restart files local fv3_restart_files tile_files fv3_restart_file restart_file From 2e6f1fcde9935619352b1b26cba42ec0f4d845ed Mon Sep 17 00:00:00 2001 From: Guoqing Ge Date: Wed, 12 Jun 2024 09:06:23 -0600 Subject: [PATCH 28/45] Link both global-nest fix files and non-nest ones at the same time (#2632) This PR enables linking both global-nest fix files and non-nest ones at the same time and users can run both nesting and non-nesting experiments at the same time without worries about what fix files to be linked. Resolves #2631 --- .gitignore | 2 + parm/config/gefs/config.base | 2 + parm/config/gfs/config.base | 6 +- parm/ufs/fix/gfs/atmos.fixed_files.yaml | 42 +++++------ parm/ufs/fix/gfs/land.fixed_files.yaml | 98 ++++++++++++------------- parm/ufs/fix/gfs/ocean.fixed_files.yaml | 12 +-- scripts/exgdas_enkf_sfc.sh | 8 +- scripts/exglobal_forecast.sh | 6 +- sorc/link_workflow.sh | 19 +++-- sorc/ufs_utils.fd | 2 +- ush/forecast_predet.sh | 36 ++++----- ush/gaussian_sfcanl.sh | 16 ++-- versions/fix.nest.ver | 4 - versions/fix.ver | 2 + 14 files changed, 134 insertions(+), 121 deletions(-) delete mode 100644 versions/fix.nest.ver diff --git a/.gitignore b/.gitignore index 04193fca0a..8314f5bae9 100644 --- a/.gitignore +++ b/.gitignore @@ -35,8 +35,10 @@ fix/gsi fix/lut fix/mom6 fix/orog +fix/orog_nest fix/sfc_climo fix/ugwd +fix/ugwd_nest fix/verif fix/wave diff --git a/parm/config/gefs/config.base b/parm/config/gefs/config.base index b5eb8004b4..840f33ad60 100644 --- a/parm/config/gefs/config.base +++ b/parm/config/gefs/config.base @@ -30,6 +30,8 @@ export FIXgfs=${HOMEgfs}/fix export PARMgfs=${HOMEgfs}/parm export SCRgfs=${HOMEgfs}/scripts export USHgfs=${HOMEgfs}/ush +export FIXorog=${FIXgfs}/orog +export FIXugwd=${FIXgfs}/ugwd ######################################################################## diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base index c53ac908f2..7eedec8af7 100644 --- a/parm/config/gfs/config.base +++ b/parm/config/gfs/config.base @@ -35,11 +35,9 @@ export FIXam="${FIXgfs}/am" export FIXaer="${FIXgfs}/aer" export FIXcpl="${FIXgfs}/cpl" export FIXlut="${FIXgfs}/lut" -export FIXorog="${FIXgfs}/orog" export FIXcice="${FIXgfs}/cice" export FIXmom="${FIXgfs}/mom6" export FIXreg2grb2="${FIXgfs}/reg2grb2" -export FIXugwd="${FIXgfs}/ugwd" export FIXgdas="${FIXgfs}/gdas" ######################################################################## @@ -190,8 +188,12 @@ export DO_NEST="NO" # Whether to run a global-nested domain if [[ "${DO_NEST:-NO}" == "YES" ]] ; then export ntiles=7 export NEST_OUTPUT_GRID="regional_latlon" + export FIXugwd="${FIXgfs}/ugwd_nest" + export FIXorog="${FIXgfs}/orog_nest" else export ntiles=6 + export FIXugwd="${FIXgfs}/ugwd" + export FIXorog="${FIXgfs}/orog" fi # Set operational resolution diff --git a/parm/ufs/fix/gfs/atmos.fixed_files.yaml b/parm/ufs/fix/gfs/atmos.fixed_files.yaml index 8db691b49c..374c26873e 100644 --- a/parm/ufs/fix/gfs/atmos.fixed_files.yaml +++ b/parm/ufs/fix/gfs/atmos.fixed_files.yaml @@ -1,31 +1,31 @@ copy: # Atmosphere mosaic file linked as the grid_spec file (atm only) - - [$(FIXgfs)/orog/$(CASE)/$(CASE)_mosaic.nc, $(DATA)/INPUT/grid_spec.nc] + - [$(FIXorog)/$(CASE)/$(CASE)_mosaic.nc, $(DATA)/INPUT/grid_spec.nc] # Atmosphere grid tile files - - [$(FIXgfs)/orog/$(CASE)/$(CASE)_grid.tile1.nc, $(DATA)/INPUT/] - - [$(FIXgfs)/orog/$(CASE)/$(CASE)_grid.tile2.nc, $(DATA)/INPUT/] - - [$(FIXgfs)/orog/$(CASE)/$(CASE)_grid.tile3.nc, $(DATA)/INPUT/] - - [$(FIXgfs)/orog/$(CASE)/$(CASE)_grid.tile4.nc, $(DATA)/INPUT/] - - [$(FIXgfs)/orog/$(CASE)/$(CASE)_grid.tile5.nc, $(DATA)/INPUT/] - - [$(FIXgfs)/orog/$(CASE)/$(CASE)_grid.tile6.nc, $(DATA)/INPUT/] + - [$(FIXorog)/$(CASE)/$(CASE)_grid.tile1.nc, $(DATA)/INPUT/] + - [$(FIXorog)/$(CASE)/$(CASE)_grid.tile2.nc, $(DATA)/INPUT/] + - [$(FIXorog)/$(CASE)/$(CASE)_grid.tile3.nc, $(DATA)/INPUT/] + - [$(FIXorog)/$(CASE)/$(CASE)_grid.tile4.nc, $(DATA)/INPUT/] + - [$(FIXorog)/$(CASE)/$(CASE)_grid.tile5.nc, $(DATA)/INPUT/] + - [$(FIXorog)/$(CASE)/$(CASE)_grid.tile6.nc, $(DATA)/INPUT/] - # oro_data_ls and oro_data_ss files from FIXgfs/ugwd - - [$(FIXgfs)/ugwd/$(CASE)/$(CASE)_oro_data_ls.tile1.nc, $(DATA)/INPUT/oro_data_ls.tile1.nc] - - [$(FIXgfs)/ugwd/$(CASE)/$(CASE)_oro_data_ls.tile2.nc, $(DATA)/INPUT/oro_data_ls.tile2.nc] - - [$(FIXgfs)/ugwd/$(CASE)/$(CASE)_oro_data_ls.tile3.nc, $(DATA)/INPUT/oro_data_ls.tile3.nc] - - [$(FIXgfs)/ugwd/$(CASE)/$(CASE)_oro_data_ls.tile4.nc, $(DATA)/INPUT/oro_data_ls.tile4.nc] - - [$(FIXgfs)/ugwd/$(CASE)/$(CASE)_oro_data_ls.tile5.nc, $(DATA)/INPUT/oro_data_ls.tile5.nc] - - [$(FIXgfs)/ugwd/$(CASE)/$(CASE)_oro_data_ls.tile6.nc, $(DATA)/INPUT/oro_data_ls.tile6.nc] - - [$(FIXgfs)/ugwd/$(CASE)/$(CASE)_oro_data_ss.tile1.nc, $(DATA)/INPUT/oro_data_ss.tile1.nc] - - [$(FIXgfs)/ugwd/$(CASE)/$(CASE)_oro_data_ss.tile2.nc, $(DATA)/INPUT/oro_data_ss.tile2.nc] - - [$(FIXgfs)/ugwd/$(CASE)/$(CASE)_oro_data_ss.tile3.nc, $(DATA)/INPUT/oro_data_ss.tile3.nc] - - [$(FIXgfs)/ugwd/$(CASE)/$(CASE)_oro_data_ss.tile4.nc, $(DATA)/INPUT/oro_data_ss.tile4.nc] - - [$(FIXgfs)/ugwd/$(CASE)/$(CASE)_oro_data_ss.tile5.nc, $(DATA)/INPUT/oro_data_ss.tile5.nc] - - [$(FIXgfs)/ugwd/$(CASE)/$(CASE)_oro_data_ss.tile6.nc, $(DATA)/INPUT/oro_data_ss.tile6.nc] + # oro_data_ls and oro_data_ss files from FIXugwd + - [$(FIXugwd)/$(CASE)/$(CASE)_oro_data_ls.tile1.nc, $(DATA)/INPUT/oro_data_ls.tile1.nc] + - [$(FIXugwd)/$(CASE)/$(CASE)_oro_data_ls.tile2.nc, $(DATA)/INPUT/oro_data_ls.tile2.nc] + - [$(FIXugwd)/$(CASE)/$(CASE)_oro_data_ls.tile3.nc, $(DATA)/INPUT/oro_data_ls.tile3.nc] + - [$(FIXugwd)/$(CASE)/$(CASE)_oro_data_ls.tile4.nc, $(DATA)/INPUT/oro_data_ls.tile4.nc] + - [$(FIXugwd)/$(CASE)/$(CASE)_oro_data_ls.tile5.nc, $(DATA)/INPUT/oro_data_ls.tile5.nc] + - [$(FIXugwd)/$(CASE)/$(CASE)_oro_data_ls.tile6.nc, $(DATA)/INPUT/oro_data_ls.tile6.nc] + - [$(FIXugwd)/$(CASE)/$(CASE)_oro_data_ss.tile1.nc, $(DATA)/INPUT/oro_data_ss.tile1.nc] + - [$(FIXugwd)/$(CASE)/$(CASE)_oro_data_ss.tile2.nc, $(DATA)/INPUT/oro_data_ss.tile2.nc] + - [$(FIXugwd)/$(CASE)/$(CASE)_oro_data_ss.tile3.nc, $(DATA)/INPUT/oro_data_ss.tile3.nc] + - [$(FIXugwd)/$(CASE)/$(CASE)_oro_data_ss.tile4.nc, $(DATA)/INPUT/oro_data_ss.tile4.nc] + - [$(FIXugwd)/$(CASE)/$(CASE)_oro_data_ss.tile5.nc, $(DATA)/INPUT/oro_data_ss.tile5.nc] + - [$(FIXugwd)/$(CASE)/$(CASE)_oro_data_ss.tile6.nc, $(DATA)/INPUT/oro_data_ss.tile6.nc] # GWD?? - - [$(FIXgfs)/ugwd/ugwp_limb_tau.nc, $(DATA)/ugwp_limb_tau.nc] + - [$(FIXugwd)/ugwp_limb_tau.nc, $(DATA)/ugwp_limb_tau.nc] # CO2 climatology - [$(FIXgfs)/am/co2monthlycyc.txt, $(DATA)/co2monthlycyc.txt] diff --git a/parm/ufs/fix/gfs/land.fixed_files.yaml b/parm/ufs/fix/gfs/land.fixed_files.yaml index 8e4d221dbc..bb2d060963 100644 --- a/parm/ufs/fix/gfs/land.fixed_files.yaml +++ b/parm/ufs/fix/gfs/land.fixed_files.yaml @@ -1,58 +1,58 @@ copy: - # Files from FIXgfs/orog/C??/sfc - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).facsf.tile1.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).facsf.tile2.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).facsf.tile3.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).facsf.tile4.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).facsf.tile5.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).facsf.tile6.nc, $(DATA)/] + # Files from FIXorog/C??/sfc + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).facsf.tile1.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).facsf.tile2.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).facsf.tile3.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).facsf.tile4.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).facsf.tile5.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).facsf.tile6.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).maximum_snow_albedo.tile1.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).maximum_snow_albedo.tile2.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).maximum_snow_albedo.tile3.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).maximum_snow_albedo.tile4.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).maximum_snow_albedo.tile5.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).maximum_snow_albedo.tile6.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).maximum_snow_albedo.tile1.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).maximum_snow_albedo.tile2.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).maximum_snow_albedo.tile3.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).maximum_snow_albedo.tile4.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).maximum_snow_albedo.tile5.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).maximum_snow_albedo.tile6.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).slope_type.tile1.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).slope_type.tile2.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).slope_type.tile3.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).slope_type.tile4.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).slope_type.tile5.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).slope_type.tile6.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).slope_type.tile1.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).slope_type.tile2.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).slope_type.tile3.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).slope_type.tile4.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).slope_type.tile5.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).slope_type.tile6.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).snowfree_albedo.tile1.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).snowfree_albedo.tile2.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).snowfree_albedo.tile3.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).snowfree_albedo.tile4.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).snowfree_albedo.tile5.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).snowfree_albedo.tile6.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).snowfree_albedo.tile1.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).snowfree_albedo.tile2.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).snowfree_albedo.tile3.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).snowfree_albedo.tile4.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).snowfree_albedo.tile5.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).snowfree_albedo.tile6.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).soil_type.tile1.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).soil_type.tile2.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).soil_type.tile3.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).soil_type.tile4.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).soil_type.tile5.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).soil_type.tile6.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).soil_type.tile1.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).soil_type.tile2.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).soil_type.tile3.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).soil_type.tile4.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).soil_type.tile5.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).soil_type.tile6.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).substrate_temperature.tile1.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).substrate_temperature.tile2.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).substrate_temperature.tile3.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).substrate_temperature.tile4.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).substrate_temperature.tile5.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).substrate_temperature.tile6.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).substrate_temperature.tile1.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).substrate_temperature.tile2.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).substrate_temperature.tile3.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).substrate_temperature.tile4.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).substrate_temperature.tile5.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).substrate_temperature.tile6.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_greenness.tile1.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_greenness.tile2.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_greenness.tile3.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_greenness.tile4.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_greenness.tile5.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_greenness.tile6.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_greenness.tile1.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_greenness.tile2.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_greenness.tile3.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_greenness.tile4.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_greenness.tile5.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_greenness.tile6.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_type.tile1.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_type.tile2.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_type.tile3.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_type.tile4.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_type.tile5.nc, $(DATA)/] - - [$(FIXgfs)/orog/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_type.tile6.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_type.tile1.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_type.tile2.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_type.tile3.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_type.tile4.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_type.tile5.nc, $(DATA)/] + - [$(FIXorog)/$(CASE)/sfc/$(CASE).mx$(OCNRES).vegetation_type.tile6.nc, $(DATA)/] diff --git a/parm/ufs/fix/gfs/ocean.fixed_files.yaml b/parm/ufs/fix/gfs/ocean.fixed_files.yaml index 4ef19bab0d..1ca8ce7a68 100644 --- a/parm/ufs/fix/gfs/ocean.fixed_files.yaml +++ b/parm/ufs/fix/gfs/ocean.fixed_files.yaml @@ -1,9 +1,9 @@ copy: # Orography data tile files - - [$(FIXgfs)/orog/$(CASE)/$(CASE).mx$(OCNRES)_oro_data.tile1.nc, $(DATA)/INPUT/oro_data.tile1.nc] - - [$(FIXgfs)/orog/$(CASE)/$(CASE).mx$(OCNRES)_oro_data.tile2.nc, $(DATA)/INPUT/oro_data.tile2.nc] - - [$(FIXgfs)/orog/$(CASE)/$(CASE).mx$(OCNRES)_oro_data.tile3.nc, $(DATA)/INPUT/oro_data.tile3.nc] - - [$(FIXgfs)/orog/$(CASE)/$(CASE).mx$(OCNRES)_oro_data.tile4.nc, $(DATA)/INPUT/oro_data.tile4.nc] - - [$(FIXgfs)/orog/$(CASE)/$(CASE).mx$(OCNRES)_oro_data.tile5.nc, $(DATA)/INPUT/oro_data.tile5.nc] - - [$(FIXgfs)/orog/$(CASE)/$(CASE).mx$(OCNRES)_oro_data.tile6.nc, $(DATA)/INPUT/oro_data.tile6.nc] + - [$(FIXorog)/$(CASE)/$(CASE).mx$(OCNRES)_oro_data.tile1.nc, $(DATA)/INPUT/oro_data.tile1.nc] + - [$(FIXorog)/$(CASE)/$(CASE).mx$(OCNRES)_oro_data.tile2.nc, $(DATA)/INPUT/oro_data.tile2.nc] + - [$(FIXorog)/$(CASE)/$(CASE).mx$(OCNRES)_oro_data.tile3.nc, $(DATA)/INPUT/oro_data.tile3.nc] + - [$(FIXorog)/$(CASE)/$(CASE).mx$(OCNRES)_oro_data.tile4.nc, $(DATA)/INPUT/oro_data.tile4.nc] + - [$(FIXorog)/$(CASE)/$(CASE).mx$(OCNRES)_oro_data.tile5.nc, $(DATA)/INPUT/oro_data.tile5.nc] + - [$(FIXorog)/$(CASE)/$(CASE).mx$(OCNRES)_oro_data.tile6.nc, $(DATA)/INPUT/oro_data.tile6.nc] diff --git a/scripts/exgdas_enkf_sfc.sh b/scripts/exgdas_enkf_sfc.sh index cd6a40a0fa..2720dd5d5f 100755 --- a/scripts/exgdas_enkf_sfc.sh +++ b/scripts/exgdas_enkf_sfc.sh @@ -162,8 +162,8 @@ if [ $DOIAU = "YES" ]; then "${DATA}/fnbgsi.${cmem}" ${NLN} "${COM_ATMOS_RESTART_MEM}/${bPDY}.${bcyc}0000.sfcanl_data.tile${n}.nc" \ "${DATA}/fnbgso.${cmem}" - ${NLN} "${FIXgfs}/orog/${CASE}/${CASE}_grid.tile${n}.nc" "${DATA}/fngrid.${cmem}" - ${NLN} "${FIXgfs}/orog/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile${n}.nc" "${DATA}/fnorog.${cmem}" + ${NLN} "${FIXorog}/${CASE}/${CASE}_grid.tile${n}.nc" "${DATA}/fngrid.${cmem}" + ${NLN} "${FIXorog}/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile${n}.nc" "${DATA}/fnorog.${cmem}" if [[ ${GSI_SOILANAL} = "YES" ]]; then FHR=6 @@ -207,8 +207,8 @@ if [ $DOSFCANL_ENKF = "YES" ]; then "${DATA}/fnbgsi.${cmem}" ${NLN} "${COM_ATMOS_RESTART_MEM}/${PDY}.${cyc}0000.sfcanl_data.tile${n}.nc" \ "${DATA}/fnbgso.${cmem}" - ${NLN} "${FIXgfs}/orog/${CASE}/${CASE}_grid.tile${n}.nc" "${DATA}/fngrid.${cmem}" - ${NLN} "${FIXgfs}/orog/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile${n}.nc" "${DATA}/fnorog.${cmem}" + ${NLN} "${FIXorog}/${CASE}/${CASE}_grid.tile${n}.nc" "${DATA}/fngrid.${cmem}" + ${NLN} "${FIXorog}/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile${n}.nc" "${DATA}/fnorog.${cmem}" done diff --git a/scripts/exglobal_forecast.sh b/scripts/exglobal_forecast.sh index 590c3aba17..e2bccd43db 100755 --- a/scripts/exglobal_forecast.sh +++ b/scripts/exglobal_forecast.sh @@ -38,9 +38,9 @@ ## Restart files: ## ## Fix files: -## 1. computing grid, ${FIXgfs}/orog/$CASE/${CASE}_grid.tile${n}.nc -## 2. orography data, ${FIXgfs}/orog/$CASE/${CASE}.mx${OCNRES}_oro_data.tile${n}.nc -## 3. mosaic data, ${FIXgfs}/orog/$CASE/${CASE}_mosaic.nc +## 1. computing grid, ${FIXorog}/$CASE/${CASE}_grid.tile${n}.nc +## 2. orography data, ${FIXorog}/$CASE/${CASE}.mx${OCNRES}_oro_data.tile${n}.nc +## 3. mosaic data, ${FIXorog}/$CASE/${CASE}_mosaic.nc ## 4. Global O3 data, ${FIXgfs}/am/${O3FORC} ## 5. Global H2O data, ${FIXgfs}/am/${H2OFORC} ## 6. Global solar constant data, ${FIXgfs}/am/global_solarconstant_noaa_an.txt diff --git a/sorc/link_workflow.sh b/sorc/link_workflow.sh index 593a4694c1..1f0de0745c 100755 --- a/sorc/link_workflow.sh +++ b/sorc/link_workflow.sh @@ -84,10 +84,6 @@ esac # Source fix version file source "${HOMEgfs}/versions/fix.ver" -# global-nest uses different versions of orog and ugwd -if [[ "${LINK_NEST:-OFF}" == "ON" ]] ; then - source "${HOMEgfs}/versions/fix.nest.ver" -fi # Link python pacakges in ush/python # TODO: This will be unnecessary when these are part of the virtualenv @@ -134,7 +130,20 @@ do fix_ver="${dir}_ver" ${LINK_OR_COPY} "${FIX_DIR}/${dir}/${!fix_ver}" "${dir}" done - +# global-nest uses different versions of orog and ugwd +if [[ "${LINK_NEST:-OFF}" == "ON" ]] ; then + for dir in orog \ + ugwd + do + nestdir=${dir}_nest + if [[ -d "${nestdir}" ]]; then + [[ "${RUN_ENVIR}" == "nco" ]] && chmod -R 755 "${nestdir}" + rm -rf "${nestdir}" + fi + fix_ver="${dir}_nest_ver" + ${LINK_OR_COPY} "${FIX_DIR}/${dir}/${!fix_ver}" "${nestdir}" + done +fi #--------------------------------------- #--add files from external repositories diff --git a/sorc/ufs_utils.fd b/sorc/ufs_utils.fd index f42fae239d..2794d413d0 160000 --- a/sorc/ufs_utils.fd +++ b/sorc/ufs_utils.fd @@ -1 +1 @@ -Subproject commit f42fae239d0824f7b9a83c9afdc3d980894c7df8 +Subproject commit 2794d413d083b43d9ba37a15375d5c61b610d29e diff --git a/ush/forecast_predet.sh b/ush/forecast_predet.sh index 2f19b2c28e..9c0d90b1dc 100755 --- a/ush/forecast_predet.sh +++ b/ush/forecast_predet.sh @@ -346,18 +346,18 @@ FV3_predet(){ FNSNOC=${FNSNOC:-"${FIXgfs}/am/global_snoclim.1.875.grb"} FNZORC=${FNZORC:-"igbp"} FNAISC=${FNAISC:-"${FIXgfs}/am/IMS-NIC.blended.ice.monthly.clim.grb"} - FNALBC2=${FNALBC2:-"${FIXgfs}/orog/${CASE}/sfc/${CASE}.mx${OCNRES}.facsf.tileX.nc"} - FNTG3C=${FNTG3C:-"${FIXgfs}/orog/${CASE}/sfc/${CASE}.mx${OCNRES}.substrate_temperature.tileX.nc"} - FNVEGC=${FNVEGC:-"${FIXgfs}/orog/${CASE}/sfc/${CASE}.mx${OCNRES}.vegetation_greenness.tileX.nc"} + FNALBC2=${FNALBC2:-"${FIXorog}/${CASE}/sfc/${CASE}.mx${OCNRES}.facsf.tileX.nc"} + FNTG3C=${FNTG3C:-"${FIXorog}/${CASE}/sfc/${CASE}.mx${OCNRES}.substrate_temperature.tileX.nc"} + FNVEGC=${FNVEGC:-"${FIXorog}/${CASE}/sfc/${CASE}.mx${OCNRES}.vegetation_greenness.tileX.nc"} FNMSKH=${FNMSKH:-"${FIXgfs}/am/global_slmask.t1534.3072.1536.grb"} - FNVMNC=${FNVMNC:-"${FIXgfs}/orog/${CASE}/sfc/${CASE}.mx${OCNRES}.vegetation_greenness.tileX.nc"} - FNVMXC=${FNVMXC:-"${FIXgfs}/orog/${CASE}/sfc/${CASE}.mx${OCNRES}.vegetation_greenness.tileX.nc"} - FNSLPC=${FNSLPC:-"${FIXgfs}/orog/${CASE}/sfc/${CASE}.mx${OCNRES}.slope_type.tileX.nc"} - FNALBC=${FNALBC:-"${FIXgfs}/orog/${CASE}/sfc/${CASE}.mx${OCNRES}.snowfree_albedo.tileX.nc"} - FNVETC=${FNVETC:-"${FIXgfs}/orog/${CASE}/sfc/${CASE}.mx${OCNRES}.vegetation_type.tileX.nc"} - FNSOTC=${FNSOTC:-"${FIXgfs}/orog/${CASE}/sfc/${CASE}.mx${OCNRES}.soil_type.tileX.nc"} - FNSOCC=${FNSOCC:-"${FIXgfs}/orog/${CASE}/sfc/${CASE}.mx${OCNRES}.soil_color.tileX.nc"} - FNABSC=${FNABSC:-"${FIXgfs}/orog/${CASE}/sfc/${CASE}.mx${OCNRES}.maximum_snow_albedo.tileX.nc"} + FNVMNC=${FNVMNC:-"${FIXorog}/${CASE}/sfc/${CASE}.mx${OCNRES}.vegetation_greenness.tileX.nc"} + FNVMXC=${FNVMXC:-"${FIXorog}/${CASE}/sfc/${CASE}.mx${OCNRES}.vegetation_greenness.tileX.nc"} + FNSLPC=${FNSLPC:-"${FIXorog}/${CASE}/sfc/${CASE}.mx${OCNRES}.slope_type.tileX.nc"} + FNALBC=${FNALBC:-"${FIXorog}/${CASE}/sfc/${CASE}.mx${OCNRES}.snowfree_albedo.tileX.nc"} + FNVETC=${FNVETC:-"${FIXorog}/${CASE}/sfc/${CASE}.mx${OCNRES}.vegetation_type.tileX.nc"} + FNSOTC=${FNSOTC:-"${FIXorog}/${CASE}/sfc/${CASE}.mx${OCNRES}.soil_type.tileX.nc"} + FNSOCC=${FNSOCC:-"${FIXorog}/${CASE}/sfc/${CASE}.mx${OCNRES}.soil_color.tileX.nc"} + FNABSC=${FNABSC:-"${FIXorog}/${CASE}/sfc/${CASE}.mx${OCNRES}.maximum_snow_albedo.tileX.nc"} FNSMCC=${FNSMCC:-"${FIXgfs}/am/global_soilmgldas.statsgo.t${JCAP}.${LONB}.${LATB}.grb"} # If the appropriate resolution fix file is not present, use the highest resolution available (T1534) @@ -365,21 +365,21 @@ FV3_predet(){ # Grid and orography data if [[ "${cplflx}" == ".false." ]] ; then - ${NCP} "${FIXgfs}/orog/${CASE}/${CASE}_mosaic.nc" "${DATA}/INPUT/grid_spec.nc" + ${NCP} "${FIXorog}/${CASE}/${CASE}_mosaic.nc" "${DATA}/INPUT/grid_spec.nc" else - ${NCP} "${FIXgfs}/orog/${CASE}/${CASE}_mosaic.nc" "${DATA}/INPUT/${CASE}_mosaic.nc" + ${NCP} "${FIXorog}/${CASE}/${CASE}_mosaic.nc" "${DATA}/INPUT/${CASE}_mosaic.nc" fi # Files for GWD - ${NCP} "${FIXgfs}/ugwd/ugwp_limb_tau.nc" "${DATA}/ugwp_limb_tau.nc" + ${NCP} "${FIXugwd}/ugwp_limb_tau.nc" "${DATA}/ugwp_limb_tau.nc" # Files for orography, GWD tiles local tt for (( tt = 1; tt <= ntiles; tt++ )); do - ${NCP} "${FIXgfs}/orog/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile${tt}.nc" "${DATA}/INPUT/oro_data.tile${tt}.nc" - ${NCP} "${FIXgfs}/orog/${CASE}/${CASE}_grid.tile${tt}.nc" "${DATA}/INPUT/${CASE}_grid.tile${tt}.nc" - ${NCP} "${FIXgfs}/ugwd/${CASE}/${CASE}_oro_data_ls.tile${tt}.nc" "${DATA}/INPUT/oro_data_ls.tile${tt}.nc" - ${NCP} "${FIXgfs}/ugwd/${CASE}/${CASE}_oro_data_ss.tile${tt}.nc" "${DATA}/INPUT/oro_data_ss.tile${tt}.nc" + ${NCP} "${FIXorog}/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile${tt}.nc" "${DATA}/INPUT/oro_data.tile${tt}.nc" + ${NCP} "${FIXorog}/${CASE}/${CASE}_grid.tile${tt}.nc" "${DATA}/INPUT/${CASE}_grid.tile${tt}.nc" + ${NCP} "${FIXugwd}/${CASE}/${CASE}_oro_data_ls.tile${tt}.nc" "${DATA}/INPUT/oro_data_ls.tile${tt}.nc" + ${NCP} "${FIXugwd}/${CASE}/${CASE}_oro_data_ss.tile${tt}.nc" "${DATA}/INPUT/oro_data_ss.tile${tt}.nc" done if [[ "${DO_NEST:-NO}" == "YES" ]] ; then ${NLN} "${DATA}/INPUT/oro_data.tile7.nc" "${DATA}/INPUT/oro_data.nest02.tile7.nc" diff --git a/ush/gaussian_sfcanl.sh b/ush/gaussian_sfcanl.sh index 794dbb7f7f..4ac762824b 100755 --- a/ush/gaussian_sfcanl.sh +++ b/ush/gaussian_sfcanl.sh @@ -73,7 +73,7 @@ # # programs : $GAUSFCANLEXE # -# fixed data : ${FIXgfs}/orog/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile*.nc +# fixed data : ${FIXorog}/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile*.nc # ${FIXWGTS} # ${FIXgfs}/am/global_hyblev.l65.txt # @@ -111,7 +111,7 @@ LATB_SFC=${LATB_SFC:-$LATB_CASE} DONST=${DONST:-"NO"} LEVS=${LEVS:-64} LEVSP1=$(($LEVS+1)) -FIXWGTS=${FIXWGTS:-${FIXgfs}/orog/${CASE}/fv3_SCRIP_${CASE}_GRIDSPEC_lon${LONB_SFC}_lat${LATB_SFC}.gaussian.neareststod.nc} +FIXWGTS=${FIXWGTS:-${FIXorog}/${CASE}/fv3_SCRIP_${CASE}_GRIDSPEC_lon${LONB_SFC}_lat${LATB_SFC}.gaussian.neareststod.nc} DATA=${DATA:-$(pwd)} # Filenames. @@ -161,12 +161,12 @@ ${NLN} "${COM_ATMOS_RESTART}/${PDY}.${cyc}0000.sfcanl_data.tile5.nc" "./anal.til ${NLN} "${COM_ATMOS_RESTART}/${PDY}.${cyc}0000.sfcanl_data.tile6.nc" "./anal.tile6.nc" # input orography tiles -${NLN} "${FIXgfs}/orog/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile1.nc" "./orog.tile1.nc" -${NLN} "${FIXgfs}/orog/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile2.nc" "./orog.tile2.nc" -${NLN} "${FIXgfs}/orog/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile3.nc" "./orog.tile3.nc" -${NLN} "${FIXgfs}/orog/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile4.nc" "./orog.tile4.nc" -${NLN} "${FIXgfs}/orog/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile5.nc" "./orog.tile5.nc" -${NLN} "${FIXgfs}/orog/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile6.nc" "./orog.tile6.nc" +${NLN} "${FIXorog}/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile1.nc" "./orog.tile1.nc" +${NLN} "${FIXorog}/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile2.nc" "./orog.tile2.nc" +${NLN} "${FIXorog}/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile3.nc" "./orog.tile3.nc" +${NLN} "${FIXorog}/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile4.nc" "./orog.tile4.nc" +${NLN} "${FIXorog}/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile5.nc" "./orog.tile5.nc" +${NLN} "${FIXorog}/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile6.nc" "./orog.tile6.nc" ${NLN} "${SIGLEVEL}" "./vcoord.txt" diff --git a/versions/fix.nest.ver b/versions/fix.nest.ver deleted file mode 100644 index d08ea32af1..0000000000 --- a/versions/fix.nest.ver +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -# Fix file subfolder versions -export orog_ver=global-nest.20240419 -export ugwd_ver=global-nest.20240419 diff --git a/versions/fix.ver b/versions/fix.ver index 6b5ec7b670..1d54572c0b 100644 --- a/versions/fix.ver +++ b/versions/fix.ver @@ -21,3 +21,5 @@ export sfc_climo_ver=20220805 export ugwd_ver=20231027 export verif_ver=20220805 export wave_ver=20240105 +export orog_nest_ver=global-nest.20240419 +export ugwd_nest_ver=global-nest.20240419 From 5b2a3d449a0835cec2663aabb06f1c47a3faf84e Mon Sep 17 00:00:00 2001 From: Walter Kolczynski - NOAA Date: Wed, 12 Jun 2024 13:31:55 -0400 Subject: [PATCH 29/45] Add COM template for JEDI obs (#2678) Adds a COM template to define a path to store obs processed for JEDI. This will allow UFSDA to stop writing to COM_OBS, which should be read-only as it belongs to obsproc in operations. No functional change yet. --- parm/config/gfs/config.com | 2 ++ 1 file changed, 2 insertions(+) diff --git a/parm/config/gfs/config.com b/parm/config/gfs/config.com index 004ca1affb..ec867e64ba 100644 --- a/parm/config/gfs/config.com +++ b/parm/config/gfs/config.com @@ -49,6 +49,8 @@ COM_BASE='${ROTDIR}/${RUN}.${YMD}/${HH}/${MEMDIR}' declare -rx COM_TOP_TMPL='${ROTDIR}/${RUN}.${YMD}/${HH}' declare -rx COM_CONF_TMPL=${COM_BASE}'/conf' +declare -rx COM_OBS_JEDI=${COM_BASE}'/obs_jedi' + declare -rx COM_ATMOS_INPUT_TMPL=${COM_BASE}'/model_data/atmos/input' declare -rx COM_ATMOS_RESTART_TMPL=${COM_BASE}'/model_data/atmos/restart' declare -rx COM_ATMOS_ANALYSIS_TMPL=${COM_BASE}'/analysis/atmos' From 6c19a0e3fc4400e1d39288be4ee4fc244b74f699 Mon Sep 17 00:00:00 2001 From: "Henry R. Winterbottom" <49202169+HenryWinterbottom-NOAA@users.noreply.github.com> Date: Wed, 12 Jun 2024 19:25:42 -0600 Subject: [PATCH 30/45] Replace `sleep` with `wait_for_file` (#2586) This PR addresses issue #2444. The following is accomplished: - All `sleep` statements are replaced with `wait_for_file` for the relevant scripts beneath `scripts` and `ush`; - Indentation and shell-norms are updated where applicable. Note: The WAFS scripts are not updated as per @aerorahul direction. Resolves #2444 --------- Co-authored-by: henrywinterbottom-wxdev Co-authored-by: Walter Kolczynski - NOAA --- env/HERA.env | 1 - scripts/exgfs_atmos_awips_20km_1p0deg.sh | 22 ++++----- scripts/exgfs_atmos_postsnd.sh | 24 ++++------ scripts/exgfs_wave_nawips.sh | 28 +++-------- scripts/exgfs_wave_post_gridded_sbs.sh | 26 +++++----- scripts/exgfs_wave_prdgen_gridded.sh | 32 ++++--------- ush/gfs_bufr.sh | 26 ++++------ ush/gfs_bufr_netcdf.sh | 24 +++------- ush/wave_tar.sh | 60 ++++++++++++------------ versions/run.hera.ver | 1 + 10 files changed, 89 insertions(+), 155 deletions(-) diff --git a/env/HERA.env b/env/HERA.env index ccaaea32e7..2157e90031 100755 --- a/env/HERA.env +++ b/env/HERA.env @@ -316,7 +316,6 @@ elif [[ "${step}" = "gempak" ]]; then export NTHREADS_GEMPAK=${nth_gempak:-1} [[ ${NTHREADS_GEMPAK} -gt ${nth_max} ]] && export NTHREADS_GEMPAK=${nth_max} - elif [[ "${step}" = "fit2obs" ]]; then nth_max=$((npe_node_max / npe_node_fit2obs)) diff --git a/scripts/exgfs_atmos_awips_20km_1p0deg.sh b/scripts/exgfs_atmos_awips_20km_1p0deg.sh index 490875b2c4..4959bbd8e8 100755 --- a/scripts/exgfs_atmos_awips_20km_1p0deg.sh +++ b/scripts/exgfs_atmos_awips_20km_1p0deg.sh @@ -43,20 +43,14 @@ source "${USHgfs}/product_functions.sh" ############################################### # Wait for the availability of the pgrb file ############################################### -icnt=1 -while (( icnt < 1000 )); do - if [[ -s "${COM_ATMOS_GRIB_0p25}/${RUN}.${cycle}.pgrb2b.0p25.f${fcsthrs}.idx" ]]; then - break - fi - - sleep 10 - icnt=$((icnt + 1)) - if (( icnt >= 180 )); then - msg="FATAL ERROR: No GFS pgrb2 file after 30 min of waiting" - err_exit "${msg}" - exit 5 - fi -done +sleep_interval=10 +max_tries=180 +idxfile="${COM_ATMOS_GRIB_0p25}/${RUN}.${cycle}.pgrb2b.0p25.f${fcsthrs}.idx" +if ! wait_for_file "${idxfile}" "${sleep_interval}" "${max_tries}"; then + msg="FATAL ERROR: No GFS pgrb2 file after waiting" + err_exit "${msg}" + exit 5 +fi ######################################## diff --git a/scripts/exgfs_atmos_postsnd.sh b/scripts/exgfs_atmos_postsnd.sh index 23c41157fe..caf5443a50 100755 --- a/scripts/exgfs_atmos_postsnd.sh +++ b/scripts/exgfs_atmos_postsnd.sh @@ -50,6 +50,8 @@ declare -x LEVS ### Loop for the hour and wait for the sigma and surface flux file: export FSTART=$STARTHOUR +sleep_interval=10 +max_tries=360 # while [ $FSTART -lt $ENDHOUR ] do @@ -69,28 +71,18 @@ export FINT=$NINT1 export MAKEBUFR=YES fi - ic=0 - while [ $ic -lt 1000 ]; do - if [[ ! -f "${COM_ATMOS_HISTORY}/${RUN}.${cycle}.atm.logf${FEND}.${logfm}" ]]; then - sleep 10 - ic=$(expr $ic + 1) - else - break - fi - - if [ $ic -ge 360 ] - then - err_exit "COULD NOT LOCATE logf$FEND file AFTER 1 HOUR" - fi - done + filename="${COM_ATMOS_HISTORY}/${RUN}.${cycle}.atm.logf${FEND}.${logfm}" + if ! wait_for_file "${filename}" "${sleep_interval}" "${max_tries}"; then + err_exit "FATAL ERROR: logf${FEND} not found after waiting $((sleep_interval * ( max_tries - 1) )) secs" + fi ## 1-hourly output before $NEND1, 3-hourly output after - if [ $FEND -gt $NEND1 ]; then + if [[ $((10#$FEND)) -gt $((10#$NEND1)) ]]; then export FINT=$NINT3 fi ${USHgfs}/gfs_bufr.sh - export FSTART=$FEND + export FSTART="${FEND}" done ############################################################## diff --git a/scripts/exgfs_wave_nawips.sh b/scripts/exgfs_wave_nawips.sh index 69c4e54ebb..949425cbc1 100755 --- a/scripts/exgfs_wave_nawips.sh +++ b/scripts/exgfs_wave_nawips.sh @@ -44,6 +44,7 @@ pdsext=no g2tbls=g2varswmo2.tbl NAGRIB=nagrib2 +sleep_interval=20 maxtries=15 fhcnt=${fstart} while [ ${fhcnt} -le ${FHMAX_WAV} ]; do @@ -72,28 +73,11 @@ while [ ${fhcnt} -le ${FHMAX_WAV} ]; do esac GRIBIN="${COM_WAVE_GRID}/${RUNwave}.${cycle}.${grdIDin}.f${fhr}.grib2" GRIBIN_chk=${GRIBIN}.idx - - icnt=1 - while [ ${icnt} -lt 1000 ]; do - if [ -r ${GRIBIN_chk} ] ; then - break - else - let "icnt=icnt+1" - sleep 20 - fi - if [ ${icnt} -ge ${maxtries} ]; then - msg="ABORTING after 5 minutes of waiting for ${GRIBIN}." - echo ' ' - echo '**************************** ' - echo '*** ERROR : NO GRIB FILE *** ' - echo '**************************** ' - echo ' ' - echo ${msg} - set_trace - echo "${RUNwave} ${grdID} ${fhr} prdgen ${date} ${cycle} : GRIB file missing." >> ${wavelog} - err=1;export err;${errchk} || exit ${err} - fi - done + if ! wait_for_file "${GRIBIN_chk}" "${sleep_interval}" "${maxtries}"; then + echo "FATAL ERROR: ${GRIBIN_chk} not found after waiting $((sleep_interval * ( max_tries - 1))) secs" + echo "${RUNwave} ${grdID} ${fhr} prdgen ${date} ${cycle} : GRIB file missing." >> "${wavelog}" + err=1;export err;"${errchk}" || exit "${err}" + fi #if [ "$grdIDin" = "global.0p25" && "$grid" = "glo_30m" ]; then if [ "${grdIDin}" = "global.0p25" ]; then diff --git a/scripts/exgfs_wave_post_gridded_sbs.sh b/scripts/exgfs_wave_post_gridded_sbs.sh index cee6d40b49..02aa8c456d 100755 --- a/scripts/exgfs_wave_post_gridded_sbs.sh +++ b/scripts/exgfs_wave_post_gridded_sbs.sh @@ -231,6 +231,7 @@ source "${USHgfs}/preamble.sh" fhr=$FHMIN_WAV fi fhrg=$fhr + sleep_interval=10 iwaitmax=120 # Maximum loop cycles for waiting until wave component output file is ready (fails after max) while [ $fhr -le $FHMAX_WAV ]; do @@ -253,26 +254,21 @@ source "${USHgfs}/preamble.sh" export GRDIDATA=${DATA}/output_$YMDHMS # Gridded data (main part, need to be run side-by-side with forecast - + if [ $fhr = $fhrg ] then - iwait=0 - for wavGRD in ${waveGRD} ; do - gfile=${COM_WAVE_HISTORY}/${WAV_MOD_TAG}.out_grd.${wavGRD}.${YMD}.${HMS} - while [ ! -s ${gfile} ]; do sleep 10; let iwait=iwait+1; done - if [ $iwait -eq $iwaitmax ]; then - echo '*************************************************** ' - echo " FATAL ERROR : NO RAW FIELD OUTPUT FILE out_grd.$grdID " - echo '*************************************************** ' - echo ' ' - set_trace + + for wavGRD in ${waveGRD}; do + gfile="${COM_WAVE_HISTORY}/${WAV_MOD_TAG}.out_grd.${wavGRD}.${YMD}.${HMS}" + if ! wait_for_file "${gfile}" "${sleep_interval}" "${iwaitmax}"; then + echo " FATAL ERROR : NO RAW FIELD OUTPUT FILE out_grd.${grdID}" echo "${WAV_MOD_TAG} post ${grdID} ${PDY} ${cycle} : field output missing." - err=3; export err;${errchk} - exit $err + err=3; export err; "${errchk}" + exit "${err}" fi - ${NLN} ${gfile} ./out_grd.${wavGRD} + ${NLN} "${gfile}" "./out_grd.${wavGRD}" done - + if [ "$DOGRI_WAV" = 'YES' ] then nigrd=1 diff --git a/scripts/exgfs_wave_prdgen_gridded.sh b/scripts/exgfs_wave_prdgen_gridded.sh index c51ce60acc..c896423ac1 100755 --- a/scripts/exgfs_wave_prdgen_gridded.sh +++ b/scripts/exgfs_wave_prdgen_gridded.sh @@ -96,30 +96,14 @@ grids=${grids:-ak_10m at_10m ep_10m wc_10m glo_30m} # GRIBIN="${COM_WAVE_GRID}/${RUNwave}.${cycle}.${grdID}.f${fhr}.grib2" - GRIBIN_chk=$GRIBIN.idx - - icnt=1 - while [ $icnt -lt 1000 ]; do - if [ -r $GRIBIN_chk ] ; then - break - else - echo "Waiting for input file: $GRIBIN" - let "icnt=icnt+1" - sleep 5 - fi - if [ $icnt -ge $maxtries ]; then - msg="ABNORMAL EXIT: NO GRIB FILE FOR GRID $GRIBIN" - echo ' ' - echo '**************************** ' - echo '*** ERROR : NO GRIB FILE *** ' - echo '**************************** ' - echo ' ' - echo $msg - set_trace - echo "$RUNwave $grdID ${fhr} prdgen $date $cycle : GRIB file missing." >> $wavelog - err=1;export err;${errchk} || exit ${err} - fi - done + GRIBIN_chk="${GRIBIN}.idx" + sleep_interval=5 + max_tries=1000 + if ! wait_for_file "${GRIBIN_chk}" "${sleep_interval}" "${max_tries}"; then + echo "FATAL ERROR: ${GRIBIN_chk} not found after waiting $((sleep_interval * ( max_tries - 1))) secs" + echo "$RUNwave $grdID ${fhr} prdgen $date $cycle : GRIB file missing." >> $wavelog + err=1;export err;${errchk} || exit ${err} + fi GRIBOUT=$RUNwave.$cycle.$grdID.f${fhr}.clipped.grib2 diff --git a/ush/gfs_bufr.sh b/ush/gfs_bufr.sh index 287365ba88..8a7d9b1091 100755 --- a/ush/gfs_bufr.sh +++ b/ush/gfs_bufr.sh @@ -51,26 +51,20 @@ cat << EOF > gfsparm / EOF +sleep_interval=10 +max_tries=1000 for (( hr = 10#${FSTART}; hr <= 10#${FEND}; hr = hr + 10#${FINT} )); do hh2=$(printf %02i "${hr}") hh3=$(printf %03i "${hr}") #--------------------------------------------------------- # Make sure all files are available: - ic=0 - while (( ic < 1000 )); do - if [[ ! -f "${COM_ATMOS_HISTORY}/${RUN}.${cycle}.atm.logf${hh3}.${logfm}" ]]; then - sleep 10 - ic=$((ic + 1)) - else - break - fi - - if (( ic >= 360 )); then - echo "FATAL: COULD NOT LOCATE logf${hh3} file AFTER 1 HOUR" - exit 2 - fi - done + filename="${COM_ATMOS_HISTORY}/${RUN}.${cycle}.atm.logf${hh3}.${logfm}" + if ! wait_for_file "${filename}" "${sleep_interval}" "${max_tries}"; then + echo "FATAL ERROR: COULD NOT LOCATE logf${hh3} file" + exit 2 + fi + #------------------------------------------------------------------ ${NLN} "${COM_ATMOS_HISTORY}/${RUN}.${cycle}.atmf${hh3}.${atmfm}" "sigf${hh2}" ${NLN} "${COM_ATMOS_HISTORY}/${RUN}.${cycle}.sfcf${hh3}.${atmfm}" "flxf${hh2}" @@ -96,11 +90,11 @@ esac ${APRUN_POSTSND} "${EXECgfs}/${pgm}" < gfsparm > "out_gfs_bufr_${FEND}" export err=$? -if [ $err -ne 0 ]; then +if [[ "${err}" -ne 0 ]]; then echo "GFS postsnd job error, Please check files " echo "${COM_ATMOS_HISTORY}/${RUN}.${cycle}.atmf${hh2}.${atmfm}" echo "${COM_ATMOS_HISTORY}/${RUN}.${cycle}.sfcf${hh2}.${atmfm}" err_chk fi -exit ${err} +exit "${err}" diff --git a/ush/gfs_bufr_netcdf.sh b/ush/gfs_bufr_netcdf.sh index f10ba40730..f03ff3b9af 100755 --- a/ush/gfs_bufr_netcdf.sh +++ b/ush/gfs_bufr_netcdf.sh @@ -66,6 +66,9 @@ hh=$FSTART hh1=$(echo "${hh#"${hh%??}"}") hh=$hh1 fi + +sleep_interval=10 +max_tries=360 while test $hh -le $FEND do if test $hh -lt 100 @@ -75,24 +78,11 @@ do hh2=$hh fi -#--------------------------------------------------------- -# Make sure all files are available: - ic=0 - while [ $ic -lt 1000 ] - do - if [ ! -f $COMIN/${RUN}.${cycle}.logf${hh2}.txt ] - then - sleep 10 - ic=$(expr $ic + 1) - else - break - fi + filename="${COMIN}/${RUN}.${cycle}.logf${hh2}.txt" + if ! wait_for_file "${filename}" "${sleep_interval}" "${max_tries}" ; then + err_exit "FATAL ERROR COULD NOT LOCATE logf${hh2} file" + fi - if [ $ic -ge 360 ] - then - err_exit "COULD NOT LOCATE logf${hh2} file AFTER 1 HOUR" - fi - done #------------------------------------------------------------------ ${NLN} $COMIN/${RUN}.${cycle}.atmf${hh2}.nc sigf${hh} ${NLN} $COMIN/${RUN}.${cycle}.${SFCF}f${hh2}.nc flxf${hh} diff --git a/ush/wave_tar.sh b/ush/wave_tar.sh index bb8836df2c..e01ef61f15 100755 --- a/ush/wave_tar.sh +++ b/ush/wave_tar.sh @@ -29,7 +29,7 @@ source "${USHgfs}/preamble.sh" # 0.a Basic modes of operation - cd $DATA + cd "${DATA}" echo "Making TAR FILE" alertName=$(echo $RUN|tr [a-z] [A-Z]) @@ -47,7 +47,7 @@ source "${USHgfs}/preamble.sh" # 0.b Check if type set - if [ "$#" -lt '3' ] + if [[ "$#" -lt '3' ]] then set +x echo ' ' @@ -64,9 +64,9 @@ source "${USHgfs}/preamble.sh" fi filext=$type - if [ "$type" = "ibp" ]; then filext='spec'; fi - if [ "$type" = "ibpbull" ]; then filext='bull'; fi - if [ "$type" = "ibpcbull" ]; then filext='cbull'; fi + if [[ "$type" = "ibp" ]]; then filext='spec'; fi + if [[ "$type" = "ibpbull" ]]; then filext='bull'; fi + if [[ "$type" = "ibpcbull" ]]; then filext='cbull'; fi rm -rf TAR_${filext}_$ID @@ -88,7 +88,7 @@ source "${USHgfs}/preamble.sh" exit 2 fi - cd ${STA_DIR}/${filext} + cd "${STA_DIR}/${filext}" # --------------------------------------------------------------------------- # # 2. Generate tar file (spectral files are compressed) @@ -98,21 +98,27 @@ source "${USHgfs}/preamble.sh" echo ' Making tar file ...' set_trace - count=0 countMAX=5 tardone='no' - - while [ "$count" -lt "$countMAX" ] && [ "$tardone" = 'no' ] + sleep_interval=10 + + while [[ "${tardone}" = "no" ]] do nf=$(ls | awk '/'$ID.*.$filext'/ {a++} END {print a}') nbm2=$(( $nb - 2 )) - if [ $nf -ge $nbm2 ] - then - tar -cf $ID.$cycle.${type}_tar ./$ID.*.$filext + if [[ "${nf}" -ge "${nbm2}" ]] + then + + tar -cf "${ID}.${cycle}.${type}_tar" ./${ID}.*.${filext} exit=$? + filename="${ID}.${cycle}.${type}_tar" + if ! wait_for_file "${filename}" "${sleep_interval}" "${countMAX}" ; then + echo "FATAL ERROR: File ${filename} not found after waiting $(( sleep_interval * (countMAX + 1) )) secs" + exit 3 + fi - if [ "$exit" != '0' ] + if [[ "${exit}" != '0' ]] then set +x echo ' ' @@ -124,21 +130,15 @@ source "${USHgfs}/preamble.sh" exit 3 fi - if [ -f "$ID.$cycle.${type}_tar" ] + if [[ -f "${ID}.${cycle}.${type}_tar" ]] then tardone='yes' fi - else - set +x - echo ' All files not found for tar. Sleeping 10 seconds and trying again ..' - set_trace - sleep 10 - count=$(expr $count + 1) fi done - if [ "$tardone" = 'no' ] + if [[ "${tardone}" = 'no' ]] then set +x echo ' ' @@ -150,15 +150,15 @@ source "${USHgfs}/preamble.sh" exit 3 fi - if [ "$type" = 'spec' ] + if [[ "${type}" = 'spec' ]] then - if [ -s $ID.$cycle.${type}_tar ] + if [[ -s "${ID}.${cycle}.${type}_tar" ]] then - file_name=$ID.$cycle.${type}_tar.gz - /usr/bin/gzip -c $ID.$cycle.${type}_tar > ${file_name} + file_name="${ID}.${cycle}.${type}_tar.gz" + /usr/bin/gzip -c "${ID}.${cycle}.${type}_tar" > "${file_name}" exit=$? - if [ "$exit" != '0' ] + if [[ "${exit}" != '0' ]] then set +x echo ' ' @@ -171,7 +171,7 @@ source "${USHgfs}/preamble.sh" fi fi else - file_name=$ID.$cycle.${type}_tar + file_name="${ID}.${cycle}.${type}_tar" fi # --------------------------------------------------------------------------- # @@ -186,7 +186,7 @@ source "${USHgfs}/preamble.sh" exit=$? - if [ "$exit" != '0' ] + if [[ "${exit}" != '0' ]] then set +x echo ' ' @@ -198,7 +198,7 @@ source "${USHgfs}/preamble.sh" exit 4 fi - if [ "$SENDDBN" = 'YES' ] + if [[ "${SENDDBN}" = 'YES' ]] then set +x echo ' ' @@ -212,7 +212,7 @@ source "${USHgfs}/preamble.sh" # --------------------------------------------------------------------------- # # 4. Final clean up -cd $DATA +cd "${DATA}" if [[ ${KEEPDATA:-NO} == "NO" ]]; then set -v diff --git a/versions/run.hera.ver b/versions/run.hera.ver index 6280e8e115..34f81bfe96 100644 --- a/versions/run.hera.ver +++ b/versions/run.hera.ver @@ -5,6 +5,7 @@ export spack_env=gsi-addon-dev-rocky8 export hpss_ver=hpss export ncl_ver=6.6.2 export R_ver=3.6.1 + export gempak_ver=7.17.0 export perl_ver=5.38.0 From 34155fb4767769600a1ff95f0a65e37081addc2a Mon Sep 17 00:00:00 2001 From: Neil Barton <103681022+NeilBarton-NOAA@users.noreply.github.com> Date: Thu, 13 Jun 2024 11:18:22 -0400 Subject: [PATCH 31/45] Add ability to use GEFS replay ICs (#2559) The PR allows the use of ICs from PSL's replay analysis. These replay ICs will be used for GEFS reforecasting and SFS. Two main changes are associated with these updates: (1) replay ICs being valid at 3Z, and (2) the use of warm starts. Resolves #1838 --------- Co-authored-by: Jessica Meixner Co-authored-by: Walter Kolczynski - NOAA Co-authored-by: Rahul Mahajan --- parm/config/gefs/config.base | 9 +- parm/config/gefs/config.efcs | 2 +- parm/config/gefs/config.fcst | 3 + parm/config/gefs/config.stage_ic | 9 ++ parm/config/gefs/config.ufs | 2 +- parm/config/gefs/yaml/defaults.yaml | 2 +- parm/config/gfs/config.base | 4 + scripts/exgfs_wave_post_pnt.sh | 5 +- scripts/exglobal_stage_ic.sh | 61 +++++---- ush/forecast_postdet.sh | 188 +++++++++++++++------------- ush/forecast_predet.sh | 47 ++++++- ush/parsing_namelists_WW3.sh | 2 +- ush/wave_outp_spec.sh | 5 +- workflow/rocoto/gefs_tasks.py | 55 ++++---- workflow/setup_expt.py | 2 + 15 files changed, 255 insertions(+), 141 deletions(-) diff --git a/parm/config/gefs/config.base b/parm/config/gefs/config.base index 840f33ad60..0bb29e31ae 100644 --- a/parm/config/gefs/config.base +++ b/parm/config/gefs/config.base @@ -294,12 +294,17 @@ export MEMDIR="mem${ENSMEM}" # initialize ocean ensemble members with perturbations # if true, only occurs for members greater than zero -export USE_OCN_PERTURB_FILES=@USE_OCN_PERTURB_FILES@ +export REPLAY_ICS=@REPLAY_ICS@ +if [[ "${REPLAY_ICS:-NO}" == "YES" ]]; then + export OFFSET_START_HOUR=$(( assim_freq / 2 )) +else + export OFFSET_START_HOUR=0 +fi export DOIAU="NO" # While we are not doing IAU, we may want to warm start w/ IAU in the future # Check if cycle is cold starting if [[ "${EXP_WARM_START}" = ".false." ]]; then - export IAU_FHROT=0 + export IAU_FHROT=${OFFSET_START_HOUR} else if [[ "${DOIAU}" = "YES" ]]; then export IAU_FHROT=3 diff --git a/parm/config/gefs/config.efcs b/parm/config/gefs/config.efcs index 915726b974..807ed66d48 100644 --- a/parm/config/gefs/config.efcs +++ b/parm/config/gefs/config.efcs @@ -67,7 +67,7 @@ export EPBL="0.8,0.4,0.2,0.08,0.04" export EPBL_TAU="2.16E4,2.592E5,2.592E6,7.776E6,3.1536E7" export EPBL_LSCALE="500.E3,1000.E3,2000.E3,2000.E3,2000.E3" -if [[ "${USE_OCN_PERTURB_FILES:-false}" == "true" ]]; then +if [[ "${REPLAY_ICS:-NO}" == "YES" ]]; then export ODA_INCUPD="True" export ODA_TEMPINC_VAR='t_pert' export ODA_SALTINC_VAR='s_pert' diff --git a/parm/config/gefs/config.fcst b/parm/config/gefs/config.fcst index 0009f4a868..103d6f091d 100644 --- a/parm/config/gefs/config.fcst +++ b/parm/config/gefs/config.fcst @@ -256,6 +256,9 @@ else export io_layout="1,1" fi +if (( OFFSET_START_HOUR != 0 )); then + export reforecast="YES" +fi # Remember config.efcs will over-ride these values for ensemble forecasts # if these variables are re-defined there. # Otherwise, the ensemble forecast will inherit from config.fcst diff --git a/parm/config/gefs/config.stage_ic b/parm/config/gefs/config.stage_ic index b332ee1826..f0b5dfa609 100644 --- a/parm/config/gefs/config.stage_ic +++ b/parm/config/gefs/config.stage_ic @@ -13,12 +13,21 @@ case "${CASE}" in export CPL_ICEIC="" export CPL_OCNIC="" export CPL_WAVIC="" + export CPL_MEDIC="" + ;; + "C96") + export CPL_ATMIC="" + export CPL_ICEIC="" + export CPL_OCNIC="" + export CPL_WAVIC="" + export CPL_MEDIC="" ;; "C48") export CPL_ATMIC="gefs_test" export CPL_ICEIC="gefs_test" export CPL_OCNIC="gefs_test" export CPL_WAVIC="gefs_test" + export CPL_MEDIC="gefs_test" ;; *) echo "FATAL ERROR Unrecognized resolution: ${CASE}" diff --git a/parm/config/gefs/config.ufs b/parm/config/gefs/config.ufs index 9c39bf06de..8beb0652f7 100644 --- a/parm/config/gefs/config.ufs +++ b/parm/config/gefs/config.ufs @@ -324,7 +324,7 @@ if [[ "${skip_mom6}" == "false" ]]; then MOM6_RESTART_SETTING='r' MOM6_RIVER_RUNOFF='False' eps_imesh="2.5e-1" - TOPOEDITS="ufs.topo_edits_011818.nc" + TOPOEDITS="topo_edits_011818.nc" if [[ "${DO_JEDIOCNVAR:-NO}" = "YES" ]]; then MOM6_DIAG_COORD_DEF_Z_FILE="oceanda_zgrid_75L.nc" MOM6_DIAG_MISVAL="0.0" diff --git a/parm/config/gefs/yaml/defaults.yaml b/parm/config/gefs/yaml/defaults.yaml index 5c763ad29e..2341c35d05 100644 --- a/parm/config/gefs/yaml/defaults.yaml +++ b/parm/config/gefs/yaml/defaults.yaml @@ -9,5 +9,5 @@ base: DO_AWIPS: "NO" KEEPDATA: "NO" FHMAX_GFS: 120 - USE_OCN_PERTURB_FILES: "false" + REPLAY_ICS: "NO" diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base index 7eedec8af7..6cc1b6d744 100644 --- a/parm/config/gfs/config.base +++ b/parm/config/gfs/config.base @@ -470,6 +470,10 @@ if [[ ${DO_JEDIATMVAR} = "YES" ]]; then export DO_VMINMON="NO" # GSI minimization monitoring fi +# If starting ICs that are not at cycle hour +export REPLAY_ICS="NO" +export OFFSET_START_HOUR=0 + # Number of regional collectives to create soundings for export NUM_SND_COLLECTIVES=${NUM_SND_COLLECTIVES:-9} diff --git a/scripts/exgfs_wave_post_pnt.sh b/scripts/exgfs_wave_post_pnt.sh index 6e456e2aec..56cb83be21 100755 --- a/scripts/exgfs_wave_post_pnt.sh +++ b/scripts/exgfs_wave_post_pnt.sh @@ -247,8 +247,9 @@ source "${USHgfs}/preamble.sh" -e "s/FORMAT/F/g" \ ww3_outp_spec.inp.tmpl > ww3_outp.inp - ${NLN} mod_def.$waveuoutpGRD mod_def.ww3 - HMS="${cyc}0000" + ${NLN} mod_def.${waveuoutpGRD} mod_def.ww3 + HH=$(date --utc -d "${PDY:0:8} ${cyc} + ${FHMIN_WAV} hours" +%H) + HMS="${HH}0000" if [[ -f "${COM_WAVE_HISTORY}/${WAV_MOD_TAG}.out_pnt.${waveuoutpGRD}.${PDY}.${HMS}" ]]; then ${NLN} "${COM_WAVE_HISTORY}/${WAV_MOD_TAG}.out_pnt.${waveuoutpGRD}.${PDY}.${HMS}" \ "./out_pnt.${waveuoutpGRD}" diff --git a/scripts/exglobal_stage_ic.sh b/scripts/exglobal_stage_ic.sh index d941fa10b4..8800292752 100755 --- a/scripts/exglobal_stage_ic.sh +++ b/scripts/exglobal_stage_ic.sh @@ -8,6 +8,9 @@ GDATE=$(date --utc -d "${PDY} ${cyc} - ${assim_freq} hours" +%Y%m%d%H) gPDY="${GDATE:0:8}" gcyc="${GDATE:8:2}" +RDATE=$(date --utc -d "${PDY} ${cyc} + ${OFFSET_START_HOUR} hours" +%Y%m%d%H) +DTG_PREFIX="${RDATE:0:8}.${RDATE:8:2}0000" + MEMDIR_ARRAY=() if [[ "${RUN:-}" = "gefs" ]]; then # Populate the member_dirs array based on the value of NMEM_ENS @@ -33,9 +36,10 @@ for MEMDIR in "${MEMDIR_ARRAY[@]}"; do # Stage the FV3 restarts to ROTDIR (warm start) RUN=${rCDUMP} YMD=${gPDY} HH=${gcyc} declare_from_tmpl COM_ATMOS_RESTART_PREV:COM_ATMOS_RESTART_TMPL [[ ! -d "${COM_ATMOS_RESTART_PREV}" ]] && mkdir -p "${COM_ATMOS_RESTART_PREV}" - for ftype in coupler.res fv_core.res.nc; do - src="${BASE_CPLIC}/${CPL_ATMIC:-}/${PDY}${cyc}/${MEMDIR}/atmos/${PDY}.${cyc}0000.${ftype}" - tgt="${COM_ATMOS_RESTART_PREV}/${PDY}.${cyc}0000.${ftype}" + prev_atmos_copy_list=(fv_core.res.nc coupler.res) + for ftype in "${prev_atmos_copy_list[@]}"; do + src="${BASE_CPLIC}/${CPL_ATMIC:-}/${PDY}${cyc}/${MEMDIR}/atmos/${DTG_PREFIX}.${ftype}" + tgt="${COM_ATMOS_RESTART_PREV}/${DTG_PREFIX}.${ftype}" ${NCP} "${src}" "${tgt}" rc=$? ((rc != 0)) && error_message "${src}" "${tgt}" "${rc}" @@ -43,11 +47,11 @@ for MEMDIR in "${MEMDIR_ARRAY[@]}"; do done for ftype in ca_data fv_core.res fv_srf_wnd.res fv_tracer.res phy_data sfc_data; do for ((tt = 1; tt <= ntiles; tt++)); do - src="${BASE_CPLIC}/${CPL_ATMIC:-}/${PDY}${cyc}/${MEMDIR}/atmos/${PDY}.${cyc}0000.${ftype}.tile${tt}.nc" + src="${BASE_CPLIC}/${CPL_ATMIC:-}/${PDY}${cyc}/${MEMDIR}/atmos/${DTG_PREFIX}.${ftype}.tile${tt}.nc" if (( tt > 6 )) ; then - tgt="${COM_ATMOS_RESTART_PREV}/${PDY}.${cyc}0000.${ftype}.nest0$((tt-5)).tile${tt}.nc" + tgt="${COM_ATMOS_RESTART_PREV}/${DTG_PREFIX}.${ftype}.nest0$((tt-5)).tile${tt}.nc" else - tgt="${COM_ATMOS_RESTART_PREV}/${PDY}.${cyc}0000.${ftype}.tile${tt}.nc" + tgt="${COM_ATMOS_RESTART_PREV}/${DTG_PREFIX}.${ftype}.tile${tt}.nc" fi ${NCP} "${src}" "${tgt}" rc=$? @@ -79,13 +83,26 @@ for MEMDIR in "${MEMDIR_ARRAY[@]}"; do fi done fi + + # Atmosphere Perturbation Files (usually used with replay ICS) + # Extra zero on MEMDIR ensure we have a number even if the string is empty + if (( 0${MEMDIR:3} > 0 )) && [[ "${REPLAY_ICS:-NO}" == "YES" ]]; then + YMD=${PDY} HH=${cyc} declare_from_tmpl COM_ATMOS_ANALYSIS:COM_ATMOS_ANALYSIS_TMPL + [[ ! -d "${COM_ATMOS_ANALYSIS}" ]] && mkdir -p "${COM_ATMOS_ANALYSIS}" + src="${BASE_CPLIC}/${CPL_ATMIC:-}/${PDY}${cyc}/${MEMDIR}/atmos/${DTG_PREFIX}.fv3_perturbation.nc" + tgt="${COM_ATMOS_ANALYSIS}/${RUN}.t00z.atminc.nc" + ${NCP} "${src}" "${tgt}" + rc=${?} + ((rc != 0)) && error_message "${src}" "${tgt}" "${rc}" + err=$((err + rc)) + fi # Stage ocean initial conditions to ROTDIR (warm start) if [[ "${DO_OCN:-}" = "YES" ]]; then RUN=${rCDUMP} YMD=${gPDY} HH=${gcyc} declare_from_tmpl COM_OCEAN_RESTART_PREV:COM_OCEAN_RESTART_TMPL [[ ! -d "${COM_OCEAN_RESTART_PREV}" ]] && mkdir -p "${COM_OCEAN_RESTART_PREV}" - src="${BASE_CPLIC}/${CPL_OCNIC:-}/${PDY}${cyc}/${MEMDIR}/ocean/${PDY}.${cyc}0000.MOM.res.nc" - tgt="${COM_OCEAN_RESTART_PREV}/${PDY}.${cyc}0000.MOM.res.nc" + src="${BASE_CPLIC}/${CPL_OCNIC:-}/${PDY}${cyc}/${MEMDIR}/ocean/${DTG_PREFIX}.MOM.res.nc" + tgt="${COM_OCEAN_RESTART_PREV}/${DTG_PREFIX}.MOM.res.nc" ${NCP} "${src}" "${tgt}" rc=$? ((rc != 0)) && error_message "${src}" "${tgt}" "${rc}" @@ -96,8 +113,8 @@ for MEMDIR in "${MEMDIR_ARRAY[@]}"; do ;; "025" ) for nn in $(seq 1 3); do - src="${BASE_CPLIC}/${CPL_OCNIC:-}/${PDY}${cyc}/${MEMDIR}/ocean/${PDY}.${cyc}0000.MOM.res_${nn}.nc" - tgt="${COM_OCEAN_RESTART_PREV}/${PDY}.${cyc}0000.MOM.res_${nn}.nc" + src="${BASE_CPLIC}/${CPL_OCNIC:-}/${PDY}${cyc}/${MEMDIR}/ocean/${DTG_PREFIX}.MOM.res_${nn}.nc" + tgt="${COM_OCEAN_RESTART_PREV}/${DTG_PREFIX}.MOM.res_${nn}.nc" ${NCP} "${src}" "${tgt}" rc=$? ((rc != 0)) && error_message "${src}" "${tgt}" "${rc}" @@ -113,9 +130,11 @@ for MEMDIR in "${MEMDIR_ARRAY[@]}"; do # Ocean Perturbation Files # Extra zero on MEMDIR ensure we have a number even if the string is empty - if (( 0${MEMDIR:3} > 0 )) && [[ "${USE_OCN_PERTURB_FILES:-false}" == "true" ]]; then - src="${BASE_CPLIC}/${CPL_OCNIC:-}/${PDY}${cyc}/${MEMDIR}/ocean/${PDY}.${cyc}0000.mom6_increment.nc" - tgt="${COM_OCEAN_RESTART_PREV}/${PDY}.${cyc}0000.mom6_increment.nc" + if (( 0${MEMDIR:3} > 0 )) && [[ "${REPLAY_ICS:-NO}" == "YES" ]]; then + YMD=${PDY} HH=${cyc} declare_from_tmpl COM_OCEAN_ANALYSIS:COM_OCEAN_ANALYSIS_TMPL + [[ ! -d "${COM_OCEAN_ANALYSIS}" ]] && mkdir -p "${COM_OCEAN_ANALYSIS}" + src="${BASE_CPLIC}/${CPL_OCNIC:-}/${PDY}${cyc}/${MEMDIR}/ocean/${DTG_PREFIX}.mom6_perturbation.nc" + tgt="${COM_OCEAN_ANALYSIS}/mom6_increment.nc" ${NCP} "${src}" "${tgt}" rc=${?} ((rc != 0)) && error_message "${src}" "${tgt}" "${rc}" @@ -128,8 +147,8 @@ for MEMDIR in "${MEMDIR_ARRAY[@]}"; do # Stage the mediator restarts to ROTDIR (warm start/restart the coupled model) RUN=${rCDUMP} YMD=${gPDY} HH=${gcyc} declare_from_tmpl COM_MED_RESTART_PREV:COM_MED_RESTART_TMPL [[ ! -d "${COM_MED_RESTART_PREV}" ]] && mkdir -p "${COM_MED_RESTART_PREV}" - src="${BASE_CPLIC}/${CPL_MEDIC:-}/${PDY}${cyc}/${MEMDIR}/med/${PDY}.${cyc}0000.ufs.cpld.cpl.r.nc" - tgt="${COM_MED_RESTART_PREV}/${PDY}.${cyc}0000.ufs.cpld.cpl.r.nc" + src="${BASE_CPLIC}/${CPL_MEDIC:-}/${PDY}${cyc}/${MEMDIR}/med/${DTG_PREFIX}.ufs.cpld.cpl.r.nc" + tgt="${COM_MED_RESTART_PREV}/${DTG_PREFIX}.ufs.cpld.cpl.r.nc" if [[ -f "${src}" ]]; then ${NCP} "${src}" "${tgt}" rc=$? @@ -146,8 +165,8 @@ for MEMDIR in "${MEMDIR_ARRAY[@]}"; do if [[ "${DO_ICE:-}" = "YES" ]]; then RUN=${rCDUMP} YMD=${gPDY} HH=${gcyc} declare_from_tmpl COM_ICE_RESTART_PREV:COM_ICE_RESTART_TMPL [[ ! -d "${COM_ICE_RESTART_PREV}" ]] && mkdir -p "${COM_ICE_RESTART_PREV}" - src="${BASE_CPLIC}/${CPL_ICEIC:-}/${PDY}${cyc}/${MEMDIR}/ice/${PDY}.${cyc}0000.cice_model.res.nc" - tgt="${COM_ICE_RESTART_PREV}/${PDY}.${cyc}0000.cice_model.res.nc" + src="${BASE_CPLIC}/${CPL_ICEIC:-}/${PDY}${cyc}/${MEMDIR}/ice/${DTG_PREFIX}.cice_model.res.nc" + tgt="${COM_ICE_RESTART_PREV}/${DTG_PREFIX}.cice_model.res.nc" ${NCP} "${src}" "${tgt}" rc=$? ((rc != 0)) && error_message "${src}" "${tgt}" "${rc}" @@ -156,11 +175,11 @@ for MEMDIR in "${MEMDIR_ARRAY[@]}"; do # Stage the WW3 initial conditions to ROTDIR (warm start; TODO: these should be placed in $RUN.$gPDY/$gcyc) if [[ "${DO_WAVE:-}" = "YES" ]]; then - YMD=${PDY} HH=${cyc} declare_from_tmpl COM_WAVE_RESTART - [[ ! -d "${COM_WAVE_RESTART}" ]] && mkdir -p "${COM_WAVE_RESTART}" + YMD=${gPDY} HH=${gcyc} declare_from_tmpl COM_WAVE_RESTART_PREV:COM_WAVE_RESTART_TMPL + [[ ! -d "${COM_WAVE_RESTART_PREV}" ]] && mkdir -p "${COM_WAVE_RESTART_PREV}" for grdID in ${waveGRD}; do # TODO: check if this is a bash array; if so adjust - src="${BASE_CPLIC}/${CPL_WAVIC:-}/${PDY}${cyc}/${MEMDIR}/wave/${PDY}.${cyc}0000.restart.${grdID}" - tgt="${COM_WAVE_RESTART}/${PDY}.${cyc}0000.restart.${grdID}" + src="${BASE_CPLIC}/${CPL_WAVIC:-}/${PDY}${cyc}/${MEMDIR}/wave/${DTG_PREFIX}.restart.${grdID}" + tgt="${COM_WAVE_RESTART_PREV}/${DTG_PREFIX}.restart.${grdID}" ${NCP} "${src}" "${tgt}" rc=$? ((rc != 0)) && error_message "${src}" "${tgt}" "${rc}" diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh index aff4f5a394..a4e10dffb9 100755 --- a/ush/forecast_postdet.sh +++ b/ush/forecast_postdet.sh @@ -8,40 +8,24 @@ FV3_postdet() { echo "warm_start = ${warm_start}" echo "RERUN = ${RERUN}" + #============================================================================ + # First copy initial conditions # cold start case if [[ "${warm_start}" == ".false." ]]; then - # Create an array of chgres-ed FV3 files - local fv3_input_files tile_files fv3_input_file - fv3_input_files=(gfs_ctrl.nc) - tile_files=(gfs_data sfc_data) - local nn tt - for (( nn = 1; nn <= ntiles; nn++ )); do - for tt in "${tile_files[@]}"; do - fv3_input_files+=("${tt}.tile${nn}.nc") - done - done - + # Get list of FV3 cold start files + local file_list + file_list=$(FV3_coldstarts) echo "Copying FV3 cold start files for 'RUN=${RUN}' at '${current_cycle}' from '${COMIN_ATMOS_INPUT}'" - for fv3_input_file in "${fv3_input_files[@]}"; do - ${NCP} "${COMIN_ATMOS_INPUT}/${fv3_input_file}" "${DATA}/INPUT/${fv3_input_file}" \ + local fv3_file + for fv3_file in ${file_list}; do + ${NCP} "${COMIN_ATMOS_INPUT}/${fv3_file}" "${DATA}/INPUT/${fv3_file}" \ || ( echo "FATAL ERROR: Unable to copy FV3 IC, ABORT!"; exit 1 ) done # warm start case elif [[ "${warm_start}" == ".true." ]]; then - # Create an array of FV3 restart files - local fv3_restart_files tile_files fv3_restart_file restart_file - fv3_restart_files=(coupler.res fv_core.res.nc) - tile_files=(fv_core.res fv_srf_wnd.res fv_tracer.res phy_data sfc_data ca_data) - local nn tt - for (( nn = 1; nn <= ntiles; nn++ )); do - for tt in "${tile_files[@]}"; do - fv3_restart_files+=("${tt}.tile${nn}.nc") - done - done - # Determine restart date and directory containing restarts local restart_date restart_dir if [[ "${RERUN}" == "YES" ]]; then @@ -52,26 +36,18 @@ FV3_postdet() { restart_dir="${COMIN_ATMOS_RESTART_PREV}" fi + # Get list of FV3 restart files + local file_list + file_list=$(FV3_restarts) echo "Copying FV3 restarts for 'RUN=${RUN}' at '${restart_date}' from '${restart_dir}'" - for fv3_restart_file in "${fv3_restart_files[@]}"; do - restart_file="${restart_date:0:8}.${restart_date:8:2}0000.${fv3_restart_file}" - ${NCP} "${restart_dir}/${restart_file}" "${DATA}/INPUT/${fv3_restart_file}" \ + local fv3_file restart_file + for fv3_file in ${file_list}; do + restart_file="${restart_date:0:8}.${restart_date:8:2}0000.${fv3_file}" + ${NCP} "${restart_dir}/${restart_file}" "${DATA}/INPUT/${fv3_file}" \ || ( echo "FATAL ERROR: Unable to copy FV3 IC, ABORT!"; exit 1 ) done - if [[ "${RERUN}" == "YES" ]]; then - - local restart_fhr - restart_fhr=$(nhour "${RERUN_DATE}" "${current_cycle}") - IAU_FHROT=$((IAU_OFFSET + restart_fhr)) - if [[ "${DOIAU}" == "YES" ]]; then - IAUFHRS=-1 - IAU_DELTHRS=0 - IAU_INC_FILES="''" - fi - - else # "${RERUN}" == "NO" - + if [[ "${RERUN}" != "YES" ]]; then # Replace sfc_data with sfcanl_data restart files from current cycle (if found) local nn for (( nn = 1; nn <= ntiles; nn++ )); do @@ -84,9 +60,55 @@ FV3_postdet() { break fi done + fi # if [[ "${RERUN}" != "YES" ]]; then - # Need a coupler.res that is consistent with the model start time + fi # if [[ "${warm_start}" == ".true." ]]; then + + #============================================================================ + # Determine increment files when doing cold start + if [[ "${warm_start}" == ".false." ]]; then + + if [[ "${REPLAY_ICS:-NO}" == "YES" ]]; then + IAU_FHROT=${half_window} # Replay ICs start at the end of the assimilation window + if (( MEMBER == 0 )); then + inc_files=() + else + inc_files=("atminc.nc") + read_increment=".true." + res_latlon_dynamics="atminc.nc" + fi + local increment_file + for inc_file in "${inc_files[@]}"; do + increment_file="${COMIN_ATMOS_INPUT}/${RUN}.t${cyc}z.${inc_file}" + if [[ -f "${increment_file}" ]]; then + ${NCP} "${increment_file}" "${DATA}/INPUT/${inc_file}" + else + echo "FATAL ERROR: missing increment file '${increment_file}', ABORT!" + exit 1 + fi + done + fi + + # Determine IAU and increment files when doing warm start + elif [[ "${warm_start}" == ".true." ]]; then + + #-------------------------------------------------------------------------- + if [[ "${RERUN}" == "YES" ]]; then + + local restart_fhr + restart_fhr=$(nhour "${RERUN_DATE}" "${current_cycle}") + IAU_FHROT=$((IAU_OFFSET + restart_fhr)) if [[ "${DOIAU}" == "YES" ]]; then + IAUFHRS=-1 + IAU_DELTHRS=0 + IAU_INC_FILES="''" + fi + + #-------------------------------------------------------------------------- + else # "${RERUN}" == "NO" + + # Need a coupler.res that is consistent with the model start time + if [[ "${DOIAU:-NO}" == "YES" ]]; then local model_start_time="${previous_cycle}" else local model_start_time="${current_cycle}" @@ -121,6 +143,15 @@ EOF inc_files=("atminc.nc") read_increment=".true." res_latlon_dynamics="atminc.nc" + if [[ "${REPLAY_ICS:-NO}" == "YES" ]]; then + IAU_FHROT=${half_window} # Replay ICs start at the end of the assimilation window + # Control member has no perturbation + if (( MEMBER == 0 )); then + inc_files=() + read_increment=".false." + res_latlon_dynamics='""' + fi + fi fi local increment_file @@ -135,17 +166,22 @@ EOF done fi # if [[ "${RERUN}" == "YES" ]]; then + #-------------------------------------------------------------------------- fi # if [[ "${warm_start}" == ".true." ]]; then + #============================================================================ + #============================================================================ # If doing IAU, change forecast hours - if [[ "${DOIAU:-}" == "YES" ]]; then + if [[ "${DOIAU:-NO}" == "YES" ]]; then FHMAX=$((FHMAX + 6)) if (( FHMAX_HF > 0 )); then FHMAX_HF=$((FHMAX_HF + 6)) fi fi + #============================================================================ + #============================================================================ # If warm starting from restart files, set the following flags if [[ "${warm_start}" == ".true." ]]; then @@ -162,8 +198,9 @@ EOF na_init=0 fi # warm_start == .true. + #============================================================================ - cd "${DATA}" || exit 1 + #============================================================================ if [[ "${QUILTING}" = ".true." ]] && [[ "${OUTPUT_GRID}" = "gaussian_grid" ]]; then local FH2 FH3 for fhr in ${FV3_OUTPUT_FH}; do @@ -181,16 +218,8 @@ EOF fi fi done - else # TODO: Is this even valid anymore? - local nn - for (( nn = 1; nn <= ntiles; nn++ )); do - ${NLN} "nggps2d.tile${nn}.nc" "${COMOUT_ATMOS_HISTORY}/nggps2d.tile${nn}.nc" - ${NLN} "nggps3d.tile${nn}.nc" "${COMOUT_ATMOS_HISTORY}/nggps3d.tile${nn}.nc" - ${NLN} "grid_spec.tile${nn}.nc" "${COMOUT_ATMOS_HISTORY}/grid_spec.tile${nn}.nc" - ${NLN} "atmos_static.tile${nn}.nc" "${COMOUT_ATMOS_HISTORY}/atmos_static.tile${nn}.nc" - ${NLN} "atmos_4xdaily.tile${nn}.nc" "${COMOUT_ATMOS_HISTORY}/atmos_4xdaily.tile${nn}.nc" - done fi + #============================================================================ } FV3_nml() { @@ -223,44 +252,35 @@ FV3_out() { ${NCP} "${DATA}/diag_table" "${COMOUT_CONF}/ufs.diag_table" - # Create an array of fv3 restart files - local fv3_restart_files tile_files fv3_restart_file restart_file - fv3_restart_files=(coupler.res fv_core.res.nc) - tile_files=(fv_core.res fv_srf_wnd.res fv_tracer.res phy_data sfc_data ca_data) - local nn tt - for (( nn = 1; nn <= ntiles; nn++ )); do - for tt in "${tile_files[@]}"; do - fv3_restart_files+=("${tt}.tile${nn}.nc") - done - done - + # Determine the dates for restart files to be copied to COM + local restart_date restart_dates + restart_dates=() # Copy restarts in the assimilation window for RUN=gdas|enkfgdas|enkfgfs if [[ "${RUN}" =~ "gdas" || "${RUN}" == "enkfgfs" ]]; then - local restart_date - restart_date=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${restart_interval} hours" +%Y%m%d%H) + restart_date="${model_start_date_next_cycle}" while (( restart_date <= forecast_end_cycle )); do - echo "Copying FV3 restarts for 'RUN=${RUN}' at ${restart_date}" - for fv3_restart_file in "${fv3_restart_files[@]}"; do - restart_file="${restart_date:0:8}.${restart_date:8:2}0000.${fv3_restart_file}" - ${NCP} "${DATArestart}/FV3_RESTART/${restart_file}" \ - "${COMOUT_ATMOS_RESTART}/${restart_file}" - done + restart_dates+=("${restart_date:0:8}.${restart_date:8:2}0000") restart_date=$(date --utc -d "${restart_date:0:8} ${restart_date:8:2} + ${restart_interval} hours" +%Y%m%d%H) done + elif [[ "${RUN}" == "gfs" || "${RUN}" == "gefs" ]]; then # Copy restarts at the end of the forecast segment for RUN=gfs|gefs + if [[ "${COPY_FINAL_RESTARTS}" == "YES" ]]; then + restart_dates+=("${forecast_end_cycle:0:8}.${forecast_end_cycle:8:2}0000") + fi fi - # 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! - # 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}" \ - "${COMOUT_ATMOS_RESTART}/${restart_file}" + # Get list of FV3 restart files + local file_list fv3_file + file_list=$(FV3_restarts) + + # Copy restarts for the dates collected above to COM + for restart_date in "${restart_dates[@]}"; do + echo "Copying FV3 restarts for 'RUN=${RUN}' at ${restart_date}" + for fv3_file in ${file_list}; do + ${NCP} "${DATArestart}/FV3_RESTART/${restart_date}.${fv3_file}" \ + "${COMOUT_ATMOS_RESTART}/${restart_date}.${fv3_file}" done - fi + done + echo "SUB ${FUNCNAME[0]}: Output data for FV3 copied" } @@ -362,7 +382,7 @@ WW3_out() { CPL_out() { echo "SUB ${FUNCNAME[0]}: Copying output data for general cpl fields" - if [[ "${esmf_profile:-}" == ".true." ]]; then + if [[ "${esmf_profile:-.false.}" == ".true." ]]; then ${NCP} "${DATA}/ESMF_Profile.summary" "${COMOUT_ATMOS_HISTORY}/ESMF_Profile.summary" fi } @@ -406,7 +426,7 @@ MOM6_postdet() { # TODO if [[ $RUN} == "gefs" ]] block maybe be needed # to ensure it does not interfere with the GFS when ensemble is updated in the GFS if (( MEMBER > 0 )) && [[ "${ODA_INCUPD:-False}" == "True" ]]; then - ${NCP} "${COMIN_OCEAN_RESTART_PREV}/${restart_date:0:8}.${restart_date:0:8}0000.mom6_increment.nc" "${DATA}/INPUT/mom6_increment.nc" \ + ${NCP} "${COMIN_OCEAN_ANALYSIS}/mom6_increment.nc" "${DATA}/INPUT/mom6_increment.nc" \ || ( echo "FATAL ERROR: Unable to copy ensemble MOM6 increment, ABORT!"; exit 1 ) fi fi # if [[ "${RERUN}" == "NO" ]]; then diff --git a/ush/forecast_predet.sh b/ush/forecast_predet.sh index 9c0d90b1dc..9183e86002 100755 --- a/ush/forecast_predet.sh +++ b/ush/forecast_predet.sh @@ -36,6 +36,38 @@ nhour(){ echo "${hours}" } +FV3_coldstarts(){ + # Function to return an comma-separated string of cold-start input files for FV3 + # Create an array of chgres-ed FV3 files + local fv3_input_files tile_files + fv3_input_files=(gfs_ctrl.nc) + tile_files=(gfs_data sfc_data) + local nn tt + for (( nn = 1; nn <= ntiles; nn++ )); do + for tt in "${tile_files[@]}"; do + fv3_input_files+=("${tt}.tile${nn}.nc") + done + done + # Create a comma separated string from array using IFS + IFS=, echo "${fv3_input_files[*]}" +} + +FV3_restarts(){ + # Function to return an comma-separated string of warm-start input files for FV3 + # Create an array of FV3 restart files + local fv3_restart_files tile_files + fv3_restart_files=(coupler.res fv_core.res.nc) + tile_files=(fv_core.res fv_srf_wnd.res fv_tracer.res phy_data sfc_data ca_data) + local nn tt + for (( nn = 1; nn <= ntiles; nn++ )); do + for tt in "${tile_files[@]}"; do + fv3_restart_files+=("${tt}.tile${nn}.nc") + done + done + # Create a comma separated string from array using IFS + IFS=, echo "${fv3_restart_files[*]}" +} + # shellcheck disable=SC2034 common_predet(){ echo "SUB ${FUNCNAME[0]}: Defining variables for shared through model components" @@ -54,15 +86,20 @@ 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) - #Define model start date for current_cycle and next_cycle as the time the forecast will start - if [[ "${DOIAU:-}" == "YES" ]]; then + forecast_end_cycle=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${FHMAX} hours" +%Y%m%d%H) + + # Define model start date for current_cycle and next_cycle as the time the forecast will start + if [[ "${DOIAU:-NO}" == "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} + if [[ "${REPLAY_ICS:-NO}" == "YES" ]]; then + model_start_date_current_cycle=${current_cycle_end} + else + model_start_date_current_cycle=${current_cycle} + fi 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) + fi FHMIN=${FHMIN:-0} FHMAX=${FHMAX:-9} diff --git a/ush/parsing_namelists_WW3.sh b/ush/parsing_namelists_WW3.sh index a01d694710..c57a90e50a 100755 --- a/ush/parsing_namelists_WW3.sh +++ b/ush/parsing_namelists_WW3.sh @@ -18,7 +18,7 @@ WW3_namelists(){ fi # Set time stamps for model start and output # For special case when IAU is on but this is an initial half cycle - if [ $IAU_OFFSET = 0 ]; then + if [ ${IAU_OFFSET:-0} = 0 ]; then ymdh_beg=$YMDH else ymdh_beg=$($NDATE -$WAVHINDH $YMDH) diff --git a/ush/wave_outp_spec.sh b/ush/wave_outp_spec.sh index db9997fd54..159d0eb2cf 100755 --- a/ush/wave_outp_spec.sh +++ b/ush/wave_outp_spec.sh @@ -31,6 +31,7 @@ source "${USHgfs}/preamble.sh" workdir=$4 YMDHE=$($NDATE $FHMAX_WAV_PNT $CDATE) + model_start_date=$(${NDATE} ${OFFSET_START_HOUR} "${PDY}${cyc}") cd $workdir @@ -196,7 +197,7 @@ source "${USHgfs}/preamble.sh" if [ -f $outfile ] then - if [ "${ymdh}" = "${CDATE}" ] + if [ "${ymdh}" = "${model_start_date}" ] then if [ "$specdir" = "bull" ] then @@ -237,6 +238,6 @@ source "${USHgfs}/preamble.sh" # 3.b Clean up the rest cd .. -rm -rf ${specdir}_${bloc} +rm -rf "${specdir}_${bloc}" # End of ww3_outp_spec.sh ---------------------------------------------------- # diff --git a/workflow/rocoto/gefs_tasks.py b/workflow/rocoto/gefs_tasks.py index 99be535a55..6899a655b6 100644 --- a/workflow/rocoto/gefs_tasks.py +++ b/workflow/rocoto/gefs_tasks.py @@ -1,6 +1,7 @@ from applications.applications import AppConfig from rocoto.tasks import Tasks import rocoto.rocoto as rocoto +from datetime import datetime, timedelta class GEFSTasks(Tasks): @@ -9,49 +10,61 @@ def __init__(self, app_config: AppConfig, cdump: str) -> None: super().__init__(app_config, cdump) def stage_ic(self): - cpl_ic = self._configs['stage_ic'] - deps = [] - + dtg_prefix = "@Y@m@d.@H0000" + offset = str(self._configs['base']['OFFSET_START_HOUR']).zfill(2) + ":00:00" # Atm ICs if self.app_config.do_atm: - prefix = f"{cpl_ic['BASE_CPLIC']}/{cpl_ic['CPL_ATMIC']}/@Y@m@d@H/mem000/atmos" - for file in ['gfs_ctrl.nc'] + \ - [f'{datatype}_data.tile{tile}.nc' - for datatype in ['gfs', 'sfc'] - for tile in range(1, self.n_tiles + 1)]: - data = f"{prefix}/{file}" - dep_dict = {'type': 'data', 'data': data} + prefix = f"{cpl_ic['BASE_CPLIC']}/{cpl_ic['CPL_ATMIC']}/@Y@m@d@H/mem000/atmos/" + if self._base['EXP_WARM_START']: + for file in ['fv_core.res.nc'] + \ + [f'{datatype}.tile{tile}.nc' + for datatype in ['ca_data', 'fv_core.res', 'fv_srf_wnd.res', 'fv_tracer.res', 'phy_data', 'sfc_data'] + for tile in range(1, self.n_tiles + 1)]: + data = [prefix, f"{dtg_prefix}.{file}"] + dep_dict = {'type': 'data', 'data': data, 'offset': [None, offset]} + deps.append(rocoto.add_dependency(dep_dict)) + prefix = f"{cpl_ic['BASE_CPLIC']}/{cpl_ic['CPL_ATMIC']}/@Y@m@d@H/mem000/med/" + data = [prefix, f"{dtg_prefix}.ufs.cpld.cpl.r.nc"] + dep_dict = {'type': 'data', 'data': data, 'offset': [None, offset]} deps.append(rocoto.add_dependency(dep_dict)) + else: + for file in ['gfs_ctrl.nc'] + \ + [f'{datatype}_data.tile{tile}.nc' + for datatype in ['gfs', 'sfc'] + for tile in range(1, self.n_tiles + 1)]: + data = f"{prefix}/{file}" + dep_dict = {'type': 'data', 'data': data} + deps.append(rocoto.add_dependency(dep_dict)) # Ocean ICs if self.app_config.do_ocean: ocn_res = f"{self._base.get('OCNRES', '025'):03d}" - prefix = f"{cpl_ic['BASE_CPLIC']}/{cpl_ic['CPL_OCNIC']}/@Y@m@d@H/mem000/ocean" - data = f"{prefix}/@Y@m@d.@H0000.MOM.res.nc" - dep_dict = {'type': 'data', 'data': data} + prefix = f"{cpl_ic['BASE_CPLIC']}/{cpl_ic['CPL_OCNIC']}/@Y@m@d@H/mem000/ocean/" + data = [prefix, f"{dtg_prefix}.MOM.res.nc"] + dep_dict = {'type': 'data', 'data': data, 'offset': [None, offset]} deps.append(rocoto.add_dependency(dep_dict)) if ocn_res in ['025']: # 0.25 degree ocean model also has these additional restarts for res in [f'res_{res_index}' for res_index in range(1, 4)]: - data = f"{prefix}/@Y@m@d.@H0000.MOM.{res}.nc" - dep_dict = {'type': 'data', 'data': data} + data = [prefix, f"{dtg_prefix}.MOM.{res}.nc"] + dep_dict = {'type': 'data', 'data': data, 'offset': [None, offset]} deps.append(rocoto.add_dependency(dep_dict)) # Ice ICs if self.app_config.do_ice: - prefix = f"{cpl_ic['BASE_CPLIC']}/{cpl_ic['CPL_ICEIC']}/@Y@m@d@H/mem000/ice" - data = f"{prefix}/@Y@m@d.@H0000.cice_model.res.nc" - dep_dict = {'type': 'data', 'data': data} + prefix = f"{cpl_ic['BASE_CPLIC']}/{cpl_ic['CPL_ICEIC']}/@Y@m@d@H/mem000/ice/" + data = [prefix, f"{dtg_prefix}.cice_model.res.nc"] + dep_dict = {'type': 'data', 'data': data, 'offset': [None, offset]} deps.append(rocoto.add_dependency(dep_dict)) # Wave ICs if self.app_config.do_wave: - prefix = f"{cpl_ic['BASE_CPLIC']}/{cpl_ic['CPL_WAVIC']}/@Y@m@d@H/mem000/wave" + prefix = f"{cpl_ic['BASE_CPLIC']}/{cpl_ic['CPL_WAVIC']}/@Y@m@d@H/mem000/wave/" for wave_grid in self._configs['waveinit']['waveGRD'].split(): - data = f"{prefix}/@Y@m@d.@H0000.restart.{wave_grid}" - dep_dict = {'type': 'data', 'data': data} + data = [prefix, f"{dtg_prefix}.restart.{wave_grid}"] + dep_dict = {'type': 'data', 'data': data, 'offset': [None, offset]} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) diff --git a/workflow/setup_expt.py b/workflow/setup_expt.py index 97d25dc15a..b44842b982 100755 --- a/workflow/setup_expt.py +++ b/workflow/setup_expt.py @@ -287,6 +287,8 @@ def _update_defaults(dict_in: dict) -> dict: data = AttrDict(host.info, **inputs.__dict__) data.HOMEgfs = _top yaml_path = inputs.yaml + if not os.path.exists(yaml_path): + raise IOError(f'YAML file does not exist, check path:' + yaml_path) yaml_dict = _update_defaults(AttrDict(parse_j2yaml(yaml_path, data))) # First update config.base From ebacebfbe458634b8c80af6a735d6b6d01e4e406 Mon Sep 17 00:00:00 2001 From: RussTreadon-NOAA <26926959+RussTreadon-NOAA@users.noreply.github.com> Date: Thu, 13 Jun 2024 11:20:24 -0400 Subject: [PATCH 32/45] Update gdas.cd and gsi_utils hashes (#2641) This PR updates the `sorc/gdas.cd` and `sorc/gsi_utils` hashes. The updated hashes bring in bug fixes, new UFS DA functionality, and a Gaea build for gsi_utils. Resolves #2640 --- parm/archive/enkf.yaml.j2 | 2 +- sorc/gdas.cd | 2 +- sorc/gsi_utils.fd | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/parm/archive/enkf.yaml.j2 b/parm/archive/enkf.yaml.j2 index e05aca2981..ed50a1749d 100644 --- a/parm/archive/enkf.yaml.j2 +++ b/parm/archive/enkf.yaml.j2 @@ -16,7 +16,7 @@ enkf: {% endfor %} {% if DO_JEDIATMENS %} - {% set steps = ["atmensanlinit", "atmensanlrun", "atmensanlfinal"] %} + {% set steps = ["atmensanlinit", "atmensanlletkf", "atmensanlfv3inc", "atmensanlfinal"] %} {% else %} {% set steps = ["eobs", "eupd"] %} {% if lobsdiag_forenkf %} diff --git a/sorc/gdas.cd b/sorc/gdas.cd index 3e50a8fdcd..2bd8ffc149 160000 --- a/sorc/gdas.cd +++ b/sorc/gdas.cd @@ -1 +1 @@ -Subproject commit 3e50a8fdcd07305a3464a02e20eaf4b033179167 +Subproject commit 2bd8ffc149f30c0ae0f8e1508477a8dc88c46a65 diff --git a/sorc/gsi_utils.fd b/sorc/gsi_utils.fd index d940406161..4332814529 160000 --- a/sorc/gsi_utils.fd +++ b/sorc/gsi_utils.fd @@ -1 +1 @@ -Subproject commit d9404061611553459394173c3ff33116db306326 +Subproject commit 4332814529465ab8eb58e43a38227b952ebfca49 From dc21eac6c3941d7f30803891d91d82f4cc1f8183 Mon Sep 17 00:00:00 2001 From: TerrenceMcGuinness-NOAA Date: Thu, 13 Jun 2024 11:41:14 -0400 Subject: [PATCH 33/45] Add Hercules-EMC to the Jenkins configurable parameter list (#2685) This quick-fix PR is to update the Jenkins Pipeline's configurable parameter list to include the **Hercules-EMC** node. This allows Jenkins users to restart Jobs in the controller when no updates have been made. --- ci/Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile index 317cb7d820..263de10c6d 100644 --- a/ci/Jenkinsfile +++ b/ci/Jenkinsfile @@ -76,7 +76,7 @@ pipeline { Machine = machine[0].toUpperCase() + machine.substring(1) echo "Getting Common Workspace for ${Machine}" ws("${custom_workspace[machine]}/${env.CHANGE_ID}") { - properties([parameters([[$class: 'NodeParameterDefinition', allowedSlaves: ['built-in', 'Hera-EMC', 'Orion-EMC'], defaultSlaves: ['built-in'], name: '', nodeEligibility: [$class: 'AllNodeEligibility'], triggerIfResult: 'allCases']])]) + properties([parameters([[$class: 'NodeParameterDefinition', allowedSlaves: ['built-in', 'Hercules-EMC' 'Hera-EMC', 'Orion-EMC'], defaultSlaves: ['built-in'], name: '', nodeEligibility: [$class: 'AllNodeEligibility'], triggerIfResult: 'allCases']])]) HOME = "${WORKSPACE}" sh(script: "mkdir -p ${HOME}/RUNTESTS;rm -Rf ${HOME}/RUNTESTS/*") sh(script: """${GH} pr edit ${env.CHANGE_ID} --repo ${repo_url} --add-label "CI-${Machine}-Building" --remove-label "CI-${Machine}-Ready" """) From 603a4a8052a5c43ce5986f028c3fcfd5fd248ad4 Mon Sep 17 00:00:00 2001 From: TerrenceMcGuinness-NOAA Date: Thu, 13 Jun 2024 12:22:03 -0400 Subject: [PATCH 34/45] Update Jenkinsfile needed a comma --- ci/Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile index 263de10c6d..c6aa0887c7 100644 --- a/ci/Jenkinsfile +++ b/ci/Jenkinsfile @@ -76,7 +76,7 @@ pipeline { Machine = machine[0].toUpperCase() + machine.substring(1) echo "Getting Common Workspace for ${Machine}" ws("${custom_workspace[machine]}/${env.CHANGE_ID}") { - properties([parameters([[$class: 'NodeParameterDefinition', allowedSlaves: ['built-in', 'Hercules-EMC' 'Hera-EMC', 'Orion-EMC'], defaultSlaves: ['built-in'], name: '', nodeEligibility: [$class: 'AllNodeEligibility'], triggerIfResult: 'allCases']])]) + properties([parameters([[$class: 'NodeParameterDefinition', allowedSlaves: ['built-in', 'Hercules-EMC', 'Hera-EMC', 'Orion-EMC'], defaultSlaves: ['built-in'], name: '', nodeEligibility: [$class: 'AllNodeEligibility'], triggerIfResult: 'allCases']])]) HOME = "${WORKSPACE}" sh(script: "mkdir -p ${HOME}/RUNTESTS;rm -Rf ${HOME}/RUNTESTS/*") sh(script: """${GH} pr edit ${env.CHANGE_ID} --repo ${repo_url} --add-label "CI-${Machine}-Building" --remove-label "CI-${Machine}-Ready" """) From 5a5fc2be7555f094a0f90fd3a3df22d071ccdfd4 Mon Sep 17 00:00:00 2001 From: Jessica Meixner Date: Fri, 14 Jun 2024 11:04:41 -0400 Subject: [PATCH 35/45] Remove ocean daily files (#2689) This PR removes the ocn_daily files that are produced by the ocean component. These files can be recreated by averaging data that exists in the 6 hour aveaged files if needed. Fixes https://github.com/NOAA-EMC/global-workflow/issues/2675 Fixes https://github.com/NOAA-EMC/global-workflow/issues/2659 (by removing them and making this obsolete) --- parm/archive/master_gfs.yaml.j2 | 1 - parm/archive/ocean_daily.yaml.j2 | 8 -------- parm/ufs/fv3/diag_table | 20 -------------------- ush/forecast_postdet.sh | 7 ------- 4 files changed, 36 deletions(-) delete mode 100644 parm/archive/ocean_daily.yaml.j2 diff --git a/parm/archive/master_gfs.yaml.j2 b/parm/archive/master_gfs.yaml.j2 index e96def7a03..67cde482a2 100644 --- a/parm/archive/master_gfs.yaml.j2 +++ b/parm/archive/master_gfs.yaml.j2 @@ -56,7 +56,6 @@ datasets: # Ocean forecasts {% filter indent(width=4) %} {% include "ocean_6hravg.yaml.j2" %} -{% include "ocean_daily.yaml.j2" %} {% include "ocean_grib2.yaml.j2" %} {% include "gfs_flux_1p00.yaml.j2" %} {% endfilter %} diff --git a/parm/archive/ocean_daily.yaml.j2 b/parm/archive/ocean_daily.yaml.j2 deleted file mode 100644 index 0f45264973..0000000000 --- a/parm/archive/ocean_daily.yaml.j2 +++ /dev/null @@ -1,8 +0,0 @@ -ocean_daily: - {% set head = "gfs.ocean.t" + cycle_HH + "z." %} - name: "OCEAN_DAILY" - target: "{{ ATARDIR }}/{{ cycle_YMDH }}/ocean_daily.tar" - required: - {% for fhr in range(24, FHMAX_GFS + 24, 24) %} - - "{{ COM_OCEAN_HISTORY | relpath(ROTDIR) }}/{{ head }}daily.f{{ '%03d' % fhr }}.nc" - {% endfor %} diff --git a/parm/ufs/fv3/diag_table b/parm/ufs/fv3/diag_table index 83991cb223..dad8b6fac6 100644 --- a/parm/ufs/fv3/diag_table +++ b/parm/ufs/fv3/diag_table @@ -1,7 +1,6 @@ "fv3_history", 0, "hours", 1, "hours", "time" "fv3_history2d", 0, "hours", 1, "hours", "time" "@[MOM6_OUTPUT_DIR]/ocn%4yr%2mo%2dy%2hr", @[FHOUT_OCN], "hours", 1, "hours", "time", @[FHOUT_OCN], "hours", "@[SYEAR] @[SMONTH] @[SDAY] @[CHOUR] 0 0" -"@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", 1, "days", 1, "days", "time", 1, "days", "@[SYEAR] @[SMONTH] @[SDAY] @[CHOUR] 0 0" ############## # Ocean fields @@ -57,25 +56,6 @@ "ocean_model", "LwLatSens", "LwLatSens", "@[MOM6_OUTPUT_DIR]/ocn%4yr%2mo%2dy%2hr","all",.true.,"none",2 "ocean_model", "Heat_PmE", "Heat_PmE", "@[MOM6_OUTPUT_DIR]/ocn%4yr%2mo%2dy%2hr","all",.true.,"none",2 -# Daily fields -"ocean_model", "geolon", "geolon", "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", "all", .false., "none", 2 -"ocean_model", "geolat", "geolat", "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", "all", .false., "none", 2 -"ocean_model", "geolon_c", "geolon_c", "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", "all", .false., "none", 2 -"ocean_model", "geolat_c", "geolat_c", "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", "all", .false., "none", 2 -"ocean_model", "geolon_u", "geolon_u", "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", "all", .false., "none", 2 -"ocean_model", "geolat_u", "geolat_u", "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", "all", .false., "none", 2 -"ocean_model", "geolon_v", "geolon_v", "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", "all", .false., "none", 2 -"ocean_model", "geolat_v", "geolat_v", "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", "all", .false., "none", 2 -"ocean_model", "SST", "sst", "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", "all", .true., "none", 2 -"ocean_model", "latent", "latent", "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", "all", .true., "none", 2 -"ocean_model", "sensible", "sensible", "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", "all", .true., "none", 2 -"ocean_model", "SW", "SW", "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", "all", .true., "none", 2 -"ocean_model", "LW", "LW", "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", "all", .true., "none", 2 -"ocean_model", "evap", "evap", "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", "all", .true., "none", 2 -"ocean_model", "lprec", "lprec", "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", "all", .true., "none", 2 -"ocean_model", "taux", "taux", "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", "all", .true., "none", 2 -"ocean_model", "tauy", "tauy", "@[MOM6_OUTPUT_DIR]/ocn_daily%4yr%2mo%2dy", "all", .true., "none", 2 - ################### # Atmosphere fields ################### diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh index a4e10dffb9..2cc34eaacd 100755 --- a/ush/forecast_postdet.sh +++ b/ush/forecast_postdet.sh @@ -455,13 +455,6 @@ MOM6_postdet() { dest_file="${RUN}.ocean.t${cyc}z.${interval}hr_avg.f${fhr3}.nc" ${NLN} "${COMOUT_OCEAN_HISTORY}/${dest_file}" "${DATA}/MOM6_OUTPUT/${source_file}" - # Daily output - if (( fhr > 0 & fhr % 24 == 0 )); then - source_file="ocn_daily_${vdate:0:4}_${vdate:4:2}_${vdate:6:2}.nc" - dest_file="${RUN}.ocean.t${cyc}z.daily.f${fhr3}.nc" - ${NLN} "${COMOUT_OCEAN_HISTORY}/${dest_file}" "${DATA}/MOM6_OUTPUT/${source_file}" - fi - last_fhr=${fhr} done From 6c93b4554e235fcb4d0004e99a4c4498d55d461b Mon Sep 17 00:00:00 2001 From: Yaping Wang <49168260+ypwang19@users.noreply.github.com> Date: Fri, 14 Jun 2024 10:18:17 -0500 Subject: [PATCH 36/45] Add observation preparation job for aerosols DA to workflow (#2624) Add a prepaeroobs job to prepare aerosol obs files for DA. This job does quality control of the VIIRS aerosol raw observations and convert them to ioda format. Resolves #2623 --------- Co-authored-by: ypwang19 Co-authored-by: TerrenceMcGuinness-NOAA Co-authored-by: Cory Martin Co-authored-by: David Huber <69919478+DavidHuber-NOAA@users.noreply.github.com> --- env/HERA.env | 7 + env/HERCULES.env | 6 + env/JET.env | 7 + env/ORION.env | 7 + env/S4.env | 7 + env/WCOSS2.env | 7 + jobs/JGLOBAL_PREP_OBS_AERO | 43 +++++ jobs/rocoto/prepobsaero.sh | 24 +++ parm/archive/arcdir.yaml.j2 | 5 + parm/archive/gdas.yaml.j2 | 4 + parm/archive/gfsa.yaml.j2 | 4 + parm/config/gfs/config.base | 1 + parm/config/gfs/config.prepobsaero | 17 ++ parm/config/gfs/config.resources | 10 +- scripts/exglobal_archive.py | 4 +- scripts/exglobal_prep_obs_aero.py | 23 +++ ush/python/pygfs/task/aero_prepobs.py | 236 ++++++++++++++++++++++++++ workflow/applications/applications.py | 1 + workflow/applications/gfs_cycled.py | 6 + workflow/rocoto/gfs_tasks.py | 25 +++ 20 files changed, 441 insertions(+), 3 deletions(-) create mode 100755 jobs/JGLOBAL_PREP_OBS_AERO create mode 100755 jobs/rocoto/prepobsaero.sh create mode 100644 parm/config/gfs/config.prepobsaero create mode 100755 scripts/exglobal_prep_obs_aero.py create mode 100644 ush/python/pygfs/task/aero_prepobs.py diff --git a/env/HERA.env b/env/HERA.env index 2157e90031..94bab36703 100755 --- a/env/HERA.env +++ b/env/HERA.env @@ -102,6 +102,13 @@ elif [[ "${step}" = "atmanlfv3inc" ]]; then [[ ${NTHREADS_ATMANLFV3INC} -gt ${nth_max} ]] && export NTHREADS_ATMANLFV3INC=${nth_max} export APRUN_ATMANLFV3INC="${launcher} -n ${npe_atmanlfv3inc} --cpus-per-task=${NTHREADS_ATMANLFV3INC}" +elif [[ "${step}" = "prepobsaero" ]]; then + + nth_max=$((npe_node_max / npe_node_prepobsaero)) + + export NTHREADS_PREPOBSAERO=${nth_prepobsaero:-1} + export APRUN_PREPOBSAERO="${launcher} -n ${npe_prepobsaero} --cpus-per-task=${NTHREADS_PREPOBSAERO}" + elif [[ "${step}" = "snowanl" ]]; then nth_max=$((npe_node_max / npe_node_snowanl)) diff --git a/env/HERCULES.env b/env/HERCULES.env index 0824ba913a..d43dedad8d 100755 --- a/env/HERCULES.env +++ b/env/HERCULES.env @@ -99,6 +99,12 @@ case ${step} in [[ ${NTHREADS_AEROANL} -gt ${nth_max} ]] && export NTHREADS_AEROANL=${nth_max} export APRUN_AEROANL="${launcher} -n ${npe_aeroanlrun} --cpus-per-task=${NTHREADS_AEROANL}" ;; + "prepobsaero") + nth_max=$((npe_node_max / npe_node_prepobsaero)) + + export NTHREADS_PREPOBSAERO=${nth_prepobsaero:-1} + export APRUN_PREPOBSAERO="${launcher} -n ${npe_prepobsaero} --cpus-per-task=${NTHREADS_PREPOBSAERO}" +;; "snowanl") nth_max=$((npe_node_max / npe_node_snowanl)) diff --git a/env/JET.env b/env/JET.env index 5bd88dc93a..668ec1c2e4 100755 --- a/env/JET.env +++ b/env/JET.env @@ -82,6 +82,13 @@ elif [[ "${step}" = "aeroanlrun" ]]; then [[ ${NTHREADS_AEROANL} -gt ${nth_max} ]] && export NTHREADS_AEROANL=${nth_max} export APRUN_AEROANL="${launcher} -n ${npe_aeroanlrun}" +elif [[ "${step}" = "prepobsaero" ]]; then + + nth_max=$((npe_node_max / npe_node_prepobsaero)) + + export NTHREADS_PREPOBSAERO=${nth_prepobsaero:-1} + export APRUN_PREPOBSAERO="${launcher} -n ${npe_prepobsaero} --cpus-per-task=${NTHREADS_PREPOBSAERO}" + elif [[ "${step}" = "snowanl" ]]; then nth_max=$((npe_node_max / npe_node_snowanl)) diff --git a/env/ORION.env b/env/ORION.env index f701e55aa2..afd1cda052 100755 --- a/env/ORION.env +++ b/env/ORION.env @@ -90,6 +90,13 @@ elif [[ "${step}" = "aeroanlrun" ]]; then [[ ${NTHREADS_AEROANL} -gt ${nth_max} ]] && export NTHREADS_AEROANL=${nth_max} export APRUN_AEROANL="${launcher} -n ${npe_aeroanlrun} --cpus-per-task=${NTHREADS_AEROANL}" +elif [[ "${step}" = "prepobsaero" ]]; then + + nth_max=$((npe_node_max / npe_node_prepobsaero)) + + export NTHREADS_PREPOBSAERO=${nth_prepobsaero:-1} + export APRUN_PREPOBSAERO="${launcher} -n ${npe_prepobsaero} --cpus-per-task=${NTHREADS_PREPOBSAERO}" + elif [[ "${step}" = "snowanl" ]]; then nth_max=$((npe_node_max / npe_node_snowanl)) diff --git a/env/S4.env b/env/S4.env index 9ba3a61b01..8a368bf1d6 100755 --- a/env/S4.env +++ b/env/S4.env @@ -82,6 +82,13 @@ elif [[ "${step}" = "aeroanlrun" ]]; then [[ ${NTHREADS_AEROANL} -gt ${nth_max} ]] && export NTHREADS_AEROANL=${nth_max} export APRUN_AEROANL="${launcher} -n ${npe_aeroanlrun}" +elif [[ "${step}" = "prepobsaero" ]]; then + + nth_max=$((npe_node_max / npe_node_prepobsaero)) + + export NTHREADS_PREPOBSAERO=${nth_prepobsaero:-1} + export APRUN_PREPOBSAERO="${launcher} -n ${npe_prepobsaero} --cpus-per-task=${NTHREADS_PREPOBSAERO}" + elif [[ "${step}" = "snowanl" ]]; then nth_max=$((npe_node_max / npe_node_snowanl)) diff --git a/env/WCOSS2.env b/env/WCOSS2.env index 0876e4127d..9fe9179e6b 100755 --- a/env/WCOSS2.env +++ b/env/WCOSS2.env @@ -76,6 +76,13 @@ elif [[ "${step}" = "aeroanlrun" ]]; then [[ ${NTHREADS_AEROANL} -gt ${nth_max} ]] && export NTHREADS_AEROANL=${nth_max} export APRUN_AEROANL="${launcher} -n ${npe_aeroanlrun}" +elif [[ "${step}" = "prepobsaero" ]]; then + + nth_max=$((npe_node_max / npe_node_prepaeroobs)) + + export NTHREADS_PREPOBSAERO=${nth_prepobsaero:-1} + export APRUN_PREPOBSAERO="${launcher} -n ${npe_prepobsaero} --ppn ${npe_node_prepobsaero}--cpu-bind depth --depth=${NTHREADS_PREPOBSAERO}" + elif [[ "${step}" = "snowanl" ]]; then nth_max=$((npe_node_max / npe_node_snowanl)) diff --git a/jobs/JGLOBAL_PREP_OBS_AERO b/jobs/JGLOBAL_PREP_OBS_AERO new file mode 100755 index 0000000000..7fe701898f --- /dev/null +++ b/jobs/JGLOBAL_PREP_OBS_AERO @@ -0,0 +1,43 @@ +#! /usr/bin/env bash + +source "${HOMEgfs}/ush/preamble.sh" +source "${HOMEgfs}/ush/jjob_header.sh" -e "prepobsaero" -c "base prepobsaero" + +############################################## +# Set variables used in the script +############################################## + +export COMIN_OBS="${DATA}" +YMD=${PDY} HH=${cyc} declare_from_tmpl -rx COMOUT_OBS:COM_OBS_TMPL + +############################################## +# Begin JOB SPECIFIC work +############################################## + +############################################################### +# Run relevant script + +EXSCRIPT=${GDASPREPAEROOBSPY:-${SCRgfs}/exglobal_prep_obs_aero.py} +${EXSCRIPT} +status=$? +[[ ${status} -ne 0 ]] && exit "${status}" + + +############################################## +# End JOB SPECIFIC work +############################################## + +############################################## +# Final processing +############################################## +if [[ -e "${pgmout}" ]] ; then + cat "${pgmout}" +fi + +########################################## +# Remove the Temporary working directory +########################################## +cd "${DATAROOT}" || exit +[[ "${KEEPDATA}" = "NO" ]] && rm -rf "${DATA}" + +exit 0 diff --git a/jobs/rocoto/prepobsaero.sh b/jobs/rocoto/prepobsaero.sh new file mode 100755 index 0000000000..89da7547e8 --- /dev/null +++ b/jobs/rocoto/prepobsaero.sh @@ -0,0 +1,24 @@ +#! /usr/bin/env bash + +source "${HOMEgfs}/ush/preamble.sh" + +############################################################### +# Source UFSDA workflow modules +. "${HOMEgfs}/ush/load_ufsda_modules.sh" +status=$? +[[ ${status} -ne 0 ]] && exit "${status}" + +export job="prepobsaero" +export jobid="${job}.$$" + +############################################################### +# setup python path for workflow utilities and tasks +wxflowPATH="${HOMEgfs}/ush/python:${HOMEgfs}/ush/python/wxflow/src" +PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${wxflowPATH}" +export PYTHONPATH + +############################################################### +# Execute the JJOB +"${HOMEgfs}/jobs/JGLOBAL_PREP_OBS_AERO" +status=$? +exit "${status}" diff --git a/parm/archive/arcdir.yaml.j2 b/parm/archive/arcdir.yaml.j2 index fab93cc2a4..1ed7422761 100644 --- a/parm/archive/arcdir.yaml.j2 +++ b/parm/archive/arcdir.yaml.j2 @@ -47,6 +47,11 @@ Deterministic: &deterministic - ["{{ COM_CHEM_ANALYSIS }}/{{ head }}aerostat", "{{ ARCDIR }}/aerostat.{{ RUN }}.{{ cycle_YMDH }}"] {% endif %} + {% if DO_PREP_OBS_AERO %} + - ["{{ COM_OBS }}/{{ head }}aeroobs", "{{ ARCDIR }}/aeroobs.{{ RUN }}.{{ cycle_YMDH }}"] + - ["{{ COM_OBS }}/{{ head }}aerorawobs", "{{ ARCDIR }}/aerorawobs.{{ RUN }}.{{ cycle_YMDH }}"] + {% endif %} + {% endif %} {% if RUN == "gfs" %} diff --git a/parm/archive/gdas.yaml.j2 b/parm/archive/gdas.yaml.j2 index fd5e074111..26540156cd 100644 --- a/parm/archive/gdas.yaml.j2 +++ b/parm/archive/gdas.yaml.j2 @@ -69,6 +69,10 @@ gdas: {% if AERO_ANL_CDUMP == "gdas" or AERO_ANL_CDUMP == "both" %} - "{{ COM_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" {% endif %} + {% if DO_PREP_OBS_AERO %} + - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}aeroobs" + - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}aerorawobs" + {% endif %} {% if DO_JEDISNOWDA %} - "{{ COM_SNOW_ANALYSIS | relpath(ROTDIR) }}/{{ head }}snowstat.tgz" {% endif %} diff --git a/parm/archive/gfsa.yaml.j2 b/parm/archive/gfsa.yaml.j2 index df90a1a71e..0a8e65d3ef 100644 --- a/parm/archive/gfsa.yaml.j2 +++ b/parm/archive/gfsa.yaml.j2 @@ -40,6 +40,10 @@ gfsa: {% if AERO_ANL_CDUMP == "gfs" or AERO_ANL_CDUMP == "both" %} - "{{ COM_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" {% endif %} + {% if DO_PREP_OBS_AERO %} + - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}aeroobs" + - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}aerorawobs" + {% endif %} # BUFR inputs - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}nsstbufr" diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base index 6cc1b6d744..fd1ffdc415 100644 --- a/parm/config/gfs/config.base +++ b/parm/config/gfs/config.base @@ -178,6 +178,7 @@ export DO_WAVE="NO" export DO_OCN="NO" export DO_ICE="NO" export DO_AERO="NO" +export DO_PREP_OBS_AERO="NO" export AERO_FCST_CDUMP="" # When to run aerosol forecast: gdas, gfs, or both export AERO_ANL_CDUMP="" # When to run aerosol analysis: gdas, gfs, or both export WAVE_CDUMP="" # When to include wave suite: gdas, gfs, or both diff --git a/parm/config/gfs/config.prepobsaero b/parm/config/gfs/config.prepobsaero new file mode 100644 index 0000000000..f70138991c --- /dev/null +++ b/parm/config/gfs/config.prepobsaero @@ -0,0 +1,17 @@ +#!/bin/bash -x + +########## config.prepobsaero ########## +# Prepare and thin/superob aerosol observations + +echo "BEGIN: config.prepobsaero" + +# Get task specific resources +source "${EXPDIR}/config.resources" prepobsaero + +export OBSPROCYAML="${PARMgfs}/gdas/aero/obs/lists/gdas_aero_obsproc.yaml.j2" +export OBSPROCEXE="${EXECgfs}/gdas_obsprovider2ioda.x" +export VIIRS_DATA_DIR="/scratch2/NCEPDEV/stmp3/Yaping.Wang/VIIRS/AWS/" +export SENSORS="npp,n20" + + +echo "END: config.prepaeroobs" diff --git a/parm/config/gfs/config.resources b/parm/config/gfs/config.resources index 0972f74f9c..1d1fd2e3c1 100644 --- a/parm/config/gfs/config.resources +++ b/parm/config/gfs/config.resources @@ -13,7 +13,7 @@ if (( $# != 1 )); then echo "atmanlinit atmanlvar atmanlfv3inc atmanlfinal" echo "atmensanlinit atmensanlletkf atmensanlfv3inc atmensanlfinal" echo "snowanl" - echo "aeroanlinit aeroanlrun aeroanlfinal" + echo "prepobsaero aeroanlinit aeroanlrun aeroanlfinal" echo "anal sfcanl analcalc analdiag fcst echgres" echo "upp atmos_products" echo "tracker genesis genesis_fsu" @@ -289,6 +289,14 @@ case ${step} in export npe_node_snowanl=$(( npe_node_max / nth_snowanl )) ;; + "prepobsaero") + export wtime_prepobsaero="00:30:00" + export npe_prepobsaero=1 + export nth_prepobsaero=1 + export npe_node_prepobsaero=1 + export memory_prepobsaero="96GB" + ;; + "aeroanlinit") # below lines are for creating JEDI YAML case ${CASE} in diff --git a/scripts/exglobal_archive.py b/scripts/exglobal_archive.py index e38d0abf72..bcd8d522d9 100755 --- a/scripts/exglobal_archive.py +++ b/scripts/exglobal_archive.py @@ -19,8 +19,8 @@ def main(): # Pull out all the configuration keys needed to run the rest of archive steps keys = ['ATARDIR', 'current_cycle', 'FHMIN', 'FHMAX', 'FHOUT', 'RUN', 'PDY', - 'DO_VERFRAD', 'DO_VMINMON', 'DO_VERFOZN', 'DO_ICE', 'DO_AERO', 'PARMgfs', - 'DO_OCN', 'DO_WAVE', 'WRITE_DOPOST', 'PSLOT', 'HPSSARCH', 'DO_MOS', + 'DO_VERFRAD', 'DO_VMINMON', 'DO_VERFOZN', 'DO_ICE', 'DO_AERO', 'DO_PREP_OBS_AERO', + 'PARMgfs', 'DO_OCN', 'DO_WAVE', 'WRITE_DOPOST', 'PSLOT', 'HPSSARCH', 'DO_MOS', 'DO_JEDISNOWDA', 'LOCALARCH', 'REALTIME', 'ROTDIR', 'ARCH_WARMICFREQ', 'ARCH_FCSTICFREQ', 'ARCH_CYC', 'assim_freq', 'ARCDIR', 'SDATE', 'FHMIN_GFS', 'FHMAX_GFS', 'FHOUT_GFS', 'ARCH_GAUSSIAN', 'MODE', diff --git a/scripts/exglobal_prep_obs_aero.py b/scripts/exglobal_prep_obs_aero.py new file mode 100755 index 0000000000..08548e6874 --- /dev/null +++ b/scripts/exglobal_prep_obs_aero.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +# exglobal_prep_obs_aero.py +# This script collect available viirs +# obs files, combine and preprocess +# them. +import os + +from wxflow import Logger, cast_strdict_as_dtypedict +from pygfs.task.aero_prepobs import AerosolObsPrep + +# Initialize root logger +logger = Logger(level='DEBUG', colored_log=True) + + +if __name__ == '__main__': + + # Take configuration from environment and cast it as python dictionary + config = cast_strdict_as_dtypedict(os.environ) + + AeroObs = AerosolObsPrep(config) + AeroObs.initialize() + AeroObs.runConverter() + AeroObs.finalize() diff --git a/ush/python/pygfs/task/aero_prepobs.py b/ush/python/pygfs/task/aero_prepobs.py new file mode 100644 index 0000000000..f2344241a9 --- /dev/null +++ b/ush/python/pygfs/task/aero_prepobs.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python3 + +import os +import glob +import gzip +import tarfile +import re +from logging import getLogger +from typing import List, Dict, Any, Union + +from wxflow import (AttrDict, FileHandler, rm_p, rmdir, + Task, add_to_datetime, to_timedelta, to_datetime, + datetime_to_YMD, + chdir, Executable, WorkflowException, + parse_j2yaml, save_as_yaml, logit) + +logger = getLogger(__name__.split('.')[-1]) + + +class AerosolObsPrep(Task): + """ + Class for preparing and managing aerosol observations + """ + def __init__(self, config: Dict[str, Any]) -> None: + super().__init__(config) + + _window_begin = add_to_datetime(self.runtime_config.current_cycle, -to_timedelta(f"{self.config['assim_freq']}H") / 2) + _window_end = add_to_datetime(self.runtime_config.current_cycle, +to_timedelta(f"{self.config['assim_freq']}H") / 2) + + local_dict = AttrDict( + { + 'window_begin': _window_begin, + 'window_end': _window_end, + 'sensors': str(self.config['SENSORS']).split(','), + 'data_dir': self.config['VIIRS_DATA_DIR'], + 'input_files': '', + 'OPREFIX': f"{self.runtime_config.RUN}.t{self.runtime_config.cyc:02d}z.", + 'APREFIX': f"{self.runtime_config.RUN}.t{self.runtime_config.cyc:02d}z." + } + ) + + # task_config is everything that this task should need + self.task_config = AttrDict(**self.config, **self.runtime_config, **local_dict) + + @logit(logger) + def initialize(self) -> None: + """ + List needed raw obs files. + Copy the raw obs files to $DATA/obs. + Link over the needed executable. + Generate corresponding YAML file. + Run IODA converter. + """ + self.task_config.DATA_OBS = os.path.join(self.task_config.DATA, 'obs') + if os.path.exists(self.task_config.DATA_OBS): + rmdir(self.task_config.DATA_OBS) + FileHandler({'mkdir': [self.task_config.DATA_OBS]}).sync() + + self.task_config.prepaero_yaml = [] + for sensor in self.task_config.sensors: + raw_files = self.list_raw_files(sensor) + self.task_config.input_files = self.copy_obs(raw_files) + self.link_obsconvexe() + self.task_config.prepaero_config = self.get_obsproc_config(sensor) + + # generate converter YAML file + template = f"{self.runtime_config.CDUMP}.t{self.runtime_config['cyc']:02d}z.prepaero_viirs_{sensor}.yaml" + _prepaero_yaml = os.path.join(self.runtime_config.DATA, template) + self.task_config.prepaero_yaml.append(_prepaero_yaml) + logger.debug(f"Generate PrepAeroObs YAML file: {_prepaero_yaml}") + save_as_yaml(self.task_config.prepaero_config, _prepaero_yaml) + logger.info(f"Wrote PrepAeroObs YAML to: {_prepaero_yaml}") + + @logit(logger) + def list_raw_files(self, sensor) -> List[str]: + """ + List all files in the predefined directory that match the predefined sensor and within the time window. + """ + if sensor == 'n20': + sensor = 'j01' + dir1 = os.path.join(self.task_config.data_dir, datetime_to_YMD(self.task_config.window_begin)) + dir2 = os.path.join(self.task_config.data_dir, datetime_to_YMD(self.task_config.window_end)) + + if dir1 == dir2: + files = os.listdir(dir1) + allfiles = [os.path.join(dir1, file) for file in files] + allfiles.sort() + else: + files_1 = os.listdir(dir1) + allfiles_1 = [os.path.join(dir1, file) for file in files_1] + files_2 = os.listdir(dir2) + allfiles_2 = [os.path.join(dir2, file) for file in files_2] + allfiles = sorted(allfiles_1, allfiles_2) + matching_files = [] + try: + for file in allfiles: + basename = os.path.basename(file) + pattern = r"s(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{3})" + match = re.match(pattern, basename.split('_')[3]) + yyyy, mm, dd, HH, MM = match.group(1), match.group(2), match.group(3), match.group(4), match.group(5) + fstart = to_datetime(f'{yyyy}-{mm}-{dd}T{HH}:{MM}Z') + if sensor == basename.split('_')[2]: + # temporally select obs files based on time stamp in the filename. + if (fstart > self.task_config.window_begin) and (fstart < self.task_config.window_end): + matching_files.append(os.path.join(self.task_config.data_dir, file)) + logger.info("Found %d matching files.", len(matching_files)) + except FileNotFoundError: + logger.error("The specified file/directory does not exist.") + raise + return matching_files + + @logit(logger) + def copy_obs(self, inputfiles) -> Dict[str, Any]: + """ + Copy the raw obs files to $DATA/obs. + """ + copylist = [] + destlist = [] + for filename in inputfiles: + basename = os.path.basename(filename) + dest = os.path.join(self.task_config.DATA_OBS, basename) + copylist.append([filename, dest]) + destlist.append(dest) + FileHandler({'copy': copylist}).sync() + + return destlist + + @logit(logger) + def get_obsproc_config(self, sensor) -> Dict[str, Any]: + """ + Compile a dictionary of obs proc configuration from OBSPROCYAML template file + Parameters + ---------- + Returns + ---------- + obsproc_config : Dict + a dictionary containing the fully rendered obs proc yaml configuration + """ + self.task_config.sensor = sensor + # generate JEDI YAML file + logger.info(f"Generate gdas_obsprovider2ioda YAML config: {self.task_config.OBSPROCYAML}") + prepaero_config = parse_j2yaml(self.task_config.OBSPROCYAML, self.task_config) + + return prepaero_config + + @logit(logger) + def link_obsconvexe(self) -> None: + """ + This method links the gdas executable to the run directory + Parameters + ---------- + Task: GDAS task + Returns + ---------- + None + """ + exe_src = self.task_config.OBSPROCEXE + + logger.info(f"Link executable {exe_src} to DATA/") + exe_dest = os.path.join(self.task_config.DATA, os.path.basename(exe_src)) + if os.path.exists(exe_dest): + rm_p(exe_dest) + os.symlink(exe_src, exe_dest) + + return + + @logit(logger) + def runConverter(self) -> None: + """ + Run the IODA converter gdas_obsprovider2ioda.x + """ + chdir(self.task_config.DATA) + exec_cmd = Executable(self.task_config.APRUN_PREPOBSAERO) + exec_name = os.path.join(self.task_config.DATA, 'gdas_obsprovider2ioda.x') + exec_cmd.add_default_arg(exec_name) + + for prepaero_yaml in self.task_config.prepaero_yaml: + try: + logger.debug(f"Executing {exec_cmd} on {prepaero_yaml}") + exec_cmd(f"{prepaero_yaml}") + except OSError: + raise OSError(f"Failed to execute {exec_cmd} on {prepaero_yaml}") + except Exception: + raise WorkflowException(f"An error occured during execution of {exec_cmd} on {prepaero_yaml}") + + pass + + @logit(logger) + def finalize(self) -> None: + """ + Copy the output viirs files to COMIN_OBS. + Tar and archive the output files. + Tar and archive the raw obs files. + """ + # get list of viirs files + obsfiles = glob.glob(os.path.join(self.task_config['DATA'], '*viirs*nc4')) + copylist = [] + for obsfile in obsfiles: + basename = os.path.basename(obsfile) + src = os.path.join(self.task_config['DATA'], basename) + dest = os.path.join(self.task_config.COMOUT_OBS, basename) + copylist.append([src, dest]) + FileHandler({'copy': copylist}).sync() + + # gzip the files first + for obsfile in obsfiles: + with open(obsfile, 'rb') as f_in, gzip.open(f"{obsfile}.gz", 'wb') as f_out: + f_out.writelines(f_in) + + aeroobs = os.path.join(self.task_config.COMOUT_OBS, f"{self.task_config['APREFIX']}aeroobs") + # open tar file for writing + with tarfile.open(aeroobs, "w") as archive: + for obsfile in obsfiles: + aeroobsgzip = f"{obsfile}.gz" + archive.add(aeroobsgzip, arcname=os.path.basename(aeroobsgzip)) + # get list of raw viirs L2 files + rawfiles = glob.glob(os.path.join(self.task_config.DATA_OBS, 'JRR-AOD*')) + # gzip the raw L2 files first + for rawfile in rawfiles: + with open(rawfile, 'rb') as f_in, gzip.open(f"{rawfile}.gz", 'wb') as f_out: + f_out.writelines(f_in) + + aerorawobs = os.path.join(self.task_config.COMOUT_OBS, f"{self.task_config['APREFIX']}aerorawobs") + # open tar file for writing + with tarfile.open(aerorawobs, "w") as archive: + for rawfile in rawfiles: + aerorawobsgzip = f"{rawfile}.gz" + archive.add(aerorawobsgzip, arcname=os.path.basename(aerorawobsgzip)) + copylist = [] + for prepaero_yaml in self.task_config.prepaero_yaml: + basename = os.path.basename(prepaero_yaml) + dest = os.path.join(self.task_config.COMOUT_OBS, basename) + copylist.append([prepaero_yaml, dest]) + FileHandler({'copy': copylist}).sync() + + pass diff --git a/workflow/applications/applications.py b/workflow/applications/applications.py index 50a9a7cdd0..6a4d240fe5 100644 --- a/workflow/applications/applications.py +++ b/workflow/applications/applications.py @@ -51,6 +51,7 @@ def __init__(self, conf: Configuration) -> None: self.do_ocean = _base.get('DO_OCN', False) self.do_ice = _base.get('DO_ICE', False) self.do_aero = _base.get('DO_AERO', False) + self.do_prep_obs_aero = _base.get('DO_PREP_OBS_AERO', False) self.do_bufrsnd = _base.get('DO_BUFRSND', False) self.do_gempak = _base.get('DO_GEMPAK', False) self.do_awips = _base.get('DO_AWIPS', False) diff --git a/workflow/applications/gfs_cycled.py b/workflow/applications/gfs_cycled.py index f7f9b5b5e6..175ddb07bf 100644 --- a/workflow/applications/gfs_cycled.py +++ b/workflow/applications/gfs_cycled.py @@ -108,6 +108,8 @@ def _get_app_configs(self): if self.do_aero: configs += ['aeroanlinit', 'aeroanlrun', 'aeroanlfinal'] + if self.do_prep_obs_aero: + configs += ['prepobsaero'] if self.do_jedisnowda: configs += ['prepsnowobs', 'snowanl'] @@ -178,6 +180,8 @@ def get_task_names(self): if self.do_aero and 'gdas' in self.aero_anl_cdumps: gdas_tasks += ['aeroanlinit', 'aeroanlrun', 'aeroanlfinal'] + if self.do_prep_obs_aero: + gdas_tasks += ['prepobsaero'] gdas_tasks += ['atmanlupp', 'atmanlprod', 'fcst'] @@ -215,6 +219,8 @@ def get_task_names(self): if self.do_aero and 'gfs' in self.aero_anl_cdumps: gfs_tasks += ['aeroanlinit', 'aeroanlrun', 'aeroanlfinal'] + if self.do_prep_obs_aero: + gfs_tasks += ['prepobsaero'] gfs_tasks += ['atmanlupp', 'atmanlprod', 'fcst'] diff --git a/workflow/rocoto/gfs_tasks.py b/workflow/rocoto/gfs_tasks.py index fa218c6713..0fd468b3b4 100644 --- a/workflow/rocoto/gfs_tasks.py +++ b/workflow/rocoto/gfs_tasks.py @@ -483,10 +483,35 @@ def atmanlfinal(self): return task + def prepobsaero(self): + deps = [] + dep_dict = {'type': 'task', 'name': f'{self.cdump}prep'} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) + + resources = self.get_resource('prepobsaero') + task_name = f'{self.cdump}prepobsaero' + task_dict = {'task_name': task_name, + 'resources': resources, + 'dependency': dependencies, + 'envars': self.envars, + 'cycledef': self.cdump.replace('enkf', ''), + 'command': f'{self.HOMEgfs}/jobs/rocoto/prepobsaero.sh', + 'job_name': f'{self.pslot}_{task_name}_@H', + 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log', + 'maxtries': '&MAXTRIES;' + } + + task = rocoto.create_task(task_dict) + + return task + def aeroanlinit(self): deps = [] dep_dict = {'type': 'task', 'name': f'{self.cdump}prep'} + if self.app_config.do_prep_obs_aero: + dep_dict = {'type': 'task', 'name': f'{self.cdump}prepobsaero'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) From 5af325a6a4e0a14d180514a418603ca79fada487 Mon Sep 17 00:00:00 2001 From: Dan Holdaway <27729500+danholdaway@users.noreply.github.com> Date: Fri, 14 Jun 2024 18:05:23 -0400 Subject: [PATCH 37/45] Update GDASapp hash to move JCB into GDASapp (#2665) This PR moves JCB into GDASapp. The PR also bumps up the hash of GDASapp to what is in `feature/move_jcb`, which at time of writing is develop plus the absorption of JCB into GDASapp. Note that I also took the changes from https://github.com/NOAA-EMC/global-workflow/pull/2641 to follow the testing @RussTreadon-NOAA has done. --- .gitmodules | 4 ---- sorc/gdas.cd | 2 +- sorc/jcb | 1 - sorc/link_workflow.sh | 10 +++++++++- 4 files changed, 10 insertions(+), 7 deletions(-) delete mode 160000 sorc/jcb diff --git a/.gitmodules b/.gitmodules index 1c3b7acfa5..5c9e569243 100644 --- a/.gitmodules +++ b/.gitmodules @@ -26,7 +26,3 @@ [submodule "sorc/gsi_monitor.fd"] path = sorc/gsi_monitor.fd url = https://github.com/NOAA-EMC/GSI-Monitor.git -[submodule "sorc/jcb"] - path = sorc/jcb - url = https://github.com/noaa-emc/jcb - fetchRecurseSubmodules = false diff --git a/sorc/gdas.cd b/sorc/gdas.cd index 2bd8ffc149..368c9c5db9 160000 --- a/sorc/gdas.cd +++ b/sorc/gdas.cd @@ -1 +1 @@ -Subproject commit 2bd8ffc149f30c0ae0f8e1508477a8dc88c46a65 +Subproject commit 368c9c5db9b5ea62e72937b6d1b0f753adb9be40 diff --git a/sorc/jcb b/sorc/jcb deleted file mode 160000 index f62b9df37f..0000000000 --- a/sorc/jcb +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f62b9df37f131c9ff68b62eb6e19c1109c314cf0 diff --git a/sorc/link_workflow.sh b/sorc/link_workflow.sh index 1f0de0745c..4973ab8d7d 100755 --- a/sorc/link_workflow.sh +++ b/sorc/link_workflow.sh @@ -87,13 +87,21 @@ source "${HOMEgfs}/versions/fix.ver" # Link python pacakges in ush/python # TODO: This will be unnecessary when these are part of the virtualenv -packages=("wxflow" "jcb") +packages=("wxflow") for package in "${packages[@]}"; do cd "${HOMEgfs}/ush/python" || exit 1 [[ -s "${package}" ]] && rm -f "${package}" ${LINK} "${HOMEgfs}/sorc/${package}/src/${package}" . done +# Link GDASapp python packages in ush/python +packages=("jcb") +for package in "${packages[@]}"; do + cd "${HOMEgfs}/ush/python" || exit 1 + [[ -s "${package}" ]] && rm -f "${package}" + ${LINK} "${HOMEgfs}/sorc/gdas.cd/sorc/${package}/src/${package}" . +done + # Link wxflow in workflow and ci/scripts # TODO: This will be unnecessary when wxflow is part of the virtualenv cd "${HOMEgfs}/workflow" || exit 1 From 38f2df9fb0c074b1f80d3c637080be79be693161 Mon Sep 17 00:00:00 2001 From: David Huber <69919478+DavidHuber-NOAA@users.noreply.github.com> Date: Mon, 17 Jun 2024 17:12:55 +0000 Subject: [PATCH 38/45] Optimize wavepostpnt (#2657) Optimize the gfswavepostpnt, gfswavepostbndpntbll, and gfswavepostbndpnt jobs This is done by 1) reducing the number of calls to `sed`, `awk`, `grep`, and `cat` by - performing operations on all files at once instead of looping over each file - removing piped `cat` calls (e.g. `cat | sed 'something'`) - combining `sed` and `grep` calls when possible - adding logic to `awk` calls instead of handling that logic in bash 2) minimizing as much as possible the amount of data on disk that has to be read in (e.g. limiting sed to read only the line numbers it needs) --------- Co-authored-by: Walter Kolczynski - NOAA --- parm/config/gefs/config.resources | 2 +- parm/config/gefs/config.wave | 2 +- parm/config/gfs/config.resources | 2 +- parm/config/gfs/config.wave | 2 +- scripts/exgfs_wave_post_pnt.sh | 60 +++++++++++++++---------------- ush/wave_outp_spec.sh | 39 ++++++++------------ workflow/rocoto/gefs_tasks.py | 7 ++-- workflow/rocoto/gfs_tasks.py | 6 +++- 8 files changed, 58 insertions(+), 62 deletions(-) diff --git a/parm/config/gefs/config.resources b/parm/config/gefs/config.resources index 04d55ae082..b2ca5b3e51 100644 --- a/parm/config/gefs/config.resources +++ b/parm/config/gefs/config.resources @@ -255,7 +255,7 @@ case ${step} in # The wavepost*pnt* jobs are I/O heavy and do not scale well to large nodes. # Limit the number of tasks/node to 40. "wavepostbndpnt") - export wtime_wavepostbndpnt="01:00:00" + export wtime_wavepostbndpnt="03:00:00" export npe_wavepostbndpnt=240 export nth_wavepostbndpnt=1 export npe_node_wavepostbndpnt=$(( npe_node_max / nth_wavepostbndpnt )) diff --git a/parm/config/gefs/config.wave b/parm/config/gefs/config.wave index b61a2f6e54..bef3437adf 100644 --- a/parm/config/gefs/config.wave +++ b/parm/config/gefs/config.wave @@ -87,7 +87,7 @@ export WAVEWND_FID= # The start time reflects the number of hindcast hours prior to the cycle initial time export WAVHINDH=0 export FHMAX_WAV_IBP=180 -if (( FHMAX_WAV < FHMAX_WAV_IBP )); then export FHMAX_WAV_IBP=${FHMAX_GFS} ; fi +if (( FHMAX_WAV < FHMAX_WAV_IBP )); then export FHMAX_WAV_IBP=${FHMAX_WAV} ; fi # gridded and point output rate export DTFLD_WAV=$(( FHOUT_HF_WAV * 3600 )) diff --git a/parm/config/gfs/config.resources b/parm/config/gfs/config.resources index 1d1fd2e3c1..e5f741cf7e 100644 --- a/parm/config/gfs/config.resources +++ b/parm/config/gfs/config.resources @@ -144,7 +144,7 @@ case ${step} in # The wavepost*pnt* jobs are I/O heavy and do not scale well to large nodes. # Limit the number of tasks/node to 40. "wavepostbndpnt") - export wtime_wavepostbndpnt="01:00:00" + export wtime_wavepostbndpnt="03:00:00" export npe_wavepostbndpnt=240 export nth_wavepostbndpnt=1 export npe_node_wavepostbndpnt=$(( npe_node_max / nth_wavepostbndpnt )) diff --git a/parm/config/gfs/config.wave b/parm/config/gfs/config.wave index 7253ef1396..568aeb1e1c 100644 --- a/parm/config/gfs/config.wave +++ b/parm/config/gfs/config.wave @@ -102,7 +102,7 @@ if [[ "${RUN}" == "gfs" ]]; then fi export WAVHINDH=0 export FHMAX_WAV_IBP=180 -if (( FHMAX_WAV < FHMAX_WAV_IBP )); then export FHMAX_WAV_IBP=${FHMAX_GFS} ; fi +if (( FHMAX_WAV < FHMAX_WAV_IBP )); then export FHMAX_WAV_IBP=${FHMAX_WAV} ; fi # gridded and point output rate export DTFLD_WAV=$(( FHOUT_HF_WAV * 3600 )) diff --git a/scripts/exgfs_wave_post_pnt.sh b/scripts/exgfs_wave_post_pnt.sh index 56cb83be21..93bdbeaf32 100755 --- a/scripts/exgfs_wave_post_pnt.sh +++ b/scripts/exgfs_wave_post_pnt.sh @@ -290,14 +290,14 @@ source "${USHgfs}/preamble.sh" fi # Create new buoy_log.ww3 - cat buoy.loc | awk '{print $3}' | sed 's/'\''//g' > ibp_tags + awk '{print $3}' buoy.loc | sed 's/'\''//g' > ibp_tags grep -F -f ibp_tags buoy_log.ww3 > buoy_log.tmp rm -f buoy_log.dat mv buoy_log.tmp buoy_log.dat grep -F -f ibp_tags buoy_lst.loc > buoy_tmp1.loc #sed '$d' buoy_tmp1.loc > buoy_tmp2.loc - buoys=$(awk '{ print $1 }' buoy_tmp1.loc) + awk '{ print $1 }' buoy_tmp1.loc > buoy_lst.txt Nb=$(wc buoy_tmp1.loc | awk '{ print $1 }') rm -f buoy_tmp1.loc @@ -350,6 +350,8 @@ source "${USHgfs}/preamble.sh" # 1.a.2 Loop over forecast time to generate post files fhr=$FHMIN_WAV + # Generated sed-searchable paths + escaped_USHgfs="${USHgfs//\//\\\/}" while [ $fhr -le $FHMAX_WAV_PNT ]; do echo " Creating the wave point scripts at : $(date)" @@ -366,6 +368,7 @@ source "${USHgfs}/preamble.sh" # Create instances of directories for spec and gridded output export SPECDATA=${DATA}/output_$YMDHMS + escaped_SPECDATA="${SPECDATA//\//\\\/}" export BULLDATA=${DATA}/output_$YMDHMS cp $DATA/mod_def.${waveuoutpGRD} mod_def.${waveuoutpGRD} @@ -386,19 +389,15 @@ source "${USHgfs}/preamble.sh" if [ "$DOSPC_WAV" = 'YES' ] then export dtspec=3600. - for buoy in $buoys - do - echo "${USHgfs}/wave_outp_spec.sh $buoy $ymdh spec $SPECDATA > $SPECDATA/spec_$buoy.out 2>&1" >> tmpcmdfile.$FH3 - done + # Construct the wave_outp_spec (spec) command to run on each buoy in buoy_lst.txt + sed "s/^\(.*\)$/${escaped_USHgfs}\/wave_outp_spec.sh \1 ${ymdh} spec ${escaped_SPECDATA} > ${escaped_SPECDATA}\/spec_\1.out 2>\&1/" buoy_lst.txt >> "tmpcmdfile.${FH3}" fi if [ "$DOBLL_WAV" = 'YES' ] then export dtspec=3600. - for buoy in $buoys - do - echo "${USHgfs}/wave_outp_spec.sh $buoy $ymdh bull $SPECDATA > $SPECDATA/bull_$buoy.out 2>&1" >> tmpcmdfile.$FH3 - done + # Construct the wave_outp_spec (bull) command to run on each buoy in buoy_lst.txt + sed "s/^\(.*\)$/${escaped_USHgfs}\/wave_outp_spec.sh \1 ${ymdh} bull ${escaped_SPECDATA} > ${escaped_SPECDATA}\/bull_\1.out 2>\&1/" buoy_lst.txt >> "tmpcmdfile.${FH3}" fi split -n l/1/10 tmpcmdfile.$FH3 > cmdfile.${FH3}.01 @@ -504,27 +503,24 @@ source "${USHgfs}/preamble.sh" cd $DATA - echo "Before create cmdfile for cat bouy : $(date)" - rm -f cmdfile.bouy - touch cmdfile.bouy - chmod 744 cmdfile.bouy + echo "Before create cmdfile for cat buoy : $(date)" + rm -f cmdfile.buoy + touch cmdfile.buoy + chmod 744 cmdfile.buoy CATOUTDIR=${DATA}/pnt_cat_out + escaped_CATOUTDIR="${CATOUTDIR//\//\\\/}" mkdir -p ${CATOUTDIR} if [ "$DOSPC_WAV" = 'YES' ] then - for buoy in $buoys - do - echo "${USHgfs}/wave_outp_cat.sh $buoy $FHMAX_WAV_PNT spec > ${CATOUTDIR}/spec_cat_$buoy.out 2>&1" >> cmdfile.bouy - done + # Construct wave_outp_cat (spec) call for each buoy in buoy_lst.txt + sed "s/^\(.*\)$/${escaped_USHgfs}\/wave_outp_cat.sh \1 ${FHMAX_WAV_PNT} spec > ${escaped_CATOUTDIR}\/spec_cat_\1.out 2>\&1/" buoy_lst.txt >> cmdfile.buoy fi if [ "$DOBLL_WAV" = 'YES' ] then - for buoy in $buoys - do - echo "${USHgfs}/wave_outp_cat.sh $buoy $FHMAX_WAV_PNT bull > ${CATOUTDIR}/bull_cat_$buoy.out 2>&1" >> cmdfile.bouy - done + # Construct wave_outp_cat (bull) call for each buoy in buoy_lst.txt + sed "s/^\(.*\)$/${escaped_USHgfs}\/wave_outp_cat.sh \1 ${FHMAX_WAV_PNT} bull > ${escaped_CATOUTDIR}\/bull_cat_\1.out 2>\&1/" buoy_lst.txt >> cmdfile.buoy fi if [ ${CFP_MP:-"NO"} = "YES" ]; then @@ -532,18 +528,18 @@ source "${USHgfs}/preamble.sh" ifile=0 iline=1 ifirst='yes' - nlines=$( wc -l cmdfile.bouy | awk '{print $1}' ) + nlines=$( wc -l < cmdfile.buoy) while [ $iline -le $nlines ]; do - line=$( sed -n ''$iline'p' cmdfile.bouy ) + line=$( sed -n ''$iline'p' cmdfile.buoy ) if [ -z "$line" ]; then break else if [ "$ifirst" = 'yes' ]; then - echo "#!/bin/sh" > cmdfile.bouy.$nfile - echo "$nfile cmdfile.bouy.$nfile" >> cmdmprogbouy - chmod 744 cmdfile.bouy.$nfile + echo "#!/bin/sh" > cmdfile.buoy.$nfile + echo "$nfile cmdfile.buoy.$nfile" >> cmdmprogbuoy + chmod 744 cmdfile.buoy.$nfile fi - echo $line >> cmdfile.bouy.$nfile + echo $line >> cmdfile.buoy.$nfile nfile=$(( nfile + 1 )) if [ $nfile -eq $NTASKS ]; then nfile=0 @@ -554,7 +550,7 @@ source "${USHgfs}/preamble.sh" done fi - wavenproc=$(wc -l cmdfile.bouy | awk '{print $1}') + wavenproc=$(wc -l < cmdfile.buoy) wavenproc=$(echo $((${wavenproc}<${NTASKS}?${wavenproc}:${NTASKS}))) set +x @@ -567,9 +563,11 @@ source "${USHgfs}/preamble.sh" if [ "$wavenproc" -gt '1' ] then if [ ${CFP_MP:-"NO"} = "YES" ]; then - ${wavempexec} -n ${wavenproc} ${wave_mpmd} cmdmprogbouy + # shellcheck disable=SC2086 + ${wavempexec} -n "${wavenproc}" ${wave_mpmd} cmdmprogbuoy else - ${wavempexec} ${wavenproc} ${wave_mpmd} cmdfile.bouy + # shellcheck disable=SC2086 + ${wavempexec} "${wavenproc}" ${wave_mpmd} cmdfile.buoy fi exit=$? else diff --git a/ush/wave_outp_spec.sh b/ush/wave_outp_spec.sh index 159d0eb2cf..37accbae49 100755 --- a/ush/wave_outp_spec.sh +++ b/ush/wave_outp_spec.sh @@ -74,21 +74,7 @@ source "${USHgfs}/preamble.sh" exit 1 else buoy=$bloc - grep $buoy ${DATA}/buoy_log.ww3 > tmp_list.loc - while read line - do - buoy_name=$(echo $line | awk '{print $2}') - if [ $buoy = $buoy_name ] - then - point=$(echo $line | awk '{ print $1 }') - set +x - echo " Location ID/# : $buoy (${point})" - echo " Spectral output start time : $ymdh " - echo ' ' - set_trace - break - fi - done < tmp_list.loc + point=$(awk "{if (\$2 == \"${buoy}\"){print \$1; exit} }" "${DATA}/buoy_log.ww3") if [ -z "$point" ] then set +x @@ -98,6 +84,11 @@ source "${USHgfs}/preamble.sh" echo ' ' set_trace exit 2 + else + set +x + echo " Location ID/# : $buoy (${point})" + echo " Spectral output start time : $ymdh " + echo ' ' fi fi @@ -201,27 +192,27 @@ source "${USHgfs}/preamble.sh" then if [ "$specdir" = "bull" ] then - cat $outfile | sed -e '9,$d' >> ${STA_DIR}/${specdir}fhr/$WAV_MOD_TAG.${ymdh}.$buoy.bull - cat $coutfile | sed -e '8,$d' >> ${STA_DIR}/c${specdir}fhr/$WAV_MOD_TAG.${ymdh}.$buoy.cbull + sed '9,$d' "${outfile}" >> "${STA_DIR}/${specdir}fhr/${WAV_MOD_TAG}.${ymdh}.${buoy}.bull" + sed '8,$d' "${coutfile}" >> "${STA_DIR}/c${specdir}fhr/${WAV_MOD_TAG}.${ymdh}.${buoy}.cbull" else - cat $outfile >> ${STA_DIR}/${specdir}fhr/$WAV_MOD_TAG.${ymdh}.$buoy.spec + cat $outfile >> "${STA_DIR}/${specdir}fhr/${WAV_MOD_TAG}.${ymdh}.${buoy}.spec" fi elif [ "${ymdh}" = "${YMDHE}" ] then if [ "$specdir" = "bull" ] then - cat $outfile | sed -e '1,7d' >> ${STA_DIR}/${specdir}fhr/$WAV_MOD_TAG.${ymdh}.$buoy.bull - cat $coutfile | sed -e '1,6d' >> ${STA_DIR}/c${specdir}fhr/$WAV_MOD_TAG.${ymdh}.$buoy.cbull + sed '1,7d' "${outfile}" >> "${STA_DIR}/${specdir}fhr/${WAV_MOD_TAG}.${ymdh}.${buoy}.bull" + sed '1,6d' "${coutfile}" >> "${STA_DIR}/c${specdir}fhr/${WAV_MOD_TAG}.${ymdh}.${buoy}.cbull" else - cat $outfile | sed -n "/^${YMD} ${HMS}$/,\$p" >> ${STA_DIR}/${specdir}fhr/$WAV_MOD_TAG.${ymdh}.$buoy.spec + sed -n "/^${YMD} ${HMS}$/,\$p" "${outfile}" >> "${STA_DIR}/${specdir}fhr/${WAV_MOD_TAG}.${ymdh}.${buoy}.spec" fi else if [ "$specdir" = "bull" ] then - cat $outfile | sed -e '1,7d' | sed -e '2,$d' >> ${STA_DIR}/${specdir}fhr/$WAV_MOD_TAG.${ymdh}.$buoy.bull - cat $coutfile | sed -e '1,6d' | sed -e '2,$d' >> ${STA_DIR}/c${specdir}fhr/$WAV_MOD_TAG.${ymdh}.$buoy.cbull + sed '8q;d' "${outfile}" >> "${STA_DIR}/${specdir}fhr/${WAV_MOD_TAG}.${ymdh}.${buoy}.bull" + sed '7q;d' "${coutfile}" >> "${STA_DIR}/c${specdir}fhr/${WAV_MOD_TAG}.${ymdh}.${buoy}.cbull" else - cat $outfile | sed -n "/^${YMD} ${HMS}$/,\$p" >> ${STA_DIR}/${specdir}fhr/$WAV_MOD_TAG.${ymdh}.$buoy.spec + sed -n "/^${YMD} ${HMS}$/,\$p" "${outfile}" >> "${STA_DIR}/${specdir}fhr/${WAV_MOD_TAG}.${ymdh}.${buoy}.spec" fi fi else diff --git a/workflow/rocoto/gefs_tasks.py b/workflow/rocoto/gefs_tasks.py index 6899a655b6..6fffc881e0 100644 --- a/workflow/rocoto/gefs_tasks.py +++ b/workflow/rocoto/gefs_tasks.py @@ -408,8 +408,11 @@ def wavepostbndpnt(self): def wavepostbndpntbll(self): deps = [] atmos_hist_path = self._template_to_rocoto_cycstring(self._base["COM_ATMOS_HISTORY_TMPL"], {'MEMDIR': 'mem#member#'}) - # Is there any reason this is 180? - data = f'{atmos_hist_path}/{self.cdump}.t@Hz.atm.logf180.txt' + + # The wavepostbndpntbll job runs on forecast hours up to FHMAX_WAV_IBP + last_fhr = self._configs['wave']['FHMAX_WAV_IBP'] + + data = f'{atmos_hist_path}/{self.cdump}.t@Hz.atm.logf{last_fhr:03d}.txt' dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) diff --git a/workflow/rocoto/gfs_tasks.py b/workflow/rocoto/gfs_tasks.py index 0fd468b3b4..2c74d0f854 100644 --- a/workflow/rocoto/gfs_tasks.py +++ b/workflow/rocoto/gfs_tasks.py @@ -1200,9 +1200,13 @@ def wavepostbndpnt(self): return task def wavepostbndpntbll(self): + + # The wavepostbndpntbll job runs on forecast hours up to FHMAX_WAV_IBP + last_fhr = self._configs['wave']['FHMAX_WAV_IBP'] + deps = [] atmos_hist_path = self._template_to_rocoto_cycstring(self._base["COM_ATMOS_HISTORY_TMPL"]) - data = f'{atmos_hist_path}/{self.cdump}.t@Hz.atm.logf180.txt' + data = f'{atmos_hist_path}/{self.cdump}.t@Hz.atm.logf{last_fhr:03d}.txt' dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) From 47b3a581c8257fa24411fb400df8bb0e1e04972a Mon Sep 17 00:00:00 2001 From: Walter Kolczynski - NOAA Date: Mon, 17 Jun 2024 22:55:38 -0400 Subject: [PATCH 39/45] Turn on high-frequency output in extended test (#2679) Turns on high-frequency (hourly) output in the extended products test to exercise that aspect of the code. This test only runs on WCOSS. Also adds the hooks to optionally turn on the metplus jobs, but that is deferred as they are not currently working correctly. --- ci/cases/yamls/gfs_extended_ci.yaml | 1 + parm/config/gefs/config.base | 2 +- parm/config/gefs/yaml/defaults.yaml | 3 ++- parm/config/gfs/config.base | 6 +++--- parm/config/gfs/yaml/defaults.yaml | 2 ++ 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/ci/cases/yamls/gfs_extended_ci.yaml b/ci/cases/yamls/gfs_extended_ci.yaml index f3a84c8fde..42ee612f3a 100644 --- a/ci/cases/yamls/gfs_extended_ci.yaml +++ b/ci/cases/yamls/gfs_extended_ci.yaml @@ -10,3 +10,4 @@ base: DO_NPOESS: "YES" DO_GENESIS_FSU: "NO" FHMAX_GFS: 384 + FHMAX_HF_GFS: 120 diff --git a/parm/config/gefs/config.base b/parm/config/gefs/config.base index 0bb29e31ae..e98eb41208 100644 --- a/parm/config/gefs/config.base +++ b/parm/config/gefs/config.base @@ -237,7 +237,7 @@ export FHMIN_GFS=0 export FHMIN=${FHMIN_GFS} export FHMAX_GFS=@FHMAX_GFS@ export FHOUT_GFS=6 -export FHMAX_HF_GFS=0 +export FHMAX_HF_GFS=@FHMAX_HF_GFS@ export FHOUT_HF_GFS=1 export FHOUT_OCN_GFS=6 export FHOUT_ICE_GFS=6 diff --git a/parm/config/gefs/yaml/defaults.yaml b/parm/config/gefs/yaml/defaults.yaml index 2341c35d05..f6797758da 100644 --- a/parm/config/gefs/yaml/defaults.yaml +++ b/parm/config/gefs/yaml/defaults.yaml @@ -9,5 +9,6 @@ base: DO_AWIPS: "NO" KEEPDATA: "NO" FHMAX_GFS: 120 + FHMAX_HF_GFS: 0 REPLAY_ICS: "NO" - + USE_OCN_PERTURB_FILES: "false" diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base index fd1ffdc415..f893eaaf4e 100644 --- a/parm/config/gfs/config.base +++ b/parm/config/gfs/config.base @@ -291,8 +291,8 @@ export gfs_cyc=@gfs_cyc@ # 0: no GFS cycle, 1: 00Z only, 2: 00Z and 12Z only, 4: # GFS output and frequency export FHMIN_GFS=0 export FHMAX_GFS=@FHMAX_GFS@ -export FHOUT_GFS=3 # Must be 6 for S2S until #1629 is addressed; 3 for ops -export FHMAX_HF_GFS=0 +export FHOUT_GFS=3 # 3 for ops +export FHMAX_HF_GFS=@FHMAX_HF_GFS@ export FHOUT_HF_GFS=1 export FHOUT_OCN_GFS=6 export FHOUT_ICE_GFS=6 @@ -445,7 +445,7 @@ export netcdf_diag=".true." export binary_diag=".false." # Verification options -export DO_METP="NO" # Run METPLUS jobs - set METPLUS settings in config.metp; not supported with spack-stack +export DO_METP="@DO_METP@" # Run METPLUS jobs - set METPLUS settings in config.metp export DO_FIT2OBS="YES" # Run fit to observations package export DO_VRFY_OCEANDA="@DO_VRFY_OCEANDA@" # Run SOCA Ocean and Seaice DA verification tasks diff --git a/parm/config/gfs/yaml/defaults.yaml b/parm/config/gfs/yaml/defaults.yaml index d4a423f17e..b074b11dbf 100644 --- a/parm/config/gfs/yaml/defaults.yaml +++ b/parm/config/gfs/yaml/defaults.yaml @@ -13,7 +13,9 @@ base: DO_TRACKER: "YES" DO_GENESIS: "YES" DO_GENESIS_FSU: "NO" + DO_METP: "NO" FHMAX_GFS: 120 + FHMAX_HF_GFS: 0 DO_VRFY_OCEANDA: "NO" GSI_SOILANAL: "NO" EUPD_CYC: "gdas" From 35d4d99eaac669721add9ddcc793153e5ab3b30a Mon Sep 17 00:00:00 2001 From: "Henry R. Winterbottom" <49202169+HenryWinterbottom-NOAA@users.noreply.github.com> Date: Tue, 18 Jun 2024 08:06:53 -0600 Subject: [PATCH 40/45] Update archive job to use COMIN/COMOUT (#2668) NCO has requested that each COM variable specify whether it is an input or an output. This completes that process for the global-workflow archive task. Refs #2451 --------- Co-authored-by: Walter Kolczynski - NOAA Co-authored-by: Rahul Mahajan Co-authored-by: David Huber <69919478+DavidHuber-NOAA@users.noreply.github.com> --- jobs/JGDAS_ENKF_ARCHIVE | 4 +- jobs/JGLOBAL_ARCHIVE | 50 +++++++++---- parm/archive/arcdir.yaml.j2 | 52 ++++++------- parm/archive/chem.yaml.j2 | 2 +- parm/archive/enkf.yaml.j2 | 16 ++-- parm/archive/enkf_grp.yaml.j2 | 16 ++-- parm/archive/enkf_restarta_grp.yaml.j2 | 26 +++---- parm/archive/enkf_restartb_grp.yaml.j2 | 10 +-- parm/archive/gdas.yaml.j2 | 98 ++++++++++++------------- parm/archive/gdas_restarta.yaml.j2 | 34 ++++----- parm/archive/gdas_restartb.yaml.j2 | 10 +-- parm/archive/gdasice.yaml.j2 | 6 +- parm/archive/gdasice_restart.yaml.j2 | 2 +- parm/archive/gdasocean.yaml.j2 | 4 +- parm/archive/gdasocean_analysis.yaml.j2 | 26 +++---- parm/archive/gdasocean_restart.yaml.j2 | 4 +- parm/archive/gdaswave.yaml.j2 | 4 +- parm/archive/gdaswave_restart.yaml.j2 | 2 +- parm/archive/gfs_downstream.yaml.j2 | 10 +-- parm/archive/gfs_flux.yaml.j2 | 4 +- parm/archive/gfs_flux_1p00.yaml.j2 | 4 +- parm/archive/gfs_netcdfa.yaml.j2 | 12 +-- parm/archive/gfs_netcdfb.yaml.j2 | 4 +- parm/archive/gfs_pgrb2b.yaml.j2 | 16 ++-- parm/archive/gfs_restarta.yaml.j2 | 8 +- parm/archive/gfsa.yaml.j2 | 56 +++++++------- parm/archive/gfsb.yaml.j2 | 16 ++-- parm/archive/gfswave.yaml.j2 | 20 ++--- parm/archive/ice_6hravg.yaml.j2 | 4 +- parm/archive/ice_grib2.yaml.j2 | 12 +-- parm/archive/master_enkf.yaml.j2 | 26 +++---- parm/archive/ocean_6hravg.yaml.j2 | 2 +- parm/archive/ocean_grib2.yaml.j2 | 12 +-- scripts/exgdas_enkf_earc.py | 4 +- scripts/exglobal_archive.py | 4 +- ush/python/pygfs/task/archive.py | 19 ++--- 36 files changed, 312 insertions(+), 287 deletions(-) diff --git a/jobs/JGDAS_ENKF_ARCHIVE b/jobs/JGDAS_ENKF_ARCHIVE index 5ac46a73e7..7496acd8d4 100755 --- a/jobs/JGDAS_ENKF_ARCHIVE +++ b/jobs/JGDAS_ENKF_ARCHIVE @@ -11,8 +11,8 @@ export CDUMP=${RUN/enkf} YMD=${PDY} HH=${cyc} declare_from_tmpl -rx COM_TOP MEMDIR="ensstat" YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \ - COM_ATMOS_ANALYSIS_ENSSTAT:COM_ATMOS_ANALYSIS_TMPL \ - COM_ATMOS_HISTORY_ENSSTAT:COM_ATMOS_HISTORY_TMPL + COMIN_ATMOS_ANALYSIS_ENSSTAT:COM_ATMOS_ANALYSIS_TMPL \ + COMIN_ATMOS_HISTORY_ENSSTAT:COM_ATMOS_HISTORY_TMPL ############################################################### # Run archive script diff --git a/jobs/JGLOBAL_ARCHIVE b/jobs/JGLOBAL_ARCHIVE index cec3505000..28bd820de1 100755 --- a/jobs/JGLOBAL_ARCHIVE +++ b/jobs/JGLOBAL_ARCHIVE @@ -9,21 +9,45 @@ source "${HOMEgfs}/ush/jjob_header.sh" -e "arch" -c "base arch" ############################################## export CDUMP=${RUN/enkf} -YMD=${PDY} HH=${cyc} declare_from_tmpl -rx COM_ATMOS_ANALYSIS COM_ATMOS_BUFR COM_ATMOS_GEMPAK \ - COM_ATMOS_GENESIS COM_ATMOS_HISTORY COM_ATMOS_INPUT COM_ATMOS_MASTER COM_ATMOS_RESTART \ - COM_ATMOS_TRACK COM_ATMOS_WMO \ - COM_CHEM_HISTORY COM_CHEM_ANALYSIS\ - COM_MED_RESTART \ - COM_SNOW_ANALYSIS \ - COM_ICE_HISTORY COM_ICE_INPUT COM_ICE_RESTART COM_ICE_GRIB \ - COM_OBS COM_TOP \ - COM_OCEAN_HISTORY COM_OCEAN_RESTART COM_OCEAN_GRIB COM_OCEAN_NETCDF \ - COM_OCEAN_ANALYSIS \ - COM_WAVE_GRID COM_WAVE_HISTORY COM_WAVE_STATION COM_WAVE_RESTART \ - COM_ATMOS_OZNMON COM_ATMOS_RADMON COM_ATMOS_MINMON COM_CONF +YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \ + COMIN_ATMOS_ANALYSIS:COM_ATMOS_ANALYSIS_TMPL \ + COMIN_ATMOS_BUFR:COM_ATMOS_BUFR_TMPL \ + COMIN_ATMOS_GEMPAK:COM_ATMOS_GEMPAK_TMPL \ + COMIN_ATMOS_GENESIS:COM_ATMOS_GENESIS_TMPL \ + COMIN_ATMOS_HISTORY:COM_ATMOS_HISTORY_TMPL \ + COMIN_ATMOS_INPUT:COM_ATMOS_INPUT_TMPL \ + COMIN_ATMOS_MASTER:COM_ATMOS_MASTER_TMPL \ + COMIN_ATMOS_RESTART:COM_ATMOS_RESTART_TMPL \ + COMIN_ATMOS_TRACK:COM_ATMOS_TRACK_TMPL \ + COMIN_ATMOS_WMO:COM_ATMOS_WMO_TMPL \ + COMIN_CHEM_HISTORY:COM_CHEM_HISTORY_TMPL \ + COMIN_CHEM_ANALYSIS:COM_CHEM_ANALYSIS_TMPL \ + COMIN_MED_RESTART:COM_MED_RESTART_TMPL \ + COMIN_SNOW_ANALYSIS:COM_SNOW_ANALYSIS_TMPL \ + COMIN_ICE_HISTORY:COM_ICE_HISTORY_TMPL \ + COMIN_ICE_INPUT:COM_ICE_INPUT_TMPL \ + COMIN_ICE_RESTART:COM_ICE_RESTART_TMPL \ + COMIN_ICE_GRIB:COM_ICE_GRIB_TMPL \ + COMIN_OBS:COM_OBS_TMPL \ + COMIN_TOP:COM_TOP_TMPL \ + COMIN_OCEAN_HISTORY:COM_OCEAN_HISTORY_TMPL \ + COMIN_OCEAN_RESTART:COM_OCEAN_RESTART_TMPL \ + COMIN_OCEAN_GRIB:COM_OCEAN_GRIB_TMPL \ + COMIN_OCEAN_NETCDF:COM_OCEAN_NETCDF_TMPL \ + COMIN_OCEAN_ANALYSIS:COM_OCEAN_ANALYSIS_TMPL \ + COMIN_WAVE_GRID:COM_WAVE_GRID_TMPL \ + COMIN_WAVE_HISTORY:COM_WAVE_HISTORY_TMPL \ + COMIN_WAVE_STATION:COM_WAVE_STATION_TMPL \ + COMIN_WAVE_RESTART:COM_WAVE_RESTART_TMPL \ + COMIN_ATMOS_OZNMON:COM_ATMOS_OZNMON_TMPL \ + COMIN_ATMOS_RADMON:COM_ATMOS_RADMON_TMPL \ + COMIN_ATMOS_MINMON:COM_ATMOS_MINMON_TMPL \ + COMIN_CONF:COM_CONF_TMPL \ + COMOUT_ATMOS_TRACK:COM_ATMOS_TRACK_TMPL for grid in "0p25" "0p50" "1p00"; do - YMD=${PDY} HH=${cyc} GRID=${grid} declare_from_tmpl -rx "COM_ATMOS_GRIB_${grid}:COM_ATMOS_GRIB_GRID_TMPL" + YMD=${PDY} HH=${cyc} GRID=${grid} declare_from_tmpl -rx \ + "COMIN_ATMOS_GRIB_${grid}:COM_ATMOS_GRIB_GRID_TMPL" done ############################################################### diff --git a/parm/archive/arcdir.yaml.j2 b/parm/archive/arcdir.yaml.j2 index 1ed7422761..d6b1899ebc 100644 --- a/parm/archive/arcdir.yaml.j2 +++ b/parm/archive/arcdir.yaml.j2 @@ -15,15 +15,15 @@ Deterministic: &deterministic copy: # Cyclone forecasts, produced for both gdas and gfs cycles ## Only created if tracking is on and there were systems to track - {% if path_exists(COM_ATMOS_TRACK ~ "/atcfunix." ~ RUN ~ "." ~ cycle_YMDH) %} - - ["{{ COM_ATMOS_TRACK }}/atcfunix.{{ RUN }}.{{ cycle_YMDH }}", "{{ ARCDIR }}/atcfunix.{{ RUN }}.{{ cycle_YMDH }}"] - - ["{{ COM_ATMOS_TRACK }}/atcfunixp.{{ RUN }}.{{ cycle_YMDH }}", "{{ ARCDIR }}/atcfunixp.{{ RUN }}.{{ cycle_YMDH }}"] + {% if path_exists(COMIN_ATMOS_TRACK ~ "/atcfunix." ~ RUN ~ "." ~ cycle_YMDH) %} + - ["{{ COMIN_ATMOS_TRACK }}/atcfunix.{{ RUN }}.{{ cycle_YMDH }}", "{{ ARCDIR }}/atcfunix.{{ RUN }}.{{ cycle_YMDH }}"] + - ["{{ COMIN_ATMOS_TRACK }}/atcfunixp.{{ RUN }}.{{ cycle_YMDH }}", "{{ ARCDIR }}/atcfunixp.{{ RUN }}.{{ cycle_YMDH }}"] {% endif %} # Cyclone tracking data {% for basin in ["epac", "natl"] %} - {% if path_exists(COM_ATMOS_TRACK + "/" + basin) %} - - ["{{ COM_ATMOS_TRACK }}/{{ basin }}", "{{ ARCDIR }}/{{ basin }}"] + {% if path_exists(COMIN_ATMOS_TRACK + "/" + basin) %} + - ["{{ COMIN_ATMOS_TRACK }}/{{ basin }}", "{{ ARCDIR }}/{{ basin }}"] {% endif %} {% endfor %} @@ -31,25 +31,25 @@ Deterministic: &deterministic analysis: copy: # Analysis data (if we are running in cycled mode) - - ["{{ COM_ATMOS_GRIB_1p00 }}/{{ head }}pgrb2.1p00.anl", "{{ ARCDIR }}/pgbanl.{{ RUN }}.{{ cycle_YMDH }}.grib2"] + - ["{{ COMIN_ATMOS_GRIB_1p00 }}/{{ head }}pgrb2.1p00.anl", "{{ ARCDIR }}/pgbanl.{{ RUN }}.{{ cycle_YMDH }}.grib2"] {% if DO_JEDIATMVAR %} - - ["{{ COM_ATMOS_ANALYSIS }}/{{ head }}atmstat", "{{ ARCDIR }}/atmstat.{{ RUN }}.{{ cycle_YMDH }}"] + - ["{{ COMIN_ATMOS_ANALYSIS }}/{{ head }}atmstat", "{{ ARCDIR }}/atmstat.{{ RUN }}.{{ cycle_YMDH }}"] {% else %} - - ["{{ COM_ATMOS_ANALYSIS }}/{{ head }}gsistat", "{{ ARCDIR }}/gsistat.{{ RUN }}.{{ cycle_YMDH }}"] + - ["{{ COMIN_ATMOS_ANALYSIS }}/{{ head }}gsistat", "{{ ARCDIR }}/gsistat.{{ RUN }}.{{ cycle_YMDH }}"] {% endif %} {% if DO_JEDISNOWDA %} - - ["{{ COM_SNOW_ANALYSIS }}/{{ head }}snowstat.tgz", "{{ ARCDIR }}/snowstat.{{ RUN }}.{{ cycle_YMDH }}.tgz"] + - ["{{ COMIN_SNOW_ANALYSIS }}/{{ head }}snowstat.tgz", "{{ ARCDIR }}/snowstat.{{ RUN }}.{{ cycle_YMDH }}.tgz"] {% endif %} {% if AERO_ANL_CDUMP == RUN or AERO_ANL_CDUMP == "both" %} - - ["{{ COM_CHEM_ANALYSIS }}/{{ head }}aerostat", "{{ ARCDIR }}/aerostat.{{ RUN }}.{{ cycle_YMDH }}"] + - ["{{ COMIN_CHEM_ANALYSIS }}/{{ head }}aerostat", "{{ ARCDIR }}/aerostat.{{ RUN }}.{{ cycle_YMDH }}"] {% endif %} {% if DO_PREP_OBS_AERO %} - - ["{{ COM_OBS }}/{{ head }}aeroobs", "{{ ARCDIR }}/aeroobs.{{ RUN }}.{{ cycle_YMDH }}"] - - ["{{ COM_OBS }}/{{ head }}aerorawobs", "{{ ARCDIR }}/aerorawobs.{{ RUN }}.{{ cycle_YMDH }}"] + - ["{{ COMIN_OBS }}/{{ head }}aeroobs", "{{ ARCDIR }}/aeroobs.{{ RUN }}.{{ cycle_YMDH }}"] + - ["{{ COMIN_OBS }}/{{ head }}aerorawobs", "{{ ARCDIR }}/aerorawobs.{{ RUN }}.{{ cycle_YMDH }}"] {% endif %} {% endif %} @@ -62,18 +62,18 @@ gfs: # GFS specific gfs: copy: {% for fhr in range(0, FHMAX_GFS + 1, FHOUT_GFS) %} - - ["{{ COM_ATMOS_GRIB_1p00 }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}", "{{ ARCDIR }}/pgbf{{ '%02d' % fhr }}.{{ RUN }}.{{ cycle_YMDH }}.grib2"] + - ["{{ COMIN_ATMOS_GRIB_1p00 }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}", "{{ ARCDIR }}/pgbf{{ '%02d' % fhr }}.{{ RUN }}.{{ cycle_YMDH }}.grib2"] {% endfor %} # Cyclone genesis data (only present if there are storms) - {% if path_exists(COM_ATMOS_GENESIS ~ "/storms.gfso.atcf_gen." ~ cycle_YMDH) %} - - ["{{ COM_ATMOS_GENESIS }}/storms.gfso.atcf_gen.{{ cycle_YMDH }}", "{{ ARCDIR }}/storms.gfso.atcf_gen.{{ cycle_YMDH }}"] - - ["{{ COM_ATMOS_GENESIS }}/storms.gfso.atcf_gen.altg.{{ cycle_YMDH }}", "{{ ARCDIR }}/storms.gfso.atcf_gen.altg.{{ cycle_YMDH }}"] + {% if path_exists(COMIN_ATMOS_GENESIS ~ "/storms.gfso.atcf_gen." ~ cycle_YMDH) %} + - ["{{ COMIN_ATMOS_GENESIS }}/storms.gfso.atcf_gen.{{ cycle_YMDH }}", "{{ ARCDIR }}/storms.gfso.atcf_gen.{{ cycle_YMDH }}"] + - ["{{ COMIN_ATMOS_GENESIS }}/storms.gfso.atcf_gen.altg.{{ cycle_YMDH }}", "{{ ARCDIR }}/storms.gfso.atcf_gen.altg.{{ cycle_YMDH }}"] {% endif %} - {% if path_exists(COM_ATMOS_GENESIS ~ "/trak.gfso.atcfunix." ~ cycle_YMDH) %} - - ["{{ COM_ATMOS_GENESIS }}/trak.gfso.atcfunix.{{ cycle_YMDH }}", "{{ ARCDIR }}/trak.gfso.atcfunix.{{ cycle_YMDH }}"] - - ["{{ COM_ATMOS_GENESIS }}/trak.gfso.atcfunix.altg.{{ cycle_YMDH }}", "{{ ARCDIR }}/trak.gfso.atcfunix.altg.{{ cycle_YMDH }}"] + {% if path_exists(COMIN_ATMOS_GENESIS ~ "/trak.gfso.atcfunix." ~ cycle_YMDH) %} + - ["{{ COMIN_ATMOS_GENESIS }}/trak.gfso.atcfunix.{{ cycle_YMDH }}", "{{ ARCDIR }}/trak.gfso.atcfunix.{{ cycle_YMDH }}"] + - ["{{ COMIN_ATMOS_GENESIS }}/trak.gfso.atcfunix.altg.{{ cycle_YMDH }}", "{{ ARCDIR }}/trak.gfso.atcfunix.altg.{{ cycle_YMDH }}"] {% endif %} {% if DO_FIT2OBS %} @@ -87,8 +87,8 @@ gfs: # GFS specific {% for fhr in range(0, FHMAX_FITS + 1, 6) %} {% set sfcfile = "/" + head + "sfcf" + '%03d'|format(fhr) + ".nc" %} {% set sigfile = "/" + head + "atmf" + '%03d'|format(fhr) + ".nc" %} - - ["{{COM_ATMOS_HISTORY}}/{{ sfcfile }}", "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}/{{ sfcfile }}"] - - ["{{COM_ATMOS_HISTORY}}/{{ sigfile }}", "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}/{{ sigfile }}"] + - ["{{COMIN_ATMOS_HISTORY}}/{{ sfcfile }}", "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}/{{ sfcfile }}"] + - ["{{COMIN_ATMOS_HISTORY}}/{{ sigfile }}", "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}/{{ sigfile }}"] {% endfor %} {% endif %} @@ -101,7 +101,7 @@ gdas: # GDAS specific gdas: copy: {% for fhr in range(0, FHMAX + 1, FHOUT) %} - - ["{{ COM_ATMOS_GRIB_1p00 }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}", "{{ ARCDIR }}/pgbf{{ '%02d' % fhr }}.{{ RUN }}.{{ cycle_YMDH }}.grib2"] + - ["{{ COMIN_ATMOS_GRIB_1p00 }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}", "{{ ARCDIR }}/pgbf{{ '%02d' % fhr }}.{{ RUN }}.{{ cycle_YMDH }}.grib2"] {% endfor %} {% endif %} @@ -110,11 +110,11 @@ Ensemble: &ensemble # ENKFGDAS or ENKFGFS copy: # Copy ensemble analyses {% if DO_JEDIATMENS %} - - ["{{ COM_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}atmensstat", "{{ ARCDIR }}/atmensstat.{{ RUN }}.{{ cycle_YMDH }}"] - - ["{{ COM_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}atminc.ensmean.nc", "{{ ARCDIR }}/atmensstat.{{ RUN }}.{{ cycle_YMDH }}.ensmean.nc"] + - ["{{ COMIN_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}atmensstat", "{{ ARCDIR }}/atmensstat.{{ RUN }}.{{ cycle_YMDH }}"] + - ["{{ COMIN_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}atminc.ensmean.nc", "{{ ARCDIR }}/atmensstat.{{ RUN }}.{{ cycle_YMDH }}.ensmean.nc"] {% else %} - - ["{{ COM_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}enkfstat", "{{ ARCDIR }}/enkfstat.{{ RUN }}.{{ cycle_YMDH }}"] - - ["{{ COM_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}gsistat.ensmean", "{{ ARCDIR }}/gsistat.{{ RUN }}.{{ cycle_YMDH }}.ensmean"] + - ["{{ COMIN_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}enkfstat", "{{ ARCDIR }}/enkfstat.{{ RUN }}.{{ cycle_YMDH }}"] + - ["{{ COMIN_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}gsistat.ensmean", "{{ ARCDIR }}/gsistat.{{ RUN }}.{{ cycle_YMDH }}.ensmean"] {% endif %} {% if "enkf" in RUN %} diff --git a/parm/archive/chem.yaml.j2 b/parm/archive/chem.yaml.j2 index 7796912b1a..33c6dcef57 100644 --- a/parm/archive/chem.yaml.j2 +++ b/parm/archive/chem.yaml.j2 @@ -4,4 +4,4 @@ chem: target: "{{ ATARDIR }}/{{ cycle_YMDH }}/chem.tar" required: # TODO explicitize this set - - "{{ COM_CHEM_HISTORY | relpath(ROTDIR) }}/{{ head }}*" + - "{{ COMIN_CHEM_HISTORY | relpath(ROTDIR) }}/{{ head }}*" diff --git a/parm/archive/enkf.yaml.j2 b/parm/archive/enkf.yaml.j2 index ed50a1749d..bc5ef03cb8 100644 --- a/parm/archive/enkf.yaml.j2 +++ b/parm/archive/enkf.yaml.j2 @@ -34,10 +34,10 @@ enkf: # Ensemble mean and spread {% for fhr in range(3, fhmax + 1, 3) %} - - "{{ COM_ATMOS_HISTORY_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmf{{ '%03d' % fhr }}.ensmean.nc" - - "{{ COM_ATMOS_HISTORY_ENSSTAT | relpath(ROTDIR) }}/{{ head }}sfcf{{ '%03d' % fhr }}.ensmean.nc" + - "{{ COMIN_ATMOS_HISTORY_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmf{{ '%03d' % fhr }}.ensmean.nc" + - "{{ COMIN_ATMOS_HISTORY_ENSSTAT | relpath(ROTDIR) }}/{{ head }}sfcf{{ '%03d' % fhr }}.ensmean.nc" {% if ENKF_SPREAD %} - - "{{ COM_ATMOS_HISTORY_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmf{{ '%03d' % fhr }}.ensspread.nc" + - "{{ COMIN_ATMOS_HISTORY_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmf{{ '%03d' % fhr }}.ensspread.nc" {% endif %} {% endfor %} @@ -54,15 +54,15 @@ enkf: "atmensstat"] %} {% endif %} {% for file in da_files %} - - "{{ COM_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}{{ file }}" + - "{{ COMIN_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}{{ file }}" {% endfor %} # Ensemble mean analyses/increments # 6-hr analysis/increment {% if do_calc_increment %} - - "{{ COM_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmanl.ensmean.nc" + - "{{ COMIN_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmanl.ensmean.nc" {% else %} - - "{{ COM_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atminc.ensmean.nc" + - "{{ COMIN_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atminc.ensmean.nc" {% endif %} {% if DOIAU %} @@ -71,10 +71,10 @@ enkf: {% for fhr in iaufhrs if fhr != 6 %} {% if do_calc_increment %} # Store analyses instead of increments - - "{{ COM_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atma{{ '%03d' % fhr }}.ensmean.nc" + - "{{ COMIN_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atma{{ '%03d' % fhr }}.ensmean.nc" {% else %} # Store increments - - "{{ COM_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmi{{ '%03d' % fhr }}.ensmean.nc" + - "{{ COMIN_ATMOS_ANALYSIS_ENSSTAT | relpath(ROTDIR) }}/{{ head }}atmi{{ '%03d' % fhr }}.ensmean.nc" {% endif %} {% endfor %} diff --git a/parm/archive/enkf_grp.yaml.j2 b/parm/archive/enkf_grp.yaml.j2 index 85d5854e3b..933ca45caf 100644 --- a/parm/archive/enkf_grp.yaml.j2 +++ b/parm/archive/enkf_grp.yaml.j2 @@ -5,25 +5,25 @@ enkf_grp: {% for mem in range(first_group_mem, last_group_mem + 1) %} {% set imem = mem - first_group_mem %} # Construct member COM directories - {% set COM_ATMOS_ANALYSIS_MEM = COM_ATMOS_ANALYSIS_MEM_list[imem] %} - {% set COM_ATMOS_HISTORY_MEM = COM_ATMOS_HISTORY_MEM_list[imem] %} - {% set COM_ATMOS_RESTART_MEM = COM_ATMOS_RESTART_MEM_list[imem] %} + {% set COMIN_ATMOS_ANALYSIS_MEM = COMIN_ATMOS_ANALYSIS_MEM_list[imem] %} + {% set COMIN_ATMOS_HISTORY_MEM = COMIN_ATMOS_HISTORY_MEM_list[imem] %} + {% set COMIN_ATMOS_RESTART_MEM = COMIN_ATMOS_RESTART_MEM_list[imem] %} # Forecast data {% for fhr in range(3, 10, 3) %} - - "{{ COM_ATMOS_HISTORY_MEM | relpath(ROTDIR) }}/{{ head }}atmf{{ "%03d" % fhr }}.nc" + - "{{ COMIN_ATMOS_HISTORY_MEM | relpath(ROTDIR) }}/{{ head }}atmf{{ "%03d" % fhr }}.nc" {% endfor %} # Only store the 6-hour surface forecast - - "{{ COM_ATMOS_HISTORY_MEM | relpath(ROTDIR) }}/{{ head }}sfcf006.nc" + - "{{ COMIN_ATMOS_HISTORY_MEM | relpath(ROTDIR) }}/{{ head }}sfcf006.nc" # Store the individual member analysis data {% if not lobsdiag_forenkf %} - - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}gsistat" + - "{{ COMIN_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}gsistat" {% endif %} {% if do_calc_increment %} - - "{{ COM_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}atmanl.nc" + - "{{ COMIN_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}atmanl.nc" {% else %} - - "{{ COM_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}ratminc.nc" + - "{{ COMIN_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}ratminc.nc" {% endif %} {% endfor %} # first_group_mem to last_group_mem diff --git a/parm/archive/enkf_restarta_grp.yaml.j2 b/parm/archive/enkf_restarta_grp.yaml.j2 index 8a4ea18bc1..41e03edc92 100644 --- a/parm/archive/enkf_restarta_grp.yaml.j2 +++ b/parm/archive/enkf_restarta_grp.yaml.j2 @@ -5,16 +5,16 @@ enkf_restarta_grp: {% for mem in range(first_group_mem, last_group_mem + 1) %} {% set imem = mem - first_group_mem %} # Construct the pertinent member COM directories - {% set COM_ATMOS_ANALYSIS_MEM = COM_ATMOS_ANALYSIS_MEM_list[imem] %} - {% set COM_ATMOS_HISTORY_MEM = COM_ATMOS_HISTORY_MEM_list[imem] %} - {% set COM_ATMOS_RESTART_MEM = COM_ATMOS_RESTART_MEM_list[imem] %} + {% set COMIN_ATMOS_ANALYSIS_MEM = COMIN_ATMOS_ANALYSIS_MEM_list[imem] %} + {% set COMIN_ATMOS_HISTORY_MEM = COMIN_ATMOS_HISTORY_MEM_list[imem] %} + {% set COMIN_ATMOS_RESTART_MEM = COMIN_ATMOS_RESTART_MEM_list[imem] %} # Store bias data {% if not lobsdiag_forenkf %} - - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}abias" - - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}abias_air" - - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}abias_int" - - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}abias_pc" + - "{{ COMIN_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}abias" + - "{{ COMIN_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}abias_air" + - "{{ COMIN_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}abias_int" + - "{{ COMIN_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}abias_pc" {% endif %} # Member surface analysis data @@ -25,29 +25,29 @@ enkf_restarta_grp: {% endif %} {% set anl_time = current_cycle | add_to_datetime(anl_delta) %} {% for itile in range(1, 7) %} - - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ anl_time | to_YMD }}.{{ anl_time | strftime("%H") }}0000.sfcanl_data.tile{{ itile }}.nc" + - "{{ COMIN_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ anl_time | to_YMD }}.{{ anl_time | strftime("%H") }}0000.sfcanl_data.tile{{ itile }}.nc" {% endfor %} # Member atmospheric analysis data {% if do_calc_increment %} - - "{{ COM_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}atmanl.nc" + - "{{ COMIN_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}atmanl.nc" {% else %} - - "{{ COM_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}ratminc.nc" + - "{{ COMIN_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}ratminc.nc" {% endif %} # Member increments {% for iaufhr in iaufhrs if iaufhr != 6 %} {% set iaufhr = iaufhr %} {% if do_calc_increment %} - - "{{ COM_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}atma{{ '%03d' % iaufhr }}.nc" + - "{{ COMIN_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}atma{{ '%03d' % iaufhr }}.nc" {% else %} - - "{{ COM_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}ratmi{{ '%03d' % iaufhr }}.nc" + - "{{ COMIN_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}ratmi{{ '%03d' % iaufhr }}.nc" {% endif %} {% endfor %} # iaufhr in iaufhrs # Conventional data {% if not lobsdiag_forenkf and not DO_JEDIATMENS %} - - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}cnvstat" + - "{{ COMIN_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ head }}cnvstat" {% endif %} {% endfor %} # first_group_mem to last_group_mem diff --git a/parm/archive/enkf_restartb_grp.yaml.j2 b/parm/archive/enkf_restartb_grp.yaml.j2 index 34fde9d7ca..7cd799f0a9 100644 --- a/parm/archive/enkf_restartb_grp.yaml.j2 +++ b/parm/archive/enkf_restartb_grp.yaml.j2 @@ -4,7 +4,7 @@ enkf_restartb_grp: required: {% for mem in range(first_group_mem, last_group_mem + 1) %} {% set imem = mem - first_group_mem %} - {% set COM_ATMOS_RESTART_MEM = COM_ATMOS_RESTART_MEM_list[imem] %} + {% set COMIN_ATMOS_RESTART_MEM = COMIN_ATMOS_RESTART_MEM_list[imem] %} # Grab surface analysis data. # If IAU is on, grab the beginning of the window, otherwise grab the center. @@ -18,7 +18,7 @@ enkf_restartb_grp: {% set offset_HH = offset_dt | strftime("%H") %} {% set prefix = offset_YMD + "." + offset_HH + "0000" %} {% for itile in range(1, 7) %} - - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ prefix }}.sfcanl_data.tile{{ itile }}.nc" + - "{{ COMIN_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ prefix }}.sfcanl_data.tile{{ itile }}.nc" {% endfor %} # Now get the restart files. @@ -28,10 +28,10 @@ enkf_restartb_grp: {% set r_prefix = r_dt | to_YMD + "." + r_dt | strftime("%H") + "0000" %} {% for itile in range(1, 7) %} {% for datatype in ["ca_data", "fv_core.res", "fv_srf_wnd.res", "fv_tracer.res", "phy_data", "sfc_data"] %} - - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ r_prefix }}.{{datatype}}.tile{{ itile }}.nc" + - "{{ COMIN_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ r_prefix }}.{{datatype}}.tile{{ itile }}.nc" {% endfor %} {% endfor %} - - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ r_prefix }}.coupler.res" - - "{{ COM_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ r_prefix }}.fv_core.res.nc" + - "{{ COMIN_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ r_prefix }}.coupler.res" + - "{{ COMIN_ATMOS_RESTART_MEM | relpath(ROTDIR) }}/{{ r_prefix }}.fv_core.res.nc" {% endfor %} {% endfor %} diff --git a/parm/archive/gdas.yaml.j2 b/parm/archive/gdas.yaml.j2 index 26540156cd..12b89f2e61 100644 --- a/parm/archive/gdas.yaml.j2 +++ b/parm/archive/gdas.yaml.j2 @@ -35,22 +35,22 @@ gdas: {% endif %} # Analysis GRIB2 (sub-sampled) data - - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl" - - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl.idx" - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl" - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl.idx" + - "{{ COMIN_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl" + - "{{ COMIN_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl.idx" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl.idx" # Analysis netCDF (raw) data - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmanl.nc" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}sfcanl.nc" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmanl.nc" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}sfcanl.nc" {% if DOHYBVAR %} # Ensemble analysis residual - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmanl.ensres.nc" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmanl.ensres.nc" {% if DOIAU %} # Ensemble IAU analysis residuals {% for fhr in iaufhrs if fhr != 6 %} - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atma{{ '%03d' % fhr }}.ensres.nc" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atma{{ '%03d' % fhr }}.ensres.nc" {% endfor %} {% endif %} # End of ensemble analysis mean residuals @@ -58,51 +58,51 @@ gdas: # Analysis state {% if DO_JEDIATMVAR %} - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmvar.yaml" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmstat" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmvar.yaml" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmstat" {% else %} - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}gsistat" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}cnvstat" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}oznstat" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}radstat" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}gsistat" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}cnvstat" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}oznstat" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}radstat" {% endif %} {% if AERO_ANL_CDUMP == "gdas" or AERO_ANL_CDUMP == "both" %} - - "{{ COM_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" + - "{{ COMIN_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" {% endif %} {% if DO_PREP_OBS_AERO %} - - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}aeroobs" - - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}aerorawobs" + - "{{ COMIN_OBS | relpath(ROTDIR) }}/{{ head }}aeroobs" + - "{{ COMIN_OBS | relpath(ROTDIR) }}/{{ head }}aerorawobs" {% endif %} {% if DO_JEDISNOWDA %} - - "{{ COM_SNOW_ANALYSIS | relpath(ROTDIR) }}/{{ head }}snowstat.tgz" + - "{{ COMIN_SNOW_ANALYSIS | relpath(ROTDIR) }}/{{ head }}snowstat.tgz" {% endif %} # Ozone verification {% if DO_VERFOZN %} - - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/time/bad_cnt.{{ cycle_YMDH }}" - - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/time/bad_diag.{{ cycle_YMDH }}" - - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/time/bad_pen.{{ cycle_YMDH }}" - - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/time/stdout.time.tar.gz" - - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/horiz/stdout.horiz.tar.gz" + - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/time/bad_cnt.{{ cycle_YMDH }}" + - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/time/bad_diag.{{ cycle_YMDH }}" + - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/time/bad_pen.{{ cycle_YMDH }}" + - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/time/stdout.time.tar.gz" + - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/horiz/stdout.horiz.tar.gz" - "logs/{{ cycle_YMDH }}/{{ RUN }}verfozn.log" {% endif %} # Radiance verification {% if DO_VERFRAD %} - - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_angle.tar.gz" - - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_bcoef.tar.gz" - - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_bcor.tar.gz" - - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_time.tar.gz" + - "{{ COMIN_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_angle.tar.gz" + - "{{ COMIN_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_bcoef.tar.gz" + - "{{ COMIN_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_bcor.tar.gz" + - "{{ COMIN_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_time.tar.gz" - "logs/{{ cycle_YMDH }}/{{ RUN }}verfrad.log" {% endif %} # Minimization monitor {% if DO_VMINMON %} - - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.costs.txt" - - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.cost_terms.txt" - - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.gnorms.ieee_d" - - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.reduction.ieee_d" - - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/gnorm_data.txt" + - "{{ COMIN_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.costs.txt" + - "{{ COMIN_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.cost_terms.txt" + - "{{ COMIN_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.gnorms.ieee_d" + - "{{ COMIN_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.reduction.ieee_d" + - "{{ COMIN_ATMOS_MINMON | relpath(ROTDIR) }}/gnorm_data.txt" - "logs/{{ cycle_YMDH }}/{{ RUN }}vminmon.log" {% endif %} {% endif %} # End of cycled data @@ -118,27 +118,27 @@ gdas: {% for fhr in range(0, FHMAX + 1, 3) %} # Forecast GRIB2 data - - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}" - - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}.idx" - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}" - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}.idx" + - "{{ COMIN_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}" + - "{{ COMIN_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}.idx" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}.idx" # Forecast GRIB2 fluxes - - "{{ COM_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2" - - "{{ COM_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2.idx" + - "{{ COMIN_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2" + - "{{ COMIN_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2.idx" # FV3 log - - "{{ COM_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atm.logf{{ '%03d' % fhr }}.txt" + - "{{ COMIN_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atm.logf{{ '%03d' % fhr }}.txt" # Raw netCDF forecasts - - "{{ COM_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atmf{{ '%03d' % fhr }}.nc" - - "{{ COM_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}sfcf{{ '%03d' % fhr }}.nc" + - "{{ COMIN_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atmf{{ '%03d' % fhr }}.nc" + - "{{ COMIN_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}sfcf{{ '%03d' % fhr }}.nc" {% endfor %} optional: {% if MODE == "cycled" %} {% if DO_VERFRAD %} # Radiance verification (only created if there are problems) - - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/bad_diag.{{ cycle_YMDH }}" - - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/bad_pen.{{ cycle_YMDH }}" - - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/low_count.{{ cycle_YMDH }}" - - "{{ COM_ATMOS_RADMON | relpath(ROTDIR) }}/warning.{{ cycle_YMDH }}" + - "{{ COMIN_ATMOS_RADMON | relpath(ROTDIR) }}/bad_diag.{{ cycle_YMDH }}" + - "{{ COMIN_ATMOS_RADMON | relpath(ROTDIR) }}/bad_pen.{{ cycle_YMDH }}" + - "{{ COMIN_ATMOS_RADMON | relpath(ROTDIR) }}/low_count.{{ cycle_YMDH }}" + - "{{ COMIN_ATMOS_RADMON | relpath(ROTDIR) }}/warning.{{ cycle_YMDH }}" {% endif %} {% if DO_VERFOZN %} @@ -150,10 +150,10 @@ gdas: {% for group in [ "horiz", "time" ] %} {% if group == "horiz" %} {% set suffix = ".gz" %} {% else %} {% set suffix = "" %} {% endif %} {% for type in oznmon_types %} - - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/{{ group }}/{{ type }}.anl.ctl" - - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/{{ group }}/{{ type }}.anl.{{ cycle_YMDH }}.ieee_d{{ suffix }}" - - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/{{ group }}/{{ type }}.ges.ctl" - - "{{ COM_ATMOS_OZNMON | relpath(ROTDIR) }}/{{ group }}/{{ type }}.ges.{{ cycle_YMDH }}.ieee_d{{ suffix }}" + - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/{{ group }}/{{ type }}.anl.ctl" + - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/{{ group }}/{{ type }}.anl.{{ cycle_YMDH }}.ieee_d{{ suffix }}" + - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/{{ group }}/{{ type }}.ges.ctl" + - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/{{ group }}/{{ type }}.ges.{{ cycle_YMDH }}.ieee_d{{ suffix }}" {% endfor %} {% endfor %} {% endif %} diff --git a/parm/archive/gdas_restarta.yaml.j2 b/parm/archive/gdas_restarta.yaml.j2 index af1acbdbe7..4c0522fed7 100644 --- a/parm/archive/gdas_restarta.yaml.j2 +++ b/parm/archive/gdas_restarta.yaml.j2 @@ -4,10 +4,10 @@ gdas_restarta: target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdas_restarta.tar" required: # Deterministic analysis increments - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atminc.nc" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atminc.nc" # IAU increments {% for iaufhr in iaufhrs if iaufhr != 6 %} - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmi{{ "%03d" % iaufhr }}.nc" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmi{{ "%03d" % iaufhr }}.nc" {% endfor %} # Surface analysis tiles @@ -19,36 +19,36 @@ gdas_restarta: {% set anl_timedelta = anl_offset | to_timedelta %} {% set anl_time = current_cycle | add_to_datetime(anl_timedelta) %} {% for itile in range(1,7) %} - - "{{ COM_ATMOS_RESTART | relpath(ROTDIR) }}/{{ anl_time | to_YMD }}.{{ anl_time | strftime("%H") }}0000.sfcanl_data.tile{{ itile }}.nc" + - "{{ COMIN_ATMOS_RESTART | relpath(ROTDIR) }}/{{ anl_time | to_YMD }}.{{ anl_time | strftime("%H") }}0000.sfcanl_data.tile{{ itile }}.nc" {% endfor %} # Initial biases {% if not DO_JEDIATMVAR %} - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_air" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_pc" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}radstat" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}cnvstat" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_int" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}dtfanl.nc" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}loginc.txt" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_air" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_pc" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}radstat" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}cnvstat" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}abias_int" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}dtfanl.nc" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}loginc.txt" {% endif %} # Snow surface data {% if DO_JEDISNOWDA %} {% for itile in range(1,7) %} # Snow analysis is 3dvar - - "{{ COM_SNOW_ANALYSIS | relpath(ROTDIR) }}/snowinc.{{ cycle_YMD }}.{{ cycle_HH }}0000.sfc_data.tile{{ itile }}.nc" - - "{{ COM_SNOW_ANALYSIS | relpath(ROTDIR) }}/{{ cycle_YMD }}.{{ cycle_HH }}0000.sfc_data.tile{{ itile }}.nc" + - "{{ COMIN_SNOW_ANALYSIS | relpath(ROTDIR) }}/snowinc.{{ cycle_YMD }}.{{ cycle_HH }}0000.sfc_data.tile{{ itile }}.nc" + - "{{ COMIN_SNOW_ANALYSIS | relpath(ROTDIR) }}/{{ cycle_YMD }}.{{ cycle_HH }}0000.sfc_data.tile{{ itile }}.nc" {% endfor %} {% endif %} # Snow configuration yaml {% if DO_JEDISNOWDA %} - - "{{ COM_CONF | relpath(ROTDIR) }}/{{ head }}letkfoi.yaml" + - "{{ COMIN_CONF | relpath(ROTDIR) }}/{{ head }}letkfoi.yaml" {% endif %} # Input BUFR files - - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}nsstbufr" - - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr" - - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr.acft_profiles" + - "{{ COMIN_OBS | relpath(ROTDIR) }}/{{ head }}nsstbufr" + - "{{ COMIN_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr" + - "{{ COMIN_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr.acft_profiles" diff --git a/parm/archive/gdas_restartb.yaml.j2 b/parm/archive/gdas_restartb.yaml.j2 index c5cb29329f..0bbf517fb2 100644 --- a/parm/archive/gdas_restartb.yaml.j2 +++ b/parm/archive/gdas_restartb.yaml.j2 @@ -12,14 +12,14 @@ gdas_restartb: {% set offset_HH = offset_dt | strftime("%H") %} {% set prefix = offset_YMD + "." + offset_HH + "0000" %} {% for itile in range(1, 7) %} - - "{{ COM_ATMOS_RESTART | relpath(ROTDIR) }}/{{ prefix }}.sfcanl_data.tile{{ itile }}.nc" + - "{{ COMIN_ATMOS_RESTART | relpath(ROTDIR) }}/{{ prefix }}.sfcanl_data.tile{{ itile }}.nc" {% endfor %} {% endif %} # Regardless, always grab the center surface analysis data. {% set prefix = cycle_YMD + "." + cycle_HH + "0000" %} {% for itile in range(1, 7) %} - - "{{ COM_ATMOS_RESTART | relpath(ROTDIR) }}/{{ prefix }}.sfcanl_data.tile{{ itile }}.nc" + - "{{ COMIN_ATMOS_RESTART | relpath(ROTDIR) }}/{{ prefix }}.sfcanl_data.tile{{ itile }}.nc" {% endfor %} # Now get the restart files. @@ -31,9 +31,9 @@ gdas_restartb: {% set r_prefix = r_YMD + "." + r_HH + "0000" %} {% for itile in range(1, 7) %} {% for datatype in ["ca_data", "fv_core.res", "fv_srf_wnd.res", "fv_tracer.res", "phy_data", "sfc_data"] %} - - "{{ COM_ATMOS_RESTART | relpath(ROTDIR) }}/{{ r_prefix }}.{{datatype}}.tile{{ itile }}.nc" + - "{{ COMIN_ATMOS_RESTART | relpath(ROTDIR) }}/{{ r_prefix }}.{{datatype}}.tile{{ itile }}.nc" {% endfor %} {% endfor %} - - "{{ COM_ATMOS_RESTART | relpath(ROTDIR) }}/{{ r_prefix }}.coupler.res" - - "{{ COM_ATMOS_RESTART | relpath(ROTDIR) }}/{{ r_prefix }}.fv_core.res.nc" + - "{{ COMIN_ATMOS_RESTART | relpath(ROTDIR) }}/{{ r_prefix }}.coupler.res" + - "{{ COMIN_ATMOS_RESTART | relpath(ROTDIR) }}/{{ r_prefix }}.fv_core.res.nc" {% endfor %} diff --git a/parm/archive/gdasice.yaml.j2 b/parm/archive/gdasice.yaml.j2 index 23337a8856..da02decf83 100644 --- a/parm/archive/gdasice.yaml.j2 +++ b/parm/archive/gdasice.yaml.j2 @@ -3,8 +3,8 @@ gdasice: name: "GDASICE" target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdasice.tar" required: - - "{{ COM_ICE_HISTORY | relpath(ROTDIR) }}/{{ head }}ic.nc" + - "{{ COMIN_ICE_HISTORY | relpath(ROTDIR) }}/{{ head }}ic.nc" {% for fhr in range(FHOUT_ICE, FHMAX+1, FHOUT_ICE) %} - - "{{ COM_ICE_HISTORY | relpath(ROTDIR) }}/{{ head }}inst.f{{ '%03d' % fhr }}.nc" + - "{{ COMIN_ICE_HISTORY | relpath(ROTDIR) }}/{{ head }}inst.f{{ '%03d' % fhr }}.nc" {% endfor %} - - '{{ COM_CONF | relpath(ROTDIR) }}/ufs.ice_in' + - '{{ COMIN_CONF | relpath(ROTDIR) }}/ufs.ice_in' diff --git a/parm/archive/gdasice_restart.yaml.j2 b/parm/archive/gdasice_restart.yaml.j2 index 39877674fb..15c8ba627d 100644 --- a/parm/archive/gdasice_restart.yaml.j2 +++ b/parm/archive/gdasice_restart.yaml.j2 @@ -4,4 +4,4 @@ gdasice_restart: target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdasice_restart.tar" required: # TODO explicitly name the restart files to archive - - '{{ COM_ICE_RESTART | relpath(ROTDIR) }}/*' + - '{{ COMIN_ICE_RESTART | relpath(ROTDIR) }}/*' diff --git a/parm/archive/gdasocean.yaml.j2 b/parm/archive/gdasocean.yaml.j2 index 4e92bba1a0..9e6ca38851 100644 --- a/parm/archive/gdasocean.yaml.j2 +++ b/parm/archive/gdasocean.yaml.j2 @@ -4,6 +4,6 @@ gdasocean: target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdasocean.tar" required: {% for fhr in range(FHMIN, FHMAX + 1, FHOUT_OCN) %} - - "{{ COM_OCEAN_HISTORY | relpath(ROTDIR) }}/{{ head }}inst.f{{ '%03d' % fhr }}.nc" + - "{{ COMIN_OCEAN_HISTORY | relpath(ROTDIR) }}/{{ head }}inst.f{{ '%03d' % fhr }}.nc" {% endfor %} - - '{{ COM_CONF | relpath(ROTDIR) }}/ufs.MOM_input' + - '{{ COMIN_CONF | relpath(ROTDIR) }}/ufs.MOM_input' diff --git a/parm/archive/gdasocean_analysis.yaml.j2 b/parm/archive/gdasocean_analysis.yaml.j2 index 2417ddf6e7..d127ee0b75 100644 --- a/parm/archive/gdasocean_analysis.yaml.j2 +++ b/parm/archive/gdasocean_analysis.yaml.j2 @@ -3,23 +3,23 @@ gdasocean_analysis: name: "GDASOCEAN_ANALYSIS" target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdasocean_analysis.tar" required: - - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocninc.nc' + - '{{ COMIN_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocninc.nc' {% set ocngrid_cycle = '%02d' % (((cycle_HH | int) - 3) % 24) %} - - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/gdas.t{{ ocngrid_cycle }}z.ocngrid.nc' + - '{{ COMIN_OCEAN_ANALYSIS | relpath(ROTDIR) }}/gdas.t{{ ocngrid_cycle }}z.ocngrid.nc' {% for domain in ["ocn", "ice"] %} - - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}{{domain}}.bkgerr_stddev.nc' - - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}{{domain}}.incr.nc' - - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}{{domain}}ana.nc' + - '{{ COMIN_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}{{domain}}.bkgerr_stddev.nc' + - '{{ COMIN_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}{{domain}}.incr.nc' + - '{{ COMIN_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}{{domain}}ana.nc' {% if NMEM_ENS > 2 %} - - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}{{domain}}.recentering_error.nc' + - '{{ COMIN_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}{{domain}}.recentering_error.nc' {% endif %} {% endfor %} {% if NMEM_ENS > 2 %} - - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.ssh_steric_stddev.nc' - - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.ssh_unbal_stddev.nc' - - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.ssh_total_stddev.nc' - - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.steric_explained_variance.nc' + - '{{ COMIN_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.ssh_steric_stddev.nc' + - '{{ COMIN_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.ssh_unbal_stddev.nc' + - '{{ COMIN_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.ssh_total_stddev.nc' + - '{{ COMIN_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.steric_explained_variance.nc' {% endif %} - - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.*.stats.csv' - - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/diags/*.nc4' - - '{{ COM_OCEAN_ANALYSIS | relpath(ROTDIR) }}/yaml/*.yaml' + - '{{ COMIN_OCEAN_ANALYSIS | relpath(ROTDIR) }}/{{ head }}ocn.*.stats.csv' + - '{{ COMIN_OCEAN_ANALYSIS | relpath(ROTDIR) }}/diags/*.nc4' + - '{{ COMIN_OCEAN_ANALYSIS | relpath(ROTDIR) }}/yaml/*.yaml' diff --git a/parm/archive/gdasocean_restart.yaml.j2 b/parm/archive/gdasocean_restart.yaml.j2 index 21bfc3955f..f2b6bfb875 100644 --- a/parm/archive/gdasocean_restart.yaml.j2 +++ b/parm/archive/gdasocean_restart.yaml.j2 @@ -4,5 +4,5 @@ gdasocean_restart: target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdasocean_restart.tar" required: # TODO explicitly name the restart files to archive - - '{{ COM_OCEAN_RESTART | relpath(ROTDIR) }}/*' - - '{{ COM_MED_RESTART | relpath(ROTDIR) }}/*' + - '{{ COMIN_OCEAN_RESTART | relpath(ROTDIR) }}/*' + - '{{ COMIN_MED_RESTART | relpath(ROTDIR) }}/*' diff --git a/parm/archive/gdaswave.yaml.j2 b/parm/archive/gdaswave.yaml.j2 index 74a5a64dbf..220770b38d 100644 --- a/parm/archive/gdaswave.yaml.j2 +++ b/parm/archive/gdaswave.yaml.j2 @@ -4,5 +4,5 @@ gdaswave: target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdaswave.tar" required: # TODO explicitly name the wave grid/station files to archive - - "{{ COM_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*" - - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}*" + - "{{ COMIN_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*" + - "{{ COMIN_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}*" diff --git a/parm/archive/gdaswave_restart.yaml.j2 b/parm/archive/gdaswave_restart.yaml.j2 index 8387d48616..7ada504e2a 100644 --- a/parm/archive/gdaswave_restart.yaml.j2 +++ b/parm/archive/gdaswave_restart.yaml.j2 @@ -3,4 +3,4 @@ gdaswave_restart: target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gdaswave_restart.tar" required: # TODO explicitly name the wave restart files to archive - - "{{ COM_WAVE_RESTART | relpath(ROTDIR) }}/*" + - "{{ COMIN_WAVE_RESTART | relpath(ROTDIR) }}/*" diff --git a/parm/archive/gfs_downstream.yaml.j2 b/parm/archive/gfs_downstream.yaml.j2 index 23c9383d28..ed5317b42c 100644 --- a/parm/archive/gfs_downstream.yaml.j2 +++ b/parm/archive/gfs_downstream.yaml.j2 @@ -3,10 +3,10 @@ gfs_downstream: name: "GFS_DOWNSTREAM" target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfs_downstream.tar" required: - - "{{ COM_ATMOS_GEMPAK | relpath(ROTDIR) }}/gfs_{{ cycle_YMDH }}.sfc" - - "{{ COM_ATMOS_GEMPAK | relpath(ROTDIR) }}/gfs_{{ cycle_YMDH }}.snd" + - "{{ COMIN_ATMOS_GEMPAK | relpath(ROTDIR) }}/gfs_{{ cycle_YMDH }}.sfc" + - "{{ COMIN_ATMOS_GEMPAK | relpath(ROTDIR) }}/gfs_{{ cycle_YMDH }}.snd" {% for i in range(1, NUM_SND_COLLECTIVES) %} - - "{{ COM_ATMOS_WMO | relpath(ROTDIR) }}/gfs_collective{{ i }}.postsnd_{{ cycle_HH }}" + - "{{ COMIN_ATMOS_WMO | relpath(ROTDIR) }}/gfs_collective{{ i }}.postsnd_{{ cycle_HH }}" {% endfor %} - - "{{ COM_ATMOS_BUFR | relpath(ROTDIR) }}/bufr.t{{ cycle_HH }}z" - - "{{ COM_ATMOS_BUFR | relpath(ROTDIR) }}/gfs.t{{ cycle_HH }}z.bufrsnd.tar.gz" + - "{{ COMIN_ATMOS_BUFR | relpath(ROTDIR) }}/bufr.t{{ cycle_HH }}z" + - "{{ COMIN_ATMOS_BUFR | relpath(ROTDIR) }}/gfs.t{{ cycle_HH }}z.bufrsnd.tar.gz" diff --git a/parm/archive/gfs_flux.yaml.j2 b/parm/archive/gfs_flux.yaml.j2 index 66c8221f60..46bd0624b6 100644 --- a/parm/archive/gfs_flux.yaml.j2 +++ b/parm/archive/gfs_flux.yaml.j2 @@ -4,6 +4,6 @@ gfs_flux: target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfs_flux.tar" required: {% for fhr in range(FHMIN_GFS, FHMAX_GFS + FHOUT_GFS, FHOUT_GFS) %} - - "{{ COM_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2" - - "{{ COM_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2.idx" + - "{{ COMIN_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2" + - "{{ COMIN_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2.idx" {% endfor %} diff --git a/parm/archive/gfs_flux_1p00.yaml.j2 b/parm/archive/gfs_flux_1p00.yaml.j2 index 2f5c9c8910..97fcd6e4d2 100644 --- a/parm/archive/gfs_flux_1p00.yaml.j2 +++ b/parm/archive/gfs_flux_1p00.yaml.j2 @@ -4,6 +4,6 @@ gfs_flux_1p00: target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfs_flux_1p00.tar" required: {% for fhr in range(FHMIN_GFS, FHMAX_GFS + FHOUT_GFS, FHOUT_GFS) %} - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}flux.1p00.f{{ '%03d' % fhr }}" - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}flux.1p00.f{{ '%03d' % fhr }}.idx" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}flux.1p00.f{{ '%03d' % fhr }}" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}flux.1p00.f{{ '%03d' % fhr }}.idx" {% endfor %} diff --git a/parm/archive/gfs_netcdfa.yaml.j2 b/parm/archive/gfs_netcdfa.yaml.j2 index 6bcafe1b89..8c0d4a813f 100644 --- a/parm/archive/gfs_netcdfa.yaml.j2 +++ b/parm/archive/gfs_netcdfa.yaml.j2 @@ -3,14 +3,14 @@ gfs_netcdfa: name: "GFS_NETCDFA" target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfs_netcdfa.tar" required: - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmanl.nc" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}sfcanl.nc" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atminc.nc" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmanl.nc" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}sfcanl.nc" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atminc.nc" {% for iauhr in iaufhrs if iauhr != 6 %} - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmi{{ "%03d" % iauhr }}.nc" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmi{{ "%03d" % iauhr }}.nc" {% endfor %} optional: {% if not DO_JEDIATMVAR %} - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}dtfanl.nc" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}loginc.txt" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}dtfanl.nc" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}loginc.txt" {% endif %} diff --git a/parm/archive/gfs_netcdfb.yaml.j2 b/parm/archive/gfs_netcdfb.yaml.j2 index b0393d63b6..727f054715 100644 --- a/parm/archive/gfs_netcdfb.yaml.j2 +++ b/parm/archive/gfs_netcdfb.yaml.j2 @@ -4,6 +4,6 @@ gfs_netcdfb: target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfs_netcdfb.tar" required: {% for fhr in range(0, ARCH_GAUSSIAN_FHMAX + ARCH_GAUSSIAN_FHINC, ARCH_GAUSSIAN_FHINC) %} - - "{{ COM_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atmf{{ '%03d' % fhr }}.nc" - - "{{ COM_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}sfcf{{ '%03d' % fhr }}.nc" + - "{{ COMIN_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atmf{{ '%03d' % fhr }}.nc" + - "{{ COMIN_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}sfcf{{ '%03d' % fhr }}.nc" {% endfor %} diff --git a/parm/archive/gfs_pgrb2b.yaml.j2 b/parm/archive/gfs_pgrb2b.yaml.j2 index b06dd14b73..ca20d1a3d8 100644 --- a/parm/archive/gfs_pgrb2b.yaml.j2 +++ b/parm/archive/gfs_pgrb2b.yaml.j2 @@ -4,16 +4,16 @@ gfs_pgrb2b: target: "{{ ATARDIR }}/{{ cycle_YMDH }}/gfs_pgrb2b.tar" required: {% if MODE == "cycled" %} - - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2b.0p25.anl" - - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2b.0p25.anl.idx" - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2b.1p00.anl" - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2b.1p00.anl.idx" + - "{{ COMIN_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2b.0p25.anl" + - "{{ COMIN_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2b.0p25.anl.idx" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2b.1p00.anl" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2b.1p00.anl.idx" {% endif %} {% if ARCH_GAUSSIAN %} {% for fhr in range(0, FHMAX_GFS + FHOUT_GFS, FHOUT_GFS) %} - - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2b.0p25.f{{ '%03d' % fhr }}" - - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2b.0p25.f{{ '%03d' % fhr }}.idx" - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2b.1p00.f{{ '%03d' % fhr }}" - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2b.1p00.f{{ '%03d' % fhr }}.idx" + - "{{ COMIN_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2b.0p25.f{{ '%03d' % fhr }}" + - "{{ COMIN_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2b.0p25.f{{ '%03d' % fhr }}.idx" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2b.1p00.f{{ '%03d' % fhr }}" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2b.1p00.f{{ '%03d' % fhr }}.idx" {% endfor %} {% endif %} diff --git a/parm/archive/gfs_restarta.yaml.j2 b/parm/archive/gfs_restarta.yaml.j2 index c2ad717484..8f6a0b6c10 100644 --- a/parm/archive/gfs_restarta.yaml.j2 +++ b/parm/archive/gfs_restarta.yaml.j2 @@ -12,12 +12,12 @@ gfs_restarta: {% set anl_timedelta = anl_offset | to_timedelta %} {% set anl_time = current_cycle | add_to_datetime(anl_timedelta) %} {% for i_tile in range(1, 7) %} - - "{{ COM_ATMOS_RESTART | relpath(ROTDIR) }}/{{ anl_time | to_YMD }}.{{ anl_time | strftime("%H") }}0000.sfcanl_data.tile{{ i_tile }}.nc" + - "{{ COMIN_ATMOS_RESTART | relpath(ROTDIR) }}/{{ anl_time | to_YMD }}.{{ anl_time | strftime("%H") }}0000.sfcanl_data.tile{{ i_tile }}.nc" {% endfor %} {% elif MODE == "forecast-only" %} - - "{{ COM_ATMOS_INPUT | relpath(ROTDIR) }}/gfs_ctrl.nc" + - "{{ COMIN_ATMOS_INPUT | relpath(ROTDIR) }}/gfs_ctrl.nc" {% for i_tile in range(1, 7) %} - - "{{ COM_ATMOS_INPUT | relpath(ROTDIR) }}/gfs_data.tile{{ i_tile }}.nc" - - "{{ COM_ATMOS_INPUT | relpath(ROTDIR) }}/sfc_data.tile{{ i_tile }}.nc" + - "{{ COMIN_ATMOS_INPUT | relpath(ROTDIR) }}/gfs_data.tile{{ i_tile }}.nc" + - "{{ COMIN_ATMOS_INPUT | relpath(ROTDIR) }}/sfc_data.tile{{ i_tile }}.nc" {% endfor %} {% endif %} diff --git a/parm/archive/gfsa.yaml.j2 b/parm/archive/gfsa.yaml.j2 index 0a8e65d3ef..e76c26e60e 100644 --- a/parm/archive/gfsa.yaml.j2 +++ b/parm/archive/gfsa.yaml.j2 @@ -12,57 +12,57 @@ gfsa: {% endfor %} # UFS configuration - - "{{ COM_CONF | relpath(ROTDIR) }}/ufs.input.nml" + - "{{ COMIN_CONF | relpath(ROTDIR) }}/ufs.input.nml" {% if MODE == "cycled" %} # Analysis GRIB2 (gridded) data - - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl" - - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl.idx" - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl" - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl.idx" + - "{{ COMIN_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl" + - "{{ COMIN_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl.idx" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl.idx" {% if DO_VMINMON %} # Minimization monitor - - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.costs.txt" - - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.cost_terms.txt" - - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.gnorms.ieee_d" - - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.reduction.ieee_d" - - "{{ COM_ATMOS_MINMON | relpath(ROTDIR) }}/gnorm_data.txt" + - "{{ COMIN_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.costs.txt" + - "{{ COMIN_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.cost_terms.txt" + - "{{ COMIN_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.gnorms.ieee_d" + - "{{ COMIN_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.reduction.ieee_d" + - "{{ COMIN_ATMOS_MINMON | relpath(ROTDIR) }}/gnorm_data.txt" {% endif %} # State data {% if DO_JEDIATMVAR %} - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmvar.yaml" - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmstat" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmvar.yaml" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmstat" {% else %} - - "{{ COM_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}gsistat" + - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}gsistat" {% endif %} {% if AERO_ANL_CDUMP == "gfs" or AERO_ANL_CDUMP == "both" %} - - "{{ COM_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" + - "{{ COMIN_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" {% endif %} {% if DO_PREP_OBS_AERO %} - - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}aeroobs" - - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}aerorawobs" + - "{{ COMIN_OBS | relpath(ROTDIR) }}/{{ head }}aeroobs" + - "{{ COMIN_OBS | relpath(ROTDIR) }}/{{ head }}aerorawobs" {% endif %} # BUFR inputs - - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}nsstbufr" - - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr" - - "{{ COM_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr.acft_profiles" + - "{{ COMIN_OBS | relpath(ROTDIR) }}/{{ head }}nsstbufr" + - "{{ COMIN_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr" + - "{{ COMIN_OBS | relpath(ROTDIR) }}/{{ head }}prepbufr.acft_profiles" {% endif %} # Full cycle # Forecast GRIB2 products {% for fhr in range(FHMIN_GFS, FHMAX_GFS + FHOUT_GFS, FHOUT_GFS) %} - - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}" - - "{{ COM_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}.idx" - - "{{ COM_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atm.logf{{ '%03d' % fhr }}.txt" + - "{{ COMIN_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}" + - "{{ COMIN_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}.idx" + - "{{ COMIN_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atm.logf{{ '%03d' % fhr }}.txt" {% endfor %} optional: # Cyclone tracking data; only present if there's something to track. - - "{{ COM_ATMOS_TRACK | relpath(ROTDIR) }}/avno.t{{ cycle_HH }}z.cyclone.trackatcfunix" - - "{{ COM_ATMOS_TRACK | relpath(ROTDIR) }}/avnop.t{{ cycle_HH }}z.cyclone.trackatcfunix" - - "{{ COM_ATMOS_GENESIS | relpath(ROTDIR) }}/trak.gfso.atcfunix.{{ cycle_YMDH }}" - - "{{ COM_ATMOS_GENESIS | relpath(ROTDIR) }}/trak.gfso.atcfunix.altg.{{ cycle_YMDH }}" - - "{{ COM_ATMOS_GENESIS | relpath(ROTDIR) }}/storms.gfso.atcf_gen.{{ cycle_YMDH }}" - - "{{ COM_ATMOS_GENESIS | relpath(ROTDIR) }}/storms.gfso.atcf_gen.altg.{{ cycle_YMDH }}" + - "{{ COMIN_ATMOS_TRACK | relpath(ROTDIR) }}/avno.t{{ cycle_HH }}z.cyclone.trackatcfunix" + - "{{ COMIN_ATMOS_TRACK | relpath(ROTDIR) }}/avnop.t{{ cycle_HH }}z.cyclone.trackatcfunix" + - "{{ COMIN_ATMOS_GENESIS | relpath(ROTDIR) }}/trak.gfso.atcfunix.{{ cycle_YMDH }}" + - "{{ COMIN_ATMOS_GENESIS | relpath(ROTDIR) }}/trak.gfso.atcfunix.altg.{{ cycle_YMDH }}" + - "{{ COMIN_ATMOS_GENESIS | relpath(ROTDIR) }}/storms.gfso.atcf_gen.{{ cycle_YMDH }}" + - "{{ COMIN_ATMOS_GENESIS | relpath(ROTDIR) }}/storms.gfso.atcf_gen.altg.{{ cycle_YMDH }}" diff --git a/parm/archive/gfsb.yaml.j2 b/parm/archive/gfsb.yaml.j2 index cbb4d4fad8..e6ffa05766 100644 --- a/parm/archive/gfsb.yaml.j2 +++ b/parm/archive/gfsb.yaml.j2 @@ -5,16 +5,16 @@ gfsb: required: {% if MODE == "cycled" %} # GRIB2 (subsampled) analysis data - - "{{ COM_ATMOS_GRIB_0p50 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p50.anl" - - "{{ COM_ATMOS_GRIB_0p50 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p50.anl.idx" - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl" - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl.idx" + - "{{ COMIN_ATMOS_GRIB_0p50 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p50.anl" + - "{{ COMIN_ATMOS_GRIB_0p50 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p50.anl.idx" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.anl.idx" {% endif %} # GRIB2 orecast data {% for fhr in range(FHMIN_GFS, FHMAX_GFS + FHOUT_GFS, FHOUT_GFS) %} - - "{{ COM_ATMOS_GRIB_0p50 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p50.f{{ '%03d' % fhr }}" - - "{{ COM_ATMOS_GRIB_0p50 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p50.f{{ '%03d' % fhr }}.idx" - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}" - - "{{ COM_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}.idx" + - "{{ COMIN_ATMOS_GRIB_0p50 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p50.f{{ '%03d' % fhr }}" + - "{{ COMIN_ATMOS_GRIB_0p50 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p50.f{{ '%03d' % fhr }}.idx" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}.idx" {% endfor %} diff --git a/parm/archive/gfswave.yaml.j2 b/parm/archive/gfswave.yaml.j2 index 8422377b7a..6909421757 100644 --- a/parm/archive/gfswave.yaml.j2 +++ b/parm/archive/gfswave.yaml.j2 @@ -7,24 +7,24 @@ gfswave: {% for fh in range(0, FHMAX_HF_WAV + FHOUT_HF_WAV, FHOUT_HF_WAV) %} # NOTE This is as explicit as possible without major logic to parse wavepostGRD. # Matches files of the form "gfswave.tCCz...fHHH.grib2". - - "{{ COM_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2" - - "{{ COM_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2.idx" + - "{{ COMIN_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2" + - "{{ COMIN_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2.idx" {% endfor %} # Global wave GRIB2 forecast products {% for fh in range(FHMAX_HF_WAV + FHOUT_WAV, FHMAX_WAV_GFS + FHOUT_WAV, FHOUT_WAV) %} - - "{{ COM_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2" - - "{{ COM_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2.idx" + - "{{ COMIN_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2" + - "{{ COMIN_WAVE_GRID | relpath(ROTDIR) }}/{{ head }}*.*.f{{ '%03d' % fh }}.grib2.idx" {% endfor %} # Wave bulletins - - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}bull_tar" - - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}cbull_tar" - - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}spec_tar.gz" + - "{{ COMIN_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}bull_tar" + - "{{ COMIN_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}cbull_tar" + - "{{ COMIN_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}spec_tar.gz" # Wave IBP bulletins {% if DOIBP_WAV %} - - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}ibpbull_tar" - - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}ibpcbull_tar" - - "{{ COM_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}ibp_tar" + - "{{ COMIN_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}ibpbull_tar" + - "{{ COMIN_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}ibpcbull_tar" + - "{{ COMIN_WAVE_STATION | relpath(ROTDIR) }}/{{ head }}ibp_tar" {% endif %} diff --git a/parm/archive/ice_6hravg.yaml.j2 b/parm/archive/ice_6hravg.yaml.j2 index 251e51b110..6eb64ae70d 100644 --- a/parm/archive/ice_6hravg.yaml.j2 +++ b/parm/archive/ice_6hravg.yaml.j2 @@ -3,7 +3,7 @@ ice_6hravg: name: "ICE_6HRAVG" target: "{{ ATARDIR }}/{{ cycle_YMDH }}/ice_6hravg.tar" required: - - "{{ COM_ICE_HISTORY | relpath(ROTDIR) }}/{{ head }}ic.nc" + - "{{ COMIN_ICE_HISTORY | relpath(ROTDIR) }}/{{ head }}ic.nc" {% for fhr in range(6, FHMAX_GFS + 6, 6) %} - - "{{ COM_ICE_HISTORY | relpath(ROTDIR) }}/{{ head }}6hr_avg.f{{ '%03d' % fhr }}.nc" + - "{{ COMIN_ICE_HISTORY | relpath(ROTDIR) }}/{{ head }}6hr_avg.f{{ '%03d' % fhr }}.nc" {% endfor %} diff --git a/parm/archive/ice_grib2.yaml.j2 b/parm/archive/ice_grib2.yaml.j2 index 9d52f174ab..04bc2f5873 100644 --- a/parm/archive/ice_grib2.yaml.j2 +++ b/parm/archive/ice_grib2.yaml.j2 @@ -7,13 +7,13 @@ ice_grib2: {% for fhr in range(FHOUT_ICE_GFS, FHMAX_GFS + FHOUT_ICE_GFS, FHOUT_ICE_GFS) %} {% set fhr3 = '%03d' % fhr %} {% if ICERES == 500 %} - - "{{ COM_ICE_GRIB | relpath(ROTDIR) }}/5p00/{{ head }}5p00.f{{ fhr3 }}.grib2" - - "{{ COM_ICE_GRIB | relpath(ROTDIR) }}/5p00/{{ head }}5p00.f{{ fhr3 }}.grib2.idx" + - "{{ COMIN_ICE_GRIB | relpath(ROTDIR) }}/5p00/{{ head }}5p00.f{{ fhr3 }}.grib2" + - "{{ COMIN_ICE_GRIB | relpath(ROTDIR) }}/5p00/{{ head }}5p00.f{{ fhr3 }}.grib2.idx" {% elif ICERES == 100 %} - - "{{ COM_ICE_GRIB | relpath(ROTDIR) }}/1p00/{{ head }}1p00.f{{ fhr3 }}.grib2" - - "{{ COM_ICE_GRIB | relpath(ROTDIR) }}/1p00/{{ head }}1p00.f{{ fhr3 }}.grib2.idx" + - "{{ COMIN_ICE_GRIB | relpath(ROTDIR) }}/1p00/{{ head }}1p00.f{{ fhr3 }}.grib2" + - "{{ COMIN_ICE_GRIB | relpath(ROTDIR) }}/1p00/{{ head }}1p00.f{{ fhr3 }}.grib2.idx" {% elif ICERES == 25 or ICERES == "025" %} - - "{{ COM_ICE_GRIB | relpath(ROTDIR) }}/0p25/{{ head }}0p25.f{{ fhr3 }}.grib2" - - "{{ COM_ICE_GRIB | relpath(ROTDIR) }}/0p25/{{ head }}0p25.f{{ fhr3 }}.grib2.idx" + - "{{ COMIN_ICE_GRIB | relpath(ROTDIR) }}/0p25/{{ head }}0p25.f{{ fhr3 }}.grib2" + - "{{ COMIN_ICE_GRIB | relpath(ROTDIR) }}/0p25/{{ head }}0p25.f{{ fhr3 }}.grib2.idx" {% endif %} {% endfor %} diff --git a/parm/archive/master_enkf.yaml.j2 b/parm/archive/master_enkf.yaml.j2 index fb6a3d30ac..2fd94597f8 100644 --- a/parm/archive/master_enkf.yaml.j2 +++ b/parm/archive/master_enkf.yaml.j2 @@ -37,12 +37,12 @@ datasets: # Archive individual member data # First, construct individual member directories from templates -# COM_ATMOS_ANALYSIS_MEM, COM_ATMOS_HISTORY_MEM, and COM_ATMOS_RESTART_MEM +# COMIN_ATMOS_ANALYSIS_MEM, COMIN_ATMOS_HISTORY_MEM, and COMIN_ATMOS_RESTART_MEM # Declare to-be-filled lists of member COM directories -{% set COM_ATMOS_ANALYSIS_MEM_list = [] %} -{% set COM_ATMOS_RESTART_MEM_list = [] %} -{% set COM_ATMOS_HISTORY_MEM_list = [] %} +{% set COMIN_ATMOS_ANALYSIS_MEM_list = [] %} +{% set COMIN_ATMOS_RESTART_MEM_list = [] %} +{% set COMIN_ATMOS_HISTORY_MEM_list = [] %} # Determine which ensemble members belong to this group {% set first_group_mem = (ENSGRP - 1) * NMEM_EARCGRP + 1 %} @@ -62,22 +62,22 @@ datasets: # This must be done in a namespace to overcome jinja scoping # Variables set inside of a for loop are lost at the end of the loop # unless they are part of a namespace -{% set com_ns = namespace(COM_ATMOS_ANALYSIS_MEM = COM_ATMOS_ANALYSIS_TMPL, - COM_ATMOS_HISTORY_MEM = COM_ATMOS_HISTORY_TMPL, - COM_ATMOS_RESTART_MEM = COM_ATMOS_RESTART_TMPL) %} +{% set com_ns = namespace(COMIN_ATMOS_ANALYSIS_MEM = COMIN_ATMOS_ANALYSIS_TMPL, + COMIN_ATMOS_HISTORY_MEM = COMIN_ATMOS_HISTORY_TMPL, + COMIN_ATMOS_RESTART_MEM = COMIN_ATMOS_RESTART_TMPL) %} {% for key in tmpl_dict.keys() %} {% set search_term = '${' + key + '}' %} {% set replace_term = tmpl_dict[key] %} -{% set com_ns.COM_ATMOS_ANALYSIS_MEM = com_ns.COM_ATMOS_ANALYSIS_MEM.replace(search_term, replace_term) %} -{% set com_ns.COM_ATMOS_HISTORY_MEM = com_ns.COM_ATMOS_HISTORY_MEM.replace(search_term, replace_term) %} -{% set com_ns.COM_ATMOS_RESTART_MEM = com_ns.COM_ATMOS_RESTART_MEM.replace(search_term, replace_term) %} +{% set com_ns.COMIN_ATMOS_ANALYSIS_MEM = com_ns.COMIN_ATMOS_ANALYSIS_MEM.replace(search_term, replace_term) %} +{% set com_ns.COMIN_ATMOS_HISTORY_MEM = com_ns.COMIN_ATMOS_HISTORY_MEM.replace(search_term, replace_term) %} +{% set com_ns.COMIN_ATMOS_RESTART_MEM = com_ns.COMIN_ATMOS_RESTART_MEM.replace(search_term, replace_term) %} {% endfor %} # Append the member COM directories -{% do COM_ATMOS_ANALYSIS_MEM_list.append(com_ns.COM_ATMOS_ANALYSIS_MEM)%} -{% do COM_ATMOS_HISTORY_MEM_list.append(com_ns.COM_ATMOS_HISTORY_MEM)%} -{% do COM_ATMOS_RESTART_MEM_list.append(com_ns.COM_ATMOS_RESTART_MEM)%} +{% do COMIN_ATMOS_ANALYSIS_MEM_list.append(com_ns.COMIN_ATMOS_ANALYSIS_MEM)%} +{% do COMIN_ATMOS_HISTORY_MEM_list.append(com_ns.COMIN_ATMOS_HISTORY_MEM)%} +{% do COMIN_ATMOS_RESTART_MEM_list.append(com_ns.COMIN_ATMOS_RESTART_MEM)%} {% endfor %} diff --git a/parm/archive/ocean_6hravg.yaml.j2 b/parm/archive/ocean_6hravg.yaml.j2 index dac3ce262a..58db08538f 100644 --- a/parm/archive/ocean_6hravg.yaml.j2 +++ b/parm/archive/ocean_6hravg.yaml.j2 @@ -4,5 +4,5 @@ ocean_6hravg: target: "{{ ATARDIR }}/{{ cycle_YMDH }}/ocean_6hravg.tar" required: {% for fhr in range(6, FHMAX_GFS + 6, 6) %} - - "{{ COM_OCEAN_HISTORY | relpath(ROTDIR) }}/{{ head }}6hr_avg.f{{ '%03d' % fhr }}.nc" + - "{{ COMIN_OCEAN_HISTORY | relpath(ROTDIR) }}/{{ head }}6hr_avg.f{{ '%03d' % fhr }}.nc" {% endfor %} diff --git a/parm/archive/ocean_grib2.yaml.j2 b/parm/archive/ocean_grib2.yaml.j2 index 784e30021d..e8f2e3170b 100644 --- a/parm/archive/ocean_grib2.yaml.j2 +++ b/parm/archive/ocean_grib2.yaml.j2 @@ -6,13 +6,13 @@ ocean_grib2: {% for fhr in range(FHOUT_OCN_GFS, FHMAX_GFS + FHOUT_OCN_GFS, FHOUT_OCN_GFS) %} {% set fhr3 = '%03d' % fhr %} {% if OCNRES == 500 %} - - "{{ COM_OCEAN_GRIB | relpath(ROTDIR) }}/5p00/{{ head }}5p00.f{{ fhr3 }}.grib2" - - "{{ COM_OCEAN_GRIB | relpath(ROTDIR) }}/5p00/{{ head }}5p00.f{{ fhr3 }}.grib2.idx" + - "{{ COMIN_OCEAN_GRIB | relpath(ROTDIR) }}/5p00/{{ head }}5p00.f{{ fhr3 }}.grib2" + - "{{ COMIN_OCEAN_GRIB | relpath(ROTDIR) }}/5p00/{{ head }}5p00.f{{ fhr3 }}.grib2.idx" {% elif OCNRES == 100 %} - - "{{ COM_OCEAN_GRIB | relpath(ROTDIR) }}/1p00/{{ head }}1p00.f{{ fhr3 }}.grib2" - - "{{ COM_OCEAN_GRIB | relpath(ROTDIR) }}/1p00/{{ head }}1p00.f{{ fhr3 }}.grib2.idx" + - "{{ COMIN_OCEAN_GRIB | relpath(ROTDIR) }}/1p00/{{ head }}1p00.f{{ fhr3 }}.grib2" + - "{{ COMIN_OCEAN_GRIB | relpath(ROTDIR) }}/1p00/{{ head }}1p00.f{{ fhr3 }}.grib2.idx" {% elif OCNRES == 25 or OCNRES == "025" %} - - "{{ COM_OCEAN_GRIB | relpath(ROTDIR) }}/0p25/{{ head }}0p25.f{{ fhr3 }}.grib2" - - "{{ COM_OCEAN_GRIB | relpath(ROTDIR) }}/0p25/{{ head }}0p25.f{{ fhr3 }}.grib2.idx" + - "{{ COMIN_OCEAN_GRIB | relpath(ROTDIR) }}/0p25/{{ head }}0p25.f{{ fhr3 }}.grib2" + - "{{ COMIN_OCEAN_GRIB | relpath(ROTDIR) }}/0p25/{{ head }}0p25.f{{ fhr3 }}.grib2.idx" {% endif %} {% endfor %} diff --git a/scripts/exgdas_enkf_earc.py b/scripts/exgdas_enkf_earc.py index 2febbc27f5..c0fc51eee5 100755 --- a/scripts/exgdas_enkf_earc.py +++ b/scripts/exgdas_enkf_earc.py @@ -34,9 +34,9 @@ def main(): for key in keys: archive_dict[key] = archive.task_config[key] - # Also import all COM* directory and template variables + # Also import all COMIN* directory and template variables for key in archive.task_config.keys(): - if key.startswith("COM"): + if key.startswith("COMIN"): archive_dict[key] = archive.task_config[key] cwd = os.getcwd() diff --git a/scripts/exglobal_archive.py b/scripts/exglobal_archive.py index bcd8d522d9..af396d382e 100755 --- a/scripts/exglobal_archive.py +++ b/scripts/exglobal_archive.py @@ -37,9 +37,9 @@ def main(): for key in keys: archive_dict[key] = archive.task_config[key] - # Also import all COM* directory and template variables + # Also import all COMIN* and COMOUT* directory and template variables for key in archive.task_config.keys(): - if key.startswith("COM"): + if key.startswith("COMIN_") or key.startswith("COMOUT_"): archive_dict[key] = archive.task_config[key] cwd = os.getcwd() diff --git a/ush/python/pygfs/task/archive.py b/ush/python/pygfs/task/archive.py index 66d94878e8..269aea0ccc 100644 --- a/ush/python/pygfs/task/archive.py +++ b/ush/python/pygfs/task/archive.py @@ -309,7 +309,7 @@ def _gen_relative_paths(self, root_path: str) -> Dict: rel_path_dict : Dict Dictionary of paths relative to root_path. Members will be named based on the dict names in self.config. For COM paths, the names will - follow COM_ --> _dir. For all other directories, the + follow COMIN_ --> _dir. For all other directories, the names will follow --> _dir. """ @@ -318,7 +318,7 @@ def _gen_relative_paths(self, root_path: str) -> Dict: if isinstance(value, str): if root_path in value: rel_path = value.replace(root_path, "") - rel_key = (key[4:] if key.startswith("COM_") else key).lower() + "_dir" + rel_key = (key[4:] if key.startswith("COMIN_") else key).lower() + "_dir" rel_path_dict[rel_key] = rel_path return rel_path_dict @@ -374,27 +374,28 @@ def _rename_cyclone_expt(arch_dict) -> None: if len(arch_dict.PSLOT) > 4: pslot4 = arch_dict.PSLOT[0:4].upper() - track_dir = arch_dict.COM_ATMOS_TRACK + track_dir_in = arch_dict.COMIN_ATMOS_TRACK + track_dir_out = arch_dict.COMOUT_ATMOS_TRACK run = arch_dict.RUN cycle_HH = strftime(arch_dict.current_cycle, "%H") if run == "gfs": - in_track_file = (track_dir + "/avno.t" + + in_track_file = (track_dir_in + "/avno.t" + cycle_HH + "z.cycle.trackatcfunix") - in_track_p_file = (track_dir + "/avnop.t" + + in_track_p_file = (track_dir_in + "/avnop.t" + cycle_HH + "z.cycle.trackatcfunixp") elif run == "gdas": - in_track_file = (track_dir + "/gdas.t" + + in_track_file = (track_dir_in + "/gdas.t" + cycle_HH + "z.cycle.trackatcfunix") - in_track_p_file = (track_dir + "/gdasp.t" + + in_track_p_file = (track_dir_in + "/gdasp.t" + cycle_HH + "z.cycle.trackatcfunixp") if not os.path.isfile(in_track_file): # Do not attempt to archive the outputs return - out_track_file = track_dir + "/atcfunix." + run + "." + to_YMDH(arch_dict.current_cycle) - out_track_p_file = track_dir + "/atcfunixp." + run + "." + to_YMDH(arch_dict.current_cycle) + out_track_file = track_dir_out + "/atcfunix." + run + "." + to_YMDH(arch_dict.current_cycle) + out_track_p_file = track_dir_out + "/atcfunixp." + run + "." + to_YMDH(arch_dict.current_cycle) def replace_string_from_to_file(filename_in, filename_out, search_str, replace_str): From 3270ac3bf00c3ebc8166c70d84647ec44431fbae Mon Sep 17 00:00:00 2001 From: "Henry R. Winterbottom" <49202169+HenryWinterbottom-NOAA@users.noreply.github.com> Date: Tue, 18 Jun 2024 12:17:59 -0600 Subject: [PATCH 41/45] Hotfix for bug in template names. (#2697) This PR is a hotfix for an incorrectly named (e.g., non-existent) `COM/` template. Resolves #2696 Refs #2451 --- parm/archive/master_enkf.yaml.j2 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/parm/archive/master_enkf.yaml.j2 b/parm/archive/master_enkf.yaml.j2 index 2fd94597f8..f663d02895 100644 --- a/parm/archive/master_enkf.yaml.j2 +++ b/parm/archive/master_enkf.yaml.j2 @@ -62,9 +62,9 @@ datasets: # This must be done in a namespace to overcome jinja scoping # Variables set inside of a for loop are lost at the end of the loop # unless they are part of a namespace -{% set com_ns = namespace(COMIN_ATMOS_ANALYSIS_MEM = COMIN_ATMOS_ANALYSIS_TMPL, - COMIN_ATMOS_HISTORY_MEM = COMIN_ATMOS_HISTORY_TMPL, - COMIN_ATMOS_RESTART_MEM = COMIN_ATMOS_RESTART_TMPL) %} +{% set com_ns = namespace(COMIN_ATMOS_ANALYSIS_MEM = COM_ATMOS_ANALYSIS_TMPL, + COMIN_ATMOS_HISTORY_MEM = COM_ATMOS_HISTORY_TMPL, + COMIN_ATMOS_RESTART_MEM = COM_ATMOS_RESTART_TMPL) %} {% for key in tmpl_dict.keys() %} {% set search_term = '${' + key + '}' %} From 0b810c888239853fedd0e4584fe62536c6aaacdf Mon Sep 17 00:00:00 2001 From: "Henry R. Winterbottom" <49202169+HenryWinterbottom-NOAA@users.noreply.github.com> Date: Tue, 18 Jun 2024 20:32:48 -0600 Subject: [PATCH 42/45] Removes misleading "No such file or directory" syntax errors from output files (#2688) This PR addresses issue #1252. The following is accomplished: - Prior to removing files, the existence of a file is checked prior to attempting to remove; this is performed as noted [here](https://github.com/NOAA-EMC/global-workflow/issues/1252#issue-1538627369); this PR only addresses the the `chgrp` issue. Refs #1252 --------- Co-authored-by: David Huber <69919478+DavidHuber-NOAA@users.noreply.github.com> --- scripts/exglobal_diag.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/exglobal_diag.sh b/scripts/exglobal_diag.sh index 2d48053bd2..e1faa7b2ee 100755 --- a/scripts/exglobal_diag.sh +++ b/scripts/exglobal_diag.sh @@ -232,9 +232,11 @@ EOFdiag # Restrict diagnostic files containing rstprod data rlist="conv_gps conv_ps conv_pw conv_q conv_sst conv_t conv_uv saphir" for rtype in $rlist; do - set +e - ${CHGRP_CMD} *${rtype}* - ${STRICT_ON:-set -e} + for rfile in *"${rtype}"*; do + if [[ -s "${rfile}" ]]; then + ${CHGRP_CMD} "${rfile}" + fi + done done # If requested, create diagnostic file tarballs From 8993b42cb91144c0ab0501dc7841ea8d675c4701 Mon Sep 17 00:00:00 2001 From: Walter Kolczynski - NOAA Date: Wed, 19 Jun 2024 21:51:22 -0400 Subject: [PATCH 43/45] Eliminate post groups (#2667) Eliminates the post groups used for upp and products jobs so that each task only processes one forecast hour. This is more efficient and greatly simplifies downstream dependencies that depend on a specific forecast hour. Resolves #2666 Refs #2642 --- .gitignore | 8 +++++ jobs/rocoto/atmos_ensstat.sh | 20 +++-------- jobs/rocoto/atmos_products.sh | 22 ++++-------- jobs/rocoto/oceanice_products.sh | 18 ++++------ jobs/rocoto/upp.sh | 17 ++++----- parm/config/gefs/config.base | 2 ++ scripts/exgdas_enkf_earc.py | 2 +- workflow/rocoto/gefs_tasks.py | 9 ++--- workflow/rocoto/gfs_tasks.py | 59 ++++++++++---------------------- 9 files changed, 56 insertions(+), 101 deletions(-) diff --git a/.gitignore b/.gitignore index 8314f5bae9..0c15a50661 100644 --- a/.gitignore +++ b/.gitignore @@ -166,6 +166,14 @@ scripts/exemcsfc_global_sfc_prep.sh scripts/exgdas_global_marine_analysis_ecen.py scripts/exglobal_prep_ocean_obs.py # ush symlinks +ush/bufr2ioda_insitu_profile_argo.py +ush/bufr2ioda_insitu_profile_bathy.py +ush/bufr2ioda_insitu_profile_glider.py +ush/bufr2ioda_insitu_profile_marinemammal.py +ush/bufr2ioda_insitu_profile_tesac.py +ush/bufr2ioda_insitu_profile_xbtctd.py +ush/bufr2ioda_insitu_surface_altkob.py +ush/bufr2ioda_insitu_surface_trkob.py ush/chgres_cube.sh ush/emcsfc_ice_blend.sh ush/emcsfc_snow.sh diff --git a/jobs/rocoto/atmos_ensstat.sh b/jobs/rocoto/atmos_ensstat.sh index cbaaff9a0f..76ed7f0a72 100755 --- a/jobs/rocoto/atmos_ensstat.sh +++ b/jobs/rocoto/atmos_ensstat.sh @@ -15,21 +15,11 @@ if (( status != 0 )); then exit "${status}"; fi export job="atmos_ensstat" export jobid="${job}.$$" -############################################################### -# shellcheck disable=SC2153,SC2001 -IFS='_' read -ra fhrs <<< "${FHRLST//f}" # strip off the 'f's and convert to array +export FORECAST_HOUR=$(( 10#${FHR3} )) -#--------------------------------------------------------------- +############################################################### # Execute the JJOB -for fhr in "${fhrs[@]}"; do - # 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_ENSSTAT" - status=$? - if (( status != 0 )); then exit "${status}"; fi -done +############################################################### +"${HOMEgfs}/jobs/JGLOBAL_ATMOS_ENSSTAT" -exit 0 +exit $? diff --git a/jobs/rocoto/atmos_products.sh b/jobs/rocoto/atmos_products.sh index 472f202de8..f6adbcf861 100755 --- a/jobs/rocoto/atmos_products.sh +++ b/jobs/rocoto/atmos_products.sh @@ -15,21 +15,13 @@ if (( status != 0 )); then exit "${status}"; fi export job="atmos_products" export jobid="${job}.$$" -############################################################### -# shellcheck disable=SC2153,SC2001 -IFS='_' read -ra fhrs <<< "${FHRLST//f}" # strip off the 'f's and convert to array +# Negatation needs to be before the base +fhr3_base="10#${FHR3}" +export FORECAST_HOUR=$(( ${fhr3_base/10#-/-10#} )) -#--------------------------------------------------------------- +############################################################### # Execute the JJOB -for fhr in "${fhrs[@]}"; do - # 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 -done +############################################################### +"${HOMEgfs}/jobs/JGLOBAL_ATMOS_PRODUCTS" -exit 0 +exit $? diff --git a/jobs/rocoto/oceanice_products.sh b/jobs/rocoto/oceanice_products.sh index 48816fb3a1..eb704fb35f 100755 --- a/jobs/rocoto/oceanice_products.sh +++ b/jobs/rocoto/oceanice_products.sh @@ -21,17 +21,11 @@ export PYTHONPATH export job="oceanice_products" export jobid="${job}.$$" -############################################################### -# shellcheck disable=SC2153,SC2001 -IFS='_' read -ra fhrs <<< "${FHRLST//f}" # strip off the 'f's and convert to array +export FORECAST_HOUR=$(( 10#${FHR3} )) -#--------------------------------------------------------------- +############################################################### # Execute the JJOB -for fhr in "${fhrs[@]}"; do - export FORECAST_HOUR=$(( 10#${fhr} )) - "${HOMEgfs}/jobs/JGLOBAL_OCEANICE_PRODUCTS" - status=$? - if (( status != 0 )); then exit "${status}"; fi -done - -exit 0 +############################################################### +"${HOMEgfs}/jobs/JGLOBAL_OCEANICE_PRODUCTS" + +exit $? diff --git a/jobs/rocoto/upp.sh b/jobs/rocoto/upp.sh index 18d5c12cea..da0180472d 100755 --- a/jobs/rocoto/upp.sh +++ b/jobs/rocoto/upp.sh @@ -44,16 +44,11 @@ export PYTHONPATH export job="upp" export jobid="${job}.$$" -############################################################### -# shellcheck disable=SC2153,SC2001 -IFS='_' read -ra fhrs <<< "${FHRLST//f}" # strip off the 'f's convert to array +export FORECAST_HOUR=$(( 10#${FHR3} )) +############################################################### # Execute the JJOB -for fhr in "${fhrs[@]}"; do - export FORECAST_HOUR=$(( 10#${fhr} )) - "${HOMEgfs}/jobs/JGLOBAL_ATMOS_UPP" - status=$? - if (( status != 0 )); then exit "${status}"; fi -done - -exit 0 +############################################################### +"${HOMEgfs}/jobs/JGLOBAL_ATMOS_UPP" + +exit $? diff --git a/parm/config/gefs/config.base b/parm/config/gefs/config.base index e98eb41208..16e0fefaba 100644 --- a/parm/config/gefs/config.base +++ b/parm/config/gefs/config.base @@ -256,6 +256,8 @@ export ILPOST=1 # gempak output frequency up to F120 export FHMIN_ENKF=${FHMIN_GFS} export FHMAX_ENKF=${FHMAX_GFS} export FHOUT_ENKF=${FHOUT_GFS} +export FHOUT_OCN=${FHOUT_OCN_GFS} +export FHOUT_ICE=${FHOUT_ICE_GFS} # GFS restart interval in hours export restart_interval_gfs=12 diff --git a/scripts/exgdas_enkf_earc.py b/scripts/exgdas_enkf_earc.py index c0fc51eee5..a515ec9746 100755 --- a/scripts/exgdas_enkf_earc.py +++ b/scripts/exgdas_enkf_earc.py @@ -36,7 +36,7 @@ def main(): # Also import all COMIN* directory and template variables for key in archive.task_config.keys(): - if key.startswith("COMIN"): + if key.startswith("COM"): archive_dict[key] = archive.task_config[key] cwd = os.getcwd() diff --git a/workflow/rocoto/gefs_tasks.py b/workflow/rocoto/gefs_tasks.py index 6fffc881e0..cfd8fa7093 100644 --- a/workflow/rocoto/gefs_tasks.py +++ b/workflow/rocoto/gefs_tasks.py @@ -253,7 +253,7 @@ def _atmosoceaniceprod(self, component: str): postenvars = self.envars.copy() postenvar_dict = {'ENSMEM': '#member#', 'MEMDIR': 'mem#member#', - 'FHRLST': '#fhr#', + 'FHR3': '#fhr#', 'COMPONENT': component} for key, value in postenvar_dict.items(): postenvars.append(rocoto.create_envar(name=key, value=str(value))) @@ -270,11 +270,6 @@ def _atmosoceaniceprod(self, component: str): 'maxtries': '&MAXTRIES;'} fhrs = self._get_forecast_hours('gefs', self._configs[config], component) - - # ocean/ice components do not have fhr 0 as they are averaged output - if component in ['ocean', 'ice'] and 0 in fhrs: - fhrs.remove(0) - fhr_var_dict = {'fhr': ' '.join([f"{fhr:03d}" for fhr in fhrs])} fhr_metatask_dict = {'task_name': f'{component}_prod_#member#', @@ -303,7 +298,7 @@ def atmos_ensstat(self): dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) postenvars = self.envars.copy() - postenvar_dict = {'FHRLST': '#fhr#'} + postenvar_dict = {'FHR3': '#fhr#'} for key, value in postenvar_dict.items(): postenvars.append(rocoto.create_envar(name=key, value=str(value))) diff --git a/workflow/rocoto/gfs_tasks.py b/workflow/rocoto/gfs_tasks.py index 2c74d0f854..60a08549b6 100644 --- a/workflow/rocoto/gfs_tasks.py +++ b/workflow/rocoto/gfs_tasks.py @@ -939,7 +939,7 @@ def _fcst_cycled(self): def atmanlupp(self): postenvars = self.envars.copy() - postenvar_dict = {'FHRLST': 'f000', + postenvar_dict = {'FHR3': '000', 'UPP_RUN': 'analysis'} for key, value in postenvar_dict.items(): postenvars.append(rocoto.create_envar(name=key, value=str(value))) @@ -975,7 +975,7 @@ def atmanlupp(self): def atmanlprod(self): postenvars = self.envars.copy() - postenvar_dict = {'FHRLST': '-f001'} + postenvar_dict = {'FHR3': '-001'} for key, value in postenvar_dict.items(): postenvars.append(rocoto.create_envar(name=key, value=str(value))) @@ -1002,24 +1002,6 @@ def atmanlprod(self): return task - @staticmethod - def _get_ufs_postproc_grps(cdump, config, component='atmos'): - - fhrs = Tasks._get_forecast_hours(cdump, config, component=component) - - nfhrs_per_grp = config.get('NFHRS_PER_GROUP', 1) - ngrps = len(fhrs) // nfhrs_per_grp if len(fhrs) % nfhrs_per_grp == 0 else len(fhrs) // nfhrs_per_grp + 1 - - fhrs = [f'f{fhr:03d}' for fhr in fhrs] - fhrs = np.array_split(fhrs, ngrps) - fhrs = [fhr.tolist() for fhr in fhrs] - - grp = ' '.join(f'_{fhr[0]}-{fhr[-1]}' if len(fhr) > 1 else f'_{fhr[0]}' for fhr in fhrs) - dep = ' '.join([fhr[-1] for fhr in fhrs]) - lst = ' '.join(['_'.join(fhr) for fhr in fhrs]) - - return grp, dep, lst - def atmupp(self): return self._upptask(upp_run='forecast', task_id='atmupp') @@ -1032,32 +1014,28 @@ def _upptask(self, upp_run="forecast", task_id="atmupp"): if upp_run not in VALID_UPP_RUN: raise KeyError(f"{upp_run} is invalid; UPP_RUN options are: {('|').join(VALID_UPP_RUN)}") - varname1, varname2, varname3 = 'grp', 'dep', 'lst' - varval1, varval2, varval3 = self._get_ufs_postproc_grps(self.cdump, self._configs['upp']) - var_dict = {varname1: varval1, varname2: varval2, varname3: varval3} - postenvars = self.envars.copy() - postenvar_dict = {'FHRLST': '#lst#', + postenvar_dict = {'FHR3': '#fhr#', 'UPP_RUN': upp_run} for key, value in postenvar_dict.items(): postenvars.append(rocoto.create_envar(name=key, value=str(value))) atm_hist_path = self._template_to_rocoto_cycstring(self._base["COM_ATMOS_HISTORY_TMPL"]) deps = [] - data = f'{atm_hist_path}/{self.cdump}.t@Hz.atm#dep#.nc' + data = f'{atm_hist_path}/{self.cdump}.t@Hz.atmf#fhr#.nc' dep_dict = {'type': 'data', 'data': data, 'age': 120} deps.append(rocoto.add_dependency(dep_dict)) - data = f'{atm_hist_path}/{self.cdump}.t@Hz.sfc#dep#.nc' + data = f'{atm_hist_path}/{self.cdump}.t@Hz.sfcf#fhr#.nc' dep_dict = {'type': 'data', 'data': data, 'age': 120} deps.append(rocoto.add_dependency(dep_dict)) - data = f'{atm_hist_path}/{self.cdump}.t@Hz.atm.log#dep#.txt' + data = f'{atm_hist_path}/{self.cdump}.t@Hz.atm.logf#fhr#.txt' dep_dict = {'type': 'data', 'data': data, 'age': 60} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps, dep_condition='and') cycledef = 'gdas_half,gdas' if self.cdump in ['gdas'] else self.cdump resources = self.get_resource('upp') - task_name = f'{self.cdump}{task_id}#{varname1}#' + task_name = f'{self.cdump}{task_id}_f#fhr#' task_dict = {'task_name': task_name, 'resources': resources, 'dependency': dependencies, @@ -1069,9 +1047,12 @@ def _upptask(self, upp_run="forecast", task_id="atmupp"): 'maxtries': '&MAXTRIES;' } + fhrs = self._get_forecast_hours(self.cdump, self._configs['upp']) + fhr_var_dict = {'fhr': ' '.join([f"{fhr:03d}" for fhr in fhrs])} + metatask_dict = {'task_name': f'{self.cdump}{task_id}', 'task_dict': task_dict, - 'var_dict': var_dict + 'var_dict': fhr_var_dict } task = rocoto.create_task(metatask_dict) @@ -1091,25 +1072,21 @@ def _atmosoceaniceprod(self, component: str): products_dict = {'atmos': {'config': 'atmos_products', 'history_path_tmpl': 'COM_ATMOS_MASTER_TMPL', - 'history_file_tmpl': f'{self.cdump}.t@Hz.master.grb2#dep#'}, + 'history_file_tmpl': f'{self.cdump}.t@Hz.master.grb2f#fhr#'}, 'ocean': {'config': 'oceanice_products', 'history_path_tmpl': 'COM_OCEAN_HISTORY_TMPL', - 'history_file_tmpl': f'{self.cdump}.ocean.t@Hz.6hr_avg.#dep#.nc'}, + 'history_file_tmpl': f'{self.cdump}.ocean.t@Hz.6hr_avg.f#fhr#.nc'}, 'ice': {'config': 'oceanice_products', 'history_path_tmpl': 'COM_ICE_HISTORY_TMPL', - 'history_file_tmpl': f'{self.cdump}.ice.t@Hz.6hr_avg.#dep#.nc'}} + 'history_file_tmpl': f'{self.cdump}.ice.t@Hz.6hr_avg.f#fhr#.nc'}} component_dict = products_dict[component] config = component_dict['config'] history_path_tmpl = component_dict['history_path_tmpl'] history_file_tmpl = component_dict['history_file_tmpl'] - varname1, varname2, varname3 = 'grp', 'dep', 'lst' - varval1, varval2, varval3 = self._get_ufs_postproc_grps(self.cdump, self._configs[config], component=component) - var_dict = {varname1: varval1, varname2: varval2, varname3: varval3} - postenvars = self.envars.copy() - postenvar_dict = {'FHRLST': '#lst#', 'COMPONENT': component} + postenvar_dict = {'FHR3': '#fhr#', 'COMPONENT': component} for key, value in postenvar_dict.items(): postenvars.append(rocoto.create_envar(name=key, value=str(value))) @@ -1129,7 +1106,7 @@ def _atmosoceaniceprod(self, component: str): cycledef = 'gdas_half,gdas' if self.cdump in ['gdas'] else self.cdump resources = self.get_resource(component_dict['config']) - task_name = f'{self.cdump}{component}_prod#{varname1}#' + task_name = f'{self.cdump}{component}_prod_f#fhr#' task_dict = {'task_name': task_name, 'resources': resources, 'dependency': dependencies, @@ -1141,9 +1118,11 @@ def _atmosoceaniceprod(self, component: str): 'maxtries': '&MAXTRIES;' } + fhrs = self._get_forecast_hours(self.cdump, self._configs[config], component) + fhr_var_dict = {'fhr': ' '.join([f"{fhr:03d}" for fhr in fhrs])} metatask_dict = {'task_name': f'{self.cdump}{component}_prod', 'task_dict': task_dict, - 'var_dict': var_dict + 'var_dict': fhr_var_dict } task = rocoto.create_task(metatask_dict) From f43a86276aaef91efa28faadc71a3cf50e749efe Mon Sep 17 00:00:00 2001 From: David Huber <69919478+DavidHuber-NOAA@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:44:29 -0400 Subject: [PATCH 44/45] Fix and simplify online archiving and reenable METplus jobs (#2687) This fixes the online archiving portion of the `*arch` and `*earc00` jobs, a prerequisite for running METplus. This also reenables METplus by default. The approach previously taken created `FileHandler` dictionaries at varying levels within the resulting yaml, which was not properly parsed by `exglobal_archive.py`. This approach creates a single `FileHandler` dictionary and is much less complicated overall. Resolves #2673 #2647 --- .gitignore | 2 + parm/archive/arcdir.yaml.j2 | 250 ++++++++++++++++------------- parm/archive/gdas.yaml.j2 | 123 +++++++------- parm/config/gfs/yaml/defaults.yaml | 2 +- ush/python/pygfs/task/archive.py | 24 +-- 5 files changed, 215 insertions(+), 186 deletions(-) diff --git a/.gitignore b/.gitignore index 0c15a50661..861346a494 100644 --- a/.gitignore +++ b/.gitignore @@ -184,6 +184,8 @@ ush/fv3gfs_make_grid.sh ush/fv3gfs_make_orog.sh ush/gen_bufr2ioda_json.py ush/gen_bufr2ioda_yaml.py +ush/bufr2ioda_insitu_profile*.py +ush/bufr2ioda_insitu_surface*.py ush/global_chgres.sh ush/global_chgres_driver.sh ush/global_cycle.sh diff --git a/parm/archive/arcdir.yaml.j2 b/parm/archive/arcdir.yaml.j2 index d6b1899ebc..f845e3c9cb 100644 --- a/parm/archive/arcdir.yaml.j2 +++ b/parm/archive/arcdir.yaml.j2 @@ -4,121 +4,153 @@ {% set head = RUN + ".t" + cycle_HH + "z." %} # Select data to store in the ARCDIR and VFYARC from deterministic runs -Base: &base # GDAS, GFS, ENKFGDAS, or ENKFGFS - common: - mkdir: - - "{{ ARCDIR }}" - -# Common files to be added to both the gfs and gdas keys below -Deterministic: &deterministic - cyclone: - copy: - # Cyclone forecasts, produced for both gdas and gfs cycles - ## Only created if tracking is on and there were systems to track - {% if path_exists(COMIN_ATMOS_TRACK ~ "/atcfunix." ~ RUN ~ "." ~ cycle_YMDH) %} - - ["{{ COMIN_ATMOS_TRACK }}/atcfunix.{{ RUN }}.{{ cycle_YMDH }}", "{{ ARCDIR }}/atcfunix.{{ RUN }}.{{ cycle_YMDH }}"] - - ["{{ COMIN_ATMOS_TRACK }}/atcfunixp.{{ RUN }}.{{ cycle_YMDH }}", "{{ ARCDIR }}/atcfunixp.{{ RUN }}.{{ cycle_YMDH }}"] - {% endif %} - - # Cyclone tracking data - {% for basin in ["epac", "natl"] %} - {% if path_exists(COMIN_ATMOS_TRACK + "/" + basin) %} - - ["{{ COMIN_ATMOS_TRACK }}/{{ basin }}", "{{ ARCDIR }}/{{ basin }}"] - {% endif %} - {% endfor %} +# This file set will contain all source-destination pairs to send to the FileHandler for copying +{% set file_set = [] %} + +# Declare the VFYARC where Fit2Obs data will be sent +{% set VFYARC = ROTDIR ~ "/vrfyarch" %} + +# Deterministic files +{% if "enkf" not in RUN %} + # Common files to be added to both the gfs and gdas keys below + {% set det_files = [] %} + # Cyclone forecasts, produced for both gdas and gfs cycles + ## Only created if tracking is on and there were systems to track + {% if path_exists(COMIN_ATMOS_TRACK ~ "/atcfunix." ~ RUN ~ "." ~ cycle_YMDH) %} + {% do det_files.append([COMIN_ATMOS_TRACK ~ "/atcfunix." ~ RUN ~ "." ~ cycle_YMDH, + ARCDIR ~"/atcfunix." ~ RUN ~ "." ~ cycle_YMDH ]) %} + {% do det_files.append([COMIN_ATMOS_TRACK ~ "/atcfunixp." ~ RUN ~ "." ~ cycle_YMDH, + ARCDIR ~ "/atcfunixp." ~ RUN ~ "." ~ cycle_YMDH]) %} + {% endif %} - {% if MODE == "cycled" %} - analysis: - copy: - # Analysis data (if we are running in cycled mode) - - ["{{ COMIN_ATMOS_GRIB_1p00 }}/{{ head }}pgrb2.1p00.anl", "{{ ARCDIR }}/pgbanl.{{ RUN }}.{{ cycle_YMDH }}.grib2"] - - {% if DO_JEDIATMVAR %} - - ["{{ COMIN_ATMOS_ANALYSIS }}/{{ head }}atmstat", "{{ ARCDIR }}/atmstat.{{ RUN }}.{{ cycle_YMDH }}"] - {% else %} - - ["{{ COMIN_ATMOS_ANALYSIS }}/{{ head }}gsistat", "{{ ARCDIR }}/gsistat.{{ RUN }}.{{ cycle_YMDH }}"] - {% endif %} - - {% if DO_JEDISNOWDA %} - - ["{{ COMIN_SNOW_ANALYSIS }}/{{ head }}snowstat.tgz", "{{ ARCDIR }}/snowstat.{{ RUN }}.{{ cycle_YMDH }}.tgz"] - {% endif %} - - {% if AERO_ANL_CDUMP == RUN or AERO_ANL_CDUMP == "both" %} - - ["{{ COMIN_CHEM_ANALYSIS }}/{{ head }}aerostat", "{{ ARCDIR }}/aerostat.{{ RUN }}.{{ cycle_YMDH }}"] - {% endif %} - - {% if DO_PREP_OBS_AERO %} - - ["{{ COMIN_OBS }}/{{ head }}aeroobs", "{{ ARCDIR }}/aeroobs.{{ RUN }}.{{ cycle_YMDH }}"] - - ["{{ COMIN_OBS }}/{{ head }}aerorawobs", "{{ ARCDIR }}/aerorawobs.{{ RUN }}.{{ cycle_YMDH }}"] - {% endif %} + # Cyclone tracking data + {% for basin in ["epac", "natl"] %} + {% if path_exists(COMIN_ATMOS_TRACK + "/" + basin) %} + {% do det_files.append([COMIN_ATMOS_TRACK ~ "/" ~ basin, + ARCDIR ~ "/" ~ basin ]) %} + {% endif %} + {% endfor %} + + # Deterministic analysis files (generated for cycled experiments) + {% set det_anl_files = [] %} + # Analysis data (if we are running in cycled mode) + {% do det_anl_files.append([COMIN_ATMOS_GRIB_1p00 ~ "/" ~ head ~ "pgrb2.1p00.anl", + ARCDIR ~ "/pgbanl." ~ RUN ~ "." ~ cycle_YMDH ~ ".grib2"]) %} + + {% if DO_JEDIATMVAR == True %} + {% do det_anl_files.append([COMIN_ATMOS_ANALYSIS ~ "/" ~ head ~ "atmstat", + ARCDIR ~ "/atmstat." ~ RUN ~ "." ~ cycle_YMDH ]) %} + {% else %} + {% do det_anl_files.append([COMIN_ATMOS_ANALYSIS ~ "/" ~ head ~ "gsistat", + ARCDIR ~ "/gsistat." ~ RUN ~ "." ~ cycle_YMDH ]) %} + {% endif %} + {% if DO_JEDISNOWDA == True %} + {% do det_anl_files.append([COMIN_SNOW_ANALYSIS ~ "/" ~ head ~ "snowstat.tgz", + ARCDIR ~ "/snowstat." ~ RUN ~ "." ~ cycle_YMDH ~ ".tgz"]) %} {% endif %} -{% if RUN == "gfs" %} -gfs: # GFS specific - <<: *base - <<: *deterministic - - gfs: - copy: - {% for fhr in range(0, FHMAX_GFS + 1, FHOUT_GFS) %} - - ["{{ COMIN_ATMOS_GRIB_1p00 }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}", "{{ ARCDIR }}/pgbf{{ '%02d' % fhr }}.{{ RUN }}.{{ cycle_YMDH }}.grib2"] - {% endfor %} - - # Cyclone genesis data (only present if there are storms) - {% if path_exists(COMIN_ATMOS_GENESIS ~ "/storms.gfso.atcf_gen." ~ cycle_YMDH) %} - - ["{{ COMIN_ATMOS_GENESIS }}/storms.gfso.atcf_gen.{{ cycle_YMDH }}", "{{ ARCDIR }}/storms.gfso.atcf_gen.{{ cycle_YMDH }}"] - - ["{{ COMIN_ATMOS_GENESIS }}/storms.gfso.atcf_gen.altg.{{ cycle_YMDH }}", "{{ ARCDIR }}/storms.gfso.atcf_gen.altg.{{ cycle_YMDH }}"] - {% endif %} - - {% if path_exists(COMIN_ATMOS_GENESIS ~ "/trak.gfso.atcfunix." ~ cycle_YMDH) %} - - ["{{ COMIN_ATMOS_GENESIS }}/trak.gfso.atcfunix.{{ cycle_YMDH }}", "{{ ARCDIR }}/trak.gfso.atcfunix.{{ cycle_YMDH }}"] - - ["{{ COMIN_ATMOS_GENESIS }}/trak.gfso.atcfunix.altg.{{ cycle_YMDH }}", "{{ ARCDIR }}/trak.gfso.atcfunix.altg.{{ cycle_YMDH }}"] - {% endif %} - - {% if DO_FIT2OBS %} - fit2obs: - - mkdir: - {% set VFYARC = ROTDIR + "/vrfyarch" %} - - "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}" - - copy: - {% for fhr in range(0, FHMAX_FITS + 1, 6) %} - {% set sfcfile = "/" + head + "sfcf" + '%03d'|format(fhr) + ".nc" %} - {% set sigfile = "/" + head + "atmf" + '%03d'|format(fhr) + ".nc" %} - - ["{{COMIN_ATMOS_HISTORY}}/{{ sfcfile }}", "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}/{{ sfcfile }}"] - - ["{{COMIN_ATMOS_HISTORY}}/{{ sigfile }}", "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}/{{ sigfile }}"] - {% endfor %} + {% if AERO_ANL_CDUMP == RUN or AERO_ANL_CDUMP == "both" %} + {% do det_anl_files.append([COMIN_CHEM_ANALYSIS ~ "/" ~ head ~ "aerostat", + ARCDIR ~ "/aerostat." ~ RUN ~ "." ~ cycle_YMDH ]) %} + {% endif %} + {% if DO_PREP_OBS_AERO == True %} + {% do det_anl_files.append([COMIN_OBS ~ "/" ~ head ~ "aeroobs", + ARCDIR ~ "/aeroobs." ~ RUN ~ "." ~ cycle_YMDH]) %} + {% do det_anl_files.append([COMIN_OBS ~ "/" ~ head ~ "aeroawobs", + ARCDIR ~ "/aeroawobs." ~ RUN ~ "." ~ cycle_YMDH]) %} {% endif %} -{% endif %} -{% if RUN == "gdas" %} -gdas: # GDAS specific - <<: *base - <<: *deterministic - gdas: - copy: - {% for fhr in range(0, FHMAX + 1, FHOUT) %} - - ["{{ COMIN_ATMOS_GRIB_1p00 }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}", "{{ ARCDIR }}/pgbf{{ '%02d' % fhr }}.{{ RUN }}.{{ cycle_YMDH }}.grib2"] - {% endfor %} -{% endif %} + # GFS-specific files + {% set gfs_files = [] %} + {% for fhr in range(0, FHMAX_GFS + 1, FHOUT_GFS) %} + {% do gfs_files.append([COMIN_ATMOS_GRIB_1p00 ~ "/" ~ head ~ "pgrb2.1p00.f" ~ '%03d'|format(fhr), + ARCDIR ~ "/pgbf" ~ '%02d'|format(fhr) ~ "." ~ RUN ~ "." ~ cycle_YMDH ~ ".grib2"]) %} + {% endfor %} + + # Cyclone genesis data (only present if there are storms) + {% if path_exists(COMIN_ATMOS_GENESIS ~ "/storms.gfso.atcf_gen." ~ cycle_YMDH) %} + {% do gfs_files.append([COMIN_ATMOS_GENESIS ~ "/storms.gfso.atcf_gen." ~ cycle_YMDH, + ARCDIR ~ "/storms.gfso.atcf_gen." ~ cycle_YMDH ]) %} + {% do gfs_files.append([COMIN_ATMOS_GENESIS ~ "/storms.gfso.atcf_gen.altg." ~ cycle_YMDH, + ARCDIR ~ "/storms.gfso.atcf_gen.altg." ~ cycle_YMDH ]) %} + {% endif %} + + {% if path_exists(COMIN_ATMOS_GENESIS ~ "/trak.gfso.atcfunix." ~ cycle_YMDH) %} + {% do gfs_files.append([COMIN_ATMOS_GENESIS ~ "/trak.gfso.atcfunix." ~ cycle_YMDH, + ARCDIR ~ "/trak.gfso.atcfunix." ~ cycle_YMDH ]) %} + {% do gfs_files.append([COMIN_ATMOS_GENESIS ~ "/trak.gfso.atcfunix.altg." ~ cycle_YMDH, + ARCDIR ~ "/trak.gfso.atcfunix.altg." ~ cycle_YMDH ]) %} + {% endif %} + + # GFS Fit2Obs data + {% set fit2obs_files = [] %} + {% for fhr in range(0, FHMAX_FITS + 1, 6) %} + {% set sfcfile = "/" + head + "sfcf" + '%03d'|format(fhr) + ".nc" %} + {% set sigfile = "/" + head + "atmf" + '%03d'|format(fhr) + ".nc" %} + {% do fit2obs_files.append([COMIN_ATMOS_HISTORY ~ "/" ~ sfcfile, + VFYARC ~ "/" ~ RUN ~ "." ~ cycle_YMD ~ "/" ~ cycle_HH ~ "/" ~ sfcfile ]) %} + {% do fit2obs_files.append([COMIN_ATMOS_HISTORY ~ "/" ~ sigfile, + VFYARC ~ "/" ~ RUN ~ "." ~ cycle_YMD ~ "/" ~ cycle_HH ~ "/" ~ sigfile ]) %} + {% endfor %} + + # GDAS-specific files + {% set gdas_files = [] %} + {% for fhr in range(0, FHMAX + 1, FHOUT) %} + {% do gdas_files.append([COMIN_ATMOS_GRIB_1p00 ~ "/" ~ head ~ "pgrb2.1p00.f" ~ '%03d'|format(fhr), + ARCDIR ~ "/pgbf" ~ '%02d'|format(fhr) ~ "." ~ RUN ~ "." ~ cycle_YMDH ~ ".grib2"]) %} + {% endfor %} + + # Now append the necessary file pairs to file_set + # Common deterministic files + {% set file_set = file_set + det_files %} + {% if MODE == "cycled" %} + {% set file_set = file_set + det_anl_files %} + {% endif %} + + # Run-specific deterministic files + {% if RUN == "gfs" %} + {% set file_set = file_set + gfs_files %} + # Fit2Obs files + {% if DO_FIT2OBS == True %} + {% set file_set = file_set + fit2obs_files %} + {% endif %} + {% elif RUN == "gdas" %} + {% set file_set = file_set + gdas_files %} + {% endif %} + +{% else %} # End of deterministic files + + # Ensemble analysis files + {% set enkf_files = [] %} + {% if DO_JEDIATMENS == True %} + {% do enkf_files.append([COMIN_ATMOS_ANALYSIS_ENSSTAT ~ "/" ~ head ~ "atmensstat", + ARCDIR ~ "/atmensstat." ~ RUN ~ "." ~ cycle_YMDH ]) %} + {% do enkf_files.append([COMIN_ATMOS_ANALYSIS_ENSSTAT ~ "/" ~ head ~ "atminc.ensmean.nc", + ARCDIR ~ "/atmensstat." ~ RUN ~ "." ~ cycle_YMDH ~ ".ensmean.nc"]) %} + {% else %} + {% do enkf_files.append([COMIN_ATMOS_ANALYSIS_ENSSTAT ~ "/" ~ head ~ "enkfstat", + ARCDIR ~ "/enkfstat." ~ RUN ~ "." ~ cycle_YMDH ]) %} + {% do enkf_files.append([COMIN_ATMOS_ANALYSIS_ENSSTAT ~ "/" ~ head ~ "gsistat.ensmean", + ARCDIR ~ "/gsistat." ~ RUN ~ "." ~ cycle_YMDH ~ ".ensmean"]) %} + {% endif %} + + # Construct the final file set + {% set file_set = file_set + enkf_files %} -Ensemble: &ensemble # ENKFGDAS or ENKFGFS - analysis: - copy: - # Copy ensemble analyses - {% if DO_JEDIATMENS %} - - ["{{ COMIN_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}atmensstat", "{{ ARCDIR }}/atmensstat.{{ RUN }}.{{ cycle_YMDH }}"] - - ["{{ COMIN_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}atminc.ensmean.nc", "{{ ARCDIR }}/atmensstat.{{ RUN }}.{{ cycle_YMDH }}.ensmean.nc"] - {% else %} - - ["{{ COMIN_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}enkfstat", "{{ ARCDIR }}/enkfstat.{{ RUN }}.{{ cycle_YMDH }}"] - - ["{{ COMIN_ATMOS_ANALYSIS_ENSSTAT }}/{{ head }}gsistat.ensmean", "{{ ARCDIR }}/gsistat.{{ RUN }}.{{ cycle_YMDH }}.ensmean"] - {% endif %} - -{% if "enkf" in RUN %} -{{ RUN }}: - <<: *base - <<: *ensemble {% endif %} + + +# Actually write the yaml +mkdir: + - "{{ ARCDIR }}" + + {% if DO_FIT2OBS == True %} + - "{{ VFYARC }}/{{ RUN }}.{{ cycle_YMD }}/{{ cycle_HH }}" + {% endif %} + +copy: + {% for source_dest_pair in file_set %} + - {{ source_dest_pair }} + {% endfor %} diff --git a/parm/archive/gdas.yaml.j2 b/parm/archive/gdas.yaml.j2 index 12b89f2e61..b253d27268 100644 --- a/parm/archive/gdas.yaml.j2 +++ b/parm/archive/gdas.yaml.j2 @@ -7,32 +7,32 @@ gdas: # Cycled logs - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlprod.log" - "logs/{{ cycle_YMDH }}/{{ RUN }}prep.log" - {% if DO_JEDIATMVAR %} + {% if DO_JEDIATMVAR %} - "logs/{{ cycle_YMDH }}/{{ RUN }}prepatmiodaobs.log" - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlinit.log" - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlprod.log" - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlfinal.log" - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlfv3inc.log" - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlvar.log" - {% else %} + {% else %} - "logs/{{ cycle_YMDH }}/{{ RUN }}anal.log" - "logs/{{ cycle_YMDH }}/{{ RUN }}analdiag.log" - {% endif %} + {% endif %} - "logs/{{ cycle_YMDH }}/{{ RUN }}atmanlupp.log" - {% if DO_JEDIOCNVAR %} + {% if DO_JEDIOCNVAR %} - "logs/{{ cycle_YMDH }}/{{ RUN }}prepoceanobs.log" - "logs/{{ cycle_YMDH }}/{{ RUN }}ocnanalprep.log" - "logs/{{ cycle_YMDH }}/{{ RUN }}ocnanalbmat.log" - "logs/{{ cycle_YMDH }}/{{ RUN }}ocnanalrun.log" - "logs/{{ cycle_YMDH }}/{{ RUN }}ocnanalpost.log" - "logs/{{ cycle_YMDH }}/{{ RUN }}ocnanalchkpt.log" - {% if DOHYBVAR %} + {% if DOHYBVAR %} - "logs/{{ cycle_YMDH }}/{{ RUN }}ocnanalecen.log" - {% endif %} - {% endif %} - {% if DO_VRFY_OCEANDA %} + {% endif %} + {% endif %} + {% if DO_VRFY_OCEANDA %} - "logs/{{ cycle_YMDH }}/{{ RUN }}ocnanalvrfy.log" - {% endif %} + {% endif %} # Analysis GRIB2 (sub-sampled) data - "{{ COMIN_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.anl" @@ -44,117 +44,120 @@ gdas: - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmanl.nc" - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}sfcanl.nc" - {% if DOHYBVAR %} + {% if DOHYBVAR %} # Ensemble analysis residual - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmanl.ensres.nc" - {% if DOIAU %} + {% if DOIAU %} # Ensemble IAU analysis residuals - {% for fhr in iaufhrs if fhr != 6 %} + {% for fhr in iaufhrs if fhr != 6 %} - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atma{{ '%03d' % fhr }}.ensres.nc" - {% endfor %} - {% endif %} + {% endfor %} + {% endif %} # End of ensemble analysis mean residuals - {% endif %} + {% endif %} # Analysis state - {% if DO_JEDIATMVAR %} + {% if DO_JEDIATMVAR %} - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmvar.yaml" - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}atmstat" - {% else %} + {% else %} - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}gsistat" - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}cnvstat" - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}oznstat" - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}radstat" - {% endif %} - {% if AERO_ANL_CDUMP == "gdas" or AERO_ANL_CDUMP == "both" %} + {% endif %} + {% if AERO_ANL_CDUMP == "gdas" or AERO_ANL_CDUMP == "both" %} - "{{ COMIN_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" - {% endif %} - {% if DO_PREP_OBS_AERO %} + {% endif %} + {% if DO_PREP_OBS_AERO %} - "{{ COMIN_OBS | relpath(ROTDIR) }}/{{ head }}aeroobs" - "{{ COMIN_OBS | relpath(ROTDIR) }}/{{ head }}aerorawobs" - {% endif %} - {% if DO_JEDISNOWDA %} + {% endif %} + {% if DO_JEDISNOWDA %} - "{{ COMIN_SNOW_ANALYSIS | relpath(ROTDIR) }}/{{ head }}snowstat.tgz" - {% endif %} + {% endif %} # Ozone verification - {% if DO_VERFOZN %} + {% if DO_VERFOZN %} - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/time/bad_cnt.{{ cycle_YMDH }}" - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/time/bad_diag.{{ cycle_YMDH }}" - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/time/bad_pen.{{ cycle_YMDH }}" - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/time/stdout.time.tar.gz" - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/horiz/stdout.horiz.tar.gz" - "logs/{{ cycle_YMDH }}/{{ RUN }}verfozn.log" - {% endif %} + {% endif %} # Radiance verification - {% if DO_VERFRAD %} + {% if DO_VERFRAD %} - "{{ COMIN_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_angle.tar.gz" - "{{ COMIN_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_bcoef.tar.gz" - "{{ COMIN_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_bcor.tar.gz" - "{{ COMIN_ATMOS_RADMON | relpath(ROTDIR) }}/radmon_time.tar.gz" - "logs/{{ cycle_YMDH }}/{{ RUN }}verfrad.log" - {% endif %} + {% endif %} # Minimization monitor - {% if DO_VMINMON %} + {% if DO_VMINMON %} - "{{ COMIN_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.costs.txt" - "{{ COMIN_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.cost_terms.txt" - "{{ COMIN_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.gnorms.ieee_d" - "{{ COMIN_ATMOS_MINMON | relpath(ROTDIR) }}/{{ cycle_YMDH }}.reduction.ieee_d" - "{{ COMIN_ATMOS_MINMON | relpath(ROTDIR) }}/gnorm_data.txt" - "logs/{{ cycle_YMDH }}/{{ RUN }}vminmon.log" - {% endif %} + {% endif %} {% endif %} # End of cycled data # Forecast and post logs - "logs/{{ cycle_YMDH }}/{{ RUN }}fcst.log" - # TODO explicitly name the atmos_prod log files to archive - - "logs/{{ cycle_YMDH }}/{{ RUN }}atmos_prod_f*.log" - {% if not WRITE_DOPOST %} - # TODO set the forecast hours explicitly. This will require emulating numpy.array_split - - "logs/{{ cycle_YMDH }}/{{ RUN }}atmos_upp_f*.log" - {% endif %} ## not WRITE_DOPOST {% for fhr in range(0, FHMAX + 1, 3) %} + {% set fhr3 = '%03d' % fhr %} + - "logs/{{ cycle_YMDH }}/{{ RUN }}atmos_prod_f{{ fhr3 }}.log" + {% if not WRITE_DOPOST %} + - "logs/{{ cycle_YMDH }}/{{ RUN }}atmos_upp_f{{ fhr3 }}.log" + {% endif %} ## not WRITE_DOPOST # Forecast GRIB2 data - - "{{ COMIN_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}" - - "{{ COMIN_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ '%03d' % fhr }}.idx" - - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}" - - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ '%03d' % fhr }}.idx" + - "{{ COMIN_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ fhr3 }}" + - "{{ COMIN_ATMOS_GRIB_0p25 | relpath(ROTDIR) }}/{{ head }}pgrb2.0p25.f{{ fhr3 }}.idx" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ fhr3 }}" + - "{{ COMIN_ATMOS_GRIB_1p00 | relpath(ROTDIR) }}/{{ head }}pgrb2.1p00.f{{ fhr3 }}.idx" # Forecast GRIB2 fluxes - - "{{ COMIN_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2" - - "{{ COMIN_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ '%03d' % fhr }}.grib2.idx" + - "{{ COMIN_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ fhr3 }}.grib2" + - "{{ COMIN_ATMOS_MASTER | relpath(ROTDIR) }}/{{ head }}sfluxgrbf{{ fhr3 }}.grib2.idx" # FV3 log - - "{{ COMIN_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atm.logf{{ '%03d' % fhr }}.txt" + - "{{ COMIN_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atm.logf{{ fhr3 }}.txt" # Raw netCDF forecasts - - "{{ COMIN_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atmf{{ '%03d' % fhr }}.nc" - - "{{ COMIN_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}sfcf{{ '%03d' % fhr }}.nc" + - "{{ COMIN_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}atmf{{ fhr3 }}.nc" + - "{{ COMIN_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head }}sfcf{{ fhr3 }}.nc" {% endfor %} optional: {% if MODE == "cycled" %} - {% if DO_VERFRAD %} - # Radiance verification (only created if there are problems) + # Radiance verification (only created if there are problems) + {% if DO_VERFRAD %} - "{{ COMIN_ATMOS_RADMON | relpath(ROTDIR) }}/bad_diag.{{ cycle_YMDH }}" - "{{ COMIN_ATMOS_RADMON | relpath(ROTDIR) }}/bad_pen.{{ cycle_YMDH }}" - "{{ COMIN_ATMOS_RADMON | relpath(ROTDIR) }}/low_count.{{ cycle_YMDH }}" - "{{ COMIN_ATMOS_RADMON | relpath(ROTDIR) }}/warning.{{ cycle_YMDH }}" - {% endif %} + {% endif %} - {% if DO_VERFOZN %} - # Not all of these ozone instruments always produce data - {% set oznmon_types = [ - "gome_metop-b", "omi_aura", "ompslp_npp", "ompsnp_n20", - "ompsnp_npp", "ompstc8_n20", "ompstc8_npp", "sbuv2_n19" - ] %} - {% for group in [ "horiz", "time" ] %} - {% if group == "horiz" %} {% set suffix = ".gz" %} {% else %} {% set suffix = "" %} {% endif %} - {% for type in oznmon_types %} + {% if DO_VERFOZN %} + # Not all of these ozone instruments always produce data + {% set oznmon_types = [ + "gome_metop-b", "omi_aura", "ompslp_npp", "ompsnp_n20", + "ompsnp_npp", "ompstc8_n20", "ompstc8_npp", "sbuv2_n19" + ] %} + {% for group in [ "horiz", "time" ] %} + {% if group == "horiz" %} + {% set suffix = ".gz" %} + {% else %} + {% set suffix = "" %} + {% endif %} + {% for type in oznmon_types %} - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/{{ group }}/{{ type }}.anl.ctl" - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/{{ group }}/{{ type }}.anl.{{ cycle_YMDH }}.ieee_d{{ suffix }}" - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/{{ group }}/{{ type }}.ges.ctl" - "{{ COMIN_ATMOS_OZNMON | relpath(ROTDIR) }}/{{ group }}/{{ type }}.ges.{{ cycle_YMDH }}.ieee_d{{ suffix }}" - {% endfor %} - {% endfor %} - {% endif %} + {% endfor %} + {% endfor %} + {% endif %} {% endif %} diff --git a/parm/config/gfs/yaml/defaults.yaml b/parm/config/gfs/yaml/defaults.yaml index b074b11dbf..2d662a9bcb 100644 --- a/parm/config/gfs/yaml/defaults.yaml +++ b/parm/config/gfs/yaml/defaults.yaml @@ -13,7 +13,7 @@ base: DO_TRACKER: "YES" DO_GENESIS: "YES" DO_GENESIS_FSU: "NO" - DO_METP: "NO" + DO_METP: "YES" FHMAX_GFS: 120 FHMAX_HF_GFS: 0 DO_VRFY_OCEANDA: "NO" diff --git a/ush/python/pygfs/task/archive.py b/ush/python/pygfs/task/archive.py index 269aea0ccc..d0722552e1 100644 --- a/ush/python/pygfs/task/archive.py +++ b/ush/python/pygfs/task/archive.py @@ -7,9 +7,9 @@ from logging import getLogger from typing import Any, Dict, List -from wxflow import (AttrDict, FileHandler, Hsi, Htar, Task, cast_strdict_as_dtypedict, +from wxflow import (AttrDict, FileHandler, Hsi, Htar, Task, chgrp, get_gid, logit, mkdir_p, parse_j2yaml, rm_p, strftime, - to_YMD, to_YMDH, Template, TemplateConstants) + to_YMDH) logger = getLogger(__name__.split('.')[-1]) @@ -348,19 +348,11 @@ def _construct_arcdir_set(arcdir_j2yaml, arch_dict) -> Dict: files need to be copied to the ARCDIR and the Fit2Obs directory. """ - # Parse the input jinja yaml template - arcdir_yaml = parse_j2yaml(arcdir_j2yaml, - arch_dict, - allow_missing=True) - - # Collect the needed FileHandler dicts and construct arcdir_set - arcdir_set = {} - for key, handler in arcdir_yaml[arch_dict.RUN].items(): - # Different RUNs can have different filesets that need to be copied. - # Each fileset is stored as a dictionary. Collect the contents of - # each (which should be 'mkdir' and/or 'copy') to produce singular - # mkdir and copy lists. - arcdir_set.update(handler) + # Get the FileHandler dictionary for creating directories and copying + # to the ARCDIR and VFYARC directories. + arcdir_set = parse_j2yaml(arcdir_j2yaml, + arch_dict, + allow_missing=True) return arcdir_set @@ -421,7 +413,7 @@ def replace_string_from_to_file(filename_in, filename_out, search_str, replace_s with open(filename_in) as old_file: lines = old_file.readlines() - out_lines = [line.replace(search, replace) for line in lines] + out_lines = [line.replace(search_str, replace_str) for line in lines] with open("/tmp/track_file", "w") as new_file: new_file.writelines(out_lines) From 4e1b937b67ed220120e81925c4507f03b9b8965f Mon Sep 17 00:00:00 2001 From: David Huber <69919478+DavidHuber-NOAA@users.noreply.github.com> Date: Mon, 24 Jun 2024 10:50:52 -0400 Subject: [PATCH 45/45] Add minimum software requirements (#2712) Adds a table to HPC documentation stating the minimum support versions --- docs/source/hpc.rst | 95 +++++++++++---------------- modulefiles/module_gwsetup.gaea.lua | 2 - modulefiles/module_gwsetup.hera.lua | 2 - modulefiles/module_gwsetup.orion.lua | 1 - modulefiles/module_gwsetup.wcoss2.lua | 2 - 5 files changed, 40 insertions(+), 62 deletions(-) diff --git a/docs/source/hpc.rst b/docs/source/hpc.rst index 102455b822..643cffdef0 100644 --- a/docs/source/hpc.rst +++ b/docs/source/hpc.rst @@ -4,6 +4,46 @@ HPC Settings and Help Running the GFS configurations (or almost any global workflow configuration except the coarsest) is a resource intensive exercise. This page discusses recommended HPC environmental settings and contact information in case you need assistance from a particular HPC helpdesk. While most of the documentation is based on supported NOAA platforms, the learnings here can hopefully apply to other platforms. +==================================== +Minimum system software requirements +==================================== + +The following system software requirements are the minimum for any new or existing system and reflect the development and testing environment on which the global workflow is maintained. Any system that does not meet these requirements will not be supported. + ++--------------+-------------+---------------------------------------+ +| Software | Minimum | Notes | +| | supported | | +| | version(s) | | ++==============+=============+=======================================+ +| Bash | 4.4.20 | | ++--------------+-------------+---------------------------------------+ +| Python | * 3.8.6 | * 3.10.x is not supported by METplus | +| | * 3.10.13+ | verification software | +| | * 3.11.6+ | * 3.11.6 is packaged with spack-stack | +| | | * 3.9.x is untested | ++--------------+-------------+---------------------------------------+ +| Spack-Stack | 1.6.0 | * Available everywhere but WCOSS2 | ++--------------+-------------+---------------------------------------+ +| lmod | 8.3.1 | | ++--------------+-------------+---------------------------------------+ +| Slurm | 23.02.7 | * Other schedulers may be supportable | ++--------------+-------------+---------------------------------------+ +| PBSpro | 2022.1.1 | * Other schedulers may be supportable | ++--------------+-------------+---------------------------------------+ +| Git | 2.29.0 | * Some components e.g. GDASApp may | +| | | need Git-LFS for downloading test | +| | | data | ++--------------+-------------+---------------------------------------+ +| Rocoto | 1.3.5 | * 1.3.7 is required for newer | +| | | versions of Ruby (3.2+) | ++--------------+-------------+---------------------------------------+ +| Intel | 2021.5.1 | * GNU compilers are not supported | +| Compilers | | * Intel LLVM compilers are not yet | +| | | supported | +| | | * Intel 19.x is only supported on | +| | | WCOSS2 | ++--------------+-------------+---------------------------------------+ + ================================ Experiment troubleshooting help ================================ @@ -50,61 +90,6 @@ Optimizing the global workflow on S4 The S4 cluster is relatively small and so optimizations are recommended to improve cycled runtimes. Please contact Innocent Souopgui (innocent.souopgui@noaa.gov) if you are planning on running a cycled experiment on this system to obtain optimized configuration files. -============ -Git settings -============ - -^^^^^^ -Merges -^^^^^^ - -Use the following command to have merge commits include the one-line description of all the commits being merged (up to 200). You only need to do this once on each machine; it will be saved to your git settings:: - - git config --global merge.log 200 - -Use the ``--no-ff`` option to make sure there is always a merge commit when a fast-forward only is available. Exception: If the merge contains only a single commit, it can be applied as a fast-forward. - -For any merge with multiple commits, a short synopsis of the merge should appear between the title and the list of commit titles added by merge.log. - -^^^^^^^ -Version -^^^^^^^ - -It is advised to use Git v2+ when available. At the time of writing this documentation the default Git clients on the different machines were as noted in the table below. It is recommended that you check the default modules before loading recommended ones: - -+----------+----------+---------------------------------------+ -| Machine | Default | Recommended | -+----------+----------+---------------------------------------+ -| Hera | v2.18.0 | default | -+----------+----------+---------------------------------------+ -| Hercules | v2.31.1 | default | -+----------+----------+---------------------------------------+ -| Orion | v1.8.3.1 | **module load git/2.28.0** | -+----------+----------+---------------------------------------+ -| Jet | v2.18.0 | default | -+----------+----------+---------------------------------------+ -| WCOSS2 | v2.35.3 | default | -+----------+----------+---------------------------------------+ -| S4 | v1.8.3.1 | **module load git/2.30.0** | -+----------+----------+---------------------------------------+ -| AWS PW | v1.8.3.1 | default | -+----------+----------+---------------------------------------+ - -^^^^^^^^^^^^^ -Output format -^^^^^^^^^^^^^ - -For proper display of Git command output (e.g. git branch and git diff) type the following once per machine: - -:: - - git config --global core.pager 'less -FRX' - -For the manage_externals utility functioning:: - - Error: fatal: ssh variant 'simple' does not support setting port - Fix: git config --global ssh.variant ssh - ======================================== Stacksize on R&Ds (Hera, Orion, Hercules, Jet, S4) ======================================== diff --git a/modulefiles/module_gwsetup.gaea.lua b/modulefiles/module_gwsetup.gaea.lua index 5a8b2379a9..8b9f70e4a0 100644 --- a/modulefiles/module_gwsetup.gaea.lua +++ b/modulefiles/module_gwsetup.gaea.lua @@ -15,7 +15,5 @@ load(pathJoin("python", python_ver)) load("py-jinja2") load("py-pyyaml") load("py-numpy") -local git_ver=os.getenv("git_ver") or "2.35.2" -load(pathJoin("git", git_ver)) whatis("Description: GFS run setup environment") diff --git a/modulefiles/module_gwsetup.hera.lua b/modulefiles/module_gwsetup.hera.lua index 696f9577be..06cf566850 100644 --- a/modulefiles/module_gwsetup.hera.lua +++ b/modulefiles/module_gwsetup.hera.lua @@ -14,7 +14,5 @@ load(pathJoin("python", python_ver)) load("py-jinja2") load("py-pyyaml") load("py-numpy") -local git_ver=os.getenv("git_ver") or "2.18.0" -load(pathJoin("git", git_ver)) whatis("Description: GFS run setup environment") diff --git a/modulefiles/module_gwsetup.orion.lua b/modulefiles/module_gwsetup.orion.lua index 96ed50f7f0..37cb511659 100644 --- a/modulefiles/module_gwsetup.orion.lua +++ b/modulefiles/module_gwsetup.orion.lua @@ -5,7 +5,6 @@ Load environment to run GFS workflow ci scripts on Orion prepend_path("MODULEPATH", "/apps/modulefiles/core") load(pathJoin("contrib","0.1")) load(pathJoin("rocoto","1.3.3")) -load(pathJoin("git","2.28.0")) prepend_path("MODULEPATH", "/work/noaa/epic/role-epic/spack-stack/orion/spack-stack-1.6.0/envs/gsi-addon-env/install/modulefiles/Core") diff --git a/modulefiles/module_gwsetup.wcoss2.lua b/modulefiles/module_gwsetup.wcoss2.lua index d4e64548b0..a2440569db 100644 --- a/modulefiles/module_gwsetup.wcoss2.lua +++ b/modulefiles/module_gwsetup.wcoss2.lua @@ -2,8 +2,6 @@ help([[ Load environment to run GFS workflow ci scripts on WCOSS2 ]]) -load(pathJoin("git","2.29.0")) - prepend_path("MODULEPATH", "/apps/ops/test/nco/modulefiles/core") load(pathJoin("rocoto","1.3.5"))