diff --git a/docs/source/configure.rst b/docs/source/configure.rst index 6b2d115c15..12c2f75a48 100644 --- a/docs/source/configure.rst +++ b/docs/source/configure.rst @@ -4,47 +4,58 @@ Configure Run The global-workflow configs contain switches that change how the system runs. Many defaults are set initially. Users wishing to run with different settings should adjust their $EXPDIR configs and then rerun the ``setup_xml.py`` script since some configuration settings/switches change the workflow/xml ("Adjusts XML" column value is "YES"). -+----------------+------------------------------+---------------+-------------+---------------------------------------------------+ -| Switch | What | Default | Adjusts XML | More Details | -+================+==============================+===============+=============+===================================================+ -| APP | Model application | ATM | YES | See case block in config.base for options | -+----------------+------------------------------+---------------+-------------+---------------------------------------------------+ -| DOIAU | Enable 4DIAU for control | YES | NO | Turned off for cold-start first half cycle | -| | with 3 increments | | | | -+----------------+------------------------------+---------------+-------------+---------------------------------------------------+ -| DOHYBVAR | Run EnKF | YES | YES | Don't recommend turning off | -+----------------+------------------------------+---------------+-------------+---------------------------------------------------+ -| DONST | Run NSST | YES | NO | If YES, turns on NSST in anal/fcst steps, and | -| | | | | turn off rtgsst | -+----------------+------------------------------+---------------+-------------+---------------------------------------------------+ -| DO_AWIPS | Run jobs to produce AWIPS | NO | YES | downstream processing, ops only | -| | products | | | | -+----------------+------------------------------+---------------+-------------+---------------------------------------------------+ -| DO_BUFRSND | Run job to produce BUFR | NO | YES | downstream processing | -| | sounding products | | | | -+----------------+------------------------------+---------------+-------------+---------------------------------------------------+ -| DO_GEMPAK | Run job to produce GEMPAK | NO | YES | downstream processing, ops only | -| | products | | | | -+----------------+------------------------------+---------------+-------------+---------------------------------------------------+ -| DO_VRFY | Run vrfy job | NO | YES | Whether to include vrfy job (GSI monitoring, | -| | | | | tracker, VSDB, fit2obs) | -+----------------+------------------------------+---------------+-------------+---------------------------------------------------+ -| DO_METP | Run METplus jobs | YES | YES | One cycle spinup | -+----------------+------------------------------+---------------+-------------+---------------------------------------------------+ -| EXP_WARM_START | Is experiment starting warm | .false. | NO | Impacts IAU settings for initial cycle. Can also | -| | (.true.) or cold (.false)? | | | be set when running ``setup_expt.py`` script with | -| | | | | the ``--start`` flag (e.g. ``--start warm``) | -+----------------+------------------------------+---------------+-------------+---------------------------------------------------+ -| HPSSARCH | Archive to HPPS | NO | Possibly | Whether to save output to tarballs on HPPS | -+----------------+------------------------------+---------------+-------------+---------------------------------------------------+ -| LOCALARCH | Archive to a local directory | NO | Possibly | Instead of archiving data to HPSS, archive to a | -| | | | | local directory, specified by ATARDIR. If | -| | | | | LOCALARCH=YES, then HPSSARCH must =NO. Changing | -| | | | | HPSSARCH from YES to NO will adjust the XML. | -+----------------+------------------------------+---------------+-------------+---------------------------------------------------+ -| QUILTING | Use I/O quilting | .true. | NO | If .true. choose OUTPUT_GRID as cubed_sphere_grid | -| | | | | in netcdf or gaussian_grid | -+----------------+------------------------------+---------------+-------------+---------------------------------------------------+ -| WRITE_DOPOST | Run inline post | .true. | NO | If .true. produces master post output in forecast | -| | | | | job | -+----------------+------------------------------+---------------+-------------+---------------------------------------------------+ ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| Switch | What | Default | Adjusts XML | More Details | ++================+==================================+===============+=============+===================================================+ +| APP | Model application | ATM | YES | See case block in config.base for options | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| DOIAU | Enable 4DIAU for control | YES | NO | Turned off for cold-start first half cycle | +| | with 3 increments | | | | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| DOHYBVAR | Run EnKF | YES | YES | Don't recommend turning off | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| DONST | Run NSST | YES | NO | If YES, turns on NSST in anal/fcst steps, and | +| | | | | turn off rtgsst | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| DO_AWIPS | Run jobs to produce AWIPS | NO | YES | downstream processing, ops only | +| | products | | | | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| DO_BUFRSND | Run job to produce BUFR | NO | YES | downstream processing | +| | sounding products | | | | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| DO_GEMPAK | Run job to produce GEMPAK | NO | YES | downstream processing, ops only | +| | products | | | | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| DO_FIT2OBS | Run FIT2OBS job | YES | YES | Whether to run the FIT2OBS job | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| DO_TRACKER | Run tracker job | YES | YES | Whether to run the tracker job | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| DO_GENESIS | Run genesis job | YES | YES | Whether to run the genesis job | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| DO_GENESIS_FSU | Run FSU genesis job | YES | YES | Whether to run the FSU genesis job | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| DO_VERFOZN | Run GSI monitor ozone job | YES | YES | Whether to run the GSI monitor ozone job | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| DO_VERFRAD | Run GSI monitor radiance job | YES | YES | Whether to run the GSI monitor radiance job | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| DO_VMINMON | Run GSI monitor minimization job | YES | YES | Whether to run the GSI monitor minimization job | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| DO_METP | Run METplus jobs | YES | YES | One cycle spinup | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| EXP_WARM_START | Is experiment starting warm | .false. | NO | Impacts IAU settings for initial cycle. Can also | +| | (.true.) or cold (.false)? | | | be set when running ``setup_expt.py`` script with | +| | | | | the ``--start`` flag (e.g. ``--start warm``) | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| HPSSARCH | Archive to HPPS | NO | Possibly | Whether to save output to tarballs on HPPS | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| LOCALARCH | Archive to a local directory | NO | Possibly | Instead of archiving data to HPSS, archive to a | +| | | | | local directory, specified by ATARDIR. If | +| | | | | LOCALARCH=YES, then HPSSARCH must =NO. Changing | +| | | | | HPSSARCH from YES to NO will adjust the XML. | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| QUILTING | Use I/O quilting | .true. | NO | If .true. choose OUTPUT_GRID as cubed_sphere_grid | +| | | | | in netcdf or gaussian_grid | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ +| WRITE_DOPOST | Run inline post | .true. | NO | If .true. produces master post output in forecast | +| | | | | job | ++----------------+----------------------------------+---------------+-------------+---------------------------------------------------+ diff --git a/docs/source/jobs.rst b/docs/source/jobs.rst index 67863bb9a2..0e3700bf20 100644 --- a/docs/source/jobs.rst +++ b/docs/source/jobs.rst @@ -18,10 +18,10 @@ An experimental run is different from operations in the following ways: * Addition steps in experimental mode: - - verification (vrfy) - - archive (arch) + - cleanup (cleanup) + Downstream jobs (e.g. awips, gempak, etc.) are not included in the diagram. Those jobs are not normally run in developmental tests. ============================= @@ -71,8 +71,6 @@ Jobs in the GFS Configuration +-------------------+-----------------------------------------------------------------------------------------------------------------------+ | postN | Runs the post processor. | +-------------------+-----------------------------------------------------------------------------------------------------------------------+ -| vrfy | Runs the verification tasks. | -+-------------------+-----------------------------------------------------------------------------------------------------------------------+ | waveinit | Runs wave initialization step. | +-------------------+-----------------------------------------------------------------------------------------------------------------------+ | waveprep | Runs wave prep step. | diff --git a/env/AWSPW.env b/env/AWSPW.env index 79ad52d460..894cce2343 100755 --- a/env/AWSPW.env +++ b/env/AWSPW.env @@ -5,7 +5,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 "atmanlrun atmensanlrun aeroanlrun landanlrun" - echo "anal sfcanl fcst post vrfy metp" + echo "anal sfcanl fcst post metp" echo "eobs eupd ecen efcs epos" echo "postsnd awips gempak" exit 1 diff --git a/env/CONTAINER.env b/env/CONTAINER.env index 1b8dfab6e3..bfeb6dd6da 100755 --- a/env/CONTAINER.env +++ b/env/CONTAINER.env @@ -5,7 +5,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 "atmanlrun atmensanlrun aeroanlrun landanl" - echo "anal sfcanl fcst post vrfy metp" + echo "anal sfcanl fcst post metp" echo "eobs eupd ecen efcs epos" echo "postsnd awips gempak" exit 1 diff --git a/env/HERA.env b/env/HERA.env index 67dca0ca6c..ddb2ae13ca 100755 --- a/env/HERA.env +++ b/env/HERA.env @@ -5,7 +5,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 "atmanlrun atmensanlrun aeroanlrun landanl" - echo "anal sfcanl fcst post vrfy metp" + echo "anal sfcanl fcst post metp" echo "eobs eupd ecen efcs epos" echo "postsnd awips gempak" exit 1 @@ -58,7 +58,7 @@ elif [[ "${step}" = "atmanlrun" ]]; then export NTHREADS_ATMANL=${nth_atmanlrun:-${nth_max}} [[ ${NTHREADS_ATMANL} -gt ${nth_max} ]] && export NTHREADS_ATMANL=${nth_max} - export APRUN_ATMANL="${launcher} -n ${npe_atmanlrun}" + export APRUN_ATMANL="${launcher} -n ${npe_atmanlrun} --cpus-per-task=${NTHREADS_ATMANL}" elif [[ "${step}" = "atmensanlrun" ]]; then @@ -66,7 +66,7 @@ elif [[ "${step}" = "atmensanlrun" ]]; then 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 APRUN_ATMENSANL="${launcher} -n ${npe_atmensanlrun} --cpus-per-task=${NTHREADS_ATMENSANL}" elif [[ "${step}" = "aeroanlrun" ]]; then @@ -76,7 +76,7 @@ elif [[ "${step}" = "aeroanlrun" ]]; then export NTHREADS_AEROANL=${nth_aeroanlrun:-${nth_max}} [[ ${NTHREADS_AEROANL} -gt ${nth_max} ]] && export NTHREADS_AEROANL=${nth_max} - export APRUN_AEROANL="${launcher} -n ${npe_aeroanlrun}" + export APRUN_AEROANL="${launcher} -n ${npe_aeroanlrun} --cpus-per-task=${NTHREADS_AEROANL}" elif [[ "${step}" = "landanl" ]]; then @@ -84,7 +84,7 @@ elif [[ "${step}" = "landanl" ]]; then export NTHREADS_LANDANL=${nth_landanl:-${nth_max}} [[ ${NTHREADS_LANDANL} -gt ${nth_max} ]] && export NTHREADS_LANDANL=${nth_max} - export APRUN_LANDANL="${launcher} -n ${npe_landanl}" + export APRUN_LANDANL="${launcher} -n ${npe_landanl} --cpus-per-task=${NTHREADS_LANDANL}" export APRUN_APPLY_INCR="${launcher} -n 6" @@ -96,7 +96,7 @@ elif [[ "${step}" = "ocnanalbmat" ]]; then export NTHREADS_OCNANAL=${nth_ocnanalbmat:-${nth_max}} [[ ${NTHREADS_OCNANAL} -gt ${nth_max} ]] && export NTHREADS_OCNANAL=${nth_max} - export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalbmat}" + export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalbmat} --cpus-per-task=${NTHREADS_OCNANAL}" elif [[ "${step}" = "ocnanalrun" ]]; then @@ -106,7 +106,7 @@ elif [[ "${step}" = "ocnanalrun" ]]; then export NTHREADS_OCNANAL=${nth_ocnanalrun:-${nth_max}} [[ ${NTHREADS_OCNANAL} -gt ${nth_max} ]] && export NTHREADS_OCNANAL=${nth_max} - export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalrun}" + export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalrun} --cpus-per-task=${NTHREADS_OCNANAL}" elif [[ "${step}" = "ocnanalchkpt" ]]; then @@ -116,7 +116,7 @@ elif [[ "${step}" = "ocnanalchkpt" ]]; then export NTHREADS_OCNANAL=${nth_ocnanalchkpt:-${nth_max}} [[ ${NTHREADS_OCNANAL} -gt ${nth_max} ]] && export NTHREADS_OCNANAL=${nth_max} - export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalchkpt}" + export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalchkpt} --cpus-per-task=${NTHREADS_OCNANAL}" elif [[ "${step}" = "anal" ]] || [[ "${step}" = "analcalc" ]]; then @@ -131,21 +131,20 @@ elif [[ "${step}" = "anal" ]] || [[ "${step}" = "analcalc" ]]; then export NTHREADS_GSI=${nth_anal:-${nth_max}} [[ ${NTHREADS_GSI} -gt ${nth_max} ]] && export NTHREADS_GSI=${nth_max} - export APRUN_GSI="${launcher} -n ${npe_gsi:-${npe_anal}}" + export APRUN_GSI="${launcher} -n ${npe_gsi:-${npe_anal}} --cpus-per-task=${NTHREADS_GSI}" export NTHREADS_CALCINC=${nth_calcinc:-1} [[ ${NTHREADS_CALCINC} -gt ${nth_max} ]] && export NTHREADS_CALCINC=${nth_max} - export APRUN_CALCINC="${launcher} \$ncmd" + export APRUN_CALCINC="${launcher} \$ncmd --cpus-per-task=${NTHREADS_CALCINC}" export NTHREADS_CYCLE=${nth_cycle:-12} [[ ${NTHREADS_CYCLE} -gt ${npe_node_max} ]] && export NTHREADS_CYCLE=${npe_node_max} npe_cycle=${ntiles:-6} - export APRUN_CYCLE="${launcher} -n ${npe_cycle}" - + export APRUN_CYCLE="${launcher} -n ${npe_cycle} --cpus-per-task=${NTHREADS_CYCLE}" export NTHREADS_GAUSFCANL=1 npe_gausfcanl=${npe_gausfcanl:-1} - export APRUN_GAUSFCANL="${launcher} -n ${npe_gausfcanl}" + export APRUN_GAUSFCANL="${launcher} -n ${npe_gausfcanl} --cpus-per-task=${NTHREADS_GAUSFCANL}" elif [[ "${step}" = "sfcanl" ]]; then @@ -154,7 +153,7 @@ elif [[ "${step}" = "sfcanl" ]]; then export NTHREADS_CYCLE=${nth_sfcanl:-14} [[ ${NTHREADS_CYCLE} -gt ${npe_node_max} ]] && export NTHREADS_CYCLE=${npe_node_max} npe_sfcanl=${ntiles:-6} - export APRUN_CYCLE="${launcher} -n ${npe_sfcanl}" + export APRUN_CYCLE="${launcher} -n ${npe_sfcanl} --cpus-per-task=${NTHREADS_CYCLE}" elif [[ "${step}" = "eobs" ]]; then @@ -165,7 +164,7 @@ elif [[ "${step}" = "eobs" ]]; then export NTHREADS_GSI=${nth_eobs:-${nth_max}} [[ ${NTHREADS_GSI} -gt ${nth_max} ]] && export NTHREADS_GSI=${nth_max} - export APRUN_GSI="${launcher} -n ${npe_gsi:-${npe_eobs}}" + export APRUN_GSI="${launcher} -n ${npe_gsi:-${npe_eobs}} --cpus-per-task=${NTHREADS_GSI}" export CFP_MP=${CFP_MP:-"YES"} export USE_CFP=${USE_CFP:-"YES"} @@ -177,7 +176,7 @@ elif [[ "${step}" = "eupd" ]]; then export NTHREADS_ENKF=${nth_eupd:-${nth_max}} [[ ${NTHREADS_ENKF} -gt ${nth_max} ]] && export NTHREADS_ENKF=${nth_max} - export APRUN_ENKF="${launcher} -n ${npe_enkf:-${npe_eupd}}" + export APRUN_ENKF="${launcher} -n ${npe_enkf:-${npe_eupd}} --cpus-per-task=${NTHREADS_ENKF}" export CFP_MP=${CFP_MP:-"YES"} export USE_CFP=${USE_CFP:-"YES"} @@ -205,7 +204,7 @@ elif [[ "${step}" = "upp" ]]; then export NTHREADS_UPP=${nth_upp:-1} [[ ${NTHREADS_UPP} -gt ${nth_max} ]] && export NTHREADS_UPP=${nth_max} - export APRUN_UPP="${launcher} -n ${npe_upp}" + export APRUN_UPP="${launcher} -n ${npe_upp} --cpus-per-task=${NTHREADS_UPP}" elif [[ "${step}" = "post" ]]; then @@ -213,12 +212,12 @@ elif [[ "${step}" = "post" ]]; then export NTHREADS_NP=${nth_np:-1} [[ ${NTHREADS_NP} -gt ${nth_max} ]] && export NTHREADS_NP=${nth_max} - export APRUN_NP="${launcher} -n ${npe_post}" + export APRUN_NP="${launcher} -n ${npe_post} --cpus-per-task=${NTHREADS_NP}" export USE_CFP="YES" # Use MPMD for downstream product generation on Hera export NTHREADS_DWN=${nth_dwn:-1} [[ ${NTHREADS_DWN} -gt ${nth_max} ]] && export NTHREADS_DWN=${nth_max} - export APRUN_DWN="${launcher} -n ${npe_dwn}" + export APRUN_DWN="${launcher} -n ${npe_dwn} --cpus-per-task=${NTHREADS_DWN}" elif [[ "${step}" = "ecen" ]]; then @@ -226,7 +225,7 @@ elif [[ "${step}" = "ecen" ]]; then export NTHREADS_ECEN=${nth_ecen:-${nth_max}} [[ ${NTHREADS_ECEN} -gt ${nth_max} ]] && export NTHREADS_ECEN=${nth_max} - export APRUN_ECEN="${launcher} -n ${npe_ecen}" + export APRUN_ECEN="${launcher} -n ${npe_ecen} --cpus-per-task=${NTHREADS_ECEN}" export NTHREADS_CHGRES=${nth_chgres:-12} [[ ${NTHREADS_CHGRES} -gt ${npe_node_max} ]] && export NTHREADS_CHGRES=${npe_node_max} @@ -234,7 +233,7 @@ elif [[ "${step}" = "ecen" ]]; then export NTHREADS_CALCINC=${nth_calcinc:-1} [[ ${NTHREADS_CALCINC} -gt ${nth_max} ]] && export NTHREADS_CALCINC=${nth_max} - export APRUN_CALCINC="${launcher} -n ${npe_ecen}" + export APRUN_CALCINC="${launcher} -n ${npe_ecen} --cpus-per-task=${NTHREADS_CALCINC}" elif [[ "${step}" = "esfc" ]]; then @@ -242,11 +241,11 @@ elif [[ "${step}" = "esfc" ]]; then export NTHREADS_ESFC=${nth_esfc:-${nth_max}} [[ ${NTHREADS_ESFC} -gt ${nth_max} ]] && export NTHREADS_ESFC=${nth_max} - export APRUN_ESFC="${launcher} -n ${npe_esfc}" + export APRUN_ESFC="${launcher} -n ${npe_esfc} --cpus-per-task=${NTHREADS_ESFC}" export NTHREADS_CYCLE=${nth_cycle:-14} [[ ${NTHREADS_CYCLE} -gt ${npe_node_max} ]] && export NTHREADS_CYCLE=${npe_node_max} - export APRUN_CYCLE="${launcher} -n ${npe_esfc}" + export APRUN_CYCLE="${launcher} -n ${npe_esfc} --cpus-per-task=${NTHREADS_CYCLE}" elif [[ "${step}" = "epos" ]]; then @@ -254,7 +253,7 @@ elif [[ "${step}" = "epos" ]]; then export NTHREADS_EPOS=${nth_epos:-${nth_max}} [[ ${NTHREADS_EPOS} -gt ${nth_max} ]] && export NTHREADS_EPOS=${nth_max} - export APRUN_EPOS="${launcher} -n ${npe_epos}" + export APRUN_EPOS="${launcher} -n ${npe_epos} --cpus-per-task=${NTHREADS_EPOS}" elif [[ "${step}" = "postsnd" ]]; then @@ -264,7 +263,7 @@ elif [[ "${step}" = "postsnd" ]]; then export NTHREADS_POSTSND=${nth_postsnd:-1} [[ ${NTHREADS_POSTSND} -gt ${nth_max} ]] && export NTHREADS_POSTSND=${nth_max} - export APRUN_POSTSND="${launcher} -n ${npe_postsnd}" + export APRUN_POSTSND="${launcher} -n ${npe_postsnd} --cpus-per-task=${NTHREADS_POSTSND}" export NTHREADS_POSTSNDCFP=${nth_postsndcfp:-1} [[ ${NTHREADS_POSTSNDCFP} -gt ${nth_max} ]] && export NTHREADS_POSTSNDCFP=${nth_max} @@ -300,7 +299,7 @@ elif [[ "${step}" = "fit2obs" ]]; then export NTHREADS_FIT2OBS=${nth_fit2obs:-1} [[ ${NTHREADS_FIT2OBS} -gt ${nth_max} ]] && export NTHREADS_FIT2OBS=${nth_max} - export MPIRUN="${launcher} -n ${npe_fit2obs}" + export MPIRUN="${launcher} -n ${npe_fit2obs} --cpus-per-task=${NTHREADS_FIT2OBS}" fi diff --git a/env/JET.env b/env/JET.env index 0c5d7185d1..5f0f95202a 100755 --- a/env/JET.env +++ b/env/JET.env @@ -5,7 +5,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 "atmanlrun atmensanlrun aeroanlrun landanl" - echo "anal sfcanl fcst post vrfy metp" + echo "anal sfcanl fcst post metp" echo "eobs eupd ecen efcs epos" echo "postsnd awips gempak" exit 1 diff --git a/env/ORION.env b/env/ORION.env index e20945bc07..688b5cb790 100755 --- a/env/ORION.env +++ b/env/ORION.env @@ -5,7 +5,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 "atmanlrun atmensanlrun aeroanlrun landanl" - echo "anal sfcanl fcst post vrfy metp" + echo "anal sfcanl fcst post metp" echo "eobs eupd ecen efcs epos" echo "postsnd awips gempak" exit 1 @@ -59,7 +59,7 @@ elif [[ "${step}" = "atmanlrun" ]]; then export NTHREADS_ATMANL=${nth_atmanlrun:-${nth_max}} [[ ${NTHREADS_ATMANL} -gt ${nth_max} ]] && export NTHREADS_ATMANL=${nth_max} - export APRUN_ATMANL="${launcher} -n ${npe_atmanlrun}" + export APRUN_ATMANL="${launcher} -n ${npe_atmanlrun} --cpus-per-task=${NTHREADS_ATMANL}" elif [[ "${step}" = "atmensanlrun" ]]; then @@ -67,7 +67,7 @@ elif [[ "${step}" = "atmensanlrun" ]]; then 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 APRUN_ATMENSANL="${launcher} -n ${npe_atmensanlrun} --cpus-per-task=${NTHREADS_ATMENSANL}" elif [[ "${step}" = "aeroanlrun" ]]; then @@ -77,7 +77,7 @@ elif [[ "${step}" = "aeroanlrun" ]]; then export NTHREADS_AEROANL=${nth_aeroanlrun:-${nth_max}} [[ ${NTHREADS_AEROANL} -gt ${nth_max} ]] && export NTHREADS_AEROANL=${nth_max} - export APRUN_AEROANL="${launcher} -n ${npe_aeroanlrun}" + export APRUN_AEROANL="${launcher} -n ${npe_aeroanlrun} --cpus-per-task=${NTHREADS_AEROANL}" elif [[ "${step}" = "landanl" ]]; then @@ -85,7 +85,7 @@ elif [[ "${step}" = "landanl" ]]; then export NTHREADS_LANDANL=${nth_landanl:-${nth_max}} [[ ${NTHREADS_LANDANL} -gt ${nth_max} ]] && export NTHREADS_LANDANL=${nth_max} - export APRUN_LANDANL="${launcher} -n ${npe_landanl}" + export APRUN_LANDANL="${launcher} -n ${npe_landanl} --cpus-per-task=${NTHREADS_LANDANL}" export APRUN_APPLY_INCR="${launcher} -n 6" @@ -97,7 +97,7 @@ elif [[ "${step}" = "ocnanalbmat" ]]; then export NTHREADS_OCNANAL=${nth_ocnanalbmat:-${nth_max}} [[ ${NTHREADS_OCNANAL} -gt ${nth_max} ]] && export NTHREADS_OCNANAL=${nth_max} - export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalbmat}" + export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalbmat} --cpus-per-task=${NTHREADS_OCNANAL}" elif [[ "${step}" = "ocnanalrun" ]]; then @@ -107,7 +107,7 @@ elif [[ "${step}" = "ocnanalrun" ]]; then export NTHREADS_OCNANAL=${nth_ocnanalrun:-${nth_max}} [[ ${NTHREADS_OCNANAL} -gt ${nth_max} ]] && export NTHREADS_OCNANAL=${nth_max} - export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalrun}" + export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalrun} --cpus-per-task=${NTHREADS_OCNANAL}" elif [[ "${step}" = "ocnanalchkpt" ]]; then @@ -117,7 +117,7 @@ elif [[ "${step}" = "ocnanalchkpt" ]]; then export NTHREADS_OCNANAL=${nth_ocnanalchkpt:-${nth_max}} [[ ${NTHREADS_OCNANAL} -gt ${nth_max} ]] && export NTHREADS_OCNANAL=${nth_max} - export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalchkpt}" + export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalchkpt} --cpus-per-task=${NTHREADS_OCNANAL}" elif [[ "${step}" = "anal" ]] || [[ "${step}" = "analcalc" ]]; then @@ -153,7 +153,7 @@ elif [[ "${step}" = "sfcanl" ]]; then export NTHREADS_CYCLE=${nth_sfcanl:-14} [[ ${NTHREADS_CYCLE} -gt ${npe_node_max} ]] && export NTHREADS_CYCLE=${npe_node_max} npe_sfcanl=${ntiles:-6} - export APRUN_CYCLE="${launcher} -n ${npe_sfcanl}" + export APRUN_CYCLE="${launcher} -n ${npe_sfcanl} --cpus-per-task=${NTHREADS_CYCLE}" elif [[ "${step}" = "eobs" ]]; then @@ -168,7 +168,7 @@ elif [[ "${step}" = "eobs" ]]; then export NTHREADS_GSI=${nth_eobs:-${nth_max}} [[ ${NTHREADS_GSI} -gt ${nth_max} ]] && export NTHREADS_GSI=${nth_max} - export APRUN_GSI="${launcher} -n ${npe_gsi:-${npe_eobs}}" + export APRUN_GSI="${launcher} -n ${npe_gsi:-${npe_eobs}} --cpus-per-task=${NTHREADS_GSI}" elif [[ "${step}" = "eupd" ]]; then @@ -180,7 +180,7 @@ elif [[ "${step}" = "eupd" ]]; then export NTHREADS_ENKF=${nth_eupd:-${nth_max}} [[ ${NTHREADS_ENKF} -gt ${nth_max} ]] && export NTHREADS_ENKF=${nth_max} - export APRUN_ENKF="${launcher} -n ${npe_enkf:-${npe_eupd}}" + export APRUN_ENKF="${launcher} -n ${npe_enkf:-${npe_eupd}} --cpus-per-task=${NTHREADS_ENKF}" elif [[ "${step}" = "fcst" ]] || [[ "${step}" = "efcs" ]]; then @@ -204,7 +204,7 @@ elif [[ "${step}" = "upp" ]]; then export NTHREADS_UPP=${nth_upp:-1} [[ ${NTHREADS_UPP} -gt ${nth_max} ]] && export NTHREADS_UPP=${nth_max} - export APRUN_UPP="${launcher} -n ${npe_upp}" + export APRUN_UPP="${launcher} -n ${npe_upp} --cpus-per-task=${NTHREADS_UPP}" elif [[ "${step}" = "post" ]]; then @@ -212,12 +212,12 @@ elif [[ "${step}" = "post" ]]; then export NTHREADS_NP=${nth_np:-1} [[ ${NTHREADS_NP} -gt ${nth_max} ]] && export NTHREADS_NP=${nth_max} - export APRUN_NP="${launcher} -n ${npe_post}" + export APRUN_NP="${launcher} -n ${npe_post} --cpus-per-task=${NTHREADS_NP}" export USE_CFP="YES" # Use MPMD for downstream product generation on Orion export NTHREADS_DWN=${nth_dwn:-1} [[ ${NTHREADS_DWN} -gt ${nth_max} ]] && export NTHREADS_DWN=${nth_max} - export APRUN_DWN="${launcher} -n ${npe_dwn}" + export APRUN_DWN="${launcher} -n ${npe_dwn} --cpus-per-task=${NTHREADS_DWN}" elif [[ "${step}" = "ecen" ]]; then @@ -225,7 +225,7 @@ elif [[ "${step}" = "ecen" ]]; then export NTHREADS_ECEN=${nth_ecen:-${nth_max}} [[ ${NTHREADS_ECEN} -gt ${nth_max} ]] && export NTHREADS_ECEN=${nth_max} - export APRUN_ECEN="${launcher} -n ${npe_ecen}" + export APRUN_ECEN="${launcher} -n ${npe_ecen} --cpus-per-task=${NTHREADS_ECEN}" export NTHREADS_CHGRES=${nth_chgres:-12} [[ ${NTHREADS_CHGRES} -gt ${npe_node_max} ]] && export NTHREADS_CHGRES=${npe_node_max} @@ -233,7 +233,7 @@ elif [[ "${step}" = "ecen" ]]; then export NTHREADS_CALCINC=${nth_calcinc:-1} [[ ${NTHREADS_CALCINC} -gt ${nth_max} ]] && export NTHREADS_CALCINC=${nth_max} - export APRUN_CALCINC="${launcher} -n ${npe_ecen}" + export APRUN_CALCINC="${launcher} -n ${npe_ecen} --cpus-per-task=${NTHREADS_CALCINC}" elif [[ "${step}" = "esfc" ]]; then @@ -241,11 +241,11 @@ elif [[ "${step}" = "esfc" ]]; then export NTHREADS_ESFC=${nth_esfc:-${nth_max}} [[ ${NTHREADS_ESFC} -gt ${nth_max} ]] && export NTHREADS_ESFC=${nth_max} - export APRUN_ESFC="${launcher} -n ${npe_esfc}" + export APRUN_ESFC="${launcher} -n ${npe_esfc} --cpus-per-task=${NTHREADS_ESFC}" export NTHREADS_CYCLE=${nth_cycle:-14} [[ ${NTHREADS_CYCLE} -gt ${npe_node_max} ]] && export NTHREADS_CYCLE=${npe_node_max} - export APRUN_CYCLE="${launcher} -n ${npe_esfc}" + export APRUN_CYCLE="${launcher} -n ${npe_esfc} --cpus-per-task=${NTHREADS_CYCLE}" elif [[ "${step}" = "epos" ]]; then @@ -253,7 +253,7 @@ elif [[ "${step}" = "epos" ]]; then export NTHREADS_EPOS=${nth_epos:-${nth_max}} [[ ${NTHREADS_EPOS} -gt ${nth_max} ]] && export NTHREADS_EPOS=${nth_max} - export APRUN_EPOS="${launcher} -n ${npe_epos}" + export APRUN_EPOS="${launcher} -n ${npe_epos} --cpus-per-task=${NTHREADS_EPOS}" elif [[ "${step}" = "postsnd" ]]; then @@ -263,7 +263,7 @@ elif [[ "${step}" = "postsnd" ]]; then export NTHREADS_POSTSND=${nth_postsnd:-1} [[ ${NTHREADS_POSTSND} -gt ${nth_max} ]] && export NTHREADS_POSTSND=${nth_max} - export APRUN_POSTSND="${launcher} -n ${npe_postsnd}" + export APRUN_POSTSND="${launcher} -n ${npe_postsnd} --cpus-per-task=${NTHREADS_POSTSND}" export NTHREADS_POSTSNDCFP=${nth_postsndcfp:-1} [[ ${NTHREADS_POSTSNDCFP} -gt ${nth_max} ]] && export NTHREADS_POSTSNDCFP=${nth_max} @@ -298,6 +298,6 @@ elif [[ "${step}" = "fit2obs" ]]; then export NTHREADS_FIT2OBS=${nth_fit2obs:-1} [[ ${NTHREADS_FIT2OBS} -gt ${nth_max} ]] && export NTHREADS_FIT2OBS=${nth_max} - export MPIRUN="${launcher} -n ${npe_fit2obs}" + export MPIRUN="${launcher} -n ${npe_fit2obs} --cpus-per-task=${NTHREADS_FIT2OBS}" fi diff --git a/env/S4.env b/env/S4.env index 1c81f72f6e..8f01e61a7e 100755 --- a/env/S4.env +++ b/env/S4.env @@ -5,7 +5,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 "atmanlrun atmensanlrun aeroanlrun landanl" - echo "anal sfcanl fcst post vrfy metp" + echo "anal sfcanl fcst post metp" echo "eobs eupd ecen efcs epos" echo "postsnd awips gempak" exit 1 diff --git a/env/WCOSS2.env b/env/WCOSS2.env index ae5ceaa022..9d8f459aa1 100755 --- a/env/WCOSS2.env +++ b/env/WCOSS2.env @@ -5,7 +5,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 "atmanlrun atmensanlrun aeroanlrun landanl" - echo "anal sfcanl fcst post vrfy metp" + echo "anal sfcanl fcst post metp" echo "eobs eupd ecen esfc efcs epos" echo "postsnd awips gempak" exit 1 diff --git a/jobs/rocoto/fbwinds.sh b/jobs/rocoto/fbwinds.sh new file mode 100755 index 0000000000..078e71586f --- /dev/null +++ b/jobs/rocoto/fbwinds.sh @@ -0,0 +1,17 @@ +#! /usr/bin/env bash + +source "${HOMEgfs}/ush/preamble.sh" + +############################################################### +. "${HOMEgfs}/ush/load_fv3gfs_modules.sh" +status=$? +if (( status != 0 )); then exit "${status}"; fi + +export job="fbwinds" +export jobid="${job}.$$" + +# Execute the JJOB +"${HOMEgfs}/jobs/JGFS_ATMOS_FBWINDS" + +status=$? +exit "${status}" diff --git a/jobs/rocoto/npoess.sh b/jobs/rocoto/npoess.sh new file mode 100755 index 0000000000..9e9b816451 --- /dev/null +++ b/jobs/rocoto/npoess.sh @@ -0,0 +1,17 @@ +#! /usr/bin/env bash + +source "${HOMEgfs}/ush/preamble.sh" + +############################################################### +. "${HOMEgfs}/ush/load_fv3gfs_modules.sh" +status=$? +if (( status != 0 )); then exit "${status}"; fi + +export job="npoess" +export jobid="${job}.$$" + +# Execute the JJOB +"${HOMEgfs}/jobs/JGFS_ATMOS_PGRB2_SPEC_NPOESS" + +status=$? +exit "${status}" diff --git a/jobs/rocoto/vrfy.sh b/jobs/rocoto/vrfy.sh deleted file mode 100755 index 1c0cf61d3b..0000000000 --- a/jobs/rocoto/vrfy.sh +++ /dev/null @@ -1,61 +0,0 @@ -#! /usr/bin/env bash - -source "${HOMEgfs}/ush/preamble.sh" - -############################################################### -# Source FV3GFS workflow modules -source "${HOMEgfs}/ush/load_fv3gfs_modules.sh" -status=$? -(( status != 0 )) && exit "${status}" - -export job="vrfy" -export jobid="${job}.$$" - -# TODO (#235) - This job is calling multiple j-jobs and doing too much in general -# Also, this forces us to call the config files here instead of the j-job -source "${HOMEgfs}/ush/jjob_header.sh" -e "vrfy" -c "base vrfy" - -############################################################### -export CDUMP="${RUN/enkf}" - -CDATEm1=$(${NDATE} -24 "${PDY}${cyc}") -export CDATEm1 -export PDYm1=${CDATEm1:0:8} - -############################################################### -# TODO: We can likely drop support for these dev-only grib1 precip files -echo -echo "=============== START TO GENERATE QUARTER DEGREE GRIB1 FILES ===============" -if [[ ${MKPGB4PRCP} = "YES" && ${CDUMP} == "gfs" ]]; then - YMD=${PDY} HH=${cyc} generate_com -x COM_ATMOS_MASTER - if [ ! -d ${ARCDIR} ]; then mkdir -p ${ARCDIR} ; fi - nthreads_env=${OMP_NUM_THREADS:-1} # get threads set in env - export OMP_NUM_THREADS=1 - cd "${COM_ATMOS_MASTER}" || exit 9 - fhmax=${vhr_rain:-${FHMAX_GFS}} - for (( fhr=0; fhr <= fhmax; fhr+=6 )); do - fhr2=$(printf %02i "${fhr}") - fhr3=$(printf %03i "${fhr}") - fname=${RUN}.t${cyc}z.sfluxgrbf${fhr3}.grib2 - fileout=${ARCDIR}/pgbq${fhr2}.${RUN}.${PDY}${cyc}.grib2 - ${WGRIB2} "${fname}" -match "(:PRATE:surface:)|(:TMP:2 m above ground:)" -grib "${fileout}" - done - export OMP_NUM_THREADS=${nthreads_env} # revert to threads set in env -fi - - -############################################################### -echo -echo "=============== START TO RUN MOS ===============" -if [[ "${RUNMOS}" == "YES" && "${CDUMP}" == "gfs" ]]; then - ${RUNGFSMOSSH} "${PDY}${cyc}" -fi - - -############################################################### -# Force Exit out cleanly -cd "${DATAROOT}" -if [[ ${KEEPDATA:-"NO"} = "NO" ]] ; then rm -rf "${DATA}" ; fi - - -exit 0 diff --git a/parm/config/gefs/config.base.emc.dyn b/parm/config/gefs/config.base.emc.dyn index 59304ac38d..196e5c7af5 100644 --- a/parm/config/gefs/config.base.emc.dyn +++ b/parm/config/gefs/config.base.emc.dyn @@ -55,12 +55,11 @@ export BASE_GIT="@BASE_GIT@" export DO_BUFRSND="NO" # BUFR sounding products export DO_GEMPAK="NO" # GEMPAK products export DO_AWIPS="NO" # AWIPS products -export DO_VRFY="NO" # VRFY step # NO for retrospective parallel; YES for real-time parallel # arch.sh uses REALTIME for MOS. Need to set REALTIME=YES # if want MOS written to HPSS. Should update arch.sh to -# use RUNMOS flag (currently in config.vrfy) +# use RUNMOS flag export REALTIME="YES" # Experiment mode (cycled or forecast-only) @@ -138,10 +137,8 @@ export DO_WAVE="NO" export DO_OCN="NO" export DO_ICE="NO" export DO_AERO="NO" -export CCPP_SUITE="FV3_GFS_v17_p8_ugwpv1" export WAVE_CDUMP="" # When to include wave suite: gdas, gfs, or both export DOBNDPNT_WAVE="NO" -export cplwav2atm=".false." export FRAC_GRID=".true." # Set operational resolution @@ -183,17 +180,14 @@ export ICERES=${OCNRES} case "${APP}" in ATM) - export confignamevarforufs="atm" ;; ATMA) export DO_AERO="YES" - export confignamevarforufs="atm_aero" ;; ATMW) export DO_COUPLED="YES" export DO_WAVE="YES" export WAVE_CDUMP="both" - export confignamevarforufs="leapfrog_atm_wav" ;; NG-GODAS) export DO_ATM="NO" @@ -204,19 +198,15 @@ case "${APP}" in export DO_COUPLED="YES" export DO_OCN="YES" export DO_ICE="YES" - export CCPP_SUITE="FV3_GFS_v17_coupled_p8_ugwpv1" # TODO: Does this include FV3_GFS_v17_p8? Can this be used instead of FV3_GFS_v17_p8 on L141 - export confignamevarforufs="cpld" if [[ "${APP}" =~ A$ ]]; then export DO_AERO="YES" - export confignamevarforufs="${confignamevarforufs}_aero" fi if [[ "${APP}" =~ ^S2SW ]]; then export DO_WAVE="YES" export WAVE_CDUMP="both" export cplwav2atm=".true." - export confignamevarforufs="${confignamevarforufs}_outerwave" fi ;; *) diff --git a/parm/config/gefs/config.efcs b/parm/config/gefs/config.efcs index 86526c208f..a6d093968d 100644 --- a/parm/config/gefs/config.efcs +++ b/parm/config/gefs/config.efcs @@ -14,9 +14,10 @@ export DO_WAVE=${DO_WAVE_ENKF:-${DO_WAVE:-"NO"}} # Source model specific information that is resolution dependent string="--fv3 ${CASE_ENS}" # Ocean/Ice/Waves ensemble configurations are identical to deterministic member -[[ ${DO_OCN} == "YES" ]] && string="${string} --mom6 ${OCNRES}" -[[ ${DO_ICE} == "YES" ]] && string="${string} --cice6 ${ICERES}" -[[ ${DO_WAVE} == "YES" ]] && string="${string} --ww3 ${waveGRD// /;}" +[[ "${DO_OCN}" == "YES" ]] && string="${string} --mom6 ${OCNRES}" +[[ "${DO_ICE}" == "YES" ]] && string="${string} --cice6 ${ICERES}" +[[ "${DO_WAVE}" == "YES" ]] && string="${string} --ww3 ${waveGRD// /;}" +[[ "${DO_AERO}" == "YES" ]] && string="${string} --gocart" # shellcheck disable=SC2086 source "${EXPDIR}/config.ufs" ${string} diff --git a/parm/config/gefs/config.fcst b/parm/config/gefs/config.fcst index 331dcd5a78..e36e023652 100644 --- a/parm/config/gefs/config.fcst +++ b/parm/config/gefs/config.fcst @@ -13,20 +13,14 @@ esac # Source model specific information that is resolution dependent string="--fv3 ${CASE}" -[[ ${DO_OCN} == "YES" ]] && string="${string} --mom6 ${OCNRES}" -[[ ${DO_ICE} == "YES" ]] && string="${string} --cice6 ${ICERES}" -[[ ${DO_WAVE} == "YES" ]] && string="${string} --ww3 ${waveGRD// /;}" +[[ "${DO_OCN}" == "YES" ]] && string="${string} --mom6 ${OCNRES}" +[[ "${DO_ICE}" == "YES" ]] && string="${string} --cice6 ${ICERES}" +[[ "${DO_WAVE}" == "YES" ]] && string="${string} --ww3 ${waveGRD// /;}" +[[ "${DO_AERO}" == "YES" ]] && string="${string} --gocart" # We are counting on $string being multiple arguments # shellcheck disable=SC2086 source "${EXPDIR}/config.ufs" ${string} -# Source component configs if necessary -for component in WAVE OCN ICE AERO; do - control="DO_${component}" - if [[ ${!control} == "YES" ]]; then - source "${EXPDIR}/config.${component,,}" - fi -done # Get task specific resources source "${EXPDIR}/config.resources" fcst @@ -41,35 +35,6 @@ export esmf_profile=".false." export esmf_logkind="ESMF_LOGKIND_MULTI_ON_ERROR" #Options: ESMF_LOGKIND_MULTI_ON_ERROR, ESMF_LOGKIND_MULTI, ESMF_LOGKIND_NONE -####################################################################### -# COUPLING COMPONENTS - -# cpl defaults -export cpl=".false." -export cplflx=".false." -export cplice=".false." -export cplchm=".false." -export cplwav=".false." - -# cpl changes based on APP - -if [[ "${DO_COUPLED}" == "YES" ]]; then - export cpl=".true." -fi -if [[ "${DO_AERO}" == "YES" ]]; then - export cplchm=".true." -fi -if [[ "${DO_ICE}" == "YES" ]]; then - export cplice=".true." - export cplflx=".true." -fi -if [[ "${DO_OCN}" == "YES" ]]; then - export cplflx=".true." -fi -if [[ "${DO_WAVE}" == "YES" ]]; then - export cplwav=".true." -fi - ####################################################################### export FORECASTSH="${HOMEgfs}/scripts/exglobal_forecast.sh" @@ -286,11 +251,6 @@ export DIAG_TABLE="${HOMEgfs}/parm/ufs/fv3/diag_table" # Write gfs restart files to rerun fcst from any break point export restart_interval=${restart_interval_gfs:-12} -# Choose coupling with wave -if [[ "${DO_WAVE}" = "YES" ]]; then - export cplwav=".true." -fi - # Turn off dry mass adjustment in GFS export adjust_dry_mass=".false." @@ -301,17 +261,6 @@ else export io_layout="1,1" fi -if [[ "${DO_AERO}" = "YES" ]]; then # temporary settings for aerosol coupling - export AERO_DIAG_TABLE="${AERO_DIAG_TABLE:-${HOMEgfs}/parm/ufs/fv3/diag_table.aero}" - export AERO_FIELD_TABLE="${AERO_FIELD_TABLE:-${HOMEgfs}/parm/ufs/fv3/field_table.aero}" - AERO_EMIS_FIRE="${AERO_EMIS_FIRE:-none}" - export AERO_EMIS_FIRE=${AERO_EMIS_FIRE,,} - export AERO_CONFIG_DIR="${AERO_CONFIG_DIR:-${HOMEgfs}/parm/ufs/chem}" - export AERO_INPUTS_DIR="${AERO_INPUTS_DIR:-}" - export fscav_aero="${aero_conv_scav_factors:-${fscav_aero}}" - export dnats_aero="${aero_diag_tracers:-0}" -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.resources b/parm/config/gefs/config.resources index 74e9854084..d033ec8d42 100644 --- a/parm/config/gefs/config.resources +++ b/parm/config/gefs/config.resources @@ -9,7 +9,7 @@ if [[ $# -ne 1 ]]; then echo "Must specify an input task argument to set resource variables!" echo "argument can be any one of the following:" echo "stage_ic aerosol_init" - echo "sfcanl analcalc analdiag fcst post vrfy fit2obs metp arch echgres" + echo "sfcanl analcalc analdiag fcst post fit2obs metp arch echgres" echo "ecen esfc efcs epos earc" echo "init_chem mom6ic ocnpost" echo "waveinit waveprep wavepostsbs wavepostbndpnt wavepostbndpntbll wavepostpnt" @@ -347,20 +347,6 @@ elif [[ ${step} = "post" ]]; then if [[ "${npe_node_post_gfs}" -gt "${npe_node_max}" ]]; then export npe_node_post_gfs=${npe_node_max} ; fi export is_exclusive=True -elif [[ ${step} = "vrfy" ]]; then - - export wtime_vrfy="03:00:00" - export wtime_vrfy_gfs="06:00:00" - export npe_vrfy=3 - export nth_vrfy=1 - export npe_node_vrfy=1 - export npe_vrfy_gfs=1 - export npe_node_vrfy_gfs=1 - if [[ ${machine} == "HERA" ]]; then - export memory_vrfy="16384M" - fi - export is_exclusive=True - elif [[ "${step}" = "fit2obs" ]]; then export wtime_fit2obs="00:20:00" diff --git a/parm/config/gefs/config.ufs b/parm/config/gefs/config.ufs index 8418459cc3..db0589ab6a 100644 --- a/parm/config/gefs/config.ufs +++ b/parm/config/gefs/config.ufs @@ -8,7 +8,7 @@ echo "BEGIN: config.ufs" -if [ $# -le 1 ]; then +if (( $# <= 1 )); then echo "Must specify an input resolution argument to set variables!" echo "argument can be any one of the following:" @@ -16,6 +16,7 @@ if [ $# -le 1 ]; then 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 "--gocart" exit 1 @@ -25,26 +26,34 @@ fi skip_mom6=true skip_cice6=true skip_ww3=true +skip_gocart=true skip_mediator=true # Loop through named arguments -while [[ $# -gt 0 ]]; do +while (( $# > 0 )); do key="$1" case "${key}" in "--fv3") fv3_res="$2" + shift ;; "--mom6") mom6_res="$2" skip_mom6=false + shift ;; "--cice6") cice6_res="$2" skip_cice6=false + shift ;; "--ww3") ww3_res="$2" skip_ww3=false + shift + ;; + "--gocart") + skip_gocart=false ;; *) # unknown option echo "FATAL ERROR: Unknown option: ${key}, ABORT!" @@ -52,7 +61,6 @@ while [[ $# -gt 0 ]]; do ;; esac shift - shift done # Mediator is required if any of the non-ATM components are used @@ -98,6 +106,10 @@ case "${machine}" in ;; esac ;; + *) + echo "FATAL ERROR: Unrecognized machine ${machine}" + exit 14 + ;; esac export npe_node_max @@ -249,13 +261,28 @@ case ${fv3_res} in esac export OUTPUT_FILETYPE_ATM OUTPUT_FILETYPE_SFC +# cpl defaults +export cpl=".false." +export cplflx=".false." +export cplice=".false." +export cplchm=".false." +export cplwav=".false." +export cplwav2atm=".false." +export CCPP_SUITE="FV3_GFS_v17_p8_ugwpv1" +model_list="atm" + # Mediator specific settings if [[ "${skip_mediator}" == "false" ]]; then + export cpl=".true." export nthreads_mediator=${nthreads_fv3} # Use same threads as FV3 + export CCPP_SUITE="FV3_GFS_v17_coupled_p8_ugwpv1" # TODO: Does this include FV3_GFS_v17_p8? Can this be used instead of FV3_GFS_v17_p8? fi # MOM6 specific settings if [[ "${skip_mom6}" == "false" ]]; then + source "${EXPDIR}/config.ocn" + export cplflx=".true." + model_list="${model_list}.ocean" nthreads_mom6=1 case "${mom6_res}" in "500") @@ -362,6 +389,9 @@ fi # CICE6 specific settings if [[ "${skip_cice6}" == "false" ]]; then + source "${EXPDIR}/config.ice" + export cplice=".true." + model_list="${model_list}.ice" # Ensure we sourced the MOM6 section if [[ "${skip_mom6}" == "true" ]]; then echo "FATAL ERROR: CICE6 cannot be configured without MOM6, ABORT!" @@ -398,6 +428,10 @@ fi # WW3 specific settings if [[ "${skip_ww3}" == "false" ]]; then + source "${EXPDIR}/config.wave" + export cplwav=".true." + export cplwav2atm=".true." + model_list="${model_list}.wave" nthreads_ww3=2 case "${ww3_res}" in "gnh_10m;aoc_9km;gsh_15m") @@ -428,4 +462,47 @@ if [[ "${skip_ww3}" == "false" ]]; then export ntasks_ww3 nthreads_ww3 fi +# GOCART specific settings +if [[ "${skip_gocart}" == "false" ]]; then + source "${EXPDIR}/config.aero" + export cplchm=".true." + model_list="${model_list}.aero" +fi + +# Set the name of the UFS (previously nems) configure template to use +case "${model_list}" in + atm) + export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.atm.IN" + ;; + atm.aero) + export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.atm_aero.IN" + ;; + atm.wave) + export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.leapfrog_atm_wav.IN" + ;; + atm.ocean.ice) + export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld.IN" + ;; + atm.ocean.ice.aero) + export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld_aero.IN" + ;; + atm.ocean.ice.wave) + export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld_outerwave.IN" + ;; + atm.ocean.ice.wave.aero) + export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld_aero_outerwave.IN" + ;; + *) + echo "FATAL ERROR: Unable to determine appropriate UFS configure template for ${model_list}" + exit 16 + ;; +esac + +if [[ ! -r "${ufs_configure_template}" ]]; then + echo "FATAL ERROR: ${ufs_configure_template} either doesn't exist or is not readable." + exit 17 +fi + +unset model_list + echo "END: config.ufs" diff --git a/parm/config/gfs/config.aero b/parm/config/gfs/config.aero index fbd2d86ac8..23d738c642 100644 --- a/parm/config/gfs/config.aero +++ b/parm/config/gfs/config.aero @@ -5,8 +5,6 @@ # Turn off warnings about unused variables # shellcheck disable=SC2034 -# Directory containing GOCART configuration files. Defaults to parm/ufs/chem if unset. -AERO_CONFIG_DIR=${HOMEgfs}/parm/ufs/chem # Path to the input data tree case ${machine} in @@ -30,14 +28,19 @@ case ${machine} in exit 2 ;; esac +export AERO_INPUTS_DIR -# Biomass burning emission dataset. Choose from: GBBEPx, QFED, NONE (default) -AERO_EMIS_FIRE=QFED +export AERO_DIAG_TABLE="${HOMEgfs}/parm/ufs/fv3/diag_table.aero" +export AERO_FIELD_TABLE="${HOMEgfs}/parm/ufs/fv3/field_table.aero" +# Biomass burning emission dataset. Choose from: gbbepx, qfed, none +export AERO_EMIS_FIRE="qfed" +# Directory containing GOCART configuration files +export AERO_CONFIG_DIR="${HOMEgfs}/parm/ufs/gocart" # Aerosol convective scavenging factors (list of string array elements) # Element syntax: ':'. Use = * to set default factor for all aerosol tracers # Scavenging factors are set to 0 (no scavenging) if unset -aero_conv_scav_factors="'*:0.3','so2:0.0','msa:0.0','dms:0.0','nh3:0.4','nh4:0.6','bc1:0.6','bc2:0.6','oc1:0.4','oc2:0.4','dust1:0.6','dust2:0.6', 'dust3:0.6','dust4:0.6','dust5:0.6','seas1:0.5','seas2:0.5','seas3:0.5','seas4:0.5','seas5:0.5'" +export fscav_aero="'*:0.3','so2:0.0','msa:0.0','dms:0.0','nh3:0.4','nh4:0.6','bc1:0.6','bc2:0.6','oc1:0.4','oc2:0.4','dust1:0.6','dust2:0.6', 'dust3:0.6','dust4:0.6','dust5:0.6','seas1:0.5','seas2:0.5','seas3:0.5','seas4:0.5','seas5:0.5'" # # Number of diagnostic aerosol tracers (default: 0) -aero_diag_tracers=2 +export dnats_aero=2 diff --git a/parm/config/gfs/config.base.emc.dyn b/parm/config/gfs/config.base.emc.dyn index 78cff9bfb8..22b72fe873 100644 --- a/parm/config/gfs/config.base.emc.dyn +++ b/parm/config/gfs/config.base.emc.dyn @@ -56,7 +56,7 @@ export BASE_GIT="@BASE_GIT@" export DO_BUFRSND="NO" # BUFR sounding products export DO_GEMPAK="NO" # GEMPAK products export DO_AWIPS="NO" # AWIPS products -export DO_VRFY="YES" # VRFY step +export DO_NPOESS="NO" # NPOESS products export DO_TRACKER="YES" # Hurricane track verification export DO_GENESIS="YES" # Cyclone genesis verification export DO_GENESIS_FSU="NO" # Cyclone genesis verification (FSU) @@ -67,7 +67,7 @@ export DO_VMINMON="YES" # GSI minimization monitoring # NO for retrospective parallel; YES for real-time parallel # arch.sh uses REALTIME for MOS. Need to set REALTIME=YES # if want MOS written to HPSS. Should update arch.sh to -# use RUNMOS flag (currently in config.vrfy) +# use RUNMOS flag export REALTIME="YES" # Experiment mode (cycled or forecast-only) @@ -151,10 +151,8 @@ export DO_WAVE="NO" export DO_OCN="NO" export DO_ICE="NO" export DO_AERO="NO" -export CCPP_SUITE="FV3_GFS_v17_p8_ugwpv1" export WAVE_CDUMP="" # When to include wave suite: gdas, gfs, or both export DOBNDPNT_WAVE="NO" -export cplwav2atm=".false." export FRAC_GRID=".true." # Set operational resolution @@ -196,17 +194,14 @@ export ICERES=${OCNRES} case "${APP}" in ATM) - export confignamevarforufs="atm" ;; ATMA) export DO_AERO="YES" - export confignamevarforufs="atm_aero" ;; ATMW) export DO_COUPLED="YES" export DO_WAVE="YES" export WAVE_CDUMP="both" - export confignamevarforufs="leapfrog_atm_wav" ;; NG-GODAS) export DO_ATM="NO" @@ -217,21 +212,15 @@ case "${APP}" in export DO_COUPLED="YES" export DO_OCN="YES" export DO_ICE="YES" - export CCPP_SUITE="FV3_GFS_v17_coupled_p8_ugwpv1" # TODO: Does this include FV3_GFS_v17_p8? Can this be used instead of FV3_GFS_v17_p8 on L149 - export confignamevarforufs="cpld" if [[ "${APP}" =~ A$ ]]; then export DO_AERO="YES" - export confignamevarforufs="${confignamevarforufs}_aero" fi if [[ "${APP}" =~ ^S2SW ]]; then export DO_WAVE="YES" export WAVE_CDUMP="both" - export cplwav2atm=".true." - export confignamevarforufs="${confignamevarforufs}_outerwave" fi - ;; *) echo "Unrecognized APP: '${APP}'" @@ -381,7 +370,7 @@ export INCVARS_EFOLD="5" # Swith to generate netcdf or binary diagnostic files. If not specified, # script default to binary diagnostic files. Set diagnostic file -# variables here since used in both DA and vrfy jobs +# variables here since used in DA job export netcdf_diag=".true." export binary_diag=".false." diff --git a/parm/config/gfs/config.efcs b/parm/config/gfs/config.efcs index 2cb0ff1344..283ec3ab7e 100644 --- a/parm/config/gfs/config.efcs +++ b/parm/config/gfs/config.efcs @@ -14,9 +14,10 @@ export DO_WAVE=${DO_WAVE_ENKF:-${DO_WAVE:-"NO"}} # Source model specific information that is resolution dependent string="--fv3 ${CASE_ENS}" # Ocean/Ice/Waves ensemble configurations are identical to deterministic member -[[ ${DO_OCN} == "YES" ]] && string="${string} --mom6 ${OCNRES}" -[[ ${DO_ICE} == "YES" ]] && string="${string} --cice6 ${ICERES}" -[[ ${DO_WAVE} == "YES" ]] && string="${string} --ww3 ${waveGRD// /;}" +[[ "${DO_OCN}" == "YES" ]] && string="${string} --mom6 ${OCNRES}" +[[ "${DO_ICE}" == "YES" ]] && string="${string} --cice6 ${ICERES}" +[[ "${DO_WAVE}" == "YES" ]] && string="${string} --ww3 ${waveGRD// /;}" +[[ "${DO_AERO}" == "YES" ]] && string="${string} --gocart" # We are counting on $string being multiple arguments # shellcheck disable=SC2086 source "${EXPDIR}/config.ufs" ${string} diff --git a/parm/config/gfs/config.fcst b/parm/config/gfs/config.fcst index 4cecf27a34..3f63578d76 100644 --- a/parm/config/gfs/config.fcst +++ b/parm/config/gfs/config.fcst @@ -13,20 +13,14 @@ esac # Source model specific information that is resolution dependent string="--fv3 ${CASE}" -[[ ${DO_OCN} == "YES" ]] && string="${string} --mom6 ${OCNRES}" -[[ ${DO_ICE} == "YES" ]] && string="${string} --cice6 ${ICERES}" -[[ ${DO_WAVE} == "YES" ]] && string="${string} --ww3 ${waveGRD// /;}" +[[ "${DO_OCN}" == "YES" ]] && string="${string} --mom6 ${OCNRES}" +[[ "${DO_ICE}" == "YES" ]] && string="${string} --cice6 ${ICERES}" +[[ "${DO_WAVE}" == "YES" ]] && string="${string} --ww3 ${waveGRD// /;}" +[[ "${DO_AERO}" == "YES" ]] && string="${string} --gocart" # We are counting on $string being multiple arguments # shellcheck disable=SC2086 source "${EXPDIR}/config.ufs" ${string} -# Source component configs if necessary -for component in WAVE OCN ICE AERO; do - control="DO_${component}" - if [[ ${!control} == "YES" ]]; then - source "${EXPDIR}/config.${component,,}" - fi -done # Get task specific resources source "${EXPDIR}/config.resources" fcst @@ -41,35 +35,6 @@ export esmf_profile=".false." export esmf_logkind="ESMF_LOGKIND_MULTI_ON_ERROR" #Options: ESMF_LOGKIND_MULTI_ON_ERROR, ESMF_LOGKIND_MULTI, ESMF_LOGKIND_NONE -####################################################################### -# COUPLING COMPONENTS - -# cpl defaults -export cpl=".false." -export cplflx=".false." -export cplice=".false." -export cplchm=".false." -export cplwav=".false." - -# cpl changes based on APP - -if [[ "${DO_COUPLED}" == "YES" ]]; then - export cpl=".true." -fi -if [[ "${DO_AERO}" == "YES" ]]; then - export cplchm=".true." -fi -if [[ "${DO_ICE}" == "YES" ]]; then - export cplice=".true." - export cplflx=".true." -fi -if [[ "${DO_OCN}" == "YES" ]]; then - export cplflx=".true." -fi -if [[ "${DO_WAVE}" == "YES" ]]; then - export cplwav=".true." -fi - ####################################################################### export FORECASTSH="${HOMEgfs}/scripts/exglobal_forecast.sh" @@ -285,16 +250,12 @@ if [[ "${CDUMP}" =~ "gdas" ]] ; then # GDAS cycle specific parameters # Variables used in DA cycling export DIAG_TABLE="${HOMEgfs}/parm/ufs/fv3/diag_table_da" - if [[ "${DOIAU}" == "YES" ]]; then export restart_interval="3" else export restart_interval="6" fi - # Choose coupling with wave - if [[ "${DO_WAVE}" == "YES" ]]; then export cplwav=".true." ; fi - # Turn on dry mass adjustment in GDAS export adjust_dry_mass=".true." @@ -306,11 +267,6 @@ elif [[ "${CDUMP}" =~ "gfs" ]] ; then # GFS cycle specific parameters # Write gfs restart files to rerun fcst from any break point export restart_interval=${restart_interval_gfs:-12} - # Choose coupling with wave - if [[ "${DO_WAVE}" = "YES" && "${WAVE_CDUMP}" != "gdas" ]]; then - export cplwav=".true." - fi - # Turn off dry mass adjustment in GFS export adjust_dry_mass=".false." @@ -323,17 +279,6 @@ elif [[ "${CDUMP}" =~ "gfs" ]] ; then # GFS cycle specific parameters fi -if [[ "${DO_AERO}" = "YES" ]]; then # temporary settings for aerosol coupling - export AERO_DIAG_TABLE="${AERO_DIAG_TABLE:-${HOMEgfs}/parm/ufs/fv3/diag_table.aero}" - export AERO_FIELD_TABLE="${AERO_FIELD_TABLE:-${HOMEgfs}/parm/ufs/fv3/field_table.aero}" - AERO_EMIS_FIRE="${AERO_EMIS_FIRE:-none}" - export AERO_EMIS_FIRE=${AERO_EMIS_FIRE,,} - export AERO_CONFIG_DIR="${AERO_CONFIG_DIR:-${HOMEgfs}/parm/ufs/chem}" - export AERO_INPUTS_DIR="${AERO_INPUTS_DIR:-}" - export fscav_aero="${aero_conv_scav_factors:-${fscav_aero}}" - export dnats_aero="${aero_diag_tracers:-0}" -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/gfs/config.npoess b/parm/config/gfs/config.npoess new file mode 100644 index 0000000000..9a388d2e6b --- /dev/null +++ b/parm/config/gfs/config.npoess @@ -0,0 +1,11 @@ +#! /usr/bin/env bash + +########## config.npoess ########## +# GFS NPOESS step specific + +echo "BEGIN: config.npoess" + +# Get task specific resources +. "${EXPDIR}/config.resources" npoess + +echo "END: config.npoess" diff --git a/parm/config/gfs/config.resources b/parm/config/gfs/config.resources index 1139fdc9a7..4d975c6003 100644 --- a/parm/config/gfs/config.resources +++ b/parm/config/gfs/config.resources @@ -16,12 +16,12 @@ if [[ $# -ne 1 ]]; then echo "aeroanlinit aeroanlrun aeroanlfinal" echo "anal sfcanl analcalc analdiag fcst post echgres" echo "tracker genesis genesis_fsu" - echo "verfozn verfrad vminmon vrfy fit2obs metp arch cleanup" + echo "verfozn verfrad vminmon fit2obs metp arch cleanup" echo "eobs ediag eomg eupd ecen esfc efcs epos earc" echo "init_chem mom6ic ocnpost" echo "waveinit waveprep wavepostsbs wavepostbndpnt wavepostbndpntbll wavepostpnt" echo "wavegempak waveawipsbulls waveawipsgridded" - echo "postsnd awips gempak" + echo "postsnd awips gempak npoess" echo "ocnanalprep prepoceanobs ocnanalbmat ocnanalrun ocnanalchkpt ocnanalpost ocnanalvrfy" exit 1 @@ -774,16 +774,6 @@ elif [[ ${step} = "genesis_fsu" ]]; then export npe_node_genesis_fsu=1 export memory_genesis_fsu="4G" -elif [[ ${step} = "vrfy" ]]; then - - export wtime_vrfy="00:10:00" - export wtime_vrfy_gfs="00:10:00" - export npe_vrfy=1 - export nth_vrfy=1 - export npe_node_vrfy=1 - export npe_vrfy_gfs=1 - export npe_node_vrfy_gfs=1 - elif [[ "${step}" = "fit2obs" ]]; then export wtime_fit2obs="00:20:00" @@ -1023,6 +1013,14 @@ elif [[ ${step} = "awips" ]]; then export nth_awips=1 export memory_awips="3GB" +elif [[ ${step} = "npoess" ]]; then + + export wtime_npoess="03:30:00" + export npe_npoess=1 + export npe_node_npoess=1 + export nth_npoess=1 + export memory_npoess="3GB" + elif [[ ${step} = "gempak" ]]; then export wtime_gempak="03:00:00" diff --git a/parm/config/gfs/config.ufs b/parm/config/gfs/config.ufs index e499d90fdd..33264ba0aa 100644 --- a/parm/config/gfs/config.ufs +++ b/parm/config/gfs/config.ufs @@ -8,7 +8,7 @@ echo "BEGIN: config.ufs" -if [ $# -le 1 ]; then +if (( $# <= 1 )); then echo "Must specify an input resolution argument to set variables!" echo "argument can be any one of the following:" @@ -16,6 +16,7 @@ if [ $# -le 1 ]; then 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 "--gocart" exit 1 @@ -25,26 +26,34 @@ fi skip_mom6=true skip_cice6=true skip_ww3=true +skip_gocart=true skip_mediator=true # Loop through named arguments -while [[ $# -gt 0 ]]; do +while (( $# > 0 )); do key="$1" case "${key}" in "--fv3") fv3_res="$2" + shift ;; "--mom6") mom6_res="$2" skip_mom6=false + shift ;; "--cice6") cice6_res="$2" skip_cice6=false + shift ;; "--ww3") ww3_res="$2" skip_ww3=false + shift + ;; + "--gocart") + skip_gocart=false ;; *) # unknown option echo "FATAL ERROR: Unknown option: ${key}, ABORT!" @@ -52,7 +61,6 @@ while [[ $# -gt 0 ]]; do ;; esac shift - shift done # Mediator is required if any of the non-ATM components are used @@ -98,6 +106,10 @@ case "${machine}" in ;; esac ;; + *) + echo "FATAL ERROR: Unrecognized machine ${machine}" + exit 14 + ;; esac export npe_node_max @@ -113,7 +125,7 @@ case "${fv3_res}" in export nthreads_fv3_gfs=1 export cdmbgwd="0.071,2.1,1.0,1.0" # mountain blocking, ogwd, cgwd, cgwd src scaling export cdmbgwd_gsl="40.0,1.77,1.0,1.0" # settings for GSL drag suite - export knob_ugwp_tauamp=6.0e-3 # setting for UGWPv1 non-stationary GWD + export knob_ugwp_tauamp=6.0e-3 # setting for UGWPv1 non-stationary GWD export WRITE_GROUP=1 export WRTTASK_PER_GROUP_PER_THREAD_PER_TILE=1 export WRITE_GROUP_GFS=1 @@ -246,16 +258,35 @@ case ${fv3_res} in OUTPUT_FILETYPE_ATM="netcdf_parallel" OUTPUT_FILETYPE_SFC="netcdf_parallel" ;; + *) + echo "FATAL ERROR: Unrecognized FV3 resolution ${fv3_res}" + exit 15 + ;; esac export OUTPUT_FILETYPE_ATM OUTPUT_FILETYPE_SFC +# cpl defaults +export cpl=".false." +export cplflx=".false." +export cplice=".false." +export cplchm=".false." +export cplwav=".false." +export cplwav2atm=".false." +export CCPP_SUITE="FV3_GFS_v17_p8_ugwpv1" +model_list="atm" + # Mediator specific settings if [[ "${skip_mediator}" == "false" ]]; then + export cpl=".true." export nthreads_mediator=${nthreads_fv3} # Use same threads as FV3 + export CCPP_SUITE="FV3_GFS_v17_coupled_p8_ugwpv1" # TODO: Does this include FV3_GFS_v17_p8? Can this be used instead of FV3_GFS_v17_p8? fi # MOM6 specific settings if [[ "${skip_mom6}" == "false" ]]; then + source "${EXPDIR}/config.ocn" + export cplflx=".true." + model_list="${model_list}.ocean" nthreads_mom6=1 case "${mom6_res}" in "500") @@ -364,11 +395,15 @@ fi # CICE6 specific settings if [[ "${skip_cice6}" == "false" ]]; then + source "${EXPDIR}/config.ice" + export cplice=".true." + model_list="${model_list}.ice" # Ensure we sourced the MOM6 section if [[ "${skip_mom6}" == "true" ]]; then echo "FATAL ERROR: CICE6 cannot be configured without MOM6, ABORT!" exit 1 fi + nthreads_cice6=${nthreads_mom6} # CICE6 needs to run on same threads as MOM6 case "${cice6_res}" in "500") @@ -400,6 +435,10 @@ fi # WW3 specific settings if [[ "${skip_ww3}" == "false" ]]; then + source "${EXPDIR}/config.wave" + export cplwav=".true." + export cplwav2atm=".true." + model_list="${model_list}.wave" nthreads_ww3=2 case "${ww3_res}" in "gnh_10m;aoc_9km;gsh_15m") @@ -430,4 +469,47 @@ if [[ "${skip_ww3}" == "false" ]]; then export ntasks_ww3 nthreads_ww3 fi +# GOCART specific settings +if [[ "${skip_gocart}" == "false" ]]; then + source "${EXPDIR}/config.aero" + export cplchm=".true." + model_list="${model_list}.aero" +fi + +# Set the name of the UFS (previously nems) configure template to use +case "${model_list}" in + atm) + export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.atm.IN" + ;; + atm.aero) + export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.atm_aero.IN" + ;; + atm.wave) + export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.leapfrog_atm_wav.IN" + ;; + atm.ocean.ice) + export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld.IN" + ;; + atm.ocean.ice.aero) + export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld_aero.IN" + ;; + atm.ocean.ice.wave) + export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld_outerwave.IN" + ;; + atm.ocean.ice.wave.aero) + export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld_aero_outerwave.IN" + ;; + *) + echo "FATAL ERROR: Unable to determine appropriate UFS configure template for ${model_list}" + exit 16 + ;; +esac + +if [[ ! -r "${ufs_configure_template}" ]]; then + echo "FATAL ERROR: ${ufs_configure_template} either doesn't exist or is not readable." + exit 17 +fi + +unset model_list + echo "END: config.ufs" diff --git a/parm/config/gfs/config.vrfy b/parm/config/gfs/config.vrfy deleted file mode 100644 index 945d0ecfba..0000000000 --- a/parm/config/gfs/config.vrfy +++ /dev/null @@ -1,27 +0,0 @@ -#! /usr/bin/env bash - -########## config.vrfy ########## -# Verification step specific - -echo "BEGIN: config.vrfy" - -# Get task specific resources -. "${EXPDIR}/config.resources" vrfy - -export CDFNL="gdas" # Scores verification against GDAS/GFS analysis -export MKPGB4PRCP="YES" # Make 0.25-deg pgb files in ARCDIR for precip verification -export RUNMOS="NO" # whether to run entire MOS package - -if [[ "${RUNMOS}" == "YES" && "${RUN}" == "gfs" ]]; then - - if [[ "${machine}" = "HERA" ]] ; then - export RUNGFSMOSSH="${HOMEgfs}/scripts/run_gfsmos_master.sh.hera" - else - echo "WARNING: MOS package is not enabled on ${machine}!" - export RUNMOS="NO" - export RUNGFSMOSSH="" - fi -fi - - -echo "END: config.vrfy" diff --git a/parm/ufs/chem/AERO.rc b/parm/ufs/gocart/AERO.rc similarity index 100% rename from parm/ufs/chem/AERO.rc rename to parm/ufs/gocart/AERO.rc diff --git a/parm/ufs/chem/AERO_HISTORY.rc b/parm/ufs/gocart/AERO_HISTORY.rc similarity index 100% rename from parm/ufs/chem/AERO_HISTORY.rc rename to parm/ufs/gocart/AERO_HISTORY.rc diff --git a/parm/ufs/chem/AGCM.rc b/parm/ufs/gocart/AGCM.rc similarity index 100% rename from parm/ufs/chem/AGCM.rc rename to parm/ufs/gocart/AGCM.rc diff --git a/parm/ufs/chem/CA2G_instance_CA.bc.rc b/parm/ufs/gocart/CA2G_instance_CA.bc.rc similarity index 100% rename from parm/ufs/chem/CA2G_instance_CA.bc.rc rename to parm/ufs/gocart/CA2G_instance_CA.bc.rc diff --git a/parm/ufs/chem/CA2G_instance_CA.br.rc b/parm/ufs/gocart/CA2G_instance_CA.br.rc similarity index 100% rename from parm/ufs/chem/CA2G_instance_CA.br.rc rename to parm/ufs/gocart/CA2G_instance_CA.br.rc diff --git a/parm/ufs/chem/CA2G_instance_CA.oc.rc b/parm/ufs/gocart/CA2G_instance_CA.oc.rc similarity index 100% rename from parm/ufs/chem/CA2G_instance_CA.oc.rc rename to parm/ufs/gocart/CA2G_instance_CA.oc.rc diff --git a/parm/ufs/chem/CAP.rc b/parm/ufs/gocart/CAP.rc similarity index 100% rename from parm/ufs/chem/CAP.rc rename to parm/ufs/gocart/CAP.rc diff --git a/parm/ufs/chem/DU2G_instance_DU.rc b/parm/ufs/gocart/DU2G_instance_DU.rc similarity index 100% rename from parm/ufs/chem/DU2G_instance_DU.rc rename to parm/ufs/gocart/DU2G_instance_DU.rc diff --git a/parm/ufs/chem/ExtData.gbbepx b/parm/ufs/gocart/ExtData.gbbepx similarity index 100% rename from parm/ufs/chem/ExtData.gbbepx rename to parm/ufs/gocart/ExtData.gbbepx diff --git a/parm/ufs/chem/ExtData.none b/parm/ufs/gocart/ExtData.none similarity index 100% rename from parm/ufs/chem/ExtData.none rename to parm/ufs/gocart/ExtData.none diff --git a/parm/ufs/chem/ExtData.other b/parm/ufs/gocart/ExtData.other similarity index 100% rename from parm/ufs/chem/ExtData.other rename to parm/ufs/gocart/ExtData.other diff --git a/parm/ufs/chem/ExtData.qfed b/parm/ufs/gocart/ExtData.qfed similarity index 100% rename from parm/ufs/chem/ExtData.qfed rename to parm/ufs/gocart/ExtData.qfed diff --git a/parm/ufs/chem/GOCART2G_GridComp.rc b/parm/ufs/gocart/GOCART2G_GridComp.rc similarity index 100% rename from parm/ufs/chem/GOCART2G_GridComp.rc rename to parm/ufs/gocart/GOCART2G_GridComp.rc diff --git a/parm/ufs/chem/NI2G_instance_NI.rc b/parm/ufs/gocart/NI2G_instance_NI.rc similarity index 100% rename from parm/ufs/chem/NI2G_instance_NI.rc rename to parm/ufs/gocart/NI2G_instance_NI.rc diff --git a/parm/ufs/chem/SS2G_instance_SS.rc b/parm/ufs/gocart/SS2G_instance_SS.rc similarity index 100% rename from parm/ufs/chem/SS2G_instance_SS.rc rename to parm/ufs/gocart/SS2G_instance_SS.rc diff --git a/parm/ufs/chem/SU2G_instance_SU.rc b/parm/ufs/gocart/SU2G_instance_SU.rc similarity index 100% rename from parm/ufs/chem/SU2G_instance_SU.rc rename to parm/ufs/gocart/SU2G_instance_SU.rc diff --git a/parm/ufs/chem/gocart_tracer.list b/parm/ufs/gocart/gocart_tracer.list similarity index 100% rename from parm/ufs/chem/gocart_tracer.list rename to parm/ufs/gocart/gocart_tracer.list diff --git a/scripts/exglobal_diag.sh b/scripts/exglobal_diag.sh index 2322f8c93f..1f641c4fd7 100755 --- a/scripts/exglobal_diag.sh +++ b/scripts/exglobal_diag.sh @@ -184,9 +184,9 @@ EOFdiag if [ $count -gt 1 ]; then if [ $USE_CFP = "YES" ]; then echo "$nm $DATA/diag.sh $lrun_subdirs $binary_diag $type $loop $string $CDATE $DIAG_COMPRESS $DIAG_SUFFIX" | tee -a $DATA/mp_diag.sh - if [ ${CFP_MP:-"NO"} = "YES" ]; then - nm=$((nm+1)) - fi + if [ ${CFP_MP:-"NO"} = "YES" ]; then + nm=$((nm+1)) + fi else if [ $binary_diag = ".true." ]; then cat ${prefix}${type}_${loop}* > diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} @@ -199,7 +199,7 @@ EOFdiag elif [ $count -eq 1 ]; then cat ${prefix}${type}_${loop}* > diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} if [ $DIAG_COMPRESS = "YES" ]; then - $COMPRESS diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} + $COMPRESS diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} fi echo "diag_${type}_${string}.${CDATE}*" >> ${diaglist[n]} numfile[n]=$(expr ${numfile[n]} + 1) diff --git a/scripts/exglobal_forecast.sh b/scripts/exglobal_forecast.sh index 3cc96989eb..49dbaf12cf 100755 --- a/scripts/exglobal_forecast.sh +++ b/scripts/exglobal_forecast.sh @@ -80,16 +80,12 @@ source "${HOMEgfs}/ush/preamble.sh" # include all subroutines. Executions later. -source "${HOMEgfs}/ush/cplvalidate.sh" # validation of cpl* source "${HOMEgfs}/ush/forecast_predet.sh" # include functions for variable definition source "${HOMEgfs}/ush/forecast_det.sh" # include functions for run type determination source "${HOMEgfs}/ush/forecast_postdet.sh" # include functions for variables after run type determination source "${HOMEgfs}/ush/ufs_configure.sh" # include functions for ufs.configure processing source "${HOMEgfs}/ush/parsing_model_configure_FV3.sh" -# Compset string. For ufs.configure.* template selection. Default ATM only -confignamevarforufs=${confignamevarforufs:-'atm'} - # Coupling control switches, for coupling purpose, off by default cpl=${cpl:-.false.} cplflx=${cplflx:-.false.} # default off,import from outside source @@ -104,10 +100,6 @@ ICETIM=${DELTIM} CPL_SLOW=${CPL_SLOW:-${OCNTIM}} CPL_FAST=${CPL_FAST:-${ICETIM}} -echo "MAIN: Validating '${confignamevarforufs}' with cpl switches" -cplvalidate -echo "MAIN: '${confignamevarforufs}' validated, continue" - echo "MAIN: Loading common variables before determination of run type" common_predet diff --git a/ush/cplvalidate.sh b/ush/cplvalidate.sh deleted file mode 100755 index 4d72a305d0..0000000000 --- a/ush/cplvalidate.sh +++ /dev/null @@ -1,39 +0,0 @@ -#! /usr/bin/env bash - -##### -## This script validates $confignamevarforufs -## against cpl** switches to check consistency -## -## This is a child script of modular -## forecast script. This script is a direct execution -##### - -cplvalidate(){ -echo "SUB cplvalidate: validating cpl** switches for ${confignamevarforufs}" -return # TODO: Why are we returning right here? -case ${confignamevarforufs} in - 'atm') combination=.false..false..false..false..false.;; - 'datm') combination=.true..true..false..false..false.;; - 'atm_aero') combination=.true..false..false..false..true.;; - 'med_atm_ocn_ice') combination=.true..true..true..false..false.;; - 'cpld') combination=.true..true..true..false..false.;; - 'blocked_atm_wav') combination=.true..false..false..true..false.;; - 'leapfrog_atm_wav')combination=.true..false..false..true..false.;; - 'med_atm_ocn_ice_wav') combination=.true..true..true..true..false.;; - 'cpld_wave') combination=.true..true..true..true..false.;; - 'cpld_aero_wave') combination=.true..true..true..true..true.;; - 'medcold_atm_ocn_ice_wav') combination=.true..true..true..true..false.;; - 'med_atm_ocn_ice_wav1way') combination=.true..true..true..true..false.;; - 'med_atm_ocn_ice_wav1waywcurr') combination=.true..true..true..true..false.;; - 'medcold_atm_ocn_ice') combination=.true..true..true..false..false.;; - *) echo "SUB cplvalidate: Combination not supported" - exit 1 ;; -esac -control="${cpl}${cplflx}${cplice}${cplwav}${cplchm}" -if [[ "${control}" != "${combination}" ]]; then - echo "SUB cplvalidate: inconsistent cpl setting!" - exit 2 -else - echo "SUB cplvalidate: cpl settings validated!" -fi -} diff --git a/ush/hpssarch_gen.sh b/ush/hpssarch_gen.sh index 07f3c0c8bd..0a027c7537 100755 --- a/ush/hpssarch_gen.sh +++ b/ush/hpssarch_gen.sh @@ -361,7 +361,7 @@ if [[ ${type} == "gdas" ]]; then if [[ -s "${COM_ATMOS_ANALYSIS}/${head}radstat" ]]; then echo "${COM_ATMOS_ANALYSIS/${ROTDIR}\//}/${head}radstat" fi - for fstep in prep anal fcst vrfy verfozn verfrad vminmon; do + 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 diff --git a/ush/ufs_configure.sh b/ush/ufs_configure.sh index edf2ec9d2f..8898d11162 100755 --- a/ush/ufs_configure.sh +++ b/ush/ufs_configure.sh @@ -89,20 +89,19 @@ if [[ "${cplchm}" = ".true." ]]; then fi # Ensure the template exists -template="${HOMEgfs}/parm/ufs/ufs.configure.${confignamevarforufs}.IN" -if [[ ! -f ${template} ]]; then - echo "FATAL ERROR: template '${template}' does not exist, ABORT!" +if [[ ! -r "${ufs_configure_template}" ]]; then + echo "FATAL ERROR: template '${ufs_configure_template}' does not exist, ABORT!" exit 1 fi source "${HOMEgfs}/ush/atparse.bash" rm -f "${DATA}/ufs.configure" -atparse < "${template}" >> "${DATA}/ufs.configure" +atparse < "${ufs_configure_template}" >> "${DATA}/ufs.configure" echo "Rendered ufs.configure:" cat ufs.configure ${NCP} "${HOMEgfs}/sorc/ufs_model.fd/tests/parm/fd_ufs.yaml" fd_ufs.yaml -echo "SUB ${FUNCNAME[0]}: ufs.configure.sh ends for ${confignamevarforufs}" +echo "SUB ${FUNCNAME[0]}: ufs.configure.sh ends for ${ufs_configure_template}" } diff --git a/workflow/applications/applications.py b/workflow/applications/applications.py index e517783291..2a7b8d249f 100644 --- a/workflow/applications/applications.py +++ b/workflow/applications/applications.py @@ -55,7 +55,6 @@ def __init__(self, conf: Configuration) -> None: self.do_gempak = _base.get('DO_GEMPAK', False) self.do_awips = _base.get('DO_AWIPS', False) self.do_wafs = _base.get('WAFSF', False) - self.do_vrfy = _base.get('DO_VRFY', True) self.do_verfozn = _base.get('DO_VERFOZN', True) self.do_verfrad = _base.get('DO_VERFRAD', True) self.do_vminmon = _base.get('DO_VMINMON', True) @@ -63,6 +62,7 @@ def __init__(self, conf: Configuration) -> None: self.do_genesis = _base.get('DO_GENESIS', True) self.do_genesis_fsu = _base.get('DO_GENESIS_FSU', False) self.do_metp = _base.get('DO_METP', False) + self.do_npoess = _base.get('DO_NPOESS', False) self.do_hpssarch = _base.get('HPSSARCH', False) diff --git a/workflow/applications/gfs_cycled.py b/workflow/applications/gfs_cycled.py index 3dc199c5ec..2438a8244e 100644 --- a/workflow/applications/gfs_cycled.py +++ b/workflow/applications/gfs_cycled.py @@ -47,7 +47,7 @@ def _get_app_configs(self): if self.do_ocean: configs += ['ocnpost'] - configs += ['sfcanl', 'analcalc', 'fcst', 'post', 'vrfy', 'arch', 'cleanup'] + configs += ['sfcanl', 'analcalc', 'fcst', 'post', 'arch', 'cleanup'] if self.do_hybvar: if self.do_jediatmens: @@ -89,6 +89,9 @@ def _get_app_configs(self): if self.do_awips: configs += ['awips'] + if self.do_npoess: + configs += ['npoess'] + if self.do_wave: configs += ['waveinit', 'waveprep', 'wavepostsbs', 'wavepostpnt'] if self.do_wave_bnd: @@ -125,7 +128,6 @@ def get_task_names(self): gdas_gfs_common_tasks_after_fcst = ['postanl', 'post'] # if self.do_ocean: # TODO: uncomment when ocnpost is fixed in cycled mode # gdas_gfs_common_tasks_after_fcst += ['ocnpost'] - gdas_gfs_common_tasks_after_fcst += ['vrfy'] gdas_gfs_common_cleanup_tasks = ['arch', 'cleanup'] @@ -233,6 +235,10 @@ def get_task_names(self): if self.do_awips: gfs_tasks += ['awips'] + gfs_tasks += ['fbwinds'] + + if self.do_npoess: + gfs_tasks += ['npoess'] if self.do_wafs: gfs_tasks += ['wafs', 'wafsgcip', 'wafsgrib2', 'wafsgrib20p25', 'wafsblending', 'wafsblending0p25'] diff --git a/workflow/applications/gfs_forecast_only.py b/workflow/applications/gfs_forecast_only.py index a130baf6e9..01d31b08ca 100644 --- a/workflow/applications/gfs_forecast_only.py +++ b/workflow/applications/gfs_forecast_only.py @@ -18,7 +18,7 @@ def _get_app_configs(self): configs = ['stage_ic', 'fcst', 'arch', 'cleanup'] if self.do_atm: - configs += ['post', 'vrfy'] + configs += ['post'] if self.do_aero: configs += ['aerosol_init'] @@ -91,9 +91,6 @@ def get_task_names(self): if self.do_ocean: tasks += ['ocnpost'] - if self.do_atm: - tasks += ['vrfy'] - if self.do_atm and self.do_tracker: tasks += ['tracker'] @@ -123,6 +120,7 @@ def get_task_names(self): if self.do_awips: tasks += ['awips'] + tasks += ['fbwinds'] if self.do_wafs: tasks += ['wafs', 'wafsgcip', 'wafsgrib2', 'wafsgrib20p25', 'wafsblending', 'wafsblending0p25'] diff --git a/workflow/rocoto/gfs_tasks.py b/workflow/rocoto/gfs_tasks.py index cde0c96771..a842b4704b 100644 --- a/workflow/rocoto/gfs_tasks.py +++ b/workflow/rocoto/gfs_tasks.py @@ -796,6 +796,32 @@ def postsnd(self): return task + def fbwinds(self): + + atmos_prod_path = self._template_to_rocoto_cycstring(self._base["COM_ATMOS_GRIB_GRID_TMPL"], {'RUN': self.cdump, 'GRID': '0p25'}) + deps = [] + data = f'{atmos_prod_path}/{self.cdump}.t@Hz.pgrb2.0p25.f006' + dep_dict = {'type': 'data', 'data': data, 'age': 120} + deps.append(rocoto.add_dependency(dep_dict)) + data = f'{atmos_prod_path}/{self.cdump}.t@Hz.pgrb2.0p25.f012' + dep_dict = {'type': 'data', 'data': data, 'age': 120} + deps.append(rocoto.add_dependency(dep_dict)) + data = f'{atmos_prod_path}/{self.cdump}.t@Hz.pgrb2.0p25.f024' + dep_dict = {'type': 'data', 'data': data, 'age': 120} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep=deps, dep_condition='and') + + resources = self.get_resource('awips') + + # TODO: It would be better to use task dependencies on the + # individual post jobs rather than data dependencies to avoid + # prematurely starting with partial files. Unfortunately, the + # ability to "group" post would make this more convoluted than + # it should be and not worth the complexity. + task = create_wf_task('fbwinds', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies) + + return task + def awips(self): def _get_awipsgroups(cdump, config): @@ -868,6 +894,18 @@ def gempak(self): return task + def npoess(self): + + deps = [] + dep_dict = {'type': 'task', 'name': f'{self.cdump}postanl'} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep=deps) + + resources = self.get_resource('npoess') + task = create_wf_task('npoess', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies) + + return task + def verfozn(self): deps = [] dep_dict = {'type': 'task', 'name': f'{self.cdump}analdiag'} @@ -934,20 +972,6 @@ def genesis_fsu(self): return task - def vrfy(self): - deps = [] - dep_dict = {'type': 'metatask', 'name': f'{self.cdump}post'} - deps.append(rocoto.add_dependency(dep_dict)) - dependencies = rocoto.create_dependency(dep=deps) - - cycledef = 'gdas_half,gdas' if self.cdump in ['gdas'] else self.cdump - - resources = self.get_resource('vrfy') - task = create_wf_task('vrfy', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies, - cycledef=cycledef) - - return task - def fit2obs(self): deps = [] dep_dict = {'type': 'metatask', 'name': f'{self.cdump}post'} @@ -1022,9 +1046,6 @@ def arch(self): if self.cdump in ['gfs'] and self.app_config.do_genesis_fsu: dep_dict = {'type': 'task', 'name': f'{self.cdump}genesis_fsu'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_vrfy: - dep_dict = {'type': 'task', 'name': f'{self.cdump}vrfy'} - deps.append(rocoto.add_dependency(dep_dict)) # Post job dependencies dep_dict = {'type': 'metatask', 'name': f'{self.cdump}post'} deps.append(rocoto.add_dependency(dep_dict)) diff --git a/workflow/rocoto/rocoto.py b/workflow/rocoto/rocoto.py index b3f88f01d3..153ff71475 100644 --- a/workflow/rocoto/rocoto.py +++ b/workflow/rocoto/rocoto.py @@ -193,6 +193,7 @@ def _add_data_tag(dep_dict: Dict[str, Any]) -> str: dep_type = dep_dict.get('type', None) dep_data = dep_dict.get('data', None) dep_offset = dep_dict.get('offset', None) + dep_age = dep_dict.get('age', None) if dep_data is None: msg = f'a data value is necessary for {dep_type} dependency' @@ -206,7 +207,10 @@ def _add_data_tag(dep_dict: Dict[str, Any]) -> str: assert len(dep_data) == len(dep_offset) - strings = [''] + if dep_age is None: + strings = [''] + else: + strings = [f''] for data, offset in zip(dep_data, dep_offset): if '@' in data: offset_str = '' if offset in [None, ''] else f' offset="{offset}"' diff --git a/workflow/rocoto/tasks.py b/workflow/rocoto/tasks.py index fd66ee2031..dea351ac12 100644 --- a/workflow/rocoto/tasks.py +++ b/workflow/rocoto/tasks.py @@ -20,11 +20,12 @@ class Tasks: 'aeroanlinit', 'aeroanlrun', 'aeroanlfinal', 'preplandobs', 'landanl', 'fcst', 'post', 'ocnpost', - 'verfozn', 'verfrad', 'vminmon', 'vrfy', 'metp', + 'verfozn', 'verfrad', 'vminmon', 'metp', 'tracker', 'genesis', 'genesis_fsu', - 'postsnd', 'awips', 'gempak', + 'postsnd', 'awips', 'fbwinds', 'gempak', 'waveawipsbulls', 'waveawipsgridded', 'wavegempak', 'waveinit', - 'wavepostbndpnt', 'wavepostbndpntbll', 'wavepostpnt', 'wavepostsbs', 'waveprep'] + 'wavepostbndpnt', 'wavepostbndpntbll', 'wavepostpnt', 'wavepostsbs', 'waveprep', + 'npoess'] def __init__(self, app_config: AppConfig, cdump: str) -> None: