diff --git a/.gitignore b/.gitignore
index 047313a32f..c9e384aae0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,7 +36,6 @@ fix/gsi
fix/lut
fix/mom6
fix/orog
-fix/reg2grb2
fix/sfc_climo
fix/ugwd
fix/verif
@@ -44,18 +43,28 @@ fix/wave
# Ignore parm file symlinks
#--------------------------
-parm/config/config.base
-parm/gldas
+parm/gdas/aero
+parm/gdas/atm
+parm/gdas/io
+parm/gdas/ioda
+parm/gdas/snow
+parm/gdas/soca
parm/monitor
parm/post/AEROSOL_LUTS.dat
parm/post/nam_micro_lookup.dat
parm/post/optics_luts_DUST.dat
parm/post/gtg.config.gfs
parm/post/gtg_imprintings.txt
+parm/post/optics_luts_DUST_nasa.dat
+parm/post/optics_luts_NITR_nasa.dat
parm/post/optics_luts_SALT.dat
+parm/post/optics_luts_SALT_nasa.dat
parm/post/optics_luts_SOOT.dat
+parm/post/optics_luts_SOOT_nasa.dat
parm/post/optics_luts_SUSO.dat
+parm/post/optics_luts_SUSO_nasa.dat
parm/post/optics_luts_WASO.dat
+parm/post/optics_luts_WASO_nasa.dat
parm/post/params_grib2_tbl_new
parm/post/post_tag_gfs128
parm/post/post_tag_gfs65
@@ -77,6 +86,9 @@ parm/post/postcntrl_gfs_wafs.xml
parm/post/postcntrl_gfs_wafs_anl.xml
parm/post/postxconfig-NT-GEFS-ANL.txt
parm/post/postxconfig-NT-GEFS-F00.txt
+parm/post/postxconfig-NT-GEFS-F00-aerosol.txt
+parm/post/postxconfig-NT-GEFS-WAFS.txt
+parm/post/postxconfig-NT-GEFS-aerosol.txt
parm/post/postxconfig-NT-GEFS.txt
parm/post/postxconfig-NT-GFS-ANL.txt
parm/post/postxconfig-NT-GFS-F00-TWO.txt
@@ -90,7 +102,15 @@ parm/post/postxconfig-NT-GFS-WAFS.txt
parm/post/postxconfig-NT-GFS.txt
parm/post/postxconfig-NT-gefs-aerosol.txt
parm/post/postxconfig-NT-gefs-chem.txt
+parm/post/ocean.csv
+parm/post/ice.csv
+parm/post/ocnicepost.nml.jinja2
parm/ufs/noahmptable.tbl
+parm/ufs/model_configure.IN
+parm/ufs/MOM_input_*.IN
+parm/ufs/MOM6_data_table.IN
+parm/ufs/ice_in.IN
+parm/ufs/ufs.configure.*.IN
parm/wafs
# Ignore sorc and logs folders from externals
@@ -123,7 +143,6 @@ sorc/radmon_bcor.fd
sorc/radmon_time.fd
sorc/rdbfmsua.fd
sorc/recentersigp.fd
-sorc/reg2grb2.fd
sorc/supvit.fd
sorc/syndat_getjtbul.fd
sorc/syndat_maksynrc.fd
@@ -133,6 +152,7 @@ sorc/tocsbufr.fd
sorc/upp.fd
sorc/vint.fd
sorc/webtitle.fd
+sorc/ocnicepost.fd
# Ignore scripts from externals
#------------------------------
diff --git a/.gitmodules b/.gitmodules
index ed2f92d45c..f96873bde1 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,28 +1,28 @@
[submodule "sorc/ufs_model.fd"]
- path = sorc/ufs_model.fd
- url = https://github.com/NOAA-GSL/ufs-weather-model
- ignore = dirty
+ path = sorc/ufs_model.fd
+ url = https://github.com/NOAA-GSL/ufs-weather-model
+ ignore = dirty
[submodule "sorc/wxflow"]
- path = sorc/wxflow
- url = https://github.com/NOAA-EMC/wxflow
+ path = sorc/wxflow
+ url = https://github.com/NOAA-EMC/wxflow
[submodule "sorc/gfs_utils.fd"]
- path = sorc/gfs_utils.fd
- url = https://github.com/NOAA-EMC/gfs-utils
+ path = sorc/gfs_utils.fd
+ url = https://github.com/NOAA-EMC/gfs-utils
[submodule "sorc/ufs_utils.fd"]
- path = sorc/ufs_utils.fd
- url = https://github.com/NOAA-GSL/UFS_UTILS.git
+ path = sorc/ufs_utils.fd
+ url = https://github.com/NOAA-GSL/UFS_UTILS.git
[submodule "sorc/verif-global.fd"]
- path = sorc/verif-global.fd
- url = https://github.com/NOAA-EMC/EMC_verif-global.git
+ path = sorc/verif-global.fd
+ url = https://github.com/NOAA-EMC/EMC_verif-global.git
[submodule "sorc/gsi_enkf.fd"]
- path = sorc/gsi_enkf.fd
- url = https://github.com/NOAA-EMC/GSI.git
+ path = sorc/gsi_enkf.fd
+ url = https://github.com/NOAA-EMC/GSI.git
[submodule "sorc/gdas.cd"]
- path = sorc/gdas.cd
- url = https://github.com/NOAA-EMC/GDASApp.git
+ path = sorc/gdas.cd
+ url = https://github.com/NOAA-EMC/GDASApp.git
[submodule "sorc/gsi_utils.fd"]
- path = sorc/gsi_utils.fd
- url = https://github.com/NOAA-EMC/GSI-Utils.git
+ path = sorc/gsi_utils.fd
+ url = https://github.com/NOAA-EMC/GSI-Utils.git
[submodule "sorc/gsi_monitor.fd"]
- path = sorc/gsi_monitor.fd
- url = https://github.com/NOAA-EMC/GSI-Monitor.git
+ path = sorc/gsi_monitor.fd
+ url = https://github.com/NOAA-EMC/GSI-Monitor.git
diff --git a/INFO b/INFO
index e8c5e74d92..e24a69fdc3 100644
--- a/INFO
+++ b/INFO
@@ -1,3 +1,12 @@
+03-12-24
+========
+ 04Mar24 global-workflow
+ UFS: 21Feb24, 6988662
+ FV3: 14Feb24, 0fe9ba3
+ UPP: 23Jan23, 945cb2c
+ UFS_UTILS: 22Feb24, d805336
+
+
03-12-24
========
12Jan24 global-workflow
diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile
new file mode 100644
index 0000000000..34535ed608
--- /dev/null
+++ b/ci/Jenkinsfile
@@ -0,0 +1,221 @@
+def Machine = 'none'
+def machine = 'none'
+def HOME = 'none'
+def caseList = ''
+def custom_workspace = [hera: '/scratch1/NCEPDEV/global/CI', orion: '/work2/noaa/stmp/CI/ORION', hercules: '/work2/noaa/stmp/CI/HERCULES']
+
+pipeline {
+ agent { label 'built-in' }
+
+ options {
+ skipDefaultCheckout()
+ parallelsAlwaysFailFast()
+ }
+
+ stages { // This initial stage is used to get the Machine name from the GitHub labels on the PR
+ // which is used to designate the Nodes in the Jenkins Controler by the agent label
+ // Each Jenknis Node is connected to said machine via an JAVA agent via an ssh tunnel
+
+ stage('Get Machine') {
+ agent { label 'built-in' }
+ steps {
+ script {
+ machine = 'none'
+ for (label in pullRequest.labels) {
+ echo "Label: ${label}"
+ if ((label.matches('CI-Hera-Ready'))) {
+ machine = 'hera'
+ } else if ((label.matches('CI-Orion-Ready'))) {
+ machine = 'orion'
+ } else if ((label.matches('CI-Hercules-Ready'))) {
+ machine = 'hercules'
+ }
+ } // createing a second machine varible with first letter capital
+ // because the first letter of the machine name is captitalized in the GitHub labels
+ Machine = machine[0].toUpperCase() + machine.substring(1)
+ }
+ }
+ }
+
+ stage('Get Common Workspace') {
+ agent { label "${machine}-emc" }
+ steps {
+ script {
+ 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']])])
+ HOME = "${WORKSPACE}"
+ sh(script: "mkdir -p ${HOME}/RUNTESTS;rm -Rf ${HOME}/RUNTESTS/error.logs")
+ pullRequest.addLabel("CI-${Machine}-Building")
+ if (pullRequest.labels.any { value -> value.matches("CI-${Machine}-Ready") }) {
+ pullRequest.removeLabel("CI-${Machine}-Ready")
+ }
+ }
+ echo "Building and running on ${Machine} in directory ${HOME}"
+ }
+ }
+ }
+
+ stage('Build System') {
+ matrix {
+ agent { label "${machine}-emc" }
+ //options {
+ // throttle(['global_matrix_build'])
+ //}
+ axes {
+ axis {
+ name 'system'
+ values 'gfs', 'gefs'
+ }
+ }
+ stages {
+ stage('build system') {
+ steps {
+ script {
+ def HOMEgfs = "${HOME}/${system}" // local HOMEgfs is used to build the system on per system basis under the common workspace HOME
+ sh(script: "mkdir -p ${HOMEgfs}")
+ ws(HOMEgfs) {
+ if (fileExists("${HOMEgfs}/sorc/BUILT_semaphor")) { // if the system is already built, skip the build in the case of re-runs
+ sh(script: "cat ${HOMEgfs}/sorc/BUILT_semaphor", returnStdout: true).trim() // TODO: and user configurable control to manage build semphore
+ checkout scm
+ dir('sorc') {
+ sh(script: './link_workflow.sh')
+ }
+ } else {
+ checkout scm
+ def builds_file = readYaml file: 'ci/cases/yamls/build.yaml'
+ def build_args_list = builds_file['builds']
+ def build_args = build_args_list[system].join(' ').trim().replaceAll('null', '')
+ dir("${HOMEgfs}/sorc") {
+ sh(script: "${build_args}")
+ sh(script: './link_workflow.sh')
+ sh(script: "echo ${HOMEgfs} > BUILT_semaphor")
+ }
+ }
+ if (env.CHANGE_ID && system == 'gfs') {
+ try {
+ if (pullRequest.labels.any { value -> value.matches("CI-${Machine}-Building") }) {
+ pullRequest.removeLabel("CI-${Machine}-Building")
+ }
+ pullRequest.addLabel("CI-${Machine}-Running")
+ } catch (Exception e) {
+ echo "Failed to update label from Buildng to Running: ${e.getMessage()}"
+ }
+ }
+ if (system == 'gfs') {
+ caseList = sh(script: "${HOMEgfs}/ci/scripts/utils/get_host_case_list.py ${machine}", returnStdout: true).trim().split()
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ stage('Run Tests') {
+ matrix {
+ agent { label "${machine}-emc" }
+ axes {
+ axis {
+ name 'Case'
+ // TODO add dynamic list of cases from env vars (needs addtional plugins)
+ values 'C48C48_ufs_hybatmDA', 'C48_ATM', 'C48_S2SW', 'C48_S2SWA_gefs', 'C48mx500_3DVarAOWCDA', 'C96C48_hybatmDA', 'C96_atm3DVar', 'C96_atmsnowDA'
+ }
+ }
+ stages {
+
+ stage('Create Experiments') {
+ when {
+ expression { return caseList.contains(Case) }
+ }
+ steps {
+ script {
+ sh(script: "sed -n '/{.*}/!p' ${HOME}/gfs/ci/cases/pr/${Case}.yaml > ${HOME}/gfs/ci/cases/pr/${Case}.yaml.tmp")
+ def yaml_case = readYaml file: "${HOME}/gfs/ci/cases/pr/${Case}.yaml.tmp"
+ system = yaml_case.experiment.system
+ def HOMEgfs = "${HOME}/${system}" // local HOMEgfs is used to populate the XML on per system basis
+ env.RUNTESTS = "${HOME}/RUNTESTS"
+ sh(script: "${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.sh create_experiment ${HOMEgfs}/ci/cases/pr/${Case}.yaml")
+ }
+ }
+ }
+
+ stage('Run Experiments') {
+ when {
+ expression { return caseList.contains(Case) }
+ }
+ steps {
+ script {
+ HOMEgfs = "${HOME}/gfs" // common HOMEgfs is used to launch the scripts that run the experiments
+ ws(HOMEgfs) {
+ pslot = sh(script: "${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot ${HOME}/RUNTESTS ${Case}", returnStdout: true).trim()
+ try {
+ sh(script: "${HOMEgfs}/ci/scripts/run-check_ci.sh ${HOME} ${pslot}")
+ } catch (Exception e) {
+ sh(script: "${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.sh cancel_all_batch_jobs ${HOME}/RUNTESTS")
+ ws(HOME) {
+ if (fileExists('RUNTESTS/error.logs')) {
+ def fileContent = readFile 'RUNTESTS/error.logs'
+ def lines = fileContent.readLines()
+ for (line in lines) {
+ echo "archiving: ${line}"
+ archiveArtifacts artifacts: "${line}", fingerprint: true
+ }
+ }
+ }
+ error("Failed to run experiments ${Case} on ${Machine}")
+ }
+ }
+ }
+ }
+ }
+
+ }
+ }
+ }
+ }
+
+ post {
+ always {
+ script {
+ if(env.CHANGE_ID) {
+ try {
+ for (label in pullRequest.labels) {
+ if (label.contains("${Machine}")) {
+ pullRequest.removeLabel(label)
+ }
+ }
+ } catch (Exception e) {
+ echo "Failed to remove labels: ${e.getMessage()}"
+ }
+ }
+ }
+ }
+ success {
+ script {
+ if(env.CHANGE_ID) {
+ try {
+ pullRequest.addLabel("CI-${Machine}-Passed")
+ def timestamp = new Date().format('MM dd HH:mm:ss', TimeZone.getTimeZone('America/New_York'))
+ pullRequest.comment("**CI SUCCESS** ${Machine} at ${timestamp}\n\nBuilt and ran in directory `${HOME}`")
+ } catch (Exception e) {
+ echo "Failed to add success label or comment: ${e.getMessage()}"
+ }
+ }
+ }
+ }
+ failure {
+ script {
+ if(env.CHANGE_ID) {
+ try {
+ pullRequest.addLabel("CI-${Machine}-Failed")
+ def timestamp = new Date().format('MM dd HH:mm:ss', TimeZone.getTimeZone('America/New_York'))
+ pullRequest.comment("**CI FAILED** ${Machine} at ${timestamp}
Built and ran in directory `${HOME}`")
+ } catch (Exception e) {
+ echo "Failed to add failure label or comment: ${e.getMessage()}"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/ci/cases/pr/C48C48_ufs_hybatmDA.yaml b/ci/cases/pr/C48C48_ufs_hybatmDA.yaml
new file mode 100644
index 0000000000..7d3644b1af
--- /dev/null
+++ b/ci/cases/pr/C48C48_ufs_hybatmDA.yaml
@@ -0,0 +1,22 @@
+experiment:
+ system: gfs
+ mode: cycled
+
+arguments:
+ pslot: {{ 'pslot' | getenv }}
+ app: ATM
+ resdetatmos: 48
+ resensatmos: 48
+ comroot: {{ 'RUNTESTS' | getenv }}/COMROOT
+ expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR
+ idate: 2021032312
+ edate: 2021032400
+ nens: 2
+ gfs_cyc: 1
+ start: warm
+ yaml: {{ HOMEgfs }}/ci/cases/yamls/ufs_hybatmDA_defaults.ci.yaml
+
+skip_ci_on_hosts:
+ - hera
+ - orion
+ - hercules
diff --git a/ci/cases/pr/C48_ATM.yaml b/ci/cases/pr/C48_ATM.yaml
index 39412e8aeb..79706556e6 100644
--- a/ci/cases/pr/C48_ATM.yaml
+++ b/ci/cases/pr/C48_ATM.yaml
@@ -10,4 +10,4 @@ arguments:
expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR
idate: 2021032312
edate: 2021032312
- yaml: {{ HOMEgfs }}/ci/platforms/gfs_defaults_ci.yaml
+ yaml: {{ HOMEgfs }}/ci/cases/yamls/gfs_defaults_ci.yaml
diff --git a/ci/cases/pr/C48_S2SW.yaml b/ci/cases/pr/C48_S2SW.yaml
index 2aba42f562..6367564514 100644
--- a/ci/cases/pr/C48_S2SW.yaml
+++ b/ci/cases/pr/C48_S2SW.yaml
@@ -11,4 +11,4 @@ arguments:
expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR
idate: 2021032312
edate: 2021032312
- yaml: {{ HOMEgfs }}/ci/platforms/gfs_defaults_ci.yaml
+ yaml: {{ HOMEgfs }}/ci/cases/yamls/gfs_defaults_ci.yaml
diff --git a/ci/cases/pr/C48_S2SWA_gefs.yaml b/ci/cases/pr/C48_S2SWA_gefs.yaml
index d68360bf44..d42f4cd15b 100644
--- a/ci/cases/pr/C48_S2SWA_gefs.yaml
+++ b/ci/cases/pr/C48_S2SWA_gefs.yaml
@@ -15,4 +15,4 @@ arguments:
expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR
idate: 2021032312
edate: 2021032312
- yaml: {{ HOMEgfs }}/ci/platforms/gefs_ci_defaults.yaml
+ yaml: {{ HOMEgfs }}/ci/cases/yamls/gefs_ci_defaults.yaml
diff --git a/ci/cases/pr/C48mx500_3DVarAOWCDA.yaml b/ci/cases/pr/C48mx500_3DVarAOWCDA.yaml
new file mode 100644
index 0000000000..d9156e38f3
--- /dev/null
+++ b/ci/cases/pr/C48mx500_3DVarAOWCDA.yaml
@@ -0,0 +1,23 @@
+experiment:
+ system: gfs
+ mode: cycled
+
+arguments:
+ pslot: {{ 'pslot' | getenv }}
+ app: S2S
+ resdetatmos: 48
+ resdetocean: 5.0
+ comroot: {{ 'RUNTESTS' | getenv }}/COMROOT
+ expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR
+ icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C48mx500
+ idate: 2021032412
+ edate: 2021032418
+ nens: 0
+ gfs_cyc: 0
+ start: warm
+ yaml: {{ HOMEgfs }}/ci/cases/yamls/soca_gfs_defaults_ci.yaml
+
+skip_ci_on_hosts:
+ - orion
+ - hera
+ - hercules
diff --git a/ci/cases/pr/C96C48_hybatmDA.yaml b/ci/cases/pr/C96C48_hybatmDA.yaml
index be35283cff..d08374d4e0 100644
--- a/ci/cases/pr/C96C48_hybatmDA.yaml
+++ b/ci/cases/pr/C96C48_hybatmDA.yaml
@@ -16,4 +16,4 @@ arguments:
nens: 2
gfs_cyc: 1
start: cold
- yaml: {{ HOMEgfs }}/ci/platforms/gfs_defaults_ci.yaml
+ yaml: {{ HOMEgfs }}/ci/cases/yamls/gfs_defaults_ci.yaml
diff --git a/ci/cases/pr/C96_atm3DVar.yaml b/ci/cases/pr/C96_atm3DVar.yaml
index dee1525d80..d992938f7f 100644
--- a/ci/cases/pr/C96_atm3DVar.yaml
+++ b/ci/cases/pr/C96_atm3DVar.yaml
@@ -14,4 +14,4 @@ arguments:
nens: 0
gfs_cyc: 1
start: cold
- yaml: {{ HOMEgfs }}/ci/platforms/gfs_defaults_ci.yaml
+ yaml: {{ HOMEgfs }}/ci/cases/yamls/gfs_defaults_ci.yaml
diff --git a/ci/cases/pr/C96_atmsnowDA.yaml b/ci/cases/pr/C96_atmsnowDA.yaml
new file mode 100644
index 0000000000..35fcc10fb2
--- /dev/null
+++ b/ci/cases/pr/C96_atmsnowDA.yaml
@@ -0,0 +1,21 @@
+experiment:
+ system: gfs
+ mode: cycled
+
+arguments:
+ pslot: {{ 'pslot' | getenv }}
+ app: ATM
+ resdetatmos: 96
+ comroot: {{ 'RUNTESTS' | getenv }}/COMROOT
+ expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR
+ icsdir: {{ 'ICSDIR_ROOT' | getenv }}/C96C48
+ idate: 2021122012
+ edate: 2021122100
+ nens: 0
+ gfs_cyc: 1
+ start: cold
+ yaml: {{ HOMEgfs }}/ci/cases/yamls/atmsnowDA_defaults_ci.yaml
+
+skip_ci_on_hosts:
+ - orion
+ - hercules
diff --git a/ci/cases/weekly/C384C192_hybatmda.yaml b/ci/cases/weekly/C384C192_hybatmda.yaml
index a4eae7d9a1..131ada95d5 100644
--- a/ci/cases/weekly/C384C192_hybatmda.yaml
+++ b/ci/cases/weekly/C384C192_hybatmda.yaml
@@ -16,4 +16,4 @@ arguments:
nens: 2
gfs_cyc: 1
start: cold
- yaml: {{ HOMEgfs }}/ci/platforms/gfs_defaults_ci.yaml
+ yaml: {{ HOMEgfs }}/ci/cases/yamls/gfs_defaults_ci.yaml
diff --git a/ci/cases/weekly/C384_S2SWA.yaml b/ci/cases/weekly/C384_S2SWA.yaml
index 8e2c043a4c..7bbdc44671 100644
--- a/ci/cases/weekly/C384_S2SWA.yaml
+++ b/ci/cases/weekly/C384_S2SWA.yaml
@@ -6,9 +6,9 @@ arguments:
pslot: {{ 'pslot' | getenv }}
app: S2SWA
resdetatmos: 384
- resdetocean: 0.5
+ resdetocean: 0.25
comroot: {{ 'RUNTESTS' | getenv }}/COMROOT
expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR
idate: 2016070100
edate: 2016070100
- yaml: {{ HOMEgfs }}/ci/platforms/gfs_defaults_ci.yaml
+ yaml: {{ HOMEgfs }}/ci/cases/yamls/gfs_defaults_ci.yaml
diff --git a/ci/cases/weekly/C384_atm3DVar.yaml b/ci/cases/weekly/C384_atm3DVar.yaml
index 479d731b25..40487f3b47 100644
--- a/ci/cases/weekly/C384_atm3DVar.yaml
+++ b/ci/cases/weekly/C384_atm3DVar.yaml
@@ -16,4 +16,4 @@ arguments:
nens: 0
gfs_cyc: 1
start: cold
- yaml: {{ HOMEgfs }}/ci/platforms/gfs_defaults_ci.yaml
+ yaml: {{ HOMEgfs }}/ci/cases/yamls/gfs_defaults_ci.yaml
diff --git a/ci/cases/yamls/atmsnowDA_defaults_ci.yaml b/ci/cases/yamls/atmsnowDA_defaults_ci.yaml
new file mode 100644
index 0000000000..417525742e
--- /dev/null
+++ b/ci/cases/yamls/atmsnowDA_defaults_ci.yaml
@@ -0,0 +1,6 @@
+defaults:
+ !INC {{ HOMEgfs }}/parm/config/gfs/yaml/defaults.yaml
+base:
+ DOIAU: "NO"
+ DO_JEDISNOWDA: "YES"
+ ACCOUNT: {{ 'SLURM_ACCOUNT' | getenv }}
diff --git a/ci/cases/yamls/build.yaml b/ci/cases/yamls/build.yaml
new file mode 100644
index 0000000000..2ff008d372
--- /dev/null
+++ b/ci/cases/yamls/build.yaml
@@ -0,0 +1,3 @@
+builds:
+ - gefs: './build_all.sh'
+ - gfs: './build_all.sh -wgu'
diff --git a/ci/platforms/gefs_ci_defaults.yaml b/ci/cases/yamls/gefs_ci_defaults.yaml
similarity index 100%
rename from ci/platforms/gefs_ci_defaults.yaml
rename to ci/cases/yamls/gefs_ci_defaults.yaml
diff --git a/ci/platforms/gfs_defaults_ci.yaml b/ci/cases/yamls/gfs_defaults_ci.yaml
similarity index 100%
rename from ci/platforms/gfs_defaults_ci.yaml
rename to ci/cases/yamls/gfs_defaults_ci.yaml
diff --git a/ci/cases/yamls/soca_gfs_defaults_ci.yaml b/ci/cases/yamls/soca_gfs_defaults_ci.yaml
new file mode 100644
index 0000000000..126637cd86
--- /dev/null
+++ b/ci/cases/yamls/soca_gfs_defaults_ci.yaml
@@ -0,0 +1,5 @@
+defaults:
+ !INC {{ HOMEgfs }}/parm/config/gfs/yaml/defaults.yaml
+base:
+ ACCOUNT: {{ 'SLURM_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
new file mode 100644
index 0000000000..126c0f461a
--- /dev/null
+++ b/ci/cases/yamls/ufs_hybatmDA_defaults.ci.yaml
@@ -0,0 +1,20 @@
+defaults:
+ !INC {{ HOMEgfs }}/parm/config/gfs/yaml/defaults.yaml
+base:
+ DOIAU: "NO"
+ DO_JEDIATMVAR: "YES"
+ DO_JEDIATMENS: "YES"
+ ACCOUNT: {{ 'SLURM_ACCOUNT' | getenv }}
+atmanl:
+ LAYOUT_X_ATMANL: 1
+ LAYOUT_Y_ATMANL: 1
+atmensanl:
+ LAYOUT_X_ATMENSANL: 1
+ LAYOUT_Y_ATMENSANL: 1
+esfc:
+ DONST: "NO"
+nsst:
+ NST_MODEL: "1"
+sfcanl:
+ DONST: "NO"
+
diff --git a/ci/scripts/check_ci.sh b/ci/scripts/check_ci.sh
index cda2d4e9f2..4ff7eefd26 100755
--- a/ci/scripts/check_ci.sh
+++ b/ci/scripts/check_ci.sh
@@ -8,7 +8,7 @@ set -eux
# to run from within a cron job in the CI Managers account
#####################################################################################
-ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." >/dev/null 2>&1 && pwd )"
+HOMEgfs="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." >/dev/null 2>&1 && pwd )"
scriptname=$(basename "${BASH_SOURCE[0]}")
echo "Begin ${scriptname} at $(date -u)" || true
export PS4='+ $(basename ${BASH_SOURCE})[${LINENO}]'
@@ -20,11 +20,11 @@ REPO_URL="https://github.com/NOAA-EMC/global-workflow.git"
# Set up runtime environment varibles for accounts on supproted machines
#########################################################################
-source "${ROOT_DIR}/ush/detect_machine.sh"
+source "${HOMEgfs}/ush/detect_machine.sh"
case ${MACHINE_ID} in
hera | orion | hercules)
echo "Running Automated Testing on ${MACHINE_ID}"
- source "${ROOT_DIR}/ci/platforms/config.${MACHINE_ID}"
+ source "${HOMEgfs}/ci/platforms/config.${MACHINE_ID}"
;;
*)
echo "Unsupported platform. Exiting with error."
@@ -32,9 +32,10 @@ case ${MACHINE_ID} in
;;
esac
set +x
-source "${ROOT_DIR}/ush/module-setup.sh"
-source "${ROOT_DIR}/ci/scripts/utils/ci_utils.sh"
-module use "${ROOT_DIR}/modulefiles"
+export HOMEgfs
+source "${HOMEgfs}/ush/module-setup.sh"
+source "${HOMEgfs}/ci/scripts/utils/ci_utils.sh"
+module use "${HOMEgfs}/modulefiles"
module load "module_gwsetup.${MACHINE_ID}"
module list
set -x
@@ -57,7 +58,7 @@ pr_list_dbfile="${GFS_CI_ROOT}/open_pr_list.db"
pr_list=""
if [[ -f "${pr_list_dbfile}" ]]; then
- pr_list=$("${ROOT_DIR}/ci/scripts/pr_list_database.py" --dbfile "${pr_list_dbfile}" --display | grep -v Failed | grep Running | awk '{print $1}') || true
+ pr_list=$("${HOMEgfs}/ci/scripts/pr_list_database.py" --dbfile "${pr_list_dbfile}" --display | grep -v Failed | grep Running | awk '{print $1}') || true
fi
if [[ -z "${pr_list+x}" ]]; then
echo "no PRs open and ready to run cases on .. exiting"
@@ -89,13 +90,13 @@ for pr in ${pr_list}; do
sed -i "1 i\`\`\`" "${output_ci}"
sed -i "1 i\All CI Test Cases Passed on ${MACHINE_ID^}:" "${output_ci}"
"${GH}" pr comment "${pr}" --repo "${REPO_URL}" --body-file "${output_ci}"
- "${ROOT_DIR}/ci/scripts/pr_list_database.py" --remove_pr "${pr}" --dbfile "${pr_list_dbfile}"
+ "${HOMEgfs}/ci/scripts/pr_list_database.py" --remove_pr "${pr}" --dbfile "${pr_list_dbfile}"
# Check to see if this PR that was opened by the weekly tests and if so close it if it passed on all platforms
weekly_labels=$(${GH} pr view "${pr}" --repo "${REPO_URL}" --json headRefName,labels,author --jq 'select(.author.login | contains("emcbot")) | select(.headRefName | contains("weekly_ci")) | .labels[].name ') || true
if [[ -n "${weekly_labels}" ]]; then
- num_platforms=$(find "${ROOT_DIR}/ci/platforms" -type f -name "config.*" | wc -l)
+ num_platforms=$(find "${HOMEgfs}/ci/platforms" -type f -name "config.*" | wc -l)
passed=0
- for platforms in "${ROOT_DIR}"/ci/platforms/config.*; do
+ for platforms in "${HOMEgfs}"/ci/platforms/config.*; do
machine=$(basename "${platforms}" | cut -d. -f2)
if [[ "${weekly_labels}" == *"CI-${machine^}-Passed"* ]]; then
((passed=passed+1))
@@ -139,7 +140,7 @@ for pr in ${pr_list}; do
} >> "${output_ci}"
sed -i "1 i\`\`\`" "${output_ci}"
"${GH}" pr comment "${pr}" --repo "${REPO_URL}" --body-file "${output_ci}"
- "${ROOT_DIR}/ci/scripts/pr_list_database.py" --remove_pr "${pr}" --dbfile "${pr_list_dbfile}"
+ "${HOMEgfs}/ci/scripts/pr_list_database.py" --remove_pr "${pr}" --dbfile "${pr_list_dbfile}"
for kill_cases in "${pr_dir}/RUNTESTS/"*; do
pslot=$(basename "${kill_cases}")
cancel_slurm_jobs "${pslot}"
diff --git a/ci/scripts/clone-build_ci.sh b/ci/scripts/clone-build_ci.sh
index 798c98bf50..989afabb80 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 -gu >> log.build 2>&1
+./build_all.sh -guw >> log.build 2>&1
build_status=$?
DATE=$(date +'%D %r')
diff --git a/ci/scripts/driver.sh b/ci/scripts/driver.sh
index 5fc13ea524..f37b5e3f2e 100755
--- a/ci/scripts/driver.sh
+++ b/ci/scripts/driver.sh
@@ -47,12 +47,15 @@ esac
######################################################
# setup runtime env for correct python install and git
######################################################
+HOMEgfs=${ROOT_DIR}
+export HOMEgfs
set +x
source "${ROOT_DIR}/ci/scripts/utils/ci_utils.sh"
source "${ROOT_DIR}/ush/module-setup.sh"
module use "${ROOT_DIR}/modulefiles"
module load "module_gwsetup.${MACHINE_ID}"
set -x
+unset HOMEgfs
############################################################
# query repo and get list of open PRs with tags {machine}-CI
diff --git a/ci/scripts/run-check_ci.sh b/ci/scripts/run-check_ci.sh
index 5a909c1c64..8e1e927050 100755
--- a/ci/scripts/run-check_ci.sh
+++ b/ci/scripts/run-check_ci.sh
@@ -21,8 +21,11 @@ pslot=${2:-${pslot:-?}} # Name of the experiment being tested by this scr
# │ └── ${pslot}
# └── EXPDIR
# └── ${pslot}
-HOMEgfs="${TEST_DIR}/HOMEgfs"
+# Two system build directories created at build time gfs, and gdas
+# TODO: Make this configurable (for now all scripts run from gfs for CI at runtime)
+HOMEgfs="${TEST_DIR}/gfs"
RUNTESTS="${TEST_DIR}/RUNTESTS"
+run_check_logfile="${RUNTESTS}/ci-run_check.log"
# Source modules and setup logging
echo "Source modules."
@@ -75,15 +78,16 @@ while true; do
{
echo "Experiment ${pslot} Terminated with ${num_failed} tasks failed at $(date)" || true
echo "Experiment ${pslot} Terminated: *FAILED*"
- } >> "${RUNTESTS}/ci.log"
-
+ } | tee -a "${run_check_logfile}"
error_logs=$(rocotostat -d "${db}" -w "${xml}" | grep -E 'FAIL|DEAD' | awk '{print "-c", $1, "-t", $2}' | xargs rocotocheck -d "${db}" -w "${xml}" | grep join | awk '{print $2}') || true
{
echo "Error logs:"
echo "${error_logs}"
- } >> "${RUNTESTS}/ci.log"
- sed -i "s/\`\`\`//2g" "${RUNTESTS}/ci.log"
- sacct --format=jobid,jobname%35,WorkDir%100,stat | grep "${pslot}" | grep "${pr}\/RUNTESTS" | awk '{print $1}' | xargs scancel || true
+ } | tee -a "${run_check_logfile}"
+ # rm -f "${RUNTESTS}/error.logs"
+ for log in ${error_logs}; do
+ echo "RUNTESTS${log#*RUNTESTS}" >> "${RUNTESTS}/error.logs"
+ done
rc=1
break
fi
@@ -93,8 +97,7 @@ while true; do
echo "Experiment ${pslot} Completed at $(date)" || true
echo "with ${num_succeeded} successfully completed jobs" || true
echo "Experiment ${pslot} Completed: *SUCCESS*"
- } >> "${RUNTESTS}/ci.log"
- sed -i "s/\`\`\`//2g" "${RUNTESTS}/ci.log"
+ } | tee -a "${run_check_logfile}"
rc=0
break
fi
@@ -105,3 +108,4 @@ while true; do
done
exit "${rc}"
+
diff --git a/ci/scripts/run_ci.sh b/ci/scripts/run_ci.sh
index 4a390a23f2..f50a4465d0 100755
--- a/ci/scripts/run_ci.sh
+++ b/ci/scripts/run_ci.sh
@@ -9,7 +9,7 @@ set -eux
# Abstract TODO
#####################################################################################
-ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." >/dev/null 2>&1 && pwd )"
+HOMEgfs="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." >/dev/null 2>&1 && pwd )"
scriptname=$(basename "${BASH_SOURCE[0]}")
echo "Begin ${scriptname} at $(date -u)" || true
export PS4='+ $(basename ${BASH_SOURCE})[${LINENO}]'
@@ -18,11 +18,11 @@ export PS4='+ $(basename ${BASH_SOURCE})[${LINENO}]'
# Set up runtime environment varibles for accounts on supproted machines
#########################################################################
-source "${ROOT_DIR}/ush/detect_machine.sh"
+source "${HOMEgfs}/ush/detect_machine.sh"
case ${MACHINE_ID} in
hera | orion | hercules)
echo "Running Automated Testing on ${MACHINE_ID}"
- source "${ROOT_DIR}/ci/platforms/config.${MACHINE_ID}"
+ source "${HOMEgfs}/ci/platforms/config.${MACHINE_ID}"
;;
*)
echo "Unsupported platform. Exiting with error."
@@ -30,8 +30,9 @@ case ${MACHINE_ID} in
;;
esac
set +x
-source "${ROOT_DIR}/ush/module-setup.sh"
-module use "${ROOT_DIR}/modulefiles"
+export HOMEgfs
+source "${HOMEgfs}/ush/module-setup.sh"
+module use "${HOMEgfs}/modulefiles"
module load "module_gwsetup.${MACHINE_ID}"
module list
set -eux
@@ -47,7 +48,7 @@ pr_list_dbfile="${GFS_CI_ROOT}/open_pr_list.db"
pr_list=""
if [[ -f "${pr_list_dbfile}" ]]; then
- pr_list=$("${ROOT_DIR}/ci/scripts/pr_list_database.py" --display --dbfile "${pr_list_dbfile}" | grep -v Failed | grep Open | grep Running | awk '{print $1}' | head -"${max_concurrent_pr}") || true
+ pr_list=$("${HOMEgfs}/ci/scripts/pr_list_database.py" --display --dbfile "${pr_list_dbfile}" | grep -v Failed | grep Open | grep Running | awk '{print $1}' | head -"${max_concurrent_pr}") || true
fi
if [[ -z "${pr_list}" ]]; then
echo "no open and built PRs that are ready for the cases to advance with rocotorun .. exiting"
diff --git a/ci/scripts/utils/ci_utils.sh b/ci/scripts/utils/ci_utils.sh
index 737a3e5a86..ce2e039307 100755
--- a/ci/scripts/utils/ci_utils.sh
+++ b/ci/scripts/utils/ci_utils.sh
@@ -1,24 +1,128 @@
#!/bin/env bash
-function cancel_slurm_jobs() {
+function determine_scheduler() {
+ if command -v sbatch &> /dev/null; then
+ echo "slurm";
+ elif command -v qsub &> /dev/null; then
+ echo "torque";
+ else
+ echo "unknown"
+ fi
+}
- # Usage: cancel_slurm_jobs
- # Example: cancel_slurm_jobs "C48_ATM_3c4e7f74"
+function cancel_batch_jobs() {
+ # Usage: cancel_batch_jobs
+ # Example: cancel_batch_jobs "C48_ATM_3c4e7f74"
#
- # Cancel all Slurm jobs that have the given substring in their name
+ # Cancel all batch jobs that have the given substring in their name
# So like in the example all jobs with "C48_ATM_3c4e7f74"
# in their name will be canceled
local substring=$1
local job_ids
- job_ids=$(squeue -u "${USER}" -h -o "%i")
-
- for job_id in ${job_ids}; do
- job_name=$(sacct -j "${job_id}" --format=JobName%100 | head -3 | tail -1 | sed -r 's/\s+//g') || true
- if [[ "${job_name}" =~ ${substring} ]]; then
- echo "Canceling Slurm Job ${job_name} with: scancel ${job_id}"
- scancel "${job_id}"
- continue
- fi
+
+ scheduler=$(determine_scheduler)
+
+ if [[ "${schduler}" == "torque" ]]; then
+ job_ids=$(qstat -u "${USER}" | awk '{print $1}') || true
+
+ for job_id in ${job_ids}; do
+ job_name=$(qstat -f "${job_id}" | grep Job_Name | awk '{print $3}') || true
+ if [[ "${job_name}" =~ ${substring} ]]; then
+ echo "Canceling PBS Job ${job_name} with: qdel ${job_id}"
+ qdel "${job_id}"
+ continue
+ fi
+ done
+
+ elif [[ "${scheduler}" == "slurm" ]]; then
+
+ job_ids=$(squeue -u "${USER}" -h -o "%i")
+
+ for job_id in ${job_ids}; do
+ job_name=$(sacct -j "${job_id}" --format=JobName%100 | head -3 | tail -1 | sed -r 's/\s+//g') || true
+ if [[ "${job_name}" =~ ${substring} ]]; then
+ echo "Canceling Slurm Job ${job_name} with: scancel ${job_id}"
+ scancel "${job_id}"
+ continue
+ fi
+ done
+
+ else
+ echo "FATAL: Unknown/unsupported job scheduler"
+ exit 1
+ fi
+}
+
+
+function get_pr_case_list () {
+
+ #############################################################
+ # loop over every yaml file in the PR's ci/cases
+ # and create an run directory for each one for this PR loop
+ #############################################################
+ for yaml_config in "${HOMEgfs}/ci/cases/pr/"*.yaml; do
+ case=$(basename "${yaml_config}" .yaml) || true
+ echo "${case}"
+ done
+}
+
+function get_pslot_list () {
+
+ local RUNTESTS="${1}"
+
+ #############################################################
+ # loop over expdir directories in RUNTESTS
+ # and create list of the directory names (pslot) with the hash tag
+ #############################################################
+ for pslot_dir in "${RUNTESTS}/EXPDIR/"*; do
+ pslot=$(basename "${pslot_dir}") || true
+ echo "${pslot}"
+ done
+
+}
+
+function get_pslot () {
+
+ local RUNTESTS="${1}"
+ local case="${2}"
+
+ #############################################################
+ # loop over expdir directories in RUNTESTS
+ # and return the name of the pslot with its tag that matches the case
+ #############################################################
+ for pslot_dir in "${RUNTESTS}/EXPDIR/"*; do
+ pslot=$(basename "${pslot_dir}")
+ check_case=$(echo "${pslot}" | rev | cut -d"_" -f2- | rev) || true
+ if [[ "${check_case}" == "${case}" ]]; then
+ echo "${pslot}"
+ break
+ fi
+ done
+
+}
+
+function cancel_all_batch_jobs () {
+ local RUNTESTS="${1}"
+ pslot_list=$(get_pslot_list "${RUNTESTS}")
+ for pslot in ${pslot_list}; do
+ cancel_batch_jobs "${pslot}"
done
}
+
+function create_experiment () {
+
+ local yaml_config="${1}"
+ cd "${HOMEgfs}" || exit 1
+ pr_sha=$(git rev-parse --short HEAD)
+ case=$(basename "${yaml_config}" .yaml) || true
+ export pslot=${case}_${pr_sha}
+
+ source "${HOMEgfs}/ci/platforms/config.${MACHINE_ID}"
+ source "${HOMEgfs}/workflow/gw_setup.sh"
+
+ # system=$(grep "system:" "${yaml_config}" | cut -d":" -f2 | tr -d " ") || true
+
+ "${HOMEgfs}/${system}/workflow/create_experiment.py" --overwrite --yaml "${yaml_config}"
+
+}
diff --git a/ci/scripts/utils/ci_utils_wrapper.sh b/ci/scripts/utils/ci_utils_wrapper.sh
new file mode 100755
index 0000000000..51c392fb99
--- /dev/null
+++ b/ci/scripts/utils/ci_utils_wrapper.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+HOMEgfs="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." >/dev/null 2>&1 && pwd )"
+source "${HOMEgfs}/ush/detect_machine.sh"
+
+utitilty_function="${1}"
+
+source "${HOMEgfs}/ci/scripts/utils/ci_utils.sh"
+${utitilty_function} "${@:2}"
diff --git a/ci/scripts/utils/get_host_case_list.py b/ci/scripts/utils/get_host_case_list.py
new file mode 100755
index 0000000000..eb10f29f05
--- /dev/null
+++ b/ci/scripts/utils/get_host_case_list.py
@@ -0,0 +1,32 @@
+#!/usr/bin/env python3
+import os
+from os.path import basename, splitext
+import sys
+import glob
+from wxflow import parse_j2yaml
+from wxflow import AttrDict
+
+_here = os.path.dirname(__file__)
+_top = os.path.abspath(os.path.join(os.path.abspath(_here), '../../..'))
+
+if __name__ == '__main__':
+
+ if len(sys.argv) < 2:
+ print('Usage: get_host_case_list.py ')
+ sys.exit(1)
+
+ host = sys.argv[1]
+
+ case_list = []
+ HOMEgfs = _top
+ data = AttrDict(HOMEgfs=_top)
+ data.update(os.environ)
+
+ case_files = glob.glob(f'{HOMEgfs}/ci/cases/pr/*.yaml')
+ for case_yaml in case_files:
+ case_conf = parse_j2yaml(path=case_yaml, data=data)
+ if 'skip_ci_on_hosts' in case_conf:
+ if host.lower() in [machine.lower() for machine in case_conf.skip_ci_on_hosts]:
+ continue
+ case_list.append(splitext(basename(case_yaml))[0])
+ print(' '.join(case_list))
diff --git a/ci/scripts/utils/wxflow b/ci/scripts/utils/wxflow
new file mode 120000
index 0000000000..54d0558aba
--- /dev/null
+++ b/ci/scripts/utils/wxflow
@@ -0,0 +1 @@
+../../../sorc/wxflow/src/wxflow
\ No newline at end of file
diff --git a/docs/source/clone.rst b/docs/source/clone.rst
index bad3f0e9f6..4f47eb230f 100644
--- a/docs/source/clone.rst
+++ b/docs/source/clone.rst
@@ -39,6 +39,13 @@ For coupled cycling (include new UFSDA) use the `-gu` options during build:
./build_all.sh -gu
+For building with PDLIB for the wave model, use the `-w` options during build:
+
+::
+
+ ./build_all.sh -w
+
+
Build workflow components and link workflow artifacts such as executables, etc.
::
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 2eb786199a..4381488078 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -10,7 +10,7 @@ Status
======
* State of develop (HEAD) branch: GFSv17+ development
-* State of operations (dev/gfs.v16 branch): GFS v16.3.12 `tag: [gfs.v16.3.12] `_
+* State of operations (dev/gfs.v16 branch): GFS v16.3.13 `tag: [gfs.v16.3.13] `_
=============
Code managers
diff --git a/env/AWSPW.env b/env/AWSPW.env
index 894cce2343..2dbba67eb3 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 "atmanlrun atmensanlrun aeroanlrun landanlrun"
+ echo "atmanlrun atmensanlrun aeroanlrun snowanl"
echo "anal sfcanl fcst post metp"
echo "eobs eupd ecen efcs epos"
echo "postsnd awips gempak"
@@ -14,7 +14,6 @@ fi
step=$1
-export npe_node_max=36
export launcher="mpiexec.hydra"
export mpmd_opt=""
diff --git a/env/CONTAINER.env b/env/CONTAINER.env
index bfeb6dd6da..bc2d64b4ce 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 "atmanlrun atmensanlrun aeroanlrun landanl"
+ echo "atmanlrun atmensanlrun aeroanlrun snowanl"
echo "anal sfcanl fcst post metp"
echo "eobs eupd ecen efcs epos"
echo "postsnd awips gempak"
@@ -14,7 +14,6 @@ fi
step=$1
-export npe_node_max=40
export launcher="mpirun"
export mpmd_opt="--multi-prog"
diff --git a/env/HERA.env b/env/HERA.env
index 4ad9e41d01..b5942e79e7 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 "atmanlrun atmensanlrun aeroanlrun landanl"
+ echo "atmanlrun atmensanlrun aeroanlrun snowanl"
echo "anal sfcanl fcst post metp"
echo "eobs eupd ecen efcs epos"
echo "postsnd awips gempak"
@@ -14,11 +14,12 @@ fi
step=$1
-export npe_node_max=40
#JKHexport launcher="srun -l --export=ALL"
export launcher="srun -l --epilog=/apps/local/bin/report-mem --export=ALL"
export mpmd_opt="--multi-prog --output=mpmd.%j.%t.out"
+#export POSTAMBLE_CMD='report-mem'
+
# Configure MPI environment
#export I_MPI_ADJUST_ALLREDUCE=5
#export MPI_BUFS_PER_PROC=2048
@@ -42,7 +43,7 @@ if [[ "${step}" = "prep" ]] || [[ "${step}" = "prepbufr" ]]; then
export sys_tp="HERA"
export launcher_PREP="srun"
-elif [[ "${step}" = "preplandobs" ]]; then
+elif [[ "${step}" = "prepsnowobs" ]]; then
export APRUN_CALCFIMS="${launcher} -n 1"
@@ -79,13 +80,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}" = "landanl" ]]; then
+elif [[ "${step}" = "snowanl" ]]; then
- nth_max=$((npe_node_max / npe_node_landanl))
+ nth_max=$((npe_node_max / npe_node_snowanl))
- export NTHREADS_LANDANL=${nth_landanl:-${nth_max}}
- [[ ${NTHREADS_LANDANL} -gt ${nth_max} ]] && export NTHREADS_LANDANL=${nth_max}
- export APRUN_LANDANL="${launcher} -n ${npe_landanl} --cpus-per-task=${NTHREADS_LANDANL}"
+ export NTHREADS_SNOWANL=${nth_snowanl:-${nth_max}}
+ [[ ${NTHREADS_SNOWANL} -gt ${nth_max} ]] && export NTHREADS_SNOWANL=${nth_max}
+ export APRUN_SNOWANL="${launcher} -n ${npe_snowanl} --cpus-per-task=${NTHREADS_SNOWANL}"
export APRUN_APPLY_INCR="${launcher} -n 6"
@@ -93,31 +94,19 @@ elif [[ "${step}" = "ocnanalbmat" ]]; then
export APRUNCFP="${launcher} -n \$ncmd --multi-prog"
- nth_max=$((npe_node_max / npe_node_ocnanalbmat))
-
- export NTHREADS_OCNANAL=${nth_ocnanalbmat:-${nth_max}}
- [[ ${NTHREADS_OCNANAL} -gt ${nth_max} ]] && export NTHREADS_OCNANAL=${nth_max}
- export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalbmat} --cpus-per-task=${NTHREADS_OCNANAL}"
+ export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalbmat}"
elif [[ "${step}" = "ocnanalrun" ]]; then
export APRUNCFP="${launcher} -n \$ncmd --multi-prog"
- nth_max=$((npe_node_max / npe_node_ocnanalrun))
-
- export NTHREADS_OCNANAL=${nth_ocnanalrun:-${nth_max}}
- [[ ${NTHREADS_OCNANAL} -gt ${nth_max} ]] && export NTHREADS_OCNANAL=${nth_max}
- export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalrun} --cpus-per-task=${NTHREADS_OCNANAL}"
+ export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalrun}"
elif [[ "${step}" = "ocnanalchkpt" ]]; then
export APRUNCFP="${launcher} -n \$ncmd --multi-prog"
- nth_max=$((npe_node_max / npe_node_ocnanalchkpt))
-
- export NTHREADS_OCNANAL=${nth_ocnanalchkpt:-${nth_max}}
- [[ ${NTHREADS_OCNANAL} -gt ${nth_max} ]] && export NTHREADS_OCNANAL=${nth_max}
- export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalchkpt} --cpus-per-task=${NTHREADS_OCNANAL}"
+ export APRUN_OCNANAL="${launcher} -n ${npe_ocnanalchkpt}"
elif [[ "${step}" = "anal" ]] || [[ "${step}" = "analcalc" ]]; then
@@ -211,6 +200,13 @@ elif [[ "${step}" = "atmos_products" ]]; then
export USE_CFP="YES" # Use MPMD for downstream product generation on Hera
+elif [[ "${step}" = "oceanice_products" ]]; then
+
+ nth_max=$((npe_node_max / npe_node_oceanice_products))
+
+ export NTHREADS_OCNICEPOST=${nth_oceanice_products:-1}
+ export APRUN_OCNICEPOST="${launcher} -n 1 --cpus-per-task=${NTHREADS_OCNICEPOST}"
+
elif [[ "${step}" = "ecen" ]]; then
nth_max=$((npe_node_max / npe_node_ecen))
@@ -247,7 +243,7 @@ elif [[ "${step}" = "epos" ]]; then
[[ ${NTHREADS_EPOS} -gt ${nth_max} ]] && export NTHREADS_EPOS=${nth_max}
export APRUN_EPOS="${launcher} -n ${npe_epos} --cpus-per-task=${NTHREADS_EPOS}"
-elif [[ "${step}" = "init" ]]; then
+elif [[ "${step}" = "init" ]]; then ##JKH
export APRUN="${launcher} -n ${npe_init}"
diff --git a/env/HERCULES.env b/env/HERCULES.env
index 6a4aad7a7d..7d2aa5f8d0 100755
--- a/env/HERCULES.env
+++ b/env/HERCULES.env
@@ -12,7 +12,6 @@ fi
step=$1
-export npe_node_max=80
export launcher="srun -l --export=ALL"
export mpmd_opt="--multi-prog --output=mpmd.%j.%t.out"
@@ -42,7 +41,7 @@ case ${step} in
export sys_tp="HERCULES"
export launcher_PREP="srun"
;;
- "preplandobs")
+ "prepsnowobs")
export APRUN_CALCFIMS="${launcher} -n 1"
;;
@@ -80,13 +79,13 @@ 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}"
;;
- "landanl")
+ "snowanl")
- nth_max=$((npe_node_max / npe_node_landanl))
+ nth_max=$((npe_node_max / npe_node_snowanl))
- export NTHREADS_LANDANL=${nth_landanl:-${nth_max}}
- [[ ${NTHREADS_LANDANL} -gt ${nth_max} ]] && export NTHREADS_LANDANL=${nth_max}
- export APRUN_LANDANL="${launcher} -n ${npe_landanl} --cpus-per-task=${NTHREADS_LANDANL}"
+ export NTHREADS_SNOWANL=${nth_snowanl:-${nth_max}}
+ [[ ${NTHREADS_SNOWANL} -gt ${nth_max} ]] && export NTHREADS_SNOWANL=${nth_max}
+ export APRUN_SNOWANL="${launcher} -n ${npe_snowanl} --cpus-per-task=${NTHREADS_SNOWANL}"
export APRUN_APPLY_INCR="${launcher} -n 6"
;;
@@ -208,10 +207,20 @@ case ${step} in
[[ ${NTHREADS_UPP} -gt ${nth_max} ]] && export NTHREADS_UPP=${nth_max}
export APRUN_UPP="${launcher} -n ${npe_upp} --cpus-per-task=${NTHREADS_UPP}"
;;
+
"atmos_products")
export USE_CFP="YES" # Use MPMD for downstream product generation
;;
+
+"oceanice_products")
+
+ nth_max=$((npe_node_max / npe_node_oceanice_products))
+
+ export NTHREADS_OCNICEPOST=${nth_oceanice_products:-1}
+ export APRUN_OCNICEPOST="${launcher} -n 1 --cpus-per-task=${NTHREADS_OCNICEPOST}"
+;;
+
"ecen")
nth_max=$((npe_node_max / npe_node_ecen))
diff --git a/env/JET.env b/env/JET.env
index f458bff72d..9db667de50 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 "atmanlrun atmensanlrun aeroanlrun landanl"
+ echo "atmanlrun atmensanlrun aeroanlrun snowanl"
echo "anal sfcanl fcst post metp"
echo "eobs eupd ecen efcs epos"
echo "postsnd awips gempak"
@@ -14,7 +14,7 @@ fi
step=$1
-if [[ "${PARTITION_POST_BATCH}" = "sjet" ]]; then
+if [[ "${PARTITION_POST_BATCH}" = "sjet" ]]; then ##JKH
export npe_node_max=16
elif [[ "${PARTITION_BATCH}" = "xjet" ]]; then
export npe_node_max=24
@@ -23,7 +23,7 @@ elif [[ "${PARTITION_BATCH}" = "vjet" ]]; then
elif [[ "${PARTITION_BATCH}" = "kjet" ]]; then
export npe_node_max=40
fi
-export launcher="srun -l --epilog=/apps/local/bin/report-mem --export=ALL"
+export launcher="srun -l --epilog=/apps/local/bin/report-mem --export=ALL" ##JKH
export mpmd_opt="--multi-prog --output=mpmd.%j.%t.out"
# Configure MPI environment
@@ -42,7 +42,7 @@ if [[ "${step}" = "prep" ]] || [[ "${step}" = "prepbufr" ]]; then
export sys_tp="JET"
export launcher_PREP="srun"
-elif [[ "${step}" = "preplandobs" ]]; then
+elif [[ "${step}" = "prepsnowobs" ]]; then
export APRUN_CALCFIMS="${launcher} -n 1"
@@ -79,13 +79,13 @@ elif [[ "${step}" = "aeroanlrun" ]]; then
[[ ${NTHREADS_AEROANL} -gt ${nth_max} ]] && export NTHREADS_AEROANL=${nth_max}
export APRUN_AEROANL="${launcher} -n ${npe_aeroanlrun}"
-elif [[ "${step}" = "landanl" ]]; then
+elif [[ "${step}" = "snowanl" ]]; then
- nth_max=$((npe_node_max / npe_node_landanl))
+ nth_max=$((npe_node_max / npe_node_snowanl))
- 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 NTHREADS_SNOWANL=${nth_snowanl:-${nth_max}}
+ [[ ${NTHREADS_SNOWANL} -gt ${nth_max} ]] && export NTHREADS_SNOWANL=${nth_max}
+ export APRUN_SNOWANL="${launcher} -n ${npe_snowanl}"
export APRUN_APPLY_INCR="${launcher} -n 6"
@@ -199,6 +199,13 @@ elif [[ "${step}" = "atmos_products" ]]; then
export USE_CFP="YES" # Use MPMD for downstream product generation
+elif [[ "${step}" = "oceanice_products" ]]; then
+
+ nth_max=$((npe_node_max / npe_node_oceanice_products))
+
+ export NTHREADS_OCNICEPOST=${nth_oceanice_products:-1}
+ export APRUN_OCNICEPOST="${launcher} -n 1 --cpus-per-task=${NTHREADS_OCNICEPOST}"
+
elif [[ "${step}" = "ecen" ]]; then
nth_max=$((npe_node_max / npe_node_ecen))
diff --git a/env/ORION.env b/env/ORION.env
index d91fd4db03..692fa8ab66 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 "atmanlrun atmensanlrun aeroanlrun landanl"
+ echo "atmanlrun atmensanlrun aeroanlrun snowanl"
echo "anal sfcanl fcst post metp"
echo "eobs eupd ecen efcs epos"
echo "postsnd awips gempak"
@@ -14,7 +14,6 @@ fi
step=$1
-export npe_node_max=40
export launcher="srun -l --export=ALL"
export mpmd_opt="--multi-prog --output=mpmd.%j.%t.out"
@@ -41,7 +40,7 @@ if [[ "${step}" = "prep" ]] || [[ "${step}" = "prepbufr" ]]; then
export sys_tp="ORION"
export launcher_PREP="srun"
-elif [[ "${step}" = "preplandobs" ]]; then
+elif [[ "${step}" = "prepsnowobs" ]]; then
export APRUN_CALCFIMS="${launcher} -n 1"
@@ -79,13 +78,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}" = "landanl" ]]; then
+elif [[ "${step}" = "snowanl" ]]; then
- nth_max=$((npe_node_max / npe_node_landanl))
+ nth_max=$((npe_node_max / npe_node_snowanl))
- export NTHREADS_LANDANL=${nth_landanl:-${nth_max}}
- [[ ${NTHREADS_LANDANL} -gt ${nth_max} ]] && export NTHREADS_LANDANL=${nth_max}
- export APRUN_LANDANL="${launcher} -n ${npe_landanl} --cpus-per-task=${NTHREADS_LANDANL}"
+ export NTHREADS_SNOWANL=${nth_snowanl:-${nth_max}}
+ [[ ${NTHREADS_SNOWANL} -gt ${nth_max} ]] && export NTHREADS_SNOWANL=${nth_max}
+ export APRUN_SNOWANL="${launcher} -n ${npe_snowanl} --cpus-per-task=${NTHREADS_SNOWANL}"
export APRUN_APPLY_INCR="${launcher} -n 6"
@@ -210,6 +209,13 @@ elif [[ "${step}" = "atmos_products" ]]; then
export USE_CFP="YES" # Use MPMD for downstream product generation
+elif [[ "${step}" = "oceanice_products" ]]; then
+
+ nth_max=$((npe_node_max / npe_node_oceanice_products))
+
+ export NTHREADS_OCNICEPOST=${nth_oceanice_products:-1}
+ export APRUN_OCNICEPOST="${launcher} -n 1 --cpus-per-task=${NTHREADS_OCNICEPOST}"
+
elif [[ "${step}" = "ecen" ]]; then
nth_max=$((npe_node_max / npe_node_ecen))
diff --git a/env/S4.env b/env/S4.env
index 3dab3fc3e7..ab564eb974 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 "atmanlrun atmensanlrun aeroanlrun landanl"
+ echo "atmanlrun atmensanlrun aeroanlrun snowanl"
echo "anal sfcanl fcst post metp"
echo "eobs eupd ecen efcs epos"
echo "postsnd awips gempak"
@@ -13,13 +13,7 @@ if [[ $# -ne 1 ]]; then
fi
step=$1
-PARTITION_BATCH=${PARTITION_BATCH:-"s4"}
-if [[ ${PARTITION_BATCH} = "s4" ]]; then
- export npe_node_max=32
-elif [[ ${PARTITION_BATCH} = "ivy" ]]; then
- export npe_node_max=20
-fi
export launcher="srun -l --export=ALL"
export mpmd_opt="--multi-prog --output=mpmd.%j.%t.out"
@@ -39,7 +33,7 @@ if [[ "${step}" = "prep" ]] || [[ "${step}" = "prepbufr" ]]; then
export sys_tp="S4"
export launcher_PREP="srun"
-elif [[ "${step}" = "preplandobs" ]]; then
+elif [[ "${step}" = "prepsnowobs" ]]; then
export APRUN_CALCFIMS="${launcher} -n 1"
@@ -76,13 +70,13 @@ elif [[ "${step}" = "aeroanlrun" ]]; then
[[ ${NTHREADS_AEROANL} -gt ${nth_max} ]] && export NTHREADS_AEROANL=${nth_max}
export APRUN_AEROANL="${launcher} -n ${npe_aeroanlrun}"
-elif [[ "${step}" = "landanl" ]]; then
+elif [[ "${step}" = "snowanl" ]]; then
- nth_max=$((npe_node_max / npe_node_landanl))
+ nth_max=$((npe_node_max / npe_node_snowanl))
- 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 NTHREADS_SNOWANL=${nth_snowanl:-${nth_max}}
+ [[ ${NTHREADS_SNOWANL} -gt ${nth_max} ]] && export NTHREADS_SNOWANL=${nth_max}
+ export APRUN_SNOWANL="${launcher} -n ${npe_snowanl}"
export APRUN_APPLY_INCR="${launcher} -n 6"
@@ -183,6 +177,13 @@ elif [[ "${step}" = "atmos_products" ]]; then
export USE_CFP="YES" # Use MPMD for downstream product generation
+elif [[ "${step}" = "oceanice_products" ]]; then
+
+ nth_max=$((npe_node_max / npe_node_oceanice_products))
+
+ export NTHREADS_OCNICEPOST=${nth_oceanice_products:-1}
+ export APRUN_OCNICEPOST="${launcher} -n 1 --cpus-per-task=${NTHREADS_OCNICEPOST}"
+
elif [[ "${step}" = "ecen" ]]; then
nth_max=$((npe_node_max / npe_node_ecen))
diff --git a/env/WCOSS2.env b/env/WCOSS2.env
index a4fe81060d..ebb55a4077 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 "atmanlrun atmensanlrun aeroanlrun landanl"
+ echo "atmanlrun atmensanlrun aeroanlrun snowanl"
echo "anal sfcanl fcst post metp"
echo "eobs eupd ecen esfc efcs epos"
echo "postsnd awips gempak"
@@ -18,8 +18,6 @@ step=$1
export launcher="mpiexec -l"
export mpmd_opt="--cpu-bind verbose,core cfp"
-export npe_node_max=128
-
if [[ "${step}" = "prep" ]] || [[ "${step}" = "prepbufr" ]]; then
nth_max=$((npe_node_max / npe_node_prep))
@@ -29,7 +27,7 @@ if [[ "${step}" = "prep" ]] || [[ "${step}" = "prepbufr" ]]; then
export sys_tp="wcoss2"
export launcher_PREP="mpiexec"
-elif [[ "${step}" = "preplandobs" ]]; then
+elif [[ "${step}" = "prepsnowobs" ]]; then
export APRUN_CALCFIMS="${launcher} -n 1"
@@ -66,13 +64,13 @@ elif [[ "${step}" = "aeroanlrun" ]]; then
[[ ${NTHREADS_AEROANL} -gt ${nth_max} ]] && export NTHREADS_AEROANL=${nth_max}
export APRUN_AEROANL="${launcher} -n ${npe_aeroanlrun}"
-elif [[ "${step}" = "landanl" ]]; then
+elif [[ "${step}" = "snowanl" ]]; then
- nth_max=$((npe_node_max / npe_node_landanl))
+ nth_max=$((npe_node_max / npe_node_snowanl))
- 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 NTHREADS_SNOWANL=${nth_snowanl:-${nth_max}}
+ [[ ${NTHREADS_SNOWANL} -gt ${nth_max} ]] && export NTHREADS_SNOWANL=${nth_max}
+ export APRUN_SNOWANL="${launcher} -n ${npe_snowanl}"
export APRUN_APPLY_INCR="${launcher} -n 6"
@@ -178,6 +176,8 @@ elif [[ "${step}" = "fcst" ]] || [[ "${step}" = "efcs" ]]; then
if [[ "${step}" = "fcst" ]]; then
export OMP_PLACES=cores
export OMP_STACKSIZE=2048M
+ export MPICH_MPIIO_HINTS="*:romio_cb_write=disable"
+ export FI_OFI_RXM_SAR_LIMIT=3145728
elif [[ "${step}" = "efcs" ]]; then
export MPICH_MPIIO_HINTS="*:romio_cb_write=disable"
export FI_OFI_RXM_SAR_LIMIT=3145728
@@ -195,6 +195,13 @@ elif [[ "${step}" = "atmos_products" ]]; then
export USE_CFP="YES" # Use MPMD for downstream product generation
+elif [[ "${step}" = "oceanice_products" ]]; then
+
+ nth_max=$((npe_node_max / npe_node_oceanice_products))
+
+ export NTHREADS_OCNICEPOST=${nth_oceanice_products:-1}
+ export APRUN_OCNICEPOST="${launcher} -n 1 -ppn ${npe_node_oceanice_products} --cpu-bind depth --depth ${NTHREADS_OCNICEPOST}"
+
elif [[ "${step}" = "ecen" ]]; then
nth_max=$((npe_node_max / npe_node_ecen))
diff --git a/gempak/ush/gdas_ecmwf_meta_ver.sh b/gempak/ush/gdas_ecmwf_meta_ver.sh
index e4fffd9c8a..5d519c7cc5 100755
--- a/gempak/ush/gdas_ecmwf_meta_ver.sh
+++ b/gempak/ush/gdas_ecmwf_meta_ver.sh
@@ -30,7 +30,7 @@ PDY2=$(echo ${PDY} | cut -c3-)
#
# Copy in datatype table to define gdfile type
#
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
export err=$?
if [[ $err -ne 0 ]] ; then
echo " File datatype.tbl does not exist."
diff --git a/gempak/ush/gdas_meta_loop.sh b/gempak/ush/gdas_meta_loop.sh
index cd0d9b781b..927958a0ad 100755
--- a/gempak/ush/gdas_meta_loop.sh
+++ b/gempak/ush/gdas_meta_loop.sh
@@ -33,7 +33,7 @@ export pgm=gdplot2_nc;. prep_step; startmsg
#
# Copy in datatype table to define gdfile type
#
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
export err=$?
if [[ $err -ne 0 ]] ; then
echo " File datatype.tbl does not exist."
diff --git a/gempak/ush/gdas_ukmet_meta_ver.sh b/gempak/ush/gdas_ukmet_meta_ver.sh
index 845fa1cc6b..c7267ed09c 100755
--- a/gempak/ush/gdas_ukmet_meta_ver.sh
+++ b/gempak/ush/gdas_ukmet_meta_ver.sh
@@ -29,7 +29,7 @@ PDY2=$(echo ${PDY} | cut -c3-)
#
# Copy in datatype table to define gdfile type
#
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
#
# DEFINE 1 CYCLE AGO
diff --git a/gempak/ush/gempak_gdas_f000_gif.sh b/gempak/ush/gempak_gdas_f000_gif.sh
index cdf7659155..3e25d4090f 100755
--- a/gempak/ush/gempak_gdas_f000_gif.sh
+++ b/gempak/ush/gempak_gdas_f000_gif.sh
@@ -13,9 +13,6 @@
#
#########################################################################
- msg=" Make GEMPAK GIFS utility"
- postmsg "$jlogfile" "$msg"
-
set -x
MAPAREA="normal"
@@ -25,7 +22,7 @@
pixels="1728;1472"
- cp $FIXgempak/coltbl.spc coltbl.xwp
+ cp ${HOMEgfs}/gempak/fix/coltbl.spc coltbl.xwp
#################################################################
# NORTHERN HEMISPHERE ANALYSIS CHARTS #
@@ -488,8 +485,4 @@ if [ $SENDCOM = YES ]; then
fi
-
- msg=" GEMPAK_GIF ${fhr} hour completed normally"
- postmsg "$jlogfile" "$msg"
-
exit
diff --git a/gempak/ush/gempak_gfs_f00_gif.sh b/gempak/ush/gempak_gfs_f00_gif.sh
index 2a7cca5c9f..ad16958be2 100755
--- a/gempak/ush/gempak_gfs_f00_gif.sh
+++ b/gempak/ush/gempak_gfs_f00_gif.sh
@@ -15,9 +15,6 @@
#
#########################################################################
- msg=" Make GEMPAK GIFS utility"
- postmsg "$jlogfile" "$msg"
-
set -x
MAPAREA="normal"
@@ -26,7 +23,7 @@
pixels="1728;1472"
- cp $FIXgempak/coltbl.spc coltbl.xwp
+ cp ${HOMEgfs}/gempak/fix/coltbl.spc coltbl.xwp
#################################################################
# ANALYSIS CHARTS #
@@ -596,7 +593,4 @@ if [ $SENDCOM = YES ]; then
${USHgfs}/make_tif.sh
fi
- msg=" GEMPAK_GIF ${fhr} hour completed normally"
- postmsg "$jlogfile" "$msg"
-
exit
diff --git a/gempak/ush/gempak_gfs_f12_gif.sh b/gempak/ush/gempak_gfs_f12_gif.sh
index 611252a2e2..0150affac7 100755
--- a/gempak/ush/gempak_gfs_f12_gif.sh
+++ b/gempak/ush/gempak_gfs_f12_gif.sh
@@ -15,9 +15,6 @@
#
#########################################################################
- msg=" Make GEMPAK GIFS utility"
- postmsg "$jlogfile" "$msg"
-
set -x
MAPAREA="normal"
@@ -26,7 +23,7 @@
pixels="1728;1472"
- cp $FIXgempak/coltbl.spc coltbl.xwp
+ cp ${HOMEgfs}/gempak/fix/coltbl.spc coltbl.xwp
##########################################################
# 12HR FORECAST CHARTS #
@@ -207,7 +204,4 @@ if [ $SENDCOM = YES ]; then
fi
- msg=" GEMPAK_GIF ${fhr} hour completed normally"
- postmsg "$jlogfile" "$msg"
-
exit
diff --git a/gempak/ush/gempak_gfs_f24_gif.sh b/gempak/ush/gempak_gfs_f24_gif.sh
index 53670a29bd..cad24de9f6 100755
--- a/gempak/ush/gempak_gfs_f24_gif.sh
+++ b/gempak/ush/gempak_gfs_f24_gif.sh
@@ -16,13 +16,6 @@
#
#########################################################################
-
-
- msg=" Make GEMPAK GIFS utility"
- postmsg "$jlogfile" "$msg"
-
-
-
set -x
@@ -32,7 +25,7 @@
pixels="1728;1472"
- cp $FIXgempak/coltbl.spc coltbl.xwp
+ cp ${HOMEgfs}/gempak/fix/coltbl.spc coltbl.xwp
@@ -224,8 +217,4 @@ if [ $SENDCOM = YES ]; then
fi
-
- msg=" GEMPAK_GIF ${fhr} hour completed normally"
- postmsg "$jlogfile" "$msg"
-
exit
diff --git a/gempak/ush/gempak_gfs_f36_gif.sh b/gempak/ush/gempak_gfs_f36_gif.sh
index e1999090c0..60644e2fa3 100755
--- a/gempak/ush/gempak_gfs_f36_gif.sh
+++ b/gempak/ush/gempak_gfs_f36_gif.sh
@@ -16,12 +16,6 @@
#
#########################################################################
-
-
- msg=" Make GEMPAK GIFS utility"
- postmsg "$jlogfile" "$msg"
-
-
set -x
@@ -31,7 +25,7 @@
pixels="1728;1472"
- cp $FIXgempak/coltbl.spc coltbl.xwp
+ cp ${HOMEgfs}/gempak/fix/coltbl.spc coltbl.xwp
@@ -223,9 +217,4 @@ if [ $SENDCOM = YES ]; then
fi
-
-
- msg=" GEMPAK_GIF ${fhr} hour completed normally"
- postmsg "$jlogfile" "$msg"
-
exit
diff --git a/gempak/ush/gempak_gfs_f48_gif.sh b/gempak/ush/gempak_gfs_f48_gif.sh
index 1e0ba532fd..b63f644ee6 100755
--- a/gempak/ush/gempak_gfs_f48_gif.sh
+++ b/gempak/ush/gempak_gfs_f48_gif.sh
@@ -16,12 +16,6 @@
#
#########################################################################
-
-
- msg=" Make GEMPAK GIFS utility"
- postmsg "$jlogfile" "$msg"
-
-
set -x
@@ -31,7 +25,7 @@
pixels="1728;1472"
- cp $FIXgempak/coltbl.spc coltbl.xwp
+ cp ${HOMEgfs}/gempak/fix/coltbl.spc coltbl.xwp
@@ -223,9 +217,4 @@ if [ $SENDCOM = YES ]; then
fi
-
-
- msg=" GEMPAK_GIF ${fhr} hour completed normally"
- postmsg "$jlogfile" "$msg"
-
exit
diff --git a/gempak/ush/gfs_meta_ak.sh b/gempak/ush/gfs_meta_ak.sh
index c258b7e83a..03db6fa088 100755
--- a/gempak/ush/gfs_meta_ak.sh
+++ b/gempak/ush/gfs_meta_ak.sh
@@ -24,7 +24,7 @@ set -xa
rm -rf $DATA/ak
mkdir -p -m 775 $DATA/ak
cd $DATA/ak
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
device="nc | gfs.meta.ak"
PDY2=$(echo $PDY | cut -c3-)
diff --git a/gempak/ush/gfs_meta_bwx.sh b/gempak/ush/gfs_meta_bwx.sh
index f5b4e1d944..af7f43e3de 100755
--- a/gempak/ush/gfs_meta_bwx.sh
+++ b/gempak/ush/gfs_meta_bwx.sh
@@ -24,7 +24,7 @@ set -x
export PS4='BWX:$SECONDS + '
mkdir -p -m 775 $DATA/BWX
cd $DATA/BWX
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
mdl=gfs
MDL="GFS"
diff --git a/gempak/ush/gfs_meta_comp.sh b/gempak/ush/gfs_meta_comp.sh
index 9bd27c5736..e033d11bd8 100755
--- a/gempak/ush/gfs_meta_comp.sh
+++ b/gempak/ush/gfs_meta_comp.sh
@@ -29,7 +29,7 @@ export PS4='COMP:$SECONDS + '
rm -Rf $DATA/COMP $DATA/GEMPAK_META_COMP
mkdir -p -m 775 $DATA/COMP $DATA/GEMPAK_META_COMP
cd $DATA/COMP
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
export COMPONENT=${COMPONENT:-atmos}
diff --git a/gempak/ush/gfs_meta_crb.sh b/gempak/ush/gfs_meta_crb.sh
index 82fa7795e8..181afab6c1 100755
--- a/gempak/ush/gfs_meta_crb.sh
+++ b/gempak/ush/gfs_meta_crb.sh
@@ -17,7 +17,7 @@ set -x
export PS4='crb:$SECONDS + '
mkdir -p -m 775 $DATA/crb
cd $DATA/crb
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
#
mdl=gfs
MDL=GFS
diff --git a/gempak/ush/gfs_meta_hi.sh b/gempak/ush/gfs_meta_hi.sh
index 2b47474e12..6167855ae2 100755
--- a/gempak/ush/gfs_meta_hi.sh
+++ b/gempak/ush/gfs_meta_hi.sh
@@ -19,7 +19,7 @@
set -xa
mkdir -p -m 775 $DATA/mrfhi
cd $DATA/mrfhi
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
device="nc | mrfhi.meta"
diff --git a/gempak/ush/gfs_meta_hur.sh b/gempak/ush/gfs_meta_hur.sh
index aed25d6d78..04224ee39b 100755
--- a/gempak/ush/gfs_meta_hur.sh
+++ b/gempak/ush/gfs_meta_hur.sh
@@ -25,7 +25,7 @@ set -x
export PS4='hur:$SECONDS + '
mkdir -p -m 775 $DATA/hur
cd $DATA/hur
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
mdl=gfs
MDL=GFS
diff --git a/gempak/ush/gfs_meta_mar_atl.sh b/gempak/ush/gfs_meta_mar_atl.sh
index c8db3e59d4..b76a25f247 100755
--- a/gempak/ush/gfs_meta_mar_atl.sh
+++ b/gempak/ush/gfs_meta_mar_atl.sh
@@ -12,7 +12,7 @@ set -x
export PS4='MAR_ATL:$SECONDS + '
mkdir -p -m 775 $DATA/MAR_ATL
cd $DATA/MAR_ATL
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
mdl=gfs
MDL="GFS"
diff --git a/gempak/ush/gfs_meta_mar_comp.sh b/gempak/ush/gfs_meta_mar_comp.sh
index a55fa3c642..0c179b6270 100755
--- a/gempak/ush/gfs_meta_mar_comp.sh
+++ b/gempak/ush/gfs_meta_mar_comp.sh
@@ -18,7 +18,7 @@ rm -Rf $DATA/GEMPAK_META_MAR
mkdir -p -m 775 $DATA/GEMPAK_META_MAR $DATA/MAR_COMP
cd $DATA/MAR_COMP
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
export COMPONENT=${COMPONENT:-atmos}
diff --git a/gempak/ush/gfs_meta_mar_pac.sh b/gempak/ush/gfs_meta_mar_pac.sh
index b44f60a2f7..06165e837c 100755
--- a/gempak/ush/gfs_meta_mar_pac.sh
+++ b/gempak/ush/gfs_meta_mar_pac.sh
@@ -12,7 +12,7 @@ set -x
export PS4='MAR_PAC:$SECONDS + '
mkdir -p -m 775 $DATA/MAR_PAC
cd $DATA/MAR_PAC
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
mdl=gfs
MDL="GFS"
diff --git a/gempak/ush/gfs_meta_mar_ql.sh b/gempak/ush/gfs_meta_mar_ql.sh
index f1abf3d395..71ee9d2fee 100755
--- a/gempak/ush/gfs_meta_mar_ql.sh
+++ b/gempak/ush/gfs_meta_mar_ql.sh
@@ -12,7 +12,7 @@ set -x
export PS4='MAR_QL_F${fend}:$SECONDS + '
mkdir -p -m 775 $DATA/MAR_QL
cd $DATA/MAR_QL
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
mdl=gfs
MDL="GFS"
diff --git a/gempak/ush/gfs_meta_mar_skewt.sh b/gempak/ush/gfs_meta_mar_skewt.sh
index 040e09e932..a49439d6a0 100755
--- a/gempak/ush/gfs_meta_mar_skewt.sh
+++ b/gempak/ush/gfs_meta_mar_skewt.sh
@@ -12,7 +12,7 @@ set -x
export PS4='MAR_SKEWT:$SECONDS + '
mkdir -p -m 775 $DATA/MAR_SKEWT
cd $DATA/MAR_SKEWT
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
mdl=gfs
MDL="GFS"
diff --git a/gempak/ush/gfs_meta_mar_ver.sh b/gempak/ush/gfs_meta_mar_ver.sh
index 63ccba00ed..79f4fc7096 100755
--- a/gempak/ush/gfs_meta_mar_ver.sh
+++ b/gempak/ush/gfs_meta_mar_ver.sh
@@ -12,7 +12,7 @@ set -x
export PS4='MAR_VER:$SECONDS + '
mkdir -p -m 775 $DATA/MAR_VER
cd $DATA/MAR_VER
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
mdl=gfs
MDL="GFS"
diff --git a/gempak/ush/gfs_meta_nhsh.sh b/gempak/ush/gfs_meta_nhsh.sh
index 3e0146270e..6e6981c2df 100755
--- a/gempak/ush/gfs_meta_nhsh.sh
+++ b/gempak/ush/gfs_meta_nhsh.sh
@@ -19,7 +19,7 @@
set -xa
mkdir -p -m 775 $DATA/mrfnhsh
cd $DATA/mrfnhsh
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
PDY2=$(echo $PDY | cut -c3-)
diff --git a/gempak/ush/gfs_meta_opc_na_ver b/gempak/ush/gfs_meta_opc_na_ver
index 8d5f394b3d..3c0798ebc6 100755
--- a/gempak/ush/gfs_meta_opc_na_ver
+++ b/gempak/ush/gfs_meta_opc_na_ver
@@ -12,7 +12,7 @@ set -x
export PS4='OPC_NA_VER_F${fend}:$SECONDS + '
mkdir -p -m 775 $DATA/OPC_NA_VER_F${fend}
cd $DATA/OPC_NA_VER_F${fend}
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
export COMPONENT=${COMPONENT:-atmos}
diff --git a/gempak/ush/gfs_meta_opc_np_ver b/gempak/ush/gfs_meta_opc_np_ver
index 5cb9fba3c9..f9f3fc88ab 100755
--- a/gempak/ush/gfs_meta_opc_np_ver
+++ b/gempak/ush/gfs_meta_opc_np_ver
@@ -12,7 +12,7 @@ set -x
export PS4='OPC_NP_VER_F${fend}:$SECONDS + '
mkdir -p -m 775 $DATA/OPC_NP_VER_F${fend}
cd $DATA/OPC_NP_VER_F${fend}
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
#
export COMPONENT=${COMPONENT:-atmos}
diff --git a/gempak/ush/gfs_meta_precip.sh b/gempak/ush/gfs_meta_precip.sh
index cf3db9cbae..a21bcc7d98 100755
--- a/gempak/ush/gfs_meta_precip.sh
+++ b/gempak/ush/gfs_meta_precip.sh
@@ -11,7 +11,7 @@ set -x
export PS4='qpf:$SECONDS + '
mkdir -p -m 775 $DATA/precip
cd $DATA/precip
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
#
# Set model and metafile naming conventions
diff --git a/gempak/ush/gfs_meta_qpf.sh b/gempak/ush/gfs_meta_qpf.sh
index 49ca0d8bd4..85cd7b94f8 100755
--- a/gempak/ush/gfs_meta_qpf.sh
+++ b/gempak/ush/gfs_meta_qpf.sh
@@ -26,7 +26,7 @@ set -x
export PS4='qpf:$SECONDS + '
mkdir -p -m 775 $DATA/qpf
cd $DATA/qpf
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
mdl=gfs
MDL=GFS
diff --git a/gempak/ush/gfs_meta_sa.sh b/gempak/ush/gfs_meta_sa.sh
index 47984e641d..1bd2ff7b59 100755
--- a/gempak/ush/gfs_meta_sa.sh
+++ b/gempak/ush/gfs_meta_sa.sh
@@ -24,7 +24,7 @@ set -x
export PS4='SA:$SECONDS + '
mkdir -p -m 775 $DATA/SA
cd $DATA/SA
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
mdl=gfs
MDL=GFS
diff --git a/gempak/ush/gfs_meta_sa2.sh b/gempak/ush/gfs_meta_sa2.sh
index a566031030..de4b7775da 100755
--- a/gempak/ush/gfs_meta_sa2.sh
+++ b/gempak/ush/gfs_meta_sa2.sh
@@ -19,7 +19,7 @@ set -x
echo " start with ukmet_gfs_meta_sa2.sh"
export PS4='SA2:$SECONDS + '
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
export COMPONENT=${COMPONENT:-atmos}
diff --git a/gempak/ush/gfs_meta_trop.sh b/gempak/ush/gfs_meta_trop.sh
index d0cc0dbd14..a66cb22c74 100755
--- a/gempak/ush/gfs_meta_trop.sh
+++ b/gempak/ush/gfs_meta_trop.sh
@@ -29,7 +29,7 @@ set -x
export PS4='TROP:$SECONDS + '
mkdir -p -m 775 $DATA/TROP
cd $DATA/TROP
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
mdl=gfs
MDL=GFS
diff --git a/gempak/ush/gfs_meta_us.sh b/gempak/ush/gfs_meta_us.sh
index 7a818c338b..495cbc5839 100755
--- a/gempak/ush/gfs_meta_us.sh
+++ b/gempak/ush/gfs_meta_us.sh
@@ -22,7 +22,7 @@ set -xa
rm -rf $DATA/us
mkdir -p -m 775 $DATA/us
cd $DATA/us
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
device="nc | gfs.meta"
PDY2=$(echo $PDY | cut -c3-)
diff --git a/gempak/ush/gfs_meta_usext.sh b/gempak/ush/gfs_meta_usext.sh
index dc522bb896..3db7c27be4 100755
--- a/gempak/ush/gfs_meta_usext.sh
+++ b/gempak/ush/gfs_meta_usext.sh
@@ -28,12 +28,12 @@
set -xa
mkdir -p -m 775 $DATA/mrfus
cd $DATA/mrfus
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
device="nc | mrf.meta"
-#XXW cp $FIXgempak/model/gfs/ak_sfstns.tbl alaska.tbl
-cp $FIXgempak/ak_sfstns.tbl alaska.tbl
+#XXW cp ${HOMEgfs}/gempak/fix/model/gfs/ak_sfstns.tbl alaska.tbl
+cp ${HOMEgfs}/gempak/fix/ak_sfstns.tbl alaska.tbl
month=$(echo $PDY | cut -c5,6)
if [ $month -ge 5 -a $month -le 9 ] ; then
diff --git a/gempak/ush/gfs_meta_ver.sh b/gempak/ush/gfs_meta_ver.sh
index d63f6bc6df..89a413952e 100755
--- a/gempak/ush/gfs_meta_ver.sh
+++ b/gempak/ush/gfs_meta_ver.sh
@@ -26,7 +26,7 @@ set -x
export PS4='VER:$SECONDS + '
mkdir -p -m 775 $DATA/VER
cd $DATA/VER
-cp $FIXgempak/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
export COMPONENT=${COMPONENT:-atmos}
diff --git a/jobs/JGDAS_ATMOS_GEMPAK b/jobs/JGDAS_ATMOS_GEMPAK
index 1535e07ae3..55aca00cee 100755
--- a/jobs/JGDAS_ATMOS_GEMPAK
+++ b/jobs/JGDAS_ATMOS_GEMPAK
@@ -11,7 +11,6 @@ export EXECgfs=${EXECgfs:-${HOMEgfs}/exec}
export PARMgfs=${PARMgfs:-${HOMEgfs}/parm}
export PARMwmo=${PARMwmo:-${HOMEgfs}/parm/wmo}
export PARMproduct=${PARMproduct:-${HOMEgfs}/parm/product}
-export FIXgempak=${FIXgempak:-${HOMEgfs}/gempak/fix}
export USHgempak=${USHgempak:-${HOMEgfs}/gempak/ush}
export SRCgfs=${SRCgfs:-${HOMEgfs}/scripts}
export UTILgfs=${UTILgfs:-${HOMEgfs}/util}
diff --git a/jobs/JGDAS_ATMOS_GEMPAK_META_NCDC b/jobs/JGDAS_ATMOS_GEMPAK_META_NCDC
index 6948d29df6..92b56f10b8 100755
--- a/jobs/JGDAS_ATMOS_GEMPAK_META_NCDC
+++ b/jobs/JGDAS_ATMOS_GEMPAK_META_NCDC
@@ -17,7 +17,6 @@ export EXECgfs=${EXECgfs:-${HOMEgfs}/exec}
export PARMgfs=${PARMgfs:-${HOMEgfs}/parm}
export PARMwmo=${PARMwmo:-${HOMEgfs}/parm/wmo}
export PARMproduct=${PARMproduct:-${HOMEgfs}/parm/product}
-export FIXgempak=${FIXgempak:-${HOMEgfs}/gempak/fix}
export USHgempak=${USHgempak:-${HOMEgfs}/gempak/ush}
export SRCgfs=${SRCgfs:-${HOMEgfs}/scripts}
export UTILgfs=${UTILgfs:-${HOMEgfs}/util}
@@ -26,7 +25,7 @@ export UTILgfs=${UTILgfs:-${HOMEgfs}/util}
# Now set up GEMPAK/NTRANS environment
#
-cp ${FIXgempak}/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
###################################
# Specify NET and RUN Name and model
diff --git a/jobs/JGDAS_ENKF_FCST b/jobs/JGDAS_ENKF_FCST
deleted file mode 100755
index 53408df8cf..0000000000
--- a/jobs/JGDAS_ENKF_FCST
+++ /dev/null
@@ -1,84 +0,0 @@
-#! /usr/bin/env bash
-
-source "${HOMEgfs}/ush/preamble.sh"
-source "${HOMEgfs}/ush/jjob_header.sh" -e "efcs" -c "base fcst efcs"
-
-
-##############################################
-# Set variables used in the script
-##############################################
-export CDUMP=${RUN/enkf}
-
-##############################################
-# Begin JOB SPECIFIC work
-##############################################
-
-export CASE=${CASE_ENS}
-
-YMD=${PDY} HH=${cyc} generate_com -rx COM_TOP
-
-
-# Forecast length for EnKF forecast
-export FHMIN=${FHMIN_ENKF}
-export FHOUT=${FHOUT_ENKF}
-export FHMAX=${FHMAX_ENKF}
-
-# Get ENSBEG/ENSEND from ENSGRP and NMEM_EFCSGRP
-if [[ $CDUMP == "gfs" ]]; then
- export NMEM_EFCSGRP=${NMEM_EFCSGRP_GFS:-${NMEM_EFCSGRP:-1}}
-fi
-export ENSEND=$((NMEM_EFCSGRP * 10#${ENSGRP}))
-export ENSBEG=$((ENSEND - NMEM_EFCSGRP + 1))
-
-if [[ ${DO_WAVE} == "YES" ]]; then
- declare -rx RUNwave="${RUN}wave"
-fi
-
-###############################################################
-# Run relevant script
-
-${ENKFFCSTSH:-${SCRgfs}/exgdas_enkf_fcst.sh}
-status=$?
-[[ ${status} -ne 0 ]] && exit ${status}
-
-
-# Double check the status of members in ENSGRP
-EFCSGRP="${COM_TOP}/efcs.grp${ENSGRP}"
-npass=0
-if [ -f ${EFCSGRP} ]; then
- npass=$(grep "PASS" ${EFCSGRP} | wc -l)
-fi
-echo "${npass}/${NMEM_EFCSGRP} members successfull in efcs.grp${ENSGRP}"
-if [ ${npass} -ne ${NMEM_EFCSGRP} ]; then
- echo "FATAL ERROR: Failed members in group ${ENSGRP}, ABORT!"
- cat ${EFCSGRP}
- exit 99
-fi
-
-
-##############################################
-# Send Alerts
-##############################################
-if [ ${SENDDBN} = YES ] ; then
- ${DBNROOT}/bin/dbn_alert MODEL ENKF1_MSC_fcsstat ${job} ${EFCSGRP}
-fi
-
-
-##############################################
-# End JOB SPECIFIC work
-##############################################
-
-##############################################
-# Final processing
-##############################################
-if [ -e "${pgmout}" ] ; then
- cat ${pgmout}
-fi
-
-##########################################
-# Remove the Temporary working directory
-##########################################
-cd ${DATAROOT}
-[[ ${KEEPDATA} = "NO" ]] && rm -rf ${DATA}
-
-exit 0
diff --git a/jobs/JGDAS_GLOBAL_OCEAN_ANALYSIS_BMAT b/jobs/JGDAS_GLOBAL_OCEAN_ANALYSIS_BMAT
index 4a8242abfb..20b669ab4c 100755
--- a/jobs/JGDAS_GLOBAL_OCEAN_ANALYSIS_BMAT
+++ b/jobs/JGDAS_GLOBAL_OCEAN_ANALYSIS_BMAT
@@ -3,7 +3,7 @@ source "${HOMEgfs}/ush/preamble.sh"
export WIPE_DATA="NO"
export DATA="${DATAROOT}/${RUN}ocnanal_${cyc}"
-source "${HOMEgfs}/ush/jjob_header.sh" -e "ocnanalrun" -c "base ocnanal ocnanalrun"
+source "${HOMEgfs}/ush/jjob_header.sh" -e "ocnanalbmat" -c "base ocnanal ocnanalbmat"
##############################################
diff --git a/jobs/JGFS_ATMOS_AWIPS_20KM_1P0DEG b/jobs/JGFS_ATMOS_AWIPS_20KM_1P0DEG
index 516c7a403b..d2277bb0da 100755
--- a/jobs/JGFS_ATMOS_AWIPS_20KM_1P0DEG
+++ b/jobs/JGFS_ATMOS_AWIPS_20KM_1P0DEG
@@ -14,7 +14,6 @@ export EXECgfs=${EXECgfs:-${HOMEgfs}/exec}
export PARMgfs=${PARMgfs:-${HOMEgfs}/parm}
export PARMwmo=${PARMwmo:-${HOMEgfs}/parm/wmo}
export PARMproduct=${PARMproduct:-${HOMEgfs}/parm/product}
-export FIXgfs=${FIXgfs:-${HOMEgfs}/fix}
###################################
# Specify NET and RUN Name and model
diff --git a/jobs/JGFS_ATMOS_AWIPS_G2 b/jobs/JGFS_ATMOS_AWIPS_G2
index 5bd7749997..3503a92b08 100755
--- a/jobs/JGFS_ATMOS_AWIPS_G2
+++ b/jobs/JGFS_ATMOS_AWIPS_G2
@@ -17,7 +17,6 @@ export EXECgfs=${EXECgfs:-${HOMEgfs}/exec}
export PARMgfs=${PARMgfs:-${HOMEgfs}/parm}
export PARMwmo=${PARMwmo:-${HOMEgfs}/parm/wmo}
export PARMproduct=${PARMproduct:-${HOMEgfs}/parm/product}
-export FIXgfs=${FIXgfs:-${HOMEgfs}/fix}
export UTILgfs=${UTILgfs:-${HOMEgfs}/util}
###################################
diff --git a/jobs/JGFS_ATMOS_FBWIND b/jobs/JGFS_ATMOS_FBWIND
index e04b06c0d6..d640907c5c 100755
--- a/jobs/JGFS_ATMOS_FBWIND
+++ b/jobs/JGFS_ATMOS_FBWIND
@@ -16,7 +16,6 @@ export EXECgfs=${EXECgfs:-${HOMEgfs}/exec}
export PARMgfs=${PARMgfs:-${HOMEgfs}/parm}
export PARMwmo=${PARMwmo:-${HOMEgfs}/parm/wmo}
export PARMproduct=${PARMproduct:-${HOMEgfs}/parm/product}
-export FIXgfs=${FIXgfs:-${HOMEgfs}/fix}
export UTILgfs=${UTILgfs:-${HOMEgfs}/util}
###################################
diff --git a/jobs/JGFS_ATMOS_GEMPAK b/jobs/JGFS_ATMOS_GEMPAK
index ddf10342d2..ff7479daf2 100755
--- a/jobs/JGFS_ATMOS_GEMPAK
+++ b/jobs/JGFS_ATMOS_GEMPAK
@@ -10,7 +10,6 @@ source "${HOMEgfs}/ush/jjob_header.sh" -e "gempak" -c "base gempak"
export EXECgfs=${EXECgfs:-${HOMEgfs}/exec}
export PARMgfs=${PARMgfs:-${HOMEgfs}/parm}
export EXPDIR=${EXPDIR:-${HOMEgfs}/parm/config}
-export FIXgempak=${FIXgempak:-${HOMEgfs}/gempak/fix}
export USHgempak=${USHgempak:-${HOMEgfs}/gempak/ush}
export SRCgfs=${SRCgfs:-${HOMEgfs}/scripts}
diff --git a/jobs/JGFS_ATMOS_GEMPAK_META b/jobs/JGFS_ATMOS_GEMPAK_META
index 8e1c05763f..f3573419c5 100755
--- a/jobs/JGFS_ATMOS_GEMPAK_META
+++ b/jobs/JGFS_ATMOS_GEMPAK_META
@@ -24,11 +24,10 @@ export MP_DEBUG_NOTIMEOUT=yes
export EXECgfs=${EXECgfs:-${HOMEgfs}/exec}
export PARMgfs=${PARMgfs:-${HOMEgfs}/parm}
export EXPDIR=${EXPDIR:-${HOMEgfs}/parm/config}
-export FIXgempak=${FIXgempak:-${HOMEgfs}/gempak/fix}
export USHgempak=${USHgempak:-${HOMEgfs}/gempak/ush}
export SRCgfs=${SRCgfs:-${HOMEgfs}/scripts}
-cp ${FIXgempak}/datatype.tbl datatype.tbl
+cp ${HOMEgfs}/gempak/fix/datatype.tbl datatype.tbl
#############################################
#set the fcst hrs for all the cycles
diff --git a/jobs/JGFS_ATMOS_GEMPAK_NCDC_UPAPGIF b/jobs/JGFS_ATMOS_GEMPAK_NCDC_UPAPGIF
index 58b24c5e49..aa0acf445e 100755
--- a/jobs/JGFS_ATMOS_GEMPAK_NCDC_UPAPGIF
+++ b/jobs/JGFS_ATMOS_GEMPAK_NCDC_UPAPGIF
@@ -15,7 +15,6 @@ source "${HOMEgfs}/ush/jjob_header.sh" -e "gempak_gif" -c "base"
export EXECgfs=${EXECgfs:-${HOMEgfs}/exec}
export PARMgfs=${PARMgfs:-${HOMEgfs}/parm}
export EXPDIR=${EXPDIR:-${HOMEgfs}/parm/config}
-export FIXgfs=${FIXgfs:-${HOMEgfs}/gempak/fix}
export USHgempak=${USHgempak:-${HOMEgfs}/gempak/ush}
export SRCgfs=${SRCgfs:-${HOMEgfs}/scripts}
export UTILgfs=${UTILgfs:-${HOMEgfs}/util}
@@ -24,7 +23,6 @@ export UTILgfs=${UTILgfs:-${HOMEgfs}/util}
# Set up the GEMPAK directory
#######################################
export HOMEgempak=${HOMEgempak:-${HOMEgfs}/gempak}
-export FIXgempak=${FIXgempak:-${HOMEgempak}/fix}
export USHgempak=${USHgempak:-${HOMEgempak}/ush}
export MP_PULSE=0
diff --git a/jobs/JGFS_ATMOS_GEMPAK_PGRB2_SPEC b/jobs/JGFS_ATMOS_GEMPAK_PGRB2_SPEC
index 47415a39ff..8b17f96a22 100755
--- a/jobs/JGFS_ATMOS_GEMPAK_PGRB2_SPEC
+++ b/jobs/JGFS_ATMOS_GEMPAK_PGRB2_SPEC
@@ -13,7 +13,6 @@ source "${HOMEgfs}/ush/jjob_header.sh" -e "gempak_spec" -c "base"
export EXECgfs="${EXECgfs:-${HOMEgfs}/exec}"
export PARMgfs="${PARMgfs:-${HOMEgfs}/parm}"
export EXPDIR="${EXPDIR:-${HOMEgfs}/parm/config}"
-export FIXgempak="${FIXgempak:-${HOMEgfs}/gempak/fix}"
export USHgempak="${USHgempak:-${HOMEgfs}/gempak/ush}"
export SRCgfs="${SRCgfs:-${HOMEgfs}/scripts}"
diff --git a/jobs/JGFS_ATMOS_PGRB2_SPEC_NPOESS b/jobs/JGFS_ATMOS_PGRB2_SPEC_NPOESS
index a98835ada2..ecebdffa3e 100755
--- a/jobs/JGFS_ATMOS_PGRB2_SPEC_NPOESS
+++ b/jobs/JGFS_ATMOS_PGRB2_SPEC_NPOESS
@@ -19,7 +19,6 @@ export PARMgfs=${PARMgfs:-${HOMEgfs}/parm}
export EXPDIR=${EXPDIR:-${HOMEgfs}/parm/config}
export PARMwmo=${PARMwmo:-${HOMEgfs}/parm/wmo}
export PARMproduct=${PARMproduct:-${HOMEgfs}/parm/product}
-export FIXgfs=${FIXgfs:-${HOMEgfs}/fix}
###################################
# Specify NET and RUN Name and model
diff --git a/jobs/JGFS_ATMOS_POSTSND b/jobs/JGFS_ATMOS_POSTSND
index 721dd27628..4e99ef7a46 100755
--- a/jobs/JGFS_ATMOS_POSTSND
+++ b/jobs/JGFS_ATMOS_POSTSND
@@ -24,7 +24,6 @@ export DBNROOT=${DBNROOT:-${UTILROOT}/fakedbn}
export HOMEbufrsnd=${HOMEbufrsnd:-${HOMEgfs}}
export EXECbufrsnd=${EXECbufrsnd:-${HOMEbufrsnd}/exec}
-export FIXbufrsnd=${FIXbufrsnd:-${HOMEbufrsnd}/fix/product}
export PARMbufrsnd=${PARMbufrsnd:-${HOMEbufrsnd}/parm/product}
export USHbufrsnd=${USHbufrsnd:-${HOMEbufrsnd}/ush}
export SCRbufrsnd=${SCRbufrsnd:-${HOMEbufrsnd}/scripts}
diff --git a/jobs/JGLOBAL_ARCHIVE b/jobs/JGLOBAL_ARCHIVE
index e6c016e703..235084e631 100755
--- a/jobs/JGLOBAL_ARCHIVE
+++ b/jobs/JGLOBAL_ARCHIVE
@@ -14,16 +14,15 @@ YMD=${PDY} HH=${cyc} generate_com -rx COM_ATMOS_ANALYSIS COM_ATMOS_BUFR COM_ATMO
COM_ATMOS_TRACK COM_ATMOS_WMO \
COM_CHEM_HISTORY COM_CHEM_ANALYSIS\
COM_MED_RESTART \
- COM_ICE_HISTORY COM_ICE_INPUT COM_ICE_RESTART \
+ 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_XSECT COM_OCEAN_2D COM_OCEAN_3D \
+ COM_OCEAN_HISTORY COM_OCEAN_INPUT COM_OCEAN_RESTART COM_OCEAN_GRIB COM_OCEAN_NETCDF \
COM_OCEAN_ANALYSIS \
COM_WAVE_GRID COM_WAVE_HISTORY COM_WAVE_STATION \
- COM_ATMOS_OZNMON COM_ATMOS_RADMON COM_ATMOS_MINMON
+ COM_ATMOS_OZNMON COM_ATMOS_RADMON COM_ATMOS_MINMON COM_CONF
for grid in "0p25" "0p50" "1p00"; do
YMD=${PDY} HH=${cyc} GRID=${grid} generate_com -rx "COM_ATMOS_GRIB_${grid}:COM_ATMOS_GRIB_GRID_TMPL"
- YMD=${PDY} HH=${cyc} GRID=${grid} generate_com -rx "COM_OCEAN_GRIB_${grid}:COM_OCEAN_GRIB_GRID_TMPL"
done
###############################################################
diff --git a/jobs/JGLOBAL_ATMOS_ANALYSIS b/jobs/JGLOBAL_ATMOS_ANALYSIS
index 9e5850bfc3..3d7a4278a2 100755
--- a/jobs/JGLOBAL_ATMOS_ANALYSIS
+++ b/jobs/JGLOBAL_ATMOS_ANALYSIS
@@ -79,7 +79,7 @@ export PREPQCPF="${COM_OBS}/${OPREFIX}prepbufr.acft_profiles"
# Copy fix file for obsproc # TODO: Why is this necessary?
if [[ ${RUN} = "gfs" ]]; then
mkdir -p ${ROTDIR}/fix
- cp ${FIXgsi}/prepobs_errtable.global ${ROTDIR}/fix/
+ cp ${FIXgfs}/gsi/prepobs_errtable.global ${ROTDIR}/fix/
fi
diff --git a/jobs/JGLOBAL_ATMOS_POST_MANAGER b/jobs/JGLOBAL_ATMOS_POST_MANAGER
index 7c726bc2ad..797d26953b 100755
--- a/jobs/JGLOBAL_ATMOS_POST_MANAGER
+++ b/jobs/JGLOBAL_ATMOS_POST_MANAGER
@@ -17,7 +17,6 @@ export RUN=${RUN:-gfs}
####################################
export HOMEgfs=${HOMEgfs:-${PACKAGEROOT}/gfs.${gfs_ver}}
export EXECgfs=${HOMEgfs:-${HOMEgfs}/exec}
-export FIXgfs=${HOMEgfs:-${HOMEgfs}/fix}
export PARMgfs=${HOMEgfs:-${HOMEgfs}/parm}
export USHgfs=${HOMEgfs:-${HOMEgfs}/ush}
diff --git a/jobs/JGLOBAL_ATMOS_SFCANL b/jobs/JGLOBAL_ATMOS_SFCANL
index 0d709e56dd..3d897db4c3 100755
--- a/jobs/JGLOBAL_ATMOS_SFCANL
+++ b/jobs/JGLOBAL_ATMOS_SFCANL
@@ -26,7 +26,7 @@ export GPREFIX="${GDUMP}.t${gcyc}z."
export APREFIX="${CDUMP}.t${cyc}z."
YMD=${PDY} HH=${cyc} generate_com -rx COM_OBS COM_ATMOS_ANALYSIS COM_ATMOS_RESTART \
- COM_LAND_ANALYSIS
+ COM_SNOW_ANALYSIS
RUN=${GDUMP} YMD=${gPDY} HH=${gcyc} generate_com -rx \
COM_OBS_PREV:COM_OBS_TMPL \
diff --git a/jobs/JGLOBAL_FORECAST b/jobs/JGLOBAL_FORECAST
index b2825af54f..bfdc7e3688 100755
--- a/jobs/JGLOBAL_FORECAST
+++ b/jobs/JGLOBAL_FORECAST
@@ -1,40 +1,19 @@
#! /usr/bin/env bash
source "${HOMEgfs}/ush/preamble.sh"
-source "${HOMEgfs}/ush/jjob_header.sh" -e "fcst" -c "base fcst"
-
-##############################################
-# Set variables used in the script
-##############################################
-export CDUMP=${RUN/enkf}
+if (( 10#${ENSMEM:-0} > 0 )); then
+ source "${HOMEgfs}/ush/jjob_header.sh" -e "efcs" -c "base fcst efcs"
+else
+ source "${HOMEgfs}/ush/jjob_header.sh" -e "fcst" -c "base fcst"
+fi
##############################################
# Begin JOB SPECIFIC work
##############################################
# Restart conditions for GFS cycle come from GDAS
-rCDUMP=${CDUMP}
-[[ ${CDUMP} = "gfs" ]] && export rCDUMP="gdas"
-
-# Forecast length for GFS forecast
-case ${RUN} in
- *gfs | *gefs)
- # shellcheck disable=SC2153
- export FHMAX=${FHMAX_GFS}
- # shellcheck disable=SC2153
- export FHOUT=${FHOUT_GFS}
- export FHMAX_HF=${FHMAX_HF_GFS}
- export FHOUT_HF=${FHOUT_HF_GFS}
- ;;
- *gdas)
- export FHMAX_HF=0
- export FHOUT_HF=0
- ;;
- *)
- echo "FATAL ERROR: Unsupported RUN '${RUN}'"
- exit 1
-esac
-
+rCDUMP=${RUN}
+[[ ${RUN} == "gfs" ]] && export rCDUMP="gdas"
# Ignore possible spelling error (nothing is misspelled)
# shellcheck disable=SC2153
@@ -78,11 +57,21 @@ fi
###############################################################
# Run relevant exglobal script
-
+###############################################################
${FORECASTSH:-${SCRgfs}/exglobal_forecast.sh}
status=$?
-[[ ${status} -ne 0 ]] && exit ${status}
-
+[[ ${status} -ne 0 ]] && exit "${status}"
+
+# Send DBN alerts for EnKF
+# TODO: Should these be in post manager instead?
+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"
+ fi
+ done
+fi
##############################################
# End JOB SPECIFIC work
@@ -91,15 +80,14 @@ status=$?
##############################################
# Final processing
##############################################
-if [ -e "${pgmout}" ] ; then
- cat ${pgmout}
+if [[ -e "${pgmout}" ]] ; then
+ cat "${pgmout}"
fi
##########################################
# Remove the Temporary working directory
##########################################
-cd ${DATAROOT}
-[[ ${KEEPDATA} = "NO" ]] && rm -rf ${DATA}
-
+cd "${DATAROOT}" || true
+[[ ${KEEPDATA} = "NO" ]] && rm -rf "${DATA}"
exit 0
diff --git a/jobs/JGLOBAL_OCEANICE_PRODUCTS b/jobs/JGLOBAL_OCEANICE_PRODUCTS
new file mode 100755
index 0000000000..1d8c6b42c6
--- /dev/null
+++ b/jobs/JGLOBAL_OCEANICE_PRODUCTS
@@ -0,0 +1,40 @@
+#! /usr/bin/env bash
+
+source "${HOMEgfs}/ush/preamble.sh"
+source "${HOMEgfs}/ush/jjob_header.sh" -e "oceanice_products" -c "base oceanice_products"
+
+
+##############################################
+# Begin JOB SPECIFIC work
+##############################################
+
+# Construct COM variables from templates
+YMD="${PDY}" HH="${cyc}" generate_com -rx "COM_${COMPONENT^^}_HISTORY"
+YMD="${PDY}" HH="${cyc}" generate_com -rx "COM_${COMPONENT^^}_GRIB"
+YMD="${PDY}" HH="${cyc}" generate_com -rx "COM_${COMPONENT^^}_NETCDF"
+
+###############################################################
+# Run exglobal script
+"${HOMEgfs}/scripts/exglobal_oceanice_products.py"
+status=$?
+(( status != 0 )) && exit "${status}"
+
+##############################################
+# End JOB SPECIFIC work
+##############################################
+
+##############################################
+# Final processing
+##############################################
+if [[ -e "${pgmout}" ]]; then
+ cat "${pgmout}"
+fi
+
+##########################################
+# Remove the Temporary working directory
+##########################################
+cd "${DATAROOT}" || exit 1
+[[ "${KEEPDATA:-NO}" == "NO" ]] && rm -rf "${DATA}"
+
+
+exit 0
diff --git a/jobs/JGLOBAL_PREP_OCEAN_OBS b/jobs/JGLOBAL_PREP_OCEAN_OBS
index a100aca89c..a6fcf9c9b3 100755
--- a/jobs/JGLOBAL_PREP_OCEAN_OBS
+++ b/jobs/JGLOBAL_PREP_OCEAN_OBS
@@ -15,7 +15,7 @@ YMD=${PDY} HH=${cyc} generate_com -rx COMOUT_OBS:COM_OBS_TMPL
##############################################
# Add prep_marine_obs.py to PYTHONPATH
-export PYTHONPATH=${HOMEgfs}/sorc/gdas.cd/ush/soca:${PYTHONPATH}
+export PYTHONPATH=${HOMEgfs}/sorc/gdas.cd/ush:${PYTHONPATH}
###############################################################
# Run relevant script
@@ -38,7 +38,7 @@ if [[ -e "${pgmout}" ]] ; then
fi
##########################################
-# Handle the temporary working directory
+# Handle the temporary working directory
##########################################
cd "${DATAROOT}" || (echo "FATAL ERROR: ${DATAROOT} does not exist. ABORT!"; exit 1)
[[ ${KEEPDATA} = "NO" ]] && rm -rf "${DATA}"
diff --git a/jobs/JGLOBAL_PREP_LAND_OBS b/jobs/JGLOBAL_PREP_SNOW_OBS
similarity index 86%
rename from jobs/JGLOBAL_PREP_LAND_OBS
rename to jobs/JGLOBAL_PREP_SNOW_OBS
index 025adae529..22ed977a5e 100755
--- a/jobs/JGLOBAL_PREP_LAND_OBS
+++ b/jobs/JGLOBAL_PREP_SNOW_OBS
@@ -1,7 +1,8 @@
#! /usr/bin/env bash
source "${HOMEgfs}/ush/preamble.sh"
-source "${HOMEgfs}/ush/jjob_header.sh" -e "preplandobs" -c "base preplandobs"
+export DATA=${DATA:-${DATAROOT}/${RUN}snowanl_${cyc}}
+source "${HOMEgfs}/ush/jjob_header.sh" -e "prepsnowobs" -c "base prepsnowobs"
##############################################
# Set variables used in the script
@@ -24,7 +25,7 @@ RUN=${GDUMP} YMD=${gPDY} HH=${gcyc} generate_com -rx \
###############################################################
# Run relevant script
-EXSCRIPT=${GDASLANDPREPSH:-${HOMEgfs}/scripts/exglobal_prep_land_obs.py}
+EXSCRIPT=${GDASSNOWPREPPY:-${HOMEgfs}/scripts/exglobal_prep_snow_obs.py}
${EXSCRIPT}
status=$?
[[ ${status} -ne 0 ]] && (echo "FATAL ERROR: Error executing ${EXSCRIPT}, ABORT!"; exit "${status}")
diff --git a/jobs/JGLOBAL_LAND_ANALYSIS b/jobs/JGLOBAL_SNOW_ANALYSIS
similarity index 78%
rename from jobs/JGLOBAL_LAND_ANALYSIS
rename to jobs/JGLOBAL_SNOW_ANALYSIS
index 3ff7e72a35..db1a8a8ba3 100755
--- a/jobs/JGLOBAL_LAND_ANALYSIS
+++ b/jobs/JGLOBAL_SNOW_ANALYSIS
@@ -1,7 +1,8 @@
#! /usr/bin/env bash
source "${HOMEgfs}/ush/preamble.sh"
-source "${HOMEgfs}/ush/jjob_header.sh" -e "landanl" -c "base landanl"
+export DATA=${DATA:-${DATAROOT}/${RUN}snowanl_${cyc}}
+source "${HOMEgfs}/ush/jjob_header.sh" -e "snowanl" -c "base snowanl"
##############################################
# Set variables used in the script
@@ -17,17 +18,17 @@ GDUMP="gdas"
# Begin JOB SPECIFIC work
##############################################
# Generate COM variables from templates
-YMD=${PDY} HH=${cyc} generate_com -rx COM_OBS COM_LAND_ANALYSIS COM_CONF
+YMD=${PDY} HH=${cyc} generate_com -rx COM_OBS COM_SNOW_ANALYSIS COM_CONF
RUN=${GDUMP} YMD=${gPDY} HH=${gcyc} generate_com -rx \
COM_ATMOS_RESTART_PREV:COM_ATMOS_RESTART_TMPL
-mkdir -m 775 -p "${COM_LAND_ANALYSIS}" "${COM_CONF}"
+mkdir -m 775 -p "${COM_SNOW_ANALYSIS}" "${COM_CONF}"
###############################################################
# Run relevant script
-EXSCRIPT=${LANDANLPY:-${HOMEgfs}/scripts/exglobal_land_analysis.py}
+EXSCRIPT=${SNOWANLPY:-${HOMEgfs}/scripts/exglobal_snow_analysis.py}
${EXSCRIPT}
status=$?
[[ ${status} -ne 0 ]] && exit "${status}"
diff --git a/jobs/JGLOBAL_WAVE_INIT b/jobs/JGLOBAL_WAVE_INIT
index 7ad742f25a..7825c33496 100755
--- a/jobs/JGLOBAL_WAVE_INIT
+++ b/jobs/JGLOBAL_WAVE_INIT
@@ -10,7 +10,6 @@ export errchk=${errchk:-err_chk}
export MP_PULSE=0
# Path to HOME Directory
-export FIXwave=${FIXwave:-${HOMEgfs}/fix/wave}
export PARMwave=${PARMwave:-${HOMEgfs}/parm/wave}
export USHwave=${USHwave:-${HOMEgfs}/ush}
export EXECwave=${EXECwave:-${HOMEgfs}/exec}
diff --git a/jobs/JGLOBAL_WAVE_POST_BNDPNT b/jobs/JGLOBAL_WAVE_POST_BNDPNT
index 9d404077fd..69200fba0b 100755
--- a/jobs/JGLOBAL_WAVE_POST_BNDPNT
+++ b/jobs/JGLOBAL_WAVE_POST_BNDPNT
@@ -9,7 +9,6 @@ export errchk=${errchk:-err_chk}
export MP_PULSE=0
# Path to HOME Directory
-export FIXwave=${FIXwave:-${HOMEgfs}/fix/wave}
export PARMwave=${PARMwave:-${HOMEgfs}/parm/wave}
export USHwave=${USHwave:-${HOMEgfs}/ush}
export EXECwave=${EXECwave:-${HOMEgfs}/exec}
diff --git a/jobs/JGLOBAL_WAVE_POST_BNDPNTBLL b/jobs/JGLOBAL_WAVE_POST_BNDPNTBLL
index 3de49fcc3b..536cadd165 100755
--- a/jobs/JGLOBAL_WAVE_POST_BNDPNTBLL
+++ b/jobs/JGLOBAL_WAVE_POST_BNDPNTBLL
@@ -13,7 +13,6 @@ export CDATE=${PDY}${cyc}
export MP_PULSE=0
# Path to HOME Directory
-export FIXwave=${FIXwave:-${HOMEgfs}/fix/wave}
export PARMwave=${PARMwave:-${HOMEgfs}/parm/wave}
export USHwave=${USHwave:-${HOMEgfs}/ush}
export EXECwave=${EXECwave:-${HOMEgfs}/exec}
diff --git a/jobs/JGLOBAL_WAVE_POST_PNT b/jobs/JGLOBAL_WAVE_POST_PNT
index 1b573435a3..9ff2f78f63 100755
--- a/jobs/JGLOBAL_WAVE_POST_PNT
+++ b/jobs/JGLOBAL_WAVE_POST_PNT
@@ -9,7 +9,6 @@ export errchk=${errchk:-err_chk}
export MP_PULSE=0
# Path to HOME Directory
-export FIXwave=${FIXwave:-${HOMEgfs}/fix/wave}
export PARMwave=${PARMwave:-${HOMEgfs}/parm/wave}
export USHwave=${USHwave:-${HOMEgfs}/ush}
export EXECwave=${EXECwave:-${HOMEgfs}/exec}
diff --git a/jobs/JGLOBAL_WAVE_POST_SBS b/jobs/JGLOBAL_WAVE_POST_SBS
index 231b793de7..2a7e5657dc 100755
--- a/jobs/JGLOBAL_WAVE_POST_SBS
+++ b/jobs/JGLOBAL_WAVE_POST_SBS
@@ -9,7 +9,6 @@ export errchk=${errchk:-err_chk}
export MP_PULSE=0
# Path to HOME Directory
-export FIXwave=${FIXwave:-${HOMEgfs}/fix/wave}
export PARMwave=${PARMwave:-${HOMEgfs}/parm/wave}
export USHwave=${USHwave:-${HOMEgfs}/ush}
export EXECwave=${EXECwave:-${HOMEgfs}/exec}
diff --git a/jobs/JGLOBAL_WAVE_PREP b/jobs/JGLOBAL_WAVE_PREP
index f246045f53..479f9b8641 100755
--- a/jobs/JGLOBAL_WAVE_PREP
+++ b/jobs/JGLOBAL_WAVE_PREP
@@ -17,7 +17,6 @@ export MP_PULSE=0
export CDO=${CDO_ROOT}/bin/cdo
# Path to HOME Directory
-export FIXwave=${FIXwave:-${HOMEgfs}/fix/wave}
export PARMwave=${PARMwave:-${HOMEgfs}/parm/wave}
export USHwave=${USHwave:-${HOMEgfs}/ush}
export EXECwave=${EXECwave:-${HOMEgfs}/exec}
diff --git a/jobs/rocoto/awips_g2.sh b/jobs/rocoto/awips_g2.sh
index 121c96d63f..ed5a10c164 100755
--- a/jobs/rocoto/awips_g2.sh
+++ b/jobs/rocoto/awips_g2.sh
@@ -44,6 +44,7 @@ for fhr3 in ${fhrlst}; do
fhmax=240
if (( fhr >= fhmin && fhr <= fhmax )); then
if ((fhr % 6 == 0)); then
+ export fcsthrs="${fhr3}"
"${AWIPSG2SH}"
fi
fi
diff --git a/jobs/rocoto/efcs.sh b/jobs/rocoto/efcs.sh
deleted file mode 100755
index c5667cb970..0000000000
--- a/jobs/rocoto/efcs.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#! /usr/bin/env bash
-
-source "${HOMEgfs}/ush/preamble.sh"
-
-###############################################################
-# Source FV3GFS workflow modules
-# TODO clean this up once ncdiag/1.1.2 is installed on WCOSS2
-source "${HOMEgfs}/ush/detect_machine.sh"
-if [[ "${MACHINE_ID}" == "wcoss2" ]]; then
- . ${HOMEgfs}/ush/load_ufswm_modules.sh
-else
- . ${HOMEgfs}/ush/load_fv3gfs_modules.sh
-fi
-status=$?
-[[ ${status} -ne 0 ]] && exit ${status}
-
-export job="efcs"
-export jobid="${job}.$$"
-
-###############################################################
-# Execute the JJOB
-"${HOMEgfs}/jobs/JGDAS_ENKF_FCST"
-status=$?
-
-exit ${status}
diff --git a/jobs/rocoto/oceanice_products.sh b/jobs/rocoto/oceanice_products.sh
new file mode 100755
index 0000000000..48816fb3a1
--- /dev/null
+++ b/jobs/rocoto/oceanice_products.sh
@@ -0,0 +1,37 @@
+#! /usr/bin/env bash
+
+source "${HOMEgfs}/ush/preamble.sh"
+
+###############################################################
+## ocean ice products driver script
+## FHRLST : forecast hour list to post-process (e.g. f000, f000_f001_f002, ...)
+###############################################################
+
+# Source FV3GFS workflow modules
+. "${HOMEgfs}/ush/load_fv3gfs_modules.sh"
+status=$?
+if (( status != 0 )); then exit "${status}"; fi
+
+###############################################################
+# setup python path for workflow utilities and tasks
+wxflowPATH="${HOMEgfs}/ush/python:${HOMEgfs}/ush/python/wxflow/src"
+PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${wxflowPATH}"
+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
+
+#---------------------------------------------------------------
+# 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
diff --git a/jobs/rocoto/ocnpost.sh b/jobs/rocoto/ocnpost.sh
deleted file mode 100755
index 5a2dc091cf..0000000000
--- a/jobs/rocoto/ocnpost.sh
+++ /dev/null
@@ -1,119 +0,0 @@
-#! /usr/bin/env bash
-
-source "${HOMEgfs}/ush/preamble.sh"
-
-###############################################################
-## CICE5/MOM6 post driver script
-## FHRGRP : forecast hour group to post-process (e.g. 0, 1, 2 ...)
-## FHRLST : forecast hourlist to be post-process (e.g. anl, f000, f000_f001_f002, ...)
-###############################################################
-
-# Source FV3GFS workflow modules
-source "${HOMEgfs}/ush/load_fv3gfs_modules.sh"
-status=$?
-(( status != 0 )) && exit "${status}"
-
-export job="ocnpost"
-export jobid="${job}.$$"
-source "${HOMEgfs}/ush/jjob_header.sh" -e "ocnpost" -c "base ocnpost"
-
-##############################################
-# Set variables used in the exglobal script
-##############################################
-export CDUMP=${RUN/enkf}
-
-##############################################
-# Begin JOB SPECIFIC work
-##############################################
-YMD=${PDY} HH=${cyc} generate_com -rx COM_OCEAN_HISTORY COM_OCEAN_2D COM_OCEAN_3D \
- COM_OCEAN_XSECT COM_ICE_HISTORY
-
-for grid in "0p50" "0p25"; do
- YMD=${PDY} HH=${cyc} GRID=${grid} generate_com -rx "COM_OCEAN_GRIB_${grid}:COM_OCEAN_GRIB_GRID_TMPL"
-done
-
-for outdir in COM_OCEAN_2D COM_OCEAN_3D COM_OCEAN_XSECT COM_OCEAN_GRIB_0p25 COM_OCEAN_GRIB_0p50; do
- if [[ ! -d "${!outdir}" ]]; then
- mkdir -p "${!outdir}"
- fi
-done
-
-fhrlst=$(echo ${FHRLST} | sed -e 's/_/ /g; s/f/ /g; s/,/ /g')
-
-export OMP_NUM_THREADS=1
-export ENSMEM=${ENSMEM:-000}
-
-export IDATE=${PDY}${cyc}
-
-for fhr in ${fhrlst}; do
- export fhr=${fhr}
- # Ignore possible spelling error (nothing is misspelled)
- # shellcheck disable=SC2153
- VDATE=$(${NDATE} "${fhr}" "${IDATE}")
- # shellcheck disable=
- declare -x VDATE
- cd "${DATA}" || exit 2
- if (( 10#${fhr} > 0 )); then
- # TODO: This portion calls NCL scripts that are deprecated (see Issue #923)
- if [[ "${MAKE_OCN_GRIB:-YES}" == "YES" ]]; then
- export MOM6REGRID=${MOM6REGRID:-${HOMEgfs}}
- "${MOM6REGRID}/scripts/run_regrid.sh"
- status=$?
- [[ ${status} -ne 0 ]] && exit "${status}"
-
- # Convert the netcdf files to grib2
- export executable=${MOM6REGRID}/exec/reg2grb2.x
- "${MOM6REGRID}/scripts/run_reg2grb2.sh"
- status=$?
- [[ ${status} -ne 0 ]] && exit "${status}"
- ${NMV} "ocn_ice${VDATE}.${ENSMEM}.${IDATE}_0p25x0p25.grb2" "${COM_OCEAN_GRIB_0p25}/"
- ${NMV} "ocn_ice${VDATE}.${ENSMEM}.${IDATE}_0p5x0p5.grb2" "${COM_OCEAN_GRIB_0p50}/"
- fi
-
- #break up ocn netcdf into multiple files:
- if [[ -f "${COM_OCEAN_2D}/ocn_2D_${VDATE}.${ENSMEM}.${IDATE}.nc" ]]; then
- echo "File ${COM_OCEAN_2D}/ocn_2D_${VDATE}.${ENSMEM}.${IDATE}.nc already exists"
- else
- ncks -x -v vo,uo,so,temp \
- "${COM_OCEAN_HISTORY}/ocn${VDATE}.${ENSMEM}.${IDATE}.nc" \
- "${COM_OCEAN_2D}/ocn_2D_${VDATE}.${ENSMEM}.${IDATE}.nc"
- status=$?
- [[ ${status} -ne 0 ]] && exit "${status}"
- fi
- if [[ -f "${COM_OCEAN_3D}/ocn_3D_${VDATE}.${ENSMEM}.${IDATE}.nc" ]]; then
- echo "File ${COM_OCEAN_3D}/ocn_3D_${VDATE}.${ENSMEM}.${IDATE}.nc already exists"
- else
- ncks -x -v Heat_PmE,LW,LwLatSens,MLD_003,MLD_0125,SSH,SSS,SST,SSU,SSV,SW,cos_rot,ePBL,evap,fprec,frazil,latent,lprec,lrunoff,sensible,sin_rot,speed,taux,tauy,wet_c,wet_u,wet_v \
- "${COM_OCEAN_HISTORY}/ocn${VDATE}.${ENSMEM}.${IDATE}.nc" \
- "${COM_OCEAN_3D}/ocn_3D_${VDATE}.${ENSMEM}.${IDATE}.nc"
- status=$?
- [[ ${status} -ne 0 ]] && exit "${status}"
- fi
- if [[ -f "${COM_OCEAN_XSECT}/ocn-temp-EQ_${VDATE}.${ENSMEM}.${IDATE}.nc" ]]; then
- echo "File ${COM_OCEAN_XSECT}/ocn-temp-EQ_${VDATE}.${ENSMEM}.${IDATE}.nc already exists"
- else
- ncks -v temp -d yh,0.0 \
- "${COM_OCEAN_3D}/ocn_3D_${VDATE}.${ENSMEM}.${IDATE}.nc" \
- "${COM_OCEAN_XSECT}/ocn-temp-EQ_${VDATE}.${ENSMEM}.${IDATE}.nc"
- status=$?
- [[ ${status} -ne 0 ]] && exit "${status}"
- fi
- if [[ -f "${COM_OCEAN_XSECT}/ocn-uo-EQ_${VDATE}.${ENSMEM}.${IDATE}.nc" ]]; then
- echo "File ${COM_OCEAN_XSECT}/ocn-uo-EQ_${VDATE}.${ENSMEM}.${IDATE}.nc already exists"
- else
- ncks -v uo -d yh,0.0 \
- "${COM_OCEAN_3D}/ocn_3D_${VDATE}.${ENSMEM}.${IDATE}.nc" \
- "${COM_OCEAN_XSECT}/ocn-uo-EQ_${VDATE}.${ENSMEM}.${IDATE}.nc"
- status=$?
- [[ ${status} -ne 0 ]] && exit "${status}"
- fi
- fi
-done
-
-# clean up working folder
-if [[ ${KEEPDATA:-"NO"} = "NO" ]] ; then rm -rf "${DATA}" ; fi
-###############################################################
-# Exit out cleanly
-
-
-exit 0
diff --git a/jobs/rocoto/preplandobs.sh b/jobs/rocoto/prepsnowobs.sh
similarity index 92%
rename from jobs/rocoto/preplandobs.sh
rename to jobs/rocoto/prepsnowobs.sh
index 6304dd611b..dae11129eb 100755
--- a/jobs/rocoto/preplandobs.sh
+++ b/jobs/rocoto/prepsnowobs.sh
@@ -8,7 +8,7 @@ source "${HOMEgfs}/ush/preamble.sh"
status=$?
[[ ${status} -ne 0 ]] && exit "${status}"
-export job="preplandobs"
+export job="prepsnowobs"
export jobid="${job}.$$"
###############################################################
@@ -20,6 +20,6 @@ export PYTHONPATH
###############################################################
# Execute the JJOB
-"${HOMEgfs}/jobs/JGLOBAL_PREP_LAND_OBS"
+"${HOMEgfs}/jobs/JGLOBAL_PREP_SNOW_OBS"
status=$?
exit "${status}"
diff --git a/jobs/rocoto/landanl.sh b/jobs/rocoto/snowanl.sh
similarity index 91%
rename from jobs/rocoto/landanl.sh
rename to jobs/rocoto/snowanl.sh
index f49b6f9f8b..627dd860f4 100755
--- a/jobs/rocoto/landanl.sh
+++ b/jobs/rocoto/snowanl.sh
@@ -8,7 +8,7 @@ source "${HOMEgfs}/ush/preamble.sh"
status=$?
[[ ${status} -ne 0 ]] && exit "${status}"
-export job="landanl"
+export job="snowanl"
export jobid="${job}.$$"
###############################################################
@@ -19,6 +19,6 @@ export PYTHONPATH
###############################################################
# Execute the JJOB
-"${HOMEgfs}/jobs/JGLOBAL_LAND_ANALYSIS"
+"${HOMEgfs}/jobs/JGLOBAL_SNOW_ANALYSIS"
status=$?
exit "${status}"
diff --git a/modulefiles/module-setup.csh.inc b/modulefiles/module-setup.csh.inc
deleted file mode 100644
index 7086326627..0000000000
--- a/modulefiles/module-setup.csh.inc
+++ /dev/null
@@ -1,87 +0,0 @@
-set __ms_shell=csh
-
-eval "if ( -d / ) set __ms_shell=tcsh"
-
-if ( { test -d /lfs/f1 } ) then
- # We are on NOAA Cactus or Dogwood
- if ( ! { module help >& /dev/null } ) then
- source /usr/share/lmod/lmod/init/$__ms_shell
- fi
- module reset
-else if ( { test -d /lfs3 } ) then
- if ( ! { module help >& /dev/null } ) then
- source /apps/lmod/lmod/init/$__ms_shell
- endif
- module purge
-else if ( { test -d /scratch1 } ) then
- # We are on NOAA Hera
- if ( ! { module help >& /dev/null } ) then
- source /apps/lmod/lmod/init/$__ms_shell
- endif
- module purge
-elif [[ -d /work ]] ; then
- # We are on MSU Orion or Hercules
- if [[ -d /apps/other ]] ; then
- # Hercules
- init_path="/apps/other/lmod/lmod/init/$__ms_shell"
- else
- # Orion
- init_path="/apps/lmod/lmod/init/$__ms_shell"
- fi
- if ( ! eval module help > /dev/null 2>&1 ) ; then
- source "${init_path}"
- fi
- module purge
-else if ( { test -d /data/prod } ) then
- # We are on SSEC S4
- if ( ! { module help >& /dev/null } ) then
- source /usr/share/lmod/lmod/init/$__ms_shell
- endif
- source /etc/profile
- module purge
-else if ( { test -d /glade } ) then
- # We are on NCAR Yellowstone
- if ( ! { module help >& /dev/null } ) then
- source /usr/share/Modules/init/$__ms_shell
- endif
- module purge
-else if ( { test -d /lustre -a -d /ncrc } ) then
- # We are on GAEA.
- if ( ! { module help >& /dev/null } ) then
- # We cannot simply load the module command. The GAEA
- # /etc/csh.login 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/csh.login here.
- source /etc/csh.login
- set __ms_source_etc_csh_login=yes
- else
- set __ms_source_etc_csh_login=no
- endif
- module purge
- unsetenv _LMFILES_
- unsetenv _LMFILES_000
- unsetenv _LMFILES_001
- unsetenv LOADEDMODULES
- module load modules
- if ( { test -d /opt/cray/ari/modulefiles } ) then
- module use -a /opt/cray/ari/modulefiles
- endif
- if ( { test -d /opt/cray/pe/ari/modulefiles } ) then
- module use -a /opt/cray/pe/ari/modulefiles
- endif
- if ( { test -d /opt/cray/pe/craype/default/modulefiles } ) then
- module use -a /opt/cray/pe/craype/default/modulefiles
- endif
- setenv NCEPLIBS /lustre/f1/pdata/ncep_shared/NCEPLIBS/lib
- if ( { test -d /lustre/f1/pdata/ncep_shared/NCEPLIBS/lib } ) then
- module use $NCEPLIBS/modulefiles
- endif
- if ( "$__ms_source_etc_csh_login" == yes ) then
- source /etc/csh.login
- unset __ms_source_etc_csh_login
- endif
-else
- # Workaround for csh limitation. Use sh to print to stderr.
- sh -c 'echo WARNING: UNKNOWN PLATFORM 1>&2'
-endif
diff --git a/modulefiles/module-setup.sh.inc b/modulefiles/module-setup.sh.inc
deleted file mode 100644
index db9dabffe1..0000000000
--- a/modulefiles/module-setup.sh.inc
+++ /dev/null
@@ -1,110 +0,0 @@
-# Create a test function for sh vs. bash detection. The name is
-# randomly generated to reduce the chances of name collision.
-__ms_function_name="setup__test_function__$$"
-eval "$__ms_function_name() { /bin/true ; }"
-
-# Determine which shell we are using
-__ms_ksh_test=$( eval '__text="text" ; if [[ $__text =~ ^(t).* ]] ; then printf "%s" ${.sh.match[1]} ; fi' 2> /dev/null | cat )
-__ms_bash_test=$( eval 'if ( set | grep '$__ms_function_name' | grep -v name > /dev/null 2>&1 ) ; then echo t ; fi ' 2> /dev/null | cat )
-
-if [[ ! -z "$__ms_ksh_test" ]] ; then
- __ms_shell=ksh
-elif [[ ! -z "$__ms_bash_test" ]] ; then
- __ms_shell=bash
-else
- # Not bash or ksh, so assume sh.
- __ms_shell=sh
-fi
-
-if [[ -d /lfs/f1 ]] ; then
- # We are on NOAA Cactus or Dogwood
- if ( ! eval module help > /dev/null 2>&1 ) ; then
- source /usr/share/lmod/lmod/init/$__ms_shell
- fi
- module reset
-elif [[ -d /mnt/lfs1 ]] ; then
- # We are on NOAA Jet
- if ( ! eval module help > /dev/null 2>&1 ) ; then
- source /apps/lmod/lmod/init/$__ms_shell
- fi
- module purge
-elif [[ -d /scratch1 ]] ; then
- # We are on NOAA Hera
- if ( ! eval module help > /dev/null 2>&1 ) ; then
- source /apps/lmod/lmod/init/$__ms_shell
- fi
- module purge
-elif [[ -d /work ]] ; then
- # We are on MSU Orion or Hercules
- if [[ -d /apps/other ]] ; then
- # Hercules
- init_path="/apps/other/lmod/lmod/init/$__ms_shell"
- else
- # Orion
- init_path="/apps/lmod/lmod/init/$__ms_shell"
- fi
- if ( ! eval module help > /dev/null 2>&1 ) ; then
- source "${init_path}"
- fi
- module purge
-elif [[ -d /glade ]] ; then
- # We are on NCAR Yellowstone
- if ( ! eval module help > /dev/null 2>&1 ) ; then
- . /usr/share/Modules/init/$__ms_shell
- fi
- module purge
-elif [[ -d /lustre && -d /ncrc ]] ; 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
- export NCEPLIBS=/lustre/f1/pdata/ncep_shared/NCEPLIBS/lib
- if [[ -d "$NCEPLIBS" ]] ; then
- module use $NCEPLIBS/modulefiles
- fi
- if [[ "$__ms_source_etc_profile" == yes ]] ; then
- source /etc/profile
- unset __ms_source_etc_profile
- fi
-elif [[ -d /data/prod ]] ; then
- # We are on SSEC's S4
- if ( ! eval module help > /dev/null 2>&1 ) ; then
- source /usr/share/lmod/lmod/init/$__ms_shell
- fi
- module purge
-else
- echo WARNING: UNKNOWN PLATFORM 1>&2
-fi
-
-unset __ms_shell
-unset __ms_ksh_test
-unset __ms_bash_test
-unset $__ms_function_name
-unset __ms_function_name
diff --git a/modulefiles/module_base.hera.lua b/modulefiles/module_base.hera.lua
index 311fb0a1cf..8703100e76 100644
--- a/modulefiles/module_base.hera.lua
+++ b/modulefiles/module_base.hera.lua
@@ -2,9 +2,8 @@ help([[
Load environment to run GFS on Hera
]])
-spack_stack_ver=(os.getenv("spack_stack_ver") or "None")
-spack_env=(os.getenv("spack_env") or "None")
-prepend_path("MODULEPATH", "/scratch1/NCEPDEV/nems/role.epic/spack-stack/spack-stack-" .. spack_stack_ver .. "/envs/" .. spack_env .. "/install/modulefiles/Core")
+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-intel-oneapi-mpi", (os.getenv("stack_impi_ver") or "None")))
@@ -33,10 +32,11 @@ 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")))
-
--- MET/METplus are not available for use with spack-stack, yet
---load(pathJoin("met", (os.getenv("met_ver") or "None")))
---load(pathJoin("metplus", (os.getenv("metplus_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"))
diff --git a/modulefiles/module_base.hercules.lua b/modulefiles/module_base.hercules.lua
index d9c8f5ed0b..5534437392 100644
--- a/modulefiles/module_base.hercules.lua
+++ b/modulefiles/module_base.hercules.lua
@@ -2,9 +2,8 @@ help([[
Load environment to run GFS on Hercules
]])
-spack_stack_ver=(os.getenv("spack_stack_ver") or "None")
-spack_env=(os.getenv("spack_env") or "None")
-prepend_path("MODULEPATH", "/work/noaa/epic/role-epic/spack-stack/hercules/spack-stack-" .. spack_stack_ver .. "/envs/" .. spack_env .. "/install/modulefiles/Core")
+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-intel-oneapi-mpi", (os.getenv("stack_impi_ver") or "None")))
@@ -12,10 +11,6 @@ load(pathJoin("intel-oneapi-mkl", (os.getenv("intel_mkl_ver") or "None")))
load(pathJoin("python", (os.getenv("python_ver") or "None")))
load(pathJoin("perl", (os.getenv("perl_ver") or "None")))
--- TODO load NCL once the SAs remove the 'depends_on' statements within it
--- NCL is a static installation and does not depend on any libraries
--- but as is will load, among others, the system netcdf-c/4.9.0 module
---load(pathJoin("ncl", (os.getenv("ncl_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")))
@@ -35,6 +30,11 @@ 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"))
diff --git a/modulefiles/module_base.jet.lua b/modulefiles/module_base.jet.lua
index 64d35da57a..55a1eb1c68 100644
--- a/modulefiles/module_base.jet.lua
+++ b/modulefiles/module_base.jet.lua
@@ -2,9 +2,8 @@ help([[
Load environment to run GFS on Jet
]])
-spack_stack_ver=(os.getenv("spack_stack_ver") or "None")
-spack_env=(os.getenv("spack_env") or "None")
-prepend_path("MODULEPATH", "/mnt/lfs4/HFIP/hfv3gfs/role.epic/spack-stack/spack-stack-" .. spack_stack_ver .. "/envs/" .. spack_env .. "/install/modulefiles/Core")
+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-intel-oneapi-mpi", (os.getenv("stack_impi_ver") or "None")))
@@ -33,6 +32,11 @@ 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"))
diff --git a/modulefiles/module_base.orion.lua b/modulefiles/module_base.orion.lua
index 65486855d0..4e2e24b82f 100644
--- a/modulefiles/module_base.orion.lua
+++ b/modulefiles/module_base.orion.lua
@@ -2,9 +2,8 @@ help([[
Load environment to run GFS on Orion
]])
-spack_stack_ver=(os.getenv("spack_stack_ver") or "None")
-spack_env=(os.getenv("spack_env") or "None")
-prepend_path("MODULEPATH", "/work/noaa/epic/role-epic/spack-stack/orion/spack-stack-" .. spack_stack_ver .. "/envs/" .. spack_env .. "/install/modulefiles/Core")
+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-intel-oneapi-mpi", (os.getenv("stack_impi_ver") or "None")))
@@ -31,10 +30,11 @@ 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")))
-
--- MET/METplus are not yet supported with spack-stack
---load(pathJoin("met", (os.getenv("met_ver") or "None")))
---load(pathJoin("metplus", (os.getenv("metplus_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"))
diff --git a/modulefiles/module_base.s4.lua b/modulefiles/module_base.s4.lua
index d99a93c3f4..d8dccc89ba 100644
--- a/modulefiles/module_base.s4.lua
+++ b/modulefiles/module_base.s4.lua
@@ -2,9 +2,8 @@ help([[
Load environment to run GFS on S4
]])
-spack_stack_ver=(os.getenv("spack_stack_ver") or "None")
-spack_env=(os.getenv("spack_env") or "None")
-prepend_path("MODULEPATH", "/data/prod/jedi/spack-stack/spack-stack-" .. spack_stack_ver .. "/envs/" .. spack_env .. "/install/modulefiles/Core")
+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-intel-oneapi-mpi", (os.getenv("stack_impi_ver") or "None")))
@@ -30,6 +29,11 @@ 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"))
diff --git a/modulefiles/module_base.wcoss2.lua b/modulefiles/module_base.wcoss2.lua
index ee4ee6a5fb..43b21ccc25 100644
--- a/modulefiles/module_base.wcoss2.lua
+++ b/modulefiles/module_base.wcoss2.lua
@@ -31,6 +31,11 @@ load(pathJoin("ncdiag", (os.getenv("ncdiag_ver") or "None")))
load(pathJoin("crtm", (os.getenv("crtm_ver") or "None")))
load(pathJoin("wgrib2", (os.getenv("wgrib2_ver") or "None")))
+prepend_path("MODULEPATH", "/apps/ops/para/libs/modulefiles/compiler/intel/19.1.3.304")
+setenv("HPC_OPT", "/apps/ops/para/libs")
+load(pathJoin("met", (os.getenv("met_ver") or "None")))
+load(pathJoin("metplus", (os.getenv("metplus_ver") or "None")))
+
--prepend_path("MODULEPATH", pathJoin("/lfs/h2/emc/global/save/emc.global/git/prepobs/v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles"))
prepend_path("MODULEPATH", pathJoin("/lfs/h2/emc/global/save/emc.global/git/prepobs/feature-GFSv17_com_reorg_log_update/modulefiles"))
load(pathJoin("prepobs", (os.getenv("prepobs_run_ver") or "None")))
diff --git a/modulefiles/module_gwci.hera.lua b/modulefiles/module_gwci.hera.lua
index 1aecddf549..3d4c413a44 100644
--- a/modulefiles/module_gwci.hera.lua
+++ b/modulefiles/module_gwci.hera.lua
@@ -2,13 +2,13 @@ help([[
Load environment to run GFS workflow setup scripts on Hera
]])
-prepend_path("MODULEPATH", "/scratch1/NCEPDEV/nems/role.epic/spack-stack/spack-stack-1.5.1/envs/gsi-addon/install/modulefiles/Core")
+prepend_path("MODULEPATH", "/scratch1/NCEPDEV/nems/role.epic/spack-stack/spack-stack-1.6.0/envs/gsi-addon-dev/install/modulefiles/Core")
load(pathJoin("stack-intel", os.getenv("2021.5.0")))
load(pathJoin("stack-intel-oneapi-mpi", os.getenv("2021.5.1")))
load(pathJoin("netcdf-c", os.getenv("4.9.2")))
-load(pathJoin("netcdf-fortran", os.getenv("4.6.0")))
+load(pathJoin("netcdf-fortran", os.getenv("4.6.1")))
load(pathJoin("nccmp","1.9.0.1"))
load(pathJoin("wgrib2", "2.0.8"))
diff --git a/modulefiles/module_gwci.hercules.lua b/modulefiles/module_gwci.hercules.lua
index 9c60aed467..179bbef114 100644
--- a/modulefiles/module_gwci.hercules.lua
+++ b/modulefiles/module_gwci.hercules.lua
@@ -2,7 +2,7 @@ help([[
Load environment to run GFS workflow ci scripts on Hercules
]])
-prepend_path("MODULEPATH", "/work/noaa/epic/role-epic/spack-stack/hercules/spack-stack-1.5.1/envs/gsi-addon/install/modulefiles/Core")
+prepend_path("MODULEPATH", "/work/noaa/epic/role-epic/spack-stack/hercules/spack-stack-1.6.0/envs/gsi-addon-env/install/modulefiles/Core")
load(pathJoin("stack-intel", os.getenv("2021.9.0")))
load(pathJoin("stack-intel-oneapi-mpi", os.getenv("2021.9.0")))
diff --git a/modulefiles/module_gwci.orion.lua b/modulefiles/module_gwci.orion.lua
index 18851ba7d4..cef7acf308 100644
--- a/modulefiles/module_gwci.orion.lua
+++ b/modulefiles/module_gwci.orion.lua
@@ -2,13 +2,13 @@ help([[
Load environment to run GFS workflow ci scripts on Orion
]])
-prepend_path("MODULEPATH", "/work/noaa/epic/role-epic/spack-stack/orion/spack-stack-1.5.1/envs/gsi-addon/install/modulefiles/Core")
+prepend_path("MODULEPATH", "/work/noaa/epic/role-epic/spack-stack/orion/spack-stack-1.6.0/envs/gsi-addon-env/install/modulefiles/Core")
load(pathJoin("stack-intel", os.getenv("2022.0.2")))
load(pathJoin("stack-intel-oneapi-mpi", os.getenv("2021.5.1")))
load(pathJoin("netcdf-c", os.getenv("4.9.2")))
-load(pathJoin("netcdf-fortran", os.getenv("4.6.0")))
+load(pathJoin("netcdf-fortran", os.getenv("4.6.1")))
load(pathJoin("nccmp","1.9.0.1"))
load(pathJoin("wgrib2", "2.0.8"))
diff --git a/modulefiles/module_gwsetup.hera.lua b/modulefiles/module_gwsetup.hera.lua
index c86cac7b02..3e8bf2d7f8 100644
--- a/modulefiles/module_gwsetup.hera.lua
+++ b/modulefiles/module_gwsetup.hera.lua
@@ -4,15 +4,17 @@ Load environment to run GFS workflow setup scripts on Hera
load(pathJoin("rocoto"))
-prepend_path("MODULEPATH", "/scratch1/NCEPDEV/nems/role.epic/spack-stack/spack-stack-1.5.1/envs/gsi-addon/install/modulefiles/Core")
+prepend_path("MODULEPATH", "/scratch1/NCEPDEV/nems/role.epic/spack-stack/spack-stack-1.6.0/envs/gsi-addon-dev/install/modulefiles/Core")
local stack_intel_ver=os.getenv("stack_intel_ver") or "2021.5.0"
-local python_ver=os.getenv("python_ver") or "3.10.8"
+local python_ver=os.getenv("python_ver") or "3.11.6"
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.18.0"
+load(pathJoin("git", git_ver))
whatis("Description: GFS run setup environment")
diff --git a/modulefiles/module_gwsetup.hercules.lua b/modulefiles/module_gwsetup.hercules.lua
index 673928605c..795b295b30 100644
--- a/modulefiles/module_gwsetup.hercules.lua
+++ b/modulefiles/module_gwsetup.hercules.lua
@@ -5,10 +5,10 @@ Load environment to run GFS workflow ci scripts on Hercules
load(pathJoin("contrib","0.1"))
load(pathJoin("rocoto","1.3.5"))
-prepend_path("MODULEPATH", "/work/noaa/epic/role-epic/spack-stack/hercules/spack-stack-1.5.1/envs/gsi-addon/install/modulefiles/Core")
+prepend_path("MODULEPATH", "/work/noaa/epic/role-epic/spack-stack/hercules/spack-stack-1.6.0/envs/gsi-addon-env/install/modulefiles/Core")
local stack_intel_ver=os.getenv("stack_intel_ver") or "2021.9.0"
-local python_ver=os.getenv("python_ver") or "3.10.8"
+local python_ver=os.getenv("python_ver") or "3.11.6"
load(pathJoin("stack-intel", stack_intel_ver))
load(pathJoin("python", python_ver))
diff --git a/modulefiles/module_gwsetup.jet.lua b/modulefiles/module_gwsetup.jet.lua
index d08389c711..72c40469e4 100644
--- a/modulefiles/module_gwsetup.jet.lua
+++ b/modulefiles/module_gwsetup.jet.lua
@@ -2,12 +2,12 @@ help([[
Load environment to run GFS workflow setup scripts on Jet
]])
-load(pathJoin("rocoto", "1.3.3"))
+load(pathJoin("rocoto"))
-prepend_path("MODULEPATH", "/mnt/lfs4/HFIP/hfv3gfs/role.epic/spack-stack/spack-stack-1.5.1/envs/gsi-addon/install/modulefiles/Core")
+prepend_path("MODULEPATH", "/mnt/lfs4/HFIP/hfv3gfs/role.epic/spack-stack/spack-stack-1.6.0/envs/gsi-addon-dev/install/modulefiles/Core")
local stack_intel_ver=os.getenv("stack_intel_ver") or "2021.5.0"
-local python_ver=os.getenv("python_ver") or "3.10.8"
+local python_ver=os.getenv("python_ver") or "3.11.6"
load(pathJoin("stack-intel", stack_intel_ver))
load(pathJoin("python", python_ver))
diff --git a/modulefiles/module_gwsetup.orion.lua b/modulefiles/module_gwsetup.orion.lua
index 93a59c8e50..96ed50f7f0 100644
--- a/modulefiles/module_gwsetup.orion.lua
+++ b/modulefiles/module_gwsetup.orion.lua
@@ -7,10 +7,10 @@ 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.5.1/envs/gsi-addon/install/modulefiles/Core")
+prepend_path("MODULEPATH", "/work/noaa/epic/role-epic/spack-stack/orion/spack-stack-1.6.0/envs/gsi-addon-env/install/modulefiles/Core")
local stack_intel_ver=os.getenv("stack_intel_ver") or "2022.0.2"
-local python_ver=os.getenv("python_ver") or "3.10.8"
+local python_ver=os.getenv("python_ver") or "3.11.6"
load(pathJoin("stack-intel", stack_intel_ver))
load(pathJoin("python", python_ver))
diff --git a/modulefiles/module_gwsetup.s4.lua b/modulefiles/module_gwsetup.s4.lua
index 291c654bb3..77a647006f 100644
--- a/modulefiles/module_gwsetup.s4.lua
+++ b/modulefiles/module_gwsetup.s4.lua
@@ -5,10 +5,10 @@ Load environment to run GFS workflow setup scripts on S4
load(pathJoin("rocoto","1.3.5"))
load(pathJoin("git","2.30.0"))
-prepend_path("MODULEPATH", "/data/prod/jedi/spack-stack/spack-stack-1.5.1/envs/gsi-addon/install/modulefiles/Core")
+prepend_path("MODULEPATH", "/data/prod/jedi/spack-stack/spack-stack-1.6.0/envs/gsi-addon-env/install/modulefiles/Core")
local stack_intel_ver=os.getenv("stack_intel_ver") or "2021.5.0"
-local python_ver=os.getenv("python_ver") or "3.10.8"
+local python_ver=os.getenv("python_ver") or "3.11.6"
load(pathJoin("stack-intel", stack_intel_ver))
load(pathJoin("python", python_ver))
diff --git a/parm/config/gefs/config.atmos_products b/parm/config/gefs/config.atmos_products
new file mode 100644
index 0000000000..6ba38318c7
--- /dev/null
+++ b/parm/config/gefs/config.atmos_products
@@ -0,0 +1,28 @@
+#! /usr/bin/env bash
+
+########## config.atmos_products ##########
+# atmosphere grib2 products specific
+
+echo "BEGIN: config.atmos_products"
+
+# Get task specific resources
+. "${EXPDIR}/config.resources" atmos_products
+
+# No. of forecast hours to process in a single job
+export NFHRS_PER_GROUP=3
+
+# Scripts used by this job
+export INTERP_ATMOS_MASTERSH="${HOMEgfs}/ush/interp_atmos_master.sh"
+export INTERP_ATMOS_SFLUXSH="${HOMEgfs}/ush/interp_atmos_sflux.sh"
+
+export downset=2
+export FHOUT_PGBS=${FHOUT_GFS:-3} # Output frequency of supplemental gfs pgb file at 1.0 and 0.5 deg
+export FLXGF="NO" # Create interpolated sflux.1p00 file
+
+# paramlist files for the different forecast hours and downsets
+export paramlista="${HOMEgfs}/parm/product/gefs.0p25.fFFF.paramlist.a.txt"
+export paramlista_anl="${HOMEgfs}/parm/product/gefs.0p25.anl.paramlist.a.txt"
+export paramlista_f000="${HOMEgfs}/parm/product/gefs.0p25.f000.paramlist.a.txt"
+export paramlistb="${HOMEgfs}/parm/product/gefs.0p25.fFFF.paramlist.b.txt"
+
+echo "END: config.atmos_products"
diff --git a/parm/config/gefs/config.base.emc.dyn b/parm/config/gefs/config.base
similarity index 93%
rename from parm/config/gefs/config.base.emc.dyn
rename to parm/config/gefs/config.base
index 5358a37768..69d4ed94a4 100644
--- a/parm/config/gefs/config.base.emc.dyn
+++ b/parm/config/gefs/config.base
@@ -30,16 +30,6 @@ export UTILgfs=${HOMEgfs}/util
export EXECgfs=${HOMEgfs}/exec
export SCRgfs=${HOMEgfs}/scripts
-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"
-
########################################################################
# GLOBAL static environment parameters
@@ -120,6 +110,7 @@ export RUN="gefs" # RUN is defined in the job-card (ecf); CDUMP is used at EMC
# Get all the COM path templates
source "${EXPDIR}/config.com"
+# shellcheck disable=SC2016
export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'}
export LOGSCRIPT=${LOGSCRIPT:-""}
#export ERRSCRIPT=${ERRSCRIPT:-"err_chk"}
@@ -144,7 +135,7 @@ export DO_OCN="NO"
export DO_ICE="NO"
export DO_AERO="NO"
export WAVE_CDUMP="" # When to include wave suite: gdas, gfs, or both
-export DOBNDPNT_WAVE="NO"
+export DOBNDPNT_WAVE="NO" # The GEFS buoys file does not currently have any boundary points
export FRAC_GRID=".true."
# Set operational resolution
@@ -218,16 +209,12 @@ 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_00=120
-export FHMAX_GFS_06=120
-export FHMAX_GFS_12=120
-export FHMAX_GFS_18=120
-current_fhmax_var=FHMAX_GFS_${cyc}; declare -x FHMAX_GFS=${!current_fhmax_var}
-
-export FHOUT_GFS=6 # Must be 6 for S2S until #1629 is addressed; 3 for ops
+export FHMIN=${FHMIN_GFS}
+export FHMAX_GFS=@FHMAX_GFS@
+export FHOUT_GFS=6
export FHMAX_HF_GFS=0
export FHOUT_HF_GFS=1
+export FHOUT_OCNICE_GFS=6
if (( gfs_cyc != 0 )); then
export STEP_GFS=$(( 24 / gfs_cyc ))
else
@@ -262,7 +249,7 @@ export imp_physics=8
export DO_JEDIATMVAR="NO"
export DO_JEDIATMENS="NO"
export DO_JEDIOCNVAR="NO"
-export DO_JEDILANDDA="NO"
+export DO_JEDISNOWDA="NO"
export DO_MERGENSST="NO"
# Hybrid related
@@ -270,9 +257,13 @@ export NMEM_ENS=@NMEM_ENS@
# set default member number memdir for control
# this will be overwritten for the perturbed members
-export ENSMEM="000"
+export ENSMEM=${ENSMEM:-"000"}
export MEMDIR="mem${ENSMEM}"
+# initialize ocean ensemble members with perturbations
+# if true, only occurs for members greater than zero
+export OCN_ENS_PERTURB_FILES=false
+
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
diff --git a/parm/config/gefs/config.efcs b/parm/config/gefs/config.efcs
index 9593408848..a6f34818d7 100644
--- a/parm/config/gefs/config.efcs
+++ b/parm/config/gefs/config.efcs
@@ -5,14 +5,16 @@
echo "BEGIN: config.efcs"
-# Turn off components in ensemble via _ENKF, or use setting from deterministic
-export DO_AERO=${DO_AERO_ENKF:-${DO_AERO:-"NO"}}
-export DO_OCN=${DO_OCN_ENKF:-${DO_OCN:-"NO"}}
-export DO_ICE=${DO_ICE_ENKF:-${DO_ICE:-"NO"}}
-export DO_WAVE=${DO_WAVE_ENKF:-${DO_WAVE:-"NO"}}
+# Turn off components in ensemble
+# export DO_AERO="NO"
+# export DO_OCN="NO"
+# export DO_ICE="NO"
+# export DO_WAVE="NO"
+
+export CASE="${CASE_ENS}"
# Source model specific information that is resolution dependent
-string="--fv3 ${CASE_ENS}"
+string="--fv3 ${CASE}"
# Ocean/Ice/Waves ensemble configurations are identical to deterministic member
[[ "${DO_OCN}" == "YES" ]] && string="${string} --mom6 ${OCNRES}"
[[ "${DO_ICE}" == "YES" ]] && string="${string} --cice6 ${ICERES}"
@@ -24,17 +26,22 @@ source "${EXPDIR}/config.ufs" ${string}
# Get task specific resources
source "${EXPDIR}/config.resources" efcs
+# nggps_diag_nml
+export FHOUT=${FHOUT_ENKF:-3}
+if [[ "${RUN}" == "enkfgfs" ]]; then
+ export FHOUT=${FHOUT_ENKF_GFS:-${FHOUT}}
+fi
+
+# model_configure
+export FHMAX=${FHMAX_ENKF:-9}
+if [[ "${RUN}" == "enkfgfs" ]]; then
+ export FHMAX=${FHMAX_ENKF_GFS:-${FHMAX}}
+fi
+
# Use serial I/O for ensemble (lustre?)
export OUTPUT_FILETYPE_ATM="netcdf"
export OUTPUT_FILETYPE_SFC="netcdf"
-# Number of enkf members per fcst job
-export NMEM_EFCSGRP=1
-export RERUN_EFCSGRP="NO"
-
-# Turn off inline UPP for EnKF forecast
-export WRITE_DOPOST=".true."
-
# Stochastic physics parameters (only for ensemble forecasts)
export DO_SKEB="YES"
export SKEB=0.3
@@ -54,6 +61,6 @@ export SPPT_LSCALE=500000.
export SPPT_LOGIT=".true."
export SPPT_SFCLIMIT=".true."
-export restart_interval=${restart_interval_gfs}
+export restart_interval="${restart_interval_gfs}"
echo "END: config.efcs"
diff --git a/parm/config/gefs/config.fcst b/parm/config/gefs/config.fcst
index 4c8d3be99f..74a84e1173 100644
--- a/parm/config/gefs/config.fcst
+++ b/parm/config/gefs/config.fcst
@@ -21,6 +21,13 @@ string="--fv3 ${CASE}"
# shellcheck disable=SC2086
source "${EXPDIR}/config.ufs" ${string}
+# shellcheck disable=SC2153
+export FHMAX=${FHMAX_GFS}
+# shellcheck disable=SC2153
+export FHOUT=${FHOUT_GFS}
+export FHMAX_HF=${FHMAX_HF_GFS}
+export FHOUT_HF=${FHOUT_HF_GFS}
+export FHOUT_OCNICE=${FHOUT_OCNICE_GFS}
# Get task specific resources
source "${EXPDIR}/config.resources" fcst
@@ -231,20 +238,6 @@ export FSICL="0"
export FSICS="0"
#---------------------------------------------------------------------
-
-# ideflate: netcdf zlib lossless compression (0-9): 0 no compression
-# nbits: netcdf lossy compression level (0-32): 0 lossless
-export ideflate=1
-export nbits=14
-export ishuffle=0
-# compression for RESTART files written by FMS
-export shuffle=1
-export deflate_level=1
-
-#---------------------------------------------------------------------
-# Disable the use of coupler.res; get model start time from model_configure
-export USE_COUPLER_RES="NO"
-
# Write more variables to output
export DIAG_TABLE="${HOMEgfs}/parm/ufs/fv3/diag_table"
diff --git a/parm/config/gefs/config.oceanice_products b/parm/config/gefs/config.oceanice_products
new file mode 120000
index 0000000000..f6cf9cd60b
--- /dev/null
+++ b/parm/config/gefs/config.oceanice_products
@@ -0,0 +1 @@
+../gfs/config.oceanice_products
\ No newline at end of file
diff --git a/parm/config/gefs/config.resources b/parm/config/gefs/config.resources
index a50418d23a..1f6485931f 100644
--- a/parm/config/gefs/config.resources
+++ b/parm/config/gefs/config.resources
@@ -4,17 +4,26 @@
# Set resource information for job tasks
# e.g. walltime, node, cores per node, memory etc.
-if [[ $# -ne 1 ]]; then
+if (( $# != 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 fit2obs metp arch echgres"
- echo "ecen esfc efcs epos earc"
- echo "init_chem mom6ic ocnpost"
+ echo "prep prepsnowobs prepatmiodaobs"
+ echo "atmanlinit atmanlrun atmanlfinal"
+ echo "atmensanlinit atmensanlrun atmensanlfinal"
+ echo "snowanl"
+ echo "aeroanlinit aeroanlrun aeroanlfinal"
+ echo "anal sfcanl analcalc analdiag fcst echgres"
+ echo "upp atmos_products"
+ echo "tracker genesis genesis_fsu"
+ echo "verfozn verfrad vminmon fit2obs metp arch cleanup"
+ echo "eobs ediag eomg eupd ecen esfc efcs epos earc"
+ echo "init_chem mom6ic"
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
fi
@@ -23,281 +32,158 @@ step=$1
echo "BEGIN: config.resources"
-if [[ "${machine}" = "WCOSS2" ]]; then
- export npe_node_max=128
-elif [[ "${machine}" = "JET" ]]; then
- if [[ ${PARTITION_BATCH} = "xjet" ]]; then
- export npe_node_max=24
- elif [[ ${PARTITION_BATCH} = "vjet" || ${PARTITION_BATCH} = "sjet" ]]; then
- export npe_node_max=16
- elif [[ ${PARTITION_BATCH} = "kjet" ]]; then
- export npe_node_max=40
- fi
-elif [[ ${machine} = "HERA" ]]; then
- export npe_node_max=40
-elif [[ ${machine} = "S4" ]]; then
- if [[ ${PARTITION_BATCH} = "s4" ]]; then
- export npe_node_max=32
- elif [[ ${PARTITION_BATCH} = "ivy" ]]; then
- export npe_node_max=20
- fi
-elif [[ ${machine} = "ORION" ]]; then
- export npe_node_max=40
-elif [[ ${machine} = "HERCULES" ]]; then
- export npe_node_max=40
-fi
+case ${machine} in
+ "WCOSS2") npe_node_max=128;;
+ "HERA") npe_node_max=40;;
+ "ORION") npe_node_max=40;;
+ "HERCULES") npe_node_max=80;;
+ "JET")
+ case ${PARTITION_BATCH} in
+ "xjet") npe_node_max=24;;
+ "vjet" | "sjet") npe_node_max=16;;
+ "kjet") npe_node_max=40;;
+ *)
+ echo "FATAL ERROR: Unknown partition ${PARTITION_BATCH} specified for ${machine}"
+ exit 3
+ esac
+ ;;
+ "S4")
+ case ${PARTITION_BATCH} in
+ "s4") npe_node_max=32;;
+ "ivy") npe_node_max=20;;
+ *)
+ echo "FATAL ERROR: Unknown partition ${PARTITION_BATCH} specified for ${machine}"
+ exit 3
+ esac
+ ;;
+ "AWSPW")
+ export PARTITION_BATCH="compute"
+ npe_node_max=40
+ ;;
+ *)
+ echo "FATAL ERROR: Unknown machine encountered by ${BASH_SOURCE[0]}"
+ exit 2
+ ;;
+esac
+export npe_node_max
-if [[ ${step} = "prep" ]]; then
- export wtime_prep='00:30:00'
- export npe_prep=4
- export npe_node_prep=2
- export nth_prep=1
- if [[ "${machine}" = "WCOSS2" ]]; then
- export is_exclusive=True
- else
- export memory_prep="40G"
- fi
-
-elif [[ "${step}" = "aerosol_init" ]]; then
- export wtime_aerosol_init="00:05:00"
- export npe_aerosol_init=1
- export nth_aerosol_init=1
- npe_node_aerosol_init=$(echo "${npe_node_max} / ${nth_aerosol_init}" | bc)
- export npe_node_aerosol_init
- export NTASKS=${npe_aerosol_init}
- export memory_aerosol_init="6G"
-
-elif [[ ${step} = "waveinit" ]]; then
+case ${step} in
+
+ "stage_ic")
+ export wtime_stage_ic="00:15:00"
+ export npe_stage_ic=1
+ export npe_node_stage_ic=1
+ export nth_stage_ic=1
+ export is_exclusive=True
+ ;;
+ "waveinit")
export wtime_waveinit="00:10:00"
export npe_waveinit=12
export nth_waveinit=1
- npe_node_waveinit=$(echo "${npe_node_max} / ${nth_waveinit}" | bc)
- export npe_node_waveinit
+ export npe_node_waveinit=$(( npe_node_max / nth_waveinit ))
export NTASKS=${npe_waveinit}
export memory_waveinit="2GB"
+ ;;
-elif [[ ${step} = "waveprep" ]]; then
-
- export wtime_waveprep="00:10:00"
- export npe_waveprep=5
- export npe_waveprep_gfs=65
- export nth_waveprep=1
- export nth_waveprep_gfs=1
- npe_node_waveprep=$(echo "${npe_node_max} / ${nth_waveprep}" | bc)
- export npe_node_waveprep
- npe_node_waveprep_gfs=$(echo "${npe_node_max} / ${nth_waveprep_gfs}" | bc)
- export npe_node_waveprep_gfs
- export NTASKS=${npe_waveprep}
- export NTASKS_gfs=${npe_waveprep_gfs}
- export memory_waveprep="100GB"
- export memory_waveprep_gfs="150GB"
-
-elif [[ ${step} = "wavepostsbs" ]]; then
-
- export wtime_wavepostsbs="00:20:00"
- export wtime_wavepostsbs_gfs="03:00:00"
- export npe_wavepostsbs=8
- export nth_wavepostsbs=1
- npe_node_wavepostsbs=$(echo "${npe_node_max} / ${nth_wavepostsbs}" | bc)
- export npe_node_wavepostsbs
- export NTASKS=${npe_wavepostsbs}
- export memory_wavepostsbs="10GB"
- export memory_wavepostsbs_gfs="10GB"
-
-elif [[ ${step} = "wavepostbndpnt" ]]; then
-
- export wtime_wavepostbndpnt="01:00:00"
- export npe_wavepostbndpnt=240
- export nth_wavepostbndpnt=1
- npe_node_wavepostbndpnt=$(echo "${npe_node_max} / ${nth_wavepostbndpnt}" | bc)
- export npe_node_wavepostbndpnt
- export NTASKS=${npe_wavepostbndpnt}
+ "fcst" | "efcs")
export is_exclusive=True
-elif [[ ${step} = "wavepostbndpntbll" ]]; then
-
- export wtime_wavepostbndpntbll="01:00:00"
- export npe_wavepostbndpntbll=448
- export nth_wavepostbndpntbll=1
- npe_node_wavepostbndpntbll=$(echo "${npe_node_max} / ${nth_wavepostbndpntbll}" | bc)
- export npe_node_wavepostbndpntbll
- export NTASKS=${npe_wavepostbndpntbll}
- export is_exclusive=True
-
-elif [[ ${step} = "wavepostpnt" ]]; then
-
- export wtime_wavepostpnt="01:30:00"
- export npe_wavepostpnt=200
- export nth_wavepostpnt=1
- npe_node_wavepostpnt=$(echo "${npe_node_max} / ${nth_wavepostpnt}" | bc)
- export npe_node_wavepostpnt
- export NTASKS=${npe_wavepostpnt}
- export is_exclusive=True
-
-elif [[ ${step} = "wavegempak" ]]; then
-
- export wtime_wavegempak="02:00:00"
- export npe_wavegempak=1
- export nth_wavegempak=1
- npe_node_wavegempak=$(echo "${npe_node_max} / ${nth_wavegempak}" | bc)
- export npe_node_wavegempak
- export NTASKS=${npe_wavegempak}
- export memory_wavegempak="1GB"
-
-elif [[ ${step} = "waveawipsbulls" ]]; then
-
- export wtime_waveawipsbulls="00:20:00"
- export npe_waveawipsbulls=1
- export nth_waveawipsbulls=1
- npe_node_waveawipsbulls=$(echo "${npe_node_max} / ${nth_waveawipsbulls}" | bc)
- export npe_node_waveawipsbulls
- export NTASKS=${npe_waveawipsbulls}
- export is_exclusive=True
-
-elif [[ ${step} = "waveawipsgridded" ]]; then
-
- export wtime_waveawipsgridded="02:00:00"
- export npe_waveawipsgridded=1
- export nth_waveawipsgridded=1
- npe_node_waveawipsgridded=$(echo "${npe_node_max} / ${nth_waveawipsgridded}" | bc)
- export npe_node_waveawipsgridded
- export NTASKS=${npe_waveawipsgridded}
- export memory_waveawipsgridded_gfs="1GB"
-
-elif [[ ${step} = "analcalc" ]]; then
-
- export wtime_analcalc="00:10:00"
- export npe_analcalc=127
- export ntasks="${npe_analcalc}"
- export nth_analcalc=1
- export nth_echgres=4
- export nth_echgres_gfs=12
- npe_node_analcalc=$(echo "${npe_node_max} / ${nth_analcalc}" | bc)
- export npe_node_analcalc
- export is_exclusive=True
-
-elif [[ ${step} = "analdiag" ]]; then
-
- export wtime_analdiag="00:15:00"
- export npe_analdiag=96 # Should be at least twice npe_ediag
- export nth_analdiag=1
- npe_node_analdiag=$(echo "${npe_node_max} / ${nth_analdiag}" | bc)
- export npe_node_analdiag
- export memory_analdiag="48GB"
-
-elif [[ ${step} = "sfcanl" ]]; then
-
- export wtime_sfcanl="00:10:00"
- export npe_sfcanl=6
- export nth_sfcanl=1
- npe_node_sfcanl=$(echo "${npe_node_max} / ${nth_sfcanl}" | bc)
- export npe_node_sfcanl
- export is_exclusive=True
-
-elif [[ "${step}" = "fcst" || "${step}" = "efcs" ]]; then
-
- export is_exclusive=True
-
- if [[ "${step}" = "fcst" ]]; then
- _CDUMP_LIST=${CDUMP:-"gdas gfs"}
- elif [[ "${step}" = "efcs" ]]; then
- _CDUMP_LIST=${CDUMP:-"enkfgdas enkfgfs"}
- fi
+ _CDUMP_LIST=${CDUMP:-"gdas gfs"}
# During workflow creation, we need resources for all CDUMPs and CDUMP is undefined
for _CDUMP in ${_CDUMP_LIST}; do
- if [[ "${_CDUMP}" =~ "gfs" ]]; then
- export layout_x=${layout_x_gfs}
- export layout_y=${layout_y_gfs}
- export WRITE_GROUP=${WRITE_GROUP_GFS}
- export WRTTASK_PER_GROUP_PER_THREAD=${WRTTASK_PER_GROUP_PER_THREAD_GFS}
- ntasks_fv3=${ntasks_fv3_gfs}
- ntasks_quilt=${ntasks_quilt_gfs}
- nthreads_fv3=${nthreads_fv3_gfs}
- fi
-
- # PETS for the atmosphere dycore
- (( FV3PETS = ntasks_fv3 * nthreads_fv3 ))
- echo "FV3 using (nthreads, PETS) = (${nthreads_fv3}, ${FV3PETS})"
-
- # PETS for quilting
- if [[ "${QUILTING:-}" = ".true." ]]; then
- (( QUILTPETS = ntasks_quilt * nthreads_fv3 ))
- (( WRTTASK_PER_GROUP = WRTTASK_PER_GROUP_PER_THREAD ))
- export WRTTASK_PER_GROUP
- else
- QUILTPETS=0
- fi
- echo "QUILT using (nthreads, PETS) = (${nthreads_fv3}, ${QUILTPETS})"
-
- # Total PETS for the atmosphere component
- ATMTHREADS=${nthreads_fv3}
- (( ATMPETS = FV3PETS + QUILTPETS ))
- export ATMPETS ATMTHREADS
- echo "FV3ATM using (nthreads, PETS) = (${ATMTHREADS}, ${ATMPETS})"
-
- # Total PETS for the coupled model (starting w/ the atmosphere)
- NTASKS_TOT=${ATMPETS}
-
- # The mediator PETS can overlap with other components, usually it lands on the atmosphere tasks.
- # However, it is suggested limiting mediator PETS to 300, as it may cause the slow performance.
- # See https://docs.google.com/document/d/1bKpi-52t5jIfv2tuNHmQkYUe3hkKsiG_DG_s6Mnukog/edit
- # TODO: Update reference when moved to ufs-weather-model RTD
- MEDTHREADS=${nthreads_mediator:-1}
- MEDPETS=${MEDPETS:-ATMPETS}
- [[ "${MEDPETS}" -gt 300 ]] && MEDPETS=300
- export MEDPETS MEDTHREADS
- echo "MEDIATOR using (threads, PETS) = (${MEDTHREADS}, ${MEDPETS})"
-
- CHMPETS=0; CHMTHREADS=0
- if [[ "${DO_AERO}" = "YES" ]]; then
- # GOCART shares the same grid and forecast tasks as FV3 (do not add write grid component tasks).
- (( CHMTHREADS = ATMTHREADS ))
- (( CHMPETS = FV3PETS ))
- # Do not add to NTASKS_TOT
- echo "GOCART using (threads, PETS) = (${CHMTHREADS}, ${CHMPETS})"
- fi
- export CHMPETS CHMTHREADS
-
- WAVPETS=0; WAVTHREADS=0
- if [[ "${DO_WAVE}" = "YES" ]]; then
- (( WAVPETS = ntasks_ww3 * nthreads_ww3 ))
- (( WAVTHREADS = nthreads_ww3 ))
- echo "WW3 using (threads, PETS) = (${WAVTHREADS}, ${WAVPETS})"
- (( NTASKS_TOT = NTASKS_TOT + WAVPETS ))
- fi
- export WAVPETS WAVTHREADS
-
- OCNPETS=0; OCNTHREADS=0
- if [[ "${DO_OCN}" = "YES" ]]; then
- (( OCNPETS = ntasks_mom6 * nthreads_mom6 ))
- (( OCNTHREADS = nthreads_mom6 ))
- echo "MOM6 using (threads, PETS) = (${OCNTHREADS}, ${OCNPETS})"
- (( NTASKS_TOT = NTASKS_TOT + OCNPETS ))
- fi
- export OCNPETS OCNTHREADS
-
- ICEPETS=0; ICETHREADS=0
- if [[ "${DO_ICE}" = "YES" ]]; then
- (( ICEPETS = ntasks_cice6 * nthreads_cice6 ))
- (( ICETHREADS = nthreads_cice6 ))
- echo "CICE6 using (threads, PETS) = (${ICETHREADS}, ${ICEPETS})"
- (( NTASKS_TOT = NTASKS_TOT + ICEPETS ))
- fi
- export ICEPETS ICETHREADS
-
- echo "Total PETS for ${_CDUMP} = ${NTASKS_TOT}"
-
- if [[ "${_CDUMP}" =~ "gfs" ]]; then
- declare -x "npe_${step}_gfs"="${NTASKS_TOT}"
- declare -x "nth_${step}_gfs"=1 # ESMF handles threading for the UFS-weather-model
- declare -x "npe_node_${step}_gfs"="${npe_node_max}"
- else
- declare -x "npe_${step}"="${NTASKS_TOT}"
- declare -x "nth_${step}"=1 # ESMF handles threading for the UFS-weather-model
- declare -x "npe_node_${step}"="${npe_node_max}"
- fi
+ if [[ "${_CDUMP}" =~ "gfs" ]]; then
+ export layout_x=${layout_x_gfs}
+ export layout_y=${layout_y_gfs}
+ export WRITE_GROUP=${WRITE_GROUP_GFS}
+ export WRTTASK_PER_GROUP_PER_THREAD=${WRTTASK_PER_GROUP_PER_THREAD_GFS}
+ ntasks_fv3=${ntasks_fv3_gfs}
+ ntasks_quilt=${ntasks_quilt_gfs}
+ nthreads_fv3=${nthreads_fv3_gfs}
+ fi
+
+ # PETS for the atmosphere dycore
+ (( FV3PETS = ntasks_fv3 * nthreads_fv3 ))
+ echo "FV3 using (nthreads, PETS) = (${nthreads_fv3}, ${FV3PETS})"
+
+ # PETS for quilting
+ if [[ "${QUILTING:-}" == ".true." ]]; then
+ (( QUILTPETS = ntasks_quilt * nthreads_fv3 ))
+ (( WRTTASK_PER_GROUP = WRTTASK_PER_GROUP_PER_THREAD ))
+ export WRTTASK_PER_GROUP
+ else
+ QUILTPETS=0
+ fi
+ echo "QUILT using (nthreads, PETS) = (${nthreads_fv3}, ${QUILTPETS})"
+
+ # Total PETS for the atmosphere component
+ ATMTHREADS=${nthreads_fv3}
+ (( ATMPETS = FV3PETS + QUILTPETS ))
+ export ATMPETS ATMTHREADS
+ echo "FV3ATM using (nthreads, PETS) = (${ATMTHREADS}, ${ATMPETS})"
+
+ # Total PETS for the coupled model (starting w/ the atmosphere)
+ NTASKS_TOT=${ATMPETS}
+
+ # The mediator PETS can overlap with other components, usually it lands on the atmosphere tasks.
+ # However, it is suggested limiting mediator PETS to 300, as it may cause the slow performance.
+ # See https://docs.google.com/document/d/1bKpi-52t5jIfv2tuNHmQkYUe3hkKsiG_DG_s6Mnukog/edit
+ # TODO: Update reference when moved to ufs-weather-model RTD
+ MEDTHREADS=${nthreads_mediator:-1}
+ MEDPETS=${MEDPETS:-${FV3PETS}}
+ (( "${MEDPETS}" > 300 )) && MEDPETS=300
+ export MEDPETS MEDTHREADS
+ echo "MEDIATOR using (threads, PETS) = (${MEDTHREADS}, ${MEDPETS})"
+
+ CHMPETS=0; CHMTHREADS=0
+ if [[ "${DO_AERO}" == "YES" ]]; then
+ # GOCART shares the same grid and forecast tasks as FV3 (do not add write grid component tasks).
+ (( CHMTHREADS = ATMTHREADS ))
+ (( CHMPETS = FV3PETS ))
+ # Do not add to NTASKS_TOT
+ echo "GOCART using (threads, PETS) = (${CHMTHREADS}, ${CHMPETS})"
+ fi
+ export CHMPETS CHMTHREADS
+
+ WAVPETS=0; WAVTHREADS=0
+ if [[ "${DO_WAVE}" == "YES" ]]; then
+ (( WAVPETS = ntasks_ww3 * nthreads_ww3 ))
+ (( WAVTHREADS = nthreads_ww3 ))
+ echo "WW3 using (threads, PETS) = (${WAVTHREADS}, ${WAVPETS})"
+ (( NTASKS_TOT = NTASKS_TOT + WAVPETS ))
+ fi
+ export WAVPETS WAVTHREADS
+
+ OCNPETS=0; OCNTHREADS=0
+ if [[ "${DO_OCN}" == "YES" ]]; then
+ (( OCNPETS = ntasks_mom6 * nthreads_mom6 ))
+ (( OCNTHREADS = nthreads_mom6 ))
+ echo "MOM6 using (threads, PETS) = (${OCNTHREADS}, ${OCNPETS})"
+ (( NTASKS_TOT = NTASKS_TOT + OCNPETS ))
+ fi
+ export OCNPETS OCNTHREADS
+
+ ICEPETS=0; ICETHREADS=0
+ if [[ "${DO_ICE}" == "YES" ]]; then
+ (( ICEPETS = ntasks_cice6 * nthreads_cice6 ))
+ (( ICETHREADS = nthreads_cice6 ))
+ echo "CICE6 using (threads, PETS) = (${ICETHREADS}, ${ICEPETS})"
+ (( NTASKS_TOT = NTASKS_TOT + ICEPETS ))
+ fi
+ export ICEPETS ICETHREADS
+
+ echo "Total PETS for ${_CDUMP} = ${NTASKS_TOT}"
+
+ if [[ "${_CDUMP}" =~ "gfs" ]]; then
+ declare -x "npe_${step}_gfs"="${NTASKS_TOT}"
+ declare -x "nth_${step}_gfs"=1 # ESMF handles threading for the UFS-weather-model
+ declare -x "npe_node_${step}_gfs"="${npe_node_max}"
+ else
+ declare -x "npe_${step}"="${NTASKS_TOT}"
+ declare -x "nth_${step}"=1 # ESMF handles threading for the UFS-weather-model
+ declare -x "npe_node_${step}"="${npe_node_max}"
+ fi
done
@@ -311,167 +197,76 @@ elif [[ "${step}" = "fcst" || "${step}" = "efcs" ]]; then
declare -x "wtime_${step}_gfs"="06:00:00"
;;
*)
- echo "FATAL ERROR: Resolution ${CASE} not supported in ${step}"
- exit 1
+ echo "FATAL ERROR: Resources not defined for job ${job} at resolution ${CASE}"
+ exit 4
;;
esac
unset _CDUMP _CDUMP_LIST
unset NTASKS_TOT
-
-elif [[ ${step} = "ocnpost" ]]; then
-
- export wtime_ocnpost="00:30:00"
- export npe_ocnpost=1
- export npe_node_ocnpost=1
- export nth_ocnpost=1
- export memory_ocnpost="96G"
- if [[ ${machine} == "JET" ]]; then
- # JET only has 88GB of requestable memory per node
- # so a second node is required to meet the requiremtn
- npe_ocnpost=2
- fi
-
-elif [[ "${step}" = "fit2obs" ]]; then
-
- export wtime_fit2obs="00:20:00"
- export npe_fit2obs=3
- export nth_fit2obs=1
- export npe_node_fit2obs=1
- export memory_fit2obs="20G"
- if [[ ${machine} == "WCOSS2" ]]; then export npe_node_fit2obs=3 ; fi
-
-elif [[ "${step}" = "metp" ]]; then
-
- export nth_metp=1
- export wtime_metp="03:00:00"
- export npe_metp=4
- export npe_node_metp=4
- export wtime_metp_gfs="06:00:00"
- export npe_metp_gfs=4
- export npe_node_metp_gfs=4
- export is_exclusive=True
-
-elif [[ ${step} = "echgres" ]]; then
-
- export wtime_echgres="00:10:00"
- export npe_echgres=3
- export nth_echgres=${npe_node_max}
- export npe_node_echgres=1
- if [[ "${machine}" = "WCOSS2" ]]; then
- export memory_echgres="200GB"
- fi
-
-elif [[ ${step} = "init_chem" ]]; then
-
- export wtime_init_chem="00:30:00"
- export npe_init_chem=1
- export npe_node_init_chem=1
- export is_exclusive=True
-
-elif [[ ${step} = "mom6ic" ]]; then
-
- export wtime_mom6ic="00:30:00"
- export npe_mom6ic=24
- export npe_node_mom6ic=24
- export is_exclusive=True
-
-elif [[ ${step} = "arch" || ${step} = "earc" ]]; then
-
- eval "export wtime_${step}='06:00:00'"
- eval "export npe_${step}=1"
- eval "export npe_node_${step}=1"
- eval "export nth_${step}=1"
- eval "export memory_${step}=4096M"
- if [[ "${machine}" = "WCOSS2" ]]; then
- eval "export memory_${step}=50GB"
- fi
-
-elif [[ ${step} = "stage_ic" ]]; then
-
- export wtime_stage_ic="00:15:00"
- export npe_stage_ic=1
- export npe_node_stage_ic=1
- export nth_stage_ic=1
+ ;;
+
+ "atmos_products")
+ export wtime_atmos_products="00:15:00"
+ export npe_atmos_products=24
+ export nth_atmos_products=1
+ export npe_node_atmos_products="${npe_atmos_products}"
+ export wtime_atmos_products_gfs="${wtime_atmos_products}"
+ export npe_atmos_products_gfs="${npe_atmos_products}"
+ export nth_atmos_products_gfs="${nth_atmos_products}"
+ export npe_node_atmos_products_gfs="${npe_node_atmos_products}"
export is_exclusive=True
+ ;;
+
+ "oceanice_products")
+ export wtime_oceanice_products="00:15:00"
+ export npe_oceanice_products=1
+ export npe_node_oceanice_products=1
+ export nth_oceanice_products=1
+ export memory_oceanice_products="96GB"
+ ;;
+
+ "wavepostsbs")
+ export wtime_wavepostsbs="03:00:00"
+ export npe_wavepostsbs=1
+ export nth_wavepostsbs=1
+ export npe_node_wavepostsbs=$(( npe_node_max / nth_wavepostsbs ))
+ export NTASKS=${npe_wavepostsbs}
+ export memory_wavepostsbs="10GB"
+ ;;
-elif [[ ${step} = "ecen" ]]; then
-
- export wtime_ecen="00:10:00"
- export npe_ecen=80
- export nth_ecen=4
- if [[ "${machine}" = "HERA" ]]; then export nth_ecen=6; fi
- if [[ ${CASE} = "C384" || ${CASE} = "C192" || ${CASE} = "C96" || ${CASE} = "C48" ]]; then export nth_ecen=2; fi
- npe_node_ecen=$(echo "${npe_node_max} / ${nth_ecen}" | bc)
- export npe_node_ecen
- export nth_cycle=${nth_ecen}
- npe_node_cycle=$(echo "${npe_node_max} / ${nth_cycle}" | bc)
- export npe_node_cycle
+ "wavepostbndpnt")
+ export wtime_wavepostbndpnt="01:00:00"
+ export npe_wavepostbndpnt=240
+ export nth_wavepostbndpnt=1
+ export npe_node_wavepostbndpnt=$(( npe_node_max / nth_wavepostbndpnt ))
+ export NTASKS=${npe_wavepostbndpnt}
export is_exclusive=True
+ ;;
-elif [[ ${step} = "esfc" ]]; then
-
- export wtime_esfc="00:06:00"
- export npe_esfc=80
- export nth_esfc=1
- npe_node_esfc=$(echo "${npe_node_max} / ${nth_esfc}" | bc)
- export npe_node_esfc
- export nth_cycle=${nth_esfc}
- npe_node_cycle=$(echo "${npe_node_max} / ${nth_cycle}" | bc)
- export npe_node_cycle
- export memory_esfc="80GB"
-
-elif [[ ${step} = "epos" ]]; then
-
- export wtime_epos="00:15:00"
- export npe_epos=80
- export nth_epos=4
- if [[ "${machine}" == "HERA" ]]; then
- export nth_epos=6
- fi
- npe_node_epos=$(echo "${npe_node_max} / ${nth_epos}" | bc)
- export npe_node_epos
+ "wavepostbndpntbll")
+ export wtime_wavepostbndpntbll="01:00:00"
+ export npe_wavepostbndpntbll=448
+ export nth_wavepostbndpntbll=1
+ export npe_node_wavepostbndpntbll=$(( npe_node_max / nth_wavepostbndpntbll ))
+ export NTASKS=${npe_wavepostbndpntbll}
export is_exclusive=True
+ ;;
-elif [[ ${step} = "postsnd" ]]; then
-
- export wtime_postsnd="02:00:00"
- export npe_postsnd=40
- export nth_postsnd=8
- export npe_node_postsnd=10
- export npe_postsndcfp=9
- export npe_node_postsndcfp=1
- postsnd_req_cores=$(echo "${npe_node_postsnd} * ${nth_postsnd}" | bc)
- if [[ ${postsnd_req_cores} -gt "${npe_node_max}" ]]; then
- npe_node_postsnd=$(echo "${npe_node_max} / ${nth_postsnd}" | bc)
- export npe_node_postsnd
- fi
+ "wavepostpnt")
+ export wtime_wavepostpnt="04:00:00"
+ export npe_wavepostpnt=200
+ export nth_wavepostpnt=1
+ export npe_node_wavepostpnt=$(( npe_node_max / nth_wavepostpnt ))
+ export NTASKS=${npe_wavepostpnt}
export is_exclusive=True
+ ;;
-elif [[ ${step} = "awips" ]]; then
-
- export wtime_awips="03:30:00"
- export npe_awips=1
- export npe_node_awips=1
- export nth_awips=1
- export memory_awips="3GB"
-
-elif [[ ${step} = "gempak" ]]; then
-
- export wtime_gempak="03:00:00"
- export npe_gempak=2
- export npe_gempak_gfs=28
- export npe_node_gempak=2
- export npe_node_gempak_gfs=28
- export nth_gempak=1
- export memory_gempak="4GB"
- export memory_gempak_gfs="2GB"
-
-else
-
- echo "Invalid step = ${step}, ABORT!"
- exit 2
+ *)
+ echo "FATAL ERROR: Invalid job ${step} passed to ${BASH_SOURCE[0]}"
+ exit 1
+ ;;
-fi
+esac
echo "END: config.resources"
diff --git a/parm/config/gefs/config.stage_ic b/parm/config/gefs/config.stage_ic
index e2bb0af2b8..b332ee1826 100644
--- a/parm/config/gefs/config.stage_ic
+++ b/parm/config/gefs/config.stage_ic
@@ -8,6 +8,12 @@ echo "BEGIN: config.stage_ic"
source "${EXPDIR}/config.resources" stage_ic
case "${CASE}" in
+ "C384")
+ export CPL_ATMIC=""
+ export CPL_ICEIC=""
+ export CPL_OCNIC=""
+ export CPL_WAVIC=""
+ ;;
"C48")
export CPL_ATMIC="gefs_test"
export CPL_ICEIC="gefs_test"
diff --git a/parm/config/gefs/config.ufs b/parm/config/gefs/config.ufs
index 68b364529e..866de52964 100644
--- a/parm/config/gefs/config.ufs
+++ b/parm/config/gefs/config.ufs
@@ -68,51 +68,6 @@ if [[ "${skip_mom6}" == "false" ]] || [[ "${skip_cice6}" == "false" ]] || [[ "${
skip_mediator=false
fi
-case "${machine}" in
- "WCOSS2")
- npe_node_max=128
- ;;
- "HERA" | "ORION" | "HERCULES" )
- npe_node_max=40
- ;;
- "JET")
- case "${PARTITION_BATCH}" in
- "xjet")
- npe_node_max=24
- ;;
- "vjet" | "sjet")
- npe_node_max=16
- ;;
- "kjet")
- npe_node_max=40
- ;;
- *)
- echo "FATAL ERROR: Unsupported ${machine} PARTITION_BATCH = ${PARTITION_BATCH}, ABORT!"
- exit 1
- ;;
- esac
- ;;
- "S4")
- case "${PARTITION_BATCH}" in
- "s4")
- npe_node_max=32
- ;;
- "ivy")
- npe_node_max=20
- ;;
- *)
- echo "FATAL ERROR: Unsupported ${machine} PARTITION_BATCH = ${PARTITION_BATCH}, ABORT!"
- exit 1
- ;;
- esac
- ;;
- *)
- echo "FATAL ERROR: Unrecognized machine ${machine}"
- exit 14
- ;;
-esac
-export npe_node_max
-
# (Standard) Model resolution dependent variables
case "${fv3_res}" in
"C48")
@@ -193,7 +148,7 @@ case "${fv3_res}" in
export WRITE_GROUP=2
export WRTTASK_PER_GROUP_PER_THREAD_PER_TILE=10
export WRITE_GROUP_GFS=4
- export WRTTASK_PER_GROUP_PER_THREAD_PER_TILE_GFS=10
+ export WRTTASK_PER_GROUP_PER_THREAD_PER_TILE_GFS=20 #Note this should be 10 for WCOSS2
;;
"C1152")
export DELTIM=120
@@ -209,7 +164,7 @@ case "${fv3_res}" in
export WRITE_GROUP=4
export WRTTASK_PER_GROUP_PER_THREAD_PER_TILE=10 # TODO: refine these numbers when a case is available
export WRITE_GROUP_GFS=4
- export WRTTASK_PER_GROUP_PER_THREAD_PER_TILE_GFS=10 # TODO: refine these numbers when a case is available
+ export WRTTASK_PER_GROUP_PER_THREAD_PER_TILE_GFS=20 # TODO: refine these numbers when a case is available
;;
"C3072")
export DELTIM=90
@@ -258,6 +213,10 @@ 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
@@ -309,11 +268,12 @@ if [[ "${skip_mom6}" == "false" ]]; then
NY_GLB=320
DT_DYNAM_MOM6='1800'
DT_THERM_MOM6='3600'
- FRUNOFF=""
+ FRUNOFF="runoff.daitren.clim.1deg.nc"
CHLCLIM="seawifs_1998-2006_smoothed_2X.nc"
- MOM6_RESTART_SETTING='n'
+ MOM6_RESTART_SETTING='r'
MOM6_RIVER_RUNOFF='False'
eps_imesh="2.5e-1"
+ TOPOEDITS="ufs.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"
@@ -321,6 +281,7 @@ if [[ "${skip_mom6}" == "false" ]]; then
MOM6_DIAG_COORD_DEF_Z_FILE="interpolate_zgrid_40L.nc"
MOM6_DIAG_MISVAL="-1e34"
fi
+ MOM6_ALLOW_LANDMASK_CHANGES='True'
;;
"050")
ntasks_mom6=60
@@ -334,7 +295,6 @@ if [[ "${skip_mom6}" == "false" ]]; then
MOM6_RESTART_SETTING='n'
MOM6_RIVER_RUNOFF='True'
eps_imesh="1.0e-1"
- TOPOEDITS="ufs.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"
@@ -342,7 +302,8 @@ if [[ "${skip_mom6}" == "false" ]]; then
MOM6_DIAG_COORD_DEF_Z_FILE="interpolate_zgrid_40L.nc"
MOM6_DIAG_MISVAL="-1e34"
fi
- MOM6_ALLOW_LANDMASK_CHANGES='True'
+ MOM6_ALLOW_LANDMASK_CHANGES='False'
+ TOPOEDITS=""
;;
"025")
ntasks_mom6=220
@@ -356,7 +317,6 @@ if [[ "${skip_mom6}" == "false" ]]; then
MOM6_RIVER_RUNOFF='True'
MOM6_RESTART_SETTING="r"
eps_imesh="1.0e-1"
- TOPOEDITS=""
if [[ "${DO_JEDIOCNVAR:-NO}" = "YES" ]]; then
MOM6_DIAG_COORD_DEF_Z_FILE="oceanda_zgrid_75L.nc"
MOM6_DIAG_MISVAL="0.0"
@@ -364,7 +324,8 @@ if [[ "${skip_mom6}" == "false" ]]; then
MOM6_DIAG_COORD_DEF_Z_FILE="interpolate_zgrid_40L.nc"
MOM6_DIAG_MISVAL="-1e34"
fi
- MOM6_ALLOW_LANDMASK_CHANGES='True'
+ MOM6_ALLOW_LANDMASK_CHANGES='False'
+ TOPOEDITS=""
;;
*)
echo "FATAL ERROR: Unsupported MOM6 resolution = ${mom6_res}, ABORT!"
@@ -378,10 +339,10 @@ if [[ "${skip_mom6}" == "false" ]]; then
export DT_DYNAM_MOM6 DT_THERM_MOM6
export FRUNOFF
export CHLCLIM
+ export TOPOEDITS
export MOM6_RIVER_RUNOFF
export MOM6_RESTART_SETTING
export eps_imesh
- export TOPOEDITS
export MOM6_DIAG_COORD_DEF_Z_FILE
export MOM6_DIAG_MISVAL
export MOM6_ALLOW_LANDMASK_CHANGES
@@ -397,6 +358,7 @@ if [[ "${skip_cice6}" == "false" ]]; 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")
@@ -470,39 +432,42 @@ if [[ "${skip_gocart}" == "false" ]]; then
fi
# Set the name of the UFS (previously nems) configure template to use
+# Default ufs.configure templates for supported model configurations
case "${model_list}" in
atm)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.atm.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.atm.IN"
;;
atm.aero)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.atm_aero.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.atmaero.IN"
;;
atm.wave)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.leapfrog_atm_wav.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.leapfrog_atm_wav.IN"
;;
atm.ocean.ice)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.s2s_esmf.IN"
;;
atm.ocean.ice.aero)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld_aero.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.s2sa_esmf.IN"
;;
atm.ocean.ice.wave)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld_outerwave.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.s2sw_esmf.IN"
;;
atm.ocean.ice.wave.aero)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld_aero_outerwave.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.s2swa_esmf.IN"
;;
*)
- echo "FATAL ERROR: Unable to determine appropriate UFS configure template for ${model_list}"
+ echo "FATAL ERROR: Unsupported UFSWM configuration for ${model_list}"
exit 16
;;
esac
+# Allow user to override the default template
+export ufs_configure_template=${ufs_configure_template:-${default_template:-"/dev/null"}}
+unset model_list default_template
+
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/gefs/config.wave b/parm/config/gefs/config.wave
index e04331e533..5f4448985c 100644
--- a/parm/config/gefs/config.wave
+++ b/parm/config/gefs/config.wave
@@ -7,11 +7,7 @@ echo "BEGIN: config.wave"
# Parameters that are common to all wave model steps
-# System and version
-export wave_sys_ver=v1.0.0
-
export EXECwave="${HOMEgfs}/exec"
-export FIXwave="${HOMEgfs}/fix/wave"
export PARMwave="${HOMEgfs}/parm/wave"
export USHwave="${HOMEgfs}/ush"
diff --git a/parm/config/gefs/config.wavepostbndpnt b/parm/config/gefs/config.wavepostbndpnt
new file mode 100644
index 0000000000..412c5fb42a
--- /dev/null
+++ b/parm/config/gefs/config.wavepostbndpnt
@@ -0,0 +1,11 @@
+#! /usr/bin/env bash
+
+########## config.wavepostbndpnt ##########
+# Wave steps specific
+
+echo "BEGIN: config.wavepostbndpnt"
+
+# Get task specific resources
+source "${EXPDIR}/config.resources" wavepostbndpnt
+
+echo "END: config.wavepostbndpnt"
diff --git a/parm/config/gefs/config.wavepostbndpntbll b/parm/config/gefs/config.wavepostbndpntbll
new file mode 100644
index 0000000000..6695ab0f84
--- /dev/null
+++ b/parm/config/gefs/config.wavepostbndpntbll
@@ -0,0 +1,11 @@
+#! /usr/bin/env bash
+
+########## config.wavepostbndpntbll ##########
+# Wave steps specific
+
+echo "BEGIN: config.wavepostbndpntbll"
+
+# Get task specific resources
+source "${EXPDIR}/config.resources" wavepostbndpntbll
+
+echo "END: config.wavepostbndpntbll"
diff --git a/parm/config/gefs/config.wavepostpnt b/parm/config/gefs/config.wavepostpnt
new file mode 100644
index 0000000000..e87237da82
--- /dev/null
+++ b/parm/config/gefs/config.wavepostpnt
@@ -0,0 +1,11 @@
+#! /usr/bin/env bash
+
+########## config.wavepostpnt ##########
+# Wave steps specific
+
+echo "BEGIN: config.wavepostpnt"
+
+# Get task specific resources
+source "${EXPDIR}/config.resources" wavepostpnt
+
+echo "END: config.wavepostpnt"
diff --git a/parm/config/gefs/config.wavepostsbs b/parm/config/gefs/config.wavepostsbs
new file mode 100644
index 0000000000..b3c5902e3c
--- /dev/null
+++ b/parm/config/gefs/config.wavepostsbs
@@ -0,0 +1,28 @@
+#! /usr/bin/env bash
+
+########## config.wavepostsbs ##########
+# Wave steps specific
+
+echo "BEGIN: config.wavepostsbs"
+
+# Get task specific resources
+source "${EXPDIR}/config.resources" wavepostsbs
+
+# Subgrid info for grib2 encoding
+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
+if [[ -n "${waveinterpGRD}" ]]; then
+ export DOGRI_WAV='YES' # Create interpolated grids
+else
+ export DOGRI_WAV='NO' # Do not create interpolated grids
+fi
+export DOSPC_WAV='YES' # Spectral post
+export DOBLL_WAV='YES' # Bulletin post
+
+echo "END: config.wavepostsbs"
diff --git a/parm/config/gefs/yaml/defaults.yaml b/parm/config/gefs/yaml/defaults.yaml
index ce5d8aeb3d..b19eb57e55 100644
--- a/parm/config/gefs/yaml/defaults.yaml
+++ b/parm/config/gefs/yaml/defaults.yaml
@@ -2,5 +2,6 @@ base:
DO_JEDIATMVAR: "NO"
DO_JEDIATMENS: "NO"
DO_JEDIOCNVAR: "NO"
- DO_JEDILANDDA: "NO"
+ DO_JEDISNOWDA: "NO"
DO_MERGENSST: "NO"
+ FHMAX_GFS: 120
diff --git a/parm/config/gfs/config.aeroanl b/parm/config/gfs/config.aeroanl
index 32ba43b7ba..8d8aa92c16 100644
--- a/parm/config/gfs/config.aeroanl
+++ b/parm/config/gfs/config.aeroanl
@@ -10,8 +10,7 @@ export OBS_YAML_DIR=${HOMEgfs}/sorc/gdas.cd/parm/aero/obs/config/
export OBS_LIST=${HOMEgfs}/sorc/gdas.cd/parm/aero/obs/lists/gdas_aero_prototype.yaml
export STATICB_TYPE='identity'
export BERROR_YAML=${HOMEgfs}/sorc/gdas.cd/parm/aero/berror/staticb_${STATICB_TYPE}.yaml
-export FIXgdas=${HOMEgfs}/fix/gdas
-export BERROR_DATA_DIR=${FIXgdas}/bump/aero/${CASE_ANL}/
+export BERROR_DATA_DIR=${FIXgfs}/gdas/bump/aero/${CASE_ANL}/
export BERROR_DATE="20160630.000000"
export io_layout_x=@IO_LAYOUT_X@
diff --git a/parm/config/gfs/config.anal b/parm/config/gfs/config.anal
index e3a17f9c6a..98d0e88cc2 100644
--- a/parm/config/gfs/config.anal
+++ b/parm/config/gfs/config.anal
@@ -45,51 +45,51 @@ export AMSR2BF=${AMSR2BF:-/dev/null}
# Set default values for info files and observation error
# NOTE: Remember to set PRVT in config.prep as OBERROR is set below
-export CONVINFO=${FIXgsi}/global_convinfo.txt
-export OZINFO=${FIXgsi}/global_ozinfo.txt
-export SATINFO=${FIXgsi}/global_satinfo.txt
-export OBERROR=${FIXgsi}/prepobs_errtable.global
+export CONVINFO=${FIXgfs}/gsi/global_convinfo.txt
+export OZINFO=${FIXgfs}/gsi/global_ozinfo.txt
+export SATINFO=${FIXgfs}/gsi/global_satinfo.txt
+export OBERROR=${FIXgfs}/gsi/prepobs_errtable.global
# Use experimental dumps in EMC GFS v16 parallels
if [[ ${RUN_ENVIR} == "emc" ]]; then
# Set info files and prepobs.errtable.global for GFS v16 retrospective parallels
if [[ "${PDY}${cyc}" -ge "2019021900" && "${PDY}${cyc}" -lt "2019110706" ]]; then
- export CONVINFO=${FIXgsi}/gfsv16_historical/global_convinfo.txt.2019021900
- export OBERROR=${FIXgsi}/gfsv16_historical/prepobs_errtable.global.2019021900
+ export CONVINFO=${FIXgfs}/gsi/gfsv16_historical/global_convinfo.txt.2019021900
+ export OBERROR=${FIXgfs}/gsi/gfsv16_historical/prepobs_errtable.global.2019021900
fi
# Place GOES-15 AMVs in monitor, assimilate GOES-17 AMVs, assimilate KOMPSAT-5 gps
if [[ "${PDY}${cyc}" -ge "2019110706" && "${PDY}${cyc}" -lt "2020040718" ]]; then
- export CONVINFO=${FIXgsi}/gfsv16_historical/global_convinfo.txt.2019110706
- export OBERROR=${FIXgsi}/gfsv16_historical/prepobs_errtable.global.2019110706
+ export CONVINFO=${FIXgfs}/gsi/gfsv16_historical/global_convinfo.txt.2019110706
+ export OBERROR=${FIXgfs}/gsi/gfsv16_historical/prepobs_errtable.global.2019110706
fi
# Assimilate 135 (T) & 235 (uv) Canadian AMDAR observations
if [[ "${PDY}${cyc}" -ge "2020040718" && "${PDY}${cyc}" -lt "2020052612" ]]; then
- export CONVINFO=${FIXgsi}/gfsv16_historical/global_convinfo.txt.2020040718
- export OBERROR=${FIXgsi}/gfsv16_historical/prepobs_errtable.global.2020040718
+ export CONVINFO=${FIXgfs}/gsi/gfsv16_historical/global_convinfo.txt.2020040718
+ export OBERROR=${FIXgfs}/gsi/gfsv16_historical/prepobs_errtable.global.2020040718
fi
# Assimilate COSMIC-2
if [[ "${PDY}${cyc}" -ge "2020052612" && "${PDY}${cyc}" -lt "2020082412" ]]; then
- export CONVINFO=${FIXgsi}/gfsv16_historical/global_convinfo.txt.2020052612
- export OBERROR=${FIXgsi}/gfsv16_historical/prepobs_errtable.global.2020040718
+ export CONVINFO=${FIXgfs}/gsi/gfsv16_historical/global_convinfo.txt.2020052612
+ export OBERROR=${FIXgfs}/gsi/gfsv16_historical/prepobs_errtable.global.2020040718
fi
# Assimilate HDOB
if [[ "${PDY}${cyc}" -ge "2020082412" && "${PDY}${cyc}" -lt "2020091612" ]]; then
- export CONVINFO=${FIXgsi}/gfsv16_historical/global_convinfo.txt.2020082412
+ export CONVINFO=${FIXgfs}/gsi/gfsv16_historical/global_convinfo.txt.2020082412
fi
# Assimilate Metop-C GNSSRO
if [[ "${PDY}${cyc}" -ge "2020091612" && "${PDY}${cyc}" -lt "2021031712" ]]; then
- export CONVINFO=${FIXgsi}/gfsv16_historical/global_convinfo.txt.2020091612
+ export CONVINFO=${FIXgfs}/gsi/gfsv16_historical/global_convinfo.txt.2020091612
fi
# Assimilate DO-2 GeoOptics
if [[ "${PDY}${cyc}" -ge "2021031712" && "${PDY}${cyc}" -lt "2021091612" ]]; then
- export CONVINFO=${FIXgsi}/gfsv16_historical/global_convinfo.txt.2021031712
+ export CONVINFO=${FIXgfs}/gsi/gfsv16_historical/global_convinfo.txt.2021031712
fi
# NOTE:
@@ -98,38 +98,38 @@ if [[ ${RUN_ENVIR} == "emc" ]]; then
# needed at this time.
# Assimilate COSMIC-2 GPS
# if [[ "${PDY}${cyc}" -ge "2021110312" && "${PDY}${cyc}" -lt "YYYYMMDDHH" ]]; then
- # export CONVINFO=$FIXgsi/gfsv16_historical/global_convinfo.txt.2021110312
+ # export CONVINFO=${FIXgfs}/gsi/gfsv16_historical/global_convinfo.txt.2021110312
# fi
# Turn off assmilation of OMPS during period of bad data
if [[ "${PDY}${cyc}" -ge "2020011600" && "${PDY}${cyc}" -lt "2020011806" ]]; then
- export OZINFO=${FIXgsi}/gfsv16_historical/global_ozinfo.txt.2020011600
+ export OZINFO=${FIXgfs}/gsi/gfsv16_historical/global_ozinfo.txt.2020011600
fi
# Set satinfo for start of GFS v16 parallels
if [[ "${PDY}${cyc}" -ge "2019021900" && "${PDY}${cyc}" -lt "2019110706" ]]; then
- export SATINFO=${FIXgsi}/gfsv16_historical/global_satinfo.txt.2019021900
+ export SATINFO=${FIXgfs}/gsi/gfsv16_historical/global_satinfo.txt.2019021900
fi
# Turn on assimilation of Metop-C AMSUA and MHS
if [[ "${PDY}${cyc}" -ge "2019110706" && "${PDY}${cyc}" -lt "2020022012" ]]; then
- export SATINFO=${FIXgsi}/gfsv16_historical/global_satinfo.txt.2019110706
+ export SATINFO=${FIXgfs}/gsi/gfsv16_historical/global_satinfo.txt.2019110706
fi
# Turn off assimilation of Metop-A MHS
if [[ "${PDY}${cyc}" -ge "2020022012" && "${PDY}${cyc}" -lt "2021052118" ]]; then
- export SATINFO=${FIXgsi}/gfsv16_historical/global_satinfo.txt.2020022012
+ export SATINFO=${FIXgfs}/gsi/gfsv16_historical/global_satinfo.txt.2020022012
fi
# Turn off assimilation of S-NPP CrIS
if [[ "${PDY}${cyc}" -ge "2021052118" && "${PDY}${cyc}" -lt "2021092206" ]]; then
- export SATINFO=${FIXgsi}/gfsv16_historical/global_satinfo.txt.2021052118
+ export SATINFO=${FIXgfs}/gsi/gfsv16_historical/global_satinfo.txt.2021052118
fi
# Turn off assimilation of MetOp-A IASI
if [[ "${PDY}${cyc}" -ge "2021092206" && "${PDY}${cyc}" -lt "2021102612" ]]; then
- export SATINFO=${FIXgsi}/gfsv16_historical/global_satinfo.txt.2021092206
+ export SATINFO=${FIXgfs}/gsi/gfsv16_historical/global_satinfo.txt.2021092206
fi
# NOTE:
@@ -139,7 +139,7 @@ if [[ ${RUN_ENVIR} == "emc" ]]; then
#
# Turn off assmilation of all Metop-A MHS
# if [[ "${PDY}${cyc}" -ge "2021110312" && "${PDY}${cyc}" -lt "YYYYMMDDHH" ]]; then
- # export SATINFO=$FIXgsi/gfsv16_historical/global_satinfo.txt.2021110312
+ # export SATINFO=${FIXgfs}/gsi/gfsv16_historical/global_satinfo.txt.2021110312
# fi
fi
diff --git a/parm/config/gfs/config.atmanl b/parm/config/gfs/config.atmanl
index abfbd80734..e344b0a662 100644
--- a/parm/config/gfs/config.atmanl
+++ b/parm/config/gfs/config.atmanl
@@ -8,11 +8,14 @@ echo "BEGIN: config.atmanl"
export CASE_ANL=${CASE}
export OBS_YAML_DIR=${HOMEgfs}/sorc/gdas.cd/parm/atm/obs/config/
export OBS_LIST=${HOMEgfs}/sorc/gdas.cd/parm/atm/obs/lists/gdas_prototype_3d.yaml
-export ATMVARYAML=${HOMEgfs}/sorc/gdas.cd/parm/atm/variational/3dvar_dripcg.yaml
+export ATMVARYAML=${HOMEgfs}/sorc/gdas.cd/parm/atm/variational/3dvar_drpcg.yaml
export STATICB_TYPE="gsibec"
export BERROR_YAML=${HOMEgfs}/sorc/gdas.cd/parm/atm/berror/staticb_${STATICB_TYPE}.yaml
export INTERP_METHOD='barycentric'
+export layout_x_atmanl=@LAYOUT_X_ATMANL@
+export layout_y_atmanl=@LAYOUT_Y_ATMANL@
+
export io_layout_x=@IO_LAYOUT_X@
export io_layout_y=@IO_LAYOUT_Y@
diff --git a/parm/config/gfs/config.atmensanl b/parm/config/gfs/config.atmensanl
index 58fd7b6e22..7a3a632bf8 100644
--- a/parm/config/gfs/config.atmensanl
+++ b/parm/config/gfs/config.atmensanl
@@ -10,6 +10,9 @@ export OBS_LIST=${HOMEgfs}/sorc/gdas.cd/parm/atm/obs/lists/lgetkf_prototype.yaml
export ATMENSYAML=${HOMEgfs}/sorc/gdas.cd/parm/atm/lgetkf/lgetkf.yaml
export INTERP_METHOD='barycentric'
+export layout_x_atmensanl=@LAYOUT_X_ATMENSANL@
+export layout_y_atmensanl=@LAYOUT_Y_ATMENSANL@
+
export io_layout_x=@IO_LAYOUT_X@
export io_layout_y=@IO_LAYOUT_Y@
diff --git a/parm/config/gfs/config.atmos_products b/parm/config/gfs/config.atmos_products
index c3e861b281..a5e65a3936 100644
--- a/parm/config/gfs/config.atmos_products
+++ b/parm/config/gfs/config.atmos_products
@@ -19,17 +19,23 @@ if [[ "${RUN:-}" == "gdas" ]]; then
export downset=1
export FHOUT_PGBS=${FHOUT:-1} # Output frequency of supplemental gfs pgb file at 1.0 and 0.5 deg
export FLXGF="NO" # Create interpolated sflux.1p00 file
+ export WGNE="NO" # WGNE products are created for first FHMAX_WGNE forecast hours
+ export FHMAX_WGNE=0
elif [[ "${RUN:-}" == "gfs" ]]; then
#JKHexport downset=2 ## create pgrb2b files
export downset=1 ## JKH
export FHOUT_PGBS=${FHOUT_GFS:-3} # Output frequency of supplemental gfs pgb file at 1.0 and 0.5 deg
- export FLXGF="NO" # Create interpolated sflux.1p00 file
+ export FLXGF="YES" # Create interpolated sflux.1p00 file
+ export WGNE="YES" # WGNE products are created for first FHMAX_WGNE forecast hours
+ export FHMAX_WGNE=180
fi
+export APCP_MSG="597" # Message number for APCP in GFSv16. Look for TODO in exglobal_atmos_products.sh
+
# paramlist files for the different forecast hours and downsets
-export paramlista="${HOMEgfs}/parm/post/global_1x1_paramlist_g2"
-export paramlista_anl="${HOMEgfs}/parm/post/global_1x1_paramlist_g2.anl"
-export paramlista_f000="${HOMEgfs}/parm/post/global_1x1_paramlist_g2.f000"
-export paramlistb="${HOMEgfs}/parm/post/global_master-catchup_parmlist_g2"
+export paramlista="${HOMEgfs}/parm/product/gfs.fFFF.paramlist.a.txt"
+export paramlista_anl="${HOMEgfs}/parm/product/gfs.anl.paramlist.a.txt"
+export paramlista_f000="${HOMEgfs}/parm/product/gfs.f000.paramlist.a.txt"
+export paramlistb="${HOMEgfs}/parm/product/gfs.fFFF.paramlist.b.txt"
echo "END: config.atmos_products"
diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base
new file mode 120000
index 0000000000..d28609708a
--- /dev/null
+++ b/parm/config/gfs/config.base
@@ -0,0 +1 @@
+config.base_hera
\ No newline at end of file
diff --git a/parm/config/gfs/config.base.emc.dyn b/parm/config/gfs/config.base.emc.dyn
deleted file mode 120000
index 6e9cfcec1a..0000000000
--- a/parm/config/gfs/config.base.emc.dyn
+++ /dev/null
@@ -1 +0,0 @@
-config.base.emc.dyn_hera
\ No newline at end of file
diff --git a/parm/config/gfs/config.base.emc.dyn_emc b/parm/config/gfs/config.base_emc
similarity index 91%
rename from parm/config/gfs/config.base.emc.dyn_emc
rename to parm/config/gfs/config.base_emc
index 88a9643ab8..205153313e 100644
--- a/parm/config/gfs/config.base.emc.dyn_emc
+++ b/parm/config/gfs/config.base_emc
@@ -30,16 +30,6 @@ export UTILgfs="${HOMEgfs}/util"
export EXECgfs="${HOMEgfs}/exec"
export SCRgfs="${HOMEgfs}/scripts"
-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"
-
########################################################################
# GLOBAL static environment parameters
@@ -95,7 +85,6 @@ export MODE="@MODE@" # cycled/forecast-only
# CLEAR
####################################################
# Build paths relative to $HOMEgfs
-export FIXgsi="${HOMEgfs}/fix/gsi"
export HOMEpost="${HOMEgfs}"
export HOMEobsproc="${BASE_GIT:-}/obsproc/v${obsproc_run_ver:-1.1.2}"
@@ -143,6 +132,7 @@ export RUN=${RUN:-${CDUMP:-"gfs"}} # RUN is defined in the job-card (ecf); CDUM
# Get all the COM path templates
source "${EXPDIR}/config.com"
+# shellcheck disable=SC2016
export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'}
export LOGSCRIPT=${LOGSCRIPT:-""}
#export ERRSCRIPT=${ERRSCRIPT:-"err_chk"}
@@ -182,16 +172,16 @@ export ICERES="${OCNRES}"
# These are the currently recommended grid-combinations
case "${CASE}" in
"C48")
- export waveGRD='glo_500'
+ export waveGRD='uglo_100km'
;;
"C96" | "C192")
- export waveGRD='glo_200'
+ export waveGRD='uglo_100km'
;;
"C384")
- export waveGRD='glo_025'
+ export waveGRD='uglo_100km'
;;
"C768" | "C1152")
- export waveGRD='mx025'
+ export waveGRD='uglo_m1g16'
;;
*)
echo "FATAL ERROR: Unrecognized CASE ${CASE}, ABORT!"
@@ -247,6 +237,7 @@ 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
# Cycle to run EnKF (set to BOTH for both gfs and gdas)
export EUPD_CYC="gdas"
@@ -256,16 +247,11 @@ 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_00=120
-export FHMAX_GFS_06=120
-export FHMAX_GFS_12=120
-export FHMAX_GFS_18=120
-current_fhmax_var=FHMAX_GFS_${cyc}; declare -x FHMAX_GFS=${!current_fhmax_var}
-
-export FHOUT_GFS=6 # Must be 6 for S2S until #1629 is addressed; 3 for ops
+export FHMAX_GFS=@FHMAX_GFS@
+export FHOUT_GFS=3
export FHMAX_HF_GFS=0
export FHOUT_HF_GFS=1
+export FHOUT_OCNICE_GFS=6
if (( gfs_cyc != 0 )); then
export STEP_GFS=$(( 24 / gfs_cyc ))
else
@@ -274,8 +260,7 @@ fi
export ILPOST=1 # gempak output frequency up to F120
# GFS restart interval in hours
-#JKHexport restart_interval_gfs=12
-export restart_interval_gfs=-1 ## JKH
+export restart_interval_gfs=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
@@ -311,7 +296,7 @@ export imp_physics=8
export DO_JEDIATMVAR="@DO_JEDIATMVAR@"
export DO_JEDIATMENS="@DO_JEDIATMENS@"
export DO_JEDIOCNVAR="@DO_JEDIOCNVAR@"
-export DO_JEDILANDDA="@DO_JEDILANDDA@"
+export DO_JEDISNOWDA="@DO_JEDISNOWDA@"
export DO_MERGENSST="@DO_MERGENSST@"
# Hybrid related
@@ -367,13 +352,13 @@ export MAKE_NSSTBUFR="@MAKE_NSSTBUFR@"
export MAKE_ACFTBUFR="@MAKE_ACFTBUFR@"
# Analysis increments to zero in CALCINCEXEC
-export INCREMENTS_TO_ZERO="'liq_wat_inc','icmr_inc'"
+export INCREMENTS_TO_ZERO="'liq_wat_inc','icmr_inc','rwmr_inc','snmr_inc','grle_inc'"
# Write analysis files for early cycle EnKF
export DO_CALC_INCREMENT_ENKF_GFS="YES"
# Stratospheric increments to zero
-export INCVARS_ZERO_STRAT="'sphum_inc','liq_wat_inc','icmr_inc'"
+export INCVARS_ZERO_STRAT="'sphum_inc','liq_wat_inc','icmr_inc','rwmr_inc','snmr_inc','grle_inc'"
export INCVARS_EFOLD="5"
# Swith to generate netcdf or binary diagnostic files. If not specified,
@@ -383,8 +368,9 @@ 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="YES" # Run METPLUS jobs - set METPLUS settings in config.metp
export DO_FIT2OBS="YES" # Run fit to observations package
+export DO_VRFY_OCEANDA="NO" # Run SOCA Ocean DA verification tasks
# Archiving options
export HPSSARCH="@HPSSARCH@" # save data to HPSS archive
@@ -402,4 +388,11 @@ 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
+ export DO_VERFRAD="NO" # Radiance data assimilation monitoring
+ export DO_VMINMON="NO" # GSI minimization monitoring
+fi
+
echo "END: config.base"
diff --git a/parm/config/gfs/config.base.emc.dyn_hera b/parm/config/gfs/config.base_hera
similarity index 92%
rename from parm/config/gfs/config.base.emc.dyn_hera
rename to parm/config/gfs/config.base_hera
index 231b48b0b2..9025fc788b 100644
--- a/parm/config/gfs/config.base.emc.dyn_hera
+++ b/parm/config/gfs/config.base_hera
@@ -30,16 +30,6 @@ export UTILgfs="${HOMEgfs}/util"
export EXECgfs="${HOMEgfs}/exec"
export SCRgfs="${HOMEgfs}/scripts"
-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"
-
########################################################################
# GLOBAL static environment parameters
@@ -95,7 +85,6 @@ export MODE="@MODE@" # cycled/forecast-only
# CLEAR
####################################################
# Build paths relative to $HOMEgfs
-export FIXgsi="${HOMEgfs}/fix/gsi"
export HOMEpost="${HOMEgfs}"
export HOMEobsproc="${BASE_GIT:-}/obsproc/v${obsproc_run_ver:-1.1.2}"
@@ -143,6 +132,7 @@ export RUN=${RUN:-${CDUMP:-"gfs"}} # RUN is defined in the job-card (ecf); CDUM
# Get all the COM path templates
source "${EXPDIR}/config.com"
+# shellcheck disable=SC2016
export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'}
export LOGSCRIPT=${LOGSCRIPT:-""}
#export ERRSCRIPT=${ERRSCRIPT:-"err_chk"}
@@ -182,16 +172,16 @@ export ICERES="${OCNRES}"
# These are the currently recommended grid-combinations
case "${CASE}" in
"C48")
- export waveGRD='glo_500'
+ export waveGRD='uglo_100km'
;;
"C96" | "C192")
- export waveGRD='glo_200'
+ export waveGRD='uglo_100km'
;;
"C384")
- export waveGRD='glo_025'
+ export waveGRD='uglo_100km'
;;
"C768" | "C1152")
- export waveGRD='mx025'
+ export waveGRD='uglo_m1g16'
;;
*)
echo "FATAL ERROR: Unrecognized CASE ${CASE}, ABORT!"
@@ -247,6 +237,7 @@ 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
# Cycle to run EnKF (set to BOTH for both gfs and gdas)
export EUPD_CYC="gdas"
@@ -256,16 +247,11 @@ 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_00=120
-export FHMAX_GFS_06=120
-export FHMAX_GFS_12=120
-export FHMAX_GFS_18=120
-current_fhmax_var=FHMAX_GFS_${cyc}; declare -x FHMAX_GFS=${!current_fhmax_var}
-
-export FHOUT_GFS=6 # Must be 6 for S2S until #1629 is addressed; 3 for ops
+export FHMAX_GFS=@FHMAX_GFS@
+export FHOUT_GFS=6 # Must be 6 for S2S until #1629 is addressed; 3 for ops ## JKH
export FHMAX_HF_GFS=0
export FHOUT_HF_GFS=1
+export FHOUT_OCNICE_GFS=6
if (( gfs_cyc != 0 )); then
export STEP_GFS=$(( 24 / gfs_cyc ))
else
@@ -311,7 +297,7 @@ export imp_physics=8
export DO_JEDIATMVAR="@DO_JEDIATMVAR@"
export DO_JEDIATMENS="@DO_JEDIATMENS@"
export DO_JEDIOCNVAR="@DO_JEDIOCNVAR@"
-export DO_JEDILANDDA="@DO_JEDILANDDA@"
+export DO_JEDISNOWDA="@DO_JEDISNOWDA@"
export DO_MERGENSST="@DO_MERGENSST@"
# Hybrid related
@@ -367,13 +353,13 @@ export MAKE_NSSTBUFR="@MAKE_NSSTBUFR@"
export MAKE_ACFTBUFR="@MAKE_ACFTBUFR@"
# Analysis increments to zero in CALCINCEXEC
-export INCREMENTS_TO_ZERO="'liq_wat_inc','icmr_inc'"
+export INCREMENTS_TO_ZERO="'liq_wat_inc','icmr_inc','rwmr_inc','snmr_inc','grle_inc'"
# Write analysis files for early cycle EnKF
export DO_CALC_INCREMENT_ENKF_GFS="YES"
# Stratospheric increments to zero
-export INCVARS_ZERO_STRAT="'sphum_inc','liq_wat_inc','icmr_inc'"
+export INCVARS_ZERO_STRAT="'sphum_inc','liq_wat_inc','icmr_inc','rwmr_inc','snmr_inc','grle_inc'"
export INCVARS_EFOLD="5"
# Swith to generate netcdf or binary diagnostic files. If not specified,
@@ -383,8 +369,9 @@ 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="YES" # Run METPLUS jobs - set METPLUS settings in config.metp
export DO_FIT2OBS="NO" # Run fit to observations package ## JKH
+export DO_VRFY_OCEANDA="NO" # Run SOCA Ocean DA verification tasks
# Archiving options
export HPSSARCH="@HPSSARCH@" # save data to HPSS archive
@@ -402,4 +389,11 @@ 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
+ export DO_VERFRAD="NO" # Radiance data assimilation monitoring
+ export DO_VMINMON="NO" # GSI minimization monitoring
+fi
+
echo "END: config.base"
diff --git a/parm/config/gfs/config.base.emc.dyn_jet b/parm/config/gfs/config.base_jet
similarity index 93%
rename from parm/config/gfs/config.base.emc.dyn_jet
rename to parm/config/gfs/config.base_jet
index be130a79ef..5d9cf5ecb5 100644
--- a/parm/config/gfs/config.base.emc.dyn_jet
+++ b/parm/config/gfs/config.base_jet
@@ -30,16 +30,6 @@ export UTILgfs="${HOMEgfs}/util"
export EXECgfs="${HOMEgfs}/exec"
export SCRgfs="${HOMEgfs}/scripts"
-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"
-
########################################################################
# GLOBAL static environment parameters
@@ -95,7 +85,6 @@ export MODE="@MODE@" # cycled/forecast-only
# CLEAR
####################################################
# Build paths relative to $HOMEgfs
-export FIXgsi="${HOMEgfs}/fix/gsi"
export HOMEpost="${HOMEgfs}"
export HOMEobsproc="${BASE_GIT:-}/obsproc/v${obsproc_run_ver:-1.1.2}"
@@ -143,6 +132,7 @@ export RUN=${RUN:-${CDUMP:-"gfs"}} # RUN is defined in the job-card (ecf); CDUM
# Get all the COM path templates
source "${EXPDIR}/config.com"
+# shellcheck disable=SC2016
export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'}
export LOGSCRIPT=${LOGSCRIPT:-""}
#export ERRSCRIPT=${ERRSCRIPT:-"err_chk"}
@@ -182,16 +172,16 @@ export ICERES="${OCNRES}"
# These are the currently recommended grid-combinations
case "${CASE}" in
"C48")
- export waveGRD='glo_500'
+ export waveGRD='uglo_100km'
;;
"C96" | "C192")
- export waveGRD='glo_200'
+ export waveGRD='uglo_100km'
;;
"C384")
- export waveGRD='glo_025'
+ export waveGRD='uglo_100km'
;;
"C768" | "C1152")
- export waveGRD='mx025'
+ export waveGRD='uglo_m1g16'
;;
*)
echo "FATAL ERROR: Unrecognized CASE ${CASE}, ABORT!"
@@ -247,6 +237,7 @@ 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
# Cycle to run EnKF (set to BOTH for both gfs and gdas)
export EUPD_CYC="gdas"
@@ -256,7 +247,7 @@ 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 FHMAX_GFS_00=168 ## JKH
export FHMAX_GFS_06=168 ## JKH
export FHMAX_GFS_12=168 ## JKH
@@ -266,6 +257,7 @@ current_fhmax_var=FHMAX_GFS_${cyc}; declare -x FHMAX_GFS=${!current_fhmax_var}
export FHOUT_GFS=6 # 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
if (( gfs_cyc != 0 )); then
export STEP_GFS=$(( 24 / gfs_cyc ))
else
@@ -311,7 +303,7 @@ export imp_physics=8
export DO_JEDIATMVAR="@DO_JEDIATMVAR@"
export DO_JEDIATMENS="@DO_JEDIATMENS@"
export DO_JEDIOCNVAR="@DO_JEDIOCNVAR@"
-export DO_JEDILANDDA="@DO_JEDILANDDA@"
+export DO_JEDISNOWDA="@DO_JEDISNOWDA@"
export DO_MERGENSST="@DO_MERGENSST@"
# Hybrid related
@@ -367,13 +359,13 @@ export MAKE_NSSTBUFR="@MAKE_NSSTBUFR@"
export MAKE_ACFTBUFR="@MAKE_ACFTBUFR@"
# Analysis increments to zero in CALCINCEXEC
-export INCREMENTS_TO_ZERO="'liq_wat_inc','icmr_inc'"
+export INCREMENTS_TO_ZERO="'liq_wat_inc','icmr_inc','rwmr_inc','snmr_inc','grle_inc'"
# Write analysis files for early cycle EnKF
export DO_CALC_INCREMENT_ENKF_GFS="YES"
# Stratospheric increments to zero
-export INCVARS_ZERO_STRAT="'sphum_inc','liq_wat_inc','icmr_inc'"
+export INCVARS_ZERO_STRAT="'sphum_inc','liq_wat_inc','icmr_inc','rwmr_inc','snmr_inc','grle_inc'"
export INCVARS_EFOLD="5"
# Swith to generate netcdf or binary diagnostic files. If not specified,
@@ -385,6 +377,7 @@ 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_FIT2OBS="NO" # Run fit to observations package ## JKH
+export DO_VRFY_OCEANDA="NO" # Run SOCA Ocean DA verification tasks
# Archiving options
export HPSSARCH="@HPSSARCH@" # save data to HPSS archive
@@ -402,4 +395,11 @@ 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
+ export DO_VERFRAD="NO" # Radiance data assimilation monitoring
+ export DO_VMINMON="NO" # GSI minimization monitoring
+fi
+
echo "END: config.base"
diff --git a/parm/config/gfs/config.com b/parm/config/gfs/config.com
index db648b5866..2f99e709ea 100644
--- a/parm/config/gfs/config.com
+++ b/parm/config/gfs/config.com
@@ -52,7 +52,7 @@ declare -rx COM_CONF_TMPL=${COM_BASE}'/conf'
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'
-declare -rx COM_LAND_ANALYSIS_TMPL=${COM_BASE}'/analysis/land'
+declare -rx COM_SNOW_ANALYSIS_TMPL=${COM_BASE}'/analysis/snow'
declare -rx COM_ATMOS_HISTORY_TMPL=${COM_BASE}'/model_data/atmos/history'
declare -rx COM_ATMOS_MASTER_TMPL=${COM_BASE}'/model_data/atmos/master'
declare -rx COM_ATMOS_GRIB_TMPL=${COM_BASE}'/products/atmos/grib2'
@@ -80,15 +80,16 @@ declare -rx COM_OCEAN_HISTORY_TMPL=${COM_BASE}'/model_data/ocean/history'
declare -rx COM_OCEAN_RESTART_TMPL=${COM_BASE}'/model_data/ocean/restart'
declare -rx COM_OCEAN_INPUT_TMPL=${COM_BASE}'/model_data/ocean/input'
declare -rx COM_OCEAN_ANALYSIS_TMPL=${COM_BASE}'/analysis/ocean'
-declare -rx COM_OCEAN_2D_TMPL=${COM_BASE}'/products/ocean/2D'
-declare -rx COM_OCEAN_3D_TMPL=${COM_BASE}'/products/ocean/3D'
-declare -rx COM_OCEAN_XSECT_TMPL=${COM_BASE}'/products/ocean/xsect'
+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_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'
+declare -rx COM_ICE_NETCDF_TMPL=${COM_BASE}'/products/ice/netcdf'
+declare -rx COM_ICE_GRIB_TMPL=${COM_BASE}'/products/ice/grib2'
+declare -rx COM_ICE_GRIB_GRID_TMPL=${COM_ICE_GRIB_TMPL}'/${GRID}'
declare -rx COM_CHEM_HISTORY_TMPL=${COM_BASE}'/model_data/chem/history'
declare -rx COM_CHEM_ANALYSIS_TMPL=${COM_BASE}'/analysis/chem'
diff --git a/parm/config/gfs/config.efcs b/parm/config/gfs/config.efcs
index 283ec3ab7e..7a48feb4ce 100644
--- a/parm/config/gfs/config.efcs
+++ b/parm/config/gfs/config.efcs
@@ -5,14 +5,16 @@
echo "BEGIN: config.efcs"
-# Turn off components in ensemble via _ENKF, or use setting from deterministic
-export DO_AERO=${DO_AERO_ENKF:-${DO_AERO:-"NO"}}
-export DO_OCN=${DO_OCN_ENKF:-${DO_OCN:-"NO"}}
-export DO_ICE=${DO_ICE_ENKF:-${DO_ICE:-"NO"}}
-export DO_WAVE=${DO_WAVE_ENKF:-${DO_WAVE:-"NO"}}
+# Turn off components in ensemble
+# export DO_AERO="NO"
+# export DO_OCN="NO"
+# export DO_ICE="NO"
+export DO_WAVE="NO"
+
+export CASE="${CASE_ENS}"
# Source model specific information that is resolution dependent
-string="--fv3 ${CASE_ENS}"
+string="--fv3 ${CASE}"
# Ocean/Ice/Waves ensemble configurations are identical to deterministic member
[[ "${DO_OCN}" == "YES" ]] && string="${string} --mom6 ${OCNRES}"
[[ "${DO_ICE}" == "YES" ]] && string="${string} --cice6 ${ICERES}"
@@ -25,15 +27,23 @@ source "${EXPDIR}/config.ufs" ${string}
# Get task specific resources
. "${EXPDIR}/config.resources" efcs
+# nggps_diag_nml
+export FHOUT=${FHOUT_ENKF:-3}
+if [[ ${RUN} == "enkfgfs" ]]; then
+ export FHOUT=${FHOUT_ENKF_GFS:-${FHOUT}}
+fi
+
+# model_configure
+export FHMIN=${FHMIN_ENKF:-3}
+export FHMAX=${FHMAX_ENKF:-9}
+if [[ ${RUN} == "enkfgfs" ]]; then
+ export FHMAX=${FHMAX_ENKF_GFS:-${FHMAX}}
+fi
+
# Use serial I/O for ensemble (lustre?)
export OUTPUT_FILETYPE_ATM="netcdf"
export OUTPUT_FILETYPE_SFC="netcdf"
-# Number of enkf members per fcst job
-export NMEM_EFCSGRP=2
-export NMEM_EFCSGRP_GFS=1
-export RERUN_EFCSGRP="NO"
-
# Turn off inline UPP for EnKF forecast
export WRITE_DOPOST=".false."
@@ -56,14 +66,33 @@ export SPPT_LSCALE=500000.
export SPPT_LOGIT=".true."
export SPPT_SFCLIMIT=".true."
-if [[ "${QUILTING}" = ".true." ]] && [[ "${OUTPUT_GRID}" = "gaussian_grid" ]]; then
+if [[ "${QUILTING}" == ".true." ]] && [[ "${OUTPUT_GRID}" == "gaussian_grid" ]]; then
export DIAG_TABLE="${HOMEgfs}/parm/ufs/fv3/diag_table_da"
else
export DIAG_TABLE="${HOMEgfs}/parm/ufs/fv3/diag_table_da_orig"
fi
+# Model config option for Ensemble
+# export TYPE=nh # choices: nh, hydro
+# export MONO=non-mono # choices: mono, non-mono
+
+# gfs_physics_nml
+export FHSWR=3600.
+export FHLWR=3600.
+export IEMS=1
+export ISOL=2
+export ICO2=2
+export dspheat=".true."
+export shal_cnv=".true."
+export FHZER=6
+
+# Set PREFIX_ATMINC to r when recentering on
+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
+if [[ "${DOIAU_ENKF:-}" == "YES" ]]; then
export restart_interval="3"
else
export restart_interval="6"
diff --git a/parm/config/gfs/config.esfc b/parm/config/gfs/config.esfc
index 2bb3d48bb4..7c32313758 100644
--- a/parm/config/gfs/config.esfc
+++ b/parm/config/gfs/config.esfc
@@ -16,4 +16,9 @@ if [ $DOIAU_ENKF = "YES" ]; then
export DOSFCANL_ENKF="NO"
fi
+# Turn off NST in JEDIATMENS
+if [[ "${DO_JEDIATMENS}" == "YES" ]]; then
+ export DONST="NO"
+fi
+
echo "END: config.esfc"
diff --git a/parm/config/gfs/config.fcst b/parm/config/gfs/config.fcst
index a4c4ee8072..e42cb0731e 100644
--- a/parm/config/gfs/config.fcst
+++ b/parm/config/gfs/config.fcst
@@ -21,6 +21,25 @@ string="--fv3 ${CASE}"
# shellcheck disable=SC2086
source "${EXPDIR}/config.ufs" ${string}
+# Forecast length for GFS forecast
+case ${RUN} in
+ *gfs)
+ # shellcheck disable=SC2153
+ export FHMAX=${FHMAX_GFS}
+ # shellcheck disable=SC2153
+ export FHOUT=${FHOUT_GFS}
+ export FHMAX_HF=${FHMAX_HF_GFS}
+ export FHOUT_HF=${FHOUT_HF_GFS}
+ export FHOUT_OCNICE=${FHOUT_OCNICE_GFS}
+ ;;
+ *gdas)
+ export FHMAX_HF=0
+ export FHOUT_HF=0
+ ;;
+ *)
+ echo "FATAL ERROR: Unsupported RUN '${RUN}'"
+ exit 1
+esac
# Get task specific resources
source "${EXPDIR}/config.resources" fcst
@@ -283,20 +302,6 @@ export FSICL="0"
export FSICS="0"
#---------------------------------------------------------------------
-
-# ideflate: netcdf zlib lossless compression (0-9): 0 no compression
-# nbits: netcdf lossy compression level (0-32): 0 lossless
-export ideflate=1
-export nbits=14
-export ishuffle=0
-# compression for RESTART files written by FMS
-export shuffle=1
-export deflate_level=1
-
-#---------------------------------------------------------------------
-# Disable the use of coupler.res; get model start time from model_configure
-export USE_COUPLER_RES="NO"
-
if [[ "${CDUMP}" =~ "gdas" ]] ; then # GDAS cycle specific parameters
# Variables used in DA cycling
diff --git a/parm/config/gfs/config.ice b/parm/config/gfs/config.ice
index 205458020f..055bd1e2bb 100644
--- a/parm/config/gfs/config.ice
+++ b/parm/config/gfs/config.ice
@@ -6,4 +6,9 @@ echo "BEGIN: config.ice"
export min_seaice="1.0e-6"
export use_cice_alb=".true."
+export MESH_ICE="mesh.mx${ICERES}.nc"
+
+export CICE_GRID="grid_cice_NEMS_mx${ICERES}.nc"
+export CICE_MASK="kmtu_cice_NEMS_mx${ICERES}.nc"
+
echo "END: config.ice"
diff --git a/parm/config/gfs/config.landanl b/parm/config/gfs/config.landanl
deleted file mode 100644
index 70ebae7529..0000000000
--- a/parm/config/gfs/config.landanl
+++ /dev/null
@@ -1,34 +0,0 @@
-#! /usr/bin/env bash
-
-########## config.landanl ##########
-# configuration common to land analysis tasks
-
-echo "BEGIN: config.landanl"
-
-# Get task specific resources
-. "${EXPDIR}/config.resources" landanl
-
-obs_list_name=gdas_land_gts_only.yaml
-if [[ "${cyc}" = "18" ]]; then
- obs_list_name=gdas_land_prototype.yaml
-fi
-
-export OBS_YAML_DIR=${HOMEgfs}/sorc/gdas.cd/parm/land/obs/config/
-export OBS_LIST=${HOMEgfs}/sorc/gdas.cd/parm/land/obs/lists/${obs_list_name}
-
-# Name of the JEDI executable and its yaml template
-export JEDIEXE="${HOMEgfs}/exec/fv3jedi_letkf.x"
-export JEDIYAML="${HOMEgfs}/sorc/gdas.cd/parm/land/letkfoi/letkfoi.yaml"
-
-# Ensemble member properties
-export SNOWDEPTHVAR="snodl"
-export BESTDDEV="30." # Background Error Std. Dev. for LETKFOI
-
-# Name of the executable that applies increment to bkg and its namelist template
-export APPLY_INCR_EXE="${HOMEgfs}/exec/apply_incr.exe"
-export APPLY_INCR_NML_TMPL="${HOMEgfs}/sorc/gdas.cd/parm/land/letkfoi/apply_incr_nml.j2"
-
-export io_layout_x=@IO_LAYOUT_X@
-export io_layout_y=@IO_LAYOUT_Y@
-
-echo "END: config.landanl"
diff --git a/parm/config/gfs/config.metp b/parm/config/gfs/config.metp
index c90903f6a5..8260d1c472 100644
--- a/parm/config/gfs/config.metp
+++ b/parm/config/gfs/config.metp
@@ -23,6 +23,7 @@ export VERIF_GLOBALSH=${HOMEverif_global}/ush/run_verif_global_in_global_workflo
export model=${PSLOT}
export model_file_format="pgbf{lead?fmt=%2H}.${CDUMP}.{init?fmt=%Y%m%d%H}.grib2"
export model_hpss_dir=${ATARDIR}/..
+export model_dir=${ARCDIR}/..
export get_data_from_hpss="NO"
export hpss_walltime="10"
## OUTPUT SETTINGS
diff --git a/parm/config/gfs/config.nsst b/parm/config/gfs/config.nsst
index db4367b2c0..7bda81f058 100644
--- a/parm/config/gfs/config.nsst
+++ b/parm/config/gfs/config.nsst
@@ -10,6 +10,11 @@ echo "BEGIN: config.nsst"
# nstf_name(1) : NST_MODEL (NSST Model) : 0 = OFF, 1 = ON but uncoupled, 2 = ON and coupled
export NST_MODEL=2
+# Set NST_MODEL for JEDIATMVAR or JEDIATMENS
+if [[ "${DO_JEDIATMVAR}" == "YES" || "${DO_JEDIATMENS}" == "YES" ]]; then
+ export NST_MODEL=1
+fi
+
# nstf_name(2) : NST_SPINUP : 0 = OFF, 1 = ON,
export NST_SPINUP=0
cdate="${PDY}${cyc}"
diff --git a/parm/config/gfs/config.oceanice_products b/parm/config/gfs/config.oceanice_products
new file mode 100644
index 0000000000..bea70c21cc
--- /dev/null
+++ b/parm/config/gfs/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="${HOMEgfs}/parm/post/oceanice_products.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.ocn b/parm/config/gfs/config.ocn
index 37f6a966aa..317a76e58a 100644
--- a/parm/config/gfs/config.ocn
+++ b/parm/config/gfs/config.ocn
@@ -2,8 +2,7 @@
echo "BEGIN: config.ocn"
-# MOM_input template to use
-export MOM_INPUT="MOM_input_template_${OCNRES}"
+export MESH_OCN="mesh.mx${OCNRES}.nc"
export DO_OCN_SPPT="NO" # In MOM_input, this variable is determines OCN_SPPT (OCN_SPPT = True|False)
export DO_OCN_PERT_EPBL="NO" # In MOM_input, this variable determines PERT_EPBL (PERT_EPBL = True|False)
@@ -17,6 +16,14 @@ if [[ "${DO_JEDIOCNVAR}" == "YES" ]]; then
else
export ODA_INCUPD="False"
fi
-export ODA_INCUPD_NHOURS="3.0" # In MOM_input, this is time interval for applying increment
+
+# Time interval for applying the increment
+if [[ "${DOIAU}" == "YES" ]]; then
+ export ODA_INCUPD_NHOURS="6.0"
+else
+ export ODA_INCUPD_NHOURS="3.0"
+fi
+
+
echo "END: config.ocn"
diff --git a/parm/config/gfs/config.ocnpost b/parm/config/gfs/config.ocnpost
deleted file mode 100644
index 851c476e6c..0000000000
--- a/parm/config/gfs/config.ocnpost
+++ /dev/null
@@ -1,29 +0,0 @@
-#! /usr/bin/env bash
-
-########## config.ocnpost ##########
-
-echo "BEGIN: config.ocnpost"
-
-# Get task specific resources
-source "${EXPDIR}/config.resources" ocnpost
-
-# Convert netcdf files to grib files using post job
-#-------------------------------------------
-case "${OCNRES}" in
- "025") export MAKE_OCN_GRIB="YES";;
- "050") export MAKE_OCN_GRIB="NO";;
- "100") export MAKE_OCN_GRIB="NO";;
- "500") export MAKE_OCN_GRIB="NO";;
- *) export MAKE_OCN_GRIB="NO";;
-esac
-
-if [[ "${machine}" = "WCOSS2" ]] || [[ "${machine}" = "HERCULES" ]]; then
- #Currently the conversion to netcdf uses NCL which is not on WCOSS2 or HERCULES
- #This should be removed when this is updated
- export MAKE_OCN_GRIB="NO"
-fi
-
-# No. of forecast hours to process in a single job
-export NFHRS_PER_GROUP=3
-
-echo "END: config.ocnpost"
diff --git a/parm/config/gfs/config.prep b/parm/config/gfs/config.prep
index d5ac1925f7..9733eabc19 100644
--- a/parm/config/gfs/config.prep
+++ b/parm/config/gfs/config.prep
@@ -20,7 +20,6 @@ export COMINsyn=${COMINsyn:-$(compath.py ${envir}/com/gfs/${gfs_ver})/syndat}
export HOMERELO=$HOMEgfs
export EXECRELO=${HOMERELO}/exec
-export FIXRELO=${HOMERELO}/fix/am
export USHRELO=${HOMERELO}/ush
# Adjust observation error for GFS v16 parallels
@@ -28,18 +27,18 @@ export USHRELO=${HOMERELO}/ush
# NOTE: Remember to set OBERROR in config.anal as PRVT is set below
#
# Set default prepobs_errtable.global
-export PRVT=$FIXgsi/prepobs_errtable.global
+export PRVT=${FIXgfs}/gsi/prepobs_errtable.global
# Set prepobs.errtable.global for GFS v16 retrospective parallels
if [[ $RUN_ENVIR == "emc" ]]; then
if [[ "${PDY}${cyc}" -ge "2019021900" && "${PDY}${cyc}" -lt "2019110706" ]]; then
- export PRVT=$FIXgsi/gfsv16_historical/prepobs_errtable.global.2019021900
+ export PRVT=${FIXgfs}/gsi/gfsv16_historical/prepobs_errtable.global.2019021900
fi
# Place GOES-15 AMVs in monitor, assimilate GOES-17 AMVs, assimilate KOMPSAT-5 gps
if [[ "${PDY}${cyc}" -ge "2019110706" && "${PDY}${cyc}" -lt "2020040718" ]]; then
- export PRVT=$FIXgsi/gfsv16_historical/prepobs_errtable.global.2019110706
+ export PRVT=${FIXgfs}/gsi/gfsv16_historical/prepobs_errtable.global.2019110706
fi
# NOTE:
diff --git a/parm/config/gfs/config.preplandobs b/parm/config/gfs/config.preplandobs
deleted file mode 100644
index 20ae20b5ad..0000000000
--- a/parm/config/gfs/config.preplandobs
+++ /dev/null
@@ -1,18 +0,0 @@
-#! /usr/bin/env bash
-
-########## config.preplandobs ##########
-# Land Obs Prep specific
-
-echo "BEGIN: config.preplandobs"
-
-# Get task specific resources
-. "${EXPDIR}/config.resources" preplandobs
-
-export GTS_OBS_LIST="${HOMEgfs}/sorc/gdas.cd/parm/land/prep/prep_gts.yaml"
-export BUFR2IODAX="${HOMEgfs}/exec/bufr2ioda.x"
-export FIMS_NML_TMPL="${HOMEgfs}/sorc/gdas.cd/parm/land/prep/fims.nml.j2"
-export IMS_OBS_LIST="${HOMEgfs}/sorc/gdas.cd/parm/land/prep/prep_ims.yaml"
-export CALCFIMSEXE="${HOMEgfs}/exec/calcfIMS.exe"
-export IMS2IODACONV="${HOMEgfs}/ush/imsfv3_scf2ioda.py"
-
-echo "END: config.preplandobs"
diff --git a/parm/config/gfs/config.prepoceanobs b/parm/config/gfs/config.prepoceanobs
index d7c4e37bb9..56fc349ce2 100644
--- a/parm/config/gfs/config.prepoceanobs
+++ b/parm/config/gfs/config.prepoceanobs
@@ -7,7 +7,7 @@ echo "BEGIN: config.prepoceanobs"
export OCNOBS2IODAEXEC=${HOMEgfs}/sorc/gdas.cd/build/bin/gdas_obsprovider2ioda.x
export OBS_YAML_DIR=${HOMEgfs}/sorc/gdas.cd/parm/soca/obs/config
-export OBSPROC_YAML=@OBSPROC_YAML@
+export OBSPREP_YAML=@OBSPREP_YAML@
export OBS_LIST=@SOCA_OBS_LIST@
[[ -n "${OBS_LIST}" ]] || export OBS_LIST=${HOMEgfs}/sorc/gdas.cd/parm/soca/obs/obs_list.yaml
export OBS_YAML=${OBS_LIST}
diff --git a/parm/config/gfs/config.prepsnowobs b/parm/config/gfs/config.prepsnowobs
new file mode 100644
index 0000000000..e2bfdd1905
--- /dev/null
+++ b/parm/config/gfs/config.prepsnowobs
@@ -0,0 +1,21 @@
+#! /usr/bin/env bash
+
+########## config.prepsnowobs ##########
+# Snow Obs Prep specific
+
+echo "BEGIN: config.prepsnowobs"
+
+# Get task specific resources
+. "${EXPDIR}/config.resources" prepsnowobs
+
+export GTS_OBS_LIST="${HOMEgfs}/parm/gdas/snow/prep/prep_gts.yaml.j2"
+export IMS_OBS_LIST="${HOMEgfs}/parm/gdas/snow/prep/prep_ims.yaml.j2"
+
+export BUFR2IODAX="${HOMEgfs}/exec/bufr2ioda.x"
+
+export CALCFIMSEXE="${HOMEgfs}/exec/calcfIMS.exe"
+export FIMS_NML_TMPL="${HOMEgfs}/parm/gdas/snow/prep/fims.nml.j2"
+
+export IMS2IODACONV="${HOMEgfs}/ush/imsfv3_scf2ioda.py"
+
+echo "END: config.prepsnowobs"
diff --git a/parm/config/gfs/config.resources b/parm/config/gfs/config.resources
index c179c33df4..7e1f66cb04 100644
--- a/parm/config/gfs/config.resources
+++ b/parm/config/gfs/config.resources
@@ -4,22 +4,22 @@
# Set resource information for job tasks
# e.g. walltime, node, cores per node, memory etc.
-if [[ $# -ne 1 ]]; then
+if (( $# != 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 "prep preplandobs prepatmiodaobs"
+ echo "prep prepsnowobs prepatmiodaobs"
echo "atmanlinit atmanlrun atmanlfinal"
echo "atmensanlinit atmensanlrun atmensanlfinal"
- echo "landanl"
+ echo "snowanl"
echo "aeroanlinit aeroanlrun aeroanlfinal"
echo "anal sfcanl analcalc analdiag fcst echgres"
echo "upp atmos_products"
echo "tracker genesis genesis_fsu"
echo "verfozn verfrad vminmon fit2obs metp arch cleanup"
echo "eobs ediag eomg eupd ecen esfc efcs epos earc"
- echo "init_chem mom6ic ocnpost"
+ echo "init_chem mom6ic oceanice_products"
echo "waveinit waveprep wavepostsbs wavepostbndpnt wavepostbndpntbll wavepostpnt"
echo "wavegempak waveawipsbulls waveawipsgridded"
echo "postsnd awips gempak npoess"
@@ -32,672 +32,644 @@ step=$1
echo "BEGIN: config.resources"
-if [[ "${machine}" = "WCOSS2" ]]; then
- export npe_node_max=128
-elif [[ "${machine}" = "JET" ]]; then
- if [[ "${PARTITION_POST_BATCH}" = "sjet" ]]; then
- export npe_node_max=16
- elif [[ "${PARTITION_BATCH}" = "xjet" ]]; then
- export npe_node_max=24
- elif [[ ${PARTITION_BATCH} = "vjet" || ${PARTITION_BATCH} = "sjet" ]]; then
- export npe_node_max=16
- elif [[ ${PARTITION_BATCH} = "kjet" ]]; then
- export npe_node_max=40
- fi
-elif [[ "${machine}" = "HERA" ]]; then
- export npe_node_max=40
-elif [[ "${machine}" = "S4" ]]; then
- if [[ ${PARTITION_BATCH} = "s4" ]]; then
- export npe_node_max=32
- elif [[ ${PARTITION_BATCH} = "ivy" ]]; then
- export npe_node_max=20
- fi
-elif [[ "${machine}" = "AWSPW" ]]; then
- export PARTITION_BATCH="compute"
- export npe_node_max=40
-elif [[ "${machine}" = "ORION" ]]; then
- export npe_node_max=40
-elif [[ "${machine}" = "HERCULES" ]]; then
- export npe_node_max=80
-fi
+case ${machine} in
+ "WCOSS2") npe_node_max=128;;
+ "HERA") npe_node_max=40;;
+ "ORION") npe_node_max=40;;
+ "HERCULES") npe_node_max=80;;
+ "JET")
+ case ${PARTITION_BATCH} in
+ "xjet") npe_node_max=24;;
+ "vjet" | "sjet") npe_node_max=16;;
+ "kjet") npe_node_max=40;;
+ *)
+ echo "FATAL ERROR: Unknown partition ${PARTITION_BATCH} specified for ${machine}"
+ exit 3
+ esac
+ ;;
+ "S4")
+ case ${PARTITION_BATCH} in
+ "s4") npe_node_max=32;;
+ "ivy") npe_node_max=20;;
+ *)
+ echo "FATAL ERROR: Unknown partition ${PARTITION_BATCH} specified for ${machine}"
+ exit 3
+ esac
+ ;;
+ "AWSPW")
+ export PARTITION_BATCH="compute"
+ npe_node_max=40
+ ;;
+ "CONTAINER")
+ npe_node_max=1
+ ;;
+ *)
+ echo "FATAL ERROR: Unknown machine encountered by ${BASH_SOURCE[0]}"
+ exit 2
+ ;;
+esac
+export npe_node_max
-if [[ "${step}" = "prep" ]]; then
+case ${step} in
+ "prep")
export wtime_prep='00:30:00'
export npe_prep=4
export npe_node_prep=2
export nth_prep=1
- if [[ "${machine}" = "WCOSS2" ]]; then
+ if [[ "${machine}" == "WCOSS2" ]]; then
export is_exclusive=True
else
- export memory_prep="40G"
+ export memory_prep="40GB"
fi
+ ;;
-elif [[ "${step}" = "preplandobs" ]]; then
- export wtime_preplandobs="00:05:00"
- npe_preplandobs=1
- export npe_preplandobs
- export nth_preplandobs=1
- npe_node_preplandobs=1
- export npe_node_preplandobs
+ "prepsnowobs")
+ export wtime_prepsnowobs="00:05:00"
+ export npe_prepsnowobs=1
+ export nth_prepsnowobs=1
+ export npe_node_prepsnowobs=1
+ ;;
-elif [[ "${step}" = "prepatmiodaobs" ]]; then
- export wtime_prepatmiodaobs="00:10:00"
+ "prepatmiodaobs")
+ export wtime_prepatmiodaobs="00:30:00"
export npe_prepatmiodaobs=1
export nth_prepatmiodaobs=1
- npe_node_prepatmiodaobs=$(echo "${npe_node_max} / ${nth_prepatmiodaobs}" | bc)
- export npe_node_prepatmiodaobs
+ export npe_node_prepatmiodaobs=$(( npe_node_max / nth_prepatmiodaobs ))
+ ;;
-elif [[ "${step}" = "aerosol_init" ]]; then
+ "aerosol_init")
export wtime_aerosol_init="00:05:00"
export npe_aerosol_init=1
export nth_aerosol_init=1
- npe_node_aerosol_init=$(echo "${npe_node_max} / ${nth_aerosol_init}" | bc)
- export npe_node_aerosol_init
+ export npe_node_aerosol_init=$(( npe_node_max / nth_aerosol_init ))
export NTASKS=${npe_aerosol_init}
- export memory_aerosol_init="6G"
-
-elif [[ "${step}" = "waveinit" ]]; then
+ export memory_aerosol_init="6GB"
+ ;;
+ "waveinit")
export wtime_waveinit="00:10:00"
export npe_waveinit=12
export nth_waveinit=1
- npe_node_waveinit=$(echo "${npe_node_max} / ${nth_waveinit}" | bc)
- export npe_node_waveinit
+ export npe_node_waveinit=$(( npe_node_max / nth_waveinit ))
export NTASKS=${npe_waveinit}
export memory_waveinit="2GB"
+ ;;
-elif [[ "${step}" = "waveprep" ]]; then
-
+ "waveprep")
export wtime_waveprep="00:10:00"
export npe_waveprep=5
export npe_waveprep_gfs=65
export nth_waveprep=1
export nth_waveprep_gfs=1
- npe_node_waveprep=$(echo "${npe_node_max} / ${nth_waveprep}" | bc)
- export npe_node_waveprep
- npe_node_waveprep_gfs=$(echo "${npe_node_max} / ${nth_waveprep_gfs}" | bc)
- export npe_node_waveprep_gfs
+ export npe_node_waveprep=$(( npe_node_max / nth_waveprep ))
+ export npe_node_waveprep_gfs=$(( npe_node_max / nth_waveprep_gfs ))
export NTASKS=${npe_waveprep}
export NTASKS_gfs=${npe_waveprep_gfs}
export memory_waveprep="100GB"
export memory_waveprep_gfs="150GB"
+ ;;
-elif [[ "${step}" = "wavepostsbs" ]]; then
-
+ "wavepostsbs")
export wtime_wavepostsbs="00:20:00"
export wtime_wavepostsbs_gfs="03:00:00"
export npe_wavepostsbs=8
export nth_wavepostsbs=1
- npe_node_wavepostsbs=$(echo "${npe_node_max} / ${nth_wavepostsbs}" | bc)
- export npe_node_wavepostsbs
+ export npe_node_wavepostsbs=$(( npe_node_max / nth_wavepostsbs ))
export NTASKS=${npe_wavepostsbs}
export memory_wavepostsbs="10GB"
export memory_wavepostsbs_gfs="10GB"
+ ;;
-elif [[ "${step}" = "wavepostbndpnt" ]]; then
-
+ "wavepostbndpnt")
export wtime_wavepostbndpnt="01:00:00"
export npe_wavepostbndpnt=240
export nth_wavepostbndpnt=1
- npe_node_wavepostbndpnt=$(echo "${npe_node_max} / ${nth_wavepostbndpnt}" | bc)
- export npe_node_wavepostbndpnt
+ export npe_node_wavepostbndpnt=$(( npe_node_max / nth_wavepostbndpnt ))
export NTASKS=${npe_wavepostbndpnt}
export is_exclusive=True
+ ;;
-elif [[ "${step}" = "wavepostbndpntbll" ]]; then
-
+ "wavepostbndpntbll")
export wtime_wavepostbndpntbll="01:00:00"
export npe_wavepostbndpntbll=448
export nth_wavepostbndpntbll=1
- npe_node_wavepostbndpntbll=$(echo "${npe_node_max} / ${nth_wavepostbndpntbll}" | bc)
- export npe_node_wavepostbndpntbll
+ export npe_node_wavepostbndpntbll=$(( npe_node_max / nth_wavepostbndpntbll ))
export NTASKS=${npe_wavepostbndpntbll}
export is_exclusive=True
+ ;;
-elif [[ "${step}" = "wavepostpnt" ]]; then
-
+ "wavepostpnt")
export wtime_wavepostpnt="04:00:00"
export npe_wavepostpnt=200
export nth_wavepostpnt=1
- npe_node_wavepostpnt=$(echo "${npe_node_max} / ${nth_wavepostpnt}" | bc)
- export npe_node_wavepostpnt
+ export npe_node_wavepostpnt=$(( npe_node_max / nth_wavepostpnt ))
export NTASKS=${npe_wavepostpnt}
export is_exclusive=True
+ ;;
-elif [[ "${step}" = "wavegempak" ]]; then
-
+ "wavegempak")
export wtime_wavegempak="02:00:00"
export npe_wavegempak=1
export nth_wavegempak=1
- npe_node_wavegempak=$(echo "${npe_node_max} / ${nth_wavegempak}" | bc)
- export npe_node_wavegempak
+ export npe_node_wavegempak=$(( npe_node_max / nth_wavegempak ))
export NTASKS=${npe_wavegempak}
export memory_wavegempak="1GB"
+ ;;
-elif [[ "${step}" = "waveawipsbulls" ]]; then
-
+ "waveawipsbulls")
export wtime_waveawipsbulls="00:20:00"
export npe_waveawipsbulls=1
export nth_waveawipsbulls=1
- npe_node_waveawipsbulls=$(echo "${npe_node_max} / ${nth_waveawipsbulls}" | bc)
- export npe_node_waveawipsbulls
+ export npe_node_waveawipsbulls=$(( npe_node_max / nth_waveawipsbulls ))
export NTASKS=${npe_waveawipsbulls}
export is_exclusive=True
+ ;;
-elif [[ ${step} = "waveawipsgridded" ]]; then
-
+ "waveawipsgridded")
export wtime_waveawipsgridded="02:00:00"
export npe_waveawipsgridded=1
export nth_waveawipsgridded=1
- npe_node_waveawipsgridded=$(echo "${npe_node_max} / ${nth_waveawipsgridded}" | bc)
- export npe_node_waveawipsgridded
+ export npe_node_waveawipsgridded=$(( npe_node_max / nth_waveawipsgridded ))
export NTASKS=${npe_waveawipsgridded}
export memory_waveawipsgridded_gfs="1GB"
+ ;;
-elif [[ "${step}" = "atmanlinit" ]]; then
+ "atmanlinit")
+ export layout_x=${layout_x_atmanl}
+ export layout_y=${layout_y_atmanl}
- # make below case dependent later
- export layout_x=1
- export layout_y=1
-
- layout_gsib_x=$(echo "${layout_x} * 3" | bc)
- export layout_gsib_x
- layout_gsib_y=$(echo "${layout_y} * 2" | bc)
- export layout_gsib_y
+ export layout_gsib_x=$(( layout_x * 3 ))
+ export layout_gsib_y=$(( layout_y * 2 ))
export wtime_atmanlinit="00:10:00"
export npe_atmanlinit=1
export nth_atmanlinit=1
- npe_node_atmanlinit=$(echo "${npe_node_max} / ${nth_atmanlinit}" | bc)
+ export npe_node_atmanlinit=$(( npe_node_max / nth_atmanlinit ))
export npe_node_atmanlinit
export memory_atmanlinit="3072M"
+ ;;
-elif [[ "${step}" = "atmanlrun" ]]; then
-
- # make below case dependent later
- export layout_x=1
- export layout_y=1
+ "atmanlrun")
+ export layout_x=${layout_x_atmanl}
+ export layout_y=${layout_y_atmanl}
export wtime_atmanlrun="00:30:00"
- npe_atmanlrun=$(echo "${layout_x} * ${layout_y} * 6" | bc)
- export npe_atmanlrun
- npe_atmanlrun_gfs=$(echo "${layout_x} * ${layout_y} * 6" | bc)
- export npe_atmanlrun_gfs
+ export npe_atmanlrun=$(( layout_x * layout_y * 6 ))
+ export npe_atmanlrun_gfs=$(( layout_x * layout_y * 6 ))
export nth_atmanlrun=1
export nth_atmanlrun_gfs=${nth_atmanlrun}
- npe_node_atmanlrun=$(echo "${npe_node_max} / ${nth_atmanlrun}" | bc)
- export npe_node_atmanlrun
+ export npe_node_atmanlrun=$(( npe_node_max / nth_atmanlrun ))
+ export memory_atmanlrun="96GB"
export is_exclusive=True
+ ;;
-elif [[ "${step}" = "atmanlfinal" ]]; then
-
+ "atmanlfinal")
export wtime_atmanlfinal="00:30:00"
export npe_atmanlfinal=${npe_node_max}
export nth_atmanlfinal=1
- npe_node_atmanlfinal=$(echo "${npe_node_max} / ${nth_atmanlfinal}" | bc)
- export npe_node_atmanlfinal
+ export npe_node_atmanlfinal=$(( npe_node_max / nth_atmanlfinal ))
export is_exclusive=True
+ ;;
-elif [[ "${step}" = "landanl" ]]; then
- # below lines are for creating JEDI YAML
- case ${CASE} in
- C768)
+ "snowanl")
+ # below lines are for creating JEDI YAML
+ case ${CASE} in
+ "C768")
layout_x=6
layout_y=6
;;
- C384)
+ "C384")
layout_x=5
layout_y=5
;;
- C192 | C96 | C48)
+ "C192" | "C96" | "C48")
layout_x=1
layout_y=1
;;
- *)
- echo "FATAL ERROR: Resolution not supported for land analysis'"
- exit 1
- esac
-
- export layout_x
- export layout_y
-
- export wtime_landanl="00:15:00"
- npe_landanl=$(echo "${layout_x} * ${layout_y} * 6" | bc)
- export npe_landanl
- export nth_landanl=1
- npe_node_landanl=$(echo "${npe_node_max} / ${nth_landanl}" | bc)
- export npe_node_landanl
-
-elif [[ "${step}" = "aeroanlinit" ]]; then
-
- # below lines are for creating JEDI YAML
- case ${CASE} in
- C768)
+ *)
+ echo "FATAL ERROR: Resources not defined for job ${job} at resolution ${CASE}"
+ exit 4
+ esac
+
+ export layout_x
+ export layout_y
+
+ export wtime_snowanl="00:15:00"
+ export npe_snowanl=$(( layout_x * layout_y * 6 ))
+ export nth_snowanl=1
+ export npe_node_snowanl=$(( npe_node_max / nth_snowanl ))
+ ;;
+
+ "aeroanlinit")
+ # below lines are for creating JEDI YAML
+ case ${CASE} in
+ "C768")
layout_x=8
layout_y=8
;;
- C384)
+ "C384")
layout_x=8
layout_y=8
;;
- C192 | C96)
+ "C192" | "C96")
layout_x=8
layout_y=8
;;
- C48 )
+ "C48" )
# this case is for testing only
layout_x=1
layout_y=1
;;
*)
- echo "FATAL ERROR: Resolution not supported for aerosol analysis'"
- exit 1
+ echo "FATAL ERROR: Resources not defined for job ${job} at resolution ${CASE}"
+ exit 4
esac
export layout_x
export layout_y
-
export wtime_aeroanlinit="00:10:00"
export npe_aeroanlinit=1
export nth_aeroanlinit=1
- npe_node_aeroanlinit=$(echo "${npe_node_max} / ${nth_aeroanlinit}" | bc)
- export npe_node_aeroanlinit
+ export npe_node_aeroanlinit=$(( npe_node_max / nth_aeroanlinit ))
export memory_aeroanlinit="3072M"
+ ;;
-elif [[ "${step}" = "aeroanlrun" ]]; then
-
- case ${CASE} in
- C768)
+ "aeroanlrun")
+ case ${CASE} in
+ "C768")
layout_x=8
layout_y=8
;;
- C384)
+ "C384")
layout_x=8
layout_y=8
;;
- C192 | C96)
+ "C192" | "C96")
layout_x=8
layout_y=8
;;
- C48 )
+ "C48" )
# this case is for testing only
layout_x=1
layout_y=1
;;
*)
- echo "FATAL ERROR: Resolution ${CASE} is not supported, ABORT!"
- exit 1
+ echo "FATAL ERROR: Resources not defined for job ${job} at resolution ${CASE}"
+ exit 4
esac
export layout_x
export layout_y
export wtime_aeroanlrun="00:30:00"
- npe_aeroanlrun=$(echo "${layout_x} * ${layout_y} * 6" | bc)
- export npe_aeroanlrun
- npe_aeroanlrun_gfs=$(echo "${layout_x} * ${layout_y} * 6" | bc)
- export npe_aeroanlrun_gfs
+ export npe_aeroanlrun=$(( layout_x * layout_y * 6 ))
+ export npe_aeroanlrun_gfs=$(( layout_x * layout_y * 6 ))
export nth_aeroanlrun=1
export nth_aeroanlrun_gfs=1
- npe_node_aeroanlrun=$(echo "${npe_node_max} / ${nth_aeroanlrun}" | bc)
- export npe_node_aeroanlrun
+ export npe_node_aeroanlrun=$(( npe_node_max / nth_aeroanlrun ))
export is_exclusive=True
+ ;;
-elif [[ "${step}" = "aeroanlfinal" ]]; then
-
+ "aeroanlfinal")
export wtime_aeroanlfinal="00:10:00"
export npe_aeroanlfinal=1
export nth_aeroanlfinal=1
- npe_node_aeroanlfinal=$(echo "${npe_node_max} / ${nth_aeroanlfinal}" | bc)
- export npe_node_aeroanlfinal
+ export npe_node_aeroanlfinal=$(( npe_node_max / nth_aeroanlfinal ))
export memory_aeroanlfinal="3072M"
+ ;;
-elif [[ "${step}" = "ocnanalprep" ]]; then
-
+ "ocnanalprep")
export wtime_ocnanalprep="00:10:00"
export npe_ocnanalprep=1
export nth_ocnanalprep=1
- npe_node_ocnanalprep=$(echo "${npe_node_max} / ${nth_ocnanalprep}" | bc)
- export npe_node_ocnanalprep
+ export npe_node_ocnanalprep=$(( npe_node_max / nth_ocnanalprep ))
export memory_ocnanalprep="24GB"
+ ;;
-elif [[ "${step}" = "prepoceanobs" ]]; then
-
+ "prepoceanobs")
export wtime_prepoceanobs="00:10:00"
export npe_prepoceanobs=1
export nth_prepoceanobs=1
- npe_node_prepoceanobs=$(echo "${npe_node_max} / ${nth_prepoceanobs}" | bc)
- export npe_node_prepoceanobs
- export memory_prepoceanobs="24GB"
-
-
-elif [[ "${step}" = "ocnanalbmat" ]]; then
- npes=16
- case ${CASE} in
- C384)
- npes=480
- ;;
- C96)
- npes=16
- ;;
- C48)
- npes=16
- ;;
+ export npe_node_prepoceanobs=$(( npe_node_max / nth_prepoceanobs ))
+ export memory_prepoceanobs="48GB"
+ ;;
+
+ "ocnanalbmat")
+ npes=16
+ case ${CASE} in
+ "C384") npes=480;;
+ "C96") npes=16;;
+ "C48") npes=16;;
*)
- echo "FATAL: Resolution not supported'"
- exit 1
+ echo "FATAL ERROR: Resources not defined for job ${job} at resolution ${CASE}"
+ exit 4
esac
export wtime_ocnanalbmat="00:30:00"
export npe_ocnanalbmat=${npes}
export nth_ocnanalbmat=1
export is_exclusive=True
- npe_node_ocnanalbmat=$(echo "${npe_node_max} / ${nth_ocnanalbmat}" | bc)
- export npe_node_ocnanalbmat
+ export npe_node_ocnanalbmat=$(( npe_node_max / nth_ocnanalbmat ))
+ ;;
-elif [[ "${step}" = "ocnanalrun" ]]; then
- npes=16
- case ${CASE} in
- C384)
+ "ocnanalrun")
+ npes=16
+ case ${CASE} in
+ "C384")
npes=480
memory_ocnanalrun="128GB"
;;
- C96)
+ "C96")
npes=16
;;
- C48)
+ "C48")
npes=16
memory_ocnanalrun="64GB"
;;
*)
- echo "FATAL: Resolution not supported'"
- exit 1
+ echo "FATAL ERROR: Resources not defined for job ${job} at resolution ${CASE}"
+ exit 4
esac
export wtime_ocnanalrun="00:15:00"
export npe_ocnanalrun=${npes}
- export nth_ocnanalrun=2
+ export nth_ocnanalrun=1
export is_exclusive=True
- npe_node_ocnanalrun=$(echo "${npe_node_max} / ${nth_ocnanalrun}" | bc)
- export npe_node_ocnanalrun
+ export npe_node_ocnanalrun=$(( npe_node_max / nth_ocnanalrun ))
export memory_ocnanalrun
-
-elif [[ "${step}" = "ocnanalchkpt" ]]; then
-
- export wtime_ocnanalchkpt="00:10:00"
- export npe_ocnanalchkpt=1
- export nth_ocnanalchkpt=1
- npe_node_ocnanalchkpt=$(echo "${npe_node_max} / ${nth_ocnanalchkpt}" | bc)
- export npe_node_ocnanalchkpt
- case ${CASE} in
- C384)
- export memory_ocnanalchkpt="128GB"
- ;;
- C96)
- export memory_ocnanalchkpt="32GB"
- ;;
- C48)
- export memory_ocnanalchkpt="32GB"
- ;;
+ ;;
+
+ "ocnanalchkpt")
+ export wtime_ocnanalchkpt="00:10:00"
+ export npe_ocnanalchkpt=1
+ export nth_ocnanalchkpt=1
+ export npe_node_ocnanalchkpt=$(( npe_node_max / nth_ocnanalchkpt ))
+ case ${CASE} in
+ "C384")
+ memory_ocnanalchkpt="128GB"
+ npes=40;;
+ "C96")
+ memory_ocnanalchkpt="32GB"
+ npes=16;;
+ "C48")
+ memory_ocnanalchkpt="32GB"
+ npes=8;;
*)
- echo "FATAL: Resolution not supported'"
- exit 1
+ echo "FATAL ERROR: Resources not defined for job ${job} at resolution ${CASE}"
+ exit 4
esac
+ export npe_ocnanalchkpt=${npes}
+ export memory_ocnanalchkpt
+ ;;
-elif [[ "${step}" = "ocnanalpost" ]]; then
-
+ "ocnanalpost")
export wtime_ocnanalpost="00:30:00"
export npe_ocnanalpost=${npe_node_max}
export nth_ocnanalpost=1
- npe_node_ocnanalpost=$(echo "${npe_node_max} / ${nth_ocnanalpost}" | bc)
- export npe_node_ocnanalpost
-
-elif [[ "${step}" = "ocnanalvrfy" ]]; then
+ export npe_node_ocnanalpost=$(( npe_node_max / nth_ocnanalpost ))
+ ;;
+ "ocnanalvrfy")
export wtime_ocnanalvrfy="00:35:00"
export npe_ocnanalvrfy=1
export nth_ocnanalvrfy=1
- npe_node_ocnanalvrfy=$(echo "${npe_node_max} / ${nth_ocnanalvrfy}" | bc)
- export npe_node_ocnanalvrfy
+ export npe_node_ocnanalvrfy=$(( npe_node_max / nth_ocnanalvrfy ))
export memory_ocnanalvrfy="24GB"
+ ;;
-elif [[ "${step}" = "anal" ]]; then
-
+ "anal")
export wtime_anal="00:50:00"
export wtime_anal_gfs="00:40:00"
export npe_anal=780
export nth_anal=5
export npe_anal_gfs=825
export nth_anal_gfs=5
- if [[ "${machine}" = "WCOSS2" ]]; then
+ if [[ "${machine}" == "WCOSS2" ]]; then
export nth_anal=8
export nth_anal_gfs=8
fi
- if [[ "${CASE}" = "C384" ]]; then
- export npe_anal=160
- export npe_anal_gfs=160
- export nth_anal=10
- export nth_anal_gfs=10
- if [[ "${machine}" = "S4" ]]; then
- #On the S4-s4 partition, this is accomplished by increasing the task
- #count to a multiple of 32
- if [[ ${PARTITION_BATCH} = "s4" ]]; then
+ case ${CASE} in
+ "C384")
+ export npe_anal=160
+ export npe_anal_gfs=160
+ export nth_anal=10
+ export nth_anal_gfs=10
+ if [[ ${machine} = "S4" ]]; then
+ #On the S4-s4 partition, this is accomplished by increasing the task
+ #count to a multiple of 32
+ if [[ ${PARTITION_BATCH} = "s4" ]]; then
export npe_anal=416
export npe_anal_gfs=416
- fi
- #S4 is small, so run this task with just 1 thread
- export nth_anal=1
- export nth_anal_gfs=1
- export wtime_anal="02:00:00"
- fi
- fi
- if [[ "${CASE}" = "C192" || "${CASE}" = "C96" || "${CASE}" = "C48" ]]; then
- export npe_anal=84
- export npe_anal_gfs=84
- if [[ "${machine}" = "S4" ]]; then
- export nth_anal=4
- export nth_anal_gfs=4
- #Adjust job count for S4
- if [[ "${PARTITION_BATCH}" = "s4" ]]; then
+ fi
+ #S4 is small, so run this task with just 1 thread
+ export nth_anal=1
+ export nth_anal_gfs=1
+ export wtime_anal="02:00:00"
+ fi
+ ;;
+ "C192" | "C96" | "C48")
+ export npe_anal=84
+ export npe_anal_gfs=84
+ if [[ ${machine} == "S4" ]]; then
+ export nth_anal=4
+ export nth_anal_gfs=4
+ #Adjust job count for S4
+ if [[ ${PARTITION_BATCH} == "s4" ]]; then
export npe_anal=88
export npe_anal_gfs=88
- elif [[ ${PARTITION_BATCH} = "ivy" ]]; then
+ elif [[ ${PARTITION_BATCH} == "ivy" ]]; then
export npe_anal=90
export npe_anal_gfs=90
- fi
- fi
- fi
- npe_node_anal=$(echo "${npe_node_max} / ${nth_anal}" | bc)
- export npe_node_anal
+ fi
+ fi
+ ;;
+ *)
+ echo "FATAL ERROR: Resources not defined for job ${job} at resolution ${CASE}"
+ exit 4
+ ;;
+ esac
+ export npe_node_anal=$(( npe_node_max / nth_anal ))
export nth_cycle=${nth_anal}
- npe_node_cycle=$(echo "${npe_node_max} / ${nth_cycle}" | bc)
- export npe_node_cycle
+ export npe_node_cycle=$(( npe_node_max / nth_cycle ))
export is_exclusive=True
+ ;;
-elif [[ "${step}" = "analcalc" ]]; then
-
+ "analcalc")
export wtime_analcalc="00:10:00"
export npe_analcalc=127
export ntasks="${npe_analcalc}"
export nth_analcalc=1
export nth_echgres=4
export nth_echgres_gfs=12
- npe_node_analcalc=$(echo "${npe_node_max} / ${nth_analcalc}" | bc)
- export npe_node_analcalc
+ export npe_node_analcalc=$(( npe_node_max / nth_analcalc ))
export is_exclusive=True
export memory_analcalc="48GB"
+ ;;
-elif [[ "${step}" = "analdiag" ]]; then
-
+ "analdiag")
export wtime_analdiag="00:15:00"
export npe_analdiag=96 # Should be at least twice npe_ediag
export nth_analdiag=1
- npe_node_analdiag=$(echo "${npe_node_max} / ${nth_analdiag}" | bc)
- export npe_node_analdiag
+ export npe_node_analdiag=$(( npe_node_max / nth_analdiag ))
export memory_analdiag="48GB"
+ ;;
-elif [[ "${step}" = "sfcanl" ]]; then
-
+ "sfcanl")
export wtime_sfcanl="00:10:00"
export npe_sfcanl=6
export nth_sfcanl=1
- npe_node_sfcanl=$(echo "${npe_node_max} / ${nth_sfcanl}" | bc)
- export npe_node_sfcanl
+ export npe_node_sfcanl=$(( npe_node_max / nth_sfcanl ))
export is_exclusive=True
+ ;;
-elif [[ "${step}" = "fcst" || "${step}" = "efcs" ]]; then
-
+ "fcst" | "efcs")
export is_exclusive=True
- if [[ "${step}" = "fcst" ]]; then
- _CDUMP_LIST=${CDUMP:-"gdas gfs"}
- elif [[ "${step}" = "efcs" ]]; then
- _CDUMP_LIST=${CDUMP:-"enkfgdas enkfgfs"}
+ if [[ "${step}" == "fcst" ]]; then
+ _CDUMP_LIST=${CDUMP:-"gdas gfs"}
+ elif [[ "${step}" == "efcs" ]]; then
+ _CDUMP_LIST=${CDUMP:-"enkfgdas enkfgfs"}
fi
# During workflow creation, we need resources for all CDUMPs and CDUMP is undefined
for _CDUMP in ${_CDUMP_LIST}; do
- if [[ "${_CDUMP}" =~ "gfs" ]]; then
- export layout_x=${layout_x_gfs}
- export layout_y=${layout_y_gfs}
- export WRITE_GROUP=${WRITE_GROUP_GFS}
- export WRTTASK_PER_GROUP_PER_THREAD=${WRTTASK_PER_GROUP_PER_THREAD_GFS}
- ntasks_fv3=${ntasks_fv3_gfs}
- ntasks_quilt=${ntasks_quilt_gfs}
- nthreads_fv3=${nthreads_fv3_gfs}
- fi
+ if [[ "${_CDUMP}" =~ "gfs" ]]; then
+ export layout_x=${layout_x_gfs}
+ export layout_y=${layout_y_gfs}
+ export WRITE_GROUP=${WRITE_GROUP_GFS}
+ export WRTTASK_PER_GROUP_PER_THREAD=${WRTTASK_PER_GROUP_PER_THREAD_GFS}
+ ntasks_fv3=${ntasks_fv3_gfs}
+ ntasks_quilt=${ntasks_quilt_gfs}
+ nthreads_fv3=${nthreads_fv3_gfs}
+ fi
- # PETS for the atmosphere dycore
- (( FV3PETS = ntasks_fv3 * nthreads_fv3 ))
- echo "FV3 using (nthreads, PETS) = (${nthreads_fv3}, ${FV3PETS})"
-
- # PETS for quilting
- if [[ "${QUILTING:-}" = ".true." ]]; then
- (( QUILTPETS = ntasks_quilt * nthreads_fv3 ))
- (( WRTTASK_PER_GROUP = WRTTASK_PER_GROUP_PER_THREAD ))
- export WRTTASK_PER_GROUP
- else
- QUILTPETS=0
- fi
- echo "QUILT using (nthreads, PETS) = (${nthreads_fv3}, ${QUILTPETS})"
-
- # Total PETS for the atmosphere component
- ATMTHREADS=${nthreads_fv3}
- (( ATMPETS = FV3PETS + QUILTPETS ))
- export ATMPETS ATMTHREADS
- echo "FV3ATM using (nthreads, PETS) = (${ATMTHREADS}, ${ATMPETS})"
-
- # Total PETS for the coupled model (starting w/ the atmosphere)
- NTASKS_TOT=${ATMPETS}
-
- # The mediator PETS can overlap with other components, usually it lands on the atmosphere tasks.
- # However, it is suggested limiting mediator PETS to 300, as it may cause the slow performance.
- # See https://docs.google.com/document/d/1bKpi-52t5jIfv2tuNHmQkYUe3hkKsiG_DG_s6Mnukog/edit
- # TODO: Update reference when moved to ufs-weather-model RTD
- MEDTHREADS=${nthreads_mediator:-1}
- MEDPETS=${MEDPETS:-${FV3PETS}}
- [[ "${MEDPETS}" -gt 300 ]] && MEDPETS=300
- export MEDPETS MEDTHREADS
- echo "MEDIATOR using (threads, PETS) = (${MEDTHREADS}, ${MEDPETS})"
-
- CHMPETS=0; CHMTHREADS=0
- if [[ "${DO_AERO}" = "YES" ]]; then
- # GOCART shares the same grid and forecast tasks as FV3 (do not add write grid component tasks).
- (( CHMTHREADS = ATMTHREADS ))
- (( CHMPETS = FV3PETS ))
- # Do not add to NTASKS_TOT
- echo "GOCART using (threads, PETS) = (${CHMTHREADS}, ${CHMPETS})"
- fi
- export CHMPETS CHMTHREADS
-
- WAVPETS=0; WAVTHREADS=0
- if [[ "${DO_WAVE}" = "YES" ]]; then
- (( WAVPETS = ntasks_ww3 * nthreads_ww3 ))
- (( WAVTHREADS = nthreads_ww3 ))
- echo "WW3 using (threads, PETS) = (${WAVTHREADS}, ${WAVPETS})"
- (( NTASKS_TOT = NTASKS_TOT + WAVPETS ))
- fi
- export WAVPETS WAVTHREADS
-
- OCNPETS=0; OCNTHREADS=0
- if [[ "${DO_OCN}" = "YES" ]]; then
- (( OCNPETS = ntasks_mom6 * nthreads_mom6 ))
- (( OCNTHREADS = nthreads_mom6 ))
- echo "MOM6 using (threads, PETS) = (${OCNTHREADS}, ${OCNPETS})"
- (( NTASKS_TOT = NTASKS_TOT + OCNPETS ))
- fi
- export OCNPETS OCNTHREADS
-
- ICEPETS=0; ICETHREADS=0
- if [[ "${DO_ICE}" = "YES" ]]; then
- (( ICEPETS = ntasks_cice6 * nthreads_cice6 ))
- (( ICETHREADS = nthreads_cice6 ))
- echo "CICE6 using (threads, PETS) = (${ICETHREADS}, ${ICEPETS})"
- (( NTASKS_TOT = NTASKS_TOT + ICEPETS ))
- fi
- export ICEPETS ICETHREADS
-
- echo "Total PETS for ${_CDUMP} = ${NTASKS_TOT}"
-
- if [[ "${_CDUMP}" =~ "gfs" ]]; then
- declare -x "npe_${step}_gfs"="${NTASKS_TOT}"
- declare -x "nth_${step}_gfs"=1 # ESMF handles threading for the UFS-weather-model
- declare -x "npe_node_${step}_gfs"="${npe_node_max}"
- else
- declare -x "npe_${step}"="${NTASKS_TOT}"
- declare -x "nth_${step}"=1 # ESMF handles threading for the UFS-weather-model
- declare -x "npe_node_${step}"="${npe_node_max}"
- fi
+ # PETS for the atmosphere dycore
+ (( FV3PETS = ntasks_fv3 * nthreads_fv3 ))
+ echo "FV3 using (nthreads, PETS) = (${nthreads_fv3}, ${FV3PETS})"
+
+ # PETS for quilting
+ if [[ "${QUILTING:-}" == ".true." ]]; then
+ (( QUILTPETS = ntasks_quilt * nthreads_fv3 ))
+ (( WRTTASK_PER_GROUP = WRTTASK_PER_GROUP_PER_THREAD ))
+ export WRTTASK_PER_GROUP
+ else
+ QUILTPETS=0
+ fi
+ echo "QUILT using (nthreads, PETS) = (${nthreads_fv3}, ${QUILTPETS})"
+
+ # Total PETS for the atmosphere component
+ ATMTHREADS=${nthreads_fv3}
+ (( ATMPETS = FV3PETS + QUILTPETS ))
+ export ATMPETS ATMTHREADS
+ echo "FV3ATM using (nthreads, PETS) = (${ATMTHREADS}, ${ATMPETS})"
+
+ # Total PETS for the coupled model (starting w/ the atmosphere)
+ NTASKS_TOT=${ATMPETS}
+
+ # The mediator PETS can overlap with other components, usually it lands on the atmosphere tasks.
+ # However, it is suggested limiting mediator PETS to 300, as it may cause the slow performance.
+ # See https://docs.google.com/document/d/1bKpi-52t5jIfv2tuNHmQkYUe3hkKsiG_DG_s6Mnukog/edit
+ # TODO: Update reference when moved to ufs-weather-model RTD
+ MEDTHREADS=${nthreads_mediator:-1}
+ MEDPETS=${MEDPETS:-${FV3PETS}}
+ (( "${MEDPETS}" > 300 )) && MEDPETS=300
+ export MEDPETS MEDTHREADS
+ echo "MEDIATOR using (threads, PETS) = (${MEDTHREADS}, ${MEDPETS})"
+
+ CHMPETS=0; CHMTHREADS=0
+ if [[ "${DO_AERO}" == "YES" ]]; then
+ # GOCART shares the same grid and forecast tasks as FV3 (do not add write grid component tasks).
+ (( CHMTHREADS = ATMTHREADS ))
+ (( CHMPETS = FV3PETS ))
+ # Do not add to NTASKS_TOT
+ echo "GOCART using (threads, PETS) = (${CHMTHREADS}, ${CHMPETS})"
+ fi
+ export CHMPETS CHMTHREADS
+
+ WAVPETS=0; WAVTHREADS=0
+ if [[ "${DO_WAVE}" == "YES" ]]; then
+ (( WAVPETS = ntasks_ww3 * nthreads_ww3 ))
+ (( WAVTHREADS = nthreads_ww3 ))
+ echo "WW3 using (threads, PETS) = (${WAVTHREADS}, ${WAVPETS})"
+ (( NTASKS_TOT = NTASKS_TOT + WAVPETS ))
+ fi
+ export WAVPETS WAVTHREADS
+
+ OCNPETS=0; OCNTHREADS=0
+ if [[ "${DO_OCN}" == "YES" ]]; then
+ (( OCNPETS = ntasks_mom6 * nthreads_mom6 ))
+ (( OCNTHREADS = nthreads_mom6 ))
+ echo "MOM6 using (threads, PETS) = (${OCNTHREADS}, ${OCNPETS})"
+ (( NTASKS_TOT = NTASKS_TOT + OCNPETS ))
+ fi
+ export OCNPETS OCNTHREADS
+
+ ICEPETS=0; ICETHREADS=0
+ if [[ "${DO_ICE}" == "YES" ]]; then
+ (( ICEPETS = ntasks_cice6 * nthreads_cice6 ))
+ (( ICETHREADS = nthreads_cice6 ))
+ echo "CICE6 using (threads, PETS) = (${ICETHREADS}, ${ICEPETS})"
+ (( NTASKS_TOT = NTASKS_TOT + ICEPETS ))
+ fi
+ export ICEPETS ICETHREADS
+
+ echo "Total PETS for ${_CDUMP} = ${NTASKS_TOT}"
+
+ if [[ "${_CDUMP}" =~ "gfs" ]]; then
+ declare -x "npe_${step}_gfs"="${NTASKS_TOT}"
+ declare -x "nth_${step}_gfs"=1 # ESMF handles threading for the UFS-weather-model
+ declare -x "npe_node_${step}_gfs"="${npe_node_max}"
+ else
+ declare -x "npe_${step}"="${NTASKS_TOT}"
+ declare -x "nth_${step}"=1 # ESMF handles threading for the UFS-weather-model
+ declare -x "npe_node_${step}"="${npe_node_max}"
+ fi
done
case "${CASE}" in
"C48" | "C96" | "C192")
- declare -x "wtime_${step}"="00:30:00"
+ declare -x "wtime_${step}"="00:15:00"
declare -x "wtime_${step}_gfs"="03:00:00"
;;
"C384")
- declare -x "wtime_${step}"="00:20:00"
+ declare -x "wtime_${step}"="00:30:00"
declare -x "wtime_${step}_gfs"="06:00:00"
;;
"C768" | "C1152")
- declare -x "wtime_${step}"="01:00:00"
+ declare -x "wtime_${step}"="00:30:00"
declare -x "wtime_${step}_gfs"="06:00:00"
;;
*)
- echo "FATAL ERROR: Resolution ${CASE} not supported in ${step}"
- exit 1
+ echo "FATAL ERROR: Resources not defined for job ${job} at resolution ${CASE}"
+ exit 4
;;
esac
unset _CDUMP _CDUMP_LIST
unset NTASKS_TOT
+ ;;
-elif [[ "${step}" = "ocnpost" ]]; then
-
- export wtime_ocnpost="00:30:00"
- export npe_ocnpost=1
- export npe_node_ocnpost=1
- export nth_ocnpost=1
- export memory_ocnpost="96G"
- if [[ "${machine}" == "JET" ]]; then
- # JET only has 88GB of requestable memory per node
- # so a second node is required to meet the requiremtn
- npe_ocnpost=2
- fi
-
-elif [[ "${step}" = "upp" ]]; then
+ "oceanice_products")
+ export wtime_oceanice_products="00:15:00"
+ export npe_oceanice_products=1
+ export npe_node_oceanice_products=1
+ export nth_oceanice_products=1
+ export memory_oceanice_products="96GB"
+ ;;
+ "upp")
case "${CASE}" in
"C48" | "C96")
export npe_upp=${CASE:1}
;;
"C192" | "C384" | "C768")
export npe_upp=120
+ export memory_upp="48GB"
;;
*)
- echo "FATAL ERROR: Resolution '${CASE}' not supported for UPP'"
- exit 1
+ echo "FATAL ERROR: Resources not defined for job ${job} at resolution ${CASE}"
+ exit 4
;;
esac
export npe_node_upp=${npe_upp}
@@ -705,13 +677,13 @@ elif [[ "${step}" = "upp" ]]; then
export nth_upp=1
export wtime_upp="00:15:00"
- if [[ "${npe_node_upp}" -gt "${npe_node_max}" ]]; then
+ if (( npe_node_upp > npe_node_max )); then
export npe_node_upp=${npe_node_max}
fi
export is_exclusive=True
+ ;;
-elif [[ ${step} = "atmos_products" ]]; then
-
+ "atmos_products")
export wtime_atmos_products="00:15:00"
export npe_atmos_products=24
export nth_atmos_products=1
@@ -721,25 +693,25 @@ elif [[ ${step} = "atmos_products" ]]; then
export nth_atmos_products_gfs="${nth_atmos_products}"
export npe_node_atmos_products_gfs="${npe_node_atmos_products}"
export is_exclusive=True
+ ;;
-elif [[ ${step} = "verfozn" ]]; then
-
+ "verfozn")
export wtime_verfozn="00:05:00"
export npe_verfozn=1
export nth_verfozn=1
export npe_node_verfozn=1
export memory_verfozn="1G"
+ ;;
-elif [[ ${step} = "verfrad" ]]; then
-
+ "verfrad")
export wtime_verfrad="00:40:00"
export npe_verfrad=1
export nth_verfrad=1
export npe_node_verfrad=1
export memory_verfrad="5G"
+ ;;
-elif [[ ${step} = "vminmon" ]]; then
-
+ "vminmon")
export wtime_vminmon="00:05:00"
export npe_vminmon=1
export nth_vminmon=1
@@ -749,42 +721,42 @@ elif [[ ${step} = "vminmon" ]]; then
export nth_vminmon_gfs=1
export npe_node_vminmon_gfs=1
export memory_vminmon="1G"
+ ;;
-elif [[ ${step} = "tracker" ]]; then
-
+ "tracker")
export wtime_tracker="00:10:00"
export npe_tracker=1
export nth_tracker=1
export npe_node_tracker=1
export memory_tracker="4G"
+ ;;
-elif [[ ${step} = "genesis" ]]; then
-
+ "genesis")
export wtime_genesis="00:25:00"
export npe_genesis=1
export nth_genesis=1
export npe_node_genesis=1
- export memory_genesis="4G"
-
-elif [[ ${step} = "genesis_fsu" ]]; then
+ export memory_genesis="10G"
+ ;;
+ "genesis_fsu")
export wtime_genesis_fsu="00:10:00"
export npe_genesis_fsu=1
export nth_genesis_fsu=1
export npe_node_genesis_fsu=1
- export memory_genesis_fsu="4G"
-
-elif [[ "${step}" = "fit2obs" ]]; then
+ export memory_genesis_fsu="10G"
+ ;;
+ "fit2obs")
export wtime_fit2obs="00:20:00"
export npe_fit2obs=3
export nth_fit2obs=1
export npe_node_fit2obs=1
export memory_fit2obs="20G"
- if [[ "${machine}" == "WCOSS2" ]]; then export npe_node_fit2obs=3 ; fi
-
-elif [[ "${step}" = "metp" ]]; then
+ if [[ ${machine} == "WCOSS2" ]]; then export npe_node_fit2obs=3 ; fi
+ ;;
+ "metp")
export nth_metp=1
export wtime_metp="03:00:00"
export npe_metp=4
@@ -793,242 +765,240 @@ elif [[ "${step}" = "metp" ]]; then
export npe_metp_gfs=4
export npe_node_metp_gfs=4
export is_exclusive=True
+ ;;
-elif [[ "${step}" = "echgres" ]]; then
-
+ "echgres")
export wtime_echgres="00:10:00"
export npe_echgres=3
export nth_echgres=${npe_node_max}
export npe_node_echgres=1
- if [[ "${machine}" = "WCOSS2" ]]; then
+ if [[ "${machine}" == "WCOSS2" ]]; then
export memory_echgres="200GB"
fi
+ ;;
-elif [[ "${step}" = "init" ]]; then
-
+ "init")
export wtime_init="00:30:00"
export npe_init=24
export nth_init=1
export npe_node_init=6
- export memory_init="70G"
-
-elif [[ "${step}" = "init_chem" ]]; then
+ export memory_init="70GB"
+ ;;
+ "init_chem")
export wtime_init_chem="00:30:00"
export npe_init_chem=1
export npe_node_init_chem=1
export is_exclusive=True
+ ;;
-elif [[ "${step}" = "mom6ic" ]]; then
-
+ "mom6ic")
export wtime_mom6ic="00:30:00"
export npe_mom6ic=24
export npe_node_mom6ic=24
export is_exclusive=True
-
-elif [[ ${step} = "arch" || ${step} = "earc" || ${step} = "getic" ]]; then
-
- eval "export wtime_${step}='06:00:00'"
- eval "export npe_${step}=1"
- eval "export npe_node_${step}=1"
- eval "export nth_${step}=1"
- eval "export memory_${step}=4096M"
- if [[ "${machine}" = "WCOSS2" ]]; then
- eval "export memory_${step}=50GB"
+ ;;
+
+ "arch" | "earc" | "getic")
+ declare -x "wtime_${step}"="06:00:00"
+ declare -x "npe_${step}"="1"
+ declare -x "npe_node_${step}"="1"
+ declare -x "nth_${step}"="1"
+ declare -x "memory_${step}"="4096M"
+ if [[ "${machine}" == "WCOSS2" ]]; then
+ declare -x "memory_${step}"="50GB"
fi
+ ;;
-elif [[ ${step} == "cleanup" ]]; then
- export wtime_cleanup="01:00:00"
+ "cleanup")
+ export wtime_cleanup="00:15:00"
export npe_cleanup=1
export npe_node_cleanup=1
export nth_cleanup=1
export memory_cleanup="4096M"
+ ;;
-elif [[ ${step} = "stage_ic" ]]; then
-
+ "stage_ic")
export wtime_stage_ic="00:15:00"
export npe_stage_ic=1
export npe_node_stage_ic=1
export nth_stage_ic=1
export is_exclusive=True
+ ;;
-elif [[ "${step}" = "atmensanlinit" ]]; then
-
- # make below case dependent later
- export layout_x=1
- export layout_y=1
+ "atmensanlinit")
+ export layout_x=${layout_x_atmensanl}
+ export layout_y=${layout_y_atmensanl}
export wtime_atmensanlinit="00:10:00"
export npe_atmensanlinit=1
export nth_atmensanlinit=1
- npe_node_atmensanlinit=$(echo "${npe_node_max} / ${nth_atmensanlinit}" | bc)
- export npe_node_atmensanlinit
+ export npe_node_atmensanlinit=$(( npe_node_max / nth_atmensanlinit ))
export memory_atmensanlinit="3072M"
+ ;;
-elif [[ "${step}" = "atmensanlrun" ]]; then
-
- # make below case dependent later
- export layout_x=1
- export layout_y=1
+ "atmensanlrun")
+ export layout_x=${layout_x_atmensanl}
+ export layout_y=${layout_y_atmensanl}
export wtime_atmensanlrun="00:30:00"
- npe_atmensanlrun=$(echo "${layout_x} * ${layout_y} * 6" | bc)
- export npe_atmensanlrun
- npe_atmensanlrun_gfs=$(echo "${layout_x} * ${layout_y} * 6" | bc)
- export npe_atmensanlrun_gfs
+ 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}
- npe_node_atmensanlrun=$(echo "${npe_node_max} / ${nth_atmensanlrun}" | bc)
- export npe_node_atmensanlrun
+ export npe_node_atmensanlrun=$(( npe_node_max / nth_atmensanlrun ))
+ export memory_atmensanlrun="96GB"
export is_exclusive=True
+ ;;
-elif [[ "${step}" = "atmensanlfinal" ]]; then
-
+ "atmensanlfinal")
export wtime_atmensanlfinal="00:30:00"
export npe_atmensanlfinal=${npe_node_max}
export nth_atmensanlfinal=1
- npe_node_atmensanlfinal=$(echo "${npe_node_max} / ${nth_atmensanlfinal}" | bc)
- export npe_node_atmensanlfinal
+ export npe_node_atmensanlfinal=$(( npe_node_max / nth_atmensanlfinal ))
export is_exclusive=True
+ ;;
-elif [[ "${step}" = "eobs" || "${step}" = "eomg" ]]; then
-
+ "eobs" | "eomg")
export wtime_eobs="00:15:00"
- export wtime_eomg="01:00:00"
- if [[ "${CASE}" = "C768" ]]; then
- export npe_eobs=200
- elif [[ "${CASE}" = "C384" ]]; then
- export npe_eobs=100
- elif [[ "${CASE}" = "C192" || "${CASE}" = "C96" || "${CASE}" = "C48" ]]; then
- export npe_eobs=40
- fi
+ export wtime_eomg="00:30:00"
+ case ${CASE} in
+ "C768") export npe_eobs=200;;
+ "C384") export npe_eobs=100;;
+ "C192" | "C96" | "C48") export npe_eobs=40;;
+ *)
+ echo "FATAL ERROR: Resources not defined for job ${job} at resolution ${CASE}"
+ exit 4
+ ;;
+ esac
export npe_eomg=${npe_eobs}
export nth_eobs=2
export nth_eomg=${nth_eobs}
- npe_node_eobs=$(echo "${npe_node_max} / ${nth_eobs}" | bc)
- export npe_node_eobs
+ export npe_node_eobs=$(( npe_node_max / nth_eobs ))
export is_exclusive=True
# The number of tasks and cores used must be the same for eobs
# See https://github.com/NOAA-EMC/global-workflow/issues/2092 for details
# For S4, this is accomplished by running 10 tasks/node
if [[ ${machine} = "S4" ]]; then
- export npe_node_eobs=10
+ export npe_node_eobs=10
elif [[ ${machine} = "HERCULES" ]]; then
- # For Hercules, this is only an issue at C384; use 20 tasks/node
- if [[ ${CASE} = "C384" ]]; then
- export npe_node_eobs=20
- fi
+ # For Hercules, this is only an issue at C384; use 20 tasks/node
+ if [[ ${CASE} = "C384" ]]; then
+ export npe_node_eobs=20
+ fi
fi
export npe_node_eomg=${npe_node_eobs}
+ ;;
-elif [[ "${step}" = "ediag" ]]; then
-
+ "ediag")
export wtime_ediag="00:15:00"
export npe_ediag=48
export nth_ediag=1
- npe_node_ediag=$(echo "${npe_node_max} / ${nth_ediag}" | bc)
- export npe_node_ediag
+ export npe_node_ediag=$(( npe_node_max / nth_ediag ))
export memory_ediag="30GB"
+ ;;
-elif [[ "${step}" = "eupd" ]]; then
-
+ "eupd")
export wtime_eupd="00:30:00"
- if [[ "${CASE}" = "C768" ]]; then
- export npe_eupd=480
- export nth_eupd=6
- if [[ "${machine}" = "WCOSS2" ]]; then
- export npe_eupd=315
- export nth_eupd=14
- fi
- elif [[ "${CASE}" = "C384" ]]; then
- export npe_eupd=270
- export nth_eupd=8
- if [[ "${machine}" = "WCOSS2" ]]; then
- export npe_eupd=315
- export nth_eupd=14
- elif [[ "${machine}" = "S4" ]]; then
- export npe_eupd=160
- export nth_eupd=2
- fi
- elif [[ "${CASE}" = "C192" || "${CASE}" = "C96" || "${CASE}" = "C48" ]]; then
- export npe_eupd=42
- export nth_eupd=2
- if [[ "${machine}" = "HERA" || "${machine}" = "JET" ]]; then
- export nth_eupd=4
- fi
- fi
- npe_node_eupd=$(echo "${npe_node_max} / ${nth_eupd}" | bc)
- export npe_node_eupd
+ case ${CASE} in
+ "C768")
+ export npe_eupd=480
+ export nth_eupd=6
+ if [[ "${machine}" == "WCOSS2" ]]; then
+ export npe_eupd=315
+ export nth_eupd=14
+ fi
+ ;;
+ "C384")
+ export npe_eupd=270
+ export nth_eupd=8
+ if [[ "${machine}" == "WCOSS2" ]]; then
+ export npe_eupd=315
+ export nth_eupd=14
+ elif [[ ${machine} == "S4" ]]; then
+ export npe_eupd=160
+ export nth_eupd=2
+ fi
+ ;;
+ "C192" | "C96" | "C48")
+ export npe_eupd=42
+ export nth_eupd=2
+ if [[ "${machine}" == "HERA" || "${machine}" == "JET" ]]; then
+ export nth_eupd=4
+ fi
+ ;;
+ *)
+ echo "FATAL ERROR: Resources not defined for job ${job} at resolution ${CASE}"
+ exit 4
+ ;;
+ esac
+ export npe_node_eupd=$(( npe_node_max / nth_eupd ))
export is_exclusive=True
+ ;;
-elif [[ "${step}" = "ecen" ]]; then
-
+ "ecen")
export wtime_ecen="00:10:00"
export npe_ecen=80
export nth_ecen=4
- if [[ "${machine}" = "HERA" ]]; then export nth_ecen=6; fi
- if [[ "${CASE}" = "C384" || "${CASE}" = "C192" || "${CASE}" = "C96" || "${CASE}" = "C48" ]]; then export nth_ecen=2; fi
- npe_node_ecen=$(echo "${npe_node_max} / ${nth_ecen}" | bc)
- export npe_node_ecen
+ if [[ "${machine}" == "HERA" ]]; then export nth_ecen=6; fi
+ if [[ ${CASE} == "C384" || ${CASE} == "C192" || ${CASE} == "C96" || ${CASE} == "C48" ]]; then
+ export nth_ecen=2
+ fi
+ export npe_node_ecen=$(( npe_node_max / nth_ecen ))
export nth_cycle=${nth_ecen}
- npe_node_cycle=$(echo "${npe_node_max} / ${nth_cycle}" | bc)
- export npe_node_cycle
+ export npe_node_cycle=$(( npe_node_max / nth_cycle ))
export is_exclusive=True
+ ;;
-elif [[ "${step}" = "esfc" ]]; then
-
+ "esfc")
export wtime_esfc="00:08:00"
export npe_esfc=80
export nth_esfc=1
- npe_node_esfc=$(echo "${npe_node_max} / ${nth_esfc}" | bc)
- export npe_node_esfc
+ export npe_node_esfc=$(( npe_node_max / nth_esfc ))
export nth_cycle=${nth_esfc}
- npe_node_cycle=$(echo "${npe_node_max} / ${nth_cycle}" | bc)
- export npe_node_cycle
+ export npe_node_cycle=$(( npe_node_max / nth_cycle ))
export memory_esfc="80GB"
+ ;;
-elif [[ "${step}" = "epos" ]]; then
-
+ "epos")
export wtime_epos="00:15:00"
export npe_epos=80
export nth_epos=1
- npe_node_epos=$(echo "${npe_node_max} / ${nth_epos}" | bc)
- export npe_node_epos
+ export npe_node_epos=$(( npe_node_max / nth_epos ))
export is_exclusive=True
+ ;;
-elif [[ "${step}" = "postsnd" ]]; then
-
+ "postsnd")
export wtime_postsnd="02:00:00"
export npe_postsnd=40
export nth_postsnd=8
export npe_node_postsnd=10
export npe_postsndcfp=9
export npe_node_postsndcfp=1
- postsnd_req_cores=$(echo "${npe_node_postsnd} * ${nth_postsnd}" | bc)
- if [[ ${postsnd_req_cores} -gt "${npe_node_max}" ]]; then
- npe_node_postsnd=$(echo "${npe_node_max} / ${nth_postsnd}" | bc)
- export npe_node_postsnd
+ postsnd_req_cores=$(( npe_node_postsnd * nth_postsnd ))
+ if (( postsnd_req_cores > npe_node_max )); then
+ export npe_node_postsnd=$(( npe_node_max / nth_postsnd ))
fi
export is_exclusive=True
+ ;;
-elif [[ "${step}" = "awips" ]]; then
-
+ "awips")
export wtime_awips="03:30:00"
export npe_awips=1
export npe_node_awips=1
export nth_awips=1
export memory_awips="3GB"
+ ;;
-elif [[ ${step} = "npoess" ]]; then
-
+ "npoess")
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
-
+ "gempak")
export wtime_gempak="03:00:00"
export npe_gempak=2
export npe_gempak_gfs=28
@@ -1037,9 +1007,9 @@ elif [[ ${step} = "gempak" ]]; then
export nth_gempak=1
export memory_gempak="4GB"
export memory_gempak_gfs="2GB"
+ ;;
-elif [[ ${step} = "mos_stn_prep" ]]; then
-
+ "mos_stn_prep")
export wtime_mos_stn_prep="00:10:00"
export npe_mos_stn_prep=3
export npe_node_mos_stn_prep=3
@@ -1047,9 +1017,9 @@ elif [[ ${step} = "mos_stn_prep" ]]; then
export memory_mos_stn_prep="5GB"
export NTASK="${npe_mos_stn_prep}"
export PTILE="${npe_node_mos_stn_prep}"
+ ;;
-elif [[ ${step} = "mos_grd_prep" ]]; then
-
+ "mos_grd_prep")
export wtime_mos_grd_prep="00:10:00"
export npe_mos_grd_prep=4
export npe_node_mos_grd_prep=4
@@ -1057,9 +1027,9 @@ elif [[ ${step} = "mos_grd_prep" ]]; then
export memory_mos_grd_prep="16GB"
export NTASK="${npe_mos_grd_prep}"
export PTILE="${npe_node_mos_grd_prep}"
+ ;;
-elif [[ ${step} = "mos_ext_stn_prep" ]]; then
-
+ "mos_ext_stn_prep")
export wtime_mos_ext_stn_prep="00:15:00"
export npe_mos_ext_stn_prep=2
export npe_node_mos_ext_stn_prep=2
@@ -1067,9 +1037,9 @@ elif [[ ${step} = "mos_ext_stn_prep" ]]; then
export memory_mos_ext_stn_prep="5GB"
export NTASK="${npe_mos_ext_stn_prep}"
export PTILE="${npe_node_mos_ext_stn_prep}"
+ ;;
-elif [[ ${step} = "mos_ext_grd_prep" ]]; then
-
+ "mos_ext_grd_prep")
export wtime_mos_ext_grd_prep="00:10:00"
export npe_mos_ext_grd_prep=7
export npe_node_mos_ext_grd_prep=7
@@ -1077,9 +1047,9 @@ elif [[ ${step} = "mos_ext_grd_prep" ]]; then
export memory_mos_ext_grd_prep="3GB"
export NTASK="${npe_mos_ext_grd_prep}"
export PTILE="${npe_node_mos_ext_grd_prep}"
+ ;;
-elif [[ ${step} = "mos_stn_fcst" ]]; then
-
+ "mos_stn_fcst")
export wtime_mos_stn_fcst="00:10:00"
export npe_mos_stn_fcst=5
export npe_node_mos_stn_fcst=5
@@ -1087,9 +1057,9 @@ elif [[ ${step} = "mos_stn_fcst" ]]; then
export memory_mos_stn_fcst="40GB"
export NTASK="${npe_mos_stn_fcst}"
export PTILE="${npe_node_mos_stn_fcst}"
+ ;;
-elif [[ ${step} = "mos_grd_fcst" ]]; then
-
+ "mos_grd_fcst")
export wtime_mos_grd_fcst="00:10:00"
export npe_mos_grd_fcst=7
export npe_node_mos_grd_fcst=7
@@ -1097,9 +1067,9 @@ elif [[ ${step} = "mos_grd_fcst" ]]; then
export memory_mos_grd_fcst="50GB"
export NTASK="${npe_mos_grd_fcst}"
export PTILE="${npe_node_mos_grd_fcst}"
+ ;;
-elif [[ ${step} = "mos_ext_stn_fcst" ]]; then
-
+ "mos_ext_stn_fcst")
export wtime_mos_ext_stn_fcst="00:20:00"
export npe_mos_ext_stn_fcst=3
export npe_node_mos_ext_stn_fcst=3
@@ -1108,9 +1078,9 @@ elif [[ ${step} = "mos_ext_stn_fcst" ]]; then
export NTASK="${npe_mos_ext_stn_fcst}"
export PTILE="${npe_node_mos_ext_stn_fcst}"
export prepost=True
+ ;;
-elif [[ ${step} = "mos_ext_grd_fcst" ]]; then
-
+ "mos_ext_grd_fcst")
export wtime_mos_ext_grd_fcst="00:10:00"
export npe_mos_ext_grd_fcst=7
export npe_node_mos_ext_grd_fcst=7
@@ -1118,9 +1088,9 @@ elif [[ ${step} = "mos_ext_grd_fcst" ]]; then
export memory_mos_ext_grd_fcst="50GB"
export NTASK="${npe_mos_ext_grd_fcst}"
export PTILE="${npe_node_mos_ext_grd_fcst}"
+ ;;
-elif [[ ${step} = "mos_stn_prdgen" ]]; then
-
+ "mos_stn_prdgen")
export wtime_mos_stn_prdgen="00:10:00"
export npe_mos_stn_prdgen=1
export npe_node_mos_stn_prdgen=1
@@ -1129,9 +1099,9 @@ elif [[ ${step} = "mos_stn_prdgen" ]]; then
export NTASK="${npe_mos_stn_prdgen}"
export PTILE="${npe_node_mos_stn_prdgen}"
export prepost=True
+ ;;
-elif [[ ${step} = "mos_grd_prdgen" ]]; then
-
+ "mos_grd_prdgen")
export wtime_mos_grd_prdgen="00:40:00"
export npe_mos_grd_prdgen=72
export npe_node_mos_grd_prdgen=18
@@ -1140,9 +1110,9 @@ elif [[ ${step} = "mos_grd_prdgen" ]]; then
export NTASK="${npe_mos_grd_prdgen}"
export PTILE="${npe_node_mos_grd_prdgen}"
export OMP_NUM_THREADS="${nth_mos_grd_prdgen}"
+ ;;
-elif [[ ${step} = "mos_ext_stn_prdgen" ]]; then
-
+ "mos_ext_stn_prdgen")
export wtime_mos_ext_stn_prdgen="00:10:00"
export npe_mos_ext_stn_prdgen=1
export npe_node_mos_ext_stn_prdgen=1
@@ -1151,9 +1121,9 @@ elif [[ ${step} = "mos_ext_stn_prdgen" ]]; then
export NTASK="${npe_mos_ext_stn_prdgen}"
export PTILE="${npe_node_mos_ext_stn_prdgen}"
export prepost=True
+ ;;
-elif [[ ${step} = "mos_ext_grd_prdgen" ]]; then
-
+ "mos_ext_grd_prdgen")
export wtime_mos_ext_grd_prdgen="00:30:00"
export npe_mos_ext_grd_prdgen=96
export npe_node_mos_ext_grd_prdgen=6
@@ -1162,9 +1132,9 @@ elif [[ ${step} = "mos_ext_grd_prdgen" ]]; then
export NTASK="${npe_mos_ext_grd_prdgen}"
export PTILE="${npe_node_mos_ext_grd_prdgen}"
export OMP_NUM_THREADS="${nth_mos_ext_grd_prdgen}"
+ ;;
-elif [[ ${step} = "mos_wx_prdgen" ]]; then
-
+ "mos_wx_prdgen")
export wtime_mos_wx_prdgen="00:10:00"
export npe_mos_wx_prdgen=4
export npe_node_mos_wx_prdgen=2
@@ -1173,9 +1143,9 @@ elif [[ ${step} = "mos_wx_prdgen" ]]; then
export NTASK="${npe_mos_wx_prdgen}"
export PTILE="${npe_node_mos_wx_prdgen}"
export OMP_NUM_THREADS="${nth_mos_wx_prdgen}"
+ ;;
-elif [[ ${step} = "mos_wx_ext_prdgen" ]]; then
-
+ "mos_wx_ext_prdgen")
export wtime_mos_wx_ext_prdgen="00:10:00"
export npe_mos_wx_ext_prdgen=4
export npe_node_mos_wx_ext_prdgen=2
@@ -1184,12 +1154,13 @@ elif [[ ${step} = "mos_wx_ext_prdgen" ]]; then
export NTASK="${npe_mos_wx_ext_prdgen}"
export PTILE="${npe_node_mos_wx_ext_prdgen}"
export OMP_NUM_THREADS="${nth_mos_wx_ext_prdgen}"
+ ;;
-else
-
- echo "Invalid step = ${step}, ABORT!"
- exit 2
+ *)
+ echo "FATAL ERROR: Invalid job ${step} passed to ${BASH_SOURCE[0]}"
+ exit 1
+ ;;
-fi
+esac
echo "END: config.resources"
diff --git a/parm/config/gfs/config.sfcanl b/parm/config/gfs/config.sfcanl
index 9592fb77c9..e2fde8992a 100644
--- a/parm/config/gfs/config.sfcanl
+++ b/parm/config/gfs/config.sfcanl
@@ -8,4 +8,9 @@ echo "BEGIN: config.sfcanl"
# Get task specific resources
. $EXPDIR/config.resources sfcanl
+# Turn off NST in JEDIATMVAR
+if [[ "${DO_JEDIATMVAR}" == "YES" ]]; then
+ export DONST="NO"
+fi
+
echo "END: config.sfcanl"
diff --git a/parm/config/gfs/config.snowanl b/parm/config/gfs/config.snowanl
new file mode 100644
index 0000000000..d8554570d3
--- /dev/null
+++ b/parm/config/gfs/config.snowanl
@@ -0,0 +1,28 @@
+#! /usr/bin/env bash
+
+########## config.snowanl ##########
+# configuration common to snow analysis tasks
+
+echo "BEGIN: config.snowanl"
+
+# Get task specific resources
+source "${EXPDIR}/config.resources" snowanl
+
+export OBS_LIST="${HOMEgfs}/parm/gdas/snow/obs/lists/gdas_snow.yaml.j2"
+
+# Name of the JEDI executable and its yaml template
+export JEDIEXE="${HOMEgfs}/exec/fv3jedi_letkf.x"
+export JEDIYAML="${HOMEgfs}/parm/gdas/snow/letkfoi/letkfoi.yaml.j2"
+
+# Ensemble member properties
+export SNOWDEPTHVAR="snodl"
+export BESTDDEV="30." # Background Error Std. Dev. for LETKFOI
+
+# Name of the executable that applies increment to bkg and its namelist template
+export APPLY_INCR_EXE="${HOMEgfs}/exec/apply_incr.exe"
+export APPLY_INCR_NML_TMPL="${HOMEgfs}/parm/gdas/snow/letkfoi/apply_incr_nml.j2"
+
+export io_layout_x=@IO_LAYOUT_X@
+export io_layout_y=@IO_LAYOUT_Y@
+
+echo "END: config.snowanl"
diff --git a/parm/config/gfs/config.stage_ic b/parm/config/gfs/config.stage_ic
index 7f3956af4d..63d0e4a5cf 100644
--- a/parm/config/gfs/config.stage_ic
+++ b/parm/config/gfs/config.stage_ic
@@ -8,7 +8,7 @@ echo "BEGIN: config.stage_ic"
source "${EXPDIR}/config.resources" stage_ic
case "${CASE}" in
- "C48" | "C96")
+ "C48" | "C96" | "C192")
export CPL_ATMIC="workflow_${CASE}_refactored"
export CPL_ICEIC="workflow_${CASE}_refactored"
export CPL_OCNIC="workflow_${CASE}_refactored"
@@ -21,16 +21,16 @@ case "${CASE}" in
export CPL_WAVIC=workflow_C384_refactored
;;
"C768")
- export CPL_ATMIC=HR2_refactored
- export CPL_ICEIC=HR1_refactored
- export CPL_OCNIC=HR1_refactored
- export CPL_WAVIC=HR1_refactored
+ export CPL_ATMIC=HR3C768
+ export CPL_ICEIC=HR3marine
+ export CPL_OCNIC=HR3marine
+ export CPL_WAVIC=HR3marine
;;
"C1152")
- export CPL_ATMIC=HR2_C1152_refactored
- export CPL_ICEIC=HR3_refactored
- export CPL_OCNIC=HR3_refactored
- export CPL_WAVIC=HR1_refactored
+ export CPL_ATMIC=HR3C1152
+ export CPL_ICEIC=HR3marine
+ export CPL_OCNIC=HR3marine
+ export CPL_WAVIC=HR3marine
;;
*)
echo "FATAL ERROR Unrecognized resolution: ${CASE}"
diff --git a/parm/config/gfs/config.ufs b/parm/config/gfs/config.ufs
index b634720d2f..692dc407fd 120000
--- a/parm/config/gfs/config.ufs
+++ b/parm/config/gfs/config.ufs
@@ -1 +1 @@
-config.ufs_c768_12x12_2th_1wg40wt
\ No newline at end of file
+config.ufs_c768_16x16_2th_2wg40wt
\ No newline at end of file
diff --git a/parm/config/gfs/config.ufs_c768_12x12_2th_1wg40wt b/parm/config/gfs/config.ufs_c768_12x12_2th_1wg40wt
index 5b3dab7a98..3939bc3f6b 100644
--- a/parm/config/gfs/config.ufs_c768_12x12_2th_1wg40wt
+++ b/parm/config/gfs/config.ufs_c768_12x12_2th_1wg40wt
@@ -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|uglo_100km|uglo_m1g16"
echo "--gocart"
exit 1
@@ -68,54 +68,6 @@ if [[ "${skip_mom6}" == "false" ]] || [[ "${skip_cice6}" == "false" ]] || [[ "${
skip_mediator=false
fi
-case "${machine}" in
- "WCOSS2")
- npe_node_max=128
- ;;
- "HERA" | "ORION" )
- npe_node_max=40
- ;;
- "HERCULES" )
- npe_node_max=80
- ;;
- "JET")
- case "${PARTITION_BATCH}" in
- "xjet")
- npe_node_max=24
- ;;
- "vjet" | "sjet")
- npe_node_max=16
- ;;
- "kjet")
- npe_node_max=40
- ;;
- *)
- echo "FATAL ERROR: Unsupported ${machine} PARTITION_BATCH = ${PARTITION_BATCH}, ABORT!"
- exit 1
- ;;
- esac
- ;;
- "S4")
- case "${PARTITION_BATCH}" in
- "s4")
- npe_node_max=32
- ;;
- "ivy")
- npe_node_max=20
- ;;
- *)
- echo "FATAL ERROR: Unsupported ${machine} PARTITION_BATCH = ${PARTITION_BATCH}, ABORT!"
- exit 1
- ;;
- esac
- ;;
- *)
- echo "FATAL ERROR: Unrecognized machine ${machine}"
- exit 14
- ;;
-esac
-export npe_node_max
-
# (Standard) Model resolution dependent variables
case "${fv3_res}" in
"C48")
@@ -468,6 +420,14 @@ if [[ "${skip_ww3}" == "false" ]]; then
"mx025")
ntasks_ww3=80
;;
+ "uglo_100km")
+ ntasks_ww3=40
+ nthreads_ww3=1
+ ;;
+ "uglo_m1g16")
+ ntasks_ww3=1000
+ nthreads_ww3=1
+ ;;
*)
echo "FATAL ERROR: Unsupported WW3 resolution = ${ww3_res}, ABORT!"
exit 1
@@ -484,39 +444,42 @@ if [[ "${skip_gocart}" == "false" ]]; then
fi
# Set the name of the UFS (previously nems) configure template to use
+# Default ufs.configure templates for supported model configurations
case "${model_list}" in
atm)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.atm.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.atm.IN"
;;
atm.aero)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.atm_aero.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.atmaero.IN"
;;
atm.wave)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.leapfrog_atm_wav.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.leapfrog_atm_wav.IN"
;;
atm.ocean.ice)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.s2s_esmf.IN"
;;
atm.ocean.ice.aero)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld_aero.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.s2sa_esmf.IN"
;;
atm.ocean.ice.wave)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld_outerwave.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.s2sw_esmf.IN"
;;
atm.ocean.ice.wave.aero)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld_aero_outerwave.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.s2swa_esmf.IN"
;;
*)
- echo "FATAL ERROR: Unable to determine appropriate UFS configure template for ${model_list}"
+ echo "FATAL ERROR: Unsupported UFSWM configuration for ${model_list}"
exit 16
;;
esac
+# Allow user to override the default template
+export ufs_configure_template=${ufs_configure_template:-${default_template:-"/dev/null"}}
+unset model_list default_template
+
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.ufs_c768_16x16_2th_2wg40wt b/parm/config/gfs/config.ufs_c768_16x16_2th_2wg40wt
index ad3f472873..48062a70f5 100644
--- a/parm/config/gfs/config.ufs_c768_16x16_2th_2wg40wt
+++ b/parm/config/gfs/config.ufs_c768_16x16_2th_2wg40wt
@@ -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|uglo_100km|uglo_m1g16"
echo "--gocart"
exit 1
@@ -68,54 +68,6 @@ if [[ "${skip_mom6}" == "false" ]] || [[ "${skip_cice6}" == "false" ]] || [[ "${
skip_mediator=false
fi
-case "${machine}" in
- "WCOSS2")
- npe_node_max=128
- ;;
- "HERA" | "ORION" )
- npe_node_max=40
- ;;
- "HERCULES" )
- npe_node_max=80
- ;;
- "JET")
- case "${PARTITION_BATCH}" in
- "xjet")
- npe_node_max=24
- ;;
- "vjet" | "sjet")
- npe_node_max=16
- ;;
- "kjet")
- npe_node_max=40
- ;;
- *)
- echo "FATAL ERROR: Unsupported ${machine} PARTITION_BATCH = ${PARTITION_BATCH}, ABORT!"
- exit 1
- ;;
- esac
- ;;
- "S4")
- case "${PARTITION_BATCH}" in
- "s4")
- npe_node_max=32
- ;;
- "ivy")
- npe_node_max=20
- ;;
- *)
- echo "FATAL ERROR: Unsupported ${machine} PARTITION_BATCH = ${PARTITION_BATCH}, ABORT!"
- exit 1
- ;;
- esac
- ;;
- *)
- echo "FATAL ERROR: Unrecognized machine ${machine}"
- exit 14
- ;;
-esac
-export npe_node_max
-
# (Standard) Model resolution dependent variables
case "${fv3_res}" in
"C48")
@@ -468,6 +420,14 @@ if [[ "${skip_ww3}" == "false" ]]; then
"mx025")
ntasks_ww3=80
;;
+ "uglo_100km")
+ ntasks_ww3=40
+ nthreads_ww3=1
+ ;;
+ "uglo_m1g16")
+ ntasks_ww3=1000
+ nthreads_ww3=1
+ ;;
*)
echo "FATAL ERROR: Unsupported WW3 resolution = ${ww3_res}, ABORT!"
exit 1
@@ -484,39 +444,42 @@ if [[ "${skip_gocart}" == "false" ]]; then
fi
# Set the name of the UFS (previously nems) configure template to use
+# Default ufs.configure templates for supported model configurations
case "${model_list}" in
atm)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.atm.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.atm.IN"
;;
atm.aero)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.atm_aero.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.atmaero.IN"
;;
atm.wave)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.leapfrog_atm_wav.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.leapfrog_atm_wav.IN"
;;
atm.ocean.ice)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.s2s_esmf.IN"
;;
atm.ocean.ice.aero)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld_aero.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.s2sa_esmf.IN"
;;
atm.ocean.ice.wave)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld_outerwave.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.s2sw_esmf.IN"
;;
atm.ocean.ice.wave.aero)
- export ufs_configure_template="${HOMEgfs}/parm/ufs/ufs.configure.cpld_aero_outerwave.IN"
+ default_template="${HOMEgfs}/parm/ufs/ufs.configure.s2swa_esmf.IN"
;;
*)
- echo "FATAL ERROR: Unable to determine appropriate UFS configure template for ${model_list}"
+ echo "FATAL ERROR: Unsupported UFSWM configuration for ${model_list}"
exit 16
;;
esac
+# Allow user to override the default template
+export ufs_configure_template=${ufs_configure_template:-${default_template:-"/dev/null"}}
+unset model_list default_template
+
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.wave b/parm/config/gfs/config.wave
index acb4c518ba..8068ffcda6 100644
--- a/parm/config/gfs/config.wave
+++ b/parm/config/gfs/config.wave
@@ -7,11 +7,7 @@ echo "BEGIN: config.wave"
# Parameters that are common to all wave model steps
-# System and version
-export wave_sys_ver=v1.0.0
-
export EXECwave="${HOMEgfs}/exec"
-export FIXwave="${HOMEgfs}/fix/wave"
export PARMwave="${HOMEgfs}/parm/wave"
export USHwave="${HOMEgfs}/ush"
@@ -80,7 +76,19 @@ case "${waveGRD}" in
export wavepostGRD='glo_500'
export waveuoutpGRD=${waveGRD}
;;
- *)
+ "uglo_100km")
+ #unstructured 100km grid
+ export waveinterpGRD='glo_200'
+ export wavepostGRD=''
+ export waveuoutpGRD=${waveGRD}
+ ;;
+ "uglo_m1g16")
+ #unstructured m1v16 grid
+ export waveinterpGRD='glo_15mxt'
+ export wavepostGRD=''
+ export waveuoutpGRD=${waveGRD}
+ ;;
+ *)
echo "FATAL ERROR: No grid specific wave config values exist for ${waveGRD}. Aborting."
exit 1
;;
diff --git a/parm/config/gfs/config.wavepostbndpnt b/parm/config/gfs/config.wavepostbndpnt
index dfeddc79b2..412c5fb42a 100644
--- a/parm/config/gfs/config.wavepostbndpnt
+++ b/parm/config/gfs/config.wavepostbndpnt
@@ -6,6 +6,6 @@
echo "BEGIN: config.wavepostbndpnt"
# Get task specific resources
-. $EXPDIR/config.resources wavepostbndpnt
+source "${EXPDIR}/config.resources" wavepostbndpnt
echo "END: config.wavepostbndpnt"
diff --git a/parm/config/gfs/config.wavepostbndpntbll b/parm/config/gfs/config.wavepostbndpntbll
index bb7224cc70..6695ab0f84 100644
--- a/parm/config/gfs/config.wavepostbndpntbll
+++ b/parm/config/gfs/config.wavepostbndpntbll
@@ -6,6 +6,6 @@
echo "BEGIN: config.wavepostbndpntbll"
# Get task specific resources
-. $EXPDIR/config.resources wavepostbndpntbll
+source "${EXPDIR}/config.resources" wavepostbndpntbll
echo "END: config.wavepostbndpntbll"
diff --git a/parm/config/gfs/config.wavepostpnt b/parm/config/gfs/config.wavepostpnt
index 8befb91760..e87237da82 100644
--- a/parm/config/gfs/config.wavepostpnt
+++ b/parm/config/gfs/config.wavepostpnt
@@ -6,6 +6,6 @@
echo "BEGIN: config.wavepostpnt"
# Get task specific resources
-. $EXPDIR/config.resources wavepostpnt
+source "${EXPDIR}/config.resources" wavepostpnt
echo "END: config.wavepostpnt"
diff --git a/parm/config/gfs/config.wavepostsbs b/parm/config/gfs/config.wavepostsbs
index 8e74aae069..b3c5902e3c 100644
--- a/parm/config/gfs/config.wavepostsbs
+++ b/parm/config/gfs/config.wavepostsbs
@@ -6,7 +6,7 @@
echo "BEGIN: config.wavepostsbs"
# Get task specific resources
-. $EXPDIR/config.resources wavepostsbs
+source "${EXPDIR}/config.resources" wavepostsbs
# Subgrid info for grib2 encoding
export WAV_SUBGRBSRC=""
diff --git a/parm/config/gfs/yaml/defaults.yaml b/parm/config/gfs/yaml/defaults.yaml
index ade83fa484..e6108fff29 100644
--- a/parm/config/gfs/yaml/defaults.yaml
+++ b/parm/config/gfs/yaml/defaults.yaml
@@ -3,15 +3,20 @@ base:
DO_JEDIATMVAR: "NO"
DO_JEDIATMENS: "NO"
DO_JEDIOCNVAR: "NO"
- DO_JEDILANDDA: "NO"
+ DO_JEDISNOWDA: "NO"
DO_MERGENSST: "NO"
DO_GOES: "NO"
+ FHMAX_GFS: 120
atmanl:
+ LAYOUT_X_ATMANL: 8
+ LAYOUT_Y_ATMANL: 8
IO_LAYOUT_X: 1
IO_LAYOUT_Y: 1
atmensanl:
+ LAYOUT_X_ATMENSANL: 8
+ LAYOUT_Y_ATMENSANL: 8
IO_LAYOUT_X: 1
IO_LAYOUT_Y: 1
@@ -19,18 +24,19 @@ aeroanl:
IO_LAYOUT_X: 1
IO_LAYOUT_Y: 1
-landanl:
+snowanl:
IO_LAYOUT_X: 1
IO_LAYOUT_Y: 1
ocnanal:
- SOCA_INPUT_FIX_DIR: "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/72x35x25/soca" # TODO: These need to go to glopara fix space. @guillaumevernieres will open an issue
- CASE_ANL: "C48"
- COMIN_OBS: "/scratch2/NCEPDEV/marineda/r2d2-v2-v3" # TODO: make platform agnostic
- SOCA_OBS_LIST: "{{ HOMEgfs }}/sorc/gdas.cd/parm/soca/obs/obs_list.yaml"
+ SOCA_INPUT_FIX_DIR: "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/72x35x25/soca" # TODO: These need to go to glopara fix space.
+ CASE_ANL: "C48" # TODO: Check in gdasapp if used anywhere for SOCA
+ SOCA_OBS_LIST: "{{ HOMEgfs }}/sorc/gdas.cd/parm/soca/obs/obs_list.yaml" # TODO: This is also repeated in oceanprepobs
SOCA_NINNER: 100
- R2D2_OBS_SRC: "gdas_marine"
- R2D2_OBS_DUMP: "s2s_v1"
SABER_BLOCKS_YAML: ""
NICAS_RESOL: 1
NICAS_GRID_SIZE: 15000
+prepoceanobs:
+ SOCA_OBS_LIST: "{{ HOMEgfs }}/sorc/gdas.cd/parm/soca/obs/obs_list.yaml" # TODO: This is also repeated in ocnanal
+ OBSPREP_YAML: "{{ HOMEgfs }}/sorc/gdas.cd/parm/soca/obsprep/obsprep_config.yaml"
+ DMPDIR: "/scratch1/NCEPDEV/global/glopara/data/experimental_obs"
diff --git a/parm/gdas/aero_jedi_fix.yaml b/parm/gdas/aero_jedi_fix.yaml
index 85a00c3c30..16cbeac6e7 100644
--- a/parm/gdas/aero_jedi_fix.yaml
+++ b/parm/gdas/aero_jedi_fix.yaml
@@ -1,11 +1,11 @@
mkdir:
- !ENV ${DATA}/fv3jedi
copy:
-- - !ENV ${FIXgdas}/fv3jedi/fv3files/akbk$(npz).nc4
+- - !ENV ${FIXgfs}/gdas/fv3jedi/fv3files/akbk$(npz).nc4
- !ENV ${DATA}/fv3jedi/akbk.nc4
-- - !ENV ${FIXgdas}/fv3jedi/fv3files/fmsmpp.nml
+- - !ENV ${FIXgfs}/gdas/fv3jedi/fv3files/fmsmpp.nml
- !ENV ${DATA}/fv3jedi/fmsmpp.nml
-- - !ENV ${FIXgdas}/fv3jedi/fv3files/field_table_gfdl
+- - !ENV ${FIXgfs}/gdas/fv3jedi/fv3files/field_table_gfdl
- !ENV ${DATA}/fv3jedi/field_table
- - !ENV $(HOMEgfs)/sorc/gdas.cd/parm/io/fv3jedi_fieldmetadata_restart.yaml
- !ENV ${DATA}/fv3jedi/fv3jedi_fieldmetadata_restart.yaml
diff --git a/parm/gdas/land_jedi_fix.yaml b/parm/gdas/land_jedi_fix.yaml
deleted file mode 100644
index 3d1ca79f33..0000000000
--- a/parm/gdas/land_jedi_fix.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-mkdir:
-- $(DATA)/fv3jedi
-copy:
-- [$(HOMEgfs)/fix/gdas/fv3jedi/fv3files/akbk$(npz).nc4, $(DATA)/fv3jedi/akbk.nc4]
-- [$(HOMEgfs)/fix/gdas/fv3jedi/fv3files/fmsmpp.nml, $(DATA)/fv3jedi/fmsmpp.nml]
-- [$(HOMEgfs)/fix/gdas/fv3jedi/fv3files/field_table_gfdl, $(DATA)/fv3jedi/field_table]
-- [$(HOMEgfs)/sorc/gdas.cd/parm/io/fv3jedi_fieldmetadata_restart.yaml, $(DATA)/fv3jedi/fv3jedi_fieldmetadata_restart.yaml]
diff --git a/parm/gdas/snow_jedi_fix.yaml.j2 b/parm/gdas/snow_jedi_fix.yaml.j2
new file mode 100644
index 0000000000..4d820a82ba
--- /dev/null
+++ b/parm/gdas/snow_jedi_fix.yaml.j2
@@ -0,0 +1,7 @@
+mkdir:
+- '{{ DATA }}/fv3jedi'
+copy:
+- ['{{ HOMEgfs }}/fix/gdas/fv3jedi/fv3files/akbk{{ npz }}.nc4', '{{ DATA }}/fv3jedi/akbk.nc4']
+- ['{{ HOMEgfs }}/fix/gdas/fv3jedi/fv3files/fmsmpp.nml', '{{ DATA }}/fv3jedi/fmsmpp.nml']
+- ['{{ HOMEgfs }}/fix/gdas/fv3jedi/fv3files/field_table_gfdl', '{{ DATA }}/fv3jedi/field_table']
+- ['{{ HOMEgfs }}/sorc/gdas.cd/parm/io/fv3jedi_fieldmetadata_restart.yaml', '{{ DATA }}/fv3jedi/fv3jedi_fieldmetadata_restart.yaml']
diff --git a/parm/post/oceanice_products.yaml b/parm/post/oceanice_products.yaml
new file mode 100644
index 0000000000..44b4094c56
--- /dev/null
+++ b/parm/post/oceanice_products.yaml
@@ -0,0 +1,75 @@
+ocnicepost:
+ executable: "ocnicepost.x"
+ namelist:
+ debug: False
+ fix_data:
+ mkdir:
+ - "{{ DATA }}"
+ copy:
+ - ["{{ HOMEgfs }}/exec/ocnicepost.x", "{{ DATA }}/"]
+ - ["{{ HOMEgfs }}/parm/post/ocnicepost.nml.jinja2", "{{ DATA }}/"]
+ - ["{{ HOMEgfs }}/parm/post/{{ component }}.csv", "{{ DATA }}/"]
+ - ["{{ HOMEgfs }}/fix/mom6/post/{{ model_grid }}/tripole.{{ model_grid }}.Bu.to.Ct.bilinear.nc", "{{ DATA }}/"]
+ - ["{{ HOMEgfs }}/fix/mom6/post/{{ model_grid }}/tripole.{{ model_grid }}.Cu.to.Ct.bilinear.nc", "{{ DATA }}/"]
+ - ["{{ HOMEgfs }}/fix/mom6/post/{{ model_grid }}/tripole.{{ model_grid }}.Cv.to.Ct.bilinear.nc", "{{ DATA }}/"]
+ {% for grid in product_grids %}
+ - ["{{ HOMEgfs }}/fix/mom6/post/{{ model_grid }}/tripole.{{ model_grid }}.Ct.to.rect.{{ grid }}.bilinear.nc", "{{ DATA }}/"]
+ - ["{{ HOMEgfs }}/fix/mom6/post/{{ model_grid }}/tripole.{{ model_grid }}.Ct.to.rect.{{ grid }}.conserve.nc", "{{ DATA }}/"]
+ - ["{{ HOMEgfs }}/fix/mom6/post/template.global.{{ grid }}.gb2", "{{ DATA }}/"]
+ {% endfor %}
+
+nc2grib2:
+ script: "{{ HOMEgfs }}/ush/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, 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]
+ {% 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]
+ {% 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.6hr_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 }}.grib2", "{{ COM_OCEAN_GRIB }}/{{ grid }}/{{ RUN }}.ocean.t{{ current_cycle | strftime('%H') }}z.{{ grid }}.f{{ '%03d' % forecast_hour }}.grib2"]
+ - ["{{ DATA }}/ocean.{{ grid }}.grib2.idx", "{{ COM_OCEAN_GRIB }}/{{ grid }}/{{ RUN }}.ocean.t{{ current_cycle | strftime('%H') }}z.{{ grid }}.f{{ '%03d' % forecast_hour }}.grib2.idx"]
+ {% 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.6hr_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 }}.grib2", "{{ COM_ICE_GRIB }}/{{ grid }}/{{ RUN }}.ice.t{{ current_cycle | strftime('%H') }}z.{{ grid }}.f{{ '%03d' % forecast_hour }}.grib2"]
+ - ["{{ DATA }}/ice.{{ grid }}.grib2.idx", "{{ COM_ICE_GRIB }}/{{ grid }}/{{ RUN }}.ice.t{{ current_cycle | strftime('%H') }}z.{{ grid }}.f{{ '%03d' % forecast_hour }}.grib2.idx"]
+ {% endfor %}
diff --git a/parm/post/upp.yaml b/parm/post/upp.yaml
index 651f3c12a8..ea7237dc83 100644
--- a/parm/post/upp.yaml
+++ b/parm/post/upp.yaml
@@ -28,7 +28,7 @@ analysis:
forecast:
config:
- rdaod: False
+ rdaod: True
data_in:
copy:
{% if forecast_hour == 0 %}
@@ -47,7 +47,7 @@ forecast:
goes:
config:
- rdaod: True
+ rdaod: False
data_in:
copy:
{% set crtm_coefficients = [
diff --git a/parm/product/gefs.0p25.f000.paramlist.a.txt b/parm/product/gefs.0p25.f000.paramlist.a.txt
new file mode 100644
index 0000000000..4fdb8f9713
--- /dev/null
+++ b/parm/product/gefs.0p25.f000.paramlist.a.txt
@@ -0,0 +1,39 @@
+:HGT:surface:
+:PRMSL:mean sea level:
+:PRES:surface:
+:TMP:2 m above ground:
+:TMAX:2 m above ground:
+:TMIN:2 m above ground:
+:RH:2 m above ground:
+:DPT:2 m above ground:
+:UGRD:10 m above ground:
+:VGRD:10 m above ground:
+:APCP:surface:
+:CRAIN:surface:
+:CSNOW:surface:
+:CFRZR:surface:
+:CICEP:surface:
+:PWAT:entire atmosphere (considered as a single layer):
+:CAPE:180-0 mb above ground:
+:CAPE:surface:
+:CIN:180-0 mb above ground:
+:CIN:surface:
+:CPOFP:surface:
+:HLCY:3000-0 m above ground:
+:TCDC:entire atmosphere:
+:WEASD:surface:
+:SNOD:surface:
+:ULWRF:top of atmosphere:
+:DSWRF:surface:
+:DLWRF:surface:
+:USWRF:surface:
+:ULWRF:surface:
+:GUST:surface:
+:SHTFL:surface:
+:LHTFL:surface:
+:ICETK:surface:
+:TSOIL:0-0.1
+:SOILW:0-0.1
+:MSLET:mean sea level:
+:VIS:surface:
+:HGT:cloud ceiling:
diff --git a/parm/product/gefs.0p25.f000.paramlist.b.txt b/parm/product/gefs.0p25.f000.paramlist.b.txt
new file mode 100644
index 0000000000..b94b4ab8a3
--- /dev/null
+++ b/parm/product/gefs.0p25.f000.paramlist.b.txt
@@ -0,0 +1,522 @@
+############################# sorted pgrb2a + pgrb2b 201502
+:4LFTX:surface:
+:5WAVH:500 mb:
+:ABSV:1000 mb:
+:ABSV:100 mb:
+:ABSV:10 mb:
+:ABSV:150 mb:
+:ABSV:200 mb:
+:ABSV:20 mb:
+:ABSV:250 mb:
+:ABSV:300 mb:
+:ABSV:30 mb:
+:ABSV:350 mb:
+:ABSV:400 mb:
+:ABSV:450 mb:
+:ABSV:500 mb:
+:ABSV:50 mb:
+:ABSV:550 mb:
+:ABSV:600 mb:
+:ABSV:650 mb:
+:ABSV:700 mb:
+:ABSV:70 mb:
+:ABSV:750 mb:
+:ABSV:800 mb:
+:ABSV:850 mb:
+:ABSV:900 mb:
+:ABSV:925 mb:
+:ABSV:950 mb:
+:ABSV:975 mb:
+:BRTMP:top of atmosphere:
+:CAPE:255-0 mb above ground:
+:CIN:255-0 mb above ground:
+:CLWMR:1000 mb:
+:CLWMR:100 mb:
+:CLWMR:10 mb:
+:CLWMR:150 mb:
+:CLWMR:200 mb:
+:CLWMR:20 mb:
+:CLWMR:250 mb:
+:CLWMR:300 mb:
+:CLWMR:30 mb:
+:CLWMR:350 mb:
+:CLWMR:400 mb:
+:CLWMR:450 mb:
+:CLWMR:500 mb:
+:CLWMR:50 mb:
+:CLWMR:550 mb:
+:CLWMR:600 mb:
+:CLWMR:650 mb:
+:CLWMR:700 mb:
+:CLWMR:70 mb:
+:CLWMR:750 mb:
+:CLWMR:800 mb:
+:CLWMR:850 mb:
+:CLWMR:900 mb:
+:CLWMR:925 mb:
+:CLWMR:950 mb:
+:CLWMR:975 mb:
+:CNWAT:surface:
+:CWAT:entire atmosphere (considered as a single layer):
+:DPT:30-0 mb above ground:
+:FLDCP:surface:
+:FRICV:surface:
+:HGT:0C isotherm:
+:HGT:1000 mb:
+:HGT:100 mb:
+:HGT:10 mb:
+:HGT:1 mb:
+:HGT:150 mb:
+:HGT:200 mb:
+:HGT:20 mb:
+:HGT:2 mb:
+:HGT:250 mb:
+:HGT:300 mb:
+:HGT:30 mb:
+:HGT:3 mb:
+:HGT:350 mb:
+:HGT:400 mb:
+:HGT:450 mb:
+:HGT:500 mb:
+:HGT:50 mb:
+:HGT:5 mb:
+:HGT:550 mb:
+:HGT:600 mb:
+:HGT:650 mb:
+:HGT:700 mb:
+:HGT:70 mb:
+:HGT:7 mb:
+:HGT:750 mb:
+:HGT:800 mb:
+:HGT:850 mb:
+:HGT:900 mb:
+:HGT:925 mb:
+:HGT:950 mb:
+:HGT:975 mb:
+:HGT:highest tropospheric freezing level:
+:HGT:max wind:
+:HGT:PV=-1.5e-06 (Km^2/kg/s) surface:
+:HGT:PV=1.5e-06 (Km^2/kg/s) surface:
+:HGT:PV=-1e-06 (Km^2/kg/s) surface:
+:HGT:PV=1e-06 (Km^2/kg/s) surface:
+:HGT:PV=-2e-06 (Km^2/kg/s) surface:
+:HGT:PV=2e-06 (Km^2/kg/s) surface:
+:HGT:PV=-5e-07 (Km^2/kg/s) surface:
+:HGT:PV=5e-07 (Km^2/kg/s) surface:
+:HGT:tropopause:
+:HINDEX:surface:
+:HPBL:surface:
+:ICAHT:max wind:
+:ICAHT:tropopause:
+:ICEC:surface:
+:ICIP:300 mb:
+:ICIP:400 mb:
+:ICIP:500 mb:
+:ICIP:600 mb:
+:ICIP:700 mb:
+:ICIP:800 mb:
+:ICSEV:300 mb:
+:ICSEV:400 mb:
+:ICSEV:500 mb:
+:ICSEV:600 mb:
+:ICSEV:700 mb:
+:ICSEV:800 mb:
+:LAND:surface:
+:LFTX:surface:
+:MNTSF:320 K isentropic level:
+:O3MR:100 mb:
+:O3MR:10 mb:
+:O3MR:125 mb:
+:O3MR:150 mb:
+:O3MR:1 mb:
+:O3MR:200 mb:
+:O3MR:20 mb:
+:O3MR:250 mb:
+:O3MR:2 mb:
+:O3MR:300 mb:
+:O3MR:30 mb:
+:O3MR:350 mb:
+:O3MR:3 mb:
+:O3MR:400 mb:
+:O3MR:50 mb:
+:O3MR:5 mb:
+:O3MR:70 mb:
+:O3MR:7 mb:
+:PEVPR:surface:
+:PLI:30-0 mb above ground:
+:PLPL:255-0 mb above ground:
+:POT:0.995 sigma level:
+:PRES:80 m above ground:
+:PRES:max wind:
+:PRES:mean sea level:
+:PRES:PV=-1.5e-06 (Km^2/kg/s) surface:
+:PRES:PV=1.5e-06 (Km^2/kg/s) surface:
+:PRES:PV=-1e-06 (Km^2/kg/s) surface:
+:PRES:PV=1e-06 (Km^2/kg/s) surface:
+:PRES:PV=-2e-06 (Km^2/kg/s) surface:
+:PRES:PV=2e-06 (Km^2/kg/s) surface:
+:PRES:PV=-5e-07 (Km^2/kg/s) surface:
+:PRES:PV=5e-07 (Km^2/kg/s) surface:
+:PRES:tropopause:
+:PVORT:310 K isentropic level:
+:PVORT:320 K isentropic level:
+:PVORT:350 K isentropic level:
+:PVORT:450 K isentropic level:
+:PVORT:550 K isentropic level:
+:PVORT:650 K isentropic level:
+:PWAT:30-0 mb above ground:
+:RH:0.33-1 sigma layer:
+:RH:0.44-0.72 sigma layer:
+:RH:0.44-1 sigma layer:
+:RH:0.72-0.94 sigma layer:
+:RH:0.995 sigma level:
+:RH:0C isotherm:
+:RH:1000 mb:
+:RH:100 mb:
+:RH:10 mb:
+:RH:120-90 mb above ground:
+:RH:150-120 mb above ground:
+:RH:150 mb:
+:RH:180-150 mb above ground:
+:RH:200 mb:
+:RH:20 mb:
+:RH:250 mb:
+:RH:300 mb:
+:RH:30-0 mb above ground:
+:RH:30 mb:
+:RH:350 mb:
+:RH:400 mb:
+:RH:450 mb:
+:RH:500 mb:
+:RH:50 mb:
+:RH:550 mb:
+:RH:600 mb:
+:RH:60-30 mb above ground:
+:RH:650 mb:
+:RH:700 mb:
+:RH:70 mb:
+:RH:750 mb:
+:RH:800 mb:
+:RH:850 mb:
+:RH:900 mb:
+:RH:90-60 mb above ground:
+:RH:925 mb:
+:RH:950 mb:
+:RH:975 mb:
+:RH:entire atmosphere (considered as a single layer):
+:RH:highest tropospheric freezing level:
+:SFCR:surface:
+:SNOHF:surface:
+:SNOWC:surface:
+:SOILL:0-0.1 m below ground:
+:SOILL:0.1-0.4 m below ground:
+:SOILL:0.4-1 m below ground:
+:SOILL:1-2 m below ground:
+:SOILW:0.1-0.4 m below ground:
+:SOILW:0.4-1 m below ground:
+:SOILW:1-2 m below ground:
+:SPFH:1000 mb:
+:SPFH:100 mb:
+:SPFH:10 mb:
+:SPFH:1 mb:
+:SPFH:120-90 mb above ground:
+:SPFH:150-120 mb above ground:
+:SPFH:150 mb:
+:SPFH:180-150 mb above ground:
+:SPFH:200 mb:
+:SPFH:20 mb:
+:SPFH:2 mb:
+:SPFH:250 mb:
+:SPFH:2 m above ground:
+:SPFH:300 mb:
+:SPFH:30-0 mb above ground:
+:SPFH:30 mb:
+:SPFH:3 mb:
+:SPFH:350 mb:
+:SPFH:400 mb:
+:SPFH:450 mb:
+:SPFH:500 mb:
+:SPFH:50 mb:
+:SPFH:5 mb:
+:SPFH:550 mb:
+:SPFH:600 mb:
+:SPFH:60-30 mb above ground:
+:SPFH:650 mb:
+:SPFH:700 mb:
+:SPFH:70 mb:
+:SPFH:7 mb:
+:SPFH:750 mb:
+:SPFH:800 mb:
+:SPFH:80 m above ground:
+:SPFH:850 mb:
+:SPFH:900 mb:
+:SPFH:90-60 mb above ground:
+:SPFH:925 mb:
+:SPFH:950 mb:
+:SPFH:975 mb:
+:SUNSD:surface:
+:TCDC:475 mb:
+:TMP:0.995 sigma level:
+:TMP:1000 mb:
+:TMP:100 m above ground:
+:TMP:100 mb:
+:TMP:10 mb:
+:TMP:1 mb:
+:TMP:120-90 mb above ground:
+:TMP:150-120 mb above ground:
+:TMP:150 mb:
+:TMP:180-150 mb above ground:
+:TMP:1829 m above mean sea level:
+:TMP:200 mb:
+:TMP:20 mb:
+:TMP:2 mb:
+:TMP:250 mb:
+:TMP:2743 m above mean sea level:
+:TMP:300 mb:
+:TMP:30-0 mb above ground:
+:TMP:305 m above mean sea level:
+:TMP:30 mb:
+:TMP:3 mb:
+:TMP:320 K isentropic level:
+:TMP:350 mb:
+:TMP:3658 m above mean sea level:
+:TMP:400 mb:
+:TMP:450 mb:
+:TMP:450 K isentropic level:
+:TMP:4572 m above mean sea level:
+:TMP:457 m above mean sea level:
+:TMP:500 mb:
+:TMP:50 mb:
+:TMP:5 mb:
+:TMP:550 mb:
+:TMP:550 K isentropic level:
+:TMP:600 mb:
+:TMP:60-30 mb above ground:
+:TMP:610 m above mean sea level:
+:TMP:650 mb:
+:TMP:650 K isentropic level:
+:TMP:700 mb:
+:TMP:70 mb:
+:TMP:7 mb:
+:TMP:750 mb:
+:TMP:800 mb:
+:TMP:80 m above ground:
+:TMP:850 mb:
+:TMP:900 mb:
+:TMP:90-60 mb above ground:
+:TMP:914 m above mean sea level:
+:TMP:925 mb:
+:TMP:950 mb:
+:TMP:975 mb:
+:TMP:max wind:
+:TMP:PV=-1.5e-06 (Km^2/kg/s) surface:
+:TMP:PV=1.5e-06 (Km^2/kg/s) surface:
+:TMP:PV=-1e-06 (Km^2/kg/s) surface:
+:TMP:PV=1e-06 (Km^2/kg/s) surface:
+:TMP:PV=-2e-06 (Km^2/kg/s) surface:
+:TMP:PV=2e-06 (Km^2/kg/s) surface:
+:TMP:PV=-5e-07 (Km^2/kg/s) surface:
+:TMP:PV=5e-07 (Km^2/kg/s) surface:
+:TMP:surface:
+:TMP:tropopause:
+:TOZNE:entire atmosphere (considered as a single layer):
+:TSOIL:0.1-0.4 m below ground:
+:TSOIL:0.4-1 m below ground:
+:TSOIL:1-2 m below ground:
+:UGRD:0.995 sigma level:
+:UGRD:1000 mb:
+:UGRD:100 m above ground:
+:UGRD:100 mb:
+:UGRD:10 mb:
+:UGRD:1 mb:
+:UGRD:120-90 mb above ground:
+:UGRD:150-120 mb above ground:
+:UGRD:150 mb:
+:UGRD:180-150 mb above ground:
+:UGRD:1829 m above mean sea level:
+:UGRD:200 mb:
+:UGRD:20 mb:
+:UGRD:2 mb:
+:UGRD:250 mb:
+:UGRD:2743 m above mean sea level:
+:UGRD:300 mb:
+:UGRD:30-0 mb above ground:
+:UGRD:305 m above mean sea level:
+:UGRD:30 mb:
+:UGRD:3 mb:
+:UGRD:320 K isentropic level:
+:UGRD:350 mb:
+:UGRD:3658 m above mean sea level:
+:UGRD:400 mb:
+:UGRD:450 mb:
+:UGRD:450 K isentropic level:
+:UGRD:4572 m above mean sea level:
+:UGRD:457 m above mean sea level:
+:UGRD:500 mb:
+:UGRD:50 mb:
+:UGRD:5 mb:
+:UGRD:550 mb:
+:UGRD:550 K isentropic level:
+:UGRD:600 mb:
+:UGRD:60-30 mb above ground:
+:UGRD:610 m above mean sea level:
+:UGRD:650 mb:
+:UGRD:650 K isentropic level:
+:UGRD:700 mb:
+:UGRD:70 mb:
+:UGRD:7 mb:
+:UGRD:750 mb:
+:UGRD:800 mb:
+:UGRD:80 m above ground:
+:UGRD:850 mb:
+:UGRD:900 mb:
+:UGRD:90-60 mb above ground:
+:UGRD:914 m above mean sea level:
+:UGRD:925 mb:
+:UGRD:950 mb:
+:UGRD:975 mb:
+:UGRD:max wind:
+:UGRD:planetary boundary layer:
+:UGRD:PV=-1.5e-06 (Km^2/kg/s) surface:
+:UGRD:PV=1.5e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-1e-06 (Km^2/kg/s) surface:
+:UGRD:PV=1e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-2e-06 (Km^2/kg/s) surface:
+:UGRD:PV=2e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-5e-07 (Km^2/kg/s) surface:
+:UGRD:PV=5e-07 (Km^2/kg/s) surface:
+:UGRD:tropopause:
+:USTM:6000-0 m above ground:
+:APTMP:2 m above ground:
+:VGRD:0.995 sigma level:
+:VGRD:1000 mb:
+:VGRD:100 m above ground:
+:VGRD:100 mb:
+:VGRD:10 mb:
+:VGRD:1 mb:
+:VGRD:120-90 mb above ground:
+:VGRD:150-120 mb above ground:
+:VGRD:150 mb:
+:VGRD:180-150 mb above ground:
+:VGRD:1829 m above mean sea level:
+:VGRD:200 mb:
+:VGRD:20 mb:
+:VGRD:2 mb:
+:VGRD:250 mb:
+:VGRD:2743 m above mean sea level:
+:VGRD:300 mb:
+:VGRD:30-0 mb above ground:
+:VGRD:305 m above mean sea level:
+:VGRD:30 mb:
+:VGRD:3 mb:
+:VGRD:320 K isentropic level:
+:VGRD:350 mb:
+:VGRD:3658 m above mean sea level:
+:VGRD:400 mb:
+:VGRD:450 mb:
+:VGRD:450 K isentropic level:
+:VGRD:4572 m above mean sea level:
+:VGRD:457 m above mean sea level:
+:VGRD:500 mb:
+:VGRD:50 mb:
+:VGRD:5 mb:
+:VGRD:550 mb:
+:VGRD:550 K isentropic level:
+:VGRD:600 mb:
+:VGRD:60-30 mb above ground:
+:VGRD:610 m above mean sea level:
+:VGRD:650 mb:
+:VGRD:650 K isentropic level:
+:VGRD:700 mb:
+:VGRD:70 mb:
+:VGRD:7 mb:
+:VGRD:750 mb:
+:VGRD:800 mb:
+:VGRD:80 m above ground:
+:VGRD:850 mb:
+:VGRD:900 mb:
+:VGRD:90-60 mb above ground:
+:VGRD:914 m above mean sea level:
+:VGRD:925 mb:
+:VGRD:950 mb:
+:VGRD:975 mb:
+:VGRD:max wind:
+:VGRD:planetary boundary layer:
+:VGRD:PV=-1.5e-06 (Km^2/kg/s) surface:
+:VGRD:PV=1.5e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-1e-06 (Km^2/kg/s) surface:
+:VGRD:PV=1e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-2e-06 (Km^2/kg/s) surface:
+:VGRD:PV=2e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-5e-07 (Km^2/kg/s) surface:
+:VGRD:PV=5e-07 (Km^2/kg/s) surface:
+:VGRD:tropopause:
+:VRATE:planetary boundary layer:
+:VSTM:6000-0 m above ground:
+:VVEL:0.995 sigma level:
+:VVEL:1 mb:
+:VVEL:2 mb:
+:VVEL:3 mb:
+:VVEL:5 mb:
+:VVEL:7 mb:
+:VVEL:10 mb:
+:VVEL:20 mb:
+:VVEL:30 mb:
+:VVEL:50 mb:
+:VVEL:70 mb:
+:VVEL:1000 mb:
+:VVEL:100 mb:
+:VVEL:150 mb:
+:VVEL:200 mb:
+:VVEL:250 mb:
+:VVEL:300 mb:
+:VVEL:350 mb:
+:VVEL:400 mb:
+:VVEL:450 mb:
+:VVEL:500 mb:
+:VVEL:550 mb:
+:VVEL:600 mb:
+:VVEL:650 mb:
+:VVEL:700 mb:
+:VVEL:750 mb:
+:VVEL:800 mb:
+:VVEL:850 mb:
+:VVEL:900 mb:
+:VVEL:925 mb:
+:VVEL:950 mb:
+:VVEL:975 mb:
+:VWSH:PV=-1.5e-06 (Km^2/kg/s) surface:
+:VWSH:PV=1.5e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-1e-06 (Km^2/kg/s) surface:
+:VWSH:PV=1e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-2e-06 (Km^2/kg/s) surface:
+:VWSH:PV=2e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-5e-07 (Km^2/kg/s) surface:
+:VWSH:PV=5e-07 (Km^2/kg/s) surface:
+:VWSH:tropopause:
+:WILT:surface:
+:PRES:1 hybrid level:
+:HGT:1 hybrid level:
+:TMP:1 hybrid level:
+:RH:1 hybrid level:
+:UGRD:1 hybrid level:
+:VGRD:1 hybrid level:
+:PRES:2 hybrid level:
+:HGT:2 hybrid level:
+:TMP:2 hybrid level:
+:RH:2 hybrid level:
+:UGRD:2 hybrid level:
+:VGRD:2 hybrid level:
+:PRES:3 hybrid level:
+:HGT:3 hybrid level:
+:TMP:3 hybrid level:
+:RH:3 hybrid level:
+:UGRD:3 hybrid level:
+:VGRD:3 hybrid level:
+:PRES:4 hybrid level:
+:HGT:4 hybrid level:
+:TMP:4 hybrid level:
+:RH:4 hybrid level:
+:UGRD:4 hybrid level:
+:VGRD:4 hybrid level:
+;############################ do not leave a blank line at the end
diff --git a/parm/product/gefs.0p25.fFFF.paramlist.a.txt b/parm/product/gefs.0p25.fFFF.paramlist.a.txt
new file mode 100644
index 0000000000..a4a3ace385
--- /dev/null
+++ b/parm/product/gefs.0p25.fFFF.paramlist.a.txt
@@ -0,0 +1,38 @@
+:PRMSL:mean sea level:
+:PRES:surface:
+:TMP:2 m above ground:
+:TMAX:2 m above ground:
+:TMIN:2 m above ground:
+:RH:2 m above ground:
+:DPT:2 m above ground:
+:UGRD:10 m above ground:
+:VGRD:10 m above ground:
+:APCP:surface:
+:CRAIN:surface:
+:CSNOW:surface:
+:CFRZR:surface:
+:CICEP:surface:
+:PWAT:entire atmosphere (considered as a single layer):
+:CAPE:180-0 mb above ground:
+:CAPE:surface:
+:CIN:180-0 mb above ground:
+:CIN:surface:
+:HLCY:3000-0 m above ground:
+:TCDC:entire atmosphere:
+:WEASD:surface:
+:SNOD:surface:
+:ULWRF:top of atmosphere:
+:DSWRF:surface:
+:CPOFP:surface:
+:DLWRF:surface:
+:USWRF:surface:
+:ULWRF:surface:
+:GUST:surface:
+:SHTFL:surface:
+:LHTFL:surface:
+:ICETK:surface:
+:TSOIL:0-0.1
+:SOILW:0-0.1
+:MSLET:mean sea level:
+:VIS:surface:
+:HGT:cloud ceiling:
diff --git a/parm/product/gefs.0p25.fFFF.paramlist.b.txt b/parm/product/gefs.0p25.fFFF.paramlist.b.txt
new file mode 100644
index 0000000000..f7fdb73ddf
--- /dev/null
+++ b/parm/product/gefs.0p25.fFFF.paramlist.b.txt
@@ -0,0 +1,554 @@
+############################# sorted pgrb2a + pgrb2b 201502
+:4LFTX:surface:
+:5WAVH:500 mb:
+:ABSV:1000 mb:
+:ABSV:100 mb:
+:ABSV:10 mb:
+:ABSV:150 mb:
+:ABSV:200 mb:
+:ABSV:20 mb:
+:ABSV:250 mb:
+:ABSV:300 mb:
+:ABSV:30 mb:
+:ABSV:350 mb:
+:ABSV:400 mb:
+:ABSV:450 mb:
+:ABSV:500 mb:
+:ABSV:50 mb:
+:ABSV:550 mb:
+:ABSV:600 mb:
+:ABSV:650 mb:
+:ABSV:700 mb:
+:ABSV:70 mb:
+:ABSV:750 mb:
+:ABSV:800 mb:
+:ABSV:850 mb:
+:ABSV:900 mb:
+:ABSV:925 mb:
+:ABSV:950 mb:
+:ABSV:975 mb:
+:ACPCP:surface:
+:ALBDO:surface:
+:BRTMP:top of atmosphere:
+:CAPE:255-0 mb above ground:
+:CDUVB:surface:
+:CIN:255-0 mb above ground:
+:CLWMR:1000 mb:
+:CLWMR:100 mb:
+:CLWMR:10 mb:
+:CLWMR:150 mb:
+:CLWMR:200 mb:
+:CLWMR:20 mb:
+:CLWMR:250 mb:
+:CLWMR:300 mb:
+:CLWMR:30 mb:
+:CLWMR:350 mb:
+:CLWMR:400 mb:
+:CLWMR:450 mb:
+:CLWMR:500 mb:
+:CLWMR:50 mb:
+:CLWMR:550 mb:
+:CLWMR:600 mb:
+:CLWMR:650 mb:
+:CLWMR:700 mb:
+:CLWMR:70 mb:
+:CLWMR:750 mb:
+:CLWMR:800 mb:
+:CLWMR:850 mb:
+:CLWMR:900 mb:
+:CLWMR:925 mb:
+:CLWMR:950 mb:
+:CLWMR:975 mb:
+:CNWAT:surface:
+:CPRAT:surface:
+:CWAT:entire atmosphere (considered as a single layer):
+:CWORK:entire atmosphere (considered as a single layer):
+:DPT:30-0 mb above ground:
+:DUVB:surface:
+:FLDCP:surface:
+:FRICV:surface:
+:GFLUX:surface:
+:HGT:0C isotherm:
+:HGT:1000 mb:
+:HGT:100 mb:
+:HGT:10 mb:
+:HGT:1 mb:
+:HGT:150 mb:
+:HGT:200 mb:
+:HGT:20 mb:
+:HGT:2 mb:
+:HGT:250 mb:
+:HGT:300 mb:
+:HGT:30 mb:
+:HGT:3 mb:
+:HGT:350 mb:
+:HGT:400 mb:
+:HGT:450 mb:
+:HGT:500 mb:
+:HGT:50 mb:
+:HGT:5 mb:
+:HGT:550 mb:
+:HGT:600 mb:
+:HGT:650 mb:
+:HGT:700 mb:
+:HGT:70 mb:
+:HGT:7 mb:
+:HGT:750 mb:
+:HGT:800 mb:
+:HGT:850 mb:
+:HGT:900 mb:
+:HGT:925 mb:
+:HGT:950 mb:
+:HGT:975 mb:
+:HGT:highest tropospheric freezing level:
+:HGT:max wind:
+:HGT:PV=-1.5e-06 (Km^2/kg/s) surface:
+:HGT:PV=1.5e-06 (Km^2/kg/s) surface:
+:HGT:PV=-1e-06 (Km^2/kg/s) surface:
+:HGT:PV=1e-06 (Km^2/kg/s) surface:
+:HGT:PV=-2e-06 (Km^2/kg/s) surface:
+:HGT:PV=2e-06 (Km^2/kg/s) surface:
+:HGT:PV=-5e-07 (Km^2/kg/s) surface:
+:HGT:PV=5e-07 (Km^2/kg/s) surface:
+:HGT:surface:
+:HGT:tropopause:
+:HINDEX:surface:
+:HPBL:surface:
+:ICAHT:max wind:
+:ICAHT:tropopause:
+:ICEC:surface:
+:ICIP:300 mb:
+:ICIP:400 mb:
+:ICIP:500 mb:
+:ICIP:600 mb:
+:ICIP:700 mb:
+:ICIP:800 mb:
+:ICSEV:300 mb:
+:ICSEV:400 mb:
+:ICSEV:500 mb:
+:ICSEV:600 mb:
+:ICSEV:700 mb:
+:ICSEV:800 mb:
+:LAND:surface:
+:LFTX:surface:
+:MNTSF:320 K isentropic level:
+:NCPCP:surface:
+:O3MR:100 mb:
+:O3MR:10 mb:
+:O3MR:125 mb:
+:O3MR:150 mb:
+:O3MR:1 mb:
+:O3MR:200 mb:
+:O3MR:20 mb:
+:O3MR:250 mb:
+:O3MR:2 mb:
+:O3MR:300 mb:
+:O3MR:30 mb:
+:O3MR:350 mb:
+:O3MR:3 mb:
+:O3MR:400 mb:
+:O3MR:50 mb:
+:O3MR:5 mb:
+:O3MR:70 mb:
+:O3MR:7 mb:
+:PEVPR:surface:
+:PLI:30-0 mb above ground:
+:PLPL:255-0 mb above ground:
+:POT:0.995 sigma level:
+:PRATE:surface:
+:PRES:80 m above ground:
+:PRES:convective cloud bottom level:
+:PRES:convective cloud top level:
+:PRES:high cloud bottom level:
+:PRES:high cloud top level:
+:PRES:low cloud bottom level:
+:PRES:low cloud top level:
+:PRES:max wind:
+:PRES:mean sea level:
+:PRES:middle cloud bottom level:
+:PRES:middle cloud top level:
+:PRES:PV=-1.5e-06 (Km^2/kg/s) surface:
+:PRES:PV=1.5e-06 (Km^2/kg/s) surface:
+:PRES:PV=-1e-06 (Km^2/kg/s) surface:
+:PRES:PV=1e-06 (Km^2/kg/s) surface:
+:PRES:PV=-2e-06 (Km^2/kg/s) surface:
+:PRES:PV=2e-06 (Km^2/kg/s) surface:
+:PRES:PV=-5e-07 (Km^2/kg/s) surface:
+:PRES:PV=5e-07 (Km^2/kg/s) surface:
+:PRES:tropopause:
+:PVORT:310 K isentropic level:
+:PVORT:320 K isentropic level:
+:PVORT:350 K isentropic level:
+:PVORT:450 K isentropic level:
+:PVORT:550 K isentropic level:
+:PVORT:650 K isentropic level:
+:PWAT:30-0 mb above ground:
+:RH:0.33-1 sigma layer:
+:RH:0.44-0.72 sigma layer:
+:RH:0.44-1 sigma layer:
+:RH:0.72-0.94 sigma layer:
+:RH:0.995 sigma level:
+:RH:0C isotherm:
+:RH:1000 mb:
+:RH:100 mb:
+:RH:10 mb:
+:RH:120-90 mb above ground:
+:RH:150-120 mb above ground:
+:RH:150 mb:
+:RH:180-150 mb above ground:
+:RH:200 mb:
+:RH:20 mb:
+:RH:250 mb:
+:RH:300 mb:
+:RH:30-0 mb above ground:
+:RH:30 mb:
+:RH:350 mb:
+:RH:400 mb:
+:RH:450 mb:
+:RH:500 mb:
+:RH:50 mb:
+:RH:550 mb:
+:RH:600 mb:
+:RH:60-30 mb above ground:
+:RH:650 mb:
+:RH:700 mb:
+:RH:70 mb:
+:RH:750 mb:
+:RH:800 mb:
+:RH:850 mb:
+:RH:900 mb:
+:RH:90-60 mb above ground:
+:RH:925 mb:
+:RH:950 mb:
+:RH:975 mb:
+:RH:entire atmosphere (considered as a single layer):
+:RH:highest tropospheric freezing level:
+:SFCR:surface:
+:SNOWC:surface:
+:SNOHF:surface:
+:SOILL:0-0.1 m below ground:
+:SOILL:0.1-0.4 m below ground:
+:SOILL:0.4-1 m below ground:
+:SOILL:1-2 m below ground:
+:SOILW:0.1-0.4 m below ground:
+:SOILW:0.4-1 m below ground:
+:SOILW:1-2 m below ground:
+:SPFH:1000 mb:
+:SPFH:100 mb:
+:SPFH:10 mb:
+:SPFH:1 mb:
+:SPFH:120-90 mb above ground:
+:SPFH:150-120 mb above ground:
+:SPFH:150 mb:
+:SPFH:180-150 mb above ground:
+:SPFH:200 mb:
+:SPFH:20 mb:
+:SPFH:2 mb:
+:SPFH:250 mb:
+:SPFH:2 m above ground:
+:SPFH:300 mb:
+:SPFH:30-0 mb above ground:
+:SPFH:30 mb:
+:SPFH:3 mb:
+:SPFH:350 mb:
+:SPFH:400 mb:
+:SPFH:450 mb:
+:SPFH:500 mb:
+:SPFH:50 mb:
+:SPFH:5 mb:
+:SPFH:550 mb:
+:SPFH:600 mb:
+:SPFH:60-30 mb above ground:
+:SPFH:650 mb:
+:SPFH:700 mb:
+:SPFH:70 mb:
+:SPFH:7 mb:
+:SPFH:750 mb:
+:SPFH:800 mb:
+:SPFH:80 m above ground:
+:SPFH:850 mb:
+:SPFH:900 mb:
+:SPFH:90-60 mb above ground:
+:SPFH:925 mb:
+:SPFH:950 mb:
+:SPFH:975 mb:
+:SUNSD:surface:
+:TCDC:475 mb:
+:TCDC:boundary layer cloud layer:
+:TCDC:convective cloud layer:
+:TCDC:high cloud layer:
+:TCDC:low cloud layer:
+:TCDC:middle cloud layer:
+:TMP:0.995 sigma level:
+:TMP:1000 mb:
+:TMP:100 m above ground:
+:TMP:100 mb:
+:TMP:10 mb:
+:TMP:1 mb:
+:TMP:120-90 mb above ground:
+:TMP:150-120 mb above ground:
+:TMP:150 mb:
+:TMP:180-150 mb above ground:
+:TMP:1829 m above mean sea level:
+:TMP:200 mb:
+:TMP:20 mb:
+:TMP:2 mb:
+:TMP:250 mb:
+:TMP:2743 m above mean sea level:
+:TMP:300 mb:
+:TMP:30-0 mb above ground:
+:TMP:305 m above mean sea level:
+:TMP:30 mb:
+:TMP:3 mb:
+:TMP:320 K isentropic level:
+:TMP:350 mb:
+:TMP:3658 m above mean sea level:
+:TMP:400 mb:
+:TMP:450 K isentropic level:
+:TMP:450 mb:
+:TMP:4572 m above mean sea level:
+:TMP:457 m above mean sea level:
+:TMP:500 mb:
+:TMP:50 mb:
+:TMP:5 mb:
+:TMP:550 K isentropic level:
+:TMP:550 mb:
+:TMP:600 mb:
+:TMP:60-30 mb above ground:
+:TMP:610 m above mean sea level:
+:TMP:650 K isentropic level:
+:TMP:650 mb:
+:TMP:700 mb:
+:TMP:70 mb:
+:TMP:7 mb:
+:TMP:750 mb:
+:TMP:800 mb:
+:TMP:80 m above ground:
+:TMP:850 mb:
+:TMP:900 mb:
+:TMP:90-60 mb above ground:
+:TMP:914 m above mean sea level:
+:TMP:925 mb:
+:TMP:950 mb:
+:TMP:975 mb:
+:TMP:high cloud top level:
+:TMP:low cloud top level:
+:TMP:max wind:
+:TMP:middle cloud top level:
+:TMP:PV=-1.5e-06 (Km^2/kg/s) surface:
+:TMP:PV=1.5e-06 (Km^2/kg/s) surface:
+:TMP:PV=-1e-06 (Km^2/kg/s) surface:
+:TMP:PV=1e-06 (Km^2/kg/s) surface:
+:TMP:PV=-2e-06 (Km^2/kg/s) surface:
+:TMP:PV=2e-06 (Km^2/kg/s) surface:
+:TMP:PV=-5e-07 (Km^2/kg/s) surface:
+:TMP:PV=5e-07 (Km^2/kg/s) surface:
+:TMP:surface:
+:TMP:tropopause:
+:TOZNE:entire atmosphere (considered as a single layer):
+:TSOIL:0.1-0.4 m below ground:
+:TSOIL:0.4-1 m below ground:
+:TSOIL:1-2 m below ground:
+:UFLX:surface:
+:UGRD:0.995 sigma level:
+:UGRD:1000 mb:
+:UGRD:100 m above ground:
+:UGRD:100 mb:
+:UGRD:10 mb:
+:UGRD:1 mb:
+:UGRD:120-90 mb above ground:
+:UGRD:150-120 mb above ground:
+:UGRD:150 mb:
+:UGRD:180-150 mb above ground:
+:UGRD:1829 m above mean sea level:
+:UGRD:200 mb:
+:UGRD:20 mb:
+:UGRD:2 mb:
+:UGRD:250 mb:
+:UGRD:2743 m above mean sea level:
+:UGRD:300 mb:
+:UGRD:30-0 mb above ground:
+:UGRD:305 m above mean sea level:
+:UGRD:30 mb:
+:UGRD:3 mb:
+:UGRD:320 K isentropic level:
+:UGRD:350 mb:
+:UGRD:3658 m above mean sea level:
+:UGRD:400 mb:
+:UGRD:450 K isentropic level:
+:UGRD:450 mb:
+:UGRD:4572 m above mean sea level:
+:UGRD:457 m above mean sea level:
+:UGRD:500 mb:
+:UGRD:50 mb:
+:UGRD:5 mb:
+:UGRD:550 K isentropic level:
+:UGRD:550 mb:
+:UGRD:600 mb:
+:UGRD:60-30 mb above ground:
+:UGRD:610 m above mean sea level:
+:UGRD:650 K isentropic level:
+:UGRD:650 mb:
+:UGRD:700 mb:
+:UGRD:70 mb:
+:UGRD:7 mb:
+:UGRD:750 mb:
+:UGRD:800 mb:
+:UGRD:80 m above ground:
+:UGRD:850 mb:
+:UGRD:900 mb:
+:UGRD:90-60 mb above ground:
+:UGRD:914 m above mean sea level:
+:UGRD:925 mb:
+:UGRD:950 mb:
+:UGRD:975 mb:
+:UGRD:max wind:
+:UGRD:planetary boundary layer:
+:UGRD:PV=-1.5e-06 (Km^2/kg/s) surface:
+:UGRD:PV=1.5e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-1e-06 (Km^2/kg/s) surface:
+:UGRD:PV=1e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-2e-06 (Km^2/kg/s) surface:
+:UGRD:PV=2e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-5e-07 (Km^2/kg/s) surface:
+:UGRD:PV=5e-07 (Km^2/kg/s) surface:
+:UGRD:tropopause:
+:U-GWD:surface:
+:USTM:6000-0 m above ground:
+:USWRF:top of atmosphere:
+:APTMP:2 m above ground
+:VFLX:surface:
+:VGRD:0.995 sigma level:
+:VGRD:1000 mb:
+:VGRD:100 m above ground:
+:VGRD:100 mb:
+:VGRD:10 mb:
+:VGRD:1 mb:
+:VGRD:120-90 mb above ground:
+:VGRD:150-120 mb above ground:
+:VGRD:150 mb:
+:VGRD:180-150 mb above ground:
+:VGRD:1829 m above mean sea level:
+:VGRD:200 mb:
+:VGRD:20 mb:
+:VGRD:2 mb:
+:VGRD:250 mb:
+:VGRD:2743 m above mean sea level:
+:VGRD:300 mb:
+:VGRD:30-0 mb above ground:
+:VGRD:305 m above mean sea level:
+:VGRD:30 mb:
+:VGRD:3 mb:
+:VGRD:320 K isentropic level:
+:VGRD:350 mb:
+:VGRD:3658 m above mean sea level:
+:VGRD:400 mb:
+:VGRD:450 K isentropic level:
+:VGRD:450 mb:
+:VGRD:4572 m above mean sea level:
+:VGRD:457 m above mean sea level:
+:VGRD:500 mb:
+:VGRD:50 mb:
+:VGRD:5 mb:
+:VGRD:550 K isentropic level:
+:VGRD:550 mb:
+:VGRD:600 mb:
+:VGRD:60-30 mb above ground:
+:VGRD:610 m above mean sea level:
+:VGRD:650 K isentropic level:
+:VGRD:650 mb:
+:VGRD:700 mb:
+:VGRD:70 mb:
+:VGRD:7 mb:
+:VGRD:750 mb:
+:VGRD:800 mb:
+:VGRD:80 m above ground:
+:VGRD:850 mb:
+:VGRD:900 mb:
+:VGRD:90-60 mb above ground:
+:VGRD:914 m above mean sea level:
+:VGRD:925 mb:
+:VGRD:950 mb:
+:VGRD:975 mb:
+:VGRD:max wind:
+:VGRD:planetary boundary layer:
+:VGRD:PV=-1.5e-06 (Km^2/kg/s) surface:
+:VGRD:PV=1.5e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-1e-06 (Km^2/kg/s) surface:
+:VGRD:PV=1e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-2e-06 (Km^2/kg/s) surface:
+:VGRD:PV=2e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-5e-07 (Km^2/kg/s) surface:
+:VGRD:PV=5e-07 (Km^2/kg/s) surface:
+:VGRD:tropopause:
+:V-GWD:surface:
+:VRATE:planetary boundary layer:
+:VSTM:6000-0 m above ground:
+:VVEL:0.995 sigma level:
+:VVEL:1 mb:
+:VVEL:2 mb:
+:VVEL:3 mb:
+:VVEL:5 mb:
+:VVEL:7 mb:
+:VVEL:10 mb:
+:VVEL:20 mb:
+:VVEL:30 mb:
+:VVEL:50 mb:
+:VVEL:70 mb:
+:VVEL:1000 mb:
+:VVEL:100 mb:
+:VVEL:150 mb:
+:VVEL:200 mb:
+:VVEL:250 mb:
+:VVEL:300 mb:
+:VVEL:350 mb:
+:VVEL:400 mb:
+:VVEL:450 mb:
+:VVEL:500 mb:
+:VVEL:550 mb:
+:VVEL:600 mb:
+:VVEL:650 mb:
+:VVEL:700 mb:
+:VVEL:750 mb:
+:VVEL:800 mb:
+:VVEL:850 mb:
+:VVEL:900 mb:
+:VVEL:925 mb:
+:VVEL:950 mb:
+:VVEL:975 mb:
+:VWSH:PV=-1.5e-06 (Km^2/kg/s) surface:
+:VWSH:PV=1.5e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-1e-06 (Km^2/kg/s) surface:
+:VWSH:PV=1e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-2e-06 (Km^2/kg/s) surface:
+:VWSH:PV=2e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-5e-07 (Km^2/kg/s) surface:
+:VWSH:PV=5e-07 (Km^2/kg/s) surface:
+:VWSH:tropopause:
+:WATR:surface:
+:WILT:surface:
+:PRES:1 hybrid level:
+:HGT:1 hybrid level:
+:TMP:1 hybrid level:
+:RH:1 hybrid level:
+:UGRD:1 hybrid level:
+:VGRD:1 hybrid level:
+:PRES:2 hybrid level:
+:HGT:2 hybrid level:
+:TMP:2 hybrid level:
+:RH:2 hybrid level:
+:UGRD:2 hybrid level:
+:VGRD:2 hybrid level:
+:PRES:3 hybrid level:
+:HGT:3 hybrid level:
+:TMP:3 hybrid level:
+:RH:3 hybrid level:
+:UGRD:3 hybrid level:
+:VGRD:3 hybrid level:
+:PRES:4 hybrid level:
+:HGT:4 hybrid level:
+:TMP:4 hybrid level:
+:RH:4 hybrid level:
+:UGRD:4 hybrid level:
+:VGRD:4 hybrid level:
+;############################ do not leave a blank line at the end
diff --git a/parm/product/gefs.0p50.f000.paramlist.a.txt b/parm/product/gefs.0p50.f000.paramlist.a.txt
new file mode 100644
index 0000000000..ab8e73f552
--- /dev/null
+++ b/parm/product/gefs.0p50.f000.paramlist.a.txt
@@ -0,0 +1,80 @@
+############################# sorted pgrb2a 201408
+:CAPE:180-0 mb above ground:
+:CIN:180-0 mb above ground:
+:DLWRF:surface:
+:DSWRF:surface:
+:HGT:10 mb:
+:HGT:100 mb:
+:HGT:1000 mb:
+:HGT:200 mb:
+:HGT:250 mb:
+:HGT:300 mb:
+:HGT:50 mb:
+:HGT:500 mb:
+:HGT:700 mb:
+:HGT:850 mb:
+:HGT:925 mb:
+:HGT:surface:
+:ICETK:surface:
+:LHTFL:surface:
+:PRES:surface:
+:PRMSL:mean sea level:
+:PWAT:entire atmosphere (considered as a single layer):
+:RH:10 mb:
+:RH:100 mb:
+:RH:1000 mb:
+:RH:2 m above ground:
+:RH:200 mb:
+:RH:250 mb:
+:RH:50 mb:
+:RH:500 mb:
+:RH:700 mb:
+:RH:850 mb:
+:RH:925 mb:
+:SHTFL:surface:
+:SNOD:surface:
+:SOILW:0-0.1 m below ground:
+:TMP:10 mb:
+:TMP:100 mb:
+:TMP:1000 mb:
+:TMP:2 m above ground:
+:TMP:200 mb:
+:TMP:250 mb:
+:TMP:50 mb:
+:TMP:500 mb:
+:TMP:700 mb:
+:TMP:850 mb:
+:TMP:925 mb:
+:TSOIL:0-0.1 m below ground:
+:UGRD:10 m above ground:
+:UGRD:10 mb:
+:UGRD:100 mb:
+:UGRD:1000 mb:
+:UGRD:200 mb:
+:UGRD:250 mb:
+:UGRD:300 mb:
+:UGRD:400 mb:
+:UGRD:50 mb:
+:UGRD:500 mb:
+:UGRD:700 mb:
+:UGRD:850 mb:
+:UGRD:925 mb:
+:ULWRF:surface:
+:ULWRF:top of atmosphere:
+:USWRF:surface:
+:VGRD:10 m above ground:
+:VGRD:10 mb:
+:VGRD:100 mb:
+:VGRD:1000 mb:
+:VGRD:200 mb:
+:VGRD:250 mb:
+:VGRD:300 mb:
+:VGRD:400 mb:
+:VGRD:50 mb:
+:VGRD:500 mb:
+:VGRD:700 mb:
+:VGRD:850 mb:
+:VGRD:925 mb:
+:VVEL:850 mb:
+:WEASD:surface:
+;############################ do not leave a blank line at the end
diff --git a/parm/product/gefs.0p50.f000.paramlist.b.txt b/parm/product/gefs.0p50.f000.paramlist.b.txt
new file mode 100644
index 0000000000..8fd65468ae
--- /dev/null
+++ b/parm/product/gefs.0p50.f000.paramlist.b.txt
@@ -0,0 +1,474 @@
+############################# sorted pgrb2a + pgrb2b 201502
+:4LFTX:surface:
+:5WAVH:500 mb:
+:ABSV:1000 mb:
+:ABSV:100 mb:
+:ABSV:10 mb:
+:ABSV:150 mb:
+:ABSV:200 mb:
+:ABSV:20 mb:
+:ABSV:250 mb:
+:ABSV:300 mb:
+:ABSV:30 mb:
+:ABSV:350 mb:
+:ABSV:400 mb:
+:ABSV:450 mb:
+:ABSV:500 mb:
+:ABSV:50 mb:
+:ABSV:550 mb:
+:ABSV:600 mb:
+:ABSV:650 mb:
+:ABSV:700 mb:
+:ABSV:70 mb:
+:ABSV:750 mb:
+:ABSV:800 mb:
+:ABSV:850 mb:
+:ABSV:900 mb:
+:ABSV:925 mb:
+:ABSV:950 mb:
+:ABSV:975 mb:
+:BRTMP:top of atmosphere:
+:CAPE:255-0 mb above ground:
+:CAPE:surface:
+:CIN:255-0 mb above ground:
+:CIN:surface:
+:CLWMR:1000 mb:
+:CLWMR:100 mb:
+:CLWMR:10 mb:
+:CLWMR:150 mb:
+:CLWMR:200 mb:
+:CLWMR:20 mb:
+:CLWMR:250 mb:
+:CLWMR:300 mb:
+:CLWMR:30 mb:
+:CLWMR:350 mb:
+:CLWMR:400 mb:
+:CLWMR:450 mb:
+:CLWMR:500 mb:
+:CLWMR:50 mb:
+:CLWMR:550 mb:
+:CLWMR:600 mb:
+:CLWMR:650 mb:
+:CLWMR:700 mb:
+:CLWMR:70 mb:
+:CLWMR:750 mb:
+:CLWMR:800 mb:
+:CLWMR:850 mb:
+:CLWMR:900 mb:
+:CLWMR:925 mb:
+:CLWMR:950 mb:
+:CLWMR:975 mb:
+:CNWAT:surface:
+:CPOFP:surface:
+:CWAT:entire atmosphere (considered as a single layer):
+:DPT:2 m above ground:
+:DPT:30-0 mb above ground:
+:FLDCP:surface:
+:FRICV:surface:
+:GUST:surface:
+:HGT:0C isotherm:
+:HGT:1 mb:
+:HGT:150 mb:
+:HGT:20 mb:
+:HGT:2 mb:
+:HGT:30 mb:
+:HGT:3 mb:
+:HGT:350 mb:
+:HGT:400 mb:
+:HGT:450 mb:
+:HGT:5 mb:
+:HGT:550 mb:
+:HGT:600 mb:
+:HGT:650 mb:
+:HGT:70 mb:
+:HGT:7 mb:
+:HGT:750 mb:
+:HGT:800 mb:
+:HGT:900 mb:
+:HGT:950 mb:
+:HGT:975 mb:
+:HGT:highest tropospheric freezing level:
+:HGT:max wind:
+:HGT:PV=-1.5e-06 (Km^2/kg/s) surface:
+:HGT:PV=1.5e-06 (Km^2/kg/s) surface:
+:HGT:PV=-1e-06 (Km^2/kg/s) surface:
+:HGT:PV=1e-06 (Km^2/kg/s) surface:
+:HGT:PV=-2e-06 (Km^2/kg/s) surface:
+:HGT:PV=2e-06 (Km^2/kg/s) surface:
+:HGT:PV=-5e-07 (Km^2/kg/s) surface:
+:HGT:PV=5e-07 (Km^2/kg/s) surface:
+:HGT:tropopause:
+:HINDEX:surface:
+:HLCY:3000-0 m above ground:
+:HPBL:surface:
+:ICAHT:max wind:
+:ICAHT:tropopause:
+:ICEC:surface:
+:ICIP:300 mb:
+:ICIP:400 mb:
+:ICIP:500 mb:
+:ICIP:600 mb:
+:ICIP:700 mb:
+:ICIP:800 mb:
+:ICSEV:300 mb:
+:ICSEV:400 mb:
+:ICSEV:500 mb:
+:ICSEV:600 mb:
+:ICSEV:700 mb:
+:ICSEV:800 mb:
+:LAND:surface:
+:LFTX:surface:
+:MNTSF:320 K isentropic level:
+:MSLET:mean sea level:
+:O3MR:100 mb:
+:O3MR:10 mb:
+:O3MR:125 mb:
+:O3MR:150 mb:
+:O3MR:1 mb:
+:O3MR:200 mb:
+:O3MR:20 mb:
+:O3MR:250 mb:
+:O3MR:2 mb:
+:O3MR:300 mb:
+:O3MR:30 mb:
+:O3MR:350 mb:
+:O3MR:3 mb:
+:O3MR:400 mb:
+:O3MR:50 mb:
+:O3MR:5 mb:
+:O3MR:70 mb:
+:O3MR:7 mb:
+:PEVPR:surface:
+:PLI:30-0 mb above ground:
+:PLPL:255-0 mb above ground:
+:POT:0.995 sigma level:
+:PRES:80 m above ground:
+:PRES:max wind:
+:PRES:mean sea level:
+:PRES:PV=-1.5e-06 (Km^2/kg/s) surface:
+:PRES:PV=1.5e-06 (Km^2/kg/s) surface:
+:PRES:PV=-1e-06 (Km^2/kg/s) surface:
+:PRES:PV=1e-06 (Km^2/kg/s) surface:
+:PRES:PV=-2e-06 (Km^2/kg/s) surface:
+:PRES:PV=2e-06 (Km^2/kg/s) surface:
+:PRES:PV=-5e-07 (Km^2/kg/s) surface:
+:PRES:PV=5e-07 (Km^2/kg/s) surface:
+:PRES:tropopause:
+:PVORT:310 K isentropic level:
+:PVORT:320 K isentropic level:
+:PVORT:350 K isentropic level:
+:PVORT:450 K isentropic level:
+:PVORT:550 K isentropic level:
+:PVORT:650 K isentropic level:
+:PWAT:30-0 mb above ground:
+:RH:0.33-1 sigma layer:
+:RH:0.44-0.72 sigma layer:
+:RH:0.44-1 sigma layer:
+:RH:0.72-0.94 sigma layer:
+:RH:0.995 sigma level:
+:RH:0C isotherm:
+:RH:120-90 mb above ground:
+:RH:150-120 mb above ground:
+:RH:150 mb:
+:RH:180-150 mb above ground:
+:RH:20 mb:
+:RH:300 mb:
+:RH:30-0 mb above ground:
+:RH:30 mb:
+:RH:350 mb:
+:RH:400 mb:
+:RH:450 mb:
+:RH:550 mb:
+:RH:600 mb:
+:RH:60-30 mb above ground:
+:RH:650 mb:
+:RH:70 mb:
+:RH:750 mb:
+:RH:800 mb:
+:RH:900 mb:
+:RH:90-60 mb above ground:
+:RH:950 mb:
+:RH:975 mb:
+:RH:entire atmosphere (considered as a single layer):
+:RH:highest tropospheric freezing level:
+:SFCR:surface:
+:SNOHF:surface:
+:SNOWC:surface:
+:SOILL:0-0.1 m below ground:
+:SOILL:0.1-0.4 m below ground:
+:SOILL:0.4-1 m below ground:
+:SOILL:1-2 m below ground:
+:SOILW:0.1-0.4 m below ground:
+:SOILW:0.4-1 m below ground:
+:SOILW:1-2 m below ground:
+:SPFH:1000 mb:
+:SPFH:100 mb:
+:SPFH:10 mb:
+:SPFH:1 mb:
+:SPFH:120-90 mb above ground:
+:SPFH:150-120 mb above ground:
+:SPFH:150 mb:
+:SPFH:180-150 mb above ground:
+:SPFH:200 mb:
+:SPFH:20 mb:
+:SPFH:2 mb:
+:SPFH:250 mb:
+:SPFH:2 m above ground:
+:SPFH:300 mb:
+:SPFH:30-0 mb above ground:
+:SPFH:30 mb:
+:SPFH:3 mb:
+:SPFH:350 mb:
+:SPFH:400 mb:
+:SPFH:450 mb:
+:SPFH:500 mb:
+:SPFH:50 mb:
+:SPFH:5 mb:
+:SPFH:550 mb:
+:SPFH:600 mb:
+:SPFH:60-30 mb above ground:
+:SPFH:650 mb:
+:SPFH:700 mb:
+:SPFH:70 mb:
+:SPFH:7 mb:
+:SPFH:750 mb:
+:SPFH:800 mb:
+:SPFH:80 m above ground:
+:SPFH:850 mb:
+:SPFH:900 mb:
+:SPFH:90-60 mb above ground:
+:SPFH:925 mb:
+:SPFH:950 mb:
+:SPFH:975 mb:
+:SUNSD:surface:
+:TCDC:475 mb:
+:TMP:0.995 sigma level:
+:TMP:100 m above ground:
+:TMP:1 mb:
+:TMP:120-90 mb above ground:
+:TMP:150-120 mb above ground:
+:TMP:150 mb:
+:TMP:180-150 mb above ground:
+:TMP:1829 m above mean sea level:
+:TMP:20 mb:
+:TMP:2 mb:
+:TMP:2743 m above mean sea level:
+:TMP:300 mb:
+:TMP:30-0 mb above ground:
+:TMP:305 m above mean sea level:
+:TMP:30 mb:
+:TMP:3 mb:
+:TMP:320 K isentropic level:
+:TMP:350 mb:
+:TMP:3658 m above mean sea level:
+:TMP:400 mb:
+:TMP:450 mb:
+:TMP:450 K isentropic level:
+:TMP:4572 m above mean sea level:
+:TMP:457 m above mean sea level:
+:TMP:5 mb:
+:TMP:550 mb:
+:TMP:550 K isentropic level:
+:TMP:600 mb:
+:TMP:60-30 mb above ground:
+:TMP:610 m above mean sea level:
+:TMP:650 mb:
+:TMP:650 K isentropic level:
+:TMP:70 mb:
+:TMP:7 mb:
+:TMP:750 mb:
+:TMP:800 mb:
+:TMP:80 m above ground:
+:TMP:900 mb:
+:TMP:90-60 mb above ground:
+:TMP:914 m above mean sea level:
+:TMP:950 mb:
+:TMP:975 mb:
+:TMP:max wind:
+:TMP:PV=-1.5e-06 (Km^2/kg/s) surface:
+:TMP:PV=1.5e-06 (Km^2/kg/s) surface:
+:TMP:PV=-1e-06 (Km^2/kg/s) surface:
+:TMP:PV=1e-06 (Km^2/kg/s) surface:
+:TMP:PV=-2e-06 (Km^2/kg/s) surface:
+:TMP:PV=2e-06 (Km^2/kg/s) surface:
+:TMP:PV=-5e-07 (Km^2/kg/s) surface:
+:TMP:PV=5e-07 (Km^2/kg/s) surface:
+:TMP:surface:
+:TMP:tropopause:
+:TOZNE:entire atmosphere (considered as a single layer):
+:TSOIL:0.1-0.4 m below ground:
+:TSOIL:0.4-1 m below ground:
+:TSOIL:1-2 m below ground:
+:UGRD:0.995 sigma level:
+:UGRD:100 m above ground:
+:UGRD:1 mb:
+:UGRD:120-90 mb above ground:
+:UGRD:150-120 mb above ground:
+:UGRD:150 mb:
+:UGRD:180-150 mb above ground:
+:UGRD:1829 m above mean sea level:
+:UGRD:20 mb:
+:UGRD:2 mb:
+:UGRD:2743 m above mean sea level:
+:UGRD:30-0 mb above ground:
+:UGRD:305 m above mean sea level:
+:UGRD:30 mb:
+:UGRD:3 mb:
+:UGRD:320 K isentropic level:
+:UGRD:350 mb:
+:UGRD:3658 m above mean sea level:
+:UGRD:450 mb:
+:UGRD:450 K isentropic level:
+:UGRD:4572 m above mean sea level:
+:UGRD:457 m above mean sea level:
+:UGRD:5 mb:
+:UGRD:550 mb:
+:UGRD:550 K isentropic level:
+:UGRD:600 mb:
+:UGRD:60-30 mb above ground:
+:UGRD:610 m above mean sea level:
+:UGRD:650 mb:
+:UGRD:650 K isentropic level:
+:UGRD:70 mb:
+:UGRD:7 mb:
+:UGRD:750 mb:
+:UGRD:800 mb:
+:UGRD:80 m above ground:
+:UGRD:900 mb:
+:UGRD:90-60 mb above ground:
+:UGRD:914 m above mean sea level:
+:UGRD:950 mb:
+:UGRD:975 mb:
+:UGRD:max wind:
+:UGRD:planetary boundary layer:
+:UGRD:PV=-1.5e-06 (Km^2/kg/s) surface:
+:UGRD:PV=1.5e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-1e-06 (Km^2/kg/s) surface:
+:UGRD:PV=1e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-2e-06 (Km^2/kg/s) surface:
+:UGRD:PV=2e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-5e-07 (Km^2/kg/s) surface:
+:UGRD:PV=5e-07 (Km^2/kg/s) surface:
+:UGRD:tropopause:
+:USTM:6000-0 m above ground:
+:APTMP:2 m above ground:
+:VGRD:0.995 sigma level:
+:VGRD:100 m above ground:
+:VGRD:1 mb:
+:VGRD:120-90 mb above ground:
+:VGRD:150-120 mb above ground:
+:VGRD:150 mb:
+:VGRD:180-150 mb above ground:
+:VGRD:1829 m above mean sea level:
+:VGRD:20 mb:
+:VGRD:2 mb:
+:VGRD:2743 m above mean sea level:
+:VGRD:30-0 mb above ground:
+:VGRD:305 m above mean sea level:
+:VGRD:30 mb:
+:VGRD:3 mb:
+:VGRD:320 K isentropic level:
+:VGRD:350 mb:
+:VGRD:3658 m above mean sea level:
+:VGRD:450 mb:
+:VGRD:450 K isentropic level:
+:VGRD:4572 m above mean sea level:
+:VGRD:457 m above mean sea level:
+:VGRD:5 mb:
+:VGRD:550 mb:
+:VGRD:550 K isentropic level:
+:VGRD:600 mb:
+:VGRD:60-30 mb above ground:
+:VGRD:610 m above mean sea level:
+:VGRD:650 mb:
+:VGRD:650 K isentropic level:
+:VGRD:70 mb:
+:VGRD:7 mb:
+:VGRD:750 mb:
+:VGRD:800 mb:
+:VGRD:80 m above ground:
+:VGRD:900 mb:
+:VGRD:90-60 mb above ground:
+:VGRD:914 m above mean sea level:
+:VGRD:950 mb:
+:VGRD:975 mb:
+:VGRD:max wind:
+:VGRD:planetary boundary layer:
+:VGRD:PV=-1.5e-06 (Km^2/kg/s) surface:
+:VGRD:PV=1.5e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-1e-06 (Km^2/kg/s) surface:
+:VGRD:PV=1e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-2e-06 (Km^2/kg/s) surface:
+:VGRD:PV=2e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-5e-07 (Km^2/kg/s) surface:
+:VGRD:PV=5e-07 (Km^2/kg/s) surface:
+:VGRD:tropopause:
+:VIS:surface:
+:VRATE:planetary boundary layer:
+:VSTM:6000-0 m above ground:
+:VVEL:0.995 sigma level:
+:VVEL:1 mb:
+:VVEL:2 mb:
+:VVEL:3 mb:
+:VVEL:5 mb:
+:VVEL:7 mb:
+:VVEL:10 mb:
+:VVEL:20 mb:
+:VVEL:30 mb:
+:VVEL:50 mb:
+:VVEL:70 mb:
+:VVEL:1000 mb:
+:VVEL:100 mb:
+:VVEL:150 mb:
+:VVEL:200 mb:
+:VVEL:250 mb:
+:VVEL:300 mb:
+:VVEL:350 mb:
+:VVEL:400 mb:
+:VVEL:450 mb:
+:VVEL:500 mb:
+:VVEL:550 mb:
+:VVEL:600 mb:
+:VVEL:650 mb:
+:VVEL:700 mb:
+:VVEL:750 mb:
+:VVEL:800 mb:
+:VVEL:900 mb:
+:VVEL:925 mb:
+:VVEL:950 mb:
+:VVEL:975 mb:
+:VWSH:PV=-1.5e-06 (Km^2/kg/s) surface:
+:VWSH:PV=1.5e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-1e-06 (Km^2/kg/s) surface:
+:VWSH:PV=1e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-2e-06 (Km^2/kg/s) surface:
+:VWSH:PV=2e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-5e-07 (Km^2/kg/s) surface:
+:VWSH:PV=5e-07 (Km^2/kg/s) surface:
+:VWSH:tropopause:
+:WILT:surface:
+:HGT:cloud ceiling:
+:PRES:1 hybrid level:
+:HGT:1 hybrid level:
+:TMP:1 hybrid level:
+:RH:1 hybrid level:
+:UGRD:1 hybrid level:
+:VGRD:1 hybrid level:
+:PRES:2 hybrid level:
+:HGT:2 hybrid level:
+:TMP:2 hybrid level:
+:RH:2 hybrid level:
+:UGRD:2 hybrid level:
+:VGRD:2 hybrid level:
+:PRES:3 hybrid level:
+:HGT:3 hybrid level:
+:TMP:3 hybrid level:
+:RH:3 hybrid level:
+:UGRD:3 hybrid level:
+:VGRD:3 hybrid level:
+:PRES:4 hybrid level:
+:HGT:4 hybrid level:
+:TMP:4 hybrid level:
+:RH:4 hybrid level:
+:UGRD:4 hybrid level:
+:VGRD:4 hybrid level:
diff --git a/parm/product/gefs.0p50.fFFF.paramlist.a.txt b/parm/product/gefs.0p50.fFFF.paramlist.a.txt
new file mode 100644
index 0000000000..dde635408c
--- /dev/null
+++ b/parm/product/gefs.0p50.fFFF.paramlist.a.txt
@@ -0,0 +1,87 @@
+############################# sorted pgrb2a 201408
+:APCP:surface:
+:CAPE:180-0 mb above ground:
+:CFRZR:surface:
+:CICEP:surface:
+:CIN:180-0 mb above ground:
+:CRAIN:surface:
+:CSNOW:surface:
+:DLWRF:surface:
+:DSWRF:surface:
+:HGT:10 mb:
+:HGT:100 mb:
+:HGT:1000 mb:
+:HGT:200 mb:
+:HGT:250 mb:
+:HGT:300 mb:
+:HGT:50 mb:
+:HGT:500 mb:
+:HGT:700 mb:
+:HGT:850 mb:
+:HGT:925 mb:
+:LHTFL:surface:
+:ICETK:surface:
+:PRES:surface:
+:PRMSL:mean sea level:
+:PWAT:entire atmosphere (considered as a single layer):
+:RH:10 mb:
+:RH:100 mb:
+:RH:1000 mb:
+:RH:2 m above ground:
+:RH:200 mb:
+:RH:250 mb:
+:RH:50 mb:
+:RH:500 mb:
+:RH:700 mb:
+:RH:850 mb:
+:RH:925 mb:
+:SHTFL:surface:
+:SNOD:surface:
+:SOILW:0-0.1 m below ground:
+:TCDC:entire atmosphere:
+:TMAX:2 m above ground:
+:TMIN:2 m above ground:
+:TMP:10 mb:
+:TMP:100 mb:
+:TMP:1000 mb:
+:TMP:2 m above ground:
+:TMP:200 mb:
+:TMP:250 mb:
+:TMP:50 mb:
+:TMP:500 mb:
+:TMP:700 mb:
+:TMP:850 mb:
+:TMP:925 mb:
+:TSOIL:0-0.1 m below ground:
+:UGRD:10 m above ground:
+:UGRD:10 mb:
+:UGRD:100 mb:
+:UGRD:1000 mb:
+:UGRD:200 mb:
+:UGRD:250 mb:
+:UGRD:300 mb:
+:UGRD:400 mb:
+:UGRD:50 mb:
+:UGRD:500 mb:
+:UGRD:700 mb:
+:UGRD:850 mb:
+:UGRD:925 mb:
+:ULWRF:surface:
+:ULWRF:top of atmosphere:
+:USWRF:surface:
+:VGRD:10 m above ground:
+:VGRD:10 mb:
+:VGRD:100 mb:
+:VGRD:1000 mb:
+:VGRD:200 mb:
+:VGRD:250 mb:
+:VGRD:300 mb:
+:VGRD:400 mb:
+:VGRD:50 mb:
+:VGRD:500 mb:
+:VGRD:700 mb:
+:VGRD:850 mb:
+:VGRD:925 mb:
+:VVEL:850 mb:
+:WEASD:surface:
+;############################ do not leave a blank line at the end
diff --git a/parm/product/gefs.0p50.fFFF.paramlist.b.txt b/parm/product/gefs.0p50.fFFF.paramlist.b.txt
new file mode 100644
index 0000000000..28b98db7d5
--- /dev/null
+++ b/parm/product/gefs.0p50.fFFF.paramlist.b.txt
@@ -0,0 +1,506 @@
+############################# sorted pgrb2a + pgrb2b 201502
+:4LFTX:surface:
+:5WAVH:500 mb:
+:ABSV:1000 mb:
+:ABSV:100 mb:
+:ABSV:10 mb:
+:ABSV:150 mb:
+:ABSV:200 mb:
+:ABSV:20 mb:
+:ABSV:250 mb:
+:ABSV:300 mb:
+:ABSV:30 mb:
+:ABSV:350 mb:
+:ABSV:400 mb:
+:ABSV:450 mb:
+:ABSV:500 mb:
+:ABSV:50 mb:
+:ABSV:550 mb:
+:ABSV:600 mb:
+:ABSV:650 mb:
+:ABSV:700 mb:
+:ABSV:70 mb:
+:ABSV:750 mb:
+:ABSV:800 mb:
+:ABSV:850 mb:
+:ABSV:900 mb:
+:ABSV:925 mb:
+:ABSV:950 mb:
+:ABSV:975 mb:
+:ACPCP:surface:
+:ALBDO:surface:
+:BRTMP:top of atmosphere:
+:CAPE:255-0 mb above ground:
+:CAPE:surface:
+:CDUVB:surface:
+:CIN:255-0 mb above ground:
+:CIN:surface:
+:CLWMR:1000 mb:
+:CLWMR:100 mb:
+:CLWMR:10 mb:
+:CLWMR:150 mb:
+:CLWMR:200 mb:
+:CLWMR:20 mb:
+:CLWMR:250 mb:
+:CLWMR:300 mb:
+:CLWMR:30 mb:
+:CLWMR:350 mb:
+:CLWMR:400 mb:
+:CLWMR:450 mb:
+:CLWMR:500 mb:
+:CLWMR:50 mb:
+:CLWMR:550 mb:
+:CLWMR:600 mb:
+:CLWMR:650 mb:
+:CLWMR:700 mb:
+:CLWMR:70 mb:
+:CLWMR:750 mb:
+:CLWMR:800 mb:
+:CLWMR:850 mb:
+:CLWMR:900 mb:
+:CLWMR:925 mb:
+:CLWMR:950 mb:
+:CLWMR:975 mb:
+:CNWAT:surface:
+:CPOFP:surface:
+:CPRAT:surface:
+:CWAT:entire atmosphere (considered as a single layer):
+:CWORK:entire atmosphere (considered as a single layer):
+:DPT:2 m above ground:
+:DPT:30-0 mb above ground:
+:DUVB:surface:
+:FLDCP:surface:
+:FRICV:surface:
+:GFLUX:surface:
+:GUST:surface:
+:HGT:0C isotherm:
+:HGT:1 mb:
+:HGT:150 mb:
+:HGT:20 mb:
+:HGT:2 mb:
+:HGT:30 mb:
+:HGT:3 mb:
+:HGT:350 mb:
+:HGT:400 mb:
+:HGT:450 mb:
+:HGT:5 mb:
+:HGT:550 mb:
+:HGT:600 mb:
+:HGT:650 mb:
+:HGT:70 mb:
+:HGT:7 mb:
+:HGT:750 mb:
+:HGT:800 mb:
+:HGT:900 mb:
+:HGT:950 mb:
+:HGT:975 mb:
+:HGT:highest tropospheric freezing level:
+:HGT:max wind:
+:HGT:PV=-1.5e-06 (Km^2/kg/s) surface:
+:HGT:PV=1.5e-06 (Km^2/kg/s) surface:
+:HGT:PV=-1e-06 (Km^2/kg/s) surface:
+:HGT:PV=1e-06 (Km^2/kg/s) surface:
+:HGT:PV=-2e-06 (Km^2/kg/s) surface:
+:HGT:PV=2e-06 (Km^2/kg/s) surface:
+:HGT:PV=-5e-07 (Km^2/kg/s) surface:
+:HGT:PV=5e-07 (Km^2/kg/s) surface:
+:HGT:surface:
+:HGT:tropopause:
+:HINDEX:surface:
+:HLCY:3000-0 m above ground:
+:HPBL:surface:
+:ICAHT:max wind:
+:ICAHT:tropopause:
+:ICEC:surface:
+:ICIP:300 mb:
+:ICIP:400 mb:
+:ICIP:500 mb:
+:ICIP:600 mb:
+:ICIP:700 mb:
+:ICIP:800 mb:
+:ICSEV:300 mb:
+:ICSEV:400 mb:
+:ICSEV:500 mb:
+:ICSEV:600 mb:
+:ICSEV:700 mb:
+:ICSEV:800 mb:
+:LAND:surface:
+:LFTX:surface:
+:MNTSF:320 K isentropic level:
+:MSLET:mean sea level:
+:NCPCP:surface:
+:O3MR:100 mb:
+:O3MR:10 mb:
+:O3MR:125 mb:
+:O3MR:150 mb:
+:O3MR:1 mb:
+:O3MR:200 mb:
+:O3MR:20 mb:
+:O3MR:250 mb:
+:O3MR:2 mb:
+:O3MR:300 mb:
+:O3MR:30 mb:
+:O3MR:350 mb:
+:O3MR:3 mb:
+:O3MR:400 mb:
+:O3MR:50 mb:
+:O3MR:5 mb:
+:O3MR:70 mb:
+:O3MR:7 mb:
+:PEVPR:surface:
+:PLI:30-0 mb above ground:
+:PLPL:255-0 mb above ground:
+:POT:0.995 sigma level:
+:PRATE:surface:
+:PRES:80 m above ground:
+:PRES:convective cloud bottom level:
+:PRES:convective cloud top level:
+:PRES:high cloud bottom level:
+:PRES:high cloud top level:
+:PRES:low cloud bottom level:
+:PRES:low cloud top level:
+:PRES:max wind:
+:PRES:mean sea level:
+:PRES:middle cloud bottom level:
+:PRES:middle cloud top level:
+:PRES:PV=-1.5e-06 (Km^2/kg/s) surface:
+:PRES:PV=1.5e-06 (Km^2/kg/s) surface:
+:PRES:PV=-1e-06 (Km^2/kg/s) surface:
+:PRES:PV=1e-06 (Km^2/kg/s) surface:
+:PRES:PV=-2e-06 (Km^2/kg/s) surface:
+:PRES:PV=2e-06 (Km^2/kg/s) surface:
+:PRES:PV=-5e-07 (Km^2/kg/s) surface:
+:PRES:PV=5e-07 (Km^2/kg/s) surface:
+:PRES:tropopause:
+:PVORT:310 K isentropic level:
+:PVORT:320 K isentropic level:
+:PVORT:350 K isentropic level:
+:PVORT:450 K isentropic level:
+:PVORT:550 K isentropic level:
+:PVORT:650 K isentropic level:
+:PWAT:30-0 mb above ground:
+:RH:0.33-1 sigma layer:
+:RH:0.44-0.72 sigma layer:
+:RH:0.44-1 sigma layer:
+:RH:0.72-0.94 sigma layer:
+:RH:0.995 sigma level:
+:RH:0C isotherm:
+:RH:120-90 mb above ground:
+:RH:150-120 mb above ground:
+:RH:150 mb:
+:RH:180-150 mb above ground:
+:RH:20 mb:
+:RH:300 mb:
+:RH:30-0 mb above ground:
+:RH:30 mb:
+:RH:350 mb:
+:RH:400 mb:
+:RH:450 mb:
+:RH:550 mb:
+:RH:600 mb:
+:RH:60-30 mb above ground:
+:RH:650 mb:
+:RH:70 mb:
+:RH:750 mb:
+:RH:800 mb:
+:RH:900 mb:
+:RH:90-60 mb above ground:
+:RH:950 mb:
+:RH:975 mb:
+:RH:entire atmosphere (considered as a single layer):
+:RH:highest tropospheric freezing level:
+:SFCR:surface:
+:SNOWC:surface:
+:SNOHF:surface:
+:SOILL:0-0.1 m below ground:
+:SOILL:0.1-0.4 m below ground:
+:SOILL:0.4-1 m below ground:
+:SOILL:1-2 m below ground:
+:SOILW:0.1-0.4 m below ground:
+:SOILW:0.4-1 m below ground:
+:SOILW:1-2 m below ground:
+:SPFH:1000 mb:
+:SPFH:100 mb:
+:SPFH:10 mb:
+:SPFH:1 mb:
+:SPFH:120-90 mb above ground:
+:SPFH:150-120 mb above ground:
+:SPFH:150 mb:
+:SPFH:180-150 mb above ground:
+:SPFH:200 mb:
+:SPFH:20 mb:
+:SPFH:2 mb:
+:SPFH:250 mb:
+:SPFH:2 m above ground:
+:SPFH:300 mb:
+:SPFH:30-0 mb above ground:
+:SPFH:30 mb:
+:SPFH:3 mb:
+:SPFH:350 mb:
+:SPFH:400 mb:
+:SPFH:450 mb:
+:SPFH:500 mb:
+:SPFH:50 mb:
+:SPFH:5 mb:
+:SPFH:550 mb:
+:SPFH:600 mb:
+:SPFH:60-30 mb above ground:
+:SPFH:650 mb:
+:SPFH:700 mb:
+:SPFH:70 mb:
+:SPFH:7 mb:
+:SPFH:750 mb:
+:SPFH:800 mb:
+:SPFH:80 m above ground:
+:SPFH:850 mb:
+:SPFH:900 mb:
+:SPFH:90-60 mb above ground:
+:SPFH:925 mb:
+:SPFH:950 mb:
+:SPFH:975 mb:
+:SUNSD:surface:
+:TCDC:475 mb:
+:TCDC:boundary layer cloud layer:
+:TCDC:convective cloud layer:
+:TCDC:high cloud layer:
+:TCDC:low cloud layer:
+:TCDC:middle cloud layer:
+:TMP:0.995 sigma level:
+:TMP:100 m above ground:
+:TMP:1 mb:
+:TMP:120-90 mb above ground:
+:TMP:150-120 mb above ground:
+:TMP:150 mb:
+:TMP:180-150 mb above ground:
+:TMP:1829 m above mean sea level:
+:TMP:20 mb:
+:TMP:2 mb:
+:TMP:2743 m above mean sea level:
+:TMP:300 mb:
+:TMP:30-0 mb above ground:
+:TMP:305 m above mean sea level:
+:TMP:30 mb:
+:TMP:3 mb:
+:TMP:320 K isentropic level:
+:TMP:350 mb:
+:TMP:3658 m above mean sea level:
+:TMP:400 mb:
+:TMP:450 K isentropic level:
+:TMP:450 mb:
+:TMP:4572 m above mean sea level:
+:TMP:457 m above mean sea level:
+:TMP:5 mb:
+:TMP:550 K isentropic level:
+:TMP:550 mb:
+:TMP:600 mb:
+:TMP:60-30 mb above ground:
+:TMP:610 m above mean sea level:
+:TMP:650 K isentropic level:
+:TMP:650 mb:
+:TMP:70 mb:
+:TMP:7 mb:
+:TMP:750 mb:
+:TMP:800 mb:
+:TMP:80 m above ground:
+:TMP:900 mb:
+:TMP:90-60 mb above ground:
+:TMP:914 m above mean sea level:
+:TMP:950 mb:
+:TMP:975 mb:
+:TMP:high cloud top level:
+:TMP:low cloud top level:
+:TMP:max wind:
+:TMP:middle cloud top level:
+:TMP:PV=-1.5e-06 (Km^2/kg/s) surface:
+:TMP:PV=1.5e-06 (Km^2/kg/s) surface:
+:TMP:PV=-1e-06 (Km^2/kg/s) surface:
+:TMP:PV=1e-06 (Km^2/kg/s) surface:
+:TMP:PV=-2e-06 (Km^2/kg/s) surface:
+:TMP:PV=2e-06 (Km^2/kg/s) surface:
+:TMP:PV=-5e-07 (Km^2/kg/s) surface:
+:TMP:PV=5e-07 (Km^2/kg/s) surface:
+:TMP:surface:
+:TMP:tropopause:
+:TOZNE:entire atmosphere (considered as a single layer):
+:TSOIL:0.1-0.4 m below ground:
+:TSOIL:0.4-1 m below ground:
+:TSOIL:1-2 m below ground:
+:UFLX:surface:
+:UGRD:0.995 sigma level:
+:UGRD:100 m above ground:
+:UGRD:1 mb:
+:UGRD:120-90 mb above ground:
+:UGRD:150-120 mb above ground:
+:UGRD:150 mb:
+:UGRD:180-150 mb above ground:
+:UGRD:1829 m above mean sea level:
+:UGRD:20 mb:
+:UGRD:2 mb:
+:UGRD:2743 m above mean sea level:
+:UGRD:30-0 mb above ground:
+:UGRD:305 m above mean sea level:
+:UGRD:30 mb:
+:UGRD:3 mb:
+:UGRD:320 K isentropic level:
+:UGRD:350 mb:
+:UGRD:3658 m above mean sea level:
+:UGRD:450 K isentropic level:
+:UGRD:450 mb:
+:UGRD:4572 m above mean sea level:
+:UGRD:457 m above mean sea level:
+:UGRD:5 mb:
+:UGRD:550 K isentropic level:
+:UGRD:550 mb:
+:UGRD:600 mb:
+:UGRD:60-30 mb above ground:
+:UGRD:610 m above mean sea level:
+:UGRD:650 K isentropic level:
+:UGRD:650 mb:
+:UGRD:70 mb:
+:UGRD:7 mb:
+:UGRD:750 mb:
+:UGRD:800 mb:
+:UGRD:80 m above ground:
+:UGRD:900 mb:
+:UGRD:90-60 mb above ground:
+:UGRD:914 m above mean sea level:
+:UGRD:950 mb:
+:UGRD:975 mb:
+:UGRD:max wind:
+:UGRD:planetary boundary layer:
+:UGRD:PV=-1.5e-06 (Km^2/kg/s) surface:
+:UGRD:PV=1.5e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-1e-06 (Km^2/kg/s) surface:
+:UGRD:PV=1e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-2e-06 (Km^2/kg/s) surface:
+:UGRD:PV=2e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-5e-07 (Km^2/kg/s) surface:
+:UGRD:PV=5e-07 (Km^2/kg/s) surface:
+:UGRD:tropopause:
+:U-GWD:surface:
+:USTM:6000-0 m above ground:
+:USWRF:top of atmosphere:
+:APTMP:2 m above ground
+:VFLX:surface:
+:VGRD:0.995 sigma level:
+:VGRD:100 m above ground:
+:VGRD:1 mb:
+:VGRD:120-90 mb above ground:
+:VGRD:150-120 mb above ground:
+:VGRD:150 mb:
+:VGRD:180-150 mb above ground:
+:VGRD:1829 m above mean sea level:
+:VGRD:20 mb:
+:VGRD:2 mb:
+:VGRD:2743 m above mean sea level:
+:VGRD:30-0 mb above ground:
+:VGRD:305 m above mean sea level:
+:VGRD:30 mb:
+:VGRD:3 mb:
+:VGRD:320 K isentropic level:
+:VGRD:350 mb:
+:VGRD:3658 m above mean sea level:
+:VGRD:450 K isentropic level:
+:VGRD:450 mb:
+:VGRD:4572 m above mean sea level:
+:VGRD:457 m above mean sea level:
+:VGRD:5 mb:
+:VGRD:550 K isentropic level:
+:VGRD:550 mb:
+:VGRD:600 mb:
+:VGRD:60-30 mb above ground:
+:VGRD:610 m above mean sea level:
+:VGRD:650 K isentropic level:
+:VGRD:650 mb:
+:VGRD:70 mb:
+:VGRD:7 mb:
+:VGRD:750 mb:
+:VGRD:800 mb:
+:VGRD:80 m above ground:
+:VGRD:900 mb:
+:VGRD:90-60 mb above ground:
+:VGRD:914 m above mean sea level:
+:VGRD:950 mb:
+:VGRD:975 mb:
+:VGRD:max wind:
+:VGRD:planetary boundary layer:
+:VGRD:PV=-1.5e-06 (Km^2/kg/s) surface:
+:VGRD:PV=1.5e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-1e-06 (Km^2/kg/s) surface:
+:VGRD:PV=1e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-2e-06 (Km^2/kg/s) surface:
+:VGRD:PV=2e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-5e-07 (Km^2/kg/s) surface:
+:VGRD:PV=5e-07 (Km^2/kg/s) surface:
+:VGRD:tropopause:
+:V-GWD:surface:
+:VIS:surface:
+:VRATE:planetary boundary layer:
+:VSTM:6000-0 m above ground:
+:VVEL:0.995 sigma level:
+:VVEL:1 mb:
+:VVEL:2 mb:
+:VVEL:3 mb:
+:VVEL:5 mb:
+:VVEL:7 mb:
+:VVEL:10 mb:
+:VVEL:20 mb:
+:VVEL:30 mb:
+:VVEL:50 mb:
+:VVEL:70 mb:
+:VVEL:1000 mb:
+:VVEL:100 mb:
+:VVEL:150 mb:
+:VVEL:200 mb:
+:VVEL:250 mb:
+:VVEL:300 mb:
+:VVEL:350 mb:
+:VVEL:400 mb:
+:VVEL:450 mb:
+:VVEL:500 mb:
+:VVEL:550 mb:
+:VVEL:600 mb:
+:VVEL:650 mb:
+:VVEL:700 mb:
+:VVEL:750 mb:
+:VVEL:800 mb:
+:VVEL:900 mb:
+:VVEL:925 mb:
+:VVEL:950 mb:
+:VVEL:975 mb:
+:VWSH:PV=-1.5e-06 (Km^2/kg/s) surface:
+:VWSH:PV=1.5e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-1e-06 (Km^2/kg/s) surface:
+:VWSH:PV=1e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-2e-06 (Km^2/kg/s) surface:
+:VWSH:PV=2e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-5e-07 (Km^2/kg/s) surface:
+:VWSH:PV=5e-07 (Km^2/kg/s) surface:
+:VWSH:tropopause:
+:WATR:surface:
+:WILT:surface:
+:HGT:cloud ceiling:
+:PRES:1 hybrid level:
+:HGT:1 hybrid level:
+:TMP:1 hybrid level:
+:RH:1 hybrid level:
+:UGRD:1 hybrid level:
+:VGRD:1 hybrid level:
+:PRES:2 hybrid level:
+:HGT:2 hybrid level:
+:TMP:2 hybrid level:
+:RH:2 hybrid level:
+:UGRD:2 hybrid level:
+:VGRD:2 hybrid level:
+:PRES:3 hybrid level:
+:HGT:3 hybrid level:
+:TMP:3 hybrid level:
+:RH:3 hybrid level:
+:UGRD:3 hybrid level:
+:VGRD:3 hybrid level:
+:PRES:4 hybrid level:
+:HGT:4 hybrid level:
+:TMP:4 hybrid level:
+:RH:4 hybrid level:
+:UGRD:4 hybrid level:
+:VGRD:4 hybrid level:
diff --git a/parm/product/gefs.1p00.f000.paramlist.a.txt b/parm/product/gefs.1p00.f000.paramlist.a.txt
new file mode 120000
index 0000000000..69265297d3
--- /dev/null
+++ b/parm/product/gefs.1p00.f000.paramlist.a.txt
@@ -0,0 +1 @@
+gefs.0p50.f000.paramlist.a.txt
\ No newline at end of file
diff --git a/parm/product/gefs.1p00.f000.paramlist.b.txt b/parm/product/gefs.1p00.f000.paramlist.b.txt
new file mode 120000
index 0000000000..a51f2079e2
--- /dev/null
+++ b/parm/product/gefs.1p00.f000.paramlist.b.txt
@@ -0,0 +1 @@
+gefs.0p50.f000.paramlist.b.txt
\ No newline at end of file
diff --git a/parm/product/gefs.1p00.fFFF.paramlist.a.txt b/parm/product/gefs.1p00.fFFF.paramlist.a.txt
new file mode 120000
index 0000000000..c131b24c02
--- /dev/null
+++ b/parm/product/gefs.1p00.fFFF.paramlist.a.txt
@@ -0,0 +1 @@
+gefs.0p50.fFFF.paramlist.a.txt
\ No newline at end of file
diff --git a/parm/product/gefs.1p00.fFFF.paramlist.b.txt b/parm/product/gefs.1p00.fFFF.paramlist.b.txt
new file mode 120000
index 0000000000..0f2fb179cb
--- /dev/null
+++ b/parm/product/gefs.1p00.fFFF.paramlist.b.txt
@@ -0,0 +1 @@
+gefs.0p50.fFFF.paramlist.b.txt
\ No newline at end of file
diff --git a/parm/product/gefs.2p50.f000.paramlist.a.txt b/parm/product/gefs.2p50.f000.paramlist.a.txt
new file mode 100644
index 0000000000..4d2219ce8c
--- /dev/null
+++ b/parm/product/gefs.2p50.f000.paramlist.a.txt
@@ -0,0 +1,23 @@
+############################# sorted pgrb2a 201408
+:HGT:surface:
+:HGT:1000 mb:
+:HGT:500 mb:
+:PRMSL:mean sea level:
+:RH:700 mb:
+:TMP:2 m above ground:
+:TMP:850 mb:
+:UGRD:10 m above ground:
+:UGRD:200 mb:
+:UGRD:250 mb:
+:UGRD:850 mb:
+:VGRD:10 m above ground:
+:VGRD:200 mb:
+:VGRD:250 mb:
+:VGRD:850 mb:
+:APCP:surface
+:CSNOW:surface
+:CRAIN:surface
+:CICEP:surface
+:CFRZR:surface
+:ULWRF:top
+;############################ do not leave a blank line at the end
diff --git a/parm/product/gefs.2p50.f000.paramlist.b.txt b/parm/product/gefs.2p50.f000.paramlist.b.txt
new file mode 100644
index 0000000000..f2610c5f77
--- /dev/null
+++ b/parm/product/gefs.2p50.f000.paramlist.b.txt
@@ -0,0 +1,530 @@
+############################# sorted pgrb2a + pgrb2b 201502
+:4LFTX:surface:
+:5WAVH:500 mb:
+:ABSV:1000 mb:
+:ABSV:100 mb:
+:ABSV:10 mb:
+:ABSV:150 mb:
+:ABSV:200 mb:
+:ABSV:20 mb:
+:ABSV:250 mb:
+:ABSV:300 mb:
+:ABSV:30 mb:
+:ABSV:350 mb:
+:ABSV:400 mb:
+:ABSV:450 mb:
+:ABSV:500 mb:
+:ABSV:50 mb:
+:ABSV:550 mb:
+:ABSV:600 mb:
+:ABSV:650 mb:
+:ABSV:700 mb:
+:ABSV:70 mb:
+:ABSV:750 mb:
+:ABSV:800 mb:
+:ABSV:850 mb:
+:ABSV:900 mb:
+:ABSV:925 mb:
+:ABSV:950 mb:
+:ABSV:975 mb:
+:BRTMP:top of atmosphere:
+:CAPE:180-0 mb above ground:
+:CAPE:255-0 mb above ground:
+:CAPE:surface:
+:CIN:180-0 mb above ground:
+:CIN:255-0 mb above ground:
+:CIN:surface:
+:CLWMR:1000 mb:
+:CLWMR:100 mb:
+:CLWMR:10 mb:
+:CLWMR:150 mb:
+:CLWMR:200 mb:
+:CLWMR:20 mb:
+:CLWMR:250 mb:
+:CLWMR:300 mb:
+:CLWMR:30 mb:
+:CLWMR:350 mb:
+:CLWMR:400 mb:
+:CLWMR:450 mb:
+:CLWMR:500 mb:
+:CLWMR:50 mb:
+:CLWMR:550 mb:
+:CLWMR:600 mb:
+:CLWMR:650 mb:
+:CLWMR:700 mb:
+:CLWMR:70 mb:
+:CLWMR:750 mb:
+:CLWMR:800 mb:
+:CLWMR:850 mb:
+:CLWMR:900 mb:
+:CLWMR:925 mb:
+:CLWMR:950 mb:
+:CLWMR:975 mb:
+:CNWAT:surface:
+:CPOFP:surface:
+:CWAT:entire atmosphere (considered as a single layer):
+:DPT:2 m above ground:
+:DPT:30-0 mb above ground:
+:FLDCP:surface:
+:FRICV:surface:
+:GUST:surface:
+:HGT:0C isotherm:
+:HGT:100 mb:
+:HGT:10 mb:
+:HGT:1 mb:
+:HGT:150 mb:
+:HGT:200 mb:
+:HGT:20 mb:
+:HGT:2 mb:
+:HGT:250 mb:
+:HGT:300 mb:
+:HGT:30 mb:
+:HGT:3 mb:
+:HGT:350 mb:
+:HGT:400 mb:
+:HGT:450 mb:
+:HGT:50 mb:
+:HGT:5 mb:
+:HGT:550 mb:
+:HGT:600 mb:
+:HGT:650 mb:
+:HGT:700 mb:
+:HGT:70 mb:
+:HGT:7 mb:
+:HGT:750 mb:
+:HGT:800 mb:
+:HGT:850 mb:
+:HGT:900 mb:
+:HGT:925 mb:
+:HGT:950 mb:
+:HGT:975 mb:
+:HGT:highest tropospheric freezing level:
+:HGT:max wind:
+:HGT:PV=-1.5e-06 (Km^2/kg/s) surface:
+:HGT:PV=1.5e-06 (Km^2/kg/s) surface:
+:HGT:PV=-1e-06 (Km^2/kg/s) surface:
+:HGT:PV=1e-06 (Km^2/kg/s) surface:
+:HGT:PV=-2e-06 (Km^2/kg/s) surface:
+:HGT:PV=2e-06 (Km^2/kg/s) surface:
+:HGT:PV=-5e-07 (Km^2/kg/s) surface:
+:HGT:PV=5e-07 (Km^2/kg/s) surface:
+:HGT:tropopause:
+:HINDEX:surface:
+:HLCY:3000-0 m above ground:
+:HPBL:surface:
+:ICAHT:max wind:
+:ICAHT:tropopause:
+:ICEC:surface:
+:ICETK:surface:
+:ICIP:300 mb:
+:ICIP:400 mb:
+:ICIP:500 mb:
+:ICIP:600 mb:
+:ICIP:700 mb:
+:ICIP:800 mb:
+:ICSEV:300 mb:
+:ICSEV:400 mb:
+:ICSEV:500 mb:
+:ICSEV:600 mb:
+:ICSEV:700 mb:
+:ICSEV:800 mb:
+:LAND:surface:
+:LFTX:surface:
+:MNTSF:320 K isentropic level:
+:MSLET:mean sea level:
+:O3MR:100 mb:
+:O3MR:10 mb:
+:O3MR:125 mb:
+:O3MR:150 mb:
+:O3MR:1 mb:
+:O3MR:200 mb:
+:O3MR:20 mb:
+:O3MR:250 mb:
+:O3MR:2 mb:
+:O3MR:300 mb:
+:O3MR:30 mb:
+:O3MR:350 mb:
+:O3MR:3 mb:
+:O3MR:400 mb:
+:O3MR:50 mb:
+:O3MR:5 mb:
+:O3MR:70 mb:
+:O3MR:7 mb:
+:PEVPR:surface:
+:PLI:30-0 mb above ground:
+:PLPL:255-0 mb above ground:
+:POT:0.995 sigma level:
+:PRES:80 m above ground:
+:PRES:max wind:
+:PRES:mean sea level:
+:PRES:PV=-1.5e-06 (Km^2/kg/s) surface:
+:PRES:PV=1.5e-06 (Km^2/kg/s) surface:
+:PRES:PV=-1e-06 (Km^2/kg/s) surface:
+:PRES:PV=1e-06 (Km^2/kg/s) surface:
+:PRES:PV=-2e-06 (Km^2/kg/s) surface:
+:PRES:PV=2e-06 (Km^2/kg/s) surface:
+:PRES:PV=-5e-07 (Km^2/kg/s) surface:
+:PRES:PV=5e-07 (Km^2/kg/s) surface:
+:PRES:surface:
+:PRES:tropopause:
+:PVORT:310 K isentropic level:
+:PVORT:320 K isentropic level:
+:PVORT:350 K isentropic level:
+:PVORT:450 K isentropic level:
+:PVORT:550 K isentropic level:
+:PVORT:650 K isentropic level:
+:PWAT:30-0 mb above ground:
+:PWAT:entire atmosphere (considered as a single layer):
+:RH:0.33-1 sigma layer:
+:RH:0.44-0.72 sigma layer:
+:RH:0.44-1 sigma layer:
+:RH:0.72-0.94 sigma layer:
+:RH:0.995 sigma level:
+:RH:0C isotherm:
+:RH:1000 mb:
+:RH:100 mb:
+:RH:10 mb:
+:RH:120-90 mb above ground:
+:RH:150-120 mb above ground:
+:RH:150 mb:
+:RH:180-150 mb above ground:
+:RH:200 mb:
+:RH:20 mb:
+:RH:250 mb:
+:RH:2 m above ground:
+:RH:300 mb:
+:RH:30-0 mb above ground:
+:RH:30 mb:
+:RH:350 mb:
+:RH:400 mb:
+:RH:450 mb:
+:RH:500 mb:
+:RH:50 mb:
+:RH:550 mb:
+:RH:600 mb:
+:RH:60-30 mb above ground:
+:RH:650 mb:
+:RH:70 mb:
+:RH:750 mb:
+:RH:800 mb:
+:RH:850 mb:
+:RH:900 mb:
+:RH:90-60 mb above ground:
+:RH:925 mb:
+:RH:950 mb:
+:RH:975 mb:
+:RH:entire atmosphere (considered as a single layer):
+:RH:highest tropospheric freezing level:
+:SFCR:surface:
+:SNOD:surface:
+:SNOHF:surface:
+:SNOWC:surface:
+:SOILL:0-0.1 m below ground:
+:SOILL:0.1-0.4 m below ground:
+:SOILL:0.4-1 m below ground:
+:SOILL:1-2 m below ground:
+:SOILW:0-0.1 m below ground:
+:SOILW:0.1-0.4 m below ground:
+:SOILW:0.4-1 m below ground:
+:SOILW:1-2 m below ground:
+:SPFH:1000 mb:
+:SPFH:100 mb:
+:SPFH:10 mb:
+:SPFH:1 mb:
+:SPFH:120-90 mb above ground:
+:SPFH:150-120 mb above ground:
+:SPFH:150 mb:
+:SPFH:180-150 mb above ground:
+:SPFH:200 mb:
+:SPFH:20 mb:
+:SPFH:2 mb:
+:SPFH:250 mb:
+:SPFH:2 m above ground:
+:SPFH:300 mb:
+:SPFH:30-0 mb above ground:
+:SPFH:30 mb:
+:SPFH:3 mb:
+:SPFH:350 mb:
+:SPFH:400 mb:
+:SPFH:450 mb:
+:SPFH:500 mb:
+:SPFH:50 mb:
+:SPFH:5 mb:
+:SPFH:550 mb:
+:SPFH:600 mb:
+:SPFH:60-30 mb above ground:
+:SPFH:650 mb:
+:SPFH:700 mb:
+:SPFH:70 mb:
+:SPFH:7 mb:
+:SPFH:750 mb:
+:SPFH:800 mb:
+:SPFH:80 m above ground:
+:SPFH:850 mb:
+:SPFH:900 mb:
+:SPFH:90-60 mb above ground:
+:SPFH:925 mb:
+:SPFH:950 mb:
+:SPFH:975 mb:
+:SUNSD:surface:
+:TCDC:475 mb:
+:TMP:0.995 sigma level:
+:TMP:1000 mb:
+:TMP:100 m above ground:
+:TMP:100 mb:
+:TMP:10 mb:
+:TMP:1 mb:
+:TMP:120-90 mb above ground:
+:TMP:150-120 mb above ground:
+:TMP:150 mb:
+:TMP:180-150 mb above ground:
+:TMP:1829 m above mean sea level:
+:TMP:200 mb:
+:TMP:20 mb:
+:TMP:2 mb:
+:TMP:250 mb:
+:TMP:2743 m above mean sea level:
+:TMP:300 mb:
+:TMP:30-0 mb above ground:
+:TMP:305 m above mean sea level:
+:TMP:30 mb:
+:TMP:3 mb:
+:TMP:320 K isentropic level:
+:TMP:350 mb:
+:TMP:3658 m above mean sea level:
+:TMP:400 mb:
+:TMP:450 mb:
+:TMP:450 K isentropic level:
+:TMP:4572 m above mean sea level:
+:TMP:457 m above mean sea level:
+:TMP:500 mb:
+:TMP:50 mb:
+:TMP:5 mb:
+:TMP:550 mb:
+:TMP:550 K isentropic level:
+:TMP:600 mb:
+:TMP:60-30 mb above ground:
+:TMP:610 m above mean sea level:
+:TMP:650 mb:
+:TMP:650 K isentropic level:
+:TMP:700 mb:
+:TMP:70 mb:
+:TMP:7 mb:
+:TMP:750 mb:
+:TMP:800 mb:
+:TMP:80 m above ground:
+:TMP:900 mb:
+:TMP:90-60 mb above ground:
+:TMP:914 m above mean sea level:
+:TMP:925 mb:
+:TMP:950 mb:
+:TMP:975 mb:
+:TMP:max wind:
+:TMP:PV=-1.5e-06 (Km^2/kg/s) surface:
+:TMP:PV=1.5e-06 (Km^2/kg/s) surface:
+:TMP:PV=-1e-06 (Km^2/kg/s) surface:
+:TMP:PV=1e-06 (Km^2/kg/s) surface:
+:TMP:PV=-2e-06 (Km^2/kg/s) surface:
+:TMP:PV=2e-06 (Km^2/kg/s) surface:
+:TMP:PV=-5e-07 (Km^2/kg/s) surface:
+:TMP:PV=5e-07 (Km^2/kg/s) surface:
+:TMP:surface:
+:TMP:tropopause:
+:TOZNE:entire atmosphere (considered as a single layer):
+:TSOIL:0-0.1 m below ground:
+:TSOIL:0.1-0.4 m below ground:
+:TSOIL:0.4-1 m below ground:
+:TSOIL:1-2 m below ground:
+:UGRD:0.995 sigma level:
+:UGRD:1000 mb:
+:UGRD:100 m above ground:
+:UGRD:100 mb:
+:UGRD:10 mb:
+:UGRD:1 mb:
+:UGRD:120-90 mb above ground:
+:UGRD:150-120 mb above ground:
+:UGRD:150 mb:
+:UGRD:180-150 mb above ground:
+:UGRD:1829 m above mean sea level:
+:UGRD:20 mb:
+:UGRD:2 mb:
+:UGRD:2743 m above mean sea level:
+:UGRD:300 mb:
+:UGRD:30-0 mb above ground:
+:UGRD:305 m above mean sea level:
+:UGRD:30 mb:
+:UGRD:3 mb:
+:UGRD:320 K isentropic level:
+:UGRD:350 mb:
+:UGRD:3658 m above mean sea level:
+:UGRD:400 mb:
+:UGRD:450 mb:
+:UGRD:450 K isentropic level:
+:UGRD:4572 m above mean sea level:
+:UGRD:457 m above mean sea level:
+:UGRD:500 mb:
+:UGRD:50 mb:
+:UGRD:5 mb:
+:UGRD:550 mb:
+:UGRD:550 K isentropic level:
+:UGRD:600 mb:
+:UGRD:60-30 mb above ground:
+:UGRD:610 m above mean sea level:
+:UGRD:650 mb:
+:UGRD:650 K isentropic level:
+:UGRD:700 mb:
+:UGRD:70 mb:
+:UGRD:7 mb:
+:UGRD:750 mb:
+:UGRD:800 mb:
+:UGRD:80 m above ground:
+:UGRD:900 mb:
+:UGRD:90-60 mb above ground:
+:UGRD:914 m above mean sea level:
+:UGRD:925 mb:
+:UGRD:950 mb:
+:UGRD:975 mb:
+:UGRD:max wind:
+:UGRD:planetary boundary layer:
+:UGRD:PV=-1.5e-06 (Km^2/kg/s) surface:
+:UGRD:PV=1.5e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-1e-06 (Km^2/kg/s) surface:
+:UGRD:PV=1e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-2e-06 (Km^2/kg/s) surface:
+:UGRD:PV=2e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-5e-07 (Km^2/kg/s) surface:
+:UGRD:PV=5e-07 (Km^2/kg/s) surface:
+:UGRD:tropopause:
+:USTM:6000-0 m above ground:
+:APTMP:2 m above ground:
+:VGRD:0.995 sigma level:
+:VGRD:1000 mb:
+:VGRD:100 m above ground:
+:VGRD:100 mb:
+:VGRD:10 mb:
+:VGRD:1 mb:
+:VGRD:120-90 mb above ground:
+:VGRD:150-120 mb above ground:
+:VGRD:150 mb:
+:VGRD:180-150 mb above ground:
+:VGRD:1829 m above mean sea level:
+:VGRD:20 mb:
+:VGRD:2 mb:
+:VGRD:2743 m above mean sea level:
+:VGRD:300 mb:
+:VGRD:30-0 mb above ground:
+:VGRD:305 m above mean sea level:
+:VGRD:30 mb:
+:VGRD:3 mb:
+:VGRD:320 K isentropic level:
+:VGRD:350 mb:
+:VGRD:3658 m above mean sea level:
+:VGRD:400 mb:
+:VGRD:450 mb:
+:VGRD:450 K isentropic level:
+:VGRD:4572 m above mean sea level:
+:VGRD:457 m above mean sea level:
+:VGRD:500 mb:
+:VGRD:50 mb:
+:VGRD:5 mb:
+:VGRD:550 mb:
+:VGRD:550 K isentropic level:
+:VGRD:600 mb:
+:VGRD:60-30 mb above ground:
+:VGRD:610 m above mean sea level:
+:VGRD:650 mb:
+:VGRD:650 K isentropic level:
+:VGRD:700 mb:
+:VGRD:70 mb:
+:VGRD:7 mb:
+:VGRD:750 mb:
+:VGRD:800 mb:
+:VGRD:80 m above ground:
+:VGRD:900 mb:
+:VGRD:90-60 mb above ground:
+:VGRD:914 m above mean sea level:
+:VGRD:925 mb:
+:VGRD:950 mb:
+:VGRD:975 mb:
+:VGRD:max wind:
+:VGRD:planetary boundary layer:
+:VGRD:PV=-1.5e-06 (Km^2/kg/s) surface:
+:VGRD:PV=1.5e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-1e-06 (Km^2/kg/s) surface:
+:VGRD:PV=1e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-2e-06 (Km^2/kg/s) surface:
+:VGRD:PV=2e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-5e-07 (Km^2/kg/s) surface:
+:VGRD:PV=5e-07 (Km^2/kg/s) surface:
+:VGRD:tropopause:
+:VIS:surface:
+:VRATE:planetary boundary layer:
+:VSTM:6000-0 m above ground:
+:VVEL:0.995 sigma level:
+:VVEL:1 mb:
+:VVEL:2 mb:
+:VVEL:3 mb:
+:VVEL:5 mb:
+:VVEL:7 mb:
+:VVEL:10 mb:
+:VVEL:20 mb:
+:VVEL:30 mb:
+:VVEL:50 mb:
+:VVEL:70 mb:
+:VVEL:1000 mb:
+:VVEL:100 mb:
+:VVEL:150 mb:
+:VVEL:200 mb:
+:VVEL:250 mb:
+:VVEL:300 mb:
+:VVEL:350 mb:
+:VVEL:400 mb:
+:VVEL:450 mb:
+:VVEL:500 mb:
+:VVEL:550 mb:
+:VVEL:600 mb:
+:VVEL:650 mb:
+:VVEL:700 mb:
+:VVEL:750 mb:
+:VVEL:800 mb:
+:VVEL:850 mb:
+:VVEL:900 mb:
+:VVEL:925 mb:
+:VVEL:950 mb:
+:VVEL:975 mb:
+:VWSH:PV=-1.5e-06 (Km^2/kg/s) surface:
+:VWSH:PV=1.5e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-1e-06 (Km^2/kg/s) surface:
+:VWSH:PV=1e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-2e-06 (Km^2/kg/s) surface:
+:VWSH:PV=2e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-5e-07 (Km^2/kg/s) surface:
+:VWSH:PV=5e-07 (Km^2/kg/s) surface:
+:VWSH:tropopause:
+:WEASD:surface:
+:WILT:surface:
+:HGT:cloud ceiling:
+:PRES:1 hybrid level:
+:HGT:1 hybrid level:
+:TMP:1 hybrid level:
+:RH:1 hybrid level:
+:UGRD:1 hybrid level:
+:VGRD:1 hybrid level:
+:PRES:2 hybrid level:
+:HGT:2 hybrid level:
+:TMP:2 hybrid level:
+:RH:2 hybrid level:
+:UGRD:2 hybrid level:
+:VGRD:2 hybrid level:
+:PRES:3 hybrid level:
+:HGT:3 hybrid level:
+:TMP:3 hybrid level:
+:RH:3 hybrid level:
+:UGRD:3 hybrid level:
+:VGRD:3 hybrid level:
+:PRES:4 hybrid level:
+:HGT:4 hybrid level:
+:TMP:4 hybrid level:
+:RH:4 hybrid level:
+:UGRD:4 hybrid level:
+:VGRD:4 hybrid level:
diff --git a/parm/product/gefs.2p50.fFFF.paramlist.a.txt b/parm/product/gefs.2p50.fFFF.paramlist.a.txt
new file mode 100644
index 0000000000..11b6a8aef3
--- /dev/null
+++ b/parm/product/gefs.2p50.fFFF.paramlist.a.txt
@@ -0,0 +1,22 @@
+############################# sorted pgrb2a 201408
+:HGT:1000 mb:
+:HGT:500 mb:
+:PRMSL:mean sea level:
+:RH:700 mb:
+:TMP:2 m above ground:
+:TMP:850 mb:
+:UGRD:10 m above ground:
+:UGRD:200 mb:
+:UGRD:250 mb:
+:UGRD:850 mb:
+:VGRD:10 m above ground:
+:VGRD:200 mb:
+:VGRD:250 mb:
+:VGRD:850 mb:
+:APCP:surface
+:CSNOW:surface
+:CRAIN:surface
+:CICEP:surface
+:CFRZR:surface
+:ULWRF:top
+;############################ do not leave a blank line at the end
diff --git a/parm/product/gefs.2p50.fFFF.paramlist.b.txt b/parm/product/gefs.2p50.fFFF.paramlist.b.txt
new file mode 100644
index 0000000000..8c05d49271
--- /dev/null
+++ b/parm/product/gefs.2p50.fFFF.paramlist.b.txt
@@ -0,0 +1,571 @@
+############################# sorted pgrb2a + pgrb2b 201502
+:4LFTX:surface:
+:5WAVH:500 mb:
+:ABSV:1000 mb:
+:ABSV:100 mb:
+:ABSV:10 mb:
+:ABSV:150 mb:
+:ABSV:200 mb:
+:ABSV:20 mb:
+:ABSV:250 mb:
+:ABSV:300 mb:
+:ABSV:30 mb:
+:ABSV:350 mb:
+:ABSV:400 mb:
+:ABSV:450 mb:
+:ABSV:500 mb:
+:ABSV:50 mb:
+:ABSV:550 mb:
+:ABSV:600 mb:
+:ABSV:650 mb:
+:ABSV:700 mb:
+:ABSV:70 mb:
+:ABSV:750 mb:
+:ABSV:800 mb:
+:ABSV:850 mb:
+:ABSV:900 mb:
+:ABSV:925 mb:
+:ABSV:950 mb:
+:ABSV:975 mb:
+:ACPCP:surface:
+:ALBDO:surface:
+:BRTMP:top of atmosphere:
+:CAPE:180-0 mb above ground:
+:CAPE:255-0 mb above ground:
+:CAPE:surface:
+:CDUVB:surface:
+:CIN:180-0 mb above ground:
+:CIN:255-0 mb above ground:
+:CIN:surface:
+:CLWMR:1000 mb:
+:CLWMR:100 mb:
+:CLWMR:10 mb:
+:CLWMR:150 mb:
+:CLWMR:200 mb:
+:CLWMR:20 mb:
+:CLWMR:250 mb:
+:CLWMR:300 mb:
+:CLWMR:30 mb:
+:CLWMR:350 mb:
+:CLWMR:400 mb:
+:CLWMR:450 mb:
+:CLWMR:500 mb:
+:CLWMR:50 mb:
+:CLWMR:550 mb:
+:CLWMR:600 mb:
+:CLWMR:650 mb:
+:CLWMR:700 mb:
+:CLWMR:70 mb:
+:CLWMR:750 mb:
+:CLWMR:800 mb:
+:CLWMR:850 mb:
+:CLWMR:900 mb:
+:CLWMR:925 mb:
+:CLWMR:950 mb:
+:CLWMR:975 mb:
+:CNWAT:surface:
+:CPOFP:surface:
+:CPRAT:surface:
+:CWAT:entire atmosphere (considered as a single layer):
+:CWORK:entire atmosphere (considered as a single layer):
+:DLWRF:surface:
+:DPT:2 m above ground:
+:DPT:30-0 mb above ground:
+:DSWRF:surface:
+:DUVB:surface:
+:FLDCP:surface:
+:FRICV:surface:
+:GFLUX:surface:
+:GUST:surface:
+:HGT:0C isotherm:
+:HGT:100 mb:
+:HGT:10 mb:
+:HGT:1 mb:
+:HGT:150 mb:
+:HGT:200 mb:
+:HGT:20 mb:
+:HGT:2 mb:
+:HGT:250 mb:
+:HGT:300 mb:
+:HGT:30 mb:
+:HGT:3 mb:
+:HGT:350 mb:
+:HGT:400 mb:
+:HGT:450 mb:
+:HGT:50 mb:
+:HGT:5 mb:
+:HGT:550 mb:
+:HGT:600 mb:
+:HGT:650 mb:
+:HGT:700 mb:
+:HGT:70 mb:
+:HGT:7 mb:
+:HGT:750 mb:
+:HGT:800 mb:
+:HGT:850 mb:
+:HGT:900 mb:
+:HGT:925 mb:
+:HGT:950 mb:
+:HGT:975 mb:
+:HGT:highest tropospheric freezing level:
+:HGT:max wind:
+:HGT:PV=-1.5e-06 (Km^2/kg/s) surface:
+:HGT:PV=1.5e-06 (Km^2/kg/s) surface:
+:HGT:PV=-1e-06 (Km^2/kg/s) surface:
+:HGT:PV=1e-06 (Km^2/kg/s) surface:
+:HGT:PV=-2e-06 (Km^2/kg/s) surface:
+:HGT:PV=2e-06 (Km^2/kg/s) surface:
+:HGT:PV=-5e-07 (Km^2/kg/s) surface:
+:HGT:PV=5e-07 (Km^2/kg/s) surface:
+:HGT:surface:
+:HGT:tropopause:
+:HINDEX:surface:
+:HLCY:3000-0 m above ground:
+:HPBL:surface:
+:ICAHT:max wind:
+:ICAHT:tropopause:
+:ICEC:surface:
+:ICETK:surface:
+:ICIP:300 mb:
+:ICIP:400 mb:
+:ICIP:500 mb:
+:ICIP:600 mb:
+:ICIP:700 mb:
+:ICIP:800 mb:
+:ICSEV:300 mb:
+:ICSEV:400 mb:
+:ICSEV:500 mb:
+:ICSEV:600 mb:
+:ICSEV:700 mb:
+:ICSEV:800 mb:
+:LAND:surface:
+:LFTX:surface:
+:LHTFL:surface:
+:MNTSF:320 K isentropic level:
+:MSLET:mean sea level:
+:NCPCP:surface:
+:O3MR:100 mb:
+:O3MR:10 mb:
+:O3MR:125 mb:
+:O3MR:150 mb:
+:O3MR:1 mb:
+:O3MR:200 mb:
+:O3MR:20 mb:
+:O3MR:250 mb:
+:O3MR:2 mb:
+:O3MR:300 mb:
+:O3MR:30 mb:
+:O3MR:350 mb:
+:O3MR:3 mb:
+:O3MR:400 mb:
+:O3MR:50 mb:
+:O3MR:5 mb:
+:O3MR:70 mb:
+:O3MR:7 mb:
+:PEVPR:surface:
+:PLI:30-0 mb above ground:
+:PLPL:255-0 mb above ground:
+:POT:0.995 sigma level:
+:PRATE:surface:
+:PRES:80 m above ground:
+:PRES:convective cloud bottom level:
+:PRES:convective cloud top level:
+:PRES:high cloud bottom level:
+:PRES:high cloud top level:
+:PRES:low cloud bottom level:
+:PRES:low cloud top level:
+:PRES:max wind:
+:PRES:mean sea level:
+:PRES:middle cloud bottom level:
+:PRES:middle cloud top level:
+:PRES:PV=-1.5e-06 (Km^2/kg/s) surface:
+:PRES:PV=1.5e-06 (Km^2/kg/s) surface:
+:PRES:PV=-1e-06 (Km^2/kg/s) surface:
+:PRES:PV=1e-06 (Km^2/kg/s) surface:
+:PRES:PV=-2e-06 (Km^2/kg/s) surface:
+:PRES:PV=2e-06 (Km^2/kg/s) surface:
+:PRES:PV=-5e-07 (Km^2/kg/s) surface:
+:PRES:PV=5e-07 (Km^2/kg/s) surface:
+:PRES:surface:
+:PRES:tropopause:
+:PVORT:310 K isentropic level:
+:PVORT:320 K isentropic level:
+:PVORT:350 K isentropic level:
+:PVORT:450 K isentropic level:
+:PVORT:550 K isentropic level:
+:PVORT:650 K isentropic level:
+:PWAT:30-0 mb above ground:
+:PWAT:entire atmosphere (considered as a single layer):
+:RH:0.33-1 sigma layer:
+:RH:0.44-0.72 sigma layer:
+:RH:0.44-1 sigma layer:
+:RH:0.72-0.94 sigma layer:
+:RH:0.995 sigma level:
+:RH:0C isotherm:
+:RH:1000 mb:
+:RH:100 mb:
+:RH:10 mb:
+:RH:120-90 mb above ground:
+:RH:150-120 mb above ground:
+:RH:150 mb:
+:RH:180-150 mb above ground:
+:RH:200 mb:
+:RH:20 mb:
+:RH:250 mb:
+:RH:2 m above ground:
+:RH:300 mb:
+:RH:30-0 mb above ground:
+:RH:30 mb:
+:RH:350 mb:
+:RH:400 mb:
+:RH:450 mb:
+:RH:500 mb:
+:RH:50 mb:
+:RH:550 mb:
+:RH:600 mb:
+:RH:60-30 mb above ground:
+:RH:650 mb:
+:RH:70 mb:
+:RH:750 mb:
+:RH:800 mb:
+:RH:850 mb:
+:RH:900 mb:
+:RH:90-60 mb above ground:
+:RH:925 mb:
+:RH:950 mb:
+:RH:975 mb:
+:RH:entire atmosphere (considered as a single layer):
+:RH:highest tropospheric freezing level:
+:SFCR:surface:
+:SHTFL:surface:
+:SNOD:surface:
+:SNOWC:surface:
+:SNOHF:surface:
+:SOILL:0-0.1 m below ground:
+:SOILL:0.1-0.4 m below ground:
+:SOILL:0.4-1 m below ground:
+:SOILL:1-2 m below ground:
+:SOILW:0-0.1 m below ground:
+:SOILW:0.1-0.4 m below ground:
+:SOILW:0.4-1 m below ground:
+:SOILW:1-2 m below ground:
+:SPFH:1000 mb:
+:SPFH:100 mb:
+:SPFH:10 mb:
+:SPFH:1 mb:
+:SPFH:120-90 mb above ground:
+:SPFH:150-120 mb above ground:
+:SPFH:150 mb:
+:SPFH:180-150 mb above ground:
+:SPFH:200 mb:
+:SPFH:20 mb:
+:SPFH:2 mb:
+:SPFH:250 mb:
+:SPFH:2 m above ground:
+:SPFH:300 mb:
+:SPFH:30-0 mb above ground:
+:SPFH:30 mb:
+:SPFH:3 mb:
+:SPFH:350 mb:
+:SPFH:400 mb:
+:SPFH:450 mb:
+:SPFH:500 mb:
+:SPFH:50 mb:
+:SPFH:5 mb:
+:SPFH:550 mb:
+:SPFH:600 mb:
+:SPFH:60-30 mb above ground:
+:SPFH:650 mb:
+:SPFH:700 mb:
+:SPFH:70 mb:
+:SPFH:7 mb:
+:SPFH:750 mb:
+:SPFH:800 mb:
+:SPFH:80 m above ground:
+:SPFH:850 mb:
+:SPFH:900 mb:
+:SPFH:90-60 mb above ground:
+:SPFH:925 mb:
+:SPFH:950 mb:
+:SPFH:975 mb:
+:SUNSD:surface:
+:TCDC:475 mb:
+:TCDC:boundary layer cloud layer:
+:TCDC:convective cloud layer:
+:TCDC:entire atmosphere:
+:TCDC:high cloud layer:
+:TCDC:low cloud layer:
+:TCDC:middle cloud layer:
+:TMAX:2 m above ground:
+:TMIN:2 m above ground:
+:TMP:0.995 sigma level:
+:TMP:1000 mb:
+:TMP:100 m above ground:
+:TMP:100 mb:
+:TMP:10 mb:
+:TMP:1 mb:
+:TMP:120-90 mb above ground:
+:TMP:150-120 mb above ground:
+:TMP:150 mb:
+:TMP:180-150 mb above ground:
+:TMP:1829 m above mean sea level:
+:TMP:200 mb:
+:TMP:20 mb:
+:TMP:2 mb:
+:TMP:250 mb:
+:TMP:2743 m above mean sea level:
+:TMP:300 mb:
+:TMP:30-0 mb above ground:
+:TMP:305 m above mean sea level:
+:TMP:30 mb:
+:TMP:3 mb:
+:TMP:320 K isentropic level:
+:TMP:350 mb:
+:TMP:3658 m above mean sea level:
+:TMP:400 mb:
+:TMP:450 K isentropic level:
+:TMP:450 mb:
+:TMP:4572 m above mean sea level:
+:TMP:457 m above mean sea level:
+:TMP:500 mb:
+:TMP:50 mb:
+:TMP:5 mb:
+:TMP:550 K isentropic level:
+:TMP:550 mb:
+:TMP:600 mb:
+:TMP:60-30 mb above ground:
+:TMP:610 m above mean sea level:
+:TMP:650 K isentropic level:
+:TMP:650 mb:
+:TMP:700 mb:
+:TMP:70 mb:
+:TMP:7 mb:
+:TMP:750 mb:
+:TMP:800 mb:
+:TMP:80 m above ground:
+:TMP:900 mb:
+:TMP:90-60 mb above ground:
+:TMP:914 m above mean sea level:
+:TMP:925 mb:
+:TMP:950 mb:
+:TMP:975 mb:
+:TMP:high cloud top level:
+:TMP:low cloud top level:
+:TMP:max wind:
+:TMP:middle cloud top level:
+:TMP:PV=-1.5e-06 (Km^2/kg/s) surface:
+:TMP:PV=1.5e-06 (Km^2/kg/s) surface:
+:TMP:PV=-1e-06 (Km^2/kg/s) surface:
+:TMP:PV=1e-06 (Km^2/kg/s) surface:
+:TMP:PV=-2e-06 (Km^2/kg/s) surface:
+:TMP:PV=2e-06 (Km^2/kg/s) surface:
+:TMP:PV=-5e-07 (Km^2/kg/s) surface:
+:TMP:PV=5e-07 (Km^2/kg/s) surface:
+:TMP:surface:
+:TMP:tropopause:
+:TOZNE:entire atmosphere (considered as a single layer):
+:TSOIL:0-0.1 m below ground:
+:TSOIL:0.1-0.4 m below ground:
+:TSOIL:0.4-1 m below ground:
+:TSOIL:1-2 m below ground:
+:UFLX:surface:
+:UGRD:0.995 sigma level:
+:UGRD:1000 mb:
+:UGRD:100 m above ground:
+:UGRD:100 mb:
+:UGRD:10 mb:
+:UGRD:1 mb:
+:UGRD:120-90 mb above ground:
+:UGRD:150-120 mb above ground:
+:UGRD:150 mb:
+:UGRD:180-150 mb above ground:
+:UGRD:1829 m above mean sea level:
+:UGRD:20 mb:
+:UGRD:2 mb:
+:UGRD:2743 m above mean sea level:
+:UGRD:300 mb:
+:UGRD:30-0 mb above ground:
+:UGRD:305 m above mean sea level:
+:UGRD:30 mb:
+:UGRD:3 mb:
+:UGRD:320 K isentropic level:
+:UGRD:350 mb:
+:UGRD:3658 m above mean sea level:
+:UGRD:400 mb:
+:UGRD:450 K isentropic level:
+:UGRD:450 mb:
+:UGRD:4572 m above mean sea level:
+:UGRD:457 m above mean sea level:
+:UGRD:500 mb:
+:UGRD:50 mb:
+:UGRD:5 mb:
+:UGRD:550 K isentropic level:
+:UGRD:550 mb:
+:UGRD:600 mb:
+:UGRD:60-30 mb above ground:
+:UGRD:610 m above mean sea level:
+:UGRD:650 K isentropic level:
+:UGRD:650 mb:
+:UGRD:700 mb:
+:UGRD:70 mb:
+:UGRD:7 mb:
+:UGRD:750 mb:
+:UGRD:800 mb:
+:UGRD:80 m above ground:
+:UGRD:900 mb:
+:UGRD:90-60 mb above ground:
+:UGRD:914 m above mean sea level:
+:UGRD:925 mb:
+:UGRD:950 mb:
+:UGRD:975 mb:
+:UGRD:max wind:
+:UGRD:planetary boundary layer:
+:UGRD:PV=-1.5e-06 (Km^2/kg/s) surface:
+:UGRD:PV=1.5e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-1e-06 (Km^2/kg/s) surface:
+:UGRD:PV=1e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-2e-06 (Km^2/kg/s) surface:
+:UGRD:PV=2e-06 (Km^2/kg/s) surface:
+:UGRD:PV=-5e-07 (Km^2/kg/s) surface:
+:UGRD:PV=5e-07 (Km^2/kg/s) surface:
+:UGRD:tropopause:
+:U-GWD:surface:
+:ULWRF:surface:
+:USTM:6000-0 m above ground:
+:USWRF:surface:
+:USWRF:top of atmosphere:
+:APTMP:2 m above ground
+:VFLX:surface:
+:VGRD:0.995 sigma level:
+:VGRD:1000 mb:
+:VGRD:100 m above ground:
+:VGRD:100 mb:
+:VGRD:10 mb:
+:VGRD:1 mb:
+:VGRD:120-90 mb above ground:
+:VGRD:150-120 mb above ground:
+:VGRD:150 mb:
+:VGRD:180-150 mb above ground:
+:VGRD:1829 m above mean sea level:
+:VGRD:20 mb:
+:VGRD:2 mb:
+:VGRD:2743 m above mean sea level:
+:VGRD:300 mb:
+:VGRD:30-0 mb above ground:
+:VGRD:305 m above mean sea level:
+:VGRD:30 mb:
+:VGRD:3 mb:
+:VGRD:320 K isentropic level:
+:VGRD:350 mb:
+:VGRD:3658 m above mean sea level:
+:VGRD:400 mb:
+:VGRD:450 K isentropic level:
+:VGRD:450 mb:
+:VGRD:4572 m above mean sea level:
+:VGRD:457 m above mean sea level:
+:VGRD:500 mb:
+:VGRD:50 mb:
+:VGRD:5 mb:
+:VGRD:550 K isentropic level:
+:VGRD:550 mb:
+:VGRD:600 mb:
+:VGRD:60-30 mb above ground:
+:VGRD:610 m above mean sea level:
+:VGRD:650 K isentropic level:
+:VGRD:650 mb:
+:VGRD:700 mb:
+:VGRD:70 mb:
+:VGRD:7 mb:
+:VGRD:750 mb:
+:VGRD:800 mb:
+:VGRD:80 m above ground:
+:VGRD:900 mb:
+:VGRD:90-60 mb above ground:
+:VGRD:914 m above mean sea level:
+:VGRD:925 mb:
+:VGRD:950 mb:
+:VGRD:975 mb:
+:VGRD:max wind:
+:VGRD:planetary boundary layer:
+:VGRD:PV=-1.5e-06 (Km^2/kg/s) surface:
+:VGRD:PV=1.5e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-1e-06 (Km^2/kg/s) surface:
+:VGRD:PV=1e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-2e-06 (Km^2/kg/s) surface:
+:VGRD:PV=2e-06 (Km^2/kg/s) surface:
+:VGRD:PV=-5e-07 (Km^2/kg/s) surface:
+:VGRD:PV=5e-07 (Km^2/kg/s) surface:
+:VGRD:tropopause:
+:V-GWD:surface:
+:VIS:surface:
+:VRATE:planetary boundary layer:
+:VSTM:6000-0 m above ground:
+:VVEL:0.995 sigma level:
+:VVEL:1 mb:
+:VVEL:2 mb:
+:VVEL:3 mb:
+:VVEL:5 mb:
+:VVEL:7 mb:
+:VVEL:10 mb:
+:VVEL:20 mb:
+:VVEL:30 mb:
+:VVEL:50 mb:
+:VVEL:70 mb:
+:VVEL:1000 mb:
+:VVEL:100 mb:
+:VVEL:150 mb:
+:VVEL:200 mb:
+:VVEL:250 mb:
+:VVEL:300 mb:
+:VVEL:350 mb:
+:VVEL:400 mb:
+:VVEL:450 mb:
+:VVEL:500 mb:
+:VVEL:550 mb:
+:VVEL:600 mb:
+:VVEL:650 mb:
+:VVEL:700 mb:
+:VVEL:750 mb:
+:VVEL:800 mb:
+:VVEL:850 mb:
+:VVEL:900 mb:
+:VVEL:925 mb:
+:VVEL:950 mb:
+:VVEL:975 mb:
+:VWSH:PV=-1.5e-06 (Km^2/kg/s) surface:
+:VWSH:PV=1.5e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-1e-06 (Km^2/kg/s) surface:
+:VWSH:PV=1e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-2e-06 (Km^2/kg/s) surface:
+:VWSH:PV=2e-06 (Km^2/kg/s) surface:
+:VWSH:PV=-5e-07 (Km^2/kg/s) surface:
+:VWSH:PV=5e-07 (Km^2/kg/s) surface:
+:VWSH:tropopause:
+:WATR:surface:
+:WEASD:surface:
+:WILT:surface:
+:HGT:cloud ceiling:
+:PRES:1 hybrid level:
+:HGT:1 hybrid level:
+:TMP:1 hybrid level:
+:RH:1 hybrid level:
+:UGRD:1 hybrid level:
+:VGRD:1 hybrid level:
+:PRES:2 hybrid level:
+:HGT:2 hybrid level:
+:TMP:2 hybrid level:
+:RH:2 hybrid level:
+:UGRD:2 hybrid level:
+:VGRD:2 hybrid level:
+:PRES:3 hybrid level:
+:HGT:3 hybrid level:
+:TMP:3 hybrid level:
+:RH:3 hybrid level:
+:UGRD:3 hybrid level:
+:VGRD:3 hybrid level:
+:PRES:4 hybrid level:
+:HGT:4 hybrid level:
+:TMP:4 hybrid level:
+:RH:4 hybrid level:
+:UGRD:4 hybrid level:
+:VGRD:4 hybrid level:
diff --git a/parm/post/global_1x1_paramlist_g2.anl b/parm/product/gfs.anl.paramlist.a.txt
similarity index 100%
rename from parm/post/global_1x1_paramlist_g2.anl
rename to parm/product/gfs.anl.paramlist.a.txt
diff --git a/parm/post/global_1x1_paramlist_g2.f000 b/parm/product/gfs.f000.paramlist.a.txt
similarity index 100%
rename from parm/post/global_1x1_paramlist_g2.f000
rename to parm/product/gfs.f000.paramlist.a.txt
diff --git a/parm/post/global_1x1_paramlist_g2 b/parm/product/gfs.fFFF.paramlist.a.txt
similarity index 100%
rename from parm/post/global_1x1_paramlist_g2
rename to parm/product/gfs.fFFF.paramlist.a.txt
diff --git a/parm/post/global_master-catchup_parmlist_g2 b/parm/product/gfs.fFFF.paramlist.b.txt
similarity index 100%
rename from parm/post/global_master-catchup_parmlist_g2
rename to parm/product/gfs.fFFF.paramlist.b.txt
diff --git a/parm/ufs/fix/gfs/atmos.fixed_files.yaml b/parm/ufs/fix/gfs/atmos.fixed_files.yaml
index 7d901fe17b..8db691b49c 100644
--- a/parm/ufs/fix/gfs/atmos.fixed_files.yaml
+++ b/parm/ufs/fix/gfs/atmos.fixed_files.yaml
@@ -1,85 +1,85 @@
copy:
# Atmosphere mosaic file linked as the grid_spec file (atm only)
- - [$(FIXorog)/$(CASE)/$(CASE)_mosaic.nc, $(DATA)/INPUT/grid_spec.nc]
+ - [$(FIXgfs)/orog/$(CASE)/$(CASE)_mosaic.nc, $(DATA)/INPUT/grid_spec.nc]
# Atmosphere grid tile files
- - [$(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/]
+ - [$(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/]
- # 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]
+ # 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]
# GWD??
- - [$(FIXugwd)/ugwp_limb_tau.nc, $(DATA)/ugwp_limb_tau.nc]
+ - [$(FIXgfs)/ugwd/ugwp_limb_tau.nc, $(DATA)/ugwp_limb_tau.nc]
# CO2 climatology
- - [$(FIXam)/co2monthlycyc.txt, $(DATA)/co2monthlycyc.txt]
- - [$(FIXam)/global_co2historicaldata_glob.txt, $(DATA)/co2historicaldata_glob.txt]
- - [$(FIXam)/fix_co2_proj/global_co2historicaldata_2009.txt, $(DATA)/co2historicaldata_2009.txt]
- - [$(FIXam)/fix_co2_proj/global_co2historicaldata_2010.txt, $(DATA)/co2historicaldata_2010.txt]
- - [$(FIXam)/fix_co2_proj/global_co2historicaldata_2011.txt, $(DATA)/co2historicaldata_2011.txt]
- - [$(FIXam)/fix_co2_proj/global_co2historicaldata_2012.txt, $(DATA)/co2historicaldata_2012.txt]
- - [$(FIXam)/fix_co2_proj/global_co2historicaldata_2013.txt, $(DATA)/co2historicaldata_2013.txt]
- - [$(FIXam)/fix_co2_proj/global_co2historicaldata_2014.txt, $(DATA)/co2historicaldata_2014.txt]
- - [$(FIXam)/fix_co2_proj/global_co2historicaldata_2015.txt, $(DATA)/co2historicaldata_2015.txt]
- - [$(FIXam)/fix_co2_proj/global_co2historicaldata_2016.txt, $(DATA)/co2historicaldata_2016.txt]
- - [$(FIXam)/fix_co2_proj/global_co2historicaldata_2017.txt, $(DATA)/co2historicaldata_2017.txt]
- - [$(FIXam)/fix_co2_proj/global_co2historicaldata_2018.txt, $(DATA)/co2historicaldata_2018.txt]
- - [$(FIXam)/fix_co2_proj/global_co2historicaldata_2019.txt, $(DATA)/co2historicaldata_2019.txt]
- - [$(FIXam)/fix_co2_proj/global_co2historicaldata_2020.txt, $(DATA)/co2historicaldata_2020.txt]
- - [$(FIXam)/fix_co2_proj/global_co2historicaldata_2021.txt, $(DATA)/co2historicaldata_2021.txt]
- - [$(FIXam)/fix_co2_proj/global_co2historicaldata_2022.txt, $(DATA)/co2historicaldata_2022.txt]
- - [$(FIXam)/fix_co2_proj/global_co2historicaldata_2023.txt, $(DATA)/co2historicaldata_2023.txt]
+ - [$(FIXgfs)/am/co2monthlycyc.txt, $(DATA)/co2monthlycyc.txt]
+ - [$(FIXgfs)/am/global_co2historicaldata_glob.txt, $(DATA)/co2historicaldata_glob.txt]
+ - [$(FIXgfs)/am/fix_co2_proj/global_co2historicaldata_2009.txt, $(DATA)/co2historicaldata_2009.txt]
+ - [$(FIXgfs)/am/fix_co2_proj/global_co2historicaldata_2010.txt, $(DATA)/co2historicaldata_2010.txt]
+ - [$(FIXgfs)/am/fix_co2_proj/global_co2historicaldata_2011.txt, $(DATA)/co2historicaldata_2011.txt]
+ - [$(FIXgfs)/am/fix_co2_proj/global_co2historicaldata_2012.txt, $(DATA)/co2historicaldata_2012.txt]
+ - [$(FIXgfs)/am/fix_co2_proj/global_co2historicaldata_2013.txt, $(DATA)/co2historicaldata_2013.txt]
+ - [$(FIXgfs)/am/fix_co2_proj/global_co2historicaldata_2014.txt, $(DATA)/co2historicaldata_2014.txt]
+ - [$(FIXgfs)/am/fix_co2_proj/global_co2historicaldata_2015.txt, $(DATA)/co2historicaldata_2015.txt]
+ - [$(FIXgfs)/am/fix_co2_proj/global_co2historicaldata_2016.txt, $(DATA)/co2historicaldata_2016.txt]
+ - [$(FIXgfs)/am/fix_co2_proj/global_co2historicaldata_2017.txt, $(DATA)/co2historicaldata_2017.txt]
+ - [$(FIXgfs)/am/fix_co2_proj/global_co2historicaldata_2018.txt, $(DATA)/co2historicaldata_2018.txt]
+ - [$(FIXgfs)/am/fix_co2_proj/global_co2historicaldata_2019.txt, $(DATA)/co2historicaldata_2019.txt]
+ - [$(FIXgfs)/am/fix_co2_proj/global_co2historicaldata_2020.txt, $(DATA)/co2historicaldata_2020.txt]
+ - [$(FIXgfs)/am/fix_co2_proj/global_co2historicaldata_2021.txt, $(DATA)/co2historicaldata_2021.txt]
+ - [$(FIXgfs)/am/fix_co2_proj/global_co2historicaldata_2022.txt, $(DATA)/co2historicaldata_2022.txt]
+ - [$(FIXgfs)/am/fix_co2_proj/global_co2historicaldata_2023.txt, $(DATA)/co2historicaldata_2023.txt]
- # FIXam files
- - [$(FIXam)/global_climaeropac_global.txt, $(DATA)/aerosol.dat]
- - [$(FIXam)/ozprdlos_2015_new_sbuvO3_tclm15_nuchem.f77, $(DATA)/global_o3prdlos.f77]
- - [$(FIXam)/global_h2o_pltc.f77, $(DATA)/global_h2oprdlos.f77]
- - [$(FIXam)/global_glacier.2x2.grb, $(DATA)/global_glacier.2x2.grb]
- - [$(FIXam)/global_maxice.2x2.grb, $(DATA)/global_maxice.2x2.grb]
- - [$(FIXam)/global_snoclim.1.875.grb, $(DATA)/global_snoclim.1.875.grb]
- - [$(FIXam)/global_slmask.t1534.3072.1536.grb, $(DATA)/global_slmask.t1534.3072.1536.grb]
- - [$(FIXam)/global_soilmgldas.statsgo.t1534.3072.1536.grb, $(DATA)/global_soilmgldas.statsgo.t1534.3072.1536.grb]
- - [$(FIXam)/global_solarconstant_noaa_an.txt, $(DATA)/solarconstant_noaa_an.txt]
- - [$(FIXam)/global_sfc_emissivity_idx.txt, $(DATA)/sfc_emissivity_idx.txt]
- - [$(FIXam)/RTGSST.1982.2012.monthly.clim.grb, $(DATA)/RTGSST.1982.2012.monthly.clim.grb]
- - [$(FIXam)/IMS-NIC.blended.ice.monthly.clim.grb, $(DATA)/IMS-NIC.blended.ice.monthly.clim.grb]
+ # FIXgfs/am files
+ - [$(FIXgfs)/am/global_climaeropac_global.txt, $(DATA)/aerosol.dat]
+ - [$(FIXgfs)/am/ozprdlos_2015_new_sbuvO3_tclm15_nuchem.f77, $(DATA)/global_o3prdlos.f77]
+ - [$(FIXgfs)/am/global_h2o_pltc.f77, $(DATA)/global_h2oprdlos.f77]
+ - [$(FIXgfs)/am/global_glacier.2x2.grb, $(DATA)/global_glacier.2x2.grb]
+ - [$(FIXgfs)/am/global_maxice.2x2.grb, $(DATA)/global_maxice.2x2.grb]
+ - [$(FIXgfs)/am/global_snoclim.1.875.grb, $(DATA)/global_snoclim.1.875.grb]
+ - [$(FIXgfs)/am/global_slmask.t1534.3072.1536.grb, $(DATA)/global_slmask.t1534.3072.1536.grb]
+ - [$(FIXgfs)/am/global_soilmgldas.statsgo.t1534.3072.1536.grb, $(DATA)/global_soilmgldas.statsgo.t1534.3072.1536.grb]
+ - [$(FIXgfs)/am/global_solarconstant_noaa_an.txt, $(DATA)/solarconstant_noaa_an.txt]
+ - [$(FIXgfs)/am/global_sfc_emissivity_idx.txt, $(DATA)/sfc_emissivity_idx.txt]
+ - [$(FIXgfs)/am/RTGSST.1982.2012.monthly.clim.grb, $(DATA)/RTGSST.1982.2012.monthly.clim.grb]
+ - [$(FIXgfs)/am/IMS-NIC.blended.ice.monthly.clim.grb, $(DATA)/IMS-NIC.blended.ice.monthly.clim.grb]
# MERRA2 Aerosol Climatology
- - [$(FIXaer)/merra2.aerclim.2003-2014.m01.nc, $(DATA)/aeroclim.m01.nc]
- - [$(FIXaer)/merra2.aerclim.2003-2014.m02.nc, $(DATA)/aeroclim.m02.nc]
- - [$(FIXaer)/merra2.aerclim.2003-2014.m03.nc, $(DATA)/aeroclim.m03.nc]
- - [$(FIXaer)/merra2.aerclim.2003-2014.m04.nc, $(DATA)/aeroclim.m04.nc]
- - [$(FIXaer)/merra2.aerclim.2003-2014.m05.nc, $(DATA)/aeroclim.m05.nc]
- - [$(FIXaer)/merra2.aerclim.2003-2014.m06.nc, $(DATA)/aeroclim.m06.nc]
- - [$(FIXaer)/merra2.aerclim.2003-2014.m07.nc, $(DATA)/aeroclim.m07.nc]
- - [$(FIXaer)/merra2.aerclim.2003-2014.m08.nc, $(DATA)/aeroclim.m08.nc]
- - [$(FIXaer)/merra2.aerclim.2003-2014.m09.nc, $(DATA)/aeroclim.m09.nc]
- - [$(FIXaer)/merra2.aerclim.2003-2014.m10.nc, $(DATA)/aeroclim.m10.nc]
- - [$(FIXaer)/merra2.aerclim.2003-2014.m11.nc, $(DATA)/aeroclim.m11.nc]
- - [$(FIXaer)/merra2.aerclim.2003-2014.m12.nc, $(DATA)/aeroclim.m12.nc]
+ - [$(FIXgfs)/aer/merra2.aerclim.2003-2014.m01.nc, $(DATA)/aeroclim.m01.nc]
+ - [$(FIXgfs)/aer/merra2.aerclim.2003-2014.m02.nc, $(DATA)/aeroclim.m02.nc]
+ - [$(FIXgfs)/aer/merra2.aerclim.2003-2014.m03.nc, $(DATA)/aeroclim.m03.nc]
+ - [$(FIXgfs)/aer/merra2.aerclim.2003-2014.m04.nc, $(DATA)/aeroclim.m04.nc]
+ - [$(FIXgfs)/aer/merra2.aerclim.2003-2014.m05.nc, $(DATA)/aeroclim.m05.nc]
+ - [$(FIXgfs)/aer/merra2.aerclim.2003-2014.m06.nc, $(DATA)/aeroclim.m06.nc]
+ - [$(FIXgfs)/aer/merra2.aerclim.2003-2014.m07.nc, $(DATA)/aeroclim.m07.nc]
+ - [$(FIXgfs)/aer/merra2.aerclim.2003-2014.m08.nc, $(DATA)/aeroclim.m08.nc]
+ - [$(FIXgfs)/aer/merra2.aerclim.2003-2014.m09.nc, $(DATA)/aeroclim.m09.nc]
+ - [$(FIXgfs)/aer/merra2.aerclim.2003-2014.m10.nc, $(DATA)/aeroclim.m10.nc]
+ - [$(FIXgfs)/aer/merra2.aerclim.2003-2014.m11.nc, $(DATA)/aeroclim.m11.nc]
+ - [$(FIXgfs)/aer/merra2.aerclim.2003-2014.m12.nc, $(DATA)/aeroclim.m12.nc]
# Optical depth
- - [$(FIXlut)/optics_BC.v1_3.dat, $(DATA)/optics_BC.dat]
- - [$(FIXlut)/optics_DU.v15_3.dat, $(DATA)/optics_DU.dat]
- - [$(FIXlut)/optics_OC.v1_3.dat, $(DATA)/optics_OC.dat]
- - [$(FIXlut)/optics_SS.v3_3.dat, $(DATA)/optics_SS.dat]
- - [$(FIXlut)/optics_SU.v1_3.dat, $(DATA)/optics_SU.dat]
+ - [$(FIXgfs)/lut/optics_BC.v1_3.dat, $(DATA)/optics_BC.dat]
+ - [$(FIXgfs)/lut/optics_DU.v15_3.dat, $(DATA)/optics_DU.dat]
+ - [$(FIXgfs)/lut/optics_OC.v1_3.dat, $(DATA)/optics_OC.dat]
+ - [$(FIXgfs)/lut/optics_SS.v3_3.dat, $(DATA)/optics_SS.dat]
+ - [$(FIXgfs)/lut/optics_SU.v1_3.dat, $(DATA)/optics_SU.dat]
# fd_ufs.yaml file
- [$(HOMEgfs)/sorc/ufs_model.fd/tests/parm/fd_ufs.yaml, $(DATA)/]
diff --git a/parm/ufs/fix/gfs/land.fixed_files.yaml b/parm/ufs/fix/gfs/land.fixed_files.yaml
index bb2d060963..8e4d221dbc 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 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)/]
+ # 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)/]
- - [$(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).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).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).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).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).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).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).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).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).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).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_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_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)/]
+ - [$(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)/]
diff --git a/parm/ufs/fix/gfs/ocean.fixed_files.yaml b/parm/ufs/fix/gfs/ocean.fixed_files.yaml
index 1ca8ce7a68..4ef19bab0d 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
- - [$(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]
+ - [$(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]
diff --git a/parm/ufs/fv3/data_table b/parm/ufs/fv3/data_table
deleted file mode 100644
index 4ca9128415..0000000000
--- a/parm/ufs/fv3/data_table
+++ /dev/null
@@ -1 +0,0 @@
-"OCN", "runoff", "runoff", "./INPUT/@[FRUNOFF]", "none" , 1.0
diff --git a/parm/ufs/fv3/diag_table b/parm/ufs/fv3/diag_table
index b972b3470c..47106cb294 100644
--- a/parm/ufs/fv3/diag_table
+++ b/parm/ufs/fv3/diag_table
@@ -1,7 +1,7 @@
"fv3_history", 0, "hours", 1, "hours", "time"
"fv3_history2d", 0, "hours", 1, "hours", "time"
-"ocn%4yr%2mo%2dy%2hr", 6, "hours", 1, "hours", "time", 6, "hours", "1901 1 1 0 0 0"
-"ocn_daily%4yr%2mo%2dy", 1, "days", 1, "days", "time", 1, "days", "1901 1 1 0 0 0"
+"ocn%4yr%2mo%2dy%2hr", @[FHOUT_OCNICE], "hours", 1, "hours", "time", @[FHOUT_OCNICE], "hours", "@[SYEAR] @[SMONTH] @[SDAY] @[CHOUR] 0 0"
+"ocn_daily%4yr%2mo%2dy", 1, "days", 1, "days", "time", 1, "days", "@[SYEAR] @[SMONTH] @[SDAY] @[CHOUR] 0 0"
##############
# Ocean fields
diff --git a/parm/ufs/gocart/ExtData.other b/parm/ufs/gocart/ExtData.other
index 789576305e..7a0d63d6ca 100644
--- a/parm/ufs/gocart/ExtData.other
+++ b/parm/ufs/gocart/ExtData.other
@@ -17,12 +17,12 @@ DU_UTHRES '1' Y E - none none uthres ExtData/n
#====== Sulfate Sources =================================================
# Anthropogenic (BF & FF) emissions -- allowed to input as two layers
-SU_ANTHROL1 NA N Y %y4-%m2-%d2t12:00:00 none none SO2 ExtData/nexus/CEDS/v2019/%y4/CEDS.2019.emis.%y4%m2%d2.nc
-SU_ANTHROL2 NA N Y %y4-%m2-%d2t12:00:00 none none SO2_elev ExtData/nexus/CEDS/v2019/%y4/CEDS.2019.emis.%y4%m2%d2.nc
+SU_ANTHROL1 NA N Y %y4-%m2-%d2t12:00:00 none none SO2 ExtData/nexus/CEDS/v2019/monthly/%y4/CEDS_2019_monthly.%y4%m2.nc
+SU_ANTHROL2 NA N Y %y4-%m2-%d2t12:00:00 none none SO2_elev ExtData/nexus/CEDS/v2019/monthly/%y4/CEDS_2019_monthly.%y4%m2.nc
# Ship emissions
-SU_SHIPSO2 NA N Y %y4-%m2-%d2t12:00:00 none none SO2_ship ExtData/nexus/CEDS/v2019/%y4/CEDS.2019.emis.%y4%m2%d2.nc
-SU_SHIPSO4 NA N Y %y4-%m2-%d2t12:00:00 none none SO4_ship ExtData/nexus/CEDS/v2019/%y4/CEDS.2019.emis.%y4%m2%d2.nc
+SU_SHIPSO2 NA N Y %y4-%m2-%d2t12:00:00 none none SO2_ship ExtData/nexus/CEDS/v2019/monthly/%y4/CEDS_2019_monthly.%y4%m2.nc
+SU_SHIPSO4 NA N Y %y4-%m2-%d2t12:00:00 none none SO4_ship ExtData/nexus/CEDS/v2019/monthly/%y4/CEDS_2019_monthly.%y4%m2.nc
# Aircraft fuel consumption
SU_AIRCRAFT NA Y Y %y4-%m2-%d2t12:00:00 none none none /dev/null
@@ -54,20 +54,20 @@ pSO2_OCS NA Y Y %y4-%m2-%d2t12:00:00 none none biofuel /dev/null
# ---------------
# # VOCs - OFFLINE MEGAN BIOG
-OC_ISOPRENE NA N Y %y4-%m2-%d2t12:00:00 none none isoprene ExtData/nexus/MEGAN_OFFLINE_BVOC/v2019-10/%y4/MEGAN.OFFLINE.BIOVOC.%y4.emis.%y4%m2%d2.nc
-OC_LIMO NA N Y %y4-%m2-%d2t12:00:00 none none limo ExtData/nexus/MEGAN_OFFLINE_BVOC/v2019-10/%y4/MEGAN.OFFLINE.BIOVOC.%y4.emis.%y4%m2%d2.nc
-OC_MTPA NA N Y %y4-%m2-%d2t12:00:00 none none mtpa ExtData/nexus/MEGAN_OFFLINE_BVOC/v2019-10/%y4/MEGAN.OFFLINE.BIOVOC.%y4.emis.%y4%m2%d2.nc
-OC_MTPO NA N Y %y4-%m2-%d2t12:00:00 none none mtpo ExtData/nexus/MEGAN_OFFLINE_BVOC/v2019-10/%y4/MEGAN.OFFLINE.BIOVOC.%y4.emis.%y4%m2%d2.nc
+OC_ISOPRENE NA Y Y %y4-%m2-%d2t12:00:00 none none isoprene ExtData/nexus/MEGAN_OFFLINE_BVOC/v2021-12/MEGAN_OFFLINE_CLIMO_2000_2022_%m2.nc
+OC_LIMO NA Y Y %y4-%m2-%d2t12:00:00 none none limo ExtData/nexus/MEGAN_OFFLINE_BVOC/v2021-12/MEGAN_OFFLINE_CLIMO_2000_2022_%m2.nc
+OC_MTPA NA Y Y %y4-%m2-%d2t12:00:00 none none mtpa ExtData/nexus/MEGAN_OFFLINE_BVOC/v2021-12/MEGAN_OFFLINE_CLIMO_2000_2022_%m2.nc
+OC_MTPO NA Y Y %y4-%m2-%d2t12:00:00 none none mtpo ExtData/nexus/MEGAN_OFFLINE_BVOC/v2021-12/MEGAN_OFFLINE_CLIMO_2000_2022_%m2.nc
# Biofuel Source -- Included in AeroCom anthropogenic emissions
OC_BIOFUEL NA Y Y %y4-%m2-%d2t12:00:00 none none biofuel /dev/null
# Anthropogenic (BF & FF) emissions -- allowed to input as two layers
-OC_ANTEOC1 NA N Y %y4-%m2-%d2t12:00:00 none none OC ExtData/nexus/CEDS/v2019/%y4/CEDS.2019.emis.%y4%m2%d2.nc
-OC_ANTEOC2 NA N Y %y4-%m2-%d2t12:00:00 none none OC_elev ExtData/nexus/CEDS/v2019/%y4/CEDS.2019.emis.%y4%m2%d2.nc
+OC_ANTEOC1 NA N Y %y4-%m2-%d2t12:00:00 none none OC ExtData/nexus/CEDS/v2019/monthly/%y4/CEDS_2019_monthly.%y4%m2.nc
+OC_ANTEOC2 NA N Y %y4-%m2-%d2t12:00:00 none none OC_elev ExtData/nexus/CEDS/v2019/monthly/%y4/CEDS_2019_monthly.%y4%m2.nc
# EDGAR based ship emissions
-OC_SHIP NA N Y %y4-%m2-%d2t12:00:00 none none OC_ship ExtData/nexus/CEDS/v2019/%y4/CEDS.2019.emis.%y4%m2%d2.nc
+OC_SHIP NA N Y %y4-%m2-%d2t12:00:00 none none OC_ship ExtData/nexus/CEDS/v2019/monthly/%y4/CEDS_2019_monthly.%y4%m2.nc
# Aircraft fuel consumption
OC_AIRCRAFT NA N Y %y4-%m2-%d2t12:00:00 none none oc_aviation /dev/null
@@ -88,11 +88,11 @@ pSOA_ANTHRO_VOC NA Y Y %y4-%m2-%d2t12:00:00 none none biofuel /dev/null
BC_BIOFUEL NA Y Y %y4-%m2-%d2t12:00:00 none none biofuel /dev/null
# Anthropogenic (BF & FF) emissions -- allowed to input as two layers
-BC_ANTEBC1 NA N Y %y4-%m2-%d2t12:00:00 none none BC ExtData/nexus/CEDS/v2019/%y4/CEDS.2019.emis.%y4%m2%d2.nc
-BC_ANTEBC2 NA N Y %y4-%m2-%d2t12:00:00 none none BC_elev ExtData/nexus/CEDS/v2019/%y4/CEDS.2019.emis.%y4%m2%d2.nc
+BC_ANTEBC1 NA N Y %y4-%m2-%d2t12:00:00 none none BC ExtData/nexus/CEDS/v2019/monthly/%y4/CEDS_2019_monthly.%y4%m2.nc
+BC_ANTEBC2 NA N Y %y4-%m2-%d2t12:00:00 none none BC_elev ExtData/nexus/CEDS/v2019/monthly/%y4/CEDS_2019_monthly.%y4%m2.nc
# EDGAR based ship emissions
-BC_SHIP NA N Y %y4-%m2-%d2t12:00:00 none none BC_ship ExtData/nexus/CEDS/v2019/%y4/CEDS.2019.emis.%y4%m2%d2.nc
+BC_SHIP NA N Y %y4-%m2-%d2t12:00:00 none none BC_ship ExtData/nexus/CEDS/v2019/monthly/%y4/CEDS_2019_monthly.%y4%m2.nc
# Aircraft fuel consumption
BC_AIRCRAFT NA N Y %y4-%m2-%d2t12:00:00 none none bc_aviation /dev/null
@@ -133,11 +133,11 @@ BRC_AVIATION_CRS NA Y Y %y4-%m2-%d2t12:00:00 none none oc_aviation /dev/null
pSOA_BIOB_VOC NA Y Y %y4-%m2-%d2t12:00:00 none none biofuel /dev/null
# # ======= Nitrate Sources ========
-# EMI_NH3_AG 'kg m-2 s-1' N Y %y4-%m2-%d2T12:00:00 none none NH3_ag ExtData/nexus/CEDS/v2019/%y4/CEDS.2019.emis.%y4%m2%d2.nc
+# EMI_NH3_AG 'kg m-2 s-1' N Y %y4-%m2-%d2T12:00:00 none none NH3_ag ExtData/nexus/CEDS/v2019/monthly/%y4/CEDS_2019_monthly.%y4%m2.nc
# EMI_NH3_EN 'kg m-2 s-1' N Y %y4-%m2-%d2T12:00:00 none none NH3_en /dev/null
-# EMI_NH3_IN 'kg m-2 s-1' N Y %y4-%m2-%d2T12:00:00 none none NH3_in ExtData/nexus/CEDS/v2019/%y4/CEDS.2019.emis.%y4%m2%d2.nc
-# EMI_NH3_RE 'kg m-2 s-1' N Y %y4-%m2-%d2T12:00:00 none none NH3_re ExtData/nexus/CEDS/v2019/%y4/CEDS.2019.emis.%y4%m2%d2.nc
-# EMI_NH3_TR 'kg m-2 s-1' N Y %y4-%m2-%d2T12:00:00 none none NH3_tr ExtData/nexus/CEDS/v2019/%y4/CEDS.2019.emis.%y4%m2%d2.nc
+# EMI_NH3_IN 'kg m-2 s-1' N Y %y4-%m2-%d2T12:00:00 none none NH3_in ExtData/nexus/CEDS/v2019/monthly/%y4/CEDS_2019_monthly.%y4%m2.nc
+# EMI_NH3_RE 'kg m-2 s-1' N Y %y4-%m2-%d2T12:00:00 none none NH3_re ExtData/nexus/CEDS/v2019/monthly/%y4/CEDS_2019_monthly.%y4%m2.nc
+# EMI_NH3_TR 'kg m-2 s-1' N Y %y4-%m2-%d2T12:00:00 none none NH3_tr ExtData/nexus/CEDS/v2019/monthly/%y4/CEDS_2019_monthly.%y4%m2.nc
# EMI_NH3_OC 'kg m-2 s-1' Y Y %y4-%m2-%d2T12:00:00 none none emiss_ocn ExtData/PIESA/sfc/GEIA.emis_NH3.ocean.x576_y361.t12.20080715_12z.nc4
# # --------------------------------------------------------------
diff --git a/parm/ufs/gocart/SU2G_instance_SU.rc b/parm/ufs/gocart/SU2G_instance_SU.rc
index e365827760..79484b3068 100644
--- a/parm/ufs/gocart/SU2G_instance_SU.rc
+++ b/parm/ufs/gocart/SU2G_instance_SU.rc
@@ -7,8 +7,8 @@ aerosol_monochromatic_optics_file: ExtData/monochromatic/optics_SU.v1_3.nc
nbins: 4
-# Volcanic pointwise sources
-volcano_srcfilen: ExtData/nexus/VOLCANO/v2021-09/%y4/%m2/so2_volcanic_emissions_Carns.%y4%m2%d2.rc
+# Volcanic pointwise sources | degassing only | replace with path to historical volcanic emissions for scientific runs
+volcano_srcfilen: ExtData/nexus/VOLCANO/v2021-09/so2_volcanic_emissions_CARN_v202005.degassing_only.rc
# Heights [m] of LTO, CDS and CRS aviation emissions layers
aviation_vertical_layers: 0.0 100.0 9.0e3 10.0e3
diff --git a/parm/ufs/mom6/MOM_input_template_025 b/parm/ufs/mom6/MOM_input_template_025
deleted file mode 100644
index df56a3f486..0000000000
--- a/parm/ufs/mom6/MOM_input_template_025
+++ /dev/null
@@ -1,902 +0,0 @@
-! This input file provides the adjustable run-time parameters for version 6 of the Modular Ocean Model (MOM6).
-! Where appropriate, parameters use usually given in MKS units.
-
-! This particular file is for the example in ice_ocean_SIS2/OM4_025.
-
-! This MOM_input file typically contains only the non-default values that are needed to reproduce this example.
-! A full list of parameters for this example can be found in the corresponding MOM_parameter_doc.all file
-! which is generated by the model at run-time.
-! === module MOM_domains ===
-TRIPOLAR_N = True ! [Boolean] default = False
- ! Use tripolar connectivity at the northern edge of the domain. With
- ! TRIPOLAR_N, NIGLOBAL must be even.
-NIGLOBAL = @[NX_GLB] !
- ! The total number of thickness grid points in the x-direction in the physical
- ! domain. With STATIC_MEMORY_ this is set in MOM_memory.h at compile time.
-NJGLOBAL = @[NY_GLB] !
- ! The total number of thickness grid points in the y-direction in the physical
- ! domain. With STATIC_MEMORY_ this is set in MOM_memory.h at compile time.
-NIHALO = 4 ! default = 4
- ! The number of halo points on each side in the x-direction. With
- ! STATIC_MEMORY_ this is set as NIHALO_ in MOM_memory.h at compile time; without
- ! STATIC_MEMORY_ the default is NIHALO_ in MOM_memory.h (if defined) or 2.
-NJHALO = 4 ! default = 4
- ! The number of halo points on each side in the y-direction. With
- ! STATIC_MEMORY_ this is set as NJHALO_ in MOM_memory.h at compile time; without
- ! STATIC_MEMORY_ the default is NJHALO_ in MOM_memory.h (if defined) or 2.
-! LAYOUT = 32, 18 !
- ! The processor layout that was actually used.
-! IO_LAYOUT = 1, 1 ! default = 1
- ! The processor layout to be used, or 0,0 to automatically set the io_layout to
- ! be the same as the layout.
-
-! === module MOM ===
-USE_REGRIDDING = True ! [Boolean] default = False
- ! If True, use the ALE algorithm (regridding/remapping). If False, use the
- ! layered isopycnal algorithm.
-THICKNESSDIFFUSE = True ! [Boolean] default = False
- ! If true, interface heights are diffused with a coefficient of KHTH.
-THICKNESSDIFFUSE_FIRST = True ! [Boolean] default = False
- ! If true, do thickness diffusion before dynamics. This is only used if
- ! THICKNESSDIFFUSE is true.
-DT = @[DT_DYNAM_MOM6] ! [s]
- ! The (baroclinic) dynamics time step. The time-step that is actually used will
- ! be an integer fraction of the forcing time-step (DT_FORCING in ocean-only mode
- ! or the coupling timestep in coupled mode.)
-DT_THERM = @[DT_THERM_MOM6] ! [s] default = 1800.0
- ! The thermodynamic and tracer advection time step. Ideally DT_THERM should be
- ! an integer multiple of DT and less than the forcing or coupling time-step,
- ! unless THERMO_SPANS_COUPLING is true, in which case DT_THERM can be an integer
- ! multiple of the coupling timestep. By default DT_THERM is set to DT.
-THERMO_SPANS_COUPLING = @[MOM6_THERMO_SPAN] ! [Boolean] default = False
- ! If true, the MOM will take thermodynamic and tracer timesteps that can be
- ! longer than the coupling timestep. The actual thermodynamic timestep that is
- ! used in this case is the largest integer multiple of the coupling timestep
- ! that is less than or equal to DT_THERM.
-HFREEZE = 20.0 ! [m] default = -1.0
- ! If HFREEZE > 0, melt potential will be computed. The actual depth
- ! over which melt potential is computed will be min(HFREEZE, OBLD)
- ! where OBLD is the boundary layer depth. If HFREEZE <= 0 (default)
- ! melt potential will not be computed.
-USE_PSURF_IN_EOS = False ! [Boolean] default = False
- ! If true, always include the surface pressure contributions in equation of
- ! state calculations.
-FRAZIL = True ! [Boolean] default = False
- ! If true, water freezes if it gets too cold, and the accumulated heat deficit
- ! is returned in the surface state. FRAZIL is only used if
- ! ENABLE_THERMODYNAMICS is true.
-DO_GEOTHERMAL = True ! [Boolean] default = False
- ! If true, apply geothermal heating.
-BOUND_SALINITY = True ! [Boolean] default = False
- ! If true, limit salinity to being positive. (The sea-ice model may ask for more
- ! salt than is available and drive the salinity negative otherwise.)
-MIN_SALINITY = 0.01 ! [PPT] default = 0.01
- ! The minimum value of salinity when BOUND_SALINITY=True. The default is 0.01
- ! for backward compatibility but ideally should be 0.
-C_P = 3992.0 ! [J kg-1 K-1] default = 3991.86795711963
- ! The heat capacity of sea water, approximated as a constant. This is only used
- ! if ENABLE_THERMODYNAMICS is true. The default value is from the TEOS-10
- ! definition of conservative temperature.
-CHECK_BAD_SURFACE_VALS = True ! [Boolean] default = False
- ! If true, check the surface state for ridiculous values.
-BAD_VAL_SSH_MAX = 50.0 ! [m] default = 20.0
- ! The value of SSH above which a bad value message is triggered, if
- ! CHECK_BAD_SURFACE_VALS is true.
-BAD_VAL_SSS_MAX = 75.0 ! [PPT] default = 45.0
- ! The value of SSS above which a bad value message is triggered, if
- ! CHECK_BAD_SURFACE_VALS is true.
-BAD_VAL_SST_MAX = 55.0 ! [deg C] default = 45.0
- ! The value of SST above which a bad value message is triggered, if
- ! CHECK_BAD_SURFACE_VALS is true.
-BAD_VAL_SST_MIN = -3.0 ! [deg C] default = -2.1
- ! The value of SST below which a bad value message is triggered, if
- ! CHECK_BAD_SURFACE_VALS is true.
-DEFAULT_2018_ANSWERS = True ! [Boolean] default = True
- ! This sets the default value for the various _2018_ANSWERS parameters.
-WRITE_GEOM = 2 ! default = 1
- ! If =0, never write the geometry and vertical grid files. If =1, write the
- ! geometry and vertical grid files only for a new simulation. If =2, always
- ! write the geometry and vertical grid files. Other values are invalid.
-SAVE_INITIAL_CONDS = False ! [Boolean] default = False
- ! If true, write the initial conditions to a file given by IC_OUTPUT_FILE.
-
-! === module MOM_hor_index ===
-! Sets the horizontal array index types.
-
-! === module MOM_fixed_initialization ===
-INPUTDIR = "INPUT" ! default = "."
- ! The directory in which input files are found.
-
-! === module MOM_grid_init ===
-GRID_CONFIG = "mosaic" !
- ! A character string that determines the method for defining the horizontal
- ! grid. Current options are:
- ! mosaic - read the grid from a mosaic (supergrid)
- ! file set by GRID_FILE.
- ! cartesian - use a (flat) Cartesian grid.
- ! spherical - use a simple spherical grid.
- ! mercator - use a Mercator spherical grid.
-GRID_FILE = "ocean_hgrid.nc" !
- ! Name of the file from which to read horizontal grid data.
-GRID_ROTATION_ANGLE_BUGS = False ! [Boolean] default = True
- ! If true, use an older algorithm to calculate the sine and
- ! cosines needed rotate between grid-oriented directions and
- ! true north and east. Differences arise at the tripolar fold
-USE_TRIPOLAR_GEOLONB_BUG = False ! [Boolean] default = True
- ! If true, use older code that incorrectly sets the longitude in some points
- ! along the tripolar fold to be off by 360 degrees.
-TOPO_CONFIG = "file" !
- ! This specifies how bathymetry is specified:
- ! file - read bathymetric information from the file
- ! specified by (TOPO_FILE).
- ! flat - flat bottom set to MAXIMUM_DEPTH.
- ! bowl - an analytically specified bowl-shaped basin
- ! ranging between MAXIMUM_DEPTH and MINIMUM_DEPTH.
- ! spoon - a similar shape to 'bowl', but with an vertical
- ! wall at the southern face.
- ! halfpipe - a zonally uniform channel with a half-sine
- ! profile in the meridional direction.
- ! benchmark - use the benchmark test case topography.
- ! Neverland - use the Neverland test case topography.
- ! DOME - use a slope and channel configuration for the
- ! DOME sill-overflow test case.
- ! ISOMIP - use a slope and channel configuration for the
- ! ISOMIP test case.
- ! DOME2D - use a shelf and slope configuration for the
- ! DOME2D gravity current/overflow test case.
- ! Kelvin - flat but with rotated land mask.
- ! seamount - Gaussian bump for spontaneous motion test case.
- ! dumbbell - Sloshing channel with reservoirs on both ends.
- ! shelfwave - exponential slope for shelfwave test case.
- ! Phillips - ACC-like idealized topography used in the Phillips config.
- ! dense - Denmark Strait-like dense water formation and overflow.
- ! USER - call a user modified routine.
-TOPO_FILE = "ocean_topog.nc" ! default = "topog.nc"
- ! The file from which the bathymetry is read.
-TOPO_EDITS_FILE = "All_edits.nc" ! default = ""
- ! The file from which to read a list of i,j,z topography overrides.
-ALLOW_LANDMASK_CHANGES = @[MOM6_ALLOW_LANDMASK_CHANGES] ! default = "False"
- ! If true, allow topography overrides to change ocean points to land
-MAXIMUM_DEPTH = 6500.0 ! [m]
- ! The maximum depth of the ocean.
-MINIMUM_DEPTH = 9.5 ! [m] default = 0.0
- ! If MASKING_DEPTH is unspecified, then anything shallower than MINIMUM_DEPTH is
- ! assumed to be land and all fluxes are masked out. If MASKING_DEPTH is
- ! specified, then all depths shallower than MINIMUM_DEPTH but deeper than
- ! MASKING_DEPTH are rounded to MINIMUM_DEPTH.
-
-! === module MOM_open_boundary ===
-! Controls where open boundaries are located, what kind of boundary condition to impose, and what data to apply,
-! if any.
-MASKING_DEPTH = 0.0 ! [m] default = -9999.0
- ! The depth below which to mask points as land points, for which all fluxes are
- ! zeroed out. MASKING_DEPTH is ignored if negative.
-CHANNEL_CONFIG = "list" ! default = "none"
- ! A parameter that determines which set of channels are
- ! restricted to specific widths. Options are:
- ! none - All channels have the grid width.
- ! global_1deg - Sets 16 specific channels appropriate
- ! for a 1-degree model, as used in CM2G.
- ! list - Read the channel locations and widths from a
- ! text file, like MOM_channel_list in the MOM_SIS
- ! test case.
- ! file - Read open face widths everywhere from a
- ! NetCDF file on the model grid.
-CHANNEL_LIST_FILE = "MOM_channels_global_025" ! default = "MOM_channel_list"
- ! The file from which the list of narrowed channels is read.
-
-! === module MOM_verticalGrid ===
-! Parameters providing information about the vertical grid.
-NK = 75 ! [nondim]
- ! The number of model layers.
-
-! === module MOM_tracer_registry ===
-
-! === module MOM_EOS ===
-DTFREEZE_DP = -7.75E-08 ! [deg C Pa-1] default = 0.0
- ! When TFREEZE_FORM=LINEAR, this is the derivative of the freezing potential
- ! temperature with pressure.
-
-! === module MOM_restart ===
-PARALLEL_RESTARTFILES = True ! [Boolean] default = False
- ! If true, each processor writes its own restart file, otherwise a single
- ! restart file is generated
-
-! === module MOM_tracer_flow_control ===
-USE_IDEAL_AGE_TRACER = False ! [Boolean] default = False
- ! If true, use the ideal_age_example tracer package.
-
-! === module ideal_age_example ===
-
-! === module MOM_coord_initialization ===
-COORD_CONFIG = "file" !
- ! This specifies how layers are to be defined:
- ! ALE or none - used to avoid defining layers in ALE mode
- ! file - read coordinate information from the file
- ! specified by (COORD_FILE).
- ! BFB - Custom coords for buoyancy-forced basin case
- ! based on SST_S, T_BOT and DRHO_DT.
- ! linear - linear based on interfaces not layers
- ! layer_ref - linear based on layer densities
- ! ts_ref - use reference temperature and salinity
- ! ts_range - use range of temperature and salinity
- ! (T_REF and S_REF) to determine surface density
- ! and GINT calculate internal densities.
- ! gprime - use reference density (RHO_0) for surface
- ! density and GINT calculate internal densities.
- ! ts_profile - use temperature and salinity profiles
- ! (read from COORD_FILE) to set layer densities.
- ! USER - call a user modified routine.
-COORD_FILE = "layer_coord.nc" !
- ! The file from which the coordinate densities are read.
-REMAP_UV_USING_OLD_ALG = True ! [Boolean] default = True
- ! If true, uses the old remapping-via-a-delta-z method for remapping u and v. If
- ! false, uses the new method that remaps between grids described by an old and
- ! new thickness.
-REGRIDDING_COORDINATE_MODE = "HYCOM1" ! default = "LAYER"
- ! Coordinate mode for vertical regridding. Choose among the following
- ! possibilities: LAYER - Isopycnal or stacked shallow water layers
- ! ZSTAR, Z* - stretched geopotential z*
- ! SIGMA_SHELF_ZSTAR - stretched geopotential z* ignoring shelf
- ! SIGMA - terrain following coordinates
- ! RHO - continuous isopycnal
- ! HYCOM1 - HyCOM-like hybrid coordinate
- ! SLIGHT - stretched coordinates above continuous isopycnal
- ! ADAPTIVE - optimize for smooth neutral density surfaces
-BOUNDARY_EXTRAPOLATION = True ! [Boolean] default = False
- ! When defined, a proper high-order reconstruction scheme is used within
- ! boundary cells rather than PCM. E.g., if PPM is used for remapping, a PPM
- ! reconstruction will also be used within boundary cells.
-ALE_COORDINATE_CONFIG = "HYBRID:hycom1_75_800m.nc,sigma2,FNC1:2,4000,4.5,.01" ! default = "UNIFORM"
- ! Determines how to specify the coordinate resolution. Valid options are:
- ! PARAM - use the vector-parameter ALE_RESOLUTION
- ! UNIFORM[:N] - uniformly distributed
- ! FILE:string - read from a file. The string specifies
- ! the filename and variable name, separated
- ! by a comma or space, e.g. FILE:lev.nc,dz
- ! or FILE:lev.nc,interfaces=zw
- ! WOA09[:N] - the WOA09 vertical grid (approximately)
- ! FNC1:string - FNC1:dz_min,H_total,power,precision
- ! HYBRID:string - read from a file. The string specifies
- ! the filename and two variable names, separated
- ! by a comma or space, for sigma-2 and dz. e.g.
- ! HYBRID:vgrid.nc,sigma2,dz
-!ALE_RESOLUTION = 7*2.0, 2*2.01, 2.02, 2.03, 2.05, 2.08, 2.11, 2.15, 2.21, 2.2800000000000002, 2.37, 2.48, 2.61, 2.77, 2.95, 3.17, 3.4299999999999997, 3.74, 4.09, 4.49, 4.95, 5.48, 6.07, 6.74, 7.5, 8.34, 9.280000000000001, 10.33, 11.49, 12.77, 14.19, 15.74, 17.450000000000003, 19.31, 21.35, 23.56, 25.97, 28.580000000000002, 31.41, 34.47, 37.77, 41.32, 45.14, 49.25, 53.65, 58.370000000000005, 63.42, 68.81, 74.56, 80.68, 87.21000000000001, 94.14, 101.51, 109.33, 117.62, 126.4, 135.68, 145.5, 155.87, 166.81, 178.35, 190.51, 203.31, 216.78, 230.93, 245.8, 261.42, 277.83 ! [m]
- ! The distribution of vertical resolution for the target
- ! grid used for Eulerian-like coordinates. For example,
- ! in z-coordinate mode, the parameter is a list of level
- ! thicknesses (in m). In sigma-coordinate mode, the list
- ! is of non-dimensional fractions of the water column.
-!TARGET_DENSITIES = 1010.0, 1014.3034, 1017.8088, 1020.843, 1023.5566, 1025.813, 1027.0275, 1027.9114, 1028.6422, 1029.2795, 1029.852, 1030.3762, 1030.8626, 1031.3183, 1031.7486, 1032.1572, 1032.5471, 1032.9207, 1033.2798, 1033.6261, 1033.9608, 1034.2519, 1034.4817, 1034.6774, 1034.8508, 1035.0082, 1035.1533, 1035.2886, 1035.4159, 1035.5364, 1035.6511, 1035.7608, 1035.8661, 1035.9675, 1036.0645, 1036.1554, 1036.2411, 1036.3223, 1036.3998, 1036.4739, 1036.5451, 1036.6137, 1036.68, 1036.7441, 1036.8062, 1036.8526, 1036.8874, 1036.9164, 1036.9418, 1036.9647, 1036.9857, 1037.0052, 1037.0236, 1037.0409, 1037.0574, 1037.0738, 1037.0902, 1037.1066, 1037.123, 1037.1394, 1037.1558, 1037.1722, 1037.1887, 1037.206, 1037.2241, 1037.2435, 1037.2642, 1037.2866, 1037.3112, 1037.3389, 1037.3713, 1037.4118, 1037.475, 1037.6332, 1037.8104, 1038.0 ! [m]
- ! HYBRID target densities for interfaces
-REGRID_COMPRESSIBILITY_FRACTION = 0.01 ! [nondim] default = 0.0
- ! When interpolating potential density profiles we can add some artificial
- ! compressibility solely to make homogeneous regions appear stratified.
-MAXIMUM_INT_DEPTH_CONFIG = "FNC1:5,8000.0,1.0,.01" ! default = "NONE"
- ! Determines how to specify the maximum interface depths.
- ! Valid options are:
- ! NONE - there are no maximum interface depths
- ! PARAM - use the vector-parameter MAXIMUM_INTERFACE_DEPTHS
- ! FILE:string - read from a file. The string specifies
- ! the filename and variable name, separated
- ! by a comma or space, e.g. FILE:lev.nc,Z
- ! FNC1:string - FNC1:dz_min,H_total,power,precision
-!MAXIMUM_INT_DEPTHS = 0.0, 5.0, 12.75, 23.25, 36.49, 52.480000000000004, 71.22, 92.71000000000001, 116.94000000000001, 143.92000000000002, 173.65, 206.13, 241.36, 279.33000000000004, 320.05000000000007, 363.5200000000001, 409.7400000000001, 458.7000000000001, 510.4100000000001, 564.8700000000001, 622.0800000000002, 682.0300000000002, 744.7300000000002, 810.1800000000003, 878.3800000000003, 949.3300000000004, 1023.0200000000004, 1099.4600000000005, 1178.6500000000005, 1260.5900000000006, 1345.2700000000007, 1432.7000000000007, 1522.8800000000008, 1615.8100000000009, 1711.490000000001, 1809.910000000001, 1911.080000000001, 2015.0000000000011, 2121.670000000001, 2231.080000000001, 2343.2400000000007, 2458.1500000000005, 2575.8100000000004, 2696.2200000000003, 2819.3700000000003, 2945.2700000000004, 3073.9200000000005, 3205.3200000000006, 3339.4600000000005, 3476.3500000000004, 3615.9900000000002, 3758.38, 3903.52, 4051.4, 4202.03, 4355.41, 4511.54, 4670.41, 4832.03, 4996.4, 5163.5199999999995, 5333.379999999999, 5505.989999999999, 5681.3499999999985, 5859.459999999998, 6040.319999999998, 6223.919999999998, 6410.269999999999, 6599.369999999999, 6791.219999999999, 6985.8099999999995, 7183.15, 7383.24, 7586.08, 7791.67, 8000.0
- ! The list of maximum depths for each interface.
-MAX_LAYER_THICKNESS_CONFIG = "FNC1:400,31000.0,0.1,.01" ! default = "NONE"
- ! Determines how to specify the maximum layer thicknesses.
- ! Valid options are:
- ! NONE - there are no maximum layer thicknesses
- ! PARAM - use the vector-parameter MAX_LAYER_THICKNESS
- ! FILE:string - read from a file. The string specifies
- ! the filename and variable name, separated
- ! by a comma or space, e.g. FILE:lev.nc,Z
- ! FNC1:string - FNC1:dz_min,H_total,power,precision
-!MAX_LAYER_THICKNESS = 400.0, 409.63, 410.32, 410.75, 411.07, 411.32, 411.52, 411.7, 411.86, 412.0, 412.13, 412.24, 412.35, 412.45, 412.54, 412.63, 412.71, 412.79, 412.86, 412.93, 413.0, 413.06, 413.12, 413.18, 413.24, 413.29, 413.34, 413.39, 413.44, 413.49, 413.54, 413.58, 413.62, 413.67, 413.71, 413.75, 413.78, 413.82, 413.86, 413.9, 413.93, 413.97, 414.0, 414.03, 414.06, 414.1, 414.13, 414.16, 414.19, 414.22, 414.24, 414.27, 414.3, 414.33, 414.35, 414.38, 414.41, 414.43, 414.46, 414.48, 414.51, 414.53, 414.55, 414.58, 414.6, 414.62, 414.65, 414.67, 414.69, 414.71, 414.73, 414.75, 414.77, 414.79, 414.83 ! [m]
- ! The list of maximum thickness for each layer.
-REMAPPING_SCHEME = "PPM_H4" ! default = "PLM"
- ! This sets the reconstruction scheme used for vertical remapping for all
- ! variables. It can be one of the following schemes: PCM (1st-order
- ! accurate)
- ! PLM (2nd-order accurate)
- ! PPM_H4 (3rd-order accurate)
- ! PPM_IH4 (3rd-order accurate)
- ! PQM_IH4IH3 (4th-order accurate)
- ! PQM_IH6IH5 (5th-order accurate)
-
-! === module MOM_grid ===
-! Parameters providing information about the lateral grid.
-
-! === module MOM_state_initialization ===
-INIT_LAYERS_FROM_Z_FILE = True ! [Boolean] default = False
- ! If true, initialize the layer thicknesses, temperatures, and salinities from a
- ! Z-space file on a latitude-longitude grid.
-
-! === module MOM_initialize_layers_from_Z ===
-TEMP_SALT_Z_INIT_FILE = "MOM6_IC_TS.nc" ! default = "temp_salt_z.nc"
- ! The name of the z-space input file used to initialize
- ! temperatures (T) and salinities (S). If T and S are not
- ! in the same file, TEMP_Z_INIT_FILE and SALT_Z_INIT_FILE
- ! must be set.
-Z_INIT_FILE_PTEMP_VAR = "temp" ! default = "ptemp"
- ! The name of the potential temperature variable in
- ! TEMP_Z_INIT_FILE.
-Z_INIT_FILE_SALT_VAR = "salt" ! default = "salt"
- ! The name of the salinity variable in
- ! SALT_Z_INIT_FILE.
-
-Z_INIT_ALE_REMAPPING = True ! [Boolean] default = False
- ! If True, then remap straight to model coordinate from file.
-Z_INIT_REMAP_OLD_ALG = True ! [Boolean] default = True
- ! If false, uses the preferred remapping algorithm for initialization. If true,
- ! use an older, less robust algorithm for remapping.
-
-! === module MOM_diag_mediator ===
-!Jiande NUM_DIAG_COORDS = 2 ! default = 1
-NUM_DIAG_COORDS = 1
- ! The number of diagnostic vertical coordinates to use.
- ! For each coordinate, an entry in DIAG_COORDS must be provided.
-!Jiande DIAG_COORDS = "z Z ZSTAR", "rho2 RHO2 RHO" !
-DIAG_COORDS = "z Z ZSTAR"
- ! A list of string tuples associating diag_table modules to
- ! a coordinate definition used for diagnostics. Each string
- ! is of the form "MODULE_SUFFIX,PARAMETER_SUFFIX,COORDINATE_NAME".
-DIAG_COORD_DEF_Z="FILE:@[MOM6_DIAG_COORD_DEF_Z_FILE],interfaces=zw"
-DIAG_MISVAL = @[MOM6_DIAG_MISVAL]
-!DIAG_COORD_DEF_RHO2 = "FILE:diag_rho2.nc,interfaces=rho2" ! default = "WOA09"
- ! Determines how to specify the coordinate resolution. Valid options are:
- ! PARAM - use the vector-parameter DIAG_COORD_RES_RHO2
- ! UNIFORM[:N] - uniformly distributed
- ! FILE:string - read from a file. The string specifies
- ! the filename and variable name, separated
- ! by a comma or space, e.g. FILE:lev.nc,dz
- ! or FILE:lev.nc,interfaces=zw
- ! WOA09[:N] - the WOA09 vertical grid (approximately)
- ! FNC1:string - FNC1:dz_min,H_total,power,precision
- ! HYBRID:string - read from a file. The string specifies
- ! the filename and two variable names, separated
- ! by a comma or space, for sigma-2 and dz. e.g.
- ! HYBRID:vgrid.nc,sigma2,dz
-
-! === module MOM_MEKE ===
-USE_MEKE = True ! [Boolean] default = False
- ! If true, turns on the MEKE scheme which calculates a sub-grid mesoscale eddy
- ! kinetic energy budget.
-MEKE_GMCOEFF = 1.0 ! [nondim] default = -1.0
- ! The efficiency of the conversion of potential energy into MEKE by the
- ! thickness mixing parameterization. If MEKE_GMCOEFF is negative, this
- ! conversion is not used or calculated.
-MEKE_BGSRC = 1.0E-13 ! [W kg-1] default = 0.0
- ! A background energy source for MEKE.
-MEKE_KHMEKE_FAC = 1.0 ! [nondim] default = 0.0
- ! A factor that maps MEKE%Kh to Kh for MEKE itself.
-MEKE_ALPHA_RHINES = 0.15 ! [nondim] default = 0.05
- ! If positive, is a coefficient weighting the Rhines scale in the expression for
- ! mixing length used in MEKE-derived diffusivity.
-MEKE_ALPHA_EADY = 0.15 ! [nondim] default = 0.05
- ! If positive, is a coefficient weighting the Eady length scale in the
- ! expression for mixing length used in MEKE-derived diffusivity.
-
-! === module MOM_lateral_mixing_coeffs ===
-USE_VARIABLE_MIXING = True ! [Boolean] default = False
- ! If true, the variable mixing code will be called. This allows diagnostics to
- ! be created even if the scheme is not used. If KHTR_SLOPE_CFF>0 or
- ! KhTh_Slope_Cff>0, this is set to true regardless of what is in the parameter
- ! file.
-RESOLN_SCALED_KH = True ! [Boolean] default = False
- ! If true, the Laplacian lateral viscosity is scaled away when the first
- ! baroclinic deformation radius is well resolved.
-RESOLN_SCALED_KHTH = True ! [Boolean] default = False
- ! If true, the interface depth diffusivity is scaled away when the first
- ! baroclinic deformation radius is well resolved.
-KHTR_SLOPE_CFF = 0.25 ! [nondim] default = 0.0
- ! The nondimensional coefficient in the Visbeck formula for the epipycnal tracer
- ! diffusivity
-USE_STORED_SLOPES = True ! [Boolean] default = False
- ! If true, the isopycnal slopes are calculated once and stored for re-use. This
- ! uses more memory but avoids calling the equation of state more times than
- ! should be necessary.
-INTERPOLATE_RES_FN = False ! [Boolean] default = True
- ! If true, interpolate the resolution function to the velocity points from the
- ! thickness points; otherwise interpolate the wave speed and calculate the
- ! resolution function independently at each point.
-GILL_EQUATORIAL_LD = True ! [Boolean] default = False
- ! If true, uses Gill's definition of the baroclinic equatorial deformation
- ! radius, otherwise, if false, use Pedlosky's definition. These definitions
- ! differ by a factor of 2 in front of the beta term in the denominator. Gill's
- ! is the more appropriate definition.
-INTERNAL_WAVE_SPEED_BETTER_EST = False ! [Boolean] default = True
- ! If true, use a more robust estimate of the first mode wave speed as the
- ! starting point for iterations.
-
-! === module MOM_set_visc ===
-CHANNEL_DRAG = True ! [Boolean] default = False
- ! If true, the bottom drag is exerted directly on each layer proportional to the
- ! fraction of the bottom it overlies.
-PRANDTL_TURB = 1.25 ! [nondim] default = 1.0
- ! The turbulent Prandtl number applied to shear instability.
-HBBL = 10.0 ! [m]
- ! The thickness of a bottom boundary layer with a viscosity of KVBBL if
- ! BOTTOMDRAGLAW is not defined, or the thickness over which near-bottom
- ! velocities are averaged for the drag law if BOTTOMDRAGLAW is defined but
- ! LINEAR_DRAG is not.
-DRAG_BG_VEL = 0.1 ! [m s-1] default = 0.0
- ! DRAG_BG_VEL is either the assumed bottom velocity (with LINEAR_DRAG) or an
- ! unresolved velocity that is combined with the resolved velocity to estimate
- ! the velocity magnitude. DRAG_BG_VEL is only used when BOTTOMDRAGLAW is
- ! defined.
-BBL_USE_EOS = True ! [Boolean] default = False
- ! If true, use the equation of state in determining the properties of the bottom
- ! boundary layer. Otherwise use the layer target potential densities.
-BBL_THICK_MIN = 0.1 ! [m] default = 0.0
- ! The minimum bottom boundary layer thickness that can be used with
- ! BOTTOMDRAGLAW. This might be Kv/(cdrag*drag_bg_vel) to give Kv as the minimum
- ! near-bottom viscosity.
-KV = 1.0E-04 ! [m2 s-1]
- ! The background kinematic viscosity in the interior. The molecular value, ~1e-6
- ! m2 s-1, may be used.
-KV_BBL_MIN = 0.0 ! [m2 s-1] default = 1.0E-04
- ! The minimum viscosities in the bottom boundary layer.
-KV_TBL_MIN = 0.0 ! [m2 s-1] default = 1.0E-04
- ! The minimum viscosities in the top boundary layer.
-
-! === module MOM_thickness_diffuse ===
-KHTH_MAX_CFL = 0.1 ! [nondimensional] default = 0.8
- ! The maximum value of the local diffusive CFL ratio that is permitted for the
- ! thickness diffusivity. 1.0 is the marginally unstable value in a pure layered
- ! model, but much smaller numbers (e.g. 0.1) seem to work better for ALE-based
- ! models.
-USE_GM_WORK_BUG = True ! [Boolean] default = True
- ! If true, compute the top-layer work tendency on the u-grid with the incorrect
- ! sign, for legacy reproducibility.
-
-! === module MOM_continuity ===
-
-! === module MOM_continuity_PPM ===
-ETA_TOLERANCE = 1.0E-06 ! [m] default = 3.75E-09
- ! The tolerance for the differences between the barotropic and baroclinic
- ! estimates of the sea surface height due to the fluxes through each face. The
- ! total tolerance for SSH is 4 times this value. The default is
- ! 0.5*NK*ANGSTROM, and this should not be set less than about
- ! 10^-15*MAXIMUM_DEPTH.
-ETA_TOLERANCE_AUX = 0.001 ! [m] default = 1.0E-06
- ! The tolerance for free-surface height discrepancies between the barotropic
- ! solution and the sum of the layer thicknesses when calculating the auxiliary
- ! corrected velocities. By default, this is the same as ETA_TOLERANCE, but can
- ! be made larger for efficiency.
-
-! === module MOM_CoriolisAdv ===
-CORIOLIS_SCHEME = "SADOURNY75_ENSTRO" ! default = "SADOURNY75_ENERGY"
- ! CORIOLIS_SCHEME selects the discretization for the Coriolis terms. Valid
- ! values are:
- ! SADOURNY75_ENERGY - Sadourny, 1975; energy cons.
- ! ARAKAWA_HSU90 - Arakawa & Hsu, 1990
- ! SADOURNY75_ENSTRO - Sadourny, 1975; enstrophy cons.
- ! ARAKAWA_LAMB81 - Arakawa & Lamb, 1981; En. + Enst.
- ! ARAKAWA_LAMB_BLEND - A blend of Arakawa & Lamb with
- ! Arakawa & Hsu and Sadourny energy
-BOUND_CORIOLIS = True ! [Boolean] default = False
- ! If true, the Coriolis terms at u-points are bounded by the four estimates of
- ! (f+rv)v from the four neighboring v-points, and similarly at v-points. This
- ! option would have no effect on the SADOURNY Coriolis scheme if it were
- ! possible to use centered difference thickness fluxes.
-
-! === module MOM_PressureForce ===
-
-! === module MOM_PressureForce_AFV ===
-MASS_WEIGHT_IN_PRESSURE_GRADIENT = True ! [Boolean] default = False
- ! If true, use mass weighting when interpolating T/S for integrals near the
- ! bathymetry in AFV pressure gradient calculations.
-
-! === module MOM_hor_visc ===
-LAPLACIAN = True ! [Boolean] default = False
- ! If true, use a Laplacian horizontal viscosity.
-AH_VEL_SCALE = 0.01 ! [m s-1] default = 0.0
- ! The velocity scale which is multiplied by the cube of the grid spacing to
- ! calculate the biharmonic viscosity. The final viscosity is the largest of this
- ! scaled viscosity, the Smagorinsky and Leith viscosities, and AH.
-SMAGORINSKY_AH = True ! [Boolean] default = False
- ! If true, use a biharmonic Smagorinsky nonlinear eddy viscosity.
-SMAG_BI_CONST = 0.06 ! [nondim] default = 0.0
- ! The nondimensional biharmonic Smagorinsky constant, typically 0.015 - 0.06.
-USE_LAND_MASK_FOR_HVISC = False ! [Boolean] default = False
- ! If true, use Use the land mask for the computation of thicknesses at velocity
- ! locations. This eliminates the dependence on arbitrary values over land or
- ! outside of the domain. Default is False in order to maintain answers with
- ! legacy experiments but should be changed to True for new experiments.
-
-! === module MOM_vert_friction ===
-HMIX_FIXED = 0.5 ! [m]
- ! The prescribed depth over which the near-surface viscosity and diffusivity are
- ! elevated when the bulk mixed layer is not used.
-KVML = 1.0E-04 ! [m2 s-1] default = 1.0E-04
- ! The kinematic viscosity in the mixed layer. A typical value is ~1e-2 m2 s-1.
- ! KVML is not used if BULKMIXEDLAYER is true. The default is set by KV.
-MAXVEL = 6.0 ! [m s-1] default = 3.0E+08
- ! The maximum velocity allowed before the velocity components are truncated.
-
-! === module MOM_PointAccel ===
-U_TRUNC_FILE = "U_velocity_truncations" ! default = ""
- ! The absolute path to a file into which the accelerations leading to zonal
- ! velocity truncations are written. Undefine this for efficiency if this
- ! diagnostic is not needed.
-V_TRUNC_FILE = "V_velocity_truncations" ! default = ""
- ! The absolute path to a file into which the accelerations leading to meridional
- ! velocity truncations are written. Undefine this for efficiency if this
- ! diagnostic is not needed.
-
-! === module MOM_barotropic ===
-BOUND_BT_CORRECTION = True ! [Boolean] default = False
- ! If true, the corrective pseudo mass-fluxes into the barotropic solver are
- ! limited to values that require less than maxCFL_BT_cont to be accommodated.
-BT_PROJECT_VELOCITY = True ! [Boolean] default = False
- ! If true, step the barotropic velocity first and project out the velocity
- ! tendency by 1+BEBT when calculating the transport. The default (false) is to
- ! use a predictor continuity step to find the pressure field, and then to do a
- ! corrector continuity step using a weighted average of the old and new
- ! velocities, with weights of (1-BEBT) and BEBT.
-DYNAMIC_SURFACE_PRESSURE = True ! [Boolean] default = False
- ! If true, add a dynamic pressure due to a viscous ice shelf, for instance.
-BEBT = 0.2 ! [nondim] default = 0.1
- ! BEBT determines whether the barotropic time stepping uses the forward-backward
- ! time-stepping scheme or a backward Euler scheme. BEBT is valid in the range
- ! from 0 (for a forward-backward treatment of nonrotating gravity waves) to 1
- ! (for a backward Euler treatment). In practice, BEBT must be greater than about
- ! 0.05.
-DTBT = -0.9 ! [s or nondim] default = -0.98
- ! The barotropic time step, in s. DTBT is only used with the split explicit time
- ! stepping. To set the time step automatically based the maximum stable value
- ! use 0, or a negative value gives the fraction of the stable value. Setting
- ! DTBT to 0 is the same as setting it to -0.98. The value of DTBT that will
- ! actually be used is an integer fraction of DT, rounding down.
-BT_USE_OLD_CORIOLIS_BRACKET_BUG = True ! [Boolean] default = False
- ! If True, use an order of operations that is not bitwise rotationally symmetric
- ! in the meridional Coriolis term of the barotropic solver.
-
-! === module MOM_mixed_layer_restrat ===
-MIXEDLAYER_RESTRAT = True ! [Boolean] default = False
- ! If true, a density-gradient dependent re-stratifying flow is imposed in the
- ! mixed layer. Can be used in ALE mode without restriction but in layer mode can
- ! only be used if BULKMIXEDLAYER is true.
-FOX_KEMPER_ML_RESTRAT_COEF = 1.0 ! [nondim] default = 0.0
- ! A nondimensional coefficient that is proportional to the ratio of the
- ! deformation radius to the dominant lengthscale of the submesoscale mixed layer
- ! instabilities, times the minimum of the ratio of the mesoscale eddy kinetic
- ! energy to the large-scale geostrophic kinetic energy or 1 plus the square of
- ! the grid spacing over the deformation radius, as detailed by Fox-Kemper et al.
- ! (2010)
-MLE_FRONT_LENGTH = 500.0 ! [m] default = 0.0
- ! If non-zero, is the frontal-length scale used to calculate the upscaling of
- ! buoyancy gradients that is otherwise represented by the parameter
- ! FOX_KEMPER_ML_RESTRAT_COEF. If MLE_FRONT_LENGTH is non-zero, it is recommended
- ! to set FOX_KEMPER_ML_RESTRAT_COEF=1.0.
-MLE_USE_PBL_MLD = True ! [Boolean] default = False
- ! If true, the MLE parameterization will use the mixed-layer depth provided by
- ! the active PBL parameterization. If false, MLE will estimate a MLD based on a
- ! density difference with the surface using the parameter MLE_DENSITY_DIFF.
-MLE_MLD_DECAY_TIME = 2.592E+06 ! [s] default = 0.0
- ! The time-scale for a running-mean filter applied to the mixed-layer depth used
- ! in the MLE restratification parameterization. When the MLD deepens below the
- ! current running-mean the running-mean is instantaneously set to the current
- ! MLD.
-
-! === module MOM_diabatic_driver ===
-! The following parameters are used for diabatic processes.
-ENERGETICS_SFC_PBL = True ! [Boolean] default = False
- ! If true, use an implied energetics planetary boundary layer scheme to
- ! determine the diffusivity and viscosity in the surface boundary layer.
-EPBL_IS_ADDITIVE = False ! [Boolean] default = True
- ! If true, the diffusivity from ePBL is added to all other diffusivities.
- ! Otherwise, the larger of kappa-shear and ePBL diffusivities are used.
-
-! === module MOM_CVMix_KPP ===
-! This is the MOM wrapper to CVMix:KPP
-! See http://cvmix.github.io/
-
-! === module MOM_tidal_mixing ===
-! Vertical Tidal Mixing Parameterization
-INT_TIDE_DISSIPATION = True ! [Boolean] default = False
- ! If true, use an internal tidal dissipation scheme to drive diapycnal mixing,
- ! along the lines of St. Laurent et al. (2002) and Simmons et al. (2004).
-INT_TIDE_PROFILE = "POLZIN_09" ! default = "STLAURENT_02"
- ! INT_TIDE_PROFILE selects the vertical profile of energy dissipation with
- ! INT_TIDE_DISSIPATION. Valid values are:
- ! STLAURENT_02 - Use the St. Laurent et al exponential
- ! decay profile.
- ! POLZIN_09 - Use the Polzin WKB-stretched algebraic
- ! decay profile.
-INT_TIDE_DECAY_SCALE = 300.3003003003003 ! [m] default = 500.0
- ! The decay scale away from the bottom for tidal TKE with the new coding when
- ! INT_TIDE_DISSIPATION is used.
-KAPPA_ITIDES = 6.28319E-04 ! [m-1] default = 6.283185307179586E-04
- ! A topographic wavenumber used with INT_TIDE_DISSIPATION. The default is 2pi/10
- ! km, as in St.Laurent et al. 2002.
-KAPPA_H2_FACTOR = 0.84 ! [nondim] default = 1.0
- ! A scaling factor for the roughness amplitude with INT_TIDE_DISSIPATION.
-TKE_ITIDE_MAX = 0.1 ! [W m-2] default = 1000.0
- ! The maximum internal tide energy source available to mix above the bottom
- ! boundary layer with INT_TIDE_DISSIPATION.
-READ_TIDEAMP = True ! [Boolean] default = False
- ! If true, read a file (given by TIDEAMP_FILE) containing the tidal amplitude
- ! with INT_TIDE_DISSIPATION.
-TIDEAMP_FILE = "tidal_amplitude.v20140616.nc" ! default = "tideamp.nc"
- ! The path to the file containing the spatially varying tidal amplitudes with
- ! INT_TIDE_DISSIPATION.
-H2_FILE = "ocean_topog.nc" !
- ! The path to the file containing the sub-grid-scale topographic roughness
- ! amplitude with INT_TIDE_DISSIPATION.
-
-! === module MOM_CVMix_conv ===
-! Parameterization of enhanced mixing due to convection via CVMix
-
-! === module MOM_geothermal ===
-GEOTHERMAL_SCALE = 1.0 ! [W m-2 or various] default = 0.0
- ! The constant geothermal heat flux, a rescaling factor for the heat flux read
- ! from GEOTHERMAL_FILE, or 0 to disable the geothermal heating.
-GEOTHERMAL_FILE = "geothermal_davies2013_v1.nc" ! default = ""
- ! The file from which the geothermal heating is to be read, or blank to use a
- ! constant heating rate.
-GEOTHERMAL_VARNAME = "geothermal_hf" ! default = "geo_heat"
- ! The name of the geothermal heating variable in GEOTHERMAL_FILE.
-
-! === module MOM_set_diffusivity ===
-BBL_MIXING_AS_MAX = False ! [Boolean] default = True
- ! If true, take the maximum of the diffusivity from the BBL mixing and the other
- ! diffusivities. Otherwise, diffusivity from the BBL_mixing is simply added.
-USE_LOTW_BBL_DIFFUSIVITY = True ! [Boolean] default = False
- ! If true, uses a simple, imprecise but non-coordinate dependent, model of BBL
- ! mixing diffusivity based on Law of the Wall. Otherwise, uses the original BBL
- ! scheme.
-SIMPLE_TKE_TO_KD = True ! [Boolean] default = False
- ! If true, uses a simple estimate of Kd/TKE that will work for arbitrary
- ! vertical coordinates. If false, calculates Kd/TKE and bounds based on exact
- ! energetics for an isopycnal layer-formulation.
-
-! === module MOM_bkgnd_mixing ===
-! Adding static vertical background mixing coefficients
-KD = 1.5E-05 ! [m2 s-1]
- ! The background diapycnal diffusivity of density in the interior. Zero or the
- ! molecular value, ~1e-7 m2 s-1, may be used.
-KD_MIN = 2.0E-06 ! [m2 s-1] default = 1.5E-07
- ! The minimum diapycnal diffusivity.
-HENYEY_IGW_BACKGROUND = True ! [Boolean] default = False
- ! If true, use a latitude-dependent scaling for the near surface background
- ! diffusivity, as described in Harrison & Hallberg, JPO 2008.
-KD_MAX = 0.1 ! [m2 s-1] default = -1.0
- ! The maximum permitted increment for the diapycnal diffusivity from TKE-based
- ! parameterizations, or a negative value for no limit.
-
-! === module MOM_kappa_shear ===
-! Parameterization of shear-driven turbulence following Jackson, Hallberg and Legg, JPO 2008
-USE_JACKSON_PARAM = True ! [Boolean] default = False
- ! If true, use the Jackson-Hallberg-Legg (JPO 2008) shear mixing
- ! parameterization.
-MAX_RINO_IT = 25 ! [nondim] default = 50
- ! The maximum number of iterations that may be used to estimate the Richardson
- ! number driven mixing.
-VERTEX_SHEAR = False ! [Boolean] default = False
- ! If true, do the calculations of the shear-driven mixing
- ! at the cell vertices (i.e., the vorticity points).
-KAPPA_SHEAR_ITER_BUG = True ! [Boolean] default = True
- ! If true, use an older, dimensionally inconsistent estimate of the derivative
- ! of diffusivity with energy in the Newton's method iteration. The bug causes
- ! undercorrections when dz > 1 m.
-KAPPA_SHEAR_ALL_LAYER_TKE_BUG = True ! [Boolean] default = True
- ! If true, report back the latest estimate of TKE instead of the time average
- ! TKE when there is mass in all layers. Otherwise always report the time
- ! averaged TKE, as is currently done when there are some massless layers.
-
-! === module MOM_CVMix_shear ===
-! Parameterization of shear-driven turbulence via CVMix (various options)
-
-! === module MOM_CVMix_ddiff ===
-! Parameterization of mixing due to double diffusion processes via CVMix
-
-! === module MOM_diabatic_aux ===
-! The following parameters are used for auxiliary diabatic processes.
-PRESSURE_DEPENDENT_FRAZIL = False ! [Boolean] default = False
- ! If true, use a pressure dependent freezing temperature when making frazil. The
- ! default is false, which will be faster but is inappropriate with ice-shelf
- ! cavities.
-VAR_PEN_SW = True ! [Boolean] default = False
- ! If true, use one of the CHL_A schemes specified by OPACITY_SCHEME to determine
- ! the e-folding depth of incoming short wave radiation.
-CHL_FILE = @[CHLCLIM] !
- ! CHL_FILE is the file containing chl_a concentrations in the variable CHL_A. It
- ! is used when VAR_PEN_SW and CHL_FROM_FILE are true.
-CHL_VARNAME = "chlor_a" ! default = "CHL_A"
- ! Name of CHL_A variable in CHL_FILE.
-
-! === module MOM_energetic_PBL ===
-ML_OMEGA_FRAC = 0.001 ! [nondim] default = 0.0
- ! When setting the decay scale for turbulence, use this fraction of the absolute
- ! rotation rate blended with the local value of f, as sqrt((1-of)*f^2 +
- ! of*4*omega^2).
-TKE_DECAY = 0.01 ! [nondim] default = 2.5
- ! TKE_DECAY relates the vertical rate of decay of the TKE available for
- ! mechanical entrainment to the natural Ekman depth.
-EPBL_MSTAR_SCHEME = "OM4" ! default = "CONSTANT"
- ! EPBL_MSTAR_SCHEME selects the method for setting mstar. Valid values are:
- ! CONSTANT - Use a fixed mstar given by MSTAR
- ! OM4 - Use L_Ekman/L_Obukhov in the sabilizing limit, as in OM4
- ! REICHL_H18 - Use the scheme documented in Reichl & Hallberg, 2018.
-MSTAR_CAP = 10.0 ! [nondim] default = -1.0
- ! If this value is positive, it sets the maximum value of mstar allowed in ePBL.
- ! (This is not used if EPBL_MSTAR_SCHEME = CONSTANT).
-MSTAR2_COEF1 = 0.29 ! [nondim] default = 0.3
- ! Coefficient in computing mstar when rotation and stabilizing effects are both
- ! important (used if EPBL_MSTAR_SCHEME = OM4).
-MSTAR2_COEF2 = 0.152 ! [nondim] default = 0.085
- ! Coefficient in computing mstar when only rotation limits the total mixing
- ! (used if EPBL_MSTAR_SCHEME = OM4)
-NSTAR = 0.06 ! [nondim] default = 0.2
- ! The portion of the buoyant potential energy imparted by surface fluxes that is
- ! available to drive entrainment at the base of mixed layer when that energy is
- ! positive.
-EPBL_MLD_BISECTION = True ! [Boolean] default = False
- ! If true, use bisection with the iterative determination of the self-consistent
- ! mixed layer depth. Otherwise use the false position after a maximum and
- ! minimum bound have been evaluated and the returned value or bisection before
- ! this.
-MSTAR_CONV_ADJ = 0.667 ! [nondim] default = 0.0
- ! Coefficient used for reducing mstar during convection due to reduction of
- ! stable density gradient.
-USE_MLD_ITERATION = True ! [Boolean] default = False
- ! A logical that specifies whether or not to use the distance to the bottom of
- ! the actively turbulent boundary layer to help set the EPBL length scale.
-EPBL_TRANSITION_SCALE = 0.01 ! [nondim] default = 0.1
- ! A scale for the mixing length in the transition layer at the edge of the
- ! boundary layer as a fraction of the boundary layer thickness.
-MIX_LEN_EXPONENT = 1.0 ! [nondim] default = 2.0
- ! The exponent applied to the ratio of the distance to the MLD and the MLD depth
- ! which determines the shape of the mixing length. This is only used if
- ! USE_MLD_ITERATION is True.
-USE_LA_LI2016 = @[MOM6_USE_LI2016] ! [nondim] default = False
- ! A logical to use the Li et al. 2016 (submitted) formula to determine the
- ! Langmuir number.
-USE_WAVES = @[MOM6_USE_WAVES] ! [Boolean] default = False
- ! If true, enables surface wave modules.
-WAVE_METHOD = "SURFACE_BANDS" ! default = "EMPTY"
- ! Choice of wave method, valid options include:
- ! TEST_PROFILE - Prescribed from surface Stokes drift
- ! and a decay wavelength.
- ! SURFACE_BANDS - Computed from multiple surface values
- ! and decay wavelengths.
- ! DHH85 - Uses Donelan et al. 1985 empirical
- ! wave spectrum with prescribed values.
- ! LF17 - Infers Stokes drift profile from wind
- ! speed following Li and Fox-Kemper 2017.
-SURFBAND_SOURCE = "COUPLER" ! default = "EMPTY"
- ! Choice of SURFACE_BANDS data mode, valid options include:
- ! DATAOVERRIDE - Read from NetCDF using FMS DataOverride.
- ! COUPLER - Look for variables from coupler pass
- ! INPUT - Testing with fixed values.
-STK_BAND_COUPLER = 3 ! default = 1
- ! STK_BAND_COUPLER is the number of Stokes drift bands in the coupler. This has
- ! to be consistent with the number of Stokes drift bands in WW3, or the model
- ! will fail.
-SURFBAND_WAVENUMBERS = 0.04, 0.11, 0.3305 ! [rad/m] default = 0.12566
- ! Central wavenumbers for surface Stokes drift bands.
-EPBL_LANGMUIR_SCHEME = "ADDITIVE" ! default = "NONE"
- ! EPBL_LANGMUIR_SCHEME selects the method for including Langmuir turbulence.
- ! Valid values are:
- ! NONE - Do not do any extra mixing due to Langmuir turbulence
- ! RESCALE - Use a multiplicative rescaling of mstar to account for Langmuir
- ! turbulence
- ! ADDITIVE - Add a Langmuir turblence contribution to mstar to other
- ! contributions
-LT_ENHANCE_COEF = 0.044 ! [nondim] default = 0.447
- ! Coefficient for Langmuir enhancement of mstar
-LT_ENHANCE_EXP = -1.5 ! [nondim] default = -1.33
- ! Exponent for Langmuir enhancementt of mstar
-LT_MOD_LAC1 = 0.0 ! [nondim] default = -0.87
- ! Coefficient for modification of Langmuir number due to MLD approaching Ekman
- ! depth.
-LT_MOD_LAC4 = 0.0 ! [nondim] default = 0.95
- ! Coefficient for modification of Langmuir number due to ratio of Ekman to
- ! stable Obukhov depth.
-LT_MOD_LAC5 = 0.22 ! [nondim] default = 0.95
- ! Coefficient for modification of Langmuir number due to ratio of Ekman to
- ! unstable Obukhov depth.
-
-! === module MOM_regularize_layers ===
-
-! === module MOM_opacity ===
-PEN_SW_NBANDS = 3 ! default = 1
- ! The number of bands of penetrating shortwave radiation.
-
-! === module MOM_tracer_advect ===
-TRACER_ADVECTION_SCHEME = "PPM:H3" ! default = "PLM"
- ! The horizontal transport scheme for tracers:
- ! PLM - Piecewise Linear Method
- ! PPM:H3 - Piecewise Parabolic Method (Huyhn 3rd order)
- ! PPM - Piecewise Parabolic Method (Colella-Woodward)
-
-! === module MOM_tracer_hor_diff ===
-CHECK_DIFFUSIVE_CFL = True ! [Boolean] default = False
- ! If true, use enough iterations the diffusion to ensure that the diffusive
- ! equivalent of the CFL limit is not violated. If false, always use the greater
- ! of 1 or MAX_TR_DIFFUSION_CFL iteration.
-
-! === module MOM_neutral_diffusion ===
-! This module implements neutral diffusion of tracers
-
-! === module MOM_lateral_boundary_diffusion ===
-! This module implements lateral diffusion of tracers near boundaries
-
-! === module MOM_sum_output ===
-MAXTRUNC = 100000 ! [truncations save_interval-1] default = 0
- ! The run will be stopped, and the day set to a very large value if the velocity
- ! is truncated more than MAXTRUNC times between energy saves. Set MAXTRUNC to 0
- ! to stop if there is any truncation of velocities.
-ENERGYSAVEDAYS = 1.00 ! [days] default = 1.0
- ! The interval in units of TIMEUNIT between saves of the energies of the run and
- ! other globally summed diagnostics.
-
-! === module ocean_model_init ===
-
-! === module MOM_oda_incupd ===
-ODA_INCUPD = @[ODA_INCUPD] ! [Boolean] default = False
- ! If true, oda incremental updates will be applied
- ! everywhere in the domain.
-ODA_INCUPD_FILE = "mom6_increment.nc" ! The name of the file with the T,S,h increments.
-
-ODA_TEMPINC_VAR = "Temp" ! default = "ptemp_inc"
- ! The name of the potential temperature inc. variable in
- ! ODA_INCUPD_FILE.
-ODA_SALTINC_VAR = "Salt" ! default = "sal_inc"
- ! The name of the salinity inc. variable in
- ! ODA_INCUPD_FILE.
-ODA_THK_VAR = "h" ! default = "h"
- ! The name of the int. depth inc. variable in
- ! ODA_INCUPD_FILE.
-ODA_INCUPD_UV = true !
-ODA_UINC_VAR = "u" ! default = "u_inc"
- ! The name of the zonal vel. inc. variable in
- ! ODA_INCUPD_UV_FILE.
-ODA_VINC_VAR = "v" ! default = "v_inc"
- ! The name of the meridional vel. inc. variable in
- ! ODA_INCUPD_UV_FILE.
-ODA_INCUPD_NHOURS = @[ODA_INCUPD_NHOURS] ! default=3.0
-
-! === module MOM_surface_forcing ===
-OCEAN_SURFACE_STAGGER = "A" ! default = "C"
- ! A case-insensitive character string to indicate the
- ! staggering of the surface velocity field that is
- ! returned to the coupler. Valid values include
- ! 'A', 'B', or 'C'.
-
-MAX_P_SURF = 0.0 ! [Pa] default = -1.0
- ! The maximum surface pressure that can be exerted by the atmosphere and
- ! floating sea-ice or ice shelves. This is needed because the FMS coupling
- ! structure does not limit the water that can be frozen out of the ocean and the
- ! ice-ocean heat fluxes are treated explicitly. No limit is applied if a
- ! negative value is used.
-WIND_STAGGER = "A" ! default = "C"
- ! A case-insensitive character string to indicate the
- ! staggering of the input wind stress field. Valid
- ! values are 'A', 'B', or 'C'.
-CD_TIDES = 0.0018 ! [nondim] default = 1.0E-04
- ! The drag coefficient that applies to the tides.
-GUST_CONST = 0.0 ! [Pa] default = 0.02
- ! The background gustiness in the winds.
-FIX_USTAR_GUSTLESS_BUG = False ! [Boolean] default = False
- ! If true correct a bug in the time-averaging of the gustless wind friction
- ! velocity
-USE_RIGID_SEA_ICE = True ! [Boolean] default = False
- ! If true, sea-ice is rigid enough to exert a nonhydrostatic pressure that
- ! resist vertical motion.
-SEA_ICE_RIGID_MASS = 100.0 ! [kg m-2] default = 1000.0
- ! The mass of sea-ice per unit area at which the sea-ice starts to exhibit
- ! rigidity
-LIQUID_RUNOFF_FROM_DATA = @[MOM6_RIVER_RUNOFF] ! [Boolean] default = False
- ! If true, allows liquid river runoff to be specified via
- ! the data_table using the component name 'OCN'.
-! === module ocean_stochastics ===
-DO_SPPT = @[DO_OCN_SPPT] ! [Boolean] default = False
- ! If true perturb the diabatic tendencies in MOM_diabatic_driver
-PERT_EPBL = @[PERT_EPBL] ! [Boolean] default = False
- ! If true perturb the KE dissipation and destruction in MOM_energetic_PBL
-! === module MOM_restart ===
-RESTART_CHECKSUMS_REQUIRED = False
-! === module MOM_file_parser ===
diff --git a/parm/ufs/mom6/MOM_input_template_050 b/parm/ufs/mom6/MOM_input_template_050
deleted file mode 100644
index 4c39198c02..0000000000
--- a/parm/ufs/mom6/MOM_input_template_050
+++ /dev/null
@@ -1,947 +0,0 @@
-! This input file provides the adjustable run-time parameters for version 6 of the Modular Ocean Model (MOM6).
-! Where appropriate, parameters use usually given in MKS units.
-
-! This particular file is for the example in ice_ocean_SIS2/OM4_05.
-
-! This MOM_input file typically contains only the non-default values that are needed to reproduce this example.
-! A full list of parameters for this example can be found in the corresponding MOM_parameter_doc.all file
-! which is generated by the model at run-time.
-! === module MOM_domains ===
-TRIPOLAR_N = True ! [Boolean] default = False
- ! Use tripolar connectivity at the northern edge of the domain. With
- ! TRIPOLAR_N, NIGLOBAL must be even.
-NIGLOBAL = @[NX_GLB] !
- ! The total number of thickness grid points in the x-direction in the physical
- ! domain. With STATIC_MEMORY_ this is set in MOM_memory.h at compile time.
-NJGLOBAL = @[NY_GLB] !
- ! The total number of thickness grid points in the y-direction in the physical
- ! domain. With STATIC_MEMORY_ this is set in MOM_memory.h at compile time.
-NIHALO = 4 ! default = 4
- ! The number of halo points on each side in the x-direction. With
- ! STATIC_MEMORY_ this is set as NIHALO_ in MOM_memory.h at compile time; without
- ! STATIC_MEMORY_ the default is NIHALO_ in MOM_memory.h (if defined) or 2.
-NJHALO = 4 ! default = 4
- ! The number of halo points on each side in the y-direction. With
- ! STATIC_MEMORY_ this is set as NJHALO_ in MOM_memory.h at compile time; without
- ! STATIC_MEMORY_ the default is NJHALO_ in MOM_memory.h (if defined) or 2.
-! LAYOUT = 21, 20 !
- ! The processor layout that was actually used.
-! IO_LAYOUT = 1, 1 ! default = 1
- ! The processor layout to be used, or 0,0 to automatically set the io_layout to
- ! be the same as the layout.
-
-! === module MOM ===
-USE_REGRIDDING = True ! [Boolean] default = False
- ! If True, use the ALE algorithm (regridding/remapping). If False, use the
- ! layered isopycnal algorithm.
-THICKNESSDIFFUSE = True ! [Boolean] default = False
- ! If true, interface heights are diffused with a coefficient of KHTH.
-THICKNESSDIFFUSE_FIRST = True ! [Boolean] default = False
- ! If true, do thickness diffusion before dynamics. This is only used if
- ! THICKNESSDIFFUSE is true.
-DT = @[DT_DYNAM_MOM6] ! [s]
- ! The (baroclinic) dynamics time step. The time-step that is actually used will
- ! be an integer fraction of the forcing time-step (DT_FORCING in ocean-only mode
- ! or the coupling timestep in coupled mode.)
-DT_THERM = @[DT_THERM_MOM6] ! [s] default = 1800.0
- ! The thermodynamic and tracer advection time step. Ideally DT_THERM should be
- ! an integer multiple of DT and less than the forcing or coupling time-step,
- ! unless THERMO_SPANS_COUPLING is true, in which case DT_THERM can be an integer
- ! multiple of the coupling timestep. By default DT_THERM is set to DT.
-THERMO_SPANS_COUPLING = @[MOM6_THERMO_SPAN] ! [Boolean] default = False
- ! If true, the MOM will take thermodynamic and tracer timesteps that can be
- ! longer than the coupling timestep. The actual thermodynamic timestep that is
- ! used in this case is the largest integer multiple of the coupling timestep
- ! that is less than or equal to DT_THERM.
-HFREEZE = 20.0 ! [m] default = -1.0
- ! If HFREEZE > 0, melt potential will be computed. The actual depth
- ! over which melt potential is computed will be min(HFREEZE, OBLD)
- ! where OBLD is the boundary layer depth. If HFREEZE <= 0 (default)
- ! melt potential will not be computed.
-USE_PSURF_IN_EOS = False ! [Boolean] default = False
- ! If true, always include the surface pressure contributions in equation of
- ! state calculations.
-FRAZIL = True ! [Boolean] default = False
- ! If true, water freezes if it gets too cold, and the accumulated heat deficit
- ! is returned in the surface state. FRAZIL is only used if
- ! ENABLE_THERMODYNAMICS is true.
-DO_GEOTHERMAL = True ! [Boolean] default = False
- ! If true, apply geothermal heating.
-BOUND_SALINITY = True ! [Boolean] default = False
- ! If true, limit salinity to being positive. (The sea-ice model may ask for more
- ! salt than is available and drive the salinity negative otherwise.)
-MIN_SALINITY = 0.01 ! [PPT] default = 0.01
- ! The minimum value of salinity when BOUND_SALINITY=True. The default is 0.01
- ! for backward compatibility but ideally should be 0.
-C_P = 3992.0 ! [J kg-1 K-1] default = 3991.86795711963
- ! The heat capacity of sea water, approximated as a constant. This is only used
- ! if ENABLE_THERMODYNAMICS is true. The default value is from the TEOS-10
- ! definition of conservative temperature.
-CHECK_BAD_SURFACE_VALS = True ! [Boolean] default = False
- ! If true, check the surface state for ridiculous values.
-BAD_VAL_SSH_MAX = 50.0 ! [m] default = 20.0
- ! The value of SSH above which a bad value message is triggered, if
- ! CHECK_BAD_SURFACE_VALS is true.
-BAD_VAL_SSS_MAX = 75.0 ! [PPT] default = 45.0
- ! The value of SSS above which a bad value message is triggered, if
- ! CHECK_BAD_SURFACE_VALS is true.
-BAD_VAL_SST_MAX = 55.0 ! [deg C] default = 45.0
- ! The value of SST above which a bad value message is triggered, if
- ! CHECK_BAD_SURFACE_VALS is true.
-BAD_VAL_SST_MIN = -3.0 ! [deg C] default = -2.1
- ! The value of SST below which a bad value message is triggered, if
- ! CHECK_BAD_SURFACE_VALS is true.
-DEFAULT_2018_ANSWERS = True ! [Boolean] default = True
- ! This sets the default value for the various _2018_ANSWERS parameters.
-WRITE_GEOM = 2 ! default = 1
- ! If =0, never write the geometry and vertical grid files. If =1, write the
- ! geometry and vertical grid files only for a new simulation. If =2, always
- ! write the geometry and vertical grid files. Other values are invalid.
-SAVE_INITIAL_CONDS = False ! [Boolean] default = False
- ! If true, write the initial conditions to a file given by IC_OUTPUT_FILE.
-
-! === module MOM_hor_index ===
-! Sets the horizontal array index types.
-
-! === module MOM_fixed_initialization ===
-INPUTDIR = "INPUT" ! default = "."
- ! The directory in which input files are found.
-
-! === module MOM_grid_init ===
-GRID_CONFIG = "mosaic" !
- ! A character string that determines the method for defining the horizontal
- ! grid. Current options are:
- ! mosaic - read the grid from a mosaic (supergrid)
- ! file set by GRID_FILE.
- ! cartesian - use a (flat) Cartesian grid.
- ! spherical - use a simple spherical grid.
- ! mercator - use a Mercator spherical grid.
-GRID_FILE = "ocean_hgrid.nc" !
- ! Name of the file from which to read horizontal grid data.
-GRID_ROTATION_ANGLE_BUGS = False ! [Boolean] default = True
- ! If true, use an older algorithm to calculate the sine and
- ! cosines needed rotate between grid-oriented directions and
- ! true north and east. Differences arise at the tripolar fold
-USE_TRIPOLAR_GEOLONB_BUG = False ! [Boolean] default = True
- ! If true, use older code that incorrectly sets the longitude in some points
- ! along the tripolar fold to be off by 360 degrees.
-TOPO_CONFIG = "file" !
- ! This specifies how bathymetry is specified:
- ! file - read bathymetric information from the file
- ! specified by (TOPO_FILE).
- ! flat - flat bottom set to MAXIMUM_DEPTH.
- ! bowl - an analytically specified bowl-shaped basin
- ! ranging between MAXIMUM_DEPTH and MINIMUM_DEPTH.
- ! spoon - a similar shape to 'bowl', but with an vertical
- ! wall at the southern face.
- ! halfpipe - a zonally uniform channel with a half-sine
- ! profile in the meridional direction.
- ! benchmark - use the benchmark test case topography.
- ! Neverland - use the Neverland test case topography.
- ! DOME - use a slope and channel configuration for the
- ! DOME sill-overflow test case.
- ! ISOMIP - use a slope and channel configuration for the
- ! ISOMIP test case.
- ! DOME2D - use a shelf and slope configuration for the
- ! DOME2D gravity current/overflow test case.
- ! Kelvin - flat but with rotated land mask.
- ! seamount - Gaussian bump for spontaneous motion test case.
- ! dumbbell - Sloshing channel with reservoirs on both ends.
- ! shelfwave - exponential slope for shelfwave test case.
- ! Phillips - ACC-like idealized topography used in the Phillips config.
- ! dense - Denmark Strait-like dense water formation and overflow.
- ! USER - call a user modified routine.
-TOPO_FILE = "ocean_topog.nc" ! default = "topog.nc"
- ! The file from which the bathymetry is read.
-ALLOW_LANDMASK_CHANGES = @[MOM6_ALLOW_LANDMASK_CHANGES] ! default = "False"
- ! If true, allow topography overrides to change ocean points to land
-MAXIMUM_DEPTH = 6500.0 ! [m]
- ! The maximum depth of the ocean.
-MINIMUM_DEPTH = 9.5 ! [m] default = 0.0
- ! If MASKING_DEPTH is unspecified, then anything shallower than MINIMUM_DEPTH is
- ! assumed to be land and all fluxes are masked out. If MASKING_DEPTH is
- ! specified, then all depths shallower than MINIMUM_DEPTH but deeper than
- ! MASKING_DEPTH are rounded to MINIMUM_DEPTH.
-
-! === module MOM_open_boundary ===
-! Controls where open boundaries are located, what kind of boundary condition to impose, and what data to apply,
-! if any.
-MASKING_DEPTH = 0.0 ! [m] default = -9999.0
- ! The depth below which to mask points as land points, for which all fluxes are
- ! zeroed out. MASKING_DEPTH is ignored if negative.
-CHANNEL_CONFIG = "list" ! default = "none"
- ! A parameter that determines which set of channels are
- ! restricted to specific widths. Options are:
- ! none - All channels have the grid width.
- ! global_1deg - Sets 16 specific channels appropriate
- ! for a 1-degree model, as used in CM2G.
- ! list - Read the channel locations and widths from a
- ! text file, like MOM_channel_list in the MOM_SIS
- ! test case.
- ! file - Read open face widths everywhere from a
- ! NetCDF file on the model grid.
-CHANNEL_LIST_FILE = "MOM_channels_global_025" ! default = "MOM_channel_list"
- ! The file from which the list of narrowed channels is read.
-
-! === module MOM_verticalGrid ===
-! Parameters providing information about the vertical grid.
-NK = 75 ! [nondim]
- ! The number of model layers.
-
-! === module MOM_tracer_registry ===
-
-! === module MOM_EOS ===
-DTFREEZE_DP = -7.75E-08 ! [deg C Pa-1] default = 0.0
- ! When TFREEZE_FORM=LINEAR, this is the derivative of the freezing potential
- ! temperature with pressure.
-
-! === module MOM_restart ===
-PARALLEL_RESTARTFILES = True ! [Boolean] default = False
- ! If true, each processor writes its own restart file, otherwise a single
- ! restart file is generated
-
-! === module MOM_tracer_flow_control ===
-USE_IDEAL_AGE_TRACER = False ! [Boolean] default = False
- ! If true, use the ideal_age_example tracer package.
-
-! === module ideal_age_example ===
-
-! === module MOM_coord_initialization ===
-COORD_CONFIG = "file" !
- ! This specifies how layers are to be defined:
- ! ALE or none - used to avoid defining layers in ALE mode
- ! file - read coordinate information from the file
- ! specified by (COORD_FILE).
- ! BFB - Custom coords for buoyancy-forced basin case
- ! based on SST_S, T_BOT and DRHO_DT.
- ! linear - linear based on interfaces not layers
- ! layer_ref - linear based on layer densities
- ! ts_ref - use reference temperature and salinity
- ! ts_range - use range of temperature and salinity
- ! (T_REF and S_REF) to determine surface density
- ! and GINT calculate internal densities.
- ! gprime - use reference density (RHO_0) for surface
- ! density and GINT calculate internal densities.
- ! ts_profile - use temperature and salinity profiles
- ! (read from COORD_FILE) to set layer densities.
- ! USER - call a user modified routine.
-COORD_FILE = "layer_coord.nc" !
- ! The file from which the coordinate densities are read.
-REMAP_UV_USING_OLD_ALG = True ! [Boolean] default = True
- ! If true, uses the old remapping-via-a-delta-z method for remapping u and v. If
- ! false, uses the new method that remaps between grids described by an old and
- ! new thickness.
-REGRIDDING_COORDINATE_MODE = "HYCOM1" ! default = "LAYER"
- ! Coordinate mode for vertical regridding. Choose among the following
- ! possibilities: LAYER - Isopycnal or stacked shallow water layers
- ! ZSTAR, Z* - stretched geopotential z*
- ! SIGMA_SHELF_ZSTAR - stretched geopotential z* ignoring shelf
- ! SIGMA - terrain following coordinates
- ! RHO - continuous isopycnal
- ! HYCOM1 - HyCOM-like hybrid coordinate
- ! SLIGHT - stretched coordinates above continuous isopycnal
- ! ADAPTIVE - optimize for smooth neutral density surfaces
-BOUNDARY_EXTRAPOLATION = True ! [Boolean] default = False
- ! When defined, a proper high-order reconstruction scheme is used within
- ! boundary cells rather than PCM. E.g., if PPM is used for remapping, a PPM
- ! reconstruction will also be used within boundary cells.
-ALE_COORDINATE_CONFIG = "HYBRID:hycom1_75_800m.nc,sigma2,FNC1:2,4000,4.5,.01" ! default = "UNIFORM"
- ! Determines how to specify the coordinate resolution. Valid options are:
- ! PARAM - use the vector-parameter ALE_RESOLUTION
- ! UNIFORM[:N] - uniformly distributed
- ! FILE:string - read from a file. The string specifies
- ! the filename and variable name, separated
- ! by a comma or space, e.g. FILE:lev.nc,dz
- ! or FILE:lev.nc,interfaces=zw
- ! WOA09[:N] - the WOA09 vertical grid (approximately)
- ! FNC1:string - FNC1:dz_min,H_total,power,precision
- ! HYBRID:string - read from a file. The string specifies
- ! the filename and two variable names, separated
- ! by a comma or space, for sigma-2 and dz. e.g.
- ! HYBRID:vgrid.nc,sigma2,dz
-!ALE_RESOLUTION = 7*2.0, 2*2.01, 2.02, 2.03, 2.05, 2.08, 2.11, 2.15, 2.21, 2.2800000000000002, 2.37, 2.48, 2.61, 2.77, 2.95, 3.17, 3.4299999999999997, 3.74, 4.09, 4.49, 4.95, 5.48, 6.07, 6.74, 7.5, 8.34, 9.280000000000001, 10.33, 11.49, 12.77, 14.19, 15.74, 17.450000000000003, 19.31, 21.35, 23.56, 25.97, 28.580000000000002, 31.41, 34.47, 37.77, 41.32, 45.14, 49.25, 53.65, 58.370000000000005, 63.42, 68.81, 74.56, 80.68, 87.21000000000001, 94.14, 101.51, 109.33, 117.62, 126.4, 135.68, 145.5, 155.87, 166.81, 178.35, 190.51, 203.31, 216.78, 230.93, 245.8, 261.42, 277.83 ! [m]
- ! The distribution of vertical resolution for the target
- ! grid used for Eulerian-like coordinates. For example,
- ! in z-coordinate mode, the parameter is a list of level
- ! thicknesses (in m). In sigma-coordinate mode, the list
- ! is of non-dimensional fractions of the water column.
-!TARGET_DENSITIES = 1010.0, 1014.3034, 1017.8088, 1020.843, 1023.5566, 1025.813, 1027.0275, 1027.9114, 1028.6422, 1029.2795, 1029.852, 1030.3762, 1030.8626, 1031.3183, 1031.7486, 1032.1572, 1032.5471, 1032.9207, 1033.2798, 1033.6261, 1033.9608, 1034.2519, 1034.4817, 1034.6774, 1034.8508, 1035.0082, 1035.1533, 1035.2886, 1035.4159, 1035.5364, 1035.6511, 1035.7608, 1035.8661, 1035.9675, 1036.0645, 1036.1554, 1036.2411, 1036.3223, 1036.3998, 1036.4739, 1036.5451, 1036.6137, 1036.68, 1036.7441, 1036.8062, 1036.8526, 1036.8874, 1036.9164, 1036.9418, 1036.9647, 1036.9857, 1037.0052, 1037.0236, 1037.0409, 1037.0574, 1037.0738, 1037.0902, 1037.1066, 1037.123, 1037.1394, 1037.1558, 1037.1722, 1037.1887, 1037.206, 1037.2241, 1037.2435, 1037.2642, 1037.2866, 1037.3112, 1037.3389, 1037.3713, 1037.4118, 1037.475, 1037.6332, 1037.8104, 1038.0 ! [m]
- ! HYBRID target densities for interfaces
-REGRID_COMPRESSIBILITY_FRACTION = 0.01 ! [nondim] default = 0.0
- ! When interpolating potential density profiles we can add some artificial
- ! compressibility solely to make homogeneous regions appear stratified.
-MAXIMUM_INT_DEPTH_CONFIG = "FNC1:5,8000.0,1.0,.01" ! default = "NONE"
- ! Determines how to specify the maximum interface depths.
- ! Valid options are:
- ! NONE - there are no maximum interface depths
- ! PARAM - use the vector-parameter MAXIMUM_INTERFACE_DEPTHS
- ! FILE:string - read from a file. The string specifies
- ! the filename and variable name, separated
- ! by a comma or space, e.g. FILE:lev.nc,Z
- ! FNC1:string - FNC1:dz_min,H_total,power,precision
-!MAXIMUM_INT_DEPTHS = 0.0, 5.0, 12.75, 23.25, 36.49, 52.480000000000004, 71.22, 92.71000000000001, 116.94000000000001, 143.92000000000002, 173.65, 206.13, 241.36, 279.33000000000004, 320.05000000000007, 363.5200000000001, 409.7400000000001, 458.7000000000001, 510.4100000000001, 564.8700000000001, 622.0800000000002, 682.0300000000002, 744.7300000000002, 810.1800000000003, 878.3800000000003, 949.3300000000004, 1023.0200000000004, 1099.4600000000005, 1178.6500000000005, 1260.5900000000006, 1345.2700000000007, 1432.7000000000007, 1522.8800000000008, 1615.8100000000009, 1711.490000000001, 1809.910000000001, 1911.080000000001, 2015.0000000000011, 2121.670000000001, 2231.080000000001, 2343.2400000000007, 2458.1500000000005, 2575.8100000000004, 2696.2200000000003, 2819.3700000000003, 2945.2700000000004, 3073.9200000000005, 3205.3200000000006, 3339.4600000000005, 3476.3500000000004, 3615.9900000000002, 3758.38, 3903.52, 4051.4, 4202.03, 4355.41, 4511.54, 4670.41, 4832.03, 4996.4, 5163.5199999999995, 5333.379999999999, 5505.989999999999, 5681.3499999999985, 5859.459999999998, 6040.319999999998, 6223.919999999998, 6410.269999999999, 6599.369999999999, 6791.219999999999, 6985.8099999999995, 7183.15, 7383.24, 7586.08, 7791.67, 8000.0
- ! The list of maximum depths for each interface.
-MAX_LAYER_THICKNESS_CONFIG = "FNC1:400,31000.0,0.1,.01" ! default = "NONE"
- ! Determines how to specify the maximum layer thicknesses.
- ! Valid options are:
- ! NONE - there are no maximum layer thicknesses
- ! PARAM - use the vector-parameter MAX_LAYER_THICKNESS
- ! FILE:string - read from a file. The string specifies
- ! the filename and variable name, separated
- ! by a comma or space, e.g. FILE:lev.nc,Z
- ! FNC1:string - FNC1:dz_min,H_total,power,precision
-!MAX_LAYER_THICKNESS = 400.0, 409.63, 410.32, 410.75, 411.07, 411.32, 411.52, 411.7, 411.86, 412.0, 412.13, 412.24, 412.35, 412.45, 412.54, 412.63, 412.71, 412.79, 412.86, 412.93, 413.0, 413.06, 413.12, 413.18, 413.24, 413.29, 413.34, 413.39, 413.44, 413.49, 413.54, 413.58, 413.62, 413.67, 413.71, 413.75, 413.78, 413.82, 413.86, 413.9, 413.93, 413.97, 414.0, 414.03, 414.06, 414.1, 414.13, 414.16, 414.19, 414.22, 414.24, 414.27, 414.3, 414.33, 414.35, 414.38, 414.41, 414.43, 414.46, 414.48, 414.51, 414.53, 414.55, 414.58, 414.6, 414.62, 414.65, 414.67, 414.69, 414.71, 414.73, 414.75, 414.77, 414.79, 414.83 ! [m]
- ! The list of maximum thickness for each layer.
-REMAPPING_SCHEME = "PPM_H4" ! default = "PLM"
- ! This sets the reconstruction scheme used for vertical remapping for all
- ! variables. It can be one of the following schemes: PCM (1st-order
- ! accurate)
- ! PLM (2nd-order accurate)
- ! PPM_H4 (3rd-order accurate)
- ! PPM_IH4 (3rd-order accurate)
- ! PQM_IH4IH3 (4th-order accurate)
- ! PQM_IH6IH5 (5th-order accurate)
-
-! === module MOM_grid ===
-! Parameters providing information about the lateral grid.
-
-! === module MOM_state_initialization ===
-INIT_LAYERS_FROM_Z_FILE = True ! [Boolean] default = False
- ! If true, initialize the layer thicknesses, temperatures, and salinities from a
- ! Z-space file on a latitude-longitude grid.
-
-! === module MOM_initialize_layers_from_Z ===
-TEMP_SALT_Z_INIT_FILE = "MOM6_IC_TS.nc" ! default = "temp_salt_z.nc"
- ! The name of the z-space input file used to initialize
- ! temperatures (T) and salinities (S). If T and S are not
- ! in the same file, TEMP_Z_INIT_FILE and SALT_Z_INIT_FILE
- ! must be set.
-Z_INIT_FILE_PTEMP_VAR = "temp" ! default = "ptemp"
- ! The name of the potential temperature variable in
- ! TEMP_Z_INIT_FILE.
-Z_INIT_FILE_SALT_VAR = "salt" ! default = "salt"
- ! The name of the salinity variable in
- ! SALT_Z_INIT_FILE.
-
-Z_INIT_ALE_REMAPPING = True ! [Boolean] default = False
- ! If True, then remap straight to model coordinate from file.
-Z_INIT_REMAP_OLD_ALG = True ! [Boolean] default = True
- ! If false, uses the preferred remapping algorithm for initialization. If true,
- ! use an older, less robust algorithm for remapping.
-
-! === module MOM_diag_mediator ===
-!Jiande NUM_DIAG_COORDS = 2 ! default = 1
-NUM_DIAG_COORDS = 1 ! default = 1
- ! The number of diagnostic vertical coordinates to use.
- ! For each coordinate, an entry in DIAG_COORDS must be provided.
-!Jiande DIAG_COORDS = "z Z ZSTAR", "rho2 RHO2 RHO" !
-DIAG_COORDS = "z Z ZSTAR"
- ! A list of string tuples associating diag_table modules to
- ! a coordinate definition used for diagnostics. Each string
- ! is of the form "MODULE_SUFFIX,PARAMETER_SUFFIX,COORDINATE_NAME".
-DIAG_COORD_DEF_Z="FILE:interpolate_zgrid_40L.nc,interfaces=zw"
-DIAG_MISVAL = -1e34
-!DIAG_COORD_DEF_RHO2 = "RFNC1:35,999.5,1028,1028.5,8.,1038.,0.0078125" ! default = "WOA09"
- ! Determines how to specify the coordinate resolution. Valid options are:
- ! PARAM - use the vector-parameter DIAG_COORD_RES_RHO2
- ! UNIFORM[:N] - uniformly distributed
- ! FILE:string - read from a file. The string specifies
- ! the filename and variable name, separated
- ! by a comma or space, e.g. FILE:lev.nc,dz
- ! or FILE:lev.nc,interfaces=zw
- ! WOA09[:N] - the WOA09 vertical grid (approximately)
- ! FNC1:string - FNC1:dz_min,H_total,power,precision
- ! HYBRID:string - read from a file. The string specifies
- ! the filename and two variable names, separated
- ! by a comma or space, for sigma-2 and dz. e.g.
- ! HYBRID:vgrid.nc,sigma2,dz
-
-! === module MOM_MEKE ===
-USE_MEKE = True ! [Boolean] default = False
- ! If true, turns on the MEKE scheme which calculates a sub-grid mesoscale eddy
- ! kinetic energy budget.
-MEKE_GMCOEFF = 1.0 ! [nondim] default = -1.0
- ! The efficiency of the conversion of potential energy into MEKE by the
- ! thickness mixing parameterization. If MEKE_GMCOEFF is negative, this
- ! conversion is not used or calculated.
-MEKE_BGSRC = 1.0E-13 ! [W kg-1] default = 0.0
- ! A background energy source for MEKE.
-MEKE_KHTH_FAC = 0.5 ! [nondim] default = 0.0
- ! A factor that maps MEKE%Kh to KhTh.
-MEKE_KHTR_FAC = 0.5 ! [nondim] default = 0.0
- ! A factor that maps MEKE%Kh to KhTr.
-MEKE_KHMEKE_FAC = 1.0 ! [nondim] default = 0.0
- ! A factor that maps MEKE%Kh to Kh for MEKE itself.
-MEKE_VISCOSITY_COEFF_KU = 1.0 ! [nondim] default = 0.0
- ! If non-zero, is the scaling coefficient in the expression forviscosity used to
- ! parameterize harmonic lateral momentum mixing byunresolved eddies represented
- ! by MEKE. Can be negative torepresent backscatter from the unresolved eddies.
-MEKE_ALPHA_RHINES = 0.15 ! [nondim] default = 0.05
- ! If positive, is a coefficient weighting the Rhines scale in the expression for
- ! mixing length used in MEKE-derived diffusivity.
-MEKE_ALPHA_EADY = 0.15 ! [nondim] default = 0.05
- ! If positive, is a coefficient weighting the Eady length scale in the
- ! expression for mixing length used in MEKE-derived diffusivity.
-
-! === module MOM_lateral_mixing_coeffs ===
-USE_VARIABLE_MIXING = True ! [Boolean] default = False
- ! If true, the variable mixing code will be called. This allows diagnostics to
- ! be created even if the scheme is not used. If KHTR_SLOPE_CFF>0 or
- ! KhTh_Slope_Cff>0, this is set to true regardless of what is in the parameter
- ! file.
-RESOLN_SCALED_KH = True ! [Boolean] default = False
- ! If true, the Laplacian lateral viscosity is scaled away when the first
- ! baroclinic deformation radius is well resolved.
-RESOLN_SCALED_KHTH = True ! [Boolean] default = False
- ! If true, the interface depth diffusivity is scaled away when the first
- ! baroclinic deformation radius is well resolved.
-KHTH_USE_EBT_STRUCT = True ! [Boolean] default = False
- ! If true, uses the equivalent barotropic structure as the vertical structure of
- ! thickness diffusivity.
-KHTR_SLOPE_CFF = 0.25 ! [nondim] default = 0.0
- ! The nondimensional coefficient in the Visbeck formula for the epipycnal tracer
- ! diffusivity
-USE_STORED_SLOPES = True ! [Boolean] default = False
- ! If true, the isopycnal slopes are calculated once and stored for re-use. This
- ! uses more memory but avoids calling the equation of state more times than
- ! should be necessary.
-KH_RES_FN_POWER = 100 ! [nondim] default = 2
- ! The power of dx/Ld in the Kh resolution function. Any positive integer may be
- ! used, although even integers are more efficient to calculate. Setting this
- ! greater than 100 results in a step-function being used.
-INTERPOLATE_RES_FN = False ! [Boolean] default = True
- ! If true, interpolate the resolution function to the velocity points from the
- ! thickness points; otherwise interpolate the wave speed and calculate the
- ! resolution function independently at each point.
-GILL_EQUATORIAL_LD = True ! [Boolean] default = False
- ! If true, uses Gill's definition of the baroclinic equatorial deformation
- ! radius, otherwise, if false, use Pedlosky's definition. These definitions
- ! differ by a factor of 2 in front of the beta term in the denominator. Gill's
- ! is the more appropriate definition.
-INTERNAL_WAVE_SPEED_BETTER_EST = False ! [Boolean] default = True
- ! If true, use a more robust estimate of the first mode wave speed as the
- ! starting point for iterations.
-
-! === module MOM_set_visc ===
-CHANNEL_DRAG = True ! [Boolean] default = False
- ! If true, the bottom drag is exerted directly on each layer proportional to the
- ! fraction of the bottom it overlies.
-PRANDTL_TURB = 1.25 ! [nondim] default = 1.0
- ! The turbulent Prandtl number applied to shear instability.
-HBBL = 10.0 ! [m]
- ! The thickness of a bottom boundary layer with a viscosity of KVBBL if
- ! BOTTOMDRAGLAW is not defined, or the thickness over which near-bottom
- ! velocities are averaged for the drag law if BOTTOMDRAGLAW is defined but
- ! LINEAR_DRAG is not.
-DRAG_BG_VEL = 0.1 ! [m s-1] default = 0.0
- ! DRAG_BG_VEL is either the assumed bottom velocity (with LINEAR_DRAG) or an
- ! unresolved velocity that is combined with the resolved velocity to estimate
- ! the velocity magnitude. DRAG_BG_VEL is only used when BOTTOMDRAGLAW is
- ! defined.
-BBL_USE_EOS = True ! [Boolean] default = False
- ! If true, use the equation of state in determining the properties of the bottom
- ! boundary layer. Otherwise use the layer target potential densities.
-BBL_THICK_MIN = 0.1 ! [m] default = 0.0
- ! The minimum bottom boundary layer thickness that can be used with
- ! BOTTOMDRAGLAW. This might be Kv/(cdrag*drag_bg_vel) to give Kv as the minimum
- ! near-bottom viscosity.
-KV = 1.0E-04 ! [m2 s-1]
- ! The background kinematic viscosity in the interior. The molecular value, ~1e-6
- ! m2 s-1, may be used.
-KV_BBL_MIN = 0.0 ! [m2 s-1] default = 1.0E-04
- ! The minimum viscosities in the bottom boundary layer.
-KV_TBL_MIN = 0.0 ! [m2 s-1] default = 1.0E-04
- ! The minimum viscosities in the top boundary layer.
-
-! === module MOM_thickness_diffuse ===
-KHTH_MAX_CFL = 0.1 ! [nondimensional] default = 0.8
- ! The maximum value of the local diffusive CFL ratio that is permitted for the
- ! thickness diffusivity. 1.0 is the marginally unstable value in a pure layered
- ! model, but much smaller numbers (e.g. 0.1) seem to work better for ALE-based
- ! models.
-KHTH_USE_FGNV_STREAMFUNCTION = True ! [Boolean] default = False
- ! If true, use the streamfunction formulation of Ferrari et al., 2010, which
- ! effectively emphasizes graver vertical modes by smoothing in the vertical.
-FGNV_FILTER_SCALE = 0.1 ! [nondim] default = 1.0
- ! A coefficient scaling the vertical smoothing term in the Ferrari et al., 2010,
- ! streamfunction formulation.
-USE_GM_WORK_BUG = True ! [Boolean] default = True
- ! If true, compute the top-layer work tendency on the u-grid with the incorrect
- ! sign, for legacy reproducibility.
-
-! === module MOM_continuity ===
-
-! === module MOM_continuity_PPM ===
-ETA_TOLERANCE = 1.0E-06 ! [m] default = 3.75E-09
- ! The tolerance for the differences between the barotropic and baroclinic
- ! estimates of the sea surface height due to the fluxes through each face. The
- ! total tolerance for SSH is 4 times this value. The default is
- ! 0.5*NK*ANGSTROM, and this should not be set less than about
- ! 10^-15*MAXIMUM_DEPTH.
-ETA_TOLERANCE_AUX = 0.001 ! [m] default = 1.0E-06
- ! The tolerance for free-surface height discrepancies between the barotropic
- ! solution and the sum of the layer thicknesses when calculating the auxiliary
- ! corrected velocities. By default, this is the same as ETA_TOLERANCE, but can
- ! be made larger for efficiency.
-
-! === module MOM_CoriolisAdv ===
-CORIOLIS_SCHEME = "SADOURNY75_ENSTRO" ! default = "SADOURNY75_ENERGY"
- ! CORIOLIS_SCHEME selects the discretization for the Coriolis terms. Valid
- ! values are:
- ! SADOURNY75_ENERGY - Sadourny, 1975; energy cons.
- ! ARAKAWA_HSU90 - Arakawa & Hsu, 1990
- ! SADOURNY75_ENSTRO - Sadourny, 1975; enstrophy cons.
- ! ARAKAWA_LAMB81 - Arakawa & Lamb, 1981; En. + Enst.
- ! ARAKAWA_LAMB_BLEND - A blend of Arakawa & Lamb with
- ! Arakawa & Hsu and Sadourny energy
-BOUND_CORIOLIS = True ! [Boolean] default = False
- ! If true, the Coriolis terms at u-points are bounded by the four estimates of
- ! (f+rv)v from the four neighboring v-points, and similarly at v-points. This
- ! option would have no effect on the SADOURNY Coriolis scheme if it were
- ! possible to use centered difference thickness fluxes.
-
-! === module MOM_PressureForce ===
-
-! === module MOM_PressureForce_AFV ===
-MASS_WEIGHT_IN_PRESSURE_GRADIENT = True ! [Boolean] default = False
- ! If true, use mass weighting when interpolating T/S for integrals near the
- ! bathymetry in AFV pressure gradient calculations.
-
-! === module MOM_hor_visc ===
-LAPLACIAN = True ! [Boolean] default = False
- ! If true, use a Laplacian horizontal viscosity.
-KH_VEL_SCALE = 0.01 ! [m s-1] default = 0.0
- ! The velocity scale which is multiplied by the grid spacing to calculate the
- ! Laplacian viscosity. The final viscosity is the largest of this scaled
- ! viscosity, the Smagorinsky and Leith viscosities, and KH.
-KH_SIN_LAT = 2000.0 ! [m2 s-1] default = 0.0
- ! The amplitude of a latitudinally-dependent background viscosity of the form
- ! KH_SIN_LAT*(SIN(LAT)**KH_PWR_OF_SINE).
-SMAGORINSKY_KH = True ! [Boolean] default = False
- ! If true, use a Smagorinsky nonlinear eddy viscosity.
-SMAG_LAP_CONST = 0.15 ! [nondim] default = 0.0
- ! The nondimensional Laplacian Smagorinsky constant, often 0.15.
-AH_VEL_SCALE = 0.01 ! [m s-1] default = 0.0
- ! The velocity scale which is multiplied by the cube of the grid spacing to
- ! calculate the biharmonic viscosity. The final viscosity is the largest of this
- ! scaled viscosity, the Smagorinsky and Leith viscosities, and AH.
-SMAGORINSKY_AH = True ! [Boolean] default = False
- ! If true, use a biharmonic Smagorinsky nonlinear eddy viscosity.
-SMAG_BI_CONST = 0.06 ! [nondim] default = 0.0
- ! The nondimensional biharmonic Smagorinsky constant, typically 0.015 - 0.06.
-USE_LAND_MASK_FOR_HVISC = False ! [Boolean] default = False
- ! If true, use Use the land mask for the computation of thicknesses at velocity
- ! locations. This eliminates the dependence on arbitrary values over land or
- ! outside of the domain. Default is False in order to maintain answers with
- ! legacy experiments but should be changed to True for new experiments.
-
-! === module MOM_vert_friction ===
-HMIX_FIXED = 0.5 ! [m]
- ! The prescribed depth over which the near-surface viscosity and diffusivity are
- ! elevated when the bulk mixed layer is not used.
-KVML = 1.0E-04 ! [m2 s-1] default = 1.0E-04
- ! The kinematic viscosity in the mixed layer. A typical value is ~1e-2 m2 s-1.
- ! KVML is not used if BULKMIXEDLAYER is true. The default is set by KV.
-MAXVEL = 6.0 ! [m s-1] default = 3.0E+08
- ! The maximum velocity allowed before the velocity components are truncated.
-
-! === module MOM_PointAccel ===
-U_TRUNC_FILE = "U_velocity_truncations" ! default = ""
- ! The absolute path to a file into which the accelerations leading to zonal
- ! velocity truncations are written. Undefine this for efficiency if this
- ! diagnostic is not needed.
-V_TRUNC_FILE = "V_velocity_truncations" ! default = ""
- ! The absolute path to a file into which the accelerations leading to meridional
- ! velocity truncations are written. Undefine this for efficiency if this
- ! diagnostic is not needed.
-
-! === module MOM_barotropic ===
-BOUND_BT_CORRECTION = True ! [Boolean] default = False
- ! If true, the corrective pseudo mass-fluxes into the barotropic solver are
- ! limited to values that require less than maxCFL_BT_cont to be accommodated.
-BT_PROJECT_VELOCITY = True ! [Boolean] default = False
- ! If true, step the barotropic velocity first and project out the velocity
- ! tendency by 1+BEBT when calculating the transport. The default (false) is to
- ! use a predictor continuity step to find the pressure field, and then to do a
- ! corrector continuity step using a weighted average of the old and new
- ! velocities, with weights of (1-BEBT) and BEBT.
-DYNAMIC_SURFACE_PRESSURE = True ! [Boolean] default = False
- ! If true, add a dynamic pressure due to a viscous ice shelf, for instance.
-BEBT = 0.2 ! [nondim] default = 0.1
- ! BEBT determines whether the barotropic time stepping uses the forward-backward
- ! time-stepping scheme or a backward Euler scheme. BEBT is valid in the range
- ! from 0 (for a forward-backward treatment of nonrotating gravity waves) to 1
- ! (for a backward Euler treatment). In practice, BEBT must be greater than about
- ! 0.05.
-DTBT = -0.9 ! [s or nondim] default = -0.98
- ! The barotropic time step, in s. DTBT is only used with the split explicit time
- ! stepping. To set the time step automatically based the maximum stable value
- ! use 0, or a negative value gives the fraction of the stable value. Setting
- ! DTBT to 0 is the same as setting it to -0.98. The value of DTBT that will
- ! actually be used is an integer fraction of DT, rounding down.
-BT_USE_OLD_CORIOLIS_BRACKET_BUG = True ! [Boolean] default = False
- ! If True, use an order of operations that is not bitwise rotationally symmetric
- ! in the meridional Coriolis term of the barotropic solver.
-
-! === module MOM_mixed_layer_restrat ===
-MIXEDLAYER_RESTRAT = True ! [Boolean] default = False
- ! If true, a density-gradient dependent re-stratifying flow is imposed in the
- ! mixed layer. Can be used in ALE mode without restriction but in layer mode can
- ! only be used if BULKMIXEDLAYER is true.
-FOX_KEMPER_ML_RESTRAT_COEF = 1.0 ! [nondim] default = 0.0
- ! A nondimensional coefficient that is proportional to the ratio of the
- ! deformation radius to the dominant lengthscale of the submesoscale mixed layer
- ! instabilities, times the minimum of the ratio of the mesoscale eddy kinetic
- ! energy to the large-scale geostrophic kinetic energy or 1 plus the square of
- ! the grid spacing over the deformation radius, as detailed by Fox-Kemper et al.
- ! (2010)
-MLE_FRONT_LENGTH = 200.0 ! [m] default = 0.0
- ! If non-zero, is the frontal-length scale used to calculate the upscaling of
- ! buoyancy gradients that is otherwise represented by the parameter
- ! FOX_KEMPER_ML_RESTRAT_COEF. If MLE_FRONT_LENGTH is non-zero, it is recommended
- ! to set FOX_KEMPER_ML_RESTRAT_COEF=1.0.
-MLE_USE_PBL_MLD = True ! [Boolean] default = False
- ! If true, the MLE parameterization will use the mixed-layer depth provided by
- ! the active PBL parameterization. If false, MLE will estimate a MLD based on a
- ! density difference with the surface using the parameter MLE_DENSITY_DIFF.
-MLE_MLD_DECAY_TIME = 2.592E+06 ! [s] default = 0.0
- ! The time-scale for a running-mean filter applied to the mixed-layer depth used
- ! in the MLE restratification parameterization. When the MLD deepens below the
- ! current running-mean the running-mean is instantaneously set to the current
- ! MLD.
-
-! === module MOM_diabatic_driver ===
-! The following parameters are used for diabatic processes.
-ENERGETICS_SFC_PBL = True ! [Boolean] default = False
- ! If true, use an implied energetics planetary boundary layer scheme to
- ! determine the diffusivity and viscosity in the surface boundary layer.
-EPBL_IS_ADDITIVE = False ! [Boolean] default = True
- ! If true, the diffusivity from ePBL is added to all other diffusivities.
- ! Otherwise, the larger of kappa-shear and ePBL diffusivities are used.
-
-! === module MOM_CVMix_KPP ===
-! This is the MOM wrapper to CVMix:KPP
-! See http://cvmix.github.io/
-
-! === module MOM_tidal_mixing ===
-! Vertical Tidal Mixing Parameterization
-INT_TIDE_DISSIPATION = True ! [Boolean] default = False
- ! If true, use an internal tidal dissipation scheme to drive diapycnal mixing,
- ! along the lines of St. Laurent et al. (2002) and Simmons et al. (2004).
-INT_TIDE_PROFILE = "POLZIN_09" ! default = "STLAURENT_02"
- ! INT_TIDE_PROFILE selects the vertical profile of energy dissipation with
- ! INT_TIDE_DISSIPATION. Valid values are:
- ! STLAURENT_02 - Use the St. Laurent et al exponential
- ! decay profile.
- ! POLZIN_09 - Use the Polzin WKB-stretched algebraic
- ! decay profile.
-INT_TIDE_DECAY_SCALE = 300.3003003003003 ! [m] default = 500.0
- ! The decay scale away from the bottom for tidal TKE with the new coding when
- ! INT_TIDE_DISSIPATION is used.
-KAPPA_ITIDES = 6.28319E-04 ! [m-1] default = 6.283185307179586E-04
- ! A topographic wavenumber used with INT_TIDE_DISSIPATION. The default is 2pi/10
- ! km, as in St.Laurent et al. 2002.
-KAPPA_H2_FACTOR = 0.84 ! [nondim] default = 1.0
- ! A scaling factor for the roughness amplitude with INT_TIDE_DISSIPATION.
-TKE_ITIDE_MAX = 0.1 ! [W m-2] default = 1000.0
- ! The maximum internal tide energy source available to mix above the bottom
- ! boundary layer with INT_TIDE_DISSIPATION.
-READ_TIDEAMP = True ! [Boolean] default = False
- ! If true, read a file (given by TIDEAMP_FILE) containing the tidal amplitude
- ! with INT_TIDE_DISSIPATION.
-TIDEAMP_FILE = "tidal_amplitude.nc" ! default = "tideamp.nc"
- ! The path to the file containing the spatially varying tidal amplitudes with
- ! INT_TIDE_DISSIPATION.
-H2_FILE = "ocean_topog.nc" !
- ! The path to the file containing the sub-grid-scale topographic roughness
- ! amplitude with INT_TIDE_DISSIPATION.
-
-! === module MOM_CVMix_conv ===
-! Parameterization of enhanced mixing due to convection via CVMix
-
-! === module MOM_geothermal ===
-GEOTHERMAL_SCALE = 1.0 ! [W m-2 or various] default = 0.0
- ! The constant geothermal heat flux, a rescaling factor for the heat flux read
- ! from GEOTHERMAL_FILE, or 0 to disable the geothermal heating.
-GEOTHERMAL_FILE = "geothermal_davies2013_v1.nc" ! default = ""
- ! The file from which the geothermal heating is to be read, or blank to use a
- ! constant heating rate.
-GEOTHERMAL_VARNAME = "geothermal_hf" ! default = "geo_heat"
- ! The name of the geothermal heating variable in GEOTHERMAL_FILE.
-
-! === module MOM_set_diffusivity ===
-BBL_MIXING_AS_MAX = False ! [Boolean] default = True
- ! If true, take the maximum of the diffusivity from the BBL mixing and the other
- ! diffusivities. Otherwise, diffusivity from the BBL_mixing is simply added.
-USE_LOTW_BBL_DIFFUSIVITY = True ! [Boolean] default = False
- ! If true, uses a simple, imprecise but non-coordinate dependent, model of BBL
- ! mixing diffusivity based on Law of the Wall. Otherwise, uses the original BBL
- ! scheme.
-SIMPLE_TKE_TO_KD = True ! [Boolean] default = False
- ! If true, uses a simple estimate of Kd/TKE that will work for arbitrary
- ! vertical coordinates. If false, calculates Kd/TKE and bounds based on exact
- ! energetics for an isopycnal layer-formulation.
-
-! === module MOM_bkgnd_mixing ===
-! Adding static vertical background mixing coefficients
-KD = 1.5E-05 ! [m2 s-1]
- ! The background diapycnal diffusivity of density in the interior. Zero or the
- ! molecular value, ~1e-7 m2 s-1, may be used.
-KD_MIN = 2.0E-06 ! [m2 s-1] default = 1.5E-07
- ! The minimum diapycnal diffusivity.
-HENYEY_IGW_BACKGROUND = True ! [Boolean] default = False
- ! If true, use a latitude-dependent scaling for the near surface background
- ! diffusivity, as described in Harrison & Hallberg, JPO 2008.
-KD_MAX = 0.1 ! [m2 s-1] default = -1.0
- ! The maximum permitted increment for the diapycnal diffusivity from TKE-based
- ! parameterizations, or a negative value for no limit.
-
-! === module MOM_kappa_shear ===
-! Parameterization of shear-driven turbulence following Jackson, Hallberg and Legg, JPO 2008
-USE_JACKSON_PARAM = True ! [Boolean] default = False
- ! If true, use the Jackson-Hallberg-Legg (JPO 2008) shear mixing
- ! parameterization.
-MAX_RINO_IT = 25 ! [nondim] default = 50
- ! The maximum number of iterations that may be used to estimate the Richardson
- ! number driven mixing.
-VERTEX_SHEAR = False ! [Boolean] default = False
- ! If true, do the calculations of the shear-driven mixing
- ! at the cell vertices (i.e., the vorticity points).
-KAPPA_SHEAR_ITER_BUG = True ! [Boolean] default = True
- ! If true, use an older, dimensionally inconsistent estimate of the derivative
- ! of diffusivity with energy in the Newton's method iteration. The bug causes
- ! undercorrections when dz > 1 m.
-KAPPA_SHEAR_ALL_LAYER_TKE_BUG = True ! [Boolean] default = True
- ! If true, report back the latest estimate of TKE instead of the time average
- ! TKE when there is mass in all layers. Otherwise always report the time
- ! averaged TKE, as is currently done when there are some massless layers.
-
-! === module MOM_CVMix_shear ===
-! Parameterization of shear-driven turbulence via CVMix (various options)
-
-! === module MOM_CVMix_ddiff ===
-! Parameterization of mixing due to double diffusion processes via CVMix
-
-! === module MOM_diabatic_aux ===
-! The following parameters are used for auxiliary diabatic processes.
-PRESSURE_DEPENDENT_FRAZIL = False ! [Boolean] default = False
- ! If true, use a pressure dependent freezing temperature when making frazil. The
- ! default is false, which will be faster but is inappropriate with ice-shelf
- ! cavities.
-VAR_PEN_SW = True ! [Boolean] default = False
- ! If true, use one of the CHL_A schemes specified by OPACITY_SCHEME to determine
- ! the e-folding depth of incoming short wave radiation.
-CHL_FILE = @[CHLCLIM] !
- ! CHL_FILE is the file containing chl_a concentrations in the variable CHL_A. It
- ! is used when VAR_PEN_SW and CHL_FROM_FILE are true.
-CHL_VARNAME = "chlor_a" ! default = "CHL_A"
- ! Name of CHL_A variable in CHL_FILE.
-
-! === module MOM_energetic_PBL ===
-ML_OMEGA_FRAC = 0.001 ! [nondim] default = 0.0
- ! When setting the decay scale for turbulence, use this fraction of the absolute
- ! rotation rate blended with the local value of f, as sqrt((1-of)*f^2 +
- ! of*4*omega^2).
-TKE_DECAY = 0.01 ! [nondim] default = 2.5
- ! TKE_DECAY relates the vertical rate of decay of the TKE available for
- ! mechanical entrainment to the natural Ekman depth.
-EPBL_MSTAR_SCHEME = "OM4" ! default = "CONSTANT"
- ! EPBL_MSTAR_SCHEME selects the method for setting mstar. Valid values are:
- ! CONSTANT - Use a fixed mstar given by MSTAR
- ! OM4 - Use L_Ekman/L_Obukhov in the sabilizing limit, as in OM4
- ! REICHL_H18 - Use the scheme documented in Reichl & Hallberg, 2018.
-MSTAR_CAP = 10.0 ! [nondim] default = -1.0
- ! If this value is positive, it sets the maximum value of mstar allowed in ePBL.
- ! (This is not used if EPBL_MSTAR_SCHEME = CONSTANT).
-MSTAR2_COEF1 = 0.29 ! [nondim] default = 0.3
- ! Coefficient in computing mstar when rotation and stabilizing effects are both
- ! important (used if EPBL_MSTAR_SCHEME = OM4).
-MSTAR2_COEF2 = 0.152 ! [nondim] default = 0.085
- ! Coefficient in computing mstar when only rotation limits the total mixing
- ! (used if EPBL_MSTAR_SCHEME = OM4)
-EPBL_MLD_BISECTION = True ! [Boolean] default = False
- ! If true, use bisection with the iterative determination of the self-consistent
- ! mixed layer depth. Otherwise use the false position after a maximum and
- ! minimum bound have been evaluated and the returned value or bisection before
- ! this.
-NSTAR = 0.06 ! [nondim] default = 0.2
- ! The portion of the buoyant potential energy imparted by surface fluxes that is
- ! available to drive entrainment at the base of mixed layer when that energy is
- ! positive.
-MSTAR_CONV_ADJ = 0.667 ! [nondim] default = 0.0
- ! Coefficient used for reducing mstar during convection due to reduction of
- ! stable density gradient.
-USE_MLD_ITERATION = True ! [Boolean] default = False
- ! A logical that specifies whether or not to use the distance to the bottom of
- ! the actively turbulent boundary layer to help set the EPBL length scale.
-EPBL_TRANSITION_SCALE = 0.01 ! [nondim] default = 0.1
- ! A scale for the mixing length in the transition layer at the edge of the
- ! boundary layer as a fraction of the boundary layer thickness.
-MIX_LEN_EXPONENT = 1.0 ! [nondim] default = 2.0
- ! The exponent applied to the ratio of the distance to the MLD and the MLD depth
- ! which determines the shape of the mixing length. This is only used if
- ! USE_MLD_ITERATION is True.
-USE_LA_LI2016 = @[MOM6_USE_LI2016] ! [nondim] default = False
- ! A logical to use the Li et al. 2016 (submitted) formula to determine the
- ! Langmuir number.
-USE_WAVES = @[MOM6_USE_WAVES] ! [Boolean] default = False
- ! If true, enables surface wave modules.
-WAVE_METHOD = "SURFACE_BANDS" ! default = "EMPTY"
- ! Choice of wave method, valid options include:
- ! TEST_PROFILE - Prescribed from surface Stokes drift
- ! and a decay wavelength.
- ! SURFACE_BANDS - Computed from multiple surface values
- ! and decay wavelengths.
- ! DHH85 - Uses Donelan et al. 1985 empirical
- ! wave spectrum with prescribed values.
- ! LF17 - Infers Stokes drift profile from wind
- ! speed following Li and Fox-Kemper 2017.
-SURFBAND_SOURCE = "COUPLER" ! default = "EMPTY"
- ! Choice of SURFACE_BANDS data mode, valid options include:
- ! DATAOVERRIDE - Read from NetCDF using FMS DataOverride.
- ! COUPLER - Look for variables from coupler pass
- ! INPUT - Testing with fixed values.
-STK_BAND_COUPLER = 3 ! default = 1
- ! STK_BAND_COUPLER is the number of Stokes drift bands in the coupler. This has
- ! to be consistent with the number of Stokes drift bands in WW3, or the model
- ! will fail.
-SURFBAND_WAVENUMBERS = 0.04, 0.11, 0.3305 ! [rad/m] default = 0.12566
- ! Central wavenumbers for surface Stokes drift bands.
-EPBL_LANGMUIR_SCHEME = "ADDITIVE" ! default = "NONE"
- ! EPBL_LANGMUIR_SCHEME selects the method for including Langmuir turbulence.
- ! Valid values are:
- ! NONE - Do not do any extra mixing due to Langmuir turbulence
- ! RESCALE - Use a multiplicative rescaling of mstar to account for Langmuir
- ! turbulence
- ! ADDITIVE - Add a Langmuir turblence contribution to mstar to other
- ! contributions
-LT_ENHANCE_COEF = 0.044 ! [nondim] default = 0.447
- ! Coefficient for Langmuir enhancement of mstar
-LT_ENHANCE_EXP = -1.5 ! [nondim] default = -1.33
- ! Exponent for Langmuir enhancementt of mstar
-LT_MOD_LAC1 = 0.0 ! [nondim] default = -0.87
- ! Coefficient for modification of Langmuir number due to MLD approaching Ekman
- ! depth.
-LT_MOD_LAC4 = 0.0 ! [nondim] default = 0.95
- ! Coefficient for modification of Langmuir number due to ratio of Ekman to
- ! stable Obukhov depth.
-LT_MOD_LAC5 = 0.22 ! [nondim] default = 0.95
- ! Coefficient for modification of Langmuir number due to ratio of Ekman to
- ! unstable Obukhov depth.
-
-! === module MOM_regularize_layers ===
-
-! === module MOM_opacity ===
-PEN_SW_NBANDS = 3 ! default = 1
- ! The number of bands of penetrating shortwave radiation.
-
-! === module MOM_tracer_advect ===
-TRACER_ADVECTION_SCHEME = "PPM:H3" ! default = "PLM"
- ! The horizontal transport scheme for tracers:
- ! PLM - Piecewise Linear Method
- ! PPM:H3 - Piecewise Parabolic Method (Huyhn 3rd order)
- ! PPM - Piecewise Parabolic Method (Colella-Woodward)
-
-! === module MOM_tracer_hor_diff ===
-KHTR = 50.0 ! [m2 s-1] default = 0.0
- ! The background along-isopycnal tracer diffusivity.
-CHECK_DIFFUSIVE_CFL = True ! [Boolean] default = False
- ! If true, use enough iterations the diffusion to ensure that the diffusive
- ! equivalent of the CFL limit is not violated. If false, always use the greater
- ! of 1 or MAX_TR_DIFFUSION_CFL iteration.
-MAX_TR_DIFFUSION_CFL = 2.0 ! [nondim] default = -1.0
- ! If positive, locally limit the along-isopycnal tracer diffusivity to keep the
- ! diffusive CFL locally at or below this value. The number of diffusive
- ! iterations is often this value or the next greater integer.
-
-! === module MOM_neutral_diffusion ===
-! This module implements neutral diffusion of tracers
-USE_NEUTRAL_DIFFUSION = True ! [Boolean] default = False
- ! If true, enables the neutral diffusion module.
-
-! === module ocean_model_init ===
-RESTART_CHECKSUMS_REQUIRED = False
-
-! === module MOM_oda_incupd ===
-ODA_INCUPD = @[ODA_INCUPD] ! [Boolean] default = False
- ! If true, oda incremental updates will be applied
- ! everywhere in the domain.
-ODA_INCUPD_FILE = "mom6_increment.nc" ! The name of the file with the T,S,h increments.
-
-ODA_TEMPINC_VAR = "Temp" ! default = "ptemp_inc"
- ! The name of the potential temperature inc. variable in
- ! ODA_INCUPD_FILE.
-ODA_SALTINC_VAR = "Salt" ! default = "sal_inc"
- ! The name of the salinity inc. variable in
- ! ODA_INCUPD_FILE.
-ODA_THK_VAR = "h" ! default = "h"
- ! The name of the int. depth inc. variable in
- ! ODA_INCUPD_FILE.
-ODA_INCUPD_UV = false !
-!ODA_UINC_VAR = "u" ! default = "u_inc"
- ! The name of the zonal vel. inc. variable in
- ! ODA_INCUPD_UV_FILE.
-!ODA_VINC_VAR = "v" ! default = "v_inc"
- ! The name of the meridional vel. inc. variable in
- ! ODA_INCUPD_UV_FILE.
-ODA_INCUPD_NHOURS = @[ODA_INCUPD_NHOURS] ! default=3.0
-
-! === module MOM_lateral_boundary_diffusion ===
-! This module implements lateral diffusion of tracers near boundaries
-
-! === module MOM_sum_output ===
-MAXTRUNC = 100000 ! [truncations save_interval-1] default = 0
- ! The run will be stopped, and the day set to a very large value if the velocity
- ! is truncated more than MAXTRUNC times between energy saves. Set MAXTRUNC to 0
- ! to stop if there is any truncation of velocities.
-ENERGYSAVEDAYS = 1.0 ! [days] default = 1.0
- ! The interval in units of TIMEUNIT between saves of the energies of the run and
- ! other globally summed diagnostics.
-ENERGYSAVEDAYS_GEOMETRIC = 0.25 ! [days] default = 0.0
- ! The starting interval in units of TIMEUNIT for the first call to save the
- ! energies of the run and other globally summed diagnostics. The interval
- ! increases by a factor of 2. after each call to write_energy.
-
-! === module ocean_model_init ===
-
-! === module MOM_surface_forcing ===
-OCEAN_SURFACE_STAGGER = "A" ! default = "C"
- ! A case-insensitive character string to indicate the
- ! staggering of the surface velocity field that is
- ! returned to the coupler. Valid values include
- ! 'A', 'B', or 'C'.
-
-MAX_P_SURF = 0.0 ! [Pa] default = -1.0
- ! The maximum surface pressure that can be exerted by the atmosphere and
- ! floating sea-ice or ice shelves. This is needed because the FMS coupling
- ! structure does not limit the water that can be frozen out of the ocean and the
- ! ice-ocean heat fluxes are treated explicitly. No limit is applied if a
- ! negative value is used.
-WIND_STAGGER = "A" ! default = "C"
- ! A case-insensitive character string to indicate the
- ! staggering of the input wind stress field. Valid
- ! values are 'A', 'B', or 'C'.
-CD_TIDES = 0.0018 ! [nondim] default = 1.0E-04
- ! The drag coefficient that applies to the tides.
-GUST_CONST = 0.0 ! [Pa] default = 0.02
- ! The background gustiness in the winds.
-FIX_USTAR_GUSTLESS_BUG = False ! [Boolean] default = False
- ! If true correct a bug in the time-averaging of the gustless wind friction
- ! velocity
-USE_RIGID_SEA_ICE = True ! [Boolean] default = False
- ! If true, sea-ice is rigid enough to exert a nonhydrostatic pressure that
- ! resist vertical motion.
-SEA_ICE_RIGID_MASS = 100.0 ! [kg m-2] default = 1000.0
- ! The mass of sea-ice per unit area at which the sea-ice starts to exhibit
- ! rigidity
-LIQUID_RUNOFF_FROM_DATA = @[MOM6_RIVER_RUNOFF] ! [Boolean] default = False
- ! If true, allows liquid river runoff to be specified via
- ! the data_table using the component name 'OCN'.
-! === module ocean_stochastics ===
-DO_SPPT = @[DO_OCN_SPPT] ! [Boolean] default = False
- ! If true perturb the diabatic tendencies in MOM_diabatic_driver
-PERT_EPBL = @[PERT_EPBL] ! [Boolean] default = False
- ! If true perturb the KE dissipation and destruction in MOM_energetic_PBL
-! === module MOM_restart ===
-
-! === module MOM_file_parser ===
diff --git a/parm/ufs/mom6/MOM_input_template_100 b/parm/ufs/mom6/MOM_input_template_100
deleted file mode 100644
index f26d6e4bfb..0000000000
--- a/parm/ufs/mom6/MOM_input_template_100
+++ /dev/null
@@ -1,866 +0,0 @@
-! This file was written by the model and records all non-layout or debugging parameters used at run-time.
-! === module MOM ===
-
-! === module MOM_unit_scaling ===
-! Parameters for doing unit scaling of variables.
-USE_REGRIDDING = True ! [Boolean] default = False
- ! If True, use the ALE algorithm (regridding/remapping). If False, use the
- ! layered isopycnal algorithm.
-THICKNESSDIFFUSE = True ! [Boolean] default = False
- ! If true, interface heights are diffused with a coefficient of KHTH.
-THICKNESSDIFFUSE_FIRST = True ! [Boolean] default = False
- ! If true, do thickness diffusion before dynamics. This is only used if
- ! THICKNESSDIFFUSE is true.
-DT = @[DT_DYNAM_MOM6] ! [s]
- ! The (baroclinic) dynamics time step. The time-step that is actually used will
- ! be an integer fraction of the forcing time-step (DT_FORCING in ocean-only mode
- ! or the coupling timestep in coupled mode.)
-DT_THERM = @[DT_THERM_MOM6] ! [s] default = 1800.0
- ! The thermodynamic and tracer advection time step. Ideally DT_THERM should be
- ! an integer multiple of DT and less than the forcing or coupling time-step,
- ! unless THERMO_SPANS_COUPLING is true, in which case DT_THERM can be an integer
- ! multiple of the coupling timestep. By default DT_THERM is set to DT.
-THERMO_SPANS_COUPLING = @[MOM6_THERMO_SPAN] ! [Boolean] default = False
- ! If true, the MOM will take thermodynamic and tracer timesteps that can be
- ! longer than the coupling timestep. The actual thermodynamic timestep that is
- ! used in this case is the largest integer multiple of the coupling timestep
- ! that is less than or equal to DT_THERM.
-HFREEZE = 20.0 ! [m] default = -1.0
- ! If HFREEZE > 0, melt potential will be computed. The actual depth
- ! over which melt potential is computed will be min(HFREEZE, OBLD)
- ! where OBLD is the boundary layer depth. If HFREEZE <= 0 (default)
- ! melt potential will not be computed.
-DTBT_RESET_PERIOD = -1.0 ! [s] default = 7200.0
- ! The period between recalculations of DTBT (if DTBT <= 0). If DTBT_RESET_PERIOD
- ! is negative, DTBT is set based only on information available at
- ! initialization. If 0, DTBT will be set every dynamics time step. The default
- ! is set by DT_THERM. This is only used if SPLIT is true.
-FRAZIL = True ! [Boolean] default = False
- ! If true, water freezes if it gets too cold, and the accumulated heat deficit
- ! is returned in the surface state. FRAZIL is only used if
- ! ENABLE_THERMODYNAMICS is true.
-BOUND_SALINITY = True ! [Boolean] default = False
- ! If true, limit salinity to being positive. (The sea-ice model may ask for more
- ! salt than is available and drive the salinity negative otherwise.)
-MIN_SALINITY = 0.01 ! [PPT] default = 0.0
- ! The minimum value of salinity when BOUND_SALINITY=True.
-C_P = 3925.0 ! [J kg-1 K-1] default = 3991.86795711963
- ! The heat capacity of sea water, approximated as a constant. This is only used
- ! if ENABLE_THERMODYNAMICS is true. The default value is from the TEOS-10
- ! definition of conservative temperature.
-USE_PSURF_IN_EOS = False ! [Boolean] default = True
- ! If true, always include the surface pressure contributions in equation of
- ! state calculations.
-CHECK_BAD_SURFACE_VALS = True ! [Boolean] default = False
- ! If true, check the surface state for ridiculous values.
-BAD_VAL_SSH_MAX = 50.0 ! [m] default = 20.0
- ! The value of SSH above which a bad value message is triggered, if
- ! CHECK_BAD_SURFACE_VALS is true.
-BAD_VAL_SSS_MAX = 75.0 ! [PPT] default = 45.0
- ! The value of SSS above which a bad value message is triggered, if
- ! CHECK_BAD_SURFACE_VALS is true.
-BAD_VAL_SST_MAX = 55.0 ! [deg C] default = 45.0
- ! The value of SST above which a bad value message is triggered, if
- ! CHECK_BAD_SURFACE_VALS is true.
-BAD_VAL_SST_MIN = -3.0 ! [deg C] default = -2.1
- ! The value of SST below which a bad value message is triggered, if
- ! CHECK_BAD_SURFACE_VALS is true.
-DEFAULT_2018_ANSWERS = True ! [Boolean] default = False
- ! This sets the default value for the various _2018_ANSWERS parameters.
-WRITE_GEOM = 2 ! default = 1
- ! If =0, never write the geometry and vertical grid files. If =1, write the
- ! geometry and vertical grid files only for a new simulation. If =2, always
- ! write the geometry and vertical grid files. Other values are invalid.
-SAVE_INITIAL_CONDS = False ! [Boolean] default = False
- ! If true, write the initial conditions to a file given by IC_OUTPUT_FILE.
-
-! === module MOM_domains ===
-TRIPOLAR_N = True ! [Boolean] default = False
- ! Use tripolar connectivity at the northern edge of the domain. With
- ! TRIPOLAR_N, NIGLOBAL must be even.
-NIGLOBAL = @[NX_GLB] !
- ! The total number of thickness grid points in the x-direction in the physical
- ! domain. With STATIC_MEMORY_ this is set in MOM_memory.h at compile time.
-NJGLOBAL = @[NY_GLB] !
- ! The total number of thickness grid points in the y-direction in the physical
- ! domain. With STATIC_MEMORY_ this is set in MOM_memory.h at compile time.
-
-! === module MOM_hor_index ===
-! Sets the horizontal array index types.
-
-! === module MOM_fixed_initialization ===
-INPUTDIR = "INPUT" ! default = "."
- ! The directory in which input files are found.
-
-! === module MOM_grid_init ===
-GRID_CONFIG = "mosaic" !
- ! A character string that determines the method for defining the horizontal
- ! grid. Current options are:
- ! mosaic - read the grid from a mosaic (supergrid)
- ! file set by GRID_FILE.
- ! cartesian - use a (flat) Cartesian grid.
- ! spherical - use a simple spherical grid.
- ! mercator - use a Mercator spherical grid.
-GRID_FILE = "ocean_hgrid.nc" !
- ! Name of the file from which to read horizontal grid data.
-GRID_ROTATION_ANGLE_BUGS = False ! [Boolean] default = True
- ! If true, use an older algorithm to calculate the sine and
- ! cosines needed rotate between grid-oriented directions and
- ! true north and east. Differences arise at the tripolar fold
-USE_TRIPOLAR_GEOLONB_BUG = False ! [Boolean] default = True
- ! If true, use older code that incorrectly sets the longitude in some points
- ! along the tripolar fold to be off by 360 degrees.
-TOPO_CONFIG = "file" !
- ! This specifies how bathymetry is specified:
- ! file - read bathymetric information from the file
- ! specified by (TOPO_FILE).
- ! flat - flat bottom set to MAXIMUM_DEPTH.
- ! bowl - an analytically specified bowl-shaped basin
- ! ranging between MAXIMUM_DEPTH and MINIMUM_DEPTH.
- ! spoon - a similar shape to 'bowl', but with an vertical
- ! wall at the southern face.
- ! halfpipe - a zonally uniform channel with a half-sine
- ! profile in the meridional direction.
- ! bbuilder - build topography from list of functions.
- ! benchmark - use the benchmark test case topography.
- ! Neverworld - use the Neverworld test case topography.
- ! DOME - use a slope and channel configuration for the
- ! DOME sill-overflow test case.
- ! ISOMIP - use a slope and channel configuration for the
- ! ISOMIP test case.
- ! DOME2D - use a shelf and slope configuration for the
- ! DOME2D gravity current/overflow test case.
- ! Kelvin - flat but with rotated land mask.
- ! seamount - Gaussian bump for spontaneous motion test case.
- ! dumbbell - Sloshing channel with reservoirs on both ends.
- ! shelfwave - exponential slope for shelfwave test case.
- ! Phillips - ACC-like idealized topography used in the Phillips config.
- ! dense - Denmark Strait-like dense water formation and overflow.
- ! USER - call a user modified routine.
-TOPO_EDITS_FILE = "@[TOPOEDITS]" ! default = ""
- ! The file from which to read a list of i,j,z topography overrides.
-ALLOW_LANDMASK_CHANGES = @[MOM6_ALLOW_LANDMASK_CHANGES] ! default = "False"
- ! If true, allow topography overrides to change ocean points to land
-MAXIMUM_DEPTH = 6500.0 ! [m]
- ! The maximum depth of the ocean.
-MINIMUM_DEPTH = 9.5 ! [m] default = 0.0
- ! If MASKING_DEPTH is unspecified, then anything shallower than MINIMUM_DEPTH is
- ! assumed to be land and all fluxes are masked out. If MASKING_DEPTH is
- ! specified, then all depths shallower than MINIMUM_DEPTH but deeper than
- ! MASKING_DEPTH are rounded to MINIMUM_DEPTH.
-
-! === module MOM_open_boundary ===
-! Controls where open boundaries are located, what kind of boundary condition to impose, and what data to apply,
-! if any.
-MASKING_DEPTH = 0.0 ! [m] default = -9999.0
- ! The depth below which to mask points as land points, for which all fluxes are
- ! zeroed out. MASKING_DEPTH is ignored if negative.
-CHANNEL_CONFIG = "list" ! default = "none"
- ! A parameter that determines which set of channels are
- ! restricted to specific widths. Options are:
- ! none - All channels have the grid width.
- ! global_1deg - Sets 16 specific channels appropriate
- ! for a 1-degree model, as used in CM2G.
- ! list - Read the channel locations and widths from a
- ! text file, like MOM_channel_list in the MOM_SIS
- ! test case.
- ! file - Read open face widths everywhere from a
- ! NetCDF file on the model grid.
-CHANNEL_LIST_FILE = "MOM_channels_SPEAR" ! default = "MOM_channel_list"
- ! The file from which the list of narrowed channels is read.
-
-! === module MOM_verticalGrid ===
-! Parameters providing information about the vertical grid.
-NK = 75 ! [nondim]
- ! The number of model layers.
-
-! === module MOM_tracer_registry ===
-
-! === module MOM_EOS ===
-TFREEZE_FORM = "MILLERO_78" ! default = "LINEAR"
- ! TFREEZE_FORM determines which expression should be used for the freezing
- ! point. Currently, the valid choices are "LINEAR", "MILLERO_78", "TEOS10"
-
-! === module MOM_restart ===
-PARALLEL_RESTARTFILES = True ! [Boolean] default = False
- ! If true, each processor writes its own restart file, otherwise a single
- ! restart file is generated
-
-! === module MOM_tracer_flow_control ===
-USE_IDEAL_AGE_TRACER = False ! [Boolean] default = False
- ! If true, use the ideal_age_example tracer package.
-
-! === module ideal_age_example ===
-
-! === module MOM_coord_initialization ===
-COORD_CONFIG = "file" ! default = "none"
- ! This specifies how layers are to be defined:
- ! ALE or none - used to avoid defining layers in ALE mode
- ! file - read coordinate information from the file
- ! specified by (COORD_FILE).
- ! BFB - Custom coords for buoyancy-forced basin case
- ! based on SST_S, T_BOT and DRHO_DT.
- ! linear - linear based on interfaces not layers
- ! layer_ref - linear based on layer densities
- ! ts_ref - use reference temperature and salinity
- ! ts_range - use range of temperature and salinity
- ! (T_REF and S_REF) to determine surface density
- ! and GINT calculate internal densities.
- ! gprime - use reference density (RHO_0) for surface
- ! density and GINT calculate internal densities.
- ! ts_profile - use temperature and salinity profiles
- ! (read from COORD_FILE) to set layer densities.
- ! USER - call a user modified routine.
-COORD_FILE = "layer_coord.nc" !
- ! The file from which the coordinate densities are read.
-REMAP_UV_USING_OLD_ALG = True ! [Boolean] default = False
- ! If true, uses the old remapping-via-a-delta-z method for remapping u and v. If
- ! false, uses the new method that remaps between grids described by an old and
- ! new thickness.
-REGRIDDING_COORDINATE_MODE = "HYCOM1" ! default = "LAYER"
- ! Coordinate mode for vertical regridding. Choose among the following
- ! possibilities: LAYER - Isopycnal or stacked shallow water layers
- ! ZSTAR, Z* - stretched geopotential z*
- ! SIGMA_SHELF_ZSTAR - stretched geopotential z* ignoring shelf
- ! SIGMA - terrain following coordinates
- ! RHO - continuous isopycnal
- ! HYCOM1 - HyCOM-like hybrid coordinate
- ! SLIGHT - stretched coordinates above continuous isopycnal
- ! ADAPTIVE - optimize for smooth neutral density surfaces
-BOUNDARY_EXTRAPOLATION = True ! [Boolean] default = False
- ! When defined, a proper high-order reconstruction scheme is used within
- ! boundary cells rather than PCM. E.g., if PPM is used for remapping, a PPM
- ! reconstruction will also be used within boundary cells.
-ALE_COORDINATE_CONFIG = "HYBRID:hycom1_75_800m.nc,sigma2,FNC1:2,4000,4.5,.01" ! default = "UNIFORM"
- ! Determines how to specify the coordinate resolution. Valid options are:
- ! PARAM - use the vector-parameter ALE_RESOLUTION
- ! UNIFORM[:N] - uniformly distributed
- ! FILE:string - read from a file. The string specifies
- ! the filename and variable name, separated
- ! by a comma or space, e.g. FILE:lev.nc,dz
- ! or FILE:lev.nc,interfaces=zw
- ! WOA09[:N] - the WOA09 vertical grid (approximately)
- ! FNC1:string - FNC1:dz_min,H_total,power,precision
- ! HYBRID:string - read from a file. The string specifies
- ! the filename and two variable names, separated
- ! by a comma or space, for sigma-2 and dz. e.g.
- ! HYBRID:vgrid.nc,sigma2,dz
-!ALE_RESOLUTION = 7*2.0, 2*2.01, 2.02, 2.03, 2.05, 2.08, 2.11, 2.15, 2.21, 2.2800000000000002, 2.37, 2.48, 2.61, 2.77, 2.95, 3.17, 3.4299999999999997, 3.74, 4.09, 4.49, 4.95, 5.48, 6.07, 6.74, 7.5, 8.34, 9.280000000000001, 10.33, 11.49, 12.77, 14.19, 15.74, 17.450000000000003, 19.31, 21.35, 23.56, 25.97, 28.580000000000002, 31.41, 34.47, 37.77, 41.32, 45.14, 49.25, 53.65, 58.370000000000005, 63.42, 68.81, 74.56, 80.68, 87.21000000000001, 94.14, 101.51, 109.33, 117.62, 126.4, 135.68, 145.5, 155.87, 166.81, 178.35, 190.51, 203.31, 216.78, 230.93, 245.8, 261.42, 277.83 ! [m]
- ! The distribution of vertical resolution for the target
- ! grid used for Eulerian-like coordinates. For example,
- ! in z-coordinate mode, the parameter is a list of level
- ! thicknesses (in m). In sigma-coordinate mode, the list
- ! is of non-dimensional fractions of the water column.
-!TARGET_DENSITIES = 1010.0, 1014.3034, 1017.8088, 1020.843, 1023.5566, 1025.813, 1027.0275, 1027.9114, 1028.6422, 1029.2795, 1029.852, 1030.3762, 1030.8626, 1031.3183, 1031.7486, 1032.1572, 1032.5471, 1032.9207, 1033.2798, 1033.6261, 1033.9608, 1034.2519, 1034.4817, 1034.6774, 1034.8508, 1035.0082, 1035.1533, 1035.2886, 1035.4159, 1035.5364, 1035.6511, 1035.7608, 1035.8661, 1035.9675, 1036.0645, 1036.1554, 1036.2411, 1036.3223, 1036.3998, 1036.4739, 1036.5451, 1036.6137, 1036.68, 1036.7441, 1036.8062, 1036.8526, 1036.8874, 1036.9164, 1036.9418, 1036.9647, 1036.9857, 1037.0052, 1037.0236, 1037.0409, 1037.0574, 1037.0738, 1037.0902, 1037.1066, 1037.123, 1037.1394, 1037.1558, 1037.1722, 1037.1887, 1037.206, 1037.2241, 1037.2435, 1037.2642, 1037.2866, 1037.3112, 1037.3389, 1037.3713, 1037.4118, 1037.475, 1037.6332, 1037.8104, 1038.0 ! [m]
- ! HYBRID target densities for interfaces
-MAXIMUM_INT_DEPTH_CONFIG = "FNC1:5,8000.0,1.0,.01" ! default = "NONE"
- ! Determines how to specify the maximum interface depths.
- ! Valid options are:
- ! NONE - there are no maximum interface depths
- ! PARAM - use the vector-parameter MAXIMUM_INTERFACE_DEPTHS
- ! FILE:string - read from a file. The string specifies
- ! the filename and variable name, separated
- ! by a comma or space, e.g. FILE:lev.nc,Z
- ! FNC1:string - FNC1:dz_min,H_total,power,precision
-!MAXIMUM_INT_DEPTHS = 0.0, 5.0, 12.75, 23.25, 36.49, 52.480000000000004, 71.22, 92.71000000000001, 116.94000000000001, 143.92000000000002, 173.65, 206.13, 241.36, 279.33000000000004, 320.05000000000007, 363.5200000000001, 409.7400000000001, 458.7000000000001, 510.4100000000001, 564.8700000000001, 622.0800000000002, 682.0300000000002, 744.7300000000002, 810.1800000000003, 878.3800000000003, 949.3300000000004, 1023.0200000000004, 1099.4600000000005, 1178.6500000000005, 1260.5900000000006, 1345.2700000000007, 1432.7000000000007, 1522.8800000000008, 1615.8100000000009, 1711.490000000001, 1809.910000000001, 1911.080000000001, 2015.0000000000011, 2121.670000000001, 2231.080000000001, 2343.2400000000007, 2458.1500000000005, 2575.8100000000004, 2696.2200000000003, 2819.3700000000003, 2945.2700000000004, 3073.9200000000005, 3205.3200000000006, 3339.4600000000005, 3476.3500000000004, 3615.9900000000002, 3758.38, 3903.52, 4051.4, 4202.03, 4355.41, 4511.54, 4670.41, 4832.03, 4996.4, 5163.5199999999995, 5333.379999999999, 5505.989999999999, 5681.3499999999985, 5859.459999999998, 6040.319999999998, 6223.919999999998, 6410.269999999999, 6599.369999999999, 6791.219999999999, 6985.8099999999995, 7183.15, 7383.24, 7586.08, 7791.67, 8000.0
- ! The list of maximum depths for each interface.
-MAX_LAYER_THICKNESS_CONFIG = "FNC1:400,31000.0,0.1,.01" ! default = "NONE"
- ! Determines how to specify the maximum layer thicknesses.
- ! Valid options are:
- ! NONE - there are no maximum layer thicknesses
- ! PARAM - use the vector-parameter MAX_LAYER_THICKNESS
- ! FILE:string - read from a file. The string specifies
- ! the filename and variable name, separated
- ! by a comma or space, e.g. FILE:lev.nc,Z
- ! FNC1:string - FNC1:dz_min,H_total,power,precision
-!MAX_LAYER_THICKNESS = 400.0, 409.63, 410.32, 410.75, 411.07, 411.32, 411.52, 411.7, 411.86, 412.0, 412.13, 412.24, 412.35, 412.45, 412.54, 412.63, 412.71, 412.79, 412.86, 412.93, 413.0, 413.06, 413.12, 413.18, 413.24, 413.29, 413.34, 413.39, 413.44, 413.49, 413.54, 413.58, 413.62, 413.67, 413.71, 413.75, 413.78, 413.82, 413.86, 413.9, 413.93, 413.97, 414.0, 414.03, 414.06, 414.1, 414.13, 414.16, 414.19, 414.22, 414.24, 414.27, 414.3, 414.33, 414.35, 414.38, 414.41, 414.43, 414.46, 414.48, 414.51, 414.53, 414.55, 414.58, 414.6, 414.62, 414.65, 414.67, 414.69, 414.71, 414.73, 414.75, 414.77, 414.79, 414.83 ! [m]
- ! The list of maximum thickness for each layer.
-REMAPPING_SCHEME = "PPM_H4" ! default = "PLM"
- ! This sets the reconstruction scheme used for vertical remapping for all
- ! variables. It can be one of the following schemes: PCM (1st-order
- ! accurate)
- ! PLM (2nd-order accurate)
- ! PPM_H4 (3rd-order accurate)
- ! PPM_IH4 (3rd-order accurate)
- ! PQM_IH4IH3 (4th-order accurate)
- ! PQM_IH6IH5 (5th-order accurate)
-
-! === module MOM_grid ===
-! Parameters providing information about the lateral grid.
-
-! === module MOM_state_initialization ===
-INIT_LAYERS_FROM_Z_FILE = True ! [Boolean] default = False
- ! If true, initialize the layer thicknesses, temperatures, and salinities from a
- ! Z-space file on a latitude-longitude grid.
-
-! === module MOM_initialize_layers_from_Z ===
-TEMP_SALT_Z_INIT_FILE = "MOM6_IC_TS.nc" ! default = "temp_salt_z.nc"
- ! The name of the z-space input file used to initialize
- ! temperatures (T) and salinities (S). If T and S are not
- ! in the same file, TEMP_Z_INIT_FILE and SALT_Z_INIT_FILE
- ! must be set.
-Z_INIT_FILE_PTEMP_VAR = "temp" ! default = "ptemp"
- ! The name of the potential temperature variable in
- ! TEMP_Z_INIT_FILE.
-Z_INIT_FILE_SALT_VAR = "salt" ! default = "salt"
- ! The name of the salinity variable in
- ! SALT_Z_INIT_FILE.
-Z_INIT_ALE_REMAPPING = True ! [Boolean] default = False
- ! If True, then remap straight to model coordinate from file.
-Z_INIT_REMAP_OLD_ALG = True ! [Boolean] default = False
- ! If false, uses the preferred remapping algorithm for initialization. If true,
- ! use an older, less robust algorithm for remapping.
-
-! === module MOM_diag_mediator ===
-!Jiande NUM_DIAG_COORDS = 2 ! default = 1
-NUM_DIAG_COORDS = 1
- ! The number of diagnostic vertical coordinates to use.
- ! For each coordinate, an entry in DIAG_COORDS must be provided.
-!Jiande DIAG_COORDS = "z Z ZSTAR", "rho2 RHO2 RHO" !
-DIAG_COORDS = "z Z ZSTAR"
- ! A list of string tuples associating diag_table modules to
- ! a coordinate definition used for diagnostics. Each string
- ! is of the form "MODULE_SUFFIX,PARAMETER_SUFFIX,COORDINATE_NAME".
-DIAG_COORD_DEF_Z="FILE:@[MOM6_DIAG_COORD_DEF_Z_FILE],interfaces=zw"
-DIAG_MISVAL = @[MOM6_DIAG_MISVAL]
-!AVAILABLE_DIAGS_FILE = "available_diags.002160" ! default = "available_diags.000000"
- ! A file into which to write a list of all available ocean diagnostics that can
- ! be included in a diag_table.
-!DIAG_COORD_DEF_Z = "FILE:vgrid_75_2m.nc,dz" ! default = "WOA09"
- ! Determines how to specify the coordinate resolution. Valid options are:
- ! PARAM - use the vector-parameter DIAG_COORD_RES_Z
- ! UNIFORM[:N] - uniformly distributed
- ! FILE:string - read from a file. The string specifies
- ! the filename and variable name, separated
- ! by a comma or space, e.g. FILE:lev.nc,dz
- ! or FILE:lev.nc,interfaces=zw
- ! WOA09[:N] - the WOA09 vertical grid (approximately)
- ! FNC1:string - FNC1:dz_min,H_total,power,precision
- ! HYBRID:string - read from a file. The string specifies
- ! the filename and two variable names, separated
- ! by a comma or space, for sigma-2 and dz. e.g.
- ! HYBRID:vgrid.nc,sigma2,dz
-!DIAG_COORD_DEF_RHO2 = "RFNC1:35,999.5,1028,1028.5,8.,1038.,0.0078125" ! default = "WOA09"
- ! Determines how to specify the coordinate resolution. Valid options are:
- ! PARAM - use the vector-parameter DIAG_COORD_RES_RHO2
- ! UNIFORM[:N] - uniformly distributed
- ! FILE:string - read from a file. The string specifies
- ! the filename and variable name, separated
- ! by a comma or space, e.g. FILE:lev.nc,dz
- ! or FILE:lev.nc,interfaces=zw
- ! WOA09[:N] - the WOA09 vertical grid (approximately)
- ! FNC1:string - FNC1:dz_min,H_total,power,precision
- ! HYBRID:string - read from a file. The string specifies
- ! the filename and two variable names, separated
- ! by a comma or space, for sigma-2 and dz. e.g.
- ! HYBRID:vgrid.nc,sigma2,dz
-
-! === module MOM_MEKE ===
-USE_MEKE = True ! [Boolean] default = False
- ! If true, turns on the MEKE scheme which calculates a sub-grid mesoscale eddy
- ! kinetic energy budget.
-MEKE_GMCOEFF = 1.0 ! [nondim] default = -1.0
- ! The efficiency of the conversion of potential energy into MEKE by the
- ! thickness mixing parameterization. If MEKE_GMCOEFF is negative, this
- ! conversion is not used or calculated.
-MEKE_BGSRC = 1.0E-13 ! [W kg-1] default = 0.0
- ! A background energy source for MEKE.
-MEKE_KHTH_FAC = 0.8 ! [nondim] default = 0.0
- ! A factor that maps MEKE%Kh to KhTh.
-MEKE_KHTR_FAC = 0.8 ! [nondim] default = 0.0
- ! A factor that maps MEKE%Kh to KhTr.
-MEKE_ALPHA_RHINES = 0.05 ! [nondim] default = 0.0
- ! If positive, is a coefficient weighting the Rhines scale in the expression for
- ! mixing length used in MEKE-derived diffusivity.
-MEKE_ALPHA_EADY = 0.05 ! [nondim] default = 0.0
- ! If positive, is a coefficient weighting the Eady length scale in the
- ! expression for mixing length used in MEKE-derived diffusivity.
-
-! === module MOM_lateral_mixing_coeffs ===
-USE_VARIABLE_MIXING = True ! [Boolean] default = False
- ! If true, the variable mixing code will be called. This allows diagnostics to
- ! be created even if the scheme is not used. If KHTR_SLOPE_CFF>0 or
- ! KhTh_Slope_Cff>0, this is set to true regardless of what is in the parameter
- ! file.
-RESOLN_SCALED_KH = True ! [Boolean] default = False
- ! If true, the Laplacian lateral viscosity is scaled away when the first
- ! baroclinic deformation radius is well resolved.
-RESOLN_SCALED_KHTH = True ! [Boolean] default = False
- ! If true, the interface depth diffusivity is scaled away when the first
- ! baroclinic deformation radius is well resolved.
-KHTR_SLOPE_CFF = 0.25 ! [nondim] default = 0.0
- ! The nondimensional coefficient in the Visbeck formula for the epipycnal tracer
- ! diffusivity
-USE_STORED_SLOPES = True ! [Boolean] default = False
- ! If true, the isopycnal slopes are calculated once and stored for re-use. This
- ! uses more memory but avoids calling the equation of state more times than
- ! should be necessary.
-KH_RES_FN_POWER = 100 ! [nondim] default = 2
- ! The power of dx/Ld in the Kh resolution function. Any positive integer may be
- ! used, although even integers are more efficient to calculate. Setting this
- ! greater than 100 results in a step-function being used.
-VISC_RES_FN_POWER = 2 ! [nondim] default = 100
- ! The power of dx/Ld in the Kh resolution function. Any positive integer may be
- ! used, although even integers are more efficient to calculate. Setting this
- ! greater than 100 results in a step-function being used. This function affects
- ! lateral viscosity, Kh, and not KhTh.
-INTERNAL_WAVE_SPEED_BETTER_EST = False ! [Boolean] default = True
- ! If true, use a more robust estimate of the first mode wave speed as the
- ! starting point for iterations.
-
-! === module MOM_set_visc ===
-CHANNEL_DRAG = True ! [Boolean] default = False
- ! If true, the bottom drag is exerted directly on each layer proportional to the
- ! fraction of the bottom it overlies.
-HBBL = 10.0 ! [m]
- ! The thickness of a bottom boundary layer with a viscosity of KVBBL if
- ! BOTTOMDRAGLAW is not defined, or the thickness over which near-bottom
- ! velocities are averaged for the drag law if BOTTOMDRAGLAW is defined but
- ! LINEAR_DRAG is not.
-DRAG_BG_VEL = 0.1 ! [m s-1] default = 0.0
- ! DRAG_BG_VEL is either the assumed bottom velocity (with LINEAR_DRAG) or an
- ! unresolved velocity that is combined with the resolved velocity to estimate
- ! the velocity magnitude. DRAG_BG_VEL is only used when BOTTOMDRAGLAW is
- ! defined.
-BBL_USE_EOS = True ! [Boolean] default = False
- ! If true, use the equation of state in determining the properties of the bottom
- ! boundary layer. Otherwise use the layer target potential densities.
-BBL_THICK_MIN = 0.1 ! [m] default = 0.0
- ! The minimum bottom boundary layer thickness that can be used with
- ! BOTTOMDRAGLAW. This might be Kv/(cdrag*drag_bg_vel) to give Kv as the minimum
- ! near-bottom viscosity.
-KV = 1.0E-04 ! [m2 s-1]
- ! The background kinematic viscosity in the interior. The molecular value, ~1e-6
- ! m2 s-1, may be used.
-KV_BBL_MIN = 0.0 ! [m2 s-1] default = 1.0E-04
- ! The minimum viscosities in the bottom boundary layer.
-KV_TBL_MIN = 0.0 ! [m2 s-1] default = 1.0E-04
- ! The minimum viscosities in the top boundary layer.
-
-! === module MOM_thickness_diffuse ===
-USE_GM_WORK_BUG = True ! [Boolean] default = False
- ! If true, compute the top-layer work tendency on the u-grid with the incorrect
- ! sign, for legacy reproducibility.
-
-! === module MOM_dynamics_split_RK2 ===
-
-! === module MOM_continuity ===
-
-! === module MOM_continuity_PPM ===
-ETA_TOLERANCE = 1.0E-06 ! [m] default = 3.75E-09
- ! The tolerance for the differences between the barotropic and baroclinic
- ! estimates of the sea surface height due to the fluxes through each face. The
- ! total tolerance for SSH is 4 times this value. The default is
- ! 0.5*NK*ANGSTROM, and this should not be set less than about
- ! 10^-15*MAXIMUM_DEPTH.
-ETA_TOLERANCE_AUX = 0.001 ! [m] default = 1.0E-06
- ! The tolerance for free-surface height discrepancies between the barotropic
- ! solution and the sum of the layer thicknesses when calculating the auxiliary
- ! corrected velocities. By default, this is the same as ETA_TOLERANCE, but can
- ! be made larger for efficiency.
-
-! === module MOM_CoriolisAdv ===
-CORIOLIS_SCHEME = "SADOURNY75_ENSTRO" ! default = "SADOURNY75_ENERGY"
- ! CORIOLIS_SCHEME selects the discretization for the Coriolis terms. Valid
- ! values are:
- ! SADOURNY75_ENERGY - Sadourny, 1975; energy cons.
- ! ARAKAWA_HSU90 - Arakawa & Hsu, 1990
- ! SADOURNY75_ENSTRO - Sadourny, 1975; enstrophy cons.
- ! ARAKAWA_LAMB81 - Arakawa & Lamb, 1981; En. + Enst.
- ! ARAKAWA_LAMB_BLEND - A blend of Arakawa & Lamb with
- ! Arakawa & Hsu and Sadourny energy
-BOUND_CORIOLIS = True ! [Boolean] default = False
- ! If true, the Coriolis terms at u-points are bounded by the four estimates of
- ! (f+rv)v from the four neighboring v-points, and similarly at v-points. This
- ! option would have no effect on the SADOURNY Coriolis scheme if it were
- ! possible to use centered difference thickness fluxes.
-
-! === module MOM_PressureForce ===
-
-! === module MOM_PressureForce_AFV ===
-MASS_WEIGHT_IN_PRESSURE_GRADIENT = True ! [Boolean] default = False
- ! If true, use mass weighting when interpolating T/S for integrals near the
- ! bathymetry in AFV pressure gradient calculations.
-
-! === module MOM_hor_visc ===
-LAPLACIAN = True ! [Boolean] default = False
- ! If true, use a Laplacian horizontal viscosity.
-SMAGORINSKY_KH = True ! [Boolean] default = False
- ! If true, use a Smagorinsky nonlinear eddy viscosity.
-SMAG_LAP_CONST = 0.15 ! [nondim] default = 0.0
- ! The nondimensional Laplacian Smagorinsky constant, often 0.15.
-AH_VEL_SCALE = 0.05 ! [m s-1] default = 0.0
- ! The velocity scale which is multiplied by the cube of the grid spacing to
- ! calculate the biharmonic viscosity. The final viscosity is the largest of this
- ! scaled viscosity, the Smagorinsky and Leith viscosities, and AH.
-SMAGORINSKY_AH = True ! [Boolean] default = False
- ! If true, use a biharmonic Smagorinsky nonlinear eddy viscosity.
-SMAG_BI_CONST = 0.06 ! [nondim] default = 0.0
- ! The nondimensional biharmonic Smagorinsky constant, typically 0.015 - 0.06.
-USE_KH_BG_2D = True ! [Boolean] default = False
- ! If true, read a file containing 2-d background harmonic viscosities. The final
- ! viscosity is the maximum of the other terms and this background value.
-
-! === module MOM_vert_friction ===
-HMIX_FIXED = 0.5 ! [m]
- ! The prescribed depth over which the near-surface viscosity and diffusivity are
- ! elevated when the bulk mixed layer is not used.
-KVML = 1.0E-04 ! [m2 s-1] default = 1.0E-04
- ! The kinematic viscosity in the mixed layer. A typical value is ~1e-2 m2 s-1.
- ! KVML is not used if BULKMIXEDLAYER is true. The default is set by KV.
-MAXVEL = 6.0 ! [m s-1] default = 3.0E+08
- ! The maximum velocity allowed before the velocity components are truncated.
-
-! === module MOM_barotropic ===
-BOUND_BT_CORRECTION = True ! [Boolean] default = False
- ! If true, the corrective pseudo mass-fluxes into the barotropic solver are
- ! limited to values that require less than maxCFL_BT_cont to be accommodated.
-BT_PROJECT_VELOCITY = True ! [Boolean] default = False
- ! If true, step the barotropic velocity first and project out the velocity
- ! tendency by 1+BEBT when calculating the transport. The default (false) is to
- ! use a predictor continuity step to find the pressure field, and then to do a
- ! corrector continuity step using a weighted average of the old and new
- ! velocities, with weights of (1-BEBT) and BEBT.
-BT_STRONG_DRAG = True ! [Boolean] default = False
- ! If true, use a stronger estimate of the retarding effects of strong bottom
- ! drag, by making it implicit with the barotropic time-step instead of implicit
- ! with the baroclinic time-step and dividing by the number of barotropic steps.
-BEBT = 0.2 ! [nondim] default = 0.1
- ! BEBT determines whether the barotropic time stepping uses the forward-backward
- ! time-stepping scheme or a backward Euler scheme. BEBT is valid in the range
- ! from 0 (for a forward-backward treatment of nonrotating gravity waves) to 1
- ! (for a backward Euler treatment). In practice, BEBT must be greater than about
- ! 0.05.
-DTBT = -0.9 ! [s or nondim] default = -0.98
- ! The barotropic time step, in s. DTBT is only used with the split explicit time
- ! stepping. To set the time step automatically based the maximum stable value
- ! use 0, or a negative value gives the fraction of the stable value. Setting
- ! DTBT to 0 is the same as setting it to -0.98. The value of DTBT that will
- ! actually be used is an integer fraction of DT, rounding down.
-
-! === module MOM_mixed_layer_restrat ===
-MIXEDLAYER_RESTRAT = True ! [Boolean] default = False
- ! If true, a density-gradient dependent re-stratifying flow is imposed in the
- ! mixed layer. Can be used in ALE mode without restriction but in layer mode can
- ! only be used if BULKMIXEDLAYER is true.
-FOX_KEMPER_ML_RESTRAT_COEF = 60.0 ! [nondim] default = 0.0
- ! A nondimensional coefficient that is proportional to the ratio of the
- ! deformation radius to the dominant lengthscale of the submesoscale mixed layer
- ! instabilities, times the minimum of the ratio of the mesoscale eddy kinetic
- ! energy to the large-scale geostrophic kinetic energy or 1 plus the square of
- ! the grid spacing over the deformation radius, as detailed by Fox-Kemper et al.
- ! (2010)
-MLE_USE_PBL_MLD = True ! [Boolean] default = False
- ! If true, the MLE parameterization will use the mixed-layer depth provided by
- ! the active PBL parameterization. If false, MLE will estimate a MLD based on a
- ! density difference with the surface using the parameter MLE_DENSITY_DIFF.
-MLE_MLD_DECAY_TIME = 2.592E+06 ! [s] default = 0.0
- ! The time-scale for a running-mean filter applied to the mixed-layer depth used
- ! in the MLE restratification parameterization. When the MLD deepens below the
- ! current running-mean the running-mean is instantaneously set to the current
- ! MLD.
-
-! === module MOM_diabatic_driver ===
-! The following parameters are used for diabatic processes.
-ENERGETICS_SFC_PBL = True ! [Boolean] default = False
- ! If true, use an implied energetics planetary boundary layer scheme to
- ! determine the diffusivity and viscosity in the surface boundary layer.
-EPBL_IS_ADDITIVE = False ! [Boolean] default = True
- ! If true, the diffusivity from ePBL is added to all other diffusivities.
- ! Otherwise, the larger of kappa-shear and ePBL diffusivities are used.
-KD_MIN_TR = 2.0E-06 ! [m2 s-1] default = 2.0E-06
- ! A minimal diffusivity that should always be applied to tracers, especially in
- ! massless layers near the bottom. The default is 0.1*KD.
-
-! === module MOM_CVMix_KPP ===
-! This is the MOM wrapper to CVMix:KPP
-! See http://cvmix.github.io/
-
-! === module MOM_tidal_mixing ===
-! Vertical Tidal Mixing Parameterization
-INT_TIDE_DISSIPATION = True ! [Boolean] default = False
- ! If true, use an internal tidal dissipation scheme to drive diapycnal mixing,
- ! along the lines of St. Laurent et al. (2002) and Simmons et al. (2004).
-INT_TIDE_PROFILE = "POLZIN_09" ! default = "STLAURENT_02"
- ! INT_TIDE_PROFILE selects the vertical profile of energy dissipation with
- ! INT_TIDE_DISSIPATION. Valid values are:
- ! STLAURENT_02 - Use the St. Laurent et al exponential
- ! decay profile.
- ! POLZIN_09 - Use the Polzin WKB-stretched algebraic
- ! decay profile.
-KAPPA_ITIDES = 6.28319E-04 ! [m-1] default = 6.283185307179586E-04
- ! A topographic wavenumber used with INT_TIDE_DISSIPATION. The default is 2pi/10
- ! km, as in St.Laurent et al. 2002.
-KAPPA_H2_FACTOR = 0.84 ! [nondim] default = 1.0
- ! A scaling factor for the roughness amplitude with INT_TIDE_DISSIPATION.
-TKE_ITIDE_MAX = 0.1 ! [W m-2] default = 1000.0
- ! The maximum internal tide energy source available to mix above the bottom
- ! boundary layer with INT_TIDE_DISSIPATION.
-READ_TIDEAMP = True ! [Boolean] default = False
- ! If true, read a file (given by TIDEAMP_FILE) containing the tidal amplitude
- ! with INT_TIDE_DISSIPATION.
-TIDEAMP_FILE = "tidal_amplitude.nc" ! default = "tideamp.nc"
- ! The path to the file containing the spatially varying tidal amplitudes with
- ! INT_TIDE_DISSIPATION.
-H2_FILE = "topog.nc" !
- ! The path to the file containing the sub-grid-scale topographic roughness
- ! amplitude with INT_TIDE_DISSIPATION.
-
-! === module MOM_CVMix_conv ===
-! Parameterization of enhanced mixing due to convection via CVMix
-
-! === module MOM_set_diffusivity ===
-BBL_MIXING_AS_MAX = False ! [Boolean] default = True
- ! If true, take the maximum of the diffusivity from the BBL mixing and the other
- ! diffusivities. Otherwise, diffusivity from the BBL_mixing is simply added.
-USE_LOTW_BBL_DIFFUSIVITY = True ! [Boolean] default = False
- ! If true, uses a simple, imprecise but non-coordinate dependent, model of BBL
- ! mixing diffusivity based on Law of the Wall. Otherwise, uses the original BBL
- ! scheme.
-SIMPLE_TKE_TO_KD = True ! [Boolean] default = False
- ! If true, uses a simple estimate of Kd/TKE that will work for arbitrary
- ! vertical coordinates. If false, calculates Kd/TKE and bounds based on exact
- ! energetics for an isopycnal layer-formulation.
-
-! === module MOM_bkgnd_mixing ===
-! Adding static vertical background mixing coefficients
-KD = 2.0E-05 ! [m2 s-1] default = 0.0
- ! The background diapycnal diffusivity of density in the interior. Zero or the
- ! molecular value, ~1e-7 m2 s-1, may be used.
-KD_MIN = 2.0E-06 ! [m2 s-1] default = 2.0E-07
- ! The minimum diapycnal diffusivity.
-HENYEY_IGW_BACKGROUND = True ! [Boolean] default = False
- ! If true, use a latitude-dependent scaling for the near surface background
- ! diffusivity, as described in Harrison & Hallberg, JPO 2008.
-KD_MAX = 0.1 ! [m2 s-1] default = -1.0
- ! The maximum permitted increment for the diapycnal diffusivity from TKE-based
- ! parameterizations, or a negative value for no limit.
-
-! === module MOM_kappa_shear ===
-! Parameterization of shear-driven turbulence following Jackson, Hallberg and Legg, JPO 2008
-USE_JACKSON_PARAM = True ! [Boolean] default = False
- ! If true, use the Jackson-Hallberg-Legg (JPO 2008) shear mixing
- ! parameterization.
-MAX_RINO_IT = 25 ! [nondim] default = 50
- ! The maximum number of iterations that may be used to estimate the Richardson
- ! number driven mixing.
-VERTEX_SHEAR = False ! [Boolean] default = False
- ! If true, do the calculations of the shear-driven mixing
- ! at the cell vertices (i.e., the vorticity points).
-KD_TRUNC_KAPPA_SHEAR = 2.0E-07 ! [m2 s-1] default = 2.0E-07
- ! The value of shear-driven diffusivity that is considered negligible and is
- ! rounded down to 0. The default is 1% of KD_KAPPA_SHEAR_0.
-KAPPA_SHEAR_ITER_BUG = True ! [Boolean] default = False
- ! If true, use an older, dimensionally inconsistent estimate of the derivative
- ! of diffusivity with energy in the Newton's method iteration. The bug causes
- ! undercorrections when dz > 1 m.
-KAPPA_SHEAR_ALL_LAYER_TKE_BUG = True ! [Boolean] default = False
- ! If true, report back the latest estimate of TKE instead of the time average
- ! TKE when there is mass in all layers. Otherwise always report the time
- ! averaged TKE, as is currently done when there are some massless layers.
-
-! === module MOM_CVMix_shear ===
-! Parameterization of shear-driven turbulence via CVMix (various options)
-
-! === module MOM_CVMix_ddiff ===
-! Parameterization of mixing due to double diffusion processes via CVMix
-
-! === module MOM_diabatic_aux ===
-! The following parameters are used for auxiliary diabatic processes.
-PRESSURE_DEPENDENT_FRAZIL = False ! [Boolean] default = False
- ! If true, use a pressure dependent freezing temperature when making frazil. The
- ! default is false, which will be faster but is inappropriate with ice-shelf
- ! cavities.
-VAR_PEN_SW = True ! [Boolean] default = False
- ! If true, use one of the CHL_A schemes specified by OPACITY_SCHEME to determine
- ! the e-folding depth of incoming short wave radiation.
-CHL_FILE = @[CHLCLIM] !
- ! CHL_FILE is the file containing chl_a concentrations in the variable CHL_A. It
- ! is used when VAR_PEN_SW and CHL_FROM_FILE are true.
-
-! === module MOM_energetic_PBL ===
-ML_OMEGA_FRAC = 0.001 ! [nondim] default = 0.0
- ! When setting the decay scale for turbulence, use this fraction of the absolute
- ! rotation rate blended with the local value of f, as sqrt((1-of)*f^2 +
- ! of*4*omega^2).
-TKE_DECAY = 0.01 ! [nondim] default = 2.5
- ! TKE_DECAY relates the vertical rate of decay of the TKE available for
- ! mechanical entrainment to the natural Ekman depth.
-EPBL_MSTAR_SCHEME = "OM4" ! default = "CONSTANT"
- ! EPBL_MSTAR_SCHEME selects the method for setting mstar. Valid values are:
- ! CONSTANT - Use a fixed mstar given by MSTAR
- ! OM4 - Use L_Ekman/L_Obukhov in the sabilizing limit, as in OM4
- ! REICHL_H18 - Use the scheme documented in Reichl & Hallberg, 2018.
-MSTAR_CAP = 10.0 ! [nondim] default = -1.0
- ! If this value is positive, it sets the maximum value of mstar allowed in ePBL.
- ! (This is not used if EPBL_MSTAR_SCHEME = CONSTANT).
-MSTAR2_COEF1 = 0.29 ! [nondim] default = 0.3
- ! Coefficient in computing mstar when rotation and stabilizing effects are both
- ! important (used if EPBL_MSTAR_SCHEME = OM4).
-MSTAR2_COEF2 = 0.152 ! [nondim] default = 0.085
- ! Coefficient in computing mstar when only rotation limits the total mixing
- ! (used if EPBL_MSTAR_SCHEME = OM4)
-NSTAR = 0.06 ! [nondim] default = 0.2
- ! The portion of the buoyant potential energy imparted by surface fluxes that is
- ! available to drive entrainment at the base of mixed layer when that energy is
- ! positive.
-MSTAR_CONV_ADJ = 0.667 ! [nondim] default = 0.0
- ! Coefficient used for reducing mstar during convection due to reduction of
- ! stable density gradient.
-USE_MLD_ITERATION = False ! [Boolean] default = True
- ! A logical that specifies whether or not to use the distance to the bottom of
- ! the actively turbulent boundary layer to help set the EPBL length scale.
-EPBL_TRANSITION_SCALE = 0.01 ! [nondim] default = 0.1
- ! A scale for the mixing length in the transition layer at the edge of the
- ! boundary layer as a fraction of the boundary layer thickness.
-MIX_LEN_EXPONENT = 1.0 ! [nondim] default = 2.0
- ! The exponent applied to the ratio of the distance to the MLD and the MLD depth
- ! which determines the shape of the mixing length. This is only used if
- ! USE_MLD_ITERATION is True.
-USE_LA_LI2016 = @[MOM6_USE_LI2016] ! [nondim] default = False
- ! A logical to use the Li et al. 2016 (submitted) formula to determine the
- ! Langmuir number.
-USE_WAVES = @[MOM6_USE_WAVES] ! [Boolean] default = False
- ! If true, enables surface wave modules.
-WAVE_METHOD = "SURFACE_BANDS" ! default = "EMPTY"
- ! Choice of wave method, valid options include:
- ! TEST_PROFILE - Prescribed from surface Stokes drift
- ! and a decay wavelength.
- ! SURFACE_BANDS - Computed from multiple surface values
- ! and decay wavelengths.
- ! DHH85 - Uses Donelan et al. 1985 empirical
- ! wave spectrum with prescribed values.
- ! LF17 - Infers Stokes drift profile from wind
- ! speed following Li and Fox-Kemper 2017.
-SURFBAND_SOURCE = "COUPLER" ! default = "EMPTY"
- ! Choice of SURFACE_BANDS data mode, valid options include:
- ! DATAOVERRIDE - Read from NetCDF using FMS DataOverride.
- ! COUPLER - Look for variables from coupler pass
- ! INPUT - Testing with fixed values.
-STK_BAND_COUPLER = 3 ! default = 1
- ! STK_BAND_COUPLER is the number of Stokes drift bands in the coupler. This has
- ! to be consistent with the number of Stokes drift bands in WW3, or the model
- ! will fail.
-SURFBAND_WAVENUMBERS = 0.04, 0.11, 0.3305 ! [rad/m] default = 0.12566
- ! Central wavenumbers for surface Stokes drift bands.
-EPBL_LANGMUIR_SCHEME = "ADDITIVE" ! default = "NONE"
- ! EPBL_LANGMUIR_SCHEME selects the method for including Langmuir turbulence.
- ! Valid values are:
- ! NONE - Do not do any extra mixing due to Langmuir turbulence
- ! RESCALE - Use a multiplicative rescaling of mstar to account for Langmuir
- ! turbulence
- ! ADDITIVE - Add a Langmuir turblence contribution to mstar to other
- ! contributions
-LT_ENHANCE_COEF = 0.044 ! [nondim] default = 0.447
- ! Coefficient for Langmuir enhancement of mstar
-LT_ENHANCE_EXP = -1.5 ! [nondim] default = -1.33
- ! Exponent for Langmuir enhancementt of mstar
-LT_MOD_LAC1 = 0.0 ! [nondim] default = -0.87
- ! Coefficient for modification of Langmuir number due to MLD approaching Ekman
- ! depth.
-LT_MOD_LAC4 = 0.0 ! [nondim] default = 0.95
- ! Coefficient for modification of Langmuir number due to ratio of Ekman to
- ! stable Obukhov depth.
-LT_MOD_LAC5 = 0.22 ! [nondim] default = 0.95
- ! Coefficient for modification of Langmuir number due to ratio of Ekman to
- ! unstable Obukhov depth.
-
-! === module MOM_regularize_layers ===
-
-! === module MOM_opacity ===
-PEN_SW_NBANDS = 3 ! default = 1
- ! The number of bands of penetrating shortwave radiation.
-
-! === module MOM_tracer_advect ===
-TRACER_ADVECTION_SCHEME = "PPM:H3" ! default = "PLM"
- ! The horizontal transport scheme for tracers:
- ! PLM - Piecewise Linear Method
- ! PPM:H3 - Piecewise Parabolic Method (Huyhn 3rd order)
- ! PPM - Piecewise Parabolic Method (Colella-Woodward)
-
-! === module MOM_tracer_hor_diff ===
-CHECK_DIFFUSIVE_CFL = True ! [Boolean] default = False
- ! If true, use enough iterations the diffusion to ensure that the diffusive
- ! equivalent of the CFL limit is not violated. If false, always use the greater
- ! of 1 or MAX_TR_DIFFUSION_CFL iteration.
-
-! === module MOM_neutral_diffusion ===
-! This module implements neutral diffusion of tracers
-USE_NEUTRAL_DIFFUSION = True ! [Boolean] default = False
- ! If true, enables the neutral diffusion module.
-
-! === module MOM_lateral_boundary_diffusion ===
-! This module implements lateral diffusion of tracers near boundaries
-
-! === module MOM_sum_output ===
-CALCULATE_APE = False ! [Boolean] default = True
- ! If true, calculate the available potential energy of the interfaces. Setting
- ! this to false reduces the memory footprint of high-PE-count models
- ! dramatically.
-MAXTRUNC = 100000 ! [truncations save_interval-1] default = 0
- ! The run will be stopped, and the day set to a very large value if the velocity
- ! is truncated more than MAXTRUNC times between energy saves. Set MAXTRUNC to 0
- ! to stop if there is any truncation of velocities.
-ENERGYSAVEDAYS = 0.25 ! [days] default = 1.0
- ! The interval in units of TIMEUNIT between saves of the energies of the run and
- ! other globally summed diagnostics.
-
-! === module ocean_model_init ===
-
-! === module MOM_oda_incupd ===
-ODA_INCUPD = @[ODA_INCUPD] ! [Boolean] default = False
- ! If true, oda incremental updates will be applied
- ! everywhere in the domain.
-ODA_INCUPD_FILE = "mom6_increment.nc" ! The name of the file with the T,S,h increments.
-
-ODA_TEMPINC_VAR = "Temp" ! default = "ptemp_inc"
- ! The name of the potential temperature inc. variable in
- ! ODA_INCUPD_FILE.
-ODA_SALTINC_VAR = "Salt" ! default = "sal_inc"
- ! The name of the salinity inc. variable in
- ! ODA_INCUPD_FILE.
-ODA_THK_VAR = "h" ! default = "h"
- ! The name of the int. depth inc. variable in
- ! ODA_INCUPD_FILE.
-ODA_INCUPD_UV = true !
-ODA_UINC_VAR = "u" ! default = "u_inc"
- ! The name of the zonal vel. inc. variable in
- ! ODA_INCUPD_UV_FILE.
-ODA_VINC_VAR = "v" ! default = "v_inc"
- ! The name of the meridional vel. inc. variable in
- ! ODA_INCUPD_UV_FILE.
-ODA_INCUPD_NHOURS = @[ODA_INCUPD_NHOURS] ! default=3.0
-
-! === module MOM_surface_forcing ===
-OCEAN_SURFACE_STAGGER = "A" ! default = "C"
- ! A case-insensitive character string to indicate the
- ! staggering of the surface velocity field that is
- ! returned to the coupler. Valid values include
- ! 'A', 'B', or 'C'.
-
-MAX_P_SURF = 0.0 ! [Pa] default = -1.0
- ! The maximum surface pressure that can be exerted by the atmosphere and
- ! floating sea-ice or ice shelves. This is needed because the FMS coupling
- ! structure does not limit the water that can be frozen out of the ocean and the
- ! ice-ocean heat fluxes are treated explicitly. No limit is applied if a
- ! negative value is used.
-WIND_STAGGER = "A" ! default = "C"
- ! A case-insensitive character string to indicate the
- ! staggering of the input wind stress field. Valid
- ! values are 'A', 'B', or 'C'.
-CD_TIDES = 0.0018 ! [nondim] default = 1.0E-04
- ! The drag coefficient that applies to the tides.
-GUST_CONST = 0.02 ! [Pa] default = 0.0
- ! The background gustiness in the winds.
-FIX_USTAR_GUSTLESS_BUG = False ! [Boolean] default = True
- ! If true correct a bug in the time-averaging of the gustless wind friction
- ! velocity
-! === module ocean_stochastics ===
-DO_SPPT = @[DO_OCN_SPPT] ! [Boolean] default = False
- ! If true perturb the diabatic tendencies in MOM_diabatic_driver
-PERT_EPBL = @[PERT_EPBL] ! [Boolean] default = False
- ! If true perturb the KE dissipation and destruction in MOM_energetic_PBL
-
-! === module MOM_restart ===
-
-! === module MOM_file_parser ===
diff --git a/parm/ufs/mom6/MOM_input_template_500 b/parm/ufs/mom6/MOM_input_template_500
deleted file mode 100644
index dde805d247..0000000000
--- a/parm/ufs/mom6/MOM_input_template_500
+++ /dev/null
@@ -1,592 +0,0 @@
-! This file was written by the model and records the non-default parameters used at run-time.
-! === module MOM ===
-
-! === module MOM_unit_scaling ===
-! Parameters for doing unit scaling of variables.
-USE_REGRIDDING = True ! [Boolean] default = False
- ! If True, use the ALE algorithm (regridding/remapping). If False, use the
- ! layered isopycnal algorithm.
-THICKNESSDIFFUSE = True ! [Boolean] default = False
- ! If true, interface heights are diffused with a coefficient of KHTH.
-THICKNESSDIFFUSE_FIRST = True ! [Boolean] default = False
- ! If true, do thickness diffusion before dynamics. This is only used if
- ! THICKNESSDIFFUSE is true.
-DT = @[DT_DYNAM_MOM6] ! [s]
- ! The (baroclinic) dynamics time step. The time-step that is actually used will
- ! be an integer fraction of the forcing time-step (DT_FORCING in ocean-only mode
- ! or the coupling timestep in coupled mode.)
-DT_THERM = @[DT_THERM_MOM6] ! [s] default = 1800.0
- ! The thermodynamic and tracer advection time step. Ideally DT_THERM should be
- ! an integer multiple of DT and less than the forcing or coupling time-step,
- ! unless THERMO_SPANS_COUPLING is true, in which case DT_THERM can be an integer
- ! multiple of the coupling timestep. By default DT_THERM is set to DT.
-THERMO_SPANS_COUPLING = @[MOM6_THERMO_SPAN] ! [Boolean] default = False
- ! If true, the MOM will take thermodynamic and tracer timesteps that can be
- ! longer than the coupling timestep. The actual thermodynamic timestep that is
- ! used in this case is the largest integer multiple of the coupling timestep
- ! that is less than or equal to DT_THERM.
-HFREEZE = 20.0 ! [m] default = -1.0
- ! If HFREEZE > 0, melt potential will be computed. The actual depth
- ! over which melt potential is computed will be min(HFREEZE, OBLD)
- ! where OBLD is the boundary layer depth. If HFREEZE <= 0 (default)
- ! melt potential will not be computed.
-FRAZIL = True ! [Boolean] default = False
- ! If true, water freezes if it gets too cold, and the accumulated heat deficit
- ! is returned in the surface state. FRAZIL is only used if
- ! ENABLE_THERMODYNAMICS is true.
-BOUND_SALINITY = True ! [Boolean] default = False
- ! If true, limit salinity to being positive. (The sea-ice model may ask for more
- ! salt than is available and drive the salinity negative otherwise.)
-
-! === module MOM_domains ===
-TRIPOLAR_N = True ! [Boolean] default = False
- ! Use tripolar connectivity at the northern edge of the domain. With
- ! TRIPOLAR_N, NIGLOBAL must be even.
-NIGLOBAL = @[NX_GLB] !
- ! The total number of thickness grid points in the x-direction in the physical
- ! domain. With STATIC_MEMORY_ this is set in MOM_memory.h at compile time.
-NJGLOBAL = @[NY_GLB] !
- ! The total number of thickness grid points in the y-direction in the physical
- ! domain. With STATIC_MEMORY_ this is set in MOM_memory.h at compile time.
-
-! === module MOM_hor_index ===
-! Sets the horizontal array index types.
-
-! === module MOM_fixed_initialization ===
-INPUTDIR = "INPUT" ! default = "."
- ! The directory in which input files are found.
-
-! === module MOM_grid_init ===
-GRID_CONFIG = "mosaic" !
- ! A character string that determines the method for defining the horizontal
- ! grid. Current options are:
- ! mosaic - read the grid from a mosaic (supergrid)
- ! file set by GRID_FILE.
- ! cartesian - use a (flat) Cartesian grid.
- ! spherical - use a simple spherical grid.
- ! mercator - use a Mercator spherical grid.
-GRID_FILE = "ocean_hgrid.nc" !
- ! Name of the file from which to read horizontal grid data.
-GRID_ROTATION_ANGLE_BUGS = False ! [Boolean] default = True
- ! If true, use an older algorithm to calculate the sine and
- ! cosines needed rotate between grid-oriented directions and
- ! true north and east. Differences arise at the tripolar fold
-USE_TRIPOLAR_GEOLONB_BUG = False ! [Boolean] default = True
- ! If true, use older code that incorrectly sets the longitude in some points
- ! along the tripolar fold to be off by 360 degrees.
-TOPO_CONFIG = "file" !
- ! This specifies how bathymetry is specified:
- ! file - read bathymetric information from the file
- ! specified by (TOPO_FILE).
- ! flat - flat bottom set to MAXIMUM_DEPTH.
- ! bowl - an analytically specified bowl-shaped basin
- ! ranging between MAXIMUM_DEPTH and MINIMUM_DEPTH.
- ! spoon - a similar shape to 'bowl', but with an vertical
- ! wall at the southern face.
- ! halfpipe - a zonally uniform channel with a half-sine
- ! profile in the meridional direction.
- ! bbuilder - build topography from list of functions.
- ! benchmark - use the benchmark test case topography.
- ! Neverworld - use the Neverworld test case topography.
- ! DOME - use a slope and channel configuration for the
- ! DOME sill-overflow test case.
- ! ISOMIP - use a slope and channel configuration for the
- ! ISOMIP test case.
- ! DOME2D - use a shelf and slope configuration for the
- ! DOME2D gravity current/overflow test case.
- ! Kelvin - flat but with rotated land mask.
- ! seamount - Gaussian bump for spontaneous motion test case.
- ! dumbbell - Sloshing channel with reservoirs on both ends.
- ! shelfwave - exponential slope for shelfwave test case.
- ! Phillips - ACC-like idealized topography used in the Phillips config.
- ! dense - Denmark Strait-like dense water formation and overflow.
- ! USER - call a user modified routine.
-TOPO_FILE = "ocean_topog.nc" ! default = "topog.nc"
- ! The file from which the bathymetry is read.
-!MAXIMUM_DEPTH = 5801.341919389728 ! [m]
- ! The (diagnosed) maximum depth of the ocean.
-MINIMUM_DEPTH = 10.0 ! [m] default = 0.0
- ! If MASKING_DEPTH is unspecified, then anything shallower than MINIMUM_DEPTH is
- ! assumed to be land and all fluxes are masked out. If MASKING_DEPTH is
- ! specified, then all depths shallower than MINIMUM_DEPTH but deeper than
- ! MASKING_DEPTH are rounded to MINIMUM_DEPTH.
-
-! === module MOM_open_boundary ===
-! Controls where open boundaries are located, what kind of boundary condition to impose, and what data to apply,
-! if any.
-MASKING_DEPTH = 0.0 ! [m] default = -9999.0
- ! The depth below which to mask points as land points, for which all fluxes are
- ! zeroed out. MASKING_DEPTH is ignored if negative.
-
-! === module MOM_verticalGrid ===
-! Parameters providing information about the vertical grid.
-NK = 25 ! [nondim]
- ! The number of model layers.
-
-! === module MOM_tracer_registry ===
-
-! === module MOM_EOS ===
-TFREEZE_FORM = "MILLERO_78" ! default = "LINEAR"
- ! TFREEZE_FORM determines which expression should be used for the freezing
- ! point. Currently, the valid choices are "LINEAR", "MILLERO_78", "TEOS10"
-
-! === module MOM_restart ===
-RESTART_CHECKSUMS_REQUIRED = False
-! === module MOM_tracer_flow_control ===
-
-! === module MOM_coord_initialization ===
-COORD_CONFIG = "file" ! default = "none"
- ! This specifies how layers are to be defined:
- ! ALE or none - used to avoid defining layers in ALE mode
- ! file - read coordinate information from the file
- ! specified by (COORD_FILE).
- ! BFB - Custom coords for buoyancy-forced basin case
- ! based on SST_S, T_BOT and DRHO_DT.
- ! linear - linear based on interfaces not layers
- ! layer_ref - linear based on layer densities
- ! ts_ref - use reference temperature and salinity
- ! ts_range - use range of temperature and salinity
- ! (T_REF and S_REF) to determine surface density
- ! and GINT calculate internal densities.
- ! gprime - use reference density (RHO_0) for surface
- ! density and GINT calculate internal densities.
- ! ts_profile - use temperature and salinity profiles
- ! (read from COORD_FILE) to set layer densities.
- ! USER - call a user modified routine.
-COORD_FILE = "layer_coord25.nc" !
- ! The file from which the coordinate densities are read.
-REGRIDDING_COORDINATE_MODE = "HYCOM1" ! default = "LAYER"
- ! Coordinate mode for vertical regridding. Choose among the following
- ! possibilities: LAYER - Isopycnal or stacked shallow water layers
- ! ZSTAR, Z* - stretched geopotential z*
- ! SIGMA_SHELF_ZSTAR - stretched geopotential z* ignoring shelf
- ! SIGMA - terrain following coordinates
- ! RHO - continuous isopycnal
- ! HYCOM1 - HyCOM-like hybrid coordinate
- ! SLIGHT - stretched coordinates above continuous isopycnal
- ! ADAPTIVE - optimize for smooth neutral density surfaces
-BOUNDARY_EXTRAPOLATION = True ! [Boolean] default = False
- ! When defined, a proper high-order reconstruction scheme is used within
- ! boundary cells rather than PCM. E.g., if PPM is used for remapping, a PPM
- ! reconstruction will also be used within boundary cells.
-ALE_COORDINATE_CONFIG = "HYBRID:hycom1_25.nc,sigma2,FNC1:5,4000,4.5,.01" ! default = "UNIFORM"
- ! Determines how to specify the coordinate
- ! resolution. Valid options are:
- ! PARAM - use the vector-parameter ALE_RESOLUTION
- ! UNIFORM[:N] - uniformly distributed
- ! FILE:string - read from a file. The string specifies
- ! the filename and variable name, separated
- ! by a comma or space, e.g. FILE:lev.nc,dz
- ! or FILE:lev.nc,interfaces=zw
- ! WOA09[:N] - the WOA09 vertical grid (approximately)
- ! FNC1:string - FNC1:dz_min,H_total,power,precision
- ! HYBRID:string - read from a file. The string specifies
- ! the filename and two variable names, separated
- ! by a comma or space, for sigma-2 and dz. e.g.
- ! HYBRID:vgrid.nc,sigma2,dz
-!ALE_RESOLUTION = 2*5.0, 5.01, 5.07, 5.25, 5.68, 6.55, 8.1, 10.66, 14.620000000000001, 20.450000000000003, 28.73, 40.1, 55.32, 75.23, 100.8, 133.09, 173.26, 222.62, 282.56, 354.62, 440.47, 541.87, 660.76, 799.1800000000001 ! [m]
- ! The distribution of vertical resolution for the target
- ! grid used for Eulerian-like coordinates. For example,
- ! in z-coordinate mode, the parameter is a list of level
- ! thicknesses (in m). In sigma-coordinate mode, the list
- ! is of non-dimensional fractions of the water column.
-!TARGET_DENSITIES = 1010.0, 1020.843017578125, 1027.0274658203125, 1029.279541015625, 1030.862548828125, 1032.1572265625, 1033.27978515625, 1034.251953125, 1034.850830078125, 1035.28857421875, 1035.651123046875, 1035.967529296875, 1036.2410888671875, 1036.473876953125, 1036.6800537109375, 1036.8525390625, 1036.9417724609375, 1037.0052490234375, 1037.057373046875, 1037.1065673828125, 1037.15576171875, 1037.2060546875, 1037.26416015625, 1037.3388671875, 1037.4749755859375, 1038.0 ! [m]
- ! HYBRID target densities for itnerfaces
-REGRID_COMPRESSIBILITY_FRACTION = 0.01 ! [not defined] default = 0.0
- ! When interpolating potential density profiles we can add
- ! some artificial compressibility solely to make homogenous
- ! regions appear stratified.
-MAXIMUM_INT_DEPTH_CONFIG = "FNC1:5,8000.0,1.0,.125" ! default = "NONE"
- ! Determines how to specify the maximum interface depths.
- ! Valid options are:
- ! NONE - there are no maximum interface depths
- ! PARAM - use the vector-parameter MAXIMUM_INTERFACE_DEPTHS
- ! FILE:string - read from a file. The string specifies
- ! the filename and variable name, separated
- ! by a comma or space, e.g. FILE:lev.nc,Z
- ! FNC1:string - FNC1:dz_min,H_total,power,precision
-!MAXIMUM_INT_DEPTHS = 0.0, 5.0, 36.25, 93.75, 177.5, 287.5, 423.75, 586.25, 775.0, 990.0, 1231.25, 1498.75, 1792.5, 2112.5, 2458.75, 2831.25, 3230.0, 3655.0, 4106.25, 4583.75, 5087.5, 5617.5, 6173.75, 6756.25, 7365.0, 8000.0 ! [m]
- ! The list of maximum depths for each interface.
-MAX_LAYER_THICKNESS_CONFIG = "FNC1:400,31000.0,0.1,.01" ! default = "NONE"
- ! Determines how to specify the maximum layer thicknesses.
- ! Valid options are:
- ! NONE - there are no maximum layer thicknesses
- ! PARAM - use the vector-parameter MAX_LAYER_THICKNESS
- ! FILE:string - read from a file. The string specifies
- ! the filename and variable name, separated
- ! by a comma or space, e.g. FILE:lev.nc,Z
- ! FNC1:string - FNC1:dz_min,H_total,power,precision
-!MAX_LAYER_THICKNESS = 400.0, 1094.2, 1144.02, 1174.81, 1197.42, 1215.4099999999999, 1230.42, 1243.3200000000002, 1254.65, 1264.78, 1273.94, 1282.31, 1290.02, 1297.17, 1303.85, 1310.1, 1316.0, 1321.5700000000002, 1326.85, 1331.87, 1336.67, 1341.25, 1345.6399999999999, 1349.85, 1353.88 ! [m]
- ! The list of maximum thickness for each layer.
-REMAPPING_SCHEME = "PPM_H4" ! default = "PLM"
- ! This sets the reconstruction scheme used for vertical remapping for all
- ! variables. It can be one of the following schemes: PCM (1st-order
- ! accurate)
- ! PLM (2nd-order accurate)
- ! PPM_H4 (3rd-order accurate)
- ! PPM_IH4 (3rd-order accurate)
- ! PQM_IH4IH3 (4th-order accurate)
- ! PQM_IH6IH5 (5th-order accurate)
-
-! === module MOM_grid ===
-! Parameters providing information about the lateral grid.
-
-! === module MOM_state_initialization ===
-INIT_LAYERS_FROM_Z_FILE = True ! [Boolean] default = False
- ! If true, initialize the layer thicknesses, temperatures, and salinities from a
- ! Z-space file on a latitude-longitude grid.
-
-! === module MOM_initialize_layers_from_Z ===
-TEMP_SALT_Z_INIT_FILE = "" ! default = "temp_salt_z.nc"
- ! The name of the z-space input file used to initialize
- ! temperatures (T) and salinities (S). If T and S are not
- ! in the same file, TEMP_Z_INIT_FILE and SALT_Z_INIT_FILE
- ! must be set.
-TEMP_Z_INIT_FILE = "woa18_decav_t00_01.nc" ! default = ""
- ! The name of the z-space input file used to initialize
- ! temperatures, only.
-SALT_Z_INIT_FILE = "woa18_decav_s00_01.nc" ! default = ""
- ! The name of the z-space input file used to initialize
- ! temperatures, only.
-Z_INIT_FILE_PTEMP_VAR = "t_an" ! default = "ptemp"
- ! The name of the potential temperature variable in
- ! TEMP_Z_INIT_FILE.
-Z_INIT_FILE_SALT_VAR = "s_an" ! default = "salt"
- ! The name of the salinity variable in
- ! SALT_Z_INIT_FILE.
-Z_INIT_ALE_REMAPPING = True ! [Boolean] default = False
- ! If True, then remap straight to model coordinate from file.
-
-! === module MOM_diag_mediator ===
-NUM_DIAG_COORDS = 1
- ! The number of diagnostic vertical coordinates to use.
- ! For each coordinate, an entry in DIAG_COORDS must be provided.
-DIAG_COORDS = "z Z ZSTAR"
- ! A list of string tuples associating diag_table modules to
- ! a coordinate definition used for diagnostics. Each string
- ! is of the form "MODULE_SUFFIX,PARAMETER_SUFFIX,COORDINATE_NAME".
-DIAG_COORD_DEF_Z="FILE:@[MOM6_DIAG_COORD_DEF_Z_FILE],interfaces=zw"
-DIAG_MISVAL = @[MOM6_DIAG_MISVAL]
-
-! === module MOM_MEKE ===
-USE_MEKE = True ! [Boolean] default = False
- ! If true, turns on the MEKE scheme which calculates a sub-grid mesoscale eddy
- ! kinetic energy budget.
-
-! === module MOM_lateral_mixing_coeffs ===
-USE_VARIABLE_MIXING = True ! [Boolean] default = False
- ! If true, the variable mixing code will be called. This allows diagnostics to
- ! be created even if the scheme is not used. If KHTR_SLOPE_CFF>0 or
- ! KhTh_Slope_Cff>0, this is set to true regardless of what is in the parameter
- ! file.
-! === module MOM_set_visc ===
-CHANNEL_DRAG = True ! [Boolean] default = False
- ! If true, the bottom drag is exerted directly on each layer proportional to the
- ! fraction of the bottom it overlies.
-HBBL = 10.0 ! [m]
- ! The thickness of a bottom boundary layer with a viscosity of KVBBL if
- ! BOTTOMDRAGLAW is not defined, or the thickness over which near-bottom
- ! velocities are averaged for the drag law if BOTTOMDRAGLAW is defined but
- ! LINEAR_DRAG is not.
-KV = 1.0E-04 ! [m2 s-1]
- ! The background kinematic viscosity in the interior. The molecular value, ~1e-6
- ! m2 s-1, may be used.
-
-! === module MOM_continuity ===
-
-! === module MOM_continuity_PPM ===
-
-! === module MOM_CoriolisAdv ===
-CORIOLIS_SCHEME = "SADOURNY75_ENSTRO" ! default = "SADOURNY75_ENERGY"
- ! CORIOLIS_SCHEME selects the discretization for the Coriolis terms. Valid
- ! values are:
- ! SADOURNY75_ENERGY - Sadourny, 1975; energy cons.
- ! ARAKAWA_HSU90 - Arakawa & Hsu, 1990
- ! SADOURNY75_ENSTRO - Sadourny, 1975; enstrophy cons.
- ! ARAKAWA_LAMB81 - Arakawa & Lamb, 1981; En. + Enst.
- ! ARAKAWA_LAMB_BLEND - A blend of Arakawa & Lamb with
- ! Arakawa & Hsu and Sadourny energy
-BOUND_CORIOLIS = True ! [Boolean] default = False
- ! If true, the Coriolis terms at u-points are bounded by the four estimates of
- ! (f+rv)v from the four neighboring v-points, and similarly at v-points. This
- ! option would have no effect on the SADOURNY Coriolis scheme if it were
- ! possible to use centered difference thickness fluxes.
-
-! === module MOM_PressureForce ===
-
-! === module MOM_PressureForce_AFV ===
-MASS_WEIGHT_IN_PRESSURE_GRADIENT = True ! [Boolean] default = False
- ! If true, use mass weighting when interpolating T/S for integrals near the
- ! bathymetry in AFV pressure gradient calculations.
-
-! === module MOM_hor_visc ===
-LAPLACIAN = True ! [Boolean] default = False
- ! If true, use a Laplacian horizontal viscosity.
-KH_VEL_SCALE = 0.01 ! [m s-1] default = 0.0
- ! The velocity scale which is multiplied by the grid spacing to calculate the
- ! Laplacian viscosity. The final viscosity is the largest of this scaled
- ! viscosity, the Smagorinsky and Leith viscosities, and KH.
-KH_SIN_LAT = 2000.0 ! [m2 s-1] default = 0.0
- ! The amplitude of a latitudinally-dependent background viscosity of the form
- ! KH_SIN_LAT*(SIN(LAT)**KH_PWR_OF_SINE).
-SMAGORINSKY_KH = True ! [Boolean] default = False
- ! If true, use a Smagorinsky nonlinear eddy viscosity.
-SMAG_LAP_CONST = 0.15 ! [nondim] default = 0.0
- ! The nondimensional Laplacian Smagorinsky constant, often 0.15.
-AH_VEL_SCALE = 0.01 ! [m s-1] default = 0.0
- ! The velocity scale which is multiplied by the cube of the grid spacing to
- ! calculate the biharmonic viscosity. The final viscosity is the largest of this
- ! scaled viscosity, the Smagorinsky and Leith viscosities, and AH.
-SMAGORINSKY_AH = True ! [Boolean] default = False
- ! If true, use a biharmonic Smagorinsky nonlinear eddy viscosity.
-SMAG_BI_CONST = 0.06 ! [nondim] default = 0.0
- ! The nondimensional biharmonic Smagorinsky constant, typically 0.015 - 0.06.
-USE_LAND_MASK_FOR_HVISC = True ! [Boolean] default = False
- ! If true, use Use the land mask for the computation of thicknesses at velocity
- ! locations. This eliminates the dependence on arbitrary values over land or
- ! outside of the domain.
-
-! === module MOM_vert_friction ===
-HMIX_FIXED = 0.5 ! [m]
- ! The prescribed depth over which the near-surface viscosity and diffusivity are
- ! elevated when the bulk mixed layer is not used.
-KVML = 1.0E-04 ! [m2 s-1] default = 1.0E-04
- ! The kinematic viscosity in the mixed layer. A typical value is ~1e-2 m2 s-1.
- ! KVML is not used if BULKMIXEDLAYER is true. The default is set by KV.
-MAXVEL = 6.0 ! [m s-1] default = 3.0E+08
- ! The maximum velocity allowed before the velocity components are truncated.
-
-! === module MOM_barotropic ===
-BOUND_BT_CORRECTION = True ! [Boolean] default = False
- ! If true, the corrective pseudo mass-fluxes into the barotropic solver are
- ! limited to values that require less than maxCFL_BT_cont to be accommodated.
-BT_PROJECT_VELOCITY = True ! [Boolean] default = False
- ! If true, step the barotropic velocity first and project out the velocity
- ! tendency by 1+BEBT when calculating the transport. The default (false) is to
- ! use a predictor continuity step to find the pressure field, and then to do a
- ! corrector continuity step using a weighted average of the old and new
- ! velocities, with weights of (1-BEBT) and BEBT.
-DYNAMIC_SURFACE_PRESSURE = False ! [Boolean] default = False
- ! If true, add a dynamic pressure due to a viscous ice shelf, for instance.
-BEBT = 0.2 ! [nondim] default = 0.1
- ! BEBT determines whether the barotropic time stepping uses the forward-backward
- ! time-stepping scheme or a backward Euler scheme. BEBT is valid in the range
- ! from 0 (for a forward-backward treatment of nonrotating gravity waves) to 1
- ! (for a backward Euler treatment). In practice, BEBT must be greater than about
- ! 0.05.
-DTBT = -0.9 ! [s or nondim] default = -0.98
- ! The barotropic time step, in s. DTBT is only used with the split explicit time
- ! stepping. To set the time step automatically based the maximum stable value
- ! use 0, or a negative value gives the fraction of the stable value. Setting
- ! DTBT to 0 is the same as setting it to -0.98. The value of DTBT that will
- ! actually be used is an integer fraction of DT, rounding down.
-
-! === module MOM_mixed_layer_restrat ===
-MIXEDLAYER_RESTRAT = False ! [Boolean] default = False
- ! If true, a density-gradient dependent re-stratifying flow is imposed in the
- ! mixed layer. Can be used in ALE mode without restriction but in layer mode can
- ! only be used if BULKMIXEDLAYER is true.
-FOX_KEMPER_ML_RESTRAT_COEF = 60.0 ! [nondim] default = 0.0
- ! A nondimensional coefficient that is proportional to the ratio of the
- ! deformation radius to the dominant lengthscale of the submesoscale mixed layer
- ! instabilities, times the minimum of the ratio of the mesoscale eddy kinetic
- ! energy to the large-scale geostrophic kinetic energy or 1 plus the square of
- ! the grid spacing over the deformation radius, as detailed by Fox-Kemper et al.
- ! (2010)
-MLE_FRONT_LENGTH = 200.0 ! [m] default = 0.0
- ! If non-zero, is the frontal-length scale used to calculate the upscaling of
- ! buoyancy gradients that is otherwise represented by the parameter
- ! FOX_KEMPER_ML_RESTRAT_COEF. If MLE_FRONT_LENGTH is non-zero, it is recommended
- ! to set FOX_KEMPER_ML_RESTRAT_COEF=1.0.
-MLE_USE_PBL_MLD = True ! [Boolean] default = False
- ! If true, the MLE parameterization will use the mixed-layer depth provided by
- ! the active PBL parameterization. If false, MLE will estimate a MLD based on a
- ! density difference with the surface using the parameter MLE_DENSITY_DIFF.
-MLE_MLD_DECAY_TIME = 2.592E+06 ! [s] default = 0.0
- ! The time-scale for a running-mean filter applied to the mixed-layer depth used
- ! in the MLE restratification parameterization. When the MLD deepens below the
- ! current running-mean the running-mean is instantaneously set to the current
- ! MLD.
-
-! === module MOM_diabatic_driver ===
-! The following parameters are used for diabatic processes.
-ENERGETICS_SFC_PBL = True ! [Boolean] default = False
- ! If true, use an implied energetics planetary boundary layer scheme to
- ! determine the diffusivity and viscosity in the surface boundary layer.
-EPBL_IS_ADDITIVE = False ! [Boolean] default = True
- ! If true, the diffusivity from ePBL is added to all other diffusivities.
- ! Otherwise, the larger of kappa-shear and ePBL diffusivities are used.
-
-! === module MOM_CVMix_KPP ===
-! This is the MOM wrapper to CVMix:KPP
-! See http://cvmix.github.io/
-
-! === module MOM_tidal_mixing ===
-! Vertical Tidal Mixing Parameterization
-
-! === module MOM_CVMix_conv ===
-! Parameterization of enhanced mixing due to convection via CVMix
-
-! === module MOM_set_diffusivity ===
-
-! === module MOM_bkgnd_mixing ===
-! Adding static vertical background mixing coefficients
-KD = 1.5E-05 ! [m2 s-1] default = 0.0
- ! The background diapycnal diffusivity of density in the interior. Zero or the
- ! molecular value, ~1e-7 m2 s-1, may be used.
-KD_MIN = 2.0E-06 ! [m2 s-1] default = 2.0E-07
- ! The minimum diapycnal diffusivity.
-HENYEY_IGW_BACKGROUND = True ! [Boolean] default = False
- ! If true, use a latitude-dependent scaling for the near surface background
- ! diffusivity, as described in Harrison & Hallberg, JPO 2008.
-
-! === module MOM_kappa_shear ===
-! Parameterization of shear-driven turbulence following Jackson, Hallberg and Legg, JPO 2008
-USE_JACKSON_PARAM = True ! [Boolean] default = False
- ! If true, use the Jackson-Hallberg-Legg (JPO 2008) shear mixing
- ! parameterization.
-MAX_RINO_IT = 25 ! [nondim] default = 50
- ! The maximum number of iterations that may be used to estimate the Richardson
- ! number driven mixing.
-
-! === module MOM_CVMix_shear ===
-! Parameterization of shear-driven turbulence via CVMix (various options)
-
-! === module MOM_CVMix_ddiff ===
-! Parameterization of mixing due to double diffusion processes via CVMix
-
-! === module MOM_diabatic_aux ===
-! The following parameters are used for auxiliary diabatic processes.
-
-! === module MOM_energetic_PBL ===
-EPBL_USTAR_MIN = 1.45842E-18 ! [m s-1]
- ! The (tiny) minimum friction velocity used within the ePBL code, derived from
- ! OMEGA and ANGSTROM..
-USE_LA_LI2016 = @[MOM6_USE_LI2016] ! [nondim] default = False
- ! A logical to use the Li et al. 2016 (submitted) formula to determine the
- ! Langmuir number.
-USE_WAVES = @[MOM6_USE_WAVES] ! [Boolean] default = False
- ! If true, enables surface wave modules.
-WAVE_METHOD = "SURFACE_BANDS" ! default = "EMPTY"
- ! Choice of wave method, valid options include:
- ! TEST_PROFILE - Prescribed from surface Stokes drift
- ! and a decay wavelength.
- ! SURFACE_BANDS - Computed from multiple surface values
- ! and decay wavelengths.
- ! DHH85 - Uses Donelan et al. 1985 empirical
- ! wave spectrum with prescribed values.
- ! LF17 - Infers Stokes drift profile from wind
- ! speed following Li and Fox-Kemper 2017.
-SURFBAND_SOURCE = "COUPLER" ! default = "EMPTY"
- ! Choice of SURFACE_BANDS data mode, valid options include:
- ! DATAOVERRIDE - Read from NetCDF using FMS DataOverride.
- ! COUPLER - Look for variables from coupler pass
- ! INPUT - Testing with fixed values.
-STK_BAND_COUPLER = 3 ! default = 1
- ! STK_BAND_COUPLER is the number of Stokes drift bands in the coupler. This has
- ! to be consistent with the number of Stokes drift bands in WW3, or the model
- ! will fail.
-SURFBAND_WAVENUMBERS = 0.04, 0.11, 0.3305 ! [rad/m] default = 0.12566
- ! Central wavenumbers for surface Stokes drift bands.
-EPBL_LANGMUIR_SCHEME = "ADDITIVE" ! default = "NONE"
- ! EPBL_LANGMUIR_SCHEME selects the method for including Langmuir turbulence.
- ! Valid values are:
- ! NONE - Do not do any extra mixing due to Langmuir turbulence
- ! RESCALE - Use a multiplicative rescaling of mstar to account for Langmuir
- ! turbulence
- ! ADDITIVE - Add a Langmuir turblence contribution to mstar to other
- ! contributions
-LT_ENHANCE_COEF = 0.044 ! [nondim] default = 0.447
- ! Coefficient for Langmuir enhancement of mstar
-LT_ENHANCE_EXP = -1.5 ! [nondim] default = -1.33
- ! Exponent for Langmuir enhancementt of mstar
-LT_MOD_LAC1 = 0.0 ! [nondim] default = -0.87
- ! Coefficient for modification of Langmuir number due to MLD approaching Ekman
- ! depth.
-LT_MOD_LAC4 = 0.0 ! [nondim] default = 0.95
- ! Coefficient for modification of Langmuir number due to ratio of Ekman to
- ! stable Obukhov depth.
-LT_MOD_LAC5 = 0.22 ! [nondim] default = 0.95
- ! Coefficient for modification of Langmuir number due to ratio of Ekman to
- ! unstable Obukhov depth.
-
-! === module MOM_regularize_layers ===
-
-! === module MOM_opacity ===
-
-! === module MOM_tracer_advect ===
-TRACER_ADVECTION_SCHEME = "PPM:H3" ! default = "PLM"
- ! The horizontal transport scheme for tracers:
- ! PLM - Piecewise Linear Method
- ! PPM:H3 - Piecewise Parabolic Method (Huyhn 3rd order)
- ! PPM - Piecewise Parabolic Method (Colella-Woodward)
-
-! === module MOM_tracer_hor_diff ===
-KHTR = 50.0 ! [m2 s-1] default = 0.0
- ! The background along-isopycnal tracer diffusivity.
-CHECK_DIFFUSIVE_CFL = True ! [Boolean] default = False
- ! If true, use enough iterations the diffusion to ensure that the diffusive
- ! equivalent of the CFL limit is not violated. If false, always use the greater
- ! of 1 or MAX_TR_DIFFUSION_CFL iteration.
-MAX_TR_DIFFUSION_CFL = 2.0 ! [nondim] default = -1.0
- ! If positive, locally limit the along-isopycnal tracer diffusivity to keep the
- ! diffusive CFL locally at or below this value. The number of diffusive
- ! iterations is often this value or the next greater integer.
-
-! === module MOM_neutral_diffusion ===
-! This module implements neutral diffusion of tracers
-USE_NEUTRAL_DIFFUSION = True ! [Boolean] default = False
- ! If true, enables the neutral diffusion module.
-
-! === module MOM_sum_output ===
-MAXTRUNC = 1000 ! [truncations save_interval-1] default = 0
- ! The run will be stopped, and the day set to a very large value if the velocity
- ! is truncated more than MAXTRUNC times between energy saves. Set MAXTRUNC to 0
- ! to stop if there is any truncation of velocities.
-
-! === module ocean_model_init ===
-
-! === module MOM_oda_incupd ===
-ODA_INCUPD = @[ODA_INCUPD] ! [Boolean] default = False
- ! If true, oda incremental updates will be applied
- ! everywhere in the domain.
-ODA_INCUPD_FILE = "mom6_increment.nc" ! The name of the file with the T,S,h increments.
-
-ODA_TEMPINC_VAR = "Temp" ! default = "ptemp_inc"
- ! The name of the potential temperature inc. variable in
- ! ODA_INCUPD_FILE.
-ODA_SALTINC_VAR = "Salt" ! default = "sal_inc"
- ! The name of the salinity inc. variable in
- ! ODA_INCUPD_FILE.
-ODA_THK_VAR = "h" ! default = "h"
- ! The name of the int. depth inc. variable in
- ! ODA_INCUPD_FILE.
-ODA_INCUPD_UV = true !
-ODA_UINC_VAR = "u" ! default = "u_inc"
- ! The name of the zonal vel. inc. variable in
- ! ODA_INCUPD_UV_FILE.
-ODA_VINC_VAR = "v" ! default = "v_inc"
- ! The name of the meridional vel. inc. variable in
- ! ODA_INCUPD_UV_FILE.
-ODA_INCUPD_NHOURS = @[ODA_INCUPD_NHOURS] ! default=3.0
-
-! === module MOM_surface_forcing ===
-OCEAN_SURFACE_STAGGER = "A" ! default = "C"
- ! A case-insensitive character string to indicate the
- ! staggering of the surface velocity field that is
- ! returned to the coupler. Valid values include
- ! 'A', 'B', or 'C'.
-
-MAX_P_SURF = 0.0 ! [Pa] default = -1.0
- ! The maximum surface pressure that can be exerted by the atmosphere and
- ! floating sea-ice or ice shelves. This is needed because the FMS coupling
- ! structure does not limit the water that can be frozen out of the ocean and the
- ! ice-ocean heat fluxes are treated explicitly. No limit is applied if a
- ! negative value is used.
-WIND_STAGGER = "A" ! default = "C"
- ! A case-insensitive character string to indicate the
- ! staggering of the input wind stress field. Valid
- ! values are 'A', 'B', or 'C'.
-! === module MOM_restart ===
-
-! === module MOM_file_parser ===
diff --git a/parm/ufs/ufs.configure.atm.IN b/parm/ufs/ufs.configure.atm.IN
deleted file mode 100644
index 3457d8cf53..0000000000
--- a/parm/ufs/ufs.configure.atm.IN
+++ /dev/null
@@ -1,22 +0,0 @@
-# ESMF #
-logKindFlag: @[esmf_logkind]
-globalResourceControl: true
-
-EARTH_component_list: ATM
-EARTH_attributes::
- Verbosity = 0
-::
-
-# ATM #
-ATM_model: @[atm_model]
-ATM_petlist_bounds: @[atm_petlist_bounds]
-ATM_omp_num_threads: @[atm_omp_num_threads]
-ATM_attributes::
- Verbosity = 0
- Diagnostic = 0
-::
-
-# Run Sequence #
-runSeq::
- ATM
-::
diff --git a/parm/ufs/ufs.configure.atm_aero.IN b/parm/ufs/ufs.configure.atm_aero.IN
deleted file mode 100644
index 629cc156ce..0000000000
--- a/parm/ufs/ufs.configure.atm_aero.IN
+++ /dev/null
@@ -1,40 +0,0 @@
-#############################################
-#### UFS Run-Time Configuration File #####
-#############################################
-
-# ESMF #
-logKindFlag: @[esmf_logkind]
-globalResourceControl: true
-
-# EARTH #
-EARTH_component_list: ATM CHM
-EARTH_attributes::
- Verbosity = 0
-::
-
-# ATM #
-ATM_model: @[atm_model]
-ATM_petlist_bounds: @[atm_petlist_bounds]
-ATM_omp_num_threads: @[atm_omp_num_threads]
-ATM_attributes::
- Verbosity = 0
-::
-
-# CHM #
-CHM_model: @[chm_model]
-CHM_petlist_bounds: @[chm_petlist_bounds]
-CHM_omp_num_threads: @[chm_omp_num_threads]
-CHM_attributes::
- Verbosity = 0
-::
-
-# Run Sequence #
-runSeq::
- @@[coupling_interval_fast_sec]
- ATM phase1
- ATM -> CHM
- CHM
- CHM -> ATM
- ATM phase2
- @
-::
diff --git a/parm/ufs/ufs.configure.blocked_atm_wav.IN b/parm/ufs/ufs.configure.blocked_atm_wav.IN
deleted file mode 100644
index b68aa2e735..0000000000
--- a/parm/ufs/ufs.configure.blocked_atm_wav.IN
+++ /dev/null
@@ -1,41 +0,0 @@
-#############################################
-#### UFS Run-Time Configuration File #####
-#############################################
-
-# ESMF #
-logKindFlag: @[esmf_logkind]
-globalResourceControl: true
-
-# EARTH #
-EARTH_component_list: ATM WAV
-EARTH_attributes::
- Verbosity = max
-::
-
-# ATM #
-ATM_model: @[atm_model]
-ATM_petlist_bounds: @[atm_petlist_bounds]
-ATM_omp_num_threads: @[atm_omp_num_threads]
-ATM_attributes::
- Verbosity = max
- DumpFields = true
-::
-
-# WAV #
-WAV_model: @[wav_model]
-WAV_petlist_bounds: @[wav_petlist_bounds]
-WAV_omp_num_threads: @[wav_omp_num_threads]
-WAV_attributes::
- Verbosity = max
-::
-
-
-
-# Run Sequence #
-runSeq::
- @@[coupling_interval_sec]
- ATM -> WAV
- ATM
- WAV
- @
-::
diff --git a/parm/ufs/ufs.configure.cpld.IN b/parm/ufs/ufs.configure.cpld.IN
deleted file mode 100644
index e473fb2a03..0000000000
--- a/parm/ufs/ufs.configure.cpld.IN
+++ /dev/null
@@ -1,122 +0,0 @@
-#############################################
-#### UFS Run-Time Configuration File #####
-#############################################
-
-# ESMF #
-logKindFlag: @[esmf_logkind]
-globalResourceControl: true
-
-# EARTH #
-EARTH_component_list: MED ATM OCN ICE
-EARTH_attributes::
- Verbosity = 0
-::
-
-# MED #
-MED_model: @[med_model]
-MED_petlist_bounds: @[med_petlist_bounds]
-MED_omp_num_threads: @[med_omp_num_threads]
-::
-
-# ATM #
-ATM_model: @[atm_model]
-ATM_petlist_bounds: @[atm_petlist_bounds]
-ATM_omp_num_threads: @[atm_omp_num_threads]
-ATM_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
-::
-
-# OCN #
-OCN_model: @[ocn_model]
-OCN_petlist_bounds: @[ocn_petlist_bounds]
-OCN_omp_num_threads: @[ocn_omp_num_threads]
-OCN_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
- mesh_ocn = @[MESH_OCN_ICE]
- use_coldstart = @[use_coldstart]
- use_mommesh = @[use_mommesh]
-::
-
-# ICE #
-ICE_model: @[ice_model]
-ICE_petlist_bounds: @[ice_petlist_bounds]
-ICE_omp_num_threads: @[ice_omp_num_threads]
-ICE_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
- mesh_ice = @[MESH_OCN_ICE]
- eps_imesh = @[eps_imesh]
- stop_n = @[RESTART_N]
- stop_option = nhours
- stop_ymd = -999
-::
-
-# CMEPS warm run sequence
-runSeq::
-@@[coupling_interval_slow_sec]
- MED med_phases_prep_ocn_avg
- MED -> OCN :remapMethod=redist
- OCN
- @@[coupling_interval_fast_sec]
- MED med_phases_prep_atm
- MED med_phases_prep_ice
- MED -> ATM :remapMethod=redist
- MED -> ICE :remapMethod=redist
- ATM
- ICE
- ATM -> MED :remapMethod=redist
- MED med_phases_post_atm
- ICE -> MED :remapMethod=redist
- MED med_phases_post_ice
- MED med_phases_ocnalb_run
- MED med_phases_prep_ocn_accum
- @
- OCN -> MED :remapMethod=redist
- MED med_phases_post_ocn
- MED med_phases_restart_write
-@
-::
-
-# CMEPS variables
-
-DRIVER_attributes::
-::
-MED_attributes::
- ATM_model = @[atm_model]
- ICE_model = @[ice_model]
- OCN_model = @[ocn_model]
- coupling_mode = @[CPLMODE]
- history_tile_atm = @[ATMTILESIZE]
- pio_rearranger = box
- ocean_albedo_limit = @[ocean_albedo_limit]
-::
-ALLCOMP_attributes::
- ScalarFieldCount = 2
- ScalarFieldIdxGridNX = 1
- ScalarFieldIdxGridNY = 2
- ScalarFieldName = cpl_scalars
- start_type = @[RUNTYPE]
- restart_dir = RESTART/
- case_name = ufs.cpld
- restart_n = @[RESTART_N]
- restart_option = nhours
- restart_ymd = -999
- dbug_flag = @[cap_dbug_flag]
- stop_n = @[FHMAX]
- stop_option = nhours
- stop_ymd = -999
- orb_eccen = 1.e36
- orb_iyear = 2000
- orb_iyear_align = 2000
- orb_mode = fixed_year
- orb_mvelp = 1.e36
- orb_obliq = 1.e36
-::
diff --git a/parm/ufs/ufs.configure.cpld_aero.IN b/parm/ufs/ufs.configure.cpld_aero.IN
deleted file mode 100644
index d90d377006..0000000000
--- a/parm/ufs/ufs.configure.cpld_aero.IN
+++ /dev/null
@@ -1,134 +0,0 @@
-#############################################
-#### UFS Run-Time Configuration File #####
-#############################################
-
-# ESMF #
-logKindFlag: @[esmf_logkind]
-globalResourceControl: true
-
-# EARTH #
-EARTH_component_list: MED ATM CHM OCN ICE
-EARTH_attributes::
- Verbosity = 0
-::
-
-# MED #
-MED_model: @[med_model]
-MED_petlist_bounds: @[med_petlist_bounds]
-MED_omp_num_threads: @[med_omp_num_threads]
-::
-
-# ATM #
-ATM_model: @[atm_model]
-ATM_petlist_bounds: @[atm_petlist_bounds]
-ATM_omp_num_threads: @[atm_omp_num_threads]
-ATM_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
-::
-
-# CHM #
-CHM_model: @[chm_model]
-CHM_petlist_bounds: @[chm_petlist_bounds]
-CHM_omp_num_threads: @[chm_omp_num_threads]
-CHM_attributes::
- Verbosity = 0
-::
-
-# OCN #
-OCN_model: @[ocn_model]
-OCN_petlist_bounds: @[ocn_petlist_bounds]
-OCN_omp_num_threads: @[ocn_omp_num_threads]
-OCN_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
- mesh_ocn = @[MESH_OCN_ICE]
- use_coldstart = @[use_coldstart]
- use_mommesh = @[use_mommesh]
-::
-
-# ICE #
-ICE_model: @[ice_model]
-ICE_petlist_bounds: @[ice_petlist_bounds]
-ICE_omp_num_threads: @[ice_omp_num_threads]
-ICE_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
- mesh_ice = @[MESH_OCN_ICE]
- eps_imesh = @[eps_imesh]
- stop_n = @[RESTART_N]
- stop_option = nhours
- stop_ymd = -999
-::
-
-# CMEPS warm run sequence
-runSeq::
-@@[coupling_interval_slow_sec]
- MED med_phases_prep_ocn_avg
- MED -> OCN :remapMethod=redist
- OCN
- @@[coupling_interval_fast_sec]
- MED med_phases_prep_atm
- MED med_phases_prep_ice
- MED -> ATM :remapMethod=redist
- MED -> ICE :remapMethod=redist
- ATM phase1
- ATM -> CHM
- CHM
- CHM -> ATM
- ATM phase2
- ICE
- ATM -> MED :remapMethod=redist
- MED med_phases_post_atm
- ICE -> MED :remapMethod=redist
- MED med_phases_post_ice
- MED med_phases_ocnalb_run
- MED med_phases_prep_ocn_accum
- @
- OCN -> MED :remapMethod=redist
- MED med_phases_post_ocn
- MED med_phases_restart_write
-@
-::
-
-# CMEPS variables
-
-DRIVER_attributes::
-::
-MED_attributes::
- ATM_model = @[atm_model]
- ICE_model = @[ice_model]
- OCN_model = @[ocn_model]
- coupling_mode = @[CPLMODE]
- history_tile_atm = @[ATMTILESIZE]
- pio_rearranger = box
- ocean_albedo_limit = @[ocean_albedo_limit]
-::
-ALLCOMP_attributes::
- ScalarFieldCount = 2
- ScalarFieldIdxGridNX = 1
- ScalarFieldIdxGridNY = 2
- ScalarFieldName = cpl_scalars
- start_type = @[RUNTYPE]
- restart_dir = RESTART/
- case_name = ufs.cpld
- restart_n = @[RESTART_N]
- restart_option = nhours
- restart_ymd = -999
- dbug_flag = @[cap_dbug_flag]
- stop_n = @[FHMAX]
- stop_option = nhours
- stop_ymd = -999
- orb_eccen = 1.e36
- orb_iyear = 2000
- orb_iyear_align = 2000
- orb_mode = fixed_year
- orb_mvelp = 1.e36
- orb_obliq = 1.e36
-::
diff --git a/parm/ufs/ufs.configure.cpld_aero_outerwave.IN b/parm/ufs/ufs.configure.cpld_aero_outerwave.IN
deleted file mode 100644
index 23e7751112..0000000000
--- a/parm/ufs/ufs.configure.cpld_aero_outerwave.IN
+++ /dev/null
@@ -1,151 +0,0 @@
-#############################################
-#### UFS Run-Time Configuration File #####
-#############################################
-
-# ESMF #
-logKindFlag: @[esmf_logkind]
-globalResourceControl: true
-
-# EARTH #
-EARTH_component_list: MED ATM CHM OCN ICE WAV
-EARTH_attributes::
- Verbosity = 0
-::
-
-# MED #
-MED_model: @[med_model]
-MED_petlist_bounds: @[med_petlist_bounds]
-MED_omp_num_threads: @[med_omp_num_threads]
-::
-
-# ATM #
-ATM_model: @[atm_model]
-ATM_petlist_bounds: @[atm_petlist_bounds]
-ATM_omp_num_threads: @[atm_omp_num_threads]
-ATM_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
-::
-
-# CHM #
-CHM_model: @[chm_model]
-CHM_petlist_bounds: @[chm_petlist_bounds]
-CHM_omp_num_threads: @[chm_omp_num_threads]
-CHM_attributes::
- Verbosity = 0
-::
-
-# OCN #
-OCN_model: @[ocn_model]
-OCN_petlist_bounds: @[ocn_petlist_bounds]
-OCN_omp_num_threads: @[ocn_omp_num_threads]
-OCN_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
- mesh_ocn = @[MESH_OCN_ICE]
- use_coldstart = @[use_coldstart]
- use_mommesh = @[use_mommesh]
-::
-
-# ICE #
-ICE_model: @[ice_model]
-ICE_petlist_bounds: @[ice_petlist_bounds]
-ICE_omp_num_threads: @[ice_omp_num_threads]
-ICE_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
- mesh_ice = @[MESH_OCN_ICE]
- eps_imesh = @[eps_imesh]
- stop_n = @[RESTART_N]
- stop_option = nhours
- stop_ymd = -999
-::
-
-# WAV #
-WAV_model: @[wav_model]
-WAV_petlist_bounds: @[wav_petlist_bounds]
-WAV_omp_num_threads: @[wav_omp_num_threads]
-WAV_attributes::
- Verbosity = 0
- OverwriteSlice = false
- mesh_wav = @[MESH_WAV]
-::
-
-# CMEPS warm run sequence
-runSeq::
-@@[coupling_interval_slow_sec]
- MED med_phases_prep_wav_avg
- MED med_phases_prep_ocn_avg
- MED -> WAV :remapMethod=redist
- MED -> OCN :remapMethod=redist
- WAV
- OCN
- @@[coupling_interval_fast_sec]
- MED med_phases_prep_atm
- MED med_phases_prep_ice
- MED -> ATM :remapMethod=redist
- MED -> ICE :remapMethod=redist
- ATM phase1
- ATM -> CHM
- CHM
- CHM -> ATM
- ATM phase2
- ICE
- ATM -> MED :remapMethod=redist
- MED med_phases_post_atm
- ICE -> MED :remapMethod=redist
- MED med_phases_post_ice
- MED med_phases_ocnalb_run
- MED med_phases_prep_ocn_accum
- MED med_phases_prep_wav_accum
- @
- OCN -> MED :remapMethod=redist
- WAV -> MED :remapMethod=redist
- MED med_phases_post_ocn
- MED med_phases_post_wav
- MED med_phases_restart_write
-@
-::
-
-# CMEPS variables
-
-DRIVER_attributes::
-::
-MED_attributes::
- ATM_model = @[atm_model]
- ICE_model = @[ice_model]
- OCN_model = @[ocn_model]
- WAV_model = @[wav_model]
- coupling_mode = @[CPLMODE]
- history_tile_atm = @[ATMTILESIZE]
- pio_rearranger = box
- ocean_albedo_limit = @[ocean_albedo_limit]
-::
-ALLCOMP_attributes::
- ScalarFieldCount = 2
- ScalarFieldIdxGridNX = 1
- ScalarFieldIdxGridNY = 2
- ScalarFieldName = cpl_scalars
- start_type = @[RUNTYPE]
- restart_dir = RESTART/
- case_name = ufs.cpld
- restart_n = @[RESTART_N]
- restart_option = nhours
- restart_ymd = -999
- dbug_flag = @[cap_dbug_flag]
- stop_n = @[FHMAX]
- stop_option = nhours
- stop_ymd = -999
- orb_eccen = 1.e36
- orb_iyear = 2000
- orb_iyear_align = 2000
- orb_mode = fixed_year
- orb_mvelp = 1.e36
- orb_obliq = 1.e36
-::
diff --git a/parm/ufs/ufs.configure.cpld_aero_wave.IN b/parm/ufs/ufs.configure.cpld_aero_wave.IN
deleted file mode 100644
index ab0f6a9f8d..0000000000
--- a/parm/ufs/ufs.configure.cpld_aero_wave.IN
+++ /dev/null
@@ -1,151 +0,0 @@
-#############################################
-#### UFS Run-Time Configuration File #####
-#############################################
-
-# ESMF #
-logKindFlag: @[esmf_logkind]
-globalResourceControl: true
-
-# EARTH #
-EARTH_component_list: MED ATM CHM OCN ICE WAV
-EARTH_attributes::
- Verbosity = 0
-::
-
-# MED #
-MED_model: @[med_model]
-MED_petlist_bounds: @[med_petlist_bounds]
-MED_omp_num_threads: @[med_omp_num_threads]
-::
-
-# ATM #
-ATM_model: @[atm_model]
-ATM_petlist_bounds: @[atm_petlist_bounds]
-ATM_omp_num_threads: @[atm_omp_num_threads]
-ATM_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
-::
-
-# CHM #
-CHM_model: @[chm_model]
-CHM_petlist_bounds: @[chm_petlist_bounds]
-CHM_omp_num_threads: @[chm_omp_num_threads]
-CHM_attributes::
- Verbosity = 0
-::
-
-# OCN #
-OCN_model: @[ocn_model]
-OCN_petlist_bounds: @[ocn_petlist_bounds]
-OCN_omp_num_threads: @[ocn_omp_num_threads]
-OCN_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
- mesh_ocn = @[MESH_OCN_ICE]
- use_coldstart = @[use_coldstart]
- use_mommesh = @[use_mommesh]
-::
-
-# ICE #
-ICE_model: @[ice_model]
-ICE_petlist_bounds: @[ice_petlist_bounds]
-ICE_omp_num_threads: @[ice_omp_num_threads]
-ICE_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
- mesh_ice = @[MESH_OCN_ICE]
- eps_imesh = @[eps_imesh]
- stop_n = @[RESTART_N]
- stop_option = nhours
- stop_ymd = -999
-::
-
-# WAV #
-WAV_model: @[wav_model]
-WAV_petlist_bounds: @[wav_petlist_bounds]
-WAV_omp_num_threads: @[wav_omp_num_threads]
-WAV_attributes::
- Verbosity = 0
- OverwriteSlice = false
- mesh_wav = @[MESH_WAV]
-::
-
-# CMEPS warm run sequence
-runSeq::
-@@[coupling_interval_slow_sec]
- MED med_phases_prep_ocn_avg
- MED -> OCN :remapMethod=redist
- OCN
- @@[coupling_interval_fast_sec]
- MED med_phases_prep_atm
- MED med_phases_prep_ice
- MED med_phases_prep_wav_accum
- MED med_phases_prep_wav_avg
- MED -> ATM :remapMethod=redist
- MED -> ICE :remapMethod=redist
- MED -> WAV :remapMethod=redist
- ATM phase1
- ATM -> CHM
- CHM
- CHM -> ATM
- ATM phase2
- ICE
- WAV
- ATM -> MED :remapMethod=redist
- MED med_phases_post_atm
- ICE -> MED :remapMethod=redist
- MED med_phases_post_ice
- WAV -> MED :remapMethod=redist
- MED med_phases_post_wav
- MED med_phases_ocnalb_run
- MED med_phases_prep_ocn_accum
- @
- OCN -> MED :remapMethod=redist
- MED med_phases_post_ocn
- MED med_phases_restart_write
-@
-::
-
-# CMEPS variables
-
-DRIVER_attributes::
-::
-MED_attributes::
- ATM_model = @[atm_model]
- ICE_model = @[ice_model]
- OCN_model = @[ocn_model]
- WAV_model = @[wav_model]
- coupling_mode = @[CPLMODE]
- history_tile_atm = @[ATMTILESIZE]
- pio_rearranger = box
- ocean_albedo_limit = @[ocean_albedo_limit]
-::
-ALLCOMP_attributes::
- ScalarFieldCount = 2
- ScalarFieldIdxGridNX = 1
- ScalarFieldIdxGridNY = 2
- ScalarFieldName = cpl_scalars
- start_type = @[RUNTYPE]
- restart_dir = RESTART/
- case_name = ufs.cpld
- restart_n = @[RESTART_N]
- restart_option = nhours
- restart_ymd = -999
- dbug_flag = @[cap_dbug_flag]
- stop_n = @[FHMAX]
- stop_option = nhours
- stop_ymd = -999
- orb_eccen = 1.e36
- orb_iyear = 2000
- orb_iyear_align = 2000
- orb_mode = fixed_year
- orb_mvelp = 1.e36
- orb_obliq = 1.e36
-::
diff --git a/parm/ufs/ufs.configure.cpld_outerwave.IN b/parm/ufs/ufs.configure.cpld_outerwave.IN
deleted file mode 100644
index 9a45d5ff9a..0000000000
--- a/parm/ufs/ufs.configure.cpld_outerwave.IN
+++ /dev/null
@@ -1,139 +0,0 @@
-#############################################
-#### UFS Run-Time Configuration File #####
-#############################################
-
-# ESMF #
-logKindFlag: @[esmf_logkind]
-globalResourceControl: true
-
-# EARTH #
-EARTH_component_list: MED ATM OCN ICE WAV
-EARTH_attributes::
- Verbosity = 0
-::
-
-# MED #
-MED_model: @[med_model]
-MED_petlist_bounds: @[med_petlist_bounds]
-MED_omp_num_threads: @[med_omp_num_threads]
-::
-
-# ATM #
-ATM_model: @[atm_model]
-ATM_petlist_bounds: @[atm_petlist_bounds]
-ATM_omp_num_threads: @[atm_omp_num_threads]
-ATM_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
-::
-
-# OCN #
-OCN_model: @[ocn_model]
-OCN_petlist_bounds: @[ocn_petlist_bounds]
-OCN_omp_num_threads: @[ocn_omp_num_threads]
-OCN_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
- mesh_ocn = @[MESH_OCN_ICE]
- use_coldstart = @[use_coldstart]
- use_mommesh = @[use_mommesh]
-::
-
-# ICE #
-ICE_model: @[ice_model]
-ICE_petlist_bounds: @[ice_petlist_bounds]
-ICE_omp_num_threads: @[ice_omp_num_threads]
-ICE_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
- mesh_ice = @[MESH_OCN_ICE]
- eps_imesh = @[eps_imesh]
- stop_n = @[RESTART_N]
- stop_option = nhours
- stop_ymd = -999
-::
-
-# WAV #
-WAV_model: @[wav_model]
-WAV_petlist_bounds: @[wav_petlist_bounds]
-WAV_omp_num_threads: @[wav_omp_num_threads]
-WAV_attributes::
- Verbosity = 0
- OverwriteSlice = false
- mesh_wav = @[MESH_WAV]
-::
-
-# CMEPS warm run sequence
-runSeq::
-@@[coupling_interval_slow_sec]
- MED med_phases_prep_wav_avg
- MED med_phases_prep_ocn_avg
- MED -> WAV :remapMethod=redist
- MED -> OCN :remapMethod=redist
- WAV
- OCN
- @@[coupling_interval_fast_sec]
- MED med_phases_prep_atm
- MED med_phases_prep_ice
- MED -> ATM :remapMethod=redist
- MED -> ICE :remapMethod=redist
- ATM
- ICE
- ATM -> MED :remapMethod=redist
- MED med_phases_post_atm
- ICE -> MED :remapMethod=redist
- MED med_phases_post_ice
- MED med_phases_ocnalb_run
- MED med_phases_prep_ocn_accum
- MED med_phases_prep_wav_accum
- @
- OCN -> MED :remapMethod=redist
- WAV -> MED :remapMethod=redist
- MED med_phases_post_ocn
- MED med_phases_post_wav
- MED med_phases_restart_write
-@
-::
-
-# CMEPS variables
-
-DRIVER_attributes::
-::
-MED_attributes::
- ATM_model = @[atm_model]
- ICE_model = @[ice_model]
- OCN_model = @[ocn_model]
- WAV_model = @[wav_model]
- coupling_mode = @[CPLMODE]
- history_tile_atm = @[ATMTILESIZE]
- pio_rearranger = box
- ocean_albedo_limit = @[ocean_albedo_limit]
-::
-ALLCOMP_attributes::
- ScalarFieldCount = 2
- ScalarFieldIdxGridNX = 1
- ScalarFieldIdxGridNY = 2
- ScalarFieldName = cpl_scalars
- start_type = @[RUNTYPE]
- restart_dir = RESTART/
- case_name = ufs.cpld
- restart_n = @[RESTART_N]
- restart_option = nhours
- restart_ymd = -999
- dbug_flag = @[cap_dbug_flag]
- stop_n = @[FHMAX]
- stop_option = nhours
- stop_ymd = -999
- orb_eccen = 1.e36
- orb_iyear = 2000
- orb_iyear_align = 2000
- orb_mode = fixed_year
- orb_mvelp = 1.e36
- orb_obliq = 1.e36
-::
diff --git a/parm/ufs/ufs.configure.cpld_wave.IN b/parm/ufs/ufs.configure.cpld_wave.IN
deleted file mode 100644
index 37a462a5d4..0000000000
--- a/parm/ufs/ufs.configure.cpld_wave.IN
+++ /dev/null
@@ -1,139 +0,0 @@
-#############################################
-#### UFS Run-Time Configuration File #####
-#############################################
-
-# ESMF #
-logKindFlag: @[esmf_logkind]
-globalResourceControl: true
-
-# EARTH #
-EARTH_component_list: MED ATM OCN ICE WAV
-EARTH_attributes::
- Verbosity = 0
-::
-
-# MED #
-MED_model: @[med_model]
-MED_petlist_bounds: @[med_petlist_bounds]
-MED_omp_num_threads: @[med_omp_num_threads]
-::
-
-# ATM #
-ATM_model: @[atm_model]
-ATM_petlist_bounds: @[atm_petlist_bounds]
-ATM_omp_num_threads: @[atm_omp_num_threads]
-ATM_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
-::
-
-# OCN #
-OCN_model: @[ocn_model]
-OCN_petlist_bounds: @[ocn_petlist_bounds]
-OCN_omp_num_threads: @[ocn_omp_num_threads]
-OCN_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
- mesh_ocn = @[MESH_OCN_ICE]
- use_coldstart = @[use_coldstart]
- use_mommesh = @[use_mommesh]
-::
-
-# ICE #
-ICE_model: @[ice_model]
-ICE_petlist_bounds: @[ice_petlist_bounds]
-ICE_omp_num_threads: @[ice_omp_num_threads]
-ICE_attributes::
- Verbosity = 0
- DumpFields = @[DumpFields]
- ProfileMemory = false
- OverwriteSlice = true
- mesh_ice = @[MESH_OCN_ICE]
- eps_imesh = @[eps_imesh]
- stop_n = @[RESTART_N]
- stop_option = nhours
- stop_ymd = -999
-::
-
-# WAV #
-WAV_model: @[wav_model]
-WAV_petlist_bounds: @[wav_petlist_bounds]
-WAV_omp_num_threads: @[wav_omp_num_threads]
-WAV_attributes::
- Verbosity = 0
- OverwriteSlice = false
- mesh_wav = @[MESH_WAV]
-::
-
-# CMEPS warm run sequence
-runSeq::
-@@[coupling_interval_slow_sec]
- MED med_phases_prep_ocn_avg
- MED -> OCN :remapMethod=redist
- OCN
- @@[coupling_interval_fast_sec]
- MED med_phases_prep_atm
- MED med_phases_prep_ice
- MED med_phases_prep_wav_accum
- MED med_phases_prep_wav_avg
- MED -> ATM :remapMethod=redist
- MED -> ICE :remapMethod=redist
- MED -> WAV :remapMethod=redist
- ATM
- ICE
- WAV
- ATM -> MED :remapMethod=redist
- MED med_phases_post_atm
- ICE -> MED :remapMethod=redist
- MED med_phases_post_ice
- WAV -> MED :remapMethod=redist
- MED med_phases_post_wav
- MED med_phases_ocnalb_run
- MED med_phases_prep_ocn_accum
- @
- OCN -> MED :remapMethod=redist
- MED med_phases_post_ocn
- MED med_phases_restart_write
-@
-::
-
-# CMEPS variables
-
-DRIVER_attributes::
-::
-MED_attributes::
- ATM_model = @[atm_model]
- ICE_model = @[ice_model]
- OCN_model = @[ocn_model]
- WAV_model = @[wav_model]
- coupling_mode = @[CPLMODE]
- history_tile_atm = @[ATMTILESIZE]
- pio_rearranger = box
- ocean_albedo_limit = @[ocean_albedo_limit]
-::
-ALLCOMP_attributes::
- ScalarFieldCount = 2
- ScalarFieldIdxGridNX = 1
- ScalarFieldIdxGridNY = 2
- ScalarFieldName = cpl_scalars
- start_type = @[RUNTYPE]
- restart_dir = RESTART/
- case_name = ufs.cpld
- restart_n = @[RESTART_N]
- restart_option = nhours
- restart_ymd = -999
- dbug_flag = @[cap_dbug_flag]
- stop_n = @[FHMAX]
- stop_option = nhours
- stop_ymd = -999
- orb_eccen = 1.e36
- orb_iyear = 2000
- orb_iyear_align = 2000
- orb_mode = fixed_year
- orb_mvelp = 1.e36
- orb_obliq = 1.e36
-::
diff --git a/parm/ufs/ufs.configure.leapfrog_atm_wav.IN b/parm/ufs/ufs.configure.leapfrog_atm_wav.IN
deleted file mode 100644
index ec22c9478c..0000000000
--- a/parm/ufs/ufs.configure.leapfrog_atm_wav.IN
+++ /dev/null
@@ -1,41 +0,0 @@
-#############################################
-#### UFS Run-Time Configuration File #####
-#############################################
-
-# ESMF #
-logKindFlag: @[esmf_logkind]
-globalResourceControl: true
-
-# EARTH #
-EARTH_component_list: ATM WAV
-EARTH_attributes::
- Verbosity = max
-::
-
-# ATM #
-ATM_model: @[atm_model]
-ATM_petlist_bounds: @[atm_petlist_bounds]
-ATM_omp_num_threads: @[atm_omp_num_threads]
-ATM_attributes::
- Verbosity = max
- DumpFields = true
-::
-
-# WAV #
-WAV_model: @[wav_model]
-WAV_petlist_bounds: @[wav_petlist_bounds]
-WAV_omp_num_threads: @[wav_omp_num_threads]
-WAV_attributes::
- Verbosity = max
-::
-
-
-
-# Run Sequence #
-runSeq::
- @@[coupling_interval_slow_sec]
- ATM
- ATM -> WAV
- WAV
- @
-::
diff --git a/parm/wave/at_10m_interp.inp.tmpl b/parm/wave/at_10m_interp.inp.tmpl
index b2a80081e1..6f4c1f7099 100755
--- a/parm/wave/at_10m_interp.inp.tmpl
+++ b/parm/wave/at_10m_interp.inp.tmpl
@@ -5,7 +5,7 @@ $ Start Time DT NSteps
$ Total number of grids
2
$ Grid extensions
- 'gnh_10m'
+ 'uglo_m1g16'
'at_10m'
$
0
diff --git a/parm/wave/ep_10m_interp.inp.tmpl b/parm/wave/ep_10m_interp.inp.tmpl
index 0848854ccf..23cfd50c2e 100755
--- a/parm/wave/ep_10m_interp.inp.tmpl
+++ b/parm/wave/ep_10m_interp.inp.tmpl
@@ -5,7 +5,7 @@ $ Start Time DT NSteps
$ Total number of grids
2
$ Grid extensions
- 'gnh_10m'
+ 'uglo_m1g16'
'ep_10m'
$
0
diff --git a/parm/wave/glo_15mxt_interp.inp.tmpl b/parm/wave/glo_15mxt_interp.inp.tmpl
index 74bc9eebf4..19e9dae684 100755
--- a/parm/wave/glo_15mxt_interp.inp.tmpl
+++ b/parm/wave/glo_15mxt_interp.inp.tmpl
@@ -3,11 +3,9 @@ $------------------------------------------------
$ Start Time DT NSteps
TIME DT NSTEPS
$ Total number of grids
- 4
+ 2
$ Grid extensions
- 'gnh_10m'
- 'aoc_9km'
- 'gsh_15m'
+ 'uglo_m1g16'
'glo_15mxt'
$
0
diff --git a/parm/wave/glo_200_interp.inp.tmpl b/parm/wave/glo_200_interp.inp.tmpl
new file mode 100755
index 0000000000..c238a6fe0b
--- /dev/null
+++ b/parm/wave/glo_200_interp.inp.tmpl
@@ -0,0 +1,12 @@
+$ Input file for interpolation of GLO30m_ext Grid
+$------------------------------------------------
+$ Start Time DT NSteps
+ TIME DT NSTEPS
+$ Total number of grids
+ 2
+$ Grid extensions
+ 'uglo_100km'
+ 'glo_200'
+$
+ 0
+$
diff --git a/parm/wave/glo_30m_interp.inp.tmpl b/parm/wave/glo_30m_interp.inp.tmpl
index ea1baf7fc4..c62881202c 100755
--- a/parm/wave/glo_30m_interp.inp.tmpl
+++ b/parm/wave/glo_30m_interp.inp.tmpl
@@ -3,11 +3,9 @@ $------------------------------------------------
$ Start Time DT NSteps
TIME DT NSTEPS
$ Total number of grids
- 4
+ 2
$ Grid extensions
- 'gnh_10m'
- 'aoc_9km'
- 'gsh_15m'
+ 'uglo_m1g16'
'glo_30m'
$
0
diff --git a/parm/wave/wc_10m_interp.inp.tmpl b/parm/wave/wc_10m_interp.inp.tmpl
index abb51b4dfc..8338c91d0c 100755
--- a/parm/wave/wc_10m_interp.inp.tmpl
+++ b/parm/wave/wc_10m_interp.inp.tmpl
@@ -5,7 +5,7 @@ $ Start Time DT NSteps
$ Total number of grids
2
$ Grid extensions
- 'gnh_10m'
+ 'uglo_m1g16'
'wc_10m'
$
0
diff --git a/scripts/exgdas_atmos_chgres_forenkf.sh b/scripts/exgdas_atmos_chgres_forenkf.sh
index d48d58947e..40f702beb2 100755
--- a/scripts/exgdas_atmos_chgres_forenkf.sh
+++ b/scripts/exgdas_atmos_chgres_forenkf.sh
@@ -21,7 +21,6 @@ source "$HOMEgfs/ush/preamble.sh"
# Directories.
pwd=$(pwd)
-export FIXam=${FIXam:-$HOMEgfs/fix/am}
# Base variables
CDATE=${CDATE:-"2001010100"}
@@ -59,7 +58,7 @@ SENDECF=${SENDECF:-"NO"}
SENDDBN=${SENDDBN:-"NO"}
# level info file
-SIGLEVEL=${SIGLEVEL:-${FIXam}/global_hyblev.l${LEVS}.txt}
+SIGLEVEL=${SIGLEVEL:-${FIXgfs}/am/global_hyblev.l${LEVS}.txt}
# forecast files
APREFIX=${APREFIX:-""}
@@ -129,7 +128,7 @@ if [ $DO_CALC_ANALYSIS == "YES" ]; then
$NLN $ATMF09ENS fcst.ensres.09
fi
export OMP_NUM_THREADS=$NTHREADS_CHGRES
- SIGLEVEL=${SIGLEVEL:-${FIXam}/global_hyblev.l${LEVS_ENKF}.txt}
+ SIGLEVEL=${SIGLEVEL:-${FIXgfs}/am/global_hyblev.l${LEVS_ENKF}.txt}
if [ $USE_CFP = "YES" ]; then
[[ -f $DATA/mp_chgres.sh ]] && rm $DATA/mp_chgres.sh
diff --git a/scripts/exgdas_atmos_nawips.sh b/scripts/exgdas_atmos_nawips.sh
index 94a23f2a85..83781bac5b 100755
--- a/scripts/exgdas_atmos_nawips.sh
+++ b/scripts/exgdas_atmos_nawips.sh
@@ -22,27 +22,27 @@ DATA_RUN=$DATA/$RUN2
mkdir -p $DATA_RUN
cd $DATA_RUN
-cp $FIXgempak/g2varswmo2.tbl g2varswmo2.tbl
+cp ${HOMEgfs}/gempak/fix/g2varswmo2.tbl g2varswmo2.tbl
export err=$?
if [[ $err -ne 0 ]] ; then
echo " File g2varswmo2.tbl file is missing."
exit $err
fi
-cp $FIXgempak/g2vcrdwmo2.tbl g2vcrdwmo2.tbl
+cp ${HOMEgfs}/gempak/fix/g2vcrdwmo2.tbl g2vcrdwmo2.tbl
export err=$?
if [[ $err -ne 0 ]] ; then
echo " File g2vcrdwmo2.tbl file is missing."
exit $err
fi
-cp $FIXgempak/g2varsncep1.tbl g2varsncep1.tbl
+cp ${HOMEgfs}/gempak/fix/g2varsncep1.tbl g2varsncep1.tbl
export err=$?
if [[ $err -ne 0 ]] ; then
echo " File g2varsncep1.tbl file is missing."
exit $err
fi
-cp $FIXgempak/g2vcrdncep1.tbl g2vcrdncep1.tbl
+cp ${HOMEgfs}/gempak/fix/g2vcrdncep1.tbl g2vcrdncep1.tbl
export err=$?
if [[ $err -ne 0 ]] ; then
echo " File g2vcrdncep1.tbl file is missing."
diff --git a/scripts/exgdas_atmos_verfrad.sh b/scripts/exgdas_atmos_verfrad.sh
index 50320ffba1..1ff01ccfa9 100755
--- a/scripts/exgdas_atmos_verfrad.sh
+++ b/scripts/exgdas_atmos_verfrad.sh
@@ -37,9 +37,9 @@ if [[ -s ${radstat} && -s ${biascr} ]]; then
#------------------------------------------------------------------
# SATYPE is the list of expected satellite/instrument sources
- # in the radstat file. It should be stored in the $TANKverf
- # directory. If it isn't there then use the $FIXgdas copy. In all
- # cases write it back out to the radmon.$PDY directory. Add any
+ # in the radstat file. It should be stored in the $TANKverf
+ # directory. If it isn't there then use the gdas fix copy. In all
+ # cases write it back out to the radmon.$PDY directory. Add any
# new sources to the list before writing back out.
#------------------------------------------------------------------
diff --git a/scripts/exgdas_enkf_ecen.sh b/scripts/exgdas_enkf_ecen.sh
index c20d1dec78..59021debaa 100755
--- a/scripts/exgdas_enkf_ecen.sh
+++ b/scripts/exgdas_enkf_ecen.sh
@@ -76,8 +76,6 @@ CYCLESH=${CYCLESH:-$HOMEgfs/ush/global_cycle.sh}
export CYCLEXEC=${CYCLEXEC:-$HOMEgfs/exec/global_cycle}
APRUN_CYCLE=${APRUN_CYCLE:-${APRUN:-""}}
NTHREADS_CYCLE=${NTHREADS_CYCLE:-${NTHREADS:-1}}
-export FIXorog=${FIXorog:-$HOMEgfs/fix/orog}
-export FIXam=${FIXam:-$HOMEgfs/fix/am}
export CYCLVARS=${CYCLVARS:-"FSNOL=-2.,FSNOS=99999.,"}
export FHOUR=${FHOUR:-0}
export DELTSFC=${DELTSFC:-6}
@@ -241,7 +239,7 @@ if [ $RECENTER_ENKF = "YES" ]; then
$NLN $ATMANL_GSI atmanl_gsi
$NLN $ATMANL_GSI_ENSRES atmanl_gsi_ensres
- SIGLEVEL=${SIGLEVEL:-${FIXam}/global_hyblev.l${LEVS}.txt}
+ SIGLEVEL=${SIGLEVEL:-${FIXgfs}/am/global_hyblev.l${LEVS}.txt}
$NLN $CHGRESNC chgres.x
chgresnml=chgres_nc_gauss.nml
nmltitle=chgres
diff --git a/scripts/exgdas_enkf_fcst.sh b/scripts/exgdas_enkf_fcst.sh
deleted file mode 100755
index fd6136ddd2..0000000000
--- a/scripts/exgdas_enkf_fcst.sh
+++ /dev/null
@@ -1,225 +0,0 @@
-#! /usr/bin/env bash
-
-################################################################################
-#### UNIX Script Documentation Block
-# . .
-# Script name: exgdas_enkf_fcst.sh
-# Script description: Run ensemble forecasts
-#
-# Author: Rahul Mahajan Org: NCEP/EMC Date: 2017-03-02
-#
-# Abstract: This script runs ensemble forecasts serially one-after-another
-#
-# $Id$
-#
-# Attributes:
-# Language: POSIX shell
-#
-####
-################################################################################
-
-source "${HOMEgfs}/ush/preamble.sh"
-
-# Enemble group, begin and end
-ENSGRP=${ENSGRP:-1}
-ENSBEG=${ENSBEG:-1}
-ENSEND=${ENSEND:-1}
-
-# Re-run failed members, or entire group
-RERUN_EFCSGRP=${RERUN_EFCSGRP:-"YES"}
-
-# Recenter flag and increment file prefix
-RECENTER_ENKF=${RECENTER_ENKF:-"YES"}
-export PREFIX_ATMINC=${PREFIX_ATMINC:-""}
-
-################################################################################
-# Preprocessing
-cd "${DATA}" || exit 99
-DATATOP=${DATA}
-
-################################################################################
-# Set output data
-EFCSGRP="${COM_TOP}/efcs.grp${ENSGRP}"
-if [[ -f ${EFCSGRP} ]]; then
- if [[ ${RERUN_EFCSGRP} = "YES" ]]; then
- rm -f "${EFCSGRP}"
- else
- echo "RERUN_EFCSGRP = ${RERUN_EFCSGRP}, will re-run FAILED members only!"
- ${NMV} "${EFCSGRP}" "${EFCSGRP}.fail"
- fi
-fi
-
-################################################################################
-# Set namelist/model config options common to all members once
-
-# There are many many model namelist options
-# Some are resolution (CASE) dependent, some depend on the model configuration
-# and will need to be added here before $FORECASTSH is called
-# For now assume that
-# 1. the ensemble and the deterministic are same resolution
-# 2. the ensemble runs with the same configuration as the deterministic
-
-# Model config option for Ensemble
-export TYPE=${TYPE_ENKF:-${TYPE:-nh}} # choices: nh, hydro
-export MONO=${MONO_ENKF:-${MONO:-non-mono}} # choices: mono, non-mono
-
-# fv_core_nml
-export CASE=${CASE_ENS:-${CASE:-C768}}
-export layout_x=${layout_x_ENKF:-${layout_x:-8}}
-export layout_y=${layout_y_ENKF:-${layout_y:-16}}
-export LEVS=${LEVS_ENKF:-${LEVS:-64}}
-
-# nggps_diag_nml
-export FHOUT=${FHOUT_ENKF:-3}
-if [[ ${RUN} == "enkfgfs" ]]; then
- export FHOUT=${FHOUT_ENKF_GFS:-${FHOUT_ENKF:${FHOUT:-3}}}
-fi
-# model_configure
-export DELTIM=${DELTIM_ENKF:-${DELTIM:-225}}
-export FHMAX=${FHMAX_ENKF:-9}
-if [[ ${RUN} == "enkfgfs" ]]; then
- export FHMAX=${FHMAX_ENKF_GFS:-${FHMAX_ENKF:-${FHMAX}}}
-fi
-
-# gfs_physics_nml
-export FHSWR=${FHSWR_ENKF:-${FHSWR:-3600.}}
-export FHLWR=${FHLWR_ENKF:-${FHLWR:-3600.}}
-export IEMS=${IEMS_ENKF:-${IEMS:-1}}
-export ISOL=${ISOL_ENKF:-${ISOL:-2}}
-export IAER=${IAER_ENKF:-${IAER:-111}}
-export ICO2=${ICO2_ENKF:-${ICO2:-2}}
-export cdmbgwd=${cdmbgwd_ENKF:-${cdmbgwd:-"3.5,0.25"}}
-export dspheat=${dspheat_ENKF:-${dspheat:-".true."}}
-export shal_cnv=${shal_cnv_ENKF:-${shal_cnv:-".true."}}
-export FHZER=${FHZER_ENKF:-${FHZER:-6}}
-export FHCYC=${FHCYC_ENKF:-${FHCYC:-6}}
-
-# Set PREFIX_ATMINC to r when recentering on
-if [[ ${RECENTER_ENKF} = "YES" ]]; then
- export PREFIX_ATMINC="r"
-fi
-
-# Ignore possible spelling error (nothing is misspelled)
-# shellcheck disable=SC2153
-GDATE=$(${NDATE} -"${assim_freq}" "${PDY}${cyc}")
-declare -x gPDY="${GDATE:0:8}"
-declare -x gcyc="${GDATE:8:2}"
-
-################################################################################
-# Run forecast for ensemble member
-rc=0
-for imem in $(seq "${ENSBEG}" "${ENSEND}"); do
-
- cd "${DATATOP}"
-
- ENSMEM=$(printf %03i "${imem}")
- export ENSMEM
- memchar="mem${ENSMEM}"
-
- echo "Processing MEMBER: ${ENSMEM}"
-
- ra=0
-
- skip_mem="NO"
- if [[ -f ${EFCSGRP}.fail ]]; then
- set +e
- memstat=$(grep "MEMBER ${ENSMEM}" "${EFCSGRP}.fail" | grep -c "PASS")
- set_strict
- [[ ${memstat} -eq 1 ]] && skip_mem="YES"
- fi
-
- # Construct COM variables from templates (see config.com)
- # Can't make these read-only because we are looping over members
- MEMDIR="${memchar}" YMD=${PDY} HH=${cyc} generate_com -x COM_ATMOS_RESTART COM_ATMOS_INPUT COM_ATMOS_ANALYSIS \
- COM_ATMOS_HISTORY COM_ATMOS_MASTER COM_CONF
-
- MEMDIR="${memchar}" YMD="${gPDY}" HH="${gcyc}" generate_com -x COM_ATMOS_RESTART_PREV:COM_ATMOS_RESTART_TMPL
-
- if [[ ${DO_WAVE} == "YES" ]]; then
- MEMDIR="${memchar}" YMD=${PDY} HH=${cyc} generate_com -x COM_WAVE_RESTART COM_WAVE_PREP COM_WAVE_HISTORY
- MEMDIR="${memchar}" YMD="${gPDY}" HH="${gcyc}" generate_com -x COM_WAVE_RESTART_PREV:COM_WAVE_RESTART_TMPL
- fi
-
- if [[ ${DO_OCN} == "YES" ]]; then
- MEMDIR="${memchar}" YMD=${PDY} HH=${cyc} generate_com -x COM_MED_RESTART COM_OCEAN_RESTART \
- COM_OCEAN_INPUT COM_OCEAN_HISTORY COM_OCEAN_ANALYSIS
- MEMDIR="${memchar}" YMD="${gPDY}" HH="${gcyc}" generate_com -x COM_OCEAN_RESTART_PREV:COM_OCEAN_RESTART_TMPL
- fi
-
- if [[ ${DO_ICE} == "YES" ]]; then
- MEMDIR="${memchar}" YMD=${PDY} HH=${cyc} generate_com -x COM_ICE_HISTORY COM_ICE_INPUT COM_ICE_RESTART
- MEMDIR="${memchar}" YMD="${gPDY}" HH="${gcyc}" generate_com -x COM_ICE_RESTART_PREV:COM_ICE_RESTART_TMPL
- fi
-
- if [[ ${DO_AERO} == "YES" ]]; then
- MEMDIR="${memchar}" YMD=${PDY} HH=${cyc} generate_com -x COM_CHEM_HISTORY
- fi
-
-
- if [[ ${skip_mem} = "NO" ]]; then
-
- ra=0
-
- export MEMBER=${imem}
- export DATA="${DATATOP}/${memchar}"
- if [[ -d ${DATA} ]]; then rm -rf "${DATA}"; fi
- mkdir -p "${DATA}"
- ${FORECASTSH}
- ra=$?
-
- # Notify a member forecast failed and abort
- if [[ ${ra} -ne 0 ]]; then
- err_exit "FATAL ERROR: forecast of member ${ENSMEM} FAILED. Aborting job"
- fi
-
- rc=$((rc+ra))
-
- fi
-
- if [[ ${SENDDBN} = YES ]]; then
- fhr=${FHOUT}
- while [[ ${fhr} -le ${FHMAX} ]]; do
- FH3=$(printf %03i "${fhr}")
- if (( fhr % 3 == 0 )); then
- "${DBNROOT}/bin/dbn_alert" MODEL GFS_ENKF "${job}" "${COM_ATMOS_HISTORY}/${RUN}.t${cyc}z.sfcf${FH3}.nc"
- fi
- fhr=$((fhr+FHOUT))
- done
- fi
-
- cd "${DATATOP}"
-
- if [[ -s ${EFCSGRP} ]]; then
- ${NCP} "${EFCSGRP}" log_old
- fi
- [[ -f log ]] && rm log
- [[ -f log_new ]] && rm log_new
- if [[ ${ra} -ne 0 ]]; then
- echo "MEMBER ${ENSMEM} : FAIL" > log
- else
- echo "MEMBER ${ENSMEM} : PASS" > log
- fi
- if [[ -s log_old ]] ; then
- cat log_old log > log_new
- else
- cat log > log_new
- fi
- ${NCP} log_new "${EFCSGRP}"
-
-done
-
-################################################################################
-# Echo status of ensemble group
-cd "${DATATOP}"
-echo "Status of ensemble members in group ${ENSGRP}:"
-cat "${EFCSGRP}"
-[[ -f ${EFCSGRP}.fail ]] && rm "${EFCSGRP}".fail
-
-################################################################################
-# If any members failed, error out
-export err=${rc}; err_chk
-
-################################################################################
-# Postprocessing
-
-exit "${err}"
diff --git a/scripts/exgdas_enkf_post.sh b/scripts/exgdas_enkf_post.sh
index 86ab9071a4..f240ae561d 100755
--- a/scripts/exgdas_enkf_post.sh
+++ b/scripts/exgdas_enkf_post.sh
@@ -34,7 +34,7 @@ SENDDBN=${SENDDBN:-"NO"}
# Fix files
LEVS=${LEVS:-64}
-HYBENSMOOTH=${HYBENSMOOTH:-$FIXgsi/global_hybens_smoothinfo.l${LEVS}.txt}
+HYBENSMOOTH=${HYBENSMOOTH:-${FIXgfs}/gsi/global_hybens_smoothinfo.l${LEVS}.txt}
# Executables.
GETATMENSMEANEXEC=${GETATMENSMEANEXEC:-$HOMEgfs/exec/getsigensmeanp_smooth.x}
diff --git a/scripts/exgdas_enkf_sfc.sh b/scripts/exgdas_enkf_sfc.sh
index 81d68fb9fe..085ab35351 100755
--- a/scripts/exgdas_enkf_sfc.sh
+++ b/scripts/exgdas_enkf_sfc.sh
@@ -54,8 +54,6 @@ CYCLESH=${CYCLESH:-$HOMEgfs/ush/global_cycle.sh}
export CYCLEXEC=${CYCLEXEC:-$HOMEgfs/exec/global_cycle}
APRUN_CYCLE=${APRUN_CYCLE:-${APRUN:-""}}
NTHREADS_CYCLE=${NTHREADS_CYCLE:-${NTHREADS:-1}}
-export FIXorog=${FIXorog:-$HOMEgfs/fix/orog}
-export FIXam=${FIXam:-$HOMEgfs/fix/am}
export CYCLVARS=${CYCLVARS:-"FSNOL=-2.,FSNOS=99999.,"}
export FHOUR=${FHOUR:-0}
export DELTSFC=${DELTSFC:-6}
@@ -152,8 +150,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} "${FIXorog}/${CASE}/${CASE}_grid.tile${n}.nc" "${DATA}/fngrid.${cmem}"
- ${NLN} "${FIXorog}/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile${n}.nc" "${DATA}/fnorog.${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}"
done
@@ -188,8 +186,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} "${FIXorog}/${CASE}/${CASE}_grid.tile${n}.nc" "${DATA}/fngrid.${cmem}"
- ${NLN} "${FIXorog}/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile${n}.nc" "${DATA}/fnorog.${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}"
done
diff --git a/scripts/exgdas_enkf_update.sh b/scripts/exgdas_enkf_update.sh
index 1f11026ac4..60d2592e4d 100755
--- a/scripts/exgdas_enkf_update.sh
+++ b/scripts/exgdas_enkf_update.sh
@@ -105,14 +105,14 @@ else
fi
LATA_ENKF=${LATA_ENKF:-$LATB_ENKF}
LONA_ENKF=${LONA_ENKF:-$LONB_ENKF}
-SATANGL=${SATANGL:-${FIXgsi}/global_satangbias.txt}
-SATINFO=${SATINFO:-${FIXgsi}/global_satinfo.txt}
-CONVINFO=${CONVINFO:-${FIXgsi}/global_convinfo.txt}
-OZINFO=${OZINFO:-${FIXgsi}/global_ozinfo.txt}
-SCANINFO=${SCANINFO:-${FIXgsi}/global_scaninfo.txt}
-HYBENSINFO=${HYBENSINFO:-${FIXgsi}/global_hybens_info.l${LEVS_ENKF}.txt}
-ANAVINFO=${ANAVINFO:-${FIXgsi}/global_anavinfo.l${LEVS_ENKF}.txt}
-VLOCALEIG=${VLOCALEIG:-${FIXgsi}/vlocal_eig_l${LEVS_ENKF}.dat}
+SATANGL=${SATANGL:-${FIXgfs}/gsi/global_satangbias.txt}
+SATINFO=${SATINFO:-${FIXgfs}/gsi/global_satinfo.txt}
+CONVINFO=${CONVINFO:-${FIXgfs}/gsi/global_convinfo.txt}
+OZINFO=${OZINFO:-${FIXgfs}/gsi/global_ozinfo.txt}
+SCANINFO=${SCANINFO:-${FIXgfs}/gsi/global_scaninfo.txt}
+HYBENSINFO=${HYBENSINFO:-${FIXgfs}/gsi/global_hybens_info.l${LEVS_ENKF}.txt}
+ANAVINFO=${ANAVINFO:-${FIXgfs}/gsi/global_anavinfo.l${LEVS_ENKF}.txt}
+VLOCALEIG=${VLOCALEIG:-${FIXgfs}/gsi/vlocal_eig_l${LEVS_ENKF}.dat}
ENKF_SUFFIX="s"
[[ $SMOOTH_ENKF = "NO" ]] && ENKF_SUFFIX=""
diff --git a/scripts/exgfs_atmos_gempak_meta.sh b/scripts/exgfs_atmos_gempak_meta.sh
index 04f4f1fc5c..ad5ef823fd 100755
--- a/scripts/exgfs_atmos_gempak_meta.sh
+++ b/scripts/exgfs_atmos_gempak_meta.sh
@@ -73,14 +73,14 @@ do
if [ $do_all -eq 1 ] ; then
do_all=0
- awk '{print $1}' $FIXgempak/gfs_meta > $DATA/tmpscript
+ awk '{print $1}' ${HOMEgfs}/gempak/fix/gfs_meta > $DATA/tmpscript
else
#
# Do not try to grep out 12, it will grab the 12 from 126.
# This will work as long as we don't need 12 fhr metafiles
#
if [ $fhr -ne 12 ] ; then
- grep $fhr $FIXgempak/gfs_meta |awk -F" [0-9]" '{print $1}' > $DATA/tmpscript
+ grep $fhr ${HOMEgfs}/gempak/fix/gfs_meta |awk -F" [0-9]" '{print $1}' > $DATA/tmpscript
fi
fi
diff --git a/scripts/exgfs_atmos_goes_nawips.sh b/scripts/exgfs_atmos_goes_nawips.sh
index 583593fef8..137feec7c2 100755
--- a/scripts/exgfs_atmos_goes_nawips.sh
+++ b/scripts/exgfs_atmos_goes_nawips.sh
@@ -15,13 +15,13 @@ source "$HOMEgfs/ush/preamble.sh"
cd $DATA
-cp $FIXgempak/g2varswmo2.tbl g2varswmo2.tbl
-cp $FIXgempak/g2vcrdwmo2.tbl g2vcrdwmo2.tbl
-cp $FIXgempak/g2varsncep1.tbl g2varsncep1.tbl
-cp $FIXgempak/g2vcrdncep1.tbl g2vcrdncep1.tbl
+cp ${HOMEgfs}/gempak/fix/g2varswmo2.tbl g2varswmo2.tbl
+cp ${HOMEgfs}/gempak/fix/g2vcrdwmo2.tbl g2vcrdwmo2.tbl
+cp ${HOMEgfs}/gempak/fix/g2varsncep1.tbl g2varsncep1.tbl
+cp ${HOMEgfs}/gempak/fix/g2vcrdncep1.tbl g2vcrdncep1.tbl
#
-# NAGRIB_TABLE=$FIXgempak/nagrib.tbl
+# NAGRIB_TABLE=${HOMEgfs}/gempak/fix/nagrib.tbl
NAGRIB=$GEMEXE/nagrib2
#
diff --git a/scripts/exgfs_atmos_nawips.sh b/scripts/exgfs_atmos_nawips.sh
index ebb509d392..d03ec9cef6 100755
--- a/scripts/exgfs_atmos_nawips.sh
+++ b/scripts/exgfs_atmos_nawips.sh
@@ -50,10 +50,10 @@ while (( fhcnt <= fend )) ; do
if mkdir "lock.${fhcnt}" ; then
cd "lock.${fhcnt}" || exit 1
- cp "${FIXgempak}/g2varswmo2.tbl" "g2varswmo2.tbl"
- cp "${FIXgempak}/g2vcrdwmo2.tbl" "g2vcrdwmo2.tbl"
- cp "${FIXgempak}/g2varsncep1.tbl" "g2varsncep1.tbl"
- cp "${FIXgempak}/g2vcrdncep1.tbl" "g2vcrdncep1.tbl"
+ cp "${HOMEgfs}/gempak/fix/g2varswmo2.tbl" "g2varswmo2.tbl"
+ cp "${HOMEgfs}/gempak/fix/g2vcrdwmo2.tbl" "g2vcrdwmo2.tbl"
+ cp "${HOMEgfs}/gempak/fix/g2varsncep1.tbl" "g2varsncep1.tbl"
+ cp "${HOMEgfs}/gempak/fix/g2vcrdncep1.tbl" "g2vcrdncep1.tbl"
fhr=$(printf "%03d" "${fhcnt}")
diff --git a/scripts/exgfs_wave_init.sh b/scripts/exgfs_wave_init.sh
index ce903a2284..22da372a2a 100755
--- a/scripts/exgfs_wave_init.sh
+++ b/scripts/exgfs_wave_init.sh
@@ -94,16 +94,16 @@ source "${HOMEgfs}/ush/preamble.sh"
echo " Mod def file for ${grdID} not found in ${COM_WAVE_PREP}. Setting up to generate ..."
echo ' '
set_trace
- if [ -f $FIXwave/ww3_grid.inp.$grdID ]
+ if [ -f ${FIXgfs}/wave/ww3_grid.inp.$grdID ]
then
- cp $FIXwave/ww3_grid.inp.$grdID ww3_grid.inp.$grdID
+ cp ${FIXgfs}/wave/ww3_grid.inp.$grdID ww3_grid.inp.$grdID
fi
if [ -f ww3_grid.inp.$grdID ]
then
set +x
echo ' '
- echo " ww3_grid.inp.$grdID copied ($FIXwave/ww3_grid.inp.$grdID)."
+ echo " ww3_grid.inp.$grdID copied (${FIXgfs}/wave/ww3_grid.inp.$grdID)."
echo ' '
set_trace
else
@@ -118,6 +118,13 @@ source "${HOMEgfs}/ush/preamble.sh"
err=2;export err;${errchk}
fi
+
+ if [ -f ${FIXgfs}/wave/${grdID}.msh ]
+ then
+ cp "${FIXgfs}/wave/${grdID}.msh" "${grdID}.msh"
+ fi
+ #TO DO: how do we say "it's unstructured, and therefore need to have error check here"
+
[[ ! -d "${COM_WAVE_PREP}" ]] && mkdir -m 775 -p "${COM_WAVE_PREP}"
if [ ${CFP_MP:-"NO"} = "YES" ]; then
echo "$nmoddef $USHwave/wave_grid_moddef.sh $grdID > $grdID.out 2>&1" >> cmdfile
@@ -166,7 +173,7 @@ source "${HOMEgfs}/ush/preamble.sh"
exit=$?
fi
- if [ "$exit" != '0' ]
+ if [[ "$exit" != '0' ]]
then
set +x
echo ' '
@@ -195,9 +202,9 @@ source "${HOMEgfs}/ush/preamble.sh"
echo '********************************************** '
echo '*** FATAL ERROR : NO MODEL DEFINITION FILE *** '
echo '********************************************** '
- echo " grdID = $grdID"
+ echo " grdID = ${grdID}"
echo ' '
- sed "s/^/$grdID.out : /g" $grdID.out
+ sed "s/^/${grdID}.out : /g" "${grdID}.out"
set_trace
err=3;export err;${errchk}
fi
diff --git a/scripts/exgfs_wave_nawips.sh b/scripts/exgfs_wave_nawips.sh
index 63690ff1b0..9145a30a2f 100755
--- a/scripts/exgfs_wave_nawips.sh
+++ b/scripts/exgfs_wave_nawips.sh
@@ -24,7 +24,6 @@ export FHOUT_HF_WAV=${FHOUT_HF_WAV:-3}
export maxtries=${maxtries:-720}
export cycle=${cycle:-t${cyc}z}
export GEMwave=${GEMwave:-${HOMEgfs}/gempak}
-export FIXwave=${FIXwave:-${HOMEgfs}/fix/wave}
export DATA=${DATA:-${DATAROOT:?}/${jobid}}
if [ ! -d ${DATA} ];then
mkdir -p ${DATA}
diff --git a/scripts/exgfs_wave_post_pnt.sh b/scripts/exgfs_wave_post_pnt.sh
index a7aa957564..c085c48f30 100755
--- a/scripts/exgfs_wave_post_pnt.sh
+++ b/scripts/exgfs_wave_post_pnt.sh
@@ -156,7 +156,11 @@ source "$HOMEgfs/ush/preamble.sh"
cp -f $PARMwave/wave_${NET}.buoys buoy.loc.temp
if [ "$DOBNDPNT_WAV" = YES ]; then
#only do boundary points
- sed -n '/^\$.*/!p' buoy.loc.temp | grep IBP > buoy.loc
+ sed -n '/^\$.*/!p' buoy.loc.temp | grep IBP > buoy.loc || {
+ echo "WARNING: No boundary points found in buoy file ${PARMwave}/wave_${NET}.buoys"
+ echo " Ending job without doing anything."
+ exit 0
+ }
else
#exclude boundary points
sed -n '/^\$.*/!p' buoy.loc.temp | grep -v IBP > buoy.loc
diff --git a/scripts/exgfs_wave_prdgen_bulls.sh b/scripts/exgfs_wave_prdgen_bulls.sh
index 2e6cb2071b..bcad75a660 100755
--- a/scripts/exgfs_wave_prdgen_bulls.sh
+++ b/scripts/exgfs_wave_prdgen_bulls.sh
@@ -31,7 +31,6 @@ source "$HOMEgfs/ush/preamble.sh"
export DATA=${DATA:-${DATAROOT:?}/${job}.$$}
#export CODEwave=${CODEwave:-${PACKAGEROOT}/${NET}_code.${wave_code_ver}/${code_pkg}}
export EXECwave=${EXECwave:-$HOMEgfs/exec}
- export FIXwave=${FIXwave:-$HOMEgfs/fix}
export PARMwave=${PARMwave:-$HOMEgfs/parm/parm_wave}
export USHwave=${USHwave:-$HOMEgfs/ush}
#export EXECcode=${EXECcode:-CODEwave/exec}
diff --git a/scripts/exgfs_wave_prdgen_gridded.sh b/scripts/exgfs_wave_prdgen_gridded.sh
index b0cbc124ce..54efb639d6 100755
--- a/scripts/exgfs_wave_prdgen_gridded.sh
+++ b/scripts/exgfs_wave_prdgen_gridded.sh
@@ -31,7 +31,6 @@ source "$HOMEgfs/ush/preamble.sh"
export FHOUT_WAV=${FHOUT_WAV:-6} #from 72 to 180 inc=6
export FHOUT_HF_WAV=${FHOUT_HF_WAV:-3}
export maxtries=720
- export FIXwave=${FIXwave:-$HOMEgfs/fix/wave}
export PARMwave=${PARMwave:-$HOMEgfs/parm/parm_wave}
export USHwave=${USHwave:-$HOMEgfs/ush}
export cyc=${cyc:-00}
diff --git a/scripts/exgfs_wave_prep.sh b/scripts/exgfs_wave_prep.sh
index be006c1c85..f6cb610559 100755
--- a/scripts/exgfs_wave_prep.sh
+++ b/scripts/exgfs_wave_prep.sh
@@ -23,7 +23,7 @@
# #
# Update log #
# Mar2007 HTolman - Added NCO note on resources on mist/dew #
-# Apr2007 HTolman - Renaming mod_def files in $FIX_wave. #
+# Apr2007 HTolman - Renaming mod_def files in ${FIXgfs}/wave. #
# Mar2011 AChawla - Migrating to a vertical structure #
# Nov2012 JHAlves - Transitioning to WCOSS #
# Apr2019 JHAlves - Transitioning to GEFS workflow #
diff --git a/scripts/exglobal_archive_emc.sh b/scripts/exglobal_archive_emc.sh
index 2f7e3be972..833b06bd98 100755
--- a/scripts/exglobal_archive_emc.sh
+++ b/scripts/exglobal_archive_emc.sh
@@ -182,12 +182,12 @@ if [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; then
targrp_list="${targrp_list} gfswave"
fi
- if [ "${DO_OCN}" = "YES" ]; then
- targrp_list="${targrp_list} ocn_ice_grib2_0p5 ocn_ice_grib2_0p25 ocn_2D ocn_3D ocn_xsect ocn_daily gfs_flux_1p00"
+ 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"
+ if [[ "${DO_ICE}" == "YES" ]]; then
+ targrp_list="${targrp_list} ice_6hravg ice_grib2"
fi
# Aerosols
diff --git a/scripts/exglobal_archive_gsl.sh b/scripts/exglobal_archive_gsl.sh
index b84fe345c2..e3984300d1 100755
--- a/scripts/exglobal_archive_gsl.sh
+++ b/scripts/exglobal_archive_gsl.sh
@@ -183,7 +183,7 @@ if [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; then
fi
# Turn on extended globbing options
- yyyy="${PDY:0:4}"
+ yyyy="${PDY:0:4}" ##JKH
shopt -s extglob
for targrp in ${targrp_list}; do
set +e
@@ -208,7 +208,7 @@ if [[ ${HPSSARCH} = "YES" || ${LOCALARCH} = "YES" ]]; then
esac
# Create the tarball
- tar_fl="${ATARDIR}/${yyyy}/${PDY}${cyc}/${targrp}.tar"
+ tar_fl="${ATARDIR}/${yyyy}/${PDY}${cyc}/${targrp}.tar" ##JKH
${TARCMD} -P -cvf "${tar_fl}" $(cat "${DATA}/${targrp}.txt")
status=$?
diff --git a/scripts/exglobal_atmos_analysis.sh b/scripts/exglobal_atmos_analysis.sh
index cb3c6467a1..b12046f9e2 100755
--- a/scripts/exglobal_atmos_analysis.sh
+++ b/scripts/exglobal_atmos_analysis.sh
@@ -289,21 +289,21 @@ else
fi
# GSI Fix files
-BERROR=${BERROR:-${FIXgsi}/Big_Endian/global_berror.l${LEVS}y${NLAT_A}.f77}
-SATANGL=${SATANGL:-${FIXgsi}/global_satangbias.txt}
-SATINFO=${SATINFO:-${FIXgsi}/global_satinfo.txt}
-RADCLOUDINFO=${RADCLOUDINFO:-${FIXgsi}/cloudy_radiance_info.txt}
-ATMSFILTER=${ATMSFILTER:-${FIXgsi}/atms_beamwidth.txt}
-ANAVINFO=${ANAVINFO:-${FIXgsi}/global_anavinfo.l${LEVS}.txt}
-CONVINFO=${CONVINFO:-${FIXgsi}/global_convinfo.txt}
-vqcdat=${vqcdat:-${FIXgsi}/vqctp001.dat}
-INSITUINFO=${INSITUINFO:-${FIXgsi}/global_insituinfo.txt}
-OZINFO=${OZINFO:-${FIXgsi}/global_ozinfo.txt}
-PCPINFO=${PCPINFO:-${FIXgsi}/global_pcpinfo.txt}
-AEROINFO=${AEROINFO:-${FIXgsi}/global_aeroinfo.txt}
-SCANINFO=${SCANINFO:-${FIXgsi}/global_scaninfo.txt}
-HYBENSINFO=${HYBENSINFO:-${FIXgsi}/global_hybens_info.l${LEVS}.txt}
-OBERROR=${OBERROR:-${FIXgsi}/prepobs_errtable.global}
+BERROR=${BERROR:-${FIXgfs}/gsi/Big_Endian/global_berror.l${LEVS}y${NLAT_A}.f77}
+SATANGL=${SATANGL:-${FIXgfs}/gsi/global_satangbias.txt}
+SATINFO=${SATINFO:-${FIXgfs}/gsi/global_satinfo.txt}
+RADCLOUDINFO=${RADCLOUDINFO:-${FIXgfs}/gsi/cloudy_radiance_info.txt}
+ATMSFILTER=${ATMSFILTER:-${FIXgfs}/gsi/atms_beamwidth.txt}
+ANAVINFO=${ANAVINFO:-${FIXgfs}/gsi/global_anavinfo.l${LEVS}.txt}
+CONVINFO=${CONVINFO:-${FIXgfs}/gsi/global_convinfo.txt}
+vqcdat=${vqcdat:-${FIXgfs}/gsi/vqctp001.dat}
+INSITUINFO=${INSITUINFO:-${FIXgfs}/gsi/global_insituinfo.txt}
+OZINFO=${OZINFO:-${FIXgfs}/gsi/global_ozinfo.txt}
+PCPINFO=${PCPINFO:-${FIXgfs}/gsi/global_pcpinfo.txt}
+AEROINFO=${AEROINFO:-${FIXgfs}/gsi/global_aeroinfo.txt}
+SCANINFO=${SCANINFO:-${FIXgfs}/gsi/global_scaninfo.txt}
+HYBENSINFO=${HYBENSINFO:-${FIXgfs}/gsi/global_hybens_info.l${LEVS}.txt}
+OBERROR=${OBERROR:-${FIXgfs}/gsi/prepobs_errtable.global}
# GSI namelist
SETUP=${SETUP:-""}
@@ -381,8 +381,8 @@ ${NLN} ${OBERROR} errtable
#If using correlated error, link to the covariance files
if [ ${USE_CORRELATED_OBERRS} == "YES" ]; then
if grep -q "Rcov" ${ANAVINFO} ; then
- if ls ${FIXgsi}/Rcov* 1> /dev/null 2>&1; then
- ${NLN} ${FIXgsi}/Rcov* ${DATA}
+ if ls ${FIXgfs}/gsi/Rcov* 1> /dev/null 2>&1; then
+ ${NLN} ${FIXgfs}/gsi/Rcov* ${DATA}
echo "using correlated obs error"
else
echo "FATAL ERROR: Satellite error covariance files (Rcov) are missing."
diff --git a/scripts/exglobal_atmos_analysis_calc.sh b/scripts/exglobal_atmos_analysis_calc.sh
index a2086aa927..a2228f0425 100755
--- a/scripts/exglobal_atmos_analysis_calc.sh
+++ b/scripts/exglobal_atmos_analysis_calc.sh
@@ -23,7 +23,6 @@ source "$HOMEgfs/ush/preamble.sh"
# Directories.
pwd=$(pwd)
-export FIXam=${FIXam:-$HOMEgfs/fix/am}
# Base variables
CDUMP=${CDUMP:-"gdas"}
diff --git a/scripts/exglobal_atmos_products.sh b/scripts/exglobal_atmos_products.sh
index 5f0b1db6cf..5ebc7432f0 100755
--- a/scripts/exglobal_atmos_products.sh
+++ b/scripts/exglobal_atmos_products.sh
@@ -13,6 +13,10 @@ INTERP_ATMOS_SFLUXSH=${INTERP_ATMOS_SFLUXSH:-"${HOMEgfs}/ush/interp_atmos_sflux.
downset=${downset:-1} # No. of groups of pressure grib2 products to create
npe_atmos_products=${npe_atmos_products:-8} # no. of processors available to process each group
+# WGNE related options
+WGNE=${WGNE:-NO} # Create WGNE products
+FHMAX_WGNE=${FHMAX_WGNE:-0} # WGNE products are created for first FHMAX_WGNE forecast hours (except 0)
+
cd "${DATA}" || exit 1
# Set paramlist files based on FORECAST_HOUR (-1, 0, 3, 6, etc.)
@@ -167,14 +171,18 @@ done # for (( nset=1 ; nset <= downset ; nset++ ))
#---------------------------------------------------------------
+# Create the index file for the sflux master, if it exists.
+FLUX_FILE="${COM_ATMOS_MASTER}/${PREFIX}sfluxgrb${fhr3}.grib2"
+if [[ -s "${FLUX_FILE}" ]]; then
+ ${WGRIB2} -s "${FLUX_FILE}" > "${FLUX_FILE}.idx"
+fi
+
# Section creating slfux grib2 interpolated products
# Create 1-degree sflux grib2 output
# move to COM and index it
if [[ "${FLXGF:-}" == "YES" ]]; then
# Files needed by ${INTERP_ATMOS_SFLUXSH}
- FLUX_FILE="${COM_ATMOS_MASTER}/${PREFIX}sfluxgrb${fhr3}.grib2"
-
input_file="${FLUX_FILE}"
output_file_prefix="sflux_${fhr3}"
grid_string="1p00"
@@ -190,6 +198,15 @@ if [[ "${FLXGF:-}" == "YES" ]]; then
done
fi
+# Section creating 0.25 degree WGNE products for nset=1, and fhr <= FHMAX_WGNE
+if [[ "${WGNE:-}" == "YES" ]]; then
+ grp="" # TODO: this should be "a" when we eventually rename the pressure grib2 files per EE2 convention
+ if (( FORECAST_HOUR > 0 & FORECAST_HOUR <= FHMAX_WGNE )); then
+ # TODO: 597 is the message number for APCP in GFSv16. GFSv17 may change this as more messages are added. This can be controlled via config.atmos_products
+ ${WGRIB2} "${COM_ATMOS_GRIB_0p25}/${PREFIX}pgrb2${grp}.0p25.${fhr3}" -d "${APCP_MSG:-597}" -grib "${COM_ATMOS_GRIB_0p25}/${PREFIX}wgne.${fhr3}"
+ fi
+fi
+
#---------------------------------------------------------------
# Start sending DBN alerts
@@ -200,18 +217,21 @@ if [[ "${SENDDBN:-}" == "YES" ]]; then
if [[ "${RUN}" == "gfs" ]]; then
"${DBNROOT}/bin/dbn_alert" MODEL "${RUN^^}_PGB2B_0P25" "${job}" "${COM_ATMOS_GRIB_0p25}/${PREFIX}pgrb2b.0p25.${fhr3}"
"${DBNROOT}/bin/dbn_alert" MODEL "${RUN^^}_PGB2B_0P25_WIDX" "${job}" "${COM_ATMOS_GRIB_0p25}/${PREFIX}pgrb2b.0p25.${fhr3}.idx"
- if [[ -s "${COM_ATMOS_GRIB_0p50}/${PREFIX}pgrb2.0p50.f${fhr3}" ]]; then
+ if [[ -s "${COM_ATMOS_GRIB_0p50}/${PREFIX}pgrb2.0p50.${fhr3}" ]]; then
"${DBNROOT}/bin/dbn_alert" MODEL "${RUN^^}_PGB2_0P5" "${job}" "${COM_ATMOS_GRIB_0p50}/${PREFIX}pgrb2.0p50.${fhr3}"
"${DBNROOT}/bin/dbn_alert" MODEL "${RUN^^}_PGB2_0P5_WIDX" "${job}" "${COM_ATMOS_GRIB_0p50}/${PREFIX}pgrb2.0p50.${fhr3}.idx"
"${DBNROOT}/bin/dbn_alert" MODEL "${RUN^^}_PGB2B_0P5" "${job}" "${COM_ATMOS_GRIB_0p50}/${PREFIX}pgrb2b.0p50.${fhr3}"
"${DBNROOT}/bin/dbn_alert" MODEL "${RUN^^}_PGB2B_0P5_WIDX" "${job}" "${COM_ATMOS_GRIB_0p50}/${PREFIX}pgrb2b.0p50.${fhr3}.idx"
fi
- if [[ -s "${COM_ATMOS_GRIB_1p00}/${PREFIX}pgrb2.1p00.f${fhr3}" ]]; then
+ if [[ -s "${COM_ATMOS_GRIB_1p00}/${PREFIX}pgrb2.1p00.${fhr3}" ]]; then
"${DBNROOT}/bin/dbn_alert" MODEL "${RUN^^}_PGB2_1P0" "${job}" "${COM_ATMOS_GRIB_1p00}/${PREFIX}pgrb2.1p00.${fhr3}"
"${DBNROOT}/bin/dbn_alert" MODEL "${RUN^^}_PGB2_1P0_WIDX" "${job}" "${COM_ATMOS_GRIB_1p00}/${PREFIX}pgrb2.1p00.${fhr3}.idx"
"${DBNROOT}/bin/dbn_alert" MODEL "${RUN^^}_PGB2B_1P0" "${job}" "${COM_ATMOS_GRIB_1p00}/${PREFIX}pgrb2b.1p00.${fhr3}"
"${DBNROOT}/bin/dbn_alert" MODEL "${RUN^^}_PGB2B_1P0_WIDX" "${job}" "${COM_ATMOS_GRIB_1p00}/${PREFIX}pgrb2b.1p00.${fhr3}.idx"
fi
+ if [[ "${WGNE:-}" == "YES" ]] && [[ -s "${COM_ATMOS_GRIB_0p25}/${PREFIX}wgne.${fhr3}" ]] ; then
+ "${DBNROOT}/bin/dbn_alert" MODEL "${RUN^^}_WGNE" "${job}" "${COM_ATMOS_GRIB_0p25}/${PREFIX}wgne.${fhr3}"
+ fi
fi
if [[ "${fhr3}" == "anl" ]]; then
diff --git a/scripts/exglobal_atmos_sfcanl.sh b/scripts/exglobal_atmos_sfcanl.sh
index 2997ac0d25..60869181f3 100755
--- a/scripts/exglobal_atmos_sfcanl.sh
+++ b/scripts/exglobal_atmos_sfcanl.sh
@@ -55,8 +55,6 @@ export SNOW_NUDGE_COEFF=${SNOW_NUDGE_COEFF:-'-2.'}
export CYCLVARS=${CYCLVARS:-""}
export FHOUR=${FHOUR:-0}
export DELTSFC=${DELTSFC:-6}
-export FIXam=${FIXam:-${HOMEgfs}/fix/am}
-export FIXorog=${FIXorog:-${HOMEgfs}/fix/orog}
# FV3 specific info (required for global_cycle)
export CASE=${CASE:-"C384"}
@@ -176,8 +174,8 @@ if [[ ${DOIAU} = "YES" ]]; then
"${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} "${FIXorog}/${CASE}/${CASE}_grid.tile${n}.nc" "${DATA}/fngrid.00${n}"
- ${NLN} "${FIXorog}/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile${n}.nc" "${DATA}/fnorog.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}
@@ -190,8 +188,8 @@ fi
# Update surface restarts at middle of window
for n in $(seq 1 ${ntiles}); do
- if [[ ${DO_JEDILANDDA:-"NO"} = "YES" ]]; then
- ${NCP} "${COM_LAND_ANALYSIS}/${PDY}.${cyc}0000.sfc_data.tile${n}.nc" \
+ 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" \
@@ -199,8 +197,8 @@ for n in $(seq 1 ${ntiles}); do
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} "${FIXorog}/${CASE}/${CASE}_grid.tile${n}.nc" "${DATA}/fngrid.00${n}"
- ${NLN} "${FIXorog}/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile${n}.nc" "${DATA}/fnorog.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}
diff --git a/scripts/exglobal_atmos_vminmon.sh b/scripts/exglobal_atmos_vminmon.sh
index a4453dcf1a..aac63f3fb3 100755
--- a/scripts/exglobal_atmos_vminmon.sh
+++ b/scripts/exglobal_atmos_vminmon.sh
@@ -44,15 +44,15 @@ if [[ -s ${gsistat} ]]; then
#------------------------------------------------------------------
# Run the child sccripts.
#------------------------------------------------------------------
- "${USHgfs}/minmon_xtrct_costs.pl" "${MINMON_SUFFIX}" "${PDY}" "${cyc}" "${gsistat}" dummy
+ "${USHgfs}/minmon_xtrct_costs.pl" "${MINMON_SUFFIX}" "${PDY}" "${cyc}" "${gsistat}"
rc_costs=$?
echo "rc_costs = ${rc_costs}"
- "${USHgfs}/minmon_xtrct_gnorms.pl" "${MINMON_SUFFIX}" "${PDY}" "${cyc}" "${gsistat}" dummy
+ "${USHgfs}/minmon_xtrct_gnorms.pl" "${MINMON_SUFFIX}" "${PDY}" "${cyc}" "${gsistat}"
rc_gnorms=$?
echo "rc_gnorms = ${rc_gnorms}"
- "${USHgfs}/minmon_xtrct_reduct.pl" "${MINMON_SUFFIX}" "${PDY}" "${cyc}" "${gsistat}" dummy
+ "${USHgfs}/minmon_xtrct_reduct.pl" "${MINMON_SUFFIX}" "${PDY}" "${cyc}" "${gsistat}"
rc_reduct=$?
echo "rc_reduct = ${rc_reduct}"
diff --git a/scripts/exglobal_forecast.sh b/scripts/exglobal_forecast.sh
index c50cde74f1..c548b827e5 100755
--- a/scripts/exglobal_forecast.sh
+++ b/scripts/exglobal_forecast.sh
@@ -38,19 +38,19 @@
## Restart files:
##
## Fix files:
-## 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, $FIXam/${O3FORC}
-## 5. Global H2O data, $FIXam/${H2OFORC}
-## 6. Global solar constant data, $FIXam/global_solarconstant_noaa_an.txt
-## 7. Global surface emissivity, $FIXam/global_sfc_emissivity_idx.txt
-## 8. Global CO2 historical data, $FIXam/global_co2historicaldata_glob.txt
-## 8. Global CO2 monthly data, $FIXam/co2monthlycyc.txt
-## 10. Additional global CO2 data, $FIXam/fix_co2_proj/global_co2historicaldata
+## 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
+## 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
+## 7. Global surface emissivity, ${FIXgfs}/am/global_sfc_emissivity_idx.txt
+## 8. Global CO2 historical data, ${FIXgfs}/am/global_co2historicaldata_glob.txt
+## 8. Global CO2 monthly data, ${FIXgfs}/am/co2monthlycyc.txt
+## 10. Additional global CO2 data, ${FIXgfs}/am/fix_co2_proj/global_co2historicaldata
## 11. Climatological aerosol global distribution
-## $FIXam/global_climaeropac_global.txt
-## 12. Monthly volcanic forcing $FIXam/global_volcanic_aerosols_YYYY-YYYY.txt
+## ${FIXgfs}/am/global_climaeropac_global.txt
+## 12. Monthly volcanic forcing ${FIXgfs}/am/global_volcanic_aerosols_YYYY-YYYY.txt
##
## Data output (location, name)
## If quilting=true and output grid is gaussian grid:
@@ -83,7 +83,7 @@ source "${HOMEgfs}/ush/preamble.sh"
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_ufs_configure.sh" # include functions for ufs_configure processing
source "${HOMEgfs}/ush/parsing_model_configure_FV3.sh"
# Coupling control switches, for coupling purpose, off by default
@@ -105,9 +105,11 @@ common_predet
echo "MAIN: Loading variables before determination of run type"
FV3_predet
+[[ ${cplflx} = .true. ]] && CMEPS_predet
[[ ${cplflx} = .true. ]] && MOM6_predet
[[ ${cplwav} = .true. ]] && WW3_predet
[[ ${cplice} = .true. ]] && CICE_predet
+[[ ${cplchm} = .true. ]] && GOCART_predet
echo "MAIN: Variables before determination of run type loaded"
echo "MAIN: Determining run type"
@@ -119,6 +121,7 @@ echo "MAIN: RUN Type Determined"
echo "MAIN: Post-determination set up of run type"
FV3_postdet
+[[ ${cplflx} = .true. ]] && CMEPS_postdet
[[ ${cplflx} = .true. ]] && MOM6_postdet
[[ ${cplwav} = .true. ]] && WW3_postdet
[[ ${cplice} = .true. ]] && CICE_postdet
@@ -154,6 +157,7 @@ ${ERRSCRIPT} || exit "${err}"
FV3_out
[[ ${cplflx} = .true. ]] && MOM6_out
+[[ ${cplflx} = .true. ]] && CMEPS_out
[[ ${cplwav} = .true. ]] && WW3_out
[[ ${cplice} = .true. ]] && CICE_out
[[ ${cplchm} = .true. ]] && GOCART_out
diff --git a/scripts/exglobal_oceanice_products.py b/scripts/exglobal_oceanice_products.py
new file mode 100755
index 0000000000..0f8e2e0d6d
--- /dev/null
+++ b/scripts/exglobal_oceanice_products.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+
+import os
+
+from wxflow import AttrDict, Logger, logit, cast_strdict_as_dtypedict
+from pygfs.task.oceanice_products import OceanIceProducts
+
+# 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 OceanIce object
+ oceanice = OceanIceProducts(config)
+
+ # Pull out all the configuration keys needed to run the rest of steps
+ keys = ['HOMEgfs', 'DATA', 'current_cycle', 'RUN', 'NET',
+ 'COM_OCEAN_HISTORY', 'COM_OCEAN_GRIB',
+ 'COM_ICE_HISTORY', 'COM_ICE_GRIB',
+ 'APRUN_OCNICEPOST',
+ 'component', 'forecast_hour', 'valid_datetime', 'avg_period',
+ 'model_grid', 'product_grids', 'oceanice_yaml']
+ oceanice_dict = AttrDict()
+ for key in keys:
+ oceanice_dict[key] = oceanice.task_config[key]
+
+ # Initialize the DATA/ directory; copy static data
+ oceanice.initialize(oceanice_dict)
+
+ for grid in oceanice_dict.product_grids:
+
+ logger.info(f"Processing {grid} grid")
+
+ # Configure DATA/ directory for execution; prepare namelist etc.
+ oceanice.configure(oceanice_dict, grid)
+
+ # Run the oceanice post executable to interpolate and create grib2 files
+ oceanice.execute(oceanice_dict, grid)
+
+ # Subset raw model data to create netCDF products
+ oceanice.subset(oceanice_dict)
+
+ # Copy processed output from execute and subset
+ oceanice.finalize(oceanice_dict)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/scripts/exglobal_prep_land_obs.py b/scripts/exglobal_prep_snow_obs.py
similarity index 59%
rename from scripts/exglobal_prep_land_obs.py
rename to scripts/exglobal_prep_snow_obs.py
index 3594771c8a..5107d9c935 100755
--- a/scripts/exglobal_prep_land_obs.py
+++ b/scripts/exglobal_prep_snow_obs.py
@@ -1,12 +1,12 @@
#!/usr/bin/env python3
-# exglobal_land_analysis_prepare.py
-# This script creates a LandAnalysis object
+# exglobal_prep_snow_obs.py
+# This script creates a SnowAnalysis object
# and runs the prepare_GTS and prepare_IMS method
# which perform the pre-processing for GTS and IMS data
import os
from wxflow import Logger, cast_strdict_as_dtypedict
-from pygfs.task.land_analysis import LandAnalysis
+from pygfs.task.snow_analysis import SnowAnalysis
# Initialize root logger
@@ -18,8 +18,8 @@
# Take configuration from environment and cast it as python dictionary
config = cast_strdict_as_dtypedict(os.environ)
- # Instantiate the land prepare task
- LandAnl = LandAnalysis(config)
- LandAnl.prepare_GTS()
- if f"{ LandAnl.runtime_config.cyc }" == '18':
- LandAnl.prepare_IMS()
+ # Instantiate the snow prepare task
+ SnowAnl = SnowAnalysis(config)
+ SnowAnl.prepare_GTS()
+ if f"{ SnowAnl.runtime_config.cyc }" == '18':
+ SnowAnl.prepare_IMS()
diff --git a/scripts/exglobal_land_analysis.py b/scripts/exglobal_snow_analysis.py
similarity index 66%
rename from scripts/exglobal_land_analysis.py
rename to scripts/exglobal_snow_analysis.py
index 70141475b0..fe050f5af5 100755
--- a/scripts/exglobal_land_analysis.py
+++ b/scripts/exglobal_snow_analysis.py
@@ -1,12 +1,12 @@
#!/usr/bin/env python3
-# exglobal_land_analysis.py
-# This script creates an LandAnalysis class
+# exglobal_snow_analysis.py
+# This script creates an SnowAnalysis class
# and runs the initialize, execute and finalize methods
-# for a global Land Snow Depth analysis
+# for a global Snow Depth analysis
import os
from wxflow import Logger, cast_strdict_as_dtypedict
-from pygfs.task.land_analysis import LandAnalysis
+from pygfs.task.snow_analysis import SnowAnalysis
# Initialize root logger
logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=True)
@@ -17,8 +17,8 @@
# Take configuration from environment and cast it as python dictionary
config = cast_strdict_as_dtypedict(os.environ)
- # Instantiate the land analysis task
- anl = LandAnalysis(config)
+ # Instantiate the snow analysis task
+ anl = SnowAnalysis(config)
anl.initialize()
anl.execute()
anl.finalize()
diff --git a/scripts/exglobal_stage_ic.sh b/scripts/exglobal_stage_ic.sh
index 58b37f3114..c12eaa84e0 100755
--- a/scripts/exglobal_stage_ic.sh
+++ b/scripts/exglobal_stage_ic.sh
@@ -104,6 +104,17 @@ for MEMDIR in "${MEMDIR_ARRAY[@]}"; do
;;
esac
+ # Ocean Perturbation Files
+ # Extra zero on MEMDIR ensure we have a number even if the string is empty
+ if (( 0${MEMDIR:3} > 0 )) && [[ "${OCN_ENS_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"
+ ${NCP} "${src}" "${tgt}"
+ rc=${?}
+ ((rc != 0)) && error_message "${src}" "${tgt}" "${rc}"
+ err=$((err + rc))
+ fi
+
# TODO: Do mediator restarts exists in a ATMW configuration?
# TODO: No mediator is presumably involved in an ATMA configuration
if [[ ${EXP_WARM_START:-".false."} = ".true." ]]; then
diff --git a/scripts/run_reg2grb2.sh b/scripts/run_reg2grb2.sh
deleted file mode 100755
index ab2c80043e..0000000000
--- a/scripts/run_reg2grb2.sh
+++ /dev/null
@@ -1,72 +0,0 @@
-#! /usr/bin/env bash
-
-source "${HOMEgfs}/ush/preamble.sh"
-
-#requires grib_util module
-
-MOM6REGRID=${MOM6REGRID:-${HOMEgfs}}
-export mask_file="${MOM6REGRID}/fix/reg2grb2/mask.0p25x0p25.grb2"
-
-# offline testing:
-#export DATA=
-#export icefile=$DATA/DATA0p5/icer2012010106.01.2012010100_0p5x0p5.nc
-#export ocnfile=$DATA/DATA0p5/ocnr2012010106.01.2012010100_0p5x0p5.nc
-#export outfile=$DATA/DATA0p5/out/ocnh2012010106.01.2012010100.grb2
-#
-# workflow testing:
-export icefile="icer${VDATE}.${ENSMEM}.${IDATE}_0p25x0p25_CICE.nc"
-export ocnfile="ocnr${VDATE}.${ENSMEM}.${IDATE}_0p25x0p25_MOM6.nc"
-export outfile="ocn_ice${VDATE}.${ENSMEM}.${IDATE}_0p25x0p25.grb2"
-export outfile0p5="ocn_ice${VDATE}.${ENSMEM}.${IDATE}_0p5x0p5.grb2"
-
-export mfcstcpl=${mfcstcpl:-1}
-export IGEN_OCNP=${IGEN_OCNP:-197}
-
-# PT This is the forecast date
-export year=${VDATE:0:4}
-export month=${VDATE:4:2}
-export day=${VDATE:6:2}
-export hour=${VDATE:8:2}
-
-# PT This is the initialization date
-export syear=${IDATE:0:4}
-export smonth=${IDATE:4:2}
-export sday=${IDATE:6:2}
-export shour=${IDATE:8:2}
-
-# PT Need to get this from above - could be 6 or 1 hour
-export hh_inc_ocn=6
-#
-# set for 1p0 lat-lon
-#export im=360
-#export jm=181
-# export km=40
-#export imo=360
-#export jmo=181
-#
-# set for 0p5 lat-lon
-#export im=720
-#export jm=361
-#export km=40
-#export imo=720
-#export jmo=361
-#
-# set for 0p25 lat-lon
-export im=1440
-export jm=721
-export imo=1440
-export jmo=721
-export km=40
-
-export flats=-90.
-export flatn=90.
-export flonw=0.0
-export flone=359.75
-
-ln -sf "${mask_file}" ./iceocnpost.g2
-${executable} > "reg2grb2.${VDATE}.${IDATE}.out"
-
-# interpolated from 0p25 to 0p5 grid
-grid2p05="0 6 0 0 0 0 0 0 720 361 0 0 90000000 0 48 -90000000 359500000 500000 500000 0"
-${COPYGB2} -g "${grid2p05}" -i0 -x "${outfile}" "${outfile0p5}"
-
diff --git a/scripts/run_regrid.sh b/scripts/run_regrid.sh
deleted file mode 100755
index 103e9a759e..0000000000
--- a/scripts/run_regrid.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-#! /usr/bin/env bash
-
-source "${HOMEgfs}/ush/preamble.sh"
-
-MOM6REGRID="${MOM6REGRID:-${HOMEgfs}}"
-export EXEC_DIR="${MOM6REGRID}/exec"
-export USH_DIR="${MOM6REGRID}/ush"
-export COMOUTocean="${COM_OCEAN_HISTORY}"
-export COMOUTice="${COM_ICE_HISTORY}"
-export IDATE="${IDATE}"
-export VDATE="${VDATE}"
-export ENSMEM="${ENSMEM}"
-export FHR="${fhr}"
-export DATA="${DATA}"
-export FIXreg2grb2="${FIXreg2grb2}"
-
-###### DO NOT MODIFY BELOW UNLESS YOU KNOW WHAT YOU ARE DOING #######
-#Need NCL module to be loaded:
-echo "${NCARG_ROOT}"
-export NCL="${NCARG_ROOT}/bin/ncl"
-
-ls -alrt
-
-${NCL} "${USH_DIR}/icepost.ncl"
-${NCL} "${USH_DIR}/ocnpost.ncl"
-#####################################################################
-
diff --git a/sorc/build_all.sh b/sorc/build_all.sh
index 23cf420f1d..3de13b7b60 100755
--- a/sorc/build_all.sh
+++ b/sorc/build_all.sh
@@ -16,9 +16,11 @@ function _usage() {
Builds all of the global-workflow components by calling the individual build
scripts in sequence.
-Usage: ${BASH_SOURCE[0]} [-a UFS_app][-c build_config][-h][-j n][-v]
+Usage: ${BASH_SOURCE[0]} [-a UFS_app][-c build_config][-d][-h][-j n][-v][-w]
-a UFS_app:
Build a specific UFS app instead of the default
+ -d:
+ Build in debug mode
-g:
Build GSI
-h:
@@ -29,28 +31,35 @@ Usage: ${BASH_SOURCE[0]} [-a UFS_app][-c build_config][-h][-j n][-v]
Build UFS-DA
-v:
Execute all build scripts with -v option to turn on verbose where supported
+ -w:
+ Use unstructured wave grid
EOF
exit 1
}
-script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" &> /dev/null && pwd)
-cd "${script_dir}" || exit 1
+# shellcheck disable=SC2155
+readonly HOMEgfs=$(cd "$(dirname "$(readlink -f -n "${BASH_SOURCE[0]}" )" )/.." && pwd -P)
+cd "${HOMEgfs}/sorc" || exit 1
_build_ufs_opt=""
_build_ufsda="NO"
_build_gsi="NO"
+_build_debug=""
_verbose_opt=""
+_wave_unst=""
_build_job_max=20
# Reset option counter in case this script is sourced
OPTIND=1
-while getopts ":a:ghj:uv" option; do
+while getopts ":a:dghj:uvw" option; do
case "${option}" in
a) _build_ufs_opt+="-a ${OPTARG} ";;
+ d) _build_debug="-d" ;;
g) _build_gsi="YES" ;;
h) _usage;;
j) _build_job_max="${OPTARG} ";;
u) _build_ufsda="YES" ;;
v) _verbose_opt="-v";;
+ w) _wave_unst="-w";;
:)
echo "[${BASH_SOURCE[0]}]: ${option} requires an argument"
_usage
@@ -64,24 +73,24 @@ done
shift $((OPTIND-1))
-logs_dir="${script_dir}/logs"
+logs_dir="${HOMEgfs}/sorc/logs"
if [[ ! -d "${logs_dir}" ]]; then
echo "Creating logs folder"
- mkdir "${logs_dir}" || exit 1
+ mkdir -p "${logs_dir}" || exit 1
fi
# Check final exec folder exists
-if [[ ! -d "../exec" ]]; then
- echo "Creating ../exec folder"
- mkdir ../exec
+if [[ ! -d "${HOMEgfs}/exec" ]]; then
+ echo "Creating ${HOMEgfs}/exec folder"
+ mkdir -p "${HOMEgfs}/exec"
fi
#------------------------------------
# GET MACHINE
#------------------------------------
export COMPILER="intel"
-source gfs_utils.fd/ush/detect_machine.sh
-source gfs_utils.fd/ush/module-setup.sh
+source "${HOMEgfs}/ush/detect_machine.sh"
+source "${HOMEgfs}/ush/module-setup.sh"
if [[ -z "${MACHINE_ID}" ]]; then
echo "FATAL: Unable to determine target machine"
exit 1
@@ -113,42 +122,42 @@ declare -A build_opts
big_jobs=0
build_jobs["ufs"]=8
big_jobs=$((big_jobs+1))
-build_opts["ufs"]="${_verbose_opt} ${_build_ufs_opt}"
+build_opts["ufs"]="${_wave_unst} ${_verbose_opt} ${_build_ufs_opt} ${_build_debug}"
-build_jobs["upp"]=6 # The UPP is hardcoded to use 6 cores
-build_opts["upp"]=""
+build_jobs["upp"]=2
+build_opts["upp"]="${_build_debug}"
-build_jobs["ufs_utils"]=3
-build_opts["ufs_utils"]="${_verbose_opt}"
+build_jobs["ufs_utils"]=2
+build_opts["ufs_utils"]="${_verbose_opt} ${_build_debug}"
build_jobs["gfs_utils"]=1
-build_opts["gfs_utils"]="${_verbose_opt}"
+build_opts["gfs_utils"]="${_verbose_opt} ${_build_debug}"
-build_jobs["ww3prepost"]=3
-build_opts["ww3prepost"]="${_verbose_opt} ${_build_ufs_opt}"
+build_jobs["ww3prepost"]=2
+build_opts["ww3prepost"]="${_wave_unst} ${_verbose_opt} ${_build_ufs_opt} ${_build_debug}"
# Optional DA builds
if [[ "${_build_ufsda}" == "YES" ]]; then
- if [[ "${MACHINE_ID}" != "orion" && "${MACHINE_ID}" != "hera" ]]; then
+ if [[ "${MACHINE_ID}" != "orion" && "${MACHINE_ID}" != "hera" && "${MACHINE_ID}" != "hercules" ]]; then
echo "NOTE: The GDAS App is not supported on ${MACHINE_ID}. Disabling build."
else
build_jobs["gdas"]=8
big_jobs=$((big_jobs+1))
- build_opts["gdas"]="${_verbose_opt}"
+ build_opts["gdas"]="${_verbose_opt} ${_build_debug}"
fi
fi
if [[ "${_build_gsi}" == "YES" ]]; then
build_jobs["gsi_enkf"]=8
- build_opts["gsi_enkf"]="${_verbose_opt}"
+ build_opts["gsi_enkf"]="${_verbose_opt} ${_build_debug}"
fi
if [[ "${_build_gsi}" == "YES" || "${_build_ufsda}" == "YES" ]] ; then
- build_jobs["gsi_utils"]=2
- build_opts["gsi_utils"]="${_verbose_opt}"
+ build_jobs["gsi_utils"]=1
+ build_opts["gsi_utils"]="${_verbose_opt} ${_build_debug}"
if [[ "${MACHINE_ID}" == "hercules" ]]; then
echo "NOTE: The GSI Monitor is not supported on Hercules. Disabling build."
else
build_jobs["gsi_monitor"]=1
- build_opts["gsi_monitor"]="${_verbose_opt}"
+ build_opts["gsi_monitor"]="${_verbose_opt} ${_build_debug}"
fi
fi
@@ -192,13 +201,10 @@ while [[ ${builds_started} -lt ${#build_jobs[@]} ]]; do
if [[ -n "${build_jobs[${build}]+0}" && -z "${build_ids[${build}]+0}" ]]; then
# Do we have enough processors to run it?
if [[ ${_build_job_max} -ge $(( build_jobs[build] + procs_in_use )) ]]; then
- if [[ "${build}" != "upp" ]]; then
- "./build_${build}.sh" -j "${build_jobs[${build}]}" "${build_opts[${build}]:-}" > \
- "${logs_dir}/build_${build}.log" 2>&1 &
- else
- "./build_${build}.sh" "${build_opts[${build}]}" > \
- "${logs_dir}/build_${build}.log" 2>&1 &
- fi
+ # double-quoting build_opts here will not work since it is a string of options
+ #shellcheck disable=SC2086
+ "./build_${build}.sh" ${build_opts[${build}]:-} -j "${build_jobs[${build}]}" > \
+ "${logs_dir}/build_${build}.log" 2>&1 &
build_ids["${build}"]=$!
echo "Starting build_${build}.sh"
procs_in_use=$(( procs_in_use + build_jobs[${build}] ))
diff --git a/sorc/build_gdas.sh b/sorc/build_gdas.sh
index b1a17c33dd..43c503ab4d 100755
--- a/sorc/build_gdas.sh
+++ b/sorc/build_gdas.sh
@@ -2,11 +2,12 @@
set -eux
OPTIND=1
+_opts="-f " # forces a clean build
while getopts ":j:dv" option; do
case "${option}" in
- d) export BUILD_TYPE="DEBUG";;
- j) export BUILD_JOBS=${OPTARG};;
- v) export BUILD_VERBOSE="YES";;
+ d) _opts+="-c -DCMAKE_BUILD_TYPE=Debug " ;;
+ j) BUILD_JOBS=${OPTARG};;
+ v) _opts+="-v ";;
:)
echo "[${BASH_SOURCE[0]}]: ${option} requires an argument"
usage
@@ -19,12 +20,10 @@ while getopts ":j:dv" option; do
done
shift $((OPTIND-1))
-# TODO: GDASApp does not presently handle BUILD_TYPE
-
-BUILD_TYPE=${BUILD_TYPE:-"Release"} \
-BUILD_VERBOSE=${BUILD_VERBOSE:-"NO"} \
+# double quoting opts will not work since it is a string of options
+# shellcheck disable=SC2086
BUILD_JOBS="${BUILD_JOBS:-8}" \
WORKFLOW_BUILD="ON" \
-./gdas.cd/build.sh
+./gdas.cd/build.sh ${_opts} -f
exit
diff --git a/sorc/build_gfs_utils.sh b/sorc/build_gfs_utils.sh
index 09bd4a9656..e53f71ddcd 100755
--- a/sorc/build_gfs_utils.sh
+++ b/sorc/build_gfs_utils.sh
@@ -18,14 +18,12 @@ EOF
exit 1
}
-cwd=$(pwd)
-
OPTIND=1
while getopts ":j:dvh" option; do
case "${option}" in
- d) export BUILD_TYPE="DEBUG";;
- v) export BUILD_VERBOSE="YES";;
- j) export BUILD_JOBS="${OPTARG}";;
+ d) BUILD_TYPE="Debug";;
+ v) BUILD_VERBOSE="YES";;
+ j) BUILD_JOBS="${OPTARG}";;
h)
usage
;;
@@ -44,6 +42,6 @@ shift $((OPTIND-1))
BUILD_TYPE=${BUILD_TYPE:-"Release"} \
BUILD_VERBOSE=${BUILD_VERBOSE:-"NO"} \
BUILD_JOBS=${BUILD_JOBS:-8} \
-"${cwd}/gfs_utils.fd/ush/build.sh"
+"./gfs_utils.fd/ush/build.sh"
exit
diff --git a/sorc/build_gsi_enkf.sh b/sorc/build_gsi_enkf.sh
index 9ba278e3ec..ba24cefa81 100755
--- a/sorc/build_gsi_enkf.sh
+++ b/sorc/build_gsi_enkf.sh
@@ -4,9 +4,9 @@ set -eux
OPTIND=1
while getopts ":j:dv" option; do
case "${option}" in
- d) export BUILD_TYPE="DEBUG";;
- j) export BUILD_JOBS="${OPTARG}";;
- v) export BUILD_VERBOSE="YES";;
+ d) BUILD_TYPE="Debug";;
+ j) BUILD_JOBS="${OPTARG}";;
+ v) BUILD_VERBOSE="YES";;
:)
echo "[${BASH_SOURCE[0]}]: ${option} requires an argument"
usage
diff --git a/sorc/build_gsi_monitor.sh b/sorc/build_gsi_monitor.sh
index 3de1262aac..31add1882a 100755
--- a/sorc/build_gsi_monitor.sh
+++ b/sorc/build_gsi_monitor.sh
@@ -1,14 +1,12 @@
#! /usr/bin/env bash
set -eux
-cwd=$(pwd)
-
OPTIND=1
while getopts ":j:dv" option; do
case "${option}" in
- d) export BUILD_TYPE="DEBUG";;
- j) export BUILD_JOBS="${OPTARG}";;
- v) export BUILD_VERBOSE="YES";;
+ d) BUILD_TYPE="Debug";;
+ j) BUILD_JOBS="${OPTARG}";;
+ v) BUILD_VERBOSE="YES";;
:)
echo "[${BASH_SOURCE[0]}]: ${option} requires an argument"
usage
@@ -24,6 +22,6 @@ shift $((OPTIND-1))
BUILD_TYPE=${BUILD_TYPE:-"Release"} \
BUILD_VERBOSE=${BUILD_VERBOSE:-"NO"} \
BUILD_JOBS=${BUILD_JOBS:-8} \
-"${cwd}/gsi_monitor.fd/ush/build.sh"
+"./gsi_monitor.fd/ush/build.sh"
exit
diff --git a/sorc/build_gsi_utils.sh b/sorc/build_gsi_utils.sh
index 81eab0f628..58c64e6e4a 100755
--- a/sorc/build_gsi_utils.sh
+++ b/sorc/build_gsi_utils.sh
@@ -1,14 +1,12 @@
#! /usr/bin/env bash
set -eux
-cwd=$(pwd)
-
OPTIND=1
while getopts ":j:dv" option; do
case "${option}" in
- d) export BUILD_TYPE="DEBUG";;
- j) export BUILD_JOBS="${OPTARG}";;
- v) export BUILD_VERBOSE="YES";;
+ d) BUILD_TYPE="Debug";;
+ j) BUILD_JOBS="${OPTARG}";;
+ v) BUILD_VERBOSE="YES";;
:)
echo "[${BASH_SOURCE[0]}]: ${option} requires an argument"
usage
@@ -25,6 +23,6 @@ BUILD_TYPE=${BUILD_TYPE:-"Release"} \
BUILD_VERBOSE=${BUILD_VERBOSE:-"NO"} \
BUILD_JOBS=${BUILD_JOBS:-8} \
UTIL_OPTS="-DBUILD_UTIL_ENKF_GFS=ON -DBUILD_UTIL_NCIO=ON" \
-"${cwd}/gsi_utils.fd/ush/build.sh"
+"./gsi_utils.fd/ush/build.sh"
exit
diff --git a/sorc/build_ufs.sh b/sorc/build_ufs.sh
index 59914d6b09..43f3580002 100755
--- a/sorc/build_ufs.sh
+++ b/sorc/build_ufs.sh
@@ -7,12 +7,13 @@ cwd=$(pwd)
APP="S2SWA"
CCPP_SUITES="FV3_GFS_v17_p8_ugwpv1,FV3_GFS_v17_coupled_p8_ugwpv1,FV3_GFS_v17_p8_ugwpv1_c3,FV3_GFS_v17_p8_ugwpv1_c3_mynn,FV3_GFS_v17_p8_ugwpv1_mynn" # TODO: does the g-w need to build with all these CCPP_SUITES?
-while getopts ":da:j:v" option; do
+while getopts ":da:j:vw" option; do
case "${option}" in
- d) BUILD_TYPE="DEBUG";;
+ d) BUILD_TYPE="Debug";;
a) APP="${OPTARG}";;
j) BUILD_JOBS="${OPTARG}";;
v) export BUILD_VERBOSE="YES";;
+ w) PDLIB="ON";;
:)
echo "[${BASH_SOURCE[0]}]: ${option} requires an argument"
;;
@@ -28,7 +29,8 @@ source "./tests/detect_machine.sh"
source "./tests/module-setup.sh"
MAKE_OPT="-DAPP=${APP} -D32BIT=ON -DCCPP_SUITES=${CCPP_SUITES}"
-[[ ${BUILD_TYPE:-"Release"} = "DEBUG" ]] && MAKE_OPT+=" -DDEBUG=ON"
+[[ ${PDLIB:-"OFF"} = "ON" ]] && MAKE_OPT+=" -DPDLIB=ON"
+[[ ${BUILD_TYPE:-"Release"} = "Debug" ]] && MAKE_OPT+=" -DDEBUG=ON"
COMPILE_NR=0
CLEAN_BEFORE=YES
CLEAN_AFTER=NO
diff --git a/sorc/build_ufs_utils.sh b/sorc/build_ufs_utils.sh
index e78ca3c180..63ec56cb41 100755
--- a/sorc/build_ufs_utils.sh
+++ b/sorc/build_ufs_utils.sh
@@ -4,8 +4,9 @@ set -eux
OPTIND=1
while getopts ":j:dv" option; do
case "${option}" in
- j) export BUILD_JOBS="${OPTARG}";;
- v) export BUILD_VERBOSE="YES";;
+ d) BUILD_TYPE="Debug" ;;
+ j) BUILD_JOBS="${OPTARG}";;
+ v) BUILD_VERBOSE="YES";;
:)
echo "[${BASH_SOURCE[0]}]: ${option} requires an argument"
usage
@@ -18,13 +19,11 @@ while getopts ":j:dv" option; do
done
shift $((OPTIND-1))
-script_dir=$(dirname "${BASH_SOURCE[0]}")
-cd "${script_dir}/ufs_utils.fd" || exit 1
-
CMAKE_OPTS="-DGFS=ON" \
+BUILD_TYPE=${BUILD_TYPE:-"Release"} \
BUILD_JOBS=${BUILD_JOBS:-8} \
BUILD_VERBOSE=${BUILD_VERBOSE:-} \
-./build_all.sh
+./ufs_utils.fd/build_all.sh
exit
diff --git a/sorc/build_upp.sh b/sorc/build_upp.sh
index a55e96ebc8..e217e171db 100755
--- a/sorc/build_upp.sh
+++ b/sorc/build_upp.sh
@@ -6,25 +6,26 @@ cd "${script_dir}" || exit 1
OPTIND=1
_opts=""
-while getopts ":dv" option; do
- case "${option}" in
- d) _opts+="-d ";;
- v) _opts+="-v ";;
- :)
- echo "[${BASH_SOURCE[0]}]: ${option} requires an argument"
- ;;
- *)
- echo "[${BASH_SOURCE[0]}]: Unrecognized option: ${option}"
- ;;
- esac
+while getopts ":dj:v" option; do
+ case "${option}" in
+ d) _opts+="-d " ;;
+ j) BUILD_JOBS="${OPTARG}" ;;
+ v) _opts+="-v ";;
+ :)
+ echo "[${BASH_SOURCE[0]}]: ${option} requires an argument"
+ ;;
+ *)
+ echo "[${BASH_SOURCE[0]}]: Unrecognized option: ${option}"
+ ;;
+ esac
done
shift $((OPTIND-1))
# Check final exec folder exists
if [[ ! -d "../exec" ]]; then
- mkdir ../exec
+ mkdir -p ../exec
fi
cd ufs_model.fd/FV3/upp/tests
# shellcheck disable=SC2086
-./compile_upp.sh ${_opts}
+BUILD_JOBS=${BUILD_JOBS:-8} ./compile_upp.sh ${_opts}
diff --git a/sorc/build_ww3prepost.sh b/sorc/build_ww3prepost.sh
index 919afaacb3..5b527a1641 100755
--- a/sorc/build_ww3prepost.sh
+++ b/sorc/build_ww3prepost.sh
@@ -6,12 +6,15 @@ cd "${script_dir}" || exit 1
# Default settings
APP="S2SWA"
+PDLIB="OFF"
-while getopts ":j:a:v" option; do
+while getopts ":j:a:dvw" option; do
case "${option}" in
a) APP="${OPTARG}";;
+ d) BUILD_TYPE="Debug";;
j) BUILD_JOBS="${OPTARG}";;
v) export BUILD_VERBOSE="YES";;
+ w) PDLIB="ON";;
:)
echo "[${BASH_SOURCE[0]}]: ${option} requires an argument"
usage
@@ -23,15 +26,17 @@ while getopts ":j:a:v" option; do
esac
done
-
# Determine which switch to use
if [[ "${APP}" == "ATMW" ]]; then
ww3switch="model/esmf/switch"
else
- ww3switch="model/bin/switch_meshcap"
+ if [[ "${PDLIB}" == "ON" ]]; then
+ ww3switch="model/bin/switch_meshcap_pdlib"
+ else
+ ww3switch="model/bin/switch_meshcap"
+ fi
fi
-
# Check final exec folder exists
if [[ ! -d "../exec" ]]; then
mkdir ../exec
@@ -64,6 +69,8 @@ mkdir -p "${path_build}" || exit 1
cd "${path_build}" || exit 1
echo "Forcing a SHRD build"
+buildswitch="${path_build}/switch"
+
cat "${SWITCHFILE}" > "${path_build}/tempswitch"
sed -e "s/DIST/SHRD/g"\
@@ -73,15 +80,22 @@ sed -e "s/DIST/SHRD/g"\
-e "s/MPI / /g"\
-e "s/B4B / /g"\
-e "s/PDLIB / /g"\
+ -e "s/SCOTCH / /g"\
+ -e "s/METIS / /g"\
-e "s/NOGRB/NCEP2/g"\
"${path_build}/tempswitch" > "${path_build}/switch"
rm "${path_build}/tempswitch"
-echo "Switch file is ${path_build}/switch with switches:"
-cat "${path_build}/switch"
+echo "Switch file is ${buildswitch} with switches:"
+cat "${buildswitch}"
+
+#define cmake build options
+MAKE_OPT="-DCMAKE_INSTALL_PREFIX=install"
+[[ ${BUILD_TYPE:-"Release"} = "Debug" ]] && MAKE_OPT+=" -DCMAKE_BUILD_TYPE=Debug"
#Build executables:
-cmake "${WW3_DIR}" -DSWITCH="${path_build}/switch" -DCMAKE_INSTALL_PREFIX=install
+# shellcheck disable=SC2086
+cmake "${WW3_DIR}" -DSWITCH="${buildswitch}" ${MAKE_OPT}
rc=$?
if (( rc != 0 )); then
echo "Fatal error in cmake."
diff --git a/sorc/link_workflow.sh b/sorc/link_workflow.sh
index ed33b17e72..58b80668ad 100755
--- a/sorc/link_workflow.sh
+++ b/sorc/link_workflow.sh
@@ -107,7 +107,6 @@ for dir in aer \
lut \
mom6 \
orog \
- reg2grb2 \
sfc_climo \
ugwd \
verif \
@@ -136,15 +135,25 @@ cd "${HOMEgfs}/parm/ufs" || exit 1
${LINK_OR_COPY} "${HOMEgfs}/sorc/ufs_model.fd/tests/parm/noahmptable.tbl" .
cd "${HOMEgfs}/parm/post" || exit 1
-for file in postxconfig-NT-GEFS-ANL.txt postxconfig-NT-GEFS-F00.txt postxconfig-NT-GEFS.txt postxconfig-NT-GFS-ANL.txt \
- postxconfig-NT-GFS-F00-TWO.txt postxconfig-NT-GFS-F00.txt postxconfig-NT-GFS-FLUX-F00.txt postxconfig-NT-GFS-FLUX.txt \
- postxconfig-NT-GFS-GOES.txt postxconfig-NT-GFS-TWO.txt \
- postxconfig-NT-GFS.txt postxconfig-NT-gefs-aerosol.txt postxconfig-NT-gefs-chem.txt params_grib2_tbl_new \
- post_tag_gfs128 post_tag_gfs65 nam_micro_lookup.dat \
- AEROSOL_LUTS.dat optics_luts_DUST.dat optics_luts_SALT.dat optics_luts_SOOT.dat optics_luts_SUSO.dat optics_luts_WASO.dat
+for file in postxconfig-NT-GEFS-F00.txt postxconfig-NT-GEFS.txt postxconfig-NT-GEFS-WAFS.txt \
+ postxconfig-NT-GEFS-F00-aerosol.txt postxconfig-NT-GEFS-aerosol.txt \
+ postxconfig-NT-GFS-ANL.txt postxconfig-NT-GFS-F00.txt postxconfig-NT-GFS-FLUX-F00.txt \
+ postxconfig-NT-GFS.txt postxconfig-NT-GFS-FLUX.txt postxconfig-NT-GFS-GOES.txt \
+ postxconfig-NT-GFS-F00-TWO.txt postxconfig-NT-GFS-TWO.txt \
+ params_grib2_tbl_new post_tag_gfs128 post_tag_gfs65 nam_micro_lookup.dat
do
${LINK_OR_COPY} "${HOMEgfs}/sorc/upp.fd/parm/${file}" .
done
+for file in optics_luts_DUST.dat optics_luts_DUST_nasa.dat optics_luts_NITR_nasa.dat \
+ optics_luts_SALT.dat optics_luts_SALT_nasa.dat optics_luts_SOOT.dat optics_luts_SOOT_nasa.dat \
+ optics_luts_SUSO.dat optics_luts_SUSO_nasa.dat optics_luts_WASO.dat optics_luts_WASO_nasa.dat
+do
+ ${LINK_OR_COPY} "${HOMEgfs}/sorc/upp.fd/fix/chem/${file}" .
+done
+for file in ice.csv ocean.csv ocnicepost.nml.jinja2
+do
+ ${LINK_OR_COPY} "${HOMEgfs}/sorc/gfs_utils.fd/parm/ocnicepost/${file}" .
+done
cd "${HOMEgfs}/scripts" || exit 8
${LINK_OR_COPY} "${HOMEgfs}/sorc/ufs_utils.fd/scripts/exemcsfc_global_sfc_prep.sh" .
@@ -152,29 +161,29 @@ cd "${HOMEgfs}/ush" || exit 8
for file in emcsfc_ice_blend.sh global_cycle_driver.sh emcsfc_snow.sh global_cycle.sh; do
${LINK_OR_COPY} "${HOMEgfs}/sorc/ufs_utils.fd/ush/${file}" .
done
-for file in finddate.sh make_ntc_bull.pl make_NTC_file.pl make_tif.sh month_name.sh ; do
+for file in make_ntc_bull.pl make_NTC_file.pl make_tif.sh month_name.sh ; do
${LINK_OR_COPY} "${HOMEgfs}/sorc/gfs_utils.fd/ush/${file}" .
done
-# TODO: Link these ufs.configure templates from ufs-weather-model
-#cd "${HOMEgfs}/parm/ufs" || exit 1
-#declare -a ufs_configure_files=("ufs.configure.atm.IN" \
-# "ufs.configure.atm_aero.IN" \
-# "ufs.configure.atmw.IN" \
-# "ufs.configure.blocked_atm_wav_2way.IN" \
-# "ufs.configure.blocked_atm_wav.IN" \
-# "ufs.configure.cpld_agrid.IN" \
-# "ufs.configure.cpld_esmfthreads.IN" \
-# "ufs.configure.cpld.IN" \
-# "ufs.configure.cpld_noaero.IN" \
-# "ufs.configure.cpld_noaero_nowave.IN" \
-# "ufs.configure.cpld_noaero_outwav.IN" \
-# "ufs.configure.leapfrog_atm_wav.IN")
-#for file in "${ufs_configure_files[@]}"; do
-# [[ -s "${file}" ]] && rm -f "${file}"
-# ${LINK_OR_COPY} "${HOMEgfs}/sorc/ufs_model.fd/tests/parm/${file}" .
-#done
+# Link these templates from ufs-weather-model
+cd "${HOMEgfs}/parm/ufs" || exit 1
+declare -a ufs_templates=("model_configure.IN" \
+ "MOM_input_025.IN" "MOM_input_050.IN" "MOM_input_100.IN" "MOM_input_500.IN" \
+ "MOM6_data_table.IN" \
+ "ice_in.IN" \
+ "ufs.configure.atm.IN" \
+ "ufs.configure.atmaero.IN" \
+ "ufs.configure.leapfrog_atm_wav.IN" \
+ "ufs.configure.s2s_esmf.IN" \
+ "ufs.configure.s2sa_esmf.IN" \
+ "ufs.configure.s2sw_esmf.IN" \
+ "ufs.configure.s2swa_esmf.IN" )
+for file in "${ufs_templates[@]}"; do
+ [[ -s "${file}" ]] && rm -f "${file}"
+ ${LINK_OR_COPY} "${HOMEgfs}/sorc/ufs_model.fd/tests/parm/${file}" .
+done
+# Link the script from ufs-weather-model that parses the templates
cd "${HOMEgfs}/ush" || exit 1
[[ -s "atparse.bash" ]] && rm -f "atparse.bash"
${LINK_OR_COPY} "${HOMEgfs}/sorc/ufs_model.fd/tests/atparse.bash" .
@@ -187,7 +196,7 @@ if [[ -d "${HOMEgfs}/sorc/gdas.cd" ]]; then
cd "${HOMEgfs}/fix" || exit 1
[[ ! -d gdas ]] && mkdir -p gdas
cd gdas || exit 1
- for gdas_sub in fv3jedi gsibec; do
+ for gdas_sub in fv3jedi gsibec obs; do
if [[ -d "${gdas_sub}" ]]; then
rm -rf "${gdas_sub}"
fi
@@ -196,6 +205,18 @@ if [[ -d "${HOMEgfs}/sorc/gdas.cd" ]]; then
done
fi
+#------------------------------
+#--add GDASApp parm directory
+#------------------------------
+if [[ -d "${HOMEgfs}/sorc/gdas.cd" ]]; then
+ cd "${HOMEgfs}/parm/gdas" || exit 1
+ declare -a gdasapp_comps=("aero" "atm" "io" "ioda" "snow" "soca")
+ for comp in "${gdasapp_comps[@]}"; do
+ [[ -d "${comp}" ]] && rm -rf "${comp}"
+ ${LINK_OR_COPY} "${HOMEgfs}/sorc/gdas.cd/parm/${comp}" .
+ done
+fi
+
#------------------------------
#--add GDASApp files
#------------------------------
@@ -243,7 +264,7 @@ cd "${HOMEgfs}/exec" || exit 1
for utilexe in fbwndgfs.x gaussian_sfcanl.x gfs_bufr.x supvit.x syndat_getjtbul.x \
syndat_maksynrc.x syndat_qctropcy.x tocsbufr.x overgridid.x \
- mkgfsawps.x enkf_chgres_recenter_nc.x tave.x vint.x reg2grb2.x
+ mkgfsawps.x enkf_chgres_recenter_nc.x tave.x vint.x ocnicepost.x
do
[[ -s "${utilexe}" ]] && rm -f "${utilexe}"
${LINK_OR_COPY} "${HOMEgfs}/sorc/gfs_utils.fd/install/bin/${utilexe}" .
@@ -397,7 +418,6 @@ for prog in enkf_chgres_recenter_nc.fd \
mkgfsawps.fd \
overgridid.fd \
rdbfmsua.fd \
- reg2grb2.fd \
supvit.fd \
syndat_getjtbul.fd \
syndat_maksynrc.fd \
@@ -405,7 +425,8 @@ for prog in enkf_chgres_recenter_nc.fd \
tave.fd \
tocsbufr.fd \
vint.fd \
- webtitle.fd
+ webtitle.fd \
+ ocnicepost.fd
do
if [[ -d "${prog}" ]]; then rm -rf "${prog}"; fi
${LINK_OR_COPY} "gfs_utils.fd/src/${prog}" .
diff --git a/sorc/ncl.setup b/sorc/ncl.setup
deleted file mode 100644
index b4981689db..0000000000
--- a/sorc/ncl.setup
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-
-set +x
-case ${target} in
- 'jet'|'hera')
- module load ncl/6.5.0
- export NCARG_LIB=${NCARG_ROOT}/lib
- ;;
- *)
- echo "[${BASH_SOURCE[0]}]: unknown ${target}"
- ;;
-esac
diff --git a/sorc/ufs_model.fd b/sorc/ufs_model.fd
index 2b48d53612..3abec9b22a 160000
--- a/sorc/ufs_model.fd
+++ b/sorc/ufs_model.fd
@@ -1 +1 @@
-Subproject commit 2b48d53612c4ea9d7070852a37e9fdf0c4c952d4
+Subproject commit 3abec9b22aa787cd7dd821ff0ea89c13d62a0841
diff --git a/sorc/ufs_utils.fd b/sorc/ufs_utils.fd
index d805336652..439c86114a 160000
--- a/sorc/ufs_utils.fd
+++ b/sorc/ufs_utils.fd
@@ -1 +1 @@
-Subproject commit d80533665273705b2041c494ed3c1bd50f263265
+Subproject commit 439c86114a9833b2f5101ce89312be26de9e0e7b
diff --git a/ush/calcanl_gfs.py b/ush/calcanl_gfs.py
index cf2dc8dc89..25bbae4bce 100755
--- a/ush/calcanl_gfs.py
+++ b/ush/calcanl_gfs.py
@@ -346,7 +346,7 @@ def calcanl_gfs(DoIAU, l4DEnsVar, Write4Danl, ComOut, APrefix,
ComOut = os.getenv('COM_ATMOS_ANALYSIS', './')
APrefix = os.getenv('APREFIX', '')
NThreads = os.getenv('NTHREADS_CHGRES', 1)
- FixDir = os.getenv('FIXam', './')
+ FixDir = os.path.join(os.getenv('FIXgfs', './'), 'am')
atmges_ens_mean = os.getenv('ATMGES_ENSMEAN', './atmges_ensmean')
RunDir = os.getenv('DATA', './')
ExecCMD = os.getenv('APRUN_CALCANL', '')
diff --git a/ush/detect_machine.sh b/ush/detect_machine.sh
index 01ae66a02d..8a719c10d9 100755
--- a/ush/detect_machine.sh
+++ b/ush/detect_machine.sh
@@ -1,10 +1,21 @@
#!/bin/bash
+# The authoritative copy of this script lives in the ufs-weather-model at:
+# https://github.com/ufs-community/ufs-weather-model/blob/develop/tests/detect_machine.sh
+# If any local modifications are made or new platform support added,
+# please consider opening an issue and a PR to the ufs-weather-model
+# so that this copy remains in sync with its authoritative source
+#
+# Thank you for your contribution
+
+# If the MACHINE_ID variable is set, skip this script.
+[[ -n ${MACHINE_ID:-} ]] && return
+
# First detect w/ hostname
case $(hostname -f) in
- adecflow0[12].acorn.wcoss2.ncep.noaa.gov) MACHINE_ID=wcoss2 ;; ### acorn
- alogin0[12].acorn.wcoss2.ncep.noaa.gov) MACHINE_ID=wcoss2 ;; ### acorn
+ adecflow0[12].acorn.wcoss2.ncep.noaa.gov) MACHINE_ID=acorn ;; ### acorn
+ alogin0[12].acorn.wcoss2.ncep.noaa.gov) MACHINE_ID=acorn ;; ### acorn
clogin0[1-9].cactus.wcoss2.ncep.noaa.gov) MACHINE_ID=wcoss2 ;; ### cactus01-9
clogin10.cactus.wcoss2.ncep.noaa.gov) MACHINE_ID=wcoss2 ;; ### cactus10
dlogin0[1-9].dogwood.wcoss2.ncep.noaa.gov) MACHINE_ID=wcoss2 ;; ### dogwood01-9
@@ -15,7 +26,7 @@ case $(hostname -f) in
gaea9.ncrc.gov) MACHINE_ID=gaea ;; ### gaea9
gaea1[0-6].ncrc.gov) MACHINE_ID=gaea ;; ### gaea10-16
- hfe0[1-9]) MACHINE_ID=hera ;; ### hera01-9
+ hfe0[1-9]) MACHINE_ID=hera ;; ### hera01-09
hfe1[0-2]) MACHINE_ID=hera ;; ### hera10-12
hecflow01) MACHINE_ID=hera ;; ### heraecflow01
@@ -28,10 +39,6 @@ case $(hostname -f) in
[Hh]ercules-login-[1-4].[Hh][Pp][Cc].[Mm]s[Ss]tate.[Ee]du) MACHINE_ID=hercules ;; ### hercules1-4
- cheyenne[1-6].cheyenne.ucar.edu) MACHINE_ID=cheyenne ;; ### cheyenne1-6
- cheyenne[1-6].ib0.cheyenne.ucar.edu) MACHINE_ID=cheyenne ;; ### cheyenne1-6
- chadmin[1-6].ib0.cheyenne.ucar.edu) MACHINE_ID=cheyenne ;; ### cheyenne1-6
-
login[1-4].stampede2.tacc.utexas.edu) MACHINE_ID=stampede ;; ### stampede1-4
login0[1-2].expanse.sdsc.edu) MACHINE_ID=expanse ;; ### expanse1-2
@@ -56,30 +63,30 @@ if [[ "${MACHINE_ID}" != "UNKNOWN" ]]; then
fi
# Try searching based on paths since hostname may not match on compute nodes
-if [[ -d /lfs/f1 ]] ; then
+if [[ -d /lfs/h3 ]]; then
# We are on NOAA Cactus or Dogwood
MACHINE_ID=wcoss2
-elif [[ -d /mnt/lfs1 ]] ; then
+elif [[ -d /lfs/h1 && ! -d /lfs/h3 ]]; then
+ # We are on NOAA TDS Acorn
+ MACHINE_ID=acorn
+elif [[ -d /mnt/lfs1 ]]; then
# We are on NOAA Jet
MACHINE_ID=jet
-elif [[ -d /scratch1 ]] ; then
+elif [[ -d /scratch1 ]]; then
# We are on NOAA Hera
MACHINE_ID=hera
-elif [[ -d /work ]] ; then
+elif [[ -d /work ]]; then
# We are on MSU Orion or Hercules
- if [[ -d /apps/other ]] ; then
+ if [[ -d /apps/other ]]; then
# We are on Hercules
MACHINE_ID=hercules
else
MACHINE_ID=orion
fi
-elif [[ -d /glade ]] ; then
- # We are on NCAR Yellowstone
- MACHINE_ID=cheyenne
-elif [[ -d /lustre && -d /ncrc ]] ; then
+elif [[ -d /gpfs && -d /ncrc ]]; then
# We are on GAEA.
MACHINE_ID=gaea
-elif [[ -d /data/prod ]] ; then
+elif [[ -d /data/prod ]]; then
# We are on SSEC's S4
MACHINE_ID=s4
else
diff --git a/ush/forecast_det.sh b/ush/forecast_det.sh
index d0dc325460..0884bcc962 100755
--- a/ush/forecast_det.sh
+++ b/ush/forecast_det.sh
@@ -8,7 +8,7 @@
## This script is a definition of functions.
#####
-# For all non-evironment variables
+# For all non-environment variables
# Cycling and forecast hour specific parameters
FV3_det(){
@@ -45,7 +45,8 @@ FV3_det(){
RERUN=${RERUN:-"NO"}
# Get a list of all YYYYMMDD.HH0000.coupler.res files from the atmos restart directory
- mapfile -t file_array < <(find "${COM_ATMOS_RESTART:-/dev/null}" -name "????????.??0000.coupler.res")
+ # shellcheck disable=SC2312
+ mapfile -t file_array < <(find "${COM_ATMOS_RESTART:-/dev/null}" -name "????????.??0000.coupler.res" | sort)
if [[ ( "${RUN}" = "gfs" || "${RUN}" = "gefs" ) \
&& "${#file_array[@]}" -gt 0 ]]; then
@@ -67,7 +68,7 @@ FV3_det(){
# Check for availability of FV3 restarts
if [[ -f "${COM_ATMOS_RESTART}/${PDYS}.${cycs}0000.coupler.res" ]]; then
- mv "${COM_ATMOS_RESTART}/${PDYS}.${cycs}0000.coupler.res" "${COM_ATMOS_RESTART}/${PDYS}.${cycs}0000.coupler.res.old" ## JKH
+ mv "${COM_ATMOS_RESTART}/${PDYS}.${cycs}0000.coupler.res" "${COM_ATMOS_RESTART}/${PDYS}.${cycs}0000.coupler.res.old" ##JKH
else
local fv3_rst_ok="NO"
fi
diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh
index f47755f854..644a2180da 100755
--- a/ush/forecast_postdet.sh
+++ b/ush/forecast_postdet.sh
@@ -33,22 +33,20 @@ FV3_postdet(){
done
# Replace sfc_data with sfcanl_data restart files from current cycle (if found)
- if [[ "${MODE}" = "cycled" ]] && [[ "${CCPP_SUITE}" = "FV3_GFS_v16" ]]; then # TODO: remove if statement when global_cycle can handle NOAHMP
- for file in "${COM_ATMOS_RESTART}/${sPDY}.${scyc}0000."*.nc; do
- file2=$(basename "${file}")
- file2=$(echo "${file2}" | cut -d. -f3-) # remove the date from file
- fsufanl=$(echo "${file2}" | cut -d. -f1)
- file2=$(echo "${file2}" | sed -e "s/sfcanl_data/sfc_data/g")
- rm -f "${DATA}/INPUT/${file2}"
- ${NLN} "${file}" "${DATA}/INPUT/${file2}"
- done
- fi
+ for file in "${COM_ATMOS_RESTART}/${sPDY}.${scyc}0000."*.nc; do
+ file2=$(basename "${file}")
+ file2=$(echo "${file2}" | cut -d. -f3-) # remove the date from file
+ fsufanl=$(echo "${file2}" | cut -d. -f1)
+ file2=$(echo "${file2}" | sed -e "s/sfcanl_data/sfc_data/g")
+ rm -f "${DATA}/INPUT/${file2}"
+ ${NLN} "${file}" "${DATA}/INPUT/${file2}"
+ done
- # Need a coupler.res when doing IAU
+ # Need a coupler.res when doing IAU # FIXME: This is needed for warm_start, regardless of IAU.
if [[ ${DOIAU} = "YES" ]]; then
rm -f "${DATA}/INPUT/coupler.res"
cat >> "${DATA}/INPUT/coupler.res" << EOF
- 2 (Calendar: no_calendar=0, thirty_day_months=1, julian=2, gregorian=3, noleap=4)
+ 3 (Calendar: no_calendar=0, thirty_day_months=1, julian=2, gregorian=3, noleap=4)
${gPDY:0:4} ${gPDY:4:2} ${gPDY:6:2} ${gcyc} 0 0 Model start time: year, month, day, hour, minute, second
${sPDY:0:4} ${sPDY:4:2} ${sPDY:6:2} ${scyc} 0 0 Current model time: year, month, day, hour, minute, second
EOF
@@ -93,7 +91,9 @@ EOF
${NLN} "${file}" "${DATA}/INPUT/${file2}"
done
- local hour_rst=$(nhour "${CDATE_RST}" "${current_cycle}")
+ local hour_rst
+ hour_rst=$(nhour "${CDATE_RST}" "${current_cycle}")
+ # shellcheck disable=SC2034
IAU_FHROT=$((IAU_OFFSET+hour_rst))
if [[ ${DOIAU} = "YES" ]]; then
IAUFHRS=-1
@@ -133,17 +133,15 @@ EOF
#--------------------------------------------------------------------------
# Grid and orography data
- FIXsfc=${FIXsfc:-"${FIXorog}/${CASE}/sfc"}
-
if [[ ${cplflx} = ".false." ]] ; then
- ${NLN} "${FIXorog}/${CASE}/${CASE}_mosaic.nc" "${DATA}/INPUT/grid_spec.nc"
+ ${NLN} "${FIXgfs}/orog/${CASE}/${CASE}_mosaic.nc" "${DATA}/INPUT/grid_spec.nc"
else
- ${NLN} "${FIXorog}/${CASE}/${CASE}_mosaic.nc" "${DATA}/INPUT/${CASE}_mosaic.nc"
+ ${NLN} "${FIXgfs}/orog/${CASE}/${CASE}_mosaic.nc" "${DATA}/INPUT/${CASE}_mosaic.nc"
fi
for n in $(seq 1 "${ntiles}"); do
- ${NLN} "${FIXorog}/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile${n}.nc" "${DATA}/INPUT/oro_data.tile${n}.nc"
- ${NLN} "${FIXorog}/${CASE}/${CASE}_grid.tile${n}.nc" "${DATA}/INPUT/${CASE}_grid.tile${n}.nc"
+ ${NLN} "${FIXgfs}/orog/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile${n}.nc" "${DATA}/INPUT/oro_data.tile${n}.nc"
+ ${NLN} "${FIXgfs}/orog/${CASE}/${CASE}_grid.tile${n}.nc" "${DATA}/INPUT/${CASE}_grid.tile${n}.nc"
done
_suite_file="${HOMEgfs}/sorc/ufs_model.fd/FV3/ccpp/suites/suite_${CCPP_SUITE}.xml"
@@ -201,10 +199,10 @@ EOF
fi
# Files for GWD
- ${NLN} "${FIXugwd}/ugwp_limb_tau.nc" "${DATA}/ugwp_limb_tau.nc"
+ ${NLN} "${FIXgfs}/ugwd/ugwp_limb_tau.nc" "${DATA}/ugwp_limb_tau.nc"
for n in $(seq 1 "${ntiles}"); do
- ${NLN} "${FIXugwd}/${CASE}/${CASE}_oro_data_ls.tile${n}.nc" "${DATA}/INPUT/oro_data_ls.tile${n}.nc"
- ${NLN} "${FIXugwd}/${CASE}/${CASE}_oro_data_ss.tile${n}.nc" "${DATA}/INPUT/oro_data_ss.tile${n}.nc"
+ ${NLN} "${FIXgfs}/ugwd/${CASE}/${CASE}_oro_data_ls.tile${n}.nc" "${DATA}/INPUT/oro_data_ls.tile${n}.nc"
+ ${NLN} "${FIXgfs}/ugwd/${CASE}/${CASE}_oro_data_ss.tile${n}.nc" "${DATA}/INPUT/oro_data_ss.tile${n}.nc"
done
# GFS standard input data
@@ -225,51 +223,51 @@ EOF
# imp_physics should be 8:
####
if [[ ${imp_physics} -eq 8 ]]; then
- ${NLN} "${FIXam}/CCN_ACTIVATE.BIN" "${DATA}/CCN_ACTIVATE.BIN"
- ${NLN} "${FIXam}/freezeH2O.dat" "${DATA}/freezeH2O.dat"
- ${NLN} "${FIXam}/qr_acr_qgV2.dat" "${DATA}/qr_acr_qgV2.dat"
- ${NLN} "${FIXam}/qr_acr_qsV2.dat" "${DATA}/qr_acr_qsV2.dat"
+ ${NLN} "${FIXgfs}/am/CCN_ACTIVATE.BIN" "${DATA}/CCN_ACTIVATE.BIN"
+ ${NLN} "${FIXgfs}/am/freezeH2O.dat" "${DATA}/freezeH2O.dat"
+ ${NLN} "${FIXgfs}/am/qr_acr_qgV2.dat" "${DATA}/qr_acr_qgV2.dat"
+ ${NLN} "${FIXgfs}/am/qr_acr_qsV2.dat" "${DATA}/qr_acr_qsV2.dat"
fi
- ${NLN} "${FIXam}/${O3FORC}" "${DATA}/global_o3prdlos.f77"
- ${NLN} "${FIXam}/${H2OFORC}" "${DATA}/global_h2oprdlos.f77"
- ${NLN} "${FIXam}/global_solarconstant_noaa_an.txt" "${DATA}/solarconstant_noaa_an.txt"
- ${NLN} "${FIXam}/global_sfc_emissivity_idx.txt" "${DATA}/sfc_emissivity_idx.txt"
+ ${NLN} "${FIXgfs}/am/${O3FORC}" "${DATA}/global_o3prdlos.f77"
+ ${NLN} "${FIXgfs}/am/${H2OFORC}" "${DATA}/global_h2oprdlos.f77"
+ ${NLN} "${FIXgfs}/am/global_solarconstant_noaa_an.txt" "${DATA}/solarconstant_noaa_an.txt"
+ ${NLN} "${FIXgfs}/am/global_sfc_emissivity_idx.txt" "${DATA}/sfc_emissivity_idx.txt"
## merra2 aerosol climo
if [[ ${IAER} -eq "1011" ]]; then
for month in $(seq 1 12); do
MM=$(printf %02d "${month}")
- ${NLN} "${FIXaer}/merra2.aerclim.2003-2014.m${MM}.nc" "aeroclim.m${MM}.nc"
+ ${NLN} "${FIXgfs}/aer/merra2.aerclim.2003-2014.m${MM}.nc" "aeroclim.m${MM}.nc"
done
- ${NLN} "${FIXlut}/optics_BC.v1_3.dat" "${DATA}/optics_BC.dat"
- ${NLN} "${FIXlut}/optics_OC.v1_3.dat" "${DATA}/optics_OC.dat"
- ${NLN} "${FIXlut}/optics_DU.v15_3.dat" "${DATA}/optics_DU.dat"
- ${NLN} "${FIXlut}/optics_SS.v3_3.dat" "${DATA}/optics_SS.dat"
- ${NLN} "${FIXlut}/optics_SU.v1_3.dat" "${DATA}/optics_SU.dat"
+ ${NLN} "${FIXgfs}/lut/optics_BC.v1_3.dat" "${DATA}/optics_BC.dat"
+ ${NLN} "${FIXgfs}/lut/optics_OC.v1_3.dat" "${DATA}/optics_OC.dat"
+ ${NLN} "${FIXgfs}/lut/optics_DU.v15_3.dat" "${DATA}/optics_DU.dat"
+ ${NLN} "${FIXgfs}/lut/optics_SS.v3_3.dat" "${DATA}/optics_SS.dat"
+ ${NLN} "${FIXgfs}/lut/optics_SU.v1_3.dat" "${DATA}/optics_SU.dat"
fi
- ${NLN} "${FIXam}/global_co2historicaldata_glob.txt" "${DATA}/co2historicaldata_glob.txt"
- ${NLN} "${FIXam}/co2monthlycyc.txt" "${DATA}/co2monthlycyc.txt"
+ ${NLN} "${FIXgfs}/am/global_co2historicaldata_glob.txt" "${DATA}/co2historicaldata_glob.txt"
+ ${NLN} "${FIXgfs}/am/co2monthlycyc.txt" "${DATA}/co2monthlycyc.txt"
if [[ ${ICO2} -gt 0 ]]; then
- for file in $(ls "${FIXam}/fix_co2_proj/global_co2historicaldata"*) ; do
+ for file in $(ls "${FIXgfs}/am/fix_co2_proj/global_co2historicaldata"*) ; do
${NLN} "${file}" "${DATA}/$(basename "${file//global_}")"
done
fi
- ${NLN} "${FIXam}/global_climaeropac_global.txt" "${DATA}/aerosol.dat"
+ ${NLN} "${FIXgfs}/am/global_climaeropac_global.txt" "${DATA}/aerosol.dat"
if [[ ${IAER} -gt 0 ]] ; then
- for file in $(ls "${FIXam}/global_volcanic_aerosols"*) ; do
+ for file in $(ls "${FIXgfs}/am/global_volcanic_aerosols"*) ; do
${NLN} "${file}" "${DATA}/$(basename "${file//global_}")"
done
fi
# inline post fix files
if [[ ${WRITE_DOPOST} = ".true." ]]; then
- ${NLN} "${PARM_POST}/post_tag_gfs${LEVS}" "${DATA}/itag"
- ${NLN} "${FLTFILEGFS:-${PARM_POST}/postxconfig-NT-GFS-TWO.txt}" "${DATA}/postxconfig-NT.txt"
- ${NLN} "${FLTFILEGFSF00:-${PARM_POST}/postxconfig-NT-GFS-F00-TWO.txt}" "${DATA}/postxconfig-NT_FH00.txt"
- ${NLN} "${POSTGRB2TBL:-${PARM_POST}/params_grib2_tbl_new}" "${DATA}/params_grib2_tbl_new"
+ ${NLN} "${PARMgfs}/post/post_tag_gfs${LEVS}" "${DATA}/itag"
+ ${NLN} "${FLTFILEGFS:-${PARMgfs}/post/postxconfig-NT-GFS-TWO.txt}" "${DATA}/postxconfig-NT.txt"
+ ${NLN} "${FLTFILEGFSF00:-${PARMgfs}/post/postxconfig-NT-GFS-F00-TWO.txt}" "${DATA}/postxconfig-NT_FH00.txt"
+ ${NLN} "${POSTGRB2TBL:-${PARMgfs}/post/params_grib2_tbl_new}" "${DATA}/params_grib2_tbl_new"
fi
#------------------------------------------------------------------
@@ -296,28 +294,28 @@ EOF
LATB_JMO=${LATB_JMO:-${LATB_CASE}}
# Fix files
- FNGLAC=${FNGLAC:-"${FIXam}/global_glacier.2x2.grb"}
- FNMXIC=${FNMXIC:-"${FIXam}/global_maxice.2x2.grb"}
- FNTSFC=${FNTSFC:-"${FIXam}/RTGSST.1982.2012.monthly.clim.grb"}
- FNSNOC=${FNSNOC:-"${FIXam}/global_snoclim.1.875.grb"}
+ FNGLAC=${FNGLAC:-"${FIXgfs}/am/global_glacier.2x2.grb"}
+ FNMXIC=${FNMXIC:-"${FIXgfs}/am/global_maxice.2x2.grb"}
+ FNTSFC=${FNTSFC:-"${FIXgfs}/am/RTGSST.1982.2012.monthly.clim.grb"}
+ FNSNOC=${FNSNOC:-"${FIXgfs}/am/global_snoclim.1.875.grb"}
FNZORC=${FNZORC:-"igbp"}
- FNAISC=${FNAISC:-"${FIXam}/IMS-NIC.blended.ice.monthly.clim.grb"}
- FNALBC2=${FNALBC2:-"${FIXsfc}/${CASE}.mx${OCNRES}.facsf.tileX.nc"}
- FNTG3C=${FNTG3C:-"${FIXsfc}/${CASE}.mx${OCNRES}.substrate_temperature.tileX.nc"}
- FNVEGC=${FNVEGC:-"${FIXsfc}/${CASE}.mx${OCNRES}.vegetation_greenness.tileX.nc"}
- FNMSKH=${FNMSKH:-"${FIXam}/global_slmask.t1534.3072.1536.grb"}
- FNVMNC=${FNVMNC:-"${FIXsfc}/${CASE}.mx${OCNRES}.vegetation_greenness.tileX.nc"}
- FNVMXC=${FNVMXC:-"${FIXsfc}/${CASE}.mx${OCNRES}.vegetation_greenness.tileX.nc"}
- FNSLPC=${FNSLPC:-"${FIXsfc}/${CASE}.mx${OCNRES}.slope_type.tileX.nc"}
- FNALBC=${FNALBC:-"${FIXsfc}/${CASE}.mx${OCNRES}.snowfree_albedo.tileX.nc"}
- FNVETC=${FNVETC:-"${FIXsfc}/${CASE}.mx${OCNRES}.vegetation_type.tileX.nc"}
- FNSOTC=${FNSOTC:-"${FIXsfc}/${CASE}.mx${OCNRES}.soil_type.tileX.nc"}
- FNSOCC=${FNSOCC:-"${FIXsfc}/${CASE}.mx${OCNRES}.soil_color.tileX.nc"}
- FNABSC=${FNABSC:-"${FIXsfc}/${CASE}.mx${OCNRES}.maximum_snow_albedo.tileX.nc"}
- FNSMCC=${FNSMCC:-"${FIXam}/global_soilmgldas.statsgo.t${JCAP}.${LONB}.${LATB}.grb"}
+ 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"}
+ 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"}
+ 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)
- [[ ! -f ${FNSMCC} ]] && FNSMCC="${FIXam}/global_soilmgldas.statsgo.t1534.3072.1536.grb"
+ [[ ! -f ${FNSMCC} ]] && FNSMCC="${FIXgfs}/am/global_soilmgldas.statsgo.t1534.3072.1536.grb"
# NSST Options
# nstf_name contains the NSST related parameters
@@ -463,8 +461,6 @@ EOF
LONB_STP=${LONB_STP:-${LONB_CASE}}
LATB_STP=${LATB_STP:-${LATB_CASE}}
cd "${DATA}" || exit 1
- 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 [[ "${QUILTING}" = ".true." ]] && [[ "${OUTPUT_GRID}" = "gaussian_grid" ]]; then
for fhr in ${FV3_OUTPUT_FH}; do
local FH3=$(printf %03i "${fhr}")
@@ -503,7 +499,6 @@ FV3_out() {
# Copy FV3 restart files
if [[ ${RUN} =~ "gdas" ]]; then
cd "${DATA}/RESTART"
- mkdir -p "${COM_ATMOS_RESTART}"
local idate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${restart_interval} hours" +%Y%m%d%H)
while [[ ${idate} -le ${forecast_end_cycle} ]]; do
for file in "${idate:0:8}.${idate:8:2}0000."*; do
@@ -516,7 +511,7 @@ FV3_out() {
${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}/diag_table" "${COM_CONF}/ufs.diag_table"
fi
echo "SUB ${FUNCNAME[0]}: Output data for FV3 copied"
}
@@ -540,12 +535,11 @@ WW3_postdet() {
fi
- #if wave mesh is not the same as the ocn/ice mesh, linkk it in the file
- local comparemesh=${MESH_OCN_ICE:-"mesh.mx${ICERES}.nc"}
- if [[ "${MESH_WAV}" = "${comparemesh}" ]]; then
- echo "Wave is on same mesh as ocean/ice"
+ #if wave mesh is not the same as the ocean mesh, link it in the file
+ if [[ "${MESH_WAV}" == "${MESH_OCN:-mesh.mx${OCNRES}.nc}" ]]; then
+ echo "Wave is on same mesh as ocean"
else
- ${NLN} "${FIXwave}/${MESH_WAV}" "${DATA}/"
+ ${NLN} "${FIXgfs}/wave/${MESH_WAV}" "${DATA}/"
fi
export wavprfx=${RUNwave}${WAV_MEMBER:-}
@@ -605,8 +599,6 @@ WW3_postdet() {
${NLN} "${wavcurfile}" "${DATA}/current.${WAVECUR_FID}"
fi
- if [[ ! -d ${COM_WAVE_HISTORY} ]]; then mkdir -p "${COM_WAVE_HISTORY}"; fi
-
# Link output files
cd "${DATA}"
if [[ ${waveMULTIGRID} = ".true." ]]; then
@@ -651,8 +643,8 @@ WW3_nml() {
echo "SUB ${FUNCNAME[0]}: Copying input files for WW3"
WAV_MOD_TAG=${RUN}wave${waveMEMB}
if [[ "${USE_WAV_RMP:-YES}" = "YES" ]]; then
- if (( $( ls -1 "${FIXwave}/rmp_src_to_dst_conserv_"* 2> /dev/null | wc -l) > 0 )); then
- for file in $(ls "${FIXwave}/rmp_src_to_dst_conserv_"*) ; do
+ if (( $( ls -1 "${FIXgfs}/wave/rmp_src_to_dst_conserv_"* 2> /dev/null | wc -l) > 0 )); then
+ for file in $(ls "${FIXgfs}/wave/rmp_src_to_dst_conserv_"*) ; do
${NLN} "${file}" "${DATA}/"
done
else
@@ -683,6 +675,7 @@ MOM6_postdet() {
${NLN} "${COM_OCEAN_RESTART_PREV}/${sPDY}.${scyc}0000.MOM.res.nc" "${DATA}/INPUT/MOM.res.nc"
case ${OCNRES} in
"025")
+ local nn
for nn in $(seq 1 4); do
if [[ -f "${COM_OCEAN_RESTART_PREV}/${sPDY}.${scyc}0000.MOM.res_${nn}.nc" ]]; then
${NLN} "${COM_OCEAN_RESTART_PREV}/${sPDY}.${scyc}0000.MOM.res_${nn}.nc" "${DATA}/INPUT/MOM.res_${nn}.nc"
@@ -701,10 +694,10 @@ MOM6_postdet() {
fi
# Copy MOM6 fixed files
- ${NCP} "${FIXmom}/${OCNRES}/"* "${DATA}/INPUT/"
+ ${NCP} "${FIXgfs}/mom6/${OCNRES}/"* "${DATA}/INPUT/" # TODO: These need to be explicit
# Copy coupled grid_spec
- spec_file="${FIXcpl}/a${CASE}o${OCNRES}/grid_spec.nc"
+ spec_file="${FIXgfs}/cpl/a${CASE}o${OCNRES}/grid_spec.nc"
if [[ -s ${spec_file} ]]; then
${NCP} "${spec_file}" "${DATA}/INPUT/"
else
@@ -712,27 +705,6 @@ MOM6_postdet() {
exit 3
fi
- # Copy mediator restart files to RUNDIR # TODO: mediator should have its own CMEPS_postdet() function
- if [[ ${warm_start} = ".true." ]]; then
- local mediator_file="${COM_MED_RESTART}/${PDY}.${cyc}0000.ufs.cpld.cpl.r.nc"
- if [[ -f "${mediator_file}" ]]; then
- ${NCP} "${mediator_file}" "${DATA}/ufs.cpld.cpl.r.nc"
- rm -f "${DATA}/rpointer.cpl"
- touch "${DATA}/rpointer.cpl"
- echo "ufs.cpld.cpl.r.nc" >> "${DATA}/rpointer.cpl"
- else
- # We have a choice to make here.
- # Either we can FATAL ERROR out, or we can let the coupling fields initialize from zero
- # cmeps_run_type is determined based on the availability of the mediator restart file
- echo "WARNING: ${mediator_file} does not exist for warm_start = .true., initializing!"
- #echo "FATAL ERROR: ${mediator_file} must exist for warm_start = .true. and does not, ABORT!"
- #exit 4
- fi
- else
- # This is a cold start, so initialize the coupling fields from zero
- export cmeps_run_type="startup"
- fi
-
# If using stochatic parameterizations, create a seed that does not exceed the
# largest signed integer
if [[ "${DO_OCN_SPPT}" = "YES" ]] || [[ "${DO_OCN_PERT_EPBL}" = "YES" ]]; then
@@ -744,58 +716,53 @@ MOM6_postdet() {
fi
fi
- # Create COMOUTocean
- [[ ! -d ${COM_OCEAN_HISTORY} ]] && mkdir -p "${COM_OCEAN_HISTORY}"
-
# Link output files
if [[ "${RUN}" =~ "gfs" || "${RUN}" =~ "gefs" ]]; then
- # Link output files for RUN = gfs
-
- # TODO: get requirements on what files need to be written out and what these dates here are and what they mean
+ # Link output files for RUN = gfs|gefs
- if [[ ! -d ${COM_OCEAN_HISTORY} ]]; then mkdir -p "${COM_OCEAN_HISTORY}"; fi
+ # Looping over MOM6 output hours
+ local fhr fhr3 last_fhr interval midpoint vdate vdate_mid source_file dest_file
+ for fhr in ${MOM6_OUTPUT_FH}; do
+ fhr3=$(printf %03i "${fhr}")
- # Looping over FV3 output hours
- # TODO: Need to define MOM6_OUTPUT_FH and control at some point for issue #1629
- for fhr in ${FV3_OUTPUT_FH}; do
if [[ -z ${last_fhr:-} ]]; then
- local last_fhr=${fhr}
+ last_fhr=${fhr}
continue
fi
+
(( interval = fhr - last_fhr ))
(( midpoint = last_fhr + interval/2 ))
- local vdate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${fhr} hours" +%Y%m%d%H)
- local vdate_mid=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${midpoint} hours" +%Y%m%d%H)
-
+ vdate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${fhr} hours" +%Y%m%d%H)
+ vdate_mid=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${midpoint} hours" +%Y%m%d%H)
# Native model output uses window midpoint in the filename, but we are mapping that to the end of the period for COM
- local source_file="ocn_${vdate_mid:0:4}_${vdate_mid:4:2}_${vdate_mid:6:2}_${vdate_mid:8:2}.nc"
- local dest_file="ocn${vdate}.${ENSMEM}.${current_cycle}.nc"
+ 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}/${source_file}"
- local source_file="ocn_daily_${vdate:0:4}_${vdate:4:2}_${vdate:6:2}.nc"
- local dest_file=${source_file}
- if [[ ! -a "${DATA}/${source_file}" ]]; then
+ # 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}/${source_file}"
fi
- local last_fhr=${fhr}
+ last_fhr=${fhr}
+
done
elif [[ "${RUN}" =~ "gdas" ]]; then
# Link output files for RUN = gdas
- # Save MOM6 backgrounds
- for fhr in ${FV3_OUTPUT_FH}; do
- local idatestr=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${fhr} hours" +%Y_%m_%d_%H)
+ # Save (instantaneous) MOM6 backgrounds
+ for fhr in ${MOM6_OUTPUT_FH}; do
local fhr3=$(printf %03i "${fhr}")
- ${NLN} "${COM_OCEAN_HISTORY}/${RUN}.t${cyc}z.ocnf${fhr3}.nc" "${DATA}/ocn_da_${idatestr}.nc"
+ local 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}/ocn_da_${vdatestr}.nc"
done
fi
- mkdir -p "${COM_OCEAN_RESTART}"
-
# Link ocean restarts from DATA to COM
# Coarser than 1/2 degree has a single MOM restart
${NLN} "${COM_OCEAN_RESTART}/${forecast_end_cycle:0:8}.${forecast_end_cycle:8:2}0000.MOM.res.nc" "${DATA}/MOM6_RESTART/"
@@ -810,10 +777,16 @@ MOM6_postdet() {
;;
esac
- # Loop over restart_interval frequency and link restarts from DATA to COM
- local idate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${restart_interval} hours" +%Y%m%d%H)
- while [[ ${idate} -lt ${forecast_end_cycle} ]]; do
- local idatestr=$(date +%Y-%m-%d-%H -d "${idate:0:8} ${idate:8:2}")
+ if [[ "${RUN}" =~ "gdas" ]]; then
+ local interval idate
+ if [[ "${DOIAU}" = "YES" ]]; then
+ # Link restarts at the beginning of the next cycle from DATA to COM
+ interval=$(( assim_freq / 2 ))
+ idate=$(date --utc -d "${next_cycle:0:8} ${next_cycle:8:2} - ${interval} hours" +%Y%m%d%H)
+ else
+ # Link restarts at the middle of the next cycle from DATA to COM
+ idate="${next_cycle}"
+ fi
${NLN} "${COM_OCEAN_RESTART}/${idate:0:8}.${idate:8:2}0000.MOM.res.nc" "${DATA}/MOM6_RESTART/"
case ${OCNRES} in
"025")
@@ -822,23 +795,7 @@ MOM6_postdet() {
done
;;
esac
- local idate=$(date --utc -d "${idate:0:8} ${idate:8:2} + ${restart_interval} hours" +%Y%m%d%H)
- done
-
- # TODO: mediator should have its own CMEPS_postdet() function
- # Link mediator restarts from DATA to COM
- # DANGER DANGER DANGER - Linking mediator restarts to COM causes the model to fail with a message like this below:
- # Abort with message NetCDF: File exists && NC_NOCLOBBER in file pio-2.5.7/src/clib/pioc_support.c at line 2173
- # Instead of linking, copy the mediator files after the model finishes
- #local COMOUTmed="${ROTDIR}/${RUN}.${PDY}/${cyc}/med"
- #mkdir -p "${COMOUTmed}/RESTART"
- #local idate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${restart_interval} hours" +%Y%m%d%H)
- #while [[ ${idate} -le ${forecast_end_cycle} ]]; do
- # local seconds=$(to_seconds ${idate:8:2}0000) # use function to_seconds from forecast_predet.sh to convert HHMMSS to seconds
- # local idatestr="${idate:0:4}-${idate:4:2}-${idate:6:2}-${seconds}"
- # ${NLN} "${COMOUTmed}/RESTART/${idate:0:8}.${idate:8:2}0000.ufs.cpld.cpl.r.nc" "${DATA}/RESTART/ufs.cpld.cpl.r.${idatestr}.nc"
- # local idate=$(date --utc -d "${idate:0:8} ${idate:8:2} + ${restart_interval} hours" +%Y%m%d%H)
- #done
+ fi
echo "SUB ${FUNCNAME[0]}: MOM6 input data linked/copied"
@@ -854,56 +811,13 @@ 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)
- if [[ ! -d ${COM_OCEAN_INPUT} ]]; then mkdir -p "${COM_OCEAN_INPUT}"; fi
${NCP} "${DATA}/INPUT/MOM_input" "${COM_CONF}/ufs.MOM_input"
- # TODO: mediator should have its own CMEPS_out() function
- # Copy mediator restarts from DATA to COM
- # Linking mediator restarts to COM causes the model to fail with a message.
- # See MOM6_postdet() function for error message
- mkdir -p "${COM_MED_RESTART}"
- local idate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${restart_interval} hours" +%Y%m%d%H)
- while [[ ${idate} -le ${forecast_end_cycle} ]]; do
- local seconds=$(to_seconds "${idate:8:2}"0000) # use function to_seconds from forecast_predet.sh to convert HHMMSS to seconds
- local idatestr="${idate:0:4}-${idate:4:2}-${idate:6:2}-${seconds}"
- local mediator_file="${DATA}/RESTART/ufs.cpld.cpl.r.${idatestr}.nc"
- if [[ -f ${mediator_file} ]]; then
- ${NCP} "${DATA}/RESTART/ufs.cpld.cpl.r.${idatestr}.nc" "${COM_MED_RESTART}/${idate:0:8}.${idate:8:2}0000.ufs.cpld.cpl.r.nc"
- else
- echo "Mediator restart ${mediator_file} not found."
- fi
- local idate=$(date --utc -d "${idate:0:8} ${idate:8:2} + ${restart_interval} hours" +%Y%m%d%H)
- done
}
CICE_postdet() {
echo "SUB ${FUNCNAME[0]}: CICE after run type determination"
- # TODO: These settings should be elevated to config.ice
- histfreq_n=${histfreq_n:-6}
- dumpfreq_n=${dumpfreq_n:-1000} # Set this to a really large value, as cice, mom6 and cmeps restart interval is controlled by ufs.configure
- dumpfreq=${dumpfreq:-"y"} # "h","d","m" or "y" for restarts at intervals of "hours", "days", "months" or "years"
-
- if [[ "${RUN}" =~ "gdas" ]]; then
- cice_hist_avg=".false., .false., .false., .false., .false." # DA needs instantaneous
- else
- cice_hist_avg=".true., .true., .true., .true., .true." # P8 wants averaged over histfreq_n
- fi
-
- FRAZIL_FWSALT=${FRAZIL_FWSALT:-".true."}
- ktherm=${ktherm:-2}
- tfrz_option=${tfrz_option:-"'mushy'"}
- tr_pond_lvl=${tr_pond_lvl:-".true."} # Use level melt ponds tr_pond_lvl=true
-
- # restart_pond_lvl (if tr_pond_lvl=true):
- # -- if true, initialize the level ponds from restart (if runtype=continue)
- # -- if false, re-initialize level ponds to zero (if runtype=initial or continue)
- restart_pond_lvl=${restart_pond_lvl:-".false."}
-
- ice_grid_file=${ice_grid_file:-"grid_cice_NEMS_mx${ICERES}.nc"}
- ice_kmt_file=${ice_kmt_file:-"kmtu_cice_NEMS_mx${ICERES}.nc"}
- export MESH_OCN_ICE=${MESH_OCN_ICE:-"mesh.mx${ICERES}.nc"}
-
# Copy CICE ICs
echo "Link CICE ICs"
cice_restart_file="${COM_ICE_RESTART_PREV}/${sPDY}.${scyc}0000.cice_model.res.nc"
@@ -917,58 +831,44 @@ CICE_postdet() {
echo "${DATA}/cice_model.res.nc" > "${DATA}/ice.restart_file"
echo "Link CICE fixed files"
- ${NLN} "${FIXcice}/${ICERES}/${ice_grid_file}" "${DATA}/"
- ${NLN} "${FIXcice}/${ICERES}/${ice_kmt_file}" "${DATA}/"
- ${NLN} "${FIXcice}/${ICERES}/${MESH_OCN_ICE}" "${DATA}/"
-
- # Link CICE output files
- if [[ ! -d "${COM_ICE_HISTORY}" ]]; then mkdir -p "${COM_ICE_HISTORY}"; fi
- mkdir -p "${COM_ICE_RESTART}"
-
- if [[ "${RUN}" =~ "gfs" || "${RUN}" =~ "gefs" ]]; then
- # Link output files for RUN = gfs
-
- # TODO: make these forecast output files consistent w/ GFS output
- # TODO: Work w/ NB to determine appropriate naming convention for these files
-
- # TODO: consult w/ NB on how to improve on this. Gather requirements and more information on what these files are and how they are used to properly catalog them
- local vdate seconds vdatestr fhr last_fhr
- for fhr in ${FV3_OUTPUT_FH}; do
- vdate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${fhr} hours" +%Y%m%d%H)
- seconds=$(to_seconds "${vdate:8:2}0000") # convert HHMMSS to seconds
- vdatestr="${vdate:0:4}-${vdate:4:2}-${vdate:6:2}-${seconds}"
-
- if [[ 10#${fhr} -eq 0 ]]; then
- ${NLN} "${COM_ICE_HISTORY}/iceic${vdate}.${ENSMEM}.${current_cycle}.nc" "${DATA}/CICE_OUTPUT/iceh_ic.${vdatestr}.nc"
- else
- (( interval = fhr - last_fhr )) # Umm.. isn't this histfreq_n?
- ${NLN} "${COM_ICE_HISTORY}/ice${vdate}.${ENSMEM}.${current_cycle}.nc" "${DATA}/CICE_OUTPUT/iceh_$(printf "%0.2d" "${interval}")h.${vdatestr}.nc"
- fi
+ ${NLN} "${FIXgfs}/cice/${ICERES}/${CICE_GRID}" "${DATA}/"
+ ${NLN} "${FIXgfs}/cice/${ICERES}/${CICE_MASK}" "${DATA}/"
+ ${NLN} "${FIXgfs}/cice/${ICERES}/${MESH_ICE}" "${DATA}/"
+
+ # Link iceh_ic file to COM. This is the initial condition file from CICE (f000)
+ # TODO: Is this file needed in COM? Is this going to be used for generating any products?
+ local vdate seconds vdatestr fhr fhr3 interval last_fhr
+ seconds=$(to_seconds "${current_cycle:8:2}0000") # convert HHMMSS to seconds
+ vdatestr="${current_cycle:0:4}-${current_cycle:4:2}-${current_cycle:6:2}-${seconds}"
+ ${NLN} "${COM_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
+ for fhr in ${CICE_OUTPUT_FH}; do
+ fhr3=$(printf %03i "${fhr}")
+
+ if [[ -z ${last_fhr:-} ]]; then
last_fhr=${fhr}
- done
+ continue
+ fi
- elif [[ "${RUN}" =~ "gdas" ]]; then
+ (( interval = fhr - last_fhr ))
- # Link CICE generated initial condition file from DATA/CICE_OUTPUT to COMOUTice
- # This can be thought of as the f000 output from the CICE model
- local seconds vdatestr
- seconds=$(to_seconds "${current_cycle:8:2}0000") # convert HHMMSS to seconds
- vdatestr="${current_cycle:0:4}-${current_cycle:4:2}-${current_cycle:6:2}-${seconds}"
- ${NLN} "${COM_ICE_HISTORY}/${RUN}.t${cyc}z.iceic.nc" "${DATA}/CICE_OUTPUT/iceh_ic.${vdatestr}.nc"
-
- # Link instantaneous CICE forecast output files from DATA/CICE_OUTPUT to COMOUTice
- local vdate vdatestr seconds fhr fhr3
- fhr="${FHOUT}"
- while [[ "${fhr}" -le "${FHMAX}" ]]; do
- vdate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${fhr} hours" +%Y%m%d%H)
- seconds=$(to_seconds "${vdate:8:2}0000") # convert HHMMSS to seconds
- vdatestr="${vdate:0:4}-${vdate:4:2}-${vdate:6:2}-${seconds}"
- fhr3=$(printf %03i "${fhr}")
- ${NLN} "${COM_ICE_HISTORY}/${RUN}.t${cyc}z.icef${fhr3}.nc" "${DATA}/CICE_OUTPUT/iceh_inst.${vdatestr}.nc"
- fhr=$((fhr + FHOUT))
- done
+ vdate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${fhr} hours" +%Y%m%d%H)
+ seconds=$(to_seconds "${vdate:8:2}0000") # convert HHMMSS to seconds
+ vdatestr="${vdate:0:4}-${vdate:4:2}-${vdate:6:2}-${seconds}"
- fi
+ if [[ "${RUN}" =~ "gfs" || "${RUN}" =~ "gefs" ]]; then
+ source_file="iceh_$(printf "%0.2d" "${interval}")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"
+ dest_file="${RUN}.ice.t${cyc}z.inst.f${fhr3}.nc"
+ fi
+ ${NLN} "${COM_ICE_HISTORY}/${dest_file}" "${DATA}/CICE_OUTPUT/${source_file}"
+
+ last_fhr=${fhr}
+ done
# Link CICE restarts from CICE_RESTART to COMOUTice/RESTART
# Loop over restart_interval and link restarts from DATA to COM
@@ -992,7 +892,6 @@ 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)
- if [[ ! -d "${COM_ICE_INPUT}" ]]; then mkdir -p "${COM_ICE_INPUT}"; fi
${NCP} "${DATA}/ice_in" "${COM_CONF}/ufs.ice_in"
}
@@ -1030,8 +929,6 @@ GOCART_rc() {
GOCART_postdet() {
echo "SUB ${FUNCNAME[0]}: Linking output data for GOCART"
- if [[ ! -d "${COM_CHEM_HISTORY}" ]]; then mkdir -p "${COM_CHEM_HISTORY}"; fi
-
for fhr in ${FV3_OUTPUT_FH}; do
local vdate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${fhr} hours" +%Y%m%d%H)
@@ -1059,6 +956,56 @@ GOCART_out() {
${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"
done
+}
+
+CMEPS_postdet() {
+ echo "SUB ${FUNCNAME[0]}: Linking output data for CMEPS mediator"
+ # Copy mediator restart files to RUNDIR
+ if [[ "${warm_start}" = ".true." ]]; then
+ local mediator_file="${COM_MED_RESTART}/${PDY}.${cyc}0000.ufs.cpld.cpl.r.nc"
+ if [[ -f "${mediator_file}" ]]; then
+ ${NCP} "${mediator_file}" "${DATA}/ufs.cpld.cpl.r.nc"
+ rm -f "${DATA}/rpointer.cpl"
+ touch "${DATA}/rpointer.cpl"
+ echo "ufs.cpld.cpl.r.nc" >> "${DATA}/rpointer.cpl"
+ else
+ # We have a choice to make here.
+ # Either we can FATAL ERROR out, or we can let the coupling fields initialize from zero
+ # cmeps_run_type is determined based on the availability of the mediator restart file
+ echo "WARNING: ${mediator_file} does not exist for warm_start = .true., initializing!"
+ #echo "FATAL ERROR: ${mediator_file} must exist for warm_start = .true. and does not, ABORT!"
+ #exit 4
+ fi
+ fi
+
+ # Link mediator restarts from DATA to COM
+ # DANGER DANGER DANGER - Linking mediator restarts to COM causes the model to fail with a message like this below:
+ # Abort with message NetCDF: File exists && NC_NOCLOBBER in file pio-2.5.7/src/clib/pioc_support.c at line 2173
+ # Instead of linking, copy the mediator files after the model finishes. See CMEPS_out() below.
+ #local rdate rdatestr seconds mediator_file
+ #rdate=${forecast_end_cycle}
+ #seconds=$(to_seconds "${rdate:8:2}"0000) # use function to_seconds from forecast_predet.sh to convert HHMMSS to seconds
+ #rdatestr="${rdate:0:4}-${rdate:4:2}-${rdate:6:2}-${seconds}"
+ #${NLN} "${COM_MED_RESTART}/${rdate:0:8}.${rdate:8:2}0000.ufs.cpld.cpl.r.nc" "${DATA}/CMEPS_RESTART/ufs.cpld.cpl.r.${rdatestr}.nc"
+
+}
+
+CMEPS_out() {
+ echo "SUB ${FUNCNAME[0]}: Copying output data for CMEPS mediator"
+
+ # Linking mediator restarts to COM causes the model to fail with a message.
+ # Abort with message NetCDF: File exists && NC_NOCLOBBER in file pio-2.5.7/src/clib/pioc_support.c at line 2173
+ # Copy mediator restarts from DATA to COM
+ local rdate rdatestr seconds mediator_file
+ rdate=${forecast_end_cycle}
+ seconds=$(to_seconds "${rdate:8:2}"0000) # use function to_seconds from forecast_predet.sh to convert HHMMSS to seconds
+ rdatestr="${rdate:0:4}-${rdate:4:2}-${rdate:6:2}-${seconds}"
+ mediator_file="${DATA}/CMEPS_RESTART/ufs.cpld.cpl.r.${rdatestr}.nc"
+ if [[ -f ${mediator_file} ]]; then
+ ${NCP} "${mediator_file}" "${COM_MED_RESTART}/${rdate:0:8}.${rdate:8:2}0000.ufs.cpld.cpl.r.nc"
+ else
+ echo "Mediator restart ${mediator_file} not found."
+ fi
}
diff --git a/ush/forecast_predet.sh b/ush/forecast_predet.sh
index 9bb565919a..ab02270b46 100755
--- a/ush/forecast_predet.sh
+++ b/ush/forecast_predet.sh
@@ -8,9 +8,6 @@
## This script is a definition of functions.
#####
-# For all non-evironment variables
-# Cycling and forecast hour specific parameters
-
to_seconds() {
# Function to convert HHMMSS to seconds since 00Z
local hhmmss=${1:?}
@@ -50,21 +47,12 @@ common_predet(){
# shellcheck disable=SC2034
pwd=$(pwd)
CDUMP=${CDUMP:-gdas}
- CASE=${CASE:-C768}
- CDATE=${CDATE:-2017032500}
+ CASE=${CASE:-C96}
+ CDATE=${CDATE:-"${PDY}${cyc}"}
ENSMEM=${ENSMEM:-000}
- FCSTEXECDIR=${FCSTEXECDIR:-${HOMEgfs}/exec}
- FCSTEXEC=${FCSTEXEC:-ufs_model.x}
-
- # Directories.
- FIXgfs=${FIXgfs:-${HOMEgfs}/fix}
-
- # Model specific stuff
- PARM_POST=${PARM_POST:-${HOMEgfs}/parm/post}
-
# Define significant cycles
- current_cycle=${CDATE}
+ current_cycle="${PDY}${cyc}"
previous_cycle=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} - ${assim_freq} hours" +%Y%m%d%H)
# ignore errors that variable isn't used
# shellcheck disable=SC2034
@@ -88,23 +76,28 @@ common_predet(){
tcyc=${scyc}
fi
- mkdir -p "${COM_CONF}"
+ FHMIN=${FHMIN:-0}
+ FHMAX=${FHMAX:-9}
+ FHOUT=${FHOUT:-3}
+ FHMAX_HF=${FHMAX_HF:-0}
+ FHOUT_HF=${FHOUT_HF:-1}
+
+ # Several model components share DATA/INPUT for input data
+ if [[ ! -d "${DATA}/INPUT" ]]; then mkdir -p "${DATA}/INPUT"; fi
+
+ if [[ ! -d "${COM_CONF}" ]]; then mkdir -p "${COM_CONF}"; fi
cd "${DATA}" || ( echo "FATAL ERROR: Unable to 'cd ${DATA}', ABORT!"; exit 8 )
}
FV3_predet(){
echo "SUB ${FUNCNAME[0]}: Defining variables for FV3"
- FHMIN=${FHMIN:-0}
- FHMAX=${FHMAX:-9}
- FHOUT=${FHOUT:-3}
+
+ 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
+
FHZER=${FHZER:-6}
FHCYC=${FHCYC:-24}
- FHMAX_HF=${FHMAX_HF:-0}
- FHOUT_HF=${FHOUT_HF:-1}
- NSOUT=${NSOUT:-"-1"}
- FDIAG=${FHOUT}
- if (( FHMAX_HF > 0 && FHOUT_HF > 0 )); then FDIAG=${FHOUT_HF}; fi
- WRITE_DOPOST=${WRITE_DOPOST:-".false."}
restart_interval=${restart_interval:-${FHMAX}}
# restart_interval = 0 implies write restart at the END of the forecast i.e. at FHMAX
if [[ ${restart_interval} -eq 0 ]]; then
@@ -112,30 +105,20 @@ FV3_predet(){
fi
# Convert output settings into an explicit list for FV3
- # NOTE: FV3_OUTPUT_FH is also currently used in other components
- # TODO: Have a seperate control for other components to address issue #1629
+ # Ignore "not used" warning
+ # shellcheck disable=SC2034
FV3_OUTPUT_FH=""
local fhr=${FHMIN}
if (( FHOUT_HF > 0 && FHMAX_HF > 0 )); then
- for (( fh = FHMIN; fh < FHMAX_HF; fh = fh + FHOUT_HF )); do
- FV3_OUTPUT_FH="${FV3_OUTPUT_FH} ${fh}"
- done
+ FV3_OUTPUT_FH="${FV3_OUTPUT_FH} $(seq -s ' ' "${FHMIN}" "${FHOUT_HF}" "${FHMAX_HF}")"
fhr=${FHMAX_HF}
fi
- for (( fh = fhr; fh <= FHMAX; fh = fh + FHOUT )); do
- FV3_OUTPUT_FH="${FV3_OUTPUT_FH} ${fh}"
- done
-
-
- # Model resolution specific parameters
- DELTIM=${DELTIM:-225}
- layout_x=${layout_x:-8}
- layout_y=${layout_y:-16}
- LEVS=${LEVS:-65}
+ FV3_OUTPUT_FH="${FV3_OUTPUT_FH} $(seq -s ' ' "${fhr}" "${FHOUT}" "${FHMAX}")"
# Other options
- MEMBER=${MEMBER:-"-1"} # -1: control, 0: ensemble mean, >0: ensemble member $MEMBER
- ENS_NUM=${ENS_NUM:-1} # Single executable runs multiple members (e.g. GEFS)
+ # ignore errors that variable isn't used
+ # shellcheck disable=SC2034
+ MEMBER=$(( 10#${ENSMEM:-"-1"} )) # -1: control, 0: ensemble mean, >0: ensemble member $MEMBER
PREFIX_ATMINC=${PREFIX_ATMINC:-""} # allow ensemble to use recentered increment
# IAU options
@@ -145,18 +128,8 @@ FV3_predet(){
# Model config options
ntiles=6
- TYPE=${TYPE:-"nh"} # choices: nh, hydro
- MONO=${MONO:-"non-mono"} # choices: mono, non-mono
-
- QUILTING=${QUILTING:-".true."}
- OUTPUT_GRID=${OUTPUT_GRID:-"gaussian_grid"}
- WRITE_NEMSIOFLIP=${WRITE_NEMSIOFLIP:-".true."}
- WRITE_FSYNCFLAG=${WRITE_FSYNCFLAG:-".true."}
-
rCDUMP=${rCDUMP:-${CDUMP}}
- mkdir -p "${DATA}/INPUT"
-
#------------------------------------------------------------------
# changeable parameters
# dycore definitions
@@ -214,8 +187,7 @@ FV3_predet(){
print_freq=${print_freq:-6}
#-------------------------------------------------------
- if [[ ${RUN} =~ "gfs" || ${RUN} = "gefs" ]]; then
- if [[ ! -d ${COM_ATMOS_RESTART} ]]; then mkdir -p "${COM_ATMOS_RESTART}" ; fi
+ if [[ "${RUN}" =~ "gfs" || "${RUN}" = "gefs" ]]; then
${NLN} "${COM_ATMOS_RESTART}" RESTART
# The final restart written at the end doesn't include the valid date
# Create links that keep the same name pattern for these files
@@ -229,26 +201,68 @@ FV3_predet(){
${NLN} "${file}" "${COM_ATMOS_RESTART}/${forecast_end_cycle:0:8}.${forecast_end_cycle:8:2}0000.${file}"
done
else
- mkdir -p "${DATA}/RESTART"
+ if [[ ! -d "${DATA}/RESTART" ]]; then mkdir -p "${DATA}/RESTART"; fi
fi
- echo "SUB ${FUNCNAME[0]}: pre-determination variables set"
}
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
+
${NLN} "${COM_WAVE_RESTART}" "restart_wave"
}
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 "${DATA}/CICE_OUTPUT" ]]; then mkdir -p "${DATA}/CICE_OUTPUT"; fi
if [[ ! -d "${DATA}/CICE_RESTART" ]]; then mkdir -p "${DATA}/CICE_RESTART"; fi
+
+ # CICE does not have a concept of high frequency output like FV3
+ # Convert output settings into an explicit list for CICE
+ # Ignore "not used" warning
+ # shellcheck disable=SC2034
+ CICE_OUTPUT_FH=$(seq -s ' ' "${FHMIN}" "${FHOUT_OCNICE}" "${FHMAX}")
+
}
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 "${DATA}/MOM6_OUTPUT" ]]; then mkdir -p "${DATA}/MOM6_OUTPUT"; fi
if [[ ! -d "${DATA}/MOM6_RESTART" ]]; then mkdir -p "${DATA}/MOM6_RESTART"; fi
+
+ # MOM6 does not have a concept of high frequency output like FV3
+ # Convert output settings into an explicit list for MOM6
+ # Ignore "not used" warning
+ # shellcheck disable=SC2034
+ MOM6_OUTPUT_FH=$(seq -s ' ' "${FHMIN}" "${FHOUT_OCNICE}" "${FHMAX}")
+
+}
+
+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 "${DATA}/CMEPS_RESTART" ]]; then mkdir -p "${DATA}/CMEPS_RESTART"; fi
+
+}
+
+GOCART_predet(){
+ echo "SUB ${FUNCNAME[0]}: GOCART before run type determination"
+
+ if [[ ! -d "${COM_CHEM_HISTORY}" ]]; then mkdir -p "${COM_CHEM_HISTORY}"; fi
+
}
diff --git a/ush/fv3gfs_remap.sh b/ush/fv3gfs_remap.sh
index 7986add331..eaf2c64a01 100755
--- a/ush/fv3gfs_remap.sh
+++ b/ush/fv3gfs_remap.sh
@@ -14,8 +14,6 @@ export GG=${master_grid:-"0p25deg"} # 1deg 0p5deg 0p25deg 0p125deg
pwd=$(pwd)
export DATA=${DATA:-$pwd}
export HOMEgfs=${HOMEgfs:-$PACKAGEROOT}
-export FIXgfs=${FIXgfs:-$HOMEgfs/fix}
-export FIXorog=${FIXorog:-$FIXgfs/orog}
export REMAPEXE=${REMAPEXE:-$HOMEgfs/exec/fregrid_parallel}
export IPD4=${IPD4:-"YES"}
@@ -25,8 +23,8 @@ export CDUMP=${CDUMP:-gfs}
export PREFIX=${PREFIX:-${CDUMP}${TCYC}}
#--------------------------------------------------
-export grid_loc=${FIXorog}/${CASE}/${CASE}_mosaic.nc
-export weight_file=${FIXorog}/${CASE}/remap_weights_${CASE}_${GG}.nc
+export grid_loc=${FIXgfs}/orog/${CASE}/${CASE}_mosaic.nc
+export weight_file=${FIXgfs}/orog/${CASE}/remap_weights_${CASE}_${GG}.nc
export APRUN_REMAP=${APRUN_REMAP:-${APRUN:-""}}
export NTHREADS_REMAP=${NTHREADS_REMAP:-${NTHREADS:-1}}
diff --git a/ush/gaussian_sfcanl.sh b/ush/gaussian_sfcanl.sh
index 1a0441a06f..79b2cb5b7d 100755
--- a/ush/gaussian_sfcanl.sh
+++ b/ush/gaussian_sfcanl.sh
@@ -27,10 +27,6 @@
# Default is /nwprod2.
# HOMEgfs Directory for gfs version. Default is
# $BASEDIR/gfs_ver.v15.0.0}
-# FIXam Directory for the global fixed climatology files.
-# Defaults to $HOMEgfs/fix/am
-# FIXorog Directory for the model grid and orography netcdf
-# files. Defaults to $HOMEgfs/fix/orog
# FIXWGTS Weight file to use for interpolation
# EXECgfs Directory of the program executable. Defaults to
# $HOMEgfs/exec
@@ -83,9 +79,9 @@
#
# programs : $GAUSFCANLEXE
#
-# fixed data : ${FIXorog}/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile*.nc
+# fixed data : ${FIXgfs}/orog/${CASE}/${CASE}.mx${OCNRES}_oro_data.tile*.nc
# ${FIXWGTS}
-# ${FIXam}/global_hyblev.l65.txt
+# ${FIXgfs}/am/global_hyblev.l65.txt
#
# input data : ${COM_ATMOS_RESTART}/${PDY}.${cyc}0000.sfcanl_data.tile*.nc
#
@@ -126,15 +122,13 @@ gfs_ver=${gfs_ver:-v16.3.0}
BASEDIR=${BASEDIR:-${PACKAGEROOT:-/lfs/h1/ops/prod/packages}}
HOMEgfs=${HOMEgfs:-$BASEDIR/gfs.${gfs_ver}}
EXECgfs=${EXECgfs:-$HOMEgfs/exec}
-FIXorog=${FIXorog:-$HOMEgfs/fix/orog}
-FIXam=${FIXam:-$HOMEgfs/fix/am}
-FIXWGTS=${FIXWGTS:-$FIXorog/$CASE/fv3_SCRIP_${CASE}_GRIDSPEC_lon${LONB_SFC}_lat${LATB_SFC}.gaussian.neareststod.nc}
+FIXWGTS=${FIXWGTS:-${FIXgfs}/orog/${CASE}/fv3_SCRIP_${CASE}_GRIDSPEC_lon${LONB_SFC}_lat${LATB_SFC}.gaussian.neareststod.nc}
DATA=${DATA:-$(pwd)}
# Filenames.
XC=${XC:-}
GAUSFCANLEXE=${GAUSFCANLEXE:-$EXECgfs/gaussian_sfcanl.x}
-SIGLEVEL=${SIGLEVEL:-$FIXam/global_hyblev.l${LEVSP1}.txt}
+SIGLEVEL=${SIGLEVEL:-${FIXgfs}/am/global_hyblev.l${LEVSP1}.txt}
CDATE=${CDATE:?}
@@ -187,12 +181,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} "${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} "${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} "${SIGLEVEL}" "./vcoord.txt"
diff --git a/ush/gfs_sndp.sh b/ush/gfs_sndp.sh
index 99c5c68fa3..e07b3eb42c 100755
--- a/ush/gfs_sndp.sh
+++ b/ush/gfs_sndp.sh
@@ -16,7 +16,7 @@ source "$HOMEgfs/ush/preamble.sh"
export m=$1
mkdir $DATA/$m
cd $DATA/$m
- cp $FIXbufrsnd/gfs_collective${m}.list $DATA/$m/.
+ cp ${HOMEgfs}/fix/product/gfs_collective${m}.list $DATA/$m/.
CCCC=KWBC
file_list=gfs_collective${m}.list
diff --git a/ush/gfs_truncate_enkf.sh b/ush/gfs_truncate_enkf.sh
index 0a7d6fc0dd..8aa47e26e2 100755
--- a/ush/gfs_truncate_enkf.sh
+++ b/ush/gfs_truncate_enkf.sh
@@ -14,17 +14,16 @@ mkdir -p $DATATMP
cd $DATATMP
export LEVS=${LEVS_LORES:-64}
-export FIXam=${FIXam:-$HOMEgfs/fix/am}
export CHGRESSH=${CHGRESSH:-${USHgfs}/global_chgres.sh}
export CHGRESEXEC=${CHGRESEXEC-${EXECgfs}/global_chgres}
-export OROGRAPHY=${OROGRAPHY_LORES:-$FIXam/global_orography.t$JCAP.$LONB.$LATB.grb}
-export OROGRAPHY_UF=${OROGRAPHY_UF_LORES:-$FIXam/global_orography_uf.t$JCAP.$LONB.$LATB.grb}
-export LONSPERLAT=${LONSPERLAT_LORES:-$FIXam/global_lonsperlat.t${JCAP}.$LONB.$LATB.txt}
-export SLMASK=${SLMASK_LORES:-$FIXam/global_slmask.t$JCAP.$LONB.$LATB.grb}
-export MTNVAR=${MTNVAR_LORES:-$FIXam/global_mtnvar.t$JCAP.$LONB.$LATB.f77}
-export SIGLEVEL=${SIGLEVEL_LORES:-$FIXam/global_hyblev.l${LEVS}.txt}
-export O3CLIM=${O3CLIM:-$FIXam/global_o3clim.txt}
+export OROGRAPHY=${OROGRAPHY_LORES:-${FIXgfs}/am/global_orography.t$JCAP.$LONB.$LATB.grb}
+export OROGRAPHY_UF=${OROGRAPHY_UF_LORES:-${FIXgfs}/am/global_orography_uf.t$JCAP.$LONB.$LATB.grb}
+export LONSPERLAT=${LONSPERLAT_LORES:-${FIXgfs}/am/global_lonsperlat.t${JCAP}.$LONB.$LATB.txt}
+export SLMASK=${SLMASK_LORES:-${FIXgfs}/am/global_slmask.t$JCAP.$LONB.$LATB.grb}
+export MTNVAR=${MTNVAR_LORES:-${FIXgfs}/am/global_mtnvar.t$JCAP.$LONB.$LATB.f77}
+export SIGLEVEL=${SIGLEVEL_LORES:-${FIXgfs}/am/global_hyblev.l${LEVS}.txt}
+export O3CLIM=${O3CLIM:-${FIXgfs}/am/global_o3clim.txt}
use_ufo=.true.
diff --git a/ush/hpssarch_gen_emc.sh b/ush/hpssarch_gen_emc.sh
index c34fff1a84..903c2d63fb 100755
--- a/ush/hpssarch_gen_emc.sh
+++ b/ush/hpssarch_gen_emc.sh
@@ -92,7 +92,7 @@ if [[ ${type} = "gfs" ]]; then
# This uses the bash extended globbing option
{
echo "./logs/${PDY}${cyc}/gfs!(arch).log"
- echo "${COM_ATMOS_HISTORY/${ROTDIR}\//}/input.nml"
+ echo "${COM_CONF/${ROTDIR}\//}/ufs.input.nml"
if [[ ${MODE} = "cycled" ]]; then
if [[ -s "${COM_ATMOS_ANALYSIS}/${head}gsistat" ]]; then
@@ -251,48 +251,64 @@ if [[ ${type} = "gfs" ]]; then
} >> "${DATA}/gfswave.txt"
fi
- if [[ ${DO_OCN} = "YES" ]]; then
+ if [[ "${DO_OCN}" == "YES" ]]; then
- head="gfs.t${cyc}z."
+ 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"
- rm -f "${DATA}/gfs_flux_1p00.txt"
- rm -f "${DATA}/ocn_ice_grib2_0p5.txt"
- rm -f "${DATA}/ocn_ice_grib2_0p25.txt"
- rm -f "${DATA}/ocn_2D.txt"
- rm -f "${DATA}/ocn_3D.txt"
- rm -f "${DATA}/ocn_xsect.txt"
- rm -f "${DATA}/ocn_daily.txt"
- touch "${DATA}/gfs_flux_1p00.txt"
- touch "${DATA}/ocn_ice_grib2_0p5.txt"
- touch "${DATA}/ocn_ice_grib2_0p25.txt"
- touch "${DATA}/ocn_2D.txt"
- touch "${DATA}/ocn_3D.txt"
- touch "${DATA}/ocn_xsect.txt"
- touch "${DATA}/ocn_daily.txt"
- echo "${COM_OCEAN_INPUT/${ROTDIR}\//}/MOM_input" >> "${DATA}/ocn_2D.txt"
- echo "${COM_OCEAN_2D/${ROTDIR}\//}/ocn_2D*" >> "${DATA}/ocn_2D.txt"
- echo "${COM_OCEAN_3D/${ROTDIR}\//}/ocn_3D*" >> "${DATA}/ocn_3D.txt"
- echo "${COM_OCEAN_XSECT/${ROTDIR}\//}/ocn*EQ*" >> "${DATA}/ocn_xsect.txt"
- echo "${COM_OCEAN_HISTORY/${ROTDIR}\//}/ocn_daily*" >> "${DATA}/ocn_daily.txt"
- echo "${COM_OCEAN_GRIB_0p50/${ROTDIR}\//}/ocn_ice*0p5x0p5.grb2" >> "${DATA}/ocn_ice_grib2_0p5.txt"
- echo "${COM_OCEAN_GRIB_0p25/${ROTDIR}\//}/ocn_ice*0p25x0p25.grb2" >> "${DATA}/ocn_ice_grib2_0p25.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.t${cyc}z."
+ 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"
- rm -f "${DATA}/ice.txt"
- touch "${DATA}/ice.txt"
{
- echo "${COM_ICE_INPUT/${ROTDIR}\//}/ice_in"
- echo "${COM_ICE_HISTORY/${ROTDIR}\//}/ice*nc"
- } >> "${DATA}/ice.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
@@ -368,7 +384,10 @@ if [[ ${type} == "gdas" ]]; then
echo "./logs/${PDY}${cyc}/gdas${fstep}.log"
fi
done
- echo "./logs/${PDY}${cyc}/gdaspost*.log"
+ 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
@@ -407,10 +426,13 @@ if [[ ${type} == "gdas" ]]; then
fi
subtyplist="gome_metop-b omi_aura ompslp_npp ompsnp_n20 ompsnp_npp ompstc8_n20 ompstc8_npp sbuv2_n19"
for subtype in ${subtyplist}; do
- 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"
+ # 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
@@ -612,8 +634,17 @@ if [[ ${type} == "enkfgdas" || ${type} == "enkfgfs" ]]; then
fi
fi
done # loop over FHR
- for fstep in eobs ecen esfc eupd efcs epos ; do
- echo "logs/${PDY}${cyc}/${RUN}${fstep}*.log"
+ 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
@@ -751,4 +782,3 @@ fi ##end of enkfgdas or enkfgfs
#-----------------------------------------------------
exit 0
-
diff --git a/ush/icepost.ncl b/ush/icepost.ncl
deleted file mode 100755
index ad102971c4..0000000000
--- a/ush/icepost.ncl
+++ /dev/null
@@ -1,382 +0,0 @@
-;------------------------------------------------------------------
-; Denise.Worthen@noaa.gov (Feb 2019)
-;
-; This script will remap CICE5 output on the tripole grid to
-; a set of rectilinear grids using pre-computed ESMF weights to remap
-; the listed fields to the destination grid and write the results
-; to a new netCDF file
-;
-; See ocnpost.ncl for a complete description
-;
-; Bin.Li@noaa.gov (May 2019)
-; This script is revised to be used in the coupled workflow.
-; Revised parts are marked by
-
- load "$NCARG_ROOT/lib/ncarg/nclscripts/esmf/ESMF_regridding.ncl"
-
-;----------------------------------------------------------------------
-begin
-
-;************************************************
-; specify parameters
-;************************************************
-;
-
- output_masks = False
- ; destination grid sizes and name
- dsttype = (/"rect."/)
- ;dstgrds = (/"1p0", "0p5", "0p25"/)
-;
-
- ; specify a location to use
- ; nemsrc = "/scratch4/NCEPDEV/ocean/save/Denise.Worthen/NEMS_INPUT0.1/ocnicepost/"
- ; interpolation methods
- methods = (/"bilinear" ,"conserve"/)
- ; ocean model output location
- ;dirsrc = "/scratch3/NCEPDEV/stmp2/Denise.Worthen/BM1_ice/"
-
-
- ; variables to be regridded with the native tripole stagger location
-
- varlist = (/ (/ "hi_h", "Ct", "bilinear"/) \
- ,(/ "hs_h", "Ct", "bilinear"/) \
- ,(/ "Tsfc_h", "Ct", "bilinear"/) \
- ,(/ "aice_h", "Ct", "bilinear"/) \
- ,(/ "sst_h", "Ct", "bilinear"/) \
- /)
- dims = dimsizes(varlist)
- nvars = dims(0)
- delete(dims)
- ;print(varlist)
-
- ; vectors to be regridded with the native tripole stagger location
- ; and dimensionality
- ; note: vectors are always unstaggered using bilinear weights, but can
- ; be remapped using conservative
- nvpairs = 1
- veclist = new( (/nvpairs,3,2/),"string")
- veclist = (/ (/ (/"uvel_h", "vvel_h"/), (/"Bu", "Bu"/), (/"bilinear", "bilinear"/) /) \
- /)
- ;print(veclist)
-
- begTime = get_cpu_time()
-;----------------------------------------------------------------------
-; make a list of the directories and files from the run
-;----------------------------------------------------------------------
-; idate = "20120101"
-; icefilelist = systemfunc("ls "+dirsrc+"gfs."+idate+"/00/"+"ice*.nc")
-; icef = addfiles(icefilelist,"r")
-; nfiles = dimsizes(icefilelist)
-;
-
- ; get the rotation angle
- angleT = icef[0]->ANGLET
-
- ; get a 2 dimensional fields for creating the interpolation mask
- ; the mask2d contain 1's on land and 0's at valid points.
- mask2d = where(ismissing(icef[0]->sst_h), 1.0, 0.0)
- ;printVarSummary(mask2d)
-
- ; create conformed rotation arrays to make vector rotations cleaner
- angleT2d=conform_dims(dimsizes(mask2d),angleT,(/1,2/))
-
-;----------------------------------------------------------------------
-; loop over the output resolutions
-;----------------------------------------------------------------------
-
- jj = 1
- ii = 0
-
- do jj = 0,dimsizes(dstgrds)-1
- ;outres = "_"+dstgrds(jj)+"x"+dstgrds(jj)
- outres = dstgrds(jj)+"x"+dstgrds(jj)
- outgrid = dstgrds(jj)
-
- ; regrid a field to obtain the output xy dimensions
- wgtsfile = nemsrc+"/"+"tripole.mx025.Ct.to."+dsttype+dstgrds(jj)+".bilinear.nc"
- tt = ESMF_regrid_with_weights(angleT,wgtsfile,False)
- tt!0 = "lat"
- tt!1 = "lon"
- lat = tt&lat
- lon = tt&lon
- dims = dimsizes(tt)
- nlat = dims(0)
- nlon = dims(1)
- print("fields will be remapped to destination grid size "\
- +nlon+" "+nlat)
-
- delete(tt)
- delete(dims)
-
- ; regrid the masks to obtain the interpolation masks.
- ; the mask2d contain 1's on land and 0's at valid points.
- ; when remapped, any mask value > 0 identifies land values that
- ; have crept into the field. remapped model fields are then
- ; masked with this interpolation mask
-
- wgtsfile = nemsrc+"/"+"tripole.mx025.Ct.to."+dsttype+dstgrds(jj)+".bilinear.nc"
- rgmask2d = ESMF_regrid_with_weights(mask2d, wgtsfile,False)
-
- if(output_masks)then
- testfile = "masks_"+dstgrds(jj)+".nc"
- system("/bin/rm -f "+testfile)
- ; create
- testcdf = addfile(testfile,"c")
- testcdf->rgmask2d = rgmask2d
- ; close
- delete(testcdf)
- end if
-
- ; create the interpolation mask
- rgmask2d = where(rgmask2d .gt. 0.0, rgmask2d@_FillValue, 1.0)
-
-;----------------------------------------------------------------------
-; loop over each file in the icefilelist
-;----------------------------------------------------------------------
-;
- ; retrieve the time stamp
- time = icef[0]->time
- delete(time@bounds)
-
-;----------------------------------------------------------------------
-; set up the output netcdf file
-;----------------------------------------------------------------------
-; system("/bin/rm -f " + outfile) ; remove if exists
-; outcdf = addfile (outfile, "c") ; open output file
-;
-;
-
- ; explicitly declare file definition mode. Improve efficiency.
- setfileoption(outcdf,"DefineMode",True)
-
- ; create global attributes of the file
- fAtt = True ; assign file attributes
- fAtt@creation_date = systemfunc ("date")
- fAtt@source_file = infile
- fileattdef( outcdf, fAtt ) ; copy file attributes
-
- ; predefine the coordinate variables and their dimensionality
- dimNames = (/"time", "lat", "lon"/)
- dimSizes = (/ -1 , nlat, nlon/)
- dimUnlim = (/ True , False, False/)
- filedimdef(outcdf,dimNames,dimSizes,dimUnlim)
-
- ; predefine the the dimensionality of the variables to be written out
- filevardef(outcdf, "time", typeof(time), getvardims(time))
- filevardef(outcdf, "lat", typeof(lat), getvardims(lat))
- filevardef(outcdf, "lon", typeof(lon), getvardims(lon))
-
- ; Copy attributes associated with each variable to the file
- filevarattdef(outcdf, "time", time)
- filevarattdef(outcdf, "lat", lat)
- filevarattdef(outcdf, "lon", lon)
-
- ; predefine variables
- do nv = 0,nvars-1
- varname = varlist(nv,0)
- odims = (/"time", "lat", "lon"/)
- ;print("creating variable "+varname+" in file")
- filevardef(outcdf, varname, "float", odims)
- delete(odims)
- end do
-
- do nv = 0,nvpairs-1
- do nn = 0,1
- vecname = veclist(nv,0,nn)
- odims = (/"time", "lat", "lon"/)
- ;print("creating variable "+vecname+" in file")
- filevardef(outcdf, vecname, "float", odims)
- delete(odims)
- end do
- end do
-
- ; explicitly exit file definition mode.
- setfileoption(outcdf,"DefineMode",False)
-
- lat=lat(::-1)
- ; write the dimensions to the file
- outcdf->time = (/time/)
- outcdf->lat = (/lat/)
- outcdf->lon = (/lon/)
-
-;----------------------------------------------------------------------
-; loop over nvars variables
-;----------------------------------------------------------------------
-
- ;nv = 1
- do nv = 0,nvars-1
- varname = varlist(nv,0)
- vargrid = varlist(nv,1)
- varmeth = varlist(nv,2)
-
- ;print(nv+" "+varname+" "+vargrid+" "+varmeth)
- icevar = icef[ii]->$varname$
- ndims = dimsizes(dimsizes(icevar))
- ;print(ndims+" "+dimsizes(icevar))
-
- if(vargrid .ne. "Ct")then
- ; print error if the variable is not on the Ct grid
- print("Variable is not on Ct grid")
- exit
- end if
-
- ; regrid to dsttype+dstgrd with method
- ;print("remapping "+varname+" to grid "+dsttype+dstgrds(jj))
- wgtsfile = nemsrc+"/"+"tripole.mx025.Ct.to."+dsttype+dstgrds(jj)+"."+varmeth+".nc"
-
- rgtt = ESMF_regrid_with_weights(icevar,wgtsfile,False)
- rgtt = where(ismissing(rgmask2d),icevar@_FillValue,rgtt)
- rgtt=rgtt(:,::-1,:)
-
- ; enter file definition mode to add variable attributes
- setfileoption(outcdf,"DefineMode",True)
- filevarattdef(outcdf, varname, rgtt)
- setfileoption(outcdf,"DefineMode",False)
-
-
- outcdf->$varname$ = (/rgtt/)
-
- delete(icevar)
- delete(rgtt)
-
- ; nv, loop over number of variables
- end do
-
-;----------------------------------------------------------------------
-;
-;----------------------------------------------------------------------
-
- ;nv = 0
- do nv = 0,nvpairs-1
- vecnames = veclist(nv,0,:)
- vecgrids = veclist(nv,1,:)
- vecmeth = veclist(nv,2,:)
- ;print(nv+" "+vecnames+" "+vecgrids+" "+vecmeth)
-
- ; create a vector pair list
- vecpairs = NewList("fifo")
- n = 0
- uvel = icef[ii]->$vecnames(n)$
- vecfld = where(ismissing(uvel),0.0,uvel)
- copy_VarAtts(uvel,vecfld)
- ;print("unstagger "+vecnames(n)+" from "+vecgrids(n)+" to Ct")
- wgtsfile = nemsrc+"/"+"tripole.mx025."+vecgrids(n)+".to.Ct.bilinear.nc"
- ut = ESMF_regrid_with_weights(vecfld,wgtsfile,False)
- delete(ut@remap)
-
- n = 1
- vvel = icef[ii]->$vecnames(n)$
- vecfld = where(ismissing(vvel),0.0,vvel)
- copy_VarAtts(vvel,vecfld)
- ;print("unstagger "+vecnames(n)+" from "+vecgrids(n)+" to Ct")
- wgtsfile = nemsrc+"/"+"tripole.mx025."+vecgrids(n)+".to.Ct.bilinear.nc"
- vt = ESMF_regrid_with_weights(vecfld,wgtsfile,False)
- delete(vt@remap)
-
- ListAppend(vecpairs,ut)
- ListAppend(vecpairs,vt)
- ;print(vecpairs)
-
- ; rotate
- ; first copy Metadata
- urot = vecpairs[0]
- vrot = vecpairs[1]
- urot = cos(angleT2d)*ut - sin(angleT2d)*vt
- vrot = sin(angleT2d)*ut + cos(angleT2d)*vt
-
- ; change attribute to indicate these are now rotated velocities
- urot@long_name=str_sub_str(urot@long_name,"(x)","zonal")
- vrot@long_name=str_sub_str(vrot@long_name,"(y)","meridional")
- ; copy back
- vecpairs[0] = urot
- vecpairs[1] = vrot
- delete([/urot, vrot/])
-
- ; remap
- do n = 0,1
- vecfld = vecpairs[n]
- ; regrid to dsttype+dstgrd with method
- ;print("remapping "+vecnames(n)+" to grid "+dsttype+dstgrds(jj))
- wgtsfile = nemsrc+"/"+"tripole.mx025.Ct.to."+dsttype+dstgrds(jj)+"."+vecmeth(n)+".nc"
-
- rgtt = ESMF_regrid_with_weights(vecfld,wgtsfile,False)
- rgtt = where(ismissing(rgmask2d),vecfld@_FillValue,rgtt)
- rgtt=rgtt(:,::-1,:)
-
- ; enter file definition mode to add variable attributes
- setfileoption(outcdf,"DefineMode",True)
- filevarattdef(outcdf, vecnames(n), rgtt)
- setfileoption(outcdf,"DefineMode",False)
-
- outcdf->$vecnames(n)$ = (/rgtt/)
- delete(rgtt)
- end do
- delete([/uvel,vvel,ut,vt,vecfld,vecpairs/])
- delete([/vecnames,vecgrids,vecmeth/])
- ; nv, loop over number of vector pairs
- end do
-
-;----------------------------------------------------------------------
-; close the outcdf and continue through filelist
-;----------------------------------------------------------------------
-
- delete(outcdf)
-
- ; ii, loop over files
- ;end do
- ;jj, loop over destination grids
- delete([/lat,lon,nlon,nlat/])
- delete([/rgmask2d/])
- end do
- print("One complete ice file in " + (get_cpu_time() - begTime) + " seconds")
-exit
-end
diff --git a/ush/load_fv3gfs_modules.sh b/ush/load_fv3gfs_modules.sh
index b4f23fa331..ae0e381db4 100755
--- a/ush/load_fv3gfs_modules.sh
+++ b/ush/load_fv3gfs_modules.sh
@@ -10,7 +10,8 @@ fi
ulimit_s=$( ulimit -S -s )
# Find module command and purge:
-source "${HOMEgfs}/modulefiles/module-setup.sh.inc"
+source "${HOMEgfs}/ush/detect_machine.sh"
+source "${HOMEgfs}/ush/module-setup.sh"
# Source versions file for runtime
source "${HOMEgfs}/versions/run.ver"
@@ -18,36 +19,14 @@ source "${HOMEgfs}/versions/run.ver"
# Load our modules:
module use "${HOMEgfs}/modulefiles"
-if [[ -d /lfs/f1 ]]; then
- # We are on WCOSS2 (Cactus or Dogwood)
- module load module_base.wcoss2
-elif [[ -d /mnt/lfs1 ]] ; then
- # We are on NOAA Jet
- module load module_base.jet
-elif [[ -d /scratch1 ]] ; then
- # We are on NOAA Hera
- module load module_base.hera
-elif [[ -d /work ]] ; then
- # We are on MSU Orion or Hercules
- if [[ -d /apps/other ]] ; then
- # Hercules
- module load module_base.hercules
- else
- # Orion
- module load module_base.orion
- fi
-elif [[ -d /glade ]] ; then
- # We are on NCAR Yellowstone
- module load module_base.cheyenne
-elif [[ -d /lustre && -d /ncrc ]] ; then
- # We are on GAEA.
- module load module_base.gaea
-elif [[ -d /data/prod ]] ; then
- # We are on SSEC S4
- module load module_base.s4
-else
- echo WARNING: UNKNOWN PLATFORM
-fi
+case "${MACHINE_ID}" in
+ "wcoss2" | "hera" | "orion" | "hercules" | "gaea" | "jet" | "s4")
+ module load "module_base.${MACHINE_ID}"
+ ;;
+ *)
+ echo "WARNING: UNKNOWN PLATFORM"
+ ;;
+esac
module list
diff --git a/ush/load_ufsda_modules.sh b/ush/load_ufsda_modules.sh
index da8e2d8096..e8e72b8fbe 100755
--- a/ush/load_ufsda_modules.sh
+++ b/ush/load_ufsda_modules.sh
@@ -27,53 +27,26 @@ fi
ulimit_s=$( ulimit -S -s )
# Find module command and purge:
-source "${HOMEgfs}/modulefiles/module-setup.sh.inc"
+source "${HOMEgfs}/ush/detect_machine.sh"
+source "${HOMEgfs}/ush/module-setup.sh"
# Load our modules:
module use "${HOMEgfs}/sorc/gdas.cd/modulefiles"
-if [[ -d /lfs/f1 ]]; then
- # We are on WCOSS2 (Cactus or Dogwood)
- echo WARNING: UFSDA NOT SUPPORTED ON THIS PLATFORM
-elif [[ -d /lfs3 ]] ; then
- # We are on NOAA Jet
- echo WARNING: UFSDA NOT SUPPORTED ON THIS PLATFORM
-elif [[ -d /scratch1 ]] ; then
- # We are on NOAA Hera
- module load "${MODS}/hera"
- # set NETCDF variable based on ncdump location
- NETCDF=$( which ncdump )
- export NETCDF
- # prod_util stuff, find a better solution later...
- module use /scratch2/NCEPDEV/nwprod/hpc-stack/libs/hpc-stack/modulefiles/compiler/intel/2022.1.2/
- module load prod_util
-elif [[ -d /work ]] ; then
- # We are on MSU Orion
- # prod_util stuff, find a better solution later...
- #module use /apps/contrib/NCEP/hpc-stack/libs/hpc-stack/modulefiles/compiler/intel/2022.1.2/
- #module load prod_util
- export UTILROOT=/work2/noaa/da/python/opt/intel-2022.1.2/prod_util/1.2.2
- export MDATE=/work2/noaa/da/python/opt/intel-2022.1.2/prod_util/1.2.2/bin/mdate
- export NDATE=/work2/noaa/da/python/opt/intel-2022.1.2/prod_util/1.2.2/bin/ndate
- export NHOUR=/work2/noaa/da/python/opt/intel-2022.1.2/prod_util/1.2.2/bin/nhour
- export FSYNC=/work2/noaa/da/python/opt/intel-2022.1.2/prod_util/1.2.2/bin/fsync_file
- module load "${MODS}/orion"
- # set NETCDF variable based on ncdump location
- ncdump=$( which ncdump )
- NETCDF=$( echo "${ncdump}" | cut -d " " -f 3 )
- export NETCDF
-elif [[ -d /glade ]] ; then
- # We are on NCAR Yellowstone
- echo WARNING: UFSDA NOT SUPPORTED ON THIS PLATFORM
-elif [[ -d /lustre && -d /ncrc ]] ; then
- # We are on GAEA.
- echo WARNING: UFSDA NOT SUPPORTED ON THIS PLATFORM
-elif [[ -d /data/prod ]] ; then
- # We are on SSEC S4
- echo WARNING: UFSDA NOT SUPPORTED ON THIS PLATFORM
-else
- echo WARNING: UNKNOWN PLATFORM
-fi
+case "${MACHINE_ID}" in
+ ("hera" | "orion" | "hercules")
+ module load "${MODS}/${MACHINE_ID}"
+ ncdump=$( command -v ncdump )
+ NETCDF=$( echo "${ncdump}" | cut -d " " -f 3 )
+ export NETCDF
+ ;;
+ ("wcoss2" | "acorn" | "jet" | "gaea" | "s4")
+ echo WARNING: UFSDA NOT SUPPORTED ON THIS PLATFORM
+ ;;
+ *)
+ echo "WARNING: UNKNOWN PLATFORM"
+ ;;
+esac
module list
pip list
diff --git a/ush/minmon_xtrct_costs.pl b/ush/minmon_xtrct_costs.pl
index 502032da80..c56ac3bdad 100755
--- a/ush/minmon_xtrct_costs.pl
+++ b/ush/minmon_xtrct_costs.pl
@@ -22,8 +22,8 @@
#
#---------------------------
-if ($#ARGV != 4 ) {
- print "usage: minmon_xtrct_costs.pl SUFFIX PDY cyc infile jlogfile\n";
+if ($#ARGV != 3 ) {
+ print "usage: minmon_xtrct_costs.pl SUFFIX PDY cyc infile\n";
exit;
}
my $suffix = $ARGV[0];
@@ -31,7 +31,6 @@
my $pdy = $ARGV[1];
my $cyc = $ARGV[2];
my $infile = $ARGV[3];
-my $jlogfile = $ARGV[4];
my $use_costterms = 0;
my $no_data = 0.00;
diff --git a/ush/minmon_xtrct_gnorms.pl b/ush/minmon_xtrct_gnorms.pl
index 0125c58ac8..ac83c08cd3 100755
--- a/ush/minmon_xtrct_gnorms.pl
+++ b/ush/minmon_xtrct_gnorms.pl
@@ -185,8 +185,8 @@ sub updateGnormData {
#
#---------------------------------------------------------------------------
-if ($#ARGV != 4 ) {
- print "usage: minmon_xtrct_gnorms.pl SUFFIX pdy cyc infile jlogfile\n";
+if ($#ARGV != 3 ) {
+ print "usage: minmon_xtrct_gnorms.pl SUFFIX pdy cyc infile \n";
exit;
}
@@ -195,7 +195,6 @@ sub updateGnormData {
my $pdy = $ARGV[1];
my $cyc = $ARGV[2];
my $infile = $ARGV[3];
-my $jlogfile = $ARGV[4];
my $scr = "minmon_xtrct_gnorms.pl";
diff --git a/ush/minmon_xtrct_reduct.pl b/ush/minmon_xtrct_reduct.pl
index 1b8186b6ad..cc5da86af8 100755
--- a/ush/minmon_xtrct_reduct.pl
+++ b/ush/minmon_xtrct_reduct.pl
@@ -9,20 +9,18 @@
# reduction.ieee_d files ready for GrADS use.
#---------------------------------------------------------------------------
-if ($#ARGV != 4 ) {
- print "usage: minmon_xtrct_reduct.pl SUFFIX pdy cyc infile jlogfile\n";
+if ($#ARGV != 3 ) {
+ print "usage: minmon_xtrct_reduct.pl SUFFIX pdy cyc infile\n";
print " suffix is data source identifier\n";
print " pdy is YYYYMMDD of the cycle to be processed\n";
print " cyc is HH of the cycle to be processed\n";
print " infile is the data file containing the reduction stats\n";
- print " jlogfile is the job log file\n";
exit;
}
my $suffix = $ARGV[0];
my $pdy = $ARGV[1];
my $cyc = $ARGV[2];
my $infile = $ARGV[3];
-my $jlogfile = $ARGV[4];
my $scr = "minmon_xtrct_reduct.pl";
print "$scr has started\n";
diff --git a/ush/module-setup.sh b/ush/module-setup.sh
index fd656966bf..008ef7ee97 100755
--- a/ush/module-setup.sh
+++ b/ush/module-setup.sh
@@ -1,6 +1,8 @@
#!/bin/bash
set -u
+source "${HOMEgfs}/ush/detect_machine.sh"
+
if [[ ${MACHINE_ID} = jet* ]] ; then
# We are on NOAA Jet
if ( ! eval module help > /dev/null 2>&1 ) ; then
@@ -123,7 +125,7 @@ elif [[ ${MACHINE_ID} = "noaacloud" ]]; then
export SPACK_ROOT=/contrib/global-workflow/spack-stack/spack
export PATH=${PATH}:${SPACK_ROOT}/bin
. "${SPACK_ROOT}"/share/spack/setup-env.sh
-
+
else
echo WARNING: UNKNOWN PLATFORM 1>&2
fi
diff --git a/ush/oceanice_nc2grib2.sh b/ush/oceanice_nc2grib2.sh
new file mode 100755
index 0000000000..1d0e5ae274
--- /dev/null
+++ b/ush/oceanice_nc2grib2.sh
@@ -0,0 +1,319 @@
+#!/bin/bash
+
+# This script contains functions to convert ocean/ice rectilinear netCDF files to grib2 format
+# This script uses the wgrib2 utility to convert the netCDF files to grib2 format and then indexes it
+
+source "${HOMEgfs}/ush/preamble.sh"
+
+################################################################################
+function _ice_nc2grib2 {
+# This function converts the ice rectilinear netCDF files to grib2 format
+
+ # Set the inputs
+ local grid=${1} # 0p25, 0p50, 1p00, 5p00
+ local latlon_dims=${2} # 0:721:0:1440, 0:361:0:720, 0:181:0:360, 0:36:0:72
+ local current_cycle=${3} # YYYYMMDDHH
+ local aperiod=${4} # 0-6
+ local infile=${5} # ice.0p25.nc
+ local outfile=${6} # ice.0p25.grib2
+ local template=${7} # template.global.0p25.gb2
+
+ ${WGRIB2} "${template}" \
+ -import_netcdf "${infile}" "hi_h" "0:1:${latlon_dims}" \
+ -set_var ICETK -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}" "aice_h" "0:1:${latlon_dims}" \
+ -set_var ICEC -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}" "Tsfc_h" "0:1:${latlon_dims}" \
+ -set_var ICETMP -set center 7 -rpn "273.15:+" \
+ -set_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \
+ -set_scaling same same -set_grib_type c1 -grib_out "${outfile}" \
+ -import_netcdf "${infile}" "uvel_h" "0:1:${latlon_dims}" \
+ -set_var UICE -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}" "vvel_h" "0:1:${latlon_dims}" \
+ -set_var VICE -set center 7 \
+ -set_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \
+ -set_scaling same same -set_grib_type c1 -grib_out "${outfile}"
+
+# Additional variables needed for GFSv17/GEFSv13 operational forecast
+# files, but GRIB2 parameters not available in NCEP (-set center 7)
+# tables in wgrib2 v2.0.8:
+
+# -import_netcdf "${infile}" "hs_h" "0:1:${latlon_dims}" \
+# -set_var ??? -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_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_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_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_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \
+# -set_scaling same same -set_grib_type c1 -grib_out "${outfile}"
+
+ rc=$?
+ # Check if the conversion was successful
+ if (( rc != 0 )); then
+ echo "FATAL ERROR: Failed to convert the ice rectilinear netCDF file to grib2 format"
+ fi
+ return "${rc}"
+
+}
+
+################################################################################
+function _ocean2D_nc2grib2 {
+# This function converts the ocean 2D rectilinear netCDF files to grib2 format
+
+ # Set the inputs
+ local grid=${1} # 0p25, 0p50, 1p00, 5p00
+ local latlon_dims=${2} # 0:721:0:1440, 0:361:0:720, 0:181:0:360, 0:36:0:72
+ local current_cycle=${3} # YYYYMMDDHH
+ local aperiod=${4} # 0-6
+ local infile=${5} # ocean.0p25.nc
+ local outfile=${6} # ocean_2D.0p25.grib2
+ local template=${7} # template.global.0p25.gb2
+
+ ${WGRIB2} "${template}" \
+ -import_netcdf "${infile}" "SSH" "0:1:${latlon_dims}" \
+ -set_var SSHG -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}" "SST" "0:1:${latlon_dims}" \
+ -set_var WTMP -set center 7 -rpn "273.15:+" \
+ -set_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \
+ -set_scaling same same -set_grib_type c1 -grib_out "${outfile}" \
+ -import_netcdf "${infile}" "SSS" "0:1:${latlon_dims}" \
+ -set_var SALIN -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}" "speed" "0:1:${latlon_dims}" \
+ -set_var SPC -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}" "SSU" "0:1:${latlon_dims}" \
+ -set_var UOGRD -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}" "SSV" "0:1:${latlon_dims}" \
+ -set_var VOGRD -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}" "latent" "0:1:${latlon_dims}" \
+ -set_var LHTFL -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}" "sensible" "0:1:${latlon_dims}" \
+ -set_var SHTFL -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}" "SW" "0:1:${latlon_dims}" \
+ -set_var DSWRF -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_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}" \
+ -set_var THFLX -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}" "MLD_003" "0:1:${latlon_dims}" \
+ -set_var WDEPTH -set center 7 -set_lev "mixed layer depth" \
+ -set_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \
+ -set_scaling same same -set_grib_type c1 -grib_out "${outfile}"
+
+# Additional variables needed for GFSv17/GEFSv13 operational forecast
+# files, but GRIB2 parameters not available in NCEP (-set center 7)
+# tables in wgrib2 v2.0.8:
+#
+# -import_netcdf "${infile}" "Heat_PmE" "0:1:${latlon_dims}" \
+# -set_var DWHFLUX -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}" "taux" "0:1:${latlon_dims}" \
+# -set_var XCOMPSS -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}" "tauy" "0:1:${latlon_dims}" \
+# -set_var YCOMPSS -set center 7 \
+# -set_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \
+# -set_scaling same same -set_grib_type c1 -grib_out "${outfile}"
+
+ rc=$?
+ # Check if the conversion was successful
+ if (( rc != 0 )); then
+ echo "FATAL ERROR: Failed to convert the ocean rectilinear netCDF file to grib2 format"
+ fi
+ return "${rc}"
+
+}
+
+################################################################################
+function _ocean3D_nc2grib2 {
+# This function converts the ocean 3D rectilinear netCDF files to grib2 format
+
+ # Set the inputs
+ local grid=${1} # 0p25, 0p50, 1p00, 5p00
+ local latlon_dims=${2} # 0:721:0:1440, 0:361:0:720, 0:181:0:360, 0:36:0:72
+ local levels=${3} # 5:15:25:35:45:55:65:75:85:95:105:115:125
+ local current_cycle=${4} # YYYYMMDDHH
+ local aperiod=${5} # 0-6
+ local infile=${6} # ocean.0p25.nc
+ local outfile=${7} # ocean_3D.0p25.grib2
+ local template=${8} # template.global.0p25.gb2
+
+ IFS=':' read -ra depths <<< "${levels}"
+
+ zl=0
+ for depth in "${depths[@]}"; do
+
+ [[ -f "tmp.gb2" ]] && rm -f "tmp.gb2"
+
+ ${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_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_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_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_date "${current_cycle}" -set_ftime "${aperiod} hour ave fcst" \
+ -set_scaling same same -set_grib_type c1 -grib_out tmp.gb2
+
+ rc=$?
+ # Check if the conversion was successful
+ if (( rc != 0 )); then
+ echo "FATAL ERROR: Failed to convert the ocean rectilinear netCDF file to grib2 format at depth ${depth}m, ABORT!"
+ return "${rc}"
+ fi
+
+ cat tmp.gb2 >> "${outfile}"
+ rm -f tmp.gb2
+ ((zl = zl + 1))
+
+ done
+
+ # Notes:
+ # WATPTEMP (water potential temperature (theta)) may be a better
+ # GRIB2 parameter than WTMP (water temperature) if MOM6 outputs
+ # potential temperature. WATPTEMP is not available in NCEP
+ # (-set center 7) tables in wgrib2 v2.0.8.
+
+ return "${rc}"
+
+}
+
+################################################################################
+# Input arguments
+component=${1:?"Need a valid component; options: ice|ocean"}
+grid=${2:-"0p25"} # Default to 0.25-degree grid
+current_cycle=${3:-"2013100100"} # Default to 2013100100
+avg_period=${4:-"0-6"} # Default to 6-hourly average
+ocean_levels=${5:-"5:15:25:35:45:55:65:75:85:95:105:115:125"} # Default to 12-levels
+
+case "${grid}" in
+ "0p25")
+ latlon_dims="0:721:0:1440"
+ ;;
+ "0p50")
+ latlon_dims="0:361:0:720"
+ ;;
+ "1p00")
+ latlon_dims="0:181:0:360"
+ ;;
+ "5p00")
+ latlon_dims="0:36:0:72"
+ ;;
+ *)
+ echo "FATAL ERROR: Unsupported grid '${grid}', ABORT!"
+ exit 1
+ ;;
+esac
+
+input_file="${component}.${grid}.nc"
+template="template.global.${grid}.gb2"
+
+# Check if the template file exists
+if [[ ! -f "${template}" ]]; then
+ echo "FATAL ERROR: '${template}' does not exist, ABORT!"
+ exit 127
+fi
+
+# Check if the input file exists
+if [[ ! -f "${input_file}" ]]; then
+ echo "FATAL ERROR: '${input_file}' does not exist, ABORT!"
+ exit 127
+fi
+
+case "${component}" in
+ "ice")
+ rm -f "${component}.${grid}.grib2" || true
+ _ice_nc2grib2 "${grid}" "${latlon_dims}" "${current_cycle}" "${avg_period}" "${input_file}" "${component}.${grid}.grib2" "${template}"
+ rc=$?
+ if (( rc != 0 )); then
+ echo "FATAL ERROR: Failed to convert the ice rectilinear netCDF file to grib2 format"
+ exit "${rc}"
+ fi
+ ;;
+ "ocean")
+ rm -f "${component}_2D.${grid}.grib2" || true
+ _ocean2D_nc2grib2 "${grid}" "${latlon_dims}" "${current_cycle}" "${avg_period}" "${input_file}" "${component}_2D.${grid}.grib2" "${template}"
+ rc=$?
+ if (( rc != 0 )); then
+ echo "FATAL ERROR: Failed to convert the ocean 2D rectilinear netCDF file to grib2 format"
+ exit "${rc}"
+ fi
+ rm -f "${component}_3D.${grid}.grib2" || true
+ _ocean3D_nc2grib2 "${grid}" "${latlon_dims}" "${ocean_levels}" "${current_cycle}" "${avg_period}" "${input_file}" "${component}_3D.${grid}.grib2" "${template}"
+ rc=$?
+ if (( rc != 0 )); then
+ echo "FATAL ERROR: Failed to convert the ocean 3D rectilinear netCDF file to grib2 format"
+ exit "${rc}"
+ fi
+ # Combine the 2D and 3D grib2 files into a single file
+ rm -f "${component}.${grid}.grib2" || true
+ cat "${component}_2D.${grid}.grib2" "${component}_3D.${grid}.grib2" > "${component}.${grid}.grib2"
+
+ ;;
+ *)
+ echo "FATAL ERROR: Unknown component: '${component}'. ABORT!"
+ exit 3
+ ;;
+esac
+
+# Index the output grib2 file
+${WGRIB2} -s "${component}.${grid}.grib2" > "${component}.${grid}.grib2.idx"
+rc=$?
+# Check if the indexing was successful
+if (( rc != 0 )); then
+ echo "FATAL ERROR: Failed to index the file '${component}.${grid}.grib2'"
+ exit "${rc}"
+fi
+
+exit 0
diff --git a/ush/ocnpost.ncl b/ush/ocnpost.ncl
deleted file mode 100755
index 27e60b0edf..0000000000
--- a/ush/ocnpost.ncl
+++ /dev/null
@@ -1,588 +0,0 @@
-;------------------------------------------------------------------
-; Denise.Worthen@noaa.gov (Feb 2019)
-;
-; This script will remap MOM6 ocean output on the tripole grid to
-; a set of rectilinear grids using pre-computed ESMF weights to remap
-; the listed fields to the destination grid and write the results
-; to a new netCDF file
-;
-; Prior to running this script, files containing the conservative
-; and bilinear regridding weights must be generated. These weights
-; are created using the generate_iceocnpost_weights.ncl script.
-;
-; Note: the descriptive text below assumes fortran type indexing
-; where the variables are indexed as (i,j) and indices start at 1
-; NCL indices are (j,i) and start at 0
-;
-; The post involves these steps
-;
-; a) unstaggering velocity points
-; MOM6 is on an Arakawa C grid. MOM6 refers to these
-; locations as "Ct" for the centers and "Cu", "Cv"
-; "Bu" for the left-right, north-south and corner
-; points, respectively.
-;
-; The indexing scheme in MOM6 is as follows:
-;
-; Cv@i,j
-; ----X------X Bu@i,j
-; |
-; |
-; Ct@i,j |
-; X X Cu@i,j
-; |
-; |
-; |
-;
-; CICE5 is on an Arakawa B grid. CICE5 refers to these
-; locations as TLAT,TLON for the centers and ULAT,ULON
-; for the corners
-;
-; In UFS, the CICE5 grid has been created using the MOM6
-; supergrid file. Therefore, all grid points are consistent
-; between the two models.
-;
-; In the following, MOM6's nomenclature will be followed,
-; so that CICE5's U-grid will be referred to as "Bu".
-;
-; b) rotation of tripole vectors to East-West
-; MOM6 and CICE6 both output velocties on their native
-; velocity points. For MOM6, that is u-velocities on the
-; Cu grid and v-velocites on the Cv grid. For CICE5, it is
-; both u and v-velocities on the Bu grid.
-;
-; The rotation angle for both models are defined at center
-; grid points; therefore the velocities need to be first
-; unstaggered before rotation. MOM6 and CICE5 also define
-; opposite directions for the rotations. Finally, while the
-; grid points are identical between the two models, CICE5
-; calculates the rotation angle at center grid points by
-; averaging the four surrounding B grid points. MOM6 derives
-; the rotation angle at the center directly from the latitude
-; and longitude of the center grid points. The angles are therefor
-; not identical between the two grids.
-;
-; c) conservative regridding of some fields
-; Fields such as ice concentration or fluxes which inherently
-; area area-weighted require conservative regridding. Most other
-; variables are state variables and can be regridded using
-; bilinear weighting.
-;
-; An efficient way to accomplish the unstaggering of velocities
-; is to use the bilinear interpolation weights between grid
-; points of the Arakawa C grid and the center grid points (for example
-; Cu->Ct). These weights are generated by the weight generation script
-;
-; Remapping from the tripole to rectilinear uses either the bilinear
-; or conservative weights from the weight generation script. Bilinear weights
-; generated for the first vertical level can be used on other levels
-; (where the masking changes) by utilizing the correct masking procedure.
-; Set output_masks to true to examine the interpolation masks.
-;
-; Intermediate file output can easily be generated for debugging by
-; follwing the example in the output_masks logical
-;
-; Bin.Li@noaa.gov (May 2019)
-; The scripts is revised for use in the coupled workflow.
-;
- load "$NCARG_ROOT/lib/ncarg/nclscripts/esmf/ESMF_regridding.ncl"
-
-;----------------------------------------------------------------------
-begin
-;
-
- ; warnings (generated by int2p_n_Wrap) can be supressed by
- ; the following (comment out to get the warnings)
- err = NhlGetErrorObjectId()
- setvalues err
-; "errLevel" : "Fatal" ; only report Fatal errors
- "errLevel" : "Verbose"
- end setvalues
-
- output_masks = False
-
- ; specify a location to use
- ; nemsrc = "/scratch4/NCEPDEV/ocean/save/Denise.Worthen/NEMS_INPUT0.1/ocnicepost/"
- ; interpolation methods
- methods = (/"bilinear" ,"conserve"/)
- ; ocean model output location
- ;dirsrc = "/scratch3/NCEPDEV/stmp2/Denise.Worthen/BM1_ocn/"
-
- ; destination grid sizes and name
- dsttype = (/"rect."/)
- ;dstgrds = (/"1p0", "0p5", "0p25"/)
- ;dstgrds = (/"0p5"/)
- dstgrds = (/"0p25"/)
-
- ; variables to be regridded with the native tripole stagger location
- ; and dimensionality
- ; first BM contained only field "mld", which was actually ePBL
- ; the remaining BMs contain ePBL, MLD_003 and MLD_0125
- ; the following NCO command will be issued at the end
- ; to rename the variable mld to ePBL if the variable mld is found
- ; ncocmd = "ncrename -O -v mld,ePBL "
- ncocmd = "ncrename -O -v MLD_003,mld"
-
- varlist = (/ (/ "SSH", "Ct", "bilinear", "2"/) \
- ,(/ "SST", "Ct", "bilinear", "2"/) \
- ,(/ "SSS", "Ct", "bilinear", "2"/) \
- ,(/ "speed", "Ct", "bilinear", "2"/) \
- ,(/ "temp", "Ct", "bilinear", "3"/) \
- ,(/ "so", "Ct", "bilinear", "3"/) \
- ,(/ "latent", "Ct", "conserve", "2"/) \
- ,(/ "sensible", "Ct", "conserve", "2"/) \
- ,(/ "SW", "Ct", "conserve", "2"/) \
- ,(/ "LW", "Ct", "conserve", "2"/) \
- ,(/ "evap", "Ct", "conserve", "2"/) \
- ,(/ "lprec", "Ct", "conserve", "2"/) \
- ,(/ "fprec", "Ct", "conserve", "2"/) \
- ,(/"LwLatSens", "Ct", "conserve", "2"/) \
- ,(/ "Heat_PmE", "Ct", "conserve", "2"/) \
-; ,(/ "mld", "Ct", "bilinear", "2"/) \
- ,(/ "ePBL", "Ct", "bilinear", "2"/) \
- ,(/ "MLD_003", "Ct", "bilinear", "2"/) \
- ,(/ "MLD_0125", "Ct", "bilinear", "2"/) \
- /)
- dims = dimsizes(varlist)
- nvars = dims(0)
- delete(dims)
- ;print(varlist)
-
- ; vectors to be regridded with the native tripole stagger location
- ; and dimensionality
- ; note: vectors are always unstaggered using bilinear weights, but can
- ; be remapped using conservative
- nvpairs = 3
- veclist = new( (/nvpairs,4,2/),"string")
- veclist = (/ (/ (/ "SSU", "SSV"/), (/"Cu", "Cv"/), (/"bilinear", "bilinear"/), (/"2", "2"/) /) \
- , (/ (/ "uo", "vo"/), (/"Cu", "Cv"/), (/"bilinear", "bilinear"/), (/"3", "3"/) /) \
- , (/ (/ "taux", "tauy"/), (/"Cu", "Cv"/), (/"conserve", "conserve"/), (/"2", "2"/) /) \
- /)
- ;print(veclist)
-
- begTime = get_cpu_time()
-;----------------------------------------------------------------------
-; make a list of the directories and files from the run
-;----------------------------------------------------------------------
-
-; idate = "20120101"
-
-; ocnfilelist = systemfunc("ls "+dirsrc+"gfs."+idate+"/00/"+"ocn*.nc")
-; ocnf = addfiles(ocnfilelist,"r")
-; nfiles = dimsizes(ocnfilelist)
-;
-
- ; get the rotation angles and vertical grid from the first file
- ; two different name were used for the angles, either sinrot,cosrot
- ; or sin_rot,cos_rot
- if(isfilevar(ocnf[0],"sin_rot"))then
- sinrot = ocnf[0]->sin_rot
- else
- sinrot = ocnf[0]->sinrot
- end if
- if(isfilevar(ocnf[0],"cos_rot"))then
- cosrot = ocnf[0]->cos_rot
- else
- cosrot = ocnf[0]->cosrot
- end if
- z_l = ocnf[0]->z_l
- z_i = ocnf[0]->z_i
- nlevs = dimsizes(z_l)
-
- ; get a 2 and 3 dimensional fields for creating the interpolation masks
- ; the mask2d,mask3d contain 1's on land and 0's at valid points.
- mask2d = where(ismissing(ocnf[0]->SST), 1.0, 0.0)
- mask3d = where(ismissing(ocnf[0]->temp), 1.0, 0.0)
- ;printVarSummary(mask2d)
- ;printVarSummary(mask3d)
-
- ; create conformed rotation arrays to make vector rotations cleaner
- sinrot2d=conform_dims(dimsizes(mask2d),sinrot,(/1,2/))
- cosrot2d=conform_dims(dimsizes(mask2d),cosrot,(/1,2/))
-
- sinrot3d=conform_dims(dimsizes(mask3d),sinrot,(/2,3/))
- cosrot3d=conform_dims(dimsizes(mask3d),cosrot,(/2,3/))
-
- ; check for variables in file. this is only required because
- ; of the missing/misnamed MLD variables in the first BM
- ; only the varlist is checked, since it is assumed there are
- ; no other variables missing after the first benchmark
- valid = new((/nvars/),"logical")
- valid = False
- do nv = 0,nvars-1
- varname = varlist(nv,0)
- if(isfilevar(ocnf[0],varname))then
- valid(nv) = True
- end if
- print(varlist(nv,0)+" "+valid(nv))
- end do
-
-;----------------------------------------------------------------------
-; loop over the output resolutions
-;----------------------------------------------------------------------
-
- jj = 1
- ii = 0
-
- do jj = 0,dimsizes(dstgrds)-1
- ;outres = "_"+dstgrds(jj)+"x"+dstgrds(jj)
- outres = dstgrds(jj)+"x"+dstgrds(jj)
- outgrid = dstgrds(jj)
-
- ; regrid a field to obtain the output xy dimensions
- wgtsfile = nemsrc+"/"+"tripole.mx025.Ct.to."+dsttype+dstgrds(jj)+".bilinear.nc"
- tt = ESMF_regrid_with_weights(sinrot,wgtsfile,False)
- tt!0 = "lat"
- tt!1 = "lon"
- lat = tt&lat
- lon = tt&lon
- dims = dimsizes(tt)
- nlat = dims(0)
- nlon = dims(1)
-
- print("fields will be remapped to destination grid size "\
- +nlon+" "+nlat)
-
- delete(tt)
- delete(dims)
-
- ; regrid the masks to obtain the interpolation masks.
- ; the mask2d,mask3d contain 1's on land and 0's at valid points.
- ; when remapped, any mask value > 0 identifies land values that
- ; have crept into the field. remapped model fields are then
- ; masked with this interpolation mask
-
- wgtsfile = nemsrc+"/"+"tripole.mx025.Ct.to."+dsttype+dstgrds(jj)+".bilinear.nc"
- rgmask2d = ESMF_regrid_with_weights(mask2d, wgtsfile,False)
- rgmask3d = ESMF_regrid_with_weights(mask3d, wgtsfile,False)
-
- if(output_masks)then
- testfile = "masks_"+dstgrds(jj)+".nc"
- system("/bin/rm -f "+testfile)
- ; create
- testcdf = addfile(testfile,"c")
- testcdf->rgmask2d = rgmask2d
- testcdf->rgmask3d = rgmask3d
- ; close
- delete(testcdf)
- end if
-
- ; create the interpolation mask
- rgmask2d = where(rgmask2d .gt. 0.0, rgmask2d@_FillValue, 1.0)
- rgmask3d = where(rgmask3d .gt. 0.0, rgmask3d@_FillValue, 1.0)
-
- ; conformed depth array
- depth = conform_dims(dimsizes(mask3d), z_l, (/1/))
- ;print(dimsizes(depth))
-
-;----------------------------------------------------------------------
-; loop over each file in the ocnfilelist
-;----------------------------------------------------------------------
-;
-
- ; retrieve the time stamp
- time = ocnf[0]->time
- delete(time@bounds)
-
-;----------------------------------------------------------------------
-; set up the output netcdf file
-;----------------------------------------------------------------------
-; system("/bin/rm -f " + outfile) ; remove if exists
-; outcdf = addfile (outfile, "c") ; open output file
-; specify output file information and open file for output
- FILENAME_REGRID = DATA_TMP+"/ocnr"+VDATE+"."+ENSMEM+"."+IDATE+"_"+outres+"_MOM6.nc"
- if (isfilepresent(FILENAME_REGRID)) then
- system("rm -f "+FILENAME_REGRID)
- end if
- outcdf = addfile(FILENAME_REGRID,"c")
- outfile=FILENAME_REGRID
-
- ; explicitly declare file definition mode. Improve efficiency.
- setfileoption(outcdf,"DefineMode",True)
-
- ; create global attributes of the file
- fAtt = True ; assign file attributes
- fAtt@creation_date = systemfunc ("date")
- fAtt@source_file = infile
- fileattdef( outcdf, fAtt ) ; copy file attributes
-
- ; predefine the coordinate variables and their dimensionality
- ; dimNames = (/"time", "z_l", "z_i", "z_T", "lat", "lon"/)
- dimNames = (/"time", "z_l", "z_i", "lat", "lon"/)
- ;dimSizes = (/ -1 , nlevs, nlevs+1, nTd, nlat, nlon/)
- dimSizes = (/ -1 , nlevs, nlevs+1, nlat, nlon/)
- ;dimUnlim = (/ True , False, False, False, False, False/)
- dimUnlim = (/ True , False, False, False, False/)
- filedimdef(outcdf,dimNames,dimSizes,dimUnlim)
-
- ; predefine the the dimensionality of the variables to be written out
- filevardef(outcdf, "time", typeof(time), getvardims(time))
- filevardef(outcdf, "z_l", typeof(z_l), getvardims(z_l))
- filevardef(outcdf, "z_i", typeof(z_i), getvardims(z_i))
- ;filevardef(outcdf, "z_T", typeof(z_T), getvardims(z_T))
- filevardef(outcdf, "lat", typeof(lat), getvardims(lat))
- filevardef(outcdf, "lon", typeof(lon), getvardims(lon))
-
- ; Copy attributes associated with each variable to the file
- filevarattdef(outcdf, "time", time)
- filevarattdef(outcdf, "z_l", z_l)
- filevarattdef(outcdf, "z_i", z_i)
- ;filevarattdef(outcdf, "z_T", z_T)
- filevarattdef(outcdf, "lat", lat)
- filevarattdef(outcdf, "lon", lon)
-
- ; predefine variables
- do nv = 0,nvars-1
- varname = varlist(nv,0)
- vardims = varlist(nv,3)
- if(valid(nv))then
- if(vardims .eq. "2")then
- odims = (/"time", "lat", "lon"/)
- else
- odims = (/"time", "z_l", "lat", "lon"/)
- end if
- ;print("creating variable "+varname+" in file")
- filevardef(outcdf, varname, "float", odims)
- delete(odims)
- end if
- end do
-
- do nv = 0,nvpairs-1
- do nn = 0,1
- vecname = veclist(nv,0,nn)
- vecdims = veclist(nv,3,nn)
- if(vecdims .eq. "2")then
- odims = (/"time", "lat", "lon"/)
- else
- odims = (/"time", "z_l", "lat", "lon"/)
- end if
- ;print("creating variable "+vecname+" in file")
- filevardef(outcdf, vecname, "float", odims)
- delete(odims)
- delete(vecdims)
- end do
- end do
-
- ; explicitly exit file definition mode.
- setfileoption(outcdf,"DefineMode",False)
-
- ; write the dimensions to the file
- outcdf->time = (/time/)
- outcdf->z_l = (/z_l/)
- outcdf->z_i = (/z_i/)
-; outcdf->z_T = (/z_T/)
-;
- outcdf->lat = (/lat/)
- outcdf->lon = (/lon/)
-
-;----------------------------------------------------------------------
-; loop over nvars variables
-;----------------------------------------------------------------------
-
- do nv = 0,nvars-1
- varname = varlist(nv,0)
- vargrid = varlist(nv,1)
- varmeth = varlist(nv,2)
- vardims = varlist(nv,3)
-
- if(valid(nv))then
- ;print(nv+" "+varname+" "+vargrid+" "+varmeth)
- ocnvar = ocnf[ii]->$varname$
- ndims = dimsizes(dimsizes(ocnvar))
- ;print(ndims+" "+dimsizes(ocnvar))
-
- if(vargrid .ne. "Ct")then
- ; print error if the variable is not on the Ct grid
- print("Variable is not on Ct grid")
- exit
- end if
-
- ; regrid to dsttype+dstgrd with method
- ;print("remapping "+varname+" to grid "+dsttype+dstgrds(jj))
- wgtsfile = nemsrc+"/"+"tripole.mx025.Ct.to."+dsttype+dstgrds(jj)+"."+varmeth+".nc"
-
- rgtt = ESMF_regrid_with_weights(ocnvar,wgtsfile,False)
- if(vardims .eq. "2")then
- rgtt = where(ismissing(rgmask2d),ocnvar@_FillValue,rgtt)
- rgtt=rgtt(:,::-1,:)
- else
- rgtt = where(ismissing(rgmask3d),ocnvar@_FillValue,rgtt)
- rgtt=rgtt(:,:,::-1,:)
- end if
-
- ; enter file definition mode to add variable attributes
- setfileoption(outcdf,"DefineMode",True)
- filevarattdef(outcdf, varname, rgtt)
- setfileoption(outcdf,"DefineMode",False)
-
- outcdf->$varname$ = (/rgtt/)
-
- delete(ocnvar)
- delete(rgtt)
-
- ; variable exists
- end if
- ; nv, loop over number of variables
- end do
-
-;----------------------------------------------------------------------
-;
-;----------------------------------------------------------------------
-
- ;nv = 2
- do nv = 0,nvpairs-1
- vecnames = veclist(nv,0,:)
- vecgrids = veclist(nv,1,:)
- vecmeth = veclist(nv,2,:)
- vecdims = veclist(nv,3,:)
- ;print(nv+" "+vecnames+" "+vecgrids+" "+vecmeth)
-
- ; create a vector pair list
- vecpairs = NewList("fifo")
- n = 0
- uvel = ocnf[ii]->$vecnames(n)$
- vecfld = where(ismissing(uvel),0.0,uvel)
- copy_VarAtts(uvel,vecfld)
- ;print("unstagger "+vecnames(n)+" from "+vecgrids(n)+" to Ct")
- wgtsfile = nemsrc+"/"+"tripole.mx025."+vecgrids(n)+".to.Ct.bilinear.nc"
- ut = ESMF_regrid_with_weights(vecfld,wgtsfile,False)
- delete(ut@remap)
-
- n = 1
- vvel = ocnf[ii]->$vecnames(n)$
- vecfld = where(ismissing(vvel),0.0,vvel)
- copy_VarAtts(vvel,vecfld)
- ;print("unstagger "+vecnames(n)+" from "+vecgrids(n)+" to Ct")
- wgtsfile = nemsrc+"/"+"tripole.mx025."+vecgrids(n)+".to.Ct.bilinear.nc"
- vt = ESMF_regrid_with_weights(vecfld,wgtsfile,False)
- delete(vt@remap)
-
- ListAppend(vecpairs,ut)
- ListAppend(vecpairs,vt)
- ;print(vecpairs)
-
- ; rotate
- ; first copy Metadata
- urot = vecpairs[0]
- vrot = vecpairs[1]
- if(vecdims(0) .eq. "2")then
- urot = ut*cosrot2d + vt*sinrot2d
- vrot = vt*cosrot2d - ut*sinrot2d
- else
- urot = ut*cosrot3d + vt*sinrot3d
- vrot = vt*cosrot3d - ut*sinrot3d
- end if
- ; change attribute to indicate these are now rotated velocities
- urot@long_name=str_sub_str(urot@long_name,"X","Zonal")
- vrot@long_name=str_sub_str(vrot@long_name,"Y","Meridional")
- ; copy back
- vecpairs[0] = urot
- vecpairs[1] = vrot
- delete([/urot, vrot/])
-
- ; remap
- do n = 0,1
- vecfld = vecpairs[n]
- ; regrid to dsttype+dstgrd with method
- ;print("remapping "+vecnames(n)+" to grid "+dsttype+dstgrds(jj))
- wgtsfile = nemsrc+"/"+"tripole.mx025.Ct.to."+dsttype+dstgrds(jj)+"."+vecmeth(n)+".nc"
-
- rgtt = ESMF_regrid_with_weights(vecfld,wgtsfile,False)
- if(vecdims(n) .eq. "2")then
- rgtt = where(ismissing(rgmask2d),vecfld@_FillValue,rgtt)
- rgtt=rgtt(:,::-1,:)
- else
- rgtt = where(ismissing(rgmask3d),vecfld@_FillValue,rgtt)
- rgtt=rgtt(:,:,::-1,:)
- end if
-
- ; enter file definition mode to add variable attributes
- setfileoption(outcdf,"DefineMode",True)
- filevarattdef(outcdf, vecnames(n), rgtt)
- setfileoption(outcdf,"DefineMode",False)
-
- outcdf->$vecnames(n)$ = (/rgtt/)
- delete(rgtt)
- end do
- delete([/uvel,vvel,ut,vt,vecfld,vecpairs/])
- delete([/vecnames,vecgrids,vecmeth,vecdims/])
- ; nv, loop over number of vector pairs
- end do
-
-;----------------------------------------------------------------------
-; close the outcdf and continue through filelist
-;----------------------------------------------------------------------
-
- delete(outcdf)
- ; rename mld to ePBL if required
- do nv = 0,nvars-1
- varname = varlist(nv,0)
- ; if(varname .eq. "mld" .and. valid(nv))then
- if(varname .eq. "MLD_003" .and. valid(nv))then
- print("Renaming MLD_003 to mld")
- ;print(ncocmd+" "+outfile)
- system(ncocmd+" "+outfile)
- end if
- end do
-
- ; ii, loop over files
-;
- ;jj, loop over destination grids
- delete([/lat,lon,nlon,nlat/])
- delete([/rgmask2d,rgmask3d/])
- end do
- print("One complete ocn file in " + (get_cpu_time() - begTime) + " seconds")
-exit
-end
diff --git a/ush/parsing_model_configure_DATM.sh b/ush/parsing_model_configure_DATM.sh
deleted file mode 100755
index ecd3fa6dd6..0000000000
--- a/ush/parsing_model_configure_DATM.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#! /usr/bin/env bash
-
-#####
-## "parsing_model_configure_DATM.sh"
-## This script writes model configure file
-## for DATM model
-##
-## This is the child script of ex-global forecast,
-## writing model configure file for DATM
-## This script is a direct execution.
-#####
-
-DATM_model_configure(){
-
-rm -f model_configure
-cat > model_configure <> model_configure <> "${DATA}/model_configure"
+echo "Rendered model_configure"
+cat "${DATA}/model_configure"
-quilting: ${QUILTING}
-quilting_restart: .true.
-write_groups: ${WRITE_GROUP:-1}
-write_tasks_per_group: ${WRTTASK_PER_GROUP:-24}
-itasks: 1
-output_history: ${OUTPUT_HISTORY:-".true."}
-history_file_on_native_grid: .false.
-write_dopost: ${WRITE_DOPOST:-".false."}
-write_nsflip: ${WRITE_NSFLIP:-".false."}
-num_files: ${NUM_FILES:-2}
-filename_base: 'atm' 'sfc'
-output_grid: ${OUTPUT_GRID}
-output_file: '${OUTPUT_FILETYPE_ATM}' '${OUTPUT_FILETYPE_SFC}'
-zstandard_level: 0
-ichunk2d: ${ichunk2d:-0}
-jchunk2d: ${jchunk2d:-0}
-ichunk3d: ${ichunk3d:-0}
-jchunk3d: ${jchunk3d:-0}
-kchunk3d: ${kchunk3d:-0}
-ideflate: ${ideflate:-1}
-quantize_mode: 'quantize_bitround'
-quantize_nsd: ${QUANTIZE_NSD:-0}
-imo: ${LONB_IMO}
-jmo: ${LATB_JMO}
-output_fh: ${FV3_OUTPUT_FH}
-iau_offset: ${IAU_OFFSET:-0}
-EOF
-
-echo "$(cat model_configure)"
}
diff --git a/ush/parsing_namelists_CICE.sh b/ush/parsing_namelists_CICE.sh
index 6ef743ebc9..d749e6d890 100755
--- a/ush/parsing_namelists_CICE.sh
+++ b/ush/parsing_namelists_CICE.sh
@@ -2,6 +2,8 @@
# parsing namelist of CICE
+# Disable variable not used warnings
+# shellcheck disable=SC2034
CICE_namelists(){
# "warm_start" here refers to whether CICE model is warm starting or not.
@@ -37,374 +39,80 @@ if (( $(( NY_GLB % NPY )) == 0 )); then
else
local block_size_y=$(( (NY_GLB / NPY) + 1 ))
fi
-local max_blocks=-1
local sec stepsperhr npt
sec=$(to_seconds "${current_cycle:8:2}0000")
stepsperhr=$((3600/ICETIM))
npt=$((FHMAX*stepsperhr)) # Need this in order for dump_last to work
-cat > ice_in <> "${DATA}/ice_in"
+echo "Rendered ice_in:"
+cat "${DATA}/ice_in"
}
diff --git a/ush/parsing_namelists_FV3.sh b/ush/parsing_namelists_FV3.sh
index 531afaa55a..38493ee827 100755
--- a/ush/parsing_namelists_FV3.sh
+++ b/ush/parsing_namelists_FV3.sh
@@ -9,12 +9,14 @@
## This script is a direct execution.
#####
+# Disable variable not used warnings
+# shellcheck disable=SC2034
FV3_namelists(){
# setup the tables
DIAG_TABLE=${DIAG_TABLE:-${HOMEgfs}/parm/ufs/fv3/diag_table}
DIAG_TABLE_APPEND=${DIAG_TABLE_APPEND:-${HOMEgfs}/parm/ufs/fv3/diag_table_aod}
-DATA_TABLE=${DATA_TABLE:-${HOMEgfs}/parm/ufs/fv3/data_table}
+DATA_TABLE=${DATA_TABLE:-${HOMEgfs}/parm/ufs/MOM6_data_table.IN}
FIELD_TABLE=${FIELD_TABLE:-${HOMEgfs}/parm/ufs/fv3/field_table}
# ensure non-prognostic tracers are set
@@ -33,7 +35,15 @@ if [[ -n "${AERO_DIAG_TABLE:-}" ]]; then
cat "${AERO_DIAG_TABLE}"
fi
cat "${DIAG_TABLE_APPEND}"
-} >> diag_table
+} >> diag_table_template
+
+local template=diag_table_template
+local SYEAR=${current_cycle:0:4}
+local SMONTH=${current_cycle:4:2}
+local SDAY=${current_cycle:6:2}
+local CHOUR=${current_cycle:8:2}
+source "${HOMEgfs}/ush/atparse.bash"
+atparse < "${template}" >> "diag_table"
# copy data table
diff --git a/ush/parsing_namelists_MOM6.sh b/ush/parsing_namelists_MOM6.sh
index 8059096363..ca93edb526 100755
--- a/ush/parsing_namelists_MOM6.sh
+++ b/ush/parsing_namelists_MOM6.sh
@@ -1,15 +1,14 @@
#! /usr/bin/env bash
+# Disable variable not used warnings
+# shellcheck disable=SC2034
MOM6_namelists(){
# MOM6 namelists generation
-if [[ "${cplwav}" == ".true." ]] ; then
- local MOM6_USE_WAVES='True'
-else
- local MOM6_USE_WAVES='False'
-fi
-
+# ================================================================
+# input.nml
+# ---------
cat >> input.nml <> input.nml <> input.nml <> input.nml < "${DATA}/INPUT/MOM_input"
-rm "${DATA}/INPUT/MOM_input_template_${OCNRES}"
+# ================================================================
+# MOM_input
+# ---------
+# Prepare local variables for use in MOM_input.IN from UFSWM
+# The ones already defined are left commented as a reminder
+# == MOM_domains section ==
+# NX_GLB
+# NY_GLB
+# == MOM section ==
+# DT_DYNAM_MOM6
+# DT_THERM_MOM6
+# MOM6_THERMO_SPAN
+# == MOM_grid_init section ==
+local MOM6_TOPOEDITS=${TOPOEDITS}
+# MOM6_ALLOW_LANDMASK_CHANGES
+# == MOM_diag_mediator section ==
+# MOM6_DIAG_COORD_DEF_Z_FILE
+# MOM6_DIAG_MISVAL
+# == MOM_diabatic_aux section ==
+local MOM6_CHLCLIM=${CHLCLIM}
+# == MOM_energetic_PBL section ==
+# MOM6_USE_LI2016
+if [[ "${cplwav}" == ".true." ]] ; then
+ local MOM6_USE_WAVES="True"
+else
+ local MOM6_USE_WAVES="False"
+fi
+# == MOM_oda_incupd section ==
+local ODA_TEMPINC_VAR="Temp"
+local ODA_SALTINC_VAR="Salt"
+local ODA_THK_VAR="h"
+local ODA_INCUPD_UV="True"
+local ODA_UINC_VAR="u"
+local ODA_VINC_VAR="v"
+# ODA_INCUPD
+# ODA_INCUPD_NHOURS
+# == MOM_surface_forcing section ==
+# MOM6_RIVER_RUNOFF
+# == ocean_stochastics section ==
+if [[ "${DO_OCN_SPPT}" == "YES" ]]; then
+ local DO_OCN_SPPT="True" # TODO: This is problematic if DO_OCN_SPPT is going to be used elsewhere
+else
+ local DO_OCN_SPPT="False"
+fi
+if [[ "${DO_OCN_PERT_EPBL}" == "YES" ]]; then
+ local PERT_EPBL="True"
+else
+ local PERT_EPBL="False"
+fi
+# Ensure the template exists
+local template=${MOM6_INPUT_TEMPLATE:-"${HOMEgfs}/parm/ufs/MOM_input_${OCNRES}.IN"}
+if [[ ! -f "${template}" ]]; then
+ echo "FATAL ERROR: template '${template}' does not exist, ABORT!"
+ exit 1
+fi
+rm -f "${DATA}/INPUT/MOM_input"
+atparse < "${template}" >> "${DATA}/INPUT/MOM_input"
+echo "Rendered MOM_input:"
+cat "${DATA}/INPUT/MOM_input"
-#data table for runoff:
-DATA_TABLE=${DATA_TABLE:-${HOMEgfs}/parm/ufs/fv3/data_table}
-${NCP} "${DATA_TABLE}" "${DATA}/data_table_template"
-sed -e "s/@\[FRUNOFF\]/${FRUNOFF}/g" "${DATA}/data_table_template" > "${DATA}/data_table"
-rm "${DATA}/data_table_template"
+# ================================================================
+# data_table
+# ----------
+# Prepare local variables for use in MOM6_data_table.IN from UFSWM
+local MOM6_FRUNOFF=${FRUNOFF}
+
+# Ensure the template exists
+local template=${MOM6_DATA_TABLE_TEMPLATE:-"${HOMEgfs}/parm/ufs/MOM6_data_table.IN"}
+if [[ ! -f "${template}" ]]; then
+ echo "FATAL ERROR: template '${template}' does not exist, ABORT!"
+ exit 1
+fi
+rm -f "${DATA}/data_table"
+atparse < "${template}" >> "${DATA}/data_table"
+echo "Rendered data_table:"
+cat "${DATA}/data_table"
}
diff --git a/ush/ufs_configure.sh b/ush/parsing_ufs_configure.sh
similarity index 81%
rename from ush/ufs_configure.sh
rename to ush/parsing_ufs_configure.sh
index 8898d11162..bec5c8f0f6 100755
--- a/ush/ufs_configure.sh
+++ b/ush/parsing_ufs_configure.sh
@@ -1,36 +1,31 @@
#! /usr/bin/env bash
#####
-## This script writes ufs.configure file
-## first, select a "*.IN" templates based on
-## $confignamevarforufs and parse values based on
-## $cpl** switches.
-##
-## This is a child script of modular
-## forecast script. This script is definition only (Is it? There is nothing defined here being used outside this script.)
+## This script writes ufs.configure file based on a template defined in
+## ${ufs_configure_template}
#####
# Disable variable not used warnings
# shellcheck disable=SC2034
writing_ufs_configure() {
-echo "SUB ${FUNCNAME[0]}: ufs.configure.sh begins"
+echo "SUB ${FUNCNAME[0]}: ufs.configure begins"
# Setup ufs.configure
-local DumpFields=${NEMSDumpFields:-false}
+local esmf_logkind=${esmf_logkind:-"ESMF_LOGKIND_MULTI"} #options: ESMF_LOGKIND_MULTI_ON_ERROR, ESMF_LOGKIND_MULTI, ESMF_LOGKIND_NONE
+local DumpFields=${DumpFields:-false}
local cap_dbug_flag=${cap_dbug_flag:-0}
+
# Determine "cmeps_run_type" based on the availability of the mediator restart file
# If it is a warm_start, we already copied the mediator restart to DATA, if it was present
# If the mediator restart was not present, despite being a "warm_start", we put out a WARNING
-# in forecast_postdet.sh
+# in forecast_postdet.sh function CMEPS_postdet
if [[ -f "${DATA}/ufs.cpld.cpl.r.nc" ]]; then
local cmeps_run_type='continue'
else
local cmeps_run_type='startup'
fi
-local esmf_logkind=${esmf_logkind:-"ESMF_LOGKIND_MULTI"} #options: ESMF_LOGKIND_MULTI_ON_ERROR, ESMF_LOGKIND_MULTI, ESMF_LOGKIND_NONE
-
# Atm-related
local atm_model="fv3"
local atm_petlist_bounds="0 $(( ATMPETS-1 ))"
@@ -53,12 +48,14 @@ if [[ "${cplflx}" = ".true." ]]; then
local ocn_petlist_bounds="${ATMPETS} $(( ATMPETS+OCNPETS-1 ))"
local ocn_omp_num_threads="${OCNTHREADS}"
local RUNTYPE="${cmeps_run_type}"
+ local CMEPS_RESTART_DIR="CMEPS_RESTART/"
local CPLMODE="${cplmode}"
local coupling_interval_fast_sec="${CPL_FAST}"
local RESTART_N="${restart_interval}"
local ocean_albedo_limit=0.06
local ATMTILESIZE="${CASE:1}"
local ocean_albedo_limit=0.06
+ local pio_rearranger=${pio_rearranger:-"box"}
fi
if [[ "${cplice}" = ".true." ]]; then
@@ -66,7 +63,6 @@ if [[ "${cplice}" = ".true." ]]; then
local ice_model="cice6"
local ice_petlist_bounds="$(( ATMPETS+OCNPETS )) $(( ATMPETS+OCNPETS+ICEPETS-1 ))"
local ice_omp_num_threads="${ICETHREADS}"
- local MESH_OCN_ICE=${MESH_OCN_ICE:-"mesh.mx${ICERES}.nc"}
local FHMAX="${FHMAX_GFS}" # TODO: How did this get in here hard-wired to FHMAX_GFS?
fi
@@ -76,6 +72,7 @@ if [[ "${cplwav}" = ".true." ]]; then
local wav_petlist_bounds="$(( ATMPETS+OCNPETS+ICEPETS )) $(( ATMPETS+OCNPETS+ICEPETS+WAVPETS-1 ))"
local wav_omp_num_threads="${WAVTHREADS}"
local MULTIGRID="${waveMULTIGRID}"
+ local WW3_user_sets_restname="false"
fi
@@ -84,7 +81,7 @@ if [[ "${cplchm}" = ".true." ]]; then
local chm_model="gocart"
local chm_petlist_bounds="0 $(( CHMPETS-1 ))"
local chm_omp_num_threads="${CHMTHREADS}"
- local coupling_interval_fast_sec="${CPL_FAST}"
+ local coupling_interval_sec="${CPL_FAST}"
fi
@@ -92,6 +89,8 @@ fi
if [[ ! -r "${ufs_configure_template}" ]]; then
echo "FATAL ERROR: template '${ufs_configure_template}' does not exist, ABORT!"
exit 1
+else
+ echo "INFO: using ufs.configure template: '${ufs_configure_template}'"
fi
source "${HOMEgfs}/ush/atparse.bash"
@@ -102,6 +101,6 @@ 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 ${ufs_configure_template}"
+echo "SUB ${FUNCNAME[0]}: ufs.configure ends"
}
diff --git a/ush/preamble.sh b/ush/preamble.sh
index be64684aa8..d10d7541c8 100644
--- a/ush/preamble.sh
+++ b/ush/preamble.sh
@@ -16,6 +16,8 @@
# TRACE (YES/NO): Whether to echo every command (set -x) [default: "YES"]
# STRICT (YES/NO): Whether to exit immediately on error or undefined variable
# (set -eu) [default: "YES"]
+# POSTAMBLE_CMD (empty/set): A command to run at the end of the job
+# [default: empty]
#
#######
set +x
@@ -70,6 +72,24 @@ postamble() {
start_time="${2}"
rc="${3}"
+ # Execute postamble command
+ #
+ # Commands can be added to the postamble by appending them to $POSTAMBLE_CMD:
+ # POSTAMBLE_CMD="new_thing; ${POSTAMBLE_CMD:-}" # (before existing commands)
+ # POSTAMBLE_CMD="${POSTAMBLE_CMD:-}; new_thing" # (after existing commands)
+ #
+ # Always use this form so previous POSTAMBLE_CMD are not overwritten. This should
+ # only be used for commands that execute conditionally (i.e. on certain machines
+ # or jobs). Global changes should just be added to this function.
+ # These commands will be called when EACH SCRIPT terminates, so be mindful. Please
+ # consult with global-workflow CMs about permanent changes to $POSTAMBLE_CMD or
+ # this postamble function.
+ #
+
+ if [[ -v 'POSTAMBLE_CMD' ]]; then
+ ${POSTAMBLE_CMD}
+ fi
+
# Calculate the elapsed time
end_time=$(date +%s)
end_time_human=$(date -d@"${end_time}" -u +%H:%M:%S)
diff --git a/ush/python/pygfs/task/analysis.py b/ush/python/pygfs/task/analysis.py
index cfd1fb2206..5709bc130e 100644
--- a/ush/python/pygfs/task/analysis.py
+++ b/ush/python/pygfs/task/analysis.py
@@ -25,6 +25,8 @@ class Analysis(Task):
def __init__(self, config: Dict[str, Any]) -> None:
super().__init__(config)
self.config.ntiles = 6
+ # Store location of GDASApp jinja2 templates
+ self.gdasapp_j2tmpl_dir = os.path.join(self.config.HOMEgfs, 'parm/gdas')
def initialize(self) -> None:
super().initialize()
@@ -56,7 +58,7 @@ def get_obs_dict(self) -> Dict[str, Any]:
a dictionary containing the list of observation files to copy for FileHandler
"""
logger.debug(f"OBS_LIST: {self.task_config['OBS_LIST']}")
- obs_list_config = parse_j2yaml(self.task_config["OBS_LIST"], self.task_config)
+ obs_list_config = parse_j2yaml(self.task_config["OBS_LIST"], self.task_config, searchpath=self.gdasapp_j2tmpl_dir)
logger.debug(f"obs_list_config: {obs_list_config}")
# get observers from master dictionary
observers = obs_list_config['observers']
@@ -88,7 +90,7 @@ def get_bias_dict(self) -> Dict[str, Any]:
a dictionary containing the list of observation bias files to copy for FileHandler
"""
logger.debug(f"OBS_LIST: {self.task_config['OBS_LIST']}")
- obs_list_config = parse_j2yaml(self.task_config["OBS_LIST"], self.task_config)
+ obs_list_config = parse_j2yaml(self.task_config["OBS_LIST"], self.task_config, searchpath=self.gdasapp_j2tmpl_dir)
logger.debug(f"obs_list_config: {obs_list_config}")
# get observers from master dictionary
observers = obs_list_config['observers']
@@ -99,7 +101,7 @@ def get_bias_dict(self) -> Dict[str, Any]:
obdir = os.path.dirname(obfile)
basename = os.path.basename(obfile)
prefix = '.'.join(basename.split('.')[:-2])
- for file in ['satbias.nc4', 'satbias_cov.nc4', 'tlapse.txt']:
+ for file in ['satbias.nc', 'satbias_cov.nc', 'tlapse.txt']:
bfile = f"{prefix}.{file}"
copylist.append([os.path.join(self.task_config.COM_ATMOS_ANALYSIS_PREV, bfile), os.path.join(obdir, bfile)])
@@ -311,13 +313,13 @@ def tgz_diags(statfile: str, diagdir: str) -> None:
Parameters
----------
statfile : str | os.PathLike
- Path to the output .tar.gz .tgz file that will contain the diag*.nc4 files e.g. atmstat.tgz
+ Path to the output .tar.gz .tgz file that will contain the diag*.nc files e.g. atmstat.tgz
diagdir : str | os.PathLike
Directory containing JEDI diag files
"""
# get list of diag files to put in tarball
- diags = glob.glob(os.path.join(diagdir, 'diags', 'diag*nc4'))
+ diags = glob.glob(os.path.join(diagdir, 'diags', 'diag*nc'))
logger.info(f"Compressing {len(diags)} diag files to {statfile}")
diff --git a/ush/python/pygfs/task/atm_analysis.py b/ush/python/pygfs/task/atm_analysis.py
index da41574fc9..7e2ae87b6b 100644
--- a/ush/python/pygfs/task/atm_analysis.py
+++ b/ush/python/pygfs/task/atm_analysis.py
@@ -94,7 +94,7 @@ def initialize(self: Analysis) -> None:
'NMEM_ENS', 'DATA', 'current_cycle', 'ntiles']
for key in keys:
localconf[key] = self.task_config[key]
- localconf.RUN = 'enkf' + self.task_config.RUN
+ localconf.RUN = 'enkfgdas'
localconf.dirname = 'ens'
FileHandler(self.get_fv3ens_dict(localconf)).sync()
@@ -152,7 +152,7 @@ def finalize(self: Analysis) -> None:
atmstat = os.path.join(self.task_config.COM_ATMOS_ANALYSIS, f"{self.task_config.APREFIX}atmstat")
# get list of diag files to put in tarball
- diags = glob.glob(os.path.join(self.task_config.DATA, 'diags', 'diag*nc4'))
+ diags = glob.glob(os.path.join(self.task_config.DATA, 'diags', 'diag*nc'))
logger.info(f"Compressing {len(diags)} diag files to {atmstat}.gz")
diff --git a/ush/python/pygfs/task/atmens_analysis.py b/ush/python/pygfs/task/atmens_analysis.py
index 9cf84c07c7..7b81a10f32 100644
--- a/ush/python/pygfs/task/atmens_analysis.py
+++ b/ush/python/pygfs/task/atmens_analysis.py
@@ -188,7 +188,7 @@ def finalize(self: Analysis) -> None:
atmensstat = os.path.join(self.task_config.COM_ATMOS_ANALYSIS_ENS, f"{self.task_config.APREFIX}atmensstat")
# get list of diag files to put in tarball
- diags = glob.glob(os.path.join(self.task_config.DATA, 'diags', 'diag*nc4'))
+ diags = glob.glob(os.path.join(self.task_config.DATA, 'diags', 'diag*nc'))
logger.info(f"Compressing {len(diags)} diag files to {atmensstat}.gz")
diff --git a/ush/python/pygfs/task/oceanice_products.py b/ush/python/pygfs/task/oceanice_products.py
new file mode 100644
index 0000000000..c865a9f408
--- /dev/null
+++ b/ush/python/pygfs/task/oceanice_products.py
@@ -0,0 +1,337 @@
+#!/usr/bin/env python3
+
+import os
+from logging import getLogger
+from typing import List, Dict, Any
+from pprint import pformat
+import xarray as xr
+
+from wxflow import (AttrDict,
+ parse_j2yaml,
+ FileHandler,
+ Jinja,
+ logit,
+ Task,
+ add_to_datetime, to_timedelta,
+ WorkflowException,
+ Executable)
+
+logger = getLogger(__name__.split('.')[-1])
+
+
+class OceanIceProducts(Task):
+ """Ocean Ice Products Task
+ """
+
+ VALID_COMPONENTS = ['ocean', 'ice']
+ COMPONENT_RES_MAP = {'ocean': 'OCNRES', 'ice': 'ICERES'}
+ VALID_PRODUCT_GRIDS = {'mx025': ['1p00', '0p25'],
+ 'mx050': ['1p00', '0p50'],
+ 'mx100': ['1p00'],
+ 'mx500': ['5p00']}
+
+ # These could be read from the yaml file
+ TRIPOLE_DIMS_MAP = {'mx025': [1440, 1080], 'mx050': [720, 526], 'mx100': [360, 320], 'mx500': [72, 35]}
+ LATLON_DIMS_MAP = {'0p25': [1440, 721], '0p50': [720, 361], '1p00': [360, 181], '5p00': [72, 36]}
+
+ @logit(logger, name="OceanIceProducts")
+ def __init__(self, config: Dict[str, Any]) -> None:
+ """Constructor for the Ocean/Ice Productstask
+
+ Parameters
+ ----------
+ config : Dict[str, Any]
+ Incoming configuration for the task from the environment
+
+ Returns
+ -------
+ None
+ """
+ super().__init__(config)
+
+ if self.config.COMPONENT not in self.VALID_COMPONENTS:
+ raise NotImplementedError(f'{self.config.COMPONENT} is not a valid model component.\n' +
+ 'Valid model components are:\n' +
+ f'{", ".join(self.VALID_COMPONENTS)}')
+
+ model_grid = f"mx{self.config[self.COMPONENT_RES_MAP[self.config.COMPONENT]]:03d}"
+
+ valid_datetime = add_to_datetime(self.runtime_config.current_cycle, to_timedelta(f"{self.config.FORECAST_HOUR}H"))
+
+ # 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}"
+
+ localdict = AttrDict(
+ {'component': self.config.COMPONENT,
+ 'forecast_hour': self.config.FORECAST_HOUR,
+ 'valid_datetime': valid_datetime,
+ 'avg_period': avg_period,
+ 'model_grid': model_grid,
+ 'product_grids': self.VALID_PRODUCT_GRIDS[model_grid]}
+ )
+ self.task_config = AttrDict(**self.config, **self.runtime_config, **localdict)
+
+ # Read the oceanice_products.yaml file for common configuration
+ logger.info(f"Read the ocean ice products configuration yaml file {self.config.OCEANICEPRODUCTS_CONFIG}")
+ self.task_config.oceanice_yaml = parse_j2yaml(self.config.OCEANICEPRODUCTS_CONFIG, self.task_config)
+ logger.debug(f"oceanice_yaml:\n{pformat(self.task_config.oceanice_yaml)}")
+
+ @staticmethod
+ @logit(logger)
+ def initialize(config: Dict) -> None:
+ """Initialize the work directory by copying all the common fix data
+
+ Parameters
+ ----------
+ config : Dict
+ Configuration dictionary for the task
+
+ Returns
+ -------
+ None
+ """
+
+ # Copy static data to run directory
+ logger.info("Copy static data to run directory")
+ FileHandler(config.oceanice_yaml.ocnicepost.fix_data).sync()
+
+ # Copy "component" specific model data to run directory (e.g. ocean/ice forecast output)
+ logger.info(f"Copy {config.component} data to run directory")
+ FileHandler(config.oceanice_yaml[config.component].data_in).sync()
+
+ @staticmethod
+ @logit(logger)
+ def configure(config: Dict, product_grid: str) -> None:
+ """Configure the namelist for the product_grid in the work directory.
+ Create namelist 'ocnicepost.nml' from template
+
+ Parameters
+ ----------
+ config : Dict
+ Configuration dictionary for the task
+ product_grid : str
+ Target product grid to process
+
+ Returns
+ -------
+ None
+ """
+
+ # Make a localconf with the "component" specific configuration for parsing the namelist
+ localconf = AttrDict()
+ localconf.DATA = config.DATA
+ localconf.component = config.component
+
+ localconf.source_tripole_dims = ', '.join(map(str, OceanIceProducts.TRIPOLE_DIMS_MAP[config.model_grid]))
+ localconf.target_latlon_dims = ', '.join(map(str, OceanIceProducts.LATLON_DIMS_MAP[product_grid]))
+
+ localconf.maskvar = config.oceanice_yaml[config.component].namelist.maskvar
+ localconf.sinvar = config.oceanice_yaml[config.component].namelist.sinvar
+ localconf.cosvar = config.oceanice_yaml[config.component].namelist.cosvar
+ localconf.angvar = config.oceanice_yaml[config.component].namelist.angvar
+ localconf.debug = ".true." if config.oceanice_yaml.ocnicepost.namelist.debug else ".false."
+
+ logger.debug(f"localconf:\n{pformat(localconf)}")
+
+ # Configure the namelist and write to file
+ logger.info("Create namelist for ocnicepost.x")
+ nml_template = os.path.join(localconf.DATA, "ocnicepost.nml.jinja2")
+ nml_data = Jinja(nml_template, localconf).render
+ logger.debug(f"ocnicepost_nml:\n{nml_data}")
+ nml_file = os.path.join(localconf.DATA, "ocnicepost.nml")
+ with open(nml_file, "w") as fho:
+ fho.write(nml_data)
+
+ @staticmethod
+ @logit(logger)
+ def execute(config: Dict, product_grid: str) -> None:
+ """Run the ocnicepost.x executable to interpolate and convert to grib2
+
+ Parameters
+ ----------
+ config : Dict
+ Configuration dictionary for the task
+ product_grid : str
+ Target product grid to process
+
+ Returns
+ -------
+ None
+ """
+
+ # Run the ocnicepost.x executable
+ OceanIceProducts.interp(config.DATA, config.APRUN_OCNICEPOST, exec_name="ocnicepost.x")
+
+ # Convert interpolated netCDF file to grib2
+ OceanIceProducts.netCDF_to_grib2(config, product_grid)
+
+ @staticmethod
+ @logit(logger)
+ def interp(workdir: str, aprun_cmd: str, exec_name: str = "ocnicepost.x") -> None:
+ """
+ Run the interpolation executable to generate rectilinear netCDF file
+
+ Parameters
+ ----------
+ config : Dict
+ Configuration dictionary for the task
+ workdir : str
+ Working directory for the task
+ aprun_cmd : str
+ aprun command to use
+ exec_name : str
+ Name of the executable e.g. ocnicepost.x
+
+ Returns
+ -------
+ None
+ """
+ os.chdir(workdir)
+ logger.debug(f"Current working directory: {os.getcwd()}")
+
+ exec_cmd = Executable(aprun_cmd)
+ exec_cmd.add_default_arg(os.path.join(workdir, exec_name))
+
+ OceanIceProducts._call_executable(exec_cmd)
+
+ @staticmethod
+ @logit(logger)
+ def netCDF_to_grib2(config: Dict, grid: str) -> None:
+ """Convert interpolated netCDF file to grib2
+
+ Parameters
+ ----------
+ config : Dict
+ Configuration dictionary for the task
+ grid : str
+ Target product grid to process
+
+ Returns
+ ------
+ None
+ """
+
+ os.chdir(config.DATA)
+
+ exec_cmd = Executable(config.oceanice_yaml.nc2grib2.script)
+ arguments = [config.component, grid, config.current_cycle.strftime("%Y%m%d%H"), config.avg_period]
+ if config.component == 'ocean':
+ levs = config.oceanice_yaml.ocean.namelist.ocean_levels
+ arguments.append(':'.join(map(str, levs)))
+
+ logger.info(f"Executing {exec_cmd} with arguments {arguments}")
+ try:
+ exec_cmd(*arguments)
+ except OSError:
+ logger.exception(f"FATAL ERROR: Failed to execute {exec_cmd}")
+ raise OSError(f"{exec_cmd}")
+ except Exception:
+ logger.exception(f"FATAL ERROR: Error occurred during execution of {exec_cmd}")
+ raise WorkflowException(f"{exec_cmd}")
+
+ @staticmethod
+ @logit(logger)
+ def subset(config: Dict) -> None:
+ """
+ Subset a list of variables from a netcdf file and save to a new netcdf file.
+ Also save global attributes and history from the old netcdf file into new netcdf file
+
+ Parameters
+ ----------
+ config : Dict
+ Configuration dictionary for the task
+
+ Returns
+ -------
+ None
+ """
+
+ os.chdir(config.DATA)
+
+ input_file = f"{config.component}.nc"
+ output_file = f"{config.component}_subset.nc"
+ varlist = config.oceanice_yaml[config.component].subset
+
+ logger.info(f"Subsetting {varlist} from {input_file} to {output_file}")
+
+ try:
+ # open the netcdf file
+ ds = xr.open_dataset(input_file)
+
+ # subset the variables
+ ds_subset = ds[varlist]
+
+ # save global attributes from the old netcdf file into new netcdf file
+ ds_subset.attrs = ds.attrs
+
+ # save subsetted variables to a new netcdf file
+ ds_subset.to_netcdf(output_file)
+
+ except FileNotFoundError:
+ logger.exception(f"FATAL ERROR: Input file not found: {input_file}")
+ raise FileNotFoundError(f"File not found: {input_file}")
+
+ except IOError as err:
+ logger.exception(f"FATAL ERROR: IOError occurred during netCDF subset: {input_file}")
+ raise IOError(f"An I/O error occurred: {err}")
+
+ except Exception as err:
+ logger.exception(f"FATAL ERROR: Error occurred during netCDF subset: {input_file}")
+ raise WorkflowException(f"{err}")
+
+ finally:
+ # close the netcdf files
+ ds.close()
+ ds_subset.close()
+
+ @staticmethod
+ @logit(logger)
+ def _call_executable(exec_cmd: Executable) -> None:
+ """Internal method to call executable
+
+ Parameters
+ ----------
+ exec_cmd : Executable
+ Executable to run
+
+ Raises
+ ------
+ OSError
+ Failure due to OS issues
+ WorkflowException
+ All other exceptions
+ """
+
+ logger.info(f"Executing {exec_cmd}")
+ try:
+ exec_cmd()
+ except OSError:
+ logger.exception(f"FATAL ERROR: Failed to execute {exec_cmd}")
+ raise OSError(f"{exec_cmd}")
+ except Exception:
+ logger.exception(f"FATAL ERROR: Error occurred during execution of {exec_cmd}")
+ raise WorkflowException(f"{exec_cmd}")
+
+ @staticmethod
+ @logit(logger)
+ def finalize(config: Dict) -> None:
+ """Perform closing actions of the task.
+ Copy data back from the DATA/ directory to COM/
+
+ Parameters
+ ----------
+ config: Dict
+ Configuration dictionary for the task
+
+ Returns
+ -------
+ None
+ """
+
+ # Copy "component" specific generated data to COM/ directory
+ data_out = config.oceanice_yaml[config.component].data_out
+
+ logger.info(f"Copy processed data to COM/ directory")
+ FileHandler(data_out).sync()
diff --git a/ush/python/pygfs/task/land_analysis.py b/ush/python/pygfs/task/snow_analysis.py
similarity index 90%
rename from ush/python/pygfs/task/land_analysis.py
rename to ush/python/pygfs/task/snow_analysis.py
index 307e875183..9eee8314c3 100644
--- a/ush/python/pygfs/task/land_analysis.py
+++ b/ush/python/pygfs/task/snow_analysis.py
@@ -11,7 +11,7 @@
FileHandler,
to_fv3time, to_YMD, to_YMDH, to_timedelta, add_to_datetime,
rm_p,
- parse_j2yaml, parse_yamltmpl, save_as_yaml,
+ parse_j2yaml, save_as_yaml,
Jinja,
logit,
Executable,
@@ -21,14 +21,14 @@
logger = getLogger(__name__.split('.')[-1])
-class LandAnalysis(Analysis):
+class SnowAnalysis(Analysis):
"""
- Class for global land analysis tasks
+ Class for global snow analysis tasks
"""
- NMEM_LANDENS = 2 # The size of the land ensemble is fixed at 2. Does this need to be a variable?
+ NMEM_SNOWENS = 2
- @logit(logger, name="LandAnalysis")
+ @logit(logger, name="SnowAnalysis")
def __init__(self, config):
super().__init__(config)
@@ -43,8 +43,8 @@ def __init__(self, config):
'npy_ges': _res + 1,
'npz_ges': self.config.LEVS - 1,
'npz': self.config.LEVS - 1,
- 'LAND_WINDOW_BEGIN': _window_begin,
- 'LAND_WINDOW_LENGTH': f"PT{self.config['assim_freq']}H",
+ 'SNOW_WINDOW_BEGIN': _window_begin,
+ 'SNOW_WINDOW_LENGTH': f"PT{self.config['assim_freq']}H",
'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.",
'jedi_yaml': _letkfoi_yaml
@@ -56,9 +56,9 @@ def __init__(self, config):
@logit(logger)
def prepare_GTS(self) -> None:
- """Prepare the GTS data for a global land analysis
+ """Prepare the GTS data for a global snow analysis
- This method will prepare GTS data for a global land analysis using JEDI.
+ This method will prepare GTS data for a global snow analysis using JEDI.
This includes:
- processing GTS bufr snow depth observation data to IODA format
@@ -74,7 +74,7 @@ def prepare_GTS(self) -> None:
# create a temporary dict of all keys needed in this method
localconf = AttrDict()
keys = ['HOMEgfs', 'DATA', 'current_cycle', 'COM_OBS', 'COM_ATMOS_RESTART_PREV',
- 'OPREFIX', 'CASE', 'ntiles']
+ 'OPREFIX', 'CASE', 'OCNRES', 'ntiles']
for key in keys:
localconf[key] = self.task_config[key]
@@ -99,7 +99,7 @@ def prepare_GTS(self) -> None:
def _gtsbufr2iodax(exe, yaml_file):
if not os.path.isfile(yaml_file):
- logger.exception(f"{yaml_file} not found")
+ logger.exception(f"FATAL ERROR: {yaml_file} not found")
raise FileNotFoundError(yaml_file)
logger.info(f"Executing {exe}")
@@ -133,9 +133,9 @@ def _gtsbufr2iodax(exe, yaml_file):
@logit(logger)
def prepare_IMS(self) -> None:
- """Prepare the IMS data for a global land analysis
+ """Prepare the IMS data for a global snow analysis
- This method will prepare IMS data for a global land analysis using JEDI.
+ This method will prepare IMS data for a global snow analysis using JEDI.
This includes:
- staging model backgrounds
- processing raw IMS observation data and prepare for conversion to IODA
@@ -153,7 +153,7 @@ def prepare_IMS(self) -> None:
# create a temporary dict of all keys needed in this method
localconf = AttrDict()
keys = ['DATA', 'current_cycle', 'COM_OBS', 'COM_ATMOS_RESTART_PREV',
- 'OPREFIX', 'CASE', 'OCNRES', 'ntiles']
+ 'OPREFIX', 'CASE', 'OCNRES', 'ntiles', 'FIXgfs']
for key in keys:
localconf[key] = self.task_config[key]
@@ -198,7 +198,7 @@ def prepare_IMS(self) -> None:
raise WorkflowException(f"An error occured during execution of {exe}")
# Ensure the snow depth IMS file is produced by the above executable
- input_file = f"IMSscf.{to_YMD(localconf.current_cycle)}.{localconf.CASE}.mx{localconf.OCNRES}_oro_data.nc"
+ input_file = f"IMSscf.{to_YMD(localconf.current_cycle)}.{localconf.CASE}_oro_data.nc"
if not os.path.isfile(f"{os.path.join(localconf.DATA, input_file)}"):
logger.exception(f"{self.task_config.CALCFIMSEXE} failed to produce {input_file}")
raise FileNotFoundError(f"{os.path.join(localconf.DATA, input_file)}")
@@ -232,7 +232,7 @@ def prepare_IMS(self) -> None:
@logit(logger)
def initialize(self) -> None:
- """Initialize method for Land analysis
+ """Initialize method for snow analysis
This method:
- creates artifacts in the DATA directory by copying fix files
- creates the JEDI LETKF yaml from the template
@@ -241,7 +241,7 @@ def initialize(self) -> None:
Parameters
----------
self : Analysis
- Instance of the LandAnalysis object
+ Instance of the SnowAnalysis object
"""
super().initialize()
@@ -249,20 +249,20 @@ def initialize(self) -> None:
# create a temporary dict of all keys needed in this method
localconf = AttrDict()
keys = ['DATA', 'current_cycle', 'COM_OBS', 'COM_ATMOS_RESTART_PREV',
- 'OPREFIX', 'CASE', 'ntiles']
+ 'OPREFIX', 'CASE', 'OCNRES', 'ntiles']
for key in keys:
localconf[key] = self.task_config[key]
# Make member directories in DATA for background
dirlist = []
- for imem in range(1, LandAnalysis.NMEM_LANDENS + 1):
+ for imem in range(1, SnowAnalysis.NMEM_SNOWENS + 1):
dirlist.append(os.path.join(localconf.DATA, 'bkg', f'mem{imem:03d}'))
FileHandler({'mkdir': dirlist}).sync()
# stage fix files
- jedi_fix_list_path = os.path.join(self.task_config.HOMEgfs, 'parm', 'gdas', 'land_jedi_fix.yaml')
+ jedi_fix_list_path = os.path.join(self.task_config.HOMEgfs, 'parm', 'gdas', 'snow_jedi_fix.yaml.j2')
logger.info(f"Staging JEDI fix files from {jedi_fix_list_path}")
- jedi_fix_list = parse_yamltmpl(jedi_fix_list_path, self.task_config)
+ jedi_fix_list = parse_j2yaml(jedi_fix_list_path, self.task_config)
FileHandler(jedi_fix_list).sync()
# stage backgrounds
@@ -271,10 +271,9 @@ def initialize(self) -> None:
# generate letkfoi YAML file
logger.info(f"Generate JEDI LETKF YAML file: {self.task_config.jedi_yaml}")
- letkfoi_yaml = parse_j2yaml(self.task_config.JEDIYAML, self.task_config)
+ letkfoi_yaml = parse_j2yaml(self.task_config.JEDIYAML, self.task_config, searchpath=self.gdasapp_j2tmpl_dir)
save_as_yaml(letkfoi_yaml, self.task_config.jedi_yaml)
logger.info(f"Wrote letkfoi YAML to: {self.task_config.jedi_yaml}")
-
# need output dir for diags and anl
logger.info("Create empty output [anl, diags] directories to receive output from executable")
newdirs = [
@@ -294,15 +293,15 @@ def execute(self) -> None:
Parameters
----------
self : Analysis
- Instance of the LandAnalysis object
+ Instance of the SnowAnalysis object
"""
# create a temporary dict of all keys needed in this method
localconf = AttrDict()
keys = ['HOMEgfs', 'DATA', 'current_cycle',
- 'COM_ATMOS_RESTART_PREV', 'COM_LAND_ANALYSIS', 'APREFIX',
- 'SNOWDEPTHVAR', 'BESTDDEV', 'CASE', 'ntiles',
- 'APRUN_LANDANL', 'JEDIEXE', 'jedi_yaml',
+ 'COM_ATMOS_RESTART_PREV', 'COM_SNOW_ANALYSIS', 'APREFIX',
+ 'SNOWDEPTHVAR', 'BESTDDEV', 'CASE', 'OCNRES', 'ntiles',
+ 'APRUN_SNOWANL', 'JEDIEXE', 'jedi_yaml',
'APPLY_INCR_NML_TMPL', 'APPLY_INCR_EXE', 'APRUN_APPLY_INCR']
for key in keys:
localconf[key] = self.task_config[key]
@@ -314,7 +313,7 @@ def execute(self) -> None:
logger.info("Running JEDI LETKF")
self.execute_jediexe(localconf.DATA,
- localconf.APRUN_LANDANL,
+ localconf.APRUN_SNOWANL,
os.path.basename(localconf.JEDIEXE),
localconf.jedi_yaml)
@@ -323,7 +322,7 @@ def execute(self) -> None:
@logit(logger)
def finalize(self) -> None:
- """Performs closing actions of the Land analysis task
+ """Performs closing actions of the Snow analysis task
This method:
- tar and gzip the output diag files and place in COM/
- copy the generated YAML file from initialize to the COM/
@@ -333,11 +332,11 @@ def finalize(self) -> None:
Parameters
----------
self : Analysis
- Instance of the LandAnalysis object
+ Instance of the SnowAnalysis object
"""
logger.info("Create diagnostic tarball of diag*.nc4 files")
- statfile = os.path.join(self.task_config.COM_LAND_ANALYSIS, f"{self.task_config.APREFIX}landstat.tgz")
+ statfile = os.path.join(self.task_config.COM_SNOW_ANALYSIS, f"{self.task_config.APREFIX}snowstat.tgz")
self.tgz_diags(statfile, self.task_config.DATA)
logger.info("Copy full YAML to COM")
@@ -355,17 +354,17 @@ def finalize(self) -> None:
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_LAND_ANALYSIS, 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')
- template = f'landinc.{to_fv3time(self.task_config.current_cycle)}.sfc_data.tile{{tilenum}}.nc'
+ template = f'snowinc.{to_fv3time(self.task_config.current_cycle)}.sfc_data.tile{{tilenum}}.nc'
inclist = []
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_LAND_ANALYSIS, filename)
+ dest = os.path.join(self.task_config.COM_SNOW_ANALYSIS, filename)
inclist.append([src, dest])
FileHandler({'copy': inclist}).sync()
@@ -375,7 +374,7 @@ def get_bkg_dict(config: Dict) -> Dict[str, List[str]]:
"""Compile a dictionary of model background files to copy
This method constructs a dictionary of FV3 RESTART files (coupler, sfc_data)
- that are needed for global land DA and returns said dictionary for use by the FileHandler class.
+ that are needed for global snow DA and returns said dictionary for use by the FileHandler class.
Parameters
----------
@@ -401,11 +400,11 @@ def get_bkg_dict(config: Dict) -> Dict[str, List[str]]:
# Start accumulating list of background files to copy
bkglist = []
- # land DA needs coupler
+ # snow DA needs coupler
basename = f'{to_fv3time(config.current_cycle)}.coupler.res'
bkglist.append([os.path.join(rst_dir, basename), os.path.join(run_dir, basename)])
- # land DA only needs sfc_data
+ # snow DA only needs sfc_data
for ftype in ['sfc_data']:
template = f'{to_fv3time(config.current_cycle)}.{ftype}.tile{{tilenum}}.nc'
for itile in range(1, config.ntiles + 1):
@@ -447,17 +446,17 @@ def get_ens_bkg_dict(config: Dict) -> Dict:
# get FV3 sfc_data RESTART files; Note an ensemble is being created
rst_dir = os.path.join(config.COM_ATMOS_RESTART_PREV)
- for imem in range(1, LandAnalysis.NMEM_LANDENS + 1):
+ for imem in range(1, SnowAnalysis.NMEM_SNOWENS + 1):
memchar = f"mem{imem:03d}"
run_dir = os.path.join(config.DATA, 'bkg', memchar, 'RESTART')
dirlist.append(run_dir)
- # Land DA needs coupler
+ # Snow DA needs coupler
basename = f'{to_fv3time(config.current_cycle)}.coupler.res'
bkglist.append([os.path.join(rst_dir, basename), os.path.join(run_dir, basename)])
- # Land DA only needs sfc_data
+ # Snow DA only needs sfc_data
for ftype in ['sfc_data']:
template = f'{to_fv3time(config.current_cycle)}.{ftype}.tile{{tilenum}}.nc'
for itile in range(1, config.ntiles + 1):
@@ -491,7 +490,7 @@ def create_ensemble(vname: str, bestddev: float, config: Dict) -> None:
"""
# 2 ens members
- offset = bestddev / np.sqrt(LandAnalysis.NMEM_LANDENS)
+ offset = bestddev / np.sqrt(SnowAnalysis.NMEM_SNOWENS)
logger.info(f"Creating ensemble for LETKFOI by offsetting with {offset}")
@@ -530,6 +529,7 @@ def add_increments(config: Dict) -> None:
DATA
current_cycle
CASE
+ OCNRES
ntiles
APPLY_INCR_NML_TMPL
APPLY_INCR_EXE
diff --git a/ush/radmon_verf_angle.sh b/ush/radmon_verf_angle.sh
index f68d7c88cc..1066627787 100755
--- a/ush/radmon_verf_angle.sh
+++ b/ush/radmon_verf_angle.sh
@@ -83,7 +83,6 @@ which prep_step
which startmsg
# File names
-export pgmout=${pgmout:-${jlogfile}}
touch "${pgmout}"
# Other variables
diff --git a/ush/radmon_verf_bcoef.sh b/ush/radmon_verf_bcoef.sh
index ab1058711e..b6fd82dff2 100755
--- a/ush/radmon_verf_bcoef.sh
+++ b/ush/radmon_verf_bcoef.sh
@@ -69,7 +69,6 @@ fi
echo " RADMON_NETCDF, netcdf_boolean = ${RADMON_NETCDF}, ${netcdf_boolean}"
# File names
-pgmout=${pgmout:-${jlogfile}}
touch "${pgmout}"
# Other variables
diff --git a/ush/radmon_verf_bcor.sh b/ush/radmon_verf_bcor.sh
index f1f97c247e..7aec48e2b3 100755
--- a/ush/radmon_verf_bcor.sh
+++ b/ush/radmon_verf_bcor.sh
@@ -65,7 +65,6 @@ source "${HOMEgfs}/ush/preamble.sh"
####################################################################
# File names
-pgmout=${pgmout:-${jlogfile}}
touch "${pgmout}"
# Other variables
diff --git a/ush/radmon_verf_time.sh b/ush/radmon_verf_time.sh
index 7f98407ec5..0df8029166 100755
--- a/ush/radmon_verf_time.sh
+++ b/ush/radmon_verf_time.sh
@@ -75,8 +75,6 @@ source "${HOMEgfs}/ush/preamble.sh"
####################################################################
# File names
-#pgmout=${pgmout:-${jlogfile}}
-#touch $pgmout
radmon_err_rpt=${radmon_err_rpt:-${USHgfs}/radmon_err_rpt.sh}
base_file=${base_file:-${PARMmonitor}/gdas_radmon_base.tar}
diff --git a/ush/syndat_getjtbul.sh b/ush/syndat_getjtbul.sh
index c17067ff72..3ea56db72a 100755
--- a/ush/syndat_getjtbul.sh
+++ b/ush/syndat_getjtbul.sh
@@ -22,10 +22,6 @@
# TANK_TROPCY - path to home directory containing tropical cyclone record
# data base
-# Imported variables that can be passed in:
-# jlogfile - path to job log file (skipped over by this script if not
-# passed in)
-
source "$HOMEgfs/ush/preamble.sh"
EXECSYND=${EXECSYND:-${HOMESYND}/exec}
@@ -52,8 +48,6 @@ hour=$(echo $CDATE10 | cut -c9-10)
echo $PDYm1
pdym1=$PDYm1
-#pdym1=$(sh $utilscript/finddate.sh $pdy d-1)
-
echo " " >> $pgmout
echo "Entering sub-shell syndat_getjtbul.sh to recover JTWC Bulletins" \
>> $pgmout
diff --git a/ush/syndat_qctropcy.sh b/ush/syndat_qctropcy.sh
index cda9030577..9d9b2ad69b 100755
--- a/ush/syndat_qctropcy.sh
+++ b/ush/syndat_qctropcy.sh
@@ -46,7 +46,6 @@
# subsequent program SYNDAT_SYNDATA)
# PARMSYND - path to syndat parm field directory
# EXECSYND - path to syndat executable directory
-# FIXam - path to syndat fix field directory
# USHSYND - path to syndat ush directory
# Imported variables that can be passed in:
@@ -59,7 +58,7 @@
# data base
# (Default: /dcom/us007003)
# slmask - path to t126 32-bit gaussian land/sea mask file
-# (Default: $FIXam/syndat_slmask.t126.gaussian)
+# (Default: ${FIXgfs}/am/syndat_slmask.t126.gaussian)
# copy_back - switch to copy updated files back to archive directory and
# to tcvitals directory
# (Default: YES)
@@ -74,12 +73,11 @@ HOMENHCp1=${HOMENHCp1:-/gpfs/?p1/nhc/save/guidance/storm-data/ncep}
HOMENHC=${HOMENHC:-/gpfs/dell2/nhc/save/guidance/storm-data/ncep}
TANK_TROPCY=${TANK_TROPCY:-${DCOMROOT}/us007003}
-FIXam=${FIXam:-$HOMEgfs/fix/am}
USHSYND=${USHSYND:-$HOMEgfs/ush}
EXECSYND=${EXECSYND:-$HOMEgfs/exec}
PARMSYND=${PARMSYND:-$HOMEgfs/parm/relo}
-slmask=${slmask:-$FIXam/syndat_slmask.t126.gaussian}
+slmask=${slmask:-${FIXgfs}/am/syndat_slmask.t126.gaussian}
copy_back=${copy_back:-YES}
files_override=${files_override:-""}
@@ -190,10 +188,10 @@ fi
echo " &INPUT RUNID = '${net}_${tmmark}_${cyc}', FILES = $files " > vitchk.inp
cat $PARMSYND/syndat_qctropcy.${RUN}.parm >> vitchk.inp
-# Copy the fixed fields from FIXam
+# Copy the fixed fields
-cp $FIXam/syndat_fildef.vit fildef.vit
-cp $FIXam/syndat_stmnames stmnames
+cp ${FIXgfs}/am/syndat_fildef.vit fildef.vit
+cp ${FIXgfs}/am/syndat_stmnames stmnames
rm -f nhc fnoc lthistry
diff --git a/ush/tropcy_relocate.sh b/ush/tropcy_relocate.sh
index 01a21bd12c..cdcc777c47 100755
--- a/ush/tropcy_relocate.sh
+++ b/ush/tropcy_relocate.sh
@@ -128,9 +128,6 @@
# Default is "${HOMERELO}/ush"
# EXECRELO String indicating directory path for RELOCATE executables
# Default is "${HOMERELO}/exec"
-# FIXRELO String indicating directory path for RELOCATE data fix-
-# field files
-# Default is "${HOMERELO}/fix"
# EXECUTIL String indicating directory path for utility program
# executables
# If the imported variable MACHINE!=sgi, then the default is
@@ -188,7 +185,7 @@
# programs :
# RELOCATE_MV_NVORTEX - executable $RELOX
# T126 GRIB global land/sea mask:
-# $FIXRELO/global_slmask.t126.grb
+# ${FIXgfs}/am/global_slmask.t126.grb
# SUPVIT - executable $SUPVX
# GETTRK - executable $GETTX
#
@@ -302,8 +299,6 @@ USHGETGES=${USHGETGES:-${USHRELO}}
EXECRELO=${EXECRELO:-${HOMERELO}/exec}
-FIXRELO=${FIXRELO:-${HOMERELO}/fix}
-
RELOX=${RELOX:-$EXECRELO/relocate_mv_nvortex}
export BKGFREQ=${BKGFREQ:-1}
diff --git a/ush/tropcy_relocate_extrkr.sh b/ush/tropcy_relocate_extrkr.sh
index ede2318c4a..c4efad1d73 100755
--- a/ush/tropcy_relocate_extrkr.sh
+++ b/ush/tropcy_relocate_extrkr.sh
@@ -1538,9 +1538,9 @@ ln -s -f ${vdir}/trak.${cmodel}.radii.${symdh} fort.63
ln -s -f ${vdir}/trak.${cmodel}.atcfunix.${symdh} fort.64
if [ $BKGFREQ -eq 1 ]; then
- ln -s -f ${FIXRELO}/${cmodel}.tracker_leadtimes_hrly fort.15
+ ln -s -f ${FIXgfs}/am/${cmodel}.tracker_leadtimes_hrly fort.15
elif [ $BKGFREQ -eq 3 ]; then
- ln -s -f ${FIXRELO}/${cmodel}.tracker_leadtimes fort.15
+ ln -s -f ${FIXgfs}/am/${cmodel}.tracker_leadtimes fort.15
fi
##$XLF_LINKSSH
diff --git a/ush/wave_grid_interp_sbs.sh b/ush/wave_grid_interp_sbs.sh
index c11a75f89d..e690cbc4ad 100755
--- a/ush/wave_grid_interp_sbs.sh
+++ b/ush/wave_grid_interp_sbs.sh
@@ -113,18 +113,18 @@ source "$HOMEgfs/ush/preamble.sh"
wht_OK='no'
if [ ! -f ${DATA}/ww3_gint.WHTGRIDINT.bin.${grdID} ]; then
- if [ -f $FIXwave/ww3_gint.WHTGRIDINT.bin.${grdID} ]
+ if [ -f ${FIXgfs}/wave/ww3_gint.WHTGRIDINT.bin.${grdID} ]
then
set +x
echo ' '
- echo " Copying $FIXwave/ww3_gint.WHTGRIDINT.bin.${grdID} "
+ echo " Copying ${FIXgfs}/wave/ww3_gint.WHTGRIDINT.bin.${grdID} "
set_trace
- cp $FIXwave/ww3_gint.WHTGRIDINT.bin.${grdID} ${DATA}
+ cp ${FIXgfs}/wave/ww3_gint.WHTGRIDINT.bin.${grdID} ${DATA}
wht_OK='yes'
else
set +x
echo ' '
- echo " Not found: $FIXwave/ww3_gint.WHTGRIDINT.bin.${grdID} "
+ echo " Not found: ${FIXgfs}/wave/ww3_gint.WHTGRIDINT.bin.${grdID} "
fi
fi
# Check and link weights file
@@ -148,7 +148,7 @@ source "$HOMEgfs/ush/preamble.sh"
if [ "wht_OK" = 'no' ]
then
cp -f ./WHTGRIDINT.bin ${DATA}/ww3_gint.WHTGRIDINT.bin.${grdID}
- cp -f ./WHTGRIDINT.bin ${FIXwave}/ww3_gint.WHTGRIDINT.bin.${grdID}
+ cp -f ./WHTGRIDINT.bin ${FIXgfs}/wave/ww3_gint.WHTGRIDINT.bin.${grdID}
fi
diff --git a/ush/wave_grid_moddef.sh b/ush/wave_grid_moddef.sh
index 5b1b212a16..390860c960 100755
--- a/ush/wave_grid_moddef.sh
+++ b/ush/wave_grid_moddef.sh
@@ -59,7 +59,7 @@ source "$HOMEgfs/ush/preamble.sh"
# 0.c Define directories and the search path.
# The tested variables should be exported by the postprocessor script.
- if [ -z "$grdID" ] || [ -z "$EXECwave" ] || [ -z "$wave_sys_ver" ]
+ if [ -z "$grdID" ] || [ -z "$EXECwave" ]
then
set +x
echo ' '
@@ -83,8 +83,16 @@ source "$HOMEgfs/ush/preamble.sh"
rm -f ww3_grid.inp
ln -sf ../ww3_grid.inp.$grdID ww3_grid.inp
+
+ if [ -f ../${grdID}.msh ]
+ then
+ rm -f ${grdID}.msh
+ ln -sf ../${grdID}.msh ${grdID}.msh
+ fi
+
+
- $EXECwave/ww3_grid 1> grid_${grdID}.out 2>&1
+ "${EXECwave}/ww3_grid" 1> "grid_${grdID}.out" 2>&1
err=$?
if [ "$err" != '0' ]
@@ -99,10 +107,10 @@ source "$HOMEgfs/ush/preamble.sh"
exit 3
fi
- if [ -f mod_def.ww3 ]
+ if [[ -f mod_def.ww3 ]]
then
cp mod_def.ww3 "${COM_WAVE_PREP}/${RUN}wave.mod_def.${grdID}"
- mv mod_def.ww3 ../mod_def.$grdID
+ mv mod_def.ww3 "../mod_def.${grdID}"
else
set +x
echo ' '
@@ -118,6 +126,6 @@ source "$HOMEgfs/ush/preamble.sh"
# 3. Clean up
cd ..
-rm -rf moddef_$grdID
+rm -rf "moddef_${grdID}"
# End of ww3_mod_def.sh ------------------------------------------------- #
diff --git a/ush/wave_prnc_cur.sh b/ush/wave_prnc_cur.sh
index 6b1ab19db2..a8f9f67d62 100755
--- a/ush/wave_prnc_cur.sh
+++ b/ush/wave_prnc_cur.sh
@@ -46,7 +46,7 @@ mv -f "cur_temp3.nc" "cur_uv_${PDY}_${fext}${fh3}_flat.nc"
# Convert to regular lat lon file
# If weights need to be regenerated due to CDO ver change, use:
# $CDO genbil,r4320x2160 rtofs_glo_2ds_f000_3hrly_prog.nc weights.nc
-cp ${FIXwave}/weights_rtofs_to_r4320x2160.nc ./weights.nc
+cp ${FIXgfs}/wave/weights_rtofs_to_r4320x2160.nc ./weights.nc
# Interpolate to regular 5 min grid
${CDO} remap,r4320x2160,weights.nc "cur_uv_${PDY}_${fext}${fh3}_flat.nc" "cur_5min_01.nc"
diff --git a/ush/wave_prnc_ice.sh b/ush/wave_prnc_ice.sh
index 5ec1d7fc2e..d0a6371d5b 100755
--- a/ush/wave_prnc_ice.sh
+++ b/ush/wave_prnc_ice.sh
@@ -55,7 +55,7 @@ source "$HOMEgfs/ush/preamble.sh"
echo "Making ice fields."
if [[ -z "${YMDH}" ]] || [[ -z "${cycle}" ]] || \
- [[ -z "${COM_WAVE_PREP}" ]] || [[ -z "${FIXwave}" ]] || [[ -z "${EXECwave}" ]] || \
+ [[ -z "${COM_WAVE_PREP}" ]] || [[ -z "${FIXgfs}" ]] || [[ -z "${EXECwave}" ]] || \
[[ -z "${WAV_MOD_TAG}" ]] || [[ -z "${WAVEICE_FID}" ]] || [[ -z "${COM_OBS}" ]]; then
set +x
diff --git a/versions/build.hera.ver b/versions/build.hera.ver
index ff85b1a801..263e967a97 100644
--- a/versions/build.hera.ver
+++ b/versions/build.hera.ver
@@ -1,3 +1,5 @@
export stack_intel_ver=2021.5.0
export stack_impi_ver=2021.5.1
+export spack_env=gsi-addon-dev
source "${HOMEgfs:-}/versions/build.spack.ver"
+export spack_mod_path="/scratch1/NCEPDEV/nems/role.epic/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core"
diff --git a/versions/build.hercules.ver b/versions/build.hercules.ver
index 5513466631..cab0c92111 100644
--- a/versions/build.hercules.ver
+++ b/versions/build.hercules.ver
@@ -1,3 +1,6 @@
export stack_intel_ver=2021.9.0
export stack_impi_ver=2021.9.0
+export intel_mkl_ver=2023.1.0
+export spack_env=gsi-addon-env
source "${HOMEgfs:-}/versions/build.spack.ver"
+export spack_mod_path="/work/noaa/epic/role-epic/spack-stack/hercules/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core"
diff --git a/versions/build.jet.ver b/versions/build.jet.ver
index ff85b1a801..55c0ea0bd1 100644
--- a/versions/build.jet.ver
+++ b/versions/build.jet.ver
@@ -1,3 +1,5 @@
export stack_intel_ver=2021.5.0
export stack_impi_ver=2021.5.1
+export spack_env=gsi-addon-dev
source "${HOMEgfs:-}/versions/build.spack.ver"
+export spack_mod_path="/lfs4/HFIP/hfv3gfs/role.epic/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core"
diff --git a/versions/build.orion.ver b/versions/build.orion.ver
index ff85b1a801..df7856110d 100644
--- a/versions/build.orion.ver
+++ b/versions/build.orion.ver
@@ -1,3 +1,5 @@
-export stack_intel_ver=2021.5.0
+export stack_intel_ver=2022.0.2
export stack_impi_ver=2021.5.1
+export spack_env=gsi-addon-env
source "${HOMEgfs:-}/versions/build.spack.ver"
+export spack_mod_path="/work/noaa/epic/role-epic/spack-stack/orion/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core"
diff --git a/versions/build.s4.ver b/versions/build.s4.ver
index a0aae51d87..e2731ccfb3 100644
--- a/versions/build.s4.ver
+++ b/versions/build.s4.ver
@@ -1,3 +1,5 @@
export stack_intel_ver=2021.5.0
export stack_impi_ver=2021.5.0
+export spack_env=gsi-addon-env
source "${HOMEgfs:-}/versions/build.spack.ver"
+export spack_mod_path="/data/prod/jedi/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core"
diff --git a/versions/build.spack.ver b/versions/build.spack.ver
index fb5b244bf5..808f85dd16 100644
--- a/versions/build.spack.ver
+++ b/versions/build.spack.ver
@@ -1,5 +1,4 @@
-export spack_stack_ver=1.5.1
-export spack_env=gsi-addon
+export spack_stack_ver=1.6.0
export cmake_ver=3.23.1
@@ -11,7 +10,7 @@ export fms_ver=2023.02.01
export hdf5_ver=1.14.0
export netcdf_c_ver=4.9.2
-export netcdf_fortran_ver=4.6.0
+export netcdf_fortran_ver=4.6.1
export bacio_ver=2.4.1
export nemsio_ver=2.5.4
@@ -19,10 +18,10 @@ export sigio_ver=2.3.2
export w3emc_ver=2.10.0
export bufr_ver=11.7.0
export g2_ver=3.4.5
-export sp_ver=2.3.3
+export sp_ver=2.5.0
export ip_ver=4.3.0
export gsi_ncdiag_ver=1.1.2
export g2tmpl_ver=1.10.2
-export crtm_ver=2.4.0
+export crtm_ver=2.4.0.1
export wgrib2_ver=2.0.8
export grib_util_ver=1.3.0
diff --git a/versions/fix.ver b/versions/fix.ver
index 13d9b56dd2..a2a9caf8e3 100644
--- a/versions/fix.ver
+++ b/versions/fix.ver
@@ -10,6 +10,7 @@ export datm_ver=20220805
export gdas_crtm_ver=20220805
export gdas_fv3jedi_ver=20220805
export gdas_gsibec_ver=20221031
+export gdas_obs_ver=20240213
export glwu_ver=20220805
export gsi_ver=20230911
export lut_ver=20220805
@@ -17,6 +18,6 @@ export mom6_ver=20231219
export orog_ver=20231027
export reg2grb2_ver=20220805
export sfc_climo_ver=20220805
-export ugwd_ver=20220805
+export ugwd_ver=20231027
export verif_ver=20220805
export wave_ver=20240105
diff --git a/versions/run.hera.ver b/versions/run.hera.ver
index 43443ba715..4529d34821 100644
--- a/versions/run.hera.ver
+++ b/versions/run.hera.ver
@@ -1,13 +1,11 @@
export stack_intel_ver=2021.5.0
export stack_impi_ver=2021.5.1
+export spack_env=gsi-addon-dev
export hpss_ver=hpss
export ncl_ver=6.6.2
export R_ver=3.5.0
export gempak_ver=7.4.2
-#For metplus jobs, not currently working with spack-stack
-#export met_ver=9.1.3
-#export metplus_ver=3.1.1
-
source "${HOMEgfs:-}/versions/run.spack.ver"
+export spack_mod_path="/scratch1/NCEPDEV/nems/role.epic/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core"
diff --git a/versions/run.hercules.ver b/versions/run.hercules.ver
index 43f1b2181d..549bb47df0 100644
--- a/versions/run.hercules.ver
+++ b/versions/run.hercules.ver
@@ -1,12 +1,9 @@
export stack_intel_ver=2021.9.0
export stack_impi_ver=2021.9.0
export intel_mkl_ver=2023.1.0
+export spack_env=gsi-addon-env
-export ncl_ver=6.6.2
export perl_ver=5.36.0
source "${HOMEgfs:-}/versions/run.spack.ver"
-
-# wgrib2 and cdo are different on Hercules from all the other systems
-export wgrib2_ver=3.1.1
-export cdo_ver=2.2.0
+export spack_mod_path="/work/noaa/epic/role-epic/spack-stack/hercules/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core"
diff --git a/versions/run.jet.ver b/versions/run.jet.ver
index 18a82cab4f..d5b98bf514 100644
--- a/versions/run.jet.ver
+++ b/versions/run.jet.ver
@@ -1,5 +1,6 @@
export stack_intel_ver=2021.5.0
export stack_impi_ver=2021.5.1
+export spack_env=gsi-addon-dev
export hpss_ver=
export ncl_ver=6.6.2
@@ -7,3 +8,4 @@ export R_ver=4.0.2
export gempak_ver=7.4.2
source "${HOMEgfs:-}/versions/run.spack.ver"
+export spack_mod_path="/lfs4/HFIP/hfv3gfs/role.epic/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core"
diff --git a/versions/run.orion.ver b/versions/run.orion.ver
index 7671bc028d..b6c4acfa2e 100644
--- a/versions/run.orion.ver
+++ b/versions/run.orion.ver
@@ -1,5 +1,6 @@
export stack_intel_ver=2022.0.2
export stack_impi_ver=2021.5.1
+export spack_env=gsi-addon-env
export ncl_ver=6.6.2
export gempak_ver=7.5.1
@@ -9,3 +10,7 @@ export gempak_ver=7.5.1
#export metplus_ver=3.1.1
source "${HOMEgfs:-}/versions/run.spack.ver"
+export spack_mod_path="/work/noaa/epic/role-epic/spack-stack/orion/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core"
+
+#cdo is older on Orion
+export cdo_ver=2.0.5
diff --git a/versions/run.s4.ver b/versions/run.s4.ver
index 56817ef439..6d0f4cbaca 100644
--- a/versions/run.s4.ver
+++ b/versions/run.s4.ver
@@ -1,6 +1,8 @@
export stack_intel_ver=2021.5.0
export stack_impi_ver=2021.5.0
+export spack_env=gsi-addon-env
export ncl_ver=6.4.0-precompiled
source "${HOMEgfs:-}/versions/run.spack.ver"
+export spack_mod_path="/data/prod/jedi/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core"
diff --git a/versions/run.spack.ver b/versions/run.spack.ver
index c1c13f58df..c00b7483cd 100644
--- a/versions/run.spack.ver
+++ b/versions/run.spack.ver
@@ -1,26 +1,31 @@
-export spack_stack_ver=1.5.1
-export spack_env=gsi-addon
-export python_ver=3.10.8
+export spack_stack_ver=1.6.0
+export python_ver=3.11.6
export jasper_ver=2.0.32
export libpng_ver=1.6.37
-export cdo_ver=2.0.5
+export cdo_ver=2.2.0
export nco_ver=5.0.6
export hdf5_ver=1.14.0
export netcdf_c_ver=4.9.2
-export netcdf_fortran_ver=4.6.0
+export netcdf_fortran_ver=4.6.1
export bufr_ver=11.7.0
export gsi_ncdiag_ver=1.1.2
export g2tmpl_ver=1.10.2
-export crtm_ver=2.4.0
+export crtm_ver=2.4.0.1
export wgrib2_ver=2.0.8
export grib_util_ver=1.3.0
-export prod_util_ver=1.2.2
+export prod_util_ver=2.1.1
export py_netcdf4_ver=1.5.8
-export py_pyyaml_ver=5.4.1
+export py_pyyaml_ver=6.0
export py_jinja2_ver=3.1.2
+export py_pandas_ver=1.5.3
+export py_python_dateutil_ver=2.8.2
+
+export met_ver=9.1.3
+export metplus_ver=3.1.1
+export py_xarray_ver=2023.7.0
export obsproc_run_ver=1.1.2
export prepobs_run_ver=1.0.1
diff --git a/versions/run.wcoss2.ver b/versions/run.wcoss2.ver
index a188cdea74..0aaad3ec3d 100644
--- a/versions/run.wcoss2.ver
+++ b/versions/run.wcoss2.ver
@@ -39,6 +39,8 @@ export g2tmpl_ver=1.10.2
export ncdiag_ver=1.0.0
export crtm_ver=2.4.0
export wgrib2_ver=2.0.8
+export met_ver=9.1.3
+export metplus_ver=3.1.1
# Development-only below
diff --git a/workflow/applications/gefs.py b/workflow/applications/gefs.py
index b2369e8dfc..0be4dc7124 100644
--- a/workflow/applications/gefs.py
+++ b/workflow/applications/gefs.py
@@ -14,13 +14,18 @@ def _get_app_configs(self):
"""
Returns the config_files that are involved in gefs
"""
- configs = ['stage_ic', 'fcst']
+ configs = ['stage_ic', 'fcst', 'atmos_products']
if self.nens > 0:
configs += ['efcs']
if self.do_wave:
- configs += ['waveinit']
+ configs += ['waveinit', 'wavepostsbs', 'wavepostpnt']
+ if self.do_wave_bnd:
+ configs += ['wavepostbndpnt', 'wavepostbndpntbll']
+
+ if self.do_ocean or self.do_ice:
+ configs += ['oceanice_products']
return configs
@@ -45,4 +50,18 @@ def get_task_names(self):
if self.nens > 0:
tasks += ['efcs']
+ tasks += ['atmos_prod']
+
+ if self.do_ocean:
+ tasks += ['ocean_prod']
+
+ if self.do_ice:
+ tasks += ['ice_prod']
+
+ if self.do_wave:
+ tasks += ['wavepostsbs']
+ if self.do_wave_bnd:
+ tasks += ['wavepostbndpnt', 'wavepostbndpntbll']
+ tasks += ['wavepostpnt']
+
return {f"{self._base['CDUMP']}": tasks}
diff --git a/workflow/applications/gfs_cycled.py b/workflow/applications/gfs_cycled.py
index 1ff6cc3723..51b430a996 100644
--- a/workflow/applications/gfs_cycled.py
+++ b/workflow/applications/gfs_cycled.py
@@ -16,8 +16,9 @@ def __init__(self, conf: Configuration):
self.do_jediatmvar = self._base.get('DO_JEDIATMVAR', False)
self.do_jediatmens = self._base.get('DO_JEDIATMENS', False)
self.do_jediocnvar = self._base.get('DO_JEDIOCNVAR', False)
- self.do_jedilandda = self._base.get('DO_JEDILANDDA', False)
+ self.do_jedisnowda = self._base.get('DO_JEDISNOWDA', False)
self.do_mergensst = self._base.get('DO_MERGENSST', False)
+ self.do_vrfy_oceanda = self._base.get('DO_VRFY_OCEANDA', False)
self.lobsdiag_forenkf = False
self.eupd_cdumps = None
@@ -43,11 +44,12 @@ def _get_app_configs(self):
if self.do_jediocnvar:
configs += ['prepoceanobs', 'ocnanalprep', 'ocnanalbmat',
- 'ocnanalrun', 'ocnanalchkpt', 'ocnanalpost',
- 'ocnanalvrfy']
+ 'ocnanalrun', 'ocnanalchkpt', 'ocnanalpost']
+ if self.do_vrfy_oceanda:
+ configs += ['ocnanalvrfy']
- if self.do_ocean:
- configs += ['ocnpost']
+ if self.do_ocean or self.do_ice:
+ configs += ['oceanice_products']
configs += ['sfcanl', 'analcalc', 'fcst', 'upp', 'atmos_products', 'arch', 'cleanup']
@@ -103,8 +105,8 @@ def _get_app_configs(self):
if self.do_aero:
configs += ['aeroanlinit', 'aeroanlrun', 'aeroanlfinal']
- if self.do_jedilandda:
- configs += ['preplandobs', 'landanl']
+ if self.do_jedisnowda:
+ configs += ['prepsnowobs', 'snowanl']
if self.do_mos:
configs += ['mos_stn_prep', 'mos_grd_prep', 'mos_ext_stn_prep', 'mos_ext_grd_prep',
@@ -137,16 +139,17 @@ def get_task_names(self):
if self.do_jediocnvar:
gdas_gfs_common_tasks_before_fcst += ['prepoceanobs', 'ocnanalprep',
'ocnanalbmat', 'ocnanalrun',
- 'ocnanalchkpt', 'ocnanalpost',
- 'ocnanalvrfy']
+ 'ocnanalchkpt', 'ocnanalpost']
+ if self.do_vrfy_oceanda:
+ gdas_gfs_common_tasks_before_fcst += ['ocnanalvrfy']
gdas_gfs_common_tasks_before_fcst += ['sfcanl', 'analcalc']
if self.do_aero:
gdas_gfs_common_tasks_before_fcst += ['aeroanlinit', 'aeroanlrun', 'aeroanlfinal']
- if self.do_jedilandda:
- gdas_gfs_common_tasks_before_fcst += ['preplandobs', 'landanl']
+ if self.do_jedisnowda:
+ gdas_gfs_common_tasks_before_fcst += ['prepsnowobs', 'snowanl']
wave_prep_tasks = ['waveinit', 'waveprep']
wave_bndpnt_tasks = ['wavepostbndpnt', 'wavepostbndpntbll']
@@ -175,7 +178,7 @@ def get_task_names(self):
if self.do_upp:
gdas_tasks += ['atmupp']
- gdas_tasks += ['atmprod']
+ gdas_tasks += ['atmos_prod']
if self.do_wave and 'gdas' in self.wave_cdumps:
if self.do_wave_bnd:
@@ -207,9 +210,15 @@ def get_task_names(self):
gfs_tasks += ['atmanlupp', 'atmanlprod', 'fcst']
+ if self.do_ocean:
+ gfs_tasks += ['ocean_prod']
+
+ if self.do_ice:
+ gfs_tasks += ['ice_prod']
+
if self.do_upp:
gfs_tasks += ['atmupp']
- gfs_tasks += ['atmprod']
+ gfs_tasks += ['atmos_prod']
if self.do_goes:
gfs_tasks += ['goesupp']
@@ -321,9 +330,4 @@ def get_gfs_cyc_dates(base: Dict[str, Any]) -> Dict[str, Any]:
base_out['EDATE_GFS'] = edate_gfs
base_out['INTERVAL_GFS'] = interval_gfs
- fhmax_gfs = {}
- for hh in ['00', '06', '12', '18']:
- fhmax_gfs[hh] = base.get(f'FHMAX_GFS_{hh}', base.get('FHMAX_GFS_00', 120))
- base_out['FHMAX_GFS'] = fhmax_gfs
-
return base_out
diff --git a/workflow/applications/gfs_forecast_only.py b/workflow/applications/gfs_forecast_only.py
index 1145863210..a2d8348fc3 100644
--- a/workflow/applications/gfs_forecast_only.py
+++ b/workflow/applications/gfs_forecast_only.py
@@ -49,7 +49,7 @@ def _get_app_configs(self):
configs += ['awips']
if self.do_ocean or self.do_ice:
- configs += ['ocnpost']
+ configs += ['oceanice_products']
if self.do_wave:
configs += ['waveinit', 'waveprep', 'wavepostsbs', 'wavepostpnt']
@@ -100,7 +100,10 @@ def get_task_names(self):
if self.do_upp:
tasks += ['atmupp']
- tasks += ['atmprod']
+ tasks += ['atmos_prod']
+
+ if self.do_goes:
+ tasks += ['goesupp']
if self.do_goes:
tasks += ['goesupp']
@@ -126,8 +129,11 @@ def get_task_names(self):
if self.do_awips:
tasks += ['awips_20km_1p0deg', 'awips_g2', 'fbwind']
- if self.do_ocean or self.do_ice:
- tasks += ['ocnpost']
+ if self.do_ocean:
+ tasks += ['ocean_prod']
+
+ if self.do_ice:
+ tasks += ['ice_prod']
if self.do_wave:
if self.do_wave_bnd:
diff --git a/workflow/create_experiment.py b/workflow/create_experiment.py
index 7e0f350c0f..708cf432bf 100755
--- a/workflow/create_experiment.py
+++ b/workflow/create_experiment.py
@@ -63,7 +63,9 @@ def input_args():
formatter_class=ArgumentDefaultsHelpFormatter)
parser.add_argument(
- '--yaml', help='full path to yaml file describing the experiment configuration', type=Path, required=True)
+ '-y', '--yaml', help='full path to yaml file describing the experiment configuration', type=Path, required=True)
+ parser.add_argument(
+ '-o', '--overwrite', help='overwrite previously created experiment', action="store_true", required=False)
return parser.parse_args()
@@ -89,6 +91,9 @@ def input_args():
setup_expt_args.append(f"--{kk}")
setup_expt_args.append(str(vv))
+ if user_inputs.overwrite:
+ setup_expt_args.append("--overwrite")
+
logger.info(f"Call: setup_expt.main()")
logger.debug(f"setup_expt.py {' '.join(setup_expt_args)}")
setup_expt.main(setup_expt_args)
diff --git a/workflow/hosts/hera_gsl.yaml b/workflow/hosts/hera_gsl.yaml
index c12cac1559..ecc7ddb28e 100644
--- a/workflow/hosts/hera_gsl.yaml
+++ b/workflow/hosts/hera_gsl.yaml
@@ -2,8 +2,7 @@ BASE_GIT: '/scratch1/NCEPDEV/global/glopara/git'
DMPDIR: '/scratch1/NCEPDEV/global/glopara/dump'
BASE_CPLIC: '/scratch1/NCEPDEV/global/glopara/data/ICSDIR/prototype_ICs'
PACKAGEROOT: '/scratch1/NCEPDEV/global/glopara/nwpara'
-COMROOT: '/scratch1/NCEPDEV/global/glopara/com'
-COMINsyn: '${COMROOT}/gfs/prod/syndat'
+COMINsyn: '/scratch1/NCEPDEV/global/glopara/com/gfs/prod/syndat'
HOMEDIR: '/scratch1/BMC/gsd-fv3-dev/NCEPDEV/global/${USER}'
STMP: '${HOMEgfs}/FV3GFSrun/'
PTMP: '${HOMEgfs}/FV3GFSrun/'
diff --git a/workflow/rocoto/gefs_tasks.py b/workflow/rocoto/gefs_tasks.py
index c46d9ad452..50b24f3578 100644
--- a/workflow/rocoto/gefs_tasks.py
+++ b/workflow/rocoto/gefs_tasks.py
@@ -75,7 +75,7 @@ def stage_ic(self):
def waveinit(self):
resources = self.get_resource('waveinit')
- task_name = f'waveinit'
+ task_name = f'wave_init'
task_dict = {'task_name': task_name,
'resources': resources,
'envars': self.envars,
@@ -90,20 +90,18 @@ def waveinit(self):
return task
def fcst(self):
-
- # TODO: Add real dependencies
dependencies = []
dep_dict = {'type': 'task', 'name': f'stage_ic'}
dependencies.append(rocoto.add_dependency(dep_dict))
if self.app_config.do_wave:
- dep_dict = {'type': 'task', 'name': f'waveinit'}
+ dep_dict = {'type': 'task', 'name': f'wave_init'}
dependencies.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep_condition='and', dep=dependencies)
resources = self.get_resource('fcst')
- task_name = f'fcst'
+ task_name = f'fcst_mem000'
task_dict = {'task_name': task_name,
'resources': resources,
'dependency': dependencies,
@@ -124,36 +122,270 @@ def efcs(self):
dependencies.append(rocoto.add_dependency(dep_dict))
if self.app_config.do_wave:
- dep_dict = {'type': 'task', 'name': f'waveinit'}
+ dep_dict = {'type': 'task', 'name': f'wave_init'}
dependencies.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep_condition='and', dep=dependencies)
efcsenvars = self.envars.copy()
- efcsenvars.append(rocoto.create_envar(name='ENSGRP', value='#grp#'))
-
- groups = self._get_hybgroups(self._base['NMEM_ENS'], self._configs['efcs']['NMEM_EFCSGRP'])
- var_dict = {'grp': groups}
+ efcsenvars_dict = {'ENSMEM': '#member#',
+ 'MEMDIR': 'mem#member#'
+ }
+ for key, value in efcsenvars_dict.items():
+ efcsenvars.append(rocoto.create_envar(name=key, value=str(value)))
resources = self.get_resource('efcs')
- task_name = f'efcs#grp#'
+ task_name = f'fcst_mem#member#'
task_dict = {'task_name': task_name,
'resources': resources,
'dependency': dependencies,
'envars': efcsenvars,
'cycledef': 'gefs',
- 'command': f'{self.HOMEgfs}/jobs/rocoto/efcs.sh',
+ 'command': f'{self.HOMEgfs}/jobs/rocoto/fcst.sh',
'job_name': f'{self.pslot}_{task_name}_@H',
'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log',
'maxtries': '&MAXTRIES;'
}
- metatask_dict = {'task_name': 'efmn',
- 'var_dict': var_dict,
+ member_var_dict = {'member': ' '.join([f"{mem:03d}" for mem in range(1, self.nmem + 1)])}
+ metatask_dict = {'task_name': 'fcst_ens',
+ 'var_dict': member_var_dict,
'task_dict': task_dict
}
task = rocoto.create_task(metatask_dict)
return task
+
+ def atmos_prod(self):
+ return self._atmosoceaniceprod('atmos')
+
+ def ocean_prod(self):
+ return self._atmosoceaniceprod('ocean')
+
+ def ice_prod(self):
+ return self._atmosoceaniceprod('ice')
+
+ 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.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'},
+ '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'}}
+
+ 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']
+
+ resources = self.get_resource(config)
+
+ 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))
+ dependencies = rocoto.create_dependency(dep=deps)
+
+ postenvars = self.envars.copy()
+ postenvar_dict = {'ENSMEM': '#member#',
+ 'MEMDIR': 'mem#member#',
+ 'FHRLST': '#fhr#',
+ 'COMPONENT': component}
+ for key, value in postenvar_dict.items():
+ postenvars.append(rocoto.create_envar(name=key, value=str(value)))
+
+ task_name = f'{component}_prod_mem#member#_f#fhr#'
+ task_dict = {'task_name': task_name,
+ 'resources': resources,
+ 'dependency': dependencies,
+ 'envars': postenvars,
+ 'cycledef': 'gefs',
+ 'command': f'{self.HOMEgfs}/jobs/rocoto/{config}.sh',
+ 'job_name': f'{self.pslot}_{task_name}_@H',
+ 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log',
+ 'maxtries': '&MAXTRIES;'}
+
+ fhrs = self._get_forecast_hours('gefs', self._configs[config])
+
+ # ocean/ice components do not have fhr 0 as they are averaged output
+ if component in ['ocean', 'ice']:
+ fhrs.remove(0)
+
+ fhr_var_dict = {'fhr': ' '.join([f"{fhr:03d}" for fhr in fhrs])}
+
+ fhr_metatask_dict = {'task_name': f'{component}_prod_#member#',
+ 'task_dict': task_dict,
+ 'var_dict': fhr_var_dict}
+
+ member_var_dict = {'member': ' '.join([f"{mem:03d}" for mem in range(0, self.nmem + 1)])}
+ member_metatask_dict = {'task_name': f'{component}_prod',
+ 'task_dict': fhr_metatask_dict,
+ 'var_dict': member_var_dict}
+
+ task = rocoto.create_task(member_metatask_dict)
+
+ return task
+
+ def wavepostsbs(self):
+ deps = []
+ for wave_grid in self._configs['wavepostsbs']['waveGRD'].split():
+ wave_hist_path = self._template_to_rocoto_cycstring(self._base["COM_WAVE_HISTORY_TMPL"], {'MEMDIR': 'mem#member#'})
+ data = f'{wave_hist_path}/gefswave.out_grd.{wave_grid}.@Y@m@d.@H0000'
+ dep_dict = {'type': 'data', 'data': data}
+ deps.append(rocoto.add_dependency(dep_dict))
+ dependencies = rocoto.create_dependency(dep_condition='and', dep=deps)
+
+ wave_post_envars = self.envars.copy()
+ postenvar_dict = {'ENSMEM': '#member#',
+ 'MEMDIR': 'mem#member#',
+ }
+ for key, value in postenvar_dict.items():
+ wave_post_envars.append(rocoto.create_envar(name=key, value=str(value)))
+
+ resources = self.get_resource('wavepostsbs')
+
+ task_name = f'wave_post_grid_mem#member#'
+ task_dict = {'task_name': task_name,
+ 'resources': resources,
+ 'dependency': dependencies,
+ 'envars': wave_post_envars,
+ 'cycledef': 'gefs',
+ 'command': f'{self.HOMEgfs}/jobs/rocoto/wavepostsbs.sh',
+ 'job_name': f'{self.pslot}_{task_name}_@H',
+ 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log',
+ 'maxtries': '&MAXTRIES;'
+ }
+
+ member_var_dict = {'member': ' '.join([str(mem).zfill(3) for mem in range(0, self.nmem + 1)])}
+ member_metatask_dict = {'task_name': 'wave_post_grid',
+ 'task_dict': task_dict,
+ 'var_dict': member_var_dict
+ }
+
+ task = rocoto.create_task(member_metatask_dict)
+
+ return task
+
+ def wavepostbndpnt(self):
+ deps = []
+ dep_dict = {'type': 'task', 'name': f'fcst_mem#member#'}
+ deps.append(rocoto.add_dependency(dep_dict))
+ dependencies = rocoto.create_dependency(dep=deps)
+
+ wave_post_bndpnt_envars = self.envars.copy()
+ postenvar_dict = {'ENSMEM': '#member#',
+ 'MEMDIR': 'mem#member#',
+ }
+ for key, value in postenvar_dict.items():
+ wave_post_bndpnt_envars.append(rocoto.create_envar(name=key, value=str(value)))
+
+ resources = self.get_resource('wavepostbndpnt')
+ task_name = f'wave_post_bndpnt_mem#member#'
+ task_dict = {'task_name': task_name,
+ 'resources': resources,
+ 'dependency': dependencies,
+ 'envars': wave_post_bndpnt_envars,
+ 'cycledef': 'gefs',
+ 'command': f'{self.HOMEgfs}/jobs/rocoto/wavepostbndpnt.sh',
+ 'job_name': f'{self.pslot}_{task_name}_@H',
+ 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log',
+ 'maxtries': '&MAXTRIES;'
+ }
+
+ member_var_dict = {'member': ' '.join([str(mem).zfill(3) for mem in range(0, self.nmem + 1)])}
+ member_metatask_dict = {'task_name': 'wave_post_bndpnt',
+ 'task_dict': task_dict,
+ 'var_dict': member_var_dict
+ }
+
+ task = rocoto.create_task(member_metatask_dict)
+
+ return task
+
+ 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'
+ dep_dict = {'type': 'data', 'data': data}
+ deps.append(rocoto.add_dependency(dep_dict))
+
+ dep_dict = {'type': 'task', 'name': f'fcst_mem#member#'}
+ deps.append(rocoto.add_dependency(dep_dict))
+ dependencies = rocoto.create_dependency(dep_condition='or', dep=deps)
+
+ wave_post_bndpnt_bull_envars = self.envars.copy()
+ postenvar_dict = {'ENSMEM': '#member#',
+ 'MEMDIR': 'mem#member#',
+ }
+ for key, value in postenvar_dict.items():
+ wave_post_bndpnt_bull_envars.append(rocoto.create_envar(name=key, value=str(value)))
+
+ resources = self.get_resource('wavepostbndpntbll')
+ task_name = f'wave_post_bndpnt_bull_mem#member#'
+ task_dict = {'task_name': task_name,
+ 'resources': resources,
+ 'dependency': dependencies,
+ 'envars': wave_post_bndpnt_bull_envars,
+ 'cycledef': 'gefs',
+ 'command': f'{self.HOMEgfs}/jobs/rocoto/wavepostbndpntbll.sh',
+ 'job_name': f'{self.pslot}_{task_name}_@H',
+ 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log',
+ 'maxtries': '&MAXTRIES;'
+ }
+
+ member_var_dict = {'member': ' '.join([str(mem).zfill(3) for mem in range(0, self.nmem + 1)])}
+ member_metatask_dict = {'task_name': 'wave_post_bndpnt_bull',
+ 'task_dict': task_dict,
+ 'var_dict': member_var_dict
+ }
+
+ task = rocoto.create_task(member_metatask_dict)
+
+ return task
+
+ def wavepostpnt(self):
+ deps = []
+ dep_dict = {'type': 'task', 'name': f'fcst_mem#member#'}
+ deps.append(rocoto.add_dependency(dep_dict))
+ if self.app_config.do_wave_bnd:
+ dep_dict = {'type': 'task', 'name': f'wave_post_bndpnt_bull_mem#member#'}
+ deps.append(rocoto.add_dependency(dep_dict))
+ dependencies = rocoto.create_dependency(dep_condition='and', dep=deps)
+
+ wave_post_pnt_envars = self.envars.copy()
+ postenvar_dict = {'ENSMEM': '#member#',
+ 'MEMDIR': 'mem#member#',
+ }
+ for key, value in postenvar_dict.items():
+ wave_post_pnt_envars.append(rocoto.create_envar(name=key, value=str(value)))
+
+ resources = self.get_resource('wavepostpnt')
+ task_name = f'wave_post_pnt_mem#member#'
+ task_dict = {'task_name': task_name,
+ 'resources': resources,
+ 'dependency': dependencies,
+ 'envars': wave_post_pnt_envars,
+ 'cycledef': 'gefs',
+ 'command': f'{self.HOMEgfs}/jobs/rocoto/wavepostpnt.sh',
+ 'job_name': f'{self.pslot}_{task_name}_@H',
+ 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log',
+ 'maxtries': '&MAXTRIES;'
+ }
+
+ member_var_dict = {'member': ' '.join([str(mem).zfill(3) for mem in range(0, self.nmem + 1)])}
+ member_metatask_dict = {'task_name': 'wave_post_pnt',
+ 'task_dict': task_dict,
+ 'var_dict': member_var_dict
+ }
+
+ task = rocoto.create_task(member_metatask_dict)
+
+ return task
diff --git a/workflow/rocoto/gfs_tasks.py b/workflow/rocoto/gfs_tasks.py
index 0f5e184192..b91e974c74 100644
--- a/workflow/rocoto/gfs_tasks.py
+++ b/workflow/rocoto/gfs_tasks.py
@@ -99,7 +99,7 @@ def prep(self):
gfs_enkf = True if self.app_config.do_hybvar and 'gfs' in self.app_config.eupd_cdumps else False
deps = []
- dep_dict = {'type': 'metatask', 'name': 'gdasatmprod', 'offset': f"-{timedelta_to_HMS(self._base['cycle_interval'])}"}
+ dep_dict = {'type': 'metatask', 'name': 'gdasatmos_prod', 'offset': f"-{timedelta_to_HMS(self._base['cycle_interval'])}"}
deps.append(rocoto.add_dependency(dep_dict))
data = f'{atm_hist_path}/gdas.t@Hz.atmf009.nc'
dep_dict = {'type': 'data', 'data': data, 'offset': f"-{timedelta_to_HMS(self._base['cycle_interval'])}"}
@@ -271,8 +271,8 @@ def sfcanl(self):
else:
dep_dict = {'type': 'task', 'name': f'{self.cdump}anal'}
deps.append(rocoto.add_dependency(dep_dict))
- if self.app_config.do_jedilandda:
- dep_dict = {'type': 'task', 'name': f'{self.cdump}landanl'}
+ if self.app_config.do_jedisnowda:
+ dep_dict = {'type': 'task', 'name': f'{self.cdump}snowanl'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep_condition='and', dep=deps)
else:
@@ -531,21 +531,21 @@ def aeroanlfinal(self):
return task
- def preplandobs(self):
+ def prepsnowobs(self):
deps = []
dep_dict = {'type': 'task', 'name': f'{self.cdump}prep'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
- resources = self.get_resource('preplandobs')
- task_name = f'{self.cdump}preplandobs'
+ resources = self.get_resource('prepsnowobs')
+ task_name = f'{self.cdump}prepsnowobs'
task_dict = {'task_name': task_name,
'resources': resources,
'dependency': dependencies,
'envars': self.envars,
'cycledef': self.cdump.replace('enkf', ''),
- 'command': f'{self.HOMEgfs}/jobs/rocoto/preplandobs.sh',
+ 'command': f'{self.HOMEgfs}/jobs/rocoto/prepsnowobs.sh',
'job_name': f'{self.pslot}_{task_name}_@H',
'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log',
'maxtries': '&MAXTRIES;'
@@ -555,21 +555,21 @@ def preplandobs(self):
return task
- def landanl(self):
+ def snowanl(self):
deps = []
- dep_dict = {'type': 'task', 'name': f'{self.cdump}preplandobs'}
+ dep_dict = {'type': 'task', 'name': f'{self.cdump}prepsnowobs'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
- resources = self.get_resource('landanl')
- task_name = f'{self.cdump}landanl'
+ resources = self.get_resource('snowanl')
+ task_name = f'{self.cdump}snowanl'
task_dict = {'task_name': task_name,
'resources': resources,
'dependency': dependencies,
'envars': self.envars,
'cycledef': self.cdump.replace('enkf', ''),
- 'command': f'{self.HOMEgfs}/jobs/rocoto/landanl.sh',
+ 'command': f'{self.HOMEgfs}/jobs/rocoto/snowanl.sh',
'job_name': f'{self.pslot}_{task_name}_@H',
'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log',
'maxtries': '&MAXTRIES;'
@@ -583,7 +583,7 @@ def prepoceanobs(self):
ocean_hist_path = self._template_to_rocoto_cycstring(self._base["COM_OCEAN_HISTORY_TMPL"], {'RUN': 'gdas'})
deps = []
- data = f'{ocean_hist_path}/gdas.t@Hz.ocnf009.nc'
+ data = f'{ocean_hist_path}/gdas.ocean.t@Hz.inst.f009.nc'
dep_dict = {'type': 'data', 'data': data, 'offset': f"-{timedelta_to_HMS(self._base['cycle_interval'])}"}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -826,8 +826,8 @@ def _fcst_cycled(self):
dep_dict = {'type': 'task', 'name': f'{self.cdump}aeroanlfinal'}
dependencies.append(rocoto.add_dependency(dep_dict))
- if self.app_config.do_jedilandda:
- dep_dict = {'type': 'task', 'name': f'{self.cdump}landanl'}
+ if self.app_config.do_jedisnowda:
+ dep_dict = {'type': 'task', 'name': f'{self.cdump}snowanl'}
dependencies.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep_condition='and', dep=dependencies)
@@ -927,24 +927,9 @@ def atmanlprod(self):
return task
@staticmethod
- def _get_ufs_postproc_grps(cdump, config):
+ def _get_ufs_postproc_grps(cdump, config, component='atmos'):
- fhmin = config['FHMIN']
- fhmax = config['FHMAX']
- fhout = config['FHOUT']
-
- # Get a list of all forecast hours
- fhrs = []
- if cdump in ['gdas']:
- fhrs = range(fhmin, fhmax + fhout, fhout)
- elif cdump in ['gfs']:
- fhmax = np.max(
- [config['FHMAX_GFS_00'], config['FHMAX_GFS_06'], config['FHMAX_GFS_12'], config['FHMAX_GFS_18']])
- fhout = config['FHOUT_GFS']
- fhmax_hf = config['FHMAX_HF_GFS']
- fhout_hf = config['FHOUT_HF_GFS']
- fhrs_hf = range(fhmin, fhmax_hf + fhout_hf, fhout_hf)
- fhrs = list(fhrs_hf) + list(range(fhrs_hf[-1] + fhout, fhmax + fhout, fhout))
+ 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
@@ -1017,83 +1002,63 @@ def _upptask(self, upp_run="forecast", task_id="atmupp"):
return task
- def atmprod(self):
+ def atmos_prod(self):
+ return self._atmosoceaniceprod('atmos')
- varname1, varname2, varname3 = 'grp', 'dep', 'lst'
- varval1, varval2, varval3 = self._get_ufs_postproc_grps(self.cdump, self._configs['atmos_products'])
- var_dict = {varname1: varval1, varname2: varval2, varname3: varval3}
+ def ocean_prod(self):
+ return self._atmosoceaniceprod('ocean')
- postenvars = self.envars.copy()
- postenvar_dict = {'FHRLST': '#lst#'}
- for key, value in postenvar_dict.items():
- postenvars.append(rocoto.create_envar(name=key, value=str(value)))
+ def ice_prod(self):
+ return self._atmosoceaniceprod('ice')
- atm_master_path = self._template_to_rocoto_cycstring(self._base["COM_ATMOS_MASTER_TMPL"])
- deps = []
- data = f'{atm_master_path}/{self.cdump}.t@Hz.master.grb2#dep#'
- dep_dict = {'type': 'data', 'data': data, 'age': 120}
- 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('atmos_products')
+ def _atmosoceaniceprod(self, component: str):
- task_name = f'{self.cdump}atmprod#{varname1}#'
- task_dict = {'task_name': task_name,
- 'resources': resources,
- 'dependency': dependencies,
- 'envars': postenvars,
- 'cycledef': cycledef,
- 'command': f'{self.HOMEgfs}/jobs/rocoto/atmos_products.sh',
- 'job_name': f'{self.pslot}_{task_name}_@H',
- 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log',
- 'maxtries': '&MAXTRIES;'
- }
-
- metatask_dict = {'task_name': f'{self.cdump}atmprod',
- 'task_dict': task_dict,
- 'var_dict': var_dict
- }
-
- task = rocoto.create_task(metatask_dict)
+ products_dict = {'atmos': {'config': 'atmos_products',
+ 'history_path_tmpl': 'COM_ATMOS_MASTER_TMPL',
+ 'history_file_tmpl': f'{self.cdump}.t@Hz.master.grb2#dep#'},
+ 'ocean': {'config': 'oceanice_products',
+ 'history_path_tmpl': 'COM_OCEAN_HISTORY_TMPL',
+ 'history_file_tmpl': f'{self.cdump}.ocean.t@Hz.6hr_avg.#dep#.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'}}
- return task
-
- def ocnpost(self):
+ 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['ocnpost'])
+ 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#',
- 'ROTDIR': self.rotdir}
+ postenvar_dict = {'FHRLST': '#lst#', 'COMPONENT': component}
for key, value in postenvar_dict.items():
postenvars.append(rocoto.create_envar(name=key, value=str(value)))
+ history_path = self._template_to_rocoto_cycstring(self._base[history_path_tmpl])
deps = []
- atm_hist_path = self._template_to_rocoto_cycstring(self._base["COM_ATMOS_HISTORY_TMPL"])
- data = f'{atm_hist_path}/{self.cdump}.t@Hz.atm.log#dep#.txt'
- dep_dict = {'type': 'data', 'data': data}
- deps.append(rocoto.add_dependency(dep_dict))
- dep_dict = {'type': 'task', 'name': f'{self.cdump}fcst'}
+ data = f'{history_path}/{history_file_tmpl}'
+ dep_dict = {'type': 'data', 'data': data, 'age': 120}
deps.append(rocoto.add_dependency(dep_dict))
- dependencies = rocoto.create_dependency(dep_condition='or', dep=deps)
+ dependencies = rocoto.create_dependency(dep=deps)
cycledef = 'gdas_half,gdas' if self.cdump in ['gdas'] else self.cdump
- resources = self.get_resource('ocnpost')
+ resources = self.get_resource(component_dict['config'])
- task_name = f'{self.cdump}ocnpost#{varname1}#'
+ task_name = f'{self.cdump}{component}_prod#{varname1}#'
task_dict = {'task_name': task_name,
'resources': resources,
'dependency': dependencies,
'envars': postenvars,
'cycledef': cycledef,
- 'command': f'{self.HOMEgfs}/jobs/rocoto/ocnpost.sh',
+ 'command': f"{self.HOMEgfs}/jobs/rocoto/{config}.sh",
'job_name': f'{self.pslot}_{task_name}_@H',
'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log',
'maxtries': '&MAXTRIES;'
}
- metatask_dict = {'task_name': f'{self.cdump}ocnpost',
+ metatask_dict = {'task_name': f'{self.cdump}{component}_prod',
'task_dict': task_dict,
'var_dict': var_dict
}
@@ -1345,8 +1310,7 @@ def _get_awipsgroups(cdump, config):
if cdump in ['gdas']:
fhrs = range(fhmin, fhmax + fhout, fhout)
elif cdump in ['gfs']:
- fhmax = np.max(
- [config['FHMAX_GFS_00'], config['FHMAX_GFS_06'], config['FHMAX_GFS_12'], config['FHMAX_GFS_18']])
+ fhmax = config['FHMAX_GFS']
fhout = config['FHOUT_GFS']
fhmax_hf = config['FHMAX_HF_GFS']
fhout_hf = config['FHOUT_HF_GFS']
@@ -1373,7 +1337,7 @@ def _get_awipsgroups(cdump, config):
def awips_20km_1p0deg(self):
deps = []
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmprod'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmos_prod'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -1414,7 +1378,7 @@ def awips_20km_1p0deg(self):
def awips_g2(self):
deps = []
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmprod'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmos_prod'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -1455,7 +1419,7 @@ def awips_g2(self):
def gempak(self):
deps = []
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmprod'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmos_prod'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -1478,7 +1442,7 @@ def gempak(self):
def gempakmeta(self):
deps = []
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmprod'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmos_prod'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -1501,7 +1465,7 @@ def gempakmeta(self):
def gempakmetancdc(self):
deps = []
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmprod'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmos_prod'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -1524,7 +1488,7 @@ def gempakmetancdc(self):
def gempakncdcupapgif(self):
deps = []
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmprod'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmos_prod'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -1663,7 +1627,7 @@ def vminmon(self):
def tracker(self):
deps = []
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmprod'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmos_prod'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -1686,7 +1650,7 @@ def tracker(self):
def genesis(self):
deps = []
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmprod'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmos_prod'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -1709,7 +1673,7 @@ def genesis(self):
def genesis_fsu(self):
deps = []
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmprod'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmos_prod'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -1732,7 +1696,7 @@ def genesis_fsu(self):
def fit2obs(self):
deps = []
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmprod'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmos_prod'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -1797,7 +1761,7 @@ def metp(self):
def mos_stn_prep(self):
deps = []
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmprod'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmos_prod'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -1820,7 +1784,7 @@ def mos_stn_prep(self):
def mos_grd_prep(self):
deps = []
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmprod'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmos_prod'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -1843,7 +1807,7 @@ def mos_grd_prep(self):
def mos_ext_stn_prep(self):
deps = []
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmprod'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmos_prod'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -1866,7 +1830,7 @@ def mos_ext_stn_prep(self):
def mos_ext_grd_prep(self):
deps = []
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmprod'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmos_prod'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -2184,7 +2148,7 @@ def arch(self):
dep_dict = {'type': 'task', 'name': f'{self.cdump}genesis_fsu'}
deps.append(rocoto.add_dependency(dep_dict))
# Post job dependencies
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmprod'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}atmos_prod'}
deps.append(rocoto.add_dependency(dep_dict))
if self.app_config.do_wave:
dep_dict = {'type': 'task', 'name': f'{self.cdump}wavepostsbs'}
@@ -2195,8 +2159,12 @@ def arch(self):
dep_dict = {'type': 'task', 'name': f'{self.cdump}wavepostbndpnt'}
deps.append(rocoto.add_dependency(dep_dict))
if self.app_config.do_ocean:
- if self.app_config.mode in ['forecast-only']: # TODO: fix ocnpost to run in cycled mode
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}ocnpost'}
+ if self.cdump in ['gfs']:
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}ocean_prod'}
+ deps.append(rocoto.add_dependency(dep_dict))
+ if self.app_config.do_ice:
+ if self.cdump in ['gfs']:
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}ice_prod'}
deps.append(rocoto.add_dependency(dep_dict))
# MOS job dependencies
if self.cdump in ['gfs'] and self.app_config.do_mos:
@@ -2291,14 +2259,14 @@ def eomg(self):
dependencies = rocoto.create_dependency(dep=deps)
eomgenvars = self.envars.copy()
- eomgenvars.append(rocoto.create_envar(name='ENSGRP', value='#grp#'))
-
- groups = self._get_hybgroups(self._base['NMEM_ENS'], self._configs['eobs']['NMEM_EOMGGRP'])
-
- var_dict = {'grp': groups}
+ eomgenvars_dict = {'ENSMEM': '#member#',
+ 'MEMDIR': 'mem#member#'
+ }
+ for key, value in eomgenvars_dict.items():
+ eomgenvars.append(rocoto.create_envar(name=key, value=str(value)))
resources = self.get_resource('eomg')
- task_name = f'{self.cdump}eomg#grp#'
+ task_name = f'{self.cdump}eomg_mem#member#'
task_dict = {'task_name': task_name,
'resources': resources,
'dependency': dependencies,
@@ -2310,8 +2278,9 @@ def eomg(self):
'maxtries': '&MAXTRIES;'
}
- metatask_dict = {'task_name': f'{self.cdump}eomn',
- 'var_dict': var_dict,
+ member_var_dict = {'member': ' '.join([str(mem).zfill(3) for mem in range(1, self.nmem + 1)])}
+ metatask_dict = {'task_name': f'{self.cdump}eomg',
+ 'var_dict': member_var_dict,
'task_dict': task_dict,
}
@@ -2347,7 +2316,7 @@ def eupd(self):
if self.app_config.lobsdiag_forenkf:
dep_dict = {'type': 'task', 'name': f'{self.cdump}ediag'}
else:
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}eomn'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}eomg'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -2555,31 +2524,30 @@ def efcs(self):
dependencies = rocoto.create_dependency(dep_condition='or', dep=dependencies)
efcsenvars = self.envars.copy()
- efcsenvars.append(rocoto.create_envar(name='ENSGRP', value='#grp#'))
+ efcsenvars_dict = {'ENSMEM': '#member#',
+ 'MEMDIR': 'mem#member#'
+ }
+ for key, value in efcsenvars_dict.items():
+ efcsenvars.append(rocoto.create_envar(name=key, value=str(value)))
- groups = self._get_hybgroups(self._base['NMEM_ENS'], self._configs['efcs']['NMEM_EFCSGRP'])
-
- if self.cdump == "enkfgfs":
- groups = self._get_hybgroups(self._base['NMEM_ENS_GFS'], self._configs['efcs']['NMEM_EFCSGRP_GFS'])
cycledef = 'gdas_half,gdas' if self.cdump in ['enkfgdas'] else self.cdump.replace('enkf', '')
resources = self.get_resource('efcs')
- var_dict = {'grp': groups}
-
- task_name = f'{self.cdump}efcs#grp#'
+ task_name = f'{self.cdump}fcst_mem#member#'
task_dict = {'task_name': task_name,
'resources': resources,
'dependency': dependencies,
'envars': efcsenvars,
'cycledef': cycledef,
- 'command': f'{self.HOMEgfs}/jobs/rocoto/efcs.sh',
+ 'command': f'{self.HOMEgfs}/jobs/rocoto/fcst.sh',
'job_name': f'{self.pslot}_{task_name}_@H',
'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log',
'maxtries': '&MAXTRIES;'
}
- metatask_dict = {'task_name': f'{self.cdump}efmn',
- 'var_dict': var_dict,
+ member_var_dict = {'member': ' '.join([str(mem).zfill(3) for mem in range(1, self.nmem + 1)])}
+ metatask_dict = {'task_name': f'{self.cdump}fcst',
+ 'var_dict': member_var_dict,
'task_dict': task_dict
}
@@ -2594,7 +2562,7 @@ def echgres(self):
deps = []
dep_dict = {'type': 'task', 'name': f'{self.cdump.replace("enkf","")}fcst'}
deps.append(rocoto.add_dependency(dep_dict))
- dep_dict = {'type': 'task', 'name': f'{self.cdump}efcs01'}
+ dep_dict = {'type': 'task', 'name': f'{self.cdump}fcst_mem001'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep_condition='and', dep=deps)
@@ -2642,7 +2610,7 @@ def _get_eposgroups(epos):
return grp, dep, lst
deps = []
- dep_dict = {'type': 'metatask', 'name': f'{self.cdump}efmn'}
+ dep_dict = {'type': 'metatask', 'name': f'{self.cdump}fcst'}
deps.append(rocoto.add_dependency(dep_dict))
dependencies = rocoto.create_dependency(dep=deps)
@@ -2691,7 +2659,9 @@ def earc(self):
earcenvars = self.envars.copy()
earcenvars.append(rocoto.create_envar(name='ENSGRP', value='#grp#'))
- groups = self._get_hybgroups(self._base['NMEM_ENS'], self._configs['earc']['NMEM_EARCGRP'], start_index=0)
+ # Integer division is floor division, but we need ceiling division
+ n_groups = -(self.nmem // -self._configs['earc']['NMEM_EARCGRP'])
+ groups = ' '.join([f'{grp:02d}' for grp in range(0, n_groups)])
cycledef = 'gdas_half,gdas' if self.cdump in ['enkfgdas'] else self.cdump.replace('enkf', '')
diff --git a/workflow/rocoto/tasks_emc.py b/workflow/rocoto/tasks_emc.py
index 1c79de0c19..ac70c6e4fc 100644
--- a/workflow/rocoto/tasks_emc.py
+++ b/workflow/rocoto/tasks_emc.py
@@ -4,6 +4,7 @@
from applications.applications import AppConfig
import rocoto.rocoto as rocoto
from wxflow import Template, TemplateConstants, to_timedelta
+from typing import List
__all__ = ['Tasks']
@@ -19,10 +20,10 @@ class Tasks:
'eobs', 'eomg', 'epos', 'esfc', 'eupd',
'atmensanlinit', 'atmensanlrun', 'atmensanlfinal',
'aeroanlinit', 'aeroanlrun', 'aeroanlfinal',
- 'preplandobs', 'landanl',
+ 'prepsnowobs', 'snowanl',
'fcst',
- 'atmanlupp', 'atmanlprod', 'atmupp', 'atmprod', 'goesupp',
- 'ocnpost',
+ 'atmanlupp', 'atmanlprod', 'atmupp', 'goesupp',
+ 'atmosprod', 'oceanprod', 'iceprod',
'verfozn', 'verfrad', 'vminmon',
'metp',
'tracker', 'genesis', 'genesis_fsu',
@@ -46,6 +47,7 @@ def __init__(self, app_config: AppConfig, cdump: str) -> None:
self.HOMEgfs = self._base['HOMEgfs']
self.rotdir = self._base['ROTDIR']
self.pslot = self._base['PSLOT']
+ self.nmem = int(self._base['NMEM_ENS'])
self._base['cycle_interval'] = to_timedelta(f'{self._base["assim_freq"]}H')
self.n_tiles = 6 # TODO - this needs to be elsewhere
@@ -72,12 +74,6 @@ def _set_envars(envar_dict) -> list:
return envars
- @staticmethod
- def _get_hybgroups(nens: int, nmem_per_group: int, start_index: int = 1):
- ngrps = nens / nmem_per_group
- groups = ' '.join([f'{x:02d}' for x in range(start_index, int(ngrps) + 1)])
- return groups
-
def _template_to_rocoto_cycstring(self, template: str, subs_dict: dict = {}) -> str:
'''
Takes a string templated with ${ } and converts it into a string suitable
@@ -123,6 +119,40 @@ def _template_to_rocoto_cycstring(self, template: str, subs_dict: dict = {}) ->
TemplateConstants.DOLLAR_CURLY_BRACE,
rocoto_conversion_dict.get)
+ @staticmethod
+ def _get_forecast_hours(cdump, config, component='atmos') -> List[str]:
+ # Make a local copy of the config to avoid modifying the original
+ local_config = config.copy()
+
+ # 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']
+
+ fhmin = local_config['FHMIN']
+
+ # Get a list of all forecast hours
+ fhrs = []
+ if cdump in ['gdas']:
+ fhmax = local_config['FHMAX']
+ fhout = local_config['FHOUT']
+ fhrs = list(range(fhmin, fhmax + fhout, fhout))
+ elif cdump in ['gfs', 'gefs']:
+ fhmax = local_config['FHMAX_GFS']
+ fhout = local_config['FHOUT_GFS']
+ fhmax_hf = local_config['FHMAX_HF_GFS']
+ fhout_hf = local_config['FHOUT_HF_GFS']
+ fhrs_hf = range(fhmin, fhmax_hf + fhout_hf, fhout_hf)
+ 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']:
+ fhrs.remove(0)
+
+ return fhrs
+
def get_resource(self, task_name):
"""
Given a task name (task_name) and its configuration (task_names),
diff --git a/workflow/rocoto/tasks_gsl.py b/workflow/rocoto/tasks_gsl.py
index 371721bbb9..3fd7c2bf9d 100644
--- a/workflow/rocoto/tasks_gsl.py
+++ b/workflow/rocoto/tasks_gsl.py
@@ -4,6 +4,7 @@
from applications.applications import AppConfig
import rocoto.rocoto as rocoto
from wxflow import Template, TemplateConstants, to_timedelta
+from typing import List
__all__ = ['Tasks']
@@ -19,10 +20,10 @@ class Tasks:
'eobs', 'eomg', 'epos', 'esfc', 'eupd',
'atmensanlinit', 'atmensanlrun', 'atmensanlfinal',
'aeroanlinit', 'aeroanlrun', 'aeroanlfinal',
- 'preplandobs', 'landanl',
+ 'prepsnowobs', 'snowanl',
'fcst',
- 'atmanlupp', 'atmanlprod', 'atmupp', 'atmprod', 'goesupp',
- 'ocnpost',
+ 'atmanlupp', 'atmanlprod', 'atmupp', 'goesupp',
+ 'atmosprod', 'oceanprod', 'iceprod',
'verfozn', 'verfrad', 'vminmon',
'metp',
'tracker', 'genesis', 'genesis_fsu',
@@ -46,6 +47,7 @@ def __init__(self, app_config: AppConfig, cdump: str) -> None:
self.HOMEgfs = self._base['HOMEgfs']
self.rotdir = self._base['ROTDIR']
self.pslot = self._base['PSLOT']
+ self.nmem = int(self._base['NMEM_ENS'])
self._base['cycle_interval'] = to_timedelta(f'{self._base["assim_freq"]}H')
self.n_tiles = 6 # TODO - this needs to be elsewhere
@@ -53,7 +55,7 @@ def __init__(self, app_config: AppConfig, cdump: str) -> None:
envar_dict = {'RUN_ENVIR': self._base.get('RUN_ENVIR', 'emc'),
'HOMEgfs': self.HOMEgfs,
'EXPDIR': self._base.get('EXPDIR'),
- 'ROTDIR': self._base.get('ROTDIR'),
+ 'ROTDIR': self._base.get('ROTDIR'), ##JKH
'NET': self._base.get('NET'),
'CDUMP': self.cdump,
'RUN': self.cdump,
@@ -73,12 +75,6 @@ def _set_envars(envar_dict) -> list:
return envars
- @staticmethod
- def _get_hybgroups(nens: int, nmem_per_group: int, start_index: int = 1):
- ngrps = nens / nmem_per_group
- groups = ' '.join([f'{x:02d}' for x in range(start_index, int(ngrps) + 1)])
- return groups
-
def _template_to_rocoto_cycstring(self, template: str, subs_dict: dict = {}) -> str:
'''
Takes a string templated with ${ } and converts it into a string suitable
@@ -124,6 +120,40 @@ def _template_to_rocoto_cycstring(self, template: str, subs_dict: dict = {}) ->
TemplateConstants.DOLLAR_CURLY_BRACE,
rocoto_conversion_dict.get)
+ @staticmethod
+ def _get_forecast_hours(cdump, config, component='atmos') -> List[str]:
+ # Make a local copy of the config to avoid modifying the original
+ local_config = config.copy()
+
+ # 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']
+
+ fhmin = local_config['FHMIN']
+
+ # Get a list of all forecast hours
+ fhrs = []
+ if cdump in ['gdas']:
+ fhmax = local_config['FHMAX']
+ fhout = local_config['FHOUT']
+ fhrs = list(range(fhmin, fhmax + fhout, fhout))
+ elif cdump in ['gfs', 'gefs']:
+ fhmax = local_config['FHMAX_GFS']
+ fhout = local_config['FHOUT_GFS']
+ fhmax_hf = local_config['FHMAX_HF_GFS']
+ fhout_hf = local_config['FHOUT_HF_GFS']
+ fhrs_hf = range(fhmin, fhmax_hf + fhout_hf, fhout_hf)
+ 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']:
+ fhrs.remove(0)
+
+ return fhrs
+
def get_resource(self, task_name):
"""
Given a task name (task_name) and its configuration (task_names),
@@ -170,7 +200,7 @@ def get_resource(self, task_name):
else:
native += ':shared'
elif scheduler in ['slurm']:
- native = '&NATIVE_STR;'
+ native = '&NATIVE_STR;' ##JKH
queue = task_config['QUEUE_SERVICE'] if task_name in Tasks.SERVICE_TASKS else task_config['QUEUE']
diff --git a/workflow/setup_expt.py b/workflow/setup_expt.py
index 7d7ac84aad..90e890910f 100755
--- a/workflow/setup_expt.py
+++ b/workflow/setup_expt.py
@@ -224,6 +224,13 @@ def link_files_from_src_to_dst(src_dir, dst_dir):
src_file = os.path.join(src_dir, fname)
if os.path.exists(src_file):
os.symlink(src_file, os.path.join(dst_dir, fname))
+ # First 1/2 cycle also needs a atmos increment if doing warm start
+ if inputs.start in ['warm']:
+ for ftype in ['atmi003.nc', 'atminc.nc', 'atmi009.nc']:
+ fname = f'{inputs.cdump}.t{idatestr[8:]}z.{ftype}'
+ src_file = os.path.join(src_dir, fname)
+ if os.path.exists(src_file):
+ os.symlink(src_file, os.path.join(dst_dir, fname))
return
@@ -245,12 +252,6 @@ def fill_EXPDIR(inputs):
expdir = os.path.join(inputs.expdir, inputs.pslot)
configs = glob.glob(f'{configdir}/config.*')
- exclude_configs = ['base', 'base.emc.dyn', 'base.nco.static', 'fv3.nco.static']
- for exclude in exclude_configs:
- try:
- configs.remove(f'{configdir}/config.{exclude}')
- except ValueError:
- pass
if len(configs) == 0:
raise IOError(f'no config files found in {configdir}')
for config in configs:
@@ -288,7 +289,8 @@ def _update_defaults(dict_in: dict) -> dict:
def edit_baseconfig(host, inputs, yaml_dict):
"""
- Parses and populates the templated `config.base.emc.dyn` to `config.base`
+ Parses and populates the templated `HOMEgfs/parm/config//config.base`
+ to `EXPDIR/pslot/config.base`
"""
tmpl_dict = {
@@ -316,7 +318,8 @@ def edit_baseconfig(host, inputs, yaml_dict):
"@EXP_WARM_START@": is_warm_start,
"@MODE@": inputs.mode,
"@gfs_cyc@": inputs.gfs_cyc,
- "@APP@": inputs.app
+ "@APP@": inputs.app,
+ "@NMEM_ENS@": getattr(inputs, 'nens', 0)
}
tmpl_dict = dict(tmpl_dict, **extend_dict)
@@ -324,7 +327,6 @@ def edit_baseconfig(host, inputs, yaml_dict):
if getattr(inputs, 'nens', 0) > 0:
extend_dict = {
"@CASEENS@": f'C{inputs.resensatmos}',
- "@NMEM_ENS@": inputs.nens,
}
tmpl_dict = dict(tmpl_dict, **extend_dict)
@@ -340,7 +342,7 @@ def edit_baseconfig(host, inputs, yaml_dict):
except KeyError:
pass
- base_input = f'{inputs.configdir}/config.base.emc.dyn'
+ base_input = f'{inputs.configdir}/config.base'
base_output = f'{inputs.expdir}/{inputs.pslot}/config.base'
edit_config(base_input, base_output, tmpl_dict)
@@ -399,6 +401,8 @@ def _common_args(parser):
parser.add_argument('--idate', help='starting date of experiment, initial conditions must exist!',
required=True, type=lambda dd: to_datetime(dd))
parser.add_argument('--edate', help='end date experiment', required=True, type=lambda dd: to_datetime(dd))
+ parser.add_argument('--overwrite', help='overwrite previously created experiment (if it exists)',
+ action='store_true', required=False)
return parser
def _gfs_args(parser):
@@ -493,17 +497,19 @@ def _gefs_args(parser):
return parser.parse_args(list(*argv) if len(argv) else None)
-def query_and_clean(dirname):
+def query_and_clean(dirname, force_clean=False):
"""
Method to query if a directory exists and gather user input for further action
"""
create_dir = True
if os.path.exists(dirname):
- print()
- print(f'directory already exists in {dirname}')
- print()
- overwrite = input('Do you wish to over-write [y/N]: ')
+ print(f'\ndirectory already exists in {dirname}')
+ if force_clean:
+ overwrite = True
+ print(f'removing directory ........ {dirname}\n')
+ else:
+ overwrite = input('Do you wish to over-write [y/N]: ')
create_dir = True if overwrite in [
'y', 'yes', 'Y', 'YES'] else False
if create_dir:
@@ -553,8 +559,8 @@ def main(*argv):
rotdir = os.path.join(user_inputs.comroot, user_inputs.pslot)
expdir = os.path.join(user_inputs.expdir, user_inputs.pslot)
- create_rotdir = query_and_clean(rotdir)
- create_expdir = query_and_clean(expdir)
+ create_rotdir = query_and_clean(rotdir, force_clean=user_inputs.overwrite)
+ create_expdir = query_and_clean(expdir, force_clean=user_inputs.overwrite)
if create_rotdir:
makedirs_if_missing(rotdir)
@@ -565,6 +571,11 @@ def main(*argv):
fill_EXPDIR(user_inputs)
update_configs(host, user_inputs)
+ print(f"*" * 100)
+ print(f'EXPDIR: {expdir}')
+ print(f'ROTDIR: {rotdir}')
+ print(f"*" * 100)
+
if __name__ == '__main__':